From 531c36f3101a09d40e40806ae32560279703b507 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 14 Dec 2020 23:08:32 +0100 Subject: [PATCH 0001/2116] fix typo in ac3eb0e6410f53963578ea050879dbc7c59c9cdd --- tests/run-tests | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/run-tests b/tests/run-tests index 1a489fef..dce080a8 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -1265,7 +1265,7 @@ if which wget; then $fdroid signindex mv $REPOROOT/index-v1.json repo/index-v1.json - port=3210${RANDOM:3} + port=321${RANDOM:3} test $(printf $port | wc --chars) -le 3 && port=52734 # when $RANDOM doesn't work timeout 5m python3 -m http.server $port --bind 127.0.0.1 > $REPOROOT/http.server.log 2>&1 & http_server_pid=$! From ba854cbc0fe1a5a568bba715965a8bf977d18465 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 8 Dec 2020 19:44:39 +0100 Subject: [PATCH 0002/2116] index: fix GitLab Raw URLs with gitlab.com and recent versions GitLab seems to be moving to always having "-" as the first path segment in all the project URLs. So the URL without a "-" is now a redirect. --- .gitlab-ci.yml | 37 +++++++++++++++++++++++++++++++++++++ fdroidserver/index.py | 7 +++---- tests/index.TestCase | 20 ++++++++++++++++++++ tests/key-tricks.py | 25 +++++++++++++++++++++++++ 4 files changed, 85 insertions(+), 4 deletions(-) create mode 100755 tests/key-tricks.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 52aafa2e..8b679c7b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -291,3 +291,40 @@ fdroid build: # each `fdroid build --on-server` run expects sudo, then uninstalls it - apt-get install sudo - fdroid build --verbose --on-server --no-tarball --latest org.fdroid.fdroid + + +# test a full update and deploy cycle to gitlab.com +servergitmirrors: + image: debian + <<: *apt-template + only: + - master@fdroid/fdroidserver + script: + - apt-get install + default-jdk-headless + git + openssh-client + openssl + python3-pip + python3-venv + rsync + wget + - python3 -m venv env + - . env/bin/activate + - export PYTHONPATH=`pwd` + - $pip install -e . + - mkdir /root/.ssh/ + - ./tests/key-tricks.py + - ssh-keyscan gitlab.com >> /root/.ssh/known_hosts + - test -d /tmp/fdroid/repo || mkdir -p /tmp/fdroid/repo + - cp tests/config.py tests/keystore.jks /tmp/fdroid/ + - cp tests/repo/com.politedroid_6.apk /tmp/fdroid/repo/ + - cd /tmp/fdroid + - touch fdroid-icon.png + - printf "\nservergitmirrors = 'git@gitlab.com:fdroid/ci-test-servergitmirrors-repo.git'\n" >> config.py + - $PYTHONPATH/fdroid update --verbose --create-metadata + - $PYTHONPATH/fdroid deploy --verbose + - export DLURL=`grep -Eo 'https://gitlab.com/fdroid/ci-test-servergitmirrors-repo[^"]+' repo/index-v1.json` + - echo $DLURL + - wget $DLURL/index-v1.jar + - diff repo/index-v1.jar index-v1.jar diff --git a/fdroidserver/index.py b/fdroidserver/index.py index e707824d..9003ba57 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -648,7 +648,7 @@ def get_mirror_service_urls(url): ''' if url.startswith('git@'): - url = re.sub(r'^git@(.*):(.*)', r'https://\1/\2', url) + url = re.sub(r'^git@([^:]+):(.+)', r'https://\1/\2', url) segments = url.split("/") @@ -676,10 +676,9 @@ def get_mirror_service_urls(url): # Gitlab-like Pages segments "https://user.gitlab.io/repo/folder" gitlab_pages = ["https:", "", user + ".gitlab.io", repo, folder] urls.append('/'.join(gitlab_pages)) - # Gitlab Raw "https://gitlab.com/user/repo/raw/branch/folder" - gitlab_raw = segments + ['raw', branch, folder] + # GitLab Raw "https://gitlab.com/user/repo/-/raw/branch/folder" + gitlab_raw = segments + ['-', 'raw', branch, folder] urls.append('/'.join(gitlab_raw)) - return urls return urls diff --git a/tests/index.TestCase b/tests/index.TestCase index 10a5b9a6..a260114a 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -247,6 +247,26 @@ class IndexTest(unittest.TestCase): fdroidserver.common.default_config['repo_icon']))) self.assertTrue(os.path.exists(os.path.join('repo', 'index.xml'))) + def test_get_mirror_service_urls(self): + for url in [ + 'git@github.com:foo/bar', + 'git@github.com:foo/bar.git', + 'https://github.com/foo/bar', + 'https://github.com/foo/bar.git', + ]: + self.assertEqual(['https://raw.githubusercontent.com/foo/bar/master/fdroid'], + fdroidserver.index.get_mirror_service_urls(url)) + + for url in [ + 'git@gitlab.com:group/project', + 'git@gitlab.com:group/project.git', + 'https://gitlab.com/group/project', + 'https://gitlab.com/group/project.git', + ]: + self.assertEqual(['https://group.gitlab.io/project/fdroid', + 'https://gitlab.com/group/project/-/raw/master/fdroid'], + fdroidserver.index.get_mirror_service_urls(url)) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) diff --git a/tests/key-tricks.py b/tests/key-tricks.py new file mode 100755 index 00000000..b634803f --- /dev/null +++ b/tests/key-tricks.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 + +import os +import fdroidserver +import shutil +import sys +from fdroidserver import common, nightly + +if os.getenv('CI') is None: + print('ERROR: This can overwrite SSH keys, so it should only be run in CI') + sys.exit(1) + +os.chdir(os.path.dirname(__file__)) +config = fdroidserver.common.read_config(common.options) +nightly.PASSWORD = config['keystorepass'] +nightly.KEY_ALIAS = config['repo_keyalias'] + +privkey = nightly._ssh_key_from_debug_keystore('keystore.jks') +print('privkey', privkey) +ssh_private_key_file = os.path.join(os.getenv('HOME'), '.ssh', 'id_rsa') +if os.path.exists(ssh_private_key_file): + print('ERROR:', ssh_private_key_file, 'exists!') + sys.exit(1) +shutil.move(privkey, ssh_private_key_file) +shutil.move(privkey + '.pub', ssh_private_key_file + '.pub') From d9171f11e0f2df291317bc1a6fc92e1c10604c8e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 8 Dec 2020 09:19:25 +0100 Subject: [PATCH 0003/2116] update: improve logging when exiting due to bad APK file closes #851 --- fdroidserver/update.py | 5 +++-- tests/update.TestCase | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index fd5dc924..091fc23f 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1448,8 +1448,9 @@ def scan_apk_androguard(apk, apkfile): logging.error(_("Failed to get apk information, skipping {path}") .format(path=apkfile)) raise BuildException(_("Invalid APK")) - except FileNotFoundError: - logging.error(_("Could not open apk file for analysis")) + except (FileNotFoundError, zipfile.BadZipFile) as e: + logging.error(_("Could not open APK {path} for analysis: ").format(path=apkfile) + + str(e)) raise BuildException(_("Invalid APK")) apk['packageName'] = apkobject.get_package() diff --git a/tests/update.TestCase b/tests/update.TestCase index 322387be..f8760600 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -625,6 +625,20 @@ class UpdateTest(unittest.TestCase): with self.assertRaises(fdroidserver.exception.BuildException): fdroidserver.update.scan_apk('urzip-release-unsigned.apk') + def test_scan_apk_bad_zip(self): + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.common.config = config + fdroidserver.update.config = config + testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + os.chdir(testdir) + os.mkdir('repo') + apkfile = 'repo/badzip_1.apk' + with open(apkfile, 'w') as fp: + fp.write('this is not a zip file') + with self.assertRaises(fdroidserver.exception.BuildException): + fdroidserver.update.scan_apk(apkfile) + def test_process_apk(self): def _build_yaml_representer(dumper, data): From 384922118fdd820a859cab820e47c7f9b932de8f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 22 Oct 2020 14:39:18 +0200 Subject: [PATCH 0004/2116] index: sanitize fingerprint arg, extract_pubkey() returns with spaces The key fingerprint should be only hex digits, everything else can be discarded. That makes it easy to use this function various fingerprint formats, including the common, human-readable forms spaces between pairs or quartets. --- fdroidserver/index.py | 7 ++++++- tests/index.TestCase | 23 +++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 9003ba57..aae0eb05 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -725,7 +725,11 @@ def download_repo_index(url_str, etag=None, verify_fingerprint=True, timeout=600 def get_index_from_jar(jarfile, fingerprint=None): """Returns the data, public key, and fingerprint from index-v1.jar + :param fingerprint is the SHA-256 fingerprint of signing key. Only + hex digits count, all other chars will can be discarded. + :raises: VerificationException() if the repository could not be verified + """ logging.debug(_('Verifying index signature:')) @@ -733,7 +737,8 @@ def get_index_from_jar(jarfile, fingerprint=None): with zipfile.ZipFile(jarfile) as jar: public_key, public_key_fingerprint = get_public_key_from_jar(jar) if fingerprint is not None: - if fingerprint.upper() != public_key_fingerprint: + fingerprint = re.sub(r'[^0-9A-F]', r'', fingerprint.upper()) + if fingerprint != public_key_fingerprint: raise VerificationException(_("The repository's fingerprint does not match.")) data = json.loads(jar.read('index-v1.json').decode()) return data, public_key, public_key_fingerprint diff --git a/tests/index.TestCase b/tests/index.TestCase index a260114a..131b3a1a 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -54,6 +54,10 @@ class IndexTest(unittest.TestCase): fdroidserver.common.config = config fdroidserver.signindex.config = config + if not os.path.exists('repo/index-v1.jar'): + fdroidserver.signindex.sign_index_v1(os.path.join(self.basedir, 'repo'), + 'index-v1.json') + def test_get_public_key_from_jar_succeeds(self): source_dir = os.path.join(self.basedir, 'signindex') for f in ('testy.jar', 'guardianproject.jar'): @@ -83,6 +87,25 @@ class IndexTest(unittest.TestCase): with self.assertRaises(requests.exceptions.RequestException): fdroidserver.index.download_repo_index("http://example.org?fingerprint=nope") + def test_get_repo_key_fingerprint(self): + pubkey, fingerprint = fdroidserver.index.extract_pubkey() + data, public_key, public_key_fingerprint = \ + fdroidserver.index.get_index_from_jar('repo/index-v1.jar', fingerprint) + self.assertIsNotNone(data) + self.assertIsNotNone(public_key) + self.assertIsNotNone(public_key_fingerprint) + + def test_get_index_from_jar_with_bad_fingerprint(self): + pubkey, fingerprint = fdroidserver.index.extract_pubkey() + fingerprint = fingerprint[:-1] + 'G' + with self.assertRaises(fdroidserver.exception.VerificationException): + fdroidserver.index.get_index_from_jar('repo/index-v1.jar', fingerprint) + + def test_get_index_from_jar_with_chars_to_be_stripped(self): + fingerprint = 'NOOOO F4 9A F3 F1 1E FD DF 20 DF FD 70 F5 E3 11 7B 99 76 67 41 67 AD CA 28 0E 6B 19 32 A0 60 1B 26 F6' + data, public_key, public_key_fingerprint = \ + fdroidserver.index.get_index_from_jar('repo/index-v1.jar', fingerprint) + @patch('requests.head') def test_download_repo_index_same_etag(self, head): url = 'http://example.org?fingerprint=test' From fb628c2cb2c97e687cff31bc78b2ba226d3509d4 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 17 Nov 2020 13:50:28 +0100 Subject: [PATCH 0005/2116] include modified and untracked files in status JSON Ideally, an fdroid repo should be running from a clean git repo, so that all changes are tracked in git. This change is useful in seeing which changes and/or files are not in git. If there are modified files, the dirty flag will be set, so this info can help debugging that. --- fdroidserver/common.py | 4 +++ tests/common.TestCase | 62 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index a9f14c23..090ba1e4 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -746,6 +746,8 @@ def setup_status_output(start_timestamp): output['fdroiddata'] = { 'commitId': get_head_commit_id(git_repo), 'isDirty': git_repo.is_dirty(), + 'modifiedFiles': git_repo.git().ls_files(modified=True).split(), + 'untrackedFiles': git_repo.untracked_files, } fdroidserver_dir = os.path.dirname(sys.argv[0]) if os.path.isdir(os.path.join(fdroidserver_dir, '.git')): @@ -753,6 +755,8 @@ def setup_status_output(start_timestamp): output['fdroidserver'] = { 'commitId': get_head_commit_id(git_repo), 'isDirty': git_repo.is_dirty(), + 'modifiedFiles': git_repo.git().ls_files(modified=True).split(), + 'untrackedFiles': git_repo.untracked_files, } write_running_status_json(output) return output diff --git a/tests/common.TestCase b/tests/common.TestCase index 4ba80c0d..90e109ae 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -3,6 +3,7 @@ # http://www.drdobbs.com/testing/unit-testing-with-python/240165163 import difflib +import git import glob import inspect import json @@ -1550,6 +1551,67 @@ class CommonTest(unittest.TestCase): self.assertFalse(os.path.exists('config.py')) fdroidserver.common.read_config(fdroidserver.common.options) + def test_setup_status_output(self): + testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + print(testdir) + os.chdir(testdir) + start_timestamp = time.gmtime() + subcommand = 'test' + + fakecmd = ['fdroid ' + subcommand, '--option'] + sys.argv = fakecmd + fdroidserver.common.config = dict() + fdroidserver.common.setup_status_output(start_timestamp) + with open(os.path.join('repo', 'status', 'running.json')) as fp: + data = json.load(fp) + self.assertFalse(os.path.exists('.git')) + self.assertFalse('fdroiddata' in data) + self.assertEqual(fakecmd, data['commandLine']) + self.assertEqual(subcommand, data['subcommand']) + + def test_setup_status_output_in_git_repo(self): + testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + os.chdir(testdir) + + logging.getLogger('git.cmd').setLevel(logging.INFO) + git_repo = git.Repo.init(testdir) + file_in_git = 'README.md' + with open(file_in_git, 'w') as fp: + fp.write('this is just a test') + git_repo.git.add(all=True) + git_repo.index.commit("update README") + + start_timestamp = time.gmtime() + fakecmd = ['fdroid test2', '--option'] + sys.argv = fakecmd + fdroidserver.common.config = dict() + fdroidserver.common.setup_status_output(start_timestamp) + with open(os.path.join('repo', 'status', 'running.json')) as fp: + data = json.load(fp) + self.assertTrue(os.path.exists('.git')) + self.assertIsNotNone(re.match(r'[0-9a-f]{40}', data['fdroiddata']['commitId']), + 'Must be a valid git SHA1 commit ID!') + self.assertFalse(data['fdroiddata']['isDirty']) + self.assertEqual(fakecmd, data['commandLine']) + + self.assertEqual([], + data['fdroiddata']['untrackedFiles']) + dirtyfile = 'dirtyfile' + with open(dirtyfile, 'w') as fp: + fp.write('this is just a test') + with open(file_in_git, 'a') as fp: + fp.write('\nappend some stuff') + self.assertEqual([], + data['fdroiddata']['modifiedFiles']) + fdroidserver.common.setup_status_output(start_timestamp) + with open(os.path.join('repo', 'status', 'running.json')) as fp: + data = json.load(fp) + self.assertTrue(data['fdroiddata']['isDirty']) + self.assertEqual([file_in_git], + data['fdroiddata']['modifiedFiles']) + self.assertEqual([dirtyfile, 'repo/status/running.json'], + data['fdroiddata']['untrackedFiles']) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 40cd51ed5906e9c3bac8253283cb1ac805d15963 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 23 Jul 2020 13:03:51 +0200 Subject: [PATCH 0006/2116] build: include commit ID in build log --- fdroidserver/build.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index a4fe326b..ea5e1420 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -684,9 +684,17 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext bindir = os.path.join(root_dir, 'bin') + if os.path.isdir(os.path.join(build_dir, '.git')): + import git + commit_id = common.get_head_commit_id(git.repo.Repo(build_dir)) + else: + commit_id = build.commit + if p is not None and p.returncode != 0: - raise BuildException("Build failed for %s:%s" % (app.id, build.versionName), p.output) - logging.info("Successfully built version " + build.versionName + ' of ' + app.id) + raise BuildException("Build failed for %s:%s@%s" % (app.id, build.versionName, commit_id), + p.output) + logging.info("Successfully built version {versionName} of {appid} from {commit_id}" + .format(versionName=build.versionName, appid=app.id, commit_id=commit_id)) omethod = build.output_method() if omethod == 'maven': From cfec25d33a97dac2d2aa0d944d79e557e571310d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 9 Dec 2020 23:10:33 +0100 Subject: [PATCH 0007/2116] update: tame androguard debug logs when --verbose is set --- fdroidserver/update.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 091fc23f..7261256f 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -2200,6 +2200,7 @@ def main(): config = common.read_config(options) + common.use_androguard() if not (('jarsigner' in config or 'apksigner' in config) and 'keytool' in config): raise FDroidException(_('Java JDK not found! Install in standard location or set java_paths!')) From bf25b4ca03adc967936ca405fdced8a4af0dfe72 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 9 Dec 2020 16:01:21 +0100 Subject: [PATCH 0008/2116] eliminate app.builds everywhere, it should be app['Builds'] The .txt format was the last place where the lowercase "builds" was used, this converts references everywhere to be "Builds". This makes it possible to load metadata YAML files with any YAML parser, then have it possible to use fdroidserver methods on that data, like metadata.write_metadata(). The test files in tests/metadata/dump/*.yaml were manually edited by cutting the builds: block and putting it the sort order for Builds: so the contents should be unchanged. ``` sed -i \ -e 's/app\.builds/app.get('Builds', \[\])/g' \ -e "s/app\.get(Builds, \[\]) =/app\['Builds'] =/g" \ -e "s/app\.get(Builds, \[\]) =/app\['Builds'] =/g" \ -e "s/app\.get(Builds, \[\])/app.get('Builds', \[\])/g" \ -e "s/app\.get('Builds', \[\])\.append/app\['Builds'\].append/g" \ -e "s/app\['builds'\]/app.get('Builds', [])/g" \ */*.* ``` --- fdroidserver/build.py | 8 +- fdroidserver/checkupdates.py | 8 +- fdroidserver/common.py | 10 +- fdroidserver/import.py | 2 +- fdroidserver/index.py | 6 +- fdroidserver/lint.py | 14 +-- fdroidserver/metadata.py | 26 ++-- fdroidserver/rewritemeta.py | 4 +- fdroidserver/scanner.py | 6 +- fdroidserver/update.py | 22 ++-- tests/checkupdates.TestCase | 8 +- tests/common.TestCase | 18 +-- tests/metadata.TestCase | 22 ++-- tests/metadata/dump/com.politedroid.yaml | 66 +++++------ tests/metadata/dump/org.adaway.yaml | 112 +++++++++--------- .../dump/org.smssecure.smssecure.yaml | 106 ++++++++--------- tests/metadata/dump/org.videolan.vlc.yaml | 110 ++++++++--------- tests/update.TestCase | 6 +- 18 files changed, 275 insertions(+), 279 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index ea5e1420..6b35afac 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -1017,7 +1017,7 @@ def main(): apps = common.read_app_args(options.appid, allapps, True) for appid, app in list(apps.items()): - if (app.Disabled and not options.force) or not app.RepoType or not app.builds: + if (app.get('Disabled') and not options.force) or not app.get('RepoType') or not app.get('Builds', []): del apps[appid] if not apps: @@ -1038,10 +1038,10 @@ def main(): if options.latest: for app in apps.values(): - for build in reversed(app.builds): + for build in reversed(app.get('Builds', [])): if build.disable and not options.force: continue - app.builds = [build] + app['Builds'] = [build] break if options.wiki: @@ -1062,7 +1062,7 @@ def main(): first = True - for build in app.builds: + for build in app.get('Builds', []): if time.time() > endtime: max_build_time_reached = True break diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 604f4e1a..fe9b63d8 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -221,8 +221,8 @@ def check_repomanifest(app, branch=None): vcs.gotorevision(None) last_build = metadata.Build() - if len(app.builds) > 0: - last_build = app.builds[-1] + if len(app.get('Builds', [])) > 0: + last_build = app.get('Builds', [])[-1] try_init_submodules(app, last_build, vcs) @@ -506,7 +506,7 @@ def checkupdates_app(app): gotcur = False latest = None - for build in app.builds: + for build in app.get('Builds', []): if int(build.versionCode) >= int(app.CurrentVersionCode): gotcur = True if not latest or int(build.versionCode) > int(latest.versionCode): @@ -524,7 +524,7 @@ def checkupdates_app(app): commit = pattern.replace('%v', app.CurrentVersion) commit = commit.replace('%c', newbuild.versionCode) newbuild.commit = commit - app.builds.append(newbuild) + app['Builds'].append(newbuild) name = _getappname(app) ver = _getcvname(app) commitmsg = "Update %s to %s" % (name, ver) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 090ba1e4..4aebe275 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -641,10 +641,10 @@ def read_app_args(appid_versionCode_pairs, allapps, allow_vercodes=False): vc = vercodes[appid] if not vc: continue - app.builds = [b for b in app.builds if b.versionCode in vc] - if len(app.builds) != len(vercodes[appid]): + app['Builds'] = [b for b in app.get('Builds', []) if b.versionCode in vc] + if len(app.get('Builds', [])) != len(vercodes[appid]): error = True - allvcs = [b.versionCode for b in app.builds] + allvcs = [b.versionCode for b in app.get('Builds', [])] for v in vercodes[appid]: if v not in allvcs: logging.critical(_("No such versionCode {versionCode} for app {appid}") @@ -1538,8 +1538,8 @@ def parse_androidmanifests(paths, app): flavour = None temp_app_id = None temp_version_name = None - if app.builds and 'gradle' in app.builds[-1] and app.builds[-1].gradle: - flavour = app.builds[-1].gradle[-1] + if len(app.get('Builds', [])) > 0 and 'gradle' in app['Builds'][-1] and app['Builds'][-1].gradle: + flavour = app['Builds'][-1].gradle[-1] if path.endswith('.gradle') or path.endswith('.gradle.kts'): with open(path, 'r') as f: diff --git a/fdroidserver/import.py b/fdroidserver/import.py index 48af3b9c..7c608e58 100644 --- a/fdroidserver/import.py +++ b/fdroidserver/import.py @@ -238,7 +238,7 @@ def main(): metadata.post_metadata_parse(app) - app.builds.append(build) + app['Builds'].append(build) if write_local_file: metadata.write_metadata('.fdroid.yml', app) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index aae0eb05..565a1c1e 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -158,7 +158,7 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ for k, v in sorted(appdict.items()): if not v: continue - if k in ('builds', 'comments', 'metadatapath', + if k in ('Builds', 'comments', 'metadatapath', 'ArchivePolicy', 'AutoUpdateMode', 'MaintainerNotes', 'Provides', 'Repo', 'RepoType', 'RequiresRoot', 'UpdateCheckData', 'UpdateCheckIgnore', 'UpdateCheckMode', @@ -201,7 +201,7 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ if not package.get('versionName'): app = apps[packageName] versionCodeStr = str(package['versionCode']) # TODO build.versionCode should be int! - for build in app['builds']: + for build in app.get('Builds', []): if build['versionCode'] == versionCodeStr: versionName = build.get('versionName') logging.info(_('Overriding blank versionName in {apkfilename} from metadata: {version}') @@ -477,7 +477,7 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing versionName = apk.get('versionName') if not versionName: versionCodeStr = str(apk['versionCode']) # TODO build.versionCode should be int! - for build in app.builds: + for build in app.get('Builds', []): if build['versionCode'] == versionCodeStr and 'versionName' in build: versionName = build['versionName'] break diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index b5acc9ad..61916e71 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -234,7 +234,7 @@ def check_vercode_operation(app): def check_ucm_tags(app): - lastbuild = get_lastbuild(app.builds) + lastbuild = get_lastbuild(app.get('Builds', [])) if (lastbuild is not None and lastbuild.commit and app.UpdateCheckMode == 'RepoManifest' @@ -389,7 +389,7 @@ def check_bulleted_lists(app): def check_builds(app): supported_flags = set(metadata.build_flags) # needed for YAML and JSON - for build in app.builds: + for build in app.get('Builds', []): if build.disable: if build.disable.startswith('Generated by import.py'): yield _("Build generated by `fdroid import` - remove disable line once ready") @@ -424,7 +424,7 @@ def check_files_dir(app): files.add(name) used = {'signatures', } - for build in app.builds: + for build in app.get('Builds', []): for fname in build.patch: if fname not in files: yield _("Unknown file '{filename}' in build '{versionName}'")\ @@ -466,7 +466,7 @@ def check_extlib_dir(apps): used = set() for app in apps: - for build in app.builds: + for build in app.get('Builds', []): for path in build.extlibs: if path not in unused_extlib_files: yield _("{appid}: Unknown extlib {path} in build '{versionName}'")\ @@ -494,7 +494,7 @@ def check_app_field_types(app): t = metadata.fieldtype(field) if v is None: continue - elif field == 'builds': + elif field == 'Builds': if not isinstance(v, list): yield(_("{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!") .format(appid=app.id, field=field, @@ -544,7 +544,7 @@ def check_current_version_code(app): if cv is not None and int(cv) == 0: return - builds = app.get('builds') + builds = app.get('Builds') active_builds = 0 min_versionCode = None if builds: @@ -617,7 +617,7 @@ def main(): # run yamllint on srclib metadata srclibs = set() - for build in app.builds: + for build in app.get('Builds', []): for srclib in build.srclibs: srclibs.add(srclib) for srclib in srclibs: diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index b4b0ab26..6af19c1f 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -158,7 +158,7 @@ class App(dict): self.id = None self.metadatapath = None - self.builds = [] + self.Builds = [] self.comments = {} self.added = None self.lastUpdated = None @@ -179,8 +179,8 @@ class App(dict): raise AttributeError("No such attribute: " + name) def get_last_build(self): - if len(self.builds) > 0: - return self.builds[-1] + if len(self.Builds) > 0: + return self.Builds[-1] else: return Build() @@ -633,9 +633,6 @@ def post_metadata_parse(app): if type(v) in (float, int): app[k] = str(v) - if 'Builds' in app: - app['builds'] = app.pop('Builds') - if 'flavours' in app and app['flavours'] == [True]: app['flavours'] = 'yes' @@ -664,8 +661,8 @@ def post_metadata_parse(app): _bool_allowed = ('maven', 'buildozer') builds = [] - if 'builds' in app: - for build in app['builds']: + if 'Builds' in app: + for build in app.get('Builds', []): if not isinstance(build, Build): build = Build(build) for k, v in build.items(): @@ -693,7 +690,7 @@ def post_metadata_parse(app): build[k] = str(v) builds.append(build) - app.builds = sorted_builds(builds) + app['Builds'] = sorted_builds(builds) # Parse metadata for a single application. @@ -710,8 +707,6 @@ def post_metadata_parse(app): # # Known keys not originating from the metadata are: # -# 'builds' - a list of dictionaries containing build information -# for each defined build # 'comments' - a list of comments from the metadata file. Each is # a list of the form [field, comment] where field is # the name of the field it preceded in the metadata @@ -771,8 +766,8 @@ def parse_metadata(metadatapath, check_vcs=False, refresh=True): post_metadata_parse(app) if not app.id: - if app.builds: - build = app.builds[-1] + if app.get('Builds'): + build = app['Builds'][-1] if build.subdir: root_dir = build.subdir else: @@ -925,9 +920,8 @@ def write_yaml(mf, app): insert_newline = True else: if app.get(field) or field == 'Builds': - # .txt called it 'builds' internally, everywhere else its 'Builds' if field == 'Builds': - if app.get('builds'): + if app.get('Builds'): cm.update({field: _builds_to_yaml(app)}) elif field == 'CurrentVersionCode': cm.update({field: _field_to_yaml(TYPE_INT, getattr(app, field))}) @@ -945,7 +939,7 @@ def write_yaml(mf, app): def _builds_to_yaml(app): builds = ruamel.yaml.comments.CommentedSeq() - for build in app.builds: + for build in app.get('Builds', []): b = ruamel.yaml.comments.CommentedMap() for field in build_flags: value = getattr(build, field) diff --git a/fdroidserver/rewritemeta.py b/fdroidserver/rewritemeta.py index 94439b97..66ddf98a 100644 --- a/fdroidserver/rewritemeta.py +++ b/fdroidserver/rewritemeta.py @@ -78,7 +78,7 @@ def main(): continue newbuilds = [] - for build in app.builds: + for build in app.get('Builds', []): new = metadata.Build() for k in metadata.build_flags: v = build[k] @@ -86,7 +86,7 @@ def main(): continue new[k] = v newbuilds.append(new) - app.builds = newbuilds + app['Builds'] = newbuilds # rewrite to temporary file before overwriting existsing # file in case there's a bug in write_metadata diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 8230831e..fca0c124 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -420,7 +420,7 @@ def main(): else: build_dir = os.path.join('build', appid) - if app.builds: + if app.get('Builds'): logging.info(_("Processing {appid}").format(appid=appid)) # Set up vcs interface and make sure we have the latest code... vcs = common.getvcs(app.RepoType, app.Repo, build_dir) @@ -434,9 +434,9 @@ def main(): logging.warning(_('Scanner found {count} problems in {appid}:') .format(count=count, appid=appid)) probcount += count - app.builds = [] + app['Builds'] = [] - for build in app.builds: + for build in app.get('Builds', []): json_per_build = DEFAULT_JSON_PER_BUILD json_per_appid[build.versionCode] = json_per_build diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 7261256f..9e79cc8d 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -157,9 +157,8 @@ def status_update_json(apps, apks): for apk in apks: if apk['packageName'] == appid: apklist.append(apk) - builds = app.get('builds', []) validapks = 0 - for build in builds: + for build in app.get('Builds', []): if not build.get('disable'): builtit = False for apk in apklist: @@ -252,7 +251,7 @@ def update_wiki(apps, apks): gotcurrentver = True apklist.append(apk) # Include ones we can't build, as a special case... - for build in app.builds: + for build in app.get('Builds', []): if build.disable: if build.versionCode == app.CurrentVersionCode: cantupdate = True @@ -411,7 +410,7 @@ def delete_disabled_builds(apps, apkcache, repodirs): :param repodirs: the repo directories to process """ for appid, app in apps.items(): - for build in app['builds']: + for build in app.get('Builds', []): if not build.disable: continue apkfilename = common.get_release_filename(app, build) @@ -742,7 +741,7 @@ def translate_per_build_anti_features(apps, apks): antiFeatures = dict() for packageName, app in apps.items(): d = dict() - for build in app['builds']: + for build in app.get('Builds', []): afl = build.get('antifeatures') if afl: d[int(build.versionCode)] = afl @@ -1022,8 +1021,8 @@ def copy_triple_t_store_metadata(apps): if os.path.exists(p): gradle_subdirs.add(p) flavors = set() - if app.builds: - flavors = app.builds[0].gradle + if app.get('Builds'): + flavors = app['Builds'][0].gradle for flavor in flavors: if flavor not in ('yes', 'no'): p = os.path.join('build', packageName, gradle_path, 'src', flavor, 'play') @@ -1148,9 +1147,12 @@ def insert_localized_app_metadata(apps): # flavours specified in build receipt build_flavours = "" - if apps[packageName] and 'builds' in apps[packageName] and len(apps[packageName].builds) > 0\ - and 'gradle' in apps[packageName].builds[-1]: - build_flavours = apps[packageName].builds[-1].gradle + if ( + apps[packageName] + and len(apps[packageName].get('Builds', [])) > 0 + and 'gradle' in apps[packageName]['Builds'][-1] + ): + build_flavours = apps[packageName]['Builds'][-1]['gradle'] if len(segments) >= 5 and segments[4] == "fastlane" and segments[3] not in build_flavours: logging.debug("ignoring due to wrong flavour") diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index 7772dfa5..0fff202d 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -49,13 +49,13 @@ class CheckupdatesTest(unittest.TestCase): build = fdroidserver.metadata.Build() build.versionCode = app.CurrentVersionCode build.versionName = app.CurrentVersion - app.builds.append(build) + app['Builds'].append(build) with mock.patch('fdroidserver.checkupdates.check_http', lambda app: ('1.1.9', 10109)): with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): with mock.patch('subprocess.call', lambda cmd: 0): fdroidserver.checkupdates.checkupdates_app(app) - build = app.builds[-1] + build = app['Builds'][-1] self.assertEqual(build.versionName, '1.1.9') self.assertEqual(build.commit, '1.1.9') @@ -75,13 +75,13 @@ class CheckupdatesTest(unittest.TestCase): build = fdroidserver.metadata.Build() build.versionCode = app.CurrentVersionCode build.versionName = app.CurrentVersion - app.builds.append(build) + app['Builds'].append(build) with mock.patch('fdroidserver.checkupdates.check_http', lambda app: ('1.1.9', 10109)): with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): with mock.patch('subprocess.call', lambda cmd: 0): fdroidserver.checkupdates.checkupdates_app(app) - build = app.builds[-1] + build = app['Builds'][-1] self.assertEqual(build.versionName, '1.1.9.10109-fdroid') self.assertEqual(build.commit, 'v1.1.9_10109') diff --git a/tests/common.TestCase b/tests/common.TestCase index 90e109ae..253f8037 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -943,7 +943,7 @@ class CommonTest(unittest.TestCase): app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['devVersion'] - app.builds = [build] + app['Builds'] = [build] app.id = 'org.fdroid.fdroid.dev' paths = [ os.path.join('source-files', 'fdroid', 'fdroidclient', 'AndroidManifest.xml'), @@ -957,7 +957,7 @@ class CommonTest(unittest.TestCase): app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['free'] - app.builds = [build] + app['Builds'] = [build] app.id = 'eu.siacs.conversations' paths = [ os.path.join('source-files', 'eu.siacs.conversations', 'build.gradle'), @@ -970,7 +970,7 @@ class CommonTest(unittest.TestCase): app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['generic'] - app.builds = [build] + app['Builds'] = [build] app.id = 'com.nextcloud.client' paths = [ os.path.join('source-files', 'com.nextcloud.client', 'build.gradle'), @@ -983,7 +983,7 @@ class CommonTest(unittest.TestCase): app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['versionDev'] - app.builds = [build] + app['Builds'] = [build] app.id = 'com.nextcloud.android.beta' paths = [ os.path.join('source-files', 'com.nextcloud.client', 'build.gradle'), @@ -996,7 +996,7 @@ class CommonTest(unittest.TestCase): app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['standard'] - app.builds = [build] + app['Builds'] = [build] app.id = 'at.bitfire.davdroid' paths = [ os.path.join('source-files', 'at.bitfire.davdroid', 'build.gradle'), @@ -1009,7 +1009,7 @@ class CommonTest(unittest.TestCase): app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['libre'] - app.builds = [build] + app['Builds'] = [build] app.id = 'com.kunzisoft.fdroidtest.applicationidsuffix.libre' paths = [ os.path.join('source-files', 'com.kunzisoft.testcase', 'build.gradle'), @@ -1022,7 +1022,7 @@ class CommonTest(unittest.TestCase): app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['pro'] - app.builds = [build] + app['Builds'] = [build] app.id = 'com.kunzisoft.fdroidtest.applicationidsuffix.pro' paths = [ os.path.join('source-files', 'com.kunzisoft.testcase', 'build.gradle'), @@ -1035,7 +1035,7 @@ class CommonTest(unittest.TestCase): app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['free'] - app.builds = [build] + app['Builds'] = [build] app.id = 'com.kunzisoft.fdroidtest.applicationidsuffix' paths = [ os.path.join('source-files', 'com.kunzisoft.testcase', 'build.gradle'), @@ -1048,7 +1048,7 @@ class CommonTest(unittest.TestCase): app = fdroidserver.metadata.App() build = fdroidserver.metadata.Build() build.gradle = ['underscore'] - app.builds = [build] + app['Builds'] = [build] app.id = 'com.kunzisoft.fdroidtest.applicationidsuffix.underscore' paths = [ os.path.join('source-files', 'com.kunzisoft.testcase', 'build.gradle'), diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index f2c85331..45353c08 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -316,7 +316,7 @@ class MetadataTest(unittest.TestCase): build.disable = 'Generated by import.py ...' build.commit = 'Unknown' build.gradle = [True] - app.builds = [build] + app['Builds'] = [build] fdroidserver.metadata.write_yaml(mf, app) @@ -464,7 +464,7 @@ class MetadataTest(unittest.TestCase): mf = io.StringIO() app = fdroidserver.metadata.App() app.Categories = ['None'] - app.builds = [] + app['Builds'] = [] build = fdroidserver.metadata.Build() build.versionCode = 102030 build.versionName = 'v1.2.3' @@ -472,7 +472,7 @@ class MetadataTest(unittest.TestCase): build.init = "sed -i -e 'g/what/ever/' /some/file" build.prebuild = "sed -i 'd/that wrong config/' gradle.properties" build.build = "./gradlew compile" - app.builds.append(build) + app['Builds'].append(build) fdroidserver.metadata.write_yaml(mf, app) mf.seek(0) self.assertEqual(mf.read(), textwrap.dedent("""\ @@ -496,7 +496,7 @@ class MetadataTest(unittest.TestCase): mf = io.StringIO() app = fdroidserver.metadata.App() app.Categories = ['None'] - app.builds = [] + app['Builds'] = [] build = fdroidserver.metadata.Build() build.versionCode = 102030 build.versionName = 'v1.2.3' @@ -504,7 +504,7 @@ class MetadataTest(unittest.TestCase): build.init = ["sed -i -e 'g/what/ever/' /some/file"] build.prebuild = ["sed -i 'd/that wrong config/' gradle.properties"] build.build = ["./gradlew compile"] - app.builds.append(build) + app['Builds'].append(build) fdroidserver.metadata.write_yaml(mf, app) mf.seek(0) self.assertEqual(mf.read(), textwrap.dedent("""\ @@ -528,7 +528,7 @@ class MetadataTest(unittest.TestCase): mf = io.StringIO() app = fdroidserver.metadata.App() app.Categories = ['None'] - app.builds = [] + app['Builds'] = [] build = fdroidserver.metadata.Build() build.versionCode = 102030 build.versionName = 'v1.2.3' @@ -542,7 +542,7 @@ class MetadataTest(unittest.TestCase): build.build = ["./gradlew someSpecialTask", "sed -i 'd/that wrong config/' gradle.properties", "./gradlew compile"] - app.builds.append(build) + app['Builds'].append(build) fdroidserver.metadata.write_yaml(mf, app) mf.seek(0) self.assertEqual(mf.read(), textwrap.dedent("""\ @@ -576,7 +576,7 @@ class MetadataTest(unittest.TestCase): mf = io.StringIO() app = fdroidserver.metadata.App() app.Categories = ['None'] - app.builds = [] + app['Builds'] = [] build = fdroidserver.metadata.Build() build.versionCode = 102030 build.versionName = 'v1.2.3' @@ -584,7 +584,7 @@ class MetadataTest(unittest.TestCase): build.init = "bash generate_some_file.sh && sed -i -e 'g/what/ever/' /some/file" build.prebuild = "npm something && echo 'important setting' >> /a/file" build.build = "./gradlew someSpecialTask && sed -i 'd/that wrong config/' gradle.properties && ./gradlew compile" - app.builds.append(build) + app['Builds'].append(build) fdroidserver.metadata.write_yaml(mf, app) mf.seek(0) self.assertEqual(mf.read(), textwrap.dedent("""\ @@ -619,12 +619,12 @@ class MetadataTest(unittest.TestCase): app = fdroidserver.metadata.App() app.Categories = ['None'] app.Provides = 'this.is.deprecated' - app.builds = [] + app['Builds'] = [] build = fdroidserver.metadata.Build() build.versionCode = 102030 build.versionName = 'v1.2.3' build.gradle = ['yes'] - app.builds.append(build) + app['Builds'].append(build) fdroidserver.metadata.write_yaml(mf, app) mf.seek(0) self.assertEqual(mf.read(), textwrap.dedent("""\ diff --git a/tests/metadata/dump/com.politedroid.yaml b/tests/metadata/dump/com.politedroid.yaml index 1fe59448..28c089ad 100644 --- a/tests/metadata/dump/com.politedroid.yaml +++ b/tests/metadata/dump/com.politedroid.yaml @@ -7,39 +7,7 @@ AutoName: Polite Droid AutoUpdateMode: Version v%v Binaries: null Bitcoin: null -Categories: -- Time -Changelog: '' -CurrentVersion: '1.5' -CurrentVersionCode: '6' -Description: Activates silent mode during calendar events. -Disabled: null -Donate: null -FlattrID: null -IssueTracker: https://github.com/miguelvps/PoliteDroid/issues -Liberapay: null -LiberapayID: null -License: GPL-3.0-only -Litecoin: null -MaintainerNotes: '' -Name: null -NoSourceSince: '1.5' -OpenCollective: null -Provides: null -Repo: https://github.com/miguelvps/PoliteDroid.git -RepoType: git -RequiresRoot: false -SourceCode: https://github.com/miguelvps/PoliteDroid -Summary: Calendar tool -Translation: '' -UpdateCheckData: null -UpdateCheckIgnore: null -UpdateCheckMode: Tags -UpdateCheckName: null -VercodeOperation: null -WebSite: '' -added: null -builds: +Builds: - androidupdate: [] antcommands: [] antifeatures: @@ -180,6 +148,38 @@ builds: timeout: null versionCode: '6' versionName: '1.5' +Categories: +- Time +Changelog: '' +CurrentVersion: '1.5' +CurrentVersionCode: '6' +Description: Activates silent mode during calendar events. +Disabled: null +Donate: null +FlattrID: null +IssueTracker: https://github.com/miguelvps/PoliteDroid/issues +Liberapay: null +LiberapayID: null +License: GPL-3.0-only +Litecoin: null +MaintainerNotes: '' +Name: null +NoSourceSince: '1.5' +OpenCollective: null +Provides: null +Repo: https://github.com/miguelvps/PoliteDroid.git +RepoType: git +RequiresRoot: false +SourceCode: https://github.com/miguelvps/PoliteDroid +Summary: Calendar tool +Translation: '' +UpdateCheckData: null +UpdateCheckIgnore: null +UpdateCheckMode: Tags +UpdateCheckName: null +VercodeOperation: null +WebSite: '' +added: null comments: {} id: com.politedroid lastUpdated: null diff --git a/tests/metadata/dump/org.adaway.yaml b/tests/metadata/dump/org.adaway.yaml index 4732ad01..b5cca8cd 100644 --- a/tests/metadata/dump/org.adaway.yaml +++ b/tests/metadata/dump/org.adaway.yaml @@ -7,62 +7,7 @@ AutoName: AdAway AutoUpdateMode: Version v%v Binaries: null Bitcoin: null -Categories: -- System -- Security -Changelog: '' -CurrentVersion: '3.0' -CurrentVersionCode: '52' -Description: 'An ad blocker that uses the hosts file. The hosts file - - contains a list of mappings between hostnames and IP addresses. When - - an app requests an ad, that request is directed to 127.0.0.1 which does - - nothing. There are options to run a web server - - to respond to blocked hostnames and to direct requests to the IP - - address of your choosing. You can download hosts files from the - - app but it is possible to use your own and to add certain sites - - to the white- and black-lists. - - - [https://github.com/dschuermann/ad-away/raw/HEAD/CHANGELOG Changelog] - - - Requires root: Yes. The hosts files is located in /system which is normally - - read-only.' -Disabled: null -Donate: http://sufficientlysecure.org/index.php/adaway -FlattrID: '369138' -IssueTracker: https://github.com/dschuermann/ad-away/issues -Liberapay: null -LiberapayID: '1234567890' -License: GPL-3.0-only -Litecoin: null -MaintainerNotes: '' -Name: null -NoSourceSince: '' -OpenCollective: null -Provides: null -Repo: https://github.com/dschuermann/ad-away.git -RepoType: git -RequiresRoot: false -SourceCode: https://github.com/dschuermann/ad-away -Summary: Block advertisements -Translation: https://www.transifex.com/dominikschuermann/adaway -UpdateCheckData: null -UpdateCheckIgnore: null -UpdateCheckMode: Tags -UpdateCheckName: null -VercodeOperation: null -WebSite: http://sufficientlysecure.org/index.php/adaway -added: null -builds: +Builds: - androidupdate: [] antcommands: [] antifeatures: [] @@ -1086,6 +1031,61 @@ builds: timeout: null versionCode: '52' versionName: '3.0' +Categories: +- System +- Security +Changelog: '' +CurrentVersion: '3.0' +CurrentVersionCode: '52' +Description: 'An ad blocker that uses the hosts file. The hosts file + + contains a list of mappings between hostnames and IP addresses. When + + an app requests an ad, that request is directed to 127.0.0.1 which does + + nothing. There are options to run a web server + + to respond to blocked hostnames and to direct requests to the IP + + address of your choosing. You can download hosts files from the + + app but it is possible to use your own and to add certain sites + + to the white- and black-lists. + + + [https://github.com/dschuermann/ad-away/raw/HEAD/CHANGELOG Changelog] + + + Requires root: Yes. The hosts files is located in /system which is normally + + read-only.' +Disabled: null +Donate: http://sufficientlysecure.org/index.php/adaway +FlattrID: '369138' +IssueTracker: https://github.com/dschuermann/ad-away/issues +Liberapay: null +LiberapayID: '1234567890' +License: GPL-3.0-only +Litecoin: null +MaintainerNotes: '' +Name: null +NoSourceSince: '' +OpenCollective: null +Provides: null +Repo: https://github.com/dschuermann/ad-away.git +RepoType: git +RequiresRoot: false +SourceCode: https://github.com/dschuermann/ad-away +Summary: Block advertisements +Translation: https://www.transifex.com/dominikschuermann/adaway +UpdateCheckData: null +UpdateCheckIgnore: null +UpdateCheckMode: Tags +UpdateCheckName: null +VercodeOperation: null +WebSite: http://sufficientlysecure.org/index.php/adaway +added: null comments: {} id: org.adaway lastUpdated: null diff --git a/tests/metadata/dump/org.smssecure.smssecure.yaml b/tests/metadata/dump/org.smssecure.smssecure.yaml index 9587ce57..4af66030 100644 --- a/tests/metadata/dump/org.smssecure.smssecure.yaml +++ b/tests/metadata/dump/org.smssecure.smssecure.yaml @@ -7,59 +7,7 @@ AutoName: SMSSecure AutoUpdateMode: Version v%v Binaries: null Bitcoin: null -Categories: -- Phone & SMS -Changelog: '' -CurrentVersion: 0.6.0 -CurrentVersionCode: '102' -Description: 'SMSSecure is an SMS/MMS application that allows you to protect your - privacy while communicating with friends. - - Using SMSSecure, you can send SMS messages and share media or attachments with complete - privacy. - - - * Easy. SMSSecure works like any other SMS application. There''s nothing to sign - up for and no new service your friends need to join. - - * Reliable. SMSSecure communicates using encrypted SMS messages. No servers or internet - connection required. - - * Private. SMSSecure uses the TextSecure encryption protocol to provide privacy - for every message, every time. - - * Safe. All messages are encrypted locally, so if your phone is lost or stolen, - your messages are protected. - - * Open Source. SMSSecure is Free and Open Source, enabling anyone to verify its - security by auditing the code.' -Disabled: null -Donate: null -FlattrID: null -IssueTracker: https://github.com/SMSSecure/SMSSecure/issues -Liberapay: null -LiberapayID: null -License: GPL-3.0-only -Litecoin: null -MaintainerNotes: '' -Name: null -NoSourceSince: '' -OpenCollective: null -Provides: null -Repo: https://github.com/SMSSecure/SMSSecure -RepoType: git -RequiresRoot: false -SourceCode: https://github.com/SMSSecure/SMSSecure -Summary: Send encrypted text messages (SMS) -Translation: https://www.transifex.com/silence/silence -UpdateCheckData: null -UpdateCheckIgnore: null -UpdateCheckMode: Tags -UpdateCheckName: null -VercodeOperation: null -WebSite: http://www.smssecure.org -added: null -builds: +Builds: - androidupdate: [] antcommands: [] antifeatures: [] @@ -362,6 +310,58 @@ builds: timeout: null versionCode: '102' versionName: 0.6.0 +Categories: +- Phone & SMS +Changelog: '' +CurrentVersion: 0.6.0 +CurrentVersionCode: '102' +Description: 'SMSSecure is an SMS/MMS application that allows you to protect your + privacy while communicating with friends. + + Using SMSSecure, you can send SMS messages and share media or attachments with complete + privacy. + + + * Easy. SMSSecure works like any other SMS application. There''s nothing to sign + up for and no new service your friends need to join. + + * Reliable. SMSSecure communicates using encrypted SMS messages. No servers or internet + connection required. + + * Private. SMSSecure uses the TextSecure encryption protocol to provide privacy + for every message, every time. + + * Safe. All messages are encrypted locally, so if your phone is lost or stolen, + your messages are protected. + + * Open Source. SMSSecure is Free and Open Source, enabling anyone to verify its + security by auditing the code.' +Disabled: null +Donate: null +FlattrID: null +IssueTracker: https://github.com/SMSSecure/SMSSecure/issues +Liberapay: null +LiberapayID: null +License: GPL-3.0-only +Litecoin: null +MaintainerNotes: '' +Name: null +NoSourceSince: '' +OpenCollective: null +Provides: null +Repo: https://github.com/SMSSecure/SMSSecure +RepoType: git +RequiresRoot: false +SourceCode: https://github.com/SMSSecure/SMSSecure +Summary: Send encrypted text messages (SMS) +Translation: https://www.transifex.com/silence/silence +UpdateCheckData: null +UpdateCheckIgnore: null +UpdateCheckMode: Tags +UpdateCheckName: null +VercodeOperation: null +WebSite: http://www.smssecure.org +added: null comments: {} id: org.smssecure.smssecure lastUpdated: null diff --git a/tests/metadata/dump/org.videolan.vlc.yaml b/tests/metadata/dump/org.videolan.vlc.yaml index 39d628d4..89e60be7 100644 --- a/tests/metadata/dump/org.videolan.vlc.yaml +++ b/tests/metadata/dump/org.videolan.vlc.yaml @@ -7,61 +7,7 @@ AutoName: VLC AutoUpdateMode: None Binaries: null Bitcoin: null -Categories: -- Multimedia -Changelog: '' -CurrentVersion: 1.2.6 -CurrentVersionCode: '1030005' -Description: 'Video and audio player that supports a wide range of formats, - - for both local and remote playback. - - - [http://git.videolan.org/?p=vlc-ports/android.git;a=blob_plain;f=NEWS NEWS] - - ' -Disabled: null -Donate: http://www.videolan.org/contribute.html#money -FlattrID: null -IssueTracker: http://www.videolan.org/support/index.html#bugs -Liberapay: null -LiberapayID: null -License: GPL-3.0-only -Litecoin: null -MaintainerNotes: 'Instructions and dependencies here: http://wiki.videolan.org/AndroidCompile - - see http://buildbot.videolan.org/builders/ for version code scheme - - The VLC srclib commit can be found out from TESTED_HASH value in compile.sh - - - On new releases remove the updatecheck and force the CV to the last working - - build. This will make sure users don''t get notified about the update until - - the final build from the BS has been reviewed and tested. Once done, undo - - those changes. - - ' -Name: null -NoSourceSince: '' -OpenCollective: null -Provides: null -Repo: git://git.videolan.org/vlc-ports/android.git -RepoType: git -RequiresRoot: false -SourceCode: http://git.videolan.org/?p=vlc-ports/android.git;a=summary -Summary: Media player -Translation: '' -UpdateCheckData: null -UpdateCheckIgnore: null -UpdateCheckMode: Tags -UpdateCheckName: null -VercodeOperation: '%c + 5' -WebSite: http://www.videolan.org/vlc/download-android.html -added: null -builds: +Builds: - androidupdate: - . - ../java-libs/SlidingMenu @@ -2444,6 +2390,60 @@ builds: timeout: null versionCode: '1030005' versionName: 1.2.6 +Categories: +- Multimedia +Changelog: '' +CurrentVersion: 1.2.6 +CurrentVersionCode: '1030005' +Description: 'Video and audio player that supports a wide range of formats, + + for both local and remote playback. + + + [http://git.videolan.org/?p=vlc-ports/android.git;a=blob_plain;f=NEWS NEWS] + + ' +Disabled: null +Donate: http://www.videolan.org/contribute.html#money +FlattrID: null +IssueTracker: http://www.videolan.org/support/index.html#bugs +Liberapay: null +LiberapayID: null +License: GPL-3.0-only +Litecoin: null +MaintainerNotes: 'Instructions and dependencies here: http://wiki.videolan.org/AndroidCompile + + see http://buildbot.videolan.org/builders/ for version code scheme + + The VLC srclib commit can be found out from TESTED_HASH value in compile.sh + + + On new releases remove the updatecheck and force the CV to the last working + + build. This will make sure users don''t get notified about the update until + + the final build from the BS has been reviewed and tested. Once done, undo + + those changes. + + ' +Name: null +NoSourceSince: '' +OpenCollective: null +Provides: null +Repo: git://git.videolan.org/vlc-ports/android.git +RepoType: git +RequiresRoot: false +SourceCode: http://git.videolan.org/?p=vlc-ports/android.git;a=summary +Summary: Media player +Translation: '' +UpdateCheckData: null +UpdateCheckIgnore: null +UpdateCheckMode: Tags +UpdateCheckName: null +VercodeOperation: '%c + 5' +WebSite: http://www.videolan.org/vlc/download-android.html +added: null comments: {} id: org.videolan.vlc lastUpdated: null diff --git a/tests/update.TestCase b/tests/update.TestCase index f8760600..4593f770 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -116,15 +116,15 @@ class UpdateTest(unittest.TestCase): buildnextcloudclient = fdroidserver.metadata.Build() buildnextcloudclient.gradle = ['generic'] - apps['com.nextcloud.client']['builds'] = [buildnextcloudclient] + apps['com.nextcloud.client']['Builds'] = [buildnextcloudclient] buildnextclouddevclient = fdroidserver.metadata.Build() buildnextclouddevclient.gradle = ['versionDev'] - apps['com.nextcloud.client.dev']['builds'] = [buildnextclouddevclient] + apps['com.nextcloud.client.dev']['Builds'] = [buildnextclouddevclient] build_conversations = fdroidserver.metadata.Build() build_conversations.gradle = ['free'] - apps['eu.siacs.conversations']['builds'] = [build_conversations] + apps['eu.siacs.conversations']['Builds'] = [build_conversations] fdroidserver.update.insert_localized_app_metadata(apps) From e93acf79642d1bdaeaa35976d270e21c54a4c872 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 9 Dec 2020 19:27:37 +0100 Subject: [PATCH 0009/2116] metadata: work with dicts generated by standard YAML parsers Now that the mismatch between 'builds' and 'Builds' has been fixed, it is now possible to read metadata/*.yml files with a standard YAML parser like PyYAML, then output them using `metadata.write_metadata()`. Other API functions in fdroidserver should also work in this case. I did this as I was working on fdroiddata!7860 --- fdroidserver/metadata.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 6af19c1f..ff75aa8a 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -940,6 +940,8 @@ def write_yaml(mf, app): def _builds_to_yaml(app): builds = ruamel.yaml.comments.CommentedSeq() for build in app.get('Builds', []): + if not isinstance(build, Build): + build = Build(build) b = ruamel.yaml.comments.CommentedMap() for field in build_flags: value = getattr(build, field) From 0b879f18e5704be6d5a74444dbfe50eb6acfb450 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 13 Nov 2020 11:19:24 +0100 Subject: [PATCH 0010/2116] use dict syntax for app instances to allow API usage with plain dicts Since metadata files are now YAML, programs should be able to just read in the .yml files, then use them with fdroidserver methods without having to know about the App class. The App class just provides syntactic sugar by allowing dict keys to be accessed as attributes. --- fdroidserver/index.py | 2 +- fdroidserver/update.py | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 565a1c1e..9b2b68c9 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -358,7 +358,7 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing for appid, appdict in apps.items(): app = metadata.App(appdict) - if app.Disabled is not None: + if app.get('Disabled') is not None: continue # Get a list of the apks for this app... diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 9e79cc8d..ef1310c7 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -247,13 +247,13 @@ def update_wiki(apps, apks): buildfails = False for apk in apks: if apk['packageName'] == appid: - if str(apk['versionCode']) == app.CurrentVersionCode: + if str(apk['versionCode']) == app.get('CurrentVersionCode'): gotcurrentver = True apklist.append(apk) # Include ones we can't build, as a special case... for build in app.get('Builds', []): if build.disable: - if build.versionCode == app.CurrentVersionCode: + if build.versionCode == app.get('CurrentVersionCode'): cantupdate = True # TODO: Nasty: vercode is a string in the build, and an int elsewhere apklist.append({'versionCode': int(build.versionCode), @@ -272,7 +272,7 @@ def update_wiki(apps, apks): 'versionName': build.versionName, 'buildproblem': "The build for this version appears to have failed. Check the [[{0}/lastbuild_{1}|build log]].".format(appid, build.versionCode), }) - if app.CurrentVersionCode == '0': + if app.get('CurrentVersionCode') == '0': cantupdate = True # Sort with most recent first... apklist = sorted(apklist, key=lambda apk: apk['versionCode'], reverse=True) @@ -1912,7 +1912,7 @@ def apply_info_from_latest_apk(apps, apks): if app.get('Name') is None: app['Name'] = bestapk['name'] app['icon'] = bestapk['icon'] if 'icon' in bestapk else None - if app['CurrentVersionCode'] is None: + if app.get('CurrentVersionCode') is None: app['CurrentVersionCode'] = str(bestver) @@ -1931,8 +1931,8 @@ def archive_old_apks(apps, apks, archapks, repodir, archivedir, defaultkeepversi currentVersionApk = None for apk in apk_list: if apk['packageName'] == appid: - if app.CurrentVersionCode is not None: - if apk['versionCode'] == common.version_code_string_to_int(app.CurrentVersionCode): + if app.get('CurrentVersionCode') is not None: + if apk['versionCode'] == common.version_code_string_to_int(app['CurrentVersionCode']): currentVersionApk = apk continue apkList.append(apk) @@ -1946,8 +1946,8 @@ def archive_old_apks(apps, apks, archapks, repodir, archivedir, defaultkeepversi for appid, app in apps.items(): - if app.ArchivePolicy: - keepversions = int(app.ArchivePolicy[:-9]) + if app.get('ArchivePolicy'): + keepversions = int(app['ArchivePolicy'][:-9]) else: keepversions = defaultkeepversions From 21b0a6b4636ed26b16c0a5a45d4e41125054eb95 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 15 Dec 2020 08:49:28 +0100 Subject: [PATCH 0011/2116] gitlab-ci: update metadata_v0 test for parsing change `Builds:` is directly in the .yml metadata, and the internal representation now uses the same "Builds" name. Reading in .txt metadata files used the name "builds" for that. So this test now uses "Builds" as canonical. --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8b679c7b..d6b95c3b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -25,7 +25,7 @@ metadata_v0: image: registry.gitlab.com/fdroid/ci-images-base variables: GIT_DEPTH: 1000 - RELEASE_COMMIT_ID: 37f37ebd88e79ebe93239b72ed5503d5bde13f4b # 2.0a~ + RELEASE_COMMIT_ID: 37c95f59a17d86723fdb71e984121726db777f32 # 2.0a5~ script: - git fetch https://gitlab.com/fdroid/fdroidserver.git $RELEASE_COMMIT_ID - cd tests From 330ca2319ce65a1de5ed3f73a8d7003fc4535408 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 23 Jun 2020 21:56:15 +0200 Subject: [PATCH 0012/2116] example plugin for fetching srclibs This is used in _fdroiddata_'s `fdroid build` CI job, and _issuebot_. This uses @uniqx's awesome new 'plugin' feature to create a 'fetchsrclibs` command. The 'fdroid build' gitlab-ci job uses --on-server, which does not set up the srclibs. This plugin does the missing setup. This is moved from _fdroiddata_ where it was _tools/fdroid_fetchsrclibs.py_. --- examples/fdroid_fetchsrclibs.py | 43 +++++++++++++++++++++++++++++++++ hooks/pre-commit | 2 +- 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 examples/fdroid_fetchsrclibs.py diff --git a/examples/fdroid_fetchsrclibs.py b/examples/fdroid_fetchsrclibs.py new file mode 100644 index 00000000..213a05c5 --- /dev/null +++ b/examples/fdroid_fetchsrclibs.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 +# +# an fdroid plugin for setting up srclibs +# +# The 'fdroid build' gitlab-ci job uses --on-server, which does not +# set up the srclibs. This plugin does the missing setup. + +import argparse +import os +import pprint +from fdroidserver import _, common, metadata + +fdroid_summary = 'prepare the srclibs for `fdroid build --on-server`' + + +def main(): + common.config = { + 'accepted_formats': 'yml', + 'sdk_path': os.getenv('ANDROID_HOME'), + } + common.fill_config_defaults(common.config) + parser = argparse.ArgumentParser(usage="%(prog)s [options] [APPID[:VERCODE] [APPID[:VERCODE] ...]]") + common.setup_global_opts(parser) + parser.add_argument("appid", nargs='*', help=_("applicationId with optional versionCode in the form APPID[:VERCODE]")) + metadata.add_metadata_arguments(parser) + options = parser.parse_args() + common.options = options + pkgs = common.read_pkg_args(options.appid, True) + allapps = metadata.read_metadata(pkgs) + apps = common.read_app_args(options.appid, allapps, True) + srclib_dir = os.path.join('build', 'srclib') + os.makedirs(srclib_dir, exist_ok=True) + srclibpaths = [] + for appid, app in apps.items(): + for build in app.get('Builds', []): + for lib in build.srclibs: + srclibpaths.append(common.getsrclib(lib, srclib_dir, build=build)) + print('Set up srclibs:') + pprint.pprint(srclibpaths) + + +if __name__ == "__main__": + main() diff --git a/hooks/pre-commit b/hooks/pre-commit index a197559d..07a6607d 100755 --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -8,7 +8,7 @@ exec 1>&2 files=`git diff-index --cached HEAD 2>&1 | sed 's/^:.* //' | uniq | cut -b100-500` if [ -z "$files" ]; then - PY_FILES="fdroid makebuildserver setup.py fdroidserver/*.py" + PY_FILES="fdroid makebuildserver setup.py fdroidserver/*.py examples/*.py" PY_TEST_FILES="tests/*.TestCase" SH_FILES="hooks/pre-commit" BASH_FILES="gradlew-fdroid jenkins-build-all jenkins-setup-build-environment jenkins-test completion/bash-completion buildserver/provision-*" From c88a3f56a1765049589f285872cafc1a0d798136 Mon Sep 17 00:00:00 2001 From: TacoTheDank Date: Sat, 26 Dec 2020 19:51:22 -0500 Subject: [PATCH 0013/2116] Update NDK to r22 and add buildtools 30.0.3 --- buildserver/config.buildserver.yml | 1 + buildserver/provision-android-ndk | 2 +- examples/config.yml | 1 + makebuildserver | 4 ++++ 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/buildserver/config.buildserver.yml b/buildserver/config.buildserver.yml index b94fc601..4d9b76ce 100644 --- a/buildserver/config.buildserver.yml +++ b/buildserver/config.buildserver.yml @@ -12,6 +12,7 @@ ndk_paths: r19c: /home/vagrant/android-ndk/r19c r20b: /home/vagrant/android-ndk/r20b r21d: /home/vagrant/android-ndk/r21d + r22: /home/vagrant/android-ndk/r22 java_paths: 8: /usr/lib/jvm/java-8-openjdk-amd64 diff --git a/buildserver/provision-android-ndk b/buildserver/provision-android-ndk index c241bab3..e778cedc 100644 --- a/buildserver/provision-android-ndk +++ b/buildserver/provision-android-ndk @@ -15,7 +15,7 @@ if [ ! -e $NDK_BASE/r10e ]; then mv android-ndk-r10e r10e fi -for version in r11c r12b r13b r14b r15c r16b r17c r18b r19c r20b r21d; do +for version in r11c r12b r13b r14b r15c r16b r17c r18b r19c r20b r21d r22; do if [ ! -e ${NDK_BASE}/${version} ]; then unzip /vagrant/cache/android-ndk-${version}-linux-x86_64.zip > /dev/null mv android-ndk-${version} ${version} diff --git a/examples/config.yml b/examples/config.yml index e022e389..db93de9d 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -22,6 +22,7 @@ # r19c: None # r20b: None # r21d: None +# r22: None # Directory to store downloaded tools in (i.e. gradle versions) # By default, these are stored in ~/.cache/fdroidserver diff --git a/makebuildserver b/makebuildserver index 347c73fb..d248898c 100755 --- a/makebuildserver +++ b/makebuildserver @@ -279,6 +279,8 @@ CACHE_FILES = [ '560eace2cc6ca16011fbb97c92c39aa0441d54dbfc13837dfbdb4a6bdf9c9da8'), ('https://dl.google.com/android/repository/build-tools_r30.0.2-linux.zip', '565af786dc0cc1941002174fb945122eabd080b222cd4c7c3d9a2ae0fabf5dc4'), + ('https://dl.google.com/android/repository/build-tools_r30.0.3-linux.zip', + '24593500aa95d2f99fb4f10658aae7e65cb519be6cd33fa164f15f27f3c4a2d6'), ('https://services.gradle.org/distributions/gradle-2.2.1-bin.zip', '420aa50738299327b611c10b8304b749e8d3a579407ee9e755b15921d95ff418'), ('https://services.gradle.org/distributions/gradle-2.3-bin.zip', @@ -423,6 +425,8 @@ CACHE_FILES = [ '8381c440fe61fcbb01e209211ac01b519cd6adf51ab1c2281d5daad6ca4c8c8c'), ('https://dl.google.com/android/repository/android-ndk-r21d-linux-x86_64.zip', 'dd6dc090b6e2580206c64bcee499bc16509a5d017c6952dcd2bed9072af67cbd'), + ('https://dl.google.com/android/repository/android-ndk-r22-linux-x86_64.zip', + 'd37fc69cd81e5660234a686e20adef39bc0244086e4d66525a40af771c020718'), ] From 30f1f158147c90712ce044337a2f312c84873535 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sun, 3 Jan 2021 08:50:21 +0100 Subject: [PATCH 0014/2116] Add missing test files for scanner --- MANIFEST.in | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/MANIFEST.in b/MANIFEST.in index 064d220e..86f96a8b 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -721,6 +721,7 @@ include tests/source-files/com.nextcloud.client/src/generic/fastlane/metadata/an include tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/en-US/full_description.txt include tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/en-US/short_description.txt include tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/en-US/title.txt +include tests/source-files/com.seafile.seadroid2/app/build.gradle include tests/source-files/eu.siacs.conversations/build.gradle include tests/source-files/eu.siacs.conversations/metadata/en-US/name.txt include tests/source-files/fdroid/fdroidclient/AndroidManifest.xml @@ -729,6 +730,7 @@ include tests/source-files/firebase-suspect/app/build.gradle include tests/source-files/firebase-suspect/build.gradle include tests/source-files/firebase-whitelisted/app/build.gradle include tests/source-files/firebase-whitelisted/build.gradle +include tests/source-files/info.guardianproject.ripple/build.gradle include tests/source-files/open-keychain/open-keychain/build.gradle include tests/source-files/open-keychain/open-keychain/OpenKeychain/build.gradle include tests/source-files/org.mozilla.rocket/app/build.gradle @@ -738,6 +740,8 @@ include tests/source-files/org.tasks/build.gradle.kts include tests/source-files/org.tasks/buildSrc/build.gradle.kts include tests/source-files/org.tasks/settings.gradle.kts include tests/source-files/osmandapp/osmand/build.gradle +include tests/source-files/osmandapp/osmand/gradle/wrapper/gradle-wrapper.properties +include tests/source-files/realm/react-native/android/build.gradle include tests/source-files/se.manyver/android/app/build.gradle include tests/source-files/se.manyver/android/build.gradle include tests/source-files/se.manyver/android/gradle.properties @@ -751,6 +755,7 @@ include tests/source-files/ut.ewh.audiometrytest/app/build.gradle include tests/source-files/ut.ewh.audiometrytest/app/src/main/AndroidManifest.xml include tests/source-files/ut.ewh.audiometrytest/build.gradle include tests/source-files/ut.ewh.audiometrytest/settings.gradle +include tests/source-files/yuriykulikov/AlarmClock/gradle/wrapper/gradle-wrapper.properties include tests/source-files/Zillode/syncthing-silk/build.gradle include tests/SpeedoMeterApp.main_1.apk include tests/stats/known_apks.txt From e789dc4554c3578aacce73fa61f5db9d759a5921 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sun, 3 Jan 2021 09:04:13 +0100 Subject: [PATCH 0015/2116] Sort MANIFEST.in --- MANIFEST.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index 86f96a8b..6836bda4 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -606,6 +606,7 @@ include tests/metadata-rewrite-yml/org.fdroid.fdroid.yml include tests/metadata/souch.smsbypass.yml include tests/metadata.TestCase include tests/minimal_targetsdk_30_unsigned.apk +include tests/Norway_bouvet_europe_2.obf.zip include tests/no_targetsdk_minsdk1_unsigned.apk include tests/no_targetsdk_minsdk30_unsigned.apk include tests/openssl-version-check-test.py @@ -805,7 +806,6 @@ include tests/v2.only.sig_2.apk include tests/valid-package-names/random-package-names include tests/valid-package-names/RandomPackageNames.java include tests/valid-package-names/test.py -include tests/Norway_bouvet_europe_2.obf.zip include tests/xref/metadata/aarddict.android.yml include tests/xref/metadata/org.coolreader.yml include tests/xref/metadata/org.geometerplus.zlibrary.ui.android.yml From ffcf9e7a64100add8c9aa6d0493c3b7c0f272380 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sun, 3 Jan 2021 09:04:48 +0100 Subject: [PATCH 0016/2116] Drop deleted files from MANIFEST.in --- MANIFEST.in | 4 ---- 1 file changed, 4 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index 6836bda4..a22fd89e 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -538,7 +538,6 @@ include tests/common.TestCase include tests/complete-ci-tests include tests/config.py include tests/deploy.TestCase -include tests/description-parsing.py include tests/dummy-keystore.jks include tests/dump_internal_metadata_format.py include tests/exception.TestCase @@ -806,6 +805,3 @@ include tests/v2.only.sig_2.apk include tests/valid-package-names/random-package-names include tests/valid-package-names/RandomPackageNames.java include tests/valid-package-names/test.py -include tests/xref/metadata/aarddict.android.yml -include tests/xref/metadata/org.coolreader.yml -include tests/xref/metadata/org.geometerplus.zlibrary.ui.android.yml From 0e312a928b927c545f54be96ad2ef8b000bf7bbf Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 4 Jan 2021 16:23:13 +0100 Subject: [PATCH 0017/2116] add missing test files sorted using UNIX `sort` https://gitlab.com/fdroid/fdroidserver/-/merge_requests/842#note_476969121 --- MANIFEST.in | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/MANIFEST.in b/MANIFEST.in index a22fd89e..948d8fc7 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -534,9 +534,11 @@ include tests/build-tools/28.0.3/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/28.0.3/aapt-output-souch.smsbypass_9.txt include tests/build-tools/generate.sh include tests/check-fdroid-apk +include tests/checkupdates.TestCase include tests/common.TestCase include tests/complete-ci-tests include tests/config.py +include tests/corrupt-featureGraphic.png include tests/deploy.TestCase include tests/dummy-keystore.jks include tests/dump_internal_metadata_format.py @@ -551,14 +553,18 @@ include tests/gnupghome/random_seed include tests/gnupghome/secring.gpg include tests/gnupghome/trustdb.gpg include tests/gradle-maven-blocks.yaml +include tests/gradle-release-checksums.py include tests/import_proxy.py include tests/import.TestCase include tests/index.TestCase +include tests/init.TestCase include tests/install.TestCase include tests/IsMD5Disabled.java include tests/janus.apk include tests/keystore.jks +include tests/key-tricks.py include tests/lint.TestCase +include tests/main.TestCase include tests/metadata/apk/info.guardianproject.urzip.yaml include tests/metadata/apk/org.dyndns.fules.ck.yaml include tests/metadata/app.with.special.build.params.yml @@ -671,6 +677,7 @@ include tests/repo/patch.1619.obb.mainpatch.current.obb include tests/repo/souch.smsbypass_9.apk include tests/repo/urzip-*.apk include tests/repo/v1.v2.sig_1020.apk +include tests/rewritemeta.TestCase include tests/run-tests include tests/scanner.TestCase include tests/signatures.TestCase @@ -760,6 +767,7 @@ include tests/source-files/Zillode/syncthing-silk/build.gradle include tests/SpeedoMeterApp.main_1.apk include tests/stats/known_apks.txt include tests/testcommon.py +include tests/test-gradlew-fdroid include tests/triple-t-2/build/org.piwigo.android/app/build.gradle include tests/triple-t-2/build/org.piwigo.android/app/.gitignore include tests/triple-t-2/build/org.piwigo.android/app/src/debug/res/values/constants.xml @@ -805,3 +813,4 @@ include tests/v2.only.sig_2.apk include tests/valid-package-names/random-package-names include tests/valid-package-names/RandomPackageNames.java include tests/valid-package-names/test.py +include tests/vcs.TestCase From 434a23f82277f1351b4daf3d107bbf2d7c2fe6f1 Mon Sep 17 00:00:00 2001 From: Izzy Date: Mon, 4 Jan 2021 17:39:57 +0100 Subject: [PATCH 0018/2116] add Google Play Core to non-free/proprietary dependencies --- fdroidserver/scanner.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index fca0c124..7222b74b 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -50,6 +50,7 @@ CODE_SIGNATURES = { exp: re.compile(r'.[\s]*d[\s]*[0-9]*[\s]*[0-9*][\s]*[0-9]*[\s]*' + exp, re.IGNORECASE) for exp in [ r'(com\.google\.firebase[^\s]*)', r'(com\.google\.android\.gms[^\s]*)', + r'(com\.google\.android\.play\.core[^\s]*)', r'(com\.google\.tagmanager[^\s]*)', r'(com\.google\.analytics[^\s]*)', r'(com\.android\.billing[^\s]*)', @@ -65,6 +66,7 @@ NON_FREE_GRADLE_LINES = { r'google.*ad.*view', r'google.*admob', r'google.*play.*services', + r'com.google.android.play:core.*', r'crittercism', r'heyzap', r'jpct.*ae', From a9c380b2b8d8461991b782650814cf47a4b5255c Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 4 Jan 2021 21:12:54 +0100 Subject: [PATCH 0019/2116] Ignore src/test only in path_in_build_dir Found while debugging Debian autopkgtests. --- fdroidserver/scanner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 7222b74b..506e395b 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -237,7 +237,7 @@ def scan_source(build_dir, build=metadata.Build()): return ignoreproblem(what, path_in_build_dir) if todelete(path_in_build_dir): return removeproblem(what, path_in_build_dir, filepath) - if 'src/test' in filepath or '/test/' in path_in_build_dir: + if 'src/test' in path_in_build_dir or '/test/' in path_in_build_dir: return warnproblem(what, path_in_build_dir) if options and 'json' in vars(options) and options.json: json_per_build['errors'].append([what, path_in_build_dir]) From 16d3f89b5c6e9051665535c6b516b37f9743e862 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 5 Jan 2021 21:35:06 +0100 Subject: [PATCH 0020/2116] travis-ci: Calling brew cask install is disabled! Use brew install [--cask] instead --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index a012541b..44c7ea70 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,8 +42,9 @@ install: - brew uninstall java --force || true - brew cask uninstall java --force || true - brew tap adoptopenjdk/openjdk - - travis_retry brew cask install adoptopenjdk8 - - travis_retry brew cask install android-sdk + - travis_retry brew install --cask adoptopenjdk8 + - export JAVA_HOME=`/usr/libexec/java_home -v 1.8` + - travis_retry brew install --cask android-sdk - export AAPT_VERSION=`sed -n "s,^MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION\s*=\s*['\"]\(.*\)[['\"],\1,p" fdroidserver/common.py` - mkdir -p "$ANDROID_HOME/licenses" From 81b55e0d8f49715bf91206a811181da6a5d1fa29 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 7 Jan 2021 17:09:44 +0100 Subject: [PATCH 0021/2116] tests: use wc -m to support BSD and macOS --- tests/run-tests | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/run-tests b/tests/run-tests index dce080a8..935ceb8e 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -1266,7 +1266,7 @@ if which wget; then mv $REPOROOT/index-v1.json repo/index-v1.json port=321${RANDOM:3} - test $(printf $port | wc --chars) -le 3 && port=52734 # when $RANDOM doesn't work + test $(printf $port | wc -m) -le 3 && port=52734 # when $RANDOM doesn't work timeout 5m python3 -m http.server $port --bind 127.0.0.1 > $REPOROOT/http.server.log 2>&1 & http_server_pid=$! From d5464fab348c56beaf1f4f354ef8d609cf009f87 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 7 Jan 2021 17:12:06 +0100 Subject: [PATCH 0022/2116] release 2.0a5 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 61475a4b..22958250 100755 --- a/setup.py +++ b/setup.py @@ -53,7 +53,7 @@ with open("README.md", "r") as fh: long_description = fh.read() setup(name='fdroidserver', - version='2.0a4', + version='2.0a5', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From 01699db3768005f05f652cc30c9e270a5bc7e20d Mon Sep 17 00:00:00 2001 From: mimi89999 Date: Mon, 11 Jan 2021 10:44:48 +0100 Subject: [PATCH 0023/2116] Add androidx.work:work-gcm to non-free dependencies --- fdroidserver/scanner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 506e395b..8699b8c0 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -67,6 +67,7 @@ NON_FREE_GRADLE_LINES = { r'google.*admob', r'google.*play.*services', r'com.google.android.play:core.*', + r'androidx.work:work-gcm', r'crittercism', r'heyzap', r'jpct.*ae', From 67ae1642930fc3aef7bba360ea1b6c341d2b168c Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Mon, 11 Jan 2021 14:10:52 +0200 Subject: [PATCH 0024/2116] Gradle 6.8 --- gradlew-fdroid | 3 ++- makebuildserver | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 8ccb7a67..ea34397f 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -143,6 +143,7 @@ get_sha() { '6.6.1') echo '7873ed5287f47ca03549ab8dcb6dc877ac7f0e3d7b1eb12685161d10080910ac' ;; '6.7') echo '8ad57759019a9233dc7dc4d1a530cefe109dc122000d57f7e623f8cf4ba9dfc4' ;; '6.7.1') echo '3239b5ed86c3838a37d983ac100573f64c1f3fd8e1eb6c89fa5f9529b5ec091d' ;; + '6.8') echo 'e2774e6fb77c43657decde25542dea710aafd78c4022d19b196e7e78d79d8c6c' ;; *) exit 1 esac } @@ -163,7 +164,7 @@ d_plugin_k=(4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 d_plugin_v=(6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.4) +plugin_v=(6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.4) v_all=${plugin_v[@]} diff --git a/makebuildserver b/makebuildserver index d248898c..a06d6355 100755 --- a/makebuildserver +++ b/makebuildserver @@ -401,6 +401,8 @@ CACHE_FILES = [ '7873ed5287f47ca03549ab8dcb6dc877ac7f0e3d7b1eb12685161d10080910ac'), ('https://services.gradle.org/distributions/gradle-6.7.1-bin.zip', '3239b5ed86c3838a37d983ac100573f64c1f3fd8e1eb6c89fa5f9529b5ec091d'), + ('https://services.gradle.org/distributions/gradle-6.8-bin.zip', + 'e2774e6fb77c43657decde25542dea710aafd78c4022d19b196e7e78d79d8c6c'), ('https://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin', '102d6723f67ff1384330d12c45854315d6452d6510286f4e5891e00a5a8f1d5a'), ('https://dl.google.com/android/repository/android-ndk-r11c-linux-x86_64.zip', From 4b7d29097d3f189aac129dca76d4e6012cf67f31 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 11 Jan 2021 12:05:02 +0100 Subject: [PATCH 0025/2116] gitlab-ci: new job to test plugins API + `fdroid fetchsrclibs` --- .gitlab-ci.yml | 38 +++++++++++++++++++++++++++++++++ examples/fdroid_fetchsrclibs.py | 1 - 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d6b95c3b..e843ab6e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -293,6 +293,44 @@ fdroid build: - fdroid build --verbose --on-server --no-tarball --latest org.fdroid.fdroid +plugin_fetchsrclibs: + image: debian:buster + <<: *apt-template + only: + refs: + - branches + - pipelines + changes: + - .gitlab-ci.yml + - examples/fdroid_fetchsrclibs.py + - fdroidserver/__main__.py + script: + - apt-get install + curl + git + python3-pip + python3-venv + - python3 -m venv env + - . env/bin/activate + - export PATH="$CI_PROJECT_DIR:$PATH" + - export PYTHONPATH="$CI_PROJECT_DIR/examples" + - $pip install wheel # to make this go away: "error: invalid command 'bdist_wheel'" + - $pip install -e . + - fdroid | grep fetchsrclibs + + - mkdir fdroiddata + - curl https://gitlab.com/fdroid/fdroiddata/repository/b9e9a077d720c86ff6fff4dbb341254cc4370b1a/archive.tar.gz + | tar -xz --directory=fdroiddata --strip-components=1 + - cd fdroiddata + - fdroid fetchsrclibs freemap.opentrail:9 --verbose + - test -d build/freemap.opentrail/.git + - test -d build/srclib/andromaps/.git + - test -d build/srclib/freemaplib/.git + - test -d build/srclib/freemaplibProj/.git + - test -d build/srclib/JCoord/.git + - test -d build/srclib/javaproj/.git + + # test a full update and deploy cycle to gitlab.com servergitmirrors: image: debian diff --git a/examples/fdroid_fetchsrclibs.py b/examples/fdroid_fetchsrclibs.py index 213a05c5..0a093edf 100644 --- a/examples/fdroid_fetchsrclibs.py +++ b/examples/fdroid_fetchsrclibs.py @@ -15,7 +15,6 @@ fdroid_summary = 'prepare the srclibs for `fdroid build --on-server`' def main(): common.config = { - 'accepted_formats': 'yml', 'sdk_path': os.getenv('ANDROID_HOME'), } common.fill_config_defaults(common.config) From d36f71e048c51fc3fbc935abda4e0049b3fb957e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 11 Jan 2021 13:15:33 +0100 Subject: [PATCH 0026/2116] make config optional when using common.set_FDroidPopen_env() common.set_FDroidPopen_env() is used to call git and other tools that are not part of the Android SDK nor require Java, so the items that are being set from the config are optional. This lets plugins do quite a bit without ever setting up a config. --- examples/fdroid_fetchsrclibs.py | 4 ---- fdroidserver/common.py | 10 ++++++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/examples/fdroid_fetchsrclibs.py b/examples/fdroid_fetchsrclibs.py index 0a093edf..3dc4e423 100644 --- a/examples/fdroid_fetchsrclibs.py +++ b/examples/fdroid_fetchsrclibs.py @@ -14,10 +14,6 @@ fdroid_summary = 'prepare the srclibs for `fdroid build --on-server`' def main(): - common.config = { - 'sdk_path': os.getenv('ANDROID_HOME'), - } - common.fill_config_defaults(common.config) parser = argparse.ArgumentParser(usage="%(prog)s [options] [APPID[:VERCODE] [APPID[:VERCODE] ...]]") common.setup_global_opts(parser) parser.add_argument("appid", nargs='*', help=_("applicationId with optional versionCode in the form APPID[:VERCODE]")) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 4aebe275..1de841c1 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2741,10 +2741,12 @@ def set_FDroidPopen_env(build=None): if env is None: env = os.environ orig_path = env['PATH'] - for n in ['ANDROID_HOME', 'ANDROID_SDK']: - env[n] = config['sdk_path'] - for k, v in config['java_paths'].items(): - env['JAVA%s_HOME' % k] = v + if config: + if config.get('sdk_path'): + for n in ['ANDROID_HOME', 'ANDROID_SDK']: + env[n] = config['sdk_path'] + for k, v in config.get('java_paths', {}).items(): + env['JAVA%s_HOME' % k] = v missinglocale = True for k, v in env.items(): From 40197295ae3879ceb7047f73f63774f2965d9d03 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 11 Jan 2021 12:05:02 +0100 Subject: [PATCH 0027/2116] gitlab-ci: remove refs: section to hopefully get reliable job starts "fdroid build" and "plugin_fetchsrclibs" totally failed to run here: https://gitlab.com/eighthave/fdroidserver/-/pipelines/240160903 --- .gitlab-ci.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e843ab6e..c2adc989 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -247,9 +247,6 @@ gradle: fdroid build: image: registry.gitlab.com/fdroid/ci-images-client only: - refs: - - branches - - pipelines changes: - .gitlab-ci.yml - buildserver/provision-apt-get-install @@ -297,9 +294,6 @@ plugin_fetchsrclibs: image: debian:buster <<: *apt-template only: - refs: - - branches - - pipelines changes: - .gitlab-ci.yml - examples/fdroid_fetchsrclibs.py From bfa49e921729b900e0711cd37708f8d69665cd01 Mon Sep 17 00:00:00 2001 From: Hakim Oubouali Date: Wed, 13 Jan 2021 05:41:40 +0100 Subject: [PATCH 0028/2116] Translated using Weblate: Central Atlas Tamazight (tzm) by Hakim Oubouali Currently translated at 0.6% (4 of 573 strings) Co-authored-by: Hakim Oubouali Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/tzm/ Translation: F-Droid/F-Droid Server --- locale/tzm/LC_MESSAGES/fdroidserver.po | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/locale/tzm/LC_MESSAGES/fdroidserver.po b/locale/tzm/LC_MESSAGES/fdroidserver.po index 4b29af0f..f6b4dabe 100644 --- a/locale/tzm/LC_MESSAGES/fdroidserver.po +++ b/locale/tzm/LC_MESSAGES/fdroidserver.po @@ -6,14 +6,15 @@ msgstr "" "Project-Id-Version: fdroidserver 1.1-681-gc19e8952\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2020-10-21 18:05+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" +"PO-Revision-Date: 2020-10-29 08:32+0000\n" +"Last-Translator: Hakim Oubouali \n" +"Language-Team: Central Atlas Tamazight \n" "Language: tzm\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n >= 2 && (n < 11 || n > 99);\n" +"X-Generator: Weblate 4.3.2-dev\n" #: ../fdroidserver/common.py msgid "" @@ -101,7 +102,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" -msgstr "" +msgstr "%(prog)s: tazgalt: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format @@ -111,7 +112,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "%prog [options]" -msgstr "" +msgstr "%prog [tidɣrin]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -1296,7 +1297,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "Options" -msgstr "" +msgstr "Tidɣrin" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." @@ -2455,7 +2456,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "show program's version number and exit" -msgstr "" +msgstr "Smal taleqqemt n uhil, tffeɣd" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py From 6dd86c5ec25e5215ae410fd45d89da1222a863b5 Mon Sep 17 00:00:00 2001 From: x Date: Wed, 13 Jan 2021 05:41:41 +0100 Subject: [PATCH 0029/2116] Translated using Weblate: Italian (it) by x Currently translated at 38.5% (221 of 573 strings) Co-authored-by: x Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ Translation: F-Droid/F-Droid Server --- locale/it/LC_MESSAGES/fdroidserver.po | 67 +++++++++++++-------------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index cc3d4a79..593e9fa0 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -5,20 +5,21 @@ # Luca Zambarda , 2020. # IvanDan , 2020. # Massimiliano Caniparoli , 2020. +# x , 2020. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2020-10-21 18:05+0200\n" -"PO-Revision-Date: 2020-10-15 17:12+0000\n" -"Last-Translator: IvanDan \n" +"PO-Revision-Date: 2020-11-25 16:30+0000\n" +"Last-Translator: x \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.3-dev\n" +"X-Generator: Weblate 4.4-dev\n" #: ../fdroidserver/common.py msgid "" @@ -152,8 +153,9 @@ msgid "'keypass' not found in config.py!" msgstr "\"keypass\" non trovato in config.py!" #: ../fdroidserver/common.py +#, fuzzy msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" +msgstr "\"keystore\" è NESSUNO e \"smartcardoptions\" è vuoto!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystore' not found in config.py!" @@ -275,11 +277,11 @@ msgstr "Avvisa anche dei problemi di formattazione, come rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" -msgstr "" +msgstr "Libreria AAR Android" #: ../fdroidserver/scanner.py msgid "Android APK file" -msgstr "" +msgstr "File APK di Android" #: ../fdroidserver/scanner.py msgid "Android DEX code" @@ -348,7 +350,7 @@ msgstr "Branch \"{branch}\" usata come commit in srclib \"{srclib}\"" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" -msgstr "" +msgstr "Collegamento simbolico interrotto: {path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Build a package from source" @@ -364,7 +366,7 @@ msgstr "Build generata da \"froid import\" - rimuovi disable line quando ha fini #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" -msgstr "" +msgstr "Il repository git dei metadati di compilazione ha modifiche non autorizzate!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" @@ -468,14 +470,12 @@ msgid "Could not find '{command}' on your system" msgstr "Impossibile trovare \"{command}\" sul tuo sistema" #: ../fdroidserver/import.py -#, fuzzy msgid "Could not find latest version code" -msgstr "Impossibile trovare il codice dell'ultima versione" +msgstr "Impossibile trovare il codice della versione più recente" #: ../fdroidserver/import.py -#, fuzzy msgid "Could not find latest version name" -msgstr "Impossibile trovare il nome dell'ultima versione" +msgstr "Impossibile trovare il nome della versione più recente" #: ../fdroidserver/update.py #, python-brace-format @@ -489,13 +489,12 @@ msgstr "Impossibile aprire il file apk per l'analisi" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" -msgstr "" +msgstr "Impossibile analizzare la dimensione \"{size}\", tipo sbagliato \"{type}\"" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/import.py -#, fuzzy msgid "Couldn't find Application ID" -msgstr "Impossibile trovare l'ID del pacchetto" +msgstr "Impossibile trovare l'ID dell'applicazione" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py @@ -560,9 +559,9 @@ msgid "Creating unsigned index in preparation for signing" msgstr "Creazione dell'indice non firmato in preparazione della firma" #: ../fdroidserver/lint.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "" +msgstr "CurrentVersionCode {cv} è inferiore alla voce di build più vecchia {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" @@ -573,14 +572,14 @@ msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "Cancella gli APK e/o OBB senza metadata dal repository" #: ../fdroidserver/deploy.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "" +msgstr "Eliminazione dell'archivio, il repository è troppo grande ({size} max {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "" +msgstr "Eliminazione della cronologia git-mirror, il repository è troppo grande ({size} max {limit})" #: ../fdroidserver/update.py #, python-brace-format @@ -608,7 +607,7 @@ msgstr "La descrizione di lunghezza {length} supera il limite di {limit} caratte #: ../fdroidserver/import.py msgid "Do not add 'disable:' to the generated build entries" -msgstr "" +msgstr "Non aggiungere 'disable:' alle voci di compilazione generate" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" @@ -646,7 +645,7 @@ msgstr "Non usare checksum rsync" #: ../fdroid ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" -msgstr "" +msgstr "Scarica mirror completi di piccoli repository" #: ../fdroidserver/stats.py msgid "Download logs we don't have" @@ -677,7 +676,7 @@ msgstr "Scansiona gli APK dinamicamente dopo la costruzione" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" +msgstr "ERRORE: il sottocomando \"server\" è stato rimosso, usa \"deploy\"!" #: ../fdroidserver/mirror.py msgid "" @@ -689,7 +688,7 @@ msgstr "" #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" -msgstr "" +msgstr "ERRORE: tipo di CI non supportato, le patch sono benvenute!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -699,7 +698,7 @@ msgstr "Flag build vuoto a {linedesc}" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "" +msgstr "La codifica è impostata su \"{enc}\" fdroid potrebbe incorrere in problemi di codifica. Impostalo su \"UTF-8\" per ottenere i migliori risultati." #: ../fdroidserver/init.py #, python-format @@ -725,9 +724,9 @@ msgid "Extract signatures from APKs" msgstr "Estrai le firme dagli APK" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Failed copying {path}: {error}" -msgstr "Impossibile leggere {path}: {error}" +msgstr "Copia non riuscita {path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format @@ -774,37 +773,37 @@ msgstr "Impossibile installare '{apkfilename}' su {dev}: {error}" #: ../fdroidserver/publish.py ../fdroidserver/common.py msgid "Failed to sign application" -msgstr "" +msgstr "Impossibile firmare l'applicazione" #: ../fdroidserver/common.py msgid "Failed to zipalign application" -msgstr "" +msgstr "Impossibilie eseguire lo zipalign dell'applicazione" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" -msgstr "" +msgstr "Buildserverid recuperato dalla VM: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" -msgstr "" +msgstr "Firme recuperate per \"{apkfilename}\" -> \"{sigdir}\"" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" -msgstr "" +msgstr "Il file è scomparso durante l'elaborazione: {path}" #: ../fdroidserver/verify.py ../fdroidserver/stats.py ../fdroidserver/update.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/build.py #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py msgid "Finished" -msgstr "" +msgstr "Finito" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID flag" -msgstr "" +msgstr "I metodi di donazione di Flattr appartengono al flag FlattrID" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" From 3ed8f5b505ccd7ae1dc2105be8c7be845a4dec0f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 13 Jan 2021 05:41:41 +0100 Subject: [PATCH 0030/2116] Translated using Weblate: Italian (it) by Hans-Christoph Steiner Currently translated at 40.3% (231 of 573 strings) Co-authored-by: Hans-Christoph Steiner Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ Translation: F-Droid/F-Droid Server --- locale/it/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 593e9fa0..49e67fe3 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -6,13 +6,14 @@ # IvanDan , 2020. # Massimiliano Caniparoli , 2020. # x , 2020. +# Hans-Christoph Steiner , 2020. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2020-10-21 18:05+0200\n" -"PO-Revision-Date: 2020-11-25 16:30+0000\n" -"Last-Translator: x \n" +"PO-Revision-Date: 2020-11-25 16:40+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" @@ -153,9 +154,8 @@ msgid "'keypass' not found in config.py!" msgstr "\"keypass\" non trovato in config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "\"keystore\" è NESSUNO e \"smartcardoptions\" è vuoto!" +msgstr "\"keystore\" è NONE e \"smartcardoptions\" è vuoto!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystore' not found in config.py!" From c5abf3321070ee7aee1231bf84f56a0a2fde454a Mon Sep 17 00:00:00 2001 From: x Date: Wed, 13 Jan 2021 05:41:42 +0100 Subject: [PATCH 0031/2116] Translated using Weblate: Italian (it) by x Currently translated at 60.0% (344 of 573 strings) Translated using Weblate: Italian (it) by x Currently translated at 42.2% (242 of 573 strings) Translated using Weblate: Italian (it) by x Currently translated at 40.3% (231 of 573 strings) Co-authored-by: x Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ Translation: F-Droid/F-Droid Server --- locale/it/LC_MESSAGES/fdroidserver.po | 292 +++++++++++++------------- 1 file changed, 151 insertions(+), 141 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 49e67fe3..9a06608a 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -12,8 +12,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2020-10-21 18:05+0200\n" -"PO-Revision-Date: 2020-11-25 16:40+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2020-11-30 08:39+0000\n" +"Last-Translator: x \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" @@ -155,7 +155,7 @@ msgstr "\"keypass\" non trovato in config.py!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "\"keystore\" è NONE e \"smartcardoptions\" è vuoto!" +msgstr "'keystore' è NONE e 'smartcardoptions' è vuoto!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystore' not found in config.py!" @@ -277,11 +277,11 @@ msgstr "Avvisa anche dei problemi di formattazione, come rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" -msgstr "Libreria AAR Android" +msgstr "Libreria AAR per Android" #: ../fdroidserver/scanner.py msgid "Android APK file" -msgstr "File APK di Android" +msgstr "File APK per Android" #: ../fdroidserver/scanner.py msgid "Android DEX code" @@ -559,7 +559,7 @@ msgid "Creating unsigned index in preparation for signing" msgstr "Creazione dell'indice non firmato in preparazione della firma" #: ../fdroidserver/lint.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" msgstr "CurrentVersionCode {cv} è inferiore alla voce di build più vecchia {versionCode}" @@ -572,7 +572,7 @@ msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "Cancella gli APK e/o OBB senza metadata dal repository" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" msgstr "Eliminazione dell'archivio, il repository è troppo grande ({size} max {limit})" @@ -807,176 +807,176 @@ msgstr "I metodi di donazione di Flattr appartengono al flag FlattrID" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" +msgstr "I metodi di donazione di Flattr appartengono al campo FlattrID" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" -msgstr "" +msgstr "Tag HTML vietati" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." -msgstr "" +msgstr "Forza la compilazione delle app disabilitate e prosegui indipendentemente dai problemi di scansione. Consentito solo in modalità test." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" -msgstr "" +msgstr "Forza l'arresto della compilazione dopo il timeout di {0} sec!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." -msgstr "" +msgstr "Forza la scansione di app e build disabilitate." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" -msgstr "" +msgstr "Trovato l'elemento grafico \"{path}\" senza metadati per l'app \"{name}\"!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" -msgstr "" +msgstr "Trovato file di finanziamento non valido \"{path}\" per \"{name}\":" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" -msgstr "" +msgstr "Trovati appid non validi negli argomenti" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" -msgstr "" +msgstr "Trovati codici di versione non validi per alcune app" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "" +msgstr "Trovati più file di blocco della firma JAR in {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" -msgstr "" +msgstr "Trovati più file di metadati per {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." -msgstr "" +msgstr "Trovati più certificati di firma per il repository." #: ../fdroidserver/update.py #, python-brace-format msgid "Found multiple signing certificates in {path}" -msgstr "" +msgstr "Trovati più certificati di firma in {path}" #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." -msgstr "" +msgstr "Nessun certificato di firma trovato per il repository." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" -msgstr "" +msgstr "Trovato non-file in %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" -msgstr "" +msgstr "Trovato {apkfilename} in {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" -msgstr "" +msgstr "Metadati dello scheletro generati per {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" -msgstr "" +msgstr "Checkout Git di \"%s\" non riuscito" #: ../fdroidserver/common.py msgid "Git clean failed" -msgstr "" +msgstr "Git clean non riuscito" #: ../fdroidserver/common.py msgid "Git fetch failed" -msgstr "" +msgstr "Recupero Git non riuscito" #: ../fdroidserver/common.py msgid "Git remote set-head failed" -msgstr "" +msgstr "Set-head remoto Git non riuscito" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" -msgstr "" +msgstr "Set-head remoto Git non riuscito: \"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" -msgstr "" +msgstr "Ripristino Git non riuscito" #: ../fdroidserver/common.py msgid "Git submodule sync failed" -msgstr "" +msgstr "Sincronizzazione del sottomodulo Git non riuscita" #: ../fdroidserver/common.py msgid "Git submodule update failed" -msgstr "" +msgstr "Aggiornamento del sottomodulo Git non riuscito" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" -msgstr "" +msgstr "HTTPS deve essere utilizzato con gli URL Subversion!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "" +msgstr "Se un mirror git diventa troppo grande, consenti l'eliminazione dell'archivio" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "" +msgstr "Se il caricamento non riesce, prova a caricare manualmente su {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "" +msgstr "Ignorando i metadati '{field}' in '{metapath}' perché obsoleti." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" -msgstr "" +msgstr "Ignorando la voce FUNDING.yml più lunga di 2048: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " -msgstr "" +msgstr "Ignorare il pacchetto senza metadati: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" -msgstr "" +msgstr "Ignorare i dati della cache obsoleti per {apkfilename}" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Ignoring {ext} file at '{path}'" -msgstr "" +msgstr "Ignorando il file {ext} in '{path}'" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "" +msgstr "Includere gli APK firmati con algoritmi disabilitati come MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" -msgstr "" +msgstr "Includere i file .asc della firma PGP nel mirror" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" -msgstr "" +msgstr "Includere i log di build nel mirror" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" -msgstr "" +msgstr "Includere i tarball dei sorgenti nel mirror" #: ../fdroidserver/common.py msgid "Initialising submodules" -msgstr "" +msgstr "Inizializzazione dei sottomoduli" #: ../fdroidserver/install.py msgid "Install all signed applications available" -msgstr "" +msgstr "Installa tutte le applicazioni firmate disponibili" #: ../fdroid ../fdroidserver/__main__.py msgid "Install built packages on devices" @@ -985,12 +985,12 @@ msgstr "Installa i pacchetti costruiti su dispositivi" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." -msgstr "" +msgstr "Installando %s..." #: ../fdroidserver/install.py #, python-format msgid "Installing %s…" -msgstr "" +msgstr "Installando %s…" #: ../fdroidserver/install.py #, python-brace-format @@ -1000,7 +1000,7 @@ msgstr "Installazione di '{apkfilename}' su {dev}..." #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}…" -msgstr "" +msgstr "Installando '{apkfilename}' su {dev}…" #: ../fdroid ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" @@ -1013,64 +1013,64 @@ msgstr "APK non valido" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" -msgstr "" +msgstr "VercodeOperation non valido: {field}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" -msgstr "" +msgstr "ID applicazione non valida {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" -msgstr "" +msgstr "Valore booleano '%s' non valido" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid build flag at {line} in {linedesc}" -msgstr "" +msgstr "Flag di compilazione non valido a {line} in {linedesc}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid build format: {value} in {name}" -msgstr "" +msgstr "Formato di compilazione non valido: {value} in {name}" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" -msgstr "" +msgstr "Elenco puntato non valido" #: ../fdroidserver/lint.py #, python-format msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" -msgstr "" +msgstr "Tag di licenza non valido \"%s\"! Utilizza solo tag da https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "" +msgstr "Link non valido - utilizza [http://foo.bar Link title] o [http://foo.bar]" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid metadata in %s:%d" -msgstr "" +msgstr "Metadati non validi in %s:%d" #: ../fdroidserver/metadata.py msgid "Invalid metadata in: " -msgstr "" +msgstr "Metadati non validi in: " #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" -msgstr "" +msgstr "Nome non valido per il file pubblicato: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" -msgstr "" +msgstr "Nome del pacchetto non valido {0}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " -msgstr "" +msgstr "Reindirizzamento non valido a non HTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format @@ -1080,69 +1080,70 @@ msgstr "Metadati scrlib non validi: '{file}' non esiste" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" -msgstr "" +msgstr "Metadati srclib non validi: impossibile analizzare '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "" +msgstr "Metadati srclib non validi: chiave sconosciuta '{key}' in '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid versionCode: \"{versionCode}\" is not an integer!" -msgstr "" +msgstr "VersionCode non valido: \"{versionCode}\" non è un numero intero!" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" -msgstr "" +msgstr "Impossibile verificare la firma JAR: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" -msgstr "" +msgstr "Firma JAR verificata: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" -msgstr "" +msgstr "File JAR Java" #: ../fdroidserver/publish.py ../fdroidserver/update.py #: ../fdroidserver/mirror.py msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "" +msgstr "Java JDK non trovato! Installa nella posizione standard o imposta java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" -msgstr "" +msgstr "Classe compilata in Java" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" -msgstr "" +msgstr "Java jarsigner non trovato! Installa nella posizione standard o imposta java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" -msgstr "" +msgstr "Javascript negli attributi HTML src" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" -msgstr "" +msgstr "Keystore per la firma della chiave:\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "" +msgstr "L'ultimo commit utilizzato '{commit}' sembra un tag, ma UpdateCheckMode è '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" -msgstr "" +msgstr "I metodi di donazione di Liberapay appartengono al campo Liberapay" #: ../fdroidserver/lint.py +#, fuzzy msgid "Liberapay donation methods belong in the LiberapayID flag" -msgstr "" +msgstr "I metodi di donazione di Liberapay appartengono alla bandiera LiberapayID" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted" -msgstr "" +msgstr "Elenca i file che verrebbero riformattati" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" @@ -1150,15 +1151,17 @@ msgstr "" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" -msgstr "" +msgstr "Interrompere la compilazione sulle eccezioni" #: ../fdroidserver/index.py +#, fuzzy msgid "Malformed repository mirrors." -msgstr "" +msgstr "Mirror del repository malformati." #: ../fdroidserver/deploy.py +#, fuzzy msgid "Malformed serverwebroot line:" -msgstr "" +msgstr "Riga del serverwebroot malformata:" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1166,16 +1169,16 @@ msgstr "" #: ../fdroidserver/gpgsign.py msgid "Missing output directory" -msgstr "" +msgstr "Directory di output mancante" #: ../fdroidserver/lint.py #, python-format msgid "Name '%s' is just the auto name - remove it" -msgstr "" +msgstr "Il nome '%s' è solo il nome automatico - rimuovilo" #: ../fdroidserver/common.py msgid "No 'config.py' found, using defaults." -msgstr "" +msgstr "Nessun 'config.py' trovato, utilizzando i valori predefiniti." #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1183,7 +1186,7 @@ msgstr "Android SDK non trovato!" #: ../fdroidserver/import.py msgid "No android or kivy project could be found. Specify --subdir?" -msgstr "" +msgstr "Nessun progetto Android o kivy è stato trovato. Specificare --subdir?" #: ../fdroidserver/install.py msgid "No attached devices found" @@ -1192,19 +1195,21 @@ msgstr "Nessun dispositivo collegato trovato" #: ../fdroidserver/metadata.py #, python-brace-format msgid "No commit specified for {versionName} in {linedesc}" -msgstr "" +msgstr "Nessun commit specificato per {versionName} in {linedesc}" #: ../fdroidserver/index.py +#, fuzzy msgid "No fingerprint in URL." -msgstr "" +msgstr "Nessuna impronta digitale nell'URL." #: ../fdroidserver/common.py msgid "No git submodules available" -msgstr "" +msgstr "Nessun sottomodulo git disponibile" #: ../fdroidserver/import.py +#, fuzzy msgid "No gradle project could be found. Specify --subdir?" -msgstr "" +msgstr "Nessun progetto gradle è stato trovato. Specificare --subdir?" #: ../fdroidserver/import.py ../fdroidserver/common.py msgid "No information found." @@ -1212,61 +1217,62 @@ msgstr "Nessun informazione trovata." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" -msgstr "" +msgstr "Non è necessario specificare che l'app è un Software Libero" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" msgstr "Non c'è bisogno di specificare che l'applicazione è per Android" #: ../fdroidserver/deploy.py +#, fuzzy msgid "No option set! Edit your config.py to set at least one of these:" -msgstr "" +msgstr "Nessuna opzione impostata! Modifica il tuo config.py per impostare almeno uno di questi:" #: ../fdroidserver/common.py msgid "No packages specified" -msgstr "" +msgstr "Nessun pacchetto specificato" #: ../fdroidserver/install.py #, python-format msgid "No signed apk available for %s" -msgstr "" +msgstr "Nessun apk firmato disponibile per %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" -msgstr "" +msgstr "Nessuna directory di output firmata - niente da fare" #: ../fdroidserver/update.py ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" -msgstr "" +msgstr "Nessun certificato di firma trovato in {path}" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" -msgstr "" +msgstr "Nessun pacchetto di questo tipo: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" -msgstr "" +msgstr "Nessun versionCode di questo tipo {versionCode} per l'app {appid}" #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" -msgstr "" +msgstr "Nessuna directory non firmata - niente da fare" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" -msgstr "" +msgstr "Definizione di dimensione non valida: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" -msgstr "" +msgstr "Niente da fare" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." -msgstr "" +msgstr "Niente da fare per {appid}." #: ../fdroidserver/init.py msgid "Now set these in config.py:" @@ -1276,45 +1282,47 @@ msgstr "Ora imposta i seguenti campi in config.py:" #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" -msgstr "" +msgstr "Il file OBB ha un versionCode più recente ({integer}) di qualsiasi APK:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" -msgstr "" +msgstr "Il nome del file OBB deve iniziare con \"main.\" o \"patch.\":" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" -msgstr "" +msgstr "Il nome del pacchetto di OBB non corrisponde a un APK supportato:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" +msgstr "Macchina offline, saltando la generazione del mirror git fino a quando `fdroid deploy`" #: ../fdroidserver/common.py #, python-brace-format msgid "Old APK signature failed to verify: {path}" -msgstr "" +msgstr "La vecchia firma dell'APK non è stata verificata: {path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Old, deprecated name for fdroid deploy" -msgstr "" +msgstr "Vecchio, nome obsoleto per la distribuzione di fdroid" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" -msgstr "" +msgstr "Solo PNG e JPEG sono supportati per la grafica, trovati: {path}" #: ../fdroidserver/checkupdates.py +#, fuzzy msgid "Only print differences with the Play Store" -msgstr "" +msgstr "Stampa solo le differenze con il Play Store" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" -msgstr "" +msgstr "Elabora solo app con aggiornamenti automatici" #: ../fdroidserver/lint.py +#, fuzzy msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "" +msgstr "I metodi di donazione di OpenCollective appartengono al campo OpenCollective" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -1337,88 +1345,90 @@ msgstr "" #: ../fdroidserver/import.py msgid "Overall license of the project." -msgstr "" +msgstr "Licenza generale del progetto." #: ../fdroidserver/dscanner.py msgid "Override path for repo APKs (default: ./repo)" -msgstr "" +msgstr "Sostituisci il percorso per gli APK del repository (impostazione predefinita: ./repo)" #: ../fdroidserver/index.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "" +msgstr "Sostituzione di versionName vuoto in {apkfilename} dai metadati: {version}" #: ../fdroidserver/import.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Package \"{appid}\" already exists" -msgstr "" +msgstr "Pacchetto \"{appid}\" già esistente" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" -msgstr "" +msgstr "Analisi del manifesto in '{path}'" #: ../fdroidserver/common.py +#, fuzzy msgid "Password required with username" -msgstr "" +msgstr "Password richiesta con nome utente" #: ../fdroidserver/import.py msgid "Path to main Android project subdirectory, if not in root." -msgstr "" +msgstr "Percorso alla sottodirectory principale del progetto Android, se non in root." msgid "Path to main android project subdirectory, if not in root." -msgstr "" +msgstr "Percorso alla sottodirectory principale del progetto Android, se non in root." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" -msgstr "" +msgstr "Percorso per l'SDK Android (a volte impostato in ANDROID_HOME)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" -msgstr "" +msgstr "Percorso del repository git da utilizzare come registro" #: ../fdroidserver/init.py +#, fuzzy msgid "Path to the keystore for the repo signing key" -msgstr "" +msgstr "Percorso del keystore per la chiave di firma del repository" #: ../fdroidserver/dscanner.py msgid "Prepare Drozer to run a scan" -msgstr "" +msgstr "Prepara Drozer per eseguire una scansione" msgid "Prepare drozer to run a scan" msgstr "Preparare drozer per eseguire una scansione" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" -msgstr "" +msgstr "Stampa la variabile segreta sul terminale per un facile copia/incolla" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" -msgstr "" +msgstr "Problema con la descrizione di {appid}: {error}" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" -msgstr "" +msgstr "Problema con xml in '{path}'" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" -msgstr "" +msgstr "Elabora gli aggiornamenti automatici" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" -msgstr "" +msgstr "Elaborazione di {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" -msgstr "" +msgstr "Elaborazione di {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" -msgstr "" +msgstr "Produci XML/JSON leggibili dagli utenti per i file di indice" #: ../fdroidserver/update.py msgid "Produce human-readable index.xml" @@ -1426,20 +1436,20 @@ msgstr "Produci un index.xml leggibile" #: ../fdroidserver/import.py msgid "Project URL to import from." -msgstr "" +msgstr "URL del progetto da cui importare." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" -msgstr "" +msgstr "La punteggiatura dovrebbe essere evitata" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" -msgstr "" +msgstr "Esegui il push del log in questo repository git remoto" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Pushing binary transparency log to {url}" -msgstr "" +msgstr "Invio del log di trasparenza binaria su {url}" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -1457,24 +1467,24 @@ msgstr "Leggi tutti i file di metadata ed esci" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" -msgstr "" +msgstr "Lettura di '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading minSdkVersion failed: \"{apkfilename}\"" -msgstr "" +msgstr "Lettura di minSdkVersion non riuscita: \"{apkfilename}\"" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" -msgstr "" +msgstr "Lettura di packageName/versionCode/ ersionName non riuscita, APK non valido: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" -msgstr "" +msgstr "Lettura di {apkfilename} dalla cache" #: ../fdroidserver/stats.py msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." @@ -2008,7 +2018,7 @@ msgstr "I comandi validi sono:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." -msgstr "" +msgstr "Anziché scaricare di nuovo, verifica con la copia memorizata nella cache locale." #: ../fdroid ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" @@ -2016,7 +2026,7 @@ msgstr "Verifica l'integrità dei pacchetti scaricati" #: ../fdroidserver/index.py msgid "Verifying index signature:" -msgstr "" +msgstr "Verifica della firma dell'indice:" #: ../fdroidserver/deploy.py #, python-brace-format From 09c5ac9db544627ec87161ccaff0dc6ec03037b1 Mon Sep 17 00:00:00 2001 From: WaldiS Date: Wed, 13 Jan 2021 05:41:42 +0100 Subject: [PATCH 0032/2116] Translated using Weblate: Polish (pl) by WaldiS Currently translated at 91.2% (523 of 573 strings) Translated using Weblate: Polish (pl) by WaldiS Currently translated at 90.2% (517 of 573 strings) Translated using Weblate: Polish (pl) by WaldiS Currently translated at 90.0% (516 of 573 strings) Co-authored-by: WaldiS Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ Translation: F-Droid/F-Droid Server --- locale/pl/LC_MESSAGES/fdroidserver.po | 29 +++++++++++++++------------ 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index cc665f9f..18697d17 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -7,15 +7,15 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2020-10-21 18:05+0200\n" -"PO-Revision-Date: 2020-11-20 23:28+0000\n" -"Last-Translator: Michal L \n" +"PO-Revision-Date: 2020-12-29 19:29+0000\n" +"Last-Translator: WaldiS \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.4-dev\n" +"X-Generator: Weblate 4.4.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -26,6 +26,12 @@ msgid "" " tools on https://gitlab.com/fdroid.\n" " " msgstr "" +"\n" +" To jest repozytorium aplikacji, które mają być używane z FDroid. Aplikacje w tym\n" +" repozytorium są oficjalnymi plikami binarnymi utworzonymi przez oryginalnych\n" +" programistów lub są to pliki binarne utworzone ze źródła przez f-droid.org\n" +" przy użyciu narzędzi na https://gitlab.com/fdroid.\n" +" " #: ../fdroidserver/nightly.py msgid "" @@ -391,7 +397,7 @@ msgid "Cannot resolve application ID {appid}" msgstr "Nie można rozpoznać identyfikatora aplikacji {appid}" #: ../fdroidserver/rewritemeta.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Cannot rewrite \"{path}\"" msgstr "Nie można odczytać \"{path}\"" @@ -461,14 +467,12 @@ msgid "Could not find '{command}' on your system" msgstr "Nie można znaleźć '{command}' w twoim systemie" #: ../fdroidserver/import.py -#, fuzzy msgid "Could not find latest version code" msgstr "Nie można znaleźć najnowszej wersji kodu" #: ../fdroidserver/import.py -#, fuzzy msgid "Could not find latest version name" -msgstr "Nie można znaleźć najnowszej wersji nazwy" +msgstr "Nie można odnaleźć nazwy najnowszej wersji" #: ../fdroidserver/update.py #, python-brace-format @@ -486,9 +490,8 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/import.py -#, fuzzy msgid "Couldn't find Application ID" -msgstr "Nie można znaleźć identyfikatora pakietu" +msgstr "Nie można odnaleźć identyfikatora aplikacji" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py @@ -601,7 +604,7 @@ msgstr "Opis długości {length} przekracza limit {limit} char" #: ../fdroidserver/import.py msgid "Do not add 'disable:' to the generated build entries" -msgstr "" +msgstr "Nie dodawaj „wyłącz:” do wygenerowanych wpisów kompilacji" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" @@ -670,7 +673,7 @@ msgstr "Dynamicznie skanuj kompilację postów APK" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" +msgstr "BŁĄD: podkomenda „serwer” została usunięta, użyj polecenia „deploy”!" #: ../fdroidserver/mirror.py msgid "" @@ -786,7 +789,7 @@ msgstr "Pobrane podpisy dla '{apkfilename}' -> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" -msgstr "" +msgstr "Plik zniknął podczas przetwarzania go: {path}" #: ../fdroidserver/verify.py ../fdroidserver/stats.py ../fdroidserver/update.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/build.py @@ -819,7 +822,7 @@ msgstr "Wymuś zatrzymanie kompilacji po {0} upływie limitu czasu!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." -msgstr "" +msgstr "Wymuś skanowanie wyłączonych aplikacji i kompilacji." #: ../fdroidserver/update.py #, python-brace-format From 268746896b5a90ce64c3341bcf634e7be47a6809 Mon Sep 17 00:00:00 2001 From: Francesco Saltori Date: Wed, 13 Jan 2021 05:41:42 +0100 Subject: [PATCH 0033/2116] Translated using Weblate: Italian (it) by Francesco Saltori Currently translated at 60.0% (344 of 573 strings) Co-authored-by: Francesco Saltori Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ Translation: F-Droid/F-Droid Server --- locale/it/LC_MESSAGES/fdroidserver.po | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 9a06608a..fb268b0d 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -7,13 +7,14 @@ # Massimiliano Caniparoli , 2020. # x , 2020. # Hans-Christoph Steiner , 2020. +# Francesco Saltori , 2020. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2020-10-21 18:05+0200\n" -"PO-Revision-Date: 2020-11-30 08:39+0000\n" -"Last-Translator: x \n" +"PO-Revision-Date: 2020-12-01 21:43+0000\n" +"Last-Translator: Francesco Saltori \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" @@ -66,7 +67,7 @@ msgstr "" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" -msgstr "\"%s/\" non ha un file di metadata corrispondente!" +msgstr "\"%s/\" non ha un file di metadati corrispondente!" #: ../fdroidserver/install.py #, python-brace-format @@ -520,7 +521,7 @@ msgstr "Crea una chiave di firma del repository in un keystore" #: ../fdroidserver/update.py msgid "Create skeleton metadata files that are missing" -msgstr "Crea i file scheletro di metadata che mancano" +msgstr "Crea i file di metadati scheletro mancanti" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -569,7 +570,7 @@ msgstr "DEBUG_KEYSTORE non impostato o il valore è incompleto" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "Cancella gli APK e/o OBB senza metadata dal repository" +msgstr "Cancella gli APK e/o OBB senza metadati dal repository" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1462,7 +1463,7 @@ msgstr "Crea velocemente un nuovo repository" #: ../fdroid ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" -msgstr "Leggi tutti i file di metadata ed esci" +msgstr "Leggi tutti i file di metadati ed esci" #: ../fdroidserver/common.py #, python-brace-format @@ -1521,7 +1522,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" -msgstr "Riscrivi tutti i file di metadata" +msgstr "Riscrivi tutti i file di metadati" #: ../fdroidserver/rewritemeta.py msgid "Rewrite to a specific format: " @@ -2035,7 +2036,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" -msgstr "Avvisa riguardo possibili errori metadata" +msgstr "Avvisa riguardo possibili errori nei metadati" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" From f3dea070a713a9e822b7a86a32bf2caddcf05602 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Wed, 13 Jan 2021 05:41:43 +0100 Subject: [PATCH 0034/2116] Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk Currently translated at 100.0% (573 of 573 strings) Co-authored-by: Ihor Hordiichuk Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index e6c4460a..d99bb4b9 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2020-10-21 18:05+0200\n" -"PO-Revision-Date: 2020-10-22 17:26+0000\n" +"PO-Revision-Date: 2020-12-08 12:29+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" "Language: uk\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.3.1\n" +"X-Generator: Weblate 4.4-dev\n" #: ../fdroidserver/common.py msgid "" @@ -2574,7 +2574,7 @@ msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" msgstr[0] "{0} застосунок, {1} alias ключів" msgstr[1] "{0} застосунки, {1} alias ключів" -msgstr[2] "{0} застосунків, {1} {1} alias ключів" +msgstr[2] "{0} застосунків, {1} alias ключів" #: ../fdroidserver/update.py #, python-brace-format From 3b7736df6ca4fe6c562f75e3910f1a8cb626c8dd Mon Sep 17 00:00:00 2001 From: Golubev Alexander Date: Wed, 13 Jan 2021 05:41:43 +0100 Subject: [PATCH 0035/2116] Translated using Weblate: Russian (ru) by Golubev Alexander Currently translated at 100.0% (573 of 573 strings) Translated using Weblate: Russian (ru) by Golubev Alexander Currently translated at 93.8% (538 of 573 strings) Translated using Weblate: Russian (ru) by Golubev Alexander Currently translated at 88.6% (508 of 573 strings) Translated using Weblate: Russian (ru) by Golubev Alexander Currently translated at 87.7% (503 of 573 strings) Translated using Weblate: Russian (ru) by Golubev Alexander Currently translated at 84.8% (486 of 573 strings) Co-authored-by: Golubev Alexander Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translation: F-Droid/F-Droid Server --- locale/ru/LC_MESSAGES/fdroidserver.po | 268 +++++++++++++------------- 1 file changed, 131 insertions(+), 137 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 341611d3..6267c133 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -13,15 +13,15 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2020-10-21 18:05+0200\n" -"PO-Revision-Date: 2020-11-18 17:28+0000\n" -"Last-Translator: Roman \n" +"PO-Revision-Date: 2020-12-23 21:25+0000\n" +"Last-Translator: Golubev Alexander \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.4-dev\n" +"X-Generator: Weblate 4.4.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -32,6 +32,13 @@ msgid "" " tools on https://gitlab.com/fdroid.\n" " " msgstr "" +"\n" +" Это репозиторий приложений, предназначенных для использования в FDroid.\n" +" Приложения в этом репозитории являются либо официальными бинарными файлами,\n" +" созданными разработчиками оригинального приложения, либо бинарными файлами,\n" +" созданными f-droid.org из исходного кода с помощью инструментов\n" +" на https://gitlab.com/fdroid.\n" +" " #: ../fdroidserver/nightly.py msgid "" @@ -39,16 +46,15 @@ msgid "" "SSH Public Key to be used as Deploy Key:" msgstr "" "\n" -"Использовать публичный SSH ключ как ключ для развертывания (Deploy Key):" +"Открытый SSH-ключ, который будет использоваться в качестве ключа развёртывания (Deploy Key):" #: ../fdroidserver/nightly.py -#, fuzzy msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" -"Использовать публичный SSH ключ как ключ для развертывания (Deploy Key):" +"Открытый SSH-ключ, который будет использоваться в качестве ключа развёртывания (Deploy Key):" #: ../fdroidserver/nightly.py #, python-brace-format @@ -65,7 +71,7 @@ msgid "\"%s/\" has no matching metadata file!" msgstr "У \"%s/\" нет соответствующего файла метаданных!" #: ../fdroidserver/install.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "'{apkfilename}' уже установлен на {dev}." @@ -97,7 +103,7 @@ msgstr "формат пути \"{path}\" не принимается, преоб #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" -msgstr "\"{url}\" не действительный URL!" +msgstr "\"{url}\" — не корректный URL!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -152,7 +158,7 @@ msgstr "В config.py нет переменной 'keypass'!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" +msgstr "Значение 'keystore` — NONE, но 'smartcardoptions' не задан!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystore' not found in config.py!" @@ -274,15 +280,15 @@ msgstr "Дополнительно предупреждать о нарушен #: ../fdroidserver/scanner.py msgid "Android AAR library" -msgstr "" +msgstr "AAR-библиотека Android" #: ../fdroidserver/scanner.py msgid "Android APK file" -msgstr "" +msgstr "APK-файл Android" #: ../fdroidserver/scanner.py msgid "Android DEX code" -msgstr "Android DEX код" +msgstr "DEX-код Android" #: ../fdroidserver/common.py ../fdroidserver/build.py #, python-brace-format @@ -393,9 +399,9 @@ msgstr "Неправильно указан путь \"{path}\"!" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Cannot resolve application ID {appid}" -msgstr "Не удалось разобрать app id {appid}" +msgstr "Не удалось разобрать ID приложения: {appid}" #: ../fdroidserver/rewritemeta.py #, python-brace-format @@ -404,7 +410,7 @@ msgstr "Невозможно переписать \"{path}\"" #: ../fdroidserver/rewritemeta.py msgid "Cannot use --list and --to at the same time" -msgstr "Опции --list и --to нельзя использовать одновременно" +msgstr "Параметры --list и --to нельзя использовать одновременно" #: ../fdroidserver/metadata.py #, python-brace-format @@ -460,7 +466,7 @@ msgstr "Сохранить изменения (commit)" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." -msgstr "Противоречивые аргументы: '--verbose' и '--quiet' нельзя указывать одновременно." +msgstr "Несовместимые аргументы: '--verbose' и '--quiet' нельзя указывать одновременно." #: ../fdroidserver/common.py #, python-brace-format @@ -487,7 +493,7 @@ msgstr "Не удалось открыть и проанализировать #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" -msgstr "" +msgstr "Не удалось разобрать размер «{size}», неверный тип «{type}»" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/import.py @@ -572,12 +578,12 @@ msgstr "Удалить из репозитория APK и/или OBB файлы #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "" +msgstr "Удаление архива, репозиторий слишком большой ({size}, максиммум {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "" +msgstr "Удаление истории git-зеркала, репозиторий слишком большой ({size}, максиммум {limit})" #: ../fdroidserver/update.py #, python-brace-format @@ -605,7 +611,7 @@ msgstr "Описание {length} превышает лимит по колич #: ../fdroidserver/import.py msgid "Do not add 'disable:' to the generated build entries" -msgstr "" +msgstr "Не добавлять 'disable:' к сгенерированным данным сборки" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" @@ -674,7 +680,7 @@ msgstr "Сканировать APK файлы после сборки" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" +msgstr "ОШИБКА: подкоманда \"server\" была удалена, используйте \"deploy\"!" #: ../fdroidserver/mirror.py msgid "" @@ -696,7 +702,7 @@ msgstr "У флага сборки в {linedesc} нет значения" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "" +msgstr "Задана кодировка '{enc}'. F-droid может испытывать сложности с кодировками. Пожалуйста, используйте 'UTF-8' во избежании ошибок." #: ../fdroidserver/init.py #, python-format @@ -804,9 +810,8 @@ msgid "Flattr donation methods belong in the FlattrID flag" msgstr "Способы пожертвования с помощью Flattr определяются флагом FlattrID" #: ../fdroidserver/lint.py -#, fuzzy msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Способы пожертвования с помощью Flattr определяются флагом FlattrID" +msgstr "Cсылка на пожертвования через Flattr должна быть в поле «FlattrID:»" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" @@ -822,9 +827,8 @@ msgid "Force halting build after {0} sec timeout!" msgstr "Принудительно останавливать сборку, если тайм-аут больше {0} секунд!" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Force scan of disabled apps and builds." -msgstr "Принудительное сканирование отключенных приложений и сборок." +msgstr "Принудительно сканировать отключенные приложения и сборки." #: ../fdroidserver/update.py #, python-brace-format @@ -832,7 +836,7 @@ msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "В \"{path}\" обнаружены изображения без метаданных для приложения \"{name}\"!" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Обнаружен неверный файл финансирования \"{path}\" для \"{name}\":" @@ -846,9 +850,9 @@ msgid "Found invalid versionCodes for some apps" msgstr "Для некоторых приложений обнаружены неправильные номера внутренней версии (versionCode)" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "В {path} обнаружено несколько сертификатов для подписывания" +msgstr "В {path} обнаружено несколько сертификатов (JAR Signature Block File)" #: ../fdroidserver/metadata.py #, python-brace-format @@ -874,7 +878,7 @@ msgid "Found non-file at %s" msgstr "Это не похоже на файл: %s" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Found {apkfilename} at {url}" msgstr "Найдено {apkfilename} в {url}" @@ -901,9 +905,9 @@ msgid "Git remote set-head failed" msgstr "Не удалось настроить HEAD для удаленного репозитория (git remote set-head)" #: ../fdroidserver/common.py -#, fuzzy, python-format +#, python-format msgid "Git remote set-head failed: \"%s\"" -msgstr "Не удалось настроить HEAD для удаленного репозитория (git remote set-head): \"%s\"" +msgstr "Не удалось настроить HEAD для удалённого репозитория (git remote set-head): \"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" @@ -922,54 +926,53 @@ msgid "HTTPS must be used with Subversion URLs!" msgstr "URL-адреса для Subversion должны начинаться с HTTPS!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "Если git-зеркало станет большим, разрешите удалить архив." +msgstr "Разрешить удаление архива, когда git-зеркало становится слишком большим" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "Если эта загрузка не удалась, попробуйте вручную загрузить в {url}." +msgstr "Если эта загрузка не удалась, попробуйте вручную загрузить на {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "" +msgstr "Проигнорировано: поле '{field}' в метаданных '{metapath}' т.к. оно признано нежелательным (deprecated)." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" -msgstr "" +msgstr "Проигнорировано: запись в FUNDING.yml длиннее 2048 символов: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " -msgstr "Пропустить пакеты без метаданных: " +msgstr "Проигнорировано, пакеты без метаданных: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" -msgstr "Пропустить устаревший кеш для {apkfilename}" +msgstr "Проигнорировано: устаревший кеш для {apkfilename}" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Ignoring {ext} file at '{path}'" -msgstr "Пропустить файл {ext} в '{path}'" +msgstr "Проигнорировано: файл {ext} в '{path}'" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "Разрешить APK, подписанные без использования алгоритмов идентичности (MD5 и т.п.)" +msgstr "Включать APK, подписанные отключёнными алгоритмами, например MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" -msgstr "" +msgstr "Включать PGP-подпись («*.asc» файлы) в зеркало" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" -msgstr "" +msgstr "Включать логи сборки в зеркало" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" -msgstr "" +msgstr "Включать архивы с исходным кодом в зеркало" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -984,9 +987,9 @@ msgid "Install built packages on devices" msgstr "Установить собранные пакеты на устройства" #: ../fdroidserver/install.py -#, fuzzy, python-format +#, python-format msgid "Installing %s..." -msgstr "Установка %s…" +msgstr "Установка %s..." #: ../fdroidserver/install.py #, python-format @@ -994,9 +997,9 @@ msgid "Installing %s…" msgstr "Установка %s…" #: ../fdroidserver/install.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." -msgstr "Установка '{apkfilename}' на устройство {dev}…" +msgstr "Установка '{apkfilename}' на устройство {dev}..." #: ../fdroidserver/install.py #, python-brace-format @@ -1019,7 +1022,7 @@ msgstr "Расхождение версий приложения в метада #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" -msgstr "" +msgstr "Неверный ID приложения: {appid}" #: ../fdroidserver/metadata.py #, python-format @@ -1076,17 +1079,17 @@ msgstr "Неверное перенаправление (не HTTPS): {before} - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" -msgstr "" +msgstr "Некорректные метаданные scrlib: '{file}' не существует" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" -msgstr "" +msgstr "Некорректные метаданные scrlib: не удалось разобрать содержимое '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "" +msgstr "Некорректные метаданные scrlib: не известный ключ '{key}' в '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1105,7 +1108,7 @@ msgstr "Подпись JAR прошла проверку: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" -msgstr "" +msgstr "JAR-файл Java" #: ../fdroidserver/publish.py ../fdroidserver/update.py #: ../fdroidserver/mirror.py @@ -1114,7 +1117,7 @@ msgstr "Не обнаружена Java JDK! Установите её по ст #: ../fdroidserver/scanner.py msgid "Java compiled class" -msgstr "" +msgstr "Скомпилированный класс Java" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" @@ -1129,14 +1132,13 @@ msgid "Keystore for signing key:\t" msgstr "Хранилище ключа для подписывания:→\t" #: ../fdroidserver/lint.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "Последний наложенный коммит '{commit}' похож на метку (tag), но режим проверки обновлений (Update Check Mode) — '{ucm}'" +msgstr "Последний наложенный коммит '{commit}' похож на метку (tag), но режим проверки обновлений (UpdateCheckMode) — '{ucm}'" #: ../fdroidserver/lint.py -#, fuzzy msgid "Liberapay donation methods belong in the Liberapay: field" -msgstr "Способ пожертвования Liberapay определяется с помощью флага LiberapayID" +msgstr "Cсылка на пожертвования через Liberapay должна быть в поле «Liberapay:»" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the LiberapayID flag" @@ -1164,7 +1166,7 @@ msgstr "Неверный путь serverwebroot:" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." -msgstr "" +msgstr "Создать зеркало всего репозитория и архива, включая все типы файлов." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" @@ -1185,7 +1187,7 @@ msgstr "Android SDK не обнаружена!" #: ../fdroidserver/import.py msgid "No android or kivy project could be found. Specify --subdir?" -msgstr "Неверный путь к проекту Android или Kivy. Указать его в опции --subdir?" +msgstr "Проект Android или Kivy не найден. Возможно, нужно указать его в параметре --subdir?" #: ../fdroidserver/install.py msgid "No attached devices found" @@ -1205,9 +1207,8 @@ msgid "No git submodules available" msgstr "Модулей Git не обнаружено" #: ../fdroidserver/import.py -#, fuzzy msgid "No gradle project could be found. Specify --subdir?" -msgstr "Неверный путь к проекту Android или Kivy. Указать его в опции --subdir?" +msgstr "Проект gradle не найден. Возможно, нужно указать его в параметре --subdir?" #: ../fdroidserver/import.py ../fdroidserver/common.py msgid "No information found." @@ -1260,7 +1261,7 @@ msgstr "Директории с неподписанными данными не #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" -msgstr "" +msgstr "Неверное определение размера: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" @@ -1291,7 +1292,7 @@ msgstr "Указанный в OBB файле packagename не соответст #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" +msgstr "Автономная система, пропуск генерации git-зеркала до `fdroid deploy`" #: ../fdroidserver/common.py #, python-brace-format @@ -1316,9 +1317,8 @@ msgid "Only process apps with auto-updates" msgstr "Запустить проверку только для приложений с автоматическим обновлением" #: ../fdroidserver/lint.py -#, fuzzy msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "Способы пожертвования с помощью Flattr определяются флагом FlattrID" +msgstr "Cсылка на пожертвования через OpenCollective должна быть в поле «OpenCollective:»" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -1331,13 +1331,13 @@ msgstr "Вывод отчёта в формате JSON под именем фа #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." -msgstr "" +msgstr "Вывести JSON в stdout." #: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py #: ../fdroidserver/update.py ../fdroidserver/signindex.py #: ../fdroidserver/checkupdates.py msgid "Outputting JSON" -msgstr "" +msgstr "Выводится JSON" #: ../fdroidserver/import.py msgid "Overall license of the project." @@ -1355,7 +1355,7 @@ msgstr "Заменить пустое значение versionName в {apkfilena #: ../fdroidserver/import.py #, python-brace-format msgid "Package \"{appid}\" already exists" -msgstr "" +msgstr "Пакет {appid}\" уже существует" #: ../fdroidserver/common.py #, python-brace-format @@ -1554,7 +1554,7 @@ msgstr "Сканировать только самую свежую версию #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "" +msgstr "Проскандировать получившиеся APK на известные несвободные классы." #: ../fdroid ../fdroidserver/__main__.py msgid "Scan the source code of a package" @@ -1583,7 +1583,7 @@ msgstr "Настроить системное время с помощью:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "" +msgstr "Установить максимальный номер версии релиза в репозитории прежде чем более старые версии будут заархивированы" #: ../fdroidserver/build.py #, python-brace-format @@ -1673,9 +1673,9 @@ msgid "Striping mystery signature from {apkfilename}" msgstr "Удаление неизвестной подписи {apkfilename}" #: ../fdroidserver/nightly.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Stripping mystery signature from {apkfilename}" -msgstr "Удаление неизвестной подписи {apkfilename}" +msgstr "Удаление неизвестной подписи из {apkfilename}" #: ../fdroidserver/lint.py #, python-format @@ -1737,7 +1737,7 @@ msgstr "Есть расхождения в алиасах ключей для п #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." -msgstr "" +msgstr "Это те приложения, которые были заархивированы из основного репозитория." #: ../fdroidserver/import.py #, python-format @@ -1750,7 +1750,7 @@ msgstr "Необходимо определить переменные awsbucket #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" -msgstr "" +msgstr "URL должна начинаться с https:// или http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" @@ -1766,13 +1766,12 @@ msgid "URL {url} in Description: {error}" msgstr "URL-адрес {url} в описании приложения: {error}" #: ../fdroidserver/lint.py -#, fuzzy msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "Неверная метка лицензии: \"%s\". Используйте только метки, перечисленные в https://spdx.org/license-list" +msgstr "Неожиданная метка лицензии: \"{}\"! Используйте только метки, одобренные FSF или OSI из https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "" +msgstr "Неожиданная метка лицензии: \"{}\"! Используйте только метки, указанные в вашем файле настроек" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1800,9 +1799,9 @@ msgid "Unknown metadata format: {path}" msgstr "Неизвестный формат метаданных: {path}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" -msgstr "Неизвестный формат метаданных: {path}" +msgstr "Неизвестный формат метаданных: {path} (используйте *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " @@ -1883,14 +1882,14 @@ msgid "Unused file at %s" msgstr "Файл не ипользуется %s" #: ../fdroidserver/scanner.py -#, fuzzy, python-format +#, python-format msgid "Unused scandelete path: %s" -msgstr "Файл не ипользуется %s" +msgstr "Неиспользованный scandelete-путь: %s" #: ../fdroidserver/scanner.py -#, fuzzy, python-format +#, python-format msgid "Unused scanignore path: %s" -msgstr "Файл не ипользуется %s" +msgstr "Неиспользованный scanignore-путь: %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -1929,24 +1928,22 @@ msgstr "Режим проверки обновлений (Update Check Mode) в #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -#, fuzzy msgid "UpdateCheckName is set to the known application ID - it can be removed" -msgstr "Имя приложения для проверки обновлений (Update Check Name) соответствует app id. Это поле можно удалить" +msgstr "Имя приложения для проверки обновлений (UpdateCheckName) соответствует ID приложения — это поле можно удалить" #: ../fdroidserver/lint.py -#, fuzzy msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "Имя приложения для проверки обновлений (Update Check Name) соответствует app id. Это поле можно удалить" +msgstr "Имя приложения для проверки обновлений (UpdateCheckName) соответствует ID приложения — это поле можно удалить" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" -msgstr "" +msgstr "Загрузка {apkfilename} на androidobservatory.org" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Uploading {apkfilename} to virustotal" -msgstr "Чтение {apkfilename} из кеша" +msgstr "Загрузка {apkfilename} на virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -1985,11 +1982,11 @@ msgstr "Для конфигурации s3cmd используется \"{path}\ #: ../fdroidserver/common.py msgid "Using APK Signature v2" -msgstr "" +msgstr "Используется схема подписи APK v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" -msgstr "" +msgstr "Используется схема подписи APK v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -2029,7 +2026,7 @@ msgstr "Проверка подписи индекса:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "" +msgstr "Через API VirusTotal нельзя загрузить файлы больше 32MB, загрузите {path} на {url} самостоятельно." #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" @@ -2037,11 +2034,11 @@ msgstr "Предупреждать о возможных ошибках в ме #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" -msgstr "Если в конфигурации сборки задано подписывать индексы, опция позволяет вместо этого создавать неподписанные индексы" +msgstr "Даже если в конфигурации сборки задано подписывать индексы, то всё равно cоздавать неподписанные индексы (только на данном этапе)" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "" +msgstr "При проверке целого репозитория, yamllint по умолчанию отключён. Этот параметр принудительно включает yamllint." msgid "X.509 'Distiguished Name' used when generating keys" msgstr "При генерации ключей использовалось различимое имя (Distinguished Name) стандарта X.509" @@ -2056,7 +2053,7 @@ msgstr "Путь к SDK можно указать в переменной ANDROI #: ../fdroidserver/scanner.py msgid "ZIP file archive" -msgstr "" +msgstr "Архив ZIP" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2082,20 +2079,18 @@ msgstr "неоднозначный выбор: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" -msgstr "" +msgstr "apksigner не найден, он необходим для создания подписи!" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "application ID of file to operate on" -msgstr "applicationId для проверки обновлений" +msgstr "ID приложения того файла, с которым будут производится операции" #: ../fdroidserver/verify.py ../fdroidserver/publish.py #: ../fdroidserver/build.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py -#, fuzzy msgid "application ID with optional versionCode in the form APPID[:VERCODE]" -msgstr "applicationId и внутренняя версия приложения (versionCode) в виде APPID[:VERCODE]" +msgstr "ID приложения и внутренняя версия приложения (versionCode) в виде APPID[:VERCODE]" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py msgid "applicationId in the form APPID" @@ -2119,9 +2114,8 @@ msgid "argument \"-\" with mode %r" msgstr "аргумент \"-\" c режимом %r" #: ../fdroidserver/nightly.py -#, fuzzy msgid "attempting bare SSH connection to test deploy key:" -msgstr "попытка установить SSH соединение для проверки ключа развертывания:" +msgstr "попытка установить голое SSH-соединение для проверки ключа развёртывания:" #: ../fdroidserver/nightly.py msgid "attempting bare ssh connection to test deploy key:" @@ -2129,7 +2123,7 @@ msgstr "попытка установить SSH соединение для пр #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" -msgstr "" +msgstr "не удалось разобрать спецификацию scrlib (не является строкой): '{}'" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2138,9 +2132,9 @@ msgid "can't open '%s': %s" msgstr "не получается открыть '%s': %s" #: ../fdroidserver/build.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "cannot find required srclibs: \"{path}\"" -msgstr "По указанному пути {path} не удалось найти appid!" +msgstr "не удалось найти необходимые srclibs: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2168,7 +2162,7 @@ msgstr "выполняемая команда, 'init' или 'update'" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" -msgstr "" +msgstr "Команды из подключаемых модулей:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2192,15 +2186,15 @@ msgstr "копирование {apkfilename} в {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" -msgstr "" +msgstr "не удалось разобрать '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "" +msgstr "не удалось разобрать спецификацию scrlib (не задана ссылка): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" +msgstr "не удалось разобрать спецификацию scrlib (слишком много символов '@'): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2220,17 +2214,17 @@ msgstr "логи сборки загружены в '{path}'" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" -msgstr "" +msgstr "лог {path} загружен на {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "dest= is required for options like %r" -msgstr "для опции %r необходимо указать dest=" +msgstr "для параметра %r необходимо указать dest=" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" -msgstr "" +msgstr "исполняемый бинарный файл, возможно код" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2288,7 +2282,7 @@ msgstr "команда git svn clone не выполнена" #: ../fdroidserver/scanner.py msgid "gzip file archive" -msgstr "" +msgstr "архив gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2327,7 +2321,7 @@ msgstr "неверное значение conflict_resolution: %r" #: /usr/lib/python3.7/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" -msgstr "неверный синтаксис в строке опции %(option)r: она должна начинаться с символа %(prefix_chars)r" +msgstr "неверный синтаксис в строке параметра %(option)r: она должна начинаться с символа %(prefix_chars)r" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2365,7 +2359,7 @@ msgstr "APK файл не указан" #: /usr/lib/python3.7/optparse.py #, python-format msgid "no such option: %s" -msgstr "такой опции нет: %s" +msgstr "такого параметра нет: %s" #: ../fdroid ../fdroidserver/__main__.py msgid "no version info found!" @@ -2390,19 +2384,19 @@ msgstr "принимает строки, списки и туплы" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "опция %s: для того, чтобы установить все подписанные приложения, добавьте --all" +msgstr "параметр %s: если вы действительно хотите установить все подписанные приложения, то используйте --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "option %s: invalid %s value: %r" -msgstr "опция %s: неверное %s значение: %r" +msgstr "параметр %s: неверное %s значение: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "опция %s: неверный выбор: %r (следует выбрать из %s)" +msgstr "параметр %s: неверный выбор: %r (следует выбрать из %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2458,7 +2452,7 @@ msgstr "позиционные аргументы" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" -msgstr "" +msgstr "Не удалось загрузить лог {path} на {dest}!" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2473,11 +2467,11 @@ msgstr "использовать для загрузки небезопасно #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." -msgstr "" +msgstr "значок репозитория (repo_icon) '%s' не существует, генерируется суррогат." #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" +msgstr "ruamel.yaml не установлен, не получается записать метаданные." #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -2486,7 +2480,7 @@ msgstr "s3cmd синхронизировать индексы из {path} в {ur #: ../fdroidserver/scanner.py msgid "shared library" -msgstr "" +msgstr "разделяемая библиотека" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2522,7 +2516,7 @@ msgstr "библиотеки srclib: имя отсутствует или не #: ../fdroidserver/scanner.py msgid "static library" -msgstr "" +msgstr "статическая библиотека" #: ../fdroidserver/common.py #, python-brace-format @@ -2578,7 +2572,7 @@ msgstr "virustotal.com ограничивает траффик, ждем пов #: ../fdroidserver/update.py msgid "wiki support is deprecated and will be removed in the next release!" -msgstr "" +msgstr "поддержка wiki устарела (deprecated) и будет удалена в следующем выпуске!" #: ../fdroidserver/publish.py #, python-brace-format @@ -2604,9 +2598,9 @@ msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "AndroidManifest.xml приложения {apkfilename} содержит неверную дату: " #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{appid} does not have a name! Using application ID instead." -msgstr "У {appid} нет имени! Будет использовано имя пакета." +msgstr "У {appid} нет имени! Будет использовано ID приложения." #: ../fdroidserver/update.py #, python-brace-format @@ -2619,9 +2613,9 @@ msgid "{appid} from {path} is not a valid Android Package Name!" msgstr "{appid} из {path} не годится в качестве имени пакета Android!" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" -msgstr "{appid} из {path} не годится в качестве имени пакета Android!" +msgstr "{appid} из {path} не годится в качестве ID приложения Android!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format @@ -2657,7 +2651,7 @@ msgstr "{appid}: {field} должно быть '{type}', а не '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" -msgstr "" +msgstr "{build_flag} должен быть целым числом, но найдено значение: {value}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2667,7 +2661,7 @@ msgstr "Неверно заполненное поле {field} в {name}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" -msgstr "" +msgstr "{file} пустой или повреждённый!" #: ../fdroidserver/update.py #, python-brace-format @@ -2677,7 +2671,7 @@ msgstr "{name}: неверный путь \"{path}\"! Поправьте его #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" -msgstr "" +msgstr "{path} уже существует, результаты импорта игнорируются!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2697,7 +2691,7 @@ msgstr "размер {path} равен нулю!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" -msgstr "" +msgstr "Размер {path} больше 200MB, загрузите его вручную на {url}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2705,9 +2699,9 @@ msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "Адрес {url} должен заканчиваться на \"fdroid\". Проверьте URL-адрес!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{url} does not start with \"http\"!" -msgstr "Адрес {url} должен заканчиваться на \"fdroid\". Проверьте URL-адрес!" +msgstr "Адрес {url} должен начинаться с \"http\"!" #: ../fdroidserver/build.py msgid "{} build failed" From 84027d6d9433b0e5a9b7e9aa96480c629b58d389 Mon Sep 17 00:00:00 2001 From: A Date: Wed, 13 Jan 2021 05:41:43 +0100 Subject: [PATCH 0036/2116] Added translation using Weblate: Finnish (fi) by A Co-authored-by: A --- locale/fi/LC_MESSAGES/fdroidserver.po | 2685 +++++++++++++++++++++++++ 1 file changed, 2685 insertions(+) create mode 100644 locale/fi/LC_MESSAGES/fdroidserver.po diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po new file mode 100644 index 00000000..87906732 --- /dev/null +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -0,0 +1,2685 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# A , 2020. +msgid "" +msgstr "" +"Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" +"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" +"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: fi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: ../fdroidserver/common.py +msgid "" +"\n" +" This is a repository of apps to be used with FDroid. Applications in this\n" +" repository are either official binaries built by the original application\n" +" developers, or are binaries built from source by f-droid.org using the\n" +" tools on https://gitlab.com/fdroid.\n" +" " +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH Public Key to be used as Deploy Key:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH public key to be used as deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "" +"\n" +"{path} encoded for the DEBUG_KEYSTORE secret variable:" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "\"%s/\" has no matching metadata file!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "\"{apkfilename}\" is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains outdated {name} ({version})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains recent {name} ({version})" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "\"{path}\" exists but s3cmd is not installed!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "\"{path}\" is not an accepted format, convert to: {formats}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "\"{url}\" is not a valid URL!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "%(option)s option requires %(number)d argument" +msgid_plural "%(option)s option requires %(number)d arguments" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/mirror.py +#, python-format +msgid "%(prog)s [options] url" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "%(prog)s: error: %(message)s\n" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "%d problems found" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "%prog [options]" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "%r is not callable" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "%s is not an accepted build field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "%s option does not take a value" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keypass' not found in config.py!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' is NONE and 'smartcardoptions' is blank!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keystore' not found in config.py!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keystorepass' not found in config.py!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.py!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "'required' is an invalid argument for positionals" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in 'config.py'!" +msgstr "" + +#. Translators: "build-tools" is the file name of a package from +#. Google, it is part of the Android SDK. So it probably shouldn't be +#. translated or transliterated. +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-23.0.0 or newer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "'{apkfilename}' is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{field}' in {linedesc} is obsolete, see docs for current fields:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{path}' failed to execute!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "...checkupdate failed for {appid} : {error}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid ".__call__() not defined" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "/issues is missing" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "A URL is required as an argument!" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Add PGP signatures using GnuPG for packages in repo" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Add a new application from its source code" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add a repo signing key to an unsigned repo" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add skeleton metadata files for APKs that are missing them" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Adding new repo for only {name}" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Alias of the repo signing key in the keystore" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Also mirror the full archive section" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Also warn about formatting issues, like rewritemeta -l" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android AAR library" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android APK file" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android DEX code" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/build.py +#, python-brace-format +msgid "Android SDK '{path}' does not have '{dirname}' installed!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Android SDK not found!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' is not a directory!" +msgstr "" + +#. Translators: "build-tools" is the file name of a package from +#. Google, it is part of the Android SDK. So it probably shouldn't be +#. translated or transliterated. +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android build-tools path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/update.py +msgid "AndroidManifest.xml has no date" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "App is in '{repo}' but has a link to {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Appending .git is not necessary" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Archiving {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in srclib '{srclib}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Broken symlink: {path}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Build a package from source" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build all applications available" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Build generated by `fdroid import` - remove disable line once ready" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Build metadata git repo has uncommited changes!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build only the latest version of each package" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "Built repo based in \"%s\" with this config:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Can't build due to {} error while scanning" +msgid_plural "Can't build due to {} errors while scanning" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/vmtools.py +#, python-brace-format +msgid "Cannot read \"{path}\"!" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Cannot resolve application ID {appid}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Cannot rewrite \"{path}\"" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "Cannot use --list and --to at the same time" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Categories '%s' is not valid" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Categories are not set" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Check for updates to applications" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean after all scans have finished" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean before the scans start and rebuild the container" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean up all containers and then exit" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Clean update - don't uses caches, reprocess all APKs" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Comma separated list of categories." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +#, c-format, python-format +msgid "Command '%s' not recognised.\n" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Commit changes" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not find '{command}' on your system" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Could not find latest version code" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Could not find latest version name" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not find {path} to remove it" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Could not open apk file for analysis" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not parse size \"{size}\", wrong type \"{type}\"" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/import.py +msgid "Couldn't find Application ID" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/import.py +msgid "Couldn't find latest version code" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/import.py +msgid "Couldn't find latest version name" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Couldn't find package ID" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Cowardily refusing to overwrite existing signing key setup!" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Create a repo signing key in a keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Create skeleton metadata files that are missing" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Created new container \"{name}\"" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Creating \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating log directory" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Creating new S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating output directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating signed index with this key (SHA256):" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/verify.py +#: ../fdroidserver/publish.py +msgid "Creating temporary directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating unsigned index in preparation for signing" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "DEBUG_KEYSTORE is not set or the value is incomplete" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Delete APKs and/or OBBs without metadata from the repo" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting archive, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Deleting unknown file: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description '%s' is just the app's summary" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Description has a duplicate line" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Description of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Do not add 'disable:' to the generated build entries" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not deploy the new files to the repo" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Do not include \"{path}\" in URL!" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Do not prompt for Android SDK path, just fail" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not remove the private keys generated from the keystore" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't create a source tarball, useful when testing a build" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Don't do anything logs-related" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/nightly.py +#: ../fdroidserver/upload.py +msgid "Don't use rsync checksums" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Download complete mirrors of small repos" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Download logs we don't have" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Downloading the repository already failed once, not trying again." +msgstr "" + +#: ../fdroidserver/verify.py +#, python-brace-format +msgid "Downloading {url} failed. {error}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Duplicate link in '{field}': {url}" +msgstr "" + +#: ../fdroid +msgid "Dynamically scan APKs post build" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "" +"ERROR: this command should never be used to mirror f-droid.org!\n" +"A full mirror of f-droid.org requires more than 200GB." +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "ERROR: unsupported CI type, patches welcome!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Empty build flag at {linedesc}" +msgstr "" + +#: ../fdroidserver/__main__.py +#, python-brace-format +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"Enter the path to the Android SDK (%s) here:\n" +"> " +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py +#: ../fdroidserver/upload.py +#, python-format +msgid "Error while attempting to publish log: %s" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/common.py +msgid "Error while getting repo address" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Extract signatures from APKs" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed copying {path}: {error}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Failed fetching signatures for '{apkfilename}': {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed reading {path}: {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed resizing {path}: {error}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Failed to align application" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Failed to create S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get apk information, deleting {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get apk information, skipping {path}" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Failed to install '{apkfilename}' on {dev}: {error}" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/common.py +msgid "Failed to sign application" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to zipalign application" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Fetched buildserverid from VM: {buildserverid}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "File disappeared while processing it: {path}" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/stats.py ../fdroidserver/update.py +#: ../fdroidserver/rewritemeta.py ../fdroidserver/build.py +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py +msgid "Finished" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID flag" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Forbidden HTML tags" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Force halting build after {0} sec timeout!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Force scan of disabled apps and builds." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found bad funding file \"{path}\" for \"{name}\":" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Found invalid appids in arguments" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +msgid "Found invalid versionCodes for some apps" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Found multiple JAR Signature Block Files in {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Found multiple metadata files for {appid}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found multiple signing certificates for repository." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found multiple signing certificates in {path}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found no signing certificates for repository." +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Found non-file at %s" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Found {apkfilename} at {url}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Generated skeleton metadata for {appid}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git checkout of '%s' failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git clean failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git fetch failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git remote set-head failed" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git remote set-head failed: \"%s\"" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git reset failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule sync failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule update failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "HTTPS must be used with Subversion URLs!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "If a git mirror gets to big, allow the archive to be deleted" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "If this upload fails, try manually uploading to {url}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." +msgstr "" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring FUNDING.yml entry longer than 2048: %s" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Ignoring package without metadata: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Ignoring stale cache data for {apkfilename}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Ignoring {ext} file at '{path}'" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Include APKs that are signed with disabled algorithms like MD5" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the PGP signature .asc files in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the build logs in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the source tarballs in the mirror" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Initialising submodules" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Install all signed applications available" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Install built packages on devices" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s…" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}…" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Interact with the repo HTTP server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Invalid APK" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid VercodeOperation: {field}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid application ID {appid}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid boolean '%s'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid build flag at {line} in {linedesc}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid build format: {value} in {name}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid bulleted list" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid metadata in %s:%d" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Invalid metadata in: " +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Invalid name for published file: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid package name {0}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid redirect to non-HTTPS: {before} -> {after} " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid scrlib metadata: '{file}' does not exist" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: could not parse '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid versionCode: \"{versionCode}\" is not an integer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature failed to verify: {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature verified: {path}" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java JAR file" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#: ../fdroidserver/mirror.py +msgid "Java JDK not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java compiled class" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Javascript in HTML src attributes" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Keystore for signing key:\t" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the Liberapay: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the LiberapayID flag" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Locale included in f-droid.org URL" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Make the build stop on exceptions" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Malformed repository mirrors." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Malformed serverwebroot line:" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Mirror the full repo and archive, all file types." +msgstr "" + +#: ../fdroidserver/gpgsign.py +msgid "Missing output directory" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Name '%s' is just the auto name - remove it" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No 'config.py' found, using defaults." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No Android SDK found!" +msgstr "" + +#: ../fdroidserver/import.py +msgid "No android or kivy project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No attached devices found" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "No commit specified for {versionName} in {linedesc}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "No fingerprint in URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No git submodules available" +msgstr "" + +#: ../fdroidserver/import.py +msgid "No gradle project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/common.py +msgid "No information found." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is Free Software" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is for Android" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "No option set! Edit your config.py to set at least one of these:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No packages specified" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "No signed apk available for %s" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No signed output directory - nothing to do" +msgstr "" + +#: ../fdroidserver/update.py ../fdroidserver/common.py +#, python-brace-format +msgid "No signing certificates found in {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "No such package: %s" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No such versionCode {versionCode} for app {appid}" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +msgid "No unsigned directory - nothing to do" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Not a valid size definition: \"{}\"" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Nothing to do" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Nothing to do for {appid}." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Now set these in config.py:" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "OBB file has newer versionCode({integer}) than any APK:" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB filename must start with \"main.\" or \"patch.\":" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB's packagename does not match a supported APK:" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Old APK signature failed to verify: {path}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Old, deprecated name for fdroid deploy" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Only PNG and JPEG are supported for graphics, found: {path}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only print differences with the Play Store" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only process apps with auto-updates" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "OpenCollective donation methods belong in the OpenCollective: field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "Options" +msgstr "" + +#: ../fdroidserver/verify.py +msgid "Output JSON report to file named after APK." +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Output JSON to stdout." +msgstr "" + +#: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py +#: ../fdroidserver/update.py ../fdroidserver/signindex.py +#: ../fdroidserver/checkupdates.py +msgid "Outputting JSON" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Overall license of the project." +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Override path for repo APKs (default: ./repo)" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" +msgstr "" + +#: ../fdroidserver/import.py +#, python-brace-format +msgid "Package \"{appid}\" already exists" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Parsing manifest at '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Password required with username" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Path to main Android project subdirectory, if not in root." +msgstr "" + +msgid "Path to main android project subdirectory, if not in root." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Path to the git repo to use as the log" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the keystore for the repo signing key" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Prepare Drozer to run a scan" +msgstr "" + +msgid "Prepare drozer to run a scan" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Print the secret variable to the terminal for easy copy/paste" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Problem with description of {appid}: {error}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Problem with xml at '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Process auto-updates" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#, python-brace-format +msgid "Processing {apkfilename}" +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#, python-brace-format +msgid "Processing {appid}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable XML/JSON for index files" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable index.xml" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Project URL to import from." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Punctuation should be avoided" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Push the log to this git remote repository" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Pushing binary transparency log to {url}" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Pushing to {url}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Quickly start a new repository" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Read all the metadata files and exit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading '{config_file}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading minSdkVersion failed: \"{apkfilename}\"" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Reading {apkfilename} from cache" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Removing specified files" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Rename APK files that do not match package.name_123.apk" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Report on build data status" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Resigning {apkfilename} with provided debug.keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Resize all the icons exceeding the max pixel size and exit" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Restrict output to warnings and errors" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Rewrite all the metadata files" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "Rewrite to a specific format: " +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}'" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}' to '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Run on git repo that has uncommitted changes" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Run rewritemeta to fix formatting" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Running first pass with MD5 checking disabled" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Running wget in {path}" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Scan only the latest version of each package" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scan the resulting APK(s) for known non-free classes." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Scan the source code of a package" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:{versionCode}:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scanner found {} problem" +msgid_plural "Scanner found {} problems" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/common.py +msgid "Set clock to that time using:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Set maximum releases in repo before older ones are archived" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Set open file limit to {integer}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Set up an app build for a nightly build repo" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setting open file limit failed: " +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Setting {0} sec timeout for this build" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +msgstr "" + +msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Sign and place packages in the repo" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Sign indexes created using update --nosign" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Skip scanning the source code for binaries and other problems" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping '{apkfilename}' with invalid signature!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping index generation for {appid}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: disabled" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: no builds specified" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Specify a local folder to sync the repo to" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Specify an identity file to provide to SSH for rsyncing" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Specify that we're running on the build server" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Specify which debug keystore file to use." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Spew out even more information than normal" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Striping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Stripping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Summary '%s' is just the app's name" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Summary of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "System clock is older than date in {path}!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "The OBB version code must come after \"{name}.\":" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "The base URL for the repo to log (default: https://f-droid.org)" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "The directory to write the mirror to" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "The file to be included in the repo (path or glob)" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "The only commands currently supported are 'init' and 'update'" +msgstr "" + +#: ../fdroidserver/index.py +msgid "The repository's fingerprint does not match." +msgstr "" + +#: ../fdroidserver/common.py +msgid "The repository's index could not be verified." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "The root dir for local_copy_dir \"{path}\" does not exist!" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "There is a keyalias collision - publishing halted" +msgstr "" + +#: ../fdroidserver/common.py +msgid "These are the apps that have been archived from the main repo." +msgstr "" + +#: ../fdroidserver/import.py +#, python-format +msgid "This repo already has local metadata: %s" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL must start with https:// or http://" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL shorteners should not be used" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "URL title is just the URL, use brackets: [URL]" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "URL {url} in Description: {error}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unexpected text on same line as {field} in {linedesc}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Unknown exception found!" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Unknown file '{filename}' in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Unknown metadata format: %s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path} (use: *.yml)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Unknown version of aapt, might cause problems: " +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary leading space" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary trailing space" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised app field '{fieldname}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unrecognised app field: " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised build flag '{build_flag}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised field '{field}' in {linedesc}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported file type \"{extension}\" for repo graphic" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported graphics file found: {path}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Unsupported metadata format, use: --to [{supported}]" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unterminated ]" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unterminated ]]" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unterminated build in {name}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unterminated continuation in {name}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused extlib at %s" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused file at %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scandelete path: %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scanignore path: %s" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update repo information for new packages" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update the binary transparency log for a URL" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update the stats of the repo" +msgstr "" + +#: ../fdroidserver/update.py ../fdroidserver/build.py +msgid "Update the wiki" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "UpdateCheckData has invalid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must use HTTPS URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData not a valid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID - it can be removed" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID, it can be removed" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to androidobservatory.org" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to virustotal" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "Usage" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "Usage: %s\n" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master to point at a file in the default branch" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use `fdroid update -c` to create it." +msgstr "" + +#: ../fdroidserver/build.py +msgid "Use build server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "" + +msgid "Use date from apk instead of current time for newly added apks" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Using \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v2" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v3" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Using androguard from \"{path}\"" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Using existing keystore \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Using s3cmd to sync with: {url}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Valid commands are:" +msgstr "" + +#: ../fdroidserver/verify.py +msgid "Verify against locally cached copy rather than redownloading." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Verify the integrity of downloaded packages" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Verifying index signature:" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Warn about possible metadata errors" +msgstr "" + +#: ../fdroidserver/update.py +msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgstr "" + +msgid "X.509 'Distiguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/init.py +msgid "X.509 'Distinguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/common.py +msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "ZIP file archive" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "adding IdentityFile to {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "adding to {name}: {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "ambiguous option: %s (%s?)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "apksigner not found, it's required for signing!" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py +#: ../fdroidserver/checkupdates.py +msgid "application ID of file to operate on" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py +msgid "application ID with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py +msgid "applicationId in the form APPID" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "applicationId to check for updates" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +#: ../fdroidserver/dscanner.py ../fdroidserver/build.py +#: ../fdroidserver/scanner.py ../fdroidserver/install.py +msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "argument \"-\" with mode %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare SSH connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare ssh connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "can not parse scrlib spec (not a string): '{}'" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "can't open '%s': %s" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "cannot find required srclibs: \"{path}\"" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "cannot have multiple subparser arguments" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "cannot merge actions - two groups are named %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "cannot publish update, did you set the deploy key?" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "cloning {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "command to execute, either 'init' or 'update'" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "commands from plugin modules:" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "complex" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "conflicting option string: %s" +msgid_plural "conflicting option strings: %s" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "copying {apkfilename} into {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "could not parse '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no ref specified): '{}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (too many '@' signs): '{}'" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "created {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "deleting: repo/{apkfilename}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed build logs to '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed process log {path} to {dest}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "dest= is required for options like %r" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "executable binary, possibly code" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "expected %s argument" +msgid_plural "expected %s arguments" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected at least one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected at most one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected one argument" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "failed deploying build logs to '{path}'" +msgstr "" + +#: ../fdroid +msgid "fdroid [-h|--help|--version] []" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "fdroid [] [-h|--help|--version|]" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "floating-point" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force errors to be warnings, or ignore" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force metadata errors (default) to be warnings, or to be ignored." +msgstr "" + +#: ../fdroidserver/common.py +msgid "git svn clone failed" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "gzip file archive" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "ignored explicit argument %r" +msgstr "" + +#: ../fdroidserver/index.py +msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "integer" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid %(type)s value: %(value)r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid choice: %(value)r (choose from %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid conflict_resolution value: %r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be an absolute path!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be directory, not a file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "mirror '%s' does not end with 'fdroid'!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "mutually exclusive arguments must be optional" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "no \"icon\" in {appid}" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "no APK supplied" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "no such option: %s" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "no version info found!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "not allowed with argument %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "one of the arguments %s is required" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "only accepts strings, lists, and tuples" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "option %s: If you really want to install all the signed apps, use --all" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "option %s: invalid %s value: %r" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "option %s: invalid choice: %r (choose from %s)" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option -%s not recognized" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option -%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s must not have an argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s not a unique prefix" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s not recognized" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "optional arguments" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "overwriting existing {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "positional arguments" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "process log deploy {path} to {dest} failed!" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon %s does not exist, generating placeholder." +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "ruamel.yaml not installed, can not write metadata." +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "s3cmd sync indexes {path} to {url} and delete" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "shared library" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "show program's version number and exit" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py +#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +msgid "show this help message and exit" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "signed APK, either a file-path or HTTPS URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: log content is empty" +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: not enabled in config" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "skipping source tarball: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "srclibs missing name and/or @" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "static library" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "the following arguments are required: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unexpected option string: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unrecognized arguments: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "unsafe permissions on '{config_file}' (should be 0600)!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid +#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +msgid "usage: " +msgstr "" + +#: ../fdroid +msgid "usage: fdroid [-h|--help|--version] []" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "using Apache libcloud to sync with {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "virustotal.com is rate limiting, waiting to retry..." +msgstr "" + +#: ../fdroidserver/update.py +msgid "wiki support is deprecated and will be removed in the next release!" +msgstr "" + +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "{0} app, {1} key aliases" +msgid_plural "{0} apps, {1} key aliases" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} ({appid}) has no metadata!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using application ID instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using package name instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android Package Name!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android application ID!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Java Package Name!" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{appid} is missing {name}" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: Unknown extlib {path} in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "{appid}: no builds specified, running on current source state" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be an integer, found: {value}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{field} not terminated in {name}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{file} is blank or corrupt!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgstr "" + +#: ../fdroidserver/import.py +#, python-brace-format +msgid "{path} already exists, ignoring import results!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "{path} does not exist! Create it by running:" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} is zero size!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} more than 200MB, manually upload: {url}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{url} does not end with \"fdroid\", check the URL path!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{url} does not start with \"http\"!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "{} build failed" +msgid_plural "{} builds failed" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/build.py +msgid "{} build succeeded" +msgid_plural "{} builds succeeded" +msgstr[0] "" +msgstr[1] "" From 305ef53ec9277c51d01ec7ad32163df619247610 Mon Sep 17 00:00:00 2001 From: Eduardo Rodrigues Date: Wed, 13 Jan 2021 05:41:44 +0100 Subject: [PATCH 0037/2116] Translated using Weblate: Spanish (Argentina) (es_AR) by Eduardo Rodrigues Currently translated at 18.3% (105 of 573 strings) Co-authored-by: Eduardo Rodrigues Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es_AR/ Translation: F-Droid/F-Droid Server --- locale/es_AR/LC_MESSAGES/fdroidserver.po | 53 +++++++++++------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index 49b4d592..201f2518 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # Hans-Christoph Steiner , 2020. # riveravaldez , 2020. +# Eduardo Rodrigues , 2020. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2020-10-21 18:05+0200\n" -"PO-Revision-Date: 2020-11-10 16:20+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2020-12-12 06:36+0000\n" +"Last-Translator: Eduardo Rodrigues \n" "Language-Team: Spanish (Argentina) \n" "Language: es_AR\n" "MIME-Version: 1.0\n" @@ -104,7 +105,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" -msgstr "" +msgstr "%(prog)s: error: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format @@ -114,13 +115,13 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "%prog [options]" -msgstr "" +msgstr "%prog [opciones]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "%r is not callable" -msgstr "" +msgstr "no se puede llamar a %r" #: ../fdroidserver/lint.py #, python-format @@ -208,7 +209,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid ".__call__() not defined" -msgstr "" +msgstr ".__call__() no definida" #: ../fdroidserver/metadata.py msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." @@ -623,9 +624,8 @@ msgid "Don't create a source tarball, useful when testing a build" msgstr "No crear el tarbal de codigo fuente, útil cuando se esta probando la construcción" #: ../fdroidserver/stats.py -#, fuzzy msgid "Don't do anything logs-related" -msgstr "No hacer nada que refiera a los registros" +msgstr "No hacer nada que refiera a los registros relacionados" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" @@ -1471,9 +1471,8 @@ msgid "Reading {apkfilename} from cache" msgstr "" #: ../fdroidserver/stats.py -#, fuzzy msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." -msgstr "Recalcular las agregaciones - usar cuando haya cambios" +msgstr "Recalcular agregación de estados - usar cuando se hacen cambios que invalidarían los datos antiguos cacheados." #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1488,9 +1487,8 @@ msgid "Report on build data status" msgstr "Reportar el estado de la construcción" #: ../fdroidserver/build.py -#, fuzzy msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Resetear y crear un nuevo servidor de construcción, incluso si el existente parece estar bien." +msgstr "Restablecer y crear un nuevo servidor de compilación, incluso si el existente parece estar bien." #: ../fdroidserver/nightly.py #, python-brace-format @@ -1644,9 +1642,8 @@ msgid "Specify a local folder to sync the repo to" msgstr "Especificar un directorio local donde sincronizar el repositorio" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, fuzzy msgid "Specify an identity file to provide to SSH for rsyncing" -msgstr "Especifique una archivo de identificación para la resincronización vía SSH" +msgstr "Especifique un fichero de identidad que ofrezca SSH para rsync" #: ../fdroidserver/build.py msgid "Specify that we're running on the build server" @@ -2065,13 +2062,13 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "" +msgstr "opción ambigua: %(option)s podría corresponderse con %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" -msgstr "" +msgstr "opción ambigua: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2130,7 +2127,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "can't open '%s': %s" -msgstr "" +msgstr "no se puede abrir '%s': %s" #: ../fdroidserver/build.py #, python-brace-format @@ -2361,7 +2358,7 @@ msgstr "" #: /usr/lib/python3.7/optparse.py #, python-format msgid "no such option: %s" -msgstr "" +msgstr "no hay tal opción: %s" #: ../fdroid ../fdroidserver/__main__.py #, fuzzy @@ -2411,19 +2408,19 @@ msgstr "No se reconoce el comando \"%s\"" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option -%s requires argument" -msgstr "" +msgstr "opción -%s requiere un argumento" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s must not have an argument" -msgstr "" +msgstr "opción --%s no puede llevar argumento" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s not a unique prefix" -msgstr "" +msgstr "opción --%s no es un prefijo único" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2435,12 +2432,12 @@ msgstr "No se reconoce el comando --\"%s\"" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s requires argument" -msgstr "" +msgstr "opción --%s requiere un argumento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "optional arguments" -msgstr "" +msgstr "argumentos opcionales" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2450,7 +2447,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "positional arguments" -msgstr "" +msgstr "argumentos posicionales" #: ../fdroidserver/common.py #, python-brace-format @@ -2488,13 +2485,13 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "show program's version number and exit" -msgstr "" +msgstr "mostrar el número de versión del programa y salir" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py msgid "show this help message and exit" -msgstr "" +msgstr "mostrar este mensaje de ayuda y salir" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." @@ -2530,7 +2527,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "the following arguments are required: %s" -msgstr "" +msgstr "se requieren los siguientes argumentos: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2558,7 +2555,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py msgid "usage: " -msgstr "" +msgstr "uso: " #: ../fdroid msgid "usage: fdroid [-h|--help|--version] []" From c4131d44296734c82822b6811920160d8d4c126a Mon Sep 17 00:00:00 2001 From: melusine Date: Wed, 13 Jan 2021 05:41:44 +0100 Subject: [PATCH 0038/2116] Translated using Weblate: German (de) by melusine Currently translated at 86.9% (498 of 573 strings) Co-authored-by: melusine Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index a866f5b0..16ef338a 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -10,8 +10,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2020-10-21 18:05+0200\n" -"PO-Revision-Date: 2020-11-10 16:20+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2020-12-14 11:05+0000\n" +"Last-Translator: melusine \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -1084,14 +1084,14 @@ msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "" #: ../fdroidserver/metadata.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" -msgstr "" +msgstr "Ungültige srclib-Metadaten: '{file}' konnte nicht analysiert werden" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "" +msgstr "Ungültige srclib-Metadaten: unbekannter Schlüssel '{key}' in '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1336,7 +1336,7 @@ msgstr "JSON-Bericht in eine nach der APK benannte Datei ausgeben." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." -msgstr "" +msgstr "JSON an stdout ausgeben." #: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py #: ../fdroidserver/update.py ../fdroidserver/signindex.py @@ -1559,7 +1559,7 @@ msgstr "Nur die neueste Version jedes Programmpakets durchsuchen" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "" +msgstr "Scannen Sie die entstandene(n) APK(s) nach bekannten non-free-Klassen." #: ../fdroid ../fdroidserver/__main__.py msgid "Scan the source code of a package" @@ -1741,7 +1741,7 @@ msgstr "Es gibt eine Keyalias-Kollision - Veröffentlichung gestoppt" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." -msgstr "" +msgstr "Dies sind die Apps, die aus dem Hauptrepository archiviert wurden." #: ../fdroidserver/import.py #, python-format @@ -1754,7 +1754,7 @@ msgstr "Um awsbucket zu benutzen, müssen awssecretkey und awsaccesskeyid auch i #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" -msgstr "" +msgstr "Die URL muss mit https:// oder http:// beginnen" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" From 02203ce02e28ca4d76e32262ff33bf46e95756a5 Mon Sep 17 00:00:00 2001 From: THANOS SIOURDAKIS Date: Wed, 13 Jan 2021 05:41:44 +0100 Subject: [PATCH 0039/2116] Added translation using Weblate: Greek (el) by THANOS SIOURDAKIS Co-authored-by: THANOS SIOURDAKIS --- locale/el/LC_MESSAGES/fdroidserver.po | 2685 +++++++++++++++++++++++++ 1 file changed, 2685 insertions(+) create mode 100644 locale/el/LC_MESSAGES/fdroidserver.po diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po new file mode 100644 index 00000000..29bf1c7d --- /dev/null +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -0,0 +1,2685 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# THANOS SIOURDAKIS , 2020. +msgid "" +msgstr "" +"Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" +"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" +"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: el\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: ../fdroidserver/common.py +msgid "" +"\n" +" This is a repository of apps to be used with FDroid. Applications in this\n" +" repository are either official binaries built by the original application\n" +" developers, or are binaries built from source by f-droid.org using the\n" +" tools on https://gitlab.com/fdroid.\n" +" " +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH Public Key to be used as Deploy Key:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH public key to be used as deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "" +"\n" +"{path} encoded for the DEBUG_KEYSTORE secret variable:" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "\"%s/\" has no matching metadata file!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "\"{apkfilename}\" is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains outdated {name} ({version})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains recent {name} ({version})" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "\"{path}\" exists but s3cmd is not installed!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "\"{path}\" is not an accepted format, convert to: {formats}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "\"{url}\" is not a valid URL!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "%(option)s option requires %(number)d argument" +msgid_plural "%(option)s option requires %(number)d arguments" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/mirror.py +#, python-format +msgid "%(prog)s [options] url" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "%(prog)s: error: %(message)s\n" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "%d problems found" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "%prog [options]" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "%r is not callable" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "%s is not an accepted build field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "%s option does not take a value" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keypass' not found in config.py!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' is NONE and 'smartcardoptions' is blank!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keystore' not found in config.py!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keystorepass' not found in config.py!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.py!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "'required' is an invalid argument for positionals" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in 'config.py'!" +msgstr "" + +#. Translators: "build-tools" is the file name of a package from +#. Google, it is part of the Android SDK. So it probably shouldn't be +#. translated or transliterated. +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-23.0.0 or newer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "'{apkfilename}' is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{field}' in {linedesc} is obsolete, see docs for current fields:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{path}' failed to execute!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "...checkupdate failed for {appid} : {error}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid ".__call__() not defined" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "/issues is missing" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "A URL is required as an argument!" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Add PGP signatures using GnuPG for packages in repo" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Add a new application from its source code" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add a repo signing key to an unsigned repo" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add skeleton metadata files for APKs that are missing them" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Adding new repo for only {name}" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Alias of the repo signing key in the keystore" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Also mirror the full archive section" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Also warn about formatting issues, like rewritemeta -l" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android AAR library" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android APK file" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android DEX code" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/build.py +#, python-brace-format +msgid "Android SDK '{path}' does not have '{dirname}' installed!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Android SDK not found!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' is not a directory!" +msgstr "" + +#. Translators: "build-tools" is the file name of a package from +#. Google, it is part of the Android SDK. So it probably shouldn't be +#. translated or transliterated. +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android build-tools path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/update.py +msgid "AndroidManifest.xml has no date" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "App is in '{repo}' but has a link to {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Appending .git is not necessary" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Archiving {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in srclib '{srclib}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Broken symlink: {path}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Build a package from source" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build all applications available" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Build generated by `fdroid import` - remove disable line once ready" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Build metadata git repo has uncommited changes!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build only the latest version of each package" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "Built repo based in \"%s\" with this config:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Can't build due to {} error while scanning" +msgid_plural "Can't build due to {} errors while scanning" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/vmtools.py +#, python-brace-format +msgid "Cannot read \"{path}\"!" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Cannot resolve application ID {appid}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Cannot rewrite \"{path}\"" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "Cannot use --list and --to at the same time" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Categories '%s' is not valid" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Categories are not set" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Check for updates to applications" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean after all scans have finished" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean before the scans start and rebuild the container" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean up all containers and then exit" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Clean update - don't uses caches, reprocess all APKs" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Comma separated list of categories." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +#, c-format, python-format +msgid "Command '%s' not recognised.\n" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Commit changes" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not find '{command}' on your system" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Could not find latest version code" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Could not find latest version name" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not find {path} to remove it" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Could not open apk file for analysis" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not parse size \"{size}\", wrong type \"{type}\"" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/import.py +msgid "Couldn't find Application ID" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/import.py +msgid "Couldn't find latest version code" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/import.py +msgid "Couldn't find latest version name" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Couldn't find package ID" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Cowardily refusing to overwrite existing signing key setup!" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Create a repo signing key in a keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Create skeleton metadata files that are missing" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Created new container \"{name}\"" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Creating \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating log directory" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Creating new S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating output directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating signed index with this key (SHA256):" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/verify.py +#: ../fdroidserver/publish.py +msgid "Creating temporary directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating unsigned index in preparation for signing" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "DEBUG_KEYSTORE is not set or the value is incomplete" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Delete APKs and/or OBBs without metadata from the repo" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting archive, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Deleting unknown file: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description '%s' is just the app's summary" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Description has a duplicate line" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Description of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Do not add 'disable:' to the generated build entries" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not deploy the new files to the repo" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Do not include \"{path}\" in URL!" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Do not prompt for Android SDK path, just fail" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not remove the private keys generated from the keystore" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't create a source tarball, useful when testing a build" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Don't do anything logs-related" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/nightly.py +#: ../fdroidserver/upload.py +msgid "Don't use rsync checksums" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Download complete mirrors of small repos" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Download logs we don't have" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Downloading the repository already failed once, not trying again." +msgstr "" + +#: ../fdroidserver/verify.py +#, python-brace-format +msgid "Downloading {url} failed. {error}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Duplicate link in '{field}': {url}" +msgstr "" + +#: ../fdroid +msgid "Dynamically scan APKs post build" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "" +"ERROR: this command should never be used to mirror f-droid.org!\n" +"A full mirror of f-droid.org requires more than 200GB." +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "ERROR: unsupported CI type, patches welcome!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Empty build flag at {linedesc}" +msgstr "" + +#: ../fdroidserver/__main__.py +#, python-brace-format +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"Enter the path to the Android SDK (%s) here:\n" +"> " +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py +#: ../fdroidserver/upload.py +#, python-format +msgid "Error while attempting to publish log: %s" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/common.py +msgid "Error while getting repo address" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Extract signatures from APKs" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed copying {path}: {error}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Failed fetching signatures for '{apkfilename}': {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed reading {path}: {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed resizing {path}: {error}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Failed to align application" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Failed to create S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get apk information, deleting {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get apk information, skipping {path}" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Failed to install '{apkfilename}' on {dev}: {error}" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/common.py +msgid "Failed to sign application" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to zipalign application" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Fetched buildserverid from VM: {buildserverid}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "File disappeared while processing it: {path}" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/stats.py ../fdroidserver/update.py +#: ../fdroidserver/rewritemeta.py ../fdroidserver/build.py +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py +msgid "Finished" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID flag" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Forbidden HTML tags" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Force halting build after {0} sec timeout!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Force scan of disabled apps and builds." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found bad funding file \"{path}\" for \"{name}\":" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Found invalid appids in arguments" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +msgid "Found invalid versionCodes for some apps" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Found multiple JAR Signature Block Files in {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Found multiple metadata files for {appid}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found multiple signing certificates for repository." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found multiple signing certificates in {path}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found no signing certificates for repository." +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Found non-file at %s" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Found {apkfilename} at {url}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Generated skeleton metadata for {appid}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git checkout of '%s' failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git clean failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git fetch failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git remote set-head failed" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git remote set-head failed: \"%s\"" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git reset failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule sync failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule update failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "HTTPS must be used with Subversion URLs!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "If a git mirror gets to big, allow the archive to be deleted" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "If this upload fails, try manually uploading to {url}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." +msgstr "" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring FUNDING.yml entry longer than 2048: %s" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Ignoring package without metadata: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Ignoring stale cache data for {apkfilename}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Ignoring {ext} file at '{path}'" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Include APKs that are signed with disabled algorithms like MD5" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the PGP signature .asc files in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the build logs in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the source tarballs in the mirror" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Initialising submodules" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Install all signed applications available" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Install built packages on devices" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s…" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}…" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Interact with the repo HTTP server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Invalid APK" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid VercodeOperation: {field}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid application ID {appid}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid boolean '%s'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid build flag at {line} in {linedesc}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid build format: {value} in {name}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid bulleted list" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid metadata in %s:%d" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Invalid metadata in: " +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Invalid name for published file: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid package name {0}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid redirect to non-HTTPS: {before} -> {after} " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid scrlib metadata: '{file}' does not exist" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: could not parse '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid versionCode: \"{versionCode}\" is not an integer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature failed to verify: {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature verified: {path}" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java JAR file" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#: ../fdroidserver/mirror.py +msgid "Java JDK not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java compiled class" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Javascript in HTML src attributes" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Keystore for signing key:\t" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the Liberapay: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the LiberapayID flag" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Locale included in f-droid.org URL" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Make the build stop on exceptions" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Malformed repository mirrors." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Malformed serverwebroot line:" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Mirror the full repo and archive, all file types." +msgstr "" + +#: ../fdroidserver/gpgsign.py +msgid "Missing output directory" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Name '%s' is just the auto name - remove it" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No 'config.py' found, using defaults." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No Android SDK found!" +msgstr "" + +#: ../fdroidserver/import.py +msgid "No android or kivy project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No attached devices found" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "No commit specified for {versionName} in {linedesc}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "No fingerprint in URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No git submodules available" +msgstr "" + +#: ../fdroidserver/import.py +msgid "No gradle project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/common.py +msgid "No information found." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is Free Software" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is for Android" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "No option set! Edit your config.py to set at least one of these:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No packages specified" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "No signed apk available for %s" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No signed output directory - nothing to do" +msgstr "" + +#: ../fdroidserver/update.py ../fdroidserver/common.py +#, python-brace-format +msgid "No signing certificates found in {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "No such package: %s" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No such versionCode {versionCode} for app {appid}" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +msgid "No unsigned directory - nothing to do" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Not a valid size definition: \"{}\"" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Nothing to do" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Nothing to do for {appid}." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Now set these in config.py:" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "OBB file has newer versionCode({integer}) than any APK:" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB filename must start with \"main.\" or \"patch.\":" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB's packagename does not match a supported APK:" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Old APK signature failed to verify: {path}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Old, deprecated name for fdroid deploy" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Only PNG and JPEG are supported for graphics, found: {path}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only print differences with the Play Store" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only process apps with auto-updates" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "OpenCollective donation methods belong in the OpenCollective: field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "Options" +msgstr "" + +#: ../fdroidserver/verify.py +msgid "Output JSON report to file named after APK." +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Output JSON to stdout." +msgstr "" + +#: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py +#: ../fdroidserver/update.py ../fdroidserver/signindex.py +#: ../fdroidserver/checkupdates.py +msgid "Outputting JSON" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Overall license of the project." +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Override path for repo APKs (default: ./repo)" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" +msgstr "" + +#: ../fdroidserver/import.py +#, python-brace-format +msgid "Package \"{appid}\" already exists" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Parsing manifest at '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Password required with username" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Path to main Android project subdirectory, if not in root." +msgstr "" + +msgid "Path to main android project subdirectory, if not in root." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Path to the git repo to use as the log" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the keystore for the repo signing key" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Prepare Drozer to run a scan" +msgstr "" + +msgid "Prepare drozer to run a scan" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Print the secret variable to the terminal for easy copy/paste" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Problem with description of {appid}: {error}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Problem with xml at '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Process auto-updates" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#, python-brace-format +msgid "Processing {apkfilename}" +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#, python-brace-format +msgid "Processing {appid}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable XML/JSON for index files" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable index.xml" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Project URL to import from." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Punctuation should be avoided" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Push the log to this git remote repository" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Pushing binary transparency log to {url}" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Pushing to {url}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Quickly start a new repository" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Read all the metadata files and exit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading '{config_file}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading minSdkVersion failed: \"{apkfilename}\"" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Reading {apkfilename} from cache" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Removing specified files" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Rename APK files that do not match package.name_123.apk" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Report on build data status" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Resigning {apkfilename} with provided debug.keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Resize all the icons exceeding the max pixel size and exit" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Restrict output to warnings and errors" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Rewrite all the metadata files" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "Rewrite to a specific format: " +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}'" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}' to '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Run on git repo that has uncommitted changes" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Run rewritemeta to fix formatting" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Running first pass with MD5 checking disabled" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Running wget in {path}" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Scan only the latest version of each package" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scan the resulting APK(s) for known non-free classes." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Scan the source code of a package" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:{versionCode}:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scanner found {} problem" +msgid_plural "Scanner found {} problems" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/common.py +msgid "Set clock to that time using:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Set maximum releases in repo before older ones are archived" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Set open file limit to {integer}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Set up an app build for a nightly build repo" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setting open file limit failed: " +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Setting {0} sec timeout for this build" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +msgstr "" + +msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Sign and place packages in the repo" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Sign indexes created using update --nosign" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Skip scanning the source code for binaries and other problems" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping '{apkfilename}' with invalid signature!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping index generation for {appid}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: disabled" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: no builds specified" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Specify a local folder to sync the repo to" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Specify an identity file to provide to SSH for rsyncing" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Specify that we're running on the build server" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Specify which debug keystore file to use." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Spew out even more information than normal" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Striping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Stripping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Summary '%s' is just the app's name" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Summary of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "System clock is older than date in {path}!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "The OBB version code must come after \"{name}.\":" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "The base URL for the repo to log (default: https://f-droid.org)" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "The directory to write the mirror to" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "The file to be included in the repo (path or glob)" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "The only commands currently supported are 'init' and 'update'" +msgstr "" + +#: ../fdroidserver/index.py +msgid "The repository's fingerprint does not match." +msgstr "" + +#: ../fdroidserver/common.py +msgid "The repository's index could not be verified." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "The root dir for local_copy_dir \"{path}\" does not exist!" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "There is a keyalias collision - publishing halted" +msgstr "" + +#: ../fdroidserver/common.py +msgid "These are the apps that have been archived from the main repo." +msgstr "" + +#: ../fdroidserver/import.py +#, python-format +msgid "This repo already has local metadata: %s" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL must start with https:// or http://" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL shorteners should not be used" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "URL title is just the URL, use brackets: [URL]" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "URL {url} in Description: {error}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unexpected text on same line as {field} in {linedesc}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Unknown exception found!" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Unknown file '{filename}' in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Unknown metadata format: %s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path} (use: *.yml)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Unknown version of aapt, might cause problems: " +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary leading space" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary trailing space" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised app field '{fieldname}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unrecognised app field: " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised build flag '{build_flag}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised field '{field}' in {linedesc}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported file type \"{extension}\" for repo graphic" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported graphics file found: {path}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Unsupported metadata format, use: --to [{supported}]" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unterminated ]" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unterminated ]]" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unterminated build in {name}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unterminated continuation in {name}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused extlib at %s" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused file at %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scandelete path: %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scanignore path: %s" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update repo information for new packages" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update the binary transparency log for a URL" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update the stats of the repo" +msgstr "" + +#: ../fdroidserver/update.py ../fdroidserver/build.py +msgid "Update the wiki" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "UpdateCheckData has invalid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must use HTTPS URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData not a valid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID - it can be removed" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID, it can be removed" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to androidobservatory.org" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to virustotal" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "Usage" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "Usage: %s\n" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master to point at a file in the default branch" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use `fdroid update -c` to create it." +msgstr "" + +#: ../fdroidserver/build.py +msgid "Use build server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "" + +msgid "Use date from apk instead of current time for newly added apks" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Using \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v2" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v3" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Using androguard from \"{path}\"" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Using existing keystore \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Using s3cmd to sync with: {url}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Valid commands are:" +msgstr "" + +#: ../fdroidserver/verify.py +msgid "Verify against locally cached copy rather than redownloading." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Verify the integrity of downloaded packages" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Verifying index signature:" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Warn about possible metadata errors" +msgstr "" + +#: ../fdroidserver/update.py +msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgstr "" + +msgid "X.509 'Distiguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/init.py +msgid "X.509 'Distinguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/common.py +msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "ZIP file archive" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "adding IdentityFile to {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "adding to {name}: {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "ambiguous option: %s (%s?)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "apksigner not found, it's required for signing!" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py +#: ../fdroidserver/checkupdates.py +msgid "application ID of file to operate on" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py +msgid "application ID with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py +msgid "applicationId in the form APPID" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "applicationId to check for updates" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +#: ../fdroidserver/dscanner.py ../fdroidserver/build.py +#: ../fdroidserver/scanner.py ../fdroidserver/install.py +msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "argument \"-\" with mode %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare SSH connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare ssh connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "can not parse scrlib spec (not a string): '{}'" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "can't open '%s': %s" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "cannot find required srclibs: \"{path}\"" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "cannot have multiple subparser arguments" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "cannot merge actions - two groups are named %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "cannot publish update, did you set the deploy key?" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "cloning {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "command to execute, either 'init' or 'update'" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "commands from plugin modules:" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "complex" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "conflicting option string: %s" +msgid_plural "conflicting option strings: %s" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "copying {apkfilename} into {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "could not parse '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no ref specified): '{}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (too many '@' signs): '{}'" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "created {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "deleting: repo/{apkfilename}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed build logs to '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed process log {path} to {dest}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "dest= is required for options like %r" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "executable binary, possibly code" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "expected %s argument" +msgid_plural "expected %s arguments" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected at least one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected at most one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected one argument" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "failed deploying build logs to '{path}'" +msgstr "" + +#: ../fdroid +msgid "fdroid [-h|--help|--version] []" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "fdroid [] [-h|--help|--version|]" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "floating-point" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force errors to be warnings, or ignore" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force metadata errors (default) to be warnings, or to be ignored." +msgstr "" + +#: ../fdroidserver/common.py +msgid "git svn clone failed" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "gzip file archive" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "ignored explicit argument %r" +msgstr "" + +#: ../fdroidserver/index.py +msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "integer" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid %(type)s value: %(value)r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid choice: %(value)r (choose from %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid conflict_resolution value: %r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be an absolute path!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be directory, not a file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "mirror '%s' does not end with 'fdroid'!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "mutually exclusive arguments must be optional" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "no \"icon\" in {appid}" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "no APK supplied" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "no such option: %s" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "no version info found!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "not allowed with argument %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "one of the arguments %s is required" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "only accepts strings, lists, and tuples" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "option %s: If you really want to install all the signed apps, use --all" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "option %s: invalid %s value: %r" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "option %s: invalid choice: %r (choose from %s)" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option -%s not recognized" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option -%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s must not have an argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s not a unique prefix" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s not recognized" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "optional arguments" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "overwriting existing {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "positional arguments" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "process log deploy {path} to {dest} failed!" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon %s does not exist, generating placeholder." +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "ruamel.yaml not installed, can not write metadata." +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "s3cmd sync indexes {path} to {url} and delete" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "shared library" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "show program's version number and exit" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py +#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +msgid "show this help message and exit" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "signed APK, either a file-path or HTTPS URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: log content is empty" +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: not enabled in config" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "skipping source tarball: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "srclibs missing name and/or @" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "static library" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "the following arguments are required: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unexpected option string: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unrecognized arguments: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "unsafe permissions on '{config_file}' (should be 0600)!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid +#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +msgid "usage: " +msgstr "" + +#: ../fdroid +msgid "usage: fdroid [-h|--help|--version] []" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "using Apache libcloud to sync with {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "virustotal.com is rate limiting, waiting to retry..." +msgstr "" + +#: ../fdroidserver/update.py +msgid "wiki support is deprecated and will be removed in the next release!" +msgstr "" + +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "{0} app, {1} key aliases" +msgid_plural "{0} apps, {1} key aliases" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} ({appid}) has no metadata!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using application ID instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using package name instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android Package Name!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android application ID!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Java Package Name!" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{appid} is missing {name}" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: Unknown extlib {path} in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "{appid}: no builds specified, running on current source state" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be an integer, found: {value}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{field} not terminated in {name}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{file} is blank or corrupt!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgstr "" + +#: ../fdroidserver/import.py +#, python-brace-format +msgid "{path} already exists, ignoring import results!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "{path} does not exist! Create it by running:" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} is zero size!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} more than 200MB, manually upload: {url}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{url} does not end with \"fdroid\", check the URL path!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{url} does not start with \"http\"!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "{} build failed" +msgid_plural "{} builds failed" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/build.py +msgid "{} build succeeded" +msgid_plural "{} builds succeeded" +msgstr[0] "" +msgstr[1] "" From 984f827eb3e9cb0aca408300c562e3c9700f4e98 Mon Sep 17 00:00:00 2001 From: Gontzal Manuel Pujana Onaindia Date: Wed, 13 Jan 2021 05:41:45 +0100 Subject: [PATCH 0040/2116] Added translation using Weblate: Basque (eu) by Gontzal Manuel Pujana Onaindia Co-authored-by: Gontzal Manuel Pujana Onaindia --- locale/eu/LC_MESSAGES/fdroidserver.po | 2685 +++++++++++++++++++++++++ 1 file changed, 2685 insertions(+) create mode 100644 locale/eu/LC_MESSAGES/fdroidserver.po diff --git a/locale/eu/LC_MESSAGES/fdroidserver.po b/locale/eu/LC_MESSAGES/fdroidserver.po new file mode 100644 index 00000000..d1b2ef99 --- /dev/null +++ b/locale/eu/LC_MESSAGES/fdroidserver.po @@ -0,0 +1,2685 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# Gontzal Manuel Pujana Onaindia , 2020. +msgid "" +msgstr "" +"Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" +"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" +"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: eu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: ../fdroidserver/common.py +msgid "" +"\n" +" This is a repository of apps to be used with FDroid. Applications in this\n" +" repository are either official binaries built by the original application\n" +" developers, or are binaries built from source by f-droid.org using the\n" +" tools on https://gitlab.com/fdroid.\n" +" " +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH Public Key to be used as Deploy Key:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH public key to be used as deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "" +"\n" +"{path} encoded for the DEBUG_KEYSTORE secret variable:" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "\"%s/\" has no matching metadata file!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "\"{apkfilename}\" is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains outdated {name} ({version})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains recent {name} ({version})" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "\"{path}\" exists but s3cmd is not installed!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "\"{path}\" is not an accepted format, convert to: {formats}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "\"{url}\" is not a valid URL!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "%(option)s option requires %(number)d argument" +msgid_plural "%(option)s option requires %(number)d arguments" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/mirror.py +#, python-format +msgid "%(prog)s [options] url" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "%(prog)s: error: %(message)s\n" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "%d problems found" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "%prog [options]" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "%r is not callable" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "%s is not an accepted build field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "%s option does not take a value" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keypass' not found in config.py!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' is NONE and 'smartcardoptions' is blank!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keystore' not found in config.py!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keystorepass' not found in config.py!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.py!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "'required' is an invalid argument for positionals" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in 'config.py'!" +msgstr "" + +#. Translators: "build-tools" is the file name of a package from +#. Google, it is part of the Android SDK. So it probably shouldn't be +#. translated or transliterated. +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-23.0.0 or newer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "'{apkfilename}' is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{field}' in {linedesc} is obsolete, see docs for current fields:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{path}' failed to execute!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "...checkupdate failed for {appid} : {error}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid ".__call__() not defined" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "/issues is missing" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "A URL is required as an argument!" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Add PGP signatures using GnuPG for packages in repo" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Add a new application from its source code" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add a repo signing key to an unsigned repo" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add skeleton metadata files for APKs that are missing them" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Adding new repo for only {name}" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Alias of the repo signing key in the keystore" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Also mirror the full archive section" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Also warn about formatting issues, like rewritemeta -l" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android AAR library" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android APK file" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android DEX code" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/build.py +#, python-brace-format +msgid "Android SDK '{path}' does not have '{dirname}' installed!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Android SDK not found!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' is not a directory!" +msgstr "" + +#. Translators: "build-tools" is the file name of a package from +#. Google, it is part of the Android SDK. So it probably shouldn't be +#. translated or transliterated. +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android build-tools path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/update.py +msgid "AndroidManifest.xml has no date" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "App is in '{repo}' but has a link to {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Appending .git is not necessary" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Archiving {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in srclib '{srclib}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Broken symlink: {path}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Build a package from source" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build all applications available" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Build generated by `fdroid import` - remove disable line once ready" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Build metadata git repo has uncommited changes!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build only the latest version of each package" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "Built repo based in \"%s\" with this config:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Can't build due to {} error while scanning" +msgid_plural "Can't build due to {} errors while scanning" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/vmtools.py +#, python-brace-format +msgid "Cannot read \"{path}\"!" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Cannot resolve application ID {appid}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Cannot rewrite \"{path}\"" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "Cannot use --list and --to at the same time" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Categories '%s' is not valid" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Categories are not set" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Check for updates to applications" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean after all scans have finished" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean before the scans start and rebuild the container" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean up all containers and then exit" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Clean update - don't uses caches, reprocess all APKs" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Comma separated list of categories." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +#, c-format, python-format +msgid "Command '%s' not recognised.\n" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Commit changes" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not find '{command}' on your system" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Could not find latest version code" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Could not find latest version name" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not find {path} to remove it" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Could not open apk file for analysis" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not parse size \"{size}\", wrong type \"{type}\"" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/import.py +msgid "Couldn't find Application ID" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/import.py +msgid "Couldn't find latest version code" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/import.py +msgid "Couldn't find latest version name" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Couldn't find package ID" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Cowardily refusing to overwrite existing signing key setup!" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Create a repo signing key in a keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Create skeleton metadata files that are missing" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Created new container \"{name}\"" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Creating \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating log directory" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Creating new S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating output directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating signed index with this key (SHA256):" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/verify.py +#: ../fdroidserver/publish.py +msgid "Creating temporary directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating unsigned index in preparation for signing" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "DEBUG_KEYSTORE is not set or the value is incomplete" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Delete APKs and/or OBBs without metadata from the repo" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting archive, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Deleting unknown file: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description '%s' is just the app's summary" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Description has a duplicate line" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Description of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Do not add 'disable:' to the generated build entries" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not deploy the new files to the repo" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Do not include \"{path}\" in URL!" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Do not prompt for Android SDK path, just fail" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not remove the private keys generated from the keystore" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't create a source tarball, useful when testing a build" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Don't do anything logs-related" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/nightly.py +#: ../fdroidserver/upload.py +msgid "Don't use rsync checksums" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Download complete mirrors of small repos" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Download logs we don't have" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Downloading the repository already failed once, not trying again." +msgstr "" + +#: ../fdroidserver/verify.py +#, python-brace-format +msgid "Downloading {url} failed. {error}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Duplicate link in '{field}': {url}" +msgstr "" + +#: ../fdroid +msgid "Dynamically scan APKs post build" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "" +"ERROR: this command should never be used to mirror f-droid.org!\n" +"A full mirror of f-droid.org requires more than 200GB." +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "ERROR: unsupported CI type, patches welcome!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Empty build flag at {linedesc}" +msgstr "" + +#: ../fdroidserver/__main__.py +#, python-brace-format +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"Enter the path to the Android SDK (%s) here:\n" +"> " +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py +#: ../fdroidserver/upload.py +#, python-format +msgid "Error while attempting to publish log: %s" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/common.py +msgid "Error while getting repo address" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Extract signatures from APKs" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed copying {path}: {error}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Failed fetching signatures for '{apkfilename}': {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed reading {path}: {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed resizing {path}: {error}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Failed to align application" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Failed to create S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get apk information, deleting {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get apk information, skipping {path}" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Failed to install '{apkfilename}' on {dev}: {error}" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/common.py +msgid "Failed to sign application" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to zipalign application" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Fetched buildserverid from VM: {buildserverid}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "File disappeared while processing it: {path}" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/stats.py ../fdroidserver/update.py +#: ../fdroidserver/rewritemeta.py ../fdroidserver/build.py +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py +msgid "Finished" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID flag" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Forbidden HTML tags" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Force halting build after {0} sec timeout!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Force scan of disabled apps and builds." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found bad funding file \"{path}\" for \"{name}\":" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Found invalid appids in arguments" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +msgid "Found invalid versionCodes for some apps" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Found multiple JAR Signature Block Files in {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Found multiple metadata files for {appid}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found multiple signing certificates for repository." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found multiple signing certificates in {path}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found no signing certificates for repository." +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Found non-file at %s" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Found {apkfilename} at {url}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Generated skeleton metadata for {appid}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git checkout of '%s' failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git clean failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git fetch failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git remote set-head failed" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git remote set-head failed: \"%s\"" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git reset failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule sync failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule update failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "HTTPS must be used with Subversion URLs!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "If a git mirror gets to big, allow the archive to be deleted" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "If this upload fails, try manually uploading to {url}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." +msgstr "" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring FUNDING.yml entry longer than 2048: %s" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Ignoring package without metadata: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Ignoring stale cache data for {apkfilename}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Ignoring {ext} file at '{path}'" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Include APKs that are signed with disabled algorithms like MD5" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the PGP signature .asc files in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the build logs in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the source tarballs in the mirror" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Initialising submodules" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Install all signed applications available" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Install built packages on devices" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s…" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}…" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Interact with the repo HTTP server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Invalid APK" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid VercodeOperation: {field}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid application ID {appid}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid boolean '%s'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid build flag at {line} in {linedesc}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid build format: {value} in {name}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid bulleted list" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid metadata in %s:%d" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Invalid metadata in: " +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Invalid name for published file: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid package name {0}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid redirect to non-HTTPS: {before} -> {after} " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid scrlib metadata: '{file}' does not exist" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: could not parse '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid versionCode: \"{versionCode}\" is not an integer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature failed to verify: {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature verified: {path}" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java JAR file" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#: ../fdroidserver/mirror.py +msgid "Java JDK not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java compiled class" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Javascript in HTML src attributes" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Keystore for signing key:\t" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the Liberapay: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the LiberapayID flag" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Locale included in f-droid.org URL" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Make the build stop on exceptions" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Malformed repository mirrors." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Malformed serverwebroot line:" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Mirror the full repo and archive, all file types." +msgstr "" + +#: ../fdroidserver/gpgsign.py +msgid "Missing output directory" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Name '%s' is just the auto name - remove it" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No 'config.py' found, using defaults." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No Android SDK found!" +msgstr "" + +#: ../fdroidserver/import.py +msgid "No android or kivy project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No attached devices found" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "No commit specified for {versionName} in {linedesc}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "No fingerprint in URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No git submodules available" +msgstr "" + +#: ../fdroidserver/import.py +msgid "No gradle project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/common.py +msgid "No information found." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is Free Software" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is for Android" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "No option set! Edit your config.py to set at least one of these:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No packages specified" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "No signed apk available for %s" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No signed output directory - nothing to do" +msgstr "" + +#: ../fdroidserver/update.py ../fdroidserver/common.py +#, python-brace-format +msgid "No signing certificates found in {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "No such package: %s" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No such versionCode {versionCode} for app {appid}" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +msgid "No unsigned directory - nothing to do" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Not a valid size definition: \"{}\"" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Nothing to do" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Nothing to do for {appid}." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Now set these in config.py:" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "OBB file has newer versionCode({integer}) than any APK:" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB filename must start with \"main.\" or \"patch.\":" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB's packagename does not match a supported APK:" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Old APK signature failed to verify: {path}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Old, deprecated name for fdroid deploy" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Only PNG and JPEG are supported for graphics, found: {path}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only print differences with the Play Store" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only process apps with auto-updates" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "OpenCollective donation methods belong in the OpenCollective: field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "Options" +msgstr "" + +#: ../fdroidserver/verify.py +msgid "Output JSON report to file named after APK." +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Output JSON to stdout." +msgstr "" + +#: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py +#: ../fdroidserver/update.py ../fdroidserver/signindex.py +#: ../fdroidserver/checkupdates.py +msgid "Outputting JSON" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Overall license of the project." +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Override path for repo APKs (default: ./repo)" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" +msgstr "" + +#: ../fdroidserver/import.py +#, python-brace-format +msgid "Package \"{appid}\" already exists" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Parsing manifest at '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Password required with username" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Path to main Android project subdirectory, if not in root." +msgstr "" + +msgid "Path to main android project subdirectory, if not in root." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Path to the git repo to use as the log" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the keystore for the repo signing key" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Prepare Drozer to run a scan" +msgstr "" + +msgid "Prepare drozer to run a scan" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Print the secret variable to the terminal for easy copy/paste" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Problem with description of {appid}: {error}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Problem with xml at '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Process auto-updates" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#, python-brace-format +msgid "Processing {apkfilename}" +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#, python-brace-format +msgid "Processing {appid}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable XML/JSON for index files" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable index.xml" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Project URL to import from." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Punctuation should be avoided" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Push the log to this git remote repository" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Pushing binary transparency log to {url}" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Pushing to {url}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Quickly start a new repository" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Read all the metadata files and exit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading '{config_file}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading minSdkVersion failed: \"{apkfilename}\"" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Reading {apkfilename} from cache" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Removing specified files" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Rename APK files that do not match package.name_123.apk" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Report on build data status" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Resigning {apkfilename} with provided debug.keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Resize all the icons exceeding the max pixel size and exit" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Restrict output to warnings and errors" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Rewrite all the metadata files" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "Rewrite to a specific format: " +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}'" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}' to '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Run on git repo that has uncommitted changes" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Run rewritemeta to fix formatting" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Running first pass with MD5 checking disabled" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Running wget in {path}" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Scan only the latest version of each package" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scan the resulting APK(s) for known non-free classes." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Scan the source code of a package" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:{versionCode}:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scanner found {} problem" +msgid_plural "Scanner found {} problems" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/common.py +msgid "Set clock to that time using:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Set maximum releases in repo before older ones are archived" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Set open file limit to {integer}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Set up an app build for a nightly build repo" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setting open file limit failed: " +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Setting {0} sec timeout for this build" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +msgstr "" + +msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Sign and place packages in the repo" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Sign indexes created using update --nosign" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Skip scanning the source code for binaries and other problems" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping '{apkfilename}' with invalid signature!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping index generation for {appid}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: disabled" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: no builds specified" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Specify a local folder to sync the repo to" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Specify an identity file to provide to SSH for rsyncing" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Specify that we're running on the build server" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Specify which debug keystore file to use." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Spew out even more information than normal" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Striping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Stripping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Summary '%s' is just the app's name" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Summary of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "System clock is older than date in {path}!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "The OBB version code must come after \"{name}.\":" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "The base URL for the repo to log (default: https://f-droid.org)" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "The directory to write the mirror to" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "The file to be included in the repo (path or glob)" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "The only commands currently supported are 'init' and 'update'" +msgstr "" + +#: ../fdroidserver/index.py +msgid "The repository's fingerprint does not match." +msgstr "" + +#: ../fdroidserver/common.py +msgid "The repository's index could not be verified." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "The root dir for local_copy_dir \"{path}\" does not exist!" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "There is a keyalias collision - publishing halted" +msgstr "" + +#: ../fdroidserver/common.py +msgid "These are the apps that have been archived from the main repo." +msgstr "" + +#: ../fdroidserver/import.py +#, python-format +msgid "This repo already has local metadata: %s" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL must start with https:// or http://" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL shorteners should not be used" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "URL title is just the URL, use brackets: [URL]" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "URL {url} in Description: {error}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unexpected text on same line as {field} in {linedesc}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Unknown exception found!" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Unknown file '{filename}' in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Unknown metadata format: %s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path} (use: *.yml)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Unknown version of aapt, might cause problems: " +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary leading space" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary trailing space" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised app field '{fieldname}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unrecognised app field: " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised build flag '{build_flag}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised field '{field}' in {linedesc}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported file type \"{extension}\" for repo graphic" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported graphics file found: {path}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Unsupported metadata format, use: --to [{supported}]" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unterminated ]" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unterminated ]]" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unterminated build in {name}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unterminated continuation in {name}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused extlib at %s" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused file at %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scandelete path: %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scanignore path: %s" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update repo information for new packages" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update the binary transparency log for a URL" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update the stats of the repo" +msgstr "" + +#: ../fdroidserver/update.py ../fdroidserver/build.py +msgid "Update the wiki" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "UpdateCheckData has invalid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must use HTTPS URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData not a valid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID - it can be removed" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID, it can be removed" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to androidobservatory.org" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to virustotal" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "Usage" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "Usage: %s\n" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master to point at a file in the default branch" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use `fdroid update -c` to create it." +msgstr "" + +#: ../fdroidserver/build.py +msgid "Use build server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "" + +msgid "Use date from apk instead of current time for newly added apks" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Using \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v2" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v3" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Using androguard from \"{path}\"" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Using existing keystore \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Using s3cmd to sync with: {url}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Valid commands are:" +msgstr "" + +#: ../fdroidserver/verify.py +msgid "Verify against locally cached copy rather than redownloading." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Verify the integrity of downloaded packages" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Verifying index signature:" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Warn about possible metadata errors" +msgstr "" + +#: ../fdroidserver/update.py +msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgstr "" + +msgid "X.509 'Distiguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/init.py +msgid "X.509 'Distinguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/common.py +msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "ZIP file archive" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "adding IdentityFile to {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "adding to {name}: {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "ambiguous option: %s (%s?)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "apksigner not found, it's required for signing!" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py +#: ../fdroidserver/checkupdates.py +msgid "application ID of file to operate on" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py +msgid "application ID with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py +msgid "applicationId in the form APPID" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "applicationId to check for updates" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +#: ../fdroidserver/dscanner.py ../fdroidserver/build.py +#: ../fdroidserver/scanner.py ../fdroidserver/install.py +msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "argument \"-\" with mode %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare SSH connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare ssh connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "can not parse scrlib spec (not a string): '{}'" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "can't open '%s': %s" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "cannot find required srclibs: \"{path}\"" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "cannot have multiple subparser arguments" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "cannot merge actions - two groups are named %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "cannot publish update, did you set the deploy key?" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "cloning {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "command to execute, either 'init' or 'update'" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "commands from plugin modules:" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "complex" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "conflicting option string: %s" +msgid_plural "conflicting option strings: %s" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "copying {apkfilename} into {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "could not parse '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no ref specified): '{}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (too many '@' signs): '{}'" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "created {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "deleting: repo/{apkfilename}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed build logs to '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed process log {path} to {dest}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "dest= is required for options like %r" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "executable binary, possibly code" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "expected %s argument" +msgid_plural "expected %s arguments" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected at least one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected at most one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected one argument" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "failed deploying build logs to '{path}'" +msgstr "" + +#: ../fdroid +msgid "fdroid [-h|--help|--version] []" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "fdroid [] [-h|--help|--version|]" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "floating-point" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force errors to be warnings, or ignore" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force metadata errors (default) to be warnings, or to be ignored." +msgstr "" + +#: ../fdroidserver/common.py +msgid "git svn clone failed" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "gzip file archive" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "ignored explicit argument %r" +msgstr "" + +#: ../fdroidserver/index.py +msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "integer" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid %(type)s value: %(value)r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid choice: %(value)r (choose from %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid conflict_resolution value: %r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be an absolute path!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be directory, not a file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "mirror '%s' does not end with 'fdroid'!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "mutually exclusive arguments must be optional" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "no \"icon\" in {appid}" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "no APK supplied" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "no such option: %s" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "no version info found!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "not allowed with argument %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "one of the arguments %s is required" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "only accepts strings, lists, and tuples" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "option %s: If you really want to install all the signed apps, use --all" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "option %s: invalid %s value: %r" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "option %s: invalid choice: %r (choose from %s)" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option -%s not recognized" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option -%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s must not have an argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s not a unique prefix" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s not recognized" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "optional arguments" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "overwriting existing {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "positional arguments" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "process log deploy {path} to {dest} failed!" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon %s does not exist, generating placeholder." +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "ruamel.yaml not installed, can not write metadata." +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "s3cmd sync indexes {path} to {url} and delete" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "shared library" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "show program's version number and exit" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py +#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +msgid "show this help message and exit" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "signed APK, either a file-path or HTTPS URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: log content is empty" +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: not enabled in config" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "skipping source tarball: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "srclibs missing name and/or @" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "static library" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "the following arguments are required: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unexpected option string: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unrecognized arguments: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "unsafe permissions on '{config_file}' (should be 0600)!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid +#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +msgid "usage: " +msgstr "" + +#: ../fdroid +msgid "usage: fdroid [-h|--help|--version] []" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "using Apache libcloud to sync with {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "virustotal.com is rate limiting, waiting to retry..." +msgstr "" + +#: ../fdroidserver/update.py +msgid "wiki support is deprecated and will be removed in the next release!" +msgstr "" + +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "{0} app, {1} key aliases" +msgid_plural "{0} apps, {1} key aliases" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} ({appid}) has no metadata!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using application ID instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using package name instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android Package Name!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android application ID!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Java Package Name!" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{appid} is missing {name}" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: Unknown extlib {path} in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "{appid}: no builds specified, running on current source state" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be an integer, found: {value}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{field} not terminated in {name}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{file} is blank or corrupt!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgstr "" + +#: ../fdroidserver/import.py +#, python-brace-format +msgid "{path} already exists, ignoring import results!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "{path} does not exist! Create it by running:" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} is zero size!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} more than 200MB, manually upload: {url}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{url} does not end with \"fdroid\", check the URL path!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{url} does not start with \"http\"!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "{} build failed" +msgid_plural "{} builds failed" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/build.py +msgid "{} build succeeded" +msgid_plural "{} builds succeeded" +msgstr[0] "" +msgstr[1] "" From 38d368d7df6a2febd94a93b4734372e10594f159 Mon Sep 17 00:00:00 2001 From: fresh Date: Wed, 13 Jan 2021 05:41:45 +0100 Subject: [PATCH 0041/2116] Translated using Weblate: Greek (el) by fresh Currently translated at 5.5% (32 of 573 strings) Translated using Weblate: Greek (el) by fresh Currently translated at 5.0% (29 of 573 strings) Co-authored-by: fresh Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/el/ Translation: F-Droid/F-Droid Server --- locale/el/LC_MESSAGES/fdroidserver.po | 72 ++++++++++++++------------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index 29bf1c7d..096534f1 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -1,19 +1,21 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # THANOS SIOURDAKIS , 2020. +# fresh , 2020, 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2020-10-21 18:05+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" +"PO-Revision-Date: 2021-01-04 15:47+0000\n" +"Last-Translator: fresh \n" +"Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.4.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -101,7 +103,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" -msgstr "" +msgstr "%(prog)s: σφάλμα: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format @@ -111,7 +113,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "%prog [options]" -msgstr "" +msgstr "%prog [επιλογές]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -225,7 +227,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Add a new application from its source code" -msgstr "" +msgstr "Προσθήκη μίας νέας εφαρμογής από τον πηγαίο κώδικα" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" @@ -335,7 +337,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Build a package from source" -msgstr "" +msgstr "Δημιουργήστε ένα πακέτο από τον πηγαίο κώδικα" #: ../fdroidserver/build.py msgid "Build all applications available" @@ -405,7 +407,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Check for updates to applications" -msgstr "" +msgstr "Έλεγχος για ενημερώσεις εφαρμογών" #: ../fdroidserver/update.py #, python-brace-format @@ -435,7 +437,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py #, c-format, python-format msgid "Command '%s' not recognised.\n" -msgstr "" +msgstr "Η εντολή «%s» δεν αναγνωρίζεται.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" @@ -1296,7 +1298,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "Options" -msgstr "" +msgstr "Επιλογές" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." @@ -1399,7 +1401,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Produce human-readable index.xml" -msgstr "" +msgstr "Δημιούργησε index.xml αναγνώσιμο από τον άνθρωπο" #: ../fdroidserver/import.py msgid "Project URL to import from." @@ -1425,11 +1427,11 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Quickly start a new repository" -msgstr "" +msgstr "Γρήγορη εκκίνηση νέου αποθετηρίου" #: ../fdroid ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" -msgstr "" +msgstr "Ανάγνωση όλων των αρχείων μεταδεδομένων κι έξοδος" #: ../fdroidserver/common.py #, python-brace-format @@ -1463,7 +1465,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" -msgstr "" +msgstr "Μετονομασία αρχείων APK που δεν αντιστοιχούν με «όνομα.πακέτου_123.apk»" #: ../fdroidserver/update.py msgid "Report on build data status" @@ -1531,7 +1533,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Scan the source code of a package" -msgstr "" +msgstr "Έλεγχος του πηγαίου κώδικα ενός πακέτου" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1752,7 +1754,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" -msgstr "" +msgstr "Βρέθηκε άγνωστη εξαίρεση!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py @@ -1808,30 +1810,30 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised field '{field}' in {linedesc}" -msgstr "" +msgstr "Μη αναγνωρίσιμος τομέας«{field}» σε {linedesc}" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" -msgstr "" +msgstr "Μη υποστηριζόμενος τύπος αρχείου «{extension}» για αποθήκευση γραφικών" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" -msgstr "" +msgstr "Βρέθηκε μη υποστηριζόμενο γραφικό αρχείο: {path}" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Unsupported metadata format, use: --to [{supported}]" -msgstr "" +msgstr "Μη υποστηριζόμενη μορφή μεταδεδομένων, χρησιμοποίησε: --to [{supported}]" #: ../fdroidserver/metadata.py msgid "Unterminated ]" -msgstr "" +msgstr "Ημιτελής ]" #: ../fdroidserver/metadata.py msgid "Unterminated ]]" -msgstr "" +msgstr "Ημιτελής ]]" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1920,13 +1922,13 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "Usage" -msgstr "" +msgstr "Χρήση" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "Usage: %s\n" -msgstr "" +msgstr "Χρήση: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" @@ -1981,7 +1983,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Valid commands are:" -msgstr "" +msgstr "Οι έγκυρες εντολές είναι οι εξής:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." @@ -2372,13 +2374,13 @@ msgstr "" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option -%s not recognized" -msgstr "" +msgstr "επιλογή -%s δεν αναγνωρίζεται" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py #, python-format msgid "option -%s requires argument" -msgstr "" +msgstr "η επιλογή -%s απαιτεί επιχείρημα" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2396,7 +2398,7 @@ msgstr "" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s not recognized" -msgstr "" +msgstr "η επιλογή --%s δεν αναγνωρίζεται" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2407,7 +2409,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "optional arguments" -msgstr "" +msgstr "προεραιτικά επιχειρήματα" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2455,13 +2457,13 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "show program's version number and exit" -msgstr "" +msgstr "εμφάνιση έκδοσης του προγράμματος κι έξοδος" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py msgid "show this help message and exit" -msgstr "" +msgstr "εμφάνιση αυτού του βοηθητικού μηνύματος κι έξοδος" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." @@ -2486,7 +2488,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "static library" -msgstr "" +msgstr "στατική βιβλιοθήκη" #: ../fdroidserver/common.py #, python-brace-format @@ -2509,7 +2511,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "" +msgstr "άγνωστος συντακτικός αναλυτής %(parser_name)r (επιλογές: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2525,7 +2527,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py msgid "usage: " -msgstr "" +msgstr "χρήση: " #: ../fdroid msgid "usage: fdroid [-h|--help|--version] []" @@ -2534,7 +2536,7 @@ msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" -msgstr "" +msgstr "χρήση Apache libcloud για συγχρονισμό με {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." From 40879901256554fbd12bff8efce113b32ed6454f Mon Sep 17 00:00:00 2001 From: random r Date: Wed, 13 Jan 2021 05:41:45 +0100 Subject: [PATCH 0042/2116] Translated using Weblate: Italian (it) by random r Currently translated at 62.1% (356 of 573 strings) Co-authored-by: random r Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ Translation: F-Droid/F-Droid Server --- locale/it/LC_MESSAGES/fdroidserver.po | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index fb268b0d..0c731c15 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -13,15 +13,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2020-10-21 18:05+0200\n" -"PO-Revision-Date: 2020-12-01 21:43+0000\n" -"Last-Translator: Francesco Saltori \n" +"PO-Revision-Date: 2020-12-31 08:12+0000\n" +"Last-Translator: random r \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4-dev\n" +"X-Generator: Weblate 4.4.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -1138,7 +1138,6 @@ msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "I metodi di donazione di Liberapay appartengono al campo Liberapay" #: ../fdroidserver/lint.py -#, fuzzy msgid "Liberapay donation methods belong in the LiberapayID flag" msgstr "I metodi di donazione di Liberapay appartengono alla bandiera LiberapayID" @@ -1155,12 +1154,10 @@ msgid "Make the build stop on exceptions" msgstr "Interrompere la compilazione sulle eccezioni" #: ../fdroidserver/index.py -#, fuzzy msgid "Malformed repository mirrors." msgstr "Mirror del repository malformati." #: ../fdroidserver/deploy.py -#, fuzzy msgid "Malformed serverwebroot line:" msgstr "Riga del serverwebroot malformata:" @@ -1199,7 +1196,6 @@ msgid "No commit specified for {versionName} in {linedesc}" msgstr "Nessun commit specificato per {versionName} in {linedesc}" #: ../fdroidserver/index.py -#, fuzzy msgid "No fingerprint in URL." msgstr "Nessuna impronta digitale nell'URL." @@ -1208,7 +1204,6 @@ msgid "No git submodules available" msgstr "Nessun sottomodulo git disponibile" #: ../fdroidserver/import.py -#, fuzzy msgid "No gradle project could be found. Specify --subdir?" msgstr "Nessun progetto gradle è stato trovato. Specificare --subdir?" @@ -1225,7 +1220,6 @@ msgid "No need to specify that the app is for Android" msgstr "Non c'è bisogno di specificare che l'applicazione è per Android" #: ../fdroidserver/deploy.py -#, fuzzy msgid "No option set! Edit your config.py to set at least one of these:" msgstr "Nessuna opzione impostata! Modifica il tuo config.py per impostare almeno uno di questi:" @@ -1312,7 +1306,6 @@ msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Solo PNG e JPEG sono supportati per la grafica, trovati: {path}" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "Only print differences with the Play Store" msgstr "Stampa solo le differenze con il Play Store" @@ -1321,7 +1314,6 @@ msgid "Only process apps with auto-updates" msgstr "Elabora solo app con aggiornamenti automatici" #: ../fdroidserver/lint.py -#, fuzzy msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "I metodi di donazione di OpenCollective appartengono al campo OpenCollective" @@ -1353,12 +1345,12 @@ msgid "Override path for repo APKs (default: ./repo)" msgstr "Sostituisci il percorso per gli APK del repository (impostazione predefinita: ./repo)" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Sostituzione di versionName vuoto in {apkfilename} dai metadati: {version}" #: ../fdroidserver/import.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "Pacchetto \"{appid}\" già esistente" @@ -1368,7 +1360,6 @@ msgid "Parsing manifest at '{path}'" msgstr "Analisi del manifesto in '{path}'" #: ../fdroidserver/common.py -#, fuzzy msgid "Password required with username" msgstr "Password richiesta con nome utente" @@ -1388,7 +1379,6 @@ msgid "Path to the git repo to use as the log" msgstr "Percorso del repository git da utilizzare come registro" #: ../fdroidserver/init.py -#, fuzzy msgid "Path to the keystore for the repo signing key" msgstr "Percorso del keystore per la chiave di firma del repository" From 33d762607a5a961dca4bc7f58cdf14b5e23117d2 Mon Sep 17 00:00:00 2001 From: Predatorix Phoenix Date: Wed, 13 Jan 2021 05:41:46 +0100 Subject: [PATCH 0043/2116] Translated using Weblate: German (de) by Predatorix Phoenix Currently translated at 91.4% (524 of 573 strings) Co-authored-by: Predatorix Phoenix Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 59 ++++++++++++++------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 16ef338a..02a6a64a 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -5,20 +5,21 @@ # melusine , 2020. # marzzzello , 2020. # Hans-Christoph Steiner , 2020. +# Predatorix Phoenix , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2020-10-21 18:05+0200\n" -"PO-Revision-Date: 2020-12-14 11:05+0000\n" -"Last-Translator: melusine \n" +"PO-Revision-Date: 2021-01-10 02:32+0000\n" +"Last-Translator: Predatorix Phoenix \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4-dev\n" +"X-Generator: Weblate 4.4.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -611,7 +612,7 @@ msgstr "Beschreibung der Länge {length} ist über dem {limit}-Zeichen Limit" #: ../fdroidserver/import.py msgid "Do not add 'disable:' to the generated build entries" -msgstr "" +msgstr "Nicht 'disable:' zu den erzeugten Erstellungseinträgen hinzufügen" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" @@ -680,7 +681,7 @@ msgstr "APKs nach Erstellung dynamisch durchsuchen" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" +msgstr "FEHLER: Der \"server\"-Unterbefehl wurde entfernt, verwende \"deploy\"!" #: ../fdroidserver/mirror.py msgid "" @@ -881,7 +882,7 @@ msgstr "Eine Nicht-Datei gefunden bei %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" -msgstr "" +msgstr "{apkfilename} unter {url} gefunden" #: ../fdroidserver/update.py #, python-brace-format @@ -966,15 +967,15 @@ msgstr "APKs einschliessen, die mit deaktivierten Algorithmen wie MD5 signiert s #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" -msgstr "" +msgstr "Die .asc-PGP-Signaturdateien in den Spiegel aufnehmen" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" -msgstr "" +msgstr "Erstellungsprotokolle in den Spiegel aufnehmen" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" -msgstr "" +msgstr "Quellen-Tarballs in den Spiegel aufnehmen" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1024,7 +1025,7 @@ msgstr "Ungültige VercodeOperation: {field}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" -msgstr "" +msgstr "Ungültige Anwendungs-ID {appid}" #: ../fdroidserver/metadata.py #, python-format @@ -1081,7 +1082,7 @@ msgstr "Ungültige Umleitung auf Nicht-HTTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" -msgstr "" +msgstr "Ungültige scrlib-Metadaten: '{file}' ist nicht vorhanden" #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format @@ -1169,7 +1170,7 @@ msgstr "Fehlerhafte serverwebroot Zeile:" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." -msgstr "" +msgstr "Das vollständige Repo und Archiv spiegeln, alle Dateitypen." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" @@ -1296,7 +1297,7 @@ msgstr "Der OBB-Packetname stimmt mit keinem unterstützten APK überein:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" +msgstr "Maschine offline, überspringe git-Spiegelgeneration bis `fdroid deploy`" #: ../fdroidserver/common.py #, python-brace-format @@ -1587,7 +1588,7 @@ msgstr "Einstellen der Uhr auf diese Zeit mit:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "" +msgstr "Setze maximale Veröffentlichungen im Repo bevor ältere archiviert werden" #: ../fdroidserver/build.py #, python-brace-format @@ -1776,7 +1777,7 @@ msgstr "Ungültiges Lizenz-Tag \"%s\"! Verwenden Sie nur Tags von https://spdx.o #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "" +msgstr "Unerwartetes Lizenz-Tag \"{}\"! Nur Lizenz-Tags verwenden, die in deiner config-Datei eingerichtet sind" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1945,7 +1946,7 @@ msgstr "Update Check Name ist auf die bekannte App-ID gesetzt - sie kann entfern #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" -msgstr "" +msgstr "Lade {apkfilename} auf androidobservatory.org hoch" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format @@ -1989,11 +1990,11 @@ msgstr "Verwende {path} zur Konfiguration von s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" -msgstr "" +msgstr "Verwende APK-Signatur v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" -msgstr "" +msgstr "Verwende APK-Signatur v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -2033,7 +2034,7 @@ msgstr "Überprüfe die Index-Signatur:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "" +msgstr "VirusTotal-API-Schlüssel kann nicht Dateien größer 32MB hochladen, verwende {url} um {path} hochzuladen." #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" @@ -2045,7 +2046,7 @@ msgstr "Bei einer Konfiguration mit signierten Indizes, in dieser Phase nur unsi #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "" +msgstr "Beim Linting des gesamten Repositoriums wird yamllint standardmäßig deaktiviert. Diese Option erzwingt yamllint ungeachtet dessen." msgid "X.509 'Distiguished Name' used when generating keys" msgstr "X.509 'Angesehener Name' wenn Schlüssel generiert werden" @@ -2060,7 +2061,7 @@ msgstr "Sie können ANDROID_HOME verwenden, um den Pfad zu Ihrem SDK zu setzen, #: ../fdroidserver/scanner.py msgid "ZIP file archive" -msgstr "" +msgstr "ZIP-Dateiarchiv" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2086,7 +2087,7 @@ msgstr "Mehrdeutige Option: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" -msgstr "" +msgstr "apksigner nicht gefunden, er wird zum Signieren benötigt!" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py #: ../fdroidserver/checkupdates.py @@ -2133,7 +2134,7 @@ msgstr "Versuch einer reinen ssh-Verbindung, um den Deployment-Key zu testen:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" -msgstr "" +msgstr "kann scrlib-Spezifikation nicht parsen (keine Zeichenkette): '{}'" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2172,7 +2173,7 @@ msgstr "Ausführungsbefehl, entweder 'init' oder 'update'" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" -msgstr "" +msgstr "Befehle aus den PlugIn-Modulen:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2195,15 +2196,15 @@ msgstr "Kopiere {apkfilename} nach {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" -msgstr "" +msgstr "konnte '{path}' nicht parsen" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "" +msgstr "konnte srclib-Spezifikation nicht parsen (keine ref angegeben): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" +msgstr "konnte srclib-Spezifikation nicht parsen (zu viele '@'-Zeichen): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2223,7 +2224,7 @@ msgstr "Build Logs deployed zu {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" -msgstr "" +msgstr "Verarbeitungsprotokoll {path} unter {dest} bereitgestellt" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2233,7 +2234,7 @@ msgstr "dest= wird benötigt für Optionen wie %r" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" -msgstr "" +msgstr "ausführbare Binärdatei, vermutlich Code" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From 7086a6ce4f960af8329b8a2d2f3a6dfb161aaf2d Mon Sep 17 00:00:00 2001 From: Jennifer Kitts Date: Wed, 13 Jan 2021 05:41:46 +0100 Subject: [PATCH 0044/2116] Added translation using Weblate: English (Old) (ang) by Jennifer Kitts Co-authored-by: Jennifer Kitts --- locale/ang/LC_MESSAGES/fdroidserver.po | 2685 ++++++++++++++++++++++++ 1 file changed, 2685 insertions(+) create mode 100644 locale/ang/LC_MESSAGES/fdroidserver.po diff --git a/locale/ang/LC_MESSAGES/fdroidserver.po b/locale/ang/LC_MESSAGES/fdroidserver.po new file mode 100644 index 00000000..db06633b --- /dev/null +++ b/locale/ang/LC_MESSAGES/fdroidserver.po @@ -0,0 +1,2685 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# Jennifer Kitts , 2021. +msgid "" +msgstr "" +"Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" +"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" +"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: ang\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: ../fdroidserver/common.py +msgid "" +"\n" +" This is a repository of apps to be used with FDroid. Applications in this\n" +" repository are either official binaries built by the original application\n" +" developers, or are binaries built from source by f-droid.org using the\n" +" tools on https://gitlab.com/fdroid.\n" +" " +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH Public Key to be used as Deploy Key:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH public key to be used as deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "" +"\n" +"{path} encoded for the DEBUG_KEYSTORE secret variable:" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "\"%s/\" has no matching metadata file!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "\"{apkfilename}\" is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains outdated {name} ({version})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains recent {name} ({version})" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "\"{path}\" exists but s3cmd is not installed!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "\"{path}\" is not an accepted format, convert to: {formats}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "\"{url}\" is not a valid URL!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "%(option)s option requires %(number)d argument" +msgid_plural "%(option)s option requires %(number)d arguments" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/mirror.py +#, python-format +msgid "%(prog)s [options] url" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "%(prog)s: error: %(message)s\n" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "%d problems found" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "%prog [options]" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "%r is not callable" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "%s is not an accepted build field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "%s option does not take a value" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keypass' not found in config.py!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' is NONE and 'smartcardoptions' is blank!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keystore' not found in config.py!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keystorepass' not found in config.py!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.py!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "'required' is an invalid argument for positionals" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in 'config.py'!" +msgstr "" + +#. Translators: "build-tools" is the file name of a package from +#. Google, it is part of the Android SDK. So it probably shouldn't be +#. translated or transliterated. +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-23.0.0 or newer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "'{apkfilename}' is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{field}' in {linedesc} is obsolete, see docs for current fields:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{path}' failed to execute!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "...checkupdate failed for {appid} : {error}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid ".__call__() not defined" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "/issues is missing" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "A URL is required as an argument!" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Add PGP signatures using GnuPG for packages in repo" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Add a new application from its source code" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add a repo signing key to an unsigned repo" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add skeleton metadata files for APKs that are missing them" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Adding new repo for only {name}" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Alias of the repo signing key in the keystore" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Also mirror the full archive section" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Also warn about formatting issues, like rewritemeta -l" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android AAR library" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android APK file" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android DEX code" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/build.py +#, python-brace-format +msgid "Android SDK '{path}' does not have '{dirname}' installed!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Android SDK not found!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' is not a directory!" +msgstr "" + +#. Translators: "build-tools" is the file name of a package from +#. Google, it is part of the Android SDK. So it probably shouldn't be +#. translated or transliterated. +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android build-tools path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/update.py +msgid "AndroidManifest.xml has no date" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "App is in '{repo}' but has a link to {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Appending .git is not necessary" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Archiving {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in srclib '{srclib}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Broken symlink: {path}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Build a package from source" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build all applications available" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Build generated by `fdroid import` - remove disable line once ready" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Build metadata git repo has uncommited changes!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build only the latest version of each package" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "Built repo based in \"%s\" with this config:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Can't build due to {} error while scanning" +msgid_plural "Can't build due to {} errors while scanning" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/vmtools.py +#, python-brace-format +msgid "Cannot read \"{path}\"!" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Cannot resolve application ID {appid}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Cannot rewrite \"{path}\"" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "Cannot use --list and --to at the same time" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Categories '%s' is not valid" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Categories are not set" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Check for updates to applications" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean after all scans have finished" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean before the scans start and rebuild the container" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean up all containers and then exit" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Clean update - don't uses caches, reprocess all APKs" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Comma separated list of categories." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +#, c-format, python-format +msgid "Command '%s' not recognised.\n" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Commit changes" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not find '{command}' on your system" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Could not find latest version code" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Could not find latest version name" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not find {path} to remove it" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Could not open apk file for analysis" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not parse size \"{size}\", wrong type \"{type}\"" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/import.py +msgid "Couldn't find Application ID" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/import.py +msgid "Couldn't find latest version code" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/import.py +msgid "Couldn't find latest version name" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Couldn't find package ID" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Cowardily refusing to overwrite existing signing key setup!" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Create a repo signing key in a keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Create skeleton metadata files that are missing" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Created new container \"{name}\"" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Creating \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating log directory" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Creating new S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating output directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating signed index with this key (SHA256):" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/verify.py +#: ../fdroidserver/publish.py +msgid "Creating temporary directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating unsigned index in preparation for signing" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "DEBUG_KEYSTORE is not set or the value is incomplete" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Delete APKs and/or OBBs without metadata from the repo" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting archive, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Deleting unknown file: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description '%s' is just the app's summary" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Description has a duplicate line" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Description of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Do not add 'disable:' to the generated build entries" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not deploy the new files to the repo" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Do not include \"{path}\" in URL!" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Do not prompt for Android SDK path, just fail" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not remove the private keys generated from the keystore" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't create a source tarball, useful when testing a build" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Don't do anything logs-related" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/nightly.py +#: ../fdroidserver/upload.py +msgid "Don't use rsync checksums" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Download complete mirrors of small repos" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Download logs we don't have" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Downloading the repository already failed once, not trying again." +msgstr "" + +#: ../fdroidserver/verify.py +#, python-brace-format +msgid "Downloading {url} failed. {error}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Duplicate link in '{field}': {url}" +msgstr "" + +#: ../fdroid +msgid "Dynamically scan APKs post build" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "" +"ERROR: this command should never be used to mirror f-droid.org!\n" +"A full mirror of f-droid.org requires more than 200GB." +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "ERROR: unsupported CI type, patches welcome!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Empty build flag at {linedesc}" +msgstr "" + +#: ../fdroidserver/__main__.py +#, python-brace-format +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"Enter the path to the Android SDK (%s) here:\n" +"> " +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py +#: ../fdroidserver/upload.py +#, python-format +msgid "Error while attempting to publish log: %s" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/common.py +msgid "Error while getting repo address" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Extract signatures from APKs" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed copying {path}: {error}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Failed fetching signatures for '{apkfilename}': {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed reading {path}: {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed resizing {path}: {error}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Failed to align application" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Failed to create S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get apk information, deleting {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get apk information, skipping {path}" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Failed to install '{apkfilename}' on {dev}: {error}" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/common.py +msgid "Failed to sign application" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to zipalign application" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Fetched buildserverid from VM: {buildserverid}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "File disappeared while processing it: {path}" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/stats.py ../fdroidserver/update.py +#: ../fdroidserver/rewritemeta.py ../fdroidserver/build.py +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py +msgid "Finished" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID flag" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Forbidden HTML tags" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Force halting build after {0} sec timeout!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Force scan of disabled apps and builds." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found bad funding file \"{path}\" for \"{name}\":" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Found invalid appids in arguments" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +msgid "Found invalid versionCodes for some apps" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Found multiple JAR Signature Block Files in {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Found multiple metadata files for {appid}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found multiple signing certificates for repository." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found multiple signing certificates in {path}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found no signing certificates for repository." +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Found non-file at %s" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Found {apkfilename} at {url}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Generated skeleton metadata for {appid}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git checkout of '%s' failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git clean failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git fetch failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git remote set-head failed" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git remote set-head failed: \"%s\"" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git reset failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule sync failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule update failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "HTTPS must be used with Subversion URLs!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "If a git mirror gets to big, allow the archive to be deleted" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "If this upload fails, try manually uploading to {url}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." +msgstr "" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring FUNDING.yml entry longer than 2048: %s" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Ignoring package without metadata: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Ignoring stale cache data for {apkfilename}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Ignoring {ext} file at '{path}'" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Include APKs that are signed with disabled algorithms like MD5" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the PGP signature .asc files in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the build logs in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the source tarballs in the mirror" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Initialising submodules" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Install all signed applications available" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Install built packages on devices" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s…" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}…" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Interact with the repo HTTP server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Invalid APK" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid VercodeOperation: {field}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid application ID {appid}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid boolean '%s'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid build flag at {line} in {linedesc}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid build format: {value} in {name}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid bulleted list" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid metadata in %s:%d" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Invalid metadata in: " +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Invalid name for published file: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid package name {0}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid redirect to non-HTTPS: {before} -> {after} " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid scrlib metadata: '{file}' does not exist" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: could not parse '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid versionCode: \"{versionCode}\" is not an integer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature failed to verify: {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature verified: {path}" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java JAR file" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#: ../fdroidserver/mirror.py +msgid "Java JDK not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java compiled class" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Javascript in HTML src attributes" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Keystore for signing key:\t" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the Liberapay: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the LiberapayID flag" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Locale included in f-droid.org URL" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Make the build stop on exceptions" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Malformed repository mirrors." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Malformed serverwebroot line:" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Mirror the full repo and archive, all file types." +msgstr "" + +#: ../fdroidserver/gpgsign.py +msgid "Missing output directory" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Name '%s' is just the auto name - remove it" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No 'config.py' found, using defaults." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No Android SDK found!" +msgstr "" + +#: ../fdroidserver/import.py +msgid "No android or kivy project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No attached devices found" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "No commit specified for {versionName} in {linedesc}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "No fingerprint in URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No git submodules available" +msgstr "" + +#: ../fdroidserver/import.py +msgid "No gradle project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/common.py +msgid "No information found." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is Free Software" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is for Android" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "No option set! Edit your config.py to set at least one of these:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No packages specified" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "No signed apk available for %s" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No signed output directory - nothing to do" +msgstr "" + +#: ../fdroidserver/update.py ../fdroidserver/common.py +#, python-brace-format +msgid "No signing certificates found in {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "No such package: %s" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No such versionCode {versionCode} for app {appid}" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +msgid "No unsigned directory - nothing to do" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Not a valid size definition: \"{}\"" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Nothing to do" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Nothing to do for {appid}." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Now set these in config.py:" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "OBB file has newer versionCode({integer}) than any APK:" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB filename must start with \"main.\" or \"patch.\":" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB's packagename does not match a supported APK:" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Old APK signature failed to verify: {path}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Old, deprecated name for fdroid deploy" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Only PNG and JPEG are supported for graphics, found: {path}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only print differences with the Play Store" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only process apps with auto-updates" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "OpenCollective donation methods belong in the OpenCollective: field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "Options" +msgstr "" + +#: ../fdroidserver/verify.py +msgid "Output JSON report to file named after APK." +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Output JSON to stdout." +msgstr "" + +#: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py +#: ../fdroidserver/update.py ../fdroidserver/signindex.py +#: ../fdroidserver/checkupdates.py +msgid "Outputting JSON" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Overall license of the project." +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Override path for repo APKs (default: ./repo)" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" +msgstr "" + +#: ../fdroidserver/import.py +#, python-brace-format +msgid "Package \"{appid}\" already exists" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Parsing manifest at '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Password required with username" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Path to main Android project subdirectory, if not in root." +msgstr "" + +msgid "Path to main android project subdirectory, if not in root." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Path to the git repo to use as the log" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the keystore for the repo signing key" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Prepare Drozer to run a scan" +msgstr "" + +msgid "Prepare drozer to run a scan" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Print the secret variable to the terminal for easy copy/paste" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Problem with description of {appid}: {error}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Problem with xml at '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Process auto-updates" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#, python-brace-format +msgid "Processing {apkfilename}" +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#, python-brace-format +msgid "Processing {appid}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable XML/JSON for index files" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable index.xml" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Project URL to import from." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Punctuation should be avoided" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Push the log to this git remote repository" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Pushing binary transparency log to {url}" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Pushing to {url}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Quickly start a new repository" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Read all the metadata files and exit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading '{config_file}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading minSdkVersion failed: \"{apkfilename}\"" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Reading {apkfilename} from cache" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Removing specified files" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Rename APK files that do not match package.name_123.apk" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Report on build data status" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Resigning {apkfilename} with provided debug.keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Resize all the icons exceeding the max pixel size and exit" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Restrict output to warnings and errors" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Rewrite all the metadata files" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "Rewrite to a specific format: " +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}'" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}' to '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Run on git repo that has uncommitted changes" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Run rewritemeta to fix formatting" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Running first pass with MD5 checking disabled" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Running wget in {path}" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Scan only the latest version of each package" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scan the resulting APK(s) for known non-free classes." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Scan the source code of a package" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:{versionCode}:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scanner found {} problem" +msgid_plural "Scanner found {} problems" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/common.py +msgid "Set clock to that time using:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Set maximum releases in repo before older ones are archived" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Set open file limit to {integer}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Set up an app build for a nightly build repo" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setting open file limit failed: " +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Setting {0} sec timeout for this build" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +msgstr "" + +msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Sign and place packages in the repo" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Sign indexes created using update --nosign" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Skip scanning the source code for binaries and other problems" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping '{apkfilename}' with invalid signature!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping index generation for {appid}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: disabled" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: no builds specified" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Specify a local folder to sync the repo to" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Specify an identity file to provide to SSH for rsyncing" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Specify that we're running on the build server" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Specify which debug keystore file to use." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Spew out even more information than normal" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Striping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Stripping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Summary '%s' is just the app's name" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Summary of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "System clock is older than date in {path}!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "The OBB version code must come after \"{name}.\":" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "The base URL for the repo to log (default: https://f-droid.org)" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "The directory to write the mirror to" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "The file to be included in the repo (path or glob)" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "The only commands currently supported are 'init' and 'update'" +msgstr "" + +#: ../fdroidserver/index.py +msgid "The repository's fingerprint does not match." +msgstr "" + +#: ../fdroidserver/common.py +msgid "The repository's index could not be verified." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "The root dir for local_copy_dir \"{path}\" does not exist!" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "There is a keyalias collision - publishing halted" +msgstr "" + +#: ../fdroidserver/common.py +msgid "These are the apps that have been archived from the main repo." +msgstr "" + +#: ../fdroidserver/import.py +#, python-format +msgid "This repo already has local metadata: %s" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL must start with https:// or http://" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL shorteners should not be used" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "URL title is just the URL, use brackets: [URL]" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "URL {url} in Description: {error}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unexpected text on same line as {field} in {linedesc}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Unknown exception found!" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Unknown file '{filename}' in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Unknown metadata format: %s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path} (use: *.yml)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Unknown version of aapt, might cause problems: " +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary leading space" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary trailing space" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised app field '{fieldname}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unrecognised app field: " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised build flag '{build_flag}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised field '{field}' in {linedesc}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported file type \"{extension}\" for repo graphic" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported graphics file found: {path}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Unsupported metadata format, use: --to [{supported}]" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unterminated ]" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unterminated ]]" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unterminated build in {name}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unterminated continuation in {name}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused extlib at %s" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused file at %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scandelete path: %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scanignore path: %s" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update repo information for new packages" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update the binary transparency log for a URL" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update the stats of the repo" +msgstr "" + +#: ../fdroidserver/update.py ../fdroidserver/build.py +msgid "Update the wiki" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "UpdateCheckData has invalid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must use HTTPS URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData not a valid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID - it can be removed" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID, it can be removed" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to androidobservatory.org" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to virustotal" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "Usage" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "Usage: %s\n" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master to point at a file in the default branch" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use `fdroid update -c` to create it." +msgstr "" + +#: ../fdroidserver/build.py +msgid "Use build server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "" + +msgid "Use date from apk instead of current time for newly added apks" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Using \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v2" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v3" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Using androguard from \"{path}\"" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Using existing keystore \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Using s3cmd to sync with: {url}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Valid commands are:" +msgstr "" + +#: ../fdroidserver/verify.py +msgid "Verify against locally cached copy rather than redownloading." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Verify the integrity of downloaded packages" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Verifying index signature:" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Warn about possible metadata errors" +msgstr "" + +#: ../fdroidserver/update.py +msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgstr "" + +msgid "X.509 'Distiguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/init.py +msgid "X.509 'Distinguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/common.py +msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "ZIP file archive" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "adding IdentityFile to {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "adding to {name}: {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "ambiguous option: %s (%s?)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "apksigner not found, it's required for signing!" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py +#: ../fdroidserver/checkupdates.py +msgid "application ID of file to operate on" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py +msgid "application ID with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py +msgid "applicationId in the form APPID" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "applicationId to check for updates" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +#: ../fdroidserver/dscanner.py ../fdroidserver/build.py +#: ../fdroidserver/scanner.py ../fdroidserver/install.py +msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "argument \"-\" with mode %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare SSH connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare ssh connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "can not parse scrlib spec (not a string): '{}'" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "can't open '%s': %s" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "cannot find required srclibs: \"{path}\"" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "cannot have multiple subparser arguments" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "cannot merge actions - two groups are named %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "cannot publish update, did you set the deploy key?" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "cloning {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "command to execute, either 'init' or 'update'" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "commands from plugin modules:" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "complex" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "conflicting option string: %s" +msgid_plural "conflicting option strings: %s" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "copying {apkfilename} into {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "could not parse '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no ref specified): '{}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (too many '@' signs): '{}'" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "created {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "deleting: repo/{apkfilename}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed build logs to '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed process log {path} to {dest}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "dest= is required for options like %r" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "executable binary, possibly code" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "expected %s argument" +msgid_plural "expected %s arguments" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected at least one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected at most one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected one argument" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "failed deploying build logs to '{path}'" +msgstr "" + +#: ../fdroid +msgid "fdroid [-h|--help|--version] []" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "fdroid [] [-h|--help|--version|]" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "floating-point" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force errors to be warnings, or ignore" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force metadata errors (default) to be warnings, or to be ignored." +msgstr "" + +#: ../fdroidserver/common.py +msgid "git svn clone failed" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "gzip file archive" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "ignored explicit argument %r" +msgstr "" + +#: ../fdroidserver/index.py +msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "integer" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid %(type)s value: %(value)r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid choice: %(value)r (choose from %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid conflict_resolution value: %r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be an absolute path!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be directory, not a file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "mirror '%s' does not end with 'fdroid'!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "mutually exclusive arguments must be optional" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "no \"icon\" in {appid}" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "no APK supplied" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "no such option: %s" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "no version info found!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "not allowed with argument %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "one of the arguments %s is required" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "only accepts strings, lists, and tuples" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "option %s: If you really want to install all the signed apps, use --all" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "option %s: invalid %s value: %r" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "option %s: invalid choice: %r (choose from %s)" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option -%s not recognized" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option -%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s must not have an argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s not a unique prefix" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s not recognized" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "optional arguments" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "overwriting existing {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "positional arguments" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "process log deploy {path} to {dest} failed!" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon %s does not exist, generating placeholder." +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "ruamel.yaml not installed, can not write metadata." +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "s3cmd sync indexes {path} to {url} and delete" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "shared library" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "show program's version number and exit" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py +#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +msgid "show this help message and exit" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "signed APK, either a file-path or HTTPS URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: log content is empty" +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: not enabled in config" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "skipping source tarball: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "srclibs missing name and/or @" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "static library" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "the following arguments are required: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unexpected option string: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unrecognized arguments: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "unsafe permissions on '{config_file}' (should be 0600)!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid +#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +msgid "usage: " +msgstr "" + +#: ../fdroid +msgid "usage: fdroid [-h|--help|--version] []" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "using Apache libcloud to sync with {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "virustotal.com is rate limiting, waiting to retry..." +msgstr "" + +#: ../fdroidserver/update.py +msgid "wiki support is deprecated and will be removed in the next release!" +msgstr "" + +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "{0} app, {1} key aliases" +msgid_plural "{0} apps, {1} key aliases" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} ({appid}) has no metadata!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using application ID instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using package name instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android Package Name!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android application ID!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Java Package Name!" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{appid} is missing {name}" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: Unknown extlib {path} in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "{appid}: no builds specified, running on current source state" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be an integer, found: {value}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{field} not terminated in {name}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{file} is blank or corrupt!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgstr "" + +#: ../fdroidserver/import.py +#, python-brace-format +msgid "{path} already exists, ignoring import results!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "{path} does not exist! Create it by running:" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} is zero size!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} more than 200MB, manually upload: {url}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{url} does not end with \"fdroid\", check the URL path!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{url} does not start with \"http\"!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "{} build failed" +msgid_plural "{} builds failed" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/build.py +msgid "{} build succeeded" +msgid_plural "{} builds succeeded" +msgstr[0] "" +msgstr[1] "" From b0ef3c4006f566d2fbd21c8fc3b5fa2dce7a5157 Mon Sep 17 00:00:00 2001 From: Michal L Date: Wed, 13 Jan 2021 05:41:47 +0100 Subject: [PATCH 0045/2116] Translated using Weblate: Polish (pl) by Michal L Currently translated at 91.6% (525 of 573 strings) Co-authored-by: Michal L Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ Translation: F-Droid/F-Droid Server --- locale/pl/LC_MESSAGES/fdroidserver.po | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 18697d17..fef3f666 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -1,14 +1,14 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # WaldiS , 2020. -# Michal L , 2020. +# Michal L , 2020, 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2020-10-21 18:05+0200\n" -"PO-Revision-Date: 2020-12-29 19:29+0000\n" -"Last-Translator: WaldiS \n" +"PO-Revision-Date: 2021-01-13 04:41+0000\n" +"Last-Translator: Michal L \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" @@ -1101,9 +1101,8 @@ msgid "JAR signature verified: {path}" msgstr "Podpis JAR potwierdzony: {path}" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Java JAR file" -msgstr "Plik JAR Java" +msgstr "Plik Java JAR" #: ../fdroidserver/publish.py ../fdroidserver/update.py #: ../fdroidserver/mirror.py @@ -2691,9 +2690,9 @@ msgid "{path} is zero size!" msgstr "{path} ma zerowy rozmiar!" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" -msgstr "{path} więcej niż 200MB, załadowane ręcznie: {url}" +msgstr "{path} więcej niż 200MB, przesłane ręcznie: {url}" #: ../fdroidserver/mirror.py #, python-brace-format From f24eae0f6fdebca20b8e9108e70f367484f28a93 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Wed, 13 Jan 2021 05:41:47 +0100 Subject: [PATCH 0046/2116] Translated using Weblate: Albanian (sq) by Besnik Bleta Currently translated at 96.8% (555 of 573 strings) Co-authored-by: Besnik Bleta Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/ Translation: F-Droid/F-Droid Server --- locale/sq/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index 9e0c98ae..15af277f 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -1,13 +1,13 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# Besnik Bleta , 2020. +# Besnik Bleta , 2020, 2021. # Hans-Christoph Steiner , 2020. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2020-10-21 18:05+0200\n" -"PO-Revision-Date: 2020-11-14 21:55+0000\n" +"PO-Revision-Date: 2021-01-13 04:41+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" "Language: sq\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4-dev\n" +"X-Generator: Weblate 4.4.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -27,7 +27,7 @@ msgid "" " " msgstr "" "\n" -" Kjo është një depo aplikacionesh për t’u përdorur me FDroid. Applikacionet\n" +" Kjo është një depo aplikacionesh për t’u përdorur me FDroid. Aplikacionet\n" " në këtë depo ose janë dyorë zyrtarë të montuar nga zhvilluesit e aplikacionit\n" " origjinal, ose janë dyorë të montuar nga burimi prej f-droid.org duke përdorur\n" " mjetet në https://gitlab.com/fdroid.\n" From 4d141797322ec72b5ce01e184b2a52ab89bf1c82 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 14 Jan 2021 14:56:20 +0100 Subject: [PATCH 0047/2116] make -C locale/ clean update --- locale/ang/LC_MESSAGES/fdroidserver.po | 73 ++++++++++++++++++- locale/bn/LC_MESSAGES/fdroidserver.po | 73 ++++++++++++++++++- locale/bo/LC_MESSAGES/fdroidserver.po | 81 +++++++++++++++++++++- locale/cs/LC_MESSAGES/fdroidserver.po | 73 ++++++++++++++++++- locale/de/LC_MESSAGES/fdroidserver.po | 81 +++++++++++++++++++++- locale/el/LC_MESSAGES/fdroidserver.po | 73 ++++++++++++++++++- locale/es/LC_MESSAGES/fdroidserver.po | 80 ++++++++++++++++++++- locale/es_AR/LC_MESSAGES/fdroidserver.po | 73 ++++++++++++++++++- locale/es_MX/LC_MESSAGES/fdroidserver.po | 73 ++++++++++++++++++- locale/eu/LC_MESSAGES/fdroidserver.po | 73 ++++++++++++++++++- locale/fa/LC_MESSAGES/fdroidserver.po | 73 ++++++++++++++++++- locale/fdroidserver.pot | 75 ++++++++++++++++++-- locale/fi/LC_MESSAGES/fdroidserver.po | 73 ++++++++++++++++++- locale/fr/LC_MESSAGES/fdroidserver.po | 80 ++++++++++++++++++++- locale/hu/LC_MESSAGES/fdroidserver.po | 78 ++++++++++++++++++++- locale/id/LC_MESSAGES/fdroidserver.po | 78 ++++++++++++++++++++- locale/it/LC_MESSAGES/fdroidserver.po | 80 ++++++++++++++++++++- locale/ja/LC_MESSAGES/fdroidserver.po | 73 ++++++++++++++++++- locale/kab/LC_MESSAGES/fdroidserver.po | 78 ++++++++++++++++++++- locale/ko/LC_MESSAGES/fdroidserver.po | 78 ++++++++++++++++++++- locale/ml/LC_MESSAGES/fdroidserver.po | 73 ++++++++++++++++++- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 80 ++++++++++++++++++++- locale/nl/LC_MESSAGES/fdroidserver.po | 73 ++++++++++++++++++- locale/pl/LC_MESSAGES/fdroidserver.po | 81 +++++++++++++++++++++- locale/pt/LC_MESSAGES/fdroidserver.po | 81 +++++++++++++++++++++- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 81 +++++++++++++++++++++- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 81 +++++++++++++++++++++- locale/ru/LC_MESSAGES/fdroidserver.po | 81 +++++++++++++++++++++- locale/sk/LC_MESSAGES/fdroidserver.po | 73 ++++++++++++++++++- locale/sq/LC_MESSAGES/fdroidserver.po | 81 +++++++++++++++++++++- locale/sv/LC_MESSAGES/fdroidserver.po | 73 ++++++++++++++++++- locale/tr/LC_MESSAGES/fdroidserver.po | 81 +++++++++++++++++++++- locale/tzm/LC_MESSAGES/fdroidserver.po | 73 ++++++++++++++++++- locale/ug/LC_MESSAGES/fdroidserver.po | 73 ++++++++++++++++++- locale/uk/LC_MESSAGES/fdroidserver.po | 81 +++++++++++++++++++++- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 78 ++++++++++++++++++++- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 81 +++++++++++++++++++++- 37 files changed, 2732 insertions(+), 112 deletions(-) diff --git a/locale/ang/LC_MESSAGES/fdroidserver.po b/locale/ang/LC_MESSAGES/fdroidserver.po index db06633b..90c02611 100644 --- a/locale/ang/LC_MESSAGES/fdroidserver.po +++ b/locale/ang/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -134,6 +134,10 @@ msgstr "" msgid "'keypass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -142,14 +146,26 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -159,6 +175,10 @@ msgstr "" msgid "'sdk_path' not set in 'config.py'!" msgstr "" +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -273,6 +293,11 @@ msgstr "" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "" +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "" @@ -287,6 +312,11 @@ msgstr "" msgid "Android SDK path '{path}' is not a directory!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -445,6 +475,11 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -463,6 +498,11 @@ msgstr "" msgid "Could not find {path} to remove it" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "" @@ -686,6 +726,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -813,7 +858,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1171,6 +1216,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1217,7 +1266,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1249,6 +1298,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1720,6 +1773,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1750,6 +1807,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "" @@ -2637,6 +2699,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index 4e58c37d..dda9f375 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -135,6 +135,10 @@ msgstr "" msgid "'keypass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -143,14 +147,26 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -160,6 +176,10 @@ msgstr "" msgid "'sdk_path' not set in 'config.py'!" msgstr "" +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -274,6 +294,11 @@ msgstr "" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "" +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "" @@ -288,6 +313,11 @@ msgstr "" msgid "Android SDK path '{path}' is not a directory!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -446,6 +476,11 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -464,6 +499,11 @@ msgstr "" msgid "Could not find {path} to remove it" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "" @@ -687,6 +727,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -814,7 +859,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1172,6 +1217,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1218,7 +1267,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1250,6 +1299,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1721,6 +1774,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1751,6 +1808,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "" @@ -2638,6 +2700,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index 3f59444c..7106e829 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-11-10 16:20+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tibetan \n" @@ -141,6 +141,11 @@ msgstr "%sགདམ་ཀ་ནུས་མེད་རེད་འདུག" msgid "'keypass' not found in config.py!" msgstr "'keypass' འདི་config.py ནང་རྙེད་མ་སོང་།!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' འདི་config.py ནང་རྙེད་མ་སོང་།!" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -149,14 +154,29 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "'keystore' འདི་ config.py ནང་རྙེད་མ་སོང་།!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystore' not found in config.yml!" +msgstr "'keystore' འདི་ config.py ནང་རྙེད་མ་སོང་།!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "'keystorepass' འདི་ config.py ནང་རྙེད་མ་སོང་།!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' འདི་ config.py ནང་རྙེད་མ་སོང་།!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "'repo_keyalias' འདི་ config.py ནང་རྙེད་མ་སོང་།!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' འདི་ config.py ནང་རྙེད་མ་སོང་།!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -166,6 +186,11 @@ msgstr "'དགསོ་མཁོ།' ནི་གནས་སྟངས་འད msgid "'sdk_path' not set in 'config.py'!" msgstr "'sdk_path' འདི་ 'config.py' ནང་སྒྲིག་ཐུབ་མ་སོང་།!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'sdk_path' not set in config.yml!" +msgstr "'sdk_path' འདི་ 'config.py' ནང་སྒྲིག་ཐུབ་མ་སོང་།!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -282,6 +307,11 @@ msgstr "ཨེན་ཀྲོཌ་ SDK རྙེད་མ་སོང་།!" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "ཨེན་ཀྲོཌ་SDK '{path}1{dirname}' '{dirname}'སྒྲིག་བཅུག་མིན་འདུག!" +#: ../fdroidserver/init.py +#, fuzzy, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "ཨེན་ཀྲོཌ་ SDK རྙེད་སོན་བྱུང་མ་སོང་།!" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "ཨེན་ཀྲོཌ་ SDK རྙེད་སོན་བྱུང་མ་སོང་།!" @@ -296,6 +326,11 @@ msgstr "ཨེན་ཀྲོཌ་SDK ཐབས་ལམ་ '{path}'མིན msgid "Android SDK path '{path}' is not a directory!" msgstr "ཨེན་ཀྲོཌSDKཐབས་ལམ་ '{path}1' ཡིག་ཆ་གསོག་ཉར་རེད་མིན་འདུག!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "ཨེན་ཀྲོཌ་ SDK རྙེད་སོན་བྱུང་མ་སོང་།!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -453,6 +488,11 @@ msgstr "བསྒྱུར་བ་གཏོང་བར་མོས་མཐུ msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -473,6 +513,11 @@ msgstr "ཐོན་རིམ་གསར་ཤོས་འདིའི་མི msgid "Could not find {path} to remove it" msgstr "{path}མེད་པ་བཟོས་པ་ལ་རྙེད་མ་སོང་།" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "དཔྱད་ཞིབ་ཀྱི་ཆེད་དུ་apk ཡིག་ཆ་ཁ་ཕྱེས་ཐུབ་ཀྱི་མིན་འདུག" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "དཔྱད་ཞིབ་ཀྱི་ཆེད་དུ་apk ཡིག་ཆ་ཁ་ཕྱེས་ཐུབ་ཀྱི་མིན་འདུག" @@ -699,6 +744,11 @@ msgstr "" "ཨེན་ཀྲོཌ་SDKགྱི་ལམ་འདིར་ཡོད་པས་ནང་འཛུལ་བྱེད། (%s) :\n" "> " +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, fuzzy, python-format @@ -828,7 +878,7 @@ msgstr "\"{name}\" བརྐོད་རིས་མེད་པའི་མཉ msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "རྩོད་པའི་ནང་ཁུངས་ལྡན་མིན་པའི་appids རྙེད་འདུག" @@ -1188,6 +1238,11 @@ msgstr "ཟུར་སྣོན་ཡོ་བྱད་རྙེད་མ་ས msgid "No commit specified for {versionName} in {linedesc}" msgstr "{linedesc} ནང་གྱི་ {versionName}འདིའི་ཆེད་དུ་ཁས་ལེན་དམིགས་བསལ་གང་ཡང་མིན་འདུག" +#: ../fdroidserver/common.py +#, fuzzy +msgid "No config.yml found, using defaults." +msgstr "'config.py' རྙེད་མ་སོང་།, སོར་བཞག་བེད་སྤྱོད་བྱེད་བཞིན་པ།." + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "URL ནང་ལག་མཐིལ་པར་ཤུས་རྙེད་མ་སོང་།." @@ -1235,7 +1290,7 @@ msgstr "མིང་རྟགས་མ་བཀོད་པའི་ཕྱོག msgid "No signing certificates found in {path}" msgstr "{path}མིང་རྟགས་བཀོད་པའི་ཆོག་མཆན་ལག་ཁྱེར་འདིའི་ནང་རྙེད་མ་སོང་།" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "ཐུམ་སྒྲིལ་དེ་འདྲ་མིན་འདུག: %s 1" @@ -1268,6 +1323,11 @@ msgstr "{appid} ཆེད་དུ་བྱ་རྒྱུ་གང་ཡང་ msgid "Now set these in config.py:" msgstr "'sdk_path' འདི་ 'config.py' ནང་སྒྲིག་ཐུབ་མ་སོང་།!" +#: ../fdroidserver/init.py +#, fuzzy +msgid "Now set these in config.yml:" +msgstr "'sdk_path' འདི་ 'config.py' ནང་སྒྲིག་ཐུབ་མ་སོང་།!" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1739,6 +1799,11 @@ msgstr "རེ་པོ་འདི་ལ་སྔོན་ཚོད་ནས་ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "awsbucket, awssecretkey དང་། awsaccesskeyid བེད་སྤྱོད་བྱེད་པའི་ཆེད་དུ་ config.py ནང་དུ་ངེས་པར་དུ་སྒྲིག་དགོས།!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "awsbucket, awssecretkey དང་། awsaccesskeyid བེད་སྤྱོད་བྱེད་པའི་ཆེད་དུ་ config.py ནང་དུ་ངེས་པར་དུ་སྒྲིག་དགོས།!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1770,6 +1835,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "{linedesc}ནང་། {field}་ཁ་ཕྱོགས་དེ་ག་རང་ནང་རེ་བ་མ་བྱས་པའི་ཡིག་ཚགས་" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "ཆ་རྒྱུས་མེད་པའི་དམིགས་བསལ་ཞིག་རྙེད་སོང་།!" @@ -2662,6 +2732,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "{name} \"{path}\" མིན་འདུག! config.pyནོར་བཅོས་བྱེད།." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 78a8aeab..bdc82fc8 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2019-02-01 13:33+0000\n" "Last-Translator: Michal Čihař \n" "Language-Team: Czech \n" @@ -137,6 +137,10 @@ msgstr "" msgid "'keypass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -145,14 +149,26 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -162,6 +178,10 @@ msgstr "" msgid "'sdk_path' not set in 'config.py'!" msgstr "" +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -276,6 +296,11 @@ msgstr "" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "" +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "" @@ -290,6 +315,11 @@ msgstr "" msgid "Android SDK path '{path}' is not a directory!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -449,6 +479,11 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -467,6 +502,11 @@ msgstr "" msgid "Could not find {path} to remove it" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "" @@ -691,6 +731,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -818,7 +863,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1176,6 +1221,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1222,7 +1271,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1254,6 +1303,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1726,6 +1779,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1756,6 +1813,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Došlo k neznámé chybě!" @@ -2646,6 +2708,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 02a6a64a..504d4a1b 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-10 02:32+0000\n" "Last-Translator: Predatorix Phoenix \n" "Language-Team: German \n" @@ -154,6 +154,11 @@ msgstr "Option %s verfügt über keinen Wert" msgid "'keypass' not found in config.py!" msgstr "„keypass” nicht in config.py vorhanden!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keypass' not found in config.yml!" +msgstr "„keypass” nicht in config.py vorhanden!" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' ist NONE und 'smartcardoptions' ist leer!" @@ -162,14 +167,29 @@ msgstr "'keystore' ist NONE und 'smartcardoptions' ist leer!" msgid "'keystore' not found in config.py!" msgstr "„keystore” nicht in config.py vorhanden!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystore' not found in config.yml!" +msgstr "„keystore” nicht in config.py vorhanden!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "„keystorepass” nicht in config.py vorhanden!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystorepass' not found in config.yml!" +msgstr "„keystorepass” nicht in config.py vorhanden!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "„repo_keyalias” nicht in config.py vorhanden!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'repo_keyalias' not found in config.yml!" +msgstr "„repo_keyalias” nicht in config.py vorhanden!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -179,6 +199,11 @@ msgstr "„required” ist ein ungültiges Argument für Positionsangaben" msgid "'sdk_path' not set in 'config.py'!" msgstr "Kein 'sdk_path' in 'config.py' festgelegt!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'sdk_path' not set in config.yml!" +msgstr "Kein 'sdk_path' in 'config.py' festgelegt!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -294,6 +319,11 @@ msgstr "Keine Android SDK gefunden!" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "Im „{path}” der Android SDK wurde „{dirname}” nicht installiert!" +#: ../fdroidserver/init.py +#, fuzzy, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "Android-SDK nicht gefunden!" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "Android-SDK nicht gefunden!" @@ -308,6 +338,11 @@ msgstr "Android-SDK-Pfad »{path}« nicht vorhanden!" msgid "Android SDK path '{path}' is not a directory!" msgstr "Android-SDK-Pfad »{path}« ist kein Verzeichnis!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "Android-SDK nicht gefunden!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -466,6 +501,11 @@ msgstr "Änderungen übergeben" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Widersprüchliche Argumente: '--verbose' und '--quiet' können nicht gleichzeitig angegeben werden." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -486,6 +526,11 @@ msgstr "Neuester Versionsname konnte nicht gefunden werden" msgid "Could not find {path} to remove it" msgstr "{path} konnte nicht gefunden werden, um ihn zu entfernen" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "Konnte APK-Datei nicht für Analyse öffnen" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "Konnte APK-Datei nicht für Analyse öffnen" @@ -714,6 +759,11 @@ msgstr "" "Geben Sie hier den Pfad zum Android-SDK (%s) ein:\n" "> " +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -842,7 +892,7 @@ msgstr "Grafik \"{path}\" ohne Metadaten für App \"{name}\" gefunden!" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Schlechte Finanzierungsdatei \"{path}\" für \"{name}\" gefunden:" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "Ungültige Appids in Argumenten gefunden" @@ -1202,6 +1252,11 @@ msgstr "Keine angeschlossenen Geräte gefunden" msgid "No commit specified for {versionName} in {linedesc}" msgstr "Kein Commit angegeben für {versionName} in {linedesc}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "No config.yml found, using defaults." +msgstr "Keine 'config.py' gefunden, nutze Standardeinstellungen." + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Kein Fingerabdruck in der URL." @@ -1249,7 +1304,7 @@ msgstr "Kein signiertes Ausgabeverzeichnis - nichts zu tun" msgid "No signing certificates found in {path}" msgstr "Keine Signaturzertifikate in {path} gefunden" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "Kein solches Paket: %s" @@ -1281,6 +1336,11 @@ msgstr "Keine zu erledigenden Aufgaben für {appid}." msgid "Now set these in config.py:" msgstr "Legen Sie diese nun in der config.py fest:" +#: ../fdroidserver/init.py +#, fuzzy +msgid "Now set these in config.yml:" +msgstr "Legen Sie diese nun in der config.py fest:" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1753,6 +1813,11 @@ msgstr "Dieses Repo hat bereits lokale Metadaten: %s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "Um awsbucket zu benutzen, müssen awssecretkey und awsaccesskeyid auch in der config.py gesetzt sein!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Um awsbucket zu benutzen, müssen awssecretkey und awsaccesskeyid auch in der config.py gesetzt sein!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "Die URL muss mit https:// oder http:// beginnen" @@ -1784,6 +1849,11 @@ msgstr "Unerwartetes Lizenz-Tag \"{}\"! Nur Lizenz-Tags verwenden, die in deiner msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "Unerwarteter Text in der gleichen Zeile wie {field} in {linedesc}" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Unbekannter Fehler aufgetreten!" @@ -2676,6 +2746,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "{name} \"{path}\" existiert nicht! Korrigieren Sie es in der config.py." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index 096534f1..c348fb31 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-04 15:47+0000\n" "Last-Translator: fresh \n" "Language-Team: Greek \n" @@ -136,6 +136,10 @@ msgstr "" msgid "'keypass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -144,14 +148,26 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -161,6 +177,10 @@ msgstr "" msgid "'sdk_path' not set in 'config.py'!" msgstr "" +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -275,6 +295,11 @@ msgstr "" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "" +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "" @@ -289,6 +314,11 @@ msgstr "" msgid "Android SDK path '{path}' is not a directory!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -447,6 +477,11 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -465,6 +500,11 @@ msgstr "" msgid "Could not find {path} to remove it" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "" @@ -688,6 +728,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -815,7 +860,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1173,6 +1218,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1219,7 +1268,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1251,6 +1300,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1722,6 +1775,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1752,6 +1809,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Βρέθηκε άγνωστη εξαίρεση!" @@ -2639,6 +2701,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index aba7edc4..5d649ab5 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-11-20 23:28+0000\n" "Last-Translator: Alvaro \n" "Language-Team: Spanish \n" @@ -153,6 +153,11 @@ msgstr "la opción %s no toma un valor" msgid "'keypass' not found in config.py!" msgstr "¡'keypass' no encontrado en config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keypass' not found in config.yml!" +msgstr "¡'keypass' no encontrado en config.py!" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -161,14 +166,29 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "¡'keystore' no encontrado en config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystore' not found in config.yml!" +msgstr "¡'keystore' no encontrado en config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "¡'keystorepass' no encontrado en config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystorepass' not found in config.yml!" +msgstr "¡'keystorepass' no encontrado en config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "¡'repo_keyalias' no encontrado en config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'repo_keyalias' not found in config.yml!" +msgstr "¡'repo_keyalias' no encontrado en config.py!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -178,6 +198,11 @@ msgstr "'required' es un argumento inválido para posicionales" msgid "'sdk_path' not set in 'config.py'!" msgstr "¡'sdk_path' no establecido en 'config.py'!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'sdk_path' not set in config.yml!" +msgstr "¡'sdk_path' no establecido en 'config.py'!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -293,6 +318,11 @@ msgstr "¡No se encontró Android SDK!" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "¡El SDK de Android '{path}' no tiene '{dirname}' instalado!" +#: ../fdroidserver/init.py +#, fuzzy, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "¡No se encontró el SDK de Android!" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "¡No se encontró el SDK de Android!" @@ -307,6 +337,11 @@ msgstr "¡No existe la ruta '{path}' al SDK de Android!" msgid "Android SDK path '{path}' is not a directory!" msgstr "¡La ruta al SDK de Android '{path}' no es un directorio!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "¡No se encontró el SDK de Android!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -465,6 +500,11 @@ msgstr "Aplicar cambios" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -485,6 +525,11 @@ msgstr "No se ha podido encontrar el último nombre de versión" msgid "Could not find {path} to remove it" msgstr "No se pudo encontrar {path} para eliminarlo" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "No se ha podido abrir el archivo apk para analizarlo" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "No se ha podido abrir el archivo apk para analizarlo" @@ -713,6 +758,11 @@ msgstr "" "Introduzca la ruta a Android SDK (%s) aquí:\n" "> " +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -841,7 +891,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1200,6 +1250,11 @@ msgstr "No se han encontrado dispositivos asociados" msgid "No commit specified for {versionName} in {linedesc}" msgstr "No se ha especificado ninguna confirmación para {versionName} en {linedesc}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "No config.yml found, using defaults." +msgstr "No se encontró 'config.py', se usarán los valores predeterminados." + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "No hay huella digital en la URL." @@ -1247,7 +1302,7 @@ msgstr "Sin directorio de salida firmado - nada que hacer" msgid "No signing certificates found in {path}" msgstr "No se ha encontrado ningún certificado de firma en {path}" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "No existe tal paquete: %s" @@ -1279,6 +1334,11 @@ msgstr "Nada que hacer para {appid}." msgid "Now set these in config.py:" msgstr "Ahora establezca lo siguiente en config.py:" +#: ../fdroidserver/init.py +#, fuzzy +msgid "Now set these in config.yml:" +msgstr "Ahora establezca lo siguiente en config.py:" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1751,6 +1811,10 @@ msgstr "Este repo ya tiene metadatos locales: %s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1781,6 +1845,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "¡Se encontró una excepción desconocida!" @@ -2670,6 +2739,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index 201f2518..7745b971 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-12-12 06:36+0000\n" "Last-Translator: Eduardo Rodrigues \n" "Language-Team: Spanish (Argentina) \n" @@ -138,6 +138,10 @@ msgstr "" msgid "'keypass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -146,14 +150,26 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -163,6 +179,10 @@ msgstr "" msgid "'sdk_path' not set in 'config.py'!" msgstr "" +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -280,6 +300,11 @@ msgstr "" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "" +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "" @@ -294,6 +319,11 @@ msgstr "" msgid "Android SDK path '{path}' is not a directory!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -453,6 +483,11 @@ msgstr "Cometer cambios" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -473,6 +508,11 @@ msgstr "Empaquetado con la ultima versión de cada paquete" msgid "Could not find {path} to remove it" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "" @@ -698,6 +738,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -827,7 +872,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1186,6 +1231,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1232,7 +1281,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1264,6 +1313,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1739,6 +1792,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1769,6 +1826,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "¡Se encontró una excepción desconocida!" @@ -2667,6 +2729,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/es_MX/LC_MESSAGES/fdroidserver.po b/locale/es_MX/LC_MESSAGES/fdroidserver.po index fd036b37..4087b201 100644 --- a/locale/es_MX/LC_MESSAGES/fdroidserver.po +++ b/locale/es_MX/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-04-29 12:49+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Spanish (Mexico) \n" @@ -136,6 +136,10 @@ msgstr "" msgid "'keypass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -144,14 +148,26 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -161,6 +177,10 @@ msgstr "" msgid "'sdk_path' not set in 'config.py'!" msgstr "" +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -275,6 +295,11 @@ msgstr "" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "" +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "" @@ -289,6 +314,11 @@ msgstr "" msgid "Android SDK path '{path}' is not a directory!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -447,6 +477,11 @@ msgstr "Hacer Cambios" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -467,6 +502,11 @@ msgstr "No se pudo encontrar el nombre de la última versión" msgid "Could not find {path} to remove it" msgstr "No se pudo encontrar {path} para eliminarlo" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "No se pudo abrir el archivo apk para su análisis" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "No se pudo abrir el archivo apk para su análisis" @@ -691,6 +731,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -818,7 +863,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1176,6 +1221,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1222,7 +1271,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1254,6 +1303,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1725,6 +1778,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1755,6 +1812,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "" @@ -2642,6 +2704,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/eu/LC_MESSAGES/fdroidserver.po b/locale/eu/LC_MESSAGES/fdroidserver.po index d1b2ef99..44613cea 100644 --- a/locale/eu/LC_MESSAGES/fdroidserver.po +++ b/locale/eu/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -134,6 +134,10 @@ msgstr "" msgid "'keypass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -142,14 +146,26 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -159,6 +175,10 @@ msgstr "" msgid "'sdk_path' not set in 'config.py'!" msgstr "" +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -273,6 +293,11 @@ msgstr "" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "" +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "" @@ -287,6 +312,11 @@ msgstr "" msgid "Android SDK path '{path}' is not a directory!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -445,6 +475,11 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -463,6 +498,11 @@ msgstr "" msgid "Could not find {path} to remove it" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "" @@ -686,6 +726,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -813,7 +858,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1171,6 +1216,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1217,7 +1266,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1249,6 +1298,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1720,6 +1773,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1750,6 +1807,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "" @@ -2637,6 +2699,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index 2aeb2d91..9e724d7c 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-10-06 08:26+0000\n" "Last-Translator: Mostafa Ahangarha \n" "Language-Team: Persian \n" @@ -136,6 +136,10 @@ msgstr "" msgid "'keypass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -144,14 +148,26 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -161,6 +177,10 @@ msgstr "" msgid "'sdk_path' not set in 'config.py'!" msgstr "" +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -275,6 +295,11 @@ msgstr "" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "" +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "" @@ -289,6 +314,11 @@ msgstr "" msgid "Android SDK path '{path}' is not a directory!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -447,6 +477,11 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -465,6 +500,11 @@ msgstr "" msgid "Could not find {path} to remove it" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "" @@ -688,6 +728,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -815,7 +860,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1173,6 +1218,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1219,7 +1268,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1251,6 +1300,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1722,6 +1775,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1752,6 +1809,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "خطای ناشناخته‌ای یافت شد!" @@ -2639,6 +2701,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/fdroidserver.pot b/locale/fdroidserver.pot index ee8e533c..f5f6a46b 100644 --- a/locale/fdroidserver.pot +++ b/locale/fdroidserver.pot @@ -5,9 +5,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" +"Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -136,6 +136,10 @@ msgstr "" msgid "'keypass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -144,14 +148,26 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -161,6 +177,10 @@ msgstr "" msgid "'sdk_path' not set in 'config.py'!" msgstr "" +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -275,6 +295,11 @@ msgstr "" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "" +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "" @@ -289,6 +314,11 @@ msgstr "" msgid "Android SDK path '{path}' is not a directory!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -447,6 +477,11 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -465,6 +500,11 @@ msgstr "" msgid "Could not find {path} to remove it" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "" @@ -688,6 +728,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -815,7 +860,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1173,6 +1218,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1219,7 +1268,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1251,6 +1300,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1722,6 +1775,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1752,6 +1809,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "" @@ -2639,6 +2701,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index 87906732..32176349 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -134,6 +134,10 @@ msgstr "" msgid "'keypass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -142,14 +146,26 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -159,6 +175,10 @@ msgstr "" msgid "'sdk_path' not set in 'config.py'!" msgstr "" +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -273,6 +293,11 @@ msgstr "" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "" +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "" @@ -287,6 +312,11 @@ msgstr "" msgid "Android SDK path '{path}' is not a directory!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -445,6 +475,11 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -463,6 +498,11 @@ msgstr "" msgid "Could not find {path} to remove it" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "" @@ -686,6 +726,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -813,7 +858,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1171,6 +1216,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1217,7 +1266,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1249,6 +1298,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1720,6 +1773,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1750,6 +1807,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "" @@ -2637,6 +2699,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 9a64bb35..9aa66493 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -20,7 +20,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-10-08 15:24+0000\n" "Last-Translator: Renaud Perrai \n" "Language-Team: French \n" @@ -162,6 +162,11 @@ msgstr "l'option %s ne prend pas de valeur" msgid "'keypass' not found in config.py!" msgstr "'keypass' non trouvé dans config.py !" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' non trouvé dans config.py !" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' n'est pas utilisé et 'smartcardoptions' est vide !" @@ -170,14 +175,29 @@ msgstr "'keystore' n'est pas utilisé et 'smartcardoptions' est vide !" msgid "'keystore' not found in config.py!" msgstr "'keystore' non trouvé dans config.py !" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystore' not found in config.yml!" +msgstr "'keystore' non trouvé dans config.py !" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "'keystorepass' non trouvé dans config.py !" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' non trouvé dans config.py !" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "'repo_keyalias' non trouvé dans config.py !" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' non trouvé dans config.py !" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -187,6 +207,11 @@ msgstr "'required' est invalide comme argument positionnel" msgid "'sdk_path' not set in 'config.py'!" msgstr "'sdk_path' n'est pas configuré dans 'config.py' !" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'sdk_path' not set in config.yml!" +msgstr "'sdk_path' n'est pas configuré dans 'config.py' !" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -301,6 +326,11 @@ msgstr "Code Android DEX" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "Le SDK Android '{path}' n'a pas '{dirname}' installé !" +#: ../fdroidserver/init.py +#, fuzzy, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "SDK Android introuvable !" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "SDK Android introuvable !" @@ -315,6 +345,11 @@ msgstr "Le SDK Android '{path}' n’existe pas !" msgid "Android SDK path '{path}' is not a directory!" msgstr "Le chemin du SDK Android '{path}' n'est pas un dossier !" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "SDK Android introuvable !" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -473,6 +508,11 @@ msgstr "Sauvegarder les changements (commit)" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Conflit d'arguments : '--verbose' et '--quiet' ne peuvent être choisis en même temps." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -491,6 +531,11 @@ msgstr "Impossible de trouver le nom de la dernière version" msgid "Could not find {path} to remove it" msgstr "Chemin {path} introuvable pour sa suppression" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "Impossible d'ouvrir le fichier apk pour analyse" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "Impossible d'ouvrir le fichier apk pour analyse" @@ -718,6 +763,11 @@ msgstr "" "Entrez le chemin du SDK Android (%s1) :\n" "> " +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -845,7 +895,7 @@ msgstr "« {path} » graphique trouvée sans métadonnées pour l'applicatio msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "Appids invalide trouvée dans l'argument" @@ -1203,6 +1253,11 @@ msgstr "Aucun périphérique connecté trouvé" msgid "No commit specified for {versionName} in {linedesc}" msgstr "Aucun archivage spécifier pour {versionName} dans {linedesc}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "No config.yml found, using defaults." +msgstr "Aucun 'config.py' trouvée, utilisation des originales." + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Aucune empreinte dans l'URL." @@ -1250,7 +1305,7 @@ msgstr "Aucun dossier de sortie signée - rien n'est a faire" msgid "No signing certificates found in {path}" msgstr "Aucun certificat signée trouvée dans {path}" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "Aucun packet comme sa : %s" @@ -1282,6 +1337,11 @@ msgstr "Rien à faire pour {appid}." msgid "Now set these in config.py:" msgstr "Maintenant, définissez-les dans config.py :" +#: ../fdroidserver/init.py +#, fuzzy +msgid "Now set these in config.yml:" +msgstr "Maintenant, définissez-les dans config.py :" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1755,6 +1815,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1786,6 +1850,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Exception inconnue détectée !" @@ -2676,6 +2745,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index a274970b..4057d1a2 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-11-10 16:21+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Hungarian \n" @@ -143,6 +143,11 @@ msgstr "A(z) %s kapcsoló nem fogad értéket" msgid "'keypass' not found in config.py!" msgstr "A „keypass” nem található a config.py fájlban." +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keypass' not found in config.yml!" +msgstr "A „keypass” nem található a config.py fájlban." + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -151,14 +156,29 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "A „keystore” nem található a config.py fájlban." +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystore' not found in config.yml!" +msgstr "A „keystore” nem található a config.py fájlban." + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "A „keystorepass” nem található a config.py fájlban." +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystorepass' not found in config.yml!" +msgstr "A „keystorepass” nem található a config.py fájlban." + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "A „repo_keyalias” nem található a config.py fájlban." +#: ../fdroidserver/common.py +#, fuzzy +msgid "'repo_keyalias' not found in config.yml!" +msgstr "A „repo_keyalias” nem található a config.py fájlban." + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -168,6 +188,11 @@ msgstr "" msgid "'sdk_path' not set in 'config.py'!" msgstr "Az „sdk_path” nincs megadva a „config.py” fájlban." +#: ../fdroidserver/common.py +#, fuzzy +msgid "'sdk_path' not set in config.yml!" +msgstr "Az „sdk_path” nincs megadva a „config.py” fájlban." + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -282,6 +307,11 @@ msgstr "" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "" +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "" @@ -296,6 +326,11 @@ msgstr "" msgid "Android SDK path '{path}' is not a directory!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -454,6 +489,11 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -472,6 +512,11 @@ msgstr "" msgid "Could not find {path} to remove it" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "" @@ -695,6 +740,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -822,7 +872,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1180,6 +1230,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1226,7 +1280,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1258,6 +1312,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1729,6 +1787,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1759,6 +1821,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Ismeretlen kivétel észlelve!" @@ -2646,6 +2713,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index 8cd4c205..a143c28f 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-10-06 08:26+0000\n" "Last-Translator: signz signotorez \n" "Language-Team: Indonesian \n" @@ -134,6 +134,11 @@ msgstr "" msgid "'keypass' not found in config.py!" msgstr "'keypass' tidak ditemukan dalam config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' tidak ditemukan dalam config.py!" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -142,14 +147,29 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "'keystore' tidak ditemukan dalam config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystore' not found in config.yml!" +msgstr "'keystore' tidak ditemukan dalam config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "'keystorepass' tidak ditemukan dalam config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' tidak ditemukan dalam config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "'repo_keyalias' tidak ditemukan dalam config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' tidak ditemukan dalam config.py!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -159,6 +179,11 @@ msgstr "" msgid "'sdk_path' not set in 'config.py'!" msgstr "" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'sdk_path' not set in config.yml!" +msgstr "'keypass' tidak ditemukan dalam config.py!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -273,6 +298,11 @@ msgstr "" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "" +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "" @@ -287,6 +317,11 @@ msgstr "" msgid "Android SDK path '{path}' is not a directory!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -444,6 +479,11 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -462,6 +502,11 @@ msgstr "" msgid "Could not find {path} to remove it" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "" @@ -685,6 +730,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -812,7 +862,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1170,6 +1220,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1216,7 +1270,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1248,6 +1302,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1718,6 +1776,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1748,6 +1810,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Eksepsi tidak ditemukan!" @@ -2632,6 +2699,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 0c731c15..a56673d2 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-12-31 08:12+0000\n" "Last-Translator: random r \n" "Language-Team: Italian \n" @@ -154,6 +154,11 @@ msgstr "l'opzione %s non accetta un valore" msgid "'keypass' not found in config.py!" msgstr "\"keypass\" non trovato in config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keypass' not found in config.yml!" +msgstr "\"keypass\" non trovato in config.py!" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' è NONE e 'smartcardoptions' è vuoto!" @@ -162,14 +167,29 @@ msgstr "'keystore' è NONE e 'smartcardoptions' è vuoto!" msgid "'keystore' not found in config.py!" msgstr "\"keystore\" non trovato in config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystore' not found in config.yml!" +msgstr "\"keystore\" non trovato in config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "\"keystorepass\" non trovato in config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystorepass' not found in config.yml!" +msgstr "\"keystorepass\" non trovato in config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "\"repo_keyalias\" non trovato in config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'repo_keyalias' not found in config.yml!" +msgstr "\"repo_keyalias\" non trovato in config.py!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -179,6 +199,11 @@ msgstr "\"required\" è un argomento invalido per i posizionali" msgid "'sdk_path' not set in 'config.py'!" msgstr "\"sdk_path\" non impostato in \"config.py\"!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'sdk_path' not set in config.yml!" +msgstr "\"sdk_path\" non impostato in \"config.py\"!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -293,6 +318,11 @@ msgstr "Codice DEX Android" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "\"{path}\" dell'Android SDK non ha \"{dirname}\" installato!" +#: ../fdroidserver/init.py +#, fuzzy, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "Android SDK non trovato!" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "Android SDK non trovato!" @@ -307,6 +337,11 @@ msgstr "Il path di Android SDK \"{path}\" non esiste!" msgid "Android SDK path '{path}' is not a directory!" msgstr "Il path di Android SDK \"{path}\" non è una directory!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "Android SDK non trovato!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -465,6 +500,11 @@ msgstr "Cambiamenti del commit" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argomenti in conflitto: '--verbose' e '--quiet' non possono essere specificati contemporaneamente." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -483,6 +523,11 @@ msgstr "Impossibile trovare il nome della versione più recente" msgid "Could not find {path} to remove it" msgstr "Impossibile trovare {path} da rimuovere" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "Impossibile aprire il file apk per l'analisi" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "Impossibile aprire il file apk per l'analisi" @@ -710,6 +755,11 @@ msgstr "" "Inserisci qui il percorso dell'Android SDK (%s):\n" "> " +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -837,7 +887,7 @@ msgstr "Trovato l'elemento grafico \"{path}\" senza metadati per l'app \"{name}\ msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Trovato file di finanziamento non valido \"{path}\" per \"{name}\":" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "Trovati appid non validi negli argomenti" @@ -1195,6 +1245,11 @@ msgstr "Nessun dispositivo collegato trovato" msgid "No commit specified for {versionName} in {linedesc}" msgstr "Nessun commit specificato per {versionName} in {linedesc}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "No config.yml found, using defaults." +msgstr "Nessun 'config.py' trovato, utilizzando i valori predefiniti." + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Nessuna impronta digitale nell'URL." @@ -1241,7 +1296,7 @@ msgstr "Nessuna directory di output firmata - niente da fare" msgid "No signing certificates found in {path}" msgstr "Nessun certificato di firma trovato in {path}" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "Nessun pacchetto di questo tipo: %s" @@ -1273,6 +1328,11 @@ msgstr "Niente da fare per {appid}." msgid "Now set these in config.py:" msgstr "Ora imposta i seguenti campi in config.py:" +#: ../fdroidserver/init.py +#, fuzzy +msgid "Now set these in config.yml:" +msgstr "Ora imposta i seguenti campi in config.py:" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1744,6 +1804,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1774,6 +1838,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Eccezione sconosciuta trovata!" @@ -2661,6 +2730,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index d2465585..8693c81f 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-09-02 16:10+0000\n" "Last-Translator: Hinaloe \n" "Language-Team: Japanese \n" @@ -134,6 +134,10 @@ msgstr "" msgid "'keypass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -142,14 +146,26 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -159,6 +175,10 @@ msgstr "" msgid "'sdk_path' not set in 'config.py'!" msgstr "" +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -273,6 +293,11 @@ msgstr "" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "" +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "" @@ -287,6 +312,11 @@ msgstr "" msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK パス '{path}' はディレクトリではありません!" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -444,6 +474,11 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -462,6 +497,11 @@ msgstr "" msgid "Could not find {path} to remove it" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "" @@ -685,6 +725,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -812,7 +857,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1170,6 +1215,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1216,7 +1265,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1248,6 +1297,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1718,6 +1771,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1748,6 +1805,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "" @@ -2632,6 +2694,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index fd9fd2e3..9c3da3cc 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-10-06 08:26+0000\n" "Last-Translator: Kahina Messaoudi \n" "Language-Team: Kabyle \n" @@ -136,6 +136,11 @@ msgstr "" msgid "'keypass' not found in config.py!" msgstr "'keypass' ulac-it di config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' ulac-it di config.py!" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -144,14 +149,29 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "'keystore' ulac-it di config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystore' not found in config.yml!" +msgstr "'keystore' ulac-it di config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "'keystorepass' ulac-it di config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' ulac-it di config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "'repo_keyalias' ulac-it deg config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' ulac-it deg config.py!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -161,6 +181,11 @@ msgstr "'required' d taɣiret ur iṣeḥḥan ara i usideg" msgid "'sdk_path' not set in 'config.py'!" msgstr "'sdk_path' ur yettwasbadu ara 'config.py'!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'sdk_path' not set in config.yml!" +msgstr "'sdk_path' ur yettwasbadu ara 'config.py'!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -275,6 +300,11 @@ msgstr "" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "" +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "" @@ -289,6 +319,11 @@ msgstr "" msgid "Android SDK path '{path}' is not a directory!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -447,6 +482,11 @@ msgstr "Azen ibeddilen" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -465,6 +505,11 @@ msgstr "Ur izmir ara ad d-yaf isem n lqem aneggaru" msgid "Could not find {path} to remove it" msgstr "" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "Ur yezmir ara a d-ildi afaylu apk i tesleḍt" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "Ur yezmir ara a d-ildi afaylu apk i tesleḍt" @@ -688,6 +733,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -815,7 +865,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1173,6 +1223,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1219,7 +1273,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1251,6 +1305,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1722,6 +1780,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1752,6 +1814,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "" @@ -2639,6 +2706,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index b8c6c8b3..f5fbe4d7 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-11-10 16:20+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Korean \n" @@ -141,6 +141,11 @@ msgstr "%s 옵션은 값을 받지 않습니다" msgid "'keypass' not found in config.py!" msgstr "'keypass'를 config.py에서 찾을 수 없습니다!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keypass' not found in config.yml!" +msgstr "'keypass'를 config.py에서 찾을 수 없습니다!" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -149,14 +154,29 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "'keystore'를 config.py에서 찾을 수 없습니다!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystore' not found in config.yml!" +msgstr "'keystore'를 config.py에서 찾을 수 없습니다!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "'keystorepass'를 config.py에서 찾을 수 없습니다!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass'를 config.py에서 찾을 수 없습니다!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "'repo_keyalias'를 config.py에서 찾을 수 없습니다!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias'를 config.py에서 찾을 수 없습니다!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -166,6 +186,11 @@ msgstr "'required'는 고정적을 위한 잘못된 인수입니다" msgid "'sdk_path' not set in 'config.py'!" msgstr "'sdk_path'를 'config.py'에서 설정할 수 없습니다!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'sdk_path' not set in config.yml!" +msgstr "'sdk_path'를 'config.py'에서 설정할 수 없습니다!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -281,6 +306,11 @@ msgstr "Android SDK를 찾을 수 없습니다!" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "Android SDK '{path}'는 설치된 '{dirname}'가 없습니다!" +#: ../fdroidserver/init.py +#, fuzzy, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "Android SDK를 찾을 수 없습니다!" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "Android SDK를 찾을 수 없습니다!" @@ -295,6 +325,11 @@ msgstr "Android SDK 경로 '{path}'는 존재하지 않습니다!" msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK 경로 '{path}'는 디렉터리가 아닙니다!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "Android SDK를 찾을 수 없습니다!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -452,6 +487,11 @@ msgstr "번경사항 커밋" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -470,6 +510,11 @@ msgstr "" msgid "Could not find {path} to remove it" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "" @@ -693,6 +738,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -820,7 +870,7 @@ msgstr "앱 \"{name}\"를 위한 메타데이터가 없이 \"{path}\" 그래픽 msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1178,6 +1228,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1224,7 +1278,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1256,6 +1310,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1726,6 +1784,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1757,6 +1819,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "알 수 없는 예외가 찾아졌습니다!" @@ -2643,6 +2710,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "{name} \"{path}\"는 존재하지 않습니다! config.py에서 그것을 고치세요." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/ml/LC_MESSAGES/fdroidserver.po b/locale/ml/LC_MESSAGES/fdroidserver.po index e711a5ea..dc65c236 100644 --- a/locale/ml/LC_MESSAGES/fdroidserver.po +++ b/locale/ml/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -135,6 +135,10 @@ msgstr "" msgid "'keypass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -143,14 +147,26 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -160,6 +176,10 @@ msgstr "" msgid "'sdk_path' not set in 'config.py'!" msgstr "" +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -274,6 +294,11 @@ msgstr "" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "" +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "" @@ -288,6 +313,11 @@ msgstr "" msgid "Android SDK path '{path}' is not a directory!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -446,6 +476,11 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -464,6 +499,11 @@ msgstr "" msgid "Could not find {path} to remove it" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "" @@ -687,6 +727,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -814,7 +859,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1172,6 +1217,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1218,7 +1267,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1250,6 +1299,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1721,6 +1774,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1751,6 +1808,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "" @@ -2638,6 +2700,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index d196989d..c2c9222e 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-10-14 09:28+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Norwegian Bokmål \n" @@ -144,6 +144,11 @@ msgstr "%s-valget tar ikke en verdi" msgid "'keypass' not found in config.py!" msgstr "'keypass' ble ikke funnet i config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' ble ikke funnet i config.py!" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -152,14 +157,29 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "'keystore' ble ikke funnet i config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystore' not found in config.yml!" +msgstr "'keystore' ble ikke funnet i config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "'keystorepass' ble ikke funnet i config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' ble ikke funnet i config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "'repo_keyalias' ble ikke funnet i config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' ble ikke funnet i config.py!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, fuzzy @@ -170,6 +190,11 @@ msgstr "'required' er et ugyldig argument for posisjonsinfo" msgid "'sdk_path' not set in 'config.py'!" msgstr "'sdk_path' ble ikke funnet i config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'sdk_path' not set in config.yml!" +msgstr "'sdk_path' ble ikke funnet i config.py!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -286,6 +311,11 @@ msgstr "Fant ingen Android-SDK." msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "Android-SDK '{path}' har ikke '{dirname}' installert." +#: ../fdroidserver/init.py +#, fuzzy, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "Fant ikke Android-SDK!" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "Fant ikke Android-SDK!" @@ -300,6 +330,11 @@ msgstr "Sti for Android-SDK \"{path}\" finnes ikke." msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK-stien '{path}' er ikke ei mappe." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "Fant ikke Android-SDK!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -460,6 +495,11 @@ msgstr "Send inn endringer" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumenter i konflikt: '--verbose' og '--quiet' kan ikke angis samtidig." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -480,6 +520,11 @@ msgstr "Fant ikke seneste versjonsnavn" msgid "Could not find {path} to remove it" msgstr "Fant ikke \"{path}\" for fjerning derav" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "Kunne ikke åpne APK-fil for analyse" + #: ../fdroidserver/update.py #, fuzzy msgid "Could not open apk file for analysis" @@ -718,6 +763,11 @@ msgstr "" "Skriv inn stien til Android SDK (%s) her:\n" "> " +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, fuzzy, python-format @@ -850,7 +900,7 @@ msgstr "Fant \"{path}\"-grafikk uten metadata for programmet \"{name}\"." msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, fuzzy msgid "Found invalid appids in arguments" msgstr "Fant ugyldige App-ID-er i argumenter" @@ -1221,6 +1271,11 @@ msgstr "Fant ingen tilknyttede enheter" msgid "No commit specified for {versionName} in {linedesc}" msgstr "Ingen innsendelse angitt for {versionName} i {linedesc}." +#: ../fdroidserver/common.py +#, fuzzy +msgid "No config.yml found, using defaults." +msgstr "Fant ingen 'config.py' , bruker forvalg." + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Inget fingeravtrykk i nettadresse." @@ -1269,7 +1324,7 @@ msgstr "Ingen signert utdatamappe - ingenting å gjøre" msgid "No signing certificates found in {path}" msgstr "Ingen signeringssertifikater funnet i {path}" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "Ingen slik pakke: %s" @@ -1301,6 +1356,10 @@ msgstr "Ingenting å gjøre for {appid}." msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, fuzzy, python-brace-format @@ -1791,6 +1850,11 @@ msgstr "Denne pakkebrønnen har allerede lokal metadata: %s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "For å bruke AWS-spann, må \"awssecretkey\" og \"awsaccesskeyid\" også være satt i config.py." +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "For å bruke AWS-spann, må \"awssecretkey\" og \"awsaccesskeyid\" også være satt i config.py." + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "Nettadressen må starte med https:// eller http://" @@ -1823,6 +1887,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "Uventet tekst på samme linje som {field} i {linedesc}." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Ukjent unntak møtt!" @@ -2734,6 +2803,11 @@ msgstr "{file} er tom eller skadet!" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "{name} \"{path}\" finnes ikke. Rett det i config.py." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index 541cd10c..99f30655 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-10-01 20:58+0000\n" "Last-Translator: Bart Groeneveld \n" "Language-Team: Dutch \n" @@ -135,6 +135,10 @@ msgstr "" msgid "'keypass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -143,14 +147,26 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -160,6 +176,10 @@ msgstr "" msgid "'sdk_path' not set in 'config.py'!" msgstr "" +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -274,6 +294,11 @@ msgstr "" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "" +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "" @@ -288,6 +313,11 @@ msgstr "" msgid "Android SDK path '{path}' is not a directory!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -447,6 +477,11 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -465,6 +500,11 @@ msgstr "" msgid "Could not find {path} to remove it" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "" @@ -688,6 +728,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -815,7 +860,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1173,6 +1218,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1219,7 +1268,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1251,6 +1300,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1722,6 +1775,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1752,6 +1809,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Onbekende uitzondering gevonden!" @@ -2639,6 +2701,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index fef3f666..7edc6943 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-13 04:41+0000\n" "Last-Translator: Michal L \n" "Language-Team: Polish \n" @@ -149,6 +149,11 @@ msgstr "%s opcja nie przyjmuje wartości" msgid "'keypass' not found in config.py!" msgstr "'keypass' nie znaleziono w config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' nie znaleziono w config.py!" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -157,14 +162,29 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "'Plik kluczy' nie został znaleziony w pliku config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystore' not found in config.yml!" +msgstr "'Plik kluczy' nie został znaleziony w pliku config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "'keystorepass' nie znaleziono w config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' nie znaleziono w config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "'repo_keyalias' nie znaleziono w config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' nie znaleziono w config.py!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -174,6 +194,11 @@ msgstr "'wymagane' jest nieprawidłowym argumentem dla pozycji" msgid "'sdk_path' not set in 'config.py'!" msgstr "'sdk_path' nie jest ustawiony w 'config.py'!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'sdk_path' not set in config.yml!" +msgstr "'sdk_path' nie jest ustawiony w 'config.py'!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -288,6 +313,11 @@ msgstr "Kod DEX Android" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "Android SDK '{path}' nie jest '{dirname}' zainstalowany!" +#: ../fdroidserver/init.py +#, fuzzy, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "Nie znaleziono Android SDK!" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "Nie znaleziono Android SDK!" @@ -302,6 +332,11 @@ msgstr "Android SDK ścieżka '{path}' nie istnieje!" msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK ścieżka '{path}' nie jest katalogiem!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "Nie znaleziono Android SDK!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -461,6 +496,11 @@ msgstr "Zatwierdź zmiany" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Sprzeczne argumenty: '--verbose' i '--quiet' nie mogą być podane w tym samym czasie." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -479,6 +519,11 @@ msgstr "Nie można odnaleźć nazwy najnowszej wersji" msgid "Could not find {path} to remove it" msgstr "Nie można znaleźć pliku {path}, aby go usunąć" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "Nie można otworzyć pliku APK do analizy" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "Nie można otworzyć pliku APK do analizy" @@ -706,6 +751,11 @@ msgstr "" "Podaj ścieżkę do zestawu SDK systemu Android (%s) tutaj:\n" " > " +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -834,7 +884,7 @@ msgstr "Znaleziono \"{path}\" grafiki bez metadanych dla aplikacji \"{name}\"!" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "Znaleziono nieprawidłowe pliki w argumentach" @@ -1193,6 +1243,11 @@ msgstr "Nie znaleziono podłączonych urządzeń" msgid "No commit specified for {versionName} in {linedesc}" msgstr "Nie określono zatwierdzenia dla {versionName} w {linedesc}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "No config.yml found, using defaults." +msgstr "Nie znaleziono pliku 'config.py', używając wartości domyślnych." + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Brak odcisku palca w adresie URL." @@ -1239,7 +1294,7 @@ msgstr "Brak podpisanego katalogu wyjściowego - nic nie można zrobić" msgid "No signing certificates found in {path}" msgstr "Nie znaleziono certyfikatów do podpisu w {path}" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "Brak takiego pakietu: %s" @@ -1271,6 +1326,11 @@ msgstr "Nic nie robić w {appid}." msgid "Now set these in config.py:" msgstr "Teraz ustaw je w config.py:" +#: ../fdroidserver/init.py +#, fuzzy +msgid "Now set these in config.yml:" +msgstr "Teraz ustaw je w config.py:" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1744,6 +1804,11 @@ msgstr "To repo ma już lokalne metadane: %s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "Aby użyć awsbucket, awssecretkey i awsaccesskeyid muszą być również ustawione w config.py!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Aby użyć awsbucket, awssecretkey i awsaccesskeyid muszą być również ustawione w config.py!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "Adres URL musi rozpoczynać się od https:// lub http://" @@ -1774,6 +1839,11 @@ msgstr "Nieprawidłowy tag licencji \"{}\"! Używaj tylko tagów licencji skonfi msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "Nieoczekiwany tekst w tej samej linii co {field} w {linedesc}" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Znaleziono nieznany wyjątek!" @@ -2669,6 +2739,11 @@ msgstr "{file} jest pusty lub uszkodzony!" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "{name} \"{path}\" nie istnieje! Popraw go w config.py." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 5852ac61..bc896450 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-10-26 07:26+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" @@ -147,6 +147,11 @@ msgstr "opção %s não leva um valor" msgid "'keypass' not found in config.py!" msgstr "'keypass' não foi encontrada em config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' não foi encontrada em config.py!" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "\"keystore\" é NONE e \"smartcardoptions\" está vazio!" @@ -155,14 +160,29 @@ msgstr "\"keystore\" é NONE e \"smartcardoptions\" está vazio!" msgid "'keystore' not found in config.py!" msgstr "'keystore' não encontrada em config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystore' not found in config.yml!" +msgstr "'keystore' não encontrada em config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "'keystorepass' não encontrada em config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' não encontrada em config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "'repo_keyalias' não encontrada em config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' não encontrada em config.py!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -172,6 +192,11 @@ msgstr "'required' é um argumento inválido para posicionadores" msgid "'sdk_path' not set in 'config.py'!" msgstr "'sdk_path' não definido em 'config.py'!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'sdk_path' not set in config.yml!" +msgstr "'sdk_path' não definido em 'config.py'!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -286,6 +311,11 @@ msgstr "Código DEX do Android" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "O SDK Android '{path}' não tem '{dirname}' instalado!" +#: ../fdroidserver/init.py +#, fuzzy, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "SDK do Android não foi encontrado!" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "SDK do Android não foi encontrado!" @@ -300,6 +330,11 @@ msgstr "O caminho do SDK Android '{path}' não existe!" msgid "Android SDK path '{path}' is not a directory!" msgstr "O caminho do SDK Android '{path}' não é um diretório!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "SDK do Android não foi encontrado!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -458,6 +493,11 @@ msgstr "Enviar mudanças" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumentos conflitantes: \"--verbose\" e \"--quiet\" não podem ser especificados ao mesmo tempo." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -476,6 +516,11 @@ msgstr "Não foi possível encontrar o nome da versão mais recente" msgid "Could not find {path} to remove it" msgstr "Não foi possível localizar {path} para removê-lo" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "Não foi possível abrir ficheiro apk para análise" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "Não foi possível abrir ficheiro apk para análise" @@ -703,6 +748,11 @@ msgstr "" "Digite o caminho para o SDK do Android (%s) aqui:\n" "> " +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -830,7 +880,7 @@ msgstr "\"{path}\" gráfico encontrado sem metadados para o app \"{name}\"!" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Ficheiro de financiamento ruim \"{path}\" encontrado para \"{name}\":" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "appids inválidos encontrados em argumentos" @@ -1188,6 +1238,11 @@ msgstr "Nenhum aparelho anexado encontrado" msgid "No commit specified for {versionName} in {linedesc}" msgstr "Nenhum commit especificado para {versionName} em {linedesc}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "No config.yml found, using defaults." +msgstr "'config.py' não encontrado, utilizando as predefinições." + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Nenhuma impressão digital no URL." @@ -1234,7 +1289,7 @@ msgstr "Nenhum diretório de saída assinado - nada a fazer" msgid "No signing certificates found in {path}" msgstr "Nenhum certificado de assinatura encontrado em {path}" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "Nenhum pacote desses: %s" @@ -1266,6 +1321,11 @@ msgstr "Nada a fazer para {appid}." msgid "Now set these in config.py:" msgstr "Agora configure estes em config.py:" +#: ../fdroidserver/init.py +#, fuzzy +msgid "Now set these in config.yml:" +msgstr "Agora configure estes em config.py:" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1737,6 +1797,11 @@ msgstr "Este repositório já tem metadados locais: %s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.py!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.py!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "A URL deve começar com https:// ou http://" @@ -1767,6 +1832,11 @@ msgstr "Etiqueta de licença \"{}\" inesperada! Use somente as etiquetas de lice msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "Texto inesperado na mesma linha como {field} em {linedesc}" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Exceção desconhecida!" @@ -2654,6 +2724,11 @@ msgstr "{file} está em branco ou corrompido!" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "{name} \"{path}\" não existe! Corrija-o no config.py." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 2776035d..4b63dd12 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-11-09 19:08+0000\n" "Last-Translator: The Cats \n" "Language-Team: Portuguese (Brazil) \n" @@ -153,6 +153,11 @@ msgstr "opção %s não leva um valor" msgid "'keypass' not found in config.py!" msgstr "'keypass' não foi encontrada em config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' não foi encontrada em config.py!" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "\"keystore\" é NONE e \"smartcardoptions\" está vazia!" @@ -161,14 +166,29 @@ msgstr "\"keystore\" é NONE e \"smartcardoptions\" está vazia!" msgid "'keystore' not found in config.py!" msgstr "'keystore' não encontrada em config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystore' not found in config.yml!" +msgstr "'keystore' não encontrada em config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "'keystorepass' não encontrada em config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' não encontrada em config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "'repo_keyalias' não encontrada em config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' não encontrada em config.py!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -178,6 +198,11 @@ msgstr "'required' é um argumento inválido para posicionadores" msgid "'sdk_path' not set in 'config.py'!" msgstr "'sdk_path' não definido em 'config.py'!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'sdk_path' not set in config.yml!" +msgstr "'sdk_path' não definido em 'config.py'!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -292,6 +317,11 @@ msgstr "Código DEX do Android" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "O SDK Android '{path}' não tem '{dirname}' instalado!" +#: ../fdroidserver/init.py +#, fuzzy, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "SDK do Android não foi encontrado!" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "SDK do Android não foi encontrado!" @@ -306,6 +336,11 @@ msgstr "O caminho do SDK Android '{path}' não existe!" msgid "Android SDK path '{path}' is not a directory!" msgstr "O caminho do SDK Android '{path}' não é um diretório!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "SDK do Android não foi encontrado!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -464,6 +499,11 @@ msgstr "Enviar mudanças" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumentos conflitantes: \"--verbose\" e \"--quiet\" não podem ser especificados ao mesmo tempo." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -482,6 +522,11 @@ msgstr "Não foi possível encontrar o nome da versão mais recente" msgid "Could not find {path} to remove it" msgstr "Impossível encontrar {path} para removê-lo" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "Impossível abrir o arquivo de APK para analisá-lo" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "Impossível abrir o arquivo de APK para analisá-lo" @@ -709,6 +754,11 @@ msgstr "" "Digite o caminho para o Android SDK (%s) aqui:\n" "> " +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -836,7 +886,7 @@ msgstr "Foi encontrado o gráfico \"{path}\" sem metadados para o aplicativo \"{ msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Encontrado arquivo inválido \"{path}\" de financiamento para \"{name}\":" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "Encontrou aplicativos inválidos em argumentos" @@ -1194,6 +1244,11 @@ msgstr "Nenhum dispositivo conectado encontrado" msgid "No commit specified for {versionName} in {linedesc}" msgstr "Nenhum commit especificado para {versionName} em {linedesc}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "No config.yml found, using defaults." +msgstr "Nenhum 'config.py' encontrado, usando padrões." + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Nenhuma impressão digital (fingerprint) no URL." @@ -1240,7 +1295,7 @@ msgstr "Nenhum diretório de saída assinado - nada a fazer" msgid "No signing certificates found in {path}" msgstr "Nenhum certificado de assinatura encontrado em {path}" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "Nenhum pacote desse tipo: %s" @@ -1272,6 +1327,11 @@ msgstr "Nada a fazer para {appid}." msgid "Now set these in config.py:" msgstr "Agora defina estes em config.py:" +#: ../fdroidserver/init.py +#, fuzzy +msgid "Now set these in config.yml:" +msgstr "Agora defina estes em config.py:" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1743,6 +1803,11 @@ msgstr "Este repositório já tem metadados locais: %s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.py!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.py!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "A URL deve começar com https:// ou http://" @@ -1773,6 +1838,11 @@ msgstr "A etiqueta da licença foi inesperada \"{}\"! Use apenas as etiquetas co msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "Texto inesperado na mesma linha como {field} em {linedesc}" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Exceção desconhecida encontrada!" @@ -2660,6 +2730,11 @@ msgstr "o {file} está vazio ou está corrompido!" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "{name} \"{path}\" não existe! Corrija-o no config.py." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 906dc132..ef1496ae 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-10-26 07:26+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" @@ -150,6 +150,11 @@ msgstr "opção %s não leva um valor" msgid "'keypass' not found in config.py!" msgstr "'keypass' não foi encontrada em config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' não foi encontrada em config.py!" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "\"keystore\" é NONE e \"smartcardoptions\" está vazio!" @@ -158,14 +163,29 @@ msgstr "\"keystore\" é NONE e \"smartcardoptions\" está vazio!" msgid "'keystore' not found in config.py!" msgstr "'keystore' não encontrada em config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystore' not found in config.yml!" +msgstr "'keystore' não encontrada em config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "'keystorepass' não encontrada em config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' não encontrada em config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "'repo_keyalias' não encontrada em config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' não encontrada em config.py!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -175,6 +195,11 @@ msgstr "'required' é um argumento inválido para posicionadores" msgid "'sdk_path' not set in 'config.py'!" msgstr "'sdk_path' não definido em 'config.py'!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'sdk_path' not set in config.yml!" +msgstr "'sdk_path' não definido em 'config.py'!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -289,6 +314,11 @@ msgstr "Código DEX do Android" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "O SDK Android '{path}' não tem '{dirname}' instalado!" +#: ../fdroidserver/init.py +#, fuzzy, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "SDK do Android não foi encontrado!" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "SDK do Android não foi encontrado!" @@ -303,6 +333,11 @@ msgstr "O caminho do SDK Android '{path}' não existe!" msgid "Android SDK path '{path}' is not a directory!" msgstr "O caminho do SDK Android '{path}' não é um diretório!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "SDK do Android não foi encontrado!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -461,6 +496,11 @@ msgstr "Enviar mudanças" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumentos conflitantes: \"--verbose\" e \"--quiet\" não podem ser especificados ao mesmo tempo." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -479,6 +519,11 @@ msgstr "Não foi possível encontrar o nome da versão mais recente" msgid "Could not find {path} to remove it" msgstr "Não foi possível localizar {path} para removê-lo" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "Não foi possível abrir ficheiro apk para análise" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "Não foi possível abrir ficheiro apk para análise" @@ -706,6 +751,11 @@ msgstr "" "Digite o caminho para o SDK do Android (%s) aqui:\n" "> " +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -833,7 +883,7 @@ msgstr "\"{path}\" gráfico encontrado sem metadados para o app \"{name}\"!" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Ficheiro de financiamento ruim \"{path}\" encontrado para \"{name}\":" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "appids inválidos encontrados em argumentos" @@ -1191,6 +1241,11 @@ msgstr "Nenhum aparelho anexado encontrado" msgid "No commit specified for {versionName} in {linedesc}" msgstr "Nenhum commit especificado para {versionName} em {linedesc}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "No config.yml found, using defaults." +msgstr "'config.py' não encontrado, utilizando as predefinições." + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Nenhuma impressão digital no URL." @@ -1237,7 +1292,7 @@ msgstr "Nenhum diretório de saída assinado - nada a fazer" msgid "No signing certificates found in {path}" msgstr "Nenhum certificado de assinatura encontrado em {path}" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "Nenhum pacote desses: %s" @@ -1269,6 +1324,11 @@ msgstr "Nada a fazer para {appid}." msgid "Now set these in config.py:" msgstr "Agora configure estes em config.py:" +#: ../fdroidserver/init.py +#, fuzzy +msgid "Now set these in config.yml:" +msgstr "Agora configure estes em config.py:" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1740,6 +1800,11 @@ msgstr "Este repositório já tem metadados locais: %s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.py!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.py!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "A URL deve começar com https:// ou http://" @@ -1770,6 +1835,11 @@ msgstr "Etiqueta de licença \"{}\" inesperada! Use somente as etiquetas de lice msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "Texto inesperado na mesma linha como {field} em {linedesc}" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Exceção desconhecida!" @@ -2657,6 +2727,11 @@ msgstr "{file} está em branco ou corrompido!" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "{name} \"{path}\" não existe! Corrija-o no config.py." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 6267c133..5cdba1ad 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-12-23 21:25+0000\n" "Last-Translator: Golubev Alexander \n" "Language-Team: Russian \n" @@ -156,6 +156,11 @@ msgstr "%s параметр не принимает значений" msgid "'keypass' not found in config.py!" msgstr "В config.py нет переменной 'keypass'!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keypass' not found in config.yml!" +msgstr "В config.py нет переменной 'keypass'!" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "Значение 'keystore` — NONE, но 'smartcardoptions' не задан!" @@ -164,14 +169,29 @@ msgstr "Значение 'keystore` — NONE, но 'smartcardoptions' не за msgid "'keystore' not found in config.py!" msgstr "В config.py нет переменной 'keystore'!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystore' not found in config.yml!" +msgstr "В config.py нет переменной 'keystore'!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "В config.py нет переменной 'keystorepass'!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystorepass' not found in config.yml!" +msgstr "В config.py нет переменной 'keystorepass'!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "В config.py нет переменной 'repo_ keyalias'!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'repo_keyalias' not found in config.yml!" +msgstr "В config.py нет переменной 'repo_ keyalias'!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -181,6 +201,11 @@ msgstr "'required' не годится в качестве позиционно msgid "'sdk_path' not set in 'config.py'!" msgstr "В config.py не определен 'sdk_path'!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'sdk_path' not set in config.yml!" +msgstr "В config.py не определен 'sdk_path'!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -295,6 +320,11 @@ msgstr "DEX-код Android" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "В установленной Android SDK '{path}' нет '{dirname}'!" +#: ../fdroidserver/init.py +#, fuzzy, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "Android SDK не обнаружен!" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "Android SDK не обнаружен!" @@ -309,6 +339,11 @@ msgstr "Android SDK '{path}' нет в переменных окружения!" msgid "Android SDK path '{path}' is not a directory!" msgstr "Путь Android SDK '{path}' указывает не на директорию!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "Android SDK не обнаружен!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -468,6 +503,11 @@ msgstr "Сохранить изменения (commit)" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Несовместимые аргументы: '--verbose' и '--quiet' нельзя указывать одновременно." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -486,6 +526,11 @@ msgstr "Не удалось найти название последней ве msgid "Could not find {path} to remove it" msgstr "Указанный для удаления {path} не найден" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "Не удалось открыть и проанализировать файл APK" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "Не удалось открыть и проанализировать файл APK" @@ -713,6 +758,11 @@ msgstr "" "Укажите путь к Android SDK (%s): \n" "> " +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -840,7 +890,7 @@ msgstr "В \"{path}\" обнаружены изображения без мет msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Обнаружен неверный файл финансирования \"{path}\" для \"{name}\":" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "В аргументах обнаружены неправильные appid" @@ -1198,6 +1248,11 @@ msgstr "Подключенных устройств не найдено" msgid "No commit specified for {versionName} in {linedesc}" msgstr "Не выбраны коммиты для {versionName} в {linedesc}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "No config.yml found, using defaults." +msgstr "Файл 'config.py' не обнаружен. Используется конфигурация по умолчанию." + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "URL-адрес не содержит идентификационной метки (fingerprint)." @@ -1244,7 +1299,7 @@ msgstr "Директории с данными для подписывания msgid "No signing certificates found in {path}" msgstr "В {path} не обнаружены сертификаты для подписывания" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "Такого пакета не существует: %s" @@ -1276,6 +1331,11 @@ msgstr "Автоматические обновления для {appid} нед msgid "Now set these in config.py:" msgstr "Определите эти переменные в config.py:" +#: ../fdroidserver/init.py +#, fuzzy +msgid "Now set these in config.yml:" +msgstr "Определите эти переменные в config.py:" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1748,6 +1808,11 @@ msgstr "Локальная копия метаданных репозитори msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "Необходимо определить переменные awsbucket, awssecretkey и awsaccesskeyid в config.py!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Необходимо определить переменные awsbucket, awssecretkey и awsaccesskeyid в config.py!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL должна начинаться с https:// или http://" @@ -1778,6 +1843,11 @@ msgstr "Неожиданная метка лицензии: \"{}\"! Исполь msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "Лишний текст в той же строчке, что и {field} в {linedesc}" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Произошла неизвестная ошибка!" @@ -2668,6 +2738,11 @@ msgstr "{file} пустой или повреждённый!" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "{name}: неверный путь \"{path}\"! Поправьте его в config.py." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/sk/LC_MESSAGES/fdroidserver.po b/locale/sk/LC_MESSAGES/fdroidserver.po index 07e91cbd..ca6ea1d4 100644 --- a/locale/sk/LC_MESSAGES/fdroidserver.po +++ b/locale/sk/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -135,6 +135,10 @@ msgstr "" msgid "'keypass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -143,14 +147,26 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -160,6 +176,10 @@ msgstr "" msgid "'sdk_path' not set in 'config.py'!" msgstr "" +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -274,6 +294,11 @@ msgstr "" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "" +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "" @@ -288,6 +313,11 @@ msgstr "" msgid "Android SDK path '{path}' is not a directory!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -447,6 +477,11 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -465,6 +500,11 @@ msgstr "" msgid "Could not find {path} to remove it" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "" @@ -688,6 +728,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -815,7 +860,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1173,6 +1218,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1219,7 +1268,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1251,6 +1300,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1723,6 +1776,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1753,6 +1810,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "" @@ -2643,6 +2705,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index 15af277f..f29961f1 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-13 04:41+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" @@ -148,6 +148,11 @@ msgstr "Mundësia %s s’merr ndonjë vlerë" msgid "'keypass' not found in config.py!" msgstr "S’u gjet 'keypass' në config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keypass' not found in config.yml!" +msgstr "S’u gjet 'keypass' në config.py!" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' është NONE dhe 'smartcardoptions' është e zbrazët!" @@ -156,14 +161,29 @@ msgstr "'keystore' është NONE dhe 'smartcardoptions' është e zbrazët!" msgid "'keystore' not found in config.py!" msgstr "S’u gjet 'keystore' në config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystore' not found in config.yml!" +msgstr "S’u gjet 'keystore' në config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "S’u gjet 'keystorepass' te config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystorepass' not found in config.yml!" +msgstr "S’u gjet 'keystorepass' te config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "S’u gjet 'repo_keyalias' te config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'repo_keyalias' not found in config.yml!" +msgstr "S’u gjet 'repo_keyalias' te config.py!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -173,6 +193,11 @@ msgstr "'required' është argument i pavlefshëm për pozicionalë" msgid "'sdk_path' not set in 'config.py'!" msgstr "'sdk_path' te 'config.py' s’është ujdisur!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'sdk_path' not set in config.yml!" +msgstr "'sdk_path' te 'config.py' s’është ujdisur!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -287,6 +312,11 @@ msgstr "Kod DEX Android" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "Android SDK '{path}' s’ka '{dirname}' të instaluar!" +#: ../fdroidserver/init.py +#, fuzzy, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "S’u gjet SDK Android-i!" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "S’u gjet SDK Android-i!" @@ -301,6 +331,11 @@ msgstr "Shtegu Android SDK '{path}' s’ekziston!" msgid "Android SDK path '{path}' is not a directory!" msgstr "Shtegu Android SDK '{path}' s’është drejtori!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "S’u gjet SDK Android-i!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -459,6 +494,11 @@ msgstr "Depozito ndryshimet" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumente që përplasen: '--verbose' dhe '--quiet' s’mund të përdoren në të njëjtën kohë." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -477,6 +517,11 @@ msgstr "S’ u gjet dot emër i versionit më të ri" msgid "Could not find {path} to remove it" msgstr "S’u gjet dot {path} për ta hequr" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "S’u hap dot kartela apk për analizim" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "S’u hap dot kartela apk për analizim" @@ -704,6 +749,11 @@ msgstr "" "Jepni shtegun për te Android SDK (%s) këtu:\n" "> " +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -831,7 +881,7 @@ msgstr "U gjet grafik \"{path}\" pa tejtëdhëna për aplikacionin \"{name}\"!" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "U gjetën appid-e të pavlefshëm te argumente" @@ -1189,6 +1239,11 @@ msgstr "S’u gjetën pajisje të bashkëngjitura" msgid "No commit specified for {versionName} in {linedesc}" msgstr "Te {linedesc} s’ka parashtrim të specifikuar për {versionName}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "No config.yml found, using defaults." +msgstr "S’u gjet 'config.py', po përdoren parazgjedhjet." + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "S’ka shenja gishtash te URL-ja." @@ -1236,7 +1291,7 @@ msgstr "S’ka drejtori output-i të nënshkruar - s’ka ç’bëhet" msgid "No signing certificates found in {path}" msgstr "S’u gjetën dëshmi nënshkrimi te {path}" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "S’ka paketë të tillë: %s" @@ -1268,6 +1323,11 @@ msgstr "S’ka ç’bëhet për {appid}." msgid "Now set these in config.py:" msgstr "Tani, ujdisini këto te config.py:" +#: ../fdroidserver/init.py +#, fuzzy +msgid "Now set these in config.yml:" +msgstr "Tani, ujdisini këto te config.py:" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1739,6 +1799,11 @@ msgstr "Kjo depo ka tashmë tejtëdhëna vendore: %s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "Për të përdorur awsbucket, te config.py duhen ujdisur edhe awssecretkey dhe awsaccesskey!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Për të përdorur awsbucket, te config.py duhen ujdisur edhe awssecretkey dhe awsaccesskey!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL-ja duhet të fillojë me https:// ose http://" @@ -1769,6 +1834,11 @@ msgstr "Etiketë e papritur licence \"{}\"! Përdorni vetëm etiketa licencash t msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "Tekst i papritur në të njëjtin rresht me {field} te {linedesc}" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "U gjet përjashtim i panjohur!" @@ -2656,6 +2726,11 @@ msgstr "{file} është e zbrazët ose e dëmtuar!" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "{name} \"{path}\" s’ekziston! Ndreqeni te config.py." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index d3e6bac7..cc3bda4a 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-11-10 16:21+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Swedish \n" @@ -135,6 +135,10 @@ msgstr "" msgid "'keypass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -143,14 +147,26 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -160,6 +176,10 @@ msgstr "" msgid "'sdk_path' not set in 'config.py'!" msgstr "" +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -274,6 +294,11 @@ msgstr "" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "" +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "" @@ -288,6 +313,11 @@ msgstr "" msgid "Android SDK path '{path}' is not a directory!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -446,6 +476,11 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -464,6 +499,11 @@ msgstr "" msgid "Could not find {path} to remove it" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "" @@ -687,6 +727,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -814,7 +859,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1172,6 +1217,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1218,7 +1267,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1250,6 +1299,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1721,6 +1774,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1751,6 +1808,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Okänt undantag hittades!" @@ -2638,6 +2700,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index 6647b393..210820a6 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-10-22 17:26+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" @@ -147,6 +147,11 @@ msgstr "%s seçeneği bir değer almaz" msgid "'keypass' not found in config.py!" msgstr "'keypass' config.py içinde bulunamadı!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' config.py içinde bulunamadı!" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' seçeneği NONE ve 'smartcardoptions' seçeneği boş!" @@ -155,14 +160,29 @@ msgstr "'keystore' seçeneği NONE ve 'smartcardoptions' seçeneği boş!" msgid "'keystore' not found in config.py!" msgstr "'keystore' config.py içinde bulunamadı!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystore' not found in config.yml!" +msgstr "'keystore' config.py içinde bulunamadı!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "'keystorepass' config.py içinde bulunamadı!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' config.py içinde bulunamadı!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "'repo_keyalias' config.py içinde bulunamadı!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' config.py içinde bulunamadı!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -172,6 +192,11 @@ msgstr "'required' positionals için geçersiz bir argüman" msgid "'sdk_path' not set in 'config.py'!" msgstr "'sdk_path' 'config.py' içinde ayarlı değil!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'sdk_path' not set in config.yml!" +msgstr "'sdk_path' 'config.py' içinde ayarlı değil!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -286,6 +311,11 @@ msgstr "Android DEX kodu" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "Android SDK '{path}' içinde '{dirname}' kurulu değil!" +#: ../fdroidserver/init.py +#, fuzzy, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "Android SDK bulunamadı!" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "Android SDK bulunamadı!" @@ -300,6 +330,11 @@ msgstr "Android SDK konumu '{path}' yok!" msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK yolu '{path}' bir dizin değil!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "Android SDK bulunamadı!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -458,6 +493,11 @@ msgstr "Değişiklikleri işle" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Çakışan argümanlar: '--verbose' ve '--quiet' aynı anda belirtilemez." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -476,6 +516,11 @@ msgstr "Son sürüm adı bulunamadı" msgid "Could not find {path} to remove it" msgstr "Kaldırmak için {path} bulunamadı" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "İnceleme için apk dosyası açılamadı" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "İnceleme için apk dosyası açılamadı" @@ -703,6 +748,11 @@ msgstr "" "Android SDK (%s) konumunu buraya girin:\n" "> " +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -830,7 +880,7 @@ msgstr "\"{name}\" uygulaması için üst verisi olmayan \"{path}\" grafiği bul msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "\"{name}\" için hatalı ödeme dosyası \"{path}\" bulundu:" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "Argümanda geçersiz appid'ler bulundu" @@ -1188,6 +1238,11 @@ msgstr "Bağlı aygıt bulunamadı" msgid "No commit specified for {versionName} in {linedesc}" msgstr "{linedesc} içindeki {versionName} için belirtilen işleme yok" +#: ../fdroidserver/common.py +#, fuzzy +msgid "No config.yml found, using defaults." +msgstr "'config.py' bulunamadı, öntanımlılar kullanılıyor." + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "URL'de parmak izi yok." @@ -1234,7 +1289,7 @@ msgstr "İmzalanmış çıktı dizini yok - yapılacak işlem yok" msgid "No signing certificates found in {path}" msgstr "{path} içinde imzalama sertifikaları bulunamadı" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "Böyle bir paket yok: %s" @@ -1266,6 +1321,11 @@ msgstr "{appid} için yapılacak işlem yok." msgid "Now set these in config.py:" msgstr "Şimdi bunları config.py içinde ayarlayın:" +#: ../fdroidserver/init.py +#, fuzzy +msgid "Now set these in config.yml:" +msgstr "Şimdi bunları config.py içinde ayarlayın:" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1737,6 +1797,11 @@ msgstr "Bu deponun zaten yerel üst verisi var: %s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "Awsbucket kullanmak için, awssecretkey ve awsaccesskeyid de config.py içinde ayarlanmalı!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Awsbucket kullanmak için, awssecretkey ve awsaccesskeyid de config.py içinde ayarlanmalı!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL https:// veya http:// ile başlamalı" @@ -1767,6 +1832,11 @@ msgstr "Beklenmeyen lisans etiketi \"{}\"! Yalnızca yapılandırma dosyanızda msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "{linedesc} içinde {field} ile aynı satırda beklenmeyen metin" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Bilinmeyen özel durum bulundu!" @@ -2654,6 +2724,11 @@ msgstr "{file} boş veya bozuk!" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "{name} \"{path}\" yok! config.py içinde düzeltin." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/tzm/LC_MESSAGES/fdroidserver.po b/locale/tzm/LC_MESSAGES/fdroidserver.po index f6b4dabe..db122a0a 100644 --- a/locale/tzm/LC_MESSAGES/fdroidserver.po +++ b/locale/tzm/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-681-gc19e8952\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-10-29 08:32+0000\n" "Last-Translator: Hakim Oubouali \n" "Language-Team: Central Atlas Tamazight \n" @@ -135,6 +135,10 @@ msgstr "" msgid "'keypass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -143,14 +147,26 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -160,6 +176,10 @@ msgstr "" msgid "'sdk_path' not set in 'config.py'!" msgstr "" +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -274,6 +294,11 @@ msgstr "" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "" +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "" @@ -288,6 +313,11 @@ msgstr "" msgid "Android SDK path '{path}' is not a directory!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -446,6 +476,11 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -464,6 +499,11 @@ msgstr "" msgid "Could not find {path} to remove it" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "" @@ -687,6 +727,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -814,7 +859,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1172,6 +1217,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1218,7 +1267,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1250,6 +1299,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1721,6 +1774,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1751,6 +1808,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "" @@ -2638,6 +2700,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/ug/LC_MESSAGES/fdroidserver.po b/locale/ug/LC_MESSAGES/fdroidserver.po index c3fa98a6..1e47a2f9 100644 --- a/locale/ug/LC_MESSAGES/fdroidserver.po +++ b/locale/ug/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2018-06-08 03:44+0000\n" "Last-Translator: ۋولقان \n" "Language-Team: Uyghur \n" @@ -136,6 +136,10 @@ msgstr "" msgid "'keypass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -144,14 +148,26 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "" +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -161,6 +177,10 @@ msgstr "" msgid "'sdk_path' not set in 'config.py'!" msgstr "" +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -275,6 +295,11 @@ msgstr "" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "" +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "" @@ -289,6 +314,11 @@ msgstr "" msgid "Android SDK path '{path}' is not a directory!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -447,6 +477,11 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -465,6 +500,11 @@ msgstr "" msgid "Could not find {path} to remove it" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "" @@ -688,6 +728,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -815,7 +860,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1173,6 +1218,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1219,7 +1268,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1251,6 +1300,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1722,6 +1775,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1752,6 +1809,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "" @@ -2639,6 +2701,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index d99bb4b9..5e117d08 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-12-08 12:29+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" @@ -150,6 +150,11 @@ msgstr "%s параметр не приймає значення" msgid "'keypass' not found in config.py!" msgstr "'keypass' не знайдено в config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' не знайдено в config.py!" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' — NONE і 'smartcardoptions' порожній!" @@ -158,14 +163,29 @@ msgstr "'keystore' — NONE і 'smartcardoptions' порожній!" msgid "'keystore' not found in config.py!" msgstr "'keystore' не знайдено в config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystore' not found in config.yml!" +msgstr "'keystore' не знайдено в config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "'keystorepass' не знайдено в config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' не знайдено в config.py!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "'repo_keyalias' не знайдено в config.py!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' не знайдено в config.py!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -175,6 +195,11 @@ msgstr "'required' недійсний аргумент для позицій" msgid "'sdk_path' not set in 'config.py'!" msgstr "'sdk_path' не встановлено в 'config.py'!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'sdk_path' not set in config.yml!" +msgstr "'sdk_path' не встановлено в 'config.py'!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -289,6 +314,11 @@ msgstr "Код Android DEX" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "Android SDK '{path}' '{dirname}' не встановлено!" +#: ../fdroidserver/init.py +#, fuzzy, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "Android SDK не знайдено!" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "Android SDK не знайдено!" @@ -303,6 +333,11 @@ msgstr "Android SDK шлях '{path}' не існує!" msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK шлях '{path}' це не каталог!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "Android SDK не знайдено!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -462,6 +497,11 @@ msgstr "Прийняти зміни" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Конфліктні аргументи: \"---verbose\" і \"--quiet\" не можна вказати одночасно." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -480,6 +520,11 @@ msgstr "Не вдалося знайти найновішу назву верс msgid "Could not find {path} to remove it" msgstr "Не вдалося знайти шлях {path}, щоб вилучити його" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "Не вдалося відкрити файл apk для аналізу" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "Не вдалося відкрити файл apk для аналізу" @@ -707,6 +752,11 @@ msgstr "" "Введіть шлях до Android SDK (%s) тут:\n" "> " +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -834,7 +884,7 @@ msgstr "У \"{path}\" виявлено зображення без метада msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Знайдено пошкоджений файл фінансування \"{path}\" для \"{name}\":" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "Знайдено недійсні прикладні програми в аргументах" @@ -1192,6 +1242,11 @@ msgstr "Не знайдено приєднаних пристроїв" msgid "No commit specified for {versionName} in {linedesc}" msgstr "У версії {linedesc} не вказано поданнь для {versionName}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "No config.yml found, using defaults." +msgstr "Не знайдено 'config.py', використовуючи типові налаштування." + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Немає власного цифрового відбитка в URL-адресі." @@ -1238,7 +1293,7 @@ msgstr "Немає підписаного вихідного шляху — ні msgid "No signing certificates found in {path}" msgstr "У {path} не знайдено сертифікатів для підписання" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "Такого пакунка немає: %s" @@ -1270,6 +1325,11 @@ msgstr "Для {appid} нічого виконувати." msgid "Now set these in config.py:" msgstr "Тепер встановіть їх у config.py:" +#: ../fdroidserver/init.py +#, fuzzy +msgid "Now set these in config.yml:" +msgstr "Тепер встановіть їх у config.py:" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1742,6 +1802,11 @@ msgstr "Сховище вже має локальні метадані: %s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "Для використання awsbucket, awssecretkey та awsaccesskeyid також слід налаштувати config.py!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Для використання awsbucket, awssecretkey та awsaccesskeyid також слід налаштувати config.py!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL-адреса має починатися з https:// або http://" @@ -1772,6 +1837,11 @@ msgstr "Неочікувана мітка ліцензії \"{}\"! Викори msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "Несподіваний текст у тому ж рядку, що і {field} у {linedesc}" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "Виявлено невідому виняткову ситуацію!" @@ -2662,6 +2732,11 @@ msgstr "{file} порожній або пошкоджений!" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "{name} \"{path}\" не існує! Виправте його в config.py." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 6a658488..f2950631 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-10-08 06:06+0000\n" "Last-Translator: Eric \n" "Language-Team: Chinese (Simplified) \n" @@ -144,6 +144,11 @@ msgstr "%s 选项不采用值" msgid "'keypass' not found in config.py!" msgstr "config.py中找不到'keypass'!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keypass' not found in config.yml!" +msgstr "config.py中找不到'keypass'!" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -152,14 +157,29 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "config.py中找不到'keypass'!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystore' not found in config.yml!" +msgstr "config.py中找不到'keypass'!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "config.py中找不到'keystorepass'!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystorepass' not found in config.yml!" +msgstr "config.py中找不到'keystorepass'!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "config.py中找不到'repo_keyalias'!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'repo_keyalias' not found in config.yml!" +msgstr "config.py中找不到'repo_keyalias'!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -169,6 +189,11 @@ msgstr "'required'是无效的位置参数" msgid "'sdk_path' not set in 'config.py'!" msgstr "未在“ config.py”中设置“ sdk_path”!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'sdk_path' not set in config.yml!" +msgstr "未在“ config.py”中设置“ sdk_path”!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -283,6 +308,11 @@ msgstr "安卓DEX代码" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "Android SDK‘{path}’未安装‘{dirname}’!" +#: ../fdroidserver/init.py +#, fuzzy, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "未找到 Android SDK!" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "未找到 Android SDK!" @@ -297,6 +327,11 @@ msgstr "Android SDK路径“ {path}”不存在!" msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK路径'{path}'不是目录!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "未找到 Android SDK!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -454,6 +489,11 @@ msgstr "提交更改" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -472,6 +512,11 @@ msgstr "找不到最新的版本名" msgid "Could not find {path} to remove it" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "" @@ -695,6 +740,11 @@ msgid "" "> " msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -822,7 +872,7 @@ msgstr "" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "" @@ -1180,6 +1230,10 @@ msgstr "" msgid "No commit specified for {versionName} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1226,7 +1280,7 @@ msgstr "" msgid "No signing certificates found in {path}" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "" @@ -1258,6 +1312,10 @@ msgstr "" msgid "Now set these in config.py:" msgstr "" +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1728,6 +1786,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1758,6 +1820,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "发生未知异常!" @@ -2642,6 +2709,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 2894f7c0..59ab602a 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2020-11-10 16:20+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Chinese (Traditional) \n" @@ -143,6 +143,11 @@ msgstr "%s 選項不帶值" msgid "'keypass' not found in config.py!" msgstr "config.py 找不到 'keypass'!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keypass' not found in config.yml!" +msgstr "config.py 找不到 'keypass'!" + #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -151,14 +156,29 @@ msgstr "" msgid "'keystore' not found in config.py!" msgstr "config.py 找不到 'keystore'!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystore' not found in config.yml!" +msgstr "config.py 找不到 'keystore'!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "config.py 找不到 'keystorepass'!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'keystorepass' not found in config.yml!" +msgstr "config.py 找不到 'keystorepass'!" + #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "config.py 找不到 'repo_keyalias'!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'repo_keyalias' not found in config.yml!" +msgstr "config.py 找不到 'repo_keyalias'!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -168,6 +188,11 @@ msgstr "這些地方的 '必填' 為無效引數" msgid "'sdk_path' not set in 'config.py'!" msgstr "'config.py' 未設定 'sdk_path'!" +#: ../fdroidserver/common.py +#, fuzzy +msgid "'sdk_path' not set in config.yml!" +msgstr "'config.py' 未設定 'sdk_path'!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -283,6 +308,11 @@ msgstr "未找到 Android SDK!" msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "Android SDK '{path}' 並未安裝 '{dirname}'!" +#: ../fdroidserver/init.py +#, fuzzy, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "找不到 Android SDK!" + #: ../fdroidserver/common.py msgid "Android SDK not found!" msgstr "找不到 Android SDK!" @@ -297,6 +327,11 @@ msgstr "Android SDK 路徑 '{path}' 不存在!" msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK 路徑 '{path}' 不是目錄資料夾!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "找不到 Android SDK!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -454,6 +489,11 @@ msgstr "提交變更" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" @@ -474,6 +514,11 @@ msgstr "找不到最新版本名稱" msgid "Could not find {path} to remove it" msgstr "無法找到 {path} 來移除" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "無法開啟 apk 檔案作分析" + #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" msgstr "無法開啟 apk 檔案作分析" @@ -702,6 +747,11 @@ msgstr "" "請在此輸入 Android SDK (%s) 的路徑:\n" "> " +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format @@ -830,7 +880,7 @@ msgstr "找到 \"{path}\" 圖像不包含 \"{name}\" 應用的中介資料!" msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" msgstr "引數中找到無效的 appids" @@ -1189,6 +1239,11 @@ msgstr "查無附加的設備" msgid "No commit specified for {versionName} in {linedesc}" msgstr "{linedesc} 沒有指定給 {versionName} 的提交" +#: ../fdroidserver/common.py +#, fuzzy +msgid "No config.yml found, using defaults." +msgstr "找不到 'config.py',使用預設。" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "在 URL 無指紋。" @@ -1236,7 +1291,7 @@ msgstr "輸出目錄無簽署 - 無須採取動作" msgid "No signing certificates found in {path}" msgstr "{path} 找不到簽署證書" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" msgstr "無此套件包:%s" @@ -1268,6 +1323,11 @@ msgstr "{appid} 無須採取行動." msgid "Now set these in config.py:" msgstr "現在設定這些在 config.py 中:" +#: ../fdroidserver/init.py +#, fuzzy +msgid "Now set these in config.yml:" +msgstr "現在設定這些在 config.py 中:" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1739,6 +1799,11 @@ msgstr "這個軟體庫已有本地的中介資料:%s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" msgstr "要使用 awsbucket, awssecretkey 與 awsaccesskeyid 必須在 config.py 進行設定!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "要使用 awsbucket, awssecretkey 與 awsaccesskeyid 必須在 config.py 進行設定!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1770,6 +1835,11 @@ msgstr "" msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "在 {linedesc} 在同一行的 {field} 出現未預期的文字" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" msgstr "發現未知的異常!" @@ -2659,6 +2729,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "{name} \"{path}\" 不存在! 請更正 config.py." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" From 0a1793ab7f4757bd2a6ae84af557742b2131034a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 13 Jan 2021 09:08:22 +0100 Subject: [PATCH 0048/2116] update: write out cache as soon as possible When working or testing with large APK collections, oftentimes it can take hours to scan all the APKs. If there is a failure before the apkcache is written out, then all that work is lost since no cache is written out. This moves the final cache writing before writing the index and knownapks to make it more likely that the apkcache is successfully written. --- fdroidserver/update.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index ef1310c7..de1948fa 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -2310,6 +2310,10 @@ def main(): # This will be done again (as part of apply_info_from_latest_apk) for repo and archive # separately later on, but it's fairly cheap anyway. read_names_from_apks(apps, apks + archapks) + + if cachechanged: + write_cache(apkcache) + # The added date currently comes from the oldest apk which might be in the archive. # So we need this populated at app level before continuing with only processing /repo # or /archive @@ -2349,9 +2353,6 @@ def main(): # Update known apks info... knownapks.writeifchanged() - if cachechanged: - write_cache(apkcache) - # Update the wiki... if options.wiki: logging.warning(_('wiki support is deprecated and will be removed in the next release!')) From c7fcfe3bfa777c065773dd71d2abbb3ceb5b3bf6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 14 Jan 2021 14:43:37 +0100 Subject: [PATCH 0049/2116] update: fix setting current_version_file for make_current_version_link Before, it would never set current_version_file to the current APK since it first set current_version_code, then tested against CurrentVersionCode. So if there is only a single APK and its the CurrentVersionCode, then current_version_file would not get set. refs #772 --- fdroidserver/index.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 9b2b68c9..f2cbac0f 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -466,10 +466,10 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing for apk in apklist: file_extension = common.get_file_extension(apk['apkName']) # find the APK for the "Current Version" - if current_version_code < apk['versionCode']: - current_version_code = apk['versionCode'] if current_version_code < int(app.CurrentVersionCode): current_version_file = apk['apkName'] + if current_version_code < apk['versionCode']: + current_version_code = apk['versionCode'] apkel = doc.createElement("package") apel.appendChild(apkel) From 0f6b638986017886d9129bf031e807b1de77abbb Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 17 Nov 2020 23:49:04 +0100 Subject: [PATCH 0050/2116] common.get_app_display_name() for finding app names --- fdroidserver/checkupdates.py | 8 ++------ fdroidserver/common.py | 20 ++++++++++++++++++++ fdroidserver/index.py | 2 +- fdroidserver/lint.py | 2 +- fdroidserver/update.py | 8 +++++--- tests/common.TestCase | 15 +++++++++++++++ 6 files changed, 44 insertions(+), 11 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index fe9b63d8..460a7373 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -326,7 +326,7 @@ def try_init_submodules(app, last_build, vcs): try: vcs.initsubmodules() except NoSubmodulesException: - logging.info("No submodules present for {}".format(app.Name)) + logging.info("No submodules present for {}".format(_getappname(app))) # Return all directories under startdir that contain any of the manifest @@ -359,11 +359,7 @@ def possible_subdirs(app): def _getappname(app): - if app.Name: - return app.Name - if app.AutoName: - return app.AutoName - return app.id + return common.get_app_display_name(app) def _getcvname(app): diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 1de841c1..153ab148 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3628,6 +3628,26 @@ def version_code_string_to_int(vercode): return int(vercode) +def get_app_display_name(app): + """get a human readable name for the app for logging and sorting + + When trying to find a localized name, this first tries en-US since + that his the historical language used for sorting. + + """ + if app.get('Name'): + return app['Name'] + if app.get('localized'): + localized = app['localized'].get('en-US') + if not localized: + for v in app['localized'].values(): + localized = v + break + if localized.get('name'): + return localized['name'] + return app.get('AutoName') or app['id'] + + def local_rsync(options, fromdir, todir): '''Rsync method for local to local copying of things diff --git a/fdroidserver/index.py b/fdroidserver/index.py index f2cbac0f..8c60027c 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -61,7 +61,7 @@ def make(apps, apks, repodir, archive): common.assert_config_keystore(common.config) # Historically the index has been sorted by App Name, so we enforce this ordering here - sortedids = sorted(apps, key=lambda appid: apps[appid]['Name'].upper()) + sortedids = sorted(apps, key=lambda appid: common.get_app_display_name(apps[appid]).upper()) sortedapps = collections.OrderedDict() for appid in sortedids: sortedapps[appid] = apps[appid] diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 61916e71..9e7aaeda 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -337,7 +337,7 @@ def check_duplicates(app): else: links_seen.add(v) - name = app.Name or app.AutoName + name = common.get_app_display_name(app) if app.Summary and name: if app.Summary.lower() == name.lower(): yield _("Summary '%s' is just the app's name") % app.Summary diff --git a/fdroidserver/update.py b/fdroidserver/update.py index de1948fa..5f42cdf9 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -207,9 +207,12 @@ def update_wiki(apps, apks): requiresroot = 'Yes' else: requiresroot = 'No' + + apppagename = common.get_app_display_name(app) + wikidata += '{{App|id=%s|name=%s|added=%s|lastupdated=%s|source=%s|tracker=%s|web=%s|changelog=%s|donate=%s|flattr=%s|liberapay=%s|bitcoin=%s|litecoin=%s|license=%s|root=%s|author=%s|email=%s}}\n' % ( appid, - app.Name, + apppagename, app.added.strftime('%Y-%m-%d') if app.added else '', app.lastUpdated.strftime('%Y-%m-%d') if app.lastUpdated else '', app.SourceCode, @@ -338,7 +341,6 @@ def update_wiki(apps, apks): # Make a redirect from the name to the ID too, unless there's # already an existing page with the name and it isn't a redirect. noclobber = False - apppagename = app.Name for ch in '_{}:[]|': apppagename = apppagename.replace(ch, ' ') # Drop double spaces caused mostly by replacing ':' above @@ -2116,7 +2118,7 @@ def read_names_from_apks(apps, apks): if bestver == UNSET_VERSION_CODE: if app.Name is None: - app.Name = app.AutoName or appid + app.Name = common.get_app_display_name(app) app.icon = None else: if app.Name is None: diff --git a/tests/common.TestCase b/tests/common.TestCase index 253f8037..2f226dee 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1612,6 +1612,21 @@ class CommonTest(unittest.TestCase): self.assertEqual([dirtyfile, 'repo/status/running.json'], data['fdroiddata']['untrackedFiles']) + def test_get_app_display_name(self): + testvalue = 'WIN!' + for app in [ + {'Name': testvalue}, + {'AutoName': testvalue}, + {'id': testvalue}, + {'id': 'a', 'localized': {'de-AT': {'name': testvalue}}}, + {'id': 'a', 'localized': { + 'de-AT': {'name': 'nope'}, + 'en-US': {'name': testvalue}, + }}, + {'AutoName': 'ignore me', 'Name': testvalue, 'id': 'nope'}, + {'AutoName': testvalue, 'id': 'nope'}]: + self.assertEqual(testvalue, fdroidserver.common.get_app_display_name(app)) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From fff59e519724c7f16bd3861de60297f80c71beeb Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 13 Jan 2020 15:43:42 +0100 Subject: [PATCH 0051/2116] only use AutoName: in checkupdates AutoName: is only needed for the commit messages generated by checkupdates, and it makes the logic for localized names confusing. closes #654 refs #304 --- fdroidserver/common.py | 4 +- fdroidserver/index.py | 20 ++- fdroidserver/lint.py | 3 - fdroidserver/update.py | 56 ++++--- tests/index.TestCase | 68 ++++++++- .../metadata/info.guardianproject.checkey.yml | 1 + .../en-US/name.txt | 1 + .../ja-JP/name.txt | 1 + tests/repo/index-v1.json | 43 ++++-- tests/repo/index.xml | 2 +- tests/update.TestCase | 139 ++++++++++++++++++ 11 files changed, 289 insertions(+), 49 deletions(-) create mode 100644 tests/metadata/info.guardianproject.checkey/en-US/name.txt create mode 100644 tests/metadata/info.guardianproject.checkey/ja-JP/name.txt diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 153ab148..22a4f3ff 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3511,9 +3511,9 @@ def get_certificate(signature_block_file): def load_stats_fdroid_signing_key_fingerprints(): - """Load list of signing-key fingerprints stored by fdroid publish from file. + """Load signing-key fingerprints stored in file generated by fdroid publish. - :returns: list of dictionanryies containing the singing-key fingerprints. + :returns: dict containing the signing-key fingerprints. """ jar_file = os.path.join('stats', 'publishsigkeys.jar') if not os.path.isfile(jar_file): diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 8c60027c..95b46ed5 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -159,7 +159,7 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ if not v: continue if k in ('Builds', 'comments', 'metadatapath', - 'ArchivePolicy', 'AutoUpdateMode', 'MaintainerNotes', + 'ArchivePolicy', 'AutoName', 'AutoUpdateMode', 'MaintainerNotes', 'Provides', 'Repo', 'RepoType', 'RequiresRoot', 'UpdateCheckData', 'UpdateCheckIgnore', 'UpdateCheckMode', 'UpdateCheckName', 'NoSourceSince', 'VercodeOperation'): @@ -172,10 +172,6 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ k = 'suggestedVersionCode' elif k == 'CurrentVersion': # TODO make SuggestedVersionName the canonical name k = 'suggestedVersionName' - elif k == 'AutoName': - if 'Name' not in apps[packageName]: - d['name'] = v - continue else: k = k[:1].lower() + k[1:] d[k] = v @@ -326,6 +322,8 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing value = localized[lang].get(lkey) if not value: value = default + if not value and name == 'name' and app.get('AutoName'): + value = app['AutoName'] el.appendChild(doc.createTextNode(value)) parent.appendChild(el) @@ -363,10 +361,13 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing # Get a list of the apks for this app... apklist = [] + name_from_apk = None apksbyversion = collections.defaultdict(lambda: []) for apk in apks: if apk.get('versionCode') and apk.get('packageName') == appid: apksbyversion[apk['versionCode']].append(apk) + if name_from_apk is None: + name_from_apk = apk.get('name') for versionCode, apksforver in apksbyversion.items(): fdroidsig = fdroid_signing_key_fingerprints.get(appid, {}).get('signer') fdroid_signed_apk = None @@ -398,7 +399,7 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing if app.lastUpdated: addElement('lastupdated', app.lastUpdated.strftime('%Y-%m-%d'), doc, apel) - addElementCheckLocalized('name', app, 'Name', doc, apel) + addElementCheckLocalized('name', app, 'Name', doc, apel, name_from_apk) addElementCheckLocalized('summary', app, 'Summary', doc, apel) if app.icon: @@ -543,7 +544,12 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing and common.config['make_current_version_link'] \ and repodir == 'repo': # only create these namefield = common.config['current_version_name_source'] - sanitized_name = re.sub(b'''[ '"&%?+=/]''', b'', app.get(namefield).encode('utf-8')) + name = app.get(namefield) + if not name and namefield == 'Name': + name = app.get('localized', {}).get('en-US', {}).get('name') + if not name: + name = app.id + sanitized_name = re.sub(b'''[ '"&%?+=/]''', b'', name.encode('utf-8')) apklinkname = sanitized_name + os.path.splitext(current_version_file)[1].encode('utf-8') current_version_path = os.path.join(repodir, current_version_file).encode('utf-8', 'surrogateescape') if os.path.islink(apklinkname): diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 9e7aaeda..99a62f31 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -323,9 +323,6 @@ def check_categories(app): def check_duplicates(app): - if app.Name and app.Name == app.AutoName: - yield _("Name '%s' is just the auto name - remove it") % app.Name - links_seen = set() for f in ['Source Code', 'Web Site', 'Issue Tracker', 'Changelog']: v = app.get(f) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 5f42cdf9..80e092c3 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1905,15 +1905,10 @@ def apply_info_from_latest_apk(apps, apks): logging.debug("Don't know when " + appid + " was last updated") if bestver == UNSET_VERSION_CODE: - - if app.get('Name') is None: - app['Name'] = app['AutoName'] or appid app['icon'] = None logging.debug("Application " + appid + " has no packages") else: - if app.get('Name') is None: - app['Name'] = bestapk['name'] - app['icon'] = bestapk['icon'] if 'icon' in bestapk else None + app.icon = bestapk['icon'] if 'icon' in bestapk else None if app.get('CurrentVersionCode') is None: app['CurrentVersionCode'] = str(bestver) @@ -2106,23 +2101,45 @@ def read_added_date_from_all_apks(apps, apks): app['lastUpdated'] = apk['added'] -def read_names_from_apks(apps, apks): - """This is a stripped down copy of apply_info_from_latest_apk that only parses app names""" +def insert_missing_app_names_from_apks(apps, apks): + """Use app name from APK if it is not set in the metadata + + Name -> localized -> from APK + + The name from the APK is set as the default name for the app if + there is no other default set, e.g. app['Name'] or + app['localized']['en-US']['name']. The en-US locale is defined in + the F-Droid ecosystem as the locale of last resort, as in the one + that should always be present. en-US is used since it is the + locale of the source strings. + + This should only be used for index v0 and v1. Later versions of + the index should be sorted by Application ID, since it is + guaranteed to always be there. Before, the index was stored by + the app name (aka ) to save the + website from having to sort the entries. That is no longer + relevant since the website switched from Wordpress to Jekyll. + + """ for appid, app in apps.items(): + if app.get('Name') is not None: + continue + if app.get('localized', {}).get('en-US', {}).get('name') is not None: + continue + bestver = UNSET_VERSION_CODE for apk in apks: if apk['packageName'] == appid: - if apk['versionCode'] > bestver: + if apk.get('name') and apk['versionCode'] > bestver: bestver = apk['versionCode'] bestapk = apk - if bestver == UNSET_VERSION_CODE: - if app.Name is None: - app.Name = common.get_app_display_name(app) - app.icon = None - else: - if app.Name is None: - app.Name = bestapk['name'] + if bestver != UNSET_VERSION_CODE: + if 'localized' not in app: + app['localized'] = {} + if 'en-US' not in app['localized']: + app['localized']['en-US'] = {} + app['localized']['en-US']['name'] = bestapk.get('name') def get_apps_with_packages(apps, apks): @@ -2161,6 +2178,7 @@ def prepare_apps(apps, apks, repodir): translate_per_build_anti_features(apps_with_packages, apks) if repodir == 'repo': insert_localized_app_metadata(apps_with_packages) + insert_missing_app_names_from_apks(apps_with_packages, apks) return apps_with_packages @@ -2307,12 +2325,6 @@ def main(): else: archapks = [] - # We need app.Name populated for all apps regardless of which repo they end up in - # for the old-style inter-app links, so let's do it before we do anything else. - # This will be done again (as part of apply_info_from_latest_apk) for repo and archive - # separately later on, but it's fairly cheap anyway. - read_names_from_apks(apps, apks + archapks) - if cachechanged: write_cache(apkcache) diff --git a/tests/index.TestCase b/tests/index.TestCase index 131b3a1a..16885dbf 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -247,7 +247,7 @@ class IndexTest(unittest.TestCase): self.maxDiff = None self.assertEqual(json.dumps(i, indent=2), json.dumps(o, indent=2)) - def test_make_v0(self): + def test_make_v0_repo_only(self): tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) os.chdir(tmptestsdir) @@ -264,7 +264,71 @@ class IndexTest(unittest.TestCase): } requestsdict = {'install': [], 'uninstall': []} fdroidserver.common.config['repo_pubkey'] = 'ffffffffffffffffffffffffffffffffff' - fdroidserver.index.make_v0({}, [], 'repo', repodict, requestsdict, []) + fdroidserver.index.make_v0({}, [], 'repo', repodict, requestsdict, {}) + self.assertTrue(os.path.isdir(repo_icons_dir)) + self.assertTrue(os.path.exists(os.path.join(repo_icons_dir, + fdroidserver.common.default_config['repo_icon']))) + self.assertTrue(os.path.exists(os.path.join('repo', 'index.xml'))) + + def test_make_v0(self): + tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, + dir=self.tmpdir) + os.chdir(tmptestsdir) + os.mkdir('metadata') + os.mkdir('repo') + metadatafile = 'metadata/info.zwanenburg.caffeinetile.yml' + shutil.copy(os.path.join(self.basedir, metadatafile), + metadatafile) + repo_icons_dir = os.path.join('repo', 'icons') + self.assertFalse(os.path.isdir(repo_icons_dir)) + repodict = { + 'address': 'https://example.com/fdroid/repo', + 'description': 'This is just a test', + 'icon': 'blahblah', + 'name': 'test', + 'timestamp': datetime.datetime.now(), + 'version': 12, + } + app = fdroidserver.metadata.parse_metadata(metadatafile, False, False) + app['icon'] = 'info.zwanenburg.caffeinetile.4.xml' + app['CurrentVersionCode'] = '4' + apps = {app.id: app} + apk = { + 'hash': 'dbbdd7deadb038862f426b71efe4a64df8c3edf25d669e935f349510e16f65db', + 'hashType': 'sha256', + 'uses-permission': [ + [ + 'android.permission.WAKE_LOCK', + None + ] + ], + 'uses-permission-sdk-23': [], + 'features': [], + 'icons_src': { + '160': 'res/drawable/ic_coffee_on.xml', + '-1': 'res/drawable/ic_coffee_on.xml' + }, + 'icons': { + '160': 'info.zwanenburg.caffeinetile.4.xml' + }, + 'antiFeatures': [], + 'packageName': 'info.zwanenburg.caffeinetile', + 'versionCode': 4, + 'name': 'Caffeine Tile', + 'versionName': '1.3', + 'minSdkVersion': 24, + 'targetSdkVersion': 25, + 'sig': '03f9b2f848d22fd1d8d1331e8b1b486d', + 'signer': '51cfa5c8a743833ad89acf81cb755936876a5c8b8eca54d1ffdcec0cdca25d0e', + 'size': 11740, + 'apkName': 'info.zwanenburg.caffeinetile_4.apk', + 'icon': 'info.zwanenburg.caffeinetile.4.xml', + 'added': datetime.datetime.fromtimestamp(1539122400), + } + requestsdict = {'install': [], 'uninstall': []} + fdroidserver.common.config['repo_pubkey'] = 'ffffffffffffffffffffffffffffffffff' + fdroidserver.common.config['make_current_version_link'] = True + fdroidserver.index.make_v0(apps, [apk], 'repo', repodict, requestsdict, {}) self.assertTrue(os.path.isdir(repo_icons_dir)) self.assertTrue(os.path.exists(os.path.join(repo_icons_dir, fdroidserver.common.default_config['repo_icon']))) diff --git a/tests/metadata/info.guardianproject.checkey.yml b/tests/metadata/info.guardianproject.checkey.yml index 78b75320..7d933abd 100644 --- a/tests/metadata/info.guardianproject.checkey.yml +++ b/tests/metadata/info.guardianproject.checkey.yml @@ -9,6 +9,7 @@ Translation: https://www.transifex.com/otf/checkey Bitcoin: 1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk Liberapay: GuardianProject +Name: Checkey the app! AutoName: Checkey AutoUpdateMode: None diff --git a/tests/metadata/info.guardianproject.checkey/en-US/name.txt b/tests/metadata/info.guardianproject.checkey/en-US/name.txt new file mode 100644 index 00000000..09d725c6 --- /dev/null +++ b/tests/metadata/info.guardianproject.checkey/en-US/name.txt @@ -0,0 +1 @@ +Checkey: info on local apps diff --git a/tests/metadata/info.guardianproject.checkey/ja-JP/name.txt b/tests/metadata/info.guardianproject.checkey/ja-JP/name.txt new file mode 100644 index 00000000..c96d43b5 --- /dev/null +++ b/tests/metadata/info.guardianproject.checkey/ja-JP/name.txt @@ -0,0 +1 @@ +Checkey: ローカルアプリの情報 diff --git a/tests/repo/index-v1.json b/tests/repo/index-v1.json index e781d974..fe93947a 100644 --- a/tests/repo/index-v1.json +++ b/tests/repo/index-v1.json @@ -32,14 +32,18 @@ "flattrID": "cad90e036b975ed129a3ce80a0750466", "issueTracker": "https://gitlab.com/souch/SMSbypass/issues", "license": "GPL-3.0-only", - "name": "Battery level", "sourceCode": "https://gitlab.com/souch/SMSbypass/tree/HEAD", "summary": "Filter SMS and show them in a fake app", "webSite": "https://gitlab.com/souch/SMSbypass", "added": 1524700800000, "icon": "souch.smsbypass.9.png", "packageName": "souch.smsbypass", - "lastUpdated": 1524700800000 + "lastUpdated": 1524700800000, + "localized": { + "en-US": { + "name": "Battery level" + } + } }, { "categories": [ @@ -77,13 +81,17 @@ "donate": "https://f-droid.org/about", "issueTracker": "https://gitlab.com/fdroid/privileged-extension/issues", "license": "Apache-2.0", - "name": "fake.ota.update_1234", "sourceCode": "https://gitlab.com/fdroid/privileged-extension", "summary": "Tests whether OTA ZIP files are being include", "webSite": "https://f-droid.org", "added": 1457568000000, "packageName": "fake.ota.update", - "lastUpdated": 1457568000000 + "lastUpdated": 1457568000000, + "localized": { + "en-US": { + "name": "fake.ota.update_1234" + } + } }, { "categories": [ @@ -106,12 +114,16 @@ "suggestedVersionCode": "99999999", "liberapay": "12334", "license": "GPL-3.0-only", - "name": "OBB Main Old Version", "sourceCode": "https://github.com/eighthave/urzip", "added": 1388448000000, "icon": "obb.main.oldversion.1444412523.png", "packageName": "obb.main.oldversion", - "lastUpdated": 1388448000000 + "lastUpdated": 1388448000000, + "localized": { + "en-US": { + "name": "OBB Main Old Version" + } + } }, { "bitcoin": "1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk", @@ -120,12 +132,16 @@ ], "suggestedVersionCode": "99999999", "license": "GPL-3.0-only", - "name": "OBB Main Two Versions", "sourceCode": "https://github.com/eighthave/urzip", "added": 1444608000000, "icon": "obb.main.twoversions.1101617.png", "packageName": "obb.main.twoversions", - "lastUpdated": 1466380800000 + "lastUpdated": 1466380800000, + "localized": { + "en-US": { + "name": "OBB Main Two Versions" + } + } }, { "bitcoin": "1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk", @@ -134,7 +150,6 @@ ], "suggestedVersionCode": "99999999", "license": "GPL-3.0-only", - "name": "OBB Main/Patch Current", "sourceCode": "https://github.com/eighthave/urzip", "added": 1461369600000, "icon": "obb.mainpatch.current.1619.png", @@ -144,6 +159,7 @@ "en-US": { "featureGraphic": "featureGraphic_ffhLaojxbGAfu9ROe1MJgK5ux8d0OVc6b65nmvOBaTk=.png", "icon": "icon_WI0pkO3LsklrsTAnRr-OQSxkkoMY41lYe2-fAvXLiLg=.png", + "name": "OBB Main/Patch Current", "phoneScreenshots": [ "screenshot-main.png" ], @@ -165,13 +181,17 @@ "description": "Activates silent mode during calendar events.", "issueTracker": "https://github.com/miguelvps/PoliteDroid/issues", "license": "GPL-3.0-only", - "name": "Polite Droid", "sourceCode": "https://github.com/miguelvps/PoliteDroid", "summary": "Calendar tool", "added": 1498176000000, "icon": "com.politedroid.6.png", "packageName": "com.politedroid", - "lastUpdated": 1498176000000 + "lastUpdated": 1498176000000, + "localized": { + "en-US": { + "name": "Polite Droid" + } + } }, { "authorWebSite": "https://guardianproject.info", @@ -187,7 +207,6 @@ "issueTracker": "https://dev.guardianproject.info/projects/urzip/issues", "liberapayID": "9999999", "license": "GPL-3.0-only", - "name": "urzip-\u03c0\u00c7\u00c7\u03c0\u00c7\u00c7\u73b0\u4ee3\u6c49\u8bed\u901a\u7528\u5b57-\u0431\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438-\u0639\u0631\u0628\u064a1234", "openCollective": "f-droid-just-testing", "sourceCode": "https://github.com/guardianproject/urzip", "summary": "\u4e00\u4e2a\u5b9e\u7528\u5de5\u5177\uff0c\u83b7\u53d6\u5df2\u5b89\u88c5\u5728\u60a8\u7684\u8bbe\u5907\u4e0a\u7684\u5e94\u7528\u7684\u6709\u5173\u4fe1\u606f", diff --git a/tests/repo/index.xml b/tests/repo/index.xml index 298fd022..9af45f96 100644 --- a/tests/repo/index.xml +++ b/tests/repo/index.xml @@ -371,7 +371,7 @@ APK is called F-Droid Privileged Extension. info.guardianproject.urzip 2016-06-23 2016-06-23 - urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234 + title 一个实用工具,获取已安装在您的设备上的应用的有关信息 info.guardianproject.urzip.100.png It’s Urzip 是一个获得已安装 APK 相关信息的实用工具。它从您的设备上已安装的所有应用开始,一键触摸即可显示 APK 的指纹,并且提供到达 virustotal.com 和 androidobservatory.org 的快捷链接,让您方便地了解特定 APK 的档案。它还可以让您导出签名证书和生成 ApkSignaturePin Pin 文件供 TrustedIntents 库使用。 diff --git a/tests/update.TestCase b/tests/update.TestCase index 4593f770..ffc8fa5f 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -2,6 +2,7 @@ # http://www.drdobbs.com/testing/unit-testing-with-python/240165163 +import copy import git import glob import inspect @@ -69,6 +70,10 @@ class UpdateTest(unittest.TestCase): def setUp(self): logging.basicConfig(level=logging.INFO) + logging.getLogger('androguard.axml').setLevel(logging.INFO) + logging.getLogger('androguard.core.api_specific_resources').setLevel(logging.INFO) + from PIL import PngImagePlugin + logging.getLogger(PngImagePlugin.__name__).setLevel(logging.INFO) self.basedir = os.path.join(localmodule, 'tests') self.tmpdir = os.path.abspath(os.path.join(self.basedir, '..', '.testfiles')) if not os.path.exists(self.tmpdir): @@ -174,6 +179,140 @@ class UpdateTest(unittest.TestCase): elif packageName == 'eu.siacs.conversations': self.assertEqual('Conversations', app['localized']['en-US']['name']) + def test_name_title_scraping(self): + """metadata file --> fdroiddata localized files --> fastlane/triple-t in app source --> APK""" + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.common.config = config + fdroidserver.update.config = config + os.chdir(os.path.join(localmodule, 'tests')) + fdroidserver.update.options = type('', (), {})() + fdroidserver.update.options.clean = True + fdroidserver.update.options.delete_unknown = True + fdroidserver.update.options.rename_apks = False + fdroidserver.update.options.allow_disabled_algorithms = False + + apps = fdroidserver.metadata.read_metadata() + knownapks = fdroidserver.common.KnownApks() + apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False) + fdroidserver.update.insert_localized_app_metadata(apps) + fdroidserver.update.apply_info_from_latest_apk(apps, apks) + app = apps['info.guardianproject.urzip'] + self.assertIsNone(app.Name) + self.assertTrue('localized' in app) + self.assertEqual('title', app['localized']['en-US']['name']) + app = apps['org.videolan.vlc'] + self.assertIsNone(app.Name) + self.assertTrue('localized' in app) + self.assertFalse('name' in app['localized']['en-US']) + app = apps['info.guardianproject.checkey'] + self.assertEqual('Checkey the app!', app.Name) + self.assertTrue('localized' in app) + self.assertEqual('Checkey: info on local apps', app['localized']['en-US']['name']) + self.assertEqual('Checkey: ローカルアプリの情報', app['localized']['ja-JP']['name']) + app = apps['org.adaway'] + self.assertIsNone(app.Name) + self.assertFalse('localized' in app) + app = apps['obb.main.twoversions'] + self.assertIsNone(app.Name) + self.assertFalse('localized' in app) + + def test_insert_missing_app_names_from_apks(self): + """en-US serves as the final, default, fallback value with index-v1""" + testvalue = 'TESTVALUE!' + apps = { + 'none': {}, + 'name': {'Name': testvalue}, + 'onlyapk': {'Name': None}, + 'autoname': {'AutoName': 'autoname', 'Name': None}, + 'onlylocalized': {'localized': {'en-US': {'name': testvalue}}}, + 'non_en_us_localized': {'localized': {'de-AT': {'name': 'leiwand'}}}, + 'apks': {}, + } + apks = [ + {'packageName': 'none', 'name': '', 'versionCode': 1}, + {'packageName': 'name', 'name': 'fromapk', 'versionCode': 1}, + {'packageName': 'onlyapk', 'name': testvalue, 'versionCode': 1}, + {'packageName': 'autoname', 'name': testvalue, 'versionCode': 1}, + {'packageName': 'onlylocalized', 'name': 'fromapk', 'versionCode': 1}, + {'packageName': 'non_en_us_localized', 'name': testvalue, 'versionCode': 0xcafe}, + {'packageName': 'apks', 'name': 'fromapk1', 'versionCode': 1}, + {'packageName': 'apks', 'name': 'fromapk2', 'versionCode': 2}, + {'packageName': 'apks', 'name': testvalue, 'versionCode': 3}, + ] + fdroidserver.update.insert_missing_app_names_from_apks(apps, apks) + for appid, app in apps.items(): + if appid == 'none': + self.assertIsNone(app.get('Name')) + self.assertIsNone(app.get('localized')) + elif appid == 'onlyapk': + self.assertIsNone(app.get('Name')) + self.assertEqual(testvalue, app['localized']['en-US']['name']) + elif appid == 'autoname': + self.assertIsNone(app.get('Name')) + self.assertEqual(testvalue, app['localized']['en-US']['name']) + elif appid == 'onlylocalized': + self.assertIsNone(app.get('Name')) + self.assertEqual(testvalue, app['localized']['en-US']['name']) + elif appid == 'non_en_us_localized': + self.assertIsNone(app.get('Name')) + self.assertEqual(testvalue, app['localized']['en-US']['name']) + elif appid == 'name': + self.assertEqual(testvalue, app['Name']) + self.assertIsNone(app.get('localized')) + elif appid == 'apks': + self.assertIsNone(app.get('Name')) + self.assertEqual(testvalue, app['localized']['en-US']['name']) + + def test_insert_missing_app_names_from_apks_from_repo(self): + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.common.config = config + fdroidserver.update.config = config + fdroidserver.update.options = type('', (), {})() + fdroidserver.update.options.clean = True + fdroidserver.update.options.delete_unknown = True + fdroidserver.update.options.rename_apks = False + fdroidserver.update.options.allow_disabled_algorithms = False + + apps = fdroidserver.metadata.read_metadata() + knownapks = fdroidserver.common.KnownApks() + apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False) + + appid = 'info.guardianproject.checkey' + testapps = {appid: copy.copy(apps[appid])} + self.assertEqual('Checkey the app!', testapps[appid]['Name']) + del(testapps[appid]['Name']) + fdroidserver.update.insert_missing_app_names_from_apks(testapps, apks) + self.assertIsNone(testapps[appid].get('Name')) + + repoapps = fdroidserver.update.prepare_apps(apps, apks, 'repo') + fdroidserver.update.insert_missing_app_names_from_apks(repoapps, apks) + self.assertIsNone(repoapps['com.politedroid']['Name']) + self.assertEqual('Polite Droid', + repoapps['com.politedroid']['localized']['en-US']['name']) + self.assertEqual('Duplicate Permisssions', repoapps['duplicate.permisssions']['Name']) + self.assertEqual('Caffeine Tile', repoapps['info.zwanenburg.caffeinetile']['Name']) + self.assertEqual('No minSdkVersion or targetSdkVersion', repoapps['no.min.target.sdk']['Name']) + self.assertIsNone(repoapps['obb.main.oldversion'].get('Name')) + self.assertEqual('OBB Main Old Version', + repoapps['obb.main.oldversion']['localized']['en-US']['name']) + self.assertIsNone(repoapps['obb.main.twoversions'].get('Name')) + self.assertEqual('OBB Main Two Versions', + repoapps['obb.main.twoversions']['localized']['en-US']['name']) + self.assertIsNone(repoapps['souch.smsbypass'].get('Name')) + self.assertEqual('Battery level', + repoapps['souch.smsbypass']['localized']['en-US']['name']) + self.assertIsNone(repoapps['info.guardianproject.urzip'].get('Name')) + self.assertEqual('title', + repoapps['info.guardianproject.urzip']['localized']['en-US']['name']) + self.assertIsNone(repoapps['obb.mainpatch.current'].get('Name')) + + del(repoapps['info.guardianproject.urzip']['localized']) + fdroidserver.update.insert_missing_app_names_from_apks(repoapps, apks) + self.assertEqual('urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234', + repoapps['info.guardianproject.urzip']['localized']['en-US']['name']) + def test_insert_triple_t_metadata(self): importer = os.path.join(self.basedir, 'tmp', 'importer') packageName = 'org.fdroid.ci.test.app' From 69dbb83bc377175c13c55242f7daf4e9a44aef35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Fri, 15 Jan 2021 14:25:11 +0100 Subject: [PATCH 0052/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Turki?= =?UTF-8?q?sh=20(tr)=20by=20O=C4=9Fuz=20Ersen=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (588 of 588 strings) Co-authored-by: Oğuz Ersen Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/tr/ Translation: F-Droid/F-Droid Server --- locale/tr/LC_MESSAGES/fdroidserver.po | 52 ++++++++++++--------------- 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index 210820a6..f03ca0c6 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -1,12 +1,12 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. -# Oğuz Ersen , 2020. +# Oğuz Ersen , 2020, 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2020-10-22 17:26+0000\n" +"PO-Revision-Date: 2021-01-14 21:33+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" "Language: tr\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.3.1\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py msgid "" @@ -148,9 +148,8 @@ msgid "'keypass' not found in config.py!" msgstr "'keypass' config.py içinde bulunamadı!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keypass' not found in config.yml!" -msgstr "'keypass' config.py içinde bulunamadı!" +msgstr "'keypass' config.yml içinde bulunamadı!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" @@ -161,27 +160,24 @@ msgid "'keystore' not found in config.py!" msgstr "'keystore' config.py içinde bulunamadı!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystore' not found in config.yml!" -msgstr "'keystore' config.py içinde bulunamadı!" +msgstr "'keystore' config.yml içinde bulunamadı!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "'keystorepass' config.py içinde bulunamadı!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' config.py içinde bulunamadı!" +msgstr "'keystorepass' config.yml içinde bulunamadı!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "'repo_keyalias' config.py içinde bulunamadı!" #: ../fdroidserver/common.py -#, fuzzy msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' config.py içinde bulunamadı!" +msgstr "'repo_keyalias' config.yml içinde bulunamadı!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -193,9 +189,8 @@ msgid "'sdk_path' not set in 'config.py'!" msgstr "'sdk_path' 'config.py' içinde ayarlı değil!" #: ../fdroidserver/common.py -#, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "'sdk_path' 'config.py' içinde ayarlı değil!" +msgstr "'sdk_path' config.yml içinde ayarlı değil!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -312,9 +307,9 @@ msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "Android SDK '{path}' içinde '{dirname}' kurulu değil!" #: ../fdroidserver/init.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "Android SDK bulunamadı!" +msgstr "Android SDK {path} konumunda bulunamadı!" #: ../fdroidserver/common.py msgid "Android SDK not found!" @@ -331,9 +326,9 @@ msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK yolu '{path}' bir dizin değil!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "Android SDK bulunamadı!" +msgstr "Android SDK aracı {cmd} bulundu!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -496,7 +491,7 @@ msgstr "Çakışan argümanlar: '--verbose' ve '--quiet' aynı anda belirtilemez #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "Çakışan yapılandırma dosyaları! {newfile} kullanılıyor, {oldfile} yok sayılıyor!" #: ../fdroidserver/common.py #, python-brace-format @@ -517,9 +512,9 @@ msgid "Could not find {path} to remove it" msgstr "Kaldırmak için {path} bulunamadı" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "İnceleme için apk dosyası açılamadı" +msgstr "İnceleme için APK {path} açılamadı: " #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" @@ -751,7 +746,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "{configname} içinden {var} ortam değişkeni ayarlı değil!" #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py @@ -1219,7 +1214,7 @@ msgstr "Ad '%s' yalnızca kendiliğinden bir ad - kaldırın" #: ../fdroidserver/common.py msgid "No 'config.py' found, using defaults." -msgstr "'config.py' bulunamadı, öntanımlılar kullanılıyor." +msgstr "'config.py' bulunamadı, öntanımlı değerler kullanılıyor." #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1239,9 +1234,8 @@ msgid "No commit specified for {versionName} in {linedesc}" msgstr "{linedesc} içindeki {versionName} için belirtilen işleme yok" #: ../fdroidserver/common.py -#, fuzzy msgid "No config.yml found, using defaults." -msgstr "'config.py' bulunamadı, öntanımlılar kullanılıyor." +msgstr "config.yml bulunamadı, öntanımlı değerler kullanılıyor." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1322,9 +1316,8 @@ msgid "Now set these in config.py:" msgstr "Şimdi bunları config.py içinde ayarlayın:" #: ../fdroidserver/init.py -#, fuzzy msgid "Now set these in config.yml:" -msgstr "Şimdi bunları config.py içinde ayarlayın:" +msgstr "Şimdi bunları config.yml içinde ayarlayın:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1798,9 +1791,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "Awsbucket kullanmak için, awssecretkey ve awsaccesskeyid de config.py içinde ayarlanmalı!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Awsbucket kullanmak için, awssecretkey ve awsaccesskeyid de config.py içinde ayarlanmalı!" +msgstr "Awsbucket kullanmak için, awssecretkey ve awsaccesskeyid de config.yml içinde ayarlanmalı!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1835,7 +1827,7 @@ msgstr "{linedesc} içinde {field} ile aynı satırda beklenmeyen metin" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "" +msgstr "{configname} içinde bilinmeyen girdi {key}" #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" @@ -2727,7 +2719,7 @@ msgstr "{name} \"{path}\" yok! config.py içinde düzeltin." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "{oldfile} kullanımdan kaldırıldı, {newfile} kullanın" #: ../fdroidserver/import.py #, python-brace-format From d9545973c3c646573e8faaedc73294f27ebabc50 Mon Sep 17 00:00:00 2001 From: Rafael Fontenelle Date: Fri, 15 Jan 2021 14:25:12 +0100 Subject: [PATCH 0053/2116] Translated using Weblate: Portuguese (Brazil) (pt_BR) by Rafael Fontenelle Currently translated at 100.0% (588 of 588 strings) Co-authored-by: Rafael Fontenelle Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/ Translation: F-Droid/F-Droid Server --- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 112 +++++++++++------------ 1 file changed, 52 insertions(+), 60 deletions(-) diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 4b63dd12..f6b70bcd 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -3,7 +3,7 @@ # Wellington Terumi Uemura , 2020. # André Marcelo Alvarenga , 2020. # Hans-Christoph Steiner , 2020. -# Rafael Fontenelle , 2020. +# Rafael Fontenelle , 2020, 2021. # ssantos , 2020. # The Cats , 2020. msgid "" @@ -11,15 +11,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2020-11-09 19:08+0000\n" -"Last-Translator: The Cats \n" +"PO-Revision-Date: 2021-01-14 21:33+0000\n" +"Last-Translator: Rafael Fontenelle \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.3.2\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py msgid "" @@ -154,9 +154,8 @@ msgid "'keypass' not found in config.py!" msgstr "'keypass' não foi encontrada em config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keypass' not found in config.yml!" -msgstr "'keypass' não foi encontrada em config.py!" +msgstr "\"keypass\" não encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" @@ -167,27 +166,24 @@ msgid "'keystore' not found in config.py!" msgstr "'keystore' não encontrada em config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystore' not found in config.yml!" -msgstr "'keystore' não encontrada em config.py!" +msgstr "\"keystore\" não encontrada em config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "'keystorepass' não encontrada em config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' não encontrada em config.py!" +msgstr "\"keystorepass\" não encontrada em config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "'repo_keyalias' não encontrada em config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' não encontrada em config.py!" +msgstr "\"repo_keyalias\" não encontrada em config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -199,9 +195,8 @@ msgid "'sdk_path' not set in 'config.py'!" msgstr "'sdk_path' não definido em 'config.py'!" #: ../fdroidserver/common.py -#, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "'sdk_path' não definido em 'config.py'!" +msgstr "\"sdk_path\" não definido em config.yml!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -249,7 +244,7 @@ msgstr "...checkupdate falhou para {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid ".__call__() not defined" -msgstr ".__ligação__() não definida" +msgstr ".__call__() não definida" #: ../fdroidserver/metadata.py msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." @@ -269,7 +264,7 @@ msgstr "Adicione assinaturas PGP usando GnuPG para os pacotes no repositório" #: ../fdroid ../fdroidserver/__main__.py msgid "Add a new application from its source code" -msgstr "Adicione um novo aplicativo a partir do seu código fonte" +msgstr "Adiciona um novo aplicativo a partir do seu código-fonte" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" @@ -318,9 +313,9 @@ msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "O SDK Android '{path}' não tem '{dirname}' instalado!" #: ../fdroidserver/init.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "SDK do Android não foi encontrado!" +msgstr "Android SDK não encontrado em {path}!" #: ../fdroidserver/common.py msgid "Android SDK not found!" @@ -337,9 +332,9 @@ msgid "Android SDK path '{path}' is not a directory!" msgstr "O caminho do SDK Android '{path}' não é um diretório!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "SDK do Android não foi encontrado!" +msgstr "Ferramenta {cmd} do Android SDK encontrada!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -389,7 +384,7 @@ msgstr "Link simbólico quebrado: {path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Build a package from source" -msgstr "Compilar um pacote a partir do código fonte" +msgstr "Compila um pacote a partir do código-fonte" #: ../fdroidserver/build.py msgid "Build all applications available" @@ -459,7 +454,7 @@ msgstr "As categorias não estão definidas" #: ../fdroid ../fdroidserver/__main__.py msgid "Check for updates to applications" -msgstr "Verifique se existem atualizações para os aplicativos" +msgstr "Verifica se existem atualizações para os aplicativos" #: ../fdroidserver/update.py #, python-brace-format @@ -489,7 +484,7 @@ msgstr "Lista de categorias separadas por vírgula." #: ../fdroid ../fdroidserver/__main__.py #, c-format, python-format msgid "Command '%s' not recognised.\n" -msgstr "Comando '%s' não é reconhecido\n" +msgstr "Comando \"%s\" não reconhecido.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" @@ -502,7 +497,7 @@ msgstr "Argumentos conflitantes: \"--verbose\" e \"--quiet\" não podem ser espe #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "Arquivos de configuração conflitantes! Usando {newfile}, ignorando {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format @@ -523,9 +518,9 @@ msgid "Could not find {path} to remove it" msgstr "Impossível encontrar {path} para removê-lo" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "Impossível abrir o arquivo de APK para analisá-lo" +msgstr "Impossível abrir o APK {path} para análise: " #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" @@ -565,7 +560,7 @@ msgstr "Criar uma chave de assinatura do repositório em uma keystore" #: ../fdroidserver/update.py msgid "Create skeleton metadata files that are missing" -msgstr "Criar as bases dos arquivos de metadados que estão faltando" +msgstr "Cria as bases dos arquivos de metadados que estão faltando" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -614,7 +609,7 @@ msgstr "DEBUG_KEYSTORE não está definido ou o valor está incompleto" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "Apagar os APKs e/ou OBBs sem metadados do repositório" +msgstr "Apaga os APKs e/ou OBBs sem metadados do repositório" #: ../fdroidserver/deploy.py #, python-brace-format @@ -717,7 +712,7 @@ msgstr "Link duplicado em '{field}': {url}" #: ../fdroid msgid "Dynamically scan APKs post build" -msgstr "Escanear dinamicamente os APKs após a compilação" +msgstr "Percorre dinamicamente os APKs após a compilação" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -757,7 +752,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "A variável de ambiente {var} de {configname} não está definida!" #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py @@ -1030,7 +1025,7 @@ msgstr "Instalar todos os aplicativos assinados disponíveis" #: ../fdroid ../fdroidserver/__main__.py msgid "Install built packages on devices" -msgstr "Instalar pacotes prontos nos dispositivos" +msgstr "Instala pacotes compilados nos dispositivos" #: ../fdroidserver/install.py #, python-format @@ -1054,7 +1049,7 @@ msgstr "Instalando '{apkfilename}' em {dev} …" #: ../fdroid ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" -msgstr "Interagir com o servidor HTTP do repositório" +msgstr "Interage com o servidor HTTP do repositório" #: ../fdroidserver/update.py msgid "Invalid APK" @@ -1245,9 +1240,8 @@ msgid "No commit specified for {versionName} in {linedesc}" msgstr "Nenhum commit especificado para {versionName} em {linedesc}" #: ../fdroidserver/common.py -#, fuzzy msgid "No config.yml found, using defaults." -msgstr "Nenhum 'config.py' encontrado, usando padrões." +msgstr "Nenhum config.yml encontrado, usando padrões." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1328,9 +1322,8 @@ msgid "Now set these in config.py:" msgstr "Agora defina estes em config.py:" #: ../fdroidserver/init.py -#, fuzzy msgid "Now set these in config.yml:" -msgstr "Agora defina estes em config.py:" +msgstr "Agora, defina estes em config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1482,7 +1475,7 @@ msgstr "Produzir XML/JSON legível por humanos para arquivos de índice" #: ../fdroidserver/update.py msgid "Produce human-readable index.xml" -msgstr "Gerar um index.xml legível por humanos" +msgstr "Produz um index.xml legível por humanos" #: ../fdroidserver/import.py msgid "Project URL to import from." @@ -1508,11 +1501,11 @@ msgstr "Empurrando para {url}" #: ../fdroid ../fdroidserver/__main__.py msgid "Quickly start a new repository" -msgstr "Rapidamente comece um novo repositório" +msgstr "Cria rapidamente um novo repositório" #: ../fdroid ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" -msgstr "Ler todos os arquivos de metadados e sair" +msgstr "Lê todos os arquivos de metadados e sai" #: ../fdroidserver/common.py #, python-brace-format @@ -1546,7 +1539,7 @@ msgstr "Removendo arquivos especificados" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" -msgstr "Renomear arquivos APK que não são do tipo pacote.nome_123.apk" +msgstr "Renomeia arquivos APK que não correspondem a pacote.nome_123.apk" #: ../fdroidserver/update.py msgid "Report on build data status" @@ -1571,7 +1564,7 @@ msgstr "Restringir a saída a erros e avisos" #: ../fdroid ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" -msgstr "Reescrever todos os arquivos de metadados" +msgstr "Reescreve todos os arquivos de metadados" #: ../fdroidserver/rewritemeta.py msgid "Rewrite to a specific format: " @@ -1614,7 +1607,7 @@ msgstr "Verifique os APKs resultantes na busca das classes não gratuitas já co #: ../fdroid ../fdroidserver/__main__.py msgid "Scan the source code of a package" -msgstr "Escanear o código fonte de um pacote" +msgstr "Percorre o código-fonte de um pacote" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1667,11 +1660,11 @@ msgstr "Configurar um emulador, instalar o apk nele e escanear com o drozer" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" -msgstr "Assine e coloque pacotes no repositório" +msgstr "Assina e coloca pacotes no repositório" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" -msgstr "Assinar os índices criados usando update --nosign" +msgstr "Assina os índices criados usando update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" @@ -1804,9 +1797,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.py!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.py!" +msgstr "Para usar awsbucket, awssecretkey and awsaccesskeyid também devem ser definidos em config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1841,7 +1833,7 @@ msgstr "Texto inesperado na mesma linha como {field} em {linedesc}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "" +msgstr "Entrada desconhecida {key} em {configname}" #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" @@ -1958,15 +1950,15 @@ msgstr "Caminho scanignore não usado: %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" -msgstr "Atualize as informações do repositório para novos pacotes" +msgstr "Atualiza as informações do repositório para novos pacotes" #: ../fdroid ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" -msgstr "Atualizar o log de transparência de um binário para um URL" +msgstr "Atualiza o log de transparência de um binário para um URL" #: ../fdroid ../fdroidserver/__main__.py msgid "Update the stats of the repo" -msgstr "Atualizar as estatísticas do repositório" +msgstr "Atualiza as estatísticas do repositório" #: ../fdroidserver/update.py ../fdroidserver/build.py msgid "Update the wiki" @@ -2082,7 +2074,7 @@ msgstr "Verifique a cópia em cache local em vez de redescarregando." #: ../fdroid ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" -msgstr "Verifique a integridade dos pacotes baixados" +msgstr "Verifica a integridade dos pacotes baixados" #: ../fdroidserver/index.py msgid "Verifying index signature:" @@ -2095,7 +2087,7 @@ msgstr "A chave API do VirusTotal não pode carregar arquivos maiores que 32MB, #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" -msgstr "Avisar sobre possíveis erros de metadados" +msgstr "Avisa sobre possíveis erros de metadados" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2134,7 +2126,7 @@ msgstr "adicionando a {name}: {path}" #: /usr/lib/python3.7/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "opção ambígua: %(option)s poderia corresponder %(matches)s" +msgstr "opção ambígua: %(option)s pode corresponder a %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2194,7 +2186,7 @@ msgstr "não é possível analisar a especificação scrlib (não uma string): ' #: /usr/lib/python3.7/argparse.py #, python-format msgid "can't open '%s': %s" -msgstr "não dá pra abrir '%s': %s" +msgstr "não foi possível abrir \"%s\": %s" #: ../fdroidserver/build.py #, python-brace-format @@ -2465,13 +2457,13 @@ msgstr "opção %s: escolha inválida: %r (escolha entre %s)" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option -%s not recognized" -msgstr "Comando '%s' não é reconhecido" +msgstr "opção -%s não reconhecida" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py #, python-format msgid "option -%s requires argument" -msgstr "Opção -%s necessita argumento" +msgstr "a opção -%s necessita de argumento" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2489,7 +2481,7 @@ msgstr "opção --%s não é prefixo único" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s not recognized" -msgstr "Comando --%s não é reconhecido" +msgstr "opção --%s não reconhecida" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2548,13 +2540,13 @@ msgstr "biblioteca compartilhada" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "show program's version number and exit" -msgstr "mostrar versão do programa e sair" +msgstr "mostra o número da versão do programa e sai" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py msgid "show this help message and exit" -msgstr "mostrar esta mensagem de ajuda e sair" +msgstr "mostra esta mensagem de ajuda e sai" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." @@ -2733,7 +2725,7 @@ msgstr "{name} \"{path}\" não existe! Corrija-o no config.py." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "{oldfile} foi descontinuado, use {newfile}" #: ../fdroidserver/import.py #, python-brace-format From 47f4b3509efcc3cf14c11697b40bd65264c23a4d Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Fri, 15 Jan 2021 14:25:13 +0100 Subject: [PATCH 0054/2116] Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk Currently translated at 100.0% (588 of 588 strings) Co-authored-by: Ihor Hordiichuk Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 50 +++++++++++---------------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 5e117d08..4970c325 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -2,13 +2,13 @@ # Copyright (C) YEAR Free Software Foundation, Inc. # Hans-Christoph Steiner , 2020. # ihor_ck , 2020. -# Ihor Hordiichuk , 2020. +# Ihor Hordiichuk , 2020, 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2020-12-08 12:29+0000\n" +"PO-Revision-Date: 2021-01-14 21:33+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" "Language: uk\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.4-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py msgid "" @@ -151,9 +151,8 @@ msgid "'keypass' not found in config.py!" msgstr "'keypass' не знайдено в config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keypass' not found in config.yml!" -msgstr "'keypass' не знайдено в config.py!" +msgstr "'keypass' не знайдено в config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" @@ -164,27 +163,24 @@ msgid "'keystore' not found in config.py!" msgstr "'keystore' не знайдено в config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystore' not found in config.yml!" -msgstr "'keystore' не знайдено в config.py!" +msgstr "'keystore' не знайдено в config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "'keystorepass' не знайдено в config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' не знайдено в config.py!" +msgstr "'keystorepass' не знайдено в config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "'repo_keyalias' не знайдено в config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' не знайдено в config.py!" +msgstr "'repo_keyalias' не знайдено в config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -196,9 +192,8 @@ msgid "'sdk_path' not set in 'config.py'!" msgstr "'sdk_path' не встановлено в 'config.py'!" #: ../fdroidserver/common.py -#, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "'sdk_path' не встановлено в 'config.py'!" +msgstr "'sdk_path' не встановлено в config.yml!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -315,9 +310,9 @@ msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "Android SDK '{path}' '{dirname}' не встановлено!" #: ../fdroidserver/init.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "Android SDK не знайдено!" +msgstr "Android SDK не знайдено в {path}!" #: ../fdroidserver/common.py msgid "Android SDK not found!" @@ -334,9 +329,9 @@ msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK шлях '{path}' це не каталог!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "Android SDK не знайдено!" +msgstr "{cmd} засіб Android SDK знайдено!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -500,7 +495,7 @@ msgstr "Конфліктні аргументи: \"---verbose\" і \"--quiet\" #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "Суперечливі файли налаштувань! Використання {newfile}, ігнорування {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format @@ -521,9 +516,9 @@ msgid "Could not find {path} to remove it" msgstr "Не вдалося знайти шлях {path}, щоб вилучити його" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "Не вдалося відкрити файл apk для аналізу" +msgstr "Не вдалося відкрити файл APK {path} для аналізу: " #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" @@ -755,7 +750,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "Змінну середовища {var} від {configname} не налаштованоно!" #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py @@ -1243,9 +1238,8 @@ msgid "No commit specified for {versionName} in {linedesc}" msgstr "У версії {linedesc} не вказано поданнь для {versionName}" #: ../fdroidserver/common.py -#, fuzzy msgid "No config.yml found, using defaults." -msgstr "Не знайдено 'config.py', використовуючи типові налаштування." +msgstr "config.yml не знайдено, використання типових налаштувань." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1326,9 +1320,8 @@ msgid "Now set these in config.py:" msgstr "Тепер встановіть їх у config.py:" #: ../fdroidserver/init.py -#, fuzzy msgid "Now set these in config.yml:" -msgstr "Тепер встановіть їх у config.py:" +msgstr "Тепер встановіть їх у config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1803,9 +1796,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "Для використання awsbucket, awssecretkey та awsaccesskeyid також слід налаштувати config.py!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Для використання awsbucket, awssecretkey та awsaccesskeyid також слід налаштувати config.py!" +msgstr "Для користування awsbucket, awssecretkey та awsaccesskeyid також слід налаштувати їх у config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1840,7 +1832,7 @@ msgstr "Несподіваний текст у тому ж рядку, що і { #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "" +msgstr "Невідомий запис {key} у {configname}" #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" @@ -2735,7 +2727,7 @@ msgstr "{name} \"{path}\" не існує! Виправте його в config.p #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "{oldfile} вилучено, використовується {newfile}" #: ../fdroidserver/import.py #, python-brace-format From 5d75d4491fafc3d9d4eb1bd9b9c9738e06e8c679 Mon Sep 17 00:00:00 2001 From: Golubev Alexander Date: Fri, 15 Jan 2021 14:25:13 +0100 Subject: [PATCH 0055/2116] Translated using Weblate: Russian (ru) by Golubev Alexander Currently translated at 100.0% (588 of 588 strings) Co-authored-by: Golubev Alexander Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translation: F-Droid/F-Droid Server --- locale/ru/LC_MESSAGES/fdroidserver.po | 50 +++++++++++---------------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 5cdba1ad..a4e976f0 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -1,6 +1,6 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# Golubev Alexander , 2020. +# Golubev Alexander , 2020, 2021. # Mingun , 2020. # anonymous , 2020. # Andrey , 2020. @@ -13,7 +13,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2020-12-23 21:25+0000\n" +"PO-Revision-Date: 2021-01-14 21:33+0000\n" "Last-Translator: Golubev Alexander \n" "Language-Team: Russian \n" "Language: ru\n" @@ -21,7 +21,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.4.1-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py msgid "" @@ -157,9 +157,8 @@ msgid "'keypass' not found in config.py!" msgstr "В config.py нет переменной 'keypass'!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keypass' not found in config.yml!" -msgstr "В config.py нет переменной 'keypass'!" +msgstr "'keypass' не найден в config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" @@ -170,27 +169,24 @@ msgid "'keystore' not found in config.py!" msgstr "В config.py нет переменной 'keystore'!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystore' not found in config.yml!" -msgstr "В config.py нет переменной 'keystore'!" +msgstr "'keystore' не найден в config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "В config.py нет переменной 'keystorepass'!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystorepass' not found in config.yml!" -msgstr "В config.py нет переменной 'keystorepass'!" +msgstr "'keystorepass' не найден в config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "В config.py нет переменной 'repo_ keyalias'!" #: ../fdroidserver/common.py -#, fuzzy msgid "'repo_keyalias' not found in config.yml!" -msgstr "В config.py нет переменной 'repo_ keyalias'!" +msgstr "'repo_keyalias' не найден в config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -202,9 +198,8 @@ msgid "'sdk_path' not set in 'config.py'!" msgstr "В config.py не определен 'sdk_path'!" #: ../fdroidserver/common.py -#, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "В config.py не определен 'sdk_path'!" +msgstr "'sdk_path' не найден в config.yml!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -321,9 +316,9 @@ msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "В установленной Android SDK '{path}' нет '{dirname}'!" #: ../fdroidserver/init.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "Android SDK не обнаружен!" +msgstr "Android SDK не обнаружен в {path}!" #: ../fdroidserver/common.py msgid "Android SDK not found!" @@ -340,9 +335,9 @@ msgid "Android SDK path '{path}' is not a directory!" msgstr "Путь Android SDK '{path}' указывает не на директорию!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "Android SDK не обнаружен!" +msgstr "Утилита {cmd} из Android SDK не найдена!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -506,7 +501,7 @@ msgstr "Несовместимые аргументы: '--verbose' и '--quiet' #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "Конфликтуюущие файлы настроек! {newfile} — используется; {oldfile} — игнорируется!" #: ../fdroidserver/common.py #, python-brace-format @@ -527,9 +522,9 @@ msgid "Could not find {path} to remove it" msgstr "Указанный для удаления {path} не найден" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "Не удалось открыть и проанализировать файл APK" +msgstr "Не удалось открыть и проанализировать файл APK {path}: " #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" @@ -761,7 +756,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "Переменная среды {var} из {configname} не установлена!" #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py @@ -1249,9 +1244,8 @@ msgid "No commit specified for {versionName} in {linedesc}" msgstr "Не выбраны коммиты для {versionName} в {linedesc}" #: ../fdroidserver/common.py -#, fuzzy msgid "No config.yml found, using defaults." -msgstr "Файл 'config.py' не обнаружен. Используется конфигурация по умолчанию." +msgstr "Файл 'config.yml' не обнаружен. Используется конфигурация по умолчанию." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1332,9 +1326,8 @@ msgid "Now set these in config.py:" msgstr "Определите эти переменные в config.py:" #: ../fdroidserver/init.py -#, fuzzy msgid "Now set these in config.yml:" -msgstr "Определите эти переменные в config.py:" +msgstr "Определите эти переменные в config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1809,9 +1802,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "Необходимо определить переменные awsbucket, awssecretkey и awsaccesskeyid в config.py!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Необходимо определить переменные awsbucket, awssecretkey и awsaccesskeyid в config.py!" +msgstr "Чтобы использовать awsbucket необходимо определить awssecretkey и awsaccesskeyid в config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1846,7 +1838,7 @@ msgstr "Лишний текст в той же строчке, что и {field} #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "" +msgstr "Неизвестная запись {key} в {configname}" #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" @@ -2741,7 +2733,7 @@ msgstr "{name}: неверный путь \"{path}\"! Поправьте его #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "{oldfile} признан устаревшим; используйте {newfile}" #: ../fdroidserver/import.py #, python-brace-format From 94cb19f5713d38857713c637f929711f50475d07 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 11 Jan 2021 16:56:24 +0100 Subject: [PATCH 0056/2116] set METADATA_VERSION to 20000 to leave room for 1.1.x changes --- fdroidserver/update.py | 2 +- tests/repo/index-v1.json | 2 +- tests/repo/index.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 80e092c3..8679b134 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -56,7 +56,7 @@ if hasattr(Image, 'DecompressionBombWarning'): warnings.simplefilter('error', Image.DecompressionBombWarning) Image.MAX_IMAGE_PIXELS = 0xffffff # 4096x4096 -METADATA_VERSION = 21 +METADATA_VERSION = 20000 # less than the valid range of versionCode, i.e. Java's Integer.MIN_VALUE UNSET_VERSION_CODE = -0x100000000 diff --git a/tests/repo/index-v1.json b/tests/repo/index-v1.json index fe93947a..5ad2ffe6 100644 --- a/tests/repo/index-v1.json +++ b/tests/repo/index-v1.json @@ -1,7 +1,7 @@ { "repo": { "timestamp": 1502845383782, - "version": 21, + "version": 20000, "name": "My First F-Droid Repo Demo", "icon": "fdroid-icon.png", "address": "https://MyFirstFDroidRepo.org/fdroid/repo", diff --git a/tests/repo/index.xml b/tests/repo/index.xml index 9af45f96..6f9ed101 100644 --- a/tests/repo/index.xml +++ b/tests/repo/index.xml @@ -1,6 +1,6 @@ - + This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/u/fdroid. http://foobarfoobarfoobar.onion/fdroid/repo https://foo.bar/fdroid/repo From 097b77ee2ba8ac020632bdea3f77425bcf5c3359 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 15 Dec 2020 17:26:00 +0100 Subject: [PATCH 0057/2116] update CHANGELOG https://gitlab.com/fdroid/fdroidserver/-/milestones/10 --- CHANGELOG.md | 65 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 58 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c4f69a7..b76fe549 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,19 +5,51 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## [Unreleased] + +For a more complete overview, see the [2.0 +milestone](https://gitlab.com/fdroid/fdroidserver/-/milestones/10) + ### Added -* makebuildserver: added ndk r20 +* `fdroid update` inserts donation links based on upstream's _FUNDING.yml_ + ([!754](https://gitlab.com/fdroid/fdroidserver/merge_requests/754)) +* Stable, public API for most useful functions + ([!798](https://gitlab.com/fdroid/fdroidserver/merge_requests/798)) +* Load with any YAML lib and use with the API, no more custom parser needed + ([!826](https://gitlab.com/fdroid/fdroidserver/merge_requests/826)) + ([!838](https://gitlab.com/fdroid/fdroidserver/merge_requests/838)) +* _config.yml_ for a safe, easy, standard configuration format ([!663](https://gitlab.com/fdroid/fdroidserver/merge_requests/663)) -* added support for gradle 5.5.1 - ([!656](https://gitlab.com/fdroid/fdroidserver/merge_requests/656)) -* add SHA256 to filename of repo graphics +* Config options can be set from environment variables using this syntax: + `keystorepass: {env: keystorepass}` ([!669](https://gitlab.com/fdroid/fdroidserver/merge_requests/669)) -* support for srclibs metadata in YAML format +* Add SHA256 to filename of repo graphics + ([!669](https://gitlab.com/fdroid/fdroidserver/merge_requests/669)) +* Support for srclibs metadata in YAML format ([!700](https://gitlab.com/fdroid/fdroidserver/merge_requests/700)) -* check srclibs and app-metadata files with yamllint +* Check srclibs and app-metadata files with yamllint ([!721](https://gitlab.com/fdroid/fdroidserver/merge_requests/721)) +* Added plugin system for adding subcommands to `fdroid` + ([!709](https://gitlab.com/fdroid/fdroidserver/merge_requests/709)) +* `fdroid update`, `fdroid publish`, and `fdroid signindex` now work + with SmartCard HSMs, specifically the NitroKey HSM + ([!779](https://gitlab.com/fdroid/fdroidserver/merge_requests/779)) + ([!782](https://gitlab.com/fdroid/fdroidserver/merge_requests/782)) +* `fdroid update` support for Triple-T Gradle Play Publisher v2.x + ([!683](https://gitlab.com/fdroid/fdroidserver/merge_requests/683)) ### Fixed +* Smoother process for signing APKs with `apksigner` + ([!736](https://gitlab.com/fdroid/fdroidserver/merge_requests/736)) + ([!821](https://gitlab.com/fdroid/fdroidserver/merge_requests/821)) +* All parts except _build_ and _publish_ work without the Android SDK + ([!821](https://gitlab.com/fdroid/fdroidserver/merge_requests/821)) +* Description: is now passed to clients unchanged, no HTML conversion + ([!828](https://gitlab.com/fdroid/fdroidserver/merge_requests/828)) +* Lots of improvements for scanning for proprietary code and trackers + ([!748](https://gitlab.com/fdroid/fdroidserver/merge_requests/748)) + ([!REPLACE](https://gitlab.com/fdroid/fdroidserver/merge_requests/REPLACE)) + ([!844](https://gitlab.com/fdroid/fdroidserver/merge_requests/844)) +* `fdroid mirror` now generates complete, working local mirror repos * fix build-logs dissapearing when deploying ([!685](https://gitlab.com/fdroid/fdroidserver/merge_requests/685)) * do not crash when system encoding can not be retrieved @@ -33,11 +65,30 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ([!651](https://gitlab.com/fdroid/fdroidserver/merge_requests/651)) * `fdroid init` generates PKCS12 keystores, drop Java < 8 support ([!801](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/801)) +* Parse Version Codes specified in hex + ([!692](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/692)) +* Major refactoring on core parts of code to be more Pythonic + ([!756](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/756)) ### Removed -* removed support for txt and json metadata +* Removed all support for _.txt_ and _.json_ metadata ([!772](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/772)) +* dropped support for Debian 8 _jessie_ and 9 _stretch_ +* dropped support for Ubuntu releases older than bionic 18.04 +* dropped `fdroid server update` and `fdroid server init`, + use `fdroid deploy` +* `fdroid dscanner` was removed. + ([!711](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/711)) * `make_current_version_link` is now off by default +* Dropped `force_build_tools` config option + ([!797](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/797)) +* Dropped `accepted_formats` config option, there is only _.yml_ now + ([!818](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/818)) +* `Provides:` was removed as a metadata field + ([!654](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/654)) +* Remove unused `latestapps.dat` + ([!794](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/794)) + ## [1.1.4] - 2019-08-15 ### Fixed From d16ccc6d6ce52e693eeef5573663793728fa81c7 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 15 Jan 2021 15:11:50 +0100 Subject: [PATCH 0058/2116] version 2.0b --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 22958250..ca8c1e2b 100755 --- a/setup.py +++ b/setup.py @@ -53,7 +53,7 @@ with open("README.md", "r") as fh: long_description = fh.read() setup(name='fdroidserver', - version='2.0a5', + version='2.0b', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From c8f21bf0e0e1ff8cc33821b4bb56692a1f5c7ea4 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 20 Aug 2020 14:57:57 +0200 Subject: [PATCH 0059/2116] add some example plugins for repo key extraction and migration --- MANIFEST.in | 5 ++ .../fdroid_export_keystore_to_nitrokey.py | 61 +++++++++++++++++++ examples/fdroid_exportkeystore.py | 48 +++++++++++++++ examples/fdroid_extract_repo_pubkey.py | 22 +++++++ examples/fdroid_nitrokeyimport.py | 41 +++++++++++++ 5 files changed, 177 insertions(+) create mode 100644 examples/fdroid_export_keystore_to_nitrokey.py create mode 100644 examples/fdroid_exportkeystore.py create mode 100644 examples/fdroid_extract_repo_pubkey.py create mode 100644 examples/fdroid_nitrokeyimport.py diff --git a/MANIFEST.in b/MANIFEST.in index 948d8fc7..49e08dbc 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -9,7 +9,12 @@ include buildserver/Vagrantfile include CHANGELOG.md include completion/bash-completion include examples/config.yml +include examples/fdroid_exportkeystore.py +include examples/fdroid_export_keystore_to_nitrokey.py +include examples/fdroid_extract_repo_pubkey.py +include examples/fdroid_fetchsrclibs.py include examples/fdroid-icon.png +include examples/fdroid_nitrokeyimport.py include examples/makebuildserver.config.py include examples/opensc-fdroid.cfg include examples/public-read-only-s3-bucket-policy.json diff --git a/examples/fdroid_export_keystore_to_nitrokey.py b/examples/fdroid_export_keystore_to_nitrokey.py new file mode 100644 index 00000000..92de2b30 --- /dev/null +++ b/examples/fdroid_export_keystore_to_nitrokey.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python3 +# +# an fdroid plugin for exporting a repo's keystore in standard PEM format + +import os +from argparse import ArgumentParser +from fdroidserver import common +from fdroidserver.common import FDroidPopen +from fdroidserver.exception import BuildException + +fdroid_summary = "export the repo's keystore file to a NitroKey HSM" + + +def run(cmd, error): + envs = {'LC_ALL': 'C.UTF-8', + 'PIN': config['smartcard_pin'], + 'FDROID_KEY_STORE_PASS': config['keystorepass'], + 'FDROID_KEY_PASS': config['keypass']} + p = FDroidPopen(cmd, envs=envs) + if p.returncode != 0: + raise BuildException(error, p.output) + + +def main(): + global config + parser = ArgumentParser() + common.setup_global_opts(parser) + options = parser.parse_args() + config = common.read_config(options) + destkeystore = config['keystore'].replace('.jks', '.p12').replace('/', '_') + exportkeystore = config['keystore'].replace('.jks', '.pem').replace('/', '_') + if os.path.exists(destkeystore) or os.path.exists(exportkeystore): + raise BuildException('%s exists!' % exportkeystore) + run([config['keytool'], '-importkeystore', + '-srckeystore', config['keystore'], + '-srcalias', config['repo_keyalias'], + '-srcstorepass:env', 'FDROID_KEY_STORE_PASS', + '-srckeypass:env', 'FDROID_KEY_PASS', + '-destkeystore', destkeystore, + '-deststorepass:env', 'FDROID_KEY_STORE_PASS', + '-deststoretype', 'PKCS12'], + 'Failed to convert to PKCS12!') +# run(['openssl', 'pkcs12', '-in', destkeystore, +# '-passin', 'env:FDROID_KEY_STORE_PASS', '-nokeys', +# '-out', exportkeystore, +# '-passout', 'env:FDROID_KEY_STORE_PASS'], +# 'Failed to convert to PEM!') + run(['pkcs15-init', '--delete-objects', 'privkey,pubkey', + '--id', '3', '--store-private-key', destkeystore, + '--format', 'pkcs12', '--auth-id', '3', + '--verify-pin', '--pin', 'env:PIN'], + '') + run(['pkcs15-init', '--delete-objects', 'privkey,pubkey', + '--id', '2', '--store-private-key', destkeystore, + '--format', 'pkcs12', '--auth-id', '3', + '--verify-pin', '--pin', 'env:PIN'], + '') + + +if __name__ == "__main__": + main() diff --git a/examples/fdroid_exportkeystore.py b/examples/fdroid_exportkeystore.py new file mode 100644 index 00000000..9e54e397 --- /dev/null +++ b/examples/fdroid_exportkeystore.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +# +# an fdroid plugin for exporting a repo's keystore in standard PEM format + +import os +from argparse import ArgumentParser +from fdroidserver import common +from fdroidserver.common import FDroidPopen +from fdroidserver.exception import BuildException + +fdroid_summary = 'export the keystore in standard PEM format' + + +def main(): + parser = ArgumentParser() + common.setup_global_opts(parser) + options = parser.parse_args() + config = common.read_config(options) + env_vars = {'LC_ALL': 'C.UTF-8', + 'FDROID_KEY_STORE_PASS': config['keystorepass'], + 'FDROID_KEY_PASS': config['keypass']} + destkeystore = config['keystore'].replace('.jks', '.p12').replace('/', '_') + exportkeystore = config['keystore'].replace('.jks', '.pem').replace('/', '_') + if os.path.exists(destkeystore) or os.path.exists(exportkeystore): + raise BuildException('%s exists!' % exportkeystore) + p = FDroidPopen([config['keytool'], '-importkeystore', + '-srckeystore', config['keystore'], + '-srcalias', config['repo_keyalias'], + '-srcstorepass:env', 'FDROID_KEY_STORE_PASS', + '-srckeypass:env', 'FDROID_KEY_PASS', + '-destkeystore', destkeystore, + '-deststoretype', 'PKCS12', + '-deststorepass:env', 'FDROID_KEY_STORE_PASS', + '-destkeypass:env', 'FDROID_KEY_PASS'], + envs=env_vars) + if p.returncode != 0: + raise BuildException("Failed to convert to PKCS12!", p.output) + p = FDroidPopen(['openssl', 'pkcs12', '-in', destkeystore, + '-passin', 'env:FDROID_KEY_STORE_PASS', '-nokeys', + '-out', exportkeystore, + '-passout', 'env:FDROID_KEY_STORE_PASS'], + envs=env_vars) + if p.returncode != 0: + raise BuildException("Failed to convert to PEM!", p.output) + + +if __name__ == "__main__": + main() diff --git a/examples/fdroid_extract_repo_pubkey.py b/examples/fdroid_extract_repo_pubkey.py new file mode 100644 index 00000000..de13d267 --- /dev/null +++ b/examples/fdroid_extract_repo_pubkey.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 +# +# an fdroid plugin print the repo_pubkey from a repo's keystore +# + +from argparse import ArgumentParser +from fdroidserver import common, index + +fdroid_summary = 'export the keystore in standard PEM format' + + +def main(): + parser = ArgumentParser() + common.setup_global_opts(parser) + options = parser.parse_args() + common.config = common.read_config(options) + pubkey, repo_pubkey_fingerprint = index.extract_pubkey() + print('repo_pubkey = "%s"' % pubkey.decode()) + + +if __name__ == "__main__": + main() diff --git a/examples/fdroid_nitrokeyimport.py b/examples/fdroid_nitrokeyimport.py new file mode 100644 index 00000000..44ec299c --- /dev/null +++ b/examples/fdroid_nitrokeyimport.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 + +from argparse import ArgumentParser +from fdroidserver import common +from fdroidserver.common import FDroidPopen +from fdroidserver.exception import BuildException + +fdroid_summary = 'import the local keystore into a SmartCard HSM' + + +def main(): + parser = ArgumentParser() + common.setup_global_opts(parser) + options = parser.parse_args() + config = common.read_config(options) + env_vars = { + 'LC_ALL': 'C.UTF-8', + 'FDROID_KEY_STORE_PASS': config['keystorepass'], + 'FDROID_KEY_PASS': config['keypass'], + 'SMARTCARD_PIN': str(config['smartcard_pin']), + } + p = FDroidPopen([config['keytool'], '-importkeystore', + '-srcalias', config['repo_keyalias'], + '-srckeystore', config['keystore'], + '-srcstorepass:env', 'FDROID_KEY_STORE_PASS', + '-srckeypass:env', 'FDROID_KEY_PASS', + '-destalias', config['repo_keyalias'], + '-destkeystore', 'NONE', + '-deststoretype', 'PKCS11', + '-providerName', 'SunPKCS11-OpenSC', + '-providerClass', 'sun.security.pkcs11.SunPKCS11', + '-providerArg', 'opensc-fdroid.cfg', + '-deststorepass:env', 'SMARTCARD_PIN', + '-J-Djava.security.debug=sunpkcs11'], + envs=env_vars) + if p.returncode != 0: + raise BuildException("Failed to import into HSM!", p.output) + + +if __name__ == "__main__": + main() From 41709c142fba508e0882962421680fa8b9e36f6a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 15 Jan 2021 16:36:50 +0100 Subject: [PATCH 0060/2116] version 2.0b0 (2.0b is not valid) --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ca8c1e2b..78ab7279 100755 --- a/setup.py +++ b/setup.py @@ -53,7 +53,7 @@ with open("README.md", "r") as fh: long_description = fh.read() setup(name='fdroidserver', - version='2.0b', + version='2.0b0', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From 7cf64ea48f9c603e62ff411c1cb51b0131b29299 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 15 Jan 2021 19:57:32 +0100 Subject: [PATCH 0061/2116] Run test from sdist source --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c2adc989..dbfc219f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -130,6 +130,8 @@ ubuntu_xenial_pip: - $pip install --upgrade pip setuptools - $pip install dist/fdroidserver-*.tar.gz - test -e /usr/share/locale/de/LC_MESSAGES/fdroidserver.mo + - tar xzf dist/fdroidserver-*.tar.gz + - cd fdroidserver-* - ./tests/run-tests # test install process on a bleeding edge distro with pip From 527b1caa90e7a5064299fb37a8ae616bb06b2dc0 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 15 Jan 2021 18:59:33 +0100 Subject: [PATCH 0062/2116] Add missing test files --- MANIFEST.in | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MANIFEST.in b/MANIFEST.in index 49e08dbc..19ac48e8 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -581,9 +581,11 @@ include tests/metadata/dump/org.videolan.vlc.yaml include tests/metadata/duplicate.permisssions.yml include tests/metadata/fake.ota.update.yml include tests/metadata/info.guardianproject.checkey/en-US/description.txt +include tests/metadata/info.guardianproject.checkey/en-US/name.txt include tests/metadata/info.guardianproject.checkey/en-US/phoneScreenshots/checkey-phone.png include tests/metadata/info.guardianproject.checkey/en-US/phoneScreenshots/checkey.png include tests/metadata/info.guardianproject.checkey/en-US/summary.txt +include tests/metadata/info.guardianproject.checkey/ja-JP/name.txt include tests/metadata/info.guardianproject.checkey.yml include tests/metadata/info.guardianproject.urzip/en-US/changelogs/100.txt include tests/metadata/info.guardianproject.urzip/en-US/full_description.txt From 5837c36219232074a0e2e30e6d7442e922dddb9c Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sat, 16 Jan 2021 15:12:01 +0100 Subject: [PATCH 0063/2116] script to set the completed locales based on Weblate data --- MANIFEST.in | 1 + locale/Makefile | 2 +- locale/pick-complete-translations.py | 54 ++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100755 locale/pick-complete-translations.py diff --git a/MANIFEST.in b/MANIFEST.in index 19ac48e8..48e4830a 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -34,6 +34,7 @@ include locale/pl/LC_MESSAGES/fdroidserver.mo include locale/pt_BR/LC_MESSAGES/fdroidserver.mo include locale/pt_PT/LC_MESSAGES/fdroidserver.mo include locale/ru/LC_MESSAGES/fdroidserver.mo +include locale/sq/LC_MESSAGES/fdroidserver.mo include locale/tr/LC_MESSAGES/fdroidserver.mo include locale/uk/LC_MESSAGES/fdroidserver.mo include locale/zh_Hans/LC_MESSAGES/fdroidserver.mo diff --git a/locale/Makefile b/locale/Makefile index 1dd27274..d181db1d 100644 --- a/locale/Makefile +++ b/locale/Makefile @@ -5,7 +5,7 @@ FILES = ../fdroid $(wildcard ../fdroidserver/*.py) \ $(wildcard /usr/lib/python3.*/getopt.py) # these are the supported languages -ALL_LINGUAS = bo de es fr hu it ko nb_NO pl pt_BR pt_PT ru tr uk zh_Hans zh_Hant +ALL_LINGUAS = $(shell sed -En 's,include locale/([^/]+)/.*,\1,p' ../MANIFEST.in) POFILES = $(wildcard */LC_MESSAGES/fdroidserver.po) MOFILES = $(ALL_LINGUAS:=/LC_MESSAGES/fdroidserver.mo) diff --git a/locale/pick-complete-translations.py b/locale/pick-complete-translations.py new file mode 100755 index 00000000..8c3eead1 --- /dev/null +++ b/locale/pick-complete-translations.py @@ -0,0 +1,54 @@ +#!/usr/bin/python3 +# +# add completed translations from weblate to MANIFEST.in + +import json +import os +import re +import requests +import sys + + +projectbasedir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +localedir = os.path.join(projectbasedir, 'locale') +print(projectbasedir) + +cached_file = os.path.join(localedir, 'fdroidserver.json') +if os.path.exists(cached_file): + with open(cached_file) as fp: + data = json.load(fp) +else: + url = 'https://hosted.weblate.org/exports/stats/f-droid/fdroidserver/?format=json' + r = requests.get(url) + r.raise_for_status() + data = r.json() + +active = set() +print('name locale translated approved error-free') +for locale in sorted(data, key=lambda locale: locale['code']): + print('%26s' % locale['name'], + '%8s' % locale['code'], + '%0.1f%%' % locale['translated_percent'], + '%0.1f%%' % locale['approved_percent'], + '%0.1f%%' % (100 - locale['failing_percent']), + sep='\t') + if locale['translated_percent'] >= 90 and locale['failing'] < 5: + active.add(locale['code']) + +manifest_file = os.path.join(projectbasedir, 'MANIFEST.in') +with open(manifest_file) as fp: + for line in fp.readlines(): + m = re.match(r'include locale/([^/]+)/.*', line) + if m: + active.add(m.group(1)) + +manifest_lines = set() +for locale in active: + manifest_lines.add('include locale/%s/LC_MESSAGES/fdroidserver.mo\n' % locale) + +with open(manifest_file, 'a') as fp: + for line in manifest_lines: + if line: + fp.write(line) + +os.system('sort -u -o %s %s' % (manifest_file, manifest_file)) From d8f32b5c803f70fe26994f0fafb0c1010d641531 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Sat, 16 Jan 2021 10:19:33 +0100 Subject: [PATCH 0064/2116] Translated using Weblate: Albanian (sq) by Besnik Bleta Currently translated at 97.2% (557 of 573 strings) Co-authored-by: Besnik Bleta Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/ Translation: F-Droid/F-Droid Server --- locale/sq/LC_MESSAGES/fdroidserver.po | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index f29961f1..7144825f 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-13 04:41+0000\n" +"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"PO-Revision-Date: 2021-01-14 14:58+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" "Language: sq\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4.1-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py msgid "" @@ -869,7 +869,7 @@ msgstr "Detyro ndaljen e montimit pas {0} sek. mbarimi kohe!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." -msgstr "" +msgstr "Detyro skanim aplikacionesh dhe montimesh të çaktivizuara." #: ../fdroidserver/update.py #, python-brace-format @@ -891,9 +891,9 @@ msgid "Found invalid versionCodes for some apps" msgstr "U gjetën versionCodes të pavlefshëm për disa aplikacione" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "U gjetën dëshmi të shumta nënshkrimi te {path}" +msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format @@ -916,7 +916,7 @@ msgstr "S’u gjetën dëshmi nënshkrimi për depon." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" -msgstr "" +msgstr "U gjet jo-kartelë te %s" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1253,9 +1253,8 @@ msgid "No git submodules available" msgstr "S’ka “git submodules”" #: ../fdroidserver/import.py -#, fuzzy msgid "No gradle project could be found. Specify --subdir?" -msgstr "S’u gjet dot projekt android ose kivy. Të specifikohet --subdir?" +msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py msgid "No information found." @@ -2627,7 +2626,7 @@ msgstr "po përdoret Apache libcloud për njëkohësim me {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "" +msgstr "virustotal.com i kufizon shpejtësitë, po pritet për riprovim…" #: ../fdroidserver/update.py msgid "wiki support is deprecated and will be removed in the next release!" From 8c9b2d9862209f120ac70d3b2474f2c1c4d72d59 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sat, 16 Jan 2021 10:19:33 +0100 Subject: [PATCH 0065/2116] Fix checks in Weblate by Hans-Christoph Steiner Currently translated at 97.2% (557 of 573 strings) Co-authored-by: Hans-Christoph Steiner Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/ Translation: F-Droid/F-Droid Server --- locale/bo/LC_MESSAGES/fdroidserver.po | 53 +++++++++++----------- locale/de/LC_MESSAGES/fdroidserver.po | 21 ++++----- locale/es/LC_MESSAGES/fdroidserver.po | 51 ++++++++++----------- locale/fr/LC_MESSAGES/fdroidserver.po | 19 ++++---- locale/hu/LC_MESSAGES/fdroidserver.po | 12 ++--- locale/kab/LC_MESSAGES/fdroidserver.po | 12 ++--- locale/sq/LC_MESSAGES/fdroidserver.po | 6 +-- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 19 ++++---- 8 files changed, 94 insertions(+), 99 deletions(-) diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index 7106e829..4f7b1db7 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -1,12 +1,12 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. -# Hans-Christoph Steiner , 2020. +# Hans-Christoph Steiner , 2020, 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2020-11-10 16:20+0000\n" +"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"PO-Revision-Date: 2021-01-14 14:58+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tibetan \n" "Language: bo\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.4-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py msgid "" @@ -113,7 +113,7 @@ msgstr "%(prog)s: ནོར་སྐྱོན: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" -msgstr "%d དཀའ་རྙོག་ཐོན་སོང་།" +msgstr "%d དཀའ་རྙོག་ཐོན་སོང་།" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -237,7 +237,7 @@ msgstr "...{appid} གྱི་ཆེད་དུ་གསར་བསྒྱུ #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid ".__call__() not defined" -msgstr ".__call__() ངོས་འཛིན་ཐུབ་མེད།" +msgstr ".__call__() ངོས་འཛིན་ཐུབ་མེད།" #: ../fdroidserver/metadata.py msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." @@ -250,7 +250,7 @@ msgstr "/གནས་དོན་བོར་བརླག་སོང་འད #: ../fdroidserver/mirror.py #, fuzzy msgid "A URL is required as an argument!" -msgstr "གདམ་ཀ། -%s 1 རྩོད་དགོས།" +msgstr "གདམ་ཀ། -%s 1 རྩོད་དགོས།" #: ../fdroid ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -370,7 +370,7 @@ msgstr "ཡན་ལག '{branch}1' བཟོ་སྐྲུན་ནང་བ #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" -msgstr "ཡན་ལག '{branch}1'' srclib ནང་བེད་སྤྱོད་བྱེད་རྒྱུ་ཁས་ལེན་ཡོད་།'{srclib}'" +msgstr "ཡན་ལག '{branch}1'' srclib ནང་བེད་སྤྱོད་བྱེད་རྒྱུ་ཁས་ལེན་ཡོད་།'{srclib}'" #: ../fdroidserver/update.py #, python-brace-format @@ -626,7 +626,7 @@ msgstr "ངོས་འཛིན་མི་ཐུབ་པའི་ཡིག་ #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" -msgstr "འགྲེལ་བཤད་'%s 1' ནི་མཉེན་ཆས་མདོར་བསྡུས་ཤིག་རེད།" +msgstr "འགྲེལ་བཤད་'%s 1' ནི་མཉེན་ཆས་མདོར་བསྡུས་ཤིག་རེད།" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" @@ -635,12 +635,12 @@ msgstr "འགྲེལ་བཤད་འདི་ལ་རིམ་པ་རྫ #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "འགྲེལ་བཤད་འདི་ལ་ཐོ་གཞུང་ཡོད། (%s 1) འོན་ཀྱང་འདི་ལ་ཚགས་རྒྱབ་མིན་འདུག(*)གྲངས་ཀྱང་མེད། (#)" +msgstr "འགྲེལ་བཤད་འདི་ལ་ཐོ་གཞུང་ཡོད། (%s 1) འོན་ཀྱང་འདི་ལ་ཚགས་རྒྱབ་མིན་འདུག(*)གྲངས་ཀྱང་མེད། (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" -msgstr "རིང་ཐུང་གི་འགྲེལ་བཤད་ {length} {limit} ལས་བརྒལ་འདུག char limit" +msgstr "རིང་ཐུང་གི་འགྲེལ་བཤད་ {length} {limit} ལས་བརྒལ་འདུག char limit" #: ../fdroidserver/import.py msgid "Do not add 'disable:' to the generated build entries" @@ -1088,7 +1088,7 @@ msgstr "ཁུངས་ལྡན་མིན་པའི་ཆོག་མཆན #: ../fdroidserver/lint.py msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "ཁུངས་ལྡན་མིན་པའི་སྦྲེལ་མཐུད། - [http://foo.bar Link title] or [http://foo.bar]བེད་སྤྱོད་བྱེད།" +msgstr "ཁུངས་ལྡན་མིན་པའི་སྦྲེལ་མཐུད། - [http://foo.bar Link title] or [http://foo.bar]བེད་སྤྱོད་བྱེད།" #: ../fdroidserver/metadata.py #, python-format @@ -1215,7 +1215,7 @@ msgstr "ཕྱོགས་དེབ་ཐོན་སྐྱེད་བོར་ #: ../fdroidserver/lint.py #, python-format msgid "Name '%s' is just the auto name - remove it" -msgstr "མིང་། '%s 1' ནི་རང་མིང་ཁོ་ན་རེད་། - མེད་པ་བཟོས།" +msgstr "མིང་། '%s 1' ནི་རང་མིང་ཁོ་ན་རེད་། - མེད་པ་བཟོས།" #: ../fdroidserver/common.py msgid "No 'config.py' found, using defaults." @@ -1299,7 +1299,7 @@ msgstr "ཐུམ་སྒྲིལ་དེ་འདྲ་མིན་འདུ #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" -msgstr "ཐོན་རིམ་ཨང་རྟགས་དེ་འདྲ་མིན་འདུག {versionCode} མཉེན་ཆས་ཆེད་དུ།{appid}" +msgstr "ཐོན་རིམ་ཨང་རྟགས་དེ་འདྲ་མིན་འདུག {versionCode} མཉེན་ཆས་ཆེད་དུ།{appid}" #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" @@ -1319,9 +1319,8 @@ msgid "Nothing to do for {appid}." msgstr "{appid} ཆེད་དུ་བྱ་རྒྱུ་གང་ཡང་མེད་།." #: ../fdroidserver/init.py -#, fuzzy msgid "Now set these in config.py:" -msgstr "'sdk_path' འདི་ 'config.py' ནང་སྒྲིག་ཐུབ་མ་སོང་།!" +msgstr "" #: ../fdroidserver/init.py #, fuzzy @@ -1736,7 +1735,7 @@ msgstr "སྙིང་བསྔུས་ '%s 1' ནི་མཉེན་ཆས #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" -msgstr "སྙིང་བསྔུས་ཀྱི་རིང་ཐུང་། {length} charཚད་{limit} ལས་བརྒལ་འདུག" +msgstr "སྙིང་བསྔུས་ཀྱི་རིང་ཐུང་། {length} charཚད་{limit} ལས་བརྒལ་འདུག" #: ../fdroidserver/common.py #, python-brace-format @@ -2133,7 +2132,7 @@ msgstr "{name}ལ་ཁ་སྣོན་བྱེད།: {path}" #: /usr/lib/python3.7/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "གསལ་ཁ་མེད་པའི་གདམ་ཀ: %(option)s མཐུན་མི་སོང་།%(matches)s" +msgstr "གསལ་ཁ་མེད་པའི་གདམ་ཀ: %(option)s མཐུན་མི་སོང་།%(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2375,7 +2374,7 @@ msgstr "ཁུངས་ལྡན་མིན་པ་ %(type)s value: %(value)r" #: /usr/lib/python3.7/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "ཁུངས་ལྡན་མིན་པའི་གདམ་ཀ: %(value)r (དེ་ནས་གདམ་ཀ་%(choices)s)" +msgstr "ཁུངས་ལྡན་མིན་པའི་གདམ་ཀ: %(value)r (དེ་ནས་གདམ་ཀ་%(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2392,7 +2391,7 @@ msgstr "ཁུངས་ལྡན་མིན་པའི་ཚིག་སྒྲ #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" -msgstr "local_copy_dir \"fdroid\"གིས་མཇུག་སྐྱོང་མིན་འདུག་ : \"{path}1\"" +msgstr "local_copy_dir \"fdroid\"གིས་མཇུག་སྐྱོང་མིན་འདུག་ : \"{path}1\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" @@ -2405,7 +2404,7 @@ msgstr "local_copy_dir ངེས་པར་ཕྱོགས་དེབ་ཡི #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" -msgstr "མེ་ལོང་། '%s 1' 'fdroid'དང་མཉམ་དུ་མཇུག་སྐྱོང་མི་ཐུབ།!" +msgstr "མེ་ལོང་། '%s 1' 'fdroid'དང་མཉམ་དུ་མཇུག་སྐྱོང་མི་ཐུབ།!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2456,7 +2455,7 @@ msgstr "གདམ་ཀ %s 1: གལ་ཏེ་ཁྱེད་ཀྱིས་ #: /usr/lib/python3.7/optparse.py #, python-format msgid "option %s: invalid %s value: %r" -msgstr "གདམ་ཀ %s 1: ཁུངས་ལྡན་མིན་པ་ %s 2 རིན་ཐང་།: %r 3" +msgstr "གདམ་ཀ %s 1: ཁུངས་ལྡན་མིན་པ་ %s 2 རིན་ཐང་།: %r 3" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2474,7 +2473,7 @@ msgstr "གདམ་ཀ། '%s 1'ངོས་འཛིན་ཐུབ་མ་ #: /usr/lib/python3.7/getopt.py #, python-format msgid "option -%s requires argument" -msgstr "གདམ་ཀ། -%s 1 རྩོད་དགོས།" +msgstr "གདམ་ཀ། -%s 1 རྩོད་དགོས།" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2528,7 +2527,7 @@ msgstr "བདེ་ཆགས་མེད་པའི་HTTPMམཐུད་ཀ #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" -msgstr "བེད་ཆགས་མེད་པའི་དྲྭ་རྒྱའི་ཁ་བྱང་http ནས་ཕབ་ལེན་བཀག། (use https or specify --no-https-check): {apkfilename}" +msgstr "བེད་ཆགས་མེད་པའི་དྲྭ་རྒྱའི་ཁ་བྱང་http ནས་ཕབ་ལེན་བཀག། (use https or specify --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format @@ -2561,7 +2560,7 @@ msgstr "རོགས་པ་བྱེད་པའི་འཕྲིན་ཐུ #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." -msgstr "APK མིང་རྟགས་, ཡིག་ཆའི་འགྲོ་ལམ་མམ་ཡང་ན། HTTPS URL." +msgstr "APK མིང་རྟགས་, ཡིག་ཆའི་འགྲོ་ལམ་མམ་ཡང་ན། HTTPS URL." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" @@ -2644,7 +2643,7 @@ msgstr "" #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" -msgstr[0] "{0} མཉེས་ཆས་, {1} key aliases" +msgstr[0] "{0} མཉེས་ཆས་, {1} key aliases" #: ../fdroidserver/update.py #, python-brace-format @@ -2695,7 +2694,7 @@ msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" -msgstr "{appid}1: ངོས་འཛིན་མི་ཐུབ་པའི་ extlib {path}2 བཟོ་སྐྲུན་ནང་ལ '{versionName}3'" +msgstr "{appid}1: ངོས་འཛིན་མི་ཐུབ་པའི་ extlib {path}2 བཟོ་སྐྲུན་ནང་ལ '{versionName}3'" #: ../fdroidserver/scanner.py #, python-brace-format diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 504d4a1b..1ccbeb66 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -4,22 +4,22 @@ # Fynn Godau , 2020. # melusine , 2020. # marzzzello , 2020. -# Hans-Christoph Steiner , 2020. +# Hans-Christoph Steiner , 2020, 2021. # Predatorix Phoenix , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-10 02:32+0000\n" -"Last-Translator: Predatorix Phoenix \n" +"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"PO-Revision-Date: 2021-01-14 14:58+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4.1-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py msgid "" @@ -310,9 +310,8 @@ msgid "Android APK file" msgstr "Android APK-Datei" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Android DEX code" -msgstr "Keine Android SDK gefunden!" +msgstr "" #: ../fdroidserver/common.py ../fdroidserver/build.py #, python-brace-format @@ -437,9 +436,9 @@ msgid "Cannot resolve application ID {appid}" msgstr "AppID {appid} konnte nicht aufgelöst werden" #: ../fdroidserver/rewritemeta.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Cannot rewrite \"{path}\"" -msgstr "„{path}” konnte nicht gelesen werden!" +msgstr "" #: ../fdroidserver/rewritemeta.py msgid "Cannot use --list and --to at the same time" @@ -2213,9 +2212,9 @@ msgid "can't open '%s': %s" msgstr "„%s” konnte nicht geöffnet werden: %s" #: ../fdroidserver/build.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "cannot find required srclibs: \"{path}\"" -msgstr "AppID für {path} konnte nicht gefunden werden!" +msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 5d649ab5..831548be 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -3,22 +3,22 @@ # This file is distributed under the same license as the PACKAGE package. # Maximiliano Castañón , 2020. # Jo , 2020. -# Hans-Christoph Steiner , 2020. +# Hans-Christoph Steiner , 2020, 2021. # Alvaro , 2020. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2020-11-20 23:28+0000\n" -"Last-Translator: Alvaro \n" +"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"PO-Revision-Date: 2021-01-14 14:58+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py #, fuzzy @@ -224,7 +224,7 @@ msgstr "'{apkfilename}' ya está instalado en {dev}." #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{field}' in {linedesc} is obsolete, see docs for current fields:" -msgstr "" +msgstr "'{field}' en {linedesc} está obsoleto, vea la documentación para los campos actualizados:" #: ../fdroidserver/common.py #, python-brace-format @@ -309,9 +309,8 @@ msgid "Android APK file" msgstr "Fichero APK de Android" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Android DEX code" -msgstr "¡No se encontró Android SDK!" +msgstr "" #: ../fdroidserver/common.py ../fdroidserver/build.py #, python-brace-format @@ -402,7 +401,7 @@ msgstr "Build generada por `fdroid import` - Eliminar \"disable line\" cuando es #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" -msgstr "" +msgstr "¡El repositorio git de la compilación de metadatos tiene cambios pendientes!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" @@ -436,9 +435,9 @@ msgid "Cannot resolve application ID {appid}" msgstr "No se puede resolver el identificador de aplicación {appid}" #: ../fdroidserver/rewritemeta.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Cannot rewrite \"{path}\"" -msgstr "¡No se puede leer \"{path}\"!" +msgstr "" #: ../fdroidserver/rewritemeta.py msgid "Cannot use --list and --to at the same time" @@ -610,7 +609,7 @@ msgstr "Creando índice no firmado, en preparación de la firma" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "" +msgstr "CurrentVersionCode {cv} es menor que la compilación más antigua registrada {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" @@ -660,7 +659,7 @@ msgstr "" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" -msgstr "" +msgstr "No desplegar los ficheros nuevos en el repositorio" #: ../fdroidserver/mirror.py #, python-brace-format @@ -712,7 +711,7 @@ msgstr "La descarga de {url} falló. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" -msgstr "" +msgstr "Receta de compilación duplicada para versionCode {versionCode} en {linedesc}" #: ../fdroidserver/lint.py #, python-brace-format @@ -804,7 +803,7 @@ msgstr "Fallo al alinear aplicación" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" -msgstr "" +msgstr "Fallo al crear bucket S3 : {url}" #: ../fdroidserver/common.py msgid "Failed to get APK manifest information" @@ -836,12 +835,12 @@ msgstr "Fallo al aplicar zipalign para alinear aplicación" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" -msgstr "" +msgstr "Buildserverid obtenido de la VM: {buildserverid}" #: ../fdroidserver/signatures.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" -msgstr "" +msgstr "Firmas obtenidas para '{apkfilename}'-> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format @@ -857,7 +856,7 @@ msgstr "Terminado" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID flag" -msgstr "" +msgstr "Los métodos de donación de Flattr deben ir en el flag FlattrID" #: ../fdroidserver/lint.py #, fuzzy @@ -1128,9 +1127,9 @@ msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "Redirección no válida a no HTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" -msgstr "Leer todos los archivos de metadatos y salir" +msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1736,9 +1735,9 @@ msgid "Striping mystery signature from {apkfilename}" msgstr "" #: ../fdroidserver/nightly.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Stripping mystery signature from {apkfilename}" -msgstr "Fallo al obtener firmas para '{apkfilename}': {error}" +msgstr "" #: ../fdroidserver/lint.py #, python-format @@ -1767,7 +1766,7 @@ msgstr "" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" -msgstr "El URL base para el registro del repositorio (por defecto: https://f-droid.org)" +msgstr "El URL base para el registro del repositorio (por defecto: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" @@ -2206,9 +2205,9 @@ msgid "can't open '%s': %s" msgstr "no se puede abrir '%s': %s" #: ../fdroidserver/build.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "cannot find required srclibs: \"{path}\"" -msgstr "¡No se puede encontrar un appid para {path}!" +msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 9aa66493..b3521c84 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -2,7 +2,7 @@ # Copyright (C) YEAR Free Software Foundation, Inc. # Julien Gontier , 2020. # anonymous , 2020. -# Hans-Christoph Steiner , 2020. +# Hans-Christoph Steiner , 2020, 2021. # Jeannette L , 2020. # Nathan , 2020. # Virgile L. , 2020. @@ -20,16 +20,16 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2020-10-08 15:24+0000\n" -"Last-Translator: Renaud Perrai \n" +"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"PO-Revision-Date: 2021-01-14 14:58+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.3-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py msgid "" @@ -1670,7 +1670,6 @@ msgid "Setting {0} sec timeout for this build" msgstr "" #: ../fdroidserver/build.py -#, fuzzy msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "Installez un émulateur, installez l'APK dessus et effectuez un scan Drozer" @@ -2070,9 +2069,9 @@ msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner msgstr "L'utilisation de l'utilitaire jarsigner de Java n'est pas recommandé pour vérifier les APKs ! Utiliser apksigner" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using androguard from \"{path}\"" -msgstr "Utilise le trousseau existant \"{path}\"" +msgstr "Utiliser d’androguard à partir de \"{path}\"" #: ../fdroidserver/init.py #, python-brace-format @@ -2082,7 +2081,7 @@ msgstr "Utilise le trousseau existant \"{path}\"" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" -msgstr "" +msgstr "Utiliser s3cmd pour synchroniser avec : {url}" #: ../fdroid ../fdroidserver/__main__.py msgid "Valid commands are:" @@ -2111,7 +2110,7 @@ msgstr "Avertir de possibles erreurs dans les métadonnées" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" -msgstr "" +msgstr "Lorsqu'il est configuré pour les index signés, ne créez que des index non signés à ce stade" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index 4057d1a2..ef0b2f19 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -1,13 +1,13 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # Balázs Meskó , 2020. -# Hans-Christoph Steiner , 2020. +# Hans-Christoph Steiner , 2020, 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2020-11-10 16:21+0000\n" +"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"PO-Revision-Date: 2021-01-14 14:58+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Hungarian \n" "Language: hu\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py msgid "" @@ -1109,9 +1109,9 @@ msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" -msgstr "Összes metaadatfájl felolvasása és kilépés" +msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index 9c3da3cc..50da8323 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -1,21 +1,21 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. -# Hans-Christoph Steiner , 2020. +# Hans-Christoph Steiner , 2020, 2021. # Kahina Messaoudi , 2020. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2020-10-06 08:26+0000\n" -"Last-Translator: Kahina Messaoudi \n" +"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"PO-Revision-Date: 2021-01-14 14:58+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Kabyle \n" "Language: kab\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.3-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py msgid "" @@ -2104,7 +2104,7 @@ msgstr "timerniwt n ufaylu n tmagit ɣer {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" -msgstr "timerniwt ɣer {name}: {path}" +msgstr "timerniwt ɣer {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index 7144825f..d5b13cc0 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -1,14 +1,14 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # Besnik Bleta , 2020, 2021. -# Hans-Christoph Steiner , 2020. +# Hans-Christoph Steiner , 2020, 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2020-10-21 18:05+0200\n" "PO-Revision-Date: 2021-01-14 14:58+0000\n" -"Last-Translator: Besnik Bleta \n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Albanian \n" "Language: sq\n" "MIME-Version: 1.0\n" @@ -1725,7 +1725,7 @@ msgstr "Po hiqet nënshkrim misterioz nga {apkfilename}" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" -msgstr "Stripping mystery signature from {apkfilename}" +msgstr "" #: ../fdroidserver/lint.py #, python-format diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 59ab602a..304db98c 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -1,14 +1,14 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # Jeff Huang , 2020. -# Hans-Christoph Steiner , 2020. +# Hans-Christoph Steiner , 2020, 2021. # NightFeather , 2020. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2020-11-10 16:20+0000\n" +"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"PO-Revision-Date: 2021-01-14 14:58+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Chinese (Traditional) \n" "Language: zh_Hant\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.4-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py msgid "" @@ -299,9 +299,8 @@ msgid "Android APK file" msgstr "" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Android DEX code" -msgstr "未找到 Android SDK!" +msgstr "" #: ../fdroidserver/common.py ../fdroidserver/build.py #, python-brace-format @@ -425,9 +424,9 @@ msgid "Cannot resolve application ID {appid}" msgstr "無法解析 {appid} id" #: ../fdroidserver/rewritemeta.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Cannot rewrite \"{path}\"" -msgstr "無法讀取 \"{path}\"!" +msgstr "" #: ../fdroidserver/rewritemeta.py msgid "Cannot use --list and --to at the same time" @@ -2199,9 +2198,9 @@ msgid "can't open '%s': %s" msgstr "無法打開 '%s':%s" #: ../fdroidserver/build.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "cannot find required srclibs: \"{path}\"" -msgstr "找不到 {path} 的 appid!" +msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From a304ae95fadbfda0637491b95e37cced2b0eeb10 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sat, 16 Jan 2021 21:56:57 +0100 Subject: [PATCH 0066/2116] version 2.0b1 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 78ab7279..2a387307 100755 --- a/setup.py +++ b/setup.py @@ -53,7 +53,7 @@ with open("README.md", "r") as fh: long_description = fh.read() setup(name='fdroidserver', - version='2.0b0', + version='2.0b1', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From b655d20d6b6043c3e2f80d7414681b449f1b79ec Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sat, 16 Jan 2021 22:01:50 +0100 Subject: [PATCH 0067/2116] locale/pick-complete-translations.py: run sort without shell Static code analyzers flag such things as security errors. --- locale/pick-complete-translations.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locale/pick-complete-translations.py b/locale/pick-complete-translations.py index 8c3eead1..99c1c125 100755 --- a/locale/pick-complete-translations.py +++ b/locale/pick-complete-translations.py @@ -6,6 +6,7 @@ import json import os import re import requests +import subprocess import sys @@ -51,4 +52,4 @@ with open(manifest_file, 'a') as fp: if line: fp.write(line) -os.system('sort -u -o %s %s' % (manifest_file, manifest_file)) +subprocess.run(['sort', '-u', '-o', manifest_file, manifest_file]) From 5ae2703477e554cb3236ab7ce862b8c2814d7db6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 9 Jul 2018 22:41:08 +0200 Subject: [PATCH 0068/2116] init: no error if examples/ dir cannot be found; overhaul repo_icon There are so many possible installation paths for Python modules, it has been very hard to even find and test them all. This adds a fallback option if the examples dir cannot be found. A repo can work without an icon or the example config.py. This removes the fake assumption that the icon can be a full path in the config.py. While the path was being properly passed through to the index file, the file was never copied properly into place nor rsynced to the web server. --- MANIFEST.in | 1 - examples/config.yml | 11 +++++++++-- examples/fdroid-icon.png | Bin 3367 -> 0 bytes fdroidserver/common.py | 4 ++-- fdroidserver/index.py | 8 ++++---- fdroidserver/init.py | 13 +++++++++++-- fdroidserver/nightly.py | 12 +----------- fdroidserver/update.py | 5 ++--- tests/config.py | 2 -- tests/repo/index-v1.json | 2 +- tests/repo/index.xml | 2 +- tests/run-tests | 2 -- 12 files changed, 31 insertions(+), 31 deletions(-) delete mode 100644 examples/fdroid-icon.png diff --git a/MANIFEST.in b/MANIFEST.in index 48e4830a..4a14e8ad 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -13,7 +13,6 @@ include examples/fdroid_exportkeystore.py include examples/fdroid_export_keystore_to_nitrokey.py include examples/fdroid_extract_repo_pubkey.py include examples/fdroid_fetchsrclibs.py -include examples/fdroid-icon.png include examples/fdroid_nitrokeyimport.py include examples/makebuildserver.config.py include examples/opensc-fdroid.cfg diff --git a/examples/config.yml b/examples/config.yml index db93de9d..7b009fde 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -54,7 +54,6 @@ repo_url: https://MyFirstFDroidRepo.org/fdroid/repo repo_name: My First F-Droid Repo Demo -repo_icon: fdroid-icon.png repo_description: >- This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application @@ -68,10 +67,18 @@ repo_description: >- archive_older: 3 archive_url: https://f-droid.org/archive archive_name: My First F-Droid Archive Demo -archive_icon: fdroid-icon.png archive_description: >- The repository of older versions of packages from the main demo repository. +# The repo's icon defaults to a file called 'icon.png' in the 'icons' +# folder for each section, e.g. repo/icons/icon.png and +# archive/icons/icon.png. To use a different filename for the icons, +# set the filename here. You must still copy it into place in +# repo/icons/ and/or archive/icons/. +# +# repo_icon: myicon.png +# archive_icon: myicon.png + # This allows a specific kind of insecure APK to be included in the # 'repo' section. Since April 2017, APK signatures that use MD5 are # no longer considered valid, jarsigner and apksigner will return an diff --git a/examples/fdroid-icon.png b/examples/fdroid-icon.png deleted file mode 100644 index 0c0d41738f054eaa77bba0ef0785e87227aa2692..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3367 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 diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 22a4f3ff..4218ef48 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -147,7 +147,7 @@ default_config = { 'keyaliases': {}, 'repo_url': "https://MyFirstFDroidRepo.org/fdroid/repo", 'repo_name': "My First FDroid Repo Demo", - 'repo_icon': "fdroid-icon.png", + 'repo_icon': "icon.png", 'repo_description': _(''' This is a repository of apps to be used with FDroid. Applications in this repository are either official binaries built by the original application @@ -228,7 +228,7 @@ def fill_config_defaults(thisconfig): return None return path - for k in ['sdk_path', 'ant', 'mvn3', 'gradle', 'keystore', 'repo_icon']: + for k in ['sdk_path', 'ant', 'mvn3', 'gradle', 'keystore']: v = thisconfig[k] exp = expand_path(v) if exp is not None: diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 95b46ed5..6eae6ffe 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -75,13 +75,13 @@ def make(apps, apks, repodir, archive): if archive: repodict['name'] = common.config['archive_name'] - repodict['icon'] = os.path.basename(common.config['archive_icon']) + repodict['icon'] = common.config.get('archive_icon', common.default_config['repo_icon']) repodict['address'] = common.config['archive_url'] repodict['description'] = common.config['archive_description'] urlbasepath = os.path.basename(urllib.parse.urlparse(common.config['archive_url']).path) else: repodict['name'] = common.config['repo_name'] - repodict['icon'] = os.path.basename(common.config['repo_icon']) + repodict['icon'] = common.config.get('repo_icon', common.default_config['repo_icon']) repodict['address'] = common.config['repo_url'] repodict['description'] = common.config['repo_description'] urlbasepath = os.path.basename(urllib.parse.urlparse(common.config['repo_url']).path) @@ -331,7 +331,7 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing doc.appendChild(root) repoel = doc.createElement("repo") - repoel.setAttribute("icon", os.path.basename(repodict['icon'])) + repoel.setAttribute("icon", repodict['icon']) if 'maxage' in repodict: repoel.setAttribute("maxage", str(repodict['maxage'])) repoel.setAttribute("name", repodict['name']) @@ -604,7 +604,7 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing if os.path.exists(repo_icon): shutil.copyfile(common.config['repo_icon'], iconfilename) else: - logging.warning(_('repo_icon %s does not exist, generating placeholder.') + logging.warning(_('repo_icon "repo/icons/%s" does not exist, generating placeholder.') % repo_icon) os.makedirs(os.path.dirname(iconfilename), exist_ok=True) try: diff --git a/fdroidserver/init.py b/fdroidserver/init.py index 53eac796..7f9fc817 100644 --- a/fdroidserver/init.py +++ b/fdroidserver/init.py @@ -120,8 +120,17 @@ def main(): # 'metadata' and 'tmp' are created in fdroid if not os.path.exists('repo'): os.mkdir('repo') - shutil.copy(os.path.join(examplesdir, 'fdroid-icon.png'), fdroiddir) - shutil.copyfile(os.path.join(examplesdir, 'config.yml'), 'config.yml') + example_config_yml = os.path.join(examplesdir, 'config.yml') + if os.path.exists(example_config_yml): + shutil.copyfile(example_config_yml, 'config.yml') + else: + from pkg_resources import get_distribution + versionstr = get_distribution('fdroidserver').version + if not versionstr: + versionstr = 'master' + with open('config.yml', 'w') as fp: + fp.write('# see https://gitlab.com/fdroid/fdroidserver/blob/' + + versionstr + '/examples/config.yml\n') os.chmod('config.yml', 0o0600) # If android_home is None, test_config['sdk_path'] will be used and # "$ANDROID_HOME" may be used if the env var is set up correctly. diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 63e7d131..50239e20 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -192,7 +192,7 @@ def main(): readme = ''' # {repo_git_base} -[![{repo_url}](icon.png)]({repo_url}) +[![{repo_url}]({repo_url}/icons/icon.png)]({repo_url}) Last updated: {date}'''.format(repo_git_base=repo_git_base, repo_url=repo_url, @@ -202,16 +202,8 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, mirror_git_repo.git.add(all=True) mirror_git_repo.index.commit("update README") - icon_path = os.path.join(git_mirror_path, 'icon.png') - try: - import qrcode - qrcode.make(repo_url).save(icon_path) - except Exception: - exampleicon = os.path.join(common.get_examples_dir(), 'fdroid-icon.png') - shutil.copy(exampleicon, icon_path) mirror_git_repo.git.add(all=True) mirror_git_repo.index.commit("update repo/website icon") - shutil.copy(icon_path, repo_basedir) os.chdir(repo_basedir) if os.path.isdir(git_mirror_repodir): @@ -234,11 +226,9 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, config += "identity_file = '%s'\n" % ssh_private_key_file config += "repo_name = '%s'\n" % repo_git_base config += "repo_url = '%s'\n" % repo_url - config += "repo_icon = 'icon.png'\n" config += "repo_description = 'Nightly builds from %s'\n" % git_user_email config += "archive_name = '%s'\n" % (repo_git_base + ' archive') config += "archive_url = '%s'\n" % (repo_base + '/archive') - config += "archive_icon = 'icon.png'\n" config += "archive_description = 'Old nightly builds that have been archived.'\n" config += "archive_older = %i\n" % options.archive_older config += "servergitmirrors = '%s'\n" % servergitmirror diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 8679b134..983bdb79 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -2244,9 +2244,8 @@ def main(): for k in ['repo_icon', 'archive_icon']: if k in config: if not os.path.exists(config[k]): - logging.critical(_('{name} "{path}" does not exist! Correct it in config.py.') - .format(name=k, path=config[k])) - sys.exit(1) + logging.warning(_('{name} "{section}/icons/{path}" does not exist! Check "config.yml".') + .format(name=k, section=k.split('_')[0], path=config[k])) # if the user asks to create a keystore, do it now, reusing whatever it can if options.create_key: diff --git a/tests/config.py b/tests/config.py index ead06f91..fde7e973 100644 --- a/tests/config.py +++ b/tests/config.py @@ -1,7 +1,6 @@ repo_url = "https://MyFirstFDroidRepo.org/fdroid/repo" repo_name = "My First F-Droid Repo Demo" -repo_icon = "fdroid-icon.png" repo_description = """ This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application @@ -12,7 +11,6 @@ using the tools on https://gitlab.com/u/fdroid. archive_older = 3 archive_url = "https://f-droid.org/archive" archive_name = "My First F-Droid Archive Demo" -archive_icon = "fdroid-icon.png" archive_description = """ The repository of older versions of applications from the main demo repository. """ diff --git a/tests/repo/index-v1.json b/tests/repo/index-v1.json index 5ad2ffe6..923384eb 100644 --- a/tests/repo/index-v1.json +++ b/tests/repo/index-v1.json @@ -3,7 +3,7 @@ "timestamp": 1502845383782, "version": 20000, "name": "My First F-Droid Repo Demo", - "icon": "fdroid-icon.png", + "icon": "icon.png", "address": "https://MyFirstFDroidRepo.org/fdroid/repo", "description": "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/u/fdroid.", "mirrors": [ diff --git a/tests/repo/index.xml b/tests/repo/index.xml index 6f9ed101..557be383 100644 --- a/tests/repo/index.xml +++ b/tests/repo/index.xml @@ -1,6 +1,6 @@ - + This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/u/fdroid. http://foobarfoobarfoobar.onion/fdroid/repo https://foo.bar/fdroid/repo diff --git a/tests/run-tests b/tests/run-tests index 935ceb8e..3e475814 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -228,7 +228,6 @@ echo_header 'copy git import and run "fdroid scanner" on it' REPOROOT=`create_test_dir` cd $REPOROOT -cp $WORKSPACE/examples/fdroid-icon.png $REPOROOT/ mkdir metadata echo "AutoName: Just A Test" > metadata/org.fdroid.ci.test.app.yml echo "WebSite: " >> metadata/org.fdroid.ci.test.app.yml @@ -942,7 +941,6 @@ echo_header "setup a new repo manually and generate a keystore" REPOROOT=`create_test_dir` KEYSTORE=$REPOROOT/keystore.p12 cd $REPOROOT -cp $WORKSPACE/examples/fdroid-icon.png $REPOROOT/ ! test -e $KEYSTORE set +e $fdroid update From f6b5f74ec61f1f81f9a59067be9527be59e328ec Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 22 Jan 2021 22:12:17 +0100 Subject: [PATCH 0069/2116] gitlab-ci: drop support for Ubuntu/xenial, test on bionic now xenial will become obsolete in April --- .gitlab-ci.yml | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index dbfc219f..d4f93712 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -84,7 +84,7 @@ debian_testing: - ./run-tests # Test using latest LTS set up with the PPA, including Recommends. -# bionic's apksigner, which comes from Recommends:, requires binfmt +# focal's apksigner, which comes from Recommends:, requires binfmt # support in the kernel. ubuntu_lts_ppa: image: ubuntu:latest @@ -106,13 +106,11 @@ ubuntu_lts_ppa: - cd tests - ./run-tests -# Test using Xenial LTS with all depends from pypi. The venv is used -# to isolate the dist tarball generation environment from the clean -# install environment. Xenial's pip is too old to install all the -# dependencies, so this has to uppgrade pip and setuptools in order to -# run the install. -ubuntu_xenial_pip: - image: ubuntu:xenial +# Test using Ubuntu/bionic LTS (supported til 2022) with all depends +# from pypi. The venv is used to isolate the dist tarball generation +# environment from the clean install environment. +ubuntu_bionic_pip: + image: ubuntu:bionic <<: *apt-template script: - apt-get install git default-jdk-headless python3-pip python3-venv rsync zipalign libarchive13 @@ -127,9 +125,8 @@ ubuntu_xenial_pip: - deactivate - tar tzf dist/fdroidserver-*.tar.gz | grep locale/de/LC_MESSAGES/fdroidserver.mo # back to bare machine to act as user's install machine - - $pip install --upgrade pip setuptools + - $pip install --upgrade pip setuptools wheel # make this go away: "error: invalid command 'bdist_wheel'" - $pip install dist/fdroidserver-*.tar.gz - - test -e /usr/share/locale/de/LC_MESSAGES/fdroidserver.mo - tar xzf dist/fdroidserver-*.tar.gz - cd fdroidserver-* - ./tests/run-tests From aebf70a76349f1d4a919ce9f24c43a4d0644d60d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sat, 23 Jan 2021 13:36:41 +0100 Subject: [PATCH 0070/2116] tests: run pip tests using fdroid that pip installed --- .gitlab-ci.yml | 2 +- tests/update.TestCase | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d4f93712..26c900ad 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -129,7 +129,7 @@ ubuntu_bionic_pip: - $pip install dist/fdroidserver-*.tar.gz - tar xzf dist/fdroidserver-*.tar.gz - cd fdroidserver-* - - ./tests/run-tests + - fdroid=`which fdroid` ./tests/run-tests # test install process on a bleeding edge distro with pip arch_pip_install: diff --git a/tests/update.TestCase b/tests/update.TestCase index ffc8fa5f..19b7436e 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -830,8 +830,17 @@ class UpdateTest(unittest.TestCase): # yaml.add_representer(fdroidserver.metadata.Build, _build_yaml_representer) # yaml.dump(apk, f, default_flow_style=False) + # CFullLoader doesn't always work + # https://github.com/yaml/pyyaml/issues/266#issuecomment-559116876 + TestLoader = FullLoader + try: + testyaml = '- !!python/object/new:fdroidserver.update.UsesPermission\n - test\n - null' + from_yaml = yaml.load(testyaml, Loader=TestLoader) + except yaml.constructor.ConstructorError: + from yaml import UnsafeLoader as TestLoader + with open(savepath, 'r') as f: - from_yaml = yaml.load(f, Loader=FullLoader) + from_yaml = yaml.load(f, Loader=TestLoader) self.maxDiff = None self.assertEqual(apk, from_yaml) From f527b177153a1c89e465d39eafb1adfd0ea8fce3 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sat, 23 Jan 2021 19:36:15 +0100 Subject: [PATCH 0071/2116] sync repo examples with defaults and comment out example repo settings !359 --- CHANGELOG.md | 1 + examples/config.yml | 28 ++++++++++++++++------------ fdroidserver/common.py | 10 +++------- fdroidserver/index.py | 5 +++-- tests/repo/index-v1.json | 2 +- tests/repo/index.xml | 2 +- tests/run-tests | 12 ++++++++---- 7 files changed, 33 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b76fe549..7d6497e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -69,6 +69,7 @@ milestone](https://gitlab.com/fdroid/fdroidserver/-/milestones/10) ([!692](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/692)) * Major refactoring on core parts of code to be more Pythonic ([!756](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/756)) +* `fdroid init` now works when installed with pip ### Removed * Removed all support for _.txt_ and _.json_ metadata diff --git a/examples/config.yml b/examples/config.yml index 7b009fde..ac1e44a0 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -52,23 +52,27 @@ # The same policy is applied to the archive repo, if there is one. # repo_maxage: 0 -repo_url: https://MyFirstFDroidRepo.org/fdroid/repo -repo_name: My First F-Droid Repo Demo -repo_description: >- - This is a repository of apps to be used with F-Droid. Applications in this - repository are either official binaries built by the original application - developers, or are binaries built from source by the admin of f-droid.org - using the tools on https://gitlab.com/u/fdroid. +# repo_url: https://MyFirstFDroidRepo.org/fdroid/repo +# repo_name: My First F-Droid Repo Demo +# repo_description: >- +# This is a repository of apps to be used with F-Droid. Applications +# in this repository are either official binaries built by the +# original application developers, or are binaries built from source +# by the admin of f-droid.org using the tools on +# https://gitlab.com/fdroid. # As above, but for the archive repo. +# +# archive_url: https://f-droid.org/archive +# archive_name: My First F-Droid Archive Demo +# archive_description: >- +# The repository of older versions of packages from the main demo repository. + # archive_older sets the number of versions kept in the main repo, with all # older ones going to the archive. Set it to 0, and there will be no archive # repository, and no need to define the other archive_ values. -archive_older: 3 -archive_url: https://f-droid.org/archive -archive_name: My First F-Droid Archive Demo -archive_description: >- - The repository of older versions of packages from the main demo repository. +# +# archive_older: 3 # The repo's icon defaults to a file called 'icon.png' in the 'icons' # folder for each section, e.g. repo/icons/icon.png and diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 4218ef48..3fe24c23 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -146,14 +146,10 @@ default_config = { }, 'keyaliases': {}, 'repo_url': "https://MyFirstFDroidRepo.org/fdroid/repo", - 'repo_name': "My First FDroid Repo Demo", + 'repo_name': "My First F-Droid Repo Demo", 'repo_icon': "icon.png", - 'repo_description': _(''' - This is a repository of apps to be used with FDroid. Applications in this - repository are either official binaries built by the original application - developers, or are binaries built from source by f-droid.org using the - tools on https://gitlab.com/fdroid. - '''), + 'repo_description': _("""This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid."""), + 'archive_name': 'My First F-Droid Archive Demo', 'archive_description': _('These are the apps that have been archived from the main repo.'), 'archive_older': 0, 'lint_licenses': fdroidserver.lint.APPROVED_LICENSES, diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 6eae6ffe..d6d396a5 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -76,9 +76,10 @@ def make(apps, apks, repodir, archive): if archive: repodict['name'] = common.config['archive_name'] repodict['icon'] = common.config.get('archive_icon', common.default_config['repo_icon']) - repodict['address'] = common.config['archive_url'] repodict['description'] = common.config['archive_description'] - urlbasepath = os.path.basename(urllib.parse.urlparse(common.config['archive_url']).path) + archive_url = common.config.get('archive_url', common.config['repo_url'][:-4] + 'archive') + repodict['address'] = archive_url + urlbasepath = os.path.basename(urllib.parse.urlparse(archive_url).path) else: repodict['name'] = common.config['repo_name'] repodict['icon'] = common.config.get('repo_icon', common.default_config['repo_icon']) diff --git a/tests/repo/index-v1.json b/tests/repo/index-v1.json index 923384eb..6ca6d559 100644 --- a/tests/repo/index-v1.json +++ b/tests/repo/index-v1.json @@ -5,7 +5,7 @@ "name": "My First F-Droid Repo Demo", "icon": "icon.png", "address": "https://MyFirstFDroidRepo.org/fdroid/repo", - "description": "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/u/fdroid.", + "description": "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid.", "mirrors": [ "http://foobarfoobarfoobar.onion/fdroid/repo", "https://foo.bar/fdroid/repo" diff --git a/tests/repo/index.xml b/tests/repo/index.xml index 557be383..69b09bcf 100644 --- a/tests/repo/index.xml +++ b/tests/repo/index.xml @@ -1,7 +1,7 @@ - This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/u/fdroid. + This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid. http://foobarfoobarfoobar.onion/fdroid/repo https://foo.bar/fdroid/repo diff --git a/tests/run-tests b/tests/run-tests index 3e475814..693c89e6 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -309,7 +309,7 @@ cp $WORKSPACE/tests/urzip.apk \ $WORKSPACE/tests/repo/com.politedroid_[0-9].apk \ $WORKSPACE/tests/repo/obb.main.twoversions_110161[357].apk \ repo/ -$sed -i.tmp 's,archive_older: [0-9],archive_older: 3,' config.yml +printf '\narchive_older: 3\n' >> config.yml $fdroid update --pretty --nosign if which apksigner; then @@ -332,7 +332,7 @@ if ! which apksigner; then cp $WORKSPACE/tests/metadata/com.politedroid.yml metadata/ test -d repo || mkdir repo cp $WORKSPACE/tests/repo/com.politedroid_[0-9].apk repo/ - $sed -i.tmp 's,archive_older: [0-9],archive_older: 3,' config.yml + printf '\narchive_older: 3\n' >> config.yml $fdroid update --pretty --nosign test `grep '' archive/index.xml | wc -l` -eq 0 @@ -418,7 +418,7 @@ cp $WORKSPACE/tests/metadata/com.politedroid.yml metadata/ $sed -i.tmp '/ArchivePolicy:/d' metadata/com.politedroid.yml test -d repo || mkdir repo cp $WORKSPACE/tests/repo/com.politedroid_[0-9].apk repo/ -$sed -i.tmp 's,archive_older: [0-9],archive_older: 3,' config.yml +printf '\narchive_older: 3\n' >> config.yml $fdroid update --pretty --nosign test `grep '' archive/index.xml | wc -l` -eq 1 @@ -494,7 +494,7 @@ REPOROOT=`create_test_dir` cd $REPOROOT fdroid_init_with_prebuilt_keystore echo 'allow_disabled_algorithms: true' >> config.yml -$sed -i.tmp 's,archive_older: [0-9],archive_older: 3,' config.yml +printf '\narchive_older: 3\n' >> config.yml test -d metadata || mkdir metadata cp $WORKSPACE/tests/metadata/com.politedroid.yml metadata/ echo 'Summary: good test version of urzip' > metadata/info.guardianproject.urzip.yml @@ -615,6 +615,7 @@ echo_header "test for added date being set correctly for repo and archive" REPOROOT=`create_test_dir` cd $REPOROOT fdroid_init_with_prebuilt_keystore +printf '\narchive_older: 3\n' >> config.yml mkdir -p {repo,archive,metadata,stats} cp $WORKSPACE/tests/repo/com.politedroid_5.apk archive cp $WORKSPACE/tests/repo/com.politedroid_6.apk repo @@ -1125,6 +1126,7 @@ REPOROOT=`create_test_dir` GIT_MIRROR=$REPOROOT/git-mirror cd $REPOROOT fdroid_init_with_prebuilt_keystore +printf '\narchive_older: 3\n' >> config.yml echo "servergitmirrors: $SERVER_GIT_MIRROR" >> config.yml cp $WORKSPACE/tests/repo/com.politedroid_[345].apk repo/ @@ -1193,6 +1195,7 @@ if have_git_2_3; then cd $OFFLINE_ROOT fdroid_init_with_prebuilt_keystore + printf '\narchive_older: 3\n' >> config.yml cp -a $WORKSPACE/tests/metadata $WORKSPACE/tests/repo $WORKSPACE/tests/stats $OFFLINE_ROOT/ echo "mirrors: ['http://foo.bar/fdroid', 'http://asdflkdsfjafdsdfhkjh.onion/fdroid']" >> config.yml @@ -1282,6 +1285,7 @@ if which wget; then # clean up kill -9 $http_server_pid rm -f 127.0.0.1\:${port}/repo/*.apk 127.0.0.1\:${port}/repo/*/*/*/*.png + sleep 1 # wait for webserver thread to quit else echo "WARNING: wget not installed, skipping" fi From eec0d3a336f8494f9d756d23dd646df79de8fb50 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sun, 24 Jan 2021 11:57:46 +0100 Subject: [PATCH 0072/2116] gitlab-ci: gradle job generates required changes for new versions --- .gitlab-ci.yml | 3 ++- gradlew-fdroid | 11 +++++++++ tests/gradle-release-checksums.py | 37 ++++++++++++++++++++++++++----- 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 26c900ad..4797cef8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -231,11 +231,12 @@ gradle: LANG: C.UTF-8 script: - apk add --no-cache ca-certificates git python3 - # if this is a merge request fork, then only check if makebuildserver changed + # if this is a merge request fork, then only check if makebuildserver or gradlew-fdroid changed - if [ "$CI_PROJECT_NAMESPACE" != "fdroid" ]; then git fetch https://gitlab.com/fdroid/fdroidserver.git; for f in `git diff --name-only --diff-filter=d FETCH_HEAD...HEAD`; do test "$f" == "makebuildserver" && export CHANGED="yes"; + test "$f" == "gradlew-fdroid" && export CHANGED="yes"; done; test -z "$CHANGED" && exit; fi diff --git a/gradlew-fdroid b/gradlew-fdroid index ea34397f..53494da2 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -57,7 +57,17 @@ download_gradle() { get_sha() { case $1 in + '0.7') echo '4e354fcb0d5c0b0e7789cd6ee900456edaf993f6dd890c4a1c217d90d2a6a6ad' ;; + '0.8') echo '940e623ea98e40ea9ad398770a6ebb91a61c0869d394dda81aa86b0f4f0025e7' ;; + '0.9') echo '994e46d4b467254a0f25ce92b602618331b9b3ac8b32a094fd84ff0e0ceec135' ;; + '0.9.1') echo '5d48cba95db031ec109ae9ab60561e960b6507046036e8191aa78572ec27e2a5' ;; + '0.9.2') echo 'f94d7642348c558fc05ab5fd6fb947fb1ed8fed5931ddb73dd04fb0de22d669b' ;; + '1.0') echo '894bca0360a7e2040815096788f118a2dd106ff6694221b274efb9c32bce0384' ;; + '1.1') echo '552c1fc9f3a1b9668b79cc447370f0263e664ffb6d5c6e1c21e77ce0c8a20d4c' ;; + '1.2') echo 'eb53da3704d24cabb7565f34a3bf16bcd863c4b0c139917606fb15d4f27c7bdf' ;; + '1.3') echo 'ada68561efbb9f1cae0f9063974cbde15c180351a2f92bc2f1106e39ddcae5ba' ;; '1.4') echo 'cd99e85fbcd0ae8b99e81c9992a2f10cceb7b5f009c3720ef3a0078f4f92e94e' ;; + '1.5') echo 'a5511a0659caa47d9d74fd2844c9da43157d2f78e63a0223c6289d88f5aaecbe' ;; '1.6') echo 'de3e89d2113923dcc2e0def62d69be0947ceac910abd38b75ec333230183fac4' ;; '1.7') echo '360c97d51621b5a1ecf66748c718594e5f790ae4fbc1499543e0c006033c9d30' ;; '1.8') echo 'a342bbfa15fd18e2482287da4959588f45a41b60910970a16e6d97959aea5703' ;; @@ -65,6 +75,7 @@ get_sha() { '1.10') echo '6e6db4fc595f27ceda059d23693b6f6848583950606112b37dfd0e97a0a0a4fe' ;; '1.11') echo '07e235df824964f0e19e73ea2327ce345c44bcd06d44a0123d29ab287fc34091' ;; '1.12') echo '8734b13a401f4311ee418173ed6ca8662d2b0a535be8ff2a43ecb1c13cd406ea' ;; + '2.0') echo 'a1eb880c8755333c4d33c4351b269bebe517002532d3142c0b6164c9e8c081c3' ;; '2.1') echo '3eee4f9ea2ab0221b89f8e4747a96d4554d00ae46d8d633f11cfda60988bf878' ;; '2.2') echo '91e5655fe11ef414449f218c4fa2985b3a49b7903c57556da109c84fa26e1dfb' ;; '2.2.1') echo '420aa50738299327b611c10b8304b749e8d3a579407ee9e755b15921d95ff418' ;; diff --git a/tests/gradle-release-checksums.py b/tests/gradle-release-checksums.py index 165c56da..ce2c79cf 100755 --- a/tests/gradle-release-checksums.py +++ b/tests/gradle-release-checksums.py @@ -31,8 +31,8 @@ for a in soup.find_all('a'): errors = 0 makebuildserver = os.path.join(os.path.dirname(__file__), os.pardir, 'makebuildserver') with open(makebuildserver) as fp: - contents = fp.read() -to_compile = re.search(r'CACHE_FILES = [^\]]+\]', contents, flags=re.DOTALL | re.MULTILINE).group() + makebuildserver_current = fp.read() +to_compile = re.search(r'CACHE_FILES = [^\]]+\]', makebuildserver_current).group() code = compile(to_compile, makebuildserver, 'exec') config = {} exec(code, None, config) # nosec this is just a CI script @@ -50,9 +50,36 @@ for url, checksum in config['CACHE_FILES']: for version in sorted(versions.keys()): if version not in makebuildserver_versions \ and LooseVersion(version) > LooseVersion(sorted(makebuildserver_versions)[-1]): - errors += 1 - print(" ('https://services.gradle.org/distributions/gradle-" + version + "-bin.zip',\n" - " '" + versions[version] + "'),") + add_before = """ ('https://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin',""" + new = to_compile.replace( + add_before, + " ('https://services.gradle.org/distributions/gradle-" + version + "-bin.zip',\n" + " '" + versions[version] + "'),\n" + add_before + ) + makebuildserver_current = makebuildserver_current.replace(to_compile, new) + +with open('makebuildserver', 'w') as fp: + fp.write(makebuildserver_current) + +# write out update to gradlew-fdroid +with open('gradlew-fdroid') as fp: + gradlew_fdroid = fp.read() +current = '' +get_sha_pat = re.compile(r""" +'([0-9][0-9.]+[0-9])'\)\s+echo '([0-9a-f]{64})' ;;\n""") +for m in get_sha_pat.finditer(gradlew_fdroid): + current += m.group() +new = '' +for version in sorted(versions.keys(), key=LooseVersion): + sha256 = versions[version] + spaces = '' + for i in range(6 - len(version)): + spaces += ' ' + new += """ '%s')%s echo '%s' ;;\n""" % (version, spaces, sha256) +gradlew_fdroid = gradlew_fdroid.replace(current, new) +plugin_v = ' '.join(sorted(versions.keys(), key=LooseVersion, reverse=True)) +plugin_v_pat = re.compile(r'\nplugin_v=\(([0-9. ]+)\)') +with open('gradlew-fdroid', 'w') as fp: + fp.write(plugin_v_pat.sub('\nplugin_v=(%s)' % plugin_v, gradlew_fdroid)) print('makebuildserver has gradle v' + sorted(makebuildserver_versions)[-1]) sys.exit(errors) From d133b38f223796415a0188042a7af9c43a6c7db8 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sun, 24 Jan 2021 17:09:32 +0100 Subject: [PATCH 0073/2116] fdroid-bot creates merge request when new gradle versions are found --- .gitlab-ci.yml | 17 ++++-- tests/gradle-release-checksums.py | 96 ++++++++++++++++++++++++------- 2 files changed, 86 insertions(+), 27 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4797cef8..011e9048 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -226,11 +226,18 @@ fedora_latest: "cd `pwd`; export ANDROID_HOME=$ANDROID_HOME; fdroid=~testuser/.local/bin/fdroid ./run-tests" gradle: - image: alpine:3.7 - variables: - LANG: C.UTF-8 + image: debian:bullseye + <<: *apt-template script: - - apk add --no-cache ca-certificates git python3 + - apt-get install + ca-certificates + git + openssh-client + python3-bs4 + python3-colorama + python3-git + python3-gitlab + python3-requests # if this is a merge request fork, then only check if makebuildserver or gradlew-fdroid changed - if [ "$CI_PROJECT_NAMESPACE" != "fdroid" ]; then git fetch https://gitlab.com/fdroid/fdroidserver.git; @@ -240,8 +247,6 @@ gradle: done; test -z "$CHANGED" && exit; fi - - python3 -m ensurepip - - $pip install beautifulsoup4 requests - ./tests/gradle-release-checksums.py fdroid build: diff --git a/tests/gradle-release-checksums.py b/tests/gradle-release-checksums.py index ce2c79cf..a264c8ba 100755 --- a/tests/gradle-release-checksums.py +++ b/tests/gradle-release-checksums.py @@ -1,32 +1,29 @@ #!/usr/bin/env python3 +import git +import gitlab import os import re import requests -import sys +import subprocess from bs4 import BeautifulSoup +from colorama import Fore, Style from distutils.version import LooseVersion -while True: - r = requests.get('https://gradle.org/release-checksums/') - if r.status_code == 200: - break - -soup = BeautifulSoup(r.text, 'html.parser') - -version_pat = re.compile(r'[0-9]+(\.[0-9]+)+') +checksums = None versions = dict() -for a in soup.find_all('a'): - if a.parent.name != 'p': - continue - name = a.get('name') - if not name: - continue - m = version_pat.search(name) + +while not checksums: + r = requests.get('https://gitlab.com/fdroid/gradle-transparency-log/-/raw/master/checksums.json') + if r.status_code == 200: + checksums = r.json() + +gradle_bin_pat = re.compile(r'gradle-([0-9][0-9.]+[0-9])-bin.zip') +for url, d in checksums.items(): + m = gradle_bin_pat.search(url) if m: - ul = a.parent.find_next_sibling('ul') - versions[m.group()] = a.parent.find_next_sibling('ul').find('li').find('code').text.strip() + versions[m.group(1)] = d[0]['sha256'] errors = 0 makebuildserver = os.path.join(os.path.dirname(__file__), os.pardir, 'makebuildserver') @@ -37,13 +34,16 @@ code = compile(to_compile, makebuildserver, 'exec') config = {} exec(code, None, config) # nosec this is just a CI script makebuildserver_versions = [] +version_pat = re.compile(r'[0-9]+(\.[0-9]+)+') for url, checksum in config['CACHE_FILES']: if 'gradle.org' in url: m = version_pat.search(url.split('/')[-1]) if m: makebuildserver_versions.append(m.group()) if checksum != versions[m.group()]: - print('ERROR: checksum mismatch:', checksum, versions[m.group()]) + print(Fore.RED + + 'ERROR: checksum mismatch:', checksum, versions[m.group()] + + Style.RESET_ALL) errors += 1 # error if makebuildserver is missing the latest version @@ -68,6 +68,12 @@ current = '' get_sha_pat = re.compile(r""" +'([0-9][0-9.]+[0-9])'\)\s+echo '([0-9a-f]{64})' ;;\n""") for m in get_sha_pat.finditer(gradlew_fdroid): current += m.group() + checksum = m.group(2) + if checksum != versions[m.group(1)]: + print(Fore.RED + + 'ERROR: checksum mismatch:', checksum, versions[m.group(1)] + + Style.RESET_ALL) + errors += 1 new = '' for version in sorted(versions.keys(), key=LooseVersion): sha256 = versions[version] @@ -81,5 +87,53 @@ plugin_v_pat = re.compile(r'\nplugin_v=\(([0-9. ]+)\)') with open('gradlew-fdroid', 'w') as fp: fp.write(plugin_v_pat.sub('\nplugin_v=(%s)' % plugin_v, gradlew_fdroid)) -print('makebuildserver has gradle v' + sorted(makebuildserver_versions)[-1]) -sys.exit(errors) +if os.getenv('CI_PROJECT_NAMESPACE') != 'fdroid-bot': + p = subprocess.run(['git', '--no-pager', 'diff']) + print(p.stdout) + exit(errors) + +git_repo = git.repo.Repo('.') +modified = git_repo.git().ls_files(modified=True).split() +if (git_repo.is_dirty() + and ('gradlew-fdroid' in modified or 'makebuildserver' in modified)): + branch = git_repo.create_head(os.path.basename(__file__), force=True) + branch.checkout() + git_repo.index.add(['gradlew-fdroid', 'makebuildserver']) + author = git.Actor('fdroid-bot', 'fdroid-bot@f-droid.org') + git_repo.index.commit('gradle v' + version, author=author) + project_path = 'fdroid-bot/' + os.getenv('CI_PROJECT_NAME') + url = ('https://gitlab-ci-token:%s@%s/%s.git' + % (os.getenv('PERSONAL_ACCESS_TOKEN'), os.getenv('CI_SERVER_HOST'), project_path)) + remote_name = 'fdroid-bot' + try: + remote = git_repo.create_remote(remote_name, url) + except git.exc.GitCommandError: + remote = git.remote.Remote(git_repo, remote_name) + remote.set_url(url) + remote.push(force=True) + git.remote.Remote.rm(git_repo, remote_name) + + private_token = os.getenv('PERSONAL_ACCESS_TOKEN') + if not private_token: + print(Fore.RED + + 'ERROR: GitLab Token not found in PERSONAL_ACCESS_TOKEN!' + + Style.RESET_ALL) + sys.exit(1) + gl = gitlab.Gitlab(os.getenv('CI_SERVER_URL'), api_version=4, + private_token=private_token) + project = gl.projects.get(project_path, lazy=True) + description = ( + 'see ' + '\n\n

generated by GitLab CI Job #%s

' + % (os.getenv('CI_PROJECT_URL'), os.getenv('CI_JOB_ID'), os.getenv('CI_JOB_ID')) + ) + mr = project.mergerequests.create({ + 'source_branch': branch.name, + 'target_project_id': 36527, # fdroid/fdroidserver + 'target_branch': 'master', + 'title': 'update to gradle v' + version, + 'description': description, + 'labels': ['fdroid-bot', 'gradle'], + 'remove_source_branch': True, + }) + mr.save() From 669ce10d9a232605cf2ec01c6d2b1fdfd20e738f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 25 Jan 2021 10:26:02 +0100 Subject: [PATCH 0074/2116] enable complete lint/CI checking on gradle-release-checksums.py --- hooks/pre-commit | 2 +- tests/gradle-release-checksums.py | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/hooks/pre-commit b/hooks/pre-commit index 07a6607d..78fcf8ed 100755 --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -8,7 +8,7 @@ exec 1>&2 files=`git diff-index --cached HEAD 2>&1 | sed 's/^:.* //' | uniq | cut -b100-500` if [ -z "$files" ]; then - PY_FILES="fdroid makebuildserver setup.py fdroidserver/*.py examples/*.py" + PY_FILES="fdroid makebuildserver setup.py fdroidserver/*.py examples/*.py tests/gradle-release-checksums.py" PY_TEST_FILES="tests/*.TestCase" SH_FILES="hooks/pre-commit" BASH_FILES="gradlew-fdroid jenkins-build-all jenkins-setup-build-environment jenkins-test completion/bash-completion buildserver/provision-*" diff --git a/tests/gradle-release-checksums.py b/tests/gradle-release-checksums.py index a264c8ba..df2216a8 100755 --- a/tests/gradle-release-checksums.py +++ b/tests/gradle-release-checksums.py @@ -6,7 +6,6 @@ import os import re import requests import subprocess -from bs4 import BeautifulSoup from colorama import Fore, Style from distutils.version import LooseVersion @@ -15,9 +14,9 @@ checksums = None versions = dict() while not checksums: - r = requests.get('https://gitlab.com/fdroid/gradle-transparency-log/-/raw/master/checksums.json') - if r.status_code == 200: - checksums = r.json() + r = requests.get('https://gitlab.com/fdroid/gradle-transparency-log/-/raw/master/checksums.json') + if r.status_code == 200: + checksums = r.json() gradle_bin_pat = re.compile(r'gradle-([0-9][0-9.]+[0-9])-bin.zip') for url, d in checksums.items(): @@ -94,8 +93,7 @@ if os.getenv('CI_PROJECT_NAMESPACE') != 'fdroid-bot': git_repo = git.repo.Repo('.') modified = git_repo.git().ls_files(modified=True).split() -if (git_repo.is_dirty() - and ('gradlew-fdroid' in modified or 'makebuildserver' in modified)): +if git_repo.is_dirty() and ('gradlew-fdroid' in modified or 'makebuildserver' in modified): branch = git_repo.create_head(os.path.basename(__file__), force=True) branch.checkout() git_repo.index.add(['gradlew-fdroid', 'makebuildserver']) @@ -118,7 +116,7 @@ if (git_repo.is_dirty() print(Fore.RED + 'ERROR: GitLab Token not found in PERSONAL_ACCESS_TOKEN!' + Style.RESET_ALL) - sys.exit(1) + exit(1) gl = gitlab.Gitlab(os.getenv('CI_SERVER_URL'), api_version=4, private_token=private_token) project = gl.projects.get(project_path, lazy=True) From 0af157244af37c49b7416d117a21349e52db5b32 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 25 Jan 2021 11:04:23 +0100 Subject: [PATCH 0075/2116] gradle-release-checksums: runs after commits push to fdroid/fdroidserver --- tests/gradle-release-checksums.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/gradle-release-checksums.py b/tests/gradle-release-checksums.py index df2216a8..9f895426 100755 --- a/tests/gradle-release-checksums.py +++ b/tests/gradle-release-checksums.py @@ -86,11 +86,12 @@ plugin_v_pat = re.compile(r'\nplugin_v=\(([0-9. ]+)\)') with open('gradlew-fdroid', 'w') as fp: fp.write(plugin_v_pat.sub('\nplugin_v=(%s)' % plugin_v, gradlew_fdroid)) -if os.getenv('CI_PROJECT_NAMESPACE') != 'fdroid-bot': +if os.getenv('CI_PROJECT_NAMESPACE') != 'fdroid': p = subprocess.run(['git', '--no-pager', 'diff']) print(p.stdout) exit(errors) +# This only runs after commits are pushed to fdroid/fdroidserver git_repo = git.repo.Repo('.') modified = git_repo.git().ls_files(modified=True).split() if git_repo.is_dirty() and ('gradlew-fdroid' in modified or 'makebuildserver' in modified): From 87477cd9106fe3fc26159cb31e62fff6c5dabb8c Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 25 Jan 2021 11:04:49 +0100 Subject: [PATCH 0076/2116] gitlab-ci: gradle job needs git history to find what changed --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 011e9048..f22e492f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -228,6 +228,8 @@ fedora_latest: gradle: image: debian:bullseye <<: *apt-template + variables: + GIT_DEPTH: 1000 script: - apt-get install ca-certificates From d89dea63c36a572a0b88092fb5341e1943313bbd Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Mon, 25 Jan 2021 10:36:37 +0000 Subject: [PATCH 0077/2116] gradle v6.8.1 --- gradlew-fdroid | 3 ++- makebuildserver | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 53494da2..c56c9ce4 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -155,6 +155,7 @@ get_sha() { '6.7') echo '8ad57759019a9233dc7dc4d1a530cefe109dc122000d57f7e623f8cf4ba9dfc4' ;; '6.7.1') echo '3239b5ed86c3838a37d983ac100573f64c1f3fd8e1eb6c89fa5f9529b5ec091d' ;; '6.8') echo 'e2774e6fb77c43657decde25542dea710aafd78c4022d19b196e7e78d79d8c6c' ;; + '6.8.1') echo 'fd591a34af7385730970399f473afabdb8b28d57fd97d6625c388d090039d6fd' ;; *) exit 1 esac } @@ -175,7 +176,7 @@ d_plugin_k=(4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 d_plugin_v=(6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.4) +plugin_v=(6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} diff --git a/makebuildserver b/makebuildserver index a06d6355..66be3eb7 100755 --- a/makebuildserver +++ b/makebuildserver @@ -403,6 +403,8 @@ CACHE_FILES = [ '3239b5ed86c3838a37d983ac100573f64c1f3fd8e1eb6c89fa5f9529b5ec091d'), ('https://services.gradle.org/distributions/gradle-6.8-bin.zip', 'e2774e6fb77c43657decde25542dea710aafd78c4022d19b196e7e78d79d8c6c'), + ('https://services.gradle.org/distributions/gradle-6.8.1-bin.zip', + 'fd591a34af7385730970399f473afabdb8b28d57fd97d6625c388d090039d6fd'), ('https://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin', '102d6723f67ff1384330d12c45854315d6452d6510286f4e5891e00a5a8f1d5a'), ('https://dl.google.com/android/repository/android-ndk-r11c-linux-x86_64.zip', From 197ca7e36ffe8fa9b06f42c289c698077a1e2797 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 20 Aug 2020 14:56:49 +0200 Subject: [PATCH 0078/2116] update: warn with --nosign if keystore/repo_pubkey are not present This should also make it easier to use index.make() as an API function since this changes whether the instance var exists before checking the value. --- fdroidserver/index.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index d6d396a5..a21bb91b 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -57,7 +57,10 @@ def make(apps, apks, repodir, archive): """ from fdroidserver.update import METADATA_VERSION - if not common.options.nosign: + if hasattr(common.options, 'nosign') and common.options.nosign: + if 'keystore' not in common.config and 'repo_pubkey' not in common.config: + raise FDroidException(_('"repo_pubkey" must be present in config.py when using --nosign!')) + else: common.assert_config_keystore(common.config) # Historically the index has been sorted by App Name, so we enforce this ordering here From 32a0c610103272e955ced42e6937540c2b62d126 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 25 Jan 2021 23:27:24 +0100 Subject: [PATCH 0079/2116] init: enable apksigner by default if it is found --- CHANGELOG.md | 1 + fdroidserver/init.py | 4 +++- tests/init.TestCase | 22 ++++++++++++++++++++++ tests/run-tests | 7 ++++++- 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d6497e1..75a7a058 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,7 @@ milestone](https://gitlab.com/fdroid/fdroidserver/-/milestones/10) * Smoother process for signing APKs with `apksigner` ([!736](https://gitlab.com/fdroid/fdroidserver/merge_requests/736)) ([!821](https://gitlab.com/fdroid/fdroidserver/merge_requests/821)) +* `apksigner` is used by default on new repos * All parts except _build_ and _publish_ work without the Android SDK ([!821](https://gitlab.com/fdroid/fdroidserver/merge_requests/821)) * Description: is now passed to clients unchanged, no HTML conversion diff --git a/fdroidserver/init.py b/fdroidserver/init.py index 7f9fc817..64809771 100644 --- a/fdroidserver/init.py +++ b/fdroidserver/init.py @@ -148,7 +148,9 @@ def main(): # enable apksigner by default so v2/v3 APK signatures validate if common.find_apksigner() is not None: - test_config['apksigner'] = common.find_apksigner() + apksigner = common.find_apksigner() + test_config['apksigner'] = apksigner + common.write_to_config(test_config, 'apksigner', apksigner) # the NDK is optional and there may be multiple versions of it, so it's # left for the user to configure diff --git a/tests/init.TestCase b/tests/init.TestCase index f080ff74..30d4db32 100755 --- a/tests/init.TestCase +++ b/tests/init.TestCase @@ -9,6 +9,7 @@ import optparse import sys import tempfile import unittest +import yaml localmodule = os.path.realpath( @@ -30,6 +31,7 @@ class InitTest(unittest.TestCase): if not os.path.exists(self.tmpdir): os.makedirs(self.tmpdir) os.chdir(self.basedir) + fdroidserver.common.config = None fdroidserver.init.config = None def test_disable_in_config(self): @@ -38,6 +40,7 @@ class InitTest(unittest.TestCase): with open('config.yml', 'w') as fp: fp.write('keystore: NONE\n') fp.write('keypass: mysupersecrets\n') + os.chmod('config.yml', 0o600) config = fdroidserver.common.read_config(fdroidserver.common.options) self.assertEqual('NONE', config['keystore']) self.assertEqual('mysupersecrets', config['keypass']) @@ -48,6 +51,25 @@ class InitTest(unittest.TestCase): config = fdroidserver.common.read_config(fdroidserver.common.options) self.assertIsNone(config.get('keypass')) + def test_main_in_empty_dir(self): + testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + os.chdir(testdir) + + bindir = os.path.join(os.getcwd(), 'bin') + os.mkdir(bindir) + apksigner = os.path.join(bindir, 'apksigner') + open(apksigner, 'w').close() + os.chmod(apksigner, 0o755) + os.environ['PATH'] = bindir + + sys.argv = ['fdroid init'] + fdroidserver.init.main() + with open('config.yml') as fp: + config = yaml.safe_load(fp) + self.assertTrue(os.path.exists(config['keystore'])) + self.assertTrue(os.path.exists(config['apksigner'])) + self.assertEqual(apksigner, config['apksigner']) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) diff --git a/tests/run-tests b/tests/run-tests index 693c89e6..af415243 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -75,6 +75,10 @@ is_MD5_disabled() { return $? } +use_apksigner() { + test -x "`sed -En 's,^ *apksigner: +,,p' config.yml`" +} + #------------------------------------------------------------------------------# # "main" @@ -312,7 +316,7 @@ cp $WORKSPACE/tests/urzip.apk \ printf '\narchive_older: 3\n' >> config.yml $fdroid update --pretty --nosign -if which apksigner; then +if use_apksigner; then test `grep '' archive/index.xml | wc -l` -eq 2 test `grep '' repo/index.xml | wc -l` -eq 10 else @@ -529,6 +533,7 @@ test -e repo/org.bitbucket.tickytacky.mirrormirror_3.apk test -e repo/org.bitbucket.tickytacky.mirrormirror_4.apk test -e archive/urzip-badsig.apk +sed -i.tmp '/apksigner:/d' config.yml if ! which apksigner; then $sed -i.tmp '/allow_disabled_algorithms/d' config.yml $fdroid update --pretty --nosign From e4087f17988a396cc933bde88cfb672a2aeb6614 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 27 Jan 2021 23:50:53 +0100 Subject: [PATCH 0080/2116] gitlab-ci: hide massively verbose messages from sdkmanager --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f22e492f..dba0f7a2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -10,7 +10,7 @@ test: script: - $pip install -e .[test] # the `fdroid build` test in tests/run-tests needs android-23 - - echo y | $ANDROID_HOME/tools/bin/sdkmanager "platforms;android-23" + - echo y | $ANDROID_HOME/tools/bin/sdkmanager "platforms;android-23" > /dev/null - cd tests - ./complete-ci-tests @@ -218,8 +218,8 @@ fedora_latest: - printf "\n79120722343a6f314e0719f863036c702b0e6b2a\n84831b9409646a918e30573bab4c9c91346d8abd" > $ANDROID_HOME/licenses/android-sdk-preview-license-old - mkdir ~/.android - touch ~/.android/repositories.cfg - - echo y | $ANDROID_HOME/tools/bin/sdkmanager "platform-tools" - - echo y | $ANDROID_HOME/tools/bin/sdkmanager "build-tools;$BUILD_TOOLS_VERSION" + - echo y | $ANDROID_HOME/tools/bin/sdkmanager "platform-tools" > /dev/null + - echo y | $ANDROID_HOME/tools/bin/sdkmanager "build-tools;$BUILD_TOOLS_VERSION" > /dev/null - chown -R testuser . - cd tests - su testuser --login --command From 5cd9a8e396ebf2ae2748f4460eb50cc737c66624 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 29 Jan 2021 09:04:48 +0100 Subject: [PATCH 0081/2116] tests: make init apksigner test use existing test keystore This test does not need to generate a keystore, so using the existing one reduces the run time from 4 seconds to 0.040 seconds. Also, if makes this mystery error on macOS go away: ``` Traceback (most recent call last): File "/Users/travis/build/fdroidtravis/fdroidserver/tests/init.TestCase", line 66, in test_main_in_empty_dir fdroidserver.init.main() File "/Users/travis/build/fdroidtravis/fdroidserver/fdroidserver/init.py", line 231, in main common.genkeystore(c) File "/Users/travis/build/fdroidtravis/fdroidserver/fdroidserver/common.py", line 3434, in genkeystore cmd = [config['keytool'], '-genkey', KeyError: 'keytool' ``` --- tests/init.TestCase | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/init.TestCase b/tests/init.TestCase index 30d4db32..918643cc 100755 --- a/tests/init.TestCase +++ b/tests/init.TestCase @@ -6,6 +6,7 @@ import inspect import logging import os import optparse +import shutil import sys import tempfile import unittest @@ -52,9 +53,12 @@ class InitTest(unittest.TestCase): self.assertIsNone(config.get('keypass')) def test_main_in_empty_dir(self): + """Test that `fdroid init` will find apksigner and add it to the config""" testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) os.chdir(testdir) + shutil.copy(os.path.join(self.basedir, 'keystore.jks'), testdir) + bindir = os.path.join(os.getcwd(), 'bin') os.mkdir(bindir) apksigner = os.path.join(bindir, 'apksigner') @@ -62,7 +66,7 @@ class InitTest(unittest.TestCase): os.chmod(apksigner, 0o755) os.environ['PATH'] = bindir - sys.argv = ['fdroid init'] + sys.argv = ['fdroid init', '--keystore', 'keystore.jks', '--repo-keyalias=sova'] fdroidserver.init.main() with open('config.yml') as fp: config = yaml.safe_load(fp) From f7480316df662e7568db338fbb84dd3a9b9292cc Mon Sep 17 00:00:00 2001 From: mondstern Date: Fri, 29 Jan 2021 11:51:58 +0100 Subject: [PATCH 0082/2116] Translated using Weblate: Polish (pl) by mondstern Currently translated at 95.6% (548 of 573 strings) Co-authored-by: mondstern Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ Translation: F-Droid/F-Droid Server --- locale/pl/LC_MESSAGES/fdroidserver.po | 55 ++++++++++++++------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 7edc6943..31a0fd33 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -2,20 +2,21 @@ # This file is put in the public domain. # WaldiS , 2020. # Michal L , 2020, 2021. +# mondstern , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-13 04:41+0000\n" -"Last-Translator: Michal L \n" +"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"PO-Revision-Date: 2021-01-14 14:58+0000\n" +"Last-Translator: mondstern \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.4.1-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py msgid "" @@ -156,7 +157,7 @@ msgstr "'keypass' nie znaleziono w config.py!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" +msgstr "\"keystore\" nie ma, a \"smartcardoptions\" jest puste!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystore' not found in config.py!" @@ -971,7 +972,7 @@ msgstr "HTTPS musi być używany z adresami URL Subversion!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "" +msgstr "Jeśli serwer lustrzany git stanie się Duży, Zezwól na usunięcie archiwum" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1008,15 +1009,15 @@ msgstr "Dołącz pliki APK, które są podpisane przy użyciu wyłączonych algo #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" -msgstr "" +msgstr "Dołącz podpis PGP .pliki asc w lustrze" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" -msgstr "" +msgstr "Dołącz dzienniki budowy do lustra" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" -msgstr "" +msgstr "Dołącz źródło tarballs w lustrze" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1161,7 +1162,7 @@ msgstr "Nie znaleziono Java JDK! Zainstaluj w standardowej lokalizacji lub ustaw #: ../fdroidserver/scanner.py msgid "Java compiled class" -msgstr "" +msgstr "Klasa skompilowana Java" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" @@ -1211,7 +1212,7 @@ msgstr "Nieprawidłowy wiersz serverwebroot:" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." -msgstr "" +msgstr "Mirror pełnego repo i archiwum, wszystkie typy plików." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" @@ -1311,7 +1312,7 @@ msgstr "Brak katalogu bez podpisu - nic nie można zrobić" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" -msgstr "" +msgstr "Nieprawidłowa definicja rozmiaru: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" @@ -1347,7 +1348,7 @@ msgstr "Nazwa pakietu OBB nie jest zgodna z obsługiwanym pakietem APK:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" +msgstr "Maszyna Offline, pomijając generowanie git mirror aż do ' fdroid deploy`" #: ../fdroidserver/common.py #, python-brace-format @@ -1387,13 +1388,13 @@ msgstr "Wyjście raportu JSON do pliku o nazwie po APK." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." -msgstr "" +msgstr "Wyjście JSON na stdout." #: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py #: ../fdroidserver/update.py ../fdroidserver/signindex.py #: ../fdroidserver/checkupdates.py msgid "Outputting JSON" -msgstr "" +msgstr "Wyprowadzanie JSON" #: ../fdroidserver/import.py msgid "Overall license of the project." @@ -1610,7 +1611,7 @@ msgstr "Skanuj tylko najnowszą wersję każdego pakietu" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "" +msgstr "Przeskanuj otrzymany plik APK w poszukiwaniu znanych niewolnych klas." #: ../fdroid ../fdroidserver/__main__.py msgid "Scan the source code of a package" @@ -1639,7 +1640,7 @@ msgstr "Ustaw zegar na ten czas, używając:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "" +msgstr "Ustaw maksymalne wydania w repo przed archiwizacją starszych" #: ../fdroidserver/build.py #, python-brace-format @@ -2106,7 +2107,7 @@ msgstr "Po skonfigurowaniu dla indeksów podpisanych utwórz na tym etapie tylko #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "" +msgstr "Podczas linkowania całego repozytorium yamllint jest domyślnie wyłączony. Ta opcja wymusza yamllint niezależnie od tego." msgid "X.509 'Distiguished Name' used when generating keys" msgstr "X.509 'Distiguished Name' używana podczas generowania kluczy" @@ -2147,7 +2148,7 @@ msgstr "niejednoznaczna opcja: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" -msgstr "" +msgstr "apksigner nie znaleziono, jest wymagane do podpisania!" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py #: ../fdroidserver/checkupdates.py @@ -2194,7 +2195,7 @@ msgstr "próbując odsłoniętego połączenia ssh, aby przetestować klucz wdro #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" -msgstr "" +msgstr "can not parse scrlib spec (not a string):' {}'" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2233,7 +2234,7 @@ msgstr "polecenie do wykonania, 'init' lub 'update'" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" -msgstr "" +msgstr "polecenia z modułów plugin:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2261,7 +2262,7 @@ msgstr "" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "" +msgstr "could not parse srclib spec (no ref specified):' {}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" @@ -2295,7 +2296,7 @@ msgstr "dest = jest wymagany dla opcji takich jak %r" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" -msgstr "" +msgstr "wykonywalny binarny, ewentualnie kod" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2551,7 +2552,7 @@ msgstr "s3cmd zsynchronizuj indeksy {path} do {url} i usuń" #: ../fdroidserver/scanner.py msgid "shared library" -msgstr "" +msgstr "biblioteka współdzielona" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2587,7 +2588,7 @@ msgstr "brak nazwy srclibs i/lub @" #: ../fdroidserver/scanner.py msgid "static library" -msgstr "" +msgstr "biblioteka statyczna" #: ../fdroidserver/common.py #, python-brace-format @@ -2639,11 +2640,11 @@ msgstr "używając Apache libcloud do zsynchronizowania z {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "" +msgstr "virustotal.com jest ograniczenie stawki, czeka na ponowną próbę..." #: ../fdroidserver/update.py msgid "wiki support is deprecated and will be removed in the next release!" -msgstr "" +msgstr "wsparcie wiki jest przestarzałe i zostanie usunięte w następnym wydaniu!" #: ../fdroidserver/publish.py #, python-brace-format From 165ceaa3455abf0513599112c75bf75e5555bfb6 Mon Sep 17 00:00:00 2001 From: Coding Otaku Date: Fri, 29 Jan 2021 11:51:59 +0100 Subject: [PATCH 0083/2116] Translated using Weblate: Malayalam (ml) by Coding Otaku Currently translated at 0.0% (0 of 573 strings) Co-authored-by: Coding Otaku Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ml/ Translation: F-Droid/F-Droid Server --- locale/ml/LC_MESSAGES/fdroidserver.po | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/locale/ml/LC_MESSAGES/fdroidserver.po b/locale/ml/LC_MESSAGES/fdroidserver.po index dc65c236..a5b8e618 100644 --- a/locale/ml/LC_MESSAGES/fdroidserver.po +++ b/locale/ml/LC_MESSAGES/fdroidserver.po @@ -1,22 +1,23 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# FIRST AUTHOR , YEAR. -# +# Coding Otaku , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" +"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"PO-Revision-Date: 2021-01-14 14:58+0000\n" +"Last-Translator: Coding Otaku \n" +"Language-Team: Malayalam \n" "Language: ml\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py +#, fuzzy msgid "" "\n" " This is a repository of apps to be used with FDroid. Applications in this\n" @@ -25,18 +26,30 @@ msgid "" " tools on https://gitlab.com/fdroid.\n" " " msgstr "" +"\n" +" FDroid- നൊപ്പം ഉപയോഗിക്കേണ്ട അപ്ലിക്കേഷനുകളുടെ ഒരു ശേഖരമാണിത്. \n" +" ഇതിലെ അപ്ലിക്കേഷനുകൾ ഒന്നെങ്കിൽ ഒറിജിനൽ ആപ്ലിക്കേഷൻ\n" +" നിർമാതാക്കൾ നിർമ്മിച്ച ഔദ്യോഗിക ബൈനറികളുടെ ശേഖരമോ,\n" +" അല്ലെങ്കിൽ f-droid.org https://gitlab.com/fdroid- ലെ ഉപകരണങ്ങൾ ഉപയോഗിച്ച് ഉറവിടത്തിൽ നിന്ന് നിർമ്മിച്ച ബൈനറികളോ ആണ് .\n" +" " #: ../fdroidserver/nightly.py +#, fuzzy msgid "" "\n" "SSH Public Key to be used as Deploy Key:" msgstr "" +"\n" +"വിന്യാസ കീയായി ഉപയോഗിക്കുന്നതിനുള്ള SSH പബ്ലിക് കീ:" #: ../fdroidserver/nightly.py +#, fuzzy msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" +"\n" +"വിന്യാസ കീയായി ഉപയോഗിക്കുന്നതിനുള്ള SSH പബ്ലിക് കീ:" #: ../fdroidserver/nightly.py #, python-brace-format From c10918c1e34151ca6c1fc74ed94b65992a3e1888 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 29 Jan 2021 11:51:59 +0100 Subject: [PATCH 0084/2116] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ Translation: F-Droid/F-Droid Server --- locale/bo/LC_MESSAGES/fdroidserver.po | 2 +- locale/de/LC_MESSAGES/fdroidserver.po | 2 +- locale/es/LC_MESSAGES/fdroidserver.po | 2 +- locale/fr/LC_MESSAGES/fdroidserver.po | 2 +- locale/hu/LC_MESSAGES/fdroidserver.po | 2 +- locale/kab/LC_MESSAGES/fdroidserver.po | 2 +- locale/ml/LC_MESSAGES/fdroidserver.po | 2 +- locale/pl/LC_MESSAGES/fdroidserver.po | 2 +- locale/sq/LC_MESSAGES/fdroidserver.po | 2 +- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index 4f7b1db7..a90878e5 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-14 14:58+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tibetan \n" diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 1ccbeb66..66a5ab90 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-14 14:58+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: German \n" diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 831548be..e8791ad7 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-14 14:58+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Spanish \n" diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index b3521c84..0c485345 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -20,7 +20,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-14 14:58+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: French \n" diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index ef0b2f19..7e9af8a9 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-14 14:58+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Hungarian \n" diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index 50da8323..4556a8b0 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-14 14:58+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Kabyle \n" diff --git a/locale/ml/LC_MESSAGES/fdroidserver.po b/locale/ml/LC_MESSAGES/fdroidserver.po index a5b8e618..733ab9db 100644 --- a/locale/ml/LC_MESSAGES/fdroidserver.po +++ b/locale/ml/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-14 14:58+0000\n" "Last-Translator: Coding Otaku \n" "Language-Team: Malayalam \n" diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 31a0fd33..c4f9c3ea 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-14 14:58+0000\n" "Last-Translator: mondstern \n" "Language-Team: Polish \n" diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index d5b13cc0..8bb9bfe3 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-14 14:58+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Albanian \n" diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 304db98c..7141806a 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2020-10-21 18:05+0200\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-14 14:58+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Chinese (Traditional) \n" From 7885c2a2c91e253b3c51048ba9af17bb21142e95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89frit?= Date: Fri, 29 Jan 2021 11:52:01 +0100 Subject: [PATCH 0085/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Frenc?= =?UTF-8?q?h=20(fr)=20by=20=C3=89frit=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 81.4% (479 of 588 strings) Co-authored-by: Éfrit Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 0c485345..0f7786da 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -16,13 +16,14 @@ # Alexandre Hô , 2020. # Yldun , 2020. # Renaud Perrai , 2020. +# Éfrit , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-14 14:58+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2021-01-14 19:53+0000\n" +"Last-Translator: Éfrit \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -893,7 +894,7 @@ msgstr "« {path} » graphique trouvée sans métadonnées pour l'applicatio #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" -msgstr "" +msgstr "Mauvais fichier de financement « {path} » trouvé pour « {name} » :" #: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" From 059e298e978cc2b1f367dec1315a33a58f9388cb Mon Sep 17 00:00:00 2001 From: hilariousperson Date: Fri, 29 Jan 2021 11:52:01 +0100 Subject: [PATCH 0086/2116] Translated using Weblate: French (fr) by hilariousperson Currently translated at 81.4% (479 of 588 strings) Co-authored-by: hilariousperson Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 177 ++++++++++++-------------- 1 file changed, 84 insertions(+), 93 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 0f7786da..0c2e0478 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -17,13 +17,14 @@ # Yldun , 2020. # Renaud Perrai , 2020. # Éfrit , 2021. +# hilariousperson , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-14 19:53+0000\n" -"Last-Translator: Éfrit \n" +"Last-Translator: hilariousperson \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -106,7 +107,7 @@ msgstr "\"{path}\" n'est pas un format autorisé (utiliser : metadata/*.yml)" #: ../fdroidserver/metadata.py #, python-brace-format msgid "\"{path}\" is not an accepted format, convert to: {formats}" -msgstr "\"{path}\" n'est pas un format autorisé, convertir en : {formats}" +msgstr "{path} n'est pas un format accepté, convertir en {formats}" #: ../fdroidserver/common.py #, python-brace-format @@ -164,9 +165,8 @@ msgid "'keypass' not found in config.py!" msgstr "'keypass' non trouvé dans config.py !" #: ../fdroidserver/common.py -#, fuzzy msgid "'keypass' not found in config.yml!" -msgstr "'keypass' non trouvé dans config.py !" +msgstr "'keypass' non trouvé dans config.yml !" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" @@ -177,27 +177,24 @@ msgid "'keystore' not found in config.py!" msgstr "'keystore' non trouvé dans config.py !" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystore' not found in config.yml!" -msgstr "'keystore' non trouvé dans config.py !" +msgstr "'keystore' non trouvé dans config.yml !" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "'keystorepass' non trouvé dans config.py !" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' non trouvé dans config.py !" +msgstr "'keystorepass' non trouvé dans config.yml !" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "'repo_keyalias' non trouvé dans config.py !" #: ../fdroidserver/common.py -#, fuzzy msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' non trouvé dans config.py !" +msgstr "'repo_keyalias' non trouvé dans config.yml !" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -209,9 +206,8 @@ msgid "'sdk_path' not set in 'config.py'!" msgstr "'sdk_path' n'est pas configuré dans 'config.py' !" #: ../fdroidserver/common.py -#, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "'sdk_path' n'est pas configuré dans 'config.py' !" +msgstr "'sdk_path' n'est pas configuré dans 'config.yml' !" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -328,9 +324,9 @@ msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "Le SDK Android '{path}' n'a pas '{dirname}' installé !" #: ../fdroidserver/init.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "SDK Android introuvable !" +msgstr "SDK Android introuvable dans {path} !" #: ../fdroidserver/common.py msgid "Android SDK not found!" @@ -347,9 +343,9 @@ msgid "Android SDK path '{path}' is not a directory!" msgstr "Le chemin du SDK Android '{path}' n'est pas un dossier !" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "SDK Android introuvable !" +msgstr "Outil SDK Android {cmd} trouvé !" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -440,7 +436,7 @@ msgstr "Impossible de lire \"{path}\" !" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Cannot resolve application ID {appid}" msgstr "Impossible de résoudre l'identifiant de l'application {appid}" @@ -512,7 +508,7 @@ msgstr "Conflit d'arguments : '--verbose' et '--quiet' ne peuvent être choisis #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "Conflit de fichiers de configuration ! Utilisation de {newfile}, ignorant {oldfile} !" #: ../fdroidserver/common.py #, python-brace-format @@ -533,9 +529,9 @@ msgid "Could not find {path} to remove it" msgstr "Chemin {path} introuvable pour sa suppression" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "Impossible d'ouvrir le fichier apk pour analyse" +msgstr "Impossible d'ouvrir le fichier apk {path} pour analyse : " #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" @@ -731,7 +727,7 @@ msgstr "Analyser dynamiquement les APKs après compilation" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" +msgstr "ERREUR : La sous-commande \"server\" a été supprimée, utilisez \"deploy\" !" #: ../fdroidserver/mirror.py msgid "" @@ -767,7 +763,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "La variable d'environnent {var} de {configname} n'est pas configurée !" #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py @@ -908,7 +904,7 @@ msgstr "Code de version invalide trouvée pour certaines application" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "Plusieurs certificats signées trouvée dans {path}" +msgstr "Plusieurs certificats signés trouvée dans {path}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1024,7 +1020,7 @@ msgstr "Inclure au miroir les fichiers .asc de signature PGP" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" -msgstr "" +msgstr "Inclure les journaux de construction dans le miroir" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" @@ -1188,9 +1184,9 @@ msgid "Keystore for signing key:\t" msgstr "Stockage des clés signée :\t" #: ../fdroidserver/lint.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "Le dernier archivage utiliser '{commit}' ressemble a une balise, mais le Mode De Vérification Des Mise A Jour est '{ucm}'" +msgstr "Le dernier commit utilisé '{commit}' ressemble a une balise, mais le UpdateCheckMode est '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" @@ -1255,9 +1251,8 @@ msgid "No commit specified for {versionName} in {linedesc}" msgstr "Aucun archivage spécifier pour {versionName} dans {linedesc}" #: ../fdroidserver/common.py -#, fuzzy msgid "No config.yml found, using defaults." -msgstr "Aucun 'config.py' trouvée, utilisation des originales." +msgstr "Aucun 'config.yml' trouvée, utilisation des valeurs par défaut." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1268,9 +1263,8 @@ msgid "No git submodules available" msgstr "Aucun sous-module git disponible" #: ../fdroidserver/import.py -#, fuzzy msgid "No gradle project could be found. Specify --subdir?" -msgstr "Aucun projet android ou kivy n'a pu être trouver. Spécifiier --subdir ?" +msgstr "Aucun projet gradle n'a pu être trouvé. Spécifier --subdir ?" #: ../fdroidserver/import.py ../fdroidserver/common.py msgid "No information found." @@ -1339,9 +1333,8 @@ msgid "Now set these in config.py:" msgstr "Maintenant, définissez-les dans config.py :" #: ../fdroidserver/init.py -#, fuzzy msgid "Now set these in config.yml:" -msgstr "Maintenant, définissez-les dans config.py :" +msgstr "Maintenant, définissez ceci dans config.yml :" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1359,7 +1352,7 @@ msgstr "Le nom de paquet d'OBB ne correspond pas à un fichier APK pris en charg #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" +msgstr "Machine hors-ligne, la génération du miroir git est sautée jusqu'à `fdroid deploy`" #: ../fdroidserver/common.py #, python-brace-format @@ -1384,9 +1377,8 @@ msgid "Only process apps with auto-updates" msgstr "Traiter uniquement les applications ayant des mises à jour automatiques" #: ../fdroidserver/lint.py -#, fuzzy msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "La méthode de donnation Flattr reviens au flag FlatttrID" +msgstr "Les méthodes de donation OpenCollective vont dans le champ OpenCollective:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -1622,7 +1614,7 @@ msgstr "Analyser seulement la dernière version de chaque paquet" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "" +msgstr "Scanne le(s) APK(s) résultants pour des classes non-libres connues." #: ../fdroid ../fdroidserver/__main__.py msgid "Scan the source code of a package" @@ -1687,7 +1679,7 @@ msgstr "Signer les indexes créés avec update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" -msgstr "" +msgstr "Sauter le scan du code source pour des fichiers binaires et d'autres problèmes" #: ../fdroidserver/update.py #, python-brace-format @@ -1720,11 +1712,11 @@ msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Specify an identity file to provide to SSH for rsyncing" -msgstr "" +msgstr "Spécifier un fichier d'identité à fournir à SSH pour utiliser rsync" #: ../fdroidserver/build.py msgid "Specify that we're running on the build server" -msgstr "" +msgstr "Spécifier que l'on tourne sur le serveur de construction" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." @@ -1732,7 +1724,7 @@ msgstr "" #: ../fdroidserver/common.py msgid "Spew out even more information than normal" -msgstr "" +msgstr "Fournir encore plus d'information que d'habitude" #: ../fdroidserver/nightly.py #, python-brace-format @@ -1740,24 +1732,24 @@ msgid "Striping mystery signature from {apkfilename}" msgstr "" #: ../fdroidserver/nightly.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Stripping mystery signature from {apkfilename}" -msgstr "Ignorer les données de cache périmées pour {apkfilename}" +msgstr "Ignorer la signature mystère de {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" -msgstr "" +msgstr "Le résumé '%s' est juste le nom de l'application" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" -msgstr "" +msgstr "Le résumé de taille {length} est au-dessus de la limite de {limit} caractères" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" -msgstr "" +msgstr "L'horloge système est plus âgée que la date dans {path} !" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." @@ -1767,7 +1759,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" -msgstr "" +msgstr "Le code de version OBB doit venir après \"{name}. :" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" @@ -1779,7 +1771,7 @@ msgstr "" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" -msgstr "" +msgstr "Le fichier à inclure dans le dépôt (chemin ou glob)" #: ../fdroidserver/deploy.py msgid "The only commands currently supported are 'init' and 'update'" @@ -1787,49 +1779,49 @@ msgstr "Les seules commandes disponibles actuellement sont 'init' et 'update'" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." -msgstr "" +msgstr "L'empreinte du dépôt ne correspond pas." #: ../fdroidserver/common.py msgid "The repository's index could not be verified." -msgstr "" +msgstr "L'index du dépôt n'a pas pu être vérifié." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" -msgstr "" +msgstr "Le dossier racine pour local_copy_dir \"{path}\" n'existe pas !" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" -msgstr "" +msgstr "Il y a une collision de keyalias - publication interrompue" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." -msgstr "" +msgstr "Voici les applications qui ont été archivées à partir du dépôt principal." #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" -msgstr "" +msgstr "Ce dépôt a déjà des méta-données locales : %s" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" -msgstr "" +msgstr "Pour utiliser awsbucket, awssecretkey et awsaccesskeyid doivent aussi être configurées dans config.py !" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" +msgstr "Pour utiliser awsbucket, awssecretkey et awsaccesskeyid doivent aussi être configurées dans config.yml !" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" -msgstr "" +msgstr "L'URL doit commencer par https:// ou http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" -msgstr "" +msgstr "Les raccourcisseurs d'URL ne devraient pas être utilisés" #: ../fdroidserver/metadata.py msgid "URL title is just the URL, use brackets: [URL]" -msgstr "" +msgstr "Le titre de l'URL est juste l'URL, utilisez des crochets : [URL]" #: ../fdroidserver/lint.py #, python-brace-format @@ -1837,13 +1829,12 @@ msgid "URL {url} in Description: {error}" msgstr "" #: ../fdroidserver/lint.py -#, fuzzy msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "Balise de licence non valide \"%s\" ! Utilisez uniquement des balises de https ://spdx.org/license-list" +msgstr "Balise de licence non valide \"{}\" ! Utilisez uniquement des balises approuvées par la FSF ou l'OSI de https ://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "" +msgstr "Balise de licence non valide \"{}\" ! Utilisez uniquement des balises de licence configurées dans votre fichier de configuration" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1853,7 +1844,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "" +msgstr "Entrée {key} inconnue dans {configname}" #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" @@ -1863,12 +1854,12 @@ msgstr "Exception inconnue détectée !" #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" -msgstr "" +msgstr "Fichier '{filename}' inconnu dans la construction '{versionName}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" -msgstr "" +msgstr "Format de méta-données inconnu : %s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1876,13 +1867,13 @@ msgid "Unknown metadata format: {path}" msgstr "Format de métadonnée inconnu : {path}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" -msgstr "Format de métadonnée inconnu : {path}" +msgstr "Format de méta-données inconnu : {path} (utilisez : *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " -msgstr "" +msgstr "Version inconnue de aapt, peut causer des problèmes : " #: ../fdroidserver/lint.py msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" @@ -1899,11 +1890,11 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" -msgstr "" +msgstr "Champ application non reconnu '{fieldname}' dans '{path}'" #: ../fdroidserver/metadata.py msgid "Unrecognised app field: " -msgstr "" +msgstr "Champ application non reconnu : " #: ../fdroidserver/metadata.py #, python-brace-format @@ -1913,60 +1904,60 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised field '{field}' in {linedesc}" -msgstr "" +msgstr "Champ non reconnu '{field}' dans {linedesc}" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" -msgstr "" +msgstr "Type de fichier non pris en charge \"{extension}\" pour graphique de dépôt" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" -msgstr "" +msgstr "Fichier graphique non pris en charge trouvé : {path}" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Unsupported metadata format, use: --to [{supported}]" -msgstr "" +msgstr "Format de méta-données non pris en charge, utilisez --to [{supported}]" #: ../fdroidserver/metadata.py msgid "Unterminated ]" -msgstr "" +msgstr "\"]\" non terminé" #: ../fdroidserver/metadata.py msgid "Unterminated ]]" -msgstr "" +msgstr "\"]]\" non terminé" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unterminated build in {name}" -msgstr "" +msgstr "Construction non terminée dans {name}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unterminated continuation in {name}" -msgstr "" +msgstr "Continuation non terminée dans {name}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" -msgstr "" +msgstr "Extlib non utilisée à %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" -msgstr "" +msgstr "Fichier non utilisé à %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" -msgstr "" +msgstr "Chemin scandelete inutilisé : %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" -msgstr "" +msgstr "Chemin scanignore inutilisé : %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -1987,21 +1978,21 @@ msgstr "Mettre à jour le wiki" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" -msgstr "" +msgstr "UpdateCheckData a une URL invalide : {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" -msgstr "" +msgstr "UpdateCheckData doit utiliser une URL HTTPS : {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" -msgstr "" +msgstr "UpdateCheckData URL non valide : {url}" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" -msgstr "" +msgstr "UpdateCheckMode est configuré mais on dirait que checkupdates n'a pas encore été lancé" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py @@ -2015,12 +2006,12 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" -msgstr "" +msgstr "Téléversement de {apkfilename} vers androidobservatory.org" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Uploading {apkfilename} to virustotal" -msgstr "Lecture de {apkfilename} à partir du cache" +msgstr "Téléversement de {apkfilename} vers virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2059,11 +2050,11 @@ msgstr "Utiliser \"{path}\" pour configurer s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" -msgstr "" +msgstr "Utilisation de la signature d'APK v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" -msgstr "" +msgstr "Utilisation de la signature d'APK v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -2480,13 +2471,13 @@ msgstr "" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option -%s not recognized" -msgstr "La commande '%s 1' n'est pas reconnue" +msgstr "L'option -%s n'est pas reconnue" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py #, python-format msgid "option -%s requires argument" -msgstr "L'option -%s requiert un argument" +msgstr "l'option -%s requiert un argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2504,7 +2495,7 @@ msgstr "option --%s n'est pas un préfixe unique" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s not recognized" -msgstr "Option --%s non reconnue" +msgstr "option --%s non reconnue" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py From ac05799dffc6ffcd7cd0b0932a706573d6dc4c0e Mon Sep 17 00:00:00 2001 From: DGO Date: Fri, 29 Jan 2021 11:52:01 +0100 Subject: [PATCH 0087/2116] Translated using Weblate: French (fr) by DGO Currently translated at 81.4% (479 of 588 strings) Co-authored-by: DGO Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 0c2e0478..2922dad2 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ # Virgile L. , 2020. # Lucas Brizzi , 2020. # Jose , 2020. -# DGO , 2020. +# DGO , 2020, 2021. # Yannick A. , 2020. # Renaud Perrai , 2020. # rational , 2020. @@ -24,7 +24,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-14 19:53+0000\n" -"Last-Translator: hilariousperson \n" +"Last-Translator: DGO \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -1660,7 +1660,7 @@ msgstr "Définir la limite d'échec du nombre de fichiers ouvert : " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" -msgstr "" +msgstr "Définir une timeout de {0} secondes pour cette construction" #: ../fdroidserver/build.py msgid "Setup an emulator, install the APK on it and perform a Drozer scan" From 65c202870d1ad3bc1e4291356d81dae7ce0dae47 Mon Sep 17 00:00:00 2001 From: hilariousperson Date: Fri, 29 Jan 2021 11:52:02 +0100 Subject: [PATCH 0088/2116] Translated using Weblate: French (fr) by hilariousperson Currently translated at 82.8% (487 of 588 strings) Co-authored-by: hilariousperson Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 2922dad2..6d0d3132 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -23,8 +23,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-14 19:53+0000\n" -"Last-Translator: DGO \n" +"PO-Revision-Date: 2021-01-14 20:25+0000\n" +"Last-Translator: hilariousperson \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -1753,7 +1753,7 @@ msgstr "L'horloge système est plus âgée que la date dans {path} !" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." -msgstr "" +msgstr "Mode test - mettre les données dans le dossier tmp uniquement, et toujours construire, même si la sortie existe déjà." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py From ba7e31628c3f071efae197a8e80ec90f4d025c09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89frit?= Date: Fri, 29 Jan 2021 11:52:03 +0100 Subject: [PATCH 0089/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Frenc?= =?UTF-8?q?h=20(fr)=20by=20=C3=89frit=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 82.8% (487 of 588 strings) Co-authored-by: Éfrit Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 6d0d3132..b6a9bd3e 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -24,7 +24,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-14 20:25+0000\n" -"Last-Translator: hilariousperson \n" +"Last-Translator: Éfrit \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -902,9 +902,9 @@ msgid "Found invalid versionCodes for some apps" msgstr "Code de version invalide trouvée pour certaines application" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "Plusieurs certificats signés trouvée dans {path}" +msgstr "Plusieurs fichiers de bloc de signature JAR trouvé à {path}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1642,7 +1642,7 @@ msgstr "Réglez l'horloge à cette heure à l'aide de :" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "" +msgstr "Régler le maximum de versions dans le dépôt avant que les plus anciennes soient archivées" #: ../fdroidserver/build.py #, python-brace-format @@ -1667,7 +1667,7 @@ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "Installez un émulateur, installez l'APK dessus et effectuez un scan Drozer" msgid "Setup an emulator, install the apk on it and perform a drozer scan" -msgstr "" +msgstr "Met en place un émulateur, y installe l’APK et réalise un scan drozer" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" @@ -1704,11 +1704,11 @@ msgstr "Omission de {appid} : désactivé" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: no builds specified" -msgstr "" +msgstr "Annulation de {appid} : aucun exécutable spécifié" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Specify a local folder to sync the repo to" -msgstr "" +msgstr "Spécifier un dossier local à synchroniser avec le dépôt" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Specify an identity file to provide to SSH for rsyncing" @@ -1720,7 +1720,7 @@ msgstr "Spécifier que l'on tourne sur le serveur de construction" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." -msgstr "" +msgstr "Spécifier le fichier de magasin de clés de débogage à utiliser." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" @@ -1729,7 +1729,7 @@ msgstr "Fournir encore plus d'information que d'habitude" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Striping mystery signature from {apkfilename}" -msgstr "" +msgstr "Suppression de la signature mystère de {apkfilename}" #: ../fdroidserver/nightly.py #, python-brace-format From 83e1d88e837a5dd5803dff65e38e41b8d7527f88 Mon Sep 17 00:00:00 2001 From: hilariousperson Date: Fri, 29 Jan 2021 11:52:03 +0100 Subject: [PATCH 0090/2116] Translated using Weblate: French (fr) by hilariousperson Currently translated at 82.9% (488 of 588 strings) Co-authored-by: hilariousperson Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index b6a9bd3e..ebfea23d 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -23,8 +23,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-14 20:25+0000\n" -"Last-Translator: Éfrit \n" +"PO-Revision-Date: 2021-01-14 20:26+0000\n" +"Last-Translator: hilariousperson \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -1767,7 +1767,7 @@ msgstr "URL de base du dépôt à journaliser (par défaut : https://f-droid.org #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" -msgstr "" +msgstr "Le dossier où écrire le miroir" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" From bc52f9fd3443260d4fcf527a3a97bfa3bdcf979c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89frit?= Date: Fri, 29 Jan 2021 11:52:04 +0100 Subject: [PATCH 0091/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Frenc?= =?UTF-8?q?h=20(fr)=20by=20=C3=89frit=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 82.9% (488 of 588 strings) Translated using Weblate: French (fr) by Éfrit Currently translated at 82.9% (488 of 588 strings) Co-authored-by: Éfrit Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index ebfea23d..f179cc66 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -23,8 +23,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-14 20:26+0000\n" -"Last-Translator: hilariousperson \n" +"PO-Revision-Date: 2021-01-14 21:33+0000\n" +"Last-Translator: Éfrit \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -1753,7 +1753,7 @@ msgstr "L'horloge système est plus âgée que la date dans {path} !" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." -msgstr "Mode test - mettre les données dans le dossier tmp uniquement, et toujours construire, même si la sortie existe déjà." +msgstr "Mode test – mettre la sortie dans le dossier tmp uniquement et toujours compiler, même si la sortie existe déjà." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1767,7 +1767,7 @@ msgstr "URL de base du dépôt à journaliser (par défaut : https://f-droid.org #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" -msgstr "Le dossier où écrire le miroir" +msgstr "Le répertoire dans lequel écrire le miroir" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" From 8828fbd18abe77788723d2e46cb434d3cf1edad3 Mon Sep 17 00:00:00 2001 From: Carlos Date: Fri, 29 Jan 2021 11:52:04 +0100 Subject: [PATCH 0092/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Carlos Currently translated at 34.5% (203 of 588 strings) Co-authored-by: Carlos Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 42 ++++++++++++---------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index f2950631..99277573 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -5,22 +5,24 @@ # Trey Yang , 2020. # taiyuan <1006333969@qq.com>, 2020. # Eric , 2020. +# Carlos , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2020-10-08 06:06+0000\n" -"Last-Translator: Eric \n" +"PO-Revision-Date: 2021-01-14 21:33+0000\n" +"Last-Translator: Carlos \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.3-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py +#, fuzzy msgid "" "\n" " This is a repository of apps to be used with FDroid. Applications in this\n" @@ -29,6 +31,9 @@ msgid "" " tools on https://gitlab.com/fdroid.\n" " " msgstr "" +"\n" +" 这是一个用于 FDroid 的应用储存库。该库中的应用是由原始应用开发者构建的官方二进制文件,或者是由 f-droid.org 使用 https://gitlab.com/fdroid 上的工具从源头构建的二进制文件。\n" +" " #: ../fdroidserver/nightly.py msgid "" @@ -93,7 +98,7 @@ msgstr "\"{path}\" 不是可接受的格式, 需转换成 : {formats}" #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" -msgstr "" +msgstr "\"{url}\" 不是有效的网址!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -121,7 +126,7 @@ msgstr "发现 %d 个问题" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "%prog [options]" -msgstr "100%prog [选项]" +msgstr "%prog [选项]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -151,7 +156,7 @@ msgstr "config.py中找不到'keypass'!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" +msgstr "'keystore' 没有赋值,'smartcardoptions' 为空!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystore' not found in config.py!" @@ -366,12 +371,12 @@ msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "" +msgstr "分支 '{branch}' 在构建 '{versionName}' 时被用作相应的 commit" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" -msgstr "" +msgstr "分支 '{branch}' 在源码库 '{srclib}' 里被用作相应的 commit" #: ../fdroidserver/update.py #, python-brace-format @@ -388,7 +393,7 @@ msgstr "编译全部可用应用程序" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" -msgstr "" +msgstr "由 `fdroid import` 生成的 build ——一旦准备就绪将删除禁用行" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" @@ -404,14 +409,15 @@ msgid "Build should have comma-separated versionName and versionCode, not \"{val msgstr "" #: ../fdroidserver/init.py -#, python-format +#, fuzzy, python-format msgid "Built repo based in \"%s\" with this config:" -msgstr "" +msgstr "使用此配置并基于 \"%s\" 的构建储存库:" #: ../fdroidserver/build.py +#, fuzzy msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" -msgstr[0] "" +msgstr[0] "在扫描时因 {} 错误而无法构建" #: ../fdroidserver/vmtools.py #, python-brace-format @@ -431,7 +437,7 @@ msgstr "" #: ../fdroidserver/rewritemeta.py msgid "Cannot use --list and --to at the same time" -msgstr "" +msgstr "不能同时使用 --list 与 --to" #: ../fdroidserver/metadata.py #, python-brace-format @@ -445,7 +451,7 @@ msgstr "" #: ../fdroidserver/lint.py msgid "Categories are not set" -msgstr "" +msgstr "没有设置类别" #: ../fdroid ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -497,7 +503,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" -msgstr "" +msgstr "在您的系统中无法找到 '{command}'" #: ../fdroidserver/import.py msgid "Could not find latest version code" @@ -534,16 +540,16 @@ msgstr "找不到应用程序ID" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" -msgstr "" +msgstr "找不到最新的版本代码" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import.py msgid "Couldn't find latest version name" -msgstr "" +msgstr "找不到最新的版本名" #: ../fdroidserver/import.py msgid "Couldn't find package ID" -msgstr "" +msgstr "找不到安装包 ID" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" From b9d737aa5e7adcf190d814230b7a74d316bb1a61 Mon Sep 17 00:00:00 2001 From: cheese1 Date: Fri, 29 Jan 2021 11:52:04 +0100 Subject: [PATCH 0093/2116] Translated using Weblate: German (de) by cheese1 Currently translated at 90.4% (532 of 588 strings) Co-authored-by: cheese1 Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 28 ++++++++++++--------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 66a5ab90..dacece32 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -6,13 +6,14 @@ # marzzzello , 2020. # Hans-Christoph Steiner , 2020, 2021. # Predatorix Phoenix , 2021. +# cheese1 , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-14 14:58+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2021-01-14 21:33+0000\n" +"Last-Translator: cheese1 \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -70,7 +71,7 @@ msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" besitzt keine zugehörige Metadaten-Datei!" #: ../fdroidserver/install.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "'{apkfilename}' ist auf {dev} bereits installiert." @@ -155,9 +156,8 @@ msgid "'keypass' not found in config.py!" msgstr "„keypass” nicht in config.py vorhanden!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keypass' not found in config.yml!" -msgstr "„keypass” nicht in config.py vorhanden!" +msgstr "„keypass” nicht in config.yml vorhanden!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" @@ -168,27 +168,24 @@ msgid "'keystore' not found in config.py!" msgstr "„keystore” nicht in config.py vorhanden!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystore' not found in config.yml!" -msgstr "„keystore” nicht in config.py vorhanden!" +msgstr "„keystore” nicht in config.yml vorhanden!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "„keystorepass” nicht in config.py vorhanden!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystorepass' not found in config.yml!" -msgstr "„keystorepass” nicht in config.py vorhanden!" +msgstr "„keystorepass” nicht in config.yml vorhanden!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "„repo_keyalias” nicht in config.py vorhanden!" #: ../fdroidserver/common.py -#, fuzzy msgid "'repo_keyalias' not found in config.yml!" -msgstr "„repo_keyalias” nicht in config.py vorhanden!" +msgstr "„repo_keyalias” nicht in config.yml vorhanden!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -200,9 +197,8 @@ msgid "'sdk_path' not set in 'config.py'!" msgstr "Kein 'sdk_path' in 'config.py' festgelegt!" #: ../fdroidserver/common.py -#, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "Kein 'sdk_path' in 'config.py' festgelegt!" +msgstr "Kein 'sdk_path' in 'config.yml' festgelegt!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -503,7 +499,7 @@ msgstr "Widersprüchliche Argumente: '--verbose' und '--quiet' können nicht gle #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "Konflikt in der Konfiguration. Verwende {newfile}, ignoriere {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format @@ -526,9 +522,9 @@ msgid "Could not find {path} to remove it" msgstr "{path} konnte nicht gefunden werden, um ihn zu entfernen" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "Konnte APK-Datei nicht für Analyse öffnen" +msgstr "Konnte APK-Datei {path} nicht für Analyse öffnen " #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" From c8d1ffa9eaccb1c21a82b216f1917c15f9826bf8 Mon Sep 17 00:00:00 2001 From: R_SACI Date: Fri, 29 Jan 2021 11:52:06 +0100 Subject: [PATCH 0094/2116] Translated using Weblate: Kabyle (kab) by R_SACI Currently translated at 12.0% (71 of 588 strings) Translated using Weblate: Kabyle (kab) by R_SACI Currently translated at 9.6% (57 of 588 strings) Co-authored-by: R_SACI Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/kab/ Translation: F-Droid/F-Droid Server --- locale/kab/LC_MESSAGES/fdroidserver.po | 50 ++++++++++++-------------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index 4556a8b0..3634109b 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -2,13 +2,14 @@ # Copyright (C) YEAR Free Software Foundation, Inc. # Hans-Christoph Steiner , 2020, 2021. # Kahina Messaoudi , 2020. +# R_SACI , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-14 14:58+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2021-01-15 13:25+0000\n" +"Last-Translator: R_SACI \n" "Language-Team: Kabyle \n" "Language: kab\n" "MIME-Version: 1.0\n" @@ -52,9 +53,9 @@ msgid "\"%s/\" has no matching metadata file!" msgstr "" #: ../fdroidserver/install.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "'{apkfilename}' yebded yakan ɣef {dev}." +msgstr "\"{apkfilename}\" yebded yakan ɣef {dev}." #: ../fdroidserver/update.py #, python-brace-format @@ -103,7 +104,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" -msgstr "" +msgstr "%(prog)s: tuccḍa: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format @@ -113,7 +114,7 @@ msgstr "%d n wuguren ttwafen" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "%prog [options]" -msgstr "" +msgstr "%prog [d afrayan]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -137,9 +138,8 @@ msgid "'keypass' not found in config.py!" msgstr "'keypass' ulac-it di config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keypass' not found in config.yml!" -msgstr "'keypass' ulac-it di config.py!" +msgstr "'keypass' ulac-it di config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" @@ -150,27 +150,24 @@ msgid "'keystore' not found in config.py!" msgstr "'keystore' ulac-it di config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystore' not found in config.yml!" -msgstr "'keystore' ulac-it di config.py!" +msgstr "'keystore' ulac-it di config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "'keystorepass' ulac-it di config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' ulac-it di config.py!" +msgstr "'keystorepass' ulac-it di config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "'repo_keyalias' ulac-it deg config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' ulac-it deg config.py!" +msgstr "'repo_keyalias' ulac-it deg config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -182,9 +179,8 @@ msgid "'sdk_path' not set in 'config.py'!" msgstr "'sdk_path' ur yettwasbadu ara 'config.py'!" #: ../fdroidserver/common.py -#, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "'sdk_path' ur yettwasbadu ara 'config.py'!" +msgstr "'sdk_path' ur yettwasbadu ara 'config.yml'!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -472,7 +468,7 @@ msgstr "Tabdart n taggayin i yebḍan s ticcert." #: ../fdroid ../fdroidserver/__main__.py #, c-format, python-format msgid "Command '%s' not recognised.\n" -msgstr "" +msgstr "Taladna '%s' ur tettwassen ara.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" @@ -506,9 +502,9 @@ msgid "Could not find {path} to remove it" msgstr "" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "Ur yezmir ara a d-ildi afaylu apk i tesleḍt" +msgstr "Ur yezmir ara ad d-yeldi afaylu apk {path} i tesleḍt: " #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" @@ -1012,7 +1008,7 @@ msgid "Install built packages on devices" msgstr "" #: ../fdroidserver/install.py -#, fuzzy, python-format +#, python-format msgid "Installing %s..." msgstr "Asbeddi n %s…" @@ -1045,9 +1041,9 @@ msgid "Invalid VercodeOperation: {field}" msgstr "" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid application ID {appid}" -msgstr "ulac \"tignit\" deg {appid}" +msgstr "Asulay n usnas d arameɣtu {appid}" #: ../fdroidserver/metadata.py #, python-format @@ -1356,7 +1352,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "Options" -msgstr "Iɣewwaren" +msgstr "Tixtiṛiyin" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." @@ -1821,7 +1817,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" -msgstr "" +msgstr "Tettwaf tsureft d tarussint!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py @@ -1995,7 +1991,7 @@ msgstr "Aseqdec" #: /usr/lib/python3.7/optparse.py #, python-format msgid "Usage: %s\n" -msgstr "" +msgstr "Aseqdec: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" @@ -2441,13 +2437,13 @@ msgstr "" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option -%s not recognized" -msgstr "" +msgstr "Taxtiṛt -%s ur tettwassen ara" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py #, python-format msgid "option -%s requires argument" -msgstr "" +msgstr "Taxtiṛt -%s yesra afakul" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py From dcf035bb0b5fd62b38fa12bd951208c040fbff2b Mon Sep 17 00:00:00 2001 From: Eric Date: Fri, 29 Jan 2021 11:52:07 +0100 Subject: [PATCH 0095/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Eric Currently translated at 36.0% (212 of 588 strings) Co-authored-by: Eric Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 42 ++++++++++------------ 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 99277573..bc65ef32 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -4,15 +4,15 @@ # ERDwaYbR , 2020. # Trey Yang , 2020. # taiyuan <1006333969@qq.com>, 2020. -# Eric , 2020. +# Eric , 2020, 2021. # Carlos , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-14 21:33+0000\n" -"Last-Translator: Carlos \n" +"PO-Revision-Date: 2021-01-15 13:24+0000\n" +"Last-Translator: Eric \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" @@ -22,7 +22,6 @@ msgstr "" "X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py -#, fuzzy msgid "" "\n" " This is a repository of apps to be used with FDroid. Applications in this\n" @@ -32,7 +31,10 @@ msgid "" " " msgstr "" "\n" -" 这是一个用于 FDroid 的应用储存库。该库中的应用是由原始应用开发者构建的官方二进制文件,或者是由 f-droid.org 使用 https://gitlab.com/fdroid 上的工具从源头构建的二进制文件。\n" +" 这是一个与FDroid一起使用的应用程序的仓库。这个仓库中的应用程序\n" +" 要么是原应用程序开发者构建的官方二进制文件,要么是f-droid.org使用\n" +" https://gitlab.com/fdroid上的工具从源代码构建而来的\n" +" 二进制文件。\n" " " #: ../fdroidserver/nightly.py @@ -150,9 +152,8 @@ msgid "'keypass' not found in config.py!" msgstr "config.py中找不到'keypass'!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keypass' not found in config.yml!" -msgstr "config.py中找不到'keypass'!" +msgstr "config.yml 中找不到 'keypass'!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" @@ -163,27 +164,24 @@ msgid "'keystore' not found in config.py!" msgstr "config.py中找不到'keypass'!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystore' not found in config.yml!" -msgstr "config.py中找不到'keypass'!" +msgstr "config.yml 中找不到'keystore'!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "config.py中找不到'keystorepass'!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystorepass' not found in config.yml!" -msgstr "config.py中找不到'keystorepass'!" +msgstr "config.yml 中找不到 'keystorepass'!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "config.py中找不到'repo_keyalias'!" #: ../fdroidserver/common.py -#, fuzzy msgid "'repo_keyalias' not found in config.yml!" -msgstr "config.py中找不到'repo_keyalias'!" +msgstr "config.yml 中找不到'repo_keyalias'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -195,9 +193,8 @@ msgid "'sdk_path' not set in 'config.py'!" msgstr "未在“ config.py”中设置“ sdk_path”!" #: ../fdroidserver/common.py -#, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "未在“ config.py”中设置“ sdk_path”!" +msgstr "config.yml 中未设置'sdk_path'!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -314,9 +311,9 @@ msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "Android SDK‘{path}’未安装‘{dirname}’!" #: ../fdroidserver/init.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "未找到 Android SDK!" +msgstr "未在 {path} 中找到 Android SDK!" #: ../fdroidserver/common.py msgid "Android SDK not found!" @@ -333,9 +330,9 @@ msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK路径'{path}'不是目录!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "未找到 Android SDK!" +msgstr "找到了 Android SDK 工具{cmd}!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -409,15 +406,14 @@ msgid "Build should have comma-separated versionName and versionCode, not \"{val msgstr "" #: ../fdroidserver/init.py -#, fuzzy, python-format +#, python-format msgid "Built repo based in \"%s\" with this config:" -msgstr "使用此配置并基于 \"%s\" 的构建储存库:" +msgstr "" #: ../fdroidserver/build.py -#, fuzzy msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" -msgstr[0] "在扫描时因 {} 错误而无法构建" +msgstr[0] "因扫描时的{}错误而无法构建" #: ../fdroidserver/vmtools.py #, python-brace-format From a9d45671c7b7f943a4f748f421064c8e48ee0120 Mon Sep 17 00:00:00 2001 From: Fioddor Superconcentrado Date: Fri, 29 Jan 2021 11:52:07 +0100 Subject: [PATCH 0096/2116] Translated using Weblate: Spanish (es) by Fioddor Superconcentrado Currently translated at 99.8% (587 of 588 strings) Co-authored-by: Fioddor Superconcentrado Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ Translation: F-Droid/F-Droid Server --- locale/es/LC_MESSAGES/fdroidserver.po | 568 +++++++++++++------------- 1 file changed, 276 insertions(+), 292 deletions(-) diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index e8791ad7..3b74eefe 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -5,13 +5,14 @@ # Jo , 2020. # Hans-Christoph Steiner , 2020, 2021. # Alvaro , 2020. +# Fioddor Superconcentrado , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-14 14:58+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2021-01-15 13:24+0000\n" +"Last-Translator: Fioddor Superconcentrado \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" @@ -21,7 +22,6 @@ msgstr "" "X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py -#, fuzzy msgid "" "\n" " This is a repository of apps to be used with FDroid. Applications in this\n" @@ -33,8 +33,8 @@ msgstr "" "\n" " Este es un repositorio de aplicaciones para usar con FDroid. Las aplicaciones en este\n" " repositorio son binarios oficiales construidos por los desarrolladores originales de la \n" -" aplicación, o son binarios creados a partir de la fuente por f-droid.org utilizando las\n" -" herramientas en https://gitlab.com/fdroid.\n" +" aplicación, o son binarios creados a partir de su código fuente por f-droid.org \n" +" utilizando las herramientas de https://gitlab.com/fdroid.\n" " " #: ../fdroidserver/nightly.py @@ -69,9 +69,9 @@ msgid "\"%s/\" has no matching metadata file!" msgstr "¡\"%s/\" no tiene su correspondiente fichero de metadatos!" #: ../fdroidserver/install.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "'{apkfilename}' ya está instalado en {dev}." +msgstr "\"{apkfilename}\" ya está instalado en {dev}." #: ../fdroidserver/update.py #, python-brace-format @@ -154,40 +154,36 @@ msgid "'keypass' not found in config.py!" msgstr "¡'keypass' no encontrado en config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keypass' not found in config.yml!" -msgstr "¡'keypass' no encontrado en config.py!" +msgstr "¡'keypass' no encontrado en config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" +msgstr "¡\"keystore\" es NONE y \"smartcardoptions\" está vacío!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystore' not found in config.py!" msgstr "¡'keystore' no encontrado en config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystore' not found in config.yml!" -msgstr "¡'keystore' no encontrado en config.py!" +msgstr "¡'keystore' no encontrado en config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "¡'keystorepass' no encontrado en config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystorepass' not found in config.yml!" -msgstr "¡'keystorepass' no encontrado en config.py!" +msgstr "¡'keystorepass' no encontrado en config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "¡'repo_keyalias' no encontrado en config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'repo_keyalias' not found in config.yml!" -msgstr "¡'repo_keyalias' no encontrado en config.py!" +msgstr "¡'repo_keyalias' no encontrado en config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -199,9 +195,8 @@ msgid "'sdk_path' not set in 'config.py'!" msgstr "¡'sdk_path' no establecido en 'config.py'!" #: ../fdroidserver/common.py -#, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "¡'sdk_path' no establecido en 'config.py'!" +msgstr "¡'sdk_path' no establecido en 'config.yml'!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -302,7 +297,7 @@ msgstr "También advierta sobre problemas de formato, como r rewritemeta-l" #: ../fdroidserver/scanner.py msgid "Android AAR library" -msgstr "" +msgstr "Biblioteca AAR para Android" #: ../fdroidserver/scanner.py msgid "Android APK file" @@ -310,7 +305,7 @@ msgstr "Fichero APK de Android" #: ../fdroidserver/scanner.py msgid "Android DEX code" -msgstr "" +msgstr "Código DEX en Android" #: ../fdroidserver/common.py ../fdroidserver/build.py #, python-brace-format @@ -318,9 +313,9 @@ msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "¡El SDK de Android '{path}' no tiene '{dirname}' instalado!" #: ../fdroidserver/init.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "¡No se encontró el SDK de Android!" +msgstr "¡No se encontró el SDK de Android en {path}!" #: ../fdroidserver/common.py msgid "Android SDK not found!" @@ -337,9 +332,9 @@ msgid "Android SDK path '{path}' is not a directory!" msgstr "¡La ruta al SDK de Android '{path}' no es un directorio!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "¡No se encontró el SDK de Android!" +msgstr "¡Se encontró la herramienta de desarrollo (SDK) {cmd}!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -385,7 +380,7 @@ msgstr "Rama '{branch}' usada como \"commit\" en srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" -msgstr "" +msgstr "Enlace simbólico roto: {path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Build a package from source" @@ -430,14 +425,14 @@ msgstr "¡No se puede leer \"{path}\"!" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Cannot resolve application ID {appid}" msgstr "No se puede resolver el identificador de aplicación {appid}" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" -msgstr "" +msgstr "No se puede reescribir \"{path}\"" #: ../fdroidserver/rewritemeta.py msgid "Cannot use --list and --to at the same time" @@ -497,12 +492,12 @@ msgstr "Aplicar cambios" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." -msgstr "" +msgstr "Argumentos incompatibles: No se puede especificar \"--verbose\" y \"--quiet\" a la vez." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "¡Conflicto de ficheros de configuración! Usando {newfile}, ignorando {oldfile}." #: ../fdroidserver/common.py #, python-brace-format @@ -510,14 +505,12 @@ msgid "Could not find '{command}' on your system" msgstr "No se pudo encontrar '{command}' en el sistema" #: ../fdroidserver/import.py -#, fuzzy msgid "Could not find latest version code" -msgstr "No se ha podido encontrar el último código de versión" +msgstr "No se pudo encontrar el último código de versión" #: ../fdroidserver/import.py -#, fuzzy msgid "Could not find latest version name" -msgstr "No se ha podido encontrar el último nombre de versión" +msgstr "No se pudo encontrar el último nombre de versión" #: ../fdroidserver/update.py #, python-brace-format @@ -525,9 +518,9 @@ msgid "Could not find {path} to remove it" msgstr "No se pudo encontrar {path} para eliminarlo" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "No se ha podido abrir el archivo apk para analizarlo" +msgstr "No se pudo abrir el archivo apk {path} para analizarlo: " #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" @@ -536,13 +529,12 @@ msgstr "No se ha podido abrir el archivo apk para analizarlo" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" -msgstr "" +msgstr "No se puede procesar el tamaño \"{size}\", tipo erróneo \"{type}\"" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/import.py -#, fuzzy msgid "Couldn't find Application ID" -msgstr "No se ha podido encontrar el identificador de paquete" +msgstr "No se pudo encontrar el identificador de aplicación" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py @@ -622,12 +614,12 @@ msgstr "Borrar del repositorio archivos APK y/o OBB sin metadatos" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "" +msgstr "Borrando archivo, el repositorio es demasiado grande ({size} vs. {limit} máximo)" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "" +msgstr "Borrando la historia del repositorio git espejo, el repositorio es demasiado grande({size} vs. {limit} máximo)" #: ../fdroidserver/update.py #, python-brace-format @@ -655,7 +647,7 @@ msgstr "La descripción de longitud {length} supera el límite de caracteres, {l #: ../fdroidserver/import.py msgid "Do not add 'disable:' to the generated build entries" -msgstr "" +msgstr "No agregar 'disable:' a las entradas de compilaciones generadas" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" @@ -724,7 +716,7 @@ msgstr "Ejecutar Fdroid dscanner de una aplicación APK, previamente construída #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" +msgstr "ERROR: ¡El subcomando \"server\" se ha eliminado. Use \"deploy\"!" #: ../fdroidserver/mirror.py msgid "" @@ -746,7 +738,7 @@ msgstr "Bandera de compilación vacía en {linedesc}" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "" +msgstr "La codificación establecida es '{enc}'. fdroid podría sufrir problemas de codificación. Por favor establecerla a 'UTF-8' para resultados óptimos." #: ../fdroidserver/init.py #, python-format @@ -760,7 +752,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "¡La variable de entorno {var} de {configname} no tiene valor asignado!" #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py @@ -777,9 +769,9 @@ msgid "Extract signatures from APKs" msgstr "Extraer firmas de APKs" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Failed copying {path}: {error}" -msgstr "Fallo al leer {path}: {error}" +msgstr "Fallo copiando {path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format @@ -838,14 +830,14 @@ msgid "Fetched buildserverid from VM: {buildserverid}" msgstr "Buildserverid obtenido de la VM: {buildserverid}" #: ../fdroidserver/signatures.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "Firmas obtenidas para '{apkfilename}'-> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" -msgstr "" +msgstr "El archivo desapareció al procesarlo: {path}" #: ../fdroidserver/verify.py ../fdroidserver/stats.py ../fdroidserver/update.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/build.py @@ -859,9 +851,8 @@ msgid "Flattr donation methods belong in the FlattrID flag" msgstr "Los métodos de donación de Flattr deben ir en el flag FlattrID" #: ../fdroidserver/lint.py -#, fuzzy msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Los métodos de donación de Liberapay pertenecen a la bandera de LiberapayID" +msgstr "Los métodos de donación de Flattr pertenecen al FlattrID: field" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" @@ -874,35 +865,35 @@ msgstr "Forzar la creación de compilaciones deshabilitadas, independientemente #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" -msgstr "" +msgstr "¡Forzar la suspensión de la compilación tras {0} segundos!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." -msgstr "" +msgstr "Forzar el escaneo de aplicaciones y compilaciones deshabilitadas." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" -msgstr "" +msgstr "¡Se encontró la gráfica \"{path}\" sin metadatos para la aplicación \"{name}\"!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" -msgstr "" +msgstr "Se encontró archivo de financiación \"{path}\" para \"{name}\":" #: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" -msgstr "" +msgstr "Se encontraron identificadores de aplicaciones inválidos en los argumentos" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" -msgstr "" +msgstr "Se encontraron códigos de versión (versionCodes) inválidos para algunas aplicaciones" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "Encontrados varios certificados de firma en {path}" +msgstr "Encontrados varios ficheros de bloque de firma JAR en {path}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -925,12 +916,12 @@ msgstr "Ningún certificado de firma encontrado para el repositorio." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" -msgstr "" +msgstr "Se encontró algo que no es un fichero en %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" -msgstr "" +msgstr "Se encontró {apkfilename} en {url}" #: ../fdroidserver/update.py #, python-brace-format @@ -940,7 +931,7 @@ msgstr "Creada la estructura de metadatos para {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" -msgstr "" +msgstr "Falló el checkout Git de '%s'" #: ../fdroidserver/common.py msgid "Git clean failed" @@ -952,7 +943,7 @@ msgstr "Git fetch falló" #: ../fdroidserver/common.py msgid "Git remote set-head failed" -msgstr "" +msgstr "Falló el remote set-head de Git" #: ../fdroidserver/common.py #, python-format @@ -977,22 +968,22 @@ msgstr "¡Se debe usar HTTPS con URLs de Subversion!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "" +msgstr "Si un repositorio espejo git crece mucho, permitir borrar el archivo" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "" +msgstr "Si esta carga falla, prueba cargarlo manualmente a {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "" +msgstr "Ignorando '{field}' en medatos '{metapath}' por obsoleto." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" -msgstr "" +msgstr "Ignorando entrada en FUNDING.yml mayor de 2048: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1001,7 +992,7 @@ msgstr "Ignorando paquete sin metadatos: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" -msgstr "" +msgstr "Ignorando datos de cache atascada para {apkfilename}" #: ../fdroidserver/rewritemeta.py #, python-brace-format @@ -1014,15 +1005,15 @@ msgstr "Incluir APKs que están firmados con algoritmos deshabilitados como MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" -msgstr "" +msgstr "Incluir los archivos .asc de firma PGP en el espejo" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" -msgstr "" +msgstr "Incluir las bitácoras de compilación en el repositorio espejo" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" -msgstr "" +msgstr "Incluir en el espejo los archivos tarball de código fuente" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1037,7 +1028,7 @@ msgid "Install built packages on devices" msgstr "Instalar paquetes constuídos en el dispositivo" #: ../fdroidserver/install.py -#, fuzzy, python-format +#, python-format msgid "Installing %s..." msgstr "Instalando %s…" @@ -1047,7 +1038,7 @@ msgid "Installing %s…" msgstr "Instalando %s…" #: ../fdroidserver/install.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "Instalando '{apkfilename}' en {dev}…" @@ -1067,12 +1058,12 @@ msgstr "APK no válido" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" -msgstr "" +msgstr "VercodeOperation no válida: {field}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" -msgstr "" +msgstr "ID de aplicación inválido {appid}" #: ../fdroidserver/metadata.py #, python-format @@ -1082,12 +1073,12 @@ msgstr "Valor booleano no válido '%s'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid build flag at {line} in {linedesc}" -msgstr "" +msgstr "Bandera de compilación no válida en {line} en {linedesc}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid build format: {value} in {name}" -msgstr "" +msgstr "Formato de compilación no válido: {value} en {name}" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" @@ -1096,7 +1087,7 @@ msgstr "Lista no numerada no válida" #: ../fdroidserver/lint.py #, python-format msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" -msgstr "" +msgstr "¡La etiqueta de licencia \"%s\" no es válida! Use solo etiquetas de https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" @@ -1129,17 +1120,17 @@ msgstr "Redirección no válida a no HTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" -msgstr "" +msgstr "Metadato scrlib inválido: '{file}' no existe" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" -msgstr "" +msgstr "Metadato scrlib no válido: no se pudo procesar '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "" +msgstr "Metadato scrlib no válido: clave desconocida '{key}' en el archivo '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1158,7 +1149,7 @@ msgstr "Firma JAR verificada: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" -msgstr "" +msgstr "Archivo java JAR" #: ../fdroidserver/publish.py ../fdroidserver/update.py #: ../fdroidserver/mirror.py @@ -1167,7 +1158,7 @@ msgstr "¡No se encontró Java JDK! ¡Instale en una ubicación estándar o esta #: ../fdroidserver/scanner.py msgid "Java compiled class" -msgstr "" +msgstr "Clase compilada java" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" @@ -1182,14 +1173,13 @@ msgid "Keystore for signing key:\t" msgstr "Depósito de claves para la clave de firma de repositorio:\t" #: ../fdroidserver/lint.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "La última confirmación utilizada '{commit}' parece una etiqueta, pero Update Check Mode es '{ucm}'" #: ../fdroidserver/lint.py -#, fuzzy msgid "Liberapay donation methods belong in the Liberapay: field" -msgstr "Los métodos de donación de Liberapay pertenecen a la bandera de LiberapayID" +msgstr "Los métodos de donación de Liberapay pertenecen al Liberapay: field" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the LiberapayID flag" @@ -1201,7 +1191,7 @@ msgstr "Lista de archivos que se reformatearán" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" -msgstr "" +msgstr "Locale incluída en la URL de f-droid.org" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" @@ -1217,7 +1207,7 @@ msgstr "Línea serverwebroot mal formada:" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." -msgstr "" +msgstr "Crea un espejo completo del repositorio y del archivo, todos los tipos de fichero." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" @@ -1250,9 +1240,8 @@ msgid "No commit specified for {versionName} in {linedesc}" msgstr "No se ha especificado ninguna confirmación para {versionName} en {linedesc}" #: ../fdroidserver/common.py -#, fuzzy msgid "No config.yml found, using defaults." -msgstr "No se encontró 'config.py', se usarán los valores predeterminados." +msgstr "No se encontró 'config.yml'. Se usarán los valores predeterminados." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1263,9 +1252,8 @@ msgid "No git submodules available" msgstr "No hay git submodules disponibles" #: ../fdroidserver/import.py -#, fuzzy msgid "No gradle project could be found. Specify --subdir?" -msgstr "No se ha encontrado proyecto android o kivy. ¿Especifique --subdir?" +msgstr "No se encontró ningún proyecto gradle. ¿Quizá quiera especificar --subdir?" #: ../fdroidserver/import.py ../fdroidserver/common.py msgid "No information found." @@ -1318,7 +1306,7 @@ msgstr "No hay directorio sin firma - nada que hacer" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" -msgstr "" +msgstr "No es una definición válida del tamaño: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" @@ -1334,9 +1322,8 @@ msgid "Now set these in config.py:" msgstr "Ahora establezca lo siguiente en config.py:" #: ../fdroidserver/init.py -#, fuzzy msgid "Now set these in config.yml:" -msgstr "Ahora establezca lo siguiente en config.py:" +msgstr "Ahora establezcalos en config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1354,12 +1341,12 @@ msgstr "El nombre de paquete de OBB no coincide con un APK soportado:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" +msgstr "Maquina desconectada. Saltando la generación del repositorio espejo git hasta`fdroid deploy`" #: ../fdroidserver/common.py #, python-brace-format msgid "Old APK signature failed to verify: {path}" -msgstr "" +msgstr "Falló la verificación de la firma APK antigua: {path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Old, deprecated name for fdroid deploy" @@ -1379,9 +1366,8 @@ msgid "Only process apps with auto-updates" msgstr "Solo procesar aplicaciones con actualizaciones automáticas" #: ../fdroidserver/lint.py -#, fuzzy msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "Los métodos de donación de Liberapay pertenecen a la bandera de LiberapayID" +msgstr "Los métodos de donación de OpenCollective pertenecen al OpenCollective: field" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -1390,17 +1376,17 @@ msgstr "Opciones" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." -msgstr "" +msgstr "Sacar el informe JSON a un fichero nombrado según el APK." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." -msgstr "" +msgstr "Sacar JSON a stdout." #: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py #: ../fdroidserver/update.py ../fdroidserver/signindex.py #: ../fdroidserver/checkupdates.py msgid "Outputting JSON" -msgstr "" +msgstr "Sacando JSON" #: ../fdroidserver/import.py msgid "Overall license of the project." @@ -1418,12 +1404,12 @@ msgstr "Sobrescribir versionName vacío en {apkfilename} con el de los metadatos #: ../fdroidserver/import.py #, python-brace-format msgid "Package \"{appid}\" already exists" -msgstr "" +msgstr "El paquete \"{appid}\" ya existe" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" -msgstr "" +msgstr "Procesando el manifiesto en '{path}'" #: ../fdroidserver/common.py msgid "Password required with username" @@ -1524,7 +1510,7 @@ msgstr "Leer todos los archivos de metadatos y salir" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" -msgstr "" +msgstr "Leyendo '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format @@ -1541,7 +1527,7 @@ msgstr "Falló lectura de packageName/versionCode/versionName, APK inválida: '{ #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" -msgstr "" +msgstr "Leyendo {apkfilename} desde caché" #: ../fdroidserver/stats.py msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." @@ -1592,11 +1578,11 @@ msgstr "Reescribiendo '{appid}'" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}' to '{path}'" -msgstr "" +msgstr "Reescribiendo '{appid}' en '{path}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" -msgstr "" +msgstr "Ejecutar en repositorio git con cambios pendientes" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1604,7 +1590,7 @@ msgstr "Ejecutar rewritemeta para arreglar el formato" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Running first pass with MD5 checking disabled" -msgstr "" +msgstr "Ejecutando la primera iteración con la comprobación de MD5 deshabilitada" #: ../fdroidserver/mirror.py #, python-brace-format @@ -1617,7 +1603,7 @@ msgstr "Escanear solo la última versión de cada paquete" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "" +msgstr "Escaneando los APK(s) resultantes en busca de clases no libres conocidas." #: ../fdroid ../fdroidserver/__main__.py msgid "Scan the source code of a package" @@ -1626,12 +1612,12 @@ msgstr "Escanear el código fuente de un paquete" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" -msgstr "" +msgstr "El escáner encontró {count} problemas en {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" -msgstr "" +msgstr "El escáner encontró {count} problemas en {appid}:{versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" @@ -1641,20 +1627,20 @@ msgstr[1] "El escáner encontró {} problemas" #: ../fdroidserver/common.py msgid "Set clock to that time using:" -msgstr "" +msgstr "Ajustar el reloj a esa hora usando:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "" +msgstr "Establecer la cantidad máxima de lanzamientos antes de que los anteriores sean archivados" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" -msgstr "" +msgstr "Establecer el límite de ficheros abiertos a {integer}" #: ../fdroid ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" -msgstr "" +msgstr "Configurar una compilación de app para un repositorio de compilación nocturna" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " @@ -1663,7 +1649,7 @@ msgstr "Configuración fallida de límite de apertura de archivo: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" -msgstr "" +msgstr "Estableciendo un máximo de {0} segundos para esta compilación" #: ../fdroidserver/build.py msgid "Setup an emulator, install the APK on it and perform a Drozer scan" @@ -1687,17 +1673,17 @@ msgstr "Omitir el escaneo del código fuente por problemas binarios u otros prob #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" -msgstr "" +msgstr "¡Ignorando '{apkfilename}' por firma no válida!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" -msgstr "" +msgstr "Saltando la generación de índices para {appid}" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" -msgstr "" +msgstr "¡Ignorando {apkfilename} por firma no válida!" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1707,7 +1693,7 @@ msgstr "Saltando {appid}: desactivado" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: no builds specified" -msgstr "" +msgstr "Ignorando a {appid}: No se especifican compilaciones" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Specify a local folder to sync the repo to" @@ -1723,7 +1709,7 @@ msgstr "Especificar que estamos ejecutando en el servidor de compilación" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." -msgstr "" +msgstr "Especifique qué fichero de almacenamiento de claves usar para depuración." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" @@ -1732,12 +1718,12 @@ msgstr "Diseminar más información de lo normal" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Striping mystery signature from {apkfilename}" -msgstr "" +msgstr "Quitando firma misteriosa de {apkfilename}" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" -msgstr "" +msgstr "Quitando firma misteriosa de {apkfilename}" #: ../fdroidserver/lint.py #, python-format @@ -1747,12 +1733,12 @@ msgstr "Resúmen '%s' es sólo el nombre de la app" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" -msgstr "" +msgstr "El resumen de longitud {length} supera el límite de {limit} caracteres" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" -msgstr "" +msgstr "¡El fecha del sistema es anterior a la de {path}!" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." @@ -1762,7 +1748,7 @@ msgstr "Modo de prueba: ponga la salida solo en el directorio tmp y siga desarro #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" -msgstr "" +msgstr "El código de versión OBB tiene que venir tras \"{name}.\":" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" @@ -1770,11 +1756,11 @@ msgstr "El URL base para el registro del repositorio (por defecto: https://f-dro #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" -msgstr "" +msgstr "El directorio al que escribir el espejo" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" -msgstr "" +msgstr "El fichero a incluír en el repositorio (ruta o glob)" #: ../fdroidserver/deploy.py msgid "The only commands currently supported are 'init' and 'update'" @@ -1786,20 +1772,20 @@ msgstr "La huella digital del repositorio no coincide." #: ../fdroidserver/common.py msgid "The repository's index could not be verified." -msgstr "" +msgstr "No se pudo verificar el índice del repositorio." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" -msgstr "" +msgstr "¡El directorio raíz para local_copy_dir \"{path}\" no existe!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" -msgstr "" +msgstr "Hay una colisión de keyalias - publicación detenida" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." -msgstr "" +msgstr "Estas son aplicaciones del repositorio principal que se han archivado." #: ../fdroidserver/import.py #, python-format @@ -1808,15 +1794,15 @@ msgstr "Este repo ya tiene metadatos locales: %s" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" -msgstr "" +msgstr "¡Para usar awsbucket hay que configurar también awssecretkey y awsaccesskeyid en config.py!" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" +msgstr "¡Para usar awsbucket hay que configurar también awssecretkey y awsaccesskeyid en config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" -msgstr "" +msgstr "La URL debe comenzar con https:// o http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" @@ -1824,30 +1810,30 @@ msgstr "Acortadores de URL no deben ser utilizados" #: ../fdroidserver/metadata.py msgid "URL title is just the URL, use brackets: [URL]" -msgstr "" +msgstr "El título de la URL es la propia URL, use corchetes: [URL]" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" -msgstr "" +msgstr "URL {url} en Descripción: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "" +msgstr "¡Etiqueta de licencia inesperada \"{}\"! Use solo etiquetas aprobadas por FSF u OSI de https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "" +msgstr "¡Etiqueta de licencia inesperada \"{}\"! Use solo etiquetas de licencia configuradas en su archivo de configuración" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" -msgstr "" +msgstr "Texto inesperado en la misma línea que {field} en {linedesc}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "" +msgstr "Entrada desconocida {key} en {configname}" #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" @@ -1857,12 +1843,12 @@ msgstr "¡Se encontró una excepción desconocida!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" -msgstr "" +msgstr "Fichero '{filename}' desconocido en compilación '{versionName}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" -msgstr "" +msgstr "Formato de metadatos desconocido: %s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1870,97 +1856,97 @@ msgid "Unknown metadata format: {path}" msgstr "Formato de metadatos desconocido: {path}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" -msgstr "Formato de metadatos desconocido: {path}" +msgstr "Formato de metadatos desconocido: {path} (use: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " -msgstr "" +msgstr "Versión desconocida de aapt, podría causar problemas: " #: ../fdroidserver/lint.py msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "" +msgstr "Enlace roto - use [http://foo.bar Título del enlace] o [http://foo.bar]" #: ../fdroidserver/lint.py msgid "Unnecessary leading space" -msgstr "" +msgstr "Espacio innecesario al principio" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" -msgstr "" +msgstr "Espacio innecesario al final" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" -msgstr "" +msgstr "Campo de app '{fieldname}' desconocido en '{path}'" #: ../fdroidserver/metadata.py msgid "Unrecognised app field: " -msgstr "" +msgstr "Campo de app desconocido : " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" -msgstr "" +msgstr "Flag de compilación '{build_flag}' desconocido en '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised field '{field}' in {linedesc}" -msgstr "" +msgstr "Campo '{field}' desconocido en {linedesc}" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" -msgstr "" +msgstr "Tipo de fichero \"{extension}\" no soportado para gráfico de repositorio" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" -msgstr "" +msgstr "Fichero de gráficos no soportado: {path}" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Unsupported metadata format, use: --to [{supported}]" -msgstr "" +msgstr "Formato de metadatos no soportado, use : --to [{supported}]" #: ../fdroidserver/metadata.py msgid "Unterminated ]" -msgstr "" +msgstr "] No terminado" #: ../fdroidserver/metadata.py msgid "Unterminated ]]" -msgstr "" +msgstr "]] No terminado" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unterminated build in {name}" -msgstr "" +msgstr "Compilación no terminada en {name}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unterminated continuation in {name}" -msgstr "" +msgstr "Continuación no terminada en {name}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" -msgstr "" +msgstr "Extlib no utilizada en %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" -msgstr "" +msgstr "Fichero no utilizado en %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" -msgstr "" +msgstr "Ruta scandelete sin uso: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" -msgstr "" +msgstr "Ruta scanignore sin uso: %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -1981,40 +1967,40 @@ msgstr "Actualizar el wiki" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" -msgstr "" +msgstr "UpdateCheckData tiene una URL no válida: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" -msgstr "" +msgstr "UpdateCheckData tiene que usar una URL HTTPS: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" -msgstr "" +msgstr "UpdateCheckData tiene una URL no válida: {url}" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" -msgstr "" +msgstr "UpdateCheckMode establecido, pero parece que checkupdates nos se ha executado aún" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID - it can be removed" -msgstr "" +msgstr "El nombre de verificación de actualización (UpdateCheckName) es el identificador (ID) conocido de la aplicación - se puede borrar" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "" +msgstr "El nombre de verificación de actualización (UpdateCheckName) es el identificador (ID) conocido de la aplicación. Se puede borrar" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" -msgstr "" +msgstr "Subiendo {apkfilename} a androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" -msgstr "" +msgstr "Subiendo {apkfilename} a virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2029,11 +2015,11 @@ msgstr "Uso: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" +msgstr "Use /HEAD en vez de /master para apuntar a un fichero en la rama por omisión" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." -msgstr "" +msgstr "Use `fdroid update -c` para crearlo." #: ../fdroidserver/build.py msgid "Use build server" @@ -2049,34 +2035,34 @@ msgstr "Use la fecha del «apk» en vez de la fecha actual para los nuevos «apk #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." -msgstr "" +msgstr "Usando \"{path}\" para configurar s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" -msgstr "" +msgstr "Utilizando Firma APK v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" -msgstr "" +msgstr "Utilizando firma APK v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" -msgstr "" +msgstr "¡Usando jarsigner de Java. No recomendado para verificar APKs! Use apksigner" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" -msgstr "" +msgstr "Usando androguard de \"{path}\"" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" -msgstr "" +msgstr "Usando almacén de claves existente \"{path}\"" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" -msgstr "" +msgstr "Usando s3cmd para sincronizar con: {url}" #: ../fdroid ../fdroidserver/__main__.py msgid "Valid commands are:" @@ -2084,7 +2070,7 @@ msgstr "Los comandos válidos son:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." -msgstr "" +msgstr "Verificar una copia en caché local en vez de volver a descargar." #: ../fdroid ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" @@ -2092,12 +2078,12 @@ msgstr "Verificar la integridad de los paquetes descargados" #: ../fdroidserver/index.py msgid "Verifying index signature:" -msgstr "" +msgstr "Verificar el índice de la firma:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "" +msgstr "La clave de API de VirusTotal no puede subir archivos mayores de 32MB. Use {url} para subir {path}." #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" @@ -2109,7 +2095,7 @@ msgstr "Cuando está configurado para índices firmados, crear solo índices sin #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "" +msgstr "Cuando se limpia el repositorio completo yamllint está deshabilitado por defecto. Esta opción fuerza yamllint a pesar de todo." msgid "X.509 'Distiguished Name' used when generating keys" msgstr "X.509 'Nombre Distintivo' (DN) usado al generar claves" @@ -2120,21 +2106,21 @@ msgstr "X.509 'Nombre Distintivo' (DN) usado al generar claves" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" -msgstr "" +msgstr "Puede usar ANDROID_HOME para definir la ruta a su SDK, p.ej.:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" -msgstr "" +msgstr "Archivo de ficheros ZIP" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" -msgstr "" +msgstr "añadiendo IdentityFile a {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" -msgstr "" +msgstr "añadiendo a {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2150,20 +2136,18 @@ msgstr "opción ambigua: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" -msgstr "" +msgstr "¡Se requiere apksigner para firmar pero no se encontró!" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "application ID of file to operate on" -msgstr "applicationId para buscar actualizaciones" +msgstr "identificador de aplicación del fichero en el que operar" #: ../fdroidserver/verify.py ../fdroidserver/publish.py #: ../fdroidserver/build.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py -#, fuzzy msgid "application ID with optional versionCode in the form APPID[:VERCODE]" -msgstr "applicationId con código de versión opcional en la forma APPID [: VERCODE]" +msgstr "identificador de aplicación con código de versión opcional en la forma APPID[: VERCODE]" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py msgid "applicationId in the form APPID" @@ -2184,19 +2168,19 @@ msgstr "applicationId con código de versión opcional en la forma APPID [: VERC #: /usr/lib/python3.7/argparse.py #, python-format msgid "argument \"-\" with mode %r" -msgstr "" +msgstr "argumento \"-\" con modo %r" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" -msgstr "" +msgstr "intentando conexión SSH pura para probar la llave de despliegue:" #: ../fdroidserver/nightly.py msgid "attempting bare ssh connection to test deploy key:" -msgstr "" +msgstr "intentando conexión SSH en claro para probar la clave de despliegue:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" -msgstr "" +msgstr "no se puede procesar (no es una cadena) la especificación scrlib: '{}'" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2207,27 +2191,27 @@ msgstr "no se puede abrir '%s': %s" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" -msgstr "" +msgstr "no se encuentran las srclibs requeridas: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "cannot have multiple subparser arguments" -msgstr "" +msgstr "no se puede tener varios argumentos de subparser" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" -msgstr "" +msgstr "no se pueden fundir acciones - 2 grupos se llaman %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" -msgstr "" +msgstr "no se puede publicar actualización. ¿Estableció Ud. la clave de despliegue?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" -msgstr "" +msgstr "clonando {url}" #: ../fdroidserver/deploy.py msgid "command to execute, either 'init' or 'update'" @@ -2235,96 +2219,96 @@ msgstr "Comando para ejecutar, ya sea 'init' o 'update'" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" -msgstr "" +msgstr "órdenes de módulos de extensión (plugins):" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "complex" -msgstr "" +msgstr "complejo" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "cadena de opción conflictiva: %s" +msgstr[1] "cadenas de opción conflictivas: %s" #: ../fdroidserver/nightly.py #, python-brace-format msgid "copying {apkfilename} into {path}" -msgstr "" +msgstr "copiando {apkfilename} en {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" -msgstr "" +msgstr "no se pudo procesar '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "" +msgstr "no se pudo procesar especificación srclib (sin especificar ref): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" +msgstr "no se pudo procesar especificación srclib (demasiadas arrobas '@'): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" -msgstr "" +msgstr "{path} creado" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" -msgstr "" +msgstr "eliminando: repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed build logs to '{path}'" -msgstr "" +msgstr "registros de compilación desplegados en '{path}'" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" -msgstr "" +msgstr "registro de proceso {path} desplegado en '{dest}'" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "dest= is required for options like %r" -msgstr "" +msgstr "las opciones como %r requieren dest =" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" -msgstr "" +msgstr "binario ejecutable, posiblemente código" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "argumento inesperado %s" +msgstr[1] "argumentos inesperados %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "expected at least one argument" -msgstr "" +msgstr "se esperaba al menos 1 argumento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "expected at most one argument" -msgstr "" +msgstr "no se esperaba más de 1 argumento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "expected one argument" -msgstr "" +msgstr "se esperaba 1 argumento" #: ../fdroidserver/common.py #, python-brace-format msgid "failed deploying build logs to '{path}'" -msgstr "" +msgstr "falló el despliegue de los registros de compilación en '{path}'" #: ../fdroid msgid "fdroid [-h|--help|--version] []" @@ -2337,7 +2321,7 @@ msgstr "fdroid [] [-h|--help|--version|]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "floating-point" -msgstr "" +msgstr "punto flotante" #: ../fdroidserver/metadata.py msgid "force errors to be warnings, or ignore" @@ -2349,21 +2333,21 @@ msgstr "forzar que los errores en metadatos sean avisos, o que se ignoren (valor #: ../fdroidserver/common.py msgid "git svn clone failed" -msgstr "" +msgstr "falló git svn clone" #: ../fdroidserver/scanner.py msgid "gzip file archive" -msgstr "" +msgstr "archivo de ficheros gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "ignored explicit argument %r" -msgstr "" +msgstr "argumento explícito %r ignorado" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" -msgstr "" +msgstr "¡index-v1 tiene que tener una firma, use `fdroid signindex` para crearla!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2374,57 +2358,57 @@ msgstr "entero" #: /usr/lib/python3.7/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" -msgstr "" +msgstr "valor inválido de tipo %(type)s: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "" +msgstr "opción no válida: %(value)r (escoja de entre %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" -msgstr "" +msgstr "valor para conflict_resolution no válido: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" -msgstr "" +msgstr "cadena de opciones %(option)r no válida: tiene que comenzar por un carácter %(prefix_chars)r" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" -msgstr "" +msgstr "local_copy_dir no termina en \"fdroid\", tal vez quisiste decir: \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" -msgstr "" +msgstr "¡local_copy_dir tiene que ser una ruta absoluta!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" -msgstr "" +msgstr "¡local_copy_dir tiene que ser un directorio, no un fichero!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" -msgstr "" +msgstr "¡el espejo '%s' no termina en 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "mutually exclusive arguments must be optional" -msgstr "" +msgstr "los argumentos mutuamente exclusivos tienen que ser opcionales" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" -msgstr "" +msgstr "{appid} sin \"icono\"" #: ../fdroidserver/signatures.py msgid "no APK supplied" -msgstr "" +msgstr "no se ha indicado APK" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2446,28 +2430,28 @@ msgstr "no permitido con el argumento %s" #: /usr/lib/python3.7/argparse.py #, python-format msgid "one of the arguments %s is required" -msgstr "" +msgstr "se necesita 1 de los argumentos %s" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "only accepts strings, lists, and tuples" -msgstr "" +msgstr "solo acepta cadenas, listas, y tuplas" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" +msgstr "opción %s: Si de verdad quiere instalar todas las apps firmadas use --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "option %s: invalid %s value: %r" -msgstr "" +msgstr "opción %s: valor de %s no válido: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" +msgstr "opción %s: selección no válida: %r (elija de entre %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2513,7 +2497,7 @@ msgstr "argumentos opcionales" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" -msgstr "" +msgstr "sobrescribiendo {path} existente" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2523,35 +2507,35 @@ msgstr "argumentos posicionales" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" -msgstr "" +msgstr "¡Falló el despliegue del registro de proceso {path} en {dest}!" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "" +msgstr "rechazar descarga por conexión HTTP insegura (use HTTPS o especifique --no-https-check): {apkfilename}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" -msgstr "" +msgstr "rechazar descarga por conexión HTTP insegura (use HTTPS o especifique --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." -msgstr "" +msgstr "No existe repo_icon %s. Reservando espacio." #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" +msgstr "ruamel.yaml no instalado. No se pueden escribir metadatos." #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" -msgstr "" +msgstr "s3cmd sync indexa {path} a {url} y elimina" #: ../fdroidserver/scanner.py msgid "shared library" -msgstr "" +msgstr "biblioteca compartida" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2566,33 +2550,33 @@ msgstr "mostrar este mensaje de ayuda y salir" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." -msgstr "" +msgstr "APK firmado, o una ruta a fichero o una URL HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "" +msgstr "saltar el despliegue de registros de compilación completos: el registro está vacío" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" -msgstr "" +msgstr "saltar el despliegue de registros de compilación completos: no está activado en la configuración" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" -msgstr "" +msgstr "ignorando tarball de fuentes: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" -msgstr "" +msgstr "a scrlibs le falta el nombre y/o @" #: ../fdroidserver/scanner.py msgid "static library" -msgstr "" +msgstr "biblioteca estática" #: ../fdroidserver/common.py #, python-brace-format msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" -msgstr "" +msgstr "valor proporcionado de timestamp '{timestamp}' no está en formato unix" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2610,7 +2594,7 @@ msgstr "cadena de opción inesperada: %s" #: /usr/lib/python3.7/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "" +msgstr "parser '%(parser_name)r' desconocido. (Opciones válidas: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2639,28 +2623,28 @@ msgstr "usando Apache libcloud para sincronizar con {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "" +msgstr "virustotal.com está limitando el consumo, esperando para reintentar..." #: ../fdroidserver/update.py msgid "wiki support is deprecated and will be removed in the next release!" -msgstr "" +msgstr "¡El soporte de wiki está descontinuado y se eliminará en la próxima publicación!" #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{0} aplicación, {1} alias de clave" +msgstr[1] "{0} aplicaciones, {1} alias de clave" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" -msgstr "" +msgstr "¡{apkfilename} ({appid}) no tiene metadatos!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" +msgstr "¡{apkfilename} tiene multiples ficheros {name}, parece un exploit de clave maestra!" #: ../fdroidserver/update.py #, python-brace-format @@ -2670,125 +2654,125 @@ msgstr "El AndroidManifest.xml de {apkfilename} tiene la fecha mal: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." -msgstr "" +msgstr "¡{appid} no tiene nombre! Usando su identificador." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using package name instead." -msgstr "" +msgstr "¡{appid} no tiene nombre! Usando su nombre de paquete." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android Package Name!" -msgstr "" +msgstr "¡{appid} de {path} no es un nombre válido de paquete Android!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" -msgstr "" +msgstr "¡{appid} de {path} no es un identificador (ID) de aplicación Android válido!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" -msgstr "" +msgstr "¡{appid} de {path} no es un nombre de paquete Java válido!" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" -msgstr "" +msgstr "{appid} no tiene {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" -msgstr "" +msgstr "{appid}: extlib {path} desconocido en la compilación '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" -msgstr "" +msgstr "{appid}: no se ha especificado compilación, ejecutando sobre el estado actual del código fuente" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "" +msgstr "¡{appid}: {field} tiene que ser un '{type}' pero es un '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" -msgstr "" +msgstr "¡{appid}: {field} tiene que ser un '{type}' pero es un '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" -msgstr "" +msgstr "{build_flag} tiene que ser un entero pero se ha encontrado: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{field} not terminated in {name}" -msgstr "" +msgstr "{field} no termina en {name}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" -msgstr "" +msgstr "¡{file} está vacío o corrupto!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{path}\" does not exist! Correct it in config.py." -msgstr "" +msgstr "¡{name} \"{path}\" no existe! Corrijalo en config.py." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "{oldfile} está obsoleto, use {newfile}" #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" -msgstr "" +msgstr "¡{path} ya existe, ignorando resultados de importaciones!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" -msgstr "" +msgstr "¡{path} no existe! Créela ejecutando:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "" +msgstr "¡{path} tiene una firma de fichero \"{pattern}\" mala, posible exploit Janus!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" -msgstr "" +msgstr "¡{path} está vacío!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" -msgstr "" +msgstr "{path} mayor de 200MB, subir manualmente: {url}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" -msgstr "" +msgstr "¡{url} no termina en \"fdroid\", verifique la URL!" #: ../fdroidserver/common.py #, python-brace-format msgid "{url} does not start with \"http\"!" -msgstr "" +msgstr "¡{url} no empieza por \"http\"!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "compilación fallida {}" +msgstr[1] "compilaciones fallidas {}" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "compilación con éxito {}" +msgstr[1] "compilaciones con éxito {}" #, fuzzy #~ msgid "Add PGP signatures for packages in repo using GnuPG" From d36dcdfb67de77deab59d47866e61dce506cbc26 Mon Sep 17 00:00:00 2001 From: Madeorsk Date: Fri, 29 Jan 2021 11:52:08 +0100 Subject: [PATCH 0097/2116] Translated using Weblate: French (fr) by Madeorsk Currently translated at 85.0% (500 of 588 strings) Co-authored-by: Madeorsk Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 57 +++++++++++++++------------ 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index f179cc66..1838fc7b 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -18,13 +18,14 @@ # Renaud Perrai , 2020. # Éfrit , 2021. # hilariousperson , 2021. +# Madeorsk , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-14 21:33+0000\n" -"Last-Translator: Éfrit \n" +"PO-Revision-Date: 2021-01-15 13:25+0000\n" +"Last-Translator: Madeorsk \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2080,8 +2081,9 @@ msgid "Valid commands are:" msgstr "Les commandes valides sont les suivantes :" #: ../fdroidserver/verify.py +#, fuzzy msgid "Verify against locally cached copy rather than redownloading." -msgstr "" +msgstr "Vérifier dans le cache plutôt que de retélécharger." #: ../fdroid ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" @@ -2092,9 +2094,9 @@ msgid "Verifying index signature:" msgstr "Vérification de la signature d'index :" #: ../fdroidserver/deploy.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "" +msgstr "L'API de VirusTotal ne permet pas d'envoyer des fichiers plus grands que 32Mo, utilisez {url} pour envoyer {path}." #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" @@ -2120,8 +2122,9 @@ msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "Vous pouvez utiliser ANDROID_HOME pour définir le chemin de votre SDK, ex. :" #: ../fdroidserver/scanner.py +#, fuzzy msgid "ZIP file archive" -msgstr "" +msgstr "Archive ZIP" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2146,8 +2149,9 @@ msgid "ambiguous option: %s (%s?)" msgstr "option ambiguë : %s (%s?)" #: ../fdroidserver/common.py +#, fuzzy msgid "apksigner not found, it's required for signing!" -msgstr "" +msgstr "apksigner n'a pas été trouvé, alors que c'est nécessaire pour signer !" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py #: ../fdroidserver/checkupdates.py @@ -2214,13 +2218,13 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py -#, python-format +#, fuzzy, python-format msgid "cannot merge actions - two groups are named %r" -msgstr "" +msgstr "impossible de fusionner les actions - deux groupes sont appelés %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" -msgstr "" +msgstr "impossible de publier la mise à jour, avez-vous affecté la clé de déploiement ?" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2237,8 +2241,9 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py +#, fuzzy msgid "complex" -msgstr "" +msgstr "complexe" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2249,14 +2254,14 @@ msgstr[0] "" msgstr[1] "" #: ../fdroidserver/nightly.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "copying {apkfilename} into {path}" -msgstr "" +msgstr "copie de {apkfilename} dans {path} en cours" #: ../fdroidserver/metadata.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "could not parse '{path}'" -msgstr "" +msgstr "impossible de lire '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" @@ -2269,12 +2274,12 @@ msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" -msgstr "" +msgstr "{path} a été créé" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" -msgstr "" +msgstr "suppression : repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format @@ -2307,22 +2312,22 @@ msgstr[1] "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "expected at least one argument" -msgstr "" +msgstr "au moins un argument est attendu" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "expected at most one argument" -msgstr "" +msgstr "un seul argument au plus est attendu" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "expected one argument" -msgstr "" +msgstr "un seul argument est attendu" #: ../fdroidserver/common.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "failed deploying build logs to '{path}'" -msgstr "" +msgstr "le journal de construction n'a pas pu être déployé sur '{path}'" #: ../fdroid msgid "fdroid [-h|--help|--version] []" @@ -2347,11 +2352,11 @@ msgstr "forcer les erreurs (par défaut) sur les métadonnées à être des aver #: ../fdroidserver/common.py msgid "git svn clone failed" -msgstr "" +msgstr "git svn clone a échoué" #: ../fdroidserver/scanner.py msgid "gzip file archive" -msgstr "" +msgstr "archive GZIP" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2366,7 +2371,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "integer" -msgstr "" +msgstr "entier" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2549,7 +2554,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "shared library" -msgstr "" +msgstr "bibliothèque partagée" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py From f7e13957f2f9504b160be3362dbd006f140d553a Mon Sep 17 00:00:00 2001 From: hilariousperson Date: Fri, 29 Jan 2021 11:52:08 +0100 Subject: [PATCH 0098/2116] Translated using Weblate: French (fr) by hilariousperson Currently translated at 85.0% (500 of 588 strings) Co-authored-by: hilariousperson Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 1838fc7b..058cd4f7 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -25,7 +25,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-15 13:25+0000\n" -"Last-Translator: Madeorsk \n" +"Last-Translator: hilariousperson \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -1840,7 +1840,7 @@ msgstr "Balise de licence non valide \"{}\" ! Utilisez uniquement des balises #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" -msgstr "" +msgstr "Texte inattendu dans la même ligne que {field} dans {linedesc}" #: ../fdroidserver/common.py #, python-brace-format From 7cb148a5aa2dd50ebb600b9ff7d792c8dfd64c10 Mon Sep 17 00:00:00 2001 From: Adrien le Maire Date: Fri, 29 Jan 2021 11:52:09 +0100 Subject: [PATCH 0099/2116] Translated using Weblate: French (fr) by Adrien le Maire Currently translated at 85.0% (500 of 588 strings) Co-authored-by: Adrien le Maire Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 058cd4f7..a96966b2 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -19,13 +19,14 @@ # Éfrit , 2021. # hilariousperson , 2021. # Madeorsk , 2021. +# Adrien le Maire , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-15 13:25+0000\n" -"Last-Translator: hilariousperson \n" +"Last-Translator: Adrien le Maire \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -1827,7 +1828,7 @@ msgstr "Le titre de l'URL est juste l'URL, utilisez des crochets : [URL]" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" -msgstr "" +msgstr "URL {url} en Description : {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" From b1745598f241ed9e8272356adcf1ae5a0ee04344 Mon Sep 17 00:00:00 2001 From: gub Date: Fri, 29 Jan 2021 11:52:10 +0100 Subject: [PATCH 0100/2116] Translated using Weblate: French (fr) by gub Currently translated at 86.0% (506 of 588 strings) Co-authored-by: gub Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index a96966b2..6b5db114 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -20,13 +20,14 @@ # hilariousperson , 2021. # Madeorsk , 2021. # Adrien le Maire , 2021. +# gub , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-15 13:25+0000\n" -"Last-Translator: Adrien le Maire \n" +"PO-Revision-Date: 2021-01-15 22:57+0000\n" +"Last-Translator: gub \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -60,12 +61,13 @@ msgstr "" "Clé Publique SSH à utiliser comme Clé de Déploiement :" #: ../fdroidserver/nightly.py +#, fuzzy msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" -"Clé publique SSH à utiliser comme clé de déploiement :" +"Clé SSH publique à utiliser comme clé de déploiement :" #: ../fdroidserver/nightly.py #, python-brace-format @@ -102,9 +104,9 @@ msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "\"{path}\" existe mais s3cmd n'est pas installé !" #: ../fdroidserver/lint.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "\"{path}\" n'est pas un format autorisé (utiliser : metadata/*.yml)" +msgstr "\"{path}\" n'est pas un format supporté (utiliser : metadata/*.yml)" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2199,7 +2201,7 @@ msgstr "tentative de connexion ssh simple pour tester la clé de déploiement :" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" -msgstr "" +msgstr "Impossible de parcourir la spécification de scrlib (pas une chaîne de caractères): '{}'" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From 9caebf1123e9ffb1f5eab35c674b4290fc8de69e Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Fri, 29 Jan 2021 11:52:10 +0100 Subject: [PATCH 0101/2116] Translated using Weblate: French (fr) by ButterflyOfFire Currently translated at 86.0% (506 of 588 strings) Co-authored-by: ButterflyOfFire Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 108 +++++++++++++------------- 1 file changed, 55 insertions(+), 53 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 6b5db114..78ed58fd 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -21,13 +21,14 @@ # Madeorsk , 2021. # Adrien le Maire , 2021. # gub , 2021. +# ButterflyOfFire , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-15 22:57+0000\n" -"Last-Translator: gub \n" +"Last-Translator: ButterflyOfFire \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2097,9 +2098,9 @@ msgid "Verifying index signature:" msgstr "Vérification de la signature d'index :" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "L'API de VirusTotal ne permet pas d'envoyer des fichiers plus grands que 32Mo, utilisez {url} pour envoyer {path}." +msgstr "L’API de VirusTotal ne permet pas d’envoyer des fichiers plus grands que 32Mo, utilisez {url} pour envoyer {path}." #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" @@ -2111,7 +2112,7 @@ msgstr "Lorsqu'il est configuré pour les index signés, ne créez que des index #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "" +msgstr "Lors du linting, tout le dépôt yamllint est désactivé par défaut. Cette option force yamllint malgré tout." msgid "X.509 'Distiguished Name' used when generating keys" msgstr "X.509 'Nom distingué' utilisé lors de la génération des clés" @@ -2152,9 +2153,8 @@ msgid "ambiguous option: %s (%s?)" msgstr "option ambiguë : %s (%s?)" #: ../fdroidserver/common.py -#, fuzzy msgid "apksigner not found, it's required for signing!" -msgstr "apksigner n'a pas été trouvé, alors que c'est nécessaire pour signer !" +msgstr "apksigner est introuvable, il est requis pour la signature !" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py #: ../fdroidserver/checkupdates.py @@ -2191,9 +2191,8 @@ msgid "argument \"-\" with mode %r" msgstr "argument \"-\" avec le mode %r" #: ../fdroidserver/nightly.py -#, fuzzy msgid "attempting bare SSH connection to test deploy key:" -msgstr "tentative de connexion ssh simple pour tester la clé de déploiement :" +msgstr "tentative de connexion SSH simple pour tester la clé de déploiement :" #: ../fdroidserver/nightly.py msgid "attempting bare ssh connection to test deploy key:" @@ -2221,9 +2220,9 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py -#, fuzzy, python-format +#, python-format msgid "cannot merge actions - two groups are named %r" -msgstr "impossible de fusionner les actions - deux groupes sont appelés %r" +msgstr "impossible de fusionner les actions - deux groupes sont nommés %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" @@ -2232,15 +2231,16 @@ msgstr "impossible de publier la mise à jour, avez-vous affecté la clé de dé #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" -msgstr "" +msgstr "clonage de {url}" #: ../fdroidserver/deploy.py msgid "command to execute, either 'init' or 'update'" msgstr "Commande à exécuter : 'init' ou 'update'" #: ../fdroidserver/__main__.py +#, fuzzy msgid "commands from plugin modules:" -msgstr "" +msgstr "commandes des modules d'extension :" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2287,7 +2287,7 @@ msgstr "suppression : repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed build logs to '{path}'" -msgstr "" +msgstr "déploiement des journaux de compilation sur « {path} »" #: ../fdroidserver/common.py #, python-brace-format @@ -2296,9 +2296,9 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py -#, python-format +#, fuzzy, python-format msgid "dest= is required for options like %r" -msgstr "" +msgstr "dest= est requis pour les options comme %r" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" @@ -2378,15 +2378,15 @@ msgstr "entier" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py -#, python-format +#, fuzzy, python-format msgid "invalid %(type)s value: %(value)r" -msgstr "" +msgstr "valeur %(type)s non valide : %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py -#, python-format +#, fuzzy, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "" +msgstr "choix non valide : %(value)r (choisissez parmi %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2396,9 +2396,9 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py -#, python-format +#, fuzzy, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" -msgstr "" +msgstr "chaîne d’option non valide %(option)r : doit commencer par un caractère %(prefix_chars)r" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2414,9 +2414,9 @@ msgid "local_copy_dir must be directory, not a file!" msgstr "local_copy_dir doit être absolument un dossier, pas un fichier !" #: ../fdroidserver/index.py -#, python-format +#, fuzzy, python-format msgid "mirror '%s' does not end with 'fdroid'!" -msgstr "" +msgstr "le miroir «%s» ne se termine pas par «fdroid» !" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2424,13 +2424,14 @@ msgid "mutually exclusive arguments must be optional" msgstr "" #: ../fdroidserver/mirror.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "no \"icon\" in {appid}" -msgstr "" +msgstr "aucune \"icon\" dans {appid}" #: ../fdroidserver/signatures.py +#, fuzzy msgid "no APK supplied" -msgstr "" +msgstr "aucun APK n’est fourni" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2465,9 +2466,9 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py -#, python-format +#, fuzzy, python-format msgid "option %s: invalid %s value: %r" -msgstr "" +msgstr "option %s : valeur %s non valide : %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2547,8 +2548,9 @@ msgid "repo_icon %s does not exist, generating placeholder." msgstr "" #: ../fdroidserver/metadata.py +#, fuzzy msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" +msgstr "ruamel.yaml n’est pas installé, impossible d’écrire des métadonnées." #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -2659,9 +2661,9 @@ msgstr[0] "" msgstr[1] "" #: ../fdroidserver/update.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" -msgstr "" +msgstr "{apkfilename} ({appid}) n’a pas de métadonnées !" #: ../fdroidserver/update.py #, python-brace-format @@ -2669,39 +2671,39 @@ msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "" #: ../fdroidserver/update.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " -msgstr "" +msgstr "Le fichier AndroidManifest.xml de {apkfilename} possède une date incorrecte : " #: ../fdroidserver/update.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{appid} does not have a name! Using application ID instead." -msgstr "" +msgstr "{appid} n’a pas de nom ! Utilisation de l’ID d’application à la place." #: ../fdroidserver/update.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{appid} does not have a name! Using package name instead." -msgstr "" +msgstr "{appid} n’a pas de nom ! Utilisation du nom du paquet à la place." #: ../fdroidserver/update.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{appid} from {path} is not a valid Android Package Name!" -msgstr "" +msgstr "{appid} de {path} n’est pas un nom de paquet Android valide !" #: ../fdroidserver/update.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" -msgstr "" +msgstr "{appid} de {path} n’est pas un ID d’application Android valide !" #: ../fdroidserver/metadata.py ../fdroidserver/update.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" -msgstr "" +msgstr "{appid} de {path} n’est pas un nom de paquet Java valide !" #: ../fdroidserver/mirror.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{appid} is missing {name}" -msgstr "" +msgstr "{appid} manque de {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py @@ -2735,9 +2737,9 @@ msgid "{field} not terminated in {name}" msgstr "" #: ../fdroidserver/metadata.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{file} is blank or corrupt!" -msgstr "" +msgstr "{file} est vide ou corrompu !" #: ../fdroidserver/update.py #, python-brace-format @@ -2745,9 +2747,9 @@ msgid "{name} \"{path}\" does not exist! Correct it in config.py." msgstr "" #: ../fdroidserver/common.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "{oldfile} est obsolète, utilisez {newfile}" #: ../fdroidserver/import.py #, python-brace-format @@ -2755,9 +2757,9 @@ msgid "{path} already exists, ignoring import results!" msgstr "" #: ../fdroidserver/nightly.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{path} does not exist! Create it by running:" -msgstr "" +msgstr "{path} n’existe pas ! Créez-le en exécutant :" #: ../fdroidserver/update.py #, python-brace-format @@ -2765,9 +2767,9 @@ msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" #: ../fdroidserver/update.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{path} is zero size!" -msgstr "" +msgstr "{path} a une taille nulle !" #: ../fdroidserver/deploy.py #, python-brace-format From 5a4824927b884cedc7c98f222ba0b85fe0e1f40e Mon Sep 17 00:00:00 2001 From: Aleph Null Date: Fri, 29 Jan 2021 11:52:11 +0100 Subject: [PATCH 0102/2116] Translated using Weblate: German (de) by Aleph Null Currently translated at 91.3% (537 of 588 strings) Co-authored-by: Aleph Null Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index dacece32..3b0ce61e 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -7,13 +7,14 @@ # Hans-Christoph Steiner , 2020, 2021. # Predatorix Phoenix , 2021. # cheese1 , 2021. +# Aleph Null , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-14 21:33+0000\n" -"Last-Translator: cheese1 \n" +"PO-Revision-Date: 2021-01-16 09:19+0000\n" +"Last-Translator: Aleph Null \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -315,9 +316,9 @@ msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "Im „{path}” der Android SDK wurde „{dirname}” nicht installiert!" #: ../fdroidserver/init.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "Android-SDK nicht gefunden!" +msgstr "Android-SDK nicht unter {path} gefunden!" #: ../fdroidserver/common.py msgid "Android SDK not found!" From abd25fdbb6c4cf99db283d051d71d038bef7c656 Mon Sep 17 00:00:00 2001 From: nautilusx Date: Fri, 29 Jan 2021 11:52:11 +0100 Subject: [PATCH 0103/2116] Translated using Weblate: German (de) by nautilusx Currently translated at 91.3% (537 of 588 strings) Co-authored-by: nautilusx Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 3b0ce61e..bdac2520 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -8,13 +8,14 @@ # Predatorix Phoenix , 2021. # cheese1 , 2021. # Aleph Null , 2021. +# nautilusx , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-16 09:19+0000\n" -"Last-Translator: Aleph Null \n" +"Last-Translator: nautilusx \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -335,9 +336,9 @@ msgid "Android SDK path '{path}' is not a directory!" msgstr "Android-SDK-Pfad »{path}« ist kein Verzeichnis!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "Android-SDK nicht gefunden!" +msgstr "Android-SDK-Tool {cmd} nicht gefunden!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -428,7 +429,7 @@ msgstr "„{path}” konnte nicht gelesen werden!" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Cannot resolve application ID {appid}" msgstr "AppID {appid} konnte nicht aufgelöst werden" @@ -508,12 +509,10 @@ msgid "Could not find '{command}' on your system" msgstr "„{command}” konnte auf Ihrem System nicht gefunden werden" #: ../fdroidserver/import.py -#, fuzzy msgid "Could not find latest version code" msgstr "Neuester Versionscode konnte nicht gefunden werden" #: ../fdroidserver/import.py -#, fuzzy msgid "Could not find latest version name" msgstr "Neuester Versionsname konnte nicht gefunden werden" From 52a817c0af731634b122e2d0eb5ab1961d15645b Mon Sep 17 00:00:00 2001 From: ssantos Date: Fri, 29 Jan 2021 11:52:12 +0100 Subject: [PATCH 0104/2116] Translated using Weblate: Portuguese (pt) by ssantos Currently translated at 100.0% (588 of 588 strings) Translated using Weblate: Portuguese (Portugal) (pt_PT) by ssantos Currently translated at 100.0% (588 of 588 strings) Co-authored-by: ssantos Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_PT/ Translation: F-Droid/F-Droid Server --- locale/pt/LC_MESSAGES/fdroidserver.po | 50 ++++++++++-------------- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 50 ++++++++++-------------- 2 files changed, 42 insertions(+), 58 deletions(-) diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index bc896450..7f0ec61e 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -1,12 +1,12 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# ssantos , 2020. +# ssantos , 2020, 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2020-10-26 07:26+0000\n" +"PO-Revision-Date: 2021-01-16 09:19+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" "Language: pt\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.3.2-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py msgid "" @@ -148,9 +148,8 @@ msgid "'keypass' not found in config.py!" msgstr "'keypass' não foi encontrada em config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keypass' not found in config.yml!" -msgstr "'keypass' não foi encontrada em config.py!" +msgstr "'keypass' não foi encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" @@ -161,27 +160,24 @@ msgid "'keystore' not found in config.py!" msgstr "'keystore' não encontrada em config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystore' not found in config.yml!" -msgstr "'keystore' não encontrada em config.py!" +msgstr "'keystore' não foi encontrada em config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "'keystorepass' não encontrada em config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' não encontrada em config.py!" +msgstr "'keystorepass' não foi encontrada em config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "'repo_keyalias' não encontrada em config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' não encontrada em config.py!" +msgstr "'repo_keyalias' não foi encontrada em config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -193,9 +189,8 @@ msgid "'sdk_path' not set in 'config.py'!" msgstr "'sdk_path' não definido em 'config.py'!" #: ../fdroidserver/common.py -#, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "'sdk_path' não definido em 'config.py'!" +msgstr "'sdk_path' não definido em 'config.yml'!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -312,9 +307,9 @@ msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "O SDK Android '{path}' não tem '{dirname}' instalado!" #: ../fdroidserver/init.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "SDK do Android não foi encontrado!" +msgstr "O SDK do Android não foi encontrado em {path}!" #: ../fdroidserver/common.py msgid "Android SDK not found!" @@ -331,9 +326,9 @@ msgid "Android SDK path '{path}' is not a directory!" msgstr "O caminho do SDK Android '{path}' não é um diretório!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "SDK do Android não foi encontrado!" +msgstr "Ferramenta {cmd} do Android SDK foi encontrada!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -496,7 +491,7 @@ msgstr "Argumentos conflitantes: \"--verbose\" e \"--quiet\" não podem ser espe #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "Ficheiros de configuração conflitantes! Usando {newfile}, ignorando {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format @@ -517,9 +512,9 @@ msgid "Could not find {path} to remove it" msgstr "Não foi possível localizar {path} para removê-lo" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "Não foi possível abrir ficheiro apk para análise" +msgstr "Não foi possível abrir o APK {path} para análise: " #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" @@ -751,7 +746,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "A variável de ambiente {var} de {configname} não está definida!" #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py @@ -1239,9 +1234,8 @@ msgid "No commit specified for {versionName} in {linedesc}" msgstr "Nenhum commit especificado para {versionName} em {linedesc}" #: ../fdroidserver/common.py -#, fuzzy msgid "No config.yml found, using defaults." -msgstr "'config.py' não encontrado, utilizando as predefinições." +msgstr "Nenhum config.yml foi encontrado, usando predefinições." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1322,9 +1316,8 @@ msgid "Now set these in config.py:" msgstr "Agora configure estes em config.py:" #: ../fdroidserver/init.py -#, fuzzy msgid "Now set these in config.yml:" -msgstr "Agora configure estes em config.py:" +msgstr "Agora, configure estes em config.py:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1798,9 +1791,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.py!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.py!" +msgstr "Para usar o awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1835,7 +1827,7 @@ msgstr "Texto inesperado na mesma linha como {field} em {linedesc}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "" +msgstr "Entrada {key} desconhecida em {configname}" #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" @@ -2727,7 +2719,7 @@ msgstr "{name} \"{path}\" não existe! Corrija-o no config.py." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "{oldfile} está obsoleto, use {newfile}" #: ../fdroidserver/import.py #, python-brace-format diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index ef1496ae..f5dc29e6 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -2,14 +2,14 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Manuela Silva , 2020. -# ssantos , 2020. +# ssantos , 2020, 2021. # Hans-Christoph Steiner , 2020. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2020-10-26 07:26+0000\n" +"PO-Revision-Date: 2021-01-16 09:19+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" "Language: pt_PT\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.3.2-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py msgid "" @@ -151,9 +151,8 @@ msgid "'keypass' not found in config.py!" msgstr "'keypass' não foi encontrada em config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keypass' not found in config.yml!" -msgstr "'keypass' não foi encontrada em config.py!" +msgstr "'keypass' não foi encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" @@ -164,27 +163,24 @@ msgid "'keystore' not found in config.py!" msgstr "'keystore' não encontrada em config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystore' not found in config.yml!" -msgstr "'keystore' não encontrada em config.py!" +msgstr "'keystore' não foi encontrada em config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "'keystorepass' não encontrada em config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' não encontrada em config.py!" +msgstr "'keystorepass' não foi encontrada em config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "'repo_keyalias' não encontrada em config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' não encontrada em config.py!" +msgstr "'repo_keyalias' não foi encontrada em config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -196,9 +192,8 @@ msgid "'sdk_path' not set in 'config.py'!" msgstr "'sdk_path' não definido em 'config.py'!" #: ../fdroidserver/common.py -#, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "'sdk_path' não definido em 'config.py'!" +msgstr "'sdk_path' não definido em 'config.yml'!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -315,9 +310,9 @@ msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "O SDK Android '{path}' não tem '{dirname}' instalado!" #: ../fdroidserver/init.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "SDK do Android não foi encontrado!" +msgstr "O SDK do Android não foi encontrado em {path}!" #: ../fdroidserver/common.py msgid "Android SDK not found!" @@ -334,9 +329,9 @@ msgid "Android SDK path '{path}' is not a directory!" msgstr "O caminho do SDK Android '{path}' não é um diretório!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "SDK do Android não foi encontrado!" +msgstr "Ferramenta {cmd} do Android SDK foi encontrada!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -499,7 +494,7 @@ msgstr "Argumentos conflitantes: \"--verbose\" e \"--quiet\" não podem ser espe #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "Ficheiros de configuração conflitantes! Usando {newfile}, ignorando {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format @@ -520,9 +515,9 @@ msgid "Could not find {path} to remove it" msgstr "Não foi possível localizar {path} para removê-lo" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "Não foi possível abrir ficheiro apk para análise" +msgstr "Não foi possível abrir o APK {path} para análise: " #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" @@ -754,7 +749,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "A variável de ambiente {var} de {configname} não está definida!" #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py @@ -1242,9 +1237,8 @@ msgid "No commit specified for {versionName} in {linedesc}" msgstr "Nenhum commit especificado para {versionName} em {linedesc}" #: ../fdroidserver/common.py -#, fuzzy msgid "No config.yml found, using defaults." -msgstr "'config.py' não encontrado, utilizando as predefinições." +msgstr "Nenhum config.yml foi encontrado, usando predefinições." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1325,9 +1319,8 @@ msgid "Now set these in config.py:" msgstr "Agora configure estes em config.py:" #: ../fdroidserver/init.py -#, fuzzy msgid "Now set these in config.yml:" -msgstr "Agora configure estes em config.py:" +msgstr "Agora, configure estes em config.py:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1801,9 +1794,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.py!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.py!" +msgstr "Para usar o awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1838,7 +1830,7 @@ msgstr "Texto inesperado na mesma linha como {field} em {linedesc}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "" +msgstr "Entrada {key} desconhecida em {configname}" #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" @@ -2730,7 +2722,7 @@ msgstr "{name} \"{path}\" não existe! Corrija-o no config.py." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "{oldfile} está obsoleto, use {newfile}" #: ../fdroidserver/import.py #, python-brace-format From 2590691c8aeb40d6d0c84fb32a0623bed251487f Mon Sep 17 00:00:00 2001 From: forght Date: Fri, 29 Jan 2021 11:52:12 +0100 Subject: [PATCH 0105/2116] Translated using Weblate: German (de) by forght Currently translated at 92.0% (541 of 588 strings) Co-authored-by: forght Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index bdac2520..ef76bf6b 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -9,13 +9,14 @@ # cheese1 , 2021. # Aleph Null , 2021. # nautilusx , 2021. +# forght , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-16 09:19+0000\n" -"Last-Translator: nautilusx \n" +"PO-Revision-Date: 2021-01-17 07:47+0000\n" +"Last-Translator: forght \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -757,7 +758,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "Umgebungsvariable {var} von {configname} ist nicht gesetzt!" #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py @@ -774,9 +775,9 @@ msgid "Extract signatures from APKs" msgstr "Signaturen aus APKs extrahieren" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Failed copying {path}: {error}" -msgstr "Lesen von {path} fehlgeschlagen: {error}" +msgstr "Kopieren von {path} fehlgeschlagen: {error}" #: ../fdroidserver/signatures.py #, python-brace-format @@ -856,9 +857,8 @@ msgid "Flattr donation methods belong in the FlattrID flag" msgstr "Flattr-Spendenmethoden gehören in die FlattrID-Flagge" #: ../fdroidserver/lint.py -#, fuzzy msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Flattr-Spendenmethoden gehören in die FlattrID-Flagge" +msgstr "Flattr-Spendenmethoden gehören in das FlattrID-Feld" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" @@ -1045,7 +1045,7 @@ msgid "Installing %s…" msgstr "%s installieren …" #: ../fdroidserver/install.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." msgstr "Installiere '{apkfilename}' auf {dev}.…" From 9dbf53aedeeff616c1bcf0d4ad185e0505e7973a Mon Sep 17 00:00:00 2001 From: TobiGr Date: Fri, 29 Jan 2021 11:52:13 +0100 Subject: [PATCH 0106/2116] Translated using Weblate: German (de) by TobiGr Currently translated at 95.2% (560 of 588 strings) Co-authored-by: TobiGr Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 55 +++++++++++++-------------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index ef76bf6b..7cba7a79 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -10,13 +10,14 @@ # Aleph Null , 2021. # nautilusx , 2021. # forght , 2021. +# TobiGr , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-17 07:47+0000\n" -"Last-Translator: forght \n" +"PO-Revision-Date: 2021-01-20 16:32+0000\n" +"Last-Translator: TobiGr \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -618,9 +619,9 @@ msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "APKs und/oder OBBs ohne Metadaten aus dem Repository löschen" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "Archiv löschen, Repo ist zu groß ({size} max {limit})" +msgstr "Lösche Archiv, Repository ist zu groß ({size} max {limit})" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1035,9 +1036,9 @@ msgid "Install built packages on devices" msgstr "Erstellte Programmpakete auf Geräten installieren" #: ../fdroidserver/install.py -#, fuzzy, python-format +#, python-format msgid "Installing %s..." -msgstr "%s installieren …" +msgstr "Installiere %s…" #: ../fdroidserver/install.py #, python-format @@ -1248,9 +1249,8 @@ msgid "No commit specified for {versionName} in {linedesc}" msgstr "Kein Commit angegeben für {versionName} in {linedesc}" #: ../fdroidserver/common.py -#, fuzzy msgid "No config.yml found, using defaults." -msgstr "Keine 'config.py' gefunden, nutze Standardeinstellungen." +msgstr "Keine config.yml gefunden, nutze Standardeinstellungen." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1261,9 +1261,8 @@ msgid "No git submodules available" msgstr "Keine Git-Submodule verfügbar" #: ../fdroidserver/import.py -#, fuzzy msgid "No gradle project could be found. Specify --subdir?" -msgstr "Es konnte kein Android- oder Kivy-Projekt gefunden werden. --subdir angeben?" +msgstr "Es konnte kein Gradle-Projekt gefunden werden. \"--subdir\" angeben?" #: ../fdroidserver/import.py ../fdroidserver/common.py msgid "No information found." @@ -1332,9 +1331,8 @@ msgid "Now set these in config.py:" msgstr "Legen Sie diese nun in der config.py fest:" #: ../fdroidserver/init.py -#, fuzzy msgid "Now set these in config.yml:" -msgstr "Legen Sie diese nun in der config.py fest:" +msgstr "Legen Sie diese nun in der config.yml fest:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1809,9 +1807,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "Um awsbucket zu benutzen, müssen awssecretkey und awsaccesskeyid auch in der config.py gesetzt sein!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Um awsbucket zu benutzen, müssen awssecretkey und awsaccesskeyid auch in der config.py gesetzt sein!" +msgstr "Um awsbucket zu benutzen, müssen awssecretkey und awsaccesskeyid auch in der config.yml gesetzt sein!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1870,9 +1867,9 @@ msgid "Unknown metadata format: {path}" msgstr "Unbekanntes Metadaten-Format: {path}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" -msgstr "Unbekanntes Metadaten-Format: {path}" +msgstr "Unbekanntes Metadaten-Format: {path} (benutze: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " @@ -2210,7 +2207,7 @@ msgstr "„%s” konnte nicht geöffnet werden: %s" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" -msgstr "" +msgstr "Konnte die benötigten srclibs nicht finden: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2356,7 +2353,7 @@ msgstr "git svn Klonen fehlgeschlagen" #: ../fdroidserver/scanner.py msgid "gzip file archive" -msgstr "" +msgstr "gzip Dateiarchiv" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2541,11 +2538,11 @@ msgstr "Download über ungesicherte HTTP-Verbindung verweigert (verwenden Sie HT #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." -msgstr "" +msgstr "repo_icon %s existiert nicht, erzeuge Platzhalter." #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" +msgstr "ruamel.yaml ist nicht installiert, kann Metadaten nicht schreiben" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -2590,7 +2587,7 @@ msgstr "Srclibs-Name fehlt und/oder @" #: ../fdroidserver/scanner.py msgid "static library" -msgstr "" +msgstr "statische Bibliothek" #: ../fdroidserver/common.py #, python-brace-format @@ -2646,7 +2643,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "wiki support is deprecated and will be removed in the next release!" -msgstr "" +msgstr "Die wiki-Unterstützung ist veraltet und wird in der nächsten Version entfernt!" #: ../fdroidserver/publish.py #, python-brace-format @@ -2724,7 +2721,7 @@ msgstr "{appid}: {field} muss ein '{type}' sein, ist aber ein '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" -msgstr "" +msgstr "{build_flag} muss ein Integer sein: {value}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2734,7 +2731,7 @@ msgstr "{field} nicht in {name} beendet" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" -msgstr "" +msgstr "{file} ist leer oder beschädigt!" #: ../fdroidserver/update.py #, python-brace-format @@ -2744,12 +2741,12 @@ msgstr "{name} \"{path}\" existiert nicht! Korrigieren Sie es in der config.py." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "{oldfile} ist veraltet, benutze {newfile}" #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" -msgstr "" +msgstr "{path} existiert schon, importierte Ergebnisse werden nicht berücksichtigt!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2769,7 +2766,7 @@ msgstr "{path} hat Dateigröße Null!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" -msgstr "" +msgstr "{path} ist größer als 200MB und muss manuell zu {url} hochgeladen werden" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2777,9 +2774,9 @@ msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} endet nicht mit \"fdroid\", überprüfen Sie den URL-Pfad!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{url} does not start with \"http\"!" -msgstr "{url} endet nicht mit \"fdroid\", überprüfen Sie den URL-Pfad!" +msgstr "{url} beginnt nicht mit \"http\"!" #: ../fdroidserver/build.py msgid "{} build failed" From 5c33010997874cfbac88b92720af22879e09bfec Mon Sep 17 00:00:00 2001 From: Adolfo Jayme Barrientos Date: Fri, 29 Jan 2021 11:52:14 +0100 Subject: [PATCH 0107/2116] Translated using Weblate: Spanish (es) by Adolfo Jayme Barrientos Currently translated at 99.8% (587 of 588 strings) Co-authored-by: Adolfo Jayme Barrientos Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ Translation: F-Droid/F-Droid Server --- locale/es/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 3b74eefe..5e5a4b08 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -6,13 +6,14 @@ # Hans-Christoph Steiner , 2020, 2021. # Alvaro , 2020. # Fioddor Superconcentrado , 2021. +# Adolfo Jayme Barrientos , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-15 13:24+0000\n" -"Last-Translator: Fioddor Superconcentrado \n" +"PO-Revision-Date: 2021-01-24 08:48+0000\n" +"Last-Translator: Adolfo Jayme Barrientos \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" @@ -484,7 +485,7 @@ msgstr "Lista de categorías separadas por comas." #: ../fdroid ../fdroidserver/__main__.py #, c-format, python-format msgid "Command '%s' not recognised.\n" -msgstr "Comando %s no reconocido\n" +msgstr "No se reconoció la orden «%s».\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" @@ -712,7 +713,7 @@ msgstr "Enlace duplicado en '{field}': {url}" #: ../fdroid msgid "Dynamically scan APKs post build" -msgstr "Ejecutar Fdroid dscanner de una aplicación APK, previamente construída," +msgstr "Escanear dinámicamente los APKs después de ser construidos" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" From d630fac7355f2a199fdf122eb705b20d962445a4 Mon Sep 17 00:00:00 2001 From: WaldiS Date: Fri, 29 Jan 2021 11:52:14 +0100 Subject: [PATCH 0108/2116] Translated using Weblate: Polish (pl) by WaldiS Currently translated at 99.4% (585 of 588 strings) Translated using Weblate: Polish (pl) by WaldiS Currently translated at 99.4% (585 of 588 strings) Co-authored-by: WaldiS Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ Translation: F-Droid/F-Droid Server --- locale/pl/LC_MESSAGES/fdroidserver.po | 117 ++++++++++++-------------- 1 file changed, 52 insertions(+), 65 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index c4f9c3ea..1d1161fc 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -1,6 +1,6 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# WaldiS , 2020. +# WaldiS , 2020, 2021. # Michal L , 2020, 2021. # mondstern , 2021. msgid "" @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-14 14:58+0000\n" -"Last-Translator: mondstern \n" +"PO-Revision-Date: 2021-01-28 21:24+0000\n" +"Last-Translator: WaldiS \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" @@ -151,9 +151,8 @@ msgid "'keypass' not found in config.py!" msgstr "'keypass' nie znaleziono w config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keypass' not found in config.yml!" -msgstr "'keypass' nie znaleziono w config.py!" +msgstr "'keypass' nie znaleziono w config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" @@ -164,27 +163,24 @@ msgid "'keystore' not found in config.py!" msgstr "'Plik kluczy' nie został znaleziony w pliku config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystore' not found in config.yml!" -msgstr "'Plik kluczy' nie został znaleziony w pliku config.py!" +msgstr "'keystore' nie znaleziono w config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "'keystorepass' nie znaleziono w config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' nie znaleziono w config.py!" +msgstr "'keystorepass' nie znaleziono w config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "'repo_keyalias' nie znaleziono w config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' nie znaleziono w config.py!" +msgstr "'repo_keyalias' nie znaleziono w config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -196,9 +192,8 @@ msgid "'sdk_path' not set in 'config.py'!" msgstr "'sdk_path' nie jest ustawiony w 'config.py'!" #: ../fdroidserver/common.py -#, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "'sdk_path' nie jest ustawiony w 'config.py'!" +msgstr "'sdk_path' nie jest ustawiony w config.yml!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -315,9 +310,9 @@ msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "Android SDK '{path}' nie jest '{dirname}' zainstalowany!" #: ../fdroidserver/init.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "Nie znaleziono Android SDK!" +msgstr "Nie znaleziono zestawu SDK systemu Android pod adresem {path}!" #: ../fdroidserver/common.py msgid "Android SDK not found!" @@ -334,9 +329,9 @@ msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK ścieżka '{path}' nie jest katalogiem!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "Nie znaleziono Android SDK!" +msgstr "Android SDK narzędzie {cmd} znaleziono!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -500,7 +495,7 @@ msgstr "Sprzeczne argumenty: '--verbose' i '--quiet' nie mogą być podane w tym #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "Pliki konfiguracyjne powodujące konflikt! Używając {newfile}, ignoruje {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format @@ -521,9 +516,9 @@ msgid "Could not find {path} to remove it" msgstr "Nie można znaleźć pliku {path}, aby go usunąć" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "Nie można otworzyć pliku APK do analizy" +msgstr "Nie można otworzyć pliku APK {path} do analizy: " #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" @@ -532,7 +527,7 @@ msgstr "Nie można otworzyć pliku APK do analizy" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" -msgstr "" +msgstr "Nie można przeanalizować rozmiaru \"{size}\", nieprawidłowy typ \"{type}\"" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/import.py @@ -741,7 +736,7 @@ msgstr "Opróżnij flagę kompilacji na {linedesc}" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "" +msgstr "Kodowanie jest ustawione na '{enc}'. Fdroid może napotkać problemy z kodowaniem. Aby uzyskać najlepsze wyniki, ustaw go na 'UTF-8'." #: ../fdroidserver/init.py #, python-format @@ -755,7 +750,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "Zmienna środowiskowa {var} z {configname} nie jest ustawiona!" #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py @@ -856,7 +851,7 @@ msgstr "Metody flattr donation należą do flagi FlattrID" #: ../fdroidserver/lint.py #, fuzzy msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Metody flattr donation należą do flagi FlattrID" +msgstr "Metody darowizn Flattr należą do FlattrID: field" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" @@ -883,7 +878,7 @@ msgstr "Znaleziono \"{path}\" grafiki bez metadanych dla aplikacji \"{name}\"!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" -msgstr "" +msgstr "Znaleziono zły plik finansowania \"{path}\" dla \"{name}\":" #: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" @@ -895,9 +890,9 @@ msgid "Found invalid versionCodes for some apps" msgstr "Znaleziono nieprawidłowe kody wersji dla niektórych aplikacji" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "Znaleziono wiele certyfikatów do podpisywania w {path}" +msgstr "Znaleziono wiele plików bloków podpisów JAR w {path}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -950,9 +945,9 @@ msgid "Git remote set-head failed" msgstr "Git remote set-head nie powiódł się" #: ../fdroidserver/common.py -#, fuzzy, python-format +#, python-format msgid "Git remote set-head failed: \"%s\"" -msgstr "Operacja Git remote set-head nie powiodła się: \"%s\"" +msgstr "Błąd zdalnego ustawiania Git: \"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" @@ -987,7 +982,7 @@ msgstr "Ignorowanie metadanych '{field}' w '{metapath}' ponieważ są one przest #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" -msgstr "" +msgstr "Ignorowanie wpisu FUNDING.yml dłuższego niż 2048: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1177,14 +1172,14 @@ msgid "Keystore for signing key:\t" msgstr "Magazyn kluczy do podpisywania klucza:\t" #: ../fdroidserver/lint.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "Ostatnio używany commit '{commit}' wygląda jak tag, ale tryb sprawdzania aktualizacji to '{ucm}'" +msgstr "Ostatnio używane zatwierdzenie '{commit}' wygląda jak tag, ale UpdateCheckMode to '{ucm}'" #: ../fdroidserver/lint.py #, fuzzy msgid "Liberapay donation methods belong in the Liberapay: field" -msgstr "Metody darowizny Liberapay należą do flagi LiberapayID" +msgstr "Metody darowizny Liberapay należą do liberapay: field" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the LiberapayID flag" @@ -1245,9 +1240,8 @@ msgid "No commit specified for {versionName} in {linedesc}" msgstr "Nie określono zatwierdzenia dla {versionName} w {linedesc}" #: ../fdroidserver/common.py -#, fuzzy msgid "No config.yml found, using defaults." -msgstr "Nie znaleziono pliku 'config.py', używając wartości domyślnych." +msgstr "Nie znaleziono pliku config.yml, przy użyciu wartości domyślnych." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1328,9 +1322,8 @@ msgid "Now set these in config.py:" msgstr "Teraz ustaw je w config.py:" #: ../fdroidserver/init.py -#, fuzzy msgid "Now set these in config.yml:" -msgstr "Teraz ustaw je w config.py:" +msgstr "Teraz ustaw je w config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1375,7 +1368,7 @@ msgstr "Przetwarzaj tylko aplikacje z automatycznymi aktualizacjami" #: ../fdroidserver/lint.py #, fuzzy msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "Metody flattr donation należą do flagi FlattrID" +msgstr "Metody darowizn OpenCollective należą do OpenCollective: field" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -1730,9 +1723,9 @@ msgid "Striping mystery signature from {apkfilename}" msgstr "Odrysowywanie tajemniczego podpisu od {apkfilename}" #: ../fdroidserver/nightly.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Stripping mystery signature from {apkfilename}" -msgstr "Odrysowywanie tajemniczego podpisu od {apkfilename}" +msgstr "Usuwanie tajemniczego podpisu z {apkfilename}" #: ../fdroidserver/lint.py #, python-format @@ -1806,9 +1799,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "Aby użyć awsbucket, awssecretkey i awsaccesskeyid muszą być również ustawione w config.py!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Aby użyć awsbucket, awssecretkey i awsaccesskeyid muszą być również ustawione w config.py!" +msgstr "Aby użyć awsbucket, awssecretkey i awsaccesskeyid muszą być również ustawione w config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1843,7 +1835,7 @@ msgstr "Nieoczekiwany tekst w tej samej linii co {field} w {linedesc}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "" +msgstr "Nieznany wpis {key} w {configname}" #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" @@ -1995,14 +1987,12 @@ msgstr "UpdateCheckMode jest ustawione, ale wygląda na to, że checkupdates nie #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -#, fuzzy msgid "UpdateCheckName is set to the known application ID - it can be removed" -msgstr "UpdateCheckName (Nazwa sprawdzania aktualizacji) jest ustawiona na znany identyfikator aplikacji - można go usunąć" +msgstr "UpdateCheckName jest ustawiony na znany identyfikator aplikacji - można go usunąć" #: ../fdroidserver/lint.py -#, fuzzy msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "UpdateCheckName (Nazwa sprawdzania aktualizacji) jest ustawiona na znany identyfikator aplikacji, można go usunąć" +msgstr "UpdateCheckName jest ustawiony na znany identyfikator aplikacji, można go usunąć" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2095,7 +2085,7 @@ msgstr "Weryfikowanie podpisu indeksu:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "" +msgstr "Klucz VirusTotal API nie może przesyłać plików większych niż 32 MB, użyj {url}, aby przesłać {path}." #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" @@ -2152,16 +2142,14 @@ msgstr "apksigner nie znaleziono, jest wymagane do podpisania!" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "application ID of file to operate on" -msgstr "applicationId, aby sprawdzić dostępność aktualizacji" +msgstr "Identyfikator aplikacji, na której ma działać" #: ../fdroidserver/verify.py ../fdroidserver/publish.py #: ../fdroidserver/build.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py -#, fuzzy msgid "application ID with optional versionCode in the form APPID[:VERCODE]" -msgstr "applicationId z opcjonalnym versionCode w postaci APPID [:VERCODE]" +msgstr "identyfikator aplikacji z opcjonalnym kodem wersji w postaci APPID [: VERCODE]" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py msgid "applicationId in the form APPID" @@ -2185,9 +2173,8 @@ msgid "argument \"-\" with mode %r" msgstr "argument \"-\" w trybie %r" #: ../fdroidserver/nightly.py -#, fuzzy msgid "attempting bare SSH connection to test deploy key:" -msgstr "próbując odsłoniętego połączenia ssh, aby przetestować klucz wdrożenia:" +msgstr "próba połączenia odsłoniętego SSH w celu przetestowania klucza wdrożenia:" #: ../fdroidserver/nightly.py msgid "attempting bare ssh connection to test deploy key:" @@ -2258,7 +2245,7 @@ msgstr "kopiowanie {apkfilename} na {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" -msgstr "" +msgstr "nie można przeanalizować '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" @@ -2266,7 +2253,7 @@ msgstr "could not parse srclib spec (no ref specified):' {}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" +msgstr "nie można przeanalizować specyfikacji srclib (za dużo znaków '@'): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2286,7 +2273,7 @@ msgstr "wdrożone dzienniki kompilacji do '{path}'" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" -msgstr "" +msgstr "wdrożony dziennik procesów {path} do {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2524,7 +2511,7 @@ msgstr "argumenty pozycyjne" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" -msgstr "" +msgstr "proces wdrażania dziennika {path} do {dest} nie powiódł się!" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2539,7 +2526,7 @@ msgstr "odmów pobierania przez niezabezpieczone połączenie http (użyj https #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." -msgstr "" +msgstr "repo_icon %s nie istnieje, generuje symbol zastępczy." #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." @@ -2670,9 +2657,9 @@ msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "{apkfilename} AndroidManifest.xml ma złą datę: " #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{appid} does not have a name! Using application ID instead." -msgstr "{appid} nie ma nazwy! Zamiast tego użyj nazwy pakietu." +msgstr "{appid} nie ma nazwy! Zamiast tego używam identyfikatora aplikacji." #: ../fdroidserver/update.py #, python-brace-format @@ -2685,9 +2672,9 @@ msgid "{appid} from {path} is not a valid Android Package Name!" msgstr "{appid} z {path} nie jest prawidłową nazwą pakietu Android!" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" -msgstr "{appid} z {path} nie jest prawidłową nazwą pakietu Android!" +msgstr "{appid} z {path} nie jest prawidłowym identyfikatorem aplikacji na system Android!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format @@ -2723,7 +2710,7 @@ msgstr "{appid}: {field} musi być '{type}', ale to jest '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" -msgstr "" +msgstr "{build_flag} musi być liczbą całkowitą, znaleziono: {value}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2743,7 +2730,7 @@ msgstr "{name} \"{path}\" nie istnieje! Popraw go w config.py." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "{oldfile} jest przestarzałe, użyj {newfile}" #: ../fdroidserver/import.py #, python-brace-format From c1a08e4ba6ee64698c7914fe5c433d1c4ad8a5f6 Mon Sep 17 00:00:00 2001 From: Vincent Finance Date: Fri, 29 Jan 2021 11:52:15 +0100 Subject: [PATCH 0109/2116] Translated using Weblate: French (fr) by Vincent Finance Currently translated at 87.9% (517 of 588 strings) Co-authored-by: Vincent Finance Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 78ed58fd..04eff08a 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -22,13 +22,14 @@ # Adrien le Maire , 2021. # gub , 2021. # ButterflyOfFire , 2021. +# Vincent Finance , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-15 22:57+0000\n" -"Last-Translator: ButterflyOfFire \n" +"PO-Revision-Date: 2021-01-27 00:33+0000\n" +"Last-Translator: Vincent Finance \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -62,7 +63,6 @@ msgstr "" "Clé Publique SSH à utiliser comme Clé de Déploiement :" #: ../fdroidserver/nightly.py -#, fuzzy msgid "" "\n" "SSH public key to be used as deploy key:" @@ -105,7 +105,7 @@ msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "\"{path}\" existe mais s3cmd n'est pas installé !" #: ../fdroidserver/lint.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "\"{path}\" n'est pas un format supporté (utiliser : metadata/*.yml)" @@ -2085,9 +2085,8 @@ msgid "Valid commands are:" msgstr "Les commandes valides sont les suivantes :" #: ../fdroidserver/verify.py -#, fuzzy msgid "Verify against locally cached copy rather than redownloading." -msgstr "Vérifier dans le cache plutôt que de retélécharger." +msgstr "Vérifier dans le cache plutôt que de télécharger à nouveau." #: ../fdroid ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" @@ -2126,7 +2125,6 @@ msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "Vous pouvez utiliser ANDROID_HOME pour définir le chemin de votre SDK, ex. :" #: ../fdroidserver/scanner.py -#, fuzzy msgid "ZIP file archive" msgstr "Archive ZIP" @@ -2244,7 +2242,6 @@ msgstr "commandes des modules d'extension :" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py -#, fuzzy msgid "complex" msgstr "complexe" @@ -2257,12 +2254,12 @@ msgstr[0] "" msgstr[1] "" #: ../fdroidserver/nightly.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "copying {apkfilename} into {path}" msgstr "copie de {apkfilename} dans {path} en cours" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "could not parse '{path}'" msgstr "impossible de lire '{path}'" @@ -2429,7 +2426,6 @@ msgid "no \"icon\" in {appid}" msgstr "aucune \"icon\" dans {appid}" #: ../fdroidserver/signatures.py -#, fuzzy msgid "no APK supplied" msgstr "aucun APK n’est fourni" From 79e641a535c55f7fec3746fac0604a3bdff4c3bb Mon Sep 17 00:00:00 2001 From: gub Date: Fri, 29 Jan 2021 11:52:15 +0100 Subject: [PATCH 0110/2116] Translated using Weblate: French (fr) by gub Currently translated at 87.9% (517 of 588 strings) Co-authored-by: gub Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 04eff08a..7f4ade42 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -29,7 +29,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-27 00:33+0000\n" -"Last-Translator: Vincent Finance \n" +"Last-Translator: gub \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2340,7 +2340,7 @@ msgstr "fdroid [] [-h|--help|--version|]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "floating-point" -msgstr "" +msgstr "virgule flottante" #: ../fdroidserver/metadata.py msgid "force errors to be warnings, or ignore" From 5d61429d1f2c1663367d8b806e11237e0f910645 Mon Sep 17 00:00:00 2001 From: hilariousperson Date: Fri, 29 Jan 2021 11:52:15 +0100 Subject: [PATCH 0111/2116] Translated using Weblate: French (fr) by hilariousperson Currently translated at 87.9% (517 of 588 strings) Co-authored-by: hilariousperson Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 7f4ade42..c0a7dd18 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -29,7 +29,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" "PO-Revision-Date: 2021-01-27 00:33+0000\n" -"Last-Translator: gub \n" +"Last-Translator: hilariousperson \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -1886,11 +1886,11 @@ msgstr "" #: ../fdroidserver/lint.py msgid "Unnecessary leading space" -msgstr "" +msgstr "Espace non nécessaire au début" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" -msgstr "" +msgstr "Espace non-nécessaire à la fin" #: ../fdroidserver/metadata.py #, python-brace-format From 6616b1cec2b5460633af6a78132a7b7dc20d6e6a Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Fri, 29 Jan 2021 11:52:16 +0100 Subject: [PATCH 0112/2116] Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk Currently translated at 100.0% (588 of 588 strings) Co-authored-by: Ihor Hordiichuk Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 4970c325..18eb86d0 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-14 21:33+0000\n" +"PO-Revision-Date: 2021-01-27 00:33+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" "Language: uk\n" @@ -941,12 +941,12 @@ msgstr "Git вибірка не вдалася" #: ../fdroidserver/common.py msgid "Git remote set-head failed" -msgstr "Не вдалося встановити пульт дистанційного керування Git" +msgstr "Не вдалося налаштувати remote set-head для Git" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" -msgstr "Помилка зовнішнього налаштування Git: \"%s\"" +msgstr "Помилка налаштування remote set-head для Git: «%s»" #: ../fdroidserver/common.py msgid "Git reset failed" @@ -1485,7 +1485,7 @@ msgstr "Слід уникати пунктуації" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" -msgstr "Натисніть вхід цього віддаленого сховища git" +msgstr "Надіслати журнал цього віддаленого репозиторію git" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format From e6bcafdb513f934e4c3478c6fc7a8f0cd1dc73ac Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 29 Jan 2021 11:52:16 +0100 Subject: [PATCH 0113/2116] fixed checks in Weblate Translated using Weblate: Albanian (sq) by Hans-Christoph Steiner Currently translated at 95.0% (559 of 588 strings) Translated using Weblate: Polish (pl) by Hans-Christoph Steiner Currently translated at 99.6% (586 of 588 strings) Translated using Weblate: Korean (ko) by Hans-Christoph Steiner Currently translated at 35.3% (208 of 588 strings) Translated using Weblate: French (fr) by Hans-Christoph Steiner Currently translated at 87.9% (517 of 588 strings) Translated using Weblate: Spanish (es) by Hans-Christoph Steiner Currently translated at 99.8% (587 of 588 strings) Translated using Weblate: Chinese (Simplified) (zh_Hans) by Hans-Christoph Steiner Currently translated at 36.2% (213 of 588 strings) Translated using Weblate: Chinese (Traditional) (zh_Hant) by Hans-Christoph Steiner Currently translated at 80.9% (476 of 588 strings) Co-authored-by: Hans-Christoph Steiner Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ko/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hant/ Translation: F-Droid/F-Droid Server --- locale/es/LC_MESSAGES/fdroidserver.po | 6 +++--- locale/fr/LC_MESSAGES/fdroidserver.po | 6 +++--- locale/ko/LC_MESSAGES/fdroidserver.po | 25 +++++++++++----------- locale/pl/LC_MESSAGES/fdroidserver.po | 8 +++---- locale/sq/LC_MESSAGES/fdroidserver.po | 14 ++++++------ locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 7 +++--- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 14 ++++++------ 7 files changed, 40 insertions(+), 40 deletions(-) diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 5e5a4b08..2ce455a2 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -12,8 +12,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-24 08:48+0000\n" -"Last-Translator: Adolfo Jayme Barrientos \n" +"PO-Revision-Date: 2021-01-28 22:09+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" @@ -713,7 +713,7 @@ msgstr "Enlace duplicado en '{field}': {url}" #: ../fdroid msgid "Dynamically scan APKs post build" -msgstr "Escanear dinámicamente los APKs después de ser construidos" +msgstr "Escanear dinámicamente los APKs después de ser construidos" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index c0a7dd18..694e7635 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -28,8 +28,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-27 00:33+0000\n" -"Last-Translator: hilariousperson \n" +"PO-Revision-Date: 2021-01-28 22:09+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2198,7 +2198,7 @@ msgstr "tentative de connexion ssh simple pour tester la clé de déploiement :" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" -msgstr "Impossible de parcourir la spécification de scrlib (pas une chaîne de caractères): '{}'" +msgstr "Impossible de parcourir la spécification de srclib (pas une chaîne de caractères) : '{}'" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index f5fbe4d7..bbdeeb3f 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -1,12 +1,12 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# Hans-Christoph Steiner , 2020. +# Hans-Christoph Steiner , 2020, 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2020-11-10 16:20+0000\n" +"PO-Revision-Date: 2021-01-28 22:09+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Korean \n" "Language: ko\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.4-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py msgid "" @@ -297,9 +297,8 @@ msgid "Android APK file" msgstr "" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Android DEX code" -msgstr "Android SDK를 찾을 수 없습니다!" +msgstr "" #: ../fdroidserver/common.py ../fdroidserver/build.py #, python-brace-format @@ -307,9 +306,9 @@ msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "Android SDK '{path}'는 설치된 '{dirname}'가 없습니다!" #: ../fdroidserver/init.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "Android SDK를 찾을 수 없습니다!" +msgstr "{path}에서 Android SDK를 찾을 수 없습니다!" #: ../fdroidserver/common.py msgid "Android SDK not found!" @@ -326,9 +325,9 @@ msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK 경로 '{path}'는 디렉터리가 아닙니다!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "Android SDK를 찾을 수 없습니다!" +msgstr "" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -423,9 +422,9 @@ msgid "Cannot resolve application ID {appid}" msgstr "앱 id {appid}를 해결할 수 없습니다" #: ../fdroidserver/rewritemeta.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Cannot rewrite \"{path}\"" -msgstr "\"{path}\"를 읽을 수 없습니다!" +msgstr "" #: ../fdroidserver/rewritemeta.py msgid "Cannot use --list and --to at the same time" @@ -2180,9 +2179,9 @@ msgid "can't open '%s': %s" msgstr "'%s'를 열 수 없습니다: %s" #: ../fdroidserver/build.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "cannot find required srclibs: \"{path}\"" -msgstr "{path}를 위한 appid를 찾을 수 없습니다!" +msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 1d1161fc..8deb56b8 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -3,13 +3,14 @@ # WaldiS , 2020, 2021. # Michal L , 2020, 2021. # mondstern , 2021. +# Hans-Christoph Steiner , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-28 21:24+0000\n" -"Last-Translator: WaldiS \n" +"PO-Revision-Date: 2021-01-28 22:09+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" @@ -1177,9 +1178,8 @@ msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{uc msgstr "Ostatnio używane zatwierdzenie '{commit}' wygląda jak tag, ale UpdateCheckMode to '{ucm}'" #: ../fdroidserver/lint.py -#, fuzzy msgid "Liberapay donation methods belong in the Liberapay: field" -msgstr "Metody darowizny Liberapay należą do liberapay: field" +msgstr "Metody darowizny Liberapay należą do Liberapay: field" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the LiberapayID flag" diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index 8bb9bfe3..dd3e8fca 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-14 14:58+0000\n" +"PO-Revision-Date: 2021-01-28 22:09+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Albanian \n" "Language: sq\n" @@ -313,9 +313,9 @@ msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "Android SDK '{path}' s’ka '{dirname}' të instaluar!" #: ../fdroidserver/init.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "S’u gjet SDK Android-i!" +msgstr "S’u gjet SDK Android-i në {path}!" #: ../fdroidserver/common.py msgid "Android SDK not found!" @@ -332,9 +332,9 @@ msgid "Android SDK path '{path}' is not a directory!" msgstr "Shtegu Android SDK '{path}' s’është drejtori!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "S’u gjet SDK Android-i!" +msgstr "" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -518,9 +518,9 @@ msgid "Could not find {path} to remove it" msgstr "S’u gjet dot {path} për ta hequr" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "S’u hap dot kartela apk për analizim" +msgstr "S’u hap dot kartela APK {path} për analizim " #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index bc65ef32..2393eac7 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -6,13 +6,14 @@ # taiyuan <1006333969@qq.com>, 2020. # Eric , 2020, 2021. # Carlos , 2021. +# Hans-Christoph Steiner , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-15 13:24+0000\n" -"Last-Translator: Eric \n" +"PO-Revision-Date: 2021-01-28 22:09+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" @@ -408,7 +409,7 @@ msgstr "" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" -msgstr "" +msgstr "使用此配置并基于 \"%s\" 的构建储存库:" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 7141806a..5c6be6e8 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-14 14:58+0000\n" +"PO-Revision-Date: 2021-01-28 22:09+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Chinese (Traditional) \n" "Language: zh_Hant\n" @@ -308,9 +308,9 @@ msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "Android SDK '{path}' 並未安裝 '{dirname}'!" #: ../fdroidserver/init.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "找不到 Android SDK!" +msgstr "在{path}找不到Android SDK!" #: ../fdroidserver/common.py msgid "Android SDK not found!" @@ -327,9 +327,9 @@ msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK 路徑 '{path}' 不是目錄資料夾!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "找不到 Android SDK!" +msgstr "" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -514,9 +514,9 @@ msgid "Could not find {path} to remove it" msgstr "無法找到 {path} 來移除" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "無法開啟 apk 檔案作分析" +msgstr "無法開啟 APK 檔{path}案作分析 : " #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" From 2a21de2b39c6bfa7662849119a2ec87ab7f19646 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Fri, 29 Jan 2021 11:52:17 +0100 Subject: [PATCH 0114/2116] Translated using Weblate: Albanian (sq) by Besnik Bleta Currently translated at 96.0% (565 of 588 strings) Co-authored-by: Besnik Bleta Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/ Translation: F-Droid/F-Droid Server --- locale/sq/LC_MESSAGES/fdroidserver.po | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index dd3e8fca..7a7ec009 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -7,8 +7,8 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-28 22:09+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2021-01-29 10:51+0000\n" +"Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" "Language: sq\n" "MIME-Version: 1.0\n" @@ -149,9 +149,8 @@ msgid "'keypass' not found in config.py!" msgstr "S’u gjet 'keypass' në config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keypass' not found in config.yml!" -msgstr "S’u gjet 'keypass' në config.py!" +msgstr "S’u gjet 'keypass' në config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" @@ -162,27 +161,24 @@ msgid "'keystore' not found in config.py!" msgstr "S’u gjet 'keystore' në config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystore' not found in config.yml!" -msgstr "S’u gjet 'keystore' në config.py!" +msgstr "S’u gjet 'keystore' në config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "S’u gjet 'keystorepass' te config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystorepass' not found in config.yml!" -msgstr "S’u gjet 'keystorepass' te config.py!" +msgstr "S’u gjet 'keystorepass' te config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "S’u gjet 'repo_keyalias' te config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'repo_keyalias' not found in config.yml!" -msgstr "S’u gjet 'repo_keyalias' te config.py!" +msgstr "S’u gjet 'repo_keyalias' te config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -194,9 +190,8 @@ msgid "'sdk_path' not set in 'config.py'!" msgstr "'sdk_path' te 'config.py' s’është ujdisur!" #: ../fdroidserver/common.py -#, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "'sdk_path' te 'config.py' s’është ujdisur!" +msgstr "'sdk_path' te 'config.yml' s’është ujdisur!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -334,7 +329,7 @@ msgstr "Shtegu Android SDK '{path}' s’është drejtori!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "" +msgstr "U gjet {cmd} mjeti SDK-je Android!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -342,7 +337,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Android build-tools path '{path}' does not exist!" -msgstr "Shtegu për build-tools Android '{path}' s’ekziston!" +msgstr "Shtegu për build-tools '{path}' s’ekziston!" #: ../fdroidserver/update.py msgid "AndroidManifest.xml has no date" @@ -520,7 +515,7 @@ msgstr "S’u gjet dot {path} për ta hequr" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "S’u hap dot kartela APK {path} për analizim " +msgstr "S’u hap dot kartela APK {path} për analizim : " #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" From b04b59dfc5841d39efc3d959c6aa6d8a846c44fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C8=98erb=C4=83nescu?= Date: Fri, 29 Jan 2021 11:52:00 +0100 Subject: [PATCH 0115/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Roman?= =?UTF-8?q?ian=20(ro)=20by=20Daniel=20=C8=98erb=C4=83nescu=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 2.8% (17 of 588 strings) Added translation using Weblate: Romanian (ro) by Daniel Șerbănescu Co-authored-by: Daniel Șerbănescu Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ro/ Translation: F-Droid/F-Droid Server --- locale/ro/LC_MESSAGES/fdroidserver.po | 2761 +++++++++++++++++++++++++ 1 file changed, 2761 insertions(+) create mode 100644 locale/ro/LC_MESSAGES/fdroidserver.po diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po new file mode 100644 index 00000000..3dba66f1 --- /dev/null +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -0,0 +1,2761 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# Daniel Șerbănescu , 2021. +msgid "" +msgstr "" +"Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" +"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"PO-Revision-Date: 2021-01-14 21:33+0000\n" +"Last-Translator: Daniel Șerbănescu \n" +"Language-Team: Romanian \n" +"Language: ro\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n" +"X-Generator: Weblate 4.5-dev\n" + +#: ../fdroidserver/common.py +msgid "" +"\n" +" This is a repository of apps to be used with FDroid. Applications in this\n" +" repository are either official binaries built by the original application\n" +" developers, or are binaries built from source by f-droid.org using the\n" +" tools on https://gitlab.com/fdroid.\n" +" " +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH Public Key to be used as Deploy Key:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH public key to be used as deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "" +"\n" +"{path} encoded for the DEBUG_KEYSTORE secret variable:" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "\"%s/\" has no matching metadata file!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "\"{apkfilename}\" is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains outdated {name} ({version})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains recent {name} ({version})" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "\"{path}\" exists but s3cmd is not installed!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "\"{path}\" is not an accepted format, convert to: {formats}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "\"{url}\" is not a valid URL!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "%(option)s option requires %(number)d argument" +msgid_plural "%(option)s option requires %(number)d arguments" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../fdroidserver/mirror.py +#, python-format +msgid "%(prog)s [options] url" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "%(prog)s: error: %(message)s\n" +msgstr "%(prog)s: eroare: %(message)s\n" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "%d problems found" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "%prog [options]" +msgstr "%prog [opțiuni]" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "%r is not callable" +msgstr "%r nu este apelabil" + +#: ../fdroidserver/lint.py +#, python-format +msgid "%s is not an accepted build field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "%s option does not take a value" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keypass' not found in config.py!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' is NONE and 'smartcardoptions' is blank!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keystore' not found in config.py!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keystorepass' not found in config.py!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.py!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "'required' is an invalid argument for positionals" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in 'config.py'!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + +#. Translators: "build-tools" is the file name of a package from +#. Google, it is part of the Android SDK. So it probably shouldn't be +#. translated or transliterated. +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-23.0.0 or newer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "'{apkfilename}' is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{field}' in {linedesc} is obsolete, see docs for current fields:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{path}' failed to execute!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "...checkupdate failed for {appid} : {error}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid ".__call__() not defined" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "/issues is missing" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "A URL is required as an argument!" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Add PGP signatures using GnuPG for packages in repo" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Add a new application from its source code" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add a repo signing key to an unsigned repo" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add skeleton metadata files for APKs that are missing them" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Adding new repo for only {name}" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Alias of the repo signing key in the keystore" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Also mirror the full archive section" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Also warn about formatting issues, like rewritemeta -l" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android AAR library" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android APK file" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android DEX code" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/build.py +#, python-brace-format +msgid "Android SDK '{path}' does not have '{dirname}' installed!" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Android SDK not found!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' is not a directory!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + +#. Translators: "build-tools" is the file name of a package from +#. Google, it is part of the Android SDK. So it probably shouldn't be +#. translated or transliterated. +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android build-tools path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/update.py +msgid "AndroidManifest.xml has no date" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "App is in '{repo}' but has a link to {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Appending .git is not necessary" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Archiving {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in srclib '{srclib}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Broken symlink: {path}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Build a package from source" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build all applications available" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Build generated by `fdroid import` - remove disable line once ready" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Build metadata git repo has uncommited changes!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build only the latest version of each package" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "Built repo based in \"%s\" with this config:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Can't build due to {} error while scanning" +msgid_plural "Can't build due to {} errors while scanning" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../fdroidserver/vmtools.py +#, python-brace-format +msgid "Cannot read \"{path}\"!" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Cannot resolve application ID {appid}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Cannot rewrite \"{path}\"" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "Cannot use --list and --to at the same time" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Categories '%s' is not valid" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Categories are not set" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Check for updates to applications" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean after all scans have finished" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean before the scans start and rebuild the container" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean up all containers and then exit" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Clean update - don't uses caches, reprocess all APKs" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Comma separated list of categories." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +#, c-format, python-format +msgid "Command '%s' not recognised.\n" +msgstr "Comanda „%s” nerecunoscută.\n" + +#: ../fdroidserver/checkupdates.py +msgid "Commit changes" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not find '{command}' on your system" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Could not find latest version code" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Could not find latest version name" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not find {path} to remove it" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + +#: ../fdroidserver/update.py +msgid "Could not open apk file for analysis" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not parse size \"{size}\", wrong type \"{type}\"" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/import.py +msgid "Couldn't find Application ID" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/import.py +msgid "Couldn't find latest version code" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/import.py +msgid "Couldn't find latest version name" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Couldn't find package ID" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Cowardily refusing to overwrite existing signing key setup!" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Create a repo signing key in a keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Create skeleton metadata files that are missing" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Created new container \"{name}\"" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Creating \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating log directory" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Creating new S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating output directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating signed index with this key (SHA256):" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/verify.py +#: ../fdroidserver/publish.py +msgid "Creating temporary directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating unsigned index in preparation for signing" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "DEBUG_KEYSTORE is not set or the value is incomplete" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Delete APKs and/or OBBs without metadata from the repo" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting archive, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Deleting unknown file: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description '%s' is just the app's summary" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Description has a duplicate line" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Description of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Do not add 'disable:' to the generated build entries" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not deploy the new files to the repo" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Do not include \"{path}\" in URL!" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Do not prompt for Android SDK path, just fail" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not remove the private keys generated from the keystore" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't create a source tarball, useful when testing a build" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Don't do anything logs-related" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/nightly.py +#: ../fdroidserver/upload.py +msgid "Don't use rsync checksums" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Download complete mirrors of small repos" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Download logs we don't have" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Downloading the repository already failed once, not trying again." +msgstr "" + +#: ../fdroidserver/verify.py +#, python-brace-format +msgid "Downloading {url} failed. {error}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Duplicate link in '{field}': {url}" +msgstr "" + +#: ../fdroid +msgid "Dynamically scan APKs post build" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "" +"ERROR: this command should never be used to mirror f-droid.org!\n" +"A full mirror of f-droid.org requires more than 200GB." +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "ERROR: unsupported CI type, patches welcome!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Empty build flag at {linedesc}" +msgstr "" + +#: ../fdroidserver/__main__.py +#, python-brace-format +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"Enter the path to the Android SDK (%s) here:\n" +"> " +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py +#: ../fdroidserver/upload.py +#, python-format +msgid "Error while attempting to publish log: %s" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/common.py +msgid "Error while getting repo address" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Extract signatures from APKs" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed copying {path}: {error}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Failed fetching signatures for '{apkfilename}': {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed reading {path}: {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed resizing {path}: {error}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Failed to align application" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Failed to create S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get apk information, deleting {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get apk information, skipping {path}" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Failed to install '{apkfilename}' on {dev}: {error}" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/common.py +msgid "Failed to sign application" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to zipalign application" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Fetched buildserverid from VM: {buildserverid}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "File disappeared while processing it: {path}" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/stats.py ../fdroidserver/update.py +#: ../fdroidserver/rewritemeta.py ../fdroidserver/build.py +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py +msgid "Finished" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID flag" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Forbidden HTML tags" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Force halting build after {0} sec timeout!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Force scan of disabled apps and builds." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found bad funding file \"{path}\" for \"{name}\":" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/metadata.py +msgid "Found invalid appids in arguments" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +msgid "Found invalid versionCodes for some apps" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Found multiple JAR Signature Block Files in {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Found multiple metadata files for {appid}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found multiple signing certificates for repository." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found multiple signing certificates in {path}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found no signing certificates for repository." +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Found non-file at %s" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Found {apkfilename} at {url}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Generated skeleton metadata for {appid}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git checkout of '%s' failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git clean failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git fetch failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git remote set-head failed" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git remote set-head failed: \"%s\"" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git reset failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule sync failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule update failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "HTTPS must be used with Subversion URLs!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "If a git mirror gets to big, allow the archive to be deleted" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "If this upload fails, try manually uploading to {url}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." +msgstr "" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring FUNDING.yml entry longer than 2048: %s" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Ignoring package without metadata: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Ignoring stale cache data for {apkfilename}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Ignoring {ext} file at '{path}'" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Include APKs that are signed with disabled algorithms like MD5" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the PGP signature .asc files in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the build logs in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the source tarballs in the mirror" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Initialising submodules" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Install all signed applications available" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Install built packages on devices" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s…" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}…" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Interact with the repo HTTP server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Invalid APK" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid VercodeOperation: {field}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid application ID {appid}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid boolean '%s'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid build flag at {line} in {linedesc}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid build format: {value} in {name}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid bulleted list" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid metadata in %s:%d" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Invalid metadata in: " +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Invalid name for published file: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid package name {0}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid redirect to non-HTTPS: {before} -> {after} " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid scrlib metadata: '{file}' does not exist" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: could not parse '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid versionCode: \"{versionCode}\" is not an integer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature failed to verify: {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature verified: {path}" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java JAR file" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#: ../fdroidserver/mirror.py +msgid "Java JDK not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java compiled class" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Javascript in HTML src attributes" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Keystore for signing key:\t" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the Liberapay: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the LiberapayID flag" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Locale included in f-droid.org URL" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Make the build stop on exceptions" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Malformed repository mirrors." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Malformed serverwebroot line:" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Mirror the full repo and archive, all file types." +msgstr "" + +#: ../fdroidserver/gpgsign.py +msgid "Missing output directory" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Name '%s' is just the auto name - remove it" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No 'config.py' found, using defaults." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No Android SDK found!" +msgstr "" + +#: ../fdroidserver/import.py +msgid "No android or kivy project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No attached devices found" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "No commit specified for {versionName} in {linedesc}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + +#: ../fdroidserver/index.py +msgid "No fingerprint in URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No git submodules available" +msgstr "" + +#: ../fdroidserver/import.py +msgid "No gradle project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/common.py +msgid "No information found." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is Free Software" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is for Android" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "No option set! Edit your config.py to set at least one of these:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No packages specified" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "No signed apk available for %s" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No signed output directory - nothing to do" +msgstr "" + +#: ../fdroidserver/update.py ../fdroidserver/common.py +#, python-brace-format +msgid "No signing certificates found in {path}" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/metadata.py +#, python-format +msgid "No such package: %s" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No such versionCode {versionCode} for app {appid}" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +msgid "No unsigned directory - nothing to do" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Not a valid size definition: \"{}\"" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Nothing to do" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Nothing to do for {appid}." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Now set these in config.py:" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "OBB file has newer versionCode({integer}) than any APK:" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB filename must start with \"main.\" or \"patch.\":" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB's packagename does not match a supported APK:" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Old APK signature failed to verify: {path}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Old, deprecated name for fdroid deploy" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Only PNG and JPEG are supported for graphics, found: {path}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only print differences with the Play Store" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only process apps with auto-updates" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "OpenCollective donation methods belong in the OpenCollective: field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "Options" +msgstr "Opțiuni" + +#: ../fdroidserver/verify.py +msgid "Output JSON report to file named after APK." +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Output JSON to stdout." +msgstr "" + +#: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py +#: ../fdroidserver/update.py ../fdroidserver/signindex.py +#: ../fdroidserver/checkupdates.py +msgid "Outputting JSON" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Overall license of the project." +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Override path for repo APKs (default: ./repo)" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" +msgstr "" + +#: ../fdroidserver/import.py +#, python-brace-format +msgid "Package \"{appid}\" already exists" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Parsing manifest at '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Password required with username" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Path to main Android project subdirectory, if not in root." +msgstr "" + +msgid "Path to main android project subdirectory, if not in root." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Path to the git repo to use as the log" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the keystore for the repo signing key" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Prepare Drozer to run a scan" +msgstr "" + +msgid "Prepare drozer to run a scan" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Print the secret variable to the terminal for easy copy/paste" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Problem with description of {appid}: {error}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Problem with xml at '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Process auto-updates" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#, python-brace-format +msgid "Processing {apkfilename}" +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#, python-brace-format +msgid "Processing {appid}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable XML/JSON for index files" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable index.xml" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Project URL to import from." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Punctuation should be avoided" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Push the log to this git remote repository" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Pushing binary transparency log to {url}" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Pushing to {url}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Quickly start a new repository" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Read all the metadata files and exit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading '{config_file}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading minSdkVersion failed: \"{apkfilename}\"" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Reading {apkfilename} from cache" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Removing specified files" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Rename APK files that do not match package.name_123.apk" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Report on build data status" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Resigning {apkfilename} with provided debug.keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Resize all the icons exceeding the max pixel size and exit" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Restrict output to warnings and errors" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Rewrite all the metadata files" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "Rewrite to a specific format: " +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}'" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}' to '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Run on git repo that has uncommitted changes" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Run rewritemeta to fix formatting" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Running first pass with MD5 checking disabled" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Running wget in {path}" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Scan only the latest version of each package" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scan the resulting APK(s) for known non-free classes." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Scan the source code of a package" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:{versionCode}:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scanner found {} problem" +msgid_plural "Scanner found {} problems" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../fdroidserver/common.py +msgid "Set clock to that time using:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Set maximum releases in repo before older ones are archived" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Set open file limit to {integer}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Set up an app build for a nightly build repo" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setting open file limit failed: " +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Setting {0} sec timeout for this build" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +msgstr "" + +msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Sign and place packages in the repo" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Sign indexes created using update --nosign" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Skip scanning the source code for binaries and other problems" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping '{apkfilename}' with invalid signature!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping index generation for {appid}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: disabled" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: no builds specified" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Specify a local folder to sync the repo to" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Specify an identity file to provide to SSH for rsyncing" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Specify that we're running on the build server" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Specify which debug keystore file to use." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Spew out even more information than normal" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Striping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Stripping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Summary '%s' is just the app's name" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Summary of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "System clock is older than date in {path}!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "The OBB version code must come after \"{name}.\":" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "The base URL for the repo to log (default: https://f-droid.org)" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "The directory to write the mirror to" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "The file to be included in the repo (path or glob)" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "The only commands currently supported are 'init' and 'update'" +msgstr "" + +#: ../fdroidserver/index.py +msgid "The repository's fingerprint does not match." +msgstr "" + +#: ../fdroidserver/common.py +msgid "The repository's index could not be verified." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "The root dir for local_copy_dir \"{path}\" does not exist!" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "There is a keyalias collision - publishing halted" +msgstr "" + +#: ../fdroidserver/common.py +msgid "These are the apps that have been archived from the main repo." +msgstr "" + +#: ../fdroidserver/import.py +#, python-format +msgid "This repo already has local metadata: %s" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL must start with https:// or http://" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL shorteners should not be used" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "URL title is just the URL, use brackets: [URL]" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "URL {url} in Description: {error}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unexpected text on same line as {field} in {linedesc}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Unknown exception found!" +msgstr "S-a găsit o excepție necunoscută!" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Unknown file '{filename}' in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Unknown metadata format: %s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path} (use: *.yml)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Unknown version of aapt, might cause problems: " +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary leading space" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary trailing space" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised app field '{fieldname}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unrecognised app field: " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised build flag '{build_flag}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised field '{field}' in {linedesc}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported file type \"{extension}\" for repo graphic" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported graphics file found: {path}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Unsupported metadata format, use: --to [{supported}]" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unterminated ]" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unterminated ]]" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unterminated build in {name}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unterminated continuation in {name}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused extlib at %s" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused file at %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scandelete path: %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scanignore path: %s" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update repo information for new packages" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update the binary transparency log for a URL" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update the stats of the repo" +msgstr "" + +#: ../fdroidserver/update.py ../fdroidserver/build.py +msgid "Update the wiki" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "UpdateCheckData has invalid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must use HTTPS URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData not a valid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID - it can be removed" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID, it can be removed" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to androidobservatory.org" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to virustotal" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "Usage" +msgstr "Utilizare" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "Usage: %s\n" +msgstr "Utilizare: %s\n" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master to point at a file in the default branch" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use `fdroid update -c` to create it." +msgstr "" + +#: ../fdroidserver/build.py +msgid "Use build server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "" + +msgid "Use date from apk instead of current time for newly added apks" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Using \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v2" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v3" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Using androguard from \"{path}\"" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Using existing keystore \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Using s3cmd to sync with: {url}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Valid commands are:" +msgstr "Comenzile valide sunt:" + +#: ../fdroidserver/verify.py +msgid "Verify against locally cached copy rather than redownloading." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Verify the integrity of downloaded packages" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Verifying index signature:" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Warn about possible metadata errors" +msgstr "" + +#: ../fdroidserver/update.py +msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgstr "" + +msgid "X.509 'Distiguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/init.py +msgid "X.509 'Distinguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/common.py +msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "ZIP file archive" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "adding IdentityFile to {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "adding to {name}: {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "ambiguous option: %s (%s?)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "apksigner not found, it's required for signing!" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py +#: ../fdroidserver/checkupdates.py +msgid "application ID of file to operate on" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py +msgid "application ID with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py +msgid "applicationId in the form APPID" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "applicationId to check for updates" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +#: ../fdroidserver/dscanner.py ../fdroidserver/build.py +#: ../fdroidserver/scanner.py ../fdroidserver/install.py +msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "argument \"-\" with mode %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare SSH connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare ssh connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "can not parse scrlib spec (not a string): '{}'" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "can't open '%s': %s" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "cannot find required srclibs: \"{path}\"" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "cannot have multiple subparser arguments" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "cannot merge actions - two groups are named %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "cannot publish update, did you set the deploy key?" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "cloning {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "command to execute, either 'init' or 'update'" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "commands from plugin modules:" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "complex" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "conflicting option string: %s" +msgid_plural "conflicting option strings: %s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "copying {apkfilename} into {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "could not parse '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no ref specified): '{}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (too many '@' signs): '{}'" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "created {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "deleting: repo/{apkfilename}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed build logs to '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed process log {path} to {dest}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "dest= is required for options like %r" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "executable binary, possibly code" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "expected %s argument" +msgid_plural "expected %s arguments" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected at least one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected at most one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected one argument" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "failed deploying build logs to '{path}'" +msgstr "" + +#: ../fdroid +msgid "fdroid [-h|--help|--version] []" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "fdroid [] [-h|--help|--version|]" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "floating-point" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force errors to be warnings, or ignore" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force metadata errors (default) to be warnings, or to be ignored." +msgstr "" + +#: ../fdroidserver/common.py +msgid "git svn clone failed" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "gzip file archive" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "ignored explicit argument %r" +msgstr "" + +#: ../fdroidserver/index.py +msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "integer" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid %(type)s value: %(value)r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid choice: %(value)r (choose from %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid conflict_resolution value: %r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be an absolute path!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be directory, not a file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "mirror '%s' does not end with 'fdroid'!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "mutually exclusive arguments must be optional" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "no \"icon\" in {appid}" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "no APK supplied" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "no such option: %s" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "no version info found!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "not allowed with argument %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "one of the arguments %s is required" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "only accepts strings, lists, and tuples" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "option %s: If you really want to install all the signed apps, use --all" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "option %s: invalid %s value: %r" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "option %s: invalid choice: %r (choose from %s)" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option -%s not recognized" +msgstr "opțiunea -%s nerecunoscută" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option -%s requires argument" +msgstr "opțiunea -%s necesită argument" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s must not have an argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s not a unique prefix" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s not recognized" +msgstr "opțiunea --%s nerecunoscută" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "optional arguments" +msgstr "argumente opționale" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "overwriting existing {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "positional arguments" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "process log deploy {path} to {dest} failed!" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon %s does not exist, generating placeholder." +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "ruamel.yaml not installed, can not write metadata." +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "s3cmd sync indexes {path} to {url} and delete" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "shared library" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "show program's version number and exit" +msgstr "arată numărul versiunii programului și iese" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py +#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +msgid "show this help message and exit" +msgstr "arată acest mesaj de ajutor și iese" + +#: ../fdroidserver/signatures.py +msgid "signed APK, either a file-path or HTTPS URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: log content is empty" +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: not enabled in config" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "skipping source tarball: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "srclibs missing name and/or @" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "static library" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "the following arguments are required: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unexpected option string: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unrecognized arguments: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "unsafe permissions on '{config_file}' (should be 0600)!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid +#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +msgid "usage: " +msgstr "utilizare: " + +#: ../fdroid +msgid "usage: fdroid [-h|--help|--version] []" +msgstr "utilizare: fdroid [-h|--help|--version] []" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "using Apache libcloud to sync with {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "virustotal.com is rate limiting, waiting to retry..." +msgstr "" + +#: ../fdroidserver/update.py +msgid "wiki support is deprecated and will be removed in the next release!" +msgstr "" + +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "{0} app, {1} key aliases" +msgid_plural "{0} apps, {1} key aliases" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} ({appid}) has no metadata!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using application ID instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using package name instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android Package Name!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android application ID!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Java Package Name!" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{appid} is missing {name}" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: Unknown extlib {path} in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "{appid}: no builds specified, running on current source state" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be an integer, found: {value}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{field} not terminated in {name}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{file} is blank or corrupt!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + +#: ../fdroidserver/import.py +#, python-brace-format +msgid "{path} already exists, ignoring import results!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "{path} does not exist! Create it by running:" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} is zero size!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} more than 200MB, manually upload: {url}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{url} does not end with \"fdroid\", check the URL path!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{url} does not start with \"http\"!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "{} build failed" +msgid_plural "{} builds failed" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../fdroidserver/build.py +msgid "{} build succeeded" +msgid_plural "{} builds succeeded" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" From 48a20801af92be2a0b16ebcae537b1d801ed727f Mon Sep 17 00:00:00 2001 From: Francesco Esposito Date: Fri, 29 Jan 2021 11:52:05 +0100 Subject: [PATCH 0116/2116] Translated using Weblate: Italian (it) by Francesco Esposito Currently translated at 65.1% (383 of 588 strings) Co-authored-by: Francesco Esposito Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ Translation: F-Droid/F-Droid Server --- locale/it/LC_MESSAGES/fdroidserver.po | 74 ++++++++++++--------------- 1 file changed, 34 insertions(+), 40 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index a56673d2..8017f7be 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -8,20 +8,21 @@ # x , 2020. # Hans-Christoph Steiner , 2020. # Francesco Saltori , 2020. +# Francesco Esposito , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2020-12-31 08:12+0000\n" -"Last-Translator: random r \n" +"PO-Revision-Date: 2021-01-14 21:33+0000\n" +"Last-Translator: Francesco Esposito \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4.1-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py msgid "" @@ -155,9 +156,8 @@ msgid "'keypass' not found in config.py!" msgstr "\"keypass\" non trovato in config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keypass' not found in config.yml!" -msgstr "\"keypass\" non trovato in config.py!" +msgstr "\"keypass\" non trovato in config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" @@ -168,27 +168,24 @@ msgid "'keystore' not found in config.py!" msgstr "\"keystore\" non trovato in config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystore' not found in config.yml!" -msgstr "\"keystore\" non trovato in config.py!" +msgstr "\"keystore\" non trovato in config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.py!" msgstr "\"keystorepass\" non trovato in config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'keystorepass' not found in config.yml!" -msgstr "\"keystorepass\" non trovato in config.py!" +msgstr "\"keystorepass\" non trovato in config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.py!" msgstr "\"repo_keyalias\" non trovato in config.py!" #: ../fdroidserver/common.py -#, fuzzy msgid "'repo_keyalias' not found in config.yml!" -msgstr "\"repo_keyalias\" non trovato in config.py!" +msgstr "\"repo_keyalias\" non trovato in config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -200,9 +197,8 @@ msgid "'sdk_path' not set in 'config.py'!" msgstr "\"sdk_path\" non impostato in \"config.py\"!" #: ../fdroidserver/common.py -#, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "\"sdk_path\" non impostato in \"config.py\"!" +msgstr "\"sdk_path\" non impostato in config.yml!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -319,9 +315,9 @@ msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "\"{path}\" dell'Android SDK non ha \"{dirname}\" installato!" #: ../fdroidserver/init.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "Android SDK non trovato!" +msgstr "Android SDK non trovato in {path}!" #: ../fdroidserver/common.py msgid "Android SDK not found!" @@ -338,9 +334,9 @@ msgid "Android SDK path '{path}' is not a directory!" msgstr "Il path di Android SDK \"{path}\" non è una directory!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "Android SDK non trovato!" +msgstr "Android SDK tool {cmd} trovato!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -503,7 +499,7 @@ msgstr "Argomenti in conflitto: '--verbose' e '--quiet' non possono essere speci #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "File di configurazione in conflitto! Utilizzando {newfile}, ignorando {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format @@ -524,9 +520,9 @@ msgid "Could not find {path} to remove it" msgstr "Impossibile trovare {path} da rimuovere" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "Impossibile aprire il file apk per l'analisi" +msgstr "Impossibile aprire il file APK {path} per l'analisi: " #: ../fdroidserver/update.py msgid "Could not open apk file for analysis" @@ -758,7 +754,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "La variabile d'ambiente {var} da {configname} non è impostata!" #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py @@ -1246,9 +1242,8 @@ msgid "No commit specified for {versionName} in {linedesc}" msgstr "Nessun commit specificato per {versionName} in {linedesc}" #: ../fdroidserver/common.py -#, fuzzy msgid "No config.yml found, using defaults." -msgstr "Nessun 'config.py' trovato, utilizzando i valori predefiniti." +msgstr "Nessun config.yml trovato, utilizzando i valori predefiniti." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1329,9 +1324,8 @@ msgid "Now set these in config.py:" msgstr "Ora imposta i seguenti campi in config.py:" #: ../fdroidserver/init.py -#, fuzzy msgid "Now set these in config.yml:" -msgstr "Ora imposta i seguenti campi in config.py:" +msgstr "Ora imposta i seguenti campi in config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1388,7 +1382,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." -msgstr "" +msgstr "Invia l'output del JSON allo stdout." #: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py #: ../fdroidserver/update.py ../fdroidserver/signindex.py @@ -1539,11 +1533,11 @@ msgstr "Lettura di {apkfilename} dalla cache" #: ../fdroidserver/stats.py msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." -msgstr "" +msgstr "Ricalcola statistiche aggregate: da utilizzare quando sono state apportate modifiche che invaliderebbero i vecchi dati memorizzati nella cache." #: ../fdroidserver/common.py msgid "Removing specified files" -msgstr "" +msgstr "Rimozione dei file specificati" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -1551,11 +1545,11 @@ msgstr "Rinomina i file APK che non corrispondono a package.name_123.apk" #: ../fdroidserver/update.py msgid "Report on build data status" -msgstr "" +msgstr "Report sullo stato dei dati di compilazione" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" +msgstr "Reimposta e crea un nuovo server di compilazione, anche se quello esistente sembra essere ok." #: ../fdroidserver/nightly.py #, python-brace-format @@ -1564,11 +1558,11 @@ msgstr "Firmando di nuovo {apkfilename} con il debug.keystore fornito" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" -msgstr "" +msgstr "Ridimensiona tutte le icone che superano la dimensione massima dei pixel ed esci" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" -msgstr "" +msgstr "Limita l'output ad avvisi ed errori" #: ../fdroid ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1576,38 +1570,38 @@ msgstr "Riscrivi tutti i file di metadati" #: ../fdroidserver/rewritemeta.py msgid "Rewrite to a specific format: " -msgstr "" +msgstr "Riscrivi in un formato specifico: " #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" -msgstr "" +msgstr "Riscrittura di \"{appid}\"" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}' to '{path}'" -msgstr "" +msgstr "Riscrittura di '{appid}' in '{path}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" -msgstr "" +msgstr "Esegui su repository git con modifiche non salvate" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" -msgstr "" +msgstr "Esegui rewritemeta per correggere la formattazione" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Running first pass with MD5 checking disabled" -msgstr "" +msgstr "Esecuzione del primo passaggio con controllo MD5 disabilitato" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" -msgstr "" +msgstr "Esecuzione di wget in {path}" #: ../fdroidserver/dscanner.py msgid "Scan only the latest version of each package" -msgstr "" +msgstr "Scansiona solo l'ultima versione di ogni pacchetto" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." From dc114f6c6daeeefe4092c9feae666e3a04e34c99 Mon Sep 17 00:00:00 2001 From: Oymate Date: Fri, 29 Jan 2021 11:52:05 +0100 Subject: [PATCH 0117/2116] Translated using Weblate: Bengali (bn) by Oymate Currently translated at 3.0% (18 of 588 strings) Translated using Weblate: Bengali (bn) by Oymate Currently translated at 1.1% (7 of 588 strings) Co-authored-by: Oymate Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/bn/ Translation: F-Droid/F-Droid Server --- locale/bn/LC_MESSAGES/fdroidserver.po | 46 +++++++++++++-------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index dda9f375..5d0e701a 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -1,20 +1,20 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# FIRST AUTHOR , YEAR. -# +# Oymate , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" +"PO-Revision-Date: 2021-01-15 13:25+0000\n" +"Last-Translator: Oymate \n" +"Language-Team: Bengali \n" "Language: bn\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py msgid "" @@ -102,7 +102,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" -msgstr "" +msgstr "%(prog)s: ত্রুটি: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format @@ -466,11 +466,11 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py #, c-format, python-format msgid "Command '%s' not recognised.\n" -msgstr "" +msgstr "'%s' কমান্ড চিনা যায়নি।\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" -msgstr "" +msgstr "পরিবর্তন জমা দাও" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." @@ -822,7 +822,7 @@ msgstr "" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py msgid "Finished" -msgstr "" +msgstr "সম্পূর্ণ" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID flag" @@ -995,7 +995,7 @@ msgstr "" #: ../fdroidserver/common.py msgid "Initialising submodules" -msgstr "" +msgstr "উপমডিউল শুরু করা হচ্ছে" #: ../fdroidserver/install.py msgid "Install all signed applications available" @@ -1013,7 +1013,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format msgid "Installing %s…" -msgstr "" +msgstr "%s ইনস্টল করা হচ্ছে…" #: ../fdroidserver/install.py #, python-brace-format @@ -1031,7 +1031,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Invalid APK" -msgstr "" +msgstr "অবৈধ এপিকে" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format @@ -1350,7 +1350,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "Options" -msgstr "" +msgstr "বিকল্পসমূহ" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." @@ -1435,12 +1435,12 @@ msgstr "" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" -msgstr "" +msgstr "স্বয়ংক্রিয়-হালনাগাদ প্রক্রিয়া করো" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" -msgstr "" +msgstr "{apkfilename} প্রক্রিয়ারত" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format @@ -1815,7 +1815,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" -msgstr "" +msgstr "অজানা ব্যতিক্রম পাওয়া গেছে!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py @@ -1983,13 +1983,13 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "Usage" -msgstr "" +msgstr "ব্যবহার" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "Usage: %s\n" -msgstr "" +msgstr "ব্যবহার: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" @@ -2044,7 +2044,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Valid commands are:" -msgstr "" +msgstr "বৈধ কমান্ড হলো:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." @@ -2202,7 +2202,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "complex" -msgstr "" +msgstr "জটিল" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2299,7 +2299,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "floating-point" -msgstr "" +msgstr "ফ্লোটিং-পয়েন্ট" #: ../fdroidserver/metadata.py msgid "force errors to be warnings, or ignore" @@ -2330,7 +2330,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "integer" -msgstr "" +msgstr "ইন্টিজার" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2588,7 +2588,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py msgid "usage: " -msgstr "" +msgstr "ব্যবহার: " #: ../fdroid msgid "usage: fdroid [-h|--help|--version] []" From cc159b57b62793e44c719e0cea093ba32b8d0a63 Mon Sep 17 00:00:00 2001 From: Lilian Sosa Date: Fri, 29 Jan 2021 11:52:06 +0100 Subject: [PATCH 0118/2116] Translated using Weblate: Spanish (Argentina) (es_AR) by Lilian Sosa Currently translated at 20.0% (118 of 588 strings) Translated using Weblate: Spanish (Argentina) (es_AR) by Lilian Sosa Currently translated at 17.8% (105 of 588 strings) Co-authored-by: Lilian Sosa Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es_AR/ Translation: F-Droid/F-Droid Server --- locale/es_AR/LC_MESSAGES/fdroidserver.po | 37 ++++++++++++------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index 7745b971..119006ce 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -4,20 +4,21 @@ # Hans-Christoph Steiner , 2020. # riveravaldez , 2020. # Eduardo Rodrigues , 2020. +# Lilian Sosa , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2020-12-12 06:36+0000\n" -"Last-Translator: Eduardo Rodrigues \n" +"PO-Revision-Date: 2021-01-15 13:24+0000\n" +"Last-Translator: Lilian Sosa \n" "Language-Team: Spanish (Argentina) \n" "Language: es_AR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py msgid "" @@ -307,12 +308,12 @@ msgstr "" #: ../fdroidserver/common.py msgid "Android SDK not found!" -msgstr "" +msgstr "No se encontró Android SDK!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" -msgstr "" +msgstr "No existe ruta '{path}' Android SDK!" #: ../fdroidserver/common.py #, python-brace-format @@ -334,12 +335,12 @@ msgstr "" #: ../fdroidserver/update.py msgid "AndroidManifest.xml has no date" -msgstr "" +msgstr "AndroidManifest.xml no tiene fecha" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" -msgstr "" +msgstr "La aplicación está en '{repo}' pero no tiene enlace a {url}" #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -348,7 +349,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" -msgstr "" +msgstr "Archivando {apkfilename} con una firma invalida!" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -358,7 +359,7 @@ msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "" +msgstr "Rama {branch} fue publicada en la versión {versionName}" #: ../fdroidserver/lint.py #, python-brace-format @@ -398,38 +399,38 @@ msgstr "" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" -msgstr "" +msgstr "Empaquetar repositorio basado en %s con esta configuración:" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "No se pudo empaquetar debido al {} error mientras se escaneaba" +msgstr[1] "No se pudo empaquetar debido a los {} errores mientras se escaneaba" #: ../fdroidserver/vmtools.py #, python-brace-format msgid "Cannot read \"{path}\"!" -msgstr "" +msgstr "No se encuentra \"{path}\"!" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/metadata.py #, python-brace-format msgid "Cannot resolve application ID {appid}" -msgstr "" +msgstr "No se puede resolver el ID de la aplicación {appid}" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" -msgstr "" +msgstr "No se puede reescribir \"{path}\"" #: ../fdroidserver/rewritemeta.py msgid "Cannot use --list and --to at the same time" -msgstr "" +msgstr "No se puede usar --list y --to al mismo tiempo" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" -msgstr "" +msgstr "No se puede escribir \"{path}\", no es un formato aceptado, use: {formats}" #: ../fdroidserver/lint.py #, python-format @@ -2621,7 +2622,7 @@ msgstr "uso: " #: ../fdroid msgid "usage: fdroid [-h|--help|--version] []" -msgstr "uso: fdroid [-h|--help|--version] []" +msgstr "usar: fdroid [-h|--help|--version] []" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format From 5f48626fd955b57185f309823a473bcbce3b1096 Mon Sep 17 00:00:00 2001 From: jace Date: Fri, 29 Jan 2021 11:52:07 +0100 Subject: [PATCH 0119/2116] Added translation using Weblate: English (Middle) (enm) by jace Co-authored-by: jace --- locale/enm/LC_MESSAGES/fdroidserver.po | 2752 ++++++++++++++++++++++++ 1 file changed, 2752 insertions(+) create mode 100644 locale/enm/LC_MESSAGES/fdroidserver.po diff --git a/locale/enm/LC_MESSAGES/fdroidserver.po b/locale/enm/LC_MESSAGES/fdroidserver.po new file mode 100644 index 00000000..76402a64 --- /dev/null +++ b/locale/enm/LC_MESSAGES/fdroidserver.po @@ -0,0 +1,2752 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# jace , 2021. +msgid "" +msgstr "" +"Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" +"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: enm\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: ../fdroidserver/common.py +msgid "" +"\n" +" This is a repository of apps to be used with FDroid. Applications in this\n" +" repository are either official binaries built by the original application\n" +" developers, or are binaries built from source by f-droid.org using the\n" +" tools on https://gitlab.com/fdroid.\n" +" " +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH Public Key to be used as Deploy Key:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH public key to be used as deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "" +"\n" +"{path} encoded for the DEBUG_KEYSTORE secret variable:" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "\"%s/\" has no matching metadata file!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "\"{apkfilename}\" is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains outdated {name} ({version})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains recent {name} ({version})" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "\"{path}\" exists but s3cmd is not installed!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "\"{path}\" is not an accepted format, convert to: {formats}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "\"{url}\" is not a valid URL!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "%(option)s option requires %(number)d argument" +msgid_plural "%(option)s option requires %(number)d arguments" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/mirror.py +#, python-format +msgid "%(prog)s [options] url" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "%(prog)s: error: %(message)s\n" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "%d problems found" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "%prog [options]" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "%r is not callable" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "%s is not an accepted build field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "%s option does not take a value" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keypass' not found in config.py!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' is NONE and 'smartcardoptions' is blank!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keystore' not found in config.py!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keystorepass' not found in config.py!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.py!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "'required' is an invalid argument for positionals" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in 'config.py'!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + +#. Translators: "build-tools" is the file name of a package from +#. Google, it is part of the Android SDK. So it probably shouldn't be +#. translated or transliterated. +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-23.0.0 or newer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "'{apkfilename}' is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{field}' in {linedesc} is obsolete, see docs for current fields:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{path}' failed to execute!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "...checkupdate failed for {appid} : {error}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid ".__call__() not defined" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "/issues is missing" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "A URL is required as an argument!" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Add PGP signatures using GnuPG for packages in repo" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Add a new application from its source code" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add a repo signing key to an unsigned repo" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add skeleton metadata files for APKs that are missing them" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Adding new repo for only {name}" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Alias of the repo signing key in the keystore" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Also mirror the full archive section" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Also warn about formatting issues, like rewritemeta -l" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android AAR library" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android APK file" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android DEX code" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/build.py +#, python-brace-format +msgid "Android SDK '{path}' does not have '{dirname}' installed!" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Android SDK not found!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' is not a directory!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + +#. Translators: "build-tools" is the file name of a package from +#. Google, it is part of the Android SDK. So it probably shouldn't be +#. translated or transliterated. +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android build-tools path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/update.py +msgid "AndroidManifest.xml has no date" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "App is in '{repo}' but has a link to {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Appending .git is not necessary" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Archiving {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in srclib '{srclib}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Broken symlink: {path}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Build a package from source" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build all applications available" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Build generated by `fdroid import` - remove disable line once ready" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Build metadata git repo has uncommited changes!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build only the latest version of each package" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "Built repo based in \"%s\" with this config:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Can't build due to {} error while scanning" +msgid_plural "Can't build due to {} errors while scanning" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/vmtools.py +#, python-brace-format +msgid "Cannot read \"{path}\"!" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Cannot resolve application ID {appid}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Cannot rewrite \"{path}\"" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "Cannot use --list and --to at the same time" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Categories '%s' is not valid" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Categories are not set" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Check for updates to applications" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean after all scans have finished" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean before the scans start and rebuild the container" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean up all containers and then exit" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Clean update - don't uses caches, reprocess all APKs" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Comma separated list of categories." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +#, c-format, python-format +msgid "Command '%s' not recognised.\n" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Commit changes" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not find '{command}' on your system" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Could not find latest version code" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Could not find latest version name" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not find {path} to remove it" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + +#: ../fdroidserver/update.py +msgid "Could not open apk file for analysis" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not parse size \"{size}\", wrong type \"{type}\"" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/import.py +msgid "Couldn't find Application ID" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/import.py +msgid "Couldn't find latest version code" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/import.py +msgid "Couldn't find latest version name" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Couldn't find package ID" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Cowardily refusing to overwrite existing signing key setup!" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Create a repo signing key in a keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Create skeleton metadata files that are missing" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Created new container \"{name}\"" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Creating \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating log directory" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Creating new S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating output directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating signed index with this key (SHA256):" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/verify.py +#: ../fdroidserver/publish.py +msgid "Creating temporary directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating unsigned index in preparation for signing" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "DEBUG_KEYSTORE is not set or the value is incomplete" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Delete APKs and/or OBBs without metadata from the repo" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting archive, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Deleting unknown file: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description '%s' is just the app's summary" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Description has a duplicate line" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Description of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Do not add 'disable:' to the generated build entries" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not deploy the new files to the repo" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Do not include \"{path}\" in URL!" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Do not prompt for Android SDK path, just fail" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not remove the private keys generated from the keystore" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't create a source tarball, useful when testing a build" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Don't do anything logs-related" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/nightly.py +#: ../fdroidserver/upload.py +msgid "Don't use rsync checksums" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Download complete mirrors of small repos" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Download logs we don't have" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Downloading the repository already failed once, not trying again." +msgstr "" + +#: ../fdroidserver/verify.py +#, python-brace-format +msgid "Downloading {url} failed. {error}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Duplicate link in '{field}': {url}" +msgstr "" + +#: ../fdroid +msgid "Dynamically scan APKs post build" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "" +"ERROR: this command should never be used to mirror f-droid.org!\n" +"A full mirror of f-droid.org requires more than 200GB." +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "ERROR: unsupported CI type, patches welcome!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Empty build flag at {linedesc}" +msgstr "" + +#: ../fdroidserver/__main__.py +#, python-brace-format +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"Enter the path to the Android SDK (%s) here:\n" +"> " +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py +#: ../fdroidserver/upload.py +#, python-format +msgid "Error while attempting to publish log: %s" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/common.py +msgid "Error while getting repo address" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Extract signatures from APKs" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed copying {path}: {error}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Failed fetching signatures for '{apkfilename}': {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed reading {path}: {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed resizing {path}: {error}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Failed to align application" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Failed to create S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get apk information, deleting {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get apk information, skipping {path}" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Failed to install '{apkfilename}' on {dev}: {error}" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/common.py +msgid "Failed to sign application" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to zipalign application" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Fetched buildserverid from VM: {buildserverid}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "File disappeared while processing it: {path}" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/stats.py ../fdroidserver/update.py +#: ../fdroidserver/rewritemeta.py ../fdroidserver/build.py +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py +msgid "Finished" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID flag" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Forbidden HTML tags" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Force halting build after {0} sec timeout!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Force scan of disabled apps and builds." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found bad funding file \"{path}\" for \"{name}\":" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/metadata.py +msgid "Found invalid appids in arguments" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +msgid "Found invalid versionCodes for some apps" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Found multiple JAR Signature Block Files in {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Found multiple metadata files for {appid}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found multiple signing certificates for repository." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found multiple signing certificates in {path}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found no signing certificates for repository." +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Found non-file at %s" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Found {apkfilename} at {url}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Generated skeleton metadata for {appid}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git checkout of '%s' failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git clean failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git fetch failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git remote set-head failed" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git remote set-head failed: \"%s\"" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git reset failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule sync failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule update failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "HTTPS must be used with Subversion URLs!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "If a git mirror gets to big, allow the archive to be deleted" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "If this upload fails, try manually uploading to {url}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." +msgstr "" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring FUNDING.yml entry longer than 2048: %s" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Ignoring package without metadata: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Ignoring stale cache data for {apkfilename}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Ignoring {ext} file at '{path}'" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Include APKs that are signed with disabled algorithms like MD5" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the PGP signature .asc files in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the build logs in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the source tarballs in the mirror" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Initialising submodules" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Install all signed applications available" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Install built packages on devices" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s…" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}…" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Interact with the repo HTTP server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Invalid APK" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid VercodeOperation: {field}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid application ID {appid}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid boolean '%s'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid build flag at {line} in {linedesc}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid build format: {value} in {name}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid bulleted list" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid metadata in %s:%d" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Invalid metadata in: " +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Invalid name for published file: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid package name {0}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid redirect to non-HTTPS: {before} -> {after} " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid scrlib metadata: '{file}' does not exist" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: could not parse '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid versionCode: \"{versionCode}\" is not an integer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature failed to verify: {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature verified: {path}" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java JAR file" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#: ../fdroidserver/mirror.py +msgid "Java JDK not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java compiled class" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Javascript in HTML src attributes" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Keystore for signing key:\t" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the Liberapay: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the LiberapayID flag" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Locale included in f-droid.org URL" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Make the build stop on exceptions" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Malformed repository mirrors." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Malformed serverwebroot line:" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Mirror the full repo and archive, all file types." +msgstr "" + +#: ../fdroidserver/gpgsign.py +msgid "Missing output directory" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Name '%s' is just the auto name - remove it" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No 'config.py' found, using defaults." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No Android SDK found!" +msgstr "" + +#: ../fdroidserver/import.py +msgid "No android or kivy project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No attached devices found" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "No commit specified for {versionName} in {linedesc}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + +#: ../fdroidserver/index.py +msgid "No fingerprint in URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No git submodules available" +msgstr "" + +#: ../fdroidserver/import.py +msgid "No gradle project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/common.py +msgid "No information found." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is Free Software" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is for Android" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "No option set! Edit your config.py to set at least one of these:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No packages specified" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "No signed apk available for %s" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No signed output directory - nothing to do" +msgstr "" + +#: ../fdroidserver/update.py ../fdroidserver/common.py +#, python-brace-format +msgid "No signing certificates found in {path}" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/metadata.py +#, python-format +msgid "No such package: %s" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No such versionCode {versionCode} for app {appid}" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +msgid "No unsigned directory - nothing to do" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Not a valid size definition: \"{}\"" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Nothing to do" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Nothing to do for {appid}." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Now set these in config.py:" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "OBB file has newer versionCode({integer}) than any APK:" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB filename must start with \"main.\" or \"patch.\":" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB's packagename does not match a supported APK:" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Old APK signature failed to verify: {path}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Old, deprecated name for fdroid deploy" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Only PNG and JPEG are supported for graphics, found: {path}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only print differences with the Play Store" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only process apps with auto-updates" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "OpenCollective donation methods belong in the OpenCollective: field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "Options" +msgstr "" + +#: ../fdroidserver/verify.py +msgid "Output JSON report to file named after APK." +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Output JSON to stdout." +msgstr "" + +#: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py +#: ../fdroidserver/update.py ../fdroidserver/signindex.py +#: ../fdroidserver/checkupdates.py +msgid "Outputting JSON" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Overall license of the project." +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Override path for repo APKs (default: ./repo)" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" +msgstr "" + +#: ../fdroidserver/import.py +#, python-brace-format +msgid "Package \"{appid}\" already exists" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Parsing manifest at '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Password required with username" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Path to main Android project subdirectory, if not in root." +msgstr "" + +msgid "Path to main android project subdirectory, if not in root." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Path to the git repo to use as the log" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the keystore for the repo signing key" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Prepare Drozer to run a scan" +msgstr "" + +msgid "Prepare drozer to run a scan" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Print the secret variable to the terminal for easy copy/paste" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Problem with description of {appid}: {error}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Problem with xml at '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Process auto-updates" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#, python-brace-format +msgid "Processing {apkfilename}" +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#, python-brace-format +msgid "Processing {appid}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable XML/JSON for index files" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable index.xml" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Project URL to import from." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Punctuation should be avoided" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Push the log to this git remote repository" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Pushing binary transparency log to {url}" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Pushing to {url}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Quickly start a new repository" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Read all the metadata files and exit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading '{config_file}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading minSdkVersion failed: \"{apkfilename}\"" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Reading {apkfilename} from cache" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Removing specified files" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Rename APK files that do not match package.name_123.apk" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Report on build data status" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Resigning {apkfilename} with provided debug.keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Resize all the icons exceeding the max pixel size and exit" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Restrict output to warnings and errors" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Rewrite all the metadata files" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "Rewrite to a specific format: " +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}'" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}' to '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Run on git repo that has uncommitted changes" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Run rewritemeta to fix formatting" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Running first pass with MD5 checking disabled" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Running wget in {path}" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Scan only the latest version of each package" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scan the resulting APK(s) for known non-free classes." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Scan the source code of a package" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:{versionCode}:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scanner found {} problem" +msgid_plural "Scanner found {} problems" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/common.py +msgid "Set clock to that time using:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Set maximum releases in repo before older ones are archived" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Set open file limit to {integer}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Set up an app build for a nightly build repo" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setting open file limit failed: " +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Setting {0} sec timeout for this build" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +msgstr "" + +msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Sign and place packages in the repo" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Sign indexes created using update --nosign" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Skip scanning the source code for binaries and other problems" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping '{apkfilename}' with invalid signature!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping index generation for {appid}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: disabled" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: no builds specified" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Specify a local folder to sync the repo to" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Specify an identity file to provide to SSH for rsyncing" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Specify that we're running on the build server" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Specify which debug keystore file to use." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Spew out even more information than normal" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Striping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Stripping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Summary '%s' is just the app's name" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Summary of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "System clock is older than date in {path}!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "The OBB version code must come after \"{name}.\":" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "The base URL for the repo to log (default: https://f-droid.org)" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "The directory to write the mirror to" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "The file to be included in the repo (path or glob)" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "The only commands currently supported are 'init' and 'update'" +msgstr "" + +#: ../fdroidserver/index.py +msgid "The repository's fingerprint does not match." +msgstr "" + +#: ../fdroidserver/common.py +msgid "The repository's index could not be verified." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "The root dir for local_copy_dir \"{path}\" does not exist!" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "There is a keyalias collision - publishing halted" +msgstr "" + +#: ../fdroidserver/common.py +msgid "These are the apps that have been archived from the main repo." +msgstr "" + +#: ../fdroidserver/import.py +#, python-format +msgid "This repo already has local metadata: %s" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL must start with https:// or http://" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL shorteners should not be used" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "URL title is just the URL, use brackets: [URL]" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "URL {url} in Description: {error}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unexpected text on same line as {field} in {linedesc}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Unknown exception found!" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Unknown file '{filename}' in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Unknown metadata format: %s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path} (use: *.yml)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Unknown version of aapt, might cause problems: " +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary leading space" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary trailing space" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised app field '{fieldname}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unrecognised app field: " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised build flag '{build_flag}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised field '{field}' in {linedesc}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported file type \"{extension}\" for repo graphic" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported graphics file found: {path}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Unsupported metadata format, use: --to [{supported}]" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unterminated ]" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unterminated ]]" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unterminated build in {name}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unterminated continuation in {name}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused extlib at %s" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused file at %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scandelete path: %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scanignore path: %s" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update repo information for new packages" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update the binary transparency log for a URL" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update the stats of the repo" +msgstr "" + +#: ../fdroidserver/update.py ../fdroidserver/build.py +msgid "Update the wiki" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "UpdateCheckData has invalid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must use HTTPS URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData not a valid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID - it can be removed" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID, it can be removed" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to androidobservatory.org" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to virustotal" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "Usage" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "Usage: %s\n" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master to point at a file in the default branch" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use `fdroid update -c` to create it." +msgstr "" + +#: ../fdroidserver/build.py +msgid "Use build server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "" + +msgid "Use date from apk instead of current time for newly added apks" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Using \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v2" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v3" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Using androguard from \"{path}\"" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Using existing keystore \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Using s3cmd to sync with: {url}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Valid commands are:" +msgstr "" + +#: ../fdroidserver/verify.py +msgid "Verify against locally cached copy rather than redownloading." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Verify the integrity of downloaded packages" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Verifying index signature:" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Warn about possible metadata errors" +msgstr "" + +#: ../fdroidserver/update.py +msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgstr "" + +msgid "X.509 'Distiguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/init.py +msgid "X.509 'Distinguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/common.py +msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "ZIP file archive" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "adding IdentityFile to {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "adding to {name}: {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "ambiguous option: %s (%s?)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "apksigner not found, it's required for signing!" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py +#: ../fdroidserver/checkupdates.py +msgid "application ID of file to operate on" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py +msgid "application ID with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py +msgid "applicationId in the form APPID" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "applicationId to check for updates" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +#: ../fdroidserver/dscanner.py ../fdroidserver/build.py +#: ../fdroidserver/scanner.py ../fdroidserver/install.py +msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "argument \"-\" with mode %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare SSH connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare ssh connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "can not parse scrlib spec (not a string): '{}'" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "can't open '%s': %s" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "cannot find required srclibs: \"{path}\"" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "cannot have multiple subparser arguments" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "cannot merge actions - two groups are named %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "cannot publish update, did you set the deploy key?" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "cloning {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "command to execute, either 'init' or 'update'" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "commands from plugin modules:" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "complex" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "conflicting option string: %s" +msgid_plural "conflicting option strings: %s" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "copying {apkfilename} into {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "could not parse '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no ref specified): '{}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (too many '@' signs): '{}'" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "created {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "deleting: repo/{apkfilename}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed build logs to '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed process log {path} to {dest}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "dest= is required for options like %r" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "executable binary, possibly code" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "expected %s argument" +msgid_plural "expected %s arguments" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected at least one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected at most one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected one argument" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "failed deploying build logs to '{path}'" +msgstr "" + +#: ../fdroid +msgid "fdroid [-h|--help|--version] []" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "fdroid [] [-h|--help|--version|]" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "floating-point" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force errors to be warnings, or ignore" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force metadata errors (default) to be warnings, or to be ignored." +msgstr "" + +#: ../fdroidserver/common.py +msgid "git svn clone failed" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "gzip file archive" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "ignored explicit argument %r" +msgstr "" + +#: ../fdroidserver/index.py +msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "integer" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid %(type)s value: %(value)r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid choice: %(value)r (choose from %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid conflict_resolution value: %r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be an absolute path!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be directory, not a file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "mirror '%s' does not end with 'fdroid'!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "mutually exclusive arguments must be optional" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "no \"icon\" in {appid}" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "no APK supplied" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "no such option: %s" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "no version info found!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "not allowed with argument %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "one of the arguments %s is required" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "only accepts strings, lists, and tuples" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "option %s: If you really want to install all the signed apps, use --all" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "option %s: invalid %s value: %r" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "option %s: invalid choice: %r (choose from %s)" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option -%s not recognized" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option -%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s must not have an argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s not a unique prefix" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s not recognized" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "optional arguments" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "overwriting existing {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "positional arguments" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "process log deploy {path} to {dest} failed!" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon %s does not exist, generating placeholder." +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "ruamel.yaml not installed, can not write metadata." +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "s3cmd sync indexes {path} to {url} and delete" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "shared library" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "show program's version number and exit" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py +#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +msgid "show this help message and exit" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "signed APK, either a file-path or HTTPS URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: log content is empty" +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: not enabled in config" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "skipping source tarball: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "srclibs missing name and/or @" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "static library" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "the following arguments are required: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unexpected option string: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unrecognized arguments: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "unsafe permissions on '{config_file}' (should be 0600)!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid +#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +msgid "usage: " +msgstr "" + +#: ../fdroid +msgid "usage: fdroid [-h|--help|--version] []" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "using Apache libcloud to sync with {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "virustotal.com is rate limiting, waiting to retry..." +msgstr "" + +#: ../fdroidserver/update.py +msgid "wiki support is deprecated and will be removed in the next release!" +msgstr "" + +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "{0} app, {1} key aliases" +msgid_plural "{0} apps, {1} key aliases" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} ({appid}) has no metadata!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using application ID instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using package name instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android Package Name!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android application ID!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Java Package Name!" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{appid} is missing {name}" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: Unknown extlib {path} in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "{appid}: no builds specified, running on current source state" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be an integer, found: {value}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{field} not terminated in {name}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{file} is blank or corrupt!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + +#: ../fdroidserver/import.py +#, python-brace-format +msgid "{path} already exists, ignoring import results!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "{path} does not exist! Create it by running:" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} is zero size!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} more than 200MB, manually upload: {url}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{url} does not end with \"fdroid\", check the URL path!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{url} does not start with \"http\"!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "{} build failed" +msgid_plural "{} builds failed" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/build.py +msgid "{} build succeeded" +msgid_plural "{} builds succeeded" +msgstr[0] "" +msgstr[1] "" From 7794f9a6457d53a15a5c229a3f31e6cfe81e338e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=A5rtenson?= Date: Fri, 29 Jan 2021 11:52:09 +0100 Subject: [PATCH 0120/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Swedi?= =?UTF-8?q?sh=20(sv)=20by=20Elias=20M=C3=A5rtenson=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 8.1% (48 of 588 strings) Co-authored-by: Elias Mårtenson Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sv/ Translation: F-Droid/F-Droid Server --- locale/sv/LC_MESSAGES/fdroidserver.po | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index cc3bda4a..30baded4 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -1,20 +1,21 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # Hans-Christoph Steiner , 2020. +# Elias Mårtenson , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2020-11-10 16:21+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2021-01-15 13:25+0000\n" +"Last-Translator: Elias Mårtenson \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4-dev\n" +"X-Generator: Weblate 4.5-dev\n" #: ../fdroidserver/common.py msgid "" @@ -693,8 +694,9 @@ msgid "Duplicate link in '{field}': {url}" msgstr "" #: ../fdroid +#, fuzzy msgid "Dynamically scan APKs post build" -msgstr "" +msgstr "Utför dynamisk APK-analys efter installation" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -1936,7 +1938,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Update the stats of the repo" -msgstr "" +msgstr "Uppdatera repostatistik" #: ../fdroidserver/update.py ../fdroidserver/build.py msgid "Update the wiki" @@ -2052,7 +2054,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" -msgstr "" +msgstr "Verifiera integriteten hos de nedladdade paketen" #: ../fdroidserver/index.py msgid "Verifying index signature:" @@ -2065,7 +2067,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" -msgstr "" +msgstr "Visa varningar vid möjliga metadatafel" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2102,15 +2104,15 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py -#, python-format +#, fuzzy, python-format msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "" +msgstr "Tvetydiga optioner: %(option) kan motsvara %(matches)" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" -msgstr "" +msgstr "tvetydig option: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2164,7 +2166,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "can't open '%s': %s" -msgstr "" +msgstr "kan inte öppna '%s': %s" #: ../fdroidserver/build.py #, python-brace-format From a334f24a7b5fd7db91f682a9a93fc24f7e6d5da5 Mon Sep 17 00:00:00 2001 From: Aled Powell Date: Fri, 29 Jan 2021 11:52:12 +0100 Subject: [PATCH 0121/2116] Translated using Weblate: Welsh (cy) by Aled Powell Currently translated at 6.4% (38 of 588 strings) Translated using Weblate: Welsh (cy) by Aled Powell Currently translated at 5.1% (30 of 588 strings) Translated using Weblate: Welsh (cy) by Aled Powell Currently translated at 3.7% (22 of 588 strings) Added translation using Weblate: Welsh (cy) by Aled Powell Co-authored-by: Aled Powell Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cy/ Translation: F-Droid/F-Droid Server --- locale/cy/LC_MESSAGES/fdroidserver.po | 2791 +++++++++++++++++++++++++ 1 file changed, 2791 insertions(+) create mode 100644 locale/cy/LC_MESSAGES/fdroidserver.po diff --git a/locale/cy/LC_MESSAGES/fdroidserver.po b/locale/cy/LC_MESSAGES/fdroidserver.po new file mode 100644 index 00000000..1a8880a3 --- /dev/null +++ b/locale/cy/LC_MESSAGES/fdroidserver.po @@ -0,0 +1,2791 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# Aled Powell , 2021. +msgid "" +msgstr "" +"Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" +"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"PO-Revision-Date: 2021-01-16 21:23+0000\n" +"Last-Translator: Aled Powell \n" +"Language-Team: Welsh \n" +"Language: cy\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=(n==0) ? 0 : (n==1) ? 1 : (n==2) ? 2 : (n==3) ? 3 :(n==6) ? 4 : 5;\n" +"X-Generator: Weblate 4.5-dev\n" + +#: ../fdroidserver/common.py +msgid "" +"\n" +" This is a repository of apps to be used with FDroid. Applications in this\n" +" repository are either official binaries built by the original application\n" +" developers, or are binaries built from source by f-droid.org using the\n" +" tools on https://gitlab.com/fdroid.\n" +" " +msgstr "" +"\n" +" Mae hon yn ystorfa o apiau i'w defnyddio gydag F-Droid. Mae apiau yn\n" +" yr ystorfa hon naill ai wedi eu hadeiladu gan ddatblygwyr yr ap\n" +" gwreiddiol, neu wedi eu hadeiladu o'u ffynonellau gan f-droid.org\n" +" wrth ddefnyddio'r offer ar https://gitlab.com/F-Droid.\n" +" " + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH Public Key to be used as Deploy Key:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH public key to be used as deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "" +"\n" +"{path} encoded for the DEBUG_KEYSTORE secret variable:" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "\"%s/\" has no matching metadata file!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "\"{apkfilename}\" is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains outdated {name} ({version})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains recent {name} ({version})" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "\"{path}\" exists but s3cmd is not installed!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "\"{path}\" is not an accepted format, convert to: {formats}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "\"{url}\" is not a valid URL!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "%(option)s option requires %(number)d argument" +msgid_plural "%(option)s option requires %(number)d arguments" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: ../fdroidserver/mirror.py +#, python-format +msgid "%(prog)s [options] url" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "%(prog)s: error: %(message)s\n" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "%d problems found" +msgstr "canfuwyd %d problem" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "%prog [options]" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "%r is not callable" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "%s is not an accepted build field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "%s option does not take a value" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keypass' not found in config.py!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' is NONE and 'smartcardoptions' is blank!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keystore' not found in config.py!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keystorepass' not found in config.py!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.py!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "'required' is an invalid argument for positionals" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in 'config.py'!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + +#. Translators: "build-tools" is the file name of a package from +#. Google, it is part of the Android SDK. So it probably shouldn't be +#. translated or transliterated. +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-23.0.0 or newer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "'{apkfilename}' is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{field}' in {linedesc} is obsolete, see docs for current fields:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{path}' failed to execute!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "...checkupdate failed for {appid} : {error}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid ".__call__() not defined" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "/issues is missing" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "A URL is required as an argument!" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Add PGP signatures using GnuPG for packages in repo" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Add a new application from its source code" +msgstr "Ychwanegu ap newydd o'i god ffynhonnell" + +#: ../fdroidserver/update.py +msgid "Add a repo signing key to an unsigned repo" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add skeleton metadata files for APKs that are missing them" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Adding new repo for only {name}" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Alias of the repo signing key in the keystore" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Also mirror the full archive section" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Also warn about formatting issues, like rewritemeta -l" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android AAR library" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android APK file" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android DEX code" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/build.py +#, python-brace-format +msgid "Android SDK '{path}' does not have '{dirname}' installed!" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Android SDK not found!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' is not a directory!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + +#. Translators: "build-tools" is the file name of a package from +#. Google, it is part of the Android SDK. So it probably shouldn't be +#. translated or transliterated. +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android build-tools path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/update.py +msgid "AndroidManifest.xml has no date" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "App is in '{repo}' but has a link to {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Appending .git is not necessary" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Archiving {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in srclib '{srclib}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Broken symlink: {path}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Build a package from source" +msgstr "Adeiladu pecyn o'r ffynhonnell" + +#: ../fdroidserver/build.py +msgid "Build all applications available" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Build generated by `fdroid import` - remove disable line once ready" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Build metadata git repo has uncommited changes!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build only the latest version of each package" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "Built repo based in \"%s\" with this config:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Can't build due to {} error while scanning" +msgid_plural "Can't build due to {} errors while scanning" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: ../fdroidserver/vmtools.py +#, python-brace-format +msgid "Cannot read \"{path}\"!" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Cannot resolve application ID {appid}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Cannot rewrite \"{path}\"" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "Cannot use --list and --to at the same time" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Categories '%s' is not valid" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Categories are not set" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Check for updates to applications" +msgstr "Gwirio am ddiweddariadau i apiau" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean after all scans have finished" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean before the scans start and rebuild the container" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean up all containers and then exit" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Clean update - don't uses caches, reprocess all APKs" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Comma separated list of categories." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +#, c-format, python-format +msgid "Command '%s' not recognised.\n" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Commit changes" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not find '{command}' on your system" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Could not find latest version code" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Could not find latest version name" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not find {path} to remove it" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + +#: ../fdroidserver/update.py +msgid "Could not open apk file for analysis" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not parse size \"{size}\", wrong type \"{type}\"" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/import.py +msgid "Couldn't find Application ID" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/import.py +msgid "Couldn't find latest version code" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/import.py +msgid "Couldn't find latest version name" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Couldn't find package ID" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Cowardily refusing to overwrite existing signing key setup!" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Create a repo signing key in a keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Create skeleton metadata files that are missing" +msgstr "Creu ffeiliau sgerbwd metaddata colledig" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Created new container \"{name}\"" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Creating \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating log directory" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Creating new S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating output directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating signed index with this key (SHA256):" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/verify.py +#: ../fdroidserver/publish.py +msgid "Creating temporary directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating unsigned index in preparation for signing" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "DEBUG_KEYSTORE is not set or the value is incomplete" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Delete APKs and/or OBBs without metadata from the repo" +msgstr "Dileu ffeiliau APK a/neu OBB heb fetaddata o'r ystorfa" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting archive, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Deleting unknown file: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description '%s' is just the app's summary" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Description has a duplicate line" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Description of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Do not add 'disable:' to the generated build entries" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not deploy the new files to the repo" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Do not include \"{path}\" in URL!" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Do not prompt for Android SDK path, just fail" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not remove the private keys generated from the keystore" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't create a source tarball, useful when testing a build" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Don't do anything logs-related" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/nightly.py +#: ../fdroidserver/upload.py +msgid "Don't use rsync checksums" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Download complete mirrors of small repos" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Download logs we don't have" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Downloading the repository already failed once, not trying again." +msgstr "" + +#: ../fdroidserver/verify.py +#, python-brace-format +msgid "Downloading {url} failed. {error}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Duplicate link in '{field}': {url}" +msgstr "" + +#: ../fdroid +msgid "Dynamically scan APKs post build" +msgstr "Sganio ffeiliau APK yn ddeinamig ar ôl eu hadeiladu" + +#: ../fdroidserver/__main__.py +msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "" +"ERROR: this command should never be used to mirror f-droid.org!\n" +"A full mirror of f-droid.org requires more than 200GB." +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "ERROR: unsupported CI type, patches welcome!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Empty build flag at {linedesc}" +msgstr "" + +#: ../fdroidserver/__main__.py +#, python-brace-format +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"Enter the path to the Android SDK (%s) here:\n" +"> " +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py +#: ../fdroidserver/upload.py +#, python-format +msgid "Error while attempting to publish log: %s" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/common.py +msgid "Error while getting repo address" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Extract signatures from APKs" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed copying {path}: {error}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Failed fetching signatures for '{apkfilename}': {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed reading {path}: {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed resizing {path}: {error}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Failed to align application" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Failed to create S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get apk information, deleting {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get apk information, skipping {path}" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Failed to install '{apkfilename}' on {dev}: {error}" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/common.py +msgid "Failed to sign application" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to zipalign application" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Fetched buildserverid from VM: {buildserverid}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "File disappeared while processing it: {path}" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/stats.py ../fdroidserver/update.py +#: ../fdroidserver/rewritemeta.py ../fdroidserver/build.py +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py +msgid "Finished" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID flag" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Forbidden HTML tags" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Force halting build after {0} sec timeout!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Force scan of disabled apps and builds." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found bad funding file \"{path}\" for \"{name}\":" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/metadata.py +msgid "Found invalid appids in arguments" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +msgid "Found invalid versionCodes for some apps" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Found multiple JAR Signature Block Files in {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Found multiple metadata files for {appid}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found multiple signing certificates for repository." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found multiple signing certificates in {path}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found no signing certificates for repository." +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Found non-file at %s" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Found {apkfilename} at {url}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Generated skeleton metadata for {appid}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git checkout of '%s' failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git clean failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git fetch failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git remote set-head failed" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git remote set-head failed: \"%s\"" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git reset failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule sync failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule update failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "HTTPS must be used with Subversion URLs!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "If a git mirror gets to big, allow the archive to be deleted" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "If this upload fails, try manually uploading to {url}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." +msgstr "" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring FUNDING.yml entry longer than 2048: %s" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Ignoring package without metadata: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Ignoring stale cache data for {apkfilename}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Ignoring {ext} file at '{path}'" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Include APKs that are signed with disabled algorithms like MD5" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the PGP signature .asc files in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the build logs in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the source tarballs in the mirror" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Initialising submodules" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Install all signed applications available" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Install built packages on devices" +msgstr "Gosod ar ddyfeisiau'r pecynnau a adeiladir" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s…" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}…" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Interact with the repo HTTP server" +msgstr "Rhyngweithio â gweinydd HTTP yr ystorfa" + +#: ../fdroidserver/update.py +msgid "Invalid APK" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid VercodeOperation: {field}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid application ID {appid}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid boolean '%s'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid build flag at {line} in {linedesc}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid build format: {value} in {name}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid bulleted list" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid metadata in %s:%d" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Invalid metadata in: " +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Invalid name for published file: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid package name {0}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid redirect to non-HTTPS: {before} -> {after} " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid scrlib metadata: '{file}' does not exist" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: could not parse '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid versionCode: \"{versionCode}\" is not an integer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature failed to verify: {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature verified: {path}" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java JAR file" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#: ../fdroidserver/mirror.py +msgid "Java JDK not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java compiled class" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Javascript in HTML src attributes" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Keystore for signing key:\t" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the Liberapay: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the LiberapayID flag" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Locale included in f-droid.org URL" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Make the build stop on exceptions" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Malformed repository mirrors." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Malformed serverwebroot line:" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Mirror the full repo and archive, all file types." +msgstr "" + +#: ../fdroidserver/gpgsign.py +msgid "Missing output directory" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Name '%s' is just the auto name - remove it" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No 'config.py' found, using defaults." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No Android SDK found!" +msgstr "" + +#: ../fdroidserver/import.py +msgid "No android or kivy project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No attached devices found" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "No commit specified for {versionName} in {linedesc}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + +#: ../fdroidserver/index.py +msgid "No fingerprint in URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No git submodules available" +msgstr "" + +#: ../fdroidserver/import.py +msgid "No gradle project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/common.py +msgid "No information found." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is Free Software" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is for Android" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "No option set! Edit your config.py to set at least one of these:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No packages specified" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "No signed apk available for %s" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No signed output directory - nothing to do" +msgstr "" + +#: ../fdroidserver/update.py ../fdroidserver/common.py +#, python-brace-format +msgid "No signing certificates found in {path}" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/metadata.py +#, python-format +msgid "No such package: %s" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No such versionCode {versionCode} for app {appid}" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +msgid "No unsigned directory - nothing to do" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Not a valid size definition: \"{}\"" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Nothing to do" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Nothing to do for {appid}." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Now set these in config.py:" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "OBB file has newer versionCode({integer}) than any APK:" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB filename must start with \"main.\" or \"patch.\":" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB's packagename does not match a supported APK:" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Old APK signature failed to verify: {path}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Old, deprecated name for fdroid deploy" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Only PNG and JPEG are supported for graphics, found: {path}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only print differences with the Play Store" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only process apps with auto-updates" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "OpenCollective donation methods belong in the OpenCollective: field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "Options" +msgstr "Dewisiadau" + +#: ../fdroidserver/verify.py +msgid "Output JSON report to file named after APK." +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Output JSON to stdout." +msgstr "" + +#: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py +#: ../fdroidserver/update.py ../fdroidserver/signindex.py +#: ../fdroidserver/checkupdates.py +msgid "Outputting JSON" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Overall license of the project." +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Override path for repo APKs (default: ./repo)" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" +msgstr "" + +#: ../fdroidserver/import.py +#, python-brace-format +msgid "Package \"{appid}\" already exists" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Parsing manifest at '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Password required with username" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Path to main Android project subdirectory, if not in root." +msgstr "" + +msgid "Path to main android project subdirectory, if not in root." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Path to the git repo to use as the log" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the keystore for the repo signing key" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Prepare Drozer to run a scan" +msgstr "" + +msgid "Prepare drozer to run a scan" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Print the secret variable to the terminal for easy copy/paste" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Problem with description of {appid}: {error}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Problem with xml at '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Process auto-updates" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#, python-brace-format +msgid "Processing {apkfilename}" +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#, python-brace-format +msgid "Processing {appid}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable XML/JSON for index files" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable index.xml" +msgstr "Creu index.html darllenadwy i bobl" + +#: ../fdroidserver/import.py +msgid "Project URL to import from." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Punctuation should be avoided" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Push the log to this git remote repository" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Pushing binary transparency log to {url}" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Pushing to {url}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Quickly start a new repository" +msgstr "Dechrau ystorfa newydd yn gyflym" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Read all the metadata files and exit" +msgstr "Darllen yr holl ffeiliau metaddata a gadael" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading '{config_file}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading minSdkVersion failed: \"{apkfilename}\"" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Reading {apkfilename} from cache" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Removing specified files" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Rename APK files that do not match package.name_123.apk" +msgstr "Ailenwi ffeiliau APK na sy'n dilyn y ffurf package.name_123.apk" + +#: ../fdroidserver/update.py +msgid "Report on build data status" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Resigning {apkfilename} with provided debug.keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Resize all the icons exceeding the max pixel size and exit" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Restrict output to warnings and errors" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Rewrite all the metadata files" +msgstr "Ailysgrifennu'r holl ffeiliau metaddata" + +#: ../fdroidserver/rewritemeta.py +msgid "Rewrite to a specific format: " +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}'" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}' to '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Run on git repo that has uncommitted changes" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Run rewritemeta to fix formatting" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Running first pass with MD5 checking disabled" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Running wget in {path}" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Scan only the latest version of each package" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scan the resulting APK(s) for known non-free classes." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Scan the source code of a package" +msgstr "Sganio cod ffynhonnell pecyn" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:{versionCode}:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scanner found {} problem" +msgid_plural "Scanner found {} problems" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: ../fdroidserver/common.py +msgid "Set clock to that time using:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Set maximum releases in repo before older ones are archived" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Set open file limit to {integer}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Set up an app build for a nightly build repo" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setting open file limit failed: " +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Setting {0} sec timeout for this build" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +msgstr "" + +msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Sign and place packages in the repo" +msgstr "Llofnodi a gosod pecynnau yn yr ystorfa" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Sign indexes created using update --nosign" +msgstr "Llofnodi mynegai gan ddefnyddio update --nosign" + +#: ../fdroidserver/build.py +msgid "Skip scanning the source code for binaries and other problems" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping '{apkfilename}' with invalid signature!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping index generation for {appid}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: disabled" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: no builds specified" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Specify a local folder to sync the repo to" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Specify an identity file to provide to SSH for rsyncing" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Specify that we're running on the build server" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Specify which debug keystore file to use." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Spew out even more information than normal" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Striping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Stripping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Summary '%s' is just the app's name" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Summary of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "System clock is older than date in {path}!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "The OBB version code must come after \"{name}.\":" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "The base URL for the repo to log (default: https://f-droid.org)" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "The directory to write the mirror to" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "The file to be included in the repo (path or glob)" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "The only commands currently supported are 'init' and 'update'" +msgstr "" + +#: ../fdroidserver/index.py +msgid "The repository's fingerprint does not match." +msgstr "" + +#: ../fdroidserver/common.py +msgid "The repository's index could not be verified." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "The root dir for local_copy_dir \"{path}\" does not exist!" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "There is a keyalias collision - publishing halted" +msgstr "" + +#: ../fdroidserver/common.py +msgid "These are the apps that have been archived from the main repo." +msgstr "" + +#: ../fdroidserver/import.py +#, python-format +msgid "This repo already has local metadata: %s" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL must start with https:// or http://" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL shorteners should not be used" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "URL title is just the URL, use brackets: [URL]" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "URL {url} in Description: {error}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unexpected text on same line as {field} in {linedesc}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Unknown exception found!" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Unknown file '{filename}' in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Unknown metadata format: %s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path} (use: *.yml)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Unknown version of aapt, might cause problems: " +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary leading space" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary trailing space" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised app field '{fieldname}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unrecognised app field: " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised build flag '{build_flag}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised field '{field}' in {linedesc}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported file type \"{extension}\" for repo graphic" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported graphics file found: {path}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Unsupported metadata format, use: --to [{supported}]" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unterminated ]" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unterminated ]]" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unterminated build in {name}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unterminated continuation in {name}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused extlib at %s" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused file at %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scandelete path: %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scanignore path: %s" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update repo information for new packages" +msgstr "Diweddaru gwybodaeth ystorfa am becynnau newydd" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update the binary transparency log for a URL" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update the stats of the repo" +msgstr "Diweddaru ystadegau'r ystorfa" + +#: ../fdroidserver/update.py ../fdroidserver/build.py +msgid "Update the wiki" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "UpdateCheckData has invalid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must use HTTPS URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData not a valid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID - it can be removed" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID, it can be removed" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to androidobservatory.org" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to virustotal" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "Usage" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "Usage: %s\n" +msgstr "Defndd: %s\n" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master to point at a file in the default branch" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use `fdroid update -c` to create it." +msgstr "" + +#: ../fdroidserver/build.py +msgid "Use build server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "" + +msgid "Use date from apk instead of current time for newly added apks" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Using \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v2" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v3" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Using androguard from \"{path}\"" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Using existing keystore \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Using s3cmd to sync with: {url}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Valid commands are:" +msgstr "Gorchmynion dilys yw:" + +#: ../fdroidserver/verify.py +msgid "Verify against locally cached copy rather than redownloading." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Verify the integrity of downloaded packages" +msgstr "Gwirio dilysrwydd pecynnau a lawrlwythir" + +#: ../fdroidserver/index.py +msgid "Verifying index signature:" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Warn about possible metadata errors" +msgstr "Rhybuddio am wallau metaddata posib" + +#: ../fdroidserver/update.py +msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgstr "" + +msgid "X.509 'Distiguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/init.py +msgid "X.509 'Distinguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/common.py +msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "ZIP file archive" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "adding IdentityFile to {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "adding to {name}: {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "dewis amwys: gall %(option)s gydweddu â %(matches)s" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "ambiguous option: %s (%s?)" +msgstr "dewis amwys: %s (%s?)" + +#: ../fdroidserver/common.py +msgid "apksigner not found, it's required for signing!" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py +#: ../fdroidserver/checkupdates.py +msgid "application ID of file to operate on" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py +msgid "application ID with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py +msgid "applicationId in the form APPID" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "applicationId to check for updates" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +#: ../fdroidserver/dscanner.py ../fdroidserver/build.py +#: ../fdroidserver/scanner.py ../fdroidserver/install.py +msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "argument \"-\" with mode %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare SSH connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare ssh connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "can not parse scrlib spec (not a string): '{}'" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "can't open '%s': %s" +msgstr "methu agor '%s': %s" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "cannot find required srclibs: \"{path}\"" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "cannot have multiple subparser arguments" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "cannot merge actions - two groups are named %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "cannot publish update, did you set the deploy key?" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "cloning {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "command to execute, either 'init' or 'update'" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "commands from plugin modules:" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "complex" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "conflicting option string: %s" +msgid_plural "conflicting option strings: %s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "copying {apkfilename} into {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "could not parse '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no ref specified): '{}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (too many '@' signs): '{}'" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "created {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "deleting: repo/{apkfilename}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed build logs to '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed process log {path} to {dest}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "dest= is required for options like %r" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "executable binary, possibly code" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "expected %s argument" +msgid_plural "expected %s arguments" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected at least one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected at most one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected one argument" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "failed deploying build logs to '{path}'" +msgstr "" + +#: ../fdroid +msgid "fdroid [-h|--help|--version] []" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "fdroid [] [-h|--help|--version|]" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "floating-point" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force errors to be warnings, or ignore" +msgstr "gorfodi gwallau i fod yn rhybuddion, neu anwybyddu" + +#: ../fdroidserver/metadata.py +msgid "force metadata errors (default) to be warnings, or to be ignored." +msgstr "" + +#: ../fdroidserver/common.py +msgid "git svn clone failed" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "gzip file archive" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "ignored explicit argument %r" +msgstr "" + +#: ../fdroidserver/index.py +msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "integer" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid %(type)s value: %(value)r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid choice: %(value)r (choose from %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid conflict_resolution value: %r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be an absolute path!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be directory, not a file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "mirror '%s' does not end with 'fdroid'!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "mutually exclusive arguments must be optional" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "no \"icon\" in {appid}" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "no APK supplied" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "no such option: %s" +msgstr "dim dewis o'r fath: %s" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "no version info found!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "not allowed with argument %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "one of the arguments %s is required" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "only accepts strings, lists, and tuples" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "option %s: If you really want to install all the signed apps, use --all" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "option %s: invalid %s value: %r" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "option %s: invalid choice: %r (choose from %s)" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option -%s not recognized" +msgstr "dewis -%s heb ei adnabod" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option -%s requires argument" +msgstr "dewis -%s angen ymresymiad" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s must not have an argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s not a unique prefix" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s not recognized" +msgstr "dewis --%s heb ei adnabod" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "optional arguments" +msgstr "ymresymiadau dewisol" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "overwriting existing {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "positional arguments" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "process log deploy {path} to {dest} failed!" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon %s does not exist, generating placeholder." +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "ruamel.yaml not installed, can not write metadata." +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "s3cmd sync indexes {path} to {url} and delete" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "shared library" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "show program's version number and exit" +msgstr "dangos rhif fersiwn y rhaglen a gadael" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py +#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +msgid "show this help message and exit" +msgstr "dangos y neges cymorth hon a gadael" + +#: ../fdroidserver/signatures.py +msgid "signed APK, either a file-path or HTTPS URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: log content is empty" +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: not enabled in config" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "skipping source tarball: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "srclibs missing name and/or @" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "static library" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "the following arguments are required: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unexpected option string: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unrecognized arguments: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "unsafe permissions on '{config_file}' (should be 0600)!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid +#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +msgid "usage: " +msgstr "defnydd: " + +#: ../fdroid +msgid "usage: fdroid [-h|--help|--version] []" +msgstr "defnydd: fdroid [-h|--help|--version] []" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "using Apache libcloud to sync with {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "virustotal.com is rate limiting, waiting to retry..." +msgstr "" + +#: ../fdroidserver/update.py +msgid "wiki support is deprecated and will be removed in the next release!" +msgstr "" + +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "{0} app, {1} key aliases" +msgid_plural "{0} apps, {1} key aliases" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} ({appid}) has no metadata!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using application ID instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using package name instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android Package Name!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android application ID!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Java Package Name!" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{appid} is missing {name}" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: Unknown extlib {path} in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "{appid}: no builds specified, running on current source state" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be an integer, found: {value}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{field} not terminated in {name}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{file} is blank or corrupt!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + +#: ../fdroidserver/import.py +#, python-brace-format +msgid "{path} already exists, ignoring import results!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "{path} does not exist! Create it by running:" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} is zero size!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} more than 200MB, manually upload: {url}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{url} does not end with \"fdroid\", check the URL path!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{url} does not start with \"http\"!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "{} build failed" +msgid_plural "{} builds failed" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: ../fdroidserver/build.py +msgid "{} build succeeded" +msgid_plural "{} builds succeeded" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" From a10e55e40fce1531e776e5e5a0c65dd25c9a720d Mon Sep 17 00:00:00 2001 From: Isrg Rajan Date: Fri, 29 Jan 2021 11:52:13 +0100 Subject: [PATCH 0122/2116] Translated using Weblate: Hindi (hi) by Isrg Rajan Currently translated at 2.5% (15 of 588 strings) Added translation using Weblate: Hindi (hi) by Isrg Rajan Co-authored-by: Isrg Rajan Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/hi/ Translation: F-Droid/F-Droid Server --- locale/hi/LC_MESSAGES/fdroidserver.po | 2753 +++++++++++++++++++++++++ 1 file changed, 2753 insertions(+) create mode 100644 locale/hi/LC_MESSAGES/fdroidserver.po diff --git a/locale/hi/LC_MESSAGES/fdroidserver.po b/locale/hi/LC_MESSAGES/fdroidserver.po new file mode 100644 index 00000000..dd6a00c7 --- /dev/null +++ b/locale/hi/LC_MESSAGES/fdroidserver.po @@ -0,0 +1,2753 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# Isrg Rajan , 2021. +msgid "" +msgstr "" +"Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" +"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" +"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"PO-Revision-Date: 2021-01-24 08:48+0000\n" +"Last-Translator: Isrg Rajan \n" +"Language-Team: Hindi \n" +"Language: hi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.5-dev\n" + +#: ../fdroidserver/common.py +msgid "" +"\n" +" This is a repository of apps to be used with FDroid. Applications in this\n" +" repository are either official binaries built by the original application\n" +" developers, or are binaries built from source by f-droid.org using the\n" +" tools on https://gitlab.com/fdroid.\n" +" " +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH Public Key to be used as Deploy Key:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH public key to be used as deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "" +"\n" +"{path} encoded for the DEBUG_KEYSTORE secret variable:" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "\"%s/\" has no matching metadata file!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "\"{apkfilename}\" is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains outdated {name} ({version})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains recent {name} ({version})" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "\"{path}\" exists but s3cmd is not installed!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "\"{path}\" is not an accepted format, convert to: {formats}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "\"{url}\" is not a valid URL!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "%(option)s option requires %(number)d argument" +msgid_plural "%(option)s option requires %(number)d arguments" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/mirror.py +#, python-format +msgid "%(prog)s [options] url" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "%(prog)s: error: %(message)s\n" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "%d problems found" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "%prog [options]" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "%r is not callable" +msgstr "%r कॉल करने योग्य नहीं है" + +#: ../fdroidserver/lint.py +#, python-format +msgid "%s is not an accepted build field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "%s option does not take a value" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keypass' not found in config.py!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' is NONE and 'smartcardoptions' is blank!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keystore' not found in config.py!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keystorepass' not found in config.py!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.py!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "'required' is an invalid argument for positionals" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in 'config.py'!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + +#. Translators: "build-tools" is the file name of a package from +#. Google, it is part of the Android SDK. So it probably shouldn't be +#. translated or transliterated. +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-23.0.0 or newer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "'{apkfilename}' is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{field}' in {linedesc} is obsolete, see docs for current fields:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{path}' failed to execute!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "...checkupdate failed for {appid} : {error}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid ".__call__() not defined" +msgstr ".__call__() परिभाषित नहीं" + +#: ../fdroidserver/metadata.py +msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "/issues is missing" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "A URL is required as an argument!" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Add PGP signatures using GnuPG for packages in repo" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Add a new application from its source code" +msgstr "इसके सोर्स कोड से एक नया एप्लिकेशन जोड़ें" + +#: ../fdroidserver/update.py +msgid "Add a repo signing key to an unsigned repo" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add skeleton metadata files for APKs that are missing them" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Adding new repo for only {name}" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Alias of the repo signing key in the keystore" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Also mirror the full archive section" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Also warn about formatting issues, like rewritemeta -l" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android AAR library" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android APK file" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android DEX code" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/build.py +#, python-brace-format +msgid "Android SDK '{path}' does not have '{dirname}' installed!" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Android SDK not found!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' is not a directory!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + +#. Translators: "build-tools" is the file name of a package from +#. Google, it is part of the Android SDK. So it probably shouldn't be +#. translated or transliterated. +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android build-tools path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/update.py +msgid "AndroidManifest.xml has no date" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "App is in '{repo}' but has a link to {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Appending .git is not necessary" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Archiving {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in srclib '{srclib}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Broken symlink: {path}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Build a package from source" +msgstr "स्रोत से एक पैकेज बनाएँ" + +#: ../fdroidserver/build.py +msgid "Build all applications available" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Build generated by `fdroid import` - remove disable line once ready" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Build metadata git repo has uncommited changes!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build only the latest version of each package" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "Built repo based in \"%s\" with this config:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Can't build due to {} error while scanning" +msgid_plural "Can't build due to {} errors while scanning" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/vmtools.py +#, python-brace-format +msgid "Cannot read \"{path}\"!" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Cannot resolve application ID {appid}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Cannot rewrite \"{path}\"" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "Cannot use --list and --to at the same time" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Categories '%s' is not valid" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Categories are not set" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Check for updates to applications" +msgstr "अनुप्रयोगों के अपडेट के लिए जाँच करें" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean after all scans have finished" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean before the scans start and rebuild the container" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Clean up all containers and then exit" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Clean update - don't uses caches, reprocess all APKs" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Comma separated list of categories." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +#, c-format, python-format +msgid "Command '%s' not recognised.\n" +msgstr "कमांड '%s' पहचाना नहीं।\n" + +#: ../fdroidserver/checkupdates.py +msgid "Commit changes" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not find '{command}' on your system" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Could not find latest version code" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Could not find latest version name" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not find {path} to remove it" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + +#: ../fdroidserver/update.py +msgid "Could not open apk file for analysis" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not parse size \"{size}\", wrong type \"{type}\"" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/import.py +msgid "Couldn't find Application ID" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/import.py +msgid "Couldn't find latest version code" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/import.py +msgid "Couldn't find latest version name" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Couldn't find package ID" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Cowardily refusing to overwrite existing signing key setup!" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Create a repo signing key in a keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Create skeleton metadata files that are missing" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Created new container \"{name}\"" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Creating \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating log directory" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Creating new S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating output directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating signed index with this key (SHA256):" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/verify.py +#: ../fdroidserver/publish.py +msgid "Creating temporary directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating unsigned index in preparation for signing" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "DEBUG_KEYSTORE is not set or the value is incomplete" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Delete APKs and/or OBBs without metadata from the repo" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting archive, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Deleting unknown file: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description '%s' is just the app's summary" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Description has a duplicate line" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Description of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Do not add 'disable:' to the generated build entries" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not deploy the new files to the repo" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Do not include \"{path}\" in URL!" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Do not prompt for Android SDK path, just fail" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not remove the private keys generated from the keystore" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't create a source tarball, useful when testing a build" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Don't do anything logs-related" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/nightly.py +#: ../fdroidserver/upload.py +msgid "Don't use rsync checksums" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Download complete mirrors of small repos" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Download logs we don't have" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Downloading the repository already failed once, not trying again." +msgstr "" + +#: ../fdroidserver/verify.py +#, python-brace-format +msgid "Downloading {url} failed. {error}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Duplicate link in '{field}': {url}" +msgstr "" + +#: ../fdroid +msgid "Dynamically scan APKs post build" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "" +"ERROR: this command should never be used to mirror f-droid.org!\n" +"A full mirror of f-droid.org requires more than 200GB." +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "ERROR: unsupported CI type, patches welcome!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Empty build flag at {linedesc}" +msgstr "" + +#: ../fdroidserver/__main__.py +#, python-brace-format +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"Enter the path to the Android SDK (%s) here:\n" +"> " +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py +#: ../fdroidserver/upload.py +#, python-format +msgid "Error while attempting to publish log: %s" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/common.py +msgid "Error while getting repo address" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Extract signatures from APKs" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed copying {path}: {error}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Failed fetching signatures for '{apkfilename}': {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed reading {path}: {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed resizing {path}: {error}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Failed to align application" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Failed to create S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get apk information, deleting {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get apk information, skipping {path}" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Failed to install '{apkfilename}' on {dev}: {error}" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/common.py +msgid "Failed to sign application" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to zipalign application" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Fetched buildserverid from VM: {buildserverid}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "File disappeared while processing it: {path}" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/stats.py ../fdroidserver/update.py +#: ../fdroidserver/rewritemeta.py ../fdroidserver/build.py +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py +msgid "Finished" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID flag" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Forbidden HTML tags" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Force halting build after {0} sec timeout!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Force scan of disabled apps and builds." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found bad funding file \"{path}\" for \"{name}\":" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/metadata.py +msgid "Found invalid appids in arguments" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +msgid "Found invalid versionCodes for some apps" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Found multiple JAR Signature Block Files in {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Found multiple metadata files for {appid}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found multiple signing certificates for repository." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found multiple signing certificates in {path}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found no signing certificates for repository." +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Found non-file at %s" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Found {apkfilename} at {url}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Generated skeleton metadata for {appid}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git checkout of '%s' failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git clean failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git fetch failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git remote set-head failed" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git remote set-head failed: \"%s\"" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git reset failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule sync failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule update failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "HTTPS must be used with Subversion URLs!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "If a git mirror gets to big, allow the archive to be deleted" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "If this upload fails, try manually uploading to {url}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." +msgstr "" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring FUNDING.yml entry longer than 2048: %s" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Ignoring package without metadata: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Ignoring stale cache data for {apkfilename}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Ignoring {ext} file at '{path}'" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Include APKs that are signed with disabled algorithms like MD5" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the PGP signature .asc files in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the build logs in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the source tarballs in the mirror" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Initialising submodules" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Install all signed applications available" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Install built packages on devices" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s…" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}…" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Interact with the repo HTTP server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Invalid APK" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid VercodeOperation: {field}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid application ID {appid}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid boolean '%s'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid build flag at {line} in {linedesc}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid build format: {value} in {name}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid bulleted list" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid metadata in %s:%d" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Invalid metadata in: " +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Invalid name for published file: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid package name {0}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid redirect to non-HTTPS: {before} -> {after} " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid scrlib metadata: '{file}' does not exist" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: could not parse '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid versionCode: \"{versionCode}\" is not an integer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature failed to verify: {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature verified: {path}" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java JAR file" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#: ../fdroidserver/mirror.py +msgid "Java JDK not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java compiled class" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Javascript in HTML src attributes" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Keystore for signing key:\t" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the Liberapay: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the LiberapayID flag" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Locale included in f-droid.org URL" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Make the build stop on exceptions" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Malformed repository mirrors." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Malformed serverwebroot line:" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Mirror the full repo and archive, all file types." +msgstr "" + +#: ../fdroidserver/gpgsign.py +msgid "Missing output directory" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Name '%s' is just the auto name - remove it" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No 'config.py' found, using defaults." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No Android SDK found!" +msgstr "" + +#: ../fdroidserver/import.py +msgid "No android or kivy project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No attached devices found" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "No commit specified for {versionName} in {linedesc}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + +#: ../fdroidserver/index.py +msgid "No fingerprint in URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No git submodules available" +msgstr "" + +#: ../fdroidserver/import.py +msgid "No gradle project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/common.py +msgid "No information found." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is Free Software" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is for Android" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "No option set! Edit your config.py to set at least one of these:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No packages specified" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "No signed apk available for %s" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No signed output directory - nothing to do" +msgstr "" + +#: ../fdroidserver/update.py ../fdroidserver/common.py +#, python-brace-format +msgid "No signing certificates found in {path}" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/metadata.py +#, python-format +msgid "No such package: %s" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No such versionCode {versionCode} for app {appid}" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +msgid "No unsigned directory - nothing to do" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Not a valid size definition: \"{}\"" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Nothing to do" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Nothing to do for {appid}." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Now set these in config.py:" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "OBB file has newer versionCode({integer}) than any APK:" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB filename must start with \"main.\" or \"patch.\":" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB's packagename does not match a supported APK:" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Old APK signature failed to verify: {path}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Old, deprecated name for fdroid deploy" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Only PNG and JPEG are supported for graphics, found: {path}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only print differences with the Play Store" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only process apps with auto-updates" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "OpenCollective donation methods belong in the OpenCollective: field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "Options" +msgstr "विकल्प" + +#: ../fdroidserver/verify.py +msgid "Output JSON report to file named after APK." +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Output JSON to stdout." +msgstr "" + +#: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py +#: ../fdroidserver/update.py ../fdroidserver/signindex.py +#: ../fdroidserver/checkupdates.py +msgid "Outputting JSON" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Overall license of the project." +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Override path for repo APKs (default: ./repo)" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" +msgstr "" + +#: ../fdroidserver/import.py +#, python-brace-format +msgid "Package \"{appid}\" already exists" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Parsing manifest at '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Password required with username" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Path to main Android project subdirectory, if not in root." +msgstr "" + +msgid "Path to main android project subdirectory, if not in root." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Path to the git repo to use as the log" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the keystore for the repo signing key" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Prepare Drozer to run a scan" +msgstr "" + +msgid "Prepare drozer to run a scan" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Print the secret variable to the terminal for easy copy/paste" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Problem with description of {appid}: {error}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Problem with xml at '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Process auto-updates" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#, python-brace-format +msgid "Processing {apkfilename}" +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#, python-brace-format +msgid "Processing {appid}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable XML/JSON for index files" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable index.xml" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Project URL to import from." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Punctuation should be avoided" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Push the log to this git remote repository" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Pushing binary transparency log to {url}" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Pushing to {url}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Quickly start a new repository" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Read all the metadata files and exit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading '{config_file}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading minSdkVersion failed: \"{apkfilename}\"" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Reading {apkfilename} from cache" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Removing specified files" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Rename APK files that do not match package.name_123.apk" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Report on build data status" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Resigning {apkfilename} with provided debug.keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Resize all the icons exceeding the max pixel size and exit" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Restrict output to warnings and errors" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Rewrite all the metadata files" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "Rewrite to a specific format: " +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}'" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}' to '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Run on git repo that has uncommitted changes" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Run rewritemeta to fix formatting" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Running first pass with MD5 checking disabled" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Running wget in {path}" +msgstr "" + +#: ../fdroidserver/dscanner.py +msgid "Scan only the latest version of each package" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scan the resulting APK(s) for known non-free classes." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Scan the source code of a package" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:{versionCode}:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scanner found {} problem" +msgid_plural "Scanner found {} problems" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/common.py +msgid "Set clock to that time using:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Set maximum releases in repo before older ones are archived" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Set open file limit to {integer}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Set up an app build for a nightly build repo" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setting open file limit failed: " +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Setting {0} sec timeout for this build" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +msgstr "" + +msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Sign and place packages in the repo" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Sign indexes created using update --nosign" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Skip scanning the source code for binaries and other problems" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping '{apkfilename}' with invalid signature!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping index generation for {appid}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: disabled" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: no builds specified" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Specify a local folder to sync the repo to" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Specify an identity file to provide to SSH for rsyncing" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Specify that we're running on the build server" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Specify which debug keystore file to use." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Spew out even more information than normal" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Striping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Stripping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Summary '%s' is just the app's name" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Summary of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "System clock is older than date in {path}!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "The OBB version code must come after \"{name}.\":" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "The base URL for the repo to log (default: https://f-droid.org)" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "The directory to write the mirror to" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "The file to be included in the repo (path or glob)" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "The only commands currently supported are 'init' and 'update'" +msgstr "" + +#: ../fdroidserver/index.py +msgid "The repository's fingerprint does not match." +msgstr "" + +#: ../fdroidserver/common.py +msgid "The repository's index could not be verified." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "The root dir for local_copy_dir \"{path}\" does not exist!" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "There is a keyalias collision - publishing halted" +msgstr "" + +#: ../fdroidserver/common.py +msgid "These are the apps that have been archived from the main repo." +msgstr "" + +#: ../fdroidserver/import.py +#, python-format +msgid "This repo already has local metadata: %s" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL must start with https:// or http://" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL shorteners should not be used" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "URL title is just the URL, use brackets: [URL]" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "URL {url} in Description: {error}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unexpected text on same line as {field} in {linedesc}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Unknown exception found!" +msgstr "अज्ञात अपवाद मिला!" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Unknown file '{filename}' in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Unknown metadata format: %s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path} (use: *.yml)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Unknown version of aapt, might cause problems: " +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary leading space" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary trailing space" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised app field '{fieldname}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unrecognised app field: " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised build flag '{build_flag}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised field '{field}' in {linedesc}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported file type \"{extension}\" for repo graphic" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported graphics file found: {path}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Unsupported metadata format, use: --to [{supported}]" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unterminated ]" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unterminated ]]" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unterminated build in {name}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unterminated continuation in {name}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused extlib at %s" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused file at %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scandelete path: %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scanignore path: %s" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update repo information for new packages" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update the binary transparency log for a URL" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update the stats of the repo" +msgstr "" + +#: ../fdroidserver/update.py ../fdroidserver/build.py +msgid "Update the wiki" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "UpdateCheckData has invalid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must use HTTPS URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData not a valid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID - it can be removed" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID, it can be removed" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to androidobservatory.org" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to virustotal" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "Usage" +msgstr "प्रयोग" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "Usage: %s\n" +msgstr "प्रयोग: %s\n" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master to point at a file in the default branch" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use `fdroid update -c` to create it." +msgstr "" + +#: ../fdroidserver/build.py +msgid "Use build server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "" + +msgid "Use date from apk instead of current time for newly added apks" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Using \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v2" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v3" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Using androguard from \"{path}\"" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Using existing keystore \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Using s3cmd to sync with: {url}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Valid commands are:" +msgstr "मान्य कमांड्स हैं:" + +#: ../fdroidserver/verify.py +msgid "Verify against locally cached copy rather than redownloading." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Verify the integrity of downloaded packages" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Verifying index signature:" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Warn about possible metadata errors" +msgstr "" + +#: ../fdroidserver/update.py +msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgstr "" + +msgid "X.509 'Distiguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/init.py +msgid "X.509 'Distinguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/common.py +msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "ZIP file archive" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "adding IdentityFile to {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "adding to {name}: {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "ambiguous option: %s (%s?)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "apksigner not found, it's required for signing!" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py +#: ../fdroidserver/checkupdates.py +msgid "application ID of file to operate on" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py +msgid "application ID with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py +msgid "applicationId in the form APPID" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "applicationId to check for updates" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +#: ../fdroidserver/dscanner.py ../fdroidserver/build.py +#: ../fdroidserver/scanner.py ../fdroidserver/install.py +msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "argument \"-\" with mode %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare SSH connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare ssh connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "can not parse scrlib spec (not a string): '{}'" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "can't open '%s': %s" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "cannot find required srclibs: \"{path}\"" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "cannot have multiple subparser arguments" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "cannot merge actions - two groups are named %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "cannot publish update, did you set the deploy key?" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "cloning {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "command to execute, either 'init' or 'update'" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "commands from plugin modules:" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "complex" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "conflicting option string: %s" +msgid_plural "conflicting option strings: %s" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "copying {apkfilename} into {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "could not parse '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no ref specified): '{}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (too many '@' signs): '{}'" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "created {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "deleting: repo/{apkfilename}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed build logs to '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed process log {path} to {dest}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "dest= is required for options like %r" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "executable binary, possibly code" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "expected %s argument" +msgid_plural "expected %s arguments" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected at least one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected at most one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected one argument" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "failed deploying build logs to '{path}'" +msgstr "" + +#: ../fdroid +msgid "fdroid [-h|--help|--version] []" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "fdroid [] [-h|--help|--version|]" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "floating-point" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force errors to be warnings, or ignore" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force metadata errors (default) to be warnings, or to be ignored." +msgstr "" + +#: ../fdroidserver/common.py +msgid "git svn clone failed" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "gzip file archive" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "ignored explicit argument %r" +msgstr "" + +#: ../fdroidserver/index.py +msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "integer" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid %(type)s value: %(value)r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid choice: %(value)r (choose from %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid conflict_resolution value: %r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be an absolute path!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be directory, not a file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "mirror '%s' does not end with 'fdroid'!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "mutually exclusive arguments must be optional" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "no \"icon\" in {appid}" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "no APK supplied" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "no such option: %s" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "no version info found!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "not allowed with argument %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "one of the arguments %s is required" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "only accepts strings, lists, and tuples" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "option %s: If you really want to install all the signed apps, use --all" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "option %s: invalid %s value: %r" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "option %s: invalid choice: %r (choose from %s)" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option -%s not recognized" +msgstr "विकल्प -%s मान्यता प्राप्त नहीं" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option -%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s must not have an argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s not a unique prefix" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s not recognized" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "optional arguments" +msgstr "वैकल्पिक तर्क" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "overwriting existing {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "positional arguments" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "process log deploy {path} to {dest} failed!" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon %s does not exist, generating placeholder." +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "ruamel.yaml not installed, can not write metadata." +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "s3cmd sync indexes {path} to {url} and delete" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "shared library" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "show program's version number and exit" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py +#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +msgid "show this help message and exit" +msgstr "यह मदद संदेश दिखाएं और बाहर निकलें" + +#: ../fdroidserver/signatures.py +msgid "signed APK, either a file-path or HTTPS URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: log content is empty" +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: not enabled in config" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "skipping source tarball: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "srclibs missing name and/or @" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "static library" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "the following arguments are required: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unexpected option string: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unrecognized arguments: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "unsafe permissions on '{config_file}' (should be 0600)!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid +#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +msgid "usage: " +msgstr "प्रयोग: " + +#: ../fdroid +msgid "usage: fdroid [-h|--help|--version] []" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "using Apache libcloud to sync with {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "virustotal.com is rate limiting, waiting to retry..." +msgstr "" + +#: ../fdroidserver/update.py +msgid "wiki support is deprecated and will be removed in the next release!" +msgstr "" + +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "{0} app, {1} key aliases" +msgid_plural "{0} apps, {1} key aliases" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} ({appid}) has no metadata!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using application ID instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using package name instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android Package Name!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android application ID!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Java Package Name!" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{appid} is missing {name}" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: Unknown extlib {path} in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "{appid}: no builds specified, running on current source state" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be an integer, found: {value}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{field} not terminated in {name}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{file} is blank or corrupt!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + +#: ../fdroidserver/import.py +#, python-brace-format +msgid "{path} already exists, ignoring import results!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "{path} does not exist! Create it by running:" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} is zero size!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} more than 200MB, manually upload: {url}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{url} does not end with \"fdroid\", check the URL path!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{url} does not start with \"http\"!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "{} build failed" +msgid_plural "{} builds failed" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/build.py +msgid "{} build succeeded" +msgid_plural "{} builds succeeded" +msgstr[0] "" +msgstr[1] "" From f48ea06adb0b272cc6e3ad918fd2236e0bc7c97b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 29 Jan 2021 13:22:34 +0100 Subject: [PATCH 0123/2116] add final release language list --- CHANGELOG.md | 2 ++ MANIFEST.in | 1 + 2 files changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75a7a058..dda785f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,8 @@ milestone](https://gitlab.com/fdroid/fdroidserver/-/milestones/10) ([!782](https://gitlab.com/fdroid/fdroidserver/merge_requests/782)) * `fdroid update` support for Triple-T Gradle Play Publisher v2.x ([!683](https://gitlab.com/fdroid/fdroidserver/merge_requests/683)) +* Translated into: bo de es fr hu it ko nb_NO pl pt pt_BR pt_PT ru sq tr uk + zh_Hans zh_Hant ### Fixed * Smoother process for signing APKs with `apksigner` diff --git a/MANIFEST.in b/MANIFEST.in index 4a14e8ad..0d72d061 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -30,6 +30,7 @@ include locale/it/LC_MESSAGES/fdroidserver.mo include locale/ko/LC_MESSAGES/fdroidserver.mo include locale/nb_NO/LC_MESSAGES/fdroidserver.mo include locale/pl/LC_MESSAGES/fdroidserver.mo +include locale/pt/LC_MESSAGES/fdroidserver.mo include locale/pt_BR/LC_MESSAGES/fdroidserver.mo include locale/pt_PT/LC_MESSAGES/fdroidserver.mo include locale/ru/LC_MESSAGES/fdroidserver.mo From 97d5933a05597aacb04e8d017d3752625ec4ebf4 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 29 Jan 2021 13:24:17 +0100 Subject: [PATCH 0124/2116] change config.py to config.yml everywhere it is needed --- fdroidserver/common.py | 6 +-- fdroidserver/deploy.py | 4 +- fdroidserver/index.py | 2 +- fdroidserver/stats.py | 2 +- locale/ang/LC_MESSAGES/fdroidserver.po | 20 ++++---- locale/bn/LC_MESSAGES/fdroidserver.po | 20 ++++---- locale/bo/LC_MESSAGES/fdroidserver.po | 54 ++++++++++----------- locale/cs/LC_MESSAGES/fdroidserver.po | 20 ++++---- locale/cy/LC_MESSAGES/fdroidserver.po | 20 ++++---- locale/de/LC_MESSAGES/fdroidserver.po | 40 ++++++++-------- locale/el/LC_MESSAGES/fdroidserver.po | 20 ++++---- locale/enm/LC_MESSAGES/fdroidserver.po | 20 ++++---- locale/es/LC_MESSAGES/fdroidserver.po | 40 ++++++++-------- locale/es_AR/LC_MESSAGES/fdroidserver.po | 20 ++++---- locale/es_MX/LC_MESSAGES/fdroidserver.po | 20 ++++---- locale/eu/LC_MESSAGES/fdroidserver.po | 20 ++++---- locale/fa/LC_MESSAGES/fdroidserver.po | 20 ++++---- locale/fdroidserver.pot | 20 ++++---- locale/fi/LC_MESSAGES/fdroidserver.po | 20 ++++---- locale/fr/LC_MESSAGES/fdroidserver.po | 38 +++++++-------- locale/hi/LC_MESSAGES/fdroidserver.po | 20 ++++---- locale/hu/LC_MESSAGES/fdroidserver.po | 40 ++++++++-------- locale/id/LC_MESSAGES/fdroidserver.po | 38 +++++++-------- locale/it/LC_MESSAGES/fdroidserver.po | 36 +++++++------- locale/ja/LC_MESSAGES/fdroidserver.po | 20 ++++---- locale/kab/LC_MESSAGES/fdroidserver.po | 30 ++++++------ locale/ko/LC_MESSAGES/fdroidserver.po | 42 ++++++++-------- locale/ml/LC_MESSAGES/fdroidserver.po | 20 ++++---- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 52 ++++++++++---------- locale/nl/LC_MESSAGES/fdroidserver.po | 20 ++++---- locale/pl/LC_MESSAGES/fdroidserver.po | 40 ++++++++-------- locale/pt/LC_MESSAGES/fdroidserver.po | 42 ++++++++-------- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 40 ++++++++-------- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 42 ++++++++-------- locale/ro/LC_MESSAGES/fdroidserver.po | 20 ++++---- locale/ru/LC_MESSAGES/fdroidserver.po | 40 ++++++++-------- locale/sk/LC_MESSAGES/fdroidserver.po | 20 ++++---- locale/sq/LC_MESSAGES/fdroidserver.po | 46 +++++++++--------- locale/sv/LC_MESSAGES/fdroidserver.po | 20 ++++---- locale/tr/LC_MESSAGES/fdroidserver.po | 40 ++++++++-------- locale/tzm/LC_MESSAGES/fdroidserver.po | 20 ++++---- locale/ug/LC_MESSAGES/fdroidserver.po | 20 ++++---- locale/uk/LC_MESSAGES/fdroidserver.po | 40 ++++++++-------- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 30 ++++++------ locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 56 +++++++++++----------- 45 files changed, 630 insertions(+), 630 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 3fe24c23..7f5aa164 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3372,7 +3372,7 @@ def compare_apks(apk1, apk2, tmp_dir, log_dir=None): def set_command_in_config(command): '''Try to find specified command in the path, if it hasn't been - manually set in config.py. If found, it is added to the config + manually set in config.yml. If found, it is added to the config dict. The return value says whether the command is available. ''' @@ -3524,9 +3524,9 @@ def load_stats_fdroid_signing_key_fingerprints(): repo_key_sig = config.get('repo_key_sha256') if repo_key_sig: if jar_sigkey != repo_key_sig: - raise FDroidException("Signature key fingerprint of file '{}' does not match repo_key_sha256 in config.py (found fingerprint: '{}')".format(jar_file, jar_sigkey)) + raise FDroidException("Signature key fingerprint of file '{}' does not match repo_key_sha256 in config.yml (found fingerprint: '{}')".format(jar_file, jar_sigkey)) else: - logging.warning("repo_key_sha256 not in config.py, setting it to the signature key fingerprint of '{}'".format(jar_file)) + logging.warning("repo_key_sha256 not in config.yml, setting it to the signature key fingerprint of '{}'".format(jar_file)) config['repo_key_sha256'] = jar_sigkey write_to_config(config, 'repo_key_sha256') diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 87dfce8b..9790fee0 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -147,7 +147,7 @@ def update_awsbucket_libcloud(repo_section): subdirectories) to the AWS S3 "bucket". The contents of that subdir of the bucket will first be deleted. - Requires AWS credentials set in config.py: awsaccesskeyid, awssecretkey + Requires AWS credentials set in config.yml: awsaccesskeyid, awssecretkey ''' logging.debug(_('using Apache libcloud to sync with {url}') @@ -770,7 +770,7 @@ def main(): and not config.get('binary_transparency_remote') \ and not config.get('virustotal_apikey') \ and local_copy_dir is None: - logging.warning(_('No option set! Edit your config.py to set at least one of these:') + logging.warning(_('No option set! Edit your config.yml to set at least one of these:') + '\nserverwebroot, servergitmirrors, local_copy_dir, awsbucket, ' + 'virustotal_apikey, androidobservatory, or binary_transparency_remote') sys.exit(1) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index a21bb91b..8db844d4 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -59,7 +59,7 @@ def make(apps, apks, repodir, archive): if hasattr(common.options, 'nosign') and common.options.nosign: if 'keystore' not in common.config and 'repo_pubkey' not in common.config: - raise FDroidException(_('"repo_pubkey" must be present in config.py when using --nosign!')) + raise FDroidException(_('"repo_pubkey" must be present in config.yml when using --nosign!')) else: common.assert_config_keystore(common.config) diff --git a/fdroidserver/stats.py b/fdroidserver/stats.py index 9d6cbfdc..a065ce18 100644 --- a/fdroidserver/stats.py +++ b/fdroidserver/stats.py @@ -75,7 +75,7 @@ def main(): config = common.read_config(options) if not config['update_stats']: - logging.info("Stats are disabled - set \"update_stats = True\" in your config.py") + logging.info("Stats are disabled - set \"update_stats = True\" in your config.yml") sys.exit(1) # Get all metadata-defined apps... diff --git a/locale/ang/LC_MESSAGES/fdroidserver.po b/locale/ang/LC_MESSAGES/fdroidserver.po index 90c02611..6398a29f 100644 --- a/locale/ang/LC_MESSAGES/fdroidserver.po +++ b/locale/ang/LC_MESSAGES/fdroidserver.po @@ -131,7 +131,7 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" +msgid "'keypass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -143,7 +143,7 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" +msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -151,7 +151,7 @@ msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" +msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -159,7 +159,7 @@ msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" +msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -172,7 +172,7 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py @@ -1196,7 +1196,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1245,7 +1245,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1295,7 +1295,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1770,7 +1770,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2696,7 +2696,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index 5d0e701a..b38f4eab 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -132,7 +132,7 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" +msgid "'keypass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -144,7 +144,7 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" +msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -152,7 +152,7 @@ msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" +msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -160,7 +160,7 @@ msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" +msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -173,7 +173,7 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py @@ -1197,7 +1197,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1246,7 +1246,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1296,7 +1296,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1771,7 +1771,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2697,7 +2697,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index a90878e5..4807bc4f 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -138,44 +138,44 @@ msgid "%s option does not take a value" msgstr "%sགདམ་ཀ་ནུས་མེད་རེད་འདུག" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" -msgstr "'keypass' འདི་config.py ནང་རྙེད་མ་སོང་།!" +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' འདི་config.yml ནང་རྙེད་མ་སོང་།!" #: ../fdroidserver/common.py #, fuzzy msgid "'keypass' not found in config.yml!" -msgstr "'keypass' འདི་config.py ནང་རྙེད་མ་སོང་།!" +msgstr "'keypass' འདི་config.yml ནང་རྙེད་མ་སོང་།!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" -msgstr "'keystore' འདི་ config.py ནང་རྙེད་མ་སོང་།!" +msgid "'keystore' not found in config.yml!" +msgstr "'keystore' འདི་ config.yml ནང་རྙེད་མ་སོང་།!" #: ../fdroidserver/common.py #, fuzzy msgid "'keystore' not found in config.yml!" -msgstr "'keystore' འདི་ config.py ནང་རྙེད་མ་སོང་།!" +msgstr "'keystore' འདི་ config.yml ནང་རྙེད་མ་སོང་།!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" -msgstr "'keystorepass' འདི་ config.py ནང་རྙེད་མ་སོང་།!" +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' འདི་ config.yml ནང་རྙེད་མ་སོང་།!" #: ../fdroidserver/common.py #, fuzzy msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' འདི་ config.py ནང་རྙེད་མ་སོང་།!" +msgstr "'keystorepass' འདི་ config.yml ནང་རྙེད་མ་སོང་།!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" -msgstr "'repo_keyalias' འདི་ config.py ནང་རྙེད་མ་སོང་།!" +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' འདི་ config.yml ནང་རྙེད་མ་སོང་།!" #: ../fdroidserver/common.py #, fuzzy msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' འདི་ config.py ནང་རྙེད་མ་སོང་།!" +msgstr "'repo_keyalias' འདི་ config.yml ནང་རྙེད་མ་སོང་།!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -183,13 +183,13 @@ msgid "'required' is an invalid argument for positionals" msgstr "'དགསོ་མཁོ།' ནི་གནས་སྟངས་འདི་ལ་ཁུངས་ལྡན་གྱི་རྩོད་པ་རེད་མིན་འདུག" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" -msgstr "'sdk_path' འདི་ 'config.py' ནང་སྒྲིག་ཐུབ་མ་སོང་།!" +msgid "'sdk_path' not set in 'config.yml'!" +msgstr "'sdk_path' འདི་ 'config.yml' ནང་སྒྲིག་ཐུབ་མ་སོང་།!" #: ../fdroidserver/common.py #, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "'sdk_path' འདི་ 'config.py' ནང་སྒྲིག་ཐུབ་མ་སོང་།!" +msgstr "'sdk_path' འདི་ 'config.yml' ནང་སྒྲིག་ཐུབ་མ་སོང་།!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -1218,8 +1218,8 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "མིང་། '%s 1' ནི་རང་མིང་ཁོ་ན་རེད་། - མེད་པ་བཟོས།" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." -msgstr "'config.py' རྙེད་མ་སོང་།, སོར་བཞག་བེད་སྤྱོད་བྱེད་བཞིན་པ།." +msgid "No 'config.yml' found, using defaults." +msgstr "'config.yml' རྙེད་མ་སོང་།, སོར་བཞག་བེད་སྤྱོད་བྱེད་བཞིན་པ།." #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1241,7 +1241,7 @@ msgstr "{linedesc} ནང་གྱི་ {versionName}འདིའི་ཆེ #: ../fdroidserver/common.py #, fuzzy msgid "No config.yml found, using defaults." -msgstr "'config.py' རྙེད་མ་སོང་།, སོར་བཞག་བེད་སྤྱོད་བྱེད་བཞིན་པ།." +msgstr "'config.yml' རྙེད་མ་སོང་།, སོར་བཞག་བེད་སྤྱོད་བྱེད་བཞིན་པ།." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1269,8 +1269,8 @@ msgid "No need to specify that the app is for Android" msgstr "མཉེན་ཆས་འདི་ཨེན་ཀྲོཌ་ཆེད་དུ་ཡིན་པ་དམིགས་སྟོན་བྱེད་དགོས་དོན་མེད།" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" -msgstr "གདམ་ཀ་མེད་པ་སྒྲིག།! ཁྱེད་རང་གི་config.py འདིའི་ནང་ནས་མ་མཐའ་ཡིན་ཡང་གང་རུང་ཞིག་རྩོམ་སྒྲིག་བྱེད་:" +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "གདམ་ཀ་མེད་པ་སྒྲིག།! ཁྱེད་རང་གི་config.yml འདིའི་ནང་ནས་མ་མཐའ་ཡིན་ཡང་གང་རུང་ཞིག་རྩོམ་སྒྲིག་བྱེད་:" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1319,13 +1319,13 @@ msgid "Nothing to do for {appid}." msgstr "{appid} ཆེད་དུ་བྱ་རྒྱུ་གང་ཡང་མེད་།." #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py #, fuzzy msgid "Now set these in config.yml:" -msgstr "'sdk_path' འདི་ 'config.py' ནང་སྒྲིག་ཐུབ་མ་སོང་།!" +msgstr "'sdk_path' འདི་ 'config.yml' ནང་སྒྲིག་ཐུབ་མ་སོང་།!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1795,13 +1795,13 @@ msgid "This repo already has local metadata: %s" msgstr "རེ་པོ་འདི་ལ་སྔོན་ཚོད་ནས་ས་གནས་ཀྱི་རྒྱབ་ལྗོངས་ཡིག་ཆ་འདུག: %s 1" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" -msgstr "awsbucket, awssecretkey དང་། awsaccesskeyid བེད་སྤྱོད་བྱེད་པའི་ཆེད་དུ་ config.py ནང་དུ་ངེས་པར་དུ་སྒྲིག་དགོས།!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "awsbucket, awssecretkey དང་། awsaccesskeyid བེད་སྤྱོད་བྱེད་པའི་ཆེད་དུ་ config.yml ནང་དུ་ངེས་པར་དུ་སྒྲིག་དགོས།!" #: ../fdroidserver/deploy.py #, fuzzy msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "awsbucket, awssecretkey དང་། awsaccesskeyid བེད་སྤྱོད་བྱེད་པའི་ཆེད་དུ་ config.py ནང་དུ་ངེས་པར་དུ་སྒྲིག་དགོས།!" +msgstr "awsbucket, awssecretkey དང་། awsaccesskeyid བེད་སྤྱོད་བྱེད་པའི་ཆེད་དུ་ config.yml ནང་དུ་ངེས་པར་དུ་སྒྲིག་དགོས།!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -2728,8 +2728,8 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." -msgstr "{name} \"{path}\" མིན་འདུག! config.pyནོར་བཅོས་བྱེད།." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." +msgstr "{name} \"{path}\" མིན་འདུག! config.ymlནོར་བཅོས་བྱེད།." #: ../fdroidserver/common.py #, python-brace-format diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index bdc82fc8..63a25cc5 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -134,7 +134,7 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" +msgid "'keypass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -146,7 +146,7 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" +msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -154,7 +154,7 @@ msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" +msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -162,7 +162,7 @@ msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" +msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -175,7 +175,7 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py @@ -1201,7 +1201,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1250,7 +1250,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1300,7 +1300,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1776,7 +1776,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2705,7 +2705,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/cy/LC_MESSAGES/fdroidserver.po b/locale/cy/LC_MESSAGES/fdroidserver.po index 1a8880a3..33fe40f2 100644 --- a/locale/cy/LC_MESSAGES/fdroidserver.po +++ b/locale/cy/LC_MESSAGES/fdroidserver.po @@ -142,7 +142,7 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" +msgid "'keypass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -154,7 +154,7 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" +msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -162,7 +162,7 @@ msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" +msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -170,7 +170,7 @@ msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" +msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -183,7 +183,7 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py @@ -1211,7 +1211,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1260,7 +1260,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1310,7 +1310,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1789,7 +1789,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2727,7 +2727,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 7cba7a79..aae9b020 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -156,8 +156,8 @@ msgid "%s option does not take a value" msgstr "Option %s verfügt über keinen Wert" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" -msgstr "„keypass” nicht in config.py vorhanden!" +msgid "'keypass' not found in config.yml!" +msgstr "„keypass” nicht in config.yml vorhanden!" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" @@ -168,24 +168,24 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' ist NONE und 'smartcardoptions' ist leer!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" -msgstr "„keystore” nicht in config.py vorhanden!" +msgid "'keystore' not found in config.yml!" +msgstr "„keystore” nicht in config.yml vorhanden!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "„keystore” nicht in config.yml vorhanden!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" -msgstr "„keystorepass” nicht in config.py vorhanden!" +msgid "'keystorepass' not found in config.yml!" +msgstr "„keystorepass” nicht in config.yml vorhanden!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "„keystorepass” nicht in config.yml vorhanden!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" -msgstr "„repo_keyalias” nicht in config.py vorhanden!" +msgid "'repo_keyalias' not found in config.yml!" +msgstr "„repo_keyalias” nicht in config.yml vorhanden!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" @@ -197,8 +197,8 @@ msgid "'required' is an invalid argument for positionals" msgstr "„required” ist ein ungültiges Argument für Positionsangaben" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" -msgstr "Kein 'sdk_path' in 'config.py' festgelegt!" +msgid "'sdk_path' not set in 'config.yml'!" +msgstr "Kein 'sdk_path' in 'config.yml' festgelegt!" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" @@ -1228,8 +1228,8 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "Name '%s' ist nur der automatische Name - entfernen Sie ihn" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." -msgstr "Keine 'config.py' gefunden, nutze Standardeinstellungen." +msgid "No 'config.yml' found, using defaults." +msgstr "Keine 'config.yml' gefunden, nutze Standardeinstellungen." #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1277,8 +1277,8 @@ msgid "No need to specify that the app is for Android" msgstr "Sie müssen nicht angeben, dass die App für Android ist" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" -msgstr "Keine Option gesetzt! Bearbeiten Sie Ihre config.py, um mindestens eine davon zu setzen:" +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "Keine Option gesetzt! Bearbeiten Sie Ihre config.yml, um mindestens eine davon zu setzen:" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1327,8 +1327,8 @@ msgid "Nothing to do for {appid}." msgstr "Keine zu erledigenden Aufgaben für {appid}." #: ../fdroidserver/init.py -msgid "Now set these in config.py:" -msgstr "Legen Sie diese nun in der config.py fest:" +msgid "Now set these in config.yml:" +msgstr "Legen Sie diese nun in der config.yml fest:" #: ../fdroidserver/init.py msgid "Now set these in config.yml:" @@ -1803,8 +1803,8 @@ msgid "This repo already has local metadata: %s" msgstr "Dieses Repo hat bereits lokale Metadaten: %s" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" -msgstr "Um awsbucket zu benutzen, müssen awssecretkey und awsaccesskeyid auch in der config.py gesetzt sein!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Um awsbucket zu benutzen, müssen awssecretkey und awsaccesskeyid auch in der config.yml gesetzt sein!" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -2735,8 +2735,8 @@ msgstr "{file} ist leer oder beschädigt!" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." -msgstr "{name} \"{path}\" existiert nicht! Korrigieren Sie es in der config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." +msgstr "{name} \"{path}\" existiert nicht! Korrigieren Sie es in der config.yml." #: ../fdroidserver/common.py #, python-brace-format diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index c348fb31..de14ca57 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -133,7 +133,7 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" +msgid "'keypass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -145,7 +145,7 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" +msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -153,7 +153,7 @@ msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" +msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -161,7 +161,7 @@ msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" +msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -174,7 +174,7 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py @@ -1198,7 +1198,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1247,7 +1247,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1297,7 +1297,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1772,7 +1772,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2698,7 +2698,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/enm/LC_MESSAGES/fdroidserver.po b/locale/enm/LC_MESSAGES/fdroidserver.po index 76402a64..4b6d4511 100644 --- a/locale/enm/LC_MESSAGES/fdroidserver.po +++ b/locale/enm/LC_MESSAGES/fdroidserver.po @@ -131,7 +131,7 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" +msgid "'keypass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -143,7 +143,7 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" +msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -151,7 +151,7 @@ msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" +msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -159,7 +159,7 @@ msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" +msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -172,7 +172,7 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py @@ -1196,7 +1196,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1245,7 +1245,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1295,7 +1295,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1770,7 +1770,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2696,7 +2696,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 2ce455a2..bdcadbef 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -151,8 +151,8 @@ msgid "%s option does not take a value" msgstr "la opción %s no toma un valor" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" -msgstr "¡'keypass' no encontrado en config.py!" +msgid "'keypass' not found in config.yml!" +msgstr "¡'keypass' no encontrado en config.yml!" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" @@ -163,24 +163,24 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "¡\"keystore\" es NONE y \"smartcardoptions\" está vacío!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" -msgstr "¡'keystore' no encontrado en config.py!" +msgid "'keystore' not found in config.yml!" +msgstr "¡'keystore' no encontrado en config.yml!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "¡'keystore' no encontrado en config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" -msgstr "¡'keystorepass' no encontrado en config.py!" +msgid "'keystorepass' not found in config.yml!" +msgstr "¡'keystorepass' no encontrado en config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "¡'keystorepass' no encontrado en config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" -msgstr "¡'repo_keyalias' no encontrado en config.py!" +msgid "'repo_keyalias' not found in config.yml!" +msgstr "¡'repo_keyalias' no encontrado en config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" @@ -192,8 +192,8 @@ msgid "'required' is an invalid argument for positionals" msgstr "'required' es un argumento inválido para posicionales" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" -msgstr "¡'sdk_path' no establecido en 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" +msgstr "¡'sdk_path' no establecido en 'config.yml'!" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" @@ -1220,8 +1220,8 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "El nombre '%s' es simplemente el nombre automático - elimínelo" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." -msgstr "No se encontró 'config.py', se usarán los valores predeterminados." +msgid "No 'config.yml' found, using defaults." +msgstr "No se encontró 'config.yml', se usarán los valores predeterminados." #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1269,8 +1269,8 @@ msgid "No need to specify that the app is for Android" msgstr "No hay necesidad de especificar que la aplicación es para Android" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" -msgstr "No hay opción establecida! Edita tu config.py para establecer al menos una de estas opciones:" +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "No hay opción establecida! Edita tu config.yml para establecer al menos una de estas opciones:" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1319,8 +1319,8 @@ msgid "Nothing to do for {appid}." msgstr "Nada que hacer para {appid}." #: ../fdroidserver/init.py -msgid "Now set these in config.py:" -msgstr "Ahora establezca lo siguiente en config.py:" +msgid "Now set these in config.yml:" +msgstr "Ahora establezca lo siguiente en config.yml:" #: ../fdroidserver/init.py msgid "Now set these in config.yml:" @@ -1794,8 +1794,8 @@ msgid "This repo already has local metadata: %s" msgstr "Este repo ya tiene metadatos locales: %s" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" -msgstr "¡Para usar awsbucket hay que configurar también awssecretkey y awsaccesskeyid en config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "¡Para usar awsbucket hay que configurar también awssecretkey y awsaccesskeyid en config.yml!" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -2720,8 +2720,8 @@ msgstr "¡{file} está vacío o corrupto!" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." -msgstr "¡{name} \"{path}\" no existe! Corrijalo en config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." +msgstr "¡{name} \"{path}\" no existe! Corrijalo en config.yml." #: ../fdroidserver/common.py #, python-brace-format diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index 119006ce..295d19f5 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -136,7 +136,7 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" +msgid "'keypass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -148,7 +148,7 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" +msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -156,7 +156,7 @@ msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" +msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -164,7 +164,7 @@ msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" +msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -177,7 +177,7 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py @@ -1212,7 +1212,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1261,7 +1261,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1311,7 +1311,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1790,7 +1790,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2727,7 +2727,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/es_MX/LC_MESSAGES/fdroidserver.po b/locale/es_MX/LC_MESSAGES/fdroidserver.po index 4087b201..96b9b6dd 100644 --- a/locale/es_MX/LC_MESSAGES/fdroidserver.po +++ b/locale/es_MX/LC_MESSAGES/fdroidserver.po @@ -133,7 +133,7 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" +msgid "'keypass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -145,7 +145,7 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" +msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -153,7 +153,7 @@ msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" +msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -161,7 +161,7 @@ msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" +msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -174,7 +174,7 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py @@ -1201,7 +1201,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1250,7 +1250,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1300,7 +1300,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1775,7 +1775,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2701,7 +2701,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/eu/LC_MESSAGES/fdroidserver.po b/locale/eu/LC_MESSAGES/fdroidserver.po index 44613cea..27a3e4b1 100644 --- a/locale/eu/LC_MESSAGES/fdroidserver.po +++ b/locale/eu/LC_MESSAGES/fdroidserver.po @@ -131,7 +131,7 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" +msgid "'keypass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -143,7 +143,7 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" +msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -151,7 +151,7 @@ msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" +msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -159,7 +159,7 @@ msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" +msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -172,7 +172,7 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py @@ -1196,7 +1196,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1245,7 +1245,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1295,7 +1295,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1770,7 +1770,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2696,7 +2696,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index 9e724d7c..9af9dd49 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -133,7 +133,7 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" +msgid "'keypass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -145,7 +145,7 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" +msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -153,7 +153,7 @@ msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" +msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -161,7 +161,7 @@ msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" +msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -174,7 +174,7 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py @@ -1198,7 +1198,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1247,7 +1247,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1297,7 +1297,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1772,7 +1772,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2698,7 +2698,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/fdroidserver.pot b/locale/fdroidserver.pot index f5f6a46b..575862c4 100644 --- a/locale/fdroidserver.pot +++ b/locale/fdroidserver.pot @@ -133,7 +133,7 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" +msgid "'keypass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -145,7 +145,7 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" +msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -153,7 +153,7 @@ msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" +msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -161,7 +161,7 @@ msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" +msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -174,7 +174,7 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py @@ -1198,7 +1198,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1247,7 +1247,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1297,7 +1297,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1772,7 +1772,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2698,7 +2698,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index 32176349..b7ec0efe 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -131,7 +131,7 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" +msgid "'keypass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -143,7 +143,7 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" +msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -151,7 +151,7 @@ msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" +msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -159,7 +159,7 @@ msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" +msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -172,7 +172,7 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py @@ -1196,7 +1196,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1245,7 +1245,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1295,7 +1295,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1770,7 +1770,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2696,7 +2696,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 694e7635..ec55e0bf 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -166,8 +166,8 @@ msgid "%s option does not take a value" msgstr "l'option %s ne prend pas de valeur" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" -msgstr "'keypass' non trouvé dans config.py !" +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' non trouvé dans config.yml !" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" @@ -178,24 +178,24 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' n'est pas utilisé et 'smartcardoptions' est vide !" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" -msgstr "'keystore' non trouvé dans config.py !" +msgid "'keystore' not found in config.yml!" +msgstr "'keystore' non trouvé dans config.yml !" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "'keystore' non trouvé dans config.yml !" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" -msgstr "'keystorepass' non trouvé dans config.py !" +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' non trouvé dans config.yml !" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' non trouvé dans config.yml !" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" -msgstr "'repo_keyalias' non trouvé dans config.py !" +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' non trouvé dans config.yml !" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" @@ -207,8 +207,8 @@ msgid "'required' is an invalid argument for positionals" msgstr "'required' est invalide comme argument positionnel" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" -msgstr "'sdk_path' n'est pas configuré dans 'config.py' !" +msgid "'sdk_path' not set in 'config.yml'!" +msgstr "'sdk_path' n'est pas configuré dans 'config.yml' !" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" @@ -1235,8 +1235,8 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "Le nom '%s' est just un nom générer - retirer le" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." -msgstr "Aucun 'config.py' trouvée, utilisation des originales." +msgid "No 'config.yml' found, using defaults." +msgstr "Aucun 'config.yml' trouvée, utilisation des originales." #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1284,8 +1284,8 @@ msgid "No need to specify that the app is for Android" msgstr "Pas besoin de spécifier que l'application est pour Android" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" -msgstr "Aucune option configurer ! Éditer votre config.py pour le mettre au moins a l'un d'eux :" +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "Aucune option configurer ! Éditer votre config.yml pour le mettre au moins a l'un d'eux :" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1334,8 +1334,8 @@ msgid "Nothing to do for {appid}." msgstr "Rien à faire pour {appid}." #: ../fdroidserver/init.py -msgid "Now set these in config.py:" -msgstr "Maintenant, définissez-les dans config.py :" +msgid "Now set these in config.yml:" +msgstr "Maintenant, définissez-les dans config.yml :" #: ../fdroidserver/init.py msgid "Now set these in config.yml:" @@ -1809,8 +1809,8 @@ msgid "This repo already has local metadata: %s" msgstr "Ce dépôt a déjà des méta-données locales : %s" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" -msgstr "Pour utiliser awsbucket, awssecretkey et awsaccesskeyid doivent aussi être configurées dans config.py !" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Pour utiliser awsbucket, awssecretkey et awsaccesskeyid doivent aussi être configurées dans config.yml !" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -2739,7 +2739,7 @@ msgstr "{file} est vide ou corrompu !" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/hi/LC_MESSAGES/fdroidserver.po b/locale/hi/LC_MESSAGES/fdroidserver.po index dd6a00c7..7af81fa2 100644 --- a/locale/hi/LC_MESSAGES/fdroidserver.po +++ b/locale/hi/LC_MESSAGES/fdroidserver.po @@ -132,7 +132,7 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" +msgid "'keypass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -144,7 +144,7 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" +msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -152,7 +152,7 @@ msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" +msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -160,7 +160,7 @@ msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" +msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -173,7 +173,7 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py @@ -1197,7 +1197,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1246,7 +1246,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1296,7 +1296,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1771,7 +1771,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2697,7 +2697,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index 7e9af8a9..057c35a3 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -140,44 +140,44 @@ msgid "%s option does not take a value" msgstr "A(z) %s kapcsoló nem fogad értéket" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" -msgstr "A „keypass” nem található a config.py fájlban." +msgid "'keypass' not found in config.yml!" +msgstr "A „keypass” nem található a config.yml fájlban." #: ../fdroidserver/common.py #, fuzzy msgid "'keypass' not found in config.yml!" -msgstr "A „keypass” nem található a config.py fájlban." +msgstr "A „keypass” nem található a config.yml fájlban." #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" -msgstr "A „keystore” nem található a config.py fájlban." +msgid "'keystore' not found in config.yml!" +msgstr "A „keystore” nem található a config.yml fájlban." #: ../fdroidserver/common.py #, fuzzy msgid "'keystore' not found in config.yml!" -msgstr "A „keystore” nem található a config.py fájlban." +msgstr "A „keystore” nem található a config.yml fájlban." #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" -msgstr "A „keystorepass” nem található a config.py fájlban." +msgid "'keystorepass' not found in config.yml!" +msgstr "A „keystorepass” nem található a config.yml fájlban." #: ../fdroidserver/common.py #, fuzzy msgid "'keystorepass' not found in config.yml!" -msgstr "A „keystorepass” nem található a config.py fájlban." +msgstr "A „keystorepass” nem található a config.yml fájlban." #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" -msgstr "A „repo_keyalias” nem található a config.py fájlban." +msgid "'repo_keyalias' not found in config.yml!" +msgstr "A „repo_keyalias” nem található a config.yml fájlban." #: ../fdroidserver/common.py #, fuzzy msgid "'repo_keyalias' not found in config.yml!" -msgstr "A „repo_keyalias” nem található a config.py fájlban." +msgstr "A „repo_keyalias” nem található a config.yml fájlban." #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -185,13 +185,13 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" -msgstr "Az „sdk_path” nincs megadva a „config.py” fájlban." +msgid "'sdk_path' not set in 'config.yml'!" +msgstr "Az „sdk_path” nincs megadva a „config.yml” fájlban." #: ../fdroidserver/common.py #, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "Az „sdk_path” nincs megadva a „config.py” fájlban." +msgstr "Az „sdk_path” nincs megadva a „config.yml” fájlban." #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -1210,7 +1210,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1259,7 +1259,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1309,7 +1309,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1784,7 +1784,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2710,7 +2710,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index a143c28f..b08c43c8 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -131,44 +131,44 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" -msgstr "'keypass' tidak ditemukan dalam config.py!" +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' tidak ditemukan dalam config.yml!" #: ../fdroidserver/common.py #, fuzzy msgid "'keypass' not found in config.yml!" -msgstr "'keypass' tidak ditemukan dalam config.py!" +msgstr "'keypass' tidak ditemukan dalam config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" -msgstr "'keystore' tidak ditemukan dalam config.py!" +msgid "'keystore' not found in config.yml!" +msgstr "'keystore' tidak ditemukan dalam config.yml!" #: ../fdroidserver/common.py #, fuzzy msgid "'keystore' not found in config.yml!" -msgstr "'keystore' tidak ditemukan dalam config.py!" +msgstr "'keystore' tidak ditemukan dalam config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" -msgstr "'keystorepass' tidak ditemukan dalam config.py!" +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' tidak ditemukan dalam config.yml!" #: ../fdroidserver/common.py #, fuzzy msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' tidak ditemukan dalam config.py!" +msgstr "'keystorepass' tidak ditemukan dalam config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" -msgstr "'repo_keyalias' tidak ditemukan dalam config.py!" +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' tidak ditemukan dalam config.yml!" #: ../fdroidserver/common.py #, fuzzy msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' tidak ditemukan dalam config.py!" +msgstr "'repo_keyalias' tidak ditemukan dalam config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -176,13 +176,13 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py #, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "'keypass' tidak ditemukan dalam config.py!" +msgstr "'keypass' tidak ditemukan dalam config.yml!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -1200,7 +1200,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1249,7 +1249,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1299,7 +1299,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1773,7 +1773,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2696,7 +2696,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 8017f7be..7d141182 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -152,8 +152,8 @@ msgid "%s option does not take a value" msgstr "l'opzione %s non accetta un valore" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" -msgstr "\"keypass\" non trovato in config.py!" +msgid "'keypass' not found in config.yml!" +msgstr "\"keypass\" non trovato in config.yml!" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" @@ -164,24 +164,24 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' è NONE e 'smartcardoptions' è vuoto!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" -msgstr "\"keystore\" non trovato in config.py!" +msgid "'keystore' not found in config.yml!" +msgstr "\"keystore\" non trovato in config.yml!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "\"keystore\" non trovato in config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" -msgstr "\"keystorepass\" non trovato in config.py!" +msgid "'keystorepass' not found in config.yml!" +msgstr "\"keystorepass\" non trovato in config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "\"keystorepass\" non trovato in config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" -msgstr "\"repo_keyalias\" non trovato in config.py!" +msgid "'repo_keyalias' not found in config.yml!" +msgstr "\"repo_keyalias\" non trovato in config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" @@ -193,8 +193,8 @@ msgid "'required' is an invalid argument for positionals" msgstr "\"required\" è un argomento invalido per i posizionali" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" -msgstr "\"sdk_path\" non impostato in \"config.py\"!" +msgid "'sdk_path' not set in 'config.yml'!" +msgstr "\"sdk_path\" non impostato in \"config.yml\"!" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" @@ -1221,8 +1221,8 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "Il nome '%s' è solo il nome automatico - rimuovilo" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." -msgstr "Nessun 'config.py' trovato, utilizzando i valori predefiniti." +msgid "No 'config.yml' found, using defaults." +msgstr "Nessun 'config.yml' trovato, utilizzando i valori predefiniti." #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1270,8 +1270,8 @@ msgid "No need to specify that the app is for Android" msgstr "Non c'è bisogno di specificare che l'applicazione è per Android" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" -msgstr "Nessuna opzione impostata! Modifica il tuo config.py per impostare almeno uno di questi:" +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "Nessuna opzione impostata! Modifica il tuo config.yml per impostare almeno uno di questi:" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1320,8 +1320,8 @@ msgid "Nothing to do for {appid}." msgstr "Niente da fare per {appid}." #: ../fdroidserver/init.py -msgid "Now set these in config.py:" -msgstr "Ora imposta i seguenti campi in config.py:" +msgid "Now set these in config.yml:" +msgstr "Ora imposta i seguenti campi in config.yml:" #: ../fdroidserver/init.py msgid "Now set these in config.yml:" @@ -1795,7 +1795,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2721,7 +2721,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 8693c81f..28c62543 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -131,7 +131,7 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" +msgid "'keypass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -143,7 +143,7 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" +msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -151,7 +151,7 @@ msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" +msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -159,7 +159,7 @@ msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" +msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -172,7 +172,7 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py @@ -1195,7 +1195,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1244,7 +1244,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1294,7 +1294,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1768,7 +1768,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2691,7 +2691,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index 3634109b..5e95c324 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -134,8 +134,8 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" -msgstr "'keypass' ulac-it di config.py!" +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' ulac-it di config.yml!" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" @@ -146,24 +146,24 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" -msgstr "'keystore' ulac-it di config.py!" +msgid "'keystore' not found in config.yml!" +msgstr "'keystore' ulac-it di config.yml!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "'keystore' ulac-it di config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" -msgstr "'keystorepass' ulac-it di config.py!" +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' ulac-it di config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' ulac-it di config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" -msgstr "'repo_keyalias' ulac-it deg config.py!" +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' ulac-it deg config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" @@ -175,8 +175,8 @@ msgid "'required' is an invalid argument for positionals" msgstr "'required' d taɣiret ur iṣeḥḥan ara i usideg" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" -msgstr "'sdk_path' ur yettwasbadu ara 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" +msgstr "'sdk_path' ur yettwasbadu ara 'config.yml'!" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" @@ -1199,7 +1199,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "Isem '%s' d isem awurman kan - kkes-it" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1248,7 +1248,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1298,7 +1298,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1773,7 +1773,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2699,7 +2699,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index bbdeeb3f..290caa2c 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -138,44 +138,44 @@ msgid "%s option does not take a value" msgstr "%s 옵션은 값을 받지 않습니다" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" -msgstr "'keypass'를 config.py에서 찾을 수 없습니다!" +msgid "'keypass' not found in config.yml!" +msgstr "'keypass'를 config.yml에서 찾을 수 없습니다!" #: ../fdroidserver/common.py #, fuzzy msgid "'keypass' not found in config.yml!" -msgstr "'keypass'를 config.py에서 찾을 수 없습니다!" +msgstr "'keypass'를 config.yml에서 찾을 수 없습니다!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" -msgstr "'keystore'를 config.py에서 찾을 수 없습니다!" +msgid "'keystore' not found in config.yml!" +msgstr "'keystore'를 config.yml에서 찾을 수 없습니다!" #: ../fdroidserver/common.py #, fuzzy msgid "'keystore' not found in config.yml!" -msgstr "'keystore'를 config.py에서 찾을 수 없습니다!" +msgstr "'keystore'를 config.yml에서 찾을 수 없습니다!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" -msgstr "'keystorepass'를 config.py에서 찾을 수 없습니다!" +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass'를 config.yml에서 찾을 수 없습니다!" #: ../fdroidserver/common.py #, fuzzy msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass'를 config.py에서 찾을 수 없습니다!" +msgstr "'keystorepass'를 config.yml에서 찾을 수 없습니다!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" -msgstr "'repo_keyalias'를 config.py에서 찾을 수 없습니다!" +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias'를 config.yml에서 찾을 수 없습니다!" #: ../fdroidserver/common.py #, fuzzy msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias'를 config.py에서 찾을 수 없습니다!" +msgstr "'repo_keyalias'를 config.yml에서 찾을 수 없습니다!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -183,13 +183,13 @@ msgid "'required' is an invalid argument for positionals" msgstr "'required'는 고정적을 위한 잘못된 인수입니다" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" -msgstr "'sdk_path'를 'config.py'에서 설정할 수 없습니다!" +msgid "'sdk_path' not set in 'config.yml'!" +msgstr "'sdk_path'를 'config.yml'에서 설정할 수 없습니다!" #: ../fdroidserver/common.py #, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "'sdk_path'를 'config.py'에서 설정할 수 없습니다!" +msgstr "'sdk_path'를 'config.yml'에서 설정할 수 없습니다!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -1207,7 +1207,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1256,7 +1256,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1306,7 +1306,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1780,7 +1780,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2706,8 +2706,8 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." -msgstr "{name} \"{path}\"는 존재하지 않습니다! config.py에서 그것을 고치세요." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." +msgstr "{name} \"{path}\"는 존재하지 않습니다! config.yml에서 그것을 고치세요." #: ../fdroidserver/common.py #, python-brace-format diff --git a/locale/ml/LC_MESSAGES/fdroidserver.po b/locale/ml/LC_MESSAGES/fdroidserver.po index 733ab9db..cd008715 100644 --- a/locale/ml/LC_MESSAGES/fdroidserver.po +++ b/locale/ml/LC_MESSAGES/fdroidserver.po @@ -145,7 +145,7 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" +msgid "'keypass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -157,7 +157,7 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" +msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -165,7 +165,7 @@ msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" +msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -173,7 +173,7 @@ msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" +msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -186,7 +186,7 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py @@ -1210,7 +1210,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1259,7 +1259,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1309,7 +1309,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1784,7 +1784,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2710,7 +2710,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index c2c9222e..59c3b18d 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -141,44 +141,44 @@ msgid "%s option does not take a value" msgstr "%s-valget tar ikke en verdi" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" -msgstr "'keypass' ble ikke funnet i config.py!" +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' ble ikke funnet i config.yml!" #: ../fdroidserver/common.py #, fuzzy msgid "'keypass' not found in config.yml!" -msgstr "'keypass' ble ikke funnet i config.py!" +msgstr "'keypass' ble ikke funnet i config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" -msgstr "'keystore' ble ikke funnet i config.py!" +msgid "'keystore' not found in config.yml!" +msgstr "'keystore' ble ikke funnet i config.yml!" #: ../fdroidserver/common.py #, fuzzy msgid "'keystore' not found in config.yml!" -msgstr "'keystore' ble ikke funnet i config.py!" +msgstr "'keystore' ble ikke funnet i config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" -msgstr "'keystorepass' ble ikke funnet i config.py!" +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' ble ikke funnet i config.yml!" #: ../fdroidserver/common.py #, fuzzy msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' ble ikke funnet i config.py!" +msgstr "'keystorepass' ble ikke funnet i config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" -msgstr "'repo_keyalias' ble ikke funnet i config.py!" +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' ble ikke funnet i config.yml!" #: ../fdroidserver/common.py #, fuzzy msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' ble ikke funnet i config.py!" +msgstr "'repo_keyalias' ble ikke funnet i config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -187,13 +187,13 @@ msgid "'required' is an invalid argument for positionals" msgstr "'required' er et ugyldig argument for posisjonsinfo" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" -msgstr "'sdk_path' ble ikke funnet i config.py!" +msgid "'sdk_path' not set in 'config.yml'!" +msgstr "'sdk_path' ble ikke funnet i config.yml!" #: ../fdroidserver/common.py #, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "'sdk_path' ble ikke funnet i config.py!" +msgstr "'sdk_path' ble ikke funnet i config.yml!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -1251,8 +1251,8 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "Navnet \"%s\" er kun det forvalgte navnet, fjern det." #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." -msgstr "Fant ingen 'config.py' , bruker forvalg." +msgid "No 'config.yml' found, using defaults." +msgstr "Fant ingen 'config.yml' , bruker forvalg." #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1274,7 +1274,7 @@ msgstr "Ingen innsendelse angitt for {versionName} i {linedesc}." #: ../fdroidserver/common.py #, fuzzy msgid "No config.yml found, using defaults." -msgstr "Fant ingen 'config.py' , bruker forvalg." +msgstr "Fant ingen 'config.yml' , bruker forvalg." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1303,8 +1303,8 @@ msgid "No need to specify that the app is for Android" msgstr "Inget behov for å spesifisere at programmet er for Android" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" -msgstr "Inget valg satt. Rediger din config.py og sett minst én av disse:" +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "Inget valg satt. Rediger din config.yml og sett minst én av disse:" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1353,7 +1353,7 @@ msgid "Nothing to do for {appid}." msgstr "Ingenting å gjøre for {appid}." #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1847,13 +1847,13 @@ msgstr "Denne pakkebrønnen har allerede lokal metadata: %s" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, fuzzy -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" -msgstr "For å bruke AWS-spann, må \"awssecretkey\" og \"awsaccesskeyid\" også være satt i config.py." +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "For å bruke AWS-spann, må \"awssecretkey\" og \"awsaccesskeyid\" også være satt i config.yml." #: ../fdroidserver/deploy.py #, fuzzy msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "For å bruke AWS-spann, må \"awssecretkey\" og \"awsaccesskeyid\" også være satt i config.py." +msgstr "For å bruke AWS-spann, må \"awssecretkey\" og \"awsaccesskeyid\" også være satt i config.yml." #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -2800,8 +2800,8 @@ msgstr "{file} er tom eller skadet!" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." -msgstr "{name} \"{path}\" finnes ikke. Rett det i config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." +msgstr "{name} \"{path}\" finnes ikke. Rett det i config.yml." #: ../fdroidserver/common.py #, python-brace-format diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index 99f30655..b230ccdb 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -132,7 +132,7 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" +msgid "'keypass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -144,7 +144,7 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" +msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -152,7 +152,7 @@ msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" +msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -160,7 +160,7 @@ msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" +msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -173,7 +173,7 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py @@ -1198,7 +1198,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1247,7 +1247,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1297,7 +1297,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1772,7 +1772,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2698,7 +2698,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 8deb56b8..25309edc 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -148,8 +148,8 @@ msgid "%s option does not take a value" msgstr "%s opcja nie przyjmuje wartości" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" -msgstr "'keypass' nie znaleziono w config.py!" +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' nie znaleziono w config.yml!" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" @@ -160,24 +160,24 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "\"keystore\" nie ma, a \"smartcardoptions\" jest puste!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" -msgstr "'Plik kluczy' nie został znaleziony w pliku config.py!" +msgid "'keystore' not found in config.yml!" +msgstr "'Plik kluczy' nie został znaleziony w pliku config.yml!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "'keystore' nie znaleziono w config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" -msgstr "'keystorepass' nie znaleziono w config.py!" +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' nie znaleziono w config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' nie znaleziono w config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" -msgstr "'repo_keyalias' nie znaleziono w config.py!" +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' nie znaleziono w config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" @@ -189,8 +189,8 @@ msgid "'required' is an invalid argument for positionals" msgstr "'wymagane' jest nieprawidłowym argumentem dla pozycji" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" -msgstr "'sdk_path' nie jest ustawiony w 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" +msgstr "'sdk_path' nie jest ustawiony w 'config.yml'!" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" @@ -1219,8 +1219,8 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "Nazwa '%s' jest nazwą automatyczną - usuń ją" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." -msgstr "Nie znaleziono pliku 'config.py', używając wartości domyślnych." +msgid "No 'config.yml' found, using defaults." +msgstr "Nie znaleziono pliku 'config.yml', używając wartości domyślnych." #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1268,8 +1268,8 @@ msgid "No need to specify that the app is for Android" msgstr "Nie musisz określać, że aplikacja jest przeznaczona dla Androida" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" -msgstr "Brak opcji! Edytuj plik config.py, aby ustawić co najmniej jedno z poniższych:" +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "Brak opcji! Edytuj plik config.yml, aby ustawić co najmniej jedno z poniższych:" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1318,8 +1318,8 @@ msgid "Nothing to do for {appid}." msgstr "Nic nie robić w {appid}." #: ../fdroidserver/init.py -msgid "Now set these in config.py:" -msgstr "Teraz ustaw je w config.py:" +msgid "Now set these in config.yml:" +msgstr "Teraz ustaw je w config.yml:" #: ../fdroidserver/init.py msgid "Now set these in config.yml:" @@ -1795,8 +1795,8 @@ msgid "This repo already has local metadata: %s" msgstr "To repo ma już lokalne metadane: %s" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" -msgstr "Aby użyć awsbucket, awssecretkey i awsaccesskeyid muszą być również ustawione w config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Aby użyć awsbucket, awssecretkey i awsaccesskeyid muszą być również ustawione w config.yml!" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -2724,8 +2724,8 @@ msgstr "{file} jest pusty lub uszkodzony!" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." -msgstr "{name} \"{path}\" nie istnieje! Popraw go w config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." +msgstr "{name} \"{path}\" nie istnieje! Popraw go w config.yml." #: ../fdroidserver/common.py #, python-brace-format diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 7f0ec61e..de4e6996 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -144,8 +144,8 @@ msgid "%s option does not take a value" msgstr "opção %s não leva um valor" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" -msgstr "'keypass' não foi encontrada em config.py!" +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' não foi encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" @@ -156,24 +156,24 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "\"keystore\" é NONE e \"smartcardoptions\" está vazio!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" -msgstr "'keystore' não encontrada em config.py!" +msgid "'keystore' not found in config.yml!" +msgstr "'keystore' não encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "'keystore' não foi encontrada em config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" -msgstr "'keystorepass' não encontrada em config.py!" +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' não encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' não foi encontrada em config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" -msgstr "'repo_keyalias' não encontrada em config.py!" +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' não encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" @@ -185,8 +185,8 @@ msgid "'required' is an invalid argument for positionals" msgstr "'required' é um argumento inválido para posicionadores" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" -msgstr "'sdk_path' não definido em 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" +msgstr "'sdk_path' não definido em 'config.yml'!" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" @@ -1213,8 +1213,8 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "O nome '%s' é apenas o nome automático - remover" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." -msgstr "'config.py' não encontrado, utilizando as predefinições." +msgid "No 'config.yml' found, using defaults." +msgstr "'config.yml' não encontrado, utilizando as predefinições." #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1262,8 +1262,8 @@ msgid "No need to specify that the app is for Android" msgstr "Não há necessidade de especificar que o app é para Android" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" -msgstr "Sem opção definida! Edite seu config.py para definir pelo menos um destes:" +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "Sem opção definida! Edite seu config.yml para definir pelo menos um destes:" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1312,12 +1312,12 @@ msgid "Nothing to do for {appid}." msgstr "Nada a fazer para {appid}." #: ../fdroidserver/init.py -msgid "Now set these in config.py:" -msgstr "Agora configure estes em config.py:" +msgid "Now set these in config.yml:" +msgstr "Agora configure estes em config.yml:" #: ../fdroidserver/init.py msgid "Now set these in config.yml:" -msgstr "Agora, configure estes em config.py:" +msgstr "Agora, configure estes em config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1787,8 +1787,8 @@ msgid "This repo already has local metadata: %s" msgstr "Este repositório já tem metadados locais: %s" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" -msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -2713,8 +2713,8 @@ msgstr "{file} está em branco ou corrompido!" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." -msgstr "{name} \"{path}\" não existe! Corrija-o no config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." +msgstr "{name} \"{path}\" não existe! Corrija-o no config.yml." #: ../fdroidserver/common.py #, python-brace-format diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index f6b70bcd..026b7c0a 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -150,8 +150,8 @@ msgid "%s option does not take a value" msgstr "opção %s não leva um valor" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" -msgstr "'keypass' não foi encontrada em config.py!" +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' não foi encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" @@ -162,24 +162,24 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "\"keystore\" é NONE e \"smartcardoptions\" está vazia!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" -msgstr "'keystore' não encontrada em config.py!" +msgid "'keystore' not found in config.yml!" +msgstr "'keystore' não encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "\"keystore\" não encontrada em config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" -msgstr "'keystorepass' não encontrada em config.py!" +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' não encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "\"keystorepass\" não encontrada em config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" -msgstr "'repo_keyalias' não encontrada em config.py!" +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' não encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" @@ -191,8 +191,8 @@ msgid "'required' is an invalid argument for positionals" msgstr "'required' é um argumento inválido para posicionadores" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" -msgstr "'sdk_path' não definido em 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" +msgstr "'sdk_path' não definido em 'config.yml'!" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" @@ -1219,8 +1219,8 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "O nome '%s' é apenas o nome automático. Remova-o!" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." -msgstr "Nenhum 'config.py' encontrado, usando padrões." +msgid "No 'config.yml' found, using defaults." +msgstr "Nenhum 'config.yml' encontrado, usando padrões." #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1268,8 +1268,8 @@ msgid "No need to specify that the app is for Android" msgstr "Não há necessidade de especificar que é um aplicativo para Android" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" -msgstr "Nenhuma opção definida! Edite seu 'config.py' para definir pelo menos um destes:" +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "Nenhuma opção definida! Edite seu 'config.yml' para definir pelo menos um destes:" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1318,8 +1318,8 @@ msgid "Nothing to do for {appid}." msgstr "Nada a fazer para {appid}." #: ../fdroidserver/init.py -msgid "Now set these in config.py:" -msgstr "Agora defina estes em config.py:" +msgid "Now set these in config.yml:" +msgstr "Agora defina estes em config.yml:" #: ../fdroidserver/init.py msgid "Now set these in config.yml:" @@ -1793,8 +1793,8 @@ msgid "This repo already has local metadata: %s" msgstr "Este repositório já tem metadados locais: %s" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" -msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -2719,8 +2719,8 @@ msgstr "o {file} está vazio ou está corrompido!" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." -msgstr "{name} \"{path}\" não existe! Corrija-o no config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." +msgstr "{name} \"{path}\" não existe! Corrija-o no config.yml." #: ../fdroidserver/common.py #, python-brace-format diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index f5dc29e6..a38e3830 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -147,8 +147,8 @@ msgid "%s option does not take a value" msgstr "opção %s não leva um valor" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" -msgstr "'keypass' não foi encontrada em config.py!" +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' não foi encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" @@ -159,24 +159,24 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "\"keystore\" é NONE e \"smartcardoptions\" está vazio!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" -msgstr "'keystore' não encontrada em config.py!" +msgid "'keystore' not found in config.yml!" +msgstr "'keystore' não encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "'keystore' não foi encontrada em config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" -msgstr "'keystorepass' não encontrada em config.py!" +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' não encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' não foi encontrada em config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" -msgstr "'repo_keyalias' não encontrada em config.py!" +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' não encontrada em config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" @@ -188,8 +188,8 @@ msgid "'required' is an invalid argument for positionals" msgstr "'required' é um argumento inválido para posicionadores" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" -msgstr "'sdk_path' não definido em 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" +msgstr "'sdk_path' não definido em 'config.yml'!" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" @@ -1216,8 +1216,8 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "O nome '%s' é apenas o nome automático - remover" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." -msgstr "'config.py' não encontrado, utilizando as predefinições." +msgid "No 'config.yml' found, using defaults." +msgstr "'config.yml' não encontrado, utilizando as predefinições." #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1265,8 +1265,8 @@ msgid "No need to specify that the app is for Android" msgstr "Não há necessidade de especificar que o app é para Android" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" -msgstr "Sem opção definida! Edite seu config.py para definir pelo menos um destes:" +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "Sem opção definida! Edite seu config.yml para definir pelo menos um destes:" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1315,12 +1315,12 @@ msgid "Nothing to do for {appid}." msgstr "Nada a fazer para {appid}." #: ../fdroidserver/init.py -msgid "Now set these in config.py:" -msgstr "Agora configure estes em config.py:" +msgid "Now set these in config.yml:" +msgstr "Agora configure estes em config.yml:" #: ../fdroidserver/init.py msgid "Now set these in config.yml:" -msgstr "Agora, configure estes em config.py:" +msgstr "Agora, configure estes em config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1790,8 +1790,8 @@ msgid "This repo already has local metadata: %s" msgstr "Este repositório já tem metadados locais: %s" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" -msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -2716,8 +2716,8 @@ msgstr "{file} está em branco ou corrompido!" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." -msgstr "{name} \"{path}\" não existe! Corrija-o no config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." +msgstr "{name} \"{path}\" não existe! Corrija-o no config.yml." #: ../fdroidserver/common.py #, python-brace-format diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 3dba66f1..5249b971 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -133,7 +133,7 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" +msgid "'keypass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -145,7 +145,7 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" +msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -153,7 +153,7 @@ msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" +msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -161,7 +161,7 @@ msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" +msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -174,7 +174,7 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py @@ -1199,7 +1199,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1248,7 +1248,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1298,7 +1298,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1774,7 +1774,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2703,7 +2703,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index a4e976f0..b008abed 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -153,8 +153,8 @@ msgid "%s option does not take a value" msgstr "%s параметр не принимает значений" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" -msgstr "В config.py нет переменной 'keypass'!" +msgid "'keypass' not found in config.yml!" +msgstr "В config.yml нет переменной 'keypass'!" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" @@ -165,24 +165,24 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "Значение 'keystore` — NONE, но 'smartcardoptions' не задан!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" -msgstr "В config.py нет переменной 'keystore'!" +msgid "'keystore' not found in config.yml!" +msgstr "В config.yml нет переменной 'keystore'!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "'keystore' не найден в config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" -msgstr "В config.py нет переменной 'keystorepass'!" +msgid "'keystorepass' not found in config.yml!" +msgstr "В config.yml нет переменной 'keystorepass'!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' не найден в config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" -msgstr "В config.py нет переменной 'repo_ keyalias'!" +msgid "'repo_keyalias' not found in config.yml!" +msgstr "В config.yml нет переменной 'repo_ keyalias'!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" @@ -194,8 +194,8 @@ msgid "'required' is an invalid argument for positionals" msgstr "'required' не годится в качестве позиционного аргумента" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" -msgstr "В config.py не определен 'sdk_path'!" +msgid "'sdk_path' not set in 'config.yml'!" +msgstr "В config.yml не определен 'sdk_path'!" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" @@ -1223,8 +1223,8 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "Удалите автоматически сгенерированное имя приложения '%s'" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." -msgstr "Файл 'config.py' не обнаружен. Используется конфигурация по умолчанию." +msgid "No 'config.yml' found, using defaults." +msgstr "Файл 'config.yml' не обнаружен. Используется конфигурация по умолчанию." #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1272,8 +1272,8 @@ msgid "No need to specify that the app is for Android" msgstr "Указывать в описании, что приложение для Android, не обязательно. Других здесь не держат" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" -msgstr "Недостаточно опций сборки! Настройте как минимум вот эти (в config.py):" +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "Недостаточно опций сборки! Настройте как минимум вот эти (в config.yml):" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1322,8 +1322,8 @@ msgid "Nothing to do for {appid}." msgstr "Автоматические обновления для {appid} недоступны." #: ../fdroidserver/init.py -msgid "Now set these in config.py:" -msgstr "Определите эти переменные в config.py:" +msgid "Now set these in config.yml:" +msgstr "Определите эти переменные в config.yml:" #: ../fdroidserver/init.py msgid "Now set these in config.yml:" @@ -1798,8 +1798,8 @@ msgid "This repo already has local metadata: %s" msgstr "Локальная копия метаданных репозитория уже существует: %s" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" -msgstr "Необходимо определить переменные awsbucket, awssecretkey и awsaccesskeyid в config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Необходимо определить переменные awsbucket, awssecretkey и awsaccesskeyid в config.yml!" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -2727,8 +2727,8 @@ msgstr "{file} пустой или повреждённый!" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." -msgstr "{name}: неверный путь \"{path}\"! Поправьте его в config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." +msgstr "{name}: неверный путь \"{path}\"! Поправьте его в config.yml." #: ../fdroidserver/common.py #, python-brace-format diff --git a/locale/sk/LC_MESSAGES/fdroidserver.po b/locale/sk/LC_MESSAGES/fdroidserver.po index ca6ea1d4..351f0d55 100644 --- a/locale/sk/LC_MESSAGES/fdroidserver.po +++ b/locale/sk/LC_MESSAGES/fdroidserver.po @@ -132,7 +132,7 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" +msgid "'keypass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -144,7 +144,7 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" +msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -152,7 +152,7 @@ msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" +msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -160,7 +160,7 @@ msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" +msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -173,7 +173,7 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py @@ -1198,7 +1198,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1247,7 +1247,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1297,7 +1297,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1773,7 +1773,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2702,7 +2702,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index 7a7ec009..159a2fee 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -145,8 +145,8 @@ msgid "%s option does not take a value" msgstr "Mundësia %s s’merr ndonjë vlerë" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" -msgstr "S’u gjet 'keypass' në config.py!" +msgid "'keypass' not found in config.yml!" +msgstr "S’u gjet 'keypass' në config.yml!" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" @@ -157,24 +157,24 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' është NONE dhe 'smartcardoptions' është e zbrazët!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" -msgstr "S’u gjet 'keystore' në config.py!" +msgid "'keystore' not found in config.yml!" +msgstr "S’u gjet 'keystore' në config.yml!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "S’u gjet 'keystore' në config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" -msgstr "S’u gjet 'keystorepass' te config.py!" +msgid "'keystorepass' not found in config.yml!" +msgstr "S’u gjet 'keystorepass' te config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "S’u gjet 'keystorepass' te config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" -msgstr "S’u gjet 'repo_keyalias' te config.py!" +msgid "'repo_keyalias' not found in config.yml!" +msgstr "S’u gjet 'repo_keyalias' te config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" @@ -186,8 +186,8 @@ msgid "'required' is an invalid argument for positionals" msgstr "'required' është argument i pavlefshëm për pozicionalë" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" -msgstr "'sdk_path' te 'config.py' s’është ujdisur!" +msgid "'sdk_path' not set in 'config.yml'!" +msgstr "'sdk_path' te 'config.yml' s’është ujdisur!" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" @@ -1214,8 +1214,8 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "Emri '%s' është thjesht emër i automatizuar - hiqeni" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." -msgstr "S’u gjet 'config.py', po përdoren parazgjedhjet." +msgid "No 'config.yml' found, using defaults." +msgstr "S’u gjet 'config.yml', po përdoren parazgjedhjet." #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1237,7 +1237,7 @@ msgstr "Te {linedesc} s’ka parashtrim të specifikuar për {versionName}" #: ../fdroidserver/common.py #, fuzzy msgid "No config.yml found, using defaults." -msgstr "S’u gjet 'config.py', po përdoren parazgjedhjet." +msgstr "S’u gjet 'config.yml', po përdoren parazgjedhjet." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1264,8 +1264,8 @@ msgid "No need to specify that the app is for Android" msgstr "S’ka nevojë të specifikohet që aplikacioni është për Android" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" -msgstr "S’ka mundësi të ujdisur! Përpunoni config.py tuaj që të ujdisni të paktën një prej:" +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "S’ka mundësi të ujdisur! Përpunoni config.yml tuaj që të ujdisni të paktën një prej:" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1314,13 +1314,13 @@ msgid "Nothing to do for {appid}." msgstr "S’ka ç’bëhet për {appid}." #: ../fdroidserver/init.py -msgid "Now set these in config.py:" -msgstr "Tani, ujdisini këto te config.py:" +msgid "Now set these in config.yml:" +msgstr "Tani, ujdisini këto te config.yml:" #: ../fdroidserver/init.py #, fuzzy msgid "Now set these in config.yml:" -msgstr "Tani, ujdisini këto te config.py:" +msgstr "Tani, ujdisini këto te config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1790,13 +1790,13 @@ msgid "This repo already has local metadata: %s" msgstr "Kjo depo ka tashmë tejtëdhëna vendore: %s" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" -msgstr "Për të përdorur awsbucket, te config.py duhen ujdisur edhe awssecretkey dhe awsaccesskey!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Për të përdorur awsbucket, te config.yml duhen ujdisur edhe awssecretkey dhe awsaccesskey!" #: ../fdroidserver/deploy.py #, fuzzy msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Për të përdorur awsbucket, te config.py duhen ujdisur edhe awssecretkey dhe awsaccesskey!" +msgstr "Për të përdorur awsbucket, te config.yml duhen ujdisur edhe awssecretkey dhe awsaccesskey!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -2717,8 +2717,8 @@ msgstr "{file} është e zbrazët ose e dëmtuar!" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." -msgstr "{name} \"{path}\" s’ekziston! Ndreqeni te config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." +msgstr "{name} \"{path}\" s’ekziston! Ndreqeni te config.yml." #: ../fdroidserver/common.py #, python-brace-format diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index 30baded4..be362734 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -133,7 +133,7 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" +msgid "'keypass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -145,7 +145,7 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" +msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -153,7 +153,7 @@ msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" +msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -161,7 +161,7 @@ msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" +msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -174,7 +174,7 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py @@ -1199,7 +1199,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1248,7 +1248,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1298,7 +1298,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1773,7 +1773,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2699,7 +2699,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index f03ca0c6..9df03a4c 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -144,8 +144,8 @@ msgid "%s option does not take a value" msgstr "%s seçeneği bir değer almaz" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" -msgstr "'keypass' config.py içinde bulunamadı!" +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' config.yml içinde bulunamadı!" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" @@ -156,24 +156,24 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' seçeneği NONE ve 'smartcardoptions' seçeneği boş!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" -msgstr "'keystore' config.py içinde bulunamadı!" +msgid "'keystore' not found in config.yml!" +msgstr "'keystore' config.yml içinde bulunamadı!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "'keystore' config.yml içinde bulunamadı!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" -msgstr "'keystorepass' config.py içinde bulunamadı!" +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' config.yml içinde bulunamadı!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' config.yml içinde bulunamadı!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" -msgstr "'repo_keyalias' config.py içinde bulunamadı!" +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' config.yml içinde bulunamadı!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" @@ -185,8 +185,8 @@ msgid "'required' is an invalid argument for positionals" msgstr "'required' positionals için geçersiz bir argüman" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" -msgstr "'sdk_path' 'config.py' içinde ayarlı değil!" +msgid "'sdk_path' not set in 'config.yml'!" +msgstr "'sdk_path' 'config.yml' içinde ayarlı değil!" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" @@ -1213,8 +1213,8 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "Ad '%s' yalnızca kendiliğinden bir ad - kaldırın" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." -msgstr "'config.py' bulunamadı, öntanımlı değerler kullanılıyor." +msgid "No 'config.yml' found, using defaults." +msgstr "'config.yml' bulunamadı, öntanımlı değerler kullanılıyor." #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1262,8 +1262,8 @@ msgid "No need to specify that the app is for Android" msgstr "Uygulamanın Android için olduğunu belirtmeye gerek yok" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" -msgstr "Ayarlı seçenek yok! Sunlardan en az birini ayarlamak için config.py dosyanızı düzenleyin:" +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "Ayarlı seçenek yok! Sunlardan en az birini ayarlamak için config.yml dosyanızı düzenleyin:" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1312,8 +1312,8 @@ msgid "Nothing to do for {appid}." msgstr "{appid} için yapılacak işlem yok." #: ../fdroidserver/init.py -msgid "Now set these in config.py:" -msgstr "Şimdi bunları config.py içinde ayarlayın:" +msgid "Now set these in config.yml:" +msgstr "Şimdi bunları config.yml içinde ayarlayın:" #: ../fdroidserver/init.py msgid "Now set these in config.yml:" @@ -1787,8 +1787,8 @@ msgid "This repo already has local metadata: %s" msgstr "Bu deponun zaten yerel üst verisi var: %s" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" -msgstr "Awsbucket kullanmak için, awssecretkey ve awsaccesskeyid de config.py içinde ayarlanmalı!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Awsbucket kullanmak için, awssecretkey ve awsaccesskeyid de config.yml içinde ayarlanmalı!" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -2713,8 +2713,8 @@ msgstr "{file} boş veya bozuk!" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." -msgstr "{name} \"{path}\" yok! config.py içinde düzeltin." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." +msgstr "{name} \"{path}\" yok! config.yml içinde düzeltin." #: ../fdroidserver/common.py #, python-brace-format diff --git a/locale/tzm/LC_MESSAGES/fdroidserver.po b/locale/tzm/LC_MESSAGES/fdroidserver.po index db122a0a..8e540e97 100644 --- a/locale/tzm/LC_MESSAGES/fdroidserver.po +++ b/locale/tzm/LC_MESSAGES/fdroidserver.po @@ -132,7 +132,7 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" +msgid "'keypass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -144,7 +144,7 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" +msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -152,7 +152,7 @@ msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" +msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -160,7 +160,7 @@ msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" +msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -173,7 +173,7 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py @@ -1197,7 +1197,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1246,7 +1246,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1296,7 +1296,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1771,7 +1771,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2697,7 +2697,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/ug/LC_MESSAGES/fdroidserver.po b/locale/ug/LC_MESSAGES/fdroidserver.po index 1e47a2f9..e66090a9 100644 --- a/locale/ug/LC_MESSAGES/fdroidserver.po +++ b/locale/ug/LC_MESSAGES/fdroidserver.po @@ -133,7 +133,7 @@ msgid "%s option does not take a value" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" +msgid "'keypass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -145,7 +145,7 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" +msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -153,7 +153,7 @@ msgid "'keystore' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" +msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -161,7 +161,7 @@ msgid "'keystorepass' not found in config.yml!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" +msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: ../fdroidserver/common.py @@ -174,7 +174,7 @@ msgid "'required' is an invalid argument for positionals" msgstr "" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" msgstr "" #: ../fdroidserver/common.py @@ -1198,7 +1198,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1247,7 +1247,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1297,7 +1297,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1772,7 +1772,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2698,7 +2698,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 18eb86d0..6fdefb86 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -147,8 +147,8 @@ msgid "%s option does not take a value" msgstr "%s параметр не приймає значення" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" -msgstr "'keypass' не знайдено в config.py!" +msgid "'keypass' not found in config.yml!" +msgstr "'keypass' не знайдено в config.yml!" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" @@ -159,24 +159,24 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' — NONE і 'smartcardoptions' порожній!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" -msgstr "'keystore' не знайдено в config.py!" +msgid "'keystore' not found in config.yml!" +msgstr "'keystore' не знайдено в config.yml!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "'keystore' не знайдено в config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" -msgstr "'keystorepass' не знайдено в config.py!" +msgid "'keystorepass' not found in config.yml!" +msgstr "'keystorepass' не знайдено в config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' не знайдено в config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" -msgstr "'repo_keyalias' не знайдено в config.py!" +msgid "'repo_keyalias' not found in config.yml!" +msgstr "'repo_keyalias' не знайдено в config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" @@ -188,8 +188,8 @@ msgid "'required' is an invalid argument for positionals" msgstr "'required' недійсний аргумент для позицій" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" -msgstr "'sdk_path' не встановлено в 'config.py'!" +msgid "'sdk_path' not set in 'config.yml'!" +msgstr "'sdk_path' не встановлено в 'config.yml'!" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" @@ -1217,8 +1217,8 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "Назву '%s' — створено самочинно, вилучіть її" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." -msgstr "Не знайдено 'config.py', використовуючи типові налаштування." +msgid "No 'config.yml' found, using defaults." +msgstr "Не знайдено 'config.yml', використовуючи типові налаштування." #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1266,8 +1266,8 @@ msgid "No need to specify that the app is for Android" msgstr "Не має потреби вказувати, що застосунок призначено для Android" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" -msgstr "Недостатньо параметрів! Змініть свій config.py, щоб встановити принаймні один з цих:" +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "Недостатньо параметрів! Змініть свій config.yml, щоб встановити принаймні один з цих:" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1316,8 +1316,8 @@ msgid "Nothing to do for {appid}." msgstr "Для {appid} нічого виконувати." #: ../fdroidserver/init.py -msgid "Now set these in config.py:" -msgstr "Тепер встановіть їх у config.py:" +msgid "Now set these in config.yml:" +msgstr "Тепер встановіть їх у config.yml:" #: ../fdroidserver/init.py msgid "Now set these in config.yml:" @@ -1792,8 +1792,8 @@ msgid "This repo already has local metadata: %s" msgstr "Сховище вже має локальні метадані: %s" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" -msgstr "Для використання awsbucket, awssecretkey та awsaccesskeyid також слід налаштувати config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Для використання awsbucket, awssecretkey та awsaccesskeyid також слід налаштувати config.yml!" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -2721,8 +2721,8 @@ msgstr "{file} порожній або пошкоджений!" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." -msgstr "{name} \"{path}\" не існує! Виправте його в config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." +msgstr "{name} \"{path}\" не існує! Виправте його в config.yml." #: ../fdroidserver/common.py #, python-brace-format diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 2393eac7..e64dced1 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -149,8 +149,8 @@ msgid "%s option does not take a value" msgstr "%s 选项不采用值" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" -msgstr "config.py中找不到'keypass'!" +msgid "'keypass' not found in config.yml!" +msgstr "config.yml中找不到'keypass'!" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" @@ -161,24 +161,24 @@ msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' 没有赋值,'smartcardoptions' 为空!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" -msgstr "config.py中找不到'keypass'!" +msgid "'keystore' not found in config.yml!" +msgstr "config.yml中找不到'keypass'!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" msgstr "config.yml 中找不到'keystore'!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" -msgstr "config.py中找不到'keystorepass'!" +msgid "'keystorepass' not found in config.yml!" +msgstr "config.yml中找不到'keystorepass'!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "config.yml 中找不到 'keystorepass'!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" -msgstr "config.py中找不到'repo_keyalias'!" +msgid "'repo_keyalias' not found in config.yml!" +msgstr "config.yml中找不到'repo_keyalias'!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" @@ -190,8 +190,8 @@ msgid "'required' is an invalid argument for positionals" msgstr "'required'是无效的位置参数" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" -msgstr "未在“ config.py”中设置“ sdk_path”!" +msgid "'sdk_path' not set in 'config.yml'!" +msgstr "未在“ config.yml”中设置“ sdk_path”!" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" @@ -1213,7 +1213,7 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." +msgid "No 'config.yml' found, using defaults." msgstr "" #: ../fdroidserver/common.py @@ -1262,7 +1262,7 @@ msgid "No need to specify that the app is for Android" msgstr "" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" +msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" #: ../fdroidserver/common.py @@ -1312,7 +1312,7 @@ msgid "Nothing to do for {appid}." msgstr "" #: ../fdroidserver/init.py -msgid "Now set these in config.py:" +msgid "Now set these in config.yml:" msgstr "" #: ../fdroidserver/init.py @@ -1786,7 +1786,7 @@ msgid "This repo already has local metadata: %s" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -2709,7 +2709,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" #: ../fdroidserver/common.py diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 5c6be6e8..5cf60dc5 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -140,44 +140,44 @@ msgid "%s option does not take a value" msgstr "%s 選項不帶值" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.py!" -msgstr "config.py 找不到 'keypass'!" +msgid "'keypass' not found in config.yml!" +msgstr "config.yml 找不到 'keypass'!" #: ../fdroidserver/common.py #, fuzzy msgid "'keypass' not found in config.yml!" -msgstr "config.py 找不到 'keypass'!" +msgstr "config.yml 找不到 'keypass'!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.py!" -msgstr "config.py 找不到 'keystore'!" +msgid "'keystore' not found in config.yml!" +msgstr "config.yml 找不到 'keystore'!" #: ../fdroidserver/common.py #, fuzzy msgid "'keystore' not found in config.yml!" -msgstr "config.py 找不到 'keystore'!" +msgstr "config.yml 找不到 'keystore'!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.py!" -msgstr "config.py 找不到 'keystorepass'!" +msgid "'keystorepass' not found in config.yml!" +msgstr "config.yml 找不到 'keystorepass'!" #: ../fdroidserver/common.py #, fuzzy msgid "'keystorepass' not found in config.yml!" -msgstr "config.py 找不到 'keystorepass'!" +msgstr "config.yml 找不到 'keystorepass'!" #: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.py!" -msgstr "config.py 找不到 'repo_keyalias'!" +msgid "'repo_keyalias' not found in config.yml!" +msgstr "config.yml 找不到 'repo_keyalias'!" #: ../fdroidserver/common.py #, fuzzy msgid "'repo_keyalias' not found in config.yml!" -msgstr "config.py 找不到 'repo_keyalias'!" +msgstr "config.yml 找不到 'repo_keyalias'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -185,13 +185,13 @@ msgid "'required' is an invalid argument for positionals" msgstr "這些地方的 '必填' 為無效引數" #: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.py'!" -msgstr "'config.py' 未設定 'sdk_path'!" +msgid "'sdk_path' not set in 'config.yml'!" +msgstr "'config.yml' 未設定 'sdk_path'!" #: ../fdroidserver/common.py #, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "'config.py' 未設定 'sdk_path'!" +msgstr "'config.yml' 未設定 'sdk_path'!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -1218,8 +1218,8 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "名稱 '%s' 為自動產生 - 請移除它" #: ../fdroidserver/common.py -msgid "No 'config.py' found, using defaults." -msgstr "找不到 'config.py',使用預設。" +msgid "No 'config.yml' found, using defaults." +msgstr "找不到 'config.yml',使用預設。" #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1241,7 +1241,7 @@ msgstr "{linedesc} 沒有指定給 {versionName} 的提交" #: ../fdroidserver/common.py #, fuzzy msgid "No config.yml found, using defaults." -msgstr "找不到 'config.py',使用預設。" +msgstr "找不到 'config.yml',使用預設。" #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1269,8 +1269,8 @@ msgid "No need to specify that the app is for Android" msgstr "不必指明該應用為 Android 版本" #: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.py to set at least one of these:" -msgstr "未設定選項!編輯 config.py 檔,其中至少要設定一個:" +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "未設定選項!編輯 config.yml 檔,其中至少要設定一個:" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1319,13 +1319,13 @@ msgid "Nothing to do for {appid}." msgstr "{appid} 無須採取行動." #: ../fdroidserver/init.py -msgid "Now set these in config.py:" -msgstr "現在設定這些在 config.py 中:" +msgid "Now set these in config.yml:" +msgstr "現在設定這些在 config.yml 中:" #: ../fdroidserver/init.py #, fuzzy msgid "Now set these in config.yml:" -msgstr "現在設定這些在 config.py 中:" +msgstr "現在設定這些在 config.yml 中:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1795,13 +1795,13 @@ msgid "This repo already has local metadata: %s" msgstr "這個軟體庫已有本地的中介資料:%s" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!" -msgstr "要使用 awsbucket, awssecretkey 與 awsaccesskeyid 必須在 config.py 進行設定!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "要使用 awsbucket, awssecretkey 與 awsaccesskeyid 必須在 config.yml 進行設定!" #: ../fdroidserver/deploy.py #, fuzzy msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "要使用 awsbucket, awssecretkey 與 awsaccesskeyid 必須在 config.py 進行設定!" +msgstr "要使用 awsbucket, awssecretkey 與 awsaccesskeyid 必須在 config.yml 進行設定!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -2725,8 +2725,8 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.py." -msgstr "{name} \"{path}\" 不存在! 請更正 config.py." +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." +msgstr "{name} \"{path}\" 不存在! 請更正 config.yml." #: ../fdroidserver/common.py #, python-brace-format From 63be6f634717634aa1810247f25ecdd08e63a281 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 29 Jan 2021 15:28:55 +0100 Subject: [PATCH 0125/2116] standardize naming in strings and comments on all caps APK --- examples/config.yml | 6 ++-- fdroidserver/build.py | 12 ++++---- fdroidserver/common.py | 16 +++++----- fdroidserver/index.py | 2 +- fdroidserver/install.py | 4 +-- fdroidserver/update.py | 4 +-- locale/ang/LC_MESSAGES/fdroidserver.po | 14 ++++----- locale/bn/LC_MESSAGES/fdroidserver.po | 14 ++++----- locale/bo/LC_MESSAGES/fdroidserver.po | 36 +++++++++++----------- locale/cs/LC_MESSAGES/fdroidserver.po | 14 ++++----- locale/cy/LC_MESSAGES/fdroidserver.po | 14 ++++----- locale/de/LC_MESSAGES/fdroidserver.po | 20 ++++++------ locale/el/LC_MESSAGES/fdroidserver.po | 14 ++++----- locale/enm/LC_MESSAGES/fdroidserver.po | 14 ++++----- locale/es/LC_MESSAGES/fdroidserver.po | 30 +++++++++--------- locale/es_AR/LC_MESSAGES/fdroidserver.po | 24 +++++++-------- locale/es_MX/LC_MESSAGES/fdroidserver.po | 18 +++++------ locale/eu/LC_MESSAGES/fdroidserver.po | 14 ++++----- locale/fa/LC_MESSAGES/fdroidserver.po | 14 ++++----- locale/fdroidserver.pot | 10 +++--- locale/fi/LC_MESSAGES/fdroidserver.po | 14 ++++----- locale/fr/LC_MESSAGES/fdroidserver.po | 24 +++++++-------- locale/hi/LC_MESSAGES/fdroidserver.po | 14 ++++----- locale/hu/LC_MESSAGES/fdroidserver.po | 14 ++++----- locale/id/LC_MESSAGES/fdroidserver.po | 14 ++++----- locale/it/LC_MESSAGES/fdroidserver.po | 24 +++++++-------- locale/ja/LC_MESSAGES/fdroidserver.po | 14 ++++----- locale/kab/LC_MESSAGES/fdroidserver.po | 18 +++++------ locale/ko/LC_MESSAGES/fdroidserver.po | 16 +++++----- locale/ml/LC_MESSAGES/fdroidserver.po | 14 ++++----- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 14 ++++----- locale/nl/LC_MESSAGES/fdroidserver.po | 14 ++++----- locale/pl/LC_MESSAGES/fdroidserver.po | 26 ++++++++-------- locale/pt/LC_MESSAGES/fdroidserver.po | 28 ++++++++--------- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 24 +++++++-------- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 28 ++++++++--------- locale/ro/LC_MESSAGES/fdroidserver.po | 14 ++++----- locale/ru/LC_MESSAGES/fdroidserver.po | 18 +++++------ locale/sk/LC_MESSAGES/fdroidserver.po | 14 ++++----- locale/sq/LC_MESSAGES/fdroidserver.po | 24 +++++++-------- locale/sv/LC_MESSAGES/fdroidserver.po | 14 ++++----- locale/tr/LC_MESSAGES/fdroidserver.po | 20 ++++++------ locale/tzm/LC_MESSAGES/fdroidserver.po | 14 ++++----- locale/ug/LC_MESSAGES/fdroidserver.po | 14 ++++----- locale/uk/LC_MESSAGES/fdroidserver.po | 32 +++++++++---------- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 24 +++++++-------- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 34 ++++++++++---------- 47 files changed, 408 insertions(+), 408 deletions(-) diff --git a/examples/config.yml b/examples/config.yml index ac1e44a0..eee0bd0f 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -111,7 +111,7 @@ # Optionally, override home directory for gpg # gpghome: /home/fdroid/somewhere/else/.gnupg -# The ID of a GPG key for making detached signatures for apks. Optional. +# The ID of a GPG key for making detached signatures for APKs. Optional. # gpgkey: 1DBA2E89 # The key (from the keystore defined below) to be used for signing the @@ -269,12 +269,12 @@ # nonstandardwebroot: false -# If you want to upload the release apk file to androidobservatory.org +# If you want to upload the release APK file to androidobservatory.org # # androidobservatory: false -# If you want to upload the release apk file to virustotal.com +# If you want to upload the release APK file to virustotal.com # You have to enter your profile apikey to enable the upload. # # virustotal_apikey: 9872987234982734 diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 6b35afac..36411149 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -659,7 +659,7 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext # expected to fail. # Signing will fail if not set by environnment vars (cf. p4a docs). - # But the unsigned apk will be ok. + # But the unsigned APK will be ok. p.returncode = 0 elif bmethod == 'gradle': @@ -748,7 +748,7 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext # really old path os.path.join(root_dir, 'build', 'apk'), ] - # If we build with gradle flavours with gradle plugin >= 3.0 the apk will be in + # If we build with gradle flavours with gradle plugin >= 3.0 the APK will be in # a subdirectory corresponding to the flavour command used, but with different # capitalization. if flavours_cmd: @@ -790,10 +790,10 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext raise BuildException("APK is debuggable") # By way of a sanity check, make sure the version and version - # code in our new apk match what we expect... + # code in our new APK match what we expect... logging.debug("Checking " + src) if not os.path.exists(src): - raise BuildException("Unsigned apk is not at expected location of " + src) + raise BuildException("Unsigned APK is not at expected location of " + src) if common.get_file_extension(src) == 'apk': vercode, version = get_metadata_from_apk(app, build, src) @@ -807,7 +807,7 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext if scanner.scan_binary(src): raise BuildException("Found blacklisted packages in final apk!") - # Copy the unsigned apk to our destination directory for further + # Copy the unsigned APK to our destination directory for further # processing (by publish.py)... dest = os.path.join(output_dir, common.get_release_filename(app, build)) shutil.copyfile(src, dest) @@ -1111,7 +1111,7 @@ def main(): if app.Binaries is not None: # This is an app where we build from source, and - # verify the apk contents against a developer's + # verify the APK contents against a developer's # binary. We get that binary now, and save it # alongside our built one in the 'unsigend' # directory. diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 7f5aa164..9cd538ab 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2312,7 +2312,7 @@ class KnownApks: def recordapk(self, apkName, app, default_date=None): ''' - Record an apk (if it's new, otherwise does nothing) + Record an APK (if it's new, otherwise does nothing) Returns the date it was added as a datetime instance ''' if apkName not in self.apks: @@ -2410,7 +2410,7 @@ def is_apk_and_debuggable(apkfile): Parse only from the APK. - :param apkfile: full path to the apk to check""" + :param apkfile: full path to the APK to check""" if get_file_extension(apkfile) != 'apk': return False @@ -2968,7 +2968,7 @@ def metadata_find_developer_signing_files(appid, vercode): def apk_strip_v1_signatures(signed_apk, strip_manifest=False): """Removes signatures from APK. - :param signed_apk: path to apk file. + :param signed_apk: path to APK file. :param strip_manifest: when set to True also the manifest file will be removed from the APK. """ @@ -3049,7 +3049,7 @@ def get_min_sdk_version(apk): """ This wraps the androguard function to always return and int and fall back to 1 if we can't get a valid minsdk version - :param apk: androguard apk object + :param apk: androguard APK object :return: minsdk as int """ try: @@ -3144,12 +3144,12 @@ def verify_apks(signed_apk, unsigned_apk, tmp_dir): One of the inputs is signed, the other is unsigned. The signature metadata is transferred from the signed to the unsigned apk, and then jarsigner is - used to verify that the signature from the signed apk is also valid for + used to verify that the signature from the signed APK is also valid for the unsigned one. If the APK given as unsigned actually does have a signature, it will be stripped out and ignored. - :param signed_apk: Path to a signed apk file - :param unsigned_apk: Path to an unsigned apk file expected to match it + :param signed_apk: Path to a signed APK file + :param unsigned_apk: Path to an unsigned APK file expected to match it :param tmp_dir: Path to directory for temporary files :returns: None if the verification is successful, otherwise a string describing what went wrong. @@ -3312,7 +3312,7 @@ apk_badchars = re.compile('''[/ :;'"]''') def compare_apks(apk1, apk2, tmp_dir, log_dir=None): """Compare two apks - Returns None if the apk content is the same (apart from the signing key), + Returns None if the APK content is the same (apart from the signing key), otherwise a string describing what's different, or what went wrong when trying to do the comparison. """ diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 8db844d4..fb62014b 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -444,7 +444,7 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing if app.RequiresRoot: addElement('requirements', 'root', doc, apel) - # Sort the apk list into version order, just so the web site + # Sort the APK list into version order, just so the web site # doesn't have to do any work by default... apklist = sorted(apklist, key=lambda apk: apk['versionCode'], reverse=True) diff --git a/fdroidserver/install.py b/fdroidserver/install.py index 0e50c27b..8bc5a5d8 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -70,7 +70,7 @@ def main(): vercodes = common.read_pkg_args(options.appid, True) apks = {appid: None for appid in vercodes} - # Get the signed apk with the highest vercode + # Get the signed APK with the highest vercode for apkfile in sorted(glob.glob(os.path.join(output_dir, '*.apk'))): try: @@ -85,7 +85,7 @@ def main(): for appid, apk in apks.items(): if not apk: - raise FDroidException(_("No signed apk available for %s") % appid) + raise FDroidException(_("No signed APK available for %s") % appid) else: diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 983bdb79..afde773e 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1442,14 +1442,14 @@ def scan_apk_androguard(apk, apkfile): else: if options.delete_unknown: if os.path.exists(apkfile): - logging.error(_("Failed to get apk information, deleting {path}") + logging.error(_("Failed to get APK information, deleting {path}") .format(path=apkfile)) os.remove(apkfile) else: logging.error(_("Could not find {path} to remove it") .format(path=apkfile)) else: - logging.error(_("Failed to get apk information, skipping {path}") + logging.error(_("Failed to get APK information, skipping {path}") .format(path=apkfile)) raise BuildException(_("Invalid APK")) except (FileNotFoundError, zipfile.BadZipFile) as e: diff --git a/locale/ang/LC_MESSAGES/fdroidserver.po b/locale/ang/LC_MESSAGES/fdroidserver.po index 6398a29f..bc53b111 100644 --- a/locale/ang/LC_MESSAGES/fdroidserver.po +++ b/locale/ang/LC_MESSAGES/fdroidserver.po @@ -439,7 +439,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -504,7 +504,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -780,12 +780,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1254,7 +1254,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1632,7 +1632,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2006,7 +2006,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index b38f4eab..870a15bf 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -440,7 +440,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -505,7 +505,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -781,12 +781,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1255,7 +1255,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1633,7 +1633,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2007,7 +2007,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index 4807bc4f..10619f4f 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -452,8 +452,8 @@ msgstr "མཉེན་ཆས་རྣམས་གསར་བསྒྱུར་ #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "མཛོད་ཁང་ཚོད་ལྟའི་ཆེད་དུ།{appid} - apks:{integer},ཐོན་རིམ་ཉར་ཚགས།:{keep},archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "མཛོད་ཁང་ཚོད་ལྟའི་ཆེད་དུ།{appid} - APKs:{integer},ཐོན་རིམ་ཉར་ཚགས།:{keep},archapks:{arch}" #: ../fdroidserver/dscanner.py msgid "Clean after all scans have finished" @@ -469,7 +469,7 @@ msgstr "སྣོད་ཆ་ཚང་གཙང་མ་བཟོས་ནས་ #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" -msgstr "གསར་བསྒྱུར་གཙང་བཟོ།-ཡིག་ཆ་གསོག་ཉར་བེད་སྤྱོ་མ་བྱེད། apks ཚང་མ་སྐྱར་སྤྱོད་བྱེད།" +msgstr "གསར་བསྒྱུར་གཙང་བཟོ།-ཡིག་ཆ་གསོག་ཉར་བེད་སྤྱོ་མ་བྱེད། APKs ཚང་མ་སྐྱར་སྤྱོད་བྱེད།" #: ../fdroidserver/import.py msgid "Comma separated list of categories." @@ -516,11 +516,11 @@ msgstr "{path}མེད་པ་བཟོས་པ་ལ་རྙེད་མ་ #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "དཔྱད་ཞིབ་ཀྱི་ཆེད་དུ་apk ཡིག་ཆ་ཁ་ཕྱེས་ཐུབ་ཀྱི་མིན་འདུག" +msgstr "དཔྱད་ཞིབ་ཀྱི་ཆེད་དུ་APK ཡིག་ཆ་ཁ་ཕྱེས་ཐུབ་ཀྱི་མིན་འདུག" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" -msgstr "དཔྱད་ཞིབ་ཀྱི་ཆེད་དུ་apk ཡིག་ཆ་ཁ་ཕྱེས་ཐུབ་ཀྱི་མིན་འདུག" +msgid "Could not open APK file for analysis" +msgstr "དཔྱད་ཞིབ་ཀྱི་ཆེད་དུ་APK ཡིག་ཆ་ཁ་ཕྱེས་ཐུབ་ཀྱི་མིན་འདུག" #: ../fdroidserver/common.py #, python-brace-format @@ -798,13 +798,13 @@ msgstr "APKནང་གསལ་བའི་གནས་ཚུལ་རྣམས #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" -msgstr "apk གནས་ཚུལ་རག་གི་མིན་འདུག {path}སུབ་བཞིན་པ།" +msgid "Failed to get APK information, deleting {path}" +msgstr "APK གནས་ཚུལ་རག་གི་མིན་འདུག {path}སུབ་བཞིན་པ།" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" -msgstr "apk གནས་ཚུལ་རག་གི་མིན་འདུག {path}མཆོང་།" +msgid "Failed to get APK information, skipping {path}" +msgstr "APK གནས་ཚུལ་རག་གི་མིན་འདུག {path}མཆོང་།" #: ../fdroidserver/install.py #, python-brace-format @@ -1278,8 +1278,8 @@ msgstr "ཐུམ་སྒྲིལ་དམིགས་སྟོན་བྱེ #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" -msgstr "%s 1ཆེད་དུ་མིང་རྟགས་བཀོད་པའི་ apk མེད།" +msgid "No signed APK available for %s" +msgstr "%s 1ཆེད་དུ་མིང་རྟགས་བཀོད་པའི་ APK མེད།" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" @@ -1657,8 +1657,8 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "གློག་ཀླད་ལད་མོ་མཁན་ཞིག་སྒྲིག འདིའི་སྒང་ལ་ APK ནང་འགྲིག་བཅུག་བྱེད་དུ་བཅུག་ནས་ཌོ་ཛར་འཚག་རྒྱབ་འགོ་བཙུགས་བྱེད།" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" -msgstr "གློག་ཀླད་ལད་མོ་མཁན་ཞིག་སྒྲིག འདིའི་སྒང་ལ་apk ནང་འགྲིག་བཅུག་བྱེད་དུ་བཅུག་ནས་ཌོ་ཛར་འཚག་རྒྱབ་འགོ་བཙུགས་བྱེད།" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" +msgstr "གློག་ཀླད་ལད་མོ་མཁན་ཞིག་སྒྲིག འདིའི་སྒང་ལ་APK ནང་འགྲིག་བཅུག་བྱེད་དུ་བཅུག་ནས་ཌོ་ཛར་འཚག་རྒྱབ་འགོ་བཙུགས་བྱེད།" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" @@ -2035,8 +2035,8 @@ msgstr "ཐོན་སྐྱེད་ཞབས་ཞུ་འཕྲུལ་ཆ msgid "Use date from APK instead of current time for newly added APKs" msgstr "APK རང་གི་ཚེས་གྲངས་དེ་བེད་སྤྱོད་བྱས་པ་ལས་ཁ་སྣོན་བྱས་པའི་ APKs གསར་པའི་དུས་ཚོས་བེད་སྤྱོད་མ་བྱེད།" -msgid "Use date from apk instead of current time for newly added apks" -msgstr "apk རང་གི་ཚེས་གྲངས་དེ་བེད་སྤྱོད་བྱས་པ་ལས་ཁ་སྣོན་བྱས་པའི་apk གསར་པའི་དུས་ཚོས་བེད་སྤྱོད་མ་བྱེད།" +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "APK རང་གི་ཚེས་གྲངས་དེ་བེད་སྤྱོད་བྱས་པ་ལས་ཁ་སྣོན་བྱས་པའི་APK གསར་པའི་དུས་ཚོས་བེད་སྤྱོད་མ་བྱེད།" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -2791,8 +2791,8 @@ msgstr[0] "{} བཟོ་སྐྲུན་ལེགས་སྒྲུབ།" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "{path}!གྱི་ཆེད་དུ་ཐུམ་སྒྲིལ་གྱི་མིང་རྙེད་མ་སོང་།" -#~ msgid "Clean update - don't uses caches, reprocess all apks" -#~ msgstr "གསར་བསྒྱུར་གཙང་བཟོ།-ཡིག་ཆ་གསོག་ཉར་བེད་སྤྱོ་མ་བྱེད། apks ཚང་མ་སྐྱར་སྤྱོད་བྱེད།" +#~ msgid "Clean update - don't uses caches, reprocess all APKs" +#~ msgstr "གསར་བསྒྱུར་གཙང་བཟོ།-ཡིག་ཆ་གསོག་ཉར་བེད་སྤྱོ་མ་བྱེད། APKs ཚང་མ་སྐྱར་སྤྱོད་བྱེད།" #~ msgid "Interactively ask about things that need updating." #~ msgstr "གསར་བསྒྱུར་བྱེད་དགོས་པའི་རིགས་ལ་སྦས་གསང་མེད་པའི་ཐོག་ནས་གསུངས་རོགས།." diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 63a25cc5..20792d3d 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -443,7 +443,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -508,7 +508,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -785,12 +785,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1259,7 +1259,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1638,7 +1638,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2012,7 +2012,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/cy/LC_MESSAGES/fdroidserver.po b/locale/cy/LC_MESSAGES/fdroidserver.po index 33fe40f2..087bf343 100644 --- a/locale/cy/LC_MESSAGES/fdroidserver.po +++ b/locale/cy/LC_MESSAGES/fdroidserver.po @@ -454,7 +454,7 @@ msgstr "Gwirio am ddiweddariadau i apiau" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -519,7 +519,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -795,12 +795,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1269,7 +1269,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1651,7 +1651,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2025,7 +2025,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index aae9b020..2b1c6426 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -16,7 +16,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-14 14:55+0100\n" -"PO-Revision-Date: 2021-01-20 16:32+0000\n" +"PO-Revision-Date: 2021-01-29 13:54+0100\n" "Last-Translator: TobiGr \n" "Language-Team: German \n" "Language: de\n" @@ -464,8 +464,6 @@ msgstr "Auf Aktualisierungen für Anwendungen prüfen" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Archivierung auf {appid} überprüfen - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/dscanner.py msgid "Clean after all scans have finished" @@ -478,6 +476,8 @@ msgstr "Vor Beginn der Scans bereinigen und Container neu erstellen" #: ../fdroidserver/dscanner.py msgid "Clean up all containers and then exit" msgstr "Alle Container bereinigen und danach beenden" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Archivierung auf {appid} überprüfen - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -529,7 +529,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "Konnte APK-Datei {path} nicht für Analyse öffnen " #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "Konnte APK-Datei nicht für Analyse öffnen" #: ../fdroidserver/common.py @@ -810,12 +810,12 @@ msgstr "Abrufen der APK-Manifest-Informationen fehlgeschlagen" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "Abrufen der APK-Informationen fehlgeschlagen, {path} wird gelöscht" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "Abrufen der APK-Informationen fehlgeschlagen, {path} wird übersprungen" #: ../fdroidserver/install.py @@ -1286,7 +1286,7 @@ msgstr "Keine Pakete angegeben" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "Keine signierte Apk für %s verfügbar" #: ../fdroidserver/install.py @@ -1665,7 +1665,7 @@ msgstr "Stelle einen {0} Sek timeout für diesen Build ein" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "Einen Emulator einrichten, die APK installieren und mit ihm eine Sicherheitsprüfung (Drozer scan) durchführen" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "Einen Emulator einrichten, die APK installieren und mit ihm eine Sicherheitsprüfung (Drozer scan) durchführen" #: ../fdroid ../fdroidserver/__main__.py @@ -2042,7 +2042,7 @@ msgstr "Build-Server verwenden" msgid "Use date from APK instead of current time for newly added APKs" msgstr "APK-Datum statt der aktuellen Zeit für neu hinzugefügte APKs verwenden" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "APK-Datum statt der aktuellen Zeit für neu hinzugefügte APKs verwenden" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py @@ -2803,7 +2803,7 @@ msgstr[1] "Buildvorgänge erfolgreich" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "AppID für {path} konnte nicht gefunden werden!" -#~ msgid "Clean update - don't uses caches, reprocess all apks" +#~ msgid "Clean update - don't uses caches, reprocess all APKs" #~ msgstr "Sauber - ohne Verwendung der Zwischenspeicher - aktualisieren, alle APKs wiederaufbereiten" #~ msgid "Interactively ask about things that need updating." diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index de14ca57..1d609971 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -441,7 +441,7 @@ msgstr "Έλεγχος για ενημερώσεις εφαρμογών" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -506,7 +506,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -782,12 +782,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1256,7 +1256,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1634,7 +1634,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2008,7 +2008,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/enm/LC_MESSAGES/fdroidserver.po b/locale/enm/LC_MESSAGES/fdroidserver.po index 4b6d4511..6f9ff53c 100644 --- a/locale/enm/LC_MESSAGES/fdroidserver.po +++ b/locale/enm/LC_MESSAGES/fdroidserver.po @@ -439,7 +439,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -504,7 +504,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -780,12 +780,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1254,7 +1254,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1632,7 +1632,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2006,7 +2006,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index bdcadbef..f91edffd 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -459,8 +459,8 @@ msgstr "Buscar actualizaciones de aplicaciones" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Comprobando la operación de archivo para {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Comprobando la operación de archivo para {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/dscanner.py msgid "Clean after all scans have finished" @@ -521,11 +521,11 @@ msgstr "No se pudo encontrar {path} para eliminarlo" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "No se pudo abrir el archivo apk {path} para analizarlo: " +msgstr "No se pudo abrir el archivo APK {path} para analizarlo: " #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" -msgstr "No se ha podido abrir el archivo apk para analizarlo" +msgid "Could not open APK file for analysis" +msgstr "No se ha podido abrir el archivo APK para analizarlo" #: ../fdroidserver/common.py #, python-brace-format @@ -804,13 +804,13 @@ msgstr "Fallo al obtener la información de manifiesto APK" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" -msgstr "Fallo al obtener la información de apk, borrando {path}" +msgid "Failed to get APK information, deleting {path}" +msgstr "Fallo al obtener la información de APK, borrando {path}" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" -msgstr "Fallo al obtener la información de apk, omitiendo {path}" +msgid "Failed to get APK information, skipping {path}" +msgstr "Fallo al obtener la información de APK, omitiendo {path}" #: ../fdroidserver/install.py #, python-brace-format @@ -1278,8 +1278,8 @@ msgstr "No se han especificado paquetes" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" -msgstr "No hay apk firmado disponible para %s" +msgid "No signed APK available for %s" +msgstr "No hay APK firmado disponible para %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" @@ -1656,7 +1656,7 @@ msgstr "Estableciendo un máximo de {0} segundos para esta compilación" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "Establecer un emulador, instalar la APK en el y realizar un escaneo con \"Drozer\"" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "Configurar un emulador, instalar la aplicación APK en él y realizar una \"Drozer\" scan" #: ../fdroid ../fdroidserver/__main__.py @@ -2030,8 +2030,8 @@ msgstr "Use un servidor de compilación" msgid "Use date from APK instead of current time for newly added APKs" msgstr "Use la fecha del APK en vez de la fecha actual para los nuevos APK añadidos" -msgid "Use date from apk instead of current time for newly added apks" -msgstr "Use la fecha del «apk» en vez de la fecha actual para los nuevos «apk» añadidos" +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "Use la fecha del «APK» en vez de la fecha actual para los nuevos «APK» añadidos" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -2788,7 +2788,7 @@ msgstr[1] "compilaciones con éxito {}" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "¡No se puede encontrar un appid para {path}!" -#~ msgid "Clean update - don't uses caches, reprocess all apks" +#~ msgid "Clean update - don't uses caches, reprocess all APKs" #~ msgstr "Actualización limpia, no usa caché, reprocesa todas las aplicaciones APK" #~ msgid "Interactively ask about things that need updating." diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index 295d19f5..c90e24ad 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -447,7 +447,7 @@ msgstr "Buscar actualizaciones de las aplicaciones" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -515,7 +515,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -794,12 +794,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1270,7 +1270,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1649,10 +1649,10 @@ msgstr "" #: ../fdroidserver/build.py #, fuzzy msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "Configurar un emulador, instalarle el apk y realizar el escaneo de barrido" +msgstr "Configurar un emulador, instalarle el APK y realizar el escaneo de barrido" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" -msgstr "Configurar un emulador, instalarle el apk y realizar el escaneo de barrido" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" +msgstr "Configurar un emulador, instalarle el APK y realizar el escaneo de barrido" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" @@ -2025,10 +2025,10 @@ msgstr "Usar servidor de construccion" #: ../fdroidserver/update.py #, fuzzy msgid "Use date from APK instead of current time for newly added APKs" -msgstr "Utilizar la fecha del apk en vez de la actual para los apks nuevos que se agreguen" +msgstr "Utilizar la fecha del APK en vez de la actual para los APKs nuevos que se agreguen" -msgid "Use date from apk instead of current time for newly added apks" -msgstr "Utilizar la fecha del apk en vez de la actual para los apks nuevos que se agreguen" +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "Utilizar la fecha del APK en vez de la actual para los APKs nuevos que se agreguen" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -2789,7 +2789,7 @@ msgstr[1] "" #~ msgid "Add gpg signatures for packages in repo" #~ msgstr "Agregar firmas GPG a paquetes en el repositorio" -#~ msgid "Clean update - don't uses caches, reprocess all apks" +#~ msgid "Clean update - don't uses caches, reprocess all APKs" #~ msgstr "Limpiar actualización - no utiliza cachés, reprocesa todos los APK's" #~ msgid "Interactively ask about things that need updating." diff --git a/locale/es_MX/LC_MESSAGES/fdroidserver.po b/locale/es_MX/LC_MESSAGES/fdroidserver.po index 96b9b6dd..f62c1efc 100644 --- a/locale/es_MX/LC_MESSAGES/fdroidserver.po +++ b/locale/es_MX/LC_MESSAGES/fdroidserver.po @@ -441,7 +441,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -505,11 +505,11 @@ msgstr "No se pudo encontrar {path} para eliminarlo" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "No se pudo abrir el archivo apk para su análisis" +msgstr "No se pudo abrir el archivo APK para su análisis" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" -msgstr "No se pudo abrir el archivo apk para su análisis" +msgid "Could not open APK file for analysis" +msgstr "No se pudo abrir el archivo APK para su análisis" #: ../fdroidserver/common.py #, python-brace-format @@ -785,12 +785,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1259,7 +1259,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1637,7 +1637,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2011,7 +2011,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/eu/LC_MESSAGES/fdroidserver.po b/locale/eu/LC_MESSAGES/fdroidserver.po index 27a3e4b1..206b986c 100644 --- a/locale/eu/LC_MESSAGES/fdroidserver.po +++ b/locale/eu/LC_MESSAGES/fdroidserver.po @@ -439,7 +439,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -504,7 +504,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -780,12 +780,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1254,7 +1254,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1632,7 +1632,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2006,7 +2006,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index 9af9dd49..402636ae 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -441,7 +441,7 @@ msgstr "به‌روزرسانی‌ها برای برنامه‌ها را برر #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -506,7 +506,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -782,12 +782,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1256,7 +1256,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1634,7 +1634,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2008,7 +2008,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/fdroidserver.pot b/locale/fdroidserver.pot index 575862c4..afad9c01 100644 --- a/locale/fdroidserver.pot +++ b/locale/fdroidserver.pot @@ -441,7 +441,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -782,12 +782,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1256,7 +1256,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -2008,7 +2008,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index b7ec0efe..b363b5e6 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -439,7 +439,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -504,7 +504,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -780,12 +780,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1254,7 +1254,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1632,7 +1632,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2006,7 +2006,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index ec55e0bf..92dfc542 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -474,8 +474,8 @@ msgstr "Vérifier les mises à jour pour les applications" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Vérification de l'archivage pour {appid} - apks : {integer}, keepversions : {keep}, archapks : {arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Vérification de l'archivage pour {appid} - APKs : {integer}, keepversions : {keep}, archapks : {arch}" #: ../fdroidserver/dscanner.py msgid "Clean after all scans have finished" @@ -536,11 +536,11 @@ msgstr "Chemin {path} introuvable pour sa suppression" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "Impossible d'ouvrir le fichier apk {path} pour analyse : " +msgstr "Impossible d'ouvrir le fichier APK {path} pour analyse : " #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" -msgstr "Impossible d'ouvrir le fichier apk pour analyse" +msgid "Could not open APK file for analysis" +msgstr "Impossible d'ouvrir le fichier APK pour analyse" #: ../fdroidserver/common.py #, python-brace-format @@ -819,12 +819,12 @@ msgstr "Échoument lors de la récupération de l'information manifest de l'APK" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "Impossible d'obtenir les informations de l'APK, suppression {path}" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "Échoument lors de la récupération des informations de l'APK, saut de {path}" #: ../fdroidserver/install.py @@ -1293,8 +1293,8 @@ msgstr "Aucun packet spécifier" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" -msgstr "Aucun apk signée dispognible pour %s" +msgid "No signed APK available for %s" +msgstr "Aucun APK signée dispognible pour %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" @@ -1671,7 +1671,7 @@ msgstr "Définir une timeout de {0} secondes pour cette construction" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "Installez un émulateur, installez l'APK dessus et effectuez un scan Drozer" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "Met en place un émulateur, y installe l’APK et réalise un scan drozer" #: ../fdroid ../fdroidserver/__main__.py @@ -2045,7 +2045,7 @@ msgstr "Utiliser le serveur de build" msgid "Use date from APK instead of current time for newly added APKs" msgstr "Utiliser la date de l'APK plutôt que la date courante pour les APKs nouvellement ajoutés" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "Utiliser la date de l'APK plutôt que la date courante pour les APKs nouvellement ajoutés" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py @@ -2810,7 +2810,7 @@ msgstr[1] "{} compilations réussies" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "Impossible de trouver un appid pour {path} !" -#~ msgid "Clean update - don't uses caches, reprocess all apks" +#~ msgid "Clean update - don't uses caches, reprocess all APKs" #~ msgstr "Mise à jour propre - n'utilise pas les caches, ré-exécute tous les APKs" #~ msgid "Interactively ask about things that need updating." diff --git a/locale/hi/LC_MESSAGES/fdroidserver.po b/locale/hi/LC_MESSAGES/fdroidserver.po index 7af81fa2..bdb077b8 100644 --- a/locale/hi/LC_MESSAGES/fdroidserver.po +++ b/locale/hi/LC_MESSAGES/fdroidserver.po @@ -440,7 +440,7 @@ msgstr "अनुप्रयोगों के अपडेट के लि #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -505,7 +505,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -781,12 +781,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1255,7 +1255,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1633,7 +1633,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2007,7 +2007,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index 057c35a3..0c0709e5 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -453,7 +453,7 @@ msgstr "Alkalmazásfrissítések keresése" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -518,7 +518,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -794,12 +794,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1268,7 +1268,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1646,7 +1646,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2020,7 +2020,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index b08c43c8..6250611c 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -443,7 +443,7 @@ msgstr "Periksa pembaruan pada aplikasi" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -508,7 +508,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -784,12 +784,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1258,7 +1258,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1635,7 +1635,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2009,7 +2009,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 7d141182..5f1dfe1f 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -460,8 +460,8 @@ msgstr "Cerca gli aggiornamenti delle applicazioni" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Controllando l'archiviazione per {appid} - apk:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Controllando l'archiviazione per {appid} - APK:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/dscanner.py msgid "Clean after all scans have finished" @@ -525,8 +525,8 @@ msgid "Could not open APK {path} for analysis: " msgstr "Impossibile aprire il file APK {path} per l'analisi: " #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" -msgstr "Impossibile aprire il file apk per l'analisi" +msgid "Could not open APK file for analysis" +msgstr "Impossibile aprire il file APK per l'analisi" #: ../fdroidserver/common.py #, python-brace-format @@ -805,13 +805,13 @@ msgstr "Impossibile ottenere informazioni del manifest dell’APK" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" -msgstr "Impossibile ottenere informazioni dell’apk, eliminando {path}" +msgid "Failed to get APK information, deleting {path}" +msgstr "Impossibile ottenere informazioni dell’APK, eliminando {path}" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" -msgstr "Impossibile ottenere informazioni dell’apk, saltando {path}" +msgid "Failed to get APK information, skipping {path}" +msgstr "Impossibile ottenere informazioni dell’APK, saltando {path}" #: ../fdroidserver/install.py #, python-brace-format @@ -1279,8 +1279,8 @@ msgstr "Nessun pacchetto specificato" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" -msgstr "Nessun apk firmato disponibile per %s" +msgid "No signed APK available for %s" +msgstr "Nessun APK firmato disponibile per %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" @@ -1657,7 +1657,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2031,7 +2031,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 28c62543..9715e16b 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -438,7 +438,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -503,7 +503,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -779,12 +779,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1253,7 +1253,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1630,7 +1630,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2004,7 +2004,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index 5e95c324..5248d5ec 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -442,7 +442,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -504,11 +504,11 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "Ur yezmir ara ad d-yeldi afaylu apk {path} i tesleḍt: " +msgstr "Ur yezmir ara ad d-yeldi afaylu APK {path} i tesleḍt: " #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" -msgstr "Ur yezmir ara a d-ildi afaylu apk i tesleḍt" +msgid "Could not open APK file for analysis" +msgstr "Ur yezmir ara a d-ildi afaylu APK i tesleḍt" #: ../fdroidserver/common.py #, python-brace-format @@ -783,12 +783,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1257,7 +1257,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1635,7 +1635,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2009,7 +2009,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index 290caa2c..858f63c0 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -450,7 +450,7 @@ msgstr "애플리케이션으로의 업데이트를 확인합니다" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -515,7 +515,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -791,12 +791,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1265,7 +1265,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1642,7 +1642,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2017,8 +2017,8 @@ msgstr "빌드 서버를 사용합니다" msgid "Use date from APK instead of current time for newly added APKs" msgstr "새로 추가된 APK를 위해 현재 시간 대신에 APK에서의 날짜를 사용합니다" -msgid "Use date from apk instead of current time for newly added apks" -msgstr "새로 추가된 apk를 위해 현재 시간 대신에 apk에서의 날짜를 사용합니다" +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "새로 추가된 APK를 위해 현재 시간 대신에 APK에서의 날짜를 사용합니다" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format diff --git a/locale/ml/LC_MESSAGES/fdroidserver.po b/locale/ml/LC_MESSAGES/fdroidserver.po index cd008715..2729a0bf 100644 --- a/locale/ml/LC_MESSAGES/fdroidserver.po +++ b/locale/ml/LC_MESSAGES/fdroidserver.po @@ -453,7 +453,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -518,7 +518,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -794,12 +794,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1268,7 +1268,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1646,7 +1646,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2020,7 +2020,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index 59c3b18d..efb419e2 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -459,7 +459,7 @@ msgstr "Se etter programoppdateringer" #: ../fdroidserver/update.py #, fuzzy, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Sjekker arkivering for {appid} - APK-er:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/dscanner.py @@ -527,7 +527,7 @@ msgstr "Kunne ikke åpne APK-fil for analyse" #: ../fdroidserver/update.py #, fuzzy -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "Kunne ikke åpne APK-fil for analyse" #: ../fdroidserver/common.py @@ -820,12 +820,12 @@ msgstr "Klarte ikke å hente APK-manifestinfo" #: ../fdroidserver/update.py #, fuzzy, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "Klarte ikke å hente APK-info, sletter {path}" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "Klarte ikke å hente APK-info, hopper over {path}" #: ../fdroidserver/install.py @@ -1312,7 +1312,7 @@ msgstr "Ingen pakker angitt" #: ../fdroidserver/install.py #, fuzzy, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "Ingen signert APK tilgjengelig for %s" #: ../fdroidserver/install.py @@ -1704,7 +1704,7 @@ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "Sett opp en emulator, installer APK-en på den og utfør en Drozer-skanning" #, fuzzy -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "Sett opp en emulator, installer APK-en på den og utfør en Drozer-skanning" #: ../fdroid ../fdroidserver/__main__.py @@ -2090,7 +2090,7 @@ msgstr "Bruk byggtjener" msgid "Use date from APK instead of current time for newly added APKs" msgstr "Bruk dato fra APK istedenfor nåværende tid for nylig tillagte APK-er." -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "Bruk dato fra APK istedenfor nåværende tid for nylig tillagte APK-er" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index b230ccdb..17555bae 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -441,7 +441,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -506,7 +506,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -782,12 +782,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1256,7 +1256,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1634,7 +1634,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2008,7 +2008,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 25309edc..f16a1724 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -457,8 +457,8 @@ msgstr "Sprawdź aktualizacje aplikacji" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Sprawdzanie archiwizacji dla {appid} - apks: {integer}, keepversions: {keep}, archapks: {arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Sprawdzanie archiwizacji dla {appid} - APKs: {integer}, keepversions: {keep}, archapks: {arch}" #: ../fdroidserver/dscanner.py msgid "Clean after all scans have finished" @@ -522,7 +522,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "Nie można otworzyć pliku APK {path} do analizy: " #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "Nie można otworzyć pliku APK do analizy" #: ../fdroidserver/common.py @@ -802,13 +802,13 @@ msgstr "Nie można uzyskać informacji o manifeście APK" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" -msgstr "Nie udało się uzyskać informacji o apk, usunięcie {path}" +msgid "Failed to get APK information, deleting {path}" +msgstr "Nie udało się uzyskać informacji o APK, usunięcie {path}" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" -msgstr "Nie udało się uzyskać informacji o apk, pomijając {path}" +msgid "Failed to get APK information, skipping {path}" +msgstr "Nie udało się uzyskać informacji o APK, pomijając {path}" #: ../fdroidserver/install.py #, python-brace-format @@ -1277,8 +1277,8 @@ msgstr "Nie określono pakietów" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" -msgstr "Żaden podpisany apk nie jest dostępny dla %s" +msgid "No signed APK available for %s" +msgstr "Żaden podpisany APK nie jest dostępny dla %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" @@ -1657,8 +1657,8 @@ msgstr "Ustawienie limitu czasu {0} w sek dla tej kompilacji" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "Skonfiguruj emulator, zainstaluj na nim plik APK i wykonaj skanowanie Drozera" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" -msgstr "Skonfiguruj emulator, zainstaluj na nim apk i wykonaj skanowanie drozer" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" +msgstr "Skonfiguruj emulator, zainstaluj na nim APK i wykonaj skanowanie drozer" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" @@ -2031,8 +2031,8 @@ msgstr "Użyj serwera kompilacji" msgid "Use date from APK instead of current time for newly added APKs" msgstr "Użyj daty z pliku APK zamiast aktualnego dla nowo dodanych pakietów APK" -msgid "Use date from apk instead of current time for newly added apks" -msgstr "Użyj daty z apk zamiast bieżącego czasu dla nowo dodanych plików apk" +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "Użyj daty z APK zamiast bieżącego czasu dla nowo dodanych plików APK" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index de4e6996..2dde805a 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -452,8 +452,8 @@ msgstr "Verificação de actualizações das aplicações" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Verificando o arquivamento para {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Verificando o arquivamento para {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/dscanner.py msgid "Clean after all scans have finished" @@ -517,8 +517,8 @@ msgid "Could not open APK {path} for analysis: " msgstr "Não foi possível abrir o APK {path} para análise: " #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" -msgstr "Não foi possível abrir ficheiro apk para análise" +msgid "Could not open APK file for analysis" +msgstr "Não foi possível abrir ficheiro APK para análise" #: ../fdroidserver/common.py #, python-brace-format @@ -797,13 +797,13 @@ msgstr "Falha ao obter informações de manifesto do APK" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" -msgstr "Falha ao obter informações do apk, apagando {path}" +msgid "Failed to get APK information, deleting {path}" +msgstr "Falha ao obter informações do APK, apagando {path}" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" -msgstr "Falha ao obter informações do apk, ignorando {path}" +msgid "Failed to get APK information, skipping {path}" +msgstr "Falha ao obter informações do APK, ignorando {path}" #: ../fdroidserver/install.py #, python-brace-format @@ -1271,8 +1271,8 @@ msgstr "Nenhum pacote especificado" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" -msgstr "Nenhum apk assinado disponível para %s" +msgid "No signed APK available for %s" +msgstr "Nenhum APK assinado disponível para %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" @@ -1649,8 +1649,8 @@ msgstr "Definindo o tempo limite de {0} seg para esta compilação" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "Configure um emulador, instale o APK nele e execute um scan do Drozer" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" -msgstr "Configure um emulador, instale o apk nele e execute um scan do drozer" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" +msgstr "Configure um emulador, instale o APK nele e execute um scan do drozer" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" @@ -2023,8 +2023,8 @@ msgstr "Usar servidor de compilação" msgid "Use date from APK instead of current time for newly added APKs" msgstr "Use da data do APK em vez do tempo atual para APKs recém-adicionados" -msgid "Use date from apk instead of current time for newly added apks" -msgstr "Use a data do apk em vez do tempo atual para apks recém-adicionados" +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "Use a data do APK em vez do tempo atual para APKs recém-adicionados" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 026b7c0a..71820f83 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -458,7 +458,7 @@ msgstr "Verifica se existem atualizações para os aplicativos" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Verificar o arquivamento de {appid} - APKs: {integer}, Versões Mantidas: {keep}, Arcos de APKs: {arch}" #: ../fdroidserver/dscanner.py @@ -523,7 +523,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "Impossível abrir o APK {path} para análise: " #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "Impossível abrir o arquivo de APK para analisá-lo" #: ../fdroidserver/common.py @@ -803,12 +803,12 @@ msgstr "Falha ao obter informações de manifesto do APK" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "Falha ao obter informações do APK, excluindo {path}" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "Falha ao obter informações do APK, ignorando {path}" #: ../fdroidserver/install.py @@ -1277,7 +1277,7 @@ msgstr "Nenhum pacote especificado" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "Não há APK assinado disponível para %s" #: ../fdroidserver/install.py @@ -1653,10 +1653,10 @@ msgstr "Definindo {0} segundos como tempo limite de para esta compilação" #: ../fdroidserver/build.py msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "Configurar um emulador, instalar o apk nele e escanear com o Drozer" +msgstr "Configurar um emulador, instalar o APK nele e escanear com o Drozer" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" -msgstr "Configurar um emulador, instalar o apk nele e escanear com o drozer" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" +msgstr "Configurar um emulador, instalar o APK nele e escanear com o drozer" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" @@ -2027,10 +2027,10 @@ msgstr "Usar servidor de compilação" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" -msgstr "Usar a data do apk ao invés do horário atual para APKs recentemente adicionados" +msgstr "Usar a data do APK ao invés do horário atual para APKs recentemente adicionados" -msgid "Use date from apk instead of current time for newly added apks" -msgstr "Usar a data do apk ao invés do horário atual para APKs recentemente adicionados" +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "Usar a data do APK ao invés do horário atual para APKs recentemente adicionados" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -2787,7 +2787,7 @@ msgstr[1] "{} compilações foram bem sucedidas" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "Não é possível encontrar um appid para {path} 1!" -#~ msgid "Clean update - don't uses caches, reprocess all apks" +#~ msgid "Clean update - don't uses caches, reprocess all APKs" #~ msgstr "Atualização limpa - não usa cache, reprocessa todos os APKs" #~ msgid "Interactively ask about things that need updating." diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index a38e3830..f66f4729 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -455,8 +455,8 @@ msgstr "Verificação de actualizações das aplicações" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Verificando o arquivamento para {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Verificando o arquivamento para {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/dscanner.py msgid "Clean after all scans have finished" @@ -520,8 +520,8 @@ msgid "Could not open APK {path} for analysis: " msgstr "Não foi possível abrir o APK {path} para análise: " #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" -msgstr "Não foi possível abrir ficheiro apk para análise" +msgid "Could not open APK file for analysis" +msgstr "Não foi possível abrir ficheiro APK para análise" #: ../fdroidserver/common.py #, python-brace-format @@ -800,13 +800,13 @@ msgstr "Falha ao obter informações de manifesto do APK" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" -msgstr "Falha ao obter informações do apk, apagando {path}" +msgid "Failed to get APK information, deleting {path}" +msgstr "Falha ao obter informações do APK, apagando {path}" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" -msgstr "Falha ao obter informações do apk, ignorando {path}" +msgid "Failed to get APK information, skipping {path}" +msgstr "Falha ao obter informações do APK, ignorando {path}" #: ../fdroidserver/install.py #, python-brace-format @@ -1274,8 +1274,8 @@ msgstr "Nenhum pacote especificado" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" -msgstr "Nenhum apk assinado disponível para %s" +msgid "No signed APK available for %s" +msgstr "Nenhum APK assinado disponível para %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" @@ -1652,8 +1652,8 @@ msgstr "Definindo o tempo limite de {0} seg para esta compilação" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "Configure um emulador, instale o APK nele e execute um scan do Drozer" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" -msgstr "Configure um emulador, instale o apk nele e execute um scan do drozer" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" +msgstr "Configure um emulador, instale o APK nele e execute um scan do drozer" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" @@ -2026,8 +2026,8 @@ msgstr "Usar servidor de compilação" msgid "Use date from APK instead of current time for newly added APKs" msgstr "Use da data do APK em vez do tempo atual para APKs recém-adicionados" -msgid "Use date from apk instead of current time for newly added apks" -msgstr "Use a data do apk em vez do tempo atual para apks recém-adicionados" +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "Use a data do APK em vez do tempo atual para APKs recém-adicionados" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 5249b971..b04b8ce2 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -442,7 +442,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -507,7 +507,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -783,12 +783,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1257,7 +1257,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1636,7 +1636,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2010,7 +2010,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index b008abed..dd200c4b 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -462,8 +462,8 @@ msgstr "Проверить обновления для приложений" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Проверка перед помещением в архив для {appid}. apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Проверка перед помещением в архив для {appid}. APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/dscanner.py msgid "Clean after all scans have finished" @@ -527,7 +527,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "Не удалось открыть и проанализировать файл APK {path}: " #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "Не удалось открыть и проанализировать файл APK" #: ../fdroidserver/common.py @@ -807,12 +807,12 @@ msgstr "Извлечь информацию из APK манифеста не п #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "Не удалось получить информацию об APK файле, {path} будет удален" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "Не удалось получить информацию об APK файле, {path} будет пропущен" #: ../fdroidserver/install.py @@ -1281,8 +1281,8 @@ msgstr "Не выбраны пакеты" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" -msgstr "Для %s нет подписанного apk" +msgid "No signed APK available for %s" +msgstr "Для %s нет подписанного APK" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" @@ -1660,7 +1660,7 @@ msgstr "Время ожидания для этой сборки выставл msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "Настроить эмулятор, установить в него APK и запустить сканирование Drozer" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "Настроить эмулятор, установить в него APK и запустить сканирование Drozer" #: ../fdroid ../fdroidserver/__main__.py @@ -2034,7 +2034,7 @@ msgstr "Использовать сервер сборки" msgid "Use date from APK instead of current time for newly added APKs" msgstr "Использовать время date из APK вместо текущего при добавлении новых APK" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "Использовать время date из APK вместо текущего при добавлении новых APK" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/sk/LC_MESSAGES/fdroidserver.po b/locale/sk/LC_MESSAGES/fdroidserver.po index 351f0d55..84159a73 100644 --- a/locale/sk/LC_MESSAGES/fdroidserver.po +++ b/locale/sk/LC_MESSAGES/fdroidserver.po @@ -441,7 +441,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -506,7 +506,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -782,12 +782,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1256,7 +1256,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1635,7 +1635,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2009,7 +2009,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index 159a2fee..ac92e7b2 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -453,8 +453,8 @@ msgstr "Kontrollo për përditësime aplikacionesh" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Po kontrollohet arkivimi përr {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Po kontrollohet arkivimi përr {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/dscanner.py msgid "Clean after all scans have finished" @@ -518,8 +518,8 @@ msgid "Could not open APK {path} for analysis: " msgstr "S’u hap dot kartela APK {path} për analizim : " #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" -msgstr "S’u hap dot kartela apk për analizim" +msgid "Could not open APK file for analysis" +msgstr "S’u hap dot kartela APK për analizim" #: ../fdroidserver/common.py #, python-brace-format @@ -798,13 +798,13 @@ msgstr "S’u arrit të merren të dhëna manifesti APK-je" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" -msgstr "S’u arrit të merren të dhëna apk-je, po fshihet {path}" +msgid "Failed to get APK information, deleting {path}" +msgstr "S’u arrit të merren të dhëna APK-je, po fshihet {path}" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" -msgstr "S’u arrit të merren të dhëna apk-je, po anashkalohet {path}" +msgid "Failed to get APK information, skipping {path}" +msgstr "S’u arrit të merren të dhëna APK-je, po anashkalohet {path}" #: ../fdroidserver/install.py #, python-brace-format @@ -1273,8 +1273,8 @@ msgstr "S’u specifikuan paketa" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" -msgstr "S’ka të gatshme apk të nënshkruara për %s" +msgid "No signed APK available for %s" +msgstr "S’ka të gatshme APK të nënshkruara për %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" @@ -1652,7 +1652,7 @@ msgstr "Po ujdiset mbarim kohe {0} sekonda për këtë montim" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "Ujdisni një emulues, instaloni në të APK-në dhe kryeni një skanim Drozer" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "Ujdisni një emulues, instaloni në të APK-në dhe kryeni një skanim Drozer" #: ../fdroid ../fdroidserver/__main__.py @@ -2027,7 +2027,7 @@ msgstr "Përdor shërbyes montimesh" msgid "Use date from APK instead of current time for newly added APKs" msgstr "Për APK-ra të shtuara rishtazi, përdor datë prej APK-je, në vend se kohën e tanishme" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "Për APK-ra të shtuara rishtazi, përdor datë prej APK-je, në vend se të kohës së tanishme" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index be362734..1c146baf 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -441,7 +441,7 @@ msgstr "Kontrollera efter uppdateringar av appar" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -506,7 +506,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -783,12 +783,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1257,7 +1257,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1635,7 +1635,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2009,7 +2009,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index 9df03a4c..009ff5b5 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -452,8 +452,8 @@ msgstr "Uygulama güncellemelerini denetle" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "{appid} için arşivleme denetleniyor - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "{appid} için arşivleme denetleniyor - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/dscanner.py msgid "Clean after all scans have finished" @@ -517,8 +517,8 @@ msgid "Could not open APK {path} for analysis: " msgstr "İnceleme için APK {path} açılamadı: " #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" -msgstr "İnceleme için apk dosyası açılamadı" +msgid "Could not open APK file for analysis" +msgstr "İnceleme için APK dosyası açılamadı" #: ../fdroidserver/common.py #, python-brace-format @@ -797,12 +797,12 @@ msgstr "APK bildirim bilgileri alınamadı" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "APK bilgisi alınamadı, {path} siliniyor" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "APK bilgisi alınamadı, {path} atlanıyor" #: ../fdroidserver/install.py @@ -1271,7 +1271,7 @@ msgstr "Belirtilen paket yok" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "%s için kullanılabilir imzalanmış APK yok" #: ../fdroidserver/install.py @@ -1649,7 +1649,7 @@ msgstr "Bu inşa için {0} sn zaman aşımı ayarlanıyor" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "Bir emülatör kur, APKyı ona kur ve bir Drozer taraması yap" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "Bir emülatör kur, APKyı ona kur ve bir Drozer taraması yap" #: ../fdroid ../fdroidserver/__main__.py @@ -2023,7 +2023,7 @@ msgstr "İnşa sunucusu kullan" msgid "Use date from APK instead of current time for newly added APKs" msgstr "Yeni eklenen APKlar için o anki zaman yerine APK'daki tarihi kullan" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "Yeni eklenen APKlar için o anki zaman yerine APK tarihini kullan" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py @@ -2784,7 +2784,7 @@ msgstr[1] "{} inşa başarılı" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "{path} için bir appid bulunamıyor!" -#~ msgid "Clean update - don't uses caches, reprocess all apks" +#~ msgid "Clean update - don't uses caches, reprocess all APKs" #~ msgstr "Temiz güncelleme - önbellekleri kullanmaz, tüm APKları yeniden işler" #~ msgid "Interactively ask about things that need updating." diff --git a/locale/tzm/LC_MESSAGES/fdroidserver.po b/locale/tzm/LC_MESSAGES/fdroidserver.po index 8e540e97..6708bd32 100644 --- a/locale/tzm/LC_MESSAGES/fdroidserver.po +++ b/locale/tzm/LC_MESSAGES/fdroidserver.po @@ -440,7 +440,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -505,7 +505,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -781,12 +781,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1255,7 +1255,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1633,7 +1633,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2007,7 +2007,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/ug/LC_MESSAGES/fdroidserver.po b/locale/ug/LC_MESSAGES/fdroidserver.po index e66090a9..6f601cd3 100644 --- a/locale/ug/LC_MESSAGES/fdroidserver.po +++ b/locale/ug/LC_MESSAGES/fdroidserver.po @@ -441,7 +441,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -506,7 +506,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -782,12 +782,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1256,7 +1256,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1634,7 +1634,7 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2008,7 +2008,7 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from apk instead of current time for newly added apks" +msgid "Use date from APK instead of current time for newly added APKs" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 6fdefb86..c17a734d 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -456,8 +456,8 @@ msgstr "Перевірте наявність оновлень для засто #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Перевірка архівації на {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Перевірка архівації на {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/dscanner.py msgid "Clean after all scans have finished" @@ -521,8 +521,8 @@ msgid "Could not open APK {path} for analysis: " msgstr "Не вдалося відкрити файл APK {path} для аналізу: " #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" -msgstr "Не вдалося відкрити файл apk для аналізу" +msgid "Could not open APK file for analysis" +msgstr "Не вдалося відкрити файл APK для аналізу" #: ../fdroidserver/common.py #, python-brace-format @@ -801,13 +801,13 @@ msgstr "Не вдалося отримати подробиці про APK" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" -msgstr "Не вдалося отримати подробиці про apk, {path} буде видалено" +msgid "Failed to get APK information, deleting {path}" +msgstr "Не вдалося отримати подробиці про APK, {path} буде видалено" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" -msgstr "Не вдалося отримати подробиці про apk, {path} буде пропущено" +msgid "Failed to get APK information, skipping {path}" +msgstr "Не вдалося отримати подробиці про APK, {path} буде пропущено" #: ../fdroidserver/install.py #, python-brace-format @@ -1275,8 +1275,8 @@ msgstr "Пакунків не вказано" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" -msgstr "Немає підписаних apk для %s" +msgid "No signed APK available for %s" +msgstr "Немає підписаних APK для %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" @@ -1654,8 +1654,8 @@ msgstr "Час очікування для цієї збірки станови msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "Налаштуйте емулятор, встановіть на нього APK та виконайте сканування з Drozer" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" -msgstr "Налаштуйте емулятор, встановіть apk на нього та виконайте drozer сканування" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" +msgstr "Налаштуйте емулятор, встановіть APK на нього та виконайте drozer сканування" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" @@ -2028,8 +2028,8 @@ msgstr "Використовуйте сервер створення" msgid "Use date from APK instead of current time for newly added APKs" msgstr "Використовуйте дату з APK замість поточного часу для нових доданих APK" -msgid "Use date from apk instead of current time for newly added apks" -msgstr "Використовуйте дату з apk, замість поточного часу для нових доданих apks" +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "Використовуйте дату з APK, замість поточного часу для нових доданих APKs" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -2794,8 +2794,8 @@ msgstr[2] "{} зібрано успішно" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "Не вдається знайти appid за шляхом {path}!" -#~ msgid "Clean update - don't uses caches, reprocess all apks" -#~ msgstr "Очистити оновлення - не використовує кеш, повторно обробляє всі apks" +#~ msgid "Clean update - don't uses caches, reprocess all APKs" +#~ msgstr "Очистити оновлення - не використовує кеш, повторно обробляє всі APKs" #~ msgid "Interactively ask about things that need updating." #~ msgstr "Інтерактивно запитайте про речі, які потребують оновлення." diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index e64dced1..c271db01 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -456,7 +456,7 @@ msgstr "检查应用更新" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/dscanner.py @@ -521,7 +521,7 @@ msgid "Could not open APK {path} for analysis: " msgstr "" #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" +msgid "Could not open APK file for analysis" msgstr "" #: ../fdroidserver/common.py @@ -797,12 +797,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" +msgid "Failed to get APK information, deleting {path}" msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" +msgid "Failed to get APK information, skipping {path}" msgstr "" #: ../fdroidserver/install.py @@ -1271,7 +1271,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" +msgid "No signed APK available for %s" msgstr "" #: ../fdroidserver/install.py @@ -1648,8 +1648,8 @@ msgstr "" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "设置一个模拟器,在其中安装APK并执行Drozer扫描" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" -msgstr "设置一个模拟器,然后在其中安装 apk 并执行 drozer 扫描" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" +msgstr "设置一个模拟器,然后在其中安装 APK 并执行 drozer 扫描" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" @@ -2020,10 +2020,10 @@ msgstr "使用编译服务器" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" -msgstr "对于新添加的 apk 文件,使用来自 apk 文件的时间,而非当前时间" +msgstr "对于新添加的 APK 文件,使用来自 APK 文件的时间,而非当前时间" -msgid "Use date from apk instead of current time for newly added apks" -msgstr "对于最新添加的 apk,使用来自 apk 的日期,而不是当前时间" +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "对于最新添加的 APK,使用来自 APK 的日期,而不是当前时间" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -2769,8 +2769,8 @@ msgstr[0] "" #~ msgid "Add gpg signatures for packages in repo" #~ msgstr "添加包 gpg 签名至资源库" -#~ msgid "Clean update - don't uses caches, reprocess all apks" -#~ msgstr "清除更新:不用缓存,重新处理全部 apk" +#~ msgid "Clean update - don't uses caches, reprocess all APKs" +#~ msgstr "清除更新:不用缓存,重新处理全部 APK" #~ msgid "Interactively ask about things that need updating." #~ msgstr "需更新事项的互动提示。" diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 5cf60dc5..586b2e54 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -452,8 +452,8 @@ msgstr "檢查應用程式更新" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "檢查 {appid} 的歸檔 - apks:{integer},keepversions:{keep},archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "檢查 {appid} 的歸檔 - APKs:{integer},keepversions:{keep},archapks:{arch}" #: ../fdroidserver/dscanner.py msgid "Clean after all scans have finished" @@ -519,8 +519,8 @@ msgid "Could not open APK {path} for analysis: " msgstr "無法開啟 APK 檔{path}案作分析 : " #: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" -msgstr "無法開啟 apk 檔案作分析" +msgid "Could not open APK file for analysis" +msgstr "無法開啟 APK 檔案作分析" #: ../fdroidserver/common.py #, python-brace-format @@ -800,13 +800,13 @@ msgstr "無法取得 APK 單號資訊" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, deleting {path}" -msgstr "無法取得 apk 資訊,刪除 {path}" +msgid "Failed to get APK information, deleting {path}" +msgstr "無法取得 APK 資訊,刪除 {path}" #: ../fdroidserver/update.py #, python-brace-format -msgid "Failed to get apk information, skipping {path}" -msgstr "無法取得 apk 資訊,略過 {path}" +msgid "Failed to get APK information, skipping {path}" +msgstr "無法取得 APK 資訊,略過 {path}" #: ../fdroidserver/install.py #, python-brace-format @@ -1278,8 +1278,8 @@ msgstr "未指定套件" #: ../fdroidserver/install.py #, python-format -msgid "No signed apk available for %s" -msgstr "%s 沒有已簽署的 apk" +msgid "No signed APK available for %s" +msgstr "%s 沒有已簽署的 APK" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" @@ -1379,7 +1379,7 @@ msgstr "選項" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." -msgstr "將 json 報告輸出到以 apk 命名的檔案。" +msgstr "將 json 報告輸出到以 APK 命名的檔案。" #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." @@ -1657,8 +1657,8 @@ msgstr "為此構建設定 {0} 秒後超時" msgid "Setup an emulator, install the APK on it and perform a Drozer scan" msgstr "設置一個模擬器,在其上安裝 APK 並執行 drozer 掃描" -msgid "Setup an emulator, install the apk on it and perform a drozer scan" -msgstr "設置一個模擬器,在其上安裝 apk 並執行 drozer 掃描" +msgid "Setup an emulator, install the APK on it and perform a drozer scan" +msgstr "設置一個模擬器,在其上安裝 APK 並執行 drozer 掃描" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" @@ -2035,8 +2035,8 @@ msgstr "使用構建伺服器" msgid "Use date from APK instead of current time for newly added APKs" msgstr "使用來自 APK 的日期,而不是新增之 APK 目前的時間" -msgid "Use date from apk instead of current time for newly added apks" -msgstr "新增的 apk 使用日期,來自 apk 而不是目前時間" +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "新增的 APK 使用日期,來自 APK 而不是目前時間" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -2791,8 +2791,8 @@ msgstr[0] "{} 編譯成功" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "找不到 {path} 的 appid!" -#~ msgid "Clean update - don't uses caches, reprocess all apks" -#~ msgstr "清除更新 - 不使用快取,重新處理全部的 apk" +#~ msgid "Clean update - don't uses caches, reprocess all APKs" +#~ msgstr "清除更新 - 不使用快取,重新處理全部的 APK" #~ msgid "Interactively ask about things that need updating." #~ msgstr "以對話方式詢問需要更新的內容。" From 3e7c55d91d233aea8c5f682ab0f57e93bb9d403e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 29 Jan 2021 15:29:23 +0100 Subject: [PATCH 0126/2116] purge all references to dscanner --- completion/bash-completion | 1 - locale/de/LC_MESSAGES/fdroidserver.po | 27 ------------------ locale/fdroidserver.pot | 40 +-------------------------- 3 files changed, 1 insertion(+), 67 deletions(-) diff --git a/completion/bash-completion b/completion/bash-completion index 751e5b24..17db9257 100644 --- a/completion/bash-completion +++ b/completion/bash-completion @@ -302,7 +302,6 @@ btlog \ build \ checkupdates \ deploy \ -dscanner \ gpgsign \ import \ init \ diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 2b1c6426..3dc287d1 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -464,18 +464,6 @@ msgstr "Auf Aktualisierungen für Anwendungen prüfen" #: ../fdroidserver/update.py #, python-brace-format - -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "Nach Abschluss aller Scans bereinigen" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "Vor Beginn der Scans bereinigen und Container neu erstellen" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" -msgstr "Alle Container bereinigen und danach beenden" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Archivierung auf {appid} überprüfen - APKs:{integer}, keepversions:{keep}, archapks:{arch}" @@ -1402,10 +1390,6 @@ msgstr "JSON ausgeben" msgid "Overall license of the project." msgstr "Gesamt-Lizenz des Projekts." -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "Pfad für die APK-Paketquelle überschreiben (Standard: ./repo)" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1444,13 +1428,6 @@ msgstr "Pfad zum Git-Repository, der zur Anmeldung verwendet werden soll" msgid "Path to the keystore for the repo signing key" msgstr "Pfad zum Schlüsselspeicher für den Repository-Signierschlüssel" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "Drozer auf einen Suchlauf vorbereiten" - -msgid "Prepare drozer to run a scan" -msgstr "Drozer auf einen Scan vorbereiten" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Drucken der geheimen Variable in das Terminal zum einfachen Kopieren/Einfügen" @@ -1607,10 +1584,6 @@ msgstr "Erster Durchlauf mit MD5-Prüfung abgeschaltet" msgid "Running wget in {path}" msgstr "Ausführen von wget in {path}" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "Nur die neueste Version jedes Programmpakets durchsuchen" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Scannen Sie die entstandene(n) APK(s) nach bekannten non-free-Klassen." diff --git a/locale/fdroidserver.pot b/locale/fdroidserver.pot index afad9c01..56269b63 100644 --- a/locale/fdroidserver.pot +++ b/locale/fdroidserver.pot @@ -444,18 +444,6 @@ msgstr "" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" -msgstr "" - #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" @@ -505,10 +493,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open apk file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -1371,10 +1355,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1413,13 +1393,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1576,10 +1549,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1630,13 +1599,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the apk on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "" @@ -2138,7 +2100,7 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py +#: ../fdroidserver/build.py #: ../fdroidserver/scanner.py ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" From 19e2ea8adf4ea0dedc9c0e5930155d5a8ca772e6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 29 Jan 2021 16:13:52 +0100 Subject: [PATCH 0127/2116] locale: remove duplicate strings as part of the update --- locale/Makefile | 9 +- locale/ang/LC_MESSAGES/fdroidserver.po | 98 ++++---------- locale/bn/LC_MESSAGES/fdroidserver.po | 98 ++++---------- locale/bo/LC_MESSAGES/fdroidserver.po | 137 +++++++++----------- locale/cs/LC_MESSAGES/fdroidserver.po | 101 +++++---------- locale/cy/LC_MESSAGES/fdroidserver.po | 105 +++++---------- locale/de/LC_MESSAGES/fdroidserver.po | 93 +++++++------ locale/el/LC_MESSAGES/fdroidserver.po | 98 ++++---------- locale/enm/LC_MESSAGES/fdroidserver.po | 98 ++++---------- locale/es/LC_MESSAGES/fdroidserver.po | 138 ++++++++++---------- locale/es_AR/LC_MESSAGES/fdroidserver.po | 129 ++++++++---------- locale/es_MX/LC_MESSAGES/fdroidserver.po | 112 ++++++---------- locale/eu/LC_MESSAGES/fdroidserver.po | 98 ++++---------- locale/fa/LC_MESSAGES/fdroidserver.po | 98 ++++---------- locale/fdroidserver.pot | 66 +++++----- locale/fi/LC_MESSAGES/fdroidserver.po | 98 ++++---------- locale/fr/LC_MESSAGES/fdroidserver.po | 138 ++++++++++---------- locale/hi/LC_MESSAGES/fdroidserver.po | 98 ++++---------- locale/hu/LC_MESSAGES/fdroidserver.po | 102 ++++----------- locale/id/LC_MESSAGES/fdroidserver.po | 102 ++++----------- locale/it/LC_MESSAGES/fdroidserver.po | 131 +++++++++---------- locale/ja/LC_MESSAGES/fdroidserver.po | 98 ++++---------- locale/kab/LC_MESSAGES/fdroidserver.po | 101 +++++---------- locale/ko/LC_MESSAGES/fdroidserver.po | 105 +++++---------- locale/ml/LC_MESSAGES/fdroidserver.po | 105 +++++---------- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 144 +++++++++------------ locale/nl/LC_MESSAGES/fdroidserver.po | 98 ++++---------- locale/pl/LC_MESSAGES/fdroidserver.po | 137 ++++++++++---------- locale/pt/LC_MESSAGES/fdroidserver.po | 137 ++++++++++---------- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 139 ++++++++++---------- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 137 ++++++++++---------- locale/ro/LC_MESSAGES/fdroidserver.po | 98 ++++---------- locale/ru/LC_MESSAGES/fdroidserver.po | 138 ++++++++++---------- locale/sk/LC_MESSAGES/fdroidserver.po | 98 ++++---------- locale/sq/LC_MESSAGES/fdroidserver.po | 139 ++++++++++---------- locale/sv/LC_MESSAGES/fdroidserver.po | 98 ++++---------- locale/tr/LC_MESSAGES/fdroidserver.po | 138 ++++++++++---------- locale/tzm/LC_MESSAGES/fdroidserver.po | 98 ++++---------- locale/ug/LC_MESSAGES/fdroidserver.po | 98 ++++---------- locale/uk/LC_MESSAGES/fdroidserver.po | 138 ++++++++++---------- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 135 +++++++++---------- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 137 +++++++++----------- 42 files changed, 1775 insertions(+), 2888 deletions(-) diff --git a/locale/Makefile b/locale/Makefile index d181db1d..0930f8d3 100644 --- a/locale/Makefile +++ b/locale/Makefile @@ -13,6 +13,8 @@ TEMPLATE = fdroidserver.pot VERSION = $(shell git describe) +OPTS = --no-wrap --sort-output --add-location=file + default: @printf "Build the translation files using: ./setup.py compile_catalog\n\n" @@ -32,15 +34,18 @@ clean: $(TEMPLATE): $(FILES) xgettext --join-existing --from-code=UTF-8 \ --language=Python --keyword=_ \ - --no-wrap --sort-output --add-location=file --output=$(TEMPLATE) \ + $(OPTS) --output=$(TEMPLATE) \ --package-name="fdroidserver" --package-version=$(VERSION) \ --foreign-user \ --msgid-bugs-address=https://gitlab.com/fdroid/fdroidserver/issues \ $(FILES) + msguniq $(OPTS) --use-first \ + --output-file=$(TEMPLATE) $(TEMPLATE) sed -i 's,CHARSET,UTF-8,' $(TEMPLATE) %.po: $(TEMPLATE) - msgmerge --no-wrap --sort-output --add-location=file --update $@ $(TEMPLATE) + msguniq $(OPTS) --use-first --output-file=$@ $@ + msgmerge $(OPTS) --update $@ $(TEMPLATE) %/LC_MESSAGES/fdroidserver.mo: %/LC_MESSAGES/fdroidserver.po msgfmt --check -o $@ $(@:mo=po) diff --git a/locale/ang/LC_MESSAGES/fdroidserver.po b/locale/ang/LC_MESSAGES/fdroidserver.po index bc53b111..25406480 100644 --- a/locale/ang/LC_MESSAGES/fdroidserver.po +++ b/locale/ang/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -49,6 +49,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -134,10 +138,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -146,26 +146,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -442,16 +430,9 @@ msgstr "" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -503,10 +484,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -774,10 +751,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -788,6 +761,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1298,10 +1275,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1369,10 +1342,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1411,13 +1380,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1574,10 +1536,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1628,13 +1586,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "" @@ -1764,6 +1715,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1773,10 +1728,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2006,9 +1957,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2136,8 +2084,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2496,6 +2444,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2699,6 +2652,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index 870a15bf..e8ae283b 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-15 13:25+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali \n" @@ -50,6 +50,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -135,10 +139,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -147,26 +147,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -443,16 +431,9 @@ msgstr "" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -504,10 +485,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -775,10 +752,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -789,6 +762,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1299,10 +1276,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1370,10 +1343,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1412,13 +1381,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1575,10 +1537,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1629,13 +1587,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "" @@ -1765,6 +1716,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1774,10 +1729,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2007,9 +1958,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2137,8 +2085,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2497,6 +2445,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2700,6 +2653,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index 10619f4f..af8d077a 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-14 14:58+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tibetan \n" @@ -57,6 +57,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" འདི་དང་མཐུན་པའི་རྒྱབ་ལྗོངས་ཡིག་ཆ་མིན་འདུག!" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, fuzzy, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -141,11 +145,6 @@ msgstr "%sགདམ་ཀ་ནུས་མེད་རེད་འདུག" msgid "'keypass' not found in config.yml!" msgstr "'keypass' འདི་config.yml ནང་རྙེད་མ་སོང་།!" -#: ../fdroidserver/common.py -#, fuzzy -msgid "'keypass' not found in config.yml!" -msgstr "'keypass' འདི་config.yml ནང་རྙེད་མ་སོང་།!" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -154,29 +153,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "'keystore' འདི་ config.yml ནང་རྙེད་མ་སོང་།!" -#: ../fdroidserver/common.py -#, fuzzy -msgid "'keystore' not found in config.yml!" -msgstr "'keystore' འདི་ config.yml ནང་རྙེད་མ་སོང་།!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' འདི་ config.yml ནང་རྙེད་མ་སོང་།!" -#: ../fdroidserver/common.py -#, fuzzy -msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' འདི་ config.yml ནང་རྙེད་མ་སོང་།!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' འདི་ config.yml ནང་རྙེད་མ་སོང་།!" -#: ../fdroidserver/common.py -#, fuzzy -msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' འདི་ config.yml ནང་རྙེད་མ་སོང་།!" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -455,17 +439,10 @@ msgstr "མཉེན་ཆས་རྣམས་གསར་བསྒྱུར་ msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "མཛོད་ཁང་ཚོད་ལྟའི་ཆེད་དུ།{appid} - APKs:{integer},ཐོན་རིམ་ཉར་ཚགས།:{keep},archapks:{arch}" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "ཆ་ཚང་འཚག་རྒྱབ་ཚར་བའི་རྗེས་སུ་གཙང་མ་བཟོས།" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "འཚག་རྒྱབ་འགོ་མ་བཙུགས་གོང་ལ་གཙང་མ་དང་སྣོད་དེ་སྐྱར་དུ་བཟོས།" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" -msgstr "སྣོད་ཆ་ཚང་གཙང་མ་བཟོས་ནས་ཕྱིར་ཐོན།" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "མཛོད་ཁང་ཚོད་ལྟའི་ཆེད་དུ།{appid} - APKs:{integer},ཐོན་རིམ་ཉར་ཚགས།:{keep},archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -518,10 +495,6 @@ msgstr "{path}མེད་པ་བཟོས་པ་ལ་རྙེད་མ་ msgid "Could not open APK {path} for analysis: " msgstr "དཔྱད་ཞིབ་ཀྱི་ཆེད་དུ་APK ཡིག་ཆ་ཁ་ཕྱེས་ཐུབ་ཀྱི་མིན་འདུག" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "དཔྱད་ཞིབ་ཀྱི་ཆེད་དུ་APK ཡིག་ཆ་ཁ་ཕྱེས་ཐུབ་ཀྱི་མིན་འདུག" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -792,10 +765,6 @@ msgstr "མཉེན་ཆས་ཡོད་རྣམས་ཕྱོགས་ས msgid "Failed to create S3 bucket: {url}" msgstr "S3 དྲྭ་སྣོད་བཟོས་ཐུབ་མ་སོང་། :{url}" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "APKནང་གསལ་བའི་གནས་ཚུལ་རྣམས་ལེན་ཐུབ་མ་སོང་།" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -806,6 +775,10 @@ msgstr "APK གནས་ཚུལ་རག་གི་མིན་འདུག { msgid "Failed to get APK information, skipping {path}" msgstr "APK གནས་ཚུལ་རག་གི་མིན་འདུག {path}མཆོང་།" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "APKནང་གསལ་བའི་གནས་ཚུལ་རྣམས་ལེན་ཐུབ་མ་སོང་།" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1322,11 +1295,6 @@ msgstr "{appid} ཆེད་དུ་བྱ་རྒྱུ་གང་ཡང་ msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -#, fuzzy -msgid "Now set these in config.yml:" -msgstr "'sdk_path' འདི་ 'config.yml' ནང་སྒྲིག་ཐུབ་མ་སོང་།!" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1395,10 +1363,6 @@ msgstr "" msgid "Overall license of the project." msgstr "ལས་འཆར་འདིའི་ཁྱོན་ཡོངས་ཀྱི་ཆོག་མཆན་ལག་ཁྱེར།." -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "རེ་པོ་APKs ལམ་གྱི་སྒང་ལ་སྐྱར་སྣོན། (སོར་བཞག་: ./repo)" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1437,13 +1401,6 @@ msgstr "གིཊ་རེ་པོའི་ཆེད་དུ་བདེ་ས msgid "Path to the keystore for the repo signing key" msgstr "རེ་པོ་མིང་རྟགས་བཀོད་པའི་ལྡེ་མིག་ཆེད་དུ་སྟོན་པའི་ལྡེ་མིག་གསོག་ཉར་ཁང་གི་ལམ།" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "འཚག་རྒྱབ་འཁོར་སྐྱོད་ཐུབ་པའི་ཆེད་དུ་ཌོ་ཛར་གྲ་སྒྲིག་བྱེད།" - -msgid "Prepare drozer to run a scan" -msgstr "འཚག་རྒྱབ་འཁོར་སྐྱོད་ཐུབ་པའི་ཆེད་དུ་ཌོ་ཛར་གྲ་སྒྲིག་བྱེད།" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "ས་ཚིགས་ཀྱི་གསང་ཁྱབ་ངོ་བཤུས་དང་/སྦྱར་བ་སྟབས་བདེ་ཡོང་བའི་ཆེད་དུ་འདྲ་བཤུས་" @@ -1600,10 +1557,6 @@ msgstr "MD5 ཚོད་ལྟ་བེད་སྤྱོད་མེད་པ msgid "Running wget in {path}" msgstr "སྐྱར་བྲིས་ཡོད་།{path}" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "ཐུམ་སྒྲིལ་རེ་རེ་བའི་ཐོན་རིམ་གསར་ཤོས་གཅིག་པུ་འཚག་རྒྱབ།" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1653,13 +1606,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "གློག་ཀླད་ལད་མོ་མཁན་ཞིག་སྒྲིག འདིའི་སྒང་ལ་ APK ནང་འགྲིག་བཅུག་བྱེད་དུ་བཅུག་ནས་ཌོ་ཛར་འཚག་རྒྱབ་འགོ་བཙུགས་བྱེད།" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "གློག་ཀླད་ལད་མོ་མཁན་ཞིག་སྒྲིག འདིའི་སྒང་ལ་APK ནང་འགྲིག་བཅུག་བྱེད་དུ་བཅུག་ནས་ཌོ་ཛར་འཚག་རྒྱབ་འགོ་བཙུགས་བྱེད།" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "མིང་རྟགས་བཀོད་ནས་ཐུམ་སྒྲིལ་རྣམས་རེ་པོ་ནང་བཞག" @@ -1789,6 +1735,10 @@ msgstr "ལྡེ་མིག་གཞན་ལ་སྐྱོན་ཆ་འད msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1798,11 +1748,6 @@ msgstr "རེ་པོ་འདི་ལ་སྔོན་ཚོད་ནས་ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "awsbucket, awssecretkey དང་། awsaccesskeyid བེད་སྤྱོད་བྱེད་པའི་ཆེད་དུ་ config.yml ནང་དུ་ངེས་པར་དུ་སྒྲིག་དགོས།!" -#: ../fdroidserver/deploy.py -#, fuzzy -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "awsbucket, awssecretkey དང་། awsaccesskeyid བེད་སྤྱོད་བྱེད་པའི་ཆེད་དུ་ config.yml ནང་དུ་ངེས་པར་དུ་སྒྲིག་དགོས།!" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2035,9 +1980,6 @@ msgstr "ཐོན་སྐྱེད་ཞབས་ཞུ་འཕྲུལ་ཆ msgid "Use date from APK instead of current time for newly added APKs" msgstr "APK རང་གི་ཚེས་གྲངས་དེ་བེད་སྤྱོད་བྱས་པ་ལས་ཁ་སྣོན་བྱས་པའི་ APKs གསར་པའི་དུས་ཚོས་བེད་སྤྱོད་མ་བྱེད།" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "APK རང་གི་ཚེས་གྲངས་དེ་བེད་སྤྱོད་བྱས་པ་ལས་ཁ་སྣོན་བྱས་པའི་APK གསར་པའི་དུས་ཚོས་བེད་སྤྱོད་མ་བྱེད།" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2167,8 +2109,8 @@ msgstr "མཉེས་ཆས་ཁ་བྱང་རྒྱུད་གསར་ #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "མཉེན་ཆས་ཀྱི་ངོ་བོ་དང་མཉམ་དུ་གདམ་ཀ་ཅན་གྱི་ཐོན་རིམ་ཨང་རྟགས་APPID[:VERCODE]" @@ -2529,6 +2471,11 @@ msgstr "བདེ་ཆགས་མེད་པའི་HTTPMམཐུད་ཀ msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "བེད་ཆགས་མེད་པའི་དྲྭ་རྒྱའི་ཁ་བྱང་http ནས་ཕབ་ལེན་བཀག། (use https or specify --no-https-check): {apkfilename}" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2731,6 +2678,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\" མིན་འདུག! config.ymlནོར་བཅོས་བྱེད།." +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "{name} \"{path}\" མིན་འདུག! config.ymlནོར་བཅོས་བྱེད།." + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" @@ -2791,12 +2743,39 @@ msgstr[0] "{} བཟོ་སྐྲུན་ལེགས་སྒྲུབ།" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "{path}!གྱི་ཆེད་དུ་ཐུམ་སྒྲིལ་གྱི་མིང་རྙེད་མ་སོང་།" -#~ msgid "Clean update - don't uses caches, reprocess all APKs" -#~ msgstr "གསར་བསྒྱུར་གཙང་བཟོ།-ཡིག་ཆ་གསོག་ཉར་བེད་སྤྱོ་མ་བྱེད། APKs ཚང་མ་སྐྱར་སྤྱོད་བྱེད།" +#~ msgid "Clean after all scans have finished" +#~ msgstr "ཆ་ཚང་འཚག་རྒྱབ་ཚར་བའི་རྗེས་སུ་གཙང་མ་བཟོས།" + +#~ msgid "Clean before the scans start and rebuild the container" +#~ msgstr "འཚག་རྒྱབ་འགོ་མ་བཙུགས་གོང་ལ་གཙང་མ་དང་སྣོད་དེ་སྐྱར་དུ་བཟོས།" + +#~ msgid "Clean up all containers and then exit" +#~ msgstr "སྣོད་ཆ་ཚང་གཙང་མ་བཟོས་ནས་ཕྱིར་ཐོན།" + +#~ msgid "Could not open APK file for analysis" +#~ msgstr "དཔྱད་ཞིབ་ཀྱི་ཆེད་དུ་APK ཡིག་ཆ་ཁ་ཕྱེས་ཐུབ་ཀྱི་མིན་འདུག" #~ msgid "Interactively ask about things that need updating." #~ msgstr "གསར་བསྒྱུར་བྱེད་དགོས་པའི་རིགས་ལ་སྦས་གསང་མེད་པའི་ཐོག་ནས་གསུངས་རོགས།." +#~ msgid "Override path for repo APKs (default: ./repo)" +#~ msgstr "རེ་པོ་APKs ལམ་གྱི་སྒང་ལ་སྐྱར་སྣོན། (སོར་བཞག་: ./repo)" + +#~ msgid "Prepare Drozer to run a scan" +#~ msgstr "འཚག་རྒྱབ་འཁོར་སྐྱོད་ཐུབ་པའི་ཆེད་དུ་ཌོ་ཛར་གྲ་སྒྲིག་བྱེད།" + +#~ msgid "Prepare drozer to run a scan" +#~ msgstr "འཚག་རྒྱབ་འཁོར་སྐྱོད་ཐུབ་པའི་ཆེད་དུ་ཌོ་ཛར་གྲ་སྒྲིག་བྱེད།" + +#~ msgid "Scan only the latest version of each package" +#~ msgstr "ཐུམ་སྒྲིལ་རེ་རེ་བའི་ཐོན་རིམ་གསར་ཤོས་གཅིག་པུ་འཚག་རྒྱབ།" + +#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +#~ msgstr "གློག་ཀླད་ལད་མོ་མཁན་ཞིག་སྒྲིག འདིའི་སྒང་ལ་ APK ནང་འགྲིག་བཅུག་བྱེད་དུ་བཅུག་ནས་ཌོ་ཛར་འཚག་རྒྱབ་འགོ་བཙུགས་བྱེད།" + +#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" +#~ msgstr "གློག་ཀླད་ལད་མོ་མཁན་ཞིག་སྒྲིག འདིའི་སྒང་ལ་APK ནང་འགྲིག་བཅུག་བྱེད་དུ་བཅུག་ནས་ཌོ་ཛར་འཚག་རྒྱབ་འགོ་བཙུགས་བྱེད།" + #~ msgid "Specify editor to use in interactive mode. Default " #~ msgstr "སྒྲིག་བཀོད་པར་དམིགས་སྟོན་བྱས་ནས་ལན་འདེབས་ཀྱི་ཚུལ་འདི་བེད་སྤྱོད་བྱེད་ སོར་བཞག " diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 20792d3d..eb3b24b4 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2019-02-01 13:33+0000\n" "Last-Translator: Michal Čihař \n" "Language-Team: Czech \n" @@ -51,6 +51,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -137,10 +141,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -149,26 +149,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -446,16 +434,9 @@ msgstr "" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "Po dokončení všech skenů vyčistit" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -507,10 +488,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -779,10 +756,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -793,6 +766,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1303,10 +1280,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1374,10 +1347,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1416,13 +1385,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1579,10 +1541,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1634,13 +1592,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "" @@ -1770,6 +1721,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1779,10 +1734,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2012,9 +1963,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2142,8 +2090,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2504,6 +2452,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2708,6 +2661,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" @@ -2761,3 +2719,6 @@ msgid_plural "{} builds succeeded" msgstr[0] "" msgstr[1] "" msgstr[2] "" + +#~ msgid "Clean after all scans have finished" +#~ msgstr "Po dokončení všech skenů vyčistit" diff --git a/locale/cy/LC_MESSAGES/fdroidserver.po b/locale/cy/LC_MESSAGES/fdroidserver.po index 087bf343..821a6bd2 100644 --- a/locale/cy/LC_MESSAGES/fdroidserver.po +++ b/locale/cy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-16 21:23+0000\n" "Last-Translator: Aled Powell \n" "Language-Team: Welsh \n" @@ -56,6 +56,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -145,10 +149,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -157,26 +157,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -457,16 +445,9 @@ msgstr "Gwirio am ddiweddariadau i apiau" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -518,10 +499,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -789,10 +766,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -803,6 +776,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1313,10 +1290,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1384,10 +1357,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1426,13 +1395,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1589,10 +1551,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1647,13 +1605,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Llofnodi a gosod pecynnau yn yr ystorfa" @@ -1783,6 +1734,17 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +#, fuzzy +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" +"\n" +" Mae hon yn ystorfa o apiau i'w defnyddio gydag F-Droid. Mae apiau yn\n" +" yr ystorfa hon naill ai wedi eu hadeiladu gan ddatblygwyr yr ap\n" +" gwreiddiol, neu wedi eu hadeiladu o'u ffynonellau gan f-droid.org\n" +" wrth ddefnyddio'r offer ar https://gitlab.com/F-Droid.\n" +" " + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1792,10 +1754,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2025,9 +1983,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2155,8 +2110,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2523,6 +2478,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2730,6 +2690,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 3dc287d1..19c9c96a 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-29 13:54+0100\n" "Last-Translator: TobiGr \n" "Language-Team: German \n" @@ -74,6 +74,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" besitzt keine zugehörige Metadaten-Datei!" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -159,10 +163,6 @@ msgstr "Option %s verfügt über keinen Wert" msgid "'keypass' not found in config.yml!" msgstr "„keypass” nicht in config.yml vorhanden!" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "„keypass” nicht in config.yml vorhanden!" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' ist NONE und 'smartcardoptions' ist leer!" @@ -171,26 +171,14 @@ msgstr "'keystore' ist NONE und 'smartcardoptions' ist leer!" msgid "'keystore' not found in config.yml!" msgstr "„keystore” nicht in config.yml vorhanden!" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "„keystore” nicht in config.yml vorhanden!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "„keystorepass” nicht in config.yml vorhanden!" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "„keystorepass” nicht in config.yml vorhanden!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "„repo_keyalias” nicht in config.yml vorhanden!" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "„repo_keyalias” nicht in config.yml vorhanden!" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -467,6 +455,11 @@ msgstr "Auf Aktualisierungen für Anwendungen prüfen" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Archivierung auf {appid} überprüfen - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Archivierung auf {appid} überprüfen - APKs:{integer}, keepversions:{keep}, archapks:{arch}" + #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Sauber aktualisieren - ohne Verwendung der Zwischenspeicher, alle APKs wiederaufbereiten" @@ -516,10 +509,6 @@ msgstr "{path} konnte nicht gefunden werden, um ihn zu entfernen" msgid "Could not open APK {path} for analysis: " msgstr "Konnte APK-Datei {path} nicht für Analyse öffnen " -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "Konnte APK-Datei nicht für Analyse öffnen" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -792,10 +781,6 @@ msgstr "Anwendung konnte nicht angepasst werden" msgid "Failed to create S3 bucket: {url}" msgstr "S3-Bucket konnte nicht erstellt werden: {url}" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "Abrufen der APK-Manifest-Informationen fehlgeschlagen" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -806,6 +791,10 @@ msgstr "Abrufen der APK-Informationen fehlgeschlagen, {path} wird gelöscht" msgid "Failed to get APK information, skipping {path}" msgstr "Abrufen der APK-Informationen fehlgeschlagen, {path} wird übersprungen" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "Abrufen der APK-Manifest-Informationen fehlgeschlagen" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1318,10 +1307,6 @@ msgstr "Keine zu erledigenden Aufgaben für {appid}." msgid "Now set these in config.yml:" msgstr "Legen Sie diese nun in der config.yml fest:" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "Legen Sie diese nun in der config.yml fest:" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1634,13 +1619,6 @@ msgstr "Das Setzen des Limits für geöffnete Dateien ist fehlgeschlagen: " msgid "Setting {0} sec timeout for this build" msgstr "Stelle einen {0} Sek timeout für diesen Build ein" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "Einen Emulator einrichten, die APK installieren und mit ihm eine Sicherheitsprüfung (Drozer scan) durchführen" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "Einen Emulator einrichten, die APK installieren und mit ihm eine Sicherheitsprüfung (Drozer scan) durchführen" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Programmpakete in Paketquelle signieren und einstellen" @@ -1770,6 +1748,18 @@ msgstr "Es gibt eine Keyalias-Kollision - Veröffentlichung gestoppt" msgid "These are the apps that have been archived from the main repo." msgstr "Dies sind die Apps, die aus dem Hauptrepository archiviert wurden." +#: ../fdroidserver/common.py +#, fuzzy +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" +"\n" +" Dies ist eine Paketquelle für Anwendungen, die für die Benutzung\n" +" zusammen mit F-Droid gedacht ist. Die darin enthaltenen\n" +" Anwendungen sind entweder offizielle von den Entwicklern erstellte\n" +" Binärdateien oder werden von f-droid.org mithilfe des Werkzeugs auf\n" +" https://gitlab.com/fdroid aus dem Quellcode erstellt.\n" +" " + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1779,10 +1769,6 @@ msgstr "Dieses Repo hat bereits lokale Metadaten: %s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Um awsbucket zu benutzen, müssen awssecretkey und awsaccesskeyid auch in der config.yml gesetzt sein!" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Um awsbucket zu benutzen, müssen awssecretkey und awsaccesskeyid auch in der config.yml gesetzt sein!" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "Die URL muss mit https:// oder http:// beginnen" @@ -2015,9 +2001,6 @@ msgstr "Build-Server verwenden" msgid "Use date from APK instead of current time for newly added APKs" msgstr "APK-Datum statt der aktuellen Zeit für neu hinzugefügte APKs verwenden" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "APK-Datum statt der aktuellen Zeit für neu hinzugefügte APKs verwenden" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2147,8 +2130,8 @@ msgstr "App-ID, um auf Aktualisierungen zu prüfen" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "App-ID mit optionalem Versionscode in der Form APPID[:VERCODE]" @@ -2508,6 +2491,11 @@ msgstr "Download über ungesicherte HTTP-Verbindung verweigert (verwenden Sie HT msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "Download über ungesicherte HTTP-Verbindung verweigert (verwenden Sie HTTPS oder geben Sie --no-https-check an): {apkfilename}" +#: ../fdroidserver/index.py +#, fuzzy, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "repo_icon %s existiert nicht, erzeuge Platzhalter." + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2711,6 +2699,11 @@ msgstr "{file} ist leer oder beschädigt!" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\" existiert nicht! Korrigieren Sie es in der config.yml." +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "{name} \"{path}\" existiert nicht! Korrigieren Sie es in der config.yml." + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" @@ -2776,12 +2769,18 @@ msgstr[1] "Buildvorgänge erfolgreich" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "AppID für {path} konnte nicht gefunden werden!" -#~ msgid "Clean update - don't uses caches, reprocess all APKs" -#~ msgstr "Sauber - ohne Verwendung der Zwischenspeicher - aktualisieren, alle APKs wiederaufbereiten" +#~ msgid "Could not open APK file for analysis" +#~ msgstr "Konnte APK-Datei nicht für Analyse öffnen" #~ msgid "Interactively ask about things that need updating." #~ msgstr "Angelegenheiten, die Aktualisierungen erfordern, interaktiv abfragen." +#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +#~ msgstr "Einen Emulator einrichten, die APK installieren und mit ihm eine Sicherheitsprüfung (Drozer scan) durchführen" + +#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" +#~ msgstr "Einen Emulator einrichten, die APK installieren und mit ihm eine Sicherheitsprüfung (Drozer scan) durchführen" + #~ msgid "Specify editor to use in interactive mode. Default " #~ msgstr "Editor festlegen, der im interaktiven Modus verwendet werden soll. Standard " diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index 1d609971..9280945a 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-04 15:47+0000\n" "Last-Translator: fresh \n" "Language-Team: Greek \n" @@ -51,6 +51,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -136,10 +140,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -148,26 +148,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -444,16 +432,9 @@ msgstr "Έλεγχος για ενημερώσεις εφαρμογών" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -505,10 +486,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -776,10 +753,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -790,6 +763,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1300,10 +1277,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1371,10 +1344,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1413,13 +1382,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1576,10 +1538,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1630,13 +1588,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "" @@ -1766,6 +1717,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1775,10 +1730,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2008,9 +1959,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2138,8 +2086,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2498,6 +2446,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2701,6 +2654,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" diff --git a/locale/enm/LC_MESSAGES/fdroidserver.po b/locale/enm/LC_MESSAGES/fdroidserver.po index 6f9ff53c..1bf4e711 100644 --- a/locale/enm/LC_MESSAGES/fdroidserver.po +++ b/locale/enm/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -49,6 +49,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -134,10 +138,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -146,26 +146,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -442,16 +430,9 @@ msgstr "" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -503,10 +484,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -774,10 +751,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -788,6 +761,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1298,10 +1275,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1369,10 +1342,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1411,13 +1380,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1574,10 +1536,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1628,13 +1586,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "" @@ -1764,6 +1715,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1773,10 +1728,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2006,9 +1957,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2136,8 +2084,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2496,6 +2444,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2699,6 +2652,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index f91edffd..cb4c1eb4 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-28 22:09+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Spanish \n" @@ -69,6 +69,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "¡\"%s/\" no tiene su correspondiente fichero de metadatos!" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -154,10 +158,6 @@ msgstr "la opción %s no toma un valor" msgid "'keypass' not found in config.yml!" msgstr "¡'keypass' no encontrado en config.yml!" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "¡'keypass' no encontrado en config.yml!" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "¡\"keystore\" es NONE y \"smartcardoptions\" está vacío!" @@ -166,26 +166,14 @@ msgstr "¡\"keystore\" es NONE y \"smartcardoptions\" está vacío!" msgid "'keystore' not found in config.yml!" msgstr "¡'keystore' no encontrado en config.yml!" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "¡'keystore' no encontrado en config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "¡'keystorepass' no encontrado en config.yml!" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "¡'keystorepass' no encontrado en config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "¡'repo_keyalias' no encontrado en config.yml!" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "¡'repo_keyalias' no encontrado en config.yml!" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -462,17 +450,10 @@ msgstr "Buscar actualizaciones de aplicaciones" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Comprobando la operación de archivo para {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "Limpiar después de que todos los análisis hayan finalizado" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "Limpiar antes de que los análisis inicien y reconstruir el contenedor" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" -msgstr "Limpiar todos los contenedores y luego salir" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Comprobando la operación de archivo para {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -523,10 +504,6 @@ msgstr "No se pudo encontrar {path} para eliminarlo" msgid "Could not open APK {path} for analysis: " msgstr "No se pudo abrir el archivo APK {path} para analizarlo: " -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "No se ha podido abrir el archivo APK para analizarlo" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -798,10 +775,6 @@ msgstr "Fallo al alinear aplicación" msgid "Failed to create S3 bucket: {url}" msgstr "Fallo al crear bucket S3 : {url}" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "Fallo al obtener la información de manifiesto APK" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -812,6 +785,10 @@ msgstr "Fallo al obtener la información de APK, borrando {path}" msgid "Failed to get APK information, skipping {path}" msgstr "Fallo al obtener la información de APK, omitiendo {path}" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "Fallo al obtener la información de manifiesto APK" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1322,10 +1299,6 @@ msgstr "Nada que hacer para {appid}." msgid "Now set these in config.yml:" msgstr "Ahora establezca lo siguiente en config.yml:" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "Ahora establezcalos en config.yml:" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1393,10 +1366,6 @@ msgstr "Sacando JSON" msgid "Overall license of the project." msgstr "Licencia general del proyecto." -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "Ruta de remplazo par el repositorio de APK (default: ./repo)" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1435,13 +1404,6 @@ msgstr "Ruta de acceso al reporte git para usarlo como registro" msgid "Path to the keystore for the repo signing key" msgstr "Ruta al depósito de claves para la clave de firma de repositorio" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "Preparar \"Drozer\" para ejecutar un análisis" - -msgid "Prepare drozer to run a scan" -msgstr "Preparar \"Drozer\" para ejecutar un análisis" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Mostrar la variable secreta en el terminal para copiar/pegar fácilmente" @@ -1598,10 +1560,6 @@ msgstr "Ejecutando la primera iteración con la comprobación de MD5 deshabilita msgid "Running wget in {path}" msgstr "Ejecutando wget en {path}" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "Escanear solo la última versión de cada paquete" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Escaneando los APK(s) resultantes en busca de clases no libres conocidas." @@ -1652,13 +1610,6 @@ msgstr "Configuración fallida de límite de apertura de archivo: " msgid "Setting {0} sec timeout for this build" msgstr "Estableciendo un máximo de {0} segundos para esta compilación" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "Establecer un emulador, instalar la APK en el y realizar un escaneo con \"Drozer\"" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "Configurar un emulador, instalar la aplicación APK en él y realizar una \"Drozer\" scan" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Firmar y colocar paquetes en el repositorio" @@ -1788,6 +1739,17 @@ msgstr "Hay una colisión de keyalias - publicación detenida" msgid "These are the apps that have been archived from the main repo." msgstr "Estas son aplicaciones del repositorio principal que se han archivado." +#: ../fdroidserver/common.py +#, fuzzy +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" +"\n" +" Este es un repositorio de aplicaciones para usar con FDroid. Las aplicaciones en este\n" +" repositorio son binarios oficiales construidos por los desarrolladores originales de la \n" +" aplicación, o son binarios creados a partir de su código fuente por f-droid.org \n" +" utilizando las herramientas de https://gitlab.com/fdroid.\n" +" " + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1797,10 +1759,6 @@ msgstr "Este repo ya tiene metadatos locales: %s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "¡Para usar awsbucket hay que configurar también awssecretkey y awsaccesskeyid en config.yml!" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "¡Para usar awsbucket hay que configurar también awssecretkey y awsaccesskeyid en config.yml!" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "La URL debe comenzar con https:// o http://" @@ -2030,9 +1988,6 @@ msgstr "Use un servidor de compilación" msgid "Use date from APK instead of current time for newly added APKs" msgstr "Use la fecha del APK en vez de la fecha actual para los nuevos APK añadidos" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "Use la fecha del «APK» en vez de la fecha actual para los nuevos «APK» añadidos" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2160,8 +2115,8 @@ msgstr "applicationId para buscar actualizaciones" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId con código de versión opcional en la forma APPID [: VERCODE]" @@ -2520,6 +2475,11 @@ msgstr "rechazar descarga por conexión HTTP insegura (use HTTPS o especifique - msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "rechazar descarga por conexión HTTP insegura (use HTTPS o especifique --no-https-check): {apkfilename}" +#: ../fdroidserver/index.py +#, fuzzy, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "No existe repo_icon %s. Reservando espacio." + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2723,6 +2683,11 @@ msgstr "¡{file} está vacío o corrupto!" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "¡{name} \"{path}\" no existe! Corrijalo en config.yml." +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "¡{name} \"{path}\" no existe! Corrijalo en config.yml." + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" @@ -2788,12 +2753,39 @@ msgstr[1] "compilaciones con éxito {}" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "¡No se puede encontrar un appid para {path}!" -#~ msgid "Clean update - don't uses caches, reprocess all APKs" -#~ msgstr "Actualización limpia, no usa caché, reprocesa todas las aplicaciones APK" +#~ msgid "Clean after all scans have finished" +#~ msgstr "Limpiar después de que todos los análisis hayan finalizado" + +#~ msgid "Clean before the scans start and rebuild the container" +#~ msgstr "Limpiar antes de que los análisis inicien y reconstruir el contenedor" + +#~ msgid "Clean up all containers and then exit" +#~ msgstr "Limpiar todos los contenedores y luego salir" + +#~ msgid "Could not open APK file for analysis" +#~ msgstr "No se ha podido abrir el archivo APK para analizarlo" #~ msgid "Interactively ask about things that need updating." #~ msgstr "Pregunte de forma interactiva sobre temas que necesitan una actualización." +#~ msgid "Override path for repo APKs (default: ./repo)" +#~ msgstr "Ruta de remplazo par el repositorio de APK (default: ./repo)" + +#~ msgid "Prepare Drozer to run a scan" +#~ msgstr "Preparar \"Drozer\" para ejecutar un análisis" + +#~ msgid "Prepare drozer to run a scan" +#~ msgstr "Preparar \"Drozer\" para ejecutar un análisis" + +#~ msgid "Scan only the latest version of each package" +#~ msgstr "Escanear solo la última versión de cada paquete" + +#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +#~ msgstr "Establecer un emulador, instalar la APK en el y realizar un escaneo con \"Drozer\"" + +#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" +#~ msgstr "Configurar un emulador, instalar la aplicación APK en él y realizar una \"Drozer\" scan" + #~ msgid "Specify editor to use in interactive mode. Default " #~ msgstr "Especifique el editor para utilizar en modo interactivo. Predeterminado " diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index c90e24ad..6bd5999e 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-15 13:24+0000\n" "Last-Translator: Lilian Sosa \n" "Language-Team: Spanish (Argentina) \n" @@ -54,6 +54,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -139,10 +143,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -151,26 +151,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -450,20 +438,12 @@ msgstr "Buscar actualizaciones de las aplicaciones" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "Limpiar luego de que todos los escaneos hayan terminado" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "Limpiar antes de que el escaneo comience y reconstruir el contenedor" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" -msgstr "Limpiar todos los contenedores y salir" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "" #: ../fdroidserver/update.py -#, fuzzy msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Limpiar actualización - no utiliza cachés, reprocesa todos los APK's" @@ -514,10 +494,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -788,10 +764,6 @@ msgstr "Construir todas las aplicaciones disponibles" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -802,6 +774,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1314,10 +1290,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1385,10 +1357,6 @@ msgstr "" msgid "Overall license of the project." msgstr "Licencia general del proyecto." -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "Sobrescribir la ruta de los repositorios APKs (por defecto ./repo)" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1428,13 +1396,6 @@ msgstr "Ruta de acceso al repositorio git para usar como registro" msgid "Path to the keystore for the repo signing key" msgstr "Ruta al almacén de claves para la llave de firmado del repositorio" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "Preparar drozer para que ejecute un escaneo" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1592,10 +1553,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "Escanear solo la ultima versión de cada paquete" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1646,14 +1603,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -#, fuzzy -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "Configurar un emulador, instalarle el APK y realizar el escaneo de barrido" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "Configurar un emulador, instalarle el APK y realizar el escaneo de barrido" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Firmar y ubicar paquetes en el repositorio" @@ -1784,6 +1733,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1793,10 +1746,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2023,10 +1972,6 @@ msgid "Use build server" msgstr "Usar servidor de construccion" #: ../fdroidserver/update.py -#, fuzzy -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "Utilizar la fecha del APK en vez de la actual para los APKs nuevos que se agreguen" - msgid "Use date from APK instead of current time for newly added APKs" msgstr "Utilizar la fecha del APK en vez de la actual para los APKs nuevos que se agreguen" @@ -2162,8 +2107,8 @@ msgstr "app-id para verificar actualizaciones" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py #, fuzzy msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "app-id con VersionCode opcional con el formato APPID[:VERCODE]" @@ -2527,6 +2472,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2730,6 +2680,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" @@ -2789,12 +2744,34 @@ msgstr[1] "" #~ msgid "Add gpg signatures for packages in repo" #~ msgstr "Agregar firmas GPG a paquetes en el repositorio" -#~ msgid "Clean update - don't uses caches, reprocess all APKs" -#~ msgstr "Limpiar actualización - no utiliza cachés, reprocesa todos los APK's" +#~ msgid "Clean after all scans have finished" +#~ msgstr "Limpiar luego de que todos los escaneos hayan terminado" + +#~ msgid "Clean before the scans start and rebuild the container" +#~ msgstr "Limpiar antes de que el escaneo comience y reconstruir el contenedor" + +#~ msgid "Clean up all containers and then exit" +#~ msgstr "Limpiar todos los contenedores y salir" #~ msgid "Interactively ask about things that need updating." #~ msgstr "Preguntar de forma interactiva sobre las cosas necesarias a actualizar." +#~ msgid "Override path for repo APKs (default: ./repo)" +#~ msgstr "Sobrescribir la ruta de los repositorios APKs (por defecto ./repo)" + +#~ msgid "Prepare drozer to run a scan" +#~ msgstr "Preparar drozer para que ejecute un escaneo" + +#~ msgid "Scan only the latest version of each package" +#~ msgstr "Escanear solo la ultima versión de cada paquete" + +#, fuzzy +#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +#~ msgstr "Configurar un emulador, instalarle el APK y realizar el escaneo de barrido" + +#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" +#~ msgstr "Configurar un emulador, instalarle el APK y realizar el escaneo de barrido" + #, fuzzy #~ msgid "Specify editor to use in interactive mode. Default " #~ msgstr "Especificar el editor a usar en modo interactivo. Por defecto %s" diff --git a/locale/es_MX/LC_MESSAGES/fdroidserver.po b/locale/es_MX/LC_MESSAGES/fdroidserver.po index f62c1efc..a27141bd 100644 --- a/locale/es_MX/LC_MESSAGES/fdroidserver.po +++ b/locale/es_MX/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2020-04-29 12:49+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Spanish (Mexico) \n" @@ -51,6 +51,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -136,10 +140,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -148,26 +148,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -444,17 +432,10 @@ msgstr "" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "Limpiar después de que todos los escaneos hayan terminado" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "Limpiar antes de que comiencen los escaneos y reconstruya el contenedor" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" -msgstr "Limpiar todos los contenedores y luego salir" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -507,10 +488,6 @@ msgstr "No se pudo encontrar {path} para eliminarlo" msgid "Could not open APK {path} for analysis: " msgstr "No se pudo abrir el archivo APK para su análisis" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "No se pudo abrir el archivo APK para su análisis" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -779,10 +756,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -793,6 +766,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1303,10 +1280,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1374,10 +1347,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1416,13 +1385,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1579,10 +1541,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1633,13 +1591,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "" @@ -1769,6 +1720,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1778,10 +1733,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2011,9 +1962,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2141,8 +2089,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2501,6 +2449,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2704,6 +2657,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" @@ -2755,3 +2713,15 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "" msgstr[1] "" + +#~ msgid "Clean after all scans have finished" +#~ msgstr "Limpiar después de que todos los escaneos hayan terminado" + +#~ msgid "Clean before the scans start and rebuild the container" +#~ msgstr "Limpiar antes de que comiencen los escaneos y reconstruya el contenedor" + +#~ msgid "Clean up all containers and then exit" +#~ msgstr "Limpiar todos los contenedores y luego salir" + +#~ msgid "Could not open APK file for analysis" +#~ msgstr "No se pudo abrir el archivo APK para su análisis" diff --git a/locale/eu/LC_MESSAGES/fdroidserver.po b/locale/eu/LC_MESSAGES/fdroidserver.po index 206b986c..935fcda9 100644 --- a/locale/eu/LC_MESSAGES/fdroidserver.po +++ b/locale/eu/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -49,6 +49,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -134,10 +138,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -146,26 +146,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -442,16 +430,9 @@ msgstr "" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -503,10 +484,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -774,10 +751,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -788,6 +761,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1298,10 +1275,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1369,10 +1342,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1411,13 +1380,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1574,10 +1536,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1628,13 +1586,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "" @@ -1764,6 +1715,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1773,10 +1728,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2006,9 +1957,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2136,8 +2084,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2496,6 +2444,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2699,6 +2652,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index 402636ae..2a805a1a 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2020-10-06 08:26+0000\n" "Last-Translator: Mostafa Ahangarha \n" "Language-Team: Persian \n" @@ -51,6 +51,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -136,10 +140,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -148,26 +148,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -444,16 +432,9 @@ msgstr "به‌روزرسانی‌ها برای برنامه‌ها را برر msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -505,10 +486,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -776,10 +753,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -790,6 +763,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1300,10 +1277,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1371,10 +1344,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1413,13 +1382,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1576,10 +1538,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1630,13 +1588,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "" @@ -1766,6 +1717,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1775,10 +1730,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2008,9 +1959,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2138,8 +2086,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2498,6 +2446,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2701,6 +2654,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" diff --git a/locale/fdroidserver.pot b/locale/fdroidserver.pot index 56269b63..6e9d6008 100644 --- a/locale/fdroidserver.pot +++ b/locale/fdroidserver.pot @@ -5,9 +5,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" +"Project-Id-Version: fdroidserver 2.0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -51,6 +51,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -136,10 +140,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -148,26 +148,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -444,6 +432,11 @@ msgstr "" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "" + #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" @@ -760,10 +753,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -774,6 +763,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1284,10 +1277,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1728,6 +1717,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1737,10 +1730,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1970,9 +1959,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2100,8 +2086,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2460,6 +2446,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2663,6 +2654,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index b363b5e6..0fb19648 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -49,6 +49,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -134,10 +138,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -146,26 +146,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -442,16 +430,9 @@ msgstr "" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -503,10 +484,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -774,10 +751,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -788,6 +761,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1298,10 +1275,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1369,10 +1342,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1411,13 +1380,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1574,10 +1536,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1628,13 +1586,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "" @@ -1764,6 +1715,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1773,10 +1728,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2006,9 +1957,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2136,8 +2084,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2496,6 +2444,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2699,6 +2652,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 92dfc542..1a107448 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -27,7 +27,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-28 22:09+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: French \n" @@ -84,6 +84,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" n'a pas de fichier de métadonnées correspondant !" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -169,10 +173,6 @@ msgstr "l'option %s ne prend pas de valeur" msgid "'keypass' not found in config.yml!" msgstr "'keypass' non trouvé dans config.yml !" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "'keypass' non trouvé dans config.yml !" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' n'est pas utilisé et 'smartcardoptions' est vide !" @@ -181,26 +181,14 @@ msgstr "'keystore' n'est pas utilisé et 'smartcardoptions' est vide !" msgid "'keystore' not found in config.yml!" msgstr "'keystore' non trouvé dans config.yml !" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "'keystore' non trouvé dans config.yml !" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' non trouvé dans config.yml !" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' non trouvé dans config.yml !" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' non trouvé dans config.yml !" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' non trouvé dans config.yml !" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -477,17 +465,10 @@ msgstr "Vérifier les mises à jour pour les applications" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Vérification de l'archivage pour {appid} - APKs : {integer}, keepversions : {keep}, archapks : {arch}" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "Nettoyer après la fin de tous les scans" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "Nettoyer avant le début des scans et recréer le container" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" -msgstr "Vider tous les conteneurs puis sortir" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Vérification de l'archivage pour {appid} - APKs : {integer}, keepversions : {keep}, archapks : {arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -538,10 +519,6 @@ msgstr "Chemin {path} introuvable pour sa suppression" msgid "Could not open APK {path} for analysis: " msgstr "Impossible d'ouvrir le fichier APK {path} pour analyse : " -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "Impossible d'ouvrir le fichier APK pour analyse" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -813,10 +790,6 @@ msgstr "Impossible d'aligner les applications" msgid "Failed to create S3 bucket: {url}" msgstr "La création du S3 Bucket a échoué : {url}" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "Échoument lors de la récupération de l'information manifest de l'APK" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -827,6 +800,10 @@ msgstr "Impossible d'obtenir les informations de l'APK, suppression {path}" msgid "Failed to get APK information, skipping {path}" msgstr "Échoument lors de la récupération des informations de l'APK, saut de {path}" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "Échoument lors de la récupération de l'information manifest de l'APK" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1337,10 +1314,6 @@ msgstr "Rien à faire pour {appid}." msgid "Now set these in config.yml:" msgstr "Maintenant, définissez-les dans config.yml :" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "Maintenant, définissez ceci dans config.yml :" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1408,10 +1381,6 @@ msgstr "Sortie vers JSON" msgid "Overall license of the project." msgstr "Licence globale du projet." -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "Remplacer le chemin pour les fichiers APK de dépôt (par défaut : ./repo)" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1450,13 +1419,6 @@ msgstr "Chemin vers un dépôt git à utiliser comme journal" msgid "Path to the keystore for the repo signing key" msgstr "Chemin vers le keystore pour la clé de signature du dépôt" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "Préparer Drozer pour lancer une analyse" - -msgid "Prepare drozer to run a scan" -msgstr "Préparer Drozer pour lancer un scanne" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Afficher la variable secrète dans le terminal pour un copier/coller facilité" @@ -1613,10 +1575,6 @@ msgstr "Exécution de la première passe avec la vérification MD5 désactivée" msgid "Running wget in {path}" msgstr "Exécution de wget dans {path}" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "Analyser seulement la dernière version de chaque paquet" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Scanne le(s) APK(s) résultants pour des classes non-libres connues." @@ -1667,13 +1625,6 @@ msgstr "Définir la limite d'échec du nombre de fichiers ouvert : " msgid "Setting {0} sec timeout for this build" msgstr "Définir une timeout de {0} secondes pour cette construction" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "Installez un émulateur, installez l'APK dessus et effectuez un scan Drozer" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "Met en place un émulateur, y installe l’APK et réalise un scan drozer" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Signer et déplacer les paquets dans le dépôt" @@ -1803,6 +1754,17 @@ msgstr "Il y a une collision de keyalias - publication interrompue" msgid "These are the apps that have been archived from the main repo." msgstr "Voici les applications qui ont été archivées à partir du dépôt principal." +#: ../fdroidserver/common.py +#, fuzzy +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" +"\n" +" Ceci est un dépôt d’applications à utiliser avec FDroid. Les applications publiées\n" +" dans ce dépôt sont soit celles compilées par les développeurs\n" +" de ces applications, soit celles compilées par f-droid.org à partir des\n" +" sources en utilisant les outils disponibles sur https://gitlab.com/fdroid.\n" +" " + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1812,10 +1774,6 @@ msgstr "Ce dépôt a déjà des méta-données locales : %s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Pour utiliser awsbucket, awssecretkey et awsaccesskeyid doivent aussi être configurées dans config.yml !" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Pour utiliser awsbucket, awssecretkey et awsaccesskeyid doivent aussi être configurées dans config.yml !" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "L'URL doit commencer par https:// ou http://" @@ -2045,9 +2003,6 @@ msgstr "Utiliser le serveur de build" msgid "Use date from APK instead of current time for newly added APKs" msgstr "Utiliser la date de l'APK plutôt que la date courante pour les APKs nouvellement ajoutés" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "Utiliser la date de l'APK plutôt que la date courante pour les APKs nouvellement ajoutés" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2177,8 +2132,8 @@ msgstr "applicationId pour vérifier les mises à jour" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId avec le versionCode optionnel sous la forme APPID[:VERCODE]" @@ -2538,6 +2493,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2742,6 +2702,11 @@ msgstr "{file} est vide ou corrompu !" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" @@ -2810,12 +2775,39 @@ msgstr[1] "{} compilations réussies" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "Impossible de trouver un appid pour {path} !" -#~ msgid "Clean update - don't uses caches, reprocess all APKs" -#~ msgstr "Mise à jour propre - n'utilise pas les caches, ré-exécute tous les APKs" +#~ msgid "Clean after all scans have finished" +#~ msgstr "Nettoyer après la fin de tous les scans" + +#~ msgid "Clean before the scans start and rebuild the container" +#~ msgstr "Nettoyer avant le début des scans et recréer le container" + +#~ msgid "Clean up all containers and then exit" +#~ msgstr "Vider tous les conteneurs puis sortir" + +#~ msgid "Could not open APK file for analysis" +#~ msgstr "Impossible d'ouvrir le fichier APK pour analyse" #~ msgid "Interactively ask about things that need updating." #~ msgstr "Demander de manière interactive les choses nécessitant une mise à jour." +#~ msgid "Override path for repo APKs (default: ./repo)" +#~ msgstr "Remplacer le chemin pour les fichiers APK de dépôt (par défaut : ./repo)" + +#~ msgid "Prepare Drozer to run a scan" +#~ msgstr "Préparer Drozer pour lancer une analyse" + +#~ msgid "Prepare drozer to run a scan" +#~ msgstr "Préparer Drozer pour lancer un scanne" + +#~ msgid "Scan only the latest version of each package" +#~ msgstr "Analyser seulement la dernière version de chaque paquet" + +#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +#~ msgstr "Installez un émulateur, installez l'APK dessus et effectuez un scan Drozer" + +#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" +#~ msgstr "Met en place un émulateur, y installe l’APK et réalise un scan drozer" + #~ msgid "Specify editor to use in interactive mode. Default " #~ msgstr "Définir l'éditeur à utiliser en mode interactif. Par défaut " diff --git a/locale/hi/LC_MESSAGES/fdroidserver.po b/locale/hi/LC_MESSAGES/fdroidserver.po index bdb077b8..b8d9ab6e 100644 --- a/locale/hi/LC_MESSAGES/fdroidserver.po +++ b/locale/hi/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-24 08:48+0000\n" "Last-Translator: Isrg Rajan \n" "Language-Team: Hindi \n" @@ -50,6 +50,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -135,10 +139,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -147,26 +147,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -443,16 +431,9 @@ msgstr "अनुप्रयोगों के अपडेट के लि msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -504,10 +485,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -775,10 +752,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -789,6 +762,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1299,10 +1276,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1370,10 +1343,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1412,13 +1381,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1575,10 +1537,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1629,13 +1587,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "" @@ -1765,6 +1716,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1774,10 +1729,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2007,9 +1958,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2137,8 +2085,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2497,6 +2445,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2700,6 +2653,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index 0c0709e5..69dc9129 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-14 14:58+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Hungarian \n" @@ -58,6 +58,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "A(z) „%s/” nem rendelkezik megfelelő metaadatfájllal." +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, fuzzy, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -143,11 +147,6 @@ msgstr "A(z) %s kapcsoló nem fogad értéket" msgid "'keypass' not found in config.yml!" msgstr "A „keypass” nem található a config.yml fájlban." -#: ../fdroidserver/common.py -#, fuzzy -msgid "'keypass' not found in config.yml!" -msgstr "A „keypass” nem található a config.yml fájlban." - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -156,29 +155,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "A „keystore” nem található a config.yml fájlban." -#: ../fdroidserver/common.py -#, fuzzy -msgid "'keystore' not found in config.yml!" -msgstr "A „keystore” nem található a config.yml fájlban." - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "A „keystorepass” nem található a config.yml fájlban." -#: ../fdroidserver/common.py -#, fuzzy -msgid "'keystorepass' not found in config.yml!" -msgstr "A „keystorepass” nem található a config.yml fájlban." - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "A „repo_keyalias” nem található a config.yml fájlban." -#: ../fdroidserver/common.py -#, fuzzy -msgid "'repo_keyalias' not found in config.yml!" -msgstr "A „repo_keyalias” nem található a config.yml fájlban." - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -456,16 +440,9 @@ msgstr "Alkalmazásfrissítések keresése" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -517,10 +494,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -788,10 +761,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -802,6 +771,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1312,10 +1285,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1383,10 +1352,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1425,13 +1390,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1588,10 +1546,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1642,13 +1596,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Aláírás és csomagok tárolóba helyezése" @@ -1778,6 +1725,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1787,10 +1738,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2020,9 +1967,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2150,8 +2094,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2510,6 +2454,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2713,6 +2662,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index 6250611c..524efb66 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2020-10-06 08:26+0000\n" "Last-Translator: signz signotorez \n" "Language-Team: Indonesian \n" @@ -50,6 +50,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" tidak ada kesesuaian pada berkas metadata!" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -134,11 +138,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "'keypass' tidak ditemukan dalam config.yml!" -#: ../fdroidserver/common.py -#, fuzzy -msgid "'keypass' not found in config.yml!" -msgstr "'keypass' tidak ditemukan dalam config.yml!" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -147,29 +146,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "'keystore' tidak ditemukan dalam config.yml!" -#: ../fdroidserver/common.py -#, fuzzy -msgid "'keystore' not found in config.yml!" -msgstr "'keystore' tidak ditemukan dalam config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' tidak ditemukan dalam config.yml!" -#: ../fdroidserver/common.py -#, fuzzy -msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' tidak ditemukan dalam config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' tidak ditemukan dalam config.yml!" -#: ../fdroidserver/common.py -#, fuzzy -msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' tidak ditemukan dalam config.yml!" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -446,16 +430,9 @@ msgstr "Periksa pembaruan pada aplikasi" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -507,10 +484,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -778,10 +751,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -792,6 +761,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1302,10 +1275,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1373,10 +1342,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1415,13 +1380,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1578,10 +1536,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1631,13 +1585,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "" @@ -1767,6 +1714,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1776,10 +1727,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2009,9 +1956,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2139,8 +2083,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2497,6 +2441,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2699,6 +2648,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 5f1dfe1f..74f7b9cb 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-14 21:33+0000\n" "Last-Translator: Francesco Esposito \n" "Language-Team: Italian \n" @@ -70,6 +70,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" non ha un file di metadati corrispondente!" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -155,10 +159,6 @@ msgstr "l'opzione %s non accetta un valore" msgid "'keypass' not found in config.yml!" msgstr "\"keypass\" non trovato in config.yml!" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "\"keypass\" non trovato in config.yml!" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' è NONE e 'smartcardoptions' è vuoto!" @@ -167,26 +167,14 @@ msgstr "'keystore' è NONE e 'smartcardoptions' è vuoto!" msgid "'keystore' not found in config.yml!" msgstr "\"keystore\" non trovato in config.yml!" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "\"keystore\" non trovato in config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "\"keystorepass\" non trovato in config.yml!" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "\"keystorepass\" non trovato in config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "\"repo_keyalias\" non trovato in config.yml!" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "\"repo_keyalias\" non trovato in config.yml!" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -463,17 +451,10 @@ msgstr "Cerca gli aggiornamenti delle applicazioni" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Controllando l'archiviazione per {appid} - APK:{integer}, keepversions:{keep}, archapks:{arch}" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "Pulisci dopo aver terminato le scansioni" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "Pulisci prima delle scansioni e ricostruisci il container" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" -msgstr "Pulisci tutti i container ed esci" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Controllando l'archiviazione per {appid} - APK:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -524,10 +505,6 @@ msgstr "Impossibile trovare {path} da rimuovere" msgid "Could not open APK {path} for analysis: " msgstr "Impossibile aprire il file APK {path} per l'analisi: " -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "Impossibile aprire il file APK per l'analisi" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -799,10 +776,6 @@ msgstr "Impossibile allineare l’applicazione" msgid "Failed to create S3 bucket: {url}" msgstr "Impossibile creare il bucket S3: {url}" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "Impossibile ottenere informazioni del manifest dell’APK" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -813,6 +786,10 @@ msgstr "Impossibile ottenere informazioni dell’APK, eliminando {path}" msgid "Failed to get APK information, skipping {path}" msgstr "Impossibile ottenere informazioni dell’APK, saltando {path}" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "Impossibile ottenere informazioni del manifest dell’APK" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1323,10 +1300,6 @@ msgstr "Niente da fare per {appid}." msgid "Now set these in config.yml:" msgstr "Ora imposta i seguenti campi in config.yml:" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "Ora imposta i seguenti campi in config.yml:" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1394,10 +1367,6 @@ msgstr "" msgid "Overall license of the project." msgstr "Licenza generale del progetto." -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "Sostituisci il percorso per gli APK del repository (impostazione predefinita: ./repo)" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1436,13 +1405,6 @@ msgstr "Percorso del repository git da utilizzare come registro" msgid "Path to the keystore for the repo signing key" msgstr "Percorso del keystore per la chiave di firma del repository" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "Prepara Drozer per eseguire una scansione" - -msgid "Prepare drozer to run a scan" -msgstr "Preparare drozer per eseguire una scansione" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Stampa la variabile segreta sul terminale per un facile copia/incolla" @@ -1599,10 +1561,6 @@ msgstr "Esecuzione del primo passaggio con controllo MD5 disabilitato" msgid "Running wget in {path}" msgstr "Esecuzione di wget in {path}" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "Scansiona solo l'ultima versione di ogni pacchetto" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1653,13 +1611,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Firma e metti i pacchetti nel repository" @@ -1789,6 +1740,17 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +#, fuzzy +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" +"\n" +" Questo è un repository di app da usare con FDroid. Le applicazioni in questo\n" +" repository sono binari ufficiali compilati dagli sviluppatori originali \n" +" dell'applicazione, oppure sono binari compilati dai sorgenti da f-droid.org\n" +" usando i tool su https://gitlab.com/fdroid.\n" +" " + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1798,10 +1760,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2031,9 +1989,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2161,8 +2116,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2521,6 +2476,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2724,6 +2684,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" @@ -2782,5 +2747,29 @@ msgstr[1] "" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "Impossibile trovare un appid per {path}!" +#~ msgid "Clean after all scans have finished" +#~ msgstr "Pulisci dopo aver terminato le scansioni" + +#~ msgid "Clean before the scans start and rebuild the container" +#~ msgstr "Pulisci prima delle scansioni e ricostruisci il container" + +#~ msgid "Clean up all containers and then exit" +#~ msgstr "Pulisci tutti i container ed esci" + +#~ msgid "Could not open APK file for analysis" +#~ msgstr "Impossibile aprire il file APK per l'analisi" + #~ msgid "Interactively ask about things that need updating." #~ msgstr "Chiedi interattivamente riguardo a ciò che deve essere aggiornato." + +#~ msgid "Override path for repo APKs (default: ./repo)" +#~ msgstr "Sostituisci il percorso per gli APK del repository (impostazione predefinita: ./repo)" + +#~ msgid "Prepare Drozer to run a scan" +#~ msgstr "Prepara Drozer per eseguire una scansione" + +#~ msgid "Prepare drozer to run a scan" +#~ msgstr "Preparare drozer per eseguire una scansione" + +#~ msgid "Scan only the latest version of each package" +#~ msgstr "Scansiona solo l'ultima versione di ogni pacchetto" diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 9715e16b..6faa762e 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2020-09-02 16:10+0000\n" "Last-Translator: Hinaloe \n" "Language-Team: Japanese \n" @@ -50,6 +50,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, fuzzy, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -134,10 +138,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -146,26 +146,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -441,16 +429,9 @@ msgstr "" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -502,10 +483,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -773,10 +750,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -787,6 +760,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1297,10 +1274,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1368,10 +1341,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1410,13 +1379,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1573,10 +1535,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1626,13 +1584,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "" @@ -1762,6 +1713,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1771,10 +1726,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2004,9 +1955,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2134,8 +2082,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2492,6 +2440,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2694,6 +2647,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index 5248d5ec..481c65cf 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-15 13:25+0000\n" "Last-Translator: R_SACI \n" "Language-Team: Kabyle \n" @@ -52,6 +52,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -137,10 +141,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "'keypass' ulac-it di config.yml!" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "'keypass' ulac-it di config.yml!" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -149,26 +149,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "'keystore' ulac-it di config.yml!" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "'keystore' ulac-it di config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' ulac-it di config.yml!" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' ulac-it di config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' ulac-it deg config.yml!" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' ulac-it deg config.yml!" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -445,16 +433,9 @@ msgstr "" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -506,10 +487,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "Ur yezmir ara ad d-yeldi afaylu APK {path} i tesleḍt: " -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "Ur yezmir ara a d-ildi afaylu APK i tesleḍt" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -777,10 +754,6 @@ msgstr "Areyyec n usnas ur yeddi ara" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -791,6 +764,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1301,10 +1278,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1372,10 +1345,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1414,13 +1383,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1577,10 +1539,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1631,13 +1589,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "" @@ -1767,6 +1718,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1776,10 +1731,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2009,9 +1960,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2139,8 +2087,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2499,6 +2447,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2702,6 +2655,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" @@ -2753,3 +2711,6 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "" msgstr[1] "" + +#~ msgid "Could not open APK file for analysis" +#~ msgstr "Ur yezmir ara a d-ildi afaylu APK i tesleḍt" diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index 858f63c0..3da18e51 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-28 22:09+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Korean \n" @@ -57,6 +57,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\"에 일치하는 메타데이터 파일이 없습니다!" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, fuzzy, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -141,11 +145,6 @@ msgstr "%s 옵션은 값을 받지 않습니다" msgid "'keypass' not found in config.yml!" msgstr "'keypass'를 config.yml에서 찾을 수 없습니다!" -#: ../fdroidserver/common.py -#, fuzzy -msgid "'keypass' not found in config.yml!" -msgstr "'keypass'를 config.yml에서 찾을 수 없습니다!" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -154,29 +153,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "'keystore'를 config.yml에서 찾을 수 없습니다!" -#: ../fdroidserver/common.py -#, fuzzy -msgid "'keystore' not found in config.yml!" -msgstr "'keystore'를 config.yml에서 찾을 수 없습니다!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass'를 config.yml에서 찾을 수 없습니다!" -#: ../fdroidserver/common.py -#, fuzzy -msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass'를 config.yml에서 찾을 수 없습니다!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias'를 config.yml에서 찾을 수 없습니다!" -#: ../fdroidserver/common.py -#, fuzzy -msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias'를 config.yml에서 찾을 수 없습니다!" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -453,16 +437,9 @@ msgstr "애플리케이션으로의 업데이트를 확인합니다" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -514,10 +491,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -785,10 +758,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -799,6 +768,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1309,10 +1282,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1380,10 +1349,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "저장소 APK를 위한 경로 재정의 (기본값: ./repo)" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1422,13 +1387,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1585,10 +1543,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1638,13 +1592,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "저장소에서 패키지를 서명하고 배치합니다" @@ -1774,6 +1721,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1783,10 +1734,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2017,9 +1964,6 @@ msgstr "빌드 서버를 사용합니다" msgid "Use date from APK instead of current time for newly added APKs" msgstr "새로 추가된 APK를 위해 현재 시간 대신에 APK에서의 날짜를 사용합니다" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "새로 추가된 APK를 위해 현재 시간 대신에 APK에서의 날짜를 사용합니다" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2149,8 +2093,8 @@ msgstr "업데이트를 확인할 applicationId" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "양식 APPID[:VERCODE]에서 선택적인 versionCode로 된 applicationId" @@ -2507,6 +2451,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2709,6 +2658,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\"는 존재하지 않습니다! config.yml에서 그것을 고치세요." +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "{name} \"{path}\"는 존재하지 않습니다! config.yml에서 그것을 고치세요." + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" @@ -2767,3 +2721,6 @@ msgstr[0] "{} 빌드 성공됨" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "{path}를 위한 appid를 찾을 수 없습니다!" + +#~ msgid "Override path for repo APKs (default: ./repo)" +#~ msgstr "저장소 APK를 위한 경로 재정의 (기본값: ./repo)" diff --git a/locale/ml/LC_MESSAGES/fdroidserver.po b/locale/ml/LC_MESSAGES/fdroidserver.po index 2729a0bf..01800730 100644 --- a/locale/ml/LC_MESSAGES/fdroidserver.po +++ b/locale/ml/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-14 14:58+0000\n" "Last-Translator: Coding Otaku \n" "Language-Team: Malayalam \n" @@ -63,6 +63,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -148,10 +152,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -160,26 +160,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -456,16 +444,9 @@ msgstr "" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -517,10 +498,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -788,10 +765,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -802,6 +775,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1312,10 +1289,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1383,10 +1356,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1425,13 +1394,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1588,10 +1550,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1642,13 +1600,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "" @@ -1778,6 +1729,17 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +#, fuzzy +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" +"\n" +" FDroid- നൊപ്പം ഉപയോഗിക്കേണ്ട അപ്ലിക്കേഷനുകളുടെ ഒരു ശേഖരമാണിത്. \n" +" ഇതിലെ അപ്ലിക്കേഷനുകൾ ഒന്നെങ്കിൽ ഒറിജിനൽ ആപ്ലിക്കേഷൻ\n" +" നിർമാതാക്കൾ നിർമ്മിച്ച ഔദ്യോഗിക ബൈനറികളുടെ ശേഖരമോ,\n" +" അല്ലെങ്കിൽ f-droid.org https://gitlab.com/fdroid- ലെ ഉപകരണങ്ങൾ ഉപയോഗിച്ച് ഉറവിടത്തിൽ നിന്ന് നിർമ്മിച്ച ബൈനറികളോ ആണ് .\n" +" " + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1787,10 +1749,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2020,9 +1978,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2150,8 +2105,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2510,6 +2465,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2713,6 +2673,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index efb419e2..977e9045 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2020-10-14 09:28+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Norwegian Bokmål \n" @@ -59,6 +59,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" har ingen samsvarende metadatafil!" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, fuzzy, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -144,11 +148,6 @@ msgstr "%s-valget tar ikke en verdi" msgid "'keypass' not found in config.yml!" msgstr "'keypass' ble ikke funnet i config.yml!" -#: ../fdroidserver/common.py -#, fuzzy -msgid "'keypass' not found in config.yml!" -msgstr "'keypass' ble ikke funnet i config.yml!" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -157,29 +156,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "'keystore' ble ikke funnet i config.yml!" -#: ../fdroidserver/common.py -#, fuzzy -msgid "'keystore' not found in config.yml!" -msgstr "'keystore' ble ikke funnet i config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' ble ikke funnet i config.yml!" -#: ../fdroidserver/common.py -#, fuzzy -msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' ble ikke funnet i config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' ble ikke funnet i config.yml!" -#: ../fdroidserver/common.py -#, fuzzy -msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' ble ikke funnet i config.yml!" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, fuzzy @@ -462,17 +446,10 @@ msgstr "Se etter programoppdateringer" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Sjekker arkivering for {appid} - APK-er:{integer}, keepversions:{keep}, archapks:{arch}" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "Rydd opp etter at alle skanninger er fullførte" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "Tøm før skanninger starter og bygg beholderen på ny" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" -msgstr "Tøm alle beholdere og avslutt" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Sjekker arkivering for {appid} - APK-er:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -525,11 +502,6 @@ msgstr "Fant ikke \"{path}\" for fjerning derav" msgid "Could not open APK {path} for analysis: " msgstr "Kunne ikke åpne APK-fil for analyse" -#: ../fdroidserver/update.py -#, fuzzy -msgid "Could not open APK file for analysis" -msgstr "Kunne ikke åpne APK-fil for analyse" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -813,11 +785,6 @@ msgstr "Klarte ikke å justere program" msgid "Failed to create S3 bucket: {url}" msgstr "Klarte ikke å opprette S3-spann: {url}" -#: ../fdroidserver/common.py -#, fuzzy -msgid "Failed to get APK manifest information" -msgstr "Klarte ikke å hente APK-manifestinfo" - #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -828,6 +795,11 @@ msgstr "Klarte ikke å hente APK-info, sletter {path}" msgid "Failed to get APK information, skipping {path}" msgstr "Klarte ikke å hente APK-info, hopper over {path}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Failed to get APK manifest information" +msgstr "Klarte ikke å hente APK-manifestinfo" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1356,10 +1328,6 @@ msgstr "Ingenting å gjøre for {appid}." msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, fuzzy, python-brace-format @@ -1430,10 +1398,6 @@ msgstr "" msgid "Overall license of the project." msgstr "Overnevnt lisens for prosjektet." -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "Overskriv sti for pakkebrønns-APK-er (forvalg: ./repo)" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1475,13 +1439,6 @@ msgstr "Sti til Git-pakkebrønn å bruke som logg" msgid "Path to the keystore for the repo signing key" msgstr "Sti til nøkkellager for pakkebrønnssigneringsnøkkel" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "Forbered Drozer på kjøring av skanning" - -msgid "Prepare drozer to run a scan" -msgstr "Forbered Drozer på kjøring av skanning" - #: ../fdroidserver/nightly.py #, fuzzy msgid "Print the secret variable to the terminal for easy copy/paste" @@ -1643,10 +1600,6 @@ msgstr "Kjører første passering med MD5-sjekking avskrudd" msgid "Running wget in {path}" msgstr "Kjører wget i {path}." -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "Skann kun siste versjon av hver pakke" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1698,15 +1651,6 @@ msgstr "Kunne ikke sette åpen filgrense: " msgid "Setting {0} sec timeout for this build" msgstr "Setter {0} sek. tidsavbrudd for dette bygget" -#: ../fdroidserver/build.py -#, fuzzy -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "Sett opp en emulator, installer APK-en på den og utfør en Drozer-skanning" - -#, fuzzy -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "Sett opp en emulator, installer APK-en på den og utfør en Drozer-skanning" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Logg inn og legg til pakker i pakkebrønnen" @@ -1840,6 +1784,10 @@ msgstr "Nøkkelaliaskollisjon - offentliggjøring stanset" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1850,11 +1798,6 @@ msgstr "Denne pakkebrønnen har allerede lokal metadata: %s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "For å bruke AWS-spann, må \"awssecretkey\" og \"awsaccesskeyid\" også være satt i config.yml." -#: ../fdroidserver/deploy.py -#, fuzzy -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "For å bruke AWS-spann, må \"awssecretkey\" og \"awsaccesskeyid\" også være satt i config.yml." - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "Nettadressen må starte med https:// eller http://" @@ -2086,10 +2029,6 @@ msgid "Use build server" msgstr "Bruk byggtjener" #: ../fdroidserver/update.py -#, fuzzy -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "Bruk dato fra APK istedenfor nåværende tid for nylig tillagte APK-er." - msgid "Use date from APK instead of current time for newly added APKs" msgstr "Bruk dato fra APK istedenfor nåværende tid for nylig tillagte APK-er" @@ -2228,8 +2167,8 @@ msgstr "App-ID å sjekke for oppdateringer" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "App-ID med valgfri versionCode, i formen APPID[:VERCODE]" @@ -2597,6 +2536,11 @@ msgstr "nekt nedlasting via usikker HTTP-tilkobling (bruk HTTPS eller angi --no- msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "nekt nedlasting via usikker HTTP-tilkobling (bruk HTTPS eller angi --no-https-check): {apkfilename}" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2803,6 +2747,11 @@ msgstr "{file} er tom eller skadet!" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\" finnes ikke. Rett det i config.yml." +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "{name} \"{path}\" finnes ikke. Rett det i config.yml." + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" @@ -2865,3 +2814,36 @@ msgstr[1] "{} bygg fullført" #, fuzzy #~ msgid "Cannot find an appid for {path}!" #~ msgstr "Finner ikke AppID for {path}." + +#~ msgid "Clean after all scans have finished" +#~ msgstr "Rydd opp etter at alle skanninger er fullførte" + +#~ msgid "Clean before the scans start and rebuild the container" +#~ msgstr "Tøm før skanninger starter og bygg beholderen på ny" + +#~ msgid "Clean up all containers and then exit" +#~ msgstr "Tøm alle beholdere og avslutt" + +#, fuzzy +#~ msgid "Could not open APK file for analysis" +#~ msgstr "Kunne ikke åpne APK-fil for analyse" + +#~ msgid "Override path for repo APKs (default: ./repo)" +#~ msgstr "Overskriv sti for pakkebrønns-APK-er (forvalg: ./repo)" + +#~ msgid "Prepare Drozer to run a scan" +#~ msgstr "Forbered Drozer på kjøring av skanning" + +#~ msgid "Prepare drozer to run a scan" +#~ msgstr "Forbered Drozer på kjøring av skanning" + +#~ msgid "Scan only the latest version of each package" +#~ msgstr "Skann kun siste versjon av hver pakke" + +#, fuzzy +#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +#~ msgstr "Sett opp en emulator, installer APK-en på den og utfør en Drozer-skanning" + +#, fuzzy +#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" +#~ msgstr "Sett opp en emulator, installer APK-en på den og utfør en Drozer-skanning" diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index 17555bae..3f2bef85 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2020-10-01 20:58+0000\n" "Last-Translator: Bart Groeneveld \n" "Language-Team: Dutch \n" @@ -50,6 +50,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -135,10 +139,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -147,26 +147,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -444,16 +432,9 @@ msgstr "" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -505,10 +486,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -776,10 +753,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -790,6 +763,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1300,10 +1277,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1371,10 +1344,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1413,13 +1382,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1576,10 +1538,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1630,13 +1588,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "" @@ -1766,6 +1717,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1775,10 +1730,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2008,9 +1959,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2138,8 +2086,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2498,6 +2446,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2701,6 +2654,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index f16a1724..bb09ad0f 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-28 22:09+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Polish \n" @@ -65,6 +65,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" nie ma pasującego pliku metadanych!" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -151,10 +155,6 @@ msgstr "%s opcja nie przyjmuje wartości" msgid "'keypass' not found in config.yml!" msgstr "'keypass' nie znaleziono w config.yml!" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "'keypass' nie znaleziono w config.yml!" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "\"keystore\" nie ma, a \"smartcardoptions\" jest puste!" @@ -163,26 +163,14 @@ msgstr "\"keystore\" nie ma, a \"smartcardoptions\" jest puste!" msgid "'keystore' not found in config.yml!" msgstr "'Plik kluczy' nie został znaleziony w pliku config.yml!" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "'keystore' nie znaleziono w config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' nie znaleziono w config.yml!" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' nie znaleziono w config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' nie znaleziono w config.yml!" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' nie znaleziono w config.yml!" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -460,17 +448,10 @@ msgstr "Sprawdź aktualizacje aplikacji" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Sprawdzanie archiwizacji dla {appid} - APKs: {integer}, keepversions: {keep}, archapks: {arch}" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "Wyczyść po zakończeniu wszystkich skanów" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "Wyczyść przed rozpoczęciem skanowania i odbuduj kontener" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" -msgstr "Oczyść wszystkie pojemniki, a następnie wyjdź" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Sprawdzanie archiwizacji dla {appid} - APKs: {integer}, keepversions: {keep}, archapks: {arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -521,10 +502,6 @@ msgstr "Nie można znaleźć pliku {path}, aby go usunąć" msgid "Could not open APK {path} for analysis: " msgstr "Nie można otworzyć pliku APK {path} do analizy: " -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "Nie można otworzyć pliku APK do analizy" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -796,10 +773,6 @@ msgstr "Nie udało się wyrównać aplikacji" msgid "Failed to create S3 bucket: {url}" msgstr "Nie można utworzyć zasobnika S3: {url}" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "Nie można uzyskać informacji o manifeście APK" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -810,6 +783,10 @@ msgstr "Nie udało się uzyskać informacji o APK, usunięcie {path}" msgid "Failed to get APK information, skipping {path}" msgstr "Nie udało się uzyskać informacji o APK, pomijając {path}" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "Nie można uzyskać informacji o manifeście APK" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1321,10 +1298,6 @@ msgstr "Nic nie robić w {appid}." msgid "Now set these in config.yml:" msgstr "Teraz ustaw je w config.yml:" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "Teraz ustaw je w config.yml:" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1393,10 +1366,6 @@ msgstr "Wyprowadzanie JSON" msgid "Overall license of the project." msgstr "Całkowita licencja na projekt." -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "Zastąp ścieżkę dla plików APK repo (domyślnie: ./repo)" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1435,13 +1404,6 @@ msgstr "Ścieżka do repozytorium git do użycia jako dziennik" msgid "Path to the keystore for the repo signing key" msgstr "Ścieżka do magazynu kluczy dla klucza podpisywania repo" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "Przygotuj Drozera do uruchomienia skanowania" - -msgid "Prepare drozer to run a scan" -msgstr "Przygotuj drozer do uruchomienia skanowania" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Wydrukuj tajną zmienną do terminala, aby ułatwić kopiowanie/wklejanie" @@ -1598,10 +1560,6 @@ msgstr "Uruchomienie pierwszego przejścia z wyłączonym sprawdzaniem MD5" msgid "Running wget in {path}" msgstr "Uruchomienie wget w {path}" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "Skanuj tylko najnowszą wersję każdego pakietu" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Przeskanuj otrzymany plik APK w poszukiwaniu znanych niewolnych klas." @@ -1653,13 +1611,6 @@ msgstr "Ustawienie limitu otwartych plików nie powiodło się: " msgid "Setting {0} sec timeout for this build" msgstr "Ustawienie limitu czasu {0} w sek dla tej kompilacji" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "Skonfiguruj emulator, zainstaluj na nim plik APK i wykonaj skanowanie Drozera" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "Skonfiguruj emulator, zainstaluj na nim APK i wykonaj skanowanie drozer" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Podpisz i umieść paczki w repozytorium" @@ -1789,6 +1740,17 @@ msgstr "Istnieje kolizja keyalias - wstrzymano publikowanie" msgid "These are the apps that have been archived from the main repo." msgstr "To są aplikacje, które zostały zarchiwizowane w głównym repozytorium." +#: ../fdroidserver/common.py +#, fuzzy +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" +"\n" +" To jest repozytorium aplikacji, które mają być używane z FDroid. Aplikacje w tym\n" +" repozytorium są oficjalnymi plikami binarnymi utworzonymi przez oryginalnych\n" +" programistów lub są to pliki binarne utworzone ze źródła przez f-droid.org\n" +" przy użyciu narzędzi na https://gitlab.com/fdroid.\n" +" " + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1798,10 +1760,6 @@ msgstr "To repo ma już lokalne metadane: %s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Aby użyć awsbucket, awssecretkey i awsaccesskeyid muszą być również ustawione w config.yml!" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Aby użyć awsbucket, awssecretkey i awsaccesskeyid muszą być również ustawione w config.yml!" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "Adres URL musi rozpoczynać się od https:// lub http://" @@ -2031,9 +1989,6 @@ msgstr "Użyj serwera kompilacji" msgid "Use date from APK instead of current time for newly added APKs" msgstr "Użyj daty z pliku APK zamiast aktualnego dla nowo dodanych pakietów APK" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "Użyj daty z APK zamiast bieżącego czasu dla nowo dodanych plików APK" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2161,8 +2116,8 @@ msgstr "applicationId, aby sprawdzić dostępność aktualizacji" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId z opcjonalnym versionCode w postaci APPID [:VERCODE]" @@ -2523,6 +2478,11 @@ msgstr "odmów pobierania przez niezabezpieczone połączenie HTTP (użyj HTTPS msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "odmów pobierania przez niezabezpieczone połączenie http (użyj https lub określ --no-https-check): {apkfilename}" +#: ../fdroidserver/index.py +#, fuzzy, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "repo_icon %s nie istnieje, generuje symbol zastępczy." + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2727,6 +2687,11 @@ msgstr "{file} jest pusty lub uszkodzony!" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\" nie istnieje! Popraw go w config.yml." +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "{name} \"{path}\" nie istnieje! Popraw go w config.yml." + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" @@ -2787,5 +2752,35 @@ msgstr[2] "{} kompilacje powiodły się" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "Nie można znaleźć załącznika dla {path}!" +#~ msgid "Clean after all scans have finished" +#~ msgstr "Wyczyść po zakończeniu wszystkich skanów" + +#~ msgid "Clean before the scans start and rebuild the container" +#~ msgstr "Wyczyść przed rozpoczęciem skanowania i odbuduj kontener" + +#~ msgid "Clean up all containers and then exit" +#~ msgstr "Oczyść wszystkie pojemniki, a następnie wyjdź" + +#~ msgid "Could not open APK file for analysis" +#~ msgstr "Nie można otworzyć pliku APK do analizy" + #~ msgid "Interactively ask about things that need updating." #~ msgstr "Interaktywnie pytaj o rzeczy, które wymagają aktualizacji." + +#~ msgid "Override path for repo APKs (default: ./repo)" +#~ msgstr "Zastąp ścieżkę dla plików APK repo (domyślnie: ./repo)" + +#~ msgid "Prepare Drozer to run a scan" +#~ msgstr "Przygotuj Drozera do uruchomienia skanowania" + +#~ msgid "Prepare drozer to run a scan" +#~ msgstr "Przygotuj drozer do uruchomienia skanowania" + +#~ msgid "Scan only the latest version of each package" +#~ msgstr "Skanuj tylko najnowszą wersję każdego pakietu" + +#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +#~ msgstr "Skonfiguruj emulator, zainstaluj na nim plik APK i wykonaj skanowanie Drozera" + +#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" +#~ msgstr "Skonfiguruj emulator, zainstaluj na nim APK i wykonaj skanowanie drozer" diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 2dde805a..4d5abe57 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-16 09:19+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" @@ -62,6 +62,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" não tem ficheiro de metadados correspondente!" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -147,10 +151,6 @@ msgstr "opção %s não leva um valor" msgid "'keypass' not found in config.yml!" msgstr "'keypass' não foi encontrada em config.yml!" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "'keypass' não foi encontrada em config.yml!" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "\"keystore\" é NONE e \"smartcardoptions\" está vazio!" @@ -159,26 +159,14 @@ msgstr "\"keystore\" é NONE e \"smartcardoptions\" está vazio!" msgid "'keystore' not found in config.yml!" msgstr "'keystore' não encontrada em config.yml!" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "'keystore' não foi encontrada em config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' não encontrada em config.yml!" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' não foi encontrada em config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' não encontrada em config.yml!" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' não foi encontrada em config.yml!" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -455,17 +443,10 @@ msgstr "Verificação de actualizações das aplicações" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Verificando o arquivamento para {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "Limpar depois que todos os escaneamentos terminarem" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "Limpar antes do escanemento começar e recompilar o container" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" -msgstr "Limpar todos os containers e então sair" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Verificando o arquivamento para {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -516,10 +497,6 @@ msgstr "Não foi possível localizar {path} para removê-lo" msgid "Could not open APK {path} for analysis: " msgstr "Não foi possível abrir o APK {path} para análise: " -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "Não foi possível abrir ficheiro APK para análise" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -791,10 +768,6 @@ msgstr "Falha ao alinhar a aplicação" msgid "Failed to create S3 bucket: {url}" msgstr "Falha ao criar o bucket S3: {url}" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "Falha ao obter informações de manifesto do APK" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -805,6 +778,10 @@ msgstr "Falha ao obter informações do APK, apagando {path}" msgid "Failed to get APK information, skipping {path}" msgstr "Falha ao obter informações do APK, ignorando {path}" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "Falha ao obter informações de manifesto do APK" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1315,10 +1292,6 @@ msgstr "Nada a fazer para {appid}." msgid "Now set these in config.yml:" msgstr "Agora configure estes em config.yml:" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "Agora, configure estes em config.yml:" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1386,10 +1359,6 @@ msgstr "Saída do JSON" msgid "Overall license of the project." msgstr "Licença geral do projeto." -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "Substituir o caminho para os APKs do repositório (predefinição: ./repo)" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1428,13 +1397,6 @@ msgstr "Caminho para o repositório git para usar como log" msgid "Path to the keystore for the repo signing key" msgstr "Caminho até a keystore para a chave de assinatura do repositório" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "Preparar Drozer para executar uma verificação" - -msgid "Prepare drozer to run a scan" -msgstr "Preparar Drozer para executar uma verificação" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Imprimir a variável secreta para o terminal para copiar/colar fácilmente" @@ -1591,10 +1553,6 @@ msgstr "Executando a primeira passagem com a verificação de MD5 desativada" msgid "Running wget in {path}" msgstr "Executando o wget em {path}" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "Escanear apenas a versão mais recente de cada pacote" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Procure no(s) APK(s) resultante(s) por classes conhecidas não livres." @@ -1645,13 +1603,6 @@ msgstr "Falha ao definir o limite de ficheiros abertos: " msgid "Setting {0} sec timeout for this build" msgstr "Definindo o tempo limite de {0} seg para esta compilação" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "Configure um emulador, instale o APK nele e execute um scan do Drozer" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "Configure um emulador, instale o APK nele e execute um scan do drozer" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Assinar e pôr os pacotes no repositório" @@ -1781,6 +1732,17 @@ msgstr "Há uma colisão do keyalias - publicação parada" msgid "These are the apps that have been archived from the main repo." msgstr "Estas são as aplicações que foram arquivadas do repositório principal." +#: ../fdroidserver/common.py +#, fuzzy +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" +"\n" +" Este é um repositório de apps a serem usados com o FDroid.\n" +" Aplicações neste repositório são binários oficiais compilados pelos\n" +" programadores da aplicação original ou são binários compilados da\n" +" fonte por f-droid.org a usar as ferramentas em https://gitlab.com/fdroid.\n" +" " + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1790,10 +1752,6 @@ msgstr "Este repositório já tem metadados locais: %s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Para usar o awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "A URL deve começar com https:// ou http://" @@ -2023,9 +1981,6 @@ msgstr "Usar servidor de compilação" msgid "Use date from APK instead of current time for newly added APKs" msgstr "Use da data do APK em vez do tempo atual para APKs recém-adicionados" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "Use a data do APK em vez do tempo atual para APKs recém-adicionados" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2153,8 +2108,8 @@ msgstr "applicationId para verificar se há atualizações" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId com versionCode opcional na forma APPID[:VERCODE]" @@ -2513,6 +2468,11 @@ msgstr "Recusado o download via conexão HTTP insegura (use HTTPS ou especifique msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "Recusado o download via conexão http insegura (use https ou especifique --no-https-check): {apkfilename}" +#: ../fdroidserver/index.py +#, fuzzy, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "repo_icon %s não existe, a gerar um espaço reservado." + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2716,6 +2676,11 @@ msgstr "{file} está em branco ou corrompido!" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\" não existe! Corrija-o no config.yml." +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "{name} \"{path}\" não existe! Corrija-o no config.yml." + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" @@ -2773,3 +2738,33 @@ msgstr[1] "{} compilações com sucesso" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "Não é possível encontrar um appid para {path} 1!" + +#~ msgid "Clean after all scans have finished" +#~ msgstr "Limpar depois que todos os escaneamentos terminarem" + +#~ msgid "Clean before the scans start and rebuild the container" +#~ msgstr "Limpar antes do escanemento começar e recompilar o container" + +#~ msgid "Clean up all containers and then exit" +#~ msgstr "Limpar todos os containers e então sair" + +#~ msgid "Could not open APK file for analysis" +#~ msgstr "Não foi possível abrir ficheiro APK para análise" + +#~ msgid "Override path for repo APKs (default: ./repo)" +#~ msgstr "Substituir o caminho para os APKs do repositório (predefinição: ./repo)" + +#~ msgid "Prepare Drozer to run a scan" +#~ msgstr "Preparar Drozer para executar uma verificação" + +#~ msgid "Prepare drozer to run a scan" +#~ msgstr "Preparar Drozer para executar uma verificação" + +#~ msgid "Scan only the latest version of each package" +#~ msgstr "Escanear apenas a versão mais recente de cada pacote" + +#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +#~ msgstr "Configure um emulador, instale o APK nele e execute um scan do Drozer" + +#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" +#~ msgstr "Configure um emulador, instale o APK nele e execute um scan do drozer" diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 71820f83..252be365 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-14 21:33+0000\n" "Last-Translator: Rafael Fontenelle \n" "Language-Team: Portuguese (Brazil) \n" @@ -68,6 +68,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" não tem arquivo de metadados correspondente!" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -153,10 +157,6 @@ msgstr "opção %s não leva um valor" msgid "'keypass' not found in config.yml!" msgstr "'keypass' não foi encontrada em config.yml!" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "\"keypass\" não encontrada em config.yml!" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "\"keystore\" é NONE e \"smartcardoptions\" está vazia!" @@ -165,26 +165,14 @@ msgstr "\"keystore\" é NONE e \"smartcardoptions\" está vazia!" msgid "'keystore' not found in config.yml!" msgstr "'keystore' não encontrada em config.yml!" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "\"keystore\" não encontrada em config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' não encontrada em config.yml!" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "\"keystorepass\" não encontrada em config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' não encontrada em config.yml!" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "\"repo_keyalias\" não encontrada em config.yml!" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -461,17 +449,10 @@ msgstr "Verifica se existem atualizações para os aplicativos" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Verificar o arquivamento de {appid} - APKs: {integer}, Versões Mantidas: {keep}, Arcos de APKs: {arch}" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "Limpar depois que todos os escaneamentos terminarem" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "Limpar antes do escanemento começar e recompilar o container" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" -msgstr "Limpar todos os containers e então sair" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Verificar o arquivamento de {appid} - APKs: {integer}, Versões Mantidas: {keep}, Arcos de APKs: {arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -522,10 +503,6 @@ msgstr "Impossível encontrar {path} para removê-lo" msgid "Could not open APK {path} for analysis: " msgstr "Impossível abrir o APK {path} para análise: " -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "Impossível abrir o arquivo de APK para analisá-lo" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -797,10 +774,6 @@ msgstr "Falha ao alinhar a aplicação" msgid "Failed to create S3 bucket: {url}" msgstr "Falha ao criar o Balde do S3: {url}" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "Falha ao obter informações de manifesto do APK" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -811,6 +784,10 @@ msgstr "Falha ao obter informações do APK, excluindo {path}" msgid "Failed to get APK information, skipping {path}" msgstr "Falha ao obter informações do APK, ignorando {path}" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "Falha ao obter informações de manifesto do APK" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1321,10 +1298,6 @@ msgstr "Nada a fazer para {appid}." msgid "Now set these in config.yml:" msgstr "Agora defina estes em config.yml:" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "Agora, defina estes em config.yml:" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1392,10 +1365,6 @@ msgstr "Emitindo JSON" msgid "Overall license of the project." msgstr "Licença geral do projeto." -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "Substituir o caminho para os APKs do repositório (padrão: ./repo)" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1434,13 +1403,6 @@ msgstr "Caminho para o repositório git para usar como log" msgid "Path to the keystore for the repo signing key" msgstr "Caminho até a keystore para a chave de assinatura do repositório" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "Preparar o Drozer para executar uma varredura" - -msgid "Prepare drozer to run a scan" -msgstr "Preparar o Drozer para fazer um escaneamento" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Imprima a variável secreta no terminal para facilitar a cópia/colagem" @@ -1597,10 +1559,6 @@ msgstr "Execução da primeira passagem com a verificação do MD5 desativada" msgid "Running wget in {path}" msgstr "Executando o 'wget' em {path}" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "Escanear apenas a versão mais recente de cada pacote" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Verifique os APKs resultantes na busca das classes não gratuitas já conhecidas." @@ -1651,13 +1609,6 @@ msgstr "A configuração do limite de arquivos abertos falhou: " msgid "Setting {0} sec timeout for this build" msgstr "Definindo {0} segundos como tempo limite de para esta compilação" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "Configurar um emulador, instalar o APK nele e escanear com o Drozer" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "Configurar um emulador, instalar o APK nele e escanear com o drozer" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Assina e coloca pacotes no repositório" @@ -1787,6 +1738,18 @@ msgstr "Há uma colisão do keyalias - publicação parada" msgid "These are the apps that have been archived from the main repo." msgstr "Estas são as aplicações que foram arquivadas a partir do repositório principal." +#: ../fdroidserver/common.py +#, fuzzy +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" +"\n" +" Este é um repositório de aplicativos a serem usados com o FDroid. Os\n" +" aplicativos neste repositório são binários oficiais compilados pelos\n" +" desenvolvedores do aplicativo original ou são binários compilados a\n" +" partir da fonte por f-droid.org usando as ferramentas em\n" +" https://gitlab.com/fdroid.\n" +" " + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1796,10 +1759,6 @@ msgstr "Este repositório já tem metadados locais: %s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Para usar awsbucket, awssecretkey and awsaccesskeyid também devem ser definidos em config.yml!" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "A URL deve começar com https:// ou http://" @@ -2029,9 +1988,6 @@ msgstr "Usar servidor de compilação" msgid "Use date from APK instead of current time for newly added APKs" msgstr "Usar a data do APK ao invés do horário atual para APKs recentemente adicionados" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "Usar a data do APK ao invés do horário atual para APKs recentemente adicionados" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2159,8 +2115,8 @@ msgstr "applicationId para verificar se há atualizações" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId com versionCode opcional na forma APPID[:VERCODE]" @@ -2519,6 +2475,11 @@ msgstr "Recuse o download inseguro via conexão HTTP (use HTTPS ou especifique - msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "Recuse o download insegura via conexão http (use https ou especifique --no-https-check): {apkfilename}" +#: ../fdroidserver/index.py +#, fuzzy, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "repo_icon %s não existe, gerando um espaço reservado." + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2722,6 +2683,11 @@ msgstr "o {file} está vazio ou está corrompido!" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\" não existe! Corrija-o no config.yml." +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "{name} \"{path}\" não existe! Corrija-o no config.yml." + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" @@ -2787,12 +2753,39 @@ msgstr[1] "{} compilações foram bem sucedidas" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "Não é possível encontrar um appid para {path} 1!" -#~ msgid "Clean update - don't uses caches, reprocess all APKs" -#~ msgstr "Atualização limpa - não usa cache, reprocessa todos os APKs" +#~ msgid "Clean after all scans have finished" +#~ msgstr "Limpar depois que todos os escaneamentos terminarem" + +#~ msgid "Clean before the scans start and rebuild the container" +#~ msgstr "Limpar antes do escanemento começar e recompilar o container" + +#~ msgid "Clean up all containers and then exit" +#~ msgstr "Limpar todos os containers e então sair" + +#~ msgid "Could not open APK file for analysis" +#~ msgstr "Impossível abrir o arquivo de APK para analisá-lo" #~ msgid "Interactively ask about things that need updating." #~ msgstr "Perguntar interativamente sobre elementos que precisam de atualização." +#~ msgid "Override path for repo APKs (default: ./repo)" +#~ msgstr "Substituir o caminho para os APKs do repositório (padrão: ./repo)" + +#~ msgid "Prepare Drozer to run a scan" +#~ msgstr "Preparar o Drozer para executar uma varredura" + +#~ msgid "Prepare drozer to run a scan" +#~ msgstr "Preparar o Drozer para fazer um escaneamento" + +#~ msgid "Scan only the latest version of each package" +#~ msgstr "Escanear apenas a versão mais recente de cada pacote" + +#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +#~ msgstr "Configurar um emulador, instalar o APK nele e escanear com o Drozer" + +#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" +#~ msgstr "Configurar um emulador, instalar o APK nele e escanear com o drozer" + #~ msgid "Specify editor to use in interactive mode. Default " #~ msgstr "Especifique o editor a ser usado no modo interativo. Padrão " diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index f66f4729..739c28e5 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-16 09:19+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" @@ -65,6 +65,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" não tem ficheiro de metadados correspondente!" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -150,10 +154,6 @@ msgstr "opção %s não leva um valor" msgid "'keypass' not found in config.yml!" msgstr "'keypass' não foi encontrada em config.yml!" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "'keypass' não foi encontrada em config.yml!" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "\"keystore\" é NONE e \"smartcardoptions\" está vazio!" @@ -162,26 +162,14 @@ msgstr "\"keystore\" é NONE e \"smartcardoptions\" está vazio!" msgid "'keystore' not found in config.yml!" msgstr "'keystore' não encontrada em config.yml!" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "'keystore' não foi encontrada em config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' não encontrada em config.yml!" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' não foi encontrada em config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' não encontrada em config.yml!" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' não foi encontrada em config.yml!" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -458,17 +446,10 @@ msgstr "Verificação de actualizações das aplicações" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Verificando o arquivamento para {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "Limpar depois que todos os escaneamentos terminarem" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "Limpar antes do escanemento começar e recompilar o container" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" -msgstr "Limpar todos os containers e então sair" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Verificando o arquivamento para {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -519,10 +500,6 @@ msgstr "Não foi possível localizar {path} para removê-lo" msgid "Could not open APK {path} for analysis: " msgstr "Não foi possível abrir o APK {path} para análise: " -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "Não foi possível abrir ficheiro APK para análise" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -794,10 +771,6 @@ msgstr "Falha ao alinhar a aplicação" msgid "Failed to create S3 bucket: {url}" msgstr "Falha ao criar o bucket S3: {url}" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "Falha ao obter informações de manifesto do APK" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -808,6 +781,10 @@ msgstr "Falha ao obter informações do APK, apagando {path}" msgid "Failed to get APK information, skipping {path}" msgstr "Falha ao obter informações do APK, ignorando {path}" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "Falha ao obter informações de manifesto do APK" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1318,10 +1295,6 @@ msgstr "Nada a fazer para {appid}." msgid "Now set these in config.yml:" msgstr "Agora configure estes em config.yml:" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "Agora, configure estes em config.yml:" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1389,10 +1362,6 @@ msgstr "Saída do JSON" msgid "Overall license of the project." msgstr "Licença geral do projeto." -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "Substituir o caminho para os APKs do repositório (predefinição: ./repo)" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1431,13 +1400,6 @@ msgstr "Caminho para o repositório git para usar como log" msgid "Path to the keystore for the repo signing key" msgstr "Caminho até a keystore para a chave de assinatura do repositório" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "Preparar Drozer para executar uma verificação" - -msgid "Prepare drozer to run a scan" -msgstr "Preparar Drozer para executar uma verificação" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Imprimir a variável secreta para o terminal para copiar/colar fácilmente" @@ -1594,10 +1556,6 @@ msgstr "Executando a primeira passagem com a verificação de MD5 desativada" msgid "Running wget in {path}" msgstr "Executando o wget em {path}" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "Escanear apenas a versão mais recente de cada pacote" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Procure no(s) APK(s) resultante(s) por classes conhecidas não livres." @@ -1648,13 +1606,6 @@ msgstr "Falha ao definir o limite de ficheiros abertos: " msgid "Setting {0} sec timeout for this build" msgstr "Definindo o tempo limite de {0} seg para esta compilação" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "Configure um emulador, instale o APK nele e execute um scan do Drozer" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "Configure um emulador, instale o APK nele e execute um scan do drozer" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Assinar e pôr os pacotes no repositório" @@ -1784,6 +1735,17 @@ msgstr "Há uma colisão do keyalias - publicação parada" msgid "These are the apps that have been archived from the main repo." msgstr "Estas são as aplicações que foram arquivadas do repositório principal." +#: ../fdroidserver/common.py +#, fuzzy +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" +"\n" +" Este é um repositório de apps a serem usados com o FDroid.\n" +" Aplicações neste repositório são binários oficiais compilados pelos\n" +" programadores da aplicação original ou são binários compilados da\n" +" fonte por f-droid.org a usar as ferramentas em https://gitlab.com/fdroid.\n" +" " + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1793,10 +1755,6 @@ msgstr "Este repositório já tem metadados locais: %s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Para usar o awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "A URL deve começar com https:// ou http://" @@ -2026,9 +1984,6 @@ msgstr "Usar servidor de compilação" msgid "Use date from APK instead of current time for newly added APKs" msgstr "Use da data do APK em vez do tempo atual para APKs recém-adicionados" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "Use a data do APK em vez do tempo atual para APKs recém-adicionados" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2156,8 +2111,8 @@ msgstr "applicationId para verificar se há atualizações" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId com versionCode opcional na forma APPID[:VERCODE]" @@ -2516,6 +2471,11 @@ msgstr "Recusado o download via conexão HTTP insegura (use HTTPS ou especifique msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "Recusado o download via conexão http insegura (use https ou especifique --no-https-check): {apkfilename}" +#: ../fdroidserver/index.py +#, fuzzy, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "repo_icon %s não existe, a gerar um espaço reservado." + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2719,6 +2679,11 @@ msgstr "{file} está em branco ou corrompido!" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\" não existe! Corrija-o no config.yml." +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "{name} \"{path}\" não existe! Corrija-o no config.yml." + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" @@ -2776,3 +2741,33 @@ msgstr[1] "{} compilações com sucesso" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "Não é possível encontrar um appid para {path} 1!" + +#~ msgid "Clean after all scans have finished" +#~ msgstr "Limpar depois que todos os escaneamentos terminarem" + +#~ msgid "Clean before the scans start and rebuild the container" +#~ msgstr "Limpar antes do escanemento começar e recompilar o container" + +#~ msgid "Clean up all containers and then exit" +#~ msgstr "Limpar todos os containers e então sair" + +#~ msgid "Could not open APK file for analysis" +#~ msgstr "Não foi possível abrir ficheiro APK para análise" + +#~ msgid "Override path for repo APKs (default: ./repo)" +#~ msgstr "Substituir o caminho para os APKs do repositório (predefinição: ./repo)" + +#~ msgid "Prepare Drozer to run a scan" +#~ msgstr "Preparar Drozer para executar uma verificação" + +#~ msgid "Prepare drozer to run a scan" +#~ msgstr "Preparar Drozer para executar uma verificação" + +#~ msgid "Scan only the latest version of each package" +#~ msgstr "Escanear apenas a versão mais recente de cada pacote" + +#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +#~ msgstr "Configure um emulador, instale o APK nele e execute um scan do Drozer" + +#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" +#~ msgstr "Configure um emulador, instale o APK nele e execute um scan do drozer" diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index b04b8ce2..89a2f9dd 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-14 21:33+0000\n" "Last-Translator: Daniel Șerbănescu \n" "Language-Team: Romanian \n" @@ -50,6 +50,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -136,10 +140,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -148,26 +148,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -445,16 +433,9 @@ msgstr "" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -506,10 +487,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -777,10 +754,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -791,6 +764,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1301,10 +1278,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1372,10 +1345,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1414,13 +1383,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1577,10 +1539,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1632,13 +1590,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "" @@ -1768,6 +1719,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1777,10 +1732,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2010,9 +1961,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2140,8 +2088,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2502,6 +2450,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2706,6 +2659,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index dd200c4b..59dec8a2 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-14 21:33+0000\n" "Last-Translator: Golubev Alexander \n" "Language-Team: Russian \n" @@ -70,6 +70,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "У \"%s/\" нет соответствующего файла метаданных!" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -156,10 +160,6 @@ msgstr "%s параметр не принимает значений" msgid "'keypass' not found in config.yml!" msgstr "В config.yml нет переменной 'keypass'!" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "'keypass' не найден в config.yml!" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "Значение 'keystore` — NONE, но 'smartcardoptions' не задан!" @@ -168,26 +168,14 @@ msgstr "Значение 'keystore` — NONE, но 'smartcardoptions' не за msgid "'keystore' not found in config.yml!" msgstr "В config.yml нет переменной 'keystore'!" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "'keystore' не найден в config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "В config.yml нет переменной 'keystorepass'!" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' не найден в config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "В config.yml нет переменной 'repo_ keyalias'!" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' не найден в config.yml!" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -465,17 +453,10 @@ msgstr "Проверить обновления для приложений" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Проверка перед помещением в архив для {appid}. APKs:{integer}, keepversions:{keep}, archapks:{arch}" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "Очистить после завершения сканирования" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "Очистить до начала сканирования и пересоздать контейнер" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" -msgstr "Очистить все контейнеры и выйти" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Проверка перед помещением в архив для {appid}. APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -526,10 +507,6 @@ msgstr "Указанный для удаления {path} не найден" msgid "Could not open APK {path} for analysis: " msgstr "Не удалось открыть и проанализировать файл APK {path}: " -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "Не удалось открыть и проанализировать файл APK" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -801,10 +778,6 @@ msgstr "Оптимизировать (align) приложение не удал msgid "Failed to create S3 bucket: {url}" msgstr "Создать S3 объект (S3 bucket) не получилось: {url}" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "Извлечь информацию из APK манифеста не получилось" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -815,6 +788,10 @@ msgstr "Не удалось получить информацию об APK фа msgid "Failed to get APK information, skipping {path}" msgstr "Не удалось получить информацию об APK файле, {path} будет пропущен" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "Извлечь информацию из APK манифеста не получилось" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1325,10 +1302,6 @@ msgstr "Автоматические обновления для {appid} нед msgid "Now set these in config.yml:" msgstr "Определите эти переменные в config.yml:" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "Определите эти переменные в config.yml:" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1396,10 +1369,6 @@ msgstr "Выводится JSON" msgid "Overall license of the project." msgstr "Основная лицензия проекта." -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "Переопределить путь к APK файлам репозитория (по умолчанию это ./repo)" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1438,13 +1407,6 @@ msgstr "Путь к репозиторию git, который будет ото msgid "Path to the keystore for the repo signing key" msgstr "Путь к хранилищу с ключом для подписывания" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "Подготовка Drozer к сканированию репозитория" - -msgid "Prepare drozer to run a scan" -msgstr "Подготовка к сканированию Drozer" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Отобразить секретную переменную в терминале (чтобы ее было легче скопировать и вставить)" @@ -1601,10 +1563,6 @@ msgstr "Первая попытка загрузить данные (выпол msgid "Running wget in {path}" msgstr "Выполняется wget в {path}" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "Сканировать только самую свежую версию каждого пакета" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Проскандировать получившиеся APK на известные несвободные классы." @@ -1656,13 +1614,6 @@ msgstr "Не удалось настроить ограничение для к msgid "Setting {0} sec timeout for this build" msgstr "Время ожидания для этой сборки выставляется в {0} секунд" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "Настроить эмулятор, установить в него APK и запустить сканирование Drozer" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "Настроить эмулятор, установить в него APK и запустить сканирование Drozer" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Подписать пакеты и поместить в репозиторий" @@ -1792,6 +1743,18 @@ msgstr "Есть расхождения в алиасах ключей для п msgid "These are the apps that have been archived from the main repo." msgstr "Это те приложения, которые были заархивированы из основного репозитория." +#: ../fdroidserver/common.py +#, fuzzy +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" +"\n" +" Это репозиторий приложений, предназначенных для использования в FDroid.\n" +" Приложения в этом репозитории являются либо официальными бинарными файлами,\n" +" созданными разработчиками оригинального приложения, либо бинарными файлами,\n" +" созданными f-droid.org из исходного кода с помощью инструментов\n" +" на https://gitlab.com/fdroid.\n" +" " + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1801,10 +1764,6 @@ msgstr "Локальная копия метаданных репозитори msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Необходимо определить переменные awsbucket, awssecretkey и awsaccesskeyid в config.yml!" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Чтобы использовать awsbucket необходимо определить awssecretkey и awsaccesskeyid в config.yml!" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL должна начинаться с https:// или http://" @@ -2034,9 +1993,6 @@ msgstr "Использовать сервер сборки" msgid "Use date from APK instead of current time for newly added APKs" msgstr "Использовать время date из APK вместо текущего при добавлении новых APK" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "Использовать время date из APK вместо текущего при добавлении новых APK" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2164,8 +2120,8 @@ msgstr "applicationId для проверки обновлений" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId и внутренняя версия приложения (versionCode) в виде APPID[:VERCODE]" @@ -2526,6 +2482,11 @@ msgstr "использовать для загрузки небезопасно msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "использовать для загрузки небезопасное HTTP-соединение не стоит (пользуйтесь HTTPS или укажите --no-https-check): {apkfilename}" +#: ../fdroidserver/index.py +#, fuzzy, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "значок репозитория (repo_icon) '%s' не существует, генерируется суррогат." + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2730,6 +2691,11 @@ msgstr "{file} пустой или повреждённый!" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name}: неверный путь \"{path}\"! Поправьте его в config.yml." +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "{name}: неверный путь \"{path}\"! Поправьте его в config.yml." + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" @@ -2789,3 +2755,33 @@ msgstr[2] "{} успешных сборок" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "По указанному пути {path} не удалось найти appid!" + +#~ msgid "Clean after all scans have finished" +#~ msgstr "Очистить после завершения сканирования" + +#~ msgid "Clean before the scans start and rebuild the container" +#~ msgstr "Очистить до начала сканирования и пересоздать контейнер" + +#~ msgid "Clean up all containers and then exit" +#~ msgstr "Очистить все контейнеры и выйти" + +#~ msgid "Could not open APK file for analysis" +#~ msgstr "Не удалось открыть и проанализировать файл APK" + +#~ msgid "Override path for repo APKs (default: ./repo)" +#~ msgstr "Переопределить путь к APK файлам репозитория (по умолчанию это ./repo)" + +#~ msgid "Prepare Drozer to run a scan" +#~ msgstr "Подготовка Drozer к сканированию репозитория" + +#~ msgid "Prepare drozer to run a scan" +#~ msgstr "Подготовка к сканированию Drozer" + +#~ msgid "Scan only the latest version of each package" +#~ msgstr "Сканировать только самую свежую версию каждого пакета" + +#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +#~ msgstr "Настроить эмулятор, установить в него APK и запустить сканирование Drozer" + +#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" +#~ msgstr "Настроить эмулятор, установить в него APK и запустить сканирование Drozer" diff --git a/locale/sk/LC_MESSAGES/fdroidserver.po b/locale/sk/LC_MESSAGES/fdroidserver.po index 84159a73..20b3bf50 100644 --- a/locale/sk/LC_MESSAGES/fdroidserver.po +++ b/locale/sk/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -49,6 +49,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -135,10 +139,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -147,26 +147,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -444,16 +432,9 @@ msgstr "" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -505,10 +486,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -776,10 +753,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -790,6 +763,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1300,10 +1277,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1371,10 +1344,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1413,13 +1382,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1576,10 +1538,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1631,13 +1589,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "" @@ -1767,6 +1718,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1776,10 +1731,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2009,9 +1960,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2139,8 +2087,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2501,6 +2449,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2705,6 +2658,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index ac92e7b2..eabf5743 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-29 10:51+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" @@ -63,6 +63,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" s’ka kartel tejtëdhënash me përputhje!" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -148,10 +152,6 @@ msgstr "Mundësia %s s’merr ndonjë vlerë" msgid "'keypass' not found in config.yml!" msgstr "S’u gjet 'keypass' në config.yml!" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "S’u gjet 'keypass' në config.yml!" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' është NONE dhe 'smartcardoptions' është e zbrazët!" @@ -160,26 +160,14 @@ msgstr "'keystore' është NONE dhe 'smartcardoptions' është e zbrazët!" msgid "'keystore' not found in config.yml!" msgstr "S’u gjet 'keystore' në config.yml!" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "S’u gjet 'keystore' në config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "S’u gjet 'keystorepass' te config.yml!" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "S’u gjet 'keystorepass' te config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "S’u gjet 'repo_keyalias' te config.yml!" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "S’u gjet 'repo_keyalias' te config.yml!" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -456,17 +444,10 @@ msgstr "Kontrollo për përditësime aplikacionesh" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Po kontrollohet arkivimi përr {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "Pastroje, pasi të kenë përfunduar krejt skanimet" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "Pastrojeni përpara se të fillojnë skanimet dhe të rimontohet kontejneri" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" -msgstr "Pastroji krejt kontejnerët dhe mandej dil" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Po kontrollohet arkivimi përr {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -517,10 +498,6 @@ msgstr "S’u gjet dot {path} për ta hequr" msgid "Could not open APK {path} for analysis: " msgstr "S’u hap dot kartela APK {path} për analizim : " -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "S’u hap dot kartela APK për analizim" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -792,10 +769,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "S’u arrit të krijohej bucket S3: {url}" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "S’u arrit të merren të dhëna manifesti APK-je" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -806,6 +779,10 @@ msgstr "S’u arrit të merren të dhëna APK-je, po fshihet {path}" msgid "Failed to get APK information, skipping {path}" msgstr "S’u arrit të merren të dhëna APK-je, po anashkalohet {path}" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "S’u arrit të merren të dhëna manifesti APK-je" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1317,11 +1294,6 @@ msgstr "S’ka ç’bëhet për {appid}." msgid "Now set these in config.yml:" msgstr "Tani, ujdisini këto te config.yml:" -#: ../fdroidserver/init.py -#, fuzzy -msgid "Now set these in config.yml:" -msgstr "Tani, ujdisini këto te config.yml:" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1389,10 +1361,6 @@ msgstr "" msgid "Overall license of the project." msgstr "Licenca e përgjithshme e projektit." -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "Shteg anashkalimi për APK-ra depoje (parazgjedhje: ./repo)" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1431,13 +1399,6 @@ msgstr "Shteg për te depo git për t’u përdorur si regjistri" msgid "Path to the keystore for the repo signing key" msgstr "Shteg për te depo kyçesh për kyçin e nënshkrimit të depos" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "Përgatite Drozer-in të bëjë një skanim" - -msgid "Prepare drozer to run a scan" -msgstr "Përgatite Drozer-in të kryejë një skanim" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Shtype ndryshoren e fshehtë te terminali, për kopjim/ngjitje të kollajtë" @@ -1594,10 +1555,6 @@ msgstr "Po xhirohet kalimi i parë me kontrollin MD5 të çaktivizuar" msgid "Running wget in {path}" msgstr "Po xhirohet wget te {path}" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "Skano vetëm versionin më të ri të çdo pakete" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Kontrollo për klasa jo të lira të ditura APK-në(të) e prodhuara." @@ -1648,13 +1605,6 @@ msgstr "Dështoi ujdisje kufiri hapjesh kartelash: " msgid "Setting {0} sec timeout for this build" msgstr "Po ujdiset mbarim kohe {0} sekonda për këtë montim" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "Ujdisni një emulues, instaloni në të APK-në dhe kryeni një skanim Drozer" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "Ujdisni një emulues, instaloni në të APK-në dhe kryeni një skanim Drozer" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Nënshkruani dhe vendosni paketa te depoja" @@ -1784,6 +1734,17 @@ msgstr "Ka një përplasje keyalias-i - botimi u ndal" msgid "These are the apps that have been archived from the main repo." msgstr "Këto janë aplikacionet që janë arkivuar nga depoja kryesore." +#: ../fdroidserver/common.py +#, fuzzy +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" +"\n" +" Kjo është një depo aplikacionesh për t’u përdorur me FDroid. Aplikacionet\n" +" në këtë depo ose janë dyorë zyrtarë të montuar nga zhvilluesit e aplikacionit\n" +" origjinal, ose janë dyorë të montuar nga burimi prej f-droid.org duke përdorur\n" +" mjetet në https://gitlab.com/fdroid.\n" +" " + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1793,11 +1754,6 @@ msgstr "Kjo depo ka tashmë tejtëdhëna vendore: %s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Për të përdorur awsbucket, te config.yml duhen ujdisur edhe awssecretkey dhe awsaccesskey!" -#: ../fdroidserver/deploy.py -#, fuzzy -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Për të përdorur awsbucket, te config.yml duhen ujdisur edhe awssecretkey dhe awsaccesskey!" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL-ja duhet të fillojë me https:// ose http://" @@ -2027,9 +1983,6 @@ msgstr "Përdor shërbyes montimesh" msgid "Use date from APK instead of current time for newly added APKs" msgstr "Për APK-ra të shtuara rishtazi, përdor datë prej APK-je, në vend se kohën e tanishme" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "Për APK-ra të shtuara rishtazi, përdor datë prej APK-je, në vend se të kohës së tanishme" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2157,8 +2110,8 @@ msgstr "applicationId për të cilin të kontrollohet për përditësime" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId me versionCode opsional në formën APPID[:VERCODE]" @@ -2517,6 +2470,11 @@ msgstr "refuzo shkarkim përmes lidhjeje HTTP të pasigurt (përdorni HTTPS ose msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "mos pranon shkarkim përmes lidhjeje http të pasigurt (përdorni https ose specifikoni --no-https-check): {apkfilename}" +#: ../fdroidserver/index.py +#, fuzzy, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "repo_icon %s s’ekziston, po prodhohet vendmbajtëse." + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2720,6 +2678,11 @@ msgstr "{file} është e zbrazët ose e dëmtuar!" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\" s’ekziston! Ndreqeni te config.yml." +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "{name} \"{path}\" s’ekziston! Ndreqeni te config.yml." + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" @@ -2777,3 +2740,33 @@ msgstr[1] "{} dolën me sukses" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "S’gjendet dot një appid për {path}!" + +#~ msgid "Clean after all scans have finished" +#~ msgstr "Pastroje, pasi të kenë përfunduar krejt skanimet" + +#~ msgid "Clean before the scans start and rebuild the container" +#~ msgstr "Pastrojeni përpara se të fillojnë skanimet dhe të rimontohet kontejneri" + +#~ msgid "Clean up all containers and then exit" +#~ msgstr "Pastroji krejt kontejnerët dhe mandej dil" + +#~ msgid "Could not open APK file for analysis" +#~ msgstr "S’u hap dot kartela APK për analizim" + +#~ msgid "Override path for repo APKs (default: ./repo)" +#~ msgstr "Shteg anashkalimi për APK-ra depoje (parazgjedhje: ./repo)" + +#~ msgid "Prepare Drozer to run a scan" +#~ msgstr "Përgatite Drozer-in të bëjë një skanim" + +#~ msgid "Prepare drozer to run a scan" +#~ msgstr "Përgatite Drozer-in të kryejë një skanim" + +#~ msgid "Scan only the latest version of each package" +#~ msgstr "Skano vetëm versionin më të ri të çdo pakete" + +#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +#~ msgstr "Ujdisni një emulues, instaloni në të APK-në dhe kryeni një skanim Drozer" + +#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" +#~ msgstr "Ujdisni një emulues, instaloni në të APK-në dhe kryeni një skanim Drozer" diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index 1c146baf..b2fc2597 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-15 13:25+0000\n" "Last-Translator: Elias Mårtenson \n" "Language-Team: Swedish \n" @@ -51,6 +51,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, fuzzy, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -136,10 +140,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -148,26 +148,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -444,16 +432,9 @@ msgstr "Kontrollera efter uppdateringar av appar" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -505,10 +486,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -777,10 +754,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -791,6 +764,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1301,10 +1278,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1372,10 +1345,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1414,13 +1383,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1577,10 +1539,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1631,13 +1589,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Signera och placera paket i förrådet" @@ -1767,6 +1718,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1776,10 +1731,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2009,9 +1960,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2139,8 +2087,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2499,6 +2447,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2702,6 +2655,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index 009ff5b5..b46c2363 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-14 21:33+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" @@ -62,6 +62,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" eşleşen üst veri dosyasına sahip değil!" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -147,10 +151,6 @@ msgstr "%s seçeneği bir değer almaz" msgid "'keypass' not found in config.yml!" msgstr "'keypass' config.yml içinde bulunamadı!" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "'keypass' config.yml içinde bulunamadı!" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' seçeneği NONE ve 'smartcardoptions' seçeneği boş!" @@ -159,26 +159,14 @@ msgstr "'keystore' seçeneği NONE ve 'smartcardoptions' seçeneği boş!" msgid "'keystore' not found in config.yml!" msgstr "'keystore' config.yml içinde bulunamadı!" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "'keystore' config.yml içinde bulunamadı!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' config.yml içinde bulunamadı!" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' config.yml içinde bulunamadı!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' config.yml içinde bulunamadı!" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' config.yml içinde bulunamadı!" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -455,17 +443,10 @@ msgstr "Uygulama güncellemelerini denetle" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "{appid} için arşivleme denetleniyor - APKs:{integer}, keepversions:{keep}, archapks:{arch}" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "Tüm taramalar bitince temizle" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "Taramalar başlamadan önce temizle ve kapsayıcıyı yeniden inşa et" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" -msgstr "Bütün kapsayıcılar temizle ve sonra çık" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "{appid} için arşivleme denetleniyor - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -516,10 +497,6 @@ msgstr "Kaldırmak için {path} bulunamadı" msgid "Could not open APK {path} for analysis: " msgstr "İnceleme için APK {path} açılamadı: " -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "İnceleme için APK dosyası açılamadı" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -791,10 +768,6 @@ msgstr "Uygulama hizalama başarısız oldu" msgid "Failed to create S3 bucket: {url}" msgstr "S3 kovası oluşturulamadı: {url}" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "APK bildirim bilgileri alınamadı" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -805,6 +778,10 @@ msgstr "APK bilgisi alınamadı, {path} siliniyor" msgid "Failed to get APK information, skipping {path}" msgstr "APK bilgisi alınamadı, {path} atlanıyor" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "APK bildirim bilgileri alınamadı" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1315,10 +1292,6 @@ msgstr "{appid} için yapılacak işlem yok." msgid "Now set these in config.yml:" msgstr "Şimdi bunları config.yml içinde ayarlayın:" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "Şimdi bunları config.yml içinde ayarlayın:" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1386,10 +1359,6 @@ msgstr "JSON yazdırılıyor" msgid "Overall license of the project." msgstr "Projenin genel lisansı." -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "Depo APK'ları için konumu geçersiz kıl (öntanımlı olarak: ./repo)" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1428,13 +1397,6 @@ msgstr "Günlük olarak kullanılacak git deposunun konumu" msgid "Path to the keystore for the repo signing key" msgstr "Depo imzalama anahtarı için anahtar deposunun konumu" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "Drozer'i bir tarama çalıştırmak için hazırla" - -msgid "Prepare drozer to run a scan" -msgstr "Drozer'i bir tarama çalıştırmak için hazırla" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Kolay kopyala yapıştır için gizli değişkeni terminale yaz" @@ -1591,10 +1553,6 @@ msgstr "İlk geçiş MD5 doğrulama olmadan çalıştırılıyor" msgid "Running wget in {path}" msgstr "{path} konumunda wget çalıştırılıyor" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "Her paketin sadece en son sürümünü tara" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Bilinen özgür olmayan sınıflar için ortaya çıkan APK'leri tara." @@ -1645,13 +1603,6 @@ msgstr "Açık dosya sınırı ayarı başarısız: " msgid "Setting {0} sec timeout for this build" msgstr "Bu inşa için {0} sn zaman aşımı ayarlanıyor" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "Bir emülatör kur, APKyı ona kur ve bir Drozer taraması yap" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "Bir emülatör kur, APKyı ona kur ve bir Drozer taraması yap" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Paketleri imzala ve depoya yerleştir" @@ -1781,6 +1732,17 @@ msgstr "Bir keyalias çakışması var - yayımlama durdu" msgid "These are the apps that have been archived from the main repo." msgstr "Bunlar ana depodan arşivlenmiş uygulamalardır." +#: ../fdroidserver/common.py +#, fuzzy +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" +"\n" +" Bu, FDroid ile kullanılacak uygulamaların bir deposudur. Bu depodaki\n" +" uygulamalar ya gerçek uygulama geliştiricileri tarafından oluşturulan\n" +" resmi ikili dosyalardır ya da https://gitlab.com/fdroid adresindeki araçlar\n" +" kullanılarak f-droid.org tarafından kaynaktan oluşturulan ikili dosyalardır.\n" +" " + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1790,10 +1752,6 @@ msgstr "Bu deponun zaten yerel üst verisi var: %s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Awsbucket kullanmak için, awssecretkey ve awsaccesskeyid de config.yml içinde ayarlanmalı!" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Awsbucket kullanmak için, awssecretkey ve awsaccesskeyid de config.yml içinde ayarlanmalı!" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL https:// veya http:// ile başlamalı" @@ -2023,9 +1981,6 @@ msgstr "İnşa sunucusu kullan" msgid "Use date from APK instead of current time for newly added APKs" msgstr "Yeni eklenen APKlar için o anki zaman yerine APK'daki tarihi kullan" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "Yeni eklenen APKlar için o anki zaman yerine APK tarihini kullan" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2153,8 +2108,8 @@ msgstr "Güncellemeleri denetlemek için applicationId" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "APPID[:VERCODE] biçiminde applicationId, isteğe bağlı versionCode ile" @@ -2513,6 +2468,11 @@ msgstr "güvensiz HTTP bağlantısı ile indirmeyi reddet (HTTPS kullanın veya msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "güvensiz http bağlantısı ile indirmeyi reddet (https kullanın veya --no-https-check belirtin): {apkfilename}" +#: ../fdroidserver/index.py +#, fuzzy, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "repo_icon %s mevcut değil, yer tutucu oluşturuyor." + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2716,6 +2676,11 @@ msgstr "{file} boş veya bozuk!" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\" yok! config.yml içinde düzeltin." +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "{name} \"{path}\" yok! config.yml içinde düzeltin." + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" @@ -2784,12 +2749,39 @@ msgstr[1] "{} inşa başarılı" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "{path} için bir appid bulunamıyor!" -#~ msgid "Clean update - don't uses caches, reprocess all APKs" -#~ msgstr "Temiz güncelleme - önbellekleri kullanmaz, tüm APKları yeniden işler" +#~ msgid "Clean after all scans have finished" +#~ msgstr "Tüm taramalar bitince temizle" + +#~ msgid "Clean before the scans start and rebuild the container" +#~ msgstr "Taramalar başlamadan önce temizle ve kapsayıcıyı yeniden inşa et" + +#~ msgid "Clean up all containers and then exit" +#~ msgstr "Bütün kapsayıcılar temizle ve sonra çık" + +#~ msgid "Could not open APK file for analysis" +#~ msgstr "İnceleme için APK dosyası açılamadı" #~ msgid "Interactively ask about things that need updating." #~ msgstr "Güncelleme gerektiren şeyler hakkında etkileşimli olarak sor." +#~ msgid "Override path for repo APKs (default: ./repo)" +#~ msgstr "Depo APK'ları için konumu geçersiz kıl (öntanımlı olarak: ./repo)" + +#~ msgid "Prepare Drozer to run a scan" +#~ msgstr "Drozer'i bir tarama çalıştırmak için hazırla" + +#~ msgid "Prepare drozer to run a scan" +#~ msgstr "Drozer'i bir tarama çalıştırmak için hazırla" + +#~ msgid "Scan only the latest version of each package" +#~ msgstr "Her paketin sadece en son sürümünü tara" + +#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +#~ msgstr "Bir emülatör kur, APKyı ona kur ve bir Drozer taraması yap" + +#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" +#~ msgstr "Bir emülatör kur, APKyı ona kur ve bir Drozer taraması yap" + #~ msgid "Specify editor to use in interactive mode. Default " #~ msgstr "Etkileşimli kipte kullanılacak editörü belirtin. Öntanımlı " diff --git a/locale/tzm/LC_MESSAGES/fdroidserver.po b/locale/tzm/LC_MESSAGES/fdroidserver.po index 6708bd32..59bd7fc5 100644 --- a/locale/tzm/LC_MESSAGES/fdroidserver.po +++ b/locale/tzm/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-681-gc19e8952\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2020-10-29 08:32+0000\n" "Last-Translator: Hakim Oubouali \n" "Language-Team: Central Atlas Tamazight \n" @@ -50,6 +50,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -135,10 +139,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -147,26 +147,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -443,16 +431,9 @@ msgstr "" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -504,10 +485,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -775,10 +752,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -789,6 +762,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1299,10 +1276,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1370,10 +1343,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1412,13 +1381,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1575,10 +1537,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1629,13 +1587,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "" @@ -1765,6 +1716,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1774,10 +1729,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2007,9 +1958,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2137,8 +2085,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2497,6 +2445,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2700,6 +2653,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" diff --git a/locale/ug/LC_MESSAGES/fdroidserver.po b/locale/ug/LC_MESSAGES/fdroidserver.po index 6f601cd3..5dcbc691 100644 --- a/locale/ug/LC_MESSAGES/fdroidserver.po +++ b/locale/ug/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2018-06-08 03:44+0000\n" "Last-Translator: ۋولقان \n" "Language-Team: Uyghur \n" @@ -51,6 +51,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -136,10 +140,6 @@ msgstr "" msgid "'keypass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -148,26 +148,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -444,16 +432,9 @@ msgstr "" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -505,10 +486,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -776,10 +753,6 @@ msgstr "" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -790,6 +763,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1300,10 +1277,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1371,10 +1344,6 @@ msgstr "" msgid "Overall license of the project." msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1413,13 +1382,6 @@ msgstr "" msgid "Path to the keystore for the repo signing key" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "" - -msgid "Prepare drozer to run a scan" -msgstr "" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1576,10 +1538,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1630,13 +1588,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "" @@ -1766,6 +1717,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1775,10 +1730,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2008,9 +1959,6 @@ msgstr "" msgid "Use date from APK instead of current time for newly added APKs" msgstr "" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2138,8 +2086,8 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" @@ -2498,6 +2446,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2701,6 +2654,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index c17a734d..b1badb69 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-27 00:33+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" @@ -64,6 +64,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" не має відповідного файлу метаданих!" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -150,10 +154,6 @@ msgstr "%s параметр не приймає значення" msgid "'keypass' not found in config.yml!" msgstr "'keypass' не знайдено в config.yml!" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "'keypass' не знайдено в config.yml!" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' — NONE і 'smartcardoptions' порожній!" @@ -162,26 +162,14 @@ msgstr "'keystore' — NONE і 'smartcardoptions' порожній!" msgid "'keystore' not found in config.yml!" msgstr "'keystore' не знайдено в config.yml!" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "'keystore' не знайдено в config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "'keystorepass' не знайдено в config.yml!" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' не знайдено в config.yml!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' не знайдено в config.yml!" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' не знайдено в config.yml!" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -459,17 +447,10 @@ msgstr "Перевірте наявність оновлень для засто msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Перевірка архівації на {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "Очистити після завершення сканування" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "Очистити перед початком сканування і перебудуйте контейнер" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" -msgstr "Очистити усі контейнери, а потім вийти" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Перевірка архівації на {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -520,10 +501,6 @@ msgstr "Не вдалося знайти шлях {path}, щоб вилучит msgid "Could not open APK {path} for analysis: " msgstr "Не вдалося відкрити файл APK {path} для аналізу: " -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "Не вдалося відкрити файл APK для аналізу" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -795,10 +772,6 @@ msgstr "Не вдалося оптимізувати (align) застосуно msgid "Failed to create S3 bucket: {url}" msgstr "Не вдалося створити сигмент S3: {url}" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "Не вдалося отримати подробиці про APK" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -809,6 +782,10 @@ msgstr "Не вдалося отримати подробиці про APK, {pat msgid "Failed to get APK information, skipping {path}" msgstr "Не вдалося отримати подробиці про APK, {path} буде пропущено" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "Не вдалося отримати подробиці про APK" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1319,10 +1296,6 @@ msgstr "Для {appid} нічого виконувати." msgid "Now set these in config.yml:" msgstr "Тепер встановіть їх у config.yml:" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "Тепер встановіть їх у config.yml:" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1390,10 +1363,6 @@ msgstr "Вивід JSON" msgid "Overall license of the project." msgstr "Загальна ліцензія проекту." -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "Перевизначити шлях для сховища APK-файлів (типово: ./repo)" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1432,13 +1401,6 @@ msgstr "Шлях до сховища git, яке використовуєтьс msgid "Path to the keystore for the repo signing key" msgstr "Шлях до сховища ключа для підписного ключа сховища" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "Підготувати Drozer до початку сканування" - -msgid "Prepare drozer to run a scan" -msgstr "Підготувати drozer для запуску сканування" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Вивести таємну змінну до термінала для легкого копіювання/вставлення" @@ -1595,10 +1557,6 @@ msgstr "Запуск першого проходу з вимкненою пер msgid "Running wget in {path}" msgstr "Запуск wget у {path}" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "Сканувати лише останню версію кожного пакета" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "Перевірити отриманий файл APK на наявність відомих невільних класів." @@ -1650,13 +1608,6 @@ msgstr "Не вдалося встановити обмеження кілько msgid "Setting {0} sec timeout for this build" msgstr "Час очікування для цієї збірки становить {0}" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "Налаштуйте емулятор, встановіть на нього APK та виконайте сканування з Drozer" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "Налаштуйте емулятор, встановіть APK на нього та виконайте drozer сканування" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "Записати та розмістити пакети у сховищеві" @@ -1786,6 +1737,17 @@ msgstr "Відбулося зіткнення keyalias ключів - припи msgid "These are the apps that have been archived from the main repo." msgstr "Це застосунки, заархівовані з основного сховища." +#: ../fdroidserver/common.py +#, fuzzy +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" +"\n" +" Це сховище застосунків для використання з FDroid. Застосунки в цьому\n" +" сховищі — це або офіційні двійкові файли, побудовані за розробниками оригінального\n" +" застосунку, або двійкові файли, побудовані з джерела f-droid.org за допомогою\n" +" інструментів з https://gitlab.com/fdroid.\n" +" " + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1795,10 +1757,6 @@ msgstr "Сховище вже має локальні метадані: %s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Для використання awsbucket, awssecretkey та awsaccesskeyid також слід налаштувати config.yml!" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Для користування awsbucket, awssecretkey та awsaccesskeyid також слід налаштувати їх у config.yml!" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL-адреса має починатися з https:// або http://" @@ -2028,9 +1986,6 @@ msgstr "Використовуйте сервер створення" msgid "Use date from APK instead of current time for newly added APKs" msgstr "Використовуйте дату з APK замість поточного часу для нових доданих APK" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "Використовуйте дату з APK, замість поточного часу для нових доданих APKs" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2158,8 +2113,8 @@ msgstr "applicationId для перевірки наявності оновле #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId з необов'язковим versionCode у формі APPID[:VERCODE]" @@ -2520,6 +2475,11 @@ msgstr "відмовитись від завантаження через неб msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "відмовитись від завантаження через незахищене з'єднання http (користати https чи вказати --no-https-check): {apkfilename}" +#: ../fdroidserver/index.py +#, fuzzy, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "repo_icon %s не існує, створення заповнювача." + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2724,6 +2684,11 @@ msgstr "{file} порожній або пошкоджений!" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\" не існує! Виправте його в config.yml." +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "{name} \"{path}\" не існує! Виправте його в config.yml." + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" @@ -2794,12 +2759,39 @@ msgstr[2] "{} зібрано успішно" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "Не вдається знайти appid за шляхом {path}!" -#~ msgid "Clean update - don't uses caches, reprocess all APKs" -#~ msgstr "Очистити оновлення - не використовує кеш, повторно обробляє всі APKs" +#~ msgid "Clean after all scans have finished" +#~ msgstr "Очистити після завершення сканування" + +#~ msgid "Clean before the scans start and rebuild the container" +#~ msgstr "Очистити перед початком сканування і перебудуйте контейнер" + +#~ msgid "Clean up all containers and then exit" +#~ msgstr "Очистити усі контейнери, а потім вийти" + +#~ msgid "Could not open APK file for analysis" +#~ msgstr "Не вдалося відкрити файл APK для аналізу" #~ msgid "Interactively ask about things that need updating." #~ msgstr "Інтерактивно запитайте про речі, які потребують оновлення." +#~ msgid "Override path for repo APKs (default: ./repo)" +#~ msgstr "Перевизначити шлях для сховища APK-файлів (типово: ./repo)" + +#~ msgid "Prepare Drozer to run a scan" +#~ msgstr "Підготувати Drozer до початку сканування" + +#~ msgid "Prepare drozer to run a scan" +#~ msgstr "Підготувати drozer для запуску сканування" + +#~ msgid "Scan only the latest version of each package" +#~ msgstr "Сканувати лише останню версію кожного пакета" + +#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +#~ msgstr "Налаштуйте емулятор, встановіть на нього APK та виконайте сканування з Drozer" + +#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" +#~ msgstr "Налаштуйте емулятор, встановіть APK на нього та виконайте drozer сканування" + #, fuzzy #~ msgid "Specify editor to use in interactive mode. Default " #~ msgstr "Вкажіть редактор для використання в інтерактивному режимі. За замовчуванням %s" diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index c271db01..8fd0c1c9 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-28 22:09+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Chinese (Simplified) \n" @@ -68,6 +68,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" 没有匹配的元数据文件!" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -152,10 +156,6 @@ msgstr "%s 选项不采用值" msgid "'keypass' not found in config.yml!" msgstr "config.yml中找不到'keypass'!" -#: ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "config.yml 中找不到 'keypass'!" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "'keystore' 没有赋值,'smartcardoptions' 为空!" @@ -164,26 +164,14 @@ msgstr "'keystore' 没有赋值,'smartcardoptions' 为空!" msgid "'keystore' not found in config.yml!" msgstr "config.yml中找不到'keypass'!" -#: ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "config.yml 中找不到'keystore'!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "config.yml中找不到'keystorepass'!" -#: ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "config.yml 中找不到 'keystorepass'!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "config.yml中找不到'repo_keyalias'!" -#: ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "config.yml 中找不到'repo_keyalias'!" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -459,17 +447,10 @@ msgstr "检查应用更新" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "扫描全部完成后清除" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "在扫描启动和容器重新编译之前清除" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" -msgstr "清除所有容器,然后退出" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -520,10 +501,6 @@ msgstr "" msgid "Could not open APK {path} for analysis: " msgstr "" -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -791,10 +768,6 @@ msgstr "未能匹配应用程序" msgid "Failed to create S3 bucket: {url}" msgstr "" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -805,6 +778,10 @@ msgstr "" msgid "Failed to get APK information, skipping {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1315,10 +1292,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1386,10 +1359,6 @@ msgstr "" msgid "Overall license of the project." msgstr "项目总体许可证。" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "覆盖资源库 APK 路径(默认为 ./repo)" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1428,13 +1397,6 @@ msgstr "使用的 git 资源库路径在日志上" msgid "Path to the keystore for the repo signing key" msgstr "资源库签名密钥的密钥存储(keystore)路径" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "准备Drozer进行扫描" - -msgid "Prepare drozer to run a scan" -msgstr "准备运行 drozer 扫描" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" @@ -1591,10 +1553,6 @@ msgstr "" msgid "Running wget in {path}" msgstr "" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "仅扫描每个包的最新版本" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1644,13 +1602,6 @@ msgstr "" msgid "Setting {0} sec timeout for this build" msgstr "" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "设置一个模拟器,在其中安装APK并执行Drozer扫描" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "设置一个模拟器,然后在其中安装 APK 并执行 drozer 扫描" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "对包进行签名并将其加入资源库" @@ -1780,6 +1731,17 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +#, fuzzy +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" +"\n" +" 这是一个与FDroid一起使用的应用程序的仓库。这个仓库中的应用程序\n" +" 要么是原应用程序开发者构建的官方二进制文件,要么是f-droid.org使用\n" +" https://gitlab.com/fdroid上的工具从源代码构建而来的\n" +" 二进制文件。\n" +" " + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1789,10 +1751,6 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" -#: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2022,9 +1980,6 @@ msgstr "使用编译服务器" msgid "Use date from APK instead of current time for newly added APKs" msgstr "对于新添加的 APK 文件,使用来自 APK 文件的时间,而非当前时间" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "对于最新添加的 APK,使用来自 APK 的日期,而不是当前时间" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2152,8 +2107,8 @@ msgstr "检查更新的applicationId" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "带有可选 versionCode 的 app-id,格式:APPID[:VERCODE]" @@ -2510,6 +2465,11 @@ msgstr "" msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2712,6 +2672,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" @@ -2769,12 +2734,36 @@ msgstr[0] "" #~ msgid "Add gpg signatures for packages in repo" #~ msgstr "添加包 gpg 签名至资源库" -#~ msgid "Clean update - don't uses caches, reprocess all APKs" -#~ msgstr "清除更新:不用缓存,重新处理全部 APK" +#~ msgid "Clean after all scans have finished" +#~ msgstr "扫描全部完成后清除" + +#~ msgid "Clean before the scans start and rebuild the container" +#~ msgstr "在扫描启动和容器重新编译之前清除" + +#~ msgid "Clean up all containers and then exit" +#~ msgstr "清除所有容器,然后退出" #~ msgid "Interactively ask about things that need updating." #~ msgstr "需更新事项的互动提示。" +#~ msgid "Override path for repo APKs (default: ./repo)" +#~ msgstr "覆盖资源库 APK 路径(默认为 ./repo)" + +#~ msgid "Prepare Drozer to run a scan" +#~ msgstr "准备Drozer进行扫描" + +#~ msgid "Prepare drozer to run a scan" +#~ msgstr "准备运行 drozer 扫描" + +#~ msgid "Scan only the latest version of each package" +#~ msgstr "仅扫描每个包的最新版本" + +#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +#~ msgstr "设置一个模拟器,在其中安装APK并执行Drozer扫描" + +#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" +#~ msgstr "设置一个模拟器,然后在其中安装 APK 并执行 drozer 扫描" + #, fuzzy #~ msgid "Specify editor to use in interactive mode. Default " #~ msgstr "指定编辑器使用互动模式。默认 %s" diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 586b2e54..14cf0a6f 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-14 14:55+0100\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-01-28 22:09+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Chinese (Traditional) \n" @@ -59,6 +59,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s 1/\" 沒有符合的中介資料檔案!" +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + #: ../fdroidserver/install.py #, fuzzy, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." @@ -143,11 +147,6 @@ msgstr "%s 選項不帶值" msgid "'keypass' not found in config.yml!" msgstr "config.yml 找不到 'keypass'!" -#: ../fdroidserver/common.py -#, fuzzy -msgid "'keypass' not found in config.yml!" -msgstr "config.yml 找不到 'keypass'!" - #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" msgstr "" @@ -156,29 +155,14 @@ msgstr "" msgid "'keystore' not found in config.yml!" msgstr "config.yml 找不到 'keystore'!" -#: ../fdroidserver/common.py -#, fuzzy -msgid "'keystore' not found in config.yml!" -msgstr "config.yml 找不到 'keystore'!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" msgstr "config.yml 找不到 'keystorepass'!" -#: ../fdroidserver/common.py -#, fuzzy -msgid "'keystorepass' not found in config.yml!" -msgstr "config.yml 找不到 'keystorepass'!" - #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" msgstr "config.yml 找不到 'repo_keyalias'!" -#: ../fdroidserver/common.py -#, fuzzy -msgid "'repo_keyalias' not found in config.yml!" -msgstr "config.yml 找不到 'repo_keyalias'!" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" @@ -455,17 +439,10 @@ msgstr "檢查應用程式更新" msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "檢查 {appid} 的歸檔 - APKs:{integer},keepversions:{keep},archapks:{arch}" -#: ../fdroidserver/dscanner.py -msgid "Clean after all scans have finished" -msgstr "所有掃描完成後清除" - -#: ../fdroidserver/dscanner.py -msgid "Clean before the scans start and rebuild the container" -msgstr "在掃描開始與重新構建容器之前清除" - -#: ../fdroidserver/dscanner.py -msgid "Clean up all containers and then exit" -msgstr "清除所有容器,然後退出" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "檢查 {appid} 的歸檔 - APKs:{integer},keepversions:{keep},archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -518,10 +495,6 @@ msgstr "無法找到 {path} 來移除" msgid "Could not open APK {path} for analysis: " msgstr "無法開啟 APK 檔{path}案作分析 : " -#: ../fdroidserver/update.py -msgid "Could not open APK file for analysis" -msgstr "無法開啟 APK 檔案作分析" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" @@ -794,10 +767,6 @@ msgstr "校正應用程式失敗" msgid "Failed to create S3 bucket: {url}" msgstr "無法建立 S3 bucket : {url}" -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "無法取得 APK 單號資訊" - #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" @@ -808,6 +777,10 @@ msgstr "無法取得 APK 資訊,刪除 {path}" msgid "Failed to get APK information, skipping {path}" msgstr "無法取得 APK 資訊,略過 {path}" +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "無法取得 APK 單號資訊" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -1322,11 +1295,6 @@ msgstr "{appid} 無須採取行動." msgid "Now set these in config.yml:" msgstr "現在設定這些在 config.yml 中:" -#: ../fdroidserver/init.py -#, fuzzy -msgid "Now set these in config.yml:" -msgstr "現在設定這些在 config.yml 中:" - #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -1395,10 +1363,6 @@ msgstr "" msgid "Overall license of the project." msgstr "該專案的整體授權。" -#: ../fdroidserver/dscanner.py -msgid "Override path for repo APKs (default: ./repo)" -msgstr "覆蓋軟體庫 APK 的路徑 (預設:./repo)" - #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" @@ -1437,13 +1401,6 @@ msgstr "到 git 軟體庫的路徑用在日誌" msgid "Path to the keystore for the repo signing key" msgstr "給軟體庫簽署金鑰的金鑰庫路徑" -#: ../fdroidserver/dscanner.py -msgid "Prepare Drozer to run a scan" -msgstr "準備 drozer 以執行掃描" - -msgid "Prepare drozer to run a scan" -msgstr "準備 drozer 以執行掃描" - #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "在終端機顥示祕密變數以便於複製/貼上" @@ -1600,10 +1557,6 @@ msgstr "關閉 MD5 檢查以執行首次通過" msgid "Running wget in {path}" msgstr "在 {path} 裡執行 wget" -#: ../fdroidserver/dscanner.py -msgid "Scan only the latest version of each package" -msgstr "只掃描每個套件包的最新版本" - #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" @@ -1653,13 +1606,6 @@ msgstr "設定開啟檔案的限制失敗: " msgid "Setting {0} sec timeout for this build" msgstr "為此構建設定 {0} 秒後超時" -#: ../fdroidserver/build.py -msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -msgstr "設置一個模擬器,在其上安裝 APK 並執行 drozer 掃描" - -msgid "Setup an emulator, install the APK on it and perform a drozer scan" -msgstr "設置一個模擬器,在其上安裝 APK 並執行 drozer 掃描" - #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" msgstr "簽署並放置套件包在軟體庫中" @@ -1789,6 +1735,10 @@ msgstr "發生主要別名衝突 - 發佈中止" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" @@ -1798,11 +1748,6 @@ msgstr "這個軟體庫已有本地的中介資料:%s" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "要使用 awsbucket, awssecretkey 與 awsaccesskeyid 必須在 config.yml 進行設定!" -#: ../fdroidserver/deploy.py -#, fuzzy -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "要使用 awsbucket, awssecretkey 與 awsaccesskeyid 必須在 config.yml 進行設定!" - #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -2035,9 +1980,6 @@ msgstr "使用構建伺服器" msgid "Use date from APK instead of current time for newly added APKs" msgstr "使用來自 APK 的日期,而不是新增之 APK 目前的時間" -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "新增的 APK 使用日期,來自 APK 而不是目前時間" - #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." @@ -2167,8 +2109,8 @@ msgstr "以 applicationId 檢查更新" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/dscanner.py ../fdroidserver/build.py -#: ../fdroidserver/scanner.py ../fdroidserver/install.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId 具有任選的 versionCode 在此格式為 APPID [:VERCODE]" @@ -2526,6 +2468,11 @@ msgstr "拒絕透過不安全的 HTTP 連線下載 (使用 HTTPS 或指明 --no- msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" msgstr "拒絕透過不安全 http 連線下載 (使用 https 或指明 --no-https-check): {apkfilename}" +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." @@ -2728,6 +2675,11 @@ msgstr "" msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\" 不存在! 請更正 config.yml." +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "{name} \"{path}\" 不存在! 請更正 config.yml." + #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" @@ -2791,12 +2743,39 @@ msgstr[0] "{} 編譯成功" #~ msgid "Cannot find an appid for {path}!" #~ msgstr "找不到 {path} 的 appid!" -#~ msgid "Clean update - don't uses caches, reprocess all APKs" -#~ msgstr "清除更新 - 不使用快取,重新處理全部的 APK" +#~ msgid "Clean after all scans have finished" +#~ msgstr "所有掃描完成後清除" + +#~ msgid "Clean before the scans start and rebuild the container" +#~ msgstr "在掃描開始與重新構建容器之前清除" + +#~ msgid "Clean up all containers and then exit" +#~ msgstr "清除所有容器,然後退出" + +#~ msgid "Could not open APK file for analysis" +#~ msgstr "無法開啟 APK 檔案作分析" #~ msgid "Interactively ask about things that need updating." #~ msgstr "以對話方式詢問需要更新的內容。" +#~ msgid "Override path for repo APKs (default: ./repo)" +#~ msgstr "覆蓋軟體庫 APK 的路徑 (預設:./repo)" + +#~ msgid "Prepare Drozer to run a scan" +#~ msgstr "準備 drozer 以執行掃描" + +#~ msgid "Prepare drozer to run a scan" +#~ msgstr "準備 drozer 以執行掃描" + +#~ msgid "Scan only the latest version of each package" +#~ msgstr "只掃描每個套件包的最新版本" + +#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +#~ msgstr "設置一個模擬器,在其上安裝 APK 並執行 drozer 掃描" + +#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" +#~ msgstr "設置一個模擬器,在其上安裝 APK 並執行 drozer 掃描" + #~ msgid "Specify editor to use in interactive mode. Default " #~ msgstr "指定編輯器在交互模式使用。預設 " From 4900c426e9db0321d285923d7622862239f7c723 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 29 Jan 2021 16:20:42 +0100 Subject: [PATCH 0128/2116] locale: remove "obsolete" translations from .po files --- locale/Makefile | 1 + locale/bo/LC_MESSAGES/fdroidserver.po | 64 --------------------------- locale/cs/LC_MESSAGES/fdroidserver.po | 3 -- 3 files changed, 1 insertion(+), 67 deletions(-) diff --git a/locale/Makefile b/locale/Makefile index 0930f8d3..57608725 100644 --- a/locale/Makefile +++ b/locale/Makefile @@ -44,6 +44,7 @@ $(TEMPLATE): $(FILES) sed -i 's,CHARSET,UTF-8,' $(TEMPLATE) %.po: $(TEMPLATE) + msgattrib $(OPTS) --no-obsolete --output-file=$@ $@ msguniq $(OPTS) --use-first --output-file=$@ $@ msgmerge $(OPTS) --update $@ $(TEMPLATE) diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index af8d077a..6d167219 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -2732,67 +2732,3 @@ msgstr[0] "{} བཟོ་སྐྲུན་བྱེད་མི་ཐུབ། msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} བཟོ་སྐྲུན་ལེགས་སྒྲུབ།" - -#~ msgid "Android Build Tools path '{path}' does not exist!" -#~ msgstr "ཨེན་ཀྲོཌ་བཟོ་སྐྲུན་མ་ལག་ཐབས་ལམ '{path}1' མིན་འདུག!" - -#~ msgid "Cannot find a packageName for {path}!" -#~ msgstr "{path}གྱི་ཆེད་དུ་ཐུམ་སྒྲིལ་གྱི་མིང་རྙེད་མ་སོང་།!" - -#, fuzzy -#~ msgid "Cannot find an appid for {path}!" -#~ msgstr "{path}!གྱི་ཆེད་དུ་ཐུམ་སྒྲིལ་གྱི་མིང་རྙེད་མ་སོང་།" - -#~ msgid "Clean after all scans have finished" -#~ msgstr "ཆ་ཚང་འཚག་རྒྱབ་ཚར་བའི་རྗེས་སུ་གཙང་མ་བཟོས།" - -#~ msgid "Clean before the scans start and rebuild the container" -#~ msgstr "འཚག་རྒྱབ་འགོ་མ་བཙུགས་གོང་ལ་གཙང་མ་དང་སྣོད་དེ་སྐྱར་དུ་བཟོས།" - -#~ msgid "Clean up all containers and then exit" -#~ msgstr "སྣོད་ཆ་ཚང་གཙང་མ་བཟོས་ནས་ཕྱིར་ཐོན།" - -#~ msgid "Could not open APK file for analysis" -#~ msgstr "དཔྱད་ཞིབ་ཀྱི་ཆེད་དུ་APK ཡིག་ཆ་ཁ་ཕྱེས་ཐུབ་ཀྱི་མིན་འདུག" - -#~ msgid "Interactively ask about things that need updating." -#~ msgstr "གསར་བསྒྱུར་བྱེད་དགོས་པའི་རིགས་ལ་སྦས་གསང་མེད་པའི་ཐོག་ནས་གསུངས་རོགས།." - -#~ msgid "Override path for repo APKs (default: ./repo)" -#~ msgstr "རེ་པོ་APKs ལམ་གྱི་སྒང་ལ་སྐྱར་སྣོན། (སོར་བཞག་: ./repo)" - -#~ msgid "Prepare Drozer to run a scan" -#~ msgstr "འཚག་རྒྱབ་འཁོར་སྐྱོད་ཐུབ་པའི་ཆེད་དུ་ཌོ་ཛར་གྲ་སྒྲིག་བྱེད།" - -#~ msgid "Prepare drozer to run a scan" -#~ msgstr "འཚག་རྒྱབ་འཁོར་སྐྱོད་ཐུབ་པའི་ཆེད་དུ་ཌོ་ཛར་གྲ་སྒྲིག་བྱེད།" - -#~ msgid "Scan only the latest version of each package" -#~ msgstr "ཐུམ་སྒྲིལ་རེ་རེ་བའི་ཐོན་རིམ་གསར་ཤོས་གཅིག་པུ་འཚག་རྒྱབ།" - -#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -#~ msgstr "གློག་ཀླད་ལད་མོ་མཁན་ཞིག་སྒྲིག འདིའི་སྒང་ལ་ APK ནང་འགྲིག་བཅུག་བྱེད་དུ་བཅུག་ནས་ཌོ་ཛར་འཚག་རྒྱབ་འགོ་བཙུགས་བྱེད།" - -#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" -#~ msgstr "གློག་ཀླད་ལད་མོ་མཁན་ཞིག་སྒྲིག འདིའི་སྒང་ལ་APK ནང་འགྲིག་བཅུག་བྱེད་དུ་བཅུག་ནས་ཌོ་ཛར་འཚག་རྒྱབ་འགོ་བཙུགས་བྱེད།" - -#~ msgid "Specify editor to use in interactive mode. Default " -#~ msgstr "སྒྲིག་བཀོད་པར་དམིགས་སྟོན་བྱས་ནས་ལན་འདེབས་ཀྱི་ཚུལ་འདི་བེད་སྤྱོད་བྱེད་ སོར་བཞག " - -#~ msgid "Specify editor to use in interactive mode. Default %s" -#~ msgstr "སྒྲིག་བཀོད་པར་དམིགས་སྟོན་བྱས་ནས་ལན་འདེབས་ཀྱི་ཚུལ་འདི་བེད་སྤྱོད་བྱེད་ སོར་བཞག %s 1" - -#~ msgid "Specify editor to use in interactive mode. Default is {path}" -#~ msgstr "སྒྲིག་བཀོད་པར་དམིགས་སྟོན་བྱས་ནས་ལན་འདེབས་ཀྱི་ཚུལ་འདི་བེད་སྤྱོད་བྱེད་ སོར་བཞག་ནི་{path}" - -#~ msgid "app-id in the form APPID" -#~ msgstr "APPID བཀོད་པའི་ནང་གི་མཉེས་ཆས་ཁ་བྱང་།" - -#~ msgid "app-id to check for updates" -#~ msgstr "མཉེས་ཆས་ཁ་བྱང་རྒྱུད་གསར་བསྒྱར་ཡོད་མིན་ལྟོས།" - -#~ msgid "app-id with optional versionCode in the form APPID[:VERCODE]" -#~ msgstr "མཉེན་ཆས་ཀྱི་ངོ་བོ་དང་མཉམ་དུ་གདམ་ཀ་ཅན་གྱི་ཐོན་རིམ་ཨང་རྟགས་APPID[:VERCODE]" - -#~ msgid "app-id with optional versioncode in the form APPID[:VERCODE]" -#~ msgstr "མཉེས་ཆས་ཁ་བྱང་དང་མཉམ་དུ་གདམ་ཀ་ཅན་གྱི་ཐོན་རིམ་ཨང་རྟགས།APPID[:VERCODE]" diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index eb3b24b4..bf95d6f2 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -2719,6 +2719,3 @@ msgid_plural "{} builds succeeded" msgstr[0] "" msgstr[1] "" msgstr[2] "" - -#~ msgid "Clean after all scans have finished" -#~ msgstr "Po dokončení všech skenů vyčistit" From 31c29f2fb37c4de9cf04d92b98ca9a7d54fb0172 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 29 Jan 2021 16:28:00 +0100 Subject: [PATCH 0129/2116] support official ANDROID_SDK_ROOT env var when running CLI tools ANDROID_HOME is deprecated: https://developer.android.com/studio/command-line/variables#android_sdk_root !816 #547 --- fdroidserver/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 9cd538ab..a19795a0 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2739,7 +2739,7 @@ def set_FDroidPopen_env(build=None): orig_path = env['PATH'] if config: if config.get('sdk_path'): - for n in ['ANDROID_HOME', 'ANDROID_SDK']: + for n in ['ANDROID_HOME', 'ANDROID_SDK', 'ANDROID_SDK_ROOT']: env[n] = config['sdk_path'] for k, v in config.get('java_paths', {}).items(): env['JAVA%s_HOME' % k] = v From 382fba151e90a97cb897614e324ae01cb9ddcfcf Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Sun, 31 Jan 2021 23:07:32 +0100 Subject: [PATCH 0130/2116] Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk Currently translated at 100.0% (576 of 576 strings) Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk Currently translated at 100.0% (576 of 576 strings) Co-authored-by: Ihor Hordiichuk Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 119 ++++++++++++-------------- 1 file changed, 56 insertions(+), 63 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index b1badb69..4c0e8d0f 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-27 00:33+0000\n" +"PO-Revision-Date: 2021-01-31 22:07+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" "Language: uk\n" @@ -28,8 +28,8 @@ msgid "" " " msgstr "" "\n" -" Це сховище застосунків для використання з FDroid. Застосунки в цьому\n" -" сховищі — це або офіційні двійкові файли, побудовані за розробниками оригінального\n" +" Цей репозиторій застосунків для використання з FDroid. Застосунки в цьому\n" +" репозиторії — це або офіційні двійкові файли, побудовані розробниками оригінального\n" " застосунку, або двійкові файли, побудовані з джерела f-droid.org за допомогою\n" " інструментів з https://gitlab.com/fdroid.\n" " " @@ -66,7 +66,7 @@ msgstr "\"%s/\" не має відповідного файлу метадани #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" +msgstr "\"repo_pubkey\" повинен бути присутній у config.yml коли використовується --nosign!" #: ../fdroidserver/install.py #, python-brace-format @@ -245,7 +245,7 @@ msgstr "URL потребується як аргумент!" #: ../fdroid ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" -msgstr "Додати підписи GnuPG для пакетів у сховищеві" +msgstr "Додати підписи GnuPG для пакунків у репозиторії" #: ../fdroid ../fdroidserver/__main__.py msgid "Add a new application from its source code" @@ -253,7 +253,7 @@ msgstr "Додайте новий застосунку зі свого вихі #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" -msgstr "Створіть ключ підписування сховищ до непідписаного сховища" +msgstr "Створіть ключ підписування репозиторіїв до непідписаного репозиторію" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" @@ -262,11 +262,11 @@ msgstr "Додати тулуб файлових метаданих файлів #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" -msgstr "Додати нове сховище лише для {name}" +msgstr "Додати новий репозиторій лише для {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" -msgstr "Псевдонім підписного ключа сховища у сховищі ключів" +msgstr "Псевдонім підписного ключа репозиторію у сховищі ключів" #: ../fdroidserver/import.py msgid "Allows a different revision (or git branch) to be specified for the initial import" @@ -369,7 +369,7 @@ msgstr "Недійсне посилання: {path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Build a package from source" -msgstr "Побудуйте пакет з джерела" +msgstr "Побудувати пакунок з джерела" #: ../fdroidserver/build.py msgid "Build all applications available" @@ -381,11 +381,11 @@ msgstr "Збірку, створено за допомогою `fdroid import` - #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" -msgstr "У сховищі з метаданими збірки є незбережені зміни!" +msgstr "У git-репозиторії з метаданими збірки є незбережені зміни!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" -msgstr "Створіть лише останню версію кожного пакета" +msgstr "Побудуйте лише найновішу версію кожного пакунка" #: ../fdroidserver/metadata.py #, python-brace-format @@ -395,7 +395,7 @@ msgstr "Для побудови необхідно розділяти versionNam #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" -msgstr "Вбудоване сховище створено у \"%s\" на основі конфігурації:" +msgstr "Вбудований репозиторій створено у \"%s\" на основі конфігурації:" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -448,9 +448,9 @@ msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, arc msgstr "Перевірка архівації на {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Перевірка архівації на {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Перевірка архівації на {appid} — apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -523,7 +523,7 @@ msgstr "Не вдається знайти найновішу назву вер #: ../fdroidserver/import.py msgid "Couldn't find package ID" -msgstr "Не вдається знайти ідентифікатор пакета" +msgstr "Не вдається знайти ідентифікатор пакунка" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" @@ -531,7 +531,7 @@ msgstr "Боязно трохи, ми відмовляємося перезап #: ../fdroidserver/update.py msgid "Create a repo signing key in a keystore" -msgstr "Створіть ключ підписування сховищ у сховищі ключів" +msgstr "Створіть ключ підписування репозиторіїв у сховищі ключів" #: ../fdroidserver/update.py msgid "Create skeleton metadata files that are missing" @@ -584,17 +584,17 @@ msgstr "DEBUG_KEYSTORE не встановлено або значення є н #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "Видалити APKs і/або OBBs без метаданих зі сховища" +msgstr "Видалити APK та/або OBB без метаданих з репозиторію" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "Видалення архіву, сховище завелике ({size} макс. {limit})" +msgstr "Видалення архіву, репозиторій завеликий ({size} макс. {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "Видалення історії git-mirror, сховище завелике ({size} макс {limit})" +msgstr "Видалення історії git-mirror, репозиторій завеликий ({size} макс {limit})" #: ../fdroidserver/update.py #, python-brace-format @@ -626,7 +626,7 @@ msgstr "Не додавайте 'disable:' до створених записі #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" -msgstr "Не розміщувати нові файли до сховища одразу" +msgstr "Не розміщувати нові файли до репозиторію одразу" #: ../fdroidserver/mirror.py #, python-brace-format @@ -639,7 +639,7 @@ msgstr "Не точний шлях Android SDK, просто збій" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" -msgstr "Не видаляйте приватні ключі, утворені у сховищі ключів" +msgstr "Не вилучайте приватні ключі, утворені у сховищі ключів" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" @@ -651,7 +651,7 @@ msgstr "Не робіть нічого пов'язаного з журналам #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" -msgstr "Не оновлюйте сховище, корисне під час тестування створення без підключення до Інтернету" +msgstr "Не оновлюйте репозиторій, корисно під час тестування створення без з'єднання з Інтернетом" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py #: ../fdroidserver/upload.py @@ -660,7 +660,7 @@ msgstr "Не використовуйте контрольні суми rsync" #: ../fdroid ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" -msgstr "Завантажувати повноцінні дзеркала невеликих сховищ" +msgstr "Завантажувати повноцінні дзеркала невеликих репозиторіїв" #: ../fdroidserver/stats.py msgid "Download logs we don't have" @@ -668,7 +668,7 @@ msgstr "Журналів завантаження у нас немає" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." -msgstr "Завантаження сховища вже не вдалося, не намагайтеся знову." +msgstr "Завантаження репозиторію вже не вдалося, не намагайтеся знову." #: ../fdroidserver/verify.py #, python-brace-format @@ -737,7 +737,7 @@ msgstr "Помилка під час отримання адреси схови #: ../fdroidserver/import.py ../fdroidserver/common.py msgid "Error while getting repo address" -msgstr "Помилка отримання адреси сховища" +msgstr "Помилка отримання адреси репозиторію" #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" @@ -877,7 +877,7 @@ msgstr "Знайдено кілька файлів метаданих для {ap #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." -msgstr "Знайдено кілька сертифікатів підписування для сховища." +msgstr "Знайдено кілька сертифікатів підписування для репозиторію." #: ../fdroidserver/update.py #, python-brace-format @@ -886,7 +886,7 @@ msgstr "Знайдено кілька сертифікатів для підпи #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." -msgstr "Не знайдено сертифікатів підписування для сховища." +msgstr "Не знайдено сертифікатів підписування для репозиторію." #: ../fdroidserver/lint.py #, python-format @@ -1000,7 +1000,7 @@ msgstr "Встановити всі доступні підписані заст #: ../fdroid ../fdroidserver/__main__.py msgid "Install built packages on devices" -msgstr "Встановити побудовані пакети на пристрої" +msgstr "Встановити побудовані пакунки на пристрої" #: ../fdroidserver/install.py #, python-format @@ -1024,7 +1024,7 @@ msgstr "Встановлення '{apkfilename}' на {dev}…" #: ../fdroid ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" -msgstr "Взаємодія з HTTP-сервером сховища" +msgstr "Взаємодія з HTTP-сервером репозиторію" #: ../fdroidserver/update.py msgid "Invalid APK" @@ -1174,7 +1174,7 @@ msgstr "Зробити зупинку створення за винятками #: ../fdroidserver/index.py msgid "Malformed repository mirrors." -msgstr "Несправні дзеркала сховища." +msgstr "Несправні дзеркала репозиторію." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" @@ -1182,7 +1182,7 @@ msgstr "Несправний шлях serverwebroot:" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." -msgstr "Дзеркало всього сховища та архіву всіх типів файлів." +msgstr "Дзеркало всього репозиторію та архіву всіх типів файлів." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" @@ -1395,7 +1395,7 @@ msgstr "Шлях до Android SDK (іноді встановлено в ANDROID_ #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" -msgstr "Шлях до сховища git, яке використовується для входу" +msgstr "Шлях до git-репозиторію, який використовується для журналювання" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" @@ -1461,7 +1461,7 @@ msgstr "Оприлюднення до {url}" #: ../fdroid ../fdroidserver/__main__.py msgid "Quickly start a new repository" -msgstr "Швидкий запуск нового сховища" +msgstr "Швидкий запуск нового репозиторія" #: ../fdroid ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" @@ -1542,7 +1542,7 @@ msgstr "Перезапис '{appid}' на '{path}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" -msgstr "Запустити на git сховище, яке не подало зміни" +msgstr "Запустити для git-репозиторію з не подаинми змінами" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1563,7 +1563,7 @@ msgstr "Перевірити отриманий файл APK на наявніс #: ../fdroid ../fdroidserver/__main__.py msgid "Scan the source code of a package" -msgstr "Сканування вихідного коду пакета" +msgstr "Сканування джерельного коду пакунка" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1588,7 +1588,7 @@ msgstr "Встановіть годинник на цей час, викорис #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "Встановити найбільшу кількість випусків у сховищі перед архівуванням старих" +msgstr "Встановити найбільшу кількість випусків у репозиторії перед архівуванням старих" #: ../fdroidserver/build.py #, python-brace-format @@ -1597,7 +1597,7 @@ msgstr "Встановити обмеження відкритого файлу #: ../fdroid ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" -msgstr "Налаштувати застосунок для збірки сховища в нічний час" +msgstr "Налаштувати застосунок для збірки репозиторію в нічний час" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " @@ -1610,7 +1610,7 @@ msgstr "Час очікування для цієї збірки станови #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" -msgstr "Записати та розмістити пакети у сховищеві" +msgstr "Записати та розмістити пакунки в репозиторії" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" @@ -1647,7 +1647,7 @@ msgstr "Пропуск {appid}: жодних збірок не вказано" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Specify a local folder to sync the repo to" -msgstr "Вкажіть локальну теку, аби синхронізувати сховище у" +msgstr "Вкажіть локальну теку, щоб синхронізувати репозиторій у" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Specify an identity file to provide to SSH for rsyncing" @@ -1702,7 +1702,7 @@ msgstr "Код версії OBB повинен надходити після \"{ #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" -msgstr "Базова URL-адреса для входу до сховища (усталено: https://f-droid.org)" +msgstr "Базова URL-адреса для входу до репозиторію (типово: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" @@ -1710,7 +1710,7 @@ msgstr "Каталог для запису дзеркала" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" -msgstr "Файл, який слід включити до сховища (шлях чи шаблон шляху)" +msgstr "Файл, який слід включити до репозиторію (шлях чи шаблон шляху)" #: ../fdroidserver/deploy.py msgid "The only commands currently supported are 'init' and 'update'" @@ -1718,11 +1718,11 @@ msgstr "Підтримуються лише команди 'init' або 'update #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." -msgstr "Цифровий відбиток сховища не збігається." +msgstr "Цифровий відбиток репозиторію не збігається." #: ../fdroidserver/common.py msgid "The repository's index could not be verified." -msgstr "Не вдалося перевірити індекс сховища." +msgstr "Не вдалося перевірити індекс репозиторію." #: ../fdroidserver/deploy.py #, python-brace-format @@ -1735,23 +1735,16 @@ msgstr "Відбулося зіткнення keyalias ключів - припи #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." -msgstr "Це застосунки, заархівовані з основного сховища." +msgstr "Ці застосунки, заархівовано з основного репозиторію." #: ../fdroidserver/common.py -#, fuzzy msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" -"\n" -" Це сховище застосунків для використання з FDroid. Застосунки в цьому\n" -" сховищі — це або офіційні двійкові файли, побудовані за розробниками оригінального\n" -" застосунку, або двійкові файли, побудовані з джерела f-droid.org за допомогою\n" -" інструментів з https://gitlab.com/fdroid.\n" -" " +msgstr "Цей репозиторій застосунків для використання з FDroid. Застосунки в цьому репозиторії — це або офіційні двійкові файли, побудовані розробниками оригінального застосунку, або двійкові файли, побудовані з джерела f-droid.org за допомогою інструментів з https://gitlab.com/fdroid." #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" -msgstr "Сховище вже має локальні метадані: %s" +msgstr "Репозиторій вже має локальні метадані: %s" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -1855,7 +1848,7 @@ msgstr "Нерозпізнане поле '{field}' у {linedesc}" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" -msgstr "Файловий тип не підтримується \"{extension}\" для сховища графіки" +msgstr "Тип файлу не підтримується \"{extension}\" для репозиторію графіки" #: ../fdroidserver/update.py #, python-brace-format @@ -1907,7 +1900,7 @@ msgstr "Невикористаний шлях scanignore: %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" -msgstr "Оновіть інформацію сховища для нових пакетів" +msgstr "Оновіть дані репозиторію для нових пакунків" #: ../fdroid ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" @@ -1915,7 +1908,7 @@ msgstr "Оновити бінарний журнал прозорості для #: ../fdroid ../fdroidserver/__main__.py msgid "Update the stats of the repo" -msgstr "Оновити статистику сховища" +msgstr "Оновити статистику репозиторію" #: ../fdroidserver/update.py ../fdroidserver/build.py msgid "Update the wiki" @@ -2028,7 +2021,7 @@ msgstr "Перевіряти, за допомогою локальної кеш #: ../fdroid ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" -msgstr "Перевірте цілісність завантажених пакетів" +msgstr "Перевірте цілісність завантажених пакунків" #: ../fdroidserver/index.py msgid "Verifying index signature:" @@ -2049,7 +2042,7 @@ msgstr "Коли налаштовано для підписаних індекс #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "Під час перевірки всього сховища, yamllint типово вимкнено. Цей параметр змушує нехтувати yamllint." +msgstr "Під час перевірки всього репозиторію, yamllint типово вимкнено. Цей параметр змушує нехтувати yamllint." msgid "X.509 'Distiguished Name' used when generating keys" msgstr "X.509 'Distiguished Name' використовується при створенні ключів" @@ -2215,7 +2208,7 @@ msgstr "створено {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" -msgstr "видалення: сховище/{apkfilename}" +msgstr "видалення: репозиторій/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format @@ -2476,9 +2469,9 @@ msgid "refuse downloading via insecure http connection (use https or specify --n msgstr "відмовитись від завантаження через незахищене з'єднання http (користати https чи вказати --no-https-check): {apkfilename}" #: ../fdroidserver/index.py -#, fuzzy, python-format +#, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "repo_icon %s не існує, створення заповнювача." +msgstr "repo_icon \"repo/icons/%s\" не існує, створення заповнювача." #: ../fdroidserver/index.py #, python-format @@ -2685,9 +2678,9 @@ msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\" не існує! Виправте його в config.yml." #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "{name} \"{path}\" не існує! Виправте його в config.yml." +msgstr "{name} \"{section}/icons/{path}\" не існує! Виправте його в \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format From 81ef8055ded9fbd0b532960b79be1963aa54e86e Mon Sep 17 00:00:00 2001 From: WaldiS Date: Sun, 31 Jan 2021 23:07:33 +0100 Subject: [PATCH 0131/2116] Translated using Weblate: Polish (pl) by WaldiS Currently translated at 100.0% (576 of 576 strings) Co-authored-by: WaldiS Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ Translation: F-Droid/F-Droid Server --- locale/pl/LC_MESSAGES/fdroidserver.po | 29 +++++++++------------------ 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index bb09ad0f..10201127 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -9,8 +9,8 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-28 22:09+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2021-01-31 09:06+0000\n" +"Last-Translator: WaldiS \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" @@ -67,7 +67,7 @@ msgstr "\"%s/\" nie ma pasującego pliku metadanych!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" +msgstr "\"repo_pubkey\" musi być obecne w config.yml kiedy używasz --nosign!" #: ../fdroidserver/install.py #, python-brace-format @@ -449,9 +449,9 @@ msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, arc msgstr "Sprawdzanie archiwizacji dla {appid} - APKs: {integer}, keepversions: {keep}, archapks: {arch}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Sprawdzanie archiwizacji dla {appid} - APKs: {integer}, keepversions: {keep}, archapks: {arch}" +msgstr "Sprawdzanie archiwizacji dla {appid} - apks: {integer}, keepversions: {keep}, archapks: {arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -827,7 +827,6 @@ msgid "Flattr donation methods belong in the FlattrID flag" msgstr "Metody flattr donation należą do flagi FlattrID" #: ../fdroidserver/lint.py -#, fuzzy msgid "Flattr donation methods belong in the FlattrID: field" msgstr "Metody darowizn Flattr należą do FlattrID: field" @@ -1339,7 +1338,6 @@ msgid "Only process apps with auto-updates" msgstr "Przetwarzaj tylko aplikacje z automatycznymi aktualizacjami" #: ../fdroidserver/lint.py -#, fuzzy msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Metody darowizn OpenCollective należą do OpenCollective: field" @@ -1741,15 +1739,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "To są aplikacje, które zostały zarchiwizowane w głównym repozytorium." #: ../fdroidserver/common.py -#, fuzzy msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" -"\n" -" To jest repozytorium aplikacji, które mają być używane z FDroid. Aplikacje w tym\n" -" repozytorium są oficjalnymi plikami binarnymi utworzonymi przez oryginalnych\n" -" programistów lub są to pliki binarne utworzone ze źródła przez f-droid.org\n" -" przy użyciu narzędzi na https://gitlab.com/fdroid.\n" -" " +msgstr "To jest repozytorium aplikacji używanych z F-Droid. Aplikacje w tym repozytorium są albo oficjalnymi plikami binarnymi utworzonymi przez pierwotnych twórców aplikacji, albo plikami binarnymi utworzonymi ze źródła przez administratora f-droid.org przy użyciu narzędzi na https://gitlab.com/fdroid." #: ../fdroidserver/import.py #, python-format @@ -2479,9 +2470,9 @@ msgid "refuse downloading via insecure http connection (use https or specify --n msgstr "odmów pobierania przez niezabezpieczone połączenie http (użyj https lub określ --no-https-check): {apkfilename}" #: ../fdroidserver/index.py -#, fuzzy, python-format +#, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "repo_icon %s nie istnieje, generuje symbol zastępczy." +msgstr "repo_icon \"repo / icons / %s\" nie istnieje, generuje symbol zastępczy." #: ../fdroidserver/index.py #, python-format @@ -2688,9 +2679,9 @@ msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\" nie istnieje! Popraw go w config.yml." #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "{name} \"{path}\" nie istnieje! Popraw go w config.yml." +msgstr "{name} \"{section}/icons/{path}\" nie istnieje! Sprawdź \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format From 8fcbfd14039828de7330acf72e7412e1cfc409ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Sun, 31 Jan 2021 23:07:34 +0100 Subject: [PATCH 0132/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Turki?= =?UTF-8?q?sh=20(tr)=20by=20O=C4=9Fuz=20Ersen=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (576 of 576 strings) Co-authored-by: Oğuz Ersen Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/tr/ Translation: F-Droid/F-Droid Server --- locale/tr/LC_MESSAGES/fdroidserver.po | 29 ++++++++++----------------- 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index b46c2363..1f9d9e7b 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-14 21:33+0000\n" +"PO-Revision-Date: 2021-01-31 22:07+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" "Language: tr\n" @@ -64,7 +64,7 @@ msgstr "\"%s/\" eşleşen üst veri dosyasına sahip değil!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" +msgstr "--nosign kullanılırken \"repo_pubkey\" config.yml içinde bulunmalı!" #: ../fdroidserver/install.py #, python-brace-format @@ -324,7 +324,7 @@ msgstr "Android SDK aracı {cmd} bulundu!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android build-tools path '{path}' does not exist!" -msgstr "Android oluşturma araçları yolu '{path}' mevcut değil!" +msgstr "Android oluşturma araçları yolu '{path}' yok!" #: ../fdroidserver/update.py msgid "AndroidManifest.xml has no date" @@ -444,9 +444,9 @@ msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, arc msgstr "{appid} için arşivleme denetleniyor - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "{appid} için arşivleme denetleniyor - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "{appid} için arşivleme denetleniyor - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -1733,15 +1733,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Bunlar ana depodan arşivlenmiş uygulamalardır." #: ../fdroidserver/common.py -#, fuzzy msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" -"\n" -" Bu, FDroid ile kullanılacak uygulamaların bir deposudur. Bu depodaki\n" -" uygulamalar ya gerçek uygulama geliştiricileri tarafından oluşturulan\n" -" resmi ikili dosyalardır ya da https://gitlab.com/fdroid adresindeki araçlar\n" -" kullanılarak f-droid.org tarafından kaynaktan oluşturulan ikili dosyalardır.\n" -" " +msgstr "Bu, F-Droid ile kullanılacak uygulamaların bir deposudur. Bu depodaki uygulamalar ya gerçek uygulama geliştiricileri tarafından oluşturulan resmi ikili dosyalardır ya da https://gitlab.com/fdroid adresindeki araçlar kullanılarak f-droid.org yöneticisi tarafından kaynaktan oluşturulan ikili dosyalardır." #: ../fdroidserver/import.py #, python-format @@ -2469,14 +2462,14 @@ msgid "refuse downloading via insecure http connection (use https or specify --n msgstr "güvensiz http bağlantısı ile indirmeyi reddet (https kullanın veya --no-https-check belirtin): {apkfilename}" #: ../fdroidserver/index.py -#, fuzzy, python-format +#, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "repo_icon %s mevcut değil, yer tutucu oluşturuyor." +msgstr "repo_icon \"repo/icons/%s\" yok, yer tutucu oluşturuyor." #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." -msgstr "repo_icon %s mevcut değil, yer tutucu oluşturuyor." +msgstr "repo_icon %s yok, yer tutucu oluşturuyor." #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." @@ -2677,9 +2670,9 @@ msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\" yok! config.yml içinde düzeltin." #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "{name} \"{path}\" yok! config.yml içinde düzeltin." +msgstr "{name} \"{section}/icons/{path}\" yok! config.yml içinde düzeltin." #: ../fdroidserver/common.py #, python-brace-format From acba6b4a88879a5615736072b5c88ef24ff76311 Mon Sep 17 00:00:00 2001 From: Eric Date: Sun, 31 Jan 2021 23:07:34 +0100 Subject: [PATCH 0133/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Eric Currently translated at 34.7% (200 of 576 strings) Co-authored-by: Eric Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 8fd0c1c9..2b5c3dd9 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -12,8 +12,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-28 22:09+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2021-01-31 22:07+0000\n" +"Last-Translator: Eric \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" @@ -1732,15 +1732,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "" #: ../fdroidserver/common.py -#, fuzzy msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" -"\n" -" 这是一个与FDroid一起使用的应用程序的仓库。这个仓库中的应用程序\n" -" 要么是原应用程序开发者构建的官方二进制文件,要么是f-droid.org使用\n" -" https://gitlab.com/fdroid上的工具从源代码构建而来的\n" -" 二进制文件。\n" -" " +msgstr "这是一个与F-Droid一起使用的应用程序的仓库。这个仓库中的应用程序要么是原应用程序开发者构建的官方二进制文件,要么是 f-droid.org 的管理员使用 https://gitlab.com/fdroid 上的工具从源代码构建而来的二进制文件。" #: ../fdroidserver/import.py #, python-format From 58d23d17e6ff3dbd08a0c7f6a6d9bf614fa98bf4 Mon Sep 17 00:00:00 2001 From: "Peter J. Mello" Date: Sun, 31 Jan 2021 23:07:35 +0100 Subject: [PATCH 0134/2116] Translated using Weblate: Portuguese (pt) by Peter J. Mello Currently translated at 100.0% (576 of 576 strings) Translated using Weblate: Portuguese (Portugal) (pt_PT) by Peter J. Mello Currently translated at 100.0% (576 of 576 strings) Co-authored-by: Peter J. Mello Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_PT/ Translation: F-Droid/F-Droid Server --- locale/pt/LC_MESSAGES/fdroidserver.po | 28 ++++++++++-------------- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 28 ++++++++++-------------- 2 files changed, 22 insertions(+), 34 deletions(-) diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 4d5abe57..50bf57ad 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -1,13 +1,14 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # ssantos , 2020, 2021. +# Peter J. Mello , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-16 09:19+0000\n" -"Last-Translator: ssantos \n" +"PO-Revision-Date: 2021-01-31 22:07+0000\n" +"Last-Translator: Peter J. Mello \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" @@ -64,7 +65,7 @@ msgstr "\"%s/\" não tem ficheiro de metadados correspondente!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" +msgstr "\"repo_pubkey\" deve estar presente em config.yml quando se usa --nosign!" #: ../fdroidserver/install.py #, python-brace-format @@ -444,9 +445,9 @@ msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, arc msgstr "Verificando o arquivamento para {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Verificando o arquivamento para {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Verificando o arquivamento para {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -1733,15 +1734,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Estas são as aplicações que foram arquivadas do repositório principal." #: ../fdroidserver/common.py -#, fuzzy msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" -"\n" -" Este é um repositório de apps a serem usados com o FDroid.\n" -" Aplicações neste repositório são binários oficiais compilados pelos\n" -" programadores da aplicação original ou são binários compilados da\n" -" fonte por f-droid.org a usar as ferramentas em https://gitlab.com/fdroid.\n" -" " +msgstr "Este é um repositório de apps a serem usados com o F-Droid. Aplicações neste repositório são binários oficiais compilados pelos programadores da aplicação original ou são binários compilados da fonte por f-droid.org a usar as ferramentas em https://gitlab.com/fdroid." #: ../fdroidserver/import.py #, python-format @@ -2469,9 +2463,9 @@ msgid "refuse downloading via insecure http connection (use https or specify --n msgstr "Recusado o download via conexão http insegura (use https ou especifique --no-https-check): {apkfilename}" #: ../fdroidserver/index.py -#, fuzzy, python-format +#, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "repo_icon %s não existe, a gerar um espaço reservado." +msgstr "repo_icon \"repo/icons/%s\" não existe, a gerar um espaço reservado." #: ../fdroidserver/index.py #, python-format @@ -2677,9 +2671,9 @@ msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\" não existe! Corrija-o no config.yml." #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "{name} \"{path}\" não existe! Corrija-o no config.yml." +msgstr "{name} \"{section}/icons/{path}\" não existe! Corrija-o no \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 739c28e5..275f17b3 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -4,13 +4,14 @@ # Manuela Silva , 2020. # ssantos , 2020, 2021. # Hans-Christoph Steiner , 2020. +# Peter J. Mello , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-16 09:19+0000\n" -"Last-Translator: ssantos \n" +"PO-Revision-Date: 2021-01-31 22:07+0000\n" +"Last-Translator: Peter J. Mello \n" "Language-Team: Portuguese (Portugal) \n" "Language: pt_PT\n" "MIME-Version: 1.0\n" @@ -67,7 +68,7 @@ msgstr "\"%s/\" não tem ficheiro de metadados correspondente!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" +msgstr "\"repo_pubkey\" deve estar presente em config.yml quando se usa --nosign!" #: ../fdroidserver/install.py #, python-brace-format @@ -447,9 +448,9 @@ msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, arc msgstr "Verificando o arquivamento para {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Verificando o arquivamento para {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "A verificar o arquivamento para {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -1736,15 +1737,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Estas são as aplicações que foram arquivadas do repositório principal." #: ../fdroidserver/common.py -#, fuzzy msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" -"\n" -" Este é um repositório de apps a serem usados com o FDroid.\n" -" Aplicações neste repositório são binários oficiais compilados pelos\n" -" programadores da aplicação original ou são binários compilados da\n" -" fonte por f-droid.org a usar as ferramentas em https://gitlab.com/fdroid.\n" -" " +msgstr "Este é um repositório de apps a serem usados com o F-Droid. Aplicações neste repositório são binários oficiais compilados pelos programadores da aplicação original ou são binários compilados da fonte por f-droid.org a usar as ferramentas em https://gitlab.com/fdroid." #: ../fdroidserver/import.py #, python-format @@ -2472,9 +2466,9 @@ msgid "refuse downloading via insecure http connection (use https or specify --n msgstr "Recusado o download via conexão http insegura (use https ou especifique --no-https-check): {apkfilename}" #: ../fdroidserver/index.py -#, fuzzy, python-format +#, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "repo_icon %s não existe, a gerar um espaço reservado." +msgstr "repo_icon \"repo/icons/%s\" não existe, a gerar um espaço reservado." #: ../fdroidserver/index.py #, python-format @@ -2680,9 +2674,9 @@ msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\" não existe! Corrija-o no config.yml." #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "{name} \"{path}\" não existe! Corrija-o no config.yml." +msgstr "{name} \"{section}/icons/{path}\" não existe! Corrija-o no \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format From e67cb8a1fa02684df51e7bfd0d6d49c25d199f7d Mon Sep 17 00:00:00 2001 From: Golubev Alexander Date: Sun, 31 Jan 2021 23:07:35 +0100 Subject: [PATCH 0135/2116] Translated using Weblate: Russian (ru) by Golubev Alexander Currently translated at 100.0% (576 of 576 strings) Co-authored-by: Golubev Alexander Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translation: F-Droid/F-Droid Server --- locale/ru/LC_MESSAGES/fdroidserver.po | 32 ++++++++++----------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 59dec8a2..7fc8b569 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -13,7 +13,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-14 21:33+0000\n" +"PO-Revision-Date: 2021-01-31 22:07+0000\n" "Last-Translator: Golubev Alexander \n" "Language-Team: Russian \n" "Language: ru\n" @@ -72,7 +72,7 @@ msgstr "У \"%s/\" нет соответствующего файла метад #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" +msgstr "При использовании --nosign в config.yml должен быть задан \"repo_pubkey\"!" #: ../fdroidserver/install.py #, python-brace-format @@ -259,11 +259,11 @@ msgstr "Добавить новое приложение из исходного #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" -msgstr "Добавить ключ для подписи в неподписанный репозиторий" +msgstr "Добавлять ключ для подписи в неподписанный репозиторий" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" -msgstr "Добавить основные отсутствующие файлы метаданных для нуждающихся в них APK" +msgstr "Добавлять основные файлы метаданных в APK, если они там отсутствуют" #: ../fdroidserver/update.py #, python-brace-format @@ -280,7 +280,7 @@ msgstr "Позволяет выбрать разные ревизии или в #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" -msgstr "Дополнительно создать полную копию раздела архива" +msgstr "Дополнительно создавать полную копию раздела архива" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" @@ -454,9 +454,9 @@ msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, arc msgstr "Проверка перед помещением в архив для {appid}. APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Проверка перед помещением в архив для {appid}. APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Проверка перед помещением в архив для {appid}. apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -1744,16 +1744,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Это те приложения, которые были заархивированы из основного репозитория." #: ../fdroidserver/common.py -#, fuzzy msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" -"\n" -" Это репозиторий приложений, предназначенных для использования в FDroid.\n" -" Приложения в этом репозитории являются либо официальными бинарными файлами,\n" -" созданными разработчиками оригинального приложения, либо бинарными файлами,\n" -" созданными f-droid.org из исходного кода с помощью инструментов\n" -" на https://gitlab.com/fdroid.\n" -" " +msgstr "Это репозиторий приложений, предназначенных для использования в FDroid. Приложения в этом репозитории являются либо официальными бинарными файлами, созданными разработчиками оригинального приложения, либо бинарными файлами, созданными f-droid.org из исходного кода с помощью инструментов на https://gitlab.com/fdroid." #: ../fdroidserver/import.py #, python-format @@ -2483,9 +2475,9 @@ msgid "refuse downloading via insecure http connection (use https or specify --n msgstr "использовать для загрузки небезопасное HTTP-соединение не стоит (пользуйтесь HTTPS или укажите --no-https-check): {apkfilename}" #: ../fdroidserver/index.py -#, fuzzy, python-format +#, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "значок репозитория (repo_icon) '%s' не существует, генерируется суррогат." +msgstr "значок репозитория (repo_icon) 'repo/icons/%s' не существует, генерируется суррогат." #: ../fdroidserver/index.py #, python-format @@ -2692,9 +2684,9 @@ msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name}: неверный путь \"{path}\"! Поправьте его в config.yml." #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "{name}: неверный путь \"{path}\"! Поправьте его в config.yml." +msgstr "{name}: \"{section}/icons/{path}\" не существует! Поправьте свой \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format From 65ef6f33e318e97a36ecf905f6118cc83f93d11d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 1 Feb 2021 22:50:03 +0100 Subject: [PATCH 0136/2116] make -C locale/ update --- locale/de/LC_MESSAGES/fdroidserver.po | 46 ---------------- locale/es/LC_MESSAGES/fdroidserver.po | 67 ------------------------ locale/es_AR/LC_MESSAGES/fdroidserver.po | 59 --------------------- 3 files changed, 172 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 19c9c96a..ff67ec62 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -2755,49 +2755,3 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "Buildvorgang erfolgreich" msgstr[1] "Buildvorgänge erfolgreich" - -#, fuzzy -#~ msgid "Add PGP signatures for packages in repo using GnuPG" -#~ msgstr "GPG-Signaturen für Programmpakete in der Paketquelle hinzufügen" - -#~ msgid "Add gpg signatures for packages in repo" -#~ msgstr "GPG-Signaturen für Programmpakete in der Paketquelle hinzufügen" - -#~ msgid "Cannot find a packageName for {path}!" -#~ msgstr "packageName für {path} konnte nicht gefunden werden!" - -#~ msgid "Cannot find an appid for {path}!" -#~ msgstr "AppID für {path} konnte nicht gefunden werden!" - -#~ msgid "Could not open APK file for analysis" -#~ msgstr "Konnte APK-Datei nicht für Analyse öffnen" - -#~ msgid "Interactively ask about things that need updating." -#~ msgstr "Angelegenheiten, die Aktualisierungen erfordern, interaktiv abfragen." - -#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -#~ msgstr "Einen Emulator einrichten, die APK installieren und mit ihm eine Sicherheitsprüfung (Drozer scan) durchführen" - -#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" -#~ msgstr "Einen Emulator einrichten, die APK installieren und mit ihm eine Sicherheitsprüfung (Drozer scan) durchführen" - -#~ msgid "Specify editor to use in interactive mode. Default " -#~ msgstr "Editor festlegen, der im interaktiven Modus verwendet werden soll. Standard " - -#~ msgid "Specify editor to use in interactive mode. Default %s" -#~ msgstr "Editor festlegen, der im interaktiven Modus verwendet werden soll. Standard %s" - -#~ msgid "Specify editor to use in interactive mode. Default is {path}" -#~ msgstr "Editor festlegen, der im interaktiven Modus verwendet werden soll. Standard ist {path}" - -#~ msgid "app-id in the form APPID" -#~ msgstr "App-ID in der Form APPID" - -#~ msgid "app-id to check for updates" -#~ msgstr "App-ID, um auf Aktualisierungen zu prüfen" - -#~ msgid "app-id with optional versionCode in the form APPID[:VERCODE]" -#~ msgstr "App-ID mit optionalem Versionscode in der Form APPID[:VERCODE]" - -#~ msgid "app-id with optional versioncode in the form APPID[:VERCODE]" -#~ msgstr "App-ID mit optionalem Versionscode in der Form APPID[:VERCODE]" diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index cb4c1eb4..75d95753 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -2739,70 +2739,3 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "compilación con éxito {}" msgstr[1] "compilaciones con éxito {}" - -#, fuzzy -#~ msgid "Add PGP signatures for packages in repo using GnuPG" -#~ msgstr "Añadir las firmas gpg para los paquetes en el repositorio" - -#~ msgid "Add gpg signatures for packages in repo" -#~ msgstr "Añadir las firmas gpg para los paquetes en el repositorio" - -#~ msgid "Cannot find a packageName for {path}!" -#~ msgstr "¡No se puede encontrar un packageName para {path}!" - -#~ msgid "Cannot find an appid for {path}!" -#~ msgstr "¡No se puede encontrar un appid para {path}!" - -#~ msgid "Clean after all scans have finished" -#~ msgstr "Limpiar después de que todos los análisis hayan finalizado" - -#~ msgid "Clean before the scans start and rebuild the container" -#~ msgstr "Limpiar antes de que los análisis inicien y reconstruir el contenedor" - -#~ msgid "Clean up all containers and then exit" -#~ msgstr "Limpiar todos los contenedores y luego salir" - -#~ msgid "Could not open APK file for analysis" -#~ msgstr "No se ha podido abrir el archivo APK para analizarlo" - -#~ msgid "Interactively ask about things that need updating." -#~ msgstr "Pregunte de forma interactiva sobre temas que necesitan una actualización." - -#~ msgid "Override path for repo APKs (default: ./repo)" -#~ msgstr "Ruta de remplazo par el repositorio de APK (default: ./repo)" - -#~ msgid "Prepare Drozer to run a scan" -#~ msgstr "Preparar \"Drozer\" para ejecutar un análisis" - -#~ msgid "Prepare drozer to run a scan" -#~ msgstr "Preparar \"Drozer\" para ejecutar un análisis" - -#~ msgid "Scan only the latest version of each package" -#~ msgstr "Escanear solo la última versión de cada paquete" - -#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -#~ msgstr "Establecer un emulador, instalar la APK en el y realizar un escaneo con \"Drozer\"" - -#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" -#~ msgstr "Configurar un emulador, instalar la aplicación APK en él y realizar una \"Drozer\" scan" - -#~ msgid "Specify editor to use in interactive mode. Default " -#~ msgstr "Especifique el editor para utilizar en modo interactivo. Predeterminado " - -#~ msgid "Specify editor to use in interactive mode. Default %s" -#~ msgstr "Especifique el editor para utilizar en modo interactivo. Predeterminado %s" - -#~ msgid "Specify editor to use in interactive mode. Default is {path}" -#~ msgstr "Especifique el editor para utilizar en modo interactivo. Por defecto es {path}" - -#~ msgid "app-id in the form APPID" -#~ msgstr "APP-ID en el formato APPID" - -#~ msgid "app-id to check for updates" -#~ msgstr "APP-ID para buscar actualizaciones" - -#~ msgid "app-id with optional versionCode in the form APPID[:VERCODE]" -#~ msgstr "APP-ID con código de versión opcional en la forma APPID [: VERCODE]" - -#~ msgid "app-id with optional versioncode in the form APPID[:VERCODE]" -#~ msgstr "APP-ID con código de versión opcional en la forma APPID [: VERCODE]" diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index 6bd5999e..0384405f 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -2736,62 +2736,3 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "" msgstr[1] "" - -#, fuzzy -#~ msgid "Add PGP signatures for packages in repo using GnuPG" -#~ msgstr "Agregar firmas GPG a paquetes en el repositorio" - -#~ msgid "Add gpg signatures for packages in repo" -#~ msgstr "Agregar firmas GPG a paquetes en el repositorio" - -#~ msgid "Clean after all scans have finished" -#~ msgstr "Limpiar luego de que todos los escaneos hayan terminado" - -#~ msgid "Clean before the scans start and rebuild the container" -#~ msgstr "Limpiar antes de que el escaneo comience y reconstruir el contenedor" - -#~ msgid "Clean up all containers and then exit" -#~ msgstr "Limpiar todos los contenedores y salir" - -#~ msgid "Interactively ask about things that need updating." -#~ msgstr "Preguntar de forma interactiva sobre las cosas necesarias a actualizar." - -#~ msgid "Override path for repo APKs (default: ./repo)" -#~ msgstr "Sobrescribir la ruta de los repositorios APKs (por defecto ./repo)" - -#~ msgid "Prepare drozer to run a scan" -#~ msgstr "Preparar drozer para que ejecute un escaneo" - -#~ msgid "Scan only the latest version of each package" -#~ msgstr "Escanear solo la ultima versión de cada paquete" - -#, fuzzy -#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -#~ msgstr "Configurar un emulador, instalarle el APK y realizar el escaneo de barrido" - -#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" -#~ msgstr "Configurar un emulador, instalarle el APK y realizar el escaneo de barrido" - -#, fuzzy -#~ msgid "Specify editor to use in interactive mode. Default " -#~ msgstr "Especificar el editor a usar en modo interactivo. Por defecto %s" - -#~ msgid "Specify editor to use in interactive mode. Default %s" -#~ msgstr "Especificar el editor a usar en modo interactivo. Por defecto %s" - -#, fuzzy -#~ msgid "Specify editor to use in interactive mode. Default is {path}" -#~ msgstr "Especificar el editor a usar en modo interactivo. Por defecto %s" - -#~ msgid "app-id in the form APPID" -#~ msgstr "app-id en el formato APPID" - -#~ msgid "app-id to check for updates" -#~ msgstr "app-id para verificar actualizaciones" - -#, fuzzy -#~ msgid "app-id with optional versionCode in the form APPID[:VERCODE]" -#~ msgstr "app-id con VersionCode opcional con el formato APPID[:VERCODE]" - -#~ msgid "app-id with optional versioncode in the form APPID[:VERCODE]" -#~ msgstr "app-id con versioncode opcional en el formato APPID[:VERCODE]" From fa186c40c4c2cb146cabf0abe763eb6583859d4c Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 1 Feb 2021 22:41:31 +0100 Subject: [PATCH 0137/2116] version 2.0 --- CHANGELOG.md | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dda785f5..dd5538ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) -## [Unreleased] +## [2.0] - 2020-01-31 For a more complete overview, see the [2.0 milestone](https://gitlab.com/fdroid/fdroidserver/-/milestones/10) diff --git a/setup.py b/setup.py index 2a387307..252327a2 100755 --- a/setup.py +++ b/setup.py @@ -53,7 +53,7 @@ with open("README.md", "r") as fh: long_description = fh.read() setup(name='fdroidserver', - version='2.0b1', + version='2.0', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From 210356995861066c0649446d33ff95fb245075ac Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 2 Feb 2021 09:07:28 +0100 Subject: [PATCH 0138/2116] Run push_binary_transparency only once --- fdroidserver/deploy.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 9790fee0..ca7bff54 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -802,10 +802,10 @@ def main(): if config.get('virustotal_apikey'): upload_to_virustotal(repo_section, config.get('virustotal_apikey')) - binary_transparency_remote = config.get('binary_transparency_remote') - if binary_transparency_remote: - push_binary_transparency(BINARY_TRANSPARENCY_DIR, - binary_transparency_remote) + binary_transparency_remote = config.get('binary_transparency_remote') + if binary_transparency_remote: + push_binary_transparency(BINARY_TRANSPARENCY_DIR, + binary_transparency_remote) if config.get('wiki_server') and config.get('wiki_path'): update_wiki() From f3097e142d3ce0d5cb08dc05c893ba8b14f77fd6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 2 Feb 2021 11:36:43 +0100 Subject: [PATCH 0139/2116] fix broken GitLab CI badge on README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dac49d72..e1d9b970 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ | CI Builds | fdroidserver | buildserver | fdroid build --all | publishing tools | |--------------------------|:-------------:|:-----------:|:------------------:|:----------------:| -| GNU/Linux | [![fdroidserver status on GNU/Linux](https://gitlab.com/fdroid/fdroidserver/badges/master/build.svg)](https://gitlab.com/fdroid/fdroidserver/builds) | [![buildserver status](https://jenkins.debian.net/job/reproducible_setup_fdroid_build_environment/badge/icon)](https://jenkins.debian.net/job/reproducible_setup_fdroid_build_environment) | [![fdroid build all status](https://jenkins.debian.net/job/reproducible_fdroid_build_apps/badge/icon)](https://jenkins.debian.net/job/reproducible_fdroid_build_apps/) | [![fdroid test status](https://jenkins.debian.net/job/reproducible_fdroid_test/badge/icon)](https://jenkins.debian.net/job/reproducible_fdroid_test/) | +| GNU/Linux | [![fdroidserver status on GNU/Linux](https://gitlab.com/fdroid/fdroidserver/badges/master/pipeline.svg)](https://gitlab.com/fdroid/fdroidserver/-/jobs) | [![buildserver status](https://jenkins.debian.net/job/reproducible_setup_fdroid_build_environment/badge/icon)](https://jenkins.debian.net/job/reproducible_setup_fdroid_build_environment) | [![fdroid build all status](https://jenkins.debian.net/job/reproducible_fdroid_build_apps/badge/icon)](https://jenkins.debian.net/job/reproducible_fdroid_build_apps/) | [![fdroid test status](https://jenkins.debian.net/job/reproducible_fdroid_test/badge/icon)](https://jenkins.debian.net/job/reproducible_fdroid_test/) | | macOS | [![fdroidserver status on macOS](https://travis-ci.org/f-droid/fdroidserver.svg?branch=master)](https://travis-ci.org/f-droid/fdroidserver) | | | | From 682761e75d9adb8166d42c864637e78b244cc0d4 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 2 Feb 2021 11:41:08 +0100 Subject: [PATCH 0140/2116] setup changelog and version for development --- CHANGELOG.md | 3 +++ setup.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd5538ee..e71e2e83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +## [Unreleased] + + ## [2.0] - 2020-01-31 For a more complete overview, see the [2.0 diff --git a/setup.py b/setup.py index 252327a2..669ec33a 100755 --- a/setup.py +++ b/setup.py @@ -53,7 +53,7 @@ with open("README.md", "r") as fh: long_description = fh.read() setup(name='fdroidserver', - version='2.0', + version='2.0.1a0', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From fc7f9204b6bf6afead8685ed09c968862fd0705d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 2 Feb 2021 21:37:53 +0100 Subject: [PATCH 0141/2116] checkupdates: set User-Agent to make gitlab.com happy closes #863 --- fdroidserver/checkupdates.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 460a7373..f5d0d450 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -35,6 +35,7 @@ import urllib.parse from . import _ from . import common from . import metadata +from . import net from .exception import VCSException, NoSubmodulesException, FDroidException, MetaDataException @@ -63,7 +64,7 @@ def check_http(app): vercode = None if len(urlcode) > 0: logging.debug("...requesting {0}".format(urlcode)) - req = urllib.request.Request(urlcode, None) + req = urllib.request.Request(urlcode, None, headers=net.HEADERS) resp = urllib.request.urlopen(req, None, 20) # nosec B310 scheme is filtered above page = resp.read().decode('utf-8') From 3d536d4515aa399827dd6d50fb7502d30ea636e6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 8 Feb 2021 09:11:48 +0100 Subject: [PATCH 0142/2116] gitlab-ci: use python3-cryptography to avoid building rust sources --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index dba0f7a2..0a9bcb3e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -309,9 +309,10 @@ plugin_fetchsrclibs: - apt-get install curl git + python3-cryptography python3-pip python3-venv - - python3 -m venv env + - python3 -m venv --system-site-packages env - . env/bin/activate - export PATH="$CI_PROJECT_DIR:$PATH" - export PYTHONPATH="$CI_PROJECT_DIR/examples" From c887c14be1f72394e0b50bfafd287b0200c5f4e9 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 8 Feb 2021 11:40:41 +0100 Subject: [PATCH 0143/2116] gitlab-ci: use python3-cryptography to avoid building rust sources --- .gitlab-ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0a9bcb3e..800c2057 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -335,7 +335,7 @@ plugin_fetchsrclibs: # test a full update and deploy cycle to gitlab.com servergitmirrors: - image: debian + image: debian:buster <<: *apt-template only: - master@fdroid/fdroidserver @@ -345,11 +345,12 @@ servergitmirrors: git openssh-client openssl + python3-cryptography python3-pip python3-venv rsync wget - - python3 -m venv env + - python3 -m venv --system-site-packages env - . env/bin/activate - export PYTHONPATH=`pwd` - $pip install -e . From 59a4ec79b359e19c2981b6308e39b34a4c4a440e Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Mon, 8 Feb 2021 10:42:22 +0000 Subject: [PATCH 0144/2116] gradle v6.8.2 --- gradlew-fdroid | 3 ++- makebuildserver | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index c56c9ce4..528e41d6 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -156,6 +156,7 @@ get_sha() { '6.7.1') echo '3239b5ed86c3838a37d983ac100573f64c1f3fd8e1eb6c89fa5f9529b5ec091d' ;; '6.8') echo 'e2774e6fb77c43657decde25542dea710aafd78c4022d19b196e7e78d79d8c6c' ;; '6.8.1') echo 'fd591a34af7385730970399f473afabdb8b28d57fd97d6625c388d090039d6fd' ;; + '6.8.2') echo '8de6efc274ab52332a9c820366dd5cf5fc9d35ec7078fd70c8ec6913431ee610' ;; *) exit 1 esac } @@ -176,7 +177,7 @@ d_plugin_k=(4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 d_plugin_v=(6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} diff --git a/makebuildserver b/makebuildserver index 66be3eb7..a2456382 100755 --- a/makebuildserver +++ b/makebuildserver @@ -405,6 +405,8 @@ CACHE_FILES = [ 'e2774e6fb77c43657decde25542dea710aafd78c4022d19b196e7e78d79d8c6c'), ('https://services.gradle.org/distributions/gradle-6.8.1-bin.zip', 'fd591a34af7385730970399f473afabdb8b28d57fd97d6625c388d090039d6fd'), + ('https://services.gradle.org/distributions/gradle-6.8.2-bin.zip', + '8de6efc274ab52332a9c820366dd5cf5fc9d35ec7078fd70c8ec6913431ee610'), ('https://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin', '102d6723f67ff1384330d12c45854315d6452d6510286f4e5891e00a5a8f1d5a'), ('https://dl.google.com/android/repository/android-ndk-r11c-linux-x86_64.zip', From 12682f063d5b61852238c8f99d535a304d04d5d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit@posteo.de> Date: Mon, 18 Jan 2021 11:54:04 +0100 Subject: [PATCH 0145/2116] First draft of index.html generation --- fdroidserver/index.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index fb62014b..c2d287db 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -230,6 +230,41 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ else: json.dump(output, fp, default=_index_encoder_default) + html_name = 'index.html' + html_file = os.path.join(repodir, html_name) + with open(html_file, 'w') as f: + name = repodict["name"] + description = repodict["description"] + f.write(""" + + + + {name} + + + + + + + + + + +

{name}

+
+

+QR: {name} + +{description}
+{details}

+{link} +
+""".format(name=name, +description=description, +details="Currently it serves {} apps. To add it to your F-Droid client, scan the QR code (click it to enlarge) or use this URL:".format(len(output['apps'])), +link=repodict["address"] +)) + if common.options.nosign: logging.debug(_('index-v1 must have a signature, use `fdroid signindex` to create it!')) else: From 788333991d61ad4492aecda87dbfdf95c0e2c766 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit@posteo.de> Date: Mon, 18 Jan 2021 13:12:46 +0100 Subject: [PATCH 0146/2116] move code to own method --- fdroidserver/index.py | 75 +++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 35 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index c2d287db..52dee442 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -129,7 +129,47 @@ def make(apps, apks, repodir, archive): fdroid_signing_key_fingerprints) make_v1(sortedapps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fingerprints) + make_website(sortedapps, repodir, repodict) +def make_website(apps, repodir, repodict): + website_dir = os.path.join(repodir, "www") + if not os.path.exists(website_dir): + os.makedirs(website_dir) + html_name = 'index.html' + + html_file = os.path.join(website_dir, html_name) + with open(html_file, 'w') as f: + name = repodict["name"] + description = repodict["description"] + f.write(""" + + + + {name} + + + + + + + + + + +

{name}

+
+

+QR: {name} + +{description}
+{details}

+{link} +
+""".format(name=name, +description=description, +details="Currently it serves {} apps. To add it to your F-Droid client, scan the QR code (click it to enlarge) or use this URL:".format(len(apps)), +link=repodict["address"] +)) def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_fingerprints): @@ -230,41 +270,6 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ else: json.dump(output, fp, default=_index_encoder_default) - html_name = 'index.html' - html_file = os.path.join(repodir, html_name) - with open(html_file, 'w') as f: - name = repodict["name"] - description = repodict["description"] - f.write(""" - - - - {name} - - - - - - - - - - -

{name}

-
-

-QR: {name} - -{description}
-{details}

-{link} -
-""".format(name=name, -description=description, -details="Currently it serves {} apps. To add it to your F-Droid client, scan the QR code (click it to enlarge) or use this URL:".format(len(output['apps'])), -link=repodict["address"] -)) - if common.options.nosign: logging.debug(_('index-v1 must have a signature, use `fdroid signindex` to create it!')) else: From 44ee531426c9848aa03f7a495fa66c061a838ece Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit@posteo.de> Date: Mon, 25 Jan 2021 09:35:25 +0100 Subject: [PATCH 0147/2116] Add QR code and css --- fdroidserver/index.py | 138 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 130 insertions(+), 8 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 52dee442..76f92030 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -30,6 +30,7 @@ import tempfile import urllib.parse import zipfile import calendar +import qrcode from binascii import hexlify, unhexlify from datetime import datetime, timezone from xml.dom.minidom import Document @@ -132,12 +133,13 @@ def make(apps, apks, repodir, archive): make_website(sortedapps, repodir, repodict) def make_website(apps, repodir, repodict): - website_dir = os.path.join(repodir, "www") - if not os.path.exists(website_dir): - os.makedirs(website_dir) + if not os.path.exists(repodir): + os.makedirs(repodir) html_name = 'index.html' - html_file = os.path.join(website_dir, html_name) + link=repodict["address"] + + html_file = os.path.join(repodir, html_name) with open(html_file, 'w') as f: name = repodict["name"] description = repodict["description"] @@ -146,8 +148,8 @@ def make_website(apps, repodir, repodict): {name} - - + + @@ -168,8 +170,128 @@ def make_website(apps, repodir, repodict): """.format(name=name, description=description, details="Currently it serves {} apps. To add it to your F-Droid client, scan the QR code (click it to enlarge) or use this URL:".format(len(apps)), -link=repodict["address"] -)) +link=link)) + + css_file = os.path.join(repodir, "index.css") + with open(css_file, "w") as f: + f.write(""" +BODY { + font-family: Arial, Helvetica, Sans-Serif; + color: #0000ee; + background-color: #ffffff; +} +p { text-align:justify; } +p.center { text-align:center; } +TD { + font-family: Arial, Helvetica, Sans-Serif; + color: #0000ee; +} +body,td { font-size:14px;} +TH { + font-family: Arial, Helvetica, Sans-Serif; + color: #0000ee; + background-color: #F5EAD4; +} +a:link { color: #bb0000; } +a:visited { color: #ff0000; } +.zitat { margin-left:1cm; margin-right:1cm; font-style:italic; } +#intro { + border-spacing:1em; + border:1px solid gray; + border-radius:0.5em; + box-shadow: 10px 10px 5px #888; + margin:1.5em; + font-size:.9em; + width:600px; max-width:90%; + display:table; margin-left:auto;margin-right:auto; + font-size:.8em; color: #555555; +} +#intro > p { margin-top:0;} +#intro p:last-child {margin-bottom:0;} +.last { + border-bottom: 1px solid black; + padding-bottom:.5em; + text-align:center; +} +table { border-collapse:collapse; } +h2 { text-align:center; } +.perms { font-family: monospace; font-size:.8em; } + +.repoapplist { display:table; border-collapse:collapse; margin-left:auto; margin-right:auto; width:600px; max-width:90%; } +.approw, appdetailrow { display:table-row; } +.appdetailrow { display:flex; padding:.5em; } +.appiconbig, .appdetailblock, .appdetailcell { display:table-cell } +.appiconbig { vertical-align:middle; text-align:center; } +.appdetailinner { width:100%; } +.applinkcell { text-align:center; float:right; width:100%; margin-bottom:.1em; } +.paddedlink { margin:1em; } + +.approw { + border-spacing:1em; + border:1px solid gray; + border-radius:0.5em; + padding:0.5em; + margin:1.5em; +} +.appdetailinner .appdetailrow:first-child { background-color:#d5d5d5; } +.appdetailinner .appdetailrow:first-child .appdetailcell { min-width:33%; flex:1 33%; text-align:center; } +.appdetailinner .appdetailrow:first-child .appdetailcell:first-child { text-align:left; } +.appdetailinner .appdetailrow:first-child .appdetailcell:last-child { float:none; text-align:right; } + +.minor-details { font-size:.8em; color: #555555; } +.boldname { font-weight:bold; } +#appcount { text-align:center; margin-bottom:.5em; } + +kbd { + padding: 0.1em 0.6em; + border: 1px solid #CCC; + background-color: #F7F7F7; + color: #333; + box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 2px #FFF inset; + border-radius: 3px; + display: inline-block; + margin: 0px 0.1em; + text-shadow: 0px 1px 0px #FFF; + white-space: nowrap; +} + +div.filterline, div.repoline { display:table;margin-left:auto;margin-right:auto;margin-bottom:1em;vertical-align:middle;display:table;font-size:.8em; } +.filterline form { display:table-row; } +.filterline .filtercell { display:table-cell;vertical-align:middle; } +fieldset { float:left; } +fieldset select, fieldset input, #reposelect select, #reposelect input { font-size:.9em; } + +.pager { display:table; margin-left:auto; margin-right:auto; width:600px; max-width:90%; padding-top:.6em; } /* should correspond to .repoapplist */ +.pagerrow { display:table-row; } +.pagercell { display:table-cell; } +.pagercell.left { text-align:left; padding-right:1em; } +.pagercell.middle { text-align:center; font-size:.9em; color:#555; } +.pagercell.right { text-align:right; padding-left:1em; } + +.anti { color: peru; } +.antibold { color: crimson; } + +#footer { + text-align:center; + margin-top:1em; + font-size:11px; + color:#555; +} +#footer img { vertical-align:middle; } + +@media (max-width: 600px) { + .repoapplist { display:block; } + .appdetailinner, .appdetailrow { display:block; } + .appdetailcell { display:block; float:left; line-height:1.5em; } +} + """) + + #qrcode.make(repodir["address"]).save(os.path.join(repodir, "images", "fdroid_repo_qr.png")) + images_dir = os.path.join(repodir, "images") + if not os.path.exists(images_dir): + os.makedirs(images_dir) + qrcode.make(link).save(os.path.join(images_dir, "fdroid_repo_qr.png")) + def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_fingerprints): From 997f5d267b6aeb9264e136252705bffc667a086a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit@posteo.de> Date: Mon, 25 Jan 2021 09:59:10 +0100 Subject: [PATCH 0148/2116] Properly add css --- fdroidserver/common.py | 1 + fdroidserver/index.py | 13 ++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index a19795a0..4a5a39df 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3764,6 +3764,7 @@ def is_repo_file(filename): and not filename.endswith(b'.idsig') \ and not filename.endswith(b'.log.gz') \ and os.path.basename(filename) not in [ + b'index.css', b'index.jar', b'index_unsigned.jar', b'index.xml', diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 76f92030..5465573d 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -149,7 +149,7 @@ def make_website(apps, repodir, repodict): {name} - + @@ -160,16 +160,20 @@ def make_website(apps, repodir, repodict):

{name}

-

-QR: {name} +

+QR: {name} {description}
{details}

+

+ {link} + +

""".format(name=name, description=description, -details="Currently it serves {} apps. To add it to your F-Droid client, scan the QR code (click it to enlarge) or use this URL:".format(len(apps)), +details="Currently it serves {} apps. To add it to your F-Droid client, scan the QR code (click it to enlarge) or use this URL:".format(len(apps)), link=link)) css_file = os.path.join(repodir, "index.css") @@ -286,7 +290,6 @@ fieldset select, fieldset input, #reposelect select, #reposelect input { font-si } """) - #qrcode.make(repodir["address"]).save(os.path.join(repodir, "images", "fdroid_repo_qr.png")) images_dir = os.path.join(repodir, "images") if not os.path.exists(images_dir): os.makedirs(images_dir) From 4d464051ff5e7615aa2aea02e81e3c41589f516f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit@posteo.de> Date: Mon, 25 Jan 2021 10:17:06 +0100 Subject: [PATCH 0149/2116] Fix pycodestlye errors --- fdroidserver/index.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 5465573d..609d9f1f 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -132,12 +132,13 @@ def make(apps, apks, repodir, archive): fdroid_signing_key_fingerprints) make_website(sortedapps, repodir, repodict) + def make_website(apps, repodir, repodict): if not os.path.exists(repodir): os.makedirs(repodir) html_name = 'index.html' - link=repodict["address"] + link = repodict["address"] html_file = os.path.join(repodir, html_name) with open(html_file, 'w') as f: @@ -172,9 +173,9 @@ def make_website(apps, repodir, repodict):

""".format(name=name, -description=description, -details="Currently it serves {} apps. To add it to your F-Droid client, scan the QR code (click it to enlarge) or use this URL:".format(len(apps)), -link=link)) + description=description, + details="Currently it serves {} apps. To add it to your F-Droid client, scan the QR code (click it to enlarge) or use this URL:".format(len(apps)), + link=link)) css_file = os.path.join(repodir, "index.css") with open(css_file, "w") as f: @@ -287,8 +288,7 @@ fieldset select, fieldset input, #reposelect select, #reposelect input { font-si .repoapplist { display:block; } .appdetailinner, .appdetailrow { display:block; } .appdetailcell { display:block; float:left; line-height:1.5em; } -} - """) +}""") images_dir = os.path.join(repodir, "images") if not os.path.exists(images_dir): From 8d51566a70d2fc717820b8b85cf16fd6580f773c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit@posteo.de> Date: Mon, 25 Jan 2021 11:25:49 +0100 Subject: [PATCH 0150/2116] * Change image name * add fingerprint --- fdroidserver/common.py | 1 + fdroidserver/index.py | 85 +++++++++++++++++++++++++----------------- 2 files changed, 51 insertions(+), 35 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 4a5a39df..84451d70 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3769,6 +3769,7 @@ def is_repo_file(filename): b'index_unsigned.jar', b'index.xml', b'index.html', + b'index.png', b'index-v1.jar', b'index-v1.json', b'categories.txt', diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 609d9f1f..ff391abd 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -134,48 +134,66 @@ def make(apps, apks, repodir, archive): def make_website(apps, repodir, repodict): + _, repo_pubkey_fingerprint = extract_pubkey() + repo_pubkey_fingerprint_stripped = repo_pubkey_fingerprint.replace(" ", "") + link = repodict["address"] + link_fingerprinted = "{link}?fingerprint={fingerprint}".format(link=link, fingerprint=repo_pubkey_fingerprint_stripped) + if not os.path.exists(repodir): os.makedirs(repodir) html_name = 'index.html' - link = repodict["address"] - html_file = os.path.join(repodir, html_name) with open(html_file, 'w') as f: name = repodict["name"] description = repodict["description"] f.write(""" - - - - {name} - - - - - - - - - - -

{name}

-
-

-QR: {name} - -{description}
-{details}

-

- -{link} - -

-
-""".format(name=name, + + + + + {name} + + + + + + + + + + + +

{name}

+
+

+ + QR: {name} + + {description} +
+
+ {details} +

+

+ + + {link} + + +

+

If you would like to manually verify the fingerprint (SHA-256) of the repository signing key, here it is:
+ + {fingerprint} + +

+
+ """.format(name=name, description=description, details="Currently it serves {} apps. To add it to your F-Droid client, scan the QR code (click it to enlarge) or use this URL:".format(len(apps)), - link=link)) + fingerprint=repo_pubkey_fingerprint, + link=link, + link_fingerprinted=link_fingerprinted)) css_file = os.path.join(repodir, "index.css") with open(css_file, "w") as f: @@ -290,10 +308,7 @@ fieldset select, fieldset input, #reposelect select, #reposelect input { font-si .appdetailcell { display:block; float:left; line-height:1.5em; } }""") - images_dir = os.path.join(repodir, "images") - if not os.path.exists(images_dir): - os.makedirs(images_dir) - qrcode.make(link).save(os.path.join(images_dir, "fdroid_repo_qr.png")) + qrcode.make(link_fingerprinted).save(os.path.join(repodir, "index.png")) def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_fingerprints): From 96854be84a9374ceed4d9c74870d068f8516de56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit@posteo.de> Date: Tue, 26 Jan 2021 13:06:06 +0100 Subject: [PATCH 0151/2116] Only overwrite index.html/css files which were created by fdroid update Further changes: * use real value for icon instead of hard coded value * Move qrcode.make() to top * fix identation of css file generation --- fdroidserver/index.py | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index ff391abd..8ba53b88 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -133,21 +133,36 @@ def make(apps, apks, repodir, archive): make_website(sortedapps, repodir, repodict) +def _should_file_be_generated(path, magic_string): + if os.path.exists(path): + with open(path) as f: + if not magic_string in f.readline(): # if the magic_string is not in the first line the file should be overwritten + return False + return True + + def make_website(apps, repodir, repodict): _, repo_pubkey_fingerprint = extract_pubkey() repo_pubkey_fingerprint_stripped = repo_pubkey_fingerprint.replace(" ", "") link = repodict["address"] link_fingerprinted = "{link}?fingerprint={fingerprint}".format(link=link, fingerprint=repo_pubkey_fingerprint_stripped) + autogenerate_comment = "auto-generated - fdroid index updates will overwrite this file" # do not change this string, as it will break the updates for existing files with older versions of this string if not os.path.exists(repodir): os.makedirs(repodir) - html_name = 'index.html' + + qrcode.make(link_fingerprinted).save(os.path.join(repodir, "index.png")) + html_name = 'index.html' html_file = os.path.join(repodir, html_name) - with open(html_file, 'w') as f: - name = repodict["name"] - description = repodict["description"] - f.write(""" + + if _should_file_be_generated(html_file, autogenerate_comment): + with open(html_file, 'w') as f: + name = repodict["name"] + description = repodict["description"] + icon = repodict["icon"] + f.write(""" + @@ -155,8 +170,8 @@ def make_website(apps, repodir, repodict): {name} - - + + @@ -188,16 +203,20 @@ def make_website(apps, repodir, repodict):

- """.format(name=name, + """.format(autogenerate_comment=autogenerate_comment, description=description, details="Currently it serves {} apps. To add it to your F-Droid client, scan the QR code (click it to enlarge) or use this URL:".format(len(apps)), fingerprint=repo_pubkey_fingerprint, + icon=icon, link=link, - link_fingerprinted=link_fingerprinted)) + link_fingerprinted=link_fingerprinted, + name=name)) - css_file = os.path.join(repodir, "index.css") + css_file = os.path.join(repodir, "index.css") + if _should_file_be_generated(css_file, autogenerate_comment): with open(css_file, "w") as f: - f.write(""" + # this auto generated comment was not included via .format(), as python seems to have problems with css files in combination with .format() + f.write("""/* auto-generated - fdroid index updates will overwrite this file */ BODY { font-family: Arial, Helvetica, Sans-Serif; color: #0000ee; @@ -308,8 +327,6 @@ fieldset select, fieldset input, #reposelect select, #reposelect input { font-si .appdetailcell { display:block; float:left; line-height:1.5em; } }""") - qrcode.make(link_fingerprinted).save(os.path.join(repodir, "index.png")) - def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_fingerprints): From 0936051c7bb579f65f17e76f8955099bb98320da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit@posteo.de> Date: Mon, 1 Feb 2021 06:42:53 +0100 Subject: [PATCH 0152/2116] Fix pep8 --- fdroidserver/index.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 8ba53b88..2b73ec4c 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -136,7 +136,7 @@ def make(apps, apks, repodir, archive): def _should_file_be_generated(path, magic_string): if os.path.exists(path): with open(path) as f: - if not magic_string in f.readline(): # if the magic_string is not in the first line the file should be overwritten + if magic_string not in f.readline(): # if the magic_string is not in the first line the file should be overwritten return False return True @@ -146,11 +146,11 @@ def make_website(apps, repodir, repodict): repo_pubkey_fingerprint_stripped = repo_pubkey_fingerprint.replace(" ", "") link = repodict["address"] link_fingerprinted = "{link}?fingerprint={fingerprint}".format(link=link, fingerprint=repo_pubkey_fingerprint_stripped) - autogenerate_comment = "auto-generated - fdroid index updates will overwrite this file" # do not change this string, as it will break the updates for existing files with older versions of this string + autogenerate_comment = "auto-generated - fdroid index updates will overwrite this file" # do not change this string, as it will break the updates for existing files with older versions of this string if not os.path.exists(repodir): os.makedirs(repodir) - + qrcode.make(link_fingerprinted).save(os.path.join(repodir, "index.png")) html_name = 'index.html' @@ -204,13 +204,13 @@ def make_website(apps, repodir, repodict):

""".format(autogenerate_comment=autogenerate_comment, - description=description, - details="Currently it serves {} apps. To add it to your F-Droid client, scan the QR code (click it to enlarge) or use this URL:".format(len(apps)), - fingerprint=repo_pubkey_fingerprint, - icon=icon, - link=link, - link_fingerprinted=link_fingerprinted, - name=name)) + description=description, + details="Currently it serves {} apps. To add it to your F-Droid client, scan the QR code (click it to enlarge) or use this URL:".format(len(apps)), + fingerprint=repo_pubkey_fingerprint, + icon=icon, + link=link, + link_fingerprinted=link_fingerprinted, + name=name)) css_file = os.path.join(repodir, "index.css") if _should_file_be_generated(css_file, autogenerate_comment): From 022d73b3b6b0c25b0e01af5e9a63df2a1606e700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit@posteo.de> Date: Mon, 1 Feb 2021 07:54:48 +0100 Subject: [PATCH 0153/2116] Add HTML/CSS tidy test and tidy up the content --- fdroidserver/index.py | 402 ++++++++++++++++++++++++++++-------------- tests/index.TestCase | 36 ++++ 2 files changed, 303 insertions(+), 135 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 2b73ec4c..f9120bd8 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -162,55 +162,69 @@ def make_website(apps, repodir, repodict): description = repodict["description"] icon = repodict["icon"] f.write(""" - - - - - - {name} - - - - - - - - - - - -

{name}

-
-

- - QR: {name} - - {description} -
-
- {details} -

-

- - - {link} - - -

-

If you would like to manually verify the fingerprint (SHA-256) of the repository signing key, here it is:
- - {fingerprint} - -

-
- """.format(autogenerate_comment=autogenerate_comment, + + + + + + + {name} + + + + + + + + + + + + +

+ {name} +

+
+

+ + + QR: test + + + {description} +
+
+ Currently it serves + + {number_of_apps} + + apps. To add it to your F-Droid client, scan the QR code (click it to enlarge) or use this URL: +

+

+ + + {link} + + +

+

+ If you would like to manually verify the fingerprint (SHA-256) of the repository signing key, here it is: +
+ + {fingerprint} + +

+
+ + +""".format(autogenerate_comment=autogenerate_comment, description=description, - details="Currently it serves {} apps. To add it to your F-Droid client, scan the QR code (click it to enlarge) or use this URL:".format(len(apps)), fingerprint=repo_pubkey_fingerprint, icon=icon, link=link, link_fingerprinted=link_fingerprinted, - name=name)) + name=name, + number_of_apps=str(len(apps)))) css_file = os.path.join(repodir, "index.css") if _should_file_be_generated(css_file, autogenerate_comment): @@ -218,113 +232,231 @@ def make_website(apps, repodir, repodict): # this auto generated comment was not included via .format(), as python seems to have problems with css files in combination with .format() f.write("""/* auto-generated - fdroid index updates will overwrite this file */ BODY { - font-family: Arial, Helvetica, Sans-Serif; - color: #0000ee; - background-color: #ffffff; + font-family : Arial, Helvetica, Sans-Serif; + color : #0000ee; + background-color : #ffffff; +} +p { + text-align : justify; +} +p.center { + text-align : center; } -p { text-align:justify; } -p.center { text-align:center; } TD { - font-family: Arial, Helvetica, Sans-Serif; - color: #0000ee; + font-family : Arial, Helvetica, Sans-Serif; + color : #0000ee; +} +body,td { + font-size : 14px; } -body,td { font-size:14px;} TH { - font-family: Arial, Helvetica, Sans-Serif; - color: #0000ee; - background-color: #F5EAD4; + font-family : Arial, Helvetica, Sans-Serif; + color : #0000ee; + background-color : #F5EAD4; +} +a:link { + color : #bb0000; +} +a:visited { + color : #ff0000; +} +.zitat { + margin-left : 1cm; + margin-right : 1cm; + font-style : italic; } -a:link { color: #bb0000; } -a:visited { color: #ff0000; } -.zitat { margin-left:1cm; margin-right:1cm; font-style:italic; } #intro { - border-spacing:1em; - border:1px solid gray; - border-radius:0.5em; - box-shadow: 10px 10px 5px #888; - margin:1.5em; - font-size:.9em; - width:600px; max-width:90%; - display:table; margin-left:auto;margin-right:auto; - font-size:.8em; color: #555555; + border-spacing : 1em; + border : 1px solid gray; + border-radius : 0.5em; + box-shadow : 10px 10px 5px #888; + margin : 1.5em; + font-size : .9em; + width : 600px; + max-width : 90%; + display : table; + margin-left : auto; + margin-right : auto; + font-size : .8em; + color : #555555; +} +#intro > p { + margin-top : 0; +} +#intro p:last-child { + margin-bottom : 0; } -#intro > p { margin-top:0;} -#intro p:last-child {margin-bottom:0;} .last { - border-bottom: 1px solid black; - padding-bottom:.5em; - text-align:center; + border-bottom : 1px solid black; + padding-bottom : .5em; + text-align : center; +} +table { + border-collapse : collapse; +} +h2 { + text-align : center; +} +.perms { + font-family : monospace; + font-size : .8em; +} +.repoapplist { + display : table; + border-collapse : collapse; + margin-left : auto; + margin-right : auto; + width : 600px; + max-width : 90%; +} +.approw, appdetailrow { + display : table-row; +} +.appdetailrow { + display : flex; + padding : .5em; +} +.appiconbig, .appdetailblock, .appdetailcell { + display : table-cell +} +.appiconbig { + vertical-align : middle; + text-align : center; +} +.appdetailinner { + width : 100%; +} +.applinkcell { + text-align : center; + float : right; + width : 100%; + margin-bottom : .1em; +} +.paddedlink { + margin : 1em; } -table { border-collapse:collapse; } -h2 { text-align:center; } -.perms { font-family: monospace; font-size:.8em; } - -.repoapplist { display:table; border-collapse:collapse; margin-left:auto; margin-right:auto; width:600px; max-width:90%; } -.approw, appdetailrow { display:table-row; } -.appdetailrow { display:flex; padding:.5em; } -.appiconbig, .appdetailblock, .appdetailcell { display:table-cell } -.appiconbig { vertical-align:middle; text-align:center; } -.appdetailinner { width:100%; } -.applinkcell { text-align:center; float:right; width:100%; margin-bottom:.1em; } -.paddedlink { margin:1em; } - .approw { - border-spacing:1em; - border:1px solid gray; - border-radius:0.5em; - padding:0.5em; - margin:1.5em; + border-spacing : 1em; + border : 1px solid gray; + border-radius : 0.5em; + padding : 0.5em; + margin : 1.5em; +} +.appdetailinner .appdetailrow:first-child { + background-color : #d5d5d5; +} +.appdetailinner .appdetailrow:first-child .appdetailcell { + min-width : 33%; + flex : 1 33%; + text-align : center; +} +.appdetailinner .appdetailrow:first-child .appdetailcell:first-child { + text-align : left; +} +.appdetailinner .appdetailrow:first-child .appdetailcell:last-child { + float : none; + text-align : right; +} +.minor-details { + font-size : .8em; + color : #555555; +} +.boldname { + font-weight : bold; +} +#appcount { + text-align : center; + margin-bottom : .5em; } -.appdetailinner .appdetailrow:first-child { background-color:#d5d5d5; } -.appdetailinner .appdetailrow:first-child .appdetailcell { min-width:33%; flex:1 33%; text-align:center; } -.appdetailinner .appdetailrow:first-child .appdetailcell:first-child { text-align:left; } -.appdetailinner .appdetailrow:first-child .appdetailcell:last-child { float:none; text-align:right; } - -.minor-details { font-size:.8em; color: #555555; } -.boldname { font-weight:bold; } -#appcount { text-align:center; margin-bottom:.5em; } - kbd { - padding: 0.1em 0.6em; - border: 1px solid #CCC; - background-color: #F7F7F7; - color: #333; - box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 2px #FFF inset; - border-radius: 3px; - display: inline-block; - margin: 0px 0.1em; - text-shadow: 0px 1px 0px #FFF; - white-space: nowrap; + padding : 0.1em 0.6em; + border : 1px solid #CCC; + background-color : #F7F7F7; + color : #333; + box-shadow : 0px 1px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 2px #FFF inset; + border-radius : 3px; + display : inline-block; + margin : 0px 0.1em; + text-shadow : 0px 1px 0px #FFF; + white-space : nowrap; +} +div.filterline, div.repoline { + display : table; + margin-left : auto; + margin-right : auto; + margin-bottom : 1em; + vertical-align : middle; + display : table; + font-size : .8em; +} +.filterline form { + display : table-row; +} +.filterline .filtercell { + display : table-cell; + vertical-align : middle; +} +fieldset { + float : left; +} +fieldset select, fieldset input, #reposelect select, #reposelect input { + font-size : .9em; +} +.pager { + display : table; + margin-left : auto; + margin-right : auto; + width : 600px; + max-width : 90%; + padding-top : .6em; +} +/* should correspond to .repoapplist */ +.pagerrow { + display : table-row; +} +.pagercell { + display : table-cell; +} +.pagercell.left { + text-align : left; + padding-right : 1em; +} +.pagercell.middle { + text-align : center; + font-size : .9em; + color : #555; +} +.pagercell.right { + text-align : right; + padding-left : 1em; +} +.anti { + color : peru; +} +.antibold { + color : crimson; } - -div.filterline, div.repoline { display:table;margin-left:auto;margin-right:auto;margin-bottom:1em;vertical-align:middle;display:table;font-size:.8em; } -.filterline form { display:table-row; } -.filterline .filtercell { display:table-cell;vertical-align:middle; } -fieldset { float:left; } -fieldset select, fieldset input, #reposelect select, #reposelect input { font-size:.9em; } - -.pager { display:table; margin-left:auto; margin-right:auto; width:600px; max-width:90%; padding-top:.6em; } /* should correspond to .repoapplist */ -.pagerrow { display:table-row; } -.pagercell { display:table-cell; } -.pagercell.left { text-align:left; padding-right:1em; } -.pagercell.middle { text-align:center; font-size:.9em; color:#555; } -.pagercell.right { text-align:right; padding-left:1em; } - -.anti { color: peru; } -.antibold { color: crimson; } - #footer { - text-align:center; - margin-top:1em; - font-size:11px; - color:#555; + text-align : center; + margin-top : 1em; + font-size : 11px; + color : #555; +} +#footer img { + vertical-align : middle; } -#footer img { vertical-align:middle; } - @media (max-width: 600px) { - .repoapplist { display:block; } - .appdetailinner, .appdetailrow { display:block; } - .appdetailcell { display:block; float:left; line-height:1.5em; } + .repoapplist { + display : block; + } + .appdetailinner, .appdetailrow { + display : block; + } + .appdetailcell { + display : block; + float : left; + line-height : 1.5em; + } }""") diff --git a/tests/index.TestCase b/tests/index.TestCase index 16885dbf..abd1cc24 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -13,6 +13,7 @@ import requests import tempfile import json import shutil +from html5print import CSSBeautifier, HTMLBeautifier localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) @@ -354,6 +355,41 @@ class IndexTest(unittest.TestCase): 'https://gitlab.com/group/project/-/raw/master/fdroid'], fdroidserver.index.get_mirror_service_urls(url)) + def test_make_website(self): + tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, + dir=self.tmpdir) + os.chdir(tmptestsdir) + os.mkdir('metadata') + os.mkdir('repo') + + repodict = { + 'address': 'https://example.com/fdroid/repo', + 'description': 'This is just a test', + 'icon': 'blahblah', + 'name': 'test', + 'timestamp': datetime.datetime.now(), + 'version': 12, + } + + fdroidserver.common.config['repo_pubkey'] = 'ffffffffffffffffffffffffffffffffff' + + fdroidserver.index.make_website([], "repo", repodict) + self.assertTrue(os.path.exists(os.path.join('repo', 'index.html'))) + self.assertTrue(os.path.exists(os.path.join('repo', 'index.css'))) + self.assertTrue(os.path.exists(os.path.join('repo', 'index.png'))) + + with open(os.path.join("repo", "index.html")) as f: + html = f.read() + pretty_html = HTMLBeautifier.beautify(html) + self.maxDiff = None + self.assertEquals(html, pretty_html) + + with open(os.path.join("repo", "index.css")) as f: + css = f.read() + pretty_css = CSSBeautifier.beautify(css) + self.maxDiff = None + self.assertEquals(css, pretty_css) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From d5a90ed60e02cfa8994e827b9fea5e661a2012d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit@posteo.de> Date: Mon, 1 Feb 2021 08:09:25 +0100 Subject: [PATCH 0154/2116] add html5print as test dependency --- setup.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 669ec33a..3d751489 100755 --- a/setup.py +++ b/setup.py @@ -88,7 +88,10 @@ setup(name='fdroidserver', 'yamllint', ], extras_require={ - 'test': ['pyjks'], + 'test': [ + 'pyjks', + 'html5print' + ], }, classifiers=[ 'Development Status :: 4 - Beta', From b1bde9e407e9f055e5a84b61f4e3b27c22d3f07c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit@posteo.de> Date: Mon, 8 Feb 2021 06:37:44 +0100 Subject: [PATCH 0155/2116] * Skip tidy check if html5print is not available * install test dependencies on arch --- .gitlab-ci.yml | 2 +- tests/index.TestCase | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 800c2057..0f3ffc83 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -138,7 +138,7 @@ arch_pip_install: - master@fdroid/fdroidserver script: - pacman --sync --sysupgrade --refresh --noconfirm git grep python-pip python-virtualenv tar - - pip install -e . + - pip install -e .[test] - fdroid - fdroid readmeta - fdroid update --help diff --git a/tests/index.TestCase b/tests/index.TestCase index abd1cc24..14383959 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -13,7 +13,6 @@ import requests import tempfile import json import shutil -from html5print import CSSBeautifier, HTMLBeautifier localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) @@ -378,6 +377,12 @@ class IndexTest(unittest.TestCase): self.assertTrue(os.path.exists(os.path.join('repo', 'index.css'))) self.assertTrue(os.path.exists(os.path.join('repo', 'index.png'))) + try: + from html5print import CSSBeautifier, HTMLBeautifier + except ImportError: + print('WARNING: skipping rest of test since androguard is missing!') + return + with open(os.path.join("repo", "index.html")) as f: html = f.read() pretty_html = HTMLBeautifier.beautify(html) From 23931e6818303ff259ec237b36f52d39441667cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit@posteo.de> Date: Mon, 8 Feb 2021 11:54:12 +0100 Subject: [PATCH 0156/2116] Install [test] dependencies when running complete-ci-tests --- tests/complete-ci-tests | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/complete-ci-tests b/tests/complete-ci-tests index 75fe515e..07e0b2a0 100755 --- a/tests/complete-ci-tests +++ b/tests/complete-ci-tests @@ -66,7 +66,7 @@ cd $WORKSPACE rm -rf $WORKSPACE/env pyvenv $WORKSPACE/env . $WORKSPACE/env/bin/activate -pip3 install --quiet -e $WORKSPACE +pip3 install --quiet -e $WORKSPACE[test] python3 setup.py compile_catalog install # make sure translation files were installed From 9c609aa36113233e17bd9f0cef767eebab6c8ab7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit@posteo.de> Date: Mon, 8 Feb 2021 11:56:41 +0100 Subject: [PATCH 0157/2116] Fix copy-paste error --- tests/index.TestCase | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/index.TestCase b/tests/index.TestCase index 14383959..e8f22036 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -380,7 +380,7 @@ class IndexTest(unittest.TestCase): try: from html5print import CSSBeautifier, HTMLBeautifier except ImportError: - print('WARNING: skipping rest of test since androguard is missing!') + print('WARNING: skipping rest of test since html5print is missing!') return with open(os.path.join("repo", "index.html")) as f: From 8371a2e07a63c87e0f0324ce761c0be96d194d3a Mon Sep 17 00:00:00 2001 From: fossdd Date: Mon, 8 Feb 2021 15:14:28 +0000 Subject: [PATCH 0158/2116] Update SPDX License List --- fdroidserver/lint.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 99a62f31..a370f3ea 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -682,9 +682,8 @@ APPROVED_LICENSES = [ 'Artistic-1.0-Perl', 'Artistic-1.0-cl8', 'Artistic-2.0', - 'Beerware', + 'BSD-1-Clause', 'BSD-2-Clause', - 'BSD-2-Clause-FreeBSD', 'BSD-2-Clause-Patent', 'BSD-3-Clause', 'BSD-3-Clause-Clear', @@ -692,6 +691,8 @@ APPROVED_LICENSES = [ 'BSD-4-Clause', 'BSL-1.0', 'BitTorrent-1.1', + 'CAL-1.0', + 'CAL-1.0-Combined-Work-Exception', 'CATOSL-1.1', 'CC-BY-4.0', 'CC-BY-SA-4.0', @@ -754,7 +755,6 @@ APPROVED_LICENSES = [ 'LiLiQ-Rplus-1.1', 'MIT', 'MIT-0', - 'MIT-CMU', 'MPL-1.0', 'MPL-1.1', 'MPL-2.0', @@ -763,6 +763,7 @@ APPROVED_LICENSES = [ 'MS-RL', 'MirOS', 'Motosoto', + 'MulanPSL-2.0', 'Multics', 'NASA-1.3', 'NCSA', @@ -778,9 +779,12 @@ APPROVED_LICENSES = [ 'ODbL-1.0', 'OFL-1.0', 'OFL-1.1', + 'OFL-1.1-RFN', + 'OFL-1.1-no-RFN', 'OGTSL', 'OLDAP-2.3', 'OLDAP-2.7', + 'OLDAP-2.8', 'OSET-PL-2.1', 'OSL-1.0', 'OSL-1.1', @@ -804,7 +808,9 @@ APPROVED_LICENSES = [ 'SPL-1.0', 'SimPL-2.0', 'Sleepycat', + 'UCL-1.0', 'UPL-1.0', + 'Unicode-DFS-2016', 'Unlicense', 'VSL-1.0', 'Vim', @@ -814,7 +820,6 @@ APPROVED_LICENSES = [ 'X11', 'XFree86-1.1', 'Xnet', - 'XSkat', 'YPL-1.1', 'ZPL-2.0', 'ZPL-2.1', From d75ba81be05f9882445cf420685a315e21f092f6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 9 Feb 2021 09:14:08 +0100 Subject: [PATCH 0159/2116] gitlab-ci: arch job needs to build python-cryptography --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0f3ffc83..1396220c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -137,7 +137,7 @@ arch_pip_install: only: - master@fdroid/fdroidserver script: - - pacman --sync --sysupgrade --refresh --noconfirm git grep python-pip python-virtualenv tar + - pacman --sync --sysupgrade --refresh --noconfirm gcc git grep python-pip python-virtualenv python-wheel tar - pip install -e .[test] - fdroid - fdroid readmeta From bcdefccb31c83cf13ab087775fc5205b79a90c2e Mon Sep 17 00:00:00 2001 From: fossdd Date: Wed, 10 Feb 2021 19:10:14 +0000 Subject: [PATCH 0160/2116] Revert removing Licenses --- fdroidserver/lint.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index a370f3ea..bf558ba0 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -682,8 +682,10 @@ APPROVED_LICENSES = [ 'Artistic-1.0-Perl', 'Artistic-1.0-cl8', 'Artistic-2.0', + 'Beerware', 'BSD-1-Clause', 'BSD-2-Clause', + 'BSD-2-Clause-FreeBSD', 'BSD-2-Clause-Patent', 'BSD-3-Clause', 'BSD-3-Clause-Clear', @@ -755,6 +757,7 @@ APPROVED_LICENSES = [ 'LiLiQ-Rplus-1.1', 'MIT', 'MIT-0', + 'MIT-CMU', 'MPL-1.0', 'MPL-1.1', 'MPL-2.0', @@ -820,6 +823,7 @@ APPROVED_LICENSES = [ 'X11', 'XFree86-1.1', 'Xnet', + 'XSkat', 'YPL-1.1', 'ZPL-2.0', 'ZPL-2.1', From 525dcb8f98affe73d135a75c2cd7437b20e05699 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 11 Feb 2021 17:29:48 +0100 Subject: [PATCH 0161/2116] update: handle large, corrupt, or inaccessible fastlane/triple-t files ``` Traceback (most recent call last): File "../fdroid", line 22, in fdroidserver.__main__.main() File "/var/lib/jenkins/userContent/reproducible/reproducible_fdroid_build_apps/fdroidserver/__main__.py", line 227, in main raise e File "/var/lib/jenkins/userContent/reproducible/reproducible_fdroid_build_apps/fdroidserver/__main__.py", line 208, in main mod.main() File "/var/lib/jenkins/userContent/reproducible/reproducible_fdroid_build_apps/fdroidserver/update.py", line 2340, in main repoapps = prepare_apps(apps, apks, repodirs[0]) File "/var/lib/jenkins/userContent/reproducible/reproducible_fdroid_build_apps/fdroidserver/update.py", line 2176, in prepare_apps copy_triple_t_store_metadata(apps_with_packages) File "/var/lib/jenkins/userContent/reproducible/reproducible_fdroid_build_apps/fdroidserver/update.py", line 1076, in copy_triple_t_store_metadata _set_author_entry(app, 'authorWebSite', os.path.join(root, f)) File "/var/lib/jenkins/userContent/reproducible/reproducible_fdroid_build_apps/fdroidserver/update.py", line 784, in _set_author_entry with open(f, errors='replace') as fp: FileNotFoundError: [Errno 2] No such file or directory: 'build/player.efis.cfd/pfd/src/main/play/contact-website.txt' ``` --- fdroidserver/update.py | 46 +++++++++++++++++++--------- tests/update.TestCase | 68 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 14 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index afde773e..57e7e4b7 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -768,23 +768,41 @@ def _get_localized_dict(app, locale): def _set_localized_text_entry(app, locale, key, f): - limit = config['char_limits'][key] - localized = _get_localized_dict(app, locale) - with open(f, errors='replace') as fp: - text = fp.read()[:limit] - if len(text) > 0: - if key in ('name', 'summary', 'video'): # hardcoded as a single line - localized[key] = text.strip('\n') - else: - localized[key] = text + """Read a fastlane/triple-t metadata file and add an entry to the app + + This reads more than the limit, in case there is leading or + trailing whitespace to be stripped + + """ + try: + limit = config['char_limits'][key] + localized = _get_localized_dict(app, locale) + with open(f, errors='replace') as fp: + text = fp.read(limit * 2) + if len(text) > 0: + if key in ('name', 'summary', 'video'): # hardcoded as a single line + localized[key] = text.strip('\n')[:limit] + else: + localized[key] = text[:limit] + except Exception as e: + logging.error(_('{path}: {error}').format(path=f, error=str(e))) def _set_author_entry(app, key, f): - limit = config['char_limits']['author'] - with open(f, errors='replace') as fp: - text = fp.read()[:limit] - if len(text) > 0: - app[key] = text.strip() + """read a fastlane/triple-t author file and add the entry to the app + + This reads more than the limit, in case there is leading or + trailing whitespace to be stripped + + """ + try: + limit = config['char_limits']['author'] + with open(f, errors='replace') as fp: + text = fp.read(limit * 2) + if len(text) > 0: + app[key] = text.strip()[:limit] + except Exception as e: + logging.error(_('{path}: {error}').format(path=f, error=str(e))) def _strip_and_copy_image(in_file, outpath): diff --git a/tests/update.TestCase b/tests/update.TestCase index 19b7436e..1c299d74 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -11,6 +11,7 @@ import optparse import os import random import shutil +import string import subprocess import sys import tempfile @@ -1309,6 +1310,73 @@ class UpdateTest(unittest.TestCase): self.assertIsNotNone(fdroidserver.update.sanitize_funding_yml_entry(' WhyIncludeWhitespace ')) self.assertIsNotNone(fdroidserver.update.sanitize_funding_yml_entry(['first', 'second'])) + def test_set_localized_text_entry(self): + tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, + dir=self.tmpdir) + os.chdir(tmptestsdir) + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.update.config = config + fdroidserver.update.options = fdroidserver.common.options + + files = { + 'full-description.txt': 'description', + 'short-description.txt': 'summary', + 'title.txt': 'name', + 'video-url.txt': 'video', + } + + for f, key in files.items(): + limit = config['char_limits'][key] + with open(f, 'w') as fp: + fp.write(''.join(random.choice(string.ascii_letters) for i in range(limit + 100))) + locale = 'ru_US' + app = dict() + fdroidserver.update._set_localized_text_entry(app, locale, key, f) + self.assertEqual(limit, len(app['localized'][locale][key])) + + f = 'badlink-' + f + os.symlink('/path/to/nowhere', f) + app = dict() + fdroidserver.update._set_localized_text_entry(app, locale, key, f) + self.assertIsNone(app['localized'].get(locale, {}).get(key)) + + def test_set_author_entry(self): + tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, + dir=self.tmpdir) + os.chdir(tmptestsdir) + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.update.config = config + fdroidserver.update.options = fdroidserver.common.options + + f = 'contact-website.txt' + key = 'author' + url = 'https://f-droid.org/' + limit = config['char_limits']['author'] + with open(f, 'w') as fp: + fp.write(url) + fp.write('\n') + app = dict() + fdroidserver.update._set_author_entry(app, key, f) + self.assertEqual(url, app[key]) + + f = 'limits.txt' + key = 'author' + limit = config['char_limits']['author'] + for key in ('authorEmail', 'authorPhone', 'authorWebSite'): + with open(f, 'w') as fp: + fp.write(''.join(random.choice(string.ascii_letters) for i in range(limit + 100))) + app = dict() + fdroidserver.update._set_author_entry(app, key, f) + self.assertEqual(limit, len(app[key])) + + f = 'badlink.txt' + os.symlink('/path/to/nowhere', f) + app = dict() + fdroidserver.update._set_author_entry(app, key, f) + self.assertIsNone(app.get(key)) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 5396b79da7ac68d2b0891a5c379921d4c426ea2f Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Fri, 12 Feb 2021 09:14:27 +0000 Subject: [PATCH 0162/2116] Fix after https://gitlab.com/fdroid/fdroidserver/-/merge_requests/853 --- buildserver/provision-apt-get-install | 1 + 1 file changed, 1 insertion(+) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index 7619a314..1767bb13 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -111,6 +111,7 @@ packages=" python3-pip python3-pyasn1 python3-pyasn1-modules + python3-qrcode python3-requests python3-setuptools python3-smmap From 007c62065d25dcd94e1ef74a11b888223c706dc8 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 12 Feb 2021 10:51:26 +0100 Subject: [PATCH 0163/2116] pylint flags "_" as bad variable name, its the gettext function Throughout the fdroidserver code base, "_()" is used for localizing strings. So it should not be used as an ignored variable name. Those should be called "_ignored". --- .pylint-rcfile | 2 +- fdroidserver/index.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.pylint-rcfile b/.pylint-rcfile index 4685d7f4..8cc4c8d8 100644 --- a/.pylint-rcfile +++ b/.pylint-rcfile @@ -35,7 +35,7 @@ notes=FIXME,XXX,TODO [BASIC] # Good variable names which should always be accepted, separated by a comma -good-names=i,j,k,ex,Run,_,e,f,fp +good-names=i,j,k,ex,Run,f,fp [ELIF] diff --git a/fdroidserver/index.py b/fdroidserver/index.py index f9120bd8..78dd9ef1 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -142,7 +142,7 @@ def _should_file_be_generated(path, magic_string): def make_website(apps, repodir, repodict): - _, repo_pubkey_fingerprint = extract_pubkey() + _ignored, repo_pubkey_fingerprint = extract_pubkey() repo_pubkey_fingerprint_stripped = repo_pubkey_fingerprint.replace(" ", "") link = repodict["address"] link_fingerprinted = "{link}?fingerprint={fingerprint}".format(link=link, fingerprint=repo_pubkey_fingerprint_stripped) From 0d836751e5d71e136be570abe6bb3fe557a907cc Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 12 Feb 2021 10:52:14 +0100 Subject: [PATCH 0164/2116] code format cleanup --- fdroidserver/index.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 78dd9ef1..a4df9962 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -136,7 +136,8 @@ def make(apps, apks, repodir, archive): def _should_file_be_generated(path, magic_string): if os.path.exists(path): with open(path) as f: - if magic_string not in f.readline(): # if the magic_string is not in the first line the file should be overwritten + # if the magic_string is not in the first line the file should be overwritten + if magic_string not in f.readline(): return False return True @@ -145,8 +146,10 @@ def make_website(apps, repodir, repodict): _ignored, repo_pubkey_fingerprint = extract_pubkey() repo_pubkey_fingerprint_stripped = repo_pubkey_fingerprint.replace(" ", "") link = repodict["address"] - link_fingerprinted = "{link}?fingerprint={fingerprint}".format(link=link, fingerprint=repo_pubkey_fingerprint_stripped) - autogenerate_comment = "auto-generated - fdroid index updates will overwrite this file" # do not change this string, as it will break the updates for existing files with older versions of this string + link_fingerprinted = ('{link}?fingerprint={fingerprint}' + .format(link=link, fingerprint=repo_pubkey_fingerprint_stripped)) + # do not change this string, as it will break updates for files with older versions of this string + autogenerate_comment = "auto-generated - fdroid index updates will overwrite this file" if not os.path.exists(repodir): os.makedirs(repodir) From 33bff6b298ce64b92b9fe76468aafe21d691ef82 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sat, 30 Jan 2021 21:51:57 +0100 Subject: [PATCH 0165/2116] Publish unsigned builds This should make debugging reproducible builds easier. --- fdroidserver/deploy.py | 4 ++++ tests/run-tests | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index ca7bff54..f228edb2 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -783,6 +783,10 @@ def main(): if config['per_app_repos']: repo_sections += common.get_per_app_repos() + if os.path.isdir('unsigned') or (local_copy_dir is not None + and os.path.isdir(os.path.join(local_copy_dir, 'unsigned'))): + repo_sections.append('unsigned') + for repo_section in repo_sections: if local_copy_dir is not None: if config['sync_from_local_copy_dir']: diff --git a/tests/run-tests b/tests/run-tests index af415243..7f30d036 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -1202,6 +1202,8 @@ if have_git_2_3; then fdroid_init_with_prebuilt_keystore printf '\narchive_older: 3\n' >> config.yml cp -a $WORKSPACE/tests/metadata $WORKSPACE/tests/repo $WORKSPACE/tests/stats $OFFLINE_ROOT/ + mkdir $OFFLINE_ROOT/unsigned + cp $WORKSPACE/tests/urzip-release-unsigned.apk $OFFLINE_ROOT/unsigned echo "mirrors: ['http://foo.bar/fdroid', 'http://asdflkdsfjafdsdfhkjh.onion/fdroid']" >> config.yml echo "servergitmirrors: $SERVER_GIT_MIRROR" >> config.yml @@ -1216,6 +1218,7 @@ if have_git_2_3; then [ `git rev-list --count HEAD` == "1" ] cd .. $fdroid deploy --verbose + test -e $LOCAL_COPY_DIR/unsigned/urzip-release-unsigned.apk grep -F ' Date: Mon, 1 Mar 2021 21:34:31 +0000 Subject: [PATCH 0168/2116] gradle v6.8.3 --- gradlew-fdroid | 3 ++- makebuildserver | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 528e41d6..fd73b2a3 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -157,6 +157,7 @@ get_sha() { '6.8') echo 'e2774e6fb77c43657decde25542dea710aafd78c4022d19b196e7e78d79d8c6c' ;; '6.8.1') echo 'fd591a34af7385730970399f473afabdb8b28d57fd97d6625c388d090039d6fd' ;; '6.8.2') echo '8de6efc274ab52332a9c820366dd5cf5fc9d35ec7078fd70c8ec6913431ee610' ;; + '6.8.3') echo '7faa7198769f872826c8ef4f1450f839ec27f0b4d5d1e51bade63667cbccd205' ;; *) exit 1 esac } @@ -177,7 +178,7 @@ d_plugin_k=(4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 d_plugin_v=(6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} diff --git a/makebuildserver b/makebuildserver index a2456382..3ec20d0a 100755 --- a/makebuildserver +++ b/makebuildserver @@ -407,6 +407,8 @@ CACHE_FILES = [ 'fd591a34af7385730970399f473afabdb8b28d57fd97d6625c388d090039d6fd'), ('https://services.gradle.org/distributions/gradle-6.8.2-bin.zip', '8de6efc274ab52332a9c820366dd5cf5fc9d35ec7078fd70c8ec6913431ee610'), + ('https://services.gradle.org/distributions/gradle-6.8.3-bin.zip', + '7faa7198769f872826c8ef4f1450f839ec27f0b4d5d1e51bade63667cbccd205'), ('https://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin', '102d6723f67ff1384330d12c45854315d6452d6510286f4e5891e00a5a8f1d5a'), ('https://dl.google.com/android/repository/android-ndk-r11c-linux-x86_64.zip', From 56b84251f63f39e99ac22a56d89dff3ecaa7eceb Mon Sep 17 00:00:00 2001 From: relan Date: Sun, 7 Mar 2021 08:37:20 +0300 Subject: [PATCH 0169/2116] build: set overall timeout to 72 hours Some builds are pending for weeks now because of the global time limit. Give them a chance to be built. --- fdroidserver/build.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 36411149..d3051887 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -1055,8 +1055,8 @@ def main(): build_succeeded = [] status_output['failedBuilds'] = failed_builds status_output['successfulBuilds'] = build_succeeded - # Only build for 36 hours, then stop gracefully. - endtime = time.time() + 36 * 60 * 60 + # Only build for 72 hours, then stop gracefully. + endtime = time.time() + 72 * 60 * 60 max_build_time_reached = False for appid, app in apps.items(): From 7fa72705897198552a26924eb2e94b39506d4463 Mon Sep 17 00:00:00 2001 From: "Felix C. Stegerman" Date: Tue, 9 Mar 2021 12:42:43 +0000 Subject: [PATCH 0170/2116] fix "vritualbox" typo in BASEBOX_CHECKSUMS --- makebuildserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/makebuildserver b/makebuildserver index 3ec20d0a..e896c1fc 100755 --- a/makebuildserver +++ b/makebuildserver @@ -52,7 +52,7 @@ BASEBOX_CHECKSUMS = { 'metadata.json': '9b5f62362ce3cd25c50881d8ae124879fc21ed4fdb16cc78d57058f116680f25', 'Vagrantfile': '4435901624f21dad201c3bd7f0d8d4ece842bc9fbbb70e312eee54f07173f24e', }, - 'vritualbox': { + 'virtualbox': { 'box-disk1.vmdk': '6b536f26dcee137aca9a3f5f6f20aef795193ef2e8c387a0ffbdb7c5fe2ec0fb', 'box.ovf': 'cbdd6315187d4ce8ff15ed5a00a2c8b0d33abe6b0356439ce4d8d9ac3724f875', 'metadata.json': '098439524f76cafe026140b787ca419297a055a3f6006b9d60e6d5326d18ba99', From a2f0356d840bec4cd09991b5cfb759f4a0d466a5 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 4 Mar 2021 09:50:48 +0100 Subject: [PATCH 0171/2116] build: include all wiki data in the JSON status output --- fdroidserver/build.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index d3051887..dd454d1c 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -83,7 +83,6 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): buildserverid = subprocess.check_output(['vagrant', 'ssh', '-c', 'cat /home/vagrant/buildserverid'], cwd='builder').strip().decode() - status_output['buildserverid'] = buildserverid logging.debug(_('Fetched buildserverid from VM: {buildserverid}') .format(buildserverid=buildserverid)) except Exception as e: @@ -1266,12 +1265,14 @@ def main(): .format(id=fdroidserverid)) if os.cpu_count(): txt += "* host processors: %d\n" % os.cpu_count() + status_output['hostOsCpuCount'] = os.cpu_count() if os.path.isfile('/proc/meminfo') and os.access('/proc/meminfo', os.R_OK): with open('/proc/meminfo') as fp: for line in fp: m = re.search(r'MemTotal:\s*([0-9].*)', line) if m: txt += "* host RAM: %s\n" % m.group(1) + status_output['hostProcMeminfoMemTotal'] = m.group(1) break fdroid_path = os.path.realpath(os.path.join(os.path.dirname(__file__), '..')) buildserver_config = os.path.join(fdroid_path, 'makebuildserver.config.py') @@ -1281,9 +1282,11 @@ def main(): m = re.search(r'cpus\s*=\s*([0-9].*)', line) if m: txt += "* guest processors: %s\n" % m.group(1) + status_output['guestVagrantVmCpus'] = m.group(1) m = re.search(r'memory\s*=\s*([0-9].*)', line) if m: txt += "* guest RAM: %s MB\n" % m.group(1) + status_output['guestVagrantVmMemory'] = m.group(1) txt += "* successful builds: %d\n" % len(build_succeeded) txt += "* failed builds: %d\n" % len(failed_builds) txt += "\n\n" @@ -1291,6 +1294,9 @@ def main(): newpage = site.Pages['build'] newpage.save('#REDIRECT [[' + wiki_page_path + ']]', summary='Update redirect') + if buildserverid: + status_output['buildserver'] = {'commitId': buildserverid} + if not options.onserver: common.write_status_json(status_output) From b5c941938a0f5415b0c18fe743f4516c8492ccb0 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 20 Aug 2020 15:22:02 +0200 Subject: [PATCH 0172/2116] update: reuse local_copy_dir to provide auto-copying with --nosign When using `fdroid update --nosign` in combo with `fdroid signindex`, the unsigned index files have to be copied to a thumb drive or something in order to be brought to the offline signing server. This reuses the config option local_copy_dir as the destination for those unsigned index files. --- fdroidserver/index.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index a4df9962..bd85aad1 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -563,12 +563,25 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ json.dump(output, fp, default=_index_encoder_default) if common.options.nosign: + _copy_to_local_copy_dir(repodir, index_file) logging.debug(_('index-v1 must have a signature, use `fdroid signindex` to create it!')) else: signindex.config = common.config signindex.sign_index_v1(repodir, json_name) +def _copy_to_local_copy_dir(repodir, f): + local_copy_dir = common.config.get('local_copy_dir', '') + if os.path.exists(local_copy_dir): + destdir = os.path.join(local_copy_dir, repodir) + if not os.path.exists(destdir): + os.mkdir(destdir) + shutil.copy2(f, destdir, follow_symlinks=False) + elif local_copy_dir: + raise FDroidException(_('"local_copy_dir" {path} does not exist!') + .format(path=local_copy_dir)) + + def v1_sort_packages(packages, fdroid_signing_key_fingerprints): """Sorts the supplied list to ensure a deterministic sort order for package entries in the index file. This sort-order also expresses @@ -926,6 +939,7 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing # Sign the index... signed = os.path.join(repodir, 'index.jar') if common.options.nosign: + _copy_to_local_copy_dir(repodir, os.path.join(repodir, jar_output)) # Remove old signed index if not signing if os.path.exists(signed): os.remove(signed) From 544a45c16a65c3781fc88477eba6b30b587dc7b3 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 16 Jun 2020 17:28:01 +0200 Subject: [PATCH 0173/2116] index: raise error rather than crash on bad repo file If a non-APK is added with the appid/packageName that matches some APKs, it should through an error. Traceback (most recent call last): File "/home/hans/code/fdroid/server/fdroid", line 22, in fdroidserver.__main__.main() File "/home/hans/code/fdroid/server/fdroidserver/__main__.py", line 211, in main mod.main() File "/home/hans/code/fdroid/server/fdroidserver/update.py", line 2343, in main index.make(apps, sortedids, apks, repodirs[0], False) File "/home/hans/code/fdroid/server/fdroidserver/index.py", line 142, in make fdroid_signing_key_fingerprints) File "/home/hans/code/fdroid/server/fdroidserver/index.py", line 166, in make_v1 v1_sort_packages(packages, fdroid_signing_key_fingerprints) File "/home/hans/code/fdroid/server/fdroidserver/index.py", line 292, in v1_sort_packages packages.sort(key=v1_sort_keys) File "/home/hans/code/fdroid/server/fdroidserver/index.py", line 288, in v1_sort_keys .format(apkfilename=package['apkName'])) fdroidserver.exception.FDroidException: at.roteskreuz.stopcorona_8.jobf does not have a valid signature! --- fdroidserver/update.py | 15 +++++++++++++++ tests/index.TestCase | 9 +++++++++ 2 files changed, 24 insertions(+) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index bc31b512..214d016a 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -2324,7 +2324,13 @@ def main(): options.use_date_from_apk) cachechanged = cachechanged or fcachechanged apks += files + appid_has_apks = set() + appid_has_repo_files = set() for apk in apks: + if apk['apkName'].endswith('.apk'): + appid_has_apks.add(apk['packageName']) + else: + appid_has_repo_files.add(apk['packageName']) if apk['packageName'] not in apps: if options.create_metadata: create_metadata_from_template(apk) @@ -2343,6 +2349,15 @@ def main(): else: logging.warning(msg + '\n\t' + _('Use `fdroid update -c` to create it.')) + mismatch_errors = '' + for appid in appid_has_apks: + if appid in appid_has_repo_files: + appid_files = ', '.join(glob.glob(os.path.join('repo', appid + '_[0-9]*.*'))) + mismatch_errors += (_('{appid} has both APKs and files: {files}') + .format(appid=appid, files=appid_files)) + '\n' + if mismatch_errors: + raise FDroidException(mismatch_errors) + # Scan the archive repo for apks as well if len(repodirs) > 1: archapks, cc = process_apks(apkcache, repodirs[1], knownapks, options.use_date_from_apk) diff --git a/tests/index.TestCase b/tests/index.TestCase index e8f22036..0682e6d9 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -395,6 +395,15 @@ class IndexTest(unittest.TestCase): self.maxDiff = None self.assertEquals(css, pretty_css) + def test_v1_sort_packages_with_invalid(self): + i = [{'packageName': 'org.smssecure.smssecure', + 'apkName': 'smssecure-custom.fake', + 'signer': None, + 'versionCode': 11111}] + + fdroidserver.index.v1_sort_packages( + i, fdroidserver.common.load_stats_fdroid_signing_key_fingerprints()) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 850e2445269cabde97ece5b30286f279c11e5316 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 4 Mar 2021 15:01:42 +0100 Subject: [PATCH 0174/2116] index: rename vars to match the dict key 'signer' 'sig' matches the old deprecated entry for the signer fingerprint that uses the custom fingerprint algorithm. --- fdroidserver/index.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index bd85aad1..10dea357 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -590,7 +590,6 @@ def v1_sort_packages(packages, fdroid_signing_key_fingerprints): :param packages: list of packages which need to be sorted before but into index file. """ - GROUP_DEV_SIGNED = 1 GROUP_FDROID_SIGNED = 2 GROUP_OTHER_SIGNED = 3 @@ -598,22 +597,22 @@ def v1_sort_packages(packages, fdroid_signing_key_fingerprints): def v1_sort_keys(package): packageName = package.get('packageName', None) - sig = package.get('signer', None) + signer = package.get('signer', None) - dev_sig = common.metadata_find_developer_signature(packageName) + dev_signer = common.metadata_find_developer_signature(packageName) group = GROUP_OTHER_SIGNED - if dev_sig and dev_sig == sig: + if dev_signer and dev_signer == signer: group = GROUP_DEV_SIGNED else: - fdroidsig = fdroid_signing_key_fingerprints.get(packageName, {}).get('signer') - if fdroidsig and fdroidsig == sig: + fdroid_signer = fdroid_signing_key_fingerprints.get(packageName, {}).get('signer') + if fdroid_signer and fdroid_signer == signer: group = GROUP_FDROID_SIGNED versionCode = None if package.get('versionCode', None): versionCode = -int(package['versionCode']) - return(packageName, group, sig, versionCode) + return(packageName, group, signer, versionCode) packages.sort(key=v1_sort_keys) @@ -718,11 +717,11 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing if name_from_apk is None: name_from_apk = apk.get('name') for versionCode, apksforver in apksbyversion.items(): - fdroidsig = fdroid_signing_key_fingerprints.get(appid, {}).get('signer') + fdroid_signer = fdroid_signing_key_fingerprints.get(appid, {}).get('signer') fdroid_signed_apk = None name_match_apk = None for x in apksforver: - if fdroidsig and x.get('signer', None) == fdroidsig: + if fdroid_signer and x.get('signer', None) == fdroid_signer: fdroid_signed_apk = x if common.apk_release_filename.match(x.get('apkName', '')): name_match_apk = x From e6b499a56b0ff9a0c1b318d7de6637495f465e14 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 4 Mar 2021 10:59:28 +0100 Subject: [PATCH 0175/2116] ignore repo/archive index HTML and related files in test repo --- .gitignore | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitignore b/.gitignore index 223807b5..48ba212c 100644 --- a/.gitignore +++ b/.gitignore @@ -41,13 +41,19 @@ makebuildserver.config.py /tests/OBBMainTwoVersions.apk /tests/archive/categories.txt /tests/archive/icons* +/tests/archive/index.css +/tests/archive/index.html /tests/archive/index.jar +/tests/archive/index.png /tests/archive/index_unsigned.jar /tests/archive/index.xml /tests/archive/index-v1.jar /tests/archive/index-v1.json /tests/metadata/org.videolan.vlc/en-US/icon*.png +/tests/repo/index.css +/tests/repo/index.html /tests/repo/index.jar +/tests/repo/index.png /tests/repo/index_unsigned.jar /tests/repo/index-v1.jar /tests/repo/info.guardianproject.urzip/ From 6a875a18211eee31c019e6838c74bf89b667c48f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 14 Feb 2018 13:44:58 +0100 Subject: [PATCH 0176/2116] update: stop extracting and storing XML icons, they're useless APKs that only have XML icons in them should include an icon.png in the metadata or fastlane/triple-t closes #344 --- fdroidserver/update.py | 61 ++++++++++++++++++---------------------- tests/repo/index-v1.json | 1 - tests/repo/index.xml | 1 - tests/update.TestCase | 3 +- 4 files changed, 28 insertions(+), 38 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 214d016a..fe119a15 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1423,7 +1423,7 @@ def _get_apk_icons_src(apkfile, icon_name): """ icons_src = dict() - density_re = re.compile(r'^res/(.*)/{}\.(png|xml)$'.format(icon_name)) + density_re = re.compile(r'^res/(.*)/{}\.png$'.format(icon_name)) with zipfile.ZipFile(apkfile) as zf: for filename in zf.namelist(): m = density_re.match(filename) @@ -1686,7 +1686,7 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal .format(apkfilename=apkfile) + str(e)) # extract icons from APK zip file - iconfilename = "%s.%s" % (apk['packageName'], apk['versionCode']) + iconfilename = "%s.%s.png" % (apk['packageName'], apk['versionCode']) try: empty_densities = extract_apk_icons(iconfilename, apk, apkzip, repodir) finally: @@ -1773,8 +1773,6 @@ def extract_apk_icons(icon_filename, apk, apkzip, repo_dir): if m and m.group(4) == 'png': density = screen_resolutions[m.group(2)] pngs[m.group(3) + '/' + density] = m.group(0) - - icon_type = None empty_densities = [] for density in screen_densities: if density not in apk['icons_src']: @@ -1782,7 +1780,7 @@ def extract_apk_icons(icon_filename, apk, apkzip, repo_dir): continue icon_src = apk['icons_src'][density] icon_dir = get_icon_dir(repo_dir, density) - icon_type = '.png' + icon_dest = os.path.join(icon_dir, icon_filename) # Extract the icon files per density if icon_src.endswith('.xml'): @@ -1793,48 +1791,44 @@ def extract_apk_icons(icon_filename, apk, apkzip, repo_dir): icon_src = name if icon_src.endswith('.xml'): empty_densities.append(density) - icon_type = '.xml' - icon_dest = os.path.join(icon_dir, icon_filename + icon_type) - + continue try: with open(icon_dest, 'wb') as f: f.write(get_icon_bytes(apkzip, icon_src)) - apk['icons'][density] = icon_filename + icon_type + apk['icons'][density] = icon_filename except (zipfile.BadZipFile, ValueError, KeyError) as e: logging.warning("Error retrieving icon file: %s %s", icon_dest, e) del apk['icons_src'][density] empty_densities.append(density) # '-1' here is a remnant of the parsing of aapt output, meaning "no DPI specified" - if '-1' in apk['icons_src']: + if '-1' in apk['icons_src'] and not apk['icons_src']['-1'].endswith('.xml'): icon_src = apk['icons_src']['-1'] - icon_type = icon_src[-4:] - icon_path = os.path.join(get_icon_dir(repo_dir, '0'), icon_filename + icon_type) + icon_path = os.path.join(get_icon_dir(repo_dir, '0'), icon_filename) with open(icon_path, 'wb') as f: f.write(get_icon_bytes(apkzip, icon_src)) - if icon_type == '.png': - im = None - try: - im = Image.open(icon_path) - dpi = px_to_dpi(im.size[0]) - for density in screen_densities: - if density in apk['icons']: - break - if density == screen_densities[-1] or dpi >= int(density): - apk['icons'][density] = icon_filename + icon_type - shutil.move(icon_path, - os.path.join(get_icon_dir(repo_dir, density), icon_filename + icon_type)) - empty_densities.remove(density) - break - except Exception as e: - logging.warning(_("Failed reading {path}: {error}") - .format(path=icon_path, error=e)) - finally: - if im and hasattr(im, 'close'): - im.close() + im = None + try: + im = Image.open(icon_path) + dpi = px_to_dpi(im.size[0]) + for density in screen_densities: + if density in apk['icons']: + break + if density == screen_densities[-1] or dpi >= int(density): + apk['icons'][density] = icon_filename + shutil.move(icon_path, + os.path.join(get_icon_dir(repo_dir, density), icon_filename)) + empty_densities.remove(density) + break + except Exception as e: + logging.warning(_("Failed reading {path}: {error}") + .format(path=icon_path, error=e)) + finally: + if im and hasattr(im, 'close'): + im.close() if apk['icons']: - apk['icon'] = icon_filename + icon_type + apk['icon'] = icon_filename return empty_densities @@ -1849,7 +1843,6 @@ def fill_missing_icon_densities(empty_densities, icon_filename, apk, repo_dir): :param repo_dir: The directory of the APK's repository """ - icon_filename += '.png' # First try resizing down to not lose quality last_density = None for density in screen_densities: diff --git a/tests/repo/index-v1.json b/tests/repo/index-v1.json index 6ca6d559..068bd480 100644 --- a/tests/repo/index-v1.json +++ b/tests/repo/index-v1.json @@ -54,7 +54,6 @@ "name": "Caffeine Tile", "summary": "Test app for extracting icons when an XML one is default", "added": 1539129600000, - "icon": "info.zwanenburg.caffeinetile.4.xml", "packageName": "info.zwanenburg.caffeinetile", "lastUpdated": 1539129600000 }, diff --git a/tests/repo/index.xml b/tests/repo/index.xml index 69b09bcf..110ff540 100644 --- a/tests/repo/index.xml +++ b/tests/repo/index.xml @@ -53,7 +53,6 @@ Features: 2018-10-10 Caffeine Tile Test app for extracting icons when an XML one is default - info.zwanenburg.caffeinetile.4.xml No description available Unknown Development diff --git a/tests/update.TestCase b/tests/update.TestCase index 1c299d74..06d5892d 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -707,8 +707,7 @@ class UpdateTest(unittest.TestCase): apk_info = fdroidserver.update.scan_apk('repo/info.zwanenburg.caffeinetile_4.apk') self.assertEqual(apk_info.get('versionName'), '1.3') - self.assertEqual(apk_info['icons_src'], {'160': 'res/drawable/ic_coffee_on.xml', - '-1': 'res/drawable/ic_coffee_on.xml'}) + self.assertEqual(apk_info['icons_src'], {}) apk_info = fdroidserver.update.scan_apk('repo/com.politedroid_6.apk') self.assertEqual(apk_info.get('versionName'), '1.5') From 649347dcd47a02f2d2579aa346b52e377574c960 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 9 Mar 2021 12:01:57 +0100 Subject: [PATCH 0177/2116] common: properly parse version from NDK's source.properties --- MANIFEST.in | 7 +++++++ fdroidserver/common.py | 2 +- tests/common.TestCase | 15 +++++++++++++++ .../android-ndk-r21d/source.properties | 2 ++ .../android-ndk/r11c/source.properties | 2 ++ .../android-ndk/r17c/source.properties | 2 ++ .../android-sdk/patcher/v4/source.properties | 18 ++++++++++++++++++ .../platforms/android-30/source.properties | 9 +++++++++ .../android-sdk/skiaparser/1/source.properties | 3 +++ .../android-sdk/tools/source.properties | 6 ++++++ 10 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 tests/get_android_tools_versions/android-ndk/android-ndk-r21d/source.properties create mode 100644 tests/get_android_tools_versions/android-ndk/r11c/source.properties create mode 100644 tests/get_android_tools_versions/android-ndk/r17c/source.properties create mode 100644 tests/get_android_tools_versions/android-sdk/patcher/v4/source.properties create mode 100644 tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties create mode 100755 tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties create mode 100644 tests/get_android_tools_versions/android-sdk/tools/source.properties diff --git a/MANIFEST.in b/MANIFEST.in index 0d72d061..40e28d21 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -551,6 +551,13 @@ include tests/dump_internal_metadata_format.py include tests/exception.TestCase include tests/extra/manual-vmtools-test.py include tests/funding-usernames.yaml +include tests/get_android_tools_versions/android-ndk/android-ndk-r21d/source.properties +include tests/get_android_tools_versions/android-ndk/r11c/source.properties +include tests/get_android_tools_versions/android-ndk/r17c/source.properties +include tests/get_android_tools_versions/android-sdk/patcher/v4/source.properties +include tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties +include tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties +include tests/get_android_tools_versions/android-sdk/tools/source.properties include tests/getsig/getsig.java include tests/getsig/make.sh include tests/getsig/run.sh diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 84451d70..7917a05d 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3821,7 +3821,7 @@ def get_android_tools_versions(ndk_path=None): with open(ndk_release_txt, 'r') as fp: components.append((os.path.basename(ndk_path), fp.read()[:-1])) - pattern = re.compile('^Pkg.Revision=(.+)', re.MULTILINE) + pattern = re.compile(r'^Pkg.Revision *= *(.+)', re.MULTILINE) for root, dirs, files in os.walk(sdk_path): if 'source.properties' in files: source_properties = os.path.join(root, 'source.properties') diff --git a/tests/common.TestCase b/tests/common.TestCase index 2f226dee..b4ac2541 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1627,6 +1627,21 @@ class CommonTest(unittest.TestCase): {'AutoName': testvalue, 'id': 'nope'}]: self.assertEqual(testvalue, fdroidserver.common.get_app_display_name(app)) + def test_get_android_tools_versions(self): + sdk_path = os.path.join(self.basedir, 'get_android_tools_versions') + fdroidserver.common.config = {'sdk_path': sdk_path} + components = fdroidserver.common.get_android_tools_versions() + expected = ( + ('android-ndk/android-ndk-r21d', '21.3.6528147'), + ('android-ndk/r11c', '11.2.2725575'), + ('android-ndk/r17c', '17.2.4988734'), + ('android-sdk/patcher/v4', '1'), + ('android-sdk/platforms/android-30', '3'), + ('android-sdk/skiaparser/1', '6'), + ('android-sdk/tools', '26.1.1'), + ) + self.assertSequenceEqual(expected, sorted(components)) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) diff --git a/tests/get_android_tools_versions/android-ndk/android-ndk-r21d/source.properties b/tests/get_android_tools_versions/android-ndk/android-ndk-r21d/source.properties new file mode 100644 index 00000000..4f32bc9b --- /dev/null +++ b/tests/get_android_tools_versions/android-ndk/android-ndk-r21d/source.properties @@ -0,0 +1,2 @@ +Pkg.Desc = Android NDK +Pkg.Revision = 21.3.6528147 diff --git a/tests/get_android_tools_versions/android-ndk/r11c/source.properties b/tests/get_android_tools_versions/android-ndk/r11c/source.properties new file mode 100644 index 00000000..f3b7ffa1 --- /dev/null +++ b/tests/get_android_tools_versions/android-ndk/r11c/source.properties @@ -0,0 +1,2 @@ +Pkg.Desc = Android NDK +Pkg.Revision = 11.2.2725575 diff --git a/tests/get_android_tools_versions/android-ndk/r17c/source.properties b/tests/get_android_tools_versions/android-ndk/r17c/source.properties new file mode 100644 index 00000000..8e1573f9 --- /dev/null +++ b/tests/get_android_tools_versions/android-ndk/r17c/source.properties @@ -0,0 +1,2 @@ +Pkg.Desc = Android NDK +Pkg.Revision = 17.2.4988734 diff --git a/tests/get_android_tools_versions/android-sdk/patcher/v4/source.properties b/tests/get_android_tools_versions/android-sdk/patcher/v4/source.properties new file mode 100644 index 00000000..66cd669b --- /dev/null +++ b/tests/get_android_tools_versions/android-sdk/patcher/v4/source.properties @@ -0,0 +1,18 @@ +# +# Copyright (C) 2016 The Android Open Source Project +# +# 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. +# +Pkg.Revision=1 +Pkg.Path=patcher;v4 +Pkg.Desc=SDK Patch Applier v4 \ No newline at end of file diff --git a/tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties b/tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties new file mode 100644 index 00000000..239cbb3d --- /dev/null +++ b/tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties @@ -0,0 +1,9 @@ +Pkg.Desc=Android SDK Platform 11 +Pkg.UserSrc=false +Platform.Version=11 +Platform.CodeName= +Pkg.Revision=3 +AndroidVersion.ApiLevel=30 +Layoutlib.Api=15 +Layoutlib.Revision=1 +Platform.MinToolsRev=22 diff --git a/tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties b/tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties new file mode 100755 index 00000000..a70c3bae --- /dev/null +++ b/tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties @@ -0,0 +1,3 @@ +Pkg.Revision=6 +Pkg.Path=skiaparser;1 +Pkg.Desc=Layout Inspector image server for API 29-30 diff --git a/tests/get_android_tools_versions/android-sdk/tools/source.properties b/tests/get_android_tools_versions/android-sdk/tools/source.properties new file mode 100644 index 00000000..2c1388f1 --- /dev/null +++ b/tests/get_android_tools_versions/android-sdk/tools/source.properties @@ -0,0 +1,6 @@ +Pkg.UserSrc=false +Pkg.Revision=26.1.1 +Platform.MinPlatformToolsRev=20 +Pkg.Dependencies=emulator +Pkg.Path=tools +Pkg.Desc=Android SDK Tools From 211dd65ff0263e3b680dcd21f9e0efa3dd7e50d7 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 9 Mar 2021 12:07:24 +0100 Subject: [PATCH 0178/2116] scanner: show error if scan_binary fails to run apkanalyzer --- fdroidserver/scanner.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 8699b8c0..239e82b4 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -106,6 +106,9 @@ def scan_binary(apkfile): logging.info("Scanning APK for known non-free classes.") result = common.SdkToolsPopen(["apkanalyzer", "dex", "packages", "--defined-only", apkfile], output=False) problems = 0 + if result.returncode != 0: + problems += 1 + logging.error(result.output) for suspect, regexp in CODE_SIGNATURES.items(): matches = regexp.findall(result.output) if matches: From 8bb2c7d4b19a7ec15777d748bb30639982a01e45 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 9 Mar 2021 12:30:53 +0100 Subject: [PATCH 0179/2116] metadata: stop setting up source repo when running lint/rewritemeta broken in 54e8867a7ed2918709290be8f8fc1e8b681767e4 --- examples/fdroid_fetchsrclibs.py | 2 +- fdroidserver/build.py | 2 +- fdroidserver/metadata.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/fdroid_fetchsrclibs.py b/examples/fdroid_fetchsrclibs.py index 3dc4e423..d88b9fa5 100644 --- a/examples/fdroid_fetchsrclibs.py +++ b/examples/fdroid_fetchsrclibs.py @@ -21,7 +21,7 @@ def main(): options = parser.parse_args() common.options = options pkgs = common.read_pkg_args(options.appid, True) - allapps = metadata.read_metadata(pkgs) + allapps = metadata.read_metadata(pkgs, check_vcs=True) apps = common.read_app_args(options.appid, allapps, True) srclib_dir = os.path.join('build', 'srclib') os.makedirs(srclib_dir, exist_ok=True) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index dd454d1c..79df3013 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -1012,7 +1012,7 @@ def main(): # Read all app and srclib metadata pkgs = common.read_pkg_args(options.appid, True) - allapps = metadata.read_metadata(pkgs, options.refresh, sort_by_time=True) + allapps = metadata.read_metadata(pkgs, options.refresh, sort_by_time=True, check_vcs=True) apps = common.read_app_args(options.appid, allapps, True) for appid, app in list(apps.items()): diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index ff75aa8a..6c3c4815 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -541,7 +541,7 @@ def read_srclibs(): srclibs[srclibname] = parse_yaml_srclib(metadatapath) -def read_metadata(appids={}, refresh=True, sort_by_time=False): +def read_metadata(appids={}, refresh=True, sort_by_time=False, check_vcs=False): """Return a list of App instances sorted newest first This reads all of the metadata files in a 'data' repository, then @@ -597,7 +597,7 @@ def read_metadata(appids={}, refresh=True, sort_by_time=False): if appid in apps: _warn_or_exception(_("Found multiple metadata files for {appid}") .format(appid=appid)) - app = parse_metadata(metadatapath, appid in appids, refresh) + app = parse_metadata(metadatapath, check_vcs, refresh) check_metadata(app) apps[app.id] = app From 65836d9e9b12129e1ed0146b79e502394aa924b1 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 9 Mar 2021 13:05:35 +0100 Subject: [PATCH 0180/2116] run-tests: fix local_copy_dir test, it broke when /tmp/fdroid existed --- tests/run-tests | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/run-tests b/tests/run-tests index 249dbb9e..6058cd85 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -735,8 +735,9 @@ cd $REPOROOT $fdroid init $fdroid update --create-metadata --verbose $fdroid readmeta -$fdroid deploy --local-copy-dir=/tmp/fdroid -$fdroid deploy --local-copy-dir=/tmp/fdroid --verbose +LOCAL_COPY_DIR=`create_test_dir`/fdroid +$fdroid deploy --local-copy-dir=$LOCAL_COPY_DIR +$fdroid deploy --local-copy-dir=$LOCAL_COPY_DIR --verbose # now test the errors work set +e From 259ca510012f22012021045fa3246ee1cc524eb1 Mon Sep 17 00:00:00 2001 From: "Felix C. Stegerman" Date: Wed, 10 Mar 2021 09:12:52 +0000 Subject: [PATCH 0181/2116] use vagrantfile instead of 'builder/Vagrantfile' in get_clean_builder() --- fdroidserver/vmtools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/vmtools.py b/fdroidserver/vmtools.py index c231aacc..fcb4f8dd 100644 --- a/fdroidserver/vmtools.py +++ b/fdroidserver/vmtools.py @@ -41,7 +41,7 @@ def get_clean_builder(serverdir): os.makedirs(serverdir) vagrantfile = os.path.join(serverdir, 'Vagrantfile') if not os.path.isfile(vagrantfile): - with open(os.path.join('builder', 'Vagrantfile'), 'w') as f: + with open(vagrantfile, 'w') as f: f.write(textwrap.dedent("""\ # generated file, do not change. From d683a40f96ac000b13b9690137585a591e5a195c Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Wed, 10 Mar 2021 16:36:14 +0200 Subject: [PATCH 0182/2116] Add NDK 21e --- buildserver/config.buildserver.yml | 2 +- buildserver/provision-android-ndk | 2 +- examples/config.yml | 2 +- makebuildserver | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/buildserver/config.buildserver.yml b/buildserver/config.buildserver.yml index 4d9b76ce..0f05888d 100644 --- a/buildserver/config.buildserver.yml +++ b/buildserver/config.buildserver.yml @@ -11,7 +11,7 @@ ndk_paths: r18b: /home/vagrant/android-ndk/r18b r19c: /home/vagrant/android-ndk/r19c r20b: /home/vagrant/android-ndk/r20b - r21d: /home/vagrant/android-ndk/r21d + r21e: /home/vagrant/android-ndk/r21e r22: /home/vagrant/android-ndk/r22 java_paths: diff --git a/buildserver/provision-android-ndk b/buildserver/provision-android-ndk index e778cedc..d57a8692 100644 --- a/buildserver/provision-android-ndk +++ b/buildserver/provision-android-ndk @@ -15,7 +15,7 @@ if [ ! -e $NDK_BASE/r10e ]; then mv android-ndk-r10e r10e fi -for version in r11c r12b r13b r14b r15c r16b r17c r18b r19c r20b r21d r22; do +for version in r11c r12b r13b r14b r15c r16b r17c r18b r19c r20b r21e r22; do if [ ! -e ${NDK_BASE}/${version} ]; then unzip /vagrant/cache/android-ndk-${version}-linux-x86_64.zip > /dev/null mv android-ndk-${version} ${version} diff --git a/examples/config.yml b/examples/config.yml index eee0bd0f..74447a54 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -21,7 +21,7 @@ # r18b: None # r19c: None # r20b: None -# r21d: None +# r21e: None # r22: None # Directory to store downloaded tools in (i.e. gradle versions) diff --git a/makebuildserver b/makebuildserver index e896c1fc..c0a5bcfb 100755 --- a/makebuildserver +++ b/makebuildserver @@ -431,8 +431,8 @@ CACHE_FILES = [ '4c62514ec9c2309315fd84da6d52465651cdb68605058f231f1e480fcf2692e1'), ('https://dl.google.com/android/repository/android-ndk-r20b-linux-x86_64.zip', '8381c440fe61fcbb01e209211ac01b519cd6adf51ab1c2281d5daad6ca4c8c8c'), - ('https://dl.google.com/android/repository/android-ndk-r21d-linux-x86_64.zip', - 'dd6dc090b6e2580206c64bcee499bc16509a5d017c6952dcd2bed9072af67cbd'), + ('https://dl.google.com/android/repository/android-ndk-r21e-linux-x86_64.zip', + 'ad7ce5467e18d40050dc51b8e7affc3e635c85bd8c59be62de32352328ed467e'), ('https://dl.google.com/android/repository/android-ndk-r22-linux-x86_64.zip', 'd37fc69cd81e5660234a686e20adef39bc0244086e4d66525a40af771c020718'), ] From 4b05854ffceabaa8a65bd8dc5d1f2730b07d771a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 4 Mar 2021 11:33:45 +0100 Subject: [PATCH 0183/2116] buildserver: only install the latest gradle version gradle checksums are now handled by gradlew-fdroid refs #370 #517 #737 --- buildserver/provision-gradle | 7 +- makebuildserver | 124 ----------------------------------- 2 files changed, 5 insertions(+), 126 deletions(-) diff --git a/buildserver/provision-gradle b/buildserver/provision-gradle index ce8aefa1..b724202c 100644 --- a/buildserver/provision-gradle +++ b/buildserver/provision-gradle @@ -10,14 +10,17 @@ vergte() { test -e /opt/gradle/versions || mkdir -p /opt/gradle/versions cd /opt/gradle/versions -for f in /vagrant/cache/gradle-*.zip; do + +glob="/vagrant/cache/gradle-*.zip" +if compgen -G $glob; then # test if glob matches anything + f=$(ls -1 --sort=version --group-directories-first $glob | tail -1) ver=`echo $f | sed 's,.*gradle-\([0-9][0-9.]*\).*\.zip,\1,'` # only use versions greater or equal 2.2.1 if vergte $ver 2.2.1 && [ ! -d /opt/gradle/versions/${ver} ]; then unzip -qq $f mv gradle-${ver} /opt/gradle/versions/${ver} fi -done +fi chmod -R a+rX /opt/gradle diff --git a/makebuildserver b/makebuildserver index c0a5bcfb..3e34494b 100755 --- a/makebuildserver +++ b/makebuildserver @@ -281,130 +281,6 @@ CACHE_FILES = [ '565af786dc0cc1941002174fb945122eabd080b222cd4c7c3d9a2ae0fabf5dc4'), ('https://dl.google.com/android/repository/build-tools_r30.0.3-linux.zip', '24593500aa95d2f99fb4f10658aae7e65cb519be6cd33fa164f15f27f3c4a2d6'), - ('https://services.gradle.org/distributions/gradle-2.2.1-bin.zip', - '420aa50738299327b611c10b8304b749e8d3a579407ee9e755b15921d95ff418'), - ('https://services.gradle.org/distributions/gradle-2.3-bin.zip', - '010dd9f31849abc3d5644e282943b1c1c355f8e2635c5789833979ce590a3774'), - ('https://services.gradle.org/distributions/gradle-2.4-bin.zip', - 'c4eaecc621a81f567ded1aede4a5ddb281cc02a03a6a87c4f5502add8fc2f16f'), - ('https://services.gradle.org/distributions/gradle-2.5-bin.zip', - '3f953e0cb14bb3f9ebbe11946e84071547bf5dfd575d90cfe9cc4e788da38555'), - ('https://services.gradle.org/distributions/gradle-2.6-bin.zip', - '18a98c560af231dfa0d3f8e0802c20103ae986f12428bb0a6f5396e8f14e9c83'), - ('https://services.gradle.org/distributions/gradle-2.7-bin.zip', - 'cde43b90945b5304c43ee36e58aab4cc6fb3a3d5f9bd9449bb1709a68371cb06'), - ('https://services.gradle.org/distributions/gradle-2.8-bin.zip', - 'a88db9c2f104defdaa8011c58cf6cda6c114298ae3695ecfb8beb30da3a903cb'), - ('https://services.gradle.org/distributions/gradle-2.9-bin.zip', - 'c9159ec4362284c0a38d73237e224deae6139cbde0db4f0f44e1c7691dd3de2f'), - ('https://services.gradle.org/distributions/gradle-2.10-bin.zip', - '66406247f745fc6f05ab382d3f8d3e120c339f34ef54b86f6dc5f6efc18fbb13'), - ('https://services.gradle.org/distributions/gradle-2.11-bin.zip', - '8d7437082356c9fd6309a4479c8db307673965546daea445c6c72759cd6b1ed6'), - ('https://services.gradle.org/distributions/gradle-2.12-bin.zip', - 'e77064981906cd0476ff1e0de3e6fef747bd18e140960f1915cca8ff6c33ab5c'), - ('https://services.gradle.org/distributions/gradle-2.13-bin.zip', - '0f665ec6a5a67865faf7ba0d825afb19c26705ea0597cec80dd191b0f2cbb664'), - ('https://services.gradle.org/distributions/gradle-2.14-bin.zip', - '993b4f33b652c689e9721917d8e021cab6bbd3eae81b39ab2fd46fdb19a928d5'), - ('https://services.gradle.org/distributions/gradle-2.14.1-bin.zip', - 'cfc61eda71f2d12a572822644ce13d2919407595c2aec3e3566d2aab6f97ef39'), - ('https://services.gradle.org/distributions/gradle-3.0-bin.zip', - '39c906941a474444afbddc38144ed44166825acb0a57b0551dddb04bbf157f80'), - ('https://services.gradle.org/distributions/gradle-3.1-bin.zip', - 'c7de3442432253525902f7e8d7eac8b5fd6ce1623f96d76916af6d0e383010fc'), - ('https://services.gradle.org/distributions/gradle-3.2-bin.zip', - '5321b36837226dc0377047a328f12010f42c7bf88ee4a3b1cee0c11040082935'), - ('https://services.gradle.org/distributions/gradle-3.2.1-bin.zip', - '9843a3654d3e57dce54db06d05f18b664b95c22bf90c6becccb61fc63ce60689'), - ('https://services.gradle.org/distributions/gradle-3.3-bin.zip', - 'c58650c278d8cf0696cab65108ae3c8d95eea9c1938e0eb8b997095d5ca9a292'), - ('https://services.gradle.org/distributions/gradle-3.4-bin.zip', - '72d0cd4dcdd5e3be165eb7cd7bbd25cf8968baf400323d9ab1bba622c3f72205'), - ('https://services.gradle.org/distributions/gradle-3.4.1-bin.zip', - 'db1db193d479cc1202be843f17e4526660cfb0b21b57d62f3a87f88c878af9b2'), - ('https://services.gradle.org/distributions/gradle-3.5-bin.zip', - '0b7450798c190ff76b9f9a3d02e18b33d94553f708ebc08ebe09bdf99111d110'), - ('https://services.gradle.org/distributions/gradle-3.5.1-bin.zip', - '8dce35f52d4c7b4a4946df73aa2830e76ba7148850753d8b5e94c5dc325ceef8'), - ('https://services.gradle.org/distributions/gradle-4.0-bin.zip', - '56bd2dde29ba2a93903c557da1745cafd72cdd8b6b0b83c05a40ed7896b79dfe'), - ('https://services.gradle.org/distributions/gradle-4.0.1-bin.zip', - 'd717e46200d1359893f891dab047fdab98784143ac76861b53c50dbd03b44fd4'), - ('https://services.gradle.org/distributions/gradle-4.0.2-bin.zip', - '79ac421342bd11f6a4f404e0988baa9c1f5fabf07e3c6fa65b0c15c1c31dda22'), - ('https://services.gradle.org/distributions/gradle-4.1-bin.zip', - 'd55dfa9cfb5a3da86a1c9e75bb0b9507f9a8c8c100793ccec7beb6e259f9ed43'), - ('https://services.gradle.org/distributions/gradle-4.2-bin.zip', - '515dd63d32e55a9c05667809c5e40a947529de3054444ad274b3b75af5582eae'), - ('https://downloads.gradle.org/distributions/gradle-4.2.1-bin.zip', - 'b551cc04f2ca51c78dd14edb060621f0e5439bdfafa6fd167032a09ac708fbc0'), - ('https://downloads.gradle.org/distributions/gradle-4.3-bin.zip', - '8dcbf44eef92575b475dcb1ce12b5f19d38dc79e84c662670248dc8b8247654c'), - ('https://downloads.gradle.org/distributions/gradle-4.3.1-bin.zip', - '15ebe098ce0392a2d06d252bff24143cc88c4e963346582c8d88814758d93ac7'), - ('https://downloads.gradle.org/distributions/gradle-4.4-bin.zip', - 'fa4873ae2c7f5e8c02ec6948ba95848cedced6134772a0169718eadcb39e0a2f'), - ('https://downloads.gradle.org/distributions/gradle-4.4.1-bin.zip', - 'e7cf7d1853dfc30c1c44f571d3919eeeedef002823b66b6a988d27e919686389'), - ('https://downloads.gradle.org/distributions/gradle-4.5-bin.zip', - '03f2a43a314ff0fb843a85ef68078e06d181c4549c1e5fb983f289382b59b5e3'), - ('https://downloads.gradle.org/distributions/gradle-4.5.1-bin.zip', - '3e2ea0d8b96605b7c528768f646e0975bd9822f06df1f04a64fd279b1a17805e'), - ('https://downloads.gradle.org/distributions/gradle-4.6-bin.zip', - '98bd5fd2b30e070517e03c51cbb32beee3e2ee1a84003a5a5d748996d4b1b915'), - ('https://downloads.gradle.org/distributions/gradle-4.7-bin.zip', - 'fca5087dc8b50c64655c000989635664a73b11b9bd3703c7d6cabd31b7dcdb04'), - ('https://downloads.gradle.org/distributions/gradle-4.8-bin.zip', - 'f3e29692a8faa94eb0b02ebf36fa263a642b3ae8694ef806c45c345b8683f1ba'), - ('https://downloads.gradle.org/distributions/gradle-4.8.1-bin.zip', - 'af334d994b5e69e439ab55b5d2b7d086da5ea6763d78054f49f147b06370ed71'), - ('https://downloads.gradle.org/distributions/gradle-4.9-bin.zip', - 'e66e69dce8173dd2004b39ba93586a184628bc6c28461bc771d6835f7f9b0d28'), - ('https://downloads.gradle.org/distributions/gradle-4.10-bin.zip', - '248cfd92104ce12c5431ddb8309cf713fe58de8e330c63176543320022f59f18'), - ('https://downloads.gradle.org/distributions/gradle-4.10.1-bin.zip', - 'e53ce3a01cf016b5d294eef20977ad4e3c13e761ac1e475f1ffad4c6141a92bd'), - ('https://downloads.gradle.org/distributions/gradle-4.10.2-bin.zip', - 'b49c6da1b2cb67a0caf6c7480630b51c70a11ca2016ff2f555eaeda863143a29'), - ('https://downloads.gradle.org/distributions/gradle-4.10.3-bin.zip', - '8626cbf206b4e201ade7b87779090690447054bc93f052954c78480fa6ed186e'), - # Only add the latest point release of gradle to the default install. - # Other versions will be downloaded on demand. - ('https://downloads.gradle.org/distributions/gradle-5.0-bin.zip', - '6157ac9f3410bc63644625b3b3e9e96c963afd7910ae0697792db57813ee79a6'), - ('https://downloads.gradle.org/distributions/gradle-5.1.1-bin.zip', - '4953323605c5d7b89e97d0dc7779e275bccedefcdac090aec123375eae0cc798'), - ('https://downloads.gradle.org/distributions/gradle-5.2.1-bin.zip', - '748c33ff8d216736723be4037085b8dc342c6a0f309081acf682c9803e407357'), - ('https://downloads.gradle.org/distributions/gradle-5.3.1-bin.zip', - '1c59a17a054e9c82f0dd881871c9646e943ec4c71dd52ebc6137d17f82337436'), - ('https://downloads.gradle.org/distributions/gradle-5.4.1-bin.zip', - '7bdbad1e4f54f13c8a78abc00c26d44dd8709d4aedb704d913fb1bb78ac025dc'), - ('https://services.gradle.org/distributions/gradle-5.5.1-bin.zip', - '222a03fcf2fcaf3691767ce9549f78ebd4a77e73f9e23a396899fb70b420cd00'), - ('https://services.gradle.org/distributions/gradle-5.6.4-bin.zip', - '1f3067073041bc44554d0efe5d402a33bc3d3c93cc39ab684f308586d732a80d'), - ('https://services.gradle.org/distributions/gradle-6.0.1-bin.zip', - 'd364b7098b9f2e58579a3603dc0a12a1991353ac58ed339316e6762b21efba44'), - ('https://services.gradle.org/distributions/gradle-6.1.1-bin.zip', - '9d94e6e4a28ad328072ef6e56bce79a810494ae756751fdcedffdeaf27c093b1'), - ('https://services.gradle.org/distributions/gradle-6.2.2-bin.zip', - '0f6ba231b986276d8221d7a870b4d98e0df76e6daf1f42e7c0baec5032fb7d17'), - ('https://services.gradle.org/distributions/gradle-6.3-bin.zip', - '038794feef1f4745c6347107b6726279d1c824f3fc634b60f86ace1e9fbd1768'), - ('https://services.gradle.org/distributions/gradle-6.4.1-bin.zip', - 'e58cdff0cee6d9b422dcd08ebeb3177bc44eaa09bd9a2e838ff74c408fe1cbcd'), - ('https://services.gradle.org/distributions/gradle-6.5.1-bin.zip', - '50a7d30529fa939721fe9268a0205142f3f2302bcac5fb45b27a3902e58db54a'), - ('https://services.gradle.org/distributions/gradle-6.6.1-bin.zip', - '7873ed5287f47ca03549ab8dcb6dc877ac7f0e3d7b1eb12685161d10080910ac'), - ('https://services.gradle.org/distributions/gradle-6.7.1-bin.zip', - '3239b5ed86c3838a37d983ac100573f64c1f3fd8e1eb6c89fa5f9529b5ec091d'), - ('https://services.gradle.org/distributions/gradle-6.8-bin.zip', - 'e2774e6fb77c43657decde25542dea710aafd78c4022d19b196e7e78d79d8c6c'), - ('https://services.gradle.org/distributions/gradle-6.8.1-bin.zip', - 'fd591a34af7385730970399f473afabdb8b28d57fd97d6625c388d090039d6fd'), ('https://services.gradle.org/distributions/gradle-6.8.2-bin.zip', '8de6efc274ab52332a9c820366dd5cf5fc9d35ec7078fd70c8ec6913431ee610'), ('https://services.gradle.org/distributions/gradle-6.8.3-bin.zip', From cc3b88ab30bd6a6ce8b939fce3bbc26fb3067ca6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 5 Mar 2021 00:02:21 +0100 Subject: [PATCH 0184/2116] gradlew-fdroid: use gradle zipballs from local cachedir, if present --- .gitlab-ci.yml | 15 ++++++++++++++- gradlew-fdroid | 12 ++++++++---- tests/test-gradlew-fdroid | 39 ++++++++++++++++++++++++++++++++++++--- 3 files changed, 58 insertions(+), 8 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1396220c..10d08696 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -143,6 +143,20 @@ arch_pip_install: - fdroid readmeta - fdroid update --help + +gradlew-fdroid: + image: debian:bullseye + <<: *apt-template + only: + changes: + - .gitlab-ci.yml + - gradlew-fdroid + - tests/test-gradlew-fdroid + script: + - apt-get install ca-certificates curl default-jdk-headless unzip + - ./tests/test-gradlew-fdroid + + lint_format_safety_bandit_checks: image: alpine:3.10 # cannot upgrade until bandit supports Python 3.8 variables: @@ -154,7 +168,6 @@ lint_format_safety_bandit_checks: - export EXITVALUE=0 - function set_error() { export EXITVALUE=1; printf "\x1b[31mERROR `history|tail -2|head -1|cut -b 6-500`\x1b[0m\n"; } - ./hooks/pre-commit || set_error - - ./tests/test-gradlew-fdroid || set_error - bandit -ii -s B110,B322,B404,B408,B410,B603,B607 diff --git a/gradlew-fdroid b/gradlew-fdroid index fd73b2a3..2ac3b678 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -8,8 +8,11 @@ if [ -z "$GRADLE_VERSION_DIR" ]; then else gradle_version_dir="$GRADLE_VERSION_DIR" fi +BUILDSERVER_CACHEDIR=/vagrant/cache if [ -n "$CACHEDIR" ]; then cachedir="$CACHEDIR" +elif [ -d $BUILDSERVER_CACHEDIR ]; then + cachedir=$BUILDSERVER_CACHEDIR fi args=("$@") @@ -34,11 +37,12 @@ download_gradle() { gradle_zip="${cachedir}/gradle-$1-bin.zip" else echo "Downloading missing gradle version $1" - if [ -n "${cachedir}" ]; then + echo cachedir $cachedir + if [[ -n "${cachedir}" && ! -d "${cachedir}" ]]; then + mkdir -p "${cachedir}" + fi + if [[ -n "${cachedir}" && -d "${cachedir}" && -w "${cachedir}" ]]; then tmpdir="${cachedir}" - if [ ! -d ${tmpdir} ]; then - mkdir -p "${cachedir}" - fi else tmpdir=$(mktemp -d) fi diff --git a/tests/test-gradlew-fdroid b/tests/test-gradlew-fdroid index 63f74e5e..3d6d6016 100755 --- a/tests/test-gradlew-fdroid +++ b/tests/test-gradlew-fdroid @@ -1,9 +1,12 @@ #!/bin/bash +red='\033[0;31m' +green='\033[0;32m' +nocolor='\033[0m' + +TEST_VALUE='HELLO WORLD!' + run_test() { - red='\033[0;31m' - green='\033[0;32m' - nocolor='\033[0m' cd $source_files/$1 printf "\n${1}:\n" if ($basedir/gradlew-fdroid 2>/dev/null || true) | grep -Fo "$2"; then @@ -15,6 +18,17 @@ run_test() { printf $nocolor } +download_cache_test() { + if $basedir/gradlew-fdroid helloWorld 2>/dev/null | grep -F "$TEST_VALUE"; then + printf "${green}passed: $1\n" + else + printf "${red}ERROR: \n" + $basedir/gradlew-fdroid helloWorld + ((exit_value++)) + fi + printf $nocolor +} + exit_value=0 basedir=$(cd $(dirname $0)/..; pwd) source_files=$basedir/tests/source-files @@ -39,4 +53,23 @@ source_files=$tmpdir run_test yuriykulikov/AlarmClock 5.1.1 run_test osmandapp/osmand 2.2.1 +cd $tmpdir +mkdir -p download_cache_test/gradle/wrapper +cd download_cache_test +echo 'distributionUrl=https\://services.gradle.org/distributions/gradle-0.7-bin.zip' \ + > gradle/wrapper/gradle-wrapper.properties +printf "task helloWorld {\n\tdoLast {\n\t\tprintln '$TEST_VALUE'\n\t}\n}" > build.gradle + +export GRADLE_VERSION_DIR=$tmpdir/gradle/versions +mkdir -p $GRADLE_VERSION_DIR + +unset https_proxy +printf "download, unpack, and run: " +download_cache_test 0.7 +printf "unpack and run: " +rm -rf $GRADLE_VERSION_DIR/0.7/ +download_cache_test 0.7 +printf "just run: " +download_cache_test 0.7 + exit $exit_value From a3d828ea48ae1393d426869448814825caab9450 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 9 Mar 2021 15:02:18 +0100 Subject: [PATCH 0185/2116] update CHANGELOG --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e71e2e83..c07b9cb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## [Unreleased] +## [2.0.1] - 2020-03-09 + +### Fixed + +* metadata: stop setting up source repo when running lint/rewritemeta +* scanner: show error if scan_binary fails to run apkanalyzer +* common: properly parse version from NDK's source.properties +* update: stop extracting and storing XML icons, they're useless +* index: raise error rather than crash on bad repo file +* update: handle large, corrupt, or inaccessible fastlane/triple-t files +* Update SPDX License List +* checkupdates: set User-Agent to make gitlab.com happy +* Run push_binary_transparency only once + ## [2.0] - 2020-01-31 For a more complete overview, see the [2.0 From 56959935212520f8b14ec1e218ea71b0c7a3de02 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 11 Mar 2021 18:52:31 +0100 Subject: [PATCH 0186/2116] build: include useful successful build IDs in status JSON, closes #825 --- fdroidserver/build.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 79df3013..b63e0eca 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -1052,8 +1052,10 @@ def main(): # Build applications... failed_builds = [] build_succeeded = [] + build_succeeded_ids = [] status_output['failedBuilds'] = failed_builds status_output['successfulBuilds'] = build_succeeded + status_output['successfulBuildIds'] = build_succeeded_ids # Only build for 72 hours, then stop gracefully. endtime = time.time() + 72 * 60 * 60 max_build_time_reached = False @@ -1167,6 +1169,7 @@ def main(): 'successfully') build_succeeded.append(app) + build_succeeded_ids.append([app['id'], build.versionCode]) wikilog = "Build succeeded" except VCSException as vcse: From fc368dc29140cd47aba5f05e85044bd437c05072 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 12 Mar 2021 13:14:55 +0100 Subject: [PATCH 0187/2116] makebuildserver: print message before rsyncing caches This process can take a very long time if the caches are large, so at least print something about what it is doing. --- makebuildserver | 2 ++ 1 file changed, 2 insertions(+) diff --git a/makebuildserver b/makebuildserver index 3e34494b..7147fb1e 100755 --- a/makebuildserver +++ b/makebuildserver @@ -569,6 +569,8 @@ def main(): for d in ('.m2', '.gradle/caches', '.gradle/wrapper', '.pip_download_cache'): fullpath = os.path.join(os.getenv('HOME'), d) + os.system('date') + print('rsyncing', fullpath, 'into VM') if os.path.isdir(fullpath): ssh_command = ' '.join(('ssh -i {0} -p {1}'.format(key, port), '-o StrictHostKeyChecking=no', From 78842e9cc26d051ba2882055c93f99df5840d7c9 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 15 Mar 2021 10:10:09 +0100 Subject: [PATCH 0188/2116] scanner: should not exit with error when apkanalyzer fails apkanalyzer produces useful output when it can run, but it does not support all recent JDK versions, and also some DEX versions, so this cannot count on it to always produce useful output or even to run without exiting with an error. 211dd65ff0263e3b680dcd21f9e0efa3dd7e50d7 was based on false assumptions that apkanalyzer can always produce output. fdroiddata!8585 fdroiddata!8584 --- fdroidserver/scanner.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 239e82b4..436abf1e 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -103,12 +103,20 @@ def get_gradle_compile_commands(build): def scan_binary(apkfile): - logging.info("Scanning APK for known non-free classes.") + """Scan output of apkanalyzer for known non-free classes + + apkanalyzer produces useful output when it can run, but it does + not support all recent JDK versions, and also some DEX versions, + so this cannot count on it to always produce useful output or even + to run without exiting with an error. + + """ + + logging.info(_('Scanning APK with apkanalyzer for known non-free classes.')) result = common.SdkToolsPopen(["apkanalyzer", "dex", "packages", "--defined-only", apkfile], output=False) - problems = 0 if result.returncode != 0: - problems += 1 - logging.error(result.output) + logging.warning(_('scanner not cleanly run apkanalyzer: %s') % result.output) + problems = 0 for suspect, regexp in CODE_SIGNATURES.items(): matches = regexp.findall(result.output) if matches: From 598c87c78fa2afd0d57ce7e037ee17bb818ea916 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 16 Mar 2021 13:15:54 +0100 Subject: [PATCH 0189/2116] set development version https://www.python.org/dev/peps/pep-0440/#developmental-releases --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 3d751489..0505e396 100755 --- a/setup.py +++ b/setup.py @@ -53,7 +53,7 @@ with open("README.md", "r") as fh: long_description = fh.read() setup(name='fdroidserver', - version='2.0.1a0', + version='2.1a0.dev0', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From dbf80ad771385e1aea158f3a737f9ac5e71aba80 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 16 Mar 2021 09:22:55 +0100 Subject: [PATCH 0190/2116] metadata: remove git repo handling from metadata parsing This is a vestige of implementing builds from a .fdroid.yml file directly in the app's source repo. It was never fully complete and seems to not be used in any apps in fdroiddata. This makes `fdroid build --all` runs much faster since it does not need to do any git handling for apps that do not have any new builds to run. 4e8e29794 948689281 a4e431080 e37be9b06 e775d330c --- examples/fdroid_fetchsrclibs.py | 4 ++- fdroidserver/build.py | 2 +- fdroidserver/metadata.py | 64 +++++++++++++++++++++------------ tests/index.TestCase | 2 +- 4 files changed, 47 insertions(+), 25 deletions(-) diff --git a/examples/fdroid_fetchsrclibs.py b/examples/fdroid_fetchsrclibs.py index d88b9fa5..bff07eea 100644 --- a/examples/fdroid_fetchsrclibs.py +++ b/examples/fdroid_fetchsrclibs.py @@ -21,12 +21,14 @@ def main(): options = parser.parse_args() common.options = options pkgs = common.read_pkg_args(options.appid, True) - allapps = metadata.read_metadata(pkgs, check_vcs=True) + allapps = metadata.read_metadata(pkgs) apps = common.read_app_args(options.appid, allapps, True) srclib_dir = os.path.join('build', 'srclib') os.makedirs(srclib_dir, exist_ok=True) srclibpaths = [] for appid, app in apps.items(): + vcs, _ignored = common.setup_vcs(app) + vcs.gotorevision('HEAD', refresh=False) for build in app.get('Builds', []): for lib in build.srclibs: srclibpaths.append(common.getsrclib(lib, srclib_dir, build=build)) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index b63e0eca..75d88944 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -1012,7 +1012,7 @@ def main(): # Read all app and srclib metadata pkgs = common.read_pkg_args(options.appid, True) - allapps = metadata.read_metadata(pkgs, options.refresh, sort_by_time=True, check_vcs=True) + allapps = metadata.read_metadata(pkgs, sort_by_time=True) apps = common.read_app_args(options.appid, allapps, True) for appid, app in list(apps.items()): diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 6c3c4815..5dde19e6 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -18,6 +18,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import git import os import re import glob @@ -541,7 +542,7 @@ def read_srclibs(): srclibs[srclibname] = parse_yaml_srclib(metadatapath) -def read_metadata(appids={}, refresh=True, sort_by_time=False, check_vcs=False): +def read_metadata(appids={}, sort_by_time=False): """Return a list of App instances sorted newest first This reads all of the metadata files in a 'data' repository, then @@ -597,7 +598,7 @@ def read_metadata(appids={}, refresh=True, sort_by_time=False, check_vcs=False): if appid in apps: _warn_or_exception(_("Found multiple metadata files for {appid}") .format(appid=appid)) - app = parse_metadata(metadatapath, check_vcs, refresh) + app = parse_metadata(metadatapath) check_metadata(app) apps[app.id] = app @@ -730,15 +731,22 @@ def _decode_bool(s): _warn_or_exception(_("Invalid boolean '%s'") % s) -def parse_metadata(metadatapath, check_vcs=False, refresh=True): - '''parse metadata file, optionally checking the git repo for metadata first''' +def parse_metadata(metadatapath): + """parse metadata file, also checking the source repo for .fdroid.yml + + If this is a metadata file from fdroiddata, it will first load the + source repo type and URL from fdroiddata, then read .fdroid.yml if + it exists, then include the rest of the metadata as specified in + fdroiddata, so that fdroiddata has precedence over the metadata in + the source code. + + """ app = App() app.metadatapath = metadatapath - name, _ignored = fdroidserver.common.get_extension(os.path.basename(metadatapath)) - if name == '.fdroid': - check_vcs = False - else: + metadata_file = os.path.basename(metadatapath) + name, _ignored = fdroidserver.common.get_extension(metadata_file) + if name != '.fdroid': app.id = name if metadatapath.endswith('.yml'): @@ -748,16 +756,15 @@ def parse_metadata(metadatapath, check_vcs=False, refresh=True): _warn_or_exception(_('Unknown metadata format: {path} (use: *.yml)') .format(path=metadatapath)) - if check_vcs and app.Repo: + if metadata_file != '.fdroid.yml' and app.Repo: build_dir = fdroidserver.common.get_build_dir(app) metadata_in_repo = os.path.join(build_dir, '.fdroid.yml') - if not os.path.isfile(metadata_in_repo): - vcs, build_dir = fdroidserver.common.setup_vcs(app) - if isinstance(vcs, fdroidserver.common.vcs_git): - vcs.gotorevision('HEAD', refresh) # HEAD since we can't know where else to go if os.path.isfile(metadata_in_repo): - logging.debug('Including metadata from ' + metadata_in_repo) - # do not include fields already provided by main metadata file + try: + commit_id = fdroidserver.common.get_head_commit_id(git.repo.Repo(build_dir)) + logging.debug(_('Including metadata from %s@%s') % (metadata_in_repo, commit_id)) + except git.exc.InvalidGitRepositoryError: + logging.debug(_('Including metadata from {path}').format(metadata_in_repo)) app_in_repo = parse_metadata(metadata_in_repo) for k, v in app_in_repo.items(): if k not in app: @@ -779,6 +786,17 @@ def parse_metadata(metadatapath, check_vcs=False, refresh=True): def parse_yaml_metadata(mf, app): + """Parse the .yml file and post-process it + + Clean metadata .yml files can be used directly, but in order to + make a better user experience for people editing .yml files, there + is post processing. .fdroid.yml is embedded in the app's source + repo, so it is "user-generated". That means that it can have + weird things in it that need to be removed so they don't break the + overall process. + + """ + try: yamldata = yaml.load(mf, Loader=SafeLoader) except yaml.YAMLError as e: @@ -791,13 +809,15 @@ def parse_yaml_metadata(mf, app): deprecated_in_yaml = ['Provides'] if yamldata: - for field in yamldata: - if field not in yaml_app_fields: - if field not in deprecated_in_yaml: - _warn_or_exception(_("Unrecognised app field " - "'{fieldname}' in '{path}'") - .format(fieldname=field, - path=mf.name)) + for field in tuple(yamldata.keys()): + if field not in yaml_app_fields + deprecated_in_yaml: + msg = (_("Unrecognised app field '{fieldname}' in '{path}'") + .format(fieldname=field, path=mf.name)) + if os.path.basename(mf.name) == '.fdroid.yml': + logging.error(msg) + del yamldata[field] + else: + _warn_or_exception(msg) for deprecated_field in deprecated_in_yaml: if deprecated_field in yamldata: diff --git a/tests/index.TestCase b/tests/index.TestCase index 0682e6d9..00e8e1a1 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -289,7 +289,7 @@ class IndexTest(unittest.TestCase): 'timestamp': datetime.datetime.now(), 'version': 12, } - app = fdroidserver.metadata.parse_metadata(metadatafile, False, False) + app = fdroidserver.metadata.parse_metadata(metadatafile) app['icon'] = 'info.zwanenburg.caffeinetile.4.xml' app['CurrentVersionCode'] = '4' apps = {app.id: app} From 553daf85521238bbbe301c9baa8542e7c356d927 Mon Sep 17 00:00:00 2001 From: Christian Beier Date: Thu, 11 Mar 2021 15:52:25 +0100 Subject: [PATCH 0191/2116] update: take build subdir into account when looking for triple-t data Implemented as a fallback solution when parsing settings.gradle and globbing the build dir with "'*', 'src', '*', 'play'" did not yield results. Before, the logic would not find triple-t metadata in projects where settings.gradle is in a subdirectory or 'src' is found at a directory depth != 2. Closes fdroid/fdroiddata#2295 --- fdroidserver/update.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index fe119a15..988c65a2 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1058,6 +1058,8 @@ def copy_triple_t_store_metadata(apps): gradle_subdirs.add(p) if not gradle_subdirs: gradle_subdirs.update(glob.glob(os.path.join('build', packageName, '*', 'src', '*', 'play'))) + if not gradle_subdirs and len(app.get('Builds', [])) and app.get('Builds', [])[-1].subdir: + gradle_subdirs.update(glob.glob(os.path.join('build', packageName, app.get('Builds', [])[-1].subdir, 'src', '*', 'play'))) for d in gradle_subdirs: logging.debug('Triple-T Gradle Play Publisher: ' + d) From ea9f917ddc95bf766320229fa2cc36db0cfc850a Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 19 Mar 2021 13:14:08 +0100 Subject: [PATCH 0192/2116] Support versionCode and versionName in brackets Example: versionCode(29) https://github.com/florisboard/florisboard/blob/v0.3.9/app/build.gradle.kts#L24 --- MANIFEST.in | 1 + fdroidserver/common.py | 4 +- tests/common.TestCase | 10 ++ .../app/build.gradle.kts | 97 +++++++++++++++++++ 4 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 tests/source-files/dev.patrickgold.florisboard/app/build.gradle.kts diff --git a/MANIFEST.in b/MANIFEST.in index 40e28d21..1a9469a6 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -744,6 +744,7 @@ include tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata include tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/en-US/short_description.txt include tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/en-US/title.txt include tests/source-files/com.seafile.seadroid2/app/build.gradle +include tests/source-files/dev.patrickgold.florisboard/app/build.gradle.kts include tests/source-files/eu.siacs.conversations/build.gradle include tests/source-files/eu.siacs.conversations/metadata/en-US/name.txt include tests/source-files/fdroid/fdroidclient/AndroidManifest.xml diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 7917a05d..9184b2c4 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1488,8 +1488,8 @@ def remove_debuggable_flags(root_dir): os.path.join(root, 'AndroidManifest.xml')) -vcsearch_g = re.compile(r'''\b[Vv]ersionCode\s*=?\s*["']*([0-9_]+)["']*''').search -vnsearch_g = re.compile(r'''\b[Vv]ersionName\s*=?\s*(["'])((?:(?=(\\?))\3.)*?)\1''').search +vcsearch_g = re.compile(r'''\b[Vv]ersionCode\s*=?\s*["'(]*([0-9_]+)["')]*''').search +vnsearch_g = re.compile(r'''\b[Vv]ersionName\s*=?\s*\(?(["'])((?:(?=(\\?))\3.)*?)\1''').search vnssearch_g = re.compile(r'''\b[Vv]ersionNameSuffix\s*=?\s*(["'])((?:(?=(\\?))\3.)*?)\1''').search psearch_g = re.compile(r'''\b(packageName|applicationId)\s*=*\s*["']([^"']+)["']''').search fsearch_g = re.compile(r'''\b(applicationIdSuffix)\s*=*\s*["']([^"']+)["']''').search diff --git a/tests/common.TestCase b/tests/common.TestCase index b4ac2541..abb8ee51 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -926,6 +926,16 @@ class CommonTest(unittest.TestCase): self.assertEqual(('1.9.0', '170521', 'com.integreight.onesheeld'), fdroidserver.common.parse_androidmanifests(paths, app)) + app = fdroidserver.metadata.App() + app.id = 'dev.patrickgold.florisboard' + paths = [ + os.path.join('source-files', 'dev.patrickgold.florisboard', 'app', 'build.gradle.kts'), + ] + for path in paths: + self.assertTrue(os.path.isfile(path)) + self.assertEqual(('0.3.10', '29', 'dev.patrickgold.florisboard'), + fdroidserver.common.parse_androidmanifests(paths, app)) + def test_parse_androidmanifests_ignore(self): app = fdroidserver.metadata.App() app.id = 'org.fdroid.fdroid' diff --git a/tests/source-files/dev.patrickgold.florisboard/app/build.gradle.kts b/tests/source-files/dev.patrickgold.florisboard/app/build.gradle.kts new file mode 100644 index 00000000..14767fa8 --- /dev/null +++ b/tests/source-files/dev.patrickgold.florisboard/app/build.gradle.kts @@ -0,0 +1,97 @@ +plugins { + id("com.android.application") version "4.1.2" + kotlin("android") version "1.4.30" +} + +android { + compileSdkVersion(30) + buildToolsVersion("30.0.3") + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + freeCompilerArgs = listOf("-Xallow-result-return-type") // enables use of kotlin.Result + } + + defaultConfig { + applicationId = "dev.patrickgold.florisboard" + minSdkVersion(23) + targetSdkVersion(30) + versionCode(29) + versionName("0.3.10") + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildFeatures { + viewBinding = true + } + + buildTypes { + named("debug").configure { + applicationIdSuffix = ".debug" + versionNameSuffix = "-debug" + + resValue("mipmap", "floris_app_icon", "@mipmap/ic_app_icon_debug") + resValue("mipmap", "floris_app_icon_round", "@mipmap/ic_app_icon_debug_round") + resValue("string", "floris_app_name", "FlorisBoard Debug") + } + + create("beta") // Needed because by default the "beta" BuildType does not exist + named("beta").configure { + applicationIdSuffix = ".beta" + versionNameSuffix = "-beta01" + proguardFiles.add(getDefaultProguardFile("proguard-android-optimize.txt")) + + resValue("mipmap", "floris_app_icon", "@mipmap/ic_app_icon_beta") + resValue("mipmap", "floris_app_icon_round", "@mipmap/ic_app_icon_beta_round") + resValue("string", "floris_app_name", "FlorisBoard Beta") + } + + named("release").configure { + proguardFiles.add(getDefaultProguardFile("proguard-android-optimize.txt")) + + resValue("mipmap", "floris_app_icon", "@mipmap/ic_app_icon_release") + resValue("mipmap", "floris_app_icon_round", "@mipmap/ic_app_icon_release_round") + resValue("string", "floris_app_name", "@string/app_name") + } + } + + testOptions { + unitTests { + isIncludeAndroidResources = true + } + } + + lintOptions { + isAbortOnError = false + } +} + +dependencies { + implementation("androidx.activity", "activity-ktx", "1.2.1") + implementation("androidx.appcompat", "appcompat", "1.2.0") + implementation("androidx.core", "core-ktx", "1.3.2") + implementation("androidx.fragment", "fragment-ktx", "1.3.0") + implementation("androidx.preference", "preference-ktx", "1.1.1") + implementation("androidx.constraintlayout", "constraintlayout", "2.0.4") + implementation("androidx.lifecycle", "lifecycle-service", "2.2.0") + implementation("com.google.android", "flexbox", "2.0.1") // requires jcenter as of version 2.0.1 + implementation("com.squareup.moshi", "moshi-kotlin", "1.11.0") + implementation("com.squareup.moshi", "moshi-adapters", "1.11.0") + implementation("com.google.android.material", "material", "1.3.0") + implementation("org.jetbrains.kotlinx", "kotlinx-coroutines-android", "1.4.2") + implementation("com.jaredrummler", "colorpicker", "1.1.0") + implementation("com.jakewharton.timber", "timber", "4.7.1") + implementation("com.nambimobile.widgets", "expandable-fab", "1.0.2") + + testImplementation("junit", "junit", "4.13.1") + testImplementation("org.mockito", "mockito-inline", "3.7.7") + testImplementation("org.robolectric", "robolectric", "4.5.1") + androidTestImplementation("androidx.test.ext", "junit", "1.1.2") + androidTestImplementation("androidx.test.espresso", "espresso-core", "3.3.0") +} From 08cde5c2e67800a45f9d20b2b373a1d8696913e6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 18 Mar 2021 15:26:42 +0100 Subject: [PATCH 0193/2116] code formatting: black --skip-string-normalization --line-length 100 --- fdroidserver/btlog.py | 25 +++++++++++++------------ fdroidserver/exception.py | 7 ++++--- fdroidserver/gpgsign.py | 4 +--- fdroidserver/signindex.py | 3 ++- fdroidserver/tail.py | 2 +- 5 files changed, 21 insertions(+), 20 deletions(-) diff --git a/fdroidserver/btlog.py b/fdroidserver/btlog.py index f1e83c90..84318804 100755 --- a/fdroidserver/btlog.py +++ b/fdroidserver/btlog.py @@ -49,9 +49,9 @@ from .exception import FDroidException options = None -def make_binary_transparency_log(repodirs, btrepo='binary_transparency', - url=None, - commit_title='fdroid update'): +def make_binary_transparency_log( + repodirs, btrepo='binary_transparency', url=None, commit_title='fdroid update' +): '''Log the indexes in a standalone git repo to serve as a "binary transparency" log. @@ -103,7 +103,7 @@ For more info on this idea: output = json.load(fp, object_pairs_hook=collections.OrderedDict) with open(dest, 'w') as fp: json.dump(output, fp, indent=2) - gitrepo.index.add([repof, ]) + gitrepo.index.add([repof]) for f in ('index.jar', 'index-v1.jar'): repof = os.path.join(repodir, f) if not os.path.exists(repof): @@ -116,7 +116,7 @@ For more info on this idea: jarout.writestr(info, jarin.read(info.filename)) jarout.close() jarin.close() - gitrepo.index.add([repof, ]) + gitrepo.index.add([repof]) output_files = [] for root, dirs, files in os.walk(repodir): @@ -137,10 +137,10 @@ For more info on this idea: fslogfile = os.path.join(cpdir, 'filesystemlog.json') with open(fslogfile, 'w') as fp: json.dump(output, fp, indent=2) - gitrepo.index.add([os.path.join(repodir, 'filesystemlog.json'), ]) + gitrepo.index.add([os.path.join(repodir, 'filesystemlog.json')]) for f in glob.glob(os.path.join(cpdir, '*.HTTP-headers.json')): - gitrepo.index.add([os.path.join(repodir, os.path.basename(f)), ]) + gitrepo.index.add([os.path.join(repodir, os.path.basename(f))]) gitrepo.index.commit(commit_title) @@ -168,7 +168,8 @@ def main(): if not os.path.exists(options.git_repo): raise FDroidException( - '"%s" does not exist! Create it, or use --git-repo' % options.git_repo) + '"%s" does not exist! Create it, or use --git-repo' % options.git_repo + ) session = requests.Session() @@ -186,9 +187,7 @@ def main(): dlurl = options.url + '/' + repodir + '/' + f http_headers_file = os.path.join(gitrepodir, f + '.HTTP-headers.json') - headers = { - 'User-Agent': 'F-Droid 0.102.3' - } + headers = {'User-Agent': 'F-Droid 0.102.3'} etag = None if os.path.exists(http_headers_file): with open(http_headers_file) as fp: @@ -196,7 +195,9 @@ def main(): r = session.head(dlurl, headers=headers, allow_redirects=False) if r.status_code != 200: - logging.debug('HTTP Response (' + str(r.status_code) + '), did not download ' + dlurl) + logging.debug( + 'HTTP Response (' + str(r.status_code) + '), did not download ' + dlurl + ) continue if etag and etag == r.headers.get('ETag'): logging.debug('ETag matches, did not download ' + dlurl) diff --git a/fdroidserver/exception.py b/fdroidserver/exception.py index f9f876ce..15228797 100644 --- a/fdroidserver/exception.py +++ b/fdroidserver/exception.py @@ -1,5 +1,4 @@ class FDroidException(Exception): - def __init__(self, value=None, detail=None): self.value = value self.detail = detail @@ -22,12 +21,14 @@ class FDroidException(Exception): else: ret = str(self.value) if self.detail: - ret += "\n==== detail begin ====\n%s\n==== detail end ====" % ''.join(self.detail).strip() + ret += ( + "\n==== detail begin ====\n%s\n==== detail end ====" + % ''.join(self.detail).strip() + ) return ret class MetaDataException(Exception): - def __init__(self, value): self.value = value diff --git a/fdroidserver/gpgsign.py b/fdroidserver/gpgsign.py index 86258b63..b6ee8fb7 100644 --- a/fdroidserver/gpgsign.py +++ b/fdroidserver/gpgsign.py @@ -73,9 +73,7 @@ def main(): sigpath = os.path.join(output_dir, sigfilename) if not os.path.exists(sigpath): - gpgargs = ['gpg', '-a', - '--output', sigpath, - '--detach-sig'] + gpgargs = ['gpg', '-a', '--output', sigpath, '--detach-sig'] if 'gpghome' in config: gpgargs.extend(['--homedir', config['gpghome']]) if 'gpgkey' in config: diff --git a/fdroidserver/signindex.py b/fdroidserver/signindex.py index 2c5859d5..a993ae73 100644 --- a/fdroidserver/signindex.py +++ b/fdroidserver/signindex.py @@ -99,7 +99,8 @@ def main(): if 'jarsigner' not in config: raise FDroidException( - _('Java jarsigner not found! Install in standard location or set java_paths!')) + _('Java jarsigner not found! Install in standard location or set java_paths!') + ) repodirs = ['repo'] if config['archive_older'] != 0: diff --git a/fdroidserver/tail.py b/fdroidserver/tail.py index fb441f97..1f64e5df 100644 --- a/fdroidserver/tail.py +++ b/fdroidserver/tail.py @@ -33,6 +33,7 @@ import threading class Tail(object): ''' Represents a tail command. ''' + def __init__(self, tailed_file): ''' Initiate a Tail instance. Check for file validity, assigns callback function to standard out. @@ -95,7 +96,6 @@ class Tail(object): class TailError(Exception): - def __init__(self, msg): self.message = msg From 50f0534d876bb42b23f6bce8dffe4295bbcd2d3a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 19 Mar 2021 18:25:34 +0100 Subject: [PATCH 0194/2116] publish: always use apksigner to sign APKs, closes #880 --- fdroidserver/common.py | 111 ++++++++++++++--------------------------- 1 file changed, 38 insertions(+), 73 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 9184b2c4..70eebcb5 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3001,7 +3001,7 @@ def _zipalign(unsigned_apk, aligned_apk): def apk_implant_signatures(apkpath, signaturefile, signedfile, manifest): - """Implats a signature from metadata into an APK. + """Implants a signature from metadata into an APK. Note: this changes there supplied APK in place. So copy it if you need the original to be preserved. @@ -3061,82 +3061,47 @@ def get_min_sdk_version(apk): def sign_apk(unsigned_path, signed_path, keyalias): """Sign and zipalign an unsigned APK, then save to a new file, deleting the unsigned - Use apksigner for making v2 and v3 signature for apks with targetSDK >=30 as - otherwise they won't be installable on Android 11/R. + NONE is a Java keyword used to configure smartcards as the + keystore. Otherwise, the keystore is a local file. + https://docs.oracle.com/javase/7/docs/technotes/guides/security/p11guide.html#KeyToolJarSigner - Otherwise use jarsigner for v1 only signatures until we have apksig v2/v3 - signature transplantig support. - - When using jarsigner we need to manually select the hash algorithm, - apksigner does this automatically. Apksigner also does the zipalign for us. - - SHA-256 support was added in android-18 (4.3), before then, the only options were MD5 - and SHA1. This aims to use SHA-256 when the APK does not target - older Android versions, and is therefore safe to do so. - - https://issuetracker.google.com/issues/36956587 - https://android-review.googlesource.com/c/platform/libcore/+/44491 + When using smartcards, apksigner does not use the same options has + Java/keytool/jarsigner (-providerName, -providerClass, + -providerArg, -storetype). apksigner documents the options as + --ks-provider-class and --ks-provider-arg. Those seem to be + accepted but fail when actually making a signature with weird + internal exceptions. We use the options that actually work. From: + https://geoffreymetais.github.io/code/key-signing/#scripting """ - apk = _get_androguard_APK(unsigned_path) - if apk.get_effective_target_sdk_version() >= 30: - if config['keystore'] == 'NONE': - # NOTE: apksigner doesn't like -providerName/--provider-name at all, don't use that. - # apksigner documents the options as --ks-provider-class and --ks-provider-arg - # those seem to be accepted but fail when actually making a signature with - # weird internal exceptions. Those options actually work. - # From: https://geoffreymetais.github.io/code/key-signing/#scripting - apksigner_smartcardoptions = config['smartcardoptions'].copy() - if '-providerName' in apksigner_smartcardoptions: - pos = config['smartcardoptions'].index('-providerName') - # remove -providerName and it's argument - del apksigner_smartcardoptions[pos] - del apksigner_smartcardoptions[pos] - replacements = {'-storetype': '--ks-type', - '-providerClass': '--provider-class', - '-providerArg': '--provider-arg'} - signing_args = [replacements.get(n, n) for n in apksigner_smartcardoptions] - else: - signing_args = ['--key-pass', 'env:FDROID_KEY_PASS'] - if not find_apksigner(): - raise BuildException(_("apksigner not found, it's required for signing!")) - cmd = [find_apksigner(), 'sign', - '--ks', config['keystore'], - '--ks-pass', 'env:FDROID_KEY_STORE_PASS'] - cmd += signing_args - cmd += ['--ks-key-alias', keyalias, - '--in', unsigned_path, - '--out', signed_path] - p = FDroidPopen(cmd, envs={ - 'FDROID_KEY_STORE_PASS': config['keystorepass'], - 'FDROID_KEY_PASS': config.get('keypass', "")}) - if p.returncode != 0: - raise BuildException(_("Failed to sign application"), p.output) - os.remove(unsigned_path) + if config['keystore'] == 'NONE': + apksigner_smartcardoptions = config['smartcardoptions'].copy() + if '-providerName' in apksigner_smartcardoptions: + pos = config['smartcardoptions'].index('-providerName') + # remove -providerName and it's argument + del apksigner_smartcardoptions[pos] + del apksigner_smartcardoptions[pos] + replacements = {'-storetype': '--ks-type', + '-providerClass': '--provider-class', + '-providerArg': '--provider-arg'} + signing_args = [replacements.get(n, n) for n in apksigner_smartcardoptions] else: - - if get_min_sdk_version(apk) < 18: - signature_algorithm = ['-sigalg', 'SHA1withRSA', '-digestalg', 'SHA1'] - else: - signature_algorithm = ['-sigalg', 'SHA256withRSA', '-digestalg', 'SHA-256'] - if config['keystore'] == 'NONE': - signing_args = config['smartcardoptions'] - else: - signing_args = ['-keypass:env', 'FDROID_KEY_PASS'] - - cmd = [config['jarsigner'], '-keystore', config['keystore'], - '-storepass:env', 'FDROID_KEY_STORE_PASS'] - cmd += signing_args - cmd += signature_algorithm - cmd += [unsigned_path, keyalias] - p = FDroidPopen(cmd, envs={ - 'FDROID_KEY_STORE_PASS': config['keystorepass'], - 'FDROID_KEY_PASS': config.get('keypass', "")}) - if p.returncode != 0: - raise BuildException(_("Failed to sign application"), p.output) - - _zipalign(unsigned_path, signed_path) - os.remove(unsigned_path) + signing_args = ['--key-pass', 'env:FDROID_KEY_PASS'] + if not find_apksigner(): + raise BuildException(_("apksigner not found, it's required for signing!")) + cmd = [find_apksigner(), 'sign', + '--ks', config['keystore'], + '--ks-pass', 'env:FDROID_KEY_STORE_PASS'] + cmd += signing_args + cmd += ['--ks-key-alias', keyalias, + '--in', unsigned_path, + '--out', signed_path] + p = FDroidPopen(cmd, envs={ + 'FDROID_KEY_STORE_PASS': config['keystorepass'], + 'FDROID_KEY_PASS': config.get('keypass', "")}) + if p.returncode != 0: + raise BuildException(_("Failed to sign application"), p.output) + os.remove(unsigned_path) def verify_apks(signed_apk, unsigned_apk, tmp_dir): From 8a9852209b286fcf600ea92f15193348388a5d69 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 22 Mar 2021 14:00:16 +0100 Subject: [PATCH 0195/2116] update: do not die when androguard files to extract icon https://jenkins.debian.net/job/reproducible_fdroid_test/422 https://jenkins.debian.net/job/reproducible_fdroid_test/423 ``` Traceback (most recent call last): File "../fdroid", line 22, in fdroidserver.__main__.main() File "/var/lib/jenkins/userContent/reproducible/reproducible_fdroid_build_apps/fdroidserver/__main__.py", line 227, in main raise e File "/var/lib/jenkins/userContent/reproducible/reproducible_fdroid_build_apps/fdroidserver/__main__.py", line 208, in main mod.main() File "/var/lib/jenkins/userContent/reproducible/reproducible_fdroid_build_apps/fdroidserver/update.py", line 2316, in main apks, cachechanged = process_apks(apkcache, repodirs[0], knownapks, options.use_date_from_apk) File "/var/lib/jenkins/userContent/reproducible/reproducible_fdroid_build_apps/fdroidserver/update.py", line 1746, in process_apks use_date_from_apk, ada, True) File "/var/lib/jenkins/userContent/reproducible/reproducible_fdroid_build_apps/fdroidserver/update.py", line 1619, in process_apk apk = scan_apk(apkfile) File "/var/lib/jenkins/userContent/reproducible/reproducible_fdroid_build_apps/fdroidserver/update.py", line 1385, in scan_apk scan_apk_androguard(apk, apk_file) File "/var/lib/jenkins/userContent/reproducible/reproducible_fdroid_build_apps/fdroidserver/update.py", line 1527, in scan_apk_androguard resource_id = arsc.get_id(apk['packageName'], icon_id) File "/usr/lib/python3/dist-packages/androguard/core/bytecodes/axml/__init__.py", line 1668, in get_id self._analyse() File "/usr/lib/python3/dist-packages/androguard/core/bytecodes/axml/__init__.py", line 1321, in _analyse ate = self.packages[package_name][nb + 3 + nb_i] IndexError: list index out of range ``` --- fdroidserver/update.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 988c65a2..f34e8b0f 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1395,17 +1395,17 @@ def scan_apk(apk_file): logging.debug('Getting signature of {0}'.format(os.path.basename(apk_file))) apk['sig'] = getsig(apk_file) if not apk['sig']: - raise BuildException("Failed to get apk signature") + raise BuildException(_("Failed to get APK signing key fingerprint")) apk['signer'] = common.apk_signer_fingerprint(os.path.join(os.getcwd(), apk_file)) if not apk.get('signer'): - raise BuildException("Failed to get apk signing key fingerprint") + raise BuildException(_("Failed to get APK signing key fingerprint")) # Get size of the APK apk['size'] = os.path.getsize(apk_file) if 'minSdkVersion' not in apk: - logging.warning("No SDK version information found in {0}".format(apk_file)) + logging.warning(_("No minimum SDK version found in {0}, using default (3).").format(apk_file)) apk['minSdkVersion'] = 3 # aapt defaults to 3 as the min # Check for known vulnerabilities @@ -1524,13 +1524,16 @@ def scan_apk_androguard(apk, apkfile): icon_id_str = apkobject.get_element("application", "icon") if icon_id_str: icon_id = int(icon_id_str.replace("@", "0x"), 16) - resource_id = arsc.get_id(apk['packageName'], icon_id) - if resource_id: - icon_name = arsc.get_id(apk['packageName'], icon_id)[1] - else: - # don't use 'anydpi' aka 0xFFFE aka 65534 since it is XML - icon_name = os.path.splitext(os.path.basename(apkobject.get_app_icon(max_dpi=65534 - 1)))[0] - apk['icons_src'] = _get_apk_icons_src(apkfile, icon_name) + try: + resource_id = arsc.get_id(apk['packageName'], icon_id) + if resource_id: + icon_name = arsc.get_id(apk['packageName'], icon_id)[1] + else: + # don't use 'anydpi' aka 0xFFFE aka 65534 since it is XML + icon_name = os.path.splitext(os.path.basename(apkobject.get_app_icon(max_dpi=65534 - 1)))[0] + apk['icons_src'] = _get_apk_icons_src(apkfile, icon_name) + except Exception as e: + logging.error("Cannot fetch icon from %s: %s" % (apkfile, str(e))) arch_re = re.compile("^lib/(.*)/.*$") arch = set([arch_re.match(file).group(1) for file in apkobject.get_files() if arch_re.match(file)]) From 903a7396b12e7b0b5e310f2830cba92f2aef906f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 22 Mar 2021 14:51:59 +0100 Subject: [PATCH 0196/2116] switch to preferring apksigner, requiring for `fdroid publish` --- fdroidserver/common.py | 34 ++++++++++++++++------- fdroidserver/init.py | 6 ---- tests/build.TestCase | 2 ++ tests/common.TestCase | 33 ++-------------------- tests/init.TestCase | 7 +---- tests/run-tests | 63 ++++++++++++++++++++++++------------------ tests/update.TestCase | 4 +-- 7 files changed, 67 insertions(+), 82 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 70eebcb5..79c77456 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -262,6 +262,11 @@ def fill_config_defaults(thisconfig): if 'keytool' not in thisconfig and shutil.which('keytool'): thisconfig['keytool'] = shutil.which('keytool') + # enable apksigner by default so v2/v3 APK signatures validate + find_apksigner(thisconfig) + if not thisconfig.get('apksigner'): + logging.warning(_('apksigner not found! Cannot sign or verify modern APKs')) + for k in ['ndk_paths', 'java_paths']: d = thisconfig[k] for k2 in d.copy(): @@ -456,26 +461,35 @@ def assert_config_keystore(config): + "you can create one using: fdroid update --create-key") -def find_apksigner(): - """ +def find_apksigner(config): + """Searches for the best version apksigner and adds it to the config + Returns the best version of apksigner following this algorithm: * use config['apksigner'] if set * try to find apksigner in path * find apksigner in build-tools starting from newest installed going down to MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION :return: path to apksigner or None if no version is found + """ - if set_command_in_config('apksigner'): - return config['apksigner'] - build_tools_path = os.path.join(config['sdk_path'], 'build-tools') + command = 'apksigner' + if command in config: + return + + tmp = find_command(command) + if tmp is not None: + config[command] = tmp + return + + build_tools_path = os.path.join(config.get('sdk_path', ''), 'build-tools') if not os.path.isdir(build_tools_path): - return None + return for f in sorted(os.listdir(build_tools_path), reverse=True): if not os.path.isdir(os.path.join(build_tools_path, f)): continue try: if LooseVersion(f) < LooseVersion(MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION): - return None + return except TypeError: continue if os.path.exists(os.path.join(build_tools_path, f, 'apksigner')): @@ -483,7 +497,6 @@ def find_apksigner(): logging.info("Using %s " % apksigner) # memoize result config['apksigner'] = apksigner - return config['apksigner'] def find_sdk_tools_cmd(cmd): @@ -3087,9 +3100,10 @@ def sign_apk(unsigned_path, signed_path, keyalias): signing_args = [replacements.get(n, n) for n in apksigner_smartcardoptions] else: signing_args = ['--key-pass', 'env:FDROID_KEY_PASS'] - if not find_apksigner(): + apksigner = config.get('apksigner', '') + if not shutil.which(apksigner): raise BuildException(_("apksigner not found, it's required for signing!")) - cmd = [find_apksigner(), 'sign', + cmd = [apksigner, 'sign', '--ks', config['keystore'], '--ks-pass', 'env:FDROID_KEY_STORE_PASS'] cmd += signing_args diff --git a/fdroidserver/init.py b/fdroidserver/init.py index 64809771..8291612d 100644 --- a/fdroidserver/init.py +++ b/fdroidserver/init.py @@ -146,12 +146,6 @@ def main(): # now that we have a local config.yml, read configuration... config = common.read_config(options) - # enable apksigner by default so v2/v3 APK signatures validate - if common.find_apksigner() is not None: - apksigner = common.find_apksigner() - test_config['apksigner'] = apksigner - common.write_to_config(test_config, 'apksigner', apksigner) - # the NDK is optional and there may be multiple versions of it, so it's # left for the user to configure diff --git a/tests/build.TestCase b/tests/build.TestCase index a696f196..da8bd7d2 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -37,6 +37,8 @@ class BuildTest(unittest.TestCase): if not os.path.exists(self.tmpdir): os.makedirs(self.tmpdir) os.chdir(self.basedir) + fdroidserver.common.config = None + fdroidserver.build.config = None def test_get_apk_metadata(self): config = dict() diff --git a/tests/common.TestCase b/tests/common.TestCase index abb8ee51..607de389 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -619,12 +619,9 @@ class CommonTest(unittest.TestCase): def test_sign_apk(self): fdroidserver.common.config = None config = fdroidserver.common.read_config(fdroidserver.common.options) - try: - fdroidserver.common.find_sdk_tools_cmd('zipalign') - except fdroidserver.exception.FDroidException: - self.skipTest('SKIPPING test_sign_apk, zipalign not installed!') + if 'apksigner' not in config: + self.skipTest('SKIPPING test_sign_apk, apksigner not installed!') - config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') config['keyalias'] = 'sova' config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' @@ -656,18 +653,6 @@ class CommonTest(unittest.TestCase): self.assertTrue(fdroidserver.common.verify_apk_signature(signed)) self.assertEqual('18', fdroidserver.common._get_androguard_APK(signed).get_min_sdk_version()) - def test_sign_apk_targetsdk_30(self): - fdroidserver.common.config = None - config = fdroidserver.common.read_config(fdroidserver.common.options) - if not fdroidserver.common.find_apksigner(): - self.skipTest('SKIPPING as apksigner is not installed!') - config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') - config['keyalias'] = 'sova' - config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' - config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' - config['keystore'] = os.path.join(self.basedir, 'keystore.jks') - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) - shutil.copy(os.path.join(self.basedir, 'minimal_targetsdk_30_unsigned.apk'), testdir) unsigned = os.path.join(testdir, 'minimal_targetsdk_30_unsigned.apk') signed = os.path.join(testdir, 'minimal_targetsdk_30.apk') @@ -681,18 +666,6 @@ class CommonTest(unittest.TestCase): # verify it has a v2 signature self.assertTrue(fdroidserver.common._get_androguard_APK(signed).is_signed_v2()) - def test_sign_no_targetsdk(self): - fdroidserver.common.config = None - config = fdroidserver.common.read_config(fdroidserver.common.options) - if not fdroidserver.common.find_apksigner(): - self.skipTest('SKIPPING as apksigner is not installed!') - config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') - config['keyalias'] = 'sova' - config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' - config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' - config['keystore'] = os.path.join(self.basedir, 'keystore.jks') - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) - shutil.copy(os.path.join(self.basedir, 'no_targetsdk_minsdk30_unsigned.apk'), testdir) unsigned = os.path.join(testdir, 'no_targetsdk_minsdk30_unsigned.apk') signed = os.path.join(testdir, 'no_targetsdk_minsdk30_signed.apk') @@ -1442,7 +1415,7 @@ class CommonTest(unittest.TestCase): self.assertFalse(os.path.exists('config.yml')) self.assertFalse(os.path.exists('config.py')) config = fdroidserver.common.read_config(fdroidserver.common.options) - self.assertEqual(None, config.get('apksigner')) + self.assertIsNone(config.get('stats_server')) self.assertIsNotNone(config.get('char_limits')) def test_with_config_yml(self): diff --git a/tests/init.TestCase b/tests/init.TestCase index 918643cc..1062214f 100755 --- a/tests/init.TestCase +++ b/tests/init.TestCase @@ -10,7 +10,6 @@ import shutil import sys import tempfile import unittest -import yaml localmodule = os.path.realpath( @@ -68,11 +67,7 @@ class InitTest(unittest.TestCase): sys.argv = ['fdroid init', '--keystore', 'keystore.jks', '--repo-keyalias=sova'] fdroidserver.init.main() - with open('config.yml') as fp: - config = yaml.safe_load(fp) - self.assertTrue(os.path.exists(config['keystore'])) - self.assertTrue(os.path.exists(config['apksigner'])) - self.assertEqual(apksigner, config['apksigner']) + self.assertEqual(apksigner, fdroidserver.init.config.get('apksigner')) if __name__ == "__main__": diff --git a/tests/run-tests b/tests/run-tests index 6058cd85..16d0bdfd 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -72,11 +72,17 @@ have_git_2_3() { is_MD5_disabled() { javac $WORKSPACE/tests/IsMD5Disabled.java && java -cp $WORKSPACE/tests IsMD5Disabled - return $? } use_apksigner() { - test -x "`sed -En 's,^ *apksigner: +,,p' config.yml`" + python3 -c " +import sys +sys.path.insert(0, '$WORKSPACE') +from fdroidserver import common +c = {'sdk_path': '$ANDROID_HOME'} +common.find_apksigner(c) +exit(c.get('apksigner') is None) +" } #------------------------------------------------------------------------------# @@ -169,7 +175,7 @@ $fdroid --version #------------------------------------------------------------------------------# echo_header 'run process when building and signing are on separate machines' -if which zipalign || ls -1 $ANDROID_HOME/build-tools/*/zipalign; then +if use_apksigner; then REPOROOT=`create_test_dir` cd $REPOROOT cp $WORKSPACE/tests/keystore.jks $REPOROOT/ @@ -325,8 +331,9 @@ else test `grep '' repo/index.xml | wc -l` -eq 7 fi + #------------------------------------------------------------------------------# -if ! which apksigner; then +if ! use_apksigner; then echo_header 'test per-app "Archive Policy"' REPOROOT=`create_test_dir` @@ -534,7 +541,7 @@ test -e repo/org.bitbucket.tickytacky.mirrormirror_4.apk test -e archive/urzip-badsig.apk sed -i.tmp '/apksigner:/d' config.yml -if ! which apksigner; then +if ! use_apksigner; then $sed -i.tmp '/allow_disabled_algorithms/d' config.yml $fdroid update --pretty --nosign test `grep '' archive/index.xml | wc -l` -eq 5 @@ -1240,28 +1247,30 @@ fi #------------------------------------------------------------------------------# echo_header 'test extracting and publishing with developer signature' -REPOROOT=`create_test_dir` -cd $REPOROOT -fdroid_init_with_prebuilt_keystore -echo 'keydname: "CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US"' >> config.yml -test -d metadata || mkdir metadata -cp $WORKSPACE/tests/metadata/com.politedroid.yml metadata/ -test -d repo || mkdir repo -test -d unsigned || mkdir unsigned -cp $WORKSPACE/tests/repo/com.politedroid_6.apk unsigned/ -$fdroid signatures unsigned/com.politedroid_6.apk -test -d metadata/com.politedroid/signatures/6 -test -f metadata/com.politedroid/signatures/6/MANIFEST.MF -test -f metadata/com.politedroid/signatures/6/RELEASE.RSA -test -f metadata/com.politedroid/signatures/6/RELEASE.SF -! test -f repo/com.politedroid_6.apk -$fdroid publish -test -f repo/com.politedroid_6.apk -if which jarsigner; then - jarsigner -verify repo/com.politedroid_6.apk -fi -if which apksigner; then - apksigner verify repo/com.politedroid_6.apk +if use_apksigner; then + REPOROOT=`create_test_dir` + cd $REPOROOT + fdroid_init_with_prebuilt_keystore + echo 'keydname: "CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US"' >> config.yml + test -d metadata || mkdir metadata + cp $WORKSPACE/tests/metadata/com.politedroid.yml metadata/ + test -d repo || mkdir repo + test -d unsigned || mkdir unsigned + cp $WORKSPACE/tests/repo/com.politedroid_6.apk unsigned/ + $fdroid signatures unsigned/com.politedroid_6.apk + test -d metadata/com.politedroid/signatures/6 + test -f metadata/com.politedroid/signatures/6/MANIFEST.MF + test -f metadata/com.politedroid/signatures/6/RELEASE.RSA + test -f metadata/com.politedroid/signatures/6/RELEASE.SF + ! test -f repo/com.politedroid_6.apk + $fdroid publish + test -f repo/com.politedroid_6.apk + if which apksigner; then + apksigner verify repo/com.politedroid_6.apk + fi + if which jarsigner; then + jarsigner -verify repo/com.politedroid_6.apk + fi fi diff --git a/tests/update.TestCase b/tests/update.TestCase index 06d5892d..e84609bf 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -656,9 +656,7 @@ class UpdateTest(unittest.TestCase): fdroidserver.update.config = config os.chdir(os.path.join(localmodule, 'tests')) - apksigner = fdroidserver.common.find_apksigner() - if apksigner: - config['apksigner'] = apksigner + if 'apksigner' in config: apk_info = fdroidserver.update.scan_apk('v2.only.sig_2.apk') self.assertIsNone(apk_info.get('maxSdkVersion')) self.assertEqual(apk_info.get('versionName'), 'v2-only') From 7ec2a8ebb388321d0f5ea01bb682f6272f1a50ff Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 19 Mar 2021 15:44:43 +0100 Subject: [PATCH 0197/2116] add apksigner, jarsigner, and keytool to relevant status JSON --- fdroidserver/publish.py | 3 +++ fdroidserver/update.py | 3 +++ tests/publish.TestCase | 29 +++++++++++++++++++++++++++++ tests/update.TestCase | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+) diff --git a/fdroidserver/publish.py b/fdroidserver/publish.py index 41d70300..5e4ccbee 100644 --- a/fdroidserver/publish.py +++ b/fdroidserver/publish.py @@ -146,6 +146,9 @@ def status_update_json(generatedKeys, signedApks): logging.debug(_('Outputting JSON')) output = common.setup_status_output(start_timestamp) + output['apksigner'] = shutil.which(config.get('apksigner', '')) + output['jarsigner'] = shutil.which(config.get('jarsigner', '')) + output['keytool'] = shutil.which(config.get('keytool', '')) if generatedKeys: output['generatedKeys'] = generatedKeys if signedApks: diff --git a/fdroidserver/update.py b/fdroidserver/update.py index f34e8b0f..1cd94e47 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -144,6 +144,9 @@ def status_update_json(apps, apks): output['noPackages'] = [] output['needsUpdate'] = [] output['noUpdateCheck'] = [] + output['apksigner'] = shutil.which(config.get('apksigner', '')) + output['jarsigner'] = shutil.which(config.get('jarsigner', '')) + output['keytool'] = shutil.which(config.get('keytool', '')) for appid in apps: app = apps[appid] diff --git a/tests/publish.TestCase b/tests/publish.TestCase index d0d08376..f57dc955 100755 --- a/tests/publish.TestCase +++ b/tests/publish.TestCase @@ -11,6 +11,7 @@ # import inspect +import json import logging import optparse import os @@ -221,6 +222,34 @@ class PublishTest(unittest.TestCase): self.assertTrue(pk.is_decrypted()) self.assertEqual(jks.util.RSA_ENCRYPTION_OID, pk.algorithm_oid) + def test_status_update_json(self): + common.config = {} + publish.config = {} + with tempfile.TemporaryDirectory() as tmpdir: + os.chdir(tmpdir) + with mock.patch('sys.argv', ['fdroid publish', '']): + publish.status_update_json([], []) + with open('repo/status/publish.json') as fp: + data = json.load(fp) + self.assertTrue('apksigner' in data) + + publish.config = { + 'apksigner': 'apksigner', + } + publish.status_update_json([], []) + with open('repo/status/publish.json') as fp: + data = json.load(fp) + self.assertEqual(shutil.which(publish.config['apksigner']), data['apksigner']) + + publish.config = {} + common.fill_config_defaults(publish.config) + publish.status_update_json([], []) + with open('repo/status/publish.json') as fp: + data = json.load(fp) + self.assertEqual(publish.config.get('apksigner'), data['apksigner']) + self.assertEqual(publish.config['jarsigner'], data['jarsigner']) + self.assertEqual(publish.config['keytool'], data['keytool']) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) diff --git a/tests/update.TestCase b/tests/update.TestCase index e84609bf..fbdccc5e 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -6,6 +6,7 @@ import copy import git import glob import inspect +import json import logging import optparse import os @@ -23,6 +24,7 @@ from binascii import unhexlify from datetime import datetime from distutils.version import LooseVersion from testcommon import TmpCwd +from unittest import mock try: from yaml import CSafeLoader as SafeLoader @@ -63,6 +65,7 @@ DONATION_FIELDS = ( class Options: allow_disabled_algorithms = False clean = False + pretty = True rename_apks = False @@ -1374,6 +1377,35 @@ class UpdateTest(unittest.TestCase): fdroidserver.update._set_author_entry(app, key, f) self.assertIsNone(app.get(key)) + def test_status_update_json(self): + fdroidserver.common.config = {} + fdroidserver.update.config = {} + fdroidserver.update.options = Options + with tempfile.TemporaryDirectory() as tmpdir: + os.chdir(tmpdir) + with mock.patch('sys.argv', ['fdroid update', '']): + fdroidserver.update.status_update_json([], []) + with open('repo/status/update.json') as fp: + data = json.load(fp) + self.assertTrue('apksigner' in data) + + fdroidserver.update.config = { + 'apksigner': 'apksigner', + } + fdroidserver.update.status_update_json([], []) + with open('repo/status/update.json') as fp: + data = json.load(fp) + self.assertEqual(shutil.which(fdroidserver.update.config['apksigner']), data['apksigner']) + + fdroidserver.update.config = {} + fdroidserver.common.fill_config_defaults(fdroidserver.update.config) + fdroidserver.update.status_update_json([], []) + with open('repo/status/update.json') as fp: + data = json.load(fp) + self.assertEqual(fdroidserver.update.config.get('apksigner'), data['apksigner']) + self.assertEqual(fdroidserver.update.config['jarsigner'], data['jarsigner']) + self.assertEqual(fdroidserver.update.config['keytool'], data['keytool']) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 93ca13fa164b691c805ed675c7445164d6be7c28 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 22 Mar 2021 21:32:30 +0100 Subject: [PATCH 0198/2116] run-tests: remove broken test that never ran due to a syntax error --- .gitlab-ci.yml | 2 -- tests/run-tests | 14 -------------- 2 files changed, 16 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 10d08696..61cc21e3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,8 +9,6 @@ test: image: registry.gitlab.com/fdroid/ci-images-base script: - $pip install -e .[test] - # the `fdroid build` test in tests/run-tests needs android-23 - - echo y | $ANDROID_HOME/tools/bin/sdkmanager "platforms;android-23" > /dev/null - cd tests - ./complete-ci-tests diff --git a/tests/run-tests b/tests/run-tests index 16d0bdfd..ccf1bd40 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -219,20 +219,6 @@ $fdroid readmeta $fdroid update -#------------------------------------------------------------------------------# -echo_header 'run "fdroid build" in fresh git checkout from import.TestCase' - -cd $WORKSPACE/tests/tmp/importer -git remote update -p -git clean -fdx -# stick with known working commit, in case future commits break things for this code -git reset --hard fea54e1161d5eb9eb1a54e26253ef84d3ab63705 -if [ -d $ANDROID_HOME/platforms/android-23 && -d $ANDROID_HOME/build-tools/23.0.3 ]; then - $fdroid build --verbose org.fdroid.ci.test.app:300 -else - echo 'WARNING: Skipping "fdroid build" test since android-23 is missing!' -fi - #------------------------------------------------------------------------------# echo_header 'copy git import and run "fdroid scanner" on it' From 67e65ce2ea9e6831162f0bdcde7c902c620e2610 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 22 Mar 2021 23:06:16 +0100 Subject: [PATCH 0199/2116] purge complete-ci-tests, those are better covered in .gitlab-ci.yml --- .gitlab-ci.yml | 13 +++++-- MANIFEST.in | 1 - README.md | 3 +- tests/complete-ci-tests | 76 ----------------------------------------- 4 files changed, 11 insertions(+), 82 deletions(-) delete mode 100755 tests/complete-ci-tests diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 61cc21e3..5a40719f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,12 +5,19 @@ variables: GIT_DEPTH: 1 -test: +ci-images-base run-tests: image: registry.gitlab.com/fdroid/ci-images-base script: - $pip install -e .[test] - - cd tests - - ./complete-ci-tests + - ./tests/run-tests + # make sure that translations do not cause stacktraces + - cd $CI_PROJECT_DIR/locale + - for locale in *; do + test -d $locale || continue; + for cmd in `sed -n 's/.*("\(.*\)", *_.*/\1/p' $CI_PROJECT_DIR/fdroid`; do + LANGUAGE=$locale $CI_PROJECT_DIR/fdroid $cmd --help > /dev/null; + done + done # Test that the parsing of the .yml metadata format didn't change from last # released version. This uses the commit ID of the release tags, diff --git a/MANIFEST.in b/MANIFEST.in index 1a9469a6..7f478ba8 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -542,7 +542,6 @@ include tests/build-tools/generate.sh include tests/check-fdroid-apk include tests/checkupdates.TestCase include tests/common.TestCase -include tests/complete-ci-tests include tests/config.py include tests/corrupt-featureGraphic.png include tests/deploy.TestCase diff --git a/README.md b/README.md index e1d9b970..19b19a08 100644 --- a/README.md +++ b/README.md @@ -56,11 +56,10 @@ The test suite for all of the `fdroid` commands is in the _tests/_ subdir. _.gitlab-ci.yml_ and _.travis.yml_ run this test suite on various configurations. -* _tests/complete-ci-tests_ runs _pylint_ and all tests on two - different pyvenvs * _tests/run-tests_ runs the whole test suite * _tests/*.TestCase_ are individual unit tests for all of the `fdroid` commands, which can be run separately, e.g. `./update.TestCase`. +* run one test: `tests/common.TestCase CommonTest.test_get_apk_id` #### Additional tests for different linux distributions diff --git a/tests/complete-ci-tests b/tests/complete-ci-tests deleted file mode 100755 index 07e0b2a0..00000000 --- a/tests/complete-ci-tests +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/bash -# -# this is the script run by the Jenkins and gitlab-ci continuous integration -# build services. It is a thorough set of tests that runs all the tests using -# the various methods of installing/running fdroidserver. It is separate from -# ./tests/run-tests because its too heavy for manual use. - -if [ `dirname $0` != "." ]; then - echo "only run this script like ./`basename $0`" - exit 1 -fi - -set -e -set -x - -if [ -z $WORKSPACE ]; then - WORKSPACE=`cd $(dirname $0)/.. && pwd` - echo "Setting Workspace to $WORKSPACE" -fi - -if [ -z $ANDROID_HOME ]; then - if [ -e ~/.android/bashrc ]; then - . ~/.android/bashrc - else - echo "ANDROID_HOME must be set!" - exit 1 - fi -fi - -if ! which pyvenv; then - echo "pyvenv required to run this test suite!" - exit 1 -fi - -apksource=$1 - -#------------------------------------------------------------------------------# -# cache pypi downloads -if [ -z $PIP_DOWNLOAD_CACHE ]; then - export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache -fi - -#------------------------------------------------------------------------------# -# run local tests, don't scan fdroidserver/ project for APKs - -cd $WORKSPACE/tests -./run-tests $apksource - - -#------------------------------------------------------------------------------# -# make sure that translations do not cause stacktraces -cd $WORKSPACE/locale -for locale in *; do - if [ ! -d $locale ]; then - continue - fi - for cmd in `sed -n 's/.*("\(.*\)", *_.*/\1/p' $WORKSPACE/fdroid`; do - LANGUAGE=$locale $WORKSPACE/fdroid $cmd --help > /dev/null - done -done - - -#------------------------------------------------------------------------------# -# test install using install direct from git repo -cd $WORKSPACE -rm -rf $WORKSPACE/env -pyvenv $WORKSPACE/env -. $WORKSPACE/env/bin/activate -pip3 install --quiet -e $WORKSPACE[test] -python3 setup.py compile_catalog install - -# make sure translation files were installed -test -e $WORKSPACE/env/share/locale/de/LC_MESSAGES/fdroidserver.mo - -# run tests in new pip+pyvenv install -fdroid=$WORKSPACE/env/bin/fdroid $WORKSPACE/tests/run-tests $apksource From 6daf9197c223cc7b947b9bad9bee121356a19c2f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 23 Mar 2021 10:42:10 +0100 Subject: [PATCH 0200/2116] jenkins-test: remove checkupdates; jenkins admins need short jobs --- jenkins-test | 2 -- 1 file changed, 2 deletions(-) diff --git a/jenkins-test b/jenkins-test index 4ea8702b..fb8eb3b6 100755 --- a/jenkins-test +++ b/jenkins-test @@ -76,5 +76,3 @@ echo "repo_pubkey: 308204e1308202c9a003020102020434597643300d06092a864886f70d010 sed -i '/^repo_pubkey: /d' config.yml # when everything is copied over to run on SIGN machine ../fdroid signindex --verbose - -../fdroid checkupdates --auto --autoonly --commit From 4a8f3ebf55d078749d26bd542b25595d6331a72b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 23 Mar 2021 10:43:15 +0100 Subject: [PATCH 0201/2116] jenkins-build-all: force-limit `fdroid build` to 6 hours The jenkins admins have requested that the jobs have much shorter run times. Otherwise they will just force restart jenkins or reboot the box when updates come, without waiting for the jobs to finish. --- jenkins-build-all | 3 +++ 1 file changed, 3 insertions(+) diff --git a/jenkins-build-all b/jenkins-build-all index 6ae96767..cbac12c2 100755 --- a/jenkins-build-all +++ b/jenkins-build-all @@ -95,6 +95,9 @@ else sed -i '/^wiki_/d' config.yml fi +# force global timeout to 6 hours +sed -Ei 's,^(\s+endtime\s*=\s*time\.time\(\))\s*.*,\1 + 6 * 60 * 60 # 6 hours,' fdroidserver/build.py + $WORKSPACE/fdroid build --verbose --latest --no-tarball --all $wikiflag vagrant global-status From ee84eb762c76a5dad045a02366fd687b13e5aa1f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 18 Mar 2021 08:22:57 +0100 Subject: [PATCH 0202/2116] buildserver: SharedFoldersEnableSymlinksCreate: false --- buildserver/Vagrantfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/buildserver/Vagrantfile b/buildserver/Vagrantfile index 392d3df6..982c0267 100644 --- a/buildserver/Vagrantfile +++ b/buildserver/Vagrantfile @@ -48,7 +48,8 @@ Vagrant.configure("2") do |config| else synced_folder_type = '9p' end - config.vm.synced_folder './', '/vagrant', type: synced_folder_type + config.vm.synced_folder './', '/vagrant', type: synced_folder_type, + SharedFoldersEnableSymlinksCreate: false else abort("No supported VM Provider found, set vm_provider in Vagrantfile.yaml!") end From 8b393189c15a09d1691569afddb377417df534fc Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 18 Mar 2021 08:22:34 +0100 Subject: [PATCH 0203/2116] include /etc/issue.net in status JSON to identify the base system --- fdroidserver/common.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 79c77456..179ae8d5 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -767,6 +767,10 @@ def setup_status_output(start_timestamp): 'modifiedFiles': git_repo.git().ls_files(modified=True).split(), 'untrackedFiles': git_repo.untracked_files, } + etc_issue_net = '/etc/issue.net' + if os.path.exists(etc_issue_net): + with open(etc_issue_net) as fp: + output[etc_issue_net] = fp.read(100).strip() write_running_status_json(output) return output From 9135dfbeed0fb088048661f082138ef873b32940 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 12 Mar 2021 13:11:58 +0100 Subject: [PATCH 0204/2116] verify: include diffoscope setup info in output JSON --- fdroidserver/verify.py | 50 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/fdroidserver/verify.py b/fdroidserver/verify.py index 664d06d4..8cb74a32 100644 --- a/fdroidserver/verify.py +++ b/fdroidserver/verify.py @@ -40,7 +40,11 @@ class hashabledict(OrderedDict): return tuple((k, self[k]) for k in sorted(self)) def __hash__(self): - return hash(self.__key()) + try: + return hash(self.__key()) + except TypeError as e: + print(self.__key()) + raise e def __eq__(self, other): return self.__key() == other.__key() @@ -64,6 +68,49 @@ class Decoder(json.JSONDecoder): return set(values), end +def _add_diffoscope_info(d): + """Add diffoscope setup metadata to provided dict under 'diffoscope' key + + The imports are broken out at stages since various versions of + diffoscope support various parts of these. + + """ + try: + import diffoscope + d['diffoscope'] = hashabledict() + d['diffoscope']['VERSION'] = diffoscope.VERSION + + from diffoscope.comparators import ComparatorManager + ComparatorManager().reload() + + from diffoscope.tools import tool_check_installed, tool_required + external_tools = sorted(tool_required.all) + external_tools = [ + tool + for tool in external_tools + if not tool_check_installed(tool) + ] + d['diffoscope']['External-Tools-Required'] = tuple(external_tools) + + from diffoscope.tools import OS_NAMES, get_current_os + from diffoscope.external_tools import EXTERNAL_TOOLS + current_os = get_current_os() + os_list = [current_os] if (current_os in OS_NAMES) else iter(OS_NAMES) + for os_ in os_list: + tools = set() + for x in external_tools: + try: + tools.add(EXTERNAL_TOOLS[x][os_]) + except KeyError: + pass + d['diffoscope']['Available-in-{}-packages'.format(OS_NAMES[os_])] = tuple(sorted(tools)) + + from diffoscope.tools import python_module_missing + d['diffoscope']['Missing-Python-Modules'] = tuple(sorted(python_module_missing.modules)) + except ImportError: + pass + + def write_json_report(url, remote_apk, unsigned_apk, compare_result): """write out the results of the verify run to JSON @@ -81,6 +128,7 @@ def write_json_report(url, remote_apk, unsigned_apk, compare_result): else: data = OrderedDict() output = hashabledict() + _add_diffoscope_info(output) output['url'] = url for key, filename in (('local', unsigned_apk), ('remote', remote_apk)): d = hashabledict() From b69b95103efafdc8559ffc93def4e7422d5bc4db Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 18 Mar 2021 09:47:19 +0100 Subject: [PATCH 0205/2116] add complete tests for finding apksigner; fix minor detection bug find_apksigner() was preferring the oldest valid version rather than the newest. --- fdroidserver/common.py | 5 +- tests/common.TestCase | 105 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 98 insertions(+), 12 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 179ae8d5..00d91c36 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -285,7 +285,7 @@ def regsub_file(pattern, repl, path): f.write(text) -def read_config(opts): +def read_config(opts=None): """Read the repository config The config is read from config_file, which is in the current @@ -489,14 +489,15 @@ def find_apksigner(config): continue try: if LooseVersion(f) < LooseVersion(MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION): + logging.debug("Local Android SDK only has outdated apksigner versions") return except TypeError: continue if os.path.exists(os.path.join(build_tools_path, f, 'apksigner')): apksigner = os.path.join(build_tools_path, f, 'apksigner') logging.info("Using %s " % apksigner) - # memoize result config['apksigner'] = apksigner + return def find_sdk_tools_cmd(cmd): diff --git a/tests/common.TestCase b/tests/common.TestCase index 607de389..409dceda 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -51,6 +51,13 @@ class CommonTest(unittest.TestCase): os.makedirs(self.tmpdir) os.chdir(self.basedir) fdroidserver.common.config = None + self.path = os.environ['PATH'] + self.android_home = os.environ.get('ANDROID_HOME') + + def tearDown(self): + os.environ['PATH'] = self.path + if self.android_home: + os.environ['ANDROID_HOME'] = self.android_home def test_parse_human_readable_size(self): for k, v in ((9827, 9827), (123.456, 123), ('123b', 123), ('1.2', 1), @@ -366,7 +373,6 @@ class CommonTest(unittest.TestCase): self.assertEqual(p.output, 'stdout message\n') def test_signjar(self): - fdroidserver.common.config = None config = fdroidserver.common.read_config(fdroidserver.common.options) config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') fdroidserver.common.config = config @@ -383,9 +389,7 @@ class CommonTest(unittest.TestCase): self.assertNotEqual(open(sourcefile, 'rb').read(), open(testfile, 'rb').read()) def test_verify_apk_signature(self): - fdroidserver.common.config = None config = fdroidserver.common.read_config(fdroidserver.common.options) - config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') fdroidserver.common.config = config self.assertTrue(fdroidserver.common.verify_apk_signature('bad-unicode-πÇÇ现代通用字-български-عربي1.apk')) @@ -407,7 +411,6 @@ class CommonTest(unittest.TestCase): self.assertFalse(fdroidserver.common.verify_apk_signature('urzip-release-unsigned.apk')) def test_verify_old_apk_signature(self): - fdroidserver.common.config = None config = fdroidserver.common.read_config(fdroidserver.common.options) config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') fdroidserver.common.config = config @@ -425,9 +428,7 @@ class CommonTest(unittest.TestCase): self.assertFalse(fdroidserver.common.verify_old_apk_signature('urzip-release-unsigned.apk')) def test_verify_jar_signature_succeeds(self): - fdroidserver.common.config = None config = fdroidserver.common.read_config(fdroidserver.common.options) - config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') fdroidserver.common.config = config source_dir = os.path.join(self.basedir, 'signindex') for f in ('testy.jar', 'guardianproject.jar'): @@ -435,7 +436,6 @@ class CommonTest(unittest.TestCase): fdroidserver.common.verify_jar_signature(testfile) def test_verify_jar_signature_fails(self): - fdroidserver.common.config = None config = fdroidserver.common.read_config(fdroidserver.common.options) config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') fdroidserver.common.config = config @@ -445,9 +445,7 @@ class CommonTest(unittest.TestCase): fdroidserver.common.verify_jar_signature(testfile) def test_verify_apks(self): - fdroidserver.common.config = None config = fdroidserver.common.read_config(fdroidserver.common.options) - config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') fdroidserver.common.config = config sourceapk = os.path.join(self.basedir, 'urzip.apk') @@ -616,8 +614,95 @@ class CommonTest(unittest.TestCase): self.assertEqual(keytoolcertfingerprint, fdroidserver.common.apk_signer_fingerprint_short(apkfile)) + def test_find_apksigner_system_package_default_path(self): + """apksigner should be automatically used from the PATH""" + usr_bin_apksigner = '/usr/bin/apksigner' + if not os.path.isfile(usr_bin_apksigner): + self.skipTest('SKIPPING since %s is not installed!' % usr_bin_apksigner) + os.environ['PATH'] = '/usr/local/bin:/usr/bin:/bin' + config = {} + fdroidserver.common.find_apksigner(config) + self.assertEqual(usr_bin_apksigner, config.get('apksigner')) + + def test_find_apksigner_config_overrides(self): + """apksigner should come from config before any auto-detection""" + testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + os.chdir(testdir) + android_home = os.path.join(testdir, 'ANDROID_HOME') + do_not_use = os.path.join(android_home, 'build-tools', '30.0.3', 'apksigner') + os.makedirs(os.path.dirname(do_not_use)) + with open(do_not_use, 'w') as fp: + fp.write('#!/bin/sh\ndate\n') + os.chmod(do_not_use, 0o0755) + apksigner = os.path.join(testdir, 'apksigner') + config = {'apksigner': apksigner} + os.environ['ANDROID_HOME'] = android_home + os.environ['PATH'] = '%s:/usr/local/bin:/usr/bin:/bin' % android_home + fdroidserver.common.find_apksigner(config) + self.assertEqual(apksigner, config.get('apksigner')) + + def test_find_apksigner_prefer_path(self): + """apksigner should come from PATH before ANDROID_HOME""" + testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + os.chdir(testdir) + + apksigner = os.path.join(testdir, 'apksigner') + with open(apksigner, 'w') as fp: + fp.write('#!/bin/sh\ndate\n') + os.chmod(apksigner, 0o0755) + + android_home = os.path.join(testdir, 'ANDROID_HOME') + do_not_use = os.path.join(android_home, 'build-tools', '30.0.3', 'apksigner') + os.makedirs(os.path.dirname(do_not_use)) + with open(do_not_use, 'w') as fp: + fp.write('#!/bin/sh\ndate\n') + os.chmod(do_not_use, 0o0755) + + config = {'sdk_path': android_home} + os.environ['ANDROID_HOME'] = android_home + os.environ['PATH'] = '%s:/usr/local/bin:/usr/bin:/bin' % os.path.dirname(apksigner) + fdroidserver.common.find_apksigner(config) + self.assertEqual(apksigner, config.get('apksigner')) + + def test_find_apksigner_prefer_newest(self): + """apksigner should be the newest available in ANDROID_HOME""" + testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + os.chdir(testdir) + android_home = os.path.join(testdir, 'ANDROID_HOME') + + apksigner = os.path.join(android_home, 'build-tools', '30.0.3', 'apksigner') + os.makedirs(os.path.dirname(apksigner)) + with open(apksigner, 'w') as fp: + fp.write('#!/bin/sh\necho 30.0.3\n') + os.chmod(apksigner, 0o0755) + + do_not_use = os.path.join(android_home, 'build-tools', '29.0.3', 'apksigner') + os.makedirs(os.path.dirname(do_not_use)) + with open(do_not_use, 'w') as fp: + fp.write('#!/bin/sh\necho 29.0.3\n') + os.chmod(do_not_use, 0o0755) + + config = {'sdk_path': android_home} + os.environ['PATH'] = '/fake/path/to/avoid/conflicts' + fdroidserver.common.find_apksigner(config) + self.assertEqual(apksigner, config.get('apksigner')) + + def test_find_apksigner_system_package_android_home(self): + testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + os.chdir(testdir) + android_home = os.getenv('ANDROID_HOME') + if not android_home or not os.path.isdir(android_home): + self.skipTest('SKIPPING since ANDROID_HOME (%s) is not a dir!' % android_home) + fdroidserver.common.config = {'sdk_path': android_home} + os.environ['PATH'] = '/fake/path/to/avoid/conflicts' + config = fdroidserver.common.read_config() + fdroidserver.common.find_apksigner(config) + self.assertEqual( + os.path.join(android_home, 'build-tools'), + os.path.dirname(os.path.dirname(config.get('apksigner'))), + ) + def test_sign_apk(self): - fdroidserver.common.config = None config = fdroidserver.common.read_config(fdroidserver.common.options) if 'apksigner' not in config: self.skipTest('SKIPPING test_sign_apk, apksigner not installed!') From f811d44f0632825de046e017dc2e79bc15671d4a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 23 Mar 2021 11:58:58 +0100 Subject: [PATCH 0206/2116] jenkins-build-all: use $WORKSPACE var to find correct file to modify --- jenkins-build-all | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jenkins-build-all b/jenkins-build-all index cbac12c2..9e9c76e5 100755 --- a/jenkins-build-all +++ b/jenkins-build-all @@ -96,7 +96,8 @@ else fi # force global timeout to 6 hours -sed -Ei 's,^(\s+endtime\s*=\s*time\.time\(\))\s*.*,\1 + 6 * 60 * 60 # 6 hours,' fdroidserver/build.py +sed -Ei 's,^(\s+endtime\s*=\s*time\.time\(\))\s*.*,\1 + 6 * 60 * 60 # 6 hours,' \ + $WORKSPACE/fdroidserver/build.py $WORKSPACE/fdroid build --verbose --latest --no-tarball --all $wikiflag From b5485ded645f7e4c945993b02ccbdf0ea3077e5f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 23 Mar 2021 23:09:51 +0100 Subject: [PATCH 0207/2116] skip test_find_apksigner_system_package_android_home if no apksigner --- tests/common.TestCase | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/common.TestCase b/tests/common.TestCase index 409dceda..37d2d7ad 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -693,6 +693,8 @@ class CommonTest(unittest.TestCase): android_home = os.getenv('ANDROID_HOME') if not android_home or not os.path.isdir(android_home): self.skipTest('SKIPPING since ANDROID_HOME (%s) is not a dir!' % android_home) + if not glob.glob(os.path.join(android_home, 'build-tools', '*', 'apksigner')): + self.skipTest('SKIPPING since ANDROID_HOME (%s) build-tools has no apksigner!' % android_home) fdroidserver.common.config = {'sdk_path': android_home} os.environ['PATH'] = '/fake/path/to/avoid/conflicts' config = fdroidserver.common.read_config() From 20c299358d500c8e255a7dc5d378844e976f8d3c Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 24 Mar 2021 11:20:00 +0100 Subject: [PATCH 0208/2116] gitlab-ci: modernize ubuntu_lts_ppa job using updates to PPA The PPA now provides apksigner that does not need binfmt, and defusedxml is a hard Depends:. --- .gitlab-ci.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5a40719f..ebd4cff1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -89,8 +89,6 @@ debian_testing: - ./run-tests # Test using latest LTS set up with the PPA, including Recommends. -# focal's apksigner, which comes from Recommends:, requires binfmt -# support in the kernel. ubuntu_lts_ppa: image: ubuntu:latest <<: *apt-template @@ -104,10 +102,7 @@ ubuntu_lts_ppa: - echo "deb http://ppa.launchpad.net/fdroid/fdroidserver/ubuntu $RELEASE main" >> /etc/apt/sources.list - apt-get update - apt-get dist-upgrade - - mount | grep binfmt_misc || mount -t binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc - - apt-get install --install-recommends binfmt-support fdroidserver git python3-defusedxml python3-setuptools - - ls -l /proc/sys/fs/binfmt_misc || true - - test -e /proc/sys/fs/binfmt_misc/jarwrapper || apt -qy purge apksigner + - apt-get install --install-recommends fdroidserver git python3-setuptools - cd tests - ./run-tests From c70cc33d1dd7b9aa91a2aacdd1df4ea67110594b Mon Sep 17 00:00:00 2001 From: proletarius101 Date: Fri, 26 Mar 2021 22:49:37 +0800 Subject: [PATCH 0209/2116] Fix common.config is None in fetchlibs --- examples/fdroid_fetchsrclibs.py | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/fdroid_fetchsrclibs.py b/examples/fdroid_fetchsrclibs.py index bff07eea..b1bb784b 100644 --- a/examples/fdroid_fetchsrclibs.py +++ b/examples/fdroid_fetchsrclibs.py @@ -23,6 +23,7 @@ def main(): pkgs = common.read_pkg_args(options.appid, True) allapps = metadata.read_metadata(pkgs) apps = common.read_app_args(options.appid, allapps, True) + common.read_config(options) srclib_dir = os.path.join('build', 'srclib') os.makedirs(srclib_dir, exist_ok=True) srclibpaths = [] From 8f0712e89b7a82cd8e5a59504b8e4516c4cc3f93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit+git@posteo.de> Date: Fri, 12 Mar 2021 08:49:40 +0100 Subject: [PATCH 0210/2116] Add a mypy run to the pipeline --- .gitlab-ci.yml | 7 +++++++ fdroidserver/common.py | 8 ++++---- fdroidserver/scanner.py | 2 +- mypy.ini | 15 +++++++++++++++ 4 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 mypy.ini diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ebd4cff1..48a82833 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -188,6 +188,13 @@ lint_format_safety_bandit_checks: - pybabel compile --domain=fdroidserver --directory locale 2>&1 | (grep -F "error:" && exit 1) || true - exit $EXITVALUE +lint_mypy: + image: python:3.9-buster + script: + - pip install mypy + - pip install -e .[test] + - mypy + fedora_latest: image: fedora:latest only: diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 00d91c36..1eecbbdc 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -148,11 +148,11 @@ default_config = { 'repo_url': "https://MyFirstFDroidRepo.org/fdroid/repo", 'repo_name': "My First F-Droid Repo Demo", 'repo_icon': "icon.png", - 'repo_description': _("""This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid."""), + 'repo_description': _("""This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid."""), # type: ignore 'archive_name': 'My First F-Droid Archive Demo', - 'archive_description': _('These are the apps that have been archived from the main repo.'), + 'archive_description': _('These are the apps that have been archived from the main repo.'), # type: ignore 'archive_older': 0, - 'lint_licenses': fdroidserver.lint.APPROVED_LICENSES, + 'lint_licenses': fdroidserver.lint.APPROVED_LICENSES, # type: ignore 'git_mirror_size_limit': 10000000000, } @@ -2389,7 +2389,7 @@ def use_androguard(): return False -use_androguard.show_path = True +use_androguard.show_path = True # type: ignore def _get_androguard_APK(apkfile): diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 436abf1e..24438340 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -34,7 +34,7 @@ from .exception import BuildException, VCSException config = None options = None -DEFAULT_JSON_PER_BUILD = {'errors': [], 'warnings': [], 'infos': []} +DEFAULT_JSON_PER_BUILD = {'errors': [], 'warnings': [], 'infos': []} # type: ignore json_per_build = DEFAULT_JSON_PER_BUILD MAVEN_URL_REGEX = re.compile(r"""\smaven\s*{.*?(?:setUrl|url)\s*=?\s*(?:uri)?\(?\s*["']?([^\s"']+)["']?[^}]*}""", diff --git a/mypy.ini b/mypy.ini new file mode 100644 index 00000000..0e5df9cf --- /dev/null +++ b/mypy.ini @@ -0,0 +1,15 @@ +[mypy] +files = fdroidserver + +# this is de-facto the linter setting for this file +warn_unused_configs = True + +# TODO: we should either upgrade the used packages to a version which includes type hints OR install/write stub packages for these libraries. +# Further details here: https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-type-hints-for-third-party-library +ignore_missing_imports = True + +# ignore the [no-redef] errors, as they collide with the bandit "# nosec" exclusion (common.py) +# unfortunately both tools expect their ignore flag as a comment in the same line +# [misc] is ignored for the "incompatible import" +# [arg-type] is ignored because when there are missing envs, everything will crash, not just the types +disable_error_code = no-redef, misc, arg-type \ No newline at end of file From cf1fa84c77d5e1e3fced6c48c237f8ecf6be77cb Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 6 Apr 2021 10:22:29 +0200 Subject: [PATCH 0211/2116] gitlab-ci: rm HTML index gen test from job, fails on stretch ```console Downloading https://files.pythonhosted.org/packages/61/cf/0d6598b1ceb463a46b75a716fbb23d2d5ccc5738aba8ddceeec3fa59997f/slimit-0.8.1.zip (88kB) Collecting tinycss2>=0.4 (from html5print->fdroidserver==2.1a0.dev0) Downloading https://files.pythonhosted.org/packages/65/f7/63bf697a7c7257d304269b49f1be3dfe429856889e93963d6f5790d77d82/tinycss2-1.1.0-py3-none-any.whl tinycss2 requires Python '>=3.6' but the running Python is 3.5.3 ``` --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 48a82833..848741a8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -8,7 +8,7 @@ variables: ci-images-base run-tests: image: registry.gitlab.com/fdroid/ci-images-base script: - - $pip install -e .[test] + - $pip install -e . - ./tests/run-tests # make sure that translations do not cause stacktraces - cd $CI_PROJECT_DIR/locale From 9f60516fcbc2f8b7d9b9677fa93763454122837f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 6 Apr 2021 10:40:12 +0200 Subject: [PATCH 0212/2116] gitlab-ci: fix broken download link for fdroiddata tarball fdroiddata!8730 fdroiddata!8732 rfp@f49178ea0aed808607f8d6d753285b101e53f0be --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 848741a8..3310b410 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -341,7 +341,8 @@ plugin_fetchsrclibs: - fdroid | grep fetchsrclibs - mkdir fdroiddata - - curl https://gitlab.com/fdroid/fdroiddata/repository/b9e9a077d720c86ff6fff4dbb341254cc4370b1a/archive.tar.gz + - commitid=b9e9a077d720c86ff6fff4dbb341254cc4370b1a + - curl https://gitlab.com/fdroid/fdroiddata/-/archive/${commitid}/fdroiddata-${commitid}.tar.gz | tar -xz --directory=fdroiddata --strip-components=1 - cd fdroiddata - fdroid fetchsrclibs freemap.opentrail:9 --verbose From 49a593ac5f0db68d05b1fd192594514deb97c368 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 5 Apr 2021 16:24:16 +0200 Subject: [PATCH 0213/2116] Excluded disabled metadata in failedBuilds --- fdroidserver/update.py | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 1cd94e47..8b372a74 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -166,23 +166,24 @@ def status_update_json(apps, apks): gotcurrentver = True apklist.append(apk) validapks = 0 - for build in app.get('Builds', []): - if not build.get('disable'): - builtit = False - for apk in apklist: - if apk['versionCode'] == int(build.versionCode): - builtit = True - validapks += 1 - break - if not builtit: - failedBuilds = output['failedBuilds'] - if appid not in failedBuilds: - failedBuilds[appid] = [] - failedBuilds[appid].append(build.versionCode) - if validapks == 0: - output['noPackages'].append(appid) if app.get('Disabled'): output['disabled'].append(appid) + else: + for build in app.get('Builds', []): + if not build.get('disable'): + builtit = False + for apk in apklist: + if apk['versionCode'] == int(build.versionCode): + builtit = True + validapks += 1 + break + if not builtit: + failedBuilds = output['failedBuilds'] + if appid not in failedBuilds: + failedBuilds[appid] = [] + failedBuilds[appid].append(build.versionCode) + if validapks == 0: + output['noPackages'].append(appid) if not gotcurrentver: output['needsUpdate'].append(appid) if app.get('UpdateCheckMode') == 'None' and not app.get('Disabled'): From df3b6ea65cf0ec1183ec20440d8bd9da2d260371 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 2 Apr 2021 16:53:03 +0200 Subject: [PATCH 0214/2116] Create log file for VCSException In case there is a VCS error (git tag not found), create a log file in the F-Droid repo so it is shown on the monitor (currently 404). --- fdroidserver/build.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 75d88944..d1b347d6 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -1181,6 +1181,7 @@ def main(): common.force_exit(1) add_failed_builds_entry(failed_builds, appid, build, vcse) wikilog = str(vcse) + common.deploy_build_log_with_rsync(appid, build.versionCode, str(vcse)) except FDroidException as e: with open(os.path.join(log_dir, appid + '.log'), 'a+') as f: f.write('\n\n============================================================\n') From 6d9410597ba2ca1791f0f81d1902fabd866db04b Mon Sep 17 00:00:00 2001 From: relan Date: Wed, 7 Apr 2021 12:09:11 +0300 Subject: [PATCH 0215/2116] Upgrade NDK r22 to r22b --- buildserver/config.buildserver.yml | 2 +- buildserver/provision-android-ndk | 2 +- examples/config.yml | 2 +- makebuildserver | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/buildserver/config.buildserver.yml b/buildserver/config.buildserver.yml index 0f05888d..cc139f96 100644 --- a/buildserver/config.buildserver.yml +++ b/buildserver/config.buildserver.yml @@ -12,7 +12,7 @@ ndk_paths: r19c: /home/vagrant/android-ndk/r19c r20b: /home/vagrant/android-ndk/r20b r21e: /home/vagrant/android-ndk/r21e - r22: /home/vagrant/android-ndk/r22 + r22b: /home/vagrant/android-ndk/r22b java_paths: 8: /usr/lib/jvm/java-8-openjdk-amd64 diff --git a/buildserver/provision-android-ndk b/buildserver/provision-android-ndk index d57a8692..754dd797 100644 --- a/buildserver/provision-android-ndk +++ b/buildserver/provision-android-ndk @@ -15,7 +15,7 @@ if [ ! -e $NDK_BASE/r10e ]; then mv android-ndk-r10e r10e fi -for version in r11c r12b r13b r14b r15c r16b r17c r18b r19c r20b r21e r22; do +for version in r11c r12b r13b r14b r15c r16b r17c r18b r19c r20b r21e r22b; do if [ ! -e ${NDK_BASE}/${version} ]; then unzip /vagrant/cache/android-ndk-${version}-linux-x86_64.zip > /dev/null mv android-ndk-${version} ${version} diff --git a/examples/config.yml b/examples/config.yml index 74447a54..36a66c22 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -22,7 +22,7 @@ # r19c: None # r20b: None # r21e: None -# r22: None +# r22b: None # Directory to store downloaded tools in (i.e. gradle versions) # By default, these are stored in ~/.cache/fdroidserver diff --git a/makebuildserver b/makebuildserver index 7147fb1e..dbbbd56e 100755 --- a/makebuildserver +++ b/makebuildserver @@ -309,8 +309,8 @@ CACHE_FILES = [ '8381c440fe61fcbb01e209211ac01b519cd6adf51ab1c2281d5daad6ca4c8c8c'), ('https://dl.google.com/android/repository/android-ndk-r21e-linux-x86_64.zip', 'ad7ce5467e18d40050dc51b8e7affc3e635c85bd8c59be62de32352328ed467e'), - ('https://dl.google.com/android/repository/android-ndk-r22-linux-x86_64.zip', - 'd37fc69cd81e5660234a686e20adef39bc0244086e4d66525a40af771c020718'), + ('https://dl.google.com/android/repository/android-ndk-r22b-linux-x86_64.zip', + 'ac3a0421e76f71dd330d0cd55f9d99b9ac864c4c034fc67e0d671d022d4e806b'), ] From 24dd6740e11c566cd9fec364fd4c8380982d2804 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Tue, 23 Feb 2021 21:42:41 +0100 Subject: [PATCH 0216/2116] Use tag if known This ensures that we actually use the tag someone created when a new tag is detected. --- fdroidserver/checkupdates.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index f5d0d450..aa8f6ff8 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -518,9 +518,13 @@ def checkupdates_app(app): newbuild.versionCode = app.CurrentVersionCode newbuild.versionName = app.CurrentVersion + suffix.replace('%c', newbuild.versionCode) logging.info("...auto-generating build for " + newbuild.versionName) - commit = pattern.replace('%v', app.CurrentVersion) - commit = commit.replace('%c', newbuild.versionCode) - newbuild.commit = commit + if tag: + newbuild.commit = tag + else: + commit = pattern.replace('%v', app.CurrentVersion) + commit = commit.replace('%c', newbuild.versionCode) + newbuild.commit = commit + app['Builds'].append(newbuild) name = _getappname(app) ver = _getcvname(app) From 3e557a1a8a94455c686b4c528fd952b3a3b36f32 Mon Sep 17 00:00:00 2001 From: "Felix C. Stegerman" Date: Sat, 3 Apr 2021 01:34:38 +0200 Subject: [PATCH 0217/2116] check for invalid appids passed to commands --- fdroidserver/common.py | 26 ++++++++++++++++++++++++-- fdroidserver/install.py | 1 + fdroidserver/metadata.py | 12 +----------- fdroidserver/publish.py | 1 + fdroidserver/verify.py | 9 +++++++++ 5 files changed, 36 insertions(+), 13 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 1eecbbdc..f9ec11aa 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -618,13 +618,35 @@ def read_pkg_args(appid_versionCode_pairs, allow_vercodes=False): return vercodes +def get_metadata_files(vercodes): + """ + Build a list of metadata files and raise an exception for invalid appids. + + :param vercodes: version codes as returned by read_pkg_args() + :returns: a list of corresponding metadata/*.yml files + """ + found_invalid = False + metadatafiles = [] + for appid in vercodes.keys(): + f = os.path.join('metadata', '%s.yml' % appid) + if os.path.exists(f): + metadatafiles.append(f) + else: + found_invalid = True + logging.critical(_("No such package: %s") % appid) + if found_invalid: + raise FDroidException(_("Found invalid appids in arguments")) + return metadatafiles + + def read_app_args(appid_versionCode_pairs, allapps, allow_vercodes=False): """Build a list of App instances for processing On top of what read_pkg_args does, this returns the whole app metadata, but limiting the builds list to the builds matching the - appid_versionCode_pairs and vercodes specified. If no appid_versionCode_pairs are specified, then - all App and Build instances are returned. + appid_versionCode_pairs and vercodes specified. If no + appid_versionCode_pairs are specified, then all App and Build instances are + returned. """ diff --git a/fdroidserver/install.py b/fdroidserver/install.py index 8bc5a5d8..0f933121 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -68,6 +68,7 @@ def main(): if options.appid: vercodes = common.read_pkg_args(options.appid, True) + common.get_metadata_files(vercodes) # only check appids apks = {appid: None for appid in vercodes} # Get the signed APK with the highest vercode diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 5dde19e6..d5911a8d 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -566,17 +566,7 @@ def read_metadata(appids={}, sort_by_time=False): if appids: vercodes = fdroidserver.common.read_pkg_args(appids) - found_invalid = False - metadatafiles = [] - for appid in vercodes.keys(): - f = os.path.join('metadata', '%s.yml' % appid) - if os.path.exists(f): - metadatafiles.append(f) - else: - found_invalid = True - logging.critical(_("No such package: %s") % appid) - if found_invalid: - raise FDroidException(_("Found invalid appids in arguments")) + metadatafiles = fdroidserver.common.get_metadata_files(vercodes) else: metadatafiles = (glob.glob(os.path.join('metadata', '*.yml')) + glob.glob('.fdroid.yml')) diff --git a/fdroidserver/publish.py b/fdroidserver/publish.py index 5e4ccbee..71b5729d 100644 --- a/fdroidserver/publish.py +++ b/fdroidserver/publish.py @@ -268,6 +268,7 @@ def main(): allapps = metadata.read_metadata() vercodes = common.read_pkg_args(options.appid, True) + common.get_metadata_files(vercodes) # only check appids signed_apks = dict() generated_keys = dict() allaliases = check_for_key_collisions(allapps) diff --git a/fdroidserver/verify.py b/fdroidserver/verify.py index 8cb74a32..ed166d3a 100644 --- a/fdroidserver/verify.py +++ b/fdroidserver/verify.py @@ -188,6 +188,7 @@ def main(): logging.error(_("No unsigned directory - nothing to do")) sys.exit(0) + processed = set() verified = 0 notverified = 0 @@ -204,6 +205,8 @@ def main(): if vercodes[appid] and vercode not in vercodes[appid]: continue + processed.add(appid) + try: logging.info("Processing {apkfilename}".format(apkfilename=apkfilename)) @@ -236,6 +239,12 @@ def main(): logging.info("...NOT verified - {0}".format(e)) notverified += 1 + for appid in options.appid: + package = appid.split(":")[0] + if package not in processed: + logging.critical(_("No APK for package: %s") % package) + notverified += 1 + if verified > 0: logging.info("{0} successfully verified".format(verified)) if notverified > 0: From 0a4995cd3b45d383525b52005248eb33e7081570 Mon Sep 17 00:00:00 2001 From: "Felix C. Stegerman" Date: Sat, 10 Apr 2021 07:18:28 +0000 Subject: [PATCH 0218/2116] read_pkg_args(): allow appid_vercode.apk in addition to appid:vercode --- fdroidserver/common.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index f9ec11aa..45109513 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -599,7 +599,9 @@ def read_pkg_args(appid_versionCode_pairs, allow_vercodes=False): if not appid_versionCode_pairs: return vercodes + apk_regex = re.compile(r'_(\d+)\.apk$') for p in appid_versionCode_pairs: + p = apk_regex.sub(r':\1', p) if allow_vercodes and ':' in p: package, vercode = p.split(':') try: From cff575f4029d951c0703cdd4bf24d63dacd8fcca Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 12 Apr 2021 09:11:58 +0200 Subject: [PATCH 0219/2116] common: add test case for read_pkg_args() --- tests/common.TestCase | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/tests/common.TestCase b/tests/common.TestCase index 37d2d7ad..e6316b7e 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1712,6 +1712,48 @@ class CommonTest(unittest.TestCase): ) self.assertSequenceEqual(expected, sorted(components)) + def test_read_pkg_args(self): + allow_vercodes = False + self.assertEqual( + {'org.fdroid.fdroid': []}, + fdroidserver.common.read_pkg_args(['org.fdroid.fdroid'], allow_vercodes) + ) + self.assertNotEqual( + {'com.example': ['123456']}, + fdroidserver.common.read_pkg_args(['com.example:123456'], allow_vercodes) + ) + + allow_vercodes = True + self.assertEqual( + {'org.fdroid.fdroid': []}, + fdroidserver.common.read_pkg_args(['org.fdroid.fdroid'], allow_vercodes) + ) + self.assertEqual( + {'com.example': ['123456']}, + fdroidserver.common.read_pkg_args(['com.example:123456'], allow_vercodes) + ) + self.assertEqual( + {'org.debian_kit': ['6']}, + fdroidserver.common.read_pkg_args(['org.debian_kit_6.apk'], allow_vercodes) + ) + appid_versionCode_pairs = ( + 'org.fdroid.fdroid:1', + 'com.example:12345', + 'com.example:67890', + ) + self.assertEqual( + {'com.example': ['12345', '67890'], 'org.fdroid.fdroid': ['1']}, + fdroidserver.common.read_pkg_args(appid_versionCode_pairs, allow_vercodes) + ) + appid_versionCode_pairs = ( + 'com.example:67890', + 'org.c_base.c_beam_29.apk', + ) + self.assertEqual( + {'com.example': ['67890'], 'org.c_base.c_beam': ['29']}, + fdroidserver.common.read_pkg_args(appid_versionCode_pairs, allow_vercodes) + ) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 0298eef46fd660aef8811708aaaacd558d60158a Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Mon, 12 Apr 2021 07:15:28 +0000 Subject: [PATCH 0220/2116] gradle v7.0 --- gradlew-fdroid | 3 ++- makebuildserver | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 2ac3b678..c1e9c1a7 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -162,6 +162,7 @@ get_sha() { '6.8.1') echo 'fd591a34af7385730970399f473afabdb8b28d57fd97d6625c388d090039d6fd' ;; '6.8.2') echo '8de6efc274ab52332a9c820366dd5cf5fc9d35ec7078fd70c8ec6913431ee610' ;; '6.8.3') echo '7faa7198769f872826c8ef4f1450f839ec27f0b4d5d1e51bade63667cbccd205' ;; + '7.0') echo 'eb8b89184261025b0430f5b2233701ff1377f96da1ef5e278af6ae8bac5cc305' ;; *) exit 1 esac } @@ -182,7 +183,7 @@ d_plugin_k=(4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 d_plugin_v=(6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(7.0 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} diff --git a/makebuildserver b/makebuildserver index dbbbd56e..0d6fc252 100755 --- a/makebuildserver +++ b/makebuildserver @@ -285,6 +285,8 @@ CACHE_FILES = [ '8de6efc274ab52332a9c820366dd5cf5fc9d35ec7078fd70c8ec6913431ee610'), ('https://services.gradle.org/distributions/gradle-6.8.3-bin.zip', '7faa7198769f872826c8ef4f1450f839ec27f0b4d5d1e51bade63667cbccd205'), + ('https://services.gradle.org/distributions/gradle-7.0-bin.zip', + 'eb8b89184261025b0430f5b2233701ff1377f96da1ef5e278af6ae8bac5cc305'), ('https://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin', '102d6723f67ff1384330d12c45854315d6452d6510286f4e5891e00a5a8f1d5a'), ('https://dl.google.com/android/repository/android-ndk-r11c-linux-x86_64.zip', From e6c186c5662e57b6a00ba4ca2019654117e88098 Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Mon, 12 Apr 2021 22:11:07 +0200 Subject: [PATCH 0221/2116] fetchsrclibs: disable preparation --- examples/fdroid_fetchsrclibs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/fdroid_fetchsrclibs.py b/examples/fdroid_fetchsrclibs.py index b1bb784b..76e8bc8e 100644 --- a/examples/fdroid_fetchsrclibs.py +++ b/examples/fdroid_fetchsrclibs.py @@ -32,7 +32,7 @@ def main(): vcs.gotorevision('HEAD', refresh=False) for build in app.get('Builds', []): for lib in build.srclibs: - srclibpaths.append(common.getsrclib(lib, srclib_dir, build=build)) + srclibpaths.append(common.getsrclib(lib, srclib_dir, prepare=False, build=build)) print('Set up srclibs:') pprint.pprint(srclibpaths) From 67a0f3ae5b3702c460421faebd7f5f53e03bc18f Mon Sep 17 00:00:00 2001 From: "Felix C. Stegerman" Date: Mon, 12 Apr 2021 19:30:45 +0200 Subject: [PATCH 0222/2116] use subclass hack for better ZIP cloning See https://bugs.python.org/issue43547 for more info on the details. thanks to @obfusk for the technique --- fdroidserver/common.py | 26 ++++++++++++++++++++++++-- tests/common.TestCase | 7 +++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 45109513..926d407c 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3,6 +3,7 @@ # common.py - part of the FDroid server tools # Copyright (C) 2010-13, Ciaran Gultnieks, ciaran@ciarang.com # Copyright (C) 2013-2014 Daniel Martí +# Copyright (C) 2021 Felix C. Stegerman # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by @@ -3007,6 +3008,27 @@ def metadata_find_developer_signing_files(appid, vercode): return None +class ClonedZipInfo(zipfile.ZipInfo): + """Hack to allow fully cloning ZipInfo instances + + The zipfile library has some bugs that prevent it from fully + cloning ZipInfo entries. https://bugs.python.org/issue43547 + + """ + def __init__(self, zinfo): + self.original = zinfo + for k in self.__slots__: + try: + setattr(self, k, getattr(zinfo, k)) + except AttributeError: + pass + + def __getattribute__(self, name): + if name in ("date_time", "external_attr", "flag_bits"): + return getattr(self.original, name) + return object.__getattribute__(self, name) + + def apk_strip_v1_signatures(signed_apk, strip_manifest=False): """Removes signatures from APK. @@ -3024,10 +3046,10 @@ def apk_strip_v1_signatures(signed_apk, strip_manifest=False): if strip_manifest: if info.filename != 'META-INF/MANIFEST.MF': buf = in_apk.read(info.filename) - out_apk.writestr(info, buf) + out_apk.writestr(ClonedZipInfo(info), buf) else: buf = in_apk.read(info.filename) - out_apk.writestr(info, buf) + out_apk.writestr(ClonedZipInfo(info), buf) def _zipalign(unsigned_apk, aligned_apk): diff --git a/tests/common.TestCase b/tests/common.TestCase index e6316b7e..07e3d95e 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1754,6 +1754,13 @@ class CommonTest(unittest.TestCase): fdroidserver.common.read_pkg_args(appid_versionCode_pairs, allow_vercodes) ) + def test_apk_strip_v1_signatures(self): + testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + before = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') + after = os.path.join(testdir, 'after.apk') + shutil.copy(before, after) + fdroidserver.common.apk_strip_v1_signatures(after, strip_manifest=False) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 202fd8b25afc9dfeffd2c144c0acb52d1eae0408 Mon Sep 17 00:00:00 2001 From: "Felix C. Stegerman" Date: Wed, 14 Apr 2021 21:06:20 +0200 Subject: [PATCH 0223/2116] vendor & use apksigcopier v0.4.0-12-g93d8e14 --- fdroidserver/apksigcopier.py | 597 +++++++++++++++++++++++++++++++++++ fdroidserver/common.py | 125 ++++---- fdroidserver/publish.py | 8 +- tests/common.TestCase | 2 +- 4 files changed, 655 insertions(+), 77 deletions(-) create mode 100644 fdroidserver/apksigcopier.py diff --git a/fdroidserver/apksigcopier.py b/fdroidserver/apksigcopier.py new file mode 100644 index 00000000..74e7e7df --- /dev/null +++ b/fdroidserver/apksigcopier.py @@ -0,0 +1,597 @@ +#!/usr/bin/python3 +# encoding: utf-8 + +# -- ; {{{1 +# +# File : apksigcopier +# Maintainer : Felix C. Stegerman +# Date : 2021-04-14 +# +# Copyright : Copyright (C) 2021 Felix C. Stegerman +# Version : v0.4.0 +# License : GPLv3+ +# +# -- ; }}}1 + +""" +copy/extract/patch apk signatures + +apksigcopier is a tool for copying APK signatures from a signed APK to an +unsigned one (in order to verify reproducible builds). + + +CLI +=== + +$ apksigcopier extract [OPTIONS] SIGNED_APK OUTPUT_DIR +$ apksigcopier patch [OPTIONS] METADATA_DIR UNSIGNED_APK OUTPUT_APK +$ apksigcopier copy [OPTIONS] SIGNED_APK UNSIGNED_APK OUTPUT_APK + +The following environment variables can be set to 1, yes, or true to +overide the default behaviour: + +* set APKSIGCOPIER_EXCLUDE_ALL_META=1 to exclude all metadata files +* set APKSIGCOPIER_COPY_EXTRA_BYTES=1 to copy extra bytes after data (e.g. a v2 sig) + + +API +=== + +>> from apksigcopier import do_extract, do_patch, do_copy +>> do_extract(signed_apk, output_dir, v1_only=NO) +>> do_patch(metadata_dir, unsigned_apk, output_apk, v1_only=NO) +>> do_copy(signed_apk, unsigned_apk, output_apk, v1_only=NO) + +You can use False, None, and True instead of NO, AUTO, and YES respectively. + +The following global variables (which default to False), can be set to +override the default behaviour: + +* set exclude_all_meta=True to exclude all metadata files +* set copy_extra_bytes=True to copy extra bytes after data (e.g. a v2 sig) +""" + +import glob +import os +import re +import struct +import sys +import zipfile +import zlib + +from collections import namedtuple +from typing import Any, Dict + +__version__ = "0.4.0" +NAME = "apksigcopier" + +SIGBLOCK, SIGOFFSET = "APKSigningBlock", "APKSigningBlockOffset" +NOAUTOYES = NO, AUTO, YES = ("no", "auto", "yes") +APK_META = re.compile(r"^META-INF/([0-9A-Za-z_-]+\.(SF|RSA|DSA|EC)|MANIFEST\.MF)$") +META_EXT = ("SF", "RSA|DSA|EC", "MF") +COPY_EXCLUDE = ("META-INF/MANIFEST.MF",) +DATETIMEZERO = (1980, 0, 0, 0, 0, 0) + +ZipData = namedtuple("ZipData", ("cd_offset", "eocd_offset", "cd_and_eocd")) + +exclude_all_meta = False # exclude all metadata files in copy_apk() +copy_extra_bytes = False # copy extra bytes after data in copy_apk() + + +class APKSigCopierError(Exception): + """Base class for errors.""" + + +class APKSigningBlockError(APKSigCopierError): + """Something wrong with the APK Signing Block.""" + + +class NoAPKSigningBlock(APKSigningBlockError): + """APK Signing Block Missing.""" + + +class ZipError(APKSigCopierError): + """Something wrong with ZIP file.""" + + +# FIXME: is there a better alternative? +class ReproducibleZipInfo(zipfile.ZipInfo): + """Reproducible ZipInfo hack.""" + + _override = {} # type: Dict[str, Any] + + def __init__(self, zinfo, **override): + if override: + self._override = {**self._override, **override} + for k in self.__slots__: + if hasattr(zinfo, k): + setattr(self, k, getattr(zinfo, k)) + + def __getattribute__(self, name): + if name != "_override": + try: + return self._override[name] + except KeyError: + pass + return object.__getattribute__(self, name) + + +class APKZipInfo(ReproducibleZipInfo): + """Reproducible ZipInfo for APK files.""" + + _override = dict( + compress_type=8, + create_system=0, + create_version=20, + date_time=DATETIMEZERO, + external_attr=0, + extract_version=20, + flag_bits=0x800, + ) + + +def noautoyes(value): + """ + Turns False into NO, None into AUTO, and True into YES. + + >>> from apksigcopier import noautoyes, NO, AUTO, YES + >>> noautoyes(False) == NO == noautoyes(NO) + True + >>> noautoyes(None) == AUTO == noautoyes(AUTO) + True + >>> noautoyes(True) == YES == noautoyes(YES) + True + + """ + if isinstance(value, str): + if value not in NOAUTOYES: + raise ValueError("expected NO, AUTO, or YES") + return value + try: + return {False: NO, None: AUTO, True: YES}[value] + except KeyError: + raise ValueError("expected False, None, or True") + + +def is_meta(filename): + """ + Returns whether filename is a v1 (JAR) signature file (.SF), signature block + file (.RSA, .DSA, or .EC), or manifest (MANIFEST.MF). + + See https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html + """ + return APK_META.fullmatch(filename) is not None + + +def exclude_from_copying(filename): + """ + Returns whether to exclude a file during copy_apk(). + + Excludes filenames in COPY_EXCLUDE (i.e. MANIFEST.MF) by default; when + exclude_all_meta is set to True instead, excludes all metadata files as + matched by is_meta(). + """ + return is_meta(filename) if exclude_all_meta else filename in COPY_EXCLUDE + + +################################################################################ +# +# https://en.wikipedia.org/wiki/ZIP_(file_format) +# https://source.android.com/security/apksigning/v2#apk-signing-block-format +# +# ================================= +# | Contents of ZIP entries | +# ================================= +# | APK Signing Block | +# | ----------------------------- | +# | | size (w/o this) uint64 LE | | +# | | ... | | +# | | size (again) uint64 LE | | +# | | "APK Sig Block 42" (16B) | | +# | ----------------------------- | +# ================================= +# | ZIP Central Directory | +# ================================= +# | ZIP End of Central Directory | +# | ----------------------------- | +# | | 0x06054b50 ( 4B) | | +# | | ... (12B) | | +# | | CD Offset ( 4B) | | +# | | ... | | +# | ----------------------------- | +# ================================= +# +################################################################################ + + +# FIXME: makes certain assumptions and doesn't handle all valid ZIP files! +def copy_apk(unsigned_apk, output_apk): + """ + Copy APK like apksigner would, excluding files matched by + exclude_from_copying(). + + Returns max date_time. + + The following global variables (which default to False), can be set to + override the default behaviour: + + * set exclude_all_meta=True to exclude all metadata files + * set copy_extra_bytes=True to copy extra bytes after data (e.g. a v2 sig) + """ + with zipfile.ZipFile(unsigned_apk, "r") as zf: + infos = zf.infolist() + zdata = zip_data(unsigned_apk) + offsets = {} + with open(unsigned_apk, "rb") as fhi, open(output_apk, "w+b") as fho: + for info in sorted(infos, key=lambda info: info.header_offset): + off_i = fhi.tell() + if info.header_offset > off_i: + # copy extra bytes + fho.write(fhi.read(info.header_offset - off_i)) + hdr = fhi.read(30) + if hdr[:4] != b"\x50\x4b\x03\x04": + raise ZipError("Expected local file header signature") + n, m = struct.unpack("= 4: + hdr_id, size = struct.unpack(" len(old_xtr) - 4: + break + if not (hdr_id == 0 and size == 0): + if hdr_id == 0xd935: + if size >= 2: + align = int.from_bytes(old_xtr[4:6], "little") + else: + new_xtr += old_xtr[:size + 4] + old_xtr = old_xtr[size + 4:] + if old_off % align == 0 and new_off % align != 0: + pad = (align - (new_off - m + len(new_xtr) + 6) % align) % align + xtr = new_xtr + struct.pack(" 0: + data = fhi.read(min(size, blocksize)) + if not data: + break + size -= len(data) + fho.write(data) + if size != 0: + raise ZipError("Unexpected EOF") + + +def extract_meta(signed_apk): + """ + Extract v1 signature metadata files from signed APK. + + Yields (ZipInfo, data) pairs. + """ + with zipfile.ZipFile(signed_apk, "r") as zf_sig: + for info in zf_sig.infolist(): + if is_meta(info.filename): + yield info, zf_sig.read(info.filename) + + +def patch_meta(extracted_meta, output_apk, date_time=DATETIMEZERO): + """Add v1 signature metadata to APK (removes v2 sig block, if any).""" + with zipfile.ZipFile(output_apk, "r") as zf_out: + for info in zf_out.infolist(): + if is_meta(info.filename): + raise ZipError("Unexpected metadata") + with zipfile.ZipFile(output_apk, "a") as zf_out: + info_data = [(APKZipInfo(info, date_time=date_time), data) + for info, data in extracted_meta] + _write_to_zip(info_data, zf_out) + + +if sys.version_info >= (3, 7): + def _write_to_zip(info_data, zf_out): + for info, data in info_data: + zf_out.writestr(info, data, compresslevel=9) +else: + def _write_to_zip(info_data, zf_out): + old = zipfile._get_compressor + zipfile._get_compressor = lambda _: zlib.compressobj(9, 8, -15) + try: + for info, data in info_data: + zf_out.writestr(info, data) + finally: + zipfile._get_compressor = old + + +def extract_v2_sig(apkfile, expected=True): + """ + Extract APK Signing Block and offset from APK. + + When successful, returns (sb_offset, sig_block); otherwise raises + NoAPKSigningBlock when expected is True, else returns None. + """ + cd_offset = zip_data(apkfile).cd_offset + with open(apkfile, "rb") as fh: + fh.seek(cd_offset - 16) + if fh.read(16) != b"APK Sig Block 42": + if expected: + raise NoAPKSigningBlock("No APK Signing Block") + return None + fh.seek(-24, os.SEEK_CUR) + sb_size2 = int.from_bytes(fh.read(8), "little") + fh.seek(-sb_size2 + 8, os.SEEK_CUR) + sb_size1 = int.from_bytes(fh.read(8), "little") + if sb_size1 != sb_size2: + raise APKSigningBlockError("APK Signing Block sizes not equal") + fh.seek(-8, os.SEEK_CUR) + sb_offset = fh.tell() + sig_block = fh.read(sb_size2 + 8) + return sb_offset, sig_block + + +def zip_data(apkfile, count=1024): + """ + Extract central directory, EOCD, and offsets from ZIP. + + Returns ZipData. + """ + with open(apkfile, "rb") as fh: + fh.seek(-count, os.SEEK_END) + data = fh.read() + pos = data.rfind(b"\x50\x4b\x05\x06") + if pos == -1: + raise ZipError("Expected end of central directory record (EOCD)") + fh.seek(pos - len(data), os.SEEK_CUR) + eocd_offset = fh.tell() + fh.seek(16, os.SEEK_CUR) + cd_offset = int.from_bytes(fh.read(4), "little") + fh.seek(cd_offset) + cd_and_eocd = fh.read() + return ZipData(cd_offset, eocd_offset, cd_and_eocd) + + +# FIXME: can we determine signed_sb_offset? +def patch_v2_sig(extracted_v2_sig, output_apk): + """Implant extracted v2/v3 signature into APK.""" + signed_sb_offset, signed_sb = extracted_v2_sig + data_out = zip_data(output_apk) + if signed_sb_offset < data_out.cd_offset: + raise APKSigningBlockError("APK Signing Block offset < central directory offset") + padding = b"\x00" * (signed_sb_offset - data_out.cd_offset) + offset = len(signed_sb) + len(padding) + with open(output_apk, "r+b") as fh: + fh.seek(data_out.cd_offset) + fh.write(padding) + fh.write(signed_sb) + fh.write(data_out.cd_and_eocd) + fh.seek(data_out.eocd_offset + offset + 16) + fh.write(int.to_bytes(data_out.cd_offset + offset, 4, "little")) + + +def patch_apk(extracted_meta, extracted_v2_sig, unsigned_apk, output_apk): + """ + Patch extracted_meta + extracted_v2_sig (if not None) onto unsigned_apk and + save as output_apk. + """ + date_time = copy_apk(unsigned_apk, output_apk) + patch_meta(extracted_meta, output_apk, date_time=date_time) + if extracted_v2_sig is not None: + patch_v2_sig(extracted_v2_sig, output_apk) + + +def do_extract(signed_apk, output_dir, v1_only=NO): + """ + Extract signatures from signed_apk and save in output_dir. + + The v1_only parameter controls whether the absence of a v1 signature is + considered an error or not: + * use v1_only=NO (or v1_only=False) to only accept (v1+)v2/v3 signatures; + * use v1_only=AUTO (or v1_only=None) to automatically detect v2/v3 signatures; + * use v1_only=YES (or v1_only=True) to ignore any v2/v3 signatures. + """ + v1_only = noautoyes(v1_only) + extracted_meta = tuple(extract_meta(signed_apk)) + if len(extracted_meta) not in (len(META_EXT), 0): + raise APKSigCopierError("Unexpected or missing metadata files in signed_apk") + for info, data in extracted_meta: + name = os.path.basename(info.filename) + with open(os.path.join(output_dir, name), "wb") as fh: + fh.write(data) + if v1_only == YES: + if not extracted_meta: + raise APKSigCopierError("Expected v1 signature") + return + expected = v1_only == NO + extracted_v2_sig = extract_v2_sig(signed_apk, expected=expected) + if extracted_v2_sig is None: + if not extracted_meta: + raise APKSigCopierError("Expected v1 and/or v2/v3 signature, found neither") + return + signed_sb_offset, signed_sb = extracted_v2_sig + with open(os.path.join(output_dir, SIGOFFSET), "w") as fh: + fh.write(str(signed_sb_offset) + "\n") + with open(os.path.join(output_dir, SIGBLOCK), "wb") as fh: + fh.write(signed_sb) + + +def do_patch(metadata_dir, unsigned_apk, output_apk, v1_only=NO): + """ + Patch signatures from metadata_dir onto unsigned_apk and save as output_apk. + + The v1_only parameter controls whether the absence of a v1 signature is + considered an error or not: + * use v1_only=NO (or v1_only=False) to only accept (v1+)v2/v3 signatures; + * use v1_only=AUTO (or v1_only=None) to automatically detect v2/v3 signatures; + * use v1_only=YES (or v1_only=True) to ignore any v2/v3 signatures. + """ + v1_only = noautoyes(v1_only) + extracted_meta = [] + for pat in META_EXT: + files = [fn for ext in pat.split("|") for fn in + glob.glob(os.path.join(metadata_dir, "*." + ext))] + if len(files) != 1: + continue + info = zipfile.ZipInfo("META-INF/" + os.path.basename(files[0])) + with open(files[0], "rb") as fh: + extracted_meta.append((info, fh.read())) + if len(extracted_meta) not in (len(META_EXT), 0): + raise APKSigCopierError("Unexpected or missing files in metadata_dir") + if v1_only == YES: + extracted_v2_sig = None + else: + sigoffset_file = os.path.join(metadata_dir, SIGOFFSET) + sigblock_file = os.path.join(metadata_dir, SIGBLOCK) + if v1_only == AUTO and not os.path.exists(sigblock_file): + extracted_v2_sig = None + else: + with open(sigoffset_file, "r") as fh: + signed_sb_offset = int(fh.read()) + with open(sigblock_file, "rb") as fh: + signed_sb = fh.read() + extracted_v2_sig = signed_sb_offset, signed_sb + if not extracted_meta and extracted_v2_sig is None: + raise APKSigCopierError("Expected v1 and/or v2/v3 signature, found neither") + patch_apk(extracted_meta, extracted_v2_sig, unsigned_apk, output_apk) + + +def do_copy(signed_apk, unsigned_apk, output_apk, v1_only=NO): + """ + Copy signatures from signed_apk onto unsigned_apk and save as output_apk. + + The v1_only parameter controls whether the absence of a v1 signature is + considered an error or not: + * use v1_only=NO (or v1_only=False) to only accept (v1+)v2/v3 signatures; + * use v1_only=AUTO (or v1_only=None) to automatically detect v2/v3 signatures; + * use v1_only=YES (or v1_only=True) to ignore any v2/v3 signatures. + """ + v1_only = noautoyes(v1_only) + extracted_meta = extract_meta(signed_apk) + if v1_only == YES: + extracted_v2_sig = None + else: + extracted_v2_sig = extract_v2_sig(signed_apk, expected=v1_only == NO) + patch_apk(extracted_meta, extracted_v2_sig, unsigned_apk, output_apk) + + +def main(): + """CLI; requires click.""" + + global exclude_all_meta, copy_extra_bytes + exclude_all_meta = os.environ.get("APKSIGCOPIER_EXCLUDE_ALL_META") in ("1", "yes", "true") + copy_extra_bytes = os.environ.get("APKSIGCOPIER_COPY_EXTRA_BYTES") in ("1", "yes", "true") + + import click + + NAY = click.Choice(NOAUTOYES) + + @click.group(help=""" + apksigcopier - copy/extract/patch apk signatures + """) + @click.version_option(__version__) + def cli(): + pass + + @cli.command(help=""" + Extract APK signatures from signed APK. + """) + @click.option("--v1-only", type=NAY, default=NO, show_default=True, + envvar="APKSIGCOPIER_V1_ONLY") + @click.argument("signed_apk", type=click.Path(exists=True, dir_okay=False)) + @click.argument("output_dir", type=click.Path(exists=True, file_okay=False)) + def extract(*args, **kwargs): + do_extract(*args, **kwargs) + + @cli.command(help=""" + Patch extracted APK signatures onto unsigned APK. + """) + @click.option("--v1-only", type=NAY, default=NO, show_default=True, + envvar="APKSIGCOPIER_V1_ONLY") + @click.argument("metadata_dir", type=click.Path(exists=True, file_okay=False)) + @click.argument("unsigned_apk", type=click.Path(exists=True, dir_okay=False)) + @click.argument("output_apk", type=click.Path(dir_okay=False)) + def patch(*args, **kwargs): + do_patch(*args, **kwargs) + + @cli.command(help=""" + Copy (extract & patch) signatures from signed to unsigned APK. + """) + @click.option("--v1-only", type=NAY, default=NO, show_default=True, + envvar="APKSIGCOPIER_V1_ONLY") + @click.argument("signed_apk", type=click.Path(exists=True, dir_okay=False)) + @click.argument("unsigned_apk", type=click.Path(exists=True, dir_okay=False)) + @click.argument("output_apk", type=click.Path(dir_okay=False)) + def copy(*args, **kwargs): + do_copy(*args, **kwargs) + + # FIXME + if click.__version__.startswith("7."): + def autocomplete_path(ctx=None, args=(), incomplete=""): # pylint: disable=W0613 + head, tail = os.path.split(incomplete) + return sorted( + (e.path if head else e.path[2:]) + ("/" if e.is_dir() else "") + for e in os.scandir(head or ".") if e.name.startswith(tail) + ) + + for command in cli.commands.values(): + for param in command.params: + if isinstance(param.type, click.Path): + param.autocompletion = autocomplete_path + + try: + cli(prog_name=NAME) + except APKSigCopierError as e: + click.echo("Error: {}.".format(e), err=True) + sys.exit(1) + + +if __name__ == "__main__": + main() + +# vim: set tw=80 sw=4 sts=4 et fdm=marker : diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 926d407c..7bf4c158 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -68,6 +68,9 @@ from fdroidserver.exception import FDroidException, VCSException, NoSubmodulesEx BuildException, VerificationException, MetaDataException from .asynchronousfilereader import AsynchronousFileReader +from . import apksigcopier +apksigcopier.exclude_all_meta = True # remove v1 signatures too + # The path to this fdroidserver distribution FDROID_PATH = os.path.realpath(os.path.join(os.path.dirname(__file__), '..')) @@ -2977,8 +2980,9 @@ def metadata_find_signing_files(appid, vercode): :param appid: app id string :param vercode: app version code - :returns: a list of triplets for each signing key with following paths: - (signature_file, singed_file, manifest_file) + :returns: a list of 4-tuples for each signing key with following paths: + (signature_file, singed_file, manifest_file, v2_files), where v2_files + is either a (sb_offset_file, sb_file) pair or None """ ret = [] sigdir = metadata_get_sigdir(appid, vercode) @@ -2986,12 +2990,18 @@ def metadata_find_signing_files(appid, vercode): glob.glob(os.path.join(sigdir, '*.EC')) + \ glob.glob(os.path.join(sigdir, '*.RSA')) extre = re.compile(r'(\.DSA|\.EC|\.RSA)$') + apk_sb = os.path.isfile(os.path.join(sigdir, "APKSigningBlock")) + apk_sbo = os.path.isfile(os.path.join(sigdir, "APKSigningBlockOffset")) + if os.path.isfile(apk_sb) and os.path.isfile(apk_sbo): + v2_files = apk_sb, apk_sbo + else: + v2_files = None for sig in sigs: sf = extre.sub('.SF', sig) if os.path.isfile(sf): mf = os.path.join(sigdir, 'MANIFEST.MF') if os.path.isfile(mf): - ret.append((sig, sf, mf)) + ret.append((sig, sf, mf, v2_files)) return ret @@ -3029,6 +3039,15 @@ class ClonedZipInfo(zipfile.ZipInfo): return object.__getattribute__(self, name) +def apk_has_v1_signatures(apkfile): + """Test whether an APK has v1 signature files.""" + with ZipFile(apkfile, 'r') as apk: + for info in apk.infolist(): + if APK_SIGNATURE_FILES.match(info.filename): + return True + return False + + def apk_strip_v1_signatures(signed_apk, strip_manifest=False): """Removes signatures from APK. @@ -3064,49 +3083,26 @@ def _zipalign(unsigned_apk, aligned_apk): raise BuildException("Failed to align application") -def apk_implant_signatures(apkpath, signaturefile, signedfile, manifest): +def apk_implant_signatures(apkpath, outpath, manifest, v2_files): """Implants a signature from metadata into an APK. - Note: this changes there supplied APK in place. So copy it if you - need the original to be preserved. - - :param apkpath: location of the apk + :param apkpath: location of the unsigned apk + :param outpath: location of the output apk """ - # get list of available signature files in metadata - with tempfile.TemporaryDirectory() as tmpdir: - apkwithnewsig = os.path.join(tmpdir, 'newsig.apk') - with ZipFile(apkpath, 'r') as in_apk: - with ZipFile(apkwithnewsig, 'w') as out_apk: - for sig_file in [signaturefile, signedfile, manifest]: - with open(sig_file, 'rb') as fp: - buf = fp.read() - info = zipfile.ZipInfo('META-INF/' + os.path.basename(sig_file)) - info.compress_type = zipfile.ZIP_DEFLATED - info.create_system = 0 # "Windows" aka "FAT", what Android SDK uses - out_apk.writestr(info, buf) - for info in in_apk.infolist(): - if not APK_SIGNATURE_FILES.match(info.filename): - if info.filename != 'META-INF/MANIFEST.MF': - buf = in_apk.read(info.filename) - out_apk.writestr(info, buf) - os.remove(apkpath) - _zipalign(apkwithnewsig, apkpath) + + sigdir = os.path.dirname(manifest) # FIXME + apksigcopier.do_patch(sigdir, apkpath, outpath, v1_only=v2_files is None) -def apk_extract_signatures(apkpath, outdir, manifest=True): +def apk_extract_signatures(apkpath, outdir, v1_only=None): """Extracts a signature files from APK and puts them into target directory. :param apkpath: location of the apk :param outdir: folder where the extracted signature files will be stored - :param manifest: (optionally) disable extracting manifest file + :param v1_only: True for v1-only signatures, False for v1 and v2 signatures, + or None for autodetection """ - with ZipFile(apkpath, 'r') as in_apk: - for f in in_apk.infolist(): - if APK_SIGNATURE_FILES.match(f.filename) or \ - (manifest and f.filename == 'META-INF/MANIFEST.MF'): - newpath = os.path.join(outdir, os.path.basename(f.filename)) - with open(newpath, 'wb') as out_file: - out_file.write(in_apk.read(f.filename)) + apksigcopier.do_extract(apkpath, outdir, v1_only=v1_only) def get_min_sdk_version(apk): @@ -3169,11 +3165,11 @@ def sign_apk(unsigned_path, signed_path, keyalias): os.remove(unsigned_path) -def verify_apks(signed_apk, unsigned_apk, tmp_dir): +def verify_apks(signed_apk, unsigned_apk, tmp_dir, v1_only=None): """Verify that two apks are the same One of the inputs is signed, the other is unsigned. The signature metadata - is transferred from the signed to the unsigned apk, and then jarsigner is + is transferred from the signed to the unsigned apk, and then apksigner is used to verify that the signature from the signed APK is also valid for the unsigned one. If the APK given as unsigned actually does have a signature, it will be stripped out and ignored. @@ -3181,53 +3177,38 @@ def verify_apks(signed_apk, unsigned_apk, tmp_dir): :param signed_apk: Path to a signed APK file :param unsigned_apk: Path to an unsigned APK file expected to match it :param tmp_dir: Path to directory for temporary files + :param v1_only: True for v1-only signatures, False for v1 and v2 signatures, + or None for autodetection :returns: None if the verification is successful, otherwise a string describing what went wrong. """ + if not verify_apk_signature(signed_apk): + logging.info('...NOT verified - {0}'.format(signed_apk)) + return 'verification of signed APK failed' + if not os.path.isfile(signed_apk): return 'can not verify: file does not exists: {}'.format(signed_apk) - if not os.path.isfile(unsigned_apk): return 'can not verify: file does not exists: {}'.format(unsigned_apk) - with ZipFile(signed_apk, 'r') as signed: - meta_inf_files = ['META-INF/MANIFEST.MF'] - for f in signed.namelist(): - if APK_SIGNATURE_FILES.match(f): - meta_inf_files.append(f) - if len(meta_inf_files) < 3: - return "Signature files missing from {0}".format(signed_apk) + tmp_apk = os.path.join(tmp_dir, 'sigcp_' + os.path.basename(unsigned_apk)) - tmp_apk = os.path.join(tmp_dir, 'sigcp_' + os.path.basename(unsigned_apk)) - with ZipFile(unsigned_apk, 'r') as unsigned: - # only read the signature from the signed APK, everything else from unsigned - with ZipFile(tmp_apk, 'w') as tmp: - for filename in meta_inf_files: - tmp.writestr(signed.getinfo(filename), signed.read(filename)) - for info in unsigned.infolist(): - if info.filename in meta_inf_files: - logging.warning('Ignoring %s from %s', info.filename, unsigned_apk) - continue - if info.filename in tmp.namelist(): - return "duplicate filename found: " + info.filename - tmp.writestr(info, unsigned.read(info.filename)) - - # Use jarsigner to verify the v1 signature on the reproduced APK, as - # apksigner will reject the reproduced APK if the original also had a v2 - # signature try: - verify_jar_signature(tmp_apk) - verified = True - except Exception: - verified = False + apksigcopier.do_copy(signed_apk, unsigned_apk, tmp_apk, v1_only=v1_only) + except apksigcopier.APKSigCopierError as e: + logging.info('...NOT verified - {0}'.format(tmp_apk)) + return 'signature copying failed: {}'.format(str(e)) - if not verified: - logging.info("...NOT verified - {0}".format(tmp_apk)) - return compare_apks(signed_apk, tmp_apk, tmp_dir, - os.path.dirname(unsigned_apk)) + if not verify_apk_signature(tmp_apk): + logging.info('...NOT verified - {0}'.format(tmp_apk)) + result = compare_apks(signed_apk, tmp_apk, tmp_dir, + os.path.dirname(unsigned_apk)) + if result is not None: + return result + return 'verification of APK with copied signature failed' - logging.info("...successfully verified") + logging.info('...successfully verified') return None diff --git a/fdroidserver/publish.py b/fdroidserver/publish.py index 71b5729d..445c15c9 100644 --- a/fdroidserver/publish.py +++ b/fdroidserver/publish.py @@ -3,6 +3,7 @@ # publish.py - part of the FDroid server tools # Copyright (C) 2010-13, Ciaran Gultnieks, ciaran@ciarang.com # Copyright (C) 2013-2014 Daniel Martí +# Copyright (C) 2021 Felix C. Stegerman # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by @@ -345,16 +346,15 @@ def main(): # metadata. This means we're going to prepare both a locally # signed APK and a version signed with the developers key. - signaturefile, signedfile, manifest = signingfiles + signaturefile, signedfile, manifest, v2_files = signingfiles with open(signaturefile, 'rb') as f: devfp = common.signer_fingerprint_short(common.get_certificate(f.read())) devsigned = '{}_{}_{}.apk'.format(appid, vercode, devfp) devsignedtmp = os.path.join(tmp_dir, devsigned) - shutil.copy(apkfile, devsignedtmp) - common.apk_implant_signatures(devsignedtmp, signaturefile, - signedfile, manifest) + common.apk_implant_signatures(apkfile, devsignedtmp, manifest=manifest, + v2_files=v2_files) if common.verify_apk_signature(devsignedtmp): shutil.move(devsignedtmp, os.path.join(output_dir, devsigned)) else: diff --git a/tests/common.TestCase b/tests/common.TestCase index 07e3d95e..996f3b8f 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -473,7 +473,7 @@ class CommonTest(unittest.TestCase): for info in apk.infolist(): testapk.writestr(info, apk.read(info.filename)) if info.filename.startswith('META-INF/'): - testapk.writestr(info, otherapk.read(info.filename)) + testapk.writestr(info.filename, otherapk.read(info.filename)) otherapk.close() self.assertFalse(fdroidserver.common.verify_apk_signature(twosigapk)) self.assertIsNone(fdroidserver.common.verify_apks(sourceapk, twosigapk, self.tmpdir)) From 44d481768f1b7da2ea94b8216c384d40cb52e9f6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 14 Apr 2021 16:07:50 +0200 Subject: [PATCH 0224/2116] publish: add test for reproduble builds with signatures --- tests/publish.TestCase | 67 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/tests/publish.TestCase b/tests/publish.TestCase index f57dc955..eb1948be 100755 --- a/tests/publish.TestCase +++ b/tests/publish.TestCase @@ -30,6 +30,8 @@ if localmodule not in sys.path: from fdroidserver import publish from fdroidserver import common +from fdroidserver import metadata +from fdroidserver import signatures from fdroidserver.exception import FDroidException @@ -250,6 +252,71 @@ class PublishTest(unittest.TestCase): self.assertEqual(publish.config['jarsigner'], data['jarsigner']) self.assertEqual(publish.config['keytool'], data['keytool']) + def test_sign_then_implant_signature(self): + + class Options: + verbose = False + + testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + os.chdir(testdir) + + config = common.read_config(Options) + if 'apksigner' not in config: + self.skipTest('SKIPPING test_sign_then_implant_signature, apksigner not installed!') + config['repo_keyalias'] = 'sova' + config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' + config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' + shutil.copy(os.path.join(self.basedir, 'keystore.jks'), testdir) + config['keystore'] = 'keystore.jks' + config['keydname'] = 'CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US' + publish.config = config + common.config = config + + app = metadata.App() + app.id = 'org.fdroid.ci' + versionCode = 1 + build = metadata.Build( + { + 'versionCode': versionCode, + 'versionName': '1.0', + } + ) + app.Builds = [build] + os.mkdir('metadata') + metadata.write_metadata(os.path.join('metadata', '%s.yml' % app.id), app) + + os.mkdir('unsigned') + testapk = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') + unsigned = os.path.join('unsigned', common.get_release_filename(app, build)) + signed = os.path.join('repo', common.get_release_filename(app, build)) + shutil.copy(testapk, unsigned) + + # sign the unsigned APK + self.assertTrue(os.path.exists(unsigned)) + self.assertFalse(os.path.exists(signed)) + with mock.patch('sys.argv', ['fdroid publish', '%s:%d' % (app.id, versionCode)]): + publish.main() + self.assertFalse(os.path.exists(unsigned)) + self.assertTrue(os.path.exists(signed)) + + with mock.patch('sys.argv', ['fdroid signatures', signed]): + signatures.main() + self.assertTrue( + os.path.exists( + os.path.join('metadata', 'org.fdroid.ci', 'signatures', '1', 'MANIFEST.MF') + ) + ) + os.remove(signed) + + # implant the signature into the unsigned APK + shutil.copy(testapk, unsigned) + self.assertTrue(os.path.exists(unsigned)) + self.assertFalse(os.path.exists(signed)) + with mock.patch('sys.argv', ['fdroid publish', '%s:%d' % (app.id, versionCode)]): + publish.main() + self.assertFalse(os.path.exists(unsigned)) + self.assertTrue(os.path.exists(signed)) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From d28c1c04418ede624029cf1eae3585f565d9c163 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 14 Apr 2021 21:02:59 +0200 Subject: [PATCH 0225/2116] force apksigcopier "AUTO" to select sigs by available files --- fdroidserver/common.py | 11 +++++------ fdroidserver/publish.py | 3 +-- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 7bf4c158..4c000078 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3083,7 +3083,7 @@ def _zipalign(unsigned_apk, aligned_apk): raise BuildException("Failed to align application") -def apk_implant_signatures(apkpath, outpath, manifest, v2_files): +def apk_implant_signatures(apkpath, outpath, manifest): """Implants a signature from metadata into an APK. :param apkpath: location of the unsigned apk @@ -3091,18 +3091,17 @@ def apk_implant_signatures(apkpath, outpath, manifest, v2_files): """ sigdir = os.path.dirname(manifest) # FIXME - apksigcopier.do_patch(sigdir, apkpath, outpath, v1_only=v2_files is None) + apksigcopier.do_patch(sigdir, apkpath, outpath, v1_only=None) -def apk_extract_signatures(apkpath, outdir, v1_only=None): +def apk_extract_signatures(apkpath, outdir): """Extracts a signature files from APK and puts them into target directory. :param apkpath: location of the apk :param outdir: folder where the extracted signature files will be stored - :param v1_only: True for v1-only signatures, False for v1 and v2 signatures, - or None for autodetection + """ - apksigcopier.do_extract(apkpath, outdir, v1_only=v1_only) + apksigcopier.do_extract(apkpath, outdir, v1_only=None) def get_min_sdk_version(apk): diff --git a/fdroidserver/publish.py b/fdroidserver/publish.py index 445c15c9..29e90439 100644 --- a/fdroidserver/publish.py +++ b/fdroidserver/publish.py @@ -353,8 +353,7 @@ def main(): devsigned = '{}_{}_{}.apk'.format(appid, vercode, devfp) devsignedtmp = os.path.join(tmp_dir, devsigned) - common.apk_implant_signatures(apkfile, devsignedtmp, manifest=manifest, - v2_files=v2_files) + common.apk_implant_signatures(apkfile, devsignedtmp, manifest=manifest) if common.verify_apk_signature(devsignedtmp): shutil.move(devsignedtmp, os.path.join(output_dir, devsigned)) else: From f5792d4f4937451175ab470667fac137ef01852a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 14 Apr 2021 14:23:54 +0200 Subject: [PATCH 0226/2116] apksigcopier: purge main() to avoid confusion --- fdroidserver/apksigcopier.py | 76 ------------------------------------ 1 file changed, 76 deletions(-) diff --git a/fdroidserver/apksigcopier.py b/fdroidserver/apksigcopier.py index 74e7e7df..215dc5d0 100644 --- a/fdroidserver/apksigcopier.py +++ b/fdroidserver/apksigcopier.py @@ -60,7 +60,6 @@ import zipfile import zlib from collections import namedtuple -from typing import Any, Dict __version__ = "0.4.0" NAME = "apksigcopier" @@ -519,79 +518,4 @@ def do_copy(signed_apk, unsigned_apk, output_apk, v1_only=NO): extracted_v2_sig = extract_v2_sig(signed_apk, expected=v1_only == NO) patch_apk(extracted_meta, extracted_v2_sig, unsigned_apk, output_apk) - -def main(): - """CLI; requires click.""" - - global exclude_all_meta, copy_extra_bytes - exclude_all_meta = os.environ.get("APKSIGCOPIER_EXCLUDE_ALL_META") in ("1", "yes", "true") - copy_extra_bytes = os.environ.get("APKSIGCOPIER_COPY_EXTRA_BYTES") in ("1", "yes", "true") - - import click - - NAY = click.Choice(NOAUTOYES) - - @click.group(help=""" - apksigcopier - copy/extract/patch apk signatures - """) - @click.version_option(__version__) - def cli(): - pass - - @cli.command(help=""" - Extract APK signatures from signed APK. - """) - @click.option("--v1-only", type=NAY, default=NO, show_default=True, - envvar="APKSIGCOPIER_V1_ONLY") - @click.argument("signed_apk", type=click.Path(exists=True, dir_okay=False)) - @click.argument("output_dir", type=click.Path(exists=True, file_okay=False)) - def extract(*args, **kwargs): - do_extract(*args, **kwargs) - - @cli.command(help=""" - Patch extracted APK signatures onto unsigned APK. - """) - @click.option("--v1-only", type=NAY, default=NO, show_default=True, - envvar="APKSIGCOPIER_V1_ONLY") - @click.argument("metadata_dir", type=click.Path(exists=True, file_okay=False)) - @click.argument("unsigned_apk", type=click.Path(exists=True, dir_okay=False)) - @click.argument("output_apk", type=click.Path(dir_okay=False)) - def patch(*args, **kwargs): - do_patch(*args, **kwargs) - - @cli.command(help=""" - Copy (extract & patch) signatures from signed to unsigned APK. - """) - @click.option("--v1-only", type=NAY, default=NO, show_default=True, - envvar="APKSIGCOPIER_V1_ONLY") - @click.argument("signed_apk", type=click.Path(exists=True, dir_okay=False)) - @click.argument("unsigned_apk", type=click.Path(exists=True, dir_okay=False)) - @click.argument("output_apk", type=click.Path(dir_okay=False)) - def copy(*args, **kwargs): - do_copy(*args, **kwargs) - - # FIXME - if click.__version__.startswith("7."): - def autocomplete_path(ctx=None, args=(), incomplete=""): # pylint: disable=W0613 - head, tail = os.path.split(incomplete) - return sorted( - (e.path if head else e.path[2:]) + ("/" if e.is_dir() else "") - for e in os.scandir(head or ".") if e.name.startswith(tail) - ) - - for command in cli.commands.values(): - for param in command.params: - if isinstance(param.type, click.Path): - param.autocompletion = autocomplete_path - - try: - cli(prog_name=NAME) - except APKSigCopierError as e: - click.echo("Error: {}.".format(e), err=True) - sys.exit(1) - - -if __name__ == "__main__": - main() - # vim: set tw=80 sw=4 sts=4 et fdm=marker : From 4308a48717bd1b48e0e7863efae4db103363b57c Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 14 Apr 2021 22:16:48 +0200 Subject: [PATCH 0227/2116] apksigcopier: remove exclude_all_meta logic This option is unneeded and unused in fdroidserver, and confusing. https://github.com/obfusk/apksigcopier/pull/36 # Conflicts: # fdroidserver/apksigcopier.py # fdroidserver/common.py --- fdroidserver/apksigcopier.py | 11 ++--------- fdroidserver/common.py | 2 +- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/fdroidserver/apksigcopier.py b/fdroidserver/apksigcopier.py index 215dc5d0..48b72ce1 100644 --- a/fdroidserver/apksigcopier.py +++ b/fdroidserver/apksigcopier.py @@ -73,7 +73,6 @@ DATETIMEZERO = (1980, 0, 0, 0, 0, 0) ZipData = namedtuple("ZipData", ("cd_offset", "eocd_offset", "cd_and_eocd")) -exclude_all_meta = False # exclude all metadata files in copy_apk() copy_extra_bytes = False # copy extra bytes after data in copy_apk() @@ -163,14 +162,8 @@ def is_meta(filename): def exclude_from_copying(filename): - """ - Returns whether to exclude a file during copy_apk(). - - Excludes filenames in COPY_EXCLUDE (i.e. MANIFEST.MF) by default; when - exclude_all_meta is set to True instead, excludes all metadata files as - matched by is_meta(). - """ - return is_meta(filename) if exclude_all_meta else filename in COPY_EXCLUDE + """fdroidserver always wants JAR Signature files to be excluded""" + return is_meta(filename) ################################################################################ diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 4c000078..3a57a26e 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -69,7 +69,7 @@ from fdroidserver.exception import FDroidException, VCSException, NoSubmodulesEx from .asynchronousfilereader import AsynchronousFileReader from . import apksigcopier -apksigcopier.exclude_all_meta = True # remove v1 signatures too + # The path to this fdroidserver distribution FDROID_PATH = os.path.realpath(os.path.join(os.path.dirname(__file__), '..')) From 416790306f8eb880dc825d6994630bfe50c67184 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 26 Mar 2021 13:24:26 +0100 Subject: [PATCH 0228/2116] common.py: update copyrights --- fdroidserver/common.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 3a57a26e..851e7738 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1,9 +1,16 @@ #!/usr/bin/env python3 # # common.py - part of the FDroid server tools -# Copyright (C) 2010-13, Ciaran Gultnieks, ciaran@ciarang.com -# Copyright (C) 2013-2014 Daniel Martí -# Copyright (C) 2021 Felix C. Stegerman +# +# Copyright (C) 2010-2016, Ciaran Gultnieks, ciaran@ciarang.com +# Copyright (C) 2013-2017, Daniel Martí +# Copyright (C) 2013-2021, Hans-Christoph Steiner +# Copyright (C) 2017-2018, Torsten Grote +# Copyright (C) 2017, tobiasKaminsky +# Copyright (C) 2017-2021, Michael Pöhn +# Copyright (C) 2017,2021, mimi89999 +# Copyright (C) 2019-2021, Jochen Sprickerhof +# Copyright (C) 2021, Felix C. Stegerman # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by From 2946c90dd4fc98020248b55b65f6d64ecd9a85a9 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 26 Mar 2021 12:00:01 +0100 Subject: [PATCH 0229/2116] publish: rename vars to match naming in JAR Signature docs https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html closes #892 --- fdroidserver/common.py | 76 ++++++++++++++++++++++++++--------------- fdroidserver/publish.py | 4 +-- tests/common.TestCase | 29 ++++++++++++++++ 3 files changed, 80 insertions(+), 29 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 851e7738..c388fa63 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2943,13 +2943,13 @@ def apk_signer_fingerprint_short(apk_path): def metadata_get_sigdir(appid, vercode=None): """Get signature directory for app""" if vercode: - return os.path.join('metadata', appid, 'signatures', vercode) + return os.path.join('metadata', appid, 'signatures', str(vercode)) else: return os.path.join('metadata', appid, 'signatures') def metadata_find_developer_signature(appid, vercode=None): - """Tires to find the developer signature for given appid. + """Tries to find the developer signature for given appid. This picks the first signature file found in metadata an returns its signature. @@ -2971,52 +2971,63 @@ def metadata_find_developer_signature(appid, vercode=None): appversigdirs.append(appversigdir) for sigdir in appversigdirs: - sigs = glob.glob(os.path.join(sigdir, '*.DSA')) + \ - glob.glob(os.path.join(sigdir, '*.EC')) + \ - glob.glob(os.path.join(sigdir, '*.RSA')) - if len(sigs) > 1: + signature_block_files = ( + glob.glob(os.path.join(sigdir, '*.DSA')) + + glob.glob(os.path.join(sigdir, '*.EC')) + + glob.glob(os.path.join(sigdir, '*.RSA')) + ) + if len(signature_block_files) > 1: raise FDroidException('ambiguous signatures, please make sure there is only one signature in \'{}\'. (The signature has to be the App maintainers signature for version of the APK.)'.format(sigdir)) - for sig in sigs: - with open(sig, 'rb') as f: + for signature_block_file in signature_block_files: + with open(signature_block_file, 'rb') as f: return signer_fingerprint(get_certificate(f.read())) return None def metadata_find_signing_files(appid, vercode): - """Gets a list of singed manifests and signatures. + """Gets a list of signed manifests and signatures. + + https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html + https://source.android.com/security/apksigning/v2 + https://source.android.com/security/apksigning/v3 :param appid: app id string :param vercode: app version code :returns: a list of 4-tuples for each signing key with following paths: - (signature_file, singed_file, manifest_file, v2_files), where v2_files - is either a (sb_offset_file, sb_file) pair or None + (signature_file, signature_block_file, manifest, v2_files), where v2_files + is either a (apk_signing_block_offset_file, apk_signing_block_file) pair or None + """ ret = [] sigdir = metadata_get_sigdir(appid, vercode) - sigs = glob.glob(os.path.join(sigdir, '*.DSA')) + \ - glob.glob(os.path.join(sigdir, '*.EC')) + \ - glob.glob(os.path.join(sigdir, '*.RSA')) - extre = re.compile(r'(\.DSA|\.EC|\.RSA)$') - apk_sb = os.path.isfile(os.path.join(sigdir, "APKSigningBlock")) - apk_sbo = os.path.isfile(os.path.join(sigdir, "APKSigningBlockOffset")) - if os.path.isfile(apk_sb) and os.path.isfile(apk_sbo): - v2_files = apk_sb, apk_sbo + signature_block_files = ( + glob.glob(os.path.join(sigdir, '*.DSA')) + + glob.glob(os.path.join(sigdir, '*.EC')) + + glob.glob(os.path.join(sigdir, '*.RSA')) + ) + signature_block_pat = re.compile(r'(\.DSA|\.EC|\.RSA)$') + apk_signing_block = os.path.isfile(os.path.join(sigdir, "APKSigningBlock")) + apk_signing_block_offset = os.path.isfile(os.path.join(sigdir, "APKSigningBlockOffset")) + if os.path.isfile(apk_signing_block) and os.path.isfile(apk_signing_block_offset): + v2_files = apk_signing_block, apk_signing_block_offset else: v2_files = None - for sig in sigs: - sf = extre.sub('.SF', sig) - if os.path.isfile(sf): - mf = os.path.join(sigdir, 'MANIFEST.MF') - if os.path.isfile(mf): - ret.append((sig, sf, mf, v2_files)) + for signature_block_file in signature_block_files: + signature_file = signature_block_pat.sub('.SF', signature_block_file) + if os.path.isfile(signature_file): + manifest = os.path.join(sigdir, 'MANIFEST.MF') + if os.path.isfile(manifest): + ret.append((signature_block_file, signature_file, manifest, v2_files)) return ret def metadata_find_developer_signing_files(appid, vercode): """Get developer signature files for specified app from metadata. - :returns: A triplet of paths for signing files from metadata: - (signature_file, singed_file, manifest_file) + :returns: a list of 4-tuples for each signing key with following paths: + (signature_file, signature_block_file, manifest, v2_files), where v2_files + is either a (apk_signing_block_offset_file, apk_signing_block_file) pair or None + """ allsigningfiles = metadata_find_signing_files(appid, vercode) if allsigningfiles and len(allsigningfiles) == 1: @@ -3093,6 +3104,13 @@ def _zipalign(unsigned_apk, aligned_apk): def apk_implant_signatures(apkpath, outpath, manifest): """Implants a signature from metadata into an APK. + Note: this changes there supplied APK in place. So copy it if you + need the original to be preserved. + + https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html + https://source.android.com/security/apksigning/v2 + https://source.android.com/security/apksigning/v3 + :param apkpath: location of the unsigned apk :param outpath: location of the output apk """ @@ -3104,6 +3122,10 @@ def apk_implant_signatures(apkpath, outpath, manifest): def apk_extract_signatures(apkpath, outdir): """Extracts a signature files from APK and puts them into target directory. + https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html + https://source.android.com/security/apksigning/v2 + https://source.android.com/security/apksigning/v3 + :param apkpath: location of the apk :param outdir: folder where the extracted signature files will be stored diff --git a/fdroidserver/publish.py b/fdroidserver/publish.py index 29e90439..56b6016c 100644 --- a/fdroidserver/publish.py +++ b/fdroidserver/publish.py @@ -346,9 +346,9 @@ def main(): # metadata. This means we're going to prepare both a locally # signed APK and a version signed with the developers key. - signaturefile, signedfile, manifest, v2_files = signingfiles + signature_file, _ignored, manifest, v2_files = signingfiles - with open(signaturefile, 'rb') as f: + with open(signature_file, 'rb') as f: devfp = common.signer_fingerprint_short(common.get_certificate(f.read())) devsigned = '{}_{}_{}.apk'.format(appid, vercode, devfp) devsignedtmp = os.path.join(tmp_dir, devsigned) diff --git a/tests/common.TestCase b/tests/common.TestCase index 996f3b8f..ddb2f07d 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1761,6 +1761,35 @@ class CommonTest(unittest.TestCase): shutil.copy(before, after) fdroidserver.common.apk_strip_v1_signatures(after, strip_manifest=False) + def test_metadata_find_developer_signing_files(self): + appid = 'org.smssecure.smssecure' + + self.assertIsNone( + fdroidserver.common.metadata_find_developer_signing_files(appid, 133) + ) + + vc = '135' + self.assertEqual( + ( + os.path.join('metadata', appid, 'signatures', vc, '28969C09.RSA'), + os.path.join('metadata', appid, 'signatures', vc, '28969C09.SF'), + os.path.join('metadata', appid, 'signatures', vc, 'MANIFEST.MF'), + None + ), + fdroidserver.common.metadata_find_developer_signing_files(appid, vc) + ) + + vc = '134' + self.assertEqual( + ( + os.path.join('metadata', appid, 'signatures', vc, '28969C09.RSA'), + os.path.join('metadata', appid, 'signatures', vc, '28969C09.SF'), + os.path.join('metadata', appid, 'signatures', vc, 'MANIFEST.MF'), + None + ), + fdroidserver.common.metadata_find_developer_signing_files(appid, vc) + ) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 0c807275a27df7097b7105ee9d175b2eb1321fad Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 12 Apr 2021 11:52:21 +0200 Subject: [PATCH 0230/2116] jenkins-build-all: refocus on building reproducible apps first This also deletes the reproducible APKs each time to test that they are still being built reproducibly. !893 fdroidserver#891 --- jenkins-build-all | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/jenkins-build-all b/jenkins-build-all index 9e9c76e5..282a4ab6 100755 --- a/jenkins-build-all +++ b/jenkins-build-all @@ -95,10 +95,25 @@ else sed -i '/^wiki_/d' config.yml fi +printf '\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\nbuild all with reproducible signatures\n' +for f in metadata/*/signatures/*; do + appid=$(basename $(dirname $(dirname $f))) + versionCode=$(basename $f) + rm -f repo/${appid}_* archive/${appid}_* unsigned/${appid}_* + $WORKSPACE/fdroid build --verbose --latest --no-tarball ${appid}:$versionCode +done + +printf '\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\nbuild all with Binaries:\n' +for appid in `grep '^Binaries: ' metadata/*.yml --files-with-match | sed 's,^metadata/\(.*\)\.yml$,\1,'`; do + rm -f repo/${appid}_* archive/${appid}_* unsigned/${appid}_* + $WORKSPACE/fdroid build --verbose --latest --no-tarball ${appid} +done + # force global timeout to 6 hours sed -Ei 's,^(\s+endtime\s*=\s*time\.time\(\))\s*.*,\1 + 6 * 60 * 60 # 6 hours,' \ $WORKSPACE/fdroidserver/build.py +printf '\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\nbuild all\n' $WORKSPACE/fdroid build --verbose --latest --no-tarball --all $wikiflag vagrant global-status From 5346ea3c19279f667c1c933fcdf29aa0f665c8b1 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 14 Apr 2021 22:54:48 +0200 Subject: [PATCH 0231/2116] gitlab-ci: prevent dualing linters: pyflakes vs mypy * pyflakes says: "typing.Dict' imported but unused" * mypy says: "Name 'Dict' is not defined" --- .gitlab-ci.yml | 3 ++- fdroidserver/apksigcopier.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3310b410..1f02ba77 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -193,7 +193,8 @@ lint_mypy: script: - pip install mypy - pip install -e .[test] - - mypy + # exclude vendored file + - mypy --exclude fdroidserver/apksigcopier.py fedora_latest: image: fedora:latest diff --git a/fdroidserver/apksigcopier.py b/fdroidserver/apksigcopier.py index 48b72ce1..bb4e9b22 100644 --- a/fdroidserver/apksigcopier.py +++ b/fdroidserver/apksigcopier.py @@ -96,7 +96,7 @@ class ZipError(APKSigCopierError): class ReproducibleZipInfo(zipfile.ZipInfo): """Reproducible ZipInfo hack.""" - _override = {} # type: Dict[str, Any] + _override = {} def __init__(self, zinfo, **override): if override: From b08d54cb90ed5a70bce4e365f770a3f1f921c21c Mon Sep 17 00:00:00 2001 From: "Felix C. Stegerman" Date: Wed, 14 Apr 2021 23:52:13 +0200 Subject: [PATCH 0232/2116] fix metadata_find_signing_files() --- fdroidserver/common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index c388fa63..86cc6403 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3006,8 +3006,8 @@ def metadata_find_signing_files(appid, vercode): + glob.glob(os.path.join(sigdir, '*.RSA')) ) signature_block_pat = re.compile(r'(\.DSA|\.EC|\.RSA)$') - apk_signing_block = os.path.isfile(os.path.join(sigdir, "APKSigningBlock")) - apk_signing_block_offset = os.path.isfile(os.path.join(sigdir, "APKSigningBlockOffset")) + apk_signing_block = os.path.join(sigdir, "APKSigningBlock") + apk_signing_block_offset = os.path.join(sigdir, "APKSigningBlockOffset") if os.path.isfile(apk_signing_block) and os.path.isfile(apk_signing_block_offset): v2_files = apk_signing_block, apk_signing_block_offset else: From f01a3caf77a22cc08184089406c81cc72f7ef536 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 14 Apr 2021 23:32:50 +0200 Subject: [PATCH 0233/2116] Bump METADATA_VERSION for apksigner transition We switched to apksigner in 50f0534d but old apks where still verified with jarsigner (or an old apksigner version). Bumping the METADATA_VERSION to force a rebuild of apkcache. Hopefully this resolves de.chagemann.regexcrossword getting the KnownVuln, DisabledAlgorithm tags. --- fdroidserver/update.py | 2 +- tests/repo/index-v1.json | 2 +- tests/repo/index.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 8b372a74..93b7bec2 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -56,7 +56,7 @@ if hasattr(Image, 'DecompressionBombWarning'): warnings.simplefilter('error', Image.DecompressionBombWarning) Image.MAX_IMAGE_PIXELS = 0xffffff # 4096x4096 -METADATA_VERSION = 20000 +METADATA_VERSION = 20001 # less than the valid range of versionCode, i.e. Java's Integer.MIN_VALUE UNSET_VERSION_CODE = -0x100000000 diff --git a/tests/repo/index-v1.json b/tests/repo/index-v1.json index 068bd480..b6b870bc 100644 --- a/tests/repo/index-v1.json +++ b/tests/repo/index-v1.json @@ -1,7 +1,7 @@ { "repo": { "timestamp": 1502845383782, - "version": 20000, + "version": 20001, "name": "My First F-Droid Repo Demo", "icon": "icon.png", "address": "https://MyFirstFDroidRepo.org/fdroid/repo", diff --git a/tests/repo/index.xml b/tests/repo/index.xml index 110ff540..78fd1c99 100644 --- a/tests/repo/index.xml +++ b/tests/repo/index.xml @@ -1,6 +1,6 @@ - + This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid. http://foobarfoobarfoobar.onion/fdroid/repo https://foo.bar/fdroid/repo From 760fdf3bd23107369b254117ef5e2273478f27f2 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 15 Apr 2021 09:21:48 +0200 Subject: [PATCH 0234/2116] jenkins-build-all: fix failure when trying to rm a dir + for f in metadata/*/signatures/* ++++ dirname metadata/de.schildbach.wallet/signatures/370 +++ dirname metadata/de.schildbach.wallet/signatures ++ basename metadata/de.schildbach.wallet Wed 14 Apr 2021 11:50:34 PM UTC - cleanup in progress... Wed 14 Apr 2021 11:50:34 PM UTC - cleanup done. + appid=de.schildbach.wallet ++ basename metadata/de.schildbach.wallet/signatures/370 + versionCode=370 + rm -f repo/de.schildbach.wallet_427.apk repo/de.schildbach.wallet_427.apk.asc repo/de.schildbach.wallet_427.log.gz repo/de.schildbach.wallet_test repo/de.schildbach.wallet_test_427.apk repo/de.schildbach.wallet_test_427.apk.asc repo/de.schildbach.wallet_test_427.log.gz 'archive/de.schildbach.wallet_*' 'unsigned/de.schildbach.wallet_*' rm: cannot remove 'repo/de.schildbach.wallet_test': Is a directory --- jenkins-build-all | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jenkins-build-all b/jenkins-build-all index 282a4ab6..e6bbeccc 100755 --- a/jenkins-build-all +++ b/jenkins-build-all @@ -99,13 +99,13 @@ printf '\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\nbuild all with reproducible signatures for f in metadata/*/signatures/*; do appid=$(basename $(dirname $(dirname $f))) versionCode=$(basename $f) - rm -f repo/${appid}_* archive/${appid}_* unsigned/${appid}_* + rm -f repo/${appid}_*.* archive/${appid}_*.* unsigned/${appid}_*.* $WORKSPACE/fdroid build --verbose --latest --no-tarball ${appid}:$versionCode done printf '\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\nbuild all with Binaries:\n' for appid in `grep '^Binaries: ' metadata/*.yml --files-with-match | sed 's,^metadata/\(.*\)\.yml$,\1,'`; do - rm -f repo/${appid}_* archive/${appid}_* unsigned/${appid}_* + rm -f repo/${appid}_*.* archive/${appid}_*.* unsigned/${appid}_*.* $WORKSPACE/fdroid build --verbose --latest --no-tarball ${appid} done From 184d2f97d2a2b5e678e936ee5687e6acca3def01 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 15 Apr 2021 16:52:54 +0200 Subject: [PATCH 0235/2116] jenkins-build-all: stop deleting previous builds results --- jenkins-build-all | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jenkins-build-all b/jenkins-build-all index e6bbeccc..ee6a9850 100755 --- a/jenkins-build-all +++ b/jenkins-build-all @@ -99,7 +99,7 @@ printf '\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\nbuild all with reproducible signatures for f in metadata/*/signatures/*; do appid=$(basename $(dirname $(dirname $f))) versionCode=$(basename $f) - rm -f repo/${appid}_*.* archive/${appid}_*.* unsigned/${appid}_*.* + rm -f repo/${appid}_${versionCode}*.* archive/${appid}_${versionCode}*.* unsigned/${appid}_${versionCode}*.* $WORKSPACE/fdroid build --verbose --latest --no-tarball ${appid}:$versionCode done From 634864f206cd7627776ee0713d534b54c40f9491 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 6 Apr 2021 11:52:44 +0200 Subject: [PATCH 0236/2116] gitlab-ci: document jobs --- .gitlab-ci.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1f02ba77..6babc37f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,6 +5,7 @@ variables: GIT_DEPTH: 1 +# Run the whole test suite in an environment that is like the buildserver guest VM. ci-images-base run-tests: image: registry.gitlab.com/fdroid/ci-images-base script: @@ -67,6 +68,11 @@ metadata_v0: - apt-get update - apt-get dist-upgrade + +# Since F-Droid uses Debian as its default platform, from production +# servers to CI to contributor machines, it is important to know when +# changes in Debian break our stuff. This tests against the latest +# dependencies as they are included in Debian. debian_testing: image: debian:testing <<: *apt-template @@ -88,6 +94,7 @@ debian_testing: - cd tests - ./run-tests + # Test using latest LTS set up with the PPA, including Recommends. ubuntu_lts_ppa: image: ubuntu:latest @@ -106,6 +113,7 @@ ubuntu_lts_ppa: - cd tests - ./run-tests + # Test using Ubuntu/bionic LTS (supported til 2022) with all depends # from pypi. The venv is used to isolate the dist tarball generation # environment from the clean install environment. @@ -131,6 +139,7 @@ ubuntu_bionic_pip: - cd fdroidserver-* - fdroid=`which fdroid` ./tests/run-tests + # test install process on a bleeding edge distro with pip arch_pip_install: image: archlinux/base @@ -144,6 +153,8 @@ arch_pip_install: - fdroid update --help +# The gradlew-fdroid tests are isolated from the rest of the test +# suite, so they run as their own job. gradlew-fdroid: image: debian:bullseye <<: *apt-template @@ -157,6 +168,7 @@ gradlew-fdroid: - ./tests/test-gradlew-fdroid +# Run all the various linters and static analysis tools. lint_format_safety_bandit_checks: image: alpine:3.10 # cannot upgrade until bandit supports Python 3.8 variables: @@ -188,6 +200,7 @@ lint_format_safety_bandit_checks: - pybabel compile --domain=fdroidserver --directory locale 2>&1 | (grep -F "error:" && exit 1) || true - exit $EXITVALUE + lint_mypy: image: python:3.9-buster script: @@ -196,6 +209,7 @@ lint_mypy: # exclude vendored file - mypy --exclude fdroidserver/apksigcopier.py + fedora_latest: image: fedora:latest only: @@ -246,6 +260,7 @@ fedora_latest: - su testuser --login --command "cd `pwd`; export ANDROID_HOME=$ANDROID_HOME; fdroid=~testuser/.local/bin/fdroid ./run-tests" + gradle: image: debian:bullseye <<: *apt-template @@ -272,6 +287,8 @@ gradle: fi - ./tests/gradle-release-checksums.py + +# Run an actual build in a simple, faked version of the buildserver guest VM. fdroid build: image: registry.gitlab.com/fdroid/ci-images-client only: @@ -318,6 +335,10 @@ fdroid build: - fdroid build --verbose --on-server --no-tarball --latest org.fdroid.fdroid +# test the plugin API and specifically the fetchsrclibs plugin, which +# is used by the `fdroid build` job. This uses a fixed commit from +# fdroiddata because that one is known to work, and this is a CI job, +# so it should be isolated from the normal churn of fdroiddata. plugin_fetchsrclibs: image: debian:buster <<: *apt-template From 3d69e767d840eadf45093bb74106eefc3f39e746 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 7 Apr 2021 12:54:20 +0200 Subject: [PATCH 0237/2116] common: test abs and rel paths in get_all_gradle_and_manifests() --- tests/common.TestCase | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/common.TestCase b/tests/common.TestCase index ddb2f07d..a58ca0a3 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1129,6 +1129,7 @@ class CommonTest(unittest.TestCase): fdroidserver.common.parse_androidmanifests(paths, app)) def test_get_all_gradle_and_manifests(self): + """Test whether the function works with relative and absolute paths""" a = fdroidserver.common.get_all_gradle_and_manifests(os.path.join('source-files', 'cn.wildfirechat.chat')) paths = [ os.path.join('source-files', 'cn.wildfirechat.chat', 'avenginekit', 'build.gradle'), @@ -1145,6 +1146,11 @@ class CommonTest(unittest.TestCase): ] self.assertEqual(sorted(paths), sorted(a)) + abspath = os.path.join(self.basedir, 'source-files', 'realm') + p = fdroidserver.common.get_all_gradle_and_manifests(abspath) + self.assertEqual(1, len(p)) + self.assertTrue(p[0].startswith(abspath)) + def test_get_gradle_subdir(self): subdirs = { 'cn.wildfirechat.chat': 'chat', From 6097caef91017e1567eb43106d3fe07785605f1e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 12 Apr 2021 09:19:11 +0200 Subject: [PATCH 0238/2116] build: fix typo in regex for Binaries: verification --- fdroidserver/build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index d1b347d6..3b62f692 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -1126,7 +1126,7 @@ def main(): url = url.replace('%v', build.versionName) url = url.replace('%c', str(build.versionCode)) logging.info("...retrieving " + url) - of = re.sub(r'.apk$', '.binary.apk', common.get_release_filename(app, build)) + of = re.sub(r'\.apk$', '.binary.apk', common.get_release_filename(app, build)) of = os.path.join(binaries_dir, of) try: net.download_file(url, local_filename=of) From 0b0bc803b7f5efb6bd279c939771a9447eeaabb1 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 14 Apr 2021 09:59:13 +0200 Subject: [PATCH 0239/2116] build: --test now keeps unsigned APKs in tmp/ that fail to reproduce Before, whenever an unsigned APK failed to reproduce, it was just deleted. That makes debugging hard. This makes it keep the unsigned APK, which is written in tmp/ when using --test. @jspricke this is related to !864 --- fdroidserver/build.py | 8 +++- tests/build.TestCase | 102 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+), 2 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 3b62f692..76f4d930 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -1146,8 +1146,12 @@ def main(): compare_result = \ common.verify_apks(of, unsigned_apk, tmpdir) if compare_result: - logging.debug('removing %s', unsigned_apk) - os.remove(unsigned_apk) + if options.test: + logging.warning(_('Keeping failed build "{apkfilename}"') + .format(apkfilename=unsigned_apk)) + else: + logging.debug('removing %s', unsigned_apk) + os.remove(unsigned_apk) logging.debug('removing %s', of) os.remove(of) compare_result = compare_result.split('\n') diff --git a/tests/build.TestCase b/tests/build.TestCase index da8bd7d2..9645f583 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -11,6 +11,7 @@ import sys import tempfile import textwrap import unittest +import yaml from unittest import mock localmodule = os.path.realpath( @@ -40,6 +41,11 @@ class BuildTest(unittest.TestCase): fdroidserver.common.config = None fdroidserver.build.config = None + def create_fake_android_home(self, d): + os.makedirs(os.path.join(d, 'build-tools'), exist_ok=True) + os.makedirs(os.path.join(d, 'platform-tools'), exist_ok=True) + os.makedirs(os.path.join(d, 'tools'), exist_ok=True) + def test_get_apk_metadata(self): config = dict() fdroidserver.common.fill_config_defaults(config) @@ -206,6 +212,102 @@ class BuildTest(unittest.TestCase): count = fdroidserver.scanner.scan_source("build", build) self.assertEqual(0, count, "Shouldn't error on jar from extlib") + def test_failed_verifies_are_not_in_unsigned(self): + + class FakeProcess: + output = 'fake output' + returncode = 0 + + def __init__(self, args, **kwargs): + print('FakeFDroidPopen', args, kwargs) + + testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + os.chdir(testdir) + sdk_path = os.path.join(testdir, 'android-sdk') + self.create_fake_android_home(sdk_path) + with open('config.yml', 'w') as fp: + yaml.dump({'sdk_path': sdk_path}, fp) + os.chmod('config.yml', 0o600) + fdroidserver.common.build = fdroidserver.common.read_config() + + os.mkdir('metadata') + appid = 'info.guardianproject.checkey' + metadata_file = os.path.join('metadata', appid + '.yml') + shutil.copy(os.path.join(self.basedir, metadata_file), + 'metadata') + with open(metadata_file) as fp: + app = fdroidserver.metadata.App(yaml.safe_load(fp)) + app['RepoType'] = 'git' + app['Binaries'] = 'https://example.com/fdroid/repo/info.guardianproject.checkey_%v.apk' + build = fdroidserver.metadata.Build({ + 'versionCode': 123, + 'versionName': '1.2.3', + 'commit': '1.2.3', + 'disable': False, + }) + app['Builds'] = [build] + fdroidserver.metadata.write_metadata(metadata_file, app) + + os.makedirs(os.path.join('unsigned', 'binaries')) + production_result = os.path.join('unsigned', '%s_%d.apk' % (appid, build['versionCode'])) + production_compare_file = os.path.join('unsigned', 'binaries', + '%s_%d.binary.apk' % (appid, build['versionCode'])) + os.makedirs(os.path.join('tmp', 'binaries')) + test_result = os.path.join('tmp', '%s_%d.apk' % (appid, build['versionCode'])) + test_compare_file = os.path.join( + 'tmp', 'binaries', '%s_%d.binary.apk' % (appid, build['versionCode']) + ) + with mock.patch( + 'fdroidserver.common.force_exit', lambda *args: None + ) as a, mock.patch( + 'fdroidserver.common.get_android_tools_version_log', lambda s: 'fake' + ) as b, mock.patch( + 'fdroidserver.common.FDroidPopen', FakeProcess + ) as c, mock.patch( + 'fdroidserver.build.FDroidPopen', FakeProcess + ) as d, mock.patch( + 'fdroidserver.build.trybuild', lambda *args: True + ) as e, mock.patch( + 'fdroidserver.net.download_file', lambda *args, **kwargs: None + ) as f: + a, b, c, d, e, f # silence linters' "unused" warnings + + with mock.patch('sys.argv', ['fdroid build', appid]): + # successful comparison + open(production_result, 'w').close() + open(production_compare_file, 'w').close() + with mock.patch('fdroidserver.common.verify_apks', lambda *args: None): + fdroidserver.build.main() + self.assertTrue(os.path.exists(production_result)) + self.assertTrue(os.path.exists(production_compare_file)) + # failed comparison + open(production_result, 'w').close() + open(production_compare_file, 'w').close() + with mock.patch('fdroidserver.common.verify_apks', lambda *args: 'failed'): + fdroidserver.build.main() + self.assertFalse(os.path.exists(production_result)) + self.assertFalse(os.path.exists(production_compare_file)) + + with mock.patch('sys.argv', ['fdroid build', '--test', appid]): + # successful comparison + open(test_result, 'w').close() + open(test_compare_file, 'w').close() + with mock.patch('fdroidserver.common.verify_apks', lambda *args: None): + fdroidserver.build.main() + self.assertTrue(os.path.exists(test_result)) + self.assertTrue(os.path.exists(test_compare_file)) + self.assertFalse(os.path.exists(production_result)) + self.assertFalse(os.path.exists(production_compare_file)) + # failed comparison + open(test_result, 'w').close() + open(test_compare_file, 'w').close() + with mock.patch('fdroidserver.common.verify_apks', lambda *args: 'failed'): + fdroidserver.build.main() + self.assertTrue(os.path.exists(test_result)) + self.assertFalse(os.path.exists(test_compare_file)) + self.assertFalse(os.path.exists(production_result)) + self.assertFalse(os.path.exists(production_compare_file)) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From b220ddc555bb28dc6aff9156d824baeabedf5d17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit+git@posteo.de> Date: Mon, 3 May 2021 09:59:29 +0200 Subject: [PATCH 0240/2116] Fix: Changelog.md dates incorrect year closes fdroid/fdroidserver#896 --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c07b9cb4..b237cc6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## [Unreleased] -## [2.0.1] - 2020-03-09 +## [2.0.1] - 2021-03-09 ### Fixed @@ -21,7 +21,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) * checkupdates: set User-Agent to make gitlab.com happy * Run push_binary_transparency only once -## [2.0] - 2020-01-31 +## [2.0] - 2021-01-31 For a more complete overview, see the [2.0 milestone](https://gitlab.com/fdroid/fdroidserver/-/milestones/10) From 2b21584b355c3b913798e99d2d4433cc239bf46a Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Mon, 10 May 2021 06:48:16 +0000 Subject: [PATCH 0241/2116] gradle v7.0 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index c1e9c1a7..ae27a6a5 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -162,6 +162,7 @@ get_sha() { '6.8.1') echo 'fd591a34af7385730970399f473afabdb8b28d57fd97d6625c388d090039d6fd' ;; '6.8.2') echo '8de6efc274ab52332a9c820366dd5cf5fc9d35ec7078fd70c8ec6913431ee610' ;; '6.8.3') echo '7faa7198769f872826c8ef4f1450f839ec27f0b4d5d1e51bade63667cbccd205' ;; + '6.9') echo '765442b8069c6bee2ea70713861c027587591c6b1df2c857a23361512560894e' ;; '7.0') echo 'eb8b89184261025b0430f5b2233701ff1377f96da1ef5e278af6ae8bac5cc305' ;; *) exit 1 esac @@ -183,7 +184,7 @@ d_plugin_k=(4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 d_plugin_v=(6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(7.0 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(7.0 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 022d0796d88cd58cec4ab1d10d961b4058c6d1e0 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 10 May 2021 16:02:41 +0200 Subject: [PATCH 0242/2116] gitlab-ci: use latest alpine/bandit to fix CVE flagged by safety --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6babc37f..2e7b8ce4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -170,19 +170,19 @@ gradlew-fdroid: # Run all the various linters and static analysis tools. lint_format_safety_bandit_checks: - image: alpine:3.10 # cannot upgrade until bandit supports Python 3.8 + image: alpine:3.13 variables: LANG: C.UTF-8 script: - apk add --no-cache bash build-base dash ca-certificates gcc python3 python3-dev - python3 -m ensurepip - - $pip install Babel 'bandit<1.6.0' pycodestyle pyflakes pylint safety + - $pip install Babel bandit pycodestyle pyflakes pylint safety - export EXITVALUE=0 - function set_error() { export EXITVALUE=1; printf "\x1b[31mERROR `history|tail -2|head -1|cut -b 6-500`\x1b[0m\n"; } - ./hooks/pre-commit || set_error - bandit -ii - -s B110,B322,B404,B408,B410,B603,B607 + -s B110,B404,B408,B410,B603,B607 -r $CI_PROJECT_DIR fdroid || set_error - safety check --full-report || set_error From a15581faa93e29d19715771732670d6b9c3b03f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit+git@posteo.de> Date: Mon, 3 May 2021 15:35:11 +0200 Subject: [PATCH 0243/2116] Draft: set up docs based on docstrings and publish HTML versions --- .gitlab-ci.yml | 12 ++++++++ docs/Makefile | 20 ++++++++++++ docs/make.bat | 35 +++++++++++++++++++++ docs/source/conf.py | 75 +++++++++++++++++++++++++++++++++++++++++++++ setup.py | 5 +++ 5 files changed, 147 insertions(+) create mode 100644 docs/Makefile create mode 100644 docs/make.bat create mode 100644 docs/source/conf.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2e7b8ce4..a8413e21 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -412,3 +412,15 @@ servergitmirrors: - echo $DLURL - wget $DLURL/index-v1.jar - diff repo/index-v1.jar index-v1.jar + +Build documentation: + image: python:3.9-buster + script: + - pip install -e .[docs] + - cd docs + - sphinx-apidoc -o ./source ../fdroidserver -M -e + - sphinx-autogen -o generated source/*.rst + - make html + artifacts: + paths: + - docs/build/html/ \ No newline at end of file diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 00000000..d0c3cbf1 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 00000000..6247f7e2 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 00000000..a6091df9 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,75 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys +sys.path.insert(0, os.path.abspath('../../fdroidserver')) + +# -- Project information ----------------------------------------------------- + +project = 'fdroidserver' +copyright = '2021, The F-Droid Project' +author = 'The F-Droid Project' + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'numpydoc', + 'sphinx.ext.autodoc', + 'sphinx.ext.autosummary', +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = "pydata_sphinx_theme" + +html_theme_options = { + "gitlab_url": "https://gitlab.com/fdroid/fdroidserver", + "show_prev_next": False, + "navbar_end": ["search-field.html", "navbar-icon-links.html"], +} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +html_sidebars = { + "**": [], +} + +#html_sidebars = { +# '**': ['globaltoc.html', 'sourcelink.html', 'searchbox.html'], +# 'using/windows': ['windowssidebar.html', 'searchbox.html'], +#} + +html_split_index = True +#numpydoc_validation_checks = {"all"} + + + diff --git a/setup.py b/setup.py index 0505e396..3e551e46 100755 --- a/setup.py +++ b/setup.py @@ -92,6 +92,11 @@ setup(name='fdroidserver', 'pyjks', 'html5print' ], + 'docs': [ + 'sphinx', + 'numpydoc', + 'pydata_sphinx_theme', + ] }, classifiers=[ 'Development Status :: 4 - Beta', From 47cd1dd0559edb3ab4e417da788e19fd174bc96b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit+git@posteo.de> Date: Mon, 3 May 2021 15:38:01 +0200 Subject: [PATCH 0244/2116] Add missing index.rst --- docs/source/index.rst | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 docs/source/index.rst diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 00000000..33280932 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,20 @@ +.. fdroidserver documentation master file, created by + sphinx-quickstart on Mon May 3 10:06:52 2021. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to fdroidserver's documentation! +======================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` From bdcd843d75a529850322876a935ccea4bbb4b292 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit+git@posteo.de> Date: Mon, 10 May 2021 07:50:45 +0200 Subject: [PATCH 0245/2116] Publish docu to GL Pages --- .gitlab-ci.yml | 14 +++++++++++++- docs/source/index.rst | 10 +++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a8413e21..de9523c0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -423,4 +423,16 @@ Build documentation: - make html artifacts: paths: - - docs/build/html/ \ No newline at end of file + - docs/build/html/ + +pages: + image: alpine:latest + stage: deploy + script: + - cp docs/build/html public -r # GL Pages needs the files in a directory named "public" + artifats: + paths: + - public + needs: ["Build documentation"] + #rules: # TODO: activate before merge + # - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' # only publish pages on default (master) branch \ No newline at end of file diff --git a/docs/source/index.rst b/docs/source/index.rst index 33280932..fcd4dfe3 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -9,12 +9,12 @@ Welcome to fdroidserver's documentation! .. toctree:: :maxdepth: 2 :caption: Contents: - - + +These pages contain the autogenerated module docu based on the current `sources `_. Indices and tables ================== -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` + +* Under :ref:`modindex` the different fdroidserver modules are listed. +* In :ref:`genindex` you'll find all methods sorted alphabetically. From 245aeec97227c6df39c54846db38ffcf65c56491 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit+git@posteo.de> Date: Mon, 10 May 2021 07:53:21 +0200 Subject: [PATCH 0246/2116] Publish docu to GL Pages --- .gitignore | 3 +++ .gitlab-ci.yml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 48ba212c..44799e9a 100644 --- a/.gitignore +++ b/.gitignore @@ -68,3 +68,6 @@ makebuildserver.config.py # generated by gettext locale/*/LC_MESSAGES/fdroidserver.mo + +# sphinx +public/ \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index de9523c0..b8f2d80e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -430,7 +430,7 @@ pages: stage: deploy script: - cp docs/build/html public -r # GL Pages needs the files in a directory named "public" - artifats: + artifacts: paths: - public needs: ["Build documentation"] From 6791c3a550e935abd9139d3da9ba5213b0e987c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit+git@posteo.de> Date: Mon, 10 May 2021 08:06:08 +0200 Subject: [PATCH 0247/2116] Only publish pages on default branch --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b8f2d80e..e8180653 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -434,5 +434,5 @@ pages: paths: - public needs: ["Build documentation"] - #rules: # TODO: activate before merge - # - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' # only publish pages on default (master) branch \ No newline at end of file + rules: + - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' # only publish pages on default (master) branch \ No newline at end of file From 22c32752de850f3304e401179aa78eec3e247261 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 29 Apr 2021 13:57:55 +0200 Subject: [PATCH 0248/2116] Don't remove logs of disabled builds We need them to debug problems. --- fdroidserver/update.py | 1 - 1 file changed, 1 deletion(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 93b7bec2..43b6f26f 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -437,7 +437,6 @@ def delete_disabled_builds(apps, apkcache, repodirs): os.path.join(repodir, apkfilename), os.path.join(repodir, apkfilename + '.asc'), os.path.join(repodir, apkfilename[:-4] + "_src.tar.gz"), - os.path.join(repodir, apkfilename[:-4] + ".log.gz"), ] for density in all_screen_densities: repo_dir = get_icon_dir(repodir, density) From e0f825d636637c0eadfe82cf7e8cfed17e5717b5 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Thu, 13 May 2021 12:02:17 +0000 Subject: [PATCH 0249/2116] gradle v7.0.1 --- gradlew-fdroid | 3 ++- makebuildserver | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index ae27a6a5..d747588a 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -164,6 +164,7 @@ get_sha() { '6.8.3') echo '7faa7198769f872826c8ef4f1450f839ec27f0b4d5d1e51bade63667cbccd205' ;; '6.9') echo '765442b8069c6bee2ea70713861c027587591c6b1df2c857a23361512560894e' ;; '7.0') echo 'eb8b89184261025b0430f5b2233701ff1377f96da1ef5e278af6ae8bac5cc305' ;; + '7.0.1') echo 'dccda8aa069563c8ba2f6cdfd0777df0e34a5b4d15138ca8b9757e94f4e8a8cb' ;; *) exit 1 esac } @@ -184,7 +185,7 @@ d_plugin_k=(4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 d_plugin_v=(6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(7.0 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(7.0.1 7.0 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} diff --git a/makebuildserver b/makebuildserver index 0d6fc252..c827a161 100755 --- a/makebuildserver +++ b/makebuildserver @@ -287,6 +287,8 @@ CACHE_FILES = [ '7faa7198769f872826c8ef4f1450f839ec27f0b4d5d1e51bade63667cbccd205'), ('https://services.gradle.org/distributions/gradle-7.0-bin.zip', 'eb8b89184261025b0430f5b2233701ff1377f96da1ef5e278af6ae8bac5cc305'), + ('https://services.gradle.org/distributions/gradle-7.0.1-bin.zip', + 'dccda8aa069563c8ba2f6cdfd0777df0e34a5b4d15138ca8b9757e94f4e8a8cb'), ('https://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin', '102d6723f67ff1384330d12c45854315d6452d6510286f4e5891e00a5a8f1d5a'), ('https://dl.google.com/android/repository/android-ndk-r11c-linux-x86_64.zip', From 33fa918a6953c3355b8c824f9219341a94cff172 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 13 May 2021 10:30:48 +0200 Subject: [PATCH 0250/2116] [status_json] Don't list disabled builds as needs updated Closes: #898 --- fdroidserver/update.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 43b6f26f..8069390f 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -182,12 +182,12 @@ def status_update_json(apps, apks): if appid not in failedBuilds: failedBuilds[appid] = [] failedBuilds[appid].append(build.versionCode) - if validapks == 0: - output['noPackages'].append(appid) - if not gotcurrentver: - output['needsUpdate'].append(appid) - if app.get('UpdateCheckMode') == 'None' and not app.get('Disabled'): - output['noUpdateCheck'].append(appid) + if validapks == 0: + output['noPackages'].append(appid) + if not gotcurrentver: + output['needsUpdate'].append(appid) + if app.get('UpdateCheckMode') == 'None': + output['noUpdateCheck'].append(appid) common.write_status_json(output, options.pretty) From 31c0078b538467d828f02c5f90118bab0ac9c2ef Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 13 May 2021 14:03:29 +0200 Subject: [PATCH 0251/2116] [status_json] Add list of archivePolicy0 --- fdroidserver/update.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 8069390f..0866d9f0 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -140,6 +140,7 @@ def status_update_json(apps, apks): output = common.setup_status_output(start_timestamp) output['antiFeatures'] = dict() output['disabled'] = [] + output['archivePolicy0'] = [] output['failedBuilds'] = dict() output['noPackages'] = [] output['needsUpdate'] = [] @@ -168,6 +169,8 @@ def status_update_json(apps, apks): validapks = 0 if app.get('Disabled'): output['disabled'].append(appid) + elif app.get("ArchivePolicy") and int(app["ArchivePolicy"][:-9]) == 0: + output['archivePolicy0'].append(appid) else: for build in app.get('Builds', []): if not build.get('disable'): From 84b6617faf71b78c0ccd1c51b0ec53cb5b1c4aad Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sat, 1 May 2021 09:46:24 +0200 Subject: [PATCH 0252/2116] Don't return Gradle variables as string This is used in checkupdates and currently sets the AutoName to something like ${displayName}: https://gitlab.com/fdroid/fdroiddata/-/commit/4ae415f73c7e70ca41139746c1425c1d59d7d4a5 --- fdroidserver/common.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 86cc6403..df884b6d 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1425,7 +1425,11 @@ def unescape_string(string): def retrieve_string(app_dir, string, xmlfiles=None): - if not string.startswith('@string/'): + if string.startswith('@string/'): + name = string[len('@string/'):] + elif string.startswith('${'): + return '' # Gradle variable + else: return unescape_string(string) if xmlfiles is None: @@ -1438,8 +1442,6 @@ def retrieve_string(app_dir, string, xmlfiles=None): if os.path.basename(root) == 'values': xmlfiles += [os.path.join(root, x) for x in files if x.endswith('.xml')] - name = string[len('@string/'):] - def element_content(element): if element.text is None: return "" From e4a7726033613aed4455c6c5189d40f5a21270b0 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 13 May 2021 15:42:36 +0200 Subject: [PATCH 0253/2116] gitlab-ci: fix archlinux docker image --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e8180653..3fae5c80 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -142,7 +142,7 @@ ubuntu_bionic_pip: # test install process on a bleeding edge distro with pip arch_pip_install: - image: archlinux/base + image: archlinux only: - master@fdroid/fdroidserver script: From 927aa95cd86663ce2832d6bbc6c3895fd088733b Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Mon, 17 May 2021 16:59:55 +0000 Subject: [PATCH 0254/2116] gradle v7.0.2 --- gradlew-fdroid | 3 ++- makebuildserver | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index d747588a..ea4272f0 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -165,6 +165,7 @@ get_sha() { '6.9') echo '765442b8069c6bee2ea70713861c027587591c6b1df2c857a23361512560894e' ;; '7.0') echo 'eb8b89184261025b0430f5b2233701ff1377f96da1ef5e278af6ae8bac5cc305' ;; '7.0.1') echo 'dccda8aa069563c8ba2f6cdfd0777df0e34a5b4d15138ca8b9757e94f4e8a8cb' ;; + '7.0.2') echo '0e46229820205440b48a5501122002842b82886e76af35f0f3a069243dca4b3c' ;; *) exit 1 esac } @@ -185,7 +186,7 @@ d_plugin_k=(4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 d_plugin_v=(6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(7.0.1 7.0 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(7.0.2 7.0.1 7.0 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} diff --git a/makebuildserver b/makebuildserver index c827a161..01b45a30 100755 --- a/makebuildserver +++ b/makebuildserver @@ -289,6 +289,8 @@ CACHE_FILES = [ 'eb8b89184261025b0430f5b2233701ff1377f96da1ef5e278af6ae8bac5cc305'), ('https://services.gradle.org/distributions/gradle-7.0.1-bin.zip', 'dccda8aa069563c8ba2f6cdfd0777df0e34a5b4d15138ca8b9757e94f4e8a8cb'), + ('https://services.gradle.org/distributions/gradle-7.0.2-bin.zip', + '0e46229820205440b48a5501122002842b82886e76af35f0f3a069243dca4b3c'), ('https://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin', '102d6723f67ff1384330d12c45854315d6452d6510286f4e5891e00a5a8f1d5a'), ('https://dl.google.com/android/repository/android-ndk-r11c-linux-x86_64.zip', From 0fbd04f1c25170d2bd566225af17cc97c2a9d5e8 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 11 May 2021 20:25:51 +0200 Subject: [PATCH 0255/2116] remove redundant imports and pointless code --- fdroidserver/index.py | 1 - fdroidserver/init.py | 3 --- fdroidserver/metadata.py | 4 ---- fdroidserver/update.py | 1 - locale/pick-complete-translations.py | 1 - 5 files changed, 10 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 10dea357..1f30bd48 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -957,7 +957,6 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing % repo_icon) os.makedirs(os.path.dirname(iconfilename), exist_ok=True) try: - import qrcode qrcode.make(common.config['repo_url']).save(iconfilename) except Exception: exampleicon = os.path.join(common.get_examples_dir(), diff --git a/fdroidserver/init.py b/fdroidserver/init.py index 8291612d..e66d4daa 100644 --- a/fdroidserver/init.py +++ b/fdroidserver/init.py @@ -66,7 +66,6 @@ def main(): help=_("Do not prompt for Android SDK path, just fail")) options = parser.parse_args() - aapt = None fdroiddir = os.getcwd() test_config = dict() examplesdir = common.get_examples_dir() @@ -227,8 +226,6 @@ def main(): msg = '\n' msg += _('Built repo based in "%s" with this config:') % fdroiddir msg += '\n\n Android SDK:\t\t\t' + config['sdk_path'] - if aapt: - msg += '\n Android SDK Build Tools:\t' + os.path.dirname(aapt) msg += '\n Android NDK r12b (optional):\t$ANDROID_NDK' msg += '\n ' + _('Keystore for signing key:\t') + keystore if repo_keyalias is not None: diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index d5911a8d..597c4cd2 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -890,10 +890,6 @@ def write_yaml(mf, app): _yaml_bools_plus_lists.extend(_yaml_bools_false) _yaml_bools_plus_lists.extend([[x] for x in _yaml_bools_false]) - def _class_as_dict_representer(dumper, data): - '''Creates a YAML representation of a App/Build instance''' - return dumper.represent_dict(data) - def _field_to_yaml(typ, value): if typ is TYPE_STRING: if value in _yaml_bools_plus_lists: diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 0866d9f0..9c563381 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -2067,7 +2067,6 @@ def create_metadata_from_template(apk): template: field sort order, empty field value, formatting, etc. ''' - import yaml if os.path.exists('template.yml'): with open('template.yml') as f: metatxt = f.read() diff --git a/locale/pick-complete-translations.py b/locale/pick-complete-translations.py index 99c1c125..3f343685 100755 --- a/locale/pick-complete-translations.py +++ b/locale/pick-complete-translations.py @@ -7,7 +7,6 @@ import os import re import requests import subprocess -import sys projectbasedir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) From 7a7ecbf9dc3027042459b8c63539790835c77d68 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 May 2021 09:43:48 +0200 Subject: [PATCH 0256/2116] move sha256sum() and sha256base64() to common --- fdroidserver/common.py | 25 +++++++++++++++++++++++++ fdroidserver/update.py | 35 +++++------------------------------ 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index df884b6d..ea9c7c26 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -58,6 +58,7 @@ try: except ImportError: import xml.etree.ElementTree as XMLElementTree # nosec this is a fallback only +from base64 import urlsafe_b64encode from binascii import hexlify from datetime import datetime, timedelta, timezone from distutils.version import LooseVersion @@ -3964,3 +3965,27 @@ def run_yamllint(path, indent=0): for problem in problems: result.append(' ' * indent + path + ':' + str(problem.line) + ': ' + problem.message) return '\n'.join(result) + + +def sha256sum(filename): + '''Calculate the sha256 of the given file''' + sha = hashlib.sha256() + with open(filename, 'rb') as f: + while True: + t = f.read(16384) + if len(t) == 0: + break + sha.update(t) + return sha.hexdigest() + + +def sha256base64(filename): + '''Calculate the sha256 of the given file as URL-safe base64''' + hasher = hashlib.sha256() + with open(filename, 'rb') as f: + while True: + t = f.read(16384) + if len(t) == 0: + break + hasher.update(t) + return urlsafe_b64encode(hasher.digest()).decode() diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 9c563381..1c3a1ed7 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -36,7 +36,6 @@ import yaml import copy from datetime import datetime from argparse import ArgumentParser -from base64 import urlsafe_b64encode try: from yaml import CSafeLoader as SafeLoader except ImportError: @@ -590,30 +589,6 @@ def get_icon_bytes(apkzip, iconsrc): return apkzip.read(iconsrc.encode('utf-8').decode('cp437')) -def sha256sum(filename): - '''Calculate the sha256 of the given file''' - sha = hashlib.sha256() - with open(filename, 'rb') as f: - while True: - t = f.read(16384) - if len(t) == 0: - break - sha.update(t) - return sha.hexdigest() - - -def sha256base64(filename): - '''Calculate the sha256 of the given file as URL-safe base64''' - hasher = hashlib.sha256() - with open(filename, 'rb') as f: - while True: - t = f.read(16384) - if len(t) == 0: - break - hasher.update(t) - return urlsafe_b64encode(hasher.digest()).decode() - - def has_known_vulnerability(filename): """checks for known vulnerabilities in the APK @@ -723,7 +698,7 @@ def insert_obbs(repodir, apps, apks): obbWarnDelete(f, _('OBB file has newer versionCode({integer}) than any APK:') .format(integer=str(versionCode))) continue - obbsha256 = sha256sum(f) + obbsha256 = common.sha256sum(f) obbs.append((packagename, versionCode, obbfile, obbsha256)) for apk in apks: @@ -1267,7 +1242,7 @@ def insert_localized_app_metadata(apps): if not os.path.samefile(f, basepath): os.unlink(f) else: - sha256 = sha256base64(f) + sha256 = common.sha256base64(f) filename = base + '_' + sha256 + '.' + extension index_file = os.path.join(os.path.dirname(f), filename) if not os.path.exists(index_file): @@ -1313,7 +1288,7 @@ def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False): raise FDroidException(_('{path} is zero size!') .format(path=filename)) - shasum = sha256sum(filename) + shasum = common.sha256sum(filename) usecache = False if name_utf8 in apkcache: repo_file = apkcache[name_utf8] @@ -1378,7 +1353,7 @@ def scan_apk(apk_file): :return A dict containing APK metadata """ apk = { - 'hash': sha256sum(apk_file), + 'hash': common.sha256sum(apk_file), 'hashType': 'sha256', 'uses-permission': [], 'uses-permission-sdk-23': [], @@ -1613,7 +1588,7 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal usecache = False if apkfilename in apkcache: apk = apkcache[apkfilename] - if apk.get('hash') == sha256sum(apkfile): + if apk.get('hash') == common.sha256sum(apkfile): logging.debug(_("Reading {apkfilename} from cache") .format(apkfilename=apkfilename)) usecache = True From 69fcd6a0249aac630bc1d59b77f780951b3d9716 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 May 2021 11:28:25 +0200 Subject: [PATCH 0257/2116] build: auto-download missing NDKS if they're known and can be verified refs #517 #717 --- fdroidserver/build.py | 5 +- fdroidserver/common.py | 262 +++++++++++++++++++++++++++++++++++++++++ tests/build.TestCase | 122 +++++++++++++++++-- 3 files changed, 378 insertions(+), 11 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 76f4d930..3e0b2243 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -367,7 +367,10 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext if k.endswith("_orig"): continue logging.critical(" %s: %s" % (k, v)) - raise FDroidException() + if onserver: + common.auto_install_ndk(build) + else: + raise FDroidException() elif not os.path.isdir(ndk_path): logging.critical("Android NDK '%s' is not a directory!" % ndk_path) raise FDroidException() diff --git a/fdroidserver/common.py b/fdroidserver/common.py index ea9c7c26..1194402e 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -69,6 +69,7 @@ from pyasn1.codec.der import decoder, encoder from pyasn1_modules import rfc2315 from pyasn1.error import PyAsn1Error +from . import net import fdroidserver.metadata import fdroidserver.lint from fdroidserver import _ @@ -3989,3 +3990,264 @@ def sha256base64(filename): break hasher.update(t) return urlsafe_b64encode(hasher.digest()).decode() + + +def get_ndk_version(ndk_path): + source_properties = os.path.join(ndk_path, 'source.properties') + if os.path.exists(source_properties): + with open(source_properties) as fp: + m = re.search(r'^Pkg.Revision *= *(.+)', fp.read(), flags=re.MULTILINE) + if m: + return m.group(1) + + +def auto_install_ndk(build): + """auto-install the NDK in the build, this assumes its in a buildserver guest VM + + Download, verify, and install the NDK version as specified via the + "ndk:" field in the build entry. As it uncompresses the zipball, + this forces the permissions to work for all users, since this + might uncompress as root and then be used from a different user. + + This needs to be able to install multiple versions of the NDK, + since this is also used in CI builds, where multiple `fdroid build + --onserver` calls can run in a single session. The production + buildserver is reset between every build. + + The default ANDROID_HOME base dir of /home/vagrant/android-sdk is + hard-coded in buildserver/Vagrantfile. The "ndk" subdir is where + Android Studio will install the NDK into versioned subdirs. + https://developer.android.com/studio/projects/configure-agp-ndk#agp_version_41 + + Also, r10e and older cannot be handled via this mechanism because + they are packaged differently. + + """ + global config + if build.get('disable'): + return + ndk = build.get('ndk') + if not ndk: + return + ndk_path = config.get(ndk) + if ndk_path and os.path.isdir(ndk_path): + return + for ndkdict in NDKS: + if ndk == ndkdict['release']: + url = ndkdict['url'] + sha256 = ndkdict['sha256'] + break + ndk_base = os.path.join(config['sdk_path'], 'ndk') + logging.info(_('Downloading %s') % url) + zipball = os.path.join( + tempfile.mkdtemp(prefix='android-ndk-'), + os.path.basename(url) + ) + net.download_file(url, zipball) + if sha256 != sha256sum(zipball): + raise FDroidException('SHA-256 %s does not match expected for %s' % (sha256, url)) + logging.info(_('Unzipping to %s') % ndk_base) + with zipfile.ZipFile(zipball) as zipfp: + for info in zipfp.infolist(): + permbits = info.external_attr >> 16 + if stat.S_ISDIR(permbits) or stat.S_IXUSR & permbits: + zipfp.extract(info.filename, path=ndk_base) + os.chmod(os.path.join(ndk_base, info.filename), 0o755) # nosec bandit B103 + else: + zipfp.extract(info.filename, path=ndk_base) + os.chmod(os.path.join(ndk_base, info.filename), 0o644) # nosec bandit B103 + os.remove(zipball) + extracted = glob.glob(os.path.join(ndk_base, '*'))[0] + version = get_ndk_version(extracted) + ndk_dir = os.path.join(ndk_base, version) + os.rename(extracted, ndk_dir) + if 'ndk_paths' not in config: + config['ndk_paths'] = dict() + config['ndk_paths'][ndk] = ndk_dir + logging.info(_('Set NDK {release} ({version}) up') + .format(release=ndk, version=version)) + + +"""Derived from https://gitlab.com/fdroid/android-sdk-transparency-log/-/blob/master/checksums.json""" +NDKS = [ + { + "release": "r11", + "revision": "11.0.2655954", + "sha256": "59ab44f7ee6201df4381844736fdc456134c7f7660151003944a3017a0dcce97", + "url": "https://dl.google.com/android/repository/android-ndk-r11-linux-x86_64.zip" + }, + { + "release": "r11b", + "revision": "11.1.2683735", + "sha256": "51d429bfda8bbe038683ed7ae7acc03b39604b84711901b555fe18c698867e53", + "url": "https://dl.google.com/android/repository/android-ndk-r11b-linux-x86_64.zip" + }, + { + "release": "r11c", + "revision": "11.2.2725575", + "sha256": "ba85dbe4d370e4de567222f73a3e034d85fc3011b3cbd90697f3e8dcace3ad94", + "url": "https://dl.google.com/android/repository/android-ndk-r11c-linux-x86_64.zip" + }, + { + "release": "r12", + "revision": "12.0.2931149", + "sha256": "7876e3b99f3596a3215ecf4e9f152d24b82dfdf2bbe7d3a38c423ae6a3edee79", + "url": "https://dl.google.com/android/repository/android-ndk-r12-linux-x86_64.zip" + }, + { + "release": "r12b", + "revision": "12.1.2977051", + "sha256": "eafae2d614e5475a3bcfd7c5f201db5b963cc1290ee3e8ae791ff0c66757781e", + "url": "https://dl.google.com/android/repository/android-ndk-r12b-linux-x86_64.zip" + }, + { + "release": "r13", + "revision": "13.0.3315539", + "sha256": "0a1dbd216386399e2979c17a48f65b962bf7ddc0c2311ef35d902b90c298c400", + "url": "https://dl.google.com/android/repository/android-ndk-r13-linux-x86_64.zip" + }, + { + "release": "r13b", + "revision": "13.1.3345770", + "sha256": "3524d7f8fca6dc0d8e7073a7ab7f76888780a22841a6641927123146c3ffd29c", + "url": "https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip" + }, + { + "release": "r14", + "revision": "14.0.3770861", + "sha256": "3e622c2c9943964ea44cd56317d0769ed4c811bb4b40dc45b1f6965e4db9aa44", + "url": "https://dl.google.com/android/repository/android-ndk-r14-linux-x86_64.zip" + }, + { + "release": "r14b", + "revision": "14.1.3816874", + "sha256": "0ecc2017802924cf81fffc0f51d342e3e69de6343da892ac9fa1cd79bc106024", + "url": "https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip" + }, + { + "release": "r15", + "revision": "15.0.4075724", + "sha256": "078eb7d28c3fcf45841f5baf6e6582e7fd5b73d8e8c4e0101df490f51abd37b6", + "url": "https://dl.google.com/android/repository/android-ndk-r15-linux-x86_64.zip" + }, + { + "release": "r15b", + "revision": "15.1.4119039", + "sha256": "d1ce63f68cd806b5a992d4e5aa60defde131c243bf523cdfc5b67990ef0ee0d3", + "url": "https://dl.google.com/android/repository/android-ndk-r15b-linux-x86_64.zip" + }, + { + "release": "r15c", + "revision": "15.2.4203891", + "sha256": "f01788946733bf6294a36727b99366a18369904eb068a599dde8cca2c1d2ba3c", + "url": "https://dl.google.com/android/repository/android-ndk-r15c-linux-x86_64.zip" + }, + { + "release": "r16", + "revision": "16.0.4442984", + "sha256": "a8550b81771c67cc6ab7b479a6918d29aa78de3482901762b4f9e0132cd9672e", + "url": "https://dl.google.com/android/repository/android-ndk-r16-linux-x86_64.zip" + }, + { + "release": "r16b", + "revision": "16.1.4479499", + "sha256": "bcdea4f5353773b2ffa85b5a9a2ae35544ce88ec5b507301d8cf6a76b765d901", + "url": "https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip" + }, + { + "release": "r17", + "revision": "17.0.4754217", + "sha256": "ba3d813b47de75bc32a2f3de087f72599c6cb36fdc9686b96f517f5492ff43ca", + "url": "https://dl.google.com/android/repository/android-ndk-r17-linux-x86_64.zip" + }, + { + "release": "r17b", + "revision": "17.1.4828580", + "sha256": "5dfbbdc2d3ba859fed90d0e978af87c71a91a5be1f6e1c40ba697503d48ccecd", + "url": "https://dl.google.com/android/repository/android-ndk-r17b-linux-x86_64.zip" + }, + { + "release": "r17c", + "revision": "17.2.4988734", + "sha256": "3f541adbd0330a9205ba12697f6d04ec90752c53d6b622101a2a8a856e816589", + "url": "https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip" + }, + { + "release": "r18b", + "revision": "18.1.5063045", + "sha256": "4f61cbe4bbf6406aa5ef2ae871def78010eed6271af72de83f8bd0b07a9fd3fd", + "url": "https://dl.google.com/android/repository/android-ndk-r18b-linux-x86_64.zip" + }, + { + "release": "r19", + "revision": "19.0.5232133", + "sha256": "c0a2425206191252197b97ea5fcc7eab9f693a576e69ef4773a9ed1690feed53", + "url": "https://dl.google.com/android/repository/android-ndk-r19-linux-x86_64.zip" + }, + { + "release": "r19b", + "revision": "19.1.5304403", + "sha256": "0fbb1645d0f1de4dde90a4ff79ca5ec4899c835e729d692f433fda501623257a", + "url": "https://dl.google.com/android/repository/android-ndk-r19b-linux-x86_64.zip" + }, + { + "release": "r19c", + "revision": "19.2.5345600", + "sha256": "4c62514ec9c2309315fd84da6d52465651cdb68605058f231f1e480fcf2692e1", + "url": "https://dl.google.com/android/repository/android-ndk-r19c-linux-x86_64.zip" + }, + { + "release": "r20", + "revision": "20.0.5594570", + "sha256": "57435158f109162f41f2f43d5563d2164e4d5d0364783a9a6fab3ef12cb06ce0", + "url": "https://dl.google.com/android/repository/android-ndk-r20-linux-x86_64.zip" + }, + { + "release": "r20b", + "revision": "20.1.5948944", + "sha256": "8381c440fe61fcbb01e209211ac01b519cd6adf51ab1c2281d5daad6ca4c8c8c", + "url": "https://dl.google.com/android/repository/android-ndk-r20b-linux-x86_64.zip" + }, + { + "release": "r21", + "revision": "21.0.6113669", + "sha256": "b65ea2d5c5b68fb603626adcbcea6e4d12c68eb8a73e373bbb9d23c252fc647b", + "url": "https://dl.google.com/android/repository/android-ndk-r21-linux-x86_64.zip" + }, + { + "release": "r21b", + "revision": "21.1.6352462", + "sha256": "0c7af5dd23c5d2564915194e71b1053578438ac992958904703161c7672cbed7", + "url": "https://dl.google.com/android/repository/android-ndk-r21b-linux-x86_64.zip" + }, + { + "release": "r21c", + "revision": "21.2.6472646", + "sha256": "214ebfcfa5108ba78f5b2cc8db4d575068f9c973ac7f27d2fa1987dfdb76c9e7", + "url": "https://dl.google.com/android/repository/android-ndk-r21c-linux-x86_64.zip" + }, + { + "release": "r21d", + "revision": "21.3.6528147", + "sha256": "dd6dc090b6e2580206c64bcee499bc16509a5d017c6952dcd2bed9072af67cbd", + "url": "https://dl.google.com/android/repository/android-ndk-r21d-linux-x86_64.zip" + }, + { + "release": "r21e", + "revision": "21.4.7075529", + "sha256": "ad7ce5467e18d40050dc51b8e7affc3e635c85bd8c59be62de32352328ed467e", + "url": "https://dl.google.com/android/repository/android-ndk-r21e-linux-x86_64.zip" + }, + { + "release": "r22", + "revision": "22.0.7026061", + "sha256": "d37fc69cd81e5660234a686e20adef39bc0244086e4d66525a40af771c020718", + "url": "https://dl.google.com/android/repository/android-ndk-r22-linux-x86_64.zip" + }, + { + "release": "r22b", + "revision": "22.1.7171670", + "sha256": "ac3a0421e76f71dd330d0cd55f9d99b9ac864c4c034fc67e0d671d022d4e806b", + "url": "https://dl.google.com/android/repository/android-ndk-r22b-linux-x86_64.zip" + } +] diff --git a/tests/build.TestCase b/tests/build.TestCase index 9645f583..f700b74c 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -12,10 +12,12 @@ import tempfile import textwrap import unittest import yaml +import zipfile from unittest import mock localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) @@ -26,6 +28,14 @@ import fdroidserver.metadata import fdroidserver.scanner +class FakeProcess: + output = 'fake output' + returncode = 0 + + def __init__(self, args, **kwargs): + print('FakeFDroidPopen', args, kwargs) + + class BuildTest(unittest.TestCase): '''fdroidserver/build.py''' @@ -94,9 +104,106 @@ class BuildTest(unittest.TestCase): self.assertEqual(versionCode, vc) self.assertEqual(versionName, vn) + def test_build_local_ndk(self): + """Test if `fdroid build` detects installed NDKs and auto-installs when missing""" + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.chdir(testdir) + + config = {'ndk_paths': {}, 'sdk_path': tempfile.mkdtemp(prefix='android-sdk-')} + fdroidserver.common.config = config + fdroidserver.build.config = config + fdroidserver.build.options = mock.Mock() + fdroidserver.build.options.scan_binary = False + fdroidserver.build.options.notarball = True + fdroidserver.build.options.skipscan = True + + app = fdroidserver.metadata.App() + app.id = 'mocked.app.id' + build = fdroidserver.metadata.Build() + build.commit = '1.0' + build.output = app.id + '.apk' + build.versionCode = '1' + build.versionName = '1.0' + build.ndk = 'r21e' # aka 21.4.7075529 + vcs = mock.Mock() + + def make_fake_apk(output, build): + with open(build.output, 'w') as fp: + fp.write('APK PLACEHOLDER') + return output + + def fake_download_file(_ignored, local_filename): + _ignored # silence the linters + with zipfile.ZipFile(local_filename, 'x') as zipfp: + zipfp.writestr( + 'android-ndk-r21e/source.properties', + 'Pkg.Revision = 21.4.7075529\n', + ) + + # use "as _ignored" just to make a pretty layout + with mock.patch( + 'fdroidserver.common.replace_build_vars', wraps=make_fake_apk + ) as _ignored, mock.patch( + 'fdroidserver.common.get_native_code', return_value='x86' + ) as _ignored, mock.patch( + 'fdroidserver.common.get_apk_id', + return_value=(app.id, build.versionCode, build.versionName), + ) as _ignored, mock.patch( + 'fdroidserver.common.is_apk_and_debuggable', return_value=False + ) as _ignored, mock.patch( + 'fdroidserver.common.sha256sum', + return_value='ad7ce5467e18d40050dc51b8e7affc3e635c85bd8c59be62de32352328ed467e', + ) as _ignored, mock.patch( + 'fdroidserver.common.is_apk_and_debuggable', return_value=False + ) as _ignored, mock.patch( + 'fdroidserver.build.FDroidPopen', FakeProcess + ) as _ignored, mock.patch( + 'fdroidserver.net.download_file', wraps=fake_download_file + ) as _ignored: + _ignored # silence the linters + with self.assertRaises( + fdroidserver.exception.FDroidException, + msg="No NDK setup, `fdroid build` should fail with error", + ): + fdroidserver.build.build_local( + app, + build, + vcs, + build_dir=testdir, + output_dir=testdir, + log_dir=None, + srclib_dir=None, + extlib_dir=None, + tmp_dir=None, + force=False, + onserver=False, + refresh=False, + ) + # now run `fdroid buid --onserver` + self.assertTrue('r21e' not in config['ndk_paths']) + fdroidserver.build.build_local( + app, + build, + vcs, + build_dir=testdir, + output_dir=testdir, + log_dir=os.getcwd(), + srclib_dir=None, + extlib_dir=None, + tmp_dir=None, + force=False, + onserver=True, + refresh=False, + ) + self.assertTrue(os.path.exists(config['ndk_paths']['r21e'])) + def test_build_local_clean(self): """Test if `fdroid build` cleans ant and gradle build products""" - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) config = dict() @@ -214,14 +321,9 @@ class BuildTest(unittest.TestCase): def test_failed_verifies_are_not_in_unsigned(self): - class FakeProcess: - output = 'fake output' - returncode = 0 - - def __init__(self, args, **kwargs): - print('FakeFDroidPopen', args, kwargs) - - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) sdk_path = os.path.join(testdir, 'android-sdk') self.create_fake_android_home(sdk_path) From 9fc2a2371353f5a3962e8a4f833b4d3ebf958cc8 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 May 2021 14:24:05 +0200 Subject: [PATCH 0258/2116] build: remove default NDK, closes #717 --- examples/config.yml | 10 +++++----- fdroidserver/build.py | 2 +- fdroidserver/common.py | 10 +--------- fdroidserver/init.py | 1 - fdroidserver/metadata.py | 8 +------- 5 files changed, 8 insertions(+), 23 deletions(-) diff --git a/examples/config.yml b/examples/config.yml index 36a66c22..ee62c9ac 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -5,14 +5,14 @@ # Custom path to the Android SDK, defaults to $ANDROID_HOME # sdk_path: $ANDROID_HOME -# Custom paths to various versions of the Android NDK, defaults to 'r12b' set -# to $ANDROID_NDK. Most users will have the latest at $ANDROID_NDK, which is -# used by default. If a version is missing or assigned to None, it is assumed -# not installed. +# Paths to various installed versions of the Android NDK. If a +# required version is missing in the buildserver VM, it will be +# automatically downloaded and installed into a temporary dir. +# # ndk_paths: # r10e: None # r11c: None -# r12b: $ANDROID_NDK +# r12b: None # r13b: None # r14b: None # r15c: None diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 3e0b2243..efe7ab3f 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -361,7 +361,7 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext ndk_path = build.ndk_path() if build.ndk or (build.buildjni and build.buildjni != ['no']): if not ndk_path: - logging.critical("Android NDK version '%s' could not be found!" % build.ndk or 'r12b') + logging.critical("Android NDK version '%s' could not be found!" % build.ndk) logging.critical("Configured versions:") for k, v in config['ndk_paths'].items(): if k.endswith("_orig"): diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 1194402e..fba87e99 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -118,15 +118,7 @@ orig_path = None default_config = { 'sdk_path': "$ANDROID_HOME", - 'ndk_paths': { - 'r10e': None, - 'r11c': None, - 'r12b': "$ANDROID_NDK", - 'r13b': None, - 'r14b': None, - 'r15c': None, - 'r16b': None, - }, + 'ndk_paths': {}, 'cachedir': os.path.join(os.getenv('HOME'), '.cache', 'fdroidserver'), 'java_paths': None, 'scan_binary': False, diff --git a/fdroidserver/init.py b/fdroidserver/init.py index e66d4daa..c1230d9c 100644 --- a/fdroidserver/init.py +++ b/fdroidserver/init.py @@ -226,7 +226,6 @@ def main(): msg = '\n' msg += _('Built repo based in "%s" with this config:') % fdroiddir msg += '\n\n Android SDK:\t\t\t' + config['sdk_path'] - msg += '\n Android NDK r12b (optional):\t$ANDROID_NDK' msg += '\n ' + _('Keystore for signing key:\t') + keystore if repo_keyalias is not None: msg += '\n Alias for key in store:\t' + repo_keyalias diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 597c4cd2..b72d6c9d 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -326,13 +326,7 @@ class Build(dict): return 'ant' def ndk_path(self): - version = self.ndk - if not version: - version = 'r12b' # falls back to latest - paths = fdroidserver.common.config['ndk_paths'] - if version not in paths: - return '' - return paths[version] + return fdroidserver.common.config['ndk_paths'].get(self.ndk, '') flagtypes = { From ec2cace22207329eaa1a288c6966cc086faf2353 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 May 2021 15:04:24 +0200 Subject: [PATCH 0259/2116] buildserver: trim pre-installed NDK list down to the bare minimum This keeps the Long Term Support release and the latest release installed. r10e was kept in because it needs a special extraction method, since it is a .bin file, not a .zip. r12b is kept in because it is the old default. Here is a survey of the NDK versions used in the most recent Builds entry in each app that uses the NDK: {'r10e': 6, 'r12b': 93, 'r13b': 4, 'r14b': 5, 'r15c': 7, 'r16b': 14, 'r17b': 4, 'r17c': 7, 'r18b': 9, 'r19c': 17, 'r20': 1, 'r20b': 22, 'r21': 3, 'r21d': 56, 'r21e': 65, 'r22': 9, 'r22b': 15, 'r9b': 1} #517 import glob import os import yaml try: from yaml import CSafeLoader as SafeLoader except ImportError: from yaml import SafeLoader ndks = dict() for f in glob.glob('metadata/*.yml'): with open(f) as fp: app = yaml.load(fp, Loader=SafeLoader) if app.get('Disable'): continue build = app.get('Builds', [])[-1] if build.get('disabled'): continue ndk = build.get('ndk') if ndk and ndk[1] == '9': print(f, build) elif ndk and int(ndk[2:3]) < 18: print(f, build) if ndk: print(f, ndk) if ndk not in ndks: ndks[ndk] = 0 ndks[ndk] += 1 import pprint pprint.pprint(ndks) --- buildserver/config.buildserver.yml | 10 ---------- buildserver/provision-android-ndk | 2 +- makebuildserver | 20 -------------------- 3 files changed, 1 insertion(+), 31 deletions(-) diff --git a/buildserver/config.buildserver.yml b/buildserver/config.buildserver.yml index cc139f96..2a3cb3fa 100644 --- a/buildserver/config.buildserver.yml +++ b/buildserver/config.buildserver.yml @@ -1,16 +1,6 @@ sdk_path: /home/vagrant/android-sdk ndk_paths: r10e: /home/vagrant/android-ndk/r10e - r11c: /home/vagrant/android-ndk/r11c - r12b: /home/vagrant/android-ndk/r12b - r13b: /home/vagrant/android-ndk/r13b - r14b: /home/vagrant/android-ndk/r14b - r15c: /home/vagrant/android-ndk/r15c - r16b: /home/vagrant/android-ndk/r16b - r17c: /home/vagrant/android-ndk/r17c - r18b: /home/vagrant/android-ndk/r18b - r19c: /home/vagrant/android-ndk/r19c - r20b: /home/vagrant/android-ndk/r20b r21e: /home/vagrant/android-ndk/r21e r22b: /home/vagrant/android-ndk/r22b diff --git a/buildserver/provision-android-ndk b/buildserver/provision-android-ndk index 754dd797..1fcabf93 100644 --- a/buildserver/provision-android-ndk +++ b/buildserver/provision-android-ndk @@ -15,7 +15,7 @@ if [ ! -e $NDK_BASE/r10e ]; then mv android-ndk-r10e r10e fi -for version in r11c r12b r13b r14b r15c r16b r17c r18b r19c r20b r21e r22b; do +for version in r21e r22b; do if [ ! -e ${NDK_BASE}/${version} ]; then unzip /vagrant/cache/android-ndk-${version}-linux-x86_64.zip > /dev/null mv android-ndk-${version} ${version} diff --git a/makebuildserver b/makebuildserver index 01b45a30..4f1864a8 100755 --- a/makebuildserver +++ b/makebuildserver @@ -293,26 +293,6 @@ CACHE_FILES = [ '0e46229820205440b48a5501122002842b82886e76af35f0f3a069243dca4b3c'), ('https://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin', '102d6723f67ff1384330d12c45854315d6452d6510286f4e5891e00a5a8f1d5a'), - ('https://dl.google.com/android/repository/android-ndk-r11c-linux-x86_64.zip', - 'ba85dbe4d370e4de567222f73a3e034d85fc3011b3cbd90697f3e8dcace3ad94'), - ('https://dl.google.com/android/repository/android-ndk-r12b-linux-x86_64.zip', - 'eafae2d614e5475a3bcfd7c5f201db5b963cc1290ee3e8ae791ff0c66757781e'), - ('https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip', - '3524d7f8fca6dc0d8e7073a7ab7f76888780a22841a6641927123146c3ffd29c'), - ('https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip', - '0ecc2017802924cf81fffc0f51d342e3e69de6343da892ac9fa1cd79bc106024'), - ('https://dl.google.com/android/repository/android-ndk-r15c-linux-x86_64.zip', - 'f01788946733bf6294a36727b99366a18369904eb068a599dde8cca2c1d2ba3c'), - ('https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip', - 'bcdea4f5353773b2ffa85b5a9a2ae35544ce88ec5b507301d8cf6a76b765d901'), - ('https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip', - '3f541adbd0330a9205ba12697f6d04ec90752c53d6b622101a2a8a856e816589'), - ('https://dl.google.com/android/repository/android-ndk-r18b-linux-x86_64.zip', - '4f61cbe4bbf6406aa5ef2ae871def78010eed6271af72de83f8bd0b07a9fd3fd'), - ('https://dl.google.com/android/repository/android-ndk-r19c-linux-x86_64.zip', - '4c62514ec9c2309315fd84da6d52465651cdb68605058f231f1e480fcf2692e1'), - ('https://dl.google.com/android/repository/android-ndk-r20b-linux-x86_64.zip', - '8381c440fe61fcbb01e209211ac01b519cd6adf51ab1c2281d5daad6ca4c8c8c'), ('https://dl.google.com/android/repository/android-ndk-r21e-linux-x86_64.zip', 'ad7ce5467e18d40050dc51b8e7affc3e635c85bd8c59be62de32352328ed467e'), ('https://dl.google.com/android/repository/android-ndk-r22b-linux-x86_64.zip', From 9d44fa79190811d70166bc6813e9d12d7e8e9555 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 14 May 2021 00:03:16 +0200 Subject: [PATCH 0260/2116] gitlab-ci: auto-generate merge request when NDK release found Following the pattern of the gradle bot, this will check the transparency log for any new NDK release. If there are any, it will make a merge request from @fdroid-bot. --- .gitlab-ci.yml | 6 +- tests/ndk-release-checksums.py | 140 +++++++++++++++++++++++++++++++++ 2 files changed, 144 insertions(+), 2 deletions(-) create mode 100755 tests/ndk-release-checksums.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3fae5c80..149b34f9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -261,7 +261,7 @@ fedora_latest: "cd `pwd`; export ANDROID_HOME=$ANDROID_HOME; fdroid=~testuser/.local/bin/fdroid ./run-tests" -gradle: +gradle/ndk: image: debian:bullseye <<: *apt-template variables: @@ -276,16 +276,18 @@ gradle: python3-git python3-gitlab python3-requests - # if this is a merge request fork, then only check if makebuildserver or gradlew-fdroid changed + # if this is a merge request fork, then only check if relevant files changed - if [ "$CI_PROJECT_NAMESPACE" != "fdroid" ]; then git fetch https://gitlab.com/fdroid/fdroidserver.git; for f in `git diff --name-only --diff-filter=d FETCH_HEAD...HEAD`; do test "$f" == "makebuildserver" && export CHANGED="yes"; test "$f" == "gradlew-fdroid" && export CHANGED="yes"; + test "$f" == "fdroidserver/common.py" && export CHANGED="yes"; done; test -z "$CHANGED" && exit; fi - ./tests/gradle-release-checksums.py + - ./tests/ndk-release-checksums.py # Run an actual build in a simple, faked version of the buildserver guest VM. diff --git a/tests/ndk-release-checksums.py b/tests/ndk-release-checksums.py new file mode 100755 index 00000000..6e99d6a0 --- /dev/null +++ b/tests/ndk-release-checksums.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python3 + +import git +import gitlab +import json +import os +import re +import requests +import subprocess +from colorama import Fore, Style + + +checksums = None +versions = dict() + +while not checksums: + r = requests.get( + 'https://gitlab.com/fdroid/android-sdk-transparency-log/-/raw/master/checksums.json' + ) + if r.status_code == 200: + checksums = r.json() + +with open('fdroidserver/common.py') as fp: + common_py = fp.read() + +to_compile = re.search(r'\nNDKS = [^\]]+\]', common_py).group() +if not to_compile: + exit(1) +code = compile(to_compile, '', 'exec') +config = {} +exec(code, None, config) # nosec this is just a CI script + +ndks = [] +errors = 0 +release = None +revision = None +for k, entries in checksums.items(): + if k.startswith('https://dl.google.com/android/repository/android-ndk'): + m = re.search(r'-(r[1-9][0-9]?[a-z]?)-linux', k) + if m: + for entry in entries: + if 'source.properties' in entry: + n = re.search( + r'[1-9][0-9]\.[0-9]\.[0-9]{7}', entry['source.properties'] + ) + if n: + release = m.group(1) + revision = n.group() + ndks.append( + { + 'url': k, + 'release': release, + 'revision': revision, + 'sha256': checksums[k][0]['sha256'], + } + ) + for d in config['NDKS']: + if k == d['url']: + sha256 = d['sha256'] + found = False + for entry in entries: + if sha256 == entry['sha256']: + found = True + if not found: + print( + Fore.RED + + ( + 'ERROR: checksum mismatch: %s != %s' + % (sha256, entry['sha256']) + ) + + Style.RESET_ALL + ) + errors += 1 + +with open('fdroidserver/common.py', 'w') as fp: + fp.write( + common_py.replace( + to_compile, '\nNDKS = ' + json.dumps(ndks, indent=4, sort_keys=True) + ) + ) + +if os.getenv('CI_PROJECT_NAMESPACE') != 'fdroid': + p = subprocess.run(['git', '--no-pager', 'diff']) + print(p.stdout) + exit(errors) + + +# This only runs after commits are pushed to fdroid/fdroidserver +git_repo = git.repo.Repo('.') +modified = git_repo.git().ls_files(modified=True).split() +if git_repo.is_dirty() and 'fdroidserver/common.py' in modified: + branch = git_repo.create_head(os.path.basename(__file__), force=True) + branch.checkout() + git_repo.index.add(['fdroidserver/common.py']) + author = git.Actor('fdroid-bot', 'fdroid-bot@f-droid.org') + git_repo.index.commit('Android NDK %s (%s)' % (release, revision), author=author) + project_path = 'fdroid-bot/' + os.getenv('CI_PROJECT_NAME') + url = 'https://gitlab-ci-token:%s@%s/%s.git' % ( + os.getenv('PERSONAL_ACCESS_TOKEN'), + os.getenv('CI_SERVER_HOST'), + project_path, + ) + remote_name = 'fdroid-bot' + try: + remote = git_repo.create_remote(remote_name, url) + except git.exc.GitCommandError: + remote = git.remote.Remote(git_repo, remote_name) + remote.set_url(url) + remote.push(force=True) + git.remote.Remote.rm(git_repo, remote_name) + + private_token = os.getenv('PERSONAL_ACCESS_TOKEN') + if not private_token: + print( + Fore.RED + + 'ERROR: GitLab Token not found in PERSONAL_ACCESS_TOKEN!' + + Style.RESET_ALL + ) + exit(1) + gl = gitlab.Gitlab( + os.getenv('CI_SERVER_URL'), api_version=4, private_token=private_token + ) + project = gl.projects.get(project_path, lazy=True) + description = ( + 'see ' + '\n\n

generated by GitLab CI Job #%s

' + % (os.getenv('CI_PROJECT_URL'), os.getenv('CI_JOB_ID'), os.getenv('CI_JOB_ID')) + ) + mr = project.mergerequests.create( + { + 'source_branch': branch.name, + 'target_project_id': 36527, # fdroid/fdroidserver + 'target_branch': 'master', + 'title': 'update to gradle v' + version, + 'description': description, + 'labels': ['fdroid-bot', 'buildserver'], + 'remove_source_branch': True, + } + ) + mr.save() From 07da062a3416fe391d799fb83d7b3ed4ee613940 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 25 May 2021 16:56:55 +0200 Subject: [PATCH 0261/2116] buildserver: fix ssh BatchMode config --- buildserver/setup-env-vars | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildserver/setup-env-vars b/buildserver/setup-env-vars index 19259266..5fed9e8f 100644 --- a/buildserver/setup-env-vars +++ b/buildserver/setup-env-vars @@ -17,4 +17,4 @@ chmod 0644 $bsenv # make sure that SSH never hangs at a password or key prompt printf ' StrictHostKeyChecking yes' >> /etc/ssh/ssh_config -printf ' BatchMode yes' >> /etc/ssh/config +printf ' BatchMode yes' >> /etc/ssh/ssh_config From bb77d7a6d2e1d669162adb6fc5bbdd0d38220fbc Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 25 May 2021 17:30:20 +0200 Subject: [PATCH 0262/2116] buildserver: standardize SDK install location /opt/android-sdk _/opt/android-sdk_ was chosen for a number of reasons: * _/opt_ is [standardized][1] for packages like the Android SDK, which has its own directory layout. * _android-sdk_ is used rather than the upstream directory name from the ZIP (e.g. _android-sdk-linux_) so that the path is the same on all platforms. * On platforms without official _/opt_ support ([macOS][2], [Windows][3], [FreeBSD][4], etc.), it does not conflict with any existing system directory. [1]: https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch03s13.html [2]: https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html#//apple_ref/doc/uid/TP40010672-CH2-SW7 [3]: https://en.wikipedia.org/wiki/Directory_structure#Windows_10 [4]: https://www.freebsd.org/cgi/man.cgi?query=hier&sektion=7&format=html --- buildserver/Vagrantfile | 2 +- buildserver/config.buildserver.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/buildserver/Vagrantfile b/buildserver/Vagrantfile index 982c0267..63a891b1 100644 --- a/buildserver/Vagrantfile +++ b/buildserver/Vagrantfile @@ -79,7 +79,7 @@ Vagrant.configure("2") do |config| end config.vm.provision "shell", path: "setup-env-vars", - args: ["/home/vagrant/android-sdk"] + args: ["/opt/android-sdk"] config.vm.provision "shell", path: "provision-apt-get-install", args: [configfile['debian_mirror']] config.vm.provision "shell", path: "provision-android-sdk" diff --git a/buildserver/config.buildserver.yml b/buildserver/config.buildserver.yml index 2a3cb3fa..37b2bb4e 100644 --- a/buildserver/config.buildserver.yml +++ b/buildserver/config.buildserver.yml @@ -1,4 +1,4 @@ -sdk_path: /home/vagrant/android-sdk +sdk_path: /opt/android-sdk ndk_paths: r10e: /home/vagrant/android-ndk/r10e r21e: /home/vagrant/android-ndk/r21e From 93145a43fb92991adbe15da1ca4325d84717283f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 25 May 2021 22:39:03 +0200 Subject: [PATCH 0263/2116] buildserver: use standardized paths for the NDKs This should help with reproducibility since some tools like Python still include the build paths in the binaries. https://gitlab.com/fdroid/fdroidserver/-/merge_requests/919#note_578180986 The default ANDROID_SDK_ROOT base dir of /opt/android-sdk is hard-coded in buildserver/Vagrantfile. The $ANDROID_HOME/ndk subdir is where Android Studio will install the NDK into versioned subdirs. https://developer.android.com/studio/projects/configure-agp-ndk#agp_version_41 --- buildserver/Vagrantfile | 2 +- buildserver/config.buildserver.yml | 6 +++--- buildserver/provision-android-ndk | 8 +++++++- fdroidserver/common.py | 6 +++--- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/buildserver/Vagrantfile b/buildserver/Vagrantfile index 63a891b1..ef1a407a 100644 --- a/buildserver/Vagrantfile +++ b/buildserver/Vagrantfile @@ -84,7 +84,7 @@ Vagrant.configure("2") do |config| args: [configfile['debian_mirror']] config.vm.provision "shell", path: "provision-android-sdk" config.vm.provision "shell", path: "provision-android-ndk", - args: ["/home/vagrant/android-ndk"] + args: ["/opt/android-sdk/ndk"] config.vm.provision "shell", path: "provision-gradle" end diff --git a/buildserver/config.buildserver.yml b/buildserver/config.buildserver.yml index 37b2bb4e..3073faf7 100644 --- a/buildserver/config.buildserver.yml +++ b/buildserver/config.buildserver.yml @@ -1,8 +1,8 @@ sdk_path: /opt/android-sdk ndk_paths: - r10e: /home/vagrant/android-ndk/r10e - r21e: /home/vagrant/android-ndk/r21e - r22b: /home/vagrant/android-ndk/r22b + r10e: /opt/android-sdk/ndk/r10e + r21e: /opt/android-sdk/ndk/21.4.7075529 + r22b: /opt/android-sdk/ndk/22.0.7026061 java_paths: 8: /usr/lib/jvm/java-8-openjdk-amd64 diff --git a/buildserver/provision-android-ndk b/buildserver/provision-android-ndk index 1fcabf93..655bf06f 100644 --- a/buildserver/provision-android-ndk +++ b/buildserver/provision-android-ndk @@ -18,9 +18,15 @@ fi for version in r21e r22b; do if [ ! -e ${NDK_BASE}/${version} ]; then unzip /vagrant/cache/android-ndk-${version}-linux-x86_64.zip > /dev/null - mv android-ndk-${version} ${version} + mv android-ndk-${version} \ + `sed -En 's,^Pkg.Revision *= *(.+),\1,p' android-ndk-${version}/source.properties` fi done +# allow gradle/etc to install missing NDK versions +chgrp vagrant $NDK_BASE +chmod g+w $NDK_BASE + +# ensure all users can read and execute the NDK chmod -R a+rX $NDK_BASE/ find $NDK_BASE/ -type f -executable -print0 | xargs -0 chmod a+x diff --git a/fdroidserver/common.py b/fdroidserver/common.py index fba87e99..01244f03 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4006,9 +4006,9 @@ def auto_install_ndk(build): --onserver` calls can run in a single session. The production buildserver is reset between every build. - The default ANDROID_HOME base dir of /home/vagrant/android-sdk is - hard-coded in buildserver/Vagrantfile. The "ndk" subdir is where - Android Studio will install the NDK into versioned subdirs. + The default ANDROID_SDK_ROOT base dir of /opt/android-sdk is hard-coded in + buildserver/Vagrantfile. The $ANDROID_HOME/ndk subdir is where Android + Studio will install the NDK into versioned subdirs. https://developer.android.com/studio/projects/configure-agp-ndk#agp_version_41 Also, r10e and older cannot be handled via this mechanism because From 4686c06f628b5d7ebc742a187c503e99f11f5977 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 26 May 2021 10:58:46 +0200 Subject: [PATCH 0264/2116] metadata: allow `ndk:` to be str or list of release or revision There are two version numbers used for NDKs: the "release" and the "revision". The "release" is used in the download URL and zipball and the "revision" is used in the source.properties and the gradle ndkVersion field. Also, there are some builds which need multiple NDKs installed, so this makes it possible to have a list of release/revision entries in build.ndk. This does not yet add full support since _fdroidserver/build.py_ will also need changes. --- fdroidserver/common.py | 26 ++++++++++++++++++++++++++ fdroidserver/metadata.py | 6 +++++- tests/common.TestCase | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 01244f03..60b21f1b 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4021,6 +4021,32 @@ def auto_install_ndk(build): ndk = build.get('ndk') if not ndk: return + if isinstance(ndk, str): + _install_ndk(ndk) + elif isinstance(ndk, list): + for n in ndk: + _install_ndk(n) + else: + BuildException(_('Invalid ndk: entry in build: "{ndk}"') + .format(ndk=str(ndk))) + + +def _install_ndk(ndk): + """Install specified NDK if it is not already installed + + Parameters + ---------- + + ndk + The NDK version to install, either in "release" form (r21e) or + "revision" form (21.4.7075529). + """ + if re.match(r'[1-9][0-9.]+[0-9]', ndk): + for ndkdict in NDKS: + if ndk == ndkdict['revision']: + ndk = ndkdict['release'] + break + ndk_path = config.get(ndk) if ndk_path and os.path.isdir(ndk_path): return diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index b72d6c9d..21147e30 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -326,7 +326,11 @@ class Build(dict): return 'ant' def ndk_path(self): - return fdroidserver.common.config['ndk_paths'].get(self.ndk, '') + """Returns the path to the first configured NDK or an empty string""" + ndk = self.ndk + if isinstance(ndk, list): + ndk = self.ndk[0] + return fdroidserver.common.config['ndk_paths'].get(ndk, '') flagtypes = { diff --git a/tests/common.TestCase b/tests/common.TestCase index a58ca0a3..9e12ff9a 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1796,6 +1796,42 @@ class CommonTest(unittest.TestCase): fdroidserver.common.metadata_find_developer_signing_files(appid, vc) ) + def test_auto_install_ndk(self): + """Test all possible field data types for build.ndk""" + build = fdroidserver.metadata.Build() + + none_entry = mock.Mock() + with mock.patch('fdroidserver.common._install_ndk', none_entry): + fdroidserver.common.auto_install_ndk(build) + none_entry.assert_not_called() + + empty_list = mock.Mock() + build.ndk = [] + with mock.patch('fdroidserver.common._install_ndk', empty_list): + fdroidserver.common.auto_install_ndk(build) + empty_list.assert_not_called() + + release_entry = mock.Mock() + build.ndk = 'r21e' + with mock.patch('fdroidserver.common._install_ndk', release_entry): + fdroidserver.common.auto_install_ndk(build) + release_entry.assert_called_once_with('r21e') + + revision_entry = mock.Mock() + build.ndk = '21.4.7075529' + with mock.patch('fdroidserver.common._install_ndk', revision_entry): + fdroidserver.common.auto_install_ndk(build) + revision_entry.assert_called_once_with('21.4.7075529') + + list_entry = mock.Mock() + calls = [] + build.ndk = ['11.0.2655954', 'r12b', 'r21e'] + for n in build.ndk: + calls.append(mock.call(n)) + with mock.patch('fdroidserver.common._install_ndk', list_entry): + fdroidserver.common.auto_install_ndk(build) + list_entry.assert_has_calls(calls) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 9f77044d0d3f36d9b1e65a2068b51ea35254f991 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 26 May 2021 12:52:54 +0200 Subject: [PATCH 0265/2116] auto-detect NDKs installed in standard paths 'ndk_paths' will be automatically filled out from well known sources like $ANDROID_HOME/ndk-bundle and $ANDROID_HOME/ndk/*. If a required version is missing in the buildserver VM, it will be automatically downloaded and installed into the standard $ANDROID_HOME/ndk/ directory. Manually setting it here will override the auto-detected values. The keys can either be the "release" (e.g. r21e) or the "revision" (e.g. 21.4.7075529). https://developer.android.com/studio/projects/configure-agp-ndk#agp_version_41 * sdkmanager installs "ndk;12.3.4567890" into $ANDROID_SDK_ROOT/ndk/ * sdkmanager installs "ndk-bundle" into $ANDROID_SDK_ROOT/ndk-bundle/ --- buildserver/config.buildserver.yml | 4 ---- examples/config.yml | 28 ++++++++++++---------------- fdroidserver/common.py | 30 ++++++++++++++++++++++++++++++ tests/common.TestCase | 22 ++++++++++++++++++++++ 4 files changed, 64 insertions(+), 20 deletions(-) diff --git a/buildserver/config.buildserver.yml b/buildserver/config.buildserver.yml index 3073faf7..f5fff843 100644 --- a/buildserver/config.buildserver.yml +++ b/buildserver/config.buildserver.yml @@ -1,8 +1,4 @@ sdk_path: /opt/android-sdk -ndk_paths: - r10e: /opt/android-sdk/ndk/r10e - r21e: /opt/android-sdk/ndk/21.4.7075529 - r22b: /opt/android-sdk/ndk/22.0.7026061 java_paths: 8: /usr/lib/jvm/java-8-openjdk-amd64 diff --git a/examples/config.yml b/examples/config.yml index ee62c9ac..ca818414 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -5,24 +5,20 @@ # Custom path to the Android SDK, defaults to $ANDROID_HOME # sdk_path: $ANDROID_HOME -# Paths to various installed versions of the Android NDK. If a -# required version is missing in the buildserver VM, it will be -# automatically downloaded and installed into a temporary dir. +# Paths to installed versions of the Android NDK. This will be +# automatically filled out from well known sources like +# $ANDROID_HOME/ndk-bundle and $ANDROID_HOME/ndk/*. If a required +# version is missing in the buildserver VM, it will be automatically +# downloaded and installed into the standard $ANDROID_HOME/ndk/ +# directory. Manually setting it here will override the auto-detected +# values. The keys can either be the "release" (e.g. r21e) or the +# "revision" (e.g. 21.4.7075529). # # ndk_paths: -# r10e: None -# r11c: None -# r12b: None -# r13b: None -# r14b: None -# r15c: None -# r16b: None -# r17c: None -# r18b: None -# r19c: None -# r20b: None -# r21e: None -# r22b: None +# r10e: $ANDROID_HOME/android-ndk-r10e +# r17: "" +# 21.4.7075529: ~/Android/Ndk +# r22b: null # Directory to store downloaded tools in (i.e. gradle versions) # By default, these are stored in ~/.cache/fdroidserver diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 60b21f1b..8e6f5ac1 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -214,6 +214,14 @@ def _add_java_paths_to_config(pathlist, thisconfig): def fill_config_defaults(thisconfig): + """Fill in the global config dict with relevant defaults + + For config values that have a path that can be expanded, e.g. an + env var or a ~/, this will store the original value using "_orig" + appended to the key name so that if the config gets written out, + it will preserve the original, unexpanded string. + + """ for k, v in default_config.items(): if k not in thisconfig: thisconfig[k] = v @@ -281,6 +289,28 @@ def fill_config_defaults(thisconfig): thisconfig[k][k2] = exp thisconfig[k][k2 + '_orig'] = v + ndk_paths = thisconfig.get('ndk_paths', {}) + + ndk_bundle = os.path.join(thisconfig['sdk_path'], 'ndk-bundle') + if os.path.exists(ndk_bundle): + version = get_ndk_version(ndk_bundle) + if version not in ndk_paths: + ndk_paths[version] = ndk_bundle + + ndk_dir = os.path.join(thisconfig['sdk_path'], 'ndk') + if os.path.exists(ndk_dir): + for ndk in glob.glob(os.path.join(ndk_dir, '*')): + version = get_ndk_version(ndk) + if version not in ndk_paths: + ndk_paths[version] = ndk + + for k in list(ndk_paths.keys()): + if not re.match(r'r[1-9][0-9]*[a-z]?', k): + for ndkdict in NDKS: + if k == ndkdict['revision']: + ndk_paths[ndkdict['release']] = ndk_paths.pop(k) + break + def regsub_file(pattern, repl, path): with open(path, 'rb') as f: diff --git a/tests/common.TestCase b/tests/common.TestCase index 9e12ff9a..6eca64bc 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1832,6 +1832,28 @@ class CommonTest(unittest.TestCase): fdroidserver.common.auto_install_ndk(build) list_entry.assert_has_calls(calls) + def test_fill_config_defaults(self): + """Test the auto-detection of NDKs installed in standard paths""" + sdk_path = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + + ndk_bundle = os.path.join(sdk_path, 'ndk-bundle') + os.makedirs(ndk_bundle) + with open(os.path.join(ndk_bundle, 'source.properties'), 'w') as fp: + fp.write('Pkg.Desc = Android NDK\nPkg.Revision = 17.2.4988734\n') + config = {'sdk_path': sdk_path} + fdroidserver.common.fill_config_defaults(config) + self.assertEqual({'r17c': ndk_bundle}, config['ndk_paths']) + + r21e = os.path.join(sdk_path, 'ndk', '21.4.7075529') + os.makedirs(r21e) + with open(os.path.join(r21e, 'source.properties'), 'w') as fp: + fp.write('Pkg.Desc = Android NDK\nPkg.Revision = 21.4.7075529\n') + config = {'sdk_path': sdk_path} + fdroidserver.common.fill_config_defaults(config) + self.assertEqual({'r17c': ndk_bundle, 'r21e': r21e}, config['ndk_paths']) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 7a1d236c8dabe0f12b759c74f3ab931be67f1fd3 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 26 May 2021 17:12:28 +0200 Subject: [PATCH 0266/2116] only support zipballs in NDK provisioning Since I discovered there is an r10e zipball, this can now get all NDKs in zipball form. fdroid/android-sdk-transparency-log@447fea86e719295af6cd8a3bbee4529d114ece2d closes #902 --- buildserver/provision-android-ndk | 5 ----- buildserver/provision-apt-get-install | 1 - fdroidserver/common.py | 18 +++++++++++++++++- makebuildserver | 2 -- tests/common.TestCase | 26 +++++++++++++++++++++++++- 5 files changed, 42 insertions(+), 10 deletions(-) diff --git a/buildserver/provision-android-ndk b/buildserver/provision-android-ndk index 655bf06f..99e7c32e 100644 --- a/buildserver/provision-android-ndk +++ b/buildserver/provision-android-ndk @@ -10,11 +10,6 @@ NDK_BASE=$1 test -e $NDK_BASE || mkdir -p $NDK_BASE cd $NDK_BASE -if [ ! -e $NDK_BASE/r10e ]; then - 7zr x /vagrant/cache/android-ndk-r10e-linux-x86_64.bin > /dev/null - mv android-ndk-r10e r10e -fi - for version in r21e r22b; do if [ ! -e ${NDK_BASE}/${version} ]; then unzip /vagrant/cache/android-ndk-${version}-linux-x86_64.zip > /dev/null diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index 1767bb13..070fb6b3 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -96,7 +96,6 @@ packages=" openjdk-8-jre-headless openjdk-8-jdk-headless optipng - p7zip pkg-config python-gnupg python-lxml diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 8e6f5ac1..9faa8490 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -307,7 +307,7 @@ def fill_config_defaults(thisconfig): for k in list(ndk_paths.keys()): if not re.match(r'r[1-9][0-9]*[a-z]?', k): for ndkdict in NDKS: - if k == ndkdict['revision']: + if k == ndkdict.get('revision'): ndk_paths[ndkdict['release']] = ndk_paths.pop(k) break @@ -4015,12 +4015,23 @@ def sha256base64(filename): def get_ndk_version(ndk_path): + """Get the version info from the metadata in the NDK package + + Since r11, the info is nice and easy to find in + sources.properties. Before, there was a kludgey format in + RELEASE.txt. This is only needed for r10e. + + """ source_properties = os.path.join(ndk_path, 'source.properties') + release_txt = os.path.join(ndk_path, 'RELEASE.TXT') if os.path.exists(source_properties): with open(source_properties) as fp: m = re.search(r'^Pkg.Revision *= *(.+)', fp.read(), flags=re.MULTILINE) if m: return m.group(1) + elif os.path.exists(release_txt): + with open(release_txt) as fp: + return fp.read().split('-')[0] def auto_install_ndk(build): @@ -4118,6 +4129,11 @@ def _install_ndk(ndk): """Derived from https://gitlab.com/fdroid/android-sdk-transparency-log/-/blob/master/checksums.json""" NDKS = [ + { + "release": "r10e", + "sha256": "ee5f405f3b57c4f5c3b3b8b5d495ae12b660e03d2112e4ed5c728d349f1e520c", + "url": "https://dl.google.com/android/repository/android-ndk-r10e-linux-x86_64.zip" + }, { "release": "r11", "revision": "11.0.2655954", diff --git a/makebuildserver b/makebuildserver index 4f1864a8..d1298720 100755 --- a/makebuildserver +++ b/makebuildserver @@ -291,8 +291,6 @@ CACHE_FILES = [ 'dccda8aa069563c8ba2f6cdfd0777df0e34a5b4d15138ca8b9757e94f4e8a8cb'), ('https://services.gradle.org/distributions/gradle-7.0.2-bin.zip', '0e46229820205440b48a5501122002842b82886e76af35f0f3a069243dca4b3c'), - ('https://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin', - '102d6723f67ff1384330d12c45854315d6452d6510286f4e5891e00a5a8f1d5a'), ('https://dl.google.com/android/repository/android-ndk-r21e-linux-x86_64.zip', 'ad7ce5467e18d40050dc51b8e7affc3e635c85bd8c59be62de32352328ed467e'), ('https://dl.google.com/android/repository/android-ndk-r22b-linux-x86_64.zip', diff --git a/tests/common.TestCase b/tests/common.TestCase index 6eca64bc..d73bc497 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1825,13 +1825,27 @@ class CommonTest(unittest.TestCase): list_entry = mock.Mock() calls = [] - build.ndk = ['11.0.2655954', 'r12b', 'r21e'] + build.ndk = ['r10e', '11.0.2655954', 'r12b', 'r21e'] for n in build.ndk: calls.append(mock.call(n)) with mock.patch('fdroidserver.common._install_ndk', list_entry): fdroidserver.common.auto_install_ndk(build) list_entry.assert_has_calls(calls) + @unittest.skip("This test downloads and unzips a 1GB file.") + def test_install_ndk(self): + """NDK r10e is a special case since its missing source.properties""" + sdk_path = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + config = {'sdk_path': sdk_path} + fdroidserver.common.config = config + fdroidserver.common._install_ndk('r10e') + r10e = os.path.join(sdk_path, 'ndk', 'r10e') + self.assertEqual('r10e', fdroidserver.common.get_ndk_version(r10e)) + fdroidserver.common.fill_config_defaults(config) + self.assertEqual({'r10e': r10e}, config['ndk_paths']) + def test_fill_config_defaults(self): """Test the auto-detection of NDKs installed in standard paths""" sdk_path = tempfile.mkdtemp( @@ -1854,6 +1868,16 @@ class CommonTest(unittest.TestCase): fdroidserver.common.fill_config_defaults(config) self.assertEqual({'r17c': ndk_bundle, 'r21e': r21e}, config['ndk_paths']) + r10e = os.path.join(sdk_path, 'ndk', 'r10e') + os.makedirs(r10e) + with open(os.path.join(r10e, 'RELEASE.TXT'), 'w') as fp: + fp.write('r10e-rc4 (64-bit)\n') + config = {'sdk_path': sdk_path} + fdroidserver.common.fill_config_defaults(config) + self.assertEqual( + {'r10e': r10e, 'r17c': ndk_bundle, 'r21e': r21e}, config['ndk_paths'] + ) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 09fa49a7a3af313e60013ed69107137df928f15e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 26 May 2021 17:35:39 +0200 Subject: [PATCH 0267/2116] make get_android_tools_versions() search ndk_paths from config --- fdroidserver/build.py | 6 +++--- fdroidserver/common.py | 14 ++++++-------- tests/build.TestCase | 2 +- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index efe7ab3f..6c3fa790 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -237,7 +237,7 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): try: cmd_stdout = chan.makefile('rb', 1024) output = bytes() - output += common.get_android_tools_version_log(build.ndk_path()).encode() + output += common.get_android_tools_version_log().encode() while not chan.exit_status_ready(): line = cmd_stdout.readline() if line: @@ -402,7 +402,7 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext log_path = os.path.join(log_dir, common.get_toolsversion_logname(app, build)) with open(log_path, 'w') as f: - f.write(common.get_android_tools_version_log(build.ndk_path())) + f.write(common.get_android_tools_version_log()) else: if build.sudo: logging.warning('%s:%s runs this on the buildserver with sudo:\n\t%s\nThese commands were skipped because fdroid build is not running on a dedicated build server.' @@ -1088,7 +1088,7 @@ def main(): build_starttime = common.get_wiki_timestamp() tools_version_log = '' if not options.onserver: - tools_version_log = common.get_android_tools_version_log(build.ndk_path()) + tools_version_log = common.get_android_tools_version_log() common.write_running_status_json(status_output) try: diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 9faa8490..851fdea5 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3872,7 +3872,7 @@ def get_wiki_timestamp(timestamp=None): return time.strftime("%Y-%m-%d %H:%M:%SZ", timestamp) -def get_android_tools_versions(ndk_path=None): +def get_android_tools_versions(): '''get a list of the versions of all installed Android SDK/NDK components''' global config @@ -3880,11 +3880,9 @@ def get_android_tools_versions(ndk_path=None): if sdk_path[-1] != '/': sdk_path += '/' components = [] - if ndk_path: - ndk_release_txt = os.path.join(ndk_path, 'RELEASE.TXT') - if os.path.isfile(ndk_release_txt): - with open(ndk_release_txt, 'r') as fp: - components.append((os.path.basename(ndk_path), fp.read()[:-1])) + for ndk_path in config.get('ndk_paths', []): + version = get_ndk_version(ndk_path) + components.append((os.path.basename(ndk_path), str(version))) pattern = re.compile(r'^Pkg.Revision *= *(.+)', re.MULTILINE) for root, dirs, files in os.walk(sdk_path): @@ -3898,10 +3896,10 @@ def get_android_tools_versions(ndk_path=None): return components -def get_android_tools_version_log(ndk_path=None): +def get_android_tools_version_log(): '''get a list of the versions of all installed Android SDK/NDK components''' log = '== Installed Android Tools ==\n\n' - components = get_android_tools_versions(ndk_path) + components = get_android_tools_versions() for name, version in sorted(components): log += '* ' + name + ' (' + version + ')\n' diff --git a/tests/build.TestCase b/tests/build.TestCase index f700b74c..809ed588 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -362,7 +362,7 @@ class BuildTest(unittest.TestCase): with mock.patch( 'fdroidserver.common.force_exit', lambda *args: None ) as a, mock.patch( - 'fdroidserver.common.get_android_tools_version_log', lambda s: 'fake' + 'fdroidserver.common.get_android_tools_version_log', lambda: 'fake' ) as b, mock.patch( 'fdroidserver.common.FDroidPopen', FakeProcess ) as c, mock.patch( From 6eb895a7005504a464d34957533ff0f2df22cf06 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 26 May 2021 19:42:15 +0200 Subject: [PATCH 0268/2116] makebuilserver: only install most recent two releases --- makebuildserver | 6 ------ 1 file changed, 6 deletions(-) diff --git a/makebuildserver b/makebuildserver index d1298720..ad8dc48f 100755 --- a/makebuildserver +++ b/makebuildserver @@ -281,14 +281,8 @@ CACHE_FILES = [ '565af786dc0cc1941002174fb945122eabd080b222cd4c7c3d9a2ae0fabf5dc4'), ('https://dl.google.com/android/repository/build-tools_r30.0.3-linux.zip', '24593500aa95d2f99fb4f10658aae7e65cb519be6cd33fa164f15f27f3c4a2d6'), - ('https://services.gradle.org/distributions/gradle-6.8.2-bin.zip', - '8de6efc274ab52332a9c820366dd5cf5fc9d35ec7078fd70c8ec6913431ee610'), ('https://services.gradle.org/distributions/gradle-6.8.3-bin.zip', '7faa7198769f872826c8ef4f1450f839ec27f0b4d5d1e51bade63667cbccd205'), - ('https://services.gradle.org/distributions/gradle-7.0-bin.zip', - 'eb8b89184261025b0430f5b2233701ff1377f96da1ef5e278af6ae8bac5cc305'), - ('https://services.gradle.org/distributions/gradle-7.0.1-bin.zip', - 'dccda8aa069563c8ba2f6cdfd0777df0e34a5b4d15138ca8b9757e94f4e8a8cb'), ('https://services.gradle.org/distributions/gradle-7.0.2-bin.zip', '0e46229820205440b48a5501122002842b82886e76af35f0f3a069243dca4b3c'), ('https://dl.google.com/android/repository/android-ndk-r21e-linux-x86_64.zip', From adafd4560c2a9c1f3a17eb371b130a8742caf229 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 28 May 2021 09:02:19 +0200 Subject: [PATCH 0269/2116] provision-android-sdk: ensure ANDROID_HOME parent dir is accessible by all https://gitlab.com/fdroid/fdroidserver/-/merge_requests/926#note_586778883 --- buildserver/provision-android-sdk | 1 + 1 file changed, 1 insertion(+) diff --git a/buildserver/provision-android-sdk b/buildserver/provision-android-sdk index d0e73d8a..1ca5ec19 100644 --- a/buildserver/provision-android-sdk +++ b/buildserver/provision-android-sdk @@ -122,6 +122,7 @@ echo y | $ANDROID_HOME/tools/bin/sdkmanager "extras;m2repository;com;android;sup echo y | $ANDROID_HOME/tools/bin/sdkmanager "extras;m2repository;com;android;support;constraint;constraint-layout;1.0.2" echo y | $ANDROID_HOME/tools/bin/sdkmanager "extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.2" +chmod a+X $(dirname $ANDROID_HOME/) chmod -R a+rX $ANDROID_HOME/ chgrp vagrant $ANDROID_HOME chmod g+w $ANDROID_HOME From 45bd89b3a235070f0ac143747451ae9dcccdc104 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 28 May 2021 09:23:16 +0200 Subject: [PATCH 0270/2116] build: missing NDK is now a warning not a critical error --- fdroidserver/build.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 6c3fa790..7c4d900b 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -361,12 +361,12 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext ndk_path = build.ndk_path() if build.ndk or (build.buildjni and build.buildjni != ['no']): if not ndk_path: - logging.critical("Android NDK version '%s' could not be found!" % build.ndk) - logging.critical("Configured versions:") + logging.warning("Android NDK version '%s' could not be found!" % build.ndk) + logging.warning("Configured versions:") for k, v in config['ndk_paths'].items(): if k.endswith("_orig"): continue - logging.critical(" %s: %s" % (k, v)) + logging.warning(" %s: %s" % (k, v)) if onserver: common.auto_install_ndk(build) else: From 153b5d43929f4094414dd7388c5c8a6512f91aaf Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 28 May 2021 10:21:52 +0200 Subject: [PATCH 0271/2116] stop modifying default_config when running fill_config_defaults() dicts and lists are passed by reference in assignments, so this needs to copy them instead. --- fdroidserver/common.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 851fdea5..4af0595f 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -224,7 +224,10 @@ def fill_config_defaults(thisconfig): """ for k, v in default_config.items(): if k not in thisconfig: - thisconfig[k] = v + if isinstance(v, dict) or isinstance(v, list): + thisconfig[k] = v.copy() + else: + thisconfig[k] = v # Expand paths (~users and $vars) def expand_path(path): From 52ac0f0176b0808e8c4d1c45d249c8c853632167 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 28 May 2021 10:32:09 +0200 Subject: [PATCH 0272/2116] ndk-release-checksums.py: fix crash, there is no version here --- tests/ndk-release-checksums.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ndk-release-checksums.py b/tests/ndk-release-checksums.py index 6e99d6a0..4f7574b7 100755 --- a/tests/ndk-release-checksums.py +++ b/tests/ndk-release-checksums.py @@ -131,7 +131,7 @@ if git_repo.is_dirty() and 'fdroidserver/common.py' in modified: 'source_branch': branch.name, 'target_project_id': 36527, # fdroid/fdroidserver 'target_branch': 'master', - 'title': 'update to gradle v' + version, + 'title': 'update NDK', 'description': description, 'labels': ['fdroid-bot', 'buildserver'], 'remove_source_branch': True, From af088c9c91c8a633ac41f791bef83d74c192f96f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 27 May 2021 15:54:45 +0200 Subject: [PATCH 0273/2116] add checksums for basebox 0.6.1 --- makebuildserver | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/makebuildserver b/makebuildserver index ad8dc48f..7895196b 100755 --- a/makebuildserver +++ b/makebuildserver @@ -46,6 +46,19 @@ tail = None BASEBOX_DEFAULT = 'fdroid/basebox-stretch64' BASEBOX_VERSION_DEFAULT = '0.5.1' BASEBOX_CHECKSUMS = { + '0.6.1': { + 'libvirt': { + 'box.img': 'a45342ad238271815f9197325cd0317d6df87e1c20372015532919d817d0dc07', + 'metadata.json': '9b5f62362ce3cd25c50881d8ae124879fc21ed4fdb16cc78d57058f116680f25', + 'Vagrantfile': '4435901624f21dad201c3bd7f0d8d4ece842bc9fbbb70e312eee54f07173f24e', + }, + 'virtualbox': { + 'box-disk1.vmdk': '6b536f26dcee137aca9a3f5f6f20aef795193ef2e8c387a0ffbdb7c5fe2ec0fb', + 'box.ovf': 'cbdd6315187d4ce8ff15ed5a00a2c8b0d33abe6b0356439ce4d8d9ac3724f875', + 'metadata.json': '098439524f76cafe026140b787ca419297a055a3f6006b9d60e6d5326d18ba99', + 'Vagrantfile': '95c64a0e82a6420845c05038c4c97b3aba629b09eb2b78e879423d06f6b54a54', + } + }, '0.6.0': { 'libvirt': { 'box.img': '82c2c3548cf48f0f4c6601f40f8bec36ff37e9a74d6f717067a526250ad790ad', From 19e1e5f438b491de68618a18ea817c437bea36e6 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sun, 30 May 2021 12:41:20 +0200 Subject: [PATCH 0274/2116] Fix ruamel round_trip_dump will be removed https://sourceforge.net/p/ruamel-yaml/code/ci/4b91cd7e820baf97d8d28b1dcf77979530d43c3c/#diff-1 --- fdroidserver/metadata.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 21147e30..1cc86f8e 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -968,7 +968,9 @@ def write_yaml(mf, app): return builds yaml_app = _app_to_yaml(app) - ruamel.yaml.round_trip_dump(yaml_app, mf, indent=4, block_seq_indent=2) + yaml = ruamel.yaml.YAML() + yaml.indent(mapping=4, sequence=4, offset=2) + yaml.dump(yaml_app, stream=mf) build_line_sep = re.compile(r'(? Date: Sun, 30 May 2021 11:12:42 +0200 Subject: [PATCH 0275/2116] Support AutoUpdateMode: Version without pattern Since 24dd6740 UpdateCheckMode: Tags uses the found tag instead of regenerating it from the AutoUpdateMode pattern making the pattern superfluous. This adds support for dropping the pattern and a test case. --- fdroidserver/checkupdates.py | 2 +- fdroidserver/metadata.py | 2 +- tests/checkupdates.TestCase | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index aa8f6ff8..4d2e45ef 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -492,7 +492,7 @@ def checkupdates_app(app): logging.warning("Can't auto-update app with no CurrentVersionCode: " + app.id) elif mode in ('None', 'Static'): pass - elif mode.startswith('Version '): + elif mode.startswith('Version'): pattern = mode[8:] suffix = '' if pattern.startswith('+'): diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 1cc86f8e..f6524864 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -447,7 +447,7 @@ valuetypes = { ["AntiFeatures"]), FieldValidator("Auto Update Mode", - r"^(Version .+|None)$", + r"^(Version.*|None)$", ["AutoUpdateMode"]), FieldValidator("Update Check Mode", diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index 0fff202d..65b2907a 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -106,6 +106,38 @@ class CheckupdatesTest(unittest.TestCase): fdroidserver.checkupdates.checkupdates_app(app) wrmock.assert_called_with(app.metadatapath, app) + def test_checkupdates_app_tags(self): + fdroidserver.checkupdates.options = mock.Mock() + fdroidserver.checkupdates.options.auto = 'bleh' + fdroidserver.checkupdates.config = {} + + app = fdroidserver.metadata.App() + app.id = 'loop.starts.shooting' + app.metadatapath = 'metadata/' + app.id + '.yml' + app.CurrentVersion = '1.1.8' + app.CurrentVersionCode = 10108 + app.UpdateCheckMode = 'Tags' + app.AutoUpdateMode = 'Version' + + build = fdroidserver.metadata.Build() + build.versionCode = app.CurrentVersionCode + build.versionName = app.CurrentVersion + app['Builds'].append(build) + + with mock.patch('fdroidserver.checkupdates.check_tags', lambda app, + pattern: (None, 'bla', None)): + fdroidserver.checkupdates.checkupdates_app(app) + + with mock.patch('fdroidserver.checkupdates.check_tags', lambda app, + pattern: ('1.1.9', 10109, 'v1.1.9')): + with mock.patch('fdroidserver.metadata.write_metadata', + mock.Mock()): + with mock.patch('subprocess.call', lambda cmd: 0): + fdroidserver.checkupdates.checkupdates_app(app) + build = app['Builds'][-1] + self.assertEqual(build.versionName, '1.1.9') + self.assertEqual(build.commit, 'v1.1.9') + def test_check_http(self): fdroidserver.checkupdates.options = mock.Mock() From d6c8ecc3bc5ee12d9f7ca166bf284a2537236e2b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 1 Jun 2021 13:43:23 +0200 Subject: [PATCH 0276/2116] fix broken NDK extraction routine to correctly name resulting dir If there were other NDKs installed, this just tried to rename the first installed NDK. Now it tries to rename all NDKs that are not named after the NDK version. !926 !927 --- fdroidserver/common.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 4af0595f..63be8332 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4117,15 +4117,16 @@ def _install_ndk(ndk): zipfp.extract(info.filename, path=ndk_base) os.chmod(os.path.join(ndk_base, info.filename), 0o644) # nosec bandit B103 os.remove(zipball) - extracted = glob.glob(os.path.join(ndk_base, '*'))[0] - version = get_ndk_version(extracted) - ndk_dir = os.path.join(ndk_base, version) - os.rename(extracted, ndk_dir) - if 'ndk_paths' not in config: - config['ndk_paths'] = dict() - config['ndk_paths'][ndk] = ndk_dir - logging.info(_('Set NDK {release} ({version}) up') - .format(release=ndk, version=version)) + for extracted in glob.glob(os.path.join(ndk_base, '*')): + version = get_ndk_version(extracted) + if os.path.basename(extracted) != version: + ndk_dir = os.path.join(ndk_base, version) + os.rename(extracted, ndk_dir) + if 'ndk_paths' not in config: + config['ndk_paths'] = dict() + config['ndk_paths'][ndk] = ndk_dir + logging.info(_('Set NDK {release} ({version}) up') + .format(release=ndk, version=version)) """Derived from https://gitlab.com/fdroid/android-sdk-transparency-log/-/blob/master/checksums.json""" From 28a4f9481ac3c19488b8ca5b518f2c89f4b76eab Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 1 Jun 2021 13:53:29 +0200 Subject: [PATCH 0277/2116] provision-android-ndk: do all configuration via args This makes it so it is easy to reuse this script in other contexts, like in Docker, GitLab CI, etc. --- buildserver/Vagrantfile | 2 +- buildserver/provision-android-ndk | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/buildserver/Vagrantfile b/buildserver/Vagrantfile index ef1a407a..16bc2305 100644 --- a/buildserver/Vagrantfile +++ b/buildserver/Vagrantfile @@ -84,7 +84,7 @@ Vagrant.configure("2") do |config| args: [configfile['debian_mirror']] config.vm.provision "shell", path: "provision-android-sdk" config.vm.provision "shell", path: "provision-android-ndk", - args: ["/opt/android-sdk/ndk"] + args: ["/opt/android-sdk/ndk", "r21e", "r22b"] config.vm.provision "shell", path: "provision-gradle" end diff --git a/buildserver/provision-android-ndk b/buildserver/provision-android-ndk index 99e7c32e..9672b309 100644 --- a/buildserver/provision-android-ndk +++ b/buildserver/provision-android-ndk @@ -1,16 +1,19 @@ #!/bin/bash # +# $1 is the root dir to install the NDKs into +# $2 and after are the NDK releases to install echo $0 set -e set -x NDK_BASE=$1 +shift test -e $NDK_BASE || mkdir -p $NDK_BASE cd $NDK_BASE -for version in r21e r22b; do +for version in $@; do if [ ! -e ${NDK_BASE}/${version} ]; then unzip /vagrant/cache/android-ndk-${version}-linux-x86_64.zip > /dev/null mv android-ndk-${version} \ From faa15f336ca9e54c7cca6787aff4222966fd0713 Mon Sep 17 00:00:00 2001 From: Teen Date: Fri, 4 Jun 2021 17:29:56 +0000 Subject: [PATCH 0278/2116] Added missing linebreak --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 19b19a08..830a71e7 100644 --- a/README.md +++ b/README.md @@ -88,5 +88,6 @@ with _jenkins-_ since they are run on https://jenkins.debian.net. Everything can be translated. See [Translation and Localization](https://f-droid.org/docs/Translation_and_Localization) -for more info. +for more info. + [![translation status](https://hosted.weblate.org/widgets/f-droid/-/fdroidserver/multi-auto.svg)](https://hosted.weblate.org/engage/f-droid/?utm_source=widget) From cb09a16133f56bf2d76e7cf67b0ae956087b3b63 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 1 Jun 2021 15:02:32 +0200 Subject: [PATCH 0279/2116] tests/ndk-release-checksums.py: fix parsing of NDK r10e This wasn't finding r10e properly, so it would submit merge requests to remove r10e from _fdroidserver_. * !940 * !930 --- hooks/pre-commit | 2 +- tests/ndk-release-checksums.py | 17 ++++++----------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/hooks/pre-commit b/hooks/pre-commit index 78fcf8ed..dfd608f9 100755 --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -8,7 +8,7 @@ exec 1>&2 files=`git diff-index --cached HEAD 2>&1 | sed 's/^:.* //' | uniq | cut -b100-500` if [ -z "$files" ]; then - PY_FILES="fdroid makebuildserver setup.py fdroidserver/*.py examples/*.py tests/gradle-release-checksums.py" + PY_FILES="fdroid makebuildserver setup.py fdroidserver/*.py examples/*.py tests/*-release-checksums.py" PY_TEST_FILES="tests/*.TestCase" SH_FILES="hooks/pre-commit" BASH_FILES="gradlew-fdroid jenkins-build-all jenkins-setup-build-environment jenkins-test completion/bash-completion buildserver/provision-*" diff --git a/tests/ndk-release-checksums.py b/tests/ndk-release-checksums.py index 4f7574b7..b948abf0 100755 --- a/tests/ndk-release-checksums.py +++ b/tests/ndk-release-checksums.py @@ -35,25 +35,20 @@ errors = 0 release = None revision = None for k, entries in checksums.items(): - if k.startswith('https://dl.google.com/android/repository/android-ndk'): + if k.endswith('.zip') and k.startswith( + 'https://dl.google.com/android/repository/android-ndk' + ): m = re.search(r'-(r[1-9][0-9]?[a-z]?)-linux', k) if m: + d = {'url': k, 'release': m.group(1), 'sha256': checksums[k][0]['sha256']} for entry in entries: if 'source.properties' in entry: n = re.search( r'[1-9][0-9]\.[0-9]\.[0-9]{7}', entry['source.properties'] ) if n: - release = m.group(1) - revision = n.group() - ndks.append( - { - 'url': k, - 'release': release, - 'revision': revision, - 'sha256': checksums[k][0]['sha256'], - } - ) + d['revision'] = n.group() + ndks.append(d) for d in config['NDKS']: if k == d['url']: sha256 = d['sha256'] From d05ff9db1d61262c62ad59911b260c30cdf3a3ad Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 7 Jun 2021 11:49:21 +0200 Subject: [PATCH 0280/2116] easy changes to black code format in test cases This does not change areas of code that should be manually reformatted. --- tests/build.TestCase | 76 ++++--- tests/checkupdates.TestCase | 12 +- tests/common.TestCase | 395 +++++++++++++++++++++++++----------- tests/deploy.TestCase | 164 +++++++++------ tests/exception.TestCase | 12 +- tests/import.TestCase | 43 +++- tests/index.TestCase | 139 ++++++++----- tests/init.TestCase | 20 +- tests/install.TestCase | 12 +- tests/lint.TestCase | 12 +- tests/main.TestCase | 175 ++++++++++------ tests/metadata.TestCase | 210 ++++++++++++++----- tests/publish.TestCase | 76 ++++--- tests/rewritemeta.TestCase | 39 +++- tests/scanner.TestCase | 81 +++++--- tests/signatures.TestCase | 13 +- tests/update.TestCase | 213 +++++++++++-------- tests/vcs.TestCase | 16 +- 18 files changed, 1144 insertions(+), 564 deletions(-) diff --git a/tests/build.TestCase b/tests/build.TestCase index 809ed588..51ae8fea 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -242,12 +242,15 @@ class BuildTest(unittest.TestCase): os.mkdir('bin') os.mkdir('gen') with open('build.xml', 'w') as fp: - fp.write(textwrap.dedent( - """ + fp.write( + textwrap.dedent( + """ - """)) + """ + ) + ) def make_fake_apk(output, build): with open(build.output, 'w') as fp: @@ -277,7 +280,9 @@ class BuildTest(unittest.TestCase): self.assertFalse(os.path.exists('gradle-wrapper.jar')) def test_scan_with_extlib(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) os.mkdir("build") @@ -293,9 +298,11 @@ class BuildTest(unittest.TestCase): os.makedirs("extlib/android") # write a fake binary jar file the scanner should definitely error on with open('extlib/android/android-support-v4r11.jar', 'wb') as file: - file.write(b'PK\x03\x04\x14\x00\x08\x00\x08\x00-\x0eiA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x04\x00META-INF/\xfe\xca\x00\x00\x03\x00PK\x07\x08\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00') + file.write( + b'PK\x03\x04\x14\x00\x08\x00\x08\x00-\x0eiA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x04\x00META-INF/\xfe\xca\x00\x00\x03\x00PK\x07\x08\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00' + ) - class FakeVcs(): + class FakeVcs: # no need to change to the correct commit here def gotorevision(self, rev, refresh=True): pass @@ -307,15 +314,17 @@ class BuildTest(unittest.TestCase): build.extlibs = [] os.makedirs('build/libs') shutil.copy('extlib/android/android-support-v4r11.jar', 'build/libs') - fdroidserver.common.prepare_source(FakeVcs(), app, build, - "build", "ignore", "extlib") + fdroidserver.common.prepare_source( + FakeVcs(), app, build, "build", "ignore", "extlib" + ) count = fdroidserver.scanner.scan_source("build", build) self.assertEqual(1, count, "Should produce a scanner error without extlib") # Now try again as an extlib build.extlibs = ['android/android-support-v4r11.jar'] - fdroidserver.common.prepare_source(FakeVcs(), app, build, - "build", "ignore", "extlib") + fdroidserver.common.prepare_source( + FakeVcs(), app, build, "build", "ignore", "extlib" + ) count = fdroidserver.scanner.scan_source("build", build) self.assertEqual(0, count, "Shouldn't error on jar from extlib") @@ -335,25 +344,31 @@ class BuildTest(unittest.TestCase): os.mkdir('metadata') appid = 'info.guardianproject.checkey' metadata_file = os.path.join('metadata', appid + '.yml') - shutil.copy(os.path.join(self.basedir, metadata_file), - 'metadata') + shutil.copy(os.path.join(self.basedir, metadata_file), 'metadata') with open(metadata_file) as fp: app = fdroidserver.metadata.App(yaml.safe_load(fp)) app['RepoType'] = 'git' - app['Binaries'] = 'https://example.com/fdroid/repo/info.guardianproject.checkey_%v.apk' - build = fdroidserver.metadata.Build({ - 'versionCode': 123, - 'versionName': '1.2.3', - 'commit': '1.2.3', - 'disable': False, - }) + app[ + 'Binaries' + ] = 'https://example.com/fdroid/repo/info.guardianproject.checkey_%v.apk' + build = fdroidserver.metadata.Build( + { + 'versionCode': 123, + 'versionName': '1.2.3', + 'commit': '1.2.3', + 'disable': False, + } + ) app['Builds'] = [build] fdroidserver.metadata.write_metadata(metadata_file, app) os.makedirs(os.path.join('unsigned', 'binaries')) - production_result = os.path.join('unsigned', '%s_%d.apk' % (appid, build['versionCode'])) - production_compare_file = os.path.join('unsigned', 'binaries', - '%s_%d.binary.apk' % (appid, build['versionCode'])) + production_result = os.path.join( + 'unsigned', '%s_%d.apk' % (appid, build['versionCode']) + ) + production_compare_file = os.path.join( + 'unsigned', 'binaries', '%s_%d.binary.apk' % (appid, build['versionCode']) + ) os.makedirs(os.path.join('tmp', 'binaries')) test_result = os.path.join('tmp', '%s_%d.apk' % (appid, build['versionCode'])) test_compare_file = os.path.join( @@ -385,7 +400,9 @@ class BuildTest(unittest.TestCase): # failed comparison open(production_result, 'w').close() open(production_compare_file, 'w').close() - with mock.patch('fdroidserver.common.verify_apks', lambda *args: 'failed'): + with mock.patch( + 'fdroidserver.common.verify_apks', lambda *args: 'failed' + ): fdroidserver.build.main() self.assertFalse(os.path.exists(production_result)) self.assertFalse(os.path.exists(production_compare_file)) @@ -403,7 +420,9 @@ class BuildTest(unittest.TestCase): # failed comparison open(test_result, 'w').close() open(test_compare_file, 'w').close() - with mock.patch('fdroidserver.common.verify_apks', lambda *args: 'failed'): + with mock.patch( + 'fdroidserver.common.verify_apks', lambda *args: 'failed' + ): fdroidserver.build.main() self.assertTrue(os.path.exists(test_result)) self.assertFalse(os.path.exists(test_compare_file)) @@ -415,8 +434,13 @@ if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) parser = optparse.OptionParser() - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="Spew out even more information than normal") + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index 65b2907a..87ccdb99 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -12,7 +12,8 @@ from unittest import mock localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) @@ -190,8 +191,13 @@ if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) parser = optparse.OptionParser() - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="Spew out even more information than normal") + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() diff --git a/tests/common.TestCase b/tests/common.TestCase index d73bc497..a47fe75b 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -25,7 +25,8 @@ from unittest import mock localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) @@ -60,9 +61,17 @@ class CommonTest(unittest.TestCase): os.environ['ANDROID_HOME'] = self.android_home def test_parse_human_readable_size(self): - for k, v in ((9827, 9827), (123.456, 123), ('123b', 123), ('1.2', 1), - ('10.43 KiB', 10680), ('11GB', 11000000000), ('59kb', 59000), - ('343.1 mb', 343100000), ('99.9GiB', 107266808217)): + for k, v in ( + (9827, 9827), + (123.456, 123), + ('123b', 123), + ('1.2', 1), + ('10.43 KiB', 10680), + ('11GB', 11000000000), + ('59kb', 59000), + ('343.1 mb', 343100000), + ('99.9GiB', 107266808217), + ): self.assertEqual(fdroidserver.common.parse_human_readable_size(k), v) for v in ((12, 123), '0xfff', [], None, '12,123', '123GG', '982374bb', self): with self.assertRaises(ValueError): @@ -74,21 +83,26 @@ class CommonTest(unittest.TestCase): fdroidserver.common.assert_config_keystore({}) with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): - c = {'repo_keyalias': 'localhost', - 'keystore': 'keystore.jks', - 'keystorepass': '12345', - 'keypass': '12345'} + c = { + 'repo_keyalias': 'localhost', + 'keystore': 'keystore.jks', + 'keystorepass': '12345', + 'keypass': '12345', + } with open('keystore.jks', 'w'): pass fdroidserver.common.assert_config_keystore(c) def _set_build_tools(self): - build_tools = os.path.join(fdroidserver.common.config['sdk_path'], 'build-tools') + build_tools = os.path.join( + fdroidserver.common.config['sdk_path'], 'build-tools' + ) if os.path.exists(build_tools): for f in sorted(os.listdir(build_tools), reverse=True): versioned = os.path.join(build_tools, f) - if os.path.isdir(versioned) \ - and os.path.isfile(os.path.join(versioned, 'apksigner')): + if os.path.isdir(versioned) and os.path.isfile( + os.path.join(versioned, 'apksigner') + ): break return True else: @@ -121,20 +135,28 @@ class CommonTest(unittest.TestCase): print('no build-tools found: ' + build_tools) def test_find_java_root_path(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) all_pathlists = [ - ([ # Debian - '/usr/lib/jvm/java-1.5.0-gcj-5-amd64', + ( + [ # Debian + '/usr/lib/jvm/java-1.5.0-gcj-5-amd64', + '/usr/lib/jvm/java-8-openjdk-amd64', + '/usr/lib/jvm/java-1.8.0-openjdk-amd64', + ], '/usr/lib/jvm/java-8-openjdk-amd64', - '/usr/lib/jvm/java-1.8.0-openjdk-amd64', - ], '/usr/lib/jvm/java-8-openjdk-amd64'), - ([ # OSX + ), + ( + [ # OSX + '/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk', + '/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk', + '/System/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk', + ], '/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk', - '/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk', - '/System/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk', - ], '/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk'), + ), ] for pathlist, choice in all_pathlists: @@ -166,8 +188,10 @@ class CommonTest(unittest.TestCase): testfiles.append(os.path.join(self.basedir, 'urzip-badsig.apk')) testfiles.append(os.path.join(self.basedir, 'urzip-badcert.apk')) for apkfile in testfiles: - self.assertTrue(fdroidserver.common.is_apk_and_debuggable(apkfile), - "debuggable APK state was not properly parsed!") + self.assertTrue( + fdroidserver.common.is_apk_and_debuggable(apkfile), + "debuggable APK state was not properly parsed!", + ) # these are set NOT debuggable testfiles = [] @@ -175,8 +199,10 @@ class CommonTest(unittest.TestCase): testfiles.append(os.path.join(self.basedir, 'urzip-release-unsigned.apk')) testfiles.append(os.path.join(self.basedir, 'v2.only.sig_2.apk')) for apkfile in testfiles: - self.assertFalse(fdroidserver.common.is_apk_and_debuggable(apkfile), - "debuggable APK state was not properly parsed!") + self.assertFalse( + fdroidserver.common.is_apk_and_debuggable(apkfile), + "debuggable APK state was not properly parsed!", + ) VALID_STRICT_PACKAGE_NAMES = [ "An.stop", @@ -203,44 +229,63 @@ class CommonTest(unittest.TestCase): def test_is_valid_package_name(self): for name in self.VALID_STRICT_PACKAGE_NAMES + [ - "_SpeedoMeterApp.main", - "05041684efd9b16c2888b1eddbadd0359f655f311b89bdd1737f560a10d20fb8"]: - self.assertTrue(fdroidserver.common.is_valid_package_name(name), - "{0} should be a valid package name".format(name)) - for name in ["0rg.fdroid.fdroid", - ".f_droid.fdr0ID", - "trailingdot.", - "org.fdroid/fdroid", - "/org.fdroid.fdroid"]: - self.assertFalse(fdroidserver.common.is_valid_package_name(name), - "{0} should not be a valid package name".format(name)) + "_SpeedoMeterApp.main", + "05041684efd9b16c2888b1eddbadd0359f655f311b89bdd1737f560a10d20fb8", + ]: + self.assertTrue( + fdroidserver.common.is_valid_package_name(name), + "{0} should be a valid package name".format(name), + ) + for name in [ + "0rg.fdroid.fdroid", + ".f_droid.fdr0ID", + "trailingdot.", + "org.fdroid/fdroid", + "/org.fdroid.fdroid", + ]: + self.assertFalse( + fdroidserver.common.is_valid_package_name(name), + "{0} should not be a valid package name".format(name), + ) def test_is_strict_application_id(self): """see also tests/valid-package-names/""" for name in self.VALID_STRICT_PACKAGE_NAMES: - self.assertTrue(fdroidserver.common.is_strict_application_id(name), - "{0} should be a strict application id".format(name)) - for name in ["0rg.fdroid.fdroid", - ".f_droid.fdr0ID", - "oneword", - "trailingdot.", - "cafebabe", - "org.fdroid/fdroid", - "/org.fdroid.fdroid", - "_SpeedoMeterApp.main", - "05041684efd9b16c2888b1eddbadd0359f655f311b89bdd1737f560a10d20fb8"]: - self.assertFalse(fdroidserver.common.is_strict_application_id(name), - "{0} should not be a strict application id".format(name)) + self.assertTrue( + fdroidserver.common.is_strict_application_id(name), + "{0} should be a strict application id".format(name), + ) + for name in [ + "0rg.fdroid.fdroid", + ".f_droid.fdr0ID", + "oneword", + "trailingdot.", + "cafebabe", + "org.fdroid/fdroid", + "/org.fdroid.fdroid", + "_SpeedoMeterApp.main", + "05041684efd9b16c2888b1eddbadd0359f655f311b89bdd1737f560a10d20fb8", + ]: + self.assertFalse( + fdroidserver.common.is_strict_application_id(name), + "{0} should not be a strict application id".format(name), + ) def test_prepare_sources(self): testint = 99999999 teststr = 'FAKE_STR_FOR_TESTING' - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) - shutil.copytree(os.path.join(self.basedir, 'source-files'), - os.path.join(testdir, 'source-files')) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + shutil.copytree( + os.path.join(self.basedir, 'source-files'), + os.path.join(testdir, 'source-files'), + ) - fdroidclient_testdir = os.path.join(testdir, 'source-files', 'fdroid', 'fdroidclient') + fdroidclient_testdir = os.path.join( + testdir, 'source-files', 'fdroid', 'fdroidclient' + ) config = dict() config['sdk_path'] = os.getenv('ANDROID_HOME') @@ -257,7 +302,7 @@ class CommonTest(unittest.TestCase): build.versionName = teststr build.versionCode = testint - class FakeVcs(): + class FakeVcs: # no need to change to the correct commit here def gotorevision(self, rev, refresh=True): pass @@ -271,19 +316,29 @@ class CommonTest(unittest.TestCase): with open(os.path.join(fdroidclient_testdir, 'build.gradle'), 'r') as f: filedata = f.read() - self.assertIsNotNone(re.search(r"\s+compileSdkVersion %s\s+" % testint, filedata)) + self.assertIsNotNone( + re.search(r"\s+compileSdkVersion %s\s+" % testint, filedata) + ) with open(os.path.join(fdroidclient_testdir, 'AndroidManifest.xml')) as f: filedata = f.read() self.assertIsNone(re.search('android:debuggable', filedata)) - self.assertIsNotNone(re.search('android:versionName="%s"' % build.versionName, filedata)) - self.assertIsNotNone(re.search('android:versionCode="%s"' % build.versionCode, filedata)) + self.assertIsNotNone( + re.search('android:versionName="%s"' % build.versionName, filedata) + ) + self.assertIsNotNone( + re.search('android:versionCode="%s"' % build.versionCode, filedata) + ) def test_prepare_sources_with_prebuild_subdir(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) app_build_dir = os.path.join(testdir, 'build', 'com.example') - shutil.copytree(os.path.join(self.basedir, 'source-files', 'fdroid', 'fdroidclient'), - app_build_dir) + shutil.copytree( + os.path.join(self.basedir, 'source-files', 'fdroid', 'fdroidclient'), + app_build_dir, + ) subdir = 'baz/bar' subdir_path = os.path.join(app_build_dir, subdir) @@ -315,10 +370,10 @@ class CommonTest(unittest.TestCase): build.prebuild = 'test -d $$FakeSrcLib$$/testdirshouldexist' # actual test condition build.srclibs = [srclibname + '@1.2.3'] build.subdir = subdir - build.versionCode = 0xcafe + build.versionCode = 0xCAFE build.versionName = 'vCAFE' - class FakeVcs(): + class FakeVcs: # no need to change to the correct commit here def gotorevision(self, rev, refresh=True): pass @@ -333,7 +388,9 @@ class CommonTest(unittest.TestCase): def test_prepare_sources_refresh(self): packageName = 'org.fdroid.ci.test.app' - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) print('testdir', testdir) os.chdir(testdir) os.mkdir('build') @@ -379,14 +436,18 @@ class CommonTest(unittest.TestCase): fdroidserver.signindex.config = config sourcedir = os.path.join(self.basedir, 'signindex') - testsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) - for f in ('testy.jar', 'guardianproject.jar',): + testsdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + for f in ('testy.jar', 'guardianproject.jar'): sourcefile = os.path.join(sourcedir, f) testfile = os.path.join(testsdir, f) shutil.copy(sourcefile, testsdir) fdroidserver.signindex.sign_jar(testfile) # these should be resigned, and therefore different - self.assertNotEqual(open(sourcefile, 'rb').read(), open(testfile, 'rb').read()) + self.assertNotEqual( + open(sourcefile, 'rb').read(), open(testfile, 'rb').read() + ) def test_verify_apk_signature(self): config = fdroidserver.common.read_config(fdroidserver.common.options) @@ -450,13 +511,17 @@ class CommonTest(unittest.TestCase): sourceapk = os.path.join(self.basedir, 'urzip.apk') - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) print('testdir', testdir) copyapk = os.path.join(testdir, 'urzip-copy.apk') shutil.copy(sourceapk, copyapk) self.assertTrue(fdroidserver.common.verify_apk_signature(copyapk)) - self.assertIsNone(fdroidserver.common.verify_apks(sourceapk, copyapk, self.tmpdir)) + self.assertIsNone( + fdroidserver.common.verify_apks(sourceapk, copyapk, self.tmpdir) + ) unsignedapk = os.path.join(testdir, 'urzip-unsigned.apk') with ZipFile(sourceapk, 'r') as apk: @@ -464,7 +529,9 @@ class CommonTest(unittest.TestCase): for info in apk.infolist(): if not info.filename.startswith('META-INF/'): testapk.writestr(info, apk.read(info.filename)) - self.assertIsNone(fdroidserver.common.verify_apks(sourceapk, unsignedapk, self.tmpdir)) + self.assertIsNone( + fdroidserver.common.verify_apks(sourceapk, unsignedapk, self.tmpdir) + ) twosigapk = os.path.join(testdir, 'urzip-twosig.apk') otherapk = ZipFile(os.path.join(self.basedir, 'urzip-release.apk'), 'r') @@ -482,7 +549,9 @@ class CommonTest(unittest.TestCase): with tempfile.TemporaryDirectory() as tmpPath: cfgPath = os.path.join(tmpPath, 'config.py') with open(cfgPath, 'w') as f: - f.write(textwrap.dedent("""\ + f.write( + textwrap.dedent( + """\ # abc # test = 'example value' default_me= '%%%' @@ -491,7 +560,9 @@ class CommonTest(unittest.TestCase): do_not_touch = "good value" default_me="!!!" - key="123" # inline""")) + key="123" # inline""" + ) + ) cfg = {'key': '111', 'default_me_orig': 'orig'} fdroidserver.common.write_to_config(cfg, 'key', config_file=cfgPath) @@ -500,7 +571,10 @@ class CommonTest(unittest.TestCase): fdroidserver.common.write_to_config(cfg, 'new_key', value='new', config_file=cfgPath) with open(cfgPath, 'r') as f: - self.assertEqual(f.read(), textwrap.dedent("""\ + self.assertEqual( + f.read(), + textwrap.dedent( + """\ # abc test = 'test value' default_me = 'orig' @@ -511,7 +585,9 @@ class CommonTest(unittest.TestCase): key = "111" # inline new_key = "new" - """)) + """ + ), + ) def test_write_to_config_when_empty(self): with tempfile.TemporaryDirectory() as tmpPath: @@ -520,10 +596,15 @@ class CommonTest(unittest.TestCase): pass fdroidserver.common.write_to_config({}, 'key', 'val', cfgPath) with open(cfgPath, 'r') as f: - self.assertEqual(f.read(), textwrap.dedent("""\ + self.assertEqual( + f.read(), + textwrap.dedent( + """\ key = "val" - """)) + """ + ), + ) def test_apk_name_regex(self): good = [ @@ -626,7 +707,9 @@ class CommonTest(unittest.TestCase): def test_find_apksigner_config_overrides(self): """apksigner should come from config before any auto-detection""" - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) android_home = os.path.join(testdir, 'ANDROID_HOME') do_not_use = os.path.join(android_home, 'build-tools', '30.0.3', 'apksigner') @@ -643,7 +726,9 @@ class CommonTest(unittest.TestCase): def test_find_apksigner_prefer_path(self): """apksigner should come from PATH before ANDROID_HOME""" - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) apksigner = os.path.join(testdir, 'apksigner') @@ -666,7 +751,9 @@ class CommonTest(unittest.TestCase): def test_find_apksigner_prefer_newest(self): """apksigner should be the newest available in ANDROID_HOME""" - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) android_home = os.path.join(testdir, 'ANDROID_HOME') @@ -688,7 +775,9 @@ class CommonTest(unittest.TestCase): self.assertEqual(apksigner, config.get('apksigner')) def test_find_apksigner_system_package_android_home(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) android_home = os.getenv('ANDROID_HOME') if not android_home or not os.path.isdir(android_home): @@ -716,7 +805,9 @@ class CommonTest(unittest.TestCase): fdroidserver.common.config = config fdroidserver.signindex.config = config - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) unsigned = os.path.join(testdir, 'urzip-release-unsigned.apk') signed = os.path.join(testdir, 'urzip-release.apk') shutil.copy(os.path.join(self.basedir, 'urzip-release-unsigned.apk'), testdir) @@ -731,8 +822,10 @@ class CommonTest(unittest.TestCase): # now sign an APK with minSdkVersion >= 18 unsigned = os.path.join(testdir, 'duplicate.permisssions_9999999-unsigned.apk') signed = os.path.join(testdir, 'duplicate.permisssions_9999999.apk') - shutil.copy(os.path.join(self.basedir, 'repo', 'duplicate.permisssions_9999999.apk'), - os.path.join(unsigned)) + shutil.copy( + os.path.join(self.basedir, 'repo', 'duplicate.permisssions_9999999.apk'), + os.path.join(unsigned), + ) fdroidserver.common.apk_strip_v1_signatures(unsigned, strip_manifest=True) fdroidserver.common.sign_apk(unsigned, signed, config['keyalias']) self.assertTrue(os.path.isfile(signed)) @@ -1158,7 +1251,12 @@ class CommonTest(unittest.TestCase): 'org.tasks': 'app', 'ut.ewh.audiometrytest': 'app', } - for f in ('cn.wildfirechat.chat', 'com.anpmech.launcher', 'org.tasks', 'ut.ewh.audiometrytest'): + for f in ( + 'cn.wildfirechat.chat', + 'com.anpmech.launcher', + 'org.tasks', + 'ut.ewh.audiometrytest', + ): build_dir = os.path.join('source-files', f) paths = fdroidserver.common.get_all_gradle_and_manifests(build_dir) logging.info(paths) @@ -1182,21 +1280,27 @@ class CommonTest(unittest.TestCase): self.assertEqual(fdroidserver.common.parse_srclib_spec('@multi@at-signs@')) def test_bad_urls(self): - for url in ('asdf', - 'file://thing.git', - 'https:///github.com/my/project', - 'git:///so/many/slashes', - 'ssh:/notabug.org/missing/a/slash', - 'git:notabug.org/missing/some/slashes', - 'https//github.com/bar/baz'): + for url in ( + 'asdf', + 'file://thing.git', + 'https:///github.com/my/project', + 'git:///so/many/slashes', + 'ssh:/notabug.org/missing/a/slash', + 'git:notabug.org/missing/some/slashes', + 'https//github.com/bar/baz', + ): with self.assertRaises(ValueError): fdroidserver.common.get_app_from_url(url) def test_remove_signing_keys(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) print(testdir) - shutil.copytree(os.path.join(self.basedir, 'source-files'), - os.path.join(testdir, 'source-files')) + shutil.copytree( + os.path.join(self.basedir, 'source-files'), + os.path.join(testdir, 'source-files'), + ) os.chdir(testdir) with_signingConfigs = [ 'source-files/com.seafile.seadroid2/app/build.gradle', @@ -1279,11 +1383,16 @@ class CommonTest(unittest.TestCase): def test_deploy_build_log_with_rsync_with_id_file(self): - mocklogcontent = bytes(textwrap.dedent("""\ + mocklogcontent = bytes( + textwrap.dedent( + """\ build started building... build completed - profit!"""), 'utf-8') + profit!""" + ), + 'utf-8', + ) fdroidserver.common.options = mock.Mock() fdroidserver.common.options.verbose = False @@ -1291,7 +1400,8 @@ class CommonTest(unittest.TestCase): fdroidserver.common.config = {} fdroidserver.common.config['serverwebroot'] = [ 'example.com:/var/www/fdroid/', - 'example.com:/var/www/fbot/'] + 'example.com:/var/www/fbot/', + ] fdroidserver.common.config['deploy_process_logs'] = True fdroidserver.common.config['identity_file'] = 'ssh/id_rsa' @@ -1344,7 +1454,9 @@ class CommonTest(unittest.TestCase): self.assertEqual(f.read(), mocklogcontent) def test_deploy_status_json(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) fakesubcommand = 'fakesubcommand' fake_timestamp = 1234567890 @@ -1468,42 +1580,54 @@ class CommonTest(unittest.TestCase): def test_run_yamllint_wellformed(self): try: import yamllint.config + yamllint.config # make pyflakes ignore this except ImportError: self.skipTest('yamllint not installed') with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('wellformed.yml', 'w') as f: - f.write(textwrap.dedent('''\ + f.write( + textwrap.dedent( + '''\ yaml: file: - for - test purposeses: true - ''')) + ''' + ) + ) result = fdroidserver.common.run_yamllint('wellformed.yml') self.assertEqual(result, '') def test_run_yamllint_malformed(self): try: import yamllint.config + yamllint.config # make pyflakes ignore this except ImportError: self.skipTest('yamllint not installed') with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('malformed.yml', 'w') as f: - f.write(textwrap.dedent('''\ + f.write( + textwrap.dedent( + '''\ yaml: - that fails - test - ''')) + ''' + ) + ) result = fdroidserver.common.run_yamllint('malformed.yml') self.assertIsNotNone(result) self.assertNotEqual(result, '') def test_with_no_config(self): """It should set defaults if no config file is found""" - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) self.assertFalse(os.path.exists('config.yml')) self.assertFalse(os.path.exists('config.py')) @@ -1513,7 +1637,9 @@ class CommonTest(unittest.TestCase): def test_with_config_yml(self): """Make sure it is possible to use config.yml alone.""" - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) with open('config.yml', 'w') as fp: fp.write('apksigner: yml') @@ -1524,7 +1650,9 @@ class CommonTest(unittest.TestCase): def test_with_config_yml_with_env_var(self): """Make sure it is possible to use config.yml alone.""" - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) os.environ['SECRET'] = 'mysecretpassword' with open('config.yml', 'w') as fp: @@ -1536,7 +1664,9 @@ class CommonTest(unittest.TestCase): def test_with_config_py(self): """Make sure it is still possible to use config.py alone.""" - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) with open('config.py', 'w') as fp: fp.write('apksigner = "py"') @@ -1547,7 +1677,9 @@ class CommonTest(unittest.TestCase): def test_config_perm_warning(self): """Exercise the code path that issues a warning about unsafe permissions.""" - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) with open('config.yml', 'w') as fp: fp.write('keystore: foo.jks') @@ -1565,7 +1697,9 @@ class CommonTest(unittest.TestCase): def test_with_both_config_yml_py(self): """If config.yml and config.py are present, config.py should be ignored.""" - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) with open('config.yml', 'w') as fp: fp.write('apksigner: yml') @@ -1577,7 +1711,9 @@ class CommonTest(unittest.TestCase): self.assertEqual('yml', config.get('apksigner')) def test_write_to_config_yml(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) with open('config.yml', 'w') as fp: fp.write('apksigner: yml') @@ -1594,7 +1730,9 @@ class CommonTest(unittest.TestCase): self.assertEqual('mysecretpassword', config['keypass']) def test_write_to_config_py(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) with open('config.py', 'w') as fp: fp.write('apksigner = "py"') @@ -1609,7 +1747,9 @@ class CommonTest(unittest.TestCase): self.assertEqual('mysecretpassword', config['keypass']) def test_config_dict_with_int_keys(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) with open('config.yml', 'w') as fp: fp.write('java_paths:\n 8: /usr/lib/jvm/java-8-openjdk\n') @@ -1646,7 +1786,9 @@ class CommonTest(unittest.TestCase): self.assertEqual(subcommand, data['subcommand']) def test_setup_status_output_in_git_repo(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) logging.getLogger('git.cmd').setLevel(logging.INFO) @@ -1722,25 +1864,25 @@ class CommonTest(unittest.TestCase): allow_vercodes = False self.assertEqual( {'org.fdroid.fdroid': []}, - fdroidserver.common.read_pkg_args(['org.fdroid.fdroid'], allow_vercodes) + fdroidserver.common.read_pkg_args(['org.fdroid.fdroid'], allow_vercodes), ) self.assertNotEqual( {'com.example': ['123456']}, - fdroidserver.common.read_pkg_args(['com.example:123456'], allow_vercodes) + fdroidserver.common.read_pkg_args(['com.example:123456'], allow_vercodes), ) allow_vercodes = True self.assertEqual( {'org.fdroid.fdroid': []}, - fdroidserver.common.read_pkg_args(['org.fdroid.fdroid'], allow_vercodes) + fdroidserver.common.read_pkg_args(['org.fdroid.fdroid'], allow_vercodes), ) self.assertEqual( {'com.example': ['123456']}, - fdroidserver.common.read_pkg_args(['com.example:123456'], allow_vercodes) + fdroidserver.common.read_pkg_args(['com.example:123456'], allow_vercodes), ) self.assertEqual( {'org.debian_kit': ['6']}, - fdroidserver.common.read_pkg_args(['org.debian_kit_6.apk'], allow_vercodes) + fdroidserver.common.read_pkg_args(['org.debian_kit_6.apk'], allow_vercodes), ) appid_versionCode_pairs = ( 'org.fdroid.fdroid:1', @@ -1757,11 +1899,13 @@ class CommonTest(unittest.TestCase): ) self.assertEqual( {'com.example': ['67890'], 'org.c_base.c_beam': ['29']}, - fdroidserver.common.read_pkg_args(appid_versionCode_pairs, allow_vercodes) + fdroidserver.common.read_pkg_args(appid_versionCode_pairs, allow_vercodes), ) def test_apk_strip_v1_signatures(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) before = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') after = os.path.join(testdir, 'after.apk') shutil.copy(before, after) @@ -1780,9 +1924,9 @@ class CommonTest(unittest.TestCase): os.path.join('metadata', appid, 'signatures', vc, '28969C09.RSA'), os.path.join('metadata', appid, 'signatures', vc, '28969C09.SF'), os.path.join('metadata', appid, 'signatures', vc, 'MANIFEST.MF'), - None + None, ), - fdroidserver.common.metadata_find_developer_signing_files(appid, vc) + fdroidserver.common.metadata_find_developer_signing_files(appid, vc), ) vc = '134' @@ -1791,9 +1935,9 @@ class CommonTest(unittest.TestCase): os.path.join('metadata', appid, 'signatures', vc, '28969C09.RSA'), os.path.join('metadata', appid, 'signatures', vc, '28969C09.SF'), os.path.join('metadata', appid, 'signatures', vc, 'MANIFEST.MF'), - None + None, ), - fdroidserver.common.metadata_find_developer_signing_files(appid, vc) + fdroidserver.common.metadata_find_developer_signing_files(appid, vc), ) def test_auto_install_ndk(self): @@ -1883,8 +2027,13 @@ if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) parser = optparse.OptionParser() - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="Spew out even more information than normal") + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() diff --git a/tests/deploy.TestCase b/tests/deploy.TestCase index 2ce5e500..54137949 100755 --- a/tests/deploy.TestCase +++ b/tests/deploy.TestCase @@ -10,7 +10,8 @@ import unittest from unittest import mock localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) if localmodule not in sys.path: sys.path.insert(0, localmodule) @@ -47,34 +48,52 @@ class DeployTest(unittest.TestCase): def update_server_webroot_call(cmd): nonlocal call_iteration if call_iteration == 0: - self.assertListEqual(cmd, ['rsync', - '--archive', - '--delete-after', - '--safe-links', - '--quiet', - '--exclude', 'repo/index.xml', - '--exclude', 'repo/index.jar', - '--exclude', 'repo/index-v1.jar', - 'repo', - 'example.com:/var/www/fdroid']) + self.assertListEqual( + cmd, + [ + 'rsync', + '--archive', + '--delete-after', + '--safe-links', + '--quiet', + '--exclude', + 'repo/index.xml', + '--exclude', + 'repo/index.jar', + '--exclude', + 'repo/index-v1.jar', + 'repo', + 'example.com:/var/www/fdroid', + ], + ) elif call_iteration == 1: - self.assertListEqual(cmd, ['rsync', - '--archive', - '--delete-after', - '--safe-links', - '--quiet', - 'repo', - serverwebroot]) + self.assertListEqual( + cmd, + [ + 'rsync', + '--archive', + '--delete-after', + '--safe-links', + '--quiet', + 'repo', + serverwebroot, + ], + ) elif call_iteration == 2: - self.assertListEqual(cmd, ['rsync', - '--archive', - '--delete-after', - '--safe-links', - '--quiet', - 'Sym.apk', - 'Sym.apk.asc', - 'Sym.apk.sig', - 'example.com:/var/www/fdroid']) + self.assertListEqual( + cmd, + [ + 'rsync', + '--archive', + '--delete-after', + '--safe-links', + '--quiet', + 'Sym.apk', + 'Sym.apk.asc', + 'Sym.apk.sig', + 'example.com:/var/www/fdroid', + ], + ) else: self.fail('unexpected subprocess.call invocation') call_iteration += 1 @@ -86,8 +105,7 @@ class DeployTest(unittest.TestCase): os.symlink('repo/com.example.sym.apk.asc', 'Sym.apk.asc') os.symlink('repo/com.example.sym.apk.sig', 'Sym.apk.sig') with mock.patch('subprocess.call', side_effect=update_server_webroot_call): - fdroidserver.deploy.update_serverwebroot(serverwebroot, - repo_section) + fdroidserver.deploy.update_serverwebroot(serverwebroot, repo_section) self.assertEqual(call_iteration, 3, 'expected 3 invocations of subprocess.call') def test_update_serverwebroot_with_id_file(self): @@ -108,41 +126,55 @@ class DeployTest(unittest.TestCase): def update_server_webroot_call(cmd): nonlocal call_iteration if call_iteration == 0: - self.assertListEqual(cmd, ['rsync', - '--archive', - '--delete-after', - '--safe-links', - '--verbose', - '-e', - 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' - + fdroidserver.deploy.config['identity_file'], - '--exclude', 'archive/index.xml', - '--exclude', 'archive/index.jar', - '--exclude', 'archive/index-v1.jar', - 'archive', - serverwebroot]) + self.assertListEqual( + cmd, + [ + 'rsync', + '--archive', + '--delete-after', + '--safe-links', + '--verbose', + '-e', + 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + + fdroidserver.deploy.config['identity_file'], + '--exclude', + 'archive/index.xml', + '--exclude', + 'archive/index.jar', + '--exclude', + 'archive/index-v1.jar', + 'archive', + serverwebroot, + ], + ) elif call_iteration == 1: - self.assertListEqual(cmd, ['rsync', - '--archive', - '--delete-after', - '--safe-links', - '--verbose', - '-e', - 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' - + fdroidserver.deploy.config['identity_file'], - 'archive', - serverwebroot]) + self.assertListEqual( + cmd, + [ + 'rsync', + '--archive', + '--delete-after', + '--safe-links', + '--verbose', + '-e', + 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + + fdroidserver.deploy.config['identity_file'], + 'archive', + serverwebroot, + ], + ) else: self.fail('unexpected subprocess.call invocation') call_iteration += 1 return 0 with mock.patch('subprocess.call', side_effect=update_server_webroot_call): - fdroidserver.deploy.update_serverwebroot(serverwebroot, - repo_section) + fdroidserver.deploy.update_serverwebroot(serverwebroot, repo_section) self.assertEqual(call_iteration, 2, 'expected 2 invocations of subprocess.call') - @unittest.skipIf(not os.getenv('VIRUSTOTAL_API_KEY'), 'VIRUSTOTAL_API_KEY is not set') + @unittest.skipIf( + not os.getenv('VIRUSTOTAL_API_KEY'), 'VIRUSTOTAL_API_KEY is not set' + ) def test_upload_to_virustotal(self): fdroidserver.deploy.options.verbose = True virustotal_apikey = os.getenv('VIRUSTOTAL_API_KEY') @@ -150,15 +182,14 @@ class DeployTest(unittest.TestCase): def test_remote_hostname_regex(self): for remote_url, name in ( - ('git@github.com:guardianproject/fdroid-repo', 'github'), - ('git@gitlab.com:guardianproject/fdroid-repo', 'gitlab'), - ('https://github.com:guardianproject/fdroid-repo', 'github'), - ('https://gitlab.com/guardianproject/fdroid-repo', 'gitlab'), - ('https://salsa.debian.org/foo/repo', 'salsa'), + ('git@github.com:guardianproject/fdroid-repo', 'github'), + ('git@gitlab.com:guardianproject/fdroid-repo', 'gitlab'), + ('https://github.com:guardianproject/fdroid-repo', 'github'), + ('https://gitlab.com/guardianproject/fdroid-repo', 'gitlab'), + ('https://salsa.debian.org/foo/repo', 'salsa'), ): self.assertEqual( - name, - fdroidserver.deploy.REMOTE_HOSTNAME_REGEX.sub(r'\1', remote_url) + name, fdroidserver.deploy.REMOTE_HOSTNAME_REGEX.sub(r'\1', remote_url) ) @@ -166,8 +197,13 @@ if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) parser = optparse.OptionParser() - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="Spew out even more information than normal") + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() diff --git a/tests/exception.TestCase b/tests/exception.TestCase index 2551b558..a1d8a992 100755 --- a/tests/exception.TestCase +++ b/tests/exception.TestCase @@ -9,7 +9,8 @@ import sys import unittest localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) @@ -57,8 +58,13 @@ if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) parser = optparse.OptionParser() - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="Spew out even more information than normal") + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) (fdroidserver.exception.options, args) = parser.parse_args(['--verbose']) fdroidserver.common.options = fdroidserver.exception.options diff --git a/tests/import.TestCase b/tests/import.TestCase index 70fe83df..361e27e3 100755 --- a/tests/import.TestCase +++ b/tests/import.TestCase @@ -14,13 +14,15 @@ import unittest from unittest import mock localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) import fdroidserver.common import fdroidserver.metadata + # work around the syntax error from: import fdroidserver.import import import_proxy @@ -55,19 +57,37 @@ class ImportTest(unittest.TestCase): self.assertEqual(app.Repo, 'https://gitlab.com/fdroid/ci-test-app.git') def test_get_app_from_url(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) os.mkdir(os.path.join(testdir, 'tmp')) tmp_importer = os.path.join(testdir, 'tmp', 'importer') data = ( - ('cn.wildfirechat.chat', 'https://github.com/wildfirechat/android-chat', '0.6.9', '23'), - ('com.anpmech.launcher', 'https://github.com/KeikaiLauncher/KeikaiLauncher', 'Unknown', None), - ('ut.ewh.audiometrytest', 'https://github.com/ReeceStevens/ut_ewh_audiometer_2014', '1.65', '14'), + ( + 'cn.wildfirechat.chat', + 'https://github.com/wildfirechat/android-chat', + '0.6.9', + '23', + ), + ( + 'com.anpmech.launcher', + 'https://github.com/KeikaiLauncher/KeikaiLauncher', + 'Unknown', + None, + ), + ( + 'ut.ewh.audiometrytest', + 'https://github.com/ReeceStevens/ut_ewh_audiometer_2014', + '1.65', + '14', + ), ) for appid, url, vn, vc in data: shutil.rmtree(tmp_importer, ignore_errors=True) - shutil.copytree(os.path.join(self.basedir, 'source-files', appid), - tmp_importer) + shutil.copytree( + os.path.join(self.basedir, 'source-files', appid), tmp_importer + ) app = fdroidserver.common.get_app_from_url(url) with mock.patch('fdroidserver.common.getvcs', @@ -92,8 +112,13 @@ if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) parser = optparse.OptionParser() - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="Spew out even more information than normal") + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() diff --git a/tests/index.TestCase b/tests/index.TestCase index 00e8e1a1..e012f15e 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -15,7 +15,8 @@ import json import shutil localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) @@ -37,7 +38,6 @@ class Options: class IndexTest(unittest.TestCase): - def setUp(self): logging.basicConfig(level=logging.DEBUG) self.basedir = os.path.join(localmodule, 'tests') @@ -55,8 +55,9 @@ class IndexTest(unittest.TestCase): fdroidserver.signindex.config = config if not os.path.exists('repo/index-v1.jar'): - fdroidserver.signindex.sign_index_v1(os.path.join(self.basedir, 'repo'), - 'index-v1.json') + fdroidserver.signindex.sign_index_v1( + os.path.join(self.basedir, 'repo'), 'index-v1.json' + ) def test_get_public_key_from_jar_succeeds(self): source_dir = os.path.join(self.basedir, 'signindex') @@ -66,9 +67,11 @@ class IndexTest(unittest.TestCase): _, fingerprint = fdroidserver.index.get_public_key_from_jar(jar) # comparing fingerprints should be sufficient if f == 'testy.jar': - self.assertEqual(fingerprint, - '818E469465F96B704E27BE2FEE4C63AB' - + '9F83DDF30E7A34C7371A4728D83B0BC1') + self.assertEqual( + fingerprint, + '818E469465F96B704E27BE2FEE4C63AB' + + '9F83DDF30E7A34C7371A4728D83B0BC1', + ) if f == 'guardianproject.jar': self.assertTrue(fingerprint == GP_FINGERPRINT) @@ -85,12 +88,15 @@ class IndexTest(unittest.TestCase): def test_download_repo_index_no_jar(self): with self.assertRaises(requests.exceptions.RequestException): - fdroidserver.index.download_repo_index("http://example.org?fingerprint=nope") + fdroidserver.index.download_repo_index( + "http://example.org?fingerprint=nope" + ) def test_get_repo_key_fingerprint(self): pubkey, fingerprint = fdroidserver.index.extract_pubkey() - data, public_key, public_key_fingerprint = \ - fdroidserver.index.get_index_from_jar('repo/index-v1.jar', fingerprint) + data, public_key, public_key_fingerprint = fdroidserver.index.get_index_from_jar( + 'repo/index-v1.jar', fingerprint + ) self.assertIsNotNone(data) self.assertIsNotNone(public_key) self.assertIsNotNone(public_key_fingerprint) @@ -103,8 +109,9 @@ class IndexTest(unittest.TestCase): def test_get_index_from_jar_with_chars_to_be_stripped(self): fingerprint = 'NOOOO F4 9A F3 F1 1E FD DF 20 DF FD 70 F5 E3 11 7B 99 76 67 41 67 AD CA 28 0E 6B 19 32 A0 60 1B 26 F6' - data, public_key, public_key_fingerprint = \ - fdroidserver.index.get_index_from_jar('repo/index-v1.jar', fingerprint) + data, public_key, public_key_fingerprint = fdroidserver.index.get_index_from_jar( + 'repo/index-v1.jar', fingerprint + ) @patch('requests.head') def test_download_repo_index_same_etag(self, head): @@ -243,13 +250,15 @@ class IndexTest(unittest.TestCase): pass fdroidserver.index.v1_sort_packages( - i, fdroidserver.common.load_stats_fdroid_signing_key_fingerprints()) + i, fdroidserver.common.load_stats_fdroid_signing_key_fingerprints() + ) self.maxDiff = None self.assertEqual(json.dumps(i, indent=2), json.dumps(o, indent=2)) def test_make_v0_repo_only(self): - tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, - dir=self.tmpdir) + tmptestsdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(tmptestsdir) os.mkdir('repo') repo_icons_dir = os.path.join('repo', 'icons') @@ -266,19 +275,24 @@ class IndexTest(unittest.TestCase): fdroidserver.common.config['repo_pubkey'] = 'ffffffffffffffffffffffffffffffffff' fdroidserver.index.make_v0({}, [], 'repo', repodict, requestsdict, {}) self.assertTrue(os.path.isdir(repo_icons_dir)) - self.assertTrue(os.path.exists(os.path.join(repo_icons_dir, - fdroidserver.common.default_config['repo_icon']))) + self.assertTrue( + os.path.exists( + os.path.join( + repo_icons_dir, fdroidserver.common.default_config['repo_icon'] + ) + ) + ) self.assertTrue(os.path.exists(os.path.join('repo', 'index.xml'))) def test_make_v0(self): - tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, - dir=self.tmpdir) + tmptestsdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(tmptestsdir) os.mkdir('metadata') os.mkdir('repo') metadatafile = 'metadata/info.zwanenburg.caffeinetile.yml' - shutil.copy(os.path.join(self.basedir, metadatafile), - metadatafile) + shutil.copy(os.path.join(self.basedir, metadatafile), metadatafile) repo_icons_dir = os.path.join('repo', 'icons') self.assertFalse(os.path.isdir(repo_icons_dir)) repodict = { @@ -296,21 +310,14 @@ class IndexTest(unittest.TestCase): apk = { 'hash': 'dbbdd7deadb038862f426b71efe4a64df8c3edf25d669e935f349510e16f65db', 'hashType': 'sha256', - 'uses-permission': [ - [ - 'android.permission.WAKE_LOCK', - None - ] - ], + 'uses-permission': [['android.permission.WAKE_LOCK', None]], 'uses-permission-sdk-23': [], 'features': [], 'icons_src': { '160': 'res/drawable/ic_coffee_on.xml', - '-1': 'res/drawable/ic_coffee_on.xml' - }, - 'icons': { - '160': 'info.zwanenburg.caffeinetile.4.xml' + '-1': 'res/drawable/ic_coffee_on.xml', }, + 'icons': {'160': 'info.zwanenburg.caffeinetile.4.xml'}, 'antiFeatures': [], 'packageName': 'info.zwanenburg.caffeinetile', 'versionCode': 4, @@ -330,33 +337,45 @@ class IndexTest(unittest.TestCase): fdroidserver.common.config['make_current_version_link'] = True fdroidserver.index.make_v0(apps, [apk], 'repo', repodict, requestsdict, {}) self.assertTrue(os.path.isdir(repo_icons_dir)) - self.assertTrue(os.path.exists(os.path.join(repo_icons_dir, - fdroidserver.common.default_config['repo_icon']))) + self.assertTrue( + os.path.exists( + os.path.join( + repo_icons_dir, fdroidserver.common.default_config['repo_icon'] + ) + ) + ) self.assertTrue(os.path.exists(os.path.join('repo', 'index.xml'))) def test_get_mirror_service_urls(self): for url in [ - 'git@github.com:foo/bar', - 'git@github.com:foo/bar.git', - 'https://github.com/foo/bar', - 'https://github.com/foo/bar.git', + 'git@github.com:foo/bar', + 'git@github.com:foo/bar.git', + 'https://github.com/foo/bar', + 'https://github.com/foo/bar.git', ]: - self.assertEqual(['https://raw.githubusercontent.com/foo/bar/master/fdroid'], - fdroidserver.index.get_mirror_service_urls(url)) + self.assertEqual( + ['https://raw.githubusercontent.com/foo/bar/master/fdroid'], + fdroidserver.index.get_mirror_service_urls(url), + ) for url in [ - 'git@gitlab.com:group/project', - 'git@gitlab.com:group/project.git', - 'https://gitlab.com/group/project', - 'https://gitlab.com/group/project.git', + 'git@gitlab.com:group/project', + 'git@gitlab.com:group/project.git', + 'https://gitlab.com/group/project', + 'https://gitlab.com/group/project.git', ]: - self.assertEqual(['https://group.gitlab.io/project/fdroid', - 'https://gitlab.com/group/project/-/raw/master/fdroid'], - fdroidserver.index.get_mirror_service_urls(url)) + self.assertEqual( + [ + 'https://group.gitlab.io/project/fdroid', + 'https://gitlab.com/group/project/-/raw/master/fdroid', + ], + fdroidserver.index.get_mirror_service_urls(url), + ) def test_make_website(self): - tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, - dir=self.tmpdir) + tmptestsdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(tmptestsdir) os.mkdir('metadata') os.mkdir('repo') @@ -396,21 +415,31 @@ class IndexTest(unittest.TestCase): self.assertEquals(css, pretty_css) def test_v1_sort_packages_with_invalid(self): - i = [{'packageName': 'org.smssecure.smssecure', - 'apkName': 'smssecure-custom.fake', - 'signer': None, - 'versionCode': 11111}] + i = [ + { + 'packageName': 'org.smssecure.smssecure', + 'apkName': 'smssecure-custom.fake', + 'signer': None, + 'versionCode': 11111, + } + ] fdroidserver.index.v1_sort_packages( - i, fdroidserver.common.load_stats_fdroid_signing_key_fingerprints()) + i, fdroidserver.common.load_stats_fdroid_signing_key_fingerprints() + ) if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) parser = optparse.OptionParser() - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="Spew out even more information than normal") + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) (options, args) = parser.parse_args() Options.verbose = options.verbose diff --git a/tests/init.TestCase b/tests/init.TestCase index 1062214f..da59e1a0 100755 --- a/tests/init.TestCase +++ b/tests/init.TestCase @@ -13,7 +13,8 @@ import unittest localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) @@ -35,7 +36,9 @@ class InitTest(unittest.TestCase): fdroidserver.init.config = None def test_disable_in_config(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) with open('config.yml', 'w') as fp: fp.write('keystore: NONE\n') @@ -53,7 +56,9 @@ class InitTest(unittest.TestCase): def test_main_in_empty_dir(self): """Test that `fdroid init` will find apksigner and add it to the config""" - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) shutil.copy(os.path.join(self.basedir, 'keystore.jks'), testdir) @@ -74,8 +79,13 @@ if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) parser = optparse.OptionParser() - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="Spew out even more information than normal") + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) (fdroidserver.init.options, args) = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() diff --git a/tests/install.TestCase b/tests/install.TestCase index e7bdb6e2..c2fad222 100755 --- a/tests/install.TestCase +++ b/tests/install.TestCase @@ -9,7 +9,8 @@ import sys import unittest localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) @@ -38,8 +39,13 @@ if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) parser = optparse.OptionParser() - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="Spew out even more information than normal") + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) (fdroidserver.install.options, args) = parser.parse_args(['--verbose']) fdroidserver.common.options = fdroidserver.install.options diff --git a/tests/lint.TestCase b/tests/lint.TestCase index 09aca89f..49ba9b6f 100755 --- a/tests/lint.TestCase +++ b/tests/lint.TestCase @@ -12,7 +12,8 @@ import tempfile import unittest localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) @@ -322,8 +323,13 @@ if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) parser = optparse.OptionParser() - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="Spew out even more information than normal") + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) (fdroidserver.lint.options, args) = parser.parse_args(['--verbose']) fdroidserver.common.options = fdroidserver.lint.options diff --git a/tests/main.TestCase b/tests/main.TestCase index 11e4410b..03a1f66d 100755 --- a/tests/main.TestCase +++ b/tests/main.TestCase @@ -12,7 +12,8 @@ from unittest import mock from testcommon import TmpCwd, TmpPyPath localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) @@ -26,27 +27,31 @@ class MainTest(unittest.TestCase): def test_COMMANDS_check(self): """make sure the built in sub-command defs didn't change unintentionally""" - self.assertListEqual([x for x in fdroidserver.__main__.COMMANDS.keys()], - ['build', - 'init', - 'publish', - 'gpgsign', - 'update', - 'deploy', - 'verify', - 'checkupdates', - 'import', - 'install', - 'readmeta', - 'rewritemeta', - 'lint', - 'scanner', - 'stats', - 'signindex', - 'btlog', - 'signatures', - 'nightly', - 'mirror']) + self.assertListEqual( + [x for x in fdroidserver.__main__.COMMANDS.keys()], + [ + 'build', + 'init', + 'publish', + 'gpgsign', + 'update', + 'deploy', + 'verify', + 'checkupdates', + 'import', + 'install', + 'readmeta', + 'rewritemeta', + 'lint', + 'scanner', + 'stats', + 'signindex', + 'btlog', + 'signatures', + 'nightly', + 'mirror', + ], + ) def test_call_init(self): co = mock.Mock() @@ -73,26 +78,34 @@ class MainTest(unittest.TestCase): def test_find_plugins(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('fdroid_testy1.py', 'w') as f: - f.write(textwrap.dedent("""\ + f.write( + textwrap.dedent( + """\ fdroid_summary = "ttt" - main = lambda: 'all good'""")) + main = lambda: 'all good'""" + ) + ) with TmpPyPath(tmpdir): plugins = fdroidserver.__main__.find_plugins() self.assertIn('testy1', plugins.keys()) self.assertEqual(plugins['testy1']['summary'], 'ttt') - self.assertEqual(__import__(plugins['testy1']['name'], - None, - None, - ['testy1']) - .main(), - 'all good') + self.assertEqual( + __import__( + plugins['testy1']['name'], None, None, ['testy1'] + ).main(), + 'all good', + ) def test_main_plugin_lambda(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('fdroid_testy2.py', 'w') as f: - f.write(textwrap.dedent("""\ + f.write( + textwrap.dedent( + """\ fdroid_summary = "ttt" - main = lambda: print('all good')""")) + main = lambda: print('all good')""" + ) + ) with TmpPyPath(tmpdir): with mock.patch('sys.argv', ['', 'testy2']): with mock.patch('sys.exit') as exit_mock: @@ -102,10 +115,14 @@ class MainTest(unittest.TestCase): def test_main_plugin_def(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('fdroid_testy3.py', 'w') as f: - f.write(textwrap.dedent("""\ + f.write( + textwrap.dedent( + """\ fdroid_summary = "ttt" def main(): - print('all good')""")) + print('all good')""" + ) + ) with TmpPyPath(tmpdir): with mock.patch('sys.argv', ['', 'testy3']): with mock.patch('sys.exit') as exit_mock: @@ -116,10 +133,14 @@ class MainTest(unittest.TestCase): """making sure broken plugins get their exceptions through""" with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('fdroid_testy4.py', 'w') as f: - f.write(textwrap.dedent("""\ + f.write( + textwrap.dedent( + """\ fdroid_summary = "ttt" def main(): - raise Exception("this plugin is broken")""")) + raise Exception("this plugin is broken")""" + ) + ) with TmpPyPath(tmpdir): with mock.patch('sys.argv', ['', 'testy4']): with self.assertRaisesRegex(Exception, "this plugin is broken"): @@ -131,11 +152,15 @@ class MainTest(unittest.TestCase): """ with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('fdroid_testy5.py', 'w') as f: - f.write(textwrap.dedent("""\ + f.write( + textwrap.dedent( + """\ fdroid_summary = "ttt" raise Exception("this plugin is malicious") def main(): - print("evil things")""")) + print("evil things")""" + ) + ) with TmpPyPath(tmpdir): with mock.patch('sys.argv', ['', 'lint']): with mock.patch('sys.exit') as exit_mock: @@ -149,10 +174,14 @@ class MainTest(unittest.TestCase): """ with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('fdroid_signatures.py', 'w') as f: - f.write(textwrap.dedent("""\ + f.write( + textwrap.dedent( + """\ fdroid_summary = "ttt" def main(): - raise("plugin overrides don't get prevent!")""")) + raise("plugin overrides don't get prevent!")""" + ) + ) with TmpPyPath(tmpdir): with mock.patch('sys.argv', ['', 'signatures']): with mock.patch('sys.exit') as exit_mock: @@ -162,49 +191,69 @@ class MainTest(unittest.TestCase): self.assertEqual(exit_mock.call_count, 2) def test_preparse_plugin_lookup_bad_name(self): - self.assertRaises(ValueError, - fdroidserver.__main__.preparse_plugin, - "some.package", "/non/existent/module/path") + self.assertRaises( + ValueError, + fdroidserver.__main__.preparse_plugin, + "some.package", + "/non/existent/module/path", + ) def test_preparse_plugin_lookup_bad_path(self): - self.assertRaises(ValueError, - fdroidserver.__main__.preparse_plugin, - "fake_module_name", "/non/existent/module/path") + self.assertRaises( + ValueError, + fdroidserver.__main__.preparse_plugin, + "fake_module_name", + "/non/existent/module/path", + ) def test_preparse_plugin_lookup_summary_missing(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('fdroid_testy6.py', 'w') as f: - f.write(textwrap.dedent("""\ - main = lambda: print('all good')""")) + f.write( + textwrap.dedent( + """\ + main = lambda: print('all good')""" + ) + ) with TmpPyPath(tmpdir): p = [x for x in pkgutil.iter_modules() if x[1].startswith('fdroid_')] module_dir = p[0][0].path module_name = p[0][1] - self.assertRaises(NameError, - fdroidserver.__main__.preparse_plugin, - module_name, module_dir) + self.assertRaises( + NameError, + fdroidserver.__main__.preparse_plugin, + module_name, + module_dir, + ) def test_preparse_plugin_lookup_module_file(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('fdroid_testy7.py', 'w') as f: - f.write(textwrap.dedent("""\ + f.write( + textwrap.dedent( + """\ fdroid_summary = "ttt" - main = lambda: pritn('all good')""")) + main = lambda: pritn('all good')""" + ) + ) with TmpPyPath(tmpdir): p = [x for x in pkgutil.iter_modules() if x[1].startswith('fdroid_')] module_path = p[0][0].path module_name = p[0][1] d = fdroidserver.__main__.preparse_plugin(module_name, module_path) - self.assertDictEqual(d, {'name': 'fdroid_testy7', - 'summary': 'ttt'}) + self.assertDictEqual(d, {'name': 'fdroid_testy7', 'summary': 'ttt'}) def test_preparse_plugin_lookup_module_dir(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): os.mkdir(os.path.join(tmpdir, 'fdroid_testy8')) with open('fdroid_testy8/__main__.py', 'w') as f: - f.write(textwrap.dedent("""\ + f.write( + textwrap.dedent( + """\ fdroid_summary = "ttt" - main = lambda: print('all good')""")) + main = lambda: print('all good')""" + ) + ) with open('fdroid_testy8/__init__.py', 'w') as f: pass with TmpPyPath(tmpdir): @@ -212,16 +261,20 @@ class MainTest(unittest.TestCase): module_path = p[0][0].path module_name = p[0][1] d = fdroidserver.__main__.preparse_plugin(module_name, module_path) - self.assertDictEqual(d, {'name': 'fdroid_testy8', - 'summary': 'ttt'}) + self.assertDictEqual(d, {'name': 'fdroid_testy8', 'summary': 'ttt'}) if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) parser = optparse.OptionParser() - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="Spew out even more information than normal") + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) (common.options, args) = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 45353c08..b269e98d 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -24,7 +24,8 @@ except ImportError: from yaml import SafeLoader localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) @@ -134,8 +135,12 @@ class MetadataTest(unittest.TestCase): fdroidserver.metadata.warnings_action = None apps = fdroidserver.metadata.read_metadata() - for appid in ('org.smssecure.smssecure', 'org.adaway', - 'org.videolan.vlc', 'com.politedroid'): + for appid in ( + 'org.smssecure.smssecure', + 'org.adaway', + 'org.videolan.vlc', + 'com.politedroid', + ): savepath = os.path.join('metadata', 'dump', appid + '.yaml') frommeta = dict(apps[appid]) self.assertTrue(appid in apps) @@ -149,7 +154,9 @@ class MetadataTest(unittest.TestCase): # yaml.dump(frommeta, f, default_flow_style=False) def test_rewrite_yaml_fakeotaupdate(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) fdroidserver.common.config = {'accepted_formats': ['yml']} fdroidserver.metadata.warnings_action = None @@ -157,7 +164,9 @@ class MetadataTest(unittest.TestCase): allapps = fdroidserver.metadata.read_metadata() for appid, app in allapps.items(): if appid == 'fake.ota.update': - fdroidserver.metadata.write_metadata(os.path.join(testdir, appid + '.yml'), app) + fdroidserver.metadata.write_metadata( + os.path.join(testdir, appid + '.yml'), app + ) # assert rewrite result with open(os.path.join(testdir, 'fake.ota.update.yml'), 'r') as result: @@ -166,14 +175,18 @@ class MetadataTest(unittest.TestCase): self.assertEqual(result.read(), orig.read()) def test_rewrite_yaml_fdroidclient(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) fdroidserver.common.config = {'accepted_formats': ['yml']} # rewrite metadata allapps = fdroidserver.metadata.read_metadata() for appid, app in allapps.items(): if appid == 'org.fdroid.fdroid': - fdroidserver.metadata.write_metadata(os.path.join(testdir, appid + '.yml'), app) + fdroidserver.metadata.write_metadata( + os.path.join(testdir, appid + '.yml'), app + ) # assert rewrite result with open(os.path.join(testdir, 'org.fdroid.fdroid.yml'), 'r') as result: @@ -182,13 +195,17 @@ class MetadataTest(unittest.TestCase): self.assertEqual(result.read(), orig.read()) def test_rewrite_yaml_special_build_params(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) # rewrite metadata allapps = fdroidserver.metadata.read_metadata() for appid, app in allapps.items(): if appid == 'app.with.special.build.params': - fdroidserver.metadata.write_metadata(os.path.join(testdir, appid + '.yml'), app) + fdroidserver.metadata.write_metadata( + os.path.join(testdir, appid + '.yml'), app + ) # assert rewrite result with open(os.path.join(testdir, 'app.with.special.build.params.yml'), 'r') as result: @@ -241,7 +258,9 @@ class MetadataTest(unittest.TestCase): self.assertEqual('1234567890', yamldata['Builds'][0]['commit']) def test_read_metadata_sort_by_time(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) metadatadir = os.path.join(testdir, 'metadata') os.makedirs(metadatadir) @@ -265,36 +284,50 @@ class MetadataTest(unittest.TestCase): self.assertEqual(randomlist, allappids) def test_parse_yaml_metadata_unknown_app_field(self): - mf = io.StringIO(textwrap.dedent("""\ + mf = io.StringIO( + textwrap.dedent( + """\ AutoName: F-Droid RepoType: git Builds: [] - bad: value""")) + bad: value""" + ) + ) mf.name = 'mock_filename.yaml' with mock.patch('fdroidserver.metadata.warnings_action', 'error'): with self.assertRaises(MetaDataException): fdroidserver.metadata.parse_yaml_metadata(mf, {}) def test_parse_yaml_metadata_unknown_build_flag(self): - mf = io.StringIO(textwrap.dedent("""\ + mf = io.StringIO( + textwrap.dedent( + """\ AutoName: F-Droid RepoType: git Builds: - - bad: value""")) + - bad: value""" + ) + ) mf.name = 'mock_filename.yaml' with mock.patch('fdroidserver.metadata.warnings_action', 'error'): with self.assertRaises(MetaDataException): fdroidserver.metadata.parse_yaml_metadata(mf, {}) def test_parse_yaml_srclib_corrupt_file(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) srclibfile = os.path.join(testdir, 'srclib', 'mock.yml') os.mkdir(os.path.dirname(srclibfile)) with open(srclibfile, 'w') as fp: - fp.write(textwrap.dedent(""" + fp.write( + textwrap.dedent( + """ - RepoType: git - Repo: https://github.com/realm/realm-js.git - """)) + """ + ) + ) with mock.patch('fdroidserver.metadata.warnings_action', 'error'): with self.assertRaises(MetaDataException): fdroidserver.metadata.parse_yaml_srclib(srclibfile) @@ -321,7 +354,10 @@ class MetadataTest(unittest.TestCase): fdroidserver.metadata.write_yaml(mf, app) mf.seek(0) - self.assertEqual(mf.read(), textwrap.dedent("""\ + self.assertEqual( + mf.read(), + textwrap.dedent( + """\ Categories: - None License: Unknown @@ -341,10 +377,14 @@ class MetadataTest(unittest.TestCase): AutoUpdateMode: None UpdateCheckMode: Tags - """)) + """ + ), + ) def test_parse_yaml_metadata_prebuild_list(self): - mf = io.StringIO(textwrap.dedent("""\ + mf = io.StringIO( + textwrap.dedent( + """\ AutoName: F-Droid RepoType: git Builds: @@ -364,7 +404,9 @@ class MetadataTest(unittest.TestCase): - ./gradlew someSpecialTask - sed -i 'd/that wrong config/' gradle.properties - ./gradlew compile - """)) + """ + ) + ) mf.name = 'mock_filename.yaml' mf.seek(0) result = {} @@ -386,7 +428,9 @@ class MetadataTest(unittest.TestCase): "./gradlew compile"}]}) def test_parse_yaml_metadata_prebuild_strings(self): - mf = io.StringIO(textwrap.dedent("""\ + mf = io.StringIO( + textwrap.dedent( + """\ AutoName: F-Droid RepoType: git Builds: @@ -398,7 +442,9 @@ class MetadataTest(unittest.TestCase): prebuild: npm something && echo 'important setting' >> /a/file build: |- ./gradlew someSpecialTask && sed -i 'd/that wrong config/' gradle.properties && ./gradlew compile - """)) + """ + ) + ) mf.name = 'mock_filename.yaml' mf.seek(0) result = {} @@ -420,7 +466,9 @@ class MetadataTest(unittest.TestCase): "./gradlew compile"}]}) def test_parse_yaml_metadata_prebuild_string(self): - mf = io.StringIO(textwrap.dedent("""\ + mf = io.StringIO( + textwrap.dedent( + """\ AutoName: F-Droid RepoType: git Builds: @@ -428,7 +476,9 @@ class MetadataTest(unittest.TestCase): versionName: v0.1.0 prebuild: |- a && b && sed -i 's,a,b,' - """)) + """ + ) + ) mf.name = 'mock_filename.yaml' mf.seek(0) result = {} @@ -442,7 +492,9 @@ class MetadataTest(unittest.TestCase): "sed -i 's,a,b,'"}]}) def test_parse_yaml_provides_should_be_ignored(self): - mf = io.StringIO(textwrap.dedent("""\ + mf = io.StringIO( + textwrap.dedent( + """\ Provides: this.is.deprecated AutoName: F-Droid RepoType: git @@ -451,7 +503,9 @@ class MetadataTest(unittest.TestCase): versionName: v0.1.0 prebuild: |- a && b && sed -i 's,a,b,' - """)) + """ + ) + ) mf.name = 'mock_filename.yaml' mf.seek(0) result = {} @@ -475,7 +529,10 @@ class MetadataTest(unittest.TestCase): app['Builds'].append(build) fdroidserver.metadata.write_yaml(mf, app) mf.seek(0) - self.assertEqual(mf.read(), textwrap.dedent("""\ + self.assertEqual( + mf.read(), + textwrap.dedent( + """\ Categories: - None License: Unknown @@ -490,7 +547,9 @@ class MetadataTest(unittest.TestCase): AutoUpdateMode: None UpdateCheckMode: None - """)) + """ + ), + ) def test_write_yaml_1_line_scripts_as_list(self): mf = io.StringIO() @@ -507,7 +566,10 @@ class MetadataTest(unittest.TestCase): app['Builds'].append(build) fdroidserver.metadata.write_yaml(mf, app) mf.seek(0) - self.assertEqual(mf.read(), textwrap.dedent("""\ + self.assertEqual( + mf.read(), + textwrap.dedent( + """\ Categories: - None License: Unknown @@ -522,7 +584,9 @@ class MetadataTest(unittest.TestCase): AutoUpdateMode: None UpdateCheckMode: None - """)) + """ + ), + ) def test_write_yaml_multiline_scripts_from_list(self): mf = io.StringIO() @@ -545,7 +609,10 @@ class MetadataTest(unittest.TestCase): app['Builds'].append(build) fdroidserver.metadata.write_yaml(mf, app) mf.seek(0) - self.assertEqual(mf.read(), textwrap.dedent("""\ + self.assertEqual( + mf.read(), + textwrap.dedent( + """\ Categories: - None License: Unknown @@ -570,7 +637,9 @@ class MetadataTest(unittest.TestCase): AutoUpdateMode: None UpdateCheckMode: None - """)) + """ + ), + ) def test_write_yaml_multiline_scripts_from_string(self): mf = io.StringIO() @@ -587,7 +656,10 @@ class MetadataTest(unittest.TestCase): app['Builds'].append(build) fdroidserver.metadata.write_yaml(mf, app) mf.seek(0) - self.assertEqual(mf.read(), textwrap.dedent("""\ + self.assertEqual( + mf.read(), + textwrap.dedent( + """\ Categories: - None License: Unknown @@ -612,7 +684,9 @@ class MetadataTest(unittest.TestCase): AutoUpdateMode: None UpdateCheckMode: None - """)) + """ + ), + ) def test_write_yaml_make_sure_provides_does_not_get_written(self): mf = io.StringIO() @@ -627,7 +701,10 @@ class MetadataTest(unittest.TestCase): app['Builds'].append(build) fdroidserver.metadata.write_yaml(mf, app) mf.seek(0) - self.assertEqual(mf.read(), textwrap.dedent("""\ + self.assertEqual( + mf.read(), + textwrap.dedent( + """\ Categories: - None License: Unknown @@ -640,7 +717,9 @@ class MetadataTest(unittest.TestCase): AutoUpdateMode: None UpdateCheckMode: None - """)) + """ + ), + ) def test_parse_yaml_srclib_unknown_key(self): fdroidserver.metadata.warnings_action = 'error' @@ -685,7 +764,9 @@ class MetadataTest(unittest.TestCase): fdroidserver.metadata.warnings_action = 'error' with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('simple.yml', 'w', encoding='utf-8') as f: - f.write(textwrap.dedent('''\ + f.write( + textwrap.dedent( + '''\ # this should be simple RepoType: git @@ -695,7 +776,9 @@ class MetadataTest(unittest.TestCase): Subdir: Prepare: - ''')) + ''' + ) + ) srclib = fdroidserver.metadata.parse_yaml_srclib('simple.yml') self.assertDictEqual({'Repo': 'https://git.host/repo.git', 'RepoType': 'git', @@ -707,13 +790,17 @@ class MetadataTest(unittest.TestCase): fdroidserver.metadata.warnings_action = 'error' with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('Changelog-cketti.yml', 'w', encoding='utf-8') as f: - f.write(textwrap.dedent('''\ + f.write( + textwrap.dedent( + '''\ RepoType: git Repo: https://github.com/cketti/ckChangeLog Subdir: library,ckChangeLog/src/main Prepare: "[ -f project.properties ] || echo 'source.dir=java' > ant.properties && echo -e 'android.library=true\\\\ntarget=android-19' > project.properties" - ''')) + ''' + ) + ) srclib = fdroidserver.metadata.parse_yaml_srclib('Changelog-cketti.yml') self.assertDictEqual(srclib, {'Repo': 'https://github.com/cketti/ckChangeLog', @@ -729,7 +816,9 @@ class MetadataTest(unittest.TestCase): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): os.mkdir('srclibs') with open('srclibs/with-list.yml', 'w', encoding='utf-8') as f: - f.write(textwrap.dedent('''\ + f.write( + textwrap.dedent( + '''\ # this should be simple RepoType: git Repo: https://git.host/repo.git @@ -745,7 +834,9 @@ class MetadataTest(unittest.TestCase): Prepare: There is a difference between knowing the path and walking the path. - ''')) + ''' + ) + ) fdroidserver.metadata.read_srclibs() self.maxDiff = None self.assertDictEqual(fdroidserver.metadata.srclibs, @@ -767,7 +858,9 @@ class MetadataTest(unittest.TestCase): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): os.mkdir('srclibs') with open('srclibs/with-list.yml', 'w', encoding='utf-8') as f: - f.write(textwrap.dedent('''\ + f.write( + textwrap.dedent( + '''\ # this should be simple RepoType: git Repo: https://git.host/repo.git @@ -782,7 +875,9 @@ class MetadataTest(unittest.TestCase): - But until we do, these people are still a part of that system and that makes them our enemy. - You have to understand, most of these people are not ready to be unplugged. - And many of them are so inert, so hopelessly dependent on the system that they will fight to protect it. - ''')) + ''' + ) + ) fdroidserver.metadata.read_srclibs() self.maxDiff = None self.assertDictEqual(fdroidserver.metadata.srclibs, @@ -804,19 +899,27 @@ class MetadataTest(unittest.TestCase): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): os.mkdir('srclibs') with open('srclibs/simple.yml', 'w', encoding='utf-8') as f: - f.write(textwrap.dedent('''\ + f.write( + textwrap.dedent( + '''\ RepoType: git Repo: https://git.host/repo.git - ''')) + ''' + ) + ) with open('srclibs/simple-wb.yml', 'w', encoding='utf-8') as f: - f.write(textwrap.dedent('''\ + f.write( + textwrap.dedent( + '''\ # this should be simple RepoType: git Repo: https://git.host/repo.git Subdir: Prepare: - ''')) + ''' + ) + ) fdroidserver.metadata.read_srclibs() self.assertDictEqual(fdroidserver.metadata.srclibs, {'simple-wb': {'RepoType': 'git', @@ -833,8 +936,13 @@ if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) parser = optparse.OptionParser() - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="Spew out even more information than normal") + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() diff --git a/tests/publish.TestCase b/tests/publish.TestCase index eb1948be..ccad450f 100755 --- a/tests/publish.TestCase +++ b/tests/publish.TestCase @@ -23,7 +23,8 @@ import textwrap from unittest import mock localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) @@ -56,8 +57,9 @@ class PublishTest(unittest.TestCase): self.assertEqual('ee8807d2', publish.key_alias("org.schabi.newpipe")) self.assertEqual('b53c7e11', publish.key_alias("de.grobox.liberario")) - publish.config = {'keyaliases': {'yep.app': '@org.org.org', - 'com.example.app': '1a2b3c4d'}} + publish.config = { + 'keyaliases': {'yep.app': '@org.org.org', 'com.example.app': '1a2b3c4d'} + } self.assertEqual('78688a0f', publish.key_alias('yep.app')) self.assertEqual('1a2b3c4d', publish.key_alias('com.example.app')) @@ -69,11 +71,13 @@ class PublishTest(unittest.TestCase): publish.config['keypass'] = '123456' publish.config['keystore'] = 'dummy-keystore.jks' - expected = {'78688a0f': '277655a6235bc6b0ef2d824396c51ba947f5ebc738c293d887e7083ff338af82', - 'd2d51ff2': 'fa3f6a017541ee7fe797be084b1bcfbf92418a7589ef1f7fdeb46741b6d2e9c3', - 'dc3b169e': '6ae5355157a47ddcc3834a71f57f6fb5a8c2621c8e0dc739e9ddf59f865e497c', - 'a163ec9b': 'd34f678afbaa8f2fa6cc0edd6f0c2d1d2e2e9eb08bea521b24c740806016bff4', - 'repokey': 'c58460800c7b250a619c30c13b07b7359a43e5af71a4352d86c58ae18c9f6d41'} + expected = { + '78688a0f': '277655a6235bc6b0ef2d824396c51ba947f5ebc738c293d887e7083ff338af82', + 'd2d51ff2': 'fa3f6a017541ee7fe797be084b1bcfbf92418a7589ef1f7fdeb46741b6d2e9c3', + 'dc3b169e': '6ae5355157a47ddcc3834a71f57f6fb5a8c2621c8e0dc739e9ddf59f865e497c', + 'a163ec9b': 'd34f678afbaa8f2fa6cc0edd6f0c2d1d2e2e9eb08bea521b24c740806016bff4', + 'repokey': 'c58460800c7b250a619c30c13b07b7359a43e5af71a4352d86c58ae18c9f6d41', + } result = publish.read_fingerprints_from_keystore() self.maxDiff = None self.assertEqual(expected, result) @@ -84,17 +88,20 @@ class PublishTest(unittest.TestCase): publish.config = common.config publish.config['keystorepass'] = '123456' publish.config['keypass'] = '123456' - publish.config['keystore'] = os.path.join(os.getcwd(), - 'dummy-keystore.jks') + publish.config['keystore'] = os.path.join(os.getcwd(), 'dummy-keystore.jks') publish.config['repo_keyalias'] = 'repokey' - appids = ['com.example.app', - 'net.unavailable', - 'org.test.testy', - 'com.example.anotherapp', - 'org.org.org'] + appids = [ + 'com.example.app', + 'net.unavailable', + 'org.test.testy', + 'com.example.anotherapp', + 'org.org.org', + ] - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) with open('config.py', 'w') as f: pass @@ -114,15 +121,20 @@ class PublishTest(unittest.TestCase): }, "org.test.testy": { "signer": "6ae5355157a47ddcc3834a71f57f6fb5a8c2621c8e0dc739e9ddf59f865e497c" - } + }, } self.assertEqual(expected, common.load_stats_fdroid_signing_key_fingerprints()) with open('config.py', 'r') as f: - self.assertEqual(textwrap.dedent('''\ + self.assertEqual( + textwrap.dedent( + '''\ repo_key_sha256 = "c58460800c7b250a619c30c13b07b7359a43e5af71a4352d86c58ae18c9f6d41" - '''), f.read()) + ''' + ), + f.read(), + ) def test_store_and_load_fdroid_signing_key_fingerprints_with_missmatch(self): common.config = {} @@ -130,12 +142,13 @@ class PublishTest(unittest.TestCase): publish.config = common.config publish.config['keystorepass'] = '123456' publish.config['keypass'] = '123456' - publish.config['keystore'] = os.path.join(os.getcwd(), - 'dummy-keystore.jks') + publish.config['keystore'] = os.path.join(os.getcwd(), 'dummy-keystore.jks') publish.config['repo_keyalias'] = 'repokey' publish.config['repo_key_sha256'] = 'bad bad bad bad bad bad bad bad bad bad bad bad' - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) publish.store_stats_fdroid_signing_key_fingerprints({}, indent=2) with self.assertRaises(FDroidException): @@ -149,7 +162,9 @@ class PublishTest(unittest.TestCase): publish.config['repo_keyalias'] = 'sova' publish.config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' publish.config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) shutil.copy('keystore.jks', testdir) os.mkdir(os.path.join(testdir, 'repo')) @@ -170,6 +185,7 @@ class PublishTest(unittest.TestCase): def test_check_for_key_collisions(self): from fdroidserver.metadata import App + common.config = {} common.fill_config_defaults(common.config) publish.config = common.config @@ -253,11 +269,12 @@ class PublishTest(unittest.TestCase): self.assertEqual(publish.config['keytool'], data['keytool']) def test_sign_then_implant_signature(self): - class Options: verbose = False - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) config = common.read_config(Options) @@ -322,8 +339,13 @@ if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) parser = optparse.OptionParser() - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="Spew out even more information than normal") + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) (common.options, args) = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() diff --git a/tests/rewritemeta.TestCase b/tests/rewritemeta.TestCase index c4b34867..be87c3cb 100755 --- a/tests/rewritemeta.TestCase +++ b/tests/rewritemeta.TestCase @@ -12,7 +12,8 @@ from unittest import mock from testcommon import TmpCwd localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) @@ -47,24 +48,34 @@ class RewriteMetaTest(unittest.TestCase): rewritemeta.main() with open('metadata/a.yml') as f: - self.assertEqual(f.read(), textwrap.dedent('''\ + self.assertEqual( + f.read(), + textwrap.dedent( + '''\ License: Unknown AutoName: a AutoUpdateMode: None UpdateCheckMode: None - ''')) + ''' + ), + ) with open('metadata/b.yml') as f: - self.assertEqual(f.read(), textwrap.dedent('''\ + self.assertEqual( + f.read(), + textwrap.dedent( + '''\ License: Unknown AutoName: b AutoUpdateMode: None UpdateCheckMode: None - ''')) + ''' + ), + ) def test_rewrite_scenario_yml_no_ruamel(self): sys.argv = ['rewritemeta', 'a'] @@ -81,16 +92,26 @@ class RewriteMetaTest(unittest.TestCase): rewritemeta.main() with open('metadata/a.yml') as f: - self.assertEqual(f.read(), textwrap.dedent('''\ - AutoName: a''')) + self.assertEqual( + f.read(), + textwrap.dedent( + '''\ + AutoName: a''' + ), + ) if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) parser = optparse.OptionParser() - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="Spew out even more information than normal") + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) (common.options, args) = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 3c18becc..428cca9c 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -15,7 +15,8 @@ import yaml from unittest import mock localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) @@ -27,7 +28,6 @@ import fdroidserver.scanner class ScannerTest(unittest.TestCase): - def setUp(self): logging.basicConfig(level=logging.INFO) self.basedir = os.path.join(localmodule, 'tests') @@ -53,8 +53,9 @@ class ScannerTest(unittest.TestCase): build = fdroidserver.metadata.Build() fatal_problems = fdroidserver.scanner.scan_source(d, build) should = projects.get(os.path.basename(d), 0) - self.assertEqual(should, fatal_problems, - "%s should have %d errors!" % (d, should)) + self.assertEqual( + should, fatal_problems, "%s should have %d errors!" % (d, should) + ) def test_get_gradle_compile_commands(self): test_files = [ @@ -85,13 +86,17 @@ class ScannerTest(unittest.TestCase): def test_scan_source_files_sneaky_maven(self): """Check for sneaking in banned maven repos""" - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) fdroidserver.scanner.config = None fdroidserver.scanner.options = mock.Mock() fdroidserver.scanner.options.json = True with open('build.gradle', 'w') as fp: - fp.write(textwrap.dedent(""" + fp.write( + textwrap.dedent( + """ maven { "https://jitpack.io" url 'https://maven.fabric.io/public' @@ -100,7 +105,9 @@ class ScannerTest(unittest.TestCase): "https://maven.google.com" setUrl('https://evilcorp.com/maven') } - """)) + """ + ) + ) count = fdroidserver.scanner.scan_source(testdir) self.assertEqual(2, count, 'there should be this many errors') @@ -111,7 +118,9 @@ class ScannerTest(unittest.TestCase): difference between absolute and relative paths. """ - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) build_dir = os.path.join('build', 'fake.app') abs_build_dir = os.path.join(testdir, build_dir) os.makedirs(abs_build_dir, exist_ok=True) @@ -130,21 +139,13 @@ class ScannerTest(unittest.TestCase): 'static.a', 'src/test/resources/classes.dex', ] - remove = [ - 'gradle-wrapper.jar', - 'gradlew', - 'gradlew.bat', - ] + remove = ['gradle-wrapper.jar', 'gradlew', 'gradlew.bat'] os.makedirs('src/test/resources', exist_ok=True) for f in keep + remove: with open(f, 'w') as fp: fp.write('placeholder') self.assertTrue(os.path.exists(f)) - binaries = [ - 'binary.out', - 'fake.png', - 'snippet.png', - ] + binaries = ['binary.out', 'fake.png', 'snippet.png'] with open('binary.out', 'wb') as fp: fp.write(b'\x00\x00') fp.write(uuid.uuid4().bytes) @@ -152,10 +153,12 @@ class ScannerTest(unittest.TestCase): os.chmod('fake.png', 0o755) os.system('ls -l binary.out') with open('snippet.png', 'wb') as fp: - fp.write(b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x000\x00\x00' - b'\x000\x08\x06\x00\x00\x00W\x02\xf9\x87\x00\x00\x00\x04sB' - b'IT\x08\x08\x08\x08|\x08d\x88\x00\x00\x00\tpHYs\x00\x00\n' - b'a\x00\x00\na\x01\xfc\xccJ%\x00\x00\x00\x19tEXtSoftware') + fp.write( + b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x000\x00\x00' + b'\x000\x08\x06\x00\x00\x00W\x02\xf9\x87\x00\x00\x00\x04sB' + b'IT\x08\x08\x08\x08|\x08d\x88\x00\x00\x00\tpHYs\x00\x00\n' + b'a\x00\x00\na\x01\xfc\xccJ%\x00\x00\x00\x19tEXtSoftware' + ) os.chmod('snippet.png', 0o755) os.system('ls -l fake.png') @@ -199,7 +202,9 @@ class ScannerTest(unittest.TestCase): def test_build_local_scanner(self): """`fdroid build` calls scanner functions, test them here""" - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) config = dict() @@ -229,12 +234,15 @@ class ScannerTest(unittest.TestCase): self.assertTrue(os.path.exists(f)) with open('build.xml', 'w') as fp: - fp.write(textwrap.dedent( - """ + fp.write( + textwrap.dedent( + """ - """)) + """ + ) + ) def make_fake_apk(output, build): with open(build.output, 'w') as fp: @@ -272,21 +280,27 @@ class ScannerTest(unittest.TestCase): def test_scan_gradle_file_with_multiple_problems(self): """Check that the scanner can handle scandelete with gradle files with multiple problems""" - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) fdroidserver.scanner.config = None fdroidserver.scanner.options = mock.Mock() build = fdroidserver.metadata.Build() build.scandelete = ['build.gradle'] with open('build.gradle', 'w') as fp: - fp.write(textwrap.dedent(""" + fp.write( + textwrap.dedent( + """ maven { url 'https://maven.fabric.io/public' } maven { url 'https://evilcorp.com/maven' } - """)) + """ + ) + ) count = fdroidserver.scanner.scan_source(testdir, build) self.assertFalse(os.path.exists("build.gradle")) self.assertEqual(0, count, 'there should be this many errors') @@ -296,8 +310,13 @@ if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) parser = optparse.OptionParser() - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="Spew out even more information than normal") + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() diff --git a/tests/signatures.TestCase b/tests/signatures.TestCase index b6af0eb5..4744613b 100755 --- a/tests/signatures.TestCase +++ b/tests/signatures.TestCase @@ -10,7 +10,8 @@ import logging from tempfile import TemporaryDirectory localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) @@ -20,7 +21,6 @@ from fdroidserver import common, signatures class SignaturesTest(unittest.TestCase): - def setUp(self): logging.basicConfig(level=logging.DEBUG) common.config = None @@ -60,8 +60,13 @@ if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) parser = optparse.OptionParser() - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="Spew out even more information than normal") + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) (common.options, args) = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() diff --git a/tests/update.TestCase b/tests/update.TestCase index fbdccc5e..2d4fd6ca 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -43,7 +43,8 @@ except ImportError: from yaml import Loader as FullLoader localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) @@ -55,11 +56,7 @@ import fdroidserver.update from fdroidserver.common import FDroidPopen -DONATION_FIELDS = ( - 'Donate', - 'Liberapay', - 'OpenCollective', -) +DONATION_FIELDS = ('Donate', 'Liberapay', 'OpenCollective') class Options: @@ -77,6 +74,7 @@ class UpdateTest(unittest.TestCase): logging.getLogger('androguard.axml').setLevel(logging.INFO) logging.getLogger('androguard.core.api_specific_resources').setLevel(logging.INFO) from PIL import PngImagePlugin + logging.getLogger(PngImagePlugin.__name__).setLevel(logging.INFO) self.basedir = os.path.join(localmodule, 'tests') self.tmpdir = os.path.abspath(os.path.join(self.basedir, '..', '.testfiles')) @@ -114,12 +112,17 @@ class UpdateTest(unittest.TestCase): shutil.copystat(testfile, cpfile) apps = dict() - for packageName in ('info.guardianproject.urzip', 'org.videolan.vlc', 'obb.mainpatch.current', - 'com.nextcloud.client', 'com.nextcloud.client.dev', - 'eu.siacs.conversations'): + for packageName in ( + 'info.guardianproject.urzip', + 'org.videolan.vlc', + 'obb.mainpatch.current', + 'com.nextcloud.client', + 'com.nextcloud.client.dev', + 'eu.siacs.conversations', + ): apps[packageName] = fdroidserver.metadata.App() apps[packageName]['id'] = packageName - apps[packageName]['CurrentVersionCode'] = 0xcafebeef + apps[packageName]['CurrentVersionCode'] = 0xCAFEBEEF apps['info.guardianproject.urzip']['CurrentVersionCode'] = 100 @@ -286,7 +289,7 @@ class UpdateTest(unittest.TestCase): appid = 'info.guardianproject.checkey' testapps = {appid: copy.copy(apps[appid])} self.assertEqual('Checkey the app!', testapps[appid]['Name']) - del(testapps[appid]['Name']) + del (testapps[appid]['Name']) fdroidserver.update.insert_missing_app_names_from_apks(testapps, apks) self.assertIsNone(testapps[appid].get('Name')) @@ -367,8 +370,9 @@ class UpdateTest(unittest.TestCase): def test_insert_triple_t_2_metadata(self): packageName = 'org.piwigo.android' - tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, - dir=self.tmpdir) + tmptestsdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.rmdir(tmptestsdir) shutil.copytree(os.path.join(self.basedir, 'triple-t-2'), tmptestsdir) os.chdir(tmptestsdir) @@ -414,8 +418,7 @@ class UpdateTest(unittest.TestCase): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config - p = FDroidPopen(['java', '-cp', 'getsig', - 'getsig', apkfile]) + p = FDroidPopen(['java', '-cp', 'getsig', 'getsig', apkfile]) sig = None for line in p.output.splitlines(): if line.startswith('Result:'): @@ -509,7 +512,9 @@ class UpdateTest(unittest.TestCase): def testScanApksAndObbs(self): os.chdir(os.path.join(localmodule, 'tests')) - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') shutil.copytree(os.path.join(self.basedir, 'metadata'), 'metadata') @@ -567,7 +572,9 @@ class UpdateTest(unittest.TestCase): def test_apkcache_json(self): """test the migration from pickle to json""" os.chdir(os.path.join(localmodule, 'tests')) - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') config = dict() @@ -608,7 +615,9 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.config = config fdroidserver.update.config = config - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) os.mkdir('repo') os.mkdir('stats') @@ -625,8 +634,10 @@ class UpdateTest(unittest.TestCase): self.assertEqual(filename, info['apkName']) self.assertEqual(datetime, type(info['added'])) self.assertEqual(os.path.getsize(os.path.join('repo', filename)), info['size']) - self.assertEqual('531190bdbc07e77d5577249949106f32dac7f62d38d66d66c3ae058be53a729d', - info['hash']) + self.assertEqual( + '531190bdbc07e77d5577249949106f32dac7f62d38d66d66c3ae058be53a729d', + info['hash'], + ) def test_read_added_date_from_all_apks(self): config = dict() @@ -770,7 +781,9 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) os.mkdir('repo') apkfile = 'repo/badzip_1.apk' @@ -780,7 +793,6 @@ class UpdateTest(unittest.TestCase): fdroidserver.update.scan_apk(apkfile) def test_process_apk(self): - def _build_yaml_representer(dumper, data): '''Creates a YAML representation of a Build instance''' return dumper.represent_dict(data) @@ -820,8 +832,9 @@ class UpdateTest(unittest.TestCase): if apkName == '../org.dyndns.fules.ck_20.apk': self.assertEqual(apk['icon'], 'org.dyndns.fules.ck.20.png') for density in fdroidserver.update.screen_densities: - icon_path = os.path.join(fdroidserver.update.get_icon_dir('repo', density), - apk['icon']) + icon_path = os.path.join( + fdroidserver.update.get_icon_dir('repo', density), apk['icon'] + ) self.assertTrue(os.path.isfile(icon_path)) self.assertTrue(os.path.getsize(icon_path) > 1) @@ -863,8 +876,9 @@ class UpdateTest(unittest.TestCase): knownapks = fdroidserver.common.KnownApks() - tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, - dir=self.tmpdir) + tmptestsdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) print('tmptestsdir', tmptestsdir) os.chdir(tmptestsdir) os.mkdir('repo') @@ -873,7 +887,7 @@ class UpdateTest(unittest.TestCase): fdroidserver.update.process_apks({}, 'repo', knownapks) fdroidserver.update.process_apks({}, 'archive', knownapks) - disabledsigs = ['org.bitbucket.tickytacky.mirrormirror_2.apk', ] + disabledsigs = ['org.bitbucket.tickytacky.mirrormirror_2.apk'] for apkName in disabledsigs: shutil.copy(os.path.join(self.basedir, apkName), os.path.join(tmptestsdir, 'repo')) @@ -964,7 +978,9 @@ class UpdateTest(unittest.TestCase): def test_translate_per_build_anti_features(self): os.chdir(os.path.join(localmodule, 'tests')) - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') shutil.copytree(os.path.join(self.basedir, 'metadata'), 'metadata') @@ -995,8 +1011,9 @@ class UpdateTest(unittest.TestCase): self.assertTrue(foundtest) def test_create_metadata_from_template(self): - tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, - dir=self.tmpdir) + tmptestsdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) print('tmptestsdir', tmptestsdir) os.chdir(tmptestsdir) os.mkdir('repo') @@ -1097,8 +1114,9 @@ class UpdateTest(unittest.TestCase): assert icons_src == {} def test_strip_and_copy_image(self): - tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, - dir=self.tmpdir) + tmptestsdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) in_file = os.path.join(self.basedir, 'metadata', 'info.guardianproject.urzip', 'en-US', 'images', 'icon.png') out_file = os.path.join(tmptestsdir, 'icon.png') @@ -1115,7 +1133,9 @@ class UpdateTest(unittest.TestCase): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): os.mkdir('metadata') with open('template.yml', 'w') as f: - f.write(textwrap.dedent('''\ + f.write( + textwrap.dedent( + '''\ Disabled: License: AuthorName: @@ -1149,51 +1169,60 @@ class UpdateTest(unittest.TestCase): CurrentVersion: CurrentVersionCode: NoSourceSince: - ''')) + ''' + ) + ) fdroidserver.update.create_metadata_from_template(apk) with open(os.path.join('metadata', 'rocks.janicerand.yml')) as f: metadata_content = yaml.load(f, Loader=SafeLoader) self.maxDiff = None - self.assertDictEqual(metadata_content, - {'ArchivePolicy': '', - 'AuthorEmail': '', - 'AuthorName': '', - 'AuthorWebSite': '', - 'AutoName': 'rocks.janicerand', - 'AutoUpdateMode': '', - 'Binaries': '', - 'Bitcoin': '', - 'Builds': '', - 'Changelog': '', - 'CurrentVersion': '', - 'CurrentVersionCode': '', - 'Disabled': '', - 'Donate': '', - 'FlattrID': '', - 'IssueTracker': '', - 'LiberapayID': '', - 'License': '', - 'Litecoin': '', - 'Name': 'rocks.janicerand', - 'NoSourceSince': '', - 'Repo': '', - 'RepoType': '', - 'RequiresRoot': '', - 'SourceCode': '', - 'Summary': 'rocks.janicerand', - 'Translation': '', - 'UpdateCheckData': '', - 'UpdateCheckIgnore': '', - 'UpdateCheckMode': '', - 'UpdateCheckName': '', - 'VercodeOperation': '', - 'WebSite': ''}) + self.assertDictEqual( + metadata_content, + { + 'ArchivePolicy': '', + 'AuthorEmail': '', + 'AuthorName': '', + 'AuthorWebSite': '', + 'AutoName': 'rocks.janicerand', + 'AutoUpdateMode': '', + 'Binaries': '', + 'Bitcoin': '', + 'Builds': '', + 'Changelog': '', + 'CurrentVersion': '', + 'CurrentVersionCode': '', + 'Disabled': '', + 'Donate': '', + 'FlattrID': '', + 'IssueTracker': '', + 'LiberapayID': '', + 'License': '', + 'Litecoin': '', + 'Name': 'rocks.janicerand', + 'NoSourceSince': '', + 'Repo': '', + 'RepoType': '', + 'RequiresRoot': '', + 'SourceCode': '', + 'Summary': 'rocks.janicerand', + 'Translation': '', + 'UpdateCheckData': '', + 'UpdateCheckIgnore': '', + 'UpdateCheckMode': '', + 'UpdateCheckName': '', + 'VercodeOperation': '', + 'WebSite': '', + }, + ) def test_insert_funding_yml_donation_links(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) os.mkdir('build') - content = textwrap.dedent(""" + content = textwrap.dedent( + """ community_bridge: '' custom: [LINK1, LINK2] github: USERNAME @@ -1203,7 +1232,8 @@ class UpdateTest(unittest.TestCase): open_collective: USERNAME otechie: USERNAME patreon: USERNAME - """) + """ + ) app = fdroidserver.metadata.App() app.id = 'fake.app.id' apps = {app.id: app} @@ -1230,7 +1260,9 @@ class UpdateTest(unittest.TestCase): def test_insert_funding_yml_donation_links_one_at_a_time(self): """Exercise the FUNDING.yml code one entry at a time""" - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) os.mkdir('build') @@ -1242,7 +1274,8 @@ class UpdateTest(unittest.TestCase): for field in DONATION_FIELDS: self.assertIsNone(app.get(field)) - content = textwrap.dedent(""" + content = textwrap.dedent( + """ community_bridge: 'blah-de-blah' github: USERNAME issuehunt: USERNAME @@ -1250,7 +1283,8 @@ class UpdateTest(unittest.TestCase): liberapay: USERNAME open_collective: USERNAME patreon: USERNAME - """) + """ + ) for line in content.split('\n'): if not line: continue @@ -1270,7 +1304,9 @@ class UpdateTest(unittest.TestCase): self.assertEqual(app.get('Donate', '').split('/')[-1], v) def test_insert_funding_yml_donation_links_with_corrupt_file(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) os.mkdir('build') app = fdroidserver.metadata.App() @@ -1278,11 +1314,15 @@ class UpdateTest(unittest.TestCase): apps = {app.id: app} os.mkdir(os.path.join('build', app.id)) with open(os.path.join('build', app.id, 'FUNDING.yml'), 'w') as fp: - fp.write(textwrap.dedent(""" + fp.write( + textwrap.dedent( + """ opencollective: foo custom: [] liberapay: : - """)) + """ + ) + ) fdroidserver.update.insert_funding_yml_donation_links(apps) for field in DONATION_FIELDS: self.assertIsNone(app.get(field)) @@ -1311,8 +1351,9 @@ class UpdateTest(unittest.TestCase): self.assertIsNotNone(fdroidserver.update.sanitize_funding_yml_entry(['first', 'second'])) def test_set_localized_text_entry(self): - tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, - dir=self.tmpdir) + tmptestsdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(tmptestsdir) config = dict() fdroidserver.common.fill_config_defaults(config) @@ -1342,8 +1383,9 @@ class UpdateTest(unittest.TestCase): self.assertIsNone(app['localized'].get(locale, {}).get(key)) def test_set_author_entry(self): - tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, - dir=self.tmpdir) + tmptestsdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(tmptestsdir) config = dict() fdroidserver.common.fill_config_defaults(config) @@ -1411,8 +1453,13 @@ if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) parser = optparse.OptionParser() - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="Spew out even more information than normal") + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() diff --git a/tests/vcs.TestCase b/tests/vcs.TestCase index a7e7c758..2a408685 100755 --- a/tests/vcs.TestCase +++ b/tests/vcs.TestCase @@ -13,7 +13,8 @@ import unittest from git import Repo localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) @@ -36,7 +37,9 @@ class VCSTest(unittest.TestCase): os.chdir(self.basedir) def test_remote_set_head_can_fail(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) os.chdir(testdir) # First create an upstream repo with one commit upstream_repo = Repo.init("upstream_repo") @@ -80,8 +83,13 @@ if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) parser = optparse.OptionParser() - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="Spew out even more information than normal") + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() From ba2b236e7b18d677f464a48666e67474e4638ae3 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 18 May 2021 10:20:12 +0200 Subject: [PATCH 0281/2116] Drop unused package id check --- fdroidserver/checkupdates.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 4d2e45ef..3037fc58 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -130,7 +130,6 @@ def check_tags(app, pattern): try_init_submodules(app, last_build, vcs) - hpak = None htag = None hver = None hcode = "0" @@ -171,13 +170,10 @@ def check_tags(app, pattern): .format(subdir, version, vercode)) i_vercode = common.version_code_string_to_int(vercode) if i_vercode > common.version_code_string_to_int(hcode): - hpak = package htag = tag hcode = str(i_vercode) hver = version - if not hpak: - return (None, "Couldn't find package ID", None) if hver: return (hver, hcode, htag) return (None, "Couldn't find any version information", None) From 133b626b22592e385183c775cd62d8b3db5fba90 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 18 May 2021 10:21:05 +0200 Subject: [PATCH 0282/2116] Support UpdateCheckData in check_tags --- fdroidserver/checkupdates.py | 60 +++++++++++++++++++++++++++--------- tests/checkupdates.TestCase | 21 +++++++++++++ 2 files changed, 66 insertions(+), 15 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 3037fc58..1de39985 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -158,21 +158,51 @@ def check_tags(app, pattern): logging.debug("Check tag: '{0}'".format(tag)) vcs.gotorevision(tag) - for subdir in possible_subdirs(app): - if subdir == '.': - root_dir = build_dir - else: - root_dir = os.path.join(build_dir, subdir) - paths = common.manifest_paths(root_dir, last_build.gradle) - version, vercode, package = common.parse_androidmanifests(paths, app) - if vercode: - logging.debug("Manifest exists in subdir '{0}'. Found version {1} ({2})" - .format(subdir, version, vercode)) - i_vercode = common.version_code_string_to_int(vercode) - if i_vercode > common.version_code_string_to_int(hcode): - htag = tag - hcode = str(i_vercode) - hver = version + if app.UpdateCheckData: + filecode, codeex, filever, verex = app.UpdateCheckData.split('|') + vercode = None + if len(filecode) > 0: + filecontent = open(os.path.join(build_dir, filecode)).read() + + m = re.search(codeex, filecontent) + if not m: + raise FDroidException("No RE match for version code") + vercode = m.group(1).strip() + + version = "??" + if len(filever) > 0: + if filever != '.': + filecontent = open(os.path.join(build_dir, filever)).read() + + m = re.search(verex, filecontent) + if not m: + raise FDroidException("No RE match for version") + version = m.group(1) + + if vercode: + logging.debug("UpdateCheckData found version {0} ({1})" + .format(version, vercode)) + i_vercode = common.version_code_string_to_int(vercode) + if i_vercode > common.version_code_string_to_int(hcode): + htag = tag + hcode = str(i_vercode) + hver = version + else: + for subdir in possible_subdirs(app): + if subdir == '.': + root_dir = build_dir + else: + root_dir = os.path.join(build_dir, subdir) + paths = common.manifest_paths(root_dir, last_build.gradle) + version, vercode, package = common.parse_androidmanifests(paths, app) + if vercode: + logging.debug("Manifest exists in subdir '{0}'. Found version {1} ({2})" + .format(subdir, version, vercode)) + i_vercode = common.version_code_string_to_int(vercode) + if i_vercode > common.version_code_string_to_int(hcode): + htag = tag + hcode = str(i_vercode) + hver = version if hver: return (hver, hcode, htag) diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index 87ccdb99..2f44f235 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -186,6 +186,27 @@ class CheckupdatesTest(unittest.TestCase): self.assertEqual(vername, None) self.assertEqual(vercode, 'Version 1.1.9-beta is ignored') + def test_check_tags_data(self): + fdroidserver.checkupdates.options = mock.Mock() + + app = fdroidserver.metadata.App() + app.id = 'loop.starts.shooting' + app.metadatapath = 'metadata/' + app.id + '.yml' + app.RepoType = 'git' + app.CurrentVersionCode = 10108 + app.UpdateCheckMode = 'Tags' + app.UpdateCheckData = 'b.txt|c(.*)|e.txt|v(.*)' + + vcs = mock.Mock() + vcs.latesttags.return_value = ['1.1.8', '1.1.9'] + with mock.patch( + 'builtins.open', mock.mock_open(read_data='v1.1.9\nc10109') + ) as _ignored, mock.patch('fdroidserver.common.getvcs', return_value=vcs): + _ignored # silence the linters + vername, vercode, tag = fdroidserver.checkupdates.check_tags(app, None) + self.assertEqual(vername, '1.1.9') + self.assertEqual(vercode, '10109') + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From ed2da42effdce3fe947f61eb2cd57ab66e7654e5 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 7 Jun 2021 12:44:43 +0200 Subject: [PATCH 0283/2116] Support hex in versionCode with UCM RepoManifest Same a b83c3c9e. --- fdroidserver/checkupdates.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 1de39985..32bfdb84 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -266,9 +266,10 @@ def check_repomanifest(app, branch=None): if vercode: logging.debug("Manifest exists in subdir '{0}'. Found version {1} ({2})" .format(subdir, version, vercode)) - if int(vercode) > int(hcode): + i_vercode = common.version_code_string_to_int(vercode) + if i_vercode > common.version_code_string_to_int(hcode): hpak = package - hcode = str(int(vercode)) + hcode = str(i_vercode) hver = version if not hpak: From 92ec6265a3e6d499d4e2cae3c23b7ecc7901f1d7 Mon Sep 17 00:00:00 2001 From: linsui Date: Mon, 7 Jun 2021 21:02:03 +0800 Subject: [PATCH 0284/2116] checkupdates.py: use pathlib and support Windows --- fdroidserver/__main__.py | 3 +- fdroidserver/checkupdates.py | 61 ++++++++++++++++------------------- fdroidserver/common.py | 23 ++++++++----- tests/checkupdates.TestCase | 62 +++++++++++++++++++++--------------- 4 files changed, 80 insertions(+), 69 deletions(-) diff --git a/fdroidserver/__main__.py b/fdroidserver/__main__.py index d90a4316..c07afb9d 100755 --- a/fdroidserver/__main__.py +++ b/fdroidserver/__main__.py @@ -21,7 +21,6 @@ import re import sys import os -import locale import pkgutil import logging @@ -198,7 +197,7 @@ def main(): else: mod = __import__(available_plugins[command]['name'], None, None, [command]) - system_langcode, system_encoding = locale.getdefaultlocale() + system_encoding = sys.getdefaultencoding() if system_encoding is None or system_encoding.lower() not in ('utf-8', 'utf8'): logging.warning(_("Encoding is set to '{enc}' fdroid might run " "into encoding issues. Please set it to 'UTF-8' " diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 32bfdb84..1437b47c 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -31,6 +31,7 @@ from distutils.version import LooseVersion import logging import copy import urllib.parse +from pathlib import Path from . import _ from . import common @@ -62,7 +63,7 @@ def check_http(app): raise FDroidException(_('UpdateCheckData has invalid URL: {url}').format(url=urlcode)) vercode = None - if len(urlcode) > 0: + if urlcode: logging.debug("...requesting {0}".format(urlcode)) req = urllib.request.Request(urlcode, None, headers=net.HEADERS) resp = urllib.request.urlopen(req, None, 20) # nosec B310 scheme is filtered above @@ -74,7 +75,7 @@ def check_http(app): vercode = m.group(1).strip() version = "??" - if len(urlver) > 0: + if urlver: if urlver != '.': logging.debug("...requesting {0}".format(urlver)) req = urllib.request.Request(urlver, None) @@ -109,10 +110,10 @@ def check_tags(app, pattern): try: if app.RepoType == 'srclib': - build_dir = os.path.join('build', 'srclib', app.Repo) + build_dir = Path('build/srclib') / app.Repo repotype = common.getsrclibvcs(app.Repo) else: - build_dir = os.path.join('build', app.id) + build_dir = Path('build') / app.id repotype = app.RepoType if repotype not in ('git', 'git-svn', 'hg', 'bzr'): @@ -161,8 +162,8 @@ def check_tags(app, pattern): if app.UpdateCheckData: filecode, codeex, filever, verex = app.UpdateCheckData.split('|') vercode = None - if len(filecode) > 0: - filecontent = open(os.path.join(build_dir, filecode)).read() + if filecode: + filecontent = (build_dir / filecode).read_text() m = re.search(codeex, filecontent) if not m: @@ -170,9 +171,9 @@ def check_tags(app, pattern): vercode = m.group(1).strip() version = "??" - if len(filever) > 0: + if filever: if filever != '.': - filecontent = open(os.path.join(build_dir, filever)).read() + filecontent = (build_dir / filever).read_text() m = re.search(verex, filecontent) if not m: @@ -189,12 +190,9 @@ def check_tags(app, pattern): hver = version else: for subdir in possible_subdirs(app): - if subdir == '.': - root_dir = build_dir - else: - root_dir = os.path.join(build_dir, subdir) + root_dir = build_dir / subdir paths = common.manifest_paths(root_dir, last_build.gradle) - version, vercode, package = common.parse_androidmanifests(paths, app) + version, vercode, _package = common.parse_androidmanifests(paths, app) if vercode: logging.debug("Manifest exists in subdir '{0}'. Found version {1} ({2})" .format(subdir, version, vercode)) @@ -227,10 +225,10 @@ def check_repomanifest(app, branch=None): try: if app.RepoType == 'srclib': - build_dir = os.path.join('build', 'srclib', app.Repo) + build_dir = Path('build/srclib') / app.Repo repotype = common.getsrclibvcs(app.Repo) else: - build_dir = os.path.join('build', app.id) + build_dir = Path('build') / app.id repotype = app.RepoType # Set up vcs interface and make sure we have the latest code... @@ -248,7 +246,7 @@ def check_repomanifest(app, branch=None): vcs.gotorevision(None) last_build = metadata.Build() - if len(app.get('Builds', [])) > 0: + if app.get('Builds', []): last_build = app.get('Builds', [])[-1] try_init_submodules(app, last_build, vcs) @@ -257,10 +255,7 @@ def check_repomanifest(app, branch=None): hver = None hcode = "0" for subdir in possible_subdirs(app): - if subdir == '.': - root_dir = build_dir - else: - root_dir = os.path.join(build_dir, subdir) + root_dir = build_dir / subdir paths = common.manifest_paths(root_dir, last_build.gradle) version, vercode, package = common.parse_androidmanifests(paths, app) if vercode: @@ -290,10 +285,10 @@ def check_repotrunk(app): try: if app.RepoType == 'srclib': - build_dir = os.path.join('build', 'srclib', app.Repo) + build_dir = Path('build/srclib') / app.Repo repotype = common.getsrclibvcs(app.Repo) else: - build_dir = os.path.join('build', app.id) + build_dir = Path('build') / app.id repotype = app.RepoType if repotype not in ('git-svn', ): @@ -360,10 +355,11 @@ def try_init_submodules(app, last_build, vcs): # Return all directories under startdir that contain any of the manifest # files, and thus are probably an Android project. def dirs_with_manifest(startdir): - for root, dirs, files in os.walk(startdir): + # TODO: Python3.6: Accepts a path-like object. + for root, _dirs, files in os.walk(str(startdir)): if any(m in files for m in [ 'AndroidManifest.xml', 'pom.xml', 'build.gradle', 'build.gradle.kts']): - yield root + yield Path(root) # Tries to find a new subdir starting from the root build_dir. Returns said @@ -371,9 +367,9 @@ def dirs_with_manifest(startdir): def possible_subdirs(app): if app.RepoType == 'srclib': - build_dir = os.path.join('build', 'srclib', app.Repo) + build_dir = Path('build/srclib') / app.Repo else: - build_dir = os.path.join('build', app.id) + build_dir = Path('build') / app.id last_build = app.get_last_build() @@ -381,7 +377,7 @@ def possible_subdirs(app): m_paths = common.manifest_paths(d, last_build.gradle) package = common.parse_androidmanifests(m_paths, app)[2] if package is not None: - subdir = os.path.relpath(d, build_dir) + subdir = d.relative_to(build_dir) logging.debug("Adding possible subdir %s" % subdir) yield subdir @@ -401,9 +397,9 @@ def fetch_autoname(app, tag): return None if app.RepoType == 'srclib': - build_dir = os.path.join('build', 'srclib', app.Repo) + build_dir = Path('build/srclib') / app.Repo else: - build_dir = os.path.join('build', app.id) + build_dir = Path('build') / app.id try: vcs = common.getvcs(app.RepoType, app.Repo, build_dir) @@ -413,13 +409,10 @@ def fetch_autoname(app, tag): last_build = app.get_last_build() - logging.debug("...fetch auto name from " + build_dir) + logging.debug("...fetch auto name from " + str(build_dir)) new_name = None for subdir in possible_subdirs(app): - if subdir == '.': - root_dir = build_dir - else: - root_dir = os.path.join(build_dir, subdir) + root_dir = build_dir / subdir new_name = common.fetch_real_name(root_dir, last_build.gradle) if new_name is not None: break diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 63be8332..a0b858a0 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -51,6 +51,7 @@ import yaml import zipfile import tempfile import json +from pathlib import Path # TODO change to only import defusedxml once its installed everywhere try: @@ -119,13 +120,13 @@ orig_path = None default_config = { 'sdk_path': "$ANDROID_HOME", 'ndk_paths': {}, - 'cachedir': os.path.join(os.getenv('HOME'), '.cache', 'fdroidserver'), + 'cachedir': str(Path.home() / '.cache/fdroidserver'), 'java_paths': None, 'scan_binary': False, 'ant': "ant", 'mvn3': "mvn", 'gradle': os.path.join(FDROID_PATH, 'gradlew-fdroid'), - 'gradle_version_dir': os.path.join(os.path.join(os.getenv('HOME'), '.cache', 'fdroidserver'), 'gradle'), + 'gradle_version_dir': str(Path.home() / '.cache/fdroidserver/gradle'), 'sync_from_local_copy_dir': False, 'allow_disabled_algorithms': False, 'per_app_repos': False, @@ -884,6 +885,8 @@ def setup_vcs(app): def getvcs(vcstype, remote, local): + # TODO: Remove this in Python3.6 + local = str(local) if vcstype == 'git': return vcs_git(remote, local) if vcstype == 'git-svn': @@ -1082,13 +1085,13 @@ class vcs_git(vcs): p = FDroidPopen(['git', 'rev-parse', '--show-toplevel'], cwd=self.local, output=False) result = p.output.rstrip() - if not result.endswith(self.local): + if Path(result) != Path(self.local).resolve(): raise VCSException('Repository mismatch') def gotorevisionx(self, rev): if not os.path.exists(self.local): # Brand new checkout - p = self.git(['clone', '--', self.remote, self.local]) + p = self.git(['clone', '--', self.remote, str(self.local)]) if p.returncode != 0: self.clone_failed = True raise VCSException("Git clone failed", p.output) @@ -1197,7 +1200,7 @@ class vcs_gitsvn(vcs): """ p = FDroidPopen(['git', 'rev-parse', '--show-toplevel'], cwd=self.local, output=False) result = p.output.rstrip() - if not result.endswith(self.local): + if Path(result) != Path(self.local).resolve(): raise VCSException('Repository mismatch') def git(self, args, envs=dict(), cwd=None, output=True): @@ -1258,7 +1261,7 @@ class vcs_gitsvn(vcs): raise VCSException(_('Invalid redirect to non-HTTPS: {before} -> {after} ') .format(before=remote, after=location)) - gitsvn_args.extend(['--', remote, self.local]) + gitsvn_args.extend(['--', remote, str(self.local)]) p = self.git(gitsvn_args) if p.returncode != 0: self.clone_failed = True @@ -1358,7 +1361,7 @@ class vcs_hg(vcs): def gotorevisionx(self, rev): if not os.path.exists(self.local): - p = FDroidPopen(['hg', 'clone', '--ssh', '/bin/false', '--', self.remote, self.local], + p = FDroidPopen(['hg', 'clone', '--ssh', '/bin/false', '--', self.remote, str(self.local)], output=False) if p.returncode != 0: self.clone_failed = True @@ -1416,7 +1419,7 @@ class vcs_bzr(vcs): def gotorevisionx(self, rev): if not os.path.exists(self.local): - p = self.bzr(['branch', self.remote, self.local], output=False) + p = self.bzr(['branch', self.remote, str(self.local)], output=False) if p.returncode != 0: self.clone_failed = True raise VCSException("Bzr branch failed", p.output) @@ -1494,6 +1497,8 @@ def retrieve_string_singleline(app_dir, string, xmlfiles=None): def manifest_paths(app_dir, flavours): '''Return list of existing files that will be used to find the highest vercode''' + # TODO: Remove this in Python3.6 + app_dir = str(app_dir) possible_manifests = \ [os.path.join(app_dir, 'AndroidManifest.xml'), os.path.join(app_dir, 'src', 'main', 'AndroidManifest.xml'), @@ -1513,6 +1518,8 @@ def manifest_paths(app_dir, flavours): def fetch_real_name(app_dir, flavours): '''Retrieve the package name. Returns the name, or None if not found.''' + # TODO: Remove this in Python3.6 + app_dir = str(app_dir) for path in manifest_paths(app_dir, flavours): if not path.endswith('.xml') or not os.path.isfile(path): continue diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index 2f44f235..c431cae4 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -2,19 +2,17 @@ # http://www.drdobbs.com/testing/unit-testing-with-python/240165163 -import inspect import logging import optparse import os import sys import unittest from unittest import mock +from pathlib import Path -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) +localmodule = Path(__file__).resolve().parent.parent +print('localmodule: ' + str(localmodule)) if localmodule not in sys.path: sys.path.insert(0, localmodule) @@ -28,11 +26,11 @@ class CheckupdatesTest(unittest.TestCase): def setUp(self): logging.basicConfig(level=logging.DEBUG) - self.basedir = os.path.join(localmodule, 'tests') - self.tmpdir = os.path.abspath(os.path.join(self.basedir, '..', '.testfiles')) - if not os.path.exists(self.tmpdir): - os.makedirs(self.tmpdir) - os.chdir(self.basedir) + self.basedir = localmodule / 'tests' + self.tmpdir = localmodule / '.testfiles' + self.tmpdir.mkdir(exist_ok=True) + # TODO: Python3.6: Accepts a path-like object. + os.chdir(str(self.basedir)) def test_autoupdatemode_no_suffix(self): fdroidserver.checkupdates.options = mock.Mock() @@ -52,7 +50,9 @@ class CheckupdatesTest(unittest.TestCase): build.versionName = app.CurrentVersion app['Builds'].append(build) - with mock.patch('fdroidserver.checkupdates.check_http', lambda app: ('1.1.9', 10109)): + with mock.patch( + 'fdroidserver.checkupdates.check_http', lambda app: ('1.1.9', 10109) + ): with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): with mock.patch('subprocess.call', lambda cmd: 0): fdroidserver.checkupdates.checkupdates_app(app) @@ -71,14 +71,16 @@ class CheckupdatesTest(unittest.TestCase): app.CurrentVersion = '1.1.8-fdroid' app.CurrentVersionCode = 10108 app.UpdateCheckMode = 'HTTP' - app.AutoUpdateMode = 'Version +.%c-fdroid v%v_%c' + app.AutoUpdateMode = r'Version +.%c-fdroid v%v_%c' build = fdroidserver.metadata.Build() build.versionCode = app.CurrentVersionCode build.versionName = app.CurrentVersion app['Builds'].append(build) - with mock.patch('fdroidserver.checkupdates.check_http', lambda app: ('1.1.9', 10109)): + with mock.patch( + 'fdroidserver.checkupdates.check_http', lambda app: ('1.1.9', 10109) + ): with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): with mock.patch('subprocess.call', lambda cmd: 0): fdroidserver.checkupdates.checkupdates_app(app) @@ -98,11 +100,17 @@ class CheckupdatesTest(unittest.TestCase): app.UpdateCheckMode = 'HTTP' app.UpdateCheckData = 'mock' - with mock.patch('fdroidserver.checkupdates.check_http', lambda app: (None, 'bla')): + with mock.patch( + 'fdroidserver.checkupdates.check_http', lambda app: (None, 'bla') + ): fdroidserver.checkupdates.checkupdates_app(app) - with mock.patch('fdroidserver.checkupdates.check_http', lambda app: ('1.1.9', 10109)): - with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()) as wrmock: + with mock.patch( + 'fdroidserver.checkupdates.check_http', lambda app: ('1.1.9', 10109) + ): + with mock.patch( + 'fdroidserver.metadata.write_metadata', mock.Mock() + ) as wrmock: with mock.patch('subprocess.call', lambda cmd: 0): fdroidserver.checkupdates.checkupdates_app(app) wrmock.assert_called_with(app.metadatapath, app) @@ -125,14 +133,17 @@ class CheckupdatesTest(unittest.TestCase): build.versionName = app.CurrentVersion app['Builds'].append(build) - with mock.patch('fdroidserver.checkupdates.check_tags', lambda app, - pattern: (None, 'bla', None)): + with mock.patch( + 'fdroidserver.checkupdates.check_tags', + lambda app, pattern: (None, 'bla', None), + ): fdroidserver.checkupdates.checkupdates_app(app) - with mock.patch('fdroidserver.checkupdates.check_tags', lambda app, - pattern: ('1.1.9', 10109, 'v1.1.9')): - with mock.patch('fdroidserver.metadata.write_metadata', - mock.Mock()): + with mock.patch( + 'fdroidserver.checkupdates.check_tags', + lambda app, pattern: ('1.1.9', 10109, 'v1.1.9'), + ): + with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): with mock.patch('subprocess.call', lambda cmd: 0): fdroidserver.checkupdates.checkupdates_app(app) build = app['Builds'][-1] @@ -200,16 +211,17 @@ class CheckupdatesTest(unittest.TestCase): vcs = mock.Mock() vcs.latesttags.return_value = ['1.1.8', '1.1.9'] with mock.patch( - 'builtins.open', mock.mock_open(read_data='v1.1.9\nc10109') + 'pathlib.Path.read_text', lambda a: 'v1.1.9\nc10109' ) as _ignored, mock.patch('fdroidserver.common.getvcs', return_value=vcs): _ignored # silence the linters - vername, vercode, tag = fdroidserver.checkupdates.check_tags(app, None) + vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) self.assertEqual(vername, '1.1.9') self.assertEqual(vercode, '10109') if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) + # TODO: Python3.6: Accept path-like object. + os.chdir(str(Path(__file__).parent)) parser = optparse.OptionParser() parser.add_option( From 84b74d481ecba1fcd18b8f2ec18c00a0dbaefb30 Mon Sep 17 00:00:00 2001 From: linsui Date: Mon, 7 Jun 2021 23:27:30 +0800 Subject: [PATCH 0285/2116] fix tests for !935 --- tests/checkupdates.TestCase | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index c431cae4..c0a85c37 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -14,7 +14,7 @@ from pathlib import Path localmodule = Path(__file__).resolve().parent.parent print('localmodule: ' + str(localmodule)) if localmodule not in sys.path: - sys.path.insert(0, localmodule) + sys.path.insert(0, str(localmodule)) import fdroidserver.checkupdates import fdroidserver.metadata From a74922f56e493c0942eea604bbf889c9b0706175 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 7 Jun 2021 14:55:26 +0200 Subject: [PATCH 0286/2116] [checkupdates] handle non matching regex --- fdroidserver/checkupdates.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 1437b47c..cc844ea1 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -166,9 +166,8 @@ def check_tags(app, pattern): filecontent = (build_dir / filecode).read_text() m = re.search(codeex, filecontent) - if not m: - raise FDroidException("No RE match for version code") - vercode = m.group(1).strip() + if m: + vercode = m.group(1).strip() version = "??" if filever: @@ -176,9 +175,8 @@ def check_tags(app, pattern): filecontent = (build_dir / filever).read_text() m = re.search(verex, filecontent) - if not m: - raise FDroidException("No RE match for version") - version = m.group(1) + if m: + version = m.group(1) if vercode: logging.debug("UpdateCheckData found version {0} ({1})" From 49248ba3a9d4cf6ea5cb17396600cab8ab2ad15f Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 7 Jun 2021 18:52:57 +0200 Subject: [PATCH 0287/2116] [lint] only check for https with UpdateCheckMode HTTP With 133b626b UpdateCheckMode is now also allowed with Tags but it uses the files from the local repo. --- fdroidserver/lint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index bf558ba0..82f3b84c 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -217,7 +217,7 @@ def get_lastbuild(builds): def check_update_check_data_url(app): """UpdateCheckData must have a valid HTTPS URL to protect checkupdates runs """ - if app.UpdateCheckData: + if app.UpdateCheckData and app.UpdateCheckMode == 'HTTP': urlcode, codeex, urlver, verex = app.UpdateCheckData.split('|') for url in (urlcode, urlver): if url != '.': From d6eece639552bf8d62068cc5c64e701f2885b7bd Mon Sep 17 00:00:00 2001 From: linsui Date: Tue, 8 Jun 2021 18:33:22 +0800 Subject: [PATCH 0288/2116] import.py: use pathlib and support Windows --- fdroidserver/common.py | 45 +++++++------ fdroidserver/import.py | 87 ++++++++++++------------ fdroidserver/metadata.py | 2 + tests/common.TestCase | 42 ++++++------ tests/import.TestCase | 141 +++++++++++++++++++++------------------ tests/import_proxy.py | 11 +-- 6 files changed, 175 insertions(+), 153 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index a0b858a0..44dd32f9 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -862,10 +862,8 @@ def write_status_json(output, pretty=False, name=None): def get_head_commit_id(git_repo): """Get git commit ID for HEAD as a str - - repo.head.commit.binsha is a bytearray stored in a str """ - return hexlify(bytearray(git_repo.head.commit.binsha)).decode() + return git_repo.head.commit.hexsha def setup_vcs(app): @@ -914,6 +912,8 @@ class vcs: def __init__(self, remote, local): + # TODO: Remove this in Python3.6 + local = str(local) # svn, git-svn and bzr may require auth self.username = None if self.repotype() in ('git-svn', 'bzr'): @@ -1611,7 +1611,8 @@ def parse_androidmanifests(paths, app): max_package = None for path in paths: - + # TODO: Remove this in Python3.6 + path = str(path) if not os.path.isfile(path): continue @@ -1803,11 +1804,12 @@ def is_strict_application_id(name): def get_all_gradle_and_manifests(build_dir): paths = [] - for root, dirs, files in os.walk(build_dir): + # TODO: Python3.6: Accepts a path-like object. + for root, dirs, files in os.walk(str(build_dir)): for f in sorted(files): if f == 'AndroidManifest.xml' \ or f.endswith('.gradle') or f.endswith('.gradle.kts'): - full = os.path.join(root, f) + full = Path(root) / f paths.append(full) return paths @@ -1817,22 +1819,18 @@ def get_gradle_subdir(build_dir, paths): first_gradle_dir = None for path in paths: if not first_gradle_dir: - first_gradle_dir = os.path.relpath(os.path.dirname(path), build_dir) - if os.path.exists(path) and SETTINGS_GRADLE_REGEX.match(os.path.basename(path)): - with open(path) as fp: - for m in GRADLE_SUBPROJECT_REGEX.finditer(fp.read()): - for f in glob.glob(os.path.join(os.path.dirname(path), m.group(1), 'build.gradle*')): - with open(f) as fp: - while True: - line = fp.readline() - if not line: - break - if ANDROID_PLUGIN_REGEX.match(line): - return os.path.relpath(os.path.dirname(f), build_dir) - if first_gradle_dir and first_gradle_dir != '.': + first_gradle_dir = path.parent.relative_to(build_dir) + if path.exists() and SETTINGS_GRADLE_REGEX.match(str(path.name)): + for m in GRADLE_SUBPROJECT_REGEX.finditer(path.read_text()): + for f in (path.parent / m.group(1)).glob('build.gradle*'): + with f.open() as fp: + for line in fp.readlines(): + if ANDROID_PLUGIN_REGEX.match(line): + return f.parent.relative_to(build_dir) + if first_gradle_dir and first_gradle_dir != Path('.'): return first_gradle_dir - return '' + return def getrepofrompage(url): @@ -4324,3 +4322,10 @@ NDKS = [ "url": "https://dl.google.com/android/repository/android-ndk-r22b-linux-x86_64.zip" } ] + + +def handle_retree_error_on_windows(function, path, excinfo): + """Python can't remove a readonly file on Windows so chmod first""" + if function in (os.unlink, os.rmdir, os.remove) and excinfo[0] == PermissionError: + os.chmod(path, stat.S_IWRITE) + function(path) diff --git a/fdroidserver/import.py b/fdroidserver/import.py index 7c608e58..b86d99d6 100644 --- a/fdroidserver/import.py +++ b/fdroidserver/import.py @@ -20,12 +20,12 @@ import configparser import git import json -import os import shutil import sys import yaml from argparse import ArgumentParser import logging +from pathlib import Path, PurePosixPath try: from yaml import CSafeLoader as SafeLoader @@ -44,15 +44,15 @@ options = None # WARNING! This cannot be imported as a Python module, so reuseable functions need to go into common.py! -def clone_to_tmp_dir(app): - tmp_dir = 'tmp' - if not os.path.isdir(tmp_dir): - logging.info(_("Creating temporary directory")) - os.makedirs(tmp_dir) - tmp_dir = os.path.join(tmp_dir, 'importer') - if os.path.exists(tmp_dir): - shutil.rmtree(tmp_dir) +def clone_to_tmp_dir(app): + tmp_dir = Path('tmp') + tmp_dir.mkdir(exist_ok=True) + + tmp_dir = tmp_dir / 'importer' + + if tmp_dir.exists(): + shutil.rmtree(str(tmp_dir), onerror=common.handle_retree_error_on_windows) vcs = common.getvcs(app.RepoType, app.Repo, tmp_dir) vcs.gotorevision(options.rev) @@ -61,8 +61,8 @@ def clone_to_tmp_dir(app): def check_for_kivy_buildozer(tmp_importer_dir, app, build): versionCode = None - buildozer_spec = os.path.join(tmp_importer_dir, 'buildozer.spec') - if os.path.exists(buildozer_spec): + buildozer_spec = tmp_importer_dir / 'buildozer.spec' + if buildozer_spec.exists(): config = configparser.ConfigParser() config.read(buildozer_spec) import pprint @@ -132,15 +132,16 @@ def main(): raise FDroidException(_("This repo already has local metadata: %s") % local_metadata_files[0]) build = metadata.Build() - if options.url is None and os.path.isdir('.git'): + if options.url is None and Path('.git').is_dir(): app = metadata.App() - app.AutoName = os.path.basename(os.getcwd()) + app.AutoName = Path.cwd().name app.RepoType = 'git' - if os.path.exists('build.gradle') or os.path.exists('build.gradle.kts'): + if Path('build.gradle').exists() or Path('build.gradle.kts').exists(): build.gradle = ['yes'] - git_repo = git.repo.Repo(os.getcwd()) + # TODO: Python3.6: Should accept path-like + git_repo = git.Repo(str(Path.cwd())) for remote in git.Remote.iter_items(git_repo): if remote.name == 'origin': url = git_repo.remotes.origin.url @@ -152,7 +153,9 @@ def main(): elif options.url: app = common.get_app_from_url(options.url) tmp_importer_dir = clone_to_tmp_dir(app) - git_repo = git.repo.Repo(tmp_importer_dir) + # TODO: Python3.6: Should accept path-like + git_repo = git.Repo(str(tmp_importer_dir)) + if not options.omit_disable: build.disable = 'Generated by import.py - check/set version fields and commit id' write_local_file = False @@ -189,37 +192,36 @@ def main(): build.subdir = options.subdir build.gradle = ['yes'] elif subdir: - build.subdir = subdir + build.subdir = str(PurePosixPath(subdir)) build.gradle = ['yes'] if options.license: app.License = options.license if options.categories: app.Categories = options.categories.split(',') - if os.path.exists(os.path.join(subdir, 'jni')): + if (subdir / 'jni').exists(): build.buildjni = ['yes'] - if os.path.exists(os.path.join(subdir, 'build.gradle')) \ - or os.path.exists(os.path.join(subdir, 'build.gradle')): + if (subdir / 'build.gradle').exists() or (subdir / 'build.gradle').exists(): build.gradle = ['yes'] - package_json = os.path.join(tmp_importer_dir, 'package.json') # react-native - pubspec_yaml = os.path.join(tmp_importer_dir, 'pubspec.yaml') # flutter - if os.path.exists(package_json): + package_json = tmp_importer_dir / 'package.json' # react-native + pubspec_yaml = tmp_importer_dir / 'pubspec.yaml' # flutter + if package_json.exists(): build.sudo = ['apt-get update || apt-get update', 'apt-get install -t stretch-backports npm', 'npm install -g react-native-cli'] build.init = ['npm install'] - with open(package_json) as fp: + with package_json.open() as fp: data = json.load(fp) app.AutoName = data.get('name', app.AutoName) app.License = data.get('license', app.License) app.Description = data.get('description', app.Description) app.WebSite = data.get('homepage', app.WebSite) - app_json = os.path.join(tmp_importer_dir, 'app.json') - if os.path.exists(app_json): - with open(app_json) as fp: + app_json = tmp_importer_dir / 'app.json' + if app_json.exists(): + with app_json.open() as fp: data = json.load(fp) app.AutoName = data.get('name', app.AutoName) - if os.path.exists(pubspec_yaml): - with open(pubspec_yaml) as fp: + if pubspec_yaml.exists(): + with pubspec_yaml.open() as fp: data = yaml.load(fp, Loader=SafeLoader) app.AutoName = data.get('name', app.AutoName) app.License = data.get('license', app.License) @@ -232,8 +234,8 @@ def main(): '$$flutter$$/bin/flutter build apk', ] - git_modules = os.path.join(tmp_importer_dir, '.gitmodules') - if os.path.exists(git_modules): + git_modules = tmp_importer_dir / '.gitmodules' + if git_modules.exists(): build.submodules = True metadata.post_metadata_parse(app) @@ -241,24 +243,25 @@ def main(): app['Builds'].append(build) if write_local_file: - metadata.write_metadata('.fdroid.yml', app) + metadata.write_metadata(Path('.fdroid.yml'), app) else: # Keep the repo directory to save bandwidth... - if not os.path.exists('build'): - os.mkdir('build') - build_dir = os.path.join('build', appid) - if os.path.exists(build_dir): + Path('build').mkdir(exist_ok=True) + build_dir = Path('build') / appid + if build_dir.exists(): logging.warning(_('{path} already exists, ignoring import results!') .format(path=build_dir)) sys.exit(1) - elif tmp_importer_dir is not None: - shutil.move(tmp_importer_dir, build_dir) - with open('build/.fdroidvcs-' + appid, 'w') as f: - f.write(app.RepoType + ' ' + app.Repo) + elif tmp_importer_dir: + # For Windows: Close the repo or a git.exe instance holds handles to repo + git_repo.close() + # TODO: Python3.9: Accepts a path-like object for both src and dst. + shutil.move(str(tmp_importer_dir), str(build_dir)) + Path('build/.fdroidvcs-' + appid).write_text(app.RepoType + ' ' + app.Repo) - metadatapath = os.path.join('metadata', appid + '.yml') + metadatapath = Path('metadata') / (appid + '.yml') metadata.write_metadata(metadatapath, app) - logging.info("Wrote " + metadatapath) + logging.info("Wrote " + str(metadatapath)) if __name__ == "__main__": diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index f6524864..cc2e7876 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -978,6 +978,8 @@ build_cont = re.compile(r'^[ \t]') def write_metadata(metadatapath, app): + # TODO: Remove this + metadatapath = str(metadatapath) if metadatapath.endswith('.yml'): if importlib.util.find_spec('ruamel.yaml'): with open(metadatapath, 'w') as mf: diff --git a/tests/common.TestCase b/tests/common.TestCase index a47fe75b..2da0ecfa 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -22,6 +22,7 @@ import yaml import gzip from zipfile import ZipFile from unittest import mock +from pathlib import Path localmodule = os.path.realpath( @@ -1223,26 +1224,28 @@ class CommonTest(unittest.TestCase): def test_get_all_gradle_and_manifests(self): """Test whether the function works with relative and absolute paths""" - a = fdroidserver.common.get_all_gradle_and_manifests(os.path.join('source-files', 'cn.wildfirechat.chat')) + a = fdroidserver.common.get_all_gradle_and_manifests(Path('source-files/cn.wildfirechat.chat')) paths = [ - os.path.join('source-files', 'cn.wildfirechat.chat', 'avenginekit', 'build.gradle'), - os.path.join('source-files', 'cn.wildfirechat.chat', 'build.gradle'), - os.path.join('source-files', 'cn.wildfirechat.chat', 'chat', 'build.gradle'), - os.path.join('source-files', 'cn.wildfirechat.chat', 'client', 'build.gradle'), - os.path.join('source-files', 'cn.wildfirechat.chat', 'client', 'src', 'main', 'AndroidManifest.xml'), - os.path.join('source-files', 'cn.wildfirechat.chat', 'emojilibrary', 'build.gradle'), - os.path.join('source-files', 'cn.wildfirechat.chat', 'gradle', 'build_libraries.gradle'), - os.path.join('source-files', 'cn.wildfirechat.chat', 'imagepicker', 'build.gradle'), - os.path.join('source-files', 'cn.wildfirechat.chat', 'mars-core-release', 'build.gradle'), - os.path.join('source-files', 'cn.wildfirechat.chat', 'push', 'build.gradle'), - os.path.join('source-files', 'cn.wildfirechat.chat', 'settings.gradle'), + 'avenginekit/build.gradle', + 'build.gradle', + 'chat/build.gradle', + 'client/build.gradle', + 'client/src/main/AndroidManifest.xml', + 'emojilibrary/build.gradle', + 'gradle/build_libraries.gradle', + 'imagepicker/build.gradle', + 'mars-core-release/build.gradle', + 'push/build.gradle', + 'settings.gradle', ] + paths = [Path('source-files/cn.wildfirechat.chat') / path for path in paths] self.assertEqual(sorted(paths), sorted(a)) - abspath = os.path.join(self.basedir, 'source-files', 'realm') + abspath = Path(self.basedir) / 'source-files/realm' p = fdroidserver.common.get_all_gradle_and_manifests(abspath) self.assertEqual(1, len(p)) - self.assertTrue(p[0].startswith(abspath)) + # TODO: Pathon3.9: self.assertTrue(p[0].is_relative_to(abspath)) + self.assertTrue(abspath in p[0].parents) def test_get_gradle_subdir(self): subdirs = { @@ -1251,17 +1254,12 @@ class CommonTest(unittest.TestCase): 'org.tasks': 'app', 'ut.ewh.audiometrytest': 'app', } - for f in ( - 'cn.wildfirechat.chat', - 'com.anpmech.launcher', - 'org.tasks', - 'ut.ewh.audiometrytest', - ): - build_dir = os.path.join('source-files', f) + for k, v in subdirs.items(): + build_dir = Path('source-files') / k paths = fdroidserver.common.get_all_gradle_and_manifests(build_dir) logging.info(paths) subdir = fdroidserver.common.get_gradle_subdir(build_dir, paths) - self.assertEqual(subdirs[f], subdir) + self.assertEqual(v, str(subdir)) def test_parse_srclib_spec_good(self): self.assertEqual(fdroidserver.common.parse_srclib_spec('osmand-external-skia@android/oreo'), diff --git a/tests/import.TestCase b/tests/import.TestCase index 361e27e3..9803648d 100755 --- a/tests/import.TestCase +++ b/tests/import.TestCase @@ -2,41 +2,41 @@ # http://www.drdobbs.com/testing/unit-testing-with-python/240165163 -import inspect import logging import optparse import os -import requests import shutil import sys import tempfile import unittest from unittest import mock +from pathlib import Path -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) - -import fdroidserver.common -import fdroidserver.metadata +import requests +from testcommon import TmpCwd # work around the syntax error from: import fdroidserver.import import import_proxy +localmodule = Path(__file__).resolve().parent.parent +print('localmodule: ' + str(localmodule)) +if localmodule not in sys.path: + sys.path.insert(0, str(localmodule)) + +import fdroidserver.common +import fdroidserver.metadata + class ImportTest(unittest.TestCase): '''fdroid import''' def setUp(self): logging.basicConfig(level=logging.DEBUG) - self.basedir = os.path.join(localmodule, 'tests') - self.tmpdir = os.path.abspath(os.path.join(self.basedir, '..', '.testfiles')) - if not os.path.exists(self.tmpdir): - os.makedirs(self.tmpdir) - os.chdir(self.basedir) + self.basedir = localmodule / 'tests' + self.tmpdir = localmodule / '.testfiles' + self.tmpdir.mkdir(exist_ok=True) + # TODO: Python3.6: Accepts a path-like object. + os.chdir(str(self.basedir)) def test_import_gitlab(self): # FDroidPopen needs some config to work @@ -57,59 +57,72 @@ class ImportTest(unittest.TestCase): self.assertEqual(app.Repo, 'https://gitlab.com/fdroid/ci-test-app.git') def test_get_app_from_url(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) - os.mkdir(os.path.join(testdir, 'tmp')) - tmp_importer = os.path.join(testdir, 'tmp', 'importer') - data = ( - ( - 'cn.wildfirechat.chat', - 'https://github.com/wildfirechat/android-chat', - '0.6.9', - '23', - ), - ( - 'com.anpmech.launcher', - 'https://github.com/KeikaiLauncher/KeikaiLauncher', - 'Unknown', - None, - ), - ( - 'ut.ewh.audiometrytest', - 'https://github.com/ReeceStevens/ut_ewh_audiometer_2014', - '1.65', - '14', - ), - ) - for appid, url, vn, vc in data: - shutil.rmtree(tmp_importer, ignore_errors=True) - shutil.copytree( - os.path.join(self.basedir, 'source-files', appid), tmp_importer + # TODO: Pytohn3.6: The dir parameter now accepts a path-like object. + with tempfile.TemporaryDirectory(dir=str(self.tmpdir)) as testdir, TmpCwd( + testdir + ): + testdir = Path(testdir) + (testdir / 'tmp').mkdir() + tmp_importer = testdir / 'tmp/importer' + data = ( + ( + 'cn.wildfirechat.chat', + 'https://github.com/wildfirechat/android-chat', + '0.6.9', + '23', + ), + ( + 'com.anpmech.launcher', + 'https://github.com/KeikaiLauncher/KeikaiLauncher', + 'Unknown', + None, + ), + ( + 'ut.ewh.audiometrytest', + 'https://github.com/ReeceStevens/ut_ewh_audiometer_2014', + '1.65', + '14', + ), ) + for appid, url, vn, vc in data: + # TODO: Python3.6: Accepts a path-like object. + shutil.rmtree( + str(tmp_importer), + onerror=fdroidserver.common.handle_retree_error_on_windows, + ) + shutil.copytree( + str(self.basedir / 'source-files' / appid), str(tmp_importer) + ) - app = fdroidserver.common.get_app_from_url(url) - with mock.patch('fdroidserver.common.getvcs', - lambda a, b, c: fdroidserver.common.vcs(url, testdir)): - with mock.patch('fdroidserver.common.vcs.gotorevision', - lambda s, rev: None): - with mock.patch('shutil.rmtree', lambda a: None): - build_dir = import_proxy.clone_to_tmp_dir(app) - self.assertEqual('git', app.RepoType) - self.assertEqual(url, app.Repo) - self.assertEqual(url, app.SourceCode) - logging.info(build_dir) - paths = fdroidserver.common.get_all_gradle_and_manifests(build_dir) - self.assertNotEqual(paths, []) - versionName, versionCode, package = fdroidserver.common.parse_androidmanifests(paths, app) - self.assertEqual(vn, versionName) - self.assertEqual(vc, versionCode) - self.assertEqual(appid, package) + app = fdroidserver.common.get_app_from_url(url) + with mock.patch( + 'fdroidserver.common.getvcs', + lambda a, b, c: fdroidserver.common.vcs(url, testdir), + ), mock.patch( + 'fdroidserver.common.vcs.gotorevision', lambda s, rev: None + ), mock.patch( + 'shutil.rmtree', lambda a, onerror=None: None + ): + build_dir = import_proxy.clone_to_tmp_dir(app) + self.assertEqual('git', app.RepoType) + self.assertEqual(url, app.Repo) + self.assertEqual(url, app.SourceCode) + logging.info(build_dir) + paths = fdroidserver.common.get_all_gradle_and_manifests(build_dir) + self.assertNotEqual(paths, []) + ( + versionName, + versionCode, + package, + ) = fdroidserver.common.parse_androidmanifests(paths, app) + self.assertEqual(vn, versionName) + self.assertEqual(vc, versionCode) + self.assertEqual(appid, package) if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) + # TODO: Python3.6: Support added to accept objects implementing the os.PathLike interface. + os.chdir(str(Path(__file__).parent)) parser = optparse.OptionParser() parser.add_option( diff --git a/tests/import_proxy.py b/tests/import_proxy.py index f230fdb1..5a6dfced 100644 --- a/tests/import_proxy.py +++ b/tests/import_proxy.py @@ -1,20 +1,21 @@ # workaround the syntax error from: import fdroidserver.import import inspect -import os import sys +from pathlib import Path -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) -print('localmodule: ' + localmodule) +localmodule = Path(__file__).resolve().parent.parent +print('localmodule: ' + str(localmodule)) if localmodule not in sys.path: - sys.path.insert(0, localmodule) + sys.path.insert(0, str(localmodule)) + class Options: def __init__(self): self.rev = None self.subdir = None + module = __import__('fdroidserver.import') for name, obj in inspect.getmembers(module): if name == 'import': From 8f21f1e510b01d97c7e44986c00234117a5a92af Mon Sep 17 00:00:00 2001 From: linsui Date: Tue, 8 Jun 2021 21:31:55 +0800 Subject: [PATCH 0289/2116] metadata.py/rewritemeta.py: use pathlib and support Windows --- fdroidserver/common.py | 12 +- fdroidserver/metadata.py | 97 ++-- fdroidserver/rewritemeta.py | 16 +- tests/build.TestCase | 166 ++++++- tests/checkupdates.TestCase | 3 - tests/import.TestCase | 3 - tests/metadata.TestCase | 911 +++++++++++++++++++++--------------- tests/rewritemeta.TestCase | 71 ++- 8 files changed, 768 insertions(+), 511 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 44dd32f9..8d1a81c7 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -669,8 +669,8 @@ def get_metadata_files(vercodes): found_invalid = False metadatafiles = [] for appid in vercodes.keys(): - f = os.path.join('metadata', '%s.yml' % appid) - if os.path.exists(f): + f = Path('metadata') / ('%s.yml' % appid) + if f.exists(): metadatafiles.append(f) else: found_invalid = True @@ -795,9 +795,9 @@ def get_build_dir(app): '''get the dir that this app will be built in''' if app.RepoType == 'srclib': - return os.path.join('build', 'srclib', app.Repo) + return Path('build/srclib') / app.Repo - return os.path.join('build', app.id) + return Path('build') / app.id class Encoder(json.JSONEncoder): @@ -869,6 +869,8 @@ def get_head_commit_id(git_repo): def setup_vcs(app): '''checkout code from VCS and return instance of vcs and the build dir''' build_dir = get_build_dir(app) + # TODO: Remove this + build_dir = str(build_dir) # Set up vcs interface and make sure we have the latest code... logging.debug("Getting {0} vcs interface for {1}" @@ -3982,6 +3984,8 @@ YAML_LINT_CONFIG = {'extends': 'default', def run_yamllint(path, indent=0): + # TODO: Remove this + path = str(path) try: import yamllint.config import yamllint.linter diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index cc2e7876..947a119e 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -19,9 +19,9 @@ # along with this program. If not, see . import git -import os +from pathlib import Path, PurePosixPath +import platform import re -import glob import logging import yaml try: @@ -31,9 +31,9 @@ except ImportError: import importlib from collections import OrderedDict -import fdroidserver.common -from fdroidserver import _ -from fdroidserver.exception import MetaDataException, FDroidException +from . import common +from . import _ +from .exception import MetaDataException, FDroidException srclibs = None warnings_action = None @@ -330,7 +330,7 @@ class Build(dict): ndk = self.ndk if isinstance(ndk, list): ndk = self.ndk[0] - return fdroidserver.common.config['ndk_paths'].get(ndk, '') + return common.config['ndk_paths'].get(ndk, '') flagtypes = { @@ -470,15 +470,22 @@ def parse_yaml_srclib(metadatapath): 'Subdir': None, 'Prepare': None} - if not os.path.exists(metadatapath): + if not metadatapath.exists(): _warn_or_exception(_("Invalid scrlib metadata: '{file}' " "does not exist" .format(file=metadatapath))) return thisinfo - with open(metadatapath, "r", encoding="utf-8") as f: + with metadatapath.open("r", encoding="utf-8") as f: try: data = yaml.load(f, Loader=SafeLoader) + if type(data) is not dict: + if platform.system() == 'Windows': + # Handle symlink on Windows + symlink = metadatapath.parent / metadatapath.read_text() + if symlink.is_file(): + with symlink.open("r", encoding="utf-8") as s: + data = yaml.load(s, Loader=SafeLoader) if type(data) is not dict: raise yaml.error.YAMLError(_('{file} is blank or corrupt!') .format(file=metadatapath)) @@ -486,8 +493,7 @@ def parse_yaml_srclib(metadatapath): _warn_or_exception(_("Invalid srclib metadata: could not " "parse '{file}'") .format(file=metadatapath) + '\n' - + fdroidserver.common.run_yamllint(metadatapath, - indent=4), + + common.run_yamllint(metadatapath, indent=4), cause=e) return thisinfo @@ -531,13 +537,11 @@ def read_srclibs(): srclibs = {} - srcdir = 'srclibs' - if not os.path.exists(srcdir): - os.makedirs(srcdir) + srcdir = Path('srclibs') + srcdir.mkdir(exist_ok=True) - for metadatapath in sorted(glob.glob(os.path.join(srcdir, '*.yml'))): - srclibname = os.path.basename(metadatapath[:-4]) - srclibs[srclibname] = parse_yaml_srclib(metadatapath) + for metadatapath in sorted(srcdir.glob('*.yml')): + srclibs[metadatapath.stem] = parse_yaml_srclib(metadatapath) def read_metadata(appids={}, sort_by_time=False): @@ -559,18 +563,17 @@ def read_metadata(appids={}, sort_by_time=False): apps = OrderedDict() for basedir in ('metadata', 'tmp'): - if not os.path.exists(basedir): - os.makedirs(basedir) + Path(basedir).mkdir(exist_ok=True) if appids: - vercodes = fdroidserver.common.read_pkg_args(appids) - metadatafiles = fdroidserver.common.get_metadata_files(vercodes) + vercodes = common.read_pkg_args(appids) + metadatafiles = common.get_metadata_files(vercodes) else: - metadatafiles = (glob.glob(os.path.join('metadata', '*.yml')) - + glob.glob('.fdroid.yml')) + metadatafiles = list(Path('metadata').glob('*.yml')) + list( + Path('.').glob('.fdroid.yml')) if sort_by_time: - entries = ((os.stat(path).st_mtime, path) for path in metadatafiles) + entries = ((path.stat().st_mtime, path) for path in metadatafiles) metadatafiles = [] for _ignored, path in sorted(entries, reverse=True): metadatafiles.append(path) @@ -579,8 +582,8 @@ def read_metadata(appids={}, sort_by_time=False): metadatafiles = sorted(metadatafiles) for metadatapath in metadatafiles: - appid, _ignored = fdroidserver.common.get_extension(os.path.basename(metadatapath)) - if appid != '.fdroid' and not fdroidserver.common.is_valid_package_name(appid): + appid = metadatapath.stem + if appid != '.fdroid' and not common.is_valid_package_name(appid): _warn_or_exception(_("{appid} from {path} is not a valid Java Package Name!") .format(appid=appid, path=metadatapath)) if appid in apps: @@ -684,7 +687,7 @@ def post_metadata_parse(app): # Parse metadata for a single application. # -# 'metadatapath' - the filename to read. The "Application ID" aka +# 'metadatapath' - the file path to read. The "Application ID" aka # "Package Name" for the application comes from this # filename. Pass None to get a blank entry. # @@ -729,27 +732,27 @@ def parse_metadata(metadatapath): the source code. """ - + metadatapath = Path(metadatapath) app = App() - app.metadatapath = metadatapath - metadata_file = os.path.basename(metadatapath) - name, _ignored = fdroidserver.common.get_extension(metadata_file) + app.metadatapath = str(PurePosixPath(metadatapath)) + name = metadatapath.stem if name != '.fdroid': app.id = name - if metadatapath.endswith('.yml'): - with open(metadatapath, 'r') as mf: + if metadatapath.suffix == '.yml': + with metadatapath.open('r') as mf: parse_yaml_metadata(mf, app) else: _warn_or_exception(_('Unknown metadata format: {path} (use: *.yml)') .format(path=metadatapath)) - if metadata_file != '.fdroid.yml' and app.Repo: - build_dir = fdroidserver.common.get_build_dir(app) - metadata_in_repo = os.path.join(build_dir, '.fdroid.yml') - if os.path.isfile(metadata_in_repo): + if metadatapath.name != '.fdroid.yml' and app.Repo: + build_dir = common.get_build_dir(app) + metadata_in_repo = build_dir / '.fdroid.yml' + if metadata_in_repo.is_file(): try: - commit_id = fdroidserver.common.get_head_commit_id(git.repo.Repo(build_dir)) + # TODO: Python3.6: Should accept path-like + commit_id = common.get_head_commit_id(git.Repo(str(build_dir))) logging.debug(_('Including metadata from %s@%s') % (metadata_in_repo, commit_id)) except git.exc.InvalidGitRepositoryError: logging.debug(_('Including metadata from {path}').format(metadata_in_repo)) @@ -764,11 +767,11 @@ def parse_metadata(metadatapath): if app.get('Builds'): build = app['Builds'][-1] if build.subdir: - root_dir = build.subdir + root_dir = Path(build.subdir) else: - root_dir = '.' - paths = fdroidserver.common.manifest_paths(root_dir, build.gradle) - _ignored, _ignored, app.id = fdroidserver.common.parse_androidmanifests(paths, app) + root_dir = Path('.') + paths = common.manifest_paths(root_dir, build.gradle) + _ignored, _ignored, app.id = common.parse_androidmanifests(paths, app) return app @@ -790,8 +793,7 @@ def parse_yaml_metadata(mf, app): except yaml.YAMLError as e: _warn_or_exception(_("could not parse '{path}'") .format(path=mf.name) + '\n' - + fdroidserver.common.run_yamllint(mf.name, - indent=4), + + common.run_yamllint(mf.name, indent=4), cause=e) deprecated_in_yaml = ['Provides'] @@ -801,7 +803,7 @@ def parse_yaml_metadata(mf, app): if field not in yaml_app_fields + deprecated_in_yaml: msg = (_("Unrecognised app field '{fieldname}' in '{path}'") .format(fieldname=field, path=mf.name)) - if os.path.basename(mf.name) == '.fdroid.yml': + if Path(mf.name).name == '.fdroid.yml': logging.error(msg) del yamldata[field] else: @@ -978,11 +980,10 @@ build_cont = re.compile(r'^[ \t]') def write_metadata(metadatapath, app): - # TODO: Remove this - metadatapath = str(metadatapath) - if metadatapath.endswith('.yml'): + metadatapath = Path(metadatapath) + if metadatapath.suffix == '.yml': if importlib.util.find_spec('ruamel.yaml'): - with open(metadatapath, 'w') as mf: + with metadatapath.open('w') as mf: return write_yaml(mf, app) else: raise FDroidException(_('ruamel.yaml not installed, can not write metadata.')) diff --git a/fdroidserver/rewritemeta.py b/fdroidserver/rewritemeta.py index 66ddf98a..172359b8 100644 --- a/fdroidserver/rewritemeta.py +++ b/fdroidserver/rewritemeta.py @@ -18,11 +18,11 @@ # along with this program. If not, see . from argparse import ArgumentParser -import os import logging import io import tempfile import shutil +from pathlib import Path from . import _ from . import common @@ -36,9 +36,8 @@ def proper_format(app): s = io.StringIO() # TODO: currently reading entire file again, should reuse first # read in metadata.py - with open(app.metadatapath, 'r') as f: - cur_content = f.read() - if app.metadatapath.endswith('.yml'): + cur_content = Path(app.metadatapath).read_text() + if Path(app.metadatapath).suffix == '.yml': metadata.write_yaml(s, app) content = s.getvalue() s.close() @@ -65,8 +64,8 @@ def main(): apps = common.read_app_args(options.appid, allapps, False) for appid, app in apps.items(): - path = app.metadatapath - if path.endswith('.yml'): + path = Path(app.metadatapath) + if path.suffix == '.yml': logging.info(_("Rewriting '{appid}'").format(appid=appid)) else: logging.warning(_('Cannot rewrite "{path}"').format(path=path)) @@ -91,9 +90,10 @@ def main(): # rewrite to temporary file before overwriting existsing # file in case there's a bug in write_metadata with tempfile.TemporaryDirectory() as tmpdir: - tmp_path = os.path.join(tmpdir, os.path.basename(path)) + tmp_path = Path(tmpdir) / path.name metadata.write_metadata(tmp_path, app) - shutil.move(tmp_path, path) + # TODO: Python3.6: Accept path-lik + shutil.move(str(tmp_path), str(path)) logging.debug(_("Finished")) diff --git a/tests/build.TestCase b/tests/build.TestCase index 51ae8fea..3763712d 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -14,6 +14,7 @@ import unittest import yaml import zipfile from unittest import mock +from pathlib import Path localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') @@ -67,31 +68,134 @@ class BuildTest(unittest.TestCase): pass # aapt is not required if androguard is present testcases = [ - ('repo/obb.main.twoversions_1101613.apk', 'obb.main.twoversions', '1101613', '0.1', None), - ('org.bitbucket.tickytacky.mirrormirror_1.apk', 'org.bitbucket.tickytacky.mirrormirror', '1', '1.0', None), - ('org.bitbucket.tickytacky.mirrormirror_2.apk', 'org.bitbucket.tickytacky.mirrormirror', '2', '1.0.1', None), - ('org.bitbucket.tickytacky.mirrormirror_3.apk', 'org.bitbucket.tickytacky.mirrormirror', '3', '1.0.2', None), - ('org.bitbucket.tickytacky.mirrormirror_4.apk', 'org.bitbucket.tickytacky.mirrormirror', '4', '1.0.3', None), - ('org.dyndns.fules.ck_20.apk', 'org.dyndns.fules.ck', '20', 'v1.6pre2', - ['arm64-v8a', 'armeabi', 'armeabi-v7a', 'mips', 'mips64', 'x86', 'x86_64']), + ( + 'repo/obb.main.twoversions_1101613.apk', + 'obb.main.twoversions', + '1101613', + '0.1', + None, + ), + ( + 'org.bitbucket.tickytacky.mirrormirror_1.apk', + 'org.bitbucket.tickytacky.mirrormirror', + '1', + '1.0', + None, + ), + ( + 'org.bitbucket.tickytacky.mirrormirror_2.apk', + 'org.bitbucket.tickytacky.mirrormirror', + '2', + '1.0.1', + None, + ), + ( + 'org.bitbucket.tickytacky.mirrormirror_3.apk', + 'org.bitbucket.tickytacky.mirrormirror', + '3', + '1.0.2', + None, + ), + ( + 'org.bitbucket.tickytacky.mirrormirror_4.apk', + 'org.bitbucket.tickytacky.mirrormirror', + '4', + '1.0.3', + None, + ), + ( + 'org.dyndns.fules.ck_20.apk', + 'org.dyndns.fules.ck', + '20', + 'v1.6pre2', + [ + 'arm64-v8a', + 'armeabi', + 'armeabi-v7a', + 'mips', + 'mips64', + 'x86', + 'x86_64', + ], + ), ('urzip.apk', 'info.guardianproject.urzip', '100', '0.1', None), ('urzip-badcert.apk', 'info.guardianproject.urzip', '100', '0.1', None), ('urzip-badsig.apk', 'info.guardianproject.urzip', '100', '0.1', None), ('urzip-release.apk', 'info.guardianproject.urzip', '100', '0.1', None), - ('urzip-release-unsigned.apk', 'info.guardianproject.urzip', '100', '0.1', None), + ( + 'urzip-release-unsigned.apk', + 'info.guardianproject.urzip', + '100', + '0.1', + None, + ), ('repo/com.politedroid_3.apk', 'com.politedroid', '3', '1.2', None), ('repo/com.politedroid_4.apk', 'com.politedroid', '4', '1.3', None), ('repo/com.politedroid_5.apk', 'com.politedroid', '5', '1.4', None), ('repo/com.politedroid_6.apk', 'com.politedroid', '6', '1.5', None), - ('repo/duplicate.permisssions_9999999.apk', 'duplicate.permisssions', '9999999', '', None), - ('repo/info.zwanenburg.caffeinetile_4.apk', 'info.zwanenburg.caffeinetile', '4', '1.3', None), - ('repo/obb.main.oldversion_1444412523.apk', 'obb.main.oldversion', '1444412523', '0.1', None), - ('repo/obb.mainpatch.current_1619_another-release-key.apk', 'obb.mainpatch.current', '1619', '0.1', None), - ('repo/obb.mainpatch.current_1619.apk', 'obb.mainpatch.current', '1619', '0.1', None), - ('repo/obb.main.twoversions_1101613.apk', 'obb.main.twoversions', '1101613', '0.1', None), - ('repo/obb.main.twoversions_1101615.apk', 'obb.main.twoversions', '1101615', '0.1', None), - ('repo/obb.main.twoversions_1101617.apk', 'obb.main.twoversions', '1101617', '0.1', None), - ('repo/urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk', 'info.guardianproject.urzip', '100', '0.1', None), + ( + 'repo/duplicate.permisssions_9999999.apk', + 'duplicate.permisssions', + '9999999', + '', + None, + ), + ( + 'repo/info.zwanenburg.caffeinetile_4.apk', + 'info.zwanenburg.caffeinetile', + '4', + '1.3', + None, + ), + ( + 'repo/obb.main.oldversion_1444412523.apk', + 'obb.main.oldversion', + '1444412523', + '0.1', + None, + ), + ( + 'repo/obb.mainpatch.current_1619_another-release-key.apk', + 'obb.mainpatch.current', + '1619', + '0.1', + None, + ), + ( + 'repo/obb.mainpatch.current_1619.apk', + 'obb.mainpatch.current', + '1619', + '0.1', + None, + ), + ( + 'repo/obb.main.twoversions_1101613.apk', + 'obb.main.twoversions', + '1101613', + '0.1', + None, + ), + ( + 'repo/obb.main.twoversions_1101615.apk', + 'obb.main.twoversions', + '1101615', + '0.1', + None, + ), + ( + 'repo/obb.main.twoversions_1101617.apk', + 'obb.main.twoversions', + '1101617', + '0.1', + None, + ), + ( + 'repo/urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk', + 'info.guardianproject.urzip', + '100', + '0.1', + None, + ), ] for apkfilename, appid, versionCode, versionName, nativecode in testcases: app = fdroidserver.metadata.App() @@ -259,14 +363,26 @@ class BuildTest(unittest.TestCase): with mock.patch('fdroidserver.common.replace_build_vars', wraps=make_fake_apk): with mock.patch('fdroidserver.common.get_native_code', return_value='x86'): - with mock.patch('fdroidserver.common.get_apk_id', - return_value=(app.id, build.versionCode, build.versionName)): - with mock.patch('fdroidserver.common.is_apk_and_debuggable', return_value=False): + with mock.patch( + 'fdroidserver.common.get_apk_id', + return_value=(app.id, build.versionCode, build.versionName), + ): + with mock.patch( + 'fdroidserver.common.is_apk_and_debuggable', return_value=False + ): fdroidserver.build.build_local( - app, build, vcs, - build_dir=testdir, output_dir=testdir, - log_dir=None, srclib_dir=None, extlib_dir=None, tmp_dir=None, - force=False, onserver=False, refresh=False + app, + build, + vcs, + build_dir=testdir, + output_dir=testdir, + log_dir=None, + srclib_dir=None, + extlib_dir=None, + tmp_dir=None, + force=False, + onserver=False, + refresh=False, ) self.assertTrue(os.path.exists('foo.aar')) @@ -360,7 +476,7 @@ class BuildTest(unittest.TestCase): } ) app['Builds'] = [build] - fdroidserver.metadata.write_metadata(metadata_file, app) + fdroidserver.metadata.write_metadata(Path(metadata_file), app) os.makedirs(os.path.join('unsigned', 'binaries')) production_result = os.path.join( diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index c0a85c37..d8cd1f64 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -220,9 +220,6 @@ class CheckupdatesTest(unittest.TestCase): if __name__ == "__main__": - # TODO: Python3.6: Accept path-like object. - os.chdir(str(Path(__file__).parent)) - parser = optparse.OptionParser() parser.add_option( "-v", diff --git a/tests/import.TestCase b/tests/import.TestCase index 9803648d..81aeac39 100755 --- a/tests/import.TestCase +++ b/tests/import.TestCase @@ -121,9 +121,6 @@ class ImportTest(unittest.TestCase): if __name__ == "__main__": - # TODO: Python3.6: Support added to accept objects implementing the os.PathLike interface. - os.chdir(str(Path(__file__).parent)) - parser = optparse.OptionParser() parser.add_option( "-v", diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index b269e98d..297271ab 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -1,10 +1,6 @@ #!/usr/bin/env python3 -# http://www.drdobbs.com/testing/unit-testing-with-python/240165163 - import io -import glob -import inspect import logging import optparse import os @@ -12,25 +8,27 @@ import random import shutil import sys import unittest -import yaml +from unittest import mock import tempfile import textwrap from collections import OrderedDict -from unittest import mock +from pathlib import Path + + +import yaml +from testcommon import TmpCwd + try: from yaml import CSafeLoader as SafeLoader except ImportError: from yaml import SafeLoader -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) +localmodule = Path(__file__).resolve().parent.parent +print('localmodule: ' + str(localmodule)) if localmodule not in sys.path: - sys.path.insert(0, localmodule) + sys.path.insert(0, str(localmodule)) -from testcommon import TmpCwd import fdroidserver.common import fdroidserver.metadata @@ -42,11 +40,11 @@ class MetadataTest(unittest.TestCase): def setUp(self): logging.basicConfig(level=logging.DEBUG) - self.basedir = os.path.join(localmodule, 'tests') - self.tmpdir = os.path.abspath(os.path.join(self.basedir, '..', '.testfiles')) - if not os.path.exists(self.tmpdir): - os.makedirs(self.tmpdir) - os.chdir(self.basedir) + self.basedir = localmodule / 'tests' + self.tmpdir = localmodule / '.testfiles' + self.tmpdir.mkdir(exist_ok=True) + # TODO: Python3.6: Accepts a path-like object. + os.chdir(str(self.basedir)) def test_FieldValidator_BitcoinAddress(self): validator = None @@ -59,23 +57,53 @@ class MetadataTest(unittest.TestCase): fdroidserver.metadata.warnings_action = 'error' # some valid addresses (P2PKH, P2SH, Bech32) - self.assertIsNone(validator.check('1BrrrrErsrWetrTrnrrrrm4GFg7xJaNVN2', 'fake.app.id')) - self.assertIsNone(validator.check('3JrrrrWrEZr3rNrrvrecrnyirrnqRhWNLy', 'fake.app.id')) - self.assertIsNone(validator.check('bc1qar0srrr7xrkvr5lr43lrdnwrre5rgtrzrf5rrq', 'fake.app.id')) + self.assertIsNone( + validator.check('1BrrrrErsrWetrTrnrrrrm4GFg7xJaNVN2', 'fake.app.id') + ) + self.assertIsNone( + validator.check('3JrrrrWrEZr3rNrrvrecrnyirrnqRhWNLy', 'fake.app.id') + ) + self.assertIsNone( + validator.check('bc1qar0srrr7xrkvr5lr43lrdnwrre5rgtrzrf5rrq', 'fake.app.id') + ) # some invalid addresses - self.assertRaises(fdroidserver.exception.MetaDataException, validator.check, - '21BvMrSYsrWrtrrlL5A10mlGFr7rrarrN2', 'fake.app.id') - self.assertRaises(fdroidserver.exception.MetaDataException, validator.check, - '5Hrgr3ur5rGLrfKrrrrrrHSrqJrroGrrzrQrrrrrrLNrsrDrrrA', 'fake.app.id') - self.assertRaises(fdroidserver.exception.MetaDataException, validator.check, - '92rr46rUrgTrrromrVrirW6r1rrrdrerrdbJrrrhrCsYrrrrrrc', 'fake.app.id') - self.assertRaises(fdroidserver.exception.MetaDataException, validator.check, - 'K1BvMrSYsrWrtrrrn5Au4m4GFr7rrarrN2', 'fake.app.id') - self.assertRaises(fdroidserver.exception.MetaDataException, validator.check, - 'L1BvMrSYsrWrtrrrn5Au4m4GFr7rrarrN2', 'fake.app.id') - self.assertRaises(fdroidserver.exception.MetaDataException, validator.check, - 'tb1qw5r8drrejxrrg4y5rrrrrraryrrrrwrkxrjrsx', 'fake.app.id') + self.assertRaises( + fdroidserver.exception.MetaDataException, + validator.check, + '21BvMrSYsrWrtrrlL5A10mlGFr7rrarrN2', + 'fake.app.id', + ) + self.assertRaises( + fdroidserver.exception.MetaDataException, + validator.check, + '5Hrgr3ur5rGLrfKrrrrrrHSrqJrroGrrzrQrrrrrrLNrsrDrrrA', + 'fake.app.id', + ) + self.assertRaises( + fdroidserver.exception.MetaDataException, + validator.check, + '92rr46rUrgTrrromrVrirW6r1rrrdrerrdbJrrrhrCsYrrrrrrc', + 'fake.app.id', + ) + self.assertRaises( + fdroidserver.exception.MetaDataException, + validator.check, + 'K1BvMrSYsrWrtrrrn5Au4m4GFr7rrarrN2', + 'fake.app.id', + ) + self.assertRaises( + fdroidserver.exception.MetaDataException, + validator.check, + 'L1BvMrSYsrWrtrrrn5Au4m4GFr7rrarrN2', + 'fake.app.id', + ) + self.assertRaises( + fdroidserver.exception.MetaDataException, + validator.check, + 'tb1qw5r8drrejxrrg4y5rrrrrraryrrrrwrkxrjrsx', + 'fake.app.id', + ) def test_FieldValidator_LitecoinAddress(self): validator = None @@ -88,27 +116,55 @@ class MetadataTest(unittest.TestCase): fdroidserver.metadata.warnings_action = 'error' # some valid addresses (L, M, 3) - self.assertIsNone(validator.check('LgeGrrrrJAxyXprrPrrBrrX5Qrrrrrrrrd', 'fake.app.id')) - self.assertIsNone(validator.check('MrrrrrrrJAxyXpanPtrrRAX5QHxvUJo8id', 'fake.app.id')) + self.assertIsNone( + validator.check('LgeGrrrrJAxyXprrPrrBrrX5Qrrrrrrrrd', 'fake.app.id') + ) + self.assertIsNone( + validator.check('MrrrrrrrJAxyXpanPtrrRAX5QHxvUJo8id', 'fake.app.id') + ) self.assertIsNone(validator.check('3rereVr9rAryrranrrrrrAXrrHx', 'fake.app.id')) # some invalid addresses (various special use/testnet addresses, invalid chars) - self.assertRaises(fdroidserver.exception.MetaDataException, validator.check, - '21BvMrSYsrWrtrrrn5Au4l4GFr7rrarrN2', 'fake.app.id') - self.assertRaises(fdroidserver.exception.MetaDataException, validator.check, - '5Hrgr3ur5rGLrfKrrrrrr1SrqJrroGrrzrQrrrrrrLNrsrDrrrA', 'fake.app.id') - self.assertRaises(fdroidserver.exception.MetaDataException, validator.check, - '92rr46rUrgTrrromrVrirW6r1rrrdrerrdbJrrrhrCsYrrrrrrc', 'fake.app.id') - self.assertRaises(fdroidserver.exception.MetaDataException, validator.check, - 'K1BvMrSYsrWrtrrrn5Au4m4GFr7rrarrN2', 'fake.app.id') - self.assertRaises(fdroidserver.exception.MetaDataException, validator.check, - 'L0000rSYsrWrtrrrn5Au4m4GFr7rrarrN2', 'fake.app.id') - self.assertRaises(fdroidserver.exception.MetaDataException, validator.check, - 'tb1qw5r8drrejxrrg4y5rrrrrraryrrrrwrkxrjrsx', 'fake.app.id') + self.assertRaises( + fdroidserver.exception.MetaDataException, + validator.check, + '21BvMrSYsrWrtrrrn5Au4l4GFr7rrarrN2', + 'fake.app.id', + ) + self.assertRaises( + fdroidserver.exception.MetaDataException, + validator.check, + '5Hrgr3ur5rGLrfKrrrrrr1SrqJrroGrrzrQrrrrrrLNrsrDrrrA', + 'fake.app.id', + ) + self.assertRaises( + fdroidserver.exception.MetaDataException, + validator.check, + '92rr46rUrgTrrromrVrirW6r1rrrdrerrdbJrrrhrCsYrrrrrrc', + 'fake.app.id', + ) + self.assertRaises( + fdroidserver.exception.MetaDataException, + validator.check, + 'K1BvMrSYsrWrtrrrn5Au4m4GFr7rrarrN2', + 'fake.app.id', + ) + self.assertRaises( + fdroidserver.exception.MetaDataException, + validator.check, + 'L0000rSYsrWrtrrrn5Au4m4GFr7rrarrN2', + 'fake.app.id', + ) + self.assertRaises( + fdroidserver.exception.MetaDataException, + validator.check, + 'tb1qw5r8drrejxrrg4y5rrrrrraryrrrrwrkxrjrsx', + 'fake.app.id', + ) def test_valid_funding_yml_regex(self): """Check the regex can find all the cases""" - with open(os.path.join(self.basedir, 'funding-usernames.yaml')) as fp: + with (self.basedir / 'funding-usernames.yaml').open() as fp: data = yaml.load(fp, Loader=SafeLoader) for k, entries in data.items(): @@ -117,12 +173,15 @@ class MetadataTest(unittest.TestCase): if k == 'custom': pass elif k == 'bad': - self.assertIsNone(m, 'this is an invalid %s username: {%s}' % (k, entry)) + self.assertIsNone( + m, 'this is an invalid %s username: {%s}' % (k, entry) + ) else: - self.assertIsNotNone(m, 'this is a valid %s username: {%s}' % (k, entry)) + self.assertIsNotNone( + m, 'this is a valid %s username: {%s}' % (k, entry) + ) def test_read_metadata(self): - def _build_yaml_representer(dumper, data): '''Creates a YAML representation of a Build instance''' return dumper.represent_dict(data) @@ -141,77 +200,83 @@ class MetadataTest(unittest.TestCase): 'org.videolan.vlc', 'com.politedroid', ): - savepath = os.path.join('metadata', 'dump', appid + '.yaml') + savepath = Path('metadata/dump') / (appid + '.yaml') frommeta = dict(apps[appid]) self.assertTrue(appid in apps) - with open(savepath, 'r') as f: + with savepath.open('r') as f: from_yaml = yaml.load(f, Loader=SafeLoader) self.assertEqual(frommeta, from_yaml) # comment above assert and uncomment below to update test # files when new metadata fields are added - # with open(savepath, 'w') as f: + # with savepath.open('w') as f: # yaml.add_representer(fdroidserver.metadata.Build, _build_yaml_representer) # yaml.dump(frommeta, f, default_flow_style=False) def test_rewrite_yaml_fakeotaupdate(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - fdroidserver.common.config = {'accepted_formats': ['yml']} - fdroidserver.metadata.warnings_action = None + # TODO: Pytohn3.6: The dir parameter now accepts a path-like object. + with tempfile.TemporaryDirectory(dir=str(self.tmpdir)) as testdir: + testdir = Path(testdir) + fdroidserver.common.config = {'accepted_formats': ['yml']} + fdroidserver.metadata.warnings_action = None - # rewrite metadata - allapps = fdroidserver.metadata.read_metadata() - for appid, app in allapps.items(): - if appid == 'fake.ota.update': - fdroidserver.metadata.write_metadata( - os.path.join(testdir, appid + '.yml'), app - ) + # rewrite metadata + allapps = fdroidserver.metadata.read_metadata() + for appid, app in allapps.items(): + if appid == 'fake.ota.update': + fdroidserver.metadata.write_metadata( + testdir / (appid + '.yml'), app + ) - # assert rewrite result - with open(os.path.join(testdir, 'fake.ota.update.yml'), 'r') as result: - with open('metadata-rewrite-yml/fake.ota.update.yml', 'r') as orig: - self.maxDiff = None - self.assertEqual(result.read(), orig.read()) + # assert rewrite result + self.maxDiff = None + file_name = 'fake.ota.update.yml' + self.assertEqual( + (testdir / file_name).read_text(), + (Path('metadata-rewrite-yml') / file_name).read_text(), + ) def test_rewrite_yaml_fdroidclient(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - fdroidserver.common.config = {'accepted_formats': ['yml']} + # TODO: Pytohn3.6: The dir parameter now accepts a path-like object. + with tempfile.TemporaryDirectory(dir=str(self.tmpdir)) as testdir: + testdir = Path(testdir) + fdroidserver.common.config = {'accepted_formats': ['yml']} - # rewrite metadata - allapps = fdroidserver.metadata.read_metadata() - for appid, app in allapps.items(): - if appid == 'org.fdroid.fdroid': - fdroidserver.metadata.write_metadata( - os.path.join(testdir, appid + '.yml'), app - ) + # rewrite metadata + allapps = fdroidserver.metadata.read_metadata() + for appid, app in allapps.items(): + if appid == 'org.fdroid.fdroid': + fdroidserver.metadata.write_metadata( + testdir / (appid + '.yml'), app + ) - # assert rewrite result - with open(os.path.join(testdir, 'org.fdroid.fdroid.yml'), 'r') as result: - with open('metadata-rewrite-yml/org.fdroid.fdroid.yml', 'r') as orig: - self.maxDiff = None - self.assertEqual(result.read(), orig.read()) + # assert rewrite result + self.maxDiff = None + file_name = 'org.fdroid.fdroid.yml' + self.assertEqual( + (testdir / file_name).read_text(), + (Path('metadata-rewrite-yml') / file_name).read_text(), + ) def test_rewrite_yaml_special_build_params(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) + # TODO: Pytohn3.6: The dir parameter now accepts a path-like object. + with tempfile.TemporaryDirectory(dir=str(self.tmpdir)) as testdir: + testdir = Path(testdir) - # rewrite metadata - allapps = fdroidserver.metadata.read_metadata() - for appid, app in allapps.items(): - if appid == 'app.with.special.build.params': - fdroidserver.metadata.write_metadata( - os.path.join(testdir, appid + '.yml'), app - ) + # rewrite metadata + allapps = fdroidserver.metadata.read_metadata() + for appid, app in allapps.items(): + if appid == 'app.with.special.build.params': + fdroidserver.metadata.write_metadata( + testdir / (appid + '.yml'), app + ) - # assert rewrite result - with open(os.path.join(testdir, 'app.with.special.build.params.yml'), 'r') as result: - with open('metadata-rewrite-yml/app.with.special.build.params.yml', 'r') as orig: - self.maxDiff = None - self.assertEqual(result.read(), orig.read()) + # assert rewrite result + self.maxDiff = None + file_name = 'app.with.special.build.params.yml' + self.assertEqual( + (testdir / file_name).read_text(), + (Path('metadata-rewrite-yml') / file_name).read_text(), + ) def test_post_parse_yaml_metadata(self): fdroidserver.metadata.warnings_action = 'error' @@ -222,12 +287,18 @@ class MetadataTest(unittest.TestCase): builds.append(build) build['versionCode'] = 1.1 - self.assertRaises(fdroidserver.exception.MetaDataException, - fdroidserver.metadata.post_parse_yaml_metadata, yamldata) + self.assertRaises( + fdroidserver.exception.MetaDataException, + fdroidserver.metadata.post_parse_yaml_metadata, + yamldata, + ) build['versionCode'] = '1' - self.assertRaises(fdroidserver.exception.MetaDataException, - fdroidserver.metadata.post_parse_yaml_metadata, yamldata) + self.assertRaises( + fdroidserver.exception.MetaDataException, + fdroidserver.metadata.post_parse_yaml_metadata, + yamldata, + ) build['versionCode'] = 1 build['versionName'] = 1 @@ -258,39 +329,42 @@ class MetadataTest(unittest.TestCase): self.assertEqual('1234567890', yamldata['Builds'][0]['commit']) def test_read_metadata_sort_by_time(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - metadatadir = os.path.join(testdir, 'metadata') - os.makedirs(metadatadir) + # TODO: Pytohn3.6: The dir parameter now accepts a path-like object. + with tempfile.TemporaryDirectory(dir=str(self.tmpdir)) as testdir, TmpCwd( + testdir + ): + testdir = Path(testdir) + metadatadir = testdir / 'metadata' + metadatadir.mkdir() - randomlist = [] - randomapps = glob.glob(os.path.join(self.basedir, 'metadata', '*.yml')) - random.shuffle(randomapps) - i = 1 - for f in randomapps: - shutil.copy(f, metadatadir) - new = os.path.join(metadatadir, os.path.basename(f)) - stat = os.stat(new) - os.utime(new, (stat.st_ctime, stat.st_mtime + i)) - # prepend new item so newest is always first - randomlist = [os.path.basename(f)[:-4]] + randomlist - i += 1 - os.chdir(testdir) - allapps = fdroidserver.metadata.read_metadata(sort_by_time=True) - allappids = [] - for appid, app in allapps.items(): - allappids.append(appid) - self.assertEqual(randomlist, allappids) + randomlist = [] + randomapps = list((self.basedir / 'metadata').glob('*.yml')) + random.shuffle(randomapps) + i = 1 + for f in randomapps: + # TODO: Pytohn3.6: The parameter now accepts a path-like object. + shutil.copy(str(f), str(metadatadir)) + new = metadatadir / f.name + stat = new.stat() + # TODO: Changed in version 3.6: Accepts a path-like object. + os.utime(str(new), (stat.st_ctime, stat.st_mtime + i)) + # prepend new item so newest is always first + randomlist = [f.stem] + randomlist + i += 1 + allapps = fdroidserver.metadata.read_metadata(sort_by_time=True) + allappids = [] + for appid, app in allapps.items(): + allappids.append(appid) + self.assertEqual(randomlist, allappids) def test_parse_yaml_metadata_unknown_app_field(self): mf = io.StringIO( textwrap.dedent( """\ - AutoName: F-Droid - RepoType: git - Builds: [] - bad: value""" + AutoName: F-Droid + RepoType: git + Builds: [] + bad: value""" ) ) mf.name = 'mock_filename.yaml' @@ -302,10 +376,10 @@ class MetadataTest(unittest.TestCase): mf = io.StringIO( textwrap.dedent( """\ - AutoName: F-Droid - RepoType: git - Builds: - - bad: value""" + AutoName: F-Droid + RepoType: git + Builds: + - bad: value""" ) ) mf.name = 'mock_filename.yaml' @@ -314,23 +388,23 @@ class MetadataTest(unittest.TestCase): fdroidserver.metadata.parse_yaml_metadata(mf, {}) def test_parse_yaml_srclib_corrupt_file(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - srclibfile = os.path.join(testdir, 'srclib', 'mock.yml') - os.mkdir(os.path.dirname(srclibfile)) - with open(srclibfile, 'w') as fp: - fp.write( - textwrap.dedent( - """ - - RepoType: git - - Repo: https://github.com/realm/realm-js.git - """ + # TODO: Pytohn3.6: The dir parameter now accepts a path-like object. + with tempfile.TemporaryDirectory(dir=str(self.tmpdir)) as testdir: + testdir = Path(testdir) + srclibfile = testdir / 'srclib/mock.yml' + srclibfile.parent.mkdir() + with srclibfile.open('w') as fp: + fp.write( + textwrap.dedent( + """ + - RepoType: git + - Repo: https://github.com/realm/realm-js.git + """ + ) ) - ) - with mock.patch('fdroidserver.metadata.warnings_action', 'error'): - with self.assertRaises(MetaDataException): - fdroidserver.metadata.parse_yaml_srclib(srclibfile) + with mock.patch('fdroidserver.metadata.warnings_action', 'error'): + with self.assertRaises(MetaDataException): + fdroidserver.metadata.parse_yaml_srclib(srclibfile) def test_write_yaml_with_placeholder_values(self): mf = io.StringIO() @@ -358,26 +432,26 @@ class MetadataTest(unittest.TestCase): mf.read(), textwrap.dedent( """\ - Categories: - - None - License: Unknown - SourceCode: https://gitlab.com/fdroid/fdroidclient.git - IssueTracker: https://gitlab.com/fdroid/fdroidclient/issues + Categories: + - None + License: Unknown + SourceCode: https://gitlab.com/fdroid/fdroidclient.git + IssueTracker: https://gitlab.com/fdroid/fdroidclient/issues - RepoType: git - Repo: https://gitlab.com/fdroid/fdroidclient.git + RepoType: git + Repo: https://gitlab.com/fdroid/fdroidclient.git - Builds: - - versionName: Unknown - versionCode: 0 - disable: Generated by import.py ... - commit: Unknown - gradle: - - true + Builds: + - versionName: Unknown + versionCode: 0 + disable: Generated by import.py ... + commit: Unknown + gradle: + - true - AutoUpdateMode: None - UpdateCheckMode: Tags - """ + AutoUpdateMode: None + UpdateCheckMode: Tags + """ ), ) @@ -385,26 +459,26 @@ class MetadataTest(unittest.TestCase): mf = io.StringIO( textwrap.dedent( """\ - AutoName: F-Droid - RepoType: git - Builds: - - versionCode: 1 - versionName: v0.1.0 - sudo: - - apt-get update - - apt-get install -y whatever - - sed -i -e 's/> /a/file - build: - - ./gradlew someSpecialTask - - sed -i 'd/that wrong config/' gradle.properties - - ./gradlew compile - """ + AutoName: F-Droid + RepoType: git + Builds: + - versionCode: 1 + versionName: v0.1.0 + sudo: + - apt-get update + - apt-get install -y whatever + - sed -i -e 's/> /a/file + build: + - ./gradlew someSpecialTask + - sed -i 'd/that wrong config/' gradle.properties + - ./gradlew compile + """ ) ) mf.name = 'mock_filename.yaml' @@ -413,36 +487,45 @@ class MetadataTest(unittest.TestCase): with mock.patch('fdroidserver.metadata.warnings_action', 'error'): fdroidserver.metadata.parse_yaml_metadata(mf, result) self.maxDiff = None - self.assertDictEqual(result, {'AutoName': 'F-Droid', - 'RepoType': 'git', - 'Builds': [{'versionCode': 1, - 'versionName': 'v0.1.0', - 'sudo': "apt-get update && " - "apt-get install -y whatever && " - "sed -i -e 's/> /a/file", - 'build': "./gradlew someSpecialTask && " - "sed -i 'd/that wrong config/' gradle.properties && " - "./gradlew compile"}]}) + self.assertDictEqual( + result, + { + 'AutoName': 'F-Droid', + 'RepoType': 'git', + 'Builds': [ + { + 'versionCode': 1, + 'versionName': 'v0.1.0', + 'sudo': "apt-get update && " + "apt-get install -y whatever && " + "sed -i -e 's/> /a/file", + 'build': "./gradlew someSpecialTask && " + "sed -i 'd/that wrong config/' gradle.properties && " + "./gradlew compile", + } + ], + }, + ) def test_parse_yaml_metadata_prebuild_strings(self): mf = io.StringIO( textwrap.dedent( """\ - AutoName: F-Droid - RepoType: git - Builds: - - versionCode: 1 - versionName: v0.1.0 - sudo: |- - apt-get update && apt-get install -y whatever && sed -i -e 's/> /a/file - build: |- - ./gradlew someSpecialTask && sed -i 'd/that wrong config/' gradle.properties && ./gradlew compile - """ + AutoName: F-Droid + RepoType: git + Builds: + - versionCode: 1 + versionName: v0.1.0 + sudo: |- + apt-get update && apt-get install -y whatever && sed -i -e 's/> /a/file + build: |- + ./gradlew someSpecialTask && sed -i 'd/that wrong config/' gradle.properties && ./gradlew compile + """ ) ) mf.name = 'mock_filename.yaml' @@ -451,32 +534,41 @@ class MetadataTest(unittest.TestCase): with mock.patch('fdroidserver.metadata.warnings_action', 'error'): fdroidserver.metadata.parse_yaml_metadata(mf, result) self.maxDiff = None - self.assertDictEqual(result, {'AutoName': 'F-Droid', - 'RepoType': 'git', - 'Builds': [{'versionCode': 1, - 'versionName': 'v0.1.0', - 'sudo': "apt-get update && " - "apt-get install -y whatever && " - "sed -i -e 's/> /a/file", - 'build': "./gradlew someSpecialTask && " - "sed -i 'd/that wrong config/' gradle.properties && " - "./gradlew compile"}]}) + self.assertDictEqual( + result, + { + 'AutoName': 'F-Droid', + 'RepoType': 'git', + 'Builds': [ + { + 'versionCode': 1, + 'versionName': 'v0.1.0', + 'sudo': "apt-get update && " + "apt-get install -y whatever && " + "sed -i -e 's/> /a/file", + 'build': "./gradlew someSpecialTask && " + "sed -i 'd/that wrong config/' gradle.properties && " + "./gradlew compile", + } + ], + }, + ) def test_parse_yaml_metadata_prebuild_string(self): mf = io.StringIO( textwrap.dedent( """\ - AutoName: F-Droid - RepoType: git - Builds: - - versionCode: 1 - versionName: v0.1.0 - prebuild: |- - a && b && sed -i 's,a,b,' - """ + AutoName: F-Droid + RepoType: git + Builds: + - versionCode: 1 + versionName: v0.1.0 + prebuild: |- + a && b && sed -i 's,a,b,' + """ ) ) mf.name = 'mock_filename.yaml' @@ -484,26 +576,34 @@ class MetadataTest(unittest.TestCase): result = {} with mock.patch('fdroidserver.metadata.warnings_action', 'error'): fdroidserver.metadata.parse_yaml_metadata(mf, result) - self.assertDictEqual(result, {'AutoName': 'F-Droid', - 'RepoType': 'git', - 'Builds': [{'versionCode': 1, - 'versionName': 'v0.1.0', - 'prebuild': "a && b && " - "sed -i 's,a,b,'"}]}) + self.assertDictEqual( + result, + { + 'AutoName': 'F-Droid', + 'RepoType': 'git', + 'Builds': [ + { + 'versionCode': 1, + 'versionName': 'v0.1.0', + 'prebuild': "a && b && " "sed -i 's,a,b,'", + } + ], + }, + ) def test_parse_yaml_provides_should_be_ignored(self): mf = io.StringIO( textwrap.dedent( """\ - Provides: this.is.deprecated - AutoName: F-Droid - RepoType: git - Builds: - - versionCode: 1 - versionName: v0.1.0 - prebuild: |- - a && b && sed -i 's,a,b,' - """ + Provides: this.is.deprecated + AutoName: F-Droid + RepoType: git + Builds: + - versionCode: 1 + versionName: v0.1.0 + prebuild: |- + a && b && sed -i 's,a,b,' + """ ) ) mf.name = 'mock_filename.yaml' @@ -533,21 +633,21 @@ class MetadataTest(unittest.TestCase): mf.read(), textwrap.dedent( """\ - Categories: - - None - License: Unknown + Categories: + - None + License: Unknown - Builds: - - versionName: v1.2.3 - versionCode: 102030 - sudo: chmod +rwx /opt - init: sed -i -e 'g/what/ever/' /some/file - prebuild: sed -i 'd/that wrong config/' gradle.properties - build: ./gradlew compile + Builds: + - versionName: v1.2.3 + versionCode: 102030 + sudo: chmod +rwx /opt + init: sed -i -e 'g/what/ever/' /some/file + prebuild: sed -i 'd/that wrong config/' gradle.properties + build: ./gradlew compile - AutoUpdateMode: None - UpdateCheckMode: None - """ + AutoUpdateMode: None + UpdateCheckMode: None + """ ), ) @@ -570,21 +670,21 @@ class MetadataTest(unittest.TestCase): mf.read(), textwrap.dedent( """\ - Categories: - - None - License: Unknown + Categories: + - None + License: Unknown - Builds: - - versionName: v1.2.3 - versionCode: 102030 - sudo: chmod +rwx /opt - init: sed -i -e 'g/what/ever/' /some/file - prebuild: sed -i 'd/that wrong config/' gradle.properties - build: ./gradlew compile + Builds: + - versionName: v1.2.3 + versionCode: 102030 + sudo: chmod +rwx /opt + init: sed -i -e 'g/what/ever/' /some/file + prebuild: sed -i 'd/that wrong config/' gradle.properties + build: ./gradlew compile - AutoUpdateMode: None - UpdateCheckMode: None - """ + AutoUpdateMode: None + UpdateCheckMode: None + """ ), ) @@ -596,16 +696,21 @@ class MetadataTest(unittest.TestCase): build = fdroidserver.metadata.Build() build.versionCode = 102030 build.versionName = 'v1.2.3' - build.sudo = ["apt-get update", - "apt-get install -y whatever", - "sed -i -e 's/> /a/file"] - build.build = ["./gradlew someSpecialTask", - "sed -i 'd/that wrong config/' gradle.properties", - "./gradlew compile"] + build.sudo = [ + "apt-get update", + "apt-get install -y whatever", + "sed -i -e 's/> /a/file"] + build.build = [ + "./gradlew someSpecialTask", + "sed -i 'd/that wrong config/' gradle.properties", + "./gradlew compile", + ] app['Builds'].append(build) fdroidserver.metadata.write_yaml(mf, app) mf.seek(0) @@ -705,65 +810,81 @@ class MetadataTest(unittest.TestCase): mf.read(), textwrap.dedent( """\ - Categories: - - None - License: Unknown + Categories: + - None + License: Unknown - Builds: - - versionName: v1.2.3 - versionCode: 102030 - gradle: - - yes + Builds: + - versionName: v1.2.3 + versionCode: 102030 + gradle: + - yes - AutoUpdateMode: None - UpdateCheckMode: None - """ + AutoUpdateMode: None + UpdateCheckMode: None + """ ), ) def test_parse_yaml_srclib_unknown_key(self): fdroidserver.metadata.warnings_action = 'error' with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): - with open('test.yml', 'w', encoding='utf-8') as f: - f.write(textwrap.dedent('''\ - RepoType: git - Repo: https://example.com/test.git - Evil: I should not be here. - ''')) - with self.assertRaisesRegex(MetaDataException, - "Invalid srclib metadata: " - "unknown key 'Evil' in " - "'test.yml'"): - fdroidserver.metadata.parse_yaml_srclib('test.yml') + with Path('test.yml').open('w', encoding='utf-8') as f: + f.write( + textwrap.dedent( + '''\ + RepoType: git + Repo: https://example.com/test.git + Evil: I should not be here. + ''' + ) + ) + with self.assertRaisesRegex( + MetaDataException, + "Invalid srclib metadata: " "unknown key 'Evil' in " "'test.yml'", + ): + fdroidserver.metadata.parse_yaml_srclib(Path('test.yml')) def test_parse_yaml_srclib_does_not_exists(self): fdroidserver.metadata.warnings_action = 'error' - with self.assertRaisesRegex(MetaDataException, - "Invalid scrlib metadata: " - "'non/existent-test-srclib.yml' " - "does not exist"): - fdroidserver.metadata.parse_yaml_srclib('non/existent-test-srclib.yml') + with self.assertRaisesRegex( + MetaDataException, + "Invalid scrlib metadata: " + r"'non(/|\\)existent-test-srclib.yml' " + "does not exist", + ): + fdroidserver.metadata.parse_yaml_srclib( + Path('non/existent-test-srclib.yml') + ) def test_parse_yaml_srclib_simple(self): fdroidserver.metadata.warnings_action = 'error' with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): - with open('simple.yml', 'w', encoding='utf-8') as f: - f.write(textwrap.dedent('''\ + with Path('simple.yml').open('w', encoding='utf-8') as f: + f.write( + textwrap.dedent( + '''\ # this should be simple RepoType: git Repo: https://git.host/repo.git - ''')) - srclib = fdroidserver.metadata.parse_yaml_srclib('simple.yml') - self.assertDictEqual({'Repo': 'https://git.host/repo.git', - 'RepoType': 'git', - 'Subdir': None, - 'Prepare': None}, - srclib) + ''' + ) + ) + srclib = fdroidserver.metadata.parse_yaml_srclib(Path('simple.yml')) + self.assertDictEqual( + { + 'Repo': 'https://git.host/repo.git', + 'RepoType': 'git', + 'Subdir': None, + 'Prepare': None, + }, + srclib, + ) def test_parse_yaml_srclib_simple_with_blanks(self): fdroidserver.metadata.warnings_action = 'error' with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): - with open('simple.yml', 'w', encoding='utf-8') as f: + with Path('simple.yml').open('w', encoding='utf-8') as f: f.write( textwrap.dedent( '''\ @@ -779,17 +900,21 @@ class MetadataTest(unittest.TestCase): ''' ) ) - srclib = fdroidserver.metadata.parse_yaml_srclib('simple.yml') - self.assertDictEqual({'Repo': 'https://git.host/repo.git', - 'RepoType': 'git', - 'Subdir': [''], - 'Prepare': ''}, - srclib) + srclib = fdroidserver.metadata.parse_yaml_srclib(Path('simple.yml')) + self.assertDictEqual( + { + 'Repo': 'https://git.host/repo.git', + 'RepoType': 'git', + 'Subdir': [''], + 'Prepare': '', + }, + srclib, + ) def test_parse_yaml_srclib_Changelog_cketti(self): fdroidserver.metadata.warnings_action = 'error' with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): - with open('Changelog-cketti.yml', 'w', encoding='utf-8') as f: + with Path('Changelog-cketti.yml').open('w', encoding='utf-8') as f: f.write( textwrap.dedent( '''\ @@ -801,21 +926,27 @@ class MetadataTest(unittest.TestCase): ''' ) ) - srclib = fdroidserver.metadata.parse_yaml_srclib('Changelog-cketti.yml') - self.assertDictEqual(srclib, - {'Repo': 'https://github.com/cketti/ckChangeLog', - 'RepoType': 'git', - 'Subdir': ['library', 'ckChangeLog/src/main'], - 'Prepare': "[ -f project.properties ] || echo 'source.dir=java' > " - "ant.properties && echo -e " - "'android.library=true\\ntarget=android-19' > project.properties"}) + srclib = fdroidserver.metadata.parse_yaml_srclib( + Path('Changelog-cketti.yml') + ) + self.assertDictEqual( + srclib, + { + 'Repo': 'https://github.com/cketti/ckChangeLog', + 'RepoType': 'git', + 'Subdir': ['library', 'ckChangeLog/src/main'], + 'Prepare': "[ -f project.properties ] || echo 'source.dir=java' > " + "ant.properties && echo -e " + "'android.library=true\\ntarget=android-19' > project.properties", + }, + ) def test_read_srclibs_yml_subdir_list(self): fdroidserver.metadata.warnings_action = 'error' fdroidserver.metadata.srclibs = None with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): - os.mkdir('srclibs') - with open('srclibs/with-list.yml', 'w', encoding='utf-8') as f: + Path('srclibs').mkdir() + with Path('srclibs/with-list.yml').open('w', encoding='utf-8') as f: f.write( textwrap.dedent( '''\ @@ -839,25 +970,33 @@ class MetadataTest(unittest.TestCase): ) fdroidserver.metadata.read_srclibs() self.maxDiff = None - self.assertDictEqual(fdroidserver.metadata.srclibs, - {'with-list': {'RepoType': 'git', - 'Repo': 'https://git.host/repo.git', - 'Subdir': ['This is your last chance.', - 'After this, there is no turning back.', - 'You take the blue pill—the story ends,', - 'you wake up in your bed', - 'and believe whatever you want to believe.', - 'You take the red pill—you stay in Wonderland', - 'and I show you how deep the rabbit-hole goes.'], - 'Prepare': 'There is a difference between knowing the path ' - 'and walking the path.'}}) + self.assertDictEqual( + fdroidserver.metadata.srclibs, + { + 'with-list': { + 'RepoType': 'git', + 'Repo': 'https://git.host/repo.git', + 'Subdir': [ + 'This is your last chance.', + 'After this, there is no turning back.', + 'You take the blue pill—the story ends,', + 'you wake up in your bed', + 'and believe whatever you want to believe.', + 'You take the red pill—you stay in Wonderland', + 'and I show you how deep the rabbit-hole goes.', + ], + 'Prepare': 'There is a difference between knowing the path ' + 'and walking the path.', + } + }, + ) def test_read_srclibs_yml_prepare_list(self): fdroidserver.metadata.warnings_action = 'error' fdroidserver.metadata.srclibs = None with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): - os.mkdir('srclibs') - with open('srclibs/with-list.yml', 'w', encoding='utf-8') as f: + Path('srclibs').mkdir() + with Path('srclibs/with-list.yml').open('w', encoding='utf-8') as f: f.write( textwrap.dedent( '''\ @@ -880,25 +1019,31 @@ class MetadataTest(unittest.TestCase): ) fdroidserver.metadata.read_srclibs() self.maxDiff = None - self.assertDictEqual(fdroidserver.metadata.srclibs, - {'with-list': {'RepoType': 'git', - 'Repo': 'https://git.host/repo.git', - 'Subdir': [''], - 'Prepare': 'The Matrix is a system, Neo. && ' - 'That system is our enemy. && ' - 'But when you\'re inside, you look around, what do you see? && ' - 'Businessmen, teachers, lawyers, carpenters. && ' - 'The very minds of the people we are trying to save. && ' - 'But until we do, these people are still a part of that system and that makes them our enemy. && ' - 'You have to understand, most of these people are not ready to be unplugged. && ' - 'And many of them are so inert, so hopelessly dependent on the system that they will fight to protect it.'}}) + self.assertDictEqual( + fdroidserver.metadata.srclibs, + { + 'with-list': { + 'RepoType': 'git', + 'Repo': 'https://git.host/repo.git', + 'Subdir': [''], + 'Prepare': 'The Matrix is a system, Neo. && ' + 'That system is our enemy. && ' + 'But when you\'re inside, you look around, what do you see? && ' + 'Businessmen, teachers, lawyers, carpenters. && ' + 'The very minds of the people we are trying to save. && ' + 'But until we do, these people are still a part of that system and that makes them our enemy. && ' + 'You have to understand, most of these people are not ready to be unplugged. && ' + 'And many of them are so inert, so hopelessly dependent on the system that they will fight to protect it.', + } + }, + ) def test_read_srclibs(self): fdroidserver.metadata.warnings_action = 'error' fdroidserver.metadata.srclibs = None with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): - os.mkdir('srclibs') - with open('srclibs/simple.yml', 'w', encoding='utf-8') as f: + Path('srclibs').mkdir() + with Path('srclibs/simple.yml').open('w', encoding='utf-8') as f: f.write( textwrap.dedent( '''\ @@ -907,7 +1052,7 @@ class MetadataTest(unittest.TestCase): ''' ) ) - with open('srclibs/simple-wb.yml', 'w', encoding='utf-8') as f: + with Path('srclibs/simple-wb.yml').open('w', encoding='utf-8') as f: f.write( textwrap.dedent( '''\ @@ -921,20 +1066,26 @@ class MetadataTest(unittest.TestCase): ) ) fdroidserver.metadata.read_srclibs() - self.assertDictEqual(fdroidserver.metadata.srclibs, - {'simple-wb': {'RepoType': 'git', - 'Repo': 'https://git.host/repo.git', - 'Subdir': [''], - 'Prepare': ''}, - 'simple': {'RepoType': 'git', - 'Repo': 'https://git.host/repo.git', - 'Subdir': None, - 'Prepare': None}}) + self.assertDictEqual( + fdroidserver.metadata.srclibs, + { + 'simple-wb': { + 'RepoType': 'git', + 'Repo': 'https://git.host/repo.git', + 'Subdir': [''], + 'Prepare': '', + }, + 'simple': { + 'RepoType': 'git', + 'Repo': 'https://git.host/repo.git', + 'Subdir': None, + 'Prepare': None, + }, + }, + ) if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - parser = optparse.OptionParser() parser.add_option( "-v", diff --git a/tests/rewritemeta.TestCase b/tests/rewritemeta.TestCase index be87c3cb..1271f9d8 100755 --- a/tests/rewritemeta.TestCase +++ b/tests/rewritemeta.TestCase @@ -1,6 +1,5 @@ #!/usr/bin/env python3 -import inspect import logging import optparse import os @@ -9,14 +8,15 @@ import unittest import tempfile import textwrap from unittest import mock +from pathlib import Path + + from testcommon import TmpCwd -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) +localmodule = Path(__file__).resolve().parent.parent +print('localmodule: ' + str(localmodule)) if localmodule not in sys.path: - sys.path.insert(0, localmodule) + sys.path.insert(0, str(localmodule)) from fdroidserver import common from fdroidserver import rewritemeta @@ -28,30 +28,29 @@ class RewriteMetaTest(unittest.TestCase): def setUp(self): logging.basicConfig(level=logging.DEBUG) - self.basedir = os.path.join(localmodule, 'tests') - self.tmpdir = os.path.abspath(os.path.join(self.basedir, '..', '.testfiles')) - if not os.path.exists(self.tmpdir): - os.makedirs(self.tmpdir) - os.chdir(self.basedir) + self.basedir = localmodule / 'tests' + self.tmpdir = localmodule / '.testfiles' + self.tmpdir.mkdir(exist_ok=True) + # TODO: Python3.6: Accepts a path-like object. + os.chdir(str(self.basedir)) def test_rewrite_scenario_trivial(self): sys.argv = ['rewritemeta', 'a', 'b'] with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): - os.mkdir('metadata') - with open('metadata/a.yml', 'w') as f: + Path('metadata').mkdir() + with Path('metadata/a.yml').open('w') as f: f.write('AutoName: a') - with open('metadata/b.yml', 'w') as f: + with Path('metadata/b.yml').open('w') as f: f.write('AutoName: b') rewritemeta.main() - with open('metadata/a.yml') as f: - self.assertEqual( - f.read(), - textwrap.dedent( - '''\ + self.assertEqual( + Path('metadata/a.yml').read_text(), + textwrap.dedent( + '''\ License: Unknown AutoName: a @@ -59,14 +58,13 @@ class RewriteMetaTest(unittest.TestCase): AutoUpdateMode: None UpdateCheckMode: None ''' - ), - ) + ), + ) - with open('metadata/b.yml') as f: - self.assertEqual( - f.read(), - textwrap.dedent( - '''\ + self.assertEqual( + Path('metadata/b.yml').read_text(), + textwrap.dedent( + '''\ License: Unknown AutoName: b @@ -74,14 +72,14 @@ class RewriteMetaTest(unittest.TestCase): AutoUpdateMode: None UpdateCheckMode: None ''' - ), - ) + ), + ) def test_rewrite_scenario_yml_no_ruamel(self): sys.argv = ['rewritemeta', 'a'] with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): - os.mkdir('metadata') - with open('metadata/a.yml', 'w') as f: + Path('metadata').mkdir() + with Path('metadata/a.yml').open('w') as f: f.write('AutoName: a') def boom(*args): @@ -91,19 +89,12 @@ class RewriteMetaTest(unittest.TestCase): with self.assertRaises(FDroidException): rewritemeta.main() - with open('metadata/a.yml') as f: - self.assertEqual( - f.read(), - textwrap.dedent( - '''\ - AutoName: a''' - ), - ) + self.assertEqual( + Path('metadata/a.yml').read_text(), 'AutoName: a' + ) if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - parser = optparse.OptionParser() parser.add_option( "-v", From 490f578d1cb99718c526080d4a0f4310eb3c2566 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 8 Jun 2021 16:19:36 +0200 Subject: [PATCH 0290/2116] remove redundant call to Path() --- tests/build.TestCase | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/build.TestCase b/tests/build.TestCase index 3763712d..33ad0f90 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -14,7 +14,6 @@ import unittest import yaml import zipfile from unittest import mock -from pathlib import Path localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') @@ -476,7 +475,7 @@ class BuildTest(unittest.TestCase): } ) app['Builds'] = [build] - fdroidserver.metadata.write_metadata(Path(metadata_file), app) + fdroidserver.metadata.write_metadata(metadata_file, app) os.makedirs(os.path.join('unsigned', 'binaries')) production_result = os.path.join( From 6bafb036eeda1e4111e39bde7ec9f9c6303fe2e0 Mon Sep 17 00:00:00 2001 From: linsui Date: Wed, 9 Jun 2021 15:46:52 +0800 Subject: [PATCH 0291/2116] lint.py: use pathlib and support Windows --- fdroidserver/common.py | 8 +- fdroidserver/lint.py | 464 ++++++++++++++++++++++++++--------------- tests/lint.TestCase | 64 +++--- 3 files changed, 334 insertions(+), 202 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 8d1a81c7..a832a7de 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3983,9 +3983,7 @@ YAML_LINT_CONFIG = {'extends': 'default', def run_yamllint(path, indent=0): - - # TODO: Remove this - path = str(path) + path = Path(path) try: import yamllint.config import yamllint.linter @@ -3993,10 +3991,10 @@ def run_yamllint(path, indent=0): return '' result = [] - with open(path, 'r', encoding='utf-8') as f: + with path.open('r', encoding='utf-8') as f: problems = yamllint.linter.run(f, yamllint.config.YamlLintConfig(json.dumps(YAML_LINT_CONFIG))) for problem in problems: - result.append(' ' * indent + path + ':' + str(problem.line) + ': ' + problem.message) + result.append(' ' * indent + str(path) + ':' + str(problem.line) + ': ' + problem.message) return '\n'.join(result) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 82f3b84c..04b9fc0b 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -17,11 +17,11 @@ # along with this program. If not, see . from argparse import ArgumentParser -import glob -import os import re import sys +import platform import urllib.parse +from pathlib import Path from . import _ from . import common @@ -33,8 +33,12 @@ options = None def enforce_https(domain): - return (re.compile(r'^http://([^/]*\.)?' + re.escape(domain) + r'(/.*)?', re.IGNORECASE), - domain + " URLs should always use https://") + return ( + re.compile( + r'^http://([^/]*\.)?' + re.escape(domain) + r'(/.*)?', re.IGNORECASE + ), + domain + " URLs should always use https://", + ) https_enforcings = [ @@ -59,8 +63,10 @@ https_enforcings = [ def forbid_shortener(domain): - return (re.compile(r'https?://[^/]*' + re.escape(domain) + r'/.*'), - _("URL shorteners should not be used")) + return ( + re.compile(r'https?://[^/]*' + re.escape(domain) + r'/.*'), + _("URL shorteners should not be used"), + ) http_url_shorteners = [ @@ -119,70 +125,98 @@ http_url_shorteners = [ forbid_shortener('➡.ws'), ] -http_checks = https_enforcings + http_url_shorteners + [ - (re.compile(r'^(?!https?://)[^/]+'), - _("URL must start with https:// or http://")), - (re.compile(r'^https://(github|gitlab)\.com(/[^/]+){2,3}\.git'), - _("Appending .git is not necessary")), - (re.compile(r'^https://[^/]*(github|gitlab|bitbucket|rawgit|githubusercontent)\.[a-zA-Z]+/([^/]+/){2,3}master/'), - _("Use /HEAD instead of /master to point at a file in the default branch")), -] +http_checks = ( + https_enforcings + + http_url_shorteners + + [ + ( + re.compile(r'^(?!https?://)[^/]+'), + _("URL must start with https:// or http://"), + ), + ( + re.compile(r'^https://(github|gitlab)\.com(/[^/]+){2,3}\.git'), + _("Appending .git is not necessary"), + ), + ( + re.compile( + r'^https://[^/]*(github|gitlab|bitbucket|rawgit|githubusercontent)\.[a-zA-Z]+/([^/]+/){2,3}master/' + ), + _("Use /HEAD instead of /master to point at a file in the default branch"), + ), + ] +) regex_checks = { 'WebSite': http_checks, 'SourceCode': http_checks, 'Repo': https_enforcings, 'UpdateCheckMode': https_enforcings, - 'IssueTracker': http_checks + [ - (re.compile(r'.*github\.com/[^/]+/[^/]+/*$'), - _("/issues is missing")), - (re.compile(r'.*gitlab\.com/[^/]+/[^/]+/*$'), - _("/issues is missing")), + 'IssueTracker': http_checks + + [ + (re.compile(r'.*github\.com/[^/]+/[^/]+/*$'), _("/issues is missing")), + (re.compile(r'.*gitlab\.com/[^/]+/[^/]+/*$'), _("/issues is missing")), ], - 'Donate': http_checks + [ - (re.compile(r'.*flattr\.com'), - _("Flattr donation methods belong in the FlattrID: field")), - (re.compile(r'.*liberapay\.com'), - _("Liberapay donation methods belong in the Liberapay: field")), - (re.compile(r'.*opencollective\.com'), - _("OpenCollective donation methods belong in the OpenCollective: field")), + 'Donate': http_checks + + [ + ( + re.compile(r'.*flattr\.com'), + _("Flattr donation methods belong in the FlattrID: field"), + ), + ( + re.compile(r'.*liberapay\.com'), + _("Liberapay donation methods belong in the Liberapay: field"), + ), + ( + re.compile(r'.*opencollective\.com'), + _("OpenCollective donation methods belong in the OpenCollective: field"), + ), ], 'Changelog': http_checks, 'Author Name': [ - (re.compile(r'^\s'), - _("Unnecessary leading space")), - (re.compile(r'.*\s$'), - _("Unnecessary trailing space")), + (re.compile(r'^\s'), _("Unnecessary leading space")), + (re.compile(r'.*\s$'), _("Unnecessary trailing space")), ], 'Summary': [ - (re.compile(r'.*\b(free software|open source)\b.*', re.IGNORECASE), - _("No need to specify that the app is Free Software")), - (re.compile(r'.*((your|for).*android|android.*(app|device|client|port|version))', re.IGNORECASE), - _("No need to specify that the app is for Android")), - (re.compile(r'.*[a-z0-9][.!?]( |$)'), - _("Punctuation should be avoided")), - (re.compile(r'^\s'), - _("Unnecessary leading space")), - (re.compile(r'.*\s$'), - _("Unnecessary trailing space")), + ( + re.compile(r'.*\b(free software|open source)\b.*', re.IGNORECASE), + _("No need to specify that the app is Free Software"), + ), + ( + re.compile( + r'.*((your|for).*android|android.*(app|device|client|port|version))', + re.IGNORECASE, + ), + _("No need to specify that the app is for Android"), + ), + (re.compile(r'.*[a-z0-9][.!?]( |$)'), _("Punctuation should be avoided")), + (re.compile(r'^\s'), _("Unnecessary leading space")), + (re.compile(r'.*\s$'), _("Unnecessary trailing space")), ], - 'Description': https_enforcings + http_url_shorteners + [ - (re.compile(r'\s*[*#][^ .]'), - _("Invalid bulleted list")), - (re.compile(r'https://f-droid.org/[a-z][a-z](_[A-Za-z]{2,4})?/'), - _("Locale included in f-droid.org URL")), - (re.compile(r'^\s'), - _("Unnecessary leading space")), - (re.compile(r'.*\s$'), - _("Unnecessary trailing space")), - (re.compile(r'.*<(applet|base|body|button|embed|form|head|html|iframe|img|input|link|object|picture|script|source|style|svg|video).*', re.IGNORECASE), - _("Forbidden HTML tags")), - (re.compile(r'''.*\s+src=["']javascript:.*'''), - _("Javascript in HTML src attributes")), + 'Description': https_enforcings + + http_url_shorteners + + [ + (re.compile(r'\s*[*#][^ .]'), _("Invalid bulleted list")), + ( + re.compile(r'https://f-droid.org/[a-z][a-z](_[A-Za-z]{2,4})?/'), + _("Locale included in f-droid.org URL"), + ), + (re.compile(r'^\s'), _("Unnecessary leading space")), + (re.compile(r'.*\s$'), _("Unnecessary trailing space")), + ( + re.compile( + r'.*<(applet|base|body|button|embed|form|head|html|iframe|img|input|link|object|picture|script|source|style|svg|video).*', + re.IGNORECASE, + ), + _("Forbidden HTML tags"), + ), + ( + re.compile(r'''.*\s+src=["']javascript:.*'''), + _("Javascript in HTML src attributes"), + ), ], } -locale_pattern = re.compile(r'^[a-z]{2,3}(-[A-Z][A-Z])?$') +locale_pattern = re.compile(r"[a-z]{2,3}(-([A-Z][a-zA-Z]+|\d+|[a-z]+))*") def check_regexes(app): @@ -215,8 +249,7 @@ def get_lastbuild(builds): def check_update_check_data_url(app): - """UpdateCheckData must have a valid HTTPS URL to protect checkupdates runs - """ + """UpdateCheckData must have a valid HTTPS URL to protect checkupdates runs""" if app.UpdateCheckData and app.UpdateCheckMode == 'HTTP': urlcode, codeex, urlver, verex = app.UpdateCheckData.split('|') for url in (urlcode, urlver): @@ -229,33 +262,40 @@ def check_update_check_data_url(app): def check_vercode_operation(app): - if app.VercodeOperation and not common.VERCODE_OPERATION_RE.match(app.VercodeOperation): + if app.VercodeOperation and not common.VERCODE_OPERATION_RE.match( + app.VercodeOperation + ): yield _('Invalid VercodeOperation: {field}').format(field=app.VercodeOperation) def check_ucm_tags(app): lastbuild = get_lastbuild(app.get('Builds', [])) - if (lastbuild is not None - and lastbuild.commit - and app.UpdateCheckMode == 'RepoManifest' - and not lastbuild.commit.startswith('unknown') - and lastbuild.versionCode == app.CurrentVersionCode - and not lastbuild.forcevercode - and any(s in lastbuild.commit for s in '.,_-/')): - yield _("Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'")\ - .format(commit=lastbuild.commit, ucm=app.UpdateCheckMode) + if ( + lastbuild is not None + and lastbuild.commit + and app.UpdateCheckMode == 'RepoManifest' + and not lastbuild.commit.startswith('unknown') + and lastbuild.versionCode == app.CurrentVersionCode + and not lastbuild.forcevercode + and any(s in lastbuild.commit for s in '.,_-/') + ): + yield _( + "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" + ).format(commit=lastbuild.commit, ucm=app.UpdateCheckMode) def check_char_limits(app): limits = config['char_limits'] if len(app.Summary) > limits['summary']: - yield _("Summary of length {length} is over the {limit} char limit")\ - .format(length=len(app.Summary), limit=limits['summary']) + yield _("Summary of length {length} is over the {limit} char limit").format( + length=len(app.Summary), limit=limits['summary'] + ) if len(app.Description) > limits['description']: - yield _("Description of length {length} is over the {limit} char limit")\ - .format(length=len(app.Description), limit=limits['description']) + yield _("Description of length {length} is over the {limit} char limit").format( + length=len(app.Description), limit=limits['description'] + ) def check_old_links(app): @@ -272,8 +312,9 @@ def check_old_links(app): for f in ['WebSite', 'SourceCode', 'IssueTracker', 'Changelog']: v = app.get(f) if any(s in v for s in old_sites): - yield _("App is in '{repo}' but has a link to {url}")\ - .format(repo=app.Repo, url=v) + yield _("App is in '{repo}' but has a link to {url}").format( + repo=app.Repo, url=v + ) def check_useless_fields(app): @@ -286,8 +327,14 @@ filling_ucms = re.compile(r'^(Tags.*|RepoManifest.*)') def check_checkupdates_ran(app): if filling_ucms.match(app.UpdateCheckMode): - if not app.AutoName and not app.CurrentVersion and app.CurrentVersionCode == '0': - yield _("UpdateCheckMode is set but it looks like checkupdates hasn't been run yet") + if ( + not app.AutoName + and not app.CurrentVersion + and app.CurrentVersionCode == '0' + ): + yield _( + "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" + ) def check_empty_fields(app): @@ -295,25 +342,27 @@ def check_empty_fields(app): yield _("Categories are not set") -all_categories = set([ - "Connectivity", - "Development", - "Games", - "Graphics", - "Internet", - "Money", - "Multimedia", - "Navigation", - "Phone & SMS", - "Reading", - "Science & Education", - "Security", - "Sports & Health", - "System", - "Theming", - "Time", - "Writing", -]) +all_categories = set( + [ + "Connectivity", + "Development", + "Games", + "Graphics", + "Internet", + "Money", + "Multimedia", + "Navigation", + "Phone & SMS", + "Reading", + "Science & Education", + "Security", + "Sports & Health", + "System", + "Theming", + "Time", + "Writing", + ] +) def check_categories(app): @@ -376,7 +425,9 @@ def check_bulleted_lists(app): if line[0] == lchar and line[1] == ' ': lcount += 1 if lcount > 2 and lchar not in validchars: - yield _("Description has a list (%s) but it isn't bulleted (*) nor numbered (#)") % lchar + yield _( + "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" + ) % lchar break else: lchar = line[0] @@ -389,50 +440,61 @@ def check_builds(app): for build in app.get('Builds', []): if build.disable: if build.disable.startswith('Generated by import.py'): - yield _("Build generated by `fdroid import` - remove disable line once ready") + yield _( + "Build generated by `fdroid import` - remove disable line once ready" + ) continue for s in ['master', 'origin', 'HEAD', 'default', 'trunk']: if build.commit and build.commit.startswith(s): - yield _("Branch '{branch}' used as commit in build '{versionName}'")\ - .format(branch=s, versionName=build.versionName) + yield _( + "Branch '{branch}' used as commit in build '{versionName}'" + ).format(branch=s, versionName=build.versionName) for srclib in build.srclibs: if '@' in srclib: ref = srclib.split('@')[1].split('/')[0] if ref.startswith(s): - yield _("Branch '{branch}' used as commit in srclib '{srclib}'")\ - .format(branch=s, srclib=srclib) + yield _( + "Branch '{branch}' used as commit in srclib '{srclib}'" + ).format(branch=s, srclib=srclib) else: - yield _('srclibs missing name and/or @') + ' (srclibs: ' + srclib + ')' + yield _( + 'srclibs missing name and/or @' + ) + ' (srclibs: ' + srclib + ')' for key in build.keys(): if key not in supported_flags: yield _('%s is not an accepted build field') % key def check_files_dir(app): - dir_path = os.path.join('metadata', app.id) - if not os.path.isdir(dir_path): + dir_path = Path('metadata') / app.id + if not dir_path.is_dir(): return files = set() - for name in os.listdir(dir_path): - path = os.path.join(dir_path, name) - if not (os.path.isfile(path) or name == 'signatures' or locale_pattern.match(name)): + for path in dir_path.iterdir(): + name = path.name + if not ( + path.is_file() or name == 'signatures' or locale_pattern.fullmatch(name) + ): yield _("Found non-file at %s") % path continue files.add(name) - used = {'signatures', } + used = { + 'signatures', + } for build in app.get('Builds', []): for fname in build.patch: if fname not in files: - yield _("Unknown file '{filename}' in build '{versionName}'")\ - .format(filename=fname, versionName=build.versionName) + yield _("Unknown file '{filename}' in build '{versionName}'").format( + filename=fname, versionName=build.versionName + ) else: used.add(fname) for name in files.difference(used): - if locale_pattern.match(name): + if locale_pattern.fullmatch(name): continue - yield _("Unused file at %s") % os.path.join(dir_path, name) + yield _("Unused file at %s") % (dir_path / name) def check_format(app): @@ -446,41 +508,49 @@ def check_license_tag(app): return if app.License not in config['lint_licenses']: if config['lint_licenses'] == APPROVED_LICENSES: - yield _('Unexpected license tag "{}"! Only use FSF or OSI ' - 'approved tags from https://spdx.org/license-list') \ - .format(app.License) + yield _( + 'Unexpected license tag "{}"! Only use FSF or OSI ' + 'approved tags from https://spdx.org/license-list' + ).format(app.License) else: - yield _('Unexpected license tag "{}"! Only use license tags ' - 'configured in your config file').format(app.License) + yield _( + 'Unexpected license tag "{}"! Only use license tags ' + 'configured in your config file' + ).format(app.License) def check_extlib_dir(apps): - dir_path = os.path.join('build', 'extlib') - unused_extlib_files = set() - for root, dirs, files in os.walk(dir_path): - for name in files: - unused_extlib_files.add(os.path.join(root, name)[len(dir_path) + 1:]) + dir_path = Path('build/extlib') + extlib_files = set() + for path in dir_path.glob('**/*'): + if path.is_file(): + extlib_files.add(path.relative_to(dir_path)) used = set() for app in apps: for build in app.get('Builds', []): for path in build.extlibs: - if path not in unused_extlib_files: - yield _("{appid}: Unknown extlib {path} in build '{versionName}'")\ - .format(appid=app.id, path=path, versionName=build.versionName) + if path not in extlib_files: + yield _( + "{appid}: Unknown extlib {path} in build '{versionName}'" + ).format(appid=app.id, path=path, versionName=build.versionName) else: used.add(path) - for path in unused_extlib_files.difference(used): - if any(path.endswith(s) for s in [ - '.gitignore', - 'source.txt', 'origin.txt', 'md5.txt', - 'LICENSE', 'LICENSE.txt', - 'COPYING', 'COPYING.txt', - 'NOTICE', 'NOTICE.txt', - ]): - continue - yield _("Unused extlib at %s") % os.path.join(dir_path, path) + for path in extlib_files.difference(used): + if path.name not in [ + '.gitignore', + 'source.txt', + 'origin.txt', + 'md5.txt', + 'LICENSE', + 'LICENSE.txt', + 'COPYING', + 'COPYING.txt', + 'NOTICE', + 'NOTICE.txt', + ]: + yield _("Unused extlib at %s") % (dir_path / path) def check_app_field_types(app): @@ -493,39 +563,69 @@ def check_app_field_types(app): continue elif field == 'Builds': if not isinstance(v, list): - yield(_("{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!") - .format(appid=app.id, field=field, - type='list', fieldtype=v.__class__.__name__)) + yield ( + _( + "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" + ).format( + appid=app.id, + field=field, + type='list', + fieldtype=v.__class__.__name__, + ) + ) elif t == metadata.TYPE_LIST and not isinstance(v, list): - yield(_("{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'") - .format(appid=app.id, field=field, - type='list', fieldtype=v.__class__.__name__)) + yield ( + _( + "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" + ).format( + appid=app.id, + field=field, + type='list', + fieldtype=v.__class__.__name__, + ) + ) elif t == metadata.TYPE_STRING and not type(v) in (str, bool, dict): - yield(_("{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!") - .format(appid=app.id, field=field, - type='str', fieldtype=v.__class__.__name__)) + yield ( + _( + "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" + ).format( + appid=app.id, + field=field, + type='str', + fieldtype=v.__class__.__name__, + ) + ) def check_for_unsupported_metadata_files(basedir=""): """Checks whether any non-metadata files are in metadata/""" - + basedir = Path(basedir) global config + if not (basedir / 'metadata').exists(): + return False return_value = False - for f in glob.glob(basedir + 'metadata/*') + glob.glob(basedir + 'metadata/.*'): - if os.path.isdir(f): - if not os.path.exists(f + '.yml'): + for f in (basedir / 'metadata').iterdir(): + if f.is_dir(): + if not Path(str(f) + '.yml').exists(): print(_('"%s/" has no matching metadata file!') % f) return_value = True - elif f.endswith('.yml'): - packageName = os.path.splitext(os.path.basename(f))[0] + elif f.suffix == '.yml': + packageName = f.stem if not common.is_valid_package_name(packageName): - print('"' + packageName + '" is an invalid package name!\n' - + 'https://developer.android.com/studio/build/application-id') + print( + '"' + + packageName + + '" is an invalid package name!\n' + + 'https://developer.android.com/studio/build/application-id' + ) return_value = True else: - print(_('"{path}" is not a supported file format (use: metadata/*.yml)') - .format(path=f.replace(basedir, ''))) + print( + _( + '"{path}" is not a supported file format (use: metadata/*.yml)' + ).format(path=f.relative_to(basedir)) + ) return_value = True return return_value @@ -556,8 +656,11 @@ def check_current_version_code(app): if active_builds == 0: return # all builds are disabled if cv is not None and int(cv) < min_versionCode: - yield(_('CurrentVersionCode {cv} is less than oldest build entry {versionCode}') - .format(cv=cv, versionCode=min_versionCode)) + yield ( + _( + 'CurrentVersionCode {cv} is less than oldest build entry {versionCode}' + ).format(cv=cv, versionCode=min_versionCode) + ) def main(): @@ -567,12 +670,25 @@ def main(): # Parse command line... parser = ArgumentParser() common.setup_global_opts(parser) - parser.add_argument("-f", "--format", action="store_true", default=False, - help=_("Also warn about formatting issues, like rewritemeta -l")) - parser.add_argument('--force-yamllint', action="store_true", default=False, - help=_("When linting the entire repository yamllint is disabled by default. " - "This option forces yamllint regardless.")) - parser.add_argument("appid", nargs='*', help=_("application ID of file to operate on")) + parser.add_argument( + "-f", + "--format", + action="store_true", + default=False, + help=_("Also warn about formatting issues, like rewritemeta -l"), + ) + parser.add_argument( + '--force-yamllint', + action="store_true", + default=False, + help=_( + "When linting the entire repository yamllint is disabled by default. " + "This option forces yamllint regardless." + ), + ) + parser.add_argument( + "appid", nargs='*', help=_("application ID of file to operate on") + ) metadata.add_metadata_arguments(parser) options = parser.parse_args() metadata.warnings_action = options.W @@ -586,7 +702,7 @@ def main(): anywarns = check_for_unsupported_metadata_files() apps_check_funcs = [] - if len(options.appid) == 0: + if not options.appid: # otherwise it finds tons of unused extlibs apps_check_funcs.append(check_extlib_dir) for check_func in apps_check_funcs: @@ -600,29 +716,37 @@ def main(): if options.force_yamllint: import yamllint # throw error if it is not installed + yamllint # make pyflakes ignore this # only run yamllint when linting individual apps. - if len(options.appid) > 0 or options.force_yamllint: + if options.appid or options.force_yamllint: # run yamllint on app metadata - ymlpath = os.path.join('metadata', appid + '.yml') - if os.path.isfile(ymlpath): + ymlpath = Path('metadata') / (appid + '.yml') + if ymlpath.is_file(): yamllintresult = common.run_yamllint(ymlpath) - if yamllintresult != '': + if yamllintresult: print(yamllintresult) # run yamllint on srclib metadata srclibs = set() for build in app.get('Builds', []): for srclib in build.srclibs: - srclibs.add(srclib) + name, _ref, _number, _subdir = common.parse_srclib_spec(srclib) + srclibs.add(name + '.yml') for srclib in srclibs: - name, ref, number, subdir = common.parse_srclib_spec(srclib) - srclibpath = os.path.join('srclibs', name + '.yml') - if os.path.isfile(srclibpath): + srclibpath = Path('srclibs') / srclib + if srclibpath.is_file(): + if platform.system() == 'Windows': + # Handle symlink on Windows + symlink = srclibpath.read_text() + if symlink in srclibs: + continue + elif (srclibpath.parent / symlink).is_file(): + srclibpath = srclibpath.parent / symlink yamllintresult = common.run_yamllint(srclibpath) - if yamllintresult != '': + if yamllintresult: print(yamllintresult) app_check_funcs = [ diff --git a/tests/lint.TestCase b/tests/lint.TestCase index 49ba9b6f..3cf6b857 100755 --- a/tests/lint.TestCase +++ b/tests/lint.TestCase @@ -2,7 +2,6 @@ # http://www.drdobbs.com/testing/unit-testing-with-python/240165163 -import inspect import logging import optparse import os @@ -10,13 +9,12 @@ import shutil import sys import tempfile import unittest +from pathlib import Path -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) +localmodule = Path(__file__).resolve().parent.parent +print('localmodule: ' + str(localmodule)) if localmodule not in sys.path: - sys.path.insert(0, localmodule) + sys.path.insert(0, str(localmodule)) import fdroidserver.common import fdroidserver.lint @@ -27,26 +25,34 @@ class LintTest(unittest.TestCase): '''fdroidserver/lint.py''' def setUp(self): - logging.basicConfig(level=logging.INFO) - self.basedir = os.path.join(localmodule, 'tests') - self.tmpdir = os.path.abspath(os.path.join(self.basedir, '..', '.testfiles')) - if not os.path.exists(self.tmpdir): - os.makedirs(self.tmpdir) - os.chdir(self.basedir) + logging.basicConfig(level=logging.DEBUG) + self.basedir = localmodule / 'tests' + self.tmpdir = localmodule / '.testfiles' + self.tmpdir.mkdir(exist_ok=True) + # TODO: Python3.6: Accepts a path-like object. + os.chdir(str(self.basedir)) def test_check_for_unsupported_metadata_files(self): self.assertTrue(fdroidserver.lint.check_for_unsupported_metadata_files()) - tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, - dir=self.tmpdir) - self.assertFalse(fdroidserver.lint.check_for_unsupported_metadata_files(tmptestsdir + '/')) - shutil.copytree(os.path.join(localmodule, 'tests', 'metadata'), - os.path.join(tmptestsdir, 'metadata'), - ignore=shutil.ignore_patterns('apk', 'dump', '*.json')) - self.assertFalse(fdroidserver.lint.check_for_unsupported_metadata_files(tmptestsdir + '/')) - with open(os.path.join(tmptestsdir, 'metadata', 'org.adaway.json'), 'w') as fp: - fp.write('placeholder') - self.assertTrue(fdroidserver.lint.check_for_unsupported_metadata_files(tmptestsdir + '/')) + with tempfile.TemporaryDirectory(dir=str(self.tmpdir)) as testdir: + testdir = Path(testdir) + self.assertFalse( + fdroidserver.lint.check_for_unsupported_metadata_files(testdir) + ) + # TODO: Python3.6: Accepts a path-like object. + shutil.copytree( + str(self.basedir / 'metadata'), + str(testdir / 'metadata'), + ignore=shutil.ignore_patterns('apk', 'dump', '*.json'), + ) + self.assertFalse( + fdroidserver.lint.check_for_unsupported_metadata_files(testdir) + ) + (testdir / 'metadata/org.adaway.json').write_text('placeholder') + self.assertTrue( + fdroidserver.lint.check_for_unsupported_metadata_files(testdir) + ) def test_forbidden_html_tags(self): config = dict() @@ -130,7 +136,9 @@ class LintTest(unittest.TestCase): fields = { 'AntiFeatures': { 'good': [ - ['KnownVuln', ], + [ + 'KnownVuln', + ], ['NonFreeNet', 'KnownVuln'], ], 'bad': [ @@ -140,7 +148,9 @@ class LintTest(unittest.TestCase): }, 'Categories': { 'good': [ - ['Sports & Health', ], + [ + 'Sports & Health', + ], ['Multimedia', 'Graphics'], ], 'bad': [ @@ -154,7 +164,9 @@ class LintTest(unittest.TestCase): ], 'bad': [ [], - ['nope', ], + [ + 'nope', + ], 29, ], }, @@ -320,8 +332,6 @@ class LintTest(unittest.TestCase): if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - parser = optparse.OptionParser() parser.add_option( "-v", From 69a0a7da393920df0a5829d8afe5193afeb63dd9 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 9 Jun 2021 08:19:53 +0200 Subject: [PATCH 0292/2116] [checkupdates] UpdateCheckData warn if file was not found Instead of throwing an exception. --- fdroidserver/checkupdates.py | 20 ++++++++++++++------ tests/checkupdates.TestCase | 5 ++++- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index cc844ea1..f6e70aae 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -162,17 +162,25 @@ def check_tags(app, pattern): if app.UpdateCheckData: filecode, codeex, filever, verex = app.UpdateCheckData.split('|') vercode = None - if filecode: - filecontent = (build_dir / filecode).read_text() + filecode = build_dir / filecode + if not filecode.is_file(): + logging.debug("UpdateCheckData file {0} not found in tag {1}".format(filecode, tag)) + continue - m = re.search(codeex, filecontent) - if m: - vercode = m.group(1).strip() + filecontent = filecode.read_text() + + m = re.search(codeex, filecontent) + if m: + vercode = m.group(1).strip() version = "??" if filever: if filever != '.': - filecontent = (build_dir / filever).read_text() + filever = build_dir / filever + if filever.is_file(): + filecontent = filever.read_text() + else: + logging.debug("UpdateCheckData file {0} not found in tag {1}".format(filever, tag)) m = re.search(verex, filecontent) if m: diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index d8cd1f64..5c5380db 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -212,8 +212,11 @@ class CheckupdatesTest(unittest.TestCase): vcs.latesttags.return_value = ['1.1.8', '1.1.9'] with mock.patch( 'pathlib.Path.read_text', lambda a: 'v1.1.9\nc10109' - ) as _ignored, mock.patch('fdroidserver.common.getvcs', return_value=vcs): + ) as _ignored, mock.patch.object( + Path, 'is_file' + ) as mock_path, mock.patch('fdroidserver.common.getvcs', return_value=vcs): _ignored # silence the linters + mock_path.is_file.return_falue = True vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) self.assertEqual(vername, '1.1.9') self.assertEqual(vercode, '10109') From bcd3e8961422985d692e947bf9285c40a1de7875 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 8 Jun 2021 17:15:06 +0200 Subject: [PATCH 0293/2116] gitlab-ci: fix whitespace --- .gitlab-ci.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 149b34f9..3a004d07 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ variables: pip: pip3 --timeout 100 --retries 10 -# speed up git checkout phase + # speed up git checkout phase GIT_DEPTH: 1 @@ -133,7 +133,7 @@ ubuntu_bionic_pip: - deactivate - tar tzf dist/fdroidserver-*.tar.gz | grep locale/de/LC_MESSAGES/fdroidserver.mo # back to bare machine to act as user's install machine - - $pip install --upgrade pip setuptools wheel # make this go away: "error: invalid command 'bdist_wheel'" + - $pip install --upgrade pip setuptools wheel # make this go away: "error: invalid command 'bdist_wheel'" - $pip install dist/fdroidserver-*.tar.gz - tar xzf dist/fdroidserver-*.tar.gz - cd fdroidserver-* @@ -360,7 +360,7 @@ plugin_fetchsrclibs: - . env/bin/activate - export PATH="$CI_PROJECT_DIR:$PATH" - export PYTHONPATH="$CI_PROJECT_DIR/examples" - - $pip install wheel # to make this go away: "error: invalid command 'bdist_wheel'" + - $pip install wheel # to make this go away: "error: invalid command 'bdist_wheel'" - $pip install -e . - fdroid | grep fetchsrclibs @@ -421,20 +421,21 @@ Build documentation: - pip install -e .[docs] - cd docs - sphinx-apidoc -o ./source ../fdroidserver -M -e - - sphinx-autogen -o generated source/*.rst + - sphinx-autogen -o generated source/*.rst - make html artifacts: paths: - docs/build/html/ + pages: image: alpine:latest stage: deploy script: - - cp docs/build/html public -r # GL Pages needs the files in a directory named "public" + - cp docs/build/html public -r # GL Pages needs the files in a directory named "public" artifacts: paths: - public needs: ["Build documentation"] rules: - - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' # only publish pages on default (master) branch \ No newline at end of file + - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' # only publish pages on default (master) branch From ac86a2af891984b4b48d8ecbe567649561d32d59 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 9 Jun 2021 10:40:52 +0200 Subject: [PATCH 0294/2116] gitlab-ci: use mypy from Debian/bullseye to prevent random breakage mypy 0.901 was released and everything broke: https://gitlab.com/linsui/fdroidserver/-/jobs/1330206567 My point is to reduce the number of false job fails like this one. We have a lot of checkers running, I really think they need to prove they are adding value before we invest any time maintaining them. mypy is still "wait and see" in terms of the adding any value. !951 --- .gitlab-ci.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3a004d07..b3f4dad5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -202,9 +202,16 @@ lint_format_safety_bandit_checks: lint_mypy: - image: python:3.9-buster + image: debian:bullseye + <<: *apt-template script: - - pip install mypy + - sed -i '/pyjks/d' setup.py # TODO get from backports once available + # use Debian packages to avoid building C/rust sources + - apt-get install + mypy + python3-cryptography + python3-pip + python3-wheel - pip install -e .[test] # exclude vendored file - mypy --exclude fdroidserver/apksigcopier.py From bf9cbc87a925847a4ef8da7f0574c49c8273611f Mon Sep 17 00:00:00 2001 From: linsui Date: Wed, 9 Jun 2021 13:28:37 +0800 Subject: [PATCH 0295/2116] use .as_posix() --- fdroidserver/import.py | 4 ++-- fdroidserver/metadata.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fdroidserver/import.py b/fdroidserver/import.py index b86d99d6..081ade9f 100644 --- a/fdroidserver/import.py +++ b/fdroidserver/import.py @@ -25,7 +25,7 @@ import sys import yaml from argparse import ArgumentParser import logging -from pathlib import Path, PurePosixPath +from pathlib import Path try: from yaml import CSafeLoader as SafeLoader @@ -192,7 +192,7 @@ def main(): build.subdir = options.subdir build.gradle = ['yes'] elif subdir: - build.subdir = str(PurePosixPath(subdir)) + build.subdir = subdir.as_posix() build.gradle = ['yes'] if options.license: diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 947a119e..b3dc1fb2 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -19,7 +19,7 @@ # along with this program. If not, see . import git -from pathlib import Path, PurePosixPath +from pathlib import Path import platform import re import logging @@ -734,7 +734,7 @@ def parse_metadata(metadatapath): """ metadatapath = Path(metadatapath) app = App() - app.metadatapath = str(PurePosixPath(metadatapath)) + app.metadatapath = metadatapath.as_posix() name = metadatapath.stem if name != '.fdroid': app.id = name From a9a336a12bb56a9b9b55af5bb6440607d410f4ef Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 9 Jun 2021 10:34:21 +0200 Subject: [PATCH 0296/2116] Don't allow '_' in first place of version code Fixes a regression of 2cb0ff45. Example: versionCode project.versionCode_plus https://github.com/anthonycr/Lightning-Browser/blob/931b0a3087f320d2ce0cc2c8b5007a0b80ac387a/app/build.gradle#L38 --- fdroidserver/common.py | 2 +- tests/common.TestCase | 13 +++++++++++++ .../com.kunzisoft.testcase/build.gradle | 9 +++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index a832a7de..661775a0 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1579,7 +1579,7 @@ def remove_debuggable_flags(root_dir): os.path.join(root, 'AndroidManifest.xml')) -vcsearch_g = re.compile(r'''\b[Vv]ersionCode\s*=?\s*["'(]*([0-9_]+)["')]*''').search +vcsearch_g = re.compile(r'''\b[Vv]ersionCode\s*=?\s*["'(]*([0-9][0-9_]*)["')]*''').search vnsearch_g = re.compile(r'''\b[Vv]ersionName\s*=?\s*\(?(["'])((?:(?=(\\?))\3.)*?)\1''').search vnssearch_g = re.compile(r'''\b[Vv]ersionNameSuffix\s*=?\s*(["'])((?:(?=(\\?))\3.)*?)\1''').search psearch_g = re.compile(r'''\b(packageName|applicationId)\s*=*\s*["']([^"']+)["']''').search diff --git a/tests/common.TestCase b/tests/common.TestCase index 2da0ecfa..1f79483e 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1222,6 +1222,19 @@ class CommonTest(unittest.TestCase): self.assertEqual(('20180430-underscore', '2018_04_30', 'com.kunzisoft.fdroidtest.applicationidsuffix.underscore'), fdroidserver.common.parse_androidmanifests(paths, app)) + app = fdroidserver.metadata.App() + build = fdroidserver.metadata.Build() + build.gradle = ['underscore_first'] + app['Builds'] = [build] + app.id = 'com.kunzisoft.fdroidtest.applicationidsuffix.underscore_first' + paths = [ + os.path.join('source-files', 'com.kunzisoft.testcase', 'build.gradle'), + ] + for path in paths: + self.assertTrue(os.path.isfile(path)) + self.assertEqual(('1.0', '1', 'com.kunzisoft.fdroidtest.applicationidsuffix.underscore_first'), + fdroidserver.common.parse_androidmanifests(paths, app)) + def test_get_all_gradle_and_manifests(self): """Test whether the function works with relative and absolute paths""" a = fdroidserver.common.get_all_gradle_and_manifests(Path('source-files/cn.wildfirechat.chat')) diff --git a/tests/source-files/com.kunzisoft.testcase/build.gradle b/tests/source-files/com.kunzisoft.testcase/build.gradle index 2753d058..13cc4bc2 100644 --- a/tests/source-files/com.kunzisoft.testcase/build.gradle +++ b/tests/source-files/com.kunzisoft.testcase/build.gradle @@ -59,6 +59,15 @@ android { // Version code : 2018_04_30 // Version name : 20180430-underscore } + underscore_first { + applicationIdSuffix = ".underscore_first" + versionCode _04_30 + buildConfigField "boolean", "FULL_VERSION", "true" + buildConfigField "boolean", "CLOSED_STORE", "true" + // ApplicationId : com.kunzisoft.fdroidtest.applicationidsuffix.underscore_first + // Version code : 1 + // Version name : 1.0 + } } } From bdec7d86524cfef73a58b8b2c1eb930269a4bdbb Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 9 Jun 2021 10:08:33 +0200 Subject: [PATCH 0297/2116] [checkupdates] UpdateCheckData use tag by default Use the tag as version, if no version file was specified: UpdateCheckData: app/build.gradle|versionCode\s(\d+)|| Extract version from tag, if a regex was specified: UpdateCheckData: app/build.gradle|versionCode\s(\d+)||Android-([\d.]+) Use the tag for both if no file was specified: UpdateCheckData: |\+(\d+)||Android-([\d.]+) --- fdroidserver/checkupdates.py | 40 +++++++++++++++------------ tests/checkupdates.TestCase | 52 +++++++++++++++++++++++++++++++++--- 2 files changed, 71 insertions(+), 21 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index f6e70aae..91d36fec 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -161,19 +161,22 @@ def check_tags(app, pattern): if app.UpdateCheckData: filecode, codeex, filever, verex = app.UpdateCheckData.split('|') - vercode = None - filecode = build_dir / filecode - if not filecode.is_file(): - logging.debug("UpdateCheckData file {0} not found in tag {1}".format(filecode, tag)) - continue - filecontent = filecode.read_text() + if filecode: + filecode = build_dir / filecode + if not filecode.is_file(): + logging.debug("UpdateCheckData file {0} not found in tag {1}".format(filecode, tag)) + continue + filecontent = filecode.read_text() + else: + filecontent = tag m = re.search(codeex, filecontent) - if m: - vercode = m.group(1).strip() + if not m: + continue + + vercode = m.group(1).strip() - version = "??" if filever: if filever != '.': filever = build_dir / filever @@ -181,19 +184,22 @@ def check_tags(app, pattern): filecontent = filever.read_text() else: logging.debug("UpdateCheckData file {0} not found in tag {1}".format(filever, tag)) + else: + filecontent = tag + version = tag + if verex: m = re.search(verex, filecontent) if m: version = m.group(1) - if vercode: - logging.debug("UpdateCheckData found version {0} ({1})" - .format(version, vercode)) - i_vercode = common.version_code_string_to_int(vercode) - if i_vercode > common.version_code_string_to_int(hcode): - htag = tag - hcode = str(i_vercode) - hver = version + logging.debug("UpdateCheckData found version {0} ({1})" + .format(version, vercode)) + i_vercode = common.version_code_string_to_int(vercode) + if i_vercode > common.version_code_string_to_int(hcode): + htag = tag + hcode = str(i_vercode) + hver = version else: for subdir in possible_subdirs(app): root_dir = build_dir / subdir diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index 5c5380db..da49deaf 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -158,7 +158,7 @@ class CheckupdatesTest(unittest.TestCase): app.metadatapath = 'metadata/' + app.id + '.yml' app.CurrentVersionCode = 10108 app.UpdateCheckMode = 'HTTP' - app.UpdateCheckData = 'https://a.net/b.txt|c(.*)|https://d.net/e.txt|v(.*)' + app.UpdateCheckData = r'https://a.net/b.txt|c(.*)|https://d.net/e.txt|v(.*)' app.UpdateCheckIgnore = 'beta' respmock = mock.Mock() @@ -187,7 +187,7 @@ class CheckupdatesTest(unittest.TestCase): app.metadatapath = 'metadata/' + app.id + '.yml' app.CurrentVersionCode = 10108 app.UpdateCheckMode = 'HTTP' - app.UpdateCheckData = 'https://a.net/b.txt|c(.*)|https://d.net/e.txt|v(.*)' + app.UpdateCheckData = r'https://a.net/b.txt|c(.*)|https://d.net/e.txt|v(.*)' app.UpdateCheckIgnore = 'beta' respmock = mock.Mock() @@ -206,10 +206,10 @@ class CheckupdatesTest(unittest.TestCase): app.RepoType = 'git' app.CurrentVersionCode = 10108 app.UpdateCheckMode = 'Tags' - app.UpdateCheckData = 'b.txt|c(.*)|e.txt|v(.*)' + app.UpdateCheckData = r'b.txt|c(.*)|e.txt|v(.*)' vcs = mock.Mock() - vcs.latesttags.return_value = ['1.1.8', '1.1.9'] + vcs.latesttags.return_value = ['1.1.9', '1.1.8'] with mock.patch( 'pathlib.Path.read_text', lambda a: 'v1.1.9\nc10109' ) as _ignored, mock.patch.object( @@ -221,6 +221,50 @@ class CheckupdatesTest(unittest.TestCase): self.assertEqual(vername, '1.1.9') self.assertEqual(vercode, '10109') + app.UpdateCheckData = r'b.txt|c(.*)|.|v(.*)' + with mock.patch( + 'pathlib.Path.read_text', lambda a: 'v1.1.0\nc10109' + ) as _ignored, mock.patch.object( + Path, 'is_file' + ) as mock_path, mock.patch('fdroidserver.common.getvcs', return_value=vcs): + _ignored # silence the linters + mock_path.is_file.return_falue = True + vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) + self.assertEqual(vername, '1.1.0') + self.assertEqual(vercode, '10109') + + app.UpdateCheckData = r'b.txt|c(.*)||' + with mock.patch( + 'pathlib.Path.read_text', lambda a: 'v1.1.9\nc10109' + ) as _ignored, mock.patch.object( + Path, 'is_file' + ) as mock_path, mock.patch('fdroidserver.common.getvcs', return_value=vcs): + _ignored # silence the linters + mock_path.is_file.return_falue = True + vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) + self.assertEqual(vername, '1.1.9') + self.assertEqual(vercode, '10109') + + vcs.latesttags.return_value = ['Android-1.1.0', '1.1.8'] + app.UpdateCheckData = r'b.txt|c(.*)||Android-([\d.]+)' + with mock.patch( + 'pathlib.Path.read_text', lambda a: 'v1.1.9\nc10109' + ) as _ignored, mock.patch.object( + Path, 'is_file' + ) as mock_path, mock.patch('fdroidserver.common.getvcs', return_value=vcs): + _ignored # silence the linters + mock_path.is_file.return_falue = True + vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) + self.assertEqual(vername, '1.1.0') + self.assertEqual(vercode, '10109') + + app.UpdateCheckData = r'|\+(\d+)||Android-([\d.]+)' + vcs.latesttags.return_value = ['Android-1.1.0+1'] + with mock.patch('fdroidserver.common.getvcs', return_value=vcs): + vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) + self.assertEqual(vername, '1.1.0') + self.assertEqual(vercode, '1') + if __name__ == "__main__": parser = optparse.OptionParser() From 46ebdd701a0091158ac6549e94991f3a7a219c32 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 9 Jun 2021 17:48:24 +0200 Subject: [PATCH 0298/2116] [lint] convert path to Path first Fixes a lot of undetected extlibs. Regression of 6bafb036. --- fdroidserver/lint.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 04b9fc0b..964275dd 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -530,6 +530,7 @@ def check_extlib_dir(apps): for app in apps: for build in app.get('Builds', []): for path in build.extlibs: + path = Path(path) if path not in extlib_files: yield _( "{appid}: Unknown extlib {path} in build '{versionName}'" From 0fefecde1e3b3e9287fd43ee1b82e1e2f57bac56 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sat, 12 Jun 2021 23:59:18 +0200 Subject: [PATCH 0299/2116] Fix matching substring flavour detection com.github.jameshnsears.quoteunquote defines flavours 'fdroid' and 'fdroidS'. The old code used flavour in line, which matches both and the wrong one was selected. Closes: #912 --- MANIFEST.in | 1 + fdroidserver/common.py | 3 +- tests/common.TestCase | 13 + .../build.gradle | 232 ++++++++++++++++++ 4 files changed, 248 insertions(+), 1 deletion(-) create mode 100644 tests/source-files/com.github.jameshnsears.quoteunquote/build.gradle diff --git a/MANIFEST.in b/MANIFEST.in index 7f478ba8..19d3c346 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -715,6 +715,7 @@ include tests/source-files/com.anpmech.launcher/app/build.gradle include tests/source-files/com.anpmech.launcher/app/src/main/AndroidManifest.xml include tests/source-files/com.anpmech.launcher/build.gradle include tests/source-files/com.anpmech.launcher/settings.gradle +include tests/source-files/com.github.jameshnsears.quoteunquote/build.gradle include tests/source-files/com.integreight.onesheeld/build.gradle include tests/source-files/com.integreight.onesheeld/gradle/wrapper/gradle-wrapper.properties include tests/source-files/com.integreight.onesheeld/localeapi/build.gradle diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 661775a0..1c2ddf1d 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1683,7 +1683,8 @@ def parse_androidmanifests(paths, app): if '}' in line: inside_required_flavour -= 1 else: - if flavour and (flavour in line): + if flavour and re.match( + r'.*[\'"\s]{flavour}[\'"\s].*'.format(flavour=flavour), line): inside_required_flavour = 1 if '{' in line: diff --git a/tests/common.TestCase b/tests/common.TestCase index 1f79483e..0f567ad3 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1235,6 +1235,19 @@ class CommonTest(unittest.TestCase): self.assertEqual(('1.0', '1', 'com.kunzisoft.fdroidtest.applicationidsuffix.underscore_first'), fdroidserver.common.parse_androidmanifests(paths, app)) + app = fdroidserver.metadata.App() + build = fdroidserver.metadata.Build() + build.gradle = ['fdroid'] + app['Builds'] = [build] + app.id = 'com.github.jameshnsears.quoteunquote' + paths = [ + os.path.join('source-files', 'com.github.jameshnsears.quoteunquote', 'build.gradle'), + ] + for path in paths: + self.assertTrue(os.path.isfile(path)) + self.assertEqual(('2.5.2-fdroid', '73', 'com.github.jameshnsears.quoteunquote'), + fdroidserver.common.parse_androidmanifests(paths, app)) + def test_get_all_gradle_and_manifests(self): """Test whether the function works with relative and absolute paths""" a = fdroidserver.common.get_all_gradle_and_manifests(Path('source-files/cn.wildfirechat.chat')) diff --git a/tests/source-files/com.github.jameshnsears.quoteunquote/build.gradle b/tests/source-files/com.github.jameshnsears.quoteunquote/build.gradle new file mode 100644 index 00000000..bb55589e --- /dev/null +++ b/tests/source-files/com.github.jameshnsears.quoteunquote/build.gradle @@ -0,0 +1,232 @@ +apply plugin: 'com.android.application' +apply plugin: 'com.google.gms.google-services' +apply plugin: 'kotlin-android' + +apply from: '../jacoco.gradle' +apply from: '../ktlint.gradle' +apply from: '../detekt.gradle' +apply from: '../checkstyle.gradle' +apply from: '../sonarcube.gradle' + +def localPropertiesFile = rootProject.file("local.properties") +def localProperties = new Properties() + +if (!localPropertiesFile.exists()) { + localProperties.setProperty("RELEASE_STORE_PASSWORD", "") + localProperties.setProperty("RELEASE_KEY_PASSWORD", "") + localProperties.setProperty("RELEASE_KEY_ALIAS", "") + localProperties.setProperty("RELEASE_STORE_FILE", "keystore.jks") + Writer writer = new FileWriter(localPropertiesFile, false) + localProperties.store(writer, "empty, as creating the file is done manually via gpg") + writer.close() + + file(project(':app').projectDir.path + "/keystore.jks").text = "" +} + +localProperties.load(new FileInputStream(localPropertiesFile)) + +android { + compileSdkVersion 30 + // compileSdkVersion "android-S" + + signingConfigs { + googleplay { + keyAlias localProperties['RELEASE_KEY_ALIAS'] + keyPassword localProperties['RELEASE_KEY_PASSWORD'] + storeFile file(localProperties['RELEASE_STORE_FILE']) + storePassword localProperties['RELEASE_STORE_PASSWORD'] + } + } + + defaultConfig { + minSdkVersion 24 + targetSdkVersion 30 + // minSdkVersion "S" + // targetSdkVersion "S" + + applicationId "com.github.jameshnsears.quoteunquote" + + versionCode 73 + versionName "2.5.2" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + testInstrumentationRunnerArguments clearPackageData: 'true' + + javaCompileOptions { + annotationProcessorOptions { + arguments += ["room.schemaLocation": + "$projectDir/schemas".toString()] + } + } + } + + packagingOptions { + exclude "**/module-info.class" + exclude 'LICENSE' + exclude 'README.md' + } + + lintOptions { + abortOnError true + warningsAsErrors false + checkAllWarnings = true + xmlReport false + htmlReport true + } + + buildTypes { + def gitHash = { -> + def stdout = new ByteArrayOutputStream() + exec { + commandLine 'git', 'rev-parse', '--short=8', 'HEAD' + standardOutput = stdout + } + return stdout.toString().trim() + } + + release { + minifyEnabled true + shrinkResources true + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + + buildConfigField("String", "GIT_HASH", "\"$gitHash\"") + buildConfigField("String", "DATABASE_QUOTATIONS", "\"quotations.db.prod\"") + } + debug { + testCoverageEnabled true + buildConfigField("String", "GIT_HASH", "\"$gitHash\"") + buildConfigField("String", "DATABASE_QUOTATIONS", "\"quotations.db.dev\"") + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + + flavorDimensions 'Version' + productFlavors { + 'googleplay' { + dimension 'Version' + versionNameSuffix "-googleplay" + signingConfig signingConfigs.googleplay + } + 'googleplayS' { + dimension 'Version' + versionNameSuffix "-googleplay-S" + signingConfig signingConfigs.googleplay + } + 'fdroid' { + dimension 'Version' + versionNameSuffix "-fdroid" + isDefault true + } + 'fdroidS' { + dimension 'Version' + versionNameSuffix "-fdroid-S" + } + } + + sourceSets { + androidTest { + assets.srcDirs += files("$projectDir/schemas".toString()) + } + fdroid { + assets.srcDirs = ['src/main/assets'] + java.srcDirs = ['src/main/java', 'src/fdroid/java'] + } + fdroidS { + assets.srcDirs = ['src/main/assets'] + java.srcDirs = ['src/main/java', 'src/fdroid/java'] + } + googleplay { + assets.srcDirs = ['src/main/assets'] + java.srcDirs = ['src/main/java'] + } + googleplayS { + assets.srcDirs = ['src/main/assets'] + java.srcDirs = ['src/main/java'] + } + } + + testOptions { + // will make tests run very slowly on the emulator/device + affects coverage # + // execution 'ANDROIDX_TEST_ORCHESTRATOR' + + animationsDisabled true + unitTests { + includeAndroidResources = true + returnDefaultValues = true + all { + maxHeapSize = "1024m" + jacoco { + includeNoLocationClasses = true + excludes = ['jdk.internal.*'] + } + } + } + } + + buildFeatures { + viewBinding = true + } +} + +dependencies { + androidTestImplementation "androidx.arch.core:core-testing:2.1.0" + androidTestImplementation 'androidx.room:room-testing:2.3.0' + androidTestImplementation 'androidx.test:core:1.4.0-beta01' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test:rules:1.3.0' + androidTestImplementation 'androidx.test:runner:1.3.0' + androidTestImplementation 'io.mockk:mockk-android:1.11.0' + + annotationProcessor 'androidx.room:room-compiler:2.3.0' + + debugImplementation 'androidx.fragment:fragment-testing:1.3.4' + debugImplementation 'androidx.test:core:1.4.0-beta01' + debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7' + + implementation 'androidx.activity:activity:1.2.3' + implementation 'androidx.fragment:fragment:1.3.4' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'androidx.core:core-ktx:1.5.0' + fdroidSImplementation 'androidx.core:core-ktx:1.6.0-beta02' + googleplaySImplementation 'androidx.core:core-ktx:1.6.0-beta02' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.lifecycle:lifecycle-common-java8:2.3.1' + implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1' + implementation 'androidx.multidex:multidex:2.0.1' + implementation 'androidx.room:room-guava:2.3.0' + implementation 'androidx.room:room-runtime:2.3.0' + implementation 'androidx.room:room-rxjava2:2.3.0' + implementation 'com.google.android.material:material:1.3.0' + implementation 'com.jakewharton.rxbinding2:rxbinding:2.2.0' + implementation 'com.jakewharton.timber:timber:4.7.1' + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' + implementation 'io.reactivex.rxjava2:rxjava:2.2.21' + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.10' + + implementation project(path: ':cloudLib') + implementation project(path: ':utilsLib') + + testImplementation 'androidx.arch.core:core-testing:2.1.0' + testImplementation 'androidx.room:room-testing:2.3.0' + testImplementation 'androidx.test:core-ktx:1.3.0' + testImplementation 'androidx.test.ext:junit:1.1.2' + testImplementation 'androidx.test:rules:1.3.0' + testImplementation 'com.google.guava:guava:30.1.1-jre' + testImplementation 'io.mockk:mockk:1.11.0' + testImplementation 'junit:junit:4.13.2' + testImplementation 'org.robolectric:robolectric:4.5.1' +} + +repositories { + mavenCentral() +} From 1e6de7eb349b9e44ad019cbfc12224f1a3a41255 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sun, 13 Jun 2021 00:49:41 +0200 Subject: [PATCH 0300/2116] Support '{' in extra line in parse_androidmanifests If the flavour group starts in a separate line don't count it as a second group. Closes: #899 --- MANIFEST.in | 1 + fdroidserver/common.py | 13 +++- tests/common.TestCase | 13 ++++ .../com.jens.automation2/build.gradle | 77 +++++++++++++++++++ 4 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 tests/source-files/com.jens.automation2/build.gradle diff --git a/MANIFEST.in b/MANIFEST.in index 19d3c346..2d4fe372 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -729,6 +729,7 @@ include tests/source-files/com.integreight.onesheeld/pullToRefreshlibrary/src/ma include tests/source-files/com.integreight.onesheeld/quickReturnHeader/build.gradle include tests/source-files/com.integreight.onesheeld/quickReturnHeader/src/main/AndroidManifest.xml include tests/source-files/com.integreight.onesheeld/settings.gradle +include tests/source-files/com.jens.automation2/build.gradle include tests/source-files/com.kunzisoft.testcase/build.gradle include tests/source-files/com.nextcloud.client/build.gradle include tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android/en-US/full_description.txt diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 1c2ddf1d..55595798 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1649,7 +1649,7 @@ def parse_androidmanifests(paths, app): temp_version_name = matches.group(2) if inside_flavour_group > 0: - if inside_required_flavour > 0: + if inside_required_flavour > 1: matches = psearch_g(line) if matches: s = matches.group(2) @@ -1678,14 +1678,19 @@ def parse_androidmanifests(paths, app): if matches: vercode = matches.group(1) + if inside_required_flavour > 0: if '{' in line: inside_required_flavour += 1 if '}' in line: inside_required_flavour -= 1 + if inside_required_flavour == 1: + inside_required_flavour -= 1 else: - if flavour and re.match( - r'.*[\'"\s]{flavour}[\'"\s].*'.format(flavour=flavour), line): - inside_required_flavour = 1 + if flavour: + if re.match(r'.*[\'"\s]{flavour}[\'"\s].*\{{.*'.format(flavour=flavour), line): + inside_required_flavour = 2 + elif re.match(r'.*[\'"\s]{flavour}[\'"\s].*'.format(flavour=flavour), line): + inside_required_flavour = 1 if '{' in line: inside_flavour_group += 1 diff --git a/tests/common.TestCase b/tests/common.TestCase index 0f567ad3..38e7dd9b 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1248,6 +1248,19 @@ class CommonTest(unittest.TestCase): self.assertEqual(('2.5.2-fdroid', '73', 'com.github.jameshnsears.quoteunquote'), fdroidserver.common.parse_androidmanifests(paths, app)) + app = fdroidserver.metadata.App() + build = fdroidserver.metadata.Build() + build.gradle = ['fdroidFlavor'] + app['Builds'] = [build] + app.id = 'com.jens.automation2' + paths = [ + os.path.join('source-files', 'com.jens.automation2', 'build.gradle'), + ] + for path in paths: + self.assertTrue(os.path.isfile(path)) + self.assertEqual(('1.6.34-fdroid', '105', 'com.jens.automation2'), + fdroidserver.common.parse_androidmanifests(paths, app)) + def test_get_all_gradle_and_manifests(self): """Test whether the function works with relative and absolute paths""" a = fdroidserver.common.get_all_gradle_and_manifests(Path('source-files/cn.wildfirechat.chat')) diff --git a/tests/source-files/com.jens.automation2/build.gradle b/tests/source-files/com.jens.automation2/build.gradle new file mode 100644 index 00000000..1ed6b0cf --- /dev/null +++ b/tests/source-files/com.jens.automation2/build.gradle @@ -0,0 +1,77 @@ +plugins { + id 'com.android.application' +} + +android { + compileSdkVersion 29 + + defaultConfig { + applicationId "com.jens.automation2" + minSdkVersion 16 + compileSdkVersion 29 + buildToolsVersion '29.0.2' + useLibrary 'org.apache.http.legacy' + versionCode 105 + versionName "1.6.34" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + lintOptions { + checkReleaseBuilds false + abortOnError false + } + + flavorDimensions "version" + + productFlavors + { + googlePlayFlavor + { + dimension "version" +// applicationIdSuffix ".googlePlay" + versionNameSuffix "-googlePlay" + targetSdkVersion 29 + } + + fdroidFlavor + { + dimension "version" +// applicationIdSuffix ".fdroid" + versionNameSuffix "-fdroid" + targetSdkVersion 28 + } + + apkFlavor + { + dimension "version" +// applicationIdSuffix ".apk" + versionNameSuffix "-apk" + targetSdkVersion 28 + } + } +} + +dependencies { + + + + implementation 'com.linkedin.dexmaker:dexmaker:2.25.0' + + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'com.google.android.material:material:1.3.0' + testImplementation 'junit:junit:4.+' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' +} From 2de3431296a1249737b78ee19fcb3811325c3023 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 14 Jun 2021 18:56:59 +0000 Subject: [PATCH 0301/2116] Use git tag in latesttags --- fdroidserver/common.py | 11 ++--------- tests/common.TestCase | 13 +++++++++++++ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 55595798..cc29fa27 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1171,18 +1171,11 @@ class vcs_git(vcs): p = FDroidPopen(['git', 'tag'], cwd=self.local, output=False) return p.output.splitlines() - tag_format = re.compile(r'tag: ([^),]*)') - def latesttags(self): self.checkrepo() - p = FDroidPopen(['git', 'log', '--tags', - '--simplify-by-decoration', '--pretty=format:%d'], + p = FDroidPopen(['git', 'tag', '--sort=-authordate'], cwd=self.local, output=False) - tags = [] - for line in p.output.splitlines(): - for tag in self.tag_format.findall(line): - tags.append(tag) - return tags + return p.output.splitlines() class vcs_gitsvn(vcs): diff --git a/tests/common.TestCase b/tests/common.TestCase index 38e7dd9b..b9c70959 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -2059,6 +2059,19 @@ class CommonTest(unittest.TestCase): {'r10e': r10e, 'r17c': ndk_bundle, 'r21e': r21e}, config['ndk_paths'] ) + def test_vcs_git_latesttags(self): + vcs = fdroidserver.common.vcs_git(None, None) + popenmock = mock.Mock() + popenmock.output = "8.9.5\n8.9.4\n8.6.3\n8,9,3" + with mock.patch( + 'fdroidserver.common.FDroidPopen', lambda a, **b: popenmock + ) as _ignored, mock.patch( + 'fdroidserver.common.vcs_git.checkrepo' + ) as _ignored: + _ignored # silence the linters + tags = vcs.latesttags() + self.assertEqual(tags, ['8.9.5', '8.9.4', '8.6.3', '8,9,3']) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 4e97b58d8c3b8b01c289dd890fc1bc2c9327d2b1 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 15 Jun 2021 08:39:59 +0200 Subject: [PATCH 0302/2116] latesttags revert to git log and fix comma handling 2de34312 tried to fix the comma handling by relying on git tag --sort. This did not work out so this reverts to the method used before. --- fdroidserver/common.py | 26 ++++++++++++++++++++++++-- tests/common.TestCase | 13 +++++++++++-- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index cc29fa27..32cb1859 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1171,11 +1171,33 @@ class vcs_git(vcs): p = FDroidPopen(['git', 'tag'], cwd=self.local, output=False) return p.output.splitlines() + tag_format = re.compile(r'tag: ([^) ]*)') + def latesttags(self): + """Returns a list of latest tags + the definition is a little blurry here, Android does not care for the + version name of an app as normally used as the tag name so versions do + not need to follow strverscmp() or similar. Also they can be rather + arbitrary so git tag --sort=-version:refname does not work. On the other side + sorting them by creation date, i.e. git tag --sort=-authordate does not + work either as there are a lot of repos where older tags were created + later. + + So git log preserves the graph order and only sorts by date afterwards. + This results in tags of beta versions being sorted earlier then the + latest tag as long as they are part of the graph below the latest tag + or are created earlier. + """ self.checkrepo() - p = FDroidPopen(['git', 'tag', '--sort=-authordate'], + p = FDroidPopen(['git', 'log', '--tags', + '--simplify-by-decoration', '--pretty=format:%d'], cwd=self.local, output=False) - return p.output.splitlines() + tags = [] + for line in p.output.splitlines(): + for entry in line.split(', '): + for tag in self.tag_format.findall(entry): + tags.append(tag) + return tags class vcs_gitsvn(vcs): diff --git a/tests/common.TestCase b/tests/common.TestCase index b9c70959..dbded144 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -2062,7 +2062,15 @@ class CommonTest(unittest.TestCase): def test_vcs_git_latesttags(self): vcs = fdroidserver.common.vcs_git(None, None) popenmock = mock.Mock() - popenmock.output = "8.9.5\n8.9.4\n8.6.3\n8,9,3" + popenmock.output = """ + (HEAD, tag: 8.9.5, origin/master, origin/HEAD, master) + (tag: 8.9.4) + (tag: 8.9.3, tag: 8,9,3) + (tag: 8.9.3b) + (tag: awesome_release) + (origin/feature/cast) + (tag: 8.6.3) +""" with mock.patch( 'fdroidserver.common.FDroidPopen', lambda a, **b: popenmock ) as _ignored, mock.patch( @@ -2070,7 +2078,8 @@ class CommonTest(unittest.TestCase): ) as _ignored: _ignored # silence the linters tags = vcs.latesttags() - self.assertEqual(tags, ['8.9.5', '8.9.4', '8.6.3', '8,9,3']) + self.assertEqual(tags, ['8.9.5', '8.9.4', '8.9.3', '8,9,3', + '8.9.3b', 'awesome_release', '8.6.3']) if __name__ == "__main__": From da820ace2e98053c996eb24f6d5b3d45055f1068 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Tue, 15 Jun 2021 06:54:38 +0000 Subject: [PATCH 0303/2116] gradle v7.1 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index ea4272f0..fc5dc1ad 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -166,6 +166,7 @@ get_sha() { '7.0') echo 'eb8b89184261025b0430f5b2233701ff1377f96da1ef5e278af6ae8bac5cc305' ;; '7.0.1') echo 'dccda8aa069563c8ba2f6cdfd0777df0e34a5b4d15138ca8b9757e94f4e8a8cb' ;; '7.0.2') echo '0e46229820205440b48a5501122002842b82886e76af35f0f3a069243dca4b3c' ;; + '7.1') echo '2debee19271e1b82c6e41137d78e44e6e841035230a1a169ca47fd3fb09ed87b' ;; *) exit 1 esac } @@ -186,7 +187,7 @@ d_plugin_k=(4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 d_plugin_v=(6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(7.0.2 7.0.1 7.0 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(7.1 7.0.2 7.0.1 7.0 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From cebdcdd67c4157cf53dcb1e053d2436a644c0966 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 15 Jun 2021 19:18:19 +0200 Subject: [PATCH 0304/2116] [checkupdates] UpdateCheckData tag for verocode if no regex Use the tag as the version code if no regex was specified. This allows: UpdateCheckData: '|||' meaning the tag should be used for version code and name. --- fdroidserver/checkupdates.py | 10 ++++++---- tests/checkupdates.TestCase | 7 +++++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 91d36fec..330746ca 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -171,11 +171,13 @@ def check_tags(app, pattern): else: filecontent = tag - m = re.search(codeex, filecontent) - if not m: - continue + vercode = tag + if codeex: + m = re.search(codeex, filecontent) + if not m: + continue - vercode = m.group(1).strip() + vercode = m.group(1).strip() if filever: if filever != '.': diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index da49deaf..a44ea0a4 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -265,6 +265,13 @@ class CheckupdatesTest(unittest.TestCase): self.assertEqual(vername, '1.1.0') self.assertEqual(vercode, '1') + app.UpdateCheckData = '|||' + vcs.latesttags.return_value = ['2'] + with mock.patch('fdroidserver.common.getvcs', return_value=vcs): + vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) + self.assertEqual(vername, '2') + self.assertEqual(vercode, '2') + if __name__ == "__main__": parser = optparse.OptionParser() From 3809b4d42430b1efe7c77b6c72e5a95ee4ffacef Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sat, 12 Jun 2021 09:09:55 +0200 Subject: [PATCH 0305/2116] Ignore git submodule failure in gotorevisionx gotorevisionx tries to clean up the git repo before checking out a new revision. In b848b99ba this was changed to reset and clean any submodule as well. In case upstream has a broken submodule configuration this could fail and we can't checkout the new revision. As we are doing a reset and clean after checking out the new revision anyhow, this change ignores submodule errors before the checkout and only makes sure that the main repo is reset and clean. This broke checkupdates for apps where old versions had broken submodules. It checkout out the old version and got stuck, not able to checkout any other version. --- fdroidserver/common.py | 6 ++++++ tests/run-tests | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 32cb1859..dad4c16d 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1103,12 +1103,18 @@ class vcs_git(vcs): # Discard any working tree changes p = FDroidPopen(['git', 'submodule', 'foreach', '--recursive', 'git', 'reset', '--hard'], cwd=self.local, output=False) + if p.returncode != 0: + logging.debug("Git submodule reset failed (ignored) {output}".format(output=p.output)) + p = FDroidPopen(['git', 'reset', '--hard'], cwd=self.local, output=False) if p.returncode != 0: raise VCSException(_("Git reset failed"), p.output) # Remove untracked files now, in case they're tracked in the target # revision (it happens!) p = FDroidPopen(['git', 'submodule', 'foreach', '--recursive', 'git', 'clean', '-dffx'], cwd=self.local, output=False) + if p.returncode != 0: + logging.debug("Git submodule cleanup failed (ignored) {output}".format(output=p.output)) + p = FDroidPopen(['git', 'clean', '-dffx'], cwd=self.local, output=False) if p.returncode != 0: raise VCSException(_("Git clean failed"), p.output) if not self.refreshed: diff --git a/tests/run-tests b/tests/run-tests index ccf1bd40..42374742 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -1295,6 +1295,44 @@ else echo "WARNING: wget not installed, skipping" fi +#------------------------------------------------------------------------------# +echo_header "Test recovering from from broken git submodules" + +if have_git_2_3; then + ROOT=$(create_test_dir) + cd "$ROOT" + mkdir foo bar + cd foo + git init + echo a > a + git add a + GIT_COMMITTER_NAME="Test" GIT_COMMITTER_EMAIL="no@mail" git commit -m "a" --author "Author " + + cd ../bar + git init + git submodule add "file://$(pwd)/../foo" baz + rm .gitmodules + GIT_COMMITTER_NAME="Test" GIT_COMMITTER_EMAIL="no@mail" git commit -am "a" --author "Author " + rm -rf baz + git checkout baz + git tag 2 + + cd .. + mkdir repo + mkdir metadata + echo "RepoType: git" >> metadata/fake.yml + echo "Repo: file://$(pwd)/bar" >> metadata/fake.yml + echo "AutoUpdateMode: Version" >> metadata/fake.yml + echo "UpdateCheckMode: Tags" >> metadata/fake.yml + echo "UpdateCheckData: '|||'" >> metadata/fake.yml + echo "CurrentVersion: 1" >> metadata/fake.yml + echo "CurrentVersionCode: 1" >> metadata/fake.yml + + $fdroid checkupdates --allow-dirty + grep "CurrentVersionCode: 2" metadata/fake.yml +fi + + #------------------------------------------------------------------------------# # remove this to prevent git conflicts and complaining From cd405cc93e904f91b614313791a0d9802cbe8d3c Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sat, 12 Jun 2021 15:02:58 +0200 Subject: [PATCH 0306/2116] Use hash of tag when adding new version Also extend getref with a refname parameter and implement it for vcs_git. --- fdroidserver/checkupdates.py | 6 ++++++ fdroidserver/common.py | 15 ++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 330746ca..5f1035a0 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -217,6 +217,12 @@ def check_tags(app, pattern): hver = version if hver: + try: + commit = vcs.getref(htag) + if commit: + return (hver, hcode, commit) + except VCSException: + pass return (hver, hcode, htag) return (None, "Couldn't find any version information", None) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index dad4c16d..09b66c44 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1026,7 +1026,7 @@ class vcs: """Get a list of all the known tags, sorted from newest to oldest""" raise VCSException('latesttags not supported for this vcs type') - def getref(self): + def getref(self, revname=None): """Get current commit reference (hash, revision, etc)""" raise VCSException('getref not supported for this vcs type') @@ -1205,6 +1205,15 @@ class vcs_git(vcs): tags.append(tag) return tags + def getref(self, revname='HEAD'): + self.checkrepo() + p = FDroidPopen(['git', 'rev-parse', '--verify', + '{revname}^{{commit}}'.format(revname=revname)], cwd=self.local, + output=False) + if p.returncode != 0: + return None + return p.output.strip() + class vcs_gitsvn(vcs): @@ -1366,9 +1375,9 @@ class vcs_gitsvn(vcs): if os.path.isdir(d): return os.listdir(d) - def getref(self): + def getref(self, revname='HEAD'): self.checkrepo() - p = FDroidPopen(['git', 'svn', 'find-rev', 'HEAD'], cwd=self.local, output=False) + p = FDroidPopen(['git', 'svn', 'find-rev', revname], cwd=self.local, output=False) if p.returncode != 0: return None return p.output.strip() From 39c55d799bd8fb2ba82e1d3206c1bd0714aa6d4d Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 15 Jun 2021 20:53:05 +0200 Subject: [PATCH 0307/2116] [checkupdates] Only update if version code is grater Don't change the current versions in case there is an error in the check_* methods or upstream screwed up. --- fdroidserver/checkupdates.py | 6 +++++- tests/checkupdates.TestCase | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 5f1035a0..566dde00 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -511,12 +511,16 @@ def checkupdates_app(app): logging.warning(logmsg) elif vercode == app.CurrentVersionCode: logging.info("...up to date") - else: + elif int(vercode) > int(app.CurrentVersionCode): logging.debug("...updating - old vercode={0}, new vercode={1}".format( app.CurrentVersionCode, vercode)) app.CurrentVersion = version app.CurrentVersionCode = str(int(vercode)) updating = True + else: + logging.info("Refusing to auto update, since the current version is newer") + logging.debug("...old vercode={0}, new vercode={1}".format( + app.CurrentVersionCode, vercode)) commitmsg = fetch_autoname(app, tag) diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index a44ea0a4..3610b930 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -60,6 +60,16 @@ class CheckupdatesTest(unittest.TestCase): self.assertEqual(build.versionName, '1.1.9') self.assertEqual(build.commit, '1.1.9') + with mock.patch( + 'fdroidserver.checkupdates.check_http', lambda app: ('1.7.9', 10107) + ): + with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): + with mock.patch('subprocess.call', lambda cmd: 0): + fdroidserver.checkupdates.checkupdates_app(app) + build = app['Builds'][-1] + self.assertEqual(build.versionName, '1.1.9') + self.assertEqual(build.commit, '1.1.9') + def test_autoupdatemode_suffix(self): fdroidserver.checkupdates.options = mock.Mock() fdroidserver.checkupdates.options.auto = 'bleh' From 7c831c11ddcd4b9c0d9468956f8c478336483ea3 Mon Sep 17 00:00:00 2001 From: linsui Date: Sun, 13 Jun 2021 15:18:58 +0800 Subject: [PATCH 0308/2116] NON_FREE_GRADLE_LINES: add com.android.billingclient --- fdroidserver/scanner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 24438340..57e30066 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -67,6 +67,7 @@ NON_FREE_GRADLE_LINES = { r'google.*admob', r'google.*play.*services', r'com.google.android.play:core.*', + r'com.android.billingclient', r'androidx.work:work-gcm', r'crittercism', r'heyzap', From 466c8a44d7364ffe17dcdb08ad325b230f8b30d2 Mon Sep 17 00:00:00 2001 From: linsui Date: Fri, 18 Jun 2021 12:11:39 +0800 Subject: [PATCH 0309/2116] add vscode settings --- .bandit | 3 +++ .gitlab-ci.yml | 7 +++---- .vscode/extensions.json | 5 +++++ .vscode/settings.json | 22 ++++++++++++++++++++++ mypy.ini | 4 +++- pyproject.toml | 2 ++ 6 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 .bandit create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 pyproject.toml diff --git a/.bandit b/.bandit new file mode 100644 index 00000000..cc5017da --- /dev/null +++ b/.bandit @@ -0,0 +1,3 @@ +[bandit] +skips: B110,B404,B408,B410,B603,B607 +targets: . diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b3f4dad5..8aaef2ed 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -181,9 +181,9 @@ lint_format_safety_bandit_checks: - function set_error() { export EXITVALUE=1; printf "\x1b[31mERROR `history|tail -2|head -1|cut -b 6-500`\x1b[0m\n"; } - ./hooks/pre-commit || set_error - bandit + -r -ii - -s B110,B404,B408,B410,B603,B607 - -r $CI_PROJECT_DIR fdroid + --ini .bandit || set_error - safety check --full-report || set_error - pylint --rcfile=.pylint-rcfile --output-format=colorized --reports=n @@ -213,8 +213,7 @@ lint_mypy: python3-pip python3-wheel - pip install -e .[test] - # exclude vendored file - - mypy --exclude fdroidserver/apksigcopier.py + - mypy fedora_latest: diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..f0fec078 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "ms-python.python", + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..6d3b59a0 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,22 @@ +{ + "python.formatting.blackArgs": [ + "--config pyproject.toml" + ], + "python.formatting.provider": "black", + "python.linting.banditEnabled": true, + "python.linting.banditArgs": [ + "-r", + "-ii", + "--ini .bandit", + ], + "python.linting.enabled": true, + "python.linting.mypyArgs": [ + "--config-file mypy.ini" + ], + "python.linting.mypyEnabled": true, + "python.linting.pycodestyleEnabled": true, + "python.linting.pylintArgs": [ + "--rcfile=.pylint-rcfile" + ], + "python.linting.pylintEnabled": true, +} diff --git a/mypy.ini b/mypy.ini index 0e5df9cf..30ab6eaa 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,5 +1,7 @@ [mypy] files = fdroidserver +# exclude vendored file +exclude = fdroidserver/apksigcopier.py # this is de-facto the linter setting for this file warn_unused_configs = True @@ -12,4 +14,4 @@ ignore_missing_imports = True # unfortunately both tools expect their ignore flag as a comment in the same line # [misc] is ignored for the "incompatible import" # [arg-type] is ignored because when there are missing envs, everything will crash, not just the types -disable_error_code = no-redef, misc, arg-type \ No newline at end of file +disable_error_code = no-redef, misc, arg-type diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..0097e9f6 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,2 @@ +[tool.black] +skip-string-normalization = true From 1abbc9732ee6f339926101047a63985f1d18c1b4 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 10 Jun 2021 15:47:33 +0200 Subject: [PATCH 0310/2116] metadata: add test_build_ndk_path --- tests/metadata.TestCase | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 297271ab..76094724 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -1084,6 +1084,32 @@ class MetadataTest(unittest.TestCase): }, ) + def test_build_ndk_path(self): + """""" + config = {'ndk_paths': {}, 'sdk_path': tempfile.mkdtemp(prefix='android-sdk-')} + fdroidserver.common.config = config + + build = fdroidserver.metadata.Build() + build.ndk = 'r10e' + self.assertEqual('', build.ndk_path()) + + correct = '/fake/path/ndk/r21b' + config['ndk_paths'] = {'r21b': correct} + self.assertEqual('', build.ndk_path()) + config['ndk_paths'] = {'r10e': correct} + self.assertEqual(correct, build.ndk_path()) + + r10e = '/fake/path/ndk/r10e' + r22b = '/fake/path/ndk/r22e' + config['ndk_paths'] = {'r10e': r10e, 'r22b': r22b} + self.assertEqual(r10e, build.ndk_path()) + + build.ndk = ['r10e', 'r22b'] + self.assertEqual(r10e, build.ndk_path()) + + build.ndk = ['r22b', 'r10e'] + self.assertEqual(r22b, build.ndk_path()) + if __name__ == "__main__": parser = optparse.OptionParser() From 4514983e58c6079e3c7f534d43fe22171bb4e402 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 14 Jun 2021 15:05:11 +0200 Subject: [PATCH 0311/2116] fix typo --- tests/build.TestCase | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/build.TestCase b/tests/build.TestCase index 33ad0f90..c1b16e6b 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -284,7 +284,7 @@ class BuildTest(unittest.TestCase): onserver=False, refresh=False, ) - # now run `fdroid buid --onserver` + # now run `fdroid build --onserver` self.assertTrue('r21e' not in config['ndk_paths']) fdroidserver.build.build_local( app, From c12007c2608b06de27a553592eab70ddf204864b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 25 Sep 2019 13:02:19 +0200 Subject: [PATCH 0312/2116] publish: use platform-neutral newlines --- fdroidserver/publish.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fdroidserver/publish.py b/fdroidserver/publish.py index 56b6016c..deb954ce 100644 --- a/fdroidserver/publish.py +++ b/fdroidserver/publish.py @@ -88,10 +88,10 @@ def read_fingerprints_from_keystore(): if p.returncode != 0: raise FDroidException('could not read keystore {}'.format(config['keystore'])) - realias = re.compile('Alias name: (?P.+)\n') - resha256 = re.compile(r'\s+SHA256: (?P[:0-9A-F]{95})\n') + realias = re.compile('Alias name: (?P.+)' + os.linesep) + resha256 = re.compile(r'\s+SHA256: (?P[:0-9A-F]{95})' + os.linesep) fps = {} - for block in p.output.split(('*' * 43) + '\n' + '*' * 43): + for block in p.output.split(('*' * 43) + os.linesep + '*' * 43): s_alias = realias.search(block) s_sha256 = resha256.search(block) if s_alias and s_sha256: From a6d35a7ee115cc92c4ed971ce1db1deaa9503532 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 25 Sep 2019 13:34:11 +0200 Subject: [PATCH 0313/2116] metadata: always open metadata files as UTF-8 Windows seems to require this, otherwise this happens: Traceback (most recent call last): File "tests/update.TestCase", line 737, in test_translate_per_build_anti_features apps = fdroidserver.metadata.read_metadata(xref=True) File "C:\Users\travis\build\fdroidtravis\fdroidserver\fdroidserver\metadata.py", line 813, in read_metadata app = parse_metadata(metadatapath, appid in check_vcs, refresh) File "C:\Users\travis\build\fdroidtravis\fdroidserver\fdroidserver\metadata.py", line 1023, in parse_metadata parse_yaml_metadata(mf, app) File "C:\Users\travis\build\fdroidtravis\fdroidserver\fdroidserver\metadata.py", line 1073, in parse_yaml_metadata yamldata = yaml.safe_load(mf) File "C:\python37\lib\site-packages\yaml\__init__.py", line 162, in safe_load return load(stream, SafeLoader) File "C:\python37\lib\site-packages\yaml\__init__.py", line 112, in load loader = Loader(stream) File "C:\python37\lib\site-packages\yaml\loader.py", line 34, in __init__ Reader.__init__(self, stream) File "C:\python37\lib\site-packages\yaml\reader.py", line 85, in __init__ self.determine_encoding() File "C:\python37\lib\site-packages\yaml\reader.py", line 124, in determine_encoding self.update_raw() File "C:\python37\lib\site-packages\yaml\reader.py", line 178, in update_raw data = self.stream.read(size) File "C:\python37\lib\encodings\cp1252.py", line 23, in decode return codecs.charmap_decode(input,self.errors,decoding_table)[0] UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 37: character maps to --- fdroidserver/common.py | 2 +- fdroidserver/metadata.py | 4 ++-- fdroidserver/rewritemeta.py | 2 +- tests/metadata.TestCase | 12 ++++++------ tests/rewritemeta.TestCase | 6 +++--- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 09b66c44..2392be9a 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1859,7 +1859,7 @@ def get_gradle_subdir(build_dir, paths): if not first_gradle_dir: first_gradle_dir = path.parent.relative_to(build_dir) if path.exists() and SETTINGS_GRADLE_REGEX.match(str(path.name)): - for m in GRADLE_SUBPROJECT_REGEX.finditer(path.read_text()): + for m in GRADLE_SUBPROJECT_REGEX.finditer(path.read_text(encoding='utf-8')): for f in (path.parent / m.group(1)).glob('build.gradle*'): with f.open() as fp: for line in fp.readlines(): diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index b3dc1fb2..59b15472 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -482,7 +482,7 @@ def parse_yaml_srclib(metadatapath): if type(data) is not dict: if platform.system() == 'Windows': # Handle symlink on Windows - symlink = metadatapath.parent / metadatapath.read_text() + symlink = metadatapath.parent / metadatapath.read_text(encoding='utf-8') if symlink.is_file(): with symlink.open("r", encoding="utf-8") as s: data = yaml.load(s, Loader=SafeLoader) @@ -740,7 +740,7 @@ def parse_metadata(metadatapath): app.id = name if metadatapath.suffix == '.yml': - with metadatapath.open('r') as mf: + with metadatapath.open('r', encoding='utf-8') as mf: parse_yaml_metadata(mf, app) else: _warn_or_exception(_('Unknown metadata format: {path} (use: *.yml)') diff --git a/fdroidserver/rewritemeta.py b/fdroidserver/rewritemeta.py index 172359b8..a6406cb9 100644 --- a/fdroidserver/rewritemeta.py +++ b/fdroidserver/rewritemeta.py @@ -36,7 +36,7 @@ def proper_format(app): s = io.StringIO() # TODO: currently reading entire file again, should reuse first # read in metadata.py - cur_content = Path(app.metadatapath).read_text() + cur_content = Path(app.metadatapath).read_text(encoding='utf-8') if Path(app.metadatapath).suffix == '.yml': metadata.write_yaml(s, app) content = s.getvalue() diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 76094724..07d8edcf 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -231,8 +231,8 @@ class MetadataTest(unittest.TestCase): self.maxDiff = None file_name = 'fake.ota.update.yml' self.assertEqual( - (testdir / file_name).read_text(), - (Path('metadata-rewrite-yml') / file_name).read_text(), + (testdir / file_name).read_text(encoding='utf-8'), + (Path('metadata-rewrite-yml') / file_name).read_text(encoding='utf-8'), ) def test_rewrite_yaml_fdroidclient(self): @@ -253,8 +253,8 @@ class MetadataTest(unittest.TestCase): self.maxDiff = None file_name = 'org.fdroid.fdroid.yml' self.assertEqual( - (testdir / file_name).read_text(), - (Path('metadata-rewrite-yml') / file_name).read_text(), + (testdir / file_name).read_text(encoding='utf-8'), + (Path('metadata-rewrite-yml') / file_name).read_text(encoding='utf-8'), ) def test_rewrite_yaml_special_build_params(self): @@ -274,8 +274,8 @@ class MetadataTest(unittest.TestCase): self.maxDiff = None file_name = 'app.with.special.build.params.yml' self.assertEqual( - (testdir / file_name).read_text(), - (Path('metadata-rewrite-yml') / file_name).read_text(), + (testdir / file_name).read_text(encoding='utf-8'), + (Path('metadata-rewrite-yml') / file_name).read_text(encoding='utf-8'), ) def test_post_parse_yaml_metadata(self): diff --git a/tests/rewritemeta.TestCase b/tests/rewritemeta.TestCase index 1271f9d8..309e2f45 100755 --- a/tests/rewritemeta.TestCase +++ b/tests/rewritemeta.TestCase @@ -48,7 +48,7 @@ class RewriteMetaTest(unittest.TestCase): rewritemeta.main() self.assertEqual( - Path('metadata/a.yml').read_text(), + Path('metadata/a.yml').read_text(encoding='utf-8'), textwrap.dedent( '''\ License: Unknown @@ -62,7 +62,7 @@ class RewriteMetaTest(unittest.TestCase): ) self.assertEqual( - Path('metadata/b.yml').read_text(), + Path('metadata/b.yml').read_text(encoding='utf-8'), textwrap.dedent( '''\ License: Unknown @@ -90,7 +90,7 @@ class RewriteMetaTest(unittest.TestCase): rewritemeta.main() self.assertEqual( - Path('metadata/a.yml').read_text(), 'AutoName: a' + Path('metadata/a.yml').read_text(encoding='utf-8'), 'AutoName: a' ) From 1e1f0db34739a69a1a8c5796d0b4a5815dddae02 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 25 Sep 2019 13:37:54 +0200 Subject: [PATCH 0314/2116] stats/known_apks.txt must be in UTF-8 format on all platforms --- fdroidserver/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 2392be9a..0e29814d 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2403,7 +2403,7 @@ class KnownApks: self.path = os.path.join('stats', 'known_apks.txt') self.apks = {} if os.path.isfile(self.path): - with open(self.path, 'r') as f: + with open(self.path, 'r', encoding='utf-8') as f: for line in f: t = line.rstrip().split(' ') if len(t) == 2: From 0c31c4a5ab0bfdcf158836cda724ccb2e09fddd0 Mon Sep 17 00:00:00 2001 From: Gerhard Olsson Date: Fri, 3 Jan 2020 01:24:26 +0100 Subject: [PATCH 0315/2116] win fixes --- fdroidserver/common.py | 5 ++++- tests/update.TestCase | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 0e29814d..236855b3 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -557,9 +557,12 @@ def find_sdk_tools_cmd(cmd): sdk_platform_tools = os.path.join(config['sdk_path'], 'platform-tools') if os.path.exists(sdk_platform_tools): tooldirs.append(sdk_platform_tools) - tooldirs.append('/usr/bin') + if os.path.exists('/usr/bin'): + tooldirs.append('/usr/bin') for d in tooldirs: path = os.path.join(d, cmd) + if not os.path.isfile(path): + path += '.exe' if os.path.isfile(path): if cmd == 'aapt': test_aapt_version(path) diff --git a/tests/update.TestCase b/tests/update.TestCase index 2d4fd6ca..04bf42ca 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -411,7 +411,7 @@ class UpdateTest(unittest.TestCase): def javagetsig(self, apkfile): getsig_dir = 'getsig' - if not os.path.exists(getsig_dir + "/getsig.class"): + if not os.path.exists(os.path.join(getsig_dir, "getsig.class")): logging.critical("getsig.class not found. To fix: cd '%s' && ./make.sh" % getsig_dir) sys.exit(1) # FDroidPopen needs some config to work From 48c43546294d4a88f23b19946cc6ee9e54c663f5 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 14 Jun 2021 15:38:37 +0200 Subject: [PATCH 0316/2116] always open Android source files as UTF-8 Android Studio recommends "you use UTF-8 encoding whenever possible", so this code assumes the files use UTF-8. UTF-8 is also the default encoding on GNU/Linux and macOS. https://sites.google.com/a/android.com/tools/knownissues/encoding Windows will probably default to UTF16, since that's the native encoding for files. So forcing things to use UTF-8 should help compatibility. --- fdroidserver/common.py | 8 ++++++-- fdroidserver/update.py | 2 +- tests/build.TestCase | 4 ++-- tests/common.TestCase | 24 +++++++++++++----------- tests/scanner.TestCase | 8 ++++---- 5 files changed, 26 insertions(+), 20 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 236855b3..16a0f413 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1633,6 +1633,10 @@ def parse_androidmanifests(paths, app): Extract some information from the AndroidManifest.xml at the given path. Returns (version, vercode, package), any or all of which might be None. All values returned are strings. + + Android Studio recommends "you use UTF-8 encoding whenever possible", so + this code assumes the files use UTF-8. + https://sites.google.com/a/android.com/tools/knownissues/encoding """ ignoreversions = app.UpdateCheckIgnore @@ -1663,7 +1667,7 @@ def parse_androidmanifests(paths, app): flavour = app['Builds'][-1].gradle[-1] if path.endswith('.gradle') or path.endswith('.gradle.kts'): - with open(path, 'r') as f: + with open(path, 'r', encoding='utf-8') as f: android_plugin_file = False inside_flavour_group = 0 inside_required_flavour = 0 @@ -1864,7 +1868,7 @@ def get_gradle_subdir(build_dir, paths): if path.exists() and SETTINGS_GRADLE_REGEX.match(str(path.name)): for m in GRADLE_SUBPROJECT_REGEX.finditer(path.read_text(encoding='utf-8')): for f in (path.parent / m.group(1)).glob('build.gradle*'): - with f.open() as fp: + with f.open(encoding='utf-8') as fp: for line in fp.readlines(): if ANDROID_PLUGIN_REGEX.match(line): return f.parent.relative_to(build_dir) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 1c3a1ed7..9e3df12a 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1021,7 +1021,7 @@ def copy_triple_t_store_metadata(apps): sg_list = glob.glob(os.path.join('build', packageName, 'settings.gradle*')) if sg_list: settings_gradle = sg_list[0] - with open(settings_gradle) as fp: + with open(settings_gradle, encoding='utf-8') as fp: data = fp.read() for matches in setting_gradle_pattern.findall(data): for m in matches: diff --git a/tests/build.TestCase b/tests/build.TestCase index c1b16e6b..7558237d 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -339,12 +339,12 @@ class BuildTest(unittest.TestCase): os.mkdir('build') os.mkdir('build/reports') - with open('build.gradle', 'w') as fp: + with open('build.gradle', 'w', encoding='utf-8') as fp: fp.write('// placeholder') os.mkdir('bin') os.mkdir('gen') - with open('build.xml', 'w') as fp: + with open('build.xml', 'w', encoding='utf-8') as fp: fp.write( textwrap.dedent( """ diff --git a/tests/common.TestCase b/tests/common.TestCase index dbded144..a9d215f4 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -315,14 +315,15 @@ class CommonTest(unittest.TestCase): fdroidserver.common.prepare_source(FakeVcs(), app, build, fdroidclient_testdir, fdroidclient_testdir, fdroidclient_testdir) - with open(os.path.join(fdroidclient_testdir, 'build.gradle'), 'r') as f: - filedata = f.read() + fdroidclient_testdir = Path(fdroidclient_testdir) + build_gradle = fdroidclient_testdir / 'build.gradle' + filedata = build_gradle.read_text(encoding='utf-8') self.assertIsNotNone( re.search(r"\s+compileSdkVersion %s\s+" % testint, filedata) ) - with open(os.path.join(fdroidclient_testdir, 'AndroidManifest.xml')) as f: - filedata = f.read() + androidmanifest_xml = fdroidclient_testdir / 'AndroidManifest.xml' + filedata = androidmanifest_xml.read_text(encoding='utf-8') self.assertIsNone(re.search('android:debuggable', filedata)) self.assertIsNotNone( re.search('android:versionName="%s"' % build.versionName, filedata) @@ -342,10 +343,10 @@ class CommonTest(unittest.TestCase): ) subdir = 'baz/bar' - subdir_path = os.path.join(app_build_dir, subdir) - os.makedirs(subdir_path) - with open(os.path.join(subdir_path, 'build.gradle'), 'w') as fp: - fp.write('// just a test placeholder') + subdir_path = Path(app_build_dir) / subdir + subdir_path.mkdir(parents=True, exist_ok=True) + build_gradle = subdir_path / 'build.gradle' + build_gradle.write_text('// just a test placeholder', encoding='utf-8') config = dict() fdroidserver.common.fill_config_defaults(config) @@ -921,7 +922,7 @@ class CommonTest(unittest.TestCase): self.assertNotEqual(0, len(files)) for f in files: appid, versionCode = os.path.splitext(os.path.basename(f))[0][12:].split('_') - with open(f) as fp: + with open(f, encoding='utf-8') as fp: m = fdroidserver.common.APK_ID_TRIPLET_REGEX.match(fp.read()) if m: self.assertEqual(appid, m.group(1)) @@ -962,6 +963,7 @@ class CommonTest(unittest.TestCase): def test_get_sdkversions_androguard(self): """This is a sanity test that androguard isn't broken""" + def get_minSdkVersion(apkfile): apk = fdroidserver.common._get_androguard_APK(apkfile) return fdroidserver.common.get_min_sdk_version(apk) @@ -1852,9 +1854,9 @@ class CommonTest(unittest.TestCase): self.assertEqual([], data['fdroiddata']['untrackedFiles']) dirtyfile = 'dirtyfile' - with open(dirtyfile, 'w') as fp: + with open(dirtyfile, 'w', encoding='utf-8') as fp: fp.write('this is just a test') - with open(file_in_git, 'a') as fp: + with open(file_in_git, 'a', encoding='utf-8') as fp: fp.write('\nappend some stuff') self.assertEqual([], data['fdroiddata']['modifiedFiles']) diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 428cca9c..3fd52694 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -76,7 +76,7 @@ class ScannerTest(unittest.TestCase): build = fdroidserver.metadata.Build() build.gradle = [flavor] regexs = fdroidserver.scanner.get_gradle_compile_commands(build) - with open(f) as fp: + with open(f, encoding='utf-8') as fp: for line in fp.readlines(): for regex in regexs: m = regex.match(line) @@ -93,7 +93,7 @@ class ScannerTest(unittest.TestCase): fdroidserver.scanner.config = None fdroidserver.scanner.options = mock.Mock() fdroidserver.scanner.options.json = True - with open('build.gradle', 'w') as fp: + with open('build.gradle', 'w', encoding='utf-8') as fp: fp.write( textwrap.dedent( """ @@ -233,7 +233,7 @@ class ScannerTest(unittest.TestCase): fp.write('placeholder') self.assertTrue(os.path.exists(f)) - with open('build.xml', 'w') as fp: + with open('build.xml', 'w', encoding='utf-8') as fp: fp.write( textwrap.dedent( """ @@ -288,7 +288,7 @@ class ScannerTest(unittest.TestCase): fdroidserver.scanner.options = mock.Mock() build = fdroidserver.metadata.Build() build.scandelete = ['build.gradle'] - with open('build.gradle', 'w') as fp: + with open('build.gradle', 'w', encoding='utf-8') as fp: fp.write( textwrap.dedent( """ From 1f5534d06088927f76141174cdcd2b78b281f68a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 14 Jun 2021 16:00:45 +0200 Subject: [PATCH 0317/2116] require config.yml use UTF-8 as encoding config.yml requires ASCII or UTF-8 encoding because this code does not auto-detect the file's encoding. That is left up to the YAML library. YAML allows ASCII, UTF-8, UTF-16, and UTF-32 encodings. Since it is a good idea to manage config.yml (WITHOUT PASSWORDS!) in git, it makes sense to use a globally standard encoding. --- fdroidserver/common.py | 8 +++++++- tests/common.TestCase | 28 ++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 16a0f413..423acc49 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -336,6 +336,12 @@ def read_config(opts=None): reading it. config.py is deprecated and supported for backwards compatibility. + config.yml requires ASCII or UTF-8 encoding because this code does + not auto-detect the file's encoding. That is left up to the YAML + library. YAML allows ASCII, UTF-8, UTF-16, and UTF-32 encodings. + Since it is a good idea to manage config.yml (WITHOUT PASSWORDS!) + in git, it makes sense to use a globally standard encoding. + """ global config, options @@ -354,7 +360,7 @@ def read_config(opts=None): if os.path.exists(config_file): logging.debug(_("Reading '{config_file}'").format(config_file=config_file)) - with open(config_file) as fp: + with open(config_file, encoding='utf-8') as fp: config = yaml.safe_load(fp) elif os.path.exists(old_config_file): logging.warning(_("""{oldfile} is deprecated, use {newfile}""") diff --git a/tests/common.TestCase b/tests/common.TestCase index a9d215f4..ad099352 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1687,6 +1687,34 @@ class CommonTest(unittest.TestCase): config = fdroidserver.common.read_config(fdroidserver.common.options) self.assertEqual('yml', config.get('apksigner')) + def test_with_config_yml_utf8(self): + """Make sure it is possible to use config.yml in UTF-8 encoding.""" + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.chdir(testdir) + teststr = '/πÇÇ现代通用字-български-عربي1/ö/yml' + with open('config.yml', 'w', encoding='utf-8') as fp: + fp.write('apksigner: ' + teststr) + self.assertTrue(os.path.exists('config.yml')) + self.assertFalse(os.path.exists('config.py')) + config = fdroidserver.common.read_config(fdroidserver.common.options) + self.assertEqual(teststr, config.get('apksigner')) + + def test_with_config_yml_utf8_as_ascii(self): + """Make sure it is possible to use config.yml Unicode encoded as ASCII.""" + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.chdir(testdir) + teststr = '/πÇÇ现代通用字-български-عربي1/ö/yml' + with open('config.yml', 'w') as fp: + yaml.dump({'apksigner': teststr}, fp) + self.assertTrue(os.path.exists('config.yml')) + self.assertFalse(os.path.exists('config.py')) + config = fdroidserver.common.read_config(fdroidserver.common.options) + self.assertEqual(teststr, config.get('apksigner')) + def test_with_config_yml_with_env_var(self): """Make sure it is possible to use config.yml alone.""" testdir = tempfile.mkdtemp( From 36849b2fba7205e0eb6a0646504cc48550f090e5 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 14 Jun 2021 20:53:14 +0200 Subject: [PATCH 0318/2116] skip tests on Windows that need bash --- tests/common.TestCase | 1 + tests/init.TestCase | 1 + 2 files changed, 2 insertions(+) diff --git a/tests/common.TestCase b/tests/common.TestCase index ad099352..2619d4b7 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -332,6 +332,7 @@ class CommonTest(unittest.TestCase): re.search('android:versionCode="%s"' % build.versionCode, filedata) ) + @unittest.skipIf(os.name == 'nt', "`fdroid build` assumes POSIX scripting") def test_prepare_sources_with_prebuild_subdir(self): testdir = tempfile.mkdtemp( prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir diff --git a/tests/init.TestCase b/tests/init.TestCase index da59e1a0..f19c59e5 100755 --- a/tests/init.TestCase +++ b/tests/init.TestCase @@ -54,6 +54,7 @@ class InitTest(unittest.TestCase): config = fdroidserver.common.read_config(fdroidserver.common.options) self.assertIsNone(config.get('keypass')) + @unittest.skipIf(os.name == 'nt', "calling main() like this hangs on Windows") def test_main_in_empty_dir(self): """Test that `fdroid init` will find apksigner and add it to the config""" testdir = tempfile.mkdtemp( From 1300771badb41ada76db5d145f186d41cbe09383 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 18 Jun 2021 10:24:44 +0200 Subject: [PATCH 0319/2116] 'import resource' only where its used, Windows does not have it --- fdroidserver/build.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 7c4d900b..89097166 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -23,7 +23,6 @@ import glob import subprocess import posixpath import re -import resource import sys import tarfile import threading @@ -1026,17 +1025,22 @@ def main(): raise FDroidException("No apps to process.") # make sure enough open files are allowed to process everything - soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE) - if len(apps) > soft: - try: - soft = len(apps) * 2 - if soft > hard: - soft = hard - resource.setrlimit(resource.RLIMIT_NOFILE, (soft, hard)) - logging.debug(_('Set open file limit to {integer}') - .format(integer=soft)) - except (OSError, ValueError) as e: - logging.warning(_('Setting open file limit failed: ') + str(e)) + try: + import resource # not available on Windows + + soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE) + if len(apps) > soft: + try: + soft = len(apps) * 2 + if soft > hard: + soft = hard + resource.setrlimit(resource.RLIMIT_NOFILE, (soft, hard)) + logging.debug(_('Set open file limit to {integer}') + .format(integer=soft)) + except (OSError, ValueError) as e: + logging.warning(_('Setting open file limit failed: ') + str(e)) + except ImportError: + pass if options.latest: for app in apps.values(): From fc989d94b3a5e0a3830cecd8d75860f6c5b8ca7b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 8 Jun 2021 22:04:21 +0200 Subject: [PATCH 0320/2116] gitlab-ci: add Windows job --- .gitlab-ci.yml | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8aaef2ed..a88f8867 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -434,6 +434,48 @@ Build documentation: - docs/build/html/ +Windows: + tags: + - windows + script: + - Import-Module "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1" + - choco install --no-progress -y git --force --params "/GitAndUnixToolsOnPath" + - choco install --no-progress -y python3 + - choco install --no-progress -y jdk8 + - choco install --no-progress -y rsync + - refreshenv + - python -m pip install --upgrade babel pip setuptools + - python -m pip install -e . + + - $files = @(Get-ChildItem tests\*.TestCase) + - foreach ($f in $files) { + write-output $f; + python $f; + if( $LASTEXITCODE -eq 0 ) { + write-output "SUCCESS $f"; + } else { + write-output "ERROR $f failed"; + } + } + + # these are the tests that must pass + - python tests\checkupdates.TestCase + - python tests\exception.TestCase + - python tests\import.TestCase + - python tests\init.TestCase + - python tests\lint.TestCase + - python tests\main.TestCase + - python tests\metadata.TestCase + - python tests\rewritemeta.TestCase + - python tests\vcs.TestCase + after_script: + - Copy-Item C:\ProgramData\chocolatey\logs\chocolatey.log + artifacts: + when: always + paths: + - "*.log" + + pages: image: alpine:latest stage: deploy From 78d37bb13b5ff9f9e309854a9214762a8b85c6da Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 17 Jun 2021 14:46:51 +0200 Subject: [PATCH 0321/2116] switch to allow/block list terminology throughout code base allowlist and blocklist are much clearer terms with no cultural baggage. This changes all "whitelist" references to "allowlist", and all "blacklist" references to "blocklist". --- MANIFEST.in | 4 ++-- buildserver/provision-android-sdk | 4 ++-- fdroidserver/build.py | 2 +- fdroidserver/scanner.py | 8 ++++---- tests/common.TestCase | 4 ++-- .../app/build.gradle | 0 .../build.gradle | 0 7 files changed, 11 insertions(+), 11 deletions(-) rename tests/source-files/{firebase-whitelisted => firebase-allowlisted}/app/build.gradle (100%) rename tests/source-files/{firebase-whitelisted => firebase-allowlisted}/build.gradle (100%) diff --git a/MANIFEST.in b/MANIFEST.in index 2d4fe372..c65e8481 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -752,8 +752,8 @@ include tests/source-files/fdroid/fdroidclient/AndroidManifest.xml include tests/source-files/fdroid/fdroidclient/build.gradle include tests/source-files/firebase-suspect/app/build.gradle include tests/source-files/firebase-suspect/build.gradle -include tests/source-files/firebase-whitelisted/app/build.gradle -include tests/source-files/firebase-whitelisted/build.gradle +include tests/source-files/firebase-allowlisted/app/build.gradle +include tests/source-files/firebase-allowlisted/build.gradle include tests/source-files/info.guardianproject.ripple/build.gradle include tests/source-files/open-keychain/open-keychain/build.gradle include tests/source-files/open-keychain/open-keychain/OpenKeychain/build.gradle diff --git a/buildserver/provision-android-sdk b/buildserver/provision-android-sdk index 1ca5ec19..4814ca40 100644 --- a/buildserver/provision-android-sdk +++ b/buildserver/provision-android-sdk @@ -44,7 +44,7 @@ done cd /vagrant/cache # make links for `android update sdk` to use and delete -blacklist="build-tools_r17-linux.zip +blocklist="build-tools_r17-linux.zip build-tools_r18.0.1-linux.zip build-tools_r18.1-linux.zip build-tools_r18.1.1-linux.zip @@ -66,7 +66,7 @@ blacklist="build-tools_r17-linux.zip latestm2=`ls -1 android_m2repository*.zip | sort -n | tail -1` for f in $latestm2 android-[0-9]*.zip platform-[0-9]*.zip build-tools_r*-linux.zip; do rm -f ${ANDROID_HOME}/temp/$f - if [[ $blacklist != *$f* ]]; then + if [[ $blocklist != *$f* ]]; then ln -s /vagrant/cache/$f ${ANDROID_HOME}/temp/ fi done diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 89097166..75dc122c 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -806,7 +806,7 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext str(build.versionCode))) if (options.scan_binary or config.get('scan_binary')) and not options.skipscan: if scanner.scan_binary(src): - raise BuildException("Found blacklisted packages in final apk!") + raise BuildException("Found blocklisted packages in final apk!") # Copy the unsigned APK to our destination directory for further # processing (by publish.py)... diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 57e30066..6479a43c 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -136,18 +136,18 @@ def scan_source(build_dir, build=metadata.Build()): count = 0 - whitelisted = [ + allowlisted = [ 'firebase-jobdispatcher', # https://github.com/firebase/firebase-jobdispatcher-android/blob/master/LICENSE 'com.firebaseui', # https://github.com/firebase/FirebaseUI-Android/blob/master/LICENSE 'geofire-android' # https://github.com/firebase/geofire-java/blob/master/LICENSE ] - def is_whitelisted(s): - return any(wl in s for wl in whitelisted) + def is_allowlisted(s): + return any(al in s for al in allowlisted) def suspects_found(s): for n, r in NON_FREE_GRADLE_LINES.items(): - if r.match(s) and not is_whitelisted(s): + if r.match(s) and not is_allowlisted(s): yield n allowed_repos = [re.compile(r'^https://' + re.escape(repo) + r'/*') for repo in [ diff --git a/tests/common.TestCase b/tests/common.TestCase index 2619d4b7..222813f6 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1376,8 +1376,8 @@ class CommonTest(unittest.TestCase): 'source-files/fdroid/fdroidclient/build.gradle', 'source-files/firebase-suspect/app/build.gradle', 'source-files/firebase-suspect/build.gradle', - 'source-files/firebase-whitelisted/app/build.gradle', - 'source-files/firebase-whitelisted/build.gradle', + 'source-files/firebase-allowlisted/app/build.gradle', + 'source-files/firebase-allowlisted/build.gradle', 'source-files/org.mozilla.rocket/app/build.gradle', 'source-files/realm/react-native/android/build.gradle', 'triple-t-2/build/org.piwigo.android/app/build.gradle', diff --git a/tests/source-files/firebase-whitelisted/app/build.gradle b/tests/source-files/firebase-allowlisted/app/build.gradle similarity index 100% rename from tests/source-files/firebase-whitelisted/app/build.gradle rename to tests/source-files/firebase-allowlisted/app/build.gradle diff --git a/tests/source-files/firebase-whitelisted/build.gradle b/tests/source-files/firebase-allowlisted/build.gradle similarity index 100% rename from tests/source-files/firebase-whitelisted/build.gradle rename to tests/source-files/firebase-allowlisted/build.gradle From b49c3741bde2a3d2036837ee737446d80c7a4d18 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sun, 20 Jun 2021 08:49:49 +0200 Subject: [PATCH 0322/2116] [checkupdates] Use tag if version is 'Unknown' Regression from cd405cc9. Parse_androidmanifests() can return 'Unknown' or 'Ignore' if it did not find a version name. The check_tags() always returned the tag and checkupdates_app() replaced the version by the tag in the 'Unknown' case. Since cd405cc9 the tag is the hash and so the version would become the hash as well. This patch moves the 'Unknown' check directly after the Parse_androidmanifests(). --- fdroidserver/checkupdates.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 566dde00..d5a9bf17 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -207,6 +207,8 @@ def check_tags(app, pattern): root_dir = build_dir / subdir paths = common.manifest_paths(root_dir, last_build.gradle) version, vercode, _package = common.parse_androidmanifests(paths, app) + if version == 'Unknown' or version == 'Ignore': + version = tag if vercode: logging.debug("Manifest exists in subdir '{0}'. Found version {1} ({2})" .format(subdir, version, vercode)) @@ -463,8 +465,6 @@ def checkupdates_app(app): if mode.startswith('Tags'): pattern = mode[5:] if len(mode) > 4 else None (version, vercode, tag) = check_tags(app, pattern) - if version == 'Unknown': - version = tag msg = vercode elif mode == 'RepoManifest': (version, vercode) = check_repomanifest(app) From 736f244634ee328e26bf30a8e1489adc58b5e298 Mon Sep 17 00:00:00 2001 From: linsui Date: Mon, 21 Jun 2021 13:08:25 +0800 Subject: [PATCH 0323/2116] fix vscode setting --- .vscode/settings.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 6d3b59a0..da31cd7f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,20 +1,19 @@ { "python.formatting.blackArgs": [ - "--config pyproject.toml" + "--config=pyproject.toml" ], "python.formatting.provider": "black", "python.linting.banditEnabled": true, "python.linting.banditArgs": [ - "-r", "-ii", - "--ini .bandit", + "--ini=.bandit", ], "python.linting.enabled": true, "python.linting.mypyArgs": [ - "--config-file mypy.ini" + "--config-file=mypy.ini" ], "python.linting.mypyEnabled": true, - "python.linting.pycodestyleEnabled": true, + "python.linting.flake8Enabled": true, "python.linting.pylintArgs": [ "--rcfile=.pylint-rcfile" ], From e0461ca1bf06bcda2b19f7961e05b42f0825d743 Mon Sep 17 00:00:00 2001 From: linsui Date: Mon, 21 Jun 2021 13:09:13 +0800 Subject: [PATCH 0324/2116] Make lint max-line-length to 88 for black --- .pylint-rcfile | 2 ++ setup.cfg | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/.pylint-rcfile b/.pylint-rcfile index 8cc4c8d8..d32d90c4 100644 --- a/.pylint-rcfile +++ b/.pylint-rcfile @@ -43,3 +43,5 @@ good-names=i,j,k,ex,Run,f,fp # Maximum number of nested blocks for function / method body max-nested-blocks=5 +[FORMAT] +max-line-length=88 diff --git a/setup.cfg b/setup.cfg index 81bcf8af..67e7581d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -39,3 +39,11 @@ output_dir = locale [compile_catalog] domain = fdroidserver directory = locale + +[pycodestyle] +ignore = E203,W503 +max-line-length = 88 + +[flake8] +ignore = E203,W503 +max-line-length = 88 From 33137a85160f6c4fd0b76d78fc1c86dd28ca8aa8 Mon Sep 17 00:00:00 2001 From: linsui Date: Mon, 21 Jun 2021 13:10:06 +0800 Subject: [PATCH 0325/2116] ignore E203 for black --- hooks/pre-commit | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/hooks/pre-commit b/hooks/pre-commit index dfd608f9..4acfe2b5 100755 --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -55,13 +55,16 @@ fi # We ignore the following PEP8 warnings # * E123: closing bracket does not match indentation of opening bracket's line # - Broken if multiple indentation levels start on a single line +# * E203: whitespace before ':' +# - E203 is not PEP 8 compliant and conflict with black # * E501: line too long (82 > 79 characters) # - Recommended for readability but not enforced # - Some lines are awkward to wrap around a char limit # * W503: line break before binary operator # - Quite pedantic -PEP8_IGNORE="E123,E501,W503" + +PEP8_IGNORE="E123,E203,E501,W503" err() { echo >&2 ERROR: "$@" From 763a2ee80d4abf23a41adde300912d442956ace1 Mon Sep 17 00:00:00 2001 From: linsui Date: Sat, 19 Jun 2021 13:30:56 +0800 Subject: [PATCH 0326/2116] fix invalid extension of output apk --- fdroidserver/build.py | 7 ++++++- fdroidserver/common.py | 6 ++++-- tests/common.TestCase | 30 ++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 75dc122c..0a99ba0b 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -810,7 +810,12 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext # Copy the unsigned APK to our destination directory for further # processing (by publish.py)... - dest = os.path.join(output_dir, common.get_release_filename(app, build)) + dest = os.path.join( + output_dir, + common.get_release_filename( + app, build, common.get_file_extension(src) + ) + ) shutil.copyfile(src, dest) # Move the source tarball into the output directory... diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 423acc49..08484ead 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -785,8 +785,10 @@ def apk_parse_release_filename(apkname): return None, None, None -def get_release_filename(app, build): - if build.output: +def get_release_filename(app, build, extension=None): + if extension: + return "%s_%s.%s" % (app.id, build.versionCode, extension) + if build.output and get_file_extension(build.output): return "%s_%s.%s" % (app.id, build.versionCode, get_file_extension(build.output)) else: return "%s_%s.apk" % (app.id, build.versionCode) diff --git a/tests/common.TestCase b/tests/common.TestCase index 222813f6..ebaad78c 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -2112,6 +2112,36 @@ class CommonTest(unittest.TestCase): self.assertEqual(tags, ['8.9.5', '8.9.4', '8.9.3', '8,9,3', '8.9.3b', 'awesome_release', '8.6.3']) + def test_get_release_filename(self): + app = fdroidserver.metadata.App() + app.id = 'test.app' + build = fdroidserver.metadata.Build() + build.versionCode = 123 + + build.output = 'build/apk/*' + self.assertEqual( + fdroidserver.common.get_release_filename(app, build), + "%s_%s.apk" % (app.id, build.versionCode), + ) + + build.output = 'build/apk/*.zip' + self.assertEqual( + fdroidserver.common.get_release_filename(app, build), + "%s_%s.zip" % (app.id, build.versionCode), + ) + + build.output = 'build/apk/*.apk' + self.assertEqual( + fdroidserver.common.get_release_filename(app, build), + "%s_%s.apk" % (app.id, build.versionCode), + ) + + build.output = 'build/apk/*.apk' + self.assertEqual( + fdroidserver.common.get_release_filename(app, build, 'exe'), + "%s_%s.exe" % (app.id, build.versionCode), + ) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 660520e3e160308f134cf7bd771282a550cc9e9c Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 24 Jun 2021 21:25:36 +0200 Subject: [PATCH 0327/2116] gitlab-ci: switch ubuntu_lts_ppa job to keyserver.ubuntu.com fixes: Executing: /tmp/apt-key-gpghome.ZwePp5ymqm/gpg.1.sh --keyserver hkp://pool.sks-keyservers.net --recv-key 9AAC253193B65D4DF1D0A13EEC4632C79C5E0151 gpg: keyserver receive failed: No name https://gitlab.com/fdroid/fdroidserver/-/jobs/1374517971 --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a88f8867..6df0145f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -104,7 +104,7 @@ ubuntu_lts_ppa: script: - export ANDROID_HOME=/usr/lib/android-sdk - apt-get install gnupg - - while ! apt-key adv --keyserver hkp://pool.sks-keyservers.net --recv-key 9AAC253193B65D4DF1D0A13EEC4632C79C5E0151; do sleep 15; done + - while ! apt-key adv --keyserver keyserver.ubuntu.com --recv-key 9AAC253193B65D4DF1D0A13EEC4632C79C5E0151; do sleep 15; done - export RELEASE=`sed -n 's,^deb [^ ][^ ]* \([a-z]*\).*,\1,p' /etc/apt/sources.list | head -1` - echo "deb http://ppa.launchpad.net/fdroid/fdroidserver/ubuntu $RELEASE main" >> /etc/apt/sources.list - apt-get update From 9500b9d2e97c30b6a33e788cc44f6faac305d489 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 9 Jun 2021 12:47:22 +0200 Subject: [PATCH 0328/2116] gradle-release-checksums.py: check for GitLab token before committing --- tests/gradle-release-checksums.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/gradle-release-checksums.py b/tests/gradle-release-checksums.py index 9f895426..35b2d99f 100755 --- a/tests/gradle-release-checksums.py +++ b/tests/gradle-release-checksums.py @@ -95,6 +95,13 @@ if os.getenv('CI_PROJECT_NAMESPACE') != 'fdroid': git_repo = git.repo.Repo('.') modified = git_repo.git().ls_files(modified=True).split() if git_repo.is_dirty() and ('gradlew-fdroid' in modified or 'makebuildserver' in modified): + private_token = os.getenv('PERSONAL_ACCESS_TOKEN') + if not private_token: + print(Fore.RED + + 'ERROR: GitLab Token not found in PERSONAL_ACCESS_TOKEN!' + + Style.RESET_ALL) + exit(1) + branch = git_repo.create_head(os.path.basename(__file__), force=True) branch.checkout() git_repo.index.add(['gradlew-fdroid', 'makebuildserver']) @@ -112,12 +119,6 @@ if git_repo.is_dirty() and ('gradlew-fdroid' in modified or 'makebuildserver' in remote.push(force=True) git.remote.Remote.rm(git_repo, remote_name) - private_token = os.getenv('PERSONAL_ACCESS_TOKEN') - if not private_token: - print(Fore.RED - + 'ERROR: GitLab Token not found in PERSONAL_ACCESS_TOKEN!' - + Style.RESET_ALL) - exit(1) gl = gitlab.Gitlab(os.getenv('CI_SERVER_URL'), api_version=4, private_token=private_token) project = gl.projects.get(project_path, lazy=True) From 5e1c322f27f78544ba353d5c82677aab3ea183dc Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 9 Jun 2021 12:43:36 +0200 Subject: [PATCH 0329/2116] this codebase has started to use things introduced in Python 3.5 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 3e551e46..f64c2eff 100755 --- a/setup.py +++ b/setup.py @@ -64,7 +64,7 @@ setup(name='fdroidserver', packages=['fdroidserver', 'fdroidserver.asynchronousfilereader'], scripts=['fdroid', 'makebuildserver'], data_files=get_data_files(), - python_requires='>=3.4', + python_requires='>=3.5', cmdclass={'versioncheck': VersionCheckCommand}, setup_requires=[ 'babel', From d168b9c05bae8e673862771bc590941a10be0a06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit+git@posteo.de> Date: Mon, 17 May 2021 09:56:51 +0200 Subject: [PATCH 0330/2116] rewrite docstrings to match numpy style guide --- README.md | 24 +- fdroidserver/apksigcopier.py | 7 +- fdroidserver/btlog.py | 10 +- fdroidserver/build.py | 48 ++-- fdroidserver/common.py | 504 ++++++++++++++++++++++------------- setup.cfg | 14 +- setup.py | 1 + 7 files changed, 400 insertions(+), 208 deletions(-) diff --git a/README.md b/README.md index 830a71e7..e51a403e 100644 --- a/README.md +++ b/README.md @@ -84,10 +84,32 @@ RAM. These test scripts are in the root of the project, all starting with _jenkins-_ since they are run on https://jenkins.debian.net. -## Translation +### Translation Everything can be translated. See [Translation and Localization](https://f-droid.org/docs/Translation_and_Localization) for more info. [![translation status](https://hosted.weblate.org/widgets/f-droid/-/fdroidserver/multi-auto.svg)](https://hosted.weblate.org/engage/f-droid/?utm_source=widget) + + +### Documentation + +The API documentation based on the docstrings gets automatically published [here](http://fdroid.gitlab.io/fdroidserver/) on every commit on the `master` branch. + +It can be built locally via + +```bash +pip install -e .[docs] +cd docs +sphinx-apidoc -o ./source ../fdroidserver -M -e +sphinx-autogen -o generated source/*.rst +make html +``` + +To additionally lint the code call +```bash +pydocstyle fdroidserver --count +``` + +When writing docstrings you should follow the [numpy style guide](https://numpydoc.readthedocs.io/en/latest/format.html). \ No newline at end of file diff --git a/fdroidserver/apksigcopier.py b/fdroidserver/apksigcopier.py index bb4e9b22..f0db86d0 100644 --- a/fdroidserver/apksigcopier.py +++ b/fdroidserver/apksigcopier.py @@ -372,7 +372,9 @@ def zip_data(apkfile, count=1024): """ Extract central directory, EOCD, and offsets from ZIP. - Returns ZipData. + Returns + ------- + ZipData """ with open(apkfile, "rb") as fh: fh.seek(-count, os.SEEK_END) @@ -424,6 +426,7 @@ def do_extract(signed_apk, output_dir, v1_only=NO): The v1_only parameter controls whether the absence of a v1 signature is considered an error or not: + * use v1_only=NO (or v1_only=False) to only accept (v1+)v2/v3 signatures; * use v1_only=AUTO (or v1_only=None) to automatically detect v2/v3 signatures; * use v1_only=YES (or v1_only=True) to ignore any v2/v3 signatures. @@ -459,6 +462,7 @@ def do_patch(metadata_dir, unsigned_apk, output_apk, v1_only=NO): The v1_only parameter controls whether the absence of a v1 signature is considered an error or not: + * use v1_only=NO (or v1_only=False) to only accept (v1+)v2/v3 signatures; * use v1_only=AUTO (or v1_only=None) to automatically detect v2/v3 signatures; * use v1_only=YES (or v1_only=True) to ignore any v2/v3 signatures. @@ -499,6 +503,7 @@ def do_copy(signed_apk, unsigned_apk, output_apk, v1_only=NO): The v1_only parameter controls whether the absence of a v1 signature is considered an error or not: + * use v1_only=NO (or v1_only=False) to only accept (v1+)v2/v3 signatures; * use v1_only=AUTO (or v1_only=None) to automatically detect v2/v3 signatures; * use v1_only=YES (or v1_only=True) to ignore any v2/v3 signatures. diff --git a/fdroidserver/btlog.py b/fdroidserver/btlog.py index 84318804..e014b639 100755 --- a/fdroidserver/btlog.py +++ b/fdroidserver/btlog.py @@ -52,13 +52,13 @@ options = None def make_binary_transparency_log( repodirs, btrepo='binary_transparency', url=None, commit_title='fdroid update' ): - '''Log the indexes in a standalone git repo to serve as a "binary - transparency" log. + """Log the indexes in a standalone git repo to serve as a "binary transparency" log. - see: https://www.eff.org/deeplinks/2014/02/open-letter-to-tech-companies - - ''' + References + ---------- + https://www.eff.org/deeplinks/2014/02/open-letter-to-tech-companies + """ logging.info('Committing indexes to ' + btrepo) if os.path.exists(os.path.join(btrepo, '.git')): gitrepo = git.Repo(btrepo) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 0a99ba0b..2eead016 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -54,12 +54,18 @@ except ImportError: def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): """Do a build on the builder vm. - :param app: app metadata dict - :param build: - :param vcs: version control system controller object - :param build_dir: local source-code checkout of app - :param output_dir: target folder for the build result - :param force: + Parameters + ---------- + app + app metadata dict + build + vcs + version control system controller object + build_dir + local source-code checkout of app + output_dir + target folder for the build result + force """ global buildserverid @@ -830,18 +836,26 @@ def trybuild(app, build, build_dir, output_dir, log_dir, also_check_dir, """ Build a particular version of an application, if it needs building. - :param output_dir: The directory where the build output will go. Usually - this is the 'unsigned' directory. - :param repo_dir: The repo directory - used for checking if the build is - necessary. - :param also_check_dir: An additional location for checking if the build - is necessary (usually the archive repo) - :param test: True if building in test mode, in which case the build will - always happen, even if the output already exists. In test mode, the - output directory should be a temporary location, not any of the real - ones. + Parameters + ---------- + output_dir + The directory where the build output will go. + Usually this is the 'unsigned' directory. + repo_dir + The repo directory - used for checking if the build is necessary. + also_check_dir + An additional location for checking if the build + is necessary (usually the archive repo) + test + True if building in test mode, in which case the build will + always happen, even if the output already exists. In test mode, the + output directory should be a temporary location, not any of the real + ones. - :returns: True if the build was done, False if it wasn't necessary. + Returns + ------- + Boolean + True if the build was done, False if it wasn't necessary. """ dest_file = common.get_release_filename(app, build) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 08484ead..f40fea6a 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -325,7 +325,7 @@ def regsub_file(pattern, repl, path): def read_config(opts=None): - """Read the repository config + """Read the repository config. The config is read from config_file, which is in the current directory when any of the repo management commands are used. If @@ -507,14 +507,19 @@ def assert_config_keystore(config): def find_apksigner(config): - """Searches for the best version apksigner and adds it to the config + """Searches for the best version apksigner and adds it to the config. Returns the best version of apksigner following this algorithm: + * use config['apksigner'] if set * try to find apksigner in path * find apksigner in build-tools starting from newest installed going down to MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION - :return: path to apksigner or None if no version is found + + Returns + ------- + str + path to apksigner or None if no version is found """ command = 'apksigner' @@ -546,8 +551,7 @@ def find_apksigner(config): def find_sdk_tools_cmd(cmd): - '''find a working path to a tool from the Android SDK''' - + """Find a working path to a tool from the Android SDK.""" tooldirs = [] if config is not None and 'sdk_path' in config and os.path.exists(config['sdk_path']): # try to find a working path to this command, in all the recent possible paths @@ -579,7 +583,7 @@ def find_sdk_tools_cmd(cmd): def test_aapt_version(aapt): - '''Check whether the version of aapt is new enough''' + """Check whether the version of aapt is new enough.""" output = subprocess.check_output([aapt, 'version'], universal_newlines=True) if output is None or output == '': logging.error(_("'{path}' failed to execute!").format(path=aapt)) @@ -629,19 +633,25 @@ def test_sdk_exists(thisconfig): def get_local_metadata_files(): - '''get any metadata files local to an app's source repo + """Get any metadata files local to an app's source repo. This tries to ignore anything that does not count as app metdata, including emacs cruft ending in ~ - ''' + """ return glob.glob('.fdroid.[a-jl-z]*[a-rt-z]') def read_pkg_args(appid_versionCode_pairs, allow_vercodes=False): """ - :param appids: arguments in the form of multiple appid:[vc] strings - :returns: a dictionary with the set of vercodes specified for each package + Parameters + ---------- + appids + arguments in the form of multiple appid:[vc] strings + + Returns + ------- + a dictionary with the set of vercodes specified for each package """ vercodes = {} if not appid_versionCode_pairs: @@ -672,8 +682,15 @@ def get_metadata_files(vercodes): """ Build a list of metadata files and raise an exception for invalid appids. - :param vercodes: version codes as returned by read_pkg_args() - :returns: a list of corresponding metadata/*.yml files + Parameters + ---------- + vercodes + version codes as returned by read_pkg_args() + + Returns + ------- + List + a list of corresponding metadata/*.yml files """ found_invalid = False metadatafiles = [] @@ -690,7 +707,7 @@ def get_metadata_files(vercodes): def read_app_args(appid_versionCode_pairs, allapps, allow_vercodes=False): - """Build a list of App instances for processing + """Build a list of App instances for processing. On top of what read_pkg_args does, this returns the whole app metadata, but limiting the builds list to the builds matching the @@ -699,7 +716,6 @@ def read_app_args(appid_versionCode_pairs, allapps, allow_vercodes=False): returned. """ - vercodes = read_pkg_args(appid_versionCode_pairs, allow_vercodes) if not vercodes: @@ -739,7 +755,7 @@ def read_app_args(appid_versionCode_pairs, allapps, allow_vercodes=False): def get_extension(filename): - """get name and extension of filename, with extension always lower case""" + """Get name and extension of filename, with extension always lower case.""" base, ext = os.path.splitext(filename) if not ext: return base, '' @@ -770,7 +786,10 @@ def apk_parse_release_filename(apkname): WARNING: Returned values don't necessarily represent the APKs actual properties, the are just paresed from the file name. - :returns: A triplet containing (appid, versionCode, signer), where appid + Returns + ------- + Tuple + A triplet containing (appid, versionCode, signer), where appid should be the package name, versionCode should be the integer represion of the APKs version and signer should be the first 7 hex digists of the sha256 signing key fingerprint which was used to sign @@ -803,7 +822,7 @@ def getsrcname(app, build): def get_build_dir(app): - '''get the dir that this app will be built in''' + """Get the dir that this app will be built in.""" if app.RepoType == 'srclib': return Path('build/srclib') / app.Repo @@ -819,7 +838,7 @@ class Encoder(json.JSONEncoder): def setup_status_output(start_timestamp): - """Create the common output dictionary for public status updates""" + """Create the common output dictionary for public status updates.""" output = { 'commandLine': sys.argv, 'startTimestamp': int(time.mktime(start_timestamp) * 1000), @@ -855,7 +874,7 @@ def write_running_status_json(output): def write_status_json(output, pretty=False, name=None): - """Write status out as JSON, and rsync it to the repo server""" + """Write status out as JSON, and rsync it to the repo server.""" status_dir = os.path.join('repo', 'status') if not os.path.exists(status_dir): os.makedirs(status_dir) @@ -872,13 +891,12 @@ def write_status_json(output, pretty=False, name=None): def get_head_commit_id(git_repo): - """Get git commit ID for HEAD as a str - """ + """Get git commit ID for HEAD as a str.""" return git_repo.head.commit.hexsha def setup_vcs(app): - '''checkout code from VCS and return instance of vcs and the build dir''' + """Checkout code from VCS and return instance of vcs and the build dir.""" build_dir = get_build_dir(app) # TODO: Remove this build_dir = str(build_dir) @@ -964,7 +982,6 @@ class vcs: you are cloning a clean copy of the repo - otherwise it must specify a valid revision. """ - if self.clone_failed: raise VCSException(_("Downloading the repository already failed once, not trying again.")) @@ -1034,11 +1051,11 @@ class vcs: return rtags def latesttags(self): - """Get a list of all the known tags, sorted from newest to oldest""" + """Get a list of all the known tags, sorted from newest to oldest.""" raise VCSException('latesttags not supported for this vcs type') - def getref(self, revname=None): - """Get current commit reference (hash, revision, etc)""" + def getref(self): + """Get current commit reference (hash, revision, etc).""" raise VCSException('getref not supported for this vcs type') def getsrclib(self): @@ -1055,7 +1072,7 @@ class vcs_git(vcs): return ['git', '--version'] def git(self, args, envs=dict(), cwd=None, output=True): - '''Prevent git fetch/clone/submodule from hanging at the username/password prompt + """Prevent git fetch/clone/submodule from hanging at the username/password prompt. While fetch/pull/clone respect the command line option flags, it seems that submodule commands do not. They do seem to @@ -1064,7 +1081,7 @@ class vcs_git(vcs): sticks. Also, because of CVE-2017-1000117, block all SSH URLs. - ''' + """ # # supported in git >= 2.3 git_config = [ @@ -1095,7 +1112,6 @@ class vcs_git(vcs): it! This is called as a safety check. """ - p = FDroidPopen(['git', 'rev-parse', '--show-toplevel'], cwd=self.local, output=False) result = p.output.rstrip() if Path(result) != Path(self.local).resolve(): @@ -1247,7 +1263,7 @@ class vcs_gitsvn(vcs): raise VCSException('Repository mismatch') def git(self, args, envs=dict(), cwd=None, output=True): - '''Prevent git fetch/clone/submodule from hanging at the username/password prompt + """Prevent git fetch/clone/submodule from hanging at the username/password prompt. AskPass is set to /bin/true to let the process try to connect without a username/password. @@ -1256,7 +1272,7 @@ class vcs_gitsvn(vcs): (supported in git >= 2.3). This protects against CVE-2017-1000117. - ''' + """ git_config = [ '-c', 'core.askpass=/bin/true', '-c', 'core.sshCommand=/bin/false', @@ -1538,7 +1554,7 @@ def retrieve_string_singleline(app_dir, string, xmlfiles=None): def manifest_paths(app_dir, flavours): - '''Return list of existing files that will be used to find the highest vercode''' + """Return list of existing files that will be used to find the highest vercode.""" # TODO: Remove this in Python3.6 app_dir = str(app_dir) @@ -1560,7 +1576,7 @@ def manifest_paths(app_dir, flavours): def fetch_real_name(app_dir, flavours): - '''Retrieve the package name. Returns the name, or None if not found.''' + """Retrieve the package name. Returns the name, or None if not found.""" # TODO: Remove this in Python3.6 app_dir = str(app_dir) for path in manifest_paths(app_dir, flavours): @@ -1827,7 +1843,7 @@ def parse_androidmanifests(paths, app): def is_valid_package_name(name): - """Check whether name is a valid fdroid package name + """Check whether name is a valid fdroid package name. APKs and manually defined package names must use a valid Java Package Name. Automatically generated package names for non-APK @@ -1839,7 +1855,7 @@ def is_valid_package_name(name): def is_strict_application_id(name): - """Check whether name is a valid Android Application ID + """Check whether name is a valid Android Application ID. The Android ApplicationID is basically a Java Package Name, but with more restrictive naming rules: @@ -1848,6 +1864,8 @@ def is_strict_application_id(name): * Each segment must start with a letter. * All characters must be alphanumeric or an underscore [a-zA-Z0-9_]. + References + ---------- https://developer.android.com/studio/build/application-id """ @@ -1947,7 +1965,6 @@ def get_app_from_url(url): match urlparse(). """ - parsed = urllib.parse.urlparse(url) invalid_url = False if not parsed.scheme or not parsed.path: @@ -2106,21 +2123,31 @@ gradle_version_regex = re.compile(r"[^/]*'com\.android\.tools\.build:gradle:([^\ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver=False, refresh=True): - """ Prepare the source code for a particular build + """ Prepare the source code for a particular build. - :param vcs: the appropriate vcs object for the application - :param app: the application details from the metadata - :param build: the build details from the metadata - :param build_dir: the path to the build directory, usually 'build/app.id' - :param srclib_dir: the path to the source libraries directory, usually 'build/srclib' - :param extlib_dir: the path to the external libraries directory, usually 'build/extlib' + Parameters + ---------- + vcs + the appropriate vcs object for the application + app + the application details from the metadata + build + the build details from the metadata + build_dir + the path to the build directory, usually 'build/app.id' + srclib_dir + the path to the source libraries directory, usually 'build/srclib' + extlib_dir + the path to the external libraries directory, usually 'build/extlib' - Returns the (root, srclibpaths) where: - :param root: is the root directory, which may be the same as 'build_dir' or may - be a subdirectory of it. - :param srclibpaths: is information on the srclibs being used + Returns + ------- + root + is the root directory, which may be the same as 'build_dir' or may + be a subdirectory of it. + srclibpaths + is information on the srclibs being used """ - # Optionally, the actual app source can be in a subdirectory if build.subdir: root_dir = os.path.join(build_dir, build.subdir) @@ -2357,7 +2384,7 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver= def getpaths_map(build_dir, globpaths): - """Extend via globbing the paths from a field and return them as a map from original path to resulting paths""" + """Extend via globbing the paths from a field and return them as a map from original path to resulting paths.""" paths = dict() for p in globpaths: p = p.strip() @@ -2370,7 +2397,7 @@ def getpaths_map(build_dir, globpaths): def getpaths(build_dir, globpaths): - """Extend via globbing the paths from a field and return them as a set""" + """Extend via globbing the paths from a field and return them as a set.""" paths_map = getpaths_map(build_dir, globpaths) paths = set() for k, v in paths_map.items(): @@ -2401,20 +2428,19 @@ def check_system_clock(dt_obj, path): class KnownApks: - """permanent store of existing APKs with the date they were added + """Permanent store of existing APKs with the date they were added. This is currently the only way to permanently store the "updated" date of APKs. """ def __init__(self): - '''Load filename/date info about previously seen APKs + """Load filename/date info about previously seen APKs. Since the appid and date strings both will never have spaces, this is parsed as a list from the end to allow the filename to have any combo of spaces. - ''' - + """ self.path = os.path.join('stats', 'known_apks.txt') self.apks = {} if os.path.isfile(self.path): @@ -2451,10 +2477,10 @@ class KnownApks: f.write(line + '\n') def recordapk(self, apkName, app, default_date=None): - ''' + """ Record an APK (if it's new, otherwise does nothing) Returns the date it was added as a datetime instance - ''' + """ if apkName not in self.apks: if default_date is None: default_date = datetime.utcnow() @@ -2490,7 +2516,7 @@ class KnownApks: def get_file_extension(filename): - """get the normalized file extension, can be blank string but never None""" + """Get the normalized file extension, can be blank string but never None.""" if isinstance(filename, bytes): filename = filename.decode('utf-8') return os.path.splitext(filename)[1].lower()[1:] @@ -2524,7 +2550,7 @@ def _get_androguard_APK(apkfile): def ensure_final_value(packageName, arsc, value): - """Ensure incoming value is always the value, not the resid + """Ensure incoming value is always the value, not the resid. androguard will sometimes return the Android "resId" aka Resource ID instead of the actual value. This checks whether @@ -2546,12 +2572,16 @@ def ensure_final_value(packageName, arsc, value): def is_apk_and_debuggable(apkfile): - """Returns True if the given file is an APK and is debuggable + """Returns True if the given file is an APK and is debuggable. Parse only from the APK. - :param apkfile: full path to the APK to check""" - + Parameters + ---------- + apkfile + full path to the APK to check + + """ if get_file_extension(apkfile) != 'apk': return False from androguard.core.bytecodes.axml import AXMLParser, format_value, START_TAG @@ -2583,8 +2613,16 @@ def get_apk_id(apkfile): APK, aapt still can. So aapt is also used as the final fallback method. - :param apkfile: path to an APK file. - :returns: triplet (appid, version code, version name) + Parameters + ---------- + apkfile + path to an APK file. + + Returns + ------- + appid + version code + version name """ try: @@ -2596,7 +2634,7 @@ def get_apk_id(apkfile): def get_apk_id_androguard(apkfile): - """Read (appid, versionCode, versionName) from an APK + """Read (appid, versionCode, versionName) from an APK. This first tries to do quick binary XML parsing to just get the values that are needed. It will fallback to full androguard @@ -2697,12 +2735,19 @@ def FDroidPopenBytes(commands, cwd=None, envs=None, output=True, stderr_to_stdou """ Run a command and capture the possibly huge output as bytes. - :param commands: command and argument list like in subprocess.Popen - :param cwd: optionally specifies a working directory - :param envs: a optional dictionary of environment variables and their values - :returns: A PopenResult. - """ + Parameters + ---------- + commands + command and argument list like in subprocess.Popen + cwd + optionally specifies a working directory + envs + a optional dictionary of environment variables and their values + Returns + ------- + A PopenResult. + """ global env if env is None: set_FDroidPopen_env() @@ -2772,10 +2817,18 @@ def FDroidPopen(commands, cwd=None, envs=None, output=True, stderr_to_stdout=Tru """ Run a command and capture the possibly huge output as a str. - :param commands: command and argument list like in subprocess.Popen - :param cwd: optionally specifies a working directory - :param envs: a optional dictionary of environment variables and their values - :returns: A PopenResult. + Parameters + ---------- + commands + command and argument list like in subprocess.Popen + cwd + optionally specifies a working directory + envs + a optional dictionary of environment variables and their values + + Returns + ------- + A PopenResult. """ result = FDroidPopenBytes(commands, cwd, envs, output, stderr_to_stdout) result.output = result.output.decode('utf-8', 'ignore') @@ -2865,13 +2918,12 @@ def remove_signing_keys(build_dir): def set_FDroidPopen_env(build=None): - ''' - set up the environment variables for the build environment + """Set up the environment variables for the build environment. There is only a weak standard, the variables used by gradle, so also set up the most commonly used environment variables for SDK and NDK. Also, if there is no locale set, this will set the locale (e.g. LANG) to en_US.UTF-8. - ''' + """ global env, orig_path if env is None: @@ -2951,8 +3003,14 @@ def signer_fingerprint_short(cert_encoded): Extracts the first 7 hexadecimal digits of sha256 signing-key fingerprint for a given pkcs7 signature. - :param cert_encoded: Contents of an APK signing certificate. - :returns: shortened signing-key fingerprint. + Parameters + ---------- + cert_encoded + Contents of an APK signing certificate. + + Returns + ------- + shortened signing-key fingerprint. """ return signer_fingerprint(cert_encoded)[:7] @@ -2963,14 +3021,19 @@ def signer_fingerprint(cert_encoded): Extracts hexadecimal sha256 signing-key fingerprint string for a given pkcs7 signature. - :param: Contents of an APK signature. - :returns: shortened signature fingerprint. + Parameters + ---------- + Contents of an APK signature. + + Returns + ------- + shortened signature fingerprint. """ return hashlib.sha256(cert_encoded).hexdigest() def get_first_signer_certificate(apkpath): - """Get the first signing certificate from the APK, DER-encoded""" + """Get the first signing certificate from the APK, DER-encoded.""" certs = None cert_encoded = None with zipfile.ZipFile(apkpath, 'r') as apk: @@ -3005,10 +3068,15 @@ def apk_signer_fingerprint(apk_path): Extracts hexadecimal sha256 signing-key fingerprint string for a given APK. - :param apk_path: path to APK - :returns: signature fingerprint - """ + Parameters + ---------- + apk_path + path to APK + Returns + ------- + signature fingerprint + """ cert_encoded = get_first_signer_certificate(apk_path) if not cert_encoded: return None @@ -3021,14 +3089,20 @@ def apk_signer_fingerprint_short(apk_path): Extracts the first 7 hexadecimal digits of sha256 signing-key fingerprint for a given pkcs7 APK. - :param apk_path: path to APK - :returns: shortened signing-key fingerprint + Parameters + ---------- + apk_path + path to APK + + Returns + ------- + shortened signing-key fingerprint """ return apk_signer_fingerprint(apk_path)[:7] def metadata_get_sigdir(appid, vercode=None): - """Get signature directory for app""" + """Get signature directory for app.""" if vercode: return os.path.join('metadata', appid, 'signatures', str(vercode)) else: @@ -3041,9 +3115,11 @@ def metadata_find_developer_signature(appid, vercode=None): This picks the first signature file found in metadata an returns its signature. - :returns: sha256 signing key fingerprint of the developer signing key. - None in case no signature can not be found.""" - + Returns + ------- + sha256 signing key fingerprint of the developer signing key. + None in case no signature can not be found. + """ # fetch list of dirs for all versions of signatures appversigdirs = [] if vercode: @@ -3074,16 +3150,26 @@ def metadata_find_developer_signature(appid, vercode=None): def metadata_find_signing_files(appid, vercode): """Gets a list of signed manifests and signatures. - https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html - https://source.android.com/security/apksigning/v2 - https://source.android.com/security/apksigning/v3 + Parameters + ---------- + appid + app id string + vercode + app version code - :param appid: app id string - :param vercode: app version code - :returns: a list of 4-tuples for each signing key with following paths: + Returns + ------- + List + of 4-tuples for each signing key with following paths: (signature_file, signature_block_file, manifest, v2_files), where v2_files is either a (apk_signing_block_offset_file, apk_signing_block_file) pair or None + References + ---------- + + * https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html + * https://source.android.com/security/apksigning/v2 + * https://source.android.com/security/apksigning/v3 """ ret = [] sigdir = metadata_get_sigdir(appid, vercode) @@ -3111,7 +3197,10 @@ def metadata_find_signing_files(appid, vercode): def metadata_find_developer_signing_files(appid, vercode): """Get developer signature files for specified app from metadata. - :returns: a list of 4-tuples for each signing key with following paths: + Returns + ------- + List + of 4-tuples for each signing key with following paths: (signature_file, signature_block_file, manifest, v2_files), where v2_files is either a (apk_signing_block_offset_file, apk_signing_block_file) pair or None @@ -3124,7 +3213,7 @@ def metadata_find_developer_signing_files(appid, vercode): class ClonedZipInfo(zipfile.ZipInfo): - """Hack to allow fully cloning ZipInfo instances + """Hack to allow fully cloning ZipInfo instances. The zipfile library has some bugs that prevent it from fully cloning ZipInfo entries. https://bugs.python.org/issue43547 @@ -3156,9 +3245,12 @@ def apk_has_v1_signatures(apkfile): def apk_strip_v1_signatures(signed_apk, strip_manifest=False): """Removes signatures from APK. - :param signed_apk: path to APK file. - :param strip_manifest: when set to True also the manifest file will - be removed from the APK. + Parameters + ---------- + signed_apk + path to APK file. + strip_manifest + when set to True also the manifest file will be removed from the APK. """ with tempfile.TemporaryDirectory() as tmpdir: tmp_apk = os.path.join(tmpdir, 'tmp.apk') @@ -3177,10 +3269,12 @@ def apk_strip_v1_signatures(signed_apk, strip_manifest=False): def _zipalign(unsigned_apk, aligned_apk): - """run 'zipalign' using standard flags used by Gradle Android Plugin + """Run 'zipalign' using standard flags used by Gradle Android Plugin. -p was added in build-tools-23.0.0 + References + ---------- https://developer.android.com/studio/publish/app-signing#sign-manually """ p = SdkToolsPopen(['zipalign', '-v', '-p', '4', unsigned_apk, aligned_apk]) @@ -3194,14 +3288,21 @@ def apk_implant_signatures(apkpath, outpath, manifest): Note: this changes there supplied APK in place. So copy it if you need the original to be preserved. - https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html - https://source.android.com/security/apksigning/v2 - https://source.android.com/security/apksigning/v3 + Parameters + ---------- + apkpath + location of the unsigned apk + outpath + location of the output apk + + References + ---------- + + * https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html + * https://source.android.com/security/apksigning/v2 + * https://source.android.com/security/apksigning/v3 - :param apkpath: location of the unsigned apk - :param outpath: location of the output apk """ - sigdir = os.path.dirname(manifest) # FIXME apksigcopier.do_patch(sigdir, apkpath, outpath, v1_only=None) @@ -3209,12 +3310,19 @@ def apk_implant_signatures(apkpath, outpath, manifest): def apk_extract_signatures(apkpath, outdir): """Extracts a signature files from APK and puts them into target directory. - https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html - https://source.android.com/security/apksigning/v2 - https://source.android.com/security/apksigning/v3 + Parameters + ---------- + apkpath + location of the apk + outdir + older where the extracted signature files will be stored - :param apkpath: location of the apk - :param outdir: folder where the extracted signature files will be stored + References + ---------- + + * https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html + * https://source.android.com/security/apksigning/v2 + * https://source.android.com/security/apksigning/v3 """ apksigcopier.do_extract(apkpath, outdir, v1_only=None) @@ -3224,8 +3332,15 @@ def get_min_sdk_version(apk): """ This wraps the androguard function to always return and int and fall back to 1 if we can't get a valid minsdk version - :param apk: androguard APK object - :return: minsdk as int + + Parameters + ---------- + apk + androguard APK object + + Returns + ------- + minsdk: int """ try: return int(apk.get_min_sdk_version()) @@ -3234,7 +3349,7 @@ def get_min_sdk_version(apk): def sign_apk(unsigned_path, signed_path, keyalias): - """Sign and zipalign an unsigned APK, then save to a new file, deleting the unsigned + """Sign and zipalign an unsigned APK, then save to a new file, deleting the unsigned. NONE is a Java keyword used to configure smartcards as the keystore. Otherwise, the keystore is a local file. @@ -3281,7 +3396,7 @@ def sign_apk(unsigned_path, signed_path, keyalias): def verify_apks(signed_apk, unsigned_apk, tmp_dir, v1_only=None): - """Verify that two apks are the same + """Verify that two apks are the same. One of the inputs is signed, the other is unsigned. The signature metadata is transferred from the signed to the unsigned apk, and then apksigner is @@ -3289,15 +3404,22 @@ def verify_apks(signed_apk, unsigned_apk, tmp_dir, v1_only=None): the unsigned one. If the APK given as unsigned actually does have a signature, it will be stripped out and ignored. - :param signed_apk: Path to a signed APK file - :param unsigned_apk: Path to an unsigned APK file expected to match it - :param tmp_dir: Path to directory for temporary files - :param v1_only: True for v1-only signatures, False for v1 and v2 signatures, - or None for autodetection - :returns: None if the verification is successful, otherwise a string - describing what went wrong. - """ + Parameters + ---------- + signed_apk + Path to a signed APK file + unsigned_apk + Path to an unsigned APK file expected to match it + tmp_dir + Path to directory for temporary files + v1_only + True for v1-only signatures, False for v1 and v2 signatures, + or None for autodetection + Returns + ------- + None if the verification is successful, otherwise a string describing what went wrong. + """ if not verify_apk_signature(signed_apk): logging.info('...NOT verified - {0}'.format(signed_apk)) return 'verification of signed APK failed' @@ -3334,10 +3456,12 @@ def verify_jar_signature(jar): this has to turn on -strict then check for result 4, since this does not expect the signature to be from a CA-signed certificate. - :raises: VerificationException() if the JAR's signature could not be verified + Raises + ------ + VerificationException + If the JAR's signature could not be verified. """ - error = _('JAR signature failed to verify: {path}').format(path=jar) try: output = subprocess.check_output([config['jarsigner'], '-strict', '-verify', jar], @@ -3351,13 +3475,16 @@ def verify_jar_signature(jar): def verify_apk_signature(apk, min_sdk_version=None): - """verify the signature on an APK + """Verify the signature on an APK. Try to use apksigner whenever possible since jarsigner is very shitty: unsigned APKs pass as "verified"! Warning, this does not work on JARs with apksigner >= 0.7 (build-tools 26.0.1) - :returns: boolean whether the APK was verified + Returns + ------- + Boolean + whether the APK was verified """ if set_command_in_config('apksigner'): args = [config['apksigner'], 'verify'] @@ -3385,7 +3512,7 @@ def verify_apk_signature(apk, min_sdk_version=None): def verify_old_apk_signature(apk): - """verify the signature on an archived APK, supporting deprecated algorithms + """Verify the signature on an archived APK, supporting deprecated algorithms. F-Droid aims to keep every single binary that it ever published. Therefore, it needs to be able to verify APK signatures that include deprecated/removed @@ -3398,10 +3525,12 @@ def verify_old_apk_signature(apk): file permissions while in use. That should prevent a bad actor from changing the settings during operation. - :returns: boolean whether the APK was verified + Returns + ------- + Boolean + whether the APK was verified """ - _java_security = os.path.join(os.getcwd(), '.java.security') if os.path.exists(_java_security): os.remove(_java_security) @@ -3436,13 +3565,14 @@ apk_badchars = re.compile('''[/ :;'"]''') def compare_apks(apk1, apk2, tmp_dir, log_dir=None): - """Compare two apks + """Compare two apks. - Returns None if the APK content is the same (apart from the signing key), + Returns + ------- + None if the APK content is the same (apart from the signing key), otherwise a string describing what's different, or what went wrong when trying to do the comparison. """ - if not log_dir: log_dir = tmp_dir @@ -3497,11 +3627,11 @@ def compare_apks(apk1, apk2, tmp_dir, log_dir=None): def set_command_in_config(command): - '''Try to find specified command in the path, if it hasn't been + """Try to find specified command in the path, if it hasn't been manually set in config.yml. If found, it is added to the config dict. The return value says whether the command is available. - ''' + """ if command in config: return True else: @@ -3513,8 +3643,7 @@ def set_command_in_config(command): def find_command(command): - '''find the full path of a command, or None if it can't be found in the PATH''' - + """Find the full path of a command, or None if it can't be found in the PATH.""" def is_exe(fpath): return os.path.isfile(fpath) and os.access(fpath, os.X_OK) @@ -3533,7 +3662,7 @@ def find_command(command): def genpassword(): - '''generate a random password for when generating keys''' + """Generate a random password for when generating keys.""" h = hashlib.sha256() h.update(os.urandom(16)) # salt h.update(socket.getfqdn().encode('utf-8')) @@ -3542,9 +3671,15 @@ def genpassword(): def genkeystore(localconfig): - """ - Generate a new key with password provided in :param localconfig and add it to new keystore - :return: hexed public key, public key fingerprint + """Generate a new key with password provided in localconfig and add it to new keystore. + + Parameters + ---------- + localconfig + + Returns + ------- + hexed public key, public key fingerprint """ logging.info('Generating a new key in "' + localconfig['keystore'] + '"...') keystoredir = os.path.dirname(localconfig['keystore']) @@ -3599,9 +3734,7 @@ def genkeystore(localconfig): def get_cert_fingerprint(pubkey): - """ - Generate a certificate fingerprint the same way keytool does it - (but with slightly different formatting) + """Generate a certificate fingerprint the same way keytool does it (but with slightly different formatting). """ digest = hashlib.sha256(pubkey).digest() ret = [' '.join("%02X" % b for b in bytearray(digest))] @@ -3611,10 +3744,15 @@ def get_cert_fingerprint(pubkey): def get_certificate(signature_block_file): """Extracts a DER certificate from JAR Signature's "Signature Block File". - :param signature_block_file: file bytes (as string) representing the - certificate, as read directly out of the APK/ZIP + Parameters + ---------- + signature_block_file + file bytes (as string) representing the + certificate, as read directly out of the APK/ZIP - :return: A binary representation of the certificate's public key, + Returns + ------- + A binary representation of the certificate's public key, or None in case of error """ @@ -3635,7 +3773,10 @@ def get_certificate(signature_block_file): def load_stats_fdroid_signing_key_fingerprints(): """Load signing-key fingerprints stored in file generated by fdroid publish. - :returns: dict containing the signing-key fingerprints. + Returns + ------- + dict + containing the signing-key fingerprints. """ jar_file = os.path.join('stats', 'publishsigkeys.jar') if not os.path.isfile(jar_file): @@ -3661,15 +3802,20 @@ def load_stats_fdroid_signing_key_fingerprints(): def write_to_config(thisconfig, key, value=None, config_file=None): - '''write a key/value to the local config.yml or config.py + """Write a key/value to the local config.yml or config.py. NOTE: only supports writing string variables. - :param thisconfig: config dictionary - :param key: variable name in config to be overwritten/added - :param value: optional value to be written, instead of fetched + Parameters + ---------- + thisconfig + config dictionary + key + variable name in config to be overwritten/added + value + optional value to be written, instead of fetched from 'thisconfig' dictionary. - ''' + """ if value is None: origkey = key + '_orig' value = thisconfig[origkey] if origkey in thisconfig else thisconfig[key] @@ -3743,7 +3889,7 @@ def string_is_integer(string): def version_code_string_to_int(vercode): - """Convert an version code string of any base into an int""" + """Convert an version code string of any base into an int.""" try: return int(vercode, 0) except ValueError: @@ -3751,7 +3897,7 @@ def version_code_string_to_int(vercode): def get_app_display_name(app): - """get a human readable name for the app for logging and sorting + """Get a human readable name for the app for logging and sorting. When trying to find a localized name, this first tries en-US since that his the historical language used for sorting. @@ -3771,14 +3917,14 @@ def get_app_display_name(app): def local_rsync(options, fromdir, todir): - '''Rsync method for local to local copying of things + """Rsync method for local to local copying of things. This is an rsync wrapper with all the settings for safe use within the various fdroidserver use cases. This uses stricter rsync checking on all files since people using offline mode are already prioritizing security above ease and speed. - ''' + """ rsyncargs = ['rsync', '--recursive', '--safe-links', '--times', '--perms', '--one-file-system', '--delete', '--chmod=Da+rx,Fa-x,a+r,u+w'] if not options.no_checksum: @@ -3795,13 +3941,17 @@ def local_rsync(options, fromdir, todir): def deploy_build_log_with_rsync(appid, vercode, log_content): """Upload build log of one individual app build to an fdroid repository. - :param appid: package name for dientifying to which app this log belongs. - :param vercode: version of the app to which this build belongs. - :param log_content: Content of the log which is about to be posted. - Should be either a string or bytes. (bytes will - be decoded as 'utf-8') + Parameters + ---------- + appid + package name for dientifying to which app this log belongs. + vercode + version of the app to which this build belongs. + log_content + Content of the log which is about to be posted. + Should be either a string or bytes. (bytes will + be decoded as 'utf-8') """ - if not log_content: logging.warning(_('skip deploying full build logs: log content is empty')) return @@ -3823,8 +3973,7 @@ def deploy_build_log_with_rsync(appid, vercode, log_content): def rsync_status_file_to_repo(path, repo_subdir=None): - """Copy a build log or status JSON to the repo using rsync""" - + """Copy a build log or status JSON to the repo using rsync.""" if not config.get('deploy_process_logs', False): logging.debug(_('skip deploying full build logs: not enabled in config')) return @@ -3858,8 +4007,7 @@ def rsync_status_file_to_repo(path, repo_subdir=None): def get_per_app_repos(): - '''per-app repos are dirs named with the packageName of a single app''' - + """Per-app repos are dirs named with the packageName of a single app.""" # Android packageNames are Java packages, they may contain uppercase or # lowercase letters ('A' through 'Z'), numbers, and underscores # ('_'). However, individual package name parts may only start with @@ -3881,7 +4029,7 @@ def get_per_app_repos(): def is_repo_file(filename): - '''Whether the file in a repo is a build product to be delivered to users''' + """Whether the file in a repo is a build product to be delivered to users.""" if isinstance(filename, str): filename = filename.encode('utf-8', errors="surrogateescape") return os.path.isfile(filename) \ @@ -3903,7 +4051,7 @@ def is_repo_file(filename): def get_examples_dir(): - '''Return the dir where the fdroidserver example files are available''' + """Return the dir where the fdroidserver example files are available.""" examplesdir = None tmp = os.path.dirname(sys.argv[0]) if os.path.basename(tmp) == 'bin': @@ -3926,16 +4074,14 @@ def get_examples_dir(): def get_wiki_timestamp(timestamp=None): - """Return current time in the standard format for posting to the wiki""" - + """Return current time in the standard format for posting to the wiki.""" if timestamp is None: timestamp = time.gmtime() return time.strftime("%Y-%m-%d %H:%M:%SZ", timestamp) def get_android_tools_versions(): - '''get a list of the versions of all installed Android SDK/NDK components''' - + """Get a list of the versions of all installed Android SDK/NDK components.""" global config sdk_path = config['sdk_path'] if sdk_path[-1] != '/': @@ -3958,7 +4104,7 @@ def get_android_tools_versions(): def get_android_tools_version_log(): - '''get a list of the versions of all installed Android SDK/NDK components''' + """Get a list of the versions of all installed Android SDK/NDK components.""" log = '== Installed Android Tools ==\n\n' components = get_android_tools_versions() for name, version in sorted(components): @@ -3968,9 +4114,7 @@ def get_android_tools_version_log(): def get_git_describe_link(): - """Get a link to the current fdroiddata commit, to post to the wiki - - """ + """Get a link to the current fdroiddata commit, to post to the wiki.""" try: output = subprocess.check_output(['git', 'describe', '--always', '--dirty', '--abbrev=0'], universal_newlines=True).strip() @@ -4015,7 +4159,7 @@ def calculate_math_string(expr): def force_exit(exitvalue=0): - """force exit when thread operations could block the exit + """Force exit when thread operations could block the exit. The build command has to use some threading stuff to handle the timeout and locks. This seems to prevent the command from diff --git a/setup.cfg b/setup.cfg index 67e7581d..d8b88bc2 100644 --- a/setup.cfg +++ b/setup.cfg @@ -40,10 +40,16 @@ output_dir = locale domain = fdroidserver directory = locale -[pycodestyle] -ignore = E203,W503 -max-line-length = 88 - [flake8] ignore = E203,W503 max-line-length = 88 + +# Settings for docstrings linter +# we use numpy stlye https://numpydoc.readthedocs.io/en/latest/format.html +# ignored errors are +# * D10*: Missing docstring * +# * rest are the conventions which are ignored by numpy conventions according to http://www.pydocstyle.org/en/stable/error_codes.html +[pydocstyle] +#convention = numpy # cannot be used in combination with ignore, so we list rules seperately. +ignore = D100,D101,D102,D103,D104,D105,D106,D107,D203,D212,D213,D402,D413,D415,D416,D417,E203,W503 +max-line-length = 88 diff --git a/setup.py b/setup.py index 3e551e46..ad8129de 100755 --- a/setup.py +++ b/setup.py @@ -96,6 +96,7 @@ setup(name='fdroidserver', 'sphinx', 'numpydoc', 'pydata_sphinx_theme', + 'pydocstyle', ] }, classifiers=[ From 1e943a22df788306b748afb2da04a6ff2f2a75ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit+git@posteo.de> Date: Mon, 7 Jun 2021 12:26:57 +0200 Subject: [PATCH 0331/2116] rewrite docstrings to match numpy style guide --- .gitlab-ci.yml | 1 + fdroidserver/__main__.py | 10 +- fdroidserver/apksigcopier.py | 37 ++- .../asynchronousfilereader/__init__.py | 24 +- fdroidserver/build.py | 23 +- fdroidserver/checkupdates.py | 4 +- fdroidserver/common.py | 114 +++---- fdroidserver/deploy.py | 42 +-- fdroidserver/gpgsign.py | 3 +- fdroidserver/index.py | 90 +++--- fdroidserver/init.py | 2 +- fdroidserver/lint.py | 14 +- fdroidserver/metadata.py | 28 +- fdroidserver/mirror.py | 2 +- fdroidserver/net.py | 20 +- fdroidserver/publish.py | 44 +-- fdroidserver/scanner.py | 83 +++-- fdroidserver/signindex.py | 9 +- fdroidserver/tail.py | 74 +++-- fdroidserver/update.py | 283 +++++++++++------- fdroidserver/verify.py | 5 +- fdroidserver/vmtools.py | 43 ++- 22 files changed, 559 insertions(+), 396 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6df0145f..c7721931 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -425,6 +425,7 @@ Build documentation: image: python:3.9-buster script: - pip install -e .[docs] + - pydocstyle fdroidserver - cd docs - sphinx-apidoc -o ./source ../fdroidserver -M -e - sphinx-autogen -o generated source/*.rst diff --git a/fdroidserver/__main__.py b/fdroidserver/__main__.py index c07afb9d..555a2cff 100755 --- a/fdroidserver/__main__.py +++ b/fdroidserver/__main__.py @@ -69,9 +69,13 @@ def print_help(available_plugins=None): def preparse_plugin(module_name, module_dir): - """simple regex based parsing for plugin scripts, - so we don't have to import them when we just need the summary, - but not plan on executing this particular plugin.""" + """No summary. + + Simple regex based parsing for plugin scripts. + + So we don't have to import them when we just need the summary, + but not plan on executing this particular plugin. + """ if '.' in module_name: raise ValueError("No '.' allowed in fdroid plugin modules: '{}'" .format(module_name)) diff --git a/fdroidserver/apksigcopier.py b/fdroidserver/apksigcopier.py index f0db86d0..26a7b544 100644 --- a/fdroidserver/apksigcopier.py +++ b/fdroidserver/apksigcopier.py @@ -13,8 +13,7 @@ # # -- ; }}}1 -""" -copy/extract/patch apk signatures +"""Copy/extract/patch apk signatures. apksigcopier is a tool for copying APK signatures from a signed APK to an unsigned one (in order to verify reproducible builds). @@ -129,8 +128,7 @@ class APKZipInfo(ReproducibleZipInfo): def noautoyes(value): - """ - Turns False into NO, None into AUTO, and True into YES. + """Turn False into NO, None into AUTO, and True into YES. >>> from apksigcopier import noautoyes, NO, AUTO, YES >>> noautoyes(False) == NO == noautoyes(NO) @@ -152,7 +150,8 @@ def noautoyes(value): def is_meta(filename): - """ + """No summary. + Returns whether filename is a v1 (JAR) signature file (.SF), signature block file (.RSA, .DSA, or .EC), or manifest (MANIFEST.MF). @@ -162,7 +161,7 @@ def is_meta(filename): def exclude_from_copying(filename): - """fdroidserver always wants JAR Signature files to be excluded""" + """Fdroidserver always wants JAR Signature files to be excluded.""" return is_meta(filename) @@ -198,17 +197,17 @@ def exclude_from_copying(filename): # FIXME: makes certain assumptions and doesn't handle all valid ZIP files! def copy_apk(unsigned_apk, output_apk): - """ - Copy APK like apksigner would, excluding files matched by - exclude_from_copying(). - - Returns max date_time. + """Copy APK like apksigner would, excluding files matched by exclude_from_copying(). The following global variables (which default to False), can be set to override the default behaviour: * set exclude_all_meta=True to exclude all metadata files * set copy_extra_bytes=True to copy extra bytes after data (e.g. a v2 sig) + + Returns + ------- + max date_time. """ with zipfile.ZipFile(unsigned_apk, "r") as zf: infos = zf.infolist() @@ -410,9 +409,10 @@ def patch_v2_sig(extracted_v2_sig, output_apk): def patch_apk(extracted_meta, extracted_v2_sig, unsigned_apk, output_apk): - """ - Patch extracted_meta + extracted_v2_sig (if not None) onto unsigned_apk and - save as output_apk. + """Patch extracted_meta + extracted_v2_sig. + + Patches extracted_meta + extracted_v2_sig (if not None) + onto unsigned_apk and save as output_apk. """ date_time = copy_apk(unsigned_apk, output_apk) patch_meta(extracted_meta, output_apk, date_time=date_time) @@ -421,8 +421,7 @@ def patch_apk(extracted_meta, extracted_v2_sig, unsigned_apk, output_apk): def do_extract(signed_apk, output_dir, v1_only=NO): - """ - Extract signatures from signed_apk and save in output_dir. + """Extract signatures from signed_apk and save in output_dir. The v1_only parameter controls whether the absence of a v1 signature is considered an error or not: @@ -457,8 +456,7 @@ def do_extract(signed_apk, output_dir, v1_only=NO): def do_patch(metadata_dir, unsigned_apk, output_apk, v1_only=NO): - """ - Patch signatures from metadata_dir onto unsigned_apk and save as output_apk. + """Patch signatures from metadata_dir onto unsigned_apk and save as output_apk. The v1_only parameter controls whether the absence of a v1 signature is considered an error or not: @@ -498,8 +496,7 @@ def do_patch(metadata_dir, unsigned_apk, output_apk, v1_only=NO): def do_copy(signed_apk, unsigned_apk, output_apk, v1_only=NO): - """ - Copy signatures from signed_apk onto unsigned_apk and save as output_apk. + """Copy signatures from signed_apk onto unsigned_apk and save as output_apk. The v1_only parameter controls whether the absence of a v1 signature is considered an error or not: diff --git a/fdroidserver/asynchronousfilereader/__init__.py b/fdroidserver/asynchronousfilereader/__init__.py index e8aa35e5..9cdd7c91 100644 --- a/fdroidserver/asynchronousfilereader/__init__.py +++ b/fdroidserver/asynchronousfilereader/__init__.py @@ -1,9 +1,8 @@ -""" +"""Simple thread based asynchronous file reader for Python. + AsynchronousFileReader ====================== -Simple thread based asynchronous file reader for Python. - see https://github.com/soxofaan/asynchronousfilereader MIT License @@ -22,10 +21,9 @@ except ImportError: class AsynchronousFileReader(threading.Thread): - """ - Helper class to implement asynchronous reading of a file - in a separate thread. Pushes read lines on a queue to - be consumed in another thread. + """Helper class to implement asynchronous reading of a file in a separate thread. + + Pushes read lines on a queue to be consumed in another thread. """ def __init__(self, fd, queue=None, autostart=True): @@ -40,9 +38,7 @@ class AsynchronousFileReader(threading.Thread): self.start() def run(self): - """ - The body of the tread: read lines and put them on the queue. - """ + """Read lines and put them on the queue (the body of the tread).""" while True: line = self._fd.readline() if not line: @@ -50,15 +46,11 @@ class AsynchronousFileReader(threading.Thread): self.queue.put(line) def eof(self): - """ - Check whether there is no more content to expect. - """ + """Check whether there is no more content to expect.""" return not self.is_alive() and self.queue.empty() def readlines(self): - """ - Get currently available lines. - """ + """Get currently available lines.""" while not self.queue.empty(): yield self.queue.get() diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 2eead016..3afabca5 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -67,7 +67,6 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): target folder for the build result force """ - global buildserverid try: @@ -325,7 +324,7 @@ def force_gradle_build_tools(build_dir, build_tools): def transform_first_char(string, method): - """Uses method() on the first character of string.""" + """Use method() on the first character of string.""" if len(string) == 0: return string if len(string) == 1: @@ -338,11 +337,10 @@ def add_failed_builds_entry(failed_builds, appid, build, entry): def get_metadata_from_apk(app, build, apkfile): - """get the required metadata from the built APK + """Get the required metadata from the built APK. - versionName is allowed to be a blank string, i.e. '' + VersionName is allowed to be a blank string, i.e. '' """ - appid, versionCode, versionName = common.get_apk_id(apkfile) native_code = common.get_native_code(apkfile) @@ -833,8 +831,7 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext def trybuild(app, build, build_dir, output_dir, log_dir, also_check_dir, srclib_dir, extlib_dir, tmp_dir, repo_dir, vcs, test, server, force, onserver, refresh): - """ - Build a particular version of an application, if it needs building. + """Build a particular version of an application, if it needs building. Parameters ---------- @@ -857,7 +854,6 @@ def trybuild(app, build, build_dir, output_dir, log_dir, also_check_dir, Boolean True if the build was done, False if it wasn't necessary. """ - dest_file = common.get_release_filename(app, build) dest = os.path.join(output_dir, dest_file) @@ -890,7 +886,7 @@ def trybuild(app, build, build_dir, output_dir, log_dir, also_check_dir, def force_halt_build(timeout): - """Halt the currently running Vagrant VM, to be called from a Timer""" + """Halt the currently running Vagrant VM, to be called from a Timer.""" logging.error(_('Force halting build after {0} sec timeout!').format(timeout)) timeout_event.set() vm = vmtools.get_build_vm('builder') @@ -898,8 +894,13 @@ def force_halt_build(timeout): def parse_commandline(): - """Parse the command line. Returns options, parser.""" - + """Parse the command line. + + Returns + ------- + options + parser + """ parser = argparse.ArgumentParser(usage="%(prog)s [options] [APPID[:VERCODE] [APPID[:VERCODE] ...]]") common.setup_global_opts(parser) parser.add_argument("appid", nargs='*', help=_("application ID with optional versionCode in the form APPID[:VERCODE]")) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index d5a9bf17..94853369 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -363,6 +363,7 @@ def check_gplay(app): def try_init_submodules(app, last_build, vcs): """Try to init submodules if the last build entry used them. + They might have been removed from the app's repo in the meantime, so if we can't find any submodules we continue with the updates check. If there is any other error in initializing them then we stop the check. @@ -589,8 +590,7 @@ def checkupdates_app(app): def status_update_json(processed, failed): - """Output a JSON file with metadata about this run""" - + """Output a JSON file with metadata about this run.""" logging.debug(_('Outputting JSON')) output = common.setup_status_output(start_timestamp) if processed: diff --git a/fdroidserver/common.py b/fdroidserver/common.py index f40fea6a..174984e4 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -215,7 +215,7 @@ def _add_java_paths_to_config(pathlist, thisconfig): def fill_config_defaults(thisconfig): - """Fill in the global config dict with relevant defaults + """Fill in the global config dict with relevant defaults. For config values that have a path that can be expanded, e.g. an env var or a ~/, this will store the original value using "_orig" @@ -480,7 +480,6 @@ def parse_human_readable_size(size): def assert_config_keystore(config): """Check weather keystore is configured correctly and raise exception if not.""" - nosigningkey = False if 'repo_keyalias' not in config: nosigningkey = True @@ -507,7 +506,7 @@ def assert_config_keystore(config): def find_apksigner(config): - """Searches for the best version apksigner and adds it to the config. + """Search for the best version apksigner and adds it to the config. Returns the best version of apksigner following this algorithm: @@ -643,7 +642,8 @@ def get_local_metadata_files(): def read_pkg_args(appid_versionCode_pairs, allow_vercodes=False): - """ + """No summary. + Parameters ---------- appids @@ -780,8 +780,7 @@ apk_release_filename_with_sigfp = re.compile(r'(?P[a-zA-Z0-9_\.]+)_(?P from the APK. @@ -2700,8 +2707,10 @@ def get_apk_id_aapt(apkfile): def get_native_code(apkfile): - """aapt checks if there are architecture folders under the lib/ folder - so we are simulating the same behaviour""" + """Aapt checks if there are architecture folders under the lib/ folder. + + We are simulating the same behaviour. + """ arch_re = re.compile("^lib/(.*)/.*$") archset = set() with ZipFile(apkfile) as apk: @@ -3110,7 +3119,7 @@ def metadata_get_sigdir(appid, vercode=None): def metadata_find_developer_signature(appid, vercode=None): - """Tries to find the developer signature for given appid. + """Try to find the developer signature for given appid. This picks the first signature file found in metadata an returns its signature. @@ -3148,7 +3157,7 @@ def metadata_find_developer_signature(appid, vercode=None): def metadata_find_signing_files(appid, vercode): - """Gets a list of signed manifests and signatures. + """Get a list of signed manifests and signatures. Parameters ---------- @@ -3166,7 +3175,6 @@ def metadata_find_signing_files(appid, vercode): References ---------- - * https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html * https://source.android.com/security/apksigning/v2 * https://source.android.com/security/apksigning/v3 @@ -3219,6 +3227,7 @@ class ClonedZipInfo(zipfile.ZipInfo): cloning ZipInfo entries. https://bugs.python.org/issue43547 """ + def __init__(self, zinfo): self.original = zinfo for k in self.__slots__: @@ -3243,7 +3252,7 @@ def apk_has_v1_signatures(apkfile): def apk_strip_v1_signatures(signed_apk, strip_manifest=False): - """Removes signatures from APK. + """Remove signatures from APK. Parameters ---------- @@ -3283,7 +3292,7 @@ def _zipalign(unsigned_apk, aligned_apk): def apk_implant_signatures(apkpath, outpath, manifest): - """Implants a signature from metadata into an APK. + """Implant a signature from metadata into an APK. Note: this changes there supplied APK in place. So copy it if you need the original to be preserved. @@ -3297,7 +3306,6 @@ def apk_implant_signatures(apkpath, outpath, manifest): References ---------- - * https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html * https://source.android.com/security/apksigning/v2 * https://source.android.com/security/apksigning/v3 @@ -3308,7 +3316,7 @@ def apk_implant_signatures(apkpath, outpath, manifest): def apk_extract_signatures(apkpath, outdir): - """Extracts a signature files from APK and puts them into target directory. + """Extract a signature files from APK and puts them into target directory. Parameters ---------- @@ -3319,7 +3327,6 @@ def apk_extract_signatures(apkpath, outdir): References ---------- - * https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html * https://source.android.com/security/apksigning/v2 * https://source.android.com/security/apksigning/v3 @@ -3329,9 +3336,9 @@ def apk_extract_signatures(apkpath, outdir): def get_min_sdk_version(apk): - """ - This wraps the androguard function to always return and int and fall back to 1 - if we can't get a valid minsdk version + """Wrap the androguard function to always return and int. + + Fall back to 1 if we can't get a valid minsdk version. Parameters ---------- @@ -3450,7 +3457,7 @@ def verify_apks(signed_apk, unsigned_apk, tmp_dir, v1_only=None): def verify_jar_signature(jar): - """Verifies the signature of a given JAR file. + """Verify the signature of a given JAR file. jarsigner is very shitty: unsigned JARs pass as "verified"! So this has to turn on -strict then check for result 4, since this @@ -3627,8 +3634,9 @@ def compare_apks(apk1, apk2, tmp_dir, log_dir=None): def set_command_in_config(command): - """Try to find specified command in the path, if it hasn't been - manually set in config.yml. If found, it is added to the config + """Try to find specified command in the path, if it hasn't been manually set in config.yml. + + If found, it is added to the config dict. The return value says whether the command is available. """ @@ -3734,15 +3742,14 @@ def genkeystore(localconfig): def get_cert_fingerprint(pubkey): - """Generate a certificate fingerprint the same way keytool does it (but with slightly different formatting). - """ + """Generate a certificate fingerprint the same way keytool does it (but with slightly different formatting).""" digest = hashlib.sha256(pubkey).digest() ret = [' '.join("%02X" % b for b in bytearray(digest))] return " ".join(ret) def get_certificate(signature_block_file): - """Extracts a DER certificate from JAR Signature's "Signature Block File". + """Extract a DER certificate from JAR Signature's "Signature Block File". Parameters ---------- @@ -4194,7 +4201,7 @@ def run_yamllint(path, indent=0): def sha256sum(filename): - '''Calculate the sha256 of the given file''' + """Calculate the sha256 of the given file.""" sha = hashlib.sha256() with open(filename, 'rb') as f: while True: @@ -4206,7 +4213,7 @@ def sha256sum(filename): def sha256base64(filename): - '''Calculate the sha256 of the given file as URL-safe base64''' + """Calculate the sha256 of the given file as URL-safe base64.""" hasher = hashlib.sha256() with open(filename, 'rb') as f: while True: @@ -4218,7 +4225,7 @@ def sha256base64(filename): def get_ndk_version(ndk_path): - """Get the version info from the metadata in the NDK package + """Get the version info from the metadata in the NDK package. Since r11, the info is nice and easy to find in sources.properties. Before, there was a kludgey format in @@ -4238,7 +4245,7 @@ def get_ndk_version(ndk_path): def auto_install_ndk(build): - """auto-install the NDK in the build, this assumes its in a buildserver guest VM + """Auto-install the NDK in the build, this assumes its in a buildserver guest VM. Download, verify, and install the NDK version as specified via the "ndk:" field in the build entry. As it uncompresses the zipball, @@ -4276,11 +4283,10 @@ def auto_install_ndk(build): def _install_ndk(ndk): - """Install specified NDK if it is not already installed + """Install specified NDK if it is not already installed. Parameters ---------- - ndk The NDK version to install, either in "release" form (r21e) or "revision" form (21.4.7075529). diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index f228edb2..1af9b07d 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -47,14 +47,13 @@ REMOTE_HOSTNAME_REGEX = re.compile(r'\W*\w+\W+(\w+).*') def update_awsbucket(repo_section): - ''' - Upload the contents of the directory `repo_section` (including - subdirectories) to the AWS S3 "bucket". The contents of that subdir of the + """Upload the contents of the directory `repo_section` (including subdirectories) to the AWS S3 "bucket". + + The contents of that subdir of the bucket will first be deleted. Requires AWS credentials set in config.yml: awsaccesskeyid, awssecretkey - ''' - + """ logging.debug('Syncing "' + repo_section + '" to Amazon S3 bucket "' + config['awsbucket'] + '"') @@ -65,7 +64,7 @@ def update_awsbucket(repo_section): def update_awsbucket_s3cmd(repo_section): - '''upload using the CLI tool s3cmd, which provides rsync-like sync + """Upload using the CLI tool s3cmd, which provides rsync-like sync. The upload is done in multiple passes to reduce the chance of interfering with an existing client-server interaction. In the @@ -74,8 +73,7 @@ def update_awsbucket_s3cmd(repo_section): the third/last pass, the indexes are uploaded, and any removed files are deleted from the server. The last pass is the only pass to use a full MD5 checksum of all files to detect changes. - ''' - + """ logging.debug(_('Using s3cmd to sync with: {url}') .format(url=config['awsbucket'])) @@ -142,14 +140,16 @@ def update_awsbucket_s3cmd(repo_section): def update_awsbucket_libcloud(repo_section): - ''' + """No summary. + Upload the contents of the directory `repo_section` (including - subdirectories) to the AWS S3 "bucket". The contents of that subdir of the + subdirectories) to the AWS S3 "bucket". + + The contents of that subdir of the bucket will first be deleted. Requires AWS credentials set in config.yml: awsaccesskeyid, awssecretkey - ''' - + """ logging.debug(_('using Apache libcloud to sync with {url}') .format(url=config['awsbucket'])) @@ -280,14 +280,14 @@ def update_serverwebroot(serverwebroot, repo_section): def sync_from_localcopy(repo_section, local_copy_dir): - '''Syncs the repo from "local copy dir" filesystem to this box + """Sync the repo from "local copy dir" filesystem to this box. In setups that use offline signing, this is the last step that syncs the repo from the "local copy dir" e.g. a thumb drive to the repo on the local filesystem. That local repo is then used to push to all the servers that are configured. - ''' + """ logging.info('Syncing from local_copy_dir to this repo.') # trailing slashes have a meaning in rsync which is not needed here, so # make sure both paths have exactly one trailing slash @@ -302,13 +302,13 @@ def sync_from_localcopy(repo_section, local_copy_dir): def update_localcopy(repo_section, local_copy_dir): - '''copy data from offline to the "local copy dir" filesystem + """Copy data from offline to the "local copy dir" filesystem. This updates the copy of this repo used to shuttle data from an offline signing machine to the online machine, e.g. on a thumb drive. - ''' + """ # local_copy_dir is guaranteed to have a trailing slash in main() below common.local_rsync(options, repo_section, local_copy_dir) @@ -319,7 +319,7 @@ def update_localcopy(repo_section, local_copy_dir): def _get_size(start_path='.'): - '''get size of all files in a dir https://stackoverflow.com/a/1392549''' + """Get size of all files in a dir https://stackoverflow.com/a/1392549.""" total_size = 0 for root, dirs, files in os.walk(start_path): for f in files: @@ -329,7 +329,7 @@ def _get_size(start_path='.'): def update_servergitmirrors(servergitmirrors, repo_section): - '''update repo mirrors stored in git repos + """Update repo mirrors stored in git repos. This is a hack to use public git repos as F-Droid repos. It recreates the git repo from scratch each time, so that there is no @@ -339,7 +339,7 @@ def update_servergitmirrors(servergitmirrors, repo_section): For history, there is the archive section, and there is the binary transparency log. - ''' + """ import git from clint.textui import progress if config.get('local_copy_dir') \ @@ -623,7 +623,7 @@ def upload_apk_to_virustotal(virustotal_apikey, packageName, apkName, hash, def push_binary_transparency(git_repo_path, git_remote): - '''push the binary transparency git repo to the specifed remote. + """Push the binary transparency git repo to the specifed remote. If the remote is a local directory, make sure it exists, and is a git repo. This is used to move this git repo from an offline @@ -636,7 +636,7 @@ def push_binary_transparency(git_repo_path, git_remote): case, git_remote is a dir on the local file system, e.g. a thumb drive. - ''' + """ import git logging.info(_('Pushing binary transparency log to {url}') diff --git a/fdroidserver/gpgsign.py b/fdroidserver/gpgsign.py index b6ee8fb7..d5d92c6d 100644 --- a/fdroidserver/gpgsign.py +++ b/fdroidserver/gpgsign.py @@ -33,8 +33,7 @@ start_timestamp = time.gmtime() def status_update_json(signed): - """Output a JSON file with metadata about this run""" - + """Output a JSON file with metadata about this run.""" logging.debug(_('Outputting JSON')) output = common.setup_status_output(start_timestamp) if signed: diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 1f30bd48..270771fd 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -49,12 +49,18 @@ def make(apps, apks, repodir, archive): This requires properly initialized options and config objects. - :param apps: OrderedDict of apps to go into the index, each app should have - at least one associated apk - :param apks: list of apks to go into the index - :param repodir: the repo directory - :param archive: True if this is the archive repo, False if it's the - main one. + Parameters + ---------- + apps + OrderedDict of apps to go into the index, each app should have + at least one associated apk + apks + list of apks to go into the index + repodir + the repo directory + archive + True if this is the archive repo, False if it's the + main one. """ from fdroidserver.update import METADATA_VERSION @@ -583,12 +589,16 @@ def _copy_to_local_copy_dir(repodir, f): def v1_sort_packages(packages, fdroid_signing_key_fingerprints): - """Sorts the supplied list to ensure a deterministic sort order for - package entries in the index file. This sort-order also expresses + """Sort the supplied list to ensure a deterministic sort order for package entries in the index file. + + This sort-order also expresses installation preference to the clients. (First in this list = first to install) - :param packages: list of packages which need to be sorted before but into index file. + Parameters + ---------- + packages + list of packages which need to be sorted before but into index file. """ GROUP_DEV_SIGNED = 1 GROUP_FDROID_SIGNED = 2 @@ -618,10 +628,7 @@ def v1_sort_packages(packages, fdroid_signing_key_fingerprints): def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fingerprints): - """ - aka index.jar aka index.xml - """ - + """Aka index.jar aka index.xml.""" doc = Document() def addElement(name, value, doc, parent): @@ -641,7 +648,7 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing addElement(name, value, doc, parent) def addElementCheckLocalized(name, app, key, doc, parent, default=''): - """Fill in field from metadata or localized block + """Fill in field from metadata or localized block. For name/summary/description, they can come only from the app source, or from a dir in fdroiddata. They can be entirely missing from the @@ -652,7 +659,6 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing alpha- sort order. """ - el = doc.createElement(name) value = app.get(key) lkey = key[:1].lower() + key[1:] @@ -965,9 +971,12 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing def extract_pubkey(): - """ - Extracts and returns the repository's public key from the keystore. - :return: public key in hex, repository fingerprint + """Extract and return the repository's public key from the keystore. + + Returns + ------- + public key in hex + repository fingerprint """ if 'repo_pubkey' in common.config: pubkey = unhexlify(common.config['repo_pubkey']) @@ -991,7 +1000,7 @@ def extract_pubkey(): def get_mirror_service_urls(url): - '''Get direct URLs from git service for use by fdroidclient + """Get direct URLs from git service for use by fdroidclient. Via 'servergitmirrors', fdroidserver can create and push a mirror to certain well known git services like gitlab or github. This @@ -999,8 +1008,7 @@ def get_mirror_service_urls(url): branch in git. The files are then accessible via alternate URLs, where they are served in their raw format via a CDN rather than from git. - ''' - + """ if url.startswith('git@'): url = re.sub(r'^git@([^:]+):(.+)', r'https://\1/\2', url) @@ -1038,15 +1046,19 @@ def get_mirror_service_urls(url): def download_repo_index(url_str, etag=None, verify_fingerprint=True, timeout=600): - """Downloads and verifies index file, then returns its data. + """Download and verifies index file, then returns its data. Downloads the repository index from the given :param url_str and verifies the repository's fingerprint if :param verify_fingerprint is not False. - :raises: VerificationException() if the repository could not be verified + Raises + ------ + VerificationException() if the repository could not be verified - :return: A tuple consisting of: + Returns + ------- + A tuple consisting of: - The index in JSON format or None if the index did not change - The new eTag as returned by the HTTP request @@ -1077,15 +1089,18 @@ def download_repo_index(url_str, etag=None, verify_fingerprint=True, timeout=600 def get_index_from_jar(jarfile, fingerprint=None): - """Returns the data, public key, and fingerprint from index-v1.jar + """Return the data, public key, and fingerprint from index-v1.jar. - :param fingerprint is the SHA-256 fingerprint of signing key. Only - hex digits count, all other chars will can be discarded. + Parameters + ---------- + fingerprint is the SHA-256 fingerprint of signing key. Only + hex digits count, all other chars will can be discarded. - :raises: VerificationException() if the repository could not be verified + Raises + ------ + VerificationException() if the repository could not be verified """ - logging.debug(_('Verifying index signature:')) common.verify_jar_signature(jarfile) with zipfile.ZipFile(jarfile) as jar: @@ -1099,13 +1114,20 @@ def get_index_from_jar(jarfile, fingerprint=None): def get_public_key_from_jar(jar): - """ - Get the public key and its fingerprint from a JAR file. + """Get the public key and its fingerprint from a JAR file. - :raises: VerificationException() if the JAR was not signed exactly once + Raises + ------ + VerificationException() if the JAR was not signed exactly once - :param jar: a zipfile.ZipFile object - :return: the public key from the jar and its fingerprint + Parameters + ---------- + jar + a zipfile.ZipFile object + + Returns + ------- + the public key from the jar and its fingerprint """ # extract certificate from jar certs = [n for n in jar.namelist() if common.SIGNATURE_BLOCK_FILE_REGEX.match(n)] diff --git a/fdroidserver/init.py b/fdroidserver/init.py index c1230d9c..6f6f8c38 100644 --- a/fdroidserver/init.py +++ b/fdroidserver/init.py @@ -36,7 +36,7 @@ options = None def disable_in_config(key, value): - '''write a key/value to the local config.yml, then comment it out''' + """Write a key/value to the local config.yml, then comment it out.""" import yaml with open('config.yml') as f: data = f.read() diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 964275dd..90b8b0e8 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -249,7 +249,11 @@ def get_lastbuild(builds): def check_update_check_data_url(app): +<<<<<<< HEAD """UpdateCheckData must have a valid HTTPS URL to protect checkupdates runs""" +======= + """UpdateCheckData must have a valid HTTPS URL to protect checkupdates runs.""" +>>>>>>> c380427b (rewrite docstrings to match numpy style guide) if app.UpdateCheckData and app.UpdateCheckMode == 'HTTP': urlcode, codeex, urlver, verex = app.UpdateCheckData.split('|') for url in (urlcode, urlver): @@ -503,7 +507,7 @@ def check_format(app): def check_license_tag(app): - '''Ensure all license tags contain only valid/approved values''' + """Ensure all license tags contain only valid/approved values.""" if config['lint_licenses'] is None: return if app.License not in config['lint_licenses']: @@ -555,8 +559,7 @@ def check_extlib_dir(apps): def check_app_field_types(app): - """Check the fields have valid data types""" - + """Check the fields have valid data types.""" for field in app.keys(): v = app.get(field) t = metadata.fieldtype(field) @@ -599,7 +602,7 @@ def check_app_field_types(app): def check_for_unsupported_metadata_files(basedir=""): - """Checks whether any non-metadata files are in metadata/""" + """Check whether any non-metadata files are in metadata/.""" basedir = Path(basedir) global config @@ -633,8 +636,7 @@ def check_for_unsupported_metadata_files(basedir=""): def check_current_version_code(app): - """Check that the CurrentVersionCode is currently available""" - + """Check that the CurrentVersionCode is currently available.""" archive_policy = app.get('ArchivePolicy') if archive_policy and archive_policy.split()[0] == "0": return diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 59b15472..320350eb 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -44,7 +44,7 @@ VALID_USERNAME_REGEX = re.compile(r'^[a-z\d](?:[a-z\d/._-]){0,38}$', re.IGNORECA def _warn_or_exception(value, cause=None): - '''output warning or Exception depending on -W''' + """Output warning or Exception depending on -W.""" if warnings_action == 'ignore': pass elif warnings_action == 'error': @@ -326,7 +326,7 @@ class Build(dict): return 'ant' def ndk_path(self): - """Returns the path to the first configured NDK or an empty string""" + """Return the path to the first configured NDK or an empty string.""" ndk = self.ndk if isinstance(ndk, list): ndk = self.ndk[0] @@ -368,8 +368,7 @@ def flagtype(name): class FieldValidator(): - """ - Designates App metadata field types and checks that it matches + """Designate App metadata field types and checks that it matches. 'name' - The long name of the field type 'matching' - List of possible values or regex expression @@ -545,7 +544,7 @@ def read_srclibs(): def read_metadata(appids={}, sort_by_time=False): - """Return a list of App instances sorted newest first + """Return a list of App instances sorted newest first. This reads all of the metadata files in a 'data' repository, then builds a list of App instances from those files. The list is @@ -555,7 +554,6 @@ def read_metadata(appids={}, sort_by_time=False): appids is a dict with appids a keys and versionCodes as values. """ - # Always read the srclibs before the apps, since they can use a srlib as # their source repository. read_srclibs() @@ -723,7 +721,7 @@ def _decode_bool(s): def parse_metadata(metadatapath): - """parse metadata file, also checking the source repo for .fdroid.yml + """Parse metadata file, also checking the source repo for .fdroid.yml. If this is a metadata file from fdroiddata, it will first load the source repo type and URL from fdroiddata, then read .fdroid.yml if @@ -777,7 +775,7 @@ def parse_metadata(metadatapath): def parse_yaml_metadata(mf, app): - """Parse the .yml file and post-process it + """Parse the .yml file and post-process it. Clean metadata .yml files can be used directly, but in order to make a better user experience for people editing .yml files, there @@ -787,7 +785,6 @@ def parse_yaml_metadata(mf, app): overall process. """ - try: yamldata = yaml.load(mf, Loader=SafeLoader) except yaml.YAMLError as e: @@ -836,7 +833,7 @@ def parse_yaml_metadata(mf, app): def post_parse_yaml_metadata(yamldata): - """transform yaml metadata to our internal data format""" + """Transform yaml metadata to our internal data format.""" for build in yamldata.get('Builds', []): for flag in build.keys(): _flagtype = flagtype(flag) @@ -859,10 +856,13 @@ def post_parse_yaml_metadata(yamldata): def write_yaml(mf, app): """Write metadata in yaml format. - :param mf: active file discriptor for writing - :param app: app metadata to written to the yaml file + Parameters + ---------- + mf + active file discriptor for writing + app + app metadata to written to the yaml file """ - # import rumael.yaml and check version try: import ruamel.yaml @@ -992,6 +992,6 @@ def write_metadata(metadatapath, app): def add_metadata_arguments(parser): - '''add common command line flags related to metadata processing''' + """Add common command line flags related to metadata processing.""" parser.add_argument("-W", choices=['error', 'warn', 'ignore'], default='error', help=_("force metadata errors (default) to be warnings, or to be ignored.")) diff --git a/fdroidserver/mirror.py b/fdroidserver/mirror.py index 89da89f8..c34bd9a2 100644 --- a/fdroidserver/mirror.py +++ b/fdroidserver/mirror.py @@ -75,7 +75,7 @@ def main(): fingerprint = urllib.parse.parse_qs(query).get('fingerprint') def _append_to_url_path(*args): - '''Append the list of path components to URL, keeping the rest the same''' + """Append the list of path components to URL, keeping the rest the same.""" newpath = posixpath.join(path, *args) return urllib.parse.urlunparse((scheme, hostname, newpath, params, query, fragment)) diff --git a/fdroidserver/net.py b/fdroidserver/net.py index 3f497999..b914d5b6 100644 --- a/fdroidserver/net.py +++ b/fdroidserver/net.py @@ -38,16 +38,22 @@ def download_file(url, local_filename=None, dldir='tmp'): def http_get(url, etag=None, timeout=600): - """ - Downloads the content from the given URL by making a GET request. + """Download the content from the given URL by making a GET request. If an ETag is given, it will do a HEAD request first, to see if the content changed. - :param url: The URL to download from. - :param etag: The last ETag to be used for the request (optional). - :return: A tuple consisting of: - - The raw content that was downloaded or None if it did not change - - The new eTag as returned by the HTTP request + Parameters + ---------- + url + The URL to download from. + etag + The last ETag to be used for the request (optional). + + Returns + ------- + A tuple consisting of: + - The raw content that was downloaded or None if it did not change + - The new eTag as returned by the HTTP request """ # TODO disable TLS Session IDs and TLS Session Tickets # (plain text cookie visible to anyone who can see the network traffic) diff --git a/fdroidserver/publish.py b/fdroidserver/publish.py index deb954ce..d0f6f54b 100644 --- a/fdroidserver/publish.py +++ b/fdroidserver/publish.py @@ -45,7 +45,6 @@ start_timestamp = time.gmtime() def publish_source_tarball(apkfilename, unsigned_dir, output_dir): """Move the source tarball into the output directory...""" - tarfilename = apkfilename[:-4] + '_src.tar.gz' tarfile = os.path.join(unsigned_dir, tarfilename) if os.path.exists(tarfile): @@ -56,7 +55,9 @@ def publish_source_tarball(apkfilename, unsigned_dir, output_dir): def key_alias(appid): - """Get the alias which F-Droid uses to indentify the singing key + """No summary. + + Get the alias which F-Droid uses to indentify the singing key for this App in F-Droids keystore. """ if config and 'keyaliases' in config and appid in config['keyaliases']: @@ -74,9 +75,7 @@ def key_alias(appid): def read_fingerprints_from_keystore(): - """Obtain a dictionary containing all singning-key fingerprints which - are managed by F-Droid, grouped by appid. - """ + """Obtain a dictionary containing all singning-key fingerprints which are managed by F-Droid, grouped by appid.""" env_vars = {'LC_ALL': 'C.UTF-8', 'FDROID_KEY_STORE_PASS': config['keystorepass']} cmd = [config['keytool'], '-list', @@ -101,8 +100,9 @@ def read_fingerprints_from_keystore(): def sign_sig_key_fingerprint_list(jar_file): - """sign the list of app-signing key fingerprints which is - used primaryily by fdroid update to determine which APKs + """Sign the list of app-signing key fingerprints. + + This is used primaryily by fdroid update to determine which APKs where built and signed by F-Droid and which ones were manually added by users. """ @@ -125,6 +125,7 @@ def sign_sig_key_fingerprint_list(jar_file): def store_stats_fdroid_signing_key_fingerprints(appids, indent=None): """Store list of all signing-key fingerprints for given appids to HD. + This list will later on be needed by fdroid update. """ if not os.path.exists('stats'): @@ -143,8 +144,7 @@ def store_stats_fdroid_signing_key_fingerprints(appids, indent=None): def status_update_json(generatedKeys, signedApks): - """Output a JSON file with metadata about this run""" - + """Output a JSON file with metadata about this run.""" logging.debug(_('Outputting JSON')) output = common.setup_status_output(start_timestamp) output['apksigner'] = shutil.which(config.get('apksigner', '')) @@ -158,8 +158,8 @@ def status_update_json(generatedKeys, signedApks): def check_for_key_collisions(allapps): - """ - Make sure there's no collision in keyaliases from apps. + """Make sure there's no collision in keyaliases from apps. + It was suggested at https://dev.guardianproject.info/projects/bazaar/wiki/FDroid_Audit that a package could be crafted, such that it would use the same signing @@ -168,9 +168,16 @@ def check_for_key_collisions(allapps): the colliding ID would be something that would be a) a valid package ID, and b) a sane-looking ID that would make its way into the repo. Nonetheless, to be sure, before publishing we check that there are no - collisions, and refuse to do any publishing if that's the case... - :param allapps a dict of all apps to process - :return: a list of all aliases corresponding to allapps + collisions, and refuse to do any publishing if that's the case. + + Parameters + ---------- + allapps + a dict of all apps to process + + Returns + ------- + a list of all aliases corresponding to allapps """ allaliases = [] for appid in allapps: @@ -185,9 +192,12 @@ def check_for_key_collisions(allapps): def create_key_if_not_existing(keyalias): - """ - Ensures a signing key with the given keyalias exists - :return: boolean, True if a new key was created, false otherwise + """Ensure a signing key with the given keyalias exists. + + Returns + ------- + boolean + True if a new key was created, False otherwise """ # See if we already have a key for this application, and # if not generate one... diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 6479a43c..5f5bff97 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -104,7 +104,7 @@ def get_gradle_compile_commands(build): def scan_binary(apkfile): - """Scan output of apkanalyzer for known non-free classes + """Scan output of apkanalyzer for known non-free classes. apkanalyzer produces useful output when it can run, but it does not support all recent JDK versions, and also some DEX versions, @@ -112,7 +112,6 @@ def scan_binary(apkfile): to run without exiting with an error. """ - logging.info(_('Scanning APK with apkanalyzer for known non-free classes.')) result = common.SdkToolsPopen(["apkanalyzer", "dex", "packages", "--defined-only", apkfile], output=False) if result.returncode != 0: @@ -130,10 +129,12 @@ def scan_binary(apkfile): def scan_source(build_dir, build=metadata.Build()): - """Scan the source code in the given directory (and all subdirectories) - and return the number of fatal problems encountered + """Scan the source code in the given directory (and all subdirectories). + + Returns + ------- + the number of fatal problems encountered. """ - count = 0 allowlisted = [ @@ -193,10 +194,18 @@ def scan_source(build_dir, build=metadata.Build()): return False def ignoreproblem(what, path_in_build_dir): - """ - :param what: string describing the problem, will be printed in log messages - :param path_in_build_dir: path to the file relative to `build`-dir - "returns: 0 as we explicitly ignore the file, so don't count an error + """No summary. + + Parameters + ---------- + what: string + describing the problem, will be printed in log messages + path_in_build_dir + path to the file relative to `build`-dir + + Returns + ------- + 0 as we explicitly ignore the file, so don't count an error """ msg = ('Ignoring %s at %s' % (what, path_in_build_dir)) logging.info(msg) @@ -205,11 +214,20 @@ def scan_source(build_dir, build=metadata.Build()): return 0 def removeproblem(what, path_in_build_dir, filepath): - """ - :param what: string describing the problem, will be printed in log messages - :param path_in_build_dir: path to the file relative to `build`-dir - :param filepath: Path (relative to our current path) to the file - "returns: 0 as we deleted the offending file + """No summary. + + Parameters + ---------- + what: string + describing the problem, will be printed in log messages + path_in_build_dir + path to the file relative to `build`-dir + filepath + Path (relative to our current path) to the file + + Returns + ------- + 0 as we deleted the offending file """ msg = ('Removing %s at %s' % (what, path_in_build_dir)) logging.info(msg) @@ -225,10 +243,18 @@ def scan_source(build_dir, build=metadata.Build()): return 0 def warnproblem(what, path_in_build_dir): - """ - :param what: string describing the problem, will be printed in log messages - :param path_in_build_dir: path to the file relative to `build`-dir - :returns: 0, as warnings don't count as errors + """No summary. + + Parameters + ---------- + what: string + describing the problem, will be printed in log messages + path_in_build_dir + path to the file relative to `build`-dir + + Returns + ------- + 0, as warnings don't count as errors """ if toignore(path_in_build_dir): return 0 @@ -238,13 +264,22 @@ def scan_source(build_dir, build=metadata.Build()): return 0 def handleproblem(what, path_in_build_dir, filepath): - """Dispatches to problem handlers (ignore, delete, warn) or returns 1 - for increasing the error count + """Dispatches to problem handlers (ignore, delete, warn). + + Or returns 1 for increasing the error count. - :param what: string describing the problem, will be printed in log messages - :param path_in_build_dir: path to the file relative to `build`-dir - :param filepath: Path (relative to our current path) to the file - :returns: 0 if the problem was ignored/deleted/is only a warning, 1 otherwise + Parameters + ---------- + what: string + describing the problem, will be printed in log messages + path_in_build_dir + path to the file relative to `build`-dir + filepath + Path (relative to our current path) to the file + + Returns + ------- + 0 if the problem was ignored/deleted/is only a warning, 1 otherwise """ if toignore(path_in_build_dir): return ignoreproblem(what, path_in_build_dir) diff --git a/fdroidserver/signindex.py b/fdroidserver/signindex.py index a993ae73..3b1f671e 100644 --- a/fdroidserver/signindex.py +++ b/fdroidserver/signindex.py @@ -32,8 +32,7 @@ start_timestamp = time.gmtime() def sign_jar(jar): - """ - Sign a JAR file with Java's jarsigner. + """Sign a JAR file with Java's jarsigner. This method requires a properly initialized config object. @@ -60,8 +59,7 @@ def sign_jar(jar): def sign_index_v1(repodir, json_name): - """ - Sign index-v1.json to make index-v1.jar + """Sign index-v1.json to make index-v1.jar. This is a bit different than index.jar: instead of their being index.xml and index_unsigned.jar, the presence of index-v1.json means that there is @@ -78,8 +76,7 @@ def sign_index_v1(repodir, json_name): def status_update_json(signed): - """Output a JSON file with metadata about this run""" - + """Output a JSON file with metadata about this run.""" logging.debug(_('Outputting JSON')) output = common.setup_status_output(start_timestamp) if signed: diff --git a/fdroidserver/tail.py b/fdroidserver/tail.py index 1f64e5df..6026b0b0 100644 --- a/fdroidserver/tail.py +++ b/fdroidserver/tail.py @@ -1,23 +1,24 @@ #!/usr/bin/env python -''' -Python-Tail - Unix tail follow implementation in Python. +"""Python-Tail - Unix tail follow implementation in Python. python-tail can be used to monitor changes to a file. -Example: - import tail - - # Create a tail instance - t = tail.Tail('file-to-be-followed') - - # Register a callback function to be called when a new line is found in the followed file. - # If no callback function is registerd, new lines would be printed to standard out. - t.register_callback(callback_function) - - # Follow the file with 5 seconds as sleep time between iterations. - # If sleep time is not provided 1 second is used as the default time. - t.follow(s=5) ''' +Example +------- +>>> import tail +>>> +>>> # Create a tail instance +>>> t = tail.Tail('file-to-be-followed') +>>> +>>> # Register a callback function to be called when a new line is found in the followed file. +>>> # If no callback function is registerd, new lines would be printed to standard out. +>>> t.register_callback(callback_function) +>>> +>>> # Follow the file with 5 seconds as sleep time between iterations. +>>> # If sleep time is not provided 1 second is used as the default time. +>>> t.follow(s=5) +""" # Author - Kasun Herath # Source - https://github.com/kasun/python-tail @@ -32,42 +33,49 @@ import threading class Tail(object): - ''' Represents a tail command. ''' + """Represents a tail command.""" def __init__(self, tailed_file): - ''' Initiate a Tail instance. - Check for file validity, assigns callback function to standard out. + """Initiate a Tail instance. - Arguments: - tailed_file - File to be followed. ''' + Check for file validity, assigns callback function to standard out. + Parameters + ---------- + tailed_file + File to be followed. + """ self.check_file_validity(tailed_file) self.tailed_file = tailed_file self.callback = sys.stdout.write self.t_stop = threading.Event() def start(self, s=1): - '''Start tailing a file in a background thread. - - Arguments: - s - Number of seconds to wait between each iteration; Defaults to 3. - ''' + """Start tailing a file in a background thread. + Parameters + ---------- + s + Number of seconds to wait between each iteration; Defaults to 3. + """ t = threading.Thread(target=self.follow, args=(s,)) t.start() def stop(self): - '''Stop a background tail. - ''' + """Stop a background tail.""" self.t_stop.set() def follow(self, s=1): - ''' Do a tail follow. If a callback function is registered it is called with every new line. + """Do a tail follow. + + If a callback function is registered it is called with every new line. Else printed to standard out. - Arguments: - s - Number of seconds to wait between each iteration; Defaults to 1. ''' - + Parameters + ---------- + s + Number of seconds to wait between each iteration; Defaults to 1. + """ with open(self.tailed_file) as file_: # Go to the end of file file_.seek(0, 2) @@ -82,11 +90,11 @@ class Tail(object): time.sleep(s) def register_callback(self, func): - ''' Overrides default callback function to provided function. ''' + """Override default callback function to provided function.""" self.callback = func def check_file_validity(self, file_): - ''' Check whether the a given file exists, readable and is a file ''' + """Check whether the a given file exists, readable and is a file.""" if not os.access(file_, os.F_OK): raise TailError("File '%s' does not exist" % (file_)) if not os.access(file_, os.R_OK): diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 9e3df12a..98f61026 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -128,13 +128,16 @@ def disabled_algorithms_allowed(): def status_update_json(apps, apks): - """Output a JSON file with metadata about this `fdroid update` run + """Output a JSON file with metadata about this `fdroid update` run. - :param apps: fully populated list of all applications - :param apks: all to be published apks + Parameters + ---------- + apps + fully populated list of all applications + apks + all to be published apks """ - logging.debug(_('Outputting JSON')) output = common.setup_status_output(start_timestamp) output['antiFeatures'] = dict() @@ -194,10 +197,14 @@ def status_update_json(apps, apks): def update_wiki(apps, apks): - """Update the wiki + """Update the wiki. - :param apps: fully populated list of all applications - :param apks: all apks, except... + Parameters + ---------- + apps + fully populated list of all applications + apks + all apks, except... """ logging.info("Updating wiki") wikicat = 'Apps' @@ -422,9 +429,14 @@ def update_wiki(apps, apks): def delete_disabled_builds(apps, apkcache, repodirs): """Delete disabled build outputs. - :param apps: list of all applications, as per metadata.read_metadata - :param apkcache: current apk cache information - :param repodirs: the repo directories to process + Parameters + ---------- + apps + list of all applications, as per metadata.read_metadata + apkcache + current apk cache information + repodirs + the repo directories to process """ for appid, app in apps.items(): for build in app.get('Builds', []): @@ -480,9 +492,12 @@ def resize_icon(iconpath, density): def resize_all_icons(repodirs): - """Resize all icons that exceed the max size + """Resize all icons that exceed the max size. - :param repodirs: the repo directories to process + Parameters + ---------- + repodirs + the repo directories to process """ for repodir in repodirs: for density in screen_densities: @@ -504,12 +519,17 @@ def getsig(apkpath): md5 digest algorithm. This is not the same as the standard X.509 certificate fingerprint. - :param apkpath: path to the apk - :returns: A string containing the md5 of the signature of the apk or None - if an error occurred. + Parameters + ---------- + apkpath + path to the apk + + Returns + ------- + A string containing the md5 of the signature of the apk or None + if an error occurred. """ - cert_encoded = common.get_first_signer_certificate(apkpath) if not cert_encoded: return None @@ -521,7 +541,7 @@ def get_cache_file(): def get_cache(): - """Get the cached dict of the APK index + """Get the cached dict of the APK index. Gather information about all the apk files in the repo directory, using cached data if possible. Some of the index operations take a @@ -533,7 +553,9 @@ def get_cache(): those cases, there is no easy way to know what has changed from the cache, so just rerun the whole thing. - :return: apkcache + Returns + ------- + apkcache """ apkcachefile = get_cache_file() @@ -582,7 +604,7 @@ def write_cache(apkcache): def get_icon_bytes(apkzip, iconsrc): - '''ZIP has no official encoding, UTF-* and CP437 are defacto''' + """ZIP has no official encoding, UTF-* and CP437 are defacto.""" try: return apkzip.read(iconsrc) except KeyError: @@ -590,7 +612,7 @@ def get_icon_bytes(apkzip, iconsrc): def has_known_vulnerability(filename): - """checks for known vulnerabilities in the APK + """Check for known vulnerabilities in the APK. Checks OpenSSL .so files in the APK to see if they are a known vulnerable version. Google also enforces this: @@ -603,7 +625,6 @@ def has_known_vulnerability(filename): Janus is similar to Master Key but is perhaps easier to scan for. https://www.guardsquare.com/en/blog/new-android-vulnerability-allows-attackers-modify-apps-without-affecting-their-signatures """ - found_vuln = False # statically load this pattern @@ -649,8 +670,9 @@ def has_known_vulnerability(filename): def insert_obbs(repodir, apps, apks): - """Scans the .obb files in a given repo directory and adds them to the - relevant APK instances. OBB files have versionCodes like APK + """Scan the .obb files in a given repo directory and adds them to the relevant APK instances. + + OBB files have versionCodes like APK files, and they are loosely associated. If there is an OBB file present, then any APK with the same or higher versionCode will use that OBB file. There are two OBB types: main and patch, each APK @@ -658,12 +680,16 @@ def insert_obbs(repodir, apps, apks): https://developer.android.com/google/play/expansion-files.html - :param repodir: repo directory to scan - :param apps: list of current, valid apps - :param apks: current information on all APKs + Parameters + ---------- + repodir + repo directory to scan + apps + list of current, valid apps + apks + current information on all APKs """ - def obbWarnDelete(f, msg): logging.warning(msg + ' ' + f) if options.delete_unknown: @@ -715,7 +741,7 @@ def insert_obbs(repodir, apps, apks): def translate_per_build_anti_features(apps, apks): - """Grab the anti-features list from the build metadata + """Grab the anti-features list from the build metadata. For most Anti-Features, they are really most applicable per-APK, not for an app. An app can fix a vulnerability, add/remove @@ -729,7 +755,6 @@ def translate_per_build_anti_features(apps, apks): from the build 'antifeatures' field, not directly included. """ - antiFeatures = dict() for packageName, app in apps.items(): d = dict() @@ -749,7 +774,7 @@ def translate_per_build_anti_features(apps, apks): def _get_localized_dict(app, locale): - '''get the dict to add localized store metadata to''' + """Get the dict to add localized store metadata to.""" if 'localized' not in app: app['localized'] = collections.OrderedDict() if locale not in app['localized']: @@ -758,7 +783,7 @@ def _get_localized_dict(app, locale): def _set_localized_text_entry(app, locale, key, f): - """Read a fastlane/triple-t metadata file and add an entry to the app + """Read a fastlane/triple-t metadata file and add an entry to the app. This reads more than the limit, in case there is leading or trailing whitespace to be stripped @@ -779,7 +804,7 @@ def _set_localized_text_entry(app, locale, key, f): def _set_author_entry(app, key, f): - """read a fastlane/triple-t author file and add the entry to the app + """Read a fastlane/triple-t author file and add the entry to the app. This reads more than the limit, in case there is leading or trailing whitespace to be stripped @@ -796,7 +821,7 @@ def _set_author_entry(app, key, f): def _strip_and_copy_image(in_file, outpath): - """Remove any metadata from image and copy it to new path + """Remove any metadata from image and copy it to new path. Sadly, image metadata like EXIF can be used to exploit devices. It is not used at all in the F-Droid ecosystem, so its much safer @@ -861,8 +886,7 @@ def _strip_and_copy_image(in_file, outpath): def _get_base_hash_extension(f): - '''split a graphic/screenshot filename into base, sha256, and extension - ''' + """Split a graphic/screenshot filename into base, sha256, and extension.""" base, extension = common.get_extension(f) sha256_index = base.find('_') if sha256_index > 0: @@ -871,7 +895,7 @@ def _get_base_hash_extension(f): def sanitize_funding_yml_entry(entry): - """FUNDING.yml comes from upstream repos, entries must be sanitized""" + """FUNDING.yml comes from upstream repos, entries must be sanitized.""" if type(entry) not in (bytes, int, float, list, str): return if isinstance(entry, bytes): @@ -894,7 +918,7 @@ def sanitize_funding_yml_entry(entry): def sanitize_funding_yml_name(name): - """Sanitize usernames that come from FUNDING.yml""" + """Sanitize usernames that come from FUNDING.yml.""" entry = sanitize_funding_yml_entry(name) if entry: m = metadata.VALID_USERNAME_REGEX.match(entry) @@ -904,7 +928,7 @@ def sanitize_funding_yml_name(name): def insert_funding_yml_donation_links(apps): - """include donation links from FUNDING.yml in app's source repo + """Include donation links from FUNDING.yml in app's source repo. GitHub made a standard file format for declaring donation links. This parses that format from upstream repos to include in @@ -917,7 +941,6 @@ def insert_funding_yml_donation_links(apps): https://help.github.com/en/articles/displaying-a-sponsor-button-in-your-repository#about-funding-files """ - if not os.path.isdir('build'): return # nothing to do for packageName, app in apps.items(): @@ -989,7 +1012,7 @@ def insert_funding_yml_donation_links(apps): def copy_triple_t_store_metadata(apps): - """Include store metadata from the app's source repo + """Include store metadata from the app's source repo. The Triple-T Gradle Play Publisher is a plugin that has a standard file layout for all of the metadata and graphics that the Google @@ -1007,7 +1030,6 @@ def copy_triple_t_store_metadata(apps): https://github.com/Triple-T/gradle-play-publisher/blob/2.1.0/README.md#publishing-listings """ - if not os.path.isdir('build'): return # nothing to do @@ -1112,7 +1134,7 @@ def copy_triple_t_store_metadata(apps): def insert_localized_app_metadata(apps): - """scans standard locations for graphics and localized text + """Scan standard locations for graphics and localized text. Scans for localized description files, changelogs, store graphics, and screenshots and adds them to the app metadata. Each app's source repo root @@ -1139,7 +1161,6 @@ def insert_localized_app_metadata(apps): See also our documentation page: https://f-droid.org/en/docs/All_About_Descriptions_Graphics_and_Screenshots/#in-the-apps-build-metadata-in-an-fdroiddata-collection """ - sourcedirs = glob.glob(os.path.join('build', '[A-Za-z]*', 'src', '[A-Za-z]*', 'fastlane', 'metadata', 'android', '[a-z][a-z]*')) sourcedirs += glob.glob(os.path.join('build', '[A-Za-z]*', 'fastlane', 'metadata', 'android', '[a-z][a-z]*')) sourcedirs += glob.glob(os.path.join('build', '[A-Za-z]*', 'metadata', '[a-z][a-z]*')) @@ -1259,15 +1280,19 @@ def insert_localized_app_metadata(apps): def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False): - """Scan a repo for all files with an extension except APK/OBB + """Scan a repo for all files with an extension except APK/OBB. - :param apkcache: current cached info about all repo files - :param repodir: repo directory to scan - :param knownapks: list of all known files, as per metadata.read_metadata - :param use_date_from_file: use date from file (instead of current date) - for newly added files + Parameters + ---------- + apkcache + current cached info about all repo files + repodir + repo directory to scan + knownapks + list of all known files, as per metadata.read_metadata + use_date_from_file + use date from file (instead of current date) for newly added files """ - cachechanged = False repo_files = [] repodir = repodir.encode() @@ -1343,14 +1368,22 @@ def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False): def scan_apk(apk_file): - """ - Scans an APK file and returns dictionary with metadata of the APK. + """Scan an APK file and returns dictionary with metadata of the APK. Attention: This does *not* verify that the APK signature is correct. - :param apk_file: The (ideally absolute) path to the APK file - :raises BuildException - :return A dict containing APK metadata + Parameters + ---------- + apk_file + The (ideally absolute) path to the APK file + + Raises + ------ + BuildException + + Returns + ------- + A dict containing APK metadata """ apk = { 'hash': common.sha256sum(apk_file), @@ -1397,7 +1430,7 @@ def scan_apk(apk_file): def _get_apk_icons_src(apkfile, icon_name): - """Extract the paths to the app icon in all available densities + """Extract the paths to the app icon in all available densities. The folder name is normally generated by the Android Tools, but there is nothing that prevents people from using whatever DPI @@ -1423,7 +1456,7 @@ def _get_apk_icons_src(apkfile, icon_name): def _sanitize_sdk_version(value): - """Sanitize the raw values from androguard to handle bad values + """Sanitize the raw values from androguard to handle bad values. minSdkVersion/targetSdkVersion/maxSdkVersion must be integers, but that doesn't stop devs from doing strange things like setting them @@ -1564,23 +1597,33 @@ def scan_apk_androguard(apk, apkfile): def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=False, allow_disabled_algorithms=False, archive_bad_sig=False): - """Processes the apk with the given filename in the given repo directory. + """Process the apk with the given filename in the given repo directory. This also extracts the icons. - :param apkcache: current apk cache information - :param apkfilename: the filename of the apk to scan - :param repodir: repo directory to scan - :param knownapks: known apks info - :param use_date_from_apk: use date from APK (instead of current date) - for newly added APKs - :param allow_disabled_algorithms: allow APKs with valid signatures that include - disabled algorithms in the signature (e.g. MD5) - :param archive_bad_sig: move APKs with a bad signature to the archive - :returns: (skip, apk, cachechanged) where skip is a boolean indicating whether to skip this apk, - apk is the scanned apk information, and cachechanged is True if the apkcache got changed. - """ + Parameters + ---------- + apkcache + current apk cache information + apkfilename + the filename of the apk to scan + repodir + repo directory to scan + knownapks + known apks info + use_date_from_apk + use date from APK (instead of current date) for newly added APKs + allow_disabled_algorithms + allow APKs with valid signatures that include + disabled algorithms in the signature (e.g. MD5) + archive_bad_sig + move APKs with a bad signature to the archive + Returns + ------- + (skip, apk, cachechanged) where skip is a boolean indicating whether to skip this apk, + apk is the scanned apk information, and cachechanged is True if the apkcache got changed. + """ apk = {} apkfile = os.path.join(repodir, apkfilename) @@ -1699,19 +1742,26 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal def process_apks(apkcache, repodir, knownapks, use_date_from_apk=False): - """Processes the apks in the given repo directory. + """Process the apks in the given repo directory. This also extracts the icons. - :param apkcache: current apk cache information - :param repodir: repo directory to scan - :param knownapks: known apks info - :param use_date_from_apk: use date from APK (instead of current date) - for newly added APKs - :returns: (apks, cachechanged) where apks is a list of apk information, - and cachechanged is True if the apkcache got changed. - """ + Parameters + ---------- + apkcache + current apk cache information + repodir + repo directory to scan + knownapks + b known apks info + use_date_from_apk + use date from APK (instead of current date) for newly added APKs + Returns + ------- + (apks, cachechanged) where apks is a list of apk information, + and cachechanged is True if the apkcache got changed. + """ cachechanged = False for icon_dir in get_all_icon_dirs(repodir): @@ -1737,19 +1787,28 @@ def process_apks(apkcache, repodir, knownapks, use_date_from_apk=False): def extract_apk_icons(icon_filename, apk, apkzip, repo_dir): - """Extracts PNG icons from an APK with the supported pixel densities + """Extract PNG icons from an APK with the supported pixel densities. Extracts icons from the given APK zip in various densities, saves them into given repo directory and stores their names in the APK metadata dictionary. If the icon is an XML icon, then this tries to find PNG icon that can replace it. - :param icon_filename: A string representing the icon's file name - :param apk: A populated dictionary containing APK metadata. - Needs to have 'icons_src' key - :param apkzip: An opened zipfile.ZipFile of the APK file - :param repo_dir: The directory of the APK's repository - :return: A list of icon densities that are missing + Parameters + ---------- + icon_filename + A string representing the icon's file name + apk + A populated dictionary containing APK metadata. + Needs to have 'icons_src' key + apkzip + An opened zipfile.ZipFile of the APK file + repo_dir + The directory of the APK's repository + + Returns + ------- + A list of icon densities that are missing """ res_name_re = re.compile(r'res/(drawable|mipmap)-(x*[hlm]dpi|anydpi).*/(.*)_[0-9]+dp.(png|xml)') @@ -1820,13 +1879,14 @@ def extract_apk_icons(icon_filename, apk, apkzip, repo_dir): def fill_missing_icon_densities(empty_densities, icon_filename, apk, repo_dir): - """ - Resize existing PNG icons for densities missing in the APK to ensure all densities are available + """Resize existing PNG icons for densities missing in the APK to ensure all densities are available. - :param empty_densities: A list of icon densities that are missing - :param icon_filename: A string representing the icon's file name - :param apk: A populated dictionary containing APK metadata. Needs to have 'icons' key - :param repo_dir: The directory of the APK's repository + Parameters + ---------- + empty_densities: A list of icon densities that are missing + icon_filename: A string representing the icon's file name + apk: A populated dictionary containing APK metadata. Needs to have 'icons' key + repo_dir: The directory of the APK's repository """ # First try resizing down to not lose quality @@ -1889,8 +1949,10 @@ def fill_missing_icon_densities(empty_densities, icon_filename, apk, repo_dir): def apply_info_from_latest_apk(apps, apks): - """ + """No summary. + Some information from the apks needs to be applied up to the application level. + When doing this, we use the info from the most recent version's apk. We deal with figuring out when the app was added and last updated at the same time. """ @@ -1920,7 +1982,7 @@ def apply_info_from_latest_apk(apps, apks): def make_categories_txt(repodir, categories): - '''Write a category list in the repo to allow quick access''' + """Write a category list in the repo to allow quick access.""" catdata = '' for cat in sorted(categories): catdata += cat + '\n' @@ -1982,8 +2044,7 @@ def archive_old_apks(apps, apks, archapks, repodir, archivedir, defaultkeepversi def move_apk_between_sections(from_dir, to_dir, apk): - """move an APK from repo to archive or vice versa""" - + """Move an APK from repo to archive or vice versa.""" def _move_file(from_dir, to_dir, filename, ignore_missing): from_path = os.path.join(from_dir, filename) if ignore_missing and not os.path.exists(from_path): @@ -2033,15 +2094,14 @@ def add_apks_to_per_app_repos(repodir, apks): def create_metadata_from_template(apk): - '''create a new metadata file using internal or external template + """Create a new metadata file using internal or external template. Generate warnings for apk's with no metadata (or create skeleton metadata files, if requested on the command line). Though the template file is YAML, this uses neither pyyaml nor ruamel.yaml since those impose things on the metadata file made from the template: field sort order, empty field value, formatting, etc. - ''' - + """ if os.path.exists('template.yml'): with open('template.yml') as f: metatxt = f.read() @@ -2086,7 +2146,8 @@ def create_metadata_from_template(apk): def read_added_date_from_all_apks(apps, apks): - """ + """No summary. + Added dates come from the stats/known_apks.txt file but are read when scanning apks and thus need to be applied form apk level to app level for _all_ apps and not only from non-archived @@ -2107,7 +2168,7 @@ def read_added_date_from_all_apks(apps, apks): def insert_missing_app_names_from_apks(apps, apks): - """Use app name from APK if it is not set in the metadata + """Use app name from APK if it is not set in the metadata. Name -> localized -> from APK @@ -2148,7 +2209,7 @@ def insert_missing_app_names_from_apks(apps, apks): def get_apps_with_packages(apps, apks): - """Returns a deepcopy of that subset apps that actually has any associated packages. Skips disabled apps.""" + """Return a deepcopy of that subset apps that actually has any associated packages. Skips disabled apps.""" appsWithPackages = collections.OrderedDict() for packageName in apps: app = apps[packageName] @@ -2165,12 +2226,20 @@ def get_apps_with_packages(apps, apks): def prepare_apps(apps, apks, repodir): - """Encapsulates all necessary preparation steps before we can build an index out of apps and apks. + """Encapsulate all necessary preparation steps before we can build an index out of apps and apks. - :param apps: All apps as read from metadata - :param apks: list of apks that belong into repo, this gets modified in place - :param repodir: the target repository directory, metadata files will be copied here - :return: the relevant subset of apps (as a deepcopy) + Parameters + ---------- + apps + All apps as read from metadata + apks + list of apks that belong into repo, this gets modified in place + repodir + the target repository directory, metadata files will be copied here + + Returns + ------- + the relevant subset of apps (as a deepcopy) """ apps_with_packages = get_apps_with_packages(apps, apks) apply_info_from_latest_apk(apps_with_packages, apks) diff --git a/fdroidserver/verify.py b/fdroidserver/verify.py index ed166d3a..a8acb557 100644 --- a/fdroidserver/verify.py +++ b/fdroidserver/verify.py @@ -69,7 +69,7 @@ class Decoder(json.JSONDecoder): def _add_diffoscope_info(d): - """Add diffoscope setup metadata to provided dict under 'diffoscope' key + """Add diffoscope setup metadata to provided dict under 'diffoscope' key. The imports are broken out at stages since various versions of diffoscope support various parts of these. @@ -112,7 +112,7 @@ def _add_diffoscope_info(d): def write_json_report(url, remote_apk, unsigned_apk, compare_result): - """write out the results of the verify run to JSON + """Write out the results of the verify run to JSON. This builds up reports on the repeated runs of `fdroid verify` on a set of apps. It uses the timestamps on the compared files to @@ -120,7 +120,6 @@ def write_json_report(url, remote_apk, unsigned_apk, compare_result): repeatedly. """ - jsonfile = unsigned_apk + '.json' if os.path.exists(jsonfile): with open(jsonfile) as fp: diff --git a/fdroidserver/vmtools.py b/fdroidserver/vmtools.py index fcb4f8dd..d0345235 100644 --- a/fdroidserver/vmtools.py +++ b/fdroidserver/vmtools.py @@ -79,15 +79,24 @@ def _check_output(cmd, cwd=None): def get_build_vm(srvdir, provider=None): - """Factory function for getting FDroidBuildVm instances. + """No summary. + + Factory function for getting FDroidBuildVm instances. This function tries to figure out what hypervisor should be used and creates an object for controlling a build VM. - :param srvdir: path to a directory which contains a Vagrantfile - :param provider: optionally this parameter allows specifiying an - specific vagrant provider. - :returns: FDroidBuildVm instance. + Parameters + ---------- + srvdir + path to a directory which contains a Vagrantfile + provider + optionally this parameter allows specifiying an + specific vagrant provider. + + Returns + ------- + FDroidBuildVm instance. """ abssrvdir = abspath(srvdir) @@ -171,9 +180,9 @@ class FDroidBuildVm(): This is intended to be a hypervisor independent, fault tolerant wrapper around the vagrant functions we use. """ + def __init__(self, srvdir): - """Create new server class. - """ + """Create new server class.""" self.srvdir = srvdir self.srvname = basename(srvdir) + '_default' self.vgrntfile = os.path.join(srvdir, 'Vagrantfile') @@ -252,7 +261,7 @@ class FDroidBuildVm(): self.vgrnt.package(output=output) def vagrant_uuid_okay(self): - '''Having an uuid means that vagrant up has run successfully.''' + """Having an uuid means that vagrant up has run successfully.""" if self.srvuuid is None: return False return True @@ -282,9 +291,14 @@ class FDroidBuildVm(): def box_add(self, boxname, boxfile, force=True): """Add vagrant box to vagrant. - :param boxname: name assigned to local deployment of box - :param boxfile: path to box file - :param force: overwrite existing box image (default: True) + Parameters + ---------- + boxname + name assigned to local deployment of box + boxfile + path to box file + force + overwrite existing box image (default: True) """ boxfile = abspath(boxfile) if not isfile(boxfile): @@ -304,10 +318,11 @@ class FDroidBuildVm(): shutil.rmtree(boxpath) def sshinfo(self): - """Get ssh connection info for a vagrant VM + """Get ssh connection info for a vagrant VM. - :returns: A dictionary containing 'hostname', 'port', 'user' - and 'idfile' + Returns + ------- + A dictionary containing 'hostname', 'port', 'user' and 'idfile' """ import paramiko try: From 01b9fb1549942da998a970d68904e3828fdd9a5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit+git@posteo.de> Date: Mon, 7 Jun 2021 12:49:16 +0200 Subject: [PATCH 0332/2116] Fix pep8 whitespace errors --- fdroidserver/__main__.py | 4 ++-- fdroidserver/apksigcopier.py | 4 ++-- fdroidserver/build.py | 4 ++-- fdroidserver/checkupdates.py | 2 +- fdroidserver/common.py | 32 ++++++++++++++++---------------- fdroidserver/deploy.py | 8 ++++---- fdroidserver/index.py | 4 ++-- fdroidserver/publish.py | 10 +++++----- fdroidserver/scanner.py | 16 ++++++++-------- fdroidserver/tail.py | 8 ++++---- fdroidserver/update.py | 6 +++--- fdroidserver/vmtools.py | 2 +- 12 files changed, 50 insertions(+), 50 deletions(-) diff --git a/fdroidserver/__main__.py b/fdroidserver/__main__.py index 555a2cff..037c33d5 100755 --- a/fdroidserver/__main__.py +++ b/fdroidserver/__main__.py @@ -70,9 +70,9 @@ def print_help(available_plugins=None): def preparse_plugin(module_name, module_dir): """No summary. - + Simple regex based parsing for plugin scripts. - + So we don't have to import them when we just need the summary, but not plan on executing this particular plugin. """ diff --git a/fdroidserver/apksigcopier.py b/fdroidserver/apksigcopier.py index 26a7b544..d658d570 100644 --- a/fdroidserver/apksigcopier.py +++ b/fdroidserver/apksigcopier.py @@ -371,7 +371,7 @@ def zip_data(apkfile, count=1024): """ Extract central directory, EOCD, and offsets from ZIP. - Returns + Returns ------- ZipData """ @@ -411,7 +411,7 @@ def patch_v2_sig(extracted_v2_sig, output_apk): def patch_apk(extracted_meta, extracted_v2_sig, unsigned_apk, output_apk): """Patch extracted_meta + extracted_v2_sig. - Patches extracted_meta + extracted_v2_sig (if not None) + Patches extracted_meta + extracted_v2_sig (if not None) onto unsigned_apk and save as output_apk. """ date_time = copy_apk(unsigned_apk, output_apk) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 3afabca5..b507bb3a 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -836,7 +836,7 @@ def trybuild(app, build, build_dir, output_dir, log_dir, also_check_dir, Parameters ---------- output_dir - The directory where the build output will go. + The directory where the build output will go. Usually this is the 'unsigned' directory. repo_dir The repo directory - used for checking if the build is necessary. @@ -895,7 +895,7 @@ def force_halt_build(timeout): def parse_commandline(): """Parse the command line. - + Returns ------- options diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 94853369..975a223b 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -363,7 +363,7 @@ def check_gplay(app): def try_init_submodules(app, last_build, vcs): """Try to init submodules if the last build entry used them. - + They might have been removed from the app's repo in the meantime, so if we can't find any submodules we continue with the updates check. If there is any other error in initializing them then we stop the check. diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 174984e4..e64557b3 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -972,7 +972,7 @@ class vcs: def gotorevision(self, rev, refresh=True): """Take the local repository to a clean version of the given revision. - + Take the local repository to a clean version of the given revision, which is specificed in the VCS's native format. Beforehand, the repository can be dirty, or even @@ -1031,7 +1031,7 @@ class vcs: def gotorevisionx(self, rev): # pylint: disable=unused-argument """No summary. - + Derived classes need to implement this. It's called once basic checking has been performed. @@ -1109,7 +1109,7 @@ class vcs_git(vcs): def checkrepo(self): """No summary. - + If the local directory exists, but is somehow not a git repository, git will traverse up the directory tree until it finds one that is (i.e. fdroidserver) and then we'll proceed to destroy @@ -1256,7 +1256,7 @@ class vcs_gitsvn(vcs): def checkrepo(self): """No summary. - + If the local directory exists, but is somehow not a git repository, git will traverse up the directory tree until it finds one that is (i.e. fdroidserver) and then we'll proceed to destory it! @@ -2499,7 +2499,7 @@ class KnownApks: def getapp(self, apkname): """Look up information - given the 'apkname'. - + Returns (app id, date added/None). Or returns None for an unknown apk. """ @@ -2587,7 +2587,7 @@ def is_apk_and_debuggable(apkfile): ---------- apkfile full path to the APK to check - + """ if get_file_extension(apkfile) != 'apk': return False @@ -2708,7 +2708,7 @@ def get_apk_id_aapt(apkfile): def get_native_code(apkfile): """Aapt checks if there are architecture folders under the lib/ folder. - + We are simulating the same behaviour. """ arch_re = re.compile("^lib/(.*)/.*$") @@ -2834,7 +2834,7 @@ def FDroidPopen(commands, cwd=None, envs=None, output=True, stderr_to_stdout=Tru optionally specifies a working directory envs a optional dictionary of environment variables and their values - + Returns ------- A PopenResult. @@ -3168,7 +3168,7 @@ def metadata_find_signing_files(appid, vercode): Returns ------- - List + List of 4-tuples for each signing key with following paths: (signature_file, signature_block_file, manifest, v2_files), where v2_files is either a (apk_signing_block_offset_file, apk_signing_block_file) pair or None @@ -3207,7 +3207,7 @@ def metadata_find_developer_signing_files(appid, vercode): Returns ------- - List + List of 4-tuples for each signing key with following paths: (signature_file, signature_block_file, manifest, v2_files), where v2_files is either a (apk_signing_block_offset_file, apk_signing_block_file) pair or None @@ -3337,7 +3337,7 @@ def apk_extract_signatures(apkpath, outdir): def get_min_sdk_version(apk): """Wrap the androguard function to always return and int. - + Fall back to 1 if we can't get a valid minsdk version. Parameters @@ -3490,7 +3490,7 @@ def verify_apk_signature(apk, min_sdk_version=None): Returns ------- - Boolean + Boolean whether the APK was verified """ if set_command_in_config('apksigner'): @@ -3534,7 +3534,7 @@ def verify_old_apk_signature(apk): Returns ------- - Boolean + Boolean whether the APK was verified """ @@ -3635,7 +3635,7 @@ def compare_apks(apk1, apk2, tmp_dir, log_dir=None): def set_command_in_config(command): """Try to find specified command in the path, if it hasn't been manually set in config.yml. - + If found, it is added to the config dict. The return value says whether the command is available. @@ -3782,7 +3782,7 @@ def load_stats_fdroid_signing_key_fingerprints(): Returns ------- - dict + dict containing the signing-key fingerprints. """ jar_file = os.path.join('stats', 'publishsigkeys.jar') @@ -3819,7 +3819,7 @@ def write_to_config(thisconfig, key, value=None, config_file=None): config dictionary key variable name in config to be overwritten/added - value + value optional value to be written, instead of fetched from 'thisconfig' dictionary. """ diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 1af9b07d..e56030fe 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -48,7 +48,7 @@ REMOTE_HOSTNAME_REGEX = re.compile(r'\W*\w+\W+(\w+).*') def update_awsbucket(repo_section): """Upload the contents of the directory `repo_section` (including subdirectories) to the AWS S3 "bucket". - + The contents of that subdir of the bucket will first be deleted. @@ -141,10 +141,10 @@ def update_awsbucket_s3cmd(repo_section): def update_awsbucket_libcloud(repo_section): """No summary. - + Upload the contents of the directory `repo_section` (including - subdirectories) to the AWS S3 "bucket". - + subdirectories) to the AWS S3 "bucket". + The contents of that subdir of the bucket will first be deleted. diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 270771fd..e14c4185 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -590,7 +590,7 @@ def _copy_to_local_copy_dir(repodir, f): def v1_sort_packages(packages, fdroid_signing_key_fingerprints): """Sort the supplied list to ensure a deterministic sort order for package entries in the index file. - + This sort-order also expresses installation preference to the clients. (First in this list = first to install) @@ -1124,7 +1124,7 @@ def get_public_key_from_jar(jar): ---------- jar a zipfile.ZipFile object - + Returns ------- the public key from the jar and its fingerprint diff --git a/fdroidserver/publish.py b/fdroidserver/publish.py index d0f6f54b..07a1ea6e 100644 --- a/fdroidserver/publish.py +++ b/fdroidserver/publish.py @@ -56,7 +56,7 @@ def publish_source_tarball(apkfilename, unsigned_dir, output_dir): def key_alias(appid): """No summary. - + Get the alias which F-Droid uses to indentify the singing key for this App in F-Droids keystore. """ @@ -101,7 +101,7 @@ def read_fingerprints_from_keystore(): def sign_sig_key_fingerprint_list(jar_file): """Sign the list of app-signing key fingerprints. - + This is used primaryily by fdroid update to determine which APKs where built and signed by F-Droid and which ones were manually added by users. @@ -125,7 +125,7 @@ def sign_sig_key_fingerprint_list(jar_file): def store_stats_fdroid_signing_key_fingerprints(appids, indent=None): """Store list of all signing-key fingerprints for given appids to HD. - + This list will later on be needed by fdroid update. """ if not os.path.exists('stats'): @@ -172,9 +172,9 @@ def check_for_key_collisions(allapps): Parameters ---------- - allapps + allapps a dict of all apps to process - + Returns ------- a list of all aliases corresponding to allapps diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 5f5bff97..9042d56d 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -130,7 +130,7 @@ def scan_binary(apkfile): def scan_source(build_dir, build=metadata.Build()): """Scan the source code in the given directory (and all subdirectories). - + Returns ------- the number of fatal problems encountered. @@ -198,7 +198,7 @@ def scan_source(build_dir, build=metadata.Build()): Parameters ---------- - what: string + what: string describing the problem, will be printed in log messages path_in_build_dir path to the file relative to `build`-dir @@ -218,13 +218,13 @@ def scan_source(build_dir, build=metadata.Build()): Parameters ---------- - what: string + what: string describing the problem, will be printed in log messages path_in_build_dir path to the file relative to `build`-dir filepath Path (relative to our current path) to the file - + Returns ------- 0 as we deleted the offending file @@ -247,7 +247,7 @@ def scan_source(build_dir, build=metadata.Build()): Parameters ---------- - what: string + what: string describing the problem, will be printed in log messages path_in_build_dir path to the file relative to `build`-dir @@ -265,18 +265,18 @@ def scan_source(build_dir, build=metadata.Build()): def handleproblem(what, path_in_build_dir, filepath): """Dispatches to problem handlers (ignore, delete, warn). - + Or returns 1 for increasing the error count. Parameters ---------- - what: string + what: string describing the problem, will be printed in log messages path_in_build_dir path to the file relative to `build`-dir filepath Path (relative to our current path) to the file - + Returns ------- 0 if the problem was ignored/deleted/is only a warning, 1 otherwise diff --git a/fdroidserver/tail.py b/fdroidserver/tail.py index 6026b0b0..9cec5bf9 100644 --- a/fdroidserver/tail.py +++ b/fdroidserver/tail.py @@ -7,14 +7,14 @@ python-tail can be used to monitor changes to a file. Example ------- >>> import tail ->>> +>>> >>> # Create a tail instance >>> t = tail.Tail('file-to-be-followed') ->>> +>>> >>> # Register a callback function to be called when a new line is found in the followed file. >>> # If no callback function is registerd, new lines would be printed to standard out. >>> t.register_callback(callback_function) ->>> +>>> >>> # Follow the file with 5 seconds as sleep time between iterations. >>> # If sleep time is not provided 1 second is used as the default time. >>> t.follow(s=5) @@ -67,7 +67,7 @@ class Tail(object): def follow(self, s=1): """Do a tail follow. - + If a callback function is registered it is called with every new line. Else printed to standard out. diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 98f61026..8ddeb44a 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -671,7 +671,7 @@ def has_known_vulnerability(filename): def insert_obbs(repodir, apps, apks): """Scan the .obb files in a given repo directory and adds them to the relevant APK instances. - + OBB files have versionCodes like APK files, and they are loosely associated. If there is an OBB file present, then any APK with the same or higher versionCode will use @@ -1950,7 +1950,7 @@ def fill_missing_icon_densities(empty_densities, icon_filename, apk, repo_dir): def apply_info_from_latest_apk(apps, apks): """No summary. - + Some information from the apks needs to be applied up to the application level. When doing this, we use the info from the most recent version's apk. @@ -2236,7 +2236,7 @@ def prepare_apps(apps, apks, repodir): list of apks that belong into repo, this gets modified in place repodir the target repository directory, metadata files will be copied here - + Returns ------- the relevant subset of apps (as a deepcopy) diff --git a/fdroidserver/vmtools.py b/fdroidserver/vmtools.py index d0345235..84ac7928 100644 --- a/fdroidserver/vmtools.py +++ b/fdroidserver/vmtools.py @@ -80,7 +80,7 @@ def _check_output(cmd, cwd=None): def get_build_vm(srvdir, provider=None): """No summary. - + Factory function for getting FDroidBuildVm instances. This function tries to figure out what hypervisor should be used From 9038161b70a57aa1f473ea9448dc13cfc9f82e67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit+git@posteo.de> Date: Mon, 14 Jun 2021 08:34:57 +0200 Subject: [PATCH 0333/2116] apply numpy docstyle --- fdroidserver/common.py | 2 +- fdroidserver/lint.py | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index e64557b3..94778ae0 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4528,7 +4528,7 @@ NDKS = [ def handle_retree_error_on_windows(function, path, excinfo): - """Python can't remove a readonly file on Windows so chmod first""" + """Python can't remove a readonly file on Windows so chmod first.""" if function in (os.unlink, os.rmdir, os.remove) and excinfo[0] == PermissionError: os.chmod(path, stat.S_IWRITE) function(path) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 90b8b0e8..1baa1551 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -249,11 +249,7 @@ def get_lastbuild(builds): def check_update_check_data_url(app): -<<<<<<< HEAD - """UpdateCheckData must have a valid HTTPS URL to protect checkupdates runs""" -======= - """UpdateCheckData must have a valid HTTPS URL to protect checkupdates runs.""" ->>>>>>> c380427b (rewrite docstrings to match numpy style guide) + """Updatecheckdata must have a valid HTTPS URL to protect checkupdates runs.""" if app.UpdateCheckData and app.UpdateCheckMode == 'HTTP': urlcode, codeex, urlver, verex = app.UpdateCheckData.split('|') for url in (urlcode, urlver): From 3d85b91dc461bd291441a81bb00819a70803c391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit+git@posteo.de> Date: Mon, 21 Jun 2021 09:02:44 +0200 Subject: [PATCH 0334/2116] rewrite docstrings to match numpy style guide --- fdroidserver/common.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 94778ae0..e0f279da 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1211,8 +1211,9 @@ class vcs_git(vcs): tag_format = re.compile(r'tag: ([^) ]*)') def latesttags(self): - """Returns a list of latest tags - the definition is a little blurry here, Android does not care for the + """Return a list of latest tags. + + The definition is a little blurry here, Android does not care for the version name of an app as normally used as the tag name so versions do not need to follow strverscmp() or similar. Also they can be rather arbitrary so git tag --sort=-version:refname does not work. On the other side From 675d034ac799fb59fd090eba27152b4547bbf69e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20Br=C3=BCckmann?= <64bit+git@posteo.de> Date: Fri, 25 Jun 2021 06:42:17 +0200 Subject: [PATCH 0335/2116] Fix errors from merge and review --- fdroidserver/common.py | 2 +- fdroidserver/lint.py | 4 ++-- setup.cfg | 7 +++++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index e0f279da..41a76605 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1056,7 +1056,7 @@ class vcs: """Get a list of all the known tags, sorted from newest to oldest.""" raise VCSException('latesttags not supported for this vcs type') - def getref(self): + def getref(self, revname=None): """Get current commit reference (hash, revision, etc).""" raise VCSException('getref not supported for this vcs type') diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 1baa1551..9b7ab967 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -248,8 +248,8 @@ def get_lastbuild(builds): return lastbuild -def check_update_check_data_url(app): - """Updatecheckdata must have a valid HTTPS URL to protect checkupdates runs.""" +def check_update_check_data_url(app): # noqa: D403 + """UpdateCheckData must have a valid HTTPS URL to protect checkupdates runs.""" if app.UpdateCheckData and app.UpdateCheckMode == 'HTTP': urlcode, codeex, urlver, verex = app.UpdateCheckData.split('|') for url in (urlcode, urlver): diff --git a/setup.cfg b/setup.cfg index d8b88bc2..3414de70 100644 --- a/setup.cfg +++ b/setup.cfg @@ -40,6 +40,10 @@ output_dir = locale domain = fdroidserver directory = locale +[pycodestyle] +ignore = E203,W503 +max-line-length = 88 + [flake8] ignore = E203,W503 max-line-length = 88 @@ -51,5 +55,4 @@ max-line-length = 88 # * rest are the conventions which are ignored by numpy conventions according to http://www.pydocstyle.org/en/stable/error_codes.html [pydocstyle] #convention = numpy # cannot be used in combination with ignore, so we list rules seperately. -ignore = D100,D101,D102,D103,D104,D105,D106,D107,D203,D212,D213,D402,D413,D415,D416,D417,E203,W503 -max-line-length = 88 +ignore = D100,D101,D102,D103,D104,D105,D106,D107,D203,D212,D213,D402,D413,D415,D416,D417 From 03c3e451166062fc1c4f584bbbcc3bfb1b933d5c Mon Sep 17 00:00:00 2001 From: linsui Date: Thu, 24 Jun 2021 13:10:11 +0800 Subject: [PATCH 0336/2116] add require_signature param to scan_apk --- fdroidserver/update.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 9e3df12a..f3b8bd6d 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1342,13 +1342,15 @@ def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False): return repo_files, cachechanged -def scan_apk(apk_file): +def scan_apk(apk_file, require_signature=True): """ Scans an APK file and returns dictionary with metadata of the APK. Attention: This does *not* verify that the APK signature is correct. :param apk_file: The (ideally absolute) path to the APK file + :param require_signature: Raise an exception is there is no valid + signature. Default to Ture. :raises BuildException :return A dict containing APK metadata """ @@ -1375,12 +1377,14 @@ def scan_apk(apk_file): # Get the signature, or rather the signing key fingerprints logging.debug('Getting signature of {0}'.format(os.path.basename(apk_file))) apk['sig'] = getsig(apk_file) - if not apk['sig']: - raise BuildException(_("Failed to get APK signing key fingerprint")) - apk['signer'] = common.apk_signer_fingerprint(os.path.join(os.getcwd(), - apk_file)) - if not apk.get('signer'): - raise BuildException(_("Failed to get APK signing key fingerprint")) + if require_signature: + if not apk['sig']: + raise BuildException(_("Failed to get APK signing key fingerprint")) + apk['signer'] = common.apk_signer_fingerprint( + os.path.join(os.getcwd(), apk_file) + ) + if not apk.get('signer'): + raise BuildException(_("Failed to get APK signing key fingerprint")) # Get size of the APK apk['size'] = os.path.getsize(apk_file) From 3e7ce8ce31890239ae99a94db51fb456264a62d5 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 25 Jun 2021 09:28:41 +0200 Subject: [PATCH 0337/2116] merge scan_apk doc string updates --- fdroidserver/update.py | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 93e0ea19..b69c868e 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1368,16 +1368,25 @@ def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False): def scan_apk(apk_file, require_signature=True): - """ - Scans an APK file and returns dictionary with metadata of the APK. + """Scan an APK file and returns dictionary with metadata of the APK. Attention: This does *not* verify that the APK signature is correct. - :param apk_file: The (ideally absolute) path to the APK file - :param require_signature: Raise an exception is there is no valid - signature. Default to Ture. - :raises BuildException - :return A dict containing APK metadata + Parameters + ---------- + + apk_file + The (ideally absolute) path to the APK file + require_signature + Raise an exception is there is no valid signature. Default to True. + + Raises + ------ + BuildException + + Returns + ------- + A dict containing APK metadata """ apk = { 'hash': common.sha256sum(apk_file), From ecc21489d4b2785d74871fa50fba30ad9a9599d7 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 25 Jun 2021 12:11:44 +0200 Subject: [PATCH 0338/2116] fix pydocstyle --- fdroidserver/tail.py | 2 +- fdroidserver/update.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/fdroidserver/tail.py b/fdroidserver/tail.py index 9cec5bf9..d6e09691 100644 --- a/fdroidserver/tail.py +++ b/fdroidserver/tail.py @@ -36,7 +36,7 @@ class Tail(object): """Represents a tail command.""" def __init__(self, tailed_file): - """Initiate a Tail instance. + """Initialize a Tail instance. Check for file validity, assigns callback function to standard out. diff --git a/fdroidserver/update.py b/fdroidserver/update.py index b69c868e..19e53c1c 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1374,7 +1374,6 @@ def scan_apk(apk_file, require_signature=True): Parameters ---------- - apk_file The (ideally absolute) path to the APK file require_signature From 674786db96203102b9b76cf8a15bdbf414c5f848 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 25 Jun 2021 09:08:54 +0200 Subject: [PATCH 0339/2116] [checkupdates] Ignore broken submodule In case the app repository has a broken submodule, checkupdates failed and did not search for any version updates. Ignoring the error let's us at least find new version in the main repo (which is probably the right place anyhow) and thus an improvement. --- fdroidserver/checkupdates.py | 2 ++ tests/run-tests | 44 ++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 975a223b..483c46ef 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -373,6 +373,8 @@ def try_init_submodules(app, last_build, vcs): vcs.initsubmodules() except NoSubmodulesException: logging.info("No submodules present for {}".format(_getappname(app))) + except VCSException: + logging.info("submodule broken for {}".format(_getappname(app))) # Return all directories under startdir that contain any of the manifest diff --git a/tests/run-tests b/tests/run-tests index 42374742..a6178a23 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -1332,6 +1332,50 @@ if have_git_2_3; then grep "CurrentVersionCode: 2" metadata/fake.yml fi +#------------------------------------------------------------------------------# +echo_header "checkupdates ignore broken submodule" + +if have_git_2_3; then + ROOT=$(create_test_dir) + cd "$ROOT" + mkdir foo bar + cd foo + git init + echo a > a + git add a + GIT_COMMITTER_NAME="Test" GIT_COMMITTER_EMAIL="no@mail" git commit -m a --author "Author " + + cd ../bar + git init + git submodule add "file://$(pwd)/../foo" baz + GIT_COMMITTER_NAME="Test" GIT_COMMITTER_EMAIL="no@mail" git commit -am a --author "Author " + git tag 2 + + cd ../foo + # delete the commit referenced in bar + GIT_COMMITTER_NAME="Test" GIT_COMMITTER_EMAIL="no@mail" git commit --amend -m aa --author "Author " + git reflog expire --expire=now --all + git gc --aggressive --prune=now + + cd .. + mkdir repo + mkdir metadata + echo "RepoType: git" >> metadata/fake.yml + echo "Repo: file://$(pwd)/bar" >> metadata/fake.yml + echo "Builds:" >> metadata/fake.yml + echo " - versionName: 1" >> metadata/fake.yml + echo " versionCode: 1" >> metadata/fake.yml + echo " submodules: true" >> metadata/fake.yml + echo "AutoUpdateMode: Version" >> metadata/fake.yml + echo "UpdateCheckMode: Tags" >> metadata/fake.yml + echo "UpdateCheckData: '|||'" >> metadata/fake.yml + echo "CurrentVersion: 1" >> metadata/fake.yml + echo "CurrentVersionCode: 1" >> metadata/fake.yml + + $fdroid checkupdates --allow-dirty + grep "CurrentVersionCode: 2" metadata/fake.yml +fi + #------------------------------------------------------------------------------# From 70a11b3d79c29bdb31ae057e787aaf3d073efb8f Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 25 Jun 2021 12:39:47 +0200 Subject: [PATCH 0340/2116] Ignore ~/.gitconfig in tests and drop version test git version 2.3 was released in 2015. --- tests/run-tests | 274 +++++++++++++++++++++++------------------------- 1 file changed, 132 insertions(+), 142 deletions(-) diff --git a/tests/run-tests b/tests/run-tests index a6178a23..154b770e 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -65,11 +65,6 @@ fdroid_init_with_prebuilt_keystore() { echo 'keypass: r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' >> config.yml } -# the < is reverse since 0 means success in exit codes -have_git_2_3() { - python3 -c "import sys; from distutils.version import LooseVersion as V; sys.exit(V(sys.argv[3]) < V('2.3'))" `git --version` -} - is_MD5_disabled() { javac $WORKSPACE/tests/IsMD5Disabled.java && java -cp $WORKSPACE/tests IsMD5Disabled } @@ -141,6 +136,11 @@ else sed=sed fi +# allow the location of git to be overridden +if [ -z "$git" ]; then + git="env HOME= GIT_AUTHOR_NAME='Test' GIT_AUTHOR_EMAIL='no@mail' GIT_COMMITTER_NAME='Test' GIT_COMMITTER_EMAIL='no@mail' git" +fi + set -x # show each command as it is executed #------------------------------------------------------------------------------# @@ -1047,19 +1047,15 @@ fdroid_init_with_prebuilt_keystore cp -a $WORKSPACE/tests/metadata $WORKSPACE/tests/repo $WORKSPACE/tests/stats $REPOROOT/ echo "binary_transparency_remote: $GIT_REMOTE" >> config.yml $fdroid update --verbose -if have_git_2_3; then - $fdroid deploy --verbose - test -e repo/index.xml - test -e repo/index.jar - test -e repo/index-v1.jar - grep -F '> config.yml - cp -a $WORKSPACE/tests/metadata $WORKSPACE/tests/repo $WORKSPACE/tests/stats $OFFLINE_ROOT/ - mkdir $OFFLINE_ROOT/unsigned - cp $WORKSPACE/tests/urzip-release-unsigned.apk $OFFLINE_ROOT/unsigned +cd $OFFLINE_ROOT +fdroid_init_with_prebuilt_keystore +printf '\narchive_older: 3\n' >> config.yml +cp -a $WORKSPACE/tests/metadata $WORKSPACE/tests/repo $WORKSPACE/tests/stats $OFFLINE_ROOT/ +mkdir $OFFLINE_ROOT/unsigned +cp $WORKSPACE/tests/urzip-release-unsigned.apk $OFFLINE_ROOT/unsigned - echo "mirrors: ['http://foo.bar/fdroid', 'http://asdflkdsfjafdsdfhkjh.onion/fdroid']" >> config.yml - echo "servergitmirrors: $SERVER_GIT_MIRROR" >> config.yml - echo "local_copy_dir: $LOCAL_COPY_DIR" >> config.yml - $fdroid update --pretty - grep -F '' repo/index.xml - grep -F '/fdroid/archive' archive/index.xml - test `grep '' repo/index.xml | wc -l` -eq 2 - test `grep '' archive/index.xml | wc -l` -eq 2 - cd binary_transparency - [ `git rev-list --count HEAD` == "1" ] - cd .. - $fdroid deploy --verbose - test -e $LOCAL_COPY_DIR/unsigned/urzip-release-unsigned.apk - grep -F '> config.yml +echo "servergitmirrors: $SERVER_GIT_MIRROR" >> config.yml +echo "local_copy_dir: $LOCAL_COPY_DIR" >> config.yml +$fdroid update --pretty +grep -F '' repo/index.xml +grep -F '/fdroid/archive' archive/index.xml +test `grep '' repo/index.xml | wc -l` -eq 2 +test `grep '' archive/index.xml | wc -l` -eq 2 +cd binary_transparency +[ "$($git rev-list --count HEAD)" == "1" ] +cd .. +$fdroid deploy --verbose +test -e $LOCAL_COPY_DIR/unsigned/urzip-release-unsigned.apk +grep -F '> metadata/fake.yml - echo "CurrentVersion: 1" >> metadata/fake.yml - echo "CurrentVersionCode: 1" >> metadata/fake.yml +cd .. +mkdir repo +mkdir metadata +echo "RepoType: git" >> metadata/fake.yml +echo "Repo: file://$(pwd)/bar" >> metadata/fake.yml +echo "AutoUpdateMode: Version" >> metadata/fake.yml +echo "UpdateCheckMode: Tags" >> metadata/fake.yml +echo "UpdateCheckData: '|||'" >> metadata/fake.yml +echo "CurrentVersion: 1" >> metadata/fake.yml +echo "CurrentVersionCode: 1" >> metadata/fake.yml - $fdroid checkupdates --allow-dirty - grep "CurrentVersionCode: 2" metadata/fake.yml -fi +$fdroid checkupdates --allow-dirty +grep "CurrentVersionCode: 2" metadata/fake.yml #------------------------------------------------------------------------------# echo_header "checkupdates ignore broken submodule" -if have_git_2_3; then - ROOT=$(create_test_dir) - cd "$ROOT" - mkdir foo bar - cd foo - git init - echo a > a - git add a - GIT_COMMITTER_NAME="Test" GIT_COMMITTER_EMAIL="no@mail" git commit -m a --author "Author " +ROOT=$(create_test_dir) +cd "$ROOT" +mkdir foo bar +cd foo +$git init +echo a > a +$git add a +$git commit -m a - cd ../bar - git init - git submodule add "file://$(pwd)/../foo" baz - GIT_COMMITTER_NAME="Test" GIT_COMMITTER_EMAIL="no@mail" git commit -am a --author "Author " - git tag 2 +cd ../bar +$git init +$git submodule add "file://$(pwd)/../foo" baz +$git commit -am a +$git tag 2 - cd ../foo - # delete the commit referenced in bar - GIT_COMMITTER_NAME="Test" GIT_COMMITTER_EMAIL="no@mail" git commit --amend -m aa --author "Author " - git reflog expire --expire=now --all - git gc --aggressive --prune=now +cd ../foo +# delete the commit referenced in bar +$git commit --amend -m aa +$git reflog expire --expire=now --all +$git gc --aggressive --prune=now - cd .. - mkdir repo - mkdir metadata - echo "RepoType: git" >> metadata/fake.yml - echo "Repo: file://$(pwd)/bar" >> metadata/fake.yml - echo "Builds:" >> metadata/fake.yml - echo " - versionName: 1" >> metadata/fake.yml - echo " versionCode: 1" >> metadata/fake.yml - echo " submodules: true" >> metadata/fake.yml - echo "AutoUpdateMode: Version" >> metadata/fake.yml - echo "UpdateCheckMode: Tags" >> metadata/fake.yml - echo "UpdateCheckData: '|||'" >> metadata/fake.yml - echo "CurrentVersion: 1" >> metadata/fake.yml - echo "CurrentVersionCode: 1" >> metadata/fake.yml +cd .. +mkdir repo +mkdir metadata +echo "RepoType: git" >> metadata/fake.yml +echo "Repo: file://$(pwd)/bar" >> metadata/fake.yml +echo "Builds:" >> metadata/fake.yml +echo " - versionName: 1" >> metadata/fake.yml +echo " versionCode: 1" >> metadata/fake.yml +echo " submodules: true" >> metadata/fake.yml +echo "AutoUpdateMode: Version" >> metadata/fake.yml +echo "UpdateCheckMode: Tags" >> metadata/fake.yml +echo "UpdateCheckData: '|||'" >> metadata/fake.yml +echo "CurrentVersion: 1" >> metadata/fake.yml +echo "CurrentVersionCode: 1" >> metadata/fake.yml - $fdroid checkupdates --allow-dirty - grep "CurrentVersionCode: 2" metadata/fake.yml -fi +$fdroid checkupdates --allow-dirty +grep "CurrentVersionCode: 2" metadata/fake.yml #------------------------------------------------------------------------------# From 307cf8958c7319215d0e24bea78753d55345eaef Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 28 Jun 2021 18:57:49 +0200 Subject: [PATCH 0341/2116] run black to reformat code that does not have WIP merge requests --- fdroidserver/__init__.py | 5 +- fdroidserver/gpgsign.py | 4 +- fdroidserver/init.py | 129 +++++++++++++++++------- fdroidserver/mirror.py | 133 ++++++++++++++++++------- fdroidserver/nightly.py | 196 +++++++++++++++++++++++++++---------- fdroidserver/publish.py | 110 ++++++++++++++------- fdroidserver/signatures.py | 5 +- fdroidserver/signindex.py | 21 +++- fdroidserver/vmtools.py | 123 ++++++++++++++++------- 9 files changed, 519 insertions(+), 207 deletions(-) diff --git a/fdroidserver/__init__.py b/fdroidserver/__init__.py index 1e1cd42f..72a9c38d 100644 --- a/fdroidserver/__init__.py +++ b/fdroidserver/__init__.py @@ -1,4 +1,3 @@ - import gettext import glob import os @@ -8,7 +7,9 @@ import sys # support running straight from git and standard installs rootpaths = [ os.path.realpath(os.path.join(os.path.dirname(__file__), '..')), - os.path.realpath(os.path.join(os.path.dirname(__file__), '..', '..', '..', '..', 'share')), + os.path.realpath( + os.path.join(os.path.dirname(__file__), '..', '..', '..', '..', 'share') + ), os.path.join(sys.prefix, 'share'), ] diff --git a/fdroidserver/gpgsign.py b/fdroidserver/gpgsign.py index d5d92c6d..447c3906 100644 --- a/fdroidserver/gpgsign.py +++ b/fdroidserver/gpgsign.py @@ -59,7 +59,9 @@ def main(): signed = [] for output_dir in repodirs: if not os.path.isdir(output_dir): - raise FDroidException(_("Missing output directory") + " '" + output_dir + "'") + raise FDroidException( + _("Missing output directory") + " '" + output_dir + "'" + ) # Process any apks that are waiting to be signed... for f in sorted(glob.glob(os.path.join(output_dir, '*.*'))): diff --git a/fdroidserver/init.py b/fdroidserver/init.py index 6f6f8c38..c429f096 100644 --- a/fdroidserver/init.py +++ b/fdroidserver/init.py @@ -38,6 +38,7 @@ options = None def disable_in_config(key, value): """Write a key/value to the local config.yml, then comment it out.""" import yaml + with open('config.yml') as f: data = f.read() pattern = r'\n[\s#]*' + key + r':.*' @@ -54,16 +55,33 @@ def main(): # Parse command line... parser = ArgumentParser() common.setup_global_opts(parser) - parser.add_argument("-d", "--distinguished-name", default=None, - help=_("X.509 'Distinguished Name' used when generating keys")) - parser.add_argument("--keystore", default=None, - help=_("Path to the keystore for the repo signing key")) - parser.add_argument("--repo-keyalias", default=None, - help=_("Alias of the repo signing key in the keystore")) - parser.add_argument("--android-home", default=None, - help=_("Path to the Android SDK (sometimes set in ANDROID_HOME)")) - parser.add_argument("--no-prompt", action="store_true", default=False, - help=_("Do not prompt for Android SDK path, just fail")) + parser.add_argument( + "-d", + "--distinguished-name", + default=None, + help=_("X.509 'Distinguished Name' used when generating keys"), + ) + parser.add_argument( + "--keystore", + default=None, + help=_("Path to the keystore for the repo signing key"), + ) + parser.add_argument( + "--repo-keyalias", + default=None, + help=_("Alias of the repo signing key in the keystore"), + ) + parser.add_argument( + "--android-home", + default=None, + help=_("Path to the Android SDK (sometimes set in ANDROID_HOME)"), + ) + parser.add_argument( + "--no-prompt", + action="store_true", + default=False, + help=_("Do not prompt for Android SDK path, just fail"), + ) options = parser.parse_args() fdroiddir = os.getcwd() @@ -81,8 +99,9 @@ def main(): # and if the user leaves it blank, ignore and move on. default_sdk_path = '' if sys.platform == 'win32' or sys.platform == 'cygwin': - p = os.path.join(os.getenv('USERPROFILE'), - 'AppData', 'Local', 'Android', 'android-sdk') + p = os.path.join( + os.getenv('USERPROFILE'), 'AppData', 'Local', 'Android', 'android-sdk' + ) elif sys.platform == 'darwin': # on OSX, Homebrew is common and has an easy path to detect p = '/usr/local/opt/android-sdk' @@ -96,10 +115,13 @@ def main(): test_config['sdk_path'] = default_sdk_path if not common.test_sdk_exists(test_config): - del(test_config['sdk_path']) + del (test_config['sdk_path']) while not options.no_prompt: try: - s = input(_('Enter the path to the Android SDK (%s) here:\n> ') % default_sdk_path) + s = input( + _('Enter the path to the Android SDK (%s) here:\n> ') + % default_sdk_path + ) except KeyboardInterrupt: print('') sys.exit(1) @@ -112,8 +134,9 @@ def main(): default_sdk_path = '' if test_config.get('sdk_path') and not common.test_sdk_exists(test_config): - raise FDroidException(_("Android SDK not found at {path}!") - .format(path=test_config['sdk_path'])) + raise FDroidException( + _("Android SDK not found at {path}!").format(path=test_config['sdk_path']) + ) if not os.path.exists('config.yml') and not os.path.exists('config.py'): # 'metadata' and 'tmp' are created in fdroid @@ -124,12 +147,14 @@ def main(): shutil.copyfile(example_config_yml, 'config.yml') else: from pkg_resources import get_distribution + versionstr = get_distribution('fdroidserver').version if not versionstr: versionstr = 'master' with open('config.yml', 'w') as fp: - fp.write('# see https://gitlab.com/fdroid/fdroidserver/blob/' - + versionstr + '/examples/config.yml\n') + fp.write('# see https://gitlab.com/fdroid/fdroidserver/blob/') + fp.write(versionstr) + fp.write('/examples/config.yml\n') os.chmod('config.yml', 0o0600) # If android_home is None, test_config['sdk_path'] will be used and # "$ANDROID_HOME" may be used if the env var is set up correctly. @@ -138,7 +163,9 @@ def main(): if 'sdk_path' in test_config: common.write_to_config(test_config, 'sdk_path', options.android_home) else: - logging.warning('Looks like this is already an F-Droid repo, cowardly refusing to overwrite it...') + logging.warning( + 'Looks like this is already an F-Droid repo, cowardly refusing to overwrite it...' + ) logging.info('Try running `fdroid init` in an empty directory.') raise FDroidException('Repository already exists.') @@ -162,8 +189,9 @@ def main(): else: keystore = os.path.abspath(options.keystore) if not os.path.exists(keystore): - logging.info('"' + keystore - + '" does not exist, creating a new keystore there.') + logging.info( + '"' + keystore + '" does not exist, creating a new keystore there.' + ) common.write_to_config(test_config, 'keystore', keystore) repo_keyalias = None keydname = None @@ -174,12 +202,19 @@ def main(): keydname = options.distinguished_name common.write_to_config(test_config, 'keydname', keydname) if keystore == 'NONE': # we're using a smartcard - common.write_to_config(test_config, 'repo_keyalias', '1') # seems to be the default + common.write_to_config( + test_config, 'repo_keyalias', '1' + ) # seems to be the default disable_in_config('keypass', 'never used with smartcard') - common.write_to_config(test_config, 'smartcardoptions', - ('-storetype PKCS11 ' - + '-providerClass sun.security.pkcs11.SunPKCS11 ' - + '-providerArg opensc-fdroid.cfg')) + common.write_to_config( + test_config, + 'smartcardoptions', + ( + '-storetype PKCS11 ' + + '-providerClass sun.security.pkcs11.SunPKCS11 ' + + '-providerArg opensc-fdroid.cfg' + ), + ) # find opensc-pkcs11.so if not os.path.exists('opensc-fdroid.cfg'): if os.path.exists('/usr/lib/opensc-pkcs11.so'): @@ -187,29 +222,43 @@ def main(): elif os.path.exists('/usr/lib64/opensc-pkcs11.so'): opensc_so = '/usr/lib64/opensc-pkcs11.so' else: - files = glob.glob('/usr/lib/' + os.uname()[4] + '-*-gnu/opensc-pkcs11.so') + files = glob.glob( + '/usr/lib/' + os.uname()[4] + '-*-gnu/opensc-pkcs11.so' + ) if len(files) > 0: opensc_so = files[0] else: opensc_so = '/usr/lib/opensc-pkcs11.so' - logging.warning('No OpenSC PKCS#11 module found, ' - + 'install OpenSC then edit "opensc-fdroid.cfg"!') + logging.warning( + 'No OpenSC PKCS#11 module found, ' + + 'install OpenSC then edit "opensc-fdroid.cfg"!' + ) with open('opensc-fdroid.cfg', 'w') as f: f.write('name = OpenSC\nlibrary = ') f.write(opensc_so) f.write('\n') - logging.info("Repo setup using a smartcard HSM. Please edit keystorepass and repo_keyalias in config.yml.") - logging.info("If you want to generate a new repo signing key in the HSM you can do that with 'fdroid update " - "--create-key'.") + logging.info( + "Repo setup using a smartcard HSM. Please edit keystorepass and repo_keyalias in config.yml." + ) + logging.info( + "If you want to generate a new repo signing key in the HSM you can do that with 'fdroid update " + "--create-key'." + ) elif os.path.exists(keystore): to_set = ['keystorepass', 'keypass', 'repo_keyalias', 'keydname'] if repo_keyalias: to_set.remove('repo_keyalias') if keydname: to_set.remove('keydname') - logging.warning('\n' + _('Using existing keystore "{path}"').format(path=keystore) - + '\n' + _('Now set these in config.yml:') + ' ' - + ', '.join(to_set) + '\n') + logging.warning( + '\n' + + _('Using existing keystore "{path}"').format(path=keystore) + + '\n' + + _('Now set these in config.yml:') + + ' ' + + ', '.join(to_set) + + '\n' + ) else: password = common.genpassword() c = dict(test_config) @@ -229,11 +278,17 @@ def main(): msg += '\n ' + _('Keystore for signing key:\t') + keystore if repo_keyalias is not None: msg += '\n Alias for key in store:\t' + repo_keyalias - msg += '\n\n' + '''To complete the setup, add your APKs to "%s" + msg += '\n\n' + msg += ( + _( + '''To complete the setup, add your APKs to "%s" then run "fdroid update -c; fdroid update". You might also want to edit "config.yml" to set the URL, repo name, and more. You should also set up a signing key (a temporary one might have been automatically generated). For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo -and https://f-droid.org/docs/Signing_Process''' % os.path.join(fdroiddir, 'repo') +and https://f-droid.org/docs/Signing_Process''' + ) + % os.path.join(fdroiddir, 'repo') + ) logging.info(msg) diff --git a/fdroidserver/mirror.py b/fdroidserver/mirror.py index c34bd9a2..3187a3d3 100644 --- a/fdroidserver/mirror.py +++ b/fdroidserver/mirror.py @@ -33,8 +33,15 @@ def _run_wget(path, urls): with open(urls_file, 'w') as fp: for url in urls: fp.write(url.split('?')[0] + '\n') # wget puts query string in the filename - subprocess.call(['wget', verbose, '--continue', '--user-agent="fdroid mirror"', - '--input-file=' + urls_file]) + subprocess.call( + [ + 'wget', + verbose, + '--continue', + '--user-agent="fdroid mirror"', + '--input-file=' + urls_file, + ] + ) os.remove(urls_file) @@ -43,21 +50,47 @@ def main(): parser = ArgumentParser() common.setup_global_opts(parser) - parser.add_argument("url", nargs='?', - help=_('Base URL to mirror, can include the index signing key ' - + 'using the query string: ?fingerprint=')) - parser.add_argument("--all", action='store_true', default=False, - help=_("Mirror the full repo and archive, all file types.")) - parser.add_argument("--archive", action='store_true', default=False, - help=_("Also mirror the full archive section")) - parser.add_argument("--build-logs", action='store_true', default=False, - help=_("Include the build logs in the mirror")) - parser.add_argument("--pgp-signatures", action='store_true', default=False, - help=_("Include the PGP signature .asc files in the mirror")) - parser.add_argument("--src-tarballs", action='store_true', default=False, - help=_("Include the source tarballs in the mirror")) - parser.add_argument("--output-dir", default=None, - help=_("The directory to write the mirror to")) + parser.add_argument( + "url", + nargs='?', + help=_( + 'Base URL to mirror, can include the index signing key ' + + 'using the query string: ?fingerprint=' + ), + ) + parser.add_argument( + "--all", + action='store_true', + default=False, + help=_("Mirror the full repo and archive, all file types."), + ) + parser.add_argument( + "--archive", + action='store_true', + default=False, + help=_("Also mirror the full archive section"), + ) + parser.add_argument( + "--build-logs", + action='store_true', + default=False, + help=_("Include the build logs in the mirror"), + ) + parser.add_argument( + "--pgp-signatures", + action='store_true', + default=False, + help=_("Include the PGP signature .asc files in the mirror"), + ) + parser.add_argument( + "--src-tarballs", + action='store_true', + default=False, + help=_("Include the source tarballs in the mirror"), + ) + parser.add_argument( + "--output-dir", default=None, help=_("The directory to write the mirror to") + ) options = parser.parse_args() if options.all: @@ -77,24 +110,31 @@ def main(): def _append_to_url_path(*args): """Append the list of path components to URL, keeping the rest the same.""" newpath = posixpath.join(path, *args) - return urllib.parse.urlunparse((scheme, hostname, newpath, params, query, fragment)) + return urllib.parse.urlunparse( + (scheme, hostname, newpath, params, query, fragment) + ) if fingerprint: config = common.read_config(options) if not ('jarsigner' in config or 'apksigner' in config): - logging.error(_('Java JDK not found! Install in standard location or set java_paths!')) + logging.error( + _('Java JDK not found! Install in standard location or set java_paths!') + ) sys.exit(1) def _get_index(section, etag=None): url = _append_to_url_path(section) data, etag = index.download_repo_index(url, etag=etag) return data, etag, _append_to_url_path(section, 'index-v1.jar') + else: + def _get_index(section, etag=None): import io import json import zipfile from . import net + url = _append_to_url_path(section, 'index-v1.jar') content, etag = net.http_get(url) with zipfile.ZipFile(io.BytesIO(content)) as zip: @@ -107,21 +147,30 @@ def main(): ip = ipaddress.ip_address(hostname) except ValueError: pass - if hostname == 'f-droid.org' \ - or (ip is not None and hostname in socket.gethostbyname_ex('f-droid.org')[2]): - print(_('ERROR: this command should never be used to mirror f-droid.org!\n' - 'A full mirror of f-droid.org requires more than 200GB.')) + if hostname == 'f-droid.org' or ( + ip is not None and hostname in socket.gethostbyname_ex('f-droid.org')[2] + ): + print( + _( + 'ERROR: this command should never be used to mirror f-droid.org!\n' + 'A full mirror of f-droid.org requires more than 200GB.' + ) + ) sys.exit(1) path = path.rstrip('/') if path.endswith('repo') or path.endswith('archive'): - logging.warning(_('Do not include "{path}" in URL!') - .format(path=path.split('/')[-1])) + logging.warning( + _('Do not include "{path}" in URL!').format(path=path.split('/')[-1]) + ) elif not path.endswith('fdroid'): - logging.warning(_('{url} does not end with "fdroid", check the URL path!') - .format(url=options.url)) + logging.warning( + _('{url} does not end with "fdroid", check the URL path!').format( + url=options.url + ) + ) - icondirs = ['icons', ] + icondirs = ['icons'] for density in update.screen_densities: icondirs.append('icons-' + density) @@ -134,7 +183,7 @@ def main(): if options.archive: sections = ('repo', 'archive') else: - sections = ('repo', ) + sections = ('repo',) for section in sections: sectiondir = os.path.join(basedir, section) @@ -152,23 +201,29 @@ def main(): for packageName, packageList in data['packages'].items(): for package in packageList: to_fetch = [] - keys = ['apkName', ] + keys = ['apkName'] if options.src_tarballs: keys.append('srcname') for k in keys: if k in package: to_fetch.append(package[k]) elif k == 'apkName': - logging.error(_('{appid} is missing {name}') - .format(appid=package['packageName'], name=k)) + logging.error( + _('{appid} is missing {name}').format( + appid=package['packageName'], name=k + ) + ) for f in to_fetch: - if not os.path.exists(f) \ - or (f.endswith('.apk') and os.path.getsize(f) != package['size']): + if not os.path.exists(f) or ( + f.endswith('.apk') and os.path.getsize(f) != package['size'] + ): urls.append(_append_to_url_path(section, f)) if options.pgp_signatures: urls.append(_append_to_url_path(section, f + '.asc')) if options.build_logs and f.endswith('.apk'): - urls.append(_append_to_url_path(section, f[:-4] + '.log.gz')) + urls.append( + _append_to_url_path(section, f[:-4] + '.log.gz') + ) _run_wget(sectiondir, urls) @@ -181,7 +236,7 @@ def main(): for k in update.GRAPHIC_NAMES: f = d.get(k) if f: - filepath_tuple = components + (f, ) + filepath_tuple = components + (f,) urls.append(_append_to_url_path(*filepath_tuple)) _run_wget(os.path.join(basedir, *components), urls) for k in update.SCREENSHOT_DIRS: @@ -190,14 +245,16 @@ def main(): if filelist: components = (section, app['packageName'], locale, k) for f in filelist: - filepath_tuple = components + (f, ) + filepath_tuple = components + (f,) urls.append(_append_to_url_path(*filepath_tuple)) _run_wget(os.path.join(basedir, *components), urls) urls = dict() for app in data['apps']: if 'icon' not in app: - logging.error(_('no "icon" in {appid}').format(appid=app['packageName'])) + logging.error( + _('no "icon" in {appid}').format(appid=app['packageName']) + ) continue icon = app['icon'] for icondir in icondirs: diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 50239e20..85ef58fc 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -54,27 +54,72 @@ def _ssh_key_from_debug_keystore(keystore=KEYSTORE_FILE): p12 = os.path.join(tmp_dir, '.keystore.p12') _config = dict() common.fill_config_defaults(_config) - subprocess.check_call([_config['keytool'], '-importkeystore', - '-srckeystore', keystore, '-srcalias', KEY_ALIAS, - '-srcstorepass', PASSWORD, '-srckeypass', PASSWORD, - '-destkeystore', p12, '-destalias', KEY_ALIAS, - '-deststorepass', PASSWORD, '-destkeypass', PASSWORD, - '-deststoretype', 'PKCS12'], - env={'LC_ALL': 'C.UTF-8'}) - subprocess.check_call(['openssl', 'pkcs12', '-in', p12, '-out', key_pem, - '-passin', 'pass:' + PASSWORD, '-passout', 'pass:' + PASSWORD], - env={'LC_ALL': 'C.UTF-8'}) - subprocess.check_call(['openssl', 'rsa', '-in', key_pem, '-out', privkey, - '-passin', 'pass:' + PASSWORD], - env={'LC_ALL': 'C.UTF-8'}) + subprocess.check_call( + [ + _config['keytool'], + '-importkeystore', + '-srckeystore', + keystore, + '-srcalias', + KEY_ALIAS, + '-srcstorepass', + PASSWORD, + '-srckeypass', + PASSWORD, + '-destkeystore', + p12, + '-destalias', + KEY_ALIAS, + '-deststorepass', + PASSWORD, + '-destkeypass', + PASSWORD, + '-deststoretype', + 'PKCS12', + ], + env={'LC_ALL': 'C.UTF-8'}, + ) + subprocess.check_call( + [ + 'openssl', + 'pkcs12', + '-in', + p12, + '-out', + key_pem, + '-passin', + 'pass:' + PASSWORD, + '-passout', + 'pass:' + PASSWORD, + ], + env={'LC_ALL': 'C.UTF-8'}, + ) + subprocess.check_call( + [ + 'openssl', + 'rsa', + '-in', + key_pem, + '-out', + privkey, + '-passin', + 'pass:' + PASSWORD, + ], + env={'LC_ALL': 'C.UTF-8'}, + ) os.remove(key_pem) os.remove(p12) os.chmod(privkey, 0o600) # os.umask() should cover this, but just in case rsakey = paramiko.RSAKey.from_private_key_file(privkey) - fingerprint = base64.b64encode(hashlib.sha256(rsakey.asbytes()).digest()).decode('ascii').rstrip('=') - ssh_private_key_file = os.path.join(tmp_dir, 'debug_keystore_' - + fingerprint.replace('/', '_') + '_id_rsa') + fingerprint = ( + base64.b64encode(hashlib.sha256(rsakey.asbytes()).digest()) + .decode('ascii') + .rstrip('=') + ) + ssh_private_key_file = os.path.join( + tmp_dir, 'debug_keystore_' + fingerprint.replace('/', '_') + '_id_rsa' + ) shutil.move(privkey, ssh_private_key_file) pub = rsakey.get_name() + ' ' + rsakey.get_base64() + ' ' + ssh_private_key_file @@ -90,20 +135,46 @@ def main(): parser = ArgumentParser() common.setup_global_opts(parser) - parser.add_argument("--keystore", default=KEYSTORE_FILE, - help=_("Specify which debug keystore file to use.")) - parser.add_argument("--show-secret-var", action="store_true", default=False, - help=_("Print the secret variable to the terminal for easy copy/paste")) - parser.add_argument("--keep-private-keys", action="store_true", default=False, - help=_("Do not remove the private keys generated from the keystore")) - parser.add_argument("--no-deploy", action="store_true", default=False, - help=_("Do not deploy the new files to the repo")) - parser.add_argument("--file", default='app/build/outputs/apk/*.apk', - help=_('The file to be included in the repo (path or glob)')) - parser.add_argument("--no-checksum", action="store_true", default=False, - help=_("Don't use rsync checksums")) - parser.add_argument("--archive-older", type=int, default=20, - help=_("Set maximum releases in repo before older ones are archived")) + parser.add_argument( + "--keystore", + default=KEYSTORE_FILE, + help=_("Specify which debug keystore file to use."), + ) + parser.add_argument( + "--show-secret-var", + action="store_true", + default=False, + help=_("Print the secret variable to the terminal for easy copy/paste"), + ) + parser.add_argument( + "--keep-private-keys", + action="store_true", + default=False, + help=_("Do not remove the private keys generated from the keystore"), + ) + parser.add_argument( + "--no-deploy", + action="store_true", + default=False, + help=_("Do not deploy the new files to the repo"), + ) + parser.add_argument( + "--file", + default='app/build/outputs/apk/*.apk', + help=_('The file to be included in the repo (path or glob)'), + ) + parser.add_argument( + "--no-checksum", + action="store_true", + default=False, + help=_("Don't use rsync checksums"), + ) + parser.add_argument( + "--archive-older", + type=int, + default=20, + help=_("Set maximum releases in repo before older ones are archived"), + ) # TODO add --with-btlog options = parser.parse_args() @@ -149,9 +220,11 @@ def main(): + '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys') git_user_name = repo_git_base git_user_email = os.getenv('USER') + '@' + platform.node() - elif 'CIRCLE_REPOSITORY_URL' in os.environ \ - and 'CIRCLE_PROJECT_USERNAME' in os.environ \ - and 'CIRCLE_PROJECT_REPONAME' in os.environ: + elif ( + 'CIRCLE_REPOSITORY_URL' in os.environ + and 'CIRCLE_PROJECT_USERNAME' in os.environ + and 'CIRCLE_PROJECT_REPONAME' in os.environ + ): # we are in Circle CI repo_git_base = (os.getenv('CIRCLE_PROJECT_USERNAME') + '/' + os.getenv('CIRCLE_PROJECT_REPONAME') + NIGHTLY) @@ -229,7 +302,9 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, config += "repo_description = 'Nightly builds from %s'\n" % git_user_email config += "archive_name = '%s'\n" % (repo_git_base + ' archive') config += "archive_url = '%s'\n" % (repo_base + '/archive') - config += "archive_description = 'Old nightly builds that have been archived.'\n" + config += ( + "archive_description = 'Old nightly builds that have been archived.'\n" + ) config += "archive_older = %i\n" % options.archive_older config += "servergitmirrors = '%s'\n" % servergitmirror config += "keystore = '%s'\n" % KEYSTORE_FILE @@ -252,25 +327,38 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, for f in files: if f.endswith('-debug.apk'): apkfilename = os.path.join(root, f) - logging.debug(_('Stripping mystery signature from {apkfilename}') - .format(apkfilename=apkfilename)) + logging.debug( + _('Stripping mystery signature from {apkfilename}').format( + apkfilename=apkfilename + ) + ) destapk = os.path.join(repodir, os.path.basename(f)) os.chmod(apkfilename, 0o644) - logging.debug(_('Resigning {apkfilename} with provided debug.keystore') - .format(apkfilename=os.path.basename(apkfilename))) + logging.debug( + _( + 'Resigning {apkfilename} with provided debug.keystore' + ).format(apkfilename=os.path.basename(apkfilename)) + ) common.apk_strip_v1_signatures(apkfilename, strip_manifest=True) common.sign_apk(apkfilename, destapk, KEY_ALIAS) if options.verbose: logging.debug(_('attempting bare SSH connection to test deploy key:')) try: - subprocess.check_call(['ssh', '-Tvi', ssh_private_key_file, - '-oIdentitiesOnly=yes', '-oStrictHostKeyChecking=no', - servergitmirror.split(':')[0]]) + subprocess.check_call( + [ + 'ssh', + '-Tvi', + ssh_private_key_file, + '-oIdentitiesOnly=yes', + '-oStrictHostKeyChecking=no', + servergitmirror.split(':')[0], + ] + ) except subprocess.CalledProcessError: pass - app_url = clone_url[:-len(NIGHTLY)] + app_url = clone_url[: -len(NIGHTLY)] template = dict() template['AuthorName'] = clone_url.split('/')[4] template['AuthorWebSite'] = '/'.join(clone_url.split('/')[:4]) @@ -282,9 +370,13 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, with open('template.yml', 'w') as fp: yaml.dump(template, fp) - subprocess.check_call(['fdroid', 'update', '--rename-apks', '--create-metadata', '--verbose'], - cwd=repo_basedir) - common.local_rsync(options, repo_basedir + '/metadata/', git_mirror_metadatadir + '/') + subprocess.check_call( + ['fdroid', 'update', '--rename-apks', '--create-metadata', '--verbose'], + cwd=repo_basedir, + ) + common.local_rsync( + options, repo_basedir + '/metadata/', git_mirror_metadatadir + '/' + ) common.local_rsync(options, repo_basedir + '/stats/', git_mirror_statsdir + '/') mirror_git_repo.git.add(all=True) mirror_git_repo.index.commit("update app metadata") @@ -294,8 +386,11 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, cmd = ['fdroid', 'deploy', '--verbose', '--no-keep-git-mirror-archive'] subprocess.check_call(cmd, cwd=repo_basedir) except subprocess.CalledProcessError: - logging.error(_('cannot publish update, did you set the deploy key?') - + '\n' + deploy_key_url) + logging.error( + _('cannot publish update, did you set the deploy key?') + + '\n' + + deploy_key_url + ) sys.exit(1) if not options.keep_private_keys: @@ -326,8 +421,11 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, if options.show_secret_var: with open(options.keystore, 'rb') as fp: debug_keystore = base64.standard_b64encode(fp.read()).decode('ascii') - print(_('\n{path} encoded for the DEBUG_KEYSTORE secret variable:') - .format(path=options.keystore)) + print( + _('\n{path} encoded for the DEBUG_KEYSTORE secret variable:').format( + path=options.keystore + ) + ) print(debug_keystore) os.umask(umask) diff --git a/fdroidserver/publish.py b/fdroidserver/publish.py index 07a1ea6e..12280628 100644 --- a/fdroidserver/publish.py +++ b/fdroidserver/publish.py @@ -76,11 +76,16 @@ def key_alias(appid): def read_fingerprints_from_keystore(): """Obtain a dictionary containing all singning-key fingerprints which are managed by F-Droid, grouped by appid.""" - env_vars = {'LC_ALL': 'C.UTF-8', - 'FDROID_KEY_STORE_PASS': config['keystorepass']} - cmd = [config['keytool'], '-list', - '-v', '-keystore', config['keystore'], - '-storepass:env', 'FDROID_KEY_STORE_PASS'] + env_vars = {'LC_ALL': 'C.UTF-8', 'FDROID_KEY_STORE_PASS': config['keystorepass']} + cmd = [ + config['keytool'], + '-list', + '-v', + '-keystore', + config['keystore'], + '-storepass:env', + 'FDROID_KEY_STORE_PASS', + ] if config['keystore'] == 'NONE': cmd += config['smartcardoptions'] p = FDroidPopen(cmd, envs=env_vars, output=False) @@ -116,8 +121,10 @@ def sign_sig_key_fingerprint_list(jar_file): cmd += config['smartcardoptions'] else: # smardcards never use -keypass cmd += '-keypass:env', 'FDROID_KEY_PASS' - env_vars = {'FDROID_KEY_STORE_PASS': config['keystorepass'], - 'FDROID_KEY_PASS': config.get('keypass', "")} + env_vars = { + 'FDROID_KEY_STORE_PASS': config['keystorepass'], + 'FDROID_KEY_PASS': config.get('keypass', ""), + } p = common.FDroidPopen(cmd, envs=env_vars) if p.returncode != 0: raise FDroidException("Failed to sign '{}'!".format(jar_file)) @@ -201,24 +208,44 @@ def create_key_if_not_existing(keyalias): """ # See if we already have a key for this application, and # if not generate one... - env_vars = {'LC_ALL': 'C.UTF-8', - 'FDROID_KEY_STORE_PASS': config['keystorepass'], - 'FDROID_KEY_PASS': config.get('keypass', "")} - cmd = [config['keytool'], '-list', - '-alias', keyalias, '-keystore', config['keystore'], - '-storepass:env', 'FDROID_KEY_STORE_PASS'] + env_vars = { + 'LC_ALL': 'C.UTF-8', + 'FDROID_KEY_STORE_PASS': config['keystorepass'], + 'FDROID_KEY_PASS': config.get('keypass', ""), + } + cmd = [ + config['keytool'], + '-list', + '-alias', + keyalias, + '-keystore', + config['keystore'], + '-storepass:env', + 'FDROID_KEY_STORE_PASS', + ] if config['keystore'] == 'NONE': cmd += config['smartcardoptions'] p = FDroidPopen(cmd, envs=env_vars) if p.returncode != 0: logging.info("Key does not exist - generating...") - cmd = [config['keytool'], '-genkey', - '-keystore', config['keystore'], - '-alias', keyalias, - '-keyalg', 'RSA', '-keysize', '2048', - '-validity', '10000', - '-storepass:env', 'FDROID_KEY_STORE_PASS', - '-dname', config['keydname']] + cmd = [ + config['keytool'], + '-genkey', + '-keystore', + config['keystore'], + '-alias', + keyalias, + '-keyalg', + 'RSA', + '-keysize', + '2048', + '-validity', + '10000', + '-storepass:env', + 'FDROID_KEY_STORE_PASS', + '-dname', + config['keydname'], + ] if config['keystore'] == 'NONE': cmd += config['smartcardoptions'] else: @@ -235,11 +262,15 @@ def main(): global config, options # Parse command line... - parser = ArgumentParser(usage="%(prog)s [options] " - "[APPID[:VERCODE] [APPID[:VERCODE] ...]]") + parser = ArgumentParser( + usage="%(prog)s [options] " "[APPID[:VERCODE] [APPID[:VERCODE] ...]]" + ) common.setup_global_opts(parser) - parser.add_argument("appid", nargs='*', - help=_("application ID with optional versionCode in the form APPID[:VERCODE]")) + parser.add_argument( + "appid", + nargs='*', + help=_("application ID with optional versionCode in the form APPID[:VERCODE]"), + ) metadata.add_metadata_arguments(parser) options = parser.parse_args() metadata.warnings_action = options.W @@ -247,7 +278,9 @@ def main(): config = common.read_config(options) if not ('jarsigner' in config and 'keytool' in config): - logging.critical(_('Java JDK not found! Install in standard location or set java_paths!')) + logging.critical( + _('Java JDK not found! Install in standard location or set java_paths!') + ) sys.exit(1) common.assert_config_keystore(config) @@ -279,16 +312,21 @@ def main(): allapps = metadata.read_metadata() vercodes = common.read_pkg_args(options.appid, True) - common.get_metadata_files(vercodes) # only check appids + common.get_metadata_files(vercodes) # only check appids signed_apks = dict() generated_keys = dict() allaliases = check_for_key_collisions(allapps) - logging.info(ngettext('{0} app, {1} key aliases', - '{0} apps, {1} key aliases', len(allapps)).format(len(allapps), len(allaliases))) + logging.info( + ngettext( + '{0} app, {1} key aliases', '{0} apps, {1} key aliases', len(allapps) + ).format(len(allapps), len(allaliases)) + ) # Process any APKs or ZIPs that are waiting to be signed... - for apkfile in sorted(glob.glob(os.path.join(unsigned_dir, '*.apk')) - + glob.glob(os.path.join(unsigned_dir, '*.zip'))): + for apkfile in sorted( + glob.glob(os.path.join(unsigned_dir, '*.apk')) + + glob.glob(os.path.join(unsigned_dir, '*.zip')) + ): appid, vercode = common.publishednameinfo(apkfile) apkfilename = os.path.basename(apkfile) @@ -302,8 +340,9 @@ def main(): # There ought to be valid metadata for this app, otherwise why are we # trying to publish it? if appid not in allapps: - logging.error("Unexpected {0} found in unsigned directory" - .format(apkfilename)) + logging.error( + "Unexpected {0} found in unsigned directory".format(apkfilename) + ) sys.exit(1) app = allapps[appid] @@ -359,7 +398,9 @@ def main(): signature_file, _ignored, manifest, v2_files = signingfiles with open(signature_file, 'rb') as f: - devfp = common.signer_fingerprint_short(common.get_certificate(f.read())) + devfp = common.signer_fingerprint_short( + common.get_certificate(f.read()) + ) devsigned = '{}_{}_{}.apk'.format(appid, vercode, devfp) devsignedtmp = os.path.join(tmp_dir, devsigned) @@ -390,8 +431,7 @@ def main(): common.sign_apk(apkfile, signed_apk_path, keyalias) if appid not in signed_apks: signed_apks[appid] = [] - signed_apks[appid].append({"keyalias": keyalias, - "filename": apkfile}) + signed_apks[appid].append({"keyalias": keyalias, "filename": apkfile}) publish_source_tarball(apkfilename, unsigned_dir, output_dir) logging.info('Published ' + apkfilename) diff --git a/fdroidserver/signatures.py b/fdroidserver/signatures.py index 78f4bcd3..6d62cb07 100644 --- a/fdroidserver/signatures.py +++ b/fdroidserver/signatures.py @@ -89,8 +89,9 @@ def extract(options): def main(): parser = ArgumentParser() common.setup_global_opts(parser) - parser.add_argument("APK", nargs='*', - help=_("signed APK, either a file-path or HTTPS URL.")) + parser.add_argument( + "APK", nargs='*', help=_("signed APK, either a file-path or HTTPS URL.") + ) parser.add_argument("--no-check-https", action="store_true", default=False) options = parser.parse_args() diff --git a/fdroidserver/signindex.py b/fdroidserver/signindex.py index 3b1f671e..a586c92b 100644 --- a/fdroidserver/signindex.py +++ b/fdroidserver/signindex.py @@ -41,10 +41,19 @@ def sign_jar(jar): but then Android < 4.3 would not be able to verify it. https://code.google.com/p/android/issues/detail?id=38321 """ - args = [config['jarsigner'], '-keystore', config['keystore'], - '-storepass:env', 'FDROID_KEY_STORE_PASS', - '-digestalg', 'SHA1', '-sigalg', 'SHA1withRSA', - jar, config['repo_keyalias']] + args = [ + config['jarsigner'], + '-keystore', + config['keystore'], + '-storepass:env', + 'FDROID_KEY_STORE_PASS', + '-digestalg', + 'SHA1', + '-sigalg', + 'SHA1withRSA', + jar, + config['repo_keyalias'], + ] if config['keystore'] == 'NONE': args += config['smartcardoptions'] else: # smardcards never use -keypass @@ -96,7 +105,9 @@ def main(): if 'jarsigner' not in config: raise FDroidException( - _('Java jarsigner not found! Install in standard location or set java_paths!') + _( + 'Java jarsigner not found! Install in standard location or set java_paths!' + ) ) repodirs = ['repo'] diff --git a/fdroidserver/vmtools.py b/fdroidserver/vmtools.py index 84ac7928..2483a251 100644 --- a/fdroidserver/vmtools.py +++ b/fdroidserver/vmtools.py @@ -42,14 +42,18 @@ def get_clean_builder(serverdir): vagrantfile = os.path.join(serverdir, 'Vagrantfile') if not os.path.isfile(vagrantfile): with open(vagrantfile, 'w') as f: - f.write(textwrap.dedent("""\ + f.write( + textwrap.dedent( + """\ # generated file, do not change. Vagrant.configure("2") do |config| config.vm.box = "buildserver" config.vm.synced_folder ".", "/vagrant", disabled: true end - """)) + """ + ) + ) vm = get_build_vm(serverdir) logging.info('destroying buildserver before build') vm.destroy() @@ -119,25 +123,37 @@ def get_build_vm(srvdir, provider=None): if kvm_installed and vbox_installed: logging.debug('both kvm and vbox are installed.') elif kvm_installed: - logging.debug('libvirt is the sole installed and supported vagrant provider, selecting \'libvirt\'') + logging.debug( + 'libvirt is the sole installed and supported vagrant provider, selecting \'libvirt\'' + ) return LibvirtBuildVm(abssrvdir) elif vbox_installed: - logging.debug('virtualbox is the sole installed and supported vagrant provider, selecting \'virtualbox\'') + logging.debug( + 'virtualbox is the sole installed and supported vagrant provider, selecting \'virtualbox\'' + ) return VirtualboxBuildVm(abssrvdir) else: - logging.debug('could not confirm that either virtualbox or kvm/libvirt are installed') + logging.debug( + 'could not confirm that either virtualbox or kvm/libvirt are installed' + ) # try guessing provider from .../srvdir/.vagrant internals - vagrant_libvirt_path = os.path.join(abssrvdir, '.vagrant', 'machines', - 'default', 'libvirt') - has_libvirt_machine = isdir(vagrant_libvirt_path) \ - and len(os.listdir(vagrant_libvirt_path)) > 0 - vagrant_virtualbox_path = os.path.join(abssrvdir, '.vagrant', 'machines', - 'default', 'virtualbox') - has_vbox_machine = isdir(vagrant_virtualbox_path) \ - and len(os.listdir(vagrant_virtualbox_path)) > 0 + vagrant_libvirt_path = os.path.join( + abssrvdir, '.vagrant', 'machines', 'default', 'libvirt' + ) + has_libvirt_machine = ( + isdir(vagrant_libvirt_path) and len(os.listdir(vagrant_libvirt_path)) > 0 + ) + vagrant_virtualbox_path = os.path.join( + abssrvdir, '.vagrant', 'machines', 'default', 'virtualbox' + ) + has_vbox_machine = ( + isdir(vagrant_virtualbox_path) and len(os.listdir(vagrant_virtualbox_path)) > 0 + ) if has_libvirt_machine and has_vbox_machine: - logging.info('build vm provider lookup found virtualbox and libvirt, defaulting to \'virtualbox\'') + logging.info( + 'build vm provider lookup found virtualbox and libvirt, defaulting to \'virtualbox\'' + ) return VirtualboxBuildVm(abssrvdir) elif has_libvirt_machine: logging.debug('build vm provider lookup found \'libvirt\'') @@ -149,12 +165,15 @@ def get_build_vm(srvdir, provider=None): # try guessing provider from available buildserver boxes available_boxes = [] import vagrant + boxes = vagrant.Vagrant().box_list() for box in boxes: if box.name == "buildserver": available_boxes.append(box.provider) if "libvirt" in available_boxes and "virtualbox" in available_boxes: - logging.info('basebox lookup found virtualbox and libvirt boxes, defaulting to \'virtualbox\'') + logging.info( + 'basebox lookup found virtualbox and libvirt boxes, defaulting to \'virtualbox\'' + ) return VirtualboxBuildVm(abssrvdir) elif "libvirt" in available_boxes: logging.info('\'libvirt\' buildserver box available, using that') @@ -171,7 +190,7 @@ class FDroidBuildVmException(FDroidException): pass -class FDroidBuildVm(): +class FDroidBuildVm: """Abstract base class for working with FDroids build-servers. Use the factory method `fdroidserver.vmtools.get_build_vm()` for @@ -188,11 +207,18 @@ class FDroidBuildVm(): self.vgrntfile = os.path.join(srvdir, 'Vagrantfile') self.srvuuid = self._vagrant_fetch_uuid() if not isdir(srvdir): - raise FDroidBuildVmException("Can not init vagrant, directory %s not present" % (srvdir)) + raise FDroidBuildVmException( + "Can not init vagrant, directory %s not present" % (srvdir) + ) if not isfile(self.vgrntfile): - raise FDroidBuildVmException("Can not init vagrant, '%s' not present" % (self.vgrntfile)) + raise FDroidBuildVmException( + "Can not init vagrant, '%s' not present" % (self.vgrntfile) + ) import vagrant - self.vgrnt = vagrant.Vagrant(root=srvdir, out_cm=vagrant.stdout_cm, err_cm=vagrant.stdout_cm) + + self.vgrnt = vagrant.Vagrant( + root=srvdir, out_cm=vagrant.stdout_cm, err_cm=vagrant.stdout_cm + ) def up(self, provision=True): global lock @@ -302,7 +328,9 @@ class FDroidBuildVm(): """ boxfile = abspath(boxfile) if not isfile(boxfile): - raise FDroidBuildVmException('supplied boxfile \'%s\' does not exist', boxfile) + raise FDroidBuildVmException( + 'supplied boxfile \'%s\' does not exist', boxfile + ) self.vgrnt.box_add(boxname, abspath(boxfile), force=force) def box_remove(self, boxname): @@ -310,11 +338,13 @@ class FDroidBuildVm(): _check_call(['vagrant', 'box', 'remove', '--all', '--force', boxname]) except subprocess.CalledProcessError as e: logging.debug('tried removing box %s, but is did not exist: %s', boxname, e) - boxpath = os.path.join(expanduser('~'), '.vagrant', - self._vagrant_file_name(boxname)) + boxpath = os.path.join( + expanduser('~'), '.vagrant', self._vagrant_file_name(boxname) + ) if isdir(boxpath): - logging.info("attempting to remove box '%s' by deleting: %s", - boxname, boxpath) + logging.info( + "attempting to remove box '%s' by deleting: %s", boxname, boxpath + ) shutil.rmtree(boxpath) def sshinfo(self): @@ -325,11 +355,11 @@ class FDroidBuildVm(): A dictionary containing 'hostname', 'port', 'user' and 'idfile' """ import paramiko + try: sshconfig_path = os.path.join(self.srvdir, 'sshconfig') with open(sshconfig_path, 'wb') as fp: - fp.write(_check_output(['vagrant', 'ssh-config'], - cwd=self.srvdir)) + fp.write(_check_output(['vagrant', 'ssh-config'], cwd=self.srvdir)) vagranthost = 'default' # Host in ssh config file sshconfig = paramiko.SSHConfig() with open(sshconfig_path, 'r') as f: @@ -340,10 +370,12 @@ class FDroidBuildVm(): idfile = idfile[0] elif idfile.startswith('"') and idfile.endswith('"'): idfile = idfile[1:-1] - return {'hostname': sshconfig['hostname'], - 'port': int(sshconfig['port']), - 'user': sshconfig['user'], - 'idfile': idfile} + return { + 'hostname': sshconfig['hostname'], + 'port': int(sshconfig['port']), + 'user': sshconfig['user'], + 'idfile': idfile, + } except subprocess.CalledProcessError as e: raise FDroidBuildVmException("Error getting ssh config") from e @@ -411,21 +443,27 @@ class LibvirtBuildVm(FDroidBuildVm): # TODO use a libvirt storage pool to ensure the img file is readable if not os.access(imagepath, os.R_OK): logging.warning(_('Cannot read "{path}"!').format(path=imagepath)) - _check_call(['sudo', '/bin/chmod', '-R', 'a+rX', '/var/lib/libvirt/images']) + _check_call( + ['sudo', '/bin/chmod', '-R', 'a+rX', '/var/lib/libvirt/images'] + ) shutil.copy2(imagepath, 'box.img') _check_call(['qemu-img', 'rebase', '-p', '-b', '', 'box.img']) - img_info_raw = _check_output(['qemu-img', 'info', '--output=json', 'box.img']) + img_info_raw = _check_output( + ['qemu-img', 'info', '--output=json', 'box.img'] + ) img_info = json.loads(img_info_raw.decode('utf-8')) - metadata = {"provider": "libvirt", - "format": img_info['format'], - "virtual_size": math.ceil(img_info['virtual-size'] / (1024. ** 3)), - } + metadata = { + "provider": "libvirt", + "format": img_info['format'], + "virtual_size": math.ceil(img_info['virtual-size'] / (1024.0 ** 3)), + } logging.debug('preparing metadata.json for box %s', output) with open('metadata.json', 'w') as fp: fp.write(json.dumps(metadata)) logging.debug('preparing Vagrantfile for box %s', output) - vagrantfile = textwrap.dedent("""\ + vagrantfile = textwrap.dedent( + """\ Vagrant.configure("2") do |config| config.ssh.username = "vagrant" config.ssh.password = "vagrant" @@ -440,11 +478,18 @@ class LibvirtBuildVm(FDroidBuildVm): libvirt.memory = {memory} end - end""".format_map({'memory': str(int(domainInfo[1] / 1024)), 'cpus': str(domainInfo[3])})) + end""".format_map( + { + 'memory': str(int(domainInfo[1] / 1024)), + 'cpus': str(domainInfo[3]), + } + ) + ) with open('Vagrantfile', 'w') as fp: fp.write(vagrantfile) try: import libarchive + with libarchive.file_writer(output, 'gnutar', 'gzip') as tar: logging.debug('adding files to box %s ...', output) tar.add_files('metadata.json', 'Vagrantfile', 'box.img') @@ -506,6 +551,7 @@ class LibvirtBuildVm(FDroidBuildVm): def snapshot_exists(self, snapshot_name): import libvirt + try: dom = self.conn.lookupByName(self.srvname) return dom.snapshotLookupByName(snapshot_name) is not None @@ -515,6 +561,7 @@ class LibvirtBuildVm(FDroidBuildVm): def snapshot_revert(self, snapshot_name): logging.info("reverting vm '%s' to snapshot '%s'", self.srvname, snapshot_name) import libvirt + try: dom = self.conn.lookupByName(self.srvname) snap = dom.snapshotLookupByName(snapshot_name) From 28740ee036bff5939617acd73948e8e1bd309a97 Mon Sep 17 00:00:00 2001 From: "Felix C. Stegerman" Date: Sun, 27 Jun 2021 00:29:50 +0000 Subject: [PATCH 0342/2116] has_known_vulnerability(): check .so files with version in filename --- fdroidserver/update.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 19e53c1c..52b89116 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -641,7 +641,7 @@ def has_known_vulnerability(filename): files_in_apk = set() with zipfile.ZipFile(filename) as zf: for name in zf.namelist(): - if name.endswith('libcrypto.so') or name.endswith('libssl.so'): + if name.endswith('.so') and ('libcrypto' in name or 'libssl' in name): lib = zf.open(name) while True: chunk = lib.read(4096) From a148592243a011f29434d6b94d0e0e40bf45b648 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Mon, 28 Jun 2021 20:53:00 +0200 Subject: [PATCH 0343/2116] Translated using Weblate: Albanian (sq) by Besnik Bleta Currently translated at 97.7% (563 of 576 strings) Translated using Weblate: Albanian (sq) by Besnik Bleta Currently translated at 96.5% (556 of 576 strings) Co-authored-by: Besnik Bleta Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/ Translation: F-Droid/F-Droid Server --- locale/sq/LC_MESSAGES/fdroidserver.po | 44 +++++++++++---------------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index eabf5743..fdec9da6 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-29 10:51+0000\n" +"PO-Revision-Date: 2021-03-22 16:55+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" "Language: sq\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: ../fdroidserver/common.py msgid "" @@ -65,7 +65,7 @@ msgstr "\"%s/\" s’ka kartel tejtëdhënash me përputhje!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" +msgstr "\"repo_pubkey\" duhet të jetë i pranishëm te config.yml, kur përdoret --nosign!" #: ../fdroidserver/install.py #, python-brace-format @@ -445,9 +445,9 @@ msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, arc msgstr "Po kontrollohet arkivimi përr {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Po kontrollohet arkivimi përr {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Po kontrollohet arkivimi për {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -473,7 +473,7 @@ msgstr "Argumente që përplasen: '--verbose' dhe '--quiet' s’mund të përdor #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "Kartela formësimi me përplasje! Po përdoret {newfile}, po shpërfillet {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format @@ -524,7 +524,7 @@ msgstr "S’u gjet dot ID pakete" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" -msgstr "" +msgstr "Po refuzohet me burracakëri të mbishkruhet ujdisje ekzistuese kyçesh nënshkrimi!" #: ../fdroidserver/update.py msgid "Create a repo signing key in a keystore" @@ -724,7 +724,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "S’është ujdisur ndryshore {var} nga {configname}!" #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py @@ -865,7 +865,7 @@ msgstr "U gjetën versionCodes të pavlefshëm për disa aplikacione" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "" +msgstr "Te {path} u gjetën Kartela të shumta JAR Blloqesh Nënshkrimi" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1212,9 +1212,8 @@ msgid "No commit specified for {versionName} in {linedesc}" msgstr "Te {linedesc} s’ka parashtrim të specifikuar për {versionName}" #: ../fdroidserver/common.py -#, fuzzy msgid "No config.yml found, using defaults." -msgstr "S’u gjet 'config.yml', po përdoren parazgjedhjet." +msgstr "S’u gjet config.yml, po përdoren parazgjedhjet." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1670,7 +1669,7 @@ msgstr "Po hiqet nënshkrim misterioz nga {apkfilename}" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" -msgstr "" +msgstr "Po hiqet nënshkrim i mistershëm prej {apkfilename}" #: ../fdroidserver/lint.py #, python-format @@ -1735,15 +1734,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Këto janë aplikacionet që janë arkivuar nga depoja kryesore." #: ../fdroidserver/common.py -#, fuzzy msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" -"\n" -" Kjo është një depo aplikacionesh për t’u përdorur me FDroid. Aplikacionet\n" -" në këtë depo ose janë dyorë zyrtarë të montuar nga zhvilluesit e aplikacionit\n" -" origjinal, ose janë dyorë të montuar nga burimi prej f-droid.org duke përdorur\n" -" mjetet në https://gitlab.com/fdroid.\n" -" " +msgstr "Kjo është një depo aplikacionesh për t’u përdorur me F-Droid. Aplikacionet në këtë depo ose janë dyorë zyrtarë të montuar nga zhvilluesit e aplikacionit rigjinal, ose janë dyorë të montuar nga burimi prej f-droid.org duke përdorur mjetet në https://gitlab.com/fdroid." #: ../fdroidserver/import.py #, python-format @@ -1787,7 +1779,7 @@ msgstr "Tekst i papritur në të njëjtin rresht me {field} te {linedesc}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "" +msgstr "Zë i panjohur {key} në {configname}" #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" @@ -2471,9 +2463,9 @@ msgid "refuse downloading via insecure http connection (use https or specify --n msgstr "mos pranon shkarkim përmes lidhjeje http të pasigurt (përdorni https ose specifikoni --no-https-check): {apkfilename}" #: ../fdroidserver/index.py -#, fuzzy, python-format +#, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "repo_icon %s s’ekziston, po prodhohet vendmbajtëse." +msgstr "repo_icon \"repo/icons/%s\" s’ekziston, po prodhohet vendmbajtëse." #: ../fdroidserver/index.py #, python-format @@ -2679,14 +2671,14 @@ msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\" s’ekziston! Ndreqeni te config.yml." #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "{name} \"{path}\" s’ekziston! Ndreqeni te config.yml." +msgstr "{name} \"{section}/icons/{path}\" s’ekziston! Kontrolloni \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "{oldfile} është nxjerrë nga përdorimi, përdorni {newfile}" #: ../fdroidserver/import.py #, python-brace-format From 29048fdeec5badff4fe7d73fe9f604c963f7f7e9 Mon Sep 17 00:00:00 2001 From: forght Date: Mon, 28 Jun 2021 20:53:00 +0200 Subject: [PATCH 0344/2116] Translated using Weblate: German (de) by forght Currently translated at 95.4% (550 of 576 strings) Co-authored-by: forght Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index ff67ec62..0737a66f 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -16,8 +16,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-29 13:54+0100\n" -"Last-Translator: TobiGr \n" +"PO-Revision-Date: 2021-02-08 09:59+0000\n" +"Last-Translator: forght \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -875,9 +875,9 @@ msgid "Found invalid versionCodes for some apps" msgstr "Ungültige versionCodes für einige Apps gefunden" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "Mehrere Signaturzertifikate in {path} gefunden" +msgstr "Mehrere JAR-Signaturzertifikate in {path} gefunden" #: ../fdroidserver/metadata.py #, python-brace-format From de7ffcbe1d0cd0649e2fc42c1415758dbf6f76a8 Mon Sep 17 00:00:00 2001 From: FW Date: Mon, 28 Jun 2021 20:53:01 +0200 Subject: [PATCH 0345/2116] Translated using Weblate: German (de) by FW Currently translated at 96.7% (557 of 576 strings) Translated using Weblate: German (de) by FW Currently translated at 95.8% (552 of 576 strings) Translated using Weblate: German (de) by FW Currently translated at 95.4% (550 of 576 strings) Co-authored-by: FW Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 40 ++++++++++++--------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 0737a66f..f99005bf 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -11,13 +11,14 @@ # nautilusx , 2021. # forght , 2021. # TobiGr , 2021. +# FW , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-02-08 09:59+0000\n" -"Last-Translator: forght \n" +"PO-Revision-Date: 2021-02-08 10:41+0000\n" +"Last-Translator: FW \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -52,7 +53,6 @@ msgstr "" "Öffentlicher SSH-Schlüssel, der als Bereitstellungsschlüssel verwendet werden soll:" #: ../fdroidserver/nightly.py -#, fuzzy msgid "" "\n" "SSH public key to be used as deploy key:" @@ -76,7 +76,7 @@ msgstr "\"%s/\" besitzt keine zugehörige Metadaten-Datei!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" +msgstr "\"repo_pubkey\" muss in config.yml vorhanden sein, wenn --nosign verwendet wird!" #: ../fdroidserver/install.py #, python-brace-format @@ -299,7 +299,7 @@ msgstr "Android APK-Datei" #: ../fdroidserver/scanner.py msgid "Android DEX code" -msgstr "" +msgstr "Android DEX Code" #: ../fdroidserver/common.py ../fdroidserver/build.py #, python-brace-format @@ -426,7 +426,7 @@ msgstr "AppID {appid} konnte nicht aufgelöst werden" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" -msgstr "" +msgstr "\"{path}\" konnte nicht überschrieben werden" #: ../fdroidserver/rewritemeta.py msgid "Cannot use --list and --to at the same time" @@ -456,9 +456,9 @@ msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, arc msgstr "Archivierung auf {appid} überprüfen - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Archivierung auf {appid} überprüfen - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Archivierung auf {appid} überprüfen - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -516,9 +516,8 @@ msgstr "Konnte Größe \"{size}\" nicht parsen, falscher Typ \"{type}\"" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/import.py -#, fuzzy msgid "Couldn't find Application ID" -msgstr "Konnte Paket-ID nicht finden" +msgstr "Konnte Anwendungs-ID nicht finden" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py @@ -877,7 +876,7 @@ msgstr "Ungültige versionCodes für einige Apps gefunden" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "Mehrere JAR-Signaturzertifikate in {path} gefunden" +msgstr "Mehrere JAR-Signaturzertifikate in {path} gefunden" #: ../fdroidserver/metadata.py #, python-brace-format @@ -951,14 +950,13 @@ msgid "HTTPS must be used with Subversion URLs!" msgstr "HTTPS muss bei Subversion-URLs verwendet werden!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "If a git mirror gets to big, allow the archive to be deleted" msgstr "Wenn ein Git-Mirror zu groß wird, kann das Archiv gelöscht werden" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "Wenn dieser Upload fehlschlägt, versuchen Sie ihn manuell auf {url} hochzuladen." +msgstr "Wenn Hochladen fehlschlägt, versuchen Sie es händisch auf {url} hochzuladen." #: ../fdroidserver/metadata.py #, python-brace-format @@ -1108,7 +1106,7 @@ msgid "Invalid scrlib metadata: '{file}' does not exist" msgstr "Ungültige scrlib-Metadaten: '{file}' ist nicht vorhanden" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" msgstr "Ungültige srclib-Metadaten: '{file}' konnte nicht analysiert werden" @@ -1158,14 +1156,13 @@ msgid "Keystore for signing key:\t" msgstr "Schlüsselspeicher für den Signierschlüssel:\t" #: ../fdroidserver/lint.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "Der zuletzt verwendete Commit '{commit}' sieht aus wie ein Tag, aber der Update Check Modus ist '{ucm}'" +msgstr "Der zuletzt verwendete Commit '{commit}' sieht aus wie ein Tag, aber der Aktualisierung-Überprüfungs-Modus ist '{ucm}'" #: ../fdroidserver/lint.py -#, fuzzy msgid "Liberapay donation methods belong in the Liberapay: field" -msgstr "Liberapay-Spendenmethoden gehören in das LiberapayID-Flag" +msgstr "Liberapay-Spendenmethoden gehören in das Liberapay: Feld" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the LiberapayID flag" @@ -1348,9 +1345,8 @@ msgid "Only process apps with auto-updates" msgstr "Nur Apps mit automatischen Aktualisierungen verarbeiten" #: ../fdroidserver/lint.py -#, fuzzy msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "Flattr-Spendenmethoden gehören in die FlattrID-Flagge" +msgstr "OpenCollective-Spendenmethoden gehören in das OpenCollective: Feld" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -1682,7 +1678,7 @@ msgid "Striping mystery signature from {apkfilename}" msgstr "Entferne mysteriöse Signatur aus {apkfilename}" #: ../fdroidserver/nightly.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Stripping mystery signature from {apkfilename}" msgstr "Entferne mysteriöse Signatur aus {apkfilename}" From f99d464a003b3aeef31327e30c26484605afecb7 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Mon, 28 Jun 2021 20:53:01 +0200 Subject: [PATCH 0346/2116] Translated using Weblate: German (de) by TobiGr Currently translated at 96.8% (558 of 576 strings) Co-authored-by: TobiGr Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index f99005bf..b5a292fb 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -17,8 +17,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-02-08 10:41+0000\n" -"Last-Translator: FW \n" +"PO-Revision-Date: 2021-02-08 17:47+0000\n" +"Last-Translator: TobiGr \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -1783,9 +1783,8 @@ msgid "URL {url} in Description: {error}" msgstr "URL {url} in der Beschreibung: {error}" #: ../fdroidserver/lint.py -#, fuzzy msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "Ungültiges Lizenz-Tag \"%s\"! Verwenden Sie nur Tags von https://spdx.org/license-list" +msgstr "Ungültiges Lizenz-Tag \"{}\"! Verwenden Sie nur Tags von https://spdx.org/license-list, die durch die FSF oder OSI gebilligt werden." #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" From 25474016b1216bdaf221e4af3194f40cf0cb18de Mon Sep 17 00:00:00 2001 From: FW Date: Mon, 28 Jun 2021 20:53:02 +0200 Subject: [PATCH 0347/2116] Translated using Weblate: German (de) by FW Currently translated at 99.6% (574 of 576 strings) Co-authored-by: FW Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 47 +++++++++++++-------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index b5a292fb..a657dd1c 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -17,8 +17,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-02-08 17:47+0000\n" -"Last-Translator: TobiGr \n" +"PO-Revision-Date: 2021-02-08 21:42+0000\n" +"Last-Translator: FW \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -1784,7 +1784,7 @@ msgstr "URL {url} in der Beschreibung: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "Ungültiges Lizenz-Tag \"{}\"! Verwenden Sie nur Tags von https://spdx.org/license-list, die durch die FSF oder OSI gebilligt werden." +msgstr "Ungültiges Lizenz-Kennzeichen \"{}\"! Verwenden Sie nur Kennzeichen von https://spdx.org/license-list, die von FSF oder OSI anerkannt sind." #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" @@ -1798,7 +1798,7 @@ msgstr "Unerwarteter Text in der gleichen Zeile wie {field} in {linedesc}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "" +msgstr "Unbekannter Eintrag [key] in [configname]" #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" @@ -1904,14 +1904,14 @@ msgid "Unused file at %s" msgstr "Nicht verwendete Datei bei %s" #: ../fdroidserver/scanner.py -#, fuzzy, python-format +#, python-format msgid "Unused scandelete path: %s" -msgstr "Nicht verwendete Datei bei %s" +msgstr "Nicht verwendeter „scandelete“ Pfad: %s" #: ../fdroidserver/scanner.py -#, fuzzy, python-format +#, python-format msgid "Unused scanignore path: %s" -msgstr "Nicht verwendete Datei bei %s" +msgstr "Nicht verwendeter „scanignore“ Pfad: %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -2104,16 +2104,14 @@ msgstr "apksigner nicht gefunden, er wird zum Signieren benötigt!" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "application ID of file to operate on" -msgstr "App-ID, um auf Aktualisierungen zu prüfen" +msgstr "App-ID der Datei, die bearbeitet werden soll" #: ../fdroidserver/verify.py ../fdroidserver/publish.py #: ../fdroidserver/build.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py -#, fuzzy msgid "application ID with optional versionCode in the form APPID[:VERCODE]" -msgstr "App-ID mit optionalem Versionscode in der Form APPID[:VERCODE]" +msgstr "App-ID mit fakultativem Versionscode in der Form APPID[:VERCODE]" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py msgid "applicationId in the form APPID" @@ -2137,9 +2135,8 @@ msgid "argument \"-\" with mode %r" msgstr "Argument \"-\" mit Modus %r" #: ../fdroidserver/nightly.py -#, fuzzy msgid "attempting bare SSH connection to test deploy key:" -msgstr "Versuch einer reinen ssh-Verbindung, um den Deployment-Key zu testen:" +msgstr "Versuch einer reinen SSH-Verbindung, um den Deployment-Key zu testen:" #: ../fdroidserver/nightly.py msgid "attempting bare ssh connection to test deploy key:" @@ -2474,7 +2471,7 @@ msgstr "Positionsparameter" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" -msgstr "" +msgstr "Bereitstellen des Process Log {path} auf {dest} ist fehlgeschlagen!" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2487,9 +2484,9 @@ msgid "refuse downloading via insecure http connection (use https or specify --n msgstr "Download über ungesicherte HTTP-Verbindung verweigert (verwenden Sie HTTPS oder geben Sie --no-https-check an): {apkfilename}" #: ../fdroidserver/index.py -#, fuzzy, python-format +#, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "repo_icon %s existiert nicht, erzeuge Platzhalter." +msgstr "repo_icon \"repo/icons/%s\" existiert nicht, erzeuge Platzhalter." #: ../fdroidserver/index.py #, python-format @@ -2507,7 +2504,7 @@ msgstr "s3cmd-Sync {path} indizieren auf {url} und dann löschen" #: ../fdroidserver/scanner.py msgid "shared library" -msgstr "" +msgstr "dynamische Bibliothek" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2595,7 +2592,7 @@ msgstr "Verwende Apache libcloud zur Synchronisation mit {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "" +msgstr "virustotal.com limitiert die Zugriffe, warte auf Wiederholung …" #: ../fdroidserver/update.py msgid "wiki support is deprecated and will be removed in the next release!" @@ -2624,9 +2621,9 @@ msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "Die AndroidManifest.xml der App „{apkfilename}” hat ein ungültiges Datum: " #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{appid} does not have a name! Using application ID instead." -msgstr "{appid} besitzt keinen Namen! Verwende den Paketnamen stattdessen." +msgstr "{appid} besitzt keinen Namen! Die Anwendungs-ID wird stattdessen verwendet." #: ../fdroidserver/update.py #, python-brace-format @@ -2639,9 +2636,9 @@ msgid "{appid} from {path} is not a valid Android Package Name!" msgstr "{appid} von {path} ist kein gültiger Android-Paketname!" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" -msgstr "{appid} von {path} ist kein gültiger Android-Paketname!" +msgstr "{appid} von {path} ist keine gültige Android-Anwendungs-ID!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format @@ -2695,9 +2692,9 @@ msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\" existiert nicht! Korrigieren Sie es in der config.yml." #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "{name} \"{path}\" existiert nicht! Korrigieren Sie es in der config.yml." +msgstr "{name} \"{section}/icons/{path}\" existiert nicht! Überprüfe \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format From 9b76a2a0a611b5eaf2654bbdacc0d1cf0f1f9035 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Mon, 28 Jun 2021 20:53:02 +0200 Subject: [PATCH 0348/2116] Translated using Weblate: German (de) by TobiGr Currently translated at 99.6% (574 of 576 strings) Co-authored-by: TobiGr Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index a657dd1c..0423e66b 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -18,7 +18,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-02-08 21:42+0000\n" -"Last-Translator: FW \n" +"Last-Translator: TobiGr \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -1950,14 +1950,12 @@ msgstr "UpdateCheckMode ist gesetzt, aber es sieht so aus, als ob checkupdates n #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -#, fuzzy msgid "UpdateCheckName is set to the known application ID - it can be removed" -msgstr "Update Check Name ist auf die bekannte App-ID gesetzt - sie kann entfernt werden" +msgstr "UpdateCheckName ist auf die bekannte App-ID gesetzt - sie kann entfernt werden" #: ../fdroidserver/lint.py -#, fuzzy msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "Update Check Name ist auf die bekannte App-ID gesetzt - sie kann entfernt werden" +msgstr "UpdateCheckName ist auf eine bekannte App-ID gesetzt, sie kann entfernt werden" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1965,9 +1963,9 @@ msgid "Uploading {apkfilename} to androidobservatory.org" msgstr "Lade {apkfilename} auf androidobservatory.org hoch" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Uploading {apkfilename} to virustotal" -msgstr "Lese {apkfilename} aus dem Cache" +msgstr "Lade {apkfilename} auf VirusTotal hoch" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py From e4345ade148a7657967777cdc2dc7ed8edd404e5 Mon Sep 17 00:00:00 2001 From: fossdd Date: Mon, 28 Jun 2021 20:53:03 +0200 Subject: [PATCH 0349/2116] Translated using Weblate: German (de) by fossdd Currently translated at 100.0% (576 of 576 strings) Co-authored-by: fossdd Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 0423e66b..284addc2 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -12,13 +12,14 @@ # forght , 2021. # TobiGr , 2021. # FW , 2021. +# fossdd , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-02-08 21:42+0000\n" -"Last-Translator: TobiGr \n" +"PO-Revision-Date: 2021-02-10 20:09+0000\n" +"Last-Translator: fossdd \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -860,7 +861,7 @@ msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "Grafik \"{path}\" ohne Metadaten für App \"{name}\" gefunden!" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" msgstr "Schlechte Finanzierungsdatei \"{path}\" für \"{name}\" gefunden:" @@ -1745,16 +1746,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Dies sind die Apps, die aus dem Hauptrepository archiviert wurden." #: ../fdroidserver/common.py -#, fuzzy msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" -"\n" -" Dies ist eine Paketquelle für Anwendungen, die für die Benutzung\n" -" zusammen mit F-Droid gedacht ist. Die darin enthaltenen\n" -" Anwendungen sind entweder offizielle von den Entwicklern erstellte\n" -" Binärdateien oder werden von f-droid.org mithilfe des Werkzeugs auf\n" -" https://gitlab.com/fdroid aus dem Quellcode erstellt.\n" -" " +msgstr "Dies ist eine Paketquelle für Anwendungen, die für die Benutzung zusammen mit F-Droid gedacht ist. Die darin enthaltenen Anwendungen sind entweder offizielle von den Entwicklern erstellte Binärdateien oder werden von f-droid.org mithilfe des Werkzeugs auf https://gitlab.com/fdroid aus dem Quellcode erstellt." #: ../fdroidserver/import.py #, python-format From a4152e9b9d1d221b074c5491fbe84ac3786ce36f Mon Sep 17 00:00:00 2001 From: Ceeee Date: Mon, 28 Jun 2021 20:53:21 +0200 Subject: [PATCH 0350/2116] Translated using Weblate: German (de) by Ceeee Currently translated at 99.8% (575 of 576 strings) Co-authored-by: Ceeee Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 284addc2..be42ba7b 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -13,20 +13,21 @@ # TobiGr , 2021. # FW , 2021. # fossdd , 2021. +# Ceeee , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-02-10 20:09+0000\n" -"Last-Translator: fossdd \n" +"PO-Revision-Date: 2021-05-17 16:10+0000\n" +"Last-Translator: Ceeee \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.7-dev\n" #: ../fdroidserver/common.py msgid "" @@ -900,7 +901,7 @@ msgstr "Es wurden keine Signaturzertifikate für das Repository gefunden." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" -msgstr "Eine Nicht-Datei gefunden bei %s" +msgstr "Ungültige Datei bei %s" #: ../fdroidserver/deploy.py #, python-brace-format From 32ccb812526763708666476693a6b50fd8d890d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=2E=20R=C3=BCdinger?= Date: Mon, 28 Jun 2021 20:53:21 +0200 Subject: [PATCH 0351/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Germa?= =?UTF-8?q?n=20(de)=20by=20C.=20R=C3=BCdinger=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 99.8% (575 of 576 strings) Co-authored-by: C. Rüdinger Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index be42ba7b..062580ef 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -14,13 +14,14 @@ # FW , 2021. # fossdd , 2021. # Ceeee , 2021. +# C. Rüdinger , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-05-17 16:10+0000\n" -"Last-Translator: Ceeee \n" +"PO-Revision-Date: 2021-05-17 16:11+0000\n" +"Last-Translator: C. Rüdinger \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -628,7 +629,7 @@ msgstr "Beschreibung enthält eine Liste (%s), ist aber weder aufgezählt (*) no #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" -msgstr "Beschreibung der Länge {length} ist über dem {limit}-Zeichen Limit" +msgstr "Länge der Beschreibung {length} übersteigt die zulässige Zeichenzahl {limit}" #: ../fdroidserver/import.py msgid "Do not add 'disable:' to the generated build entries" From f8cf7c4095b37291211b7063c780ba7db4769a3d Mon Sep 17 00:00:00 2001 From: VfBFan Date: Mon, 28 Jun 2021 20:53:22 +0200 Subject: [PATCH 0352/2116] Translated using Weblate: German (de) by VfBFan Currently translated at 99.8% (575 of 576 strings) Co-authored-by: VfBFan Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 062580ef..2347a27e 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -15,13 +15,14 @@ # fossdd , 2021. # Ceeee , 2021. # C. Rüdinger , 2021. +# VfBFan , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-05-17 16:11+0000\n" -"Last-Translator: C. Rüdinger \n" +"Last-Translator: VfBFan \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -84,7 +85,7 @@ msgstr "\"repo_pubkey\" muss in config.yml vorhanden sein, wenn --nosign verwend #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "'{apkfilename}' ist auf {dev} bereits installiert." +msgstr "'{apkfilename}' ist bereits auf {dev} installiert." #: ../fdroidserver/update.py #, python-brace-format @@ -104,7 +105,7 @@ msgstr "„{path}” vorhanden, aber S3cmd ist nicht installiert!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "\"{path}\" ist kein akzeptiertes Format, umwandeln in metadata/*.yml" +msgstr "\"{path}\" ist ein nicht unterstütztes Dateiformat (Verwendung: metadata/*.yml)" #: ../fdroidserver/metadata.py #, python-brace-format @@ -248,6 +249,7 @@ msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." msgstr ".fdroid.txt wird nicht unterstützt! Konvertieren Sie in .fdroid.yml oder .fdroid.json." #: ../fdroidserver/lint.py +#, fuzzy msgid "/issues is missing" msgstr "/Probleme fehlen" @@ -372,7 +374,7 @@ msgstr "Zweig „{branch}”, der als Bestätigung im Build verwendet wird „{v #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" -msgstr "Zweig „{branch}” wird als Bestätigung in srclib verwendet „{srclib}”." +msgstr "Zweig „{branch}” wird als Bestätigung in srclib verwendet „{srclib}”" #: ../fdroidserver/update.py #, python-brace-format @@ -412,8 +414,8 @@ msgstr "Built-Repo basiert in „%s” auf der Konfiguration von:" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" -msgstr[0] "Kann nicht erstellt werden, da {} Fehler beim Prüfen aufgetreten ist." -msgstr[1] "Kann nicht erstellt werden, da {} Fehler beim Prüfen aufgetreten sind." +msgstr[0] "Kann nicht erstellt werden, da {} Fehler beim Prüfen aufgetreten ist" +msgstr[1] "Kann nicht erstellt werden, da {} Fehler beim Prüfen aufgetreten sind" #: ../fdroidserver/vmtools.py #, python-brace-format @@ -560,7 +562,7 @@ msgstr "„{path}” für die Konfiguration von S3cmd wird erstellt." #: ../fdroidserver/publish.py msgid "Creating log directory" -msgstr "Erstelle Log Verzeichnis" +msgstr "Erstelle Logverzeichnis" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -959,7 +961,7 @@ msgstr "Wenn ein Git-Mirror zu groß wird, kann das Archiv gelöscht werden" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "Wenn Hochladen fehlschlägt, versuchen Sie es händisch auf {url} hochzuladen." +msgstr "Wenn das Hochladen fehlschlägt, versuchen Sie es händisch auf {url} hochzuladen" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1527,7 +1529,7 @@ msgstr "{apkfilename} erneut mit dem mitgelieferten debug.keystore signieren" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" -msgstr "Größe aller Symbole ändern, die die maximale Pixelgröße überschreiten, und beenden" +msgstr "Größe aller Symbole ändern, welche die maximale Pixelgröße überschreiten, und beenden" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" @@ -1779,7 +1781,7 @@ msgstr "URL {url} in der Beschreibung: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "Ungültiges Lizenz-Kennzeichen \"{}\"! Verwenden Sie nur Kennzeichen von https://spdx.org/license-list, die von FSF oder OSI anerkannt sind." +msgstr "Ungültiges Lizenz-Tag \"{}\"! Verwenden Sie nur Kennzeichen von https://spdx.org/license-list, die von FSF oder OSI anerkannt sind" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" @@ -1793,7 +1795,7 @@ msgstr "Unerwarteter Text in der gleichen Zeile wie {field} in {linedesc}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "Unbekannter Eintrag [key] in [configname]" +msgstr "Unbekannter Eintrag {key} in {configname}" #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" From 9a5aedf5f2e669a30a57f0ecd2da706ff8ddbff9 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Mon, 28 Jun 2021 20:53:22 +0200 Subject: [PATCH 0353/2116] Translated using Weblate: German (de) by TobiGr Currently translated at 99.8% (575 of 576 strings) Co-authored-by: TobiGr Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 2347a27e..afc23d23 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -21,8 +21,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-05-17 16:11+0000\n" -"Last-Translator: VfBFan \n" +"PO-Revision-Date: 2021-05-17 16:12+0000\n" +"Last-Translator: TobiGr \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -2490,7 +2490,7 @@ msgstr "repo_icon %s existiert nicht, erzeuge Platzhalter." #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." -msgstr "ruamel.yaml ist nicht installiert, kann Metadaten nicht schreiben" +msgstr "ruamel.yaml ist nicht installiert, kann Metadaten nicht schreiben." #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format From c9ce31e416a61206ea816a20adadc705982a5e19 Mon Sep 17 00:00:00 2001 From: Ceeee Date: Mon, 28 Jun 2021 20:53:23 +0200 Subject: [PATCH 0354/2116] Translated using Weblate: German (de) by Ceeee Currently translated at 98.9% (570 of 576 strings) Co-authored-by: Ceeee Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index afc23d23..0f1225c7 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -21,8 +21,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-05-17 16:12+0000\n" -"Last-Translator: TobiGr \n" +"PO-Revision-Date: 2021-05-17 16:35+0000\n" +"Last-Translator: Ceeee \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -2740,5 +2740,5 @@ msgstr[1] "{} Builds fehlgeschlagen" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" -msgstr[0] "Buildvorgang erfolgreich" -msgstr[1] "Buildvorgänge erfolgreich" +msgstr[0] "{} Build erfolgreich" +msgstr[1] "{} Builds erfolgreich" From 94c60720586b4fc065d1066dbc60c488be739f13 Mon Sep 17 00:00:00 2001 From: VfBFan Date: Mon, 28 Jun 2021 20:53:23 +0200 Subject: [PATCH 0355/2116] Translated using Weblate: German (de) by VfBFan Currently translated at 98.9% (570 of 576 strings) Co-authored-by: VfBFan Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 29 ++++++++++++++++----------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 0f1225c7..dbc55340 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -21,8 +21,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-05-17 16:35+0000\n" -"Last-Translator: Ceeee \n" +"PO-Revision-Date: 2021-05-17 16:36+0000\n" +"Last-Translator: VfBFan \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -673,7 +673,7 @@ msgstr "Keine rsync-Prüfsummen verwenden" #: ../fdroid ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" -msgstr "Komplette Spiegel von kleinen Repos herunterladen" +msgstr "Komplette Spiegel von kleinen Paketquellen herunterladen" #: ../fdroidserver/stats.py msgid "Download logs we don't have" @@ -904,7 +904,7 @@ msgstr "Es wurden keine Signaturzertifikate für das Repository gefunden." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" -msgstr "Ungültige Datei bei %s" +msgstr "Ungültige Datei bei %s gefunden" #: ../fdroidserver/deploy.py #, python-brace-format @@ -989,19 +989,22 @@ msgstr "Ignoriere die Datei {ext} bei '{path}'" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "APKs einschliessen, die mit deaktivierten Algorithmen wie MD5 signiert sind" +msgstr "APKs einschließen, die mit deaktivierten Algorithmen wie MD5 signiert sind" #: ../fdroidserver/mirror.py +#, fuzzy msgid "Include the PGP signature .asc files in the mirror" -msgstr "Die .asc-PGP-Signaturdateien in den Spiegel aufnehmen" +msgstr "Einbinden der .asc-PGP-Signaturdateien in den Spiegelserver" #: ../fdroidserver/mirror.py +#, fuzzy msgid "Include the build logs in the mirror" -msgstr "Erstellungsprotokolle in den Spiegel aufnehmen" +msgstr "Einbinden der Build-Protokolle in den Spiegelserver" #: ../fdroidserver/mirror.py +#, fuzzy msgid "Include the source tarballs in the mirror" -msgstr "Quellen-Tarballs in den Spiegel aufnehmen" +msgstr "Einbinden der Quellen-Tarballs in den Spiegelserver" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1186,8 +1189,9 @@ msgid "Make the build stop on exceptions" msgstr "Erstellung bei Fehlern anhalten" #: ../fdroidserver/index.py +#, fuzzy msgid "Malformed repository mirrors." -msgstr "Fehlerhafte Repository Mirrors." +msgstr "Fehlerhafte Paketquellen-Spiegelserver." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" @@ -1195,7 +1199,7 @@ msgstr "Fehlerhafte serverwebroot Zeile:" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." -msgstr "Das vollständige Repo und Archiv spiegeln, alle Dateitypen." +msgstr "Spiegeln Sie die komplette Paketquelle und das Archiv, inklusive aller Dateitypen." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" @@ -1717,8 +1721,9 @@ msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "Basis-Adresse zur Anmeldung am Repository (Standard: https://f-droid.org)" #: ../fdroidserver/mirror.py +#, fuzzy msgid "The directory to write the mirror to" -msgstr "Das Verzeichnis, in das der Mirror geschrieben werden soll" +msgstr "Das Verzeichnis, in das der Spiegelserver geschrieben werden soll" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" @@ -2353,7 +2358,7 @@ msgstr "local_copy_dir muß ein Verzeichnis sein, keine Datei!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" -msgstr "Mirror '%s' ended nicht auf 'fdroid'!" +msgstr "Spiegelserver '%s' ended nicht mit 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From 6ba354fefa80f42cd1dcdb63de946a96d65080dc Mon Sep 17 00:00:00 2001 From: forght Date: Mon, 28 Jun 2021 20:53:24 +0200 Subject: [PATCH 0356/2116] Translated using Weblate: German (de) by forght Currently translated at 98.9% (570 of 576 strings) Co-authored-by: forght Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index dbc55340..ea0129a0 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -22,7 +22,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-05-17 16:36+0000\n" -"Last-Translator: VfBFan \n" +"Last-Translator: forght \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -956,7 +956,7 @@ msgstr "HTTPS muss bei Subversion-URLs verwendet werden!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "Wenn ein Git-Mirror zu groß wird, kann das Archiv gelöscht werden" +msgstr "Wenn ein Git-Mirror zu groß wird, erlaube dem Archiv gelöscht zu werden" #: ../fdroidserver/deploy.py #, python-brace-format From 5b70b65d852a8a2db89b8ea6c86c8741dd25b5a0 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Mon, 28 Jun 2021 20:53:24 +0200 Subject: [PATCH 0357/2116] Translated using Weblate: German (de) by TobiGr Currently translated at 99.8% (575 of 576 strings) Co-authored-by: TobiGr Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index ea0129a0..cc072c92 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -21,8 +21,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-05-17 16:36+0000\n" -"Last-Translator: forght \n" +"PO-Revision-Date: 2021-05-25 13:33+0000\n" +"Last-Translator: TobiGr \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -2674,7 +2674,7 @@ msgstr "{appid}: {field} muss ein '{type}' sein, ist aber ein '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" -msgstr "{build_flag} muss ein Integer sein: {value}" +msgstr "{build_flag} muss ein Integer sein, gefunden: {value}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2724,7 +2724,7 @@ msgstr "{path} hat Dateigröße Null!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" -msgstr "{path} ist größer als 200MB und muss manuell zu {url} hochgeladen werden" +msgstr "{path} ist größer als 200MB und muss manuell auf {url} hochgeladen werden" #: ../fdroidserver/mirror.py #, python-brace-format From 916a0fd063a6719e266bd991295a4f811644fb8e Mon Sep 17 00:00:00 2001 From: Roman Leo Date: Mon, 28 Jun 2021 20:53:24 +0200 Subject: [PATCH 0358/2116] Translated using Weblate: German (de) by Roman Leo Currently translated at 99.8% (575 of 576 strings) Co-authored-by: Roman Leo Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index cc072c92..c1720eca 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -16,13 +16,14 @@ # Ceeee , 2021. # C. Rüdinger , 2021. # VfBFan , 2021. +# Roman Leo , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-05-25 13:33+0000\n" -"Last-Translator: TobiGr \n" +"Last-Translator: Roman Leo \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -992,17 +993,14 @@ msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "APKs einschließen, die mit deaktivierten Algorithmen wie MD5 signiert sind" #: ../fdroidserver/mirror.py -#, fuzzy msgid "Include the PGP signature .asc files in the mirror" msgstr "Einbinden der .asc-PGP-Signaturdateien in den Spiegelserver" #: ../fdroidserver/mirror.py -#, fuzzy msgid "Include the build logs in the mirror" msgstr "Einbinden der Build-Protokolle in den Spiegelserver" #: ../fdroidserver/mirror.py -#, fuzzy msgid "Include the source tarballs in the mirror" msgstr "Einbinden der Quellen-Tarballs in den Spiegelserver" @@ -1189,7 +1187,6 @@ msgid "Make the build stop on exceptions" msgstr "Erstellung bei Fehlern anhalten" #: ../fdroidserver/index.py -#, fuzzy msgid "Malformed repository mirrors." msgstr "Fehlerhafte Paketquellen-Spiegelserver." @@ -1721,9 +1718,8 @@ msgid "The base URL for the repo to log (default: https://f-droid.org)" msgstr "Basis-Adresse zur Anmeldung am Repository (Standard: https://f-droid.org)" #: ../fdroidserver/mirror.py -#, fuzzy msgid "The directory to write the mirror to" -msgstr "Das Verzeichnis, in das der Spiegelserver geschrieben werden soll" +msgstr "Das Verzeichnis in das der Spiegelserver geschrieben werden soll" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" From 85aed2ca67ea16a5dd9fa56fe5d1783c4b0b7a14 Mon Sep 17 00:00:00 2001 From: Follpvosten Date: Mon, 28 Jun 2021 20:53:25 +0200 Subject: [PATCH 0359/2116] Translated using Weblate: German (de) by Follpvosten Currently translated at 100.0% (576 of 576 strings) Co-authored-by: Follpvosten Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index c1720eca..d59f087d 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -17,13 +17,14 @@ # C. Rüdinger , 2021. # VfBFan , 2021. # Roman Leo , 2021. +# Follpvosten , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-05-25 13:33+0000\n" -"Last-Translator: Roman Leo \n" +"PO-Revision-Date: 2021-05-26 20:33+0000\n" +"Last-Translator: Follpvosten \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -250,9 +251,8 @@ msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." msgstr ".fdroid.txt wird nicht unterstützt! Konvertieren Sie in .fdroid.yml oder .fdroid.json." #: ../fdroidserver/lint.py -#, fuzzy msgid "/issues is missing" -msgstr "/Probleme fehlen" +msgstr "/issues fehlt" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" From c08d47c3cce0503002f10a54eaa825276ed24883 Mon Sep 17 00:00:00 2001 From: VfBFan Date: Mon, 28 Jun 2021 20:53:26 +0200 Subject: [PATCH 0360/2116] Translated using Weblate: German (de) by VfBFan Currently translated at 100.0% (576 of 576 strings) Co-authored-by: VfBFan Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index d59f087d..ab04368d 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -23,15 +23,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-05-26 20:33+0000\n" -"Last-Translator: Follpvosten \n" +"PO-Revision-Date: 2021-06-21 18:34+0000\n" +"Last-Translator: VfBFan \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.7\n" #: ../fdroidserver/common.py msgid "" @@ -682,7 +682,7 @@ msgstr "Herunterladung von Logs welche wir nicht haben" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." -msgstr "Herunterladen des Repositories bereits einmal fehlgeschlagen, versuche es nicht nochmal." +msgstr "Herunterladen des Repositorys bereits einmal fehlgeschlagen, versuche es nicht nochmal." #: ../fdroidserver/verify.py #, python-brace-format @@ -1731,11 +1731,11 @@ msgstr "Derzeit werden nur die Befehle „init” und „update” unterstützt" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." -msgstr "Der Fingerabdruck des Repositories stimmt nicht." +msgstr "Der Fingerabdruck des Repositorys stimmt nicht." #: ../fdroidserver/common.py msgid "The repository's index could not be verified." -msgstr "Der Index des Repositories konnte nicht verifiziert werden." +msgstr "Der Index des Repositorys konnte nicht verifiziert werden." #: ../fdroidserver/deploy.py #, python-brace-format From 52566818d6c6075ea1b2ab40c0045d976cc91cce Mon Sep 17 00:00:00 2001 From: IvanDan Date: Mon, 28 Jun 2021 20:52:58 +0200 Subject: [PATCH 0361/2116] Translated using Weblate: Italian (it) by IvanDan Currently translated at 64.4% (371 of 576 strings) Co-authored-by: IvanDan Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ Translation: F-Droid/F-Droid Server --- locale/it/LC_MESSAGES/fdroidserver.po | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 74f7b9cb..57f5ecea 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -3,7 +3,7 @@ # This file is distributed under the same license as the PACKAGE package. # random r , 2020. # Luca Zambarda , 2020. -# IvanDan , 2020. +# IvanDan , 2020, 2021. # Massimiliano Caniparoli , 2020. # x , 2020. # Hans-Christoph Steiner , 2020. @@ -14,8 +14,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-14 21:33+0000\n" -"Last-Translator: Francesco Esposito \n" +"PO-Revision-Date: 2021-02-05 14:41+0000\n" +"Last-Translator: IvanDan \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" @@ -1741,15 +1741,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "" #: ../fdroidserver/common.py -#, fuzzy msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" -"\n" -" Questo è un repository di app da usare con FDroid. Le applicazioni in questo\n" -" repository sono binari ufficiali compilati dagli sviluppatori originali \n" -" dell'applicazione, oppure sono binari compilati dai sorgenti da f-droid.org\n" -" usando i tool su https://gitlab.com/fdroid.\n" -" " +msgstr "Questo è un repository di applicazioni da utilizzare con F-Droid. Le applicazioni in questo repository sono o binari ufficiali compilati dagli sviluppatori dell'applicazione originale, o sono binari compilati dai sorgenti dall'amministratore di f-droid.org usando gli strumenti su https://gitlab.com/fdroid." #: ../fdroidserver/import.py #, python-format From e5ca5a5075c874d41faf0eb8a89092cbf78733ee Mon Sep 17 00:00:00 2001 From: mondstern Date: Mon, 28 Jun 2021 20:53:06 +0200 Subject: [PATCH 0362/2116] Translated using Weblate: Italian (it) by mondstern Currently translated at 71.5% (412 of 576 strings) Co-authored-by: mondstern Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ Translation: F-Droid/F-Droid Server --- locale/it/LC_MESSAGES/fdroidserver.po | 93 ++++++++++++++------------- 1 file changed, 47 insertions(+), 46 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 57f5ecea..d7247974 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -9,20 +9,21 @@ # Hans-Christoph Steiner , 2020. # Francesco Saltori , 2020. # Francesco Esposito , 2021. +# mondstern , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-02-05 14:41+0000\n" -"Last-Translator: IvanDan \n" +"PO-Revision-Date: 2021-03-01 21:55+0000\n" +"Last-Translator: mondstern \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.5\n" #: ../fdroidserver/common.py msgid "" @@ -72,7 +73,7 @@ msgstr "\"%s/\" non ha un file di metadati corrispondente!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" +msgstr "\"repo_pubkey\" deve essere presente in config.yml quando si utilizza nos nosign!" #: ../fdroidserver/install.py #, python-brace-format @@ -1170,7 +1171,7 @@ msgstr "Elenca i file che verrebbero riformattati" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" -msgstr "" +msgstr "Locale incluso in f-droid.org URL" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" @@ -1186,7 +1187,7 @@ msgstr "Riga del serverwebroot malformata:" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." -msgstr "" +msgstr "Rispecchiare il repository completo e l'archivio, tutti i tipi di file." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" @@ -1351,7 +1352,7 @@ msgstr "Opzioni" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." -msgstr "" +msgstr "Rapporto di uscita JSON al file chiamato dopo APK." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." @@ -1361,7 +1362,7 @@ msgstr "Invia l'output del JSON allo stdout." #: ../fdroidserver/update.py ../fdroidserver/signindex.py #: ../fdroidserver/checkupdates.py msgid "Outputting JSON" -msgstr "" +msgstr "Output di JSON" #: ../fdroidserver/import.py msgid "Overall license of the project." @@ -1461,7 +1462,7 @@ msgstr "Invio del log di trasparenza binaria su {url}" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Pushing to {url}" -msgstr "" +msgstr "Spingere a {url}" #: ../fdroid ../fdroidserver/__main__.py msgid "Quickly start a new repository" @@ -1563,7 +1564,7 @@ msgstr "Esecuzione di wget in {path}" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "" +msgstr "Scansiona gli APK risultanti per le classi non libere note." #: ../fdroid ../fdroidserver/__main__.py msgid "Scan the source code of a package" @@ -1572,44 +1573,44 @@ msgstr "Scansiona il codice sorgente di un pacchetto" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" -msgstr "" +msgstr "Scanner trovato {count} problemi in {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" -msgstr "" +msgstr "Scanner trovato {count} problemi in {appid}: {versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Scanner trovato {} problema" +msgstr[1] "Scanner trovato {} problemi" #: ../fdroidserver/common.py msgid "Set clock to that time using:" -msgstr "" +msgstr "Imposta l'orologio a quell'ora usando:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "" +msgstr "Imposta le versioni massime in repo prima che quelle più vecchie vengano archiviate" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" -msgstr "" +msgstr "Imposta il limite di file aperto su {integer}" #: ../fdroid ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" -msgstr "" +msgstr "Impostare una build di app per un repository di build notturno" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " -msgstr "" +msgstr "Impostazione del limite di file aperto non riuscita: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" -msgstr "" +msgstr "Impostazione del timeout {0} sec per questa build" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" @@ -1621,57 +1622,57 @@ msgstr "Firma gli indici creati con update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" -msgstr "" +msgstr "Salta la scansione del codice sorgente per i binari e altri problemi" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" -msgstr "" +msgstr "Saltare '{apkfilename} con firma non valida!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" -msgstr "" +msgstr "Saltare la generazione dell'indice per {appid}" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" -msgstr "" +msgstr "Saltare {apkfilename} con firma non valida!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" -msgstr "" +msgstr "Saltare {appid}: disabilitato" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: no builds specified" -msgstr "" +msgstr "Skipping {appid}: nessuna build specificata" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Specify a local folder to sync the repo to" -msgstr "" +msgstr "Specificare una cartella locale in cui sincronizzare il repository" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Specify an identity file to provide to SSH for rsyncing" -msgstr "" +msgstr "Specificare un file di identità da fornire a SSH per rsyncing" #: ../fdroidserver/build.py msgid "Specify that we're running on the build server" -msgstr "" +msgstr "Specificare che stiamo eseguendo sul server di compilazione" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." -msgstr "" +msgstr "Specificare quale file keystore di debug utilizzare." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" -msgstr "" +msgstr "Vomitare ancora più informazioni del normale" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Striping mystery signature from {apkfilename}" -msgstr "" +msgstr "Striping firma misteriosa da {apkfilename}" #: ../fdroidserver/nightly.py #, python-brace-format @@ -1681,17 +1682,17 @@ msgstr "Riduzione della firma misteriosa da {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" -msgstr "" +msgstr "Riepilogo \"%s\" è solo il nome dell'app" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" -msgstr "" +msgstr "Riepilogo di length {length} supera il limite di caratteri {limit}" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" -msgstr "" +msgstr "L'orologio di sistema è più vecchio della data in {path}!" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." @@ -1958,7 +1959,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "Usage" -msgstr "Utilizzo" +msgstr "Uso" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -1997,7 +1998,7 @@ msgstr "" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" -msgstr "" +msgstr "Utilizzando jarsigner di Java, non raccomandato per verificare APK! Utilizzare apksigner" #: ../fdroidserver/common.py #, python-brace-format @@ -2045,7 +2046,7 @@ msgstr "" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "" +msgstr "Quando linting l'intero repository yamllint è disabilitato per impostazione predefinita. Questa opzione costringe yamllint a prescindere." msgid "X.509 'Distiguished Name' used when generating keys" msgstr "" @@ -2086,7 +2087,7 @@ msgstr "opzione ambigua: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" -msgstr "" +msgstr "apksigner non trovato, è necessario per la firma!" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py #: ../fdroidserver/checkupdates.py @@ -2105,7 +2106,7 @@ msgstr "" #: ../fdroidserver/checkupdates.py msgid "applicationId to check for updates" -msgstr "" +msgstr "applicationId per controllare gli aggiornamenti" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py @@ -2118,19 +2119,19 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "argument \"-\" with mode %r" -msgstr "" +msgstr "argomento \" -\" con la modalità %r" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" -msgstr "" +msgstr "tentativo di connessione SSH nuda per testare la chiave di distribuzione:" #: ../fdroidserver/nightly.py msgid "attempting bare ssh connection to test deploy key:" -msgstr "" +msgstr "tentativo di connessione ssh nuda per testare la chiave di distribuzione:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" -msgstr "" +msgstr "impossibile analizzare le specifiche scrlib (non una stringa): '{}'" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2146,13 +2147,13 @@ msgstr "impossibile trovare srclibs richiesto: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "cannot have multiple subparser arguments" -msgstr "" +msgstr "impossibile avere più argomenti subparser" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" -msgstr "" +msgstr "impossibile unire le azioni : due gruppi sono denominati %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" From 2703023beaaacced80fc210e03cdc6c29931a834 Mon Sep 17 00:00:00 2001 From: x Date: Mon, 28 Jun 2021 20:53:06 +0200 Subject: [PATCH 0363/2116] Translated using Weblate: Italian (it) by x Currently translated at 71.5% (412 of 576 strings) Co-authored-by: x Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ Translation: F-Droid/F-Droid Server --- locale/it/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index d7247974..90939de9 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ # Luca Zambarda , 2020. # IvanDan , 2020, 2021. # Massimiliano Caniparoli , 2020. -# x , 2020. +# x , 2020, 2021. # Hans-Christoph Steiner , 2020. # Francesco Saltori , 2020. # Francesco Esposito , 2021. @@ -16,7 +16,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-03-01 21:55+0000\n" -"Last-Translator: mondstern \n" +"Last-Translator: x \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" @@ -288,7 +288,7 @@ msgstr "Avvisa anche dei problemi di formattazione, come rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" -msgstr "Libreria AAR per Android" +msgstr "Libreria Android AAR" #: ../fdroidserver/scanner.py msgid "Android APK file" From d13c69c5d1f7a2954a7f064adf2565cbc0674422 Mon Sep 17 00:00:00 2001 From: WaldiS Date: Mon, 28 Jun 2021 20:53:08 +0200 Subject: [PATCH 0364/2116] Translated using Weblate: Polish (pl) by WaldiS Currently translated at 100.0% (576 of 576 strings) Co-authored-by: WaldiS Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ Translation: F-Droid/F-Droid Server --- locale/pl/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 10201127..b9467a7a 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-31 09:06+0000\n" +"PO-Revision-Date: 2021-03-13 19:36+0000\n" "Last-Translator: WaldiS \n" "Language-Team: Polish \n" "Language: pl\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: ../fdroidserver/common.py msgid "" @@ -1956,7 +1956,7 @@ msgstr "Przesyłanie {apkfilename} do virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "Usage" -msgstr "Użycie" +msgstr "Zastosowanie" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py From 75a9723061b4d36b6bb47f167229fe69ff174c0e Mon Sep 17 00:00:00 2001 From: Eduardo Rodrigues Date: Mon, 28 Jun 2021 20:53:05 +0200 Subject: [PATCH 0365/2116] Translated using Weblate: Portuguese (pt) by Eduardo Rodrigues Currently translated at 100.0% (576 of 576 strings) Translated using Weblate: Portuguese (Brazil) (pt_BR) by Eduardo Rodrigues Currently translated at 100.0% (576 of 576 strings) Co-authored-by: Eduardo Rodrigues Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/ Translation: F-Droid/F-Droid Server --- locale/pt/LC_MESSAGES/fdroidserver.po | 9 ++++--- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 31 +++++++++--------------- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 50bf57ad..5df5d9fb 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -2,20 +2,21 @@ # This file is put in the public domain. # ssantos , 2020, 2021. # Peter J. Mello , 2021. +# Eduardo Rodrigues , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-31 22:07+0000\n" -"Last-Translator: Peter J. Mello \n" +"PO-Revision-Date: 2021-02-19 19:50+0000\n" +"Last-Translator: Eduardo Rodrigues \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.5\n" #: ../fdroidserver/common.py msgid "" @@ -298,7 +299,7 @@ msgstr "O SDK Android '{path}' não tem '{dirname}' instalado!" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "O SDK do Android não foi encontrado em {path}!" +msgstr "SDK do Android não foi encontrado em {path}!" #: ../fdroidserver/common.py msgid "Android SDK not found!" diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 252be365..e9ddad5c 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -6,20 +6,21 @@ # Rafael Fontenelle , 2020, 2021. # ssantos , 2020. # The Cats , 2020. +# Eduardo Rodrigues , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-14 21:33+0000\n" -"Last-Translator: Rafael Fontenelle \n" +"PO-Revision-Date: 2021-02-19 19:50+0000\n" +"Last-Translator: Eduardo Rodrigues \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.5\n" #: ../fdroidserver/common.py msgid "" @@ -70,7 +71,7 @@ msgstr "\"%s/\" não tem arquivo de metadados correspondente!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" +msgstr "\"repo_pubkey\" deve estar presente em config.yml quando se usa --nosign!" #: ../fdroidserver/install.py #, python-brace-format @@ -450,9 +451,9 @@ msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, arc msgstr "Verificar o arquivamento de {appid} - APKs: {integer}, Versões Mantidas: {keep}, Arcos de APKs: {arch}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Verificar o arquivamento de {appid} - APKs: {integer}, Versões Mantidas: {keep}, Arcos de APKs: {arch}" +msgstr "Verificar o arquivamento de {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -1739,16 +1740,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Estas são as aplicações que foram arquivadas a partir do repositório principal." #: ../fdroidserver/common.py -#, fuzzy msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" -"\n" -" Este é um repositório de aplicativos a serem usados com o FDroid. Os\n" -" aplicativos neste repositório são binários oficiais compilados pelos\n" -" desenvolvedores do aplicativo original ou são binários compilados a\n" -" partir da fonte por f-droid.org usando as ferramentas em\n" -" https://gitlab.com/fdroid.\n" -" " +msgstr "Este é um repositório de aplicativos a serem usados com o F-Droid. Os aplicativos neste repositório são binários oficiais compilados pelos desenvolvedores do aplicativo original ou são binários compilados a partir da fonte por f-droid.org usando as ferramentas em https://gitlab.com/fdroid." #: ../fdroidserver/import.py #, python-format @@ -2476,9 +2469,9 @@ msgid "refuse downloading via insecure http connection (use https or specify --n msgstr "Recuse o download insegura via conexão http (use https ou especifique --no-https-check): {apkfilename}" #: ../fdroidserver/index.py -#, fuzzy, python-format +#, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "repo_icon %s não existe, gerando um espaço reservado." +msgstr "repo_icon \"repo/icons/%s\" não existe, gerando um espaço reservado." #: ../fdroidserver/index.py #, python-format @@ -2684,9 +2677,9 @@ msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\" não existe! Corrija-o no config.yml." #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "{name} \"{path}\" não existe! Corrija-o no config.yml." +msgstr "{name} \"{section}/icons/{path}\" não existe! Corrija-o no \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format From 5b7e79f3d503a36bd81df82beb39d7b3f25714f6 Mon Sep 17 00:00:00 2001 From: ssantos Date: Mon, 28 Jun 2021 20:53:20 +0200 Subject: [PATCH 0366/2116] Translated using Weblate: Portuguese (pt) by ssantos Currently translated at 100.0% (576 of 576 strings) Co-authored-by: ssantos Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/ Translation: F-Droid/F-Droid Server --- locale/pt/LC_MESSAGES/fdroidserver.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 5df5d9fb..6c4e7b6c 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -8,15 +8,15 @@ msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-02-19 19:50+0000\n" -"Last-Translator: Eduardo Rodrigues \n" +"PO-Revision-Date: 2021-05-10 06:47+0000\n" +"Last-Translator: ssantos \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.5\n" +"X-Generator: Weblate 4.7-dev\n" #: ../fdroidserver/common.py msgid "" @@ -348,7 +348,7 @@ msgstr "Arquivamento {apkfilename} com assinatura inválida!" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" -msgstr "URL base para espelhar, pode incluir a chave de assinatura de índice usando a string de consulta:? Fingerprint =" +msgstr "URL base para espelhar, pode incluir a chave de assinatura de índice usando a cadeia de consulta: ?fingerprint =" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py @@ -2456,12 +2456,12 @@ msgstr "a implementação do registo de processo {path} a {dest} falhou!" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "Recusado o download via conexão HTTP insegura (use HTTPS ou especifique --no-https-check): {apkfilename}" +msgstr "Recusado a descarrega via conexão HTTP insegura (use HTTPS ou especifique --no-https-check): {apkfilename}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" -msgstr "Recusado o download via conexão http insegura (use https ou especifique --no-https-check): {apkfilename}" +msgstr "Recusado a descarrega via conexão http insegura (use https ou especifique --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format From a787147f3cf7ba037d8f95977455c9a30409beda Mon Sep 17 00:00:00 2001 From: Christian Eichert Date: Mon, 28 Jun 2021 20:53:16 +0200 Subject: [PATCH 0367/2116] Translated using Weblate: Romanian (ro) by Christian Eichert Currently translated at 11.6% (67 of 576 strings) Translated using Weblate: Romanian (ro) by Christian Eichert Currently translated at 9.0% (52 of 576 strings) Translated using Weblate: Romanian (ro) by Christian Eichert Currently translated at 8.8% (51 of 576 strings) Translated using Weblate: Romanian (ro) by Christian Eichert Currently translated at 5.7% (33 of 576 strings) Translated using Weblate: Romanian (ro) by Christian Eichert Currently translated at 5.3% (31 of 576 strings) Translated using Weblate: Romanian (ro) by Christian Eichert Currently translated at 5.0% (29 of 576 strings) Co-authored-by: Christian Eichert Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ro/ Translation: F-Droid/F-Droid Server --- locale/ro/LC_MESSAGES/fdroidserver.po | 93 +++++++++++++++------------ 1 file changed, 53 insertions(+), 40 deletions(-) diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 89a2f9dd..9a296c5a 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -1,20 +1,21 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # Daniel Șerbănescu , 2021. +# Christian Eichert , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-14 21:33+0000\n" -"Last-Translator: Daniel Șerbănescu \n" +"PO-Revision-Date: 2021-04-05 20:26+0000\n" +"Last-Translator: Christian Eichert \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.6-dev\n" #: ../fdroidserver/common.py msgid "" @@ -25,18 +26,28 @@ msgid "" " tools on https://gitlab.com/fdroid.\n" " " msgstr "" +"\n" +" Acesta este un depozit de aplicații care pot fi utilizate cu FDroid. Aplicațiile din acest\n" +" depozit sunt fie binare oficiale construite de către aplicația originală\n" +" dezvoltatorii aplicațiilor, fie sunt binare construite de la sursă de către f-droid.org folosind aplicația\n" +" instrumente de pe https://gitlab.com/fdroid.\n" +" " #: ../fdroidserver/nightly.py msgid "" "\n" "SSH Public Key to be used as Deploy Key:" msgstr "" +"\n" +"Cheia publică SSH care urmează să fie utilizată ca cheie de implementare:" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" +"\n" +"Cheia publică SSH care urmează să fie utilizată ca cheie de implementare:" #: ../fdroidserver/nightly.py #, python-brace-format @@ -44,64 +55,66 @@ msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" +"\n" +"{path} codificată pentru variabila secretă DEBUG_KEYSTORE:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" -msgstr "" +msgstr "\"%s/\" nu are un fișier de metadate corespunzător!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" +msgstr "\"repo_pubkey\" trebuie să fie prezent în config.yml atunci când se folosește --nosign!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "" +msgstr "\"{apkfilename}\" este deja instalat pe {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" +msgstr "\"{path}\" conține {name} ({version}) depășite" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" -msgstr "" +msgstr "\"{path}\" conține {name} recente ({version})" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" -msgstr "" +msgstr "\"{path}\" există, dar s3cmd nu este instalat!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "" +msgstr "\"{path}\" nu este un format de fișier acceptat (utilizați: metadata/*.yml)" #: ../fdroidserver/metadata.py #, python-brace-format msgid "\"{path}\" is not an accepted format, convert to: {formats}" -msgstr "" +msgstr "\"{path}\" nu este un format acceptat, convertiți în: {formats}" #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" -msgstr "" +msgstr "\"{url}\" nu este un URL valid!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Opțiunea %(option)s necesită %(number)d argument" +msgstr[1] "Opțiunea %(option)s necesită %(number)d argumente" +msgstr[2] "Opțiunea %(option)s necesită %(number)d argumente" #: ../fdroidserver/mirror.py #, python-format msgid "%(prog)s [options] url" -msgstr "" +msgstr "%(prog)s [opțiuni] url" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -112,7 +125,7 @@ msgstr "%(prog)s: eroare: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" -msgstr "" +msgstr "%d probleme găsite" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -449,7 +462,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py #, c-format, python-format msgid "Command '%s' not recognised.\n" -msgstr "Comanda „%s” nerecunoscută.\n" +msgstr "Comanda '%s' nerecunoscută.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" @@ -1545,7 +1558,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Scan the source code of a package" -msgstr "" +msgstr "Scanarea codului sursă al unui pachet" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1592,11 +1605,11 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" -msgstr "" +msgstr "Semnați și plasați pachetele în repo" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" -msgstr "" +msgstr "Semnează indexurile create folosind update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" @@ -1882,15 +1895,15 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" -msgstr "" +msgstr "Actualizarea informațiilor repo pentru noile pachete" #: ../fdroid ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" -msgstr "" +msgstr "Actualizarea jurnalului de transparență binară pentru o adresă URL" #: ../fdroid ../fdroidserver/__main__.py msgid "Update the stats of the repo" -msgstr "" +msgstr "Actualizați statisticile repo-ului" #: ../fdroidserver/update.py ../fdroidserver/build.py msgid "Update the wiki" @@ -2003,7 +2016,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" -msgstr "" +msgstr "Verificarea integrității pachetelor descărcate" #: ../fdroidserver/index.py msgid "Verifying index signature:" @@ -2016,7 +2029,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" -msgstr "" +msgstr "Avertizează cu privire la posibile erori de metadate" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2055,13 +2068,13 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "" +msgstr "opțiune ambiguă: %(option)s ar putea corespunde cu %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" -msgstr "" +msgstr "opțiune ambiguă: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2115,7 +2128,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "can't open '%s': %s" -msgstr "" +msgstr "nu se poate deschide '%s': %s" #: ../fdroidserver/build.py #, python-brace-format @@ -2256,7 +2269,7 @@ msgstr "" #: ../fdroidserver/metadata.py msgid "force errors to be warnings, or ignore" -msgstr "" +msgstr "forțați erorile să fie avertismente sau ignorați" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." @@ -2345,7 +2358,7 @@ msgstr "" #: /usr/lib/python3.7/optparse.py #, python-format msgid "no such option: %s" -msgstr "" +msgstr "nu există o astfel de opțiune: %s" #: ../fdroid ../fdroidserver/__main__.py msgid "no version info found!" @@ -2400,13 +2413,13 @@ msgstr "opțiunea -%s necesită argument" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s must not have an argument" -msgstr "" +msgstr "opțiunea --%s nu trebuie să aibă un argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s not a unique prefix" -msgstr "" +msgstr "opțiunea --%s nu este un prefix unic" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2418,7 +2431,7 @@ msgstr "opțiunea --%s nerecunoscută" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s requires argument" -msgstr "" +msgstr "opțiunea --%s necesită un argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2433,7 +2446,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "positional arguments" -msgstr "" +msgstr "argumente poziționale" #: ../fdroidserver/common.py #, python-brace-format @@ -2518,13 +2531,13 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "the following arguments are required: %s" -msgstr "" +msgstr "sunt necesare următoarele argumente: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "unexpected option string: %s" -msgstr "" +msgstr "șir de opțiuni neașteptate: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2536,12 +2549,12 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "unrecognized arguments: %s" -msgstr "" +msgstr "argumente nerecunoscute: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" -msgstr "" +msgstr "permisiuni nesigure pe '{config_file}' (ar trebui să fie 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py From 95ef78b693fb95ae41136e883740da144931cc85 Mon Sep 17 00:00:00 2001 From: Simona Iacob Date: Mon, 28 Jun 2021 20:53:27 +0200 Subject: [PATCH 0368/2116] Translated using Weblate: Romanian (ro) by Simona Iacob Currently translated at 100.0% (576 of 576 strings) Translated using Weblate: Romanian (ro) by Simona Iacob Currently translated at 64.2% (370 of 576 strings) Co-authored-by: Simona Iacob Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ro/ Translation: F-Droid/F-Droid Server --- locale/ro/LC_MESSAGES/fdroidserver.po | 1053 +++++++++++++------------ 1 file changed, 529 insertions(+), 524 deletions(-) diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 9a296c5a..3aedd1c6 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -2,20 +2,21 @@ # This file is put in the public domain. # Daniel Șerbănescu , 2021. # Christian Eichert , 2021. +# Simona Iacob , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-04-05 20:26+0000\n" -"Last-Translator: Christian Eichert \n" +"PO-Revision-Date: 2021-06-23 23:32+0000\n" +"Last-Translator: Simona Iacob \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n" -"X-Generator: Weblate 4.6-dev\n" +"X-Generator: Weblate 4.7.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -83,7 +84,7 @@ msgid "\"{path}\" contains recent {name} ({version})" msgstr "\"{path}\" conține {name} recente ({version})" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" msgstr "\"{path}\" există, dar s3cmd nu este instalat!" @@ -141,46 +142,46 @@ msgstr "%r nu este apelabil" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" -msgstr "" +msgstr "%s nu este un câmp de construcție acceptat" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "%s option does not take a value" -msgstr "" +msgstr "Opțiunea %s nu acceptă o valoare" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" -msgstr "" +msgstr "'keypass' nu a fost găsit în config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" +msgstr "'keystore' este NONE și 'smartcardoptions' este gol!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" -msgstr "" +msgstr "'keystore' nu a fost găsit în config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" -msgstr "" +msgstr "'keystorepass' nu se găsește în config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" -msgstr "" +msgstr "'repo_keyalias' nu se găsește în config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" -msgstr "" +msgstr "'required' este un argument invalid pentru poziționale" #: ../fdroidserver/common.py msgid "'sdk_path' not set in 'config.yml'!" -msgstr "" +msgstr "'sdk_path' nu este setat în 'config.yml'!" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" -msgstr "" +msgstr "'sdk_path' nu este setat în 'config.yml'!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -188,42 +189,42 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-23.0.0 or newer!" -msgstr "" +msgstr "'{aapt}' este prea vechi, fdroid necesită build-tools-23.0.0 sau mai nou!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" -msgstr "" +msgstr "'{aapt}' este prea vechi, fdroid necesită build-tools-{version} sau mai nou!" #: ../fdroidserver/install.py #, python-brace-format msgid "'{apkfilename}' is already installed on {dev}." -msgstr "" +msgstr "'{apkfilename}' este deja instalat pe {dev}." #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{field}' in {linedesc} is obsolete, see docs for current fields:" -msgstr "" +msgstr "'{field}' din {linedesc} este învechit, consultați documentația pentru câmpurile actuale:" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" +msgstr "'{field}' va fi în ordine aleatorie! Folosiți paranteze () sau [] dacă ordinea este importantă!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" -msgstr "" +msgstr "'{path}' nu a reușit să se execute!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" -msgstr "" +msgstr "'{value}' nu este valid {field} în {appid}. Regex model: {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" -msgstr "" +msgstr "...checkupdate a eșuat pentru {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -232,19 +233,19 @@ msgstr "" #: ../fdroidserver/metadata.py msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." -msgstr "" +msgstr ".fdroid.txt nu este acceptat! Convertiți în .fdroid.yml sau .fdroid.json." #: ../fdroidserver/lint.py msgid "/issues is missing" -msgstr "" +msgstr "/problemele lipsesc" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" -msgstr "" +msgstr "Un URL este necesar ca argument!" #: ../fdroid ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" -msgstr "" +msgstr "Adăugați semnături PGP folosind GnuPG pentru pachetele din depozit" #: ../fdroid ../fdroidserver/__main__.py msgid "Add a new application from its source code" @@ -252,73 +253,73 @@ msgstr "" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" -msgstr "" +msgstr "Adăugați o cheie de semnare repo la un depozit nesemnat" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" -msgstr "" +msgstr "Adăugați fișiere de metadate schelet pentru APK-urile care le lipsesc" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" -msgstr "" +msgstr "Adăugarea unui nou depozit doar pentru {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" -msgstr "" +msgstr "Alias al cheii de semnare repo din magazinul de chei" #: ../fdroidserver/import.py msgid "Allows a different revision (or git branch) to be specified for the initial import" -msgstr "" +msgstr "Permite specificarea unei revizuiri diferite (sau a unei ramuri git) pentru importul inițial" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" -msgstr "" +msgstr "De asemenea, oglindește secțiunea arhivă completă" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" -msgstr "" +msgstr "De asemenea, avertizează asupra problemelor de formatare, cum ar fi rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" -msgstr "" +msgstr "Biblioteca Android AAR" #: ../fdroidserver/scanner.py msgid "Android APK file" -msgstr "" +msgstr "Android APK fișier" #: ../fdroidserver/scanner.py msgid "Android DEX code" -msgstr "" +msgstr "Android DEX cod" #: ../fdroidserver/common.py ../fdroidserver/build.py #, python-brace-format msgid "Android SDK '{path}' does not have '{dirname}' installed!" -msgstr "" +msgstr "Android SDK '{path}' nu are instalat '{dirname}'!" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "" +msgstr "Android SDK nu a fost găsit la {path}!" #: ../fdroidserver/common.py msgid "Android SDK not found!" -msgstr "" +msgstr "Android SDK nu a fost găsit!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" -msgstr "" +msgstr "Calea Android SDK '{path}' nu există!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" -msgstr "" +msgstr "Calea Android SDK '{path}' nu este un director!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "" +msgstr "Instrumentul Android SDK {cmd} găsit!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -326,45 +327,45 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Android build-tools path '{path}' does not exist!" -msgstr "" +msgstr "Calea Android build-tools '{path}' nu există!" #: ../fdroidserver/update.py msgid "AndroidManifest.xml has no date" -msgstr "" +msgstr "AndroidManifest.xml nu are nicio dată" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" -msgstr "" +msgstr "Aplicația se află în '{repo}', dar are un link către {url}" #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" -msgstr "" +msgstr "Adăugarea .git nu este necesară" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" -msgstr "" +msgstr "Arhivare {apkfilename} cu semnătură invalidă!" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" -msgstr "" +msgstr "URL de bază pentru oglindire, poate include cheia de semnare a indexului folosind șirul de interogare: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "" +msgstr "Ramificația '{branch}' utilizată ca și confirmare în construcția '{versionName}'" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" -msgstr "" +msgstr "Ramificația '{branch}' utilizată ca și commit în srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" -msgstr "" +msgstr "Legătură sym ruptă: {path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Build a package from source" @@ -372,70 +373,70 @@ msgstr "" #: ../fdroidserver/build.py msgid "Build all applications available" -msgstr "" +msgstr "Construiți toate aplicațiile disponibile" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" -msgstr "" +msgstr "Construire generată de `fdroid import` - eliminați linia de dezactivare odată ce este gata" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" -msgstr "" +msgstr "Build metadata git repo are modificări necomandate!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" -msgstr "" +msgstr "Construiți doar cea mai recentă versiune a fiecărui pachet" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" -msgstr "" +msgstr "Build ar trebui să aibă versionName și versionCode separate prin virgulă, nu \"{value}\", în {linedesc}" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" -msgstr "" +msgstr "Construit depozit bazat în \"%s\" cu această configurație:" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Nu se poate construi din cauza unei erori {} în timpul scanării" +msgstr[1] "Nu se poate construi din cauza erorilor {} în timpul scanării" +msgstr[2] "Nu se poate construi din cauza erorilor {} în timpul scanării" #: ../fdroidserver/vmtools.py #, python-brace-format msgid "Cannot read \"{path}\"!" -msgstr "" +msgstr "Nu se poate citi \"{path}\"!" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/metadata.py #, python-brace-format msgid "Cannot resolve application ID {appid}" -msgstr "" +msgstr "Nu se poate rezolva ID-ul aplicației {appid}" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" -msgstr "" +msgstr "Nu se poate rescrie \"{path}\"" #: ../fdroidserver/rewritemeta.py msgid "Cannot use --list and --to at the same time" -msgstr "" +msgstr "Nu se poate utiliza --list și --to în același timp" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" -msgstr "" +msgstr "Nu se poate scrie \"{path}\", nu este un format acceptat, utilizați: {formats}" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" -msgstr "" +msgstr "Categoriile \"%s\" nu sunt valabile" #: ../fdroidserver/lint.py msgid "Categories are not set" -msgstr "" +msgstr "Categoriile nu sunt setate" #: ../fdroid ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -444,20 +445,20 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "" +msgstr "Verificarea arhivării pentru {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "" +msgstr "Verificarea arhivării pentru {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" -msgstr "" +msgstr "Actualizare curată - nu folosește memoria cache, reprocesează toate APK-urile" #: ../fdroidserver/import.py msgid "Comma separated list of categories." -msgstr "" +msgstr "Lista de categorii separate prin virgulă." #: ../fdroid ../fdroidserver/__main__.py #, c-format, python-format @@ -466,71 +467,71 @@ msgstr "Comanda '%s' nerecunoscută.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" -msgstr "" +msgstr "Efectuați modificări" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." -msgstr "" +msgstr "Argumente contradictorii: '--verbose' și '--quiet' nu pot fi specificate în același timp." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "Fișiere de configurare conflictuale! Folosind {newfile}, ignorând {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" -msgstr "" +msgstr "Nu a putut găsi '{command}' pe sistemul dvs" #: ../fdroidserver/import.py msgid "Could not find latest version code" -msgstr "" +msgstr "Nu a putut găsi codul ultimei versiuni" #: ../fdroidserver/import.py msgid "Could not find latest version name" -msgstr "" +msgstr "Nu a putut găsi numele celei mai recente versiuni" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" -msgstr "" +msgstr "Nu a putut găsi {path} pentru a-l elimina" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "" +msgstr "Nu s-a putut deschide APK {path} pentru analiză: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" -msgstr "" +msgstr "Nu a putut analiza dimensiunea \"{size}\", tip greșit \"{type}\"" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/import.py msgid "Couldn't find Application ID" -msgstr "" +msgstr "Nu s-a putut găsi ID-ul aplicației" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" -msgstr "" +msgstr "Nu am putut găsi codul ultimei versiuni" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import.py msgid "Couldn't find latest version name" -msgstr "" +msgstr "Nu a putut găsi numele celei mai recente versiuni" #: ../fdroidserver/import.py msgid "Couldn't find package ID" -msgstr "" +msgstr "Nu a putut găsi ID-ul pachetului" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" -msgstr "" +msgstr "Refuzând cu lașitate să suprascrieți configurarea cheilor de semnare existente!" #: ../fdroidserver/update.py msgid "Create a repo signing key in a keystore" -msgstr "" +msgstr "Creați o cheie de semnare repo într-un depozit de chei" #: ../fdroidserver/update.py msgid "Create skeleton metadata files that are missing" @@ -539,47 +540,47 @@ msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Created new container \"{name}\"" -msgstr "" +msgstr "Creat un nou container \"{name}\"" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." -msgstr "" +msgstr "Crearea \"{path}\" pentru configurarea s3cmd." #: ../fdroidserver/publish.py msgid "Creating log directory" -msgstr "" +msgstr "Crearea directorului de jurnal" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Creating new S3 bucket: {url}" -msgstr "" +msgstr "Crearea unui nou recipient S3: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" -msgstr "" +msgstr "Crearea directorului de ieșire" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" -msgstr "" +msgstr "Crearea unui index semnat cu această cheie (SHA256):" #: ../fdroidserver/import.py ../fdroidserver/verify.py #: ../fdroidserver/publish.py msgid "Creating temporary directory" -msgstr "" +msgstr "Crearea unui director temporar" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" -msgstr "" +msgstr "Crearea unui index nesemnat în vederea pregătirii pentru semnare" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "" +msgstr "CurrentVersionCode {cv} este mai mic decât cea mai veche intrare de construcție {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" -msgstr "" +msgstr "DEBUG_KEYSTORE nu este setat sau valoarea este incompletă" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" @@ -588,101 +589,101 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "" +msgstr "Ștergerea arhivei, repo este prea mare ({size} max {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "" +msgstr "Ștergerea istoricului git-mirror, repo este prea mare ({size} max {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" -msgstr "" +msgstr "Ștergerea unui fișier necunoscut: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" -msgstr "" +msgstr "Descrierea \"%s\" este doar un rezumat al aplicației" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" -msgstr "" +msgstr "Descrierea are o linie duplicată" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" +msgstr "Descrierea are o listă (%s), dar nu este punctată (*) și nici numerotată (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" -msgstr "" +msgstr "Descrierea lungimii {length} este peste limita {limit} limitei de caractere" #: ../fdroidserver/import.py msgid "Do not add 'disable:' to the generated build entries" -msgstr "" +msgstr "Nu adăugați \"disable:\" la intrările de construcție generate" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" -msgstr "" +msgstr "Nu distribuiți noile fișiere în repo" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" -msgstr "" +msgstr "Nu includeți \"{path}\" în URL!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" -msgstr "" +msgstr "Nu solicitați calea Android SDK, doar eșuați" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" -msgstr "" +msgstr "Nu eliminați cheile private generate din keystore" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" -msgstr "" +msgstr "Nu creați un tarball sursă, util atunci când testați o construcție" #: ../fdroidserver/stats.py msgid "Don't do anything logs-related" -msgstr "" +msgstr "Nu faceți nimic legat de jurnale" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" -msgstr "" +msgstr "Nu reîmprospătați depozitul, util atunci când testați o construcție fără conexiune la internet" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py #: ../fdroidserver/upload.py msgid "Don't use rsync checksums" -msgstr "" +msgstr "Nu folosiți sumele de verificare rsync" #: ../fdroid ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" -msgstr "" +msgstr "Descărcați oglinzi complete ale depozitelor mici" #: ../fdroidserver/stats.py msgid "Download logs we don't have" -msgstr "" +msgstr "Descărcați jurnalele pe care nu le avem" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." -msgstr "" +msgstr "Descărcarea depozitului a eșuat deja o dată, nu mai încerc din nou." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" -msgstr "" +msgstr "Descărcarea {url} a eșuat. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" -msgstr "" +msgstr "S-a găsit o rețetă de construcție duplicată pentru versionCode {versionCode} în {linedesc}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" -msgstr "" +msgstr "Legătură duplicată în \"{field}\": {url}" #: ../fdroid msgid "Dynamically scan APKs post build" @@ -690,27 +691,29 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" +msgstr "ERROR: Subcomanda \"server\" a fost eliminată, utilizați \"deploy\"!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" +"ERROR: această comandă nu ar trebui să fie folosită niciodată pentru a oglindi f-droid.org!\n" +"O oglindă completă a f-droid.org necesită mai mult de 200GB." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" -msgstr "" +msgstr "ERROR: tip CI neacceptat, patch-uri binevenite!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" -msgstr "" +msgstr "Indicator de construcție gol la {linedesc}" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "" +msgstr "Encoding este setat la '{enc}' fdroid ar putea întâmpina probleme de codificare. Vă rugăm să o setați la 'UTF-8' pentru cele mai bune rezultate." #: ../fdroidserver/init.py #, python-format @@ -718,280 +721,282 @@ msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" +"Introduceți aici calea către Android SDK (%s):\n" +"> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "Variabila de mediu {var} din {configname} nu este setată!" #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format msgid "Error while attempting to publish log: %s" -msgstr "" +msgstr "Eroare la încercarea de a publica jurnalul: %s" #: ../fdroidserver/import.py ../fdroidserver/common.py msgid "Error while getting repo address" -msgstr "" +msgstr "Eroare la obținerea adresei repo" #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" -msgstr "" +msgstr "Extrageți semnăturile din APK-uri" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" -msgstr "" +msgstr "A eșuat copierea {path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" -msgstr "" +msgstr "A eșuat preluarea semnăturilor pentru '{apkfilename}': {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" -msgstr "" +msgstr "A eșuat citirea {path}: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" -msgstr "" +msgstr "A eșuat redimensionarea {path}: {error}" #: ../fdroidserver/publish.py msgid "Failed to align application" -msgstr "" +msgstr "Nu a reușit să alinieze aplicația" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" -msgstr "" +msgstr "Nu s-a reușit crearea unui recipient S3: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" -msgstr "" +msgstr "Nu a reușit să obțină informații despre APK, ștergând {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" -msgstr "" +msgstr "Nu a reușit să obțină informații despre APK, sărind peste {path}" #: ../fdroidserver/common.py msgid "Failed to get APK manifest information" -msgstr "" +msgstr "Nu a reușit să obțină informații despre manifestul APK" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" -msgstr "" +msgstr "Nu s-a reușit instalarea '{apkfilename}' pe {dev}: {error}" #: ../fdroidserver/publish.py ../fdroidserver/common.py msgid "Failed to sign application" -msgstr "" +msgstr "Nu a reușit să semneze aplicația" #: ../fdroidserver/common.py msgid "Failed to zipalign application" -msgstr "" +msgstr "A eșuat să se comprime în zip aplicația" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" -msgstr "" +msgstr "A preluat buildserverid de la VM: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" -msgstr "" +msgstr "A preluat semnăturile pentru '{apkfilename}' -> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" -msgstr "" +msgstr "Fișierul a dispărut în timpul procesării acestuia: {path}" #: ../fdroidserver/verify.py ../fdroidserver/stats.py ../fdroidserver/update.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/build.py #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py msgid "Finished" -msgstr "" +msgstr "Finalizat" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID flag" -msgstr "" +msgstr "Metodele de donație Flattr aparțin indicatorului FlattrID" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" +msgstr "Metodele de donație Flattr fac parte din FlattrID: câmp" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" -msgstr "" +msgstr "Etichete HTML interzise" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." -msgstr "" +msgstr "Forțează compilarea forțată a aplicațiilor dezactivate și continuă indiferent de problemele de scanare. Este permisă numai în modul de testare." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" -msgstr "" +msgstr "Forțați oprirea construcției după {0} sec timeout!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." -msgstr "" +msgstr "Forțați scanarea aplicațiilor și construcțiilor dezactivate." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" -msgstr "" +msgstr "Am găsit graficul \"{path}\" fără metadate pentru aplicația \"{name}\"!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" -msgstr "" +msgstr "Am găsit un fișier de finanțare necorespunzător \"{path}\" pentru \"{name}\":" #: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" -msgstr "" +msgstr "Găsit appids invalid în argumente" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" -msgstr "" +msgstr "Am găsit coduri de versiune invalide pentru unele aplicații" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "" +msgstr "Am găsit mai multe fișiere JAR Signature Block în {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" -msgstr "" +msgstr "Am găsit mai multe fișiere de metadate pentru {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." -msgstr "" +msgstr "S-au găsit mai multe certificate de semnare pentru depozit." #: ../fdroidserver/update.py #, python-brace-format msgid "Found multiple signing certificates in {path}" -msgstr "" +msgstr "S-au găsit mai multe certificate de semnare în {path}" #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." -msgstr "" +msgstr "Nu s-au găsit certificate de semnare pentru depozit." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" -msgstr "" +msgstr "Găsit non-file la %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" -msgstr "" +msgstr "Am găsit {apkfilename} la {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" -msgstr "" +msgstr "Generarea metadatelor schelet pentru {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" -msgstr "" +msgstr "Verificarea Git a '%s' a eșuat" #: ../fdroidserver/common.py msgid "Git clean failed" -msgstr "" +msgstr "Curățarea Git a eșuat" #: ../fdroidserver/common.py msgid "Git fetch failed" -msgstr "" +msgstr "Git fetch a eșuat" #: ../fdroidserver/common.py msgid "Git remote set-head failed" -msgstr "" +msgstr "Git remote set-head eșuat" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" -msgstr "" +msgstr "Git remote set-head a eșuat: \"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" -msgstr "" +msgstr "Resetarea Git a eșuat" #: ../fdroidserver/common.py msgid "Git submodule sync failed" -msgstr "" +msgstr "Sincronizarea submodulelor Git a eșuat" #: ../fdroidserver/common.py msgid "Git submodule update failed" -msgstr "" +msgstr "Actualizarea submodulelor Git a eșuat" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" -msgstr "" +msgstr "HTTPS trebuie folosit cu URL-urile Subversion!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "" +msgstr "Dacă o oglindă git devine prea mare, permite ca arhiva să fie ștearsă" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "" +msgstr "Dacă această încărcare eșuează, încercați să încărcați manual la {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "" +msgstr "Ignorarea lui '{field}' în metadatele '{metapath}', deoarece este depășită." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" -msgstr "" +msgstr "Ignorarea intrării FUNDING.yml mai lungă de 2048: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " -msgstr "" +msgstr "Ignorarea pachetului fără metadate: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" -msgstr "" +msgstr "Ignorarea datelor vechi din memoria cache pentru {apkfilename}" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Ignoring {ext} file at '{path}'" -msgstr "" +msgstr "Ignorarea fișierului {ext} de la '{path}'" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "" +msgstr "Includeți APK-uri care sunt semnate cu algoritmi dezactivați, cum ar fi MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" -msgstr "" +msgstr "Includeți fișierele .asc cu semnătura PGP în oglindă" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" -msgstr "" +msgstr "Includeți jurnalele de construcție în oglindă" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" -msgstr "" +msgstr "Includeți tarball-urile sursă în oglindă" #: ../fdroidserver/common.py msgid "Initialising submodules" -msgstr "" +msgstr "Inițializarea submodulelor" #: ../fdroidserver/install.py msgid "Install all signed applications available" -msgstr "" +msgstr "Instalați toate aplicațiile semnate disponibile" #: ../fdroid ../fdroidserver/__main__.py msgid "Install built packages on devices" @@ -1000,22 +1005,22 @@ msgstr "" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." -msgstr "" +msgstr "Se instalează %s..." #: ../fdroidserver/install.py #, python-format msgid "Installing %s…" -msgstr "" +msgstr "Se instalează %s…" #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." -msgstr "" +msgstr "Instalarea '{apkfilename}' pe {dev}..." #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}…" -msgstr "" +msgstr "Instalarea '{apkfilename}' pe {dev}…" #: ../fdroid ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" @@ -1023,317 +1028,317 @@ msgstr "" #: ../fdroidserver/update.py msgid "Invalid APK" -msgstr "" +msgstr "APK invalid" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" -msgstr "" +msgstr "VercodeOperation invalid: {field}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" -msgstr "" +msgstr "ID-ul aplicației nevalabil {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" -msgstr "" +msgstr "Boolean invalid \"%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid build flag at {line} in {linedesc}" -msgstr "" +msgstr "Indicator de construcție nevalabil la {line} în {linedesc}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid build format: {value} in {name}" -msgstr "" +msgstr "Format de construcție invalid: {value} în {name}" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" -msgstr "" +msgstr "Listă cu puncte invalidă" #: ../fdroidserver/lint.py #, python-format msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" -msgstr "" +msgstr "Etichetă de licență invalidă \"%s\"! Utilizați numai etichetele din https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "" +msgstr "Legătură invalidă - utilizați [http://foo.bar Link title] sau [http://foo.bar]" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid metadata in %s:%d" -msgstr "" +msgstr "Metadate nevalabile în %s:%d" #: ../fdroidserver/metadata.py msgid "Invalid metadata in: " -msgstr "" +msgstr "Metadate invalide în: " #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" -msgstr "" +msgstr "Nume nevalabil pentru fișierul publicat: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" -msgstr "" +msgstr "Nume de pachet nevalabil {0}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " -msgstr "" +msgstr "Redirecționare nevalabilă către non-HTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" -msgstr "" +msgstr "Metadate scrlib nevalabile: '{file}' nu există" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" -msgstr "" +msgstr "Metadate srclib nevalabile: nu s-a putut analiza '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "" +msgstr "Metadate srclib invalide: cheie necunoscută '{key}' în '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid versionCode: \"{versionCode}\" is not an integer!" -msgstr "" +msgstr "VersionCode invalid: \"{versionCode}\" nu este un număr întreg!" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" -msgstr "" +msgstr "Nu s-a reușit verificarea semnăturii JAR: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" -msgstr "" +msgstr "Semnătura JAR verificată: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" -msgstr "" +msgstr "Fișier Java JAR" #: ../fdroidserver/publish.py ../fdroidserver/update.py #: ../fdroidserver/mirror.py msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "" +msgstr "Java JDK nu a fost găsit! Instalați în locația standard sau setați java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" -msgstr "" +msgstr "Clasa compilată Java" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" -msgstr "" +msgstr "Java jarsigner nu a fost găsit! Instalați în locația standard sau setați java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" -msgstr "" +msgstr "Javascript în atributele src HTML" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" -msgstr "" +msgstr "Keystore pentru cheia de semnare:\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "" +msgstr "Ultima confirmare utilizată '{commit}' arată ca o etichetă, dar UpdateCheckMode este '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" -msgstr "" +msgstr "Metodele de donație Liberapay se află în Liberapay: câmp" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the LiberapayID flag" -msgstr "" +msgstr "Metodele de donație Liberapay fac parte din indicatorul LiberapayID" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted" -msgstr "" +msgstr "Lista fișierelor care vor fi reformatate" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" -msgstr "" +msgstr "Locale incluse în URL-ul f-droid.org" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" -msgstr "" +msgstr "Opriți construcția la excepții" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." -msgstr "" +msgstr "Oglinzi de depozit malformate." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" -msgstr "" +msgstr "Linie de root a serverului web deformată:" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." -msgstr "" +msgstr "Oglindește întregul repo și arhiva, toate tipurile de fișiere." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" -msgstr "" +msgstr "Lipsește directorul de ieșire" #: ../fdroidserver/lint.py #, python-format msgid "Name '%s' is just the auto name - remove it" -msgstr "" +msgstr "Numele \"%s\" este doar un nume auto - eliminați-l" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." -msgstr "" +msgstr "Nu s-a găsit niciun 'config.yml', se folosesc valorile implicite." #: ../fdroidserver/common.py msgid "No Android SDK found!" -msgstr "" +msgstr "Nu s-a găsit niciun SDK Android!" #: ../fdroidserver/import.py msgid "No android or kivy project could be found. Specify --subdir?" -msgstr "" +msgstr "Nu a putut fi găsit niciun proiect android sau kivy. Specificați --subdir?" #: ../fdroidserver/install.py msgid "No attached devices found" -msgstr "" +msgstr "Nu s-au găsit dispozitive atașate" #: ../fdroidserver/metadata.py #, python-brace-format msgid "No commit specified for {versionName} in {linedesc}" -msgstr "" +msgstr "Nu s-a specificat nicio confirmare pentru {versionName} în {linedesc}" #: ../fdroidserver/common.py msgid "No config.yml found, using defaults." -msgstr "" +msgstr "Nu s-a găsit niciun config.yml, se folosesc valorile implicite." #: ../fdroidserver/index.py msgid "No fingerprint in URL." -msgstr "" +msgstr "Nu există amprente în URL." #: ../fdroidserver/common.py msgid "No git submodules available" -msgstr "" +msgstr "Nu există submodule git disponibile" #: ../fdroidserver/import.py msgid "No gradle project could be found. Specify --subdir?" -msgstr "" +msgstr "Nu a putut fi găsit niciun proiect gradle. Specificați --subdir?" #: ../fdroidserver/import.py ../fdroidserver/common.py msgid "No information found." -msgstr "" +msgstr "Nu s-au găsit informații." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" -msgstr "" +msgstr "Nu este nevoie să specificați că aplicația este Free Software" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" -msgstr "" +msgstr "Nu este nevoie să specificați că aplicația este pentru Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" -msgstr "" +msgstr "Nu există set de opțiuni! Modificați fișierul config.yml pentru a seta cel puțin una dintre acestea:" #: ../fdroidserver/common.py msgid "No packages specified" -msgstr "" +msgstr "Nu sunt specificate pachete" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" -msgstr "" +msgstr "Nu există niciun APK semnat disponibil pentru %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" -msgstr "" +msgstr "Nici un director de ieșire semnat - nimic de făcut" #: ../fdroidserver/update.py ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" -msgstr "" +msgstr "Nu s-au găsit certificate de semnare în {path}" #: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" -msgstr "" +msgstr "Nu există un astfel de pachet: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" -msgstr "" +msgstr "Nu există un astfel de versionCode {versionCode} pentru aplicația {appid}" #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" -msgstr "" +msgstr "Niciun director nesemnat - nimic de făcut" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" -msgstr "" +msgstr "Nu este o definiție valabilă a dimensiunii: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" -msgstr "" +msgstr "Nimic de făcut" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." -msgstr "" +msgstr "Nimic de făcut pentru {appid}." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" -msgstr "" +msgstr "Acum setați-le în config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" -msgstr "" +msgstr "Fișierul OBB are un versionCode({integer}) mai nou decât orice APK:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" -msgstr "" +msgstr "Numele fișierului OBB trebuie să înceapă cu \"main.\" sau \"patch.\":" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" -msgstr "" +msgstr "OBB's packagename nu se potrivește cu un APK acceptat:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" +msgstr "Mașină offline, sărind peste generarea oglinzii git până la `fdroid deploy`" #: ../fdroidserver/common.py #, python-brace-format msgid "Old APK signature failed to verify: {path}" -msgstr "" +msgstr "Nu s-a reușit verificarea semnăturii APK vechi: {path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Old, deprecated name for fdroid deploy" -msgstr "" +msgstr "Nume vechi, depreciat pentru fdroid deploy" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" -msgstr "" +msgstr "Doar PNG și JPEG sunt acceptate pentru grafică, găsite: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" -msgstr "" +msgstr "Imprimă doar diferențele cu Play Store" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" -msgstr "" +msgstr "Procesați numai aplicațiile cu actualizări automate" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "" +msgstr "Metodele de donație OpenCollective aparțin OpenCollective: câmp" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -1342,91 +1347,91 @@ msgstr "Opțiuni" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." -msgstr "" +msgstr "Emite raportul JSON în fișierul numit după APK." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." -msgstr "" +msgstr "Emite JSON către stdout." #: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py #: ../fdroidserver/update.py ../fdroidserver/signindex.py #: ../fdroidserver/checkupdates.py msgid "Outputting JSON" -msgstr "" +msgstr "Ieșirea JSON" #: ../fdroidserver/import.py msgid "Overall license of the project." -msgstr "" +msgstr "Licența generală a proiectului." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "" +msgstr "Suprascrierea versiunii goale VersionName în {apkfilename} din metadate: {version}" #: ../fdroidserver/import.py #, python-brace-format msgid "Package \"{appid}\" already exists" -msgstr "" +msgstr "Pachetul \"{appid}\" există deja" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" -msgstr "" +msgstr "Analiza manifestului la '{path}'" #: ../fdroidserver/common.py msgid "Password required with username" -msgstr "" +msgstr "Parola este necesară cu numele de utilizator" #: ../fdroidserver/import.py msgid "Path to main Android project subdirectory, if not in root." -msgstr "" +msgstr "Calea de acces la subdirectorul principal al proiectului Android, dacă nu se află în root." msgid "Path to main android project subdirectory, if not in root." -msgstr "" +msgstr "Calea de acces la subdirectorul principal al proiectului android, dacă nu este în root." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" -msgstr "" +msgstr "Calea către Android SDK (uneori setată în ANDROID_HOME)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" -msgstr "" +msgstr "Calea către repo-ul git care urmează să fie utilizat ca jurnal" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" -msgstr "" +msgstr "Calea către depozitul de chei pentru cheia de semnare a repo-ului" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" -msgstr "" +msgstr "Tipărește variabila secretă în terminal pentru un ușor copy/paste" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" -msgstr "" +msgstr "Problemă cu descrierea lui {appid}: {error}" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" -msgstr "" +msgstr "Problemă cu xml la '{path}'" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" -msgstr "" +msgstr "Procesul de autoactualizare" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" -msgstr "" +msgstr "Procesarea {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" -msgstr "" +msgstr "Prelucrare {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" -msgstr "" +msgstr "Producerea de fișiere XML/JSON lizibile de către om pentru fișierele de indexare" #: ../fdroidserver/update.py msgid "Produce human-readable index.xml" @@ -1434,25 +1439,25 @@ msgstr "" #: ../fdroidserver/import.py msgid "Project URL to import from." -msgstr "" +msgstr "URL-ul proiectului din care se importă." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" -msgstr "" +msgstr "Punctuația trebuie evitată" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" -msgstr "" +msgstr "Împingeți jurnalul în acest depozit de la distanță git" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Pushing binary transparency log to {url}" -msgstr "" +msgstr "Trimiterea jurnalului de transparență binară la {url}" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Pushing to {url}" -msgstr "" +msgstr "Împingerea către {url}" #: ../fdroid ../fdroidserver/__main__.py msgid "Quickly start a new repository" @@ -1465,32 +1470,32 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" -msgstr "" +msgstr "Citirea '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading minSdkVersion failed: \"{apkfilename}\"" -msgstr "" +msgstr "Citirea minSdkVersion a eșuat: \"{apkfilename}\"" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" -msgstr "" +msgstr "Citirea packageName/versionCode/versionName a eșuat, APK invalid: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" -msgstr "" +msgstr "Citirea {apkfilename} din memoria cache" #: ../fdroidserver/stats.py msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." -msgstr "" +msgstr "Recalculează statisticile agregate - se utilizează atunci când au fost efectuate modificări care ar invalida vechile date din memoria cache." #: ../fdroidserver/common.py msgid "Removing specified files" -msgstr "" +msgstr "Eliminarea fișierelor specificate" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -1498,24 +1503,24 @@ msgstr "" #: ../fdroidserver/update.py msgid "Report on build data status" -msgstr "" +msgstr "Deleting specified files" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" +msgstr "Resetați și creați un nou server de construcție, chiar dacă cel existent pare să fie în regulă." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" -msgstr "" +msgstr "Renunțarea la {apkfilename} cu debug.keystore furnizat" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" -msgstr "" +msgstr "Redimensionați toate pictogramele care depășesc dimensiunea maximă a pixelilor și ieșiți" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" -msgstr "" +msgstr "Limitarea ieșirii la avertismente și erori" #: ../fdroid ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1523,38 +1528,38 @@ msgstr "" #: ../fdroidserver/rewritemeta.py msgid "Rewrite to a specific format: " -msgstr "" +msgstr "Rescrierea într-un format specific: " #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" -msgstr "" +msgstr "Rescrierea '{appid}'" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}' to '{path}'" -msgstr "" +msgstr "Rescrierea '{appid}' în '{path}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" -msgstr "" +msgstr "Rulați pe un depozit git care are modificări necomandate" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" -msgstr "" +msgstr "Rulați rewritemeta pentru a repara formatarea" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Running first pass with MD5 checking disabled" -msgstr "" +msgstr "Rularea primei treceri cu verificarea MD5 dezactivată" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" -msgstr "" +msgstr "Rularea wget în {path}" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "" +msgstr "Scanați APK-ul (APK-urile) rezultat(e) pentru clasele cunoscute care nu sunt libere." #: ../fdroid ../fdroidserver/__main__.py msgid "Scan the source code of a package" @@ -1563,45 +1568,45 @@ msgstr "Scanarea codului sursă al unui pachet" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" -msgstr "" +msgstr "Scanerul a găsit {count} probleme în {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" -msgstr "" +msgstr "Scanerul a găsit {count} probleme în {appid}:{versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Scannerul a găsit o problemă {}" +msgstr[1] "Scannerul a găsit {} probleme" +msgstr[2] "Scannerul a găsit {} probleme" #: ../fdroidserver/common.py msgid "Set clock to that time using:" -msgstr "" +msgstr "Setați ceasul la ora respectivă folosind:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "" +msgstr "Setați numărul maxim de versiuni în depozit înainte ca cele mai vechi să fie arhivate" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" -msgstr "" +msgstr "Setați limita fișierelor deschise la {integer}" #: ../fdroid ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" -msgstr "" +msgstr "Configurați o compilare de aplicații pentru un depozit de compilare nocturnă" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " -msgstr "" +msgstr "Setarea limitei fișierelor deschise a eșuat: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" -msgstr "" +msgstr "Setarea {0} sec timeout pentru această construcție" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" @@ -1613,172 +1618,172 @@ msgstr "Semnează indexurile create folosind update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" -msgstr "" +msgstr "Treceți peste scanarea codului sursă pentru binare și alte probleme" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" -msgstr "" +msgstr "Ignorarea '{apkfilename}' cu semnătură invalidă!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" -msgstr "" +msgstr "Ignorarea generării indexului pentru {appid}" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" -msgstr "" +msgstr "Săritură {apkfilename} cu semnătură invalidă!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" -msgstr "" +msgstr "Salt peste {appid}: dezactivat" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: no builds specified" -msgstr "" +msgstr "Skipping {appid}: nu sunt specificate construcțiile" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Specify a local folder to sync the repo to" -msgstr "" +msgstr "Specificați un dosar local în care să sincronizați depozitul" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Specify an identity file to provide to SSH for rsyncing" -msgstr "" +msgstr "Specificați un fișier de identitate pe care să îl furnizați la SSH pentru rsyncing" #: ../fdroidserver/build.py msgid "Specify that we're running on the build server" -msgstr "" +msgstr "Specificați că rulăm pe serverul de construcție" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." -msgstr "" +msgstr "Specificați fișierul keystore de depanare care trebuie utilizat." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" -msgstr "" +msgstr "Aruncă și mai multe informații decât în mod normal" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Striping mystery signature from {apkfilename}" -msgstr "" +msgstr "Semnătură misterioasă de tip Striping de la {apkfilename}" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" -msgstr "" +msgstr "Eliminarea semnăturii misterioase din {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" -msgstr "" +msgstr "Rezumat \"%s\" este doar numele aplicației" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" -msgstr "" +msgstr "Rezumat al lungimii {length} depășește limita de caractere {limit} char limit" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" -msgstr "" +msgstr "Ceasul sistemului este mai vechi decât data din {path}!" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." -msgstr "" +msgstr "Modul test - puneți ieșirea numai în directorul tmp și construiți întotdeauna, chiar dacă ieșirea există deja." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" -msgstr "" +msgstr "Codul versiunii OBB trebuie să apară după \"{name}.\":" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" -msgstr "" +msgstr "URL-ul de bază pentru repo-ul de logat (implicit: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" -msgstr "" +msgstr "Directorul în care se va scrie oglinda" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" -msgstr "" +msgstr "Fișierul care urmează să fie inclus în repo (cale sau glob)" #: ../fdroidserver/deploy.py msgid "The only commands currently supported are 'init' and 'update'" -msgstr "" +msgstr "Singurele comenzi acceptate în prezent sunt 'init' and 'update'" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." -msgstr "" +msgstr "Amprenta digitală a depozitului nu se potrivește." #: ../fdroidserver/common.py msgid "The repository's index could not be verified." -msgstr "" +msgstr "Indexul depozitului nu a putut fi verificat." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" -msgstr "" +msgstr "Directorul root pentru local_copy_dir \"{path}\" nu există!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" -msgstr "" +msgstr "Există o coliziune keyalias - publicarea a fost oprită" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." -msgstr "" +msgstr "Acestea sunt aplicațiile care au fost arhivate din depozitul principal." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" +msgstr "Acesta este un depozit de aplicații care pot fi utilizate cu F-Droid. Aplicațiile din acest depozit sunt fie binare oficiale construite de către dezvoltatorii aplicațiilor originale, fie binare construite din sursă de către administratorul f-droid.org folosind instrumentele de pe https://gitlab.com/fdroid." #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" -msgstr "" +msgstr "Acest depozit are deja metadate locale: %s" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" +msgstr "Pentru a utiliza awsbucket, awssecretkey și awsaccesskeyid trebuie să fie de asemenea setate în config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" -msgstr "" +msgstr "URL-ul trebuie să înceapă cu https:// sau http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" -msgstr "" +msgstr "Scurtătoarele de URL-uri nu trebuie utilizate" #: ../fdroidserver/metadata.py msgid "URL title is just the URL, use brackets: [URL]" -msgstr "" +msgstr "Titlul URL este doar URL-ul, utilizați paranteze: [URL]" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" -msgstr "" +msgstr "URL {url} în Descriere: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "" +msgstr "Etichetă de licență neașteptată \"{}\"! Folosiți numai etichete aprobate de FSF sau OSI de pe https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "" +msgstr "Etichetă de licență neașteptată \"{}\"! Utilizați numai etichetele de licență configurate în fișierul de configurare" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" -msgstr "" +msgstr "Text neașteptat pe aceeași linie cu {field} în {linedesc}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "" +msgstr "Intrare necunoscută {key} în {configname}" #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" @@ -1788,110 +1793,110 @@ msgstr "S-a găsit o excepție necunoscută!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" -msgstr "" +msgstr "Fișier necunoscut '{filename}' în build '{versionName}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" -msgstr "" +msgstr "Format de metadate necunoscut: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path}" -msgstr "" +msgstr "Format de metadate necunoscut: {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" -msgstr "" +msgstr "Format de metadate necunoscut: {path} (use: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " -msgstr "" +msgstr "Versiune necunoscută de aapt, ar putea cauza probleme: " #: ../fdroidserver/lint.py msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "" +msgstr "Link nelegat - folosiți [http://foo.bar Link title] sau [http://foo.bar]" #: ../fdroidserver/lint.py msgid "Unnecessary leading space" -msgstr "" +msgstr "Spațiu de conducere inutil" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" -msgstr "" +msgstr "Spațiu de urmărire nejustificat" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" -msgstr "" +msgstr "Câmp de aplicație nerecunoscut '{fieldname}' în '{path}'" #: ../fdroidserver/metadata.py msgid "Unrecognised app field: " -msgstr "" +msgstr "Câmp de aplicație nerecunoscut: " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" -msgstr "" +msgstr "Indicator de construcție nerecunoscut '{build_flag}' în '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised field '{field}' in {linedesc}" -msgstr "" +msgstr "Câmp nerecunoscut '{field}' în {linedesc}" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" -msgstr "" +msgstr "Tip de fișier \"{extension}\" neacceptat pentru graficul repo" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" -msgstr "" +msgstr "A fost găsit un fișier grafic neacceptat: {path}" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Unsupported metadata format, use: --to [{supported}]" -msgstr "" +msgstr "Format de metadate neacceptat, utilizați: --to [{supported}]" #: ../fdroidserver/metadata.py msgid "Unterminated ]" -msgstr "" +msgstr "Neterminat ]" #: ../fdroidserver/metadata.py msgid "Unterminated ]]" -msgstr "" +msgstr "Nefinalizat ]]" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unterminated build in {name}" -msgstr "" +msgstr "Construcție nefinalizată în {name}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unterminated continuation in {name}" -msgstr "" +msgstr "Continuare nefinalizată în {name}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" -msgstr "" +msgstr "Extlib nefolosit la %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" -msgstr "" +msgstr "Fișier nefolosit la %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" -msgstr "" +msgstr "Calea de scanare a ștergerii neutilizată: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" -msgstr "" +msgstr "Cale de scanare neutilizată: %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -1907,45 +1912,45 @@ msgstr "Actualizați statisticile repo-ului" #: ../fdroidserver/update.py ../fdroidserver/build.py msgid "Update the wiki" -msgstr "" +msgstr "Actualizarea wiki" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" -msgstr "" +msgstr "UpdateCheckData are un URL invalid: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" -msgstr "" +msgstr "UpdateCheckData trebuie să utilizeze un URL HTTPS: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" -msgstr "" +msgstr "UpdateCheckData nu este un URL valid: {url}" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" -msgstr "" +msgstr "UpdateCheckMode este setat, dar se pare că checkupdates nu a fost rulat încă" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID - it can be removed" -msgstr "" +msgstr "UpdateCheckName este setat la ID-ul cunoscut al aplicației - acesta poate fi eliminat" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "" +msgstr "UpdateCheckName este setat la ID-ul cunoscut al aplicației, acesta poate fi eliminat" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" -msgstr "" +msgstr "Încărcarea {apkfilename} pe androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" -msgstr "" +msgstr "Încărcarea {apkfilename} la virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -1960,51 +1965,51 @@ msgstr "Utilizare: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" +msgstr "Folosiți /HEAD în loc de /master pentru a indica un fișier din ramura implicită" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." -msgstr "" +msgstr "Utilizați `fdroid update -c` pentru a-l crea." #: ../fdroidserver/build.py msgid "Use build server" -msgstr "" +msgstr "Utilizați serverul de construcție" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" +msgstr "Utilizați data din APK în loc de ora curentă pentru APK-urile nou adăugate" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." -msgstr "" +msgstr "Utilizarea \"{path}\" pentru configurarea s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" -msgstr "" +msgstr "Folosind APK Signature v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" -msgstr "" +msgstr "Folosind APK Signature v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" -msgstr "" +msgstr "Folosind jarsigner de la Java, nu este recomandat pentru verificarea APK-urilor! Utilizați apksigner" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" -msgstr "" +msgstr "Folosind androguard din \"{path}\"" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" -msgstr "" +msgstr "Utilizarea keystore-ului existent \"{path}\"" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" -msgstr "" +msgstr "Folosind s3cmd pentru a sincroniza cu: {url}" #: ../fdroid ../fdroidserver/__main__.py msgid "Valid commands are:" @@ -2012,7 +2017,7 @@ msgstr "Comenzile valide sunt:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." -msgstr "" +msgstr "Verificați în funcție de copia memorată în memoria cache locală, mai degrabă decât să reîncărcați." #: ../fdroid ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" @@ -2020,12 +2025,12 @@ msgstr "Verificarea integrității pachetelor descărcate" #: ../fdroidserver/index.py msgid "Verifying index signature:" -msgstr "" +msgstr "Verificarea semnăturii indexului:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "" +msgstr "VirusTotal API key nu poate încărca fișiere mai mari de 32MB, utilizați {url} pentru a încărca {path}." #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" @@ -2033,36 +2038,36 @@ msgstr "Avertizează cu privire la posibile erori de metadate" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" -msgstr "" +msgstr "Atunci când este configurat pentru indici cu semnătură, creați numai indici fără semnătură în această etapă" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "" +msgstr "Atunci când se face linting pentru întregul depozit, yamllint este dezactivat în mod implicit. Această opțiune forțează yamllint indiferent de aceasta." msgid "X.509 'Distiguished Name' used when generating keys" -msgstr "" +msgstr "X.509 \"Distiguished Name\" utilizat la generarea cheilor" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" -msgstr "" +msgstr "X.509 \"Distinguished Name\" utilizat la generarea cheilor" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" -msgstr "" +msgstr "Puteți utiliza ANDROID_HOME pentru a seta calea către SDK-ul dvs., adică:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" -msgstr "" +msgstr "Arhiva de fișiere ZIP" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" -msgstr "" +msgstr "adăugând IdentityFile la {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" -msgstr "" +msgstr "adăugând la {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2078,51 +2083,51 @@ msgstr "opțiune ambiguă: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" -msgstr "" +msgstr "apksigner nu a fost găsit, este necesar pentru a semna!" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py #: ../fdroidserver/checkupdates.py msgid "application ID of file to operate on" -msgstr "" +msgstr "ID-ul de aplicație al fișierului pe care se operează" #: ../fdroidserver/verify.py ../fdroidserver/publish.py #: ../fdroidserver/build.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" -msgstr "" +msgstr "ID-ul aplicației cu versionCode opțional sub forma APPID[:VERCODE]" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py msgid "applicationId in the form APPID" -msgstr "" +msgstr "applicationId sub forma APPID" #: ../fdroidserver/checkupdates.py msgid "applicationId to check for updates" -msgstr "" +msgstr "applicationId pentru a verifica dacă există actualizări" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py #: ../fdroidserver/build.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" -msgstr "" +msgstr "applicationId cu versionCode opțional sub forma APPID[:VERCODE]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "argument \"-\" with mode %r" -msgstr "" +msgstr "argumentul \"-\" cu modul %r" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" -msgstr "" +msgstr "încercând o conexiune SSH goală pentru a testa cheia de implementare:" #: ../fdroidserver/nightly.py msgid "attempting bare ssh connection to test deploy key:" -msgstr "" +msgstr "încercând o conexiune ssh goală pentru a testa cheia de implementare:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" -msgstr "" +msgstr "nu poate analiza specificația scrlib (not a string): '{}'" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2133,139 +2138,139 @@ msgstr "nu se poate deschide '%s': %s" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" -msgstr "" +msgstr "nu poate găsi srclibs necesare: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "cannot have multiple subparser arguments" -msgstr "" +msgstr "nu poate avea mai multe argumente subparser" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" -msgstr "" +msgstr "nu poate fuziona acțiuni - două grupuri se numesc %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" -msgstr "" +msgstr "nu poate publica actualizarea, ați setat cheia de implementare?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" -msgstr "" +msgstr "clonarea {url}" #: ../fdroidserver/deploy.py msgid "command to execute, either 'init' or 'update'" -msgstr "" +msgstr "comanda de executat, fie 'init' or 'update'" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" -msgstr "" +msgstr "comenzi din modulele plugin:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "complex" -msgstr "" +msgstr "complexă" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "șir de opțiuni conflictuale: %s" +msgstr[1] "șiruri de opțiuni conflictuale: %s" +msgstr[2] "șiruri de opțiuni conflictuale: %s" #: ../fdroidserver/nightly.py #, python-brace-format msgid "copying {apkfilename} into {path}" -msgstr "" +msgstr "copierea {apkfilename} în {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" -msgstr "" +msgstr "nu s-a putut analiza '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "" +msgstr "nu a putut analiza specificația srclib (nu a fost specificat niciun ref): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" +msgstr "could not parse srclib spec (prea multe semne '@'): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" -msgstr "" +msgstr "a creat {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" -msgstr "" +msgstr "ștergere: repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed build logs to '{path}'" -msgstr "" +msgstr "a implementat jurnalele de construcție în '{path}'" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" -msgstr "" +msgstr "a implementat jurnalul de proces {path} la {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "dest= is required for options like %r" -msgstr "" +msgstr "dest= este necesar pentru opțiuni precum %r" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" -msgstr "" +msgstr "binar executabil, eventual cod" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "argument %s așteptat" +msgstr[1] "argumente %s așteptate" +msgstr[2] "argumente %s așteptate" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "expected at least one argument" -msgstr "" +msgstr "se așteaptă cel puțin un argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "expected at most one argument" -msgstr "" +msgstr "se așteaptă cel mult un argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "expected one argument" -msgstr "" +msgstr "se așteaptă un singur argument" #: ../fdroidserver/common.py #, python-brace-format msgid "failed deploying build logs to '{path}'" -msgstr "" +msgstr "a eșuat distribuirea jurnalelor de construcție în '{path}'" #: ../fdroid msgid "fdroid [-h|--help|--version] []" -msgstr "" +msgstr "fdroid [-h|--help|--version] []" #: ../fdroid ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" -msgstr "" +msgstr "fdroid [] [-h|--help|--version|]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "floating-point" -msgstr "" +msgstr "punct flotant" #: ../fdroidserver/metadata.py msgid "force errors to be warnings, or ignore" @@ -2273,86 +2278,86 @@ msgstr "forțați erorile să fie avertismente sau ignorați" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." -msgstr "" +msgstr "forțează erorile de metadate (implicit) să fie avertismente sau să fie ignorate." #: ../fdroidserver/common.py msgid "git svn clone failed" -msgstr "" +msgstr "git svn clone a eșuat" #: ../fdroidserver/scanner.py msgid "gzip file archive" -msgstr "" +msgstr "Arhiva de fișiere gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "ignored explicit argument %r" -msgstr "" +msgstr "a ignorat argumentul explicit %r" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" -msgstr "" +msgstr "index-v1 trebuie să aibă o semnătură, folosiți `fdroid signindex` pentru a o crea!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "integer" -msgstr "" +msgstr "întreg" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" -msgstr "" +msgstr "invalid %(type)s valoare: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "" +msgstr "alegere invalidă: %(value)r (alege din %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" -msgstr "" +msgstr "valoare invalidă a rezoluției_conflictului: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" -msgstr "" +msgstr "șir de opțiuni invalid %(option)r: trebuie să înceapă cu un caracter %(prefix_chars)r" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" -msgstr "" +msgstr "local_copy_dir nu se termină cu \"fdroid\", poate ai vrut să spui: \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" -msgstr "" +msgstr "local_copy_dir trebuie să fie o rută de acces absolută!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" -msgstr "" +msgstr "local_copy_dir trebuie să fie un director, nu un fișier!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" -msgstr "" +msgstr "oglinda '%s' nu se termină cu 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "mutually exclusive arguments must be optional" -msgstr "" +msgstr "argumentele care se exclud reciproc trebuie să fie opționale" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" -msgstr "" +msgstr "nu există \" pictogramă \" în {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" -msgstr "" +msgstr "nici un APK furnizat" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2362,40 +2367,40 @@ msgstr "nu există o astfel de opțiune: %s" #: ../fdroid ../fdroidserver/__main__.py msgid "no version info found!" -msgstr "" +msgstr "nu s-au găsit informații despre versiune!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "not allowed with argument %s" -msgstr "" +msgstr "nu este permis cu argumentul %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "one of the arguments %s is required" -msgstr "" +msgstr "unul dintre argumentele %s este necesar" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "only accepts strings, lists, and tuples" -msgstr "" +msgstr "acceptă doar șiruri de caractere, liste și tupluri" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" +msgstr "opțiunea %s: Dacă doriți cu adevărat să instalați toate aplicațiile semnate, utilizați --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "option %s: invalid %s value: %r" -msgstr "" +msgstr "opțiunea %s: valoare %s invalidă: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" +msgstr "opțiunea %s: alegere invalidă: %r (alege din %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2441,7 +2446,7 @@ msgstr "argumente opționale" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" -msgstr "" +msgstr "suprascriere {path} existent" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2451,40 +2456,40 @@ msgstr "argumente poziționale" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" -msgstr "" +msgstr "jurnalul procesului deploy {path} la {dest} a eșuat!" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "" +msgstr "refuză descărcarea prin conexiune HTTP nesigură (utilizați HTTPS sau specificați --no-https-check): {apkfilename}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" -msgstr "" +msgstr "refuză descărcarea prin conexiune http nesigură (utilizați https sau specificați --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "" +msgstr "repo_icon \"repo/icons/%s\" nu există, se generează un înlocuitor." #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." -msgstr "" +msgstr "repo_icon %s nu există, se generează un spațiu rezervat." #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" +msgstr "ruamel.yaml nu este instalat, nu poate scrie metadatele." #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" -msgstr "" +msgstr "s3cmd sincronizează indexurile {path} cu {url} și șterge" #: ../fdroidserver/scanner.py msgid "shared library" -msgstr "" +msgstr "bibliotecă partajată" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2499,33 +2504,33 @@ msgstr "arată acest mesaj de ajutor și iese" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." -msgstr "" +msgstr "APK semnat, fie un file-path, fie un URL HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "" +msgstr "săriți distribuirea jurnalelor complete de construcție: conținutul jurnalului este gol" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" -msgstr "" +msgstr "săriți distribuirea jurnalelor complete de construcție: nu este activată în configurare" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" -msgstr "" +msgstr "săriți de la pachetul sursă: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" -msgstr "" +msgstr "srclibs lipsește numele și/sau @" #: ../fdroidserver/scanner.py msgid "static library" -msgstr "" +msgstr "bibliotecă statică" #: ../fdroidserver/common.py #, python-brace-format msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" -msgstr "" +msgstr "valoarea timestamp furnizată '{timestamp}' nu este un timestamp unix" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2543,7 +2548,7 @@ msgstr "șir de opțiuni neașteptate: %s" #: /usr/lib/python3.7/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "" +msgstr "parser necunoscut %(parser_name)r (choices: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2568,165 +2573,165 @@ msgstr "utilizare: fdroid [-h|--help|--version] []" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" -msgstr "" +msgstr "folosind Apache libcloud pentru a se sincroniza cu {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "" +msgstr "virustotal.com limitează rata, așteptând o nouă încercare..." #: ../fdroidserver/update.py msgid "wiki support is deprecated and will be removed in the next release!" -msgstr "" +msgstr "Suportul pentru wiki este depreciat și va fi eliminat în următoarea versiune!" #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{0} aplicație, {1} aliasuri de chei" +msgstr[1] "{0} aplicații, {1} aliasuri de chei" +msgstr[2] "{0} aplicații, {1} aliasuri de chei" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" -msgstr "" +msgstr "{apkfilename} ({appid}) nu are metadate!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" +msgstr "{apkfilename} are mai multe fișiere {name}, pare a fi un exploit Master Key!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " -msgstr "" +msgstr "AndroidManifest.xml al lui {apkfilename} are o dată greșită: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." -msgstr "" +msgstr "{appid} nu are un nume! În schimb, utilizați ID-ul aplicației." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using package name instead." -msgstr "" +msgstr "{appid} nu are un nume! În schimb, se folosește numele pachetului." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android Package Name!" -msgstr "" +msgstr "{appid} din {path} nu este un nume de pachet Android valid!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" -msgstr "" +msgstr "{appid} din {path} nu este un ID de aplicație Android valid!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" -msgstr "" +msgstr "{appid} din {path} nu este un nume de pachet Java valid!" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" -msgstr "" +msgstr "{appid} lipsește {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" -msgstr "" +msgstr "{appid}: Extlib necunoscut {path} în build '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" -msgstr "" +msgstr "{appid}: nu este specificată nicio construcție, rulează pe starea curentă a sursei" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "" +msgstr "{appid}: {field} trebuie să fie un \"{type}\", dar este un \"{fieldtype}!\"" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" -msgstr "" +msgstr "{appid}: {field} trebuie să fie un '{type}', dar este un '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" -msgstr "" +msgstr "{build_flag} trebuie să fie un număr întreg, găsit: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{field} not terminated in {name}" -msgstr "" +msgstr "{field} nu se termină în {name}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" -msgstr "" +msgstr "{file} este gol sau corupt!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{path}\" does not exist! Correct it in config.yml." -msgstr "" +msgstr "{name} \"{path}\" nu există! Corectați-o în config.yml." #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "" +msgstr "{name} \"{section}/icons/{path}\" nu există! Verificați \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "{oldfile} este depreciat, folosiți {newfile}" #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" -msgstr "" +msgstr "{path} există deja, ignorând rezultatele importului!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" -msgstr "" +msgstr "{path} nu există! Creați-l prin rularea:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "" +msgstr "{path} are o semnătură proastă a fișierului \"{pattern}\", posibil exploit Janus!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" -msgstr "" +msgstr "{path} este de dimensiune zero!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" -msgstr "" +msgstr "{path} mai mult de 200MB, încărcați manual: {url}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" -msgstr "" +msgstr "{url} nu se termină cu \"fdroid\", verificați calea URL!" #: ../fdroidserver/common.py #, python-brace-format msgid "{url} does not start with \"http\"!" -msgstr "" +msgstr "{url} nu începe cu \"http\"!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{} construcția a eșuat" +msgstr[1] "{} a eșuat" +msgstr[2] "{} a eșuat" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{} a reușit să construiască" +msgstr[1] "{} construite cu succes" +msgstr[2] "{} construite cu succes" From 69ffe638f080d5ca924fafa0c640927bfc605446 Mon Sep 17 00:00:00 2001 From: S3aBreeze Date: Mon, 28 Jun 2021 20:53:18 +0200 Subject: [PATCH 0369/2116] Translated using Weblate: Russian (ru) by S3aBreeze Currently translated at 100.0% (576 of 576 strings) Co-authored-by: S3aBreeze Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translation: F-Droid/F-Droid Server --- locale/ru/LC_MESSAGES/fdroidserver.po | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 7fc8b569..f85d21bd 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -8,20 +8,21 @@ # Boris Timofeev , 2020. # Hans-Christoph Steiner , 2020. # Roman , 2020. +# S3aBreeze , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-31 22:07+0000\n" -"Last-Translator: Golubev Alexander \n" +"PO-Revision-Date: 2021-04-16 06:26+0000\n" +"Last-Translator: S3aBreeze \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.6-dev\n" #: ../fdroidserver/common.py msgid "" From de37dc27f8e58651ef570a89ffd9437e83577e37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A7=D1=82=D0=B0=D0=B1=D1=81?= Date: Mon, 28 Jun 2021 20:53:20 +0200 Subject: [PATCH 0370/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Russi?= =?UTF-8?q?an=20(ru)=20by=20=D0=A7=D1=82=D0=B0=D0=B1=D1=81=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (576 of 576 strings) Co-authored-by: Чтабс Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translation: F-Droid/F-Droid Server --- locale/ru/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index f85d21bd..936bb661 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -9,20 +9,21 @@ # Hans-Christoph Steiner , 2020. # Roman , 2020. # S3aBreeze , 2021. +# Чтабс , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-04-16 06:26+0000\n" -"Last-Translator: S3aBreeze \n" +"PO-Revision-Date: 2021-05-17 04:57+0000\n" +"Last-Translator: Чтабс \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.6-dev\n" +"X-Generator: Weblate 4.7-dev\n" #: ../fdroidserver/common.py msgid "" @@ -2657,7 +2658,7 @@ msgstr "{appid}: ревизия сборки не указана, сборка #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "{appid}: {field} должно быть '{type}', а не '{fieldtype}'!" +msgstr "{appid}: {field} должно быть '{type}', а не '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format From 07a3ddad5fdce6d7bfa502088ee47c661caf842e Mon Sep 17 00:00:00 2001 From: Andrey Date: Mon, 28 Jun 2021 20:53:25 +0200 Subject: [PATCH 0371/2116] Translated using Weblate: Russian (ru) by Andrey Currently translated at 100.0% (576 of 576 strings) Co-authored-by: Andrey Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translation: F-Droid/F-Droid Server --- locale/ru/LC_MESSAGES/fdroidserver.po | 34 +++++++++++++-------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 936bb661..cfc56634 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -3,7 +3,7 @@ # Golubev Alexander , 2020, 2021. # Mingun , 2020. # anonymous , 2020. -# Andrey , 2020. +# Andrey , 2020, 2021. # gardenapple , 2020. # Boris Timofeev , 2020. # Hans-Christoph Steiner , 2020. @@ -15,8 +15,8 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-05-17 04:57+0000\n" -"Last-Translator: Чтабс \n" +"PO-Revision-Date: 2021-06-06 13:34+0000\n" +"Last-Translator: Andrey \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" @@ -48,7 +48,7 @@ msgid "" "SSH Public Key to be used as Deploy Key:" msgstr "" "\n" -"Открытый SSH-ключ, который будет использоваться в качестве ключа развёртывания (Deploy Key):" +"Открытый SSH-ключ, который будет использоваться в качестве ключа развертывания (Deploy Key):" #: ../fdroidserver/nightly.py msgid "" @@ -56,7 +56,7 @@ msgid "" "SSH public key to be used as deploy key:" msgstr "" "\n" -"Открытый SSH-ключ, который будет использоваться в качестве ключа развёртывания (Deploy Key):" +"Открытый SSH-ключ, который будет использоваться в качестве ключа развертывания (Deploy Key):" #: ../fdroidserver/nightly.py #, python-brace-format @@ -931,7 +931,7 @@ msgstr "Не удалось настроить HEAD для удаленного #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" -msgstr "Не удалось настроить HEAD для удалённого репозитория (git remote set-head): \"%s\"" +msgstr "Не удалось настроить HEAD для удаленного репозитория (git remote set-head): \"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" @@ -984,7 +984,7 @@ msgstr "Проигнорировано: файл {ext} в '{path}'" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "Включать APK, подписанные отключёнными алгоритмами, например MD5" +msgstr "Включать APK, подписанные отключенными алгоритмами, например MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" @@ -1123,7 +1123,7 @@ msgstr "Неверно указан versionCode: \"{versionCode}\". Это до #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" -msgstr "Не удаётся проверить подпись JAR: {path}" +msgstr "Не удается проверить подпись JAR: {path}" #: ../fdroidserver/common.py #, python-brace-format @@ -1137,7 +1137,7 @@ msgstr "JAR-файл Java" #: ../fdroidserver/publish.py ../fdroidserver/update.py #: ../fdroidserver/mirror.py msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "Не обнаружена Java JDK! Установите её по стандартному пути или настройте переменную java_paths!" +msgstr "Не обнаружена Java JDK! Установите ее по стандартному пути или настройте переменную java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" @@ -1355,7 +1355,7 @@ msgstr "Параметры" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." -msgstr "Вывод отчёта в формате JSON под именем файла APK." +msgstr "Вывод отчета в формате JSON под именем файла APK." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." @@ -1696,11 +1696,11 @@ msgstr "Короткое описание приложения ({length} зна #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" -msgstr "Системное время отстаёт от date в {path}!" +msgstr "Системное время отстает от date в {path}!" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." -msgstr "Тестовый режим. Всё собранное попадает во временную директорию; сборка запускается снова в любом случае." +msgstr "Тестовый режим. Все собранное попадает во временную директорию; сборка запускается снова в любом случае." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1730,7 +1730,7 @@ msgstr "Идентификационная метка (fingerprint) репози #: ../fdroidserver/common.py msgid "The repository's index could not be verified." -msgstr "Индекс репозитория не прошёл проверку." +msgstr "Индекс репозитория не прошел проверку." #: ../fdroidserver/deploy.py #, python-brace-format @@ -2046,11 +2046,11 @@ msgstr "Предупреждать о возможных ошибках в ме #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" -msgstr "Даже если в конфигурации сборки задано подписывать индексы, то всё равно cоздавать неподписанные индексы (только на данном этапе)" +msgstr "Даже если в конфигурации сборки задано подписывать индексы, то все равно cоздавать неподписанные индексы (только на данном этапе)" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "При проверке целого репозитория, yamllint по умолчанию отключён. Этот параметр принудительно включает yamllint." +msgstr "При проверке целого репозитория, yamllint по умолчанию отключен. Этот параметр принудительно включает yamllint." msgid "X.509 'Distiguished Name' used when generating keys" msgstr "При генерации ключей использовалось различимое имя (Distinguished Name) стандарта X.509" @@ -2127,7 +2127,7 @@ msgstr "аргумент \"-\" c режимом %r" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" -msgstr "попытка установить голое SSH-соединение для проверки ключа развёртывания:" +msgstr "попытка установить голое SSH-соединение для проверки ключа развертывания:" #: ../fdroidserver/nightly.py msgid "attempting bare ssh connection to test deploy key:" @@ -2678,7 +2678,7 @@ msgstr "Неверно заполненное поле {field} в {name}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" -msgstr "{file} пустой или повреждённый!" +msgstr "{file} пустой или поврежденный!" #: ../fdroidserver/update.py #, python-brace-format From 7c037cffcfd152adba4c33f2c8f7e3c8ffa1dd1f Mon Sep 17 00:00:00 2001 From: mondstern Date: Mon, 28 Jun 2021 20:53:07 +0200 Subject: [PATCH 0372/2116] Translated using Weblate: Spanish (es) by mondstern Currently translated at 99.1% (571 of 576 strings) Translated using Weblate: Czech (cs) by mondstern Currently translated at 8.3% (48 of 576 strings) Translated using Weblate: Czech (cs) by mondstern Currently translated at 7.2% (42 of 576 strings) Translated using Weblate: Italian (it) by mondstern Currently translated at 100.0% (576 of 576 strings) Co-authored-by: mondstern Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ Translation: F-Droid/F-Droid Server --- locale/cs/LC_MESSAGES/fdroidserver.po | 59 +++-- locale/es/LC_MESSAGES/fdroidserver.po | 9 +- locale/it/LC_MESSAGES/fdroidserver.po | 344 +++++++++++++------------- 3 files changed, 206 insertions(+), 206 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index bf95d6f2..70c7cee2 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -1,21 +1,20 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# FIRST AUTHOR , YEAR. -# +# mondstern , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2019-02-01 13:33+0000\n" -"Last-Translator: Michal Čihař \n" +"PO-Revision-Date: 2021-03-05 16:50+0000\n" +"Last-Translator: mondstern \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 3.5-dev\n" +"X-Generator: Weblate 4.5.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -124,7 +123,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "%r is not callable" -msgstr "" +msgstr "%r není možné volat" #: ../fdroidserver/lint.py #, python-format @@ -160,7 +159,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" -msgstr "" +msgstr "'povinné' je Neplatný argument pro pozicials" #: ../fdroidserver/common.py msgid "'sdk_path' not set in 'config.yml'!" @@ -186,12 +185,12 @@ msgstr "" #: ../fdroidserver/install.py #, python-brace-format msgid "'{apkfilename}' is already installed on {dev}." -msgstr "" +msgstr "'{apkfilename} ' je již nainstalován na {dev}." #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{field}' in {linedesc} is obsolete, see docs for current fields:" -msgstr "" +msgstr "'{field} ' v {linedesc} je zastaralý, viz dokumenty pro aktuální pole:" #: ../fdroidserver/common.py #, python-brace-format @@ -211,7 +210,7 @@ msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" -msgstr "" +msgstr "...kontrola selhala pro {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -232,15 +231,15 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" -msgstr "" +msgstr "Přidejte podpisy PGP pomocí GnuPG pro balíčky v repo" #: ../fdroid ../fdroidserver/__main__.py msgid "Add a new application from its source code" -msgstr "" +msgstr "Přidejte novou aplikaci ze zdrojového kódu" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" -msgstr "" +msgstr "Přidejte podpisový klíč repo k nepodepsanému repo" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" @@ -427,7 +426,7 @@ msgstr "Kategorie nejsou nastavené" #: ../fdroid ../fdroidserver/__main__.py msgid "Check for updates to applications" -msgstr "" +msgstr "Zkontrolujte aktualizace aplikací" #: ../fdroidserver/update.py #, python-brace-format @@ -523,7 +522,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Create skeleton metadata files that are missing" -msgstr "" +msgstr "Vytvořte soubory metadat kostry, které chybí" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -675,7 +674,7 @@ msgstr "" #: ../fdroid msgid "Dynamically scan APKs post build" -msgstr "" +msgstr "Dynamicky skenovat APKs post build" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -984,7 +983,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Install built packages on devices" -msgstr "" +msgstr "Nainstalujte vestavěné balíčky na zařízení" #: ../fdroidserver/install.py #, python-format @@ -1008,7 +1007,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" -msgstr "" +msgstr "Interakce se serverem repo HTTP" #: ../fdroidserver/update.py msgid "Invalid APK" @@ -1445,11 +1444,11 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Quickly start a new repository" -msgstr "" +msgstr "Rychle spusťte nové úložiště" #: ../fdroid ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" -msgstr "" +msgstr "Přečtěte si všechny soubory metadat a ukončete" #: ../fdroidserver/common.py #, python-brace-format @@ -1547,7 +1546,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Scan the source code of a package" -msgstr "" +msgstr "Naskenujte zdrojový kód balíčku" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1594,11 +1593,11 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" -msgstr "" +msgstr "Podepsat a umístit balíčky v repo" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" -msgstr "" +msgstr "Podepsat indexy vytvořené pomocí aktualizace -- nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" @@ -1884,11 +1883,11 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" -msgstr "" +msgstr "Aktualizujte informace o repo pro nové balíčky" #: ../fdroid ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" -msgstr "" +msgstr "Aktualizujte protokol binárního průhlednosti pro adresu URL" #: ../fdroid ../fdroidserver/__main__.py msgid "Update the stats of the repo" @@ -2005,7 +2004,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" -msgstr "" +msgstr "Ověřte integritu stažených balíčků" #: ../fdroidserver/index.py msgid "Verifying index signature:" @@ -2390,13 +2389,13 @@ msgstr "" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option -%s not recognized" -msgstr "" +msgstr "možnost - %s není rozpoznána" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py #, python-format msgid "option -%s requires argument" -msgstr "" +msgstr "možnost - %s vyžaduje argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2414,7 +2413,7 @@ msgstr "" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s not recognized" -msgstr "" +msgstr "možnost -%s není rozpoznána" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2478,7 +2477,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "show program's version number and exit" -msgstr "" +msgstr "zobrazit číslo verze programu a ukončit" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 75d95753..1844e57f 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -7,20 +7,21 @@ # Alvaro , 2020. # Fioddor Superconcentrado , 2021. # Adolfo Jayme Barrientos , 2021. +# mondstern , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-28 22:09+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2021-03-10 21:51+0000\n" +"Last-Translator: mondstern \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: ../fdroidserver/common.py msgid "" @@ -71,7 +72,7 @@ msgstr "¡\"%s/\" no tiene su correspondiente fichero de metadatos!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" +msgstr "\"repo_pubkey\" debe estar presente en la configuración.yml al usar --nosign!" #: ../fdroidserver/install.py #, python-brace-format diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 90939de9..d358865b 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -15,8 +15,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-03-01 21:55+0000\n" -"Last-Translator: x \n" +"PO-Revision-Date: 2021-03-03 06:19+0000\n" +"Last-Translator: mondstern \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" @@ -453,9 +453,9 @@ msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, arc msgstr "Controllando l'archiviazione per {appid} - APK:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Controllando l'archiviazione per {appid} - APK:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Controllo dell'archiviazione per {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -1696,50 +1696,50 @@ msgstr "L'orologio di sistema è più vecchio della data in {path}!" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." -msgstr "" +msgstr "Modalità test - mette l'output solo nella directory tmp, e costruisce sempre, anche se l'output esiste già." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" -msgstr "" +msgstr "Il codice della versione OBB deve venire dopo \"{name}\":" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" -msgstr "" +msgstr "L'URL di base per il repo da registrare (predefinito: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" -msgstr "" +msgstr "La directory in cui scrivere il mirror" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" -msgstr "" +msgstr "Il file da includere nel repo (percorso o glob)" #: ../fdroidserver/deploy.py msgid "The only commands currently supported are 'init' and 'update'" -msgstr "" +msgstr "Gli unici comandi attualmente supportati sono 'init' e 'update'" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." -msgstr "" +msgstr "L'impronta digitale del repository non corrisponde." #: ../fdroidserver/common.py msgid "The repository's index could not be verified." -msgstr "" +msgstr "Non è stato possibile verificare l'indice del repository." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" -msgstr "" +msgstr "La directory principale per local_copy_dir \"{path}\" non esiste!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" -msgstr "" +msgstr "C'è una collisione keyalias - pubblicazione interrotta" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." -msgstr "" +msgstr "Queste sono le applicazioni che sono state archiviate dal repo principale." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." @@ -1748,46 +1748,46 @@ msgstr "Questo è un repository di applicazioni da utilizzare con F-Droid. Le ap #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" -msgstr "" +msgstr "Questo repo ha già metadati locali: %s" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" +msgstr "Per usare awsbucket, awssecretkey e awsaccesskeyid devono essere impostati anche in config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" -msgstr "" +msgstr "L'URL deve iniziare con https:// o http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" -msgstr "" +msgstr "Gli accorciatori di URL non dovrebbero essere usati" #: ../fdroidserver/metadata.py msgid "URL title is just the URL, use brackets: [URL]" -msgstr "" +msgstr "Il titolo dell'URL è solo l'URL, usa le parentesi: [URL]" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" -msgstr "" +msgstr "URL {url} in Descrizione: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "" +msgstr "Tag di licenza inaspettato \"{}\"! Usare solo tag approvati da FSF o OSI da https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "" +msgstr "Tag di licenza inaspettato \"{}\"! Usa solo i tag di licenza configurati nel tuo file di configurazione" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" -msgstr "" +msgstr "Testo inatteso sulla stessa linea di {field} in {linedesc}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "" +msgstr "Voce sconosciuta {key} in {configname}" #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" @@ -1797,110 +1797,110 @@ msgstr "Eccezione sconosciuta trovata!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" -msgstr "" +msgstr "File sconosciuto '{filename}' nella build '{versionName}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" -msgstr "" +msgstr "Formato di metadati sconosciuto: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path}" -msgstr "" +msgstr "Formato dei metadati sconosciuto: {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" -msgstr "" +msgstr "Formato dei metadati sconosciuto: {path} (usa: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " -msgstr "" +msgstr "Versione sconosciuta di aapt, potrebbe causare problemi: " #: ../fdroidserver/lint.py msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "" +msgstr "Link non linkato - usa [http://foo.bar Titolo del link] o [http://foo.bar]" #: ../fdroidserver/lint.py msgid "Unnecessary leading space" -msgstr "" +msgstr "Spazio iniziale non necessario" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" -msgstr "" +msgstr "Spazio finale non necessario" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" -msgstr "" +msgstr "Campo dell'app non riconosciuto '{fieldname}' in '{path}'" #: ../fdroidserver/metadata.py msgid "Unrecognised app field: " -msgstr "" +msgstr "Campo app non riconosciuto: " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" -msgstr "" +msgstr "Flag di costruzione non riconosciuto '{build_flag}' in '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised field '{field}' in {linedesc}" -msgstr "" +msgstr "Campo non riconosciuto '{field}' in {linedesc}" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" -msgstr "" +msgstr "Tipo di file non supportato \"{extension}\" per la grafica del repo" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" -msgstr "" +msgstr "Trovato un file grafico non supportato: {path}" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Unsupported metadata format, use: --to [{supported}]" -msgstr "" +msgstr "Formato di metadati non supportato, usa: --a [{supported}]" #: ../fdroidserver/metadata.py msgid "Unterminated ]" -msgstr "" +msgstr "Non terminato ]" #: ../fdroidserver/metadata.py msgid "Unterminated ]]" -msgstr "" +msgstr "Non terminato ]]" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unterminated build in {name}" -msgstr "" +msgstr "Costruzione non terminata in {name}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unterminated continuation in {name}" -msgstr "" +msgstr "Continuazione non terminata in {name}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" -msgstr "" +msgstr "Extlib inutilizzata a %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" -msgstr "" +msgstr "File inutilizzato a %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" -msgstr "" +msgstr "Percorso scandelete non utilizzato: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" -msgstr "" +msgstr "Percorso scanignore non utilizzato: %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -1916,45 +1916,45 @@ msgstr "Aggiorna le statistiche del repo" #: ../fdroidserver/update.py ../fdroidserver/build.py msgid "Update the wiki" -msgstr "" +msgstr "Aggiorna il wiki" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" -msgstr "" +msgstr "UpdateCheckData ha un URL non valido: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" -msgstr "" +msgstr "UpdateCheckData deve usare l'URL HTTPS: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" -msgstr "" +msgstr "UpdateCheckData non è un URL valido: {url}" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" -msgstr "" +msgstr "UpdateCheckMode è impostato ma sembra che checkupdates non sia stato ancora eseguito" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID - it can be removed" -msgstr "" +msgstr "UpdateCheckName è impostato sull'ID dell'applicazione nota - può essere rimosso" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "" +msgstr "UpdateCheckName è impostato sull'ID dell'applicazione nota, può essere rimosso" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" -msgstr "" +msgstr "Caricamento di {apkfilename} su androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" -msgstr "" +msgstr "Caricamento di {apkfilename} su virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -1969,32 +1969,32 @@ msgstr "Utilizzo: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" +msgstr "Usare /HEAD invece di /master per puntare a un file nel ramo predefinito" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." -msgstr "" +msgstr "Usa `fdroid update -c` per crearlo." #: ../fdroidserver/build.py msgid "Use build server" -msgstr "" +msgstr "Utilizzare il build server" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" +msgstr "Usa la data dell'APK invece dell'ora corrente per gli APK aggiunti di recente" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." -msgstr "" +msgstr "Usare \"{path}\" per configurare s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" -msgstr "" +msgstr "Usare la firma APK v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" -msgstr "" +msgstr "Usare la firma APK v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -2003,12 +2003,12 @@ msgstr "Utilizzando jarsigner di Java, non raccomandato per verificare APK! Util #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" -msgstr "" +msgstr "Usando androguard da \"{path}\"" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" -msgstr "" +msgstr "Utilizzando il keystore esistente \"{path}\"" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -2034,7 +2034,7 @@ msgstr "Verifica della firma dell'indice:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "" +msgstr "La chiave API di VirusTotal non può caricare file più grandi di 32MB, usa {url} per caricare {path}." #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" @@ -2042,36 +2042,36 @@ msgstr "Avvisa riguardo possibili errori nei metadati" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" -msgstr "" +msgstr "Se configurato per indici firmati, crea solo indici senza segno in questa fase" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Quando linting l'intero repository yamllint è disabilitato per impostazione predefinita. Questa opzione costringe yamllint a prescindere." msgid "X.509 'Distiguished Name' used when generating keys" -msgstr "" +msgstr "X.509 'Distiguished Name' usato quando si generano le chiavi" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" -msgstr "" +msgstr "X.509 'Distinguished Name' usato quando si generano le chiavi" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" -msgstr "" +msgstr "Potete usare ANDROID_HOME per impostare il percorso del vostro SDK, cioè:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" -msgstr "" +msgstr "Archivio di file ZIP" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" -msgstr "" +msgstr "aggiungendo IdentityFile a {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" -msgstr "" +msgstr "aggiungendo a {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2092,17 +2092,17 @@ msgstr "apksigner non trovato, è necessario per la firma!" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py #: ../fdroidserver/checkupdates.py msgid "application ID of file to operate on" -msgstr "" +msgstr "ID dell'applicazione del file su cui operare" #: ../fdroidserver/verify.py ../fdroidserver/publish.py #: ../fdroidserver/build.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" -msgstr "" +msgstr "ID dell'applicazione con versionCode opzionale nella forma APPID[:VERCODE]" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py msgid "applicationId in the form APPID" -msgstr "" +msgstr "applicationId nella forma APPID" #: ../fdroidserver/checkupdates.py msgid "applicationId to check for updates" @@ -2113,7 +2113,7 @@ msgstr "applicationId per controllare gli aggiornamenti" #: ../fdroidserver/build.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" -msgstr "" +msgstr "applicationId con versionCode opzionale nella forma APPID[:VERCODE]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2157,113 +2157,113 @@ msgstr "impossibile unire le azioni : due gruppi sono denominati %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" -msgstr "" +msgstr "non può pubblicare l'aggiornamento, avete impostato la chiave di distribuzione?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" -msgstr "" +msgstr "clonazione {url}" #: ../fdroidserver/deploy.py msgid "command to execute, either 'init' or 'update'" -msgstr "" +msgstr "comando da eseguire, sia 'init' che 'update'" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" -msgstr "" +msgstr "dai moduli dei plugin:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "complex" -msgstr "" +msgstr "complesso" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "stringa di opzioni in conflitto: %s" +msgstr[1] "stringhe di opzioni in conflitto: %s" #: ../fdroidserver/nightly.py #, python-brace-format msgid "copying {apkfilename} into {path}" -msgstr "" +msgstr "copiando {apkfilename} in {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" -msgstr "" +msgstr "non ha potuto analizzare '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "" +msgstr "non ha potuto analizzare la specifica srclib (nessun riferimento specificato): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" +msgstr "non ha potuto analizzare la specifica srclib (troppi segni '@'): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" -msgstr "" +msgstr "creato {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" -msgstr "" +msgstr "cancellazione: repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed build logs to '{path}'" -msgstr "" +msgstr "ha distribuito i log di compilazione a '{path}'" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" -msgstr "" +msgstr "log di processo distribuito {path} a {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "dest= is required for options like %r" -msgstr "" +msgstr "dest= è richiesto per opzioni come %r" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" -msgstr "" +msgstr "binario eseguibile, eventualmente codice" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "atteso %s argomento" +msgstr[1] "atteso %s argomenti" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "expected at least one argument" -msgstr "" +msgstr "si aspettava almeno un argomento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "expected at most one argument" -msgstr "" +msgstr "atteso al massimo un argomento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "expected one argument" -msgstr "" +msgstr "atteso un argomento" #: ../fdroidserver/common.py #, python-brace-format msgid "failed deploying build logs to '{path}'" -msgstr "" +msgstr "non è riuscito a distribuire i log di compilazione a '{path}'" #: ../fdroid msgid "fdroid [-h|--help|--version] []" -msgstr "" +msgstr "fdroid [-h|--help|--versione] []" #: ../fdroid ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" @@ -2272,7 +2272,7 @@ msgstr "fdroid [] [-h|--help|--version|]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "floating-point" -msgstr "" +msgstr "in virgola mobile" #: ../fdroidserver/metadata.py msgid "force errors to be warnings, or ignore" @@ -2284,50 +2284,50 @@ msgstr "forza gli errori di metadati (predefinito) come avvisi, o da ignorare." #: ../fdroidserver/common.py msgid "git svn clone failed" -msgstr "" +msgstr "git svn clone fallito" #: ../fdroidserver/scanner.py msgid "gzip file archive" -msgstr "" +msgstr "archivio file gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "ignored explicit argument %r" -msgstr "" +msgstr "ignorava l'argomento esplicito %r" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" -msgstr "" +msgstr "index-v1 deve avere una firma, usa `fdroid signindex` per crearla!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "integer" -msgstr "" +msgstr "intero" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" -msgstr "" +msgstr "valore %(type)s non valido: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "" +msgstr "scelta non valida: %(value)r (scegliere tra %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" -msgstr "" +msgstr "valore di risoluzione dei conflitti non valido: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" -msgstr "" +msgstr "stringa di opzioni non valida %(option)r: deve iniziare con un carattere %(prefix_chars)r" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2345,21 +2345,21 @@ msgstr "local_copy_dir deve essere una cartella, non un file!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" -msgstr "" +msgstr "il mirror '%s' non finisce con 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "mutually exclusive arguments must be optional" -msgstr "" +msgstr "gli argomenti che si escludono a vicenda devono essere opzionali" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" -msgstr "" +msgstr "nessuna \"icona\" in {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" -msgstr "" +msgstr "nessun APK fornito" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2375,34 +2375,34 @@ msgstr "nessuna informazione sulla versione è stata trovata!" #: /usr/lib/python3.7/argparse.py #, python-format msgid "not allowed with argument %s" -msgstr "" +msgstr "non consentito con argomento %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "one of the arguments %s is required" -msgstr "" +msgstr "uno degli argomenti %s è richiesto" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "only accepts strings, lists, and tuples" -msgstr "" +msgstr "accetta solo stringhe, liste e tuple" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" +msgstr "opzione %s: Se volete davvero installare tutte le app firmate, usate --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "option %s: invalid %s value: %r" -msgstr "" +msgstr "opzione %s: valore %s non valido: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" +msgstr "opzione %s: scelta non valida: %r (scegliere da %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2448,7 +2448,7 @@ msgstr "argomenti facoltativi" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" -msgstr "" +msgstr "sovrascrivendo il {path} esistente" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2458,40 +2458,40 @@ msgstr "argomenti posizionali" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" -msgstr "" +msgstr "processo log deploy {path} a {dest} fallito!" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "" +msgstr "rifiuta il download tramite connessione HTTP insicura (usa HTTPS o specifica --no-https-check): {apkfilename}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" -msgstr "" +msgstr "rifiuta il download tramite connessione http insicura (usa https o specifica --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "" +msgstr "repo_icon \"repo/icons/%s\" non esiste, genera un segnaposto." #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." -msgstr "" +msgstr "repo_icon %s non esiste, genera un segnaposto." #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" +msgstr "ruamel.yaml non installato, non può scrivere metadati." #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" -msgstr "" +msgstr "s3cmd sincronizza gli indici {path} con {url} e cancella" #: ../fdroidserver/scanner.py msgid "shared library" -msgstr "" +msgstr "biblioteca condivisa" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2506,33 +2506,33 @@ msgstr "mostra questo messaggio di aiuto ed esci" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." -msgstr "" +msgstr "APK firmato, un percorso di file o un URL HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "" +msgstr "saltare la distribuzione dei log di compilazione completi: il contenuto del log è vuoto" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" -msgstr "" +msgstr "saltare la distribuzione dei log di compilazione completi: non abilitato nella configurazione" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" -msgstr "" +msgstr "saltare il tarball di origine: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" -msgstr "" +msgstr "srclibs manca il nome e/o @" #: ../fdroidserver/scanner.py msgid "static library" -msgstr "" +msgstr "biblioteca statica" #: ../fdroidserver/common.py #, python-brace-format msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" -msgstr "" +msgstr "il valore di timestamp fornito '{timestamp}' non è un timestamp unix" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2550,7 +2550,7 @@ msgstr "stringa di opzioni inaspettata: %s" #: /usr/lib/python3.7/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "" +msgstr "parser sconosciuto %(parser_name)r (scelte: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2579,28 +2579,28 @@ msgstr "utilizzando Apache libcloud per sincronizzare con {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "" +msgstr "virustotal.com sta limitando il tasso, in attesa di riprovare..." #: ../fdroidserver/update.py msgid "wiki support is deprecated and will be removed in the next release!" -msgstr "" +msgstr "Il supporto wiki è deprecato e sarà rimosso nella prossima release!" #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{0} app, {1} alias chiave" +msgstr[1] "{0} applicazioni, {1} alias chiave" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" -msgstr "" +msgstr "{apkfilename} ({appid}) non ha metadati!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" +msgstr "{apkfilename} ha più file {name}, sembra un exploit di Master Key!" #: ../fdroidserver/update.py #, python-brace-format @@ -2610,130 +2610,130 @@ msgstr "L'AndroidManifest.xml di {apkfilename} ha una data non corretta: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." -msgstr "" +msgstr "{appid} non ha un nome! Usa invece l'ID dell'applicazione." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using package name instead." -msgstr "" +msgstr "{appid} non ha un nome! Usa invece il nome del pacchetto." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android Package Name!" -msgstr "" +msgstr "{appid} da {path} non è un nome di pacchetto Android valido!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" -msgstr "" +msgstr "{appid} da {path} non è un ID di applicazione Android valido!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" -msgstr "" +msgstr "{appid} da {path} non è un nome di pacchetto Java valido!" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" -msgstr "" +msgstr "{appid} manca {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" -msgstr "" +msgstr "{appid}: extlib sconosciuto {path} nella build '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" -msgstr "" +msgstr "{appid}: nessuna build specificata, in esecuzione sullo stato sorgente corrente" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "" +msgstr "{appid}:{field} deve essere un '{type}', ma è un '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" -msgstr "" +msgstr "{appid}: {field} deve essere un '{type}', ma è un '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" -msgstr "" +msgstr "{build_flag} deve essere un intero, trovato: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{field} not terminated in {name}" -msgstr "" +msgstr "{field} non terminato in {name}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" -msgstr "" +msgstr "{file} è vuoto o corrotto!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{path}\" does not exist! Correct it in config.yml." -msgstr "" +msgstr "{name} \"{path}\" non esiste! Correggilo in config.yml." #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "" +msgstr "{name} \"{section}/icons/{path}\" non esiste! Controlla \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "{oldfile} è deprecato, usa {newfile}" #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" -msgstr "" +msgstr "{path} esiste già, ignorando i risultati dell'importazione!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" -msgstr "" +msgstr "{path} non esiste! Crealo eseguendo:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "" +msgstr "{path} ha una cattiva firma di file \"{pattern}\", possibile exploit di Janus!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" -msgstr "" +msgstr "{path} è di dimensioni zero!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" -msgstr "" +msgstr "{path} più di 200MB, caricare manualmente: {url}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" -msgstr "" +msgstr "{url} non finisce con \"fdroid\", controlla il percorso dell'URL!" #: ../fdroidserver/common.py #, python-brace-format msgid "{url} does not start with \"http\"!" -msgstr "" +msgstr "{url} non inizia con \"http\"!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{} costruzione fallita" +msgstr[1] "{} le costruzioni sono fallite" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{} costruzione riuscita" +msgstr[1] "{} costruisce con successo" #~ msgid "Cannot find a packageName for {path}!" #~ msgstr "Impossibile trovare un packageName per {path}!" From 15234c77d27a99baeba8a887a6fb108b5f2c9c13 Mon Sep 17 00:00:00 2001 From: Tymofij Lytvynenko Date: Mon, 28 Jun 2021 20:53:08 +0200 Subject: [PATCH 0373/2116] Translated using Weblate: Ukrainian (uk) by Tymofij Lytvynenko Currently translated at 100.0% (576 of 576 strings) Translated using Weblate: Ukrainian (uk) by Tymofij Lytvynenko Currently translated at 100.0% (576 of 576 strings) Co-authored-by: Tymofij Lytvynenko Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 4c0e8d0f..2d623c7f 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -3,20 +3,21 @@ # Hans-Christoph Steiner , 2020. # ihor_ck , 2020. # Ihor Hordiichuk , 2020, 2021. +# Tymofij Lytvynenko , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-31 22:07+0000\n" -"Last-Translator: Ihor Hordiichuk \n" +"PO-Revision-Date: 2021-03-16 00:37+0000\n" +"Last-Translator: Tymofij Lytvynenko \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: ../fdroidserver/common.py msgid "" @@ -1361,7 +1362,7 @@ msgstr "Вивід JSON" #: ../fdroidserver/import.py msgid "Overall license of the project." -msgstr "Загальна ліцензія проекту." +msgstr "Загальна ліцензія проєкту." #: ../fdroidserver/index.py #, python-brace-format @@ -1399,7 +1400,7 @@ msgstr "Шлях до git-репозиторію, який використов #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" -msgstr "Шлях до сховища ключа для підписного ключа сховища" +msgstr "Шлях до сховища ключа для підписного ключа репозиторія" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" @@ -1439,7 +1440,7 @@ msgstr "Створити зручний для сприйняття index.xml" #: ../fdroidserver/import.py msgid "Project URL to import from." -msgstr "URL-адреса проекту для імпорту." +msgstr "URL-адреса проєкту для імпорту." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" From 4df75655f8e530e12c525e656939a59d08a18a5f Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Mon, 28 Jun 2021 20:53:16 +0200 Subject: [PATCH 0374/2116] Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk Currently translated at 100.0% (576 of 576 strings) Co-authored-by: Ihor Hordiichuk Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 2d623c7f..22156154 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -9,8 +9,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-03-16 00:37+0000\n" -"Last-Translator: Tymofij Lytvynenko \n" +"PO-Revision-Date: 2021-03-16 03:14+0000\n" +"Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" @@ -1400,7 +1400,7 @@ msgstr "Шлях до git-репозиторію, який використов #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" -msgstr "Шлях до сховища ключа для підписного ключа репозиторія" +msgstr "Шлях до сховища ключів для підписного ключа репозиторія" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" From f60f73f4a0ed2066a25557ac51b18f7e7f5b754f Mon Sep 17 00:00:00 2001 From: DankXylese Date: Mon, 28 Jun 2021 20:53:28 +0200 Subject: [PATCH 0375/2116] Translated using Weblate: Ukrainian (uk) by DankXylese Currently translated at 100.0% (576 of 576 strings) Co-authored-by: DankXylese Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 22156154..d1a164af 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -4,20 +4,21 @@ # ihor_ck , 2020. # Ihor Hordiichuk , 2020, 2021. # Tymofij Lytvynenko , 2021. +# DankXylese , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-03-16 03:14+0000\n" -"Last-Translator: Ihor Hordiichuk \n" +"PO-Revision-Date: 2021-06-28 18:52+0000\n" +"Last-Translator: DankXylese \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.5.2-dev\n" +"X-Generator: Weblate 4.7.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -2172,7 +2173,7 @@ msgstr "команди з модулів плагіна:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "complex" -msgstr "complex" +msgstr "складний" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From a71409815e47bbd1cc138dfe6c25e3cad1648cda Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 8 Apr 2021 12:41:48 +0200 Subject: [PATCH 0376/2116] bash-completion: complete *.apk files for `fdroid signatures` --- completion/bash-completion | 2 ++ 1 file changed, 2 insertions(+) diff --git a/completion/bash-completion b/completion/bash-completion index 17db9257..dd32b30f 100644 --- a/completion/bash-completion +++ b/completion/bash-completion @@ -282,6 +282,8 @@ __complete_signatures() { __complete_options return 0;; esac + _filedir 'apk' + return 0 } __complete_signindex() { From 5267699d81468f4ffbfef109a6218871dc59a158 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 2 Apr 2021 14:36:42 +0200 Subject: [PATCH 0377/2116] index: make download_repo_index() handle common URL mistakes --- fdroidserver/index.py | 7 ++++++- tests/index.TestCase | 12 ++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index e14c4185..01930409 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -1072,7 +1072,12 @@ def download_repo_index(url_str, etag=None, verify_fingerprint=True, timeout=600 raise VerificationException(_("No fingerprint in URL.")) fingerprint = query['fingerprint'][0] - url = urllib.parse.SplitResult(url.scheme, url.netloc, url.path + '/index-v1.jar', '', '') + if url.path.endswith('/index-v1.jar'): + path = url.path[:-13].rstrip('/') + else: + path = url.path.rstrip('/') + + url = urllib.parse.SplitResult(url.scheme, url.netloc, path + '/index-v1.jar', '', '') download, new_etag = net.http_get(url.geturl(), etag, timeout) if download is None: diff --git a/tests/index.TestCase b/tests/index.TestCase index e012f15e..e9220a23 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -23,6 +23,7 @@ if localmodule not in sys.path: import fdroidserver.common import fdroidserver.index +import fdroidserver.net import fdroidserver.signindex import fdroidserver.publish from testcommon import TmpCwd @@ -148,6 +149,17 @@ class IndexTest(unittest.TestCase): self.assertEqual(10, len(index['packages'])) self.assertEqual('new_etag', new_etag) + @patch('fdroidserver.net.http_get') + def test_download_repo_index_url_parsing(self, mock_http_get): + mock_http_get.side_effect = lambda url, etag, timeout: (None, url) + repo_url = 'https://example.org/fdroid/repo' + index_url = 'https://example.org/fdroid/repo/index-v1.jar' + fingerprint_url = 'https://example.org/fdroid/repo?fingerprint=' + GP_FINGERPRINT + slash_url = 'https://example.org/fdroid/repo//?fingerprint=' + GP_FINGERPRINT + for url in (repo_url, index_url, fingerprint_url, slash_url): + _ignored, returned_url = fdroidserver.index.download_repo_index(url, verify_fingerprint=False) + self.assertEqual(index_url, returned_url) + def test_v1_sort_packages(self): i = [{'packageName': 'org.smssecure.smssecure', From 40c77892a26d7aec3c2877908965d8774c4dac1f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 8 Apr 2021 12:44:45 +0200 Subject: [PATCH 0378/2116] do not crash when config.yml is 0 bytes or empty of data --- fdroidserver/common.py | 2 ++ tests/common.TestCase | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 41a76605..15635923 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -362,6 +362,8 @@ def read_config(opts=None): logging.debug(_("Reading '{config_file}'").format(config_file=config_file)) with open(config_file, encoding='utf-8') as fp: config = yaml.safe_load(fp) + if not config: + config = {} elif os.path.exists(old_config_file): logging.warning(_("""{oldfile} is deprecated, use {newfile}""") .format(oldfile=old_config_file, newfile=config_file)) diff --git a/tests/common.TestCase b/tests/common.TestCase index ebaad78c..83f9e3af 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1675,6 +1675,17 @@ class CommonTest(unittest.TestCase): self.assertIsNone(config.get('stats_server')) self.assertIsNotNone(config.get('char_limits')) + def test_with_zero_size_config(self): + """It should set defaults if config file has nothing in it""" + testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) + os.chdir(testdir) + open('config.yml', 'w').close() + self.assertTrue(os.path.exists('config.yml')) + self.assertFalse(os.path.exists('config.py')) + config = fdroidserver.common.read_config(fdroidserver.common.options) + self.assertIsNone(config.get('stats_server')) + self.assertIsNotNone(config.get('char_limits')) + def test_with_config_yml(self): """Make sure it is possible to use config.yml alone.""" testdir = tempfile.mkdtemp( From 7ed75abc2faa8b0450a1f86bcdb1aba3a3d04108 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 8 Apr 2021 16:06:32 +0200 Subject: [PATCH 0379/2116] gitlab-ci: use CVC for `fdroid build` job for more reliably runs --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c7721931..eae0a7df 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -340,7 +340,8 @@ fdroid build: - fdroid build --verbose --latest org.fdroid.fdroid.privileged # each `fdroid build --on-server` run expects sudo, then uninstalls it - apt-get install sudo - - fdroid build --verbose --on-server --no-tarball --latest org.fdroid.fdroid + - currentVersionCode=`python3 -c "import yaml; print(yaml.load(open('metadata/org.fdroid.fdroid.yml'))['CurrentVersionCode'])"` + - fdroid build --verbose --on-server --no-tarball org.fdroid.fdroid:$currentVersionCode # test the plugin API and specifically the fetchsrclibs plugin, which From 74cb0e3d599a85ec68b62945db81b6b9a9885435 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 1 Jul 2021 10:49:24 +0200 Subject: [PATCH 0380/2116] update CHANGELOG --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b237cc6a..ea43abe1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,19 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## [Unreleased] +## [2.0.3] - 2021-07-01 + +### Fixed + +* Support AutoUpdateMode: Version without pattern + [931](https://gitlab.com/fdroid/fdroidserver/-/merge_requests/931) + +## [2.0.2] - 2021-06-01 + +### Fixed + +* fix "ruamel round_trip_dump will be removed" + ## [2.0.1] - 2021-03-09 ### Fixed From fa4fdd07733a0454bc9b2bf1fdbe294ee15fdc22 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 1 Jul 2021 12:24:54 +0200 Subject: [PATCH 0381/2116] version 2.1a0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index aabfdc82..dfb7ba7d 100755 --- a/setup.py +++ b/setup.py @@ -53,7 +53,7 @@ with open("README.md", "r") as fh: long_description = fh.read() setup(name='fdroidserver', - version='2.1a0.dev0', + version='2.1a0', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From 051905620da5aa0212b98d1429d99c076be268b3 Mon Sep 17 00:00:00 2001 From: "Felix C. Stegerman" Date: Fri, 2 Jul 2021 14:34:34 +0000 Subject: [PATCH 0382/2116] fix copy_triple_t_store_metadata() w/ multiple apps in same repo --- fdroidserver/update.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 52b89116..4601eb81 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1059,12 +1059,12 @@ def copy_triple_t_store_metadata(apps): if flavor not in ('yes', 'no'): p = os.path.join('build', packageName, gradle_path, 'src', flavor, 'play') gradle_subdirs.add(p) - if not gradle_subdirs: - gradle_subdirs.update(glob.glob(os.path.join('build', packageName, '*', 'src', '*', 'play'))) if not gradle_subdirs and len(app.get('Builds', [])) and app.get('Builds', [])[-1].subdir: gradle_subdirs.update(glob.glob(os.path.join('build', packageName, app.get('Builds', [])[-1].subdir, 'src', '*', 'play'))) + if not gradle_subdirs: + gradle_subdirs.update(glob.glob(os.path.join('build', packageName, '*', 'src', '*', 'play'))) - for d in gradle_subdirs: + for d in sorted(gradle_subdirs): logging.debug('Triple-T Gradle Play Publisher: ' + d) for root, dirs, files in os.walk(d): segments = root.split('/') From 73f28a611c28823f2374689af70adf91fed7937c Mon Sep 17 00:00:00 2001 From: "Felix C. Stegerman" Date: Sat, 3 Jul 2021 21:20:18 +0200 Subject: [PATCH 0383/2116] add test_insert_triple_t_multiple_metadata() --- MANIFEST.in | 6 +++ tests/triple-t-multiple/.gitignore | 1 + .../src/main/play/listings/en-US/title.txt | 1 + .../src/main/play/listings/en-US/title.txt | 1 + .../src/main/play/listings/en-US/title.txt | 1 + .../src/main/play/listings/en-US/title.txt | 1 + ...ch.admin.bag.covidcertificate.verifier.yml | 50 +++++++++++++++++++ .../ch.admin.bag.covidcertificate.wallet.yml | 50 +++++++++++++++++++ tests/update.TestCase | 26 ++++++++++ 9 files changed, 137 insertions(+) create mode 100644 tests/triple-t-multiple/.gitignore create mode 100644 tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src/main/play/listings/en-US/title.txt create mode 100644 tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/main/play/listings/en-US/title.txt create mode 100644 tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verifier/src/main/play/listings/en-US/title.txt create mode 100644 tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/main/play/listings/en-US/title.txt create mode 100644 tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.verifier.yml create mode 100644 tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.wallet.yml diff --git a/MANIFEST.in b/MANIFEST.in index c65e8481..c60c5114 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -820,6 +820,12 @@ include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/release-note include tests/triple-t-2/build/org.piwigo.android/build.gradle include tests/triple-t-2/build/org.piwigo.android/settings.gradle include tests/triple-t-2/metadata/org.piwigo.android.yml +include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src/main/play/listings/en-US/title.txt +include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/main/play/listings/en-US/title.txt +include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verifier/src/main/play/listings/en-US/title.txt +include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/main/play/listings/en-US/title.txt +include tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.verifier.yml +include tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.wallet.yml include tests/update.TestCase include tests/urzip.apk include tests/urzip-badcert.apk diff --git a/tests/triple-t-multiple/.gitignore b/tests/triple-t-multiple/.gitignore new file mode 100644 index 00000000..0aba28e9 --- /dev/null +++ b/tests/triple-t-multiple/.gitignore @@ -0,0 +1 @@ +!build/ diff --git a/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src/main/play/listings/en-US/title.txt b/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src/main/play/listings/en-US/title.txt new file mode 100644 index 00000000..03feeb11 --- /dev/null +++ b/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src/main/play/listings/en-US/title.txt @@ -0,0 +1 @@ +COVID Certificate Check \ No newline at end of file diff --git a/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/main/play/listings/en-US/title.txt b/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/main/play/listings/en-US/title.txt new file mode 100644 index 00000000..34827e66 --- /dev/null +++ b/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/main/play/listings/en-US/title.txt @@ -0,0 +1 @@ +COVID Certificate \ No newline at end of file diff --git a/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verifier/src/main/play/listings/en-US/title.txt b/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verifier/src/main/play/listings/en-US/title.txt new file mode 100644 index 00000000..03feeb11 --- /dev/null +++ b/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verifier/src/main/play/listings/en-US/title.txt @@ -0,0 +1 @@ +COVID Certificate Check \ No newline at end of file diff --git a/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/main/play/listings/en-US/title.txt b/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/main/play/listings/en-US/title.txt new file mode 100644 index 00000000..34827e66 --- /dev/null +++ b/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/main/play/listings/en-US/title.txt @@ -0,0 +1 @@ +COVID Certificate \ No newline at end of file diff --git a/tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.verifier.yml b/tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.verifier.yml new file mode 100644 index 00000000..f8999482 --- /dev/null +++ b/tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.verifier.yml @@ -0,0 +1,50 @@ +AntiFeatures: + - Tracking +Categories: + - Sports & Health +License: MPL-2.0 +AuthorName: Swiss Admin +AuthorWebSite: https://www.bit.admin.ch +SourceCode: https://github.com/admin-ch/CovidCertificate-App-Android +IssueTracker: https://github.com/admin-ch/CovidCertificate-App-Android/issues +Changelog: https://github.com/admin-ch/CovidCertificate-App-Android/releases + +AutoName: Covid Cert + +RepoType: git +Repo: https://github.com/admin-ch/CovidCertificate-App-Android +Binaries: https://github.com/admin-ch/CovidCertificate-App-Android/releases/download/v%v-%c-verifier/verifier-prod-%v-%c-signed.apk + +Builds: + - versionName: 1.2.0 + versionCode: 1200 + commit: v1.2.0-1200-verifier + subdir: verifier + submodules: true + gradle: + - prod + rm: + - sdk/sdk/testKeystore + - wallet/testKeystore + - verifier/testKeystore + prebuild: printf '\nbuildTimestamp=%s\n' "$(curl -sL https://github.com/admin-ch/CovidCertificate-App-Android/releases/download/v$$VERSION$$-$$VERCODE$$-verifier/verifier-prod-$$VERSION$$-$$VERCODE$$-buildtimestamp.txt + | tr -cd '0-9')" >> gradle.properties + + - versionName: 2.0.0 + versionCode: 2000 + commit: 5a871eabf1fce16b84e4c7b97c94fd3f2a37e910 + subdir: verifier + submodules: true + gradle: + - prod + rm: + - sdk/sdk/testKeystore + - wallet/testKeystore + - verifier/testKeystore + prebuild: printf '\nbuildTimestamp=%s\n' "$(curl -sL https://github.com/admin-ch/CovidCertificate-App-Android/releases/download/v$$VERSION$$-$$VERCODE$$-verifier/verifier-prod-$$VERSION$$-$$VERCODE$$-buildtimestamp.txt + | tr -cd '0-9')" >> gradle.properties + +AutoUpdateMode: Version +UpdateCheckMode: Tags ^v[\d.]+-\d+-verifier$ +CurrentVersion: 2.0.0 +CurrentVersionCode: 2000 diff --git a/tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.wallet.yml b/tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.wallet.yml new file mode 100644 index 00000000..3ea35008 --- /dev/null +++ b/tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.wallet.yml @@ -0,0 +1,50 @@ +AntiFeatures: + - Tracking +Categories: + - Sports & Health +License: MPL-2.0 +AuthorName: Swiss Admin +AuthorWebSite: https://www.bit.admin.ch +SourceCode: https://github.com/admin-ch/CovidCertificate-App-Android +IssueTracker: https://github.com/admin-ch/CovidCertificate-App-Android/issues +Changelog: https://github.com/admin-ch/CovidCertificate-App-Android/releases + +AutoName: Covid Cert + +RepoType: git +Repo: https://github.com/admin-ch/CovidCertificate-App-Android +Binaries: https://github.com/admin-ch/CovidCertificate-App-Android/releases/download/v%v-%c-wallet/wallet-prod-%v-%c-signed.apk + +Builds: + - versionName: 1.2.0 + versionCode: 1200 + commit: v1.2.0-1200-wallet + subdir: wallet + submodules: true + gradle: + - prod + rm: + - sdk/sdk/testKeystore + - wallet/testKeystore + - verifier/testKeystore + prebuild: printf '\nbuildTimestamp=%s\n' "$(curl -sL https://github.com/admin-ch/CovidCertificate-App-Android/releases/download/v$$VERSION$$-$$VERCODE$$-wallet/wallet-prod-$$VERSION$$-$$VERCODE$$-buildtimestamp.txt + | tr -cd '0-9')" >> gradle.properties + + - versionName: 2.0.0 + versionCode: 2000 + commit: 5a871eabf1fce16b84e4c7b97c94fd3f2a37e910 + subdir: wallet + submodules: true + gradle: + - prod + rm: + - sdk/sdk/testKeystore + - wallet/testKeystore + - verifier/testKeystore + prebuild: printf '\nbuildTimestamp=%s\n' "$(curl -sL https://github.com/admin-ch/CovidCertificate-App-Android/releases/download/v$$VERSION$$-$$VERCODE$$-wallet/wallet-prod-$$VERSION$$-$$VERCODE$$-buildtimestamp.txt + | tr -cd '0-9')" >> gradle.properties + +AutoUpdateMode: Version +UpdateCheckMode: Tags ^v[\d.]+-\d+-wallet$ +CurrentVersion: 2.0.0 +CurrentVersionCode: 2000 diff --git a/tests/update.TestCase b/tests/update.TestCase index 04bf42ca..ea3b081f 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -409,6 +409,32 @@ class UpdateTest(unittest.TestCase): self.assertFalse(os.path.exists(os.path.join('de-DE', 'phoneScreenshots', '01_Login.jpg'))) self.assertFalse(os.path.exists(os.path.join('de-DE', 'sevenInchScreenshots', '01_Login.png'))) + def test_insert_triple_t_multiple_metadata(self): + namespace = 'ch.admin.bag.covidcertificate.' + packages = ('verifier', 'wallet') + names = dict(verifier='COVID Certificate Check', wallet='COVID Certificate') + + tmptestsdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.rmdir(tmptestsdir) + shutil.copytree(os.path.join(self.basedir, 'triple-t-multiple'), tmptestsdir) + os.chdir(tmptestsdir) + + for p in packages: + packageName = namespace + p + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.common.config = config + fdroidserver.update.config = config + fdroidserver.update.options = fdroidserver.common.options + + apps = fdroidserver.metadata.read_metadata() + self.assertTrue(packageName in apps) + fdroidserver.update.copy_triple_t_store_metadata(apps) + app = apps[packageName] + self.assertEqual(app['localized']['en-US']['name'], names[p]) + def javagetsig(self, apkfile): getsig_dir = 'getsig' if not os.path.exists(os.path.join(getsig_dir, "getsig.class")): From f8f03420ba50f21dac4d89d51f4c5c49788b8df9 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Mon, 5 Jul 2021 17:04:16 +0000 Subject: [PATCH 0384/2116] gradle v7.1.1 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index fc5dc1ad..903be9d8 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -167,6 +167,7 @@ get_sha() { '7.0.1') echo 'dccda8aa069563c8ba2f6cdfd0777df0e34a5b4d15138ca8b9757e94f4e8a8cb' ;; '7.0.2') echo '0e46229820205440b48a5501122002842b82886e76af35f0f3a069243dca4b3c' ;; '7.1') echo '2debee19271e1b82c6e41137d78e44e6e841035230a1a169ca47fd3fb09ed87b' ;; + '7.1.1') echo 'bf8b869948901d422e9bb7d1fa61da6a6e19411baa7ad6ee929073df85d6365d' ;; *) exit 1 esac } @@ -187,7 +188,7 @@ d_plugin_k=(4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 d_plugin_v=(6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(7.1 7.0.2 7.0.1 7.0 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(7.1.1 7.1 7.0.2 7.0.1 7.0 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From d04c3f65c2b6434b5d0a2bb4b1816d30730a0740 Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Tue, 9 Mar 2021 21:45:18 +0100 Subject: [PATCH 0385/2116] New com.jens.automation2 test case --- tests/scanner.TestCase | 2 + .../com.jens.automation2/app/build.gradle | 78 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 tests/source-files/com.jens.automation2/app/build.gradle diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 3fd52694..03609cf2 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -48,6 +48,7 @@ class ScannerTest(unittest.TestCase): 'org.mozilla.rocket': 3, 'realm': 1, 'se.manyver': 2, + 'com.jens.automation2': 2, } for d in glob.glob(os.path.join(source_files, '*')): build = fdroidserver.metadata.Build() @@ -69,6 +70,7 @@ class ScannerTest(unittest.TestCase): ('source-files/osmandapp/osmand/build.gradle', 'free', 5), ('source-files/eu.siacs.conversations/build.gradle', 'free', 23), ('source-files/org.mozilla.rocket/app/build.gradle', 'focus', 42), + ('source-files/com.jens.automation2/app/build.gradle', 'fdroidFlavor', 8), ] for f, flavor, count in test_files: diff --git a/tests/source-files/com.jens.automation2/app/build.gradle b/tests/source-files/com.jens.automation2/app/build.gradle new file mode 100644 index 00000000..c2ffeda9 --- /dev/null +++ b/tests/source-files/com.jens.automation2/app/build.gradle @@ -0,0 +1,78 @@ +plugins { + id 'com.android.application' +} + +android { + compileSdkVersion 29 + + defaultConfig { + applicationId "com.jens.automation2" + minSdkVersion 16 + compileSdkVersion 29 + buildToolsVersion '29.0.2' + useLibrary 'org.apache.http.legacy' + versionCode 96 + versionName "1.6.21" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + lintOptions { + checkReleaseBuilds false + abortOnError false + } + + flavorDimensions "version" + + productFlavors + { + googlePlayFlavor + { + dimension "version" +// applicationIdSuffix ".googlePlay" + versionNameSuffix "-googlePlay" + targetSdkVersion 29 + } + + fdroidFlavor + { + dimension "version" +// applicationIdSuffix ".fdroid" + versionNameSuffix "-fdroid" + targetSdkVersion 28 + } + + apkFlavor + { + dimension "version" +// applicationIdSuffix ".apk" + versionNameSuffix "-apk" + targetSdkVersion 28 + } + } +} + +dependencies { + googlePlayFlavorImplementation 'com.google.firebase:firebase-appindexing:19.2.0' + googlePlayFlavorImplementation 'com.google.android.gms:play-services-location:17.1.0' + + apkFlavorImplementation 'com.google.firebase:firebase-appindexing:19.2.0' + apkFlavorImplementation 'com.google.android.gms:play-services-location:17.1.0' + + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'com.google.android.material:material:1.3.0' + testImplementation 'junit:junit:4.+' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' +} \ No newline at end of file From c227fedb979ca5a94804d54339ce4d8864f03a17 Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Wed, 10 Mar 2021 21:21:19 +0100 Subject: [PATCH 0386/2116] Add new test case to manifest --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index c60c5114..ec4b7992 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -730,6 +730,7 @@ include tests/source-files/com.integreight.onesheeld/quickReturnHeader/build.gra include tests/source-files/com.integreight.onesheeld/quickReturnHeader/src/main/AndroidManifest.xml include tests/source-files/com.integreight.onesheeld/settings.gradle include tests/source-files/com.jens.automation2/build.gradle +include tests/source-files/com.jens.automation2/app/build.gradle include tests/source-files/com.kunzisoft.testcase/build.gradle include tests/source-files/com.nextcloud.client/build.gradle include tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android/en-US/full_description.txt From 576ca7ad1333b2604ce5041914865db7b7a8977b Mon Sep 17 00:00:00 2001 From: linsui Date: Thu, 22 Jul 2021 19:26:32 +0800 Subject: [PATCH 0387/2116] Add build-tools;31.0.0 and platforms;android-31 --- makebuildserver | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/makebuildserver b/makebuildserver index 7895196b..daafd4d4 100755 --- a/makebuildserver +++ b/makebuildserver @@ -228,6 +228,8 @@ CACHE_FILES = [ '951da8bf175254da74626824f919bd28def64f8828f29dd3b124a535cf4049d8'), ('https://dl.google.com/android/repository/platform-30_r03.zip', 'f3f5b75744dbf6ee6ed3e8174a71e513bfee502d0bc3463ea97e517bff68d84e'), + ('https://dl.google.com/android/repository/platform-31_r01.zip', + '1d69fe1d7f9788d82ff3a374faf4f6ccc9d1d372aa84a86b5bcfb517523b0b3f'), ('https://dl.google.com/android/repository/build-tools_r19.1-linux.zip', '3833b409f78c002a83244e220be380ea6fa44d604e0d47de4b7e5daefe7cd3f4'), ('https://dl.google.com/android/repository/build-tools_r20-linux.zip', @@ -294,6 +296,8 @@ CACHE_FILES = [ '565af786dc0cc1941002174fb945122eabd080b222cd4c7c3d9a2ae0fabf5dc4'), ('https://dl.google.com/android/repository/build-tools_r30.0.3-linux.zip', '24593500aa95d2f99fb4f10658aae7e65cb519be6cd33fa164f15f27f3c4a2d6'), + ('https://dl.google.com/android/repository/build-tools_r31-linux.zip', + 'f90c22f5562638a2e00762e1711eebd55e7f0a05232b65200d387307d057bfe8'), ('https://services.gradle.org/distributions/gradle-6.8.3-bin.zip', '7faa7198769f872826c8ef4f1450f839ec27f0b4d5d1e51bade63667cbccd205'), ('https://services.gradle.org/distributions/gradle-7.0.2-bin.zip', From 331b4830dd543c4cb5f555bc9839aaed2c5a938a Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sat, 24 Jul 2021 20:28:50 +0200 Subject: [PATCH 0388/2116] Support multiple flavours in parse_androidmanifests Previously only the last flavour was checked. --- MANIFEST.in | 1 + fdroidserver/common.py | 10 +- tests/common.TestCase | 13 ++ .../de.varengold.activeTAN/build.gradle | 115 ++++++++++++++++++ 4 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 tests/source-files/de.varengold.activeTAN/build.gradle diff --git a/MANIFEST.in b/MANIFEST.in index ec4b7992..62db4b98 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -746,6 +746,7 @@ include tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata include tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/en-US/short_description.txt include tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/en-US/title.txt include tests/source-files/com.seafile.seadroid2/app/build.gradle +include tests/source-files/de.varengold.activeTAN/build.gradle include tests/source-files/dev.patrickgold.florisboard/app/build.gradle.kts include tests/source-files/eu.siacs.conversations/build.gradle include tests/source-files/eu.siacs.conversations/metadata/en-US/name.txt diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 15635923..55f02955 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1691,11 +1691,11 @@ def parse_androidmanifests(paths, app): vercode = None package = None - flavour = None + flavours = None temp_app_id = None temp_version_name = None if len(app.get('Builds', [])) > 0 and 'gradle' in app['Builds'][-1] and app['Builds'][-1].gradle: - flavour = app['Builds'][-1].gradle[-1] + flavours = app['Builds'][-1].gradle if path.endswith('.gradle') or path.endswith('.gradle.kts'): with open(path, 'r', encoding='utf-8') as f: @@ -1753,12 +1753,14 @@ def parse_androidmanifests(paths, app): inside_required_flavour -= 1 if inside_required_flavour == 1: inside_required_flavour -= 1 - else: - if flavour: + elif flavours: + for flavour in flavours: if re.match(r'.*[\'"\s]{flavour}[\'"\s].*\{{.*'.format(flavour=flavour), line): inside_required_flavour = 2 + break elif re.match(r'.*[\'"\s]{flavour}[\'"\s].*'.format(flavour=flavour), line): inside_required_flavour = 1 + break if '{' in line: inside_flavour_group += 1 diff --git a/tests/common.TestCase b/tests/common.TestCase index 83f9e3af..88ba20cc 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1264,6 +1264,19 @@ class CommonTest(unittest.TestCase): self.assertEqual(('1.6.34-fdroid', '105', 'com.jens.automation2'), fdroidserver.common.parse_androidmanifests(paths, app)) + app = fdroidserver.metadata.App() + build = fdroidserver.metadata.Build() + build.gradle = ['VAR', 'prod'] + app['Builds'] = [build] + app.id = 'de.varengold.activeTAN' + paths = [ + os.path.join('source-files', 'de.varengold.activeTAN', 'build.gradle'), + ] + for path in paths: + self.assertTrue(os.path.isfile(path)) + self.assertEqual(('2021-06-30', '34', 'de.varengold.activeTAN'), + fdroidserver.common.parse_androidmanifests(paths, app)) + def test_get_all_gradle_and_manifests(self): """Test whether the function works with relative and absolute paths""" a = fdroidserver.common.get_all_gradle_and_manifests(Path('source-files/cn.wildfirechat.chat')) diff --git a/tests/source-files/de.varengold.activeTAN/build.gradle b/tests/source-files/de.varengold.activeTAN/build.gradle new file mode 100644 index 00000000..e950be92 --- /dev/null +++ b/tests/source-files/de.varengold.activeTAN/build.gradle @@ -0,0 +1,115 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion versions.compileSdk + defaultConfig { + versionCode 34 + versionName "2021-06-30" + + // Requires API level 23 (Android 6.0) to use Android keystore system for cryptography. + minSdkVersion 23 + targetSdkVersion versions.targetSdk + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + + vectorDrawables.useSupportLibrary = true + + javaCompileOptions { + annotationProcessorOptions { + // Export database schema history as JSON files. + arguments = ["room.schemaLocation": "$projectDir/schemas".toString()] + } + } + sourceSets { + // Include database schema history for migration testing. + androidTest.assets.srcDirs += files("$projectDir/schemas".toString()) + } + } + + buildFeatures { + viewBinding = true + } + + buildTypes { + debug { + // Don't mess with the release versions during debugging, so use a different appId. + applicationIdSuffix ".debug" + debuggable true + } + release { + minifyEnabled true + shrinkResources true + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + flavorDimensions "client", "environment" + productFlavors { + prod { + dimension "environment" + } + + qs { + dimension "environment" + // To be able to install a second app variant, we must change the applicationId. + // Otherwise it would not be possible to use the same device for testing and production. + applicationIdSuffix ".QS" + } + + EFD { + // Demo portal efdis-online.de (extern) / dailybuild.efdis-online.de (intern) + dimension "client" + applicationId "de.efdis.activeTAN" + } + + VAR { + dimension "client" + applicationId "de.varengold.activeTAN" + } + + } + compileOptions { + // ZXing uses Java 8 language features from the core library + coreLibraryDesugaringEnabled true + + targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_1_8 + } + +} + +tasks.withType(JavaCompile) { + options.deprecation = true +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + + implementation project(':material-design-icons') + implementation project(":barcodescanner") + + implementation 'com.google.android.material:material:1.3.0' + + implementation 'androidx.appcompat:appcompat:1.3.0' + implementation 'androidx.biometric:biometric:1.1.0' + + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'androidx.recyclerview:recyclerview:1.2.1' + + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' + implementation 'com.google.zxing:core:' + versions.zxing + + def room_version = '2.3.0' + implementation "androidx.room:room-runtime:$room_version" + annotationProcessor "androidx.room:room-compiler:$room_version" + androidTestImplementation "androidx.room:room-testing:$room_version" + + testImplementation 'junit:junit:4.13.1' + + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test:runner:1.3.0' + androidTestImplementation 'androidx.test:rules:1.3.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' + androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.3.0' + androidTestImplementation 'androidx.test.espresso:espresso-intents:3.3.0' +} From a2db8f4a6234438f54977c3dde4f7348c90a353d Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 27 Jul 2021 21:06:34 +0200 Subject: [PATCH 0389/2116] [checkupdates] Exit 1 in case of errors --- fdroidserver/checkupdates.py | 31 ++++++++++++++++++++++--------- tests/checkupdates.TestCase | 3 ++- tests/run-tests | 2 +- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 483c46ef..806c6339 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -487,8 +487,7 @@ def checkupdates_app(app): msg = 'Checking disabled' noverok = True else: - version = None - msg = 'Invalid update check method' + raise MetaDataException(_('Invalid UpdateCheckMode: {mode}').format(mode=mode)) if version and vercode and app.VercodeOperation: if not common.VERCODE_OPERATION_RE.match(app.VercodeOperation): @@ -513,7 +512,7 @@ def checkupdates_app(app): else: logging.warning(logmsg) elif vercode == app.CurrentVersionCode: - logging.info("...up to date") + logging.debug("...up to date") elif int(vercode) > int(app.CurrentVersionCode): logging.debug("...updating - old vercode={0}, new vercode={1}".format( app.CurrentVersionCode, vercode)) @@ -521,9 +520,11 @@ def checkupdates_app(app): app.CurrentVersionCode = str(int(vercode)) updating = True else: - logging.info("Refusing to auto update, since the current version is newer") - logging.debug("...old vercode={0}, new vercode={1}".format( - app.CurrentVersionCode, vercode)) + raise FDroidException( + _('current version is newer: old vercode={old}, new vercode={new}').format( + old=app.CurrentVersionCode, new=vercode + ) + ) commitmsg = fetch_autoname(app, tag) @@ -536,7 +537,9 @@ def checkupdates_app(app): if options.auto: mode = app.AutoUpdateMode if not app.CurrentVersionCode: - logging.warning("Can't auto-update app with no CurrentVersionCode: " + app.id) + raise MetaDataException( + _("Can't auto-update app with no CurrentVersionCode") + ) elif mode in ('None', 'Static'): pass elif mode.startswith('Version'): @@ -557,7 +560,11 @@ def checkupdates_app(app): latest = build if int(latest.versionCode) > int(app.CurrentVersionCode): - logging.info("Refusing to auto update, since the latest build is newer") + raise FDroidException( + _( + 'latest build recipe is newer: old vercode={old}, new vercode={new}' + ).format(old=latest.versionCode, new=app.CurrentVersionCode) + ) if not gotcur: newbuild = copy.deepcopy(latest) @@ -577,7 +584,9 @@ def checkupdates_app(app): ver = _getcvname(app) commitmsg = "Update %s to %s" % (name, ver) else: - logging.warning('Invalid auto update mode "' + mode + '" on ' + app.id) + raise MetaDataException( + _('Invalid AutoUpdateMode: {mode}').format(mode=mode) + ) if commitmsg: metadata.write_metadata(app.metadatapath, app) @@ -705,6 +714,7 @@ def main(): locallog = '' processed = [] failed = dict() + exit_code = 0 for appid, app in apps.items(): if options.autoonly and app.AutoUpdateMode in ('None', 'Static'): @@ -721,12 +731,15 @@ def main(): except Exception as e: msg = _("...checkupdate failed for {appid} : {error}").format(appid=appid, error=e) logging.error(msg) + logging.debug(traceback.format_exc()) locallog += msg + '\n' failed[appid] = str(e) + exit_code = 1 update_wiki(None, locallog) status_update_json(processed, failed) logging.info(_("Finished")) + sys.exit(exit_code) if __name__ == "__main__": diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index 3610b930..06504a07 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -65,7 +65,8 @@ class CheckupdatesTest(unittest.TestCase): ): with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): with mock.patch('subprocess.call', lambda cmd: 0): - fdroidserver.checkupdates.checkupdates_app(app) + with self.assertRaises(FDroidException): + fdroidserver.checkupdates.checkupdates_app(app) build = app['Builds'][-1] self.assertEqual(build.versionName, '1.1.9') self.assertEqual(build.commit, '1.1.9') diff --git a/tests/run-tests b/tests/run-tests index 154b770e..460179ab 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -688,7 +688,7 @@ LOCAL_COPY_DIR=`create_test_dir`/fdroid mkdir -p $LOCAL_COPY_DIR/repo echo "local_copy_dir: $LOCAL_COPY_DIR" >> config.yml -$fdroid checkupdates --allow-dirty +$fdroid checkupdates --allow-dirty || true which gpg && $fdroid gpgsign $fdroid lint $fdroid readmeta From 6f7a1ecf0190728d38b201aa97a85d42842e8b48 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 27 Jul 2021 21:54:52 +0200 Subject: [PATCH 0390/2116] [checkupdates] Don't catch exceptions Basically moves all code one level up. --- fdroidserver/checkupdates.py | 477 ++++++++++++++++------------------- tests/checkupdates.TestCase | 5 +- 2 files changed, 224 insertions(+), 258 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 806c6339..8f53b097 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -48,287 +48,254 @@ def check_http(app): ignoreversions = app.UpdateCheckIgnore ignoresearch = re.compile(ignoreversions).search if ignoreversions else None - try: + if not app.UpdateCheckData: + raise FDroidException('Missing Update Check Data') - if not app.UpdateCheckData: - raise FDroidException('Missing Update Check Data') - - urlcode, codeex, urlver, verex = app.UpdateCheckData.split('|') - parsed = urllib.parse.urlparse(urlcode) + urlcode, codeex, urlver, verex = app.UpdateCheckData.split('|') + parsed = urllib.parse.urlparse(urlcode) + if not parsed.netloc or not parsed.scheme or parsed.scheme != 'https': + raise FDroidException(_('UpdateCheckData has invalid URL: {url}').format(url=urlcode)) + if urlver != '.': + parsed = urllib.parse.urlparse(urlver) if not parsed.netloc or not parsed.scheme or parsed.scheme != 'https': raise FDroidException(_('UpdateCheckData has invalid URL: {url}').format(url=urlcode)) - if urlver != '.': - parsed = urllib.parse.urlparse(urlver) - if not parsed.netloc or not parsed.scheme or parsed.scheme != 'https': - raise FDroidException(_('UpdateCheckData has invalid URL: {url}').format(url=urlcode)) - vercode = None - if urlcode: - logging.debug("...requesting {0}".format(urlcode)) - req = urllib.request.Request(urlcode, None, headers=net.HEADERS) + vercode = None + if urlcode: + logging.debug("...requesting {0}".format(urlcode)) + req = urllib.request.Request(urlcode, None, headers=net.HEADERS) + resp = urllib.request.urlopen(req, None, 20) # nosec B310 scheme is filtered above + page = resp.read().decode('utf-8') + + m = re.search(codeex, page) + if not m: + raise FDroidException("No RE match for version code") + vercode = m.group(1).strip() + + version = "??" + if urlver: + if urlver != '.': + logging.debug("...requesting {0}".format(urlver)) + req = urllib.request.Request(urlver, None) resp = urllib.request.urlopen(req, None, 20) # nosec B310 scheme is filtered above page = resp.read().decode('utf-8') - m = re.search(codeex, page) - if not m: - raise FDroidException("No RE match for version code") - vercode = m.group(1).strip() + m = re.search(verex, page) + if not m: + raise FDroidException("No RE match for version") + version = m.group(1) - version = "??" - if urlver: - if urlver != '.': - logging.debug("...requesting {0}".format(urlver)) - req = urllib.request.Request(urlver, None) - resp = urllib.request.urlopen(req, None, 20) # nosec B310 scheme is filtered above - page = resp.read().decode('utf-8') - - m = re.search(verex, page) - if not m: - raise FDroidException("No RE match for version") - version = m.group(1) - - if ignoresearch and version: - if not ignoresearch(version): - return (version, vercode) - else: - return (None, ("Version {version} is ignored").format(version=version)) - else: + if ignoresearch and version: + if not ignoresearch(version): return (version, vercode) - except FDroidException: - msg = "Could not complete http check for app {0} due to unknown error: {1}".format(app.id, traceback.format_exc()) - return (None, msg) - - -# Check for a new version by looking at the tags in the source repo. -# Whether this can be used reliably or not depends on -# the development procedures used by the project's developers. Use it with -# caution, because it's inappropriate for many projects. -# Returns (None, "a message") if this didn't work, or (version, vercode, tag) for -# the details of the current version. -def check_tags(app, pattern): - - try: - - if app.RepoType == 'srclib': - build_dir = Path('build/srclib') / app.Repo - repotype = common.getsrclibvcs(app.Repo) else: - build_dir = Path('build') / app.id - repotype = app.RepoType + return (None, ("Version {version} is ignored").format(version=version)) + else: + return (version, vercode) - if repotype not in ('git', 'git-svn', 'hg', 'bzr'): - return (None, 'Tags update mode only works for git, hg, bzr and git-svn repositories currently', None) - if repotype == 'git-svn' and ';' not in app.Repo: - return (None, 'Tags update mode used in git-svn, but the repo was not set up with tags', None) +def check_tags(app, pattern): + """Check for a new version by looking at the tags in the source repo. - # Set up vcs interface and make sure we have the latest code... - vcs = common.getvcs(app.RepoType, app.Repo, build_dir) + Whether this can be used reliably or not depends on + the development procedures used by the project's developers. Use it with + caution, because it's inappropriate for many projects. + """ + if app.RepoType == 'srclib': + build_dir = Path('build/srclib') / app.Repo + repotype = common.getsrclibvcs(app.Repo) + else: + build_dir = Path('build') / app.id + repotype = app.RepoType + if repotype not in ('git', 'git-svn', 'hg', 'bzr'): + return (None, 'Tags update mode only works for git, hg, bzr and git-svn repositories currently', None) + + if repotype == 'git-svn' and ';' not in app.Repo: + return (None, 'Tags update mode used in git-svn, but the repo was not set up with tags', None) + + # Set up vcs interface and make sure we have the latest code... + vcs = common.getvcs(app.RepoType, app.Repo, build_dir) + + vcs.gotorevision(None) + + last_build = app.get_last_build() + + try_init_submodules(app, last_build, vcs) + + htag = None + hver = None + hcode = "0" + + tags = [] + if repotype == 'git': + tags = vcs.latesttags() + else: + tags = vcs.gettags() + if not tags: + return (None, "No tags found", None) + + logging.debug("All tags: " + ','.join(tags)) + if pattern: + pat = re.compile(pattern) + tags = [tag for tag in tags if pat.match(tag)] + if not tags: + return (None, "No matching tags found", None) + logging.debug("Matching tags: " + ','.join(tags)) + + if len(tags) > 5 and repotype == 'git': + tags = tags[:5] + logging.debug("Latest tags: " + ','.join(tags)) + + for tag in tags: + logging.debug("Check tag: '{0}'".format(tag)) + vcs.gotorevision(tag) + + if app.UpdateCheckData: + filecode, codeex, filever, verex = app.UpdateCheckData.split('|') + + if filecode: + filecode = build_dir / filecode + if not filecode.is_file(): + logging.debug("UpdateCheckData file {0} not found in tag {1}".format(filecode, tag)) + continue + filecontent = filecode.read_text() + else: + filecontent = tag + + vercode = tag + if codeex: + m = re.search(codeex, filecontent) + if not m: + continue + + vercode = m.group(1).strip() + + if filever: + if filever != '.': + filever = build_dir / filever + if filever.is_file(): + filecontent = filever.read_text() + else: + logging.debug("UpdateCheckData file {0} not found in tag {1}".format(filever, tag)) + else: + filecontent = tag + + version = tag + if verex: + m = re.search(verex, filecontent) + if m: + version = m.group(1) + + logging.debug("UpdateCheckData found version {0} ({1})" + .format(version, vercode)) + i_vercode = common.version_code_string_to_int(vercode) + if i_vercode > common.version_code_string_to_int(hcode): + htag = tag + hcode = str(i_vercode) + hver = version + else: + for subdir in possible_subdirs(app): + root_dir = build_dir / subdir + paths = common.manifest_paths(root_dir, last_build.gradle) + version, vercode, _package = common.parse_androidmanifests(paths, app) + if version == 'Unknown' or version == 'Ignore': + version = tag + if vercode: + logging.debug("Manifest exists in subdir '{0}'. Found version {1} ({2})" + .format(subdir, version, vercode)) + i_vercode = common.version_code_string_to_int(vercode) + if i_vercode > common.version_code_string_to_int(hcode): + htag = tag + hcode = str(i_vercode) + hver = version + + if hver: + try: + commit = vcs.getref(htag) + if commit: + return (hver, hcode, commit) + except VCSException: + pass + return (hver, hcode, htag) + return (None, "Couldn't find any version information", None) + + +def check_repomanifest(app, branch=None): + """Check for a new version by looking at the AndroidManifest.xml at the HEAD of the source repo. + + Whether this can be used reliably or not depends on + the development procedures used by the project's developers. Use it with + caution, because it's inappropriate for many projects. + """ + if app.RepoType == 'srclib': + build_dir = Path('build/srclib') / app.Repo + repotype = common.getsrclibvcs(app.Repo) + else: + build_dir = Path('build') / app.id + repotype = app.RepoType + + # Set up vcs interface and make sure we have the latest code... + vcs = common.getvcs(app.RepoType, app.Repo, build_dir) + + if repotype == 'git': + if branch: + branch = 'origin/' + branch + vcs.gotorevision(branch) + elif repotype == 'git-svn': + vcs.gotorevision(branch) + elif repotype == 'hg': + vcs.gotorevision(branch) + elif repotype == 'bzr': vcs.gotorevision(None) - last_build = app.get_last_build() + last_build = metadata.Build() + if app.get('Builds', []): + last_build = app.get('Builds', [])[-1] - try_init_submodules(app, last_build, vcs) + try_init_submodules(app, last_build, vcs) - htag = None - hver = None - hcode = "0" + hpak = None + hver = None + hcode = "0" + for subdir in possible_subdirs(app): + root_dir = build_dir / subdir + paths = common.manifest_paths(root_dir, last_build.gradle) + version, vercode, package = common.parse_androidmanifests(paths, app) + if vercode: + logging.debug("Manifest exists in subdir '{0}'. Found version {1} ({2})" + .format(subdir, version, vercode)) + i_vercode = common.version_code_string_to_int(vercode) + if i_vercode > common.version_code_string_to_int(hcode): + hpak = package + hcode = str(i_vercode) + hver = version - tags = [] - if repotype == 'git': - tags = vcs.latesttags() - else: - tags = vcs.gettags() - if not tags: - return (None, "No tags found", None) - - logging.debug("All tags: " + ','.join(tags)) - if pattern: - pat = re.compile(pattern) - tags = [tag for tag in tags if pat.match(tag)] - if not tags: - return (None, "No matching tags found", None) - logging.debug("Matching tags: " + ','.join(tags)) - - if len(tags) > 5 and repotype == 'git': - tags = tags[:5] - logging.debug("Latest tags: " + ','.join(tags)) - - for tag in tags: - logging.debug("Check tag: '{0}'".format(tag)) - vcs.gotorevision(tag) - - if app.UpdateCheckData: - filecode, codeex, filever, verex = app.UpdateCheckData.split('|') - - if filecode: - filecode = build_dir / filecode - if not filecode.is_file(): - logging.debug("UpdateCheckData file {0} not found in tag {1}".format(filecode, tag)) - continue - filecontent = filecode.read_text() - else: - filecontent = tag - - vercode = tag - if codeex: - m = re.search(codeex, filecontent) - if not m: - continue - - vercode = m.group(1).strip() - - if filever: - if filever != '.': - filever = build_dir / filever - if filever.is_file(): - filecontent = filever.read_text() - else: - logging.debug("UpdateCheckData file {0} not found in tag {1}".format(filever, tag)) - else: - filecontent = tag - - version = tag - if verex: - m = re.search(verex, filecontent) - if m: - version = m.group(1) - - logging.debug("UpdateCheckData found version {0} ({1})" - .format(version, vercode)) - i_vercode = common.version_code_string_to_int(vercode) - if i_vercode > common.version_code_string_to_int(hcode): - htag = tag - hcode = str(i_vercode) - hver = version - else: - for subdir in possible_subdirs(app): - root_dir = build_dir / subdir - paths = common.manifest_paths(root_dir, last_build.gradle) - version, vercode, _package = common.parse_androidmanifests(paths, app) - if version == 'Unknown' or version == 'Ignore': - version = tag - if vercode: - logging.debug("Manifest exists in subdir '{0}'. Found version {1} ({2})" - .format(subdir, version, vercode)) - i_vercode = common.version_code_string_to_int(vercode) - if i_vercode > common.version_code_string_to_int(hcode): - htag = tag - hcode = str(i_vercode) - hver = version - - if hver: - try: - commit = vcs.getref(htag) - if commit: - return (hver, hcode, commit) - except VCSException: - pass - return (hver, hcode, htag) - return (None, "Couldn't find any version information", None) - - except VCSException as vcse: - msg = "VCS error while scanning app {0}: {1}".format(app.id, vcse) - return (None, msg, None) - except Exception: - msg = "Could not scan app {0} due to unknown error: {1}".format(app.id, traceback.format_exc()) - return (None, msg, None) - - -# Check for a new version by looking at the AndroidManifest.xml at the HEAD -# of the source repo. Whether this can be used reliably or not depends on -# the development procedures used by the project's developers. Use it with -# caution, because it's inappropriate for many projects. -# Returns (None, "a message") if this didn't work, or (version, vercode) for -# the details of the current version. -def check_repomanifest(app, branch=None): - - try: - - if app.RepoType == 'srclib': - build_dir = Path('build/srclib') / app.Repo - repotype = common.getsrclibvcs(app.Repo) - else: - build_dir = Path('build') / app.id - repotype = app.RepoType - - # Set up vcs interface and make sure we have the latest code... - vcs = common.getvcs(app.RepoType, app.Repo, build_dir) - - if repotype == 'git': - if branch: - branch = 'origin/' + branch - vcs.gotorevision(branch) - elif repotype == 'git-svn': - vcs.gotorevision(branch) - elif repotype == 'hg': - vcs.gotorevision(branch) - elif repotype == 'bzr': - vcs.gotorevision(None) - - last_build = metadata.Build() - if app.get('Builds', []): - last_build = app.get('Builds', [])[-1] - - try_init_submodules(app, last_build, vcs) - - hpak = None - hver = None - hcode = "0" - for subdir in possible_subdirs(app): - root_dir = build_dir / subdir - paths = common.manifest_paths(root_dir, last_build.gradle) - version, vercode, package = common.parse_androidmanifests(paths, app) - if vercode: - logging.debug("Manifest exists in subdir '{0}'. Found version {1} ({2})" - .format(subdir, version, vercode)) - i_vercode = common.version_code_string_to_int(vercode) - if i_vercode > common.version_code_string_to_int(hcode): - hpak = package - hcode = str(i_vercode) - hver = version - - if not hpak: - return (None, "Couldn't find package ID") - if hver: - return (hver, hcode) - return (None, "Couldn't find any version information") - - except VCSException as vcse: - msg = "VCS error while scanning app {0}: {1}".format(app.id, vcse) - return (None, msg) - except Exception: - msg = "Could not scan app {0} due to unknown error: {1}".format(app.id, traceback.format_exc()) - return (None, msg) + if not hpak: + return (None, "Couldn't find package ID") + if hver: + return (hver, hcode) + return (None, "Couldn't find any version information") def check_repotrunk(app): + if app.RepoType == 'srclib': + build_dir = Path('build/srclib') / app.Repo + repotype = common.getsrclibvcs(app.Repo) + else: + build_dir = Path('build') / app.id + repotype = app.RepoType - try: - if app.RepoType == 'srclib': - build_dir = Path('build/srclib') / app.Repo - repotype = common.getsrclibvcs(app.Repo) - else: - build_dir = Path('build') / app.id - repotype = app.RepoType + if repotype not in ('git-svn', ): + return (None, 'RepoTrunk update mode only makes sense in git-svn repositories') - if repotype not in ('git-svn', ): - return (None, 'RepoTrunk update mode only makes sense in git-svn repositories') + # Set up vcs interface and make sure we have the latest code... + vcs = common.getvcs(app.RepoType, app.Repo, build_dir) - # Set up vcs interface and make sure we have the latest code... - vcs = common.getvcs(app.RepoType, app.Repo, build_dir) + vcs.gotorevision(None) - vcs.gotorevision(None) - - ref = vcs.getref() - return (ref, ref) - except VCSException as vcse: - msg = "VCS error while scanning app {0}: {1}".format(app.id, vcse) - return (None, msg) - except Exception: - msg = "Could not scan app {0} due to unknown error: {1}".format(app.id, traceback.format_exc()) - return (None, msg) + ref = vcs.getref() + return (ref, ref) # Check for a new version by looking at the Google Play Store. diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index 06504a07..a8e9ed78 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -186,9 +186,8 @@ class CheckupdatesTest(unittest.TestCase): faked = scheme + '://fake.url/for/testing/scheme' app.UpdateCheckData = faked + '|ignored|' + faked + '|ignored' app.metadatapath = 'metadata/' + app.id + '.yml' - vername, vercode = fdroidserver.checkupdates.check_http(app) - self.assertIsNone(vername) - self.assertTrue(FDroidException.__name__ in vercode) + with self.assertRaises(FDroidException): + fdroidserver.checkupdates.check_http(app) def test_check_http_ignore(self): fdroidserver.checkupdates.options = mock.Mock() From ae98844943a8d4bdc8be16feb6465f19797819ec Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 27 Jul 2021 22:02:36 +0200 Subject: [PATCH 0391/2116] [checkupdates] Raise exception instead of returning an error --- fdroidserver/checkupdates.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 8f53b097..e3b4ce10 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -109,10 +109,10 @@ def check_tags(app, pattern): repotype = app.RepoType if repotype not in ('git', 'git-svn', 'hg', 'bzr'): - return (None, 'Tags update mode only works for git, hg, bzr and git-svn repositories currently', None) + raise MetaDataException(_('Tags update mode only works for git, hg, bzr and git-svn repositories currently')) if repotype == 'git-svn' and ';' not in app.Repo: - return (None, 'Tags update mode used in git-svn, but the repo was not set up with tags', None) + raise MetaDataException(_('Tags update mode used in git-svn, but the repo was not set up with tags')) # Set up vcs interface and make sure we have the latest code... vcs = common.getvcs(app.RepoType, app.Repo, build_dir) @@ -133,14 +133,14 @@ def check_tags(app, pattern): else: tags = vcs.gettags() if not tags: - return (None, "No tags found", None) + raise FDroidException(_('No tags found')) logging.debug("All tags: " + ','.join(tags)) if pattern: pat = re.compile(pattern) tags = [tag for tag in tags if pat.match(tag)] if not tags: - return (None, "No matching tags found", None) + raise FDroidException(_('No matching tags found')) logging.debug("Matching tags: " + ','.join(tags)) if len(tags) > 5 and repotype == 'git': @@ -218,7 +218,7 @@ def check_tags(app, pattern): except VCSException: pass return (hver, hcode, htag) - return (None, "Couldn't find any version information", None) + raise FDroidException(_("Couldn't find any version information")) def check_repomanifest(app, branch=None): @@ -272,10 +272,10 @@ def check_repomanifest(app, branch=None): hver = version if not hpak: - return (None, "Couldn't find package ID") + raise FDroidException(_("Couldn't find package ID")) if hver: return (hver, hcode) - return (None, "Couldn't find any version information") + raise FDroidException(_("Couldn't find any version information")) def check_repotrunk(app): @@ -287,7 +287,7 @@ def check_repotrunk(app): repotype = app.RepoType if repotype not in ('git-svn', ): - return (None, 'RepoTrunk update mode only makes sense in git-svn repositories') + raise MetaDataException(_('RepoTrunk update mode only makes sense in git-svn repositories')) # Set up vcs interface and make sure we have the latest code... vcs = common.getvcs(app.RepoType, app.Repo, build_dir) From 8f836b3b015dd6d2e3510d83f94f79b49316d5b8 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 27 Jul 2021 22:19:20 +0200 Subject: [PATCH 0392/2116] [checkupdates] Move log messages into method --- fdroidserver/checkupdates.py | 20 ++++---------------- tests/checkupdates.TestCase | 1 - 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index e3b4ce10..ead204f6 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -89,7 +89,8 @@ def check_http(app): if not ignoresearch(version): return (version, vercode) else: - return (None, ("Version {version} is ignored").format(version=version)) + logging.info("Version {version} for {appid} is ignored".format(version=version, appid=app.id)) + return (None, None) else: return (version, vercode) @@ -428,31 +429,22 @@ def checkupdates_app(app): commitmsg = None tag = None - msg = None vercode = None - noverok = False mode = app.UpdateCheckMode if mode.startswith('Tags'): pattern = mode[5:] if len(mode) > 4 else None (version, vercode, tag) = check_tags(app, pattern) - msg = vercode elif mode == 'RepoManifest': (version, vercode) = check_repomanifest(app) - msg = vercode elif mode.startswith('RepoManifest/'): tag = mode[13:] (version, vercode) = check_repomanifest(app, tag) - msg = vercode elif mode == 'RepoTrunk': (version, vercode) = check_repotrunk(app) - msg = vercode elif mode == 'HTTP': (version, vercode) = check_http(app) - msg = vercode elif mode in ('None', 'Static'): - version = None - msg = 'Checking disabled' - noverok = True + raise MetaDataException(_('Checking disabled')) else: raise MetaDataException(_('Invalid UpdateCheckMode: {mode}').format(mode=mode)) @@ -473,11 +465,7 @@ def checkupdates_app(app): updating = False if version is None: - logmsg = "...{0} : {1}".format(app.id, msg) - if noverok: - logging.info(logmsg) - else: - logging.warning(logmsg) + logging.warning('no version information found for {appid}'.format(appid=app.id)) elif vercode == app.CurrentVersionCode: logging.debug("...up to date") elif int(vercode) > int(app.CurrentVersionCode): diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index a8e9ed78..c1f2062e 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -205,7 +205,6 @@ class CheckupdatesTest(unittest.TestCase): with mock.patch('urllib.request.urlopen', lambda a, b, c: respmock): vername, vercode = fdroidserver.checkupdates.check_http(app) self.assertEqual(vername, None) - self.assertEqual(vercode, 'Version 1.1.9-beta is ignored') def test_check_tags_data(self): fdroidserver.checkupdates.options = mock.Mock() From 44a0e7e74ff4bd3b4c1f1d7869badc87670de67e Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 27 Jul 2021 22:25:20 +0200 Subject: [PATCH 0393/2116] [checkupdates] Simplify logic in check_http --- fdroidserver/checkupdates.py | 52 +++++++++++++++--------------------- 1 file changed, 21 insertions(+), 31 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index ead204f6..510996c7 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -45,9 +45,6 @@ from .exception import VCSException, NoSubmodulesException, FDroidException, Met # required. def check_http(app): - ignoreversions = app.UpdateCheckIgnore - ignoresearch = re.compile(ignoreversions).search if ignoreversions else None - if not app.UpdateCheckData: raise FDroidException('Missing Update Check Data') @@ -60,39 +57,32 @@ def check_http(app): if not parsed.netloc or not parsed.scheme or parsed.scheme != 'https': raise FDroidException(_('UpdateCheckData has invalid URL: {url}').format(url=urlcode)) - vercode = None - if urlcode: - logging.debug("...requesting {0}".format(urlcode)) - req = urllib.request.Request(urlcode, None, headers=net.HEADERS) + logging.debug("...requesting {0}".format(urlcode)) + req = urllib.request.Request(urlcode, None, headers=net.HEADERS) + resp = urllib.request.urlopen(req, None, 20) # nosec B310 scheme is filtered above + page = resp.read().decode('utf-8') + + m = re.search(codeex, page) + if not m: + raise FDroidException("No RE match for version code") + vercode = m.group(1).strip() + + if urlver != '.': + logging.debug("...requesting {0}".format(urlver)) + req = urllib.request.Request(urlver, None) resp = urllib.request.urlopen(req, None, 20) # nosec B310 scheme is filtered above page = resp.read().decode('utf-8') - m = re.search(codeex, page) - if not m: - raise FDroidException("No RE match for version code") - vercode = m.group(1).strip() + m = re.search(verex, page) + if not m: + raise FDroidException("No RE match for version") + version = m.group(1) - version = "??" - if urlver: - if urlver != '.': - logging.debug("...requesting {0}".format(urlver)) - req = urllib.request.Request(urlver, None) - resp = urllib.request.urlopen(req, None, 20) # nosec B310 scheme is filtered above - page = resp.read().decode('utf-8') + if app.UpdateCheckIgnore and re.search(app.UpdateCheckIgnore, version): + logging.info("Version {version} for {appid} is ignored".format(version=version, appid=app.id)) + return (None, None) - m = re.search(verex, page) - if not m: - raise FDroidException("No RE match for version") - version = m.group(1) - - if ignoresearch and version: - if not ignoresearch(version): - return (version, vercode) - else: - logging.info("Version {version} for {appid} is ignored".format(version=version, appid=app.id)) - return (None, None) - else: - return (version, vercode) + return (version, vercode) def check_tags(app, pattern): From 58dcb4c2a0026e888dc6a3c04244236354fae920 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 29 Jul 2021 10:45:41 +0200 Subject: [PATCH 0394/2116] [checkupdates] Don't fail for disabled apps --- fdroidserver/checkupdates.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 510996c7..4ab9f854 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -434,7 +434,8 @@ def checkupdates_app(app): elif mode == 'HTTP': (version, vercode) = check_http(app) elif mode in ('None', 'Static'): - raise MetaDataException(_('Checking disabled')) + logging.debug('Checking disabled') + return else: raise MetaDataException(_('Invalid UpdateCheckMode: {mode}').format(mode=mode)) From 16f8d50194bb9d051bfd48cfdb74e749108335ff Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 29 Jul 2021 11:38:15 +0200 Subject: [PATCH 0395/2116] [checkupdates] make no version information an error --- fdroidserver/checkupdates.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 4ab9f854..9b0a0bb4 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -456,7 +456,7 @@ def checkupdates_app(app): updating = False if version is None: - logging.warning('no version information found for {appid}'.format(appid=app.id)) + raise FDroidException(_('no version information found')) elif vercode == app.CurrentVersionCode: logging.debug("...up to date") elif int(vercode) > int(app.CurrentVersionCode): From 121e06e4b7d0a14b8cd0004d4447bab5c0169376 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 29 Jul 2021 11:52:22 +0200 Subject: [PATCH 0396/2116] Fix CheckupdatesTest --- tests/checkupdates.TestCase | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index c1f2062e..0a6fd135 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -114,7 +114,8 @@ class CheckupdatesTest(unittest.TestCase): with mock.patch( 'fdroidserver.checkupdates.check_http', lambda app: (None, 'bla') ): - fdroidserver.checkupdates.checkupdates_app(app) + with self.assertRaises(FDroidException): + fdroidserver.checkupdates.checkupdates_app(app) with mock.patch( 'fdroidserver.checkupdates.check_http', lambda app: ('1.1.9', 10109) @@ -148,7 +149,8 @@ class CheckupdatesTest(unittest.TestCase): 'fdroidserver.checkupdates.check_tags', lambda app, pattern: (None, 'bla', None), ): - fdroidserver.checkupdates.checkupdates_app(app) + with self.assertRaises(FDroidException): + fdroidserver.checkupdates.checkupdates_app(app) with mock.patch( 'fdroidserver.checkupdates.check_tags', From ac2b5cb7def0ead383da4ea285482ec920191f2b Mon Sep 17 00:00:00 2001 From: "Felix C. Stegerman" Date: Tue, 3 Aug 2021 20:25:23 +0200 Subject: [PATCH 0397/2116] fix copy_triple_t_store_metadata() --- fdroidserver/update.py | 98 +++++++++++++++++++----------------------- 1 file changed, 45 insertions(+), 53 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 4601eb81..f35f2598 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1039,28 +1039,29 @@ def copy_triple_t_store_metadata(apps): setting_gradle_pattern = re.compile(r"""\s*include\s+["']:([^"']+)["'](?:,[\n\s]*["']:([^"']+)["'])*""") for packageName, app in apps.items(): + builds = app.get('Builds', []) gradle_subdirs = set() - sg_list = glob.glob(os.path.join('build', packageName, 'settings.gradle*')) - if sg_list: - settings_gradle = sg_list[0] - with open(settings_gradle, encoding='utf-8') as fp: - data = fp.read() - for matches in setting_gradle_pattern.findall(data): - for m in matches: - if m: - gradle_path = m.replace(':', '/') - p = os.path.join('build', packageName, gradle_path, 'src', 'main', 'play') - if os.path.exists(p): - gradle_subdirs.add(p) - flavors = set() - if app.get('Builds'): - flavors = app['Builds'][0].gradle - for flavor in flavors: - if flavor not in ('yes', 'no'): - p = os.path.join('build', packageName, gradle_path, 'src', flavor, 'play') - gradle_subdirs.add(p) - if not gradle_subdirs and len(app.get('Builds', [])) and app.get('Builds', [])[-1].subdir: - gradle_subdirs.update(glob.glob(os.path.join('build', packageName, app.get('Builds', [])[-1].subdir, 'src', '*', 'play'))) + if builds and builds[-1].subdir: + gradle_subdirs.update(glob.glob(os.path.join('build', packageName, builds[-1].subdir, 'src', '*', 'play'))) + if not gradle_subdirs: + sg_list = sorted(glob.glob(os.path.join('build', packageName, 'settings.gradle*'))) + if sg_list: + settings_gradle = sg_list[0] + with open(settings_gradle, encoding='utf-8') as fp: + data = fp.read() + for matches in setting_gradle_pattern.findall(data): + for m in matches: + if m: + gradle_path = m.replace(':', '/') + p = os.path.join('build', packageName, gradle_path, 'src', 'main', 'play') + if os.path.exists(p): + gradle_subdirs.add(p) + flavors = builds[-1].gradle if builds else [] + for flavor in flavors: + if flavor not in ('yes', 'no', True, False): + p = os.path.join('build', packageName, gradle_path, 'src', flavor, 'play') + if os.path.exists(p): + gradle_subdirs.add(p) if not gradle_subdirs: gradle_subdirs.update(glob.glob(os.path.join('build', packageName, '*', 'src', '*', 'play'))) @@ -1077,60 +1078,51 @@ def copy_triple_t_store_metadata(apps): if f == 'fulldescription' or f == 'full-description.txt': _set_localized_text_entry(app, locale, 'description', os.path.join(root, f)) - continue elif f == 'shortdescription' or f == 'short-description.txt': _set_localized_text_entry(app, locale, 'summary', os.path.join(root, f)) - continue elif f == 'title' or f == 'title.txt': _set_localized_text_entry(app, locale, 'name', os.path.join(root, f)) - continue elif f == 'video' or f == 'video-url.txt': _set_localized_text_entry(app, locale, 'video', os.path.join(root, f)) - continue elif f == 'whatsnew': _set_localized_text_entry(app, segments[-1], 'whatsNew', os.path.join(root, f)) - continue elif f == 'default.txt' and segments[-2] == 'release-notes': _set_localized_text_entry(app, locale, 'whatsNew', os.path.join(root, f)) - continue elif f == 'contactEmail' or f == 'contact-email.txt': _set_author_entry(app, 'authorEmail', os.path.join(root, f)) - continue elif f == 'contactPhone' or f == 'contact-phone.txt': _set_author_entry(app, 'authorPhone', os.path.join(root, f)) - continue elif f == 'contactWebsite' or f == 'contact-website.txt': _set_author_entry(app, 'authorWebSite', os.path.join(root, f)) - continue - - base, extension = common.get_extension(f) - dirname = os.path.basename(root) - if extension in ALLOWED_EXTENSIONS \ - and (dirname in GRAPHIC_NAMES or dirname in tt_graphic_names - or dirname in SCREENSHOT_DIRS or dirname in tt_screenshot_dirs): - repofilename = os.path.basename(f) - if segments[-2] == 'listing': - locale = segments[-3] - elif segments[-4] == 'listings': # v2.x - locale = segments[-3] - if dirname in tt_graphic_names: - repofilename = GRAPHIC_NAMES[tt_graphic_names.index(dirname)] - repofilename += '.' + extension - dirname = '' + else: + base, extension = common.get_extension(f) + dirname = os.path.basename(root) + if extension in ALLOWED_EXTENSIONS \ + and (dirname in GRAPHIC_NAMES or dirname in tt_graphic_names + or dirname in SCREENSHOT_DIRS or dirname in tt_screenshot_dirs): + repofilename = os.path.basename(f) + if segments[-2] == 'listing': + locale = segments[-3] + elif segments[-4] == 'listings': # v2.x + locale = segments[-3] + if dirname in tt_graphic_names: + repofilename = GRAPHIC_NAMES[tt_graphic_names.index(dirname)] + repofilename += '.' + extension + dirname = '' + else: + dirname = SCREENSHOT_DIRS[tt_screenshot_dirs.index(dirname)] else: - dirname = SCREENSHOT_DIRS[tt_screenshot_dirs.index(dirname)] - else: - locale = segments[-2] - destdir = os.path.join('repo', packageName, locale, dirname) - os.makedirs(destdir, mode=0o755, exist_ok=True) - sourcefile = os.path.join(root, f) - destfile = os.path.join(destdir, repofilename) - _strip_and_copy_image(sourcefile, destfile) + locale = segments[-2] + destdir = os.path.join('repo', packageName, locale, dirname) + os.makedirs(destdir, mode=0o755, exist_ok=True) + sourcefile = os.path.join(root, f) + destfile = os.path.join(destdir, repofilename) + _strip_and_copy_image(sourcefile, destfile) def insert_localized_app_metadata(apps): From 4c4a283ae218fc79e7a0523f974d1c67f494a88a Mon Sep 17 00:00:00 2001 From: "Felix C. Stegerman" Date: Tue, 3 Aug 2021 20:53:56 +0200 Subject: [PATCH 0398/2116] update test_insert_triple_t_multiple_metadata() test data --- MANIFEST.in | 2 ++ .../ch.admin.bag.covidcertificate.verifier/settings.gradle | 3 +++ .../build/ch.admin.bag.covidcertificate.wallet/settings.gradle | 3 +++ 3 files changed, 8 insertions(+) create mode 100644 tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/settings.gradle create mode 100644 tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/settings.gradle diff --git a/MANIFEST.in b/MANIFEST.in index 62db4b98..a0e59ec8 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -822,8 +822,10 @@ include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/release-note include tests/triple-t-2/build/org.piwigo.android/build.gradle include tests/triple-t-2/build/org.piwigo.android/settings.gradle include tests/triple-t-2/metadata/org.piwigo.android.yml +include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/settings.gradle include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src/main/play/listings/en-US/title.txt include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/main/play/listings/en-US/title.txt +include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/settings.gradle include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verifier/src/main/play/listings/en-US/title.txt include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/main/play/listings/en-US/title.txt include tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.verifier.yml diff --git a/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/settings.gradle b/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/settings.gradle new file mode 100644 index 00000000..c7934558 --- /dev/null +++ b/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/settings.gradle @@ -0,0 +1,3 @@ +include ':common' +include ':verifier' +include ':wallet' diff --git a/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/settings.gradle b/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/settings.gradle new file mode 100644 index 00000000..c7934558 --- /dev/null +++ b/tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/settings.gradle @@ -0,0 +1,3 @@ +include ':common' +include ':verifier' +include ':wallet' From ee18afe8dd54261fd9723f5e3218af6a9fdef6bc Mon Sep 17 00:00:00 2001 From: "Felix C. Stegerman" Date: Wed, 4 Aug 2021 00:12:17 +0200 Subject: [PATCH 0399/2116] copy_triple_t_store_metadata(): also look in $subdir/*/src/*/play --- fdroidserver/update.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index f35f2598..c60abfd7 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1043,6 +1043,8 @@ def copy_triple_t_store_metadata(apps): gradle_subdirs = set() if builds and builds[-1].subdir: gradle_subdirs.update(glob.glob(os.path.join('build', packageName, builds[-1].subdir, 'src', '*', 'play'))) + if not gradle_subdirs: + gradle_subdirs.update(glob.glob(os.path.join('build', packageName, builds[-1].subdir, '*', 'src', '*', 'play'))) if not gradle_subdirs: sg_list = sorted(glob.glob(os.path.join('build', packageName, 'settings.gradle*'))) if sg_list: From d5189712046012cd5b3584cb097440ac2f0e7a75 Mon Sep 17 00:00:00 2001 From: "Felix C. Stegerman" Date: Wed, 4 Aug 2021 17:33:38 +0200 Subject: [PATCH 0400/2116] add test_insert_triple_t_anysoftkeyboard() --- MANIFEST.in | 8 + tests/triple-t-anysoftkeyboard/.gitignore | 1 + .../src/main/play/listings/en-US/title.txt | 1 + .../src/main/play/listings/en-US/title.txt | 1 + .../settings.gradle | 77 +++ .../src/main/play/listings/en-US/title.txt | 1 + .../src/main/play/listings/en-US/title.txt | 1 + .../settings.gradle | 77 +++ ...com.anysoftkeyboard.languagepack.dutch.yml | 76 +++ .../com.menny.android.anysoftkeyboard.yml | 523 ++++++++++++++++++ tests/update.TestCase | 24 + 11 files changed, 790 insertions(+) create mode 100644 tests/triple-t-anysoftkeyboard/.gitignore create mode 100644 tests/triple-t-anysoftkeyboard/build/com.anysoftkeyboard.languagepack.dutch/addons/languages/dutch/apk/src/main/play/listings/en-US/title.txt create mode 100644 tests/triple-t-anysoftkeyboard/build/com.anysoftkeyboard.languagepack.dutch/ime/app/src/main/play/listings/en-US/title.txt create mode 100644 tests/triple-t-anysoftkeyboard/build/com.anysoftkeyboard.languagepack.dutch/settings.gradle create mode 100644 tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/addons/languages/dutch/apk/src/main/play/listings/en-US/title.txt create mode 100644 tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/ime/app/src/main/play/listings/en-US/title.txt create mode 100644 tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/settings.gradle create mode 100644 tests/triple-t-anysoftkeyboard/metadata/com.anysoftkeyboard.languagepack.dutch.yml create mode 100644 tests/triple-t-anysoftkeyboard/metadata/com.menny.android.anysoftkeyboard.yml diff --git a/MANIFEST.in b/MANIFEST.in index a0e59ec8..9d3a7a36 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -822,6 +822,14 @@ include tests/triple-t-2/build/org.piwigo.android/app/src/main/play/release-note include tests/triple-t-2/build/org.piwigo.android/build.gradle include tests/triple-t-2/build/org.piwigo.android/settings.gradle include tests/triple-t-2/metadata/org.piwigo.android.yml +include tests/triple-t-anysoftkeyboard/build/com.anysoftkeyboard.languagepack.dutch/addons/languages/dutch/apk/src/main/play/listings/en-US/title.txt +include tests/triple-t-anysoftkeyboard/build/com.anysoftkeyboard.languagepack.dutch/ime/app/src/main/play/listings/en-US/title.txt +include tests/triple-t-anysoftkeyboard/build/com.anysoftkeyboard.languagepack.dutch/settings.gradle +include tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/addons/languages/dutch/apk/src/main/play/listings/en-US/title.txt +include tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/ime/app/src/main/play/listings/en-US/title.txt +include tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/settings.gradle +include tests/triple-t-anysoftkeyboard/metadata/com.anysoftkeyboard.languagepack.dutch.yml +include tests/triple-t-anysoftkeyboard/metadata/com.menny.android.anysoftkeyboard.yml include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/settings.gradle include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src/main/play/listings/en-US/title.txt include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/main/play/listings/en-US/title.txt diff --git a/tests/triple-t-anysoftkeyboard/.gitignore b/tests/triple-t-anysoftkeyboard/.gitignore new file mode 100644 index 00000000..0aba28e9 --- /dev/null +++ b/tests/triple-t-anysoftkeyboard/.gitignore @@ -0,0 +1 @@ +!build/ diff --git a/tests/triple-t-anysoftkeyboard/build/com.anysoftkeyboard.languagepack.dutch/addons/languages/dutch/apk/src/main/play/listings/en-US/title.txt b/tests/triple-t-anysoftkeyboard/build/com.anysoftkeyboard.languagepack.dutch/addons/languages/dutch/apk/src/main/play/listings/en-US/title.txt new file mode 100644 index 00000000..6e75c228 --- /dev/null +++ b/tests/triple-t-anysoftkeyboard/build/com.anysoftkeyboard.languagepack.dutch/addons/languages/dutch/apk/src/main/play/listings/en-US/title.txt @@ -0,0 +1 @@ +Dutch for AnySoftKeyboard diff --git a/tests/triple-t-anysoftkeyboard/build/com.anysoftkeyboard.languagepack.dutch/ime/app/src/main/play/listings/en-US/title.txt b/tests/triple-t-anysoftkeyboard/build/com.anysoftkeyboard.languagepack.dutch/ime/app/src/main/play/listings/en-US/title.txt new file mode 100644 index 00000000..7c5eeaeb --- /dev/null +++ b/tests/triple-t-anysoftkeyboard/build/com.anysoftkeyboard.languagepack.dutch/ime/app/src/main/play/listings/en-US/title.txt @@ -0,0 +1 @@ +AnySoftKeyboard diff --git a/tests/triple-t-anysoftkeyboard/build/com.anysoftkeyboard.languagepack.dutch/settings.gradle b/tests/triple-t-anysoftkeyboard/build/com.anysoftkeyboard.languagepack.dutch/settings.gradle new file mode 100644 index 00000000..523aadb7 --- /dev/null +++ b/tests/triple-t-anysoftkeyboard/build/com.anysoftkeyboard.languagepack.dutch/settings.gradle @@ -0,0 +1,77 @@ +rootProject.name = 'AnySoftKeyboard' +include ':deployment' + +include ':api' + +include ':addons:base' +include ':addons:languages' +include ':addons:languages:english', ':addons:languages:english:pack' + +//list of packs should be alphabetized-ordered +include ':addons:languages:afrikaans_oss:pack', ':addons:languages:afrikaans_oss:apk' +include ':addons:languages:armenian2:pack', ':addons:languages:armenian2:apk' +include ":addons:languages:belarusian:pack", ":addons:languages:belarusian:apk" +include ':addons:languages:brazilian:pack', ':addons:languages:brazilian:apk' +include ':addons:languages:catalan:pack', ':addons:languages:catalan:apk' +include ':addons:languages:coptic:pack', ':addons:languages:coptic:apk' +include ':addons:languages:czech:pack', ':addons:languages:czech:apk' +include ':addons:languages:english:pack', ':addons:languages:english:apk' +include ':addons:languages:esperanto:pack', ':addons:languages:esperanto:apk' +include ':addons:languages:finnish:pack', ':addons:languages:finnish:apk' +include ':addons:languages:french:pack', ':addons:languages:french:apk' +include ':addons:languages:greek:pack', ':addons:languages:greek:apk' +include ':addons:languages:hebrew:pack', ':addons:languages:hebrew:apk' +include ':addons:languages:indonesian:pack', ':addons:languages:indonesian:apk' +include ':addons:languages:italian:pack', ':addons:languages:italian:apk' +include ':addons:languages:lithuanian:pack', ':addons:languages:lithuanian:apk' +include ':addons:languages:nias:pack', ':addons:languages:nias:apk' +include ':addons:languages:ossturkish:pack', ':addons:languages:ossturkish:apk' +include ':addons:languages:persian:pack', ':addons:languages:persian:apk' +include ':addons:languages:piedmontese:pack', ':addons:languages:piedmontese:apk' +include ':addons:languages:romanian:pack', ':addons:languages:romanian:apk' +include ':addons:languages:russian2:pack', ':addons:languages:russian2:apk' +include ':addons:languages:sardinian:pack', ':addons:languages:sardinian:apk' +include ':addons:languages:serbian:pack', ':addons:languages:serbian:apk' +include ':addons:languages:spain:pack', ':addons:languages:spain:apk' +include ':addons:languages:tamazight:pack', ':addons:languages:tamazight:apk' +include ':addons:languages:arabic:pack', ':addons:languages:arabic:apk' +include ':addons:languages:danish:pack', ':addons:languages:danish:apk' +include ':addons:languages:basque:pack', ':addons:languages:basque:apk' +include ':addons:languages:bulgarian:pack', ':addons:languages:bulgarian:apk' +include ':addons:languages:german:pack', ':addons:languages:german:apk' +include ':addons:languages:croatian:pack', ':addons:languages:croatian:apk' +include ':addons:languages:georgian:pack', ':addons:languages:georgian:apk' +include ':addons:languages:latvian:pack', ':addons:languages:latvian:apk' +include ':addons:languages:kurdish:pack', ':addons:languages:kurdish:apk' +include ':addons:languages:hungarian:pack', ':addons:languages:hungarian:apk' +include ':addons:languages:kachin:pack', ':addons:languages:kachin:apk' +include ':addons:languages:dutch:pack', ':addons:languages:dutch:apk' +include ':addons:languages:luxembourgish:pack', ':addons:languages:luxembourgish:apk' +include ':addons:languages:norwegian:pack', ':addons:languages:norwegian:apk' +include ':addons:languages:polish:pack', ':addons:languages:polish:apk' +include ':addons:languages:rusyn:pack', ':addons:languages:rusyn:apk' +include ':addons:languages:sinhala:pack', ':addons:languages:sinhala:apk' +include ':addons:languages:hindi:pack', ':addons:languages:hindi:apk' +include ':addons:languages:thai:pack', ':addons:languages:thai:apk' +include ':addons:languages:portuguese:pack', ':addons:languages:portuguese:apk' + +//list of themes should be alphabetized-ordered +include ':addons:themes' +include ':addons:themes:classic_pc:pack', ':addons:themes:classic_pc:apk' +include ':addons:themes:ics:pack', ':addons:themes:ics:apk' +include ':addons:themes:israel64:pack', ':addons:themes:israel64:apk' +include ':addons:themes:three_d:pack', ':addons:themes:three_d:apk' + +//list of quick-text should be alphabetized-ordered +include ':addons:quicktexts' +include ':addons:quicktexts:bbcodes:pack', ':addons:quicktexts:bbcodes:apk' + +include ':ime' +include ':ime:base', ':ime:base-rx', ':ime:base-test', ':ime:prefs' +include ':ime:remote', ':ime:fileprovider' +include ':ime:addons' +include ':ime:dictionaries', ':ime:dictionaries:jnidictionaryv1', ':ime:dictionaries:jnidictionaryv2', ':ime:nextword' +include ':ime:pixel', ':ime:overlay' +include 'ime:voiceime' +include ':ime:app' + diff --git a/tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/addons/languages/dutch/apk/src/main/play/listings/en-US/title.txt b/tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/addons/languages/dutch/apk/src/main/play/listings/en-US/title.txt new file mode 100644 index 00000000..6e75c228 --- /dev/null +++ b/tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/addons/languages/dutch/apk/src/main/play/listings/en-US/title.txt @@ -0,0 +1 @@ +Dutch for AnySoftKeyboard diff --git a/tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/ime/app/src/main/play/listings/en-US/title.txt b/tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/ime/app/src/main/play/listings/en-US/title.txt new file mode 100644 index 00000000..7c5eeaeb --- /dev/null +++ b/tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/ime/app/src/main/play/listings/en-US/title.txt @@ -0,0 +1 @@ +AnySoftKeyboard diff --git a/tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/settings.gradle b/tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/settings.gradle new file mode 100644 index 00000000..523aadb7 --- /dev/null +++ b/tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/settings.gradle @@ -0,0 +1,77 @@ +rootProject.name = 'AnySoftKeyboard' +include ':deployment' + +include ':api' + +include ':addons:base' +include ':addons:languages' +include ':addons:languages:english', ':addons:languages:english:pack' + +//list of packs should be alphabetized-ordered +include ':addons:languages:afrikaans_oss:pack', ':addons:languages:afrikaans_oss:apk' +include ':addons:languages:armenian2:pack', ':addons:languages:armenian2:apk' +include ":addons:languages:belarusian:pack", ":addons:languages:belarusian:apk" +include ':addons:languages:brazilian:pack', ':addons:languages:brazilian:apk' +include ':addons:languages:catalan:pack', ':addons:languages:catalan:apk' +include ':addons:languages:coptic:pack', ':addons:languages:coptic:apk' +include ':addons:languages:czech:pack', ':addons:languages:czech:apk' +include ':addons:languages:english:pack', ':addons:languages:english:apk' +include ':addons:languages:esperanto:pack', ':addons:languages:esperanto:apk' +include ':addons:languages:finnish:pack', ':addons:languages:finnish:apk' +include ':addons:languages:french:pack', ':addons:languages:french:apk' +include ':addons:languages:greek:pack', ':addons:languages:greek:apk' +include ':addons:languages:hebrew:pack', ':addons:languages:hebrew:apk' +include ':addons:languages:indonesian:pack', ':addons:languages:indonesian:apk' +include ':addons:languages:italian:pack', ':addons:languages:italian:apk' +include ':addons:languages:lithuanian:pack', ':addons:languages:lithuanian:apk' +include ':addons:languages:nias:pack', ':addons:languages:nias:apk' +include ':addons:languages:ossturkish:pack', ':addons:languages:ossturkish:apk' +include ':addons:languages:persian:pack', ':addons:languages:persian:apk' +include ':addons:languages:piedmontese:pack', ':addons:languages:piedmontese:apk' +include ':addons:languages:romanian:pack', ':addons:languages:romanian:apk' +include ':addons:languages:russian2:pack', ':addons:languages:russian2:apk' +include ':addons:languages:sardinian:pack', ':addons:languages:sardinian:apk' +include ':addons:languages:serbian:pack', ':addons:languages:serbian:apk' +include ':addons:languages:spain:pack', ':addons:languages:spain:apk' +include ':addons:languages:tamazight:pack', ':addons:languages:tamazight:apk' +include ':addons:languages:arabic:pack', ':addons:languages:arabic:apk' +include ':addons:languages:danish:pack', ':addons:languages:danish:apk' +include ':addons:languages:basque:pack', ':addons:languages:basque:apk' +include ':addons:languages:bulgarian:pack', ':addons:languages:bulgarian:apk' +include ':addons:languages:german:pack', ':addons:languages:german:apk' +include ':addons:languages:croatian:pack', ':addons:languages:croatian:apk' +include ':addons:languages:georgian:pack', ':addons:languages:georgian:apk' +include ':addons:languages:latvian:pack', ':addons:languages:latvian:apk' +include ':addons:languages:kurdish:pack', ':addons:languages:kurdish:apk' +include ':addons:languages:hungarian:pack', ':addons:languages:hungarian:apk' +include ':addons:languages:kachin:pack', ':addons:languages:kachin:apk' +include ':addons:languages:dutch:pack', ':addons:languages:dutch:apk' +include ':addons:languages:luxembourgish:pack', ':addons:languages:luxembourgish:apk' +include ':addons:languages:norwegian:pack', ':addons:languages:norwegian:apk' +include ':addons:languages:polish:pack', ':addons:languages:polish:apk' +include ':addons:languages:rusyn:pack', ':addons:languages:rusyn:apk' +include ':addons:languages:sinhala:pack', ':addons:languages:sinhala:apk' +include ':addons:languages:hindi:pack', ':addons:languages:hindi:apk' +include ':addons:languages:thai:pack', ':addons:languages:thai:apk' +include ':addons:languages:portuguese:pack', ':addons:languages:portuguese:apk' + +//list of themes should be alphabetized-ordered +include ':addons:themes' +include ':addons:themes:classic_pc:pack', ':addons:themes:classic_pc:apk' +include ':addons:themes:ics:pack', ':addons:themes:ics:apk' +include ':addons:themes:israel64:pack', ':addons:themes:israel64:apk' +include ':addons:themes:three_d:pack', ':addons:themes:three_d:apk' + +//list of quick-text should be alphabetized-ordered +include ':addons:quicktexts' +include ':addons:quicktexts:bbcodes:pack', ':addons:quicktexts:bbcodes:apk' + +include ':ime' +include ':ime:base', ':ime:base-rx', ':ime:base-test', ':ime:prefs' +include ':ime:remote', ':ime:fileprovider' +include ':ime:addons' +include ':ime:dictionaries', ':ime:dictionaries:jnidictionaryv1', ':ime:dictionaries:jnidictionaryv2', ':ime:nextword' +include ':ime:pixel', ':ime:overlay' +include 'ime:voiceime' +include ':ime:app' + diff --git a/tests/triple-t-anysoftkeyboard/metadata/com.anysoftkeyboard.languagepack.dutch.yml b/tests/triple-t-anysoftkeyboard/metadata/com.anysoftkeyboard.languagepack.dutch.yml new file mode 100644 index 00000000..346f83c2 --- /dev/null +++ b/tests/triple-t-anysoftkeyboard/metadata/com.anysoftkeyboard.languagepack.dutch.yml @@ -0,0 +1,76 @@ +Categories: + - Writing +License: Apache-2.0 +SourceCode: https://github.com/AnySoftKeyboard/AnySoftKeyboard/ +IssueTracker: https://github.com/AnySoftKeyboard/AnySoftKeyboard/issues +Donate: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=KDYBGNUNMMN94&lc=US&item_name=AnySoftKeyboard + +AutoName: AnySoftKeyboard - Dutch Language Pack +Description: |- + This app has been deprecated in favor of https://f-droid.org/en/packages/com.anysoftkeyboard.languagepack.dutch_oss/ + + This is the Dutch language pack for AnySoftKeyboard. It offers an extensive + Dutch dictionary and optimised keyboard. In order to use it, first install + https://f-droid.org/packages/com.menny.android.anysoftkeyboard – a practical input method for Android + smartphones and tablets. + + The dictionary is based on the word list from Stichting OpenTaal and has the + Quality Mark Spelling (Keurmerk Spelling) of the Dutch Language Union + (Taalunie). This language pack has been created by Stichting OpenTaal and can be + installed by all without any costs. The language-specific files in this language + pack have a dual license. Both the BSD 2-Clause License as the Creative Commons, + Attribution 4.0 (unported) apply. + + Please, help us create free and open Dutch writing tools. Donate tax free to our + foundation at https://www.opentaal.org/vrienden-van-opentaal + +RepoType: git +Repo: https://github.com/AnySoftKeyboard/AnySoftKeyboard.git + +Builds: + - versionName: '1.0' + versionCode: 1 + disable: wait for upstream + commit: c5efd5986ce9beec299919f7ae9f174abd33b156 + gradle: + - yes + forceversion: true + preassemble: + - :makeDictionary + + - versionName: '1.4' + versionCode: 5 + commit: dutch-1.4 + gradle: + - yes + forceversion: true + preassemble: + - :makeDictionary + + - versionName: 4.0.1396 + versionCode: 2908 + commit: 1.10-r4 + subdir: addons/languages/dutch + sudo: + - apt-get update || apt-get update + - apt-get install -t stretch-backports openjdk-11-jdk-headless openjdk-11-jre-headless + - update-alternatives --auto java + gradle: + - yes + output: ../../../outputs/apks/release/addons-languages-*-$$VERCODE$$.apk + prebuild: + - echo "//gradleVersion = '6.8.3'" | tee build.gradle + - sed -i -e "s calculateApplicationId(project) 'com.anysoftkeyboard.languagepack.dutch' + " ../../../gradle/apk_module.gradle + - sed -i -e '/Data\.versionCode/ c versionCode $$VERCODE$$' -e '/Data\.versionName/ + c versionName "$$VERSION$$"' ../../../gradle/versioning_apk.gradle + scanignore: + - addons/languages/*/pack/dictionary/*.gz + ndk: r14b + +MaintainerNotes: Package ID is now com.anysoftkeyboard.languagepack.dutch_oss + +AutoUpdateMode: None +UpdateCheckMode: None +CurrentVersion: 4.0.1396 +CurrentVersionCode: 2908 diff --git a/tests/triple-t-anysoftkeyboard/metadata/com.menny.android.anysoftkeyboard.yml b/tests/triple-t-anysoftkeyboard/metadata/com.menny.android.anysoftkeyboard.yml new file mode 100644 index 00000000..70a00573 --- /dev/null +++ b/tests/triple-t-anysoftkeyboard/metadata/com.menny.android.anysoftkeyboard.yml @@ -0,0 +1,523 @@ +Categories: + - Writing +License: Apache-2.0 +WebSite: https://anysoftkeyboard.github.io +SourceCode: https://github.com/AnySoftKeyboard/AnySoftKeyboard +IssueTracker: https://github.com/AnySoftKeyboard/AnySoftKeyboard/issues +Translation: https://crowdin.com/project/anysoftkeyboard +Changelog: https://github.com/AnySoftKeyboard/AnySoftKeyboard/releases +Donate: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=KDYBGNUNMMN94&lc=US&item_name=AnySoftKeyboard + +AutoName: AnySoftKeyboard + +RepoType: git +Repo: https://github.com/AnySoftKeyboard/AnySoftKeyboard.git + +Builds: + - versionName: '20120528' + versionCode: 74 + commit: d6c2f7448 + srclibs: + - AnySoftKeyboard-API@78768bc479 + prebuild: sed -i 's@\(android.library.reference.1=\).*@\1$$AnySoftKeyboard-API$$@' + project.properties + buildjni: + - yes + ndk: r12b + + - versionName: 20120814-eye-candy + versionCode: 76 + disable: doesn't build + commit: unknown - see disabled + srclibs: + - AnySoftKeyboard-API@78768bc479 + prebuild: sed -i 's@\(android.library.reference.1=\).*@\1$$AnySoftKeyboard-API$$@' + project.properties + buildjni: + - yes + ndk: r12b + + - versionName: 20130106-eye-candy + versionCode: 85 + commit: a7723e1db5 + srclibs: + - AnySoftKeyboard-API@b21d8907 + prebuild: + - sed -i 's@\(android.library.reference.1=\).*@\1$$AnySoftKeyboard-API$$@' project.properties + - rm -rf libs/armeabi*/ libs/x86/ libs/mips/ ant/ keyboard_keystore StoreStuff/ + res/raw/words_1.dict + - wget https://softkeyboard.googlecode.com/svn-history/r544/trunk/project/dict_creation/makedict_Linux + - wget https://github.com/AnySoftKeyboard/AnySoftKeyboardTools/blob/HEAD/makedict/makedict.jar?raw=true + -O makedict.jar + - chmod +x makedict_Linux + - ./makedict_Linux dict/words.xml + buildjni: + - yes + ndk: r12b + + - versionName: 20130222-skinny-eye-candy + versionCode: 95 + commit: 50daad0b0a + srclibs: + - AnySoftKeyboard-API@b21d8907 + - AnySoftKeyboardTools@73e9a09496 + prebuild: + - sed -i 's@\(android.library.reference.1=\).*@\1$$AnySoftKeyboard-API$$@' project.properties + - sed -i 's@..\/AnySoftKeyboardTools@$$AnySoftKeyboardTools$$@g' build.xml + - rm -rf libs/armeabi*/ libs/x86/ libs/mips/ ant/ keyboard_keystore StoreStuff/ + res/raw/words_1.dict + buildjni: + - yes + ndk: r12b + + - versionName: 20130501-skinny-eye-candy-post-birthday + versionCode: 98 + commit: 6f51b8a9d + srclibs: + - AnySoftKeyboard-API@2c864957 + - AnySoftKeyboardTools@73e9a09496 + prebuild: + - sed -i 's@\(android.library.reference.1=\).*@\1$$AnySoftKeyboard-API$$@' project.properties + - sed -i 's@..\/AnySoftKeyboardTools@$$AnySoftKeyboardTools$$@g' build.xml + - rm -rf libs/armeabi*/ libs/x86/ libs/mips/ ant/ keyboard_keystore StoreStuff/ + res/raw/words_1.dict + buildjni: + - yes + ndk: r12b + + - versionName: '20130528' + versionCode: 102 + commit: 72fd519 + srclibs: + - AnySoftKeyboard-API@8d8a958e17 + - AnySoftKeyboardTools@73e9a09496 + prebuild: + - sed -i 's@\(reference.1=\).*@\1$$AnySoftKeyboard-API$$@' project.properties + - sed -i 's@..\/AnySoftKeyboardTools@$$AnySoftKeyboardTools$$@g' build.xml + - rm -rf libs/armeabi*/ libs/x86/ libs/mips/ ant/ keyboard_keystore StoreStuff/ + res/raw/words_1.dict + buildjni: + - yes + ndk: r12b + + - versionName: '20130709' + versionCode: 106 + commit: f1ba2de + srclibs: + - AnySoftKeyboard-API@30851236d7 + - AnySoftKeyboardTools@73e9a09496 + prebuild: + - sed -i 's@\(.1=\).*@\1$$AnySoftKeyboard-API$$@' project.properties + - sed -i 's@..\/AnySoftKeyboardTools@$$AnySoftKeyboardTools$$@g' build.xml + - rm -rf libs/armeabi*/ libs/x86/ libs/mips/ ant/ keyboard_keystore StoreStuff/ + res/raw/words_1.dict + buildjni: + - yes + ndk: r12b + + - versionName: '20130807' + versionCode: 107 + disable: not published + commit: unknown - see disabled + + - versionName: '20130919' + versionCode: 111 + commit: 2a68963f + srclibs: + - AnySoftKeyboard-API@30851236d7 + - AnySoftKeyboardTools@73e9a09496 + prebuild: + - sed -i 's@\(.1=\).*@\1$$AnySoftKeyboard-API$$@' project.properties + - sed -i 's@..\/AnySoftKeyboardTools@$$AnySoftKeyboardTools$$@g' build.xml + - rm -rf libs/armeabi*/ libs/x86/ libs/mips/ ant/ keyboard_keystore StoreStuff/ + res/raw/words_1.dict + buildjni: + - yes + ndk: r12b + + - versionName: '20131101' + versionCode: 114 + disable: no longer uses ant, prebuilts + commit: 82538d456f8 + srclibs: + - AnySoftKeyboard-API@08b452ff4 + - AnySoftKeyboardTools@73e9a09496 + prebuild: + - sed -i 's@\(.1=\).*@\1$$AnySoftKeyboard-API$$@' project.properties + - sed -i 's@..\/AnySoftKeyboardTools@$$AnySoftKeyboardTools$$@g' build.xml + - rm -rf libs/armeabi*/ libs/x86/ libs/mips/ ant/ keyboard_keystore StoreStuff/ + res/raw/words_1.dict + buildjni: + - yes + ndk: r12b + + - versionName: 1.2.20140705 + versionCode: 140 + disable: build words dict from source, no idea what version name/code it is + commit: 1.5-r4.1 + gradle: + - yes + rm: + - res/raw/words_1.dict + + - versionName: 1.8.84 + versionCode: 1409 + commit: 1.8-r1 + init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' build.gradle + gradle: + - yes + rm: + - src/main/res/raw/words_1.dict + preassemble: + - makeEnglishDictionary + + - versionName: 1.8.133 + versionCode: 1458 + disable: broken subdir + commit: 1.8-r3 + subdir: app + init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle + gradle: + - yes + rm: + - app/src/main/res/raw/words_1.dict + preassemble: + - :makeEnglishDictionary + + - versionName: 1.8.146 + versionCode: 1471 + commit: 1.8-r4 + subdir: app + init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle + gradle: + - yes + rm: + - app/src/main/res/raw/words_1.dict + preassemble: + - :makeEnglishDictionary + + - versionName: 1.8.190 + versionCode: 1515 + disable: weird version/vc-issue + commit: 1.8-r5.1 + subdir: app + init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle + gradle: + - yes + rm: + - app/src/main/res/raw/words_1.dict + preassemble: + - :makeEnglishDictionary + + - versionName: 1.8.195 + versionCode: 1520 + commit: 1.8-r5.2 + subdir: app + init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle + gradle: + - yes + rm: + - app/src/main/res/raw/words_1.dict + preassemble: + - :makeEnglishDictionary + + - versionName: 1.8.253 + versionCode: 1578 + commit: 1.8-r6 + subdir: app + init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle + gradle: + - yes + forceversion: true + rm: + - app/src/main/res/raw/words_1.dict + prebuild: sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle + preassemble: + - :makeEnglishDictionary + + - versionName: 1.8.329 + versionCode: 1654 + commit: 1.8-r7 + subdir: app + init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle + gradle: + - yes + forceversion: true + rm: + - app/src/main/res/raw/words_1.dict + prebuild: sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle + preassemble: + - :makeEnglishDictionary + + - versionName: 1.8.401 + versionCode: 1726 + commit: 1.8-r7.1 + subdir: app + init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle + gradle: + - yes + forceversion: true + rm: + - app/src/main/res/raw/words_1.dict + prebuild: + - sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle + - sed -i -e '/crashlytics/,$d' build.gradle + preassemble: + - :makeEnglishDictionary + + - versionName: 1.8.503 + versionCode: 1828 + commit: 1.8-r8 + subdir: app + init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle + gradle: + - yes + forceversion: true + rm: + - app/src/main/res/raw/words_*.dict + prebuild: + - sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle + - sed -i -e '/crashlytics/,$d' build.gradle + preassemble: + - :makeEnglishDictionary + + - versionName: 1.8.585 + versionCode: 1910 + commit: 1.8-r9 + subdir: app + init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle + gradle: + - yes + forceversion: true + rm: + - app/src/main/res/raw/words_*.dict + prebuild: + - sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle + - sed -i -e '/crashlytics/,$d' build.gradle + preassemble: + - :makeEnglishDictionary + + - versionName: 1.8.735 + versionCode: 2060 + commit: 1.8-r10 + subdir: app + init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle + gradle: + - yes + forceversion: true + rm: + - app/src/main/res/raw/words_*.dict + prebuild: + - sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle + - sed -i -e '/crashlytics/,$d' build.gradle + preassemble: + - :makeEnglishDictionary + + - versionName: 1.8.844 + versionCode: 2169 + commit: 1.8-r11 + subdir: app + init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle + gradle: + - yes + forceversion: true + rm: + - app/src/main/res/raw/words_*.dict + prebuild: + - sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle + - sed -i -e '/crashlytics/,$d' build.gradle + preassemble: + - :makeEnglishDictionary + + - versionName: 1.8.1241 + versionCode: 2566 + commit: 1.8-r12 + subdir: app + init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle + gradle: + - yes + forceversion: true + rm: + - app/src/main/res/raw/words_*.dict + prebuild: + - sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle + - sed -i -e '/crashlytics/,$d' build.gradle + preassemble: + - :makeEnglishDictionary + + - versionName: 1.8.1333 + versionCode: 2658 + commit: 1.8-r12.2 + subdir: app + init: sed -i -e '/fabric/d' -e '/canaryCompile/,+2d' ../build.gradle build.gradle + gradle: + - yes + forceversion: true + rm: + - app/src/main/res/raw/words_*.dict + prebuild: + - sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' build.gradle + - sed -i -e '/crashlytics/,$d' build.gradle + ndk: r11c + preassemble: + - :makeEnglishDictionary + + - versionName: 1.9.1117 + versionCode: 3692 + commit: 1.9-r1 + subdir: app + init: sed -i -e '/fabric/d' -e '/canaryImplementation/,+2d' ../build.gradle build.gradle + gradle: + - yes + forceversion: true + rm: + - app/src/main/res/raw/words_*.dict + prebuild: + - sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' -e '/crashlytics/,$d' + build.gradle + - sed -i -e 's/gradle:3.1.0-alpha06/gradle:3.0.1/' ../build.gradle + scandelete: + - buildSrc + - app/src/debug + ndk: r14b + preassemble: + - :makeEnglishDictionary + + - versionName: 1.9.1944 + versionCode: 4519 + commit: 1.9-r3-fdroid + subdir: app + init: sed -i -e '/fabric/d' -e '/canaryImplementation/d' ../build.gradle build.gradle + gradle: + - yes + forceversion: true + rm: + - app/src/main/res/raw/words_*.dict + prebuild: sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' + -e '/crashlytics/,$d' build.gradle + scandelete: + - buildSrc + - app/src/debug + ndk: r14b + preassemble: + - :makeEnglishDictionary + + - versionName: 1.9.2055 + versionCode: 4630 + commit: 1.9-r4 + subdir: app + init: sed -i -e '/fabric/d' -e '/canaryImplementation/d' ../build.gradle build.gradle + gradle: + - yes + forceversion: true + rm: + - app/src/main/res/raw/words_*.dict + prebuild: sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' + -e '/crashlytics/,$d' build.gradle + scandelete: + - buildSrc + - app/src/debug + ndk: r14b + preassemble: + - :makeEnglishDictionary + + - versionName: 1.9.2445 + versionCode: 5020 + commit: 1.9-r5.1 + subdir: app + gradle: + - yes + forceversion: true + rm: + - app/src/main/res/raw/words_*.dict + prebuild: sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' + build.gradle + scandelete: + - buildSrc + - app/src/debug + ndk: r14b + preassemble: + - :makeEnglishDictionary + + - versionName: 1.9.2629 + versionCode: 5204 + commit: 1.9-r6 + subdir: app + gradle: + - yes + forceversion: true + prebuild: sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' + build.gradle + scandelete: + - buildSrc + ndk: r14b + + - versionName: 1.10.364 + versionCode: 5539 + commit: 1.10-r1 + subdir: app + gradle: + - yes + forceversion: true + prebuild: sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' + build.gradle + scandelete: + - buildSrc + ndk: r14b + + - versionName: 1.10.606 + versionCode: 5781 + commit: 1.10-r2 + subdir: app + gradle: + - yes + forceversion: true + prebuild: sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' + build.gradle + scandelete: + - buildSrc + ndk: r14b + + - versionName: 1.10.1109 + versionCode: 6279 + commit: e57c9cc852aefdc1ff60b024e52d4341337b3df7 + subdir: app + gradle: + - yes + forceversion: true + prebuild: sed -i -e '/versionCode/d' -e '/versionName/aversionCode $$VERCODE$$' + build.gradle + scanignore: + - buildSrc + ndk: r14b + gradleprops: + - forceVersionBuildCount=4709 + + - versionName: 1.10.1786 + versionCode: 6956 + commit: 1.10-r4 + subdir: ime/app + sudo: + - apt-get update || apt-get update + - apt-get install -t stretch-backports openjdk-11-jdk-headless openjdk-11-jre-headless + - update-alternatives --auto java + gradle: + - yes + prebuild: + - sed -i -e "/EnvKey/ a //gradleVersion = '6.8.3'" ../build.gradle + - sed -i -e '/Data\.versionCode/ c versionCode $$VERCODE$$' -e '/Data\.versionName/ + c versionName "$$VERSION$$"' ../../gradle/versioning_apk.gradle + scanignore: + - addons/languages/*/pack/dictionary/*.gz + ndk: r14b + +MaintainerNotes: |- + * Prior to 1.9.2629, generates english dictionary binary (src/main/res/raw/words_*.dict) from source files (under `english_dictionary` folder. Mostly AOSP word-list) + + Summary and Description have been moved to the new localizable text files: + https://f-droid.org/docs/All_About_Descriptions_Graphics_and_Screenshots + +AutoUpdateMode: None +UpdateCheckMode: None +CurrentVersion: 1.10.1786 +CurrentVersionCode: 6956 diff --git a/tests/update.TestCase b/tests/update.TestCase index ea3b081f..72315b98 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -409,6 +409,30 @@ class UpdateTest(unittest.TestCase): self.assertFalse(os.path.exists(os.path.join('de-DE', 'phoneScreenshots', '01_Login.jpg'))) self.assertFalse(os.path.exists(os.path.join('de-DE', 'sevenInchScreenshots', '01_Login.png'))) + def test_insert_triple_t_anysoftkeyboard(self): + packages = ('com.anysoftkeyboard.languagepack.dutch', 'com.menny.android.anysoftkeyboard') + names = ('Dutch for AnySoftKeyboard', 'AnySoftKeyboard') + + tmptestsdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.rmdir(tmptestsdir) + shutil.copytree(os.path.join(self.basedir, 'triple-t-anysoftkeyboard'), tmptestsdir) + os.chdir(tmptestsdir) + + for packageName, name in zip(packages, names): + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.common.config = config + fdroidserver.update.config = config + fdroidserver.update.options = fdroidserver.common.options + + apps = fdroidserver.metadata.read_metadata() + self.assertTrue(packageName in apps) + fdroidserver.update.copy_triple_t_store_metadata(apps) + app = apps[packageName] + self.assertEqual(app['localized']['en-US']['name'], name) + def test_insert_triple_t_multiple_metadata(self): namespace = 'ch.admin.bag.covidcertificate.' packages = ('verifier', 'wallet') From 074ea8cae30d871c3c46e58ebd761ffb0721bc3a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 23 Jul 2021 09:38:09 -0700 Subject: [PATCH 0401/2116] metadata: remove unused fields and types BuildVersion and UseBuilt were only ever used in the .txt format, which is gone. --- fdroidserver/metadata.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 320350eb..d0722dc4 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -186,8 +186,6 @@ class App(dict): return Build() -TYPE_UNKNOWN = 0 -TYPE_OBSOLETE = 1 TYPE_STRING = 2 TYPE_BOOL = 3 TYPE_LIST = 4 @@ -202,8 +200,6 @@ fieldtypes = { 'Categories': TYPE_LIST, 'AntiFeatures': TYPE_LIST, 'Build': TYPE_BUILD, - 'BuildVersion': TYPE_OBSOLETE, - 'UseBuilt': TYPE_OBSOLETE, } From 3b95d3de64231fae86f1fb7608166b8d3b291372 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 20 Jul 2021 13:31:27 -0700 Subject: [PATCH 0402/2116] update: AllowedAPKSigningKeys metadata to enforce APK signers This field lets you specify which signing certificates should be trusted for APKs in a binary repo. --- .gitlab-ci.yml | 1 + fdroidserver/metadata.py | 16 +++ fdroidserver/update.py | 46 ++++++++- tests/metadata/dump/com.politedroid.yaml | 1 + tests/metadata/dump/org.adaway.yaml | 1 + .../dump/org.smssecure.smssecure.yaml | 1 + tests/metadata/dump/org.videolan.vlc.yaml | 1 + tests/update.TestCase | 99 +++++++++++++++++++ 8 files changed, 165 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index eae0a7df..3fca1897 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -47,6 +47,7 @@ metadata_v0: - cd fdroiddata - ../tests/dump_internal_metadata_format.py - sed -i + -e '/AllowedAPKSigningKeys:/d' -e '/Liberapay:/d' -e '/OpenCollective/d' metadata/dump_*/*.yaml diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index d0722dc4..12b8e1e5 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -90,6 +90,8 @@ yaml_app_field_order = [ '\n', 'Builds', '\n', + 'AllowedAPKSigningKeys', + '\n', 'MaintainerNotes', '\n', 'ArchivePolicy', @@ -145,6 +147,7 @@ class App(dict): self.RepoType = '' self.Repo = '' self.Binaries = None + self.AllowedAPKSigningKeys = [] self.MaintainerNotes = '' self.ArchivePolicy = None self.AutoUpdateMode = 'None' @@ -199,6 +202,7 @@ fieldtypes = { 'MaintainerNotes': TYPE_MULTILINE, 'Categories': TYPE_LIST, 'AntiFeatures': TYPE_LIST, + 'AllowedAPKSigningKeys': TYPE_LIST, 'Build': TYPE_BUILD, } @@ -433,6 +437,10 @@ valuetypes = { r'^http[s]?://', ["Binaries"]), + FieldValidator("AllowedAPKSigningKeys", + r'^[a-fA-F0-9]{64}$', + ["AllowedAPKSigningKeys"]), + FieldValidator("Archive Policy", r'^[0-9]+ versions$', ["ArchivePolicy"]), @@ -927,6 +935,14 @@ def write_yaml(mf, app): cm.update({field: _builds_to_yaml(app)}) elif field == 'CurrentVersionCode': cm.update({field: _field_to_yaml(TYPE_INT, getattr(app, field))}) + elif field == 'AllowedAPKSigningKeys': + value = getattr(app, field) + if value: + value = [str(i).lower() for i in value] + if len(value) == 1: + cm.update({field: _field_to_yaml(TYPE_STRING, value[0])}) + else: + cm.update({field: _field_to_yaml(TYPE_LIST, value)}) else: cm.update({field: _field_to_yaml(fieldtype(field), getattr(app, field))}) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index c60abfd7..f8b895d8 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -36,6 +36,8 @@ import yaml import copy from datetime import datetime from argparse import ArgumentParser +from pathlib import Path + try: from yaml import CSafeLoader as SafeLoader except ImportError: @@ -51,6 +53,7 @@ from . import metadata from .exception import BuildException, FDroidException from PIL import Image, PngImagePlugin + if hasattr(Image, 'DecompressionBombWarning'): warnings.simplefilter('error', Image.DecompressionBombWarning) Image.MAX_IMAGE_PIXELS = 0xffffff # 4096x4096 @@ -688,7 +691,6 @@ def insert_obbs(repodir, apps, apks): list of current, valid apps apks current information on all APKs - """ def obbWarnDelete(f, msg): logging.warning(msg + ' ' + f) @@ -2223,6 +2225,31 @@ def get_apps_with_packages(apps, apks): return appsWithPackages +def get_apks_without_allowed_signatures(app, apk): + """Check the APK or package has been signed by one of the allowed signing certificates. + + The fingerprint of the signing certificate is the standard X.509 + SHA-256 fingerprint as a hex string. It can be fetched from an + APK using: + + apksigner verify --print-certs my.apk | grep SHA-256 + + Parameters + ---------- + app + The app which declares the AllowedSigningKey + apk + The APK to check + """ + if not app or not apk: + return + allowed_signer_keys = app.get('AllowedAPKSigningKeys', []) + if not allowed_signer_keys: + return + if apk['signer'] not in allowed_signer_keys: + return apk['apkName'] + + def prepare_apps(apps, apks, repodir): """Encapsulate all necessary preparation steps before we can build an index out of apps and apks. @@ -2372,6 +2399,23 @@ def main(): appid_has_apks = set() appid_has_repo_files = set() for apk in apks: + to_remove = get_apks_without_allowed_signatures(apps.get(apk['packageName']), apk) + if to_remove: + apks.remove(apk) + logging.warning( + _('"{path}" is signed by a key that is not allowed:').format( + path=to_remove + ) + + '\n' + + apk['signer'] + ) + if options.delete_unknown: + for d in repodirs: + path = Path(d) / to_remove + if path.exists(): + logging.warning(_('Removing {path}"').format(path=path)) + path.unlink() + if apk['apkName'].endswith('.apk'): appid_has_apks.add(apk['packageName']) else: diff --git a/tests/metadata/dump/com.politedroid.yaml b/tests/metadata/dump/com.politedroid.yaml index 28c089ad..6f83af0a 100644 --- a/tests/metadata/dump/com.politedroid.yaml +++ b/tests/metadata/dump/com.politedroid.yaml @@ -1,3 +1,4 @@ +AllowedAPKSigningKeys: [] AntiFeatures: [] ArchivePolicy: 4 versions AuthorEmail: null diff --git a/tests/metadata/dump/org.adaway.yaml b/tests/metadata/dump/org.adaway.yaml index b5cca8cd..95bca2ce 100644 --- a/tests/metadata/dump/org.adaway.yaml +++ b/tests/metadata/dump/org.adaway.yaml @@ -1,3 +1,4 @@ +AllowedAPKSigningKeys: [] AntiFeatures: [] ArchivePolicy: null AuthorEmail: null diff --git a/tests/metadata/dump/org.smssecure.smssecure.yaml b/tests/metadata/dump/org.smssecure.smssecure.yaml index 4af66030..c30f6c79 100644 --- a/tests/metadata/dump/org.smssecure.smssecure.yaml +++ b/tests/metadata/dump/org.smssecure.smssecure.yaml @@ -1,3 +1,4 @@ +AllowedAPKSigningKeys: [] AntiFeatures: [] ArchivePolicy: null AuthorEmail: null diff --git a/tests/metadata/dump/org.videolan.vlc.yaml b/tests/metadata/dump/org.videolan.vlc.yaml index 89e60be7..c6f928e3 100644 --- a/tests/metadata/dump/org.videolan.vlc.yaml +++ b/tests/metadata/dump/org.videolan.vlc.yaml @@ -1,3 +1,4 @@ +AllowedAPKSigningKeys: [] AntiFeatures: [] ArchivePolicy: 9 versions AuthorEmail: null diff --git a/tests/update.TestCase b/tests/update.TestCase index 72315b98..fd08d6ed 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -62,6 +62,7 @@ DONATION_FIELDS = ('Donate', 'Liberapay', 'OpenCollective') class Options: allow_disabled_algorithms = False clean = False + nosign = False pretty = True rename_apks = False @@ -1026,6 +1027,104 @@ class UpdateTest(unittest.TestCase): self.assertIsNone(apk) self.assertFalse(cachechanged) + def test_get_apks_without_allowed_signatures(self): + """Test when no AllowedAPKSigningKeys is specified""" + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.common.config = config + fdroidserver.common.options = Options + + app = fdroidserver.metadata.App() + knownapks = fdroidserver.common.KnownApks() + apkfile = 'v1.v2.sig_1020.apk' + (skip, apk, cachechanged) = fdroidserver.update.process_apk( + {}, apkfile, 'repo', knownapks, False + ) + + r = fdroidserver.update.get_apks_without_allowed_signatures(app, apk) + self.assertIsNone(r) + + def test_get_apks_without_allowed_signatures_allowed(self): + """Test when the APK matches the specified AllowedAPKSigningKeys""" + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.common.config = config + fdroidserver.common.options = Options + fdroidserver.update.options = fdroidserver.common.options + + app = fdroidserver.metadata.App( + { + 'AllowedAPKSigningKeys': '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6' + } + ) + knownapks = fdroidserver.common.KnownApks() + apkfile = 'v1.v2.sig_1020.apk' + (skip, apk, cachechanged) = fdroidserver.update.process_apk( + {}, apkfile, 'repo', knownapks, False + ) + + r = fdroidserver.update.get_apks_without_allowed_signatures(app, apk) + self.assertIsNone(r) + + def test_get_apks_without_allowed_signatures_blocked(self): + """Test when the APK does not match any specified AllowedAPKSigningKeys""" + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.common.config = config + fdroidserver.common.options = Options + fdroidserver.update.options = fdroidserver.common.options + + app = fdroidserver.metadata.App( + { + 'AllowedAPKSigningKeys': 'fa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edead' + } + ) + knownapks = fdroidserver.common.KnownApks() + apkfile = 'v1.v2.sig_1020.apk' + (skip, apk, cachechanged) = fdroidserver.update.process_apk( + {}, apkfile, 'repo', knownapks, False + ) + + r = fdroidserver.update.get_apks_without_allowed_signatures(app, apk) + self.assertEqual(apkfile, r) + + def test_update_with_AllowedAPKSigningKeys(self): + """Test that APKs without allowed signatures get deleted.""" + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.chdir(testdir) + os.mkdir('repo') + testapk = os.path.join('repo', 'com.politedroid_6.apk') + shutil.copy(os.path.join(self.basedir, testapk), testapk) + os.mkdir('metadata') + metadatafile = os.path.join('metadata', 'com.politedroid.yml') + shutil.copy(os.path.join(self.basedir, metadatafile), metadatafile) + with open(metadatafile, 'a') as fp: + fp.write( + '\n\nAllowedAPKSigningKeys: 32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6\n' + ) + + fdroidserver.common.options = Options + config = fdroidserver.common.read_config(fdroidserver.common.options) + config['repo_keyalias'] = 'sova' + config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' + config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' + config['keystore'] = os.path.join(self.basedir, 'keystore.jks') + + self.assertTrue(os.path.exists(testapk)) + with mock.patch('sys.argv', ['fdroid update', '--delete-unknown']): + fdroidserver.update.main() + self.assertTrue(os.path.exists(testapk)) + + with open(metadatafile, 'a') as fp: + fp.write( + '\n\nAllowedAPKSigningKeys: fa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edead\n' + ) + with mock.patch('sys.argv', ['fdroid update', '--delete-unknown']): + fdroidserver.update.main() + self.assertFalse(os.path.exists(testapk)) + def test_translate_per_build_anti_features(self): os.chdir(os.path.join(localmodule, 'tests')) testdir = tempfile.mkdtemp( From a56d377c9e1ffb3484e747317c5831b476816f8d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 23 Jul 2021 10:16:56 -0700 Subject: [PATCH 0403/2116] update: modernize options handling in tests This moves everything to the Options class, and resets the options between test runs. --- tests/update.TestCase | 57 ++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/tests/update.TestCase b/tests/update.TestCase index fd08d6ed..092850aa 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -62,9 +62,11 @@ DONATION_FIELDS = ('Donate', 'Liberapay', 'OpenCollective') class Options: allow_disabled_algorithms = False clean = False + delete_unknown = False nosign = False pretty = True rename_apks = False + verbose = False class UpdateTest(unittest.TestCase): @@ -83,11 +85,13 @@ class UpdateTest(unittest.TestCase): os.makedirs(self.tmpdir) os.chdir(self.basedir) + fdroidserver.common.config = None + fdroidserver.common.options = None + def testInsertStoreMetadata(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.update.config = config - fdroidserver.update.options = fdroidserver.common.options os.chdir(os.path.join(localmodule, 'tests')) shutil.rmtree(os.path.join('repo', 'info.guardianproject.urzip'), ignore_errors=True) @@ -194,11 +198,10 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.config = config fdroidserver.update.config = config os.chdir(os.path.join(localmodule, 'tests')) - fdroidserver.update.options = type('', (), {})() + fdroidserver.common.options = Options + fdroidserver.update.options = fdroidserver.common.options fdroidserver.update.options.clean = True fdroidserver.update.options.delete_unknown = True - fdroidserver.update.options.rename_apks = False - fdroidserver.update.options.allow_disabled_algorithms = False apps = fdroidserver.metadata.read_metadata() knownapks = fdroidserver.common.KnownApks() @@ -248,6 +251,7 @@ class UpdateTest(unittest.TestCase): {'packageName': 'apks', 'name': 'fromapk2', 'versionCode': 2}, {'packageName': 'apks', 'name': testvalue, 'versionCode': 3}, ] + fdroidserver.common.options = Options fdroidserver.update.insert_missing_app_names_from_apks(apps, apks) for appid, app in apps.items(): if appid == 'none': @@ -277,11 +281,10 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config - fdroidserver.update.options = type('', (), {})() + fdroidserver.common.options = Options + fdroidserver.update.options = fdroidserver.common.options fdroidserver.update.options.clean = True fdroidserver.update.options.delete_unknown = True - fdroidserver.update.options.rename_apks = False - fdroidserver.update.options.allow_disabled_algorithms = False apps = fdroidserver.metadata.read_metadata() knownapks = fdroidserver.common.KnownApks() @@ -349,7 +352,6 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config - fdroidserver.update.options = fdroidserver.common.options os.chdir(tmptestsdir) apps = fdroidserver.metadata.read_metadata() @@ -382,7 +384,6 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config - fdroidserver.update.options = fdroidserver.common.options apps = fdroidserver.metadata.read_metadata() self.assertTrue(packageName in apps) @@ -484,6 +485,7 @@ class UpdateTest(unittest.TestCase): # config needed to use jarsigner and keytool config = dict() fdroidserver.common.fill_config_defaults(config) + fdroidserver.common.options = Options fdroidserver.update.config = config apkfile = 'urzip.apk' sig = self.javagetsig(apkfile) @@ -575,11 +577,10 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.config = config fdroidserver.update.config = config - fdroidserver.update.options = type('', (), {})() + fdroidserver.common.options = Options + fdroidserver.update.options = fdroidserver.common.options fdroidserver.update.options.clean = True fdroidserver.update.options.delete_unknown = True - fdroidserver.update.options.rename_apks = False - fdroidserver.update.options.allow_disabled_algorithms = False apps = fdroidserver.metadata.read_metadata() knownapks = fdroidserver.common.KnownApks() @@ -634,11 +635,10 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.config = config fdroidserver.update.config = config - fdroidserver.update.options = type('', (), {})() + fdroidserver.common.options = Options + fdroidserver.update.options = fdroidserver.common.options fdroidserver.update.options.clean = True fdroidserver.update.options.delete_unknown = True - fdroidserver.update.options.rename_apks = False - fdroidserver.update.options.allow_disabled_algorithms = False fdroidserver.metadata.read_metadata() knownapks = fdroidserver.common.KnownApks() @@ -695,7 +695,7 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config - fdroidserver.update.options = Options + fdroidserver.common.options = Options os.chdir(os.path.join(localmodule, 'tests')) apps = fdroidserver.metadata.read_metadata() knownapks = fdroidserver.common.KnownApks() @@ -707,7 +707,7 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config - fdroidserver.update.options = Options + fdroidserver.common.options = Options os.chdir(os.path.join(localmodule, 'tests')) apps = fdroidserver.metadata.read_metadata() knownapks = fdroidserver.common.KnownApks() @@ -856,11 +856,11 @@ class UpdateTest(unittest.TestCase): config['ndk_paths'] = dict() fdroidserver.common.config = config fdroidserver.update.config = config - fdroidserver.update.options = type('', (), {})() + + fdroidserver.common.options = Options + fdroidserver.update.options = fdroidserver.common.options fdroidserver.update.options.clean = True - fdroidserver.update.options.rename_apks = False fdroidserver.update.options.delete_unknown = True - fdroidserver.update.options.allow_disabled_algorithms = False for icon_dir in fdroidserver.update.get_all_icon_dirs('repo'): if not os.path.exists(icon_dir): @@ -918,12 +918,11 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.config = config fdroidserver.update.config = config - fdroidserver.update.options = type('', (), {})() + fdroidserver.common.options = Options + fdroidserver.update.options = fdroidserver.common.options fdroidserver.update.options.clean = True fdroidserver.update.options.verbose = True - fdroidserver.update.options.rename_apks = False fdroidserver.update.options.delete_unknown = True - fdroidserver.update.options.allow_disabled_algorithms = False knownapks = fdroidserver.common.KnownApks() @@ -1015,6 +1014,7 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config + fdroidserver.common.options = Options fdroidserver.update.options = fdroidserver.common.options fdroidserver.update.options.delete_unknown = False @@ -1139,11 +1139,10 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.config = config fdroidserver.update.config = config - fdroidserver.update.options = type('', (), {})() + fdroidserver.common.options = Options + fdroidserver.update.options = fdroidserver.common.options fdroidserver.update.options.clean = True fdroidserver.update.options.delete_unknown = True - fdroidserver.update.options.rename_apks = False - fdroidserver.update.options.allow_disabled_algorithms = False apps = fdroidserver.metadata.read_metadata() knownapks = fdroidserver.common.KnownApks() @@ -1175,11 +1174,9 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.config = config fdroidserver.update.config = config - fdroidserver.update.options = type('', (), {})() + fdroidserver.common.options = Options + fdroidserver.update.options = fdroidserver.common.options fdroidserver.update.options.clean = True - fdroidserver.update.options.delete_unknown = False - fdroidserver.update.options.rename_apks = False - fdroidserver.update.options.allow_disabled_algorithms = False knownapks = fdroidserver.common.KnownApks() apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False) From cacbe88b8c2211b0623bd400a7f7641d0c5c1431 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 3 Aug 2021 11:38:24 +0200 Subject: [PATCH 0404/2116] Don't fail fdroid update on empty repository Steps to reproduce: $ git init $ fdroid update --create-key --- fdroidserver/common.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 55f02955..b538dd85 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -892,7 +892,10 @@ def write_status_json(output, pretty=False, name=None): def get_head_commit_id(git_repo): """Get git commit ID for HEAD as a str.""" - return git_repo.head.commit.hexsha + try: + return git_repo.head.commit.hexsha + except ValueError: + return "None" def setup_vcs(app): From 3283ce2510ce79a1f64d4535aa39a2a7d9271e91 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 9 Aug 2021 16:22:49 +0200 Subject: [PATCH 0405/2116] import: fix error when using python3-git from stretch closes https://gitlab.com/fdroid/issuebot/-/issues/48#note_646592031 closes issuebot#48 --- fdroidserver/import.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fdroidserver/import.py b/fdroidserver/import.py index 081ade9f..adf18252 100644 --- a/fdroidserver/import.py +++ b/fdroidserver/import.py @@ -254,7 +254,10 @@ def main(): sys.exit(1) elif tmp_importer_dir: # For Windows: Close the repo or a git.exe instance holds handles to repo - git_repo.close() + try: + git_repo.close() + except AttributeError: # Debian/stretch's version does not have close() + pass # TODO: Python3.9: Accepts a path-like object for both src and dst. shutil.move(str(tmp_importer_dir), str(build_dir)) Path('build/.fdroidvcs-' + appid).write_text(app.RepoType + ' ' + app.Repo) From fde48a1e7765d66fd453210756c838e497724b84 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sat, 21 Aug 2021 08:21:41 +0200 Subject: [PATCH 0406/2116] [checkupdates] Warn if no version in latest tag --- fdroidserver/checkupdates.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 9b0a0bb4..750d8c92 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -202,6 +202,12 @@ def check_tags(app, pattern): hver = version if hver: + if htag != tags[0]: + logging.info( + "{appid}: latest tag {tag} does not contain highest version {version}".format( + appid=app.id, tag=tags[0], version=hver + ) + ) try: commit = vcs.getref(htag) if commit: From 51d161d69a4797dc2b866d7f0d328e17699389b8 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Sat, 21 Aug 2021 19:29:30 +0000 Subject: [PATCH 0407/2116] gradle v7.2 --- gradlew-fdroid | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 903be9d8..4ac6be2a 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -163,11 +163,13 @@ get_sha() { '6.8.2') echo '8de6efc274ab52332a9c820366dd5cf5fc9d35ec7078fd70c8ec6913431ee610' ;; '6.8.3') echo '7faa7198769f872826c8ef4f1450f839ec27f0b4d5d1e51bade63667cbccd205' ;; '6.9') echo '765442b8069c6bee2ea70713861c027587591c6b1df2c857a23361512560894e' ;; + '6.9.1') echo '8c12154228a502b784f451179846e518733cf856efc7d45b2e6691012977b2fe' ;; '7.0') echo 'eb8b89184261025b0430f5b2233701ff1377f96da1ef5e278af6ae8bac5cc305' ;; '7.0.1') echo 'dccda8aa069563c8ba2f6cdfd0777df0e34a5b4d15138ca8b9757e94f4e8a8cb' ;; '7.0.2') echo '0e46229820205440b48a5501122002842b82886e76af35f0f3a069243dca4b3c' ;; '7.1') echo '2debee19271e1b82c6e41137d78e44e6e841035230a1a169ca47fd3fb09ed87b' ;; '7.1.1') echo 'bf8b869948901d422e9bb7d1fa61da6a6e19411baa7ad6ee929073df85d6365d' ;; + '7.2') echo 'f581709a9c35e9cb92e16f585d2c4bc99b2b1a5f85d2badbd3dc6bff59e1e6dd' ;; *) exit 1 esac } @@ -188,7 +190,7 @@ d_plugin_k=(4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 d_plugin_v=(6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(7.1.1 7.1 7.0.2 7.0.1 7.0 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 54bc6f05de2ab13dc23187889df63d65c83d1b6d Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Mon, 23 Aug 2021 10:48:53 +0000 Subject: [PATCH 0408/2116] Android NDK None (None) --- fdroidserver/common.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index b538dd85..86dfb4dd 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4531,6 +4531,12 @@ NDKS = [ "revision": "22.1.7171670", "sha256": "ac3a0421e76f71dd330d0cd55f9d99b9ac864c4c034fc67e0d671d022d4e806b", "url": "https://dl.google.com/android/repository/android-ndk-r22b-linux-x86_64.zip" + }, + { + "release": "r23", + "revision": "23.0.7599858", + "sha256": "e3eacf80016b91d4cd2c8ca9f34eebd32df912bb799c859cc5450b6b19277b4f", + "url": "https://dl.google.com/android/repository/android-ndk-r23-linux.zip" } ] From b62124853a860499175a277cb7c740555e838f2e Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 18 Aug 2021 08:08:08 +0200 Subject: [PATCH 0409/2116] Remove waring about no config file fdroid works fine without a config so there is no reason to warn about it. --- fdroidserver/common.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 86dfb4dd..a11a82e6 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -370,8 +370,6 @@ def read_config(opts=None): with io.open(old_config_file, "rb") as fp: code = compile(fp.read(), old_config_file, 'exec') exec(code, None, config) # nosec TODO automatically migrate - else: - logging.warning(_("No config.yml found, using defaults.")) for k in ('mirrors', 'install_list', 'uninstall_list', 'serverwebroot', 'servergitroot'): if k in config: From 83e16422a59cc9952d45ce17bd68109e9df9e5a6 Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Mon, 16 Aug 2021 10:46:18 +0200 Subject: [PATCH 0410/2116] Update README.md Add F-Droid icon, redesign, misc fixes --- README.md | 100 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 60 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index e51a403e..c96dc872 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,22 @@ - - -| CI Builds | fdroidserver | buildserver | fdroid build --all | publishing tools | -|--------------------------|:-------------:|:-----------:|:------------------:|:----------------:| -| GNU/Linux | [![fdroidserver status on GNU/Linux](https://gitlab.com/fdroid/fdroidserver/badges/master/pipeline.svg)](https://gitlab.com/fdroid/fdroidserver/-/jobs) | [![buildserver status](https://jenkins.debian.net/job/reproducible_setup_fdroid_build_environment/badge/icon)](https://jenkins.debian.net/job/reproducible_setup_fdroid_build_environment) | [![fdroid build all status](https://jenkins.debian.net/job/reproducible_fdroid_build_apps/badge/icon)](https://jenkins.debian.net/job/reproducible_fdroid_build_apps/) | [![fdroid test status](https://jenkins.debian.net/job/reproducible_fdroid_test/badge/icon)](https://jenkins.debian.net/job/reproducible_fdroid_test/) | -| macOS | [![fdroidserver status on macOS](https://travis-ci.org/f-droid/fdroidserver.svg?branch=master)](https://travis-ci.org/f-droid/fdroidserver) | | | | +
+

# F-Droid Server +### Server tools for maintaining an F-Droid repository system. -Server for [F-Droid](https://f-droid.org), the Free Software repository system -for Android. +
+ +--- + +## What is F-Droid? + +F-Droid is an installable catalogue of FOSS (Free and Open Source Software) +applications for the Android platform. The client makes it easy to browse, +install, and keep track of updates on your device. + + +## What is F-Droid Server? The F-Droid server tools provide various scripts and tools that are used to maintain the main @@ -18,19 +25,20 @@ can use these same tools to create your own additional or alternative repository for publishing, or to assist in creating, testing and submitting metadata to the main repository. -For documentation, please see , or you can +For documentation, please see , or you can find the source for the documentation in [fdroid/fdroid-website](https://gitlab.com/fdroid/fdroid-website). -### What is F-Droid? +## CI/CD status -F-Droid is an installable catalogue of FOSS (Free and Open Source Software) -applications for the Android platform. The client makes it easy to browse, -install, and keep track of updates on your device. +| | fdroidserver | buildserver | fdroid build --all | publishing tools | +|--------------------------|:-------------:|:-----------:|:------------------:|:----------------:| +| GNU/Linux | [![fdroidserver status on GNU/Linux](https://gitlab.com/fdroid/fdroidserver/badges/master/pipeline.svg)](https://gitlab.com/fdroid/fdroidserver/-/jobs) | [![buildserver status](https://jenkins.debian.net/job/reproducible_setup_fdroid_build_environment/badge/icon)](https://jenkins.debian.net/job/reproducible_setup_fdroid_build_environment) | [![fdroid build all status](https://jenkins.debian.net/job/reproducible_fdroid_build_apps/badge/icon)](https://jenkins.debian.net/job/reproducible_fdroid_build_apps/) | [![fdroid test status](https://jenkins.debian.net/job/reproducible_fdroid_test/badge/icon)](https://jenkins.debian.net/job/reproducible_fdroid_test/) | +| macOS | [![fdroidserver status on macOS](https://travis-ci.org/f-droid/fdroidserver.svg?branch=master)](https://travis-ci.org/f-droid/fdroidserver) | | | | -### Installing +## Installing There are many ways to install _fdroidserver_, they are documented on the website: @@ -39,35 +47,33 @@ https://f-droid.org/docs/Installing_the_Server_and_Repo_Tools All sorts of other documentation lives there as well. -### Tests +## Tests -There are many components to all of the tests for the components in -this git repo. The most commonly used parts of well tested, while +There are many components to all the tests for the components in +this git repository. The most commonly used parts of well tested, while some parts still lack tests. This test suite has built over time a bit haphazardly, so it is not as clean, organized, or complete as it could be. We welcome contributions. Before rearchitecting any parts of it, be sure to [contact us](https://f-droid.org/about) to discuss the changes beforehand. - -#### `fdroid` commands +### `fdroid` commands The test suite for all of the `fdroid` commands is in the _tests/_ subdir. _.gitlab-ci.yml_ and _.travis.yml_ run this test suite on various configurations. -* _tests/run-tests_ runs the whole test suite -* _tests/*.TestCase_ are individual unit tests for all of the `fdroid` +- _tests/run-tests_ runs the whole test suite +- _tests/*.TestCase_ are individual unit tests for all of the `fdroid` commands, which can be run separately, e.g. `./update.TestCase`. -* run one test: `tests/common.TestCase CommonTest.test_get_apk_id` +- run one test: `tests/common.TestCase CommonTest.test_get_apk_id` - -#### Additional tests for different linux distributions +### Additional tests for different linux distributions These tests are also run on various distributions through GitLab CI. This is -only enabled for `master@fdroid/fdroidserver` because it'll take longer to +only enabled for `master@fdroid/fdroidserver` because it takes longer to complete than the regular CI tests. Most of the time you won't need to worry -about them but sometimes it might make sense to also run them for your merge +about them, but sometimes it might make sense to also run them for your merge request. In that case you need to remove [these lines from .gitlab-ci.yml](https://gitlab.com/fdroid/fdroidserver/blob/master/.gitlab-ci.yml#L34-35) and push this to a new branch of your fork. @@ -76,26 +82,19 @@ Alternatively [run them locally](https://docs.gitlab.com/runner/commands/README.html#gitlab-runner-exec) like this: `gitlab-runner exec docker ubuntu_lts` -#### buildserver +### Buildserver The tests for the whole build server setup are entirely separate -because they require at least 200GB of disk space, and 8GB of +because they require at least 200 GB of disk space, and 8 GB of RAM. These test scripts are in the root of the project, all starting with _jenkins-_ since they are run on https://jenkins.debian.net. -### Translation +## Documentation -Everything can be translated. See -[Translation and Localization](https://f-droid.org/docs/Translation_and_Localization) -for more info. - -[![translation status](https://hosted.weblate.org/widgets/f-droid/-/fdroidserver/multi-auto.svg)](https://hosted.weblate.org/engage/f-droid/?utm_source=widget) - - -### Documentation - -The API documentation based on the docstrings gets automatically published [here](http://fdroid.gitlab.io/fdroidserver/) on every commit on the `master` branch. +The API documentation based on the docstrings gets automatically +published [here](https://fdroid.gitlab.io/fdroidserver) on every commit +on the `master` branch. It can be built locally via @@ -112,4 +111,25 @@ To additionally lint the code call pydocstyle fdroidserver --count ``` -When writing docstrings you should follow the [numpy style guide](https://numpydoc.readthedocs.io/en/latest/format.html). \ No newline at end of file +When writing docstrings you should follow the +[numpy style guide](https://numpydoc.readthedocs.io/en/latest/format.html). + + +## Translation + +Everything can be translated. See +[Translation and Localization](https://f-droid.org/docs/Translation_and_Localization) +for more info. + +
+ +[![](https://hosted.weblate.org/widgets/f-droid/-/287x66-white.png)](https://hosted.weblate.org/engage/f-droid) + +
+View translation status for all languages. + +[![](https://hosted.weblate.org/widgets/f-droid/-/fdroidserver/multi-auto.svg)](https://hosted.weblate.org/engage/f-droid/?utm_source=widget) + +
+ +
From e1a67c9d9763c0abcd19cde6f0c87cb57f907bde Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 23 Aug 2021 22:48:14 +0200 Subject: [PATCH 0411/2116] [makebuildserver] run dpkg with --force-confdef There has been a whitespace change in the accessibility.properties configuration file as part of the openjdk-8-jre-headless 8u302-b08-1~deb9u1 version. As we modified the file, this broke makebuildserver, asking for confirmation. --- buildserver/provision-apt-get-install | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index 070fb6b3..114101eb 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -27,6 +27,10 @@ Dpkg::Use-Pty "0"; quiet "1"; EOF +cat < /etc/apt/apt.conf.d/99confdef +Dpkg::Options { "--force-confdef"; }; +EOF + if echo $debian_mirror | grep '^https' 2>&1 > /dev/null; then apt-get update || apt-get update apt-get install apt-transport-https ca-certificates From 779a592ea08031ddb4ff100e531eb6ed9a7682a8 Mon Sep 17 00:00:00 2001 From: "Felix C. Stegerman" Date: Wed, 25 Aug 2021 14:51:20 +0200 Subject: [PATCH 0412/2116] [buildserver] run update again after upgrade --- buildserver/provision-apt-get-install | 3 +++ 1 file changed, 3 insertions(+) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index 114101eb..d0b903e2 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -52,6 +52,9 @@ apt-get update || apt-get update apt-get upgrade --download-only apt-get upgrade +# again after upgrade in case of keyring changes +apt-get update || apt-get update + packages=" androguard/stretch-backports ant From 23b0b6bcaf2d18d3beedc2928bcce061b756b368 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 27 Aug 2021 08:05:28 +0200 Subject: [PATCH 0413/2116] Deploy build error log in case of an exception This happened with us.spotco.fennec_dos_2912000 where no build log was saved in the repo but the wiki has an error text. The error text was: "Command '['rsync', '--recursive', '--perms', '--links', '--quiet', '--rsh=ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=FATAL -o IdentitiesOnly=yes -o PasswordAuthentication=no -p 2222 -i /home/fbuild/.vagrant.d/boxes/buildserver/0/virtualbox/vagrant_private_key', 'build/srclib/MozFennec', 'vagrant@127.0.0.1:/home/vagrant/build/srclib']' returned non-zero exit status 255." Which is generated by the rsync subprocess call in build_server(). I assume that it threw an Exception (not an FdroidException, because the string "Build completed at" is not in the wiki site) that was caught in main(). --- fdroidserver/build.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index b507bb3a..48983556 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -1228,6 +1228,7 @@ def main(): common.force_exit(1) add_failed_builds_entry(failed_builds, appid, build, e) wikilog = e.get_wikitext() + common.deploy_build_log_with_rsync(appid, build.versionCode, str(e)) except Exception as e: logging.error("Could not build app %s due to unknown error: %s" % ( appid, traceback.format_exc())) @@ -1236,6 +1237,7 @@ def main(): common.force_exit(1) add_failed_builds_entry(failed_builds, appid, build, e) wikilog = str(e) + common.deploy_build_log_with_rsync(appid, build.versionCode, str(e)) if options.wiki and wikilog: try: From 72df2639a2902851f341c0f621be921f312046a8 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 27 Aug 2021 13:27:42 +0200 Subject: [PATCH 0414/2116] Log traceback with exception --- fdroidserver/build.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 48983556..37cc6989 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -1212,7 +1212,9 @@ def main(): common.force_exit(1) add_failed_builds_entry(failed_builds, appid, build, vcse) wikilog = str(vcse) - common.deploy_build_log_with_rsync(appid, build.versionCode, str(vcse)) + common.deploy_build_log_with_rsync( + appid, build.versionCode, "".join(traceback.format_exc()) + ) except FDroidException as e: with open(os.path.join(log_dir, appid + '.log'), 'a+') as f: f.write('\n\n============================================================\n') @@ -1228,7 +1230,9 @@ def main(): common.force_exit(1) add_failed_builds_entry(failed_builds, appid, build, e) wikilog = e.get_wikitext() - common.deploy_build_log_with_rsync(appid, build.versionCode, str(e)) + common.deploy_build_log_with_rsync( + appid, build.versionCode, "".join(traceback.format_exc()) + ) except Exception as e: logging.error("Could not build app %s due to unknown error: %s" % ( appid, traceback.format_exc())) @@ -1237,7 +1241,9 @@ def main(): common.force_exit(1) add_failed_builds_entry(failed_builds, appid, build, e) wikilog = str(e) - common.deploy_build_log_with_rsync(appid, build.versionCode, str(e)) + common.deploy_build_log_with_rsync( + appid, build.versionCode, "".join(traceback.format_exc()) + ) if options.wiki and wikilog: try: From 2b41dffcb292500e5e96e8474d3645b6d79c7689 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 7 Sep 2021 16:17:56 +0200 Subject: [PATCH 0415/2116] Provide verbose output with --verbose 23b0b6bc added logging in case of an FDroidException on the build server. This broke the log of apps that fail to build. Prior to 23b0b6bc a failing build in the VM triggered a BuildException on the server side but the build output was written to the log in the finally part of build_server(). After 23b0b6bc the finally part writs the build as well but the BuildException is caught in main() and the build log is overwritten with the empty exception content. This patch always adds the build log to the exception so it is written to the log. Closes: #882 --- fdroidserver/build.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 37cc6989..9e6b2f36 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -266,7 +266,7 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): else: message = "Build.py failed on server for {0}:{1}" raise BuildException(message.format(app.id, build.versionName), - None if options.verbose else str(output, 'utf-8')) + str(output, 'utf-8')) # Retreive logs... toolsversion_log = common.get_toolsversion_logname(app, build) @@ -292,7 +292,7 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): except Exception: raise BuildException( "Build failed for {0}:{1} - missing output files".format( - app.id, build.versionName), None if options.verbose else str(output, 'utf-8')) + app.id, build.versionName), str(output, 'utf-8')) ftp.close() finally: From 28098c32e3121369bb413465bb92156419c864d7 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sat, 14 Aug 2021 12:44:41 +0200 Subject: [PATCH 0416/2116] Support ruamel from Debian stretch --- fdroidserver/metadata.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 12b8e1e5..1cf5eb96 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -982,9 +982,12 @@ def write_yaml(mf, app): return builds yaml_app = _app_to_yaml(app) - yaml = ruamel.yaml.YAML() - yaml.indent(mapping=4, sequence=4, offset=2) - yaml.dump(yaml_app, stream=mf) + try: + yaml = ruamel.yaml.YAML() + yaml.indent(mapping=4, sequence=4, offset=2) + yaml.dump(yaml_app, stream=mf) + except AttributeError: # Debian/stretch's version does not have YAML() + ruamel.yaml.round_trip_dump(yaml_app, mf, indent=4, block_seq_indent=2) build_line_sep = re.compile(r'(? Date: Mon, 23 Aug 2021 12:45:03 +0200 Subject: [PATCH 0417/2116] index: do not include GitLab Pages mirror if it can't be deployed GitLab Pages sites are limited to 1GB on gitlab.com, so the CI/CD job will fail if the repo is bigger than that. It should not be included as a mirror in that case. https://docs.gitlab.com/ee/user/gitlab_com/#gitlab-pages --- fdroidserver/common.py | 11 +++++++++++ fdroidserver/index.py | 29 ++++++++++++++++++++--------- tests/index.TestCase | 25 +++++++++++++++++-------- 3 files changed, 48 insertions(+), 17 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index a11a82e6..e0aced08 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -111,6 +111,10 @@ MAX_VERSION_CODE = 0x7fffffff # Java's Integer.MAX_VALUE (2147483647) XMLNS_ANDROID = '{http://schemas.android.com/apk/res/android}' +# https://docs.gitlab.com/ee/user/gitlab_com/#gitlab-pages +GITLAB_COM_PAGES_MAX_SIZE = 1000000000 + + config = None options = None env = None @@ -478,6 +482,13 @@ def parse_human_readable_size(size): return int(float(m.group("value")) * units[m.group("unit")]) +def get_dir_size(path_or_str): + """Get the total size of all files in the given directory.""" + if isinstance(path_or_str, str): + path_or_str = Path(path_or_str) + return sum(f.stat().st_size for f in path_or_str.glob('**/*') if f.is_file()) + + def assert_config_keystore(config): """Check weather keystore is configured correctly and raise exception if not.""" nosigningkey = False diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 01930409..380bebb4 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -1003,11 +1003,19 @@ def get_mirror_service_urls(url): """Get direct URLs from git service for use by fdroidclient. Via 'servergitmirrors', fdroidserver can create and push a mirror - to certain well known git services like gitlab or github. This + to certain well known git services like GitLab or GitHub. This will always use the 'master' branch since that is the default branch in git. The files are then accessible via alternate URLs, where they are served in their raw format via a CDN rather than from git. + + Both of the GitLab URLs will work with F-Droid, but only the + GitLab Pages will work in the browser This is because the "raw" + URLs are not served with the correct mime types, so any index.html + which is put in the repo will not be rendered. Putting an + index.html file in the repo root is a common way for to make + information about the repo available to end user. + """ if url.startswith('git@'): url = re.sub(r'^git@([^:]+):(.+)', r'https://\1/\2', url) @@ -1030,14 +1038,17 @@ def get_mirror_service_urls(url): segments.extend([branch, folder]) urls.append('/'.join(segments)) elif hostname == "gitlab.com": - # Both these Gitlab URLs will work with F-Droid, but only the first will work in the browser - # This is because the `raw` URLs are not served with the correct mime types, so any - # index.html which is put in the repo will not be rendered. Putting an index.html file in - # the repo root is a common way for to make information about the repo available to end user. - - # Gitlab-like Pages segments "https://user.gitlab.io/repo/folder" - gitlab_pages = ["https:", "", user + ".gitlab.io", repo, folder] - urls.append('/'.join(gitlab_pages)) + if common.get_dir_size() <= common.GITLAB_COM_PAGES_MAX_SIZE: + # Gitlab-like Pages segments "https://user.gitlab.io/repo/folder" + gitlab_pages = ["https:", "", user + ".gitlab.io", repo, folder] + urls.append('/'.join(gitlab_pages)) + else: + logging.warning( + _( + 'Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!' + ) + % (common.GITLAB_COM_PAGES_MAX_SIZE / 1000000000) + ) # GitLab Raw "https://gitlab.com/user/repo/-/raw/branch/folder" gitlab_raw = segments + ['-', 'raw', branch, folder] urls.append('/'.join(gitlab_raw)) diff --git a/tests/index.TestCase b/tests/index.TestCase index e9220a23..f399f8fc 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -358,7 +358,7 @@ class IndexTest(unittest.TestCase): ) self.assertTrue(os.path.exists(os.path.join('repo', 'index.xml'))) - def test_get_mirror_service_urls(self): + def test_github_get_mirror_service_urls(self): for url in [ 'git@github.com:foo/bar', 'git@github.com:foo/bar.git', @@ -370,19 +370,28 @@ class IndexTest(unittest.TestCase): fdroidserver.index.get_mirror_service_urls(url), ) + def test_gitlab_get_mirror_service_urls(self): for url in [ 'git@gitlab.com:group/project', 'git@gitlab.com:group/project.git', 'https://gitlab.com/group/project', 'https://gitlab.com/group/project.git', ]: - self.assertEqual( - [ - 'https://group.gitlab.io/project/fdroid', - 'https://gitlab.com/group/project/-/raw/master/fdroid', - ], - fdroidserver.index.get_mirror_service_urls(url), - ) + with patch('fdroidserver.common.get_dir_size', return_value=100000): + self.assertEqual( + [ + 'https://group.gitlab.io/project/fdroid', + 'https://gitlab.com/group/project/-/raw/master/fdroid', + ], + fdroidserver.index.get_mirror_service_urls(url), + ) + with patch('fdroidserver.common.get_dir_size', return_value=1234567890): + self.assertEqual( + [ + 'https://gitlab.com/group/project/-/raw/master/fdroid', + ], + fdroidserver.index.get_mirror_service_urls(url), + ) def test_make_website(self): tmptestsdir = tempfile.mkdtemp( From 53ff7de445711b08cd6ae579ce058b0d32a47767 Mon Sep 17 00:00:00 2001 From: "Felix C. Stegerman" Date: Sat, 11 Sep 2021 17:15:44 +0200 Subject: [PATCH 0418/2116] build: run vcs.initsubmodules() on host as well otherwise, e.g. triple-t metadata in a submodule will not be available on the host and thus not be used at all --- fdroidserver/build.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 9e6b2f36..13c651ce 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -879,6 +879,10 @@ def trybuild(app, build, build_dir, output_dir, log_dir, also_check_dir, # grabbing the source now. vcs.gotorevision(build.commit, refresh) + # Initialise submodules if required + if build.submodules: + vcs.initsubmodules() + build_server(app, build, vcs, build_dir, output_dir, log_dir, force) else: build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, extlib_dir, tmp_dir, force, onserver, refresh) From 6bd8470d55ab49560716afbbf6f74b896235ef61 Mon Sep 17 00:00:00 2001 From: "Felix C. Stegerman" Date: Sun, 12 Sep 2021 22:40:50 +0000 Subject: [PATCH 0419/2116] find_sdk_tools_cmd(): s/found/not found/ in error message --- fdroidserver/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index e0aced08..bd05f3a2 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -589,7 +589,7 @@ def find_sdk_tools_cmd(cmd): return path # did not find the command, exit with error message test_sdk_exists(config) # ignore result so None is never returned - raise FDroidException(_("Android SDK tool {cmd} found!").format(cmd=cmd)) + raise FDroidException(_("Android SDK tool {cmd} not found!").format(cmd=cmd)) def test_aapt_version(aapt): From 0783f97bedf5438c339098b77c87676cb094732f Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sat, 11 Sep 2021 18:00:52 +0200 Subject: [PATCH 0420/2116] Fix get_dir_size call Regression of 7987c746. --- fdroidserver/index.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 380bebb4..35cf9d06 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -1038,7 +1038,7 @@ def get_mirror_service_urls(url): segments.extend([branch, folder]) urls.append('/'.join(segments)) elif hostname == "gitlab.com": - if common.get_dir_size() <= common.GITLAB_COM_PAGES_MAX_SIZE: + if common.get_dir_size(folder) <= common.GITLAB_COM_PAGES_MAX_SIZE: # Gitlab-like Pages segments "https://user.gitlab.io/repo/folder" gitlab_pages = ["https:", "", user + ".gitlab.io", repo, folder] urls.append('/'.join(gitlab_pages)) From 8ea154c1252333b64eb630de612e172fd8ce36dd Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 13 Sep 2021 13:18:21 +0200 Subject: [PATCH 0421/2116] fix IndexTest.test_gitlab_get_mirror_service_urls This makes it actually call the method rather than mocking it. --- tests/index.TestCase | 47 ++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/tests/index.TestCase b/tests/index.TestCase index f399f8fc..0c8b80ab 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -27,6 +27,7 @@ import fdroidserver.net import fdroidserver.signindex import fdroidserver.publish from testcommon import TmpCwd +from pathlib import Path GP_FINGERPRINT = 'B7C2EEFD8DAC7806AF67DFCD92EB18126BC08312A7F2D6F3862E46013C7A6135' @@ -371,27 +372,31 @@ class IndexTest(unittest.TestCase): ) def test_gitlab_get_mirror_service_urls(self): - for url in [ - 'git@gitlab.com:group/project', - 'git@gitlab.com:group/project.git', - 'https://gitlab.com/group/project', - 'https://gitlab.com/group/project.git', - ]: - with patch('fdroidserver.common.get_dir_size', return_value=100000): - self.assertEqual( - [ - 'https://group.gitlab.io/project/fdroid', - 'https://gitlab.com/group/project/-/raw/master/fdroid', - ], - fdroidserver.index.get_mirror_service_urls(url), - ) - with patch('fdroidserver.common.get_dir_size', return_value=1234567890): - self.assertEqual( - [ - 'https://gitlab.com/group/project/-/raw/master/fdroid', - ], - fdroidserver.index.get_mirror_service_urls(url), - ) + with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): + os.mkdir('fdroid') + with Path('fdroid/placeholder').open('w') as fp: + fp.write(' ') + for url in [ + 'git@gitlab.com:group/project', + 'git@gitlab.com:group/project.git', + 'https://gitlab.com/group/project', + 'https://gitlab.com/group/project.git', + ]: + with patch('fdroidserver.common.GITLAB_COM_PAGES_MAX_SIZE', 1000): + self.assertEqual( + [ + 'https://group.gitlab.io/project/fdroid', + 'https://gitlab.com/group/project/-/raw/master/fdroid', + ], + fdroidserver.index.get_mirror_service_urls(url), + ) + with patch('fdroidserver.common.GITLAB_COM_PAGES_MAX_SIZE', 10): + self.assertEqual( + [ + 'https://gitlab.com/group/project/-/raw/master/fdroid', + ], + fdroidserver.index.get_mirror_service_urls(url), + ) def test_make_website(self): tmptestsdir = tempfile.mkdtemp( From adbd7ba75768a23d6b5a08a9ed3b1e3a1b9b918f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 16 Sep 2021 10:00:59 +0200 Subject: [PATCH 0422/2116] mirror-to-mirror.sh: also sync to plug-mirror.rcac.purdue.edu This is the deployed script for pushing to the primary mirrors. It starts with the 'repo' section and runs all the rsyncs in parallel to each primary mirror. Once the 'repo' syncs are done, it does the same process for the 'archive' syncs. This adds a new primary push mirror at PLUG. #163 !800 !792 [skip ci] --- examples/mirror-to-mirror.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/mirror-to-mirror.sh b/examples/mirror-to-mirror.sh index ecb4c10e..7799c020 100644 --- a/examples/mirror-to-mirror.sh +++ b/examples/mirror-to-mirror.sh @@ -15,7 +15,7 @@ set -e cd /home/fdroid for section in repo archive; do echo "Started $section at `date`:" - for host in fdroid@mirror.f-droid.org fdroid@ftp-push.lysator.liu.se; do + for host in fdroid@ftp-push.lysator.liu.se fdroid@plug-mirror.rcac.purdue.edu fdroid@mirror.f-droid.org; do set -x # be super careful with the trailing slashes here! if one is wrong, it'll delete the entire section! rsync --archive --delay-updates --progress --delete \ From 07856dc0e030bd18930f8168dd8ef17312b502d7 Mon Sep 17 00:00:00 2001 From: Gaurav Ujjwal Date: Sun, 19 Sep 2021 09:44:37 +0000 Subject: [PATCH 0423/2116] Fix invalid key error due to NDK versions in "revision" form (e.g. 21.4.7075529) First element in the 'NDKS' array does not have 'revision' key, which results in 'KeyError' when accessed through subscript operator. --- fdroidserver/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index bd05f3a2..c413f239 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4310,7 +4310,7 @@ def _install_ndk(ndk): """ if re.match(r'[1-9][0-9.]+[0-9]', ndk): for ndkdict in NDKS: - if ndk == ndkdict['revision']: + if ndk == ndkdict.get('revision'): ndk = ndkdict['release'] break From d6fd16544483f0cfbca008b53387e817d8a7bf1e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 20 Sep 2021 10:15:59 +0200 Subject: [PATCH 0424/2116] test whether NDK version parsing is working properly --- tests/common.TestCase | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tests/common.TestCase b/tests/common.TestCase index 88ba20cc..f5ae4725 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -2082,6 +2082,39 @@ class CommonTest(unittest.TestCase): fdroidserver.common.fill_config_defaults(config) self.assertEqual({'r10e': r10e}, config['ndk_paths']) + def test_install_ndk_versions(self): + """Test whether NDK version parsing is working properly""" + + def fake_download(url, zipball): + print(url, zipball) + with ZipFile(zipball, 'w') as zipfp: + zipfp.writestr(os.path.basename(url), url) + + sdk_path = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + config = {'sdk_path': sdk_path} + fdroidserver.common.config = config + for r, sha256 in ( + ( + 'r10e', + 'ee5f405f3b57c4f5c3b3b8b5d495ae12b660e03d2112e4ed5c728d349f1e520c', + ), + ('r20', '57435158f109162f41f2f43d5563d2164e4d5d0364783a9a6fab3ef12cb06ce0'), + ( + '23.0.7599858', + 'e3eacf80016b91d4cd2c8ca9f34eebd32df912bb799c859cc5450b6b19277b4f', + ), + ): + with mock.patch( + 'fdroidserver.net.download_file', side_effect=fake_download + ) as _ignored, mock.patch( + 'fdroidserver.common.get_ndk_version', return_value=r + ) as _ignored, mock.patch( + 'fdroidserver.common.sha256sum', return_value=sha256 + ): + fdroidserver.common._install_ndk(r) + def test_fill_config_defaults(self): """Test the auto-detection of NDKs installed in standard paths""" sdk_path = tempfile.mkdtemp( From c71c2465d3c1398d9e53de9238ccc84cd8c29729 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 20 Sep 2021 10:51:49 +0200 Subject: [PATCH 0425/2116] tests: silence the linters --- tests/common.TestCase | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/common.TestCase b/tests/common.TestCase index f5ae4725..389859d4 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -2113,6 +2113,7 @@ class CommonTest(unittest.TestCase): ) as _ignored, mock.patch( 'fdroidserver.common.sha256sum', return_value=sha256 ): + _ignored # silence the linters fdroidserver.common._install_ndk(r) def test_fill_config_defaults(self): From ef20e1b32990beb659afa8a5fa7c8187c3667496 Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Tue, 17 Aug 2021 16:36:26 +0200 Subject: [PATCH 0426/2116] Add CI job "black" for code format checks The CI job will fail, if a file needs to be reformatted. Only files already well formatted will be checked at the moment. --- .gitlab-ci.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3fca1897..3ba44aed 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -217,6 +217,36 @@ lint_mypy: - mypy +black: + image: python:slim + script: + - pip install black + - black --check --diff --color --skip-string-normalization + examples/fdroid_extract_repo_pubkey.py + examples/makebuildserver.config.py + fdroid + fdroidserver/exception.py + fdroidserver/gpgsign.py + fdroidserver/lint.py + fdroidserver/mirror.py + fdroidserver/net.py + fdroidserver/readmeta.py + fdroidserver/signindex.py + fdroidserver/tail.py + tests/build.TestCase + tests/deploy.TestCase + tests/exception.TestCase + tests/import.TestCase + tests/import_proxy.py + tests/init.TestCase + tests/install.TestCase + tests/key-tricks.py + tests/lint.TestCase + tests/metadata.TestCase + tests/ndk-release-checksums.py + tests/rewritemeta.TestCase + + fedora_latest: image: fedora:latest only: From c2ed538ea4bc031989b4dfcbca041ab1395683d6 Mon Sep 17 00:00:00 2001 From: "Felix C. Stegerman" Date: Tue, 21 Sep 2021 01:13:07 +0200 Subject: [PATCH 0427/2116] copy_triple_t_store_metadata(): handle subdir + flavor --- fdroidserver/update.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index f8b895d8..b0051098 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1044,7 +1044,13 @@ def copy_triple_t_store_metadata(apps): builds = app.get('Builds', []) gradle_subdirs = set() if builds and builds[-1].subdir: - gradle_subdirs.update(glob.glob(os.path.join('build', packageName, builds[-1].subdir, 'src', '*', 'play'))) + for flavor in builds[-1].gradle: + if flavor not in ('yes', 'no', True, False): + p = os.path.join('build', packageName, builds[-1].subdir, 'src', flavor, 'play') + if os.path.exists(p): + gradle_subdirs.add(p) + if not gradle_subdirs: + gradle_subdirs.update(glob.glob(os.path.join('build', packageName, builds[-1].subdir, 'src', '*', 'play'))) if not gradle_subdirs: gradle_subdirs.update(glob.glob(os.path.join('build', packageName, builds[-1].subdir, '*', 'src', '*', 'play'))) if not gradle_subdirs: From dbfbc4163cd0e6db74e0163e35b2561ffde11e19 Mon Sep 17 00:00:00 2001 From: "Felix C. Stegerman" Date: Mon, 20 Sep 2021 20:16:33 +0000 Subject: [PATCH 0428/2116] scanner: add com.google.mlkit to NON_FREE_GRADLE_LINES --- fdroidserver/scanner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 9042d56d..68369dc9 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -67,6 +67,7 @@ NON_FREE_GRADLE_LINES = { r'google.*admob', r'google.*play.*services', r'com.google.android.play:core.*', + r'com.google.mlkit', r'com.android.billingclient', r'androidx.work:work-gcm', r'crittercism', From da10acfe2c374eae5dd9a7611e0ee2a6fa3d0b38 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 1 Oct 2021 16:01:39 +0200 Subject: [PATCH 0429/2116] update: add test with APK for icon_id related exceptions --- tests/SystemWebView-repack.apk | Bin 0 -> 2846793 bytes tests/update.TestCase | 34 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 tests/SystemWebView-repack.apk diff --git a/tests/SystemWebView-repack.apk b/tests/SystemWebView-repack.apk new file mode 100644 index 0000000000000000000000000000000000000000..45b31280d9d0ec3f77a7ecb7bc2b9ad92bdf2bf8 GIT binary patch literal 2846793 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

sYaX&U*D&(g1pr*EvW^1Md(k zfWTr!^8j`zI8*;Z4`Sxai3moUdyrX@U)kP8HyZSDB_T_l1tpnn26}1v(yTrSyvf(u z+^DYx-d5421&P5>WzSHe3?sZ~FiAo=LgJbgiw=k<=S#ZK&*y{AHYKeMHSvOvSIZ-O zL~p9$2ZOa&NMk5pAL=K)m_T<4$TyxApwIf}{;nJ^1- zeCN(Ru*pY+2VGq6N%T?l4B%T>62sYqs-r<VP09$GElAv_JPWI`0>s4I@DJY2l4}Km%#FH-&83vX z*R%=2XlkXHs)yO2hgqOcegy%H-7L5|{a7)_m!picd4`Q=Ycpp!vLI(9>`0ax!!J(t zy&b@rz7l0TvoCrpe5RoL3pRW_|hau;5Li zMrLbCAF5q}cNL`GmTZLYUHxE#h#0s_1MKpQyygRrs)>yAO=< zxYlp=@QlBlvM$up#!KF?yydMq;I0n=F)1HBSf~-f>+op{HUGu12n z`=pC`$2{?b9M%%w-{Mda21XOR@M&-U%#`COAY(y#&{4Q_)01Avjf%mU!!~W4 z>wOy%36aLq778B*EaNP`5a~*dL3lL9Kh1j+Svx0-yYYH@2?mnv@|-4v!a}>~bg4@g zPuVz5QhE17-OV(+ip6G6qodaeQ%S?{couXGbA(5w1s*1LtE=yA`#Z-6{$ulV+Sa&?tSYQQf3ybM#OWB=x$ey!rrf2{>P#=asR_Bk!D-Z zud%Eax1XJl<(u!escNsS8Hdl;eF^y1k>ZKAgRAX3e%vjr=*9bx7C)A*dc_hLo3Fdk zv8IH_hdsCbpm%`TgS}Jtv1Sh~_2@le%(eEI*XcV2bSAroqbi_gXR5%ii(lOn`RYvd z>bPB@N4zej2t50Zo)adLJE%GvkF63t^FV!iXLRgQVo2;vj=^ag+Y0v|Xw9~5(7~&S z=g;Z+`E4#_?+EnNYZ45(=Z`D6SdvTP@B*G+4VjZ)9C9k{{-b^Rh!4B>Q5bEI9kw9z zqBh;&x?`r{?NR8vm%VZq+w=QCx$k0s5<(#k8>>Z*1IgDh_6RY`_of}R8nf*^^2njBPxTtFLLLF25}_uTeqpEpRETi2p!H4e%Afh z+_(WBm#SgT!@Qqr+b-P&H^{}LPZ6HquleNK2G_`^Cxu4lF?LgIonLzBsv4Q=`IG(i z6@DH1S|0~G@(9<88SY&Bxv_g`X`R>FlRe9TPtwQ5=cnY`Hhj$r38U=Ghq5ED>+W-- z(ul%!OA_`~#3RM!$>-=iXIrZy?gi6IcX~~!qX`Kf%+ckUT71UQ{B?k!@t*^7aGu&YsEy96UbOP-Drl7pE1mVsJnT=d zap1$cOpb}dq}oJ|XUFx3cL6`SMHcK{io1*28I5^HlA!DI=dj~1NxXG3CNo{td9%@Z z|JouJ_twuLz%3wN>nt51BEDrCKyBq_^h+>ze|Xqwwp0jopLbkd<>>?g^}#RyQAHu_ zV$;=$ej_6|mwET}y81l1-sOjmrNCSlK0A+kITj&S4{PcqzRUHB3D7*Sj0#xgK`TFZ z{J4}{3@MqJq#a*GQQf!(-mO(7 zf+iAg4-42Zooy!2RoKNQkyewwB;O$dvfqCAjc|t`4-|deM-Ptxu66rvhEVD}5Dk!9 z1Ua8bEqqSc4O!+?AU({BXe$jpuR6$TSmS9(t{4X%@_Np}7lsWIGHz54VivQYQ z=@9P{I-plMLcI$75v;GoYhbRke`ln})!RxQvw~!=b1)opWLc0o!G6{oIJ#ER5(UT) z)=4uKvx;ozLfrS>bl$Mm^>THQ+srVL+6Vyf0pmVG!@dr*HT|XBhe}Mqr{esg!#1-7DWA+&c<= zV2ZMi;he$g!95B>#e=yVYuV6)1ZyNMlOf4!VEsmEr!-FdQIAy_@aEA@+}1?@AA9c< zBzo`ld$w)cHh0^$ZQFM5wr$(Cd$(=dw%vW6ch3B$&U4;VHCJ;nRr`}lF7iuq@vXJ; z%c`Vmp+D8lwhOrvXj6&k5@ZUb0<@88dyaZlLDz9A3gesUG@;E2qM z_yqnzxm$>rmQj24OvkSkpOMu%T$zU(6%pzuI>CaxAxlON3Mkr!9WR)n~Bff(~!KHbWG=OAPMv4e)^@ZC{$P`;1xrek_i_tz?Hb)MoH&*BlxGSo-5w`o~;bIc_W^%4Gi59PYLzE zD6Dwa&>CXSF%Vph-r@%0z#)Ey%UBKG>(0N1*w?#S-*pzxcA zJRM2Ap}UBuS6@W%z`D0YFP&`nIYgq8f7L8;#Gc0)CSBy>up7N2RtGbc(4R}^I>A_@ zBJePJ4fHy|(2l}-4*f}+%Gp5IWi#?g zqz;iI`nh~#~HmQc^0qRU8}b(OwD(HWKLtiwH#8ux8>gHa_@>=l7^2n zS4(OpHY48)Sa+O=7CfbZD=*1sG>{XfHd1szYGSw8ldxb^z}PD#~^ z;x$jrqd$DwuUgGp)zZt=0FilY>zbo}^uUR9Cx=^fA>q_vlOkpr_v%CemyI&5yJ6$8 zEwgi116O@7HjSdc61&5Rts?hFONN$wo2B&bpMz$#%7P}1Hnh{~HQTLTkgDtQZAy=m zEdA7Awh@Ix=7hV@`!)@B?*e4&GCpj(H~o*m!AEhL`h+Ieal2V;1Tyj1Vr&q5TtT~J zm5JlBK4pbMYFi@<=^fRW;7e6~gb>ApkeEeFY38+uUdrybM3$mlWb8ER3Zt{^YX{`P zl!nncR}A(Qn_QRp=bPttS95=}mw&$IyjJG#d(~_TyQRV}ZMBOrC(NBqX<1UyJnP)1 zLop0uq%yTuP1bI9S2)w_EDGdu(Btc~u_b4?E3j}Rn=3J!W+gY53Kfa9XY13XJMZq4Ynt90N;pGf z>#Jr>c315_Qa<1Z`z&t9zZ|O?+rHf~iDw*h=ihHl9BAc8zrBmSrnzBo&laksc%~!a zEPq{P-e#4PKZm{~xZK&=`pBrkKiqW!7?lY4$gfF7(H|^!#4(vYOR#AjJW759xWti1 zGedfbSJ6Ajh-IJ6ancKJWneENYZ=jpYmRgmPWE$pWi4P##6OzrTuQB_uBBq0hQmjb zvMgi!dNS{QT`9Be#Htjy)XCcWd_6z3q-ri!dwjSu;lGL4p?2*I4PPQztxIjaVkqHm zR8x;c`=wYtu03gUf7fm`Jh%vVJ@W7&?NH}!J3#S1ZbWR^kyHeRH*nGS#@rI~F6$)W zX^3p^O=Hvva?_~1la?XG2 zoIO&8%t+M8-Fb*sZ24jJssqQNw#L)gY9|DH$k_Y-9QrEtyeuKF9p~oU(O(xQNA?mN zD4nFck^;H}f=R}copz7kgyuRX_N?vNp}CjJ=>$Z-ri8jKdfrv}U7Hr3ceG{`7svwe z&TLP4eqKe(Qc7JpkoQTwyW5={d0pDNvx#gGZ@(RMEBBmSbXu7Et+(gqP{87vqWj3; z?owB0ayDKhhi|o=+TOJ)Rpa?}8j~!3ojIT{dI)u9%=Fv!e%4aWzzYcH>VU1_pS}Ub zmRjGV^B>sN`YL|Z-@DysotJ*PKPjCr#SXr2cYU@dg$f-X*$(93hrh<>zN)&fxPO{? zzHq^@+!V60nQx$r`SI@LI_~24FZn(_mAdhAo_y2hU(Ew+^|wgI77q7*y%Fh>sU~IN zFH?EU{G12Lm63A$wK;m-&?{Txlo_#_uZ8G26^(UyezJlQCB6I*L`H$i;W|Lo7o2;aaCHa08Ec_X?ljgKK^6V@U>tCtCx0 z(2sz615Z?T=hgoDNb?0V3BCvnf1Y_XUVinjV%!uM-0J;?HuSxp@8|p1BTRKJyA1|} z?GNfjX<7t09TOA^&AhAG`cp;Yyke)xH2B}}TmgGOx{^dsbrKpdNQFYXX)m}p2X|a} zXY??V0nCAOqN6~P$`DjVoX6M-7{SlN@vOnbMB0IeX`X2e8Ax!r+%vujBecza??Fyn zJ)JZ5F>rO;h|vtS3d|`7f{8x*bZjH^k#DdwQz$a(uqG()rH!qpuz;FWv#Gnyairom z53mnBs@2c~j_CdehA$Msdp>Dc6sVypQ9~J;u}V2=&&VwS>-q}Ad?Ym+t3hg_J7(+O zv81~PCW|qrmVmt!jt#f9qE>yGyK~7=jtln_t%mT9`e(hZ!@V6fyAN9-@@-zHG#$E%mr7wwg4qCsMF7c_zjPjk0&!kBKW$n1g{zv) zCGxx!H)yI#1wLOA`KPKEM4)hS;qQ@B)}h_YjOi(_aa8k8Jr^~X5>{eZ&d}%~Hr^tw zK%Q1JFab_O6blOwUP>x;wavxt&z`aY=1!JT{swWkv2uWcA1&l_Q>~dh!bJCuR|Q*1 zQ}!IpLsN^V)mIK1u{R0wjyb@9NR<;ki*aV?muI2X#jT@j8BrgZ+(uS~EN5IP9V@>! zy&As8o1W%wG!@Q`m8_e3_nu`FR|_DP+w{&*$sC++Q&N0nltl z+~$B!?8dV2UftIw(=7txK1pQFq+s5-fhRIw*Fqr_?~EHcZ)?*owWIM1FISnFMC-^a zWC-oj$AHd2;Pa^pwA-J4;?2=@tP3Yt!_-NJG45v~I{c+@F^X3HvCF8TCsmwiKcSYGbLNikl9Vw zX8;wIF0AI^a^a$T2IKV34){u~)6-+1bMsX#7Xf<}SPUgeFjg?hJhuGz2MvS`%M48B z(5lrmh^w?G{-pm_p`(4DD72SUNm)W2xqVvK`iTL$i4SDQo{HIXJ)(|FYlu}Op8OrF z*W^#b;X8j)Hhdo`=BnalmT@h-c z(ji7LvuRBAV-}_&5YM+sFnsXBEU3Q<%%!iKcfG7)j62srqS9@Yz*>L) zNuS_5{H;BSXr5!&>sDw^$?@-uc5w=p0}KelKVA`}^5zk!owQ#Hd52(EsK#DK)Gf`X z%`r$(*Sc%@vq|3&5{(~e>4D6^?{mr!nX1N%9(aPQ!L7IsiM?nd@gGi&YeJmO#2)j~ zBpWcFE)?Z6f8a{`V88}&9l;6_1za(4!smWnH*y=0GH1uf@_@otS6ewd^wAb^tZHh) z(u>@+*)51tw~C>3jp|9;e640yhBTB`Xo(%qY6>)q&hApwVHVC&>91)h4C|=a>9DCG zdl|wKYoy|cN??y22fQ-PZyQxv#a9c@idB&DEs#JafG|V$eYpR||E{2JsZl_E8br)l z$x!T3p1<-9zcY=1p$miG1fcr)VMJbXi176PxOiqXB}&?p#ZT5k>~B>&msi5y z@bEgNc3JfNY9*~mS*u`N3nQDgfEDu)&$ztMT4@S~WU`aFhaLv;DIgdc!CFh_)`mCN zUFvhrZ+!A1c}^S(g772ofrkpc6Kd^rQYTk9RJ2l)3*@r2_B15DQowR-lxH0H`w zaXxvrFaHBzwlrLlum;9MenOmyTA?4kcxU*&xUCZ*sX@IujlN&&eA(=%V11RS^`PUL z%a)9r*TJW0dq?L-hj*NM>A{{@i|L9FWd7VefqIQjy-5hs#kj^Hpf7d&cBpd?L7!#a zIYcx#JgYKAn#;Dh&wCKK%vmsV5!gtSzSR++iU&waMW1HfjF7h%_fp$TLdKSL&IfTvHDmi3Ys{=g1vz@3>FmK8QXHQ3Vcyc|9U@*X8F>Vx3Ov=_3jzo6pIICF{p03hazEhIL~j1qjY8a7W{wG=$ff zeDD?Vo;XDIs>X*?XCOy*)=ZbXvZ;7WD8RcfM87KVrh$W8m{V-s1W z%^${~7|U&rh2Db8ELa68xLGic8Cdj=P68Zy>By#mwlNwr7|G_i$BDjg=O27RdQ>n2 zOCR>KK(ha!JIw5VXTEV8!FhL{?tH(&5M!H}?<`D?j`~qy8<3-44B#srAfOEXEAgsL zLZ9rwe`SK?7Fm4gfO0U%=Jx`41_=wy4Ed#L7&@rKmfyo=6U<`o8h$w=dr$ri53yYY zuwGVR2Iry@eb9!R+k(=0?$GL06Z7Y*17|0q``+nxYaIng+sb54gJl6|$8S$+j(xs# z|6sW}fF~0=b=Nwyc^+(SP=fRTaP7QEH@P+Qha)0OxCe(~_8n{H)c$V7R+UtlUa=NBRqdheALU4UEium znA6PMrgPwHca;p+MxO&FgzO`3Fz*Nk$6#f>F)Phf%AFZ&-dYqiY_LxGm*4*Vem0A3 zJExQ9D_{fZuol?A?q-)1Cv5+5;D5ZQB~Wi4(aV1Ytw4*Ie8+R-jR#^F0C?8HN&5y2^83n=hoOX2p=# z?`&Y@p0H-WTv9#4fqY;Neb5rw+JiCCvj`0N4)ig&H;bzzl{csn?`sMBfb7bN?*5Jp zB2|c(>%}%@%cmowkyk-!k2YBKv&)BNIE$RUGt@lr3i67;E8Uo9NS<;c-i<(F+RKay z2C%Hx)Q>f?h~Utva{$0vDh`SobY83Wx`I!6ItH+k>1BtwF9ZBh>?|kjl>Ig_|I07F zi_6AnT7$FqgEUli2%wqSF7n9o?d`i>`$@$29S}x#4xbO?-~X05xBvzik)5xIH~oTe zsaqG{so~)=K`BX<#n+pF-yk6x4WUk6wiy{QtXsfp&u^;J$19`GLUt%(W-n`ZFL0L7 zE`Dh?zGf<}ixn_dV3Ts&mgNjJU;z8#is`=t4mJ<%@gz;Qk z{m=|pM`1qtTZO@3W%#?r+Dk6TV*PPcCa;a>yV3$w(K@9x8&h{IIgSRAHUiqUnJDd2 zqax_DUI#~fne^+ToojCZuWUN9n1`>1L!U$LbWtX=ukhRTKv7n91O%Y(;*yE;|3039rQ!dc zpd3DqkNd9)Q;Ku{^;F3FMy;x*!h8vblmehY<$@K1L)T^NS~#myoE+@vMiNIN%v82htitVP6FjF zqg!dDVcD?dus`r5A1-CEsUk{N%1OU^;EPC~#KTI(qDRynO%^$FX|Ra!MH=KsvWmGi z(S-4NLp@o9=yTBw=;N}wXpI90+#_F&dL-sl?^0w63YB^u(FbWU8;kG1HV!>_ zQ^{uImOl;$Oh0IIb3tl=FB8S!xQbdLS6=I!m|XLo$6jz8-F?#a;WYYXbuu(8|th49^@mv7H+)mPt;pQ|WB zt2nY1MJlV%sS{cQVI1BPKAuEA=L$3M<0Gb6Al|(;7U5H0bg*@|H_&+?A$ozLMJXlz zC$94jIg%8kvyl}RBfPv>@^)PAHrM?f+(7TzmJhjWNMdB$X$e$IR5wmPcW;N>tu+vW zp3ww%@Msim8*LTdN`)VeN_*i>jaqu(J3!bVbfVZ~+!e8g85LNcx&{uC=dmry6C1FK z99-vm_?G%`{*DFC&BeF93l1sOEN7kyM9YwlEfJc&vF=r*-MKzMR52MgStacjTXHpF#S z=ErwwXP@~!!`sEcu7R^3a~<>{C&}4K-Z8^7R2r2lCizsAvMLp?qO5S&b|jpLoo&NC0OX1b-Awt$s8#gBVr~d$9!CcqugLc)ESs<`VXZ zR=5gaE%X?E|0_p$x!vSSsY0gGxY4L9&&nWquoNvpApqnBiVzSLFF$BGcJ8uAdRSu* zy~E!TksPL&EpDBJ(kobRM07I|=HTWRK^=c=#D;u+OF+A_QTTS#)EV%N7-J!FwyH_s z?6Mpo(xtJ_H2Nbw+fJ!VFT`ApuT`bv7r*AAcJ!yHac9(?WR=Er%Nc|QiiGl&88^KA zhF?-LUJQ+W`Ra4$#`$_?z=7TIt{cR&KxJans#&dxW`zN)rw6J#EYXzWnISnDifkNC!=c{~a#+5$a7GDIv7V#q zkEK0lJ;c!{Rwp2ss2r!=6jZdAkP*pvbwa#9A<~*AG-pI19jG=K+FC`GE~WeCGeGVI zn64r^lCh>IkYTbe;c3U&HpmzDGe`Qewg zFk$w~3ua-Tfy?SaF)JD{5C2b=v+BfFEM)yA;`_&)iv99MUw$nd03xW4@slS**ql>K zTR9LfBfPtFL1klY|IP|$)J{*g2i%`T_$spo&nMLZ&ihmxOVqCoGXp!${O73{7ET$M zmgAoFNCS_f*DIf8?Xn*63bTqrMn5*g$`y3;xS-@A*WqobihcQeivpX8It z#?Fiv)@*|mvtlxN$#@NdNgggmP7;VUX&38a-6_d40ZNRaT?%WV&MpX!u=V3#m&pZf zNerWh4mjXTl}k(*Ib~f024NP|iUYdzvCW-|2LL&dDXL-T2V@&e;zpSKN_U(0lBB5T z#AW2*TFr3*q%Pxi_f!a@7ipxQIPqVpD9!#8EaMNR`=+2dCfyY&--_nDW2teF6IKXw zjfkXz04Khh@(%_^bOsqSecd{G_T-~cym;6Ncj;+6lIFeUi4(LqoC~K-ul18|)#$j=!rdpkMr=K&UNc~hfG++ybqBBsCotiDG7;#jz?#fPvoH>(M za8Y##dpz>>f%8$J5M0%TIvPJye>4b(WRGGA2AbpUH<<@sf~nBoR2+`P5^Jg+UjsO0 z`fT^mScom;ogcxL2s;T&i4`{L$R|Qt*4yKA(4+FqShs-CbBc(;2E7D6hmXF(QS}~< zN6TRc9B@YDaV&3RJqj_jF3It2oiR)T=F>Si*|6Wf>JdwpVwHB7QYup;S|A_-*OI(m zvmRS%_+Zv5;S6h?(|Tixs>5wMoWY8-9$SuZ**6)OCGWx_xDoTIxn2q_=$T&2{Q%j3 z0-0N5|LcXQqK?%D1B%Z~ZJQFNHGGQ+m&K?!kd5ka-h~v~Y9+DG2G9^x0@BEjubS&d zQFbeokx#ahbCFjHegOm?%;&cQJW?>7^#o~YHS02~cxlUULnh~UQ&f;420DqI$a`fq|L;XDhI7<25T zx~n|@jgi{;hiuVVNqr#}J#;+bxj$&&)$=%561*1Rd*2_&*L!zxlEsX8mmNl+rP;Qd z5lh=Qy(AJFEe@F@!>SU)9C8qSc`EZO)G0?WmM|rucM1kxR95WYJ=$r&i zGB3FXW~8Y=g;7GnVXUdb6fK|aG_k)CKTo;9t{`{@VUm%x8)aT?Y5j_imalho*Cn3R z6eLxGT@iEbKS3kdO=mqs$yQ8I3gJM>52uu$Ak+oU+C>hEZf__%+yJD;O*e|T!rkl< z>P%6?c1}h-urNfJn4Rp#V6a0sT8MYZT_sV}X@1YrJW#GvW#WkkZsBAV53* zr7Kt*PhzE}AzdF6;{M`h5}>jmh}Qe|%@!7DrB}7j5lamO@J#GY6L9Ie&C9NrN7L3- z*Or!nyrM#m{`j|jN#BNRwD+q!b}0uzV8HJ0;gW^4fJqN1wmBH0uw#1=gVW$WWE}h; zn7xcS;MTO!1;;)C+h{bAl`Ato>>rMU@9R)9x>q90qvwCKmoo1Fz{FV8;jRo*^J zG+^!RhYeo(n&8x&37bUQ`kes%Bry<|{)O=8ys~WGBx_kk zmDcf<+Gz@n_tZfk?@BF9vy4&)iTNhl#};smJV?=Ms?17twPTJ04O@B`+bQ5tDhh)w zJB}%bPK!cyq^Tm@FF$Eh3RlRedUC+-{OAFbT045)*)E}{aarzsid8%aFn#!r)M)}S ze;F&k9y6V;Ty*VmIkDXo7`-UJ+oWExp~0Os<}gNr0ULxc9JB?28R+C&Wrl? z3sbv7ExF0b&ddm2sSkMZmy%(PTg@K6_a8yLt_0x5_WPal-9Rs2LXrp2+hE{;Ky*%E z>8xQ^%_~{KO)!T(RM^Ly1o^!ylZu?m1&^Ln_=#Uiu~axngd=D&Ip#T6(r45Asv2-FN03-kaxMcw9Z>T}RTL6GtfHCH!w-0?ZW@JjUKO%06 zYySkiRM7tnl{RoSWo4mbVxVLBCwK%v{->JQ8rd0}IP&~2pMC=n0Q}`IfBDN_{_>Z< z{N*oy`O9Da@|VB-`J+44jb&FNq?c$(#VfR&b;4Jq9aL;5n-ldGgrL#7%0|~g#gY%2X zyijO7fn-#XBAcQ}yXuE`whor<5&i{qV0nw4W$qHoKakvV06lY6Ukz6MF>O9KCASXVPKzX ztm&hvA0o}#O2bx9KH~CqGPcP+K^Uf=WrGwF?)&d<5lcs!{id;M(GZ`d2nCwk>ZEEK zGRRV`?)Xxqskl2W0#%4+plJIcM`{W1$k9GO;wiJ91n#cl^Bu+tND8HMU5qf#H9vlm zQxU$knP;cj7(K6*>xXx4o@qa1wXm|jcL8XWb#aRUB!JYD744|)-eV<6aH8H~;8y0* zIecYg?VBnUowAe%%juy&B86aT%RnB}b|$CgS5g6#bxq?0L{L06JkBu_S| zN%=xe&z4rCUnR9Vl$`B{!?k4Rm#c*$Sv2e4Sh5RjzXMkAO%*t={0)aTid3%~^s)GW z3=KL{>csAa4N{2jk81fXqW&n2;Vj*spHEi-2rOg*f`aKN&(Tn51YqFY*iiW^nyfNQ zYkD&R&k*|7l7onW-f|syD+bo59{t_{M#@YoJn|K~hQbE+wNyBcB z|4SQ0jnW{+z5mHH7TK=^P4xpJ*=a-g!(kI^q)wdgD$^c3E^%7ol*g=gVLF_dA!U{- z{`M0 z`J>S2O%N0<81ttIXe#|vYLJMTUBv+t!nKY?kMNfX5^|V;vZ?|KaryimdQP~ zwNpfEvY#^h5;V#})=gV#$nDFL6uddOl*OnodRk+J)~8g`f)`L(!^QL{Q0at(2kmhzHvz35-0G$YabKvSVX} z9=ll{ak0U|jQg9&<4`{-(F!Je&s4 z_gY7H;#>&B#uBHD(FtTs5bVGa@gw8E&+>^72}$EiN9Yl`!yl$eCUP{C2iS@kN!6R5 z8yat9Y;425>xL3e#7Erx9|8nXcr9ay4f~hVZLy0Le}j@2;S8s_N$TI`^$CCnn@L-+{?mT2d)#d0zZ z#KCL>oRmuQZcBOhP=Xs`EP^5d=KTT4BtRML>oY9iy5IF+84VK;H@9%#zegUFn!!;> z$&oH+oH{H&>F$^~3k7f#bta>3^XMal!e`&&t zXPnnvlx<{*{bHB_q9+=wklV4fTbClmzIPx=p(1S2w5<%^ydXuvmxD{1kNBvqKAdYI z96W8tzb4f?<~rox!UZ{eT?fhoaY$DbW(_x{Fpm22%hg>71xNH5K}W7?jk=mO@t8vl z2A)rTB1mE)?7H-(rJ8l2Wq}NG<}=)P0HGK+EaN&$6IYO~%|NgL78njzhl2oJ4G{?* z6oKxMe%L=`7)y{gog(ey#uS(&67;4M;^r0hRu<(Bl-U|O{bHTuX4KaOI`M8xuMzH- zmKu;a2)-l_k~j&)F-aU9507LEmq4l*UrFg|%v}3#j=Y5%+ogL%H8QRTDarQ4CRohr zh0)a7jkJ7R|1lr(ij!I(k)iW^{8iMT&`XXaVOW4|QgYswJ>8%n@OXPBLs8rDzAb}o zF0i(|^kd?8&Uf@Xn-=2GXC3Kxj1nn@mwIy7X|902^sYVk*+CmXwBdjR^}Q>SF1Fga$0;fiR0A1yBxmZ%{H#v8CcM zVtz~~kI-s(Ak;jQphJWaU^QX+!8yPRK)Jna#YhJu6+&xL{xvNOi;(&LXdqVdYD}<$ z`JUzNk!TgS36S>mAuCGe_wi4@qgvpxyd^3%IBtI1j|V~F$~FDEJ=o2l1?ry9*J+nT zz+}iAIiGs!$b${-L6JKvv*A%y47CRs$aCADj~F@mx)YpdhwKlE%hs6FfC_XTN5w63 zMa#;pz}AIe!-vB{=FAKy7HHAUbzw8F7|NL9p=DqR&Mr|0VoBOX>kslg`H~>Zf;bWp ztAtR?=I#EVu^;&kql`H$<)q1KG%g$ew65>Nkh*y!_D0;Tx%Az55lx~V4TZ|XOsnpx z;qfg^&HZSpab)GcduNtiIo+7oV*(Ek3)#KjHBdLXgoK@-6 zwWOuvHFIrRJNp=_!KrcRkYKjKdar1L?ZcNNwO@A)lhY5Iw5H(M#~3Y(mu!qBn6sPP);fE+DR85pPetra0^&w zArW-UCmpF-T9HW^W=w_(9>l*JCoYGBgq#90WKDf}3S&<32GoA1p}9ZD`)B~<6n@Y) za7&)S^S`k38uU)feo|`Es0!$R9AQWf;r6_)hHd6UT98pRfD_fKiNWm{1 z$V775^ON)`PVYzVfr*c_a&q=3tb4q*%~1Q-&}7^Sgr{cwjt^(bWJjNsqHC0wrMy!l zp5O;6lB%K(n6~3+72U)`(9q-6?wtl8KJmH08 z9b&~%XrzDnq! zTM@GH@vOKD6$pvSL^Ag6i1}6Qff&*xGG6gRC*b0|3{O>=RE{Ea*Y8^jet?}-5SC@q z25|I_$2+`r14(Gykvqwmug?<_P$Z6f_*`w*HZ&avs%^2Nn;v)6}TPoxnPgN5YzPxXw^rhPX$zu~fpM}FH?aS*r6QVKauk311 z-RnQfO85)r+q3EiVciWglmi*k&#m$^KT0# zMmu+Ig!qKt0wd&2L)a9TXAjE_m(@n|NH@kq>X)s-|$ELlzlrIK<#zg1xmsf7T8&O{>s)X zF26$_n_W~?L_%J&l0cd-Q&c8xicVB(FQ7Li(GB8XM0AGubA}!4fb`LiH$9U_(cq}K z!^0q&i-@uMJOn6oVu?RAvefyBJ|g(Ovf0JW%*tj)v^<3F3!TfQc6W0f?Xle9*^0`& zztv%!H^XY)UCa6{t4xiLFeEh+W1o15fE77HW2}g_-0$N;Q+;KY%^T^!B8FgU%$B&F zM6n;W!%#~ucmK>nF@C;M>XtL}IX|_i{>HOW`9Q*|(BwmL8^Fpe+GQSj0NvI7(+2 z{C`Ethch59z5PM|;d*Kv&FI%L|WJ^Io8!sbFn$Z-4vOw%u5g@GqKl=`I=S(yRgi@q8)v)63xOgZ- z7gBTlv5)Po;do~scV2rPG6o2!e{b&+z@P+nUV@T`X2ksB>;O+n{E9V5vZP)ymo zRk_;ufTu3;ncL4Qqt(KGm#By7l1B0o+>su6^}jHI$~yD@5)$Q)bJ>617>p$V7FTpYr{cmP|p+_~Q{ ze_EVgo^Gk~d3qAvFJOgWM+zutp7ADst|3l~_#@QK`Op+VL{(J;*5RQ7+YN@E6!Z95 zzUhVUK=`|IC)!Hr&Ro*)rX{^1*1JP;=}pkFZilR#?!h(5!p$hIhx)xfw#?$8T+O|h zh69~|{siaf%Jr$eHiQ3>p5HrZlmA|xz0YR zh!}gG#V)@nIlozQz2#b@ny*L{$u^(Sl_Fg8D45wgS8K0{*GQy5QY%_tLGZY|ANl4I zZ@ONaeIF%ro@X+G_Xt%kTrO%owvWiwOCyLN%c1=f>G~M%p}A_RlU|!?T)t$>v_-Ut ze~{$dRDvz~2Ydptl=190-m|Ej3(6%VY?xNZl58x(nP}Qj#@>OX)yV5X(LxrP?VTQ- zpZrsfj<;4PIx?eU04T02ZcLF*wzOU^wov-ib@i7sQGMU^W3XgAZT>j9nz0b*KcM5{ z8yQxwo0gJyNrMu3x}<>ACD|)$#l{*^Xa+0rKj|q1b4Y~z)*2)}%Yi#F#`93K_*I`m z5T}9&Q)!G8m9Un~K9QBn9g$)pgG37Ro?d`b$Fj+f+l zL$7km?lQTtJhYQQq|0NaDU>g%JtAlIjp}5mQMB!DELAD>{bK1ox8yvT^i$o1mRsp# zyAk6lHYM>vi6z^4r};zG87%Wq3Aa))+=y{Z7vmxPGFQBv2?a@Z)0w&$dO{PqMaaMt zyDaNLdV{}~D(M%9|4SLPw}`V%antqYaDr1^kN#HYiJVb7Jer{8aNESRy-gzFb>O@pWH)CUw2VpG$;H93DD1;dW%0% zY^y5rEXy;wuIXN|l;ij0h1QyBsV}4&Tp7Yeq84^<1tFnvM`YSJPLAq z`~B-1iGc;CUz!upCgVjE3!-lXwf0bH#9g5V6%)>s$SK0lI2Q9)XV6-|YyXgX%zUbN zUg;i4)OdK!SsxRZD$oA)s?JBN=j&n_oDn~z+ruSW zec@PHE?%He)r)!)Ih2v>(Mc1nlfQnWm@FxnzfHdqsS?p_UAZ-1>QSO=rPcvjdwrwO zb+5ufubh#!iINff;`#V3E%sJ$agi3j)jn~ zeD}sQ48m`{qNm^Bj>r|nwv(9(r7}G&l^;ElY*f=C4;8j^<<_z}y_#&X)Zayrm}XM; zTWt($L(+%?!V{rHW}BIDzieTD2*F`YcepL5xDvqJM}{1S-)1;fHt3Bacnfq_=R_Gk zpt{WDA7~u#Iix@OWf{#Vq^_FxHJ<54vPmy=xW>B#MPY&JCWy9O@ym zN2Jkf3)70O&}P8xBSkLyO5X7;zN!~TmB4qM!`aCN%$AzZN zt5&_+6Yn)wye-L0B+^m0>MOGN-jY->ovhs7+XY_h>s@xxUbYl5p%Xug=r?#1mpm;` zHgq#C@idLPeGj*PACDn8hvT?Ly`{fvcx-;_Uh*#ok(sETnVWptxLm&Wp^*znDTOBg7_Gj`+dT`e{LPvIHCtW0 zXctwBL`|At*)?oh5+gP4`(g!Fv7I+W37a6Si2K$Fhd@&k@2Di$?-SXN8W2atTa;IU zv=;9&W~;HE(3PovIKi*F_(%%#r(aNR`D@cPB;p zolmUvLioG3l4#GdN1h_9=`5wx_%huViN~ntS`E4<8hLz6V5>!?{DUoH+eb6rDTUN> zlh#*8XM(PP$A}ME>$lYRq_aAH4^wLodX!|FVoY|CqO{U@_%502MgBhspyFbc6?+oS z9d_}>(hqEs7rJ75ca2r`cd2R}1uJTN7XbnJT)1A6+l6<%M;+#vdbuskOqCwOZxvYd zsb*gH5X!a}wTx^+j0`l>E861vrnb-8x3=26PPE8?7^${u;Xf!t^`s)GY!{N98v!Mk ztIwZmI&%tNEzdG++6s>@n5(5V24PG-x<@Jz&L6`Vr3SBEC*m1}GGzhM0dR`12eDiE zS-GDx$~yZzP4`mau&hCi$*mr(R^LlIly7Rn9;O{cw%O9!WFey?*<2!W!I4c=`sre0 zocrab+G)1zX;!t(jFri`5M;0F>g<)hZn0NgNXOQKf(^6`P$5qn>qM}_Rzlf9wC12C z!e;~}!QZ@wTJ#LIDaVADH~|?%5$RVxk=UjJqZ;it&`k0Q2&{tcj?x;d*3m+@UF47W zehQRt95W0`qaaMfiB0U%z1(>X41QRSq~>&dBk*I8dmmmlKQ})ULd!a_E1Ww8XLe|4 zZnX3=j&_!gdGm@b*=%2v3yUIbqwV0=GPRyL)GkAchzp8SEYkKHa0*P{gpOR2+(=rW z;fmVm%2F6E;Q?a^4i8$-)H`1$ORb!$d_8fszA1Vc1&7+zL^8Thn%(D`#md|y>12Bo zLZ98MDGFIW9`xHzM#M`YFH<2bV9C_P{x68*RR>sKXGl1SiMk2p^a-5i;RVN#N#2Py z)QA+)P?*?R>TYrtMr`D~1X}xl>=hJxJG**2-G_$4l~rXBdE-ppJ{B;!6ngbwFD;xg!z{s_r@5_3>sMB`)_k+ zeZDXfKDBR1x&4J`EVzV%CLYG2iNWtm8U9PS;m^1n{MMG8@1M^m9+TBCr@H?V4%N(Y z{&9uuxs(c)l-gp!Z*yv5Ubs~}&i8QrrF_3tTZIspm1aQ{#j!<0BQu=COOX?bR$yOJ zDd=3JK5%$Q;IPh*wb!uwXIV$fso3b_4C>{~fo_UXk<oJxMx?Z&RF&4`u_Xs03D4`ut^gFl-O%y2oZpeQ4{7e57N?K z)EHg@rC%@cIOTK1IWtM{k|rcWFkI%j^iq9;2~Kco!dxSaA`B~^n}dwz@|S4-t62ZH z(9i1st{e>0e@yOwRgM?!KPLAtg|eQFLp`f8%0u$(#qkQ!WrG?&0dSml4W{9i6omG=6m?SvrD!sfxa z)VO*hOx(L`X!A`83J5HNZV%I%U;{>};6wkLav1+|*8eCs@-Juok86 zsYT(o@dRIE%{NNJzdpiMk^h@=-e{x}_BskQ2Fqm7Bm!O2PvOr$97d{}XX@YogKfJC ziUaBvw2cQ3?(XgooZvKWjk~)$0YcEm-QC^Y-CctRclXBTJ5zK1e@@j@t?Pa9)>E}^ z_5zD_gSGu_BID(hlQniKS3Cc!oELyYVK61^)wf`QeR3xW{LYCU3?31%AkTmVXcK*F zi&0*1h1ASOK$mILy{lTUf#0LY%I;K;=OZzOS0st@dfNW!T!}AXy3s9RcHbF~0g=9l zT?!L(H8%bbvz1@WuMcMDWA3J(Zqiw$kEQG zf?#jGb1ghL&ic?7ZKIVzvLU#PGI7!cfH71<9c^m!mY=pB;dSluiqy?ebxWI*5Vx-$ znnqv?VknrD-AGgOh(5RL7K^7-{d|vhu3Kn7W+HsGt6=`KwEJtfM*AR~wg~Ae2$7Qb8rS>B6;&QhJLVFef}yW)Ed+4p z>qQ$6((dQi&T*P7xm?5~!UVibc8gA?FT;D9r7AdOS2A--!~J$VQ8Q9b?CG~1o5i;} zfO7E#d)j%z{C8yzCKJU?2*C?!b*wR8^DN#M-PA*el~bzx(`>ZQ@wE!M3cH>;{^$ZxK2_^{^C_Iv ze$Wot4f(@(4s3OUoCFZ7N;t%eW+H(g*)BAO@L6JLxjl1WrMK`#epBFg1|g@=tHw5@ zb$nzUf*z(QS=m#gR#VZZ_zQcKWg`R^Wkq#BUkYJi`hF{o(gXQl&@Pd1W>VA<=xdk(3t> z=JNb@c)}blHz^@zs>iY))(E7(@eM%;f%sV)u8J;BCtZ9>L!&uM83Xt^(1}YFewIIA zp6AnE??=&`Ey;xbNlxW`HR9is6H+mq1i>j={S{vo)<2l_)0UnW^fNClJA6iaS6y}S z$PUa1x4b6(7@D3>ln~uWygOh;N^2S>vM%h??Zf|s>4vnu&^W+m`o^jTd!Eod=d;`a=QR9Z77E#b#8Htjg^GA%Ss70pD>9}Y30PZE}wUF5W^ zA-r!GMIaj38&$@-!4ENQMIW2~{OeBQB}HjBJ0`oI{p>Km#Db{kpnHtq&{myFfYqvp zrkLKhx)*zCzGjZ`^eOY#)6*?=2_gmA(?9oC?(eHLCO`doDg!=y{*s-}%P)Gku4#N^ zOP>^`loV2B+0fkc;dM~{l4I9_Zw(G5e(;lx^ z-wD;8YzIGerjT=O+HgqQK|u)w)`qpIc#VlJOivgaROC+Zv>YypN(?ulEd;90SMt=F z&0UX=4!@4|o&RJA_~%mpIs83K)w&g)q}q$Hd>_qUw7F*L_msnE4gWEq(SDBD?*T8~ zP5<}m;D+rcoGSL5#oea#>8n|Tu85|+*O zG5L$8KL=|c@ZlH60rtbh=ti3jih!+UAvxfBOLl)nF%=w%-Z&vO3&ZD5^I>zon>|f3 zB^`U>`D_rQICif0b8YTNc>Lw;=2ZF4?5F!q7_VHjI1ih0;Q*@J?Hg`$a8_C7U&|A| z^G(GiVmdJcy54oNxdCkTdwql-2VS50!W#O*Yh{MqySNtUt@PejcrNA$NM&_#Ma?Uk z0H~T>F6M^qBA)UCD2t~Rj}?#PCv5kmCe?bCZMnaUOFmZO4E6F- zK>(hPFuhxfDf2H;7!rlEjQXvwAzAlv7&W@{v-GWU->Wp~htB;_5cPr?v?X^H@}!Jg3JosvXTSqd{t2GoB@GXXaJo zKNQxOA1e2T^bh&oaYA014-I^zWwqT4tIUIo3q@XNF3(sN|LT)!SFSai*{?E{@u`^u zkS2*$&&#QVF{Pr*&6#>SPw2mK)1SxI^4~=Cv@Rs{SDgAhb+(=(_&%mR2$mdgXqrUe zB8Y$o0Zi&q^Ju%r!oL)Oe?h^_tPeF^JeNr1O&kn0NkWkh<-LMGSa{4dRi~GBK9Ih% zn+2SIe0Yv`x#N87iXE#fu0(Gp`fu)(vz|s17DjK{^`PTikew2oD}fIYGr5sLiXK%Q z+G{9;ucD^@@&$w{2 z<;~I5miGl9M1KMV{yCd14-4{h`;?;&IlT?$Vf>D*Gd9Eujs8R+n6iMutD_WSN_r3N zJ^D47lL)7YbPD1e9V%)J2P4mspU^Pl3mneQtA9YB*PT}qXy|arHa0R`aGZfxn#&K& z)ois@`G-?Da30$oZB-`+g$G+50sKfEnc^NY%!;5i%IvRctiisB%A)gn_nsmrr)0r*~Ckp9R&VC`zk{_QEbWhZ)Gj| zWc{p#UwyL$D9jAbDU(o4I5h73A(sRlF0bz@We;c3CY@GoyNx{*9+tWd4mY{3`|+@? zg5gJvh<{!3nw6HUSozZ?$Vw|mJRtu3PVns88<%QRf|SZBYhnFvAOuav{s?D#5LdQ( z8((6{mVm5M`}^Q6b$QoFy4?Y6d<;>#9fTm85PS_NqHbcjT!vV)S!*W%>l8s$j z{m>1qo;hZXNx0>f?4Nz5x7R0p%MyI_yp!gEI7pcM*tgiFKRl{~Jam~3!bH7eass032_9+hkhM|K5%tEI~>RAR!^_267 zd}qZKognff+wx1mh!*)5Uo~PR8VSWkG4wwy{>=G~o}frOHw+~xufyRvnOjf}{uxGLDFx8*FxNLY6Et3~^p#44Wk;io{G7A>CY zrZYHL;iBs~geCEW#Hbc6bfbFC@~MI;ssVX#1#L2Pmj_pg+c;1i6#y~^WY?SjKAoBR5LLvY-3a@fz2 zA2rAI2Ty1Ls*Qs?uCPz+7X6)Ym~SByk1YM=c#3D?So;_7%R1vWxzNv>Td^jNc{sjt4~=b-hmr9n$M64MQB2Hj+^CCA7A)=qeER zGRqkFHNVWfY{3|*`^psON>cKlA9NC^DSKICr+UmL0)X3sHz zQ~Rps?w8KSX5fwFMc(c$8ruLjDtbGmgPY1t1l}#;9Zf*HBN>bRtna-dy!3T~AdS3M zWwdO@_j0$#drhy0aHFbJ4ap$ApGG}thbm8UK zh(dfsxzv*OGh@@;*gkU}Nzsiam8@nD!nziHKdHkq?aHo5W-eO4_Zy3M#WPUxZ8ux|(ludaS4LB(b`%Z@RO75!>?d_IJomR^n7n;Fd z6D%*eZ(}(JvESCyb=vgm(z$tPk?-={d@@($1cI=c*`vOM5gqOZ{hQFT-#Aw;y3%Ep zqd*4yO`(9ZmvLYuoM>!Nu3cB2kuqOh)Z4=hhq;n?D^Uq69aU)~RhMIsQHp%Nf#SsnFKDa2wZ~V9sG}D#3GjWyFyr4&vZX7x3C_?V7nn~pP zVphW-dP4Qhr)Ng1bsW8^Mwhb2Ii=3-NkAvg5VQ)HSwZQ5;}DYxyRO}m;WH%sH+0Ha z0Lx68=-&!@PvN%_tB;9_pPL0p{8ljoUBgWVP3f@KXw4u(WlZdOHAxa-pJjm^>V@a+ z+LNI91Qo>yAqA?QF1CgmLb~vl=XQN&_R2RI0j7rAM;n(X(P(>M51#6qs;hb(GV)W| zdspQ^PY?4_D@FYsiTr2iSRlbq=mimo9j{w%L>PN)mC9?(zqJ;d?UG+U{n47cx#8`LKk4BQP$kESZFp@(S(2p<%*LbSAH>B-lFtauxese%Q-$T8L+M# zG1(WHskDE^8~Vq|@o3uaB9`nL(JxF;XJnT4xu`=h>y1VzRBK9p>t9xwn)_w4>`cvVg zyiL%)?XmcHXTjFzXq91PS%TC->V&4X6t26O+>1kTq45jDcGi8h;e3s$f{#(ssI-*o zS4LdZMM}!5IWym(->s$mMvD5PCJA$0JGsx2S+&wR3v^O4wlDQKf!Y9%=sSHz%j2Oo zw`A#MW7lJKuJyBB7l%Vf!^4LRBP#gP@L_9GM!zZ9QCTN70EF>={e@1S=uTkNhiP@! za@eVO>HlLhJyunG9+OR8Xr!jma$Mwhx??aAoH~>}94=J=s0!X9SPgg8UaY3rKp6o1 zGws!D#<4!#N?E+CHsYh`olkyfBR9SLB}<{&kDcEI<^E#9igK6^G()tdV}eJ|z|=ic zH-dz&FcKwr=acAa<|{*x%XVEzZegpHMO~hjPez}I;eEoJz)PHW0Vus7 zSd(1t=~aUc^xa7iuI$J6+tw6{zwETt#eHL?1J$aI*|fO&IDN!(*u*C^U#36BFGX*N zZ$Baz791AiI|bQ=F>Y28G6isQg)D9FCjBndn-jwvlv?=;s7`+md z5wtryKm96y=dnBrzgH&B`8u8-zuyegY27OF=6Uo=J>ztz8CLI5wI)uXh?i+v)RI3P zZ5#iJV3?z^yqPn0S!-C0AmG4O{KmQaE`u>_-Et*Ya?|A~mot}twvgJY^j`L-I9M_4 z-;DbV!SJcKIWUgCDzA=A%1XhpT;(?mYIz`x?ad*^-BQ*Vd@9YcYRd@rspxupc|rj{ zSs2M6zBq;ty;-ur0gtIkc7{;~L1X9#W&(aU?oOAyB_`?DIticmEo&5&-Aix%{Y`3F zAxC2rDGO{eHWj^h{C(2$RO$KjXb>v5ClEiAc zlQ^(3bJ2e+om*yH=V|Iq=1l4`|Jo-EmKc|rZXEg|#jr!;;`YkM21&hE%On<3sy&ZF z%WQ4?+8vY%5T=oRdXdRtt1l{2fW2+3tS$X4y;;l6pq&2c@B8fCq-u9ZY_sDLf3UH< zXIM79l!>i62#_ymkfeyWE~!gjjCD@@!UCosVYY?R$l6Rm}SeriWHIvUMGOPBr z@GEks47304yTlO_nUZ7{_$0@=#pvPn%*_q!r*MTYgUCG%i7`ks^XywC-vPMgLo&XlB?C10t2wkA>NHlPMa|L>NkfFcj&GIgdL zN5ot{Pvqk3AWSPJ#XY=qChf&2EGk(D$p3S4`2_)a%`fH?S*>{6_dr26jWF^qr8ruxfv zSQv_nPo~k?-J1TyCwvTT)J@n|ldP6tI>XF7F_mPRJPSAx`Aim2dK3TlcNgqYQ^-S3 z8*-Ik-w@GEu^P{Ml0IQn7dH!E?aF=C>%m(6dk6F zaH98{>J{zmX&7TAF07$cdnM1>;PL>O^4h}X!XN9# zSB#1(INbFlSJ}gHGRKO-?LBwI%Is}bNL%F{t64@P_1Qx=>WO&rtj~AgcmK?!qjF@y zu%^Y%_8gz;-dVlwKbp7DE_OpY;cL)GU@M8|t9u7_Yi&V%ty=dpVaurDzEr+zLXcI7 z7fq(c#-$s;WAb6L14=|}A~;YFTEB*|ZFQN&lTnIVM{2|CS)tUtG(D6t>MkNu?*XU9 z`H$`l`KVulX~)JDuKwvSTlx#C`lRlq?0lN_9>i4G{XY2&J-M-Xr6oSr~zJ={m2CI_lQ@_}Yy zdF|Mp)pa|%IddYJ*=m}xN3i*>6w7H?O82XD+6ngiq(`=RMt8OCRSg4WY~h)a^_aCH zbK5GK@tn--@e6*vi+#mZW00B%W&v_e#P zL}+O}o@na<8^I|jNKPr0noMpZs+a(} z=(mc0YcHq*cDRi@R90!(^-#!rG*C9`!_E@-b5s0ChmNRTo2BLh?GI}rJu1DWzQAU` z4XCo&b=(W6;u8VA-itROf&9_}Dc;POU&*4f3EdLZ?%e7JnV`%%lZ5Y)xS-@7VOz(c ziNE+><^*2;Wec{gbSf56kg5I{t!3JUu%SDF60^x2RqTl{_+oaC?K2m9D1j^aN^A{L z6IBP=$VZx)mb~ZQD*tv}kL{Zif3=mDmR!=53(Uy9lHjy6RtCWOjLwCm#=wx@{g_G8 zDC_6wPG-@kQ&yx(r?%0>J_z-G_hT)~7_a)zR4TD@bMpNV71xh}t7J@qfARtb|HNad zO!IkZJfo3_kKv(~j2=a7u!cp4aU>M*C7FH8*&vtMHE@04zTKyeA96WD(K|tsdyz{x zQ&)>SMYxNz$5TF17&FOri#TZIwV&qeRVNx3?Kn_O7c=DbDu{ahbB&e$c$w{za#=nwN5^@hQhag0*4B4UXlKg560uY zM0%`Du*amqzFVg8P)Z7PEa^8N+gVGjy#lN;zE0}7Wfwfb&dLuq90DF2SyV5cJW1%S zXWPa;5WZkjjki)@o+)|*m85edv}|8&b_c$ki^|tC(cy;dwY}KW@uz2xLhd0TRCdn@ z4&NmtBqZe|!Z46!Tqq_|Wy_HAwqc&wm_p^Y33+-x^!nbbCd2j8C6C&F-3J>-^r1Xa zHJ8B(kKs0^C%|yvyo6%E5^edU(tOf6P~L zeFsY`n2b{pHC#%(x9~szo1~LuLM)eTnL#K<_xokek@S{dLOIj$kP!Z~v9hc;dF8JP zMC@KTWGRX5QC%yl8Ib15pJ$v0Xy?u^4eG;gN!Scuo>3a4fA?+kbn%!N3im65kZB2n zXPOjAc#&jnX5cRWTkCSg=dYAw0|IK%2HY8FGM=i!}3~dbHR6Zw{h(c+`Kc zjEp}I78U&HF3R(i>Epl9&bOWxpD%7ihy0dPvcFBB2S9}F0PYMDkrUPM%vUl&L z9&3%4_zeml^9)#%h6=tTvtOs@qK|KdT2?p#bmdv95`5;4qwh~YpWU27Jm zECu*w!kqqDTwXfcJSRbguu-1H&>N?wGkHj=V@{@mSRehgrk{Piz z?zbp6sO63l+m0fH5)}uvZt@=%x_ariT5M;VEXGCLWJ5Ss7Y%M3zra3oes)(1Xk)C0 z*qjkEVN9JWBFr(}+k+|e5otDuG^bNbkpX@a#ej|71{1+^RsdbB@BasK*}_} z9mYeHG!bBHMhud?3L9FlG#b%wy?aQT_NSXLE9!Xp?Gli~d}i93Y+WIxzZ)zsBlVj> z{Yx#+u^di=QH^eavL)+yTJ9rRT{o9xwC9*`B%AbzgbT zRh~z{zf_mxm;84`j|fe~mQc&ldc!?d2ya|h8zocmTgLf+Oa2JXaok~lAkjlzL3b4p zZ@q5xQi6C}B-m0A9e2Epmoj%*6VcZr9YY^1TZ44waTi%=egW9AMs^h?t=7u~@^Xu> z7}M372{{{>7*83BtkKI9>tzoejZN)syNHuZ<>{1DICylmewJYpq;_~2lu1cvAFC04^c?t4WD#_%2&ct7b^_@v{=(D zF-o=^lm_1Jhb)7;)rzMfv`>dBdn_PXc1dNKBr#lP9#vS|_B8L&o?Y6i(zlSuwF}h= z_PeYq16W>WXR8#G$sKecL`s_i9g%^p205$zR-Vp&oeA=TbHJ2NDXOO#5ie?+g?u0q zRbi##nBZ-)v%#gj_}|`xn4PWUUkf=`a{B1U(e_r}!QOIwt1MM%O8_oOe=|cSn+xim z#7xx10!Id+AmGlUP4dBnHF1|L0UQM+uk!LB*Lpe6E(SVO-CsxfC`}>2*>`2iB4V=B zZ!-KcATetABns8M?c;_wfq^yeZ$!Y@CBw7+KuQjUaq{IpEhL{P#BarFq<-kZIeX|T zljvs@+MD*G(!`3Z4ytabVaV#)g&Oaxn-ZkKtLhrZ2W8f4vvOIp=)AqZt>0h-t0$>W ztnrTaWLjc;(8gai3S~K}v|CSlr@6c-d2}b*wxB4qdH=J*nImvVYla8vomX$l|E@Y$ z%ZGKPnkk4&70?ww4MZN&d+hxrFl}?zTbYE}=2;F})z0M}0M`i)=bW9OzV` zOio8M`kKLZUq<)c?rv8HaVm0aMbGqzG4)$1^52mMn>j`rGRt^EnqCqMzjJG0iJyC9 zk9!o#qn+n7QF5B(wY#z5-sH|`+q*)ge*hjM!YI6*_I6^XOx@ha|R zxxZ;p{u0wqPD&fdn=DuW(rL`n6U-&!iCBK4 zIfmyu)OUp>G=l$l12{vTG2IHaWF#*MWv~Iua%;m>>eSByad4k&S{`%SdfE&0rbTCb z(Eo0Nt-p1tMAPw1o~f@)V=Bri`yATxPlfV}l+o0RijyfJLuO7%;P@9d&bYcE2`d&H z)RKjL>Qx;g5cMV6;JSpwVvOi~T!s^k_8w(~Hv$1ejaoJL#G@L(u6ftLwJrR&lTRDb zB&{yR9xE+OIHpK6*bOyojsGg$N^+aDbptd3rVf+=%SoMkOeUMp+Kdj}zq+cR?^G@T z>$PGcKQIr(**sdggT&VRg$LM`yLZDga>5&Lwj@a_ZX%ew{17W)G*iX60%7yu|8C*t zc;{HAA9*#cDI{+>;2ipA7@-BZ`MX0q@O9fqX|J;mhvd#gBk*CpRuua}Wq8 zDtzf@2SY@^2u14^I+Zb-HSbSp!8PB;Z_QzNt}7za`kDEey*D?Q?aDIOxGdjc4(`36 z8^AO}WRmLuidrv}RLr5zCeM6p*z=lk^}tshb;?`wlgUYc&T1T)s?YVGs5`qmhe&b7 z8vioXkw_tG)L&lF#j6c2S=df7_s!E)p}XLjwf-D;lIiklA~vhOIjeO4Jl69Bo{1_> zTrf^=%l@-Xxe%cG*+#;E^I~4!X3Nrr=F{>@M&G=RlLcyHi%zAW8|nulXt(*`bKZXTZs-9tZ|dVItc zoz*39%9Jk>a}8TlV)#$N>SK5}_$$e)TD7_bDT5h!?q2fx#_+IGHsQHG<79dS7bg7*ja9gWoadc;xl)Cclx78 z4m69{4&{N2&SVy|4~~>Wzv>blG$bETqcx?A@OU`s!jPUXtE!u=EQv|8&l zyIHPeiJ!$w&B3esH}?g|ON_;>I>xz?PPzia{eR|YDDSmn`X4!T#jrJGdj4mQ8A^wD z>i?NTC;pPU^?&5hDA1pj0hR_#O`4IXBm3O_DI@Mz;ea##ppv(-mHmTmo}&Gq`LF9C zE+(^V*Iyu93kJM^iD1TniYj;JJ`~8FBV*uNmxZ}DL|qUaKRAl>)iwSZN5=bQDgB@N z*f_PXVuIC4QVK$+!x)CkZI%Uw;yz>=C4LxoJkU*Ei-9>nD{}R}eIOJp8?@>;<~GzS z*j)U#kAY0rVLQlLGr0kD$N%<0Qym&)JXE1puJ^#m^?!Vf_$|>7gS3nj);Io-kH`~K zBfPbSC7QqJ8~^P?jqanyowq4#W#Zz$eK@(YwVgY5tUl`did&h$0=%9C6X)ZvhQU`-Qz#n%F+>T6MHkmx@kId z8AnbCIjb|Ox}-1l^lO~LTja9#ZJLd<|AN209{ zAU4eaGh5iFbP48Jh|lSt8JkTPX?Y)MJAK2fp2tlg{=>@<(>~c!>^t}@`lQ6HBLp(3 zDFB)x6Knb2d~qM!gG5v#sc+|0bOnhPq>THLjRVfrk^}1`8d5dY8yvP@KVHhR%()CD3?Q-xKi^-9obA5Kj0uB9i+d+$+%_+__?rE0$JOxP-Uxt=O^C9{nBF! zn!v_&fRW49dvMGgd{$t2YSjWj^Ne9ns6ZxVHC!=f0Fs~he0|9f ztn5|TCoCD7)V4h7sMO03wr_JoKVdGM_nmaTS#hO)BdyvHh55`UDAs9}r7%neY)_!N zNhwzFo`ldJe!_bvh7b%I9=*GTWW;lF!~QE67M2dXFOuiV@2?!K-Rx{T0;rfU6rmdJ#ki+&&yPAx6J;o5xbWK%B!JX2gpI zN{lU{+UU^MTPtud+0?EY@sP*e=h|}G8qG-sc~%TH>#LjlJ0iwAw}pnzlwj{0`gtZ1 zxE!R$cam1eH;ss25gQ)-d{n%s~v|?DLYmPWTaEPLZotjTW>n?{Cl(cn2JFuJr z_!BV+|IAIzPIR7sREE`AMFaD5`;ropYvM{_iCWEEc+sATF43j7xf~S&Kn!tGS)F60 zWZit4T9%9B`%uUs=rjIx5#16m(T2~oGt`-1ldC^IkV17vr)gW%vLsS>uSCws%WS-b!|@pC3*~XU+CQb5({0cHBEQmxpyYTQWhrK0X9)$kRNJ~by^GT1 z{Vhgm6PTReNtXUsr*-4kaom&*M_CQ0DJ zvxJ_=Lb_%PeSlSD*}GWBkhS{|^B3KDS&bIdDrh<`VG?W}bZAY}1w}_^a=k|n)3w*| zsZ(PH3;T6Wn8-ZSmrOlDIuG1B@PsXj~>Up)HQi5xw@Mo!4aR@DFK#rY_# z>LAgbQ$?+BbYPf8Ta>-aoLZLBq#A+(&4VjfO3!C>p@wYs}#WoezK#F>I>4^BCc0XvyQ&g6u z0c}H$O!sHhmX)p#;c>4%h3}l??FY#&Ku-Q{0>h2$96!l#v=1Eb1-Z-wU&i*YX5=Wue-hCd*~Pv@9lYznyA!k2gRAknh!in3oQ8dkiTV>m73<=(-auGDumnJs)XBCQ&6A0GB4+S>{8Pc zg2#d8>JoEn(jcehA>qeS2ws+2G50D_FhjG>fj+y1@(G*|nlz=f)YG~94RcLXO+j=e zr6SGr*lUDM*=Cf%D?kU0Gmg-KU5-NTR_mm0xJB^x{##`O8tX-QV>J(c5sWWs}e-8-1Uv}&VXhd8m8kKF*{}r{@GT- znpRk~fX{_Bl@Y=IUVeNHXduGKdndoI(6HA=WtMd^$9d&+qJ?C1!B|~_BFz2k|Ih6a zL3EL!mRq6mvo!G0n~Au`YoVA%+J=I=;m4r28jesPb=hmG$-lsI6Ol#oi&x0My-Yq0 zB^8w-`uKFuFBW0s*#f!v5!$ zl3KgofW;>TTfpl%qp6nfZY)Y&;#vBV^?<>8+2|@N!#YTd5c#U1BT)C3ikuX$*(VXnne$$+-5zEF@N!s7IL828} zm7*2cI{~EEYfi*P*%6|mWh?8X;xMorL=02fZ#7=|v>b&uFqzt>{Q*MfB>y?u8$XAD z69X66EiMe#*%}SGHh97JEsNINvV}k?ju~X9G-vFKMkC{|RxmV~y3D;#8?KjBt&O=V zr5>LTv^pK&Nv^1pcCdcqh<*uh^F`%Lm4xz$LCF0HQ1y_c)Ss@B2Z8k-Vu&zsT`>s5 z;|4}bg`LzJo_ZRNE)^InrwHB&!Pzy!*xkoJ4K@8T<;D>gqG}!VXg*T0o$u;c2uy+# zo0AdrwMh(<4JAx5%4$8|wMh#P07z6l5 zs+}3@p<50tWZzd}hYY#vp)07ZPw z(F!e$(!z0(0|HVz2xUmd*i`b105{aqKLSs$;2}xinTC{&HMJXef`%`6LEJc0OCu$~9-fsNb#5Qme$M39CH)g#Ui zh})Yw!`z_g@f8cT8n=Z5NK@?7&-4pf^7HudC;e4PR9kzT?o=4hoC@MO@H)w+=Ix&M zsorq>z~HV3!MJK9SL{tN8@$A&yh{wXzmPE^K~xs?Ofw7OOpc1Zil8e1}}y8 z#k0(4S#c1c5i82<>IsdtX9`V#b!{%4pi=9=-hnK7?5Gzx=AO4%Fa3eNR8cZE-uNOi z2^H)}^Dh&hf~FE*srhBR4>`Q!Sm- z9vHh0B&4`rvPUZJ9Pj`qALUpcHnCP4QSV-kat&3V~b%O2#2;dSgH)BC@ULv}mAc zY^rHcrz-2TnKd&O<8wd!SF9A>v!tS62Wb_)Ece^Of0n9%b_&>7R3uaF-y$Nyy{b;o z%KNXw-p#tN%b}P!Nv%~}mTs{2HlgVnnOB1x_n+KF>W{`B)!ZMPsPS2!2=Q85SjY|K zHJXjH7);&uyskjI)z~+`jiW8ffGyn#g|D7HB>vSa1Y3%BmEMJe9^E*r1b2R$&*mkn zH|(51rPDf7tsD8?mx18SbJkiW1oxgYLN(AcUa5R1`a?m=fE?8+#%D`UP293}7zj5L zv?FSv-P4y@$dprO+vSi<)BCLShg+uGQDl;`$pYe0X!sN0D|15}vBhJo^24#Aw5^z& zc(?17N}_H>i?(m73?gC#8wyre(lttt$bJE_AH>aG`JHgqof615b3paT_$mdM9#XL( zx^xLRLc$BrUOl#_;axJ_+l@$Os$4ZJPT4Z}RA>HNy5Qc9{S-co**~kM8`+fGtj{e9 zfi-2I>B>HrBsCf60%L6!4dL%@)ZVt%n7x#o*<3l?@93WH5NO;pp8 zJFPY*6la5@UnaZs^?=y-D{ZZs*Rms1h{Vh8b0yEu8jQU?h^D1lX1250qCIUdKcu0q zk9Ai8kxvLCz0^xb4zk;Epaw-SqhDH;o_qSX>%`#Yhcz-7>F~&{pBW@!pwOuFh$J{H z#9B7!(-=9oK0A5#cPDp6s7~}E!cO6Gv&&e8BJt88T^tLi-{PDk15qpz)Mhla7I&Lg z2ZA9UB3-Cq8y@u>N|$%gm&NM>Gr2(9DOw>M8B)Hb1FQJ8cWLj%eMy#707jW)J0OFppQm`%RR!*CS0cNRx%UbyVFz5?OHNgs3=oQ838t-i)>qWrjop#5+r>w3Sjwsj#@WWC@O zw1DK7cm;Hj+g@m>g$vwz9rFeKT9g*thVIqa)7D8tSkch=%EgSSa?_YL>&$I0o-!*p z_*?Ty8ldlR1dUt&Tb^k&(>uMS^W>Ft)}zzA@qGZ? z+8*#0o7FxbiM$?IlruM0CpL4?ovhU0gf-QYx{$xGabx?zup!sVdNms5LLT(rgOIV zV7|y^Dk1zq%`uP(=IER&TC87nr(jraU9II*qp(!G+;eaH{iUa+AmZgMGmBGuDZe0S z4aaZ!#n_JZ&%vNvnt-Yyc}d;!Jqz!d5P-M@E}I^pGQ?o&prWoxf1(&y!!rU`0wL<3#*i-2SxM4MvxX| zw9&Ahz5?dR2c&hY85gwhnPHnHX5+Nm_?P2%8LTrT9&qiUHplkBI>3@&hmD`*vh-BkyTs)^tp^DZECiWs>0 zZqQGOted*e{iNu6`k#IjgzDV}KA0}js3>574f!8gl%leBGD+=-^^oba&}Z^L>ytDl z9dMhxn0=X*$%q&nzZ-bsEVW{(M?Qfel1>MnpF8@lj{8k8=yx7%XD7ZA$!H)jI9NnT zSZpcEP0Ps|l|BkwpPlti9wfMCZ&ss~%}mVs_YRhUCbRYmGFYdDlvEd~d^OJaBd4eX zMoUy_&|@XMqqYCBxTX6op##Eo;Rdm&nbCsj&X9oO@Ofu5muXod&VL8E`MKW*I?Y+a z)Ekg!yE4|Y*@}4xO)(wf@gFJj{OEMByImwVl7HvVv$-?RO`tJ=H&V~aXMps&aZ6Wp zyzl{3eLJX`z!-sCH3zl$N8>Q?EDHkkTb>;fYWs!t$j`h^4*|7w9@*mn0QqK_pZVKW zZH3T=?3+_X0kfnul{rp6;+$?Gsc1LfR`V$7`gY0y0cP&>ewP;k{kKjKZ-LjUB!NVB z>E?(Ygzt@uI^j8oCc`01$a{A{P_iv(wuaog?6f^br5{OtX%LKT823_d?E}m#`mW^0 zCVE}YQ3~0TT7?HvMQn6MY)oCHcBN_e1Xs;&Z>|vHIVkiS)#L{3PEQvM|EPO2d^8Uc zdj+H(VVJsRIe-{F#db9QK9PIHRz>e{!V1$YyglJu+EkOCu(U9_D2X)^V&8kb$Ye`c z04C3s!8r#V*fFkSd7qE2edJ$6(3QO8|7WFmxCMVLLrMQIqD%}}M?`*3>DR3AU z+PETufh2B{XI65{MUT2afQ?>F(WKz-6ZFD^gbKbntmEZ*==5^bwG8FD9W8;U-jSco zdC7G3)xINhzGz7bh3wA%LekXr+W2gj&lU)N9o#a2hxqE(h0 z;HC_ybu5PJ!FUzwE-en0O&kJ$FL+KMR^fqsF8yCf;M&$mts+h9FXZ=og1$8~Bb2-W z4J<;|7|4||?kBm_NYPK+e>CP_8Q#}|56IU4Mn=nxOQum*AX@&_0Kf1y77Qp|_pLfuBweS{`UrirrBvsLp5h^2P z7i6jR;93wmRjg$8;pqd}!{^t~;+b~G2xZ9hI=AZ~SN=E**MSA$O7&o2(u<>mV!B9w z2fVTfSns=5d1#u0REwz+=LQYirRG!$B7@y;tD&`C^g|u2H)k)Fr&n$*{$16)NNIG` zi`&fyOy|^6`y+wMaX{Vq{CVm#)2E$Fmj}10ktJfJ{ZjgzYp!g)#}6V$Z@ED&sJd2< z8ZC=kvIZN)uI5F~rZN{k|Ls`^qR?at@2P8w%pu^tN*#D))^G+|g!-Gj+ zUw9Bh&3JQTuI|d$%PPmK%ZF|q`#kh|#CMEO(UgKmqSj4;4;ol18nl#wX%**eyQJ8hmYr&geoC2+ik( zl`1lm1(92&Xr2VnGUr%4gX6HCAx`J!Z3c_JF*LEV!Q&7aXez_{VDeF^)Q!MsJ{Qb@ z?Gea@J!h|3r+_>7%IEul6Fm}7CxnDmdnb6Y1W(SrGJ7`wGlg;Nyzze`EnBwVCRwG(+ zoi}Wt6@17jqik3Qb>LE$$4~1y4%^qsX^>5lNSD7?-T?&PO!BXi{fhRmA!@2==7Ys*KCPGNZQm^Y5H;k9C2J6KMj`BK zQf9no;n1ubdZ*<{WyIU4pUKN|&nG#S{oKnor91{I#@J(07;m&zf;G!d_E6`5wUzd1@AYLiaF|wWgEpD_Y}_8K$+SmChZx ze+Bie8@?QRB+yyt`W7uqdEd{Ui-2mWJk=UOkFcyi^G2ITSp;@XUrYlMUxK*jiJcnio&n zzhp^mGvTSAE)_FSe+}ePma5l_k!T~t;vXs=GT0(=wDYNK zr8)7Ol4usEIeX)2YTAJ=IT8q}(0xP2#usl-HCE8rK57We$3h}EXd_15n?Q=B!neljiuJ58@PRoQEvbz>sRO}4(#!%9DH`B?`?yefv?ROcKj8KoRv*YHK-kEd zDCP{TP0yS7+vngqqR&i#cD1(~gzR0hPl;>!U4<Tl?Uw< z*{aF!Z5YW;1{MSm3u~m4Uj?-&)o;c$CqDm<3a;wcHg&{*psEi!{Iiqna5T_fs=eK0 z<9V>B9-aWu2v^Z(_~N0{!Wfc{l^{)){%8M^_;-QH&!e68H?(iUp*AZsMyWCB(1N18 z2t*#pCpudfC}x-&2b#ib+>D62L-J`7x!RPZaFHmYRU z_NN{}q&T&J2mZU5N$LNjG&3k>@JRl-i1t^yFfLzGOR-3=q2H#|LzDG4e+p)kEN+6F zEnHC`oxZKq^iSYrgMoz?JVdvd!a0_Q>&y2AFObV5(1l%6!Xt%K0yC`epi6CT+ZZWUSkHty*?1S={C3Um;!a{w}Kj zq}Z|Qm$0dkYEj8>*zAvYLriaBUn;EZy}s9r*jA-|c{C;Jtq#?SI2u7t@P$sX{t10H2&)M;#IHuzg=tw(7x=#b!LzONd~0o56Fue8~S6pvKkw#QJ#6G0?P1D z$}oKT8FGXQx-&d_^TtpIq5${i-ywl6fFYh*cIW3f1m$8BQWx2dZf zUr39|%i+w6QMBF@UygT-Yo}k*tVz%pg9bXD3?B;Z<(7}L!-MRg-pMh~Skb50)htwO z+DhBW^S%*sx`=+4nXRp9Ri%$_dOeMBD_r9kO8uZI;_Wpt^s6fD*rAxx?tkYe5(`Vn zY!dxBE!lmUC2?5bYBG4%J+1v4Z>9KZOC`xv_FP z^;C5y%}dRYzM$u;J;TT2CW$v&H+&s35iMD+HTC6<-yX-L72U67C6!GT=|0| zYq`z7!jdN)T45MSzRgGyw{Xr(Y?rlYOBKsz=n3Y-fijk&)3gUDElzK-?P({1171!t z>o(^#o_z38AYY@v-m*_}pV?I2dx#KWE-@?91;L?$#d-+Pd7V>mK(2(!x zHEkoI)Y7nUoL$B?eJ3Z2ltFsmkP$bMxWk_8qT{aPE2piROu`eUv4P?`;Km@Eb2%9! zZd+J@Q^>(y{`0gf`=7npSGX=Yc9NMyI;DpIh{~Pd7W8+2*JOIUAHEELtUrm{o8-1~ zmSoQm1{<`BEXzrxze#cC6n4$9$i$lzc3e?mH`#_Kw z4E$4uO4dar6^0f&R}0Z)zY#E_ylX-4qoK>vyYl7xLW8++DN%$LEGIIsXqznSRUGJl zU((Zf%Rd@6R|!`P{a**U|E^|P4(jE99Oy2A5(%eLW^;LGeCP(Co(gY;)J(Cbp%oN~ z`hS>y?S|_6ov4vf!#LEBJ<{?_C_*t=3AJwixJi^;pg!Pw;@IQaSAH7w?gYNqC7nd+gKwqhBA@Z-kFT5IZ3BALwla0`Yda0r^q&QNMNio9>9rQAH)$bzDZRNI)mko@phpW_?E8r z1n1DC`F)-9&YiC=?k0H z!HLmZ&~>!ur?45gk#pF3R!Mr(K&O|n+~}VI89d;p;Pz7UEzzpAO2p?`TFbXo3a4at zZLwK&G0~#iOnMV$c`Tp?VZc%uyT2_gmsYJRUgY>#r6uH)f2VcW`R-sH-|ajlg2M1UBpt6)Bu|n)Iu<{K zxCEBi6&UU|ho3BEDWuL2H{nLp_%Wo_RL4A?j9iwwHrEl?4~EHmDn&2p|FmtV$qQnw z>PNFcxYJXr{u#RAfYJM2)}}g1_tc%PdiRx_9$(pWV?@5(QrS^sxfihAX@McP zpW0#}^;#K}_DmRB#+VR^`Q>|`X}I7;)N&`tL0Yjh(7MA4ol=&LvpQ;cf@NR?ZCm+1;yr{7b0 zDR$Osp9}sPe;>969Zl%9ajLDSJ_ z9TZ&gXhIL^5khh9q%yED5^P_F%*5j|r6-#1^k9-yQs{E36JZ0L0<1X3j<6KAla_nk z`dKj1)HTIyK8Hjz%hv7I?0Pp;!9_%AAYI+`spYb@Zl75|Hh25wKU zI~0L(y^a4*#dbT-g)#)pBmb-a_(v)(Rz#l*C-z z29<3j?Dywr{0JFKMVBrSY`C;T@I^E-9vAkH=Z0+lIgge*R^4p1$L#clQCtR7w$Pb{ z0K+cOuGQf3JKBMWR-_*`5o8Y~u;SV8u3dl`|4FEd^Yk%LzC~+y%G+n#$(y+Uep(oLS zQbwoGA4OS#`Cq7Lxx^~&)d63vU>tYbffSAN0B^2o0b4oR;kPv**~Ic+f?kndnGHUR zh5MHc`qd+}D&(+3BS77!jP9d#_LCLY=f#l=*88F9tQf_3T$C_z29ubq6aM+3s}R;u zUQO^fmhnWIi743^#!U~}n4C?y2Ra?Nz(J=5t+~i7vkR8|RVzi3U#NfCOEB)yXQKsT z%pp1N%sc};k7GIq=eaTvYSL48U?W9`_ix~^_@wN-f(^<<6lH?(UqLTfHVuB9p=bww zg=gn^b&_27n4;-}m4W{Jga)y}HCTqm@m!ldxth&J2UA zNKaAG5S}{2V{Yd(*m}5DFL*OEFfcvX7;AN&?2sFatNG@%vi)0OOAGtnPg@M6;hS!G z*+B1RFLNLBNwy2fTO__Ex zt2!*>rGH$kz>QSJXq3Gg(r_wdtA>eu)a7oK>MztP)*B!nNUO+mu5fRg^6?YUIr}b< zR8dV3_X;idu9Zy;HFze(%*Wcp zUSnEt%m<(t)>ws8f8`e9l&sdDwG^>BgF&xCe1yce?SmN%N*hY8Iw(fB7;zQ2=N&YO zUs>ouM^BDB-X>X`cr{=uY=2zMJ0vK_R*Jp!u?;`^UpO%)`w4Xvrmpd;w?Adv=+Qqo zT~EYPsuKP*q%wF^t;Cc=Y4CVoe4$_d`K~ganm{w)p`VwP&`m+$LH3@>|Fahm*Ai88 zTiEi%@qL$dqwT+8cBSP8e5;u*6?`Tc=Y**lvTB&>Tz(}y5bX+>XX3gj*8d_0mXs@| zUbOxM=nj#(jH$ZibzxEyG@VseY#zE_XSeh`dR2)_NKjdX}JA{4P`vM00+%;4di(fKB&Ojk711gKhO zE~sDRp@=2gV->g|(Y{UO#$iY+Cj;r>0#^I%HyvA0h_FeU*9uzX=TcF@)<-v^&n3md zvy~DCFTf(@0DP2GF(sBm2?Nb(J6;V(Q(6OUqO90O`AMuc`AMxyFU(dW3zWsDx~5iU zBs?m%aQ%!5APj`3zUE^+NoR|BQtA7>)0L_*uVKCqYi2fZpM++Zt1P*agdNrWKx6_h9epncJBQ% z%PeZDYng^i&jy$~MCC2$iaMW2^?+$yHa+z@zq=Cc1VKH2N5FX#^FNcZ{kzhhgH&=&vU!@+xm8fuObY>5y*y3PsMCn)MGq zf}hT+N_EvfoNxj-I+o&zHj*swrkT!KpoxIudglg`3yW0IMlNFb5OS6P3gp=x*-}rQ zA=M0^88y{kK-wK4t)fyALsi*3CngVDOz$Sr6*0YNbS`W5Qpi#X@E5C0Evdvr%z9F} zUsDqZaB!kJVJDRjhr_q2N!+mMx!Ho47`*Et8nW@MBPZeV*_#HY7#d*cHS)K3>n)$s zWd4>E^#9$MFzkI!h*E+KJ$w()*zt^i&?~^@8}PlZf(?Sug53Lk$c5SPn`S$6Is0?g z;JY@oqMlrgH0BVa+uF&GZiRAdCh2K^!3lwyzGF>UzV2=x^~&DYAkg9m5YWgHr=!w~ z+GCM>+0Z>>ULEtA6=QftLM=G*^JAVB_JpSF3eNJd-LW!pJj=idA`eRM(*;c$`}Cp_ z)T>~eHzu=|F?a>QxcfqHi6@Lw_hb8bZBAY5ATC;TZk*vPK_xM#JU3 zWFo84pjxR<$lLySvgl*MH8m)}@B5SQ9#dD@NIqzBlg@MEcg1?=m6m3@hZ@C2wx9QM zoBjmRm5haY2E)=zBRPb^RgVzHNkL@iwIbj51E~M<{X)MHeslRXydf^}rm`Fm>M$>s zRm5b58~Ir(inB^aVTR0hzm5Z?A4_l~-5SCAyNFoR8V#}k;D}ovUckb4&9+0gI{iHS zXGGQwq@kp01B-Mi{6eE0FI?As%KTZeJjN--u(FDRz|bx4oU!d665*V>hO3UO%cJ|R zqk`V#3cP}`Xdk)7Ng45RNqAa&)icT?ZrpU`mRt{dXNKrd@h@&cUd>JxPYziD^S@y< zj{%Re{R>D>h2G06f`3+~hX{-~u45vu3fw*PJjV>_j~-<<#K3p%G~UgbRQH}8F4uDx zE}LA$N1np_fxp@>bDlDjd+BJWOPpX0Mbtd1)m-<8R91V(FLv~T=x_3KC70bfFl77# zxwKM0?V2uvEDS&8sRA}e%nl6pLYmqMHG_F|NO3( ztF+Up;w-QsOf`F_u1S>Aq8&3cBI&mYy^d}Dyn4U8Gkp)r<%32~^)Qbx;5XR1>;iHl z@ByWjR4?w|SY=Z>(d1{)5ok2}?I9T#76P9=-^raQRDKiN{c+Vn=2(s&o|_dFH})n% zbw{OoGNg&v^cGY8Dt)6XIx4Wt;QgWFtO!Shq4}fOR1{GI2czF};TS+96DrASP$!|3 zfLE?ZkXDB|!bhWtIAY_ehw!4hE3T1C#?F=zUqA$~FrJ2=T)P?ju$JqHRDCypJP2HC zfILXSusD)2LPyW*=ajm!LA z`=c_2tm{&d%Y1e)4kN)(h>|8Y-EhdJ%h)xiEh~5;?QXmK-5@DNbIvxpZU-2JSO$;%2{)DzA8p{l&BkSXz9}%Wwgy}Qe2mWD~mlhfSP1k!+EPr%dwj23jR~^O)YAU>@LSYi zku`IJsuu5QDv1j}sgjAFyfzkAQKdo1Puj~)!0GOHGaVl0RXcM*yA2&@c$;7Ax9!8b zUK7I9cQasohDg&YmK($wEe+@Y+6wY*a8hkci{yR73Z#@8>YVv?#(Y9fygux`dP>v!`@znK8UNAv)eGr z3GLu3ofQAuz+d3~ScGCEZ<$%uNI1uG3}8CiOb}A*z+iP*3ex|lAU3%f#Rj* ze-aFuLp|d7PlEL`7aO(rgen&CmHbYz5)H8eogJRUR*iYA;C??crGBH`6;6ol0}UFZ zb7hO9_j2b>lC;}WU8hx5kP21>g`V!cdJC!L+>foi4ttDcBo=K35hw&xa=Pfjhu z3}3bNc-jf)k;nwdq0_!+5L7baim`qqvVs6?JuZd&7^D;qWmqmG)mA!61J?o~@n zjup*u?T?=0W77dSkD9~H0WvZ|7LD3lPgsOGNnM5pI`%$*xc6|{gs%zcw(?$_krUh) z44aKb9W}f~NyLNCr9v5quLgmPh+Hkd!)6Ij6F9PS7^sTmp!E|eb&vBdx5}c=fk3Ak zpOp;iIWkIznyG?$1zoqBP9GW1btm|Dt$wcIPW08oFD#GZPTNGT_s{bo~(i(Q<+{fPbHpjIVwF43zFRz1-MwFULT8znHUKi#_y^5NqD)*nsxAxxsp|WLOfF0z(4Jbf!s@s&mt%MP@wU<&H{2S)=5=rV{ zXhUa66qqG$y`~H1p}%175*Vgz`Y_tcW6Jv!&ESe#JXlm>xmqj#O6CB(OdH73kguYh<`e#Im-&eIn5i7 zfYJU8F8!T7AE1gcWL|*wvBDpR851j@RZ$)(9cVJ0Mx!*$d#f0zf-q#>FAR0?&dZ|? zG#PlEKH42AMIz~WFSWk3XQcJ_-*hj~_ivhA(5H02eH~t3`lwoliV(Sdk|6?5s=S&o zL&7ca9t)Z*$__a5;yIPWB(aWtBB{#Bg*+O&%D{+9JZ<{c6qp*Uy#X?9=zcmHMH6XG zM3|=2T?NQ&?W7?(fPTU3>w2DfjpfE#fxykd9K#_EVh)_vvCwlmUfdA+$cG9PnJdf8V<;*A?;{sPTSCFMps*pd(in6 zyWf)KQ=1s-=c)1evn8dKR}LY{wLh@d`?oqrQtI_LpJAQIyUB)2!cDD@)w#j}X6!8p zkLKBP4Ly>9X=)s9OeAanH>jshzfOxD0mpVf4J}afZiNE(2O1(fUJXgYVb++Kwod}@ zS~X#>R|o!wz=dcj`Q>@lfEpvG8$;B<*}^%AhCra=wiX;%LUtkA+|quRWxSF>VUK@m z3{r+-L%x~HkDF>M6-`H&`C^yjZ4{h_| zkoTZqSlk_KJ5E$yjYckkN5{i0a<<`Cu)7gW=+w7>8TzxKj>WlT6dRUISj~gB$7Dv6 zsM_q*BqmR}o`aUGt4+EUMU5UI`EVJKa$8jAVf?=rrY^78&5EzOJj-w#X8CO~T^2n_ z&ogPyJ77reG5$ZZRj$BqH{__2XFo44ymd5+jT_0=` ztWA6S-WIbbUr}Yvmfzt}x(RS2s07V9z+r{{6iOaPBg)1jzq8Wn^t+mX`B19|r}h$> zEX%VzP_U4j+O7E4v1868*78a6D?0q+e|8+oE=i zut7)KosWQq6h4W1nZH$ZJh4cx?lz6a->b=Z)TPGDx{?yiS|1{ae26~mCkW3+y5}61 ziMO0TKlIBpz2o^5goc9BYuUCl^7cM(CDezq}1jzG;=I*67Mp z(QIDzetUZ*2g>D;RcmDck5=bwfw@ld2_di{cy{yx5TOea73np;#I46=Qwne+ASLbv zqshPE9z1@B>NLl0*#+OCH$yu)iY<2v|V0{Aj`4whfI) z9edm_?6%{^kI#|xORc6^rhMj)Fx5_DvP_wdig&S_0m=SCF!P|~7{w#Z<>L{B~ zLc8l&q*|TnNC|uFAY~KS+nw1BJNveoT4QA+t%I|XXxQ%V@Eu&Bv7H%a%eLFFv6Zao zeShw4OT02#CpH`ER#y12cK})*Mpuz5P+A%WX0@k)xh@{%YTz4N8XZ8YE?mQ;t{5sq zTnT2q5m#(JtV|7M6jgwQcu4*V>RDpeSuFLxTpLwYPRh-wo|Cn^q!%JAt3=dN()>82 zJ3}v9bPK-43aUizjTudw>X|ivVM7#a#||8yvh@w6BCSN?*R=;TXmLk8-rf!(ck0n~ zY6+;wEBg-)8S$vw5=5bT)sSpP*ic#pp!%+HjF63WDHY7A;Jow=V~r10zkl%pU)I8( zI3Ai0xCQiC*x@Fl&Sy!oVVj+u^8Y@@WIxo(=P+JXOrCKpfB%mTz;hl9N5UyaphGt+ zCpay*L&gM>h;h@LEoJ*@=uS>92fOOuKQshXF_^BamH1ONdNQKbQCCaC60)V~s8AJ^ zTKEJ1HLJyxS%FYJ8~(Pct_b_JWr8Z29kl*fNS{IxXSIMYJVufs44VR+b;?98C&({^ zqQxV0j?tLRl^TYw5ZiLm6a5Y5lnCXNLklM_Fb@tjgbRzos;f_!dE1igbU3t1Ex4Cc zvPWC6JPQ5WH%+ujvVsTglQQOj^? zJ6YyR6_1#uBf{cX!KisfYZzu2t0`-V*K9idg*WGJwD$K5ZKL#|+b%K)*!M@3n-n># z7<-H9FDMf1^iO)zLX`r4UwkEjS4`!g%+LJ_%82Ak>{EC%m3#;_cZe2M6cd;fCIVKN z`yg^bM6i??j^T^sOmXAUl@e!F3zj!CTq?BeL$2w~v}cBtgkaL4qG2O+^CHb%6C#Br z{$W-VA%S`SzeL6c-ndV!Rd&5WoHagMo_qk~ zT7P>;Z4-&^(-#UCaz5yb7@L{glU@(T!$d|myg0>Pwo-I=ix?q*AGb$b@AiPGD}?l2>B2DGGZU<0H5VprD`#1n^L$re^%q z1TgAICL)*%^A?-ia4b*qKIi2=C_*OEMx51Oyw0WxSV5DR0rTfcig}omM*oH(@8BGW z3tgJA7lHEAcuq6XKUaPAkMHw!RIrVfn2eJ?mUfQqaFBhAE7ZX~4oI9aE!y{|^XsQb zAUKLr!KlW*Cy2L}+{FM;K(D_;-68wXGLJF-qD;HJ8CJ4+bjkB`p&9Z?lZ#h)5NpM= z?N56}Oy>o>vJpTQgK2#24(2E}^PL5I3|Pj17}+W)g+J%m@+e zRkpz_a8Po&r}w>t7_uu&!DcKC-M_oUiFU_4&LMr(2-7~yts#RUyqK~lkp0i-rUq@x z48VEqA1Z?KcuP$joJEwuZ7a5JM^ZV^;F0cltzAQb5Yr!)WFWtU;ZfQ#3(#Hq_r z)X2AW1M(GIQBU}m!u$5F{VEdOZdJ0Pa%Ai}c>&>OK#`!Cj*sPs!GZX~mySymnZy}I zzS-DK@`QO#A0?C%i)OSG{mg|kl&Grz~sRN-`&(_2RsqUk{2 zMjms9vuy}LjQ$$ZH&_cQ2}nh_FogG`LeSZI>v?wkhW~o;lz&2)_wMC|mxcy`1x;2+ zE>1E;cfmXm0$&LC#n5Fl@kauI0?OCXKpMlLhs-07t$rDbHZT&fo3y7ekJxYx>P&>^ zP=BU%z^W=60K)u3v6^Kt?D})ak>8cjU0@3W3j=td5*_r%HOf*gQ0?3Q&Rc|9CQ^L$ z7M!81(1QI^{IJeAkh2Rz$>n&T@!Pghtt~P-PR;U-(8`LXJ?+<0n^y6mLKRPuIuZ9J zu|&xeO><-)G@nRb#N9S{=ld;dK`3r5vqax$2P`X`hwOc93wmyeHz@fh$oCAB6dz=V zjAeAA)a9sVl{rctT4w|oPC~?}v%{-@b>B~ine>XHSa{0czHKV5Ok_QUxLJOk^!aKq zE_Z63=@#Rb4PD27GcZ+u9+HDpz!uX5d-y%abTaY=RF@Q~rck3wuV_$1v1 z5sn@1EKAZM8;XawJ8Qz*nOd4WKKk?5X`lf8v3oh%lc){*r(Q>Nlc}Cz4-;`z<>xNA!LQHC&Dqy-wBszJ!bX(2L60i z@>yXq&`+>pVAHs#{=T`{cu`!Cat~YVvpGN1JNjBg6SN5(k)|g zRzO7N;F&97nBnZ2#ae{H)%K8MT_~M{JMw0&*XFN#E7YU~MPw_1qF;DtVfk5oj!2k6p*DVi zR!{cDO}dIxK0TFXe$p#d!Q&-%@FgFw42`9%@0TdlAJtijgAR-D-PKYt(Jl}Yq)F)~ z8Qs5{`1C4q({gsC67tmFQ2=fkrd+41ZHVlZo@Y1Q?b_q^Tp=W#AnGxp!{IM!9(XDx zgF621F_Hnc;)8EK0E8R(vr7$h_IPMqH_rn%4I-NasBk3QHNfK8TTErkmi|ojR->KI z&tN~#XJbTF_AB|bs4vwK+4%8e`8rho@IT2^bz!bs!hP8^j_@ai35LcQ-NwEgzZsuc zqB(Q&KgTaV0$VzMa&bmvs?2(x^NxfY0Hrq9%Yt)i8EWY(D~Z05_k}qcQC1U5`w^uy zmF==Q7&v=`AS*Of0G80OVqlT z81p~Sc>b}^?ZfL*co^pT|D+-P^g3kP>&fC-3*SWeDR96cU|U^dZv$x4`ZqMAFu=Q; ze?wEHPkiX{Z)lvVKJ9tEFh5|wA!_e9b3ns9sKYG!J59F#4b7TLrmNq-p=otk82|lm zXdIA5#MKr4nTXf57&i2%GaCCT8L;v0BdO*Me+sI|gVbmh!}dcDa2NWNLJ1B=?SlAg z6ilX%To%e$##X-?Zo5f&*Z-jC9Yx@xe1NjHrFq))DsQbyGktg**U$m{%J|RQs-}^B zzTyOLy^yg8KXf-dgAs0fv=|KH`4*~5G;JxH?aO;W=*%Az8YtIa-$mD^U5o00KC(85 z!p(4;$*RZ13(_5ze6Zea9j~vNCQUxXu(Xj&#rEX6em;X@yO9+H6Lk9WZ)77{u7#@< zw1|t^zUGqsUs_DcGq$s*n!|Vld3kv$vgv8l5~Rt4+z~bl zwkq`*sw6t2>cY-V840J2aF8AGGTD%I*_>LShu;`K`VHY!^O)=g)oh{ez|dTJBaTNGcdY;Kl< zw^c4&XCf0+L(x?B5lrBGRb=k55SgFR_GauE5G%%AfTF;&Zqej1pFdjIIee5=Rw zp%w}Zaxk(!F33Mo=dNC=v`qBo!CHk zJ*!c1U1ic;bPdQ->B=_k3*3JG)cEyN43%Y!Uw^1NB{POey4*(2L-qMJ@qEx}bcYIP zZGlod*T+ds4wg9!H3Jab!4D-6L!m-CUP7M<~I-j^Y{s5vC zd3&LI8UIR`aPr4Vc_ek6v*G3-zB{&z%35YJHBe78WHY-6%(Oonx_Lh#lC|bOIzhXh zx3dnrKa#O>dn#bYfMwJ&Tz{&)Qe?xDz2*q%PAAWiZ`F zc5tiABg7An84R8mC56RtNv!Z@Z)3%c~7eyWwya-n0gQ8 zB#)S<)SIo3DiDJoIy=J?*ODLy-_QtD_2+EKLc zg0Fz|^73fS_{vf^1-(zLYfq|+g3)6dV22Ef#erhCtt$HUTg4-Lw+F=Yq^ro{qB_}^ zNkTf_L6*(lOz-5&ZXkpAs7{SaZ&&4&9$M``Uv78uZ4{FIjdFTpnz5+8Gc)gf ztLpg&zU%X=RclqPdfLpIMjO&E!H;s8ZX^@RgMOYVROzCRsSc+r?-t&Byel8z<(UYZ!Da)!%3Bx+Hl_ze~wIo_EN(M`c6rv3P6?3*E z1H$T4i!z7H!6w8>VHB_gvq&y9)r`&D6W>JU5_Q6Cx6#v<{z}MNA>)gYDryN8$R?l5 zw>gyZ6Y$hg*W_ewR})(92AU_;teCnd!};e@ zFZ|EOw9MUOr45vqQkth{t7R@M$M7%tY=et1F+3x{Y-l)jdFlwU4JO*1XVIb+@ln&> zLJ<{09sQMAsj zc#>#i1B98Z_rO~*cl^#>J8?M-^d`*h&q+$LR15edmrBw_8f!>3QCbQU`r1x94C_N9 znfED(A_aGQ={Q@VtYEETiCn&M9+UCnD?8>(70q7k6671H6rw1 z1p89~Xt}xMk07HzCYQ|rOAt)@fOb7F@^loWD`xn=1fQM1^4=dcx6Tl&we*ahYEd5Y zDyf;)iXtr2CA+re+);o1FF}3nMoYIweri4O&i^F{l=}F@bw&{TMcnzp?-kLY6dVcL z7HiPxG=Gd?6&*p5e!$)o>#$~bI)@gbfoa1#p&u0i*UZzAv4%80pfp3eWB9iJXUXEq z_Q^d5nQBlAx$ie^Z?$0pYSIGKuDFqw)^F9orT>>;%wH}uV*O zfel6`<^QomMxcc<*wg2_g3e+T+&y?gFji3t4oqLJOU1%&AHhi%?&k4!qOttOkWg=r z!hus~pB$SVu~qMWer4?$y|eZiakpY&_}YKAxC**rGCru(1q@%7@io{`yt$%g1r86A zD^;QWi{Mpw^32tlM(HNyzX&qKhDcQ3zdX{L6(+63jlvo_QxqMOQ&kvXqHvDln}K3BD9P?*>rBD zj1S+9dnPc`n}#L-IV8)=X=(I>hN1)>8zCI=`xAy%Srrl4ekOUjMa}W~Qh$6MVm;q7 z&`!aQgS6&vuG<3IFatlfrKbf=5=y|uSEb*V7l>?kvs$RmY4(S&iq~V0!KeH@(>I&Z z6D@L}PlsQ{31abFZot=u?(d#5PYtiiCtSL&VbQ|bPFK2Sjp|)3_X8a8N{ysKjVkXr z)0bfCQ7kLlLaY0`))$50}rp)MCTff*K>Z1Gb_p$ z?i~W_$m_w4VihHBpTvz*6SJv`am-XIRODEaCY^KoKEvw) zJqR>In)*?qiB!lwdaWkMOAF7c*s4=ksxIVB7&4(S^&(a3bs3Ry1?5N$JMEz1j|~=8 zA0ncizmVk0x8E{g>9PEC*nXX6;Mv{2#4$n z)=H1##r7WM-=V6@1*|-R*qK`wB^l0)pO=~eNfBTUUv)NNxRqoR{iTq&Nzn%tE0vpX z)_Od)9-zJ7mP=t0ooS6*+j9?6;rz}{q~!ejqa#re{moWqAj`&a9e>1egLH#mWrd!Z z#H?Y;C9{`}?Fn^en9!i#^_%ACqg7(HCb~|f{IFHW{L^GGAK~SIWOC@s9iNubr&Rw_ z0I;FfGOjZ5m9*HpUZHdWIJnqq5Qf+HO7cOxExs!`c}AAd=VY!*S{q@+#@M8HijshN z%r&jMo;;6pDX&sjN~ANK5#lBVp6in?)V5z8ll)b1UiVc zxx=W_l*w|mz9r0)vi56}b7o=rVTXd6b8&-YcxNmvuCU68jEj~mGE8$d1-Psn z-Zxow6%C>2xZI7)9e26Df@8%@ddC2oeV9zuXjtg-X!ihegf^&>u~A>R>g0_JWmYhI zwxf~4h<+~9smS?IzgK%!&Xgs|w|jeutMo>nIF}43^qJfE3R5o?M5rO6?}HAkj1pr{ zD4Uu1f4FR`q5i|`9Lp7PKdQz^eKaL~J$Sq9BkpGuJ7*kCp%Y4e7xsjZq!R0^<)+Y` zcH*#;i0AJ@B0w$PI~CV=sur2mAdbOw4aZhj85Xx*ZfpMl9vPH1ZDcLc;E2ft3=|B0 zPUQ4kuB@;A%GGaPS19g2P_&}-nWiwXTrZQ#8QLl5%GqXtbD##521~YYj+1#Va=|~A ztFbF0x@yf|uW(Z4^$ZG?1Qz3*J?ZR+B_FvjKbAebAVQKrn=sFa+J7v@@CjJ=ho z(g8QNw?^bequZLVJUlN_)A#hq?``&>8#7MTxBdyKuy#>Chm(3XtP59peF1egZY=9w6HuE! zVJ>zoO~i+x`9XC8np8lO-$OYQrM-XmU8vxWBiqA2{yuF2sc((!>#lY=2Q9;RiLvBo zYEd5BAU;I9|2^gT4sXN_lEbIy=;;NG18S?a;L9VxT}%Z8GdO z4^K$LpkEC~#!xX5RIg>txy{4G@vFjVN5rf3T*kqO{9C2fqNH_mcYN9FeAhz&XtL0w zDH6)JnXEsL+*Rrwp#b-l&6TD58X{@RtZ^G)O3GE9L&hBdRr5yID+h(EVi{t>|kgt#BRInC`Uy{Mu? zn3wK$24jZgUbk~&`YUzL=}nd6TxRax3;7-0t0pNot^(+t5F&tVYH{4fCD8nxcJ~=e zyp;lA_;9DxLW+B+eLRv<`q4a2DD-x{k$Bv(yc0oZwRF=n(*MsKY7H$P3wvPDFoVa2 z=Rx~nGItR{m|Ot0r<9M=rv``WL8*I_t(FG53t}Vu4Fp$FdZE`jW9YdoZ*AzYRdWD- z9=8IhMA%9{VP)hN!CoxjEpaI8l$9$Q%SVKwcF!?08#6_!AV)#>K+wp7pHW-jzNPw zPQIe~^oF9wHN!R3qWE}@fsH(4Q2|nc6t{=UwC`)xHZ~n?Rr><&Dqj~>k$0VaXEXM9 zz|2aXiE^%{Z10y($?k&-!JYD+ruRgX+pR+_ewr~w_j7s~=-krQ_(`|=aX|V-k$9tI zQ+l=IsAOEZ3(>vKi5kON2>kHRZhz}lzU#!Ab0;-{?oiS?%J>g>C*5w2&jupq6~RMT zK9*NEw)xkP_o%HN>Ab;qGRQYw-eZ0hBrL>BkP^6_wq*6`KQ6?o=u1qO6JMI zr)){I14sXKLvlPS{>ejhJku~he4r8~3xe=M3BM&ja8jCV(G>_7AVc}xjMye>>nic- zSvxt57)NjJdY@m|EobOhh`%bUk4`Oc8~?%har-39=Y5B$C*WK!@Q?df2)$XV(@xy| zKw{3p;;o;TCte-J7)Z&&Ve%!CxW}TOg@oN*>h@xYZ7ky7i{3yA?8`gtX zi9{w*DKUJB?oXw?3hMWXTkA2iaW6RV*z+Tkv^KwZSR@h%UzA{^^ujI$@n-)MXh<1^ zT&jGsr{)RK$>9dBn9Pd3a{V8HP3hz#3K>5l&){d=6*%{PXSc796jZTMC4$%~yV=mO zEj1o_t!JJ(&G`@if_mYz+dCe=zTY2iVH5`FjI}ur)))9>{~Y{9Sz0=?o7C8_d_M+L zB(${nF+*~xO#`et_@%V?MID!z&%fv-F0aZat0k=8yHn4rgqvx4eYOejaaF_zu(4R` zYgP8|Rd02eqwln*VYMM<*O>lheN z1gVfP6Zf`un0I8jij5$++Ok*Uss*e&Ps8-Bt*UF2*Mx{VW_fmLjg{0bWNsB3#5~N) zr;Fepj$Gw`>YMeNz)mEpe{#v%+Sbij+nukmXmyd>i7=J;;$6-!L}%mXRa$IH$4}K) z8PR-$f6EhJZ?poe=a*@29VjU^n66HioSf4F)0%=?c-c+Eg&itBe|hv)d)*J09j-1^ z1yS3o(_qrO8!uIf7LRSQh%S?+i>_)G%WKbW7VK5nyyu_B0F&&^KhwmZ%0@WTjqOBL z4XJ!|jc$pWuB$02YQP))&>8JUn>w6a^f9>SKcqF-<4krVRZNOn4(C{5IWs}tTjyo0 zvkxG|Suy~Vr8&+B3SK5<56qWEO@g^tp2<1Ya2Hg*z>d7IB^|QlXytB!avJ6HU60VR z@K#hSCfOh_IPSxqpwbK%TPe(Z2D1w}!@l`IYR0Sm)Qv`M@i81)1Fh=Jt^e%jbUiGI zqIM&CJG3 zcBxh;!-WB6^Fp_WW;^AEQLESmnrUh_G-z@l*QQ##@OVt;{$xk8%j%`3oa^;(Tb_ySQJvFxO*YySQ4$VFP_+Ck{v=GL zAx=n9LYsq|B(dVQa!q4yy4ZU@dzW)ek*wE!Y?Y>+e-l*5$Usa*yAbRxE@p<&L4z!F zB?WjK{7SWaFC5bOAuJ=z17Y;tFXC4XKnq^m+Z;L|eyoTou}S0*&aPG$-~@U&%G-urtVGQregb$WG0N?V2AsiK+9 z%Uxrx@)Y7+`MB6{-c>@06L)y7)X+GB?NT;jU#(WWX2m?b@Rlc2q}O#BtA2J+X){wh z;eJ~U*Z#sV!i1vNT6DmxNdc?<@WBkAC>#Gr;Q8u%4+NTngj&<(h`_y)H^M2Vp*$^| za6lmKga?EN$4JOw$%F-ybsoTk>hutrm^ReESO!uuByy(yn&rcjC zhA44krIiExM!Ru0EzdO2ddNCTZ}PJF9-#5H+{3kn^0&4%aj?I#b|KCnAsIADrZ#t@ z_~%4l$YEhFz9R8BFBBIr+HfDmv^iiQ5qAFRB$e7kLUXs2A|QeV$Auj~OR_b$c?zxT zwffHdTHmxFQBrZzBE6FN9GBn9@pcwCay!~V>K)fNeX5g~-Bn$}h3+-elUMTgeWq_W zrh>jKN>H)!S1mcM)NFUjr3ZfBi#|Ymx!DO@Z|RZaG_IuE2j0e^aOZwwEgAH-GPzjS z@Tc&7gX{#wx?{w}A?48sMwG;$w%VuZefk0|wfPLVB{Xg)$`Pgbxpu-gLF-lUx~XjW zQv;^d@g;*xXR9TfEPVpWfwDJfg8~7=bF~?%G(%_zlU9Unon_yR7|l?;BAA$X z?KfJ?EEt&2SI>Vfw~~=JG7oX=l}icVfBy53Ql-F3M-6?^Yd+q#L;*~6t ziT)8b&B?lYcYctz;UP46E<81y2 zce0>KRI0WBWnJN?R)s~mZ&|{SEOqBzkq}KH=6&hRsGq|z)>ZyddS?~EXrLSVeu8Xo z=kgZT-boea!r#pu+~2{Jb7`SLoJ-|h7dG}IrQmI799tb%xY_wMsHeh=^&S$EuH;L- zdR2!_{uM>@VtkFtcSG8{AoRy{6}LG#G#_?Q^L7REm9z1c4pQ*S1kuxMx#h39rz+FL zk1I$joJ2%rY+`eJ>L4&E=|BMrI>_UBAYYilh`C6HSy6q2ypbB1)hm_wSTwHgcTehVKvkPSbX%i zbufYEg1zJpXxMMrYT3||LjApBQivo+3 zv}OuL$+op$fAaii1Kr7?=V1a_+pd1KjN$137G*M$df?sMfmZ-j z;ggMKQbSa9w3BQRzWtvDOF^xMO`Y~((gupY-`2=_9`#37eM0wu>;Xp&<_8{sGO3Fh zRn)=3@QkwmB|(CSVE#T#e0H_8%$doS;zx$KK))-|+LjvSqO&Y{K?SQ2UB$A~OA~6#4e%xy@g@`z6?OHn(vvC>k{L2@#OEol7p6@sxpx1qAWX$d2xF`;znM*e!K-v zk9O%<4!p8+CArg42-lP~WJ~i6V}G;l-=@KE9MC^Ao%5seN7#RV`-IX`MH9aJKE<;C z8_FntjEMK5upk}zlKRm>Ss|^F7ApT1qwg_l{p_JvPnuPCA@&dzyku+5wz9--67Ax(%066cO=WUBU?VweL&zNN0WWt;m$-!%u z)G#4GMlwjaPdA2skgSou9cfXtrz{3PQ-RUIY-1qS%?bMce4(wJ?<2gqT%cK^$_OPg z*bQ8=aS1BrYaM(B*wG-W-)?eeM-f22mq_+(zjBSAY|wtggqSKxC;~!yDfZT`6@|dVGa^*LE#o|Z22(E z7wI~T4CiVRPDLz~B5Pi}jpAtJt&g08W;SV~MZ>`nc_O!H@m+ix4-1=HWtd4M-%n}E z@;sd7cB>gj3!W^IEyTv412O~D+=laehE4oLYS?2SG5e@Z-aD4S6vH$qxSn^( z5cF`~O`A{F28QNq0Az|LdHWj3Djfl=0>(D5SWwpPzKH?xdB}tfj$*AH<<$99ZOnB( z8$ot1i@)$x6ADr#?QsPpOgyU^GFRYY!v1?dN^{_8OI4k(2$b&zj|u2|tU~3g$-Gf@ zCbTB3fpK4ac)uM#y09!7QnZYq265zGUK?d;gzRabC>kh#)y(NTafs}xKtr-(C+z74W+sK%R4EsYRQr`i!k*~g0qk*a?$$sfr z`p9|n$!B-MRXOh$+!oe!QuL)>J^{4ic1nO14P1Wd3i_vN2H@KWgBd3A-c@m(uUMW=|we4QJ{-n0gCL2K?f5zxJcONfNbW)i&d%;*j&ZNSqjWW(07POS6ednk+4!Aq){UzdadUoWnSR3n3OvMbLMk8{hOpV zk)Aj7fkC?3G)UmILA6l!7W1eY-LqxP31y2fIv{mAR@Ko`2R3jpLP`|54QiEA4Q0Tf zQx|X_)>1BU+K(TOPP3W6LUnbQW-BKl*W|;2VUSA*t-n!4#Xy8XF22 zU~mRJtBT|a%#&H(wzP$~&k$>$7x{fL4)txS9pAZ^Y9H%RBSS!o!s^s_-5?e&jpUxg z<`cwE0TJnX_dt&1D)Bl#1vR$r`j%??`Sx+|#%kvY8?)({t!i%r?^rL%qyvlyS4txc z%Ux5Hd~I1_3F6e^cfAd^x16L&-fJANKdDeMBL6rbW4{yq11WFqN0 zCeFcBkE8)d6aPKxwCFi%v+i?Arxu8_?5D^1mNNEI1?k#t%UOpq5{!b3R$ynVSo)3c z;WCp5Uz{VM0CpV0U`Q=mR<2L?yWTF3pujBME0-60182BLx=N%MS1J3hV)|m8W)p*} zJ2e|A)fx`TXHn%NdW}W zDzGSVF}aGy!XNY_<*(8Kh4*tRG+UuoAC4{QAfckQOxW&@g-kP9mE&1Dq8l^OfCgzZ zx<6V*a_5GhaF zUQyvb$5b5Ak-aTgenY$Bf8F!X4Y}kC3jeGB+jy!W%wfHG^f5Q87 zn@D^4i5`GBf9JVMgo`wHanLbeT&qPl?dgpuo5nh$erE*87Oypd*qHS|%ixFlP909^w{Ujo4~NAXKU!YWYV4cKiU2-X5# z@ZC0f?c0)Tc=cH$AwDHs4C8EEk7@w{YD2W{?uuiCkF)<11~Rx6W8+ht3bttK5TK#F zSV$@~^`5Tt2$SB>gors>;(1>A`B3ZzRH-aZBYuoA6J+nJ)$v(D6*Cuo1Gvgq-N3G- zjXs%dD!-djC<`m3vnr&HxyPC&Fwyok?bkT@1^1n-IlA& zj3JuI?y=2+uRnd(%R**!o0UCHIv-D%8~MmNHR@%#2dRq8CN)#3gyanQzA^8u258!X zh74(L_LoVTkTnyWt}T=(lW?th;bfYD|DQN)ElaPR9F2T`12o#LPBta`R-peGry*Oko>r zQDVL}>O?=No{Yk%=c9*3*r*Ww#!(XdrjI23`v!J*7{ZZt8nt;yb0K)^;80$uvT70= zmCzdEJe?&Au%D4Lgl?Pvb97}E`VfE&d zH?lF;WRmJRi5bB$R=MH#HIGJ*z6r8&)G0()P_`%V5cfU%&u3<;$vZM+_EHj3<-tW4BAxy)Juc%8|71+P~_$4&-V$LFBV#$(i= zy-6t%^9&&+MVw|kNw1pTQ>VQ(;ZSaK8Ldeh&4+Dhm#Qg;sVSH3So_;J#*zfYchxIA z;fRlBRrOZ@M&KdCtXt1wuIM5nTN94Vfs2QQN=!I`pe=GQtrx?0b30;G;_4zNKx7h| zGmtL*CK%Zv7+vo43t%cKQO-M3JvyC-l~F(rY~fZPd5K;VEMufZqQEf(zm6P@tFZe} z#`Gwc3>(&~FZA1;28+&%1c3?X8H7`tvKUu_8tIlRWVt;oQ5W3$hHk-jqSYaisinx^ zc#t4EQ6*!Nn9fQza7bvxep@VG&q2h2>DQzgAHW|U#$3;e|MF$!J1$3CVYY!C>K$>M zC^cG+aI@`{|Eox4eVx=Ow_gDmKg9F&P}b{t6ywDfl4)AhOEy(6hMkVAGXn4PCGiy-LKM9& zh?yxVw0_n4iR~UQ(+uTPOoLFep!t%`)}qwqkfd`hJ(f=H{GfyNwY=<+@mw+{cxDgN zg0U_4rbsfl{xDZIMcGK9&@W5+k!ppT_1v59<(Ih@^EzO@AJ#8Zuv0Ju{aMxY$VLn$ zH&UYb=CdBIV5QDu?+t($dJaIJCjrd;>s7dYe~WN>&luc_~j!CUdsj@f>a(q5FqmR;}V zRMo5HbQSKpR?URCy?JQZ?8Xc}3EHd3-d9iZmt*ouNY3-jWdM$M=AME5Zvw_q+O??@ zWu>cC{VD3L&E+YaodgdOGlS`F_1PTV4W6FekvhY<6}ZQt8#4m-w#Az^4;B|Ngs)=_ z9)r&3x8xP23qBj&Z|l^H*qX7#3fApU%5@6#0Bp@j?_wPwJMe?K`-O70YG#c3Vc85Y zg}ab9Cta^tNzmkFfzT3=VTbqbL_*mGFq;^9pb4+4jM6?v?hcgV0?m?4Z&{M*9r@hh zXu)0l;E7FKc5)^GfnK!)Nr`5T6BfHU6UeR zKgDeh*qJSMA;n0HyJT#vMRX+$_Jhfr#4L;#!Jo!()&1J+`n13tt|$2w#rwHyR5w9u zpcS=9?&Cqe<8Ik#PhoOY)qSK#m4#cP=+DQ3sdGcl<|L zWg^lASX~JGh3Q=Qb+TzXRiLLti|-#Xfr~;Jid_yJ#f?L_1ac9iWQ!D7a)UJq6j|73 z#+BX&Jm{Aiq4&;`B#F}QmAaVSF7t;AZ12V}IbelG5VP#11sx%>09krX3hi(bF(|=PFu8&Z>IJ;BOs$71O^?R**hZ(_3grE1O zj1=8gB?3z`qSP2D_Hns!uVJGD=&l-L4X7)n(BbtiY-CF&X_jueL!TouGl6iwg~zd< z$aKqfHjSh=Od6e@;=0JT!cIroJtWc7H|DF7%rPG9tM$w=y_dV$TnmUw? z0V6Uoycn1U_=qoJ8=Es!$4e{D8K{i!Z%@^;DXBXHRTpn(tNJG>cx)V1=I=jf*k?4H z5TjJ_3I(dKvyDim$%lPJ6*FpcE4AYI$4{FA_h(UQEHRV1nAHEU!u~85g-phyXX0wE z7U<3+E+Q)-%QwXswr>F)QtzV_ao`?D9HOx53`L?6%EvwhSAYFPx`l^9suTbDg`pj> zp9mBjHLFm5N(k{*h@i&q8-Q`)yPvT}@{jz#|^C+PQXsNyfLAw24OL}jy2Rv43YwjHz zRrleU+`T?k5^=2c_SylInxyFfP`=tnrO$#ujgSg%o{10GsyrM4erF6{}^BM>cIxaKN6`{&Os+ZSSdPav6+OP8i zgI*FlnWJM5FVft|4W2B$+^p!nI8niyT!23Km3INrdUb;foi-@BSU}guM?_RcT0vTD zk}m2Aag`EWbm-yU zw=q|3piuQBkg0NDj$uVbsPg|$FMps2hudcdnShzro#ttKW!dHO>vB3A?{T{FowZMg zQ}f!zWlk%=O6#Va$|Ka}<@AdLNTiwn%~#vfhw|%& zaN7*&zkD%dMaq__AFKL|{>v9#0$^);girE*^?0Q!LSr+{^5LJsSWsT+B1bWgYs%cm zG#37rE94J@Na$_chPZHMM{cnT>Yc36HWTi0y;8ln;a)JQ%kVcE+w7?&;u=g&#*X#_ zYh?=OsT|D(Y_5`T*IyfQacyF4ej6wt9=DPx%~`+(jW=&3EcM~D_22K z7TwK=+-Ka`Ko_ZPBDa-;!aAcNM!TmDMwP(@F~t3_I_&m~2l{Yu9^mA{TxK_JXME*e zEm(5@$2d;3e%>r@*);L|$2h*?$3MPwc9;L>IFgMp2jxjN>iowz%6%mqqnK{|$2i7U zaf~rEN{y1vQqhU(e82_FXUkSarX4pX*rZw=P!E`p8|aDFwi16}z*F-!EU7YA3jHrH z_J%s%;JAr}24#2U$)HE$`(qj}d|*hkm33CUDA~9~b}Zi~`ae#Hi-(CpFIGygFkj}~ zn_GM4#qq%mSL~3BBq~$Sc}6BMAtgl;#-$tBRr1@V$OL!MxJvkl%9-tYKfmzM9(>JM z^W8v4T$@br8Mt>ydHS#rBOwQIiU!KIQp7%xbErlu>ObTM6o0Nf;st0U5`bqMzzjztzFJf~db^1ff9f|j zm#B&yDtG6UhK|ILxX9B*UFmoW_Ew>Mljl+eRw^wgIZ&kX?UH3a9nk}lzADNywr$6O zgQ%6TtWo2Su=@G;~`46Zf)DW;yl1B@;!5mH(ayUxY5brAfnyf3o zSKSPT;xI+UzAJiRBpg6u*yG~XaGD{bnCF9QvU&u_s4;nqtiFgu$5Jsb04v;so*+zE zE}S*0;bhoVk;a|^bLk>M=EDBl?M-c~pMy_Sm&2R8IWsw46Xjt|l-*OYIcub?85a!Mi|aosmJMM+jI z{=}z>&RFRsvPqGPU?}+noctV(>7vH&M23uyt*yKdisM*ca2J`oT8%m~sRz18o}kVQ zY=`{X8ZZSo#BUIPz(9v+huPl}#g=%idneA6%5+mF*pl{el4NVQwdli4dZ^9jp8DXq zwVf(%9OB+M=y%t8u`C@Qc1>J_dOJxAKhsSA0Z`<2DsX|BqT2;S>3mUp!8z39CW4x8 zKLjqOF$~+BJymY)%>}e^M~z%Z{FDHgO)7b8Wp1XDdQ1;{9I0P|(^SkKawrx7I@LWX zR7-d`V;_fX`gKy0yh}F=InVhpKgY@29}pY9)Ox9TQwn_GvwD?1k=d{hsQ^%{G16#H ze6~)Y$O)SUu+&rD^g~LWH`mKKbI)$^{_+ zML@d0{#;b50~u!;8xBHURuOyW^j_>{pTWW_@?~Edec zUrXWP5_+??U5J8Gx6|ULGK$7QRs(wXW!0F%v4m>d+00TN4dSl^s4DlgpN;TxAWFvr zQAD}FwunAA8Y`W`KO!bS_J}u#FZ#_3=F9a|38XXmrAjx>Q8s?|(Ug8PNILPnAx*1K zCx6j3`ltiVU>><{$mZPoPD2H^qf$2w;D_Bp5I&ZF(4ZfK;b61hB?snY+qza!;>L46``y_0QMLa zk7;M?n5D@KJH|o*H&wj*Ls8S}+WSNFu}j=6_@{l@ocGNGMcl)?j=)$n+ezOW&j<%r zs$4uNhz|91W02%YyH>wh!Nl85chIeNJkjDnXihNB%!N^jJe{;tIO%xlDm@u+1a=pq zv&A^sVc|*(kQFM!yJ}`D4lKJK{O`Vh;WWAyvW9dAm;wRS$pn2f<9v>^sBpH^T zK>H-_Rg-zT<*jPwahWuhYWyc$uFb5%q@#mVl)W|kGIF|#tVmduZ+(9Me#-#%(JLNM zR?S+Ct^;kCGT+rIB~k;x4pV0O7Bhzb`LR12 zqE%X_Y4jYw_S8=u7RCd30JGT`dshP|TDHK`aW!SM7?SE2dF{oVH_TV{pJ$8iL}~F= z&oP*@`XC(Zk8DcRC&y^X7*?Zh4Xr+rt`q4lx&6eiLI!ixSDmv2FLF9_>pPPQrYTb6 z!6df*%CYQU?cDw0T8+J3c8e1A3Fc+w7pzZo3(VV$jng*%{O8a&VtlaYQ=Cxs*+=o3 zD-75^CuBiMo7w`e=~nH-e5L9ets7f;m~|M7c#{n8jgWK}c?Gm8(TeF6sVP4L#ifof zsu{ZZOr3mU(;NFY9-|a$G71$=O3BO*oETEne$IMyH#%h0zQnqc8+3=9Kn=kGEI?qo zzGNEca)O2GFNv&u8DaqoOy_D@LKPv3i{O%iP}?aLw{T)%&mx6lF92w&mihMXw_^bt zKMvZDqzH%r^JQG9@OzOEO)_U@9|2l@ln5%e7C{+3#r};eF)X-x?N>T zvX?a3ZrpL)M3P|sa)}ap($SsR_VrqxN`YzUgV}omlhT6uCfaP2vT9n@^XItMxQ^dc z;@0#N?J!9L>XjcsPqtmNpV|>VSxO(5qo{_2?5dbBPo&-+4?2}H(TPHT`rpymI)jz+ zqN`tB?t-W*_nSKK?`J%1t!&m9u~VNv&S9tF+11b1@Lm$%{9K19b1+yfS2&HiyvJhC zg4awRoP4v_&DG8-Nkf0fy?B{j8xw;)DlKLt@v#{KCdo*jGvfw;I2SFj6fOnZT7T z5#GAb4ETr<{n!leZHEf-!EsE(PDGl*z@>!_;GdlRuoO% z>$sF^t#0@gbDiC&TPzT|Y=q;wF>) zU#ZAn=6rI;x}4w3e-=bnl5hPp)l#bis1qfNZH+NG?ax}<)<07f$nwSUf0Wk=&NeyE z*}2iMaHl@b*ToJT&aG~4hkzxr95ai1a{gj(qns%jKS;n^K7Kh*oV^1ESrh_ z;!@tGI`*OBJi*C@bGHYilhdVFSAFq)zWO~qdCiH(|7o+BuxeEBmZb1=^dw@VrV=lx0D!pSZXsL z)-@r`(bG!GgFmIv+f$pwfWNr@9wj&@72R@r5OWRYO;X$X1kYfN0N3=+#f7xl`sG1F zPBeG3^F#HJrvg9IYPX(eQT}mpf1U@%lt%HwBBF4>hAJ+ESM3N!_O9qlIN9^!MHO~F z_Mu?Q9M+(-+Wsifos8F_NuT~s2G>QeUF>~IBF%%;>rKrlpwO~(*+oNU{M2+!2_%l1 zE^pzSA($g7M04epXSiTLi}En6UKZS}&&uWjcjf%25=7W6ZmA+n=cbEdB`_%NK3p0M z0YfRR8CZr=B3H^?a2j7GS4s^GaHG#tc`;?$-9T~~8}W_)O;}Sy{4IjgrRUe}nI)n+ zpaq-Fl#C%lZz>(Efc@M4L!jFVajo$zF85!cw&-u~uiJL@bh8VRKUYCSZ z@iU|VCGMpGTEDz}sy&RHJQ`3}(#z}?4tr1$l@vnE-GXj;q7?_sdZ9z-QZvQRc_7{73sw`*IKd?xy(X*st=qgIF8nFRa<@=@{4+@7EdAvgs~l z>8dv9au?p1TZYIh=>?2f7dLYUnb95CoP043TM|9_5MU{1>*Nb`=1A{m%3*^ zac_HFYgqkEn`raS``SH>FuE<_dFL81d7fn2G-e%gOVJz92p?lRG-R8Rl`YC{@&ML) z)_B-E9dw;Q8ESN+%O%ux~ZHSonPGfA5!xte+&*7xOegpOw={OLhIIo2M;7E=t zUiOfn9|^S=Q~cpg349o+MWJ-q$#s>)4Zt(`-ME@T5EvxWagjlWkmX$1@ziV@!+TsNi4ada@`hcS_%hd&2d`)Mpv( zd+NE$$v2;9D114MXARMBQf+8O0E#5`g|{$dev+{_MotL{_%HcM`HHPVv&Bru*z=U5 zs=#_7(8}{>sP@85UE{2~z&?F%DvGvlJ;Xh|1U7ApM4V-!-PIL~ApLV^C+p$?U< z3S0+OIB^mva_>DMS^3@?ZQjGZXr;#W)6X2+*)cx_WR5219}gXw%(PR6JUyafHuk+2 z^4E~MjPoZF`3|A#v5eC=bHYmslN^W>7UbO|PO2(jG+&eUVs27ZeT%>S^&==Km-8`w z=@P$As~{}0OGCD)mQbv%7Cjerime`1i-|vtVpij?w;pn~6>5LIWJxGrC}dl&5~OSY zB5qXIbzSmLKp)(|o7fsM`kU7wX{Mv(G>~n)XduPS8>|jvUxIv|UD)ux;llqu&>B3H z#~aR6z#7zQ#9N%ua*>Vuaw^K;*PhWxR&!og_>P^p*ym<+A`+knUUaMwBg};0R1E{k z+c*#&7Xu^zqJLJZS7ae~{>~&Rl~kPbjPq>U4fPGbh~K%mnI$(uXn%-hZ{0EYj2W?Q z^f~B`4&So$icvJBpLS+2MpQ*tq93ns1sJaUHLNX2ml=y3D)K=$?FS z+xLO~j|8U!Y8nLpmSE7-6rAVZ5>T&o-?IHH!T918RUTzEiYBH?rX9tKQ%YP^!9DaJ zE)}Rp`Po%(>-KDKL8NQ{RiR@^x!ie3WL9*rC&cq_s0XIIM!wceI897) zrmVRkUf;G6{xgbQ%<%@dy5f#r3{A!{Ry#p-MQM5?rL@v3s$Xmiopp^5bi+h@%p;`J zcA>&;5sk+G*FhhQDRwT#>wOT;|8?-5=myPSvPWj$^>Dm^&z z1{$EF!ZQ^yhoqbk3v-|6-*zW4Q1@T(DvjRSAF|O_;o$3*IPUTu4D6{k3KI~a!EPqx zlZKfPof=?$^|lQwN`g)9;s5Dw`#Q;SXd3@XRhset8tmu0nBreu@QQjSzG%c3IF_5) zJ!$`E7l7<^@@fx&i2vw<8HUx5L9&|v>B7GZYW}AS|78IBcNhL;@IPJnmx0Q^yYMfA zF^RJ1r~hR@|F0mJ=;d=9^NIV2ng8=g%>UR7+=7dUNtc{7Wg-9~1)n^YsQb|Ppy3^$ z`<33<3y9{_&LUT)ehlsnu1J3=KCjHx(>VRCGd4)NTOiG@6eX%V#)NrK69} z9HM!>P;jPV1<>UxuJAZ-pt%e2=n%r_81-rq_0( z))1FNcGa@)9@PYfZOTQ4DfUUuQ6x9gNlf66VQ6hqm0H=|%p0~kRK$`2U80@MlIrMZ zwmA8}zf*jvE^d4kq@S(HkIXG7dWh!5xXqfi&V#dFO_nG7_$28f$p?|h>x|JucyJ&i zmq|b-q$TbJEAJd7AvbeS+9c?1nV3q(kx+6mOn!l{!ElXcWtWIOfVK%r7XUKTQLUjguR3Wh2^9sGv*>pA#p89 z_Jn`&lYSz6d*KC=mILWB5{;M+Vam zGwvwc#Ntrm7CME!O@z6l3tXSdl|2uzc>@0uE}n!>*bP;mFDyYB7x^WcO7tVDO)V~C zpZ`>sQ%Vxk5E)(veaXR*A!%i->Dg&NJKH4lxkfkxI!|liN%;NWcGrv(z)*9 zoq$lwv!HEQLG51>eNswjq;9+-*%~oYSpB0`H@|)oU&jI1H~t)n!(_LLD%PJPnh5X+ zO2cE4cBE13eE|u~_r(6(;l}@zMeCIrV91ZG#~}y9y3bU1)6tmJ|2JIsE$LN-x#=fP zPI8w=?3kSdFQPZ*prKD%oxr?^iVA~;h{WG(&N6u;)A#}=i;cTA7pmrY>nK8LJ8v=>W!D@M7DCX!&(21eQFo|J-8F(uaI1dH0pgk^nF~ARUrXD0Hg7O6f6aP?p_~B2$_3Q)dh>7GfR7o1wMK!iZ3 zdZ8k@q2@YWtIkE$B>AxMmqZKcMbnEFYhL$0`8D%mWs%z;Jh`P+ya~FLcZ^1-wBE|A z5#EKrtj*iSMuFRwKNg#4=v*{n)A8d^W)m&~>2zSQg-pjEUqsOngo?aGsL8C7BrM*0 z!7}D9{&sVw{xU$e?ZslPTu$092`TxgF{G1WJW39T)_*Pewnid5;LjS|kU-tIC*sKR zcqJe-LKmsU17HZ6H07KJzBk10GjAR;d{ztP1o_9`oq zTgl$a9ZR>3q&(hx;e`Lxg=XosRib+68@>NKVj7149a4zUWWza97y0LhYN8e!$|hB0 z*AtTVB0i7#!yo0PgUazgQgeD;$W$BxRo{jliHFDhbd2fq^7EQ@yaz4G5%zbVgTnV< zi`o!OI}gabp?4o|2n`a`R}` zyO5gbC+##FGR`f$D(5uZD&@7^il>ud2@%kt9fpyp=B1ls|7-R8xC8EfF2QS{?QQ6e z(O=O7>T>;ga_)ebQz1<1P@D*`a7sMCZ8CjQv?-R6!7^^cCly*VL-Yn@?6=;sGD0|s zx+?(1-&gu2{~hp0J+@F}w`9dAam%+DT~nfa%G4)gOo-P9_Y-eTiu9o-!0ocx1xb+H z6F#%sba?;fqHgee?i58~nT)g^&q7JS3nRR9)VHg}RYEO4Q z-Qb9!VRnGpBi1%4`?f+pq_U%d4x8>#Cp@`;$fVj`zUua$cS+d*&HVt44gH0Llo+@M zJ_LHJKHA{2LPR6!JHZ`}6m=DR0(f{<_U&5hfr>pu_%?YVl#AS!b4PHKq7O&eJS+Tl zdM}x#98*Gxu38+^t^Nt;2N`W4DQ5Y|=^-IM%d#krw5);J7`a16V^s(vZ;=KZI*{P9p@#@54yDA?v z%R}ulQ4`O{rH&qA6ei_2B%6udfYP@3ccq;r)3_ZFvbki>tkYQ8uG>VNJ}kpCrx)-@ zr-pNw*3(M_89#%T?92EnU*A_jg?E40p~^6GFm?{fE8RAP_{ZXLKo7&UV)1{0=-{R+nVm&Ra_g1Qp+h2rE>m0xkSZ`rJB znbMa|xde>z(0Z(Ko5Z2+=q`z#Jt`~*AsW^A^n5trha#UXk*PfPTaGI;&S*x$yn>I(~rtU?<{w|(b zqYM7~P31gU9p9_%`o`mtb=iAplZA7S>iWnBt+S>x(JuC9_QI{BRK7G1k7m_K#8C7KhN#Z;+-x1b4A&BEc zWh?x2jm^P5Ba5aiuA$dSq?xHmC=s?#B`?XH8P-_%{vu1=oT4$iixh0*RYETLrocbVm@Z8NWDSXCRNFRPv zbj1qTi_;%;jZwn`#|IYtNmeIvNKa+R3%|9wVwq_&uuYdl35=lmY7>Te|DJPXT@s-kVqi0bhgC@DH2|cVTOy3A!;Ub^SCa>2 ziF`Zwqo9Rlw(qd?^;>{Jc7}aaaq~@->BwKCyO)yPyy@E1R)O+mp45Kzi*M*)UKj6DN@JWZ(|gjb*WaUi>I^ zmfAMN#w&pGP^QqTvK((E+QI4M7ZB#-Q9JGPv>X)N$Lp_8B=6f$H6M9U+|%~%Z@Ly* zF;ffgTHM@dqbG=Gu{9wsvnjU}^UE2|yMC|YoT7u-lNnRIoOdKF#V8~zpP+a)#Ru_@ zsB`)YvE*Yo@5arCogVE6puUVdBDTh+*?J%PkXwmnYf+xw()jS5@t@y+Q;aKOq!wx% zJ1yg*4wJEUe<{E5H#FO)6i_~T!!n!hngM(C~NDp?S^cn`VG$6p>M>ehI zFw>gf4bY)4LqzHEwdIdo$nk}Dl%g6Uw6wx?$aZ5(oH(q^kc(`h)$p3kY#Qgwd7kuS z9BYux$2K*7+^^jzehoxZ#j-HUw36|dKiKo4fFjM6i4b9|M6leIW4acWv%Fx5dmUrsa3ZVXASrrtfhrmfku8(>K+ zv8pc}yY^dHz8}-OXg{*AP37h@W_G0EE=($MX`<@dV zD0u8mj788AFD`KRb*>RoiYc4D`Ly=D>%-;`>A{>!6(8t>D7)90ASQrjB<#q}n0M>) zsyA6$TFhUn&tiSf++Tx{oT(4ywOGQBweeZ*Q---F?64Mbs>oOv&D2a9-OgmA4H>9X z2uGvrqfZg(6@iJq&Z+`1e3doWu$xF;EsQ8L;%0xX;b7!iWl@MuxJ%r~s@vK4Y7*N0 zJcJc0G}#%NZNF81%3iflV;3LEf2jX$ddRSgSujP=zg5#4) zUd?h^m{&6;Yi3IbnVK9^24V}m=RtD?KYuDk7h_h!bP_ClS?qNB5@o({Ia(Y>tMz^d zWr%LbOuYp=mejNkA1R9wH zhclkiLW3g%Lyx4!VPZKteVdJ6p=X!{X(Y}fU3vto_FB5Xi{WMRTBh4vgTkb5|vgMxLK66e&IsD+1ZcE%FR$|#12lG^Ih10|8hb*5& zYKcLTPQR#=oj$1=azKZ8kx;F6188UT?SvX+sK`n+0wbDIz7_t>2C4?}>b+ZFC;F@5 zY%b+*=5e3~rlVI|Zdg6&pm&C%*4eJ-S9{l{y@0odY>~s!j~mbA3DL%MNN6$WNJ&8q zwMC|!*uy4>5F6^J9`+&GI_3_~atyARtwwmeZAI}sKV z_g6~a838M#1$PV{Clw(N^EmWPm&35OS9t?|@hGq%u3H;&s4q-XygTw!84tdhKQNe0$Z98Mn!$#QRQIq=O`YzNqQsI~uA8aO>JPD>>$9a|x=|yJ zm*<_h@d!FykSQpgOD6JY?UV^3fUqP;9q{-Z;vwJB4638C%Cf1<<-5Ks<&b~Fiu^h( zVQ1jV;41>^jEY4-R5&?@WvAc`(+ypoo9+K>L%VX*EA|tOMpaY;3qv1zfC$js8ro3r zur|1iwpUArn@W(}^MjN}hEG)K_!oO$@|UcYxNg6D*c&>bBYMgWM-5j!1*JIV5OFh% z^nFF*mkUyU`RZe!c7AUzY#!D`W6>LVme`h0j)eB;v2pnq;H#ywqt5=x>OHE2M4!v5 zC5;Nn1~+9E^}52I{z8hFT|aFzMviq9l-AA3_5 z(n;a6<^v^{vvhd#3nCWJ{Nzl3$*v@aB?K2E38tKUlqPH&DGeM8}_3CJ$3 zTt10C($&k@NuA)@6%W)iAwEQaH0=gF>{r|BqPQwX{Vx=CDzTLQJny{GUfM=`rDx{o zR1AwZ7kLSl1ZHDV=J>iF)-@`;Z0D7oF@-|W)=c?uobt}0$Sj&^AeVB4pdHCRXm{k= z!L0c-KpR@ZLOD9RtOo2T!ymSK$nbF&O9a{s8yR84?Da)5SJ?YZMRCTPq}#Atny)MI8;``)~#wzV?;au@M?5AE;`EcpAYEG?G!U)TNNfF4I=5|DBbxjhy%v=}ggo zXQdjKgBYIc$VslfByAJoS0NvuKDZCRb3`vRx=jszlI!a7YeL$Vxw6aRH`p%}F%6On zDTPvXJwcAO{BMEw{L$o1&<`Y4jvYqg5A82{X^ zq+WgkTZ7BFDDTN^Qyp~MlEw!178Kiar-`3a@RKweY_+hY%ecgywE0m)=eMbdqCSi8-(qOi0|efIaCNDfd6NMOj=>Pu%qB*<*xqUu+)}0 zh`kCaB>X!p^PorsWB@5+c)zK6aqOIrAx03vXG#hWAHfZ3dz6T5A+skHRvWQay%{&s zwfsKzlMGXz^)>>tGMo~ba$UH}^i~&P%xBJT`Knc#4oXFkIl%gFr#h`)9743X;hroF z<&a-W23*Mr-WQ<^ympfKYC#W6+x-M^dRYlVqJ2((RHbUQEUGTQZMdZDU&Y>w)s{LRY#pP2FZK zbdINWiOUl|*7wIad{R`!b-__brTLf#7zDl)*Sa3Xtii&}MHn9$?x#=*lU1g=b3jmg zt0KFk*m3kToR13qnHm-svT~~=$*apG-;LM2?pW24piY|>@mT}~MUDT^`5$Tv2v8)?+M$)&f$9$kFPG$pT2mq)y zu@?%)qL+v6HOK*~YVUcf#_|+1?A`~Et(p^%JqONG!i@mSV3wj>7~%R=OTrm|h68z(ZV{=3Wc|A|M%&w5tQOb z??1+r%hJc!Z`u*IXm+v~gLRDm*i|Jj2%wK)aarWuHo^*bZxbveRk=Oea@^|FG>pM` z>|Ri~Jb=AkFfvj*!6boAQSAb0Hqnd`GL_Q8K8p?+`grZlY|ci4WZq z6{OaXwe$MFT`MGk2-ajWE^Z$|-&JjnH9!w+X+uv4ai(1&t0?=vVDfSc4f2IqDf|4? zGx}Qcs!)nQc!@`Kx?_d%h^S5MD#o9Lln`1F#P9a@_U1%>V<1bp6iwyoOgUV@X!*k) zr*rWok@OHh)4Q(bAF%0XCvp4&OGQ94p#}vTsn_3yRZo#mRp`e4AbQ_;I54JMh>gnu z8MIN|lQ$z|4(JNLY5l5G8}<_)ii zWC?#Q3pSfh$&ATmEmb#IjrjYf)qKrmPURkPi+zn=j@izah>&}!Au_&F07ppyOQ$7Bl6(>o#puxTMX2CY z$fcLkO<&`tpgcLhnD5~xIn~38`zD$d6m0U>6F{Sh8lcC{ho}{PK)H-I67HRg*?e}) zpYkPWW)>}TBo=hr+zXAzH#R-8uFh<$Uw)8zkg zk0a|k2@MCu-l(isJkMBTPus++bDxX=8f?8|{m?k6jg0Cj74UE;bpyt4KD6bCu4yPO7i{6Rz#DJh6jG&9cuK?K_L0X%z7ug}$X{ zKnG@WSYtx@;yqGnRHs{$NO!*MPmg)DVUwn$oxLe4+PLd);6QM%iJwD$u7!6xaG!#%My@!U+tIH zXMxKz=5@lOPbj9RyxNXlKs?7@$94z=ku}O?ihb~>c`g;8Np17}Z_~W5-HpLz-lXVK zkL}i+{H%O)f`;Bp^M~@{jbA2w^5n?s3+CSG8p~hY^w6K;izX|q-CoT#B|k8|_$695 zloZKc#J@lG5w+POyHSRg{3$Zorca5$;&#~R@HkdE4Eh}w9v2F7O&gBn_*fSQu0Ror zWB&nED?NacQkg_pWEy$Bu}F4HZBBCB6+kp1AkKPvPsLQV%ny2miswKd5ZdILdVx)6h9bncw%hnx7O22PJ>b+(EQWG|l z`cSqwb=0d`J2E?<#ywx&+q4)l0Z)v>3yTmjCGrw`&k&3ip-QEeZPJXi%Kh`3($7Nj z652}q#THzRO5{A1%FPrsXooyr3+lSrNfXDuvM@xb7703~r_nwoc4R?icx1RFE30#>1O zG9Q(0_X>UL^TJfTS;=Z(Rf=zmK5zMr8=*OP$gWYxzsG|XU(h#@Pf!rY+1q$$u{o(8 ze0^d1-lMF`g4(UzRAs<@S<+iPaD3mY%&_bce|hj!UJwvwaQF+rGKcz zuA5DbX}p+$bWb&T1(GtY-$mX;Jielzw!2JHG->-)FmJhP|smFY}Er08)}oTf%V zswU8t2`>-v($IE6HDBO*E8Dq>T78B6 zA3>p4mtJHr>MG>^Dn*ivk&2fkugD}mf7XPo*O}x<4-a*b=Q6=$WVKx>9H8{yDrJ6q zMrC->2QUZp>TTP@+DlRh{1gi|$esbpjfSHv>I|&3XOKS_XJk4L|5Op!8HS2JBwf0U zG~^473S)czr^>M08NjhwrntMwwQz;5IrEU5cKave9K(X1ODTn~o( zcdiG9s_d!E0sGk#flH?yABq){;7prnIYpo4c987F;b3YU@TZOAVqm3hxs8K@>Eq(f zgZ=y}@SEcl?GpBc9z|V+om81#0h!V!(4I*x2-4k93`hL+iw|QXkrT!e+fn4rQ(`|KX#A&%>M__V2OW>5PuWaFi{C_U{x8jX zlM0f|^Hd6!+YjQS`s)8_&wdZ@uFkIlG@c&I^aJlk-f$)BJKDuklg*LN&%a{`s^apz z@I|PcPpMQfPR5*DaFxS-7ZPp+?-^6cDMfbYcQiqB*akD(;RnDknM znu*_Qvaf0orXn;dG@TAJw(?YnZA-fVZ^Jb6N&nZgr6^W=F?(aeZ-;H}h-S$Tw6h1@ zPm)->droCI9mwflq=%Yr=bw-L-K$R)?MlNKZpN`063-U2CEC;zy(uRN-<<<1Lz~Y} zOo_jA3~^HMz;6z+w&Q6a(M<=W$3X*y7F)lAIgfZZt>f=I5vz2col_>vg}l@6Yjp0M zZq%I3sd6`6b+bLPb9pxUsyV9L_LbI zhA)@4%gQLqsRT7vH-gHNPZG#El1Bk9mFq*r#kb`zbL^Q%zb;QML|s~-v?@}^@;}pe z{poewutVoC7wb?;5mu9>yYvYkT=#^Jy%Zb>z%1T}YC8I#q@ z;D$~N{{A?2MBNOV=lJ_O?DmhpZIv`U+Mj z$RhQ{1D=QidX`Q_-vmc0`Iv_P8cVunc&h@!!2sl^p85>Gkn>yk4h=(${MaNjq3-tk zG39VRlpUJbqDJV4?fsC4F^XS_|LxB?qYE(C99zzc-geRzkqh7w;~0g-;CF>u0pvIr zz~^{37d0tTq|(gj-OQC2%`BZE}?65DbSHoNiO{aruESn(p!lQ~84#~w~7UKYecMbu@q*z7iTA>=Ck^#^y{41(B^Q=yGv9;4;W3h-(1#U^GmP5XP0zPlMomH$Z^roHc<^~7UlsVDlq%(VZQdpiaBC6^TZ9-{Js)WxZLIeXHi z)oFA04hp5o#S;J9eSqXKOmz9RCtPdbRhVWucq2ZO=d&$eL3K|D&@=Tt*CTmu>WsQc zBXzO9CqOs-%Zj~O&d&YXV7S}PCbC=nYt++3*EHkbvOVlTI|q8E?_^u{gk)9%dGJnO z-M_8Kte2bGWy0n>5e%`F+JtMVKfT*-^JI@_?ixA9QhRi$Qe;pIwHZZn#Emm)uCOez zRP(*`bcsJx(xI0r)afEb??zns)mokE02%|uKkc*)0RnzW_hX}RM$6OE)yY=D9uSLT zM+x7$PNU%nP$5G2E}i*`F!5RPbLKZy1xfs3*J}%*w>kx7HA_;@gmb&LKkiQptVbjK zIR8Q`idC)p7mss`)}Ki?>QocuIsn=$Zgor5aUFt9PBR&36}{=oT6z+6wZ_fA>#(F! z)h8aM21Yi0v?l5vJdku`-?YFB_aK#gJFVdiDeM&0q0M`tAG72 zRz_;SKq5C?+>8IabJo>)ufC{p|BzcQLltM>yQTq#H>Mtr#fPj}CFNI zMa^bhlNlWeHv%w%QTh`FP(sTPUd`$;;86G=Rln! ztk?_YX!ciw-jle>IFBdaBr&{-=V3Z(P9@dAv+g z$?wupr`S$Vw;_-angYJB-m47WU`|o3T;p~==bj~yOM0Twca;u!=A99#SF!=hU0kd5 zUMz2#(neAUTuLb87L)ehw2Vlm@u1EPV=!v zYNSP+)vB1c^1gI7vs=2djV=@7cHU>g^rM?BhKqDXnVd#en`2rR1WNJGU<1j@7`|0qgBY_u0EgOmCdr^&ob`=XCv&8|i?Dyr-6c8AnfFf~ViQ(s)c zd!e;4g~SjkWS|;uRz*Gd?PWNWGrY-tK)BDlldZO!AHdm~)4rUChWEw(V}ULn^MJ!sf;g zLw>>(-ZaEvPBJg)BQkOkn8P)IK&@>3%_ed7#gw~Q&o?q;LltB&KfP{=b(19>#pc>Si7lL z;?!!?$rPO=6}^24ung&SVid^qK4Ng(=)s;?H*gu@9@ldH42EXW#_32gFQ*+TMHRBG zU0SjXBvGJY!6D?s#YUI9Ooa1>uPzezO5EfMJWH1~(nI3zaFB$(5|@JLnte)Y_mkW2jz=u|+JbJ`a8)TX?z zt0b_@p9nrS$8A!3sbM-IPsh?VM>oJn!3uXLKG%PEd0(;hnOC=-Iv)Y>d1?FKH*G2jhm{QMB~Po`q@(svBdmprsqQ%h&e*RSPf4wNkmf#=?f(k2J=sMO z_R9RJF$0f9~HJdA{SAXpqPStem+z%t7r8TRtHJNv~pd z!Wg9rm_G|qIDclX?(fmijvE>|B;1@e;rxQbiy4Mn!@)1IuaXYe@zaNg=#%RwoauuQ ztwh5X9i-y5Cj%|MCz|qg(1Cg_O(h5JcqAjTy?pi59yy&*1p$-bT;R<4OV3fiPC3ip z;Kf-Vm3~i8Hcf9bwmIz|GF%iN?sX~pn1oVjI{U7I)(1rtTI|SJA?S+pV{6M5d)1x4 z`gG$erB7o-g+F3G)Hzzrm0~4 z+1KuP@P*rSHBQ5)#ZiM10aM6La)UjRJ>JBXB3HitVQ};Dr`w_B`ebW_X^JL9~DlWWrKDMv>rwy1r&8K{xsGi z9|NoWgAxzLoZ{H9jl<$%FE_c!E!2H=U0N9!?7_=0P19A{`msx1o z_>uIP*aKx!EDiU;rr%j^JeC%!?JmEr)H?P2#YMQ(D8qRx+ufQBpv7L(ZaecS*x;Hb zre{wsIUI)aRd^X~?K?5OTNY}&jil!$_Xg>Ek~bVZ-1_j?XsXCygkCBQARGq~+7C8o z^S!H&m7X$zb*f;?ISi+G9tmH?e$l8G3#+(B42`fwkwC%&ZXsSJ>E#!5@b;P!PTjYv zbQrdBB@QpuMX%4;=Jynj%p;f}kr0$GX_L^b2WeZsmiw7UhhMhvrapB8( z$X?jxVN~%3{U=N^+DIPp4l%L**;xiG{7KZJn2%yhGxaOOlTVHc_PafQ%cN*W%Oh=~ z&XB7W&0+Kvk1I?W8OwVURL(bu!oOul)6VTUuKoOjMD*}JZb_U=(3N8Z z%EGlES{8HBEsG!gn>Df}?=&Pn%^d< zcadJ|+QBo^yW!qoQilSomZ>hiK%({sH@=A;Y;jOvyyquYP*xW5VNE z6Q6ma$!P&Q(ticsp-J9Dn!?L`fz=;Gd)|M8Cfu*jo0qsM>n&elcP+|U2~-B3SYRRbDSo&~S({;-uo zW)u~mxVUFueL3;Q)&yilPJstqkQWTvf^Du8&(thon3oP7MLQ<4I6^c4?#6~m&jxnG9km%t4R-YjBrpw$yo z^>5f>L?0{r_u*+V{|kBS8jF|hhsoAywQ-?(RWL!)=I_ZsI-78ey(vP5cl%YOmeNJgxWT(UHnInc8^ zk=h=bF{Cx3E%J{^Q2AFGS?QIQ!+Je2r+C*u9tP97>_h7~sT#SUjJ4t#kOOyWfqa?r z@LHE$JVn6c`)&IwQ@wKW<*Er^l>ST}3!|Lh+8@jQ&{z0Tg5lp5YL$u2MGMl1XtWa% zFf8H#hNzv^Y8)M^41BUETC1Gn1*k?SEhvlysiJxexdnK<$k{9S7Ql?B@@=oF_!bfe zLd5dC2>&K|kYaX9s3ZP|SvT+~x1d-GNu9?23yJ4t4e%2(Ez%On0tZ%&T2HiEu_~hH zjbcd*o}-}J8*k|lZ>+{myT6*l#_6$5qBFBW(-v+nbGt@@%XOkhyJO zcWT(KSjMQC+Ks?cio2S=eZYz)M0rU=x57sjBvU~Gcs_fay=Z{AhfQ%txx;c4Dv-aK zPP(uBQVOZ0j0}W31rFQl`1Rlne7*-*1J^GFQG38lt@Yxc_^z`Uz1)CdjA%lyb45NLYPJDRgU< z9`ar_)jz`aN#_d~+X{~gp5L+;9*Xfi@EQrbM&&l5fk_OD>yyq;frWfVxAwjXd-Khq z;x%xQ`4&(uPs(?chV!<~TC$3^w2ba%i!NPU(ZS@LQ0m>xpG;;ba3j@zK}Wql-{!ei z+0Jv{>aEpLwfvpLBbrHN#HjY(|71BBCD%59^UlMgNuLSyQ*CKoyQrcoAbM)v`|ho% zCcl0{6g(7YCg9LE`lh^pCB4%#87dDaX9&39{Ph-%Z!$w;wJI# z@|xC0fM?CD_iDUgPb1)#%RDVSrRFTWYKeyg#NSQFuep#GG7&QLWU#A+x?Crzqw6kT zC{sYnjK-DFDm;@ShA5s9QQtnK>#nY>4h{-F;C`yKiEya>F0}~!xHaVGK9plnYuGa% zQ>W3Y3c8Qc<@P%Jed)sP_WhpQ8>c%3v4`%9S0kJi%=6Bc9R-OPo3&qAl@-O8lt(nE zm6gCYl&FgJE)hnTJ~UV^_}Q4t3TYpGqXVw`zb26LeHCt04}%goB(D&QV;4xgjS4G3KTRg|3$6J_pG5#sA03Qqpq77{7-}Fg#e-*GoHk2UUj@%`Feb@=1d&yCoRSV$ zu5QKp>t|O1+?vbYR1KZ2>HiuQ+%$dj_qb2$4jX4fr88VX)vb2outq){FwE- z+-#degiI#_|NHFLA)$ za*0|*NG)Ec{2gDc8qp>%S9A!H?@!ule(8&?60#jJF{?h{&hkW~If1KcFPOH~8;&?> zdpqYk(a<5fCH+AtU-e=C6;F7OuyM+EC?bbE6@QI6S1jR~aw|R8L3xgE>FJ`^>XGvd z(`j-|?VVSXSU2wE(WSe!rGnvOlrzc=C|4rI3$ef+!+_5PJnmh?^C;?JZDYo2wTC_7|yf zEHuJ+(x|iv5NGICHft|_wtqf`6&hZ_5dD%uA`jjt6$Og~!SLe>$%ZxJe-a3vg$Md3 zpJtt8ZPa-J2BK=Sd>HI^}cz^;L8ExtuBbqG86Xb&5VFfmtJ0n#8mbkN~<267m zeo#q2^r=@q$KAxIFsVB2Qtaf-1;8wQNG^rv#A`OFRzXmj%S~R&<~k)s_y%0_6k9cO zKF+(~QX#%g1?AJC)$y^|z)Yl{Y}hH{9Ca;a4^obC)@h>MTSNn`t0h8Pf9SWfmNjNV z9T2WGqq3HsSIUcke~xE16>f$VZvo!Bz7N5CT8Ril5_?-zg6W!C)^yj(o}F4sLnGwd z8)38=Ow5o<`Z;Fyn<5fg1u6`0w_$hD7EO=ADx3#Z`0>761)*g_N8!~AFzFLkT^*me zFl>|*xj$GgPS^S?J*C%2nT+ZuLcU^vKnv!H@I_>K^9W%F1xM?S&tz9T9GlZSf~+n2 zoj9hl0m)102+r11OI)z}K1Q8*c1H=cLB-hdFWDB+N=VJ8DY9nWcTC%KoCD zyI`-J$6q>3IO8Z!I*8ze)&G)CFW|t}$hNIfSw-Mkd*AH^Udij1@HUW^QC~>~YI8j8 z0=mpCU6vsYy&;c-M;=@jN*`)@?68PkVYt>F*v1;^&VZZ7Zv`TW1R@IeQ^}$v# zk$<_*kUpt9ODPkUlA*Fn)P`h;%MR|<2%|Pe?y!4hK1Owv_&>)riN=ipIh%04BejY9 z7wt~`UEdiNWvJs^SSS{7?>?PWQG|T;>^?uPeAr7}g(&JY_`#4av&h*5l}U`}{2Z{^pv_-=0f7&NVZyRiWGa>(HOG(7O%i zZ%4XnRu*g6P(GiOT?D-;*jf~~XZw%A*0V}&(=t1$)pvu(Dl^7v+c`RrTE}A({`qOS zE9tU?wcQ9>?jIzH=T0{7DQ!0K>&b$I`g!gL4z0gvf zY>5WnNl$C)han#>l`G;vT;Df@V!z>3d1Z#DzzgSYwn1au#|kq@&qlGp7h9Wn6^Gpz z9P8oD+|DJx;K?l{l9#F$rKe{9R=@KM@i^@i_at+$;v!@id}eLK#3VQeS@P&Ov=5uZ zkJZX}f7>)a|GY!~o#qrx!f8Vhc_c`gbx*HvMXbsoMJ^D7{HtmT0e5Gc1=(t zSbWHM5Y68*LANHP^;UAF*r7p)H=Mg$k-6G-4o4ZCRsX&tpNVuR~!D3fQ$jury5FZ9e{N`_^Bz@59uf99SMH)#ZDmAAc)a z|LqTYg+Oscr_%E_?L2EC-W$fObMs`Z7hCu!6|C z)cp3Zz}aG0klLOK9o7(9ArXaQu|$*Z_|1$JYZZ(4fNBD6xSZU$nk z5?b0yaI~+Ujv5F!J^yI+S}nV`6`zaKXpe~u6F5Nj68**zJ}y!MvEl-8f+q{A8~jwe zXuS6y&GapDD0ND466A#)jp<7gO_SXJALiciyRxU>+fB#p*tTsuS;30Uj_q`ej*}JJ zwrzE6+ugBkp8L1=vvEJ?`~l}XYSx%<>l)XmX1$nI)w=w2z-Y#pbUMMX$~#QG=UpNi z`)J*>s4=fz<+4aVO*-V>->8o@lSaJ0)edN9>06-#hgTT`OHiSXOLFTw>q8v(_7Xb} z*1V=2e1ziNzp%lk(-|DTv9Y1lwcMu0w3t8a+n;<0wKvYl!{v%>88J$%;^&y z5{86d@+-NwwA8Jw z1Q7djFkp9!WbNf5dtFcz&dNT~c;LMvxdtg}o|dm2EChs`0tx72^9^>-E)fxhKW=pbiAPL8D@d)}Kvv42LFSoQbUQ zaHpuK>uOTATm30WTihN83+}48LvdZy!TAnD0vsBwaeejk%&16WCM1rY`Vo#PDHy6P zo0_l%bzZ%E_j=MM9KlYwviPi@p<-7{V#tj%QKlc0t#MeqqbRk|ob&KXnRU^6r>mk^ zQsA}|=vDLgo#+;oGzMt}-#!iK38htp+egJ9AEm1@4-)lejWggE`s_FToa1jrs0~2N z0c2uWHq>$`>7tBg+0+D?SsU9Im#(dN^t)zOM>ji3^>;%OnUlYQ+K*ORk43W(?TYX( zai6fC0Y~V_qwlIEyv!tl&X9wVy%8;!CJ{Lg_AA$~r)LpVI7U7;;oJocc`rl;z@8YA zAF??PJFX0&T*!f#9LY8;3FJg#M%_08q@DvsA>xEj)@-OONUqm7#3+eG2RQ45au+Ju zkvy!IpNQbcX{CW}Sc2?$yWeSMQq*Ai3~1^^Xiav@=DODtvKwzhQ~T9 zf}Ok+mIyDqrvDO69Dy{rVZ`CdSk>AmR^rZCk3l^MT?D$iRSPb_5~0fza9Y~!4P|qYeOKu6@-LdW&f;v4;-v> zNms9EwYB{rTTn~h5S<}V#!?`e%(YAe%OE-1ggOxSxkA38ZIU71Oy)Y8mkf z4g6FkwhgtWb;0Nn*mT4ymeWcZ9F@5VI<47Vw6eEe)_h{vq?p}35nKOwjI7RH$2dRf zGi_%2TRIdmo>IpvcG1}L7Mjr#(>TQK|J1BYLt|Yzb-?0xUR>`<{t%iJmK~ErGe>o) zOZlfL8c!=`^DyM^cqz&)Gw%*+rrHB8$F^aapO(B02TuzoM;dq^B;%RDf1% zfj;~lNjF$89VabTGqPZrBa!#paJAVsq5)B;4QB8uR^_}vBtk>7`-|4sj2Xy+I+4G} z8hs6{iCwyl#%1{p(drMc{{|)BL7X4_e?eK2N;&Mxt>L|*@WHweVyPVtuvGNj&Ts_u_tw(?U-{1LtRZ9;s_3EGmKhmswcDcspq!T%Q#3Bnv! z=yXTH&_IM11E>t+LQzOOz8=Xno^xTUE;LXdL|DEq^ysj{jeT`PT7256pZ_m+Frs9f z&Oiq>!?ci9-P!5irPX6bdH-d}xK>uV z4MY;tLahFV6$c~VaBbPl+AxxLe{Hg1@K%w`SahF6o+3-TN)7jwBmSGIJ_J_~I*zLby2v?_#FB$vBcmM&UwubDsJOtEgz6V8~ z<7-_-MK&FA#mSBR(ZQqWE144U_KTi@+&!Rkl>4ULI?M0MG!!we|1Tm0uvQDVhP<|) zQ_qr=;RpyN%}}Q7xcoz%Ty!A3|8@lQFC>yL;rb!ni0ANLn<;3V|3cDH+18Awn{n&c zcJ#aWUq}WTzlMk+@j>6Gv#{h;YW^oUJP(^@rPlu-@xEEBrJykH+E#_RT%&IAqW%CS z$fa!e@R`;gwW$BE;5Z?Z-DR)*XK>0i%2ejOO)qd;YlXWD$V#Xx=xSM7xVzA7U^+qJ z9-!%ZP`Ie5zv6y#n+*h^g$Vlkg4m(k-~v85i^MlaGMii-ZAcl9Qt1m>HF9hI`wcYf zK%0j^6QPQHIO{`+HP$i9saph{(een@=y7YO*%JPwe42x}GwVLZIH@%tJV{LPCdSKX z0-%%80>g1haBR%uZK5E zXI)!XfTzn>S@gFRjoSX0I}T?K1(>ygQy_a;Hxd-(A-uL6(n<;h>y?>py7s=&d(%5U z;9FbQN4wme0&MwF*DPG2q`s2BXZgZ&pfTEZ+uM{`>HvlG3RRXOyj0dE^!^6v$D63? zV2si$lHy`|WO&hJBRTcVTyhJ1CuT3)y!}AIFk)0oeR6cO->Gu|tJ`tnnPE?S3V^GQ zZW>y8+lN&AwqV(7l!8MHVs-Y`!Roh$JvAu6J7%c*+>8>$GPo_kqQW!^_dNiQe_h+k#bmZl3(tG4u7hI*^y(?a$d_fxS zRe#`~g`|J<#&O2 zg{N|7Iy=MWYGNe8De9dO?1I@|Ng1(BC#@UW*__7)>Q%!~5jAcB9I^~o3`YFt4o{u9fW6+#}Zm)s9Fb@@!b( z`$_Jl-EdP*68jAulr=${{mYA}cD%2|sGJu!os3JW6j1Z7tD>cV`Rn8tW5bmNprVz5zHBX~5O|0*+Usss#? zU_BY998jnK6q6TRg+r6kj4BnQvCA!&n&3sK701cbK3*QJ^(<{&)1BjJs^rS@7u@As zOwFZ5`jawC(#9I%NgP84Pm0{1y`S`+q%`WX{;Gp-+bEB=&Lf#eJq_mwe`3aUyZxC+ zxct_|+RFNfvLN~tpKL_mwsQIBp`}V~i)FI3za@A21$up(t0|jGr6L1W(gbER{Cw5gr`p1 zaFI!u!#psTP~$32Y;_b*Mxn}yt&`|}z}4H1L6L5GD$>SPSMASsVXi*& z%LI4mTq7H;w@jJ8vkdFvmF)EKNc9+PL4}s}#!_qzLAI-P*|zxv!Tn;IG{VW@hvKy3 z+& z?zgQPY`P6dW$2dpup$Q@8RiW_L%K(_ki`V+$S>nRC1Gz6o4O@Hw*>9d3FXSQPm`x( zeeP(dMA)N^V4oQP{Vs#Y&HTIy>Y6w^Zh*U!-c zCKl8Gy(1Yc2;J0#`N}s zwAjnzG#CijM+q+j{YPs%iAnuykJW3A3jId=9n9}EU#O(`Bwt@c8GH{AUHZf0_o~D; zjvz9{7!G7-{45M#Uph$A80B%nUC|EwS0K4hhh20qr2)o#cU2x11DpVeRg*g=i%k9%he zFogivlfHcJBI7?r90FA5_!zoz*)Yl|%$GXXpL8+uGZLg~#2c2<9U4*3<|%%P*Vb;9 zDUMs;EKu)H8iDtbv`Z@(k#`-D{HK$5?L}~Geq#yeUeA|L%e_8DKeaZ0o2mFFQiDH{tZT?9n-GR^1s2Lt?mW+I8YT?0Z(}u z1t&EmHqXZl#dIU}nT^zb0X3Y&?uO!sJWyAAYwo!#Fdg}~HmD}x3$QxSw_>cAUkb0w zD@t{OHiaafVTl_9h-7|);$ zR>_!f(EqWc{GKmN`j9=Z+(U=9g!%cDT5ZkK(!P{N)CGWU$p!y!Zg_!DU)!6+dju0z zvv&x#;lRR1I(N3LDMgT~m^qH*%bwKV5(GP?N2Z`^K3guen_VtI)T*) z+3EDha!xkI=X7y!6_fwv2KK{t=z~}djCVy#js#6eP4JURhTNy+JDqh!hTraU`vp=7 z9inftW6W~MOYr@_(cm;QU!qD8w{c-Q%$k~@Te>xqZt1UL+H+vrW9E~&l`zPNNeE4_ z*PLmG7~EjTG|N_+ zziWiStHr0HjK^9362m5zREGjtm86=5%cjBl*z3+p$zRyE!DxA-R>un&cR!=L9#n4W ztS@c4rN^%X@|%7=U1RbzBfhcDav>yfEsrET0xl?id;R6}iETfS{rd?1ck!q1KFv8= zS0sk9v`wk%2&vlhu$goA@#VAZCv}|ctX~iR)l1S)aJcQYnEa>xVg=I9-wPNrk>GFx z<&Wd!cvkhnFUA#eZfS;$Elnn9^8AXZl#6Ej+-z1N?0AQi#Va}zv)HN*Lh-Vn-}4u_ z7AVFe(J*+IJ-PqF2EaHfgUx=stSK@uz0kF~Hs&qrf0X2RE%{bf1`u;%h+@i8Q~yd+ zUgl_(956$as)*QbTSw*?Z^667mG}d$91@!c z%L#9CovM(QF^*ohp{oMfA(|%5GdamL=5*yw0AkN2wiyj5AaFNctnsL#5DrTWAEN`b z@qT~1G6JagzMt{h1XA%uW;7fCr-I2$+3Itj_%Tse#c$rnnATmAc#yF)g0t>!>Peii4;D$yy9?7diImw%f=z+@!*M6 z!Qb+H5IN>{$_0Vfew+fA2px3LOT(mI2tA!ONA!2+f7Q~d3^IxUl#r}q;nHB(UfAH( z<**EVfSw*i@I;B)To-{@(XO7{Xchx*I3fZT4@`RNGaiJQCnL0M7p2gGm*Rd?&+=}z z5n?Mx1dkSeq_dXtmwf@%{Wa&&L87;WTwJRx&lbVo8k~Qj%np{!K{K=( z(dayFV>HbW%mKnd0zpqyZQPZ5D3*>WtK*e0#rM~>`w^2DFzPO12liQuq@940!W^+v z2<%hF-%f)QP)N{h)opf6Fp0MTqpql3x*rmqCKfvC6iF}cJiZ(A=mzjRc=v9GXt9$>uq|N{ z+&g)MEVgs2Sh3yJQp~P={g}dnvju!dFA#4ty%8QyIgkE%g+~0kI1C z0giDX9Va(EntlGfVoJSCQG%xd*N$nhM%=6qQ>k-py4QeL*%ZZxZ+jWEMx-0%FtjAe z<74^}J4~$?bupXMr1@?lOSLZwkXhZ`H!)^y$X~in`Lz;ZuG#sWH^tPqKQ#C4c>iaB z7bX+gYUOEdax4+)o(m<#T2FjJNH|hD4JHWZi%Ch-Uh}{Y>mX(#XYHXkJ5Ma%lLd9T zyxhww-fSWTqmipT9~}rOua%DxjjI8{2W@2qdnj*W030Jwv3Z$V9wJgqfVA^gO_K!T zE3-1lBYK*Wen~ztQv6yZnLrmCWo5tYw1#&6^G12~tL3Yma%7$H?}}r^T9|HW=6;I$ zQ})rnzRtFEHyb)H)TmhL7WGtjF)*G&u0>PRJ*ic~Z8Kofe|nV(Dh+l^D93sa+pykC zADB*5N#XIQSc>QZo3 zqxg}p*bEl!pS@zNnu{RllCNbU!EKUDC?E%Yw}PrIuU_m)oz-<7v3;DWe!l?6L>T)O z)0Pahy0vC>nZP(?)CdGx!m&7sP?FFLH;86Ka5M!wo8aBr19lS)r|ny4Zhhj&ZPv4# zNrAQzRSe&V2m*-ig;f^g_)tbr@|{S?95NoH`JCR+pMGq7)r{SA4%rOU{MBSRbG`FP z81K33xN>kr!*`e4aTVQyk*mnATMLk|l+bmpshJ4BX8}*raQJQYa8;y-h1KHZn&QsFNVJ#m(&2EL*S(7yP82-tYA z9B)UFPAn}6v(f#TP?CqPh{nm_AZ0U-E1qjMnvSvJNIQ_Cd$b?Dpzh5xf9#7zH~_bM zoF>JyYN66f!?_(5|BUe~E+=s%jUg4IfCSzdlpQGu8~bhiuP9We{p|4Ukum>YQE*6b zLbXa!uT#Aq0^3fdleJSk@fvuGTKS(SFl2t(1Xv50-I05;i$oAcgvZZT=e3_s?`+nDHOi0Gz-8_+*qyr2aY1gP)-)!#08dB{*JZhC~*+ewo=RsLFtNFb{QL6_}n6 zXLZn6Vos)5`YTdt3Au=V>LHZHd7Vn*eDv{%;T)}o%ej~_r9y9KsKio*zbv^@6x$-w zQA|;!8!?=mP(#MsRwf=sL)(#iTCd^NA~_k~N^@45T}_Sz>9@%3;LK(s;0 zZ%YR+D#fzN|FKeVc6I>+!}<;u{!|$WbVqGU($)|1cql(}OY+Dd{T!8vf}o>o93!19 zwpnb=_Ws$MkCJ_O+0U%E4h1k7h{B4$<-SC3>9BGn5EwkA39pT`N&QAghU7e|m@vH| zNjRJ~5x_)fQ@{xcIS(LrEBG>0)* zMvDb-B#cgcLJS!4)OKyzP|p!T+#xrUcegabOc$kFhBd z5TssGK?i@ux&8>~%z0olU}F8bkm^58jsRA3?;y`!M040rNKh)a6MDzK!sunFQ`^l; zRNNNv#4j&gHe#@_9CVckcaxnweBnGjk1o%S5?k`3Sgug87uvI-c=;W4QNj3&p7sWMFpH|1%-$k#yxq^Rm$9Pt77*atNl8 zWJ>U7uuo_%xL01{@5?+V3Bgu;wKir;W+hrR{@^RME7fwZod->n5LPQEZ!;m??5xth zj!-itqnoD{!|>-Wzm>Y>U$J8QDxaw{>tC~6v>L()AFxN(B10lOBq#P2Z#nF) zu$k%NlyTKTSudC^uExwC!4IcIa5X2u-hvC^FQb|m4zKK`*al`fuh#pFl! z3Ls*@Hmaz^3UUwMdqZujF=4p_>RpC7;;w1M0YfQa05;@78DVV3unp%)yalrKp(G1H zOzm!ciMuO>-0SgF(nN*BIF`XK?BJEgddEP%l*$=$8!}m4l;b`d+9~DOk&kiZXsLFk)(Zn9C!@XYjMgiH z!!Hyuw8TVv0WyPi*V?|7{0q$csirJ}HRSa%9z)n@Ky@F>`j4y2F)g*)Jn_z&y{S@; zz}Tec;w80A&JY#IZpn5Ybwl1QQ8~Sbud7|bDO0o7X{)gA2$zqtzGx{o7W=p6@ik`4 zp+;_G2PYdlLm;$xNBa5BR0mp(!0&Ik9{O!KlPgCZW4M(};oo^6?Ca9uLH?PypSTT8 zY9tfCd3qy@o;gZohDu@qMZ)27!uIMR7kUFMHu4|~Gu(Od%I7Mp>@7I7&klAow(Ig< z8g1`DR{o`yn!01T{$>Dow)U z`G9Dq6?prd=Z>iq_bm1 zk51MJ9JiqV+jFdoHm==WhS7xv=JxrI;X-~KZr}9-+tem|!S?5?y;{4M{9vatMRY@~ z>&@ifK6!fP*!IxuoG<^kPM<;Va1E|1B=1m>T^b43YPB-Pcarlm2se=B?+7Ua7wzUq zR`K%Zg?th}{V}82JM+m530=*{&6ck6bFEAYx}P^bWDw@s{IFxc z|9;x)L4Y~Y*EhCr8kC)U@egl;bBGw?PVx;!9Ja6)v}`EV^APWk7vFc zvLhjR4Rf2+G@`;XR^7wfUtiC7ThS%+z{VN|m|r5&#)eWbL!VV?J)xbJ&g|K-JVjH? z+4;|xpkQ=UzCJ7v^?rTE6bdCNCRE(aerC3474z#ibo&&I>8U6bPb@6VRE(ISzXDpT zub8u277jVC$ZKo58{vp?F$o0QH;EER7sJnN4|uDZxua#YJO%tyT-Jt?A4N1kCPg z&cR9j%G1<@n1m3u5DD>ox@W#v91*0t{;D%dG?0}jg1kDx+^-k)W3WiEuq|v|jAyy3M)4cIr`5XNjG(hhw6& zQ4F3lbT%>;7j{dkwp|Au(k4ywr02nl;?B7COl&O2qv>tZ!ZKE_6y)Wuj;JNMaKgkC z$Kqij=Sc5Dp@$8OeG0oy;Yyr`-K%5${4ao2F0L%Op)P5=Qm=AxY)*2_uWJ86vG zQXWHz>??|om3BsLE=1koc9XKXXNP*r0tpL+of+qBq4FC98i^ffOdi}8vZ5PUuHVb^M#6EYPY&!#VSh*mOIy@*?<=4DF_ysJi$S zOym(ZSEG_L>Va;2JE3|3Y)|op@iodb9kvB6%|*4Rc0i1 zjtA{6MRh7_Rkmh1-G%!LR<2Xim4avMdR2NUqrL$B%0&J0VY=qHMUPC^-1 z&ZddA29ga7`1^A~_IB2{WSpXpV%|H=F3YM0s4cdT=si90z>JZnQ*HmbnT`GWL+_WO zF*PAOxr&ol zHamex2Xnn};GU1|648Lj9h4_?yoVgABE#cU6h70AGpne&$C z7XzFRreyePJV~k7130UhV!q-xf;i>scTpwn^a}T)iZ>U`?PT2)RD|0h`JE8tV{H98 zMBV<}*_v}y95nbqm@E@1f? zrFT$nFO4;nv2eJ31IMbnP>3gF{KvKMS;W?W6yaTx>LRa!NMr;`=Pr!ANRfg7n&0_Y zIEU-lN;;nfd`>|!LE*T}nbisT7uQ{q!{|_?(+Qo;@e>>$K-N)y$&bc$D3`gk$$1gLX9J#8e3Af|RF3jsyQ$aHR*f$sX) zq#}xNM^9-NFHa>#R|8>@;OQqXJ0cvyesx*`(8M|zQC;)fWPe&&!q)alCcgXsYJx z9%GFo#@~^Djv6LcP+!gH^PMc}>@1}oN;PU#=5StiaFPYh?HFg^UpZH&WO2QeuKLzK zb|`XkQZ~uY1TL)4$v`qsRwcK7qm2lb zSPGq?xP4Dcj`4@L*jbW~t6`kvIrV1Vu(+zNU}|{RRU?)fd-oPfl43uD&n;F{Rd21R z%qxR896NmX|IC@_P^nbU#JtV+ji;!b8dj(ub+a*3IaAYxf-e=6tLNHwZQ;b(;skfZy)F~^4Q%e*1hQ)T&hfNW<^PtwQyD8 z&K0#bW2C5IcMavXD8aHfo?$)!e;O-UgF@g?-9qnd1mg5}SuUN+8* zA-zW22fYks(z4p5*&Xj>+or#*Q*zHlmru?q=KK4`f|B*kKc+0_b#G|V;$jwHm_12g z?G>s+{*PAmDht5M8CGmf9Q9y1=M#AEpIEIAW-sk{Q^qwOD;>v+AY^G@ z>aaKa!hN-d9L9a-S|I}(%g_4x8%lT$vgejxNxKDTqtVw}x?>dIlfBRjte?KR@ z40!*2??7agXcjk;{gqv&Sosi|5K!_*d5Vq>lR8r~&q<#eR&4o+b>TGEmn@XPrrZx* zHmsH-W!>_`+4m_!&RO~krNAPbvy5c#I?^9ttU~H84(o9IJ`TggI3OI)?o{ZY>2?&g zd667kz+qU09k?{;IfNV3Th}{i5lsJ%bprP;<=#bNEO7ycj%8Cf`V-DgB#z<)k9?uV zv}yDqy`|T;W`i<=&@W8C*lgLW%0`u=rqmhl?9~1+k&P{pqy=(t(QAGRRq;KgqeoXqqw_h zZA;H#n2;d1$c|X8=O`9|=X+rZ&p6old!C@i;$$KJ8h*-#AIzy8hIg)aU&kDeqZ$;6 zoCg*}kokj`(lYr{991(6GyDcO9K&@ukX^z@U;E_%$oGg#91reHCd9~=GR$XWeHHJ( z<dlL*`=?!$3q4~b{#P(wt4#USGRRnNj$#O)SFtPa9_1v&L9L&wC-?Pb&|wYpFS&b zmKg*!h|?XZiZJc^dL~_7(L=E{o7Ni&nPo&Zs&*ML^*PqAmG@%hyoDzBa<%76Z!I2G zVpIAQ*5#mO2bY0kiEi{|ny<73@fl%S2KjH}N^pcGLHbTe)VA84%u_|75mOMm;z+Sc z1)Rj_T^lIQEn_>S;(O(7k_0(=A+PEoSF{ln^zh}MY2)Uy6&(M1-GC^-Ubj!wi2CY9 znkCSYj3OiPDYsvg$kryi)RlkE>MRj)=`8D{!b(gd%X+!~Y4)fcjySDs85#2_7zmMu zp<}hxoXD0T@~7ko;Nvj4*(IwE>%Y=$k9DxWu+ve>{?pWcQ)VEdp+OU)f+M|TDOodP*ic@)B zhTZAQq-H@o!Y%!+dRmp?w@HJQn3WVwC0P^oazRfZbH6@j(ulB2`B}VG14)6AHFqMp zXp9^NluMuOtS*h(PtdF%_GDD$pW+UU&FEYxrZW<#YB-PT!Rakt13p&TiM-g>+ixR{ zo+)?V3wfX(Tck7!apk#ML2T#~2}wsP3B9QmsH$9U*hemMm{bB zy2(M(=A$~yccVpR4nQ-%h3ViQb2v{_UCJeu`b}!p8}mqhw^u55c+JHA;?heoom_uo z6TTA|Ew>|^+l)qdffv(vNEN&IjHaUr^@fb)Zf~-x7TIj$)AaSOrU%d*SiKYJnla== z|7qS=&W9wr8PD*$Y>=VSd@DB(+#}K&?V0|aAa5uSUob#8A&ysIZ%jvO&eubc3u|_S zA>~id-K0(c8ILExy#vpdg0GKtsF89oW}uOZkny`Y9h1f2xc%=qM&y}w zsH=h429BQA>0}Kl6P-TF$h`B0$ce!8T`n%>Z(7G(Qc_l0{EcGQoh^jguOF|>I$R&U zJbhweG0G|@Jmv)a#@$$*W#|r^Hm4XBjk)UE7Xk|<>llrIh);Cl;BMD&>FLz+>#$V+ zes~>hhQ2#4!+Q*7c!#>A_I}A#*$OCP)e6B-RB7fOZI%QyV zaD+U@JMc@~Jfh}n{9a7DKYNIO>s7+@LU25Ig0@6P{hz-H;nV>Cvsv=6Sndq>0M?u(cPB-pEA-Z7!w`vV zUM{CBW}2H<8gk3i*yj(r%@ZZ@?1m_WYIfO~%~sr+tn3+_R%j z)W-eP!JS|`7SBT)d-8@IblzGF zC72XeWS8t;Ra;A)0tQA!uB1O5m?>FpYMYhypdEZ^0)={j{Jzi>P7g+3Q;aOZ{rRw( zO#GE2aj`Q9h$}pfD5#%dXs6`#wat)-I-#JIkzCDl;*yg(J^Nj@;)DFWLg(bIUTSE3 zE$j&7K)3T?1e!>_G^RzY1od7SDHp9u==~-fwXXr zN!4T2kB7v1jj7krAEfEROhIyjRvPSPXd2Lzq1JE@X>O&z!}h%Pw|5glJZ#oWk8{g^ zH&s6K^6+x^=B62NWAK>9bQXj&@M{yF+ZJ1;=`j zvpo#XQCegr9I3qRW_ai@?tRUwYt1*_pO9YCUM?#3p#Gy~YH;^XaJzj#Lte|Qp zsGZ`o??ecpqydD#U^BXR)s)PjKN)G#|)u-Wl*UJZl1BBubE%0Be{z3edbGLX%F80Dl zbm6VT*{6Y88b+P`rf5PBmU8*WGb&bKf(Y{Gqw7yCn;~l7&cP)_TB{axgAZ0a*6EV4 zv)pJROz0)?jt6Ramq!EQg2uIROa(y&W4fdgHsu!$`2M$C z39ZyFtc2=LT>#8FL>f}{yK;r|w*p-;{5CFqvWMmT9>zpbX{joo!QS`6=^vGRo;%r8 z!A0VT$X0`AZ8N{VB;W3~RPL`tuLsJP!ten~2$g}nzi7|RexPk_BD2OHrE7Rl3*#Xv zKv|X>?(|s&qBShnWjr0Xq#db>kKf_d^|&&{eP?hLZWC;!I1{nap-RKM1SDEDFGN4& zb1CCn7v*qQI|Q~QNYU93g~u?)>?v(KPw1pJ)D6p~HO!7r%kaeIzN&7w$kJY6LTLRV zikJyD&+tiqNn*>Q7{H=?nSte89auG&1Z+CGzvT;>q114vA+6l~MjwJO{2~U|tLs`W?#o zSyq(LyQa5?uNI`o%qO6K7C7|Fk|NPZ>vP5VvJ`VPvadt0y%GS1&>H0yM793bp9*qkLJPH0NF$yci^O^rnxqLxkL_iBWcN>sE4KqQPkEWlRWR73_JjoQEe z3V{&D>A28LppwR9-N@ea0R}GvL)P_i)I+q?Lv+jzH_e895SoK(BiV(hUmZ3s+M=+D zOrQoR+~#h1il7~XxnRjAA91cz!zHz5JBX>1r)~Sw8DWz2LfMb%Dws7OBgancF6W*`z2E7P#by{?6>fZYh}ByJmi8op>4qpO2VT z+i;n-^Uh!XZT;+{TC_XH)xxM#ycbqO?S5ctKW0q0Q=q1_z)7r^jh0F_osaqP66g9p zLf6b$M*rre-3j-Gkp}%QVthOSNRlibP^5|>)^yTTv5#_UkXgUe>0|&ki}sC)T6O`a zyMVg{b%zUpyEu`uZP<^JBcE3NJhy9etjG<}t?FH8new0oP~|?@ zyM*->=E=9f8B!ttb)-&A@}kW9obCh-OecI36twwsw6>g@oB&guvw2AX(G*p)GsBQT zFqr)eR}-ikbY7Z^F_6_dVe?jV|MH+c+;jFh>ql?|FknhrOqv0$5aTlhtYIP*(-(lWxYu7ub%U& zRJiMwbg=qAgI1x%07)zSb4Y&fPvo-9{yceXkLYFJChT45zh=-4`HLl3u;5B;ROU_* zq$$PVr#km(QOu@uY81YVi3`p`bf*em#$-sV?G+10Yeu6kuMCTDsm3(Qxt$fHbmzhg z{|_Da7+uM_whcQSbexWzbZpzUZFOwhwr$&)vF(oSbUb4l-(LICUh5s-998xIKE`=g z)u_5=$);CtE)xH+pepPOF^~@OS}6GxgxW=EVlG3M{JqyVom@2*_dL?1sD&ycG*&!V z;V(`FbuLszyh&|7)RBGAG^%(J(!?8xW77EagmMKP7r7{7c~VyebtcT};l{O>FrQV+ zZSpy*pLyG_MRXr(s$1w@1E;G6-AgVNQKYCt&>_4xGUeH>%w6)MMu_6u03T`QUR&*7 zpVg}GzOdM)3K}Q97WGS#wa>{ehRl38dZTI(A{ML5CgaFIKEP~nzD-nW`5-Z5E zwn?65tF)adY~Pg%%`pu1*X#IfXfCb>Xj5`0xGWtyQLSn!IJEOejLoY#du7D2O#db_UGGs&$20%_T4@Ev^`n1<8UDNDukJQL z{`~BEsjPLJytm_X@SlKYBI->-S?4JgkvsBW5uEFe?5SXb81Mm;R85mal?qLne`Wob zFr>$Xj%b$dpSMQH1crjq1ZCgVASL6<1}~1ZD&`u2=MWyRRIeJE5Wu50GCzs?0`x#j zT}1?vF`+XZgwo*3Z_3(2YIt|POE6yW6?JU4@D1MYo``oItUj0sM1tRUg+r8KBH?8! zLG#3V<7jfl4NX#AoYhr$Pdc%Y#6h{|10TYwp_Qw|I+@;B>HuA9%sHVd;t!BIzwM&i zu0_XZz+F0*MLuh45LgaIz*s;#0$s(-E_(LqM0`TjjrfT=2cx;I`&!So%@PsQ9CGH= ze4%ah$XO`WRW+_D9=etUJb^E&!i9BAJwHw>PVUdDDVX@6c zR@j*t8e6HyttpUtTN}}*3=MNmU>OKewwA!RsHtgwvq?>sJaGOKdRVG{>kvbq-R~04 z(@x<2VmV8rtj`!a*KBDc}xF?INRTc^M!2EM3+yqZfS%r|vkwMS~sEbb7&Aa${jRkf|Q!X2ig9M#TJ- znl5UudI$ypw*hNYBXok3w;;f+7B1Mu<8-~q;3W&Fy_uOkrp5msgGDRVW;68Mv08zS zkZ0*J|1Vc#DmJfkW~me(-Q0;d>SmfBZDfVz#=NII*>_uvn}99_^JIY#@^uHL6fe9+ zQtd8%TkLOYBVu+XYncw~sP%}FeD7t}lQh);(DnHUp4e=L&8CS@ImVJZ_mL|kM+tmB zttMF1mEXoR*l6CW4N#p71JRwt-Xfi_{P?C)6Pbm7XdCoaIMzq_S)d+)w!n;$&}1+i zqe{a`b?0FA0bSl@?K&|x(CQ=9qRHUi7lTFGGIi7J`R7SB)cG#$PON}3O{BbzWewzL zjAVo{q$Y$v8X>kjGt8|$ zI!Un6NwomO%$Mj8b7SReD?$uYOvN-~yYRGMX8RLsN=kF~sjGEX*)~Q$Gr_%BYntyk zX6OC?FAYN-UeymL)4Tth2J~`mx!Q$HeXRdYLkobI-@_tU9Ul0@9P<@@_k5uCSHuMg zSW1+1SQYuDrQ!350!V4S(XHd$$)Y9l`wUx{lBkK6aYBMYIW%Wyi1%c1-&f9n*hduT zoYappgEesPl=W1|O%z2HCj19{vs_^8Vai^RNFg{S-#lhz>Z2=}ShM>_3aI+Xi2CjO zL^fCc+JAP!LL^sQ4pYz3D(wTeXtFWd_6CC_VE?d6puuqA_gMW{+3vCs-EW2>y0IN3 zT6a!&PC#+V|E6K)G?;6-W##w2u++Dhh9yRmiq2xf9%SHU<4O^CfSMDG;$gp)Zz>)b z;9{7v%1E;wD~02tcErG9S;Xv$mLc*_H{k`?PtpHQL$SYOgN6Nr@kbt6m_q(HXaPa< zMN3xje_shjiNh6Pm=zh6o6UpY<`)Z;p&AavkUPQ4ONw_)1O#mIeo@#_az>55%u_GRqccjC zngA_Jo}u(dUpYgZh47BI!#KflN;<`#ZSSCOP>rI{AwO+X>ZARW!;34pMyWD*kaxan zuI(yQBA1~@g&!@&``IpS8(PWRIpU+s1fAQQ%!H%@YpUD%Ybl$klVM84SIAS~Lrn*q z3>#?=LXEY$$mvMU%YWs*5()k=20x6|#H|K$MM3Mzg33z7$;JNJcrA_%y0>J-j#1J` zC7mL)Tj1-Is7{Cb(}fuf1%3fLS$Os1MWJ{D*c?ca!;HX~Of2+XE&ALrEb%2mnaBHw z>7=7Bjg)7)Cd2i`Lm_+cfX>W3>jD3w(8hY{7lR}1*$q|=Yq_K?iVT<}q8TA?so7*6 zvX>ZLJj8qfhEleEC$?HF2^eg`R5+ym^23qc!9;Kn7au;157fo#G2sKGrSBqc3~%-e z`&w>hJIqv=(XV!tbT)P>MhW$!liAPc<9_tc`(3hia^FwX*r5l;1exi3+k`jMvbdq& z^Y1~8m4HkpuSRN&tu(c?5BiGq9MmLoDq-~sxS7=LsvFQr8oN0oYN9$xX~e#KPz0T@$!Z&RfK7(2*%(q6jJS2t5MdgznrN`S<4nl%V23CUb7sJ zuRq+wHx6}C=;wOU?P_yq$hf}ogVZ-@mCp?9;H*He75EKR;Z=Tr#!o>h=T|vQhzzM` z%&06Hww>HUIe$cU<4)>Z^0u7uSk4z;@kUQXU%SZOEy3mzAX4yFbWJGnJJ~oboQ{WS z;~qAw=?vRXp~?o~{2Bw{{u=r3eR77l1zz3t#LjWgj}an1Hkt5}+JflN6?)nJ`wMJ> zcUiQ5;hCPs@5jIac9@PEa?%4YZ+h(N0_xG~fLK@>PI&H6P=}Ujp9u(LfW@f@21=Hv z-}HjeWVEG)Dt!WaRUj6Ltp`m8j;Q8EuP&21Uzj!~ipcR|$5uc|{~n@!qlkyU4#Qgv(9FkOsZ`lY(0={WK7o@gk+ zzU#`n1`q7dDO?#d8zkA@8USi*z8HX>)p=`p zJ@u;h6WQc-91~8aHp|-foB+Y4dVmmNy&Z{-T-zM)I?{E1e|#_&dh&5qMg5dwO`KRR zo&pu|aQVI9QYDt-wffz%pRaTSzkIg7WY?@`&@5% z=RT19f&C|H2k^&zBKAH>D30Y3Pbs3QUOQ&r0^lz-0>U^#wJBT3vNw znG_)xDRpv{u(9F8T~O{=4x6lJ+Tymtb}f}0JH+cDZJk@4uq2=-cAs{Mzs)a1rQTf7 z`rGRY9VhW0xxm3A978_nDie|d=G#u^5`F9fZRjfrDd9^V~ zc#n~p*ZUSjY$NH(P8^q)>*k>qE^5z-@=9oZX|-jOoB8y6h!4r#7k)D( zikGcb0!_Ah7RYwl<9hMdEiYnm>{l8zTj0({nQv4^oHT8Dt(4|o);-G@b~c~CJEXS9 z@AFNX$cAAoWKciw=f3lzpAAVP2d*D13s*a6Mw+9@fFxS0KdKJv*4cLYo;hmkNpz|~ zEs!eYD5Z=q5#Abb_Q#hMq*CG_C5EEKdh-AJuNvfa1kr#rYmF^@RSw7#FzK+)xbHPzw0w4?P zIW&HD)24@}&)*@O+pHYdIIvDfZUZW*0@df2nlrqe>y2hH9>`fckUeYCbTb%bHkW*& zO!Qh}k&}B-&P3+kEs_1-U(Pa_!YhF5UM~((1>8&fVefYrES|DxorjjXWokaPUwKkR z%Ma%0F_Tk7vUeHO^YE!VjxqRl+eyr&d`vTbY0Nq3*)ugIhO>`rz5^E*y=!Tb+G~8t za4qSwk*M>5c}434qlH`U5rzudI+?%2H1--~K`s1|Wg|Z)+Nzo_mb*IzGSSmWn#Ic# z%9Z-FCc&HnM5k*(v}%_W-ZpxdP>k(ut%@#`#x0@KRX^ucJ2L~GEyQtR(jy! z$f-;69d5|eORjNbDR7HQK>w9;%n?HPYiBDF7bxD6>D3N7((bG_T^c>7(5~IPpWQ@~ z{p&8$^d_7$Nlzeb#IFdib9H5t!3U-T^t-`Illg3|LGtbIIB0l>rM3Cio;!$hSAv@EnG+%}}U3 z=B3K?OQkG0YKg2+(BPujW--H7+;aShAJw*6_8#x9dJ2>qpOWpvwtq_`F%R=4bi*?_ z#7%Bs%@!Hl&wpbKDV-Cp9Gtl+1+sppX%4r(xzH|q@~}?`k6>4yRh1=YXg&C0xn9!4 zc13(AZNw$$Tb+q5u#p_x*I`w~W~YT7yw_vNgTemsOM6^PyTNOT(+eT4f_phOLNC4p zq5&j>QY!w7LBioX&tkC!_IRL8f&LUs*p)&3INl1r1wxeV*;~28*%m$j3`=_s$)%J& z;64Vi1Xy^%vtDc5AhV5JLuOJUotL_6cjqfUmvh`|mt_Kd zD-wUTpjI>T)y-7FfnN2KeK8ALS1M@WoOS$%ap9Jbwy^^hcVA9WdBqhDNMER)lYv); zlu;O=My+>`Uw>0^5v9ybT#zZ3);D6C(8^?PI*dY1uy9_U6V!2Um@{EELguhD7ncI$ zEG;RkRSQ?VCR7#1bk|}YRNsWoDoS_OE zKxIe@%*OB38c};2Udkk9_C!505pMZ)tMxemsR25n1^TvynB9_AdLWA9J7;40rn^m> zER`2KsKs#mV?d4pOmA(7kl&%}dw^&LE0-5p0CDFX(#ZsdVd13$nJ15gWho7EiB*z` z;tBb&$nxE9yY;v=daffb={<+mFq7wvnLw_X?51g0AdEC1Jo_${>>zsaPDTce_uRVo z#@m+X$LrO#(IxyAiv2+jrjT+wtPzpRnks^?{JiQEv&Qp5O~BpAd(*{2Pn6SlN`UGJ z(eCIbw_};A$d)^SM;4c9)H8uX>7@a%0(y0j9aV40Mlh-Tm7VQ1sp4##wXUzxySWx{ z+tc|0BX*AMQ;izXNGDej(YyZ<4|GvfdnOz^*6J^u*M4EMYg3WDN9QigVu@pcuuKfu zinov75`l?>wtZ` z=H|ZROHrOHRSlQDI7JyzFQd#qf#)Rh82Vr5uH8~qYH34U9Shi6`;>hsya3jU`X`;p z(}IF$ckQLmtg;4sk3v{thgoH1ejy+Fix^Jtxt2G4R>MOrR$FriT{u3sEm;Y6H;L93! zzJb*14CAiPQI{vTsb{_gRcJ@E9aW6eD9QKS@USvu_i7@u@pKi%LnpaD~UL216SL>-$^PQzZ|y)4pe zs{=W~`V7xen^vwv!!Exo1N-i196H}C;wl~9RupRc#Bn7Q<9*)jr?w#i5_Yw z9vpxw?~ATG;VJ=HA<}*A81STgWw0xR;%ZOxoWN4_y$y{!u zI9Ghx6a*k-JQzfQJp~hoQd*s3TJ}u_II`JXRG-Iy1)C7WH2TfZAJFL^5HxA!2XR;q zhmjvYBCXT<>k>G>515?cwQQcHL}>9ng=0T5Shv4*#n#wAZpw6}GcX0Or_Do@|4Hv*!D{@zkW2W)93g=&$2<6 zRm%-GbD5Z!ziks(t@Zd|SnT+>0nCF(M3EOOrpiDg0AL*SM|^R(C?X{44`oQe;; z7B!jU@O9KwT0ZvHSx9+3Njm|z@isoJvOjmW7A5Dk@)BWUA-~zi_qE1EU5~@1h{G z>kbzt4VQh7e0(*XBe=0ufpbWRo`$84W%hs`f_aH7rEjf`iqq;m*r~U;5U6V$ zn_H8Zmcyw`_qF_u90<;A+36RfwjN=-Mf}*;_X!RQ!^C6gyvB=qVEwa9r5R`CYyDGc z@$n(=qt@p;6fBkYB2!+1&lefr#L_S(CW;%gx)VasJ<)znd1>8hGqYT(=Vk`CJbESk zyoGBA=^*dG8nZUl<14SPdB?m19Wc*v=If91YwyCT3)j#v{WN;i!&V7Sbl#U}xnxRb zjbq6N*{UUeGBvt%p{8v2CScxbV06%@#oh7-%Xq{}eK`)Vv<%%mzI<0%NmMhG8%6^^ z3F^~-UpWS$1&_+m6uE4m42L<*$!;Nv$mO%GQf0+w&d=xX@yxN=B7Y1e1c) zA3Vly7^Y-sU+WopfYqQuJ_PmvZ3A1Doi6!uDl&!KZBh>70aT_woO5(Fe|0%|871e&Al|*cEeTBPAiqlQ~-kmrAWjrA_H!@fq)4!%s8R!0%~WijE`eJ(Us4 z#+D*-mX8_DMb{^o z#8xWplIf>)++Ni3)QTSI1QV{E8m@+?cF)W=zc&O^rNMO=;z3_9m1w_ZQ& zt*~BVwLEfd;7=E6{^mHwaGpRpc1+Nm`HT>`1n@i*qK3%D8(0>lIE(C`X%T10LqjY{ z@5N2Z-N@5!9)?HyrX?+-$qn@V7?T2T1OQJ`sf1=$G)%D}0_4!ew9kTk5wU-xaxqn6g#P&PhW(7* zk`y|mWvoIDV3-i$$ONA!lx6&M;5kKR%3>ZzOo*27-m74(r&_d|g{0)B{%H)3Xdotmd>^I9+;Bt)TN{9nKR|9bN<{wtA- zv~s~RHozf2xeHW2pqSZNZHEZI2nAA{>U@b%7oy2PnC8^KR1`ab0Lf{2A(+l|lPFwo zH__RHA-W6ep@aO&W|3!Wvo90JsI6+I=uJvdgx=!CnLS*{FZMJvi(5rmxoM!b z1pJkphTr%~$C%KDhzKdbGZ8xlabQLK20ar&K5m^dv4sHZWji*0Ih@Q^|R73|F zBh^O+CFmXl;Tw8Zp}Pu!%&(gx$=ip&Ml$)o9s;3=LL;n)8Ndw|54_27`(zmr{CtEq zT&(?DPocZAH=ofA5bK#MM3juX!6kUzXEWwP@pL-LESH-;$ViRkA*RR}dU$M%o|YFz z8_ThwB5#wj0I;4$=LnXa!Q2GxT8M5F*w9&RmpYegG)vK}#)t=~1LxEG{0Iurx|{+< zOux7Vg8$SBLg(iOx1cO^o%qs>apA%ji{S<%Q6RN0@jZ&UTJZACD=`*2GLGLipY-l; zyGft+oZ0q0I7_{%aK*qk8% z_UqepWyf4gx`iY4s^L}e;m*3}SNhKz(&un86mUMVC8iu($DhBPMbLJ@Tf{uJO@G@k zQ)n4$&6e>-tHMr%-K%X$<*555PaY;KiS$xHfT8@!gI#RCs({)ylJ0__Fk+rp#H~C$ zjhh2El%hf^WTg_Sz)Uv`AOe8$5$P!1yG-IuPh^Qkv^EH+MIxRydh`&0K@~{QWRBN& zO1EuHClYC7Evc+%Z0R3af3lB1JYiCa>K=29dt+8GQlU=C4XZD?hGO7M1eD=_qedzdomG3v;ZtJEBxw!%?F+1mXu|R9SPG=l{663S#yann|41~yNv}D~XwRTLXf-i8OCu$)<{$(O?}Bx#9bQ=1BlW1Bc4gs^W? z!Yj|U3Aj$PH&Z01&cK(0;K3IKMJv9G@~o{X=2+1FQa7Y#vbBN#qND=2nYBvBymX6D zMZz{?sAVl-OG;PDsPVNzv&~pP@6^0sU1_7^u0B|7jjr4er}cZ&=e0*NqnzM%S;+sY z@3v`k)H3Op3uA4D({W;@@Es=Q)7?fH4HCt@t|(M6vQz&fj3L6RXJG{syx+tAvK1gcesbAltaX z$A0E=*V`=;!o(`2&glGJf8Y*zDPLE;&T<6O+9ZzzI5X;##EJ!vhhA6Ox>WTyGR%cL z!37tH`v^OuI$*mB58~*N!FOXXImDC<2>#taq=f-geXTZOmZUljDBD8iJS7OS8G};y+l@BWs5Ne`8q|LDh;k{!bPw)7hQdzp+#m z0B5`YhovLBZW8scac(vY3pX5(c@b$88?6@?Az6Fa_ShzSpQ9KA)3!>@tJMfls6L0x zk&_50L4iS*=%JsbcjB+d?skYaj*!%47f6No_4N`d)0)LOjFU?7y^BRjug*OkZVB4Y zF)-8WsH5*e!2HqGR@>gYU)ip{JXLVqaXE{gZnTZ)SM$`1KbDxGKha&CQd(nHFRMVu zx)4PL0$CYq4eTC_kBUe@ z<$$lRVnQe(#U=}Ec>xe4EHIm{ZFoDe;d@+{M5BGn3K=T@QXY`=AQ^oG($;N%oLeCx zl-;12@Dw(>V7U%?pJdu`%I2JauP|A|qPrI%o>>vtc&T=+&L*daF{uO*3lQlSnbS4< z)@l2C-V!vGi02o!4p@>u_nz?Qj@%vC?##3Le~6oG!<`%YH~~lx48j7$i^P4RkwLV> z3Pp1^I&c$_7Dw$`t5PbYG)RLrP?@6Mrf~0eqpK$Hz2b_i;X|s5omp)eAUgSV8IhKv z&2HJs14xWg#T|v=L=3{Gz&4ci6LAr@H76B8d1Drh%hkY-Iz%bXI#c#W}Nz$d3KxNB6WM}ortc6%uIs4 z^u3Lup)iaaNA4>eXY4?ClT=lnlP<%pS5xImfa)umRT@8xUod~;PfEWNiORfcZ-m0x z5jo;olAYYVh+M<&%187clFqm-$W8bFP6E9*_DLlgjyw5y&%(8+SCo88dnmDJeHwI4 zY$X(Xl4;$|#As!6$~I=JLA#mW?gJYYD>ZdnCtpQN6D7!|$}j2~s!GyQ#>Y3Os&6|X zQW8l&a_7p%Dxe8KSSZY-QvS7Yg-Vs`|DM4S&!8*m1(R&?Z)xg?%O64N6Md_2@Jseu_m4!G2ZI|BKBdL?PCPerI4<+UEYaC4rVdth;f}In%83Kk>)_hKeIi*xG3m`Up;lFy zEb@ya>^g-p?vCEL8snqDVuCptE6Q=m2SI*?jFPj0YYt_|lKf2Uxb6l4M zi|YKBB&`&ZVW>su>2Gq|sq2-(sPL_AvBSI~+W|h;&%vQA!j3|mk{dO1=;Kc>qcrLr zO1Ix`($^$qaB{gxv?7Q}{Crg>1F=#x2~R`KAWVOcl?1K+%7p^^`m9bEhl`)0RoTk) z2bm^Vs&``0jna_1&OstBy+jTXtj`L#61aeGSO4ZGLGJpgjS-r9yronpA3@7R>J6Yx zb-ARkba7Y2H(@zP<3R#zoKJVSpnVVjDb97a@;H&wUCG|=n&?rSLP7F--6bp58*7)O z0J>NhKV+5f8h;&EQ?r))^@jWpt)_AM)oxZ~2QH~+&c=6M$0)%dO8Jl7ZNTztjUrSX z{FUcNU!mA9M--v@)a%Y`*qK<_nL|tGBXR92(wd1kp$2NIk9tD3umY_RVB$#I0+X!a zl6`SRC20F)1fvwGFfQLB02{v) zT##kcIWz%h?9J%=fv!t}-Xb6hjF|xS&lW8uf-@sx8KhFtCB1q~jr_^>noCw0t&3#r z7M%dp(oGLXAo!5}dARefceli9+mbs%5UugHC!NQg+_;%z+Wp69OTn8ZFW&NEge%q< zSbDg;EnjM+1G2iHENZK%z4}LH)blhXsdg=97cU1+7K|ROb+7(;uBKY>TxzcIP^D?) z*pEpUa>HREqqg2~DHSjGAqxe4Srt2}=}GihW!#RpqFDi3gBmd0m5{{i&3?%Q^LnHx z_M-E%3U&2y*U1->Pd!#yBnS!=GDr}#2_cLBTK@bi>A#QqimWO2=>#Cf>c;Cd>~RFe zvL|N-K}^KDW7|MWB1kD?mc1<-qUmIjq&VfGW3;6Pz>;suRhrCt4y4XJaZmEMm>udX zq;HDs52-(S^W+`r4fj=d2_`k!bE9&-7XX@@B_I5nKU*+5{w`4Nj5Vg5UmB_1$U*%% zCHih!&q=idr-z>nKNUg`(V|~>W_&v-WIid+WT?t4Y7BW;Rl$u;$hfILL`ucmWyn%a zUt(G0X=V~7P8qA~Gj~G3&Y)_Jc|0)gZfj6H)}#S7oHZLq-i^OOco+vj^{uATl0X~> zUBv}ar-c67^8XbFk!96mihJa&rU??}7y@JM{TzQ`XhgK%k!gTbifdLTYzNzx1T!fj z$5Bi5^I_T-n zxDq0)zeLppe6{~3P$U)j`X2)Gxq)C#5dSHVAFbK_(@a;o>Y&r)J<*TqrqVo|QXn%d zpoWuq;=NAfe^&oj8kQ)RtDLX{6x|rZqZyOG5qEH~secFXbr?&pNu#=BXTWo`YD+Yh zAd&1Zp1ch6)!}I6&2wDlh1nvRF-#;+M`aLxYvsMsyN;?o|87CW zzXVz)A3nzqQ~%w9YN=B5YXA3EC0CmNYC(y3YqVGj#Ql=k{l8m4Ia$}i3;z8GW|nd0 z-z`wdK#%%{+33kP-I4ZJ3sw^45BF8(5S0R0e}KJ~od5N>!z5KBRg1JTBlvdPR0Ojf zd6xP6n^1t)m0j|hUE=#a(t&#*^v$bj6>vLam{Sd23Mm#b{8rJAobR<)^Qf+@BF~J7 zaf++^;E*AXNzhh=?84~674x-^Ed}@1LR5}uQakP!KK9y6Yb|Xv$)}{Y$8Vzn@o=I` zWGf1@davXYT1j zZ$gb@r#VF`eo)mx#nWL@Mf|Q`dCmEH1%do}27&#$2l?@J34$?0)xX0(W3C)1w6)u3 z58qDoYqgR&1(JP&Pn`uXBg@9r;Z+qjW`xSgQpWlfsHNK}^J+HgsjzyEp^j-}!ynTf zp<-_+YF=MlsHFC~Kc}J-#+Rt^LU*iUOkx^DW>t?_8ia*630J3Kz1c&biANy?HEe}& zeT{HFj(umrQZrwPW^P?(r&~e4B7S;gqr_KN2MfJoG^J-OJ#N7-I`g~wD|PcX&BfN- zs=?JgBeAgw#c2_*;_B)vnb?||N>mrad;C*V+|wregU@p&KdhXB1Oj*)z|xwXzLwU* z&9RCq?e4Clg%u6@q2Q!Ob%OOxRqiW~)o14rXQWFrfhLisBEo@8unIVX)p|*5N4x_% znv^2&RPAC3lF~qKmg}O^RgI1&8;1Yg0`rYUBGcF|i8M53-fgeeEZvgaujsy_XJzv7 z0mecuvs;~PdA3LEU{S?H<)LYZN-6!{w ze3KpaDw zw9FV0XdD?ReZ64zdgGaP`I+#%SOMt`1)+`JC|g$Y4Vn{cNBWwnRDQ0u6ES=6TpkWP zW<~GSV5eY~j+?&CC^aZ0dm&&_zW81s@enRf-_Z8=?Ps=zqJ2_i_l&iYzN!TgS1Fpu zZ{K3@JmMqIqdqi3zMyPQp}PB8W@NUE^QWg`hux~$Inex2=GF%3&lKEhzD!&;dfDA{ zi5Xu2+{YBJ7#Nq#s)i!Tb&k!UPii?8D}FfqhoEat4JR`SQ6}tjIXPnWaa}W8nfAH1 zA0j-Pg~peLLr7)t2|r@G-X#yD4~|8WNa;Y?f4HGW%i}1b74#B1CDvJUZcYIha_C@` zIu1%j3TxMlVF(j`Qq7T*{+_urnW>bNA#b2g#!844&C>d=Z|B2kP$2MKy*~EHkb;)i zK=fd0zn%zSn_H=@nRuGR0XPbci&HEMqZp6c@`p8va&547=XRXVMWa{x*=?A2SFm*l zPCSUN*Q4B!Q1E^-qP#{ndG&$Qv;)_6m*$pIcaNWL*7O+o=&n6xlN|q|!nFnw&)UV} zx7~82{g`7Fe4+nTR~>~8NLm&-idUz#qXlyF^;X!A_W-Gdp6bi9&i1W5EoR^y3JbdO zvTov8D=>3AL}+2Q4AqiJUQA81tDg;3cBm}--e*;6u$IbzF!D}vb`_V+)9CF)Z)gYW zQ(VIfiks*C^cNeR*24azZ+wSHme8#-Pm%WHPT>x!J%6ePU5%N*^6<(Due>_Pcg@W1 z$dDo+%l5~eg`63dhNuEI*dCePblprQ?KB=pM)&JG^Dp0u7W_a495dE29z%dDu2mJR zVhneW&rw79=7?^69GKJ6F*!-bk-70X`2eH9N*)insKW>;-H?PzG%Cj@+mp41vPJOf z)W}BAQh3!~jPS6*q}Z`AO~OUwy@lv?S@sGYpi5avlP}T+w#=Xr&K&r$*Er8flIYpP~z1Fx8LZb;xuypx{0nb3jFKzrs4E#xiIOz zxm#ABWy{A<0iAykZYE~troB9hDWZ&$fApzB^4urutNB6WGKHHrP~f!1_3PbH@u4IW zH^h}AMkBmYmPxdDhpG3@d@c8(x)S0;sg-I8{>{hpV~fgf>!bE9`BNLyu(>eFsD0h* z_3L<&%S)zZMUvwK<2-D#J@J-Q$|SQLR1%R}jb1UWInKtbp>=BIIzWni`S*(f!{xWK zOYh@QwG%fq10of_Dv-P!3`5gzQhY36MtvseVBdmDvI6_HmNN6~Zf`&AOllRBfmtGV z6r3oP&H|vKz!atv|C^-5k?KiM2pxq0Ypq9P=X*T3n*;i>cGLmUhb(AmTYgrj7ohmK zRqTv3qcpNUMbxXDXC(3c+_%BQ%w_&iPM&o0VI>JKYVD;xNXGJx}n8qr1ULt0OB zHyiH{ov+GurH}$o7BR;`_yAw?*67rhRJ#$5((voBmoT@072D$VMq%0CX0OUCMabVf#$|+^Hu#*#M>--=3l6Lb0gE8jV>}X`=@)E z0~^fR{ov*L6*kPft-}5*moMActzn94;Hns>0)%%ZtLR4X6r1L*JdWX*aCkJE=rGIG zi*J5uX=h%vj)8eH>*N_EoH-aGAoMa7X(Eu(*{Q6i8i-VT!LWuaSxj7>2w`!AzM^BL z$n@2#QrZqLRe3W~e3WK!xoQ@M(uYWXk~4}TzL^AUcj6x0_Cc9F?Jo8cRfUq9x1N&; zD#4*&(i22lhCP*=s~c2ekzf}?{bzLLNPO}lp=cQuA1#PbRSesJ`OOZpt z>dgd!0fTd+y#}>bqw>Y4o_@`F^F*KzZNU-Zk+Uu$NHg(q?qPk{Nhn1pI#t8SPlyl3M;>!_oV$LekQI8eTzf#D?~C z{?pLfd3ha&`JaYay|RGfsDBu4$Lwd0{=+cVvO9uX{_ln;F|3U>6#p>nq0Qwz%BG3= zS>xDH`)Su5k;Jf2*{pr;Qqh4igKWZ!R(qV}S@rGBy})*a#6V|inPL1?X0x`Jv#4T~ z;5{Vx3yyIYM`(Ta!!tZiCc;3;rsNs~QN=aF9SNk>nD8)zN!9^2hw<4E*IQO+O0E%-gZ5r#Pl7Ax_Bq_WCTR+PMQ_xu4T&1Qy(Q^gi!>>x(*fve{gdQgK{M zPG#P)RiEOr8{3WCPx1@*Y=*>aTr25w@naw33ZG(b&unN^Jnypv0ZUj+em(wn>Tv|g z3gH8S2ZHrDb*hV5445b_m**bXrR`1MP1ni_pef_I6*V9BiF%9ZfGU@7kZ4@FXe{Lc z6wv$@b`&*TSQi#m`R!OSk%ov#!bgdbBz=;SO&;7*=3ZZ#C)oJ+;ytZ=hT-&z&t8y~Ov9#!cqq)f~@4dAHRDjv*KXBvsU$BFa~~ z*y_{M_0$Vh{MV}s$?MuBi{7z^40?b@tF#Y$r4ROpQGEI8QlYo=Ol|VG1|E)6kjCv9 zUGvmh#bpHB>u{_@NCcam+{^qnmR(|V#IN2W{@tiuqFIDbavr<$y&vC{Nrs)7(4dsx z**p-vVAt%Dk9wc9EG!S1WcsXHcqici$SxjaQkwkr<1!kxiwzGp{9vCUWLAxZI-ta6 zCIRZ-Hw{_@JjRW^gUG7fDccC12K@5Y-^~3k%`v~=@8YTKYoQ4)!c(z!TR3GXKh`vc zo6lWDSLR#2@);nz4<>m}3*~)ZP%NBaN}8~(cfDM8YwQ7kf}}6;X|Zb|@&;%e1(K`S zmDnhpZZb%#v(J$*D+*rvy#^svNq=1#|1dStWETx1q~VB7S#r+pcN3oij;m`qZRd0r zf^Gp!hxf%NBRfArAL_)k)cM(dcUDdy10Gb_;^fyBuXTk?R^L0lReal9C!Z&ld^(2r ze1~IvWWQ)OJVOhtdUbgf?701Q(p($65#Csn3dgVJEL-#|Tt43NrbkmOXbys(RnG77 z(!&E6qvdRg4RLslD9g^qr_NJFsgL;!Vma5=S39AbX>}35;4z3igSf~ZYA(w=Te_Oo z&Tme{tFdbfc?J-P{Xyx8#c8lu&2ljsVGF7eC`wL}ZP7`XhNz18dsS1+z|ELVcR?>8 z6~Xi70*SK)dA`}iotaKG{s^oEXPpWQvZUi`8)*-OIIdg0Y#ISliR*@-^(Mgp_ z_U2c}k!UQEW#apgZW2{-YzfQhUz?FLHP+V(F;;R7V(wu&NApcu4s`s%iyU~dxY)po z53G*;11%}i6`35G?~fW4E~;1AjNDrnE2G5CQocb<3TG|miF(Z#Nzxj#L0mcOdZU|y zxZfu{RjM$#Y)xiH_<^EOJP~plj`IXvgT;C*=SDI&sHuxS+daRgfL(83(#EAij^;Fr zt2{M#2sts(xvR{v>w#;vhYN2{;Al*D|18ny05%djUpx^;$l@0(25F2FLq(9Y`l8rC ze-Z3-PRfOpFy~dX|6R05Ysq!%&_X2*!jJNdQe05#RfzTb1cfS#ptx->JXx z2K4CK=%|CrZFX^8b+y@$&{YY!>*{=R`+PmS_>*-|_{j=snO#OHe?hFIq)LCA0XRFS zuROEOYwvw@fj4}k{P{sGYTJz`{}4e(L*|w^rQF>x9nrIEHDXrjWc&{9OVh3WS^j4~ zxjL0a9UhKOQYJOy^dvNuz7U=u=v`ugLUrfLJ5Rvlgx;s?qHA815*+Aape7!MU++0fjYz14|$X9G(Me*F=jbW81mjCCkKG41mwX zCGJU6olIL{<*tZt0D`tBN;R+sh7#DgHl{&Ym7k#c-qYc~lQ^HA^*>0rN6LER2qZ-@ z0e2xasG>lDnvdQPuY<*F7QJrS_oR4ClCP5Wd||J8>)Pg@?R0c)`g}dxVIPp9xQtZw zos5s!th=!qwOn)2T_d@y!~~l$H&;x}&#FFGRG~W_Y36bZXFn>seg7PX4H8y+URkr% zR!{A*{W{V=5dO>fxigVZ8(4ak|Fxm2wcGh{qjh4{4ZL!D0$5p0wC(SBglcuH+om=h zq%RnQJ?f(dyv$jvGN%%H0{9;4hNYf5;nPMm&RU;trFj-133>HE%N&TL%<-QPydiRT zzX1~Hm?)|{%!YWLGJRwe%X@4q(X@agk=H*Y@j;ZL3IJeXP0H3Bk8ca2CNwzF^md0_ zZwJl(x0p6PdS#g`6DjyeTxdOMs$&VOpm0a!Uq(PEyCRgTfnd1Lx-*m0Ek*ZHzFWsb z?vcMPm~-y=>DG<#J-eX^lL=`GNWe8Y6U0OGCfPhR?zM>BwQf5Eij#b`tmisf^k;VW zpIw)tYcl+FoUXM2QUWG`s%sS=vlV}DH5R$9!rP0)XH{5oYaZ^H>dzH(rKkdXdb)zC zA(3n+#h0}cK^+v7w$|D%tIh733;UZOhC3n`%#&-GHxqaco1g2+%GIZ}eD7R0vu==H zya}yNCAxM@{y>abwvQZ@sSsVkeV_DWDZRHVt5T(6L@J5iQ~ikK3!%pKDtz|cUTAYK z!6V4%fiby1!bwBD1#<>VU3(Lf2ZaZKu2K{uI7{h!C12SGU5&=!T2X;Gxc`!54vA?X zl}#2Od7USmE+>H^iZRjQ%zfTB1}$aU(P*DxT_6@_N3#K`Gt*S3)>fH6FXbNwBI^!Q zr~-lFxa`VK&9s&{M*C=+3d=qGmCeMp7uCfXTBjZ+DLM|$&CEnY5(TD0#bAolP3yFP z+PM}w@kN?^zNF_nQ~7Q8g2=;tHnKYRa9HNDnWXqboa*mViH5Wh~Iy4n+;dF&yJ0Y>Bp9$)nYh{cQ?L4uuddvw}{0fpBP*cs7|DrcDz zDbz$_qTV>!p|n{VuFCXG2uydx9IAmN)MvWAT|K1>{sxnG^%1(u^wxx$`&!i$q4nfp z5+W0zTtp(Nnj8scA$D1$9vb)Wxy)Am+`0Z`uFKiE@$KVsovj2AI8v&+PB9*}RexzQ zX1(a7|DU;BS97JT#JE4$#OwN>xg4^(XsxN5+-?27|DU;ZH2c9NFR!uAr+=uOUJFnk z%A`>Th;99Y2||}+{Q{He5M7SPkn~wWv&Zl+Oi2Qzc%O?q6kiK=ZFJ+(E#H4I9|Ok` zF$2!Fp_DY-m$@!++--W36vfCU;Qc}}f^n2SQ}UI4x_cYVqjjPBJec-kl#l_UW*aK= zqN{w^;gTkbua9a(AaR?48*GAn6!So~_b91TyRIp=5K@LB>hHPPNnIPn1E2_!Aml+H z%9=r3OxY>Fc7)rsg%FCq8#TRJ%B^-@aB*Fw^Ow6SHozlVCXG@T_uaY(pJ#vDKMzbU zm*guGeEa)VFFs{jM7s~M1*jt$IQcBP=PePi2Oo%^8ZOok=B^{3rAAN(oo$PWYXN-g zpVH`}mko3R9@9kD>j92ho)U|=hK%-HFh07R%TF|MmtP3xKUy8ag zM_KVQzz&|bBk|TD*n2HI=W>bfCc>j7g|(OkPJje!6t)nM5HrVb44@?dpRsUqvqdC^ zMrQ%cl0g9%AV^4O5PXJS=EdE>*o4pn%$enec=M#E_qUxFX;jAEZcQ`Ap;b<#E4F@J z#N!n0N^M@1I`24@@&$vhhrXVlHRQgNA3W%deu+JWyFMfPh}NLi`NxtBCU>bW7JFW- zm-)Orv?vn2#7{+u7DCoF1AFm z+v%c0iy{)`G`MocLBh4)d8R)NU`za{YRUkL2xKv(6Ww-1W?&-j#WoO%a4dr|MkTme zKIVNDA}ID$LWvaIo~y`Uh^KCBd_`|0Nj^CgivOaizJwzGgH@a2y-2v^ zH!LsIc|vbzXiED~cc zq+X|%*ex$kNA8!IE5wETp(Y!mS*o5kc9{(Rok>qLq9J8tsEc*;S4foVgl2(kpMI5f zhizTq^vFn+3kBo^OhpHYrYDR&a_bazK>Q> zR7K2WRW(#gwN%F>xF#6E=98x!isZF+4#*r>j>q>wOmbSt#O|Gslb4Q*T}XfbhehRD z36s#G-veeMKppj?AGtYN48*JTl!mS<;Km61aC`<1d$bMWK_CBlwBlf7urxYJnwq zCnDtrDK4@fW84#%UIdC_9>LO9zb|M7yaotsk11;Jc#c?J^B-`T=%i<(FWlIE=FU}a zHsHn1LIq$|`fJPl_$0h}vhUurGB3&0WUZ*q2y9gk7`lmuPo2@q?TcKfb?n`u1_^OG z;!~)!E4#t`)e``V+KAU!`g(h3_srANSvqS8% zG<HJE=9(|nwXO_l5Y1T-Z?8ga|m5ps9)0q$H zU(789DPhy9(n2grBdJ6K!Ci6=js0!EYBZa``J`V>Hj>f_CbLxfxN4P=`l)1#TlaG_ zb)9HeShx7&Ww=r=){Sn}kUY~iTXQuWwb%!bSC^Ug=3f=xfRKb^?YKyU`#b%RL?J23M-;#~~>~o;#!Z*uvXh}qSxqX4#u41x! zhM*MXPW%C>8uM^$74K>C;4@$&M`^Z7pr(Y1(IInIbyUMNbW7Lkc*yVgSSBd^B4&f$ z0xI=+rFNY<$n{?(+JX<}kjbUXo ztq5#DJ?R@NATBGR(4_B$YXLDg4G2Yt6O_^K?0Y;PMoI!Jhs>O2jf_`WaMnv`Oco zEZuvbeLACURDYPIwApz(Cs{g8T)>!g{!Z5Hsk#b)Pz&k{%9p16K{Xx?YVOv46~zfA ztTs@4=wo@%YqL&s&>ab9*VTG+ehn+1)B(*|aFxR(v}&#)jQ%T%c&>;SP?M6iPK?aC zb+zq7;FBC9Xo~YqLDg-IrOHotV2VBZwW7*4Jnk|EB0u@5BeI3I%COKH(Pq^lsp;Q1 z3s1?J2u|3-+(b&mlXfJ8*?wpJhIiK9Mt%G82=)=sR7%46cZ3lu6p&LX~ zV=K1S^9O~Bt>7jGMHhpsY?;WnBY5MLtaQ*=H!!S<`sHb%Tscg}EjvOiJC=`41vLGQ z*X4I=i2Q>|t)p9au0r#qNQvf!X4AvIUjCx`9VHn7gO3%G^9VQ7m{X*Yl+{(8_S+<) zB9Tn0Qmf1^@`%z@j?JA{3VlH3u@hJyl+cch2qDDgxm+t_c#gi^;h%@293xQ5wL31^ zLyf_TJ9|{hS=$$tiX6%RA1E!v*EB{`p+wf$%2b&MA-XLWBG_6VubU(1(u2uvzAs?@ zKeQLoY6>c4(2Zng`ZO4I0a8`jmjvyg@WvW+6M;#RT>j3YO%qSY>PvhEq|z$;!I$z+ zT;C}Shsi!v>#jO=KB)2wV~Q6B1GLq)W6pE0iBdI)J_bpD8)l5pk$SfY<_754QE@Ke z*fiDqYP%}RAYv@rLp0l$mQ)3~{FBE3&>BbolESo}Sb>!(=2p#X$rj*8ztmUaXu#Iz z_*NyT6P6 zvd-$WzMc2Fg2oRc`POwf-z__q1GZ(&+8dQF^oS-=O=3PKL@HU@yz}q-T_IIzrKdB^ zMS0KK;%e=b3XUg&ay8gu-(Yv{g)O1Y>;jkeGa`Ij_Dhlni^R^N4_#~JuO=S53N6q^ z5w>vKxOrg1#Sn24wxX*KzrD7jy|#bOO?;7ZUs6GF9+t55XjoNyho6UMP2}ObHF{qI zIzjIv9l;)IW*Z0_Uc^+qTfQdD8uEXBe<>(5rtt>QR2Xi-4)Xj9%T8ei!TwMSXdg5= zC7(2CH6SjssI`}m%j~wSx=H$9XG^}9nj~(CMYIdCq)w4uPV|)FrX)3k(vIkkSAuaz zvcw#Z(ryQf-gBz6rkjKXQ7vLv71%vH)%7mDTw>br$E$7Z0kE8f<&__NW7tUmO8 zU#-8tw6Dcldsp=}t$G*8##o+F4ALDds*5VBl+`|}I1=-~DDmr`Fk9+X7^0_A%6m|p ziPb}n5jNECG0El+YApoawQFs8|bw=M*&W44N4H+U3p}4PuEP5PU>Y z#WN~|RLY36Ek0-|)I(OBJA!{D(q0?4V`Cvilti0Bg{K}V3`199aF$?4GhB6tD=M&~ z@e#$_SFg`~aJXmEHAf&U5y|wnbKAjqsAc1ZG;g!Ve_^k?AvKWah$Xs_!%Cz*(%5`oKv(CB#IW0O!vQpKWvKwy^O$#qicpEB3 zR)`eLD5Pw$+tw9mH>GyeiTX5eN%MUhZKIoV+HRwpAu47qOH4^jOV2B)UqJmLrI#v$ zf*}}TQ#scpOlr9Pvb+s7J?VD>HH#@`RE43?3KR<_nk*n4qQuUQ69$Q>2eYN9j6_cp z)7iH3R9Ztjlzbo8J`p8%r9Uu)AYH}^lijE`2rC-xUG3x7nydRJRR;Debdiutx#L4 z_PZLTXh-CQSUZH5$cF2(;+~Mz7IB%ms@C{W-1e2>cqCok+2WB1GH4o45P={ z{KPSe*xY7?yb2Y{Y;f3zQgY}lpjMs3?nB>T(1P+$4QDQ!4i+m!LHq zaQ=yUnqt3FD_g2k>o45Eb2okeK+`lMoO3N}7JAMr+R2-b?)1DG)t?rN>T)zSyT)7* zB=I7XY@v4yDK_;(DujBdF&gj%eg|C$=zc9WJU4=|qES?O1i*5AoZ!^gZ$O6>)+lKG zsRmr>+iyL8_1RD9uI$)h?Av8rb&{P3>Hz_rIE{Gwtm4~PM?GiYqA)@%6-@*%D3Akn z6J-I{(7`b_?TSV0Pllk`rRjtP>F<&CqGb6UQ<8yoNqTmbdYbexWkdU97CQon^{zPR z_3%g)+aO}6v0uY%ph^r7a7b-87O#fvz%oUl@+LXB)82l)S0xkvS-1Vo@Rw`>x-9`v z>^0Rr`fCv1IGb|9{b$t5UWri*tr!#Rt|EmnO@Dboq3CV3iXpdS)P{sWCOgk9%{_ulU9MPsP5K z2a3S1G9e=*UqK|OBn!jRBA`T2b<7$g?p{sQ@2%+i=+u0q*5(G=*p;wrDr0q{b5LbYqC9y-LNF@~*G z0E{?tD_J_A=2i9MW`g}VPA}u-+ubEMoJ3F2SziHuZ4{R4{{>;U(?JXi7dg%Aug3Rl zQs6%HN8iK&)9EiHN&>$E5_pn0juj&`5}TvfDoM=&#fs8k#|~7LB8eGNcq9g@<(NW? zF>4Hqt*Tj;wCcW!FEKWwlG?vh=wig$)c-FE-!BiVEw_KCsN5CL8({x83RG8yfrWpk z(3+3m+4*;hY_gaK>ZE_8uu32kCi2)OA&VhuIakVvJ+%rM=mZ;4eZ5@gIP~)ye?n|` zmrW;?b5xcODZ6m^e<8Yf@mTRhX-#s2W6wz@9)JIo3#@#mI?(jG*oY#gfB~B%hGoTo zh{EgWwM1NaL_VoB0%39pR~Fg~BHa-W+H#&_RGTG+*;ZCBMak6#D@%sSprsb0S#!Hm z?Z&He?xDt6~oTmI2y1^pvrouX3h%pxh%n)PG)!h=mDdzfc2)?Riwpose5rUm9*}kKIY0 zCCavWN~e-2I4jBqC4oSE9_)wtd`oJMugT@YYF~c2=l8FO27)H+)zG3bOPl-SOLGf7 zAo$(|;orh*m#Ex3An4(%@23If5uYOOav{8GA{3pbb{ymMQ)@_~KI0`ewE#?*;4`=6 zy3?`&RC+gpUPqK%%4Xy^gAZi;>|aoNcB$4vNxSsQ%?n-SDn+i@SyWEvbh(Xdpp=2&1T;(&b57CMdN&gwGHBw7}* zWcOBCcHHF4CRc(7$COIu604OjlGP)6=%8q~_=|8`iq46tsS>Aoj%z4_vrJt z@6tV~LS+T>a!WUgPm`bJ!_^UQ@lY7>tC8~{b|J&82>Ibi4hP)t0S2X^97znE_DP58xw09mbo<+|!w=0!K4N;}cnGaWt0U zS%%8kk#l~4(0%LuT^}@AFn%tE6RW3EKdh>1Etf^o396t672I+0+CtNt?#O_>fF?<2 zVA_Xup5Y2a^!(@V6t_0^o~;FHkds5v)qf!TWzA61K^TCr zl9K3Vr+*X6GiHWK5x`i^66Wi3V_VY3$h3sK^Dqt5m{y-L3|z>a?)ZMk_Dq5bC`gvM zlo%7Y$Q~~?g@xbuY#G+ij2I_zcO**rJznwyA^&kMWaP7_(z&kG!tTP4)TCq0N=1&fhiEle8@{J*r{)D4&Mle0*Y` zrh9y{KF4oT6E((Z#iaIVs~$D-VN075vZiVy+t0M7YRDZcsOuNmgIc=M5UItFtgo(k z>PnqLY*WJ5Kt8*_aW*m(*_KKK<1*5QDR>r8(r!pk?9Z=Tg+^U_9W6_-M>W7W`wmh1%BPCDvi+9md`K~lk7Lue0*mI4Y#qg?3G#m_Z;J;QvRW=g7Es+rMS4l+{qPKie z3I8-Y!9v;d!ID};F1#eU*eHFQxx*-Fajda-4f+jr`tJ$gSIIy7X?NxoH8i@L(<|MX0KKQY6=G1?O_#W%Y5 za1l$F@}znNYv|>jYS8EleQ)?LUB{hL;i>`JsPrGOfp#nO3cZ*`q$hHFJn9TMZZw4w zm-9dF7Sa=*Qq~W5IdXCyWwM0rza3aRnCRM~YeEdoL9HU9r*oX0O20>aEoPbQX7Ud7 z;JXy;hI42ewBh(X#Xq-sZVyf=n3;klMEqY(^40Xb>vp?y_V-0ZHgl~X`aBgl%8XvO zw>POoVp*Tu`Rqpd`xC>l{KtHNzq4qK!SD>_iH~KRSMjTwm5w>@^UufVhmKWd1Q{32 zY@J9_GIk>mP^FkNQ5HNRx@ROv3pFXD1l=7B)qV;I)&iTsrxxF2!+Ac!-p49<_JT%0 zR*rRQxIN%%<^SFWzNI@R;R#Bnb zjdQsHNdeM8c^ZbdycefrnDYEZcqQ}62x9_x><|^7; zFs+l(x?gLq=%F~#aJA7utI{M~A-pCUI&C2nGDnR>b~%zTG?=AhPeR+q*UR0-*Uizv zUQam@kNQ(S7{3~ILoa4GTPD{a=y>Eq<7Pi+&R=R*D6XV*gz=Tng{Q#q2ST@b4sQCg zeSzYJ!@>@Sm69jX{z$wi{>fI-HclT$jTAy>Lc!6ro}o8SXh%l`E_aFuG#^~yH-Q$+ z_eofE7Cyc*Q2g?&7lzx14a3U5wx}#99_#Y`x#$lKc%Pe;DhFRKHFZUs6#&pmX|bVb zG^yVTRVBApQ$>RjRAy?Pwbx1}aG7 z3Wm}=o_pUuZNurYGu19yrANCpa13xK9`g*MBUr)cqG9NQCYEXb==k;Oc-v=KV^E~M znUE0!>&#yV7nxEjUcfzKlQ+7#dVT{7NyDHVN{ej}kJ=B1Vt-1OPK(1fBjWT{nW5iJ z2|4grxlTN;Qp=dXUwRYr*|Mvcy5nep?JX3)$P)W#f?_9ARV{>4Y6T7=9|0#zs9Jj# z6hsoCvwl9dk2U;s54A4b>}8~ z3SJc9;y#mjIWjIL&xp8B>){q5PTG%B=M87^{=D1@D!J`ux>&;c;>5O+EoCWf=DK=& z?(g7sn@*##PU{@9;;U>Gwbod8p;c8#zsiPg-U-Oj2jjw*Ewz@O^!@6i)x4z!n#-fG zWk2^eht`$&KDUXv~M7y3zdq#%sd-m=h+*r?C|>0>;;wnRpTNjk_nUXOxB5p4J19E>#czqG(KOnowX}wE3O8z$_=X8RPJ;(osJRal_ zJAK}-5$iV2d9d#e|I}{H1i5_E=GaAHIQ`L&9im(qrC$ryWjyCVAfflk_Jd-RZTXl1 zNF!zdu3mT#iKlipiTPvA4j5hpT$*hRE|qNPm*|-vOz=rX3z&xiChnKvpxRhdzaTpi z7UTSg@aGhDgWxDJTGi~cF@jPwvhHrhk_G#I2me-~n5+=bqi>4jNp z(pklyoD6HIZ9{uLXzN~@v#eYd;P$il-s1ObVR=a_ZiRUhm5)Lbd+E<_;pt8Xjx%QWN1q+x*dy7t@kfIA9iCxkFF=xJ23uz zv0Q6m(k`>46DZbkF?K5h*~KGtn8FFqD3(4bWfY_2@(NM@rsyGUehrw3JFao~q?`wR zN8|PxffgeaPg8MJD053a{a-a^rlmG$qoJI{P65p zphhXR$iMtyiykfVAT*SYOv9>MY+oB4ZnJ9xOD0=m{LRya}Dg-2YFoF%}8r;OBov*t>>sc3=K=eCd2QRlo*PD zqCXgi52l^vwLBe{bO(c!@0twXETiTJ*b|A&52m=E{HP7>1NUJ)3CCi+_AA-}xUhtk zAe;SfqZ93Gh?AK)gAXmx3_dHfB~<_Um{|iJ3UsaQ+SVniKbw~71cN-f5log8h?~q6 zU*a0!qe4N7b2K|)jpsfyOH)Z+sKA^|EM*m1{##Yo^zh1N)w!1Z2c%A7Lehc#R(dWU zuBuAqzUViG#_GNPQ0VFI)%Q+571?siCY9%HdY@+BQJw%TUdpnl&ndVqY57K|p?aRx zbAEjbx?kqOMZcKJ~IG9Fwu#v7b~r`;1J=MN&R*v}DGGatq3ZT!-I< z$M0ocy3Vv|$T;HGp>*QfyM#4Vd$LOG#Tf4Bhne~a(pI-tqSUX*@*@tn`>YRpW-Vy6 z7s1MT(GB6Q+jFTF z-TaSVQe57|{?oR{@3YTO@*ssPzi88HGJ>A)$Ynh4%K6GGVT@Fg!m6Ltn6Uq5HBvmG zGItW)mC@e3=KhJNH!pLsp;Cw%RH#T&vsfyP(IbdCFaP zkeZ2bI2o};#MHlyY&K)>q~c9p6qN23lQ?Fe;dbs*M&+HLXiN2}FwSXfcWT2(8#NQU zJtojNzM7!L3!L8D@w%Wh-2D`tX}?D3Gy^Pj{kgFf`li^Q*;YozYYI0K|A-ObD*2?L67h?rt2mH=B_Ut&SuCb27gGy~6_;HrvBmRzwNAO^ zUDH1D{<+7Nm~a)MT2V;zV(gPHw>yyAIx$^rfoQ&>x22t~+m3wFglB)yWHg4|^;|{y zQ_q?Z4|wqhMF@jJ6$R@Sja01bmDQ9%Z{3;_(g?k$PO>~I@A`ul@)!Cc&>SNxOzueQ zRLPdOSix^_;qb4m@jw^FX_yUliOY7;5n5oaWmV@^IpcXrsX&me0&|fZ9qn0iC}*AJ z%U92N47638&59$45ZY5t=9(vtlI7cWb2S1@KQIXiQc zE-@3wx830YLC2DPinVPVnfeIMpB-^jYZ3AKF>Tz>F_`kqdnfdq6-{cX5$meUYJ~&> zQ>C7TYjf_<@_5E%S}i8bfz8 ztwDobB+uZ2u^x|^ahIVodMBh)?2UeA{}f)1qx^ZGd#7W@yOcH)+!3=%_RO_jwQ#X$yG9nBmex)LPVJW2W|4I(VD@IAObP_3`Z zxxHPSz~HR;xN~x^ceD5?YX@3BTERyXIU_3%M$1ji=MzayH~C3v_iL|BEstYcHj=-z zXez~#N$OWLq-3sR5^~tm?(0hg+bOKEV?3<1dfim_{NY#e(36r;yo<}B6#J1$fO!R=Xn>YQI7?568GWU|b$b0Wo)PPncp za)o2rXtU7Ok2;Sgf{@U1aw9AsS>MsQL4RcCy$DaZ@{rBw>q!6P^+Z`{a#2iMvD#8S z1xwe$m4G2LR&CiAk(MjvRUf&I3gTmc)YQ|HOrh=|czXY!`&SqT0#oLgNui$wC6su^ zgTcE#Au#ATD>fk3uw-#WKHHwcV{()1D=j?TKK`!oP?I(baph?*bCN&$#pl?tmU z;rZ;XN&ea1KF24!k3A-Q5%58I!~DlJu|ah7BFlxq(nT+s^)jE8wBU{I=68?h2gE?-zR7uS@WS_~)q5Dfc*wAt) zK+-HHXb0}!@QiY=G+6aAZW-oE&PqhdT)J>c4yNwU_^Ur_rkDGB8PDPNKP+Ql_8y~( zPX4#$9-{QB$gLot2a$!hWUMd}ou<{!#6))2sB zD%Z9h6Y&n&aHRMORB{-)i%IC0H*Mw8-beXIn#63#oj-q1SC=N`suW0#O~<&C?B*HW z5_u!+sGGC@k;_n% z1~-AJHojE`;_gz2|C>vG!}k(+LrTvFYfFl^_W#Z$Q5{d^UcJwntiJx&?SJR8mlQ6k z&?MB_*oSPLb8shdx2H3)ZQHhO+qUgYl8J5Gww+9D+Y{TyFWJ=Yz3<(v+N!SV|DXDF z^|$++^Bh%lw$DD7H}~YuQM%8UjTPyy^N^s2*O%|YXd*yg$L|$Yx(gqr-vu$VA?`(7 z`gSfhs@3wqs~e6#MqGQXCHiG8lp38@la_r&Fep@9p56*aDF+}+DC47W$_^TM1nTM)9cBf#l94aH7k3 z16JwGGr@Xr6tu1T*hG`}?u9z7{BboZ;w&*|{SJoV^JLIJiDc3(r&?=`Bf8w~4%cq8 zIIPuo>f|nBiTuJH)qC8~hWv!L0XYrTtMMJfn%@c(AP!_%gAkDRy5@6QrHL`Nnn`T1B}e0V+Ox%d zjlG@n#C82 zyXGC5kfmUsSBx(WKyW>Db*62WIu#!TQ>{o@Jim@}Ook`H^XTd(E#%Vap%{>O455iT z=suTY4yN;Me=$caXn%7yi}}9bi~7xjFzt_%N|3wND?XGnvGxlP*(NLA8{U9O00zSugC^Ttjtj_ zx)iq%r`Jc`#j4UkXJRDLj#e?#J?|vzD5t5krGw7OMXoathfO)1a(P+0F4?_c3(aip z05RdE8K6UjZ5L-R^3bZ;TnwqIr;V-QsmOOSH)0kUHE6FKNapfBlwl!ym`BG;89UJ& z7c>;=pg6F#3mq6wC|ibjq$&-i4s!R)Mo1$w0^g9cJCaGlM8HXU00i>vn@+tk3gUc5 zB8Tcm`OUspG6>^vpHdWjCTU%7=q=kb2krT8vxsg0D`a@JcagZr3HrsYOI{zk|3Fnb zmDyOkjaIf;w+(qvnzkox#N-Q{B&z7}_Y%^U`)hadXW&I7x0{HZN9}?}lN__xL5U#* zO;5N%6VBNhlieoc_|`X|AEQ9To+wu4ulHis#q^_g$6Uv5OQIvn`eT}Jrkbyxi<-y% zePT7eDP9#g98am$CbK-+bWp6sRlNI6yb;12YUdP+9PHw!oFnyPjb4cyQiB{=K%yX# z(!9R|Q?O*fuCsYmhUI1W5Gz?loZ>S3ttRZ5E(2UAK`%DfDzRcx7*`s6`}Tk?rwcQ* z><0YleR+})jxNg(F+1s|>&Rha8oCUkhc@=KQcImD);|Jm!C;|73@R^ksb@XMr4K}8 z6A?=iGQD(p-$7z^YLa|6&(cowmYA+9Rm4`=k#^edka}NA1Vi0enlwod5cw|pA@TV$ z9XpC;c!{%Y*q+Kv`+!;=-TF&45p|X<0|Ece+WH>C$LIpv;F|mFR;Emtm2gUIcMg-J z9%KdjiqDS}P~ZS#ZB~$}aULz_s{_zjnQ&(`|FaMpX=JjI^xO%#&YL8jl6QrU{8C}M za;EIP`%y$R5g!RB6MPudB>to{9GJd8Z~@OaQPgCW#6>PCKTo)apoxUJl8=o4aNSqH zD{Mk>2YbsuqfLnhwe0Z2kI2?^=Iy!;LX7rubeADh)$)G#g^XX!28~LCo9H48DXqZR zTe(JLpj61#^3Ww(;+tWCDT)=yai-uWnd6qlsH>4#cY`0V-aazU8tNv4bAxx>>F=!i zn9U3>8K{HR_j|25Ypbgp|DZ|na}`Cn%hrM}Ob!M$Pf^OaXSn%ajr73?W7!CKG)9OIc#Et*lZN6yI*HOgIhwVh=JdT=<``2CG zBzd32`{u~Tgigi)-Rei*PS=t|sX_Q!ts#wlR;KjlsniGaJ41{~ju%DW;;t&B3rdJR(OAb{&x`a>`L-?VAI3|xfJ zaY4i~<)jEG8BkDG5vY&12#4j{D|?`763O7v^e`XWK{=BAugXBE( zIJ*eD&sCu~kz5VoN_abIQ9W;>2tmojKzuk~EDKBwC6r{csyB6|xk6xW&0yxebKN|M zLOYv_m{=Z%1?1*{mOXf2VLki?|sFb_=G^cB0?jyGMz&nf=oA zul%4FeeGy=e+4%SjYR)Oy1u2~1WJD&EjZQr8#G4}@#pHjVy!0c2e*P@=!e^u--%TH zo2*kh7TAK`x2(kfI^VY={bSCUK$bqy7Xdk74-E0N6O|(+Jffi@3oHHAY8`qW)eC#< zmp+ZUfe*k|^%Y7ATG8J|Y#hOA=wo#B;0vzWtRGr+-kT-CrryG)Kr?AZ^o^>;7N|W? z%z7vgA0Gpx%unDRXcMQL2fAHNN{2lS=@xo!n$k>gz zb++<1A6jOtFa@&968Y}VyhC;`Au$A>;tIQSd&B#jLiFsl!ZmJKZdV%dY_7z4~ck|nZ72NdxB@^?uNpdT{ zg;en%El=z8tMy!yJm4|%A-(jcJ5D8SGg!K0Gu;OHy@Q_1B;s#o4W`satcMv>YHP~1 zrpqAAQ|bwlUu0(o@T&XH9Va9t3o>5Oy%kFdr zSWg71Iiq~gZB0&S_Kkzxfd9XEjHYx+0EGNZE@2DB3Ito(G<6$4NV`FV{V?Y-{BWw( zb*M+`qR(iAy;-im!vox=EwWsmsFw+yPVsI^Tk;vTGB8Bdm5HY|P=NkEC>Il_ zx_O<%3st*+46%;tisw)19ET62S9SdfrL-Jrzy3YM1T6A+`O(K|7Xo&qHjP&V<3GG1 zqz0cuSTslbqFVXIOw1U)VVl0dT^X#3Ro#X39l`{}7B*8q{iAuSTZVLOWleb%=8}Nq zK_GS$Yz(3{sfXVO4dyZ(m(Gm&X*_D7G>weGnDyYXOvO5q_e**OR>Q?INWI~(%6@Y# z@>ea_;S%aR+$`-r9!#vk;Zl>z{^J? z?Z_*=`kU+y&swL6{d+&dWE)W#uM3VjPM>~@8BM@h1-?#gDUp3K1R%%0KqvMzUS<}Nn{A6DXt1_zMmV#8=Q$}t z5p@JhA;&gjMK|Tmb0MmnJ|d&iZOke_MmCLK(Xwd~yUPkciPj>1CofiaRqxbb>;A;9 z*BZB&JErLa;mM;*KK`#AG}#`?nMw{fS%s=Or-M6JsY0=3L0l<4A&Ov@GiBzyX@D`# zyjtO#%Wk^5Y}fUbTxqx%Hwi2BzA@Xu8Podc(&O$vp7yde$j<&F=eB*|0JJlvb6M)tDD8OrjO?}sCPCl}1hhV2N#r0A+ZZehxeBBz;R_DaHsBdX zPw}!_+c51#a&D9G@Y>VzuZSdU|M4KxRr#Lp84{NL(WPd!nnqPPAysYmiBi+ zd;eBUyW(Fu3M#6yB^=go6(&hnv=lg@qVPx972;q=3yV1{M{ZtC%;rw->!iNR*&xDa zLQ1A__l|MNgUQq@1%a@G#QhZy2`;4#aN0Nmi>ne~)Q$4EjRwWbHQ|~N5HBxR!(uuL za$cQ;q;(cmr93&f2c=}{65-N#>S|~}od}p=X0nxXrBn(z*N5Lf5UN%KCh%lz2kw_s z2D1el+@jH}{a{+x)i?{tD(s^0PKeRR9KEc1IMEMGZwQ=bU^%dm=EllKELFm(PvRE9 ztj{=gmM=Zx3i8Kx{3?`5Burlj@;{nRZD#z2nQX{)bSpzgebzJx+M10$SG6-98*M3TEe^^SO7r&BokzQ%+T~nH zG)Lyt_hMmI(Z$hjbqq2cG7p6cQx^OlF0G}N?K`EBQycB0#-?LlNCt?~k*A-(Y{dTU z2?~S4f4bM_lZl@p9I!#esKEVIB$sKOHh!Y!K}oFqaCT!l!@+>;#NFO5DAO^b5^`Ty z3JsVKVrpcj$aAnjct$U4t*~S|cG_ppwZ|&d=wF%{jxzVPm&{HN=UjpFx4}X1`%Txj z`7f*(qPB@BkDP-jeOpMSu8u5=hJsuS-54AyaZoR~k)<~p;9t&NMribhZ2HGi@c&#N z4mUaLYuoGPFTXjJo`%P(BPme>Dt4b<4YRhn3ZaA?$ygDh@+i>e^Gq>Z_~a{qD84cz zK}r{y>S9)DilzJW!6U)usQ=;}m#^l#sPz32O|Xv}5kdMiSIac{2(~pD8VzTNVW`WU z_5XOwSIsmU3+u*sQ#{IMMElBxyDbIH`-IhdRODcphK%&sEJf0QxGq){8@Z(j>P~vU z^X$742(Xe%|09q=92%rH!T?2P9hLm|`XMP{;q`Ljy?<{SFe-p~W*v?EEBOKs^iduY zq2`Q3F!^c&b%H`uTrSaP3NyL$4ksRpDUUYnW2;yS_heUGmG|jnf$?_VX6|viB~M)N zw-gIZaD(h_`gdjmyjRbJv53ph3Fc8RY3J$T7zZ6bl(3Q>J_(kFqMacp9H+e3yhZc) zIBioR1;RM%B~!i3boS2DEEjcf*r~K4mbK%isFt#r(_Xv({6g(F) zF?5$y0hhWEnELdXW;>@L3{eQLv?Q_&zVEaL+BzeYD7eZ+Lu_aL^(AB8_d?Qq9Lc_$ z&JA@mlpzvDf@r|7-5-e$Z!HLFSgZ}~WX{CMar8eLv}}=%N7g=6kwz}gf)AMJ{ZiO5 zw}dxtR>cDui* z^9ZmeUML9Ma0T|+@j}D)I;I~OiTM|uw4XdFVA?*NrCKc9c`v)NsAuXT_Q&Zv$1bZf8Ehl&C zw=OY1U~N?bLse}2Q-z?xV!|RySUqX3FtbSOLDjPSHsg9<*$5Td5EL@-uDt;_e z>M?zy8Y>(fA%2?Crd%;kObAB5b&Xbe5sGG-geDG`8ART#vfvG)VA5x+DpXNKJfiGt z10;O=1;5Zor*wxgr{xkHi=T9{^hKLN%sKcNInzx&3XY;n(Yo@1+aujBc-&Gxxb|#G zg!e2jUEii?l(1(7JD!b7_Y$%VEcpFJ>>+gjXJW z02sF!R=a%Lga>X=sxdr!nm;YLBH*(E_M`T&~=hZvSnL|K9( z1?}ywS1usPk!}MH6L6CSd9;$HVPIbqp}wAkx&6WGQphpJ-jYA%OMu4{L!y!33L;Gj zlmKPy1lt4)3luZ__&LKT!|nepU^$S~u5V*)R$G{cA-2 zhDI{uug*O3-!Xsyh(R|=ZQ-F{K4rs#DYbHiSQ}H5JFW-sutngIz!aRVyMXUnhc1F> z#b_QEfIXaodA`j*C!v@$QyJ!%bE+{Yd=tDF5sAR5cY!Tozxa2L?(!B;d80AfwR}cX zG2J!seVtL2elfs9rVY~a5-l~eBdL*~@e4t@l%7WYIbZRT4>AUU{7mmgYP;&oEg|gk zns$iN<6+hQm`HB}h+^jSm@>4Lh_V;CDJb)G>2g#2!^T>*Yjf9aKHYT50ZtkR@gr`G z%AY74?r)pZNrKGV8T@LCKhkL4UA-_0kg<`RA0DHInORZ+$)S&uPnJP?Yj$@00wk^@Q7+Q$xPQ z&?BJ$ySGpF3wYsEVB>#$kUhK?3e~UNixrc|j%%cu_!kf+C)#+Mg~~kYPnp1QY>ExA z8c9vv)Xwh0gN>xQQWLMed8|64@xKe(vhcD`J?!r-h&+(vlCswNXPf1(=m$5uM;|aF z?vR$;jru^Jyw+-5E@u|{W?%RTn#wVvA59MV3m;PR0%8>dvUiy2lKXu_t2*TN+2U5o zV_k9v?CR?94eadCeKmILoRogo?OTi0ijLX;UjBN~r(;?Vl!gcaxIS9y(w=%|V6ItB z+Z>5ErR_NB0RC3?zbphZpPUCew3s8j}<4vj_oL?ZT;Op zP?>G}BPO|K{Bm{gM3Ovm_HRTkN@8{Eee%Db3T=chc~Ngb;X8_kS#e5cG&ReT^CVkY z@4Yk4`LXti2gXrJa_D}K)CFfF46A)t4)gZ)SDfzZBB!ki@n{XLb+P{LF!wt9RWXjm z4pqiE9yF=Xl0)+(VZ&r5kE}1B-{_%SGQ&IDYRH$O*7j0qrzo0~GZ`P50=kq=pu-Ru z)WXyFy2IO*HHw{l1z!`xR6bKn7qszNX-$~?PP_kg6`?RR#cS8NaZp#F{azMfa^{^f zUiOykJCO1oByWal5QpX(D2F;$oLk$x0x3H=D2P1IW&@%OdQj-qMdNdJ_6$ zW|OO!NO;jwHRp#ABID1{4tGQSa+yeg+5&cj`FjPAy0qw)+_E!wQy-HXv!!n`cSM9r z<${a4Nzn|$?xm|{vzMBodGB;XU^^B7j?!jQwn>>8e!ZylK<_(<$icuixxg*P$^YjV z%_=u29%&3arO>Mab8-R*_2vc>*60Z_EUH@GX?r-I_&VgZcrYKSO?IS%=gyclwt}I4 zi;yShy}?0D-URNBqPWcqj+i6*FY~t7P^pz3^E0ui8se90eL}Akv$ms8*^aeey2(PA z0`MoYC?S!bZ-<+qX1|~3sE|aQwFJOLZ2aHAe4ulL=_Q;7T*h-3Cv1H=5K5~jpzb>r zdzLC6C6Rl^Tx4|4(3IY!u^G{}bX&ah&X1gvzIrcTS4w<7X`yR*drjyfJQ&(iZUbC- zAflP$6yXhx(1r;T7c(P@@R@Q+4S&;v6g{#CN!hL9l8hX>s*=xwEv1R8v5kGvoK^wN zfNpe!RRTfecDdX?^Ue#=kN*?m43jM#Z}I!DxxCoedZ$jz<*r*>-l?dY_D;Np)x&gi zM|*K^CwJo5P_x#L(Wb1nVb4(R7)D{`-|wyQ)5r4PIc>vlTqsN@5CkSFt#rF#UD#pe z5>(i;Tm61vtF1jnJyAoNrn%_`2Y{$gaQfkd4AGke6k6~E?QU#AZloFCHCBo=qMqot zV+K-I1!WA_mI2Xw$(z(x(Zo$WI;nyRl~`-o+i_s;3`hrio3AEI+sYc68bmNQ#Q-Q@ zV%;7_{Yni`j!aqAnNy#_HM)&Pq`5?8i!UM8?pz~jc+`PEwk3X&yI;u@UXQSwFM**Q zqSYXhGyr3p!Oan%L$R&P{fLQFI&d`b;fS1s66D(`gmNR6dl#xZmn*UfKaU z>d2_Lv71_stc<7zF^}Vp+-yh(8yT}}t3uDG#qRi8Hi=(s3J6Ibq-K4Ky8718IEQVy zjlvh@Ju!oJYzYxE>osgFdCW@lgaGx(N_khMr@V6Ktvsf0(~Ibn+A+cen za1HPWTo5FLtD`~A_1+^uYT=tOC4CM3ER}|B zP0K%X4fl6ym=kTxV7KJTJSrkj3W1uz@!2m{6=$9km#?lgJF4oU zL}cr_mgxfKt2&lPj*wC9uI;JGLicSRlZVJCqp6FLPWDyDp8jv5p1LddtZ!6K79|ZB;L>2(a?9^t29F27FP9r?B8cw9;K; zF0C^*EVT|iH#&^_CRvQy5{>eP%6Y*&oU(#2Y(Up=-RO5Y@Rdf9Q^PRhH)*r6^xUmM z5g}DrIYSc;h&o*4_eu8y#LQTbr!Po?vvW*|!B0YQ7$e@*dNyTcUh5Et~QzG0j`Qc?L~Y zGpWIt3#Dt z={x5>&+i*ZFxXnblj!oX7qBjHhSXytKJ&Zl!)3vN-=|o`opf%axp@CUAn#%33{4^m z_fnd&XDn?tMdCL42~_o^zN@W>7FJqU--}n3_rAlT@S`@*ISyP%sqJnzFY2+taVRO+ zT(vGvF)lbiT(PdJF5!aLM=ILW z7p$^nZnL>o%`=@gPt>Whi>VyrOIB(nCkhYfZmT*Pnobh8c>g!UO43+mqh>8WdthN` zX>fD;FUw`Gp#ck2)9MmZkJOW`-*8*c_+X>E`2FSFk!~O=@2Fc|>1)FOdhR-cZ%*s6 zrRO_Ng&&$GPw?o4ZGTGtsv_JbzCmjfObL0(80ZP(f`V_mkYy}Kr-B6J_vzUqQAFWy z!blI}Lg!anVyRCbT7Z_Nyhd_lH8qnI4((w@1K$v+y8Mt(6n%xt_v_M}>rAWm2=CAq z_f4zPgw!mDvhmW)>++&ho!Y9a*3jVay=giu+0Bf9z>S*ip^7?G>uuE#0YJiy8 zFzZ`m(n1tX-6q0~3}wX&$|Uc2&sr*d{r_aJ;TwiXlJXBFB$ zw@RbIG_$o^s#Ly;n$JIz1J&zBsq7rDkl{5m-C>}lL|up#U67L&dL-FYOjYzqh9d}u zIs6X@H0jvfK#ZN^Q<3IAYke+|E96WTM&Dca?w#cfJK!(*S+cGi`X>=jrWIH}LSSBP zm9PAKpoS4}sgAa?7O!JHJc`{y;t(14+It{&7RCuVi`pi!5hK@$CwpAqNtUT<2Xu2m zJ)T4TpF`@&UWm5c^`5kc(xgwiUuw$_G~hSz5>FJqw0@CO%SnxWZ5*_1B#2!x**bdN z_P~8DVW%rq38wc5YxH8LmD6q(fRuh0`%xsCym#YpjA-w3Ic3?J8OHbaO1ou#`U9oK zG;8nIrk2F>ny>jeRr8C!O#1qO(W4YSl?t;Ioq<_#dygG}Ds}p;Nhp}j?#?tC7Ky*; zYvMB%AOI1`dF&djZG2LgmvG0ehSBdBzmC7&#zC86D5Y1eOt??JqCX~dt$JCK%{qz= zMUt~4nPs9iAGyk=v2DB!Cl%gs7xj-V$K9FKWWh0a8zhPNA7ycA%&i-x4NofgWr6^5 ze}swzu<`(84mCWz?1s@2y{qqLjr;QN!Sl<=J~C2~S3%cWYsX+`m-6Kz1JZK(VEQv4 zmO9O90uEh6=tx-xCr9&I3gQIz-w&%cWrjQM5&)G$uX?YbM&pls>ffuQwt`rd?#eu) zb#J3pjIAX5i1gydhLkgLB%jiqd8)VkT5ZUyT}lSw@}ruy<_&l`Vrv4&JW%tyh}Suq zaT0sfjX_A56PI)`SeA8%9VuRMBA3kbS+Ed=%s^)m=>(&;px3kWcpqRl)>obo960(* zuQRb0KSGsMl<8;f=c)|!acj1cmud}{ys%p`(8!|2D9fv++%kT}m!Nr&7KnQ;OI6n! z_*gm6D(J-|LyE0Qda3~{#&qO^ej=d)rUTZJc$Y2yfY#ev;YlJbHYHrGIGrQ)|Y(q28?t`)U!^2qU=N9E< zBI(fu6|JzpbE$=1R<2e+4zatS-ih77Xi0vtU$2^zncDZrXzUpj3@Xk`XN1ogRfc3Z zFZuQN#j2r!#)KW`GwSL)-o5($_GIgM<7>>bktEmj#~wnc{sD}pk9*$U+gK&=ZV z{$cm(6}>mu;<=wz>qM_5Zlq|h^UmbDfrMwptM%k_1TR=9xFW|x)t}DfS7~<3-TP<8 zsQ&A)wV8XAQ9H76C(=6Zn^kKI(@{;23=Aasy|q27UqUDg@~TBr21vyza_(TLs=`)i zs_G&?N;q|)FKWGh7Np}^Z07{uR)&=xB71B^+)WWuXv!=;2Ush53v7`KI^KTAA#~W5 zV1|DwpV~1bOO7B27MK+-n;NhB?kXxar+4K7F4Qh3!3Il_W zl|pkjbPdh=v?|YOndV5>G_OE~ugjIG_v@@+r4`$x& zc^`ae{BpN}X}CC1(Uj#Hc%m4(6N4Oj*>CSgX2hkd+F&fyso&LzJ<=@SlDVH=TKucL zbn?k2q&GA~HN0?&)e=@3{Q9|KJE|JJ#4cdxMNH`twFVz!XBn&=G@n6UkkfaF6@dyY z`lJu5xLhBkBSl{b{H3ombTM*$JztKt(>w^Sw>hU;vFj>^WC!GZskHO>N!?f3G|J>F z%z|7vUZbv4%UP+84CKw+6o-Vx$!2#Y1a%776w)S&Bc!SIq0}r)!9>Jr#^|8c^kpf! z$F`g!R2vZ^i>Q{e!xf}~t{36}w5mgO87EBvLm zDi+Uq_Y0n?8ib$D*udfz)zAE)0g+LoOTR>hk>Im=hE~uX;ZLTvU|cpyWL-7?9`PV}{#a zYxko|{hBUwH>7qRg0I@vJsWp*#xC(s_t? z@yZ+HBrc;k%nS~UR&*PYJ=e9^$mMCFg{70KwcaWQqc%AE>Rlb5N#sN5ajw@zFSZ{A zMw%yW{g#g6wlf)9?O`NHKoOt88|1w4mE1=-=-%2B#c_SSl?o8L>^H-PLeB|kwIj6e zcEd%?Nr@Yap5Ql@RJcd!gwL(MMYnt5%r0_9`^}WS5b>mm@nwAXK;#FsWm#m3sGZ_< zbN#reXR$eF#4nO4x~xkhaZ_CHM4HhbJ&Id->beSL)>D>5mz4d2?A#Z0K&DBpJRR!R zNmsNrx&VvIw{fK~YTmO# zmeb1pcac|R&$VU8IL8#Ds2Ga7&Uwl^V$KuS1@lr$i`$!F2P0^z=NCF@%0?uHF?9ON zBH@#NR|fQ6_$I&l4Jg>HYTJ{xub6Un1ex2xKA|-3ugxO%xx^OwJ-{of6I+W{A~(tw z`wE9wkT5B3s)hztQiz2H4<9GD!q(=%C|OQWxG2JL``i|_MJ2gxKs3?mGy&9Js8AK^ zt&!VcZX}6-(&v9MvRKNNO~P-q^Ysa?k;?Q0gFmMW^OD4gspb!!^MUqC`=e;}WOoTEJ<)^qC#{?FtHcxq$hcLUeIy4?ywg>*R{GHP zg)Ba)@m5b&e%Jv!v@QIW7(KVIx^TXre;;h)x0U{QemyxeDy&e|tJ>smGxaHEf?d_r z_&{@8{Jlu0K5wUVgsSgf^7MtfQDt2}2Q5>+FXS6H!K-Xy6k_0I;5&%!dwfcAIsG)z zEvtC<>Y*diT_g4?zBZ*l`IXg22O}0yvGgPN0KCkifS^Cdse%IS-TVUD>)wJ16CEB= ztx&Q~#_o`=M1+~Ck*{0~!IkX%1H)D)!{iDr@D9&fjNM#S>TF#q%S>zXnJ05Rjmjbd zVQ6jKDuoPGz#U;L=UlLz@%&WY$>Ek0%#5(GDZrj7N&qUBG?@J z8^RQ=L^o}!qP8xFqnuiw1N(r}X()VxiX+iY&qOM)9;z ztO#1=UY)9++T!Cc)*zqNqRL#W_04#Oz5QOZ>waQ|G<8bX0qNbAaIBl}}AYfZ0htoJ4f+!D?FzC%lmLPn>kUD!8~3ceTR@Xl|^M93jcR$$TrEb zJcqS)fFZX_BmHB_E!qqD;KnPcpd0`Q?%9tGf z7q3bo>iI;dAVG39N;c^jWfBc3G~@n^0x&#DMWc}vFA`w%^HpV8iPt-#xnkIJ>dInl z>L9H2h64in3=WkkSiC(TX;i32#;be&l z*n~sG;94Q_r~~}12>~!Bm_^!|u09xq4~=HX65+b;To*n zpn7x8NImuXVI}&%S+%UAs1IRFoy$ZvZY=|BK9A@SRLPDALTjbS7)XZPt)jbyEO}It zLA8Ta3&~Kxe}$a+^AV|csWs+sg6b1N+K?dlFC=I8EstnIx>$}IkHhlw@e#vTtmS=) zO#;b<0|_obJEHxC#LIOBwj#_yI@v^^L5I`X`gSW5dK=SuzmIL*p$MC!8o;IaGsy$5un0LAJByq* ze1$!H%s4dZp%5JE*H7{eJYnGD^IQ#HgvlDrR&lgfxh#Kn&uAqj32*zyWv!fBYh>h> zxTcBR)tb4`%~#8DgZS3oYaVmK&nu0n;SPXpm_>4RLZrGM3KX)(c5oogBzHq`-BpUp zJS;Qwma<$q{|x*~E;*MCzt~#wk5NyIjmZnqGL8Q7fFQ z30Te(93|8g_nS#IHk@fgs){cYp6N2-PZ-E$HQJQDarPOI&z=^>k<5T1%aUGO3TI?I zz==FMi)4rGq!ub-Eb>9h=OEzhP=1v^1{;%N}=}k@h9@J_B;i%va{jEmO zaG^4wF;S=`IidQEPVVwq`oI^X^ZU#r#4-qz9<@4MFG-sYhHc!w=1m@SbaPevgV+us zE1T8J{#)6)Z$xiV0In=)tI}1vTra~PV|cW4qH#gN&Z$pMPfE+{<7UNR;Z^!0HzU#X zQ;lN$d3*=oS1eQEE0p!>MPbp6gFXv?dA0Q2&PZrqVwy-z%j1m9sd7Shl1Vt~$Ac7= zyp$E~?v#gmW@w%x288%U0Ax60vP2jO$}^>+LOeK7*c6%do)+tGitRWHR2*aiRKZUn zBQch!7w%#nIy;rnT6S6bvwfSNv&r$M-x5^uf$?=J&W)m(;7jssF2yg&C>O_*o1x_a&=>@ITQZ3AwYBaD;JOpMTVz_FC9o_O-4P-*lTozllLTCV6 zy6)I(iqMC$e5|RtbSL}arDrAsnJY1JU$KKnTU(=&Bl9zSC$#it5^1;m0s;P{^uIV$ z41(0Q2!^5;VH$>}N$0QxU$x}Y9AVAxIJpD^v>B@$isOOt6*7ok~$Tm+*~Dsxp`qN^NNHnT0s>trzkJQG2!Us#*M-f z?jAHEXGHI&(1&rxdhjF|EP=%5l5E`Zsbp6>%xpY`hmv4<(fzo`tLtZVc4+yL9apsE zRthQ4oZ{U<6D_FEgvJvW|*fP3x+c$rHP#y$=}1M@K4j*nd$>`oAcK zrY^P2A7_ju`GUaa*#NRv9aSEdcnB|)#0Of|kEXMM_s z-?^EN2yT@L7OdVCk66f19GW6HS+M_Rp|~nLElpNr#m6-**a1O|fdl$`{3{UQt>8M` zeK9W?vlDpng*BcUE3J;r|IE&bo#eR*hWM zty$GoEj1hr-7LAJblk2ag$)ivO~(WO1l(HqWOrg?&5`C1CDhi!Sq+9!uY-QoXa zG4CgfUkqa0L77}ja(66?!N?5Dl#4qxk?geqEx(ebu~jFYytreckJP&9%>m8P=Om0w zi*seYh_u*Fi?3l*9ZpK2&oU||aX(%0~gf(NhCj3^YjQ0>bq zr%itxwjz>HIZNaz5lmply)Cd#qcDEzBVApy&vF`L=)-8da@-I0nD7z@5cm2qOf6p^ zml|wm8kP|p0@yAxf=>BV=AS(|Q?)oA1Z}UF8w6q}9F|&$&kBP(AE3w=q5XZ3nD7y5 z`|oHYsr&i7raNZF$|5mN0Hi&GkRXIDeTysVD3x^V^?mJRTSG6zD;gx{!1;z4IVAj( zhK|y`#Twlz3l|-mO|FH@c=ls<=b8ndr|R!1)UDS=P`%UIVDE{ueKVSpR6XGC3q_D(v<23@}I zMUQ|TbNL~$5Wb?P{w)ztFz&=MZ5|*i(0*xx&%uvjG&r?^)fXmqFoJ}lo95#}n92&X zj(z>3Nd}P;dNaa8T^Drw&3xt6`wM2)$FtO+Fe;oYZ&RX-X z|AvxO)iYYO)!tbC1r%JSZSDRRkCfEIB7>crO>8CKcT#+ZGqI4L^~K6krc07+wEu2N zmn~98N5v58MRjd;>4`I5tnSpRoArBQ22^$CP1yGZnMSs9F(|b;Q8UOngciz(@qZ}0 zGUW-V>i9kN?V_sKzwuo3>3%LQIJmxdDA#QF%E4cKDE%}k3{UXQG<{leubmf+;x@IE zX71x8T`zoNVGNPT^&MHbPw!5mwzR zF{cAB|InGe$EF)=?gbquqLte}S-j^+Xn>NT^{2VvvhL8COD@V&Q)Yx@MqlwGVz4dS z(M)$YBhOGf{0qe|PBPo1eaeHX<1QEDtj=)y*m@2G$qAgZ@mV(ZO>-oV5xUTN7j5Im#BMsx!4g2 z*@vLk8=uKmZ`zP2yd#`$mgY4ru#0q zdH=XYSr&SfV5BT2Cu7SW9pY}5?`3ii$WX2=`H!n3gpeDJ`IivB^3e&~QB1g>8zn#= z<1}pONreA439`l+PE@Il0mD&Jj;h>wWUD9CM4*D{mS`nLzc~_aTC&Inx~eJJYlBFu zL(+kLt~UX`viTm}WmBxep}&Xiz!UDu<(D5U;! z@nV^H{g)ZRQag82^1@5%B6ZcGV`5((`R)%HMEU+ppA5)A6j4{skv8008@>D~ptI)z zJLkdSrPi-T6-REe=FE870ynua3;zA-ue?>~dmk=9WiIc?@O;*iFbOUeXA@Rl1-wIH z%5Z$NEJ?vkBpgLHkIS6F0<_hJ#qDJF_ru7NQ)L3R&5NWuynhZJ<@0EXYL_Pc6s0Hq z$&QKnbr%0!@q>pj`CAzQ;i}7xK^E^m|Dv-a9f2!@Ub_rWyA1g`LDZU!7fZHTB-pv1 zK-&$r!nl7MjjIz$qlV~ijeTTIQs);nKEi^FrF#n1HNU#n04 zRF=s>Lmx70ZK3%Ns}rlPY@E7WM`cK!eI^2W+^YQ>w7u7OaH3SmM}S%MV^ZIsvIv)l zl8hZVYel48r*`(nk1!AZ^M(fzKCPmC-jdMtH%H{j(AGInF2wZ1g3abc7#L&j5!NdI zOZI`MhxGkL$%m7wZ_T0LYP`IU^_@9a_OGd{VV%0ZPe#-nsoL zyrTjJ>r-uGr5zGWD6my~FO<)aP7EKiY%kT<9OJx}(rG-KIYvq3dQb4W0B@HpV z%pPtJ&TjnwWmB!%wcR!w%5Q(UL(34cwXCJ$&G=DOV0wvl!%NV{E||*hfP^@kx|WJ0 zRpcSW#`4YJ8wqzwO*Cyex_?OkUyihC!=D)_$HwUr*+h~Z=dD^AP8(Y%>s0qMD}#0tlNHD*eIH&(j0OWB)Pra z-CWXG9MQ|Mp=&C_qTU`AQ9seo7PfCohMsVmPhpg8B%w&Z;2Iz6GAIh-`P;P!O&HmK zx2GSGB2V)+a}<)|dKa;8H>zl38-fy(diyiw#IKgVYQ4(=fr6P%RY2Mu8E zz;TX!va@dej?EmEnqe8LaJqce)BQG`?$X2E2p`a{=49hg_&#!sMYK$-Aa*Am&O0SI3kYV`~WGPDMjZab?ZMiw4)B*SLS zK!KJy`Djs_^uGTv@?28I4&mdaygy3X2!~Q2VKZz8lBl$%*AfDW^sHgB2dy#v6SRl~ zP(h_VVe{9dE<2n|Q~)Rb9b@x&cp_UcFvCcog|(Ihi% z@nKi5N{Cvqd8&!&JFJKeIPFWx`|l&{R3r38TPyW4X1t zH&M7ZFO8_qUxLKu+u*q9;jiBnZZ{@L zxsDx)h6`rNcGVf}Nh`&s_~)zdKNk5Gt;Oh*_dpio_?zPJ`u$`Pc$qgFe4=agra;Pb zQpje7e+~i$20#XPySpQdh(*piL5A6;c?~L43%>L8-({y!ME?fht2NBM%dRs ztK09*@wBvu&dvGd%hJu0>3z)lyVvpe^27blyc|`xwLcO=_}$YV)LflZ^AY=qYE8B9 zvRW=nr`lmvQVc=!4v?MMda5Ht{MYaP25SQ|$(r7VAF#XW>1*cZW-v`ee;Nh_SPC;c zU#_zUAd8l;*36{urMSOPZ0bValYyDY{}2J$0hnk`O@V7|IFY=xRExkvRj3EnSI`mZzGkUI*A=)Zr-Zec`TnvQ6Ymy z?7|QnPkpeI-jWjxbE*tzs5dd$k|oEC;FYV8Cm`mCZZ5Gm|IZrrj^QU}$CfDv83_3wri_X(af8gOdQ^KUp*Wq-QjM@lvl?y8 z!A3gAQ#=c86p;m9(mBXnp4kDql!JJL_DD$*i#!QLjVLyttX|Z=9AtC#kKw4bO8kUU z0mdgSOeUs^1dwoONlDkBu3}R0)HrQ#l+s|Vz&$H)_B$6amBCx~W@taNh7fsyr$1bT zEsi@A+2ST`GPF127wLpZ-nC4vC5J#`XtZ$6L?i7*vQ+S_YJ)hj5u_-@EHnOm6=@OW z&=UbWvB-DVH4I)W;M9b2Gn?<3Y)|u;Y@9rhaI}zZ7PGP;tC3<4f|gX}ldEiZmP-L) zv$r7yksnu3e9}y%&(an{{~lN4A8GjFtuSueIago@M!7!4Ikf;u*s^1i zwOq9gw?!5dds|4aaE6!B6tq=$o}w+$Yt|#HzPN;>J5_9-=jOK?m(|L3_yA@25O**J zcU?fM`yVLl3B{_e^0r<>6!Ow|y&s97ME){rw({!$DrTw&d)i>(NG%(+1U|Yxy=x)% z!fV7oKLNju3dzv`t3ATln&2Ks1#my{RaDt2ot{vlv1;+9b^crls+m=XxYk8P?5CEQ z$GF$qBm4+GB7mRhB;EKtfF{NFC< z&*z1&ho4S#5vKmBb*hhlA-82j$1&NGe#0(Fv-QP+;l-vL-`^i*2Z}6Lq5OLK`m!*F zS?8HgBh}h-n~G7@V2=S_K)G;RE}UrAVb3A?Oe!OsG8e?l$wF`(Vc%&wRZ3f1XNs(Fx$6-rS8gvRQNd8AB7Cy^KRK)zjyZd zy)n;ti2t7gYG^tivmyEI>k~GYsf<7zN_c7yMob-d-jB>B7v%y0J~UV=5mI`yApL#0 z0fR_dqS(7xPn$*pV8`#SKOewm!(iD%MVNRV!(cI~BnT&R8#X{3wlu57o$ zl}t1V)U0o=^;1YU;`UTEsaR1>c{rCpcM-{szt27PqMu4QcZ?w}=0jT3V?(Umh1`k; zSuMTnIGvbzO6FaMFK)p@Mn^5B3l60ljUI4MxZtfrI=f3%aoDL#Vy*HSa!L4_%Kyi5 zDQK%dnIxG<58&CHero%qhG}MvnT|UYDSTnA;>NKyYS>kQ&cT&xeFfcIlhg#KMEifp z?V<~++B4x)v}&0fPxIE1Q^+Boh}QLji`Kt4@mH0>{^m8@EsSLi>YVQeMi)M_1Ff0% zG~4+p-n{qu9(08@us(8CZ`oFHbPQ}+q@EMWoGR6HhQ*7UrLc`wk(g)iYmsRxwWLT= ztH=7_^A6b2XJ}0m*9}aZckIM=wojzQE$dR<#}uE4up%Eh_Dwc1(V-dNdC=U9fTxXY z>*FPc6|%hhyn%2=$g0mhstVzKIPr7#A7)A>oNJF0=;EN;_r$^Rt6Yhb@Rh$pdG6S>Wb%JXK5tpCC(FWl938Wjr zcI<9U5zJ9g$z>dDa~P4x&=4?hp;;85-oD3#yAwvq>N{Nk$!jM2n!yXG@PfK_R9e*_ zo~(G@`kxQQ2&8GPeo6xf_CNPvdpdwC*0zedzpkXxF1zyHw_L8G%LqqyTmdDnb02Xm z1-6@^A+&}}oKL);OZOf{ZBnm#eD7&V$@ARF4(Mg%d${Y;E4ga2PZvWC;SH5q-q%uS4KLU zR(-ZoP&q2rvJZT~eh9xv5QKMVX(ux%q5ek%jZY+$0&pe2aM?j(tVKj&d-hOYb~lua zx`eWa0hLJd5^c*LF#jDftLwP$1PCfy7-UTfapVNNDH&&qN^i&}HjHmXI9siCf>bZ@l*uXOk0p0d`bD%M3Z9x6cwSxW0cOh(f3ImTltOxTmjOx z7vNvSt!M;yb^o4c-hce4k$atQW`fRbZ^+)gzwIHx(PMnY6R4nohS_dlvm92S!M72P zI{~S5(d1Wm*z#t-D7^jvI?Ga`D}j4f60b|Bdf3XKsVBBF-~?I)RjF zVY|VQ^1lEtK+wO#$3wX*r#6yJD`lo7poNrylH0t|ptP8`?J2CX#MKA|RWs(=!C9Th zOilRD_Oiq@`=F;`yM(r4MNOU(%LH=ckR{e}V#le|3^5EWyX24^^_~EHqdtfU@{cf+ zI=Fkm5ydWoWf$FTF91}1HvqtAm>w8;BhkSvnLQ2<9YLP%L04YqOfh!84ELQL_q zro^`AuMCM{+uF`J!k)n9!?cpnll1`T(rnwS7<@=9WG>s%5aK)6<(un|A0YGD!3g4i zFboqM0sA$k{?k#SF>$~ks&i#G45;tg&ifh$J(FN0VBXG-vP)2S>)|y_gJ$}82G@fb zTppDmxZWk<@wkmI=;#N-#&7?(cFgsQiyu0W`NxA{@oE^gs*q+fAI#b4J-Fp%rt!t| z?OO%Mts}_}EaJO*_yZY=Q(@l^pvBkL$}NTOsq`Kyh6+-}EhSVBg&X!)hILV;C?NMl zSQXg@hd3F8h1wo?P!U&bPhY^)0eOsByu%aM?4){)bn~h_seNl)x$r*#SSS)5lqV4M zIHk>> z2|;|>{=l(eJ^7cikh-c)=5-w3U$GCEwq13noQ}X_42%{s61eZXM|X001A02mk;800092 zeURI3!Y~Ym@Ania;-ZyCdJpO(G>~?&Y13X{N@G(DIiMt^Lsj2>>0tvlv75xQ|KI*> z(g*88Lw;$%S%P-stY&f>Uz}%|LvJf5(PulKNyjzcdA6XzH2qIp1ya}YH&Nn~Frd&4 zMxNDJC~-pfK_;LxLV2$3&gxk#RMeYmGGJ>CR#qBK-~wQMjKMScfCgQ{RQC!5O1K-MH_BdzgaayS#@7c{)Y@Q&IBOwt8ylAmLYz6Omb6vBM`+g#Lw zuG*bjtRi_?k}21NIJO*y%Pq=%VL$U}!dx$%L8oO=FqU{9AmrnqbK&pSQjy%pRk2Iw z56vZvzX{W;c@Qr0eosr=G+q3HnkiABVkz&EM_h*BsHozB*p>j$u(a)5cVA5Cd$d0S z001A02mk;800092-B!_Vn=ll8-&aH^458+^@SoHbt_K4Sg2mhiF~}D6 zC5o2>`-5jOSYjGrx)#o}Fh=m2f%JSvh3rkx8txGd2=EEyo2K9cegW?K1PPJk+j#6t z#?7aEqm{@fEFAsE%`!QdO5hX`{bPlE@Zu=T;;ccAX%I2BaL0IwT_U9!u?Kp?*+!_l z!eoLi^E_6XHcIhOW-3HbRZJmd z628GQUayr(V~Ump0@F%T(YOfuTkUC1r9&IVc4HdA3eyZFuQcN9_06TQ>75a0TZ7JU zg9Mn(r)?J}GRl+mJ0|$WQ530z+%YWx8NFqcf-f#lXhIeC6NFHunnSx%@#1?E&SHW%3WXPe@AO-SOhH8Iw4fF`n_F${(7^Vp zmfCB_md1qGvjTc6>okkz)L6#pv+XA|KC8r|VQ)y`31BU0ixY?M6A%#Q|`#puz>u+7~ zh(g%5dAsqR?tpZSDxN4%t|x6~xdTIv^rF+x>wkpJ1V`|d1`|bW`_QtS`s2zP71Kut zpQ!K_5wb-7Z!N}=2K=9zkLN|U;$GK9hc|Y~MSQo&<>6JSebgy&x_-y!faLBZ3X;k~ zQ1+_$INEg|P^T+tP+_HJ0sQNcmG$)t{K)E}>IM$#?;C|8&f&Hbqo9?I+@yb$y`0!DQYdHMV@J9LS0NsOUhtnArrXn&c{t?tSmox6Wm)6q6Iy2Pp)kMX#}KmyY! z-tP>1s6O?5H;fTGw|{XRT3W2D&mGmO6Kj526{OlI=yh;~cit86tC-itUwcY@`U7p` z-pj)e0017FW*Gti003WQ8DhX4^Ei-<@I*zVAFP%Q;4y%XTlXk|mYkN^Bqz9n)ZrE< zQHN;~)u8yS-~7igm{nlxUZ^Q08=Uxlxz<;&(|;$Hi8D7XNB(tRQ(I1pY zg~FWDS8K!(@jSCJ{xFnx4W?qSRnTEULB}pf_h_@0+Wo&rAco5u zq>&{J6RN^}=S!Vl6l?%l{sPk+-5Uce2Zy!u-hp*h-wxgYSP=IB(IiK;nEH*=^>H#j^GgIdfix3ce&7DC*}VPNT^08L6RaRS zUfF^`6Op;W8Fb60ZxM?LmH;Q}ZHMXq|K8NHyC(qx0dYcz(n6zwdJ>&>1&DJjO}F!^ zy=w0?&#trXU_3Kx8PysWjD$phZ&k+dfGy#xj4n*p|dta6Q|5boMfGq8x7kls& z-?6XiWpm||?~xqGMWRR$Wiasl1^n0ywUs?} z>i_rZ(Z}j5!QPfKW%S50JU-RX zMDW5m$`L2(q$tD7-ND7}TsrRNUkoJ1cNf)#i^J3_t{>oROio+;ncZYe!BAK+Ine;2+# zPm4CJdzrxXeeqL(j&BlN`o`4FlRLB2wA5>eXYi%`R@>^S(EshQvC}yg1;3FC7tr$G z*yI~Mc4N|OBeK0=IVzPHFMPfhA|UNSaQi;$@bnZi-{KKVG{^}q-GgB5!0Y2hFb^-R z0nT2xBcRYBw`4hMjFY#wsmNs`Fy7X(br~FawcSbe5)#tw$(|P|O5XAD5O!nAKc|{< z+VvfLVV?*HXWCe1TSU=v_hM5WwK<2(%@x8i@D*WV^vuU?;7dKVe!kEtP~595n|m>y6eOO^>}iavXj+OVOjzp5wkWq8JmK%;;kVi##N>^)ckUO1}9_QDAKsTi*c^s zpquiR10Xrg&7(XVyRz=B5HkDu5fzsEhw^RSeld~PA>Jw*tHX1X`xs7!<2>pzbeo+8 z)Pqx`$y2Kx@l4=TP%5Vd9Z{TGA%&N|kWnUB`t$4t%Q1`4_&5$C4x+O{WY14)!;usH zshcRB0VbUSx6T84%$LgE=5N*TtA$=rH(eRfni)EC6kpSF>B#`W;KOMjBL1!xm)Jg3oUz)I4U+PpN|=iD?l8bas5h6YX^PtKM% zTt&jE{Nl}IT(Xe|jXrw0BAvvW**YZJ&B;%5&{Bjt=$?Y?cMou zYCUKIDh?gmXq~V~WqOKN4!mKIm5|*Y3&&~q4+K;BSAvd zB@~748ypSdFGfMqQiEM3B_@M*ea(M$JmXjbv}p8iw1N0M4+pc#sTwX~%1h_yN_tfF zhme#z-`0+ZK&(Qbjm@O`^iKL78{%7(g|W$5@VwftjQFVMM^JWM(Jn%+(5)ipJ__dv zmZdV-6j=TcP%-!;P+a_3y5_h_aIuXV5%sxjfr|cAjC}J6Ji?V#qjcrWHn>Q&q7CPj zWfJ{QFLh)Ak4-aX&_h>uz5T!!B`2;Cg;64}9$va?W0?@TTYPyVBB@M%5aQ+2Ys|RW z&)S4|UCU{;>BwfEZ^@g~#v_t*C*d}{<>@GRH5DQBmKBQ(82HUkeDi^|u>&vI6aIQf0jgMAvn`rJmYwJ{g4y>EGu&nkv6G- z5~K#?<9LVnwcgPN)cb*I4sL@B; z((s>>1ANAjf_pD}k1G;^P*@4`(>z zJB^I_8FhOjLtUvjPCETZW%^PPi#9j!kfKj* zO(8bz>-2QaKp`FXv3cFu4bDx;=5?i$NwmWH=JFBD7pIh`63ko+zhDZPdBOO*aPDCH zMVvt(z!)qWZr3y{!!FHKI<3F&0%@lm3d4Wi1*iI~0f!FoB95|6`CX(PT8LO{&g~XQ zH9z1xTB9A|IX0j4`u~@1y?%jL1Ksmor%TBg?^{9Gsfpuw4duLAnK@buQzlEN!ZMMm z9^+f|k=mkpZc^U)$Zk5b;(GftjUGWAV5#ykvs9q{q+?}(XJhH?N7o4Za)f3-4trt) zVaK!1W+93fgC`_#4+15zpCt*r4R&$PLj&YMbz&9l67L->gj!1w>;2iz!i_AuEjR=! z@;Ue;X19l)KE^3X^TrZ44h_RcQD=8Os!<974i4i%i)AC%wO~fF5REc{F)CV?Fxe!% zNXqIlE>t;#G?;A`P9{rjvrxggF51Ws5%5tCL_o-I{Zk9uy(5X-QTg4!6ocEsJO4O5~ytL;Q2+N;R?c;K@~WlgC=~0O@fB zZX$59_8^jk{9|Zb#o`f3J*Th+!VJX|X=Xm9GU-*aFylUt{iSNEsuu$5QH%GMjxCKt zQ!@bg)_6RTtd-MHa$#v;Z$+x;h}%M76j_5Fr&9S-TX;4C69~d~nj7#dT=;}_`fEZF z^J(bHgr4Pj%&;}`=-v%NHx>Wxcp)y5i>w4OnshrZFyPg_vG=W|QO@$I^)X+BpGQ%? zK&^Vnv5xx5Li60nBf!PlBsy?w#pAB^?H|vT*Gg=7Tf_fkdGfm{RqArY>{QO3LAQH^ z<{LHcnLDsCHF_My=}&lWB6xd(EErrJ1@!D}NNDQ0tT*-UufgdXqoC|623-OYxqeeB z)tx>6p!9f9a~{;-In^7XuuQXdx5az*jB*XPc2*5%p-8}m_EsYqoM&j4LFP+;#YaP9 zg%saEBuWVA{8&eG=(8z!(TL|rR6WNq!nRE#8{gQ`Wru-nCKN9u6DRsIOPf;YLrl_6 zU&Iy7ehhv9(hNa#R5RCg3P@m;D~=7nmqt z`T0S>t}`KcUe4qdCz4y6r0;5}{Z;NS5v>ULOFtzmyI?m~A@|+=_HgGMICN-kIg*G*v5Yq+6j45BM%c9K=5pnc2oF+QH zI!I8rZXa%X;Qp>ayk-%(7VN*{Xx(Rsw(Vim({WCin}Vr z8W9v68&?iS{Em<>rV1x+=nS953eAdlc-3s46!0s`c!S4az(Gs>FkX!$eJcKHe~v^* zKn7XvrGzdD=IPa%-i6~puINE3>;~d%;H;}<+PjrX^bSf{ek;@;LD9xN39~pBDI|%mDtZL;c#(6p4e`RF+eT{>KfeBa zSP)IaoDlsonpC ziNsAXvFNEeT6_;i7RW$P`M4$Ncn7GdRpd6 zJDuhfa@jY@6-DO_<>}nrDTKpR{bJBxjvT*EScCEFQjrUj~G*jeW9PuAmjU z@mN^l{=%TTvl89Db(H@>#sQWRk-1MDeF|6qdtLD42K1B&2edBhqFsK~lXhYT2u^wQ zdw^m+&mexEDrw$s`FC5Mp8psu#l`;y76!w93txw`KE1V!*`EXZ^2LR>2hAk zhHGD8hkd0IxDD_VM#!5=G*L_fS7b_qK#DXwbBTnq`ose5 zCZsQ1;kGzXjD%CMpOHVs@=h9`Qr>dOuHAr{MKcndBM>g*r8VW_j2~sX46v2y(z8&M~?fy;R}J;oHg-I_Ja?YPe86$G|Cu#Au< z5(?G;*Qw`wtl$n3IQqt(b84xQSv%>xGnv%TZ4GX%T>;Lph!L5 z8@^j<$~>53T+>Q#${UszUV}x%KcfK8jLMy@2uqE`x8nSpc~i7b{!5v9E4oXG0W*lE z^;S?Uw{KOnyHaMW&%mi&%7{Ml2G(pNcUJWc$rBx z*K%nbM%&;juF#$psA-mmlR--g*1OUNEW^GIAQ5=)DRbAuHVmx|$3J?Ls`8=kle^m{2=}Q}9*$YJ`ZIj(Yz*Jss zVp7hY&vc(cyoM%dGV|FMJ+F%gcs*gGrbdF%AzzD$M1dUeDC!{9=htJJg^q~%1=0N| z&UUyBXqI)iD-^kJmZDkMt%R}hAPBL~+c$IRVY$LNPR zmywHCj%P*XuH{|_EO97anTO6}a@~ImqQpTVg@!)32AhBy#xB#A>EndW+sAH}@fplT z2dzr`lB4WzR1MUy%?xD$$4i7hcI&hQ$2S=Ehf%1(897T`(h-xd( zaRf&?LP`lj#U{dL`LTxfC&6bc|(T|-u^@iizu8kF1*^TOM9eD`n7o) z)Pi^Jlh+qkunc(+P>gY)*{sxIdE_JA%R0^b8N@Z|YNQ zQMD~&Y|=PHykKdLT4k3KMyo|Dn$@!*x%~nyL9!g=piPkRA*%m%Br{(2&K8HQg73B* z=WTDacMl?nPPS_34CkmH4gy#3--lK7J&|TFMCvaW=LPPp^w|JI#k2Z-;+ixD=Qfjt#~aeb6NS*$Q~ zi*wmw=kKJMu1I^(fLi!8CP)|kNwsroFIG?7BOwrXt#fYn=!mrza`)~os4l`m9 z8yMyQ4_46-`9q^VO4w^iDrb7gowA{m$s9&ZjUI>G4NwKoi`9_)0(XoeFqftP;;?h^ zn3nU6?I>T0HO?PL?#mqSnSY)>&7iW0MBzbFneR4??xWoh!;f@`VBVu%#4uAPR{|)D zLt}L~W7w)S_!*XS?|X3-FNM{g{c5b*D!x55*GMRc#%s_TrvQ0X+I=cPYz#cQ0_gh% zb!a#K;tspTH>xU~DU(d^+TBima>^Lo8$wa9SEudT$2iNM;XYn2Q`9MoxY(Wxn9lVdWOHk+$4RG{1h^9cRv{f}`Hr>TQNg2lIdo<&|^z_Z! zgDqxiFet80YUnppbX_RAo$>ye5c2vsd8#oE!A&gYZZJ2}h}0@*1sAc;7dn4}7~R-9qYRHzfo)9R@%1=WxiyAgoC z76=mk{rAiW4Rswf3>Yd+`F>6hm$f&)AbZ%*o2#m7+V& z18oJotm+-Wl1*$FBX=EPw8=@n(w5ZixGm|>kI9-Nn-;Ou$)W1Bq_3bsi$)h?XvYv2 zZMi-@k8TOJ1z|b#h|tXvI7d73xDf?C9jG6@bhBCewaAeWDUQOjqLd8*U1OQPZSQDd za@MV18j4DWNr_mKpP~`~S9z%{s%CE5e{y^2 zIMhBk{CbV9qcl*?#Vo)+v0aoSrL}}J=WawHpS&uM?9OSJ=IebhU`s=Xh@zq3`>N4v zlaT?6xr90QLvBb&3~Vvdde}({)pa~HpzaWqiOHdPqL^(Vu@lGcFVp+UEH|oBUoP4zIp<#P^Q}N9iui?uJ3Ao+YC}dQ0e>HZ^R_ zc5Llw-Sld&Ph<`2nY;UrFFw78VwGBA>D%WcBK-Y^_4gr?g$=v0;TmRGk~@>2A#bU( zu+#bz`{_~MGn=B>7frWJGa$Drc?Pmmmj*5g=cbI-eyqA63wC(q(YP~L(~Z7rzQbeb zriLP@(MCYOw`)9aXomYYb0G>gTDyjynG6n(VOW-Uo(W8N#TVuNOyiUoyUcRc zMxqzu6unF*o?I7!td^ui-YJXM%(Z!6I9`|n1;(LsH(E^f13J01-5mOc*q~4z22S>4 z&YU}$0y&zlwwSiMt^;H(IE3R(?k{A6 z^yhBCZd2lK*u&r#G+Y!jnzlg{)QPmd2(iw&xD?+%`5{E1xMIRxn4)s9q22BCKoBD( zW&WW2yQTw{QOwOQPmnsR1Ch}Lw>gWNfmrUSu6P71#&R}smGW|N37)*wWsq-Pwcee_AUHMrcM9?4<}#ws zVgH;OpCj=(=ARJ+EJK6XC@Pvtr>0}KbEjb+jsU-T4GbZeOvoT{&IOc)Wy{J~CZ#m;B=J;)8bYX)jk^ zCjWk4NBO&*l6OD6iTWwyz<@r<^`YBMh|+)tai@w?>AJSSvi!RNcSj-Q=cH#V(4IPs zTM!14NU~sE`>l?Mo*pKjjP%ErG)A$p(_?U2aB-Ol%m_`=7MtFCsEP*%R!$bknf>SDXp7onujmKxl@xTyS{N&7=a5 zg5fQ53Q+~B9?%i*e2Yr0+cg?C?q_QU+a_#J@=^7-RrgeCF#j6ouuV9-@~qnXyRy&R zfeg)U;a;$uXn;8@T?Q{VUO!39MCAIY~&)j<~}$ zyXreVrg9`LnvdQE@FvRz%t-ev6=Y!a2kK_}r>P@2UU)3~Xy7ec_caR%S{wW9I1w+mGBY1E?QgP0Exe)#~Tk8fEQ zlHi$m(mU?Kagu6MWB*VRb@DT)63l-tI@=Jpa+TWON_V9}(oCqyI@Z!I>-MXyJVf++ zj!$#Ao}%zHzj|Jt)voUao8MZ?Qir}cy%B-;}a1??d ziTC&|Z2=l3%ihxHI{28!QezbCZi3(uCmc>X&y>gsrFeIb6I1DI5jkcTDjY|Y2?K>} z$Q(ix-_oP*-SOQ-Is0p5;`bDsef{WU3k@J@ADu{4HI%Kb3<>--e)^euShrZV zwkGYL_K3n8YBqj_jc3=vZmX7P=1yRnjqwHYo{6p~;v37wsDaW_?YLI2NzPSuhX+_2 z&+pO%h|uc#aA(w$l$Tzb(cbkm=>KzxkAeH2AkATeBwFqvBQXIzl1(j|kJ?AI& z3zx?NjD#3fzV>9{g!xSo2uwwxyxEj)xEk%7YAW1O_KrZzPU?OMQ~@13}+-z58ud7n~GA>iqDsB8{Z*T)HGT51yPobUnkhn+0O zD->=Zlnwee%Ly~K5`~w^eGgTN2?7lw4wM3AH0N49p<9)m5sibldJwP+6wUqaUJ^rp z0+8DNZzc{nK05Pkpqds6n26<&Wc^iu=ko>JvU@x^IjTq5(~oKltBwP?t|Tid=|{2C z(bx{u$iv*%zv=e|SlijGBhWcR;g}W)tU4qw<57Tyw^m8iyOxRNOMnq43*@)waU4z% z45I0xx3T~7LCZ!6zfuBw6DPS|VncgfaD(k>9A7=xSPRJjVZpFqpU&ujCc~*S$ZQNjPnbpBtER1s`3_6atU=)F z4i#}P@$(|n_skD}3yf@zuMEy*7{LciCvFp5(51BVU#7@^8b)^=PrYc)yY{vjz80bGCPo*cH+tt14Q+#K!H74a6X6*(GZPq@Z@C zKeM$r)JArHL;gAa(pUqNlGhqPo~%c{|8wsJ&0Wn@x-Nsn*_<^>SQcp8GqVbW*JN7f z1F`SZ{|Jex*pnP>q`LLc^Rzj^`irp}?6o@lIpqm$tl63z7d|ylyA1t$NorL*Qo@l( zg?32KjGO@L$P%Ffb1g&TuN8crm83K>FwC$Z_HJ{BIG(kx)mkY=mB z{O!882YY(J9UJ&LWQqD*-Q&mzV=}D+Lxu zC{7Yri}IN`V@`>qQ!J5`u99RxB-+~?ZNw-;p5padd)Ca*6?N;scwKUF7Yk^elkWh6 z(=z68uY7JM|H~w77D1haKZZIKDSButvqrg562OoU`*pk|INB|EmWNN^5@odhXMsrs zgwgLvC(38J&0=NXwQtSw@=iI(HXTCJv(J#aq;c0&2^M!Rms=^A7twk=)a;3I&o~%L z=MD4N#J^WWTBf~F8`T8jhjo(2jv(rUB@t`eLyeR_zDRSbc~`;Z;2N$Bx0o7U#79(f z!YN+K_#KidV{)Wyit4%v1)|~1bZgUKL7)=|Y;Q>QYc_M>Ya}pf7Vj({!0iOvSbH9i z7DPD26_eR4O@LB8)cFkoe~v#oS6&{5LOvgN1$H%*QQd}?bx9_fA?7|BO?aT$=(4`K zeTf<~q{&$fOaXhx`o6D?ZM42ll`-swJv3OAe1&xJ6y?KDB1`F|8xb}-rXcxd)kLn( z5n9HaBI&3Y4zGLYuQM!4;1)9F^vfsE-}a@w$B=khgR;@Hpbp!xG$yB=|E)ba>?FG~ zm7fis*iKP|66!JxY_66;mth600UPua@086{l6?6$8{K68)CLL9PnkaW=fM`H7o(;@j{?4y zg54^6WF2eFe`s?q=xD!kDzvR=vS z*@NBiZU~eUXve|Az!_)0VrV;$w`-in?kS8!nI{P~MXeZ0)*(#4?{Jn!61eAl9{ng| zc7x@KfKmytquvNhAFa0)bTvR#(#JTSUR}ZkOp)b4NOb!@nP*^tA6_lgeBpCC1H(ad zf%nZ)1OYheh#6&Jw3?#JX=W5F(PdQyWWqj}5=hCBSqu$n3km)e(9F?erSXrXB_s%g z_g^oSy`8`7c*Z&=ew5WwasrNnr6@OHrn<}kC0&<9!!v9hv{70_53@h>Ctd_a`5bC< zS(c?p_9~%VC)VQvH47}#`Bd4@^vnN3l6lq!c7kn9Sy;icy!WIyEJJ?LWL1HG7NFz{yaCAioCW!xGwh?In$AMQJ=$A7AX zUyMCFK1?`;v>_ko`nk4pg698|TRQH?@)P+EvFV2&1xXhfJ(hOM;INsNBp z^ZH9AZs|@6Kpag*f%vsOfSlKB+Ea+8qUo3Ks~x1Ml{k|Y8$=(5593lddpRWxj*GjA zd9qo#i`g~quSGK*m!Zf|?!--qS{INib{~D5Ryok_%jbB*`Q+X#r-{!Z)62vssLg9Y zJ7ZW{M*(OC7>w`YDJRfn0(oE5ho0Gd#{{2F9RJ+h9!ok~9Z~wzBUUB` zdCL5mdGEk6#Dtn-b=me`9Ac6176dl$3x_Tq@LL?b8D)w75a<6e7B+bfJ%i7V{NBS# zm7yi_iA9LGW1I{73nX}jgMvWc%`?(cE^m8G=KxA0)GvOVq-T8ba#pjw+;BP#_c9ef z9N7S?{<+P!oB3lOb7x)lL3H+oQlOF^C#_#mOuU4eBl;*t6VDuL-6&svqj+QHDhxWi zzF!p0wyMEp05EgaXyITsE;5hbbS+(g;|Aynh{oY&=!(O=Qa#DF#(Xt5e(}ZA+{e3d z3B|{2>L-t&L};wvipcf1q(T?5u0;*=@PL8)g6XxIG zarO%YXmbJ1OGe7p$ZB+p3bv?NI32si(9f>SqbmxT8N*LCU9Dx4Qret;*5nbR06EWq(_Cxquah2UJTWFEoMVprD zuWun+eAUjV>9!E<^zc{b5vtacpB*#;jq%JYK;t_RsxA;kvSdCFIO+M4cScio${uKO zlD+{vS*sI(o3hd+#D(zKqBhh`vK5|VNCqMc8P+2947u&k zr;ZU?{6+fhb(Q4lx}DF4n2ZO*lA}Euce{=2#*HV9xS3=Iq7-Gm@v^J7Z*(ZhFjQz#uMoL zM2g*aucmEkbU$t)f`(Y%o?vFYL3i`w{-8P7VPx&st%OjN^J$NlzT$ijM3cYd-4cP= zQE5(}w9lFA{Z@cxshPb*2<-E7WJyGzT=2~gbqbO83GbxBcIU3-iDNM==dvUNi0vWE~wggtH5bqCnhcY6PS&(9DMHdW>;2SD>ui4$W3B zz3dtEN+K)8^2|~|+&bcTRmTwoibF3cQw~<8c;7{?LTilSn(tW2j>w-I`7GkN5oPE+ z@G0i-1CN{XR~+J8v~%1h!Y>a(`kgQg*;#|d^qx1WEEm{u`ag)M^8|92)qk-0Yoy|R zE}|k~&vPkocgA4uTMOyu6{JnOF|d1_OVeJcM8gx021+GxuFyDSm2F}}ohTm|m=D)q z&{2nvc>EE=Y+J;RE{Xr@5m=vpR&y<^TNf*4rzB&tL>DhmT%;7%|08;SEX2n!WVPzW z<@yAfF()Bn)KxN3lnU9oBFzmQTvHDu-I+kg6%t}KmBrH@oWNSlCEZ%2Pc@LCA@9CMT>7 z^E&Jghka~gHYSM~#6SoT^txl$&Y_$kfnnQ5cvWw&Lg?w(N5^$4Wx5$E%*mZ#I^{!3 zMx5ktUL{0O_4&YTyDKFjk~BIRSCvbS4{t2x>v^vu>c1xK-avPmv+t@-SL%1WO1v#<+pad zVO0KAty{3YF3tjKiE*OM6*TJDH?HmUac{6h-bdS?N03UxNM27nIqsPo>m>Ar& zv@&N>UXqKj5@rzMJtroTXt8y@dM>@B_1xI*v~lN6%%SF&RPT0%=|sMgXL)N)xJ~bg6!SQ!8pqw~c(w$! z$7>?&sab}?R&RIv_5|*uoy&t~*8_|^0hKjJJeTy_Xzwg}hiv%@Yc&{$FY%}?iBB+Q zJ&V?TQRO5ZNK$t^kqxf#liZ{5pCrJ!$#KR*KJTnUAjzdI35{n|c>*tFfgfV|#x?R_}D`c>N&~L^eiQ^^pyyN(G`1my~z@LSOe@JU) zX+M6|3co`JD#~RS^t1+@z-=&>oe6M&bk)mYw$zLif{si^6~Z;s(d^irj^X2U?ilIY z`F~0*@#YTSJM@InWylVlh0uC<)%ab}9x?BSUjv%ic`d}&Ypo6+Igf7sD1d}J6q+!P z2I~gSyN3nxV<0Wc;aoRmFREs)E9C^rN>qsTNDV31kqdpK^C=aDIlzh`TMMp& zEc_Pd6|m@;r6`wo26Ko^YgnTlKXF>ROit^oQc>^Elizoo{G?1AC*?DtrAa)F=>CuG z;!_r@!8lFbW=M`)pGaf8i~*EtQiGD+u0kz|Yf4u+v&vW3>~e^;%enq=EEXrMZix6o z9>-6OG1y%PA}2%z$HH(Bo|UM4c3tIe_4Uo-NN&ju^aFwtSObWv2`GzALHgi)rd>_2 zn>fcy63nCZWP^g&`7bL!m>M}TL}Q8yzdIMOt+m_okPax9it8w#HA9NPIqLI+Y22|} zR1l2+Apo<>BC0)@QFz<)X#YpC#9`A6@hnZk5WMaFEZsv;L(#9&wk(4AnU@FRt|-BD~AFNE;+& zWgcQmHO^2TE;%;eF@B7AJ@7-p?h}qJTSdmgG%^GF+G16&eDy9k^oRh}NH}@ITXCTE z`PW=iec0vsrWU>p)|yC~M28cxcRed|5CqvfLl+RM6c6Rcy+EFs7j2{U1uGhb1Ec+a zos~P4_+oCipxl%CCqEawBT7)HI4%PhieyYHL(5v@>3Xe$eq}wc*DyPbshZR2+=X(rK=4dAPvvpsvmU33}JRn3jn}ToRFSx z^qd2I1w~txj`w{$v2N7pkLWq6Lc8NdW8HLYl34YAscqQ%?HX4>KV(_RN0OGa$AL0l z<8)H@w>hHI9Go&Br(XC4+VQCvM1J=lk?VgKw7azRE}nN;CEk}y@niZUi<o5T0}yB}c%uUNU0`FJzJx`7YAIF(rz7FLSEOLt%xlt>W9Q&oR~op|)asU;Ai1(|W9X_U$}KNfa+7B@ z?uu+6xzf3_F?40$SQ#A3lt$q{U6D#kEgvgQcV3`z<6!E@v5;K3(OKDrT)5J?vr-zhJol>HxX^fYjbCyDdf^w6o}(5OLYE63pBW3<(vD>ok`^Lw$BqPEs|q?TMan9K5-s zF!2Y5Gtv!eNqG>2CTp$XwL)YDb-6~Y`Am5yxi#@f_8S4ixwzD0a-F;E;5T6LOFCr` z1849WLn+g1}!8%=CdrbgaXf*Mo{=DRbS3l^w5MT|rm2janu{M3qAvH@D}n zFr+)C7<0=qH?-Z}3oGi0sU8V@+LHw~w%_M;lqz*UESl%7m@_Yfu^u=r+5G;=IY;$< zeHD={LTc%g-95VYVS3nV9-LxNayetcf2-kugh9?N&+&M~>D5f=hu4eYr*L1a9~1>q zRZR!8mUVzCen7XJFaJ{JFeLKz#TeGxOY!7R!PQMHym3xbz+gm@#A;#2M!+e2dGrP~ zBv?)(DjPycU|~gz$A8NzC?b`q=2I(Ct$zODlggI;ud4}Ln1c^v>&ORlW8wY z(X>@=JntM7=33iCs6zA0VWh%i`&~y%<;ar5r;Sqgm`rp=HqkZXiNN@h5XrNZ@tBG^ zeLEsu6Cn`aW&Us2#s2fK4 zDX4NPIWwn$Q+yn*429=mC{kP=!;;fvoJ0R!Q62!N*CJ|uy6gWJy+(M&Fe}z8;}bWc zb}N44(L1>;jSxdsOeyfLs8Wjndd+jfYmQ~qokwttgif(fKyFrHkz>EN*|qfD_Q5>7 zX~8T{x{XNE)TuI}cjKmt<_GvU3VulROvb#+NhM|B`vW3Q>k=plW>n!rt|!C22ydw` z$-iflrVh0f-UqSy+nDPY!pBRl;MHrzH^4|}-x^25Ix)*UlcISHJf|G_#ws>-t`jry zx2l`}$@!y(G3N^IW}|SQMq=^TU7ynkh9R)Q_pa7XjKV&OEF|xBs9Veo9x@y*#O0R` zxjP=-Jp6R7Z}_2)1V*8=J+$-}D(Yt%@s#Qtw~TvvF7rX-lgVPaG0LmdXy zdz(S_g*}4`_M>OR!6;lcTwwHjyRn)iks7f|5-ta7o|=%r=uOW=hzO@lA=t_pU|Al!B}Y@*dVHFtPER?h>vjujfBbhwVQctDOb#g8Vf#P{8(b< zKTJ1Tm0lNl9FI#oljS44;YmAtp)Ik3q?qroq?pkQ)G6l1^SKk*7|5g&rfXE&yO8bH z1WX|ToC0QNII{CJ=HS$;v^~?R7LnC*+>0vaeO>o>_xKCB_>ZTqpL7(@wa|-%YGI9c z697Klj9`MeTgUwPCjun0nOoG6%4F!^LL1vzcsg*v*HMa^yP8D|O!kh&;NaMPdWW#T zHP$A0hQ%RrShwKB$m_qUxw2Q-VHFc16#LDrM)5YQ`5~{1NGfLPpQ^OThM`WyJ+c|M zlxI0o{odTgF=Cqk6A`fs^|S))(G`@%9U`?gG26$5Z}gghf-?CApOIrE3^AG$Z*1uq z1#FI=1!|Khm;R=pN2l@%$Ahg#g8meXqanvI8WJj*cHq@K>d=h_6`O|F2ST!YNZ zkw5pe*){$cVycqKtXHI(16hj~h%CVbOt#A@PR}a`OC!}{l?*ZCvh)3wHIUlFS|R6q zt_b48&`wH&UM9M1H{t~toY7xQ4TKRNy#D(H2n+>1wNEWH4u%`09RKK|KCom}5{e6V zI@0V6A@Zr)s%qB#42XN&NyC0R$fVv(k{MB~(A%8R-q^mX6P~c56m@k8JN`Q0oZ1`^ z_qt;q;I!EW)W#A4QzL89CH7Yw+Q^HpBSK9GX?WDlGsY9WKb1;C`V5UOw;=pXXT5;< ze>6vP6rjQ_4Cy&i7-FaC5Yu5OiiJf1<#Tj<6u!7j`7;hBHdB0DjmQ)ht=9AO*MC#} zLP#3Wia4FdDpN(|xZ3SxlH5%2!N#)~xP&girAxH4Y2wS~Q(~F3&+IlAMUPnN3A-E#H)8HFC+a`YZjtCv9M5dD;?vSS zCv(O%^9I6f`0)Ac<3z2>#;Q+oBkEw6-BdVe%t&1a&t{SGAGpN0u6q;q=#Zo(e&}g* zZ8kp5uI4P&NkFsS-r^_HFPXWPj>QEP=n!jnPe6NNX>t^UUkSiT_H`}L?>?Rrl8&P$ zVt|R${)XS~kuwd$ucU{s0% z@fkpURP@LA)lG9P%?(7*xXQi`EznXDhkKn2_F-pdy`?w3!cIJQQXUAGEfl-i@lX_2 z@?oXrh{(@;(w9q@5WhO29a`k^yFw@m?MY;4=pF38BW~0*p$e#Hy;kXm4}=fvgNFK4 zjI$Cy)c`Sfi?nVFeM#81aeBKeiC~e0j0m?f(0{dnrw~yIjvbsAg6+W3$PNll-X_3S zKN)ExorFleyt8EuaF;xuB*K^K$1r&a3ezaM^B?b*4r0N`Y5N4F=yk*Y_2mB>gw!ys z>3y^3O25b*S4gTH@?v|s;lk?UEE~)zhpX**5N~DeCSv5dRNSPG%XikPjc$mO#lIxq z#@qVk&vh;PkH1C!tF8Y2`sw`uL;)#$evfl#`xNDhiR`p?klUB4wxn{~e= z5=XkDG%ti$Fhe)2sYFNzxO2Vs*)o3`JD3mW*|Gfy zvG|5wp>uEdEZm2z&FXFh*DLA372_bm)X64USh`nSV`@=Tp@a!q4lS7wS&g?E-{^73 z6Q_&F5wF`0-d9W#p)K8BZ@UIBh2;vxvK+<)r^y3ryXVqwnESM0)AX z5nUOZs9XAec!D4-~EH5>ag zSXkYqwE^TM;kmEJV`iSyN%Z5efr?!+*watX`4ey^Sc!OW)^3KR3I7GTxejFL1k-o% z`yq*o2LjaT^O*&_fh;op1@zarQ!Cj?5=oTzBSd|#4SxM2q#WPZ7bHs~mE3tT>&#p2 zQhDtgP6p*g)_2peB-MEaT>hK|wp1sDt%ZOo0pawNV$W@2OH3aDEe3sH1e0Fj4#c3# zu_2y8T9N>UFvHQ{#EXjh)o&XZU`?nP0iIPqq&{%K)C7P}nW|RaH~?gCTV5mJAOK97 zNqdd6Kl#18v`56a>w59gJo6$ujUqD)er_1!;uK43-8o9k51n+Eh(U8> zeEo>c09sgQ!_v0H;9*hV_0Z-S;TF7)s;74MU~>)>qV7A%PfCh771l9iZiUxvm6~c% zrcL}zfs8qnbl_6j4wBF++Vr3WD?q=AbQxTiFYH1rBw;(s)lGWZvbw8N*M6sc`%Yt> z%<~K+7uU4FwWA{t8zo!HqYT_-u0*ubNx0Ci-EmL5XOLZOeqrh5Xqn2{_|X^KDYl#n z&%ZUPVT8a|d9mRMvPMl;z>g1wU|!L97E4bbZASbgB1C%gAH~nt8O&`uSl0WnFang| z*CeIDKe>9^w7Vznw6@*5Ao%1qJ23W(+U45!B=Qu#Eg$bCcRELu8U=lBgOw2gyBcCjM*I7rgYjFoY`2WIW0j zD`J_F;v{1q?nD*tq?}%Vj1K9uw_*-9J6yuh>>}0(MrXS1+{xeyMpL&XfP0pM*GLCU zgx*KwDRH?{+IR7A&VANyl5H{q!O6ffosfoV1Om7!J>_`(qtUG74%SAzMp0*x*uBk} zSjv?ABpLtZLy4_+AMJIWRu(7bhLYV}>dIZ`w0Pd|nMaTv+uLHoRav!fa~Jf=#|lGy ziolP+=;nfGnTkB0Q@r-{smDGyVZ`uc!zf%Z;^v3K>DlObglYtnXhM@_tbL#d$DqZ^skz=FgREJQ}&NgrUa0hKyvSx_09%<#G(NT=nO>At2{LnGSW?$2z1y zka;Sc(DYq+kK_Tmq&KUb6-w!jrAW`-drU;3rijARDiMUPNhIO0$w}}KQ&}cpxzwfg zWXBa>e{|6eQ_xhWdOFj;?o?*UAr6~d?r`peQ8$L1RG^v#k}T(B7S(6bUzrD;ZZlF? z(fzf>9LshS!k6kj?O#a1UGr0St;Xg(ijr0c?RF4n1GTY=9~Nw;rFT9h(OuU! z%BSt+I}#9}$=DBe&KV{3{<)>5Ln4x+{xiQ;hjv^Orb**o_x|vT4ePLNbdFG`I+(cJ zV2B);kfnj>^bXXs8dEbR7=@Q$Ue0(}J+6jQqi+(}F&s!Zh6MF_B4pH>bd_yV8I3Gn zZ~cY_bi^~i_wv8}Cyef*taKW#72~&{#+)6vyyNTJ^|eZBAqpBhoxg5*urrev?Vb$?b*jjx~yGB;ppL|F%;hH z@28*mpZ5kl&d|%3t`OK3E5Raz2x61@Hlq{5lURaP;UOWV!oo}~!P#r+HId$gp{oL2Mf(1=M)^Pjk>`a2KK zSNh$0HOBl9XQz1Px&9c*HTBH=dlYo!zL{xRw$kM(5w!|zc&&_nL7cgW6a1rTqPnjc zDri;3V`&n?<%pb4VJ^#>w)m-3c{-3)f(i>ABjEDE;!S&1I;EeP9yLw<{sR_0|7QJ{ zFX{Sd?HBo|pRZ|F(A1w5kq2JgABygM|E7(&V6JweSC3TJ(aLL+zcIG2zDoZ!o z`Llv@w_wVqs>sAhHa47C;*K->~etV47&`HfbeJ91Sf3}AS@@0&Z#6_ zS9-C-ez@Bf4BGBPUoQOdN69yu5f^u(B<*cR2#_6dThe5;q+#(NFv4*QuO5UGH9N!B zTTiuqr2W`pnZ0Zz8~f6=bB)@w1B>75CKqfv(B6aH2kq7nQXTBA0$Q>0nz6qjBAa08 zCL1k=yO)}b|1I(~qemW??*UUGuC?TUA27>4$`V+`D}<{Y;3RjAWWPB`#W}5b^0_8` zMOR&xY02TEZwowo$Cs}!AK3}pf?4JHe$VdM$0;V4|9pPWjygyg=VfBiu-~9%>us&G zz1RSw>G{%XKX<(7@gjo~sim=}QNtZ=GKq+G=$9}2c(9tAV`xMluG3rTk6M!rjAqpy zqt!a8E`^vmT5appd@eNTe^HjbSoE?qK{7Dt-vv8)d=XnK73wxcyv_fR5oRG3lpNLn$2f*0=0{UI7P>R{Dz1tjF##aSBLPNjGyKk*{U4%g2<+G9>f zQF^#bongfhdtVZ-3Wb~SA5>hc*+hxCF_8V?UH%NsE-#a?>pQ^0c6W%?wpi4rqqz+u z&{y``P#Xy{hU5DCgR38Db~m`pK#>>otY$9#0xj6VE{1_)hxT0-N)DtFyJ4PaW2jkn zKaOyI{d2Ke^=LTjW77@j0h}6v?VMNl9y)dB&8cB_w=2r%n3Nvepm&X7Y;5vPKZwV0 zf5zD)*p{=&wrB`HT$7Dv29AUJOWZwx3&p?=Ly;iAY-I^>auvg_ZP zgOz)+l9X6DgRK39Z*JrByAG6qQ?cmQ4K(q$Gbr$=koPiavT@-xg3g)ndp|D_h~#Oc zWjw$=i+s{fJ-u0tdpvl)BcePqU`HgcWCAg$+?Jq7 zNR_?v$kPI(nn-K*!!qKPE}l*31Nw@zo*@Zl9+w{furzaDBrq8p)l z)4VBgH_#HCe7>}|+`wYn?4WmqCju`{1rcX}5MP%0Q;d5p9q|p032oG zbnZB0vLClNJZhQem&#DWWZpKsR)|Lv!78h;Z6iMq%>55Z^QVb4yD7fkb{SlP+b+fj zW;}jARWf>LarzeLi?3nyCZD-$1_9Pk@zH-h+L_8YQierN+Gk2e`3{aOJ>rTTH8T&g_)IXU zEtqzRC`a1r0!lJg_<$zGs?@8g~8tVK~*|68bU`rcg-4B@OF zK)RGs9%rcI3F^6QmHBPLoISoP@sIg z=D;Gs@ADS1{C3p}NgJ3&f%IBB^nfmr8Smen(aquP0sfQao)THNftd_gzEhvAl-B^g zaO)bUe_XRzo0TpL8M}GoH*P(Y<-2J{##WQA)g8!^3jS>1NtD%xzTl=DvDBvA8F2(c zZ%qzA!6sdd!opZ7)f&#iY{)%`M=RpJ&_lY%J?*5GP4HAO)Bzg5MRT>K9Jiw9k zU5t(!34daZxZwAuFG4=bdKQJ&2`E9VGmk2e#1Y2Hv`qY3o!;;u}c4bR2jFtw25C~ zSy9{$mr`r2SMEE+SD)OPWD6g~Q+7r@Z&tSs>bUAi1O2Epmf>oFU^TL04M(25nuvUE z;y!CqYONc@3OLCS%M}}GwpZfU%WMDtF3CBed?MS>M@wHyrRj{Zb}Frl^J7PC0f+Kk zrGbF^RGq^a)zZ$=a~dwbfBGLG8G$&dx)9BfO0IaUF$+KAb`O34Jm1WIeOG}!>p6AR ztf8(x2b$}a34`^LJalB*JR)Jt^Gf9>4E8meT?0OL5m)H(K49Du?uDf)41;!HWBn}; zx5;Fl3#;mAuk`M{So!wDD3f<@FOH?xCnUvuP8iZ&WHI#!Tg+DVM?Yu;(scXUbBL9} zrQ8uST@tJp?!oCQ8}xdgg|VsW|yAL)nZH|0!scWnu60k&dlIHT*Q9kuyNW$hyymiS-Nwk*8Okd zN7$SaNL}_gL+pn1oOkXR&o)n!y<7+y^pRv9F4T*-4(Ch;afFpBb}c~(yRgGI<=p9( zo`sR@@JxH@tOEtgP&oqb!3_MNUZ68jRJ8{lpsTPH)rzM&-6k0@4A)SHwuZ<0vNyV7 zzbsvJJVJADnjR>-<&=v2ajXyDC%JIq90nnrVV1UB*%|DM^&Ad`D`LhT=p~gwO-BEs zowR9%^7&f4{fWtHtIcQ4QR3tg0p`cvi*wAQF9w8=Pm>5_nivxGPlxGeN=c8kjfSq1>-P}@r1B_@XpYG+HJz}TJ^Qv zY?5o*?7@6eZ$`N8E>+-8t?u*ZXwT5d6g*Td)C&6U2m7LAhc=XIZ1RQ~#Q5#6sPMCYWVm^g_m;fZ={f+*uDLN>j^>(m?))W7w=BQ?+LuHQdBV8$xn!lH4%549; zMGaSAFKpfiXXbFjDo2RT`(b$yOS^JeGC4XU@Oi(<*(H`yhu}lE3KOXnEv%X)c``fcxdYMkl{&B>c11`TRzKXytt z8n;QqBi?`&gIJF(+n!lCa*XU#R(B5d49iux^baj7Mg!?)3T%t0(sUmoGoPZ(u39S_7I5g3 zH#pk~A7aMrmcfHwf~EEgTqG3IK-hND?cXHxij2#cN(@QSFrXQ_RJva2qm5jK#&^?= z6fN%K680Wq)B!0X7!Wg0`BBND6Y$bpb`dO3B8d^Mxlxh!0h9Ko%)MWXYQ#gBLwaFX zHS{5if__EVCp%>`*WJYf8cTCdo&TJuCoxF>kfux-KEvSph!|P+iw_r9!J~M(Ya3#a zyk(^99BT6~23tld(}ADC)tKv5@;utOo)q>hrLM%OzFa`NDoq@XMcSei48D zp}L6IZDP$LXER2PF@fD1(NyiHQ&v3+>&v>B46v{9*Z(5eZiP~)Xe0^D#78V}J_jB( z25(Dy^8-qG(DfYQVR`Bmvrgr}hp%jUCa3FLxeMi({`r6&DRM1G77i6tzRs`Y)8ag5 zY}g!!p3^qy;M|Y>12KaMLhDXEk;I|O9B~lVUDq1pVb7F3?y1RC8m6PeE2;In%qn1OC)cWK`uSdQGNg?>SQN8@}*SxPn)o zWT5ss!SfKrP9@plW%FRN z3tQ9~oKF(10+YcW)O;im>-H;Aw;V!yo{={Ri52!t0i0kx+9!;zC7iC4zC-PKUnW;5 zw@S#Xsl3G8#S>*(%90hF><*Xj=2}ON&4DGt>Gg~}9GM>CYZWMiA%+=UGU*GZ`1W3} zlB9tT*XvINkYxghV#vA{g&cE+&hYx9;A>|(zwuw}EXmMiL46anVxuOOBlQd=Habav zIptqO@+Wh5Za~DXx+9W?5U|ZctF9AuR%UorK;IlQG5B%XBJNnkva2m`Ig{|vh^+3= z=An#Hi?`m^0h-`OMq^n{s^`E#;*ii&Q&CsJD`iv^&MWkL&_>&g!&Cgsh}DcPVo%Ar zvCvEHDgJE_;*nmt@P5A3p0fjSA;V|C}84z*oB;@pq{{Uv;b&3JZOiGvsoTU3y+Yn|Ix-51{8e~5cJB4%k;vC{lD1Sf zLQ1++;095I@SI?VYv{FtPv!xSB0+YgUqqj(#Hb6+-(F%hglbw524+d#}#mpK~Ufu||;f&F$$z{ap{{p*40sP%q7d4b3dgnTfm z=AlSu_$vp@`?wH*y}t*e0zl$in8ONN$Tf?|#ePlqYHqVfa7PmYApJRO-{7#{A3VVs-Dsj^VcGS6I0-OYg zav=_~oo?nlcU1RC`k88ow_>eKZ|aEaD+J;o$yqQ2A`0cij&;O){X3JW#^WbRnwbog z4E!u0KA2exk#tjglyn3XaL2A`Sed_O7qxNI?7%3I`%kGg7*(-tQ#s9^Z6$L%i^Z!Z zi;s>dq3pXiaQVl3pZE|SkFbqXRvf*RO?~O+yrbLo5su)738YFlWrHT})oT4h&vqmm zZ3yP?fEZf7yxculDsf$Ne5Or%xRb*L9XlkAsgMosJr~sq!&)}0x%_snBzIKfJ3d_| zZwI6~0CPZ$zhG6Hu~-)u!eMV#Zqh`=(LwpH)tyH!r+&{80grD?YC^k)yKRmoF&+De zS2io4CYetRFUNb+=5gR|>UkVkD{7CxZ3 z44?@J@Xf%9y^Y|or?(D-+KKVVvs_q4*bl#S9^X~)M_)& z-9~ >QbsqxzzOnGS+;2H%4nUP6EKkIe4V`7C50?wc4in+)I+ewcj~+w_ABiEU}q zcZY5K@IqF3lzEPCL&7T(z-kP8N-O8_^qpq3ETObFCl)`QUhlzd+4#rf%z)m&#_~3q zXFBX(Lc@Y0Dcv12iR2{hQKWY%e9I+UEnvnWr@S*&E(I{;LLSaG zD838FwiIH?jXUEN&nXm{uPouN847VDG-bR+dlKfGX70I(y z(1TYWA4Gv)`~hPgVRL#~c`md+#^J4Hfas9W-@;1io)Gg`0{PfSQ^H02r|HEt*;m=G zR$3rEL=JY2z%Y*QCX+Tkpa2dBZ6?OscBd4D(QnEVn~c5>Wu<$Af$`V?x=|%5+LPfJ zviQ^cBO9=;T~|rShh7Vkhr-Oq%NxzRK4o-gbGtA%$;=t_TN%{yk*+3|@B2I76V5X< zD1}1p{V6TUUoEMkYxe-35-@chRUa^CKIO4SB%5CpY0bIJ=u}Pl1B5A0Bp1&p2lm$* zYb54vv^hOWD4+eU2{H-uXNRfFji{~jb}f-4*p{JiPnz$!vjTo;kuq3AD2aOoqthMC zeFS-ucybT=yE_fr(;!E~Y|b?F!xB-RWC%|Q&ebXs8N3K~ea{)7nYu!@yf;zUM@#Cf zpA}tXdYxhb)YFPGx~QvR`%;VIIpI9f((5=2+f+b1M}Tem>w zj!(HuaS>Z4v2HrQ)csKEP3V5DA?Jtj>p*NTqiF0 zon{-nDpFM2+u>;qg)Pc;15^}T(x}&Dh3*$cg_~?C?BXmyu7=L%^K9~I#_!~zrKw-BMvt8@-4*!3fg>k$JIdo) zX(mdV>0Y<)5?E4>XC3z{djPXK^*CzaGHCk1TttTp6xUlRXyA{^EGv<_WZ*9j^C@jh z23Ut#5~7x$MqTnGw(y@CW4y547d4R*LA?H+X_Quzb~fGrSNj2GgMYd&Dzcn&+PuWq zHd;8Oc?)^0WEcssT^~kh>r;R&9nAD#u2wa)=IF z%Vd?jO91J)W}!YwDe+p?anMk5)})<#B_spRS|?bKLZQ<5(<;W~ctmuC)n-`N#7l?< z6ZJU=;nJpwz1T(nE!zZ)81G(zfh}b*SIFty1%YNnU+z)t z#Z0~sF!-k5nqE@)K+>k*oNgTX^659I?t zhXcICg;)&TEe40`V0eeOMWZwK?I0*rB5|-rsgWc*JjHso(yLeJ3WRHvsUqDjZc$8M z!x>q8YE{$5@oufM$NPAIHuoDeO4E$D@9MoeJezBTy29b5SvRDhxh2nFBV#xzC~WFI z3gzfYt1Sb)`CU$Ke#ZgOKksb$ntwph+J4Y}mcIwLe%vzp#d$aLNB;At-oi@GP@Qqf z>5AXKr3I&fi}czwJE3_21IJ*>*tjiX^BVh$(zrfk_3AE)ccZ&}>Pv9qZkDNq_jgNS zbku{j@(?>gJwy14$}Z#&RXSyeU}$lTNBiX``KVNzZG>oj${^hCoNaB>gAhNqRTp?K9*RRu&mBr!#!1dG!ff?j74Rm@T78~2$;qvV0BUb~ z;Wpkz1Aq&V0D9YMdY1vf3*9q&fT`Ry+Tce1b53A{g-ucIdKqSYDA;cX334khY>y$X z-!shN&--Aq*3j@E+Hh*X<)^V@@mCA*e9~OrGaW^mEuuElunJm3yOktbuSulk{w&QT|7;dZn9Pf*a zBD=Krh9$6PIbzRrR9x1qbe`t}dI_twCG@d&r1*ca4|tni!;YT9+vT(AzU+Q8Yp|*) z)5WUYJ${EcV}&XavX0?qiWm9w6oU72@2Kr=|c6#no9Gt?A?_$H9JOCHJkE zplki&<6m)5HoOP4x(l5h9YVTWWq_Ig10F+B4;>(I9aQ$zBU*-O2uAC;yY+WYp^U^W zPQYLe(Q-(mE-@sDUVeoOJu$Ldd5ZmMC}k!PswX+@WB|^lg3M6@8#eL#_Duap$?W2V zMU=425B+Qp2d?1|0dJiRc{7TT1z}?3?@ERLNfCwKk8g*V|9|82{QuB{FkqjhVm|8$ z+!KV7=%J`lD9s=bw@bG*6_sa2hPHfV*Wa`$2Btm;{8AM)t{|=Z;&9CWUh|V&r400E zBfAA(kmYaD0$F2O)ji4^*U7CwMGNG_7b z<}s!Ge?qJiet3CJh*Tr%K+rWdvXEc4;ecJ=N&i!i6JK&++HAp z($o+lDi(ss%FvxiE85?}t|}>~Pv}gjtOpy+Dm=5f{Q*0y91Uxh>RyE*KlK)5_EE^d z+Qgp*44URxcev5bR6^@b?%YU}LaMd!|IW!|8F-CA<^N5&i}qrqK!q(oM4l3cSxw-g zdGo|Al6pdMb$-KM-P;AWhtCHbK>_>Tii9UwfY#Ucql7G&d<<9_JJ+$m&h8tq-c<>) zLhnz`-+W~cxa4CKerlyin*~pTY?ZlIeC_+Vw5JSyOz_uBkH>7N@m*gngZ)*~(s44Ds>TCMo{k5-(+y?hkiZs_XXUK31l@2g^`xA3Wc-mK@q zk;$gez-KIIbog$|IZRnMDDp744eU&?yU`>fAk|vMI)Y4c8ETo8c(CHxJN}!fJt~CU z6zQ?LO0RbC2E{pRUpmtIEukTh)v<+_KZ=k}XOXb_;_Ag{^c1itwJC|OMyVr{n9XzU zo#h+6{1v(y4g(r8g=p88+Zn{u;QoS=I@>(F+-dp4{?uIp?d}xVD$+W zdH2et$8zy1W&x49CrRd(S!sJjH@$dM#0Lp z$?K3U<^tleZW^u^Pfkv2High%SHKba7(G|_MmLjS&#G2|Dv9{cG3drlJ1X^i4K8e; zzx_Tiz`7uHPSHe74&+z;+*H}LD!?fro(XwXw3h>Byjgv-+_+AG%qoJ8E}ZvFf|19bxic^B6YM&)SsnPaQOCvpd^+Wxxx zX#Jzq7mJYd@i!Lun#p6cXx+zea?j{I7cu$#{Inp28M+Kh0Bq^+UK&aqidQI=x`x~w zdb&dhOI$+z04wlvfGFj%Ax=j(wm#s+(seErn_7cm4XVfemq?dzz2EB@dHNrF1t)oI zXjOG$askW3F8#O>-K^5S6ZGNjzp3Ls6!o=_R}uC_@!M-^6Q|0#piu5W&5kf1VBlay zdYx=86}rl?Z_JeF8i&EuGdr4Z*=d49$^{@cJOQ{ziA%v~*$s z(`tFZ_x6^!vJbY)4szcuX&ZcEH*wHX;P${$vv*j-PGMy!obXlJG1r}^m8{axncoBMW=X}hY-+IV zf>IesZf0ku@_gvE%bBmIhp?u{Ua&1c_$JNY`NiM)vE2f;8`HHhQ{Za_Ky3K8^ z^4?{VgyedPo;2!24<=#GrGxpRgJGIJLrl5|SF34(IXluF){v)SXJA^|>2mwS^h$tf zdT3~#Bu2;*hj@wjxLiBQ%>@P65U`W#{8%1^=@l}H-P#ZGaC9-yJJI&XXWX@De?MQG zg^33i^;Nl&r>O}&ciN%&C0ekM89W{tZG@{ewe7GqIEC|5J9p;@_tp`^z65%vlBYR; z%|CmAHo+fytVu)jdm+iZtX!-|o*^L?*S8buUp{Tz4V3w-m*4@l1WNlWZ9r(L<3IB1 z1t^u^+JGRsu{>r0DE~^SLR2Icd}S`Mtj8k0()KN9jhHm_I#ju~%nkS!;q&9kcNJZ0 za@0nyq6IF|%m9saFOn}m0xo52x2N-7C}ecNecv57#N>iGS-~53^TSJ>Ri<20#iyqU zO9k_~ObP_tya*X4CMH?zj6oW;sM9uHefknNMxH7dQnTSc8qb$e0tra-kBOcRj`bZH z_ysTz&oR@Z)+@ZQ?{<~!bu^HE8VsyUko-8nP@re36!0y>lc_{LHPy%5i$mdjbfkfT zUPNx_5ixgUv_=9>acRC>{uuPilH${kPWT?ZMpo5;5pp7rZ&z*WZ7ssPbmNpk#>$I3 z8>miX-*H64~puAYmZoOf>1ob+g z0(cLhII$b%upiyLKY4vkFSR!`=y;2pXx>!g{2Guz6%j_Xhj?C3;Vff^tO~w7b?&%% zNrzGcHTusJhf*Rns5NJHF%xqfT=DsBWT9&MV5>|b{|HU|WY#Hd>zLGVsQ%O0Nr>qO zsM~*7ecW_YxNtxpcP$VV-+Njft{KPH@iWu#r9<;@FD`eiZ8{S|+48yy`Mxo=9Iqhw z*g0o6^f5&LVkEk0S_MqF9d1=u{IiIeHYP-cu&B;)rQ|-!d|Th0FM0}cP0QF~EQ_BH zK`b<>0h6I3!%Aq;zxK{uc}2wgj%K8f<`gZR<9Un0C9_)3G;8qL>SHPgt29n8NvLZo zjJQ=TRMzU0u!Rl)kr*TB=1s3*%gYKs9}h{4UA_ai(Tb{sN0nMZy;rvo3_}8ISkzRf zxj10^UG;qQzi_+dF`BS)MZ)56iz=jPxkh1Ec4gw5bkQC#S&O!CM!6@pdF2uimJQ{M zP;C4vGT@inML)<8Ns3ov00bR1T^ucy%UWr+F!do@Vj@31a4V%t3vrNzswI3NsAvOJ zSj8Mya#(WG)BT6HkzN$V-kmO&>HEXxbu$XlRA<&s{Uw^x$x(CnTq=R`=toc?92AC> z*zHy*S?L*{Z-<9}PXU{xz3N==yMu^CHZhC#Jnroz6dz`Ej^e4?5a%pa7AX0T~ zWpg4d3LqdNa&>HFb7gd2W^ZzBVRRxoATcZoARr=kWpZ@6aWYa2mk;8Au0d>0000000000000{R003cgb7gdM zFLQ2TaC2yHbYEg@Z(?6FGA?3iZk)JvP+MR0FIp%e4VD7IiwE~Yi$igzxD=P-#i6*n zySo>6rw}NG;?QEnf>TN%xWf(KcYpK#c=P7Y+%t35$*g^{v$OWvpU-D4lxNSLp&;)Q z_;o2i`)l^s+??#MIiLMsT?d-ao)IQId-g2?<=H`xzy3$fp2tZM%cCYwC%^pXW1QRz zQv~==S6#{;XXIz%@Jv`gnSiCm#MrCtOE4Kd)3E^kDkoP%J?ED_X?{X_fVFnPgN^%USqvm?jQ8-J;ux)N{5Q$e0ilPCw~Sz{pAo=R@LsxLuB~>al*g! zm@#|!7~k7?vz{_^$I|Te+w6hPvBT{87*#l<;Q?c10y)ppLAhb0k>>0#tT(Xxy!)V# zzpX}v?-}Jy|A^?FVRJ@~Zp-(4OM#Lm>CN8$NpuceP1b28p3lC6UsOrnv73Jf@ z@e$Ja-yTs)!9*YKH`hcTNFE_=)5`TE02B>qKY%i+0ave{fMHW3Cyv|c?Zn`9`?DoS zE_Y+1i;bUGSQqP5aRsPvtol^-qyIWSx9?APWU(KbM_@0<9>Kk3`-HD>4~K$1h~qbi zJW$_n%zL0ut^>M5*4Duu*mawA9+*e(R125_P}@*@gCGEFj2QxR#$k)2xydY=He1!$?#d?EK0Kphx5G)pARnAIdMOb?f2#}0X22o_mQ01&LR)%#40RYh$ z5HcPzdtBp-B7Sx~i+$t2%)4>@?TgxgR&6Zb)o z^q*B@@nRgIVBFHQjZ8NAKX=!KX=|Bu@)h^9g=yO%kl@Y1UYl88oS0zP0dcF@w>VY7 z?+3(fX8mz;f@KF8t!CfjbOm<~GTO{waZ+6(DHS>0mTNuI&)X{;mr&@$bmcdWNFEoO zD0?QGZfCD1554m(!QGQh;cL5#5=W;8uuIR2Xyh#@b7xtH^ot^IZR8ktRbK9CMdR7Q zB64u2(o)YXgF|Q1ZZtNz)Y73RzN`1cq-k{PUK8)??joV^1UHoQo`JT};Q7s4U&%jv zDsT5Q<%i!jbb-Ejz4$T$Xk+@(g+tskiZDg%3~Z||Eu%REDBogE8@wvV8=4P^Ww)qha;&{aUL{ccEZ zGDk(jin-wT#lMyA0m}~VBDX5x_4~&!@qR8|qu!L6SqdKamqoibMQXK|%$=q#_Kr@j znp@`BXG^1khmQ6LCw(Oh-poyb5=UNVeFKcom_te_{VO9*)S=$5mznRF)ig@J$Z97R z(x^+NMcEPXGdpW;eHqqPEhtivN{likpktQTO!>mNi~ko`lHtZSw89+fO+GZ9(BBid z>8FBmNgtvSqA97NQCXomT~Q<_)f7cYFr?XBX{A10TV%GK-L53JkY(mu8__Xm5965n zQluco`&j8xigrvA=N$(*blFp#uG$ER5+S%}M%TcqBv#|9HVpwQ1wxEs-yT;)aS?1X z(`zVJW~g!1m`V>;NAVM!G81aBR;ut={l;Kf<*a6G5OIh>&MsBhh^lWH@L4Y(->kMJ zI2tmsA*{yw)(bENpM%dQ6j3WlbcSJJXOcGZnA;9dxAVG}zG$<^&nCd>evi=}3JjOr ze-j+*r&=2(gndnl!2_{joKfk1?dMJgc=zqb$9b&9eJy5HD>6(C`y=Vdn-HFmHzL)3?L%|Lv4dcPGC7$N2 zG*KLA4+CK*la}!)+Gb31R+%UdbcX@3qe&q^9w0nm38gnUda+I+a#5ZP_z(thWCI^2 zq1tc3KFgu-)}XCf2J~9{D#vxq;n=r2ef+sHw|kzdBpoj}7{~*hAs=?6`WeUyY$P9c zqM8pB0-lgFIu=X?(g35#8J!A#1-=$xyVuzo${HuxUK_ht>oa?sBKXpos(a=vAaR?r zS>y=0Rfhv9*tkGu@``O=51lBmi_aDoMzMJf+>=ZjOT^UI(1@$OPw$SKiIAfft=B~7 zuHyV!kZb-oEGoCjLpExV6zr#nLF~>WFtzorDcIIR$lh0kd*?$J*xDWEE?=$hkI)r} z363S0E+kz&DVVZt`wy-t_~8}b*Vko#vF?)RcC#{U|6RQjoTny9MV;7IUsI5w*S2x3gs@0Ljk4j1pY`1 zSpFXD&j47S2re%T5cEK>sP*Lv=~NhUw?_jX#W32lfs?W*mk79aX@IvUg0eK=Jpw*o z5^(E*sD?O-f*+D0h-cu3CJ2HG>}P=C5doZ(Ljj+{c}oIhJP<}m>xnQb4H)u3bVCq) zU_W&Xk09V<9RvXd`zc^}L;;aYeSZpXD-E#pK&+JnSb8D^)%sk7JXA3}@_@Z8fbPEF zwPaMoEf^?D_N!KX|71IpS|2I6RSqRu%TyMn%d?&taIg!@f;eJ;-DOeAkBtp5_;P^^ z@+g)FV_6i-6F8I!&Ps8Rf;zDSV`qZrq{7Rw>z7dL9A1j11HF-9_Ndp!;L8WzmIPpW z)Ei;6CjfyZ0nr|gDj4kTE!vPSQ3>Ia7 zioGZ`pnEu&BZ1p*tnTr@M=(bUw_kPPQXqw&uTx=HDv5XnAwx@2tEp3sjKyElirXMI~q>~QUk-tiJgpp z1#$tulV>;@&jd07%g8gFjOPORfji_nj>gj{QsHIK1(pTw1k_wh{>aWJ7SgKAq{Z2h z^9wk;ZT%UZS1l-3kx7g*C8raRcT4%hIFCDnJBK^1`lVRQ2zN?AuYWGPI^bdA%D-{E zdyZl%CiNqcUgU~R;Cx#otqWbozm|4g48CZi!Mh{EtFe%C*0&Sxjz1n1)cW{+?x*O> z{outLgiM6H$EwF4`MI@xoVzsTD;eR%MF#R3kQ4Y4GS9SvV(lO1>SQCMOo60s?1OHy za!#c_YF{Okdw_QgLqZ2}$Qk?=gR&E_YsTxU+lXRLE)MCjq0O@8Vb?ax-O-EWz| z#q`mG+Tr-8vlkr;%x?F>Uk`r%Z<&3E%}+XNkWR=$U)kV$Z?|P>iv7p#!QMpm^kew$ z)~}B~8j8cZ423S(KXywslyF6uA7tb;G)~||B>}dch!RMBLBnMcq<*^lhul`wRyym2 z5)zmfrHh$(aXll4-%E=4^)U%8Py=#W@$6hV+x7|DVG)-cx=7ynQ}rPhoo^bo&Slw(E`wb5IcE37 zB8J}!HaTP-`g%!e8w5sI^?EGT^hPw}0sm5PJbg4gN+qR4 z^5cA;G=mVehzVK=G=@eb9*qrA{6uYocel|K{C-S39|YUY>8?bc=a>dQlDgE8>yHpQ zewlWb)%`k$!@kM3N;SCQOwp~1!S^lrXGy?-kVi7aF$Cz4hGZa@RYE5Ix-?+90t)X5 zJh>zw+XI0_)of3M789IMMAKXco)vO#*T6racPGX~*j8)vfw-s1zp?Lt;k*dBhELst z3By?g_oFI@(9opiPnFY(b4+1%6lb8t$8M00y0=+rj& zkc=D+iEavKu+*6d)ra@yX7glq&IUX^tKaTAoyy^@&A9G8uMr*>&e8Nr& zpG=4&$y9QL;a6g&8DUApTTp&5x;J8KX8u zkg7Dr_PH{&hy(XNl34beF-;gAS58EtWDLD2EAD1whU_uhI`Z;pa;$ENhjR44|7WJGhQo(*+!P=A>6n#h9OU8O} zGk0};y}-v#_f{>bJ?(d_+RpY&QbDziI*IUDHtXA^k0d>F6BBT=VoiBF^IEi~iHmVH zfhFDU!AJJNjRUAv6$Uo#bc>vvYe)BVn=F?=eEbfFLgbFm>V{saj(!4K!01w&T;vYT z>Rz2JS7!!rjUAw$gvLur_E|PEwh@YRr-?aMM)+9=nc>?$c0Nk-b|Fb{pjrSA75VTp zEo^YN3B+eDCbQhDzjN+T^R$wa7~aM9Qjfqj*R6(pxnDbKMXfS$lLgj=9oS2gs1FS zY2#_dyOK;VlaV{Brq#7Hd25l5OFMt%DE+cDx|>KT>*>#Mb@@3y<#K)~_&rkmF;HjM zJ@d0_@Q1k6)pfO}@MJRvEd?-cX1^VWRu)isyWNcd5>VU9bD~yC2_& zhTrMP9o^MxxxtPGmO^7ZAMS-|N{<`+g8k{AvwV4)23y`Xe+_@GsNw9o+((Y~uosYZ&jwWJxztPL2Z^KV1tTGh+e zluq+7;G+_TM;eFcY9eahCM;U5?^Ni@fN9Y+5J?`$Xr!lt+)0cF2LlP1jK>G1LdQ|( zq1Bexq8{}I7z^Vvq5q?eN06t*z~%o>9#)qUklgv< zgm71`!6OTp&j1h_2!7N>ZUZnMsf^q3#@to66#iU}of7)%%U9~a*&adwUqz90>ET4M zAUi~)13!<=VX?>2rvg+T!!b((V8I+osP0`Iji%Wt8tc2TP_@^xQDiQ6-CGQ$#JPvx zh3cQNqRQhnL#aTA(5vKxq>yH42?I4PC{u1&UfdneIVmAKq#L@$P)G#|mD6c4Pp=v2 z=zkqcetCiU_d}PplKl&lbf?ym4 zl+OsbgxW^?&)6hr3VmVB`_I}x{;(aF8L^eOZAtU@_E*lB8l~6gX{y|JPiv|fZao9n z8j4<3N%vY1EHEb9uyP7s9`OG~{?iEHyfoX}fZnFs7Ma1P*dA9WC-ul^>DmSSEsa@@ zKY^n&!5ffy^?a7GRG9B8l8d=&8~Q$zz4^tS?OB6sR}ux{ou{~~28i4q8O2%$FkE9f zYsky-4hClzkw8s^qiM@L5lH1Yh?OrU!tl|?HVtUR0uUN1-?YHI%MCfdI~)_rKNX>5 zV~H`p2y#Qt2yFxKip#ygbkCOmQp^LUk*iSLcs+_u_`tvE^`mnx?$TSOD`{Lh+&(4A zXhz6NQCuA_D|sp@WK+&+yG^TEPB%K??|RWAA(JlmWN<6=h5Kr=LS&Kn>fzGX*y1s~ zP8Nme6uwmYtAmcBmTr!Ea6@f%L$Jhr{58d$CKKElEO3QmYN_aSetD$%!kZ6~J8fk+ z&)=P>c{G_wAY4B!>2) zJLSChLSlib)w%KP18?iyzMz`3M^|`NkT)x$81$DPyK5lW@N38ema4u!+39etyi@XGeTeo6XsupCL# z&u)DUA^K7PaCIYJArj*fnKwsu}8mYTaIZuXFyMgd2mCY;w}Z^NRhwsFp5g~ zL~OzTyMxlLZ{|LRdZhN`!qg739%@LDFNpv?wm}@Zz<$#5?@K~}@kqQ+@%NmR|8gbK*!^dx@^8b-U*>?rrf)u0uH?!4+7C7;TxniP%cvGj9}K~{wbLt9`Qg2O?61ntb}VY>$j zaUuBFk>`45biJ&8oYa>Vlej(E~ZoLM0a&=>|28c?!ahJ3#(o<$O8c1Q@adFO1XOngPmQnV6@!yu5m z=UlWDNx|Ti%eO9>kAJU>#mBYxEdhT(IfjpG|62zBrm`X**Pm}G_&=4$__+Rl%fUZY zX60+x3)u+TLDhHcf`6tS4CNu3F&K8F{u#^z-QTjEWaZ0xT-7tV&hCHif!=UDhNl%1&4V9%*=J`|t* ztYhk^KL9hB9jk-$pubWW_rUJxgC+!K>q{`;hog@K`TpR)PwL+>_$l@6Q=U?P{=d|p zlz&S7VzoYXp>{b8BqdNLqvox{@{x8MHjhmD|D>rW#hoV;96)ggV1i3g_~b(B@!)-I zPra(Ih8V;`S8F8!D?(T3Ova*M5q3aMf3QOesxqcy%?!r}_<4)`PfvuBS|5pzMzefm zlp=*s6U31a{P39xZbxxP#{_>xu}lxh84Y$wd}^K;rJ+vj!jSYygn+vxL`@Zs0Tv3G+@*dF<%lOA=Ivp!8aCsl=9RotW!YIK7l*@ z*DGXy>J|E=|JN%ld+HT_)qCm{epYzu6|N z6p23`i2nl$0hT9&k5W-7;4o2SWVc|VNvISXFkk2I@t%nP$Hs5RP@ckX|FeGln?piZ zDF0c8|3-t67Fj~yB%)w;f0c^(**ysUK_ZG{oRZ(|sWTzV;c!-vlW0hB7xACv=BMou zx>7}2F&rVNWl1_vl>W&+>LXtTKZHKLB*glkpZ!07ImA%_>?e-FM;pOK^xYuC(PSo+ ziKxsV!^vbWl%HtFK*!N!8Zd}Gj@`cQK5!%*MP_YZ(v`R_T}GyBZ{C%-DP2qEX}{H_ z3YRV>(b?9 z2KKI9)0@(DWDLuDF2!rHD7@$^#Li|5vADd_E5t5l%dsF{`jrf4v){2KycR1NE@rE- z0A9is6`?7i0H8hij-tdPVMnYJNJ3%mm9Q<=3goBQ@=Dkh`w9e5K)h78#2SEf6e(UR zJ7OI`YH&Y=q)^3K!CbI3I7`UtqF^w1lcL#cYDcUKNKWDEHMK3)1{9_^^K$GD76IP~ z6C;eLf~mn_!or$`InMx*_$2=%ZnZH|`0|fz-EXc@CQ% ztFxjX(H0yZy7>;Js)#-rHhWL6OO+ED7`l2-Z%Wk>F?8>p7Oh32aG>`PpO`L0<8ny% z5TBYZM}s)%dooT;e@ByWSoCC^nyy9zI0$=Ge5QN?!1k1PA|+P|I})8>5)t#8gl&md zFu%ywO~S6kS1>>Xa-*^((Ez3sNx4zkk>~(ZQ}&BU`c#}1&V@@;X8BlM6b^=OiZtI$ z?MQTi$wgdmrnV*8z``PDH;(<`B9u42#0ZnAaAYarOMGndE1Zk+yKe@LAN^8paZhLuWWL4Ai`v{KoR;coA=cr6}96#bs~#B3oRS5*3*_|$AU9wbVCpK)ULJDx<;;y&ZlY&9MrN_ek= zI)(b~+2ON0loGTA!gpTJNKnkt6A0e9KjTN)LQf!i=l2YN0zp@SymNX+hmwM>Lio<} zS>dyO6iL(ytb(@z-=AfnTHzGX1#F@;qfZgO^L|E-;)*^+@b2?7VU#m;N1A}I&u*R* zzcA(uD0~+7oS2JL3?&A@Nzo_yEEz=+z)2o3&6kC3%pP$4j1W}^>m5iO6IHA|7y(Sg zll<`Vj~MZww#7?bF>_!dzNGz2Pq8ha>PtzJmr`O7pemlE^~;Z9DL`Bdnpcw0h!HBA zU@NR5ridM?4?%nslD02Di8TYKaV0HZ8i=_9r|~5nUNQvjVHSx-1X7^~6Jwb2MI=&5 z$DVLU98=K;Wnh^yNBp6(2+F`VWskU~A`H^O5|;~0!-5XvV)?&TOG-?OIWsqh(sGmN z{uox4R(|cAoR}VSXAXfDbCO8?U{sctdo7==nig|n9+HHsEDa?|{ZXOhE|8jhc_8>+ zPL`2**`11dz2{N~<|h_Z)NOgEZV4IGZhSngW7@2)hK@*fVjCR1VKg(1u%c+2NA$Zzp6wl=)$0-v8CN*T# zQ@}BBnI8ZgKw$nWKQ%gfJ2zrz3vY@lZ^Be&10DI-$4i?PYEva!q*TixbRAoLOR%9F zbb4wHBT9b#j|gQperE?gO~WjwBggjjnMtjGl~uK%`8PbDFy|>NqJQyd%+E4pJcxAN zf0GHyvA3*vt)E|zqwjoGQrGJ!fpNLalSC~2ZS8#X#XXOE$?BcoQJ|>0S%Ju_O5=-v ztT&f}nZCgN{=%^O!bLT_um8sKzm73q2d_&cR@M*3hWyQZXpLV!1C)ts5aCdoc@chp z;GU3!inh*cQetX1csrB{w@h}o4I!9(5>^B)x^@%nmoc^9{F2fkew+5HTj;hHGxu9n zEo;mwZ*#i2hzG{$ZkCFaS;nG$H`u)|va(&$x=8h7P#0F9VM!z!IkY_+mnWT3$u%h; zm#Lti&a27*Y7Bf{VNYF{jkfj?wb#1j6J23AT6{x@-oZ;xE?H3eKT8eu5W^VUbuD^X z{O=O@poMFwP3Ke?AzuCFyEDHu&x1LKLsn2+GMp?Xfx5Xc7p=EI#i~dJOO=trGDs|Z zILri3XatR1y#EdeGMj(l_?GNc=`+FXtTyl5x7Xkvp%bHqNz+V029dPQ zGJRVFX(d^fO@BH?qkM7s?*|Wd7Jw~le$+l@6)DSrTj4!{386~stnOlCG>(I7cInI< zOI@`|4oe-+S9SjE`qxp?j8POHwj1+4|ByOl>@b&kSz*w>aKwPJbX@0-33v`Q&W6uY z6dFgM*-du*W>G{LfO_;d=*L#$P|zhBy%sA};gk$?xD+)Z~Pl+jR2FX@MBeX+B3TL=*lXb5YmfZ z#OG6DX(eNo+c!pli4vP{{SDsn|L(pS#VDq#kl64!LSer&h54^lOwSC(0Ggk|Yu$1u zE3-Qtm82rBEti+h2Gi|7tKebIat&==jQ7U8Ht}-DSt;YtyLmmr(?4F-Uz2>5OhEB+(sNhB-MzP=^5LBuHm16;rde0) zjdm_>Sp{w^=;Af3`YBEZVej&tB0jJWkj_?er}ml}Qa1mFB zRN5z)ueDSehG#8*ZC|cOcG}pyIC`N?ZqG-<&du;+o4`rm&}%P2)hEh8IdRk%Re@!7 zsMp$Ab5K9G`!Az=?t#-BNt1GgO9Z#01GAQ~fJW!+hmurV?n~u`# zx`IYyO$E~9aOJynnOC}&T!A(F@~HY3$J$52H_}x5<3&3wly_&Yz!kv-4=OuC>i7i= zk$?J~ZGz5Mvd^uJ$X{g@ZSR=!R$Ij%K8d4inV6{^!jB=ZXkM9zxEC6yy}0BS z4_8T$2>~LH0plRW9e4 zPx0xy%MX$CZV$3Q!%d-?fo>r2Mxf20gtW`EQei(+^9eCxPJcrkMizZzFh3TONL& z=MA+wXVvA%_HxWyV|e$9?@c_)vx;+Y&+@MZ98>z@E(3Cw{5 z1SX_3#^kbT?xVs*q@vk|Aiapn@DPJKMZ9{q{F@*H=&&>Epl$Fr z*>vejQunMkk)7uu{BvsG>=O$w$?RIRh(+n%GRI~Vs4_Cr!F~>K4po>WYZJ5`p6q+ibNtQsBv!-F+)00vT>EL zeT#}b>P5DXQ&iwQ_xoyoR`_Yu(kMGW1YH9NjDg~Buw&iUg|Q2tYai8MX4ZfP z&Q-(mU(%m~NDsQhV#C<8e&pOY4W>9k`7ENB!t(X$xBjA{VqQKR<$0l0Ky*nC1v5>W z`W=I3b_)%ZNB#gStM;p6{Y;wMDkp}@QZY?O!v3Y!^_C=R-;#kDGHUu9di?&O+kBjx z&CFFRUcP@wo^2N4R&%S!^6llgmN`>rC72EWbFKT{;0GxlC?9)Pv*9Q(->@ZHSd^Gc z5H`gA>GvLIFJ(v{6{{!UA1>j)`JHLqdvqG?Y}7-AaTOV8if!FHOKIS9SN!#foOsgvcD4Vuq* zhmR2^i(sG+P~lVzn$PTGgTy4jvFQ<*fMVzs3x3H9fEm;y88j0TBfi1tSuh6Y-- zIDglx1kHfL1d(b3s+b5jpdW@{l*#pBlv*)$bs8w3lHr?!Kuu7UOe#Ib3~nPr+uH34 z8nN&Rw8)qQS}5yF>PV1tXpj_Mdj{2eMwJTI6Hc+ODg}vsLudeT6xo-?LE?pdNw7gj&-2$?<8+E>4Ut?%ZLU1_%g;93!Z$uHPuNfW zdtLG6MB}pX+3}4;}e^Adfb7J>|SIadq zIUN+MPE?8Nlo*Baj=ja4&7_wudm zWTZ~FBuKiQT$+Ws%4FG8k`D}a)2A(gxA`-T5V!bW7 z#!oF%MagD!tgY>?m2a@aMy6D6{C2w@rNg^4r7QPtW7{fS-=6m^Iz4@Ma{&nWE@JhDwXwsqv)!?7}-a7~P8++%!hK-Ne*WFPYJF!*DEJa5x z(m7;nZKBPAU<18N^grkb#zO z5@cOi5Q3)735!utkq(kcuI(CH8OJ{U?r=mc^^_i>Q5-VBND7MbIpVvj>e+ z?#kW#KafK4O?{4Zr46a>ETep?HIL2tcV_K#76T`XGTZ9C-s`i+2f9%JgOPPu^j)ho z=Bu=|1Kn5ZYdUmwMrm~y31uq}Oeg#nWMsh{amv>X7kmTNSq^ct5#qUGg(5O?@SSY! zju0&er^Db&wfgswT*hulOJ;ZChJ51Qen-C(P_rq5trApXYU{%MxRvXRNmc8) z*LWAW*ri~r*9WC~Obe88PhS)5ZZ-Djv#+o7KO_6Xvxz72%TZO4@}wriSjLjw>`jre zr4#HzI=E-1lyRYL<@}&mwf>Thm8@Q1;dYMjz}G4GekAv3qBF+Z%}#!}G3LgF3wELV z^}9`o#HxP1ZyHLKepFDdE4;i;rC!t={nkLWUbGqci;VWaZ;}O1O-|T`&i(-s9r!mS zh0DL6b28M1x7}@XSSEy9W>S1*JVCHFgr6P@3$fIOPlmsxpaF~8cwHq855z|a>qi`| z%WQgi90l_>Cx=^RQ+#DTLD)5fM;+0{LK;T4x8$z`f2aNDx7-u$DfuSewJ~MT60qi++^Cl8@nJLMcmqQ z`B=6lm7(YTd03vl6jCa3SAk@;iYBULpPv8RuXT3%$s@@=*_y^Q`|s++_Fz_zNHrX8Min)N2`9Gv)@2Z zgGp(srG*Z^sO^t!-R25;J|a!|ptgT@8MIXUEf(tZ-a{0hO<&6tlf<j>+gBIlPi%U@>& z^?K48?)KS+(B@gC(?Q;$d?#gU7~An~^-sCJIJRi+j$H;6K^K;ZEkn{8r_P4;=*O`v zC%ZSdQZnLhL?oG^J4rZ__55TQO zohyFR@15Vf(+&MgfvJ7=u<3t2kHwIRs-=TD=BDgl*?HU>DHbh^Kc;&dW58|K%A)U9 zpI3uvcKE4x*+Z~q`}OZiU?oc$dQhFG>DGzlUyd>-{PslBfRg;(?OyHZ_u zmV}gUS7;R5&+|@!G*1OuMe#_sf&B zJS6!oU*-+Zuk{DaeSSUC_;`H>wtL@vc*J@0?jXc&|5*i z4^V+>%}|fCIzf2)lV}@n+>)VI#zFLjL=qOK^bc8`_!1aDjyP+z8bH9bk_)gHMO-}e zAH!xb2`tbUy!8+C!$cV0WgQvV=&+-@pOIW+e~@Q}w96qpcccoZqMc4QY@6pat{Qo0 zd=#R)*vpb$9~q=Lg@C@l59wmsd;wr8BT}4VfRrQ_M3w$PDJ)2yfs)B<07HY=@#^=L z$uXkDr4^#PykrsNY=?LcAELs^s#`lOH)it|T0LDI!e`&^>c2P1HQS_^6WJ%I zec&hwX_qrN?0)EF`^>^X^y7Fbi4H2OiN8@}!9oX zY25squY%*BLUnRoe{7RE>DMk`G<43DSUAA51pRBX*`q2+CrasOw(|u2-**L?9tzJG z`i;pG*|q%XXtq;R^5LKU#kO**<+6VssnDI{V)c2NY|WX0{W!*3+GRIt=m>0*neL(- zv?$bR{%~#2$~}IIzL^rE?auBZD*u;I8N=Oz)g{(D?AE(itl>Mp;tApW7@B@muXsqdUE75wFL_r8*HSY;t{K ze!C27p@Ljh^7K|drTeJcKtZFc1Y5aDMd4jLcmJP-P4;eVe`;>+(8F4?=|kljhV-o^ zlMj9rZTP34IdJzkCrrtpf|VLELHJOQXk3fX5PYcPG_)&$Q#t4}iHV^sF_l;V{bFbc z6JGbgi)e9iQIHQ$cpeRnViHwg8NIq>h!`I9=c~>HP9;>b@j^_H1XQ+^-<8@V3=Jns zf(TDqwmx!aDl~*2uYxC>9g3A~O#Ad!6SDRh+-m2f_m)eL#1suVGF7x}S$h8FVRRwx zd+B*kwWY2BL2V;_;E~0kW%1N^2o`la&G#99gW4c@Jl$c>g(X*x#w*Ko$S_R(t>pk(;P zRcz1;kX537F+UINVURT`TExw^sNBwa(L4E!rB2h1gwVFLsp6j;Zt7*M2Dd?Xvu+UP zdwdXShW}=@_^*yOg`il)sj4V6Yj-UT;rqcyuXF-U>{;ntlDC(G4Yy!}t2F!7H3b%n z;>#*O-(!HqWSiAw>CPvYUELq=-|7f&^bid$_Z~%0-i>!Z{@Cc5zO@@iG;ljKR=(b8 z=(yW2OnFtstk-#Iv*f_xDCwqT!F9jE!amMi*2b%)k<#G%?BL-re{0!{;OFS2?kunR zO_nCPf&Pk)%qTwZo7NWH*+fqV1-Yx^#oheY9h+!c0)oUFMBsj9@Hx+N$Deh13{oqaZ{AK_gY7gnO9n)hqdFs3dGACvh3>IN^EUP?(LZ2Z9@o^(>Rx1A zF5rB7zm{$9bg8qNNy|Ndcc4x9`C4R&&f`-1(Qc5*+j{4P{O=lHt(>gO7}k6*gwfLd zXs4O9eSE9%*#2Qvb|;&EYmJQ^54|ma9BSZ21&tQ# zj`IJG3D=H(*q(2gOm}J3Wi%R$%BD8)ZrcOum&NNnCaJOQBeNikZiF)A)ZI1yp zYv2|Jqm^@^goOCu`DB5XzZ7}wL1BM*_-Ub#gn$}974?uHaXkGAG;48=PFY9#@n0`M zQc%8V(Cd&OQ#_wA&}((6qoQmy%byfT-b0pqQxqW@s!{vYF#hJjce0FhFp=M;R9F@q zpovm8ba8PK(8W)}=O&EG32-6g05l~TPW6fFWm&igUe5b}1k}`$K@!a!>au$bu%S;* zOGYMm`ok~i#5tJd>SICjp}3j~K>{|#prxwf9glaW%lC=7JYIvO_%^zgj*_Wpb=+bd zDpOKHn2eR7#hJK`h0G7SMgvg3{uj^ti#!6*-Y9Z1LSiyJld;RpyN__-SnG$v#bMr; znVIC(-|H}q%zi=VCb+a7nk;<3qpM;Hhf5FYS2w+k%T4Sy{;~yyeb()x7FwW@Fqmx5 zGC2o2+&d+-7>N@Q9K0-ys&6SjXr_$O|7KCV;Le-He|O#1meFLQ9SYW2DM;TNBg=Mt zm3KqI(KI2qioX8r4am?e#D`j}u%LI~#kIINI>?Uoz)5j#Zr!?bBJo+DDq7B8q z@}X$4X%abS*_V0cHYxL;nI)e%evj*;5zDOd7T`c&RLGnFx22 zegOjYsToziHhdpFV_C*|PRf=$D(ZG5qpM(PeY#Vr{Et^>$7+>I{-gcxZ`Z@{^U^t7 zr^HHGi42?pzPk;x0&i)59v?o%XLlbWJDAw7&Qj9} z4j9>*5A#pjcUfF}t#(g*=Xf49V3s;ReJs}*FfRxVv^+jePyCY-jJ`Xg5|8)Yf&(VKt1HNPmxzT8r7 zHB>6dlvHcxu-A^jcFSTQRP)zo+@pbE^L(YwA=;;hA)%EXdNy@(d%3rk-`gj`qLpTm zKmNY1x2^j6n-o{R|JUm4>Fcp#qeeg9EJrCZvRs>srJc71)80uOXBXvJBjnx<<65xvT8F&~r za)|5F=iPi_z`=c`V=!W$4n}g({zjjU?y*YQI|lnXsa#fUQMRWAIX)@xj7L7=P5RG@ z5#9yq8O8NJC5lf4-4{p1pEzjFRz^;`;gvxZeXSZv5YXf&9cIgrbK^7XDg=`P@9M4y zY-aorQHY_H$Vv2`jC!goWH&^4W=U8no_&8EO-h4Z#MVfJ$5}I=EYdNG;<91@l_sZ9 zW>=R_90Xc;IOmfg-${h?TSx@fQ)F_1>8Ca+NHZO@G%xmMptWxV6hhR`+jqGL@zzPa zm$|9S$8x^EcwQNyq8MVdRBYMm{8q7|+5|Doo7 zYuZBl_bX`UL-G1Eh1}}Rae?`zMdw$x{NoKQ3i&3_Z3M|!F2nzhF|a23T&_L3zNxad zdM_-LVs@7DBvGEUZaV8(ZDfyDprd9!~~zln{*?dUosmtLFHzAdx(4yd+y%;K*l zP^YGa!KZzOk$U{Y1j1W==g$C7-;9pBy21QQ5i2PS!RSP(GfExrcHiRqv(gLB>`XOV z-Y91$1-u%^yYW;W9&Mu9y4rSnAB38~ z_-e%*@k5OV%lz5V%k`1rUW2h--9oW#=v54LyCxr-c>LnAtWDF@YJKwJ#b|J4FrkT> z{fb^sbWLHC+Fp648Jm)Zf`-7K>TMZzA14VOHX0>fI;M5j9CG>&s(mvaH`hM z$;_YF*pc0}u5J!9Vcm&h)phB(A07gq8q>+ZV*={sPy70+b^Q$b+F8I`bF`BgWxJyqs|qP#jV*rPJo zzM2yfViNFtheXR(PYt^Ga<`t1m93L$L_DxBaD~zh9VR87&g=A#%b`nvYYJUro<^zq9Mc7ndiS2z+uPstgc^1i60vN4f&4GUMTa>;OA zl|Or(XtwAWxxqpsXPF-8|A$Yui@qcE_d6WK_&hpt=EVW6Gh^iNub5_$!g7UlVNv^= z>P2b8u}s?q$*12TE?Kjr_B(vVSSRPVKuJQFxkqe(C>(rza z{uQi9X;b5a3OyBkl?pj%vczj#f}X|$%|W+wTySd)aV5@eZC<-BftS>uvrYnU*!Zl_ z#r;3?5vNWFB*hZ!IiN{QebsRd$9nj_=Zto?utQW*sq&M_*cAD=zb?X?SMFt5>%uP- z8d%yM9v&V4>J|lPud=QLmOsle^2k#mED--9h;q+h?9+}oZov@{AAvQ}n>+3YnJ>f2|OfT<6Lv9S4 zJ?gZ_!{Vl=q@3e^6KVbAF2URKDIAPet0PwIM0sN4S?(T7(9&gh5v zUs1bq&py=z;Ur(j3OZQoR3a{w-pd~)w<{D{fp3ya8bF-*W8n(~>&Y951&uo-_gGlG ziqq6vKmFEf8O)`rN`4$qIhLIbCA=Ia-gPfg#9GwxzJLKTo9xdito08p zyz$!0hKLD2Uj<95;f4pt2`8$#6a#i#JOF;58>q6*Z6_e6eyeyKu_6u)86i-_o%`0h zH)5;ju^OKgAB2md-Ma6fN8ogYrg$MU|JwT=xksfqt4fd9g0a}F>;C&*?{UDjQxUCCXPUAvzXDbZ$ET zFhT_(h}rEDy3S{eVFi(kbD4BM%|>C}zm(l|;4g6*tqW&S#1nD%ujVwapJW}bPx#y} z;usX%jSzVI)z&9+=#kz@rX8M~yPJS=J6{@sj%@LqvFtP9?a_$s3 zm(Wm2wCuV@kr4F8kLHJ?T`cOIgz5(IF*K!Tym@_{Ef9wcvg_>gl4>J(5Y=Td2JJZP zyDl0(tu-Nj>mhNf#!fzs1uu@*Px@|wnaSZ-asp>NbR@BW8JnVEfgA)MTwEHhews!F z4+5yGFG*DZhNIH|)SaGJfHg7+6Dn%M3g(WYrh4>kVl6QY(JNXT8C|$VBj|8fwx$}? z{AN>X6X5a23Z8oq1J2$`FzYo(2ef5wp5uMBAY2!sLx8rq z;`p$-wI<7zw6V)#_NJMN4aB#|>9Xh``CSo@z67)8-Fv*n0B-S8uI_tn-U-XaC4ZeM zNJsv>s=EA}5qdRqbf!@)r`)E6N=JEW#prNGz7e$*c^|qw^LGsPgsrsyCK~pnEt$-} z81TB%e=+_WDTihL+EU`6!t2WXWk-*Jhqfp83Wxg>8tj3_KmK)BR0I|-*EATeAV2Br zG+STse*+VCy0I+v5oKSrJTn8v?e8rL%5+qCADO?b=o9eJRMLO>DAUp5pQQgrp?Qjl z3c(Q-Tm=6{q3kOH8=%0Gl6%F#DSm@aA=iFY(;YvrPaH_gVb2?YrzR_CSWv+Z!|RU# zoo2#=mJ4e_ED8g2Y)TmlD?o{33tU#xL4?9(b=5YN`HQGc!Ve%h&gIm2DXv_|M5g(F ze>3JiI`HC0p|V$mR#kX+;H{$BXH_taI%np#tnP3Urf|oeYag~O?=)9pouA^O@~r4$ zsSr(DE^S_!%0sJ21%*DhIn8cWF|JKe>j9|*SbHTMWCa4CLBBjdQBJlM; zAL-!39|-&RYU*sZI$8h$u^M6rq7PN$ zuE*i?_;=ijKva$x5=P&aBg$#CACGA};#du1COerzS;OmE9HFEda^t7*Go^1I*j&eNPh%sOG@x z6B$F%DnBx3L_Fe@{RxQy7w@Kd)~$7f zp^e%a=SeK5JB!40%jwL*MSkw-%&P~-JdkPi4ht6M%mzekG(WD79(I~Dca$u(f?Hc+IR>v>jO5jUkbgjpgnwil#(Vh6! z6E%~WiPa#Pdo;}eEmxGww^|DiZET(>o9N5Z%AeB3rW=npJT&0GkC#dY`_zfq!&S&e z@wSzJTPonuA=W5ZNhmrB^JtW_H(n-@tsRi^ocU?iWU@XPWB{8?KqHGQ9+ihG!a z1O^+!3J9oRrc}{kR?dxsK-rh`2%1(mQN>p6wfscA-q2zRTVuVd6j<>nBCr-@oyChO z9A9W-?bEK{*is%#C*oD|fQ6aroJjKJgWnCr8Zv`x-ZX zl1ySo;9C|A1}6|1%}K2mm!I86KA`x>!GM@~&ZA&ezS23Xr&TEz>EtF;`|-sZ?5t4aX1+QQ;%y zlwVy4AbYH^8Krc0D9Suli{=9D6LpEHVRPlfK*N)IbgdM`wI&pn=?G%1-r;HxJ0I@8c+EQdk$l88p2m_jtT&>MNKA=zybM zUY-$9L_bHx-nI1mxZ+^J^{icQflb|w@^sR}jbay$Lr4P|SJVDaXu>9;Pl>@fq;eqc z!pxl{Uy0X^%&27L7DHot!5Je1UQq*Ez-A4msG;znl^K{nUOnaQ+)u5*32L)uR-H%H zaNUM-r9_hosT77I-NU=**pBhm)>Ne-&bgoUK$51Ll5X$84=1_uw#lz+q>Th z5T1>Qd9l%=N_6k}V$`2>QmB>Je0=;T3!$I-QCH(k8A0_9pmDhbX3xvaiTbT_(7I6f zN%!0*7nMb1qpDoMfnxxOy?QISTMDzhpvZN7<`b_l&8(VLTI#is?8Y%r5)o5BThI*6 zVyo4_SvY8cF>3Qj*|dqUYu{|Aeh4KA3)eMDtpygX(LGYR;XGR5>{1y3s#p*IGUJ#8 zP5FWgFq*uJP9DlB%AfL0>f|&!Z7#6{c9f~Oj!YEJl{E3yZav7*+nl>+1r`w4yTrw+ z3#a*J(qc>`wA2O03$UL5BDnvE?lvx#E6Sg{lh@Ef%scZ5QemaDQU?d+=K?|dA{_Ie zDW5yT4nZ5Qq)M#kg>4M?L6B{xgZM~s=^^t zav@x0FnMz#=HbqYv{b=1Y7>MVA{mCJo)z*G6HZ?wz8V9S@%pSs0gvzN5WF#7sHj14+AKeYqW;r- za~q5dl8hiUoR@b-EqH*I*Zj@O|8@7VM!@%Z zVV80LlDm9c0?jJ;d?OJ*KM_bhzhf-FO!x7ZB3pIxj)8PYHA z#A*N4B2y+*WJogCpvr&ppf2ZlJIb7;$5Mz?9?fabJLQ@w;5WT}I@o!~>+)YqL&5sO z4R}TLzO*axZr~4Uh06=fJ%R&|83$h~CD$VrBSH>i>!$I-4P6He>=X8L_H1r_-1`WGi96ekZcfTp-3cBqb^Dtyu z=Apv4EF}Ikdsq)x`Edf@&(b<-=Chq=zCHUtNh zXb{x@^Ap`7OVUKZc=s;2NNrihuI5WxTzniTlJ%~uzf>5)IqRFTL(_nbDygt;!*_cB zi9e0GY7L87(GCp*$f9tDs_*S*MLPQE8mfW&pwIz#wDd?^4rA)4Gu**@kd+)F^rutC z*-(P?a($1xQ0@1`Kgf1!@{&jEwa3o{9asK7VS;LC{wpdg!fb zg@P(fB>jF8RrpVI$npRk#VE4VFS_;&5*B8T{m?fsp=E7h{;SZUo3#nd+E71NACRh< zs;QY8Pd_q5vnk_kkj1mfw5k=3$LM35G-65LB{%X>T9y}9S3@!P4P&jqj zldvO$T=MAaJ(Fq{?7OQG*RL24gKs2Gj{YK%9IY1%?DOo-a1-vc&&h4%shVxqG;992 zG~za-U&zErvm_+No8x1m&+t|TUYW~pVMB|BHJ{otxuNL-eU2V#Y)5_#S#zq@&dASe z5N|fznFP8xOfsR}0j{N6l_4;DmgYOG5&-_VvgS872u^;lv*24PD^0S{R+PqH}8AyJ#6;uN4)x~IyQDP~hlW|?v)QV~EZj(|09l+nu zD4uqmZ2$Z{r%=-RV0V?iLXOTF(SAGE4Uac7w`w5c4a;YJ-Hc+u@Px!SpASdA3ZG3; zIAk)-FuM{Zp$FlZBj-5w4*LF-=QRnzBCS9|AkM)4BA`?`6I}vGS`eMOsYY2G>!f_g z#r)Si)7}2v!q`s2)ny;Wo`NzOVBFSJyF|lzD`ZM`gwM3%sfhe%K$e@rnA@dF5q67F zO@BG?kA#~3#N5Wd^4AVAODtFWA3>vv@bXR^7)uidf&K>|b%(q*+KkLe8_!hl$r!9q z6C2MdwNXUBUOh_Oj$p2e_2Y*|S&IarVg4^{R>qxVy7vyQgYp=sD zPrpO@Ca4WyDvuron@@zS1qi!ym2fBe=%1yi^ZJ zfP-U(8A`mbDn-M%v}4Ags0VQgtL81ix${4G6A8RlDf1b`DrN5s$t-o4?$9n;GMoBE zTW{oVtBMd^MziL-RJbCoN_Y=1zNQIA+Kf9>Fe@Jj5qO6VPX1nI@(N}R0q5eDrs9^Q z^7NXDjV|J_1COF7lYzF zelZI|X(cSBQqw{0LiTIu>*V2sqPn?*x_5HI&K>ZB;7F}15(^`+kXW$8C_}5BR z4E`0-fHshPbu*jc|NI@-Mwv5Dui+rNs7IAXIb50KG14RisvC3PPp&o2$+?ts) zx~FATbG5l-lYlgsqLiaV4+IZ986|D=j&QS|l}0=haAlukg8wqbRYGqLF=oaN(lAGH z&K6>4I8xMRz&qEJ`JxckYC3!BOBMv42<0`BYd!LI$mC@?HlIYh-f05ExUuR3DN$1o z!v+i#{_L?eLBrgm`y`}!Df$qTm`T*{c{WW?80{S%&Q;8ilf6sVJQ>Zki4}}iZ+h9r zeYaIG=HmaG1Jd|bMD3WYH;$SSE^+sIq6teUH+)DGcd^M>+Jur|(t3SjOVvjO#*Lg# zVbJ{9Lcu;hLpe0+NwrjQEdr5V1xmC=$Il;DW&KD3fj zLTZYE#21K*uY{HEcvxZrzU_z^)(CJA3QNOZZ zKj~+xWSK5@Tt!jBnaF%Q&ya=bw%`|>ldymiX!5)1#5?P8qEi;u5!ob7M$HUzSQ11*Rt55kGT`V+`n- zl1AJ=?yqyJ>>7Kq96H$^6&OJWhds`;S{Zp1i4_Yxm7Hz<6Jw6w_9@tYxOOWVAzA~I z0<9!0N28jZZ)X`uf?RZ2Rd8fLEDrVvew$$JRUhjD=_f21xo6sZ(=VA8?x|yv`C<=b`49cM0>^iuHHCQz)#yj=5w)Ah zv!|hkw?6M9B0|zjUB~V*Q+_QN6HcpJxDoYB|DGFcg@tkB5d+5-f0s~boRr*4&)vlK zNW##}ukblM1{g^hXCfA2p4c}XhXp7*7E@MnvTRt-@@0>`wb(x-v=k7>)F&TLP=;`3 zG&<_$@xA$Bu2#r6kco5dPY>VsvMJpE(##@RP^XujwtJnnRqAJpcE=)I$H#01;vP-Q z<5jC^340d|YlioBWJti~?DYAIgfZA`39@C}2gy&=0$-qxI8cM$MCP!j{?e5`==71w z*cS~zTAsM_tu;IB#vL-LFlDUwF_2#-bfoO_9UDT5e{=pAmGdKlNkuaVD<9NJ?9Yq> z{rWkP8+*Wk>VSLnnX*Wxrhz*hXLjJF9`+*0L(F1vCSHcFdEQseV zD7IWyo4Gc&8R_4brYgZ$r$b-Ax1)m$TRd6T3qg2)y0he?={Z7qEk02Tek327I$eS= zd8X9X?iOJttQ?8@$*Vpx(W9nG3x??m`q7rmZOC8&vR#-j!;cI(pj@Vhj(AA!ApB4H z%~xN@x8fy0xlTf(fj39b(>yyqhwF?davVVda`W&G{U|V%4wN`?Cuaq@m~L*iQRSLe z+&oU(xr8d_Pb>jmn(?HmAX#g2VyLWf*N|eL6stEL_wlP#^|sC!yaSSJz!U1wm+l7{ zu-k9AiaD{Il2(?}{&k=eCW9{Ojx_{cr4Ff(|j*f$q;{N@oUHgybbF1as8l=JEV@dveLA-#Plv?vhjN z36QMt@Y(txcb)q3IpnjNP^{54ycRHXr|_)zI8|;hzIGezR^tHH()K@kq80)ISFt2XdU-|sF@Z^m?QViM?laY<4nr9pCr8;_nfvUpLmJ$a>Q%U0}b`c z3#OTQtk#yhS^}9nG*9?Csdsd!<=UvR#sdaU7J!Ap+IYAR5qjD=j{-PPu918K2o+y& z(k@Y;gjszXao!l z`E31GT#iiT(Mx$u+I`5wdo`0WUY_v<-{ZKllxn$_o3IWlg+dc(U>h0~=9aCf49VhR ztSS@)Wl!F=kNaIX&w#2M!TO`OHhMj+2qSydm~v^7Wgbe$bTIR-y0yQ= zX*-jY&!3ehEjfJU+}QSTaJL^jP|K>ySK2V{Haml@ItGxskDen*)(GXIq+ycEsjlex zAUz5br^89y=}UN{!Qc-e7IQaiiRN4+j`?yuHSgJ^rF&Z`G_jdz8`3_@L#X-tO7H#3 zkXEglZS-w+%N3a)P${m~M~z@gaaIriJ5@>YQ>Nq?*Ui7kY)Qtp?yi(eKCi1^$YLd( zSCrLg>P3l@hy(Rm}c@GUz&?HYYWFf(22x zJTwQtIljPJJ}7_X*uZcDv5Kc>j-(VVEd?M%?yvNYJhy-AELmjWCVi}7pnzSFLWOz> zF|)8oq5l_dZ5yQUC$M3JUK#vNuADBm3Eap8<-wV6t=O?{i;c&%KcfR%_tT6y)rVV# zsl%roXKwe_0<>X`&R2)0YoEb^(^%AkS2jd#({PFOL;zaR>6Z+HL&d&`xJC}O{)TIb z6jE|)pXzNiha0x=gB_FGzTK~3uL<^D2aCQ0yUvi*+ezk;(pu7tBpfV*M3XbrwfMGV zY~HScS3nt){z{R9I*S_}lFD_qP&-`E3AQD>Yu-5>2;@=);};*+rZxqRD0LODM5r9H z%aKiAT#6bYrp%4RkZxE|NTR@?kMQwT>4Yas`Ei;P#gMutGKt_KQFc7%NPAmgL9CGX zS(q=4d%N_agafZ02Zt=kj5m8K=&Umh4`;AttqUG&8e!=$nXuz(v9PoGkSe`c8GhzE zWXtTeyxIuAUxh8AsZ0f9<+|=bb$WIxG|oRz)>q}pyfBN) z(s3NtBVNb&GZfwbG>@Kc3gIi7)~J`xC=8~0(?q^rVGDuTO#kc?*^-tuGQP*_27T)f zAPgW|%sc60nXpSWdluy1Wz9)Z(F$({$aq{dJcv9-W>Um|viOdiE%eo1hjXy;4Y+^| zRr<}^qdczq;iV#Pu3qJlpqyd21z%!Ge2CS$Ie?;SUf0TTV6-V(ZtosZ-cDhkR=mps z)oOc2tSv$Wfo97f!$P%(F^O?%`N+?HG_F{{&Cqi3qc-qXZVqY*7tvUNre^6x>bYm; zA$5+fCF7}){O%9QQC)6~77ePK#%`*2npU4_TwG5wP1=|3biL_*n^>>5Dz5rAshRMA zIMYVTFe~L&8)(7<>Jd!0| zJ9Np?_X0726tj<%i0a1PS)HEr((Od%Ea|u4AkyP!HPXP68(v;1`8kyv8Hh>2V;A-o zq5R+o*3pD+PVRcYE~J0A>JO*NL7j7Y9E?JyQRux$I8I&g!t}`{qkZB*(plfu+GZ6o zvb&@o_HwlF+G6$fKdmq2*?ji5Ah=DLPF3Lg8W#ZfO$McFX||z;zdPZUW;;Mlr+pp1 zgj?>CgAGsi_|?FaLWYa+&Gb{FQj)({*q0aUqqMzO#shX%6x!-C@ZUGJJ=auK^XKs+DI88a)bQzz5x5MY7duj0Qk^ zugYrmYYrj&8{bH`^Lqzl@pN5@&De=R^pr1L{6hN{TVA|97)X?szmh$EtOVD7%Ct!9 zH2)i~sh?F;U=1LQEibV-5XJ3iqs`QLt#Hly$+c+Xq-y&O>#n2ka=wkBZiMn_XYToB zCSaVF_tH%8EH%`DVatEc&01CH3YkFRFxw44cV+qJQwd6jff3swj^S|)(zT1$CQ>3e zhAKUs6{9_}G7UnZyM6qqNF^^AqcuI?o?kdZ{c3`u`D}{@e#ygV;`1;x;A{qS!*g?>AkdKni27&p z!QyqX73<5j3%R44^n22Gp*W+ot?ql)kOAblv0b}(fsD$gQni83?cO3gI)C;O(HIf~$WFaErz>cQUB^fT3L@ApO+ zF_Fu*wi06xSJ(Z3w_`SJyg5r|(}^*{+kv+gq~crnHiPgxmU!Fm&L!-HA@;|}0*H6` zTxOqgc8k9vR>OLP-}|@iir9VkeA#8^%%@8`xDVQN`+}cIQ)4<(ADZA~G~H=TGc8X` zmfI}xmpocf7bFk7$6vjHStAI{G-U29RJVakoi}%+KGhf-FK{gZ{MkaEEbGjP*%_>* ziTKuk(*r3dJc|D(q{-%nlGtoH&{?NSFu2{Qqb=OZuWd!` z?0X6)^6*wO7Jy!OO??6Wi$8zf82V-jFhxA zQ&xVC&x5=6mXId(#~gM;Q%vk*lCCNtZ!wBcRmdT}5Y4c@72Y<$3G6GZ^N{EVn6zcc zMh3ER(_~{iGGX3P&MI0u1yDIG(-=kF%Dl~=DF&)_XG=n^Zkdc;G3EE^0S3^vttiCa zbwi@RQzofmtAsqB46Q}vi|d}E%OwM6Jozhs@3(idiX`ny5vSp>b$`Z8tK{HkWO2OY zbMYFUQCQU$r^>z*Scn#!;^no~&rG)PF47`FLe?osTbwAIk4=#YNVaiT4w3u9h5t?s zOIzvN1|#jHy_voC*$`kc!iWq7bN0ZR?b1FT@-u(UbPorH?3jW0KQjr5#|Q$3h& z7!|0ZvTkUafdxWc&8t?e#zS@8aO`_#Y&=I8;UnMdypBXVuDEkptj4jOauBh<7*6|7 zxI5cT$z>T}pT6O|6rT3u1YY|tNqBjySDx<7S^9$vu(?_^Uv}E1^33ft~)IpC=Ptl$5y!mzMgkm-K@wg4fS25sTp8jk>R%vY1*a{ zc^D*DbvcHd{@6x`eKEieFv@c{ZI}MHKdyG6s-=K;)IOr`{u+Mz!?P!C{ixww=RipPxG3j<#}IH;Vt&;v5ah=+f#em7`76QaK|~KT~Xfgx=!z85q$g zDsVM2S#Aa>sF6>M@SOdgMd>nqWPX{Quo5AwDNtsdCj2!>vG&(`0WmVxw@O#ouI3}{ z5qlSPgD;NkDLNt#G1|l@sX@{|<8(bqTTEY5v~?IoJWE{3TC#ImAy1-<;Q7plPSOB3 zK*+!G$Jh;`@-3DSx>1Gz+dkPgyP~{wGX#~fj8SD_v(oi5PRT{j-$plBCJwj}92+oX z;d?_+ObuFX^jWMwtV2Z?t?N#!N@loL8ki{m5Z{~D^R;ub)0rKMqmaH``+6R|JEs$a z@&+mMdeF+tr1;8-x~38&I@xoA!kDazSlo0`2mj$mBMTUT))U>Q!fU_Tk&;;Od&Kyn z%k(-AEuyF9oJ<+2(4pTi#AuAm-=xaKSe$V?W)zS8VCynRQ^U?G37^#LaP8E!rt%sm ze~Qm3OXV3=D-FN(OGNH~2UcKuW$I?QfLVbc^8=spP^kU#jf_i%B*fJ^pZFR)l1nL8 zpNY7;q?It664r8aEbsA9O5Ms*?&7=mXF+^B+q;LR%@KR2`#bUUcM#+3C#N1WezjX4cWWf-qM^^3U0SZk25gX z`Pu4m-ZbQ;Wkm|;ZHLY`7~f>v8TiEy2%4{mv@OsUYN4 z-r;$F!*pRg_nzmT*z2|Pp008dl>2>e9iuHDOzp=&$`*ZnFqt9IBo#Qtv z>W8V4%CljnNxZBCWBaKkWu9Fv+05gewb{KU?G`sZz9vt)kUDiuSDbKJ=5vQwv-h@#VUVdR z-_9k{8L%C9J`>>~pc1;fOI;)LzHU}zDS4vJybuTYahB`k_-T3;BkBQ^ayL5_1MD{} z?|Ew#7X9scS}rVM3B9`*fz1~!29Koy8}+U3_<^l?|f&j(+6~a z%&qNCYUX_A4|so^y|tz0*-*Sldx(}aD1Q(`m&nyFU`l>)HssCn{H~oK)dWj-AoaFV zCEvn#Q=+Zbf&9aERFC}eFER`T49(nr>yL$&MdlK}Fpbp~@OB3mP}Dbnp4>%XZKfJi zpAWh`&oS%f&E@1u4QNmR_rM=LR`q<*;Ljk?R8%0gkysq}asjz<38l*AUs7FVClxXt zJ#`H8O-wtGo}0K>UD5kHg)-$lq~l|Tv7k;!v=-Nd>zNx|upTbF7jF(^de`#y_Jyhg zeX-Ct+LTlkp?tKE&og1^PHUUVM^(mUi#TrI!%c{l_%t~MYxd=@Wl+U+~~(4Ogt=M{7z z9|j8o0U_GKW1qxNDqI)Y=GQ95+xr)K0q<80pQ_qB*>UcsnbYn7j2C-}=P={58}%a@ z9YL7WaD~R6Uq69Kdm6c+U;0s`UNAfz@ucLt{?o z1BgJjgs4&2yHA}2G?6^A2X%{4?|S;{@VHDBVWK!OXRTPA&+YJ|O0 zwiV0F-I(HPP)MV@3rWRzrXQ7k1i&5oC|3mYC&H$REjXcWI6udx<+$UJPr)K$^vC5z z{?IARTD(104iALIRCqcUj;FFOPlpKoVp}41&jPQB>QB$n*v0N7{}{@t4Da!=*k>xz zuDuQ{o6&|JoJ=Rn{YlyUVBw$dtNBDIPtMwE$DHO`TZYzKk$r?OivIAn^PgN-!RdAEHPSgujZe$FJ0WDzP9rS;~ayYr#yr}BR&CNF9 z5Nye}CHAOUiX|}oytg@nDAzB*2YA3*CM{0oeNqh!pJY{Su>r*v0hAull1lhY+*-7e zcBsXG-&=)lE+ztM%d+h1lN6;oB|!?Of z_{XjBU+U ze@g`*d2%f;%7%vrseev74dK3P-I!_y)5b@tP}Lml)oB{;FE4T)m|@sM2;Z3M{e9V1 zx|ejt8?R_jS4-v0`7A5#H+2;}lF4N^-^7N?UZ@riC!g*?n(307Y^TAu3Y zPJsuH<2Ri`S}H=QAkT`M;wM}I*EY43;S&I2PegFDxqgS?_H zaQw#_O}pcerQyl2At+#E*^Xa-F288Yo6NjwTlH-lfi*5{15~uT+_PQ;D|SLZ8LXo2 z6sYt($~?WfzR24H%{y(hl;%L1+zjw;XTXDEXeEzlZDuGluMa{orfeb zspe9i3)K!DiWT^I`CfbBIO`^3PDR|U6YjYQ%8z>*QyEFRn2SjHA5V>di~dV0_d(Wf zwuDy~+gZ7N&OXP3S!zr@6+eiv{fCJBBTXGgsB1Fb|5p7X$TJNUG^;M2K3d|7SS_v? zui=VO?=)qYCN36GM?<}S@-Cb0~4f zbIpfB>1me_`7a}t$LrijmFsLk^cxXM3*0KvSH(dT^Z?9sU#L(4W*K|(7*6+l_yy%4 z?uuhwmcmc6@j?9iicZV$TlzPNQUcVT$7pSTJvJS$N7OF3BY5sIb7mnUt*;_2+b$y3nR_^XTeH7Z#9k1rg&U=Bf>%+kyGq_yy z%XL7FGI_*DM#$^GGxqSmKQzY|2{867hoH~V-tbR}xMBH|AbfQ^z8+>UR*v`twSUMc z&T-?W)cwnW2s!7?PYj1@3oX~Ve67rZ=u6XMF;sL3i&bw`IC7r@2hT4U9IokSBiHx` z9Rs1#+DinXc3;Fry7C$w)=v9mpl{6J#YvTg_wM=8G=kO)vTWs?)HfCUwcGr>5Ej%` zLE_V=tYO~ZtmRdxs-(0I;?gX6l3&Ts+RHJoM4L-i75O2Iev&umMMe2U1b|}$;AMC$ zJkbRUPoxpBWj=j6b8ut97zlI^ZGjqlh}#j`(*N3VNY~AVm6zV1G7Y`l3-*-HvJT~MTl!M z;`cC;X20opDq?YB?>m14g?pv4+Y))G*RiLeX<@>m@F4e7sw=H_dNor1=o z-Z*4FF8BIhcM0!(NzLHci=P5QJUyvY4@USILiCh|+_XV(s&#SpelfY8(@SMX?wqtDr4VhlUUXZ%Es z*#%Q#k|m1Dyvx<3);?E)Un9j)lCVh~UgQp8!qbJO_U zEuD>g<9@|@@-#yz_!3#WExA^JLG0kv;1|%)~S>)m%n3%A_h10rk zq18jGgOk=}$}gw!NzUwn-{T1yQ=kqr&?4!Sxa(_k=(xJLcCWP)b@=q zK_+h`F9_-cV}Z4aG`yTe@cd?tngmiD~=vdWLDV?{Bz5Hkbu41*RvO1c0=@gr3`_T$PK+SE+MV=N9)qXxKWWAv()z1fDg zeRcF2ZtnkEIcmyTW$+Y7xrka$|$`h8v>)+teuiyI>nE8XPb66>LZi zhERh8Y+BY)F;|5HJp`4V|0#B5<=|sPII82A!q&QWvrYLbm(>$Js=^j1!@2^4332+T zv_4`Q=S}w2DR88y*l-yJlVjMh!nq#)p1~>tXBT@TbfY>*GGj%F!xiF6uGFn7W#9e23Tz&|SLA zJUu*I$qQpskM~uo7$=AxQ%W_$P0mbojr4r7I)oo*$zs$#5Tc{2V>Ca@E`oXaYR|*x z33es!R_R02{L4f)YfHg*xQ1X+sC>DvxFK=N8=a#?{SmVd@k704LMlgA&a?(WcbYrk zp&m+u5#Q*9ALGOiL0_0 z$zM3U;Lt`!>-ATzEe(@hc_;@SPrLL3d6hl@z2#w&G~dQ3;6HP^lT(kAF+babb6m3t zlZZMJb8hr@*ENi0#z1B-m7I;0RLeY@_w9ILPZ)fMhkXNaW3gx1o7G?Q1t)Xh7tPV( z-Pz#X5#aA|F-{t&!By+!Gxf~{$}Jz@!{mw;2*!(U1c~~84r@mbdm{Cu)jl`)IIaDO z?17Hjd}Fe!QrJI*50m{bFW(_3NZ{kL!CmX+`9Yq`JW@i@%A4kgF9&tXi(ftzH_KvY z*?CIez{nqIuyCg40XW_8KKmOB&+_jhZX>2oCzc<+5d;{6c*vJRRIOUh`yP`jr}HIuda?G(Pe#>KA|4AF!Ov_*{IXiMX+Q4BGjJ zrf6=1huU5^UX&vroH|nGrv-?m#-kRV6()&-k^hiHXN6g!U?x7KZN;#WXy}qkO$-|v zcz2jUT5BE7x3^CPt16v{uu+CN)L>Q&8y-(u@kUzZvJ~ooMS01MV(t$I0z%Z9zF0+! zS_IuHCWcPLvg4T_K(I~m#Edx#psn`mOZw}5oTC(noQlS^Ft#X;IO4(_v znn=y5%4#o6a=qZt1{#z*8T_3!#t9|Hi3P?97RCwN3)xKQ6Fs~;9lSffXZ*L@_8dOU zvtCzfk1g-y)TS?CPf+mgRPc8a7$=MvCvq{m6(4Z~YrU{O+`|iQ)5Z9F6hg&~SW$n> z4>Ud~(!bQ!@>x3xGO!U6q4C(Y&hZJ%rCjD%sQlmz?B{*ZyROLSJq4*zpRQ4Z-wTu< zKB#86DMEAFK@I*w4G#IQesym1A{zTpZ4KmEtQ(wMQDE>RuWe5)-Yj1%Dtb!|4h!7g(V zCY*^J*}%MbU;LlWw$w$}geKuEv_^92ADn4Q8S82`Ze~gCp!h087pvl5ySm_h#~arH zW1RMbx9D1r<+BaU2Z=b6RCxY0Nb69s(oPtNp2!TpC;9l=_gyGmsMprOV1O73m1C*F zP#88O@C%`$459^CMaq-ZV6+SMqdKgMMd+8$bVb!@Uay8sR{0nbHEgYFCYDjLDvz%L zLTALaY_vU_mk~xvF3hxN3@ON)<0r|lpB*}S3!2B2SA{?LbOzOv_u;NZ6Pfjdbm#;B z)l;&V)epu}#QR088=FZZb-6zhFC@LgLJ7$-y*{s^n59qVhKmMgz}P?C%AHaH|^>|wn3 z;eV}|Wl$VZxTYZl8zeZv9fsiU65JWw0t9yt65IxNcPDso2^t3X07GyH?iSp4a`)ca z+S;xCbN9z|b$9i2pVR02p7(tlw8={08lM1nO(Wwc1zU2F81>&Yu+BcYHak7Rr!LKB zul)GuCS3{TnoDMt_IwEuljhdt)CdWrdVXst=a9QiK}7}CSdn$CV>K@BUsL(F?mZi4 z*onO7EVo8*A~)!_4Uoyh#+4!6Uq=F`&4?%0!mo0Sg+}Khl}AAjG@c)<|4@5k1kSyn z4zxeTGypEpM(ww7U}ua1c22E=#Lh`z`WXLA2G$Rect!wwXZkq6U#sF7KYo9h5m>Kv z%!aLX)oPB9UJ&tQxo;2H8aC-}#ka+OSFiC$%AcO#3uON3Ms?cCH9%VkEQDWuBPX-N zxBli3cc$PbvQ{Jv_W!KWa^HEALDzY>rfO~&#q*s>Z^_Z1U+`>^qTENejSR#m zBnmByK|{qLh5`^n(N&E+>|HtufEbEFWd)$JB2XE}hxIOV0U(Vh>n%1?IU?XyYYgTc zz)|&-nPf0BuuS%sQzUM=dB7Gn;OBVPQ1C6U>~zDabFHMi;o&ElT*Wx6#f#Sx02TZc z-JZ>ewBZ(yv6{6Cn&G(ydX&VviPwDJw+6(R(K9RY-VN^rwR;D(Ah=s$2r4~FGPz0)VE|Y-U{h$!|NF0UqB2j3xrvf%Q=Zi9Of;Bq@ z-k~zyAq!q*L2tqDEfuiKSiIpm2JyTV;gc`nuRtW}T8uW0-uW9V!o};A@OVv5N5nd` zxB%7&5W)|QjZ1LY@g{8E%$WMx>>YpXP$fa-v7quoAaoGuSA_~_W(4q{gS`m>%|w7^ zfdEC6Y;w?&9U2~nQ~`)aty~QVO#?!$@obs!Z0$}pBLtf^LR8R z5m32^S~)84KmD615ZVoMaX{z`5Za+ujsPmZEdU|IT$83JmM0s+;6g8u<`xTv%AcT= z9~{X$G{f`f7)Fdz zj2OxKr32t)4f?5@WBWuNOx_c~>IRD|%S@}5Q-%oa5GC>HpHg@jN)nM)$};tO8Zd;h zEo!C!7r9e-6GAqvl=n{YXD1$k#KV%)fiQp;RNn);#N$no(SaV~QqzI30U^R96t;&d zjUWx%lbH@Al188dk|!b#FfV)U`LJclfc;Sv&{&kiZ>MokCSnt|d<$;L0gn z%3fs3!(k!=Ji^Aq@QsmpehYqJ1Y83F*IY2n8sryWEwF*ghd|}VMW7yuLUP%{Jn_Oj zslq&oLjPC^kywdmB=7?Z;2Irp%?$VtX~8?Z1wtu6<$G%7grIUU*D~G<+$O?B#HS1V z`}5of+>W+y|3t6sp374e_v!&n!NE`>lkjPDb;|aQ*vnA9!qU$(&gQ&Fn4cjo|2X}V z0!Z98-sKd8^s+4$O+(xUgK%4vL|2%^GnxgaTW$v#oZ=ndXwD;2l+o+Q!ZoSFHHkt1 zhL=Vm2GmT`A2vyUm<*yG{gVRSi&Jx0%J!7Oun4q6R*qwr3ZQxFh-G~Y^|Aj;v5>nj)**k&iNVb z++=occ~C&GnqUEyV*{abc(!a9Nf_z8t1@Kgihxgtov2)M$G5 z$Qrs72P=tRc^ycUY1q*cCxPk)|B4t0RRKaLVSR!ItKA|{N1-((c`4zSJr%#4lxAel zqlRRVk8A!&h!HO6YAIT6N9^_VF+VVzqlNF5gJ8*y0tvKxi3<_8i2SWiX)D|aG z<>`nVMRf(s-)$x^$D7f zQ;5K(b8FQD{oYvN`4y7F1Af%~)u;L^?lV;SO|95CYVn3#N*WKK)FKuZQ8vT|Av!TY zXg#bG2})d?5X8xbV18R}&&gO`kL!KvIt4bOP{PP6W}s0c$W&@^rMUf1Z@g@#lk)$O zY*Zu*cVU1p2Dzz~e+6oi0eC3Dm9mAzpmJ)!T!aLRcp*U%NEryF#Hq$O_bB*|?k_h5*jo&64Uc#D2JcV;?=S>-;*PE0 zERt};~nziWjB*qOg@wTvx$2|JcfVnm7$n0=M>7u{$bsz z$ivlmFKktw?QdBUZ(Vc%8>NL`WQS4E11I1bAMel+@30C8ore(|vop>V`KDkYs0(IN zF-}DYx?_ED2QZJfdQ2ro9|&&!q{RJ5zz<@0hyHknLO`geS~)VP99gaWtnk>!CtnEP z`xqJcazvGqIUWAAr6*NOQ3!fhEaetg01}fa^beMJ#-qFOz$>lJF9eCnPX8nXcKvxj z8g-Qpd_?Y+h{UImojyX9*?F}1BcFo3ix;JO$Mc`HJH|ipuXdlq)Y#C3ds-d|z}`q; z?=&I&ZnnEPwR?XeFHE|d8xe)4Yh=8$6X7T%R+wzb$~dr{KZTu9dmg{n3?qJvsFOl>@X z&>J9B7tailN%DS-wZ}F1lky zg#|<;?-9-K>wQ-;)8Z6(7*{)Mt>OsJcXn|8ulNI=KS;oWaA5CuQTaSr7Tr83u-|*> zT9}GUs+ISF$|HfiOp!1#vE}?%ej71atmiAp`H);dn)5#sh%A-_TcCGbQDUi0LDNq@ z@Qg?A|AF-bz?~Vug8>%A1ZPd=0z4=Y1~AQw7J``Zgc2sYh9I}>TWZHY-@a5~l~m&r zrLK!o7yRFe01LiDs^p#@u5`(wUbEskxn?fot+2cPu|a`*=zqbXzLh$q;Xh&nG4SI7 zB0ZX&Dut_&Q<{+aYl4e(AStHqd)f|Y%+_b~G4F{sSC76oiE!icMI}wPpCgtZ?7Id?gDST#)@S)cDiKAb8VGEKI_W6x@yn z)(1-%hDjL4Nz}*`eitwNE>-wlqEIwQ!Vne?alq|J;C2FVJ0`fD9NZ2Me!v6#R}wwd zJa6VJ_Hr@+ai61)#^qb7nVuW`NXIvIS_V;jFRO8%lPWlf#B&O*1>pqv!PAM>;nKZ4 zP{%jeiq3Dpwap325)I0Fe8Us+hG+E+&sjpao5aQpGJtJ8D+ z$8Da^rWCt5Ph0j5t{Q=Qw+{HKq&;eEH=Rnuggs*7KDe3mL@r`)!QoPK}9clb>f@E5OFyS7ETF5z>u4qD_L(T8F@ z>zae93O}))>5o$t#Iw1WWfv(IsLu_D?892m4YN*^58^e;Ok%^e&)S4{3j_{oYGe}D zhDKTu;m!Wu)2QK+Qq4BlJ>;(Z5?QMI^Q&G8BqnsWpXZ8=YlWGT5wiTdI@LB^<6n&a z1fP_SJ};#(+$1rs^#r^=-kV<(JBG)>PzI zVa!qCc>#=7OjIe`d2>%CUJuY+4P1G~)lT;?)vGj%`_~zFLurilm*m*+Rhg##8mwY^ zE*YTJwCZR3AeOil;i0Om^<%g4q(>JctKPMc=g-#-lszqEhwk6*NIeGxq3&=H)& z(YxT>@xP!ex>co}D|da>3eKn0rQ7IxJEd^Yk zJ>O(=&lK)3L>}5CITVyMB4_;(s?x9aY1B|(5wDXQag2T!tMYuvG~9hxZk5NoG?{SK zlN8)jw31JGlUwg{?Su2e(W{2afbs%@h|%3;g^JO68A6P)d|?}GUrC5DuCE59hw?5R z=LNsFmG;RlIDlqj9mm%I(nE7+fVxg~_dWDA`w#3k#=%k4^#)X%h!-5FfuR{v;-i_G zz+79p5L;ex)!J=a$Af z3wSGvY{0cEB5c?$8bj$J`1@=VpHRqH10XzJ{$)NZ?A zuk57G$`+nVK?}E^#NiCE)9po5?x4Baeo$fRCZoCHt{DfP@882yr=1*w6~4K zEaVQ&51Hz&NXcEP>SK(z^%IGTSSy#o+EW@ed3z}c1ACGAsAU0Pd2Dqgjg6}GdF6Q~ zWWb9Anb!ltf9!I({~YBcLAh+4lcs0-%NMPuIy*aO7&wM_OnyerhN5yg0`XLZj zX#4QEP--EU+KzUmE1!k&_A$rKi_7nP6;8?}#^P|!Zi}(~KQSt!lvKH2d(#TtWC$%Z zlbrKfExx$P#B<3cUtF`w1@G=3vAi!zmmle?Tq$1DipO3$g4Q0rFZ2ubVV8JBoi_=^ z#ESbIiit!16NQZWQyjLSQX4+amr!R48S7wYxi}D;s?i+#hoqD>_$t#R=TdGaC?f=jDk}u=ko~fW6+`^i4XUs|b1hEli-9XQPWU|NRO*4gk!8!H1 za=Qfy1{|`NBoEW&rfnrn#xUmE5e_lL2*xGbLra**{kV6qJ2VAs@Oeh%k2t;u+7ziH zLgmx7f*8}Ucgz!V+-0~*f3k(`W)BWcwUyv=98oiwPD-D}6KQ`Wx&EW#v$BCJvjYEn zFPz-#ZVHpgD?_%K;1l~8b^e4yTB<4W)FJZ?z22AUeuT(q1%!?<*!+P#=0dpL?tyfYyF)EkhBPE52Rn#Zo3Q&7s+!x_;#4uy<@&Sxslg?b?j8(3h2AiSCxk zS~1FJViMH|a;nAS;Jsrq7E^aKfX}qEr;eHq)u*AYuuw-IeMSX?OksnIhZRol~+4dWnSw0XW<9WNLi6$78D-M8IfF1m+E(W zt!PtL2QuynW}~h61fTs zTTn8r8<2dbrOR*}rw>pQ@G*Ch3H6}V2W`-P5N7;t5so@<9;j(|{_T-H7Pmr>90yal z2z)7qUs3xFlx#3I+H^0c?M@v&oleKxs;sMUHT=ew0NSc=Y9@;}42<8fA?^#vI7H&Q zOVcwkpH$l|(@VVYZ2N?HPiE}M%+)iFo-$_i*&9(u&^VS+O|9Y=?%vnGi5!~gEZ

    }r@f_Cge(F#ZBQN<$9 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

    lf0T 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

    cv`y(2Yx z4k;`w{%EN+RGlp%6-T7TA}~V>nAwUJkq^UsNoa`OYOqjX}^lw%JX1MQp61WqUEP&Jr(< zihO5CQM7$VV_%}r^m4%jx2)VFOSM_pP_zEr4;LD#8$LCEvG=o>faJpVZ9ZwOV{Y-e z-jnOasHcdDC(ENuIo>;Ad;Ox|z3qgl4u@s|QhEjhRn*^+L@)+@Aq}??*gRZ^Yn-Ie z=p8;iX@+D^ribn41EnHT2sLa1ZPSJ<6^im5PPEg;yi9fa2DqUPF!xx8i)x?MIE0hG zWQzNM4=<@PR+Vv=iooiG4Jk-)0UeV}^lwx@NGuN5)$W?S)hG%U-4MXDY z?QW*?-Q)I>TY=C!08e=TZ}ABtVDtZ$5CH+zz|ss5`T!egum5Ok_E4Lg0F!ZG9PQy? z;NKrsLjI^t-s692-E(NXjQzN{bgM!vKNMCF3E{e=GNRLWIaN9E;do+1Y)c|nNlBMh zP_4w{*%d8E_Lw%5?T)>{kD46p;G{wxcmodz@4uhGU*4jHrJb>Xu`Vzs5O}11sFC8| zbO1Ux6!-DBa}s&fFW~mEce5I4GBCPh?}=s{vrt|h zQ*^naPglN=B#LHR7*JmRUgIEb$FjC=EkacnK9lle`DFf*X;DGf23t9Pz3iM#SKbcP za(b@i5ina98dX08Chn_Bga5KB{{TKb$qFmFN0_ZM?OIgk!A0gs0R#7nkMKgQRU-OA z@{|xdzEo3>Q(xa1Bu!(aEalQ%i^5^Ub)d*{K7k{8r1MMWIfj?%^G< zj2OS&?O$U0V=`!K3gA)NdYWe1I{E-%`#+wQZ@7_t=uld7j_Enr*yz|9rYE0x`UK}# zGeC&a6_UkuPmV1um)?)6Yu3ULyL=iv)3{kYqoRBVjZW`x_l#d3eBNi4?iS?O zsrSp}rUG@9jed^EK?HUgS9!qDpsz-@IWC*BV#kIiPwIFVWv7TciF}*rYgLqdzP@c^ z?U+gA?1`Ov5lIdsG!y>^z&OmClaI^o!vJUoj5ik@^QCei>xvF&8%+R81?slj7(@odlMM9?PW|bYmBr0wReN($+N|n@mbjE!yX>a7j|H1B}jZptB8Ea zpb({pp~SYGX^gBxhU;2d=??2XcxO8uaZy!fr!$$+8`nxKXXV{GmG=9mg>f(I@;^J^ z5F`kxKX;!k=~co^tv1_u-Q!!zp42&sNJDD5sEE>vj%pM{zvQg%M&APGxp7Thj0CWHFajz1D+dx@0pn95@{sP;CN5nVg-ymT}AzU$c+*~rN59PUBaQso;@ zr#GwCmK*1u+406h5&L>~k4mQsAwr2GU_F_Bdl-MYD1p!ecyQSMC-6KhV4mDha(61_ zOE>}-l&2MBpRm!2pOn~!o`V19cmN?9aFK@G*-U`YI;C#TpMqz~J@sfV05SsIieLc7MM6X-d zgvmgRY2@>BPo@3TPiG$QISO~Afwo3$#Q1Y#6|BPs!b2~tJt5c4)Yj2jwQ+i`>K!F) ze&@#b@50L!OFO~Wa5`63qApnMDmiYTZsK(oPT+(TVa_Fa?OqEenzdPnR-Pp2uikMk zl*rmy-Ydwp60}6*8#81}QLJ+{*X(hH<%mV8`gg&N2jlC}o-=*iJJS|Il?#wb7b5PP zXk`pX7&_(#=I%ye^y=|}zV(_$tzE7F{Sd`b10}kA1x5P}TCXDt)y(cuY8{mnQx%;a_4O%(h7^x*S}qn~4zq zFn@5a*{FI*$pwGg%%cD{`foSLf7;9sEQ%lb0mBc@h}@4sF6eW?lE#xl*wjiGMeuKD zbR*SyJK->*l$g+DA%pVPAk3m!WOVXm74{;ewFZz+BQH@LtjZasvI}3^*;I_oPgz?a zRBc7RBHd)a+eP6fbB7osGnYnYgUSG<_2xN5x&*OfL*4|h039zaNlj^5uu*e=VOmu> zXYw}D&Z(iax4wF-<@-DrA%5-1!IXEzNo~q&sPO?isXFe#onv#24ZC}*d%CxkVe0Qr zJuAphD3d^2_^7RJedciYH!RzHN3!^qCrx20Z zagz!7vtcsg8ce?`0HMsm^rVqCm*$`&KwB)q7x`C-D=C<7AYii>fvA+h_-P z>BtT9jgwiI$Qmu?EQM-RaJ8aP$yCWB%rlp(Pewdt!gd}SU(R;p4`@Sd+|p@t+oF0- zXGaW|?yj6x>O1lWKCojMveTICf()m>-$FR|M_GM#2)UWW|HKPc2_*Qd0c~aPDRy6g zy%TN6{q)KeUOR6`-)Gl7qmmPj4+C7bUv`#k64=Jh2v!_iQUpIN(i!esbM@uzPYxdm zj*QJDcg?N`gKxvFH(h^#9@a87D!Zu-Yjqqo!Mt~7y?;zlf|8lR;D88m`P+&Q^Pk5{ z+uZ6AngKlqL43@hAKJk`Gw6q*xwNQ!5GZGS(dMf5Ol$3&w3=;=OW033i$YA^h9#&A zqfM4p$ulhEgB_TQuK2UF+l${gbPgLH&frbpf}2UJdwP(x-HI)P8phVv-ZMtxJ=Dr?w@n!@fKPf1y#76J zA^?8+w+Hj5Uyj{_m+2$i5ydId%?G#xe44X}$Hb_sRM#%ReBo*ixyM4PO|h%XPfnzC z#ksq87wCdUt_R~17|EEH?7EIhB7gzngV_d}))5baoK$=s7AY#@R(xO_W( zAEnRIe#W?X(pgRh-j?p=XC~hGvLcDnsivJ2*F3YV5?u>c3vIcioR6ukCND~QKk2^4 zn7MA1u3qQEC5%}K+29H7e{n^s2~qXr7XG*^q>vtVbII956Lv!a$=VX{yzvY{DQK$x z^ty`oy0ge~(sXm5{$S@MqcAZev#F(huq!T+N1Vfn;iQ*wU3p~}xwrl!ujk1lX=&fb zaQ^^UnBN-%Jp1R;{WP?3v;l6Yhurvw1|Aqx2xOhWph63Dcz#Ia5Dg6JPzy^qjh0Qx zr4BRPc`XwO^tjfmr)_?1eg}EuWVKnPayz zOheh|CbJe$>O|$|vfrM(WVYIGLdz}XILl8^h&_~)=)^4{Oc9q;Xnm`$OC>s{j{P&1}|%yGy`R29l5cFOx;K89wF`cL@ml5qvpNhYZX? zXC!B(!BJmyBv{Yf=e^uAyW_f;aI7C1%63+=JIBw*?R(}JvU(7-d8s zw#$BYM*v(QX1~n@erb~G>Dw9`TKviS)YNx=bWw|!eHaXhktV5w{=&bm5C+bL5(Y9g z!}VMiHB!S~vW}@nOuTBjBlHq`@fM%k88Bu=ORt%Es>6NRd6-aN&3K?c6%d$(2!po* z&WElKvy8_(Mt&ZIz8d!g?b&LG6H!Kx!iy={l2ol?pJX^~Wf_63 zz6z@J7_r!s$8vp^NdbxM{Q9;X-p`35!yiRgBnTcXI~;u9KA5%_t6D;-^n&V)iN_W^ z){jI5-xdw6T4m%lHmLSanxJZyqXABsQZdy`VzyPK)F@-lL}1$&6`Xw$nKhgiQ=sAH zbGV|mP322Q_aPw|OU5@NZ>b<-Wioo7nbeXHSD}xjBIQ`&y;eW##Lw5I?ayf8N^=on z*f^du(!xT5H1U3!BqVt$&^!II0s5)oYiPVDUP|WdgzN>DNsyM{h}VMwG-Y9D1Ox(~ zrW7>x#@m8e_a>P!QaZM`TX>n=%dE36vRVQSQme6BZmbNcan@~6jw?>RFGiafAkzxQeXSKo;LRshHir{@rn$hC!y(_QERKBld)F*1r_*1-O|?L>H>xqia_+*3gR#b z1Ptr4D~R1dD%o_M)0VA9inE&D^{$c;6NqVdYa^6!trblUs@g0i>73N@Rr=;n%{NxG zHR{4Y2TD)klw`Ay)DJVw_ot*kSD#x+{ln97{{{I*OP&A zpn=);o_B1{cpiUY`s~pryeItPJll2(0c@Ac|t^n&mShh9N-BD_RkfkjO_iAkHPLQm0Vml<4r z-m`!Dp_#e1@RS^cOpt_;`bUHT%XmzzL9(9lf@xiP=9Aol;I;NJ`yZY zRy8E;HAbwk0Q#rwmMyKS4wJssXCr2;29@i|MNO=cD+td&ETEA1*gvYbKD+rPDsZMrmcp2!>(m#W}c?JM1BA zNYq}x)2~9dAKDm@($@55+@L`lmidMeEw}${X5q!M-85!ky4wb|kXxjh>0#8p6VVY2 z_r;|smrdC+>i3xeT7o#IT$jvXjqhpw4ET?Bu8)!Z0trbL0$AnW+qwR7s)1r$&&C+A zk}-II{T~vyaVl{*xss$2wtvPo8&81r z@=X2M{Vd{x+XzGT{mg)#gQU&o0+CLQ^hKCaYz=W+ZeDFW4I2bln$L>|3^)7^U_JF$ zuhJ*#%~|${uGh5QspwhCvq#r|*l}pq(4=9hQ$g-=a?^+ygk_hC@4qF9hW(^H1x_Pd zvE%5x*(n6TxuPN@JnJN{1tMy2uLUT}rR)OLg6w3-8&p#ZLLe^$srh;ET*3Ddb?lPV z9bLIXj<&DdF>da9s8VFAlUu^b_35*7a@0OdBAfF1lBQfjWRXRNLHXqE{Y0%HGIJNW?r=x6QZ z0DS-0eUN|XKFHk5pB(qzAcw)Q)YiRxRmTg`##y6v5{%^uZXyaR!3SS2#sc$h31TAC zH{xrtHGWaK;!UUkjo=wQg^6sUj_9i1#b^+5#Gu%=R%paf_|wUNfCUv%C_j?JqgVdk z-bs+(rt=F&9VC_U&#E615HX&ro=D&wgaEI9uW5b(8!XK&j31`P0-y8;a}x0G(zdYx zm>QrCAi~)xsiA4UQtt88FZZ{?wh9&Y5KMj)I@?bFy|D z!E0#`uE)#dAV{gg75LvCR`uUM&o7zp&l=7A!P4}Ho!i562i(RFjp-I_Xq_T~lF#0t zETp+eXPw=wbXD|3u}UU_0>#r*FFts8LswPNgJPSM$O}RbbEMz7xft?7hC6~n7&?Jl zg~5C&f8Q0vML|2DdK@v)w7pyHuEZYJ$1}aWZ;rE#$ch=#$s@0>s+csANL*SGezf+P z`3vo8PqrDZ?o?#H?INjd##9Hh+1|p(_^iF86OyOs+a*D6`Xo`XQqCDMOM=4kdcD^@ z8m)b(7mVe8i?#yXGbi81Vud0@W|xfLU23(>MvzYCw-#SUXjjD1--z^X5aN7jOQPS+ zgJKl*j0dm&G4a72bFyIzShh{z%>Vn+{leM#3CI3IZ1{O2|H7O!OA^l_<$oGvAn3U!OQ?N2*5JTyQeAT&f+kS2D}ZE~^FI z3i+o7MjBk4?5w%no>{ZpEEp0zMj?!_XA&~Nu1Nj%K+^(0{Tt};b65TrivGwn>3^dn z3qu*_5A6;hg+5&8@Wv22M2t*!KEWIvg+Phu2Vp7H+Vevut=1<<;?LcD7w3*(oeVAN zoLXHEs?NHGN7GBn8orp{=5T6p)Em$otjn;2aY!0&J|iah4$CzHcRlpgn$&tP-;C*kO4#LV`L4}-WHpnbNb@sd8D#pQ zZh)l$D`PdymE9H!{cH})Gq{1LtF|gi=(}FvKw8*=(*QQL4BF!5h!S9I;iq8J9X|2x zWf6CEu8J_|Dp_bbGAjk+B0rXK_zc+MNj62OS}y6D*XY}J0lkGe zlu!EvqK~Xc$XzOjva9Om?ke~fgjB+Ewwr_n7Ux5zPfwVtKT%l(P|RCpi>#0HtZy;) zX0!)(O;cQgEqN)0)uRO|7^u^Lf@arz)$8%=aqRyCRj++OTz{U{q;+ z$BSRzTaAbNr2JW9Mxm%tVm5Ws1iox-+OyO<+*#9NMSbqX#Bw)MS>ep&{L%Rz2L-{D z^C2Mo|GNYMYLA_zIlviyaE|*`(D&eAxI~(oDTF~}{tEbt*BO69WFih%u0=K@Su?{{ zB_PzLA7zB1`0ks+Vbx9)rB5Z#j7x?yL1g5UNCKjUZVE5-29#w2-R^H`YEds@qHweO zBb3k}lFMsfJ$V|hD2){=q;AHsoj;p^pDoJVI3_Q-b^r{%|4nq-pWM`^F|)WOyX?(pm1qq|Axo>|yV` z>E@MPHtqc;PLAd&^-9H3%W&o=%cR&_#;M0O_7ubKMEaj={PdrX_}@6vpt&HbkJoM* z@YjB(77rKuV`_oM8coWM<~iZ)SfK!FbW#=pSY{dn6M@H#_NB;O$6YTw)?f++6Nhn` z2u5F8K3HacBVA}#{Pw2kQUC`1e%1ms zhzuZBzU;;Nyb^Y4VhgZRi`=vQrc3ut%ZB&(;Qpw2s5-GMtg*Au41Jrh&7LfBa|Bt6 zOeeUCH}is~&Z==}+}*nPYDFS1kyK+2rmS9-+uypgxPi(e>Sac`2hC0zTFT=ZylGzV zcn^I3)!(kcFJLlo0U4TE>infN_|e?K?~__(A_WT;!WLrSe5;H;GW`{&8id#pR5nD( zi>j#_O&~j;O}x~hBY$o1G9tv&+xCu#j7m2>*>(RWqL;;XMkJ6v6u(jvzgM_a8B3RN z+5*vwqTQActisE&9VZH$BFG)t4cY^wb&*8VLp`o^u2o}r5E3`MJmKoBX*$jjlQ2^C zdz}LwLL0SWNsSUF?t0Tssal$zes4gRdE;}MOG2GKCoC|GKcEev*yI(}8&%3xhC@?Xu}wtIkAbrSMlqB+l?s@Q zm~tfI9sI_H0+{UvPEWE6P{wtog}NoxY?;ypCrQb#2S-!T-SIa*VU zfZ1{Q`fhj5O^$kF_tHrwVJ9(mz@e_6w)&+df}4Vx6p#?;#adF7Rev4*+5zA4(U5Er zp}A7+9L(}GR$n>OJ3?2PWf?^M9rP)v0k=Wm;ST7B%FR!NAo!but}ZH(M7%v4O!s}S zY-2v@mzv^#;n)FHH!Kji9AV9^zOXa@bkv&C1#QC7++au=Qx4z2Y*v4?vv(UYJN=!P z*-~Tf)9nrOUaPC|M*VkNP0z<;SUPXd@}L}i``c#YzX6bs*4Yo}i-8&77Vwjz^lm;fk_ZpGI?CgSB`c zWG{81!L0TednBh2=Hxa96kRbg2%!t~BDL-z&$#{K7i!B1vP1{I2=RRL0Jo`z z`b(gbo&A3PaWT!AP>UH&MW6V%vdr0Bma%C#y1RyWxTUcT;c+>>`L3??-m}_DWOwzx zsyG8#iIQem$yg1!`=$knIRN6+oFV)ptxqn>mka=ImnXl4n14}f02R?6w$?vK%B0IY z7DH~dVqyu!c^DJku=MtYWaNHY23x#dV$`)J<8Ld;ps+lAAuj>5`}_A@>}=g3K2%59 z<2@UL>6n3WqlSFlcCRf3l^V6PB}@!p(m)I!{2!hygKl2bMhh<#hPSAeghBac+Bdz~ z`Y8S(LfreASe5LeqN+7DtFkgRV~P}ZuNkf1==(LEpq9IL-RN%m3F5&Rw@8+4DjgUqEOK0*5J%JcO#WP{Ypsxbz z4kRZ5by7j$N@s~Y#LRuSS-Cnd%yGbK zz%^6wo4;F>G?+5dHO`fR;1E4*;gaMj58D1nV|S}{q3s6Fd%qKIB>Nm%`!=oBuFX)g z%SpX_e~UUmax~W?IPyK|CEm>dEZWiCdYjcb^!Kvkk)_+mu=EnzhxUQW^80=v<3HCC zIJ5xRVrFUh=L-HM`PBS*knN*Bg#fY1uO$469d3KIbMYKYX@hDt)+tpIELxsosKGI_ z3lRTY5vX(o!@lBlJGCQ|e@(&XQv%{cs|F&~R#-NwP!`!waYfFnC+Q*fq)Ap0($%1@ zmn5WgnDrjXy7Z!vIW?_dXxd#H|8or&UU8l*&5O`<2iyArE=JD05?+1yf~TsfyF&?# zR&fyM=dnR)1O9x%Niw*xxGxG11feFd@mtG-Hed;lT>aao4r2O3q?c;G; zF$?ejJOyPtCZ%iUjF?hjZzunHwQjhPs(vu*P0ok!)q#Gw4}u4R2z5vhGRE&5bc`XC z-6H55cnrUm4|Ry%BYz^J@vcRDp46K!;w8xkI|@}c71$s(k9(~;=JRP#Rul# zvM(D~I?>eFgUn2+B}}QUV$~RRQ*%407i1UB*?ob+@$UthP-I|}ov8J2c8J!dm7t3< z!kKisK(k|Qtk#Vs;wEF9g=rPD-@q{O6H6dv(+z5ZshKE^d~;b(Uo z%CsBkZ0yPUGuzGu)i@*h8(YF}_`(u5((M4#Wog!Qt{MBul|EcMdVE7C9Ie5W_M>ul ztuS}~qQ)?GN}7;Buw76tDEIgk)(F?ai#H~lBh(+Bns*0Y+HP4KL@UtWK6MJiC2a0e zeBs7+*Y{%0mWro`U2v(br%^hMIduHxI&+(L;Kz-zdMNjZ&q!q@Dlaw~?ve3Wu|#~? zo??mACaea@@HYASD&u7oKm1sZ9s26Vz>}TuM+%Zn2r^;> z#7hvU-&F&@NDu%=N=#GF6%SyLEq_GT7BFWH z>GrM_t~21~Y%Yn?!2$KdYy%-ZeANzB&=1M#116FI8BR1<${3M(<6X7}XRLy_K52$4 zoN=PMMeeaWL1Cv7Ks3*rnjT+8coxd)A6G|y!lJQ3GH9bxhnRY%Mnz=+| zJZgYx^mDlCg`HZ4khcb9?*wOtFdQPsl@ajeWVB;#;BYqh`?#=VxIPNTw1?PcWJxGB zt`~`tWV{=+evJ|o8dB$(%>Kj`jH8*rH2P_-p)uWOqr{CM{sNF;Aw5^}LA?ZSsoih{ zj&I_@lq+-t;>W$8U#zC1AJ~yi&^aMb6?v~Q=Ah4f6`9A^oFSD*J(@>5a7%eB$d~fe zL0wVM)yOz7lH^TVh?l)oDXTwOZK04ESPD+ac)t93ucSfQXPZT{C|?)31oOe>Dn4RR z%)LopkgUywuYMI3jVjXMm^Eb*s>HPod!uIgrrc`tl0`2!*R5KZPo_GaZ@#H)Pb0>E z2O^pR`V1Vcbe3YD>qXT|+~F$~p*RV;`407J56|N@H}=f*>aSm`%CV&byX0l0Xvtr! zun5wBcp`+9cP|g_^nq-7hd?< zp2)}8rps;g_?J5`dCQvL6Ru1xTw_&AYK(B2xGlbH8}1D}B^(*pIJhh{=uNTIR6U6( z*)j)aAGSqpjDI*7exEAhbh^jY09jG(Kecc=c8~O}PIzf@({ggU=h*Sm)cN>(*ADMP ze@5E$ZhjL8j+>Cbi$(tm%Kt4U{Q>_z1SR`FLHU@!i4FfvTlqt5$PI`M6CTBezOv`^ zz4kc7Yvu!sP<9Jxwhd2X=ee9y17_(PCUJ51$)yI&0I?y{qu5a8U&MySd{+}hq>B*W&CO-yt-eS*UM*dvHPiGk?V-@)f5t}L zi)JL}DEQ*C41(vaO9xu845kJOOYkb?>5E$K671T1HU;@gSpTR=vn)!OUH2Ty5F2^r zyb8}8-0cfP6)amf_09#HTs`?s7mat((ql$%Rp!$4k_RMe;|z99dYxN`^lVd&^%*>+ zVdTWQL{8i35mz#kuKth>c0dymlo}#*uu}U-^Fd!*NoXpEI1%>E6|bZ7%oYc$OMWv! z+fb)Td8b>YTszeuLR_(AR@=U`S2ydGj#Z`YBK%b~Qyv5(1l*VMEmtp3KRA!7Z2K+k?|K?CG*`oI zoyq_WY!PnZw|PU$OJkpz-asQ-fix|Ld`>b1)Ri6Bmr!Za>A?~`*&Ejt8AS5wHv%g% zwHzl4&QAnaiIt~JuC6%{spBN64%0*UTPVqI2j1br zDSEU;MB{3Dy3w-D>IMTkDns1@wFh?FcSiBkCftV39?IW(!l+H32A=}nMlZcpdF&dN zkPiYY4;rlaaZOP;XzJA?>@m9IcQ0*d1wJ3g+)x%Cm)JE!)uT#Y5h)1G7Y)ZIB<>sY z4uMlpst?;@4|6i7jscc$db-tA(pHn@93d*rJ` z8Eh7q;#N80h!F$F-wlFyT#+uTFDeWeJWaFrjov(J>4O|`CPt|11nJZgh(K=}swT~l zD|nXsdc@t68GVdF?d*)-GlBY!&i%aFXe}}IrG&ijjWbj1=C}C9iC(VyuuABkzC&Mf z6H>5m+wq*RpNy_Wl<$HZ(ep?w<(0Im2$)qXWL5Gq<$Sif-H|n3&&W5CDs*bD$}cc| z%E?@|oputA6mPJjftva;)usH-Guibd!M4(Kf8}wmne5_wO(9@geovYDZ)6^Gds|?0 zfNS_Kh<)@YDPMs8eQ>DzYFro{TiwWKE+CV?BcJAV7>!A`gsB=@2!HP9_FPG|D;S;# ziLdaDwk3ut?1_;Y#a5o>? z_qFleTLPV8@*7)86cc8{pPhI|WEeWXN?}2Cwn06Ps@k1B z8(JLNn|+0%`~;f3H^Wk?eDBO339Reb!+)>QVCucwcMXF1F3{b!LmMujh>#N&w(2)7QV=9jpixS>+P>+6C4z@I z3P0Z8&OJ}pyYH1tM-C2I=rv7K+r#Z`DG06%j^@_39y%Sc*q8J6p0A`T$yY(yb*qw> z%Xm%u<|g^@8=~|?i_erwNs%IRUTw-plclVvPPvk5{y~yKdCkr;gq~C*Mb`Y85?E@C)iLiCbc@S*h11lGEWf~^dA_Bi!-nKVEmiVq4hlU- z9)+--ppX{NJM*{Ry2}WMUN4rBo`7n$J7&>)iIYXdBq{-8pJFS6iWCN8jMybMR_QgT zc2ey<-QTOYOOeN>+QkeHFd2FWS%RbTIgY#}a7`cDIlT(WA9t-cZDetT7S*1sRS&J_ z4xQu4&{#j`w^+;FQ_aAu9PCPa-{K%u*Sg}|pC?-$?Jjy!^U?I?ZvPOhcxbP*pU$WL zh)c3}!lZ|Phz8#fwRen3X}Tu>KVOa_sg>izXvGZ4G^GV}HcBX~J$x})3~TnJ{Ru8; zNN*CHkrxt*=^OML%w=qCtUHDFP&C@FC@1I$WvA*!CF9DrpDMZ2s@90^TN2Wmy2M5Z z8e9fW-W}?ZNw+%DZoW;PTt#Z;P?r8K63%@VC(CVqL(mINWyuxR*+uER`$g9Ax_%4& zrl8_++9&%&p|&5eufNAwe*v`rtR){zMr;B5A=?Mwp!zT7KVwjT0tbNk52$qO;{Jg< z7#>eu)hLRQZD$ z_UMQ7Cp7ur#*5U|(Sc3iINv(&3JO63fx_Yh`lQR- zkn@&KyF5u`J^8udm*T*tgr_pO`^u`=IIC=|`Rt-Id5z_76B~qLzQn)%Bw5!Ks{xEa z8p9;qwkwj8t9OcNkF)#$FeAHCZrD${mf4;tAG^(^s`|~-UO6j$%Gk*+fK3Z%>6LFr z=d;r}Xm>`shxDahjQy^63-*w7y#DYVz8+YE-_LFTW&F2}orR{JzM1|X0TQ$wg!i$J z-2nWmpMC67;QPlu_7V!J_%kut*uGP(fwnsk9pmS+k@WX@>{!ooa>Ss!L}TLSn^%xh zJ+oV6Nm0f;g)HV+PK#XIe7?h7bRBaIE<5|HM(f*?m5R`F51tj~j;P8=&i2-QQhLLxzEhxe^`!oJ?;4(;C;6PuYW%l9KcWiR?9qe0&J~} zEi3@F%YQ~|{f9yEC$Rn4WRn|w5N5QF=aRd>!W>g@vs)?FseY>#GU!7>V@HfOSBdDJ zOA5X^oJY7UY(?B)wKLo|vXvZF*@e>K(xtthHs46G5mVWp$C(;5Miq}ER={^rHRQAwmmSyg0R62Q7#DBF^FdhzHscTkoQMbF}B4CK5X)TnF2F z_NNL6%uq28ywhti=7Dw6v^Pa@xi?uTD?xaDgpN6Mo3hn2*g91k&h&o59`oXwH5@Db zCluhwHW^gI0D7V~=e_*Q2=NY=z#Q3E$)v}vpOYjk$Rb%H_3%(ItQ7<~tdeyZ{}O}; zR7buz%YfjLpG`@f2wKCaB@FCXh|7TkAamp$M048PpbZZ%ALGoYb%;q`wMwKIuur}v zHl0;UtWD8Ti5+hX&2PoV=tGd&nyk^tLugemJwxEm-&$j$HPkA#D_>`ywA2sqFfYq= zmO9FZ?n$+k&6r|1wI8W6xI?y`N$Th;TJPd2xMu#&j(w80Dv2DzdiP@S_JaDWM}O3X z*PV@J+oQC(_@khB0uZBue%n_4KeI&wA`71Ox)^#VG%TxiT(9># zr&lrzTar5ydVE-o>})mAJ~ISk6F6M(uMcXAT^=OodFnn$3pYfs*mgL#zOwXLBbqou zuSM#KaYa8HcZ_us9q=dg_kFIpt;c$8))A+D^FJ_S(ECyiFkpQretWn7!isy;&DiOi z|FtXh_n}|uF@L}Y$76cIZ&3(^0AP80^gU75=lF0(uc#-r*~Z!3FqKD7MT6p}mb0c; z4$xQ=;)_Q^zc*d(yM3tEPvpP02~LXGiiIiZO)}yyJIg}fL}>CWe+TChkX@J%jKO*# zbgdL>R*Mz-&BCH|P<(=lFhDt;s|XMBRaJknPQsWKTYME>pLM#FP{u?KIlXu&m(<6= zC#kyXyUvWyZJ3IC)N-o|H~j^kY9+Ahcm(piQ#2sor~S$~$~xqGK@5E)_pF?{{holw zyjYk<*Icrq=qTmsha;-M<~jMr`_?x3*Hi5H_7=GCkdVO~7-811lUNt@D3!$oLL)KP0Ew5OZadUD5> zO|au}&NJom_4?&WO8xz#9sHA>C20PKEBd!R=l@p5Jn|MFZo@zPg&xD)A5#Qv(a`*g z6@t8huOiX22rYw^hrToOL*E$^9NyCxlKxQcQrV5Wo+TUs!D?)L=0IbArp*t|1xxTX z^eMkzIx;y&o@5vh)}F9|4}-$bgZg?`e%zL5eKTdN?!GrzL}NIOEi_rAs+hB4r7oLS zX8FF5a%3`ld$uY2$jM~ySWw)T5LchPjqdrJaPit}huMB2sqxuusIu^kozHdn!`35^ zd(U{$PS6kAhYoyzd5xd+* z>Ukr05J8QVBA~p3>NXUxFY$^K(Rd}w0FI8H3Ko^q;RTC8gdy6Dhcf6(4XPuoR|+E2 z`?F)o6L;gUM8ApR(M+9l z#^vA}eB~LZIU0#>;|7ZfEmxYeXw%SD<4mpB_cq_5`4S$(4ELIxyzLdgwCA_GW3Y_U zmFBL6wMVNeu@@Uka+ZnbjoU`j-|ckgdT>@vZib6oxEoDS?hLde1`c2<_gEz?HQmod z`SlGhj|f?j7N(i@Os_*4{jEI{-K3XVvfLKN_d?xRq!^h(2PSOQ3~N6#i%OcLY`|qL zq+$is@tV;WR<|s>?<%zi8um>MZB@6`?zVKMK?h3Fq`oH)Tk8Fgd#!ZXJ4kQvA^mOR z;O)p62P>}Tnkz{n1HF0I27KLlPs!`l>~wY7#f=NjdFO`0)vAf+@!RT&TRXikZfbGd zpOnkL_2s^Zq>A|}xtJCfT<7HEeUK+rf4-QVhAGY8ExzQ4mvL+>baOrK|Duh{1ieCf z_=-!}@|A?(vP#B+r#O~K5+{_$Tcz#~hqrgieYH3gUfEy9Cr9+t<@nJb^W!8pf1bC% z0d@TCA^mT$;D-?AhZ*FbMc7}IFd;&(I(+$C#CcN8pMCKqaw&W#f*A?mQBNdA6X7zh zVchW|d4dg>`0sV)R6?XK^$qSBt5at-^~RcoNsS`KU)4y}5)+Jes%XLEfxt?2kX=G( zYC)g5z8e#b-KCe;OR1Q7lUGwoKO8evRXDM5(6o?I0bSjxutPj}aza8&RaMF$yCsxM zlJc5j+!TlH)jdlXX9TX3_nt#b+gI_qcqin}B%y*X3DW5S>rnyvDVw62Jlzq={Qgf* zM~4wx2ItNyu{mB%!P^GE+p+g4dDj;+G=q=Wi6_?Avl^cAX;WVbb0!K2SuXD*`VwJ} z@iAU_3&%=NPc>n@v`2i{t#hUJp;AMtHQI|X*i@KMvrAm!ZthV8VmmDm^r-1v^>4V# zxL^G0y`a=zZkd?^^GlzceW)@SVeihLPB&gfmQ*z|x@Xgs)Ev7UdSSGe$EbRiJo`Dh zH`_8(;LFgpD(cSenM?U(>uJ36hHWqaggi0}=!j}CT!Dzw@Y~H~_-9u8la2mQjliP? zjs-w``G2Sh+9)D1hgeK5)sv9P)wdN9nWkYeV*U(>BoI?P0L>p*HZ0n4s>MWE{D9vyR8y zrInVhEqKiqDzi`6*3k%EHI(xcu5o#?_U$K+fd0=HjzjHT?j5W*o)_Wn`;;X-=-(;2 z9-V8d@Y}H-3cR7a0RdhBp82&2U$teIX;y1T2fVulQBMU_S5&RP&JF{ z1630OS-F82F}ly$;bzKS@6Aqkf(m3^QE+d3@r?5P(iW{p{kmyzF4>)vQJPaF(CvB; z1=dBtBXBb)g*eERsFTMg8kmrji7 z^R(C{#}c)?>@#~6JMA9#J9aG1DnnQ=j_>ppun4Oe1QyE@n%$U+x|#UW|S7OkX2*H8t26YY71Q^FPxn}91-$ymaVerThQrmqu>Df2~?u@r43 zNlh`{w~1qLeHs{4x6i5wzfS6K_gtsPvn zB^y4?(fh*_j}sP-~11*vu3eD;%y!ThfF{wn%JWzOlMYe0Cc% za!^Ux=c%~xqtzP*cL8AwEE}KSd5>jE`o3VqC@3LdYCe6(UiA#=B+d8x-Zkm>@u^1` z=#!r}?*?#Y-u*Vm{N>E(*=QST8fjbTndt-O=8thFs#W}l9mjn+NwZd#mM+C}mT-S1 zCDmyQZJd~8zq{n9U>MaaymKGqubf-T=}E+;tZwrwdcy;s&Z6I)fOJ6efZ}x|fLuH= z;a>*?2{CbMv7A*T0lT6YMa3Sn_??G&G@LyaZx`S0`fKbYV9&OcW+JY#EhUtdOJu+; zSd@Grl9Zofu2(jIlQ*}iey@n-zo_S2{c-lAUTc{&5}4erA(6{K8 z2ct$J#f5QXLK;m;VDgSPg&EbcW~5tr)#j6vQTHBHYw zqPgb{ zRuDN*`UWegd*d)xJNh3E<0k-zu}j}y9LA=+D_F4S)z;~`JkG0cWzr00N5cOd!v8VI zYw2M3#zy@wl1&3UK-FYm?fe(*>hGbl3!X$YRCpoIZu1V|9zqucL3q?F@|^l;L6)SH zXiBQ9Eee-QTMvRYz8_5Q-}4#Y(>1RRpBx<>Y>j^r?yeEh7G%s?Ofr!wYt(^0^4GV4 zEAJo*Y3H~DN+j9XQWd2iQAGO8*Y%VBi?XXy|Kr-V$#m(iV$LBqiK$z1zA9g29E6+( z7(MUmaj~;Q(kN%R|3Zodhf72#KOyeJw7c`yh_Qp% zk#5y`vjyMJV{>eEtkGS9j>8z?Vzj^OPGuDK09c)c3xvtIp@?#w?>$_Q?2kBkchs)s zE!+Ha{FGU<`4`u0#@52(6qa!(4yKi+g4trznnxF2G>Q?0SJ@uN?dztB7ge{4wE~)# zUEIHL2BJAL)RX{YWBjAB{X=;g0P(YP0BpdU7zA(|5Z|xHa2+7k`rR0Q8zTCPxs??l z=O#PqU5M-n^%8-GD=5es0R$wwY6N=MoVHm_}f~XG-?h9&5V>9uPf-@<>SLBMF z(r~GFR4yXzM^Eb5q8bP6ezlJ^Xt*hrsMI+FQi>xxhXgHMO3y zpFAdKqCOH!(!gE;_20)z^Q*DS#=RrgDh6i7eZEoJ&_QP?rZ*Er$cePHyys1psp3yo zYI%ZI=lE3(ZPz$PbpihBHo)V*w}t5dpZ>45@Nc*KPy8WoDj9Ea>~GW|itpcN1E@nR z(7{`16+A$ZvE{c(6M2c>s6#F=9rh~{jm@C{7j?+x8+8cC8+FJ|gI+%l!&(x>P6``_ zN@4mvt^2cTDwLd3`pbneO5m!pW^);Bx>XtnWqj3kFXQ59XIH5Oc0N4E->E|ufG1cGeS=(nazuq||2uU^;@_!5bhZ?q%7|t||BX6?`WJP`X{q$9flREe`Ob@X zPW@B^M^okDFJ+SzwNjN+z*_y;uKp`J>L2CEzt|%krG}t70gz2g;(-nUcs!IRKf)2k zr_{fg=Nnxv#~eXFhOSd~os4pWF){)N5YhX?70i6?jO53LB)u)divnx-$BP;Oz1)m7J&!*Q@dN zP9*zud|Q0E`RsH)PXdI3lY=;$6vl7Owboyiy7bewd;b|T&Ckb=Vdqix>u994!(=7M z*LMBGf?Yrp!rCT^fUm7#h{O1`UTqD_>PvwCX7-Qk^^bJ*E&c#{|9}$51i-fbD_xEG z*JRZrL@1=mhOa;AwHPH;z7;tD)DfK0E*pM6&FhFAW;s|uoaO;D#{C82bkzelJpm~N zyzt(!e(hwqo+E+JU;4dIJ6#&0k7qyVF44R&ESsPdB6cIMRW!sFtgA>{v~`}GF5g`@ zYtaFHnk{&QFdFy}vDE#_nsasI{mm@4d2JtUX!!=Y6yFq5X0>_dzS@Hy z!;`FOe1%=C(m@4{NmV*0G)?#X&RAoTJg&@BI=WWO6rrpLtDm3?aNr>;1VM36UBw|A zMTi3tFl7-?f$e}SHTvp0;e!%yrTNp*9S|MU0McS84=_ud2{m(A3)!d#`VW2i<6E($ zoIT#tP#Nxxg#cx-I#)8iPmHL=<@SbjgZHh2wE=xVeGhQ(a%TwFpIlqTvbETxsjsc4 z$S$O{y?(|=?QcuOYqO#qC)`WDszU(`3X)3^9*KV$y|2SFj9R?F=T zBu&xT=wyTqsr4o`lh8Dg``WuFHkqSSqQGui@A(dYh~>=o3I@h60?xx`*XBfH$B!TU zm_jhTZr>k~Dh?;aJw5_S1+;k`0YL3y1ATCo;R8U&g$k`fXLv}ZFhhec7m68Txm4R? zoG-bwRmG0dAnO-jVT22>*q{g-VCa8+M5lHx*2p*`$8q~S`(*#(dOU3&sb8yZMAJ5t z*0gXqodzoYPEwpxcwAJH>gPUWb}}0lVSa-8JCLnzL>dw~uTLwfb45B%QKiDoJL}PW zeMfpq^^tJ-eqs&05lj+2$-SK`vAu%GCwJQ;?vswUjtGGrKHn5GFV8D2r61aEH>4=< z+Yf?i>NxNgV^}KXtG|V6W&f0~7@Oe8VPi0XzkQ>AAukI5$P0!w4qU0Y7+{R+p^I_x zh?aGkMlFna4i3k3i!YN{Sa~g|?`;w&A@K0nI35osIql(7mr&A3Z2qY+#VoO&h(Ftu z7h)Vm^C9%dY-Z+1yNa+w3TQ6T+rgLpkzdu%cZQJu1i)sK|FOXQ$5=MNWB7X6{6MMR(u{MZZwwP1YenjKp0dd{{9`+Z^)$1*u z>s)5qh-i8e`KP;T)zfxuXxBLSm^Hvh6;0)e(M&|7Gjgx38W7lBU%+w@Tz zWYoM9fMKhDEY7%kDE-J@|*CVUi97>;}&Rsmx!{grc0TG@^5rBKIaSm+e#5Kp9 z6UR?)7vmiTg6YF#`wrxk;a1-(yC0-bj5t6TdvO?^RP{AYZ|)S&V5JTlEXOk#dQmvC zU4pM7IdHjPj>NjW8zDv4bF*5yj24O0u`+~EN|HFzd9WDEX>7GsQgr?7VTu(9LIYdT z4HRnqgDe0hCRQxOuP7u4h|LE)L%-xF`bfW<8o%b2gQ`LkvwxFEfo@CfkiVq7KU20s zLETEs{|&~moQ&uSv14>Hv$yqnMg8I!Mu-!k=^Kmj;%7a)+m<6o7I-8)V$;bSq3N+m zWbW$%dB)HND|9BrIuEApCd(Sg*vQ_^qeDA&W$~sK%7jJE>t|A$FvnRJf%c)p+Dyx~ zyQQ4-+kwP<8l;K|w8qY!NtPXiKKEAra8DqZFgoP#K-dIMnbZjQz}^JEw|<-$LSW>GET8iM|kT6r&I^G zb~4v82ivFL&`Xat^PoSDaXtMa1~Ouepy~WSz4;&U_jeJfuWO}mXz^G49eJBjf4YfHZ8f`kd(H2sq zkkb3pB0juF{y~$vqK!jUFZ&D$9{kuKI((o?*f+!q6meXyQDxPB>}GK{a;@g){NT^k z?yqBL-W-Tx6sZyJilGUyE-*qn;3T-F0VN02<#V|w1juSNqcn9^a9j*y#X3r^k z!tzulRbvwh3j4pa>q^~woUP)M*#b;XG-M+GP|8h~6^1ktinY~X4?LH}8Aobau}ZgJ zUEg8qI~i>tSapA|20o_#7%v0HlrOLZuSMpk5PUy;6})CJ#yvgpuXPZwkWtw$x%p0* z{?=7u1pq9jWp4JzGWl_eWlC-{jUue9(90MP9*r6SuZQ(RF>3q`M zg#Ks@_v5XaAFvtOe^UUQ{-Zl%1JbPjRYBPSbPE7FV*l#-0cs^P5IzLYYInC1gqrV= z9g|`qOL=03UxhE=OX}BSn#r9Z^o&y#OrI%U`-cyx@q#}rtK&g4bh%p#^XpOrbz<-U zHJuTxgRwXy3G5(WM%<605K3k#$R(w#8ll-*aL4I&_3S%nDlRFP4b3d>6r|nvTGS5I zE_m&ACbGkb$f_;iJbM}4)VYjKR)N6fQG1ag-~zB$-MM4VMm7ebUwseb)K)qSanGS` z7@%J^7bUig1JtL@J8owT-T5xuf@H#e1o&OCrKoiX)Sh8HZB9%>;kBaS!8>!dnd3=P zEi~9SkUiVJYQL?RYbP1pK43lmjPfV^_Z53XX4&b!=`aGa&o@7Kv;K&G4ThGbXOddR zGE0KW@o@w3D;_nBRO}aP9aF)PtK>~9YTvpgV+}WAM$MElsV}57<#TTO+Kpi zax9SF#S4|y$_j2}V2dqX2EJ;caio{V!bpJohYlW>J&1q{6r&y6&O&uhx6$b5CmX1t zlI@0bLr|4aN5Da(>(37%yqdL< z>mF$E>}6x?IA`bH*l{Y2)RYa52XGo4kV9G73z^@?+c&=JyKe4ZQO%V`dO*$AM!fAh zb7euRC)?N(Ty6_lLdSWz?nqp(d-wIr0sH!rolewR5Ax@h5`)ob=^KO_r&As`iZ5xmQKn?8K06_p{Q#pjn?}Kp^OV zOq79J2j=v3uh>ku(lsLxEWD>rPj0(W{2)l?qvMYagik%cq!$t`Xdnre}HaWTzNUFDgJQ$t^}2TS=qkM)Ys79Rnk zQYrdYPZAvky}mcg!7bgc*8s_AyHPNkgSW?z zUo}k8WlTyFz}FoBXXt+~-2Ve;*p@0$XBX?+HF{ zm`?%jNmf*Y8669jysBG>;>+gR~O^SInn8%#>YM z79IetSx(Tk*bm09h%wrB0B$^^>4L3H)Ou$^#Or$BRi#1CQ4-y9;;S2VC(QGMAqZ~A zF0xi>F5!qob1juLcq2lwEEhblS?pWz9yM2GylLg#k@#9Y@LJPB&!9AULCFNWS^A{naE)bcBVEhd`XbK{qVVYV>B?>+Jkk$F)`}O} zOlj_S@x6Z8U);H3+74hf$Ny-5zoQYLw`uL@09a0Xnzs)8TLWI(+0+W~{I+TdaXi-3 zv>3hG+SIJe_$l8M4tVc@SQtyQ#1b%~qpfs!)1!+TtEthxZfzxHSaBphVBWp6_+F{3 zIUlV84UO*;C>9UwlEzLfSqvn?v*2a%!|Q4B9H69QNhr)hZX{T;1-0m|kN`Iil&S+{ z<^Q;jIKB?%@?OigejT9&6kmgKluYf2qB_fpWlF3-7$YHn+N_w)k^S+Lvh?(H$sDX-_TWf)ti4%%Sg3tWq$Bv8KcB_$krc{yt_msPnjNTmF6Ec* zBhx%Xyo5MU9+t4;JQC))<%H?BtIy+TUl@-)zOi!2zJH!)r8Jna$U1u!vJ59q|ckNdc?dbPe%o!Op?-`O1I{0xJ4^{wrF z9P>LUb*E1K0_zL+(>WH*V2y_vLOln6Zibu>3%=JBYLNisbOYEj@Ck5mI|DC(-v(lx z=j?IKWrRj-crc8)qB|aS&KEx=v%Tq}U;Rsxd<}E9W1Y(F~NXLh7qWg{YJ4W3n zQzstRWrB<4M69fQk!X<_q}|CNY3-iVc+Ydg2qgs;1v(bb&0MCkot`dwc=Y0uCQX=e zcb|i1r_bZgp~Q**mGtpZE^w7tjvjHUyCrr2#dd2Io5Yw+nN0rYhv4YL&dH^)#z}}h z-k@OL@!mAGGL12PsnaC!rT%LQIw!a%@E0IyOnnyYaIp3vH2v-%2iViv5jLGGT6iDu zyJpnYaJX3_&SAWkpUlT?Vam8i$xU&A@}+Cr|WOHb!H4<34z(YeLjtUXgHJjSrmZ<#cz06(Xc{)$1~tq5{Eh?nX)WkyxOTE;>soAuv9ghydxV5{xozV0>upx-{tZ_0 zOGBP9*VOH-e!9frbD{@Vb8N*LPodM;2<>fhS;On=uOsWJ&TW$!kVl;TaR{3LaHzeN z9Dg&z|3LxS{XVe9%#ry}`qqv}B~$W_NrjL3I<#x#7#m$aDay*C*dcsGZK=_xKY^2U z`g)vKyU`Kng7$>W>5jnZa+5=#gy8Li{tE7`@$Q;qX~AeEF9Z}n@xG14dM)*~w}7xL z9FdNl7aDDXF}Ww?WKt)A7ZnGXteuk;T5TQNrh~l!9?!RLoy`Td&8MQBe;BIB7mT1o zK!)4_>{N6uUqkA%_QX~mQvFOLEehv`mwJ0w#9fm@ssc4c3`*OE7&y0T;t@dfIIdoK zg?#T3cV1w1qEc-m(Qn`g%|H4RYIP&2ru0O2z(NLmJd_))^S#ly@(^}aE@#rnEOMoL z8R@fA{Tkv|5N*vB?$43>X>Oc$`QC`{6-r2t42j(!+FHcr<%QLeVqz`H6U4+Hipo*( zMLd^J1%X2=E%AaFISxOfjEi0FafL23Nc3Vajm$M)^ppFdN3%hBcPMD*Y%ylot80#=j%*|Aa zltR>(ZioI3w(5Jk4tfX4?Q6Zxp<)!yRgKA!ZhQnou+z=J3g@LibGCv#wz>9z=W%#0 z!FFCs+N3ozuT)r-tm(PRd_&kfPp4*;#r9=wp0}Ex!db#R&{xT20IE`(F29w2@ecCG zB;*gfgC7qiwPIqAhBd{A=V=n0ny;X7?sBi(^4=Mx4KEKj_N#2SD2isU9%AlYgA2u%X=KidFJsz{FU zqrUN~dQP?Gs;-js>M{OX*3(CxeozQ7dYwNe&maD2^hN-L4S*QVLEFee*Z5ZlEg_!6 z8esK-#Ii`ja29$cudFVPPFz zK7xrte!+th9Kg>4doK%Q+){mGL^KVn$OH7 zO_o+Qi+)>|-_{JJhG?-9CB^auCPPUAW=JNAV8W%BXuaIQ2iX~{2Lw;M^mpNpW&V;j$iwFG z2kW{4lj!RtE?{u&=4ap@k#b@t8EM@wpU<$5!<&|{u3CMlQ`3}tX{2g8IFc^Q&vkGv zFQ&CQCXrB6@JuG!IqwtHEW#79P3iKuRZ`(iCzm|0;XJJi7#PZDb@pQ6N~O=x50}QE8B>@_M|>fZroict+|g$~+}e z;rXGoc|dl0Rr+nMG*p(rJJXphJ~dNhzM>-dGgen7gM2BYK-vg}rf!@^08zNZ z-(_X9)tucpAe-~fyllBYN5&?W^cq0sAMlD5N4j8?g&^5dpX3l*r;`C6^9MU)cfqCv zh0p*|ZVz79w?Wl_sPCxIK_=F%2fFc9rG-HA1)FV0Jwv<$S$@akzt&FLPX?I`1i_0r z>{s9Ju7kS;!=C}#)x{K5R<&K=*tu~XL~!pxp7xVzf?yzTy{?^IR}-P4p}dFFC>3qM zpwuX?nOnPB^poQ4JQOL&xPvCCkCkl>)MK6Vi2uTN1R63Pv$owq-gVGAcv4YY3`P2?k?9! zH4S&K1VVS}e>doSH%M=NU(mOb#d_}{GeKIhM77+R(*`LGwPQJ808D~|e;OyHp0Q49 z9xL}5_2?a52i6lG1xoy^X2J;Gt;*0ha8jARPkM$KO%jFDAM&P_)q02wokr}>o?!eN zsWCBVQ-^N{rWFJrZv&Gt*DO@1c9f^9LicNolH9F&tDgi)sc`7IJYN$Svg6EV&JR$l zf3i`nS`Cnt>*s#*GF-4%@*Gk(yM)4XT0ufptrNr8!=%RQ+cI;QYjLCJX7h02u%|9j z7hmQ+R6t8s7BLbVjgCE*N-Z#n1VCL3u|J zLp+8c#si$`XTI)k16}IRp#%B^=>_84!F2|4hkTSDj|VK$fy4^G3g(U!|FCZFKUvYP zc(wtQPviR)I9rI`mvwR-A17*)6Lq-2>zQCQjsRHGq=|ED7^_QLZiKGUTV|!NiBM6k zsWAVgz~7g-v@FiJ7?sfy*?7PD+m8OUG5=+wygK%HFW^=+o~h9~tG+@(PE9QA6>bDv zO?av;yO?*V*F?<%RF^BKQWDJ8@@K^o zo3*)lmW6xFgQ+}Efhn&-ef5hUWf%C9HK}IS)WX=215DJf=NZgM++h%m?kw@G?^~t( z(;cG(pRm3K=Q73Aej?g8mGl;y`4lyLIcTi`8>==fETLU`T1D+TqNRuK*`istad44U z#{%egki2?>EXJkZPDk&4_nKf2bi2Zhb!-)8U!%_EE;~q3I#r?-U|iFV?Vw_6DK{$` z3G2QWyjX`jnDI1*qFW5v$pt%aTzq| zTF4+VdtZx@xu0cTKl)uy0*9D16945@<8e$YB30S$jI#Gi%n7~K?qj8A#gW6#o~Nz! zbx%hmWS*QsM3DN@Ub?6Z7n0p~*`Xb>`2OynP4-O*u856>ILbMIoNg zWf;j2@@f@_ivoyL!$ertMI!DBJGXG7u#(;i+s5yH2&%hZ^itcse-=ItcDv$YB3xt3 zma4yh`Eu~{cJfzyKL*62eF{+SZNdKOnEZ_^`FpMnkfXQOe$&4EOD)~r;x8hg!1y6R z%8k?KUA@Fu!96)|c33TwEl1nY_qk{?lxB~wrp_grUb5FoRrC8L#rANSG?2FhubfX$tWrZBFpC zC)7Gn5;!2`Zh*4#QC#oRtGWt z9R)$E_>=p`yS;#xwViv@mGs&4rib@&EZ@f^_ z_EZTXi6n;#rI)3I5;!m&6g3wQrogLMz^ttj=%GN5QGw;6qR=9D|PObkPw|y_T9;7EAnep zlMKk#NRTqf(_pTohR2$0E_cl;R#+s}^2v@tl;1JL_))UHoc&Wbm+A|zczobNc|*&G z#5|S01KSEb^3rfi`?bRT{esz-WHY8xrof@D(Eal1c=hcUH710gwyTq&Mn*6Asu6Kx zqu;V*i_|Q9#Xal_r5oOt%;g7Dv+%>PtTPnDjl#Bn=!C-ZwsFvC8&htG>#F=h3 zcbC8`YD1pUnE}f>^#w=wG$L`|ET5HnX{Kt;=9Y-+>$q2?h58U#jo-`!6xT*5*9JJ! zrSPdJwuH%#2oIR__}Awz8qZ2}n(B39(;V{x*kaS> zsUF(_Xd@P>T;g+RGf#s@+NJo+OuLI5GyA#SE%HWMiQ|;!4#82KQuvrg2Zy!2M4GVT zHICGiH^djHBQ3cfscsT)5ZpOZ#^Eh5XW8VHqOQeHCNM0I&k|Smk29mRR)diBFMCCb zOAIfJEaLC^6zUpsI-CJTl$@A)7mh+;pGF;**n2WRHP zWqjkL;j#g>>cDM)fM3T&38P2kRPsflC+$M`kjIA*M0mn{-$C^E@6yb8QMpt`Riw0vW;gQl{w_=$fL)O^-k%#@v$^2^P*m^NCq7^ z%iJ9iy`wiKFIwPV)GR?g^LPYG1&()1>)1Ov*FM0W^o4~=ygx!|Do(qmEZKJv5*S93 zOmC2@3scypDDzln?8Ki+NxUfR=_Y4WhbU&+YIZ0WXnuUxR{J_>{jsE^=x{I}9?tvp zcHi*ud#BFp2vO}!Bd3!}f`n&p7~M!<_1I|Avn?6VTS>P`-wFB!&`$d^qUAS5!++Y^ zw?5iP;)pr62uAPPLIUNC8e1$?pXotfG!72-Cng!F&#C;Icxtr8??3bvn440;#yHiL z#ApWN*+HQ^K;+@S@@LEJH3moLNver`7K7({XE)4LfFDpdR%%qXFv4E>1zPi5-#Ihc zbIo|wQ>0W=4pyTVR{Mv!7gGlLr%L}gog6}Wg@pWC@2AvZq zbsdrX!w#hjY8o)bI_Mc<0|+_ZkV zNKIz}n5{sky>i<|-+RKX3>wXWKXGP+^iR?L7ai=1U*?L@>6!o%$#|-ScM*P4M1*Anb#PKZyeypA36tR#( zFs1oi{_LJPmm%nnU*(4a{Jlgxe|aq0mAe9vE9^!;a^BAB_Ft=K^S-xSf(1!QJru=EvtWD}iJY^4bmY>o z4%O;{rDo=@c#Y+V_CrI<;I2l5;PKK3ICiT>4#mU2nvUnaa|wKQTd!+{Ue-pvHq>bK z53APWs&cwA*+>Si*rclEQUx#?=A$>nUfj1W@40>Rrl}@ujk^4_y@#rIWNrid^zOt* zyS-waQVYyfu>YElTcCfDtTPS!}7-Y5!j1stR-pMd?f~3l+oAS zX>3HhW2H5lX<|z(lcgy=Nt54*%FOn0;)tlmN@XM9FuaWG&ARKJQdY~&t%bToaJsqZz z%C;hXplI#;TpI524E~Eq?So#_jbRh1)4>uy?!jxM<>g4s?51`6UjW4;emJruz~TK4 z=10Pa)zK(uG@#z-PIwX>`yC{$aGC&_QDP^23^(CswMv7>sWw$mv!!WU^K`MiZgJ)g-eGq zEuaTM^Bst*v>EhMf~*dX9bK+)7j(lhlz`1xzT6k}XpgR{29Cw5Td|FAzWJ@);6VTs>(TfhdB_M<*mNZ>22Fs^qn3&a66}wEoVGv5mfD) z(yy42Y`SxPADLHg#!d0vWrf!WOAR{niyqwm35?V%+JZYKG^A@EWDbVsGt!jyUp4Sc@4o-uxfoAvToyQ`Y(&h==yWPHbUi^$t_o#3XqteM^755Ci zEW!&lKI_NGzO4Dr#xQBNhlzEL$hb>IoNH*aZZ)Q+ z2+gU-*ZPkS{g%ICaVUo|87rSD(d}-;r}e0%6y+0+{YYZCxKMk6$a@IA%IVSC>%Kot zjJ>Sbx}ay5MW&iD6R#02$W9S)mh%?EH!ZVD&sH+uEt=6PSL#VC{yM_o(&zz4qckc` zXZ#KQG)S&tS2pZ~fn)pSF9L~hGd2NzK=YCIkIl#5K-<4Zs(-5j0IHQX008w{+$u|G zjan82m~Q3mW7{oUe@7rWd$yo#RVqjT0ekk)2b6JC@-!bm^5GM>)em)jRmP1P-xx(9 zW#wdKL@1*^3Z7^HF z-PXCz*zRV+IYOXU!NkQ|V`e`s-{hl%6HY5sJo>>K>`iRspv_%7p}fbt{7zG}fYL^j zE4Ye)adq#DwO^t&ycYZ5v$LZ>iRfcq%x{OomZenE_c+(06443VOT)eBlB~Vvi zNSKmYpFT8+ZKkI3eI*QP76fLg>}H!6p3b6KAVx}Cv-a7iF9YT{$B1FyUi%1F5G0i( zWG74$6G~0{D_@@8h`@7NX#JyS3~?2iXPiK@C;7B^N?(eSQfa!l=vfed5O)p_zKwJX zWe@jJas%h89BF8I-`qZmn!u8L6aLx~(_Ad6+SkMO8xFAv`FMiBoFWcQBL zJkR*m@!Pm_DSs5Qex{H5y7(FD9hL`Z8(4h@?iunO<}z3xroM7}AGLm_Z`mjP?!tGuuPl$)(G^<6TyVfA-DeihB&zVS;ki_Jf1LU$7&==6~*?!X> zm2Tgd#A}qkFn^u$s$cZ5(za(>NSkb-FG~zlblfqz zs7z9KAA7hP?;Y_dRmHDOiyAao8N5frug&E?KsDCL4Mej1xI0pNu4I?8uuyB9vqx33 zGJt8;C&tNQT&kHmXzt9uyLqQwYcG%A%QIBQVS4Fow@71g98y2)-B98Dld42>LS3o( zk|d)YMzwTb)NR?H1^TyfOcVvC# z=>B7kv7NisJlCNqY~Qt=_^8VZo132%-nlHzxvh67d@hxAjnmHd#M6RbVX2eQkA?eI zh1kBkg$l_LqSMB69(V3z2~PA@L$`CU=D^!v(;cpkf)?daw;Q|%#WS8WlZu1pfl^gws-E{e%&tZ^fMNI+ zeLpZ~XrOna9pa$tlzV(Y8SN$#M9R@i{hnJNE-+jpTljBc>ib2u7%p(x1W7ALNeu8B zBPoe)5rQCz0Ut^CPsdZ`jct8$bU|4~5PN@GaLQZ4R9^A%6DlLtezGHC_fYCcIID*G zr@%=qBrRT42?_EWQ7UlY+}H7w9X6GesjhlCI5Oo#%fqrM}oPcB_I1~=f<|#FsjMIzgknGdeCjpBX|YV0y?oa z(iOtKhwvKrBW;xFB!SPuLb+T=trS^J^Kh=Nx^%tePe+sQD>0O5g)vC9EY25$QgR-; ze4_Q1&iQ99TRq|+KlKm3x03W&^=}zA4D}4{XAcg?T z3sLE3Ac9c#jlS&%z5u%qdg6zRxeSO#@5e@-BfyWwXXE#ohVV=id09`I^h}=_Tdxkp zDB=;_KWB|tOTD9$zs)JyrSf5)P;<@O9_W=RF{o*Hk)Hlm{J_xUg$d>VK-C)MRpH{( zTpKiJFToHwJ{*qrNFH7@&|Q(BcDq<)z%adOOxnd$mNE&|v??eT=9&BuUah*x;PP$l z^HmVH{}aK)8I0XWZ}%XkoqPIwp0U3Bp@)!X&z{|$_|@qbu|@4BXFVG9@SUU|&JPme z`*`Hx*J97Nh#AOb%#&E3BjxwqX1{AaLt0)WwJc~D?NAeQNk=vksd6>S|CP_Jo~G(` z0^*>`ALHQf(bYf1K?_|w<6q+@W$}`4e$i*_B+2r5Ew-*rL0w4bQ|Nm?viwj~!OCF5 zT0e67k;s9X)O15!)LL)-yEK)dZE>;7PXDh?Edo3x$sti^{xJHU~iHtP=7kv^0)OjTtwPiCEu zAV+X{3qvVt!7)3Lj#6i+D!;sd-?}0k3?5aUKd9R_KsvO?RY|?HuL|{HFDj{mLE_RJ zO0$58f@pHi7;9IkHCxpChpE)(d;{ba(wW#ZMbMRkh4tf~U0nq$2DX|3MsnHF(<<%8 zUx}o|NOovykeJBsCgYjo2)zB?0cWCpAj{3o!5mPjlu1uKA5e=R`;vt2OI@PDY&4qH zl8STaIrpv9xqLW2X6v4+eL&n^=zj+!nDO$8wsLahl>~VrW*QAwrR#GB?o@ z6_Qo!m+u-mH|y4H;;F>>TvF>L{-|3MGrU|ARHfLplYo_$fW@rJ6dy6G-*aH=Hn*+c zo|4MI1f#a85tlnX5j5!{Fw1&8&h!{p#y3}RT1zLsre}6oc~iKgwWU0Bv!q=ac2n;r zZ^_D_?CuU@8MSS>>~gtS@(h4BnXg*K#i=bSvtRUK9@g>nz#fgU9F&#X&RVPWbvRB} zR*2&^r+Jrjt?=Ty7RrmvTDvJlsyxgOs@g76J8%{bVb(so9$qP*mC~xVPR@O$``Ssq{sAiNbANKJ2=lmwoi=y1@4Dj0TE~itsBIA0cCh=W)uv7ggoV4PO_)^d zHKxvKeL|?GBpEid7gNlA(*=Wf7tn-Mq8KP;^a3oJnYv0uN@RFvi&&3t(j2G5cw08;qiFvNJBk~~Rrsc#$_#k?_x<=icJijD zM`I6QL)CZqJ@)zb)|-VSBs5zAFcd*!3njQ5=OonRgo22&g5>IXd;vhch)7=vK8Qu@ zs8(2n&6^)b`Z9*ZLS*@e#`+m&=ktd^_;i?8zWQ!%=jGG}9{4-1?Jg2XV7O%`wOC&C^Ou^ZP#ZW zNtsACeqX+n;ewia78E@ft^dRuVt z9p!QC8rMG5rg!E)pIP=G7+wRs_|~Y5Hb^zwFJbpsl)&mpH-D~C-ES{;xA`l#84QEY zm&pwWg;s8zDN<3JJq9Zsw|M#0JG+3`yDA&B3CpFGEGDSZ1cxW}#gIH=?Ff zMzwbYtA2aCyracZr_EHy31+w!$zFhtMTz#%BKDr^2oW{cGNrLv}^MI0H;y=$JE8+Rol+%oaZ8gjj}k`m0F$C z+7QX9qt*q_*)OV(vWuJo7C;iA@yCun$-kOHzibe|yzoYmtZidwXk=(-2$+4c2hbJ& zWr=~&V*u7!fV87Cvb<&X%YHTljh;!ijvcCXPndH@9D#UMlFnuDQDO+$T08p14#0Xm zke-oPYQVeS^BCP-j2s<7VU2T<={blY3o{a97g?KN_pQSW^8!(KfXb}Hw)n%-;tloZ z33+|}_TWZRTQDI?Ce%7Tq(nA4m83D3XO!Q6X@I8;hO$;aV^1(d|EWqYB}-~k#L!Qj zq=ej*G#24b{L)oV!WA`$T}*-0QO6zhDzM4}iXxw8YZ0YJ<>?fr85f6)>65^qLR+t< z)`Cw#|L)c}w6lpoxF>yY2yWfO8@p`3|ILWkq2vuv@X6_(Bu-Yw`eDvF21nuLk$RLs z&b7%-SQ3XN=2en^`89qQA$UCl>wl=V~)1QWh6 zpm;v4)e0TUPiFWt{OLL6vP9D`*Wqq_BeI!A8l#oGih)GEFoWCUJ5yTo41rx-MRV?; zcwcTnv6ne47TXNsI7a(EFk*QwodsE-Hom{>u2caUF7#?bWLugF(hYhp%}n@ z;b{r?4cC`&C&?FDA$kxiZsJlEVVU;S(X_qi;8PtHN-&spT;c56lyWw;r&*n zI(Lql`2%)x8W8dS`%ZrNyF2OI>DrqBT zUXHh~Hg7x@(u4=OQ_oTVe z9Oe-o-VIETy1xHnrF$wr_Y>$)^%3`-^ahs!`i6VQ99yQ>2j@nz*^4-h1N#k$lQ_G= zg>S6GB!WrTd(F0vuZ6a+Sy8*Fxwrv8CX-j5e$mBtVn)0N1+3_w)gFHzP`?K(7=8^{ z0H*pJwCxQI&9xm&94+I2#IX_>8 z?8Q_DaX8l9U}@GYytkV&j;w*mknLV5cowjlKR(89WE@O4f_W}D?KXhu(%#Qp`HO&^ zUT%To5@2;#fR+63cKJK?`%kOrZ0ewIqU~S@P(65C$3R(ez)T8?2aS{{bHbo;2grLg z%`EDaa*FkL|Bt=5j;eC)`i0k`ySqE28>G9t5v04jr9Xm3w0UhX)E^xk-+gv9Zsbi3Aryl#nfvf(=h(gE@CTsY?9)g{dohC;)l0m}(BQPIe z%hTE{u$M=U`R$|6a1_roADicO;k`NC-^_Y{DoTcKlUQD1`ax}XJmlp&dC_tve|*@m zWB-wBclpY;8_E5>!%^Pt@!c5zJ&3*_ScvJA4?c+2DSx!+WPjU%|3vS<=Da_VI!c*E z0pwHDFXpRh$wGvL10cjpF<8*##l%Ob`wfYmf(c)J7Ig^^6LSe4I|1v_H;_N-AMiIQ zAHOlXa+|RZfY=9+5NtqpAko8c_hFH5vz!I<^ijEYellKR3lp`?S5BUFbt_YUaMhsm zRQK8`RBsuQRMtp#9a4TTPm0>-l+<{^+UKH!GnrmcG76_I&0qUgTSK$N#!lrZwq=7^ z7f+p3y6%O#Srh4I0NMkd0b;J?Hrv_T@Ms8Bi(v54L)KMX)IK1af$zp1A=;bOoxYqh zZ3hBxj_L~32D2({!h`$j$sP^(6%>V+4Ci&KnaXqXH}@IGE5x6Fc5?mfqaSTtZ9mKK zyYacA9GgA9`hKy$ir%)|N;t{%xbh8|0A(~B|`oKv7Z~UEKH594UPVu zyP@>&(w&P&-y)<3f+i?^L2UxZ=_6A=Q{4b}K$!N|0KVc1x1y4S zo>&ii9x|CrWy)^!B?ly90Nom%7H~`mT#hOzPC{^3LO{Lc=b?JZG?Z_Aaf6k2Re6hw zO4?xI?xL%3gt(<#%0(A$Mv(s7 zYeWz8ZTL<(zUA+I9b7MBDBLF3H@s!_`ehS`EU9bpcP;?&uhT`y}@k=G-VOxK*3CoF~Ak| zlmvv;Kr`7?#(EStqYl#MWMVx7zIp3$N_@v#G5!`-nGPeVvP91PWnm&GD(WO<8+s0$ zK`wM!6=?N0q6hR*2Xz%>?eNQQ!+Dm|pEYLj9&K0X1%PNv@<-bK!D5)0 zni;y#2)yoWq2%a86n#0{yS$R%<8(LCy}al^rPg zYd{}=MJ2|fcv(kZ{4n>D-TUJ&DXU_=0tXQe;l2g&hpMP=mGHm^#PVNcE5U5iWGdCC zU3k(!U+F$%tSe9KsL}s$v`0hsnzFkpkQ)so5x)yB%D5Awj+6u{h5}i^`9W*3XeG98 zQ}NzOZcm~ft-r#2>C`yUV;45h`G!>`PX^ZWx8Rn(Zo;hzhg$Nz*bIk3oe0?F;xZ^?CEgPy?(QpO- z`mn0DF0Z<0y4ldsMZJW2lVK?Y-Lpqhk}@QdmX-p|>o-C>#>6ERRAp=MMK= z;Hs6?*8Hk-#ntQfRh!Pozm`FfkwkuX198y+gi`!xKl}e}2mLEr`R})b{V+*o#rQyx{MW*qo2~+-q_2DORIpgze28)vuP7*$7MN->WMq`&i4r_ z4dwD>hnxg9LzU_+k4iz+R(S87cI0HW&E$<`!i3g3a4T{ojUJ4)y*uST{qWWcYWMe- zaRB*T;N|zYE>4(eq*M)z8ew zHiC;@!c__`)s?%`1L{QnrkkpHt!H8rtxdD@%u|D5XoZ%*~s z7L9+m^}kE<^XmG4H}=mF_)-NrC;~543kO&6UP~196)J@zUWej%TcAcEk8un96pVfs z>y2AfX(bNYGh1=$W!4r*anFo8N$88JECKx5;L?fk2~yJlNg#-6&BZFiZF`#F{FSYY z%w%rGB9Z#6UIFdUdCtM2ue9fDo>_ic(}+R#h05+PEf)9%t?twKWuqg~HSUF^v=t@t z>jp4BRr!$LsagEk&QzGu$3mO8*HBT4VYvg|5bqIbax+1Nq5F&>UA+7*EgA#EFJ1hg zka++V#k61&2ZGKd3oQD#qr7? z|3~5dHB$BOVvP-G6fu*DAt=}4VrdIXxL6ungI53i1;Tj};*59}5a0%M>7TdUq^f=^ z3Plm?ABS|>72Goee5)q%!pIi+RxRuM-1xPHTA@O?ea8gy*9y^fd>0!^x6c5!z@#7U z+_TiOaWv-lF7AHqS4WQr&I5UyNT_+xF2ms>tl<0nRuafd(25-pe9(()3`(F*DF}s5 zYzNrS0mp05yKYyQf{8cbfh3!fUwGSI!Qa2h$?xZwt?3_dG!Y33c&ptnR1RAYf-Vk|L3V7Z}li z!b7PH=U%V4P}zyv{p+u|Bg}cLL4);QK)S1@!dDi`s!DnKs)GCe;8TY5np={q&lHTv zWmWhRnT&pBgoa%kK88$2IarL;+jzB0`*{)<)QHO1p?QLS2UgHMC!1VN%YDpziHm|i z!M|nWZym{-64ntQP=9WPP(`%qIQ&??@p8K@?9hHVsbOZKREId{T7zMAN~hLJIRQIV z!uUOBd7Jiy{r;wrr`=|ry^lv>nYwvP)J$9MgJ71n<-W!dc}wf?A?L#GLXYQr4e$A? z@9Lj*&)OIG)!H%)-dOAf?AhL9wPo-;t}Yr+zOoP5X=v23UxjaUrQUDt(^#5*24(gd zXHGAJ+=>4m-O2yf7sSH!Z(}O{8WQ+y_2Lz+r=Ad6(wtQDBbBcXg>$}mhZI6H$$SZ- zuI7q>A$v(B%F6yB*uvFMQm4?Zy)+(7yE?qp;;%3qE=oCHRHsXYV7uN z!cImc2ziSTj$`|kU!qRJ%iunIVLd?J0r$XP&jEi48dV8&v4ed5++zpx890k6O?IXt zfX<#u;Sr3r_oC9|eY{~m%C#_A5cmT(>XzqAKSoi^Nsn@UW70e= z(s~3BvPR@N4rr@dEa5HFIV8k^ytxU!>D6^nk$3vcf9

    3+;jnteHVLMBhV%~yXP8lRD9dtAV1@S9%)eVn+2nqgw)kS3#T~vU5|fk zOTCfku2I&8D#2pS$6)4clIl}xX4V=KoVgSnVIzax$R5FtJ{ivg-S6EfCDivDLuYT6 z_}$IpWQjk31{Ln&k}pv3GshI;**XAqA!j=oo4}DeP)z=+NhX8Bdt`wC;}gvCoR6E~ zDahogN@bL}QiaVv^u@CgKk0c?kR@>aXr?3imla0jVkEVlFtES8 zp}2P(fBTY9k1r_zu4HlAPn1+LN5tyrOp0JsC4i_oQZjBXxw;swC_-#;TN%&kT-FnX z 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

    @n=fRI7a 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

    BUv(vBhi;HJ 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≻2XS5nXkqCh})9 zsWiHBGx*a{6gBe}^G#5+Oh{vA6`t>E+X4le5G0LU8@{>EZ8M)`Ctkd8IEA`BFk`Vj zZFC}P5iuyo+OwZdBz4GWE7dCpduJ+?9~}AB6bR~hAR8H!!v|>-Evwvr^IkGm!`J1W&N>>h{txt!e{XZ}-=`Rm67xfX>uPW3>S6{=0NOp8H{vhmeVFTi%xBew z6HFWJA+6(cI5I7m9q$*6YB0LU0BLm^!bH77fiF|@RxYaY4b-hdj*H{)9xa^9GYz|s z6`k~5)*TWQ@8#Pb0ujO+e)STo?vd#wK&7~KUleq)s60iwpj&!FlvF>3nfGWnmOp(R zKxTTjzzUdZiL;Q`m<@?4>~=kt622deew1a59=6&-Syd-K90&XqyufuG6k}0b+!r7| z9w+YKt6H2S$&<(p^MNA@T$}&`%2MU|&O)~%6z~?IA~Us-r(s&&{qTF=a`D7CbaQlm zb~Xlo876Mm-<-I;RQ2g46m!5wJk>meg4}UX4PVHz1bZY6Zb7P2BtOz2EU^&+9u`~O z&?3x^MmK&JYSTM$MkwNgnNUFnAJm`D`GSl08~3sP%y(V5>bQPXb*H&zce+;lW05P7 zPjg;hs9^5P4Wh2-Dc|_e95%`ej#CT$Onh2Dv^cw#=yNp3b?KIQ)A3wjvRH6SrLz7l zY35X|-qyCCve$#5FDjcUQz4c}_^qM;U4BuvzgIzcfN&6KL3mgiRPR+{W9xIz_+lr* z>`eL^YFF;gNs#~mn9K*Q+wXSQiZQ+_o?dJiiMRH(bLK}hojxX)W9^@fM}2NfEy8Mp zmEx6Zv8-^zeKUqc8&DP&=G&-CL$R6ls9=8ACZEjs-qESCC&PzCmXp_I@}dZOdcD@_)L+8-WJrA5T?o>#h@ z-dM>Om86Z|5@}NHiThsA7Gev$H`$nKFlpUZbYuR^v-r}m;9}3D?C~UO|C5l;(y-7s zo-vJ`ltGtjgH3R!q!IK#@~x!v9Z5s3U{nOUUMvCSP`famAT`qGkE_YKBO4xI#OE)) ztsx+R>GvE~_PKQt!zOweK-)<_lOJDJQe4*Ju7+(?>PH_o5FmRxYI=H8>Iv<4kuU3K zsF1upgcM3YqO_zI0W}s7JcCr>xoXW*(v1e1YnBQElvzT%sq1$iW1T(^#tuWUg^8e< zV?cR4;u^Ln-2Yky;XkN9vT^@ee-s6_J)Zgp0=8dHo%z?P|5bndhi;K!23`!t$SYK* zbi5 zoV5-V?mG;OVrW9t_(9l-QAwT90n22C%iSS4uuWv7 z7(`1wokn7>heNs&xxsS&V%? zOz%JO4VuOcU7RC5oYLiQu}4ynm3yG8`g?c$FPiVRRuH`sQ!6(s2(#D!M)O^cYy=3# z>)waE1*l-Wg1zHK(d_giYbR%jhbodgLK02DPfNqY_9p@{T7%H#sPS$|5$0__qyT5U zA3&i*-xBY$gdEoZ(9jG|DcPk~M5yA}6g7lWT@?`JANQZ+MI*jFRWti0!lFk;KVYZl6H6 z2qQP7{`SGR5REg6;_e)Ma`ov}4e2+HEG7`eEH?)uh(0FqtFJcw>;&Nw?$jI>t{>Qs z3jtX>SQbD}I#nTLK-0)3L>)d>Ly5~N>-}&L>=I|x%kC}irH>vFmmul%Ok>et-Dmw# zP{Q2@VDOly$XoA283qiSbmhFD2_t}iO*}xulLU}@2|#s*?o7ROB=CiD#Ahb!f@o&h z2}cBqp|Y{(i-J&*1U^PV^Kh_4p|T?(^}up?^LQPFz*t`_Eo~He<1=-3EsNz8@)HSy zX-`-K_zAEGn0M&%b#Rz>5cGl#_s@XL(7OG90?BZkD8l~r{`(C9pvi+)&Oc=VbTBvn z%Vq=ufcK9+;{viPe))_Y$ZH4zATBzma12-`zNll$SIP8Lur$U{)kZNJkz?E~HfbmQ zS_K{7W78xS9jlW7?PVu#2UMe75>e06!IN`JFxfDQQI1Dc0i8W)IIo!oop{!8-NtTglC`q8=XICy{&_)$)9Vz8^{(Fy{5&UmZ&N3-><#rgMCQ4t+^2uX3&GVKsUl z|KC+08*SVS!1om_o5=;p#16tE-2 zZUp?QZdkin3!}uE&CmJWoqpKwe~3?RY&bG^|9&@2T62i|{>F;XZ*`dT8WT+PaN=bf z@r__1dlm586aOEK{IUK?uVf6&eq3m6$Q%4xX!&1bi5>ZYYr z4>wA9P%;6lf7MRXg0=sLk^VZ(!*KJ`3MqfRiie-}L((JFm%5}0dZU$wU2=zzv5<+flSgPv)8^aU>|8xoK1=?10x7q%V| zb}(KtOGG*dnInPlGkc>ut%TanJ;5{YrL?QH!@X)rk?Cq}Fcxp6&jO!^Z^J;9_G*SS zltoA@P^97Q1nmSosUBRAaWJ=8LfaV>h_~UMgO0>~)1V4eeWsAXWgF`5*g zYWlB%ys`6r%9g++3B=@#89uWaIfHSg@D+pnGkb&}8G7Le>!;^1SIcl22ymUby3X+J zU0uD?f66&R;17^{_OV&?&oFX!zbyIRhBrrs|G>zh2T}-#(RcMa zlXQV=34}1m@1tgJOg_3#uWud=uOBdb#5mL(XE=VJFBB7+WWWD@LHJ0K)f8K)452TC zT`T}!QO&Z&REelx=nsvCl_I^@?qYrN!TPimU+Ueg7Q1ZZM9+iT9PURRFBW^{1^U|3 zg)~`;x&7gWjQH^uO6@MBqzHCdR4XzoR4W@RNl{lqi>(VBBct%D$SZbe=MS{a9L!18 zpRu#FQzgYL8i7v{tY`<_*!%NMWuT2ZfWbIMn<_J}duO77RH?eO4NVEOll~CeEBKjW zCi3WDSN<&0SVHXCv4g=9cUc=1|=CYzv!Qg@oEAes5 zx}ZXTn)ir6i6+7vLGH5A(!z?#W2CSSJ^9m&Evj3#hA4}~h zyp-z5dH3oOA(xH!Yvi+f+q&;xW90sWL(9hchp7dDU5|(MfvWP?p{4&XQxDpKAz+u= zH(UiZo^EAV`t%eJOl%3k%Mo6xmb7B2dH;Ww$lb8}~qtb=bYTRwxIhWeq$K{T{aDYNKWH_X72EocHaLkluLSnMfD+h(d0?lf0;L zY}B5N^g&)qWWvGgluD#I=q&0|q|ek}^qkY&MyMzBoF(KT(#H$fOdb(?PBO>@)|rz` zpU}Vmlu;;{=Bx|i{_$F}B-2=$+fBP5^N1|7WwkqvCC+Z`1B{qixa|p1eN#9Mq2=q> zvw^9bL8RYj|!+)Itog(}Qolr^A&NgRI(vp61_2Q~!aPSpSrOd$7-{GsSk@9n}Zx)7D zjE9Z|UR{KHY#8;9I>#ii3yHX_-vcnVpe*hy@@6>38G>vH2C=*I8>@JokTVNQPEr=W zvABb{=et8}Se%gAn}R`K;ATo%GQgq%J!om~aG~~^$Ksjz>f@Q^G4+sl}I>GsvWP#aZ?>-c*u|DuY{?qco4aHg^86!6CDKU?hFOvB$FrgWbD)=2+BdIBlG z{~=`Z&(f3s7asoK3lIPO8;BU^k#Ma_qYG~0klS3Li z$c-{1q+I$2sQAp5lCxGvjKV;~RgIS?eVXDn0WE?uh_r&qFhi4BoFH zUmYhjb&>oO6)bs*C1Xh|U}}`x(~F!6=343+(A2MPJXH-zy&4Z7<>|%}a**Ga8i>+E zy>EkhaG7rJ={o-PT<5>(G9SbVe_@q=OWgin;)Hc08Kb4VZU#@_fWmWms`_}`8 zqG6p*9bd$U2jGTKi}%i=ian!`uj6$hFN018aDI?E!$gzw=(^|uLLlfs{goElW z`y;)1qy%&J*vL`E38G8*V7B_JJn+9JZvPJs=AXPF_Q3eZi|%2_`d2*ikWf5*sPfeh zR@-sg7u{BRQosxqz4Hva6XAeC5E6wXO~Q;GRpkA#w7hI`fIIfPaVa5R+xp^2DGdW` zw93f!L#8jUsC;&wZ3$iku;)5vU7iC2wL+HThH@)pqQw^T(8bN>!X2TKOui0tV?_lN*Z53A3C9ZSsHk7#@vd(^ zNdtIu)ME1nq`(2>dcH@lvIGG0)aiH(-WCEW!GNfKeGP6nmM)ynQ`_3I;Q?6IGM_$_ zI}VJa9jbq6l>Np(q8)96HWPs0ehyoK{b&3VtJkyi&>VRfg!%jUmg z5@R5;H$!uThUX^da_$m8jYGt*yQ49%^hc^20B<>C z4-JAaFUT>roL8cQVhA>)Be)6j0)f&Os#N-P!gG}{+Z9a#sIT1EelcGyv*ozGhOGKS zpXC3jmH!M<4S~6jR@VHBl^?ij9?!12bb@WGeI|t64CMkK4cPUT+|UyzGo_S4Sgj)J zIp!&;rG9sex#ZU`eL0|#g}6$(z+-*4EFgS$s5xUf|0LrAv`?HUu-Xx@!|OsKP`wET4f;&L8MPkgsBB0Qz@i%C;5qLdS1#pkh0bxP$y zpA&Qt2Uts=G5av^Fn5Vgub&NA{@|it`Y{dPt!}SIq4!*)D*a4*@C6Ja3gf#8%Em-sEP7A9#C@YrdWg46TN;4TGAZ$ScA-Wz~ei z!VXqseO*&t;<0^@oA8#>&-&=->lCGAA(O3r*`><&eCv+XAqIm@WzZh;cAM2T^C^GE zp6E{8ExzUSgm-E*ajQFBskcgKtBv=&h^b5HRM6LA>YA^%xbPMH7r9UyIm(0tBz0WW zXcw8ipD1x>#kGhqhG9;7sgRTJ0%~B0E;5@! zoh{>NGKbp_m!N@TO*2201I(ySkH}oALb+ZjRDUrNgpE{t5~9eNtOPPD3m#=CG{GGh zMX6{#T#!#AcjJEBdOL=a7QbN6PFs|ds7Mob zi`h!_`D83ZkMffh($hn)2u+6osAH~ATi&)cKrEcXMFa- zi)L4L&2wj1cG?SG^geh@^oyqli+-(_$DMxn>_Y-oLiUwR&vJ8#w%;OK5&4e$3gJ4$ zSbqQZ&EZ_a6|HmmNKQlgwA}@lrp$H!W1olGC1B%~LGvE4YGW%IO}JS8+P}|!7y1Pp z;}2*q$&X2Bnl@hrm%0#ldp4Thcz3F_oh>^GmU(yDClVw}jZJaYok#2EeB2|ZYx>4S zb#>=>>$nx{qvp@e>T^|gdYt_2S_-=L6W^(smdR0%vVUe>-PXsgsRnmpz5-2(NvFys z{I3e{Qlx(zlxa-AonU(MbLdr&B50OsvV943#{cDc5#26g){|R|p9^PDO$CN3ygxkx zJ|a=8WFM|LiuZ_zoOw9%smm!8y_$AVVy#YK2DwE?gmdgqRyk`AfX_lg>Pv^Qj&&IJ z^@TF=Zgwv0XSb@6 znT~#o?ypO+9zV605Z91|K>J;AH9BjCY`KL1INFAsGnlTIFjp?+f4vrnt778}5ds9~ zrIj5BXQ1+=X;2xyn}h!8#v2N1f%(AmDbavevmpu5ja#vwSK1PjMO8BKTh~w-k<6th!CiERhs2uZ`JNP!G&USyh%YCE*A#%^59WN=DMdf}@t?RPadw z+@;yXyYe!;Ez}3pMo*FG5=?0su8zzYO0g4ynd zpm}z)hV9^HzepBs%?hHOX+@kU)kIJ_UE!lenqkSXkLU4HWY2MoIA+i~w@}7!aJZI?MFI*xKYe2M@7K*rh zKa%Z{&3%-$l4Vqcu=y3uTfnceFLICzx)J|Nloltjigz$kL6%iA4lM{<9_VDp@v2`q zFdj_QuLkSkljG`{8*jpaFkq&>5asCdg`!zQ$>!r{~|y77@kn z#@LMwMR66#t575?Ou1|!S=&vf5N{=!U^o-R154FtNT9&*CM2GG5V`xNy2_rQYK$E$ zMf(C>CFp#hTW7VCP&UvXr<z4>_@b~pMmn^F78 z7ed*b!z30FJo0BxU#S|?mQofW#3Hl>1*@D-vZe4Cr5$99D`+yj{7BB4!XG5r%`XaV zR8rT565eczP#=UX%Cu}ElUdVi*nnVxpaanvX$>;l?gO+9Vip8FBbVi&Raa-QpaQ`nxQ;1yr zIN<5ypwz=)(J#;Z;h}~0kd(>OTF=3$T%-E+?xMmyxy=O#c&)<#-SDGkB@;~Vib93g z=Y7OkqV4#H<-^B&P<>CsrQ)eCuz*Z)sO|90?_SPvsg&559wWf{C32c`MsxUvrkry_ zm8+0r=n`#P!ysVjfG=J}*FF*c0>%)Y;=o`#iOUZ~5is2(7emAM931aSpAZYlp;a|A znM??N_Od$b-Le7pWh{Z0sURNxaarI9-sOmjc$^kRkAjoppn_Qe!1#s;=W)f*rhQJn zK)%N~~GsEL~Bps#E*XLFxzkfGP!Q z;4A0Ea}8^Evd@oUnb8?$3jRW`z4MH;5npur3(7;1-g3y;;|F<1&)}B8=r8p4U@<|~|erjVG4tG?cewGQM@shS6EG+Q?f5{2;G8GoAriEfm?tf6xg3qZ?MR_H?wIH|)gRGQ<_9^L?9 zIKbt5!h95VN3BcZj)5k9f@mcvMiU*p#mdChBf|Bdp+aXf31NlXs3(w28HL;Egt#^2 zx{22}_&?qtynd57uf?v(XJnbq;XQpI8lKt$4!BWl&wEZIT@^HDmB8_VjLfoT?2thd zY$@zSTH9{ykg15@!GTP=R&X>n_u2Pn@A%O2pAGai$NIwnNCNPC8smSne)bTJvHsZ^ z`mHKAs#b#CfL-mqdM*k;{>jLNtJ3L#{r&Y=Ts&9=q2z$}{TGF&Q#dA74+&l87?Y0A z8@lJ*Beap{Fg4z>)@=mUr%utajqAh%oQvUi%~|#pm z3NL!uA)eqFy+pBK@VpCY>u14Ja8>`9yus%2hqf`rmg>r)<(J7-fvaPg%;2idF%Pv& zy|)sR!CNw8fstTxrE5{^^dj{SaksRlsRXf5nahPI!k;ksBG}z>-q>fso}Pd&cox1C z!r5i8c%ZBND9s@O=XqgxVx)4Eo&`Y)}-g*Dww;xE`{_2i` z0A7#o$ontu$l;eedYEz@RK8c=_JP(@a0@DcwBzBC{c2?0>6M4+oaP#=k_0Ml#rA~B zt(ARcA{*)?bc!WDzGjNpPjHHjHkOj)9e80OQK(l?&^X!4&gP7eeMyT(xuXZoJ5}Wd z>V%5tA;W;ik)NIS|AYIp=JOm`IOM&9e(RXXA^-a~b7qesCJ+`cGkf4a%TjUkj#0h`2L(pz6Po|Pw}Qpl(j)%qsvUGjV7 zbm7bc00>;wb|yVLgtl|_(S%J9;9zT^m%km0(_H_P`dyAW_j~lOJW-|y8?hEnCsr@EhkAg%Zz@KskZz{VcoCw(xa}72Q5}iPFHb<}B z7{9g7c#rWM#J8g9Ybs#Z>yMu$!_g?-Nl)3lCHBdSvff;Tx3ZhmX2jrrm1J|SQ}hhB zlvDBL{fsvs4htRpqQ1GxoeSgApzQmEq2}1P(KQ>NL#X6QjBUT;_s{ajRdPMAfgXY*+Ocyr$0_$dt7xegDND}Cj#D&IJ9Cc&yIQ`6M@s!?W#@`^=unJ= zj@c=LVsQc7tQ?{23s8-iCmF=@y%e~v8U>6m zyep6`ackHOHijYky6lbI^+(R2b}gztRUdh*v0>SJo2iH)@err_5eaP2n-{#MoplqR z-+NH!cHjy0gqs*mCbvn=ZNyvl97&6|5h&nO&&yKy64t%Om|ay5>ro=0C?JwaQl5J* z^$Pl)&U*4rJm_ugKEA?xtP2l8JI%-w3)n_ApEMIG=r)BdHUYKF{dCn+g8?$CJ4os2 z;bg(DvRVJ@T=m~{l#oUPq?PnX*UtqQ`B?U{g&f~s(UAe<^<#7dHw+n`NdPbB?w$;8 z#gwKC=o37&8hFK+A+02^vMzOoBIGg*IUdme5O7t9&2SpJ4Rz-scm9F@=PP;NA~C<- ztV@M^^=86*(1c}sr`IKcNV^2&FU&O+eb&o1>L~Yk0h9LbI{JC%oCx(pWizWU0`G!w zdP9@tfx(SmKSRLOzp!(SJ(m@3k~`azwbr*uNm z{*5+wKek&4m zL+M~e0(s*k`AiX6q(>(`f$t4`gey|)d_?0r{)GUIn%FOq2VGbxNJhd7$n=DyKNFlREV#{rkM-~{P*BNpkY zBeYOeuzninds2>!_>`V|{XdL*k_3MK3bNKNkmv6sxZg|?JRrziAXJxD_NG=QMlKHj zJ2*!AN0!SrUg)5JBys%!KU8R(1JW>uLD?bzUF3(rI8!)kYHCXeHkdNsG0{%of84Un!olNOO9 z4IuM+W)_bx|8DjfQMh~z!cW!s$pT(R`hlLx5r7{hj8Y&%=1dX#*^i8v!mpiF`qkPW zRI1f<5Gqxav`&ENPqB1QB`!*~J2V(F&-@Q7bZ~IgTn}^4QC0irxim!`qIo)Muf?qz+}{w-ai)R&KZdNzDP zDyiADPpcO_zI*CO-0>>@oML+CWTNrBa;}Ao<5VT?vRv5UP(!u3GK1D2rZQ@y0V$0# zaaptRUdCex13U7$ek_()#Ykq-ir>i)=El4_L#nAcEDh2vQg$o-ovfvUNA~Lz24}0c zs1Da(YM!H=+0lEG>(^LDN-T9Bbm*z*C(hNKwe#H1GSqtf9CL?^rCZA(Qlw`1iicBE@Ep8hqMPElXA zefJoYTX}X)m~{b;?Yor8@DtcedCB#zVP%cUY{ozQ2E$?gENz&9J=cR-_mbMD{gS=D zJjKfSY292FPExj`;Ekq;v+vmLKJp%ycCnw#&Wx4A8%G|!_j!7Lv07iE`$v8lU}Wll zcOP5&K%#86Cn`<+sL8lWj$c(3G7ypkkFeXT(S3f$0`d3vC6 z-^m*LDtro>wWDoJ-)EyV0g8(Bzu~A~u|5$?ghWz}zpd{6W`e`Y-rV6q2R;8;O_H&ANaaSVVClKcC zv`Z4+5UtoLm=bf0c~mi>IhE9<;wvQkfrE@7>_3`_4# zhouBAB3KNX^2nDJ^Chc~!i4=0a=RdpTt3Z+oS$AY0d+5B$jn{~O}-A@^W2~UHUGjU zibq*YxUKLZIP;IQ|psuhCCNgM4Tf<;coDx!rC;ixBn)~O%Q zJ!RJoY4CAJgZ4Xw$N1)wrQ7mfcjW&ASQ9JHp8<{}u=z2-c|f=Q3UJtd+07p;<1|lw ze{Xk!0)z4)hXMskjy*_xg?H4E*J-kvcwE2An~65V<0yS3NbRjdL*#ERzM;iv6UX zQ_2S{R*6kHvw(g?c1qHp)(I2rQ3H06l7&HUS^+6Vq5wmJb*@foPGnuGb4?4Y0C|ie zC)~GXECA_)y0qcNH`YK$rB0dDKe|NiB3zrWuw_2S?ce!v@K#PTqm#C2~aJ#Hj@O$_~I z$@3*bI{Yph(X>g+rWPdXut*A)V0&%uSI?#|#|uJfDnW9fJ*m z!f|njptd*ImsAEipzY!3_mRR3<;H3Jr2_pg&;Wxk;6CyUjlm)a86gHyR_hLqj;j3l z_zsy}007Y4yT=$7ukSSjyKOun2V*cbq@=n0ln8POL}06x-TUO~6_3s;fl=7jEJ;C~ zloxNo5LowRO*vx-x%sxTip>zh>*QxBbEG zCDtUx!97e9YeV$rf!oWe zYE`=`Y93vIdMS{&6e8lF&V_g;OgC**W(zgwP821l>Huw9QrtPZgsF~nKny>K@Not8 z8SE;-8$&5I%IGpCmTa^*I>2RrCY04wP^=$RNTO3!HZi=CimDuq^E5lG;|i43JefK+ zeLwsg(dgVa!vJ9!BrqLF6$*ez&{W;EnTV?*S0EbwY=b!o&rH1?biv_HfmhSlfN>LYrihKlk{4?c(hY`R(03QEfKSuai zUJ|TeM;2v~fy;dYkZ# z|2Tao7kTAbCj=Y0HHYw-QoN+wBgpau%QZ06GJA=9c9@*Ddb({GA0NC`0g*IBdWp+K z$_d>{ki}^z&-pzj&CvwHgIt$c$5~8Rg)ET&9`OynTfUQ|P8*&=vZ{4bzsgHle#8WG zh8ON71m*-pZV=VNXzLZF8C$p_+++Z9j9VstjhZ%`{aa#|Dh?ws7CeepDO^+M^|&sG zF)3w&>{?nrE+hd4u|?G;iiLnt$gN(86oWY|G z6>Pk0m|N)17=>InP7R?nP6~w6N57&gJU3^@P1fHh;1*l$?f+BK+|*uK;$JHl{00{B zaLJjOS{WHQ8o4@~J(}!+NR{2t&=A4h6$t^k>OdK;=JXnk7P(4)-s#N1=SxF5d$G*@ z6n6WKMXE2eYunwo%Z$`}AvVZW`cVDag1eh~kV<%%-2wx%1sz2&;znz`JBuEuMoGEpM4K4SA@KCr>E?JJ)jY$-#5b`KGq26orgmALKdz7 z&Mb?o-9pnk489lzG=>cF_^o{+p;$cud}pGd5CnK&R|}0>DX0@=hD5o<83odU;$7mf z4=Tui8fpNB!;2EB{4)%_p=)6=!uZoovoUwciqW~3L?&dRK}FHIl3)-|6Pz1SH8rT8 z+nyvIu1T~ao_D2>T0t;P5+10;3J0W8&K~?Jn)v~4r{VwC?8INT z(O+1L{;`*U#V}fryhS+>PLN+QTs-9UBVR`_xG^3qGpu-gFKpH#ks{?W<{1_TkV&x8 z*?9Jc9mzu%HRIp^k!Hgvlg<=`TfQkG zn+LRh=wnA!EZ{-*h5?{RYqvC^0Voqfd$CVa=_|D83ZY!`3 zMAcI+g^C|G`J%DMKB;vcOtrcCiY3u3LZq%x5%CFBs)~Z zU74v5RZ8e(?+X2<#_>#eiTdMb8wpJGCh_|df;4!UC1B#JjaRGE<;e0yjsy%;^TxTc z8?1TuqKOkF8sW3-V=oI;rMG;3)WSp8!^B7%V|+zAZKE;xt5>)Jct40^TXZ}Lt%3?~+mjwFzyZ0W=Z~)V@ z>bc>cvPQjAoKxe6GBpMsAyO`GM@1{dS^$8X)(#gyg@pS>JM_W49e~B1W|4lqdi$8f zKW*%36@fpw>pe&M5!JXeBH2d!6B!AH{N1v5721AJ{VjaTTi`D|goLI5a zhdX@^w69uC%b5I=x3xb8Vo8tTZ2%qn`3gSZ1FZ%50%ca~S@HSG5tKDR)w*OKX6HvQ zAPEp$Czu31&dJ*7bd8abrhF-Fc8J0jED-po?XEM8F70guseX7j4|1h*l~V2*+>lKQMNLxHt`5ytDj9Fs z&O9k&G259+jFjDyt-CxjWT>q(1eHd$265>QGC2Hv^ZNBW*=*OO9uDT%8l~tKOH3So z4>&f=^*vKXl))&M{B?$;dQ zBDu>`!T!Xa<|qxhr7V^+X*Z6Mc5bf15&*3b-U#|TgLp6>>)6+&$gGsyG^JurcO_m zb-r&a>=s?ZgNWyEL-=Qvh3w}kW{LK{AAV(ww?K6d3p}Y__}G_XocSFpTuL!<6FI3; zOA#70rCRG9aKgOox7GBA!jwL?ir+hkcPfTFe}8NJo6-0~_Z>1z_86%BvziO*e+6p) zn9D5mbmP0$r>E>@0dN9tB@-1yd5PtSGW~DI(v}AT_py9AE?|U+;LlchjYtwcZ3}Rp zNV%=w1J^39p=$3dItkStlvDd4%BjAO%Bijn6ZD_R1`6CN`6)3OcGM2C-hEbOD0CxM zkgQFCdD~FyrlI;#QMCtYfezI}x3WRbN`q0&s#_hE;Vs`AC(WW3I#`;?IumWwR)jY+ zPa2ms;e%X^yMbG-T)4&2hEc&4txd``fx=w!dk8M@V{@I|w+|)3UmHMrH z|Jx>IEWGxZ7wH?Z_cpU)Iug%c!mu2{_KZ#N;rUu|qF&g(|I**9&@Y>Q2Shb@yVo<{Z6B0`F+*|Z9X$-CsxXmxg@pB`Y1D&|= zNhA9WIuC$&?hsPvVyrRffdHpb8kP?|&kV?$UJ~Fh8uy1%cL>wf6_3cgsrNGd0etO? z9iRe*?+2&2{bcN!ph*DZP?h=+PSj#A-qUzqjk6dJdo`WbtU~ZA&?sSVD;3l9yE;MX z9Ep@*VdpCBW+{yp@fA;j2u|%9C5_*g0!lLUO5vdxU4i6{9rYaGRwYbNE}YU?Y}P_L zdk=bdN>XgR12HYskHeJVC(W5Oi#VbPT5#Z8hz_J^)I?*5k-hs19H|7Ui)I4^WM2l> z9V-M@eH!=7p?4vZuGQ$2`ksJ@RLJLcrBxIxW84|!of67eA6$NR`9j=swCfA4)lTSb z%MF}rjuBzvJ?;S>BI`76LI$nk9Wh1h!RvXM-WPPSjzN~|JH=w%GnCenO_CgxjQn6- zZ+Cx$@Lbwh$FMxaE^qb_WOR~#l*1-|>iV25ULLDY zREl7K4<-#Dm9bT(P|jqQLB;){JoQL#~t26rBLx!@ueIW~FwDRrX5 z_XTz|(b5(+<4PW|Om8K_n2bEReS5?9c2a3N`wR6q75vZj6NoC;i0|lw#D9vfa29;; zjTN67N!Ldp_oC~aU9h?k{luplY&m&AXR4?2zu0@rpt{;^YjAJe-QC?KxI=IW79ePF zf;+)ogL`m?;GTrw?(P~Kg1dhk&YSa{+kM}hzNf#c{?n;id#@@;C2Or`%{k_L#vFqk z^?)g|a($)+mQUeJm4yRtvuYL996Hl{M*B2AJ2~0BmwLw6n?}f8Tli*e(F!N`g(3Bd zyBL)BEv(Xpdf)cE#~;Sa?C4Tjzj9Asm6>6Vp?l5@l3CuvUAylff|r%#1QrG9P7*LBUf^gc2iAt zt`Fqs(@VR;yVa=frm;LtDAS%Loq@T98>h=IT;9KYWrB1>N|F6*yK#8_SEAMOFCEk#od}HM_Y!~FLX)JZ{v%5ftLo?kB zSk~e3+ZfeOe>>Y#djhVI&Pz!#T)y~7-S+0KlXR)(yOJ|6>n9|{8^7q<3AL8d*sAx8 zj;+jl>E%(lO=B@#!Dy!~Y=~AK3hEQX_0d74s<~M$Dn)#nLOIea3lq`wp`-N?0pWCu z^IADd7@{2e?0i=oweIWc0gc5dNJce^++@l;c6sPi3WWi1c5i%;?A)hgi+5I^muEO#j-kHaUIA zb`FQorhnv&@~oD_d`FVyEcJfw%}+?s)`TnO$Z(Trn5kq%^!sJegk46}6wp^N3hsct zyxZ$IJ6-3!gR}(KLJLVC1z+|V0iS8H@NiO?!0?A}fYy8q#dT#n39t3SqA>DOby2s7 zl6lDbcxYJ0<9x?>fq3X;LXeq_N!ugpgBf#s3UZ_NhKOr{l- z%b@~bvGWv{-=IfV0=Tbv^sK2jJAjpInd}Yme$2_yJrGxelu*LiilH|?h%WK2{sKCP zN?-uvzqToG^~j(#LHAM>bo@QS`BN|BuT4NB8y9O!8v`Q{x&c}O;$FCDMxbK<_XE=a zoxil7kh-lXXyG0mW0;B0rkYDcGYf@QpCFEvcrqSBSVlkdQd*Ku)Mv;oX|Z|k_Y#zm zp4G~2S%ePG@Tb)9u-T}vxfrr}gKLVqCmE{_9}3>AA8DdKcR-5TgLv&g|Ayrs8w?Df zpZ*Q!4AhjdH#PzN(CnWoyC6<95%}7ROAOY(xWvFdyTm-}OF~jSYvx`&Db|>V_72)^ zE<%MwLrB+y%GKv2d^rmGcohu#=x%t(^!!TD_$g27@QY#4TuL)BfA7<=s8mdnsDGq~ zGc4rhxTz!*=4npIaX z!RU`8)lLedura|PijLV(iiU4KZu^e8C||di4OjKz57=v<8oAf`kHad@GJ;ja^)APe zn}RXW1)ls=c8I^qBt{Qr7H(|e%1q9*f^}__6Pp$)fs`v$jEz34^x9F1+PK%u;Utp4 z=Fo@u#IGpc?}x&-n`Xp12pwv{Oel+F@pkD4X@*Sn?BN?$c}keCD~MPs(m%oI&QwC# zrXqgC2crdo*N^kWGms9E#-s$`mNE=eAY^|IyOJ8Gc~w{?M-lmU)0NB(j$Vz6p%Fp- z-e$EZ#~VD8zKP3LGy5A*HE@;5CB1Q<&Shy#k2h$M^OZu>4es)^>Ci`ycZtGqs@y#d zW3bAp&BNE2j8wA~974VKX%=@zX0G;ye14r+LEmSWQ;arP*bH#zY!PrcLu`Dw8tb?IlP`uZuSb+T#1^I0s# zZ$k=LQI|llTu)7Oi}@Eqt+ZAzPJ|3s;2>V@J!n##a9>i*wPI%Skf{hjsiTfVyNQh1 zv31ZUB*}%LhTFRh+lWXlvqMTUb|0~ONx9BdBl4KWEj;P8YwEWwRLeh6e`vi(eYbvJ z_2at5Bm)kC`@GMahURTE?`UBNGj0I#DRUFiKk6g~--0%B&|5+DN4J*$VVwlp_hb9L zH~mK;hks7_R~PMt{Q`0CK-4>uP|`%XdQHj{vvD)9RgfkdpZX3`C?O+9C?OO0+=;4v zMtp|p)$wRlYl^px<%tapdULDi1K#TSI{^0smQQ301R$D-w4gom5ZI4f+>S&IDC_}c zlUB(Tw>05lHba7FWcGEiEFG!gnq_t&K!t^)t|OaWVD(WLf67LYnj} zzyP2HVcYUW^Y0tUYz{#0gwgX>7|ZzLy{ybH8HG|6s2saVE85DEpQJheH=!1IBcw}HL!yrXtbg=KmV0D=-1e* ztH-2AW9YP zW*x{6^*vWXtZ@JkB+*XE?oZMflP6`*M09Q|e}O&x^zoQM+}dQHvqvsc`+kI_Q+c%5M$%BlH4eAfpP(ph|aop!6e2*2yA{} zHu|?plZlqMA;THpJNqiv&u$$t&F+6FD6W1J+#_zgXy_i5-W4Qek4|7DW%IsEy*F_sL(xuc7-Rveu&Jf{x7 zPYHNeV96;YT{+#;B%z2l?(0NuT>(78Wr&}p8ccJ-!5xv1obQ^}Q^$Q1N7s3OI%rf? z1LRo|H9&%+2W-Gta^z$kYZe|8U+W}%xkxKvz{ke}6tD$?3gI6E5W1KZ1L2o9%C~W) z=b7TaXs%aIo*zj*GMR%O8R?%y08FBL6-Z<(yJ+z~;SZ zEO=Lu0sfqm863g%)n6X}Y@uGX)wzfn%dgr!G!~5Cy!|Yb_?jre;`{zQV#0i~aLjOvMaYKKMhCLRwqDV% z$?yb^ill+3U%;>4$Ye*<0UP%N$>&mld@6W4!7Pn29%yu&Bt~3XRC+u{G-fH^q#*T7 zmhb=A+&$?~FRTOoKPy4U--E6H04lR`{$Ue@=J$JLyI3DX!TMCYpz}kg?&`(3NvxM5 zZ9;pUtuQnXwl$O09b|yjo|7BslG9<_!J846xg9q+krxv*O<}O*4UpjXom;`I_?f;| zh|-GJx$&m^;<;(|Km;cM`N_6x;u!$Xj=_&7Z zfK*hAG^Jz;6l?KG0k)JgJsME0(g*KlnxoV(Wmof{0MZg##c=*{U_NCuSIVTboq$Fo zu-&0lEn$$|XmO+aqc8w_@h9CQ5iv~%RLg9bHhP*ya#-;W;~F_KQnfAgn>QyB0(MkB zDIsP+wT^$x-G?QqTm8S<1bLZy2Ej>(XG*A{xxFFCE62p#@|no;qFWBE29tjwvXp=} z`G2q9bkI3-R4X|OC&;BqIyUF2Max%{ovr;VX$-1u?StY1zrmK=U~1FHvmI~6 zcPY3HoetL!`S?cm^@FE~aLWA;BK9DeOCvkHttG!fuhz#}G$^}jysmQkl9SwWoiIGj zGy@i_SVDF@s3(Ni>@{NZzQoXD-%JURsx!*aaj8TIa+OdVV@R({Q^Yi<@$|gg6`F+2 zo4Dte#TN~fh%6;;e>xtbmv?U4zseU5{*X=YNU=^-Zel$Drftn$Js+D1+$?(2B0wLO zu{z*Yd|8&X`d3&h?@_8ROMX9Q=-i2O1v$cr)~#+wnLZ}Xc_Y@i939jR>gH`!6smo@ z+Ma<+HGyq-wQ{)Yu zhu`DP-{=`w;zg{*bIYA|D#mP+W-4b&K42IV_0xVon-$o!AbML^bf%<;J7Vb3Z$^~M zPkpLQIYOBKz*j05rIqot?$*s?-s3Ba&!sTT9@Wb}($9`O#I6`s6B%QgPCde_@zbf@ ziQj^dbA;C+&FPx|4#Vxz?&mLu%{l0Z8pTvoVxD0^_YB?uZYMmuJ&n`Jo6chYFcs>= z!pKASBKAc!>vzF7o|DCg^ZRBKlRP%5yvGk}&>4B>AJ@-O^LA^L!X|>z3Kgm4iB-}B zD>yuD?QS6^&fgU5vVWQg<|7Y@OBFPxmP!>oOz}L#dYag7Zn<4FC59G$u;~FRJvkBh z5UW?e6#E*qP*cx*(Q44~_Yv%W2=tyC;w*m&1O0dEq6)tQSe;ZgNSY$|p<;fikN~#C z`P{7%h~N|DuL&Un==8_qd!H79y50tHEVK?y?73Jv5@VNgsrfbH?!A%MDETFUfQe!c z5z8%k?Tt;3O)jZT>*WgOTQ`1=2Ec&f6{B$G_h_QS?@Goi0eLLr0(|$$<4}ivMG5bJ zc{rEnS&<0X1Lm4bnsud=-F{KcEyP$X`1Fm4kI%*+_gzZh#O6pJg2~91$lH^5)tQ)1 z0?nm(mG$;&Oz%p9eu=w%9kHXZibX16jBYNX;!>L5VaOs`@a=|}gXAzG=V}*MVDr7@ z-HoZSfR?F-{{=6t%t1z2)CaI*onnBpV)NCL7Ysr2BT!0G;hb;ngGwEs9rYpG)%TxH z(K8pG2@XO)*}ids#UbfKyl)b@6V8GVK`NR^Tj6>BW!`~pXt*H>xNh4eNmTq;OPIgJ zfINs#s{g&ZC_5-s{Y}CAOi+CG{;~%Z{Wf}zHhLfnuor7)7FJH+Avo$w-Mj^=2!4mS zdC)nt9!QQCIhVu=oa)i)$SmX~Cv7K|q~6u-_MqwqimZxuQ|{Z!YTO4#AVUk{(i7lR zK)ALAVygH4gfL=7B1Iqp)2z2D{B(YfL1O~?v(^3nwe-=jH&)fJJd6v|3d}KYsMx$t z%`E=@XijK4#jGbvan>*P3_tyb?=s*x>*_cm4`O=vU0YL&X8GzXJ-yD(A0HhZnt!lN zzoQr@2(=-@)8O|I#dYJ=CLqay(cV}7aDR>JQ>7pdK((6&xbhPzYN#zu?(hH%A&kW% zfFS9Gk}ooER)_%G06Ql5;m{E%ch9^MuCP!OB9Gg{0dI{=V&cq4@_YMZULuo_MvLi6 zNE{o%)}G8CU#ps@Z*QlYtG@maBKARbt*yr^$xEGABtb#}mcM;%Q6oJSS*m>(k+zzb z?x?n>)1nX5Saq(C3$ag4AX5%=iVWd3wTU6S{1V;>H+>4ON3@@mU!bg5J~)$WpC4I} zkFD5poJ-kAXU%`%xw?&l`nGj`o9!IEIeg-^dN#C`TU4jP_mt|MBz%RT1>5D0B{ITB z8(vmc4Yl}O8>z@ix(Ethd4k&IGa9DiikNXt<{UIAtuZZSr_)*V$`Xwu>in+AVHmiy z#!XQxD_``MG*qqg$PqieVEhgaFnZhTr5tYhX6J~C%%zqeOPOU+E=FA{>WnRGBv|CY z@7G{RKXsvLlTZPCNlY=MNwVp1;X0?^?ONb!?#;)5&Ct z3yhDvaFEqlh-Hi87pU@;)f-@we>Gb941J5In{uSj7megW;J6U#Xft><^m!kN1k1P+ z4rz~D;7BuS$H5zi+D$9KH({WDl2Z_P5W6&Kgw9`39Px z>q)PNIO%89my-(klZp>x6$2+n^goxe30ZquD#E?=@Sd7^A00%_w^MgUjK?zR*M+bp zz00EnnNdA;DQ}yU&fUs(&g`qUF>^=4UuVvIqG1+DO-~}aI2(Ub)fE7n(K4DPpBK|u+{O$!W#c2MMODV0dhOQx1KQqyb&7-r`?Yv+)=)Z0E7kj4gk*Z02>|IAtK=)ac~ycK-+S# zUmPp`HHax&;&tFoTCIrg)iZGVw5!{wF&}*D05&9sbv|G2X|}}0m5UhlsoaDu$&yyJ z*Mfj_mm*AU(qM|qf>V22Pfa{~2kWq7@TW!D0gry)4{k)#cv{m+=3(a0TAHSxWfJQp&7< zHK-9 zh3m&0BD6ZXDU)Wg9|_=vL$!S%sv$RMxY_!s%;of(G)3khM|?fjmM4&c9-uA9MOWew zWtkcUo>IqyVqsIYeH&CSDXtAY97R7Q_KK6W4~8!MCZ(N7aNux(?$q-v%HJ=^KkVv* zN-<+sThNZao)u^^4>YdyJUaipyWo@j>j1Ecu@iQIRI+&Hci?wBuhH{K`refO=P~BzDdtepq=5j3l-vOOh-bl6 zONtj2Hw$ST{yheTxROT#z$_BI0B>wh7U;kM=hbwy2-VyoXt!9{ZF zGqG)j$cZ$blffSi0;M&pfz7Z!T135prkA8iK;9G|N^DSz&ey}WI{QlGtDLahwY!lY zqkT33%Z$d92sCUoGHiDo_^M|s#tjS8qQgg@HbgwK?2#07v+K45*r()iu2v6UaK&OC z|Dd$F!uvvYjx#q@Z!|klkM!l~(V~q@|NGsv|G6Ry$eHB-rwjdmL>GFdRR5s@dNIeb z1^t2pDB7EW=tBQ^&HipSOY~)^{E5KjJ9r+&DcrpSP9?yQ#A|%Z4PGknuX$fPI?%kY z#w4CF%`1{E-?46X(_xB$GnZi{s1nR8M>~Wu?o58_vj~45-)xbnMAahMCVKxG`i@|j z7D-K#8UdXL?P(rLkc9kmJP|@#=JNtw!Q>y~3Gv@ws{^%_+A|BjVB zp!1hl=_CxQ%p=?Pk}ve>^zK$*wx#MR#JL=fU<&K%%j7ZGF|C}hb#RTTNRuGhByb;Q zU~z&&zL51Cv)V4y$9#0(;9c6tPxgCrK{Xu!wunk85m(0keGt1W=)kof zE?2$Z!lAw>utGZ((k)2=yK3WrOm?|egM4F^ro4n%A?8Qf6J0Zb9J=WN_8kT$|L&iM$NC|kWw{aq>rV0c`8Kfws=j0a;dN&+iBGe2jqIvMVK7Fh>kes{ z>FQj)oN-f6#^S2IN{0dQYDoi>Ieh(5ykE2G(T-iAWx}X~T@>w|6myU0r&TVF!AA;X z2Tt-&q)oR(5(YMZtPX7X@t%=jd^$`6M8rW0K=Iq~8g6GZf+O0z@~?M8VUK+XU5<`y z+i}|&bY*RFW5sbC?y#bq|J*I#MLH~tXA`gE^bHe8OV-0e5pNpRQIH%!C#_}#=X>zO3P-Fji`ErBQ09oG#f4+p7cr2-G$ zrJoszvJ*`C(U=9t@!tiyA|eu19K3JBqVhsOAAt(3n7InQ3hzfyJb79>$J+Gn^=4Ch zS)U~g$QPh-8h`@m_&=KO*nYRf|2wt*f0~K?Gv9#(!uyK^Ui88HNTT0qZ}FlAI(+&^ zx-*8HLSD^7PJRGkFSWFrfOEP?A<`cYaKhL0 z09HLup5(TYXnq%lvF^P+{c!l^h!Hly5A-&clB3h4v z)y@3Dw8x&EcuKlb{fH!&K-g2#s}O7zBX|P5kEj4nk$P>Z>+b;A@#spR1Fl@-D9fhb z$rd;w`f8x;@`OEPjnZ78$Bz3}Xh0A=A_$A26QkJ&G)xMLHj=ybRalsfnBXtA5&os+ zemr1M~Q!*J)nOb7heArlVnKh3{5FaLO2s2)zHdQf?LeVVCr`*rf-R&V=* z?&DK02(LefIkw?^@P9x5^6vyfKxK=b14!u2&{59}1Q$VVdnNhU^rbb5+(IZVnuXDkD(GIh0+9|91K zs@lPC!?shwXax4BKkAUpWd;cq#@hWx>w`EX*|iB$^H)IxAXm+*yr19dCSUk+CpH*% zrsg$#24FVQC+=a02(*n_VY5MFO>NBXwwAmkG0m+M&{W@n(&M9PrYxB|M{Rvjv*L&iJ87 z@9|0Y=`3e28{vu(qk}oDE390#{T&;c4Mo=2D_?c25Zk=pu(ntq+sbG?lDI=CiE29t zy}%2*Bj+aE<*-NY`pAJK1W)uBeMQrPrETA76)|JT1b^}xB9Zhv2aFbV$=KNl=2)f5 z_9EWQgCbPY=4Eut^wdo3kUH)qQMzMq`rWVtuThw8tq%bX-tKo>FO;K>S zNR`TAUHMn@<6lRdj4~-eBTkmiUhSj9e7l+9p^m;wE%ab&RUUymU78MoMW7nelnLnC z1F9p-fi8$4ORdwqo)EK;F=c{pY63!L`%x#$Ny!q?TbamW$y2%qw|q(oS`pC!dyS;A z;Eiqo?Vd+K6Hu2MWxyAI6A$nTMS6P(O{$u3k>blEfGOHB0~$5Pj*udnV^mX|0nu_5 z$pj~63WA9uolufO+V5bIpfD2L{MeTd7ecsk7VuUIUkKh-TpX>n>(#1(KH1L=IG0yA zO*g_JA=;y&^S$n;06B50R*ab)_cY7(kPwhDZ4ZsWSWaf^yZ$I8irIFX8ydMEYxT)e zW3_85^e@kB)yDp_BIpjvfR4X^W`8LA|0Se>w6>kBjP;ys_5Nkv=^hOHC1{-gOVHSP z4jM21#8S~leAf7S-;VSWaGv}-#V#R11Tug=E-0A%W6;U#uWtf87;6gJSnYK9;JRSM zJHIn%3!Ye6@KZq__aAgrb)OWC{lParE$)X==Yc+>+o1Z#{a-~VyUp-zHvvACbF@nj zu+I?Hmpa;px=bNfV8o8|LW4Qb4;=@;Q4rh>&v^KFJwirVgCy?T+`mTL5i!UI9oJ`n zP5L=n5(xr!^EklV6RxIfR*}=PLnD0~3AaMcrUa{yL+|>B>QI$N>byVM+Lu+_zV@cg zQ3%YX;&(|`1Tkvv8|s_#`c4=O{yK4Q2`PxeA90xb29Rp}oGRf@qd}%>>3EEId5>Nh z-vqhOk8kzlJf=DEa-RyXYlz$8D2Vd{aJ_}PLmD;1ea@7mRZD;L95wk0x4`-o+# zyrLwCmfi>5iT4x}CYPk~>9N<0hG^)Qg%MZ$B;IMvccncG+t3Rm{r#3c8i5 z8c?2XpT}sYu!-$*hLZIW_e3TQ{EQzFOClTxeEZUV!3z@CB6W9B^Bbq`J9SPD5xsqvE3*-s#6SU&*%dDJdm37Y?=CVB(L~TDJ>NGkqOFuyl(PY8%T>+gnS**p z?s$2~apKewE&k`^Y(Mdl1qkX0-~TZ%lKg!Q^1PRBY+!F_1|$ModwHF({^fOoeSV#u zB_KFkBPsgA9GnZDBGWj)`F`x&K%&}OzvJ7Auv*9{#-UEI+LpwjT*!0ox5Hg|K;IbA&5vCN)fS(m~&1H{}3^00hL z2jC2SC?a^`)|GVBrJ68|zD{mQxaop0%=ck)Fl#WxUH7`eaW-#6Zncn0P@)c{6QGqg z6WLril-7E9zY>%dW}>n}6i0<=^`2QOEtFCPlw-*zP5wgVixYU<)9S6ex1{Hk9951A zs&jp#aiPDAf=1cqCNgzuEZ{`JfCum4zhCl22NH#bhUj=wvy{gK z-V!_mZh$}%vR!(&C?sXQ2EYX<&vA|XJSlt&(jM;;-QJNucr76LVdwh=P)O36Ch8oz z*_%TzrAa-ti2at#X{$gn3x;AZBSUJ*znbSu$3qdSG~ldRpJu8s!!GkwF2S$0@8ilZ z9zygl4gP||Gq>EC*rUeuHwzRKTsVCk#K@k5Ig6!+@E-j1`Z2EKYtm5F z+_i5#@3>K!rS7_?H!cvCHfy%QhHBg5NTtRPOV-3%VlNfU(+PR#2w;C{7gr2?i`6#SDw<0uuJ#e64p5Eh3X507)taij`Dl%aN2wwAT<%W~bhk5)DR~ z0k<@UF(z4t4=_9^4C`Gx9@$NJti>C-lO;-=BF5Rd2RrqepyZ|(TZV-%01ZJD*5vy( z>}yXRG=#}$t>!goSm5*PS&Cw7J_fpmKg-PhAqRq9&;QP5lI6E@A~&$-1-7vK3v8kI zCv4dOk&;56o}78fzmrubrKkjm_?WYCcL{(5!G*sPn4k+kMQF0Be{Cnq6*%G#y8G1S zs=%ulml+&jHZ=GaCsp&z+nH({#Nb!Q0GZ^_8)2FrReo%SB-z69nSBSaN9^Uy@_=te zM0vuqxkZhsQaFcLmJjJB1n>v;-h!u#b!zz`kd33|B^7b2kkGbWf&nm>qv@rE02%1g zkS1WQp|xb}BvjE@t?U5w#-I3_g_y7#@RgqGSedPD>e|GG!zeLS$D-vVo)A9d)%e76 zBJLt7rBKJB-^AE`LOr5MAP)<~(Ks6Y;GqLFVB{d8V=#fvHr!;mmowD6ad{X?mvQ*f3qiJWo+#Ps%q?w zJ{Y@!bO)@BE&s78V+Got`A4%#C&64}d>5@EMevH!u_zuT&K z(fd%gNTxELqaxXRIFCni?u)pBG_^4`1V`2SbUhr4^pG2W7Ic^;OO`Nu&Mrfm^{Y zWbs;y9B7_a=Gr5f*Z6H{V~8k>JC)5th5dQk*c>ocfL*08cin}ZUtqTNexAEAa5 zR#Yy?rcNaP3MU^Zg*2KS0yiByQP0&=Xg$^x;pP16o7}$d=vj<|z|OR&=xa^&4^Kp< zedqG&jt){~DwONBLt~atY58xb9mn$mrNM6X<3YBnWJqkxzR^1HEiG&(?j$*)^Ta;G zsY2dUcEO)KSe5|c+*5b2-XD6DfpZmAh)AV=4~S8*))#uaFX2oiMnhj-%HFIfpY28G zW9XW37q&6v(#L-#7MvX5Bx)-1}TiS!PZwaHI{hRPULy(Z$)I?c^_O;DKlpUN6sn#HMe~(}d zhoc^=lHB)Y*<0#>4;%dTtFBNc-`yHrS>nCMd#JTRYYpyuBx}^pGNot@Ic{Z;o0*K{Tj-yK-$nN|n7_eIz>6 z2lY^JZI~|e4(0EIYV95j6l9q5=|mw6PV^f^x8@HUx_GWn**SWz)~%|B=Ecu)VZEYj zwygd0yP$~#yV4BQ=jMC#R{8v7wdHOmYi*CPl*MlX?}IGPesFHC2kDkjrfXpJm+vlA z&d1J$_Vi5`96Jbk>?%2&ISaL}cdX6qA88D_%}~lXja@u}MX1V>fDLz%EL=%}YW^GSCW@&N44#KGoB|65 z$43^mfgm=Wf=Be##ZTpeuUG`B8cCv|z;at;^wO`f*pL-7GUP_gYY>y0-T}VtOK|Tj7D^q|w?!7Yu6{>t<#qdX zKo@iy@p@%i{DDk`d<1$EN*F`1-8GBcHn=s$sgy4l_Cz?1_Hcj6y+n6qoGCW^O8jh- z6rGg+v1=wBYiN=rYp#3^3RL{kjU-A-w6r)~MGG2O1-Q&+ z!Y9J^`QptCT_mTHX+Jf_z_E~8ooneJk6VDKG4pzuDA&adr8Tl4)c*UH4D4}Kn|sD6 zv&*L!WHU}_w>u040Gxr2zpw89lg-rMbQEP^*$cFJ?jQWdgU|YjFZIYjo6D7@8N<)b zWfQRIlS3V1D~wnv91%Idy=lbz50IHzvleY}v-Uh$Wj(Q;%HKvZZt{h|_@0n$z1l&d zGvCPy+5;-0>Es?Ul}{K4XMY6Z-ZiioHgvdAOq+J|&69>_$k~pZd$8rI0dy7i4jrOe zW8!IbdJ04zK@xK&t}CkiJUqQf?8XSTc?Q3nlX35W!p2SAlfiLpE!`N<+)T}I{M8wQ zt^ldz?{ENuzCMsJ6_o+4s}_G3Z7B+CT=(Ci4Vgp0h&(gKv~uysZJ794O7taSB( zSm`i%4IMq275!bVhy?*UNY~^w5RF$GXPHXEfCwP$-@d>l!~$0+;_u%=EdhN7&TXXB zdv#0>hd_vP%jp|M0kTIhSV6m&1Mk<#Qb8GhG`I=aW&eww$ZDwL@fLI^mH!BO$o?L~ z|6`V4?-|DfJz)H=o;{}=VgC1HG6S76)B7T$C{jerA4V;Mg`l9sODUJi!y(VSqP4EE zdS^~iL)fP<7{OLUxRsp3BWGfQ@#X2#QO#)thN)Ry{E3h|cHxz5K|@Wc==d=7YRfuf z&xIoTI;K8?3*V#k&t*N>?o*KtAxRigPw9Jxn?jh0FL~h!i{5@D%{1b!{AZb@;#qhE z@S-p)-{ZaQTXn%B-Dp>P-d z%VKbEJK(r0_YzG}o_qMUcpU#w9NS{O%|17hge6n^^nsrwB;6&Zog?fU6;G4YbXEcl z%_0no0#iDGn31u|#%|OI+L-)%!`edn8k@YpcXA7Xu3Y!4?6XZMsa@8gGJluDS!~{w z9sBvV59cCEKbNse8P}Y3MA1}mrpLT`t1wuDKFbv*DH_pQ*B&2Q@Y(lP_|4CFSP4LS z+_s2sdeCDOxJ{}4QZgv4o9=5)@=*WDj|TVI@Vl1~B|C#A6qFS)I@!2^ZexCGv$iS8HT-TDjlm>e28GhMR{9CCv zxWNTn;1RFqfl#iTAKWZN?ZteJ#S9KylV3yHj6ngyKQ1=-aWZPDTB+tsO8C~c&xaYq=VezU##)m&N0DFEmsg}to%vjqVaRCmhS`DK;J~b{ zR-qEhm7`Sh6wRA;k2|H+ay8!o9Q7-HFe5luHNKX?R401Eyjha_MqKVfxO z5JzuF?==j(f;Vcse5zH#57AMIe9zOK;gveBDA}(pWQd=tXQUF5sg0*YYr!zU5Q>kv z{KIsLsgjI?t3vuB`rr*tBTz5p`dzJ0wH1*+X?U}Jgi;-4T12Gks-a+WH~zH5M7->j8 zb(y4q&QpWjD_@+kDr4yppS<|CwYS2~hk>R$i3n9GWCN^~Oox2cdn=H%9*f^aRI0&< z4s3Ap^;q@G7>pKkqou-mQt#4fRLDS^79aL`fXZR-p%=4LGpmhr@;EaJft?}5QtiP# zP{Qg9%o#G1Kdt%WTm049hc?I{;0{U?@S!QG&G9yZ<(!kfN`5tbp8r_ClZfGPJz2_n zP@{zir~=C;{Vex3*~piW!wUB;+SD%PZ6DZnCPPA%ip`i5Y2g*k2elD6;kpFNtm2IA@7HAs>brb#{b{MhWB?r7*)+RcsEQ ziZtPwIcyvgp6PKhp~R?5$PRZzrS)_!d;qI4-cVpXwO>!Dpm#97sIQ5gf1UAw`4*dU zL(0hM4*d8yobWnV%R)ftMXqw-yLZT0l?^d_uolr|ltFMlEJ8^{=v4AvEPTfAfKBL~ zM9O8Ti4yGYA7)nPJ0H9X0-Pg(EvvHP;mVzFSaYsn^5vyE{OU8TF)ZEfF1?Bdv6H{v z{DQS!HYa7;KM0x*7UkJsqgFNQrPQqGH!j0*pM`PO!1`3dq)siUP)ZlAS|mOgv}Na zl+R7rA?A;T{BT!#pxS4Z`Li`Nvuh^rOV7wI?Y9l?nJ=H!mQU|4c{&5Mb#L>~uEUCy zbNOkC?W}!t6b1PV+;CK(KHlizG;b{AP@4wE`RC9(2~7VW$iFZ4n*~U0BZSXc=&q6_ z;SKpOeR0!o!ECzw=7Rr~@19e+jMF$C@hFSeyI5JVxIW|On5X7;1+;jILVC;U`j*

    MxqmiVSs7G47 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

    ^wzQ{&zMJ|QM2NJNN}_wN+G;_0!Q!r?(K1;Z4Q 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%0D_8!EZr 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 z zr>6a%_#d=%^gq3tX_PZ7Dhz(lG~C47DB|HS5>PVwC-q6Fb;aLJqz~C#znCF z$PFt|GGD^-Vpw8T=F}ql83mDl$Y*LF#%gjzNQAu5-{L$v<8C^#ZXP+icWqwYy1qZT z-HY`-`Qc;6Gy_~vkY+%W)e?c={tE7clr{b#-J5gmZ8y@k{^Kfg1^PvnXcecmxMCkW zxJ6PG)tAl8CmQ>q;)30yU_=0dFu(GzieL}pk45z$50q)+c8_dpM>o@Rr;oEWR`FG@n5!{6X3(093IM=-z7*}K1SD!u$ z$JbC41RDoLt5D4*mWZ=~LZjr?RK%^umXQ|jJ6mRvQZIbm03#28qiwnGpWKpnZ?JsJAZ^J8K&J|^QN~$k zU~Os_u~!_71oywi&vf{`x0T~ZE6 zbHu{Li#eU1$!em#L!>NuU@19IBNW<`NnO&a)kkEy`C{K7vL>!Z+4wp(M~QP&_oC=r z#fF6<8+$1Y;61(#9&*BtUJV#&+0z_YvH?FfipxW(WZtBuVC3`{q|^v0aw}2YQ`)q$1s8uox^U8%YOhJ)Lj`BR zs+WRvl;Txt(n9^h&|`Y@TeUw<JoYcY14tILGBz4Wq)of;5 z(W~QCuxaln-}hCF@)e1s2};6jj-;KSkX%o%xx5|7v@8=I5+m|>ojj4>1#WW-mTXJu ztXY&0)l|%ro$RZIs`jxwsMLJUJ!A~z-H$GP?CFt|suq2}tn8D>%K5$6F$~36LLug} zOKmOj&c&e1h@d4m#66GGOu_8&mV+wO4fu+`(?%%S{H)dTsuMWn0Fr zyUu->82_}P0=o^yRHI|!IV!GkR9~2He()~F4X1s`F^-p7=@g`MIdg!0XDiU}3;R0s z2(FU}&15+1$P|U$f~gQgFM~G^AWQ{b(r7;HKv>4#rJc0R3%pd-zP^F9Q24L_FDvaI zXsx~PP>vmHL=E))sd9%v<~A6(=Rd!P-sr8ja;Ntj>;lNT7 z5#O0PZ zw3$;A-&9ft3)^&bxAu*E@{&UGQxuzkWDqn|$!EU)oVx}N71Ws5p|~niy|Bj0(bEO+7E)V@6lPHSe$7ggnbi6o8$rky zV)rI{5B0MxQFb6SevdbWR+f1N%{+u4)sIgw1r;q|gzFbww&RmUNBUOEEr`wlLii;c z&Vgx`O*sx@^f^zp8XtE5_9m)MxyoNg@zY?UwyR@x2=~GA+%Q@BdtL9 zgdHftj&Xr8dN1CWlijX|u8$QFu(3Hb%#%HmS#H;$I}aBh0n_5EcUv_gnJ(c~0YH?z z=Qe10EnJR!ONXE*q_+VAu9-p|r612YIH=>79N>ig*CRAAYVQr7xOh`!2}q3GmQhoOhlVt>#IeWA;0@tvLrmA1(u7Z1e}h=b0mj zw?>_vN9{%iF;m<>g9?=UipZgqtJ)kx)Fb2M6^15*mm+FL zkff~7aXo@*O{&Ad@E;+(BSY#sN8PaNEhOra0+!9$h#*%V&XLIgS4N>T0!FMI{&jtPNA;qy;=MJg z_e9u@wI)s^{*|6M_4isVoi{a#uh`y}bVi0GR-c-u9MEgaye|~l=zqOAJVw^3gpWH? ze0v+!wKNwks83w+X+)^}1|7PcFXJUEXx~1Z#;xc=-Ct9Io%9F8IDuk9h1Nb5ieiRVCL&0J3tkHI$qn_?LYRq z@9nhPcp&$_2wv*Bh^Bi0+1-s-*Er%PQ`mmt06q-beckY#8KJerB60P_-G)FvOSdY{ zC=iOB561(FxDe`88EH<~QTZV^?|IFdzD@o+DB!&rDDe5ci2c5r4{Q|q+xW!u_&^ds z`?(hN6g&SCt^nZsbG6TRygEE@v$m+&?5-Agx1LgorTe{Q7w;%ov*5c!i?|x4tfle$Zwx^8}}M_2la2r zPhL6)SqjI&kV$8GS|$yoptE5-6 zeESFK;CVf`?2#mw`uk-;lWWdT)wvO+{y1J?HdQ*bb_1tJB&Vxs@OF zA_mVBvt|pq95ES_+ANQN!+-o}p`O?%n#LUR-_~T!ZlZw7{zw1nm1_e0c(DL#csR~h3iN#yA3%(YK1hZt# zxGXuflV_{gZyNXC@RhZ3m9B4bzoWqeC6KxDebgn!cZ+M~ywlbQoG`Z<8Zu|UKAj&* zU9xLn@!vj>eiB}&7tpv27!$x#3HoTMH^W5v{I*I1&IMMe7<=3 z@;5)>_2eg>5YD1`zW|52DlJW)q=ebTk7F9CnLn$?FY3qrVC8eFXT8fcVS1I4bZ)c>io`{qwu&1KD zC(&gjr?^XZFG>hXEyiNF6w(TW8b+Y2O(^>NJ` zUB^nY++|_2^sM7PcUW`Mb8cl0B()dWUf#$;!dev&bnJX6^G7{B&U2vLowuYJ^)#>G z5@jz9Rgj!uscySjP%gGR-5Olp`b*Y(jwTZO%7~u1JzW;Ib?eD8Y z7?}TB9rCx;V&NcvZIl^au(}x8w_h#Fr`CU{xN-ph)S}cP6@dIKfH02RpPu^ro+`J$ z{~}NS`=71p-!O3h-7=(Z?P#VAk^rLnEP)Y!lR)1m348{^{V9RFZ6~VA_Aw6$a5k#( z2Q6ChEbWGs2d36rOAie1I=txUrQ)Q>Y#|Q92Otlf4M4`+Av7`POpTz-h{z)vj8?Jq zc)}CeFJMa#R^K%G#2%xlF-nLP&?*(Rf_j9=M+?xFW#7lz*&wBOpMpfo>eamh6iqQ5 z`UWl4+GZw!P4_{G1|QmRr*}8o){ZJcTG(9I8E{-pT^q7ie%~JxXT2)PM63msXG2o} zOH;1Tv0Q21GgfcCS-U|~h1aMYLE#l*@3C4IK>_`-D)*9L_7c=+Lk^l?G8djKT>%;} zT0m{NG@Xn35I(lATD?_UVNk`-ty>$th2nKBL+8>kak~ra-x@fKso3;jMV9w1VJ-u~B9gUowNZ zQg(%lT-9)yvA;D{d&y)%#A;X(G|r4pY3k%Qm!pvrvXMRX#dUdnBBj?~mQ@$3|Knm;s zf(#UZ6s*V0=xofKn2>CO&#j?jJKwA~UsUaix>ER__57ssF{+XFxbn19VB*19$;DXf z29tBB^DLvEyim>Ll~Y~y7E#ZQNsw3DEE<~x!*Lg`zk7b`3nw97`^He?AAWXlu)YI* z#OTzdFJ--6?wQwYb-EP&QQb zR1otB=UOO*3q^mB{d*#}3Vw{*UG1(h=O4ztW`bQ94(On%=tj|gL8pA>(308t8RA{a zV=ddPBg)}2<#LkwFDNghGwgdX(Z##!U`p0*a1J#NR^Ht!yMB0-PaUqky&O zhNW8n-7Np!8vbMQoI&!P1`2D47x46@Q#zW zTKI*sYZacwd`z4D=S6IVOt$hpN-R4ap;ewz($Z3LoWqZsmHFu>jPaBiztY)b}LzV%~afA zetF?UHUoMMGu+&M?tab}ZN12$D1)$n=O?)<#e%cCY(!=?wXIJ*+tpR;o5|sVq{NC4 zKfbt-j!B&sU(4T*=~XluKeaf>L7z8ZCSJZa+0NICMjTNa_R{3B{`Cn3nN#XSGO?WH z>$CyKtQldAZw})2kJLX7SKvJhZBTKu;T+^hZA6OOiHR|a00$yLP~|*_W{u|lK zYeM^>x3FJ6XN1Dh9Kv((q~%Rb+H#A4ZrlbcTH2v~$S`hNJ|(J`<%YVK2!!DA_GO}K zHbivjkq)WBeOp+5a}6o*9hc|on8_aH)W%yXg5_?%CGHvZ*GS!|-~`Cyec(o0yyF|9w>J|KehM1rAA>>DCx5KdjL!Ob3#LL<)jH1njdC*o!XEP8`}BxQ;;v zpE9w+G5$0qF=@;mq>!^dat4aj6IyF#8|HefB5{?7wpN12n7)Zet1nEwHqr__v9?ms z@17MVCm`3y9cT}y{%A4(d_rprL!gP_FwESSBQZm zl+<99sGrcZYr6vhiSQ>LY42Pj?s?Lyc5%rJ{<&$D`wRS>KTwWa|0v6Rzx9p(lI7o^ zIX-vx|Bmbb5zbME7vM;s)@r-T!!p4SYFA}R;dsRBdo9c(n z59?1`QKLVxVd7GSXd{8=dzwK0pJ?+xoWozC!E+0QBd0X$|=KzdXc~UOmT4 zPqhd(v$IEqOAx@D;EnGyaq;|u1bW0`1cei1u-4r0)`a)V(8un1!W62#F-+t_GbMZ| zwNU8!3f}{OYi07+9@NfnMY&|cv7*u1JTgNdb2HNEUoBYlx>AQ1<5^sW*g6aOl}VJy znnt+#_NZ7erY4mZld#b!44u($ z3|p5z9a&y0fe%i%Wng`YrS?vnDX;d_622GZAEwflev~~Bc$CFI9`=7Qyzz_+|ExZL z9sd7dc;nK8)zce7bV;#C3;H+H8$Xvj$0=T+d*HxB(u#uZKxn-tz$oJl_|DtKYo*4E z1LzFyz2ZSa(&{Md8M|+WgOgl(vZ&}aOG{jdwr_Yd?$;kvanya)^%j9BAZY@IX7*zp z0>(7^PUOm(c~RwM&ZG^6eiOpEqskP!yN;nQB=KB!x2?w3ZkoKx8*0uxEn@myDjq9} z<;N}(H5+pCZp(*GYLoYy{AM#ZK~vV>7wneaaAYPv1~v4!uUc)zMq-{&r?yyab}h^N zKz1&CsDo^BZaiCQ9#J{^{^RComkzt)@#@y$?4#|3634A7TTjdu4Q+|!^7U}snNdWn#Yh3rT#CG)~Wb$Lu}^u zi)YE0M+Fi}?#9YT_C=}2(s`@PT#)VxI1cyir`|`I-kbgMzCFVaoA0k%H9I=ZJHEN| zUV|Z7&UjqiL&e>$;^>II@K+S0)wgt=uq8_GP&Rj0q*XqD_*OS@uP4Royz{-fZd$>bvDqkKW`*BBBQ#_ftk$5|#U=B(o*l!vhqC zoRWS8`{~g6OM7_xB6(_ow=Hgdw-+BSPscTksj*q0hbBEK>mJpPAF(S>XRounT^^Vf zs`#Z1j8d;$Zj0tP?uS04H}K2L%Qdn)oj6U&mK41|kdAC=a1Hp-M1g&I_~4fk8d=H7 zr5sN&&Mm5{ik=Z)$Z~e0Jt8{7%Z9xk)EhlEbXe?ne{!>bMttcbcX;5S`KVfdw~*w` z?cYGjw=+30Iij2VkstLrln6L@HJ=VFWt06cj)4F(FS=jY0)N~b=K;i|BMN+IP}OQU z-FSv&z6^QeTNi9hRt}c~-Re&E*$;-Ls7(c!vkFV2U4x*w<5}0ASqcgUB*aeu))+ll z+X^xD^FdfM(C0n0WSgi6zQ~{pf5(wiZspsBd6N$YV7FYe-vxNk0K%d}lmIK(fVZ%^ z02>Xs^f_MupyjMU3)&<88)%w+M!_yTfWZ;?8*;F%2u9LL=HEcW_>QeWXV94dh~k*T zFXPsr!`jpW3c_UMsyuKP!eNpMV0gU&1g@<4nsRcWE?fA0?QMkxAXyV4jmKfbsxLA> zzycBB8P}GPo{TQ9cl+dj-yFyGTci88B=?_to&Pq^xd0$~c4gmypYqF<^#I?0UQz+! zZ~DSB^d5#62b`pTh}0GrzZ0Lar%il65y<2ZS_xVVpcsWod-@~p3AOnhDKU}NGz*Bc zcW}q8A{L=69Lg0t4{;dd1N19`-#1=`7;TpPk>eq}2dc=xY z7WdY9Sj5M+ZlVN+3l}GhhoS^z3wLs+Mwdb1HeFXrEdlTPWC!`x%V!fQ^$d%!dd4`k zD(s5mI_tD5nB;=fD4469yF}}?T#D5@b95;5(%pmYTb|`rxp(2yD)3BCgNMI&UcWCE zJXZ*SF~Reg?th$&1sMjRd(Ii31}T4$u^#wNquz>%B-a~ZT8KbM>WUCJ60AmZc_@9b z$?ubBG@l3qM*LCHa&$fjY6<~VivWf;48FGMAg>if@EkFLUN%Er^!&K3W&S}?hO_UUm-y5g7?SmityG&GiP%c@PG7qM1DX# zSx-ofJ$C%@`l`OQ)cC621^uoWbQ$yHmfcM~=&0~|3-qqe&z-s>mGXK^>#h!uCw65- z?%4YEoeC^ZY{v-tiM7m~3MNl%&dB76GsumacXO=gQ8b1=%_jX6_Uwp zUii_y%4zyyit51q5xp`zi!)#W%yxw46ks}EE!I`6JwddajhGBy$ro>fp4#aFPE@C5 za_SBjaW^s!*&aiTMMfEpp7ar-6#A|N^fjAY@0?75w<5*~xv7@v8Y((Gm#U{1K!=!S zSiav!RZ{9?14Rs! z1?0+~V(-&V@vA8PVg=1lCLJu-k+KmR5R4B9goJs!_c+5G#+8hgmGvPuz@LH;H5LQY zBA&1u4cQA`Wzc|RgDD-*O8mT^{0rmDPQA$83lr2OuVAOlw(*WBB zv=#CP0^mDvn@U()3Ex{WBLFiQ_S8#|&Tt#Rw=@OOT!2u-D-Xm9K~j%5hJcwefY0T9 zAmk_z4HNb7wR0N?|2Wv_YU;@@C`ecqj>CZSQ89o23*d%O0P)FBy!ku`hXN3wUf=yu znt$KK|H~=-BeS6e0SCE#b_7o!`^ym=1KIQ_vdIa6n9)0MYYLa86bJA z=#jVVg5pI528+>pLS<5(qHMCV=ux)icX01@s?ifrehP-J1*Syl3 zv*#kctiulK)7;(@tl{s?=kH5Szcml8unt`N;XBqJ{v|0>Bu`xIPHhy z!2h5UXEJg-2N9Yx+*^xPns|?n1;~brp#WNYfXuxwsY_l54<<>M|)dK+WHe! zfsl16VhjJhjh7Kfm;aoa|IJD1nOgyYgn^OxFI0beMvy@ehG&891TyiLK-U7_f8Gs= zMG%ueA@1z)Vtikt^PkOny!R&pr11e|+Vp6Sb3U($a)w#odKU)R$5gWQgc+DobGayS zh`bjXa<}8LBQW8ggZK_Vft%6QV9kT9XrK~%`5iWyjiYgI7Km`&Q9|ILmbHj5rX1V* z?m#Fe{n|*H;N*J*W3-|+!sU2Ewcf0e z>!EmADO8Cj;*9tzuZEJ+IE^Fe4Nr_ScywW;Kh6iFGp>~WPP*jiQ`P@`hZK zlg$MRqqcFF0@2cIwj|<(-|!J=5L9a zf6SPu>ZOHa`_LxR?tr_<3R3X($Fi?fA)KV95q424nE6ti~+W({!sBgpC z*cuA0U~ZmzGEVn&O8(5Q*Xx=mGr zrK}j(9T}w80dMC-LVjAe(O@{G?<>BhGQ7!X26}~Wq&@96$~|13TV@+0zoJGFfg$#l z-_0{X`p4G5AhGPia;B`QN%4C#X~uk#gm0t?jH^1Jl5;yO^|$iIH)157b25hple7^!9w&OC zQ7U4(d`^0?-4tSAl@q+X-ZU^oJD}6~h(BPH!@qf0p2xGBZ;DcAa4WbfPLML75~x1> zh0LU) z?ig5@w+jzTvi-ub9m^R+;uwLum6V|R-R<^~hq+JaTMwxF`fLT{w56_-1vj4oIYg%U ztbjnLkdRI5Ah)IqCAHO8H0D3lOUJInv6C8`5b7GtrwilhOm@7P7@XYo-cnN(FUQXh zJ~JWVnF(M|X2yNc-I4siGJ)#WUu%p~_)QDq$9m%!W#5vXM9wkMJwDju!BM5ZkeY1xRX3swqIV~wE~YXJ~i z=~yAQD)*N?IF7+n_;4_z`)rE!#>w9CXN4*y@XMhIT`EP_#LfDTZZng<3`cNDcC7ihsck@;(!7wHI>&u32hk|~=Da63xge$Hh0s=9JHZm>nDoo$n)Srqd^{#P?>c7n*AJCWo;~cJARBoN##xuiY!Jg*YFwGR&Pw`)w@av-dUz(t2rKxYKYi6Ua_q34&DE;cX4nXv7piKf+?*HP$ zdkM34S~MJOq;L)7bn1GIa3=n8Xf&b47^l;y*`sbKVBM#E^?fP!sQcSICr1Oj8O}*HE4BjOyXeVH zJRHB%?C)Lra-WitXeb`eK0<6usG4S{@i%@z?8VRMQjMgVo8YnIOT6(FVEVBqqC7)q zF#DtB_Rw*+k3->!ZpfK*Y)@Mh{=B5&SAOs>y8X_I|IL2*@FMx?ud-qg*D;KBGGN$| zDBz5Z^IHe{`uY~zC4zw=D}F7yx0S!xMNPhW)$IS^^M-&;|4f(Uv6ZJm8#T9+P|HSe zS+G)o1Z#}RmJY;!1w6?U*65~Y1&`Ak6A9cfU0beS(jY(JY+DREx!=p>k+1LWkYc#f zqa>T0t8^;%Q~V1nRjR~(OCK3QWb$}n##Bea%(s6#@#zuj(u3p5ZK2c+-;Zy%-LY)_HBsmLYu8#ZW9xG$M26;74>)) zHtPKo-jQiEe$p;{$HG;5pAy^BHL&}DU6rtCxIS@N6K{IRac-nP=yc;S5ImOpa&JJ% z8q#|Hr2vg{S)m>2ek$(6^Psu>3A+W^f0f){Y48&VG=ZzfKE&O=?teVSWzHoCaGH`nx*K_1YO-&xMH}@M>D*>IV8}op z2RoyY4Z&Q&oq=pvAz}rHXn@jNz_@uy9An=>ESkNpL-U`wD%|MEPqS-45fn_8x~9)icJo%6A$%ZGniHA! z4R~LMjtZv6p5_Mjfn}OH+hMtqQc$5!HAL9lsUw6mr%-_NS^&b3Hm344Di*Tn5EzuOF z=Mur{ZIrZscf~3zG-vsx;1ZFGiPh=IoRQ7+I3+y69nQVdyHKW{Tz9AUqeMlQsNeQl zP@7yEnzq|`?w+*_EJ!nE6KLl~fmHl`r1Y!5^(O^?O?(>Inrf;4i*`Tz0-j>k_YJ@x z>4|u+XrlYIH8l8>*}uVptzn1FD29u@ts*omn86<%(a>6Vzsj^i!Fdz3q9`)WetE@R zly*Ypv4VjQzz9gQ3q__p^=l+b?ZdRHJ8y%$+(o!3wtDlm$eowx~qkHIZ8f4F+8#d}*hHzR6 z`t;_MZCv`LQb$Oe6w>a2K+=#DVkg;PRjEfM=Xb(XJOiKpIPvAWF@1)t>2_kFo| zCohs~C^SEpUyNqg z=PDei=ff#9UHX=Y!%wDNrh+k*AVEG~G#YKB@ZcCd87;f1#$3-OhgdC~@Ng96dPcjT zsQOw=Np*M7igrC5Ww1`%#{p!F64~>j!4)A6AFj=I{NP>{anWqh<3|^-y#-6WeX_kp zigHPXC+P*=Dpz>vgS*A>nWWv;VU@tuCoj(<_*MR^+3tJQL!sC+hFF&+_51F}&TYv1 zlJf!6ZYTEv=_lQeJ!Acf1e8jZKgRIC!pEQF{g*HTN0I;5<@~F`@26_heQBpfN(w<; zix5yC@DUUc@`Np^M;s-1(14H#6cvriO51>T@iJdjI3!uw&JYb|dgW|iiKooBPT`>u z$l(Fasd(GY!^rjqb0dW_LMAH8@zY0BwQLMa6Pn!mL8%#&@#^B{5W|RX=+(0~-OS{$ z+JzPQs@hK0SbD{jX}0TDv6VQY3xYgH&H=sRfxJ0!XLo!LC?Im-AbWd!O#+?wqza+K z)@j3#DWlGyM>1*+c+0Qu2viEES-O>$>EP0 zjQbBU)HX1*_-Xo{>GnjIkPlbfp7vs2A1)*8w)<|8#L(kh^2H0~1|cABcsue1rGli5^sN#AvlZO}egWi7 zn&)*R!+4%ZRkU<81=&0MJt;W~7NiWa>1eaIuSVixmTzl>3RxhiVzcRnOk->v^NnVU z7rH5?ZAlWhisV!`hcs*H3UY{NnS=#0Fr~K9?!*U=TA>(HVfEI8N_$!nDZoW|0rysE z^ItDXYh6BtS}wOc>kXr_OK;2^w%PA9;Tgo-4mM#JC;Z^18*Qcyu{is}aPZdnc&zj7 zTI<`6g&MHB^#|t5wv+=wGuqz!k=vVKOPWMWFey@chcG%f#AWllB&_5*9_5F1^(%-c zdOLqo_I`qN|MQN&U(;NF$>q~n{L`>Ju=nNpUx51mb5-t7?dKEkq(!@L5i?~0^R`>% zx4@{_)%uFwhFxo)+sQntIcI2S1u$QMSJ@G248r4^zL^t?`+$VcspjC=nCiku?n;L| z0nvma!;g1dvK{co0imQ7rxEO^t*f2=V9UW#^6H~*FfPs|D*W6`G@%G=;~?On%MkJ zf}g{?pX$x`l%XeeLDTt*%S{R(idw8h3AhTmWYu6qDvAq@3zp-zO0c$3UV$9#;7;Wi z3(Ihf8)Tm7bgO{`5`p+QyMXi}wazgN$1x}jis%h5(AEsj4g$$IjB~DRDxPIHHf1{U z5lF^x-JACp2hD;h3d6QE;Ia=te^qCOwbv!6pg%Xtj!Ls(PZ={I|LzNvg5$ou*P{Pkxd690pU zS|+x@#c>9@X6m|TKbJNCJNkLbu+bVZNjoL7VSx1|IZ51IUyu`cQIn!x;uxiHM!9{& z6^6K(D|~K1GsJLorV?_Jt<%)?-Qg_Et5nbzCC88}aM0h(EZQR)i4``$u0^RaxMx;U z7M8f}ON8W@1XzOej2p~*G^e$imi#Pg8M;}Nrq2dpqv5R04k zR8VIE9MD|{-TZs~19)S4*w&JG1ltOFy>4uCL}VA#E#3vBI8U*kMfH6o4i#rgF_lH%?C((oHqQn314*Z{*{GVf= ze^c&f+&KLdH!88y+VD%lIcW0ULlRe)L?)L;?v}r^c#= zxtb9r$Xrl)9l9|+pg|SqGkSvSG^pdDHYu&yZI>Kw^`tkO%3iLq76%mwN5p-USLlJ; zvpu}O7BY_AtY$PrMMlK_h~Lb{x0b5Oyy*!11YSS3?y3YljxT4}Tn3}s ziqZkiOIOJ_2lEF)_76YH3gPc%d%pw4>Cdsxuk`qDM$k;t&QSm7f=?hUrRh&Vq#Lb!yeWvpo(CKywH*)#W6~zvgAkB(GMw+ zl5aSYyb1D83qS@MhlzdD-%jMrJcrUI0 zNLkSrTI8~0W?1-+m~bifz<>ToH%yOfue!O6uxb-Fp~+OU4u&g?>b<$l-K0LhWZAsa z1de~Sqnm5Lpn2B495|M8zj#UCRgqJL=lQ?~On;QR}wDO#0>?R00=zn0+{iI2T{>PmtBoxeN!(OT1$KwNV?|x0yKIP%-5-j zwtpL&OU6F`@G&XUQ%aZqkTqfrcj4mkn#pJd94kWE3_9r~=yEnE^3JfvXkvuhjxsUW0coMJ$tYzvQ;A zy$fA-X;mTOJRM?c4#qviR-qOjqB>hmAo=>rkclbrAo-CyHPwGv+hPI4gvP4NQT2k# z)O_-0xaI_Ld24n*veEtcWy19~qPqF#qnsK!F>^H_fqe;Z9L>z^|J&oJO;RG_Q#GaQgG0%}2$eqWV*IzG)S zG9P|4oWcQm75HkdwC7J0bX5>VSrbE@f03W#H_w>T2SSo~0a$eEfc=iq2=F9;S^ zPQy&xQAE17N3d7uX`)FIiY z3B3c+cNxBfC-NIa-J6slfsZHF(HUKpvRq8FQjtE7Fz?NNaTI6Q_41mBA; zRHs2GIFS;mK33}Z_=hssi#B9d5d9UL1uqETMM+T*yTZ4=B+n*ET$$47Pky(Ejbt^SPQ%1qaMQ8MOIsa4Fs{*huyQUzgM@J z2qirh@_rOxDKfV`n4i5Cj&-beYtk=Os||%}I&vCxtBs^xT3mgus5n8tlVJx+HuxVU z8|NQfc#b4Y&4HIy|1#v#90*>#Xi205##)-ezP{P$5XOck`<$Mb1ZB{INT4{a?S&3t zN4XV!DA0iw@q+`-XWV;ytH1=ypVR|@Fo=8XO*p*~->9e_Hl@2r2p8!*H6`Rn)_>c~ zX1JJLmmfiG=gV45nas$tm>`9yw@l;okuQHZisXPTz#*VL;syn|7e=|;`c&W;XYg(O za_A`r_d5JCV2|wsCQ;}XC%r?`+^a{7X0|bFj$GHJjTp_`ySkI-o1=K0(SvH>>16*H zj{XP7_N>{@N)7B~wKBA@00Q?v|Mf{GlRpfJckm*m44KW5p^2a5Lh-fXWdYr<#>v}e zZ|Xjypg`=1;-yZOV~EDUa|jpEk)@^^688B+65V`xj#cfi%Y(x#9B{q>HFAI_t^8SqD_Of7<@DnQyP;XJa*CV9@MObq>-NNEJNZ{F`LRs$t2cF

    2Y+@QNE*CC^@;ZLBwrl()`I-tnTyy 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%0A&@)Knb+X-E(F%!Kku`Wb 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≧*|u9gM!OAZ+EpA!3sc*c@8NFC*(V5XaP$ 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 z

    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

    fa8nv9*!qH0JBWnlZt| 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%0AY8Qe#?(yMs^ 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[vkvYacEvh@J7*^%5I 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
    c3@#F=`=4tMKEQs6>+(xiGsyq=Ts9fyvzT8V=XP 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

    Z^K`C~ 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®=BrR?) z@gnLVjbjLY23a|2Et;ltr&+O1^ZG%={CmijI(HIvU z((4JH-ToX>^s`I0Kj$SARjFs|bvLfgl*FuajBCQALR$XM%(3kOC+$bGP!UH(GCaW= zUi#LL)Z-7>cHFpso4;fmkKD_IT&GV~p1Ef(40lh*M3Z8~cx{u*q4>@pyq_#Eu7F5k z?<#PdxpP;UTyo8wig9u36MGk` z)c6H@6?JH=!-5Y?G8VkRp%U_)rAJg@)Lnp+aol}#S(1$*XQ0fz`dQ0Oj z4^vBijy1%i6Mt;yexv<^hB-}NKp%|rSp1?gRB2w}9-#nxbbZ8Bzl4iqBK2cZ+W={K zCF1-|YUZ;AyyTLjB8gUKThw&r#f3e$)ooCPF7>h3($gW2X##mKI|my%qJnusqo+m? zvA)2TE($Xsn1{V?um3`qEp;dB16}&R;UDg&Q={)6r0coQgt{J3`u_0Aq1w*%fRj?; zZzb*%)H~&z18{a~*d+RTf!svi(LBU+M+g}AsmY7=&+rwz)|G4z8xEUTIHE0e|6m@N z2S@0jjBCwsd6C9}8|G3I<|KSEX>S=Tx*2ZT%Gk>8A>!EE%Z83GAcOyz-dQ^yne%rAV=1A(csaem%g;zZhWx#X=O!2#z09^+;8k~Cv z%-!na79>^pR`x(nK&lxlV@vk9)~7Q;`zKc8dkED#N4b|!@+#d!&Of3@|3J0;jx8Y6 znAbuZ`sf(=8otMe`j7Z7qq3rd7tbr{96Hko|Ie8DC9D1L5WE6_54)))Z_z`aZ^j63 zKj1m%k<;a_f%v;~kn#QRs538!A>>MFqZ9r5L&nA2WpF_~yDRQ>$lMM8;TpLhd0_Xn zf;{}N@M+=j-5Z6&fGzJ{1AKW@{oO`}hKsA{F_}_tt0;q(;xOpOel@!e;6+7Woqu^ICvd(%<>T z;L-jI3}!EV`^P+2e<1%qQS)@;HpV5bqKxr53t~s7OS$=V6-j^YDDfhT2ZJHM&Nqi9 z6m@LJ`DWRsv9phkn{nX-4X!$WAw0Npyxsp{*F9vZKIA zKxKa@$Z0=SvBf?_?i>+cCVLWl^kq2Ra)hAGziB8if7Pi2C4tjwsdKL3ZlYe5a{C2K z#`bHyRY;35?-TA}QpE4pXU`_Ak(bb`DL{e3mm z1pMKa9m*wyTVxH31XhoZ=2G`eWUpNf8jA1W&3SwpK3Sfen}p8tW~zx5g+D|EOZXB1 zD~wE=l&QP`l@gl3w>Phz2Ja7 zJ}#V-q)bOB3>k;-i5Z=%D%7O;=5^>s78tm_E3(6_@8nddr+1mx`jka$C^qG%oR<~L zFo6%}<^#}b;hrw2X-`I9mS>DidqUULD$4>Wy>jyCCF=5;bJBsRM>TQ=yy})CvF!2o zb?k)2Sm0jCvu|7)WYNdg1iF{kE5{e$@^%8de=Mkv)?ual7_nH*A5iWkM9?efqDM`s zwDsUSt3w9^dWSVYx`W{OI1y~}z>7msOhXHmxg-%5dF-U=cA~XdRzb;na<7eA_|x*M zUL?Uo$es^gh8r8eIKuK91nI}Fy@;7m-V2=#;~m{;S5H+(i|J0y_L`e2?D;eEw_UB5 z0AVPmGyE=A%2cUIm4#1G^p|@>CYUfu z>Ui`p#1MKVXJvdpY9hv2x;0Wi7K05ia4>v|Y1TK^(8Q5l=+(B2(H&-wt$RfKd3=fa z++HXpc-zG?as!k12f|#7P5376^kC_~%DE}u==4e#n4A;4yc^YrO*qo)6aA~UhHE2hBFhG;PJN5j3)TthzhmS_(EUxU@LzaXBWf{Ef66T$4b&x{l|!_MRgc_r9A$`- znhf6S<3Cj)3QluS>~+X9pEmWZf9R@pMP4+(i}S^9Imm3|e|GCSH#vk|oL;;y{tx-S z@X{;mU;WL-^{;M-9N~?K+?QT`kxEvnUHQ&(hv3`|hTajv{~1Z#2Z4C$9=k@5{CI=S zzn{N-pQBCqqvk9@`1C9?{eQruMg?X{#v@=8oGDNYdd?OR@7q<%d2#jJp{0kBgs+B< z2D^STS_}WIt-X9C_R{!b+1;U&w1IbvMv?P**t~Y6A91b;;3E(5+RMqM?&d$<8xpkG z|K)Q3)Linkx}M={1#6>7=ke4SZbd&fSa1bwJ%X@Pt43 z6Hjra8`L%gX@);P_jt9n9s)#u08S33-Dhgk*J#d zF%tx*2zYyG>kaTQGRHeb9wK42djEY5!Rw{RTTZq&&XnvKY&_kw{^Pj-tMscr_Ngo= zd{!vu{!c`I`p*^jso7PtQ7g_4Zhv$8#_gN8zq#|_o%ip&AKd;H{yB2{@}2zctG9b^ zUk+|x|F_ONAN=*=o%~-fLdi>iy_izN$4X`U>8}^nkYVt0dFt_`qx4*yr4fKEe7LE=3zVp5sHI?g~ zgnC%`CJgm3{JMcdRwF0#*Khx=^Y-^JxWji2!!H`OdTb+qy9BkaLG!)%>rNhjQ72do z{@aVoKt02cJp8mHdH*F=GWcew~^- zOnV4B0=ok3-8l?z`}n`SkRQX!zJL3Qnwm1zpmiv4=MZcGt|o3eRmJiDTjyWTKucFr z>Nojwx`r7d6u$-a-Vb1CS7Ey@A;~~Zta1A$t_08p)xUk|-#Xo@w_s+si1cU$zJ*`k zCQLjBM)QY`U4Pl);#?S za9zgB$|tOo)w6rJXsC}=kbplN41?vEbx7ACMKEi9uiJMu`S&<)HMzocM~!?dE7gld zg&heg+@Qr+^iy3No487?UWTTwa`C*LAF{5V*-ee84)d5m0TWrMIjhTW%&Skz8x~qs z{;cd4?)>S_2aG*F;ORwLL^uMYnv#+>T}XkP!KC-SUJn9GFh{e54whtf7GHerK`L%l zvZk8Dyi^MfV9e~`kE zrVrylS=`A$KO`|v%X|6ubv1e6vT_$=YDH|(q_r3_W?6J8Uir_zA-unGtwg4?(Ldd3lh#HR$?XyWfX1`At&YUaw)Ix_GKRMbqp zYU*Np+nFOhuHyo6&45i7Y);L4VeK1h7Z{|4IF5{p>mYNPvimBGiIt$>)Dzn&D-?H% zxcob=O4EfOy`(GzeB6TV=p~tVo!03CKoNHi;T&+4P0P1?X{j9r_{u-A3p?N)Wi}OS znKjPx7eiK^G0BqAyKNwBg8K9aK=yw;w46tP7Q`(!6K~SaTu1)K8M4$OK!Nv=IEq$O z1zkQ;RqXPS+ilWiA43nV6MMK}?10A{uJpP5l&4=o+!*6mv=c!G;I#FQ=OKv5$`Yx^sGU;(MhUbXU#(l%KS z3u=_?WCPsP;tQ8f45NrUY}(>d4ddDh6{%o(Ii=l!V6D=FH+CdaHCcMsG)=?cFDDIt z=CT1bOso5=d|T;C-aGUgy2{*ph4cq8+*O>8tRsjQl;H?% zZix8wb`4u8Yn}bceF(t1{8}g(Mg6N6YD?83lyD_}6Do|LLW=%?fXF5BSGn`jKr*E^ z{L_Q<$HK&wrZJ9Wgp1e36%5_>v2ZxdYddC|wx%2>hEZy2!CL;j0JSiGLQ%?w8I9x$ zwZ$eo!xq}O@3k)s`c}bHlqsc$NOA@iMnm}bad_w{!EZP4{rhB3fZ$eJ@<;G`QVg_^ zao~f~7%-bE)3NI7H&O4&zOE6Ia2RpmSnbN+O8TaC!XcL9L<=F!5XK?wgz-JImyAqj z6!VRxAOcf{&O%}oy%nS{ZV0qpsNGs(gA;=-Qm^J4?|%jwAC{g+bOz+&4;y5toj}M> zSg>vLMscu;ROySVJ2c*gj-is*#gt&XdipYbAvrt9VBR-ld=geY0`pH^3heY9QKgv! z(q<2IMJs|M(2Gx%)YKKRRUA7t*4|vWNmujDST-PVMAzAyM?OPpnnF&Y>1*mx8}lDQ zgO~KIiuv3%%fP>fh_-{DY}!>en?qPp`jyqoekz7rG@rZ}2m%(4z0Pn8Zctyq)w?;e8p*VULg_>YC~ zL={ZnY#ovccxW&QRghq6O|Xp%-wEqdhp2GM?I&t%Ks0C zD)Ai|5SR7VYX}+gLRgEB?mhVohus&!kkinlZ)WLF%{#@fAodc|vINviOpAD{!;e10mb3M$d}Y3Aa0Axwv_N zZ-bcd5bip9Iu4PFCTZNeTFrgY*5U|}WBxMM|Bxu+eNuMhn6>~KzJ5TaXwUr!m$-fbxPTyN z)O@L`>g|IR)D#o(n4$J8Ke%P0-!?&qLOkQF7mxLzk3jbs)>~pbG=6Nd05BWwD!#lFr(}l6!GfWcf;j9edjtBjr)rm z5Fn+&D`V2DWu(DOULs*(-}TM&|46GE$D^edzn)OzI_2&4@uJuO14CSG#*ir$(m$kO zb(4fGb&AYQZW+xM_H%!a+)tY4eZA%1ik;o7p4z3GiSy>WUWOYwX8a8c6`KNcl}$J{ zmM%NaOLtk-`ut(9tMZtrtS}i$?+c@9JJyIZ4?<=2T^CDUi%dsnnagbrW7U!bQtg91vj& z4xPvOcip@*$#SyXs9U}T{BxZZK>5wAGTi7!xOCF{Eh~cEJ?`Z|a6$r-L)SLeol>vn zKh?P{8j?g%IZ*=Uh};yurih#vlgyl<1VztbAM1NHSvW)hy@K7e;~$}BXi)K)YTNQ( zL`phcd$~T=Z=w?~N+s%+7QZ|h2b?+y7SGg&hemtM)4a)=?lRN!H*9h7ilc5S607&U ztZu+Wjb9Myk!_#DHa!sG-)c4eiD=1q@BFpEwVKq7ry>>0%>aCQcc`lPB20#;IGAq{ zyWS!iz2!@&^3~#|{2xNSu_7`luu*DA$f7ZNCzQ8qJU*9X*hO+}p5E~T4W@WE&xTjH zWH%2mrzd_J(-~P%x|acED9Ds0w909c&P_nWKZa z`j&UlSgnmIl5|Aod!u(E`j%D(A=LMh;t^JVk})*>ag%cBfb&;hUb_GVzjl6yn9~4K zuaepHnB=;7&+8f-%DrjThZl=5bipjHvsp2-5FI4Oz5jjmnAx|KUoL?otblF|y#VsS zDU@W%#D)|GkMckKTPJ!X8@)_UQ0kw?CGuG9%Kj0b@T^|8$kj>O!w%7-^Qq2+^b-D1 zR-+TZd_{tBN)Y9Yni=}el;gMw#?JLixTc;^DHa>QFu9m-%}bx0)uGp&Y&(h`!>lll z)WqzHg`2diB{pXXoyWR_IQ__Jt$vmNGku_#TcwXZ9W6?v+6M#sBtX4|Z`jfC4eLzj zxWI=n>Lc7QIgAja1h+e493y?!qXnju6BE&a@~DG2g|ylf3Ylm{67NzjUcuGG!neFs zf}I^_7f^7MzdUNfW8qhEMvjDX-^t&Ml$O2Fq2*qOcB460#m+goa$Yd>LMP);?5FDl z`wnZQRHQ*aE=bN+0Q8~Za|WE|PTWH`0$((09S%zi37gihQsxc~Auk?x*_XqXJUEg| z`(hj(Bw6OKgI7^EnHC>$`31~}o`5CE0rvi91WW*z15RQb?JpIsHtVMdrqL0%yqj_c z0u!73mgYSR@Q`_Hb4O{-b4ohOi-;K96w$3DpSdyVjVpP?>iOZa%zN1}EPYp-((m5c5q+yU(N zpkerxfjH39s2T2K1@pv**aM07n`*%ZQ^4d)hAdHS>GrZ6se}4)(r@ld_um=`K8XU) zSsQ7G+!M$LggeU`P30TWR>;jGDO+-u4&`ni4v)dFA0m%!*eo)lo13U-oyR56*j29P z$voPg3A(7*X@Pc%`G=EIsgxSO$St~+6L=?hnu08c!&c}dDu8Eigth^ zcsb4Fr7_JGJqsezh9Vp{5ORIyx&}}?dM|um0b)UY`bV^5RdulnsJ`yYc8GD?t9;X; z2_-t?6K&rl=OV1^v#lm3KYRKyZ z*m->{HT}Qby?KyT*O@1H#}@mN$-W9M`<9sqfslm|5{rZoAOwl9CEIe{BonyGm+z4; z-@_!+)pegr$S&D#As0|eK&VsYDp!vr3%npH1vq*@o=`>2G^(2E>51uz8axp*F)=Yq zPe;u5$HbiPJLfy+JLjJJmIP#XIjTgyd(VEp^L@W>Ip4KRNk7nG<>rRsuP~7Kp;`;$ zs#wxyDp^&A!xj+bS*fgo`Q|LScr6QC$U^nNQ#gKxE@->mKrWwkVw1;CwH_%UCq)|a z60$m*&?;=jvgZO^cOF?hBG^<;z5h~Tbv)y;0(HJRQoM&yfH9NgAEB}C0lKlCk#06_ zs(juOqM7uhGLGPqT}K7)x~n?0K7Z@17G>m9mJ%*gOw}XjVE3S1iY`#y2@rhNbuI8* z5|-u&{3ffg@4N(4mei=A%FS4oT~2ho!F*p0rol_95XW&de2;`JD`qK+MDoChx%(h^tj~V%<&Z4!18=WLu;T4oGRlOk&BmyBHAsF~xsSd7*l{V5 zH;b;Fz}P>c00*xPmRq3FZm90Eus{VJF7*S_9zj;B*|f<1D~#$rqCo`#nybXWAj_3; z6ka1+Ff;o=9IJZyip^Aogndi%tC17T4aSkBpz3tK+a_ z6yk!IDuKN_M<*3bY3FWfqit9_cZ#jZ0PYJPvzoA-D88f-Ht+!Ebk1m1n#T&sd`>QE zu=zh$e=6gbxhAamr=-qTlwPJl?R9~HaY$dh1{Z5^KZaQ7I{DD6T;IF?>X?VOw7BE|wZh2&!#yoBb(Hr zUJIeznf5hL&2yQ4(iSA&PyXS~ z$4e#aF=MM_qF>@1_av|Rr|7tvTuUmLOYZJSCND}21j);eQ=PubEv1@r4=>(oL3a2n z0RhEf0X%z7>Y-oY)p^%JC&b1%(q-WQ2Qymi2P`#=RwZ2#z>A|?gv<(a*1?-EJQur7 zgV*Hs1AYkEE>{NgR-&WWewiZyhgqsc1N;$8ilrC)uz;RzyZQ96}FcO zMVWv=a~s*|hHy!rq|$T)xFp8IGHyCAWzucPT}>=pd!Nr20 zb6&?=20HoMpWPY||9=j0O8+n7Co|MSOvB&(i(%oL32gjb2*H=kl2-3@O{}j1Hx9zF#Vxi5%CBhFYb?Y zJs|fK^Sdk&y^Q2^lSnXZF#plo#jS(=1-m+pXBu;hGVAiuJ%HCF5Vy^ z@Te z3utuuSYl-D^kp1f2#gE2(s_c^!d?m{&QQHblE){saALDGfa5J3jWFseS)I`M5F@=9(eKA1%DE)>*%nM$t{fP(NNN&HQ%b) zxW1ooZ<-$>N7OKyU-nEx%~$u@Z#wEWb{S(#zJ~#)x*3hP??TF`IS<^rc9GC zytt1RZe1j>g$Ie4cq-e!?itFp@bHfrr3h|;eLn4-3dyKOwIih_P_Wku+u0v6CsX?1Z+-Q2Vh zsgxBfo^^9)-eK0vCEM#w#)-PjWqFe2O*OkEp}4+7Zd>bQTZ$6#3n6CTQMNT5++?sB zi!_q9dI2Ep;%FUrjH&XLCo2caByZ`{w0~pEv2+DK3JR1Hu=8zc1`}I!#kL__c7oZo zZ6A=0WLC@&fYPoFfaD;mf3E~%n{<@z^ZRxQwivva{B!*XdmEyir7nQxYA5MSS?DRu znO`Hx3PY}OiC^F>GsLvP6@2>kdqX;|7PU4qMeklnupOu^;CHP)s?;7kh1VuXzi_j8 zI^1zRe1wHq-@2!<>Iaf{Szoq)Jya+QGB5s8x@a>7EuBSlpUV?Nby+b5K-VA3i*Htv zi0b4PZ2PA)NNHVFmz)5FL$WKQG0JNI)pM_mCy?thr4 zsFRKasi)A0vlNy`a=hj}Pn?@i{wAGFuhDFnQn}Pw4!s9TT9+=93Zh7p*SsrysP%w5 zow_sJqt;8^=sZL}kZJ#d)i2(IhLsf~C?tRDw*GTZ_%JsidAU3#_Oh}mrS9luaJjoK z6J|Z&PHG4l7@(yg6-fPw5wNfj+mggrr#gE^4J9EH=2cR&hdbe5_-v6 z$Q{Y|y}e7PiT@)}+?g*eq?!U%j90 zvaacq9TLGid2!KgAs0m7LxIt&@EPSzqveV(fqGKO;PZAt@gZfhvdX+K9))MnZnoNEvUC8?S zB-lK@=ae&1o}O6VL9}nfJt7Hh8Hs=8zFY6!ItPw|cM+0Y`y!R0u06SkFYltsNT!Bx zFMo3zPDUzuKbssi5eI0T%1fTIAGp^q>oI7^?S2RwqVKJ!)2S^jPCB3=gd4wh9F8ls#&O|k?Uvr zPBbI3RH~tLVfWhyo{$bVX@XjIJ#tuYqQN0a5H`;lHw_=jROiOi0;WgbbJyu)ZVO>+ z-%9?xsQm7*;iO0oJN{Whv>RMOSsTvG+h|p(g~e)N^r4qD)r7Q%DL~! z1Pwz4%jtFZ+Wv~&x8D7tdS;S_5|WGJ?{ecRD14j){wsotU(*=W*z)BT!xUu&QNLnV+y7I@|`s*?F# zz@B=l^PtgD6K=ixw?Dh}XW^}jx8A&U5t5m_E4_S|yw{fDgJNr`$aUN$9bGEDvsWoZ z#O4!EoRGEbWG6L!HP&YxTz`!({VAhkoo^G;+Il)iwBkni=(>*bJ#MMgq4&rj8L=x=5lFM;TcIof~i-ZuXb?peQUD=zS|9>>cS8Mvvw{5WQ^ z+m5^gmwKoZ0NeL?-nD|izd8~gd{F^^BmQ9vaA0VpQh@(e|8Oor| z(Jm}Bu2GQSnVMbjP-m65j#23jQfk2ANp*u4`}k7R0c1A?tAI2>vsG%^FwM}HAWq;| zX^CeU5q>G%y*Ngr)IhDP(pKtb=bh1F-pWtj*)rDoQsmO7-Qq)dzu{MkVw61veQHV( zkcyHUE4Be;+21)I+w?8}nfn1{drpA1P7B}_?|m?R~rimkZ`_c;#bQK@C%tZ$`i5fwX#iH;TyFw z+&HO%7Ht(}_2;ov3UWDob@>)~&Zh$F%AkLh0!7YQ+3dg?m1;#NCQ$A(GMBKNd08J- zX?=cp&1G7*6;UsEypeW&X47TQG}b~@7Y?36yD=v*M4SwXBHvdAG{!h(c2p+sOuFc_ z?5&jvKAko$t$LfTy`<|8$uB_=tZVfTvWK#^e zJ-!s08TK?MEr4&_Du-tJQv!Ip!pGQmaIcxn1qo$^_%*j5Ks(l@3rOO2@2)#Rx-D<( zU7s%E#|`spp}a}^mJSAiX0dGGx^Rep4n^D(lZX>RKCWIUC@=w^5= zaO8E0>jUKbQ*BR6{_yx-%DXp5)6eY<0uh4J=TYWX1brkN03B8rdTvhMo7g*lA zB|k=U)u?aUG2tHmYox0EvAhNOo^>Kb7w@UWsZ4djVk*%9qNbkY=B*Dv;;LMJx75cT zl=||k7VeX~=FL3deu>Ze`gi(@Lj+;{3O@viY5gM;mL(R+#6kYoNAvF@SwYR=X;1HZo<_viICK`ql?vRu@$cB!lqx7fu2Y zEuMyMF&pj>9qg3-R|hZM!mEvfakr8(Yp2{%S0Bi|YCD{K)@E2t!FN9ZtF#AdfWLD3 z3i(=JsN`O3$G0g|#mn-}HmoPGY<-CgbO-s-C+AVCylxMVgRk88w?7jUH*GomV_*NL zlYvBuwh0)f5CKqBegji9Zhml*k^Y|XGvKW!x+Pe++4@#Esg+;oTat#$r;@gk)AYX4 zfA?3nev0?6M>mTh0ub_(c5uo_SLFK`?o#=yq+}gNI~yKf@kn<8RR);`vZ8 zX^|;7fCXQ{w(L?BR)7!~wvU8liEGY)~>Fwlw(Hdnx#h2IUy%^Q&_{Ya`+Pc!#X>_(J{OuFrRpzt5Q3DQa1a^z!e+>}m`sV}dUy|6j%g2l#nFA~;V^&Js}%;rxD= zv#xiP*(*@2OlK=Fh%H^kC48TH{Foj}>aXAc6KAj?HhG!OhvI8r);iqLxHDE}@=CQZ z6}h|Tv6!5pW(C9qwkE%-zqDvQq%kB!wAZnarpJW4f7Rbzo zpFG*OB=*;c;)vF;QiA`LRB-_t(?2CUmp!Q21aqELL$TI+0K2))WZ^|dkv_VZw@tNU zHBZY?_nOcCTD4}XuBw)Cc2y!4UGX)x)R$cu*R)7AQnjmf$q!YrxA2vC{{C=w^DUy` zi*%p|ak%eMh3i%q_>@xs0hBe#$<%o8xL@V#Fr4A(#(1}q7C1y0Pz$p?`Q%;<^O1s;h{3|ssMSoU`uG`7m zj3IEbFhD1mkIOwAvcq2!(;dV=UZ-RJsw7a(Pd%qbviUcORd5I`<zA~}9K$#VALwo$Q-7TfKchB(_x{^16tnv0KnN9>i%u za%x4d5_);jlgR1PeCvpB}Mvnoes%LgoyLy0scz1rOxzxQ#}H@9OxDyK`tPTZA?*U(#78 zNne;|#7aWqF}ZBG<)kIcU>3_{jdR3FuRA9(Sn$nd8OoGgplU#USy)5m3LZ`d zmSKCE@0`^nw@eORy!kP8V5poE;Ta@&JxBupaqIb+ zgrXs-4;%zssJ8DLyLvW}tkYWJYYhJlFq!`jGw4Eh8&`|kzy1D?$A;>E8_T&(`bP+s zk4=sY9;6LAg(Er5#_6@EDg+zah~$(WY^paeS9GOV7OeU)F6k);%BT7`n?l)sT6>f6 zwd&gQM|w+ZZ=PB0)nd7WaF=!$R$=)ZJ!^RC6I&A|k!pdO1+03|TUpznzVT;F)?R1R zmfL*NnNi5N{h$}6OZ{Sy9h%d$LLOy>8Oh$ax1{pVY>S!f^BfTsH{a=j{FtpIXM^g% zU7)k0jj3wD!Qy?x*3#1am_W<&m+qv|^R^nt=d1bZjyvgKP%8)Gcd#w_%R5k14KWX- zmg6EC04$xD&Wqk4{&zJt27C4O)?SRtkFdL1 zQ#@1|c~_>$T?Z$b^f`$T^&~rvuHd~w`jec+$F{7y$hf5gYpi2Cz!q0<@t-@ZlR7%E zJhBe0L~GAoS%{iDs}+r%chKK?a*9%GJCa}AL34xrsHTTMkmhlqvm3No}s4`9A9TJQup^Z^Zr~89!y@_y<^)BO`OtWbuP;0 z_QXj!s8_$j(8Wg~!%svs<7Pek)Ygz4SkrybS(%ynlJ5eyTWNWnFyW!kZlwV%8ZwR` zEpJ!NVXwT-7rjCbYgWPit<4#Z5P zOPor19uWvFXQ1m!6%*5nVB+jOhYksiwkxDj8yFHyeen5xyFzDxpOT@?yRyDY^4vP+ zOS{snN50F{Bdd1IQk}{QFC*$rlzOYph&9^I~vimYT?4(zEouT9J z=T`MV4|CM(nvNHe3=k*a%&>7JvMu>f@A6WZ$ql6Dmk}OzCvX)R;S=h;gIhjEMZ=8u zEv~wR8LA9-t7!Gn^nHOz7R~6jreaW(?qncC?2Af7cDyGr7Sl}g9P??@~eA3J$*bb-bI>Hg1Y*+m9AN1+`&sq2vljz@)1^90Sn-J ztfLK2{L9yVw!opfJF8KLxwx?f`QLthEj{CuMlx|MNsPdl&(zXm2H zEkZZP8?uZ6!Rq9DRP-ZOI-#Ohe1@1Lv=@2^+mpTnXH}&}CEEQHEd%7iGrOk5La<;r zwyNV*E?`UPuprB!K~Wcj+A|i)c#IzeW9Hxkc~`>q^#>DI(%X+~-k~5I;_S)ytQq9rq#xKsU z%obB=7Bz}x@lVIxU@v|0CzT)2!A}U?r6V^6sotQmD5BA4kgpqaumMc*J1@O)U}4HJ zcY*zl2MD|SNjCe)3_KWOQE*iP54_Q7MjmrFrA8fh8l85ALKanw+T+38r)f7VkFkk> z3G22L&e`E_%EZXj-_|UDTln)NF*6I9alPCQIGC|Dqb*B(WHEg@I`y^U5Y-tPEwxg4 z>5u=0)>@a~3)x(`T=B@`vo=%W&1C7M^^T#Y?poFMa+N5} ztj|Z;mnCYuTCY2dKI>LTI#8|Nc(g$h-0zdqWcWMfxC1h`VtBMuCDxnU{w!g}T~+7p zcKu={v?GWu2bzHtsm0X6r@CeX;E~5txU^P+_)PDK?5P>}PS*c4!`3hl05ItBX>9&oAV5FkILj@!}9BqO*3&`p)F zuN+4>kS(EH>Y;!8q*cB#QYcao&(Vm793Zw^fcQMzdG#e1_ zsk{-khPFG%C^@GoAb`281<`>`npbd6JkCD+hFvDzpQM9?DB5G#_K$!_&mC{D_+?r< zj^y}~NVap{CM$JP!_=Wns(DsGHK^VhgT5V=xsAq=bdtyG15P%yx+Q-q9)41%ZK~g8*%AB7gQfKlpB zxD8ex$+fJ&MTX_7+MlL8l2PkCyXKW)Fq*Sx*mXm{y<|j_v+==8_b7@Lnh;E#<*P8c%uRCus`|V>kPKIXam*{ z2#uVlznyGjW_h!mAC(je*0WII8-Gcx;u@Vu{rW2Fs=+yftV;VsJ+weX)zq4@jem@P z*fvfU4t9GMpr+(xd-RSgiZI8wq6e`c5+V8Tb0q-?yu)Urvvl?P9p zw0YrBRkxx!aMi{fEbL_d+k{q?|8&gI*Z5Ja(yQ&en(^eFbwj9P+T*p_sWC*Nc&(@y zcL!Q>Pce>OLC|kkhccXBUbMXw+KcigQ@@BzAy$b$cj_7wj$?kH`oP5Bl*<|-H4Lz2 zzv}4_IMbW74+Bh?obhDUgCoW_;hc4cQ}ykC8>S7!$Ufd=Y_LKSjappNjSTi@RkVP& z*iCnNG|ZK`x0oU|U^5wKcCaQwK3%unE^^687nsD$WGfnrYx+M)o!b`1dCxY|2RB(- z?S#Kg-j!cLXl&5tDAj{uNH&9wb2xnru+%16jp2bN@1gPKG*Q{l=%+FVqE1kQ`-cs& ze{{h(Ejp1{E^PSJMh?;}o7Kb_y(Y*{onngRAiwj!a?UTegEHj-OjMcmx#7f&reLOzc@=q$A={9Jdd;_%cN7>Q`Xt=LY zB(Ka&GgOsdnU&14SdyWU+d{SKF_7U`ImetTC)4iv#24tx_s(#?Fe5>Lb9J+Z*Mc({ zX%JOR%~|FPw00LPRTZExUqpY}A~cg%DON>URt&C6%>jOaF;yS5a}Vpz7ThzpF-~d8 z6s_y%$fzO5+r*s63%?&)a2UuoI-WC@rF8iv-*J@lV z4ijp`WdjDZGmNxTLRS??dq%0i*Zq4og-U(m~11+#Fk z??t)+YL=YC7GH45(xc9(i7yRUDW#PosY*1q|3q>8qPVKS`u{rBr=-IR)Rkrz+`Q(7 zjJ#S;eA;=2hIc9ho`6~{j&oWzc;>9@VE%XQG zXD7kZnn|L0CbB4Nj?pDo{#271Bn7D}DnDBvomkzLxwM!vV4CZO$pr z)Kgf^w~($ck+77ILvlXPcipj@zHa5G(e|Yj4Z(%oD4;qG<%!>HzJ)C-~n>I`Stqqz}vjffZ!HJ_ecLZRkH5us6UX8Z35}RfhwW0r%?> z;}=q$3o<0mxeI}e987HkIKd0l=Xv5<2K0N;BrOMoVhzytoMB9mFNd}%)bL7$=}gFI zVQjpb7yQ$hpHKd;IvixY$&Y+z%8_~59fmgSbiQGAo!LM&mU%x+xfx$$o-!@SD@5R0 zMyP!|?Y|lghdIOD2hT3Njz)YVFHwkbv<9oDj-u|@3 z*(syoHU;JYBMBZ!{-S0mDYt{xQoSnblYtysXj|DCd)gl}Grs9Tn+FoQ>WN!6|LgWR zT>%rOR@JPe#SKF;LMZPHnj3k`w0xjQIG~F=dYo4m*xwfKr(j=6_dqsU$Q+sZ)>&6gaVg&k=$q+QjPx8}qZgSq-eiij7>i z0#w$NGn|3c-!Q&BD!(F>K}F0Y&HFVn2W?XRSKJyC{6}9E+ZQygqD`!qA75an>k5Zi zT+3wcBrs-j|H}2W!sDQX^R(e0!}0b-jrs%jIm*z_fiAoay-DRi4(+dUX=CgKwyVk{ zUANZ~g10^OwchawIk`^->y%;CDr+0rF6xMvJGzXe+2u(ebL4Q0*dU~{N)Ijbw93|H zi~K`vgU;2vN{Y6x8fz^0jP607++^;FyEJoNUb^S~`;49#yP4VVZ<8O~{pC(gedR5Vr!Znbf5trjfNJ zi~T-TjM;9?LGEZdTCru*288A~6m_JUMrf_XA~YVC(X@&Grbuh@#}v1uu`8Foh77s1 z8AxaA;Amx#BZ6LK}rJmlp!|Jr--36{wabuCP za5&uZ6kB);mNyVvxE8KVWX?WYJvVD#mkRe28#P!qTRA#gF9kb!)~KAgu_R187OS9D z+bg;9L__^tv`tBR#^;?rvus#)=bMsW-o@Ts&ODIXOAW~!dtIaBeh^lAnB%^8qk?l!Av*YgU#>_6%?QX2(Rp{;N7@1FML>1-n)T%jvwBt3b1T-sHRM1(h}sb{A-QhS zvGUxW$^W)2dooW(193l`)xXMUMMIE^ZNk#^J?ekxCzH<_otrk>b3mxAz*_lA ze1~#?S&@9>bB5QD_EvP?B_q|3HST z?YA#vkJiwpJ}#M2OJVw^PIcZi$e4$-GW>4?Ywv!PBdx(s_;zBIalWs$R9;&v1l*>s zADYe5Vr`HVPhMe|2~YU`){xowNz@v%<)mu#Klf(Yr zZORQ_+qH-WjJKKI_NGH|=q++UsOxY_yNN%nW|u)Bjl_<56*F$Yo`^xNo=F5HWe zv?#kr&5@jETI^jO19(395bBM@^7vRo=2v09jNQqWaBmS}NO4c(OuuO}olXa&fX^;vV94>yqWEjJ(8eDM)<9R;$ zhtzmZ5&d!dIl0{{Z-i^Ng-m-^CfhKB?ufXy9w`=jy27*-KN*Ja!!`PGEnOQ9=-?MC zTkg&j?R!b)G}X{A(i0pcOfjgBc9?Pd)j77tN)y_qPT!I@DtUSAMk;6``F`b}{v%w* zw03nzXvJfF&awbBZcBv-0lop%(?OUq4%nB_Y**KG=Wtldk%Ht}1X-XkNN&E;#yArk zaVKWW1fx_x);zU`Db3v)gEcdrY9(lh{2kYs_1a@Yl>JoUzGry+yP4ygK9`hbQsrK} ziX2^a`kL6`P{*9|e!@vFhkH?1Ue;doWP5MU&-h@qzvAxZDcO;K% z9Ln6l%+{5`$U$2MCe=_MK6MtPN-&hbb_v8}gud`yX&KvnXNAA=YaQH2HyuVHCl%we>(W zQ$c?E1LB*VTC}8X|HMYg7l<9{{k>{qx!3I!p|7Eou<-am3Wj?QU#lG1(#|{U-f%x3 zzplKYx`8WSl7n5sKVAnP`qcI5hvCvNgV!;CKiqThcx6NT8r`QfMul)$HMs`v*9b4# z2!nPA?oFj_%NFdau#4LjvNxox8bEtaLvGM1KYCh6p@G27A-yyXw@tipd0}XDpad8g3)hAS6w-A6j=S0T*Z50rdIe zIMY2`cmcCvQ^FYvGo*ps|NJmoIhzU`N}(rp8Y}!NIjR}%!!U!bQbQ2B%@7<$3H`3vwM@x^)x?+ywe&{ z6tFmO`D~Elg*a+3lO)NM1?uV&E*cfpg$^b6J4N+B8b*DeWD8%aTE7Ypv_y#amLm=j zGA~x|K*JxUzhO|}pq;5*t2FSF3Z$b3X;yGYe~^KBd-DJj4$=)R`xRUw8g$6V!FZm8 zg0}Ygnw*;!E80AJ(yR(Z^w#L-HTIhlc-=(8f~Kop*8~%-No8_|(o{Wft+k z$8bq!s1g||^6<7qM5$!1w+vXoXrVI;SiDLx4sC@r!P%Jk+5aj9M=W&XpgG!q_z0zJ zP9Lm`sjSnu`DOxIXO#@bm%Ij&&gjCfV=raB!#FBloVS7$Na&XJ_240uz*^c_bh2%b*+~lKgT+LyRX_@GE36@gv&b zL2b^}8+F-GW77)LFy)3!h^1PhZvolut}#^SEQkfTGK{8Du2fFpC~XK1d2oJWpq~x$ zs#{B|K|ShuL-LL z7kZqNTbu-{Dzn^KRipAF;tF`U9)Lx$%BSXM?d6+n;BMBlv~qBYP>dRR7U-wJcUQ*L zL0qn-&vPH8iY#6 z-8mu)>1$(qn#K9UD)!=F9WdCR_y~aJvdpWdE~`N_UXHHAc;sL-kz4K}Sn01N?`Dk3 zV)OjaU!{$ee{1}GN$>3`24g;ET7r%k(Fet%jnJF55=M!MhJTWQ;FTXH&G|S4JO|^m zh2?Gbi7V~$N%v5%vxHjhkMeuU5DG z3^OwdUgNLQvWa9k!_M#-d@Z9FKEa=F)bokqkS6yY{-Gi&gME-qv&tAOk?ohYRe}n& zBs^=IQMJ#`nV6aJAVb+hDHdGU&5Kja>cLk1$>cw)HDe<>I00+LRL43P0ij9*!PSwF~&zR;6;gqLh*(<#11!;e3dn z&_DBi-S#a~V*>x;+_AH1>AoPvrlt635~R*9!JSF!wn3O4WnDJ%dY7Xn%e*TyJyCf!JyQcp zz)o|9N!(2H(y}lWv4vRDA^{(;Il=}R8L_2?2X}_l{S_P|CJMPZ14vQok zTxBO+*PSivM!}7(Wi{NmrY>>8Ht`J6O%g?OHOG0u{=4cpXU$m%%`FT&%7?m&pAUrH zg`@pZF3NY_yxbPdrnjBZ@i^C2>iK-2FV4qdU!05c!ID-8pbS4BD4vM(ouY2Bt2-C< z+`Jricis4@_}vlb#7n4g0>1FH?ok{$&%Aa#?i6j7pjaICcjcjicn}_ma-C6l4{FX1&?m4T3d`N>Mq5{!Y(nAJWM3+iNpA_cVvtGpAQ`Te4x86nAnWXw2KkO zJy7KIUhW7MuaZx0T*=AB5Iyxq{WmX{ zdZOO&#?>1?y>T@kmI}wq`Eov(CR;ujABj$2&?x}C&YYvZd^Hb zu-q9Iay?Ohl+Ru%D9|Yim<8&O4o1Cg!QA=SEN++Flm4!vsPox7opDh->IhapB1_Qw zf|yv?_xZq)_|WGA(0W)B|2cT$Dr`fSC}tKf*s#s6%d5qCPemja@wht|9}1Ct`UTz0 zn5CNOJDTh2mrF?NvZEc}iT!WIl_`p4IV_e`^q0PANH4zN5z|$`^4X3pTv(>h2M*y9=EJx%Dylx?V(`rlDpKl*djp#eJptPy|~WAB;}G{)NZ7 zilW1AP1?58Y;%89%)x}kAjn159rbkKYKS$~XA=6&eK*ywE_*_3v!Kw=-nl0|AMH=| z+!J>f3x^8gl$P&G-?}}w@0X9K`xZ?jx!k3BQ+saL-%Y-k>boyKAvtrW?Dp`DD?o^{ z%R3l@Zc&mZ&=4QW^qDvkI9^L0v{~x>#r7-eQw|1(f{bg%Tr76u>IvjFz}kTC_FyZ; zVCx?BT2}73akT{h!qHYOk(dxi=8&i%B$eRUg5p0P=#2Y8Mu{ectcdd{upSR)%&}T@ zhO?}t%G(xalKJ3?r#!{wQq^8tzL1-?dK$_%+RB2Z*oxTes82I5q(+AcE^EVrzfJy> z*pSV>G>0P&c0WoWwE)miCvc-BYsD`))?nGn8YMV!tX!R0IAddGAx~e86-rStJ}zZd zM_dx4n>=NS;DUlvcI8Wkvrn2Vo_3eJW8U+One@0A-qci-|=YgPnPrmqa!qa&hF33s}KYEPQHCOw4aNo!Igm_B1o#sHq! zx#j^u+WEL2c&KQ@I;_Xy&MshVLI&h;&H9Bn5U2(bNZgHw^AL$yoJ!0hMo%?TIIuMK-w>ioe@^Oz?(vF~M(&kQgRuh^wcXHy%2hV+Hv*@SK459P&wb-7Xvmf3L@;6 zG99plg1K$M*s*#v`Jj2S`jHni?~!LcXr8h;*HP#RW56?g2xm%hFmDkZ+lU?8un#!% zjjP2QS93S6c0gSTrX(_mZu}Ie?tw=(%Y7+!y&U(z6x7NIAVx=3<F$Ui*A7Yo1dV zkkie}$Hk;zUmh1sn-@@|)(PA(m^@>1u_PCu2cVWHBKGO#<=$Yzgw4g{Q7A;ASor+$ zVBUhw$4Z6HLawu1>=8(%a5Oq9mQ%A+M>N)h9l_2w1iKGxd2;)XXTP&+$Fn;X zqkr<*ZTOQZCb*y7QL%(9Kn(0yltRSC=J8EIIQS73&m!~yB{Xs|~x#l=sXs1K+7=6kFx;+;4 z009)0oE|Y!j2U)i{;DmYyG2|Ri)btQaCd|rBzLJTXr3xd=Sw)%up3t`Shd!Ad;+u& zv4Htpj1z1JJkbH`*C~MLK&9glIaBswm!TiE{gMAIF4*hQrYnvSNqC>sr4%| zv-D-Ex#EE>F{o~MRA4Cmh2v~;9u*^4(Wa_^rWn^z;nA(Cf;@d#4$@)eZ(QjqDm}7x zD=llRR_dxVe*6|Gaq)DBW4^^O$jQ^TP>u1jaxx z56os_YzM^?X^aE3qD5^nn6rRtW?OkCPo^@0NIJ{8zOsM<4?nIRDg&8^KZzALY3*jF^*cU$4DOh?KGsq~i4v0qD9x=2a6Z4?g15;(alw`Ygb9 z>{vdDy9MWHVRbuEua&^OGmdhFULXo_@JP-EGiI~mdBm1Lmtq41u*cC0B+UyDMT!6G zh9hxY5O{=u2H0U|EDpu9vKG>jtCVx?w_a`h*%v(xYG5l>!}u^z50(J)o;v$|xHa9? z8ejLAXk0?1$hL^|h&Atqt`u>Dpze)SS*er=_Oxyzt55s^CRAVbhc@ZzK;vQnVwoE0 zzfG|J7P(0~!-Et3}|}5|)bMeVxc9Ee#N@6QS5=aat^OO`NQ)ySIQQn2UUtRc`Gi$^)`M zTG70wPYzZ(2Y{8!_DF@yZc-WAS$lR{2ai%)zj;GjSvu876}v_)U8{6=JpAvx?C(aMVb!Hl`qZ!|J%<3~PNvT|z#o(Q9Ji#6-&iOm`_X0m8`orMLGYpqd~Tm3}S zOIFoiJ|B!7kEO+ef!GzI7JnWsoQMI+hX?H$yIvj3bdmhasxX9JuQIJdK2Dwp@ zEz2{eJX4t2bVIegrpB0oIt>`+`eLUHY6qxiGRfzZd8$x^K1q%5l&Uw4(Mb`yd54;j zdtju41^Xg@N7{cuhQTgGwCf+M+E#z9`VVi)s9)~@9;eA@FNtbNut^Jqt7fs3Zq#n8 zJyLCnBUg+L$+HUtvUVF_pkiDiT~(kf%OhOP(Pj5BXCC$umwT3#%?Sl;l|v78Fl+8s z)Yz!L=uT9>`HnI?E^ggwDRe$2$ICZQmgOzm?bK;orMko{q-ge=iqAoqsH2tx=gYV9 zTMc%0WQwIMDidr?53b_{O?mO>EMOhNQT43TsL|V=ROajP6O>Q1SccsWMvuYYU=0cW zAh%75iW6wBED9CwM1*YMXjClZKp{RMloZ6=0v#PH;v(kb4uRaQ@<>|PJ>Pig5mbjx zK(%kg)E(Iei6fXg9UP74MXz8x%*hq0PTq+CGG%h#fJQF59$z5rA7@2Y)gb)NGR9pa1lg-mkxw*N{GW14IOX2|bV3fwJ`|XDk zf`z|L-jz63yf4Lq%yMYNz_qldFlYW#g6;ttXD!0maZg34gaH~6yy&U8SUv%Z9JH-P zIV~eeh&Dy--p;tkwK0IMBzqh)<|*ZyS`{R}N&fXypASSii3`!#4%kCrmLig}0*1Ab z2c7rM^38Y9j!5by9%QHRXBT6z1eEC90gDl1?2x*)Q~2hke5tFL?lzfQvzK1Z7M}r!g1;VUeyYw5Yz|{sozm6HPDz_XUfV)Da?w z2)jx-7IGy+$MV6#rB%wafeKA5yPza%W-||SuvmEV+T^x^$)i&`jzbi^c_DpOXrPw= zOIoV+p@R}~(vuZTo34uEsp~Y7Y(6b$J}&i!Jzd8mL9jw=D1nbMCwa%{aeBYSJ~vI> zZtO$)hzDz*upjr8a}xL;GXVfO3S5y=u*J6G1QRExnkWaO$8INWL&#M4p-e-;#3|;7 z8OMWj1k9}GO_DS}Q zjt}upuvwtq(PN$l8*YbaFnDOw)7qX}!|)V)4Zb5rJuNVjcoQ^DR(~m+gVu_XW6)g* z@G6)*{b@v0$i(`(@&YO+?iIsEPNi!U$_&XLSJ+w?!a>ZT zbWWWqpOH33JKY%vGiUF_*z7zWD`}bwSEJolAm1@NV;PSGNNlGx$1zX8z&7cJ_F~Lm zlrE7^&1S+xDy5jtq$%`(bKa@b)KhtMB8u_QrRAclHpY(IDPz}_?-qY4_|+rBe}IRM z-lPN~+r^AItJm+|v2BO+WXh>&ZU)*+ zD7riWQ!BY6YM#7XG!UtPM3kQ$!IWwE5Y>^waqtDB!!Q^*a(7q0zr0G|>fM4qVih|m zc+u_~S34r*p9I%Z96a;&-4J$DlIsGL(AQNIyBv2T^H5=ZR$vsFZmZalfZRrm+>N%n zVA^c?2a6^!0W*`P?l!FIu!iH4rt!xHVvU<1o|p18u3+ab2zX%O1C7Npfc1yRF_e>& z&>rm%;vx)Z>@4>hM-8mE4isSS$UbT2jdBzp74x9U6DlD0m?)D|wl4JEyZ#bzm$XNB zZyZppH!1=wQZ852yo1?uo{f&hz0#OwycxX3PfF^%$PA^#B*So6j0$gvR?~n-Y1RE8w9|9&O{~8nEMF6;R ziv^`hVrlmZQV0si_ICAmnt)+>(Tpta6g#A>`c)%{z<(peVvAThh-;+)*IpL`7T^fB z1x-zRAs#D|ZcahIFrs4lXfR;{{3DtzND5i8Zm(EJX~^Y~m>{~zE`SDZfSb}Z2LTuB zx7A+_h(Y1$gXUh=Rbi6en`8P(sR5?d}nri5&kz$n2A- zgGHvn?oU(CVNI}~Wy?;g zse&`*e?;F;$$*9QP{K#jjN$iv=2saO$&i>b9d@Yx(Jmmt4LIRz{>yiF(7V5BdSQ1u0WJ`izk}8{n!O`h zq*XD?P-E}f9!Ry}(6if$;`&$xLIzc_UWd6jXLUvJ+_!bL8&@z~04~003v@nZyXt6F zd&_VJ-7ZM?7wrF5yU|MSTmbhum!ZD4*=k;fMRudLqa>rHm^lQL1sxx3f|g$F8D1OK z8Fbi`A&@k0T+zz+o?q+l33p`Aj4@%QZe+v!q_;ZuHAA>9w8qiEB?6~9G?%qdY`D)7c@_W ze~g#%ATD&UqODzt;!bnF87NOY?Tb%X7j)4VJE0jWUgBA7gFf7C(WL+;D#?=F0K5&YqVpVkvS}i|L zIdAcP0SCb7l9@FILP=IWxSuW^naEy!0+9Jg<6NlXfNoqZ!kV$cB3TJq4Q9^U&-`UF zuGl&N%-?u9~Y{mJ2n|#6qcn+=(Y5p5I@_BjFYw_{}k$_EI{drst?{cb5 zTh>BF_3BkCe&2lu1Z@fx|3HdF$4xlU)xnP7^x4*La98O_tzg}w2V9q(46+@ld5&O-cnS_NMyC@)b!DmVO-uz2gn`=k39Yj zc_YJ)Q`gxL>}cUMh-?d1KHzPE#gjPNdRwq~g|~`*ZAMAcrL9%VrrKWUZ@Uj&vToUB zysVN;9*SuTrcQss(6tf;n2c*;(+f^)!-9n`L`TKS9glLoVUK9MH-@m*7|vx+tS;qD zo%sTK;-%XfeK^2jA$E1d$QR@#mi3RxKf+!#LW|`%2rVghw{&ePWTG@QcF6;5&XZ*Q zws3R5imn!%o1X2J$;&*CAl&8!@4cB3qh643Pe>7fKB0^rEJYoik-7D$B*NJ7ScI;t zOr3^5)g|b@Zkc=s!Xi8%O28lev|olo_sg<{<1LgA;O09r9By3G3k7upOpFt(@Z%@G zAQ2_`+9poX4_MBNrw*v62v6)(3o`aB1rNBv6L$^b5HuF=zys1IIOq#T3ydLp>;*ZA zyb!=+CYT>E*fpD8fD?NVK!%QlhX|flTT)p3!UT@C!Q@g6W5-yJ7pq8=B*1x zj={&U5W#}w`frzkN?kS5R_G^onxg3IB11u1KA{EEaOR$_5?(wr5md#XX{u?B=v-j> z8S{OQt;GfNmYBk5XS#V=Lit$B zAtW9?Gqbxv%R1lVv^h+k6X`}2t3JNjsV26$>Bd>hCL~UWeA2D_-px~PTu4WxPnjW~ zMsUQeIRDXOEYGOVB5T%X0mw)^O)9tscFkO&t@OSgI!(*|^Yo;xpx}T5A_7 zw)ip#D3_B?9WZVJuO;R?PW?um;Im?e6I*lmm-5lX!J%Y;6T6%eOqh9D0m{qEDEc?lpGLE(gSt}Yx*qlPz6?KO}M{s z91JF7#{K3EZF$0y`to^XbD{;y*gG=iK`tDg;uS&p%C#9KS?of(*23k!T2x#`$jYKq zX3C;GRh5D`qsIK^4X`!lAaG!^{@bMHn7bhTFs1p=_mr^~qiKpMapOvV5ik1*74bK3 zppmrO6X?|39Igq$aMqPO9D`JkgS~rE7H!@q&d8BmB>3NvI4mDLQg)Me_7zS5YZK%a z>*%y%uQ)U0)PrnELJS^m3pzTLd@Dd$k#k$~guK%n_hA~ZBY2m&Gj4&nib5}F=`jRo z9u{u_Q;Sx63%^a?5>l_DwYPli7*xg@ZNZ*)-c3HMqr(xj)Dd=IJ3=dq1-=HqI6%oV z=;s|_H@qw2;M<*6^M~ay&AOb3isfQPXW@~;i5P;7`(X~CpcHyLqqbn@ZrQ5c5}U24 z;%`yR3kR3Sy$N%o{hqdom5;^H20)O!P;W*3LT(rv`3$wD8xkGLk;H6! zUw#?;mfH@Cc&O0d3DKv}rC9A^`FJ1XrxPMm)W1Vo%IC2&eq-S-c1O*!4x43y@1s#s z45b7zHCVh@rFj-7UC_i~jJYV8-Z~0`P!0zR7U^uzF+4jW`3Mw;9TcMlU2xqxR*IZS zCRJ3SN2vIChbxjcvJxhX7HTi6#@n0DUWl%cB1E5gS~+pf4o4J((RU=p#030AJms_%3r7+SDlLq=f;lwrjMVU;4Z*0Pb#k=cd~{Qv>>iv7#M zIG%U{-zsvAiU*I#AYFBM)Lufq@NO|PAqEtULw(VDPy9HYi{ph-j2E%^BbP&riQqA}fbXHkb@)brqSG zkh4-_(0 z$XEVK^wA}E-9F60m@(o-cZ|ESX3Z8Zlf{ss0!T~+FT+w-M^VBhTI+=i?K+I|0B;_| zW7FKc#S!+-J?&&!e}&YKLWFjl2cMM|1K-vrUBsVI#g zmZJ(5E!v`C7VaTR6OFx<oV3W2caLbR=nIaiT8^$km_9OpBzHQo`~|3wz`dl%V+& zf>t89F{4h6%wF0f&Q7RiA`9Vh2J9!~$HtAi?qSHLg7UEgpnP4`mqUVEu{nf3%n3%s zTa3Fk(`SmHc7*tiL=kOFw^ zG$*46xp7&@*+MBS^yj6R!#JxLIiG1@(GuN&1AQ$mK6s3h%EB;!_DD}ga*u2J$C>$=^$yb!ZzQ_IMi zV5bZdU%Z4~_Q}pvJCYNdLv9-JsBP=k>3qjry^>AA8Hp^oM*7rK+wE#L>Ot|O#DZLI z17irq&@Ar1pISN|9XphZT_S&wk`9AeN}Ti_K&Ys9badhBDoZlLGr&E7Vpgosm1<%m zvOzHQ8cp^f@e&7%RR1#7*-zRir zi9T?LHvpU}_m_)sv(;#6Fo2+S_0|JhTe}OLKo?!zs78rBKc)_p$AbIJGn7!X1OYe5 z4IsW(v{s5tbT4BlI4;GECC$Xr%G(wkJLYg3Tq)X;ZdB5b5je@g=hNDa>Dpu!Y1h=H z6N@-RMtn;m^tK@RH_3mey6!FaOVMI24aoPdo=rHI4p63$9o0_Eb)XAwP8idYS~)yt zkdp3Er@TBLt&9K^N8;P$R@#qZx>La~u%&e4>NuG~UwlblouwkU%_qR{SJG{0lZjk! zyKB(e`;K&I;Br`P5Tersi>L!pC9iUJfes3USXRUoRAyJ^Y_;iJodz`O^&Ke+_R|3b ziqk>!K2Q)ramwcrvveNioXpZeY*=xpu0FL}Vhr%T2PNImE3x0lIk^~+M_8j(JqAeH zAx72DMh!ZgTzUn>4r^<33-No&D~eGc`WXen1>+S^}siDZekCUV&q%}-EhC)yuCPBk|_6^R8!drw|! zn92W?{Lk~utj#8dD#fnXWkMMzp*B3)9 z2^~QQ%X_(40E>Blp(J?=97x5LK@x$JXWBHA{g1Rg!2$$(<4(g)sMC$yf#kAG`*(ka zvr>{@uxV4qd+o%G1o9Esqa`FSraG+32C#m8Rs%{Qb!uxD?!v|OI6Z@f3p0zUA&Nrt z=VuoZ!w@BwEXgV%07Xx9?B#N&KXsy#NY&;VUdh zV&e?PDJMTnerVY%R4%d>SFQQ7fX4FWl*6!G>V+J}Lj2;%lgAO*_R&}#m8nxzQS#PG zwmD+N_Hwa&B$zS<|AmkVplM~qoG{_(=uj!rCvnuMr=uQ#@xkcPPb-(5;BxS1Z-i1z zWydGw*#}x*dWn@kT0RtYA3PG-dK2MN+_iFFsau|XI>-HDR)UZ3gqvLQtm}9H0Fjd? ziw+{Vwx#dh38}Y$9)jVrP%Iw?E)sY1GBBxQ1<<&I>C>MEt3o~!=U7c2tq@`z`3t?g z_uv1tv_jylx+$X>TmGk+YeXjk+5N2VvEeL;G{kbE(cjW=)n#*LQjfr({^(=FY0x+m z#Et`HtE`N1uxvU0Ztads;wc=AnA99;CMf~pK$G5m_w5jUh?Ur(xIfXc+F$W*!VdN1e1A z2c)#_(`5gbKxZ20sV#G6h zp53)0ShMyS(Qm&DA&I&nuN_Ah;d13L?-vrjC|G8f;Cw3t{XSEGPhNE$ii-k2K7)35 zbVmqTCx4+EKHgxf%djIr$4i&WLPYbDQ`;CE?cR$Q*DijWVq-1680H39UBMP| zwtK8W{*b;Ww|lBXz(x5mbYJLCw}xKHhFj{FT3sDY1-ti{mSEkK2Bd6V!VK|1_k%oz2q547E#fU&#TP$x`)M@8My z$dNncA7ZAd@Sf45cjn@w0%vwYhGg|;r}8EBN~4(JfYVq)S?-4xCz?M;6d^m5j~TMK zZ{$wY(txIoibtxmS}}Q_SA9-I2EEw~yDfNpv#0uDJ4+9@a{1aAJKnSb!=17V0WC&< zNfsfVu9GQ2jRT(B(q#`Q?c!cXrZhF}M#f>98Z&0MHfyX{v750KMT|h@U542+Z^>UW?m4AVHkJ7 zwI+#J#hM-}>JTNfQRw)Eh8bfkGv?nG%$&R1vEp{~O_(vuecd0a4HS@8=2PWBJlMEt zw?8(vUV$}koJ_)sQEI`;mAlJPf4?HAPK%(#GMKD4KtKx@+lAq{9xI$s`*ctayDeC| zmKTGgEDEtXSRrPbI@hh^wa}!>9A#vWPC=Om9;m09o(62m#ED=bG!z~@^Njrf)JMQ7 zz{!*W*u*}Onu?JdLbVi{hGrTd*AI5ySz~-3t0-;b$3I)>G1NbPBK%|!_P+a`1#^@r zR_;3L?l(9*X1b)JBpC?j# zKZZw1XBJx+*p^YF_CPA}!=SdQzoZb5QIula=xJZMD2>E>RP>2d3)wHSxeA`lpO*W| z;@Oi=rk(+R00G#6W-O(pN++})x*L!pB+nkprKv_hzg3jftXV4etF|E-82gp4?CA}r zPv28SwaXC#kOfw}I1ItF@(&gQDEcl^)UHJIdrDC&*<3Tig2f7olbDMM(nBlq{3?r? z*aGnzB8g;CV6e)pBZk^9sA*3>TY!S4JJ?B<5CI|)wn%|GX!%(_?6cYvYt(z zbH820owsa|H2L|9;8#g#Ce_-U7p6+N&5obA$Cfm!S5usNy+P`0*7zga!SXK4L(G$4 z6nSXiWnkQ5m7k0HN+h)rcRdG*5yaL%S1brYCZwv$xU1YY;EIt?P~voo>g8h0WPc~v zcReMPvI^S!vtsdHM%IKj8DNnyAw&q#4_eyN4di1RU|2Tw=wQ7S2Cza)2q&srtNco7 zR!p-GYho-cx-i5#BWj#Idv63eVJX~R8%lwPKlJe4Cgr%W+F^3re&M|jR&D?p>yERR^OMN9UQds~^Kpl`5H@m1X* zj>bMwoH3h;&HF&F<&m{ermu&UnLcx$a&>kpPoGwB$Bx~nqh17nH$PZ>f9vXf+D!xb zbQHUQHRwjWu`(h{H5XcKZZC@HA4krj%ztDDbicX%@P9cRUAK`6w7~w1a5AoOw=0ueCyjXG7REk@Wf>VSSy=@3|N%$0DV!5P_a7Tcytxx3=A4Y zl-`;Lk%Bv#NAV#dIU)p~JoFOr!pf^FX)=r$5{TJRd1x#ae3!CU134JwEm*$X$_pKN z?+i+h{oJ{%X!^BE7;T%@9O9if&q@xRZe&7JyJJLF8^SD;L5SfZFb`1dTICHQ@_fj4 zRS8*KkAj@(-ljVEpjynCqvq$m$eGJg5Kqkr zGPx#-=A_9UGTSUWrvgh#dh&7zwio zu#nh=#1dh>7ZdR&Cg%72oNm?jt7l?jBJTW~Z#n1W$*e3P;eJ0R!bX`V&wjrB`_5P1 z^xQ*f$U&>CWtLKwSXI!TI*}p9EUuJkZ#Bzevfys+;0B1WOnd82T?!;nGdl4`y8xyj zIv97`MKAovn?7BRCv8RqwYV)SS8i6SxFa{d5c32NLT&%^&wpYMJ`;YuT=nT=VcD*+ zn#xL5Q;!@~j<=mjO0{V!TJgyzn^nkIanoVpHS5Aje)hT3liSu3avS(i=>OV>?)dci zxz^{-0(ZRkhJue3$*0c`J{U%yE@$KN;a4l2PQN0vw~2OdiZR7p)27rfb$6X>Wmd@B!;3rc9=XQp2c-}zwb>5AcIeZ? z+O{MW}WrMkOViL%X9pDX=GXICXTh5MsYZ%Vz{HH_-2{%R32P z$>%F`d&r64cU$-+DQ9`RmQtfE_S4FJ@8{!Lt~6%MzzKy4!YI&ox9lzah7v#oTSn;D zctRZVf?*!w8l<>Gh>KlXF=z|A5UEvv?}Hat*X~vfpqSUiIBP) z>DIxIuFZ4772VtmY>h~<4$m)clhvUjAQ_*3>`TG~F+MKk2;sF3$mn3)M3nibP1{UY z3(bTX=BZ!+3u?xo6-Lbj=744|O6kPS!lt93)|fO^mbv{Spa*Z>jfqMFP7>3Elf@Km z^qP^J-fF^T9fi9Y6DDbIY^C}dbiysd{_*a+;z_UzpY-7}aR_Hj;CP%r{EO49HuM)D zxXzF6VF)`M28U$@qA@_igdM_La}>PmSelDp85Q#*>%taA2e6c`{TQQ1ZxO*(WMJB& zA_a{3^Ib9W1>PLgUbb!%b@(EljFF}gGe=J;K$L=OO$EpQ)?1=u+mW&4&A$Rq6j>5W zOQD5ISByVrIAH>pXf~?K$}Min>;f$xnQh#-E#~f!6HPc`1ibH#;_d7$@}{>je*6}} zM1&q0P}!zA9KTFSt(7(q#*S&bZPoR?O7n3$PNE0M7k|Jnyv zB-<1}aEv4I?SLKTaCBqTs4eoQ1MIqZB;U3jM)K`8bIpS)F4$yVjPkctL*XUHgo#^( z6^IR^7!tnpO;IMzXX0WDk0tmT8?{MQ97=7VRe-`f&A-%&{Tcc|Xzaw=Vl_nM{Hq!> z=Fsh+8e+nZ7fpfK$P&IiL@uD%l)o%u*kH z?uv{ZzeSf3G4sh5uh3|`wY;G0g~1e6pU5^5wz#Y0By=GO5k5@$LiQlWs$^+C0Y{_9 zQct@Q%-=r$d`sK}7C}4t7n4x^Yul{mKz4NrNnSVdNqF@Y$O&O-QlhL^W5;gM!XJ%U zv$hmo9t27tv+)%D$|SH@^F0K)GhAQEeW9)Hl~=YTZDaa$$DGP>{&6u^W6~t;)9&bQ zDjYj@t8SYvEme~dC8I`dm6?j>&EKj=;0oYWf&wv=*IwJYhpo`t%&!wh`4apS!pjwS zX6!YC^Ng_L-euw*KYp9rQayb--UJl44LD7UaIk@lfuE#P_~$=&t_&(2NriELl}red z>;pT-qD9;mFDKLN_`E5T zFF)I`_Hz(ezWnU-wd>Ze`efAxIH)htT`<2K|1k2za43iCDb<%@6na646^?-ZilAUj zdX8^=4MejkPoJ)Rz{CB@j947~DS8m0Yb7OLs_?!MBfcbA54Pn?E$2pvZoqj;l<%Od z%=?Au(%QAY;-uS=A4Eez z)iG3rEx_U{da8DYzKUWFE9rqSQpZy#zC>9A-5xf1Ekp9&8M;GuBXW_I*VoXk{m6=Q z!&BN`DGB^bBuJ{Hr4j7o12n7!aOa1&cDSyv;dinJz6uYd5{w%4rCi(i@$yleAOM$g z2Y7DAIUkU~mQ8cLe+Yc>GLx~16TftY`lD(BJFIybG<>9x0)S4wp-51VY2wuz`cY@i z1D=arBgZ8MO*+aRC$-wrO09+p6!5!WF2-0~p*5%*jBe5dM~{KJD=OdF@nhRpQRB-$ z5Xp*I7?u-EfW8w!>q87Pz`}5Wuw|o;R2K@ugLZqY0;Yx}Hyui}Z(}tcc`0*W=hyxl;r<(VR*UT=0caAocnkY)K!NeQ z&xcT}GVoc9XHp%qV?dp@Vh)hI=v4^~Q5LNIgeBVuBVBtg&@)^=k` z*{W&)1>3^Wcg6Z|REKCG^X92?i&h#BSz*^6&7G^&*n#L8=WgQ`AhB&>K0T*G97r@R z*D1F3t}#!aEXLc)VGtiz{$`c4ad7fxV22gyzloR-L}UIgrV!LU>>L~d4nR6oPgR2x(a7sLstB<+!Wd-1xkz{TE4G^!OT7qCb zwlf;Ba5GgMm|x+>8VeTaHLP7hi%=mDW5NPVH35qWtP11r;Q+xwED)#!SPB>c2Zxs% zXUz7kVkbj&K*K<+SrrL}ETC+_geI?wM1ay+3YL+RELuXwb7V1b5$~kLJC5V>Ben5Tl#1N{4Ps`kj#}$qaxS^ssj5Jk0$GooB_P* zWR57O84LpB#;@=H%;zhYz~>4#i6o+@(aFN5>LaY%MGWaH(#v=B;cesfg@e>{DCpbo z6jm!j)1AJTuNYz@*Nm1g7p>sfHJ>Cw4(>S|7oKnob*~@@Fcz@T#Y>zvVaBF-|9wIw z=vy5uUS%*o_)xDa&L05`=73NahdtjF2%52kh4gT7+zLi(K~{y?Eipd%-HRH-b6wPS z+5=Y90wgeYd3xKpwMcJPB#!AgU~A&IRS5k+qNt95FPoO8xPrUi_dY1n?+z2Y0nCIC z)tCb*;%T|;?IJB{d}u<1Dw0H23WL`GGJN>!!J3HEa5eFa`Dw8|1@wsn!?5tDyqLp8 ztC`Bi%n%DwBwDH6LUvg;)!m!iBIBJE{vQU1thK+Dt@a?nws(`V7?DT^)lHyy{T*>@ zSqzn&K|51OiJe)r{kB$}2w%vqG^S2prAUBhvnrNppCmN}JrZDzi8=BH_+QAI#+-So zKH#2hCU-asPr#&XV{GZF{w}C5|Cw)0p7IeaiU>N4iN9Hfdu{wV_z}_ruLNKzE@r#f z7$G@L36y81oph?SBXK%UK56#?w{26SAnr=yZ6|f$K&iSqv|~roMj)uxD~9kFH89JD z9f&583fIOgsAe0p=ja`)O+eO0`|$R1-|vGSXyx0!ZKy-6tO+Nvc!=1+(xtM=5KeFX z23Z*}K(I}@@S!c+v%5>)lpQ8e_Hxa7afE~&t#)N4*WRNOVtbJNSjycG5jNi_ukxdk zxBwK7lC_}-8jXR*Or7dm(>C6EtI9=S>Ou?N-m7|UF)+gxg?O^Khk#3r6mEGeVAfed7PDd? z5wh^i;t(Jj5=h$JB+*8XJS;#CFW6TBE=oR#Dj^8lk!sTTEXqV4uOWFf0Y?;xhNCqh zi=?1``!CQiK?g?EZU=~xs6_H_(OM2OVpLb4^mVcv3A3Gu2EPKrqaiz;t*tMHal0;x zhry~4i0;5nlNSC4^7@Vc;2BgJ8$S2%GJyiC?Pju8!Us`Qr!jG7qS7#f?mhty%>LV? za3j}9#$qTV<0n%2@Q7=-3;BeXQf}EXm*&NI;X=;&j1bhUz81g?2>FUPFkySgRAv+W|%F6i3mXd>23+jetr2e1O|0`1cVB#&9nj`Cx zb%s)JxuH;wi)M_%naW zFp8SCH#gV14Kg`nV7q0b;elXB6Ps6>XqjL>X> zhe@rYv5@7oq|Su?sZnH_99cuybdrc`Rsf-@$IV!%njsDq3~iGu0^w-f#`6xBM_JEC zcn?N{JBj>{9$giU>Uxum2D7r2XTOLNpSZXBzKTHV=m zs^Cd-c@Xi#M7)wPPhjGJi*r|-31N^4u^oc!ZR+sI%eop>}GM2oV7pl_4V;aZbkF=h}5c?URjYR$QGs8d6M8 zck4fU$?j@H!FZHxF`gb%r&H$#>C>fN4FkrJAt?0`Nh}bgkVH(0ti*9V_~e;geQN(u zX9wd)cPsT5y0Pk_q&C1Hp$PqwD2*yXpRfmbHOQBHJZe8kGMMpjf&;P+F$}eO zorW5b=!-_Nv`vJ8!U)*%Y*1~rq+}GTB|COC9u=B4m&JhgS_Q_SQKMF~5)e1WjgyZg z#2Aw%%lFDa71I^~nK|=3rMrX;L6OoaQ=J;CK?YGx=g#L33ekk{5YjJW~55$RDRG*wCkYNfHL+^I6S>1Ng(RTKS8Q4gm# zMvv9L+eTm^yw+LaXe`!$1DRql9CC~U&}nrNCDREL*RYmCGCdl)Ea1AT%q6%bX+|rJ z$y4<2$_%z-2^3qXfbStZakO%h-^g}}p`t<1u9v*I#^u1_9n>T?-BN12|FdD#cIoj( zu-d<=#st`a@ROK;@!4koVKj28HyIi=HNM&7+v~7|NU_3UGgxEU+eHR1&bX>pzo5yG zXdwtMMY<8>n|aA_DEK??7VFU?pt(-gc>VP?ZgaU5n~7HmC!A4HF-WZf!?F>WzXtG( za76clv7lTBFi>q73(I}$Xr3}zbI~GI)7M`n>&=+qQ%`)uWvXx0UV&QHnm&Dvz?o{Y z$JXL%NJ}v01=iTMxtj=>&3Xz#xlk@qw}g3qta%6ofvbr}lQA64+47p5ADeVIHRz;d zX9792H5wk^qfO#~LNnhU1*RNfR8Am)BPs_JIgzl0u@KK7Yyprkf2)L9e@y1(N@-lK z;$+#Knt2&QN;Are!Vsl3?~zAvuA?6QaqR~DYoq) z*%eG7d_p=TN7TQmjW(uDTdN5qx+!wOg0*Zr9W1J4%$T)K9E>qx61)MoMu4U$E0om7 zjr(o6iFaRW(S%xwIcQ0KjV9Jf6hURv1ZfENLwP9CW;&QiS}8(q_ACoqjt!5mR_Klp zVUiVBD=LlM|K&x)!U9YY@b*7s2ESan&TDV*uGZhBBhAaku3glFGIIZvD8Gos-e_s# z)=b<;Z`|~%()jXEK0^Zx5~w4cfT!)@{thInXz}zJ{Kqy5#|vy@Hnqp$Uch6_>UAbr zK0I4u4Z8oP+_69{3XOaQ8wWXq_kXs|3q+)d4{Dw$Z zb`$|C8a0A^2hJ48Vr5_rHnS~CLkZLBzn{?EGFqINuuK2f)c?B9WEY6ij+DN)2j<6e zI0w?XH7Zr#M2(m9Fgnl8A=yox6%mqMPVxsBFwUqiDeuB z2Nh$qTR4WWJMCFUL!sOkiU6fsX?*yLb(%gTLuzTGP`f}qLnuwvx+R2VMc~To^hhq! zjub0H%^T;qdGoqKoK+-UAn&mggqkFRhXEXD*D8&*>(-$$0F$2~n=%DIL^2M~{g+|i zD+B8+5;W~(7@FBkH6+@h@PQF8>{gsH+tVEbRM?Ebt^)Jj==zL)U9_L!!~x@LF^D6M zQw~~Ej8U#dRPo{w%e7S4K4ba&>x7KOp=e@66QlXyuM)hxonpOWQxla2R(xz59Ze0-Hciz{$h@-!rA z6RMX@=4=>=rEP?(%D_g<%(x5f02bQb950;9+Tel^P$;Py=#(~lx217j27y4gSV0_K zVJwk~C!opVuW`kqaYgLRWD(A*IBxy>^($T5!Sq8vel$G!pS;4Ux)2ubVPeGJv8FK0 zL`1wLN#t>58bflv1J}jtbj^Zeo@g#XE4hnCA_JK8W5ne^m4PZXCQAAJ9jF&L0lA6Y zF)4VH>8gUw816_LmvyQ_TUXSvH`v6J?7~GGufMSlxGi;r_EJU7L2q;-+c2Db^q6%a zGNs3m-@p1Qyd{m)v(%64gvBu^j21{mg@je1?YRfQmEFr7suE&zv~Kqk;-ZRl7lIRp zfzZBt;wu=oKzPBCa8T3Mg;<}6XZ%IR^`@!P>l0UeKnPjx}~Ya&uA7m_B{Ih?#QKWp=U~6DP_~PMrUY zSsR?tDk;)QKejP~Q+U5@;{)p)gkmxplCcDQK?3_J9md56SHq z;U^6+n1a|{veH<*^s{6P{ZIj~@@|q7LlYA#sYi4GIco~c7bW5Hg0Q0q{D<=MqBmq6 zuSRFNv`=HwWL;+wE)gT}`bG{SaS+VMi#B%bMj2`n!(U#1XCv86NeL6-`GE4QB4}op zuwy)~G*(q@ zLXVY5Y%F+vqwlp2U5~JhUH?uj%5g5U^68CYFN}|=2uL58nS>LDBMm1*%Yvc7w05O! zD-M?0pK2KL1e{QZ3MS&!mNUNQ>C-|YhBcYp|7plmk-O~O1+VR6SmW>c&qc;pyaKx4 zw5niC-S*$IHYx#=rD}4EM{AV`DMi@|$+j@V zP6AUxiJP9%8RsUZB_*2_ml`*2lXB>y05fl%^R9VtoX8Dh-hBTWI!&B0bCVMS!hE7! z-g_{nP4oFk*R#fq*<`T`3MdvRdhnJE!_(v`;wiBF?H}80j3t1L)QVSliyd`V2HF|H z>P_UqOL$`r1D^YP%6#S_iNpl_E|s|MlT4bt$zruZyXyh0WE1)369qo|YU$61b&fCH zgwb%MIPJ7h#nnnoa^m6Ex=UDC;_7A7HldxMR#<4vfQUXpRtR6})O8Hq$>MSo8_VBu zDr){Q_f=UA)^{4c`|f5Z#@!t96^og(H#?!r3YwJ!G;-u-ac^(T7<`J8I8u$Nu`qBs zR0~u5@fO<;er)@(5B7d@(vDex-FlG6^ckC79tjS!Orio05p~zQNH|KV`8BQc|*dYj7mHKp-`H1z0n20bLPknNqA#-5vz-6 zlr?70mftzNLjaZ#5`ee+eik8@M&;XEd?M6$qLYe5C=`05Y-KZp_^lF?nrKo70k^tt zn>1Fg-r|x;+>#eB8C|v%O01ile{6$ujJ1T=q#!tX3DAi6#i)GATxV5Nv+@hbv z#oM*U`~_P@C=Ft?7PkOc4HS@WVHyh;%1VMc`U)w=&we(PY8>9-7BP%Kz`v@8poq(xu(8l7+6g3O$_W6%tY9pTuw#|L5E#M6kPkeA@=Ir!qa;7L?naoubdE0 zecrmNZB^v4SH1~g7~3RE^=O^{IhER`N8GSEVJDCwHYpJ)7sA-ixXD2jpzHF3=W?Fr z7~!ZXNum`?^10Cm^3eaC`j2fM?HeQY$+Qa1qR6<(P=)3MP;xk6AA5d5czzL63`SxA zkXw7avGz`cGYDWX?`TqKEeUfwMH}!X$Y7K>pMQH1p3m{wQfidHlIe}l|Me=dbmvF7 zv0Vr?IwpZ8TcT|{8VsQ!pB&7ZJO)H(<~A+Xog>i+Fp(UrT_-;35#`dY?--+p>O-10 zkGs=y7I^qy>f6-CZO9#jfeqz8>5L#n%J13_iSts>;<>?*RRnfR@2ktMS0UhASuJ14 zYPC*R8Zp~sxi$X5LGMVC61y1wDFp^RE|8N%4g%i$|E>o@$Q9t$^S z<0jt@2Vbm@RoK<(<}GAq-!3jT?liZDw8Sh0X)1&@SDP-XB{IZtHDV$N%Rn^_r4Da% z)S+s37;5p$dAw{_fQXVq$$VQ*44WAs#pjiKF9Ql!4uup;N7>Ao+GH^0&ex)IP&bSv zZ%R)?90P0sv!cSdFA^w_nuVen%KpFqQuj-!MU@u@_V7iv;V686{1@N8{b6JH-KYL* z>c8s)IP8y4BFUE69cKS^=R_(zkR&Yq78`0E1G(!0Peia#VdwQ&Z_(n7Vk`_?A%WH< zl_}`mfj=G|vZW{oLS~(XxpD!VU^)5J|MmZmx67r{sCa9e6PAkN15^X;t~iz&OP6gEV$B}L6GUBC z{G~49>@k*BX!T8>aLqxgBe@9KgH`{GA!|2(j_To4Q6O z93jeE?GAXTG-l7~Zv?^^gb8rCgb0ifHcn&3yYjoxX6bUABkcS4YXla^W=ZMT7B|e4 z^Bdu$zYzhfQm71-T23PcV#Ws_usUdAfmQ9~Xfo@7keg_;j#%_-7qLKeM<4-;AZ9qS z@b|B^{3RILOh3O=i{hXe4oAPSst2nA{3iGnRGBra9P58xGVe*NpJFbd{oWOrbDayz+kV42Z6Oai$Z)(nciI31wvAk1vpNm2Ns zJs|AdswgOZF&jYfuc=cAi$VN-JRB2-q73a_na><}a}S#Ja1gz!`oL_Luf?#4}_?FO~6nim`*0X7u02n=?ZHcki)y?D4`%Hz3d6Gi$` zD1a;cHV7DHOG=u=!$dWWR%uqtI2;7%YAcLF=WeIiC>gUZY7+fK`S;ULG4(jiCAwpW zLy>r5aK4~i2SSMexhlO0$-OW-dh~`UoowVQ{L%9b(F9$js{u_LSi{t*pT*D}8WnQA zY;KGkxe<3b88hB}cOzK^6Fdom1;TLxKb$eFf_zlS3_#_If>4N&!<&iU;R&JVyQF0E z&geIMJkzG(Gd9IUK_BC>#GoiRQj_nrZr3WDUCIs|R`_TeG_Ks8s z_TWN>aSz=5zVODCtwt8 zu^rv4F+%*x!0M=*OA2LdC1&{FNg_QRCqfeCCj(@m`32-pmx<%9G=BekYCyZdOox+l z><}aud66JJgh51g1c`~`Gtzp5NW!O`NO4$(sWi52^LCBYb&zg(Wa>4Pper-}9dF&b z1u0BI<+lS=lK70j)B-FtY{MQSxq{%y>-gAn3zqPqHb$J4!dh_!3=ArM|yZFYyFZ&cmb>;e*Ksa?WWT3^m_hpFk?g~}*<0tiS5GCFT&}$%)Aj@= zmwVEaK5!K}_0;4|p1)O0Jl~qiU8{$+W}n`Mnz@d{F#Ghemdp=_|Ni7irm;DC5||Yy8cubZd9IwFNt#{jsa#Z1Y{7q~3Av_9@pqc_F;BG#Yjk z*z^zR2#z7&do_KaDSx>GJDs!kCw1!TYisKNkl=Q%3%?Uk;Ly}A)0pBNgObe6)0y@L z7(sk$-N&#A;|%m(;I9Bp15c0fIO+Oh>8k)=o$1@(Vyhp180cxtv^pfgoKy9HH_#=_Ma=Hu-F#a;u4G>afJgek_4Mt>Fv7sIru4PF>AvsN zCl14&!C7V-58)z5mat5oZ+>7*p0D2&$+R}7o6cib^*3NC*{=QRRzSq*g>~{rx^g$K z7&Cq)KBXVsP4B;%KGKruyrL$=L*i8Wu4cPZ+1C2ZnV!t4Z*i9n9mA=-HuASs9|h9Q z?Lcf$JkEW85kT6Q@z&o`N08q9E!F(DR6V}DLoc|FW7pDGTG%84gozK@ShU`0!KWK2 zoOI^=-t74&+0&QOXO89DkH7?SaFiX*>1RjM2b*&@t_}30GC#EA#Ktes`g?RYcjZv- z`={xK?sVhL+}$VH?&nx(!eVHUe%6$I-k0m_8hCav(|bI3^SfL}3TPQNX25~XFkUMi z=s66v^VeE37w%>++&2Ds1eBzk8;sY+@xxm{ukf8dWUu!buarOuj*x1i_Du!tRsANc z|LRzzcuyMBSMFraoONDrAIUTvH^!9duTIka5tD#+B2Dc*2q%^M;UfG;!!;uf!ELz= z+hvq4;u3xZ>_{KK#_M)3bj^%yb$glS>T`3slxElo7b&U9;2{%|T+-^H()mPh&2 z_t{6^;%jeH`apx21T3}haQey(dN`N);Tcw-2eC-`3V4;dcg850#ji-(jvq|-^rW90 zOFz0g@U#_3wK3uCLB6Js-5hwnH{afsz0#XLS&zrid>B_(yh*-gZ~Elf7u9LPI?2>i zW>D$l`(duc!TOrh$GWnuO#o%Y!I*4h?)Rme&J2Nrxha(|i%ajjGtkqQX=q7z_GH@H zed`SLo`iFNP8el?zh@3Lrq3Mo@Gv+4;y$>EPg^rrJG1xtvJdVc8$R8YId&gO+3m}j zhKJc(T_8aqwLN$u*V%|@Gj0}BN|wa3500mM?(vr4*HKgWE8-tvA8|Z9N-EBrz6cE3 z!v+wd=xZ)@z$jfNp1-@Cetaf>v;_!my7?Y#Zu)Rr`uVNw<=))QW&t)pc_yzAg!^J^ z=0Fqh(o8+nyaZe$usD4H4&`h<^=F+G?M`1zvHX<2cu3S2%nH8qhRY6M6JWc)K3k>mIwu>9>n z_WDWZeFeY&(<|xJ6a2Tn6&uyJW;!opm-GNf2XuR&=WgafJ>WMNW)7dpoPLItN#X-~ z#ShM@mdxT3TzmU1kj7kuVPu)-EANjnvNV05KG$&vPQI@<*V(bY8m`xj{^Z7k} zpaWP>=IHe_92zDB7rYC1W6B#`C)@ZK_D?YLOOJBxN3;aESg~|jv5L8UM>6Mub{@%e zUS(h;hO@w@K65*s9#$GNzpzr~WGC!b{?fh7nFd##3%Apa%}8dBx2C(B(ofE0P90@* zFebe%>QE0{C?v4PW<`?$a-7YYyrQs)LeiqGroW@N5(jhaaPD@>Sy+H2X{XWDH(ZUp zyX#b(u+&wNb_*yfQmy@$khY!IrZVOI!pgd^U33lO7y2|T?0>AQ8lMUfn1SaPbDfWn zLX+@jOk6gUYEHM~<`>rI!`Ak}b)1=-moq@pK#U{~P2!t_Kmtp~mFrD_VBo$95#w7x zc*b^wr|BQLYSPImQ3=7TaNrJd zh?d8|agjEVERE%waEIm0QJ|b2(%sFuJMBns8V+W@I}YcCyK&|cEY_H@(p5-M#-aww zO1GNQ$M)r0?l2>R{Uq*<^?|8nzH7yuq2cn!&(Xup{P`=!xH91Inbu30vsZzwJJ~Ct z0&L6EMkJ5)ppi>{7vvHaEw>gI0Zi?{)l5q_Qazx9ZqPPHO@|WTYsmEvG=fa!d|LFU zbkj3r&d-j(YLrPG_2||Pkk)wbQ8;DLknDs}G2PgeY5jqPduFUaNm0T{T}t;}!=+DJ zoIY|O)AR%PCTIePwjiT;lpkaA&$()*u?gr)?);_f>450dV`Y}%WN((4Quxun@9YE%eDR~1m z#>Y>xy+_h#kN*A1CEQS*;lQB)B0p@va(ZB4#(BNi3W&zla(6qp93BKek*@+K;dmq# z3rxq7o1oAkLuL5Hk}eRA;iv>5hR%;SXFKj-Z^uvI4w9^AjGjxcO_`(n(%pBU6`Tai zpaV}Y;{i~8#GU825U%(Ybe#*|;VUqo6PF#8_}l@Oxzndlr*Ag`T0sxGxdUmJtPg^I z(P}W;Gna7M6KC*)k0OSPBtnq8{ym&D0^{@w027%OBEXUdh#M#`pSeW8+R8E<9~M%x z)(#stEqK0$L%9+7}vg!n8nJsrN- zngUpud;T={_=*x^U%*#zqdFKXcq{N2proan0UdPHo}a)iJlmXYJkR3+ z0{JYaY^AIDoxLDc=j%@?E~K0I)YSE^csmd?dJc>20Qv?c&#q)2?3YXJWCn=%(b~aA z5k-6$uy}dKr1!A`sd$;bCJ^iKcy3-vcOPY|iPEN!22v9)M;I6KVwoaN%xwe`O#O&S zj)24)z4?|?>F#ectv55hE$O}I0bjF^P6B;OUuZ+xxW64BlzEO~ILMK%K1CYVaDq1q zRCJ`2*N|ulZlh5b1X$WtW=%|}*nA*n>u#G*)xUh(dTc(_w#&D2+uZF_%qoTcw`vnN zfyx6SJ2*87`x()(^!3Re9iSzg& z)0jf{gHSFO5A-xE72pj){9dHIjh$MAN={qJA6%3rb=^x`Gor^S#U<#y}hCukizam`ik_gw3vk?L7h)OdEl50hoFkEII%lt*tP}zWzB*Q5WA@K{N{42ho)GY93bmc4#^fbFRgghIDM6D~msi5t1Z^uDZrs?(=9>K3 z)_hB&Xu&8@I!!$XT#h?q{8Z3>63v1Iq&WzV9-p4ztvlIsGtwoHSLc!>^t?+z{)Go`Q9# zf5sMuV46|p+gs`SR)$dC*358_+gd%+Cp0@S;fjF%=L)csN3Y3&NAC_z7fVgB|%wIW|Z*NA#!(0Z zGbSul##FldfGRsEUD-1r!3ok&8QLqHYSP3dl^(V#BGna`yw_Op(Qr+)s51ilkfvXP z{c_a_V@$gD48ST&@R`PEfK0;MKW0AG1kTdB4-SBtr8wsEeE=?OL)7c&?p3GG8*!@B z1f4r)#4h~agQzIE9p$KxKR=E7=?$z2Jp(KPnqVi57cyk2WCI7=th1MUVf9`We$E$I zU$O^bLnS#Nd#MxP2CWrc2W4mg$~im@y$(Ygw^efkpx~ZavDI}ZW8w<&i3A#f!VlVY zkVZ7WeHcNB)OoTL|8lskgbnQqZSSxKRjmT(>R}Krs-dIW0n$Cd3W+{CeRp-h#1B3f zcES8hgdMN|#eD#Qohw9WC2HUrQ0U9wIGgKiG#36=sO3VX6J90%iMn(spXt)6Ii0Z~ zyD619&}1xHuYY0LvgeFy$T zzV}jg$z^U{2GWn7vscIJn2r_b75#w^kisF#Qwf`=gn5K0K<@G_Uae6&2ap}*>4t8( zhlo#??y++LPeXnm=<6GJddBJgpGOG44%DFsTndVVnn!rVB>j^p99gCc*@hs>OP6su z@K0p<=Q{)!BPtAXtI#ZDqyn&It`E!>`#icYbL<$JS~N(-Ns`?IXL9sv`q)|5*Rcx~ z@fNB>cQXSQjv}LbjFQsKu@nf)LUv6x857GrB^dX??z)y<;mT~=3)C7X06eMp3LY0d zfJ&abaap_qui6i+ya}t3PX`x85A?fYW&A9lUhO=z<#O%{mUi+As2#!r!!ldREGWz$ zek2MRQUIR$>p#5$duvR87ygA+fTo7q+j0u@wSbV~S&jf%K7Zy>y7wA=d57r%%#}?x zFb_T8^pkbM$~>9X&h)g#lOI(#>>FJ`1&w zg*)t@9xznqiioxOoQkFD56%VgA^OX z)ilH;<%sGC*_5C<2M7kaSa?PNk!2xzVGi`D-h^5wTjekGZjL1fK+_bY-Gp(2K z;oK$p(819dEEQuDdJxA4ue@-Q)zqtyF(%Gn=HYK2=5G#S0qK#1$z>+g>>`NnFRJ5; z8USQ1Uf-z(fZuu(MOs3y{I_>A2P#SB?8f4=7Mc(o zD1Rc+OPsRohiRN6ipt7dE_xU}MK4rZysFD+%1Z@q&4tCz6XgK<#!MbqTXEq6Hi|mq z@EL>zetpsiA{tJ2%nY5zyY(WuB`iiL=)q>Ar@|+-8m-N=H_<3g?idjkAov^6~vjGRQQvxWqQM@dChB z^YG99uvqV^nc&<$jo{Hen@ zi#YWLdamUf4i$Rz1QsY+9SDZ(isdynQj4f6#xqceWSzl{bp&+62qt>t=!6X)R~Z!> zoo@gMF&Wu!xzU&0-e&TI$?uA8M=G&^=-;6nz?%tAQ6$C9t3QWA5?^<19iRMl)Zl- z*LWA}vxHhQPN0miZUKoASa6LcZXAh9gog}>9=+<2uj&Yq2^cuPDxd>kr(kkVebzN$ zHo}Yh>R5gN9K^+sovosJK`sEXnninI428Xc?Lvpy(T-fpHIA&v-f9C#_AO^$K4>7h z@7o!|u?Jso)5H~`oZN=et%dF--LJ!5F3qGcPqgB=a&78z#-pYSgeeH2#ijEnXxwmB z&43+KYpuOu_R&>jK4-V9AA^?42tEea^)SWW&;(jGOiARBy2F|wdYoG+3$FP>3rc6^y=E6Otq=ROiyWYcQD^RiX z4QJS#%$!SwCkdcCeMf}i-hK#bkm#SwH6Rk@lYb87Uh8L(*j8^;E38hlIO6Kg_X)al z{wb0}s6fGgLO%imLa!hsf#j8Gd7_8G@aQ7qcg%d>s6jqHMVp04K53zlyU9u66W_rW z@)47=-*x7$fA3P1pcAsB7&CwEF{$W8HsIXO(JxO3X28ahDetNd7_lAkPYE3QyFsFZ(q-Nbw2Au|b%0jVF|q}owR;Y4F(xd?!sd2oAwJ=Wugzl0Oefr0N`SGefrp8w$F&6)FO%pY$7o& zsN;N{`LXNkOGo8+rs9di6cJo-##)^hhCbpMYxVUgN2BcLu1|dTU{Lpr?lR`Ko(Uil zT|bHOhk)-tL6n)a;MU@Ec6`fhRQfR0|DkxhI9=vvsUDHm>Ep9As0BRv+jwxObSQ`dvf>z)_8=R>Ws++353$hB8XBw)4#c|jZeP>KwG4#sLo&aKN zrX-hv1aObRfny`&s}L#GtBkW8l19pV@}OPFTjx7iTH@Z&dB)b?(nSg-b!4G13c9)_ zSPz`vBY=c1?3W%`lyD4i&@YuMlPACG21voQdv2$@G1e6xvX?rYkP!I9!JF_v0ekpB zXbhDL4Vn5C2w@C*b*vtQ4zwxPa9G)NIsOpq&_m|vzU+7Vxf}s>()-+rK=6*eAS9{_ zfqb1&;Hc*+AatlPMts$TFYKR*_n7$tc{qIf^h5Nf^2MR^d-JV_@NA$m`~0C3dO#c2 zgX6$M5OCSzshMJsjJlnE;;_apd_nyeR?~ZfnfnP=E=i_jma5|;=g`+eQ;iC#2FZ>b zVaV(7l{f#yIcSAz?>Lt^_z>^}Zw@|W$(nRZHWoHE@m=1yOat(1cZwytHUrBVmyoja4tx zg}9rndVzJ^Y7%B`-Sj_UF_z0KBE-bDRVj_fb)90u+n%a?xgq`dK5VallUZwgo4~;# zoKti%+izhifyFTL690Yxa*Fgbtf?|2_%{L6kkJ7}Ju?9O1$ER+fGhZXl|G-sPp)Gq zQbApbFlK#@1`bl8Se|hykuXprH3=4f8wc5up@T;)KG$wrT!j4{(#s9@ccmE(Xg2Nix1lEajD#V2+Y!t@_qLuu>S zJq%SjaD(nUldemet-Kxs`%fyklK;7qxF8J6p)p|E9*tZCZv68Iwl@K?^Mks&p$AAC zW2fX($8c0(=ojjA*)o=Um1di51X1S)6|sO;kG2C&c<;2ILkWv^E-{JX77@`1TLp0? z&k++{*6z4BMshR_aG=krcIih!r#`b3C%mj=mblkZLR` z-g^=DG*)KhD=RrTI=$+SWiC-+XyUc~7z>STe**Stz3n=av=jXPF325bz6Y(Pp{-#5NX791n7zlgKSJ^0S^{Jg?O8| zFy8sC|D;TXyaeD>Dy;;v#C=cQ+KbRt*{jI`KhjVJWI|<%7|NCikZEaRNkz;TR>Ni) zm^eKQ^ju4~-NBfN=eLj(?K_aUR}V6E{@h(qIbE9H>C2d3fvv4feE@>m(E!DcQyk9Y zL4_Tq5(gw@Y5otdr?e$b!+*&6ub8;#{#vdsz-b)Fa0d3zBTu;v3A|od^YF zo1nW;Il`4Rm%n&YfU&#=#zENpfMP66`qI7pp<|i86Pb3@#)a+!xXj|cv=4hkQ5HP8 zj*4H-fBzIYWbZY6R_M|U%i`q1Pn zZLT0FrtciXW10O9*2tV~BX8I9{Mp+D8+*7NMdq$Yh!I_6;uJZ9QjPic$Au|+2A+J& z*O0UnJ-|*g^<6_s(UW;_EO)&jce^|N^i1&-Jx@=d5_YCL(|p@EMNhi}yZcl1&E*;&Tv%*B1KggV^^_3I$qTl&DAf!K6(4HrQFl%}i;ltE$MXG0waZ2`A? z)Fgd}#U5Y(<3F-Tiov*s(EI(-f7pCoJ^mr}e>!P=*yhd&2@8XrAmne}8hJAa4(kAk0Zx$GMceCj6YT_b^yeRw265m*N>gdA|JtYGvg3 zaMJi3JU|YVhD_IKOyl$TIg($HhAup#oH~t;1-XUHY@soEe`BlzOvt#RRuM3hxcMqC_&uofltCRos3cgPtK)}v|yw-&7AP0 z6OoZ{fLSDb&0YUK*L4k}s$hTn4hYq4TKPcVQJ<>@;!Ju^!@lw*gR+%SGkdff3R^1061Bq%C_Im-M)f*(T)nMF?)4k4`^!Z>LgQ}vP+9K5QskcHh1}! zI2dtFVde(tCg1)LDFEN>ZfZ#%?npm=n7e*0bD{^P!^#X|$&tqVNxXgN@ixMIS+T+G zk@=5c!_kQi@@B7=|7h&OLB7&$qLu^4C1{u zXzrxb&>_=4AxakHPJ$I`vVt*wrV#H{BB0~xV~Yu9gam$l{E#Id*CqoxyT1wBSo=ys3r5oA_1;xeo7KRRw#@!Z>GK^Z<`BmKxke;K za@WjWN38a*KkYqNeFo%{pqBJ$>4R7waJA!HJhGkc>&YCx!r~X@TzY$uYDf>1pf-5V zw7IToo}Rx?c{1|wQe24Y-bK`54|hn>xpyyfU@YVEfbiHT#uA$-@Hp{*XoWq3_@9?$Q+4aY5F^+2mi)#vVCSNU-qqIC3N`q*98 zn<*vD3G(eW=dWpbZBmVyrW;yboAXXyoBP*AA{*JcdUdwG03$e&P4-$}w)eR!kD`w;a}6UHU``}EV&0jydOU~4zwz;+5RY)YC;+9xivq&k@h;{SQghk+l3gf`hOelR z6qU;M?Pp>S&>*hFxHH{2#tX`H!z4n_bc4q+<(DEcjhl#i)o^xX6A-&Ff6(Si&o0^= zfPquiwD#gESk42Az*%cx0%zMe&@t0?DBJmrrFyO=^cTuV!_{QWcT@gcA97MJdT_s; zSJbYlG&f3E$f`^?0Cph4^*$GK;&e1jeD~dBMFK-2pPtE_eMsj)Oh=`op&{Ut(5&`$ zczOW50v*7~hjZ#8=EEsy<=U*W56~!e{b2s`iS(mu1JACr!vh|&dmn?0KhSdplo{bH zd2}!L{E*5DR;KV?#8N7Bzx-YLNiV7+x4%QAAG@8!@1{e;i3mF}#*+e+o3?>{v?Aw2 zApQ8hxOC8pmQ!IB770Y~Rw6$zClNV4+UhB%#X+69Dq&s_FRpM2c*sp%KH;x2>BT{j z5lI>Xh5XRao$IBm^=w}!dc!fd z$3b!8I;q9n9-`bKzTL;*h;Roq*&m_q&avF-r=b3%@0V5}!x~Lgh$%xNsy@ z?s}}S8sv0@Ey_Lu$KcqfcnlG>POP2C^>|7&frr4BpVD&9JOO(eSQY@(O&{uGLx;*g zk$donQhs9gjZD+EOv6pg+yJoY%Dy4KEZ0Ab!Q;prZ5Zfn@EXpH!0MvkhGSHlQc<)U zXyfe$MebtNIb})qT0JYR?sjEwVmmm0W?C{<5eD)0I}0k@e*bU7-hTgX{I;K9I(PXN z%l~32qb6YC^Y8Fdazi&k<>*OtMH&S=#tC%Fl&vT%q#X08`VKs89_T$Ps0|sSgtwJ? zm#wO)qmiXf(Q+yQdI}}Ps9F0`NF(faEEv)O2pWfZNzgzr@brBC@w^f$nrUxmyoOjUy)XQ5mTi(ThZW2y|S|v)Gy&|1qt`bV-D!WXx?Mrb3iYK z@gF~dyFt1=2&o_(8538C1S`WCMddgFKAO4xz*w*jGc~mL>3&il!I>n0tHNjxqdva{ zyc~^`hi<}#$}|sqMP8KlK0PmrkUZROC zxB$Sg{KasF;I;5mz19m&Ooi#Vc{DP(ysb=Cfb9%}fbWVIIvHW8gd8$&VH1*!5H3l~ zp&tZi`2$bv^kWceS>?hOQ-3y`7C1`+!(k1kT8yPMINb*sgaBuR^u)o@$|qVfOH~sU zbdRabw*nx5V53Q1#{5+x2T6M$s3Ar5K@sM3{HXXH5SLHO-A9qz%P;7oBDJ5b!)UzW zEH|XYsK^AIK0&<_F;$iuSS!?ITxQ=Vl7cJEykZ!{@$pHM1xu3{Yfb{Cj48Zi%-)jG zBpj9fMtCn(4jfQ=Dfx%j$3MuOf z7m7RjTuxb3pd7~H3@q^M&A`I$?6VK~G?Y&dCv$`hchFEJQem$;i0c}l&;z<~giNF- zL+QHA*-tP_3uQln2PD{({Zb(ilP@g|dLP$36$Hh@a% z0rf^q38Fy-=Tu=?<)2;wl*BDP+lFR87?;)fi7SM7)pyi&t@!?RVSqh$4Hk=uMtg4R zmwKfE;e=|%*3H3M0YLhi9bo@iOkxydha)4I`x6`@?mQXMRd3>xbU_;>6J0S;!t*c6 zx(=orZmFhxjLzxFW#v;R(E{7htrj=fvg8~wd>0e%oCA46kOP3t0&5y&YIz9K4kc(o z^up=UgAi|ksL`uh6Wf7+e*-CmHRUg#6L;bKN$(H6 zvL5F&lu?|@aN?A4rqKF;I0v8j^eHh7!YtRZ9$pu+HKzhQrUDUc2CGn90@5?(tzlMwgs7zhF=9^;S#d28YPoe z?i^-=?$kM4%3Zsw<__KS&$0t2;uMmgDQuH+WcD7aMX=?=mH$SLXuERCN^06?)^T^a!TsPxz& z*nCk)ko6^7dc>)3@W$=MeTe;%^mAH=bn~73`5Rs}czi%}dvHH}BI%7ZudWEHDp{HP zhUvqV{b)%d8*cXS!wjYcmJZj!U1iEr<7~itwmyn3Lko<)xNqR`B^9#t_a_%}O;^z) zQ{Zf4i9h%B2NaYCnFj@ lb+KYGaVOO=kVB3DtR35c%&|d69*jT3OI3pn0;;Ng>B2(xoe2 zRYp8|^_qHQHSv2jax9k}Nfqh|@>GZF5><0MQWID^l@~h1jggbpCuNBmt!Cg^ttXC0 z6f%*OW905%OE;f^G16W8RbY_F6!iEZi)Wr>K>|(mWI>>Lz+yNTkTeVk1~+yl>!SMQ zD1;g!)g`lhKZso>Rx5Wo&PUlR!qoxQJrLv?!0z zDAVJF*tw(YME000=VFlz`fn)|bU_M5#(M4mPz%h(0z20Jm`yywx#srRA}IeX)iLzh z|MYqDq}9G-&>F)8tcMoB!G&tNuDMd87#IjsBk+jFFCW>4sDgFapHsGyABN@Sbvdr4yx~e2Q#^`q)>_>LFr<4XI0yER zsOu@5GDW4A;l73zRN>@v@rw@h_UTGl^KGW-Qu_9Hn6idFxq!<|b5-(|;&FsdrW%$F zIUUCJYuU@)0q4R3PMkxgpl`BcDLqUqX_=t*ofjlvSdRt$wnv-CLO=#}D zRD!+OX@svnj=c76hRP5_jz5(cM$-tWjZOiOpt(yB&MALPrtJydK7l4TdeQaL+$QpC z0bLSVWR5seC~FxcWO7WrlR2jElE@s>cS&WA!6?{cT_SS~+0BsPdu};QUao%?&Qh*Z zEH>ZxW9okwjh=j4EN6^H2=rS*Di{R75ttb(<>?p#^9$i~?sXewMojLxGsSqgKHg zOBl}qsQ|H$v@ja8ZUs&9ttnT684n3&F*AK^FK}LwUB)Y2&Re6_#@E)^-lgoHh)|jd zoTDqVedqOLGvZuWq8vXr+jk1oI=~S9w^*DX^M#t^r=W-DB2UbdmfW)w^l(EY3VC`0 zt%5Rw0)dK3(8S(wGt<&3_z@rLm@32_1EI)Jv0o|qMES1Jj zN?WwMzE-7SF(LFHA@%zq+O!%Yo&VBF`M|{ zTyx#~jQ6*L3Z(ojo?rSBY9Y&ax##Bqnun|k>Q@opt0^{!$NKg^d?aN$dYO@2*A-Wo zg(DS$z)KAy-CxGf?ZPqerltGW%;aU<;g6)ZR}lrq#2Gw>pVb%Oh9V>p!svlLTU^c= z3U&6534HXQy_3PmuAiUldc@{XzC9}BYpo&s5MHX`N&g?b^KGbS%PABar&lWftsvUI z;cv99lwcTejx6uaZ}7kXbR$eLZ&%I>*f9AKw@R9cCgE?A(je4e+*D5U?cG;79uG12*TY0O+BuB-@eIcr<$m9-)D z%Kl#Y>LjdT7p)2bkQMTmTagEip8JBp$gvB>?ZeiN{KYmX;X3@wT8gjIY>|Ud|0i8} zb~MhynP^ZD(IOpGCK};>Qdw-s%k5;bp$s)DbB(fPh|D#BmlGCnY^LkCFHs}mAHTeP z8x_tm^F<|&O(L~lP}Hu+fLWRLgQ}xJ?-`DrTI9+GW`a46nP4#Q3qA-STv~_XhI6Il zNc!1X(pyp0Z(Xpua6(C(S^@3Y&pY z1d7eDF>M;v3?;0H9k8viB`Vv-?=}?qQW^Lx)_=YKfdzwy>{v9?-&tpc>_E(lC!#Q! zK+KFMEEoz3LeV&u;E=|)-&2Q?{_mrK9mxoF2OZZ2qAoRLvlXuk1ueS*%D+yU;ecf) z`rDym1eRbXpd_>hR}+Z_YNNGQBoVDN-hGd{w)^inJqM%3dWK#?bcfD1J(ZhRT{JBs+3N!6~SZ}YsajxtZz)6iWMs84n@EU)S9qgc-g=xD}%!h z5(Tyc+r!bXlNRm%#EDut>`~H=8l|OB<~pO2lEvIr^%7&$D1KhP#F#u~X`srijYR{| z?eS2JndrX;+h+zMP+~C**dZv3 zRt8qVA8Q$WGHs!r2BVQ3p_*jelpqt8I+ajWD~*NaFo0QS)nFai@lQ5x7K6!Ynjf;S z?Tw|yYK9^voP>>_7#5Yw-&_SNi&(p`X8#RX6HcQtur{(I3b^9T2PSVB@BJKV_g}8H z;-=3^VL8PYV!Zd^ssQc*Pl^CW^Z`H`0{nojBs7Sd5xX{IGh9Ujb+Bi~+wVZ*{`MMJ z0rpvA#VvqD*!Vc&cFe3X3CKl<=61j`(^$S@IE{8#!JV)S<5w$((+bcSNdy*Ia@?77 zoE`{~xhg;oZuv?hbu0D2sR3sfsEY>sZ^|Cy(I9LfA~FD4G61_8aveq}Vgt>nHi5=$ zi-r?s9BCFDtEsw-MXRkiE(vH|oNyHfNkpLyb|*WETLNdH2&Rt&>@Q|56vwOt_y2j4 z+D8(hNYae2G(Ow1ilCm)5Vj)-3l8lF1(DXkf5C8wHXN}Rv;V=(kf_5#)3Dv zu202ClxNBnCr{>z0DE>VkmA@*Kmx#OE{#T(0oqx{qH=zh8*4Gui$v?pKut1a!oKz2 zkA!MXW8$P$)s=zBkG+*h$E_XE+i0LXs{~_-8`Gw%XM}2g?r%quGhw3hDF}1H`OTc^ zlrihV-G-Ae6VPCS^U+!c1TAb#nyeK?;P~N;qQ?9MKBd^x4#2-S1F|t=mS3g1{`PPP z2;0or&Q~IxE?_jqk9R&tfYSh1br%E{!@);!>TsgC-C~7HjEc9ln*F^%R2ZcAJ3Yqx zZ&Zg8&Sdn_h#&!~xe5RkfD`NrT4H+BXE@&hOI%z%^*^WnmsK@UAZ3hxh&4dOkZ>~6 z#Nt5Mf`AFtRt4}QfWK%Gs1q`A+m6Ct#Hyri#sMt6RGv`)*dzV{fr9xd^#ypf0cb)5 z0Xzx}9I50tk#N+k2Hv;Btc%8B$;bd%ssNI>E`)oBz;1=`+yZ7OQjKB(_il#kK;SS^ zXHyr3x*iZuUV16cN-6*%Y}Wz;mbL=V{6>|m+F3!J%|{6SOA?j<)h(-fyBYk-SXQ|z zT!Y7+3|R3v5)?oaYgcGH;Gc!-S47!FR~k``Z~~}E+!#4(6#x*5CPvwG`H090w6rFU zE5sl|7+-v{f%&UvU7!H?ido3VShm??Y~8jB=7Jl-5?d(lBfBAK#r*@|-X0~`UBHBS z0oH_bGDAwh3j}vsA+ypLH+~iNfdXfHcsppoKtQ1T8ki5Yp(8X>M^Y`Ty!0Q50U-&# zSh)QPYf+j7vf52WI}S7+aip2OOi6S7G0r`(RaWLMktYRT|?< zSJ_C+VQF>!oz+$p&x1uqW5fu0iW_t0@Iw(9(-=Kke7B>ucqZxvH%4^3?lY2?@Bpm1 zlnZE&077Chwm%I^l-lsQ=+RbPV$Gk_C$E&S0zWg_RkL6Z&`K+nQaSPk@e)VkFP|0h zFJJ7G5e)^p)`?OY^y{KwD~&+Fsaj-{=g-%xP=5v8EO=e7Q*1C`k4fYiP-#yTP7Ls_ z4mjX-SjLnx`3M-ihs4MTVid4FS)Pc8psDj|#*B}oYIw{SX|R)%ADLD4l!kh-L5ljzyn}5 zfY>!=Bx;++JMXD3q`m`Hf%*llP&|sTDnL$1*HSEb;|pY2s!J;#7tb(%NKL?kfpE9cPA%I5LKhR z{4fe$K1$pKD2xQ*bKDVE0R^kfcpUZ!pwAdH&Ur!RP&%PXl2jm`$i9p@bF0Ep+X4;K zj3q#Xz}4%zJgACQaCStkq!t7WsH_TwUZCaSog~By#eVEqtsKyPg8m9hj%mF4CKl0t z#{e2k=DnsHsT0w-1walu@wBQ!szfr;J^IYmR7hyc403@1_bVtq{#mjuZ@K-*V` zYC;LcsOl87;j%)tpfrXArzkI9O_&4HTv#zlUv4#d%4&sU;Xri94%Wn=!>E1-Xwu}> zLgo~+giQifX0}hMlj9bkNPdo)AnjI1wIY_#0oKZZKDzfuo_ZqnrOZ_=4yt|}%^oGARk^JXL9-D`=7fn_F>_a3JP;DrFkmnm#5U&6T@#O! z1aGqL9{;-1WiOjOn<^B8f>EQ^*uf~kZ=4>1^CUSR zMb~QBC0Px+tb6hBAp2lAthNAbK$E}ZvVXaXdeOyPrpwf8r ztu?wv3awBT1m&%$<@BxPYY;etin~G^7?h<|X%3I-=I}}o%Bc-W>{y)-71^w2Wj8+m zVvXXmK~1J0d#^qfw%HSqpq7YT)JCi6RQzPeO5^oKPS3PEWKoD&)o2lO6enZ$Tu(il ztdF?e$vr4Pj2gYhG0BV^2`|W1Kq03mqTGPxyJ8@)K=JtT9|J=(9X?Z0`7y9E6RAm% zB?jVkuL3iOaTGGWt_M9^`7lsPXEnpGN;;86Q=xC1Hy#G-%0* ze4RvtR)C~?E0%~7JqA5HE(OIsAu?*$Dt*HE@WZvW0-mC=Wyu(BQ5@fyPY9|J6^fTf z&G`8*WMeeGxJ*Q#k)a_Gpoqy)sJ|V~GOGN1u=GWX^w!)ziLK~s!##@FAZpvjJMRps z9?4SCx)7hmmM;n$p}dXzMccF8to2|g?j8zzWV%a4g9ur*x=?9TINhqM!k)uc2)avH zyM);g4~7kg#So-oSz#}v?7@&h9|gc~RND;UDqQns4+cn9SX3YtS5)})LNw6|CQ!+C zE!SAHrm%Vvx1HeEwKE#WA*Tir^tw=-RNFuPtL%sSAj2|ZD?nl`Fffd`Ks~K?J3B9! z%+{d=k0byhsu4tWQ*&U!?g~$s@x{NaB{{i}-bSTiTd3>o7^u(B%DJ4B6qlnw%uN{JD~*}6 zeQQbs{enf>XCI@!thewD|9WzZRK?d9Iu%jrWIK4BI%BG4(sF?Sgk8!r=t-)ysGPaZ zszHKc8&jvQL%l!lackMe(u#G$>|PwB94D+XYxX+m8ckkef7#(BZhrs+Sr6KU4qbXs;hz(X`XR_9qF@qnZ#s+upb3KKdmk3|tH`ilj6#hgl^b*B{eRrO37nP1mAL)7Ap5@WmrX#M z3kaf!iY>H)0u3}^+`Zj>fs5UJ+rHfhm}sN2$*Qu5pn?Ljh-@mzI*~C(P2!l)?lEl6Kmz_TS})2 z6!Ysr{9U9PyXqqzZ*wBBx6I9xoJTAc3qafqY9g~lX=J`g4y}%SDpUrne;Uzy4JWuMm5L}X5k9r3`(bO$*!tA%ae&)b;dK|<10>CK>N!^9yV*dc z*IoY)S1O*VY}=2I9j#t|Fy<@8@Nc5qJd>v>rYVAxrzLZfFJkP`*d--gO(eH* z5=+dR+dafs%a5mc!EM`T=am&C`OB@QO|$P6qpFmVAcjht&0mGqkYU;Oc^oOD4Qj5 ze#$o#Q7VXX&q=xR$ICZn*AfLXHx`vJkbFDzLka9u-b1t2=ARoHa_#8sgsl$yqoVDQ zAdjC?MYGWUJj=AhR{8tozsz=xT*pb~vxM{uRMR*nc!NHhTcRQmv_B$4z3u3{Xkl?d zJi{I`#M@vCJM}h{`@AHfT)_*x)7|0FWI4rs9Rb7Jwyf0m%rI`D)Y8WhIpx*mUw9r( zN4eTr z9d+Z*k9!LxpJ!=CBN0hjP|nR46PAx9zfNRO72uXP+5kFUIHvT46M8aG4DS4OoI zu50po_Py$4r2>>1kD4dc$+TP%zH0O}bu*mW!|+)JL*4(~`d-aZS~8p~iDs>ombkhJ zQS9PpcllUhy)N%6JNDy7&h2sMmoKdKg39w7Xd1rf^%wxoGe^!c04*`U)_W-9iKk}P zdR67%v~|j}y7sgg>e`-2c20^HN`Qir*cmE_-F8d+JoP$Wkyle_BGG*_V52it#p1>( z)V>%!Lm-h$N*1_o(hO&y@!N#fHKXfO$J|&vZ4K95Uv~|*nVPne1`VW=602iJ_1};< z+arasqFK%whX-j!j?+K~6vm1qH>AhC&^;F*Lz@*CD`SrVpf68n|;M#f7 z`d$01=Q{$|xh}JQ*QsqrWK#A&Tu0!p#*VFDjb`4(k=21}CQYhmHQtGrxKGnRxBDv7 z#)l)(1J%r$br#i}-3(9QN@LFEhP`&QznV5}+-izTVuhkRS$E#){%G2`9oBW9td&8y z<;9iz&Ug3M7nDUyguRjv|ab0cTt%H**0l9*)!vRaewtM6@5{A#O96Tb;+n+VPJ~P zL{5lP-kyIC>8Tv?3AxH}ASO6$wQQ;Dig|*9onMlIf`dm=1_j%N>J=2+v!_#>+GLeU zY22q-TN#5U+wH7gk-^tzIpvYtu_C%ok)!)X3+-6xP;o(|C|*lF&V!WL0W@Nrl+rcw zqyCmCd-7U0-slwf#A@1;+jfLN%Bk%@d%gH#PffMGyMEq+wFN{D80aZ@dTUvJEPVvP zwWBBd)Sbjx3*GXS<*QQHA?CUo;PhzY8lO?Oh4wbBzjtVmI@$3d(J=MHuMCU_ z%{YeUqKI-FheHFVdT;5*aj9=e2Law!rkaI4vKohKAQnVBh7;EC;ggfaUaH^)|4SJ$ zBE@M~(RpR1O2m7bw*SOI;S?v*TayBMEEdRc2<9bG%+>?d}qLxt3Rlx`s+8LCTYjZ>mT|DNWX^GbM^>vOR~OrxiFn zWT^97sk{jBc_=fScPxG@r8p)^P3P9}bPcKU^r3k&W7)ig{U-u4Hc$Pa+-Xj{Oy@58 z2P3SCb@8~Y6f3lP_nBPxvQ?{Z|H*+FD>r6~|JXrWyaE*GV9BIH`c9N!m5!lSpD9I8 z23~9KyeWDNGrrplw>5k0ZdrEbj3d%+WWiNQRMbnekWIoEWyx2lZa0GR0+dKx^;BI; zT<`SIqzRo&NBoyqjT=vOCeGWncmDPTwY6(EHR{e6If+U-cXodc2DCS9I5k=*bIw+a z7Ur)|Z+UOM)#XhLlti>nwP%y%_flzKmG{VMJnvmRx?ykp|fJaOr3?5tI@0*zVJdS zFR^;}%TY_=YQMs0UWBilyKc_9=%O4o=SA1he>lf6sgUPq`y(;O9Lt>d!GSCy~LF@b3IO!3TkiN^sN$?!BKXS9%5NpF0GcKN5hs`&uU zeanQeSGp(vC?fJo2SXQf6-XCRkD&534 zy=#Z9`+ttuD>GWDTHQ%>G2yJ9p&UlblG^6f8#Ks?7R`=W-MZy?l#+t71!Cg5VR!A@ z=cEkB>)a*B^F}3DAkQp>L1^E5Uyiaiw13*TMvF`1vq~Z}9q+W52?@CcY_6hN5v?ux z)HOTsSG-8}++xfuU8Z&?ap#?msl5EkP|Po zMqQVqUE4aTgKtjMjdHFv&qH`{j^iEI!Mw__QJ(YsNV4xcZ1o>d#~F5HTG$Hp&Cw0p zc0WZDsaBRZX)?|2_hZLS6BQy_QW{;Lt}o++vbYL#lv6zYY=LK0z_jV*SWrt|cV45h8R*xR)zZ8-AGPI?uobY-XZ)Gvuv}ho} zq;qFIXQtu+bo`6h(RtWFNX%*RJSDFS(Vk+m&T5*wI?u>~0RyM`mjl=faO|PKM8-8S zfWpX(X}(5aW!*4Mt%J@N-D+-hfeiEUkebI7oi19!A8{EnOC-?FUD{+Mn$m2B4hc!j z@-%xvwN_C*gN{6-I%t+jtLeaqX}4XwCLeQNE#vMqBVnwz?WUzlGt$ofxl|2>w)pAL z!S}OUBW=_^P=cyBed+|K3pH;p|BC9McKYUsE2rz&d#&ht>;XO7D}t;nUtUktzveeg zZ#=tG!`9%T^*_VDO81`A9ed242-hve&TG=Ex4(oL{(XLYq*v-fuAjvU52>q2Fr>kn zkUd?rL|S=5JNuNtNN6D%mpRG-+G7!m1RU+^*(D~XgkiVX)+q;CW3yC^wx`2gQR+++ znw64q&pc}i9e2#w>1x4jUDaq~#;zzhNHZc#*G9Pe2HdCb&_NwcUP9Th(R4equWj2I z#x17h#9-wHY1V9pQW4Brz)oFec$bpN^&Hof6%Nm^P0Ub=P}^v5L4q}Ckb8otZ}Gay zhrQ)xMP?l*^y%ZCAdfy~#+VePuDZ%osx0N5r$4z-BTg=i7R-)Y8Q~eRM44yu&F;Jm zlVb{Ej$9FwSFKD-Izb;vIw5MWY#ER-Lp$ljMN_7ebEVgVt(zw5;@EO_hM_c#+)Py4 zPRk zWYE9z3d#~P8|jXc8Q%EhT5J+EJl`M9)g$T1QAwAsa|m_E_lqvli8oMRO=_fJLtHDW zYu6c`AwgTs?kc199ZxSzy;`EdMW+`k%`E4Z)62Yii<=C{vq&s;uuxV()aXT?>}*^< zwKBJG@>*Y|s$VC9;!(L`3;mWMgP{Z!SmnPhuSlxGmjOn_ zBI;~3@)_nt#Ji=+>X<}%)3rt)@-XJxCr3J@2vk&tf=;YK2a;P6Ewdn1QOxbRQRDtF zKF-ry(09c;jg|&N51TeSy;9}8(B8@$Zq$yExF?2yFDK(qT;J#Hh^%B*vr#&%Wo}G` zVskN10|;B=Z?bEW;MFevs}c2`T;wjmZG)O$n!jk`N}Z&Q7swwaG>cd6VOLz^k zs-|@t`>67m>kl64o&2L-OORJ;zeCS0@uILaq#f&5PWPLGqG9!LOU%oQ7CY65aEXhg zw|a)`62{zj$|xf=PcnOSwu?w_^OchfUFMj+zT_k_Kd5V1EnC|Ew(rS(UZ-<3@w~gT zBA-g#r=RD5cV(Kc%~_b%t%qAK;(clMlC<(?%Ad=e9aolZRAzeJRBT0_RBYi;PAn8R zx!6FmI^3cm>VgXrD9k@v&teR`4LsHK)F5>Xc4pc zYrg6?PJ*_uRsMGQk5b;FaVkdijpj#2nVQrGaqiP3jZ41QfB052{C8^ZoMvq1ytTk8 zaP#7+RvMPfV+Cj-;$zP&Dy91)*GG=Zyszx^Ub&n}XrwNurke9+tBE{$5Oph2GwMiF zQksdCo3As#l_&w0A5~%^p|2kZA)c=yU8I<#fukv8(&x4&>?Cjnv67H|p6San78lT} z!aDsMrg&L_EznA1j8u|5Yk}&N-syl&o$TLbhQpUs%gMc@-lyZRk`cyqLf>rb^y%K> zb5&A8<#&yi%!;bm3H|2H?3$ili$&`1y@N;0T>gADjjyDHH-S||Eys73r^L($E-Z_x#fR>3UR_C163zYk#RU6;Ws==c*U2i|Q)uyfUw;3yBnzwxiCqY+1#MYWbzPD^SMg)L*d!i7< zt@2-$|Ju9oDeejlZDU9U^mHBm<{d0*H9WEk)T$@si;j}el24r%C^^Qw$ob+~@V2Tz zx$)ldOnaRq`K0cCdWt5JV%5_PH=3tYhNZ;RL{OpM_p=DwGx=O(8C`c~<82^{kwe?8<%1jN}d{ zW}kf}^OYm)^dT9ylWQECRsR}mt7r1$F)>Lys=7{YSxIi$99j6Fg}V%ETG^Giq6cf8 zuVX@4R7SG7scaFI9?m2UEsPp>;f>?Q7@4m}IJa4tDayDueIkDKNab%9Igl`|pPqI3 z2$e6cESjsv91#)9?IoTAEu(pNDela={Bqxkh5E7TKJSVv-17=duCe-^IehpSSvXWO z*QiTM+?c`8R;;xB;xk1XHBvd{BA6Dv`{+LQ5BG3F8Ly(@hLD z*sL7e2=3T%tdgIR0$R1sD`kfMtF9SK)k+VQv6UetL*0Qp4_su&pXf>AyqMDAklac^ zXwzn_D1BNon|W31l1n9%UY=Pss2?@imbDj1^y=j;opOz#BqlWasd&_*MWW>o8*cxm zMlu}-Vb`AU+l!v;jiHdv;1{7O=cyT%$Q*l3tB9eJu*zb{MQHmydYZpfcQNx;x(O8N zd8@YV>=NF?Dwm$um{UROacjU}NwF7J-Gc9tlWgApu6%|5zc;ohL$_hWtVudSd#~Om zV_i@}c@4PlmM_dIaECFUYeB6*h@IYLx8HpKM@q4us; zbU*Sp23c&7C7xH_q7yY0EsrX z+Kzf@o>U`Bz!XG`C&DDt4_iZqW}U5~h@G5O5SGPlar*7TamxECGKstAp1cS;oV)7{z*!G^) zv!`>+BoyN>mG!MSQp~$aSOW(-CG2RgXqv`hb?>gr20Oc*W2Rj@eOy12ZQ@!v)Bc$< zS2=p}N+Z_PoO)JUSe7@t-nCwHO^RCmen2GItVofWItUEqR(VbN?*lb>9Ro_U7t@7- zQ96j4Mv#*AoJE-6v)T1Tf|^1I>gdzd6hc8%&mbsAYOJ)(G)Tr36{whODX6&wdosc2 z4oowj(4j*XpSdXNx}mgt*ShR-4wS@lqd~WklAp<{fbC71w?JhajF{57%5w9io78R+ zCwZeg$SVJ$M>&YAkEaq_s@VsyH$m9CFOj+~J+oM# zrWR{|6rJ)CL8N@)o=2$V3C3joGp-u8MqQnpI?_y)7y+-xFg+s}kXK>rhH+WR8k{R{ z>o0D@))gatRq5qCW^_xV>o}P+ufEoozA~y--Nj~=sQi_psmt(|VuUZSt)-qJsUTM( z{M3$9D%eaF65~bbbVG)?2``m%-Casqy)7!q#QOJayN5wC&&DbC#`qhZ1o~ z>Rzh8qp?b@E?xa4eHyLRv2&I@PD&S3@7`H%5R%Cc43dZzh_VT$N7#g)0sg~lS93Grz$bie^ZSc zkJHnsN^N)kR{k-2W+tTr(^p#GcWvIc-o4$@X(x4t4R;GUx@sCXplj?|ty-&un7W&o zJv}C6o8NQ*i_@Nztt?Iil{?5J%e3PTY~9{ASJji77HAFfC2sTxb>-*~-=>*0HQ6gi zjXJCHPS~t6=B=?=Y0hQqp2*1eDM!Tdah^hIKq->tE3RG&x`F_7;M#|KYdgdy_+q=>!4fBJA)Q!f2Ng<7- z?$d9)a#Tj@nDOe{KTSFN-aK<-ZpoB$WBmts3#4=;*+u*G8L$0Fs*yR4UXvb0+4_mA z)RUE(Xjsv+bZ}SGrb<04DdX$O@`~|Fp|@v|+|Zv+odQRk%UCy0oDc~NZ&9BBk0zX0 z>iUeFBS-n_JKM9bp5VG}g9cRkf!}s=+<5bZpw6jVhItV4&P~cTol+>Mrn(u{t{h2i zv*UC0Na`f+b`~7j<}vnHOyWni1t_aV^Q}?WOwh~Gb*)-Hhm_hSjh}bFAa45yQ#m}! zH!LZPi;#fR*3H8D!?k08+EqGT^T~`B!aSw-dx)+?%6`GL~Ie!{MGVx?Ldr{ z#++BD>@r8E42Rx0H8zUrl5kUWjJ68zn;^-6@`~aG@mW%ze~(DdhfDAHh@7Q0ys+uQ z<`X;HqCUxe4~8k1(Z)GVbWwhVeUGZj27iWrE_CM9v|d`^Y)q-7l9PZw!_8Z(LeS?#-6?X_1#bx|DOrHUujct_03cG9KBlYAOsYr-V&MRcMZe(^>$b!wJTd}_`dRA*Qz<=?Q(3B2Ieg=C z*y?w&{>kY+rw@6CuR?UXn4138_wC$nkxHGM)EDTh+W+C71ia{?Nut+E@SrE>a-Jt) zF?}x-%Ffl(KxwVpHfT>q;&qzQ7)B;>x^mAOw$vJCr<_1~p)5~%Ej(cm>WPdx z=+2;>)#dJu*W+?-jD&l|`2W=_x>G{`gl8-&Nprmp#`^oa;qz80X{%)3I_+ zVzBvc!m#{crm|F$#u|HLeX9~FR$EP3^{h$jBDK}jtl8v<3M0^=(Jfm^l8;D{&WSFO zmDboB>?A)0-o?(24xB2DP0DaYJAp{l7r|D`38Sy`r5Ccxm`OIV4OMFlAD+)IhZkcBt)TUTD0u6nOm(fE)3cXsp5zEj;vAX9-I3OrvsI-RgTC#2F>Td%&8l}&?9 z;tU|h5H(|mT2wb>%49VUXLPHA47<@JQcR`>7W5TJ)3p7FA+@BhKqhh~Wly%vs5Gh0 zd|$pOuHK11tkC~3_s>6z8vjxMXW-g1XPw2h&&~xMxKdHkSzPIye8zzbO17Y=H<=vf zU-smr-|BHQ33Vfm#^Jxr)SQ2yN>6yCzt+3%a%wG%+F#WXJ37qI_QyxW-tlkbPS5eAiCAxzAv<=~Oy9ZzcG~KUr1rda>5^lw zxJX)VVO`umM^^IFs#L+kArnjKVCLW%A3%GB0G8_ z$(VNh{o>@5T^N05xv>ffwKt)eNsyU^9LZHA8tfs@`mFrq_h$P}%{BuG(SpX_nDXrT z^0&$m5wCAeR|f9m?9Oi6E+=Y#Cw;zhRP^ZO``Hsm`ngEZ5a(w@gg2cOZ}@ zq9#d`3SZE+dN6n)Bb?(b@vYaVRSha8lY}vSduBya@?5C8OC<*Mn|>AxsiYmKWq&ioMUn+M@yoH&%>e16JoZ2>(3)m&}5Z<(Dj#_M^ zGY@v@D*y6N^*Y`+t9kRBctPBbC0k&%?~s#n_QSgH!fDdp-Hb-QiBeBSBNeF?Ny=yx z)hUgPE3a8IH=|J~!uUR|%z5iN=t5k1;`Qu5tt{cXa8qnoQe?aX-z_hn=4j4Nz_hX$ zO@1|{e$J#pM?)rzT>h3t@OtT_-=iSCN&Ihmd6mq4>0-9~I@t#i=CLFjQzTFC>>NnW z6tRX3o$h`@@n75D+X-(=_U88MA2`RB4&tUS@MzOk@4o3vdgdgC4zEu!JtTW-&m1#7 zp%)fsvd*q#`Nw#DyqZytOqirPj?))>0Z;ofiqIBZcVYW)oR>W zvL>melvZY@oieGGHBVe>%#1M^saHRRt&1;q>L}HTh|(17*3HQ%l%HZJ(w41en1w?j zXaCNNBH=f-6w1nHts`0u8zP0|1#+xdA8Xn2{`>C_N9U-0aKcDQt5M@Owr0F_*6nwstIabf<~J(lr@l~u_cB@*kFMor zz163*TpaI{n``f!YYVI&)Q{e^n`4MzOU6uKr71Gny5h<=PE9e@yPBClm4c{QNk+(M z>-w>Eoa)un(^oSh?H$y4YTthDsrJ`OR(wWVWpmwf(Sn%dKrTs&vR3;RL{l^$lSwKT zSi_v5`e|(+1bdH{Z(Dpx=HzIrS#y=(CvGe3CgD%qEHb`nf@cdjiP$L#ZUSf4N$Jg* z<9<~;X``}%m#FF_)2N%CQ)MZPmW8sANiXMA60~yTgj7F=Qg213r|M2` zNs1cho66-7Ej^sfIQE8&ah+M&Oc(d=ojOatCq+&;eW7BOx_wQx{L_9ZCJH zM>w57w{O2oLSrI2<)xk9)+C+x?I72olaqWWSVfa2nIR|3bJOPTKg0pszEh?*t)HC_ zRt{Y@B2y*a^M}=$;4B$3#wwjHd0(X#EiywgOY3-*TDJE8Ahq|;(7);QZgnPK?beo_k%q-O2fS%|@v^|)H?l||?&L>T+x>+@ zQ=_7+CRDrd?(D0Q@rkJur-dtFX~!8l85(8VMwJfFd>gYC96cmDGs*`Ln_QCBOMW=7 z2dw<#@=r2Tq-(RU=oCHMoNd|2LN{Sss#IYE-7anA^d;JDb)o-EsecnI^-tP6w+K_1P)>BPIuTLS-)=c&WdvDJ3V+-h*k8 zJ9Nyn16cKr7Frt9k2`em9dUEYcI}?&6KcUc@6wg#8g;THWm>T3CD~WcKKekuPjW^5 zyXdAZ`}}=8Vfd+{xx1C34-M%s(;!Iy9ispNcItza4PNLiWEtJ zdZ9`|#jqF-6@}k8sy8_fH$i>MG-IVo=o<|TlPz1ihZ&Y*1y;}Ao?qNOpv8CNW@Yc( z)l+C*o|}AJefeH}+@tR1tif1`@*ZWHePE3b#L5_)neca1<#37k zHq%I`oa4N1Oml0h9sjiQx&dlPZFhWm>Lt_DxCzl=Tv9!-kHvzF8f5Q-f4zSd!)2_QOK9XFxB%i-uRx=EYb|w zY345;kn(tjFXOc?+O9*&qG79X6G>Qh`b8B}(xr==8!XTm!`6TS?m>G?E_>D`u%*<5 zNuG>fX0KVbRf40NIJ?6ZdP;cLaF(e>oJCrs@J^iy(_eK`wwu9A+O$$LJloLL<3fSi z?~Fm->|ODMcc*~?MRs0kySVI-rOU^Bu|P#Bched+!YP|_D`3XyN&eK+GC)Vff=xOx z{q|#>I$iH=3*Oe#x^?hS*lOkbP02kpf-!ccW3`Z49LZLzR%7A?_U4hr5`>0AW&dRM z4sedB+&{*+Q#qLvWx38)Ileto5OQPeUD7=JpE*inB*mudz519_RAo9RP*jU^*lAJW$oXTg@_u{ejvq@EM z8M|QW#k`$5+eMu1*zC<1tc;B0W8S@??dU4$Y4Jj;=HmmJVcW&rtN_-Y6l_v z3Rhg2l@g zH6}~QZ%|{BHYv-B#5u!d$`WxaXNDZ|Y?+lCDNv6iI~XuhM2$bybWdYY>->^gdgrg0 z{#KV-9Xi~orr(W(Esd&t<1vX}w-4Ca$=i3l(ahA#Po8FCwP#*G$-FrAWLQ?OQH(+3@0^St{?!J5dF7_lGscmDuA(z<&y&L1zaZ<}x<7XAgrmOCL znNy~z1RRB~@KB4bWoKoXRZz({0=YL5uKU|b87X_xmAN*ATuE0eGE=Ae7WU!Jm7`>jVjo5m*GtRM+1J3Hlh+V2!Cbhj|JM_lg^m7ih< zacgv@U8Al_d6L9|rNhhXv&p%1mF}?1SK{vjYd}s&yDmDht%HyL{Io{ce zRrOq}Yq!8JdiK_yTYorRb!z3o_4|%mF6Vn4o68xoT0H*s|nFr(%Bi5@+1jK!V2{c{-hNa z@3b?5aDr^*=iQUJdGiUeSrIqVtVN3ndWS}3IdT`xnwcN;?w_5yPE;{fr+3LtbKI2A zpzhGovuxg|p?WN7-Nv_|UfWdd+D}Y5@U(7iFM!vPOp!#y>OXK&v}ksjcVp^8&z*SY z-NROoUb<|=(?fjkqCmp?Cy82{A9eGOl+dvBk8wAa)tNf*TZ!Xtn&c*4$Z$9MiUfVD z>G%4wxB3cO*)t~DJDs|lH}Ra(6J>-_Ne*l+uhd@CEBiW%_{ddyQ=!cBNWuiqQ(8Sk zrs5Kr-!+TTO%R`1uRbU|Nh`KaG@}u3dRGH`k5{+b54*fxCnRkOJLs}W#^7nWwjN3dL>Td99HxYR-j$D`vaojXW)ml$y8`EnJhlWw+g(eC=9v z>I^%xKs?}faPkVcN*TgIzT>zF$ycy9=JUG!>-n+-PrqpIu>{>p6Mf35Z9 z&P-ch{hLSB+0}k#MD&iL6pi9Lchq&EbT^rNA+^b{XDdCKusl=#d3MOVQ-nJO=P-o{_t3@DP8Ej-XRCCRWyclguy?U+c$Sx~5wv*~r*uKA?&LQxZB z-9mpTO(AvM)QVje_VPTUy0rL^ zwJSr$DR++R7T>nED))*OHC|^`q|iItA9xkY`5m#7FPbND)s@_k@Cmt>Ut5 z$Mt4psc*TL9sA|1_;RM;Jqx!~r)Qzdh;iSt;;TVN_c{_w5QSWl0`~_CcYIO zlI?!0`km6e`Q%7JWNt}hP;n%Yh*~4AOv;I6X6Z!-QRz5RkF2tbiS94P2k-Nys@Oco z8|stz+A9!OIlHtU&^udrUukk`CQs;7L}!HZ=#lmf+bV=t#jL-2FsHa4mvz;^;6)uL z=~-NIUU_-_u9>7lCSTpJP1XM%=GSo#*vZ;^A81EOcaRj?cNX{Xy;^U?TefBGzm=aiq_#8?^5fEV?-cCDKxq^rm4k*s%hp3Gc<>Wmw+ z-ZgdTAT^aFt+%imH=b-8Ay&Kg&fnfCVkIv;hKjDtW4M?vCHrE#2W&MdFFH9|5=@|D z8(Afu*(RArIg3e@;Jnks>=f5=8dRF8wld#TQy|)I%Cy>Q^iQ+Ii)PE@i#=ZX`=Y;E z^v1>YulS!ke-pTsL|MIWA3tV^H_+hvvl!liu?kch*^T ziJlw{OpUtpp`KaN>7{o@h>^`yH4?HlG<)20_3J2v&1I(eT6wSs7jTXD?K)YdUzutlA$fTz!*E=~$ht1mSCie4^q4HsRdco9 z*<)3ywWSeH{>*00Cfkilc6RR4#r!ks2q$-L@Vc>%W1__C+3>hE>f@{E*;`c;GvPk2 zscM{dD&J!El*uL>Np8gJMfblAv$|W|X}v8oI0-5t($X}d=0f~-tk0_wtDq)4j1Ujc-K!8H)Yzjn{3v(Qp%C{q9*E} zOKgAlOf`pQwQ1`=ptl0=-Dh&$OKz?5$I6#a(W8Lz59{?_NtUxSHh8z1b2KEeK0WTE zknuu>&UzJ8&)!qY)bOO2b)|}m9Bs8|F*WLqleao{^8eros&CkEstHk$G=6zBD64H- z{Rgktlfkb;2lH!bi9dN?&z@7GCPvg3IO%SFEZ0y|Iad8DYDa z-mgA+WmMn<$tI|yVGB*jhi|!@HFtha)T|D~bc}nlNtyX%Um#)J=g&`yBs8u>Cz#PE zJ5)9U&)S4AFD=J)l)AFcWXLiJvI^axrS|Q82O{<=h@L%jQjM5m14utDTcEPw*=uRj z1O!_XCr;BEt8A*WKy_ZdW<9CDr*+iI>oD%J(bhxd3+q*3Aj(~AC7IZd1*5+*>_DKj zpWdAra&F>|yK27&U14%nX&yJ|lOAnNm{gw&)Y4eBV(Vs>`Nt|u@e2C(o92JRW(kY! znwJNaY4EY*rm1+KeDNI5jV_3)#Svz)6t<-r4kUXj&5D1D!ysmF`WMlQ^dx_3NG86z zPP3PJ4D^XhqDF>Ju zL`(`a+R%WQ1RqD8yk>5stIoNZoRVRnb>sNy?yJrXuBQxUY>Rs)5|bB2-!Sf6>k5vB zR+DDay$N~xTs+;E%EH^?@;$B)6xQj+9c)6=iah$EOm57Gs*UD!grjxSgc-K66LQ00 z=i1&5sb$RRL;0~;>M?Ru_74$lgC+S|G`N()y8H^ay0bfTcH!w|Ce%a}1g&SN<)@OV zRjWR=L|>_Wbj>0lCz>e|G_pjJm`ttxF7aJ2o)oU^&3)0R-6f%#@{N^G?W;JosAB7$ z%9kEJb7G~{CSyz_Q5vdTwY_rfYZV)JRz9(}a_z~AV=q)Z{#fP4hikU(tJ-$7>gh)- zHm|Q*w#52g`RksjsxwDcR&IWz;?aW@d!JGaxE2`cUEuRS+V}*Ge`DT zA3svDXgl@lTL^?m^_p((y=HTH^^S!+e$|PWbx9teV)gpUm$>T{mCIIEKXRga=@MR7 zMfq}l^@^p7&m7&OZ`ym}r{xb@eP{UUrJ{G@6NjBjYuO}QsJwBQBmks3p%dta{Mp&-ZZz}EF&*@IQnT}{5b?=#2tV?KQPBT%PhcrVv6 z#K5z4yYmU(esy%%d|@FYA0Fkns=e0f*GGQhUmX4FmenrlSDm7Qc7BQO&6mFK_I_or zRF9u}l)neq#D?sDs?k#U;$iK%c5f^^x9;0gfBp$sAzlBs&vvAY9{u@P$N$Dy$xD)Z zfAr78@Q=N1!y<|jv+{{QJ~UQG#&;0-UX3f+gM0FRG6f%92bVTRwA;M#kA3(3;n?e_ zB3)b0-4VymxaRJIHH{aa-lzbQS(8(T=LU*f_nx|0>0313@8hy{sLXNLn30`W5G|ey z{34I84d2l6cpB-W9&w>ny5=J6aHw2ifq2Okvv2n<-N8#Vc`#5j1-hB`%VWr?)=g>c z+5pG0U?_8S-376M{R!JI->%liE*k4Z1i!vLp_w~!&5S<6@zd2mCxf+qDrRPv@~3SjdFjG^p zCQ3Yy=Uc83o@WeM>rXYzx6qgMbU!J(?&aCJT0Xjv_0#ZGf$1#i-ui(2Smn55a9mql zes#iMDNPGU$1t~(4^MqdJCT3S&1tw+PTuQq_j#Aujrs)Eo}gc|GEn_c@osi?Q?k!M_0~c2ugL_}rR2*1as($}Wy?;j*@G>GK>u66AFyiIJY z{`2v^L1X=Cjncqg@~1aLg`Z93?FZkL-%xgS`Mq~`P%uDqy*lWE?xZWy_1E*U#XGmu z8(ooVJqG&;?^ae~P8;1$x_dItdaX?9PTE{6#?u~ry8pY+V&n8b*O#Ya$42iA6}h{= zxz;X5`Ec`4^B_0qnP8;i%jWpUwDVi4hNoY@38WY8&Gs47d<9y|z82}meL?sY=G-=l zKQiN6w6-sC_R|cmKjw@!AG>4SaV-Agc%~))NZYq9@au}Z?cOutTjwl1kFO0h`q%kA zZBek?8Hu_x+Aip@DS2o{AO2BNBVo!{`MXGW+kVkP_U`J4jc^-EbS&(AsH3JsjSK1! zX4U8DYq>JjQRn+@590{8EB(I6_i)AYtezwA^_sXwxjz5Xivp@c&m5+gI7WMFBwTDd z?_vVX7H8L7g@*sQdP=HDE}uH&4lLHc<{8mf{PB7@+l{+*dY`3VynT_c_`tr(y;(@j z;bwxz;{6&+*yL-gnmot8v#q@2nOG;Wc0G@+&J^B?YROzsM`gKV|!r(+xYdUtJ!TlABZiSn!ZGZfuh#TgQ&F_!bIT}6t z73{bp-)-lqEKnHqb^RB%w`RNK9^~o0m3;fv8SnEW*DZb}5jnbdYVi+$N#i#wR*asC zhaP)&Zi1Vg--*gZrttrrvaK6DL24DMnq!%Ie2`l1`D)G~S0vIm?V&QhyEVXN@w4W` zTqD`cFYlj@6P@4vxoeb@0{aFTqdBg9U zS)U}vZ=NV?$${`G@;fLefAnt`i?!sSE)g8@nb)E{)Mv z15ypey4z3qy-z<;a`&|BzH;0gxN$l@uh_QnPu}S(pA;X7ZYdyrP3jXpzMdQr<_zt! zYnXjrn2-1dF=O(%n5@73BtdWs&-HBEIJ-7v#-(sYz7} zZ%?-RvQ!fSq3IVFGp{?`@%&PZvNS%w^GVj}4`lK0NQ)Zxn3A3myVQtH@|WJbxj*=h zG(`I!U+?3x@7e%At2l0mFFRpeKc~{*^+xP7{gE<1ZvBI&$9pY{xCt9TK&ItBS(5{ciM6mMCPyS+oFw0j~4Zzz!FYq(#4qrBh12+l%RjyYl7xW{(JE$RV z>AYk+*5FUgV2qr7IHY#^)IIn3cNBcU3(tqZs&eVjm+Aud`9Ci5^>;N+7WF-Rd!*Yq z@@51$xaAanO|BZ1o1`o->i_Bb`TnZErw6aZURD`i;Wr_^yrcHycG=2u_jgfyj>=zR zHC1L_7vXMeQmRjlu28BBHQ^gykm2VSx{Hg}&sAKSvRbUEQ2=dCI0MJ^RTPPbQcig#+yhn!0j)|^brbTnKr zpK=}%84DM=>MAgdtz%t#n5*_Ipr)TSuwv6!MWH56|DNb)rK=b{wG$|-R;B$Ls6xd# z&f8-uMbsB!t>>z`6Dy`M;FsElOF5>U<*RrPa z?o0HAuXja#!W8VKgKF|fS0Xvqgetf*PF!_2Y~)=`yEmpk?zA?0qWHG7;^M#b@1QHXyQRAwHi=z2(Ne74o&0siq? zOVQOKJ%QiK>X4=oD&DE&cXzKcN>VDj2DN_cTAGnrpYvylyHc0LKKCdJL?!>$(c>^< z<9(pNuv{}9(g6BVZOHDQviR}^8umQYAzf`=f9<93-1lEILyoInRS!dEJkM3lwoh(L zRXHunpBmVGxA>yG`ckM2xJ{jjh(K0Tee%Z*_{4qrvsMaMFh}10ZfEa{L-x-`{;7=R znu@=+RrnGH$KYxU!XJi^Pyj3UGhsAi!8y~P5NuSy{&x0{yA4dJ!2)S1xEH46l`fc z-vY(;YvCeuX7ly45*1Z7Fb#8&$kR$*4i$+S{y9nlA^_R%p>=nvT>WJGb1(`ld=?dY z|6H=a;_03Aiw$Z{(+3v@en@XRb!tn$pIK^3zDr`g6Z4si<;LNi>Hb$0feIHQ)rw6H z>r48wo2rLj&6jnUdOESDsN(KH)`!$e*Qrewwy1As&K%t8w;3JW^LGtc ztX?}R3wM@Ggt|RS;s(OXi|$9ASK=CzV~G4U?4P4-R=-?kr-xX(u|dlmgKZhSPB_9^ z11wvX&(z(N-`Pv3zjq(?+$(|LUpG|$Fx*0PkN1rLYKlnI8EtiJW+N4A9))PwM$J;RM)S`1%3S*jefb~{P!pa@79;{sdC#v?SXNb{p3@TptjX9F6IlG9wTf6W#!{z zS^ggzDlg5&MX9*T+t&TLYc`(8Jowh*-N+1PeXXOs|3d4o^tlH9G|73+mL*TK|CHly zmhN%rUweUGnk_8_vZCJ0PiT&I#$5W!9ga=vy2JX%t0!y~4!^8GXR>9FQ@Td+vzYq0`4^vL zy+-s>f7=>2lCxX~9X9D!ey&0wG%;Xl9C$S22p`6u>5+k!Ldy}bj&z=Yd- zp7;^jp$8Z4ovXiB;>TF?==@dVtZ^9@SLlXeO-<4D=WL!Kfx8!bjkFk>w0ur9Q=)?N ziwATf{ygYXE4H=jUFi%IMt!$2zqY(Qm&v!%8sdce?IS{buU`2hJ8}+{`Jeix;^7rV zFQW>JUg=n5LWGn>PTWdOML|2;%Z^u{F}|*idDa1LVtZ!4@HKIfcx`Czmtp1SzglI5 zBwKHU*eeP3JczFU^&#U)Bz|$C@0@(1^Z8PuVCl)9Z<~e<&sN!vsRTciRrNJHAANTb zCcYil-zo4oR#df@*J3W|$VP~|ZMK>5jQ`f}#5mtMwa1&eM*6?Ve%;Ah!5(kyci|3%qSMOdw@0*EZf0_-@c;$w zA?GLW|E?C;NGQPIQ7gzD3jwA4P{LOBZ6(;n4x-jXgB!l?3n6i9edeKc-FHa^iN%Mf z8YVY`2eua-kNe|X)nm2=EXOR^1SIr9A!PbeF_TUboo=>(-67=?KQ|_DXJA$6G zc<*hF3x=ol&EVoWrC49H#FZN(l#CnUGWWA1>^jfZu_%f8Kg>AwY;3Ye=W;4o$k@5)X&DG}fBw2!>qj<^p~XjgvGqgL%$mu!h@k}om&)+o2jt@J#xX)S#P zU+vst;XdVBYqLfZ>|ev|*&@?6)d)4J8v;oEAqp0tD-Hhih< zJ*RzjR)*DS#@4_!$Tv0_vZv;i&Y3~&{aY&*vuptZ81d3luOOKab74ePCiH^!$ePXZ3+`70~wUzRV) z*S{wa0pGW|nfFxn_8Cr*^Tgc!B8BR$HDOzCF>`0sA`KeJ>eia7_Y$6T6?(ut4BzFn z4Rax9+m&tRBE6pPU)a#JH72N%sV(XH}J~V8$11`9F?&W zIu@n2J@z^C`AUbdY8{wuX@ z=u=3Q;rH1NXhgh{^5$N=-V_ab`OgSlKeeJ1)-bT!w!AA$y#eD7Tbp!`rv%1cMhE`JNrO1@`uXp*BHew2fr(eZlMBn(8e9g8&n zaC>!2{@Cr=(IXZ9c6R$JgRT6;%iYz|mqKiVy7i8eK2%uRKh?kAWcF)W_;k+BCvI(Qo!n~JJ*cr9ODOBapN_1}Q@=CT%vbZ| zj=aZ^3h&nXf4OyhhbijU)!zbArNc(_)K>Xe7 z$n;* z0iD$}?J^eS0AH6GZyn1t7eLMc)k}lYt?7!lZUnkWd7ti2+aLu_BJnftKs?SGV zG#y2Q2b?n&hKza}ox*zniFBm{u~)6_wSBbE0+coBY>Yq>Y|bPsZ8rrXKES+#01x3;#;o`#oTDWiA+Pfs)7bY^$+mN?){f*i9Y;|5t<5gi;aNbcZBlO=5KWaJ_X0xh!{3^w&KL`_&C@vK z(kloeM|^>$E)spem`!PZ9b$eYQv#P~`h9S;G!KM?cNTZcjNLi3$q2bLGXirIg^Mnq z!02U)O)7$6X?g|B(gZ{?_9_rTXB74bb`hXxstSE4@O!2`2c+nR8b5Pa(~DIRp%@rd zNQYU1EDPwmYoutwrM%huQ(@E_lMq>&2VJlm17{i8_GZmWJ5|8WRRGS`(iL>A>KI5}j;Nwx-x8+bmk1ePU_Ko_er7$Qy4=hQSiGl8`@)rn>f#M4DI z`lzCU94@M2>^?{X6pZRcHKen4r?6lH3en7#sqO_ZMe2_X;AKMbnbw|WP^U>w zGMdx;0pu;=%f}csw7@wZ1u=Pgyi&~)&I`n(NSQ||*1XD3%j2|*}V3`241A;5AV zYJ>?Z{di$BK@g%%iU#+CAlVT_Jh2kQ9!fI#*d#tH)xt-^5*JT{IJ2mb-2i<$|5Vm9 zB!y2^{F$nNI3|(+n@vMebDy_-pF*A|BRMhe0F5pte(js04@k|6uyvUfv5FSV3Q|0fgE9Hk{|%W7z>^r^XY6JyR0VqO;%&J!NB7SunKWG>bHWw-}dCL(> z$T*3TFq!|Dpz;ALOGVNd<9zO4#xfHmX0Z*WqxK8`U85MHB@7VOWUUy!97-;YhYoM) zqq&(dIg)+oV(vQG+l&)rLpi1w#0g0_Nr z&LlTs%Ah~B7o-_j7#R;&0lgM@KaCroROs~#KgEg6jA0YvEVTN%HVB|$-M2Kensu@QpCKBwMNFX|w|NCLxj z&ufg9xDB!+UGjiSk8fC3l0BE=^D^ZYr zO*n4IYzZS+i!lVW?9W#2FZ-jV7RXQn|27##)du)9ih6g_RozkQ-W;_lQUKfS`0x|g zOu2$ncmN}NQ!KNAzGYf00XdthQnmyA2>_f1NEOmQ$`ENeP`+w-4KzOtjzrMZ{VQ^j zfIo&)%I=VPs+L>|%m=v&jv}OJ=foD--kG5f)B^^PL(0ZXKR9>rJfhgp`4W&%`|b*H zVk6P4N$knEBlwMDG%Nw-nUajNrXAp8{RENirt-C^Yk=05GZgcHQB~d-rjoTOA!zm_ zq<}%@sdSN2gd@cQP)&T3kM;1JF$uax;ndHpw@J z!xOVZwI04Hf1Mg7mokQCFk%Q2dZn9{Dk_)KOH)l?5->{d!m6QV`*E#k!6c-Y$^FFy z3qdx!G6r#s6+s}0BN^AN7~q5!IF+IV@E2kJI-QK5`4zCuVJm5%5j$eFa-ARYLV2Bey_Lm` zMj5cg)2u)No;mXktM6kJoNfoOwZvtriThCwLB$50r+5NHNjrQl4;tYkC5q3bg$*Cx zxW+aOMUnVpV1cD$GP9cQ(9sj1jp3j}5;&B!)Q^bK-fUege8UGq?~Oa4;y5UvNN3kG z?$cFeX7`a_O_`wKuP_T3nZHh3CWv;Uyv`0O{X7LQh^B;je{uYUK>~UQEPDpIS*b`s zTq6#%lm?@DQ4c~|Bx4w&$gcq*jc>u@Evf%7>)#9mHddlO}R7)H^!-yQF{Iy1g;!%1Fd2B5Y{C@=jg{)QdvP;WV+HGW7Hw?$w%SQR)7TreDv^Dn!*Q6Jk4hkwgFP^FOLPJCI0jzqLO;G12E4LLn}TY zvBwC_f~>Nb+bLVXjv`qATpCAgAv~d2bE-6*buc-12dPaonPlA{9-qlgo{v8ZIt>`r zgU&77W8IUI!HJjk*6w0XPVqA~>q$8!m$HTCtu7rK%991e=;Fb+c{IzD15ppb(A0fz zq1Ci#ntH%*_yX%RQ!@=R$r45u3fQw)hli%cgG0*u@J9K2gd2 zNMbUJ0J%)u2l!f!Ztr8O@=%KauPDBRB0)RIZQTFIIk`kX&>4|7%6^B*LFdaD#wnhl zVDh~>e5A$EPD+RYRcD7bN6Q_i^Gxwu;;*9_k5~_r%zM&KIzztEG!8fh_aD6S`44=4 zqB9b-8KjcZHKAgOP|%I3cd>7flFv4?zZWcEXLE+`(<(vnswuZ7YRKUtK`)9`=qSxJ zf=!sPb+H;_j?<&YT4W0#JCxCXOg?v}M7Zw>(>nsoHrblGGYlB(3cNQpdO&GLBaG4- z%0@SCM1!W108fH|tZj^*Q)LfLxsjLR0G#S#52Jv7J^&DE;(u|LEf^0)3nwv_m^>ef zoy%j>1x|D!Buud?0YiDrb2tw`Vwh?%B{vD+W?e408x~hOLJpA6bR=G#V{Fgz^I9Io|eNWQIKddg&;PIJ5H53 zwkk|bx>YMK)` z6QC1(b&M2a_oF1l2o{4-(>Y*2VpuwSx&b}({_mP82>VO_EX_W^b|Ca5p-+b$>#fnB zauTdi(Ak85k&s;`jX4zJXkK7BL*H= zdhz++T0{Zs?_<-cSl9=Lhsfln2b)dHg;v(AX;)4cnh=EiJ2=Esl8ImLQn+iVP=Kq0H5Ak9Gbu+#z|QawrYKUy>0W~Ran8OflMJ%t zShS%5>v39+8ijkGgr{EX;0?vf`rsQW+^>nQKk?QiO|%5~DA!)D2>_zQri}SU8zTIr z`((^eIR#UiX?k?A10Fw1!ACK&w|h8@nIjWi()e;P#~3)(FNW0<^Se1#pbMUpW<-}Og3aMdNTYzl zs*b<&GoD8zH8gt>+zT&3YM=?l@Jub)hSJV_Abv!PyF-m}Fq%+6q4udp21knC2jWGv zT7pOtyS0h0(IUe(7DYVaj+mfOfRhI>zf*#boDo4ZXE};2H3%(m5Q~|;r6(#wHql`X z2VCgl)9@kFePs%_A}wH&Lx4O0AS~U_eNDOQBT|GiPBEt;om*B2Z)vIwC73WuBA_kU zEOH&jfn_WL=VOEBr5dTWB_EtB?9O1E;zgDM6tbohoqe@d**0+51fe$a4YZa!TRS*& z!naP*-k=#0IN8x`;5mtXs&T0Aocxs2G1{W+E|Z9FR0RE00-G{ck?PvPwVt-*^Q9Q9 z8j55deu&r#Rt?iyJksJ8>HJIbE|3_*dBirl^J10M_^%?95Xoun-h;Meq(piy`8ry} z0Mg_Wd2*EvMy3IhlN=?f4a6O4Xbi7ss@SV^X&KTX}J7=BNz*rWUD!yHcuoZD%Oz-1j)BL-=@TmqvJJfEaZ z+Xoc?38tFj%M~AOXSfIz3vlTmji6rXVIZR|0Za(Di@VrEDmD*ux(MM9B7`jgzMg7M zOQtCawxfPC!%R^LOx=v_q*2vCzDNd91Qd{_3mGssP|^}VQ}n5vlT3#Mu|doo>Nl`+ z1?|E2kVRAjjei+AGj61A0g^gggDDo^WiS|^q-M_+ry6=oi?a5f5&nc0P7v>g_oPav~K}sCY50dW%@>w)fxi^Cmi&t6=m7mUM09B#nz(7P| za0J;dxDnzQ>V+?)`oyqBx%a*Hj&_FjnsTwwZh>V8QBLopMa6K6<0rh|o_(u-i$u%A zDHK7xFcRc9fPakG3sFm9k}&-Qg18J~Pa+AHjB)aQtM`iyyeXV$5n_ovK|LSC;F-#` zAvNpGRtrWQA@D*l5=0L`?m#SE!lWCUNR<;z8>Nn-l@plju@V$0Ale1FijqdC@FVI9g7`oZCiPki6IpgI+R~K|xQkOJe5QOhE2yeE$ZnQ) zau}_FK%sqEByejH*}$s7_0i(d@B{87)DU?^H4yrnIl^1M7W15XP6s)N@1r@=4G-Wi z-blFVApW2^62y`aJH#-WO$^Iy%1!et0;Kx9v{nM!9*tKAri>S%<^P-fBeY7I82Ao?LE>m@7z6Qx}G~sn=#Qak^c$P7TF>w}1(qS<|$P&$I2_1;~bbadC7_KAu^W0vEytK%?)U!IU zdi*!)1mHwhS)I;K_J*v&@MIX3X_CE?BtSjg!5)gyry0c{Jh8teUSy|XsWEgxcXn-} z7+?W9mGmXr9KkO0G`qTwlQT1nY;z@5oq7k&H_e73-T_o5JMnRlZOlB)o{n&5(58gZ zTm?LXG2qb|3<9qW( z1TB-moPDGpopi%(;N!W zj9XHoFf3Yf8iArH4tGC}f^wva)0q;Gq1ZWc;c&6+5iM~Trl}*QoU%f#1UL@_UZAe{ z6J_Mcu^>5!95FPIHyIP9b;K{Bg+cuQD@{5;@sFo7BaHZ)z&D6%AZG*rb+Or9YB58z z7BTn}%|OOOS(|)6_nq+(@%&E^f^g&1Ir1IVM$4}$J0vzVcLIwt_8%tyI}n*tq;UWB zk(gxF1xJ)&E>)i@f5HBvK7nZ)uYn-vQ}+SY0}=i&a$ev)vPTou3G@7WCTJ#m8lpq6 z9&{pVAgqHcvQxMIUw>48fN7PG9Vhh4+pye6zX&2g82|*kIObVCx)J#IX!9UTi%%nm zNc6RqCA2Dn`1s!}_28YnD|0!OouTq_l&_#pAv|&0_X(IpDyv|c3Iz$Ut|pvbc#5J&U?bGz*X?1cpC}X93QAX?GBp9 z0J2tTBTKw{1q%l`iD@>KxzbL#6m}VRhsGbnvJE7zfg2`7Pmvb zc_sZXH4fBSX7!=+V}y_nPkq`x)uCYb;wN2E=0miMJNq2A1nf&Q{%3^q@af}Q)fpi0z4Q{}3oU-gsLtP-rf^9msdnIK#m>?SS&x2FT5G;V~;7Ve)KKni5 zLC8NblPZ%iLe634C_kI=;4{sB12;SPlb~Vb&?Tz*Pdpq%4fFewK7HCen(sik7*v{( z*e@1n)=i2oTG|~JO}q+lBaBOQQd-f7BDM*VgwMg!MX3uE7qsC4Qxa^5d|M@NkN}A* zWmuwE0lcedNUV?_c^%-;;myG^2IC_@5oKLHF#E(Q3jId4?O;h_jV2xfdZ%`|Ls)pd z^%F!vmIhn@fAg1($-+8Jd(^9F`2%ou&B^Bg_a%hD@{0B!T@-XX#J{S$C-+?Q@NlXu zz_J>vmdFK;9^RPz!6G0?68eu{&UZkMnDjmLPN|8^LghgLqn*-0DdS3r5MqnHmBRS$%FvT+)!1Xwb2X%HQW^%Pl} z)#TdiFTKO?N-_>Ce?`lVoL7uS3=;Sts-)ny;fOd#YLX70a@seL?j#Bl4I_m`k=Oq@ zZgZMa!Exeu6gy~jSwIq{%z6Joc0tEUH$l^a4+0l!8M6)`H<-oZ&1YSM4AB%EV~}J z;OwX@F@i_TPmNz(#)uX{ok)oQN-zN4*Bh8Pal3gbrf6nfepfwVByP0<=J>E3a zE@&Hh4CHsXjIm`R0_<@l@FgLvNpH>Nj#XKmhz&lK<{4f({DEkN1hymwu&pw@Ex5=u z3zbN>qn_$ut;fWJig&cr!Q6YsI6*ix4Nr?KID}0>CJ{@d0YD>bUuvF_t_rdWd82Ip z=9H|CP<^@=#f@;lHo|WNF4L6wjFi00FGCrDO^RdkFIoA002(6{b*z4bRRPy zvSdC$CoAzuOzPPVVR8KOP~Lg8o;y=JS;Bj=`AZD}(nj7zD}s&TBU}{I9_=q$a~htE z{XO&kpeL$u^jyYNq>JQ#K(<-1aM2?#TGqfR~U2ur{qr(fP1d(Fg_Jmw70jZ4B zrwJ7tSpN|S1`n2)7xOe6jz25Zjfkcg`%EN%mcR{>P*fGw?YRXX9d;x3e9&*PTgGEI z(|Ev<=PFJSn=R+SAXQntQuS#!3g{Bw1y2Jv>5>L0o>{Vz97Pk5EjaKR5zj>PyMrID z0~_<~$8dd_Deh5k70|Mu(dGr+sYo}Qaq2z|1*%bctF#_X46T#E83>9L(*#)zIPuT_ z`GkaI2oV@(VJ>tXcSsND2YWd}GImUii`etQ#UyZP`u+NC5dtp<{$v7IXo|nj?B$RQ zEGflXcR3VkqLNaE&mB2m)XyBp$5?zUE_&GOUqb^tz zf$uU%E^LCv_hK-@?##*QAD^QIs?p2`;xbt>gJs|eH>j}zBBPHAkRAkaBZM36WQRnQ z@V7^k0wezdvo-Pd&5#TaDl1**K=g?HZ*RNwJ%VupXB(-K#tn)lO8@eSb*dOzlo#X* zE(7G%sc+n`$)r52HKi30i9z~V23vHA#8Gc`h^}Lw%C<^xV^6y?_oPjD|5|8!d-e)e z1;plmSx-&CZyEULC%}tST5vny|-h_-4p+$fTm$3dRToX)|sEdXjK#rh)1@0!7fmKvU zlNWrgc#}f{bk0E_xuMoxw@N#b@idJN7IBOif4ek4MF!08%tQwbst>RpKxLwA*2@r; zWC1D+oF|Sb_wh&0Oe?f=9jxm(T3<%c1qu#O3~)Q!3CcO>;?Wy5MKXGuXw(9a>NCpxuK8;AmdE}fZ zF=6Xw&m{uc3w)F8bGSWgNQzvMNz4y97pUv^y_<{?ThuREC#V|(EIk${!Q>AEN z(mtPi8GIr_yxrsA==wZC_4kJgXrNXz$ z@z)@K_1AFUX&vh(B`2%?$5N@6l69RXSErG>r*GVA`mofpe_qeW{G`r#AB`3LC#T+EA{jKHM5w z>-3*r`rg$Z(>R%L_t@Pg>&}}uGtjZ{ZhgDjOP-R;&~G!*x$V-%n~y)RXYI_su4rUG z3%m_|jVqDU*uMB>0w*K>HK@U{jVl=;QM@keWRrS6>q_$S$o-Fw;fY$-cI-`GtNTVX zT$+Vz7Jp~(WOv(MxO=*)$w1?Vt-aifh##Ae>=L2ZZhdmDsQz>|%B{7CtouoM$f_X4 zX}{_1CFObcG=7JO-CC|}VVsEO->bjAP|aVy%@M8QvrT(pc{3Rw?AL!qjbGx=;Nba7 zZ2h$^mkKXGRG*<6xzz)RBsspnRe_B~g8FTjCgTDP4PzIlI&RK}-SnO{;4!bVz3BVW z*2=K!xgEk>Pe0o#th(~Gm#5*C2M<>3A2cl!+D5E-_ohDH_Xw{1`z|xP>*D=q zz8NR1tE-Je^l$o}6IN4t)P#$(Q{o$49*soYvydvYIOR;WZ#B^>nMu{N^B?=nbuL`$ z>B9WW(BHllQsibFV*L_R#l9W$9~+HFfF=`XQ{&3dUMIiXT?&!M&BZre0AGT&-)5pJtRM<;C56M@yvcP;fS%trY3ly4= zvwa*KR{f~K)h60H`}>ub|7}m28lKKmTuArr?o-xm6#2Ps=cRk%^q0E7Gl|fL>z=`i zGt0r9uA~Xmrg=lRm#ug|Hw6Lp5yA`U&Hc(xu!T0xwZ*qBH!io-KM|WOslHS_Z*tx> zzUJ$RH)&RfUoof5rY>sVyOU6pU6D}#s!^|C=+YAT;=>ei3}5i2EgiMG9@+6GdAo$K zGU2vQ3#Sx|3(c2KCw{Hw*VlHaUGc9|LCFbNzRz8Jgq z%T~Vdk;&04%o+}W%D+MC;jYEqmHcYnRx`Pdc9wJ6M;Av~WFY?ip`{zR@& zX7EQ!cwkVb-u=wkQCBkG{^z4(7c3{>-~#SE`nVjuln>lOmTlv&h zLFTsBZjY?nK*hxz_pqEOui6j+i;)YSb_zD9Bfo}!boEOKM{7OQ)o}Y+vuzP`&ct)M zPM9mH!QoC&CN!q}$wPbA?+=}x-;eW83@oe`vgEr~(P@%(%T(9xqk@lFIQDL6t)B(V z=2g(H{bLQ@2ElBd#v6qHK2FXrjZpE*M|Llm?nN?tHukJvu__Y0EAe6ezN~rL+n`R@ zu-6%CHvax69t0O!Bh$luOC8KII=272=l&JZdi}(=bCstyWw>723+vwV%+H8%|F~V* zwvc(NAtM9(QT&|mg*F=`$2)n&fnnOR`t><*q$>a!Ryzv~_C=`dihVx$*GR5BD3{ z%crghy6y1xJ%9;wKTCb!(DUc(rFRV$!2L_##}tBsgf`?uzZu`td^^lj-SK1QUC4U2 zi0xxU#iaw|#8aI0bBbTxFWwe6{_Zz;>pP_>v3%pv zmFE}IQC~FU0(V(ZVRDY)pYgxz9D*P>s+jatufCu3f@U#QRmNHJ72T`;#_S{Zv=thj zc9yZ`KM~u_kJ|UPEO&@{x6UcZ`c#Gw7w3I?-#s!uGTV?1wSPY7%4fE6)d?YMb#FFN zgU71igsrjU?>DzO>`j@M<$uB^`1`)@!KzL|Da)f~=d3z#_9K^nJu#CBIu}{KdG5b- z%l8@$?7wEK>?#^w>oq6q7EW~;Im{Mmc3vkj);Y@}Z%9OjEM5`DCzQja!`R$1Agzf- zI;`nGA4Irb8z_83S`PN(zxmQjgrBaw5f*Oiteuol3fHZ+vms0VUV$4V4?I;=7|ZRe zy;vn)TxI`1($4a!tu9*QZ%a#CC{Uod6nEF6En3_m5Zoal(Be+<;t~P`cMVQ(DHPWN z2~KD!8mwrG_HzG(JNLtxHEZ_F`Et&lS$jR}**~*?_8W@!MbY>zR|~|!pXt>RQ^^<3 zLrFY4RF7l&=hMNfZNI+TsOhzP{8R*f@z{KgR?P1wz@`@BoH{ zE(X-|^cE8PFq=Q>n(p}R_oP6nQl zx67%SrWslSYKsCU9hpn@*)e6l2@{AT%he(LfTk@Tc>uj4Gpqn?n4^gPeRx>7UX>~? zR>evNm^gM(4#*H2xV4ze=YHB-Vx5Y|^w-NuE)3Ry`7S>b{}476%&ZsXlu`Nc`5pivQU@<;h;kd<3EpKcnr zE{kS_4K=Xz>Hlfr2D6MoydMnvxJOwF#Uw+Cqq8$AC7e{O_)Tr_i zl_6PU3xW7-BbXTZ@Ae4FKO@6R7sAL6+QJwtOEbJM;3I7N)PVP=LU+$hB6qr$bB=1@ zku#^kla0@JD?APK8SQY0ma1tvh%^es1&C~)<7(7*V zN*f#QTJ-*Cn9|tI1NxpUt%ven=Bz1-wlnyZ<0)Bv7Jhr0f1zgQ3?Ka|MfhESspFb;wG`W&$vtZ3NBXoem9?H z>}B+L_$5Tk>NI?yJH0dOt?&FYWowQ8Hu2fne_Rx!M0q2!6zTMX|A`ywz|zvOV~azV zL(N$q1o(*p6|C`Jta`91YFV#|_aO7?r`;wEIji+X19T+?lB<`qYGeVbW88%_vg&Lv zRTHNSZvfR)@YvXl_kK<-0K>0&yU$@g)^K{_Nw_{cX$BGV%H>|(!zE>n^^sq$MOZ!- z-`5-aDUkG2C`)e;JZ3#jb75`}u+k_Ir`!~Y(TOT;4?8!x^&|5$;@U%2hMHNhoBh@g z(7sZR)ix*$V!3}Q^7q4%x{87x#KqEa`N=5ZCtJWx%XMhAqTyNvx`#)|4mQDLV_0WG zbM-TF{F>p_vlEvsF^$VLj6eU^R&fVWGp;e{&O^lDZ9>{^dqxQk>TfE`G?Y08wF6;3j~Z zCDVjYLIiN)pXjmuMcQ_gZ>eP5Doh5Fh5W*Hd3yy1a=B$0-!(Fbx=>H#nmXF)f6LOy z$(-D*N)_zJb3ZWVZf2Iek-{c?)%!;;A+%qn_P=HF4YY0psOSpDmloEMW-PZ|!Sjo} zR!?^x82%RRX#QXSUvD`)`WCxEtx)WNL;VS;s^OVL4+*ZO{Sge;LjFZoYo3-dv!kPqgKfbU==8PMqQB=(e7FeW6{6XZI z#_!2+B_uRndS3`r8*vLWSATaC4l1)F&QGM-DUp0c!G|K9tDbDs^hJ(ze;Rl$6~g<; z_WtFCgI_+sL)t_z0Zqy$t35$!qI?JvsZJ8|n)FO`lRTg3ha?*7Ybh`Cb1dmn5 z$06Xtxtq^9JC}Y-?>v;c5cM7t4N55^k*Wj{c;Y&??$UcnN8wLQO4Ow8+4j@Mg1ne1 z@W66fB_L-qM;vOz6aTblc-;mE-K}>mPJJX{G)^{j2HojWUgt zH{K9;ubO2`gMEW1bI>|n8eB=qz@=p#I#=9MyU#sxeh`CJPVr` z0(4v>W<30XUk5Yn#@xd100asXYOU{p_H1(I}9@j`NYuK;choN>959-0+187=Y9T_(^9LTXC+JB!9?9MRNBX=quz&CrT zZ{*Z=4qhtR8^9S&ufF#<|WkTp}( zd#CyZ@r#<>e|Ao({5gO!!GT(*9`*Ii)>X7zx@Fmp4{k5qfY}l=*4^#JJ=$5Ou4=~v zV`9YQ)|s~pQ}3^9E9>@*?|rw$nTWGlB5mpz_wYWL8N^LVmZQamJ?l4D{jbdKsAUff&cmCd9k8( zSM`P~Y4dbb)lkD>Vx;_bTXh)9SuS;)(^@QfH+*dnYNO-b+j(Ny8+-Wu*b0vRa(LZ& z8j-pPm)nZ*J7bz9h{)+}fp>FCAXm_fcCm0-sP8S~*?Z-bCZW?_Vt6JaReV8Fm2o$3 zK`}Fn+0L;wovd`eCVVw_`ohS3OFF3IpZ=e4`{ZV=`KT@P+F0ltvFeE|)*FU}a|#b< zw`pS?PJZK8ySXUWi5cEd?81OCWFTld%Bg?o=n-BEfojg?xdVg#pEw_TXU#h&w~RN9 z>Rgm3DHTGqajv-8V!Z2C|Go8az)1l1f)Vp^Te-PjAbm|0#st5`eD^tG+VXi1nS_gu z=HoWzPX=i($3yO|N}D{s8nktszUwlAMNBRVkrP$hyeWT!UdPb61Gr16Y^RZ|}g&2frq8Jmx9#{SH! ztHbnWQpFpDH43g(eoLW9sdiB8vL5`omU6ZeKrItcAoeL@BX}P1b;R>Oc^s`J_2cu7 z-@B6Dmj~}Z)nmoxc`0#mL85QxHBAT-F9g^6QQIyiHKmb(n>UM;qUQ}fA(Bt8Mmas% zt*4yBueN#f#BS;Uqer^UVC5Oi?WlllgqCp7(@q;y*}-ofMffz zs<*r`?O(rW(Y5{{Qmbk0{#2feiV`R?xYLF-w3yMpbzsomG66>1pQjs>8|7V6kL zRH&s(DDc(&hVbqNyErp92fwh0sFKVq@s&#wu|K-luv>l0j$8>)?~D5Tf>dqBJH;yE zvXb*yBiqQm`%F|wgg<=}b<5X@0&h5Ye>oZQmi*6-+Ocu|W!A;tW!L8F1@+YB%PtFW z^xIGe^S<1odglB0s&E@8*H+auteDml61o6I*3_Kk3GT{`VBeqf+RhE?<&E^OYlXuV z_khmMo;qqh3*!YAz<7FyU776fV83Hls&E3yKIts>=0ZtbHq|a#VfW1#SD5{Q@x`Ag z14FjC5@;1+b)=6#`U59az>YX{BC8FckxfqigCL(a1=&* z&eLRS=T<5CGf6k=zW2sU=l1rtI^S&+7ur8)?%kNbbC?8`pvfK@FcDY*2lKvOYtNaSDgjzP32^^yG-4V&2c2EpxA})2557 zsc3qd>RqKtC8~x$kxqX1ZCzQvVgE;A|51q-IGC(k3S=HyRK$k--M-d9#>ZznL>YM> z(~1UJwpu*jH-b0-k?;XCV}P#hqvAA%FS8m7xbK+QgSV&MN|x6l(QII6=Az3l2Qf%9 zlgTFrOyAB;nwUt?mT6TL#>oQHd2};%<(7Ih&tHB?`zsinJI*!yj7STvS4dS`X8#4K z`A6#A#__!kZ@$F)IvO=RwI_clT5D@}Yum1zC4(B5RD=CJyi4dFH+5?AXC+cHGQqa( zl&|zf5jLErTiwwwlGUIcT7;FwuV;BPGCkk9(A2QfKoD`gu~#{m`qInT69;N18Og5- zr8#*ttflJM+Xk77W-U$C%$!og7P;yXxyNWQ#lo0#E52wdcs+ zT=0^4;a8G)N?14~Hq~;&hlfN_+q&E*2(FF-x_xiPeJ8I8W@ym_m(H^@OL49b*03cJ zzOkqzsE|?FsJh<&jjW!Tpi&Q1I~soeoz8PZsYB3S$k+)hV= zwe)IQ3pKt~Qhe5n@BY$ciq`*w-(LtjW|EJT#k&@C?iB2cUxDFo`piYL@OV0F>mR}` zWO*g1JJ;*N9t^(fN^DYv2DV>(ABgEe#UBhO=*z=pbfhrI)-@H4e~r$9fo-?5xeoVu zlEQsN!n{=*W7!bhJ|fNJzvMz>Rni;Ut6F*SUtKj`xX*tfHVhchS5jpmFht<%;hNqaPr*_=N^xx72u@0~RBiaIngdTIT@Nx)Kwi-XAgG@J*J$-Ynan(tc;H0}F=J2ZPO!qmcJ0J#apVpNA&eudGT zeU8ZR$!bnjoM7Wa*XMX7lpq(<9sH-ukI5Lofu2BAn`lafG1-zTy(@8X3E~S=h}%oU zS{W1vUFLdMWtB2sgd|TG%%Shi{5|A4+}cQTD1OkLGQVY0^dkv1q2FRXRfiM^@)MUU zmV6L9a%-AW_VH{o|MxK@`{LzT7p%?xWmQBDhLwNt-43K+2i-n$e?{km*fw}p4q}Zk zW^Ix-C2$~q9?{CHfT3ASlxzF8BCzR|a!A2Q)2%Q^S~12}_DM|p3cokS0d73&2%aD9 zs=Sg~JlaXZ_bU#089iH~ZLT;S@HEyP#6Yv0?ee;XSM;4>#^*)-I~n(gTem;A&)#YD zrrj&I}Lw5pXP5_+AY@QdO{V=fT0=>#kEPbWV|tW~0`R*1{90v6W!*Q)(VYu8!!?yTFDF?=Y=>M7 z0k7NEa!k>IGoXObM}=Qh4tyP#MJyS0L86x_$aaWH6M4O?mwW?l^$3|k>o@(1ywG3< z<=O*w%~|)Ar0?@ydiGM@i1g+5!OP1&1g-GtpYjJe!_Hw=;r`OQ!rODCM*BJ~sMQP? zO1C@e(6NVWK;p3zn`nGEdExa8AgBTZ)BIcW5eIc{kess|vgp=Btu{x@N=?1)tJ@A; zty3gLw;CPA6O?>_t49YY>wTkVPdma@9Zt&C8H>?4k4sHD47%uYI){*+AuXmY4xanE zo(%`LE4eBD0`Neoq}_1*&cm|2l5n33~4uY?@%Ecqbzqry5?6;iYkV-LC>d7b+xm42*t2uHpYh61X;zbu`w-aRX?r>H%Bjt zcD9>(5#L5n4ur27ZzzK5=WDW=+d~u*|0&+`QRGAnF82l;!N*kI1gW>Ih@`Le(R#FE zFk58hihzZc#sz-MmV-l?lJ1uMS_MBfhm?_Ag(eh+3Ya-~3-MLF7?0j0ZV05I*WF%b z?mU)#a)=+DW^TkP$Auh=U;Q zlyZ*xQj#Tk^G7Nf4P1vYvRCVC%;Ep>51(g+yLgFO>(kuj?aj#)|30Im`&88hf4@6g zd|=et?#T|-l>;b#M~W~R8?hUc5hKjx>dd!3rYvlx*J&8R{Ms26o|xXC51qYff$VdA z$uzv@Pd!0!eQK*UWnH2L@WdlR+lCca8GG~>Kh2oR>*5Ba?}?5E1YXrTNruW&9YDV& zLYaU*ywJ>bUTkRh$ToKRa6m@uMdoDS;*qp^R*(g5INMiiC+(~7e8*q`*wa=$X6Mc& z^LZ(Q&_8Qe?p&}SI5ttA@krTc{aw7uZ%uEEtXjf3<%U6-T9EGmr7lLC-%QS&0Dz_s z9+9q{ndSJWI`n#`JMwfQ7s>5-wR;K}DRO>SCySl)ya2K0Np3)lzo0X@ zHD=AgHxvrTL2e2j=-vIS1?ip056DaBYUvP*t_rxV#S4bLt_Tby1$TM z*eBTqeXUVzSb_ApgMK4adiN50qY%E{*BxxpLK~~Vr6@BvQQ+s7Br6p0OW{}~RkpeJi=`)!{H8=?)54#5)~`iMjGbAXtW4M+w^w~i ztwIQZSS8n1b~BPyy3J6omHYZ2h3{#W9CGS- zX_oKR>xb{Fr>RW8Z4Z89=!}?66zm5g#Vw~q7Sy+FRQ{-u#txBRZ4T znGq-|>|e%Cv*r3p;=h$|Eeh)!dmjz$q%{)$UFJV2wV!Xd-9KVw zDFJxAlcNLDQZj(y`_@}kcI_Q&8s5&+qbL(@X7OFiMmvt779+aUxfURGYC|qzVUH`w z#W5zzYO7y)U*a{GrmaxIRY6-rzE@r5=>;a_8420=Jo?X8dx1$w z$zRfDDBidolClAl?6J);&>nrdFL>%Ip|_UnQhNldwU{^K1y^~2N==q^pe_}ApbC?D zohCC^?k^xu&%puD?;VryIb-J!;hH=Lfz|uShwolB5@jN)KqAthp5EMi(na=n$s)hb z!S}$ot3e36Ly3R5lbD#ST0tQi;H{9G3x~K^?bsJlc!Fz8mQQVXlp#CzS zHVHU9`Kw_j9&XvAzmzdzu=o0IG!L7aA=F>r)S$Jbc92SHKI?qc+w$TL=eRW(9{BGo z#j<)jLS*;Emvwj_x3Y@kxu;_BI^!FMFMypxrPmkNDx%w9mr42oxp*U~dMi0$QsKT| zrD{2b%_P5F5IA$?!yFeLav)_x{{r5foDF6Hj){i*IFwMsam>7Mz`@M&$k}|6lIEo8 z-*-CC4in7dW+Wc!FK+&78u2bmNu9&Po)N-wgvKF}nATH?`D&r?_$_n_*YFUC$z*B) z<=9SHW8UlRU^8qZD28QvSy!)U=&gd%c~cWA9Uh!PE+>155_|Iu?cS~Tj(*=`1;@2y zHfde;_Iq^7vxoS;$ngbB}> z5BN7@c$a6U-Z| zy)4UOwHI*tU$8nSCuEhC8T=D;2z3mXMlli4{B7TGMT&svpeg)s(KW1S@H2O#eZA4S zYp^Dt|GDEA1G-eheYZ%L_Q(Wyp0kraZ#uApS*%BDmRMJ;O1K#J)F9eZ6v(eda#M3) z#!V;ovQr^VRHu`;%jBKmFClT0_bIW^&RR{xY^}=JOx)4E0V8yJET>l;=%JpID{{I3 zp%RvYsLae1-mqK~{QNqZNnAaiZ5|6WF;bs=m=g%BDp;YbvlX`vqveP48n_k)V^I|& zPZ=z%pA{uEw}2ZyTI1tOy?3#9AnggwrE`ct7g{4DQo3}Evdhuexl{zxS!8trbMeiO zG%tqyPJjrQ(QyaZ;E+H%Ewls~(^6PW|SI!7u%K=h0$_9E6e>FvoqKJJgF-$M~{`X3^S(N;#iwc8w zB4weu31i}UxjTp=q)lJ!;V`;7PjsTzxr6BIsfG(PL$havsygI(y{EFsiV4#-oo8}n zJ7#9cXNGXSRVsSBoG5f4Ov5STfqEEteg;9+A@wH*+ zG3FMoLp_m4M_GN2WX1Rg_JwWZwtV~EKSn6(5s9&Jp*lEd=DO(W4o1zTgV3%^@EYMr z0GR!9S-tjHbz#gzRK2w2eHktqKo-uXz0O$;_1hRQt6b0K6aMzwzmSj)Q@gMjznl7w z!?JqhUqfsV4VO{GYq*OMIrUXF*cm7CHKaXqkRy$IloHOjXuTBc-vkp(dT5pnN^=)x z2@j9<&xO?P0lV5lmAng3`Bj@-Tw$Hnr&Kjcalj?Qif_H{+VPIN*Y%gV);@&z$BTlZiQmO`9x1QS5iC$KqJs=hu%>RnrW!Q9e8!{JbZ$|AkQ zy#D$3q_LsF?7P?J*LwB`>Ib!BLsev&2HZ?_#wLGaVF{K$EA6hhERc;q6}XG}*P}C{ zS*rtMs=IQ+jYwQb321!KR6e3&7DkR;h=vn)H2j2>yGYhtcjphxD>VqqQjHC4sA}N9 ztP#d6h?l)rG%)o*-#aO?Kovv}Qj>lY_I(_Db!a4LBkm1~D@EB~?^qf2ysAuP;W91! zrjat6jjpP6?G`qM(Nqov!c2$G9gl5z<+E{WBG;se_u?|AH1N4Qbs4564#$!;wf*&T zB(#JS!BXdq+xBpRk2t_N@kGG#g=sUqPaedO(PF4A^5twt9NBOK$0lgBN_FVSMZSBY ze~35@8Zi2E<@u~9bl$MX3q?7lsGJV#uJa7QdHtv0 zPmODLw(z{)G?gRSgPuwv^rd<11hmt2h3U{6FC5dW;#sqCOJw^?>pSrvC06$O(`(4j zaC&tlhdA?v5yfZMChT{;O#pC=)&Y5T7-;?u1dCysUUZ`ZJuwRbZj_>GA=YM^^jWXQ z(@cXvl)Yc{o{6%lX-2)uZi{GS&UbosU<;&EEV)|lOo_&IWV;XNZL`Rn0L*olzG`0= zb)^6!%zp=iCg0*58yc9~{Pc=9*GhH#`zol7~m$J^)?jjEilW z#QZDvsoQpe=>&#W&Nt=2^@q;W3N2@J9u}x6o=+Y$a&$5IRPPsPa z3JpTXj9h)F8*~uc{;cJ3Lk|q;2F2&QU}%Uun}2ys&1gD55ofqui%*U! z4$S20`$6QS`{iav>pxzu#->?d?5gze(}}ZHCFtv}~(yNC6x$3o&6wisDgTDwli6LB@1@7-f1<3FGa0c&c|wOjZQ{=QtPa+M*b`>)2e~4bc_CM z>YpJEb|_g}9ibPDm-42~rA==Gf$YVf`R;(mQo2a$`YZ?BfNL-4{G>CJj0Ar=b72Vh zIdD1Dt^#ZHc(ZMfgJqp7kex!ZHdStyl*SpzgFt+ z+g+MjclYy|C~1dfDR`bdQ#|bcT(z7=Cs^WGtx&{vOmxWO+-+WL*q`q0-B&o9Kj|Md zoS3KlVvm8tlTomK!6jBT>Agnhy7y*KIXu`VkB*%@T!P<>Ri$6)M+9b(<3rvx7t=y=`M#?!-ZOySm=y(W>o>kIpll|b$dN{tGp(4}l>LPp;wYW^tb;b9*7zWSm@ zO#1D<%pVu)npWet0YP;UAs%tvI#n^*RbYo>)F(cvfFSE=M@tdQ{n$UJ76C{hw=GAH zCRXwljdR^X(fX7wPH$86mcQ3=i;v*))9y!J_6AVYN1~D7lnSr6!kNOWl!|k24_3Zv z`8DdwD^8j8rZ}L*ao}4AMM=_U>*TRL+;-dUUxa7j z7|JD7f(P%p9(Zx2+p{Wlp1VcJtfqoPH@d!rxo*y6ea*&|DwVIg=SFkAzT(*RMGJcT z=}@24YOxv(=i%iPT@8Z!#kLV0UG>n<#*PAB|C*$RJ(y`u*ukeTYI`x%Lj}=HA@83J z(Q>LX(&o1~sI;Fh$B$UsFcBHm5sV>mv7-I!HBArRvDIld(crofq2SQ$R{y^5Xv zO{@F6N#JGMC#@o)p$GZlNyj?GOw_r8zp{v?;`p74^4!~^V^9&1rKQc$F5bCwkRez^ z^D)kuwbeRNf<^~0n+FVOlm;F@VY}PDoOj}WWjv7n0sN-?HUVs)rCA3%EmJ*L438B-8!(hA(q7sFRUs`vEsK)%vHT`jp$cT+GQc z+GJqNHEO}Z>#(=Ibv!3_3Do0?_(K-i@p#+6@pnmcw_!Y>YS3Li!_ceoYNB>s^Y>v9 zh}6g{OS>__W7wb)qyy#$co;EmMZC~*HW$@Bh&gxZ^m@Pi)ZS`+e$jpPt$n3Mb?WpJ zmFW+!SG|9wb`Hzx04QIeI45FAg6hiNI@P|LTmOjfr*y3f8cz@8;L6csyYRYu-?)hq zXs$h$bhEH>uzaQYc=Y+!#^;xloIU8H9s|{>9n?b_*`s9M_ja!jpDz8ZCD(Kw1a2WuvTx9#qydlI5AI)2ty4QqDD38tz`Lb!6B5luIowsRf3n8C!y?ZB>>VEi6|LMpb=Qb{H@k>{j&eLjI z#Pi4_!jm^ITmuF0zdf)@G-);u&Ofj*p)Eg}D>yA~S+bN)JuX)({a!@1b`~Yhl4%PC zsbK5g6C6GgXYwe&rICHrEP2!x*bVt%?~~k(8QEN5n|cDDG9P(m`QU7cc{%|iGh zT51vVTRC>#`uWCqt}0PNS9pbcD_aEnGt^S5krC#*g*@dZBl6LF-FE3;NzEUKO+WU_ zYkfu!8F7^i71%-j;;I;O#Wk;pI?xRn(8-;1iIHlzEe);gKA56AO`0@4vI%oaZ+I$k zbi$zB-bFvjB-o_QH*f2+C>CIuENt#81M!v7Fi(FiT4|?V*|V{n2f`8?Zs#!+{_{o>oD_l4~%EJ zYkTOFrc$k8m1(5D4~2+{0kji8i?BfK*a1mL1xU7hUVI2MZn{fn3tcb`mN;C7tcSasj)$Kogo`Flo=s^R-5)ny(GZ* zw`G@-k9H)rGm`6&a+uouvbADmHwotDz713`4U8jH*vKZ`VNa z1791CLC>4+IQfSX1l@!}{M}OVIs3)ra%~;^_IV}{^~CKzJy5kkMCpzBQ%dxF>HT7Z z>mv=cihfx{@QN;u*3&bR6cV@Avzv_n2GCR(*8fgmL+5)~yrwosDaj23@BG}^$c{v> zfd3wfNrLX9S3$M>25%np_&UL+XKYj0a|ijpG4y|o=3YsIB0ReKTm3~!p>JFKnU26X zk+B_G1(l3zhj>?0K&qPisJgX4lT~axX=8n&+IpwKNtfZf!)l?*Tme@%qL&cv%~7+n zx4~VorwS1E!tzq(K$E7>Rjz)Seg@nGv(D9-p9588r*onzpR~(2WPaOzH=54bv#Y%@ ztFczcCR2s*m=po74Q39ex7AJP7_mb1`j#;WKo2z~*nEjAe|AL3 zj>jHdY}$Bb1C&+m+^^+D<tqrYUyY?zBh|+kNygH=7(NY_`%K0 zFS>J!Z?gA8FN=E+gPk{6s*ak-c~CpY1e$4-w63033fPZ*2C}3~7{LhT(S#HVA5I}b z#B+kn;5tTN)|uh8ljj|dmmx=t$ZM&6#AyR9G;v9QK2Ii7rn8|GFYx272|8)bv_x;J zcTU~uQj4XvCagQK9@FG1Gmh;Q}_wNSi0|*rqyd(Wwz|sA(VM#1k-f8aNGub3n6Yxp zY-(ZjAhq!D)eqU34T0vL`xI)1ZreuGK0jRo8PegRm|3(*;jzDIiMmm7eZMXA zJdRcXDxoJ~4mX`EL8cz*D13MrVr7lfb1ADR zs(I-+L60@+@5#}{$PGs=$> zx7@J1h1Ck-iI(GOzzfF=lvmW0F5qvZWC~5Kyl_Q+ug#Y7CKTHX!D+9V#gLQFeAiO5 z06WH{r0k5)kBDsjHO9D15{=xYMIPF5wmXHgPzAO>5lD-j(K2P6ZVRUP0Hx$X4NcQJ zw6kktoP_h6#?$M8Pj$a{hW3#i0GDsX6m^XFbg6B-$u0{M@ZVU@COZFb0 zyGKdAQA#*|8M@%Fa z?dIJYbsD>ur%1qcs(X`pC|g#QAfBZ4EW4`=hQYOmS_sML^Vs1V(ro)HG%-royX=^&_26J6KbqJ2m5aB3N?(j za#pXdH0s_WkSs=92^Z3bESt*b7~YbTD3e(W-^kGTb+5QmRzAf6yW#e~9S6IFErwd! z{fqC;9H9Nr$TUpc-<+iSyI`G2$_EbTXPq>ITKE*EFbmq$Y!#735i#u4;l0#*fY1Hz+Fk>#Cw@&t?gs$rf)oTcy$NeapezUwlyRw;o825 zq@%O$1ZpSaLD{1{%QVY>y<%^viOczuCy8Y7m=X%ulVvF}Giwvj$u#}YPvdxg{o`Os zS2(wjyHAG?^ve7F5g=w^Wh`T{8PHPUMN{<)SSuyUaPde~*Tj{D%9F0f_g5h@^u)J(f{Wkh*EMElC*HO>>5{6eu9QV#wvHyhz1d9seXqA> zndryRAuDRDoTJ-h+~DQ(io4oKR8V+779-~V?p(jDjV3@|V)GTzJ{hM%ICx7 zV(}7=V0E*X_|w9egOqG>{-d(ObBCq{?wrxbG-_&D7AEzoBg;c=fD9*LM@bqc-5TCq zRkF_G2|$4PuiZiAAp0t`+}Z`lg9C!D2F1{ma>Ot~ub|db$KhvsHn|G?tIX1=EuOvS z5y$MYJ+Sfw+>Lrez_WVGMpbmA#d>13YOW4C&ZRGpP7`9aJeWdF48C>Ew;OQ^&^?W! zP~2c^tLK#NV=Y(fT;pUljqTPWne8O@_f1dgV8-w`6gw?8if2qZGS%vO4K3<)jd6-I za6UEv`Sw?)-fMzbF@#4_6wAVyPuw7S%C2yCK~U32!s;)RqUuAmv0O*=BrtnH%mmpLGxe7Do)>C9K@Am zWp2oUzWl;H@_5{**R+Z>03424JOaiR^{{dnt~gv^^0%FSo^H8~KQfg%>;Rt)hl%-2 z%Ve95$@@t(|F^g*>kv+c{;XaLPPQ73m_PnZ0DoY)HoH{9e9ov+?*3=$BOatV!A zL!=~8e~8@Caw}vn`g!@&zEN{!RD03?!_d{8J$P(%6@EPm0y24SGlHD&cBgp7gg8oC z+E@$}Oy&Y7;l<)OzQ`6VD{lFu!{jVEABNfAM*)!3Wk6IC?^C8(4Om)x)x(yfN6LOJ zxiG<5*fCn9x4&P^zRd>eFXtXkN}`=?#r$?~KBz5yL0YtP4*7Tsrv@K(B6dCmW=uwZ zO*qVv0FwHON;>wA^PP~-yeNkYd%2b7jAwr1z_w13K9LKa75_=Ra%IGX#4oH}X|Pi* zh$s9IE}Y0Vx03N}-gX}WTM1XfZ{NMIq91c!wVxEMW{dFV8GZ|^#;xf`QYv9lr8GEhsA+B8dxFt}* zYQNjMFHBkciV@;Qga|Xtm4qJ^XT;iPE#zou&YNyJOQGnCb&7yB0iKwy_f#@qu#D1- zhgdD{3-zwgT5yu~Z_^1~h`?(2fBMX+I*}FmHS=^Sa|?K}(q-XNt~uG6P2gi!<=Pz0 z9WGRGq-Ss7qK;STWG9F0iBaJ)IunHq2u;FG2**mkLvuPT>XxJMXgycvs+5)pg(#nN zJJhMq$AB$RGYz6EP%elAPqxr6ZGf4SRDzaTf`rcYn-YCsjPO!&s!@I!9;(Ta23Zom zy8h$(Q->^b7&Ud~U8l%PYtp$lXJ;vUCz^S*Eh2>$jRR}0#=W6+8AmONFXznlEC`R} zUmiUt;+u1}`Y}b#t6_+X?@UUb8^VdJ$I_7@24K&w-ugP{`b@<;cGEfTUK~cFibCz*v!~{T zFH6))ZT``7q&IEPkzuXPf^Vipe3Kf_^566aWXVEB0QU8C_(iSa;j%xi?#e-NbAEJzO>U^dtrU z5;a8IIgH{B_RB-tex{s`BGa7)K@_Ivt4|O;C#sMjL40uGa0Z*H2}|b$Ox<~j=%=M{ z1UtTOWBK%3V!?Z0y5vR2|FdVHTa79Q+38{{7`=TXS3P4Xrz*-^5|94 zsxd1yIy^&ytO-lJ>Ew}+lVZ{Es{g zcXAHL)mhR`r+TR4NcQ8a9tr&q)oA_D(fPyVv+E53ur;oUdn}7@%#{6f-&JODQT1n>-#r_PTJZcsQokiYmBrg2cnZrm!hto?{|k5u#{lxW;?DY?#iZc z`iM+NlFqE#bPl@GS^Nuj`72IqU-rdMikN~T0<#0Gzv=X5x2f$nqIO>8(3NZ8f`h|7 zYl?N}SF&6go94^p*oq7DkCpBY9^T(AK2>;|jr6x`Sqo<$kOeswtbM1bttS6=A;VN7 zXGPMk$ETxMn>JUPNk|*+ek@7cp%bhu2%u1|vGZPKX{v@syMXo`9kD$)uXxv|zwcIL;vL9dh$$BZ4UdzkkNlv#hf#$Ey(RB6l9V6G!gf=;32^`+pbkDtRk& zvXnC-oCWw);_0%hR9im`bzJk9?E3g@4NybKe%*Hzeol$(xbRiKn7$w+@+T;?J+}Bz zT>Q<82z|-aBnT*7pDk^WR12y3L6i09z1HE^mog+RagvlypBh8MnLkv0*t`Ljd^t+q zZZecPWuQBEJ;d19Yz!3aJ8?_9TN&?OJP!vnw+1LjWJC!&Tn$XUWNppqEP+X|igOrk2Ut7Y4;lUZ^tu zHd{8gqac^R#@#2gr349QpuBJB(93TlF%Occg-$u>7bBG#+9gQinE!IVr)xPMqIEgm z{Z=zRAa1MXoIafwNxb^iwZI5A_{V{*^fg^K`IHKQO_Kr+)ZK_LZAf8K#$qXl+l#_Z zJhfe=0Zu33u3lSFmY=;mCdLEBo8?Wih#^m0WDqNgk}JvT9J6sTh{#$Qu|Y`+9Ug`~ z@Z#3RgJWWk{?~GpKqEJxm|*5FLg46!|qUH0|C8h~FfSGP2$FfFOf zY#sT=bNIT+T@F>W9~k5NpAU`T>y7kp;fx}yy8^u%40DMTl7#2O*23F+WH^Ok3_0AzFS{)%O-28@~J`9Hcpqkg`JLx?#Yp~fJ3VxogSae^u_?<}*BsHM& zGN=V%@)`D12gl5j_WnD01NS$AZqF^}RT%(5E!CNZ0s!pi?(+hwF|fteo@ZvU9`}kp z-J-QaOuKTm=!3TacLvQ<8pxL3uUzjjLIIs$PnRHjfuOH0gAM{5<@Y2~M;w;>r6lS5 z&Mv|~j~+LWrJ6YxliyGBeK_-S{qr-iBZg6`0VV!JR!PlV-b?>bTtUwd0d@vMx0+i+ zV{$?dIAbX~)5Y|7%304|JG{%xd%%jZjcpC+6-<1eQ+MP()j;@4RFZxuLr@b|{ zZI#fmr9}rPAVV4B8{S3q!gwk6M@Wo;ZfD2STjn_H-7c)*=bwJLyT)i3Ws*uA^Mq*( zIiUcx=R4&qD@rFBd$|WZP3#&|64Su5JWg5y#u#uprns*1gA923#O1h~~n1CIA(9ZbLs7njOV9rJz zb6Z7{#gewTVLJMSw)$i*F62v5xjvTVOgc}s8tYc|Tr!TZn`6O$Kc?*H2T9WVUmR#8 zH#tm`S9+39P9+|QZ49Ub52>cV&Q(B=zEIS~Qyi1>TafW%#Eo*|iR^`B(?DeiKP2vvQ^!D;(;u^?pZe``>bbSr zc(mH2wJ2{cVW0YgHX^DwB5sDBLq9R94MlQLQ54ykeMx;tvdozOfGg?dx|dv(vxv-} zphm?4Fa}k{M$S2tpPQRgZy=p<-)SlDrXwBs;&QtadcwD#}#;WCto&otO9&Md^H(V;53 zOH|-{59mO#5k@+iuH}hzFRCsj9S2G@ARdCLL_=38DfdHG^bj7h#!}LoW_O$XbS(sE zYoID!>tJOpCdgDG#RVn><@IoEG(6I1naCYAY8PG-@?kUGnz9>Th5sKG&1>8p0pqJn zXf7Xb z_XAFyt5s{xnpJDvjGALS8e59Fn4gRH(c!HxFCwk@e%Q-OKG~j1)tkr2H&4}#CUbMF z@(fex9<7+2<7EKTOcSe|fd7ll?|-Y)|30EQj<>$ZGyH#fWw1#z)n68ouZN_tLms#= zjMW@+1qMWuKi!5wi9&vfMKma>o?0KR=}}r2pFLv8U8=iHmoAo5o9!=t!*gnrLLNHo z6?V>^GNl@$WeC`SWDRaiC;#O3-`a{;tBFNLdc7GGF*2XrMCgPLkaieSuk$TRi8G$8 z10Sy^4~;3SWX2ZrovVODR@((RoJtx{{h>_V&g9^!uEAWHKajf!RZKppjGN7=p8pS* zL6M$jS&`bVJoQ^KJ~K7E3|?$H(q^!XuiN0nY*d)s2n9r;}A_uTTPQT)Nn4y-;2OON7q~^ zZOzXIprh;S739}{ued2I7t}}mzb*95f5(|#SD#zg>uJ*3-XEWYZ+tm`EB@n+Yac)U zXFUPp+8PV5dYG?FDS@Z>c{~AhM*s@fu~ub5g-T+@Lw1pAQ7+#^b^ddFlg;RIInHa& z?i!W~%tM);zsLUE{Xs*beSO}>rHi}M+ z3pVoFWK^{1@8{-8e^x}{w1aoJaj2GjA{ZSRe=U~W>{u?zuZ=1WJ>7nZ2p#UU&*{VK z;AyoG7W2#bfpKInS0T_^dvJ9!W{(EKm7MDxn@S9x zd-}wE?1fwcs=^#e_mex_&6C1hUpBMGKQj6YD@OR3q(BDFa?w6}88T)4-TBVR?&#lY zMs?iRbU6-ibrcr&d9s~iEy?EnNwWz)jsLwT^a26JbE%p&PxSJ!Ni*XOI1U3bl^sIY`OV%Q zD?0R6oMPT1U>rKO0X2(;8@0sYmQ`Uj+NeblS_>-GkN9*`)}2QDEc*;_%z6 zrFol7Stcuf901DX2LUi;uS+&!oFwJJc#&+Li9G8jHDXcMS7GO0ODQ$7RfhIi(EV~B zj&@4A^<+$sYl;+dOx4i`w4guOk8|oAji#|&N_5%d4fw-AejzGfvXzpge zV%MVBG(-y-K{yz72-w}5i4q6Zb!BC2d@^pYm8X(wJQfi3GJv0ut54Yt@TuOkUgOC~ zu>iPlC$4#}!&47VA0FplUB$z*IfA-}#j*`c5gC5LX%nS8kc`6%OBm+$iGW6@oPh>N z%4So^u%qqLTeU|LW$1>sYv9%ev-V;!IDYT&+Bzy$t;w@M64sC~BYf6R;)|_IW-$Q6 zMh?#uZOsFhDBR4Ad5~7AbSJ|C00T=A!O#C0|V9k!*iTmVYgPkU=n_#6U@=708 zuO~5Vm3y;ghAeh&+58Hnhj3yVsDtHnC0Z2E);Y4^on>qg;_Ku2{=>mERK-f;wB&Nz z?DX(*Zz{U@sU7=;kNNqM8pCr@I^XQTo!QX46c4fs<-(x*`JLtAgGP!KJ#X_52vMqn z{m4m62`D^LE%-ha1m?Mu5+{`XLu(&~v>W#hNlu&7Hd$7%z(GxayM}}G!vt9rEf6mDYsM6i=7*>M5z zj+txPQ>}n}p5;*Hz85js*}Qh=U9V55(E4~KUNKv%fmS28*}RIxC%RYdpYGFDZX1X> z>vmV%5vPx*i7i`mfkX;D|2V|*k7MkT4O`=Uv3D=m`*o>U;t8;Zfl14|G%K2;I=e&I;F#{PYZ&wIeh2^XYc+~3i5R3_9F?G(jE>u?E~n&j>OWxc-adc0~zp_^%!bsV?PD z5N1bqMkD8RI|MSbmsJdTSkOC} zIX-jtkph3+pn}jAhV~c~v0*>Zd(E?__N%Po8=CZ;$ z*v?6gtipcr(CeS8EaiVdwdTxfK|-r?zkt0&BXPS0e-#jltY*eB4)nsJxDu$lcE*~@ z2qq_=1lSK(bJMD2$hgIxcC?EQw_@3*ne>J{fK=&p+v}P3z}%{u`V+g(S8-hq!jJ<@*gBL z80{t0*|~0|)*Mmhd_sdb(A$g2Q?ha*VSLw)lEC_~;Go}7 zNbE~rp^CfwMmCGRlEp{ZH?EfuqL<@$2BC!+l-Wl+~N;{Y;F>)@ZX;n_drk*sk$VD`+&U&^bpHr zAkcq1xiQ@Aw~dFY#{sNuBLzk`3gfzb}7!fqPUGqK`Awa`1>nzWPY zQpFsUZ{&=$l~ZSmM|SEqNCh})L3$f;nW<(v8m+KCPZE2A-;9Btl+LL*YdWZXmU2UF zBQfh2{fTK}$V`cp?+HO4QdX%~lWPs5`OMx&J?+BSxOrn8t;+VM-MtG?WP<=y+Xy8{ zu9mcavuJ%!;fw8B57hnL zcADXf*#VsbKLLPM@ouEPIE|ZTKevE63ys|xQqcm}Xr_UZb(gHn5j=8DQum#9WU`9b+%<&v zV+ibdsY3BKx}#Bbs7SIU>8r?(goEz zlQZ@)K1Hfg4WHN+l+5Us&EhZWT#1DFF9O{^!wTwtdSUXQ&89bCL+gjVg=-L*ZG17+Vw&7=_}MuHWdy- z6ca~AOLiuEa2H1t25l^VTG7}!<{HX(Xj^r9Odz=XRsmQe2Lfj48Kb?-;;DD@krjFO zoXEtlRuof_nD;LZ3v#3J5r19uJhfvGvfMft^(Hj0Y1Hofe@g0R0P$rOCkjAqV^-4M z@IAgh`BlQY?lB|5p)2|WodrffkpxhxaC!aLqTc}bs3p7@Kkko_pVL<^uM#`j`3t}zb`iNUe8+e1Q6}&k-v}UWRzVP8{ec}D0~e( zI;|ZAI+vMM@Ex}-zp_)qx~)O?hBieax`J%veO)NJY)V9O?t=^*#)$jEh8!s}E{$$C zU+Sm>@s25;?aj{g?3h0Jmv))sPZWp7iLuC&{GzV!FVtguZ9x2DvGK(i9hLaN3z+#P-`FDkC-6>e8$l z{&(*y?OXc{to}RQqpVM)&wpEt+WGAq5?-OHoA2R-VrBdfoi<7k-H?eG`r{(2<8thxn z0X~O9YxG5=UmpN3Z5C};E$-bARqqKmt6I6c<5bEQrvpygh}Y0Pdlsz|3XAj%$wJ)Z zkGS9j&2VtVGjfj}hyNywGB#=>tBpuE@7WC~6nz+LkQ>TNG6kSx!^8DywG@}?K@l;J zVoQJ0PBoVJ6jI02UqawJxFA$wLWrgP-L;3ctv%^IT(`W@5maetE6&C|c^53T)S!JY zkDzrA*=PWE&U?Ecz(&TPwg=k*eodsXzm#*Ecp4oA#gv|OrTOl3cutqSQd#=V0Po30 zD_j2}=ITgG^a>zTuRX4%Me23dKpY2g0t_-Z+TZ_C@v?$vBD5*5j&lkeoaTVa3dQKo zf6FfEm}5@6R-`PehfY`G+SrlPx|n`)^1xy1qR2g>s2+Yg)MqjZwR=3ptD7%8Krv?H zSRZCO$8cwq!bBvCy<3fMQlI{HhRnVfY!*?!gQF7vjJ7EBS}#o|B&vureqPF8iJc>1 zwzWuBwB{>*uekLPILhOpmc|(yS*sO+r`yzoT@yjI^E|(v0qluZ6ZA=7=AnEGE9D{1 zKXD+QMYdms%2O5)i$A7QioM*xsKD^FxsISc7(xjVEYX)y~v zh;?a(aj(qK+{NA-@;1 z5uL>@c6$Hglk2@L%bfkoK5v#zsJzZ$;R~SIfud>lmY>ZKTCRc{@lUUm9vTDvj81wt zD@J*8_IWB-Hx9UcoF9V?sQ>%ygd%!zffeRkDwKxGifomR#82DV;+H>xrI8aYA5XiTSjG|`<-jj2v| z8wYXu@jB$p=`&u1EOmv#h0$ z>^XvVf=EXgGh!l-Af(3gI|O5LfKXWeI*burya^uvwn(peqJ8@S9Uewr9*BzXKTeGk zK!d4W5Fi)&9r$*Z7qvR<&W4D={CfBIgb8VXYI?nIS93PH1|g!K(81n1gBj`8kr&OC zhrFiBD}(+cdI!R_r48s^bn2*fDSB~5@Agh5rSx&c?bMP9BNGbKOM1p2G|zQBeGKbg z6GAgouAZ0DM{Yfyf@^44kei9y%EpxGBsP%+FOSwYLa9kc%*mg0u zqIJ{{?CzA1$?NnZ$%r3P?yU`C0UZyYRxG&fJ&VtgmVAeRl!AST+2s0JZpmoZ1z6Qb zn<7ooI)@|eX998Jp;o;Cu_U^Y?1FYpvd^fEw$ZhH-EJT$)}+rX4qfIimFa{7^t`{w zt35hBTcqO0yI~1!7qabD_4Aw~xZPVr-_YffaisnR3vspMMl|L#62NOTJd2)X`tIQNQ zRdZ;fVjk}8v}@~*%YsAK;$|%*suD8>IyECsa-C{a!t=op(HZeLDV;C;{A25OzNa5T z&T{`Sxh?>u$NlC@3u5;w& zUmnEq0FwfDT0S$s-LZZf%kz?^d zP}CNMWTJ3K|1Ou@2MU+ONp9vtAWbSfYHaC5(qss-Aa~#X^Vy=hS0l#k7LlL*nlV6| zLZ$%1X@Gx(0!xmZMfcJCRWG%Fs3l>wF0eE~sqqP~3Ts0gqGijVu{7ODa*&?>${^wr z2RS-S^MRpW zQGXYV!Xw$DY%lWLu!a2m)nn3SmBpiefZ!x;=W>_elY=D_W2+zGL+;otfJ4BMY!K$@ z^Yi##z)J=2tPl4Vvn zG%F`6WOe8<9gWUcnLoWZc;ReKI^orKfwpasBpeL}r%12tu`&!`=e-yNNP@~LJi(b_y=SQQvybkP>m1|-IinLgCe~jSxmPZYRH*?gWOV7>VIUOad z3$eHqrxZV`4T1&e6R1=nd2|0l9!mrx8wQ?=!8WmWo4E?7{_Q={TEuJqh}j4 zZ|tfAh1qg!JoL4mLw>vWdHOC79^m+zUPr>|PkH}-f?oN`r6uUW&SGOxEIj&k3-)NJ z9+$t$wZ?0pl$zbW?KhFOPzL|k`|Kk?^*bqe;}nY^^L0TWv@6+0fAC*m^c{l*dw0J5(79D zcW}fpXw<Yt#(xI!Ipv-92^0*Q4#8AvXcC_H}Cjo5gB<*hFRo<9dg2jNteSv0TG8 zp@#V*K-8xwzgkr?U0%*>AM;tbrH+u7*VVkdeCNNp1u@O@19gL$se@@A{CZRXx3ftj zT`Yy`W$@@wmG-BhUl*R~Q%ZyR zS$39fV(OW#m2+zH*lGkwzd^!;?sG+Xpe)pLJB#PuyLT4S1q>p^_xd4~i=Rh_r}__(f_*S{ayX zh!=`D_(>OOo8_1TxT`AU_9Xuc2|tZVXIBb>k~KS?)W#QWrPuesiHhKe_ z4x|zzpP+ooL_^OK_U17ZqY#k7i&z9s3w*R`^5P?!kVR|C(;QoVF>j*$?))*R0#7&_ zT=dc3p~kEdgUA_mxn5O)cMC@A)i>*SJgNQZ`^8+pgRN4ZPm$%TXi=N-EW^Hp0Vw@zVrY-ZR{hfPVUL* z*E?zUsz_z{?jE$xeaz&}20Ao2t6P&N&L|B5Vzc`Jp9kwK?VgOSwSwq3)z;sO^R>*V zuk1GYYQ&W~ho~3iZI|l>-GKgtK<6QyfRQ1FUJv2{#u11JJziHPOhFwC6`i98alwNI z4-8WiwnU2<(|Z8HVLj+)!94mn9;$c!A6?v85t(w0i32W53g|g{hNWux+_5nde-h*L zX>rRVGNW@15^NBlIQ%MzvD?=th*BXbudlj+c?3Qdan3bSGU*(d*KO!yqjI(a*SUgq zrvVO8wXuE{Z|Q}@IzFp&x6!-p8|{o98s1)W9;|a`M!r-T+Tc2bl?cT}TgkPo!xrui zl%`CqEF)q@Q<07A5Vi!lb*_gdSd0YBTE{;Il6qdMusIgSKB4dL$e#tYMXK60NI0jg~;`YjKI~_{{d|2h+@xOMYPvDhiFRd)H5m>c$q`PTWl0 z7K!z0c1BM>JNFkAKL%asO_e;?^G(+HcT!xAmt`DJEA%63hV@8z;dO*H{TC6^^ntWJ zOKpsHi4+Q@_Q(9qIT2XKt`or!paP=-a4m$JVx!hSMyH~1Ol9Ql%}#I9_3B}{=xHrA zyd}rnW?AC(!q+3yL=mUiPCm~)Wdy9hQJKIBLb)CYvR^~v#Fj-LZXP=vC-vGt8R!G2 zu-X;BHZ{@TvH60$rVf?RJJpj~OrZ*zhWdmB2wVy9!}igJhttLN?#o(p@K$qd zRU}r?D?eQLLU3ls;Z<2DLAlm6o7^B z$x?86EXB(m)IKv5n5D@#w(xG&h2?gr;<8Ac9c@39|H#Q6?Ty9N7rL7ae}iOGiVzrm z)Fn2|7>&g6Fr_H7YinaUmCL5j2gaYY+SissC%(Q~{G;HHpdpgAkg`g#$n(ih8F$#; z2`t1o8c~BA2NVR1F~;xINEUFYZK~fYsb&5+bJ?+J5;z!&l&m9tKbmxyHc*kl=HUN{ z@x&8YmY2uJn)qU5)oG`nX}K8GY%5z-WENn~qPZZ-jYTpFqM7==beGT1-?nWIKUZUb zUvx9bQL=&gq8W0}CjJ1Vbd0fEiObEB>^RmF$lwSrtqa!@OF!+6J}@8ebH(Zdh?nCx`g9ZX>> znlPEncp3X}8AenIA)0hw^}H!b{Q}EKfyq?f8hp#WH*8^u_YYoQN3|-}Pm65ydTvj& zRVC9Kjpin6sJ%?3#?&{dH?U14xJDGJWY^>Y#W2j>sP zH|Yx=W4ak69`U$2Ncdt!1!e@x`~y92rJnRxrdRL43R43m zHsYVJ^QBSjAip%Bq4F-T%~69ha4b8-*}1*cQ>xVszCcXLZGBUF+a_6`e=*Sd#=YpyC{xMemSmyLAxl1Rqps*zQ&{O-fg+erK;SoDkk{QHy9M z>x`YLpgQuAajhDc1uXFAjmn-`f@Y=MXq{C)B`{3_HZP0MCr2fSVaxfZ9ZeQTk~}=Q zN(!>-FuleTKsb4^Kf;0XKGL*cy?Lyp#7_<0Xj3He)mGIQk7c-<|KgH_Jk^BW1(%Zz zzx+viag%TlRIy+ll9FSWGDe0l$_jnNcvP(W;`EdQ&xfH0jvkj;H$6jtS`I~mf$dIDVXO=!K1!^XBnZ^&FxxPCjKVx zMs*!gg(K8ua1!RP8kQz|_Ak?qYFTKxBtiaXsTLj0ea~J08z+DERg?{p+{rZPJJaas ziqauj@_quliwQJA!iKP}6Z&?>wn9tpuzlb!H-~kg z0);{ohJAioUk#Et++vMA&_LDH2%K`3>m7c`7YwJaua^Ry4WmsJB{IwzHi`XH`f!JJ zBvphHzu<7EVYPCudk{6dG~PbPzeLJA71efT>V@B4Ih`N^5ehZ!Aak~iUt)Zzla>;l zO9sAdNBh31zMAHnqg;8LH|qZ9zVAX$_rCcfOy`fL*&r-86uxt_QJDjx%0FZteDn1N zbo(c=T?Rd@)E7x3(xNSt>EO_bLQuKzPq+p?{MZ#r(k>y(HUCmLSr&W`2IueIgww6n z1WjlP(G-!N&wCVZfI0Z2bY9u>fVEV-k2!(xuS$YTEh*p0pP-UI0HP27CL5nQOJR(% zRF!-T-G~+k?eLH;K(x8+WDe6$ka6Qg3SO}9EM92zoL8)b__W?#uGc~;zN@o)Hs2BE z#HF{Xc}iLz&F6x(40%~QmTA^u#@B`t20q2+RX*j<0uWg66u@=VotobR&BMHG3^w)Z zV?7VxGAc#b0eh~S zA@*f5FQ6#HkeX##|Jbr#8Y7(QaozjAH;pnbzl=J3g+kWkqbUKCY2fez#9)ft2TC?B za02~&ez5He8g7&Z6gX^OGPASaCN*{O-? z87XC5rMFJz>W>>doOZLTA$}p<1q(KLw^_=q9PcvY71Gve)4urDyIpI%ih@hhSWMWx ze|?s90uAC2rA22;$%Ql(8%VPuL`GZ1etKkhELW>xH0NE(s5oD-4VAaaugC>x& ziKE_bco`fXg_gIKQu9$$8E-_>II-a4#10rT^nP>Of5*+iZQ67#9r##wbMF|q zH&RaUx)wTO^BeV3yyBQR4K0LN;_w6MqsW;c)m>&uC^GmF!|Ck}=?wUGw2RR}vdo#W zdWc?l&IJC8-rIqbrBWxINJJPXhw=KFEx>4*rA{_Qr!v^gIr)ptid(Vtp2j6JKt{=t zwBnSq2NH2w4t=ogTHznG=~Whm;&t9-blqQf`MmXvn$_vmSf9JUFCS`^z21y9P%K5Y z>`mz>BZ$1i+0FT4?pH6rHjMJ2dH$wKQR|YU+9%<)%lD-$it$oXLz5Ye2t10wysue(hkQL8-2w{Ce7`O&2y`Boj?sEo+#Pu9exZMUP+9Cz2&P*0j6RzRGm zG+F#hCRDC+43`r0+NXgMOt2su11-3in$RlC?Q0#Hjc^ktT2Obbc>>Q&i&IY=!8{aD zSIfmBGOEyiP0`?_ZIIi&aCDg7W}(QRsrPhZj;7IJMa(?Y-!#F(UK0u0|MOBigi9d) zVZ57ebCz6@ZVKSnCM>e+x+G#!}Af+;j{p*o4!Xh3ifI9o^Q=a}7Uq&_qd zu3>MMiZvC(n3t;L#@gY9JX+wM*^YmI4q+OpF|XYU7>%@Dx18h19E6&z=2?{VawByo zvZ$3xhNeB9puj55bgjcWg%x@FY6eR0(j>s5iXV;9+WZ-r4ET_I`57Z-K*O!!B2AHT z&*la!WkM*XfJ=m&yG#~Rl1R2;+dkjsKIsvo1WVHW`3daFLArr9RFy*EUM9T7I+eWJ z>yY0%s?t9%m9vAg8b;iOyPnJ`fjiOjh{C9S2e4$6eJf!z@aGo7QMydx&9j=6o8R$x zMqED0ygi=qJiE!5`3BDNwSE-yd$UP%STQd5N8`%tnfFP#g*yuG*YW=LdS2?MfN4AX zrUk5D%fWe_FR?nqjif)tA?VcKVO}Vc-3L80Yg9saf%TPRe!~PAzVEL0knyYkm@uee zmsUF9j7Cw8VCDR46BYkyRPJPOl6&U&4Rut}9}TmfgUO%nk##^M=}5X>O~gjU*|9lN zyHkK`rywozFQ8g*lh{}GlM~cBq_o&*CUFKkOlMP>&RJnMxVlPccbPV5-F%w_T^oo~ z@h`!=Ie!^-+u>jGMmZ+WCa2eMcNzD8uHI`Wc1f3{d{~;tJO9I=&nK2YI=w&67-|4a zG9BSTsAScrYf5~RGPbyr;$8M7qGVr1YQNx-{BSvfMy^Z*X>sN%&;=HQ2$3C@jH9Gv z;cQJ}jo42r9ql$Ox06nK7QDh4641vj8iGG0FK`Kz>%HV?(*D*cLX$JihMwBS<78;_ zndsYJ50T+LXxnscX?$F5!uHrA=oLdDE{vY0^~bd^mEkTY%Wq5foZ^BG>8zV7ny<7c884@66X|?)J>>m#o(cI;mn^L?#5q5buU@ z8*QxK$5ouQYUuTc=b&+c0ERVTJ;IoWvtZd>kjCkW}<_TVT z`5XnV60z$PH?eIeqM_=!?$01XonT5o`cdg}Nn-eLFFQ6a z{?>+;mWHIocI(9GnmBd`kHP0n;Fhzgv-T+^9tDOuwaLg#l2%&!pF)<~-~AANm1@IF z-#wNUJ?WMTjK6?DgnvID-N~IT4J*)C*h%DIvNyQJV?mk^Y7lQ{`!BPk3a(j1;+b?J ztlOuUfF>>e2zOs^}%N-{8_Aqs9uac%{W2sd0aQOy|ivF=|}0 zZR22u#dZ_NBBDZc(4({5GVqR&r}iED==FjuVm0O_5K&pAV3CMR1c}J!=dHIhKkw@#* zx`pGp($91ey%|BiJR-5SH{L9l`4S(cVE84zCHwz%(5Ph0FSY4pX1Ro}p7w3DHDHvq zxhEtuyV~@2q~W!99q?1__BIzX5RzYx7^y3Ii{#X&Sefjm-%+>TE8IW54_JaddeJxhne2 z2>4OmVr|Zark7%z`&O4-4#-qE_RL-G!@!Q}EYKui)^J3Uq&H2N@mcJ{)8mE_Ny3Vl zc6=+4QcSdKB;_to_dUeu;Wv;&$u^^0j-!Pe3!+oGW z_uZ4}wEe7nO|Hx2P{8mnN|&!|yT6Pg-RnoTL6-W&&c7-v`1zCSHVQg&NGvp%fhPI3&ozOlteG>wp z1;<3EnO+$`SJn>Li4?h~?Q#8=@E#Y4rw8@a^-ot~7|xY7mOqEHezFT?9Ukfd_v5jMg;s^@~dt0{r<^gL&{w zO9CNHAr^GOZ**wherl2=_nePWe{*HB^XT6=%BmBgCdn8gf}}pw>dpnRb*`KzDIS1b z+;BjQZ}OYHCSO;O8k|-!5$wG-Nfp6`#@m1GdAENHTy1DfsPQ(7c${o$zPy)!>o+L! zU>1AUzz8=~g5s-cOsQM#j@K~3Fe*aiIpp+F}s&JD6)T?>0hfrIDX)<1J2^3@N=tI@=G zmr6>9wq|Kg_4yR9j!Jc0`g}y#s41`LeOnHEy@M?a0latB{e8p2womD5Vi#d)ip>6i z^@0ke&)}4_e4$%^WJM2sLQ};OTn<4J}T3LDLihFJ9LSaF9OcYo2vF&!6nNcJKA-^>nElPZf|^u zYI)DEWl9DUkV{;I9-tTPL0pR^W_jng0px=h(@ejUtO``d4k1G>@}(8fwID(_gfh{NxW>r#Wk67`2hQuLrUC;+tMnTB~s8Q?_J%}jN80LFqF zeL66Ez&yERWavbE4Y(L)qaRTZEIGVU>C4d_2<+TKzO5WO7{a!o`6ZA&m~@CtkwqnP zC{DA#U0MuB9xY^#H|AMP2pQ!Xov|~Wm-CCXL|*GZtX1+Ebo6Ku1&sPQD$bn2@%b-y z3CGh1p8Qo|z_NouvRYdTj=@Ww-l|kWT<0##DfV6Z;-3TI~PsjEB4{5 zb+?!)P1<|zd7?Lv4e=e`5Uij}2n*18R{n-1U*FZdR~LI!K4{_sO)AS1Z}08M*zIHy zHI6?vmlw}ZXdG$T^g0m*Jl6=;jsYOzmyeRhcE1i^rm`$z6tvxpK;!23=jPs|NDFh7 z8Qy3E5r5%pgXtb-rl0H_$n4hzi{@RfYa*2(v=kH&*y*0ItI}JH4HOS@&4|~a@Bi13 zjWygVU-dmi5g)KL{)3PUutsY_Nms28I>m4ws0jSdj3Q;gdnRJw+)yeBs?pmkjK%MO zw^B3@n0GrEG5=-K6m*VWHJVL`Hx(WMj#N;}qhlUcyZ%<-L(JoN+wIKbWmH`(K}*o9 zWk}nOJSgz~$sP7f2IrKduu_c<<-VHm#UZbbs$k zWNUzQH2$$vFE7$(M)^D9s;JG|Z@Gg(l!om;OL~6dUuHQ=bExDZ+Znn%wpV%{=Iv^Y z3`_mG)BhdHFQ4sImYjxg*(g#-(0;P7|GZsMv}y3aZ?XVC4qW~FO+?_BN4g8q?+ZQn zZ}5pjn)pEC%?UUksaUyZ_6})B&SEQ zyRdGcA{{}cEUmi0wtD01bW@$gi@+RcM9)!|&rnvAxW1|gs;ezd-RI0Qrs-)K#>VQH zS>3F70(@qUjUchz^5*yV1`4z9U73NQGk~_w_!9D#2Kdi|;TR7`Dlsl~YYcpnwtn#S zK72~b7VQsh{0l({|9V%fb9i94;Vbu${ba*6Fl?J6#dC}GanCN9Z0p;6-3Znl#d|51 zmyBjnLQ1m~R7kmqMT8f+_&iD$2)YbRGGLR_vIK+=IMzAmyXXDU3{QyvJ41Suj=>nR zZQIsIHEeb|SAg#6MCvEt<_*1IJ{~hiFvWw^x|NS{^U=s=Ix+N!k@c zh28jvqn~xa)udOK1^H9V|=3j|EoLlbPCRY`bF%!Zc&3i@+Qg^%k zPUuxNf5jDe-ZSjd!8wPJRV?v_9;^iwh1_|K7=G$yCrwU*L!Bkmv;N4gTu6%+o_3$x zs48#h7VFsOj$B+W2wSnbhhBVKULKTpPG7hXv^C(^`;fXaw@VyOjae_Tp=}NzbIXVM zaHZ;M_C?lR=4D+r$RIPRXq8==bi@sIQlQ>SHHu}-(iQ?Gn z`q%0a66)2BfQzDS#?j$YA;QjTzRXH_zair0r;sR*$y-QyznRQP6un5Cb(x)~*Q;ic zHY&L~!R9la?Y#Gex_ZaGOj}%}q$SUAv8A6VdDqvB5zRV+%sW5Rs^7iPi+7+!nyoi%o>UtnX-#(;v|5*k1F-vZ|aQ_N=eoG0&e3)Gq?YO!k9VGg3eUGc~A<4mePw!pF<*I%pijS zmo&VRHpE6X1xENqa;`r%p6sK^2BF`jET1`IQX!3=f+;oE+&V>~rFR9^LqB>h(F*Ow z1lz&6QKvA+IdO|YP=AX2W}7dy<|&mIvy6|!sc3Yt=M+*(T8L-(YkqL|Be$vq)=;te zAJ%$xbzuCyAtvQ9`H{|`jwX5ipNTXTMRlB++inigbYp`*76Z~2?{w&*Zcm)Ir)JQPvI~XbFdic>EbKzI2(%UM_#{&8 z-57=Lh-Ap$AS!FC@HPiclAtmA(IwC^ZO%LKuqEMHhy_k)91`1W!dE;F&y&?i7jYxK zoVZk5urc?u2;BjUmr@SE^LW>hwaD!qno*a{ZRf_?lu7C>yq&ZZr*KHyDX+YL4x$OQ zQZQFN|9R^mWQD%O(t2jz0yf9Z-DXA4H}X5Jw8-g~cD#o4CtC5{2rb+23wKjG-@78l z_-kw&M9_o5nF2?p!p~v^#2E0!v2NZ(4Yi*&r?~S&WKI$#F|0o$mubvplKy7$N;MFB3}yh>_od=3UPuf7Z}(PeV8^JYs& zq*Hv|t60o~Rq0^Pm;nohzPDqa4w1uOq~{;fUU6)Ehmcu9twrRp2eR=%#U0r6%nQ!N z-u4`H2Zr=drB#;-NxHS`5e_N-{OYDqsN-MQW4XF;MYH9&gVum5)OZwlH#cgqY)HkH zj$^DjZ7VBgmti$3lLq10+A2gMD8t@9I$lox z^mx*{N!12a>Z@DU)%MMwM1-!`#L^E6a&VZn^qGHhA~oYf&nN$U{S#Wg8q!e#HZOaQ zHF_kwnNB^M|M=!ug13iG*u=fs6!gwFEwk-{6p@$gw}KMJescHxM3Rlp-pf`Drj%4^ z6(0y(IuLJ^M-u&JCp`eu&&*T9I9o!?_s*TO%54Ws91w7}?*c9_u{(y%&9XdvS|ld> zB2_WNAs|$wUvX39c=3Ja-Ks)WJuCDz{eHrWU`1lYv?%P!3*M4ragQYw@mk6Xca{Z$ zj2s8`Cpe|}vt>1pvwXi)U~1nn->Mn$kYQ#85ds^JS~&!1E^!FFX*{rTKZY>$<}}M%3Ecm+pLCS5AAQU=z-@E7^avuZlXCGLU^^ z^<1&!W9=x=tJ{KM)b{fx@?(itg$=+j*MvS83Cn$^Z0S^V+E`egYFiafyEDTld3kuK zqIy(vu<=^GU#v35>vwg_&!U=^>Hz0DSNwQ?%M>}<)06U|EFo!SgF*gF{p9dfuR27f z=njlWd*FyQqN8Xn=-QPB%Np#p&$%MMGPA9=53K|(sJUye$>Q6-iQ1dq=y7y+Z@%r& z<>%p!K9)JC;Zh=;A93C`^CCVSum05ptF71E_)1x7@F#}Lg;`m;8619xsBOdzr;y(p zbep6y7k>tJk>uj&tB4`Jdq3qhfZsdiINE(DuI2axqJQ01b4BG=Bl-)<3wsfZW(|?Z zyWJy&fM#?@Jli;Mr+*@xtbwA9UFevMO})0lg7&#A=;=+J8x|8xYr&tXl0_a zTJm^*7eaqa(c;7s&lvA6e>dsnTshcU;>W29dkl4CRO-hsgPs+D}3QoTI#T)jfS+NB?sx^|-J5$|V8rfP3^UQ<4{ zwB=sv)srggdw;rh>EgK=lL;1e5{O`Yv^fi}Yc#=HL?qAHP*BbK0aJ(NHvtvVl z(GKVK*2Nxs{^DYk(QEg@Zz9RINh*)RM2frP3x0|yvT+X@R^Gs#a-9GAx_MyAa@c+{ zF%(x#kp5O`dL;Fl65PsL2gNuBFw3p@kG{_cBXU2tX#TyA2nU_=C@&K`c)Eku#*t)q zK3!;i(bLx$t*xWH{1B}(zax!3a10)Dtl6hK*UJ2_%i-HWN_cvB;Bm7V8v0=H@bpOf zgUWYuasXJG5SSdrLRf>C}6tt=BOdj*>nHDvLT- z`=7pcVoMs5NNcX!ol({k2p&`=f zyUB984dZSnbPg}Fzx?39dB8yC&yR09+K7}o0k3p_onZMTX2brO-tP4nCNPmp;n(eZ zZeC2m{pYT~f^2x7@mdvyv`Z|wx7{`^-F~ZObK2s200EJe(xW=u)zZx#f#~Std+Zlo zX|hz72=hc@Zh90L|9Dbg&2sSbM$o?0^Gj>I?3U3XQX_lY(!cMT%g9iAQW!U*7b~q# zeW(Wkd4eV0)VZF4a=J!-Sgv(7P+K1I6S+LGe0<+MpeaKk`0E=@7YWYqlXsORx&mGjxz$U`Y?@P(H{i_3_M#q{su^W~B;L*d$cl$x1-TAkU^d|ni zT_Ak7;oYO`1FL(6)w9WZDl*vN%Yovr_z1=HpF%!D{f_I!xO_I?`=Nan{~qL#no5(U zqj}SCR!b0PC?s*NcS2e@JnWR>B2r; zKF5n}kL!bMog+8-CU~bKfT69;D&Y@uz?YJtsa@_Z!K|Nb1=EwiFXYVXbw}#0-Kt#P zD$Vx!JZ15H-6DV?q*(^^>O&H$_6N^(c#E3Nmq&VF_1(EUS?86sqCbqy(0&W)vn-9J zUTY|NzN~N}D9_`LU*zJ=(%WveLn?Y6?59+kQ|9k}O~JqAN@agm%G$jPT&QCXsyyR% zarKSS?+)gw7vfi83b*c?thRjAdfDaOCYn!sZrQMZk256}k`zb^E%?$U{gHa;Xe4$# zUjf&p`&31){>CN$%hFlqIXx_=H}QODwtgBV-)kDL|IL}C_fh4IWBnT;#qg5*rtqS! z;XRhVxnN$~p&t>I2M--i%!k$9yEAky*VOwNu%=2N@vJM8+flbwUhMbNm0!d%V*CPL z^!tq7Rp0n#|NKWne#-kU;H=-nGQuLGlXv`+Te!|nT_bTZSF5A@o#h9M=TDa?pTL)3 zYrE|-tA|x4eqk?|NGByKYUXe^<%fsd-?=DdBZn30w+%+dpV6s#-}&0yFY0xJD&lTy zjcbqRcljld)^wWo$zRd*??$5yAL-t2;-zo%u+3HQLK!U9TAN(|;U4#KyVI?G`K=Fh z1hsq&IpppMxDRAKxE_UQJeJ@Xe50W1%i5s#xcdn|uOf3Zx7OA(lFSi#(d7}#*T0Kd z=j+hVZpcjXMH6QVBQ`1 zO-p|Potjp$n)E^<8O4*r(dom8&3A|YY#1sHvP zxE@FubG1w@zTy57e603$j;Cx$Low$gb07cuxA?G?M+Z*5b&rjL;-Qtr9`=tm7tz-(`OJydKq* z;TYU8xLRc;j5y`eP`LDqAvdY=%VwCZQT7?PYBvqSBb)aY`b7#h$HP9fnw6#8LAl`1 z=XTVCADsAH8$bIYU$p10f#ZQC;pZ>=%Lt}ko%~NHpJMKJZRj3$-}BqZizM7B#->%h zdqH%!koB24J&-3C{gZtZ` zPh>Rrz7kVJ^l|_EeWr%Kuajugdg;I^{DVF7SK+~oMWP&;j-?fwpB^^5)%71p$VxZP z?m`|tZyFyq3jW39ZSC{PVeBD_ zDxul8&-Ly6s4WZN3nLv2ef{jD&m}SY+OgpF>A?I@cEduif`GZt4>})+0N!h@^X7Su zi#qA&y-@tNRWs&Z5N6?2^Zm1Lb@|J&_=4MA-qKiY?Nz_I>b8+)y$L~W^G^@M!XKQn ze88TfJiHQOYwKjqgW9a4Pgi)X`HE?Euoql!7uo9Nwa-wI3GpnSO;kKzUw!?APswSQ z+1p?rK6b8$C9Br2PqpzoqgCeOn7wuHF%Qpm5^NI^OIZpMJG=&-Q4(w=XU;(;is}#3=HQ|*`G)^|+O|$BFtM%S${P8_A75|*uf=-C%&lLiS zh1-%cLj4fqZYBAu4~85rQIbzeJH@T5*{WMaL<|Pj8*AMi46?19Z}PU7)=OGYI8gh- zU?bdkZ`8SJTiBc_DELdx`qy7FOBH&Ph-;T6S!{oW_)k0t9gdq(dg$1;8Kt9p_)b|{ z%N<~SYv~}V<11}@v6+4F(7_*qgxLr zUS3kdX+Dl@x^T8~Le;mW4={V*E=X;}tKfOtBl2*VbLrb?y9%y!p{(rb%^DP!+~Jac zqf^7h_0fA%K(C<_!67h0i?R&z?eh)!DE2<(N1ywFN-~FmJ!hf%+Nx(8=OZJ|OUJKd zP06|T;Q<^kD^J#ala16ZPN_UKA6dHkt@fGyx01~lSHo3XV{;U-MflxtH^+dD(8xL~ z`K)q;d=?v?)jr3VHZh$f5Dt|B5AA2YTK~wA^;2r^W$R%_?mgUTJIHvHRRSl)(x7_`XAIXpuq3=CPw#UX^3dnEBczRai}!)!Q%L;Ml#QGs5_Qaqf!v zZKm$nKo_PQmeN>nmt#34j|U&=j&MIiRD&;HSrp0cd{C;R4CdiH>mf3n~Cb5r`y&HO(% zjV^mgzPc_~_Kcon_@|~8dQI2mdY)}-1_(6L311@-5Fkh=*pq(<{~y9jCq{aGPvLLI zUk(NY4qyhw{*cV2Qq*`Em(kg`(J>0tJ0y7Pd15zTE-ilxvHRpmreEYRe@Z6cFu&Po zb{7y_-?RdSpy*^(IB)=*s?bcoilzTsYWXMi_8)Td54rn?RQ<`P{il&rf5`q)7AiOF zsRI>4XNo*DD@(66qU=u|>A*4Ydk3qq^1@+rIfM5i04)|>gIr~^xgwSK?QRSyxr(ye zVeBc>?7*qmaOa(qku4FsQKBf36#`%}>?Ij?26bz`yW-nRT8<1&)toAFZS`I6Al_a0 zi-$+vc0Mt6ihP_XjCwuQMG9x~ubldcOExx%)D}S<&pkLmHPTusxGgx87Dd9$(B`Rx zzi-h7XkMm2thpyNMY3Um6OZfC3^wP*78n=qER;W+5)2pc>R$3m_{}=Y=Ex$JPC>23 z*~Usw;ag5M3BKzGVqUffw-3~fyt%}DBUY@4MVCvLQI~U&0m|TibK!iE$eCkeOk!-M zvDvYcaW)r|bYd;rCAZZSUkILyUN}C&oDrK4Cll)#HyJmfaE|R2)00@XIQ9jh1;Yi+ zB39pCc@=J5c3n24Nis41xcDWeJq9Uyw@wuKpIYL2z}(qx@Q=n5o6ZEapDJRLW#nNt zXFxNV-mPe01~3trtX)LIdBeHAu3yF#eL99^7Go|v=F9+zEA%+d7k(z3Dg1N}<2=K3 z)&=J)02MA>7F})=MrFnt<|@Trz6E|27Tx0}3}^;rrW!^?1-0CY*q80+RF3H$(>;M? z7-TZGfv82r@?8<%X4sb9=2tm^jhQXRKh{WNendtonka%JFB6X^iH~$_%ybFSeet-Dmp6EXLr>nip2| z>OTatbqz+>5nsD{dvd$)l>wz_kxT4cOm6LN?PKkn?H50|1KLi!VmOLri@gz77VEuW zT@=By#Hh=l%Rv`?^<&Y$sup7{WGaobjazLkV&q{+V=`wPYhM6%v4(Sn3x_l2ux2^N ztHk|7M=I<{6OjtrH^{gPSLp9<{!=|$H-HR(TS^XNUd>hEKmGj6Zo+f5?&+Ka-e>v6 zXw=@>&evYs&b57PB$Q#F>EFds&-aC~EcX1uRTrl4W8tTM1fJYsz%nZ_r7^s0$G0oA zmm551{v#?Oy6JAIw4M0NbeG%tw|Td)$ghQBQ)?9s7*SNWmjDEk9O0;6Eujo4cY5eouE>o#xsn*Kl!({lSipy$e} z-c6bRRMCNRhWf|}E@mFaG-k_o)Au3W){8HW1D${skQWz`L-A$NodH!s{$%jQ>>AKm7k8 z`?~div>A53;BQHv3O~_A2zbkPhOLmLkl7yhr7`Xwn);_3&LtC>=h{`aPi|jQVMVea zx$D}*T^at5;n8J$$gsroise|G>VoQm_X4ZS>ASmEyTmUs?)~i^6<6>v@5-(S-WR`r zDx4*UrI5{;F%S6o6KlZ#b7tkMy0L)^w~9&x1OCIQfnA*cURm(z9j4E*q}b&43+<94 z(`jVJe`i@OmJV=nS6#UNc1bP?vA;R~%eI0ah-rX=JE~v)G_Sqf?>;@mv2{BBAfR{% z@8z^WZiz@%A6k8vd1xl@I{SWP{>{jI#fX_)-36mSB^!C5q3NHQmkcD1=f@?J^zCwY%nGOm|c69A0<(C2}J7$+5A<7lR}Nil4zM z@t*h||-`VRzi(^cghEiF<6(eF6ql6HB&dJ4N&(fr6PjP{Lwxi!?WDkuZ zBiDWc)>*g*pwst6(=jQ#DQR-+lp~fr|0o`XI_PaLOwJV@`8ue@&u%_1hxmh`q}fK< zb&^f7;o5cP7btK$Xemnaqv)!uC=c;8fQ8au_@oH2y-7i7u*CGW;vZ6I{<{F`4mRh}m|ZCJ%;5kNCBcnnv>U*Zq4h?jC7^oKP20TXzqfjH1OYy)acHZ8wTz zYV`AOj~>QwY>_fm;8%+E3SWeY53)pPLzTMdh=ZhI+YYE)V*jlO^D8p1SG4VaV- z^8Fh8@kVmBAy5hB4cl{?haphc(=}%}rqk_ZH^ZmLbd^x$HNFL&5woAUscs+l=^Nr; zLX76CY`sKyy+Yd>@1)PX9nn&#Q{<>}D)u)`@ic%qFl}*yRqD3NU9~<0fQ9|b^k+&& zLKVD!ycwys>X@wQ73x4 zbI4X4^0O_|O7}sgDv{-4g%9r{L@ha({k~l4ov<= zUX2QMI{fyH`cVk|7WFtt4`qy9BdUAi&3I!A|MVQkmRNjfjeZnLpA@T4D$;K;FOIpn zj&GBU3r!h`6ley44b9aemo&Km35m9kd#LQJ9Hpu&38T80LfLft7TFh`Q(U*MIA%M@r%(yx$rO_dK? z!02HbO>^Vc`ywP zo1=`p)6CmVK|Z`>7yKB^tjb^*>@Ga4Q{%!QgAuIBrjV_v_-J7h-3NM=qvKh!eB z&SdJ+xZ@ArS)^jhqjAedIhc|Wv8d!-QcETjmS#c4RP>t4uG4@!WK z`~e;0`8c)`GNNPj`{b{Su986O< z+~MQ!w;eHL-PMwxu8CQb4XVbQ-RCk2Ar7gL_;lkDOT>Rt>ZEPukB z*HOTdk-|G2g{4! zrUu#BM_5=5RnyyA6pi}>BLdTF{L{%sj?~+72_TD~)Vsy4Z!HXj5%Xv*{~CS&ou?n5vw-;L3&HKJJ-8w*sd(X&|9>bK2Fu0l1Y{tr2R++z3QQ z)2$k|qg);_@;t({4*|FKqLsc~#AF_Af3`@Y8XV5U<%4J?BlEYHb}>srVsCN*8HKbv z9khp|GA*%g5#!IjZt$O zwn`lML?6B^2QqQ>#}%j9DtD%jw9Ly6pcn8o0iz!Z@me6>29Paochy&>HKaQj-=Y1h zA_EyU#;n;592 zKJdqmPw+j*RS#zZwt$jg3!)CR3}~%?^{548e@5%%6GxB>7az4X8kVEC*fn(EKk}~B zx{Yc{4Q?6b&lZn_%DZAMyjldN>9|m$Kl2CA>MHoBzZ*>x6zY8W?GyBMibk{rrmx0_ z-n@lb9EX*h53W*!IhBp1%3@la6W4V3r%xEoAn&9{mFc(KDsD9{4v`DI{J!_BrB{!@ zbmF+y-1BBTxdaFP>6T3TnLOG6@7~$>j}OJ-51ivejSlDilV<-TloGH{dodX%7Zj#I zA?q1|;58ETVGzq)zW@0={%Q$qzU(c|pdYzn%-=kpae1gOL+?vX(x56S1EyFJ-3a!c zVb+gQz*X_cW6*LQVb_Zbtos9QrVl6t5fp;x_WOZ%^{KvstcQ)2mz2~Xk3vXozX;Qu}fllQj4pa@Xo0&(X4;JXQtKOdUfTuQuke?Brs<1<*4{Dg# zy)hN~QP&a&8s&m8)gx^Nedrqk%{VJBaobfcOi8a^X$B@tp$>Ov6@jUE3)Rm}h(_p> zVDSfkkfy|xR%F2jDjtl2-DJnJmvB=*Sa5@0kHD;o^~&Ea_V72;YvBhK_nOM@|9;7_ zB|{H%jLJRD<$^#}(Kycx6}U}$6dhJx@n$1ze*)>Pz3IXW@=urXt)0ND5h6WxK=PY=09eUd@^!3}zxA~0>tv1OjI^UFLlnxyUl1icxdItndQ_2oKI zR$j^q`%CzwS+LwX$=47ouo4A-(@Uw^ZADrBbhd6I5IDBP`KLkhD=HNu)LV&bAcZ>k z9j_X>I=J=dHk4xvlc@r>9VLkCCu8|yW<@%yx4Yk4xFddnGS#Tc^kD7tIjHP973%Su zC@wV*zJ0_~;V!7xL-|m~^J{HRO1TY@^wY_}jjYq)xGFW`Cn_w^EFG_fQf;oJkm`() z&FF((3X0X}hplWKB);Kxv7&`nGM`riIqU7Hu$nRbs_mks*B?BQ^{Ce`t}-c7%m}YG zN-;JlwJxr*@uC}(ef&h}$b?+oK8OD!{h4#tS{sbYrtrzI-((`RI6NfS=o+}y&uY`kOyrmKvmP&fKW1o@yc{%L=XtpX|2&ovBxL1vxg?nLVP(QQv+AP&kTFh1IA!-W* zqGl6fDpajVq+5a8_yHI^S_uQK+20S(^VfYhNZIXuN@7GiDS&(+RM91O{4$ad<0HbO znXk7w1TzD8%tE?7Xud{qlu5N73=K{bH1*XG_gVSsh{q4D`Wv$ZFZ%D0Uxxcq%6zn=nf z46o^od~=z9i2HjI|HP^jkv=Dw!w8AkaXp>>KsgCJF+$-Q-H|zaf0QPrcY9PyGDc(6 zTf#|TG^{8X3e@@Pm~wi*F3l|JV;%f@luTVfY5n9G6>byyJQTmmoY#B?qGbQ%szY59 zlubKUDFWQaBg^R4eo2MVq~8HQ*3PA39IR<#;{B-DX}$o*^f?Y##PW=Bx&1Nn2IwEl z36)4w3{xHR*(-u0C-(Yu_Wvr&WZABv!aQi;DOYMTOmjKEp_tQ$Bb=9l7)U-&Rj@{$?jTpF37- z{J+&4BBr2*^q%@JWxZ?pDk@L^w=R!z_zV1u`!BuXbhkgx^Dp%+bIK}Wk3a0$8g7g=9|BJE%UVjn& zAAC6cR{=~ZLbl5|m;ak>N^?7?lU-c?|BGx5d3uG)>QNU{oFK>hqnn%3l1OisVA)MQ zT`?xJVDDKgCZs3cdZ{7m5)TJ0aFON{h&V}@d`f}@!mFB~rw9g1u*N2o*{sZ0ifSN6 z9$N#znu^CPy&+Q)Qd(SZK^V7cA#LZEsMpisX}$25O&A4iU?75*07xcj1;Ue?pn`

    ?5qO@GUTlNJ#?uskQopoQRDVchI4{9Tg7!FL@}69c`01lLecGu&#A!m>u|=o^;bl6Gc6R}I6D!U$+n7$0VG7Hd zeHlmM`$>H}UW3tTN!^?@H;R~-TRF5`0xDw5y5=rm5m`i~=j0=yK=CXh&2I$e)t?=q zO$4^U&4?JO!+rcx+pSr87%-`xenjQuooB<)7*lCwUn$M#n5;RJEY__j^<$L$Xdztg zsriLw_~rZH8(45Uxp`Hc)=5Sm+uiJ=ROmM@QtThoCNJ!*b@`LB(NCi~k=~)S>yj{( zP!q@;yT(kQb6Ithh&tPa$O_8EoFc5jj~2>$^%Tjp-7SY)TG#~)sr4y|5KkLJP&Hb> zPrGP55<4`%bLjoe;H6yZR)ZK*nm41O9_-%BfL!U78r*ryg2)KamcdJa(MpW3fwetMBi-BQA!lDNd&}4>-D=({Y1XnmaT#_vGz2ZJ61$ z%jO5!&0&yG?C;;d2Xlp{(f5w>x0$+8Lg*gwI{6N&-H+C$MZG>_Npq-erEnvjp(a<% zDdK}fn8rTb!jk5xP6eBgz&p+3v>`um!-weWwb3xZOmY<@YMr7~^V<*9Uvjz%3|!2( zAOtq@agD;Q`N(S4|02rgEDF4Y^#n_G1D@CFpA`$Y$P)7l9QpKW2Q>4!~T#InI zVK#VZ{Pm`RBJxbxqEwUC1P-H3^m7E%|000()ZzOnVQK*`Nc9Qa@)IJ*6M&K8G%aOl zFMq+a9K{I}1bm%bfDpN+6D*Uf(}s3J#-XmIn9)I~LNwpLL;eb?VjZE?q=X}rPNFM6uoV+OAm2nFqvp&tlugsIRfr9w7dR9yoge`N(t%V zQAOVH`L-2oj?7zZ9o(HyMx*ZnL9IfC#uOm&!3N=LiVz$$?KuKW>RF@`WszYWEz$TP zzz(jK@fps$6mT-kHS*DYPh=W*8MQ6^>^u)Djx8U(d6KN#N$BAe0`lVqNjeOun-o_F zm0JU!Jxn@_Ch0w0tocTDd1CHDygw$Mpb{<7c|(P4IxX%qfk-DRJ`smZq;>Adg=g4d zQe7fn=FEFNSyOMjFtq0OY@PP84q-y#(q&D1gEIJy7R{W6P2zP6k8W7Pnf5ow%lT?R zr^G?)@l7(WbMQRBZqQev*K&C&MT0!^kZrjzU<2JAmhibpj}KITUJC2>Onr!qRvXJt z=`4QLw3f3zq`AK)B<{O`1^~IC+-Ea;PpRVJ4|ftFRPzqb(^<(RcXf*8ubT3`$?|B_ ztdxU(e-yxXjKe&Ef1Gn0wJoY>ke>%(pCWH)IXAkdlaurM>7UYEcG=hciGw5 z1%kUs1;Zq#VWP-74qmI*!~*!DFnHinatLc0_v2A=i&W2)lTTHW%+r<_F9~i^2ZYC{sz_E)DsGXq%07<~i$aRR;pR*1eA1FI znkD@B7NYxz1XUdFLT^)fW&s~tqfYz6K?yUBx5&=mY)4pNO%EPz**X zncRfmRz{Iu5GiSEL-}+}O4|?b8@R-qNUw2ub%+m-mq+yEMvH+vdln`GrD4qI4(QTU zICJ46Oh@p}bzL4*O4?W4hvE1;Y(4mWTHN^*0sHL&)+n4X zH~rN~C~PZ(sB2w*dyiBs-`Rs|kOCrw&0>g?O%>`fxQemh6HgkUW7}8@oYb|m>F+iuxf(q~yphsr$bl-{y4wJ(R9zxgJvNMqhDcE+BV0M81Qb5 zj*C2<3PP|;xEloUbyf0NdYOIVkymBUWSTpvoHXWk26lYEXDR&>v-sm4DG)jlLn}pf z%Ov!mZB1@+xUY*Kq3IL3M| zl!QwI1;rnszUJPArww%+k$ggTDcxw9Vbx8N=}fCUi?3)76b zp(}^s1>o*5IzEnz0|FeE2q5QH?VXq)HN>RxA+q41a%WlIkt%tAGLiCf>>d2_zPaa- zo}HNIg1{g;m#80ony!)@^jODFat|7=Xrz?Zgf49p6L%ausw6QRpQ-L44S$IwZ#vEu zRvK5LjD@J8o!L@lf*|Mg%m+viTAdOD8{OF_JbcTu8|^x}gX>9tks9G#_#m3Lv-Ea( zjagZBb0F!h_&!o?J<>VA=cVvWdcLrdx65my69ON`9~S97y!ipIZPAV2GtYV#QL~<^ zuAhipcro4cYSC_Z({C*#6|YS&S8~WtbF`RS3d(GydGe1bjU9pqBMPid=KSy|(Vjf~ zZ*FuCD|vsnh;!{Dk`{G5-}O|_owbn9<=L*U65YO3*sH|=U<;VC=l=|c&f@Au^kIHrbX$vl-|gF7&;HGOq>$j+Y*v5- zeM23Z%`mOiXZPI6JBU1S{Z@zsB)l$TdA^VrLpUE+!cKzZ&HUi<#optrY)-8DxC%_^ z%p1@+8x~NoDiZ;18=*(PYiWweZSj9U0dlkLIbLpJpLJcEjq;7wwv= zg{qsS*79dxaGC@pVxxQm`V8*|-%wKC3~{4;Gqm8PdG#8^pFZi(Ea1jNPB586PwiJn^#HU6>ggVl zkA=o?p3Ua_PT>7nH(`{=p5wy0r}VJYdUIRp>g>GIU9{mk6t34;Co>VON9h;P%YM^* zGE(UVTw$~MRoq>4{qLG)`09^OVw;G2saxjVkr%IHYQ%IR${oMCiF^j8XiT^X;PNoL z`Ge5?njz>8?gRDU`#yoijiNYR;rI=cHUCi**ZA$1d%pG zB)&0QM?;$TM zZ?Vm&v&6+y=}(Q`8oS?gH|mo7B>71yNHR!jS8`X1LsGx0r1jce35ipgH?w=a3NDc! zcrWR?#|L?{gG=X?7YDxU@wVv~5Pi6vykAwBy+WLD^5}-wfA;B^e5W8CU8VhEJ7gn@ zx6QeLDDwGgt5o3co$F&%>E-Q9*wefZK8U;rndktW-6Tb(2N{zXi&}e!Qt*cHEG$myZ?!u?` z))cyH-fv2g^Mo+;L#tq&NE9IODSGXgV;iIcDg@PlIXLMphK(!o!fackIu3mr1aal+ zd@%6P(QaI1*<+AZEj8MGbix<(#gS(W`O67bL($F4FaD|sb z6M*IH7c+noQCeFl)lFQZ53mMPt|LQk%|-lqDzd^;;qs2+eAKCN+E=12{*YqY>f7Nk zcy!Q`x9?hU^y;yJz>aI;meb|^6!vV}TG(5wi`t-apDc4$&6$}bA0RlBqb&QrhkBd5 zPZrc#6H(*S{r$TeF9I!msjImvPdhsFUbv#>rg@$>*dfNhBV_y{?lUA}+_E-$Gyh13 zE>_swXX3%9IBw6FDZ4qf#U~r=>;N_V%#VvGX$VotXQHgMdr1B?1sVUn4jQo0sIm+# zheZA8-vj$DJ8^Ex%yu_b1?p(79Sc(*gF!%gV|Xq3KufG>mE>I{1nk}G0YZpvkch1^NYv%Kb2^LX`wpvqM!?mn#j6x? zm#j$@OWKuM%1yu~{%SYdGRGk8{@Gyy;XH(TBL|Hut^~cw);mojr)g{wTp<+g*>L{q zqsW1#G+9TG!Onhg-8$}qDM^(+yyvaFbj`wCszs*ClYuwGk=hp)*^eTYNPe${Xp*(9 zulyR)EC-3HTKi>rJErQJ=m!NrihAcb!aEDC3W<7|s3XN~{REP`qB=8(6RnMT<+~bI z=nb#jiB<>oYWBlR|8QwlvVDF_d%8Cm(V zS3SOXmT!1s(J!sqLY-PMw2SHHDG`SHlMT6 z6Vub^*_gA1se+IqMX;kK#?i#Ba2v$?K#Xe^Jaw1{lNOe@5|eE=AC^ylBwfXa*ObE% zLNL@}bd4IUJsKuv1vTM<_YTrJAryQ6QrgpIyy=n+j1PdR9t0>WIf2nnCtKIoBqO>l1Na7515*D}ZvLZBLyNFX&wfWZ9KJc)~7 zVd&^#dDc7BR5U!sBMTgtw|om+F-0SHo6u)PVyMGN6wVY*b(vTbAKE4NRboK-2dFbN zpDY}-+u<49b`u9zM->|xg5aXr#{PgvyXYu~Hj8hErg!Km%N(UJLv^Z=Pn)@X{*kr3 zKmqD~_xBH2gcTis5W=M}Q_W3VMfFw{FJ zTaZhedp47Qxb8BI3)l#AkIAAW5D(xy%g3`Ywt-=4ojRMuAJi~8QJ^vqSrORSvE#%? zBmee(5(dCyIxnUb`W$3OmfN8Y)F|I)DnT)WM{|?UPzWJ0O)M1IxWk~{76&1otA*j* zjy%D&u-~53JX)OzIg6x1d+_G?v zW3a*qP){D36kQvmZ8oR1xNJ(|8$1epJtbD)o<-;@rO0g<@B+Uh5jpFKu|c94pcAb! z1{y=sYE9sZDqDhiJIZQXXq(zLB`r#0*F{?JAQ7#(?BFx4Y&mIk$+#8Vv6j0M)3(D} zN{NTWH20c7oAW5&l7~pBYxIHG-gUahO4*z^+Oc)x9-N>yCZ0`)jrg5R$e~C6qHXS? zZT?|%cO`f-Z+}x;og6tvJr;s^4At0&s*Rzh1~H1I)GD7;nOR6_Sj)~?pH$jf4tlu& z67zYW5*?PmNXR*Cp7b-vsdwT4Gbn2aRZL|WKH>)w8{KNAQf+IIHWi1!=xalJV%D|P zmAsuQ)tQ8zK{7C40wXg{hDDCn!TT#Q=J|w18z;b`=l!Pyd}Ra;oxAT=kc-;iFyMpD z?-4jxNmAxcQj3B^gHO-Dy0>YHMvo@BD;f5xrqZxigiOY0n{TL9_euHHIL5aYqpKfP!)9@cR6!qdeik zU5+Y=5bXoi|3-SZtX+P9*g@nW{v~&MpHZ**r!dRW{)^Q4et`tR zDU3t&YtM8_tN3*4{5-z-BYcPIeEZ?23sQGI|JeoF0lmWlK*SZK9tnEF=p*iQv>>%! z>Tcmb9wYwIO<0WI64BvMd&SZrf&@*sSY6g+KfwG`;T~2<93KEPO+pYTZ<{B+w0?TH zODhj2LHpL~2Niaar(<9NT}>~`5z#>7rHDX!%)_I&8-04e&@2WDSFL?a`D!sII^qde z{Sh|X_PRNK5&k7;W};qYK2-ZaIR{~ee0e1)4!fzMB`l@qihO(tyl1dB`Ls`@%f>4+5V<2b$F}k zkgrO#7aO>n1ushNY&@cXI-zNePF>dHATulq}!n@-nN7ca9e zr1G7F7gAO8w*37lH>00go|eQU6JO`l`M)^yFj)-M{^?`7a zB;#ND63;PNbvGMNy?Jbd$rn26j~UM;uQq-W(D}zW_1D zpP>)vzXR^s{S{8?-G7N@|B|gs0+#qK!4&-Mmjhvcd}$nb$+s*2{d&2)OQ)7KuE|RI z*Nf&q)LOqQ|GcV>)lN*9Y=3us$H%c7-q*b=z04#I3-eS!LKl{fyWJ;^5jkP9K z&3sXu(vWVgom<653r&>abPw&c_$CJ2YsR{rt`e*^tKEK+FS~|c-Nw4vR6cOEWF0%- zKZ^Zc*6B7a{s5u4+NtdKTEPXSNmoFld-aC;=>ZMFM=|r`nVr)7>P_`m#+{|X)ywOx zxs3|J#-2P`C(AQ>5z$dD7DnKbh>LhL6}OWNdWxsfU#)<*sDO zMeYV7T0Pq~joR!bjlq-YCZ^3|*%W00a(2eSNy9#7^d^)I;_O!88QEOCn=Qq(VQb%9 z{A|>`jOL}d>8RNm%oNcr=?bJR;*`DM6@CfI%&##_dJwt5ufa-r1Zm>eyj6GBCX?Y&s40jPzb3Zmigc#(AaMz58uhGSv%Sa?D#?D$MNl!ICUcsKL={pi{1lYA zV^g?r3skHfn;hFQ7p1F}$JMJs(k$9ZGeb^u8U_V1vKsu#kPDeYt|fUv2unH^y#R%v zrZ_$w6dB2;DVGozhon0;T8Q2&&4}wmPGQ2ezx26E3zcR=nB)LKi)=e_TKzmssw4BA z@&s{y{ZtHv*2EPYCpy&6!er1`u7U_DMfoeyoODGI?^K^ItP+T2_m$I$*7bAw>8|VQ z9ahfdH$_XT?+)h37IiSD4GOA`knQWQ3Ev+j=ZrG?x@Ex~3$>*vB zQ`H{Yh1h2Phw+N-jr_h7N{?Ptp9D8cJEf=(5vxiiH_n%Fs?D_10$7Z`RZ7>O`PhaL znWWl)cOjn5bNApZ!nxB8wST-vG$4e&%CH_Q^66TEA1**`HJaSwROe}4w()k*`|4UJ zSV#&QKd-Wfj%7r1XiT%!y#ObaFN(BfgO% zny#EicWPrA%Pv;WCCzkYIf|Am=hKZy^Ie;1!o$i~8x~eDpxoIr75fzPQDGSMTuP~) zPqMCJNd&>N+UnnB??p6OqS9JjABB+`K1pgo42^GLpiim__=qP-uOy~D$rBUvs+y_7 zIAshZ&Z$*wOrHtfoVN(eS|kg=n+E;9R2k7TlYGWQgvD8?7mZ$EuzRJZct7>h(R6a7 zr<7A|ubrl7Wc1ZZvDL1;(<%WUhoR3`FmHOd;kM7qWNL5;bXVU7gXmSZ=T{4Us9wS| z3}{sKy}+Y`rkS$#%H{+aOEOACH>;cmVEs4Lkq~qLVdoh2$j-`Aew0ffZJ-lyJY1vDDnpJI|e=bq@4)2IG zRIp-j2&Ac^ncYXiqtg3C(PSc$XHEUxP>_?rFpxRm=kQJ|8W^G^*)Md2Nx9C|GLz{Q zoj^zXHhAGyp}q-t%8cGZ{I2Y5JMIv1PT6UF$3zDiBTkoy=0eBJ<2EhDIS?&M`-qP_+Ag;A+RqF?aSqbT8h=KIJQ4fetv#0~l9{2D4`#dwo+VU2Pl(v+H>(Ht(A zQ0^ewpo|b176NnWX5x~Nvwn@?qARik#91My{h9{_mM9Bqa%NwBX1Ry$V9HIa&}bs%evlb^=SCxcQ%#BG2zpfG?o0XUaTOdWWMdg04KWZmU9jFfI_MSl#_b zsU7Nr?+aB6rxoVf*U_>!<^D{pouSLf7Jh8*;H=ZNthwX+GJI3i^Hp2&7!Ruz>Fv7r z6ED3`I&NZ10=|(&)>U8htx0CiOLOTdn z*Irio(eEd2xPI6@!DCrrvBK}#qXPquK{X#dmybx(UTl%Lf7CeEenLn*K32X;+_k`0 zfuLI)Ix6w{*hY4VllXkxC)rtZ|9z>VY|X>ma$d{NI*G%oIz;ErVeydWb`*<%F5dru zXFBvtsp8BNW3lFMQEUSGuEztOWTl~4lQr5zAm6Hez~g_2Dpj~X0TyMn8Ca?ZJjMr7 zslxHsb8@Y>>2G!DS7!nxuAk?;Q5k!t$w^)%<(cP$XB`LJWjuHslqhDT&(eO0neW8 z50ng+&&8zhSp;%=`~x0F6kMukdB!F%E-D`Iuzg7ohw>Y-#t79!(4EeBz@rMnN)_hH zZ^aq|R5L;MJLdtJ~@df55efJMDagQCiJ2{$j1U{;kx-^`7q<-xEGDe9Z3m6 zXUGZT_kllHzv>*fB9lqbY*Or8Nhf(u6U)WLfi%ot0$M;5K|`=B<$nBh|XR8M_esAcPuhA(p?B>njMc{H;f5UH%hr zyEq=ck{9b$%Jp}JKw`u6l?H;Rd~G1DDC&Zo@bPdUjcgKDr>${+Bc|^E4Jvl}3WQhV z43+q1f+ohgl#8xvCe-0Pz>U#l`DE*OAdNo^k+=4ihcMpF70WXdKTM`C4Wu!KZ;R2R zX>vjfv`{q+Ewn^IrN>+>zYbXRI|H%&if4HU;+>ILekn1u4)xIWjd-c*H>f!3E5O-s zK|c9R8%WFOu?CF6gAj!K9H^XuN{uOC6wo96B#_&r0dTP%2q9nc0;>t%fIJ0keEPnW zyY)^ORKA0XtsW=@Ao5!PE(JpgD*(9l0La(r<>?^bt(Q*)`7OPnWgusRS0~m$#Yyjj z35d3a*70!2H)3o1-|FgdOY{}!XxxT3VymLx>hh&WO1b8~;GSS(Dc8W4P4E%#TlvZnq0NxF8_tbfC|@5ztxst1J9am$$FORgmKQg-@uapey! zDrxGh35T+zKMc+KPko#49o!21^u0F!p=ZK(x+bT2IxaO&iAjt)fD`X3X7sa!2D()Dv5&rW4`$79ZNk)8nX!5BsQ#t0BX1EcF=%6|+kxi6m?^ zJ-9&iB-?O~uV#)_jy<}z^LU$qmm zepO@9P{L{(J!Bz3+U3akC@+q`&uHhfA*xoh8$?SCco%uz=wocL_2WeI7AT;+GSvIrz% z@T%u`XVd;40phBMSOLTVAW?dVH9)%ckW*@c~FKf-(w}6=AIg z`_2I|1qjmvtp*AD_?UqI1tbaI0&xq76S1mf?uYRy=wyK60P6Q)+yGtNZK|FJ7K@;* zQfT;78k|&Cz)2l3J=CM{#7X zPdwTDp>Z2>N=74JBvTq9e;9ip^=@UpmKgl!KaK4hO^y7x$Tdi>u?MS`A^icrK0D={ zle4K2=QXhR1H-13*%+f|v?JFLO9w)Q6M)Fj6LcWV!2gJ**gDYXD{hgkuMC4gDv8z5|#A=!F!3RNvO%F(B?G1md$mPY)kF3RW=y zod!_79`O=L-s=fgt1x@i^5>qpm}JG%Owo+`squ{geQj>m@eKjOGUc%z zW6T*v6BkZpH}x1`G7|f&qaBG$c}D!RiJ}}Ff@m~)5!(&LxG3v zd!mKySqV!eNR-wGj=3qA*=%>q2;0Fqr3tyJuvU@H1?P;hZ-8Jv7{J+{cg}EH1kxV> zYRUqr4G@cg*!r7iz=;)akZqUr5-^hB2E=Y4GM)kq=Kr8x!u|~`UIZfsz;FYrTSI}7 z;hYgO72v6WfE`n!+%#a!0>-WK0i16$=opVJ-E8i;8?TmzUR zgp^3L4%HZM_2tP2ZL?NFuDSB zFmuHNnnzs|vP}(wdHpyoxkdDO^`!&wmhg(0IyDxG?5s0n`t`8jgh zTR(o*5)$%4e2X$UAK$fpJn6GZH+BNqo9kPZo|z$hzpUR)R|WFtj)&E{>wS6tpW8|% z-p3GPHx@ZP8=U>g{o?+Vhe=w=`=lrC`7X4I=tavI{$uWPT{gFPB3Bk$ego<2$Zl_u zd~O-+AS}MZ`S2c3sL8W?9}}fAUnbFE^4a^kh2&&^v;7^-YZGpU$Xwi^6CL4b!%jdzhpAv3%Aj8- zz5&7z2o#LnSSa*siJmAJER;eHb%O&Et_&v5#0@ywWQY@1tG@-jy&h6HSS)QPvU45`9F1auWIjk>mSbCp;;Gj%L-a~X9Gr!faw6t%0^%;1YgTQ zr5hYOei3ZIA-J^{3|4{<@4(A}QIL8-Bt3eEzJ*_XlX;*Y*8qt5z;FddA|Qs-LEjMc z^FbvMJnS(7DHfzjU~nA5erF1ddGJfttALj_zk`?GfeNI}jS4VW;|PQX;3nX%J2W?- z1xX56M}7muI?yu&Vh4DaFbAM#z!4KYF$0LX05yeX+|2+QswY6=J_`uFWGl3X)JrVE zNEqlHhL~+qU>H{bLj(-prvRS|h-JXIqGy0d2^+z3G3XaTM7a=R%yeL60V4yXS*gHS z01U`c8wbH)E_7myEim*gwCO#w0YYy*A7UNz2FsAh+mTk#%u3Ml1AnbxcoN{$thHSa z(@#c7;Mw5-3)1(Gept5vlmlH-V+nd@Al0{pv;g8~AX=cq4(qK#{|-z5)Da>{(Cb|U z$y&V^>)*sIh7{c%1mdh_%h<>5)V9Jdx0Em8`(~SW#0uTv6vd%cuKKYg=T#FBFEumXSguM3*99t!6 z&JKW_LVp1{WiRBE0LUry7m!o-LQbK5f}C;`!RX&`n3Q3E>M-&#wEv%!D}2XI)H6Vb4Q9~|V0I-y zH~=A~0|b`XH4H#{Ag~iL&9D3S4j3j}Bgg#fZJZxM4(-wg{B`dKW%RQAEbSfFv-rnt zswW{o_KshBNXp=C)U{BB(d)--h2&Q{scP2tT`%q(iHcp$U|(!G*Jdg^Xmo;lu_b=| zL~dQ~VMl7s?V!Vsb4nY`3f1*>lHtwoGirBbcBC)q5h)oMf!Y2)n5Pc$dZ87NBQH5`-N}w zjK?GO8zP!~9vIKqzDw&-SRM08Xog~55{xanN)DBchsr0#hi%xM;-iglS$;HKPRLwv zZTl6!dgr$mCNB^dxE$Sk`kjAn#rVY7O;37zbl9lsASQlOl-*hksx|T8{dk||KSGv$ z9MSpWwDEz@Ms=fsvO7uXDB5k}iLSk|U9b8d$;ssRk2pJb)E+qa{(`6~epC6PthU?R z=GQ5zD}PmAzjU*;J1-0I&s%kWzrROaA&Z$>cUdLtEYUeLd_G$(8_!y*>xjh>M*MJ` zfoSSAp{IoxH9_bpZcHSdQ_yEgtmgBaR?@?Lt2w8n`8t88_y_8kz*E$aRDTB5-H>?w z42s>5n0!XnGd(Hfj3O;L($i=$-ej}X=G!Eb(~6e{N%f~t+@~n^QxxNAVq8OI{$7FS zt-o#L*h%x<1-)E;-BvPAG008)q_Y@pmh_VOb&7gkJVsI?>Gi=#Zc+d3*}r<*|2%O1 zzuUMaPj@GMAyXN{l`Z1u&)HL z{439yYrhhJ^R+MUEjYIPO9B3EU*ARa&M)kQr{^UPe8oeDuMEMj+rK;nk1u~E0*5a} z@coiUC0`i=>#qz!I_~FZQ>`44q0!aU_0c;}FMi$>JObt`> zs($NfNvlZXIHCB;sUjnaV2L@J8%ewdPw%;wmiqfbqAra~{Sp|z@MRN+ls_8N#Rszd$Ap^EC%HX|%g^a`M zCo*dmb|H2hsRe%vM|fXA>YhzzD}zNuks^)ns(q^T5@n>JU9?R~e-S4Q?W%25`iOS2 zawv=qYu9PJl-43Fh2f;-DGfyk3VDO}ozgqK@=Dt1icx zi-OZ~7P>l_Si8DLh4#FzzJ`O{{FH9XD(9$hdJZm8WWuVoj^D^*x*h0wUR{B+5S6id z(-a#=qk5RtML0)MU0R~GV*O}D56A6T4Jj2) z*>hHrCH0t%6RK5tQsk7z*@$YvpOS4BZDEC5JGz7%Ag0S|SU!|Yt8go7I1zT(vMd&2 z4$^y+2Sh$;0hY9l^&QF$q818mUHxmfZsjUb35B-4{*7{zNKC=5tAC}0cV8&j_4V-L zi>R9-S=Y9{zFoOiR7;VpuZQY!Ok)zb-WSOj-G*@f#p`hQ?k7ceb z{z7tiP_r#&9h1CH`$}mqqEg7~wVg^=kpru9^*p)cu<{qtv2nbYykKp35YMgIt+Vl&rRGQhd)a8Pe`GW@rcUs*?4k11kHu5(#<5Fc+Zn$GgDcHJ0tu;*VEoS~?f;;~Q?YO{XyV9&eii?{$$6f1FI zyz6LaPkVKyEQD1@QCTXSN5gIYu@hW$ighMUv7X1pqeTrYuQY|L?J?r-vUMT@N;}1L z1L`flTDF+AG|kl6_9*d&Ovt*Gma)z@l6YHYDJo}Ku|#PZ8*H)227G~RndmvoKP|&0 z{}{3r|3o%h1bezI!xwTkS^I5AY zj?VQjl_x~2(`XypT}Re;U@gzEv3~@<@wGlWeSS zQAUXp(lZ^57(1zVii}x*z17sMTqKI8j8XVbB)-x> zWJ*DA(7sigi~J~PCvA_?NaRRywZgh+UsOL;Mu@O!3}@Py3kvD3eE5k*YG_td{ z6@O7CVeO}QIbV2^i%SsA6YUYrV$C0sUM(m)m>l3zb|9#;IvW=&TF7#yL|7GBab3#7 zg1FWBxFk_tnzg0mc+a2JmvCXC<*ZsuSLdk1Ht^CxPh)ib<~qZbreHO z(~Y(V=^3(mmdeW1#r6Q5A=@P~NK3Io9LbF${vm5%F)60&Z9|E7Wj~3SX{N5Whlpoo zM?_00Y|9Miwsp4Q#H%vAXeP^?VsGW=l7E2sNVZ3Gl+{iNx8$50?yVSjxl8>=O?+x= zrO%_Yp~BZ`f{f-`-uUHD&l3V`DbKG~UX{x$AMWsCFS{Pu#oE=Fg?GGjVJB@^o8q?~H9veku#d8e zM2{b#nRKd??Av7OA^JCx42wRIbcw(2xY{V>_#MW#9r-gNIfR6_E|SU5;iHnr zw?=wNpAJW>_yIhIHmPv+cc;~eP_1fV?MIvU>-FE)=0j9OVjpngv7Zd_>&hcpgY@l+6 z4OBBj(gOq+Wsj9+^vkNQyeu;Y9r-!#=z_o@YT#S)ok**zfk#(IiIZ+;Gj#IH$NKoc z4kNWWgPkj78g|!nj-czRZa^Cr&A2WgIq0YoZl6Qtd}0-^DSl)-(W!nOA0DSvLGzKy zSwxR|GybUxoJsvGekzR>FN~1(!rm*>dK3Od8e1W>mTHtg(r59{BA&X63}p_=#l+Pl zOMY^Is9UyFX`)`y)=;DLrBCOdLonmR+GJ-(8~g-`vMWlIdR{#OO$mT)Q&V8u)Ex9h zL?cI-BHQ%x@wt^^*|B7F2BN`HuoY)}*mFn1Tv~&pkS%S2EmpHgQyCYiO*GhIB~~6) zPY=1sZ{i4ymHX5SNG8}Ov9ufSNisxd@S7b4#M~4=p4FGCig zG*@rZ&WmyQ`9-+WIGLQzZ^D2HAN2y>S=YW+Wu$sO$JtP3^m{bh6oQBQi}&ZxK31 zC#daw8*-vo@zUH47fj9yXqpClrxpgV_<~i+{Xz4|DJ4P)E>>+&c8c8OEc2^gptULz zVxl9}tIN)inX$43L8iKNvFJYDet6_IA?o)QVID4_XHJpe#~VFwuCi_fy}7#F?b>9m zV3u;zWbKlATewm###p&B_eNU=G`HfMd!`1k9dO1(gZ7eCY}4cD)k8(XH`Ok@`P_!c z=-{3OT;|BSnj0%?g_E#rk&k@<)=y`fI{|RXw-6ASg(Re=^+p|#7P}^5uZ9JON-M1nt#Xa1z%UD9` z7EP%(ust8oJ`=r_Zpt%|TwIDr_sle9<;mvsOp|2P_T8+uMtvhmO%aYNzwa?966Gtu z>oG#W{!bROL6wnWoGuvQzk3zU-}{Gtxc8b@}jdf{(C&(;(xi zlkBF_5@{CR$CR!iy5&>03f-S*rJ8jXhz4l_ej{oDB6U!-Ug?HhfXHx?&cxfG<|5Ad zHHu`T-oEB4^6&@uK@5@>B|~uuK?kji)_t< zi!VuUPmFmcluzW-n}~j8>-ZN}zcZ=3^z)OEUAGuVJU)kSe_(6`_ag%7oX55_di^}A z_*0>JO=jodBtJyUVCep)c4}4yiE#q!pUvFo3wNontD5sqkE0aaP0YHUvLox|l~vV) ziFFCtFHub&hy8angbQxTvhb@=tL-M}Uf5jO;G*k3D9J9Jf;~9ru;fo-Vtf7_cIVIA zo$^kjJ@c}P3$uJ5^&ozHnAcuYviazpE4rehvAxZ&ci2}h#jM>g@ebteQ<6oMIQ zU3-VOtBCjeb~^=Ai95tKRF|WavTEuw_`ccf#~j-0@D27=`wXK_DEQWDzK3G82ehEj?Ty){L5fbWV}@ZBq1%ilRB zNy*41OdN$6=>C$4jXF}Gq+>r7To>mO#IFHnP{i{%3XwnBFr2bH_R3gibr~7GF=oiQ zRLnPBokv(bG^y}%CMmz>I@BOGv^+ozbo#Y%dnWCU zXXX;v9T2Q2myjjbs6wCkV+l#%wXh>+H=lvH<1W9`sTb!FDuyz9Ok+UTHtLUDTFOGD zf_clgPGt?{QYiIwq;FlfzP#^Sw_ne9fD&l0GJoveGnZAN1G{0ou36g+mi)X_N4h)I zQS#?A2I8K(e3i>5Ny?t0kYm992{%-@5y(%zb)P7eSn~50(b_UZdUmx)BcLo@u)Uv} z^2|wbqNSJgQ|v%V)D@-VPo;R%&c35B&e8nyxKX<55wXWegvUsG?)c;Ec_Xe>8V6sM zO_64iuc|v|-iTk7rpi}^%^T-$8ev5K{D|5+&Knc0@}QNt{awFyq{O|QHn4+{?W8%j z^FoJkxE&F|NxI`}3#4xJGIqrc#wyT0G|Yrb8Fg{kMG&dBbfu>UL{UiVb(jLZ#Q}ANWb~uxA?M@!PN36r_QYwTH;em;i}+m( zgm2u?p~`VdihnMl;@8Xv~!H;debz#54*l*prww4sw z$$E#467fx~^9a)-VMe~Ld`<|cluJ^Q@(8NG%3Ol#5zvWw6SY+oGCFrC&GAi~b$8)P z82tTRc7x)oI9QyX?f&Ar2RSf3M+C#BaZ*W2SeJ+RP@;~6=VgtK)lMjw@og$)Sstv{ z*gL9|Dwsd7UxA5_Z6`b)oFSuU#}65g2>7NcZgP_qHxc9ULnHhK1|r!_o_rFlHTc#w zEK;jN&-!BnQ$TmS)i|?m(Uq}Szpb#W-gngAxQ--~Oid-W4*M*q0``0s`W2hsv#w zZ%W-HM^Rw@bA9VLOJTK^!;meiT{ak@SgY0iS&$RMy9p~%HHjxDM#C1lp)rh91x$5g4xhhTvd9ORQ?*E$ zQVaBON8(*5*L=8CT6K5p-6qkc7_B!NFFJp2I~nKS${UYD zwG`B;Gqx^pljv3tYHAbKVibD)=A*j0c5PS4^Kta&H3>;s0mDw<<}`v`dR&NopKyRCa7wLPAg^o}>8eqGTusW zzsX7LASP|OxNe@D-xeP`6iWd{t(*Lbx29_BV&2659xmB~`o6=X2>V>Ku4cAMXf&8a zvW3a7)m)KJ{|t$CQu|r!7VeWMM){zWg7G(O+iyAH$ozPm`k`g9o9{PZ(W5Ul$(oqjX%HuKP|5M?N2J2lvM9j-+X2}kNQk){#Pzt zrO`IEs+Kc2QC+SRNdtAhu_3Avzctpm$H{GigQ~(adD=z83^cC9Nh8kt$p5fImz<hFc;aXbUfKFfVxMcDYW|lTEd@?NWVYWDJM>dB1@ue!WO-*utOHSIh=<;z)==lmqw`K3@U(eCW3!i3b!`nWidq_Ou^`59)? z^QiliyC<|>d6HK*wcQh^pkKXU_zZFhNhvU#9~||Y%b(&~*UZ$fURe9ILi<5+=Sf)VC!-&RFwa1~{`kXlLahxXk;m|o6zVMlQRyb? zKJf<`P4A;;1iXghf_*ppzZ7hV@J=3ZV+YkJhZH zDxsZvZQM|-6`Z{U=MjQaKrCxh%dJB|JvdnteaQ)9kq$}GCzmitfpWfY-Pl$*Fkkm~ zj5rG+#0)uD3;Cu#c?2I|Gq)GH~Sd3MGsA+pfl5veEL<=K=~q2%Yq+?Wm*lqp-^-8Lh`8EJ5Al7(HCvnVo2%B@_2 zRTw1nWT#%MTYo=Onfzdu?&l`ILjhb&E+IT^Z4Kg1W+=L6Xie3A76g(Sc17-M3Fkhr zBrI5y3TD35a{@1dL2_%e;^V>~io=6RJxCSIzoODd2dsD@rNDk z#NY$zuS*w6x<@o=i`JvuF}GMMGK;lI{$sjAmqx)2Epp-MoLqW}<3HeaoVRdfn=8_w z!wlW!CRP%imB;Jic%{-CO&7)-kL(#oYD7tqKcApueYdB_GjI3fG1RLzv;Z`mKaW>< z@Je#w6DlW8(0%MZ*xq>)buY5`CCe8CJNC#>qc0^_+SI7`FC}462wzG>S1y!o9mS93 z%If>m6ofHCy6HNu;Vh^4wcOn?9 z7__N*;+GOlo0<^m^KzyZwk3~8VTOFSwFTs@)OKf1`qusGudZ_RaF@Tnqr_rmZ}_UC+|KODr4OX4Bt`i?&9=tmN0ntEoDTV#4% z*US7N-6CyC`#^Y6tE0b$!A$h^sg(V7^ZQM&jC2<Ily@(L3OjMC_C&Y0H8n-B7IP+W{v(Eyar0PzH)R_B+94gKg}P=O!pm zh&Dvi-4LM7U-d>d4sy;`G=d4I*)HO5WaUEtGUY+lL= zT5@4vdu2SeD{1&`Q5>ppk}rE#%Asb&Jk(7~)q0w1YV9W#AI1j5@`urOugHfBbdjlA zf0cSdX|KYP_eJW4$gbPf`WBz_H$T*^PaQ#Ad8^eI?SmY~#e+JNRP7=&jmNUdc(B6% z>7mXvRii_d>-hHLj7h%F$yL{d&J(ZeAFE=w@rNT$@V#q8k}7D=Gwr&9dt6o7#N7qG zTl5TzU~fq;cJ+pKi_|9Qk`$9$neTsZ6>iQdxkREYR?iA z6UK2XK4#uX{E(Ssv&pWq`{RXS(YlT6d4H1Lv2X4_pi8F{pRQv$BfyYaVXvwoeH-smlulB#<1 z`>^PN+pE!>DKOe>?^>+kK}5=8gNW{6r*$f~e*3NwcPNQ@Z=*T^DfKVtjW@Wi4vHUV z;B4-(SG4V$9DG8V-iZo0?sj*)reKn9Y^G}?lVf*o6DM@OpoeH z-IFsBs;Wgn-Q>K6cbwRZ<|>9;xlUi;ca6scUun|1ZW|`+3oFp5`r&}edRZkyU(9|% zD)VraORvVtq9df}8q&C$steI}j#VOMbx5~mDtZzGqFwxMaO50!Sw6SyISNbu zDNVurV|Z-5-n&+ne2`kDSl-p^p@%MeHF|0>j9`%ijNpkQBc%JNjVia&OGmiGBQS7| z+ibX(hef;4>q9g*VPtB&Yu_gyMx+o@XZ<7D7C&J8>igu?ho6a*KA`qXCxOR+X7L+dZZ zT-Typ4tS5mo>ZRi5+9K>te0u?Vi6Ip4=Z(dmPV+sE)Ofoa$SBb!eiwtUB9=^-%R6Y zla++nAHSy$<#rE*|4?c1IgWNL*U+2B$9_D_XD2VOXWUGcV2|{vtT!!Dp?#p+zj^~nBWt04@SeWod;_FhA zP37eGw;po3+2$j*w%00}+(i|RYAPb7FwZGY^XAE|2nDY0RVsh-1B2>R$@$Zp8k&mo z+N#s!mM6Vg=-(Yavi@<>J)Pn+&;+~6_SNNiA-8m-wznwm^2wl_4>2QuDf;DjQ(aO~ zkw5;WIPUk^-R)J;BpK6}{f;bpt1TIP`)8AaIC5h+<~Y8f_mB1O2H!sLu5Ac=$SMCJ zHSP@SAT=z&zAM;sxyr`+#u3-(9pmmU5L)(npL*AP+$){hZBNGT+=|Z%*1oU^?v^&2 z{fUuf+W0d~jEYeTKfPo`*IV7BqiUS@oEWCP{T6NKEWWhBkcbauaZa}H% znhooD7KQqGtN1mJExa-Fv8pq2^EeLg@@h28&L%}uYs<{96K&dlO=b&=Qy;73{Y|j4cNFyAGOx&BR;0#d?0ktbF}3UR z+_+xlcGbS?nxCFt-sR~AG&1vuLfK@8NQt>F#2wjC6USKS7qa<&-jVqJe!GsY)Hrl+ zc9PA)WnIoUa+7SX`#suEIx&vBOFa@mhVn@Ek*dai&^9MH){3G>uXbrRg>MJ%(62^c zt_1H+d)HRnffUqkHsYIeImyNs7EY`lVE1bDDgbV-cr}`~65{vF6ymBAj*XCZ-hlQX zLsD{}jN10d8tn`TDVoy^_zMt+h_cI!_a)11I? zL#k|?3XFwztcZ*|@(J7bkC-)Pq7jdn=j@wzx27<` ziyL`vCKcDCZ3dQiwcgMl-gi7&odYE)C%79{_dfQ`kb>a4chCsoKy7#sX zXh%w|_roT}N7jzV>m&?6$Eu);+|JGQTh0@RDV^+r&rP~FcDUo(Jl)yIfs@$DDqR_Q zuO>TE(&c6!-YI3ED}q{yxM20;OIKv@UO*pBxx=0Os@kWbHTPRxCv{A>z5k#(aT}Ys zZA9Bm9VEBJPmt}jugKbN)gFu3-4?p|KCJjyTxn9=+9)+O;YaL(C9d8fzODGq$9qD3 zcP9N}Q?RV)PT4)Ju4FZ*cpv|lEPwy7y%t8ToBNZWh3)j6qNB!bDdnu3xqD&38t;Vj z7v@}BeD9tSMe2S}N0yxM+C#H?VY+)x!8-5V^6=Ta%?dVp?>ql#&iuuzy!Pz1aKCxy z$X^YfSI?QYc$U|^b1O{#9n(phIFNJhneioyC1~#-&Nt54viO46)w3&%cP}VFdT%-Z zV$R-9!$T8)qP?Te)8|Yqp0#;i@`_oz!E5iM=O4~_zj)Q=J;`@x?GC=}Y;?(biK92^ z{OLL87GKy5=VJfn^X5Gkum1|lXt$=tkLx_WMf>F&7&8@%_P&%L%;H>YOtr_KE-D`xDrELh=O(mA9{(VYWW*fF#t}zc6=kt?obnTmPMVcGPS#<%@l@_{1+J8ZQ_sqf3Z_@4Q3L z7tCp1ynXZ4!R~Y-w_smIH z{K;$H*%h;Q&ns~A-gf@=oI{IWc@d}@E^yqHDcgl z;<`-F@=#;NS^EZy#-)Ob0%O5N;d08cY76zd3(h^(`CC;!f<&Q@u;G!!fcB$ygVKa0 zG4e~fDD-{Au(ACXGlk}-B1zXMx8ohF(L`qr?R3Br^fw_dwI*k+FEbW~%(eYiGSf7f zb}r>X05pQbRw1P*Wc*240BHi0P25$r#THp%xRA%mu5HcA@I1*U==VWc2cS|nYjT!)f4 z*kV6j5z6|p=W-hT1$zbEf?h$fbT=`-TWD@YUWoj*-k^SZzKQE$x|Q@&e~SQNNxsv) z6umlD+m>8)nC>pE{7f~%8uDjiHmhop7-6ljQi{Zrm9}_G^_%VLdP`l%r|RS=RW&*`4mLP8WUlA6)Qitz zWW-yV68OMUL_S$6mZnIprJI#It2l!REuv|R5&1llp)FfW7t6287T`6vlM1zj>*HkI5NWrnnGT~Avx#SJ?J{=#d*FiXbDo<$+kqPD3HOV35eC=XOmqZ?5FA7gJH z*JSzk52K{01XO0I2&??2-!dgLL1k=pnOd1rUoQonFwKXh4ABf2Y-2t`tZ(H{=7JetwX@;4bJ0oHYj^bB6u^w&0uDo4|MN<5wKKroj z;VJ8biA($)3A=+k5{s!5!Dk#Vy9A2|`etnwO{)#HIV~Lyy(4MAE@E)TUCz&@D~BDq zj^QG)Xsjq~Ajy@zXkct#QlsKZQqyEhx+U9^-l>2IDmvT!Qm4nYL-w4)-dp6}Q_&b} zS=4#(OxOA7yPr|&8bhdvH84iRuYIf|DloBwm9g8O91=I0HHvR_UjA)%{Y#Q3Jcq{H z*T~`>&pB>g;6B|Umkg_)rm(-F3cD9oEDbz(%>J%#vSsowc|~=X7hOs3JZW+D+lSkS z=k1N(AS-bVK5vfbnI9NWCH6I6sZlp{vE`0lM|Xexo|+vgI~o+_qugr-4_O}GOK}xo zr*7$XoN;V+Y}z{3tB6e8OP%9NrraIQ3C|eEG5Mk;OCL$*Mi+iIn19C1d-Co?4l84< zHiWY`(4HJTc57?N)9wpgTl^l=mFUK>R|3DTPU(^i_Z;ZVIO9~+7^3@1FPB{@y;9aF z{f{AdjUCv^ce7?_xTd;E9iy~Y0$aK6Xzf#5!raBF7H7r?cOGY$_K+=VPuN_A#lL&- zS&_y$+A%_y{fW86IlB9yOleK>e7jXp`&iFX-`YT+vs2D*ohtHw%xR=jNJMeuIG(=4 zk7A`1zP5UlIfV6=Z{``Nb)k+gdii*``JN}D#Ob}}o*fq$Gh?rA$JERGD`@(1{B$$$ z?yi!LIm0-`gX;%Y53CrFh~9Z5Y9DC_FLw_O+Ro6%*9P+Y^1kb9>)hEo^>TFMhOJXY zr*)}U%SP}=P(@*vx3gL0DLdR7>XSPC$5VDho$|MLWLxqbEBDKyB$Fg6_agkByMlp2 z(QAVtgL4MIagVizTdI%8ztxUo^+k;(mpL-d7+oZHq;42DQa74Aj9ODawSjZxK-o=4 zCVp?Rb8O+n!tlb8E>HK$+ny%t8byhs*xBhh<3F?GnkD)_hPLRniVA*T!TrHu^>xlL z$9n_I2gZAK-Mu-1kV3^^jH9DpHa4Spkmsmzm>iuKWMP5hz2?346aL`?TWX&w+~Kk} zP9ATUik=@FCK+2ly*Ybgm-GR1aPYrGlRPCB=kXMWGxxZ^?vX4u~iWZADh+?cU z7B+^mbE9JgV#{=m;Y#oE>>c7c<`DOu)VyHl5yz?hhA};%s$u+*HATKFnOD+{x@t@5 zuc`>D$aGnCC95;ll4CJ+t{#{zN*{PZlsxb*hw^TXb_qfUM56h%PjviZ4y&IjdH(K< zpUW;!ovRB`{57~sH`N-A@HXAjW|_XsR3W2xhyV^M4T>w*1{oqkp{+_SrLYUg}Qv}Jy0 zdgt(gtbtcV!z6Q7kIvg=-dnPRyF01EWqnJ;a=HIqJItICEz@mHmFZyM6;17y2pDwY zu9CfpJ4$w2)&4F&$MRnT3kDt=7~@rpO4*gNEBkz0k>Z=+i-keQnXTb4fm@wzYiYwQ zONl4Yx+l6(;PGsdU^4xo> z9fsZ6)_|>GXJJd=dg_%HOJM6_Q1QiI_K@162qIFhcy@gxdsN45&z`5FcA5}Vm}u=Y zoMX1Ay-^!|FF5iXuarz>-wm`*9q=DwjkX?QjflT~w)6hiQT{zPzLjb5j2Phbo$L&= z#8@U9JH`(@F>v+ilD&%4!6gnB9CMDHC6rO#*^)_Y`QU`DXQ1~Oi)+7Z*5F+BliCUL z$MAa-|MVa2ohmLoq`O7OutyX=p=~k8v&U(R{B^N$OA9ATrb&ve;p}!glpUJOQN25b zJC^gAUok=vN)?G4w_ASgSJ2E8+OhI6<`Gff1l!Nihq@c9QZ9vY_WK*6XY8==E`FuM z@5sK#+EGpwKG73i+Ekikws^wP!}CG?B1>y);^jrK_tM{k+XkNFP-7jF9fuq>t?{?b zo)NVyo1)iE4-WsU;GmVwaX1|d9Fl>jYKO~5>q7XC>qey%^LMFs@r$z82QzvDO9RX2 zl-Rpwi>3|a$f7RDLT414_hf%CSW~b2TozL}sW435Ik?N5SpRHw!#kqSo#BqxflCSo zLI-9H%ok0nf2BIeYBV&WwfTzT@>oksXRkw0sB>5y$*{PnCjJ$Z(_c8kJta8%E~{#n zyVK_%*%2Mk(_?Kqr#B*g*ENg1fiq7LVzxmIb6reAKBxXM5)@%jnkV0qK|7 zqp6Kzr6s&`wqoO8xz0pa8T53C-D7Nv_8bEpEx#CwL~ zl;T8(=tkjuF01}Yq5s@W_R)aNQdPBRN6F5_y>*Rcjp>$_&Tlaj$DB3V{FYB?IlndT zFK35-YfPW%vLW$@-VxI@!Dg-H?Wy+$OM-1LSF}bCPLnorugE?gc{b<|mL;b7zYetZ zSXhICmGkz<{uNj@dTRNV%~j4ZK|#h^Ca;1wP-E|94eTv+7Zk~ovI9Fa2Wq;UvfGK3 zfx)2RcoR3!D0{^IXj#U{JSz0V|; zQj>RAQlod**fr9|c8mrx)=C>2B^lC28*c2rS)ccb){=dX8KL-Ar?vFqLrM`df`!%1 zCv@61*?rz!vd<0CcfSNn;dFQgMkJOq?`B3&dqDU3 zWc{b=`EIjUNcBj6d2m;N9g0g)C55bA!)!Bw{hS z&buqVErY)`PA8K#iZRLd4^{D^h^~j>x&ML?9?O?DmV@%b%Xm5*^M7PDGv7YIHxs(( zaL#CqKPBw?_3)e+xVe*N&va zv`c0F%d68^jxkr;!Umsd?Hd;Tik4$Bo#R--F@_0KSdQ1zSX*Tnd<s(zktMG{b zR@lpXnPIxq{@@ChBiDud#$Xx=#uVH$N*^W}hS}nuRYi$js*I|gWL9u2a!i?i!4P)* z&BFIL2bp1Im%TfRG1}HjFDoacuwE&y=UDEa#Y) zkaEEgG)3xzXT#`V`@6w$%PNEJF_po*WIq#}^0^^c_ep)gJoa3`{1HYMMl{9~SMkMY zeb6*cAFK<}2c3ndf;CergEi0W52osNnRSKynfZRLbv$2}J@W1pM!Mc3E#!Ko9d^c7 zucO`RqiHu&%=oHyF}_Q$Y75P(dyKDeC%(iV2~ZBh_{qOoN0|>5Ds)kP?W{F^ZR{qM zIdxR_;YTWSUIONRDNUChRxACCVKM}4e|`K~fBn)62C8nHzIobCrdNMj$LTPh<8&mQ z<79-Vv9gn|(nr04{@!_)y&~=n?zQI3cQaUaK^n{c?A5krUbMbh`~=4FfLCO1@`~K# zwkuvy{C4ewuJ$mxtKrWAeo2(c&@A3j&*_-4UsaO#qK)aD(&!aMT`Y{$8kp^lvMPns zSyvcYcnv@Js}#FU>SSrX?KW3hZ}oxi^}9Uty6LJXrTTNO-c(D}t6f-oIdI zt^*lKkr*Q}p3yh+6unF@o7>;}jMM+1%Oh@UP71|0WA)8-gxCW%=B@Lbju^ew@j}0$ zIVO_s`njN7QpFTJ8f+YLfL27}Ms!MY9lX5SuM*h=RNyswRy)?ciu*v;DRpCl=z zt(GLEA(^A69h2ys+R=tgX}#H~csaNQu9Ta7#hV+$D`|>QHg}GzZ0?kPs7gsR6~qKO zn5>MHHU5hV4Alb_*J@9f^}LtH-!hxtBuYu+_dH8)nxm-K-rcEhb2RGP&e-T{vwxJk z+&9h@G50m!>9lu$!&N(v-?NC`RJ$K{PSdw-jiw*|cLsmUc1)6k@hx+~z!k0djJdB> z%Zpew@*?hfiS**$bK1L!`Zi4kW{KIaig)j3)Vf43eQkOaeU16Cu!y^hxgS~4puM~4 z9&^85_vjjaf#J0SnvA06%ifRHt(9JkQI>Y*j8EbBEL12~riepr%zX(*Ut0E-SUOk1 z?Z1DV+g9q#U&e3sR06x-D9y~2mS5_4c+DgEA>Qgdsa-t{EPhC5+WC5e!&)WSy?8vI z-}3@4zUrl$XYXaYT<7FPyvyEgXRmm-l{I;{m8z5dwZ*^C&D)NjV7WtVxFc6PvS+c( zKSxp8-?cD}-&FPopSxvw8h1-9omqQ;na$qs@@`vV>)8II*7X-n2?qUUVfZFY#FqeT9PAZdhNaCUu=F|Jt8#y1xXg6)MViWbitsb(5(EridQ^wuhOH77A!8mXI~ zp~$La=HC6qJ84TKtAZ(iFC2dYkA4FRhN)!5Fuk zk4v$Ya7^m`6;y5<=LQMnPJ>m`Z0Pz+2gd@ z-{|T$j$BnDZnzLvTvE&!{U!l6#ouf=L>VK@c;HR=4bAjJcY?(gPLL#^mp)gkQWS|6azZzYr+e z2d>LJY_D+Nue7>+G59^sjC1qM0$Tm6R~YpNr2HJ1+mxnIPOGH4eeg!BlNd&wY^XjB7*{YL#1=r7WDl5)+cq;eB&j8U@&ddk9z6bNOGN9{1= za6&Tn_A9Q@+Q%3t$JnR!@lC+8TB_e2p~0x|=aRa{6uvc#*J|Fj~E2 zJ10aAOKpcL8ouZ=0xnRRL(XB2r)gR3WiLw`1p}&^%cg>}(m& zS155u2Qdk$ z1xCaJLBDz93U7Eb6xY3R#EZotdO;=#i~ViDD=cpG3J;aX??{CAB_z!Ee53vAvSIsX8IRq8m<@czV%9d{YUzYg-blbb?BQ; zP}uv8J(D4+cv!Ae&M~d*HwbwBDH6>gTB4b!P__!rI*rHl9$^lLS5B?4s&D=C(Us~E z@}2cnl;-^wwy@t=_^gW3|JbdAIlm*8YLqY|=|Tu4ZXfI6NuA#aCp#R7oWqc6o(+!Psf2AZauh+DDzG^!QNr z6O_#Q9k&T!F3N|nv?+)XpCD+`P)!+vk}?`Bk3Ei6Gr*rF+*d(qVsI&}k~%UUbQv)( zfRj-UkBj>Tx^CF2H|tCaN=0>>qi+h5z6h-3m|AdG0`Azd2mfNQWsK4Ffvn%S0%27D z6ezg{O6WFFG6t^r(k7TFC~-|d92*0QcJ;#65l14i5+J%!zl{^uVe*K$I%lsVL<7N( z!=3SXbRObm#qXedKf)ddk|@LoV9bC8X-0z)8|Sp_2z7Oy`i?HU8LPek+U9{yUUw|ntw!oKiAi#*u0k;i4 zq#i&>`V1eI7!?c7_zeQ_4rlSKe2MKuydW*n* zRuT;04U8P*iFWAG#=#F;=3Emj4mMm`NutnUTlL#g)=Ey98Bz2sq|@zBSG4$4924G( zGO=;{bR$!X1?EC%k1}AFxv#;x?Qbhu%*7mD)SX3&h*qyS$7K-I9Rk(sZo}@g?wKm^ zB<~Kq|0quqQDHOC)+3*Y!{xy8xzL2LWY1G|y!G8~oCX%tOU}^*E>juwIa~ zA5m9>6*a@4*6E5x3R^h%D1R4^*&xCrDfp0x=abh;6YOrUFdNHcF3M0$hu(Z&f*2)a zx?<~~?<3-e`y}`PQR)#&iCN{2S0GZ(0!}yxTdY?+P{$&2wLl*o#DWuqDMRwh8gWMe z%KX33YFiY7M+hX@6nLP{FMOarADQG820HqUX~nTp%~A*~61HJ_{Hpy6B&)CWRu?kr zmR?_%H=54rE5UE8YUN5bR;8gKfav1vtklK3Nf@iXopFRZ67YSrNuiw3MFjD1zlur# z>JnO4s+#Ct>EFba3zH**8VEdl zW5jUu7DnjU3|4GYU>B!AVH(hEJ@Xp7wP0Sg6nV0;qVockI|@#tJ?a1Irdvt5i1W=u ze9XuO%K0W3dj>{03Xfw;r&)<95-{{Y(??(yJYZ(@0dsiaQ21mheD*qcb#Ar1D6yun zC>p+On@S4?7SRIHaELm9aC=abv9z7f7-u}Iz;6bxs>vu)sWVX1hTX1;Z(7db8V2+H zU+AfOQVtl|4X&J?`HB|j+lnkP^gmZIn_G=^mUM%!Xt6Fs*iBIf0=y9*`rvu3t6;q} zLbg_F>lF-E>Vg_{^Fog_~{{ID2m`OOE!|(Dd>N#c9 zV&qCtBjEAHoK<}BATcrEDGlO&!qW%~M(@PJPmx`vfU}R$nREQ^jsj$gtdW>S4`_)E zmBRKu1Xjo6H`TzJw`)QBk4(-Z(IYiV7ZI}8GeCL_kPrfUd$u&9hPbg06eU;&{}Aws zp?K6wgvG>Fim7Y&!eM7yYOsW+ z9J(qegd6!%&31wb2uyt+nj3{kL3l1_W=k}{_O0GK%-2|&gH4U@M|o~?HS^lwbkwH- zYAP$z&Ed#BFns@-S|9+4hsk#z)q|Q&iCE)#9FiAU7FNgtxi9j+NNi5|YaMN~Wb23ZW+#n~~ACAY( zkVfZUGSyAd4FT|-9yi}X{M&w8%Q01hx+yDV;=&){gU{fH(=+9qGP{~Fu7_O4BJROa zTH)d`h-ps$x11Q$0S=Fu_}%6>f`gZgC!2_sQcVv2RBG01`EUZH(KwPz@1S0#`Sb$S zXS_qe^n|Nz0^W@RR^aynR!2zy7}&Ph_cFjWB#^lfDpGE=akWcej|t6`l)kRMsP4#%nY<~1DGPz65-MQ4G;(*>&WF? z_CstP+c+T|dyzYep+{l_>x^8fCQ2D>P~ZZ8RnX^O859Sx8`n&tWdn%_K@9478a}Wi z@M8mO77~&W-z=hKqDA;N2a-JoJ*1*4qDlT$;1S~2P*{4g98PA25b$!?<6-2K4s`7* zj{f~LD&7^Wfit!T*1I+?QdSQuYuv#Cjle7&f>#xINDWxu#gM=-$xwZ z*r23xKV`UsYy?0rrr>>QL!zk(6tfVFR(uE7{~6%+BpfFOfnmDhpG3I?NGx|R0JQ?) zAObWsBM7;^Vz_t9K-0ukW?Dyd(BZau)Aa6^poH^a2m?FarzqFsAfiz3c05LlYq@X} z4Z%z2wQlDhF!X6K^k<>nS;)eEXlZti_I2)lEGq>f4ue6rraVwL+>`7KlsiY@oGJQp z9Uim2XASRf10A0Vxz_~h!rui+ji_~_RwayrUP>U-sDE_CF+Wr{fEU{W5&$6QEtun0 zkJvM1+izZ1E^sx&S5vnO(VdeY-`0mj^-yJoS;HNdS zqzT>rleirYaMVpM?Z*w`9S_vK8CsWJeIrA0!2RJ3!MgMh`;EDK7-Q8(4U?|V>m=X5 z<`vdQV@~@4JaXwMF3DfSGGdTm&%vDYE+f&mCgakw{g`;qNvf#y328$89$c=%Mz((H zXSnP*N#*Wz+8vJ@%#D@2PjKZKLcuk%!mD^zy&o9uszK0{gu8VnT&^R0TqX^C|>$X&<&5t``98-ndY1_GM+w=A~tKgI3`AvJ9guIO99u^F7D z)kLF+k&S7mK?77Q2q|BL%N1bd;4*v=;BNVD!ockZ>dwP>EN6h+1PgSmz~xKi@+L^e zT1A$ghnajtUmu;IilWD2ZKAWP=e$Bm)D1z?Vq(F6f_AYHkG+W5{KQN)pQO6o-%?k% zufm=cGuNAGb-v6XSl6D9Wj;JXB|M`SbX_9ieGW_Iymdq13@E9hROmqeGqi6$#3|E7 zVYO1Mwq?3kDCa}c;HGQdIB7y*G(Ny`%OG$-rQW+_qUwd1NPsW2ENMayiVR(B7?m{( z3%+y$2N zi#Nez9j1GW=$*NvqfkB>azA!6_?S23OGNB{5+k@oG%*7doZZJMvleq=d{|NjC9f9X z>l~QmU|zqmGEe*+yuf){Px3Iw`41kS1QF&39;$mMjfdt#vEKG|&`1X4b{wQUg1*y* z4Uwz`0Ab?r4Z+DO#DlnZx>38@oE*8m9GB&9_Zz<-i>29bz{Zz? zPQzYEs}3LJ%fVt8oR|&s@c^0+sY5>hB!%CeJ26g}91-=SyeMo{N>gPL(xeG0BD)^c zriuj6tXvH70-P7Qp$mQQLPZOGfMdFd%5^;_CWEXN32Jh{fMfj$Y6`91#z$pJ#(E2= z9PoD?y@`r~MJ%}>FY1jXvO$b72d5N{AKhTQKuGk<-zh%r#7NaEokCF3(l3!Wgz-$4nkuF3L+BD zE#UX};Wkj#4d}|clHYWFKJ4JqY_ITmGt7|_i|{=crg)gSU}XVLbf?3o2-oaSAEpBBr!&vhKokwRLrPKP2w@V(VXOh5JwVf~k$Lf9&&f99;(04t2fx@=gi%nxf_oomQ z6sFmNaCERbt{7*08k}Eh)}iKCXeGoTE$~p5MUnlw8{Y6p3)c9A!dGtyd>!728{?*8 zY15ku+bArZ{~dx!!<&jM?BK4mbHQ-)LEPJSLvV;O9<6}QIK5y#4$0*DNyOXyfd^_M ze9{h4*Q`uwy1pCLirIhz1LY*X^$(r<&FrTaOi2z}Q%Y8hr|1N=F~%zZcg z38@BuQGKn|4Lz4Y&&yyBalC%xDnNznYOF&+PK7mOWrW3>FG3{A@b)=Tu!DSr-PXDX z>i4ZAdZ|$b%HR+B@nEJ%y7SCgVoT7@_h%6pk+#ZzhE&9W*Xufn$bE46{6FDA9f)){ z_aYdIX!Xn#Oxb-OPm0^1g?RXC_u7-x!tywTxB0{`i5vjB$-zMORc0mlhqbdyp%?sN z^&u4BG#O@LI1FK@gLT8V_(1%ZdXA93K}jvd2F<$~3F~QGsK@oF%XCO{t%c%MLVG*2{QA& z(@(&D&n!YQd{@5gG`t4d<^(ad9G-GL9B%H!-u+EQ-qDox1gTt~j7!XuUSUe2kO_-ZwhMfW(|IPc&C^;{OHssAs;m28Ci?hPlXji_)|bwM0+UxG06AOjjvdk`Bt zkMDQr3s+G(PLRi(pj^eyVdu!sknP58RtqLSj>z|Sj78qTpY8+65Use)6H-#+9QFz| z4D=uTbm(Nkwt|-3W=4We>pqTYu0EI%g)@g3xAK8HYY~We^b;W#7S}xig1z)5`Dw@j zVFT^3fk*m(e6vFg{`X*Z`VwJ({{!_!>^dL8CuXV$uWLc+=M4AyrE~ZO@VY%-?> zo7go#Hfw3w(R|p&%y{h6Lo0)8yBSQvM%pUEej{*R3Vt$AQkvUdmZn25IN1Xuq3**4 z+7TX(3Sdmm&G?BJE^*%j`S*#j!Ep=?57ZGg0k@lMAk_i4{e4ol`p_Sh_+y~>Yr^t6 zeef0MzwvMeWI9=CU)ynwgdRX?=Ns^$QXl}JuI^ZHF9zwo$AMhBUpPVOJ5cN{K|Y{e zAhjOYEzLkO>;mFNwMdmS{sm%qaDyak_;pk)T0En{g_D@)dJtU!E3_{sqC$Y}jRTaq z`P|o>GG;e;c@4^H^$Ztjog=pH#iqd78vUS*>{+QiuW)yH{O>`eR!K)2+z0UP2lL_? zzY3DnLj~_gL$&Ws|F44g-?eYqVak=;vK`PTA^Ux7A;M5Ap~;?7hAm_|;$(gVY6Z3o z(WW3gPy!F?g0p?l8SBk{uPJaOM&e_^;j3k9|)Sr)FlGvZ^JcaFXFu|II-E|T^)PTlC*d1kp z%}}6r3S}7+{_XyhNPkqxQNRGv_`JYX5~;EysrSXx?Y2`y-3EP_oi+ zvAMh0+T4_v#IiHZ9#QRc*jY}*3iol5c=u3(%R~rBz9(T{CnpN)k%UkMT}L(}i_|i& zuxS&jZ^jj;8#uftvB(jSf0d1bUjeMK4#!({sC1E&nk>4vm_>>aq;R$)$df5-Q5y1S z6_T!g56%#-vOhp7_#8%z14Zd@Y^bd;j2NdLCi6Kqhv=EWJ=pedY#VA3F&-^G$T2Cw z%+fs=m>caq#?uhYEGQ2J#xg@9s-(ABQq68CqBrAZR4#G%GZ0_tt1vkOiT~Ba`YRu( z$B{kxBqWSD0FGufy2RL*07|?95uL;aI-v-Ps=?E7FofKHL+PV1U<6mi$fdm<|90Bd z(k9gQIiN)p4^QeS+lX?64iSaalsn9jIZRs=|BO_Va-3_hegjijgAMdzj9>ZzB76t^ z$km@=lOB-&9T1aY1LH2Qlqs?fd_5Z|?sI(SR-@9BY;nB^)X@NY=|Exosu;VNtaq?a zehnt#hU95dq@Rx;_Q8fJ^ne4IXUzk}VbBqWRNu$LD(2t^{9!@k6v)gBwQtAG7g41l zb#hYKev+^U1lJn}*o1DEA?g!4W+4u^zeEIYfVYcC7VW4bIT6PO2iyw54Q4NmGx{@~n6{9?ELup+}?0z2{0i8sq#TYh{Mh?R(6}E?JG}H{$3e%A(Nqsz) z)H%&%9MiA3^F<6%t$6cb97JHc?!8OnfY)`z%rfZGREKoP`Od*MK^+UGhx&aT&R?7b zD4eiB#giy+Z%%RFtWL2^-S^WIuzg=gV#hd^iY0UyYy+vacHj zC*070)=a?D65rtUf;)?mV-+RPJr3+ztk?-!DS+&bn}Y3}%)-rxy`1yfrRo0*cq_@V zww4r_#}PMxEt7aT3nudsjsl|SO-FOm0IXZ!16A~u>GA!Q9JO01 z*aoa?N8zC3qlTEfX4G@9qv;_n5B9Hb2Od^4v+v$PNuL}KjDZ5zVRWH01O*n958xn6 zA&s%99L~n61`F*!Vu;?hywCO@XmtWuJ%SyI2F5&eBs!sf!w-mq;Y^JeZ7X?gM5-fE-xBSWQo2#9@r@ zIerI`)eUFKQ8u@bbBn3ifIQW6WL}3?h-L&052L-Zxt&XIqoUAoG6`RUyM(5Krvkqe zOyZF08<&eb*VE zf@69fZnrL-#K2wRQ~0co`vca1^d5IU;Bv3?NAQ=(aJG*qI2D|=5SN|>75jwJgq6T7 zZ=%rw2O2h1F%RV20@g-(+;j<&EO%JYy%W2(p~nRl&?~a_jzIhe{*EgfibV~22|QH( zqrA9x^9f3m48_UMbrhpR)VLIOe{j956jpj^Z3G-wkne96)a^q^BfC!xu!8F%ir;i= z*mqTCWOZ=40m|(lb)&>MsU{Zv6N!18%f6{d#E~c^JIeqI;;;vLbe@ZHYB6>VF9HhZ zII-_Uvf^Fygp9W%uO%XF;x|Bs3|0d%lhXKVE`rK+Pe|=g=q|}eQ9KIu`7(l~?eka` zKjHxoT_%$KpyoW9N1ErdLKL`A|2$${sZgY`rp2)u*(_>&M?4o22r(8|AX&o_)t$HEq=VZGn(AK&Wr2}LLa)*XSy3%?ES zx(UDO*@{9rHtCu&@Z1c#tgC_*=rOQO#PdMYYyjdoAdd)~PA}vI#X6Yrmg+!p?^W!N zzr?9o7`ZtWHv^TC(zph_1-ZzQxyi6G5GWr7O`QuAX9Es5Bjq0e_GX`dpiZWUAGCUP zr_=rM&~GNPyXF$OEkZ>cF*6hWDiPHk#m#BvrbLY8fIGfBUadz#g`p_KM|#%w8{dJ~ z#Q=AalHZDR+Tx2<3vuQOc8YPRWcxR)_1`cIb`a+oyLjXfdjSkI27OAlh1T#j)~Tqk z{Dy7A6R?PXV`GH-(Yh>XS_jzv5^CI=ux)%pVUyxP;PnH(HK=)IW4}(0RF^^`5-kpD zk#S-aD3EgOsFE**skiZ7HVTr?{(qz8+=0ymPoNpX^)jk9IE$8|d~d7W44~EyoT{uV zh=@nh3}aG|EPbiSMnc&psipDIS^!VNJj-Q%OW5X!I#unDQ6e2T1F|ZfFK) zCmJg`avY6sosXFAItnH9pEatAp zIeqRpa_avAXr6&v4#F2#z&d6V&^mbzP#SJq4i6$7Qw`+2@gNp^gmq%xhQgL%B7ijI zXgs?ug=%ubTUwd zehSQ1gV}0`>WO1Mr2uf9itUWAhGUwIhjU-TVUtJvhro&Y_Yun^=oy5JH1ZwfJ!8(2R&<3dPz$Z>F!Yz6T^% zL0>Cij#(V6N;0z-23v+$MF6tLhvo+NX-Y$y1#dxiQ!$jDKmqF2S;V%M5kJ)YgOR!W zK&xEl6=o6VQZn=EfhoJ0Rf?>vKIyXN`3jq$BkYlSdTw&LHOw6b(3;K-3*Ph29he5Z z<%3jshp|=3{3Wo_BaBDWr|x{5I{;Gr;OhXaWD88{BT(SR7(-`Ld9GANR-|X<89O3J zA;_5t#3+Ri(2X|)0765}b3e+LX2GdmN1L@xoxVBQ)_Xy|RB8rZC4D?!p`pTn3d&jF zXYjZkMq_&y(wGTnsV03GS7G^DG?ToeZ##$$h7C>Fq9WiWvd;;D$w=4uALk=H&8|R` z2^VY6)nD5xXI`xzi9#_s&uK>ob#!HEXDNtIB?D&If`7MgxQQMox{o+4fPy8Yc0piWwzda)kCXxEG$7o zumwCm0h&nyJoZfnOA2f_b1!I%N=|~`$#`HsovD-2nW7|YUWhcEOVB~4R4r>>rm%(L znu?kImlJ0JV$3RsFxyDjI1YzNM^iQF$XJ03be4Zffb2weFmpVw!YyfR_3P!Af5!J8 z;rnZdasf*|ObCr+N{;O$8h0bjn@~Sp1h28-pcGMIccrRxhTc#W1};a!`cdxFWJ1zs zm8y0btm92k^SgJVmPC?hL`mm|X3|Bn9NI-oy<<0_0~thlw_qOWrhWr5CNUre8(?K3 z(%C;{%XFkQKk3orVhz%AoQEyGGyk0-+H9}Eoy#{%BNakvWRebglN`tSIjNVFFc)dk z_R@xkrrF8N9V}z!9v4U>qhL8e*;Yp=#sc6_WG@p7#5mosu{uMvfn=lnNl|b;a5NoL zWc1sIP;!F4Yb$}kPkWIi8bK1ePtJ59!CquUk5G!X!K{YbM&i+f^CMcT70jH~B=<~! zs7d>q4ZLMV)7#)0@1`mI=pXWYt$N zK?M4;lR(~frEVF#fz+Re+=k?^6pVFr_P|Dr9C&yp=@nfKscI=bIS@FWa#LXXwcsv2 z8BZ?R-DMUKhhxC~NMZKY&tQP0DP4jGc<3_Qq_B+zo1Q^zSO^rO3gUV)lcVs0BZww} zOTP|ToYbA2`2(sxqm~?*tRq#LcytR75R7ou6QZ)>&K_9492k>iU0pBx6v{F1hxzKU27GA#xn=MNHcZD#pNmc{kiNUS9|F z1LC-kwxg^VEsXdfo;!eB7WO02tno*sKo~171d2;ZL;*6*I>B%xbxZ^23np2D4qiQp zPi)rzZK93=oLYiyQ3urMs?i$EMDdBM%uO^2ZIi(^-q27tK+dtqtJAk?Uk_eKBgi3? zh1a1htVV5IbM1Kij(AcbL_RD-_*PzVpGD!77$V?A0*&l6`FOm;M{vpWc(t8$p5W~n zBl@r}o5@V8fTlBH90VkjjA83oUiz1M-2Ze;qkueH=`{XbTmHYm*#^TLS@Q#=_mbh- z#kg`<%d_AZ4P>^-R%@q$r-xwPaQuM++lN6#pK)U&>4+k=4^mGfZNssUbUtocg4YY) z#$&^+UCbK;h4_+SwH{cvmH<-%RY=(lZ{R_@_(4p;s2d4zw`HkE*pqz(rC$7?g&qn4I~IaG zHCPK<#xXsHn^(CODYCeT*95~%g|E@X2GVf>{+s(0Y0@SLybF|Nkpp z9noLILTKV*0Kmzxee$Y8Ea{LZm1EdcL${>f3=7FclF9`h(o6;%&kDf|Jj~EOz)=S{ zrs)vLL@XYPLmJb|22;Mawj)vw!#I2q|3dZ2IOvGI1`)3S51)0Of>E9D%g{f6)V9GR zoJ;y_NvWGax+6}TV?6{j*%JWf97muj=@ia-3!9`S{NzG~GvRPx-+xH2)g|1Vj>Q*3 zqy`KUN=nZI9@WeO>?3fC@FyMz$&=1xQbJyZC?&=VX{Iswp;fIR9*LHr#ke*p$*SzZkgl!-#E5(XZFk+kkIIRF! z&OJ(72PL@w7RKwazVR4%4=L+QytsD~95iBgLDT~V#m8_gkUNs>-B!W6@wTDBwAXb* zfMQ=lF$70C_ZrBYkHfkXAmae(xVB@0bs)wEv`?Bj%5>bnn>mtE0wE3V%H!B9{N2nk zwCM_^w~KcCgN<1L7DH#Huc0FRF~)xrkaLP-nt)e^Mv(&~-W`EYfRenJc)^#N-)Xa9C1|zAUT+8vpBZZ0Fl~k`hXERi z^=*Y*sEt%+qsYO5?Fqo(Y>YfFFaUaObvgctgBKaKI~3j2INWOSAa&aSd!M2=48eP+ z7uyKDDLl0MCLN5YA%W_-v(`!@vOkpC>_2;tFW0C%m&*ovYj z>K~-(CwDT&H_RM1Is4cO&Qi#G7RjJ}IQ$c#QG@-S?>5?~NfFWqLm3X(9!_T(_Mw|c z1))VKEAYk?ITrB!Q801Fd3mn?40C}_#bs+{#WL(;6E;GfBo5@^S}8_GhS_o-KYKCd zQoY#`3CTu7vQHuA54BXkgda#T=K?cVa+;a@*B}nYoZGy@YdnQmOLo?Byzd}Ha8(kc zh*eUZr}fq|TDpD&4>$MD^FcO9wSY}v;dOgxq@)g9L5|B`WrAy!p?Gs>bQ*o-=<@-n$gbeW3 z<3JYVudHVBHnXJ(^mDL264rn-#7Mm{NL|XGF^dzmmg#sCOc{kd*zH3zkvSViqxham z_!^YD&c_u;fl{gLd%VU34ZLG%gnmfv<^b?g(JED)|0^o@w4EB-XpM#&W_^%s_mJu^ zMUF_GLSS1NkH!JcpTHcsPHzdd;+`+Z9*wH(q1%c9w-IoYg+$WL;4GNz2VO?7TMAjc z1X+;xMakalP#~kT6Hjna)KJEPjFCXCN$9=E{R|aea>(`yB4Qmuy&_1A3y~y3GiSYp zvAKSw)NhcrTwa!JuR_Zd7h58ou=ZSue0JAiQ{!Y4+V zRZZoX=q&2n0ew);g}W!Ucv<`k^t0!pYMMI<1D;FH*K^s3++d^}@uYmcG>V1TlHQCK zB&P)19Q09l+ZX@c{D%UYW-i%;U~?LKy%*`B42i6i)B%%V39%?$WQ~DT6(HL`yjh2R z>9E1Gz_Hmt#3m0XP7aV!PD_SK4x)o%5l4ac0q`Rs$@dM;-|f^x6`EgQyY?i0h>R3> zL7MWuWY}NMaum@3h_T~NP@oH|3i*;(ee&GD6v{>atFNN%f8H_tU$8jvk|Ik&0|AI} zs4qt4q6{W}i+>VucNLth1)?H_r{?dY`mtv#MYD7=d9P|jD}|FNytGH&O6eea?{Yp; zHy|D>@jR)VHsIg(Rx6Z4f@w4G-AmwINpKW-T_pm=4HphhG!vmIg1bm%t_%sIfjm1J z4e+2~OPBM3T1wD;CW!~6vmYH6rm1jfnjDKS!_^wpnqYHd0FZ|4mb{5oPRa;4hBZw@ z5p^UcuOmlWI0O(!0PSJ7HtmBT`VCNNt3yAG=^gN}rQ3(?5CkfH6YTB9Dg*%=3Hl^E znsAI|hOWl0)g@NXFEG1g;FF=v%R4f>#|sIK9YXqG2z{Bkli?j#=dq&fZ(uSBTx`Fy zH-nG6ipyoiHTNMZQkTvoC4rTqXM$O+6A9iZn${PwxD(HTdi+@bzD8_lU-jv z`LDNIca1vn$&MZOjvsn-Xfgd-{BhFFjkO=#j8Z%W&D1U5=v!Iy>sFOrB-K zx7oMYrY-m)SCy|hkSWi)a!eprIeUd;FSM$ctab{MZn8~>W>YSSwaYjqt6Wg0={5%5 za|(ms=WC{=^I0FtZCaO8=r*uTMohC2^VgXe#(M^HPw*9pG>2DNjXh`bHLME?flo}c zO`EDzhC+U?kdGCoJ^GeyD#aav8O6u^Wr5g+mx!TGRA=ccU`jFHcX*7n{9`ds=z_uPNBTTK31MZ z9TSvYgf>hyt?HH=^QeSnE$Wsur!YE?O(mp&u)DLVgiIeqr)QTbqU5&Q2dzf7S)`$e z`oL0*Mj_z+$Rv*hkyj)c+;tpPDKo%$6E|mM`=`#Px~(MwUQM@Ae>PuJohfgjLEBQy z`!xgWdD>Z!{J^+$OSvHFR((dwAD(>8SR(AlAhH$BQTL5o9)RF$_-S*CT6qIspM+Ga zpr^7rsXVJ0v>beeZ^(u;r?1n-q2ElH385Xv8W;2L*qxxMg`KWis_B_kC|I z^jN6t6XroJCYVdZx{NCG?0AD6USY!b9gu%Tx3QkvZJa^}974l@G$VM@&n|O!u}uov z7uFL+Dd1z?8s9RynK9s&3jl&spuu)K=MNr5L!gQpDPiVZaeE zU~Ps|sN2NFaWqVB9WErmzr^iU<0^&P&o-GM%X#?8aK*_;QxB+5nmQ8a$Wet&()zdTmu6bjQ1h`*Ib6v!(FO?G2v_>YA*^ zky-`Yv;d~|j50sLo-NXZgXlkJQ@J85VuvGNQ^2@NaAXYKz7C<$u)i#r(=xc#VPYCm zr>NmA*xj|3E=DEkPzFv>b+>em{2K3Ppx|7$k<;T6X$1Io7N+>9MQt;5HK`lcYF(b6 zKyv72x$QD;+}5Iw-K?#0&*mGN&7A zTUd8*K@q;LzTU+syL-KJowbx54raQ;?r~D!Q)uPMEHIPAqs{a<6BdMqO-Gyk5{Qip zEinio%5LKk5_kT*b2BhS!}YEVJ7o8b!1NoNIG#vzsDKSK zs9>AQVQDgAC}*5bVG7*bj~O)|a;bzu*x`ikZC1N0U(<%CKY&3?n+KD(a^x-SpVaMb za8P9ui_)xu;$mCO%#+Z6Mz8&T1{Wr!nZ;*(xs!sjbIOzs+_?#%ZHZHqoZ6yp5XPze zzUQcfJgo3O^JFM4EeF*<OOyqsz!b~o@cA}^RL5uo8mfY?8fk9knK&k1NJ5y0& zG1jvJ=04#xu^%KoD0rQwFUGyc{~bZ`9z=4N*-?;f2z_J~59Vvi#T?{@O~LPVlpcJi zCdmc76A=C`2)+!|=dJ}2Ka((pjI=tc%Q%As>C^NuW+m8>Z-Qj1V17tX*>!R6Wg}G~ zFO*S~L+GoGv-IXAU#7ps&98yDsxU-msODl-*iCC~+Iu>D%f@@9=N*& z3GbIdd#{b|G;$!TycYaQEf6k%i;*0aTB8t%Z!$Y}n!1b}WJnS-%Am6YMq972^jI*g z2e!S)sWazw%TzTmuUMzfnh6Qt!uM7LRq19xcQ9BAbLDggy-$L~^)$OIzf2Hw1G3!* zDo#PZ_06RMlM=R_hZ`2vG^-E1?-VZnI!K>_j@g*B!oyWLlbo{T0vKc2v0%RXn7~vS zci;HveL1XaA?E)OZuOqKSddiPZ5(7f@TwBK%oP6CfD)`DRrkU>?7L&(cvQ@Jv@Y`Rm}mBW$Seuk=P z5+FMZ8lRB23|_{@q+pm`kNn3+{)2YHK~aUY0dY8wZF+zO4j&UZ3rhsz-X!R%zr-k66INYA0pwnEFVuU6ZjUi zsMCRZ1SR!bl73VBPZA^q5BF`suQJnt4;RULw!xtvGORI=?CR-A%ei4Ssj_vN<1EhPe9ZS$ca z9Fajl03W8{hB=>xS-gnIB|X(`EabuEkfs~(T`drew%hm&Qf*8fa+w_3SqHCV$G-=S-xgI=JX@lwNUYt3l`sClC-KDppQklu$#Td z1a-AmWVS50+DQ1oc1Ru3Kl@Uk)%P(TKLZjF*ArGjTA(TwTAtC)p)@eg^fpZJ2${VK zJoaEc9T3h*EEfyyUhDUF8#jIk2)Y=E%j5xthe&2=2W{QBcOBg603ypeIOQBh5e7S; z1_B0|9l2z~W`I*y5K$ypp(D0fB1qEMqp5^+5Sb;FvP~B-gQ}YIm7wf2)~;=jqg)M` z0Y_Do<^%9(4Ac;p(xgC8r!bot=Bg!Pu|d*H;h=kQ5ooTi3XydmL0sVNESxmy65>xE zrdohF*$sY{iIZal-$2PE9xZ86OYb03rQm6pA;Al$FiuWVLA#e@!3ESYPt`e{a1Z0|3 zULvUb9v}XI*eO`RTH@y&h_l5Iokt3zwK%skF|dmv=Z10Ffm&T_Thv)bn^Va046bfi z4&60#xT!2NLYjhL)$d`|Rrv|J6p=>dl30v0ke7Wq2umqgLX9Qrz*PqFF?>8WOg zAV!7A_9y(`*{E*0A6N-r>J*bR{SZC#&(yY*kI*-4?aS z(`8)o2wu6tS>Q*goTca$o;_*^)3SmO&4RKE*5>z6W#&3B8P38-#aHSxxY-={;6#UT z-^bwPEx=x&S094fKHz~H5M&bsxy_lA)nPRj0)XKto#TM$7Q>=D5&PjuHsJR<#IL1b zM(M5JX~M27F~!8~`31-T@~-<%D;O_yx-UR zx?b1odcCg?<9aw!X>76VcK3HK@h&rEeVO>Mtp!6EPW;g8YP9Sg?CV@o!8Uhp*&J-H zO`RB7UUcUCU((>$q0VQhmofl)>qo=K~A4@!lDJ|Y(x^oU$ z+i>C^yscZhenoI$8&+C{SG?$u&lIjn0f&Ia=8qM7 zUmm?P&;JsajLUATaMAdtp6HciNqq%B_|kTvyueWEE8F5+AppFYy>0uAyS41|^F#fI ze+!II;Fh!3S@B<@7X-IC%J^pTH$UjAg1MxR-Z4oUsviI zWgj^9*Ohqjn3WhxSK^sL8n+_%_U01(b?jT1~)HnkS8PdfJIm1F}= zvpj6`Z!wrh>`!k(G+@yxUn1e zd|k6|7I)1!G!lJ^QEnUSO#T$x`vuRPE9d{@p`i`Lol`%?tuFPJHJSUEgD%W#u5(US z7(|P2Hy<7IWxq>css`nL&ffz9N<5^mH#4KolXKaZwn+Ilc62RRpbIyf!bHt`?0^Gy zMXTkV! z@=OIQvz*&=8hjOB;6qwTE&Svp$zbIARB!Efo^L3dmjT4u;t4i8Ji!LcFtjomtK+GT zu!+oXFyQbiP_w5jQvMui!qa8(4$FyPqovdB%`@??@1_?2%v0=)g8PXAIhw?KnnJ&b z>!Jy}4BU93rkV>I|Up1UaG9*L*kDsv13?M3 z>6`Lf-@a;>mFN+FI`|Efot-hf%J@Q3`ROtsZs0-V3xgjYy_$vv4#c7hmrNwK}^WHM4d;z$K|afzREiCNKq@si|aK9>si zV(SA;Mmt`1He<9#>b1 z5vv%`kB9A92PeEdS1>^Ak3Tl%aqpcdZN^A5`MINQxZl8cI+$k1iMoRRRBB``A^6Yz zd7f%l8*|==wbj1PEpG_;oJ^kaez&uTeBA+Z?qik$g1g1wk#NmTiC*m2{pXtZ;4cJ) zmomvNX0U|70uEXcga3+e4_-8Jzww!}c?Do)cIH})W9D6eK`y358fGJsB$It9dWW3@ zrGFo=`!4zX#wBx3hOQhR1&5n&p6E^${`mg?F9uEn<39n0^^Z`X+O=@m5Bu}{uP}j| zTkVtS^FxA00&KXyo*Rx5qF#kkaJ)U-|J=|5i);AHJDSW_`bL6VvFc6i(%0h$+j`{E zElg!SfZ{fxQf8$UAKgpHP6)PQ)!GL8l@(x1rG)d@{M?sS(G=D2qkAGDypG-=2s z>^ygvRep*2YUSgNELlCV%FdncKT7 z{>58WN%V1ri1|HSYmiLZU%MO3WbVh#W-`LDu~Yqk8n31e3RMex|jT-?=;t1k11;<;{0|1*WZq_#I&mb5VK(wg3O1Q%lh%u-QKE| z4P;`gaPq}(FuP3870l)lw`V^8VxkJ~X}C~6kPTvF5;{P0v#KWiQ$|Ij;FKx}e1oh` zf-xu)DSm}Vb+8JBio(%)hEE{$%J%mVefgxH?fDo+H~xN`^;MEr+fks^m9h&moeiIp zzg)mX2gpokv3|L)alJp_Qa|8p%vn_tw$I;enDaEI@!zdR#@Wv(7JZhyKn9WzbglUp zP7rkRT5mJUa)v=1&N5&y~+(>b`;9 zUdqHi$>Y!FO9vT#B(m#2*=I8p#O5)UMi!wM`!F+@S_bNGXP`+28r_r1^M5aT>lA!) zY=8x5!J=aiVk5^`+$gsj>=!BjsxpB4y)m5|@2myal9DPq?<$LETXSau$4WQCV~0f2*3WA&9QvMzm!6)E91Q}H0%BHMes=NV3 z)y3itn44NN<`!jK?{z(9+0*nwXd!vPr~9ikL_uChfQR^z9`6@^LgqO zL;)9=Gz8Ue9uRqX0vj7*gDSZ?&er}(50d;pwe`S<7F-WM3RaD5aR#GuZ8I6kW=wbX z$CyJY9J`l|l+)vDYTyrbnO@g+CjKZ8vdrCDI zv>YE&aK`Mm@TuKR_B{Ut_S6m%FJc!)Y=0?;#PdU)y;=mv4**aM)I3i^Hpe?3CZIivTWh&5Yt-^Nt2q7I248_0 zKH*j0=9(WxsuTASr*7;SngUDac!x{8&4)Hz*Wg>g=D7UO(3C*9@M3qsacLbs%Zj1B z!BhU0V6=%i{usWa@z+_-&C~;2CT?{E*t?|$64dq6(hT4s*FK{9%vIi4r=>G_6CZK& z5mThv+HC1Gy^M8{l?2zbTwA?xiHC;VNv{9WSnbI=P|)woIzE{wNgbLfu?Hqfnn?*9kvn3hl5`>ZYV9sBWd#Hfv@MfMXznpolUzr^J za%;*cW*_dr58q&7&|>~RWzhR3!V?7DP%lq=8Yk^qVf`0x%t0u~1;Beh8Q(Ys57-p~ z$it%<2O*+%4%-`?-WA_garQ;7_zJPQVM{9L;lEi7;SAHWI^{NbNQXtfSw9JZp0r)- zS?j8}#So!%2DY@`mmG}(j7OQGWO;J54ilRJIxlCU8`voATr87+SFp8?u~*iOd6Ms9 zLe07v$afZ>y=^!#UOF7F`9Y-1)2{q`HFjV*DV%HY&S?sX?eK01Ti$X9^8C}eSS7o? zWQE&lXJ@Xf!o8{5+rf}c1n;8|vweip&}TI_86OK?v@19bkHzp7t?GIq`DpN>==#wfe%G}3;MnMzKmk8=Et&J02Ou3v5LqGl ztjk}uhx=VwejN z46R9Wv3+vPq~UGM)5kb+Vt1i00kj}SXYK$WzAQJv*Kbzt$ewViLO?Ha919*(??r(2Ji*LIL~)_(?9@(d=o zAR4_;K8J`gvll!25!VdjhXr*7KYPZ0f`Tvryav8)dm~#k<>P z9veE?W^H$}DQ^Q8DU9;Iqi4$en(#j|O{U7OfpCV;Z*}qE70=Nb=-swJH?tr>AuV-b~)D5;K=ktMV2IzOS*dmcXV$CE$GbfcFw_>>&y$%T7;B z3Lgv&@CIwJlq#jENG)OyCr*q|4KT-9L@5qlWXN|zEG$qi5do+=My7#$-)k!b?gWB$ zFt-N&+^odO##p`;{U4A=<`ZZQ1fI+AvORHgQ>Zk5&PY-&_e-McJFNJ2R^0Wpr+tCN z&=3&o*|;GaXWPhJ#i~gjrV>)eLo>JoiUf;5*I#ddLt`;!c!se+VDbpT<7c+Dss9OqI%-h60;UU~d_ zDq|DxYg;q8lszUQ~`A6u!EN3%;)Nl(cXjn=3jIe6{tt8{-AGHmLj4*YV=AEm?Vp;W1nP^KFQTDo` zj5i^4bC42zh7ak^_bi&zKmL7|SfIc9zXA5K+YeaFmYHYR;?bbPMrJ062W;U^ExA4YPN^xQieodTuZ~?Sveolv0CbBuA>f zeN6&S9S*Mb<${K{znIMTPi3fyp1P8Zq}6qIkI(I~T2)PO${^oj2N_wNTd{-9lZlD{ zWp;3_3hzi4A~k#4W`0^zXtfc_!kepI^-##FZL!M|uVJM7`1$jo~0n>9G0d9GZy%Dtxg;f_^nm6D|-&=H>X;ODTs8J zcWK|YWIoZ;%oA6RQdJqoH#YVJ@+*8KxGTvkieDTev zBSHu_%i#Wq-KHAQRa|)BEW}rjE=CkMgnl2#?Q;iUv~tJwZFKmO>=u|4^p)P*9i zuu;+&$l0V4)9WloP%uI)YO_4>#i3?lV3&UQGM_zKF$&cby5QZw;R>Z|y!`-m%piwBiESZt<`_1zolU=-pAlAB+n9!>_``YPa23$+0m%Y3LN|Uz`Hpa#10cNJ z{O-w`XUc#OOMi^_abPkI5N!Ni5?Co9<{@$@3WIq6tzoJ+mZ7gdW^ujE{wO(H^AqbU zu*P1Xb17>u1Jms%QgxlGdBnGmRqh5FR&s+s0pd#f&QHQ%Q7v~2+r1;~xg>d1hiDX- zc2@`rYaRgfl zLGFVoi)$f}!J#a{325C9@v9_3ylMW5|=57<>i>tl=*L(D%wA+d<{iwhRCFbCh_l7v6A zkF9exH-`T318yL44Fwr#3B>T&{M<50uP#t)%&6e@s>GA%4gp_7}TGFUj*S&Lx=Oka~RQRga8UYWCPf zMy%J46WYk9yF5d@H=yeUTTk@S<8fn?nKU_m{7`DJEp*-2YKK_)w2c2Ee@HXF_JeKa zc|mMA8N4xuuwvj7+>jE>8}S1Rd4AFGJ9(G|s}hfwIUYU%OIp%50U64J^^y5jF)=-Z zJQtd;;{K7L&-bxZ{&(VRF+i??ATLaLGgqV3%^+}D-J5n`;KW9xU!S$s75oyATN=N-N(%RoSl4_U91|xt30Cs zUIJ1t*_ZgVe*=}Kxbz0+xvfvtsbBFANr*1Pw(sOxi@8=WzUU$TEk?4h6>djd}(p<5^3R z0WLbgHWmN>He{)5F{Ap$Kr zxU2)0kfemljBW}$Ec=~=B%$NYEM4xqxYs7lEY&KYItZSaj3}xtL|stO_5%SlscG(H z;Js2A3QM%`{ep1N@zBZhfG$g2wZRjH7X?g(S=0`R8=qs{?rP76P3!tt4mCN68J*lU zQb%E?pxTwq_2tsSHEY*mc=jqBg7A+0^%b@uLTKAu>t-j+NuJB`WXw~fkAdLTXN#>V;BUc#H-yn6}GN~ z5sd>lt<78n_BV@NBF5l(p5ZmjpC1dbr=_|Sxt*U?%Hlq=@X=$|_uCRXnf3q4z=!zI zZ~0IgBaeY(wRZ+Fh#UqSU~u0 z7>eL_();?ArfiYHwsOv>#%~wYawFbDi-q z494NFJ9{2!#60i~;@31E)ySjG)0QMSgdOe1EbI|dcyv39aP=YI6bNDSP9DK@ZIREe z%DXEESp%D>3Lw00QXS!bps6pN{Kl|U&kaRsN*L0`oE`aMFOuNcuj6wv;e?lwUB@?~ z8&=I}2rIsg`4~cT&}p5n8IE2~UA1=+ZfdT}th79O#s z+#QRf)G$E64i;P}_eK$dMA&JKGI)TglmC3^7E0wd*=<>$$53uE;Ma#wkKYST9%8K^ zyj$n+AahxV{oJ*d5|3oT8(2>-1~!BdbfP3^DL;ZwjsD$(?N9-GhH>Gk%h6NUMV1L9z@X8cKY}>w1QZ?t#3fbZJwD zy*N^3lxF7{t`1ZwVO5=@(evfDz`64LBCOs|Go?H(cvUYYN-^U#%Byul!WyaS2W zbVi!XjIx6rJ$a@%zshoUVUM5VR|yv)p*G|bWo78%?YkF6yhZ?16_u>oq^Va!G>3EU&WWJm&{1dmEJ zCXNI-@m}=roL)%V#F-?Jk;vM|WriOHLrR%_0T;4Te6?7c^^9^cBd+;JZ|opH&%|_^ zV1tLGiIvIwxLwCCzE%R%Bzs6><5GE#H>3;(W=}(S5Ph3kc8M0p%LRYoo06B${qw{K zqnl`Y$KJmI|*mN?YT zMUYr@Nw}MXI3kk^KY_PKu~15saXrty3)xwD!>P4gdTy#V4-~zX%M{CnLsxbjm?#Yp z@;o^yUk+?`fGf-Z(&t1xzRhfu41CNsEXgtEad-1ka^p3C<_LhN^WoriQm0k5;$lqS*)F*n;38O`=XbQu zc(<#DC?jtFFs$%8RebM;>9wD&xydRLX%|0~t?Ih(|M4!fo$R0fVAms?E4v<9!?u$Y zgk&zx-nZECo~LWpCa?wQ;n*L87r9H@6184e_gA6^WWj}be+9{3>x5IYy|L(xI)(Dy z4-p0D%6BkBJG}Xj#W`dPI;c_XNkSv{oed_!HLm5rJ9DoOw4+3TGNrj6Z}~j7_BuBF zL>Az3l*s}J4BVw!JmQy?%!;(64-wgWAOK>!`1CDY{7M|VloIv5?CVzna)xC*aSy*~ zA*LIC&Pvzfyb8&D429a>IOfnJeEA@;b_-5O^3?{a=;ooALUs}xth$+RsnGfly0sO| zrRqjE`#>_{Mdat^r?BAzOyCFHsBn=$KTq%!m!&2eDus%3v=Xx)Vt^)gO0mQdZ&IxU zCJzG=D+#JDJBHT4r$1zgCHu8@VgED(4kbh!#@s*qLnRfJ%5ZacrIfd?|s<2s^i;Dusby zo?974d?$L~j(6~3b;OoC(rOLhXA2i?@qeWU2I2P{VVmn@MLU~phK7xH$vi;J-%cPe z#O9}RAM+5i3xCn4B>V%W#?Ggo;JUYrRy@!4N*AReHq7sEXL;a0aXFM`(t_`0T;74< zen~xVn_Ht@QkZ~-5j*J+-o;yw> zgc%3Mf64y-RML*YK#(8(Z$3(PaLV3sbvL3KLhI;kz0c4zXBV%}@EE z8Qond#;2^Tb^Km<3Kttbt%D#DF^};*BFSu4i2)lZhqmeOD+W1A0_&AA4##CAM+L7smDw;kfPq4R8rh0i$? zZrE|xFIhiX&Fzt$K0gNh0uvYJ@ZOWkrRrJwT%62dT*6#j!Zp4XpI>pv*97BhSjzUz zq>v;K-U}1F1DCpSY>#^v6T9h#(s)8#!~sPPw2a{Z0u}(|>%%KNUIy$(!4*2h)h+xI zo+&MbxMxxdkv>XSG`ylz9_%#ux0Zo-<7AEZ4Yn5Hy;NFk@eS>7tB3jWkFjxIv~)(l z-!rt!hsRn-A^ttURJ~59a6+@bBFi}o07n{c?!||^Lb+--*`-U|)FOC_-fek~vEw7# z7>PKgH$d5(oRTQYi`M{c#qMHfev(&GszPsBX(|t!wfa!^E^UfUkSe8Vgqwnq3{IO2 z&Mopev6ao3&QBscy|p#gh$StaV;x~#W6K!PAnyLgn!IX5czde4cJt zYKWR2rYpQXy)5J)43r-bcvuNZJNA3CYJls9BjeHz_04VeZC1rjdMN;w0TFNrU+MSf zosGU1T;CkfGgIZkB3a|t3QSdE2;hHP1EY-jrWrlO@xouR>Z z=ayN>#fPG^K`QZDCIi;l0VI4D8*#ZToyoU?uy0ZT7eOL7GWjz_L2T(Z^0JpE4|jXZ z(wX0%XKFBKIVm2w9_zrt%#50*5HSzU$FubWq7Sgj1=M{zyb~oA_a|H1`FC+E=Wsgu z>UzV)sivN`<&-sk)?_}7i`i{Cp(Cr2@VY$z%S>x|yx|`yH`r1(Q_*shbH)u$-(&XX zP(P+Vm^xRU>m%cFSO!P8Q-__Y)Z+%6Rk}WSaWvHjo3{kPo`ZS16u@T!-xd_KPW>`5 zz;0_HK{6-d3@aI9+*%m~Nkm;Lp!p<)` zfVy?7zB(`WdzCSM!uHrUz{<6AB2AP03ud!!@Db`FU=Hw`|KGWPm9Pd_v>y?{kJz?5 z(%3hg#Ofq~bNzy}R0m&Vu-9^*ef)ntpnLRK(WNKw=Q;fD*^-Rc?57#b)kt|q#{1XC zK>;h0&do4-x#+w@!d3-}_&BT#jOueKS-t~ql>!~gbU+aTbr&>n{10P+^C&BTs@C0X z#gebm5hJrqLCkLkL&q@L{{)|NwdNaAzFBOY4t{Nn6xfexLD;q7Eu+C#n4?W|1HL=O zCz9I!%}Ka)J`DWOV7BwrtHF1w_s1n&#A&%d0v@JCB^7+xFQq-pP{P7eys5N43ZP*- zeN8ijQ9@Soc#VHSE>T4MF+`@IR$>QL@LOoCo4Rl`I!aOi_Zvh0+i^7d_qKPk0DR*$ zllA-Y8v^mveB-veVj#-*{s;g}smitVT{{Jz4`XRPeYe)@BR+c*gAnh~BYe zM^osf-8wV32n&uY@cRfY`$228<1VlN{0zRdkTn^_b#BJjB$@aCq`ixS5;Oa#!kuN(z6IJYgq~W@2M3wz z6_ zDrK!;;yQSN{w7*;KTdd1)w z&d^_Tmg79O;Yd}qe`YGS7iw`>eIcAg$M_5Esdny;vaV4Fg*_@#Vx*gXxf-2Jw@$-; zEj^Hh=K*5VvHG!+QfKLJtb)HuJn$OsPjIc`Q4_l;axlXibwKe^p4NM8k^{0bOFP(L zcNw$Np44y;;`Z7%KxqwY!0}fVH;d~fAN*Ug_bR6JL*O@aapjSg21QqnU4$#3l3DO> z4DM?oM14QL_D|d|9=`US8UOgN z-w@6K8G|D*I(fJ;4xVU)`Z6dV7oFt-;w<2?cCgR(j*NUh8w)%ja)={4a?$JcfYZ_k za~xt}?&O*LTtq%yXXQBlh&}uqpP(b5usyLZ!V~)6Mpc<5hbZIfkmI$Tk#PQl$#fG4 z<}WSG(Vu=AsR?f0>YHjyR=c(x3Pz8h>dR$cbW&bgzzrNyf@h|iK)9k~H#)OZR1IIW zbY(H0E>@rr;LAyD!)k_5#F6!8hS5fF?;#xP_=5AxiQ=x?i3Z3|gHHb24)ToDk@su) zK)-?UiF>W!=>a~x2CM3dTBfK#I|$2CL#B8%x-zkQo~!E z6s>4#9py?la@(-#H`y2-sYlQC7b;)ahN@7%W36HdR>ei&D1L`jX*P}{8!PSR4;X@x z$y|pq?!=&nN3Zr)J%CTEJ<_?vQ*MgY<;?LpLC3eCj`&wu{2#wUz^b@*rcTn~AL=de zm;NQ*Kc~B+$UIR(8p1{Vmu+#4f$%cqtt2JUk%-?hT{!O9IFCwvYABh7lJ062b_YWW z^U0Y5Y`!@}h~gJf|Hvj)hB(DwQ8_6O_Tg?;<4n*L=f6l)Ec~^*)u#mh=}FYJ=<73W z;9mz946&FFC41^)(g_$Y06Bjb^e57H=HU2(DS;yD_^NU2W}Z3&C(|0V8xQ&Nof@@x z+0VZk;9c^j_a|ePqhOKVyutAgfM=2MgKdQz_AwpLGgSo0S7C|EGf@OrFj5`&yPYaf zBYs@DtLRsh4(>nIg(3$4+Vb}WY%p;b$khG25sTOE!SPMS{`~Lfl~k-~YF%@EkuSG5 zqOHqe+Yk#Fz;Tw4=#)k$reJ*VlIC?hJ_y+}=tCCPA1qGb?RE0Uy&{>mk_J`8r$nkl ziSOaLv`>i`xrZTs@BFJ0Vgw~b1arz|n7<`}$F6Vob?mZ}QOs+OPgG*cBZOa(+I?hq zi=XSB8NgGpQO%>sZDLO#Id1N9e_6K^Rl^G~|DV?dbxzV8hHp@%)Vu?CqhMlSUUW_~ zi0S>9e>Yh=O)#nzD2P(n#tdb_?-N0w%je`=*z*AuzDA_DmGYE-$~!wEt%Bi9jC6~Z z5NB9TE1@^WtcY$dU^36(Nc zr~*~4wpY6Xdc2(o7y)>nzPy29@NIS9Pb>82#UGL6Zg-O-GEw)AuK3Y>*e(r-9J5W9#kcyIH}7Q&CKM@U5s6+G>yPDXv6=D78< zfH$}fW1!p@R~LvZzD+7J^C%h8VGh>i@8dw8%F_!4)B=o5I>v}4eFV@mLS=L2uact^ zk#I1&7A%>Qw07ll7AEv00jmUTd=>8MkMOgdW1g%QOnw^sC4C%j&G;zwI38%}yII#h zNR0n`yhbxH-GfOZD;~RdQW^0Wk7h8Wd^&KgT<+3&DPKFHizAS6v5gFD9VmPVzIWNM zy`YG@ZM2t;#tF+SnJBByAx%T>@bZ`^|7F4pYf{xY78nh115t{b80I|ga9d7lWc7j5 z6UY(pdK(15k580lmnWSWoc{v?q1M|H4*K;+&`K@R_rGO<*AcPIu%cCUEXI>;_w_8q zABStR-e4*o<=9TuQYPvIH~bI6dm#Gg_&A%hwX*AlEHuN%qu*)@{RpA&R?Me|oj*&J zS!pV#LnRm%eRV8u1`|)AU#azELn3gSKzAqNh(*#>IAQrmnaQWv*jslC7eCzbf5FA+ zMiKOf2z_9=8LT_X=w1v0+z#;!TJaFsl#5O?T}SiI*@NM>t`mtw7}1+fOqBGKG|2Og z;>ne-XdC8wnB|L@Wfgt;hDcde2zwAWvw=LpA@JIH8L-+QMn?zyBg9cNJJSvTHt0}5 zsSYL;u_h)J?q6krylnSnScer~qJwWA%0uJOh7jUp5~d~7aH)*bNfz4T$fl>2SoI!b zJ_(MM4d1mnlg;TQFc)w0Q}UcZ-p0(jNS2gQPt|na1n-ioQ}#~gJt-1eJjtWn7MK^3 z4C8mqNw)mQ4u&o6A;>!DBfayvff4iIU`8%j{r#YTV#v+(x{dj0D za$xbBKU2K}r@aiOdJSl|;{{t<46H6;>@C50>nC#LOs$QlZkJlRy<;%{-1vdE#$!C7 zXzgqeK)T7!8w`(X`Rr96BWBsOA`O18A&6bghtA_HP>DAxSBVi}#8<5Z%qh{lhGF>M z#q8AyObsSxv$zZU=HpFu=G2F%AJkT;+_9`slbdc?b{|CvfZ5<3_ewX{c_EbcvB z-SFLt4L5>U*K)CK!>gTMYXJ%_JH`JWf1i}W` zhK{$Ls8`+_@qHd(oMC48)k(EO(`zV97icf}{Py#Ehq&bZO|9LSQlw^IThAxSgBP>! zA7}a(Va-9l_+5zJ*DS~5aO(bDW8`u_1w*%B1_gqJDtI~oC_1vJQ=^}=pIl?Rn}8=e zNYI1UswYg}I&|R0(ysEotJ%DNKq34)%Wm68@sa$Z4&155eyGjbLP^w;darG_?Er_< z{>uF3hd5*e>znSuBCW&7bIzdpKbYq|1(VQ^BP#@e%+fJ5E*@q295xd<6T|;R7DszF zU%NCF(u_W)93<;p`3e?2pyc!zj>*jo)Ov>4z_=Jxc=4rV{puy-*pA;XW)lAqJh>2n z>*T)h@vYJuad2)iiN^qoJn(?KwL+MW!^=x5{)`GOv2AU57OW>L9#M@DDap-vDZ}eK5Dek z0BsiYvINC-gFPd2toc17m*Hz2y>%rX*mBoYCZK`YphaOVw^;^wznaXug`N;Il(Dck zH?c}r1T7b{K4cf0*e-JV@Cj92-tB5PG@Y^i9A6rg%H1f!RN_4(2|5++V2izq?Jwm6 z!)%W6586rqY-^-(Q7Ll}&a=`w*$d6zU1v&tRA)-}|B_kWiwr_1Tq}4qKR1MgDSSqbH1a+Mu4j*7>yRnypG+W5wBW2*|kXp zkL^08_{*=3!sUWE2LPF8!MM*7o?IKUq>y$Wu30nsg2T2KTJMe)(q&Z)Q? z6XJ{9ofyGBE_Vo+)1>0*cE+2_X1k5&R@#|Tzso8lzUpo&BDOJ9^XacssphFv8rP@0 zKwL_=t9`G|>sQCmr}@4b1m<$0RMqm@H%Yxx!frt>VCGh}7=WJ4PQc2cUMaYH7N3zO ziFWeG`@^G?r`-?e-uqhM^bVn-*v5!Tjsi@ov6^XYPYF%0#2cy;M6G&nwaKHwwo@(T zWhIZLsOT(>|Nn)&E{kv|(NB!S99kV!{f1p>9^o{&do?9Fqldsbe8~G7XP^;6Oo5&pExO+=68}DzIqxCy|hAy zF82|C(uHc}G~X{yol<>ueedRU52IsZt1uEf>k=Y{N?LoR&Z_!b)B#h6kZ@1eVDd4l zm7?aJjiSM3En}l_>QK^}1G#3Z6K&D0Qvto|m(UYN75bsEL)f_FX8sQ+eGQ40igAnQ+Bz(QOO~$aW#cup@dEeW1lfC%D*)=n_Xe(Y`f|8I z#BxBVxXk=D^~Grabc54(XB35JbC8vN)?e@p=Ua%SR+>HJQ`fzW>g(mi>DMfN??y|9 zi7b(!?rL5TS>5HLE5aB;rC&9*&R{3Z#TC?ZC-u1b1XEo!+3&%-HQlyX0O6lzP6FP- z0ZwT7b!Y{)*Zkv2nZq`m@~~Kl?M&QI)r8Kx^=Qw>CjQc&Pfa`<@xv_4?SDpg22z0R z1elmhx=XdDWec{Chd`A8d%AW^-5 z#nIQtNFI=*b_3mPM9E(^3$y&0LvKGzoY)I1Q0NEq>&us5`8(;F@B`*jCoOP|%~jN4 zV&L3MBde|Sco^bi3$~!EIE$~_fxu#drEVKu;SF$cOfTK-tYlK;P^_+#*9-@b$C=a} z{QW2tZv${57mlK%x3felKqsAc0%gzlq`34ZJ~RL|?C4XU zGh8n>j$PkS+Z7x;l*aGp{P3PrFOF;zsX^@6E)7S3Eso_*Gi0NMC{Jq zi4rG^En=wFEy2un^!x4elzrXdtm9ywshNG!LDAe^@R$BUrfI0kp4K>YszSYqM^>nM zX*ha34pXqnZE7-~=gv1AibRVO6S%X2aH-tbq_UgaReqxD}cpoU~0u#iYzvRTDu_9)aal=Ny9=&S@m{biO8Y?1NPBs&4%PQ6Odgs zZ12|h!c_N4aOtbL(+E$ypU< zynz3ZCEH$)1IEpaiG3@@62q+hWTMo8-dphM$9(K}V}an)V;=YWsEY4TI!C$i9H?b= zJl@D4eky4GTq^S8Y0+^G5=aF&2pVr@OA8j=z(?rE6Z#c#QQJX@Jdp5jN#f1yih0BF znvI07eRZV`$1(Fo*9LqlXP@QkxIeQ_S(}3&Oy#N_1k>&%b6%^U)aIL2?Yf(BcCr~% z0oS?o>p;hapaH|euay(esvLTZ$-I-DeV2d|KK8WwM$8175zr{U_QXN3$1t^kccR(o zpI+Q>p)^_X{vDGYga5XH1Z{+GzU-@C^yKXFw@q!~RP20}f}lDp-x8eIGQslW27dRnA=} zj!Df0M2PrlNNet9B6Q3?pv>xb+-)w4rzAr{#P5T~&0Xw&sm8ZsWbc1X-Rk%nks;K= zAE)xi=K-o!%08so*w)(a%lJ+;T3Y+d^os9ldRzWX2|Nc;Ri)jgv#^K@j2vf7HxE|* zb5S=$u~2W1rmPN>mY9DVb;Nh?WDz-tTG3l zLhLOy1-qC()$*!iK`=o2Nz&4 zbS$~%ViHh;8fQy)YKKyfg_v()uqcn8D{%w_aZfN4i7^YPPI4o>bwhe|Rexs^SQj$Y z3wVx)SkJT*2gF?=9y>|sqN-%=V5ZfR!z?nDuvCvb=wK!;9Vh@0U!CqLQ~RGaR^}Skuvjf6#YkNQD&Hgl??9cc)z*i4qO8t#cw{$`u0zO$ zd`2SjJ~5!Z{QGtM(2Yz#On;YP4inqVig^(_(DZf*1MGQTq`N0x_+VEy~jRssoJK6==@*@D5T$;QE#ca z4_LQ9FEpw>HIr}Ofz-hd!x&?$yxx(uABh$QH5JS%tsWVJ>u!0f0RZ&L;)__k$5Dk04lfS`*m-_7)p<-K z38SeFevWqlHfOPuOdY#prPM=0-+qyASCO-dSM_1d4iPeLoI&2u2G31?pJtCUBfGroV7~X0 z^p_BSVl7{u} z!DI~6N39KeJH%fO*SK_4E(fS^C2vnb+N{*xUu)eF`0V`2{v=^6lZhRd*JZ^*v_a^i z6NEwY)>mh;!#TWaXpVR8;4K=wL8EwIoyoa8e>9@HcoL5c0oXbC0(bZX`uGY?(Mj-d zC0DC~&(qPF_#Z5tCWWy1&NBiQ{91djV2wqf6nxxln_%s9XsY+lKIGYeT6sIAQ2yGs)*9cCiF6oF%zNB z!ml9ptvJ8!T^vA2kgFBC10-Gq;1B)^ zc^T^CBmpRN3fZkrehEqS@qvTlFsfEVB=6?F-v=J5Dq=a5+7+BZz=1oS4(weDNp=YR0nj0K zl)tN^@E$%(6(-&W2yF+1LTPV6^su5mpG?)Sh5&EtT;Pu8?03O$P}phNrK*h20EV{P zR)5_%SYn3cayV(CQ;3u%w|}Cvh-uR)nhw-fHg?&VnxJgU*>jhK0{NdnHt{yNraG4AATPTl;8-GswGRs zvuWICz_H`s1QU$npwtWcEgl@Va6r*d$I86D^WlT0cwK6|V}ZXjG~4aY5dgnsB3^4< zOx1N5AROBnyeMxQz1gIcxKwEE(;ub!+srro^@!ZGZ~yOoBs>S(2J*UpPqbzABg?W$ ziV88psXVEA5gY&j$1TAW)xngL&3FNsP}N=Fk^+$yA~#=D;i`evk#tghvU+&zs;$BE z(bHUK7RG!TP^MU=IX*CddnR|t*2C)vBd=p|^)UHD^j0OqhlJ~bm}|qHq{+TRU>J9- z>`L8e{m4^7FX7gW(k#Et#}0ykM7O9yUz(e;OpyRkq#kb)GAw4oq%V92)+q7;2j?Rt zh6n91XdcnGb_zNSw-NZ`kQR3lMgll)0lasw;^!*_9Xhy2!RkbpNxgYENgsyw6xTUm>6IYq?n^mtMbzRm<*?9*a z9XKuyO5uAu@lGuZW-s#0Q)7sqOI9QoW5u0Nch_A?Rh1B#Yt|7TQ=mG1!b9jC{a6cg zF2<*r=sO&J9L_B|mw1#Z9ZWSNl^8B32DvB|T#a(JR4;kdY<0g94GYu{^7ViuT>&O* zgIZcGMDkOtcOPBCpZXi^Z>;Tp3=kSAns*NMmd$>F7kaUnT(Oa1GJNaH#r8LuVq;+Z zDXB|a2zE;)uvDAR6Ks98R2by5_i$@gGA%-0!_+`#596%Uhl_9H^Q3Ak!PCS}h z2RS+K(IoaWf(3dzow~MV0B={~dHk%ee4l74=m{@R<>gnc41{d{tkM(?^|%5oeHTVE zk^d?ACKz0u7n_wRilmZi=NihqbmdLAGnmPJdleBmldBdH@duAH>lUmcha^)@s}SR> zTs5&0igkdKayj_7(b~>x*VB_9|Yb|suW_^o6*QygpS7($ls)5~4`NcxG;y7AhRde;) zxQLRd0x$||6JW_#GqWR;!GvQv2A!4L0qp;}ZJJ}$!A1_*?-Rfww{xg#TKwpOiX?!ZH?Q>!ga2+b~~mkAv4gnL^7oW0~;i@ zpjj|P0sXqh_SkgL9TB)>4?4=Rl(}q%Ro;pFxC4_F-o-j~w8+-a1R)F$70V&3U)hz? zbp#6$sL-n;fKJ%KC&{ZiJ)cf0sz0nNu~VzKlxBC5jHzsX<>`^FWZ>MjbZ}0)`)ADE z9f-ouh1-mr#mdkQ&^s1Ypix4sb>%sYZ1w_((}UQ-$83dFXu6aai}hBkBQ-@S=Hu8* zp+Cg$gq&5mQeze!n^uzQ-Fd$IiSI~UL4noq+YyKPzSO^YbvzG*ksc&ea_Zdp zBIhSO^7r}NIzD$N`1Ejv^=0wj>Kfef79h*OX*a>)CrDzxIw$A4muG5Xs^>A-6WlCc zO$h?pcpBbf;di2EN0$%crI+zd#TC#eL8ob!DHjy7YU6uNIFT933kPR<4y3gb9DOSl zkNhrXSjJOTY2WHB9R-w`T;&4$wvh0m^3=#4g3yf&!^0n)iZ{F&G|irPf~w&Z@O|D@ zMSK;7K<8jp?Yg8o$>4!0kJOSFT%!{puki33c9pi{Y91-g(0Bd6xHp$JH6~>S)0MDG zt^n1p!yb#-OS8Z-nMXa%?PqBaVem~u%O<#}sC+r6)OtMG9Asj%ckIZoA)&qmi{o7x z=ICK6Nx6^#J))8~@Khy7eB>H_b%?l&P+-NJ9o_}xytry<#afOf3LfAJMcZc{QA@bT z$UZ~www7KfUpiVtccMOwBEo=J$l)k2KzoH$&=sU5eB%+yi-qcGSAh+!;n7zK0W-j( zOwgs6jk=DeA@J+WgBc&w9Ht*bTIi@UtwdxMIQTKfPQ6hY3cZ-q&uY5$#=&25$C_(N z%=xAY2R6)Ua22$nhP7938JU7m%r@+-JxB67VJR2}kDV3H*ilaP{mCR+T{1+OyoAI6JDy?H~+uO~E(sVpv+ZSs(>P+r7X%Ow2jr6QK83y5!EE7o2`Ikc%3@u6hB;u@!RO!P^9y&I zZm*?lg!Lmn+J#deq(h=dN|29lOtzKzSO4`D8dv@w-YaM41q{|!A(-3|;ILj!o6THQ zS2mFHr4(_&oS{#~+iF}7)sYfH@)x}Zi5K<9K0h8dsv8P{6seZFAu6Fd;<*EE)`~rL36UI+0VSk`_mTc8#o7A)# zB_by24yF5z!u{!wVj8|9#R6wmjLNoJiEy>N#nC(=2_)6u*sYjgk=!6lcMr&3_CEqn zm%K>1m7l>hNpk@ytaf+X^qK*YEj>Q)=|F$zJE!`kwaFFRJ&Ok*mMb#Fm=^lR2&?&D z!+q=R3c~0!0jrl_&=ow}ajn3!9SQH}X>nQ%f>0r-Ls?aABhATbs$wI14rfU7U5U<_fd(Zf#3DLp~*7$^NkgMp^b?wwuXN&lsNk- z-4Z$z`)gpejAzDc62A`yqn8m64g=`A8LYS?b#KyP@k^>woX)}`bPlb8CxF)F6_O~U zh?qIdV76q_nYiIN@;u|`<70b==8_plK*KXwhaHmoHnZxeYX-Pp8nOR@yU$}X6Nt{! zYGfkP*XQSqaNL4tj#ozrXbN?&;g9R3Ydz36B0$`dWk)H8_feOxLA*mP_Zbn!ThDdn zWQrhyW54P;rh0b0dU8gX$VIB&lSfyvRnxh{8Gb&ZfiK7CPxIVe(w6ImsCK+^u^>cR z6QMilFBFmLd4lFIV9pdeL)c5`D5px3vN6si)k?tys7b4pl_NA`A<|RCe@cprVwbfQ z@RSC-6eCn$OZ6Vny{$OoBv;=^{TL;2Xq=1>C2^B<57fXzCu89sKbRaqh8f4IOR)0H zH9)gvoS`GGIB?I@V`%_`{Ziv~j6KDB)I0OfCDbYSc0@Tk?YkB4siJKo_*(rowrS~( zGiRltu@BnnDFORFqq6N*FZf4?L*r}s4*(NWGs^H-=BIWk){G#{Upf zSg%$6lwaYnf8Eq-ZF;(_mbdW+c)dpWx}tc3vvx%{6vf9OfH(Jeqk8F|pc<*5YWs3C z22Ux;B{P}$uyaX@V!90nIs#&z-*eE`gh5nslFgy_Xxzh>2klQ0ZH7-Dj~6zDP9Gjk z6TzEuN;5hK(PcDWD7Vu!ZA51H5{}-gwmO@}j)zBZcB*r!?$UvO>pB{t+3JbBl7eMT zt=XtR>}o0W1UHz98U8o63OyI<)@34@F%Cdqyn)DTY9&dXa>C|Lqw&@?YqbJ z#FA;YGZe%JRXM$Fy*bjBMOi>IuTsuIB5b33n|(abuXe)mXUFyo9;qv-^}GiYhgm$v zI4@(xR9TY-u4VaP>kMv}4xGb@hl6&7+-1C9_p|qrv}cdG~ghur2M#z}cs0*Py`EA?$=SeMmcB$q>! zzt3)~!|JnL`A1O@1?0iDTlUxp%eOJI&6onFRVwUw9@&NZ)?9)fXQ0d7tLBBm3eS&q z^KfNB0R%5;-Piiz`0laJq@@0^8gVt@vmP2bT$b;hh?roA4Qwvm>NeMOD0Z4UW{&o2I<(}c{WNP;fBF+ zy0!d$%4VviS6T=|m{yhFWPT`8hi$l&F5Mon8Syz|b>F1++6|LqaC2nri}E5%g28D- zh3ZAKPNW9YpY9A%z#%ygu}n-yhm%v4#gyF5Pe28@ky|7l#wgbCr&?7Kf>610*b}?6 z4zzVC-@T2$rXDozjVL@k&SG)^C-Dlt_3f{9#5Bh~D;V2>47mxyw@7)4N?o)@8>F^Z z#q_mEV@%jBW@<0z7TaPI_*1>DSzXEMksiDiod+;XC8K3fI>C z6X6j^n3b5K;SRR__qeJ;&y(CCo4fuH8F2+nbTOe=2VGQW7WkbOn*g9Iza$e91^Fa~ zw4S};;W=RQTHt_lu1&?q=B7AbnR@c(FYdsJ2;t<4Tjc%FBLLo7p6vwokpT-FaD;;r z&FkdM@ZY>Yu9n}4-aV`#-b=zAg2JRYsJdSX*VF6F1_&PO6~*Y??w`ve6!Qq#yYeqg zHc;cW8ai}KBB~>yZsxy%ojeY@J;=*7=*ph%BvJC!yEE3{1qPT+@|jHXc%7GXohIV- zXseT8wO}xtnj;0ZF5}(*eSO zPls3A7@z}(?M7bi;tq)y8N(>QxcT(?Nj6r97t+G~1Ws}uSNL!8FUl5oXp!L-^v0%{ z5Qu6wvs=}}eOz-p({Tyo=>g=sZUwe2!jZ0)!%!uB7j_QL>rudOVx&5C60S;}70UYE zH^BCobt8{{RENZ(N+ch}A9blIA(+IBmQm^j_5P*-U&y7>Ang#%e?~#hdCTS~rxN?d zQrp#*9}Xb&nF?G2KLL}%LT7o$hh+EUh-p9A1xz3e z99DRh11@5Zm=Fs)(be2+w52sAW>|7+R^Tx;)Y#1Ab-K?9a4x-+quYzPl4lj3O>aX( zB1#W_rua*)BkV8Mz@9vBpaN%iT1fS?Rp4j@^|E(EtfZ=No zLzQKgw7c(A<1i5KSb`YC8mH3-#E1?wT&}y=IB-c-=lU+^VcYN$r`UID3*#y_juI!s zT&w{CPDy2#a<+p}@-V~6G^_OU+PZ4jEtrN2e=!VVo&(6!Ya(M=c{;oH!aRh)iNjlzQ; z*(%d|G7D7CGw6_z*Kb(o-4m|>-MSKM$Nj@0v~CpeRe+vH1=t9Y=` zeeTu~I^iN7NF=WI#<|YgG*CxCAT(2HB@|5Zd zjH=VO4S(N?{VbcyyM*yg^#mCM>zsHWImt^btOdjSwmSUgdSf45#U6;S8#^9k7_-&n z{2H*W70eadjUvbAsCHfS<3P8_-_ZQXu7D3K9;`T5-c9y6`+qU^{(()_=idK(IFqyE zw9k&uWXjr}%`=(DQ>&t7thCwYlsOJm$AqJ`tv{&tipiVl45)o)9p$(4F3LybCQJ{y5JcD749ae|}t_>&N?gU)M)| z5P@@^dfOjotsSd7ZRG^v3s~Tgw_=G+^%g7k9xwKXL?O<0O(`xBIZE{h>kFEUo$GMI zh!oV*YOAt5`6T8Q8B4h40a7{?dEV+0l7UT|M(8 z^7We$PdWB|w}}0lHOrE-CVTdWM89nh6esKEeQ|GG{kMr6c{)JWMKL}+oe!U^x^H!n&G-4)y2A`xm8-$8lXjSdBv&gI0#-expG6+k5R3!rnvQsBV9kd zEg;P3cD)oAWD$EQO@9J`Xk)n(w}68g%&8xVsFGXo3SMw{#%&d9X!CnUVu1^GZD2wA zxS8|uygj2lu%8fF4T8H+CSe@yhWO6{u$n6Yo6RehOZeG^0}m-5Y~Jcjv4@R5saf2U zY=AA=_KigcX%yiPgV469{7St%zop#fJIv{xHLg)xkYx-6ms4|2Gp#5&+u2#~v_LLuE9}z+C zsrCRSNU(wY$#4~}Bu<9aB+T%GQZPus67NlJjkc5Xn<3y_8;WzoscUAq>Ba!=#xEc?Sjk~*yRoRXW zj3$ePoD!L@g1N-gBmRE8-Bunu3D@%gGyDT@Ixtq@#90wEXT3A+3gEZa@h!A*_fGs5 zoYhdRlxAkAk!_*9rI3D4;eartZjpu$cd!R|XB3E96@7G#4!WvLoUCG7AAOj8T?W`!;C5dmQ%WuUk_L>Z6*6Skf5ENTi0LW{lKT&n&`Z>E z%r~QmQo4Pm7>kl%uN|C#E*y`MJ^09+5~Lzm%5OT-qJo3T48&8MduYV2o96cO-olZ_ zoESq4>)`H1F02TD^b03v0kWrybEBUO*Tyd>cFebkfT~6UdlIPWn0ZH>ILn(^D>?E# zjBXK&-3Cm#2nkB^pjp1mzA){~>_#oBV4Jgipp;kS=Yn%MlZ-e(vKJzTYSL?x|!%<`gSYV~h zJS@R%B_dwwS#?S6m~LdpZ)a&S%H75-@TWPb!v@u1OUXdlRJlo`fkZueZ~2zuk2-i> zo#S1YlI-66k+Gw@*clOeJ$s?1AhdID$tF!PM*%Z%|p z@Cu<|Wv7JdhI%P}hXU-AwY+g(q%B4QeP9svqkI3J7+B^PDMO`l6MH6J&}gA}d9eEj zudpM!>qjY)LLr1s-7GQ>a`65hekDqec*VMkdLaQt_2YFr(?WBf(`^(}IMj0?pQ_(W zUi|$DO*F%4s@qY%o=xAUQ~U3<@7)n_9r9mWV$^*$vh`7Z;REQLSQPpPh@2aT!rRpy z&0WJ2mCTXbJ7tS~KV|g^&We~Wc)`(WB|-6F{6d@G=6jzK9wuB`*ws&>>B(dR@u+JSB{ked~xM-HGg1FYdPt1mGkZn+0RwBHuE zmSVYmQqP>5R#n8=g$r~Zv4nQ9y5<%0%^Pf#<&`yc-cV!JK$I%^tAjCXH)8UNO-?0=9| z6Pp`({R;u$YR(JtVud+UqBz!nbyI_``fV#dgsGh~t;wjPT<$T_Gm5=?K#O~izu!?; zG@fsnj||)gQv5rXeE*E05rsEylvawL??eIMM_+cGBY02H^mV6Zon1VrjPVAP-t2qR z?Ii_{pyL`xLmF(NfYfI6e&4BNn*$&8T73NPnx&A%tm1AE=XC1KYlN0pZWO;a+9sh> zlccy@wzSC)=O+!|KWXI8o<@5-hah*$a*H{r6m0iUtTMj1rs+Bu|0?$l~Q zyIjc3O}^*Q=mVz#Ra1&zBFA~()J%g7|1sawTG5>I04 z>FGU4_i|j!^*F2&@ziz(kW`nepJ?IcsC4^z<~`?)advMTX)fU2(RYN(>)w;0WF5l9 zKkiQ_4Z#0?8a(7SXKWc9?Uk(basKW{0I$?4UP#T_3Pe=2hin||?hufd(knmaRPRUG z*a-NGd4jG%{+ga3$VL6zV%-_Lg&*FsH&fT5+LPVD1I-7Sh{_e2t2#3@DHNdnA&Gp{Pd@?rp&iFd7zm!6{DtT2x2s4Xpnzj8>t_|B=hh3aX#h zv3DahKSW8*g}#{BiiFSPxV(%xXk=a8@-l>k(>cKk(XHX-L7)iSnW&D?N(8B`AkMT} zPm>_ck=6AM;3Ns5Y7o-)jvSj|D)OZG!1WdS8v-gZ>qGKrKjzID^)_3|fmU7kDy&Q4 zn=zcWTk(ZjkfBLLHtrkn;M}qW98k4?b}JJCg48FjZ9t*C>JaI9Z~crnAfj!eYDrZ+ z4r4k|D?%LXwb`N$FJY}nrbXFFY07ejg_bPpi*mYIE8D?QG|Aj$V;L^L*hZ2?oqM7< zNurH;dBbU*=&nRR{e#U*n|>56=#N)T%3ZfRDn*#rlILM&)oyf@E-P-0o?%g6=T|D}d*h3ZonG>-{mQF0O_!0v>NF6F?qkN)a&}^Dtcae? zY=05jUYbLN7}CwlIiMj?MJNUdy$xTX|MbZ$VE=kt-w z-y%?D!Z>sh;v~j-B@bNAl68W6mZK~^TgpM70Rwv71(*%*V64X$sg zZbMWp>=>(tyV5PBKKGF4e9)OKBS&L|w4U9^gOTu`=oQh)^o9FsV`);F5Rq68aAZwz zqAxd7#wF3qF?42Il#O+L0WnMt3^!Lc=t`zu0$nST;Lx~_Q5K(t<0?Jc3r zRp%dEEnn2OtpLF5WzWuvCB&MkoUjDBdk#86h^hcCIKaZo4cS!VTRIWaSoA68_?&_Y zFP9>}o_`6~zbP?i;Yl|@JB;2myrrvaM)WM3RHX(HJ=c^3!(1(w5`{6%c2v-np$>H` zA4}Y0d@OE&-d?^AInxDVx(uTX4>$;W$2x(VFkY_fjdgG^@fhcPsumGT?zJzmy~3jo zC|8z+uQV0ppKN$hgk=={-+(GqDO)kr(u4=ew5m_Y1rQLrAc;2bZ;Xyn5q2HPlnrR9 zhTVg`r_>WPEl6`6*CbQPDAvUBLrGlSSHO6!h{!_x;~45n^oi7A`c+8U9{`!7A8^Y@ zqvKF-7mID$h-ouIw*thP?PNu_UBo)^6e01Vlg-~7E_U`3dS8YsHiM+2s@k6UwEoY- zACdX~1qkTK4GS*Nmb!@j*yrUc`Po*!-D> z{mkMl1f`6Js>=Lv3gwtd+0hF2-S>LcPyZ2B9Yq2Wklx#d2PU)|{t zzQ!30;P1BfG!8}RjgT*Ge_yf7iPN9OW3LZi!j{etKy9?`V8&};Am3Vmc7vV}S zgF*ErW{r1?SR%@84u&^G610Hf&yFlJOWG#1xh!W=I5Di2pF`iwSbvGtNH9PcOoV7O z86@workvF`0}ps~nnNg0lfkOnFpeUjYBl3$s#T1|2lG02xYqV`-O)$|=H(>EY$A_U zcg>0iY+v>Q=FXX#lnmPTP-t5|IX{21|0C@ct2pHk$J4wJhs;Pm_m{%BwTPYqFc}h>INF5 z#EtOGi(f`~+sGOQNJ_^{H=p0;h6NXuLMK!74!(GyxeIF9-4^M@2OjF=4 z`NHqSzmjyZlw}Hq?rgRG8?W4mNP<)tDu%x1SZ{I88M7wiRh7iu3(=lsyTnF`$?k&!c>vFCC}$hCy-~mhLhy>QV2f(*CiEjCEIs7xUUB zVo2{;ECCFRBR(odMtRY~4^4 zUY)6X4Fvo35r6ub5r4TG5!{2YR!ki4yWpLAtaqL^n#{q--<)6Tdkl8I?4?{Dt8dWY zWv8(=IM6vl7lPoG%@H2*b4CPdEA_s=E9fBRSQXiLE?yc-@#CTfoS^0%=~KJlyeMB= zFh|}*S^nqw_3q6$yai|=x&3Py&><`yMQzoYM=Cv4l-U9H=7|lPiO~&>yu<%Y=AFFg zVMEbas$8T# zyC;|sN&eaWM4vw5qzZK1ZFm$PacKOQn@M7L9zvL9%Ll}>{T_em!JH{g)g6e(Ze`yA{D4+WcWbE0&0{1vF{A9HO)q6$bj?jf+E1i2b? zr%id1hxmk$fNfY=b^a~Iafd88XqFc~gd;XtT>({ZKMhx4h-Yft?(xWZ9wU&Nfiw_x z>GqX1@+Bd|yM>y}V)p8%AO^hnx906!@^to6Zf|{>Q7YDak+oc;mzLyO#Gn zmj3N*ze(IRYYT4RfOX2F>ST?6gmt(Ov`7^Pc_-!K*0nLHAo|4+f&E;zQxxS_*^GID zvf*9hFNS!iPBoWW**NZ(vFZZYQJAW2Ed)U+KNZ0-LTfbZPARkRF{E7;UtG>3?_rc? zSj;NhaFA2#7XjTjv=$K(ZH8=`$!f?&&{W4JvZoV4>Etb^>N~+@s8Ta8-EF+RPmC+pjv<1%DEtNUR^iNB)Oy#A^k>G7;$GG-_ zGJxLLg~M-!aTyC9LRsBg-tG`sFUeNeqKl4wvXLp8AdOzk|1Sdr>zObCiPwcCU($Bf z{I`NLJ5y2a5eNtGHI_O08_RMR_}aS!%U{fft`OmLBY)YzCOys5MHf^j={^i)yXEZS zwd!`GLP$yls@)^Et1j_Zs9Rx}cMmM;B&H6CFhtbay~NkTd{EtArp_w!+;Fh5EQ9ybO+z%ZFqfFS&hd`fS@b*x)X77(Q$uHvhFA3?5D9zi|}bT@h8q%-9N*; zS0aW>*oJeQKG2@{k zadxG=NSY;<4L@AO4tL)gD3Fi)KEVxAKGoo|Cv1nVzYtwTbz*_l{zwVcQPvuWr=`rv zLPlvWrCo?b4xxByKQ|oj9T+|m|ACO&@%{|ohst{^l!fIoHzB$_!1uSRM4y}rP(Y3XBIk94vQz< z${*^)i>lIzv8j%r+=TlOKi|=)+ItZ7C9PyJnRO|44lha#ry()a9#k%GlL_rc(y5)* zG(#(Ng(iQ{QPd9zxibTHkIXMefm~zKc5fVxoooxR<|S*AkK)PxfLe?I?rM4{>i*pWP47tnH?J1-vLqi>`1 z>$%?IH~jr3oWl@aY;t?#9A8@ezQZ)?_4BYINLm5HQcBi@$wzO+e+}cwz_$dQhCMKaIZxxK7#sLrTWHVvD;Q>Mz(0R zxoB?is#vfJmae+VQa$5#;2!)Phk7J~m#g=CkxU%=>RV@5ldFxak=@|J5iA5no#( z_2)EEqh|B*-8#PO;ARZn_f~k6t1|vEc-{lCWUc%79r?!!C#3`2L-RLkZu6agD_8px z(9M)lP@c~DCo|B_hS7L#rZ_a0G4ESuYt3NhO6xa&BXwI*=!R~KIyQWxFAb7tiPF5I z{UrZUbC_T}GnqPb1sosHtw4PUWYfBdDt-mfP)b(@>jp$gEZ#q0PO53BFr0iBqj`s8 z@O#(=aaQSxM38}ms9T3>))Ob{U-RQOu&&2Z+NzCo(yPgVY9a`naiE4bv0*+t+amc*=7(NRZtMf;SBrgK?F zX#+ONk9ve;kk~}9VLgnmei7SPy8d{by9mn^1>p- zq^ZKlt}z?yqqV+)RawZ!t8cmPRdz2%GV_4Wgx*eO>e(WCAeAjg5JoveA&z2?)W>>6 zYdtI3CZ_?VJl4oJ9!_UZ^f~Dj!H$dXAi(+^)4#nE&1YF1C^9!T+BFb=)M;t8=FqQ! zluGt3>MJ@RBfZ6#dN7Rb%2dSE7zrHOeIBN6@EmRvsPp!}v$H%L9sU&#sBw7k_^B&w z#rtAv!{1W3(nObBM*@`~F4{E46dal9IDB^-bCYVpe*b%eviCZ&7x~(o+G*whjQi!aZvLK2i<(Dv z*mocwNrrbqC;V=;VhYQ_nalP+k7w^>xVqxqD-lw6M-jzWd||v_id+{Dd;Fx~W{q=? zL{3#aqQ0?<~g`b(v-aGl9LZDC<5^1FY5 zgw0j_Dli2{%*BQd;+s7Tp7C-}Mb zJo`#+OzQ`M>W*L4YP|^eRp9c~{C}p(em=)Ne;*I^U-^No-9PgG``{{cab7m_!S`80 z@mow^cRQ}8Dknz}^q(>^8^nnEn`rV|EFk($V8sR!J7$Hq%BsjICV+NC)h)P-ZGPt3 zOhZZ)Uh1ed!m@kTWV}8Uc%R5m6lb*Emv(iX`dom(!9FzaN~LTyhavgAZnY{?&q3?K z`d3v3ejDT4G?01Ju$Wa_Lb=_K1Ezj}zgtO%GQ4T^7I|D*Kc$$y268)q4}2aKYObPI z^IGE&9+JsF&q36VV`1{>ZRY1BHgHC!A!*9MfmL00CKj<j> zcNg->-a>f@3O<{-qkPx29p%T;h>C8tD1^^DI*13XrVP4h)d)^2mvwEtJu?)q6z z!`h|Ca4C?xs*^o=#lX5wMzpn?y15-~nJ}$Wt1}j0+)aRldBS`4iT5IGLd`KdIfor+ zInkUqDDl!32ppQidV0mbM{KHF1HrQ;Om;pylA^ZZ871=kk=V{(3Mr8TaSOjynlFzL zEMjt{P?v|~4mYs)KLMxBLsvC#!vR>rLW**u>PBV7_HfvZIh{3c?>bJ;HT8zO9bGD{ z;x+_GpgAg2K<;FQc@x_`2kV1x9(_sbM4p~rbsDOeTY}t#fWW?=C-iDvdsDT~ysJd_ z@y5%=3V>4KVeirAnEp{8@z$k@n8yh^Mo$f8XF& z3-Jv$u_Q}~JKSRAV#L)D$FmOev4Rh;#)(&|rIcZ!cB^Z7D?sKX{uvbl4}HW&!=wcJ zlVW)v;j~xZg>RQlfEj(2#af@bzD`YfRopd@EDTiN%Ucv6i$T)CcBas43M>bb@HcTD z%l=Y7x@-7J?vUX!2k12F3*5Xm)sgjWgsq3C?m`WOmlHp&(AK-N5VqF%}Nowh$NN3!7PD`@Pp)tt}j-L76I#6*6Lf7 zaKr=kAiD`51oh;-f;rM8Lml$xs2_r2g?6-sjh_P=6iRhU(hU3A@pgUat>|Cm$3I@_ zd6h$b8($dWp=Rp~!2iO{NcU*XiDz4*-*GyJhw(D9n9sLBr_2kCq2@rbH}C9w0ofY< zVff4Hv?n5j5#)dcCH^yONz^GEHxI^T_1ZeGk6jT(VHy)n>H5=wa)j_=gpV>piLfMh zirmMyl`(&lPei4v_aF_sB@OCt_j?w`ue-AMT~`&{Bq;J$7W_EA*+WdYi?bnzS8hoM z^STl*eGl^U0rErMp#8P+77YIcUiV4wZccyVMkA123*Yy`dWh4i1kg=xux%!t50bk| zlDhz+ZwJiZUbBCdid-LN8|Fn>>q9(RJQZbPtxHQP?1_y1f;MBJy zOWa@Vg)dyiT^Cv0X)$x)#OPz}+lM>vs36jbt#Otn(|<6zIDdb8@sdyL+-9}Cujxzf3^op|SyVnP@?aiNT|YDkC;qcD z7sr^ff5>XTAjg=wnf)+=FPi)x-<_7|;G(6iU$z+X_8uojM=)y0?WsSX$W%)?MH`E9 z$kzTd(#nTl&mm^(h!X&pqImYdh+~1sS=?X?et!C7H=!!Rz0vM$BlFx<0Q6JoD9i1C zv9jTv^o~|aE!x?_6#x@U{ZEp<8JRgD)2fSKzyUyhi>Y>-lzHPCr7y5P~{^Wrd8BTyq=Cl1Jr@BvfMVw+u{lYj~|0oWbIGv8O z#uB>&+kC;oA~PYXGMP@sm{$f%l#64_g7vM@EW`k?vJ7?E%d%5SK1M58%qH9gBxg_QYpQh|qWnA3)W-uX4#x!yoNC(s%H~_xK?f`-Dv904uqg zBWEZ^EiOSQY(8aDALjI?A0HN4Yb@zQ9qQ%Q!+j{aua2n^X0~qjB0OF~(Uu zc8WZF@be;6Q4{vGm-uA3exTPKPyack?TAOaBF%_?>Duy|V5zYUs>TbbOv|{krrVo7TUNz5;t4y1yvkW*{qL_8+APe!BY*1ke(BuDWXp zr&8_1no*BSVrR{g@a`0zvmD{|4_jX9_e>8|m$KF8>1e#nn@QGIS0G_(j<)h>)@uPP zU=gTw>Gs@XsY9u+#A=2n9yHiT=wG7yQWD{J0hMl}4_h#oo&Mivy1$QQyT9T=7 zEd*CMh&mpz(fJOdgy7_TTQjcknQ$<2`Rz~&_*BUuzNHK+8sIpK5Zb`F%IS#B9Z>R) zKtEG2O$WhcsLq3dug~bGbsyeUeltq=I>-~MLI2n8ic7Wu!@V=W)uF8WP5e@MC#AG) z8JpK0O8d*V@Vo z5;V)ZJp67Rt{&5^EVSq#`HVole9p4kzvgFq>`wm!$m&r}{mV=QFKon41+uTUz(uC} z6&_K+*d|?z$z+qRALW;7GL>W#O1(@omcvm=5t3}?=}Xyn7vutgX=+qI1X5hd2DIs% z;oogW$&^3rf2p_~CvHeRTN7Da@W2!h2rq~4LO%Qte0X7yU1&tqAQRT~AbyyLU-9$7 zU;Mvx^gYpgV_7w{CM8IIzXz{5dSab8JtI8=PlZUavR$)O1osvbyo>iQ#9&><1ReZ( zvY%n9E5ZA0Z$tZZZZ9T8(hb=sST*uvh74-fG_WpCXN;Fzga$(r#l|}xSEsM02a7K) zqD(!9b|%QL8`(FxVcM}t=#j~tyyAt)XB&Rc$9Bjg$A_7TLfei)3uzOZDWGkE8$&+HpN`6t82Ic&4zU)?|tjQjRXbo{-;g^+?6q$zz zwXqm`5TUi`wAPa(@~n)==3}`Q;9sK5RUvr;nzTWeh4hK+`cnm_tX(1EB)2+>egJEi zTWwy^9c8AK=wojrvyp0@c4~Z}OAFUs&e%5T+W<%n$enJXUb)}kDv5;wrnZj5y3O8j zY?Q8YSZL^?)$CcGuD8FOnThN7HJ%M2qML(KvW%m*otb-V8QS-5-zsH9&+*g> zxMy*E$)p?0iu!g9bKzMXRkYkJrk-{JY3^gNKSKO^IEN~lw%f-$4ohbXobDk#=ED~$vkvm^pE34aX1|ZI zgVobSc2#z5y4GwY`v);zwy{AXjO>1(NOV0gp-l*WYAl*8$q`M2Mc2{w2L1V5ddBZt zhiIR>8&#`$6d@DQK_!oGYj^#*~N$V{osC-&8AKu zx|d=z>5ed-Qd#hpGck&g$2iuVoRwiko5hvKux*2Rh(+SSO| zOvMm(8Yxv&Tyqtw+U;zg)ZuKOk2ZR;!8W!4kn0JgF69eO2_!lZ;V@syGfs}4W1Ou2 zKm4&9gZ01T=Q7sVh&B%TME1W#t2cN>An|7Etyq{P6*GP-^M(f2-Ge|cYqSp~7rKCo zolS&H9GYUsnZ^0#(_i5y(@5+_T@$h7#+uYJ+dQ_f@q><$u|JtN{Y*Sk5v)24KXZX2 z8c}3(y{-Qkba@2o@zfS)N#Z~`&R_wXo`-mgKNj_%7?1dJ>HUnvx*znfFZLh`#rbE+ zD_~f_jdS?eg;7_e;&4UKkDsZlXT-+2Fa-U8eO-Y3kBku}iGjD-pNJhW2u0^|j#@kY z?U_T!Wo06`)u8+D=0wnRiJwXY`(3A9i=0)pVuD3auBq%`&mK!v+d#{TmiVJdhcRP! z$I1sXePa!1yp; z|5}xL*oGr5-h<n2UKk(+H@&0|1D0?jR;$dR1*H7 zF@yV1u+zbi(@5zake2<)3j+gb0uTGQ&5N4K?st?o9l@w=thd*?r=nWc_R=d@Mqv%| z^Ly!qjTra~jfc7rZO=aY&NN0zg(FH9PUcW7L`s&&Q+p|EZuCBiB$r2x734mLarucm zm2*b%3~CdxhXWGq8X4V1m9_9*&2Tx5D+c!Kt$$x5`maYrCG zK;Dnjza=-fmULozv86o!F8(mD3lkVNJOw<@TCWoB$Bo#Dttkw{Y&6~h_T{07x*olBjgk|eOr+sybcnEw zuw!TOLHo``IBVS8b(V)`QfpvdEK+ojzdZi|f4RSZSZO0nb1~f8RqO=_Yy94_04Cr) zNr2crZ=fz-OZi+bhl{qIzQd!q{a5#A@Rl@&X8hD?+jDOYpT;$=NlrL*o6H6!uxdax zfbZM-ZVJ4YU##oPI-~1iDiE>zShQ3+MJ{9qc!ON!%lU*-sJp|hN@IHimp za@NJmEW46^GRwfmweSH>%BOwD8hVa{Up=95p zOw4HG?=PhsUO#_+#(@fS;{z_@^@D2}%a);uU!MU@_&5Ch9QNgSU)F13E3VU9smv}y z*eL|RzQvge=e?PV%-*y=O~~fGkH?B>xh3Pu>fnk7grh^CM{~-Ny47&R<|i`!`KL2p z3zySH!#vf7sCS|L$d;S8+1$g!woDJW-(*bBru<1#)w^i&?Lk_|86h^&__dfyR zCPIF)FaOy0_%oS5-|5SLZT>Pp9Y3C-B?&gEdJ}3JYK7UDDsc^7bM&hJ;T{a`q^z)G z$a1fo_6jZl6HlP-;EHFTNY7A*$IR=N2-#QI$mgeRJh=#hgsn(sw53@o+TF-Po7z3R zhXa5!Fu6l`B)WQ@3e9e^*`Qdn=650-n>Z%4JvN)HZR1nVB|jhc0_NdZ^c`)ai8q!&1=&+#FgnAjO^S#^P*1a0EIuZ-~zb zy@LQ%p|KhXtE&}cJQ>e3yvaK?2drNi=YEw2IL7dIrX44GFFJXaZ%$!_ z*AI;lP%#~WClEDy z2TX(R((|@fzIpT%OJVjwWxLL0lGpRW3nDl$XVLtX1bPJ}k*;qOMv1o#ysC8Z<@Gb@ zX3LAGYl;4Yd933fT*p+PM#=lM(sIieatbRsg;PYGKEWpr3#d4eQ+4D~3cV(;JHBCZ zt^G#ij9*>ImnHF2d8=-XpL-;Byc+5IKC|L(7K#$s)aM!NZk0Pd&sMcFRVPzD+Y=~! z5cXv)A1dS9Rm*JWshitk$soFH0B6~YX)-Dq=PDs_ZG5vDW12=BrXYO7DS7~5hBx4r z8l?o?^U%I{htC%hX~9lN$)}Z66e09cb__JUNM&hWUVor9ixLq@8w!dq#Z&1QrC&mj ztW}6Qkp(CxWJ|O$%ZGT#N>)W~v-{M@F|OAFeIKMl+6I2R3X_m%;Xv--eGl`|Wjy~C zVbP%4$l8-0Bx3-iCdMnb0xQ?Ubx|n5JSYo4vpC`LsEHAWqx&GnYI%LSK4Y|{>W8P} zGK}DhzJR6`mY>IL6P4U!z)L1aGCgFrj@Z392khSTkBLHU>*6}{3agSwnzE$vLj2vs zR93KV^Vr}v1*)0FG=^K7+Un{`*9$JomlLs-uw_7b`RaF44&8de|fI1__kBGYx z2l^|b8zOo9>EqEEWI~HzdpEs3{gQ7X-g7pNywRTeRccNIf^7we2(`q4rL>7o?1|rx zpmCGH>@e$9GdgxOb|8H)y?uM23yLxtW@PN`j_r=!Bv#+=*zR10O**qURx|b|e*mE< zhJQ0elG%yFdY%HzIYwmkCS#GMBI@GaKs5Mrw()V?y-QfwOWA0}w4ZPW8>GroXd5ef zqfo#KkdpfblnVvpL>MH3xA+tF9MBMsS57Tp0tR8 zkgBlOBN+H1Tb%71*hBHGoV*Ww;9Q)-icV+306D6z;?t`TnzcLqhg6V1h%R^x!HF&c zWlwD4qX&*O1%(e+M2Kg9kr?y=h8b-0c4}(2=c4Wo0BoFVEcIs=JIbAM*E*wtvI?Gi z6U9>ztC{mQ7|>~sAFJ4Z5^+Aj2F^-gwax>*eZIfq)D`Hh@Y7nmlU6|Jk;j@Pl$s@T|sBRzqiiO?mFJs+Pqqj^ffxKi7aM!%DMKyOpf ztmDA98%R+*_ZBDVH(ngP0LzHq zLbTm|C;l%HcXOv*%*WrR>Z8L@WL6-JHK`;3yb@Dt_aEhOxHu5qgET}-wI?aD_jFyd z|9X-`JIc9a2ptAk8+LFiI&k=M6%r3EwY+2}(s0M(+>`JzxGk!;dp|Gl=3`%Fxt@{? z$bN&*RlkK-Yup8)8fVtuMnxslC_82Ukr!Ao1(Q)35)Tn@f?Xd;UECUtu~D6D%1ao3 zH!epM|Exg{O_C8Lg*Jy%U$K+`DrY@t*%f#U=T?kJ`(aMJ?uk}Y)PlK4$Vzr;AjzGx zUA$6+@_gw*p5BNV;Gy}408pcuNbGPX*v#KwOl0EaiA-^pRPyo9Q%}`@h|k2l+8O$= zC-JJ&!Ym9#(CTuNQz^K&KMTcO#5{=lQnC-&w`s!q>6A?Wl73 zk6;LG(O6_QNNV8@DSrt>9|-z-hOZ(Q(SqhC&pUMw9&DczqlXvk+r*yIAi(C)nE@~M zZN%sm;VE>dALU*}#g{DeLqn53SJ9uSG#txDA7$-WpX`rbg6=G*s>Tc|HcFQvp<#rx-SCx>er<0j;vH%${W z=2bNGoHnt9I@Rp)aU^pJI_^nk2Jxy8fWjBVYTd*dQ#3bu6El~TKrXJHmnkL?iIP}! zaRkf9KKc#m2*GacXi!YGE)kPu-6Z~O4LiMohc}^%g+4?PIl-AqYyA}Slnv@95MN+= z3!20dizC@;!{ACZ%0a)V*@}PP$ytoPlD5^l&vGP`fzOrz_GvGv4||2-*+$WDq{mJ0 zx*!UwnvYX*k=%GU=TGS!(QQ&k31|8LEH>c*zcbiK6|<7ac07pr%WP&5WAzQ}!WDf@ zt}1Lzf%*Ue%~(5p{T@I|LttlBLFNDGPmq%M{N~*%mGjpGZbe^G^R)7}v7++Z3Ej=5xH8knT3O^n;ljXmZ-gLbv6F-9CZFLOBoQItvB*KEf|pQ z*Tc?Ds*^|w2|J6Ke_iC_>LGmV_t{qKMN{<#)Q(gmumX?Ovuv_e~DuZKun2Wz_-i56fO z%238CnRme&O>$9k0N*&s71w~5D{;LW_|*$7jwBw24?SIR3QMs2>{vWK?N|Q(v6tmY zLxfASxI0nxNN1haVk7l+$zz=7G$cXyeZzn`yHDb(_nc$_;P+W?CH0I(2c>d&kYQ&7 z?(uDiqYTUxG$uiBfkTJ>#zfHPU`19|IA@%J^W?xp^*y>d0w8iAutIHzeh%tUwG>Fr^Gkk_?U(&yO6u%Lz(Zb6Pgi3<`DEf2Bu(2o} zRYGDBUo~%wsV9lshN~v?y~rP6%zNGs{sN_#nG7)<{?hq-%P}meZ>u z{@(nc%9>Y3S4AQz`_KI)#_v)~mkKl9jQ`d>NXbrWD*vC&|KBi7$oPfSG9`S!gp9qs zIpjtD)}JD1HG6pFM_t|u9jKPn!$tbD8T^w_B%6GIQ#w_AsD((2QW>qb91y)238ygI zU)atZ3Xjl+0`YL7VmtSVmDpQhq;YU7fFz<-jpa2&*)yONBv0K~2f9z=M8(aIRqlC;WDz^)#zL-VM6|%H4wKbeYbd#8CSp6l3 zQD@W?hu#@HQEpMUw9U5iC24wz&h9_Xk-o7r*X7`{(BueyvNzh5vTwkHjUga%9F7kLYxULXF_ioy}F*!wXpsLPn`TAc)YZ&BAF8*!{)ZjND9{Kj41Vpp(>-H;&aj z5814lReyIh^_5oZ%kl=-Cy|)f6Bhhl0U;dxq7O0l1}FI7`o+hvIoM=ut6^g;l#dE_D38Q;L2+o z{P02GE;Ji&16nZG)Z3{?MxR0QAuZ~jDzVG{q*Wy}ss01ce+XfGCJ_#JEy>t>9kcJt z(3u;gcq2R4U74w9TEL$NGO@F`$5U`*t8i=7uJrxWG(AI3UuAf4VFloW&4;chBHDo_ z5KD4T>XAp$AL7=nW6%>>R~(DHz7dmD5k1C%HJI?n{QPPB-4*z|VkPmufE3)T08Gu> zQI%`>1+8ONa=sEFP`b3SBPOCvbP=D##hr+BzeN;TAaD5+T;t^oDTT4#hadjCl%sqQ z;VDoR@7)=g&zXR}@G_s7l<~Gy;i1f4-##ht!KNw%#YQXmW2V|jQd&RMc z+^P~wNv(U3GZ5-Z{kr~Xdn=0Pw6beB3A#rhddhx|;}a0(xh%s`xGLgSv>fI1VA$m= zs~focj*q!0qh)zf=*`N>OaJfUyLVfyhdWZ8Sk(DyByob(edhywj%Gj|b>L~!Y21V| zxLfcShNu=>7J^)u_;=+CwzXk;+b zQXzAfFiJ)8DYQufxfsN#38yZD`_n8(tdu7}uJp9?;fhl$CbrTGW!HPKMcjfe*QUL- z?pra-^tR@PmSL<|nq#1__%a4Ho2NP%y(nU0)+|BO6>$v0!t{V_y$A674;lE+TX{w` zO!XE)t9wqFEYRIioQ8+=_c#SP#@YD89GKma`Wx#DlE+70VYCkP@^kXTU{&az?*_k^ z6h~Oq%4)!p0P0frsyR3qhT({aR#UYM!!%EV zhZ28RF$og8Pg%1E@bcY@Qg2OAev(8cXfORR_b{ro7$isejs;n0t%C82*=?xt&Imog zOSiJ276#){bg;Y|^f3mcjkl34Yc2xwc`TM%`YL^iOQC*wE&ByU^0;c8fz)e2Bm2-R z>KJTqJ+pX`d}MrGo1YEB#gZ*=L_qBVph>E#IlsD0p;imR%>6~)>Y7HMdQPoUdr_RI zC)UJ7!ko{ie`ySl61EiJ0XI@-AX-;8!Bg}5c5nY1`0S`YLo4;tfXSU09l3_^H}q(5>fhk3?y?^>eoPdVhih>aK z-KgMPq3!h`yWsI227M)XbOM6B7fmeh*nep7>obaBuQ$<|srjgVN9#-RNnf84hDptm ze-GEiIG>uZ;aTS*<7@a)X>^0v&kD7(bY=HgqG48NUj%R6_YuqU1ajNQgkIz9J{R3! zD`N3qKr^Jsh`8@%mcQjO@ZAegA0|*7l=&Hzq+?v0`8H(*4I-jChex)DH+TW&n}rm^ zCK(u}%|x0u6T`Hbu=k`UpmMDQIKy_)+Qyj^W%6ysb%E8VHZv30fRTO|t;hvbDMs5& z>*&d3PYdSYU2R7{?UkQ2pKXR^QxKa-ryYhjpW!)I)w-_-7q&{YJp2&c9hhgCSK#Ok zD5-wV!+Yr+t-^#~a#e!N{S-IGhZt3k+6rQ7OKt2-Eh{oFfkl!96enEcK=DQR(cv@3 z;;n&cU$|;_u{wC<4F|}0t>V*45e4@Zy@LM5{u|49^abSaM(W_P931>=YxJSm6uW;r zOLd_l!^d&so?vmGWsgLB>;T(54|{!(fulT%q$0amjROoi9NRFG0wVMXEFLx%#@FKN zm{~s1s|E^Tidi}l%HO3eI1-IEyjmeOcFlN|C3|h$|6PfCSWE2iL(G9E^|1F2bbFe! z0cgLyO31 z2lylcG;IHXRK|;cZA7HB<9ycm$0)FUXs2urR$`E-i9PVMjPFLg6S1FpLX4)L_O}r5 z_NbNva-D&blSis@5)O;?2#@~a!VD+LG33~l9OXte9%&MZA0|L}zbqz@xP@~)6!?@2 z?BU_wcsdNARxyO7{XdNP zHo8C+Jdm+Tj#FQ8W?>Xd74MfJCm*oi$$%DxRP z=d8;9gYTy2^Zpo`rwlr>t$`1yedyhsgTK1I{kr)yjN*oB*kbz4SK;UIwTF`vc3M18 zCOEls*rf|u*P66ZXZtBTlZ^o`)dYXSCtqiRgRHJS{0KZ}#1Z3DjjLKDL*c~dy$2z< z0Fr_QSa=ZqVp4BHZ1!fJd4_p~H?eR5o|pJN9`&X1sdNxEyG&h(=6n}vrk7FMFa6gl zpL;#uBWe=YS1n@|b{*#(LRpui+|s~<4S>U~n;FR0nb%J-U<>?=2D9q`empA3ch+9;BYp7-sAL@2^XdUW(mh9%%C3|nsl%!F?Plb zeoHXnB1e?5zWy5jOX=k>C$3>y`}lO_D2A+MP1ecYqxr8*i)Av;lSM)crP+0%6@H$! zh7&t5oIUOj^Y&uu@P?U8aK0K(beah9?r;CCi}2qd$ewK^oR-kD?xgp@6LJ#R?;p+!UG^;O=7`!vX3Kt2|%oj zEmVQ%N5T`fI6$u6=83@b>WXf|*OCuLM;VpE749JXe1_;_5=&}Z$J_s7I5QWyWPk}4 z>md+QA;HRIcZY}HH(PtjI2!~}DN+E5(|D5|&2;}-z#3GSV`G#zyr;%SZ6rHV{;bhpy$vv?ynXNWM|P9aMJ0wjX^OeI*BW1RYR?Su&?D*Y!n z89gIv_lzW-jyw zs@qH6qHqf!%JD>sl{dLQgUUN$>@8t}4W1I>$&jAf`hdG`>5NpI?6Ict2_JE zfE?ck5ju!y&}GPdIdl4ebG?3?B!DUb_AE;vQG_H$3FX_PUH!I@{^G1Y#^F%!!wYlrR1KHwbWGaA5 zS^^h&L?A#bG=T2G8hVl@g7E~7W5df`$9peR0Zt31-zt+2NHk!-kQ-`-o6b!ap`K5> zY>t{DW;PkK$@i8qZFQRPo=EnddO}z6OlR?Ci^{8~6`ZZxKC%MQ^QCH|De`AKjM(QqTmx8rW0p4I|a zi#&HF^aw6AZy)4nu0}#$Fdf|mgo&I{H5+VZ&jvc3Igo_AF#}4c-2xvXg7{fDDfEAc z!jnimnd%(ugazkDM%BS`IQ>4efN9rZamC)UxF)@2Ng9g9wnK^VqCo>_vJJR$^#pQG za<>IfrM3r`qU>*p2E0Dhp0%IdD+J4}p?J-X_8f@s?O1s#way2)R=qYk$zKKVZ3gyB zEX4wP7kT|u#^cQt%)-&`Mj=W5&zGgcq7JxollDcHp-~Fs(j1`6qg^%!ivrEJU^Owr zAv+D>L%sH${gm5L3waMVAbOKQZ~;ivOyOK~4d<|bYpyF}wUqm-_)}>qFX=}IIo!Ff z4djM-#?ioXVBNw4=}^*{`YS6!l;W<-XCo+B^ z;5vt?fQ_w#8E%py?uJQSYQns=NK^XX1MZEf9nK^-JATE89~s0SFqmRP&908_P@{YS zVJX82BiCA7LLl~^fI$2vU%QX5t@7mF?8&82VmCN#*3iUSi+Bz1@eid~J)-5l zhKKAE(SXXh6bZ7>6MSzHbliF{tav45Mtrx3Xo)XfzH zN0V_|-S?~JFv9Hap^h(pvt_C%5wA0_Fw@WJ2u=vN>ye(+>+$^a?;wHQmhwBX$cgPj zZc#ZRBF@47eNBryi8ll}2^+ux3S^PM04VJ$Fs!ZCJ77&bEsEJnR=n^%=n^O@T1o;3 zWFk{JYS8^B!=fmbf~01?2v23vkxX#Ik<9QMHZ+7Ha(ls$Nh!AA8gJ?i2ls%>36TDK zT0|fjd%L3rg<%{{`-6?q2q-|J&tt?CEIpANdVh8!clC;V4Ji)oMa;C%NiE1zsI}&cR1_ zWP|`2I48?)&j|FbIu)R;ZQ>I^mL;D6d)}u8k7ejfo4gI4)~OWd3t*iT(3r&wO-wn# z^j{!)Y&!t-eSj11=NoD&xfWZ{%%-@PX1v8~d8@&KEh5@*<9J6)*z^wxtiXzL+Q!Qq zT}pA{P{FqPxOWaj9cvIl^6-xN4d8#1KO6Pc9wY1c40o4z%>I2AOd|qcD|LENqT156 zWZfDwpDw=VGyKuJ$yJ=CYd6uOO+87ga3+go#th!O1U)D|0+3kYMh3PHouK!=llr{= zMcmNIzyPgusfcbwhQwz0oG;zWmz;8S|A7hTs50tUGPcvN1SfuJ^%B<%7KN56A^$^_pxn(izb(&L7)zkg z4%nm8=}oLDw1PT!48QS8wqkR{bbp01<`E}NMy95TL@JNF4dEQ-*i7cLJN;B03c0{= z+5I$X%Ynn21(co{>E`?MU6Zmp3(C>1HjuR zBR-SWn}h!#j8|r~x(F@QWAk4C>17}NH0baQaHy)y$^hwLQeqA{Z$1k>$#I?{E6p2c zbVcpel!-(K_H`OiKBgUU8fktujk&Kp>Y8Th0NypoJxWwzdMD=kOQxNnzPH@w)LdWb1IK3f7-#JQ}Og4@RYC`rM zK3t6gk=TP#XG9q|NE?;muvD8Mbr;#_63>>`L3Bm;Dbpir*xl*xKff@^1(q9AC&#gVo3w8%X;*xUrAx6}u)?F$P+=A2&DQ`?wzS$h& zIJoaDi7>c9QnUwD!d9K*OYkkXb4b>K>wcc>?SIqX-Xv8bJoqQL%PQOSbG}=to=Yu+ zX0XUnbSCyb7qvN}gL5kY0mKZ(^KHX2b*SEIn!r#`s=BC@qhH*Efp9Am_Mc|<8Tl`V z0_+bO6M&XbIM3_T0=p)FFgJ5G0{inox*2Tcf68$~oxaM+w3nCqA3IZJhFOuca)8 z4Vn2_uWCcZa+mk*TD+xJ+Fd-U>PX{6+48H^I=vGUFI<}GqLyDQ_y_K6Z4oJPd z2|IV8uV2LRVXQT96kWzpV3-oIi<{Rulf;TlJPZH#U0~x}CP#=;y@@injrhRC>F@)N z`W>-OY#JXzEp(?b?pyi5BYdF7IQytv;d_mTTwz4yY940rxwu5)972&lBDYN;Zl0Up z#G&P=FGr%>Z)Lu0B2h&81)`~^m_OyxR|(ZY{};>A+6G9%K*@Oi)fZN|nG5NgP1_KY z^Wb2>f5>*I<*=ZT0eBBhg<;&Z>r?za0{58HK>##9w@%+}N247;2i;pFJ) z`b?Dy41l2uZU<5I4%r`x@BD{ ztDl)KWZ6h0w*7yMy$^WP<+=ZVJWToRIO*A8${e=+ow3RBc(Bt-x~>0oOgT=WDifx) zt^c56300AnG)*G&IOY&~9123DQBkU5n_(pd+9oJU=b%Ic8cS%ythPc36=M?GG|Bh% zPIcd%>-t^S@9erVY5sgZ&*ypW=YHPzeZTMfR>5GAgEJUr0zXKLf_Q%fBonE}usknv zBfr{P=TV>tja-H=SWA)x;+&1@F#a$$;i1?QI%f;gMgQQ|t7?=RTgwi_cAmCA?y!kl zfjycBJiIar+o791VCw{Hi8vz#DU=krRMwa#JT{MPTmx!#693~`r7;{ zUu&H18WR{(x_opS9Aq0j-~?D*zTa+SQ8i@#6+rJ%FPiU;my!_ZthtH9X%*)ZZXwsK zP^vRqj@c);0aa;?w*z5j@kY%Tn{6k=M9!wUlC7Tv4-aH@7e=Oi@@CU+=Mq?30e{}LDwt}@L^QEoqR}(9I8SG$@ z>z~1DS!Vm~ctBG{vcOyRCdc&gZDi?9{A1RE1hv?dAXoD$-r**8oM99HcKba(6<&vCe%~R zkV^5j*WAK{m7THHr)LraWxg2ZSoTw~>{XoXDK;GeEm3RBnUteU#$U-)H)F!d&p3y` zj0d$8?5mCqqiFLvde&nARY&W?OV)u}qd?8gK)f8_w8GfstbQ4qHF~i2>>irK6&_RI zg2OsAFXj(U7nf=WyQzY4x@}-jHcm+1m_GF0R@BFSA=c?~MWW{AnBB(ydm9yP0hlSR zx}9xy720AJKX4*YcPZQ}V8g>Cba~=#2YHeZ?i@cJXcb3F7vEJOg$6{wp$^_;LbWBo z%U?oJxQty7a2YwXFJ#KzkVH0+sjp6-_r?dmquUd*qspH_2S8$zB=yiO3gcZCQd6&yQDTLL; zB&vv4jV54k4Mc!}z0oDE{;o;Vv&4G>a&| zoWYB^cl&Dqy2yL2oydb<6^Z&0kX9Cwp3kJHGI<0D+qZ{j{FK-~L4@c-C;|~nx=`pp z7revLm;^)d21<`EaF=uDKfPjeosu}K7j+|ht#=HEU*IN_W6C8DWq zX0oCy!mxP6UY8sD4kkwDVcc4Q89*MF8f4_F(~!#OtW~|jY*u13m9SJRLJ?yz=9_?` zs=lXIf^%7|$-!k8AfEpHR+L|(;Ujw_O#|)n7w5%BsKkb!@BfSHpend-oP*s%^LWjsF9}1PFP;kU zY$;id24yX6W~?C+_DbYaorg#S#P%LUf^Lvh&s5NX5g$U~$kwtRMmkd*9BG#n+H4{V zQ;Q%k1)!` zAJ=U10NW8j%81xScUXhgQQO|gklW$BuY)~ z2fi&(PVCz_A~-fL9jj76Y|c_!d1?!R!|nuqlM_4B1hpPzq6i%+=(Vl6;$B%`O2jtY z$Q8O-zmJ)pM-eUA`e7#1ijo(TNnFIK1U5yT=&J(%_ni%1bT`cPTljK9J|NW3RO+eR z_`1oE>QC2zk_wXFS(QmB=Psmqm!SAh;zMw}n3 zFzZj*vBZZXa3UDn696Iwsm5ZsRi5V!HS&xrLi0GAYj4z;D|iuRpE z?i{uiE~6fpTu$oLFzMM~OT_0Aw6!PuowU!sZAX%1= zXX19KQC{}VZ1zPUmQFYqo!12&m#!!vl*4lO=lVHwo_9o>OAr)o(p{e0w; z-bpOv=0q%7H^{>%CVr<5#Wn_s$JVH-5Suu6;;(~P+sKA7VPIJ-#};1OC` z52%5q#}ogUDgwo-JjSBb9@5b9Ow?#eMfYV)${GtNPW@%s1zPGC;7*R?T_v3&DDXGv}b94gJzST^p<<=HXBMGr0koq;`AGFjQ7Q0wQfiB@Z5}!!j zk!$LiM-Z@tHnAP}*TMnTePk@OQU*N_{zx63G20pR`=#uh9^N_2PcaYeszI-4i523n z9nsyV3`m6z-c-&3brFbnhgql)i>#s`Iv*5eyeg6=J!l>8l6b~waM8t)-0Gpr3`?DM zbWM}oNQe}=zK}oc5UFd#v4n5n&t&2i1h8lh;t1tztaZ^jT@mIh2uzi2JBOcU%Y*qD zav+YyRg9*Ab;7Sy#DV@C3W1NNZei<*_OOkm>*y!xkFNmClgF^{dWX-5;`^=WPv(HZZg0(tEY71xatg@tk zhpP!vZyn*FQb66Jw*%2|zqP%;C%N1GXI>CZ-8&-F(?tn)T5M;R+>ctVP|>_5X7DK% z5PEjwxSQ9w7?&-c<;+9a!G%@Dg9roe@G|R~{=- zIg7_h7Q?yOLx9|e6yOaDT?7RJ80|lp+*PE?Tl0B;8Lr;pV>#(W_se%wWSzsoYuQek zWIBUjaeSdO4~PpG_G=y&MMUVe^dxtUTpIO8&_4!8@rrLeyno|45Rnj}cUS5?UQk^T zs$y!74T(gIBwp1<(FT00!$&=&AJ#cRhs36=Svr4NnRIUbW?~}-5vZnO5Oh+9Aaq@< z>XhnEhD}e6J5V~I@wVc^y@PKxB#KHC3IVmSNdq`^+rYz}kSRRqo+8h941@A}p@;DO z{*EbAoM1ts$Q}zbZ)a$(;iyg?+T)>i+^Vln?vZ)|@npzVSJ}#x&aYZurI5W{uO(_a z-}dhBw2EpVJYc9r32aPLzpvtqp5p2YYNRd}&5 zy13JWs;@Jjos-`h2~MgnOyk_>ZvrJSlJu@>GF{%9%D88N7*Bw z_##q4431U294iPvcLf*7m|4IVrt>19RD}L{ykCs5-yOe#XcAgvOK*d@5KZz|HuaPE ze?g+5%|M9!m$@gAV1aD^JIVG&XBzDKbD1e|lB;+eYcvq)$U>O|3mX{-O(34GR{$mbb?5M!5C^)-{_fua1J>G}YI6Ok!LdS8O z18$GCpXM$QCTpaFe-O76XPk~zIaZlm-9eZR*2AiR_JAs&sh1#!hT&H!D|Q2G{Web! zP6D=i#>+s32Ca|BGH~~9*Q8B{bey?;t)8v7T-gV}nps zIXZT#R5upfB7LV3=cxQL3g+4v#F(2H@p{~#yLtUCVYA%J$~bZTD%GeTk?clLoWcbz z*nFk$;r9J783^u8da_vf^jj*}ZzfXjO{*KxDF>|SG^Q$SJc8{lZU~PfN2mHK9JW8^ z<>7j{*vi8bnby_m5@-}-bmr{vIH&MrRcP#IxsD<%a%MI@n4lOkz6#1Mg#b2o9JZsU z`NCZ0X%3u)A=TLWCr;@KP;4puF4pfzqT>^?yI9dfcNG(YZKW)yRUlH3TM2Efn2!~^ z3DyN**KobUw^$q^_^xAiYCb)NbJtSYbz8C_m3QdhzVYY&4=3-I@0eZbHug%AYFnNXk3xDdlYv8i`Q7B zgzg$QbZ%$uOWCt&f?K-0Fr&DIH{)_!9pG@ss&;8NO=hz^!y$5EbVVxLoVxhOrFRxT z@c;g7=s#||{<@cc`}nU8{xSET{`1+(p8e6K z-}=$e3s1Nw2Hid1Z{PP|n`7AK2^2jz_p;cE#-DB5&Ht>+jxHRpt=GXk8P(oZ=0cly z=x8kp?(z_3g4`{1gJ{2h4^B)>zkK=}1e(X&J3z^B;cDnC!*e=cZ9Z_BhXxR=C{oxY zWA-<6M!;wYeStv+x?VrbmvE36!7WRMM#jntKkq$gOr)-aXG+tzQqJ##Tzgu5e@j1n zqLy?kyf1t3ig7lZY1OWZaQTRI^o_u!JF(b1nO?uz|AGqqP*&EWaYo`JpHdoNOclkL zZyA|vY0-#e)5|MRvy5Ru4j7C)Nqsijh*+5K9@W{n3zc|3T{kYJ1BqOqtJJSep}NcI z$1ES~9LUBQa>TD3H!)po=^5ftoa@6O`3OHfxtnpp6*b(U>&O&}@c=lB)Z9Y!Us*u= zcX;h=p0i9K=jEJ_)gn**63;9xP8a^QsOO6sUE}<=)1TDE6Ew5qWjczY> zmv7>aa6NX3h`eF;1O9~r?fKM@i*Dp$3)Nb0zuIZh-Z&EGiN~mrvCZxa79uC5G%oF~ z-`Co_sNCs26D3QqVyOiekC8>cmhmsAaTA?#P{%W!zJa4)>*89T*UV^L2;V9{mLMV( z(rota_K?lb@CcO{@1bchMf40_xUD6FCr3x=XuqKFFRe_%x+2eDY&%^vN}g|;xRf*O zy@Ilw%EoA1l{eb|l&G9kfV=H?+~RUvZ_YfFPB)l}d|t$cJ+|Arub?dZzQ!!7`aKqY z+vnuce=;2lE<=WDX++n5sGzKxK5JB#rW8Y;4NHe5lmo@J#?%|!Xxf$hu%qCMIGRyq zS^K>N0_+1y2alDp~z{gWz~fC&)%$wGZcqg_W1GTNloMI*0e z%ee5NHunOaBKeKRTf#er9V5qvy=p1W{wdvokW8l|AhvnwNA+b68eV5GfCTOVnlgu0 z(SCV|kC%p*cj5sn1Z3XKTon3|$Z;#ZSh=0)9{eZirWHG#n1bK*?M|P)s4*Hp$ z=?u0Ija!0bUyNFNZlpc(L%sav564jII{Eq+Mw!Hdy6o1E=KD*Kj_|Sn~!qSJT|t$i}zBZ+ks7>)y*U zb68e2Mom3z|GfoeC1?=e#-@pAz!IKDq*4wa^KsTc6zLu^Ay_M!` zU7Y3YbbLbXN#au-22F~deUYD&3&AG6nH@9IO%#IM&j-d9jwj88AjskTf<-LZl*k>yl0U6K{6 zQz6 znVUhe2OckpY_@UB*GJmjL^fM!{OVfB<7f8rl)tkTSNC~nmuF^g8@nW$!GJemWoE-_ zyD`)~bZ|j-0rvSQdqV}R=cB*++6yV`MSl)6mSv)KfTF6b{`ydq=u=FfhCHf`3)I>y z7QAEBG*VLN58c1^H0r;j98i6jQI*`C@!EpZY^4P>DXut1*S!dCPo}g-z8aOX{*W$m z*ZKg~oP%?H6UOR=CC#`&)111NiAP$(=7Iy2k^RydkgRc}!$GCtnSd4_@z% zJT~5?S?y%|IZ+m%wv>+DGLchaSJtg5&QEKw?s11!h2)hGbG${JocmFK?cT^gIA^nb zFOPT{!NZMLr+h_JnCmK1xVMDUa?RGgdgt&Twz4R9`+=q;!I z%3(yYfhj6~tdP>h+--;sN%3C=OTKfQs=T^8Wlg#0Z1zCXIprrQ-_3aW3{TM4j-xG97`7!oW2Xcd;2>?bw@IAvVa&}- z`S#PUN!b*|jAwW>w%k*U5^Cmn$V3SR7`f}U5l1mfC^{?UF3-W0WoI5QQ#U$ws+0v3 zV+k${TRJyUHElsN0XT|9s2ljm`{{(RKx{Y^aUO^jtg}@Qwey&bXK2nifq&?r5Yx(a zJ^DD4LB&g|np3!D?xv`k{9RS;<+nONtGhlCIYV^(e&2rDEaQ5_k;1}ck|$??&Et_!Klp@%OfzG;ISVF5nkX7kuNyV!^}4lnU+zT%`@ z#JWxqS|Kb|)9DQyMPIK$yxIv7C(+IhCda7G$O&J91SS{vXT4i41bBQZazdyFj7G>hr_0bQk&{HfCIiQ z1*Pm7B|aZSu4--{@>rm=E)*zrBBgJu-*85Lib(WV(lkPnMzoWc+bCnRh*6~kAYbOo zKM17i_A+~n*5HJ5MY^pTHmgAY`>I)SGvej$1K@=5D7${iI!&Zi^=uw0w3}xr=2R>D z&3M1&b_71gZhbKhljXBIsIN@h;OVoU^PG9#S@yc7kmu^5*%lhbj z+~Gz`@g8v(m)gL|qkI(r)NltkJ-`nFjOkK;aT?+Lipdb~VHMkES32I5kxogixt-cN ze%J7H&H^4a8sb@|oX&rX>W6jKlKd~uL7xafpYRY*W|BYEnS?fyJEnq5eV3zvZgvXd zY*xqa0>=th8I5eyt(QUpra_43-x-Xu!dCNqbC+1$5T6I>)oZwsZjsAZMTGH;Vm zjy9~7{N0?JhnTHWbI1Dcub_k4`>a*Gj`7F88Y53$kcW8IB?`4pL41a|@IG3n+Ie#k z7m4%rd{qJvXJ&46WY@7_D#4xLigJf`Au;(#X_8+}!r~|#H4)kSYGl{w7CGEL4KIs) zE&x24VSALzU8|=gnXVQCG74<>w=%vL>IQg@NiegUZ40tkGtS<)3dkR3o^IjNYTw*w zLnBR1e_VX_i=ZaxvM`aa>efTF+XQLW|XC47llKz_5-L)>=s?Wt?FPe$`-A!5Wp4ak3 z-9VOQ8=VugDjJO$;kW&{B|c|-?5>1D#|+BJR8&P?R|oYO{?J9-XVJ_OUrFuQ#t9A7 z|0Wn07e%g|1`r$XDz3hVx#!HW9z~)BQP!I3c${jNYP-#2AvZI_>)A$%b}poa?{kI8 z0)IDOv~rO=6jGsBxk_aD?cirCeH7N{XI-WNNb+c1_iy31h6yXoSX|zc^JQ|E_i)x? z>(ajX{TS-3T0g$}76-eHuA|EeA#mS-1f4e+T6{*7oKi&wK}`kMe&j81WMvJY^rFJ%G!qgFby%`8*Fb6%4~v ziCEn2b7zAcy+z*nwnO!yI9s!lAMWF_pvI!E`mz+3;Z-v$eEn>chE2}krJzc0J!iZV zOJ#j-g}F%QqI+a_P3KeO$J7^ok@&QCQ13tQtQyW+K_V>@zLAR|!dEHT?kv*RwXx08 zh~b?T9&z=Qh*CPQXm~Jep(FE$t#i;aHQP(1*N5W@6%_`cT-z`glfm_oLyA7lGHYHk$Dy6}MDg zib*5>EVKgy?YyTVT-BB$<2{_u>*-$T1@|&tj=U1zkjb(wFLah_q?|MXw!65bjf@Y6 z7T(vi0iEB9uIu{{y@2Ckmzy|17GZf~k+TV1H4pv1i9y}jFol`{tnA2O_*mpW8$+#J z2+op%b}^>?S~@2m%OXMSF=tNXL3Y}~pHKmUj@9x_mW9vl0pwcgf$Vxf=$XT7y07Xx zZ#sYWMWVdwM7%S)CuXN~Bht94Cpd|AjFV}}T*6P6aj70OZ|P&7E?;+Bqwzn&=kTWI z8LBD40mA9~Nc0BwQh5n(0vcmK%{cx!yrOWssiW~dFmgY*`GG8F^~?sJwc^Vq!_n~j zts!Hw#c?{=yZnR}Z*X|@kyLqk;NE0QhSC*Exns>tn>m32B(6h#d!oSpwI{jmhiM{6 zH)!a}ja^kK>z`XkVh=YOTh|t^V8eAYU_rpLHkDH?{c}f=Bx*g%Z=^dMDLD|fR(K0h z<5N_{D5E>|^8|iVf;zaL|E?aRLc~*K z(dF=9^LS*{AXXqx{*bHa&YS?|<{8G}Z*vcKygf{TYN!sU!0^T3QQO(!;8LCP{}Hxz z%1e>YPF;UZ%D07KMHe&BHGcNdyy9Vy3R|wWJ?lhdZ{+cn++ZK(;UNayHVmMPfqIPx zQtCkKSHE1HPevfvQcaLLexFh43kNFUF(&CV?MW1@1)rE35v&COba$}Z(yl>%v5NC< zzVvxFI6R2HOg@-&dS|AncY^=n74Gh)EA#?J;FQ1W9ll`&VymZ7rmoG2TX;`Dj%9B8 z0-HvEvk|RXI5=|9JETjz&M5B#1Pac>XJ#K+neM8*Uc}pneHWhV zVn(ER?&fD{_`5s>_d=VW-m6tDQ@(g=+nCwwdcS8{GMKvjvaA1ZYmILpFM#;IulW_x zYWNIQPcNZ`@X^@@uc7N9)VH5bx5mxf<|L|uGt&NcGDXdW6vb>4+nnSPgDpA#4Jlg< zXE2Xu`&_~E`RL@GSrw@_`8Cn{INk^qgPQ$VeB8bHGDk}uB0dL|r(%y+pbgQCWqsmg z11Zx4p6zI^Om$Y5=Zj70L2%0ye$@zz`8_`h`~ll2J{NSd9(hUodkMU_u?AHryuFz%n%mOlD``)bdqo<$nNdvUd5w4B z`JH?E>|c9b;6@j~S-yuh#@CEEfHP&0%4hQ+&3%n=Zd~k3wZS%(TkT@3fzZdi_Xx*l zGc(x56=&Sd6Q<2HS`f4qz-n=Ye=r@dWlDsA8ik6tEeP!1ZxG9;ag~ED}^&s73Vh~pI z^mBDMMn`mB!YLU`iUtPOdH@!5wbCM~tHFyw_gPu|o!ju(vx+oke>)${h;N@Fa(2H34R$k9!Xv zO;s2A!-@>N#H_jb+^c#%8Tbn}s|m_Xj@}GjUFwa~*6okXV-9PdcLtB*MK1z(&BmKI zNUy-=`x>KlV7v@=pNqL|Mn4uK49^AU$;lgk#aT_7=Y=$FuCxs989?0Cu2TNfAil`g zO?5!s(gS#IdzqB|w0^b+S5vXt>;`!!dJD+?YHZ0v){QTe7gLjvM@ZghZHeU-``Q_+ zO6ZsWBqyGDsJz7sptA>@1^zQ^2<43`SgJ5$J2Q)<^`VV&YvZtly6|n`>N5_+Org8J=oybudh%!&Lqgf)Z7`#iyd&XXuV=x)iow!)nF90+M! zZsY%?+Ys;t8-c6=g2o4Y))bz__WeV>rv!L+AX@e4ulJFQyD5g&Se2SSA%MXyKOcb4 zWE&@Z|m!iV1V5p8h2ijBcP9>@~jC7P*gjSCZ_0?NZ z^H(7?hw|CYkI`}+5*yiH=)pgsMfMR`oXt?@pb&((8~4t|SW>LD>3I8Hh+=gf=sbvb^(wHq}9)0SQ{9^SGZuO%h`CM?z+Mfmi0lk@cb>GmPW^Lhhxyk-N4gJS|*;WV~9jl2raE$B$6rhK#+D$aeum~L&$0=tYqK08Ocic35 zif`V_#r(UoZfytvww^(G90B284YJkl@8fSdrD_Uaw0^+*xd_L>+?3C}DHW_5Ws5d! zN>w=^2D=v~oemj=>zETXzI$1NlCe7E2A{663?DC%)z0c2+|-;WHf?^UjN`_+p8V#|$#zyU`91aD_b@7%c_bqFss(HjG$brotOd;>JGdE%4Bn zjewa_+U4mgSB3qp?ur8cAy%>$Cwx@N?MkTHjwW6t+N12jpZP8vOZ)`L`ZIamzYVz` z6?i!Ej|~mM^CJTw)eX3Ook}OVp)BY7@3wBt#)DOs^F@TM*L|vP<zF6Dq|{jWi6>e8?%&+E|HHXE?Qdyt`&umvyPrXky&9~d z(g52YH=}6evYMwb;8#bBBTE8hRk(Zu;2^(Ts5=En(L_I%;Qx~6%>V@%?VzdXb&M>5 zj2ij43Yk(3UrwGVKkY_6*3|O(1=av;N%@lmC_F;x=85~VV2{u zl`+|w|C$?F{X>ZD=d64MCqlF0+~P4Sgs=hkc@1S>Lw?T8Dl}x)VxqKzI4@i7eweW@ zKv!(z5RaR1D-MFR(j7>wR@8tt4QIVNaA%&ZGh5Iuo$98ljJ12&0$cgEO4==AyVX#3 zN+523L{%<$hHqkhDqb!?< zIkihs22sQShlvOZ_P4PDmjX50g`S`x&|N(3|1$u<`s77ZCe3l3D10e@3;XUJNUctM zf%fg}gV$M=bWP4A5~eo}^M-+wYO=)WM~dt;asFP&p8H2*olP$F1s9^qmaX7I}}OK|bRLQzbV? zL*6{VAWk|gIL2WFx2kHr8#8Ju07A#U81S=s|6O#wK(HGl%5Wz*b-I8o=1hyE0q-1r z_Qpvl9EARR4rnXEJAh#bIpHHbKSbzVpRw2F@uf(1sf(e1Sya5h$pXnWn}gs+UuEkU z?qmZfQSB8J4zu5`dL{DXUyOzuvAmn+rZ)(3BcKUXjx_Go%DXxn$4frU^O_Mn0c;t$ zB0elY|B3h@NP8)pahNliBD9&HMjiGoxei}(>|A8D?bnthb<%n&(KsdY*bC)Atu5 zEcwSe%5ngiP0U<6fe!&(B_c{bJ0Ep$y+{iUfSoO@g%c4v&30)r)t!j4Ee;$m4~){R zdTj_1p10g~@Uj&h6tO{1kW`zdK71N6iTV&9JXuE}7rV#LLK+)ertr)e2M)WFF#FCA zKi2s$vrA~l_;c{J!?ZiuIkGD`i*2|Rd|dmyBiJp6=QE~V{bG#_lY_8qaG|#%{HSG< zX;;zFj?)o9-sK9|ZDThSgqH>Tv$0Ll0HzcbmaO|AIe*aF_kcSc=>8W${>WPNGbx|R zXVRrt%NDz%@!tBfily)p6fs!wSA?Z(Aps*MB!FYzxSVlH%V8wQYaW%p!kxbPFj_BO zXoWC?2$#Z~sNmC&Sj^22xmy~pt?)THi41GOlJYFAhU74WFybPu$*b_0s}1YZ1M&}2ZnY8pMkZ= zkEQ)BV0wyR;yzM@efZ4*IEQhOS%^%+?^Z%V{rqVkRN)ZJ53$QdRYT|3(DiMS>v^L8kZ(c z5O%tp99v%{j@h1BoXzNC!Q(lIaZu61szH+{XDF)|(4Q>qj8s5(*nsX0TUP+Sqn_}R zCn(5BiI~Hv%e6ta*mF2R~s|@zn%QC*GlTT|Cu(6(pRfpy% zYVUO(=px^Qjw}cZ?O7ljCb}ucTSMS8l z${8BT-er9B!Xk?Y#r(eF=_s1$kr6ODr7_JI?hD71o zm@Wzo^~w{+g?Ht0=Ae^Za|@C-z!-6Ph(9$0!@vQ&u0@c_4vpT*Bz%AVT%}lK3go2nKwLoJC); z7rkdo1pe!9`1kKTy{CI`{2PCmO!Mvr+`KhI$8htO%6i_%P{re%tB4HBYVh^cJa5ls zgtKRM;nsJAK3tkACj367Jm|5SaS)*t0lU~WBc@feBMK?ri!Jd&SGgW%0P7Y+Zwfx9`MNPLJB+*1j!0oj?#8kG|X7k|iER6P{_ zZ{$&&plnoY9F7hBU>c3Nj;3vST=OiO*N$}5z|W{D2Y%%%Hj{%a=)v~p^X@G?@Naly zHY?D>rdtQRQ{X(hABIM>of*&Kyxg2`JtZfw`Ng5w+Y|69$qPIfqlVfprgY+NYk4;E zA!>ZIoD2RQH16?`HOCPf`V!z)kBM5$Hel4px#U=V_e^>yM{i{mhqTegX%7cuBR>l? z@aT?_u@{ESTxhGn7^u%UpC>%m@yi5WC4Xn)=I;~$KR!Zu>N#1~fd}TGewHbsq9uKW zF?mN4{-Kf@&S}^EC^wbgd6KE>770uOM%XtEg8$0DC-WOPHp+LleuAG@bgD|lEM8|j zOh@SNl}}{8W}4fmBkZuny7UB2)Hyv|?i;-DW*!XJke4C5<{~TIA0eQFm>hV`#Pt;h zjy7gCQvvf zBjOiGUUgcP0Rf6Q!Aen8t5MteB(L_XLXw|f001`Qdle_qHnSpQ%u0U?fOI(ihsyYR z9INlvhhkWK303JR;lK_}1Ub1uA^qNtLJYp8!qfM0tJO$M^x2VPLGkUj5CVVzT(cta zfdH`bbjuAeC#uP<1tsP2@HaD(c7I2iP0?ivvPW+i-e6AFD}gWD>^VMqR2Gj)l-E+c z&~#6DMdwqdj{c7e%BwN*6u#KX=us+`ZCKC;a~tCISWSI=CR93Pu3zD*0-hh`OO#1a zD$EAn_jdb=ve_4_Aw>5>Qk-Pl!_g%wg7UJ;5> zBK;ONWBJuKU#ahJ#NV!sp3cUNo?shl+uSu)R*dtshS1C$g;+dLI8%+?t&5qHUs8pZ zOZ|bT+HqiDhup(UnH$G)_Y)Y?b{q!L5K?;SWNW5KEOHO^(^i=hD9WP{)~@16R^9^jgQ&!Wg6UvhS~>3KfDc@=8c=8} zkl6w>W1tsR8#Gl$Y0nRVW z`2Gqja4mbBuq z3GS+*tw%J3REhK3jC*wy_i!z;SjM2H03|0wb!Z*&^dA}dvNF}%7AbZo~*k*H2N)Cg5wIFj4L=}XZfwREd)^K z^Z|N?xYn5a2jl4X5w=h>%E4S?gR8|S{YYaDP8E3NX$KO`Kus`Dx_vM+58f4r<~yV9 z(*GsRx8+QN6tn)_g1(D3g0XI4`>JFqZM28tu-7+W zm3HzS2ZOnS8QMfljm|FP^PpBHss+@8Xu4str@NjYu0BCwQCWY>M&jh|KQr=f`YNTk z;!1a;Fj2zB$*0HZn>38A}H^~%S>|2qlkILf?1w3Lt$6?D^Q~T&XF83z4@8gG694QInwp6Z4`+!@EN`}H{ zXoLDryCVYQC!K^*^m*cwb) z187rO-;hcCw{YP{F)#{GCYCvxHopWu7BfQe(T>!K-n)wjC=(1(<|~tHCBj#RwER6Y zq6@9}0ki!+fqr#Y;URKAzQ*fu#RXhEG};VPY;jT065sJguMlr z9apkIosvB-PatMQOKwF*J?E8JPHNSXxPXEJat1IdMPisA2mCJSkD4g3-cB-JO%S0+ z0lBJJCe>tY)Ek$8kdi!C4S{nzo@iqwNLT^E0nDKsUd?P74@1|S&M9&XhMz(dY{4k( zew2orYZG`}DjrgZ4?OUfSBXf%E>jN&OYqJMSXC62f>LsUD`zWMcW@~;@e|zQwGW{5xiA-jF4gk49e#gm7E$QyE?&Ncc=zMH!e7yoTML z?6qG)`!_7Le1Qrj)z=gtmxvIE3 z6F(R;vWMke2B!g$LWPsm$bv@G)x7i#pX)j@b zHy|-hgEo4q;rYU`Hv_06m|rA_(|~i;!T5CSGaGjEU)hjgf@VP ze+Ew?18Q*95$~kqIJaJ9N3ucY<1;Si?QLAd&2Z`HRo0K~a0viwA=CGru&r=6aC<*+ zyPf}T$wGZ1uf;&|K18W>JI`@3e{4qRR&7cptPqz+;3oS3Ra&$2MRMO|5ZUp>Zu_ER(go@{fgNL}?)7+|ELEvfO!qj|b zO9s%L98X69vrc3k%i1^{$L|DY%m>_UDfwba>Z{?ikw;l;neD#i@$o|TY})pwFly!i ze!g_QZC_|SXNLNz0;Z}MBZ}`-Mu_enOkh2r4f;F>p+fkpbN`oAh#4J8^4l(9-B0q= z>moNA((Z8)^(wjYiiqvhH>qt?e2Dc%b;ihT_Yl~a3N<*ih6%02F)~#&g%|?hKoiCn zNFA{0??6D&1(H#t0rgs(4P8;2D zv&fp>GhA#A&oTqyQ(@ONtewESII@>8tcg6hA3u@t4Ibikz9fS40``XZ%Z3{($aG6L za!`t1EsykD&Z;@g`DEt&J@gDGeWo(Z4xS`7bfw@?&uFTdaLHe(0~mTnF5jDEgKp#U zt3hb{1SO|%{XTUey-C^WPSi#>D8TmSc%_FQ@ifXLn#I!q4XMq@m-aIGV$Axnqeuh_ zJ;k#q-8@vqQp$}3wb}R_b3dQW89Y|J5ABD|9ep^#D`S&lF&%DN+Y`x9rOlfYvjM#Sa;&=_kq7XO0gWZOq0dc?H$Jz>t3oiIM!>K_>us-|c zvF);^q9f}{QSjO(daj?!cl$l=X|CwWWV<- zlB_t(6D(pAYpmk0$_{kOZ9KU#)CnLJecbQls8g=#8J;3-X94E48P;*7SD2JHcqk#? z=e|b1F@_Z2j_FISp0d zKVDGyCrqj(jV(UjdP)n3u%>wQRXF{womM=N?QI0s8FS${EP@Aa)QS3SKFl~kayw+D zYHQ07gNQI4pR>vOD$BFZCC~|sTqfmhIDlt|-}2ey1m*w?C;vX<4eV!s2{O;J#M5A? zb(Q81>O(_^>dSH%ML*fT=~wZWX?LA!K<#ev(0on~iUA%vF}KB!|oo2rS$j!Y+u+E;aIq8?CG@@;}uh@|^ocS|*Fgf>R%==MdFE8^te z=aUN8#W{dfnrK+xOx=eHpySX+XYgcQ#|l>t+A72o+VJQ3?68!ccTRLW3jDv|caMaZ zhXA`ZzhGNT2FM^=_Ya0fhk3Q?6k;oe-auRByJVPxl?oS9I)TV^Q(fUBHXiaklB!!*C}Q2fD$TQ&hq65unmS5^$;X+nJFx+?~3=puB=(#>M?Z z$hZOzKLniiAdN%#ci&=|`+4sgF0(Ma(~-feHvE7^i3lQ0dhi?PpL&V5D*Fc?ar$^| zNVre*b~Ms~g=598%01T*U3toMd^ndGf78@aPA*O8O|V%9D|iLhA7IhT<_-V+;iAUw zg7;`$MQkQtC>eMVRSkgDwKkss&H2pJb0cpA+Tuv6A>~FjD8xhtOFKdth1ilz{CBzn ziQ5;-REdXcFpqy6-pwwlEBu_vA9%mjR7~k8Y8EFfhVa;)1R?6p*l#s%Q^32*6bQFF z*o&XE*pf{&%8Y_z&J05ckznit`mNrbbs|_>_#&;>A7AOKCPL41utsjU2mvaA8N_q= zk}qbjaQBEZ1{vUpkj^3yZs9O>ehk=%_5-+sk2Pj&_|9c;`W0!HNkpNaHKDr4sdqi$ zA?3NRo$;u2uKDMylU+HY<<)^|C?6ygd6~0)0l)q>CCKQx&ASxW;LxtukZnFiR z0eOV#dqQu;FP6md-KkYsXel0FQjbH^nR?}qgeq|ZtHKOwZU*42M84kX_*{k5=jq^E z%s2CKFIR`YCIa(7pYlNUai(S-RNPC)liN7BNO>8w1=3td1_I;5ML~xm%+N-W!pumv zmwk07i1ul`%lM@Z_(^RTw0Uem>?yp8a8nzqc-qU7md<|VAAQQ*wTH6!B>KWgz{gV# z!OcfOcqN!W&aYd&83 zzvMf#-?NvqT6sVR(Nmd*A3&}+JuX0&BL(>NgQN9{RF5E4l9CR=Ga|x=<=@597MW1C z5B$2&@$oDz2Xdw7DAP#qV$F^5x3}*vam7xW#>a5AoWpNRpd>bV`ZM0c^@w zv_)=8c@Q`o)UqrpHti172Tl+pj!iqr=W?_m6{6&Zk0a5_XOANu7jxgc#D z0=2g{OsA40k_UIs=)=R8W{=0D^ArOh-stC-o7f66P%JHej41+(aYfc|=X!Tzl+6+2 z2w+`!&57Rm+3=NStBtqlev=h#n&!HzYxg*qq4 zEkENg(F`n0O4f%a_ZIx!`7gymK%i=4R~-z8`$^LmHFFkM6U}#yV)*2HD5vCdxkOue z4yHLAXGKwpb3@7S5(;D}v%#P$yzM(1%N>VC(`dJJcOzY@n1EZm(hT1Vk*kmo0c&D- zD%}> zNb1a2Z<|#txR>cR9zt4&xe!$V#n2F&%BbLB6X#DM&#ug>7#H0E+)CF06Sd$~@U3$8 z%p!-7C1>VvS7|fDFvFOO%_z$JB)sD_*Rg~6_aZib2!E*-UMaj+on{sUa%Zw|-C_E} z;UlXNzE*g9b7U=nhCX!4bcQ)aAa~6sUui(0dN0(NbO;cE!{L@o^@0ms$-^s$yHZ!s zNy*e{-QRI0es6iK4t_MHI9l*^SPmDIH^`MMg3%(TG7sCTS%jt4JWRXFwDdtOErHC? zkVA(g)9$2dejH-<6KICD$dZC1SC7No?!{@CTaFl6AA-FAoj03IraMS(QYEwIaXN1V zKj;!*>^9Txe!7Yn2!40*t#>?L*S#2>E>b)a6gkVmf{b2|S8bAbCj^bh%LEXY;`y*K z{9D+|V^+GHU!CKt+PI;woUbr3!A%!azD>LultmP*djnpH`ORU5A}`4)-r2=u+zh{>cyO`T3FJ?_29|k_ zafk$!OEQycG5Q5i7BYt-I%nguivJk@3XnhK;LRpv)KJZK*wyVTSNfY7wej1L-Q}!# zjY=YJ1|X}L*)0^5u=2e*f@RN)z@0`$7rI-V*HrjgC=tA%EtzIBwD*9~al&-Rr#2dI zB;kzjT6Z(9{fuir>N~WNQBUctI5QI7Nky{-^5%<$xUqYnsN!c|#Ax8o46A0LRS|o( z&1zuFzc8$N6w0D3X9LEre;4l25XXEwr6yLRR%_rVCKUTHa)iuA7BOC@@R>Z2Ph+FK zS6^m>5_1V^q`D`a>;|V@Ju%()!rVq)hL0?p1fxMjZV&1?KT3X%EbzIaHay5iP*~za zcD9%#D)Ui`Mc6?}Gx?2la8k032tH$5W@*5Ixt5>+0WPi_hxD@pV7o`|DR2Fmkwrz$ z7?wyio7mAk)L0?;X7eTx`U*C12K}zi@wf4wte7dl%*c4cnJq_uGsb}Dqk#`vJ5_9J zKc=8ubaKwOa~?PQ@COXA)#q|tzOgY-idKA59h2?^2QNebeL()=W1iq1YJ`OU*=yJ} z(%$&)SXo0gQBLf$A@OkE;nC(Hhap4w4o`K$Y*6MKt+XhVG+wkWkoz^-#hcOHb9N%d zxubW4)1A~qAC6G^(8fs+POeIK{cwqvV=8pdQZ_i(Sd23EfF0&g+~Kp#6z<(=KL;d) zUgN2oaqlXB*#Bpc|f(uLZYaD z3zZG!v?#>A!L1fvd?} z*pBz`o6Sp+yHMNL@tkqD!>OFI34Td&(ZqOhG}b$x0O*%Xszjt~ zM_3Q?bln^z^I)jAcSp|EwaH1lHv2O??V(!EwsK`=9YrV(i{G%6*{bJ{T$a>`7(3gO z<;AijK)jjq8!F)zyU#D5*a-gyP8^vQI&Ow zOd7QxT)z|qAV)wRDq|2wzzzIT6rmbO0aKM5G6i+1ga_fA*QGy(GGQneQY6NO zEa$7DZt$5@KCL382PmedVq!McpzdTm*Kwx_T<%4r`$#MhYeRqLFi&N7rm&a4il%Iz zVL||SrYjrbd1kQ-1h)o2;;IayeGYMYcd|t)cwlF(TcH?kxP2V^cFM&(iz$)h_bcH= z$;{`NRb_>@$m>YmNMk2&tYX?5kyYfdMYC{WQN@B{bW{V!iCJ7f&6DEqL`KaY0Ea!I zeEk<|y+{;ku`0wI;podmqd9sXBkeG!7WkmwJO{aVFsh<!f@HYZc*|KM*vzFb5-n(qnRbm{s!Ez&k&o=i z;CU6j@}Mq*3|RxDSRT~bL$}h{$hsKA`)^?Zrd!Sv6N6ZUdNhmCnOZ`dqaiOwq-EV zGv!)mhDcZUqyMM!-MMgA!k2n$ZUcB68)0jE!lvB>Ff+9)pZ0o9g=g@rBtHu;E3by^ zd(~i=4-13gM%(scQiZ6%Ad{kWo-ovJBOEF}HO0g`tzcVD1|CL#9A0MGVcO;1+i|y} z&zeqdGnSCpHqTo^$3^TLw*6A}&W`T=^0+~{TN}|U^w=j@Wj{Ht$s)8rY|^5HsFRqzDR@!$;UX{p-e9t9Qw)bNP`Z&~8G)DVuU34S1_^_S z?~y3S{vF=vEers5Pb041xO;^}*YT_SsO_sbxh&Iv;or9hw7NdonQF}Gq$$wxS6 zaaL@k5BV-|5LZ(a?U!O0P~_}Q0JsUQQvUjQUEfPNj122d9sTb?d1ioiQ0u}218%rQ zb{EJ_idh(xt{qD;* zpLg-a=RI@ITNqD_b|0@=WPTyHD`m+#9scxyxhN34%U5m=?TE!jn>XBohjBx%*B51y zdlGSK*W4H+@A`Bsc$7zdjf3&kWNo2;Wpg&i;>iS?19wgcB|Mc)@$Y9Q9-*P)ttDz% zw7U^gawkm$-sRoZJF{=i;RIXFr#5eJN54lsVQ5S-ql}g{G`H?f`~+VZ-(JeM^LALD ztqfA0jS#aD%}ry6$LprjI5~dPIH10Ad;|OC@mj|v+p`Zq(z0HcCTo34d*fDwC5!bT z^C$EI{}$PA=5Y}HHV(5ettw`nP6aDZr^+g@!hLjBpw~qmJhZ8YlK~%K%8OC-5Wq@Z z7~*9FGdpRrY<`I!PqwpIG;*s&fRla8o~^VWO#Fk#!F`?>-L<32Tm zri+B@?jhU46BIzrp__9yuQ0FubPN-fPpYIWnu;h$S=tHLwKd`KtsZ|3VMd%LRZbKJ z93=TilL2o74K*GmDBgTeYIq3MRfM`&rAOhBmfwXFb5Y9S8+na(WBGkaN3qi9p*jil z&SwVZv5cjm;h>*aPTEpp;=TX3nQ|C_D1+I;-m7tWoDFLDu$z7k*tnV4ZmT&MEAz2* zmeL<$BPS~7%Z+l4wRO`SkZd`7DRJw+1_laK$wGJk2Z`U-Es9-uDz`7^wc>dhL%pZ7 zDIvkrY-+*Pk3VKBR^V2*$Q;r>&OE}| z@nE+x%d|f-=O$BDt8;={+UQU!LZ}L~&@_q6DRT&&2L(0KfGAb5jZkQTHVx{aQ!D`s zgc91Q9gUEt0b>%|G|ByZrR>M|d+x`5|52sQkI(zZ^}epx^}4S2bxnQ+-W@y2(r0Q3 zD#sC0K~+J1UkFeCW7=5+Fd(>A774|7m3~n|!>+{5T)Jdsg}pW%=M>n1m9sfPGY}g$ z%ju%UhTyZV>nulTLToII$@OYTl4@~OFRS(Wl|HHibW4dHKOHjhHLi^@}ZPesBhn*wm55^6y#D~1^ z<)|5$r5MALjime2`bpY*DQ~=*F#|@FJa{<};rA?6QvM!Y;kIF&uTA)`V?PF?gl)UQ zLf?2LEAFSf1irFe9>z)>M&;ElLpNu3v~DCUz*C=QaJWf@4W&0xO`m9V0Z@$NtI6>h%tfAOi|BW@oG*P!kvP(z+& zm{v3n*Xc4b;LzQyjrw!y7${m_sK$y==y_^Z?TOZc81WAU_$|TD$RuU>cDD6g&8by^ z`9C5V;B>vo5_7~TOzv3VW2K% zB3iRc$r-Gk8qZlcvPy6-OfrOnUtGv!ON;sx>MrUgMSndDaTRnrmcy1`DD zl|E$6`?3kCCoYVr-y>NqN**>TmWj7RGqdRaAV7c^)%7Milir6=fhU!ZdOebGU2u(B zE$6$kS((L#GPiH!&}H?6Q#tHPyV}08Sn;QtxO+^rMTw?eSga3F8F=IC zcw6TVey|OG)V(}}4$O`!#r%i`(Xl;}+E;Wibt>?98>&RCITtvl&l!uq1kT-f8E=8r zx)KR^8f`^g8uL3rN96Icf9Ou?GRnZ&ev* zbJ+ZQuss&wKF(sP&tWd~IlM#U4i9CWU+m-G`N(!|#@G@C{8OqurS@}c+RAA*5DP?K z5NlMptMaNdJuxQLpe3b^c31G_ip1XdB!8H7UND3Wo{j*xXziFdVy%^Ul+b%j*OHUF zd3Gx&#eK{^p%xX^_)6vXk>_nJPntgNiFfGfh~SpCtL?PvvQ-#{hPB5Ij@eA8w-k3e zXkQiUp+j5Zr$kQLN!M(0Jg6KqU+S-o zm&=%+gN=A0=C999gh%=josgpGEZc<`MI@r(o&x(o&*_peH!&=)c@bLGpM@_Hyen;K zIgvBt$ktRs8HT6-7m&ho(CXq=oDCe+@WQQ@FZW0CPh+|~23X5SO-eqwOnP zC)CZpo}SIgQpgREb6XBwf26#dS+32AOJox6Mna~dv2Q_$*Mpfe*Gvgf=E)9T;E#PA zwzX%hKMq;Hm&up(DgOPKVRJp;ZUgfBFtYJX6S9H$uVedT_j97wk;iEIjh3Em&QQ$& zjm#%G2p3C!#=7_uVW1^E-NV}6ODaRESRC>q9<5xGFi5o5m$-y3_b93(h|;eTp;aUjcYOj%QD4|sSY@?YG&W{@+R$e# z76(YkScLf&j5Q0Z`&89zK7=7XWHNV~l&o!Jl8yBk)Y+^|F~eiIOg;ty`W)g5l>mrV z_OS+60HvLLq)~R3(rP20_q3w`$0Kp%Yf%skbd5f3?(usMJ(tfL*E29(zxf^V>jPJ| zp!$3HeKHcOiw}5GLnIO#Sh-ms;GD}V0&LY@hcYLfC*uUqGF7mV_Gw?TqiHi$9@459N9{vkRPICw5O+D^H z^|zVy^PAX7^Zw-Uh)$Li)>C}_!NJ;e6NW75NgpGPwJkgCk1noIEvwup|G69M6MBdD z%Zj)}qa!@xy&6Q)lKN1O)PH|$4cnX`i`5X^ zIWa9jPFyLl*OYL)%7iPIElOZScbFzyc?Fc(0B90zikWfz(e_tL%m zLy4YTCmB;YJg`z)UQPpIsiX_bcJ}R$WdxT&$QdyB-#kufi?f%HK1MPuzo}xuY*phu z0VY7&MQP2*(;_ZrOvZc4zd+aCr;fH8N6@ljl!#I#?kmLY z?BLWh{xTk-><}`BtA3V@?T;duz*fnbqFuSMFgJk~vA}`3gmX>(wA#8hHAWh^O+ z0K?J9*fugp1z1-18MzGAR{uCQDX|Ehq9Zwgt(=J>PWg50PU+D=pf=ThV*vkj$i5*(QqVn8E zaI&36y`4qvLK~EFN?L+R7)V;bszHV@uN|y#n0;Ew)-GiWE7Za_x9p+^L%y)N0nz#w zxWh=~JxarY&T3#2(9}}#`GtMuG{`Vh0(2ak+lrXELXp+3^x9L-nZ`Zd>yUr!DT?%Z zjLI4X=Xu71mOt%}y(W7CV zf4i^F+kc85U__V2u%g99IQ#`B|JE}rEp@%oXHadHfvWQA_M=z$)e zG@$?v>n*VA7d=)?SK{g9SNkJuk#-=`Qh0|;Yn}^Nh6dQs&R>8M#L!ei> z`%%CjH4i7AC#pg)L9Gb}w||qBy_wy=1o$}tjGC#iH{Vbet}t+Kp92eUY@z*pOsN5x z{^aro-ez}OG4|r=4~jH7ghY3aSTW^3qjx5br>+~d`BSGZ6mn_gW@PPgnY|rASXvt= zNl98OsEMZX9Z#J~2+kD`IxTKiLM^bDx}U8`yn$yz=?F8KYN|?SQ|SmCjKW84WzJp{ zhEsa373oz~gFyI9xgm(uC&fOAk^3n?t36F)!MOF8X_ft&eX=f5pnkABID+dK@U?)q z$qZ{2FN{9wC6b1GZ0FQeAyf+ooxwUO)~z@!U8#N9y{UbDeW`sNdpNPP`P4KP`!H`5 z^ZP>0Izav5U5+LXGJa`I;g^dm5Y9Uq1C#H?)cSxs;^r|h*U+EY09;Zcz6~o~5~ra< z5o)hhi#99qxWgNQUo$S}H;lQ!ZaLA*yg22B(z;1cwIhq3W)H?}-P9w6b&l-8oJNSi59bj?*Upqn19-?a{|F z^qC@Tp^aFvB&kk#8ruZQd84yACtiD!Uf4s?_rXNC*&Okyd~=HgE&W$$YUfceZ99~#b_#%dwh@Edc7Pts9w6&P0dW0e@>dCz&dAw)7#B5`?%o_Y|V>*fDh7^b7v)nOyTb$R4~FUU%wupez~}a zEa>6UZ;mBZLQXp(;j_`HtgiJuO+Z=1Eu2ukz2j)|$q@|+g7ieSVSjK7hky&eg%xR| z8;sgr1(10bVNk8%CIt6IxYpTlt&QxKNGFQ_>4IK865P$7AK%A}3TT@=ik{5@ z62k5V20xBRi38jT`8)|Ta1X!Vz|Sy?u@4rz3ay?iLQ~xQ-%-Si*q1p&!=Lx0M1-}M zyJ3dFg)XVNCF#EM^fteZ=qY1Y{?lAe-3=_o{hSw*oJcg{Uc-A-41pRhh8oV@YrHe} z1h0k=?ZiWzwEs+}ik{1KWo|iV^HT=0F>z_Md5C@+dyJnBH{y5mkwju$Md>as9LQFS zF1`YSDd});Oubm)d-!i0@zm`9NgCV8QC+YR0hrpioE>$<;)32N)3x$ijxvu|FGVEs zUyFi_^S7cW?%tGk2YZ^{VkbRup!jtHGCxHb{wsCVS+m$#kl_J5?oFpyT``&6>_I73 zYl*0QDd9{{2z3iz!`lk|ye-TJC4e*7MsLj?3VeUg*!*ZJ5oa&KwI}YtTJ31!5E5dD zUE^?XZ`Eb3dfw(j6G!-h4QQ}4ynP3z%Dx?%>2CJoEYG`n$US!cUS}o#nNL*i%Q4z| zlV8`^;{8D{VOBH3cZIw*rHFR$u1m!eRWrnHzI+)^D^WszJ74C+{sm8k<4;+ER~Yoa4LM0atFkenX{U|Ox<;%OYo9!jjMkju_31-SuVaV+fckw9 zakVS-Tgsyr@+e%>>31>8gJ;?5jY!y(zUWxet}%FaJnVq#Npyutq=ezrG2Xze?YlkI ze10Mdiym@$<(!XX3)6=k&UA3|y}>F&Ezx|KF(E&8G^x;od2|1yZxfRLBT_eoIp|*A z70L|}dmH7AlMnxhX%@2Kslmt-(V4F}e{^2;UogCfiB2Rx2%I^$9lTuLpu0$m0bG7% zMi9ozyPszrWrk56(}X>*2mAKvB`_8Rc8a<)JWLlp9egr8_(Od!{zKn*xB; zX|3*9O7%9nfWyWoD=w3FM*8-EO_ zZbMpcWKAmpef50pEC7EAhq?;oa07sQN@5XqbCKJLe)%Wf|2s(kPz7IjhZog(HnKRH zGw56t=Z0PL{pt5I#e}71RwZ}Gx65&o*8HWTVtWPTeM^0^%F>jqN^VHDcxJ>28+0M7 zr7Wto!q8V6IcyNs*Vb23TYtjZ-siElr{v^3YA6q1L?AnG*?e2@>$Oy>mu(l^y$)#J z;RXA`*;iqz%O19cM9U>&bfjHqD|4Je5BNd9IXfIp#vt4KV!l;~*!mz#hZmN>x2il< z;;qgbV}~Dr^qu~IAr#rk>CMJ&t(+6Cj9w>%N{OiHO5GdIkeJM{5xzST{}%$ay18j9 zFHut3**KBj6m^BIS9@aS#8QU?#Mf0}D^Is`^uEn367vvdrP_UhtS~%?aXn8-_3Cvg2^|Eu%p`$zD4IITn5t1KVUuWxkY+YzwBVm7o!tqa2TIU z?ul;|JhlUR9Xz6r?V3;DIAL1*aqCX&F>8A^WJz|o);Rf*3_G0QtT}QM7it1vB9X%t z=jC?uoL={19C zsE6Q*S<@-t_eq!yVdLx3G@=i0ibcxZ$%1uI8p{EXKZqsjJ*;L?&i64XPPpatixqZn z!p0S0cu7-xDw}FAAyO6&)sqBuQ+!;e3IUh?e0#lFv@rw}8#xvO&w*vn(r;{4L+Tr>_YeR z#Ol+Of`cNi5DAW#9~;CApR+q%U6e?#!uVCSq@4y*HA4H*9@hg~Z)P-Gd3Fam5oN5* zHFQHxcjGR28GGBhhZ&O&jG+`0z3kuOw~d zflEQ~+a>j(^l$@E@Z*%D0)qx_Hu?FSC)LqM1TnVL9r$oCJT2)q8d=#%7<(46745q} z)fYMHxegkbKkTyFzFfQ=ddrtZ$hC!QT~oRNnLC*U_4TVt34axfAoYcCS;Bx~1?;>$$yec-pUUS8eJ z+f7n8?A&s3l2#>Plrq>3jEuO=;~?Y@P>;nx2^E`g04HMW`7#W7i}0P2e}Pd6i(-=9 ziAy<5{Pj9Mb`}*R!di{r;*2{4aTn`G4Z%^Y8wA^ZAS1`QjI$RH@=SQB%-Jj~HT)2x zoh80)E*Qav5VqB{6CjdaUBg#D#Tk?iigh!R|C>J^N6u1+9XM)T80Gaae;Za{sqn-I z|4qIT2;+|&4)RoGyHGgB^!&)$RcPC}(8X;qma*G0geHIFLn_oDYtQn<`BTyv%Gi$} zdjK-(<7dIj4X`fx=wnefjq&jW-gxtOSPw3E6+^h_RzDX_Ow2WsdY`K<(7H*&c}-+f zsJn45o{A~LXLc95NlIphi#WV_fJx<#2#RwdEl-t4MmxwF!EufKg25G{p#mJZd;&2` z7AB#Lq4DmiGbH!({l&bf#>(9sTHTZ(!eDy1xAq`TEo-7abJBd(TGH|R;68#+jU{Y2 z&8!lquOdf2Q+1H{`_A@!Q>91nyo;{ZYFviCrgC`nlq$wwxH8aM^jkl{oZ8J=k%+Bs(Lg% z&&Kj6Zbz?k>eKHUW8m_6IYgv0nGqzQR4vDGP}?#CM?r~E$`F$@4$+&xCGLo7uth`gGWd6<<^1pgBfJ$}j0Ys|SmxxBE(P)9gP>YG#+%R)5vHxp+8 zzImYW*j?y>yq9r{o?^s{E<)c@05{92S+C;Ts#xtG;=;VVQM+*-$ z_x3^vSjb39U@r)<|CI;6jsZ0=;VO1SF*+lLu9q$Q5|gkuhkh6*1xn?^@P#$Z~6qIDM>+pHW;1B)PF zMm|!RuxEr}%5@LT`zsG@COAJwlnd#)iDhWsE6^=nnBy`?_0o=Ej7L3dt!7D<283Wc zYIZd7Z!}zFhQkA$wER;uF*~|8bviOr{?7)6C6pV(dNuG(rruhz_R3MJjpX{8LabnN z+pt2;4IT$Z@GIa>gCYTBBq-m;Bw|vn0=`6tZzU4fdlEfArCS~%;eL~H?c%U(P%~n1ac9FYv!;mQ9n0v)J>^FTrdc7Zy-rO2$<(C znch6G>Ll=n^=>w@C+!uDKcy6Df;hAvhC1GfSk6IU$_>s;U?Xz_TKUTG1ZH5YERaH< z`Amsg@0(CB>Xq!IS8{MorX=kg<+zdHUIyD7;_d;lK-BT&OeppSdPMq6Vch_K^sqLs z16-^4eG*0~$@My=II$bDpLOCuLl~86R>&bDP$|K;u-PH8!~1})|IP9Mg*TxF^K8_U zh@fY7T!gdq!!y^m+Cn|CZ~u+geRkIWk@)b>o*2HO;VSy*F&eQw$*Tb>Wv&1xawZU= z4SBfLx9H7u8IU8vj-MOhNGu3n;1JFN5?0-8Bm-?OgFph6ivum#@;HjA1vIKM0ycb5 z(<=vL-bJWBgw$m4{4!>J8SvR8KAD3fLvhsKe* z$dI(L9YQuMS)Hd)DWyDgQ&+h&O|G*0M|u(b4mZ=PqM=H(OKW zcnE)ADbr6CLX&F3F5$qIqWb=l6M-f?RGSWZKr~B{yxOEY>Lx{sm9H|27C1#1Gyh#g z>%Um5y$Uzg1HTI~0|q7?J{hNb z=ioY&;Rc3p+vhKL`jI&CBfT`xn~hoMxTj9^8r6dpPzrGzmGuI;Rtk6v$qLhZun#Ui zW`CPZg(@B9q!8rA!`pED0}?rkG|HpswM|%?d}epItD_-jg_TS?a^6Jr!Vu-N(04En zuVT0FAS*Ak1VpnF%9|wdJkL2TgK8%$OAa_ zIhobn#mt(36qao;TXW9h@ZW|tYCKg-o=_w2c~;I`9|}SFAcWRLT}m<6XRruMBAh}Y zE6Vj`XR4yBG)t3{scA@jhV<|%c+uWtpe^CrFHmBNC?*%LL!OtM8%Aajl9^04lMunR zJG!i?-5*3g8>60N`7NE9lnC>nC)u&X;7oJEx5k3yb+O<$)epWF*_q7-f-0KwElx825S*Da3ilTR=aM9u{%;s_;w!@c=oBA3@BF06{rs5kut0!n;SE0eC{ zyA~k~mD;9Oca!ZwTUi>|(cXu#9&8Bqvqk$jxOVLS0yg0)em^+!+A195E8lg*My^&4 zqY+`vZgpg@=)i{o+g7Xg!UR%$Ix`8uOHkm&#QjP?vFCtKHeO<|63lQ)PWumhQt zhOSy7<+1KQCr?eX6}p}<4OKNKS&NO}2}A5Cb|}+8?jABAe6d4Oo|I`1LiW_uR)BFJ zlL>*g9Zsl!2J^5IG54T&E5BU4`m51`yvGodhC%1}KH4kW(5gdePC1)(h|LTC5Un~z zzK$Q7a~nR)wn0+uOO@!bE7o0J!s2)G#5J-`0Moe&W#OF4jw8;4bvWHRyIZ;CmIW57%Gg$E@QnHJcfMq(J^`;>J*ZVtIT?dYG zl~2gT@)pbTjD^{k?92Hyd5}bj-^$ixTP3uLbx&Udl=pq`GJyZBm=^848q5}gGIZG0mP+qF;?5Sl(!LjX#tdP zBQU`@1p0WKE&2k3QHn-v!J5oxhl`;S6Zj-+N%AlNU2;#ROHRcPrQE7*lW~T*pl8%w zu!fq{ik5!`o$8kG!B#HBvB`xD@b3U}{`;wpY*w*cx5{pDInFPhujUU~D7#D@5b<`U8S4&&m6Iy!PNAl(yC0Ska0 zOLT$d7%TK$zTrJ!sf$ELk(gEU`D(v{$GQslIY;~spfXtwnP!1pLFj_Um2VbC{D@;J zu{Q-ZvPfIFpL`l1yegQ|{-@fytRt8>P67mNxA5{bO}3 zzzKP_PBO39=1vZbNXJg)2PuB>A(KxM0dD!JTxcHPke5eDzlvf;oA_PzvIySBruow~ zw~<1TgT|kk7)iI*&}0|B$cNz!Ir!=*8ZC(`--Bk#(BR0T_-?Uf4#CSm4P@@g>CR&4 zO<6PtYOiC@`#fZ>v*?(JB}CJ=M+Kzjalm!w*Q8jZA2D`fCG9fk1X~o%Np6YLW6n3w z4@Z!PW-rF;wDY77N&KoJWh8W-p+IPC2qC*epg9+hsSq2mo#mOLn}={#zBi;skB4WX zj8*^iAg`Hz3B)fjz<{&Sx-K`wdTnBniPV^1qh_X$a6r}lELX39JL1)q$xth&0vl1S zyji@`r9?GBWj90mZK0op6@kQU<&P+Khma2P>*S>l@TG`o)i7H-2L+&{p2^iNdf>Q< zZe7`uZ9A|E87xH|Y@0V9#MU()vrSe+(L0?4>yGk}9Oq4Z-5tz2rfVk3KC4`A;X+&) zsV_fa^}1BZxB^@eNw9*-?7f6}U4ac3ZM>B6)gtZ-^-k1qDR^;!Q$0ag+0{|br3r)t zw^K~23KwqUMHhOwZ5v!e6TgV~pO3ga8jfeuGw4X0xv-e&wp`A^DX%1*f=ABTPPG(B zk|`&LW2)9bmM-a|?Ws3BIkD8tN8Np++~&&UMg$oU{GzVR#42c+$G2B_6PPjEkO;~s zi{x%L#z)>Y#7A(h=U1yF!;Jb+4vT8{VZs~ng%db8V7n7K)VC9+_v3uD@q#8|ddLup zqN64&Yk_h=dF=37cDQ>CArI_!sOqps;%z)OmJ@L~-)%k`@Ltvjak+7@VLZ!XP8OVB zoCAVdLv(x%>k!}w%vQ4D``F3+ciE%s`KtK4j;34)Vy}Yys4)|&KA&}e0U*4PsY25! zBO-ayy0`BWYmXF$P^mITY@%v!wy7XnBjDWMnMpkuh|+oCVwP}X;aEmQjv5{1^A_r{ zB@kXCSql!K#n?SiHa@O5Rc!;BHpb=__&!!z@4al(1SP+hb6C`pUba8UQa{EEZ=fb- zMQd`-^ze`QQ4(|dS!ACVHB@*a3?i5ajXFVJBge^)9C|cTpweVt>QwZk(VWI9NrI4F zkJ!p={N!@{Y!dZ4M)6}FLAjl-0cWxn*6?H7nUkZ0VX?(2yo(93{yw8F>b=Y~auM!7>Qd|3lm++vu(dt)EZ)W! znH$?(ijOQ+_HBY&@b`1<6@0rDGr1KHB@A4y1Si~!9l@*=e-Z?aNB@(vu;~*Hb941* zN`)#0SEKWgL{F+MWoALG$c!Dauq$6@?hQ!epmW4xCK8${N}Loa6J=L)ovLysFSC%) z#cew~4a$+oIqCEcc}UjiaVCbZ=1%J}%NShNb;n&P3dpX@Fm0_0QvE*J5w6zmZtY6n z%?hEYdQXOD1KQ9Vr8V2p)Q6R)tE)Laz^f?<4w?K_9CukY2sW{zCWd?v=?Spc_29sR zI0jv3sRcn;S&0$JV`SOpf@QaYz8jVrHe0u%LpN~D8)`5W)#eoGy%&LUn;6^g#K#qM zfJmoem4uTmpMuz*=MSq{$Nx@TQl18?=C)(T+spGbxgc^oK-K;T2s_kxv%qFILyKg7Zrp>ID!Z7FGP$sh%7ijOHN!W>+U8!x;0 z5%&Ns_ZeoM=ilGZoxm`od6?;xA{h03Ib)f_ds!9-UwJKSyb$zF3T5eTOt3Cqmto>& zolGZG8tEc}QU$zbKT(2aF!MQZa;r2C;`b#MLrYW1{+oR%cj|UF*$sHU9=KHYV4C6* zjR0{t^UO^!PRYZe^veH8*sOBxW-_EoBx4zP@BaS{CHvk_)%%;>PTLZj(cukltT6vE z)zP6F?jrx})-+C@;#Y9QooMviSWo2)>(XN>u-#n|loBGp*_axK#=gOvljZmfJqOuK~Q{Oet54&Zvv@sLx2A@Rz4gHHVV9 z1wLEUw*EOvOx*fEh~&Ie7w_1Gj70AfW@>b;@FSB}l?5Ts#+8cl+d4@cR^0ctLMz*b zYEqP&cvddS+w5WnSST?*_5kjTu1*tZi%AzxWdC*1xb$79B~ie~_{X96upv3)2J4i&It}9bV`kw{s}5V)hB#tf@^s) zN3~RaN!>!$$509RyATxFVl!|heg7y(3WK}Z_4)ox2p9!Al_xd|j!jOc%{E+2eDEV!A4m#SvNVuYb4V^65qNKL`Dm zD};xnt%(Ku>T1YO8|q7Qsuh+R%-r1(Irb2!M-eRZTVjs0Sdj&1S)&0Jz8mG4^I2?N z5Lary1z1*x=SmS#vu%5Z4>z@wNNauv0h=MAP)YV1$b}d|;3veo$8ogF9x#+;)r__6 z-Z*xXPUU4xtNC(cvm=(+((nBCOPGIPu^B3nd}p7sW4%zsS&GBH^e}kT{*iTGN3V5X z(Jok6vRGXYlcT}@`Ur}dPo#RnYq%_s-(%fdt_zI2jG2}k#g*=Pbth0FB~1AXHbLpH zmF~ge3vpV|O=*r|-Rm-2WOu_k{e?arswm8`$G0jk%}PWn@d5-TZCvJHH020}4sS_( z3yPr_shjdEWP1skPmxPqn3h|xo+I@(jBhzk)7tJRt~r9PA`qeXSePsM*f6yu%#hFZ z!tDgaVrzI|4Z!gkejq{fT0p%uprSRRWUBGuBkEhelmvwrSdEiV%!E-l;lo}I7^!-d zv}TefTB?$noMAhvy=fPC+JaTqfWKz3RY0QU4$jh2wo;aLt7vGv(d2Rep{}`SLCH@e zuzN=mFd4FM{|cb1U?;j6PBXxb5MuFzfW?Om<&ODaUUT=!I(-m`>rn$L{BnF!ZVDS$c_)rADVr=wjxCymj>33o-N6&-iz zGPN!2@8SAF6=X6fRwws*Z?SwVLjRQ0>;jBW-ECB5kwvj!hjRM1Kru}^>G7_Yes4xW zC+taU@&2r-2*mpWy0P4XAwstZhm+ zGY_hmmNK~Gy;*No=y-g>DR`*d8QqHL=vMS0K<#>k0$`1A0|a{j!S$Q@goEWl1+^4& zeb;mvg?xe#aTok%sd&0SFkIo`-|@ngx_S2$NuV;~-2m#DWa(PZ5f%Ip8ak=_Y!&Fh zMig@bPTBy8o>)arun~fGIF{b679C(vZ`;YVIlUvDDMnmH#fQKyDycQ6lpXd!u2E!4>OPId@G42Ch%^Q>9sC3Jn$)0{V^Sm8oB}qR;?0%wbm8FZotK&LyK;ggT0eA;4QO6E{t9`okEa#KZ#M z0pwbN^Z_(jrksQ#JCm5nO%_+0jE370jysmQpA0W`Z!YQqCub><7+%@Qk$RecoB4vX ze8I+qsz`YLf2&CN9!R4J`@T(>c1YD77BE^7S!>bNvqoy?S)TKBUiiK!sAOc4NnL69x4SFSE0MRm;?Pm3uQSaMqhxv;g0v z$e(%4i_%5OHr`Rhf+*T?H(dp)e$M7=N?j^PSGGEp{tr)#TYRQ%%%toy(C0UJaUye+ zL!5rh?XqIBRbM-Tqp3c?Caju=KFO5O zyPS_Ge@b#Dv6Sm;J50JZw`rlF475p%k+V!4?!+@B zJaDme%Du)Po(ChG0N-q;Crh+|+ISC-^UTcj04&4j$mCE=B9oL&dW{JBE!7SfvIY}+Bh%Yn!uYaa<7;gQk%Ef}9( zp->r}4^eEAxD1YtD+_mRa(9qX8xeyWS<>~a^BpL!wF}8E7XE{3Ryl=Hsz@l$B~GSx zraI_^#G>#d1&+x&R3}1vf?8@F(edMCp#Bx0JX^VUlgEtJ8(6O8V8k1c@%S<%uq4!K zDL>*rK*DXYz5fnsKho&AYJNZQwkew=NQ-^HckMSBy+@+>mEQ1MwB+axcc&p1bI5u9*8#ntAYba(?*7CcoB%02w-mI>cs zs2)9%h7lc5H6J4!TK;Po1EnGUw$FGjf-?FEg(QB&GOkMQ33$dTs=45ARr(?CDcl1R z(z;Y&T%;xRc^s_Z!roc6%FVubQ7zsB|sA-woo(}Y! z^3v>ibsQz&W3dkc({1w2iKMGO(8mbC?;&YjvibXLMrW9fEl#AqTs%|NB6Q{RSMhPR zY0Q(7ij8344uEmZadtJLyqu+sV>L>r6?S*p9@yQW-#eZ=bH0D)4~}K<#)R0FS=R~> z_3-p&w&NX+6=7%9H0kEoJ? z?mm`f-EMcLPI7-px8!Vp%PRKauvc-IUj(dFRbx?SQ#!(cUJ?#D$wMue+ct6_vUOjG z5R%&VWa$Vfd_}&513c@epjy!>3Q4R76OlFZn-Q)|nD-G{78g7h5;3#|*JUUk4oAmf zDk-65(bfD^hteuAWv>$WR7th9#9BbUMj66sZJCWK;(jU~b& zd&P6i!oDay{&6$VQIW)1e4MoE7|{~*A8Fq3G=DRTirkF|g!m=GC#C{&GFkmC$3_$( zf?W!Iz_$lsoPAuRIDy2Mkb5pVSm~REd{&&bPYN6dy^P&!<3U7`tCUr%OEf|fMN*7R zbG{jJZnCAw;{gRLBf3o^xPy0Z^aNI>Bg5@Af~3mq6r))Gn4v>SFdeG7+C0?i4aTE* z60KHUeU}HL(+5{uioy|1_aduE;*#nBRBCsKK5t=ML)0W@HR(`_DaFrl)bB@I_sKD37#EGgGJ^th4akowkQP9~%U_<#E zbH2dK?mVY*Yi3x7DmMQuc#|p;L`+Kf{gNH9+jD2Cctj^3Uhrtg7&W{L#W3;W_B7Tb zD=+fy$siP;0t<2?(4xXus(juiw!f5#b&LMFuE-FG{E^RYr^K4IClF}&BMhK_amUFc zfxx-%!epAbMQ4`V^`H`%BfPzs)yfrNAx$PMJdSv<9)Mlf4%L6p`pvp{?qIE*Z%7E@80~6=|MXNx z|2i0+gFjmIYOCeOAJ zIWWJ}8Vq##`i#_(+|W-FSzgodzWO%IzuJNw z{Nhc09H=`Y%UsJ7V;5tU5bzVSmmje|1Ey@AU2WtTch83BnQ{`aPniI)!fe)I?Dmt=PxcYl) ziy)3=q?xo@thT=7boITQ`3cUYKgc6Y`#OF;v|0;%F%uNDHwH@Mo#7Vv!CQP|QIE?Q z-CDIld1ZKC3dQB3HF5*u`mU+4y-*^R8+$lneP1WyI3Rh$P+ zw=4lq)Zv*^ca&$eAkdHS_2ylNn=?&8PQ-G)Ia(HJqgkEkC{2>u zlH5YCoj$r(=+fyG3kks7K;u5O3_Hc67IDz-A6VocpJz-IH4N`7@2xHKpQ3rBE(Tdy zrgk>OM_)uXpqDuq%?0%7@qusMh)r>+qv8QGrhvzin$h^{`q*e*iMfd8AdW9+=(Ci* zFp5Vl0&Q66P+k~W5sE-J-_i;z^Kg-~;i?J@#P_=byMtyryudfdX#^djHQpCIcK64D zdPg#ao?*c@`7f-<^Iii8YqJqBbJf%Tx*DbMD9z^{XEJXyna&n08O=vy;C?#+sR6{` z+H=wIhXI@?Y29%mL_nsMAS9}_48?3$ZInmLkhYblli>@0hEe!(@np2lMjw}U1PdO@cFyIot7#ijIt71% zwj(8U)`{(0c{(_sao!cBi0@dBkZ!(fVWiqcx%txpq81<%Yw5W!onYH0zFq1 zZmvi9p1`raCZBpf2S^Zbe1~r z{etgu>M;Ey|FA8mQS}@q(@eMI$r8w?K2GlrLo~16jit(zTuG5|ka9N6Onc`dJjIJr zPDxrDg4;$nW&gsI({K*Sn#ecIU|g|B9S%lAyQ#jVg_}Dz_ZQ|rW*&RmR)!SQ1VNH5 zzeu=$_*jZ+wk+W{X!hKUm_Ge+x*T+>%Kbut^*5xwhP<>l%bpHyx`}oB37zY^f@*CLFBu8^z?whl!T~AJ1#3^6jH0ivh zY0|Ortr#UW$7|SEerL`xbd)=IY4j5IU$ts`Ij4>=JuR4L0+m19&ONxnnwyiMaq0P< zmae~JoqzN{GcRl#E9@8kz(G1uw1N%0w0a6Fdw7!&_F|Q8JN$@^;uc6aqMO2Azp>Aq ze!IfFQ-%tqr%2_Eh1r>u;wp0;*`a2{*iZMc$&C?Geji2seZ`)YsOgST(y)~^$-N_= z&%K}IygYRZKW;h1rP_#z?kcZLkt4wuBrFK`6+LD~Wn$r%Xdv4d)>ic3M*g7Mq{{0# zl?{KweZ|CbB(xPxvaJw9gYK{Tun2fPrR5|%=b^?Q^2DiYve=^g>qNpBN-{YO5qjM= z`i3co&g=If{Y&Bu=~ zz0kj+Wg!s3#1PdWubg3X1wsS!ktb|rt#m`->t3?`+L?vBb3Qp7OzEp^8~j5IdN}Fo z1R*s-K?s^pDCALV8SWEI%gG;fJ#Ot`80H50OK&>DlizAHuov_#jyr2wTB~x-r2*i1 z<#D<^?qc!#q>u7d8VogAM%efIARW275R?3EAc(mr@QLxSzvLQw>hS(ye4pKNYE5Nm(1GY$idZv(={{hJjr|Rc-vpN8K5N$zknCKuy2L_Mk$#K7v`cpLZPu9W?|TcftclF5$|JRg&0GAo|O^rLL7-& zY**naj~dP~w(+d#@tS?BI#(0xRtH}M0eo{+4Rd{&aRzwC;X&})RUnn5oqG7J=WN)E z02PmiDPMOCn=}IzwYKNNz?75h^{>D(o76gUWv9aimU{dq)MhDCTq?^|#cC$*qE(ji z6_s?6cdiy5*=#+(IDc8yY730Loc;H;Jh9}&TpF@%!Cnv50@+baWypM0S z_#NA4g;DmaI}CIE^f_!)bZ1H3BrGp_>1FI<+g>j&Pb1HX zZQ@(IIps&Qjl^qEc*Dt0$t$tdcd4l~Zrv3u=){{0u)^zFJqoaLsD?I?w0?JhEdN)$ zt~6UVpca7p*pVcs!+Heyk!rmB+y|FgvkQDCm*bo9aC7gHa_6+{k@DXEKrtZ4l~pX) z&_Hy=KCnC-HyNl)u|0x_;77*y8GvrI)BO}zfb6k3{LO`>sCqnrJ_DG=Znwnt_aEZl z2+eB5K>YY81)=DPf-+Uz8XvFS_t>W~ltPz?YjZO)zGcYsvvGAZsctSI@<%q3rK1j0 zBX5jjT?|5TwSuys--+?mhuE$9rfKxzwzmYR7XCBvHST`bQN*!)lYvw+=HIK|Oq|P$ zT#4bGOpna`_D(|ksgGd(BkQT>zYZ#uGq?mBd%WvVpKYHTC#;w0%tx{WtG6#N0DxxE z7j*{zFXsR6Bm|u7I|cTqcm^VrzldDpQAL7YFH`QBqvG;uHqQ&H-cjhFM+2f7J0!7! z9MQHb=ChpnQjwduNnw3~?^ic?7Ib`?Ns0Nsd6fDkHzA2@`N&WhNwmMs1|E>w>OG8@ zH4mQ(1JxS+Xueh+5=KgT>p7VZF>)0#*woA9CtK=2@43>1#8uD%JHau3ote(7{JbYS z&zL2A-HncsYg5Zzzz)Dz)oy_9b_eN#FRt{(H%VdYMvWjv@GCy6UYczu3x*P{JZB(^ zKzoC?xr$k-LxAnuYC2#MY2&H>@N>Rbmq?*(rqG7DbC83wqo#m-bu5byclVC(L2bX} zv>1=qmZ@*GYL2W!`b+oMh7$ECyoRr8Kkqq==fD9lHLaVOK)jV;r2Hm0t^5Y86F#74 zKP#}3W33?KEc5^=c>Am_jxC9orqwLp)DW^ze8jU64AQwigJcs02bxW%*r}&=UvNko zPd(_H=oHe_NzR-M+#5*yRHkBX@aB?Hbyx`nY(Y;~pd;){p6SW^BKizjaah;Pp8Fa9 zHQzv_n_pppk~zpy7Gs0UVC*K{I}c+>BFg`TuSK^U+nvkgIa>@RPS@)x{NeT`hXf8g@(xos7Ex+WwlSjG$ExqG|5I}pD<6KT(`9|RQ_iUZY-^Iq zS`_r`kAwBL*?8BnD9&+XUxf5QH!C(gs_C=-cYhp-e%Oe?>qAIQuUOqHTB6KkD1>sj zmQ-69!p0e1)OGc8P|0!^y1X-9v%h)z-Y9>x1>7hA6_#MvRIR!G9G=mD`gB`xan#BknqR%MVhSFk(Wlb!c@o39jNuS|TH6acwUbHH z6hu;rk3^oP00KMHs#Qp8>i^{(ckZ^btZ(fp#7gmfcbkhi7;V{~Mlpd)B9^tQ5afX+ zEN|NqjLQz}{G7qzL(P_>qsEeBNWdpZz9OYRVLQtnNjc+;z=&N@{iJqAV4_WSH~T&j z7jn9n;ynYx499uY&pu9P;xxkidoFpl}Jgo9JM;?Z~wF^c|JZ?DdAHofTntmni{i&>FYPICen+I2dXuEc_lB%=73 zEoWotdpMm^=v-d0Gys+K5A``$>@d6xC*(N<3RswTZj`-cfrriknJi2=cxLM}(Z$Ka zC*ku@OqB>A2_~j3^*JOEzQ)7W_F(F#2?w{b+6RCSjd<`u-Zz50QM*Xt@QY!2c|(~7 zA}HKT+iV{s6N~NfuSe$=`ffrgPi8==W1vW@jZwArmAktU96R6gG~a4Eg57}Qu(Y6c zjo^Bhr3Z&1&YshqWZb@Q-`AC-#7+dgtq#Q=Bi*QOnen%yTU+wgAt5Vgf zFT5q}KVFL5ZTbYjdbSkk-Kc-51XwOlKZ90L4w{is|0{DRgTKx1@dx3=RK~6Ropc$@ zxHl;5y$2Lq&-;L-p^5T?#<7M=CDZ*i=H$IT1k72$!FwfyU#aQ6fM4=f*f-%-9A_mP zvRH1QSLjl&&t<^S#7IdneG((a9}JCiaGtTzd(_BC z&1Xt2Wjrac%$m6;AG-@luH4fxl&E+4zohMW$58Efh!B?COv7r^8V;GtCt$gKI9x5; zA+?NW0qJ=hp$~Xm{%hGo{)))g=NI>d38+I|N&roT5sc;1vnOV<5dfvG1UQ2XgW-;U z1X=%)6Gtd$8R=~eoQriQ7b2h$zRcdr{v8KtwcHGAl9ZX0lz%Y6S75lC?K;n?(eYufJpb+J`^)` zFIuJxO1{rVc%|Q|bS!AyCU=H0b+c2{;~cb^Wgin#W9w~j1YyMOcJ{XSG!$Md8~qXQ5T2e2sq7&Sx)0$Y$aDuX z61l0bXdD=-vdC%kVYJL!*^FcDeIq*$gUU@2B){zb91Qoj*owr;aIOxI zcO?Cu*ZYz;nOdGAi)bKP^MgnYi4tV2z@(*jJ8*380TJ{{1K)yGe<_AH#H==2+>I%? z=pt`zs5aO)9ntolMeJ?g2nc2;!V=UvdEBAG%aOAz1Uh8o-b0!Ahg+j-QmO>zT zmiURSe0u3ijv)NE$}`363~-J*{klQDiR(OhG_AHau)x*40XH$x!0!m@VYbx`Md#sy zAXO*^B6QOmxr+Z!{VN}xWP{uLE-WtM9%T{9ABwEL%5H>?1+L;MFhakUaejg5Z1@6Y zH)UX9*ey^`$is!E@UeN+-l=+n5qheTn;jjV6C-$`Ef0b8x*)@6^Mw=HYZX+S#=cWm zx#dBeleI$U6Mz7^F0vud==Eu!oSKKd*t}+SG;~3cK(QjzH5)3M#aw-rMh4 zUop9>wybVpM=YU~N5whxY7JzttJIfo8>qG8ZFOe}fRJ4^)dhhYX zwQ53)Lkq5-L@>dza$jF>L0R}NPZ6aVmM~x4T4gB`bf$KlTX`9a*#WOLo-qeL?vCEq z%kch^o(bd8Ye_y<&RbWFX1tm6@IYjRWi!O^(<|G{TYbQ|@7H-7*w)`7CzkCTM?{X| z*>ER6sPk^8*Z0ky*j#w@SNKdxE8DG2-fOsZ%5I2@_V6ZA+79^V>v+OFJmH0v z?e)hB$_*g!SQSP?euEgC-wuRV3IFoIX9vO~{}`#ZGz|L^bL*x72+``6*E+eJK+bn2 z#h_QYPGkx+veO=ba6JvSbM2jrY=%GgbeM{qbHgj9U4iPqmE-SwuYF1S5-tn?KRqbF zLS*4CC{P=0b3TXFbp#=}S5BNUsUBFV88DVWzhqDJ9}JHAoXm9tm9U=PQ}8|sjhJ4z z=I8)llK|hDPk=pt03M?-hd0?~PT2Y6@ObUxEcU zLH|j`zJ<-ZfoDIPZ=fA7DuIyQLDZ?jnsYHj@d;y>D&HRsU*PSHUFqm|2GTXMa(nsr zG=BQ{{Qw&l<7318{$Ht%@=D!;7x~=xQS=|2lbXhV^E5UJA7whWHOP57Jdhq)7)gs6 zo6*YADdo@}5?3`_{}@i}i+ zn6-mjfn5t4sYmf~x-X0iSJgP|?!zTpFgV6wh1M|GID_4Qn^<~k)aZnoU&NO*$qzhH zYphg|>KB~S1yC{rar)O3vr1)ZhCpUPCIcDC z?F_Tl7MTfKmUk0OWr>PFg$yDvW2?fN;^ZA8jxZ)GBsh*Z&J4paGuQJy)}Fnt>vuh_ zKTw$Yem~#O=lyx#yxupT_ZPR3*{6XnzFIG@Rl7LxZA{XVPV~BRaXO~^;MN#ECM&J~ z3?eVj^Iz*yn&KzL2jpre(L9X}GD^%VMZj1){40@cXmOha%@j3l)}-ArPJf6mTA*?K z1so?hu(>VoAHMgl(Eiie2a1tFo&{YNOSr>;srN7`=kDNJzCW_Ts~uMlke>tJ0_oWr@0P;~CY1LGqT zP1Lrrm2wPAif=~eDe)Tx^fdKh*E$DJHxLu^tc_8TNDy0e3Nve7*)m<1 zyK2B$9op;m4%dpDOGtgIGl=61&ufLxmLX5_Hb{BR*lwOpTuD;%$*`7&KLJqDb{}u8 z9SWudR`68%+0y$NrqfsXB~Vul7i2dQRL1Kl+JPm*xBMy6-ItPGyWxTdt0SS$PQ*X` zm4La5GxtCeVyJMg)YcaDCg2a;WHZ>Z9pVMhq<=Bn9&RC~U$G69qGXRFO0?6MQba=gK$YMJR;32J?dwvZ@; z0lmO!Rm!stjlt|BJHzBxPgi3kA~ zUL?r@haJB@F@~a#a?9(ZNGAxubOqUc=$k}fFHDGe zwBv*r+~<)=?bm@m2}UPu7ik^vmV-|NeX&$qe#Mmh4@)}m5a#!PSj<=%MoLuSl}Pc! zt|w~XSQD-Dt!fiGTM)BTUH0z@H`EGw1v^{-Or)G-ckP~_&6}j`?D+pxdShq>wFut0x$!YPKa=4`w zQSeK~D;D_U9gBjO`h_S)4Cj1e5sogqm_?|h-wNGF@F7&d zL6?SrfP`2m778BYaU1GGf}MrFeaxgZ#+(|O)jm+IlS*6iij{h6ON<1U2N8+_aV&fN zuXo3uF5b<%HovR8LEZ+ii4+^A-SnMnHLZb#&<^*DG*#bI&>Wn{5+ztT!iq8*NC`{y zY$XCvKu#jPo0^>;1}VM{PfY?{C=-%Jo^|Mu7__X^z7zus%R0u7IfL|37=nY-N^trU z2QMK3J3C;n4+Pf}qdMbDnfWE|=Sg_k%I8us+}N|0H-{RU z9DJJytmU3SGYuyt5;j9+m2jlX_a?!T{iF=3p{`hot-CDkaP(ICZ1m0Jhc}Om!V}a? zO)CmGu}_CUvZGNio>vVsq_G?I8`(D4P*|SMveJ*Fn1}VaCEh3@1<5Br$Q9$+{k7Ds zDdTuS0M?-#qh`3o1)JC}>G@QVjb9gpoLP{Qw_{-2ndp&AgVI+EBBRB&i{g206XqaB z=>MN;f&?hAN_@_CH;p#ROTA$JOOvTWd>!S!qTKg!;!%_CMtbu6U~E$R z46-{WGTd{>Uv8aYPXaYK7&Sml4~ls%dTAO<-%^c)<1Y@1Q z9sgj7m;Pi+W4yyQ)J%|oYGIDst;uO$VQ3~=N8M}zOYc#dISI52 z@by2E`Uajogr6g6uWm_QF4Jg;`K8&@^$<+Zs7+@??Q1m6JsV0I#4?%rI>ZTy7Ibe26vMZbf znSm=Mm7Y?akOf>;%5=tWuAz}(BRDQ_dJ>zQcN9v1d36a8gET7~1+ zE}ddI6HGv^rBKy6w47O{hp7HNtSPpdO|dx14iM|y$Qf*ki%oIs-z?~&iT zSe%!YOWD|E)F+mt6hzU*U=4*IW=N`{nyhd5#R}}Wmr=91l;uk}C|WAO&^h9Cv^#m5 z50^_w*^6KjUNqvwws)g@>k%|*5_g?s)eqQhU9r0C+DIpo*;E6yRqX765k+?o#Z<-t zD$d+gR9ir~ad}7=?gC)sjp6;cSjplfMxN#fW;%UaZWA=rflJsfUNq0Vi~U9oxqQ4( zstNKS6|Mq8NK!MB6X`Eg*yiGt{`5M&@BcS|{I5FdlnO_>wad{+sU+Z@=Ww=fcO;XwL_u|2s{I- zeJsJ|nt?%g2aGDGCB*BY;@Fr;`dl)BNBY_DgD9ZeE}(NrQ%b9H#~G-yNg@&ATa~Z_ za=U_p7Gnl_rW6K~Ufbdk_z^gpSs*ok+`|)B3vn)kqbO5b#az{v}6$xpi zq|byb+UnWvuEp84c|2IbjA%)Wm+cuI5#B_@To?$|-~y2#OlT&zRee-4-;_rh(^=E? z(hlJekMv4G(Il*k=V?9$j>Q+Y6=j^o7m?DciVH*GMkKk+k~c7JX9U1p?J#rX|Mh>BopT8ZkhP<<3e194T$$1)ZxZ`S^wLvR5` z5{n^l*}$lj7yYYnLnQJCpq|Y=bU5KlkT`Zcxyd2#AeOjtE-X2v6ZwCawJZQrx4=5% z#rG23L>ylZ^yEJ3k5gS98q6$V>T)_O0@)e|`)CDdqA;b6vP~TAUDV?EpJva+KZ=z& zw&-IiotQr}xQ)il?BD#;#nkYC{?M1}#rE!DB+Zx;aH+H))*yXqt+hX+rxgTD{55BDkvl7 zxRN7(!gRBcjEAo*@dLJW_kd61|Sfh5#oR<&Cz$T#H{pd($y2f{t^qyYX+?v*%KA>c?0 zYo*4g`88z2j9>WnbekA(G9I9DyKj&3GoBRHZtV^c1``B)o68*zCrikcJV|>WaCS8= zZ^B+pib}#p!jo&@$+(RTTKiXY&^&B68F)SAK%2fTIqeg-sQZDLLC%1)$**wXa!JRm z6|G5(v!4%iknaJhM3P{q zQpobf;drtbj@{6UB!me~Ub(R{0!b)^0<~N_AIV5^y{_E}^38AnH7~(RCGDJ(WA}5= zrQ$UR^qnjCwt{f6#I;>N0pD1fpJCx9w)Yk5C~=NKlosQtd*1Oi$8>3wmk}fB+wDcM zSrH?pFuUN-R6^Bdh1%_QaWPcSrDdFDYvZSJW-qU3Ao61pEK(ZZ4SD{+kY5&Pp4T2< zW#DXVaf@%Sg|2Up;XMX+b-zNPzP<)t^blgU;i5SH+qK)u`PJmZiK%f2Vo;k!E|W*+ zqF=Mw(Ox(2qXw1NP@5t6U;K7z==4$$C~D~>1fRjrX*4CssB|D0J@r)_y~O>rqvAGJ zGx;#BwqRj-YmroER;|QNx9S71W8l)~63C376Gh$7yy zK+4(N&tHoceoH~a?n9%ZCcfOBbaxHdajn|+ZDw;v7_$1odHHq{{C zvB~2pI2g}!)^P_?b@$Ye)kUdrGC|~f#O#iCnQcz-gD7tp*c4LeH0IA@u4YDns-35~ zKg(S=3R^VANsybWB{`}uk(BKA&?ux^@nWzx&Y|H*K989Q!++v4SDdCi`MZ%ci)PIFY+c4{OojySHF>!ki!iVAOa>9n;zbL!C%r!PC` z9YJhrCHAW$XP&$hBgTD2)P!7u??w?AG=AwbNk3+Rv2?rmzoA{ywAJaR+SnO(t3~2B za(d(emsYXK++eL0EkqnDoEl?IuMrJaQPUhG@t~&u*fIQbUYo>xjd?AfbbkZRb%|lc z&~~q&^7+diY|PRaIRv*594@R(r02azlAyN{r9w37pcD2-kh!F4Govc6wo?vo_2yDA7_q% z*acK!Ngz;Mvv6A8CvmtZP@mxUItR#sD3`6aL*mq*Ar0f<*eoYDRDFUV-C_U2%vabB~B@*PL-+I;JQ{w2INh^|1G@)drg!0M7Cto@S;7? zVgqiCV~RD|m9fU1e?<;I*d74*J|W=|@$n=<;cSXYGvHc!)}nCExQB)_plCZ^%B!Ip zUJsE3M-zX@2kSEfmsa7c!BCOHs9g}`t(m++(XoS786{)C9{JgUB9s0HuVX;5v2&n_ ziw8drK=&YD$&En@L*k=Dl%ywr2?4kE`wrH%9|uovkf4H`0lG=5x_Tu-w$$F>3W{cN zA+A+YMYg~^?N$D+6$-=i=b79QHZ8%#V_jFlCszDzIZo&rZVkuxH0ttm<8MwXqKZm%tY*+9EOo{xXD(l1Pte3 z<8mY;FQ>FfC+c@sq@Nx9?UA|yj!{Vq;qB~_bSCa&$MR4u6CHkWS@GrzLP+6qtsrDV zl*v*!F_Gslmx#{9T&ey%3}uS|qk=d~m-~H0keX@?FiS2)pSg>8e789IAowwYE}d}Y z5edV6AO(X7Ma}DD^95&0^rAUXf}1x+d<{J^VXG&mvQ=(+N^C2jJzToJ9T|uLN`{O0 zbBf@ldl*xq!*)5LFp+ZPJV_JLnlRVsw4CfCUhI^@X-|sX;0j!1zG9N+4oIHm6z;Z2 zu^m+9oJ7NNm|BYCQwMmg&0*e$w~@xf9Dm`qB(LjSXZjBkR_bP3--BvWS3x7aa9u?e zg2g$WmScRk&n>axInOI=Lnm-89AKsRS5mXJIX|BB8%>eK6Rtg0m@HgZVdMK*$cIbY zieI)^il)X$rS>L>?d^3JmLAEYO^udEN8>~2^=;K``d5%8MWVt)2LfMH?5l60;4fZ$ z#9m4y+g)%Cba$VhvxavDlFxN>1Zkse>rXeIwh2xie z$>~1hs_^MPNmfa*Qn>_Ua(d-;ZMl@jwVNaN*Ez(b+}*pZwhd}XiBcJq&TVkk76gZa zo9$^Xsn7}6cRlF(+OVOZ;B4Td@N4UO0S9sDXu{j^hJr@rq2|SD|8(WpD+6+1L~}Tt z^8G&*RX8&K_mH2a_@AA{cKlF9C)4+QJG>%`XA3t}8h06em*W4%8QV(F=lX zk~UR#8PEb*h~#8An0Gx~tG_V7`dA`;hsNQv0u3GlC%StFhWjAbD31Ao6Q^XFJjE{q zv(Z@gjkU`ScDSF*DE-VWbU;o~L?A4TwyMGm3pn@uOHuI673H+JK=a&9r9 zhg4eWhT2iAY-I~3rEkauJ zCm}?4OH|=Q3S`4L7?5n?WMAaHWkmr|vJU~eIg4k2_6sTcST3~y7BR_>+aPg6;9tSt z8z`)p*;un!Ve$wbE2)Rlo;O}EWQ*N9?jI+#V39l*`mzSmq-=M z%iZ4Ls|MbgDgixX5t>9;Va>3=Fz{w7InFBTC^A@Z`v7Wtp}>X#=Rmh5CGxVAO=vlE zpgjm^HR4}IU!soUCF&nK`PP-A*y~&<$yp7$K3yzlG5JVIawqJDYhL0Se;+q&AVK`E z`r>g{y;lo=rc0^~iQqmU=?e)1CnEqHlQOQQ(t}fu%_h=wEjm;kK?)Cy-NKaplr|*8 z8Mg@#r35zK&MCTLsnZTnLm@A(8M`^8FhiPF;_*cslXL`*fbu$dMfTW$wx#r2@xm zj5xoGT9l|DoXGI8lP{RyLG;@Q9NN^tVJQW6WGUI>__^pBIqmv6I-pVcO`ZA&4(i$D zGSMtzev4Yt=zxa)X*t=$i_Cv2D}JA|fbW8^XH#zx`+ec6wnOeWPD@$w@TJ&r5L=G@ zk(zl>vG1PHR~fcq!_nZO(454d+A9AmHXJ?zC`~uEhO3R=_GVVb3V58rKD4iZnbr4L z@KTDzhSx!guufnt$6gX9Ba44Y4F4(wWVi2)4E^(ROza2-N_yk_mi1T758`{bl6$^0Sy+(uu>Bdpv;cKWT=jkodmJ}Tl@}F@ZetJM^U+2 zdgzExZM%=~;}*B`8^VNSBo&fMrFj%D$F{xMT@pP$t*y2o=xI0N(eTN zFPoXt-P?$c5#91HW@jVtvvPBw!FZl32imKX(I1i=%|Xtj>QCyVC3sQIsTd;~yh|bp zY6hm5A_^#E;s%3r2tk=lNrg@-hV{@!PXIyff@$$)q<{1rh>)iW71~(;CT8-3F{B~~ zJm)(fk-c2fQ3CYG{eT!z?kaD%)^7{on~#>WsNn{01dbxOk8hf+ZjTi6%gZSzBm9w4 zMKK%uvJ!Vy0Jfs0p{OOVr7I9dW(>s~Ql*0OBPQ0wJ~zTSln=_ASi2qA0|ye9D-wq! z9u#HpIs1Xr-gLn29)6RpQwlRQhVmfH5?}#>~p(3F{Tf;SN{FhA?2BCp?Ftil5KUKg(|Y znIMmVLF0NUK7LIKj=CV(qwKI3UJBzx@e6){MAT3lSEGEQsu_{G`=&+|wFSEUl{?66 z&OtRAgq}a=;thQMCP({15=5jHx!wQE@WGjCz@BuY`vvQehE$m468?qA z7vG)Ql%r=5;sO(=Na3{#CW}#WJnNK~Yi0H3n4Lt5{|d8Brx6B+mi2bz&{$k?Eu7mS z2>D>x&o`D8v;=kiowr@GCr>~dSxJws*=QYjq?qUvKb2^{MZb|FUU{zlNFCZv5?JqCb6O6V2=hvn4U5y>;NwT@C|PcBeuj&n;38jB@~8Ai6=qT9h&vZKxl_rUYpXZN>)aa7A(__ZQ+?QsRqSD9MmT<7Piii9sOp%8s zNIs}Zv7DmxXSu$%rJDz49}WX#wG|Di<)pG4(i=0465vmLdrWjY3ZLo`#qeFT!@m!s zmuq%5)EC34iWg(DwR7qJFvQ8uQ!LCyNvca@r?lMJbTWfKrpX`hTYzF*%Xd6faJAGJ zNAcit*+PP0U1;uHe7CNprW)OHelU)abmY)$RP7cE?J%T-P620(a!EhIT3_*V0WtYf zp99+UOvGRE(50Mhm!nBdEcOU$Suf@E5@(ha=oAKTt=)pJsU$uf7*mEM1i6z zjG!L>`hwWWaK984j3}(V)VNYP1W?)0RNWOTq)>Q9Pjd+}yLv&WeOb^`QHN7!7F%_LBqd^$0;j0i97 z#3c2mChy>HE@&?1W8J>QRC5=h=q7P4_Yf*l9P>n6e>3H%k({Fh0n1A+r8lcIcDq2x zScl58;4jE-%IP{R9KRJ=2Q||w;)UwCKKVl$tLWUJ_=autBM~E0+=z^VCq05_m`dM2VKmk&4{_@X^--#c~qa{JLVV#U_Q> z0yehwT|p>AIq7wC_U7_5s%>u$} z^&<)+bW~|#2bHf8EtcwC3zA)e9u!1e-HF<*H5DgR6p>UhoaZagA|Ci(VUh!pd z;koPYPdiu_kO&`*D3Z6(07Kq*KN3W~i9359H|uzZ9Ji)3iAlMN7p~Rp8=H`2d5iN} zfvg-#b$mgo0*sVL4k0%qi0b$X80o%rhsmw)|8er1|?kCY887;eb0Fr)O&INV#K^?CZ%b+-A zhfwVW{OlAke-q*2+yaI=B{(I6EBl1%!;p*vgzAILuJ^B>7KiI3)}cHN;(uXRjpEr* zDm3odTw`o#+86R|}BU^FWP2|M!Xdf9r3Ns3H*uUk%Bg zP^;2`%;vLx>N z7C3=bwmK*)OqUaRh9WcP`9bBqxY1D`;`AZ66pVoPLsh!?S9_9yX^+;SNCU zZgBt(dM_l}ixl!!i~u(4kemr?!~Dh*otbmSMTj_F2QtfIgI$7B5xliW@gcP+X*m@) zTXtP)_4;{20hxIs#I^=(p)^fVSHg^=K&hpy%a4Y1WK_iL#`B5_AG=e$SW#o2o)nqb z%|S*!d7sr$IoxG+ge!;DFIMFGCHUiJ6h9Nb1lz=It_)}jiS6hl4AGsKVurbvisSe@ z*Dgy0&q)$Dmzbh36DK-zXEA-{lGK=dEy?isxFX%OxT4TK;U8-@WGVy?pFuCSkDM9q z6g0hn)#Nfzje%o!*+h{tx>T^CufO7NV>9@8Bn~^F(b{Yr?p(M zTq`m7e}Jx~;{ko>JjGH<{U$fhBlB`R(UzbVH7Vz`N}y1-D3Y6rEm!ifG=d9!?vDJ0 z_&j%V%Q6CJy)IsJCWi8PlPA#1Efy4p8XMkZf+0D4peE~{@FfzEF2rq=^RWqC1CJ?Q zB6im?WKZNN$lz-2uey zLzbzb4jUTo5xgTd7idwo(!N5f@ z@NG=C9(N=8v?f*cg3=o}9Sjn!dO4U+J}Wjs|{a}^Q!X}8xE#6twBBCTfVGKSvSbFJ!GY+6){ zy-z~J$zMQ9DU*oJYbJrTnWrj4yngR0r3BSDFY#{{m?#3!iK6#1&c6H6J%Js;JklYB z()x`^i7`*HHvo}WFOJ;i><{uv;1oG0-T_pt<^Qexucv353Y(Wq5rw(G@Gn*uc+e&e zCeA|gcbuxrbC5|m3v8Am=@r_OdzrY*Ml=AWdUCWcJ5lenT+TG95II4C5e!_pC+2LQ z&A}QX*gA*jS~#K-){~Yx09sN4 z7g!}HL#Ck5+t}Sl*iGq#*n$<4D&8@Kx}`I|twq{uN`2=e!do@Pxl#u#s)k&Ok-C8v zseJ2*lhg51%ozYg#EaNqqNJa8E ze9BJZndO&Is16pj*ZrT$otUW==<(Kz!5^z4Hjw4@KjW9E`L&mH5iC?-Uc#;3RDAXW z3zwKL{TMh%taecsk@9Z`?EXJ`Nm%_O7<{etGMkOnsfIks25F5}%5W)SXf7^& zXZ(x>aw1a79sK-Rd~KJd9gDQ`aFNKA0zlg~fsj`3`I~FuO-#E@S~f^ggB%2l2l@K7 z2wNXC=jx~icp%USGs)YhqWEwa=Bnf96331^JNn^9JCQk~+>*o?=NNA{S1*OEBET*w z$1h~IU4kN~Fr_T0B;k*F%)Gq|1$KuhQ64Q3zy|iI6H}QxTYEr`w@6^uiu@Zv)(*IB zO|FT`XSi=Z$SNo>JDp+51xW)b#3d+BrtVqH0h8Asbmyl^&Gi@3R*nA&zN%%F@+QYl zIbtBDZap|sy&A5fABi~DxrK~fgR{L*iXy^&z!qR5;#j7TH=4~5@&=g&%~?_;(kA8T zhfKPKp|66@eqP*-f7b}9utNS!$!SSw5)HZllFaGoK^oxU;`!H#A%20{ z3@3)9j|KB@LW1OgPLzO|+jt(9rThnfuDgW`^;lUW`?>}4J!G$SY0vYJr7QukT13!S zUJEHt+Mw0dRP5xaa+9F70&(#<^Ahg0vt1(gpk&XVeuV3oDW_D`nAyE*ghEwQIUzrh zQ_0J7L)Xe7n$TAg6{mZMan(RyLFrAqoNMIlNfe1q8n_j)oVhC$+Ot2lm^dzMOICq{ z>aH;t(SOJ2!Q`ItX3NI8sO3|w~T8qn3V zVe#x<6-5yV(u*k#n^p~H=&_a3$eV(Va4g$FqP9sijdY!IKqGP>0&-I%|9gBUnAr&< zn1H;~aHFIvX7y>laUjUajR=Os>Ia1LG-wJr4;26uNPCGKsSb>kodP_Vq@Y1+S`0sc zrXPYACC?uxjv1+XsY%n@ITIv+kP^lPY{^IPMGo$dr|Md_wi&R}{9adKEs-B-))qqz zH9=nW6jxyjb%E9Csj>Og7<2&N+iCcw{}g#_$1|f8n2qW|G3&Py12U;o^Zez6&!up& zudbjuh8*so;Az~{gvy)-Y1qOHWbc8j~=uw@iiAhkc~B|= zTe#jiBK<&+#VL~4*u%h-z(&j2hKE>uAGTW5`!YCYk8sRC!adn@5b(bvvI;xrrq%R1 z?jy8f6TF*6@dI9u0$bY0V_uqRK-J*kn7G*ob%BQK?@hBxr}{sl*u+CBm-AF#ATNbu zExDU~g=hPS;lE%p=eCu;^<<0Z6!Wq043ATCF7`gP*HxofdKGZQW7L- zmoL~$$3OUmkgB5<20J~X_^A|l?})=Kbx2cnbj8(KB^@PMNEMN5HS=|OGb`r6*pseg zCcuJH6zC_rt(WkwjSuFib>~o`^mx+`)X~1Hccsd}%f*@sy6D^`AeeIirtV59-ZV*v zrcD2}q}Bf@V)Km!0YyvD!aI%Rv|MuM0Qx{Gfw$7OScQUgkaud5nswwtuzR>O+Gi4+ z1?koT>Ytz&vgMLqB@|lBsDb2;ywbE_4iAKhDL~t5hu>>0E*w{LD;|9*Z zEs@%?VUqVYia3TR!)a@6!{IvM78*SV$mxhV^-xP(xl)(}wen5%XZ1AjwJ3 z1_q_FxFV8b;d-=ZHzA=-lsiZX>so@=ZT!8qJv6e>XRg@YH_GBE^;M{**Az_5VmX%P^$@I%ZW-!ILg@?i79#5Wy$$S zWOt6#0vupYKIn8E-O$pSQul5VWObW$^xK1(y%81aL_RiC;-IT%K|v`uE+vlJhvZ5R zHA!4Z=0Veq>7xrp#ktRU0gf)z;?+UVkr18n44eM?erQ%O%ICC)?B_#sibGk!?AKyK zHKAbMvt6N&T(*AQiqQL^V90H+2t`#ymV{KzYuA-@21i0~TT*5PLstvl8}T|r&d>`^ z^P5?BRK0DBy6$HOZ+Yj%zuooNy|>>o;pZRT{Kq@~>&^*3|Kr3*OFzgt^5~HXqaJ+n z>utCE`i~JmyLGn0ttlGGy{XD%vwj_8pIO=89lH3t>3u6#)}}6B>21CglM}E6?l(AY z8E_4LbC1EXcO%uW8>u8aoRQEvtZ7a=oMD^TTNiz7c(g%%?w;9G4UP}`W0kfq?lGv{ zSA3ZfZ5rc+Lw%h3^!PHL7~e+|@_eQ3{qwF)Pnj>%zh7gVm>Aa<>RkSF7w5b_rdI(2 zCNSVlMZwn$#pb`e@>Ir(9}2#xn*C+pn$iY-9X+tRqH?t&?e#}5`aT==f@OU4_#)E} zZ%qzgP;dHe_G>5q%cFVU+T;6dU7?~P?(`=k{s>Q->yeUH{@77mQ4zPf(dzVlHePSx z!x`PKNBn#31?!{cdHJEyuR2`oGRdA|mjk{z*LPu=xYGbA9@J$Cw`XlS|Rs@#x zu639A=5f(dF7h83-uH30$6c~$d(Wq;!$ao>BI^qI?pJ&_yLEWq#giKTi5`f|nPaoY z_I~uNZlmEoLvU)w@xA;bR9FuTHaa#|! z#kLLa(`@HSXMQsfIqeZ2bM6TCN9N>mQ6t}1g{Q=HKh99x$;)z{X_jlwbOe8h%qewO z4w-m{pJ$j(F?{$L7k|Yww7!QRQPpl}^>Q=++*zYKyqh_9PG!zE#9 zDuPqTL$5zS9W>iwdz-I>vfU*G+Z-1n>#~?g6*puvhmq+WvFUqKLr(^lq{gM`HjaOR z#Vup}BJRC70aAID+1WQ-GzX`q-NE;(*Ff_$26&MHbXi zC7#J=Mt8Bs(OfiHsP#JreB5;*vZwG16+KNC)>Ygbc`~;5XfMw{kjf5iD2h>^&A>u}W^~&1^58TEQpt=f?_)KS*rnaYtWU#4a@g|sEbD?(m9adi z-?uCOf=${Veb?xMcP@myNXm@am?BDg7gj^Bj1UIt#AbhTvB7MSzq1$?rJPi9SKmKLN#Gldy$XWLxW=Yq;cVb__EY(_kU zv_}S(+*al;87zP-e`k^g*n<;nS4$qK92zro1? zaThkHbH#M7IAZ0=H}Qx@7V>=rQZdImKCmP`j*b4syt3y5OKRL+=g=pj1U&ujpk zbpj+h^GQXiuFE%9x3OVO+5>xs_w5uCG}c)vVJPIFcR!?wf&jr2BZ!_n_6A6tJ73k- zRAuPt;+xcqZbUEzKF)cH4cl$%k956xMPa_@k&C{y2VbycYkuz;Y5n}Gz8R%Y$0Zc= z|JJ+guBc083iDUlD=gW&LzhS1c2DCM`&E9S3pS=DYWDsL`>Q6`$lLyTe51QM(t7fI zQE|`Y{^fnHa~1adhqcimej=6T6|>=<^{5Kpj>6OK7W9Fug-OR%RjO-c?NeYi-)zYA z^LF;2YAwQb2oj!2W-TR4?t1S+ zZFG|kdStm*YRZRa7Nb|wSBXfK@~rca!E_XY@07E8Nam$%Sac>g zyvZl_tA&W#<1Nwlt=*+M$`YqqEy_3CC7YUfyy;SL9EvE0R@K@L|C-3I%(gD2C)=zF#NbL(ziA6^g$xNGv1AINhl80%%<< zN_2q}4tYW}NfuJq}`O( z?;Ls;g7loQ51#1Hc8Qw(h*58TlKD({wl|>y{RFx$B28b(iMXwq4R8xhL!vZR%#GbH}0B9je0z;iU)WwZztb)?F6+ zN>QlVo?t$OCo}a(1B(4f;h#o2dGveiXwK`5{fCZG=Umkh`$xkuH!oG(qLf`2W(H#+ z`Z!O)+BUf20TY}$ratDzv{Qp{Y2ij}p0Jt-+5_B>UXLnlypucc9r)ScGYlDh$U8Ff z8owl*2A$N@#he`(kM62;|0Vw$9{+44*NSXJ^61z_k?&-D8FQoMW!{bR_rgDEHgnY& z2D->Lc^edP?A_?r;r`IjCZ03cyec>~d0VKZq7;U-&A@QEc7&qK_-a#1AU3oGMK@W@ z$0D~*vtiiYS8o25ZdM@H63hN*&{ub5D)xHY3;&c@=Kjmjtbw16vZ3Kigea-($0%kr z33eX2tvKuX5X)-tvB(w%jo23I@qY{dhq(6R&w^#+#bmuXtO^POyd5MrZ2`ZWV%9kb z#y0kJ)4V`zc1^G>2{Y)+5CMwZ7Sf7v8J`I?nHaEI22{Gu&XQrfdlFPB>DQUFtAp0q z+hRInZ{vdo)-8%<-XX56;+HyZpM^O1whkBnJ*hbMYRRDQSZr(G6S|FW^3`1V>S-qO zt!TfK>LlI9btk-owSw)o1iSA}MP6e?(f2UcJ)8Nule>CZ%OYS{>+oNLQ$0jiGM~R~1iZb*`L&>jrZVgt~%L^hYOn9+cKJ}?>DF~;f&?-ys5o)iW^;>m++{f z@TkZ}C~eL)u1?duk7?R>m>8r_V=Q5$Q8M&hM|dk7cc0{WH@)lXEM4QvtYYYsQ5KRT z_9tTV0kAx6z@9?HyEZ()&b zWt@CuwvRE}@yy~XKIrLRN7cbjL-p z)&=h9B_qKCiny&W|8|4pYHv?n`){G^D~Sfjc8D@th~Hudj;jpnMn+C`xjM%|^)&}H z#u>kZe4j$T@3?XwkAH<}$1_#kWCN%9A;QHLrP3AyCC0aEjOO@QgCk(7)fgkWHj8U> z8E7fre04g;;P^X(SovZB>tDFGuP$YrtFwmr*Tz@y5;_K};fpF}x=LnxjH_KtPL+_V zF*fi^qr-mRsJ0T0bsZ*}#O=?p5syMsSVg^NP4+2`#yFq7Uu^beZeZ{CvG=Zma~!U_ z+!>tU>da!^vzd#6DQI{~9h9;qROJ1|mpOJug~ii;Zlcx*_Z={)G{!B$IL&NUG;1pw z*H_mfM0;n$@9rU59ag-}J@WI`XYtG5R zb2Qvh8rt1|y%w-o4r5quVs5{KEn|=k8(aMnPwyw1G5;`iK`?S2llK*0?(B^_0y)@y z8+0mQ%xR3d_9;!t&wA_1pJhST{v1OIv-vtTF8Gjpc&``M+g#YycTaEKS{`sBL&GUC z)_edCebbz${Gl#jD0XU$r85kUou!f2CTu&|*X>+|iK~Na&ckfl*@~Fjr$4rMULd;i zY)f=fD!+dUd^2&uGwzj%tH5e55!%BU`uN^D?LEq(=lvSv zM?IfvjO&E*h3>0+2Ybnw_+j<0*`p8Hf#o|YBOq8Zqm;fvQnuZm~3#I zK`|7Ua^R0O#P!ytpqR4Q%mhSa4uh{}ACII)8rlO9hW6nJ{C}IlVHygq3VdJJ^=nt> z8N-!pKdLL8NA5rit{a|dszhD=*}ZZ^ROp1l7L75Move;UEii-8h=lP;2w--gJVetP zxy%Cjvp1j?Qdq`oFwO1gr(I+k;<(ag$4Gk=7G~95AW!<(Q zt!*sK|K_$Cp_KaoZrSfuDV>A`&8-JgCtJ zYs<(LuoGVlqEFUX?q!P|gyXtIAH2@z)v(0e1ARCDgAg6mpUVu**{G@CGrMUs%?Bo- z+7lk&No=DBL$P!QQ)lhH#qV+|8L??#fNV(m!#!+gjG?{oW`pA*^f$9Zj%1d#4>8F? z_(s8PHA1D&Vdhq@xRuFHfZXfvMC`ZnVHva5^=%lMjj(AC`40Hd$kpg=)A-s4zC_PF zW{WYXH?jI8hFi%qvl*d>=la{}x~3S~eIHtk&oJl|)RK`MCFxhE9*Y)wrC4eEZ%AQ-o5qSfonzuR zu@cYfya^l2EL&qxGf%Q9oB8}apRW%a?jKF=1!2{LklR-jZ@9tLxpUH$&iI!Z@&Sfi zw_g)ab8IS|*qWAiLCM%z7WJ73NN?1)6mV&jdOxw$&qSdS8}%&cDY?>V>PB(B4&4%C zzagu-Uw4St^RRH?1N|8Qq1Z05qsgp`V**2&{c5F6DI1jkPiHx^iW7qWh7YbVqtwG0Q7X)rJ$R+F zdtRu`a3|>I-C+ao(kW|md)-4hTzHNPmq3}@V|+!BPW=J8#K&jIQc+!?r_QIm+^I1Q zWh&D&MjM7T3f<>;!L1!R&nA@33|;OV_q4sOM;6(_?7G>sHe@vUb68*;Bwq7u+&kt4 zFw034l=cma@oo2iwu%0n4FGO~0dl4TUg}w3LL0`ZKSF6+-7fZT876$wd{y(uWDA}LQTw)b(5cQ9l&c80uT?%96 z>bw}J=?I16X;>@oe5gs8ymBP8nJycCuXC8Aoa~PQ+O{y03TDy)g{t{^9tz#UF4-XO z7!;>XC=&q*T`Wd*H@oDXJQ1dzk01;F3i6d1%FYI)Ew~uKh%Mytb6Cn2cuk8`Xch38 zj+Yj!6=;xK&$~i7?aIJE5+=4VVZ;*9y^h7PV`IZohe3@0u2(F<{^QYtaVB<>NICyV9?HOABrhxlqYjb96x3Jl;Zys z9Ud-hhT_I(7JnONMSmarsf_s+3=RxX-p;&d4D^j^Te{6o{VF3|&>LuK2A4Fl3kZkt zacC=M@mASqtVNCeM_hr|)a%+$`NCOR^bG(RQ`i}A`o#R2Ra`CxMd?uIT~G5+NpWY3nvppD(^J!>=?ib(k z6|haFNl-g-ebHgY&KV@Bvv!ZU4jETJ; zZ)WLce9)H>3vn*QC7B>7;6L3fn~7_7!y561Ja9z+vOYf>VTZ*AAf6NHx&hL>J=i(Q z#`3BvN+YyJE25!KQYc<+CNU`-TXjFS|80x0uCVYHIAfL~I`lRB^(hnIhlFgMmy{4f zZ zDaMRvj_aDzF1cJ!qLdrhG9rf+4HBOye7O5jgZh=ebwiCT`4C^7hg?=>g)&ulqS599 zP}C!5p`c#JuIk&L(<#65sK{f)Emq1t*9LAxsuxA_tt~BD1M%7|` za~GDi9WkKXc#N`ESyn6S0PFq>75~xQ7+7d%YrFBm7vqqOf2#Z%rQ4h2WTR&YQ7H}TQ;of zK2>OPO0?(0{!sojLc)*1+jpZt^l)JG$CVKWOq7yGXuV}iO1#teK`0RKZl1Cz|b~=t=sXzcP3q? z2PcsX^Vg|2S{5L70rcmTe>w+Klh~)I`-1j>HViiwR*&B=fjzNt)}7<`=RFrU)!=?3 zKMj=pdr{oZ!A|3s3{rU2?CC7N|6<(@{>*(!+n1L3Zhrpl&+xCIDWKi9_lTj660431 zYrhM)>d9sGRULf_bCyY1@v|5^+d`Be zcr!n;{cB5xwZ`LEYsYLJlZyd4v>s!mKFac%>KJAs`B1$x&Y*7L_H>rnz%oa5*m~@2 zVx>d~vv@{1&lo|_BqHMzhq{sdFvz$0FsC?wognz@;GYjL#ZmaIV#lrL_I$0sQH?j{M7=9WSF0wy-BzNXl) zQ(GR%3|jEQxtwK4vYbMmhRs|m zVJ!(~6hN9b(LvCw{oMP?WMtli)m;eJ3NS1~0VhbJ;1FXm(ZJ@-w z@B`)~r4zQj4z@kQZa4-8pB_a-KWv&!i-4zZq503)FNf`UO{K;-4Pzgl!(dhj)ti`zP@w!Fw!OW$eF#U##T&ZuEgM9M@QsAo_jF5TKqA`dt5Cj__#<2l=0Vd zs~!y!sNvi1F-(Pj=kzDHj^kDx>=TCpFKTn;3_k2Ygg%EN5=xmbr~_(F=VMJXCD1Feyi@Sh$1r@V#W2E`Y){NA)@r4LJ^##0-6lMK98j&#Z7p})!DHO9sD4B`7WR__ZiLk|3KVe z*V)@DwL0veF#{-oDxULMMQM^m!Dex7WPe7V4HEi!B;qPAM$4HXiHS5A_35~#ZX*!I zaq`e$ZvXkAlK%7gAEK>Wz7IC`Eo+#s8lQ)4v26!r^_7s0+MkhQ26#?3>7GZyCqQLy z<&QsQ{9lId05i8$WUQGaeyty==$UE1(iy|9E)-0BC#diVlm=!_Ok@0VhDnnUKsy@} zBsg$HjOfGUy>iU^!8Ry`YRMx!#YVai!s-)NQ!J2tAMEeNCoHculwT~;MW6e z68=Z)C_IYBZ~;lHPFe@OC#>D}Yr*8)M+VD&(Ve8UnRr|UPHm3)n~Ver-)%QloLvW( z-f_}aVMVEni)~Avz_ug{0&4M}KR1J|oU${ftYK3jl3;>Mj3`L`ZA7j*QRB-*NU#9@ z&k7T}Kefy-sGUr*&0RQ@*~VbUnaSAxfuTSB=vWar3p}Zf&V~v?oh?=X=gz96DR@q$-coqRvQL8cVc6AMqch*z?zq%l1J%v zpIf#n%T$ut{M&G1#X@aN_LB(2PpWqbl*^I`$4XoY@BFg12o!U!Sc;>*1FnMr+J`8Z zc)GcFZ}4(wDcE)S_O_lrF_mT3=yz&oTrRFvT`ta^dLw3XOH5guI7OK(>;X_}8LOJT zZPL<#+4%N*x^ar;m9@o55>f&|EtFX_yzJM+_sv7q_pfj^P`mL*jIo4(UgY*iSZNa| zov>BA8};`rjsxNlXda~EqAg>d1t~_EdUu%1C7|Ahbd(|)*jD2#lta|5z1QN%&VIQP)~%@xp*3ZIj#RbtAFI6UIMZB9 zkY^pNZ`-UR75Wyx>BvX4yM6_JojsBrQ0h^98^!TkC^|_Z^S{xhl_fE^O7v0FOY1S< z3H3bI4E_9oT5nyBYHndHORs1tpXlKb_XEB)5^eq>>=v#Qhd#IyY z=+eO=e?zsz?2b_yWwP^JU5mmcdGi+)x1?fV0!Hr|i}7#nznm&0((-36?Bs^K_&-Zr zuPSOS#t;1LNQoF#VCkiXm>Wa5*$Ugh_p~~|@cqH9yI3%a)T^Xzj))ycxBC*VIO1)+Lwb1_qZiPWG@ppuR6nGCEaJk0; zuRVhXUIfZGE-_d=HY0`2J3<{r+{-PuRM-n2%p{_m`?@XaLfxXccWRBPH=0ibzzmCl z#Ptr#qojYnxlySfUS;vLEt#wI)3Tr!?2 z%P&Hc4QgxjY+qSu&eU)J4*+@}E)_rFZvs@Ce=t^_@PCo@{(()F=l=i4akL)~O6PIH zTy49}qs-&5b4aVUNpwz_vRV`cwYD9iRHUIIkp4)Mh)$Wq(m9k)V-pmi{AvRfQlV{v zL+G@Yh@}l7v_UFF8q!c}lD27*@9Rq4&iS10A61$@d7k^e?(4_)^^Z`^^&@8z+i6A|bQ<95Je1nAKqNa5a`w;ZA0 zwZ8&W%&0!X4a}W|lE1^FC@AI=IA&0dIgi73?j!R!z=O0rXcm$XX8aRf+DM6!8j>0f z&EzWHdQ;+)*vSRQSQPc^n2S`DLy}7hyPhsE-3C}zpJq@`2Bw?+ub@{7W;uK5c)r-4 z5ig}?5fjx$#+82?>fONDrV|x)WV$+G#APfs%tPuBA@S;kqJ~&{3zbHxAx#0mEWfCtk` z#vh%8q%^g`;Whn-i&wV6;M#zKf^W$-LNFICLjGR6s*3*zDufUEJIf)22o$tY%9LRq z*VzTi=-}CF5v2ljS|FVCJvjj|R!Ht9S%dTjO=0=hGYf~NioAfzc<2SxL)e(>`nO!M z9*uKjFs~BHjKnP6W@h1Hp5*yP*aBT|u-Ti}Cx{1drnaG+&xoUA6t^Nb9l1nj5Jv-2 zbBp`Fg`r;LURf3T+iZZQ0;x~G&BP>|>t+pSi>+iauAg(eTZC zOM(VuYYKOIgNB^)M<(VSjgsIZf zqSgghwXUhWyKkOCv0FzsQg>IMpa)q8I(?I*4div39seW}6$aXvV4&Rvid6ea(AxEY zZIHOsZ~UL4>lLOq3EJEtvaP;<-HEQDRXjw{fsv$W>H<~!TG8|Sqc@nbs@cBr%x}Z4 z6CIPBID}z>qk2=}di&-=P4v+W&aZ~z(u@b?@QTXUf06XMHZBUaUnl9(2r3O-0!QQKchgG>T!~0EqRUrRl2>tze3O^ zBB=qhN#$1jV2~k?GGqXa#sGxY5}^HS(AzyHoQ(@vyXlY+n%1#Xyo0f+4zN8adZ^%0 zg~9#hbcr|3*lg3ZU5FehZaF?&GL#P3j?-XW6T1b!qV3;hmPn z;Vfc~kmVP-e!Uk-i+{Qh3M@!G%}|k>tZ-9X~9 z9nKlpi2nIgKygQy0i7D-gi6svH9Dk$FQ{jtp6~RRT(>PO(&}-7QnG85KWww~>#~(_ zo1`9JpR4)Kg%f-RQS2z+NH+LAG*BYZKp?bA9~YGJ zQ~fu`))-0DjT2LBUFo z#PgNzGn`7tnpjhIC5=?!WTSgXnYENB+n!VWR1Zo|bb4CylmBFpJkXA+&U~C-sIm!y z(|*A6H*mLze3zEVrZh@#hhJj{GJR@HVdag?i86%y*-#o=bQ`)(CXM3ud{H$-v$gr()*Mgv^(o#WjZQW{_DBP z*AU?+UZN_>@TYT~7K_%wL+_ybBR86^dcUtmwZJnhmF7A8>7M^hJRk2453OWfYF5+0 zGG}|Be(X&jChT*FwMcG;MD+PT3>$jWECb0R@JC{Njm;?ra znhG$g^8nkGSzv`0hP46vUcqo~-51CFnch*RtmEOmPZI1e@K^fF@^M5n_~zhq@sW}a zVo|Qh1Y{Rr0yha+TZs96#_iyGH4kvR>4c%XFrKKi%t~1J4OmDj{oCNYV2c0^CbB^M+!6FIh}JJ)Y+aSg4AWj2 zEMIjpivk**6Ae$~fI8_z6w~U0?l$g`WRp0MjB=zjG)HWpe)X3$?W)i7xY_VYnTrXA zEp3RQ5!uW^vuSN=naS#&i`H8THtRit@zaenU9yI<^eEaWpfPEL5aK z@Dn~nGhYg0c1TKT{HpGg9R4Gm=IfZrW1|zj%j=lSt8O6D+ zDIxIu>QhxXIQ)UM-)IB}i0E$;`}++xB)!3;Me6tPz0z1RMS3pQvPkQ}cTq%m9!fh~ znsh9f({z4nCJBh06H5@)cchI*N`~ObKWr<6gBEx2PJ((S(BGv53Tx>n%{Hrhxg(ub z`CycWR}~q(tZ&O={se;spbWVRq1L=KVoDw58K$#S>K)S<+i%g+=nh8wFsnB8`SDgM zE0W}C8-cS$QtVxW$Rt`y3UaMfK#GT9&I(bB&EHORFAJnDll7H;$=~yY2u@J5kl9~7 zB@Om%W2?3oW(NvUttqGng4RemRt$|$_gbquI64Cq4@S|q91fg~x-8SRYgdT#z} zhOh)$u4NZX^cu^u7Qsm;o(hIi^YBE^MuU5Z82K3E+Rh>_Aep1m+xZ2n<3Ov@S!&5E z+ps?=soT;C!a1s}OEfUoQHXhnk$L#>9?iar1i31@{WR3r0$u1FHUEN@spqfHy09N4Gf+vyitC z(8J6evM((lqm#<>+yQm_+&2I4aef~nny0Xio!cisvrUZk0%%r8)tyXOT$^+e^;%46 zC%Jvnz=iTlVb|7MP|$T5Kfbe%2@BKK3o(5RWY^W*HHkHOnQu=8a6b!;sCa_!4RI^7 z`pjy2Gz2fuO=bOas0*FU7vAL{E3+|iQN@`tC?Ba5R7qdC z@<^KZZllBkYX;nDKKhB~_+eU~6zw@zI9802aIIQ=s_!nljzDA#R6-d(XS@FvF zKX{=O3Uhn5sml6JZ8}=B6DasDf=Ur&li%HCD@9H0^Yhv_h@k_^{PL_?)FZ+Og|^aC zmRcgNsT+}IP?2*B`E(FNxta${ zOI7Flw)M>mi&{)OEIPWgjKQ0sWau>!e((h<0r`*W5}nMsP&1No8HMeeytBDqC<=i* zI(jG)ooh3NAgM+(dLE_y0avtzQ7;s~PQySt;8wGsrd^WOI=*=`Dz{%6;do;}CvN@d zH^FaRQ-wuA*N&WUn(9&fqWMMb>vmfDEqu0)o8>Z}&sc^g7V}9(YSFccCg#bq(_uc- zyA9jT;?j;2U6YV6yAJVdgDhL@^`pX=OZqm)^{{{KT z%HYT$X=A3|9g%vL&?y#C7XE(`!`y{$@i5@S{Qd~=x}B^k##;z&fOmSq&0Dw*UsQEaE+8hXC!9}p6S z^DXV>=TX-5ZBD<3mfpuP4QXWFg`mWgdK*nOv}2{pjUHyKu!8Q4v+W@oUO=MiovP&b4Y{|HW53mDLn zf#kMz7H3O0U#G{ZGqDWTT&~QbIm5$`6*Dd3>PPXXekebyl}P|>qT88eNQ$0X1Zu_k zg`UJW3N4n&%DNxYr3XN|RzUPuC&E>LhV#QmirE3)G{c1vT0xjbK_brv6-Cg`vP(#b zdE`k)`XLrkwuglISSD3xp)H$$ED0{Q>Q7ldu8>X|%J zI?3+Xsz1}zAS|_20M}4BTz-&C?>87YAQcA~VC#xBizL(3A)U;={ER88Oxa^%w+xmyQ=LKh`lr(b`MD4%x2>-2{-$ufF zYZ}d+>(!7KpGlwSQNCFt01EAy3F`HUdQ#BNlw^{21)U_wr|~J`GqeJRB0c^6I<9KN zM{1U9C*ZDZ=Ch9dDL!Yc#1U%!DQIb6uF|cRCv->yx72}z)2sWcB0DBIP6RJJL$(dn zBPubma#rnTe9kfeLq0CJjm2u*-I&g5I5c|STvU>weX~=g8rmELwZ-ec%I${dwY{6 zcBZLrxo+R+&1ggRp~|Z92$g>YfkH5U9)Uu|rLxg(23lZ6bRbI2%fXS6Pk87Yrq#gx zrNLsZV8=boJik8t3a{ftSvC>dllb~8Tp};4`3vi{HLQwBgVF8${>@0d0gY)(Q@V?U z6uMI;gvhFeOkE_f*#S<=PpCP6viqa>D&oB67x6^HMlKqw@5P6l&AzB{8kn`HN zt{d>QnMu{u{6>VN6wgC;mP@p=y`ji(<4#np^L$B8{%hhXf}b^Ngd}u}l+z{8v0R&&2| zv@|_fIYc2aK{{I)z##H%=64#O{iv|!U}f(}<8>e3M^N^^1(OH)e;jvWht~$LfT63{tD-wi5v4s*=UEQpoo!N&*BbOz&>>2TW`kL zBCWho;t_>E$TS{cji!N!m;vvdlHO-GjPiBoihd=%&rP9941Ifjl7Q%CXXjpl;Cu@E z`AXWPYmk}yafN?)vq__SG%pg%$O2|ex5nuf2C1(`*agH^F?Y{GRr}-}=0t<(Z%~Mf zQtaFU$kDv+bzUL8&t)e%hHhmc3V~b}hUH}3^(Q(S&0KBaa{7Ykfz?vtEs^_NP==D*IS4+ zEJqbz4DNR<<93hfQl)BmA73~+uc$pz$s4|8yG~RpC;^to%JTFW={or&{pwb;1XJg+ z=>xu#(W}k=YW}W)56UM?Q*Z7IwMsrK^^@9zaV${U@qQNWIN~4=)b7EL%rCPan%J7R zfFYPQ-C zXlWl_YDyM5eT)wQ!WwJk-O3_GDrbVqzO$LEtaQ-*Cb(+6iN7w5sJ! z%XMztj00i5k4QoiV(W>jVfIYaZBo|cag|uEPs`7WiLK0RI`jWs zh&f?W@>s~p;Vl$eN;d+iagMLhFwO)Jw^J5!|pc^!^QG6)AhR|9Yo^guJZu%1kK4iB%b)ZIsxO?J{k z-7QE|%MgDSL(uu)p1V*yrL@aP)b8hI^^9pItML|A8{JE+%?H&RTUf;HeA*};ZA?3Q zsET|2knLdnKA&$5o$w6(hMCEJRfSMu!jUYp)Y9(ks>-Cr*+k<8yMFD`L)bAEskkU@ z(8*NE?e-gFWzwZJW9*l-S;{`|0Jj>15W1FIcZyFve3nTVrS=1L*Vz@#rrEMLof7hB z+x`tn5+L@wq$<9bt^DejO-W~(I4S{D?AQMpKq5t$p2|aqMoB#GX^f= zc1U5{3+6-MB?C=?OxD=`Hw}@?O!0@ z=~*5i!#d`s;+EctErR(V(T4w^EJKG!p2VcvgK+`YQ^j8Mc?caHF?extUuLU;t%W3= zQvfgds$Vp$*mt6Ae;ZP5vEz4@x|@pcI0a{WUo_;Mk_oZR;Z zSWTuzQG?4|KOnQ{pRp^E*?`x@I-k&-I1V%m8c6 zJi?xARMN=C2m{U~hTSA#C4Rxs5*-ep&55zM6YVHAQ+$TWD-Oe81o*Wi^JMR&YF zS>A5#ON$?_%=Sol&trWu^BLpsdGPyCsX7=_HH3%I$&nUs;OtV?J;X>dpk@>0uWxap znGgjLYLL>AFAXKf1oOPgErd#^;N2ogC%U0v5Yh!6$C#u6M~KlPexSb8Yl+wXuf%~e zqx9@PTuC$VUVWV99%PIvWGO8{ErP4P=)b&T;^Dsd2-|NpT4X%qi;?(7-c~Riub(KQ zHFVQ>m6|pI4^%uh>kcuwYX}jAgor%p#e0ak7Nml{7k)OecQ6^_ap#m4SMi5JyuPsR z4MM`o{;>;8UYejM6PVkir;*B!cDFP>$=>pVUSCd){38q<5s@3DGB3burc^A1!Spa} zySyMkc4UYrmQX*P50e$DX?9Wlb3~yA5REMjx9OKR1gQC>EhX>2(R4BaCLcuJAhiGl z*}-a-X5o=+yviXFGNdH-7}A-=Osh=n-c4tJ2H%n~09vtlD)r1J*WO7}!tnuE4}L0+miXxg}$y-~%|xz>K7UuhXw z;awQ~$k#&mb2D@M4`~>DW9;t21-jHcd_z?qjo_KA;obE7N&{*EIp}RDM=hhD3$cuT zE6$DXFaLthN^s+xP*--Od6&BQ9!w^ajf=eJDCl)gJ$D{9T8o(lxpbh2b?CYT3Qk za-!o{#=x`Q8-p)aHFIv=vEgM(&!Aar3Z*cc^MX|#6l!gvYa`L)@XwutZ8E|#z!y#V zJ{8HlpoKQ>*#Kw!1}(~JfNe3#^Dxj)I6^ijBszg)KPtO$WtWc)ztSTGz0KP#>+Di! zD;*k^o_uRAYLw1u>v39YZ-DT4V=txH^*Rpa=g3HFZskG@1E-2L&c1K?{n{&H8 zM~YswKQ*pJYco;F|*nY1xTr4E~M{LD=0Cgnuh? zk~sJ>^BN`lN^Bw*hN6sBDF9JKKfqtkcq;bpB&hwC9Zc}effbJFJKGg1Ue0H4oY*ng zvU7romUl!AVoBnbk6`1GH)$Au0uatd?L-6KUKnh+*zG7r5}hJ-pzB0M_gFm}4ru&4u|n zh|6ff4e5)!}QFUtm{^?8KK>QpigR%2=KiWa2GO;M0%M+qDnbZVlq>b{}OCkgS7WZo?;*=NW%st#mM93a&ZjNx-adA zrQ+#$a0;y=_EP9@c%4oRbosovmLrecW(>S@_zFBP3~p*Fl*(hMfPrr;Bjx_=&1>E}k%rApH${d&*W7d{@=rY*YXS+T8x!OM`+uaO8G>z zwAF5DF%ixSWZv?Yja~*O^xS2P>u0 z_sH9CIN5Qe#0`l1pYP3>ej!e`bO}T_p^?&DOm-2mwd4f@yV;8 zrZgA+Fnv+mPnE~NZ*aZ`JJGHr1(#->@Fb=CG@{I4wH54?$_!58&b$>af_n9#T4Cg? zWePvLP0e3?@7tC-1R+0+ zn?A<(1-}`Hcj|Tgc?s~Nm7vzn&1I*EhKBt_jZ>72`0ka!_yI2WCcb@MHpt2T<35sC z%_1~cPut2y3M1Akz9vPWU4*01Dts*DqBIYE}MhUHBx=NLzo0mmp!Gx(M|c~d|w&o7qI!)@hD?Ofg>wjbe&&HarWuoI$2 zgS{j=^aaCSV9np+?!4_nOCYJk1RrARrHF1J-$5nRpD9Vy0MAM}A^UpkMDYv|X?+i?UaifirRJM(QEaW+#j(CF9K;q&(bh7_j;-HYv(ouaG z7yLuAZ#%a+UTKHYK}8d-E=K;e^;^$RP8tZITsnh^%pfhvlsx5Pn}@C#T(-RKM;KY- zu)OIE)HM@>(VfJzeaZJ<;{&5u5YSh!ncL4O<-;y?vnEe27{GUzBLSQ9W7K##uQgM=I zEy|yXPK>{kG905{Tizk3lh$Y}$XG2cuf-cx&O?k_plmN!RoTy{5Lekd<*CUfWC3G^@f@ZOW;;WMu2!qqlVq0Xe>mM>vnFW+Cm zC7t|rgShh_<9OxOfij8eCu9HcNTW-Ny!GS0D<;UH<49pC(@c>DobQ;DbQnZM-Gthf zt%8YelPf3oi%YrpG446_zhZ4b*ai&YsJ|SFm z61`$iG2cbhYJ{B9?nBa3=x|Q7{8V5>J!B`F%aB+Zvyc>cxeyS3<|zAVt?Y~IkQdFcOCggwQi*e#{YB~ob3iwanbay59q?v{+0Jo1B7d*PBZdZqnBNLXQx2k}S$Y`-|K z-vB!BC0--v$EUwX!EZ1R+7}S|I@9l9)~o4OUW({8(qXU?-N`)>`4|e1rH(HOWNdDj zG5Ixh-@^53v8MI%t_$;fV z9I?bN+c})#vEjsdVV#jOlfRYYN&X%?nC6b1^5xc;*;CE!>x~>W#tB`6SwkgGXZqDu z3Qm7Y;e-v&Nb4)TRMKCT!#Tyy_NF?{j4}+Ab5Ic@40PwX*`N3`PVx(Rl*ydjVLVxr z6{8O6T5=&e$&qPsZW!Z@F+pD{=K(V6KF;E3=2(9k>6ABStu5(aO18xBBaS7FV7#kj1&HAFP--OY%UpOuiN3*jjcfKY21x1c~n!nw*`C_|H z!T(?7#F=X%LzSEWYTP``xmtH{PUK zI+Ooag^h8)Sk2MX&1sI%)~L_*ER^&G)q^CZ{I5xAj+KhF{?jQqfLSD47xX zIoD9j!9gYt!r{Ot_35!3_xZu36LOePHp<<*BwkeN#5{+u$Zsr1yZV8}+{tvM+j^KPq zjI{;Zc-q_Vy4XB%l3F9yv~geDl2`Ixv6j=`3Q^*I&KkPXP-HPL<5Z)qNUINNxp~Z2 zX!;I(#Er;9PD5+a+R8;(>LKiWy=Y$lSFZKT-@_-aFm*a6v7>q&MgAjAZ6_-^kexYS ziP4*Q8bghxY^8mZ#_%$GNYG8r zGvXv9zZJpccSc{XJbR2Y5KoUg#sW>beH<(I1=E?rMTfcQ45Q`zzgBxcM@Uzq70d9G zNcB9ki5!bMOzMbk&bTvPt$O-o)74t*B3`-SdQIWp%?p}K4x7}UeE$zW=TWb$G;kav z=SoFBQU!(wyfq~zHRs$KzixdKPt}9u)zyXtjvi&qaFOntoxbQUlllbn8%9|G7g-yDl@n3m{;9IV-o@@syJN~9?~Ic_5|a%*xN*80d$Z~#HY&JAmV<$PMi zX=1B!5Fa3?%`E?h?^W6^?hIE|Sc(fw@VIrP~Zt zbQqU`<(nMn$a+EB-be3f@2HQ2FE$7lCkA3otB>ah$j4!+Kpjxu&vs~GNQd3i4GR-^6yxFgN5^{9G-5E`n}@F zW6p@3bLOLQpG)ry4wbBxaQ7%z<>F;=587ZA?q}4vsUR=7JhT()-^oH z;xt!UIrJ?0Nt5mb%61QH5M?yuRh@UekV7L6*9Y%Tr!7no;MB9)ReW|%%ml+LmDR;| zBad)G9>F4sxcVRuTj*TYvV=SQwkm^_c*F2 zXkfAUOK#O7hTY2ts?1|eqdI(4ZxvR@2dP}4A&AdHVjSjc+``~}_`^_;|39o-qthxDft{h6CL5K`t#mbcx_p* zEVZ1$@q1=PC+{$3Nn3+yK!r{YnQWG@Gt*IIF_;IPDTW4dS?P|@gFL+>R2y0t;M(&ccW^tgGP5PRTCp~|TDLRGDd`=+4cv)yCx-)*Kyt3Uh`!0(ScY15WUCz3SE8$QPvW|OOxZ~6A;kTn5BJ7!b58|1 zH`e}bNhvEHMbD4nP=|4-)3FRreV=iXzjyJs3d843)m?LK*q%Em}`jB z&$P`Pkd2vjMsrO5Uc_>MkQ}Jxm{EW&-od{Khr)@=HdbEFkS!C%oP~1rHQ5_$_ShRO zYHqZMCA|m${$t2lSmU=uW6!-uut7x4$ZIB7pDsPi>jeyoOTn*Q`ci{G%pfZahnwoY z9IdcM^J_T&6AQVU`9I9)fniPixb5QzY-hRs^hiHb$#&H^Uy0L9RG2q#9BA6Wh|1hG z&JI*RYGr*=xJaC>px%6t@NI}3$X-b^3p*#yCk}qjMVq^rC5P@=k=fN;dM8MJM6!rK?>-yg+T?`3eEi&V=AT8VQcFJsCZh@YBj?p(~pa-QI0krfuRDAx0; zLbsW-c=2q%4S9k^Eq%Hqkjurj<<@Sz-&Fj`3PzH89M`!!+U!}#-R2{>$3qLFw$v>+ z2v2j(k4N-pTsCfH=Sc3!NKsI4-E)S*fOE7a{W+65&T80jTNzo(w~8a`VHDO-Zk>VL zO+4)AuC?FFD~uDTX=ZN;BmqjkiqD`Pi#GXI5xe$)ChKRJd7CPLM?%ck5_}MH=3+7- zCs^Yn{22*O^$V&^`cJ~k+DZYx$`z_jv6my4={+pVf%KzI4FmdnbR1HiD!Az1!Ot8> zt^N)FUkL6sd_lY^JIz1v$o_1E#L?W5t&z(bJ<*p=MgPFTp*&+lR`E@AXmyG1<5c>>#dZ+_S zyNRp1{BfOx;A5e<-o)?cF2;Q_;yMAnRwfjCn}-H`)02+1Cywjxz+^a8F?0{1({VDM z{1gt+8a3#OSlkPtc(CSTJlc9P?kq#6tmP6Rdx-8E_r@)?4A8(*d&hNcyxz{^C??Uv zc8mAn_y54xt5{wYuxcfO0hmNKbK3=cp2KZ3`LTxL6?FkueE9dFc+Ov=hPIcY21T2_ z*;#xl?hLyF!v);HAaIvB=hyO!KCPTL_~!6VGLt$f5*f=2g@d2Q`T*@@Zq0T}`hL4* zns}rr_G4ell9uv3PLsEC*m3j<$2e2H`9AZw_l2c6>&EZ*(5cF&~8>6MA{I(EcAS=8fm!(rXrj@{}=X+c)l%}`P8rW0vOR)H_iz6dNZL~4q@+~w!XyVKXNo)8jX|~E>#{B|BnL_iy3&cZ|3Zv8<4z{FLP8M$Abpi0$7n9%>}3Fi{uGA5*|Kg)a5{Mk zAj7>kH~~f#gd`u1GO{NU2yWF88@q5anH&V%dx`}BlW86!n7W6`uDS#C$SiiUj$1%h z?0B)>%Cv7I@Xkdz<0hcQ`}hG9ig&@N!b2?Ja>=fEpmw+KEB14e8|~v1Vo<%3Q(`+t z#+>%0psD@HGaM`qmTb<7<1s=@NRwO)C-3CZ(QvgT^v9E+6lc`|hg9 zwA&Mk;xA$=AkS0H+Ktkt%K#VTbg^^xGwfG{${?U3eVer}6X z#ew9JnI`|)u`_Ed?eoAg$vRV`oQbp=W20M4u0 zDs{0#psnkm>F#x8+N1lNb0Qbkc#WL+gNM-z@~u4F)Np*{?MW=yW|l_0#TG6f8t^ec zqb+TKH+BC*f6#Pbm^2H6yPiMV8R}OdM=EWMQF> z;2`{}U(!W9Q<}sZ9O__nrMX@K0&Z1t-Y$-QIQ9xH-*0eW$A;pSD#&8YHEo{&-E#?` z+iLjQC1)kk%wrau^4SyM~H@zC@n7I1>eflgt# zdsy9M=CvGGmLVKihvcdI?TrqAteG&I0O8=+2p7%8tvO?-B9nlS*YQIdm%VB&Y(%PX zEt26bhhyw8et#F$&Uub?_ztxY&AS% zFR*t{s2>nN)@4k3(45D zoX#D?f3}}2id2z4q?Q^A()pTT|0|iyael(g{GiETQr9z!{rIjr6r}VV`Pj2 z+z)_Bzl5FM0x=rTH)E4;@cuE@uLHCiKM{RtY<76k4IVt|W61nL{KcH->ANp3&orCA za&3h^0#p4TdjKFD-ZsJYz9T^zVSdV&*9oca;E7KGfDHmL^PmpU-4p<4Gk!l;Lac=- zI@)@fBXd4}>6gswJz~`yE)>R{$hM1L7h0B!ORJp`ui;VQBdqa6hX(N!?j*TE>*OW{yBI2H)SZD#VH&gF5l z)3wD1jOJVUpTx`_;ItP9RDm`vibSuBIhaF5PLBJpIBzY*pwWsm)ZYoi_Hyf8T=X&P z_K|lT6b!D|NeZkuPCUMhA=eYZ^@J}CNTL9LTgz0A;(H6e(%-9lCvy4z$hBnJgyYl! zKKM)I@?b}shmn-oHx(X^{=i|5Tz+49W+VwV`kgtM4ov|fa2_n0SA?rlt+sD6VVy$x zZuJpiXZ2=mYx9tFk?^-fUXEXM*=GGW$J_ruknlgbUPDJy=Zi!CAX+osmW-dcpl^}u z?YCXezbpVbld$OPs^h?9XScbV*LQ*jmN5y~fe_U!p{Zy4N6)&_E{=ZXI*RERK*;28 zKku>%1u0ZS5#gr>zbw*iA%ZU!N0Yg)wencT*WEq+ilG8dT#Gb!|xar9~PseM&Vs=5^#*H$sGLf z7};>k5Ao{*T4lM_$=}XjfHb%^B`zFq!EunF8IQq4N7N_HYy)fNFpk09w1i%My0u6vml>MeM2&3D9sFB&s z!7i--PKG<93q9D%ZRTra3J_9(RH<6GN39;^( ziyRs3No8tTvTUU41?cOwBx}ZlsLP+l%b|S2RjlFx^O+Nje8^%mp|pJ95c;f}uP^26 zw{kz&*=nJ{m+Ew+8Ux1Nc4<5~78a+O<>WgmlYb#pu9|0PJDXhQp%Ocq zmn>Py8^L)d|2sBwg|(Owt}K8torho6tL=sHeM4MupQy=lRiOtLw(_Z86RWQicDgpI zX?p>6$cLW17MV43ZyPKxxlHJ_=sq9T9omcsZUH!oa~Fr&H#RQZ{Y;4j37)Yd)HTVG zm53o~XONl*g7{gd{lz~(&ToSg0$5!*2z&AfjPGADnNA?@mH>!sF&{h!>zf`~YFR7& z0(;SLFCr~;b~GvQ5g}-T>LvE494DZstI^7F{W+ISDBO77A=(+x*Rv2I_@7=EtMRa` zU1+2{Gf+dd5aq3if82BcQd|u~X02mh*yBuhk<%zEPwDb>{42JufQA}~4{d({=!yS% z55;LG2BadZF1hkUbYuvnnZXBAjyG=OgI8Hf^tT5`5kx9WBED17)c^@>?1>$;p-;1c z!CB4rP*iOwaCDO^oJ)zHXmS-fr}5+MzONz^)cU-kzyo6#b`?c*C!Og0BT$67RNc?( zua(9Z)lWt$zb#2QRpcDTy`GO=E!^emwm-0FPY^sc`#gx`VU88RgguI>@KUtdO8{8E2cT*J;@6j3ufYWIhT6{9 z>3%+9hkItYzg%E|KQH7}<}EW6)^t19NmEGGnNiGTFI6Z=_ZCoI;a(NY6+>|8TMJ2G zr|e6&Obd;j9plSWEg8Z4AY~mWd`@IYlA@#g(=F2nBntA6IAzY7lQm8YU^m%a6B*wJ zIja-$;>ih?_gPrpF7$1bantS5iCV-7oLT<%sO_8JJH^@#eQTNnbbHXbFwxy${ads= z`V5|4Jhp_>Qoi|Kv|QK1=fVhifxpRug}z}P5ABYpJzi7Xlz!HA^Zs~ao{y5yLSShM z8T;UKv3e7wAOBXC#(c6U7|~FV>dJ9HkFa{--6KLdUkLTv3@GIw#_>^bJuI&jf%Zq5 za@^mAe1#c;s2ebrzWAk*xoCJc3hl2$U1nqB+a(fpfPk$yDtmFfnauj~P~22=8GC|Y zo-!rmKgv_!@iH~St_l$-b=?#eP>NhxW6WZSG)+uqRKmuF#o0)KHk+qTMl)e{4@ZuGp{1W`3*nJ=jqHyQ+toNVeM!71ol$ty@jy_b zLo_o{cFL{#6ksP*mRGnuy*P9-p3F+Z?i}$;M;P(Dfac$E)BF7K;kz@)eYN`?Hu$33aA)R{cL64+Xs-GB`msJ{3nD8B1@AT`I{w=@~9Y zPC`RZXMrOcuAr_WJgasqQ9YC8%x@_=G#y0i=!Tq0{Yt;a>wx!78k}|_i?ErgWnI%h zD*DwQi<=B*TuW$vu|Cd6>xi*p_rC=n?3sYT>*<^@H8B6Mmf{a9@bg+de4O2Tri#|EYmJfea}fwI}qL)J&(KqC3b`6gB~^OS&%4utJ) zLrd4@y3Kt}=%LxAb_>Y~tUIH9p0k`+ym@^PLUg81)x;Rwkx{S6DFPx?lXlgC=0OEe8P(fj_6v7u<)iADO3^!R4(fN$37yW#fY4!;3 zOlicp58cWDG!SOh9-jM%T!bvV#I}5CoA8)2fJofqIzjTFAit5-plzz)G0*Lgk5}-U z9*)>a+`3if44jdg5Zz;u2asSB>-QC)V)^q`pxB3r{~Qht>n_C#C(11t8Z9&<=!ywY zR3{;@n_EQ3;v0+e_mFNGsmoXgh&o~hJ>Z1L7-Bz9*d2WB+Y%3v*|;TkqA55|%0e%g z74=JXjVGEQTBPmm4aPspSH5c_wX)tvVpomq=WwZJ6@b2nx`toUp~-+rDZ5G^-c05j zk+Ml&o9$AGQ7nrjqfQp(dgd&GN@vg|3PX?sXVi5<>cdTaPbCf1NU|}{=3$Z@V zr8i3bt$Gxs&{BdIgp!?SEn0kib+MmwhEY5{nw{vS^ zW#oJJ=L-#6FCM}k#aXQk2fuPnNfDh5NFr3htm=d!6?V%7B$_4!C>fA|;(k0^OrU5R zW2Q&vd|2TKRiia4@!Fjvtxa5TP_hv2ypECOQ!G}mXDHnaAWRT2_B>^< z1T{$n4N$WhPa+)|5mZ@?&#^v82~{oCwmPEm2#|RA<0jpgqtvBJbKI}v1oU{j#i6Q; z%H1*Pgb>FcVZ5P_ycVau*-s~gfYWh0J~nXQ4~a>nodS-F8k5sTD#x2m>a7?AW|bBQ z{*{-ffL*;BEa0rk0x&K^^JatL0<=?xy2Mm5f6K{IZ5!Gb`6w`l(jtssU&wjPGgN$a zj-Av1vhM?^dhHgBe;q?aj%`4hjBao8d*re2r+wB`aEjKRq%vLYRXJEMeW2FG%ws09 zyArgF_T9!!q`5*<5xrn{ETN-v~-lQi8x9CK<>o6#b$onvBw0S|AE61IojrO~4lM)(@RBjv6 z*PwyY3t-0uO#$FpR_SuwA0rtHievn)vc0Lo{t0*;2XMLH;tNPHt_K??;Q@8-*ug?d zMjUc+YF>wgR`+5CWm5d1zR|#1rhp%2 zvudKUOI3rz7VzSo`0OI?^DM!kK{9i}E(3hH6JH4aveM3`BWNrj?hG@{AO^7&kFy^! zs-JS?;8p*PC(pxsM#Qd{(cPQw&P)E>>$(}Sr_fSU*o0IzxbvJI2?3oaqU9FE+D0VRIrLT11|b0GT}EJ| z^I|F(c^YyU1+-qy@+c!iV~seyXd`I@0duYta#rDt)z7J(FpFb7dt<;@HQ>_tNBmbn zdT1U&PdB3k`8$|UVIHMM7WAP6BY@h?mtS~>139LP+keSk>(m#0TVi2WskolbuAxNx zZ>pr(lJ1xhEBY=i-ZM26BAlRQvG|+!*$2Y@+wnD{kxaDx=Z?&WrBXm1j9MoeA;`T3 z<7q0^Mv1=CV$`|JJ{Vr?!TXylbLwg2s<3(p?gEf9pLBSn&SU}2O8HFM6#dOVam5>o zTeP3Qsd%f{xQW`&u?xWKZsfQK9m@!fR9H74rPo6@=J4WWX^CcOyOEcms%AWb1KB?2 zu>}8bc+$9%Hed&R47PMame9lbv~ftC*GQwo*iMN@)G8cO&9&Gq*>=0d`L9-Boe%|x z=tqM|asj$51;seBt5l1A7Bwj}4Skq@ zz;WNDl2W`^^*51Mid(E`?F`0ak|O>EKpX*Iu*P&L*<49Fj>Ih7dMA&qfZOQ&nl_0h z+>+k zKe~Xw$HyT%1(&n2D&639HyVp06hlWN3P)y{IdI0ckr`bpN#6UhU8V*dtxAdi_+NRG zKF+4%NP#m<#lwu3n{fg!S-x>WXNVXU1Kp5$%Iam zK7gKRdEqvCq7_V8vzKP)n^;PKMsE)-bS%}tZytSKOj|HVILfYFOx)`3s+i38aso)#W0K!c)#Fn6N-Q(PJDi~@j$mD); z_yYdCOe2zF&`OqBKZc&##L-fh6I7?@^~|iWX5$50gd0y`5~mQ8lV{Gw9H3sL=%_yp zMzLQ2AN61AqmtY_tFiN_;{fuN`83g9LjhHb(<~B+ECFY&tDY=Zgkb9u3azztPXms>lp@pSkXGjwBi(`;P)8XU!fEMEHO+mT=sIrK$ z+~<2X$)uvH!@s-mK}N9bMHt$(=-hAw))KQ2RhjseKm@HMU2Z{e4Sv&)@Yr+{c2q~n;1Sq2!J=5V>l&Xap z^h6}uJ_Ya-Fow|CUEGTJp_kMiX?zS0lm=k!M?TN$GrmuG$v53TEY_ciT+zJ=PFQ+Z zMx&S{m~JP3+N{jWx+L8Y%k70liwIe$Sq1ZK1c9g6honPq5%Iw70wo7%``D?`-B-z* zs$CnUpX+z5;;lfMe`l~A?$SuqH(VOL9Gn}#G9I$p8@>DOX(M`}EAyOgB6Z}w=&I=R zvgX61`^N%^sIMbNs_DMb!f&U~wQCI}BR@7Zf^G)pDK z=dYJSZ0qQKI0JvZq6i!ez75U8Ih^BO(pnkqi5-YZSM@=JTOZx)$>RSs5R67AY(G@T z8c8-w#^XM$cR8E!zxDhMnNVRE-!8=(X?<`DCn;{>gRw;G!_*z5RDEWCR1-fb2=a!I z(`JVLzDp1r);&2Zw}$YV2!0J*Y#qK_dTVHK&KwHCqCp+O36 z@-{aS6@7#T5-RI%vbF_Qd#JL+P+&M5J7}`Rc7Y#$grJ`YIeQppWDe83nN>)_H+4pD zHu)WGGx%EZ#Q z>sw6+?MXzZ3dIUts9)*9R}cS%CkT<->l~?%D~-{Q9JLtw<5KvcL@fAV?n&Amo?$S4 zX+k<3JJ?4=%EaSHZy99^H}!}?X;QY*zUI`$%j1CZQ;mj?*MRWph8U}~0sFYEI|(!MLP z4?r`tQtDU_s5tKTwkc0weA9>yk>wMU)V(IAAN2Nm96r@(q(ULPeOAJ) zI{Il6-o|A|72t^F29+gCs<(76L^pvl1_bHT+7P-N;3t88=EZme=rwpc<_XtE?SWc` z39D7TG+tDLFajY~s)gaNArNg3vZ~1k)6aOD(Mwh7_@|d!DMVU}H7aBOef(hmQUxh85i*gxZ5QlaGeT|DnBrjSnwTXqR$ z;`lpD3`GWV=$jj8t4k(?W|%s|(-O&!j?&}NeRfM0KY0T_s43C0X5>KSA{U~?YLLh! zsDq{2f-iB?2dj?0%O28~*}eioH&M!oEF-(gmzJhB2#1(o|FPkM%XXrl++jHw+ymPy zRA1}hw2?8Aag9)=WrAP9tc`rbrW>V~*F9*x_~nhUj`-2^fAY2yd)NNS>i%nIo9_#n zr(!WY*2;6x5*m+Qx^T(EbkYsr!z)X`@K{wNY+T!uD)b+_RI9t0kEE)H_sA#DwF4s7 z`^m;6r_mlD#I|f_3a0?kgi(P*+fh4`zFw-_9gsr)Wa+s)hWyj;6vBICJ|WES(>&}} z^u&dU+xp00ng~+`(y&Fy$t8oB#=V+(@SB2n33mfLbTLl%TD;^4qow7r4TCP@vO0c! z(BT00vzMmVHqP`Ox(MK_ZuvX^Tuut1K0t4(-!&?|V|d?M)WSaCeUpQM@WI08{F+g- z<+u%)&@3h9^%UQYgd$D_pD4}PF>c9F^)573C3yuYq?;>*D+HbSp~T$${iq-}9`VUz zWC8XDG6uL$+x3W-qg|#*XxZUf4ljFt6IqqdZ+cqS(xD0;hZ-m1I$Xq1(U62kI z*(14w;M77|p*~KDw!*sZU>{&^E`o4}s$e{%OR$&u^F7^8xUQ)5+f4tZ0-nh&OB3xz z5oEtIew1_pGSbGtK7guAQc p^=OTY=80jdTH{xi5ZBY{s3HS{D5+I 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

    9J~FI`D@Paah)j2 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%0DU(Y|&=fxQKTDzD97?ujaV?mi^; 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' + + The test APK was made from: + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1018#note_690565333 + It was then stripped down by doing: + + * mkdir SystemWebView + * cd SystemWebView/ + * unzip ../SystemWebView.apk + * rm -rf META-INF/ lib assets/icudtl.dat assets/stored-locales/ + * jar cf ../SystemWebView-repack.apk * + """ + # reset the state, perhaps this should be in setUp() + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.common.config = config + fdroidserver.update.config = config + with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): + os.mkdir('repo') + apkfile = 'repo/SystemWebView-repack.apk' + shutil.copy(os.path.join(self.basedir, os.path.basename(apkfile)), apkfile) + fdroidserver.update.scan_apk(apkfile) + def test_process_apk(self): def _build_yaml_representer(dumper, data): '''Creates a YAML representation of a Build instance''' From 75989ff59ab4a0b89b28c7705566d0efc2f47222 Mon Sep 17 00:00:00 2001 From: Noah Andrews Date: Fri, 17 Sep 2021 17:33:58 +0000 Subject: [PATCH 0430/2116] Handle error when parsing WebView icon Fixes #903 --- fdroidserver/update.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index b0051098..f08a830f 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1543,8 +1543,8 @@ def scan_apk_androguard(apk, apkfile): icon_id_str = apkobject.get_element("application", "icon") if icon_id_str: - icon_id = int(icon_id_str.replace("@", "0x"), 16) try: + icon_id = int(icon_id_str.replace("@", "0x"), 16) resource_id = arsc.get_id(apk['packageName'], icon_id) if resource_id: icon_name = arsc.get_id(apk['packageName'], icon_id)[1] From a0a86aa5ec07e698e1c8e43cfced7f1008b765a9 Mon Sep 17 00:00:00 2001 From: Christian Stadelmann Date: Sat, 2 Oct 2021 08:13:48 +0000 Subject: [PATCH 0431/2116] Clarify wording example for config.yml Note: The old wording was applicable to the python version of this config file only. --- examples/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/config.yml b/examples/config.yml index ca818414..8dbe5d44 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -354,8 +354,8 @@ # generating our default list. (https://pypi.org/project/spdx-license-list) # # You can override our default list of allowed licenes by setting this option. -# Just supply a custom list of licene names you would like to allow. Setting -# this to `None` disables this lint check. +# Just supply a custom list of licene names you would like to allow. To disable +# checking licenses by the linter, assign an empty value to lint_licenses. # # lint_licenses: # - Custom-License-A From 60532f0912f8cb3d3254f3cc028c4fc122c84ff4 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 14 Oct 2021 13:40:19 +0200 Subject: [PATCH 0432/2116] Ignore failing Windows CI --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3ba44aed..71b85ffa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -507,6 +507,8 @@ Windows: when: always paths: - "*.log" + allow_failure: + exit_codes: 1 pages: From 23bd62c31c576077ed81315beaf02dca1fa2b22a Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 14 Oct 2021 13:55:51 +0200 Subject: [PATCH 0433/2116] [CI] fetchsrclibs use apt cffi --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 71b85ffa..00232fa7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -391,6 +391,7 @@ plugin_fetchsrclibs: - apt-get install curl git + python3-cffi python3-cryptography python3-pip python3-venv From 45a20ab365280d117641b5ced8298f71ae883595 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sun, 10 Oct 2021 10:48:04 +0200 Subject: [PATCH 0434/2116] [checkupdates] Tweak logging - Increase severity of version mismatch. - Don't log that the process is done. --- fdroidserver/checkupdates.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 750d8c92..9a686126 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -203,7 +203,7 @@ def check_tags(app, pattern): if hver: if htag != tags[0]: - logging.info( + logging.warning( "{appid}: latest tag {tag} does not contain highest version {version}".format( appid=app.id, tag=tags[0], version=hver ) @@ -690,7 +690,6 @@ def main(): update_wiki(None, locallog) status_update_json(processed, failed) - logging.info(_("Finished")) sys.exit(exit_code) From 972bfe346f377777288de00931fcd685d2b2ca86 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 14 Oct 2021 14:40:31 +0200 Subject: [PATCH 0435/2116] Fix servergitmirrors ci --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 00232fa7..3f02c797 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -430,6 +430,7 @@ servergitmirrors: openssh-client openssl python3-cryptography + python3-cffi python3-pip python3-venv rsync From fa3cceb8e84898ac50d0110e0e29a0d54b5022d4 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sun, 10 Oct 2021 17:09:29 +0200 Subject: [PATCH 0436/2116] git prune branches in case of failure git branches can be namespaces like directories on a filesystem and are represented like that. Due to that there can't be a branch with the same name as a namespace, i.e. foo and foo/bar. If upstream moves from a branch to namespace, we need to prune the old branch before fetching the new one. This broke organic maps: From https://github.com/organicmaps/organicmaps * [new branch] android/huawei -> origin/android/huawei error: cannot lock ref 'refs/remotes/origin/fixes/all': 'refs/remotes/origin/fixes' exists; cannot create 'refs/remotes/origin/fixes/all' ! [new branch] fixes/all -> origin/fixes/all (unable to update local ref) e2ac324b95..320a1db39b master -> origin/master * [new tag] 2021.10.09-2-android -> 2021.10.09-2-android error: some local refs could not be updated; try running 'git remote prune origin' to remove any old, conflicting branches --- fdroidserver/common.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index c413f239..389dfe8a 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1167,6 +1167,9 @@ class vcs_git(vcs): p = self.git(['fetch', 'origin'], cwd=self.local) if p.returncode != 0: raise VCSException(_("Git fetch failed"), p.output) + p = self.git(['remote', 'prune', 'origin'], output=False, cwd=self.local) + if p.returncode != 0: + raise VCSException(_("Git prune failed"), p.output) p = self.git(['fetch', '--prune', '--tags', '--force', 'origin'], output=False, cwd=self.local) if p.returncode != 0: raise VCSException(_("Git fetch failed"), p.output) From e5dcf532b47fe742ed5e34f517ff5d24f1288cc3 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sat, 23 Oct 2021 14:08:07 +0200 Subject: [PATCH 0437/2116] Improve rewritemeta --help --- fdroidserver/rewritemeta.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/rewritemeta.py b/fdroidserver/rewritemeta.py index a6406cb9..0437469b 100644 --- a/fdroidserver/rewritemeta.py +++ b/fdroidserver/rewritemeta.py @@ -51,7 +51,7 @@ def main(): parser = ArgumentParser() common.setup_global_opts(parser) parser.add_argument("-l", "--list", action="store_true", default=False, - help=_("List files that would be reformatted")) + help=_("List files that would be reformatted (dry run)")) parser.add_argument("appid", nargs='*', help=_("application ID of file to operate on")) metadata.add_metadata_arguments(parser) options = parser.parse_args() From b8285ebd0eb41529dac58673a750d9fd60fdab3a Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sat, 23 Oct 2021 14:33:06 +0200 Subject: [PATCH 0438/2116] [CI] Install python3-pil from apt New version would need to be compiled, otherwise. --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3f02c797..19e3e819 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -394,6 +394,7 @@ plugin_fetchsrclibs: python3-cffi python3-cryptography python3-pip + python3-pil python3-venv - python3 -m venv --system-site-packages env - . env/bin/activate From 46abffa0fa5fd54c861d317fa3c677ea7f333a6b Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sat, 23 Oct 2021 15:01:40 +0200 Subject: [PATCH 0439/2116] [CI] install python3-pil from apt in servergitmirrors New version would need to be compiled, otherwise. --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 19e3e819..1f62e98c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -433,6 +433,7 @@ servergitmirrors: python3-cryptography python3-cffi python3-pip + python3-pil python3-venv rsync wget From aead3310bd816d9e61200cd8504c22412300c8f2 Mon Sep 17 00:00:00 2001 From: Gaurav Ujjwal Date: Fri, 22 Oct 2021 23:42:31 +0530 Subject: [PATCH 0440/2116] NDK Install: Handle symlinks present in NDK zip --- fdroidserver/common.py | 14 ++++++++- tests/common.TestCase | 67 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 79 insertions(+), 2 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 389dfe8a..5961f687 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4338,7 +4338,19 @@ def _install_ndk(ndk): with zipfile.ZipFile(zipball) as zipfp: for info in zipfp.infolist(): permbits = info.external_attr >> 16 - if stat.S_ISDIR(permbits) or stat.S_IXUSR & permbits: + if stat.S_ISLNK(permbits): + link = os.path.join(ndk_base, info.filename) + link_target = zipfp.read(info).decode() + link_dir = os.path.dirname(link) + os.makedirs(link_dir, 0o755, True) # ensure intermediate directories are created + os.symlink(link_target, link) + + real_target = os.path.realpath(link) + if not real_target.startswith(ndk_base): + os.remove(link) + logging.error(_('Unexpected symlink target: {link} -> {target}') + .format(link=link, target=real_target)) + elif stat.S_ISDIR(permbits) or stat.S_IXUSR & permbits: zipfp.extract(info.filename, path=ndk_base) os.chmod(os.path.join(ndk_base, info.filename), 0o755) # nosec bandit B103 else: diff --git a/tests/common.TestCase b/tests/common.TestCase index 389859d4..ad6e1ea4 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -20,7 +20,8 @@ import unittest import textwrap import yaml import gzip -from zipfile import ZipFile +import stat +from zipfile import ZipFile, ZipInfo from unittest import mock from pathlib import Path @@ -2116,6 +2117,70 @@ class CommonTest(unittest.TestCase): _ignored # silence the linters fdroidserver.common._install_ndk(r) + def test_install_ndk_with_symlinks(self): + """Some NDK zipballs might have symlinks in them.""" + + def fake_download(url, zipball): + print(url, zipball) + unix_st_mode = ( + stat.S_IFLNK + | stat.S_IRUSR + | stat.S_IWUSR + | stat.S_IXUSR + | stat.S_IRGRP + | stat.S_IWGRP + | stat.S_IXGRP + | stat.S_IROTH + | stat.S_IWOTH + | stat.S_IXOTH + ) + with ZipFile(zipball, 'w') as zipfp: + zipfp.writestr('ndk/' + os.path.basename(url), url) + + zipInfo = ZipInfo('ndk/basename') + zipInfo.create_system = 3 + zipInfo.external_attr = unix_st_mode << 16 + zipfp.writestr(zipInfo, os.path.basename(url)) + + zipInfo = ZipInfo('ndk/bad_abs_link') + zipInfo.create_system = 3 + zipInfo.external_attr = unix_st_mode << 16 + zipfp.writestr(zipInfo, '/etc/passwd') + + zipInfo = ZipInfo('ndk/bad_rel_link') + zipInfo.create_system = 3 + zipInfo.external_attr = unix_st_mode << 16 + zipfp.writestr(zipInfo, '../../../../../../../etc/passwd') + + zipInfo = ZipInfo('ndk/bad_rel_link2') + zipInfo.create_system = 3 + zipInfo.external_attr = unix_st_mode << 16 + zipfp.writestr(zipInfo, 'foo/../../../../../../../../../etc/passwd') + + sdk_path = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + config = {'sdk_path': sdk_path} + fdroidserver.common.config = config + r = 'r20' + sha256 = '57435158f109162f41f2f43d5563d2164e4d5d0364783a9a6fab3ef12cb06ce0' + with mock.patch( + 'fdroidserver.net.download_file', side_effect=fake_download + ) as _ignored, mock.patch( + 'fdroidserver.common.get_ndk_version', return_value=r + ) as _ignored, mock.patch( + 'fdroidserver.common.sha256sum', return_value=sha256 + ): + _ignored # silence the linters + fdroidserver.common._install_ndk(r) + + self.assertTrue(os.path.exists(os.path.join(sdk_path, 'ndk', 'r20'))) + self.assertTrue(os.path.exists(os.path.join(sdk_path, 'ndk', 'r20', 'basename'))) + self.assertFalse(os.path.exists(os.path.join(sdk_path, 'ndk', 'r20', 'bad_abs_link'))) + self.assertFalse(os.path.exists(os.path.join(sdk_path, 'ndk', 'r20', 'bad_rel_link'))) + self.assertFalse(os.path.exists(os.path.join(sdk_path, 'ndk', 'r20', 'bad_rel_link2'))) + os.system('ls -l ' + os.path.join(sdk_path, 'ndk', 'r20')) + def test_fill_config_defaults(self): """Test the auto-detection of NDKs installed in standard paths""" sdk_path = tempfile.mkdtemp( From ae9a1df1aabce15df5a1200994799729f4065c38 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sat, 30 Oct 2021 20:59:56 +0200 Subject: [PATCH 0441/2116] Add newline in ssh_config Otherwise both options end on the same line and are not used. --- buildserver/setup-env-vars | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildserver/setup-env-vars b/buildserver/setup-env-vars index 5fed9e8f..a4d96781 100644 --- a/buildserver/setup-env-vars +++ b/buildserver/setup-env-vars @@ -16,5 +16,5 @@ echo "export DEBIAN_FRONTEND=noninteractive" >> $bsenv chmod 0644 $bsenv # make sure that SSH never hangs at a password or key prompt -printf ' StrictHostKeyChecking yes' >> /etc/ssh/ssh_config -printf ' BatchMode yes' >> /etc/ssh/ssh_config +printf ' StrictHostKeyChecking yes\n' >> /etc/ssh/ssh_config +printf ' BatchMode yes\n' >> /etc/ssh/ssh_config From 6756f842e4aa1623192db8b6bb379e16265b6d6b Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 16 Nov 2021 14:52:08 +0100 Subject: [PATCH 0442/2116] [CI] install python3-matplotlib from apt --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1f62e98c..41c5d045 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -393,6 +393,7 @@ plugin_fetchsrclibs: git python3-cffi python3-cryptography + python3-matplotlib python3-pip python3-pil python3-venv @@ -431,6 +432,7 @@ servergitmirrors: openssh-client openssl python3-cryptography + python3-matplotlib python3-cffi python3-pip python3-pil From 656c70763674b7fe9be125d2d39b624d3fccfabc Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 19 Nov 2021 17:53:43 +0100 Subject: [PATCH 0443/2116] Simplify index.html for new html5lib Newer html5lib (used in html5print in the test_make_website) strip the empty value, as it is valid html. --- fdroidserver/index.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 35cf9d06..5ba728e7 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -185,7 +185,7 @@ def make_website(apps, repodir, repodict): - + From 9a68c4aefca6dffafa19c78530aae0a4369921da Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Mon, 22 Nov 2021 07:57:10 +0000 Subject: [PATCH 0444/2116] gradle v7.3 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 4ac6be2a..04c79015 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -170,6 +170,7 @@ get_sha() { '7.1') echo '2debee19271e1b82c6e41137d78e44e6e841035230a1a169ca47fd3fb09ed87b' ;; '7.1.1') echo 'bf8b869948901d422e9bb7d1fa61da6a6e19411baa7ad6ee929073df85d6365d' ;; '7.2') echo 'f581709a9c35e9cb92e16f585d2c4bc99b2b1a5f85d2badbd3dc6bff59e1e6dd' ;; + '7.3') echo 'de8f52ad49bdc759164f72439a3bf56ddb1589c4cde802d3cec7d6ad0e0ee410' ;; *) exit 1 esac } @@ -190,7 +191,7 @@ d_plugin_k=(4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 d_plugin_v=(6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 1c65fd849651523a4131db6baec739860e8e2fe1 Mon Sep 17 00:00:00 2001 From: Ward Vanlerberghe Date: Wed, 24 Nov 2021 07:54:57 +0000 Subject: [PATCH 0445/2116] Added Github actions/workflow to the nightly CI --- fdroidserver/nightly.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 85ef58fc..79a2f404 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -235,6 +235,16 @@ def main(): + '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys') git_user_name = os.getenv('CIRCLE_USERNAME') git_user_email = git_user_name + '@' + platform.node() + elif 'GITHUB_ACTIONS' in os.environ: + # we are in Github actions + repo_git_base = (os.getenv('GITHUB_REPOSITORY') + NIGHTLY) + clone_url = (os.getenv('GITHUB_SERVER_URL') + '/' + repo_git_base) + repo_base = clone_url + '/raw/master/fdroid' + servergitmirror = 'git@' + urlparse(clone_url).netloc + ':' + repo_git_base + deploy_key_url = ('https://github.com/' + repo_git_base + '/settings/keys' + + '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys') + git_user_name = os.getenv('GITHUB_ACTOR') + git_user_email = git_user_name + '@' + platform.node() else: print(_('ERROR: unsupported CI type, patches welcome!')) sys.exit(1) From b6f1f4231a6b9dfe7e4400629c460cb3b34a8230 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 16 Nov 2021 14:28:38 +0100 Subject: [PATCH 0446/2116] Drop code for the old wiki --- examples/config.yml | 7 -- fdroidserver/build.py | 63 +--------- fdroidserver/checkupdates.py | 39 ------ fdroidserver/common.py | 23 ---- fdroidserver/deploy.py | 25 ---- fdroidserver/exception.py | 7 -- fdroidserver/update.py | 234 ----------------------------------- jenkins-build-all | 13 +- setup.py | 1 - 9 files changed, 3 insertions(+), 409 deletions(-) diff --git a/examples/config.yml b/examples/config.yml index 8dbe5d44..c66d157f 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -280,13 +280,6 @@ # virustotal_apikey: {env: virustotal_apikey} -# The build logs can be posted to a mediawiki instance, like on f-droid.org. -# wiki_protocol: http -# wiki_server: server -# wiki_path: /wiki/ -# wiki_user: login -# wiki_password: 1234 - # Keep a log of all generated index files in a git repo to provide a # "binary transparency" log for anyone to check the history of the # binaries that are published. This is in the form of a "git remote", diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 13c651ce..e1ae293b 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -23,7 +23,6 @@ import glob import subprocess import posixpath import re -import sys import tarfile import threading import traceback @@ -1074,12 +1073,6 @@ def main(): app['Builds'] = [build] break - if options.wiki: - import mwclient - site = mwclient.Site((config['wiki_protocol'], config['wiki_server']), - path=config['wiki_path']) - site.login(config['wiki_user'], config['wiki_password']) - # Build applications... failed_builds = [] build_succeeded = [] @@ -1112,8 +1105,6 @@ def main(): else: timer = None - wikilog = None - build_starttime = common.get_wiki_timestamp() tools_version_log = '' if not options.onserver: tools_version_log = common.get_android_tools_version_log() @@ -1205,7 +1196,6 @@ def main(): build_succeeded.append(app) build_succeeded_ids.append([app['id'], build.versionCode]) - wikilog = "Build succeeded" except VCSException as vcse: reason = str(vcse).split('\n', 1)[0] if options.verbose else str(vcse) @@ -1215,17 +1205,17 @@ def main(): logging.debug("Error encoutered, stopping by user request.") common.force_exit(1) add_failed_builds_entry(failed_builds, appid, build, vcse) - wikilog = str(vcse) common.deploy_build_log_with_rsync( appid, build.versionCode, "".join(traceback.format_exc()) ) except FDroidException as e: + tstamp = time.strftime("%Y-%m-%d %H:%M:%SZ", time.gmtime()) with open(os.path.join(log_dir, appid + '.log'), 'a+') as f: f.write('\n\n============================================================\n') f.write('versionCode: %s\nversionName: %s\ncommit: %s\n' % (build.versionCode, build.versionName, build.commit)) f.write('Build completed at ' - + common.get_wiki_timestamp() + '\n') + + tstamp + '\n') f.write('\n' + tools_version_log + '\n') f.write(str(e)) logging.error("Could not build app %s: %s" % (appid, e)) @@ -1233,7 +1223,6 @@ def main(): logging.debug("Error encoutered, stopping by user request.") common.force_exit(1) add_failed_builds_entry(failed_builds, appid, build, e) - wikilog = e.get_wikitext() common.deploy_build_log_with_rsync( appid, build.versionCode, "".join(traceback.format_exc()) ) @@ -1244,36 +1233,10 @@ def main(): logging.debug("Error encoutered, stopping by user request.") common.force_exit(1) add_failed_builds_entry(failed_builds, appid, build, e) - wikilog = str(e) common.deploy_build_log_with_rsync( appid, build.versionCode, "".join(traceback.format_exc()) ) - if options.wiki and wikilog: - try: - # Write a page with the last build log for this version code - lastbuildpage = appid + '/lastbuild_' + build.versionCode - newpage = site.Pages[lastbuildpage] - with open(os.path.join('tmp', 'fdroidserverid')) as fp: - fdroidserverid = fp.read().rstrip() - txt = "* build session started at " + common.get_wiki_timestamp(start_timestamp) + '\n' \ - + "* this build started at " + build_starttime + '\n' \ - + "* this build completed at " + common.get_wiki_timestamp() + '\n' \ - + common.get_git_describe_link() \ - + '* fdroidserverid: [https://gitlab.com/fdroid/fdroidserver/commit/' \ - + fdroidserverid + ' ' + fdroidserverid + ']\n\n' - if buildserverid: - txt += '* buildserverid: [https://gitlab.com/fdroid/fdroidserver/commit/' \ - + buildserverid + ' ' + buildserverid + ']\n\n' - txt += tools_version_log + '\n\n' - txt += '== Build Log ==\n\n' + wikilog - newpage.save(txt, summary='Build log') - # Redirect from /lastbuild to the most recent build log - newpage = site.Pages[appid + '/lastbuild'] - newpage.save('#REDIRECT [[' + lastbuildpage + ']]', summary='Update redirect') - except Exception as e: - logging.error("Error while attempting to publish build log: %s" % e) - if timer: timer.cancel() # kill the watchdog timer @@ -1298,27 +1261,13 @@ def main(): "{} builds failed", len(failed_builds)).format(len(failed_builds))) if options.wiki: - wiki_page_path = 'build_' + time.strftime('%s', start_timestamp) - newpage = site.Pages[wiki_page_path] - txt = '' - txt += "* command line: %s\n" % ' '.join(sys.argv) - txt += "* started at %s\n" % common.get_wiki_timestamp(start_timestamp) - txt += "* completed at %s\n" % common.get_wiki_timestamp() - if buildserverid: - txt += ('* buildserverid: [https://gitlab.com/fdroid/fdroidserver/commit/{id} {id}]\n' - .format(id=buildserverid)) - if fdroidserverid: - txt += ('* fdroidserverid: [https://gitlab.com/fdroid/fdroidserver/commit/{id} {id}]\n' - .format(id=fdroidserverid)) if os.cpu_count(): - txt += "* host processors: %d\n" % os.cpu_count() status_output['hostOsCpuCount'] = os.cpu_count() if os.path.isfile('/proc/meminfo') and os.access('/proc/meminfo', os.R_OK): with open('/proc/meminfo') as fp: for line in fp: m = re.search(r'MemTotal:\s*([0-9].*)', line) if m: - txt += "* host RAM: %s\n" % m.group(1) status_output['hostProcMeminfoMemTotal'] = m.group(1) break fdroid_path = os.path.realpath(os.path.join(os.path.dirname(__file__), '..')) @@ -1328,18 +1277,10 @@ def main(): for line in configfile: m = re.search(r'cpus\s*=\s*([0-9].*)', line) if m: - txt += "* guest processors: %s\n" % m.group(1) status_output['guestVagrantVmCpus'] = m.group(1) m = re.search(r'memory\s*=\s*([0-9].*)', line) if m: - txt += "* guest RAM: %s MB\n" % m.group(1) status_output['guestVagrantVmMemory'] = m.group(1) - txt += "* successful builds: %d\n" % len(build_succeeded) - txt += "* failed builds: %d\n" % len(failed_builds) - txt += "\n\n" - newpage.save(txt, summary='Run log') - newpage = site.Pages['build'] - newpage.save('#REDIRECT [[' + wiki_page_path + ']]', summary='Update redirect') if buildserverid: status_output['buildserver'] = {'commitId': buildserverid} diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 9a686126..eb30693e 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -563,38 +563,6 @@ def status_update_json(processed, failed): common.write_status_json(output) -def update_wiki(gplaylog, locallog): - if config.get('wiki_server') and config.get('wiki_path'): - try: - import mwclient - site = mwclient.Site((config['wiki_protocol'], config['wiki_server']), - path=config['wiki_path']) - site.login(config['wiki_user'], config['wiki_password']) - - # Write a page with the last build log for this version code - wiki_page_path = 'checkupdates_' + time.strftime('%s', start_timestamp) - newpage = site.Pages[wiki_page_path] - txt = '' - txt += "* command line: " + ' '.join(sys.argv) + "\n" - txt += common.get_git_describe_link() - txt += "* started at " + common.get_wiki_timestamp(start_timestamp) + '\n' - txt += "* completed at " + common.get_wiki_timestamp() + '\n' - txt += "\n\n" - txt += common.get_android_tools_version_log() - txt += "\n\n" - if gplaylog: - txt += '== --gplay check ==\n\n' - txt += gplaylog - if locallog: - txt += '== local source check ==\n\n' - txt += locallog - newpage.save(txt, summary='Run log') - newpage = site.Pages['checkupdates'] - newpage.save('#REDIRECT [[' + wiki_page_path + ']]', summary='Update redirect') - except Exception as e: - logging.error(_('Error while attempting to publish log: %s') % e) - - config = None options = None start_timestamp = time.gmtime() @@ -635,10 +603,8 @@ def main(): apps = common.read_app_args(options.appid, allapps, False) - gplaylog = '' if options.gplay: for appid, app in apps.items(): - gplaylog += '* ' + appid + '\n' version, reason = check_gplay(app) if version is None: if reason == '404': @@ -660,10 +626,8 @@ def main(): else: logging.info("{0} has the same version {1} on the Play Store" .format(_getappname(app), version)) - update_wiki(gplaylog, None) return - locallog = '' processed = [] failed = dict() exit_code = 0 @@ -675,7 +639,6 @@ def main(): msg = _("Processing {appid}").format(appid=appid) logging.info(msg) - locallog += '* ' + msg + '\n' try: checkupdates_app(app) @@ -684,11 +647,9 @@ def main(): msg = _("...checkupdate failed for {appid} : {error}").format(appid=appid, error=e) logging.error(msg) logging.debug(traceback.format_exc()) - locallog += msg + '\n' failed[appid] = str(e) exit_code = 1 - update_wiki(None, locallog) status_update_json(processed, failed) sys.exit(exit_code) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 5961f687..5a92fba5 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4100,13 +4100,6 @@ def get_examples_dir(): return examplesdir -def get_wiki_timestamp(timestamp=None): - """Return current time in the standard format for posting to the wiki.""" - if timestamp is None: - timestamp = time.gmtime() - return time.strftime("%Y-%m-%d %H:%M:%SZ", timestamp) - - def get_android_tools_versions(): """Get a list of the versions of all installed Android SDK/NDK components.""" global config @@ -4140,22 +4133,6 @@ def get_android_tools_version_log(): return log -def get_git_describe_link(): - """Get a link to the current fdroiddata commit, to post to the wiki.""" - try: - output = subprocess.check_output(['git', 'describe', '--always', '--dirty', '--abbrev=0'], - universal_newlines=True).strip() - except subprocess.CalledProcessError: - pass - if output: - commit = output.replace('-dirty', '') - return ('* fdroiddata: [https://gitlab.com/fdroid/fdroiddata/commit/{commit} {id}]\n' - .format(commit=commit, id=output)) - else: - logging.error(_("'{path}' failed to execute!").format(path='git describe')) - return '' - - def calculate_math_string(expr): ops = { ast.Add: operator.add, diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index e56030fe..1ce9e141 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -672,28 +672,6 @@ def push_binary_transparency(git_repo_path, git_remote): origin.push('master') -def update_wiki(): - try: - import mwclient - site = mwclient.Site((config['wiki_protocol'], config['wiki_server']), - path=config['wiki_path']) - site.login(config['wiki_user'], config['wiki_password']) - - # Write a page with the last build log for this version code - wiki_page_path = 'deploy_' + time.strftime('%s', start_timestamp) - newpage = site.Pages[wiki_page_path] - txt = '' - txt += "* command line: " + ' '.join(sys.argv) + "\n" - txt += "* started at " + common.get_wiki_timestamp(start_timestamp) + '\n' - txt += "* completed at " + common.get_wiki_timestamp() + '\n' - txt += "\n\n" - newpage.save(txt, summary='Run log') - newpage = site.Pages['deploy'] - newpage.save('#REDIRECT [[' + wiki_page_path + ']]', summary='Update redirect') - except Exception as e: - logging.error(_('Error while attempting to publish log: %s') % e) - - def main(): global config, options @@ -811,9 +789,6 @@ def main(): push_binary_transparency(BINARY_TRANSPARENCY_DIR, binary_transparency_remote) - if config.get('wiki_server') and config.get('wiki_path'): - update_wiki() - common.write_status_json(common.setup_status_output(start_timestamp)) sys.exit(0) diff --git a/fdroidserver/exception.py b/fdroidserver/exception.py index 15228797..7e6e32ab 100644 --- a/fdroidserver/exception.py +++ b/fdroidserver/exception.py @@ -8,13 +8,6 @@ class FDroidException(Exception): return self.detail return '[...]\n' + self.detail[-16000:] - def get_wikitext(self): - ret = repr(self.value) + "\n" - if self.detail: - ret += "=detail=\n" - ret += "
    \n" + self.shortened_detail() + "
    \n" - return ret - def __str__(self): if self.value is None: ret = __name__ diff --git a/fdroidserver/update.py b/fdroidserver/update.py index f08a830f..4c217180 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -199,236 +199,6 @@ def status_update_json(apps, apks): common.write_status_json(output, options.pretty) -def update_wiki(apps, apks): - """Update the wiki. - - Parameters - ---------- - apps - fully populated list of all applications - apks - all apks, except... - """ - logging.info("Updating wiki") - wikicat = 'Apps' - wikiredircat = 'App Redirects' - import mwclient - site = mwclient.Site((config['wiki_protocol'], config['wiki_server']), - path=config['wiki_path']) - site.login(config['wiki_user'], config['wiki_password']) - generated_pages = {} - generated_redirects = {} - - for appid in apps: - app = metadata.App(apps[appid]) - - wikidata = '' - if app.Disabled: - wikidata += '{{Disabled|' + app.Disabled + '}}\n' - if app.AntiFeatures: - for af in sorted(app.AntiFeatures): - wikidata += '{{AntiFeature|' + af + '}}\n' - if app.RequiresRoot: - requiresroot = 'Yes' - else: - requiresroot = 'No' - - apppagename = common.get_app_display_name(app) - - wikidata += '{{App|id=%s|name=%s|added=%s|lastupdated=%s|source=%s|tracker=%s|web=%s|changelog=%s|donate=%s|flattr=%s|liberapay=%s|bitcoin=%s|litecoin=%s|license=%s|root=%s|author=%s|email=%s}}\n' % ( - appid, - apppagename, - app.added.strftime('%Y-%m-%d') if app.added else '', - app.lastUpdated.strftime('%Y-%m-%d') if app.lastUpdated else '', - app.SourceCode, - app.IssueTracker, - app.WebSite, - app.Changelog, - app.Donate, - app.FlattrID, - app.LiberapayID, - app.Bitcoin, - app.Litecoin, - app.License, - requiresroot, - app.AuthorName, - app.AuthorEmail) - - if app.Provides: - wikidata += "This app provides: %s" % ', '.join(app.Summary.split(',')) - - wikidata += app.Summary - wikidata += " - [https://f-droid.org/repository/browse/?fdid=" + appid + " view in repository]\n\n" - - wikidata += "=Description=\n" - wikidata += app.Description + "\n" - - wikidata += "=Maintainer Notes=\n" - if app.MaintainerNotes: - wikidata += app.MaintainerNotes + "\n" - wikidata += "\nMetadata: [https://gitlab.com/fdroid/fdroiddata/blob/master/metadata/{0}.yml current] [https://gitlab.com/fdroid/fdroiddata/commits/master/metadata/{0}.yml history]\n".format(appid) - - # Get a list of all packages for this application... - apklist = [] - gotcurrentver = False - cantupdate = False - buildfails = False - for apk in apks: - if apk['packageName'] == appid: - if str(apk['versionCode']) == app.get('CurrentVersionCode'): - gotcurrentver = True - apklist.append(apk) - # Include ones we can't build, as a special case... - for build in app.get('Builds', []): - if build.disable: - if build.versionCode == app.get('CurrentVersionCode'): - cantupdate = True - # TODO: Nasty: vercode is a string in the build, and an int elsewhere - apklist.append({'versionCode': int(build.versionCode), - 'versionName': build.versionName, - 'buildproblem': "The build for this version was manually disabled. Reason: {0}".format(build.disable), - }) - else: - builtit = False - for apk in apklist: - if apk['versionCode'] == int(build.versionCode): - builtit = True - break - if not builtit: - buildfails = True - apklist.append({'versionCode': int(build.versionCode), - 'versionName': build.versionName, - 'buildproblem': "The build for this version appears to have failed. Check the [[{0}/lastbuild_{1}|build log]].".format(appid, build.versionCode), - }) - if app.get('CurrentVersionCode') == '0': - cantupdate = True - # Sort with most recent first... - apklist = sorted(apklist, key=lambda apk: apk['versionCode'], reverse=True) - - wikidata += "=Versions=\n" - if len(apklist) == 0: - wikidata += "We currently have no versions of this app available." - elif not gotcurrentver: - wikidata += "We don't have the current version of this app." - else: - wikidata += "We have the current version of this app." - wikidata += " (Check mode: " + app.UpdateCheckMode + ") " - wikidata += " (Auto-update mode: " + app.AutoUpdateMode + ")\n\n" - if len(app.NoSourceSince) > 0: - wikidata += "This application has partially or entirely been missing source code since version " + app.NoSourceSince + ".\n\n" - if len(app.CurrentVersion) > 0: - wikidata += "The current (recommended) version is " + app.CurrentVersion - wikidata += " (version code " + app.CurrentVersionCode + ").\n\n" - validapks = 0 - for apk in apklist: - wikidata += "==" + apk['versionName'] + "==\n" - - if 'buildproblem' in apk: - wikidata += "We can't build this version: " + apk['buildproblem'] + "\n\n" - else: - validapks += 1 - wikidata += "This version is built and signed by " - if 'srcname' in apk: - wikidata += "F-Droid, and guaranteed to correspond to the source tarball published with it.\n\n" - else: - wikidata += "the original developer.\n\n" - wikidata += "Version code: " + str(apk['versionCode']) + '\n' - - wikidata += '\n[[Category:' + wikicat + ']]\n' - if len(app.NoSourceSince) > 0: - wikidata += '\n[[Category:Apps missing source code]]\n' - if validapks == 0 and not app.Disabled: - wikidata += '\n[[Category:Apps with no packages]]\n' - if cantupdate and not app.Disabled: - wikidata += "\n[[Category:Apps we cannot update]]\n" - if buildfails and not app.Disabled: - wikidata += "\n[[Category:Apps with failing builds]]\n" - elif not gotcurrentver and not cantupdate and not app.Disabled and app.UpdateCheckMode != "Static": - wikidata += '\n[[Category:Apps to Update]]\n' - if app.Disabled: - wikidata += '\n[[Category:Apps that are disabled]]\n' - if app.UpdateCheckMode == 'None' and not app.Disabled: - wikidata += '\n[[Category:Apps with no update check]]\n' - for appcat in app.Categories: - wikidata += '\n[[Category:{0}]]\n'.format(appcat) - - # We can't have underscores in the page name, even if they're in - # the package ID, because MediaWiki messes with them... - pagename = appid.replace('_', ' ') - - # Drop a trailing newline, because mediawiki is going to drop it anyway - # and it we don't we'll think the page has changed when it hasn't... - if wikidata.endswith('\n'): - wikidata = wikidata[:-1] - - generated_pages[pagename] = wikidata - - # Make a redirect from the name to the ID too, unless there's - # already an existing page with the name and it isn't a redirect. - noclobber = False - for ch in '_{}:[]|': - apppagename = apppagename.replace(ch, ' ') - # Drop double spaces caused mostly by replacing ':' above - apppagename = apppagename.replace(' ', ' ') - for expagename in site.allpages(prefix=apppagename, - filterredir='nonredirects', - generator=False): - if expagename == apppagename: - noclobber = True - # Another reason not to make the redirect page is if the app name - # is the same as it's ID, because that will overwrite the real page - # with an redirect to itself! (Although it seems like an odd - # scenario this happens a lot, e.g. where there is metadata but no - # builds or binaries to extract a name from. - if apppagename == pagename: - noclobber = True - if not noclobber: - generated_redirects[apppagename] = "#REDIRECT [[" + pagename + "]]\n[[Category:" + wikiredircat + "]]" - - for tcat, genp in [(wikicat, generated_pages), - (wikiredircat, generated_redirects)]: - catpages = site.Pages['Category:' + tcat] - existingpages = [] - for page in catpages: - existingpages.append(page.name) - if page.name in genp: - pagetxt = page.text() - if pagetxt != genp[page.name]: - logging.debug("Updating modified page " + page.name) - page.save(genp[page.name], summary='Auto-updated') - else: - logging.debug("Page " + page.name + " is unchanged") - else: - logging.warning('Deleting page ' + page.name) - page.delete('No longer published') - for pagename, text in genp.items(): - logging.debug("Checking " + pagename) - if pagename not in existingpages: - logging.debug("Creating page " + pagename) - try: - newpage = site.Pages[pagename] - newpage.save(text, summary='Auto-created') - except Exception as e: - logging.error("...FAILED to create page '{0}': {1}".format(pagename, e)) - - # Purge server cache to ensure counts are up to date - site.Pages['Repository Maintenance'].purge() - - # Write a page with the last build log for this version code - wiki_page_path = 'update_' + time.strftime('%s', start_timestamp) - newpage = site.Pages[wiki_page_path] - txt = '' - txt += "* command line: " + ' '.join(sys.argv) + "\n" - txt += "* started at " + common.get_wiki_timestamp(start_timestamp) + '\n' - txt += "* completed at " + common.get_wiki_timestamp() + '\n' - txt += common.get_git_describe_link() - txt += "\n\n" - txt += common.get_android_tools_version_log() - newpage.save(txt, summary='Run log') - newpage = site.Pages['update'] - newpage.save('#REDIRECT [[' + wiki_page_path + ']]', summary='Update redirect') - - def delete_disabled_builds(apps, apkcache, repodirs): """Delete disabled build outputs. @@ -2503,10 +2273,6 @@ def main(): # Update known apks info... knownapks.writeifchanged() - # Update the wiki... - if options.wiki: - logging.warning(_('wiki support is deprecated and will be removed in the next release!')) - update_wiki(apps, apks + archapks) status_update_json(apps, apks + archapks) logging.info(_("Finished")) diff --git a/jenkins-build-all b/jenkins-build-all index ee6a9850..aa663fc5 100755 --- a/jenkins-build-all +++ b/jenkins-build-all @@ -83,17 +83,6 @@ fi echo "build_server_always: true" > config.yml echo "deploy_process_logs: true" >> config.yml -# if the local mediawiki is available, then use it -if nc -z -w1 localhost 32445; then - wikiflag="--wiki" - echo "wiki_protocol: http" >> config.yml - echo "wiki_server: localhost:32445" >> config.yml - echo "wiki_path: /mediawiki/" >> config.yml - echo "wiki_user: fdroid" >> config.yml - echo "wiki_password: update.TestCase" >> config.yml -else - sed -i '/^wiki_/d' config.yml -fi printf '\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\nbuild all with reproducible signatures\n' for f in metadata/*/signatures/*; do @@ -114,7 +103,7 @@ sed -Ei 's,^(\s+endtime\s*=\s*time\.time\(\))\s*.*,\1 + 6 * 60 * 60 # 6 hours,' $WORKSPACE/fdroidserver/build.py printf '\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\nbuild all\n' -$WORKSPACE/fdroid build --verbose --latest --no-tarball --all $wikiflag +$WORKSPACE/fdroid build --verbose --latest --no-tarball --all vagrant global-status if [ -d builder ]; then diff --git a/setup.py b/setup.py index dfb7ba7d..ae7ec2db 100755 --- a/setup.py +++ b/setup.py @@ -74,7 +74,6 @@ setup(name='fdroidserver', 'clint', 'defusedxml', 'GitPython', - 'mwclient', 'paramiko', 'Pillow', 'apache-libcloud >= 0.14.1', From 32d2330bb532614adadcbb39a05e0e5c5c877161 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 24 Nov 2021 18:02:01 +0100 Subject: [PATCH 0447/2116] Always write VM status Before this the status.json only contained VM information with fdroid build --wiki --server, after this a fdroid build --server is enough. --- fdroidserver/build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index e1ae293b..235be655 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -1260,7 +1260,7 @@ def main(): logging.info(ngettext("{} build failed", "{} builds failed", len(failed_builds)).format(len(failed_builds))) - if options.wiki: + if options.server: if os.cpu_count(): status_output['hostOsCpuCount'] = os.cpu_count() if os.path.isfile('/proc/meminfo') and os.access('/proc/meminfo', os.R_OK): From 36a7847525428fddfacf6632d440b6aeddf1e4f0 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 24 Nov 2021 18:04:51 +0100 Subject: [PATCH 0448/2116] Suppress --wiki in fdroid build This was already done for fdroid update in 00c2cc969. --- fdroidserver/build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 235be655..ec697398 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -934,7 +934,7 @@ def parse_commandline(): parser.add_argument("-a", "--all", action="store_true", default=False, help=_("Build all applications available")) parser.add_argument("-w", "--wiki", default=False, action="store_true", - help=_("Update the wiki")) + help=argparse.SUPPRESS) metadata.add_metadata_arguments(parser) options = parser.parse_args() metadata.warnings_action = options.W From ec194ef6e67245ead586711ccd35a9dde69b3e12 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Wed, 18 Aug 2021 17:09:55 +0000 Subject: [PATCH 0449/2116] Add AdultContent to allowed anti-features --- fdroidserver/metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 1cf5eb96..8c8b384c 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -446,7 +446,7 @@ valuetypes = { ["ArchivePolicy"]), FieldValidator("Anti-Feature", - r'^(Ads|Tracking|NonFreeNet|NonFreeDep|NonFreeAdd|UpstreamNonFree|NonFreeAssets|KnownVuln|ApplicationDebuggable|NoSourceSince)$', + r'^(Ads|Tracking|NonFreeNet|NonFreeDep|NonFreeAdd|UpstreamNonFree|NonFreeAssets|KnownVuln|ApplicationDebuggable|NoSourceSince|AdultContent)$', ["AntiFeatures"]), FieldValidator("Auto Update Mode", From 37794815191310bc389aad3a0831508a4bda1e55 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Thu, 26 Aug 2021 20:06:30 +0000 Subject: [PATCH 0450/2116] Renamed to NSFW as per https://gitlab.com/fdroid/admin/-/issues/252 --- fdroidserver/metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 8c8b384c..72737d41 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -446,7 +446,7 @@ valuetypes = { ["ArchivePolicy"]), FieldValidator("Anti-Feature", - r'^(Ads|Tracking|NonFreeNet|NonFreeDep|NonFreeAdd|UpstreamNonFree|NonFreeAssets|KnownVuln|ApplicationDebuggable|NoSourceSince|AdultContent)$', + r'^(Ads|Tracking|NonFreeNet|NonFreeDep|NonFreeAdd|UpstreamNonFree|NonFreeAssets|KnownVuln|ApplicationDebuggable|NoSourceSince|NSFW)$', ["AntiFeatures"]), FieldValidator("Auto Update Mode", From a5deaa80d8652f7159b4a127cc0edc780daff7af Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sat, 27 Nov 2021 21:21:09 +0100 Subject: [PATCH 0451/2116] Parse single digit sizes Closes: #946 --- fdroidserver/common.py | 2 +- tests/common.TestCase | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 5a92fba5..d83ac779 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -476,7 +476,7 @@ def parse_human_readable_size(size): raise ValueError(_('Could not parse size "{size}", wrong type "{type}"') .format(size=size, type=type(size))) s = size.lower().replace(' ', '') - m = re.match(r'^(?P[0-9][0-9.]+) *(?P' + r'|'.join(units.keys()) + r')$', s) + m = re.match(r'^(?P[0-9][0-9.]*) *(?P' + r'|'.join(units.keys()) + r')$', s) if not m: raise ValueError(_('Not a valid size definition: "{}"').format(size)) return int(float(m.group("value")) * units[m.group("unit")]) diff --git a/tests/common.TestCase b/tests/common.TestCase index ad6e1ea4..ca733398 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -73,6 +73,7 @@ class CommonTest(unittest.TestCase): ('59kb', 59000), ('343.1 mb', 343100000), ('99.9GiB', 107266808217), + ('1MB', 1000000), ): self.assertEqual(fdroidserver.common.parse_human_readable_size(k), v) for v in ((12, 123), '0xfff', [], None, '12,123', '123GG', '982374bb', self): From 9b0ef544bb51a53da9277c53334d8b8844601769 Mon Sep 17 00:00:00 2001 From: linsui Date: Sat, 27 Nov 2021 00:22:15 +0800 Subject: [PATCH 0452/2116] add ndk r23b --- fdroidserver/common.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index d83ac779..93893c1c 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4538,6 +4538,12 @@ NDKS = [ "revision": "23.0.7599858", "sha256": "e3eacf80016b91d4cd2c8ca9f34eebd32df912bb799c859cc5450b6b19277b4f", "url": "https://dl.google.com/android/repository/android-ndk-r23-linux.zip" + }, + { + "release": "r23b", + "revision": "23.1.7779620", + "sha256": "c6e97f9c8cfe5b7be0a9e6c15af8e7a179475b7ded23e2d1c1fa0945d6fb4382", + "url": "https://dl.google.com/android/repository/android-ndk-r23b-linux.zip" } ] From b236773455339b0e707f85545be7906956a2ae6d Mon Sep 17 00:00:00 2001 From: jugendhacker Date: Tue, 30 Nov 2021 08:28:17 +0000 Subject: [PATCH 0453/2116] Fix subproject regex to allow subdir without colon --- MANIFEST.in | 3 + fdroidserver/common.py | 2 +- tests/common.TestCase | 1 + .../app/build.gradle | 116 ++++++++++++++++++ .../settings.gradle | 1 + .../sosfilter/build.gradle | 31 +++++ 6 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 tests/source-files/org.noise_planet.noisecapture/app/build.gradle create mode 100644 tests/source-files/org.noise_planet.noisecapture/settings.gradle create mode 100644 tests/source-files/org.noise_planet.noisecapture/sosfilter/build.gradle diff --git a/MANIFEST.in b/MANIFEST.in index 9d3a7a36..ecb611c2 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -765,6 +765,9 @@ include tests/source-files/org.tasks/build.gradle include tests/source-files/org.tasks/build.gradle.kts include tests/source-files/org.tasks/buildSrc/build.gradle.kts include tests/source-files/org.tasks/settings.gradle.kts +include tests/source-files/org.noise_planet.noisecapture/app/build.gradle +include tests/source-files/org.noise_planet.noisecapture/settings.gradle +include tests/source-files/org.noise_planet.noisecapture/sosfilter/build.gradle include tests/source-files/osmandapp/osmand/build.gradle include tests/source-files/osmandapp/osmand/gradle/wrapper/gradle-wrapper.properties include tests/source-files/realm/react-native/android/build.gradle diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 93893c1c..87a64749 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -105,7 +105,7 @@ VALID_APPLICATION_ID_REGEX = re.compile(r'''(?:^[a-z_]+(?:\d*[a-zA-Z_]*)*)(?:\.[ ANDROID_PLUGIN_REGEX = re.compile(r'''\s*(:?apply plugin:|id)\(?\s*['"](android|com\.android\.application)['"]\s*\)?''') SETTINGS_GRADLE_REGEX = re.compile(r'settings\.gradle(?:\.kts)?') -GRADLE_SUBPROJECT_REGEX = re.compile(r'''['"]:([^'"]+)['"]''') +GRADLE_SUBPROJECT_REGEX = re.compile(r'''['"]:?([^'"]+)['"]''') MAX_VERSION_CODE = 0x7fffffff # Java's Integer.MAX_VALUE (2147483647) diff --git a/tests/common.TestCase b/tests/common.TestCase index ca733398..37f50219 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1310,6 +1310,7 @@ class CommonTest(unittest.TestCase): 'com.anpmech.launcher': 'app', 'org.tasks': 'app', 'ut.ewh.audiometrytest': 'app', + 'org.noise_planet.noisecapture': 'app', } for k, v in subdirs.items(): build_dir = Path('source-files') / k diff --git a/tests/source-files/org.noise_planet.noisecapture/app/build.gradle b/tests/source-files/org.noise_planet.noisecapture/app/build.gradle new file mode 100644 index 00000000..158712bd --- /dev/null +++ b/tests/source-files/org.noise_planet.noisecapture/app/build.gradle @@ -0,0 +1,116 @@ +apply plugin: 'com.android.application' + +def getCheckedOutGitCommitHash() { + 'git rev-parse --verify --short HEAD'.execute().text.trim() +} + +def getAvailableLocales() { + new File("app/src/main/res").list(new FilenameFilter() { + @Override + boolean accept(File dir, String name) { + return name.startsWith("values-") && new File(new File(dir,name), "strings.xml").exists(); + } + }).collect() { fold -> fold.substring("values-".length())}.join(",") +} + +android { + compileSdkVersion 30 + buildToolsVersion '30.0.0' + def signingFilePath = System.getProperty("user.home") + "/.idea/signing.gradle" + if (new File(signingFilePath).exists()) { + apply from: signingFilePath + } + defaultConfig { + applicationId "org.noise_planet.noisecapture" + minSdkVersion 15 + targetSdkVersion 30 + versionCode 55 + versionName "1.2.19" + // Store build date in apk + buildConfigField "long", "TIMESTAMP", System.currentTimeMillis() + "L" + buildConfigField "String", "GITHASH", "\"${getCheckedOutGitCommitHash().toString()}\"" + buildConfigField "String", "SUPPORTEDLOCALES", "\"${getAvailableLocales()}\"" + // Enabling multidex support. + multiDexEnabled false + + vectorDrawables.useSupportLibrary = true + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + dexOptions { + javaMaxHeapSize "4g" + } + lintOptions { + abortOnError false + disable 'MissingTranslation' + } + buildTypes { + release { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + if (new File(signingFilePath).exists()) { + signingConfig signingConfigs.release + } + } + debug { + debuggable true + if (new File(signingFilePath).exists()) { + signingConfig signingConfigs.debug + } + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } + testOptions { + unitTests { + includeAndroidResources = true + } + } +} + +// For using the MPAndroidChart package +// https://github.com/PhilJay/MPAndroidChart +// Apache License, Version 2.0 +task listrepos { + doLast { + println "Repositories:" + project.repositories.each { println "Name: " + it.name + "; url: " + it.url } + } +} + +repositories { + mavenLocal() +} + +dependencies { + implementation 'com.github.PhilJay:MPAndroidChart:v2.2.5' + implementation 'org.slf4j:slf4j-simple:1.7.12' + implementation name: 'org/noise-planet/jwarble/0.2.3/jwarble-0.2.3' + implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.10' + implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.10' + + // multithreaded FFT for realtime visualisation of spectrum only + implementation 'com.github.wendykierp:JTransforms:3.1' + implementation 'org.apache.commons:commons-math3:3.5' + implementation 'androidx.appcompat:appcompat:1.0.0' + implementation 'com.google.android.material:material:1.0.0' + implementation 'androidx.vectordrawable:vectordrawable:1.0.0' + implementation 'com.nhaarman.supertooltips:library:3.0.0' + //compile 'com.android.support:multidex:1.0.0' + // Testing-only dependencies + // Force usage of support annotations in the test app, since it is internally used by the runner module. + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + androidTestImplementation 'androidx.annotation:annotation:1.0.0' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test:rules:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' + // unit test + testImplementation group: 'org.robolectric', name: 'robolectric', version: '4.3.1' + testImplementation 'junit:junit:4.12' + testImplementation group: 'com.googlecode.soundlibs', name: 'jorbis', version: '0.0.17.4' + implementation project(':sosfilter') +} + diff --git a/tests/source-files/org.noise_planet.noisecapture/settings.gradle b/tests/source-files/org.noise_planet.noisecapture/settings.gradle new file mode 100644 index 00000000..3af2006a --- /dev/null +++ b/tests/source-files/org.noise_planet.noisecapture/settings.gradle @@ -0,0 +1 @@ +include 'sosfilter', 'app' diff --git a/tests/source-files/org.noise_planet.noisecapture/sosfilter/build.gradle b/tests/source-files/org.noise_planet.noisecapture/sosfilter/build.gradle new file mode 100644 index 00000000..ab7b0caa --- /dev/null +++ b/tests/source-files/org.noise_planet.noisecapture/sosfilter/build.gradle @@ -0,0 +1,31 @@ +apply plugin: 'java' +apply plugin: 'idea' +apply plugin: 'java' + +group = 'org.orbisgis' +version = '1.0-SNAPSHOT' + + +description = """Signal processing, A-weighting and third-octave bands filtering""" + +compileJava { + sourceCompatibility = 1.7 + targetCompatibility = 1.7 +} +repositories { + mavenCentral() +} + +dependencies { + compile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.12' + compile group: 'com.github.wendykierp', name: 'JTransforms', version:'3.1' + testCompile group: 'org.slf4j', name: 'slf4j-simple', version:'1.7.12' + testCompile group: 'junit', name: 'junit', version:'4.12' +} + +// Copy resource for unit tests +task copyTestResources(type: Copy) { + from "${projectDir}/src/test/resources" + into "${buildDir}/classes/test" +} +processTestResources.dependsOn copyTestResources From 2933880590c7a944aa44a454e5c80f34890398ad Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 1 Dec 2021 07:45:03 +0100 Subject: [PATCH 0454/2116] Raise exception if the given NDK was not found Seen in https://monitor.f-droid.org/builds/log/io.nekohasekai.sagernet/635#site-footer --- fdroidserver/common.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 87a64749..4a436e01 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4302,6 +4302,8 @@ def _install_ndk(ndk): url = ndkdict['url'] sha256 = ndkdict['sha256'] break + else: + raise FDroidException("NDK %s not found" % ndk) ndk_base = os.path.join(config['sdk_path'], 'ndk') logging.info(_('Downloading %s') % url) zipball = os.path.join( From 6db38f3904a7c1c7f61cda66f150b64a2e389316 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Fri, 3 Dec 2021 10:08:22 +0000 Subject: [PATCH 0455/2116] gradle v7.3.1 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 04c79015..594ba4f4 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -171,6 +171,7 @@ get_sha() { '7.1.1') echo 'bf8b869948901d422e9bb7d1fa61da6a6e19411baa7ad6ee929073df85d6365d' ;; '7.2') echo 'f581709a9c35e9cb92e16f585d2c4bc99b2b1a5f85d2badbd3dc6bff59e1e6dd' ;; '7.3') echo 'de8f52ad49bdc759164f72439a3bf56ddb1589c4cde802d3cec7d6ad0e0ee410' ;; + '7.3.1') echo '9afb3ca688fc12c761a0e9e4321e4d24e977a4a8916c8a768b1fe05ddb4d6b66' ;; *) exit 1 esac } @@ -191,7 +192,7 @@ d_plugin_k=(4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 d_plugin_v=(6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 3576d025fefc8385fd73380c490d4c464f0449bf Mon Sep 17 00:00:00 2001 From: Romain Lebbadi-Breteau Date: Sat, 4 Dec 2021 18:08:16 -0500 Subject: [PATCH 0456/2116] fix verify.py use sha256sum from common --- fdroidserver/verify.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/verify.py b/fdroidserver/verify.py index a8acb557..778a2137 100644 --- a/fdroidserver/verify.py +++ b/fdroidserver/verify.py @@ -133,7 +133,7 @@ def write_json_report(url, remote_apk, unsigned_apk, compare_result): d = hashabledict() output[key] = d d['file'] = filename - d['sha256'] = update.sha256sum(filename) + d['sha256'] = common.sha256sum(filename) d['timestamp'] = os.stat(filename).st_ctime d['packageName'], d['versionCode'], d['versionName'] = common.get_apk_id(filename) if compare_result: From b2eca0fc3b5b0071993b7bcdd92cde61a9a653f8 Mon Sep 17 00:00:00 2001 From: Romain Lebbadi-Breteau Date: Sat, 4 Dec 2021 18:26:26 -0500 Subject: [PATCH 0457/2116] remove useless import in verify.py --- fdroidserver/verify.py | 1 - 1 file changed, 1 deletion(-) diff --git a/fdroidserver/verify.py b/fdroidserver/verify.py index 778a2137..f2348cc0 100644 --- a/fdroidserver/verify.py +++ b/fdroidserver/verify.py @@ -28,7 +28,6 @@ from collections import OrderedDict from . import _ from . import common from . import net -from . import update from .exception import FDroidException options = None From 778e600269da771abbb96b760bdf526a54f0cd7e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 29 Nov 2021 12:13:09 +0100 Subject: [PATCH 0458/2116] gitlab-ci: enable pyjks in lint_mypy job now that it is in backports --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 41c5d045..c11f0bcc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -203,16 +203,16 @@ lint_format_safety_bandit_checks: lint_mypy: - image: debian:bullseye + image: debian:bullseye-backports <<: *apt-template script: - - sed -i '/pyjks/d' setup.py # TODO get from backports once available # use Debian packages to avoid building C/rust sources - apt-get install mypy python3-cryptography python3-pip python3-wheel + - apt-get install -t bullseye-backports python3-pyjks - pip install -e .[test] - mypy From 319bf47a6b4e3fda370b5e2471431d1c4cc8d2d7 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 29 Nov 2021 12:15:46 +0100 Subject: [PATCH 0459/2116] enable intel-android-extra-license on buildserver, it is DFSG-free It is a BSD-3-clause: https://gitlab.com/fdroid/android-sdk-transparency-log/-/blob/38f9564932deeee8ed66806e93e8fda4c19c172c/android/repository/addon.xml#L568 --- buildserver/provision-android-sdk | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/buildserver/provision-android-sdk b/buildserver/provision-android-sdk index 4814ca40..e8fa1834 100644 --- a/buildserver/provision-android-sdk +++ b/buildserver/provision-android-sdk @@ -117,6 +117,11 @@ cat < $ANDROID_HOME/licenses/android-sdk-preview-license-old 84831b9409646a918e30573bab4c9c91346d8abd EOF +cat < $ANDROID_HOME/licenses/intel-android-extra-license + +d975f751698a77b662f1254ddbeed3901e976f5a +EOF + echo y | $ANDROID_HOME/tools/bin/sdkmanager "extras;m2repository;com;android;support;constraint;constraint-layout;1.0.1" echo y | $ANDROID_HOME/tools/bin/sdkmanager "extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.1" echo y | $ANDROID_HOME/tools/bin/sdkmanager "extras;m2repository;com;android;support;constraint;constraint-layout;1.0.2" From c54f9ea4ca5044c03f0882b0ad58815e7d4ef3fa Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 29 Nov 2021 12:18:43 +0100 Subject: [PATCH 0460/2116] mirror: make _run_wget() return to the dir it started in This kind of function should not change the working environment, especially since so much of the fdroidserver code assumes the current working directory is the root of an fdroid repo. It is used in fdroidserver/mirror.py with absolute paths always, so it shouldn't change any existing use. I found this issue by using it in a plugin. --- fdroidserver/mirror.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fdroidserver/mirror.py b/fdroidserver/mirror.py index 3187a3d3..27603a85 100644 --- a/fdroidserver/mirror.py +++ b/fdroidserver/mirror.py @@ -27,6 +27,7 @@ def _run_wget(path, urls): if not urls: return logging.debug(_('Running wget in {path}').format(path=path)) + cwd = os.getcwd() os.makedirs(path, exist_ok=True) os.chdir(path) urls_file = '.fdroid-mirror-wget-input-file' @@ -43,6 +44,7 @@ def _run_wget(path, urls): ] ) os.remove(urls_file) + os.chdir(cwd) # leave the working env the way we found it def main(): From bd1f82fac51554fc7d3f700d5e696eb62df39b0d Mon Sep 17 00:00:00 2001 From: Sergey Zolotarev Date: Fri, 26 Nov 2021 19:43:26 +0600 Subject: [PATCH 0461/2116] Add console_scripts to create .exe file during installation on Windows --- setup.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ae7ec2db..afb3afc7 100755 --- a/setup.py +++ b/setup.py @@ -62,7 +62,10 @@ setup(name='fdroidserver', url='https://f-droid.org', license='AGPL-3.0', packages=['fdroidserver', 'fdroidserver.asynchronousfilereader'], - scripts=['fdroid', 'makebuildserver'], + scripts=['makebuildserver'], + entry_points={ + 'console_scripts': ['fdroid=fdroidserver.__main__:main'] + }, data_files=get_data_files(), python_requires='>=3.5', cmdclass={'versioncheck': VersionCheckCommand}, From c900d4a883399089084b9c1a5cbddd5d1df8e1c5 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 9 Dec 2021 12:06:53 +0100 Subject: [PATCH 0462/2116] remove 'fdroid' from MANIFEST.in --- MANIFEST.in | 1 - 1 file changed, 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index ecb611c2..cd31647d 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -18,7 +18,6 @@ include examples/makebuildserver.config.py include examples/opensc-fdroid.cfg include examples/public-read-only-s3-bucket-policy.json include examples/template.yml -include fdroid include gradlew-fdroid include LICENSE include locale/bo/LC_MESSAGES/fdroidserver.mo From 23a4135ccd88968c65b40661ec697db962c145e9 Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Tue, 7 Sep 2021 14:37:19 +0200 Subject: [PATCH 0463/2116] Compile translation files on install Solution based on https://stackoverflow.com/questions/40051076/compile-translation-files-when-calling-setup-py-install --- .gitlab-ci.yml | 8 ++++---- MANIFEST.in | 36 ++++++++++++++++++------------------ setup.py | 21 +++++++++++++++++++-- 3 files changed, 41 insertions(+), 24 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c11f0bcc..b8181d4d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -130,9 +130,9 @@ ubuntu_bionic_pip: # setup venv to act as release build machine - python -m venv sdist-env - . sdist-env/bin/activate - - ./setup.py compile_catalog sdist + - ./setup.py sdist - deactivate - - tar tzf dist/fdroidserver-*.tar.gz | grep locale/de/LC_MESSAGES/fdroidserver.mo + - tar tzf dist/fdroidserver-*.tar.gz # back to bare machine to act as user's install machine - $pip install --upgrade pip setuptools wheel # make this go away: "error: invalid command 'bdist_wheel'" - $pip install dist/fdroidserver-*.tar.gz @@ -141,7 +141,7 @@ ubuntu_bionic_pip: - fdroid=`which fdroid` ./tests/run-tests -# test install process on a bleeding edge distro with pip +# test installation process on a bleeding edge distro with pip arch_pip_install: image: archlinux only: @@ -272,7 +272,7 @@ fedora_latest: unzip wget which - - ./setup.py compile_catalog sdist + - ./setup.py sdist - useradd -m -c "test account" --password "fakepassword" testuser - su testuser --login --command "cd `pwd`; $pip install --user dist/fdroidserver-*.tar.gz" - test -e ~testuser/.local/share/locale/de/LC_MESSAGES/fdroidserver.mo diff --git a/MANIFEST.in b/MANIFEST.in index cd31647d..e15f9ecd 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -20,24 +20,24 @@ include examples/public-read-only-s3-bucket-policy.json include examples/template.yml include gradlew-fdroid include LICENSE -include locale/bo/LC_MESSAGES/fdroidserver.mo -include locale/de/LC_MESSAGES/fdroidserver.mo -include locale/es/LC_MESSAGES/fdroidserver.mo -include locale/fr/LC_MESSAGES/fdroidserver.mo -include locale/hu/LC_MESSAGES/fdroidserver.mo -include locale/it/LC_MESSAGES/fdroidserver.mo -include locale/ko/LC_MESSAGES/fdroidserver.mo -include locale/nb_NO/LC_MESSAGES/fdroidserver.mo -include locale/pl/LC_MESSAGES/fdroidserver.mo -include locale/pt/LC_MESSAGES/fdroidserver.mo -include locale/pt_BR/LC_MESSAGES/fdroidserver.mo -include locale/pt_PT/LC_MESSAGES/fdroidserver.mo -include locale/ru/LC_MESSAGES/fdroidserver.mo -include locale/sq/LC_MESSAGES/fdroidserver.mo -include locale/tr/LC_MESSAGES/fdroidserver.mo -include locale/uk/LC_MESSAGES/fdroidserver.mo -include locale/zh_Hans/LC_MESSAGES/fdroidserver.mo -include locale/zh_Hant/LC_MESSAGES/fdroidserver.mo +include locale/bo/LC_MESSAGES/fdroidserver.po +include locale/de/LC_MESSAGES/fdroidserver.po +include locale/es/LC_MESSAGES/fdroidserver.po +include locale/fr/LC_MESSAGES/fdroidserver.po +include locale/hu/LC_MESSAGES/fdroidserver.po +include locale/it/LC_MESSAGES/fdroidserver.po +include locale/ko/LC_MESSAGES/fdroidserver.po +include locale/nb_NO/LC_MESSAGES/fdroidserver.po +include locale/pl/LC_MESSAGES/fdroidserver.po +include locale/pt/LC_MESSAGES/fdroidserver.po +include locale/pt_BR/LC_MESSAGES/fdroidserver.po +include locale/pt_PT/LC_MESSAGES/fdroidserver.po +include locale/ru/LC_MESSAGES/fdroidserver.po +include locale/sq/LC_MESSAGES/fdroidserver.po +include locale/tr/LC_MESSAGES/fdroidserver.po +include locale/uk/LC_MESSAGES/fdroidserver.po +include locale/zh_Hans/LC_MESSAGES/fdroidserver.po +include locale/zh_Hant/LC_MESSAGES/fdroidserver.po include makebuildserver include README.md include tests/androguard_test.py diff --git a/setup.py b/setup.py index afb3afc7..b0274361 100755 --- a/setup.py +++ b/setup.py @@ -7,6 +7,8 @@ import re import subprocess import sys +from setuptools.command.install import install + class VersionCheckCommand(Command): """Make sure git tag and version match before uploading""" @@ -28,6 +30,17 @@ class VersionCheckCommand(Command): print('Upload using: twine upload --sign dist/fdroidserver-%s.tar.gz' % version) +class InstallWithCompile(install): + def run(self): + from babel.messages.frontend import compile_catalog + compiler = compile_catalog(self.distribution) + option_dict = self.distribution.get_option_dict('compile_catalog') + compiler.domain = [option_dict['domain'][1]] + compiler.directory = option_dict['directory'][1] + compiler.run() + super().run() + + def get_data_files(): # workaround issue on OSX or --user installs, where sys.prefix is not an installable location if os.access(sys.prefix, os.W_OK | os.X_OK): @@ -43,7 +56,8 @@ def get_data_files(): ['buildserver/config.buildserver.yml', ] + re.findall(r'include (examples/.*)', data))) - for f in re.findall(r'include (locale/[a-z][a-z][a-zA-Z_]*/LC_MESSAGES/fdroidserver.mo)', data): + for f in re.findall(r'include (locale/[a-z][a-z][a-zA-Z_]*/LC_MESSAGES/fdroidserver\.)po', data): + f += 'mo' d = os.path.join(data_prefix, 'share', os.path.dirname(f)) data_files.append((d, [f, ])) return data_files @@ -68,7 +82,10 @@ setup(name='fdroidserver', }, data_files=get_data_files(), python_requires='>=3.5', - cmdclass={'versioncheck': VersionCheckCommand}, + cmdclass={ + 'versioncheck': VersionCheckCommand, + 'install': InstallWithCompile, + }, setup_requires=[ 'babel', ], From 565d9e49949789b4e5060234011070b032e1d142 Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Thu, 16 Dec 2021 20:34:38 +0100 Subject: [PATCH 0464/2116] Format setup.py with Black --- .gitlab-ci.yml | 1 + setup.py | 160 ++++++++++++++++++++++++++----------------------- 2 files changed, 86 insertions(+), 75 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b8181d4d..50927c6a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -233,6 +233,7 @@ black: fdroidserver/readmeta.py fdroidserver/signindex.py fdroidserver/tail.py + setup.py tests/build.TestCase tests/deploy.TestCase tests/exception.TestCase diff --git a/setup.py b/setup.py index b0274361..61d66657 100755 --- a/setup.py +++ b/setup.py @@ -1,17 +1,18 @@ #!/usr/bin/env python3 -from setuptools import Command -from setuptools import setup import os import re import subprocess import sys +from setuptools import Command +from setuptools import setup from setuptools.command.install import install class VersionCheckCommand(Command): """Make sure git tag and version match before uploading""" + user_options = [] def initialize_options(self): @@ -22,10 +23,16 @@ class VersionCheckCommand(Command): def run(self): version = self.distribution.get_version() - version_git = subprocess.check_output(['git', 'describe', '--tags', '--always']).rstrip().decode('utf-8') + version_git = ( + subprocess.check_output(['git', 'describe', '--tags', '--always']) + .rstrip() + .decode('utf-8') + ) if version != version_git: - print('ERROR: Release version mismatch! setup.py (%s) does not match git (%s)' - % (version, version_git)) + print( + 'ERROR: Release version mismatch! setup.py (%s) does not match git (%s)' + % (version, version_git) + ) sys.exit(1) print('Upload using: twine upload --sign dist/fdroidserver-%s.tar.gz' % version) @@ -33,6 +40,7 @@ class VersionCheckCommand(Command): class InstallWithCompile(install): def run(self): from babel.messages.frontend import compile_catalog + compiler = compile_catalog(self.distribution) option_dict = self.distribution.get_option_dict('compile_catalog') compiler.domain = [option_dict['domain'][1]] @@ -52,82 +60,84 @@ def get_data_files(): with open('MANIFEST.in') as fp: data = fp.read() - data_files.append((data_prefix + '/share/doc/fdroidserver/examples', - ['buildserver/config.buildserver.yml', ] - + re.findall(r'include (examples/.*)', data))) + data_files.append( + ( + data_prefix + '/share/doc/fdroidserver/examples', + ['buildserver/config.buildserver.yml'] + + re.findall(r'include (examples/.*)', data), + ) + ) - for f in re.findall(r'include (locale/[a-z][a-z][a-zA-Z_]*/LC_MESSAGES/fdroidserver\.)po', data): + for f in re.findall( + r'include (locale/[a-z][a-z][a-zA-Z_]*/LC_MESSAGES/fdroidserver\.)po', data + ): f += 'mo' d = os.path.join(data_prefix, 'share', os.path.dirname(f)) - data_files.append((d, [f, ])) + data_files.append((d, [f])) return data_files with open("README.md", "r") as fh: long_description = fh.read() -setup(name='fdroidserver', - version='2.1a0', - description='F-Droid Server Tools', - long_description=long_description, - long_description_content_type='text/markdown', - author='The F-Droid Project', - author_email='team@f-droid.org', - url='https://f-droid.org', - license='AGPL-3.0', - packages=['fdroidserver', 'fdroidserver.asynchronousfilereader'], - scripts=['makebuildserver'], - entry_points={ - 'console_scripts': ['fdroid=fdroidserver.__main__:main'] - }, - data_files=get_data_files(), - python_requires='>=3.5', - cmdclass={ - 'versioncheck': VersionCheckCommand, - 'install': InstallWithCompile, - }, - setup_requires=[ - 'babel', - ], - install_requires=[ - 'androguard >= 3.1.0rc2, != 3.3.0, != 3.3.1, != 3.3.2', - 'clint', - 'defusedxml', - 'GitPython', - 'paramiko', - 'Pillow', - 'apache-libcloud >= 0.14.1', - 'pyasn1 >=0.4.1, < 0.5.0', - 'pyasn1-modules >= 0.2.1, < 0.3', - 'python-vagrant', - 'PyYAML', - 'qrcode', - 'ruamel.yaml >= 0.15', - 'requests >= 2.5.2, != 2.11.0, != 2.12.2, != 2.18.0', - 'yamllint', - ], - extras_require={ - 'test': [ - 'pyjks', - 'html5print' - ], - 'docs': [ - 'sphinx', - 'numpydoc', - 'pydata_sphinx_theme', - 'pydocstyle', - ] - }, - classifiers=[ - 'Development Status :: 4 - Beta', - 'Intended Audience :: Developers', - 'Intended Audience :: Information Technology', - 'Intended Audience :: System Administrators', - 'Intended Audience :: Telecommunications Industry', - 'License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)', - 'Operating System :: POSIX', - 'Operating System :: MacOS :: MacOS X', - 'Operating System :: Unix', - 'Topic :: Utilities', - ], - ) +setup( + name='fdroidserver', + version='2.1a0', + description='F-Droid Server Tools', + long_description=long_description, + long_description_content_type='text/markdown', + author='The F-Droid Project', + author_email='team@f-droid.org', + url='https://f-droid.org', + license='AGPL-3.0', + packages=['fdroidserver', 'fdroidserver.asynchronousfilereader'], + scripts=['makebuildserver'], + entry_points={'console_scripts': ['fdroid=fdroidserver.__main__:main']}, + data_files=get_data_files(), + python_requires='>=3.5', + cmdclass={ + 'versioncheck': VersionCheckCommand, + 'install': InstallWithCompile, + }, + setup_requires=[ + 'babel', + ], + install_requires=[ + 'androguard >= 3.1.0rc2, != 3.3.0, != 3.3.1, != 3.3.2', + 'clint', + 'defusedxml', + 'GitPython', + 'paramiko', + 'Pillow', + 'apache-libcloud >= 0.14.1', + 'pyasn1 >=0.4.1, < 0.5.0', + 'pyasn1-modules >= 0.2.1, < 0.3', + 'python-vagrant', + 'PyYAML', + 'qrcode', + 'ruamel.yaml >= 0.15', + 'requests >= 2.5.2, != 2.11.0, != 2.12.2, != 2.18.0', + 'yamllint', + ], + extras_require={ + 'test': ['pyjks', 'html5print'], + 'docs': [ + 'sphinx', + 'numpydoc', + 'pydata_sphinx_theme', + 'pydocstyle', + ], + }, + classifiers=[ + 'Development Status :: 4 - Beta', + 'Intended Audience :: Developers', + 'Intended Audience :: Information Technology', + 'Intended Audience :: System Administrators', + 'Intended Audience :: Telecommunications Industry', + 'License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)', + 'Operating System :: POSIX', + 'Operating System :: MacOS :: MacOS X', + 'Operating System :: Unix', + 'Topic :: Utilities', + ], +) From 1bf39d46e27ae0da07c7e01ce753bd11359d08d6 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Thu, 16 Dec 2021 21:56:33 +0000 Subject: [PATCH 0465/2116] gradle v7.3.2 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 594ba4f4..7e6d009e 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -172,6 +172,7 @@ get_sha() { '7.2') echo 'f581709a9c35e9cb92e16f585d2c4bc99b2b1a5f85d2badbd3dc6bff59e1e6dd' ;; '7.3') echo 'de8f52ad49bdc759164f72439a3bf56ddb1589c4cde802d3cec7d6ad0e0ee410' ;; '7.3.1') echo '9afb3ca688fc12c761a0e9e4321e4d24e977a4a8916c8a768b1fe05ddb4d6b66' ;; + '7.3.2') echo '23b89f8eac363f5f4b8336e0530c7295c55b728a9caa5268fdd4a532610d5392' ;; *) exit 1 esac } @@ -192,7 +193,7 @@ d_plugin_k=(4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 d_plugin_v=(6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 56740af3ef391bb02d45f8afa31a43d459cbf78a Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Thu, 23 Dec 2021 22:14:18 +0000 Subject: [PATCH 0466/2116] gradle v7.3.3 --- gradlew-fdroid | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 7e6d009e..cbd7ec74 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -164,6 +164,7 @@ get_sha() { '6.8.3') echo '7faa7198769f872826c8ef4f1450f839ec27f0b4d5d1e51bade63667cbccd205' ;; '6.9') echo '765442b8069c6bee2ea70713861c027587591c6b1df2c857a23361512560894e' ;; '6.9.1') echo '8c12154228a502b784f451179846e518733cf856efc7d45b2e6691012977b2fe' ;; + '6.9.2') echo '8b356fd8702d5ffa2e066ed0be45a023a779bba4dd1a68fd11bc2a6bdc981e8f' ;; '7.0') echo 'eb8b89184261025b0430f5b2233701ff1377f96da1ef5e278af6ae8bac5cc305' ;; '7.0.1') echo 'dccda8aa069563c8ba2f6cdfd0777df0e34a5b4d15138ca8b9757e94f4e8a8cb' ;; '7.0.2') echo '0e46229820205440b48a5501122002842b82886e76af35f0f3a069243dca4b3c' ;; @@ -173,6 +174,7 @@ get_sha() { '7.3') echo 'de8f52ad49bdc759164f72439a3bf56ddb1589c4cde802d3cec7d6ad0e0ee410' ;; '7.3.1') echo '9afb3ca688fc12c761a0e9e4321e4d24e977a4a8916c8a768b1fe05ddb4d6b66' ;; '7.3.2') echo '23b89f8eac363f5f4b8336e0530c7295c55b728a9caa5268fdd4a532610d5392' ;; + '7.3.3') echo 'b586e04868a22fd817c8971330fec37e298f3242eb85c374181b12d637f80302' ;; *) exit 1 esac } @@ -193,7 +195,7 @@ d_plugin_k=(4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 d_plugin_v=(6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 460dffe82bdd2fd6c2b0ef5c0c849f455b9ed0f9 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 30 Dec 2021 10:00:46 +0100 Subject: [PATCH 0467/2116] Don't open second MR for gradle (Closes: #914) Traceback (most recent call last): File "/builds/fdroid/fdroidserver/./tests/gradle-release-checksums.py", line 130, in mr = project.mergerequests.create({ File "/usr/lib/python3/dist-packages/gitlab/exceptions.py", line 281, in wrapped_f raise error(e.error_message, e.response_code, e.response_body) from e gitlab.exceptions.GitlabCreateError: 409: ['Another open merge request already exists for this source branch: !1064'] --- tests/gradle-release-checksums.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/tests/gradle-release-checksums.py b/tests/gradle-release-checksums.py index 35b2d99f..ba787d81 100755 --- a/tests/gradle-release-checksums.py +++ b/tests/gradle-release-checksums.py @@ -127,13 +127,16 @@ if git_repo.is_dirty() and ('gradlew-fdroid' in modified or 'makebuildserver' in '\n\n
    ' % (os.getenv('CI_PROJECT_URL'), os.getenv('CI_JOB_ID'), os.getenv('CI_JOB_ID')) ) - mr = project.mergerequests.create({ - 'source_branch': branch.name, - 'target_project_id': 36527, # fdroid/fdroidserver - 'target_branch': 'master', - 'title': 'update to gradle v' + version, - 'description': description, - 'labels': ['fdroid-bot', 'gradle'], - 'remove_source_branch': True, - }) - mr.save() + try: + mr = project.mergerequests.create({ + 'source_branch': branch.name, + 'target_project_id': 36527, # fdroid/fdroidserver + 'target_branch': 'master', + 'title': 'update to gradle v' + version, + 'description': description, + 'labels': ['fdroid-bot', 'gradle'], + 'remove_source_branch': True, + }) + mr.save() + except gitlab.exceptions.GitlabCreateError as e: + print(e.error_message) From be7e59e71ae2bb9fd6a80585d154c92b04695b57 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 30 Dec 2021 10:36:10 +0100 Subject: [PATCH 0468/2116] Add typing information for mypy --- fdroidserver/apksigcopier.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fdroidserver/apksigcopier.py b/fdroidserver/apksigcopier.py index d658d570..122f8302 100644 --- a/fdroidserver/apksigcopier.py +++ b/fdroidserver/apksigcopier.py @@ -59,6 +59,7 @@ import zipfile import zlib from collections import namedtuple +from typing import Dict, Tuple, Union __version__ = "0.4.0" NAME = "apksigcopier" @@ -95,7 +96,7 @@ class ZipError(APKSigCopierError): class ReproducibleZipInfo(zipfile.ZipInfo): """Reproducible ZipInfo hack.""" - _override = {} + _override = {} # type: Dict[str, Union[int, Tuple[int, ...]]] def __init__(self, zinfo, **override): if override: From b73663967bd0c24da555be0165c541a6d7fe10ff Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 30 Dec 2021 19:42:18 +0100 Subject: [PATCH 0469/2116] Only ignore opening a second MR --- tests/gradle-release-checksums.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/gradle-release-checksums.py b/tests/gradle-release-checksums.py index ba787d81..1fca803c 100755 --- a/tests/gradle-release-checksums.py +++ b/tests/gradle-release-checksums.py @@ -139,4 +139,7 @@ if git_repo.is_dirty() and ('gradlew-fdroid' in modified or 'makebuildserver' in }) mr.save() except gitlab.exceptions.GitlabCreateError as e: - print(e.error_message) + if e.response_code == 409: # Another open merge request already exists for this source branch + print(e.error_message) + else: + raise e From 57447f18e16cf750e1a30836263494be9735b1b5 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 15 Dec 2021 14:43:14 +0100 Subject: [PATCH 0470/2116] buildserver: move buildserverid to provisioner In order to support Docker, this should be able to operate without ssh, e.g. using vagrant-communicator-docker. This removes the buildserverid hack and makes it a provisioner shell script. --- buildserver/Vagrantfile | 2 ++ buildserver/provision-buildserverid | 9 +++++++++ makebuildserver | 9 --------- 3 files changed, 11 insertions(+), 9 deletions(-) create mode 100644 buildserver/provision-buildserverid diff --git a/buildserver/Vagrantfile b/buildserver/Vagrantfile index 16bc2305..90d459b7 100644 --- a/buildserver/Vagrantfile +++ b/buildserver/Vagrantfile @@ -86,5 +86,7 @@ Vagrant.configure("2") do |config| config.vm.provision "shell", path: "provision-android-ndk", args: ["/opt/android-sdk/ndk", "r21e", "r22b"] config.vm.provision "shell", path: "provision-gradle" + config.vm.provision "shell", path: "provision-buildserverid", + args: [`git rev-parse HEAD`] end diff --git a/buildserver/provision-buildserverid b/buildserver/provision-buildserverid new file mode 100644 index 00000000..f5010c39 --- /dev/null +++ b/buildserver/provision-buildserverid @@ -0,0 +1,9 @@ +#!/bin/bash -e + +test -n "$1" + +echo "Writing buildserver ID ...ID is $1" +set -x +echo "$1" > /home/vagrant/buildserverid +# sync data before we halt() the machine, we had an empty buildserverid otherwise +sync diff --git a/makebuildserver b/makebuildserver index daafd4d4..24fe201a 100755 --- a/makebuildserver +++ b/makebuildserver @@ -584,15 +584,6 @@ def main(): run_via_vagrant_ssh(v, ['rm', '-f', '~/.gradle/caches/modules-2/modules-2.lock']) run_via_vagrant_ssh(v, ['rm', '-fr', '~/.gradle/caches/*/plugin-resolution/']) - p = subprocess.Popen(['git', 'rev-parse', 'HEAD'], stdout=subprocess.PIPE, - universal_newlines=True) - buildserverid = p.communicate()[0].strip() - logging.info("Writing buildserver ID ...ID is %s", buildserverid) - # sync data before we halt() the machine, we had an empty buildserverid otherwise - write_bsid_cmd = 'sh -c "echo \'{}\' >/home/vagrant/buildserverid; sync"'.format(buildserverid) - run_via_vagrant_ssh(v, write_bsid_cmd) - logging.debug("+ {}".format(write_bsid_cmd)) - logging.info("Stopping build server VM") v.halt() From 4e310e3a59485721fb3f49936e17b9d42731c0cf Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 23 Dec 2021 21:38:34 +0100 Subject: [PATCH 0471/2116] buildserver: setup-env-vars: add var for ~vagrant for CI jobs The CI jobs need to do a little setup based on the 'vagrant' user's $HOME. --- buildserver/setup-env-vars | 2 ++ 1 file changed, 2 insertions(+) diff --git a/buildserver/setup-env-vars b/buildserver/setup-env-vars index a4d96781..a5f53fd8 100644 --- a/buildserver/setup-env-vars +++ b/buildserver/setup-env-vars @@ -12,6 +12,8 @@ echo "# generated on "`date` > $bsenv echo export ANDROID_HOME=$1 >> $bsenv echo 'export PATH=$PATH:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:/opt/gradle/bin' >> $bsenv echo "export DEBIAN_FRONTEND=noninteractive" >> $bsenv +echo 'export home_vagrant=/home/vagrant' >> $bsenv +echo 'export fdroidserver=$home_vagrant/fdroidserver' >> $bsenv chmod 0644 $bsenv From f20d3d249a682300118d0396877ea745cc7d9663 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 10 Jan 2022 14:33:35 +0100 Subject: [PATCH 0472/2116] add Dockerfile to build a docker buildserver image This is just the first step to getting full Docker support for everywhere the buildserver is used. This will at least let us replace the hacks that are separately maintained in fdroid/ci-images-base and fdroid/ci-images-client. --- buildserver/Dockerfile | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 buildserver/Dockerfile diff --git a/buildserver/Dockerfile b/buildserver/Dockerfile new file mode 100644 index 00000000..5b83563f --- /dev/null +++ b/buildserver/Dockerfile @@ -0,0 +1,32 @@ + +FROM debian:stretch + +ENV LANG=C.UTF-8 \ + DEBIAN_FRONTEND=noninteractive + +RUN echo Etc/UTC > /etc/timezone \ + && echo 'APT::Install-Recommends "0";' \ + 'APT::Install-Suggests "0";' \ + 'APT::Acquire::Retries "20";' \ + 'APT::Get::Assume-Yes "true";' \ + 'Dpkg::Use-Pty "0";' \ + 'quiet "1";' \ + >> /etc/apt/apt.conf.d/99gitlab + +# setup 'vagrant' user for compatibility +RUN useradd --create-home -s /bin/bash vagrant && echo -n 'vagrant:vagrant' | chpasswd + +RUN printf "path-exclude=/usr/share/locale/*\npath-exclude=/usr/share/man/*\npath-exclude=/usr/share/doc/*\npath-include=/usr/share/doc/*/copyright\n" >/etc/dpkg/dpkg.cfg.d/01_nodoc \ + && mkdir -p /usr/share/man/man1 \ + && apt-get update \ + && apt-get upgrade \ + && apt-get dist-upgrade \ + && apt-get install sudo \ + && apt-get autoremove --purge \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Vagrant sudo setup for compatibility +RUN echo 'vagrant ALL = NOPASSWD: ALL' > /etc/sudoers.d/vagrant \ + && chmod 440 /etc/sudoers.d/vagrant \ + && sed -i -e 's/Defaults.*requiretty/#&/' /etc/sudoers From 839f5b109af12005f76127f37fa5b0d8968bc3a9 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 2 Dec 2021 16:17:11 +0100 Subject: [PATCH 0473/2116] gitlab-ci: publish buildserver image to Docker Registry --- .gitlab-ci.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 50927c6a..3a44d413 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -529,3 +529,25 @@ pages: needs: ["Build documentation"] rules: - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' # only publish pages on default (master) branch + + +docker: + dependencies: + - fdroid build + only: + changes: + - .gitlab-ci.yml + - makebuildserver + - buildserver/* + image: docker:git + services: + - docker:dind + variables: + TEST_IMAGE: registry.gitlab.com/$CI_PROJECT_NAMESPACE/${CI_PROJECT_NAME}:$CI_BUILD_REF_NAME + RELEASE_IMAGE: registry.gitlab.com/$CI_PROJECT_NAMESPACE/${CI_PROJECT_NAME}:buildserver + script: + - cd buildserver + - docker build -t $TEST_IMAGE --build-arg GIT_REV_PARSE_HEAD=$(git rev-parse HEAD) . + - docker tag $TEST_IMAGE $RELEASE_IMAGE + - echo $CI_BUILD_TOKEN | docker login -u gitlab-ci-token --password-stdin registry.gitlab.com + - docker push $RELEASE_IMAGE From 7535d75b4086702d44514d4fe7e9b291d4d53d74 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 10 Jan 2022 15:17:07 +0100 Subject: [PATCH 0474/2116] buildserver: run provision scripts in Dockerfile fdroidserver#119 --- buildserver/Dockerfile | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/buildserver/Dockerfile b/buildserver/Dockerfile index 5b83563f..1a7005e1 100644 --- a/buildserver/Dockerfile +++ b/buildserver/Dockerfile @@ -13,15 +13,40 @@ RUN echo Etc/UTC > /etc/timezone \ 'quiet "1";' \ >> /etc/apt/apt.conf.d/99gitlab +# provision-apt-proxy was deliberately omitted, its not relevant in Docker +COPY provision-android-ndk \ + provision-android-sdk \ + provision-apt-get-install \ + provision-buildserverid \ + provision-gradle \ + setup-env-vars \ + /opt/buildserver/ + +ARG GIT_REV_PARSE_HEAD=unspecified +LABEL org.opencontainers.image.revision=$GIT_REV_PARSE_HEAD + # setup 'vagrant' user for compatibility RUN useradd --create-home -s /bin/bash vagrant && echo -n 'vagrant:vagrant' | chpasswd +# the provision scripts must be run in the same order as in Vagrantfile RUN printf "path-exclude=/usr/share/locale/*\npath-exclude=/usr/share/man/*\npath-exclude=/usr/share/doc/*\npath-include=/usr/share/doc/*/copyright\n" >/etc/dpkg/dpkg.cfg.d/01_nodoc \ && mkdir -p /usr/share/man/man1 \ && apt-get update \ && apt-get upgrade \ && apt-get dist-upgrade \ && apt-get install sudo \ + && bash /opt/buildserver/setup-env-vars /opt/android-sdk \ + && . /etc/profile.d/bsenv.sh \ + && bash /opt/buildserver/provision-apt-get-install https://deb.debian.org/debian \ + && tools=tools_r25.2.5-linux.zip \ + && mkdir -p /vagrant/cache \ + && curl https://dl.google.com/android/repository/$tools > /vagrant/cache/$tools \ + && echo "577516819c8b5fae680f049d39014ff1ba4af870b687cab10595783e6f22d33e /vagrant/cache/$tools" | sha256sum -c \ + && bash /opt/buildserver/provision-android-sdk \ + && bash /opt/buildserver/provision-android-ndk /opt/android-sdk/ndk \ + && bash /opt/buildserver/provision-gradle \ + && bash /opt/buildserver/provision-buildserverid $GIT_REV_PARSE_HEAD \ + && rm -rf /vagrant/cache \ && apt-get autoremove --purge \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* From 55140003768315e98906b81ca9419291e8dac8de Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 10 Jan 2022 17:29:17 +0100 Subject: [PATCH 0475/2116] buildserver: include packages in Dockerfile that Vagrant boxes have The goal is to have the Docker base image and the Vagrant base box have the same setup. --- buildserver/Dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/buildserver/Dockerfile b/buildserver/Dockerfile index 1a7005e1..0d968a07 100644 --- a/buildserver/Dockerfile +++ b/buildserver/Dockerfile @@ -29,12 +29,14 @@ LABEL org.opencontainers.image.revision=$GIT_REV_PARSE_HEAD RUN useradd --create-home -s /bin/bash vagrant && echo -n 'vagrant:vagrant' | chpasswd # the provision scripts must be run in the same order as in Vagrantfile +# - vagrant needs openssh-client iproute2 ssh sudo +# - ansible needs python3 RUN printf "path-exclude=/usr/share/locale/*\npath-exclude=/usr/share/man/*\npath-exclude=/usr/share/doc/*\npath-include=/usr/share/doc/*/copyright\n" >/etc/dpkg/dpkg.cfg.d/01_nodoc \ && mkdir -p /usr/share/man/man1 \ && apt-get update \ && apt-get upgrade \ && apt-get dist-upgrade \ - && apt-get install sudo \ + && apt-get install openssh-client iproute2 python3 openssh-server sudo \ && bash /opt/buildserver/setup-env-vars /opt/android-sdk \ && . /etc/profile.d/bsenv.sh \ && bash /opt/buildserver/provision-apt-get-install https://deb.debian.org/debian \ From 97553c516fd18d7c5d457faebd42251305bb7f61 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 10 Jan 2022 22:49:30 +0100 Subject: [PATCH 0476/2116] provision-android-ndk: let script work when no NDKs will be installed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The other form of find gave: # find $NDK_BASE -type f -executable -print0 | xargs -0 chmod a+x chmod: missing operand after ‘a+x’ Try 'chmod --help' for more information. --- buildserver/provision-android-ndk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildserver/provision-android-ndk b/buildserver/provision-android-ndk index 9672b309..ca2cc325 100644 --- a/buildserver/provision-android-ndk +++ b/buildserver/provision-android-ndk @@ -27,4 +27,4 @@ chmod g+w $NDK_BASE # ensure all users can read and execute the NDK chmod -R a+rX $NDK_BASE/ -find $NDK_BASE/ -type f -executable -print0 | xargs -0 chmod a+x +find $NDK_BASE/ -type f -executable -exec chmod a+x -- {} + From 5d09e70330015bda80e9dc6f2a51812e22cb9994 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 23 Dec 2021 21:39:29 +0100 Subject: [PATCH 0477/2116] buildserver: give names to all provisioners --- buildserver/Vagrantfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/buildserver/Vagrantfile b/buildserver/Vagrantfile index 90d459b7..140e800a 100644 --- a/buildserver/Vagrantfile +++ b/buildserver/Vagrantfile @@ -78,15 +78,15 @@ Vagrant.configure("2") do |config| owner: 'root', group: 'root', create: true end - config.vm.provision "shell", path: "setup-env-vars", + config.vm.provision "shell", name: "setup-env-vars", path: "setup-env-vars", args: ["/opt/android-sdk"] - config.vm.provision "shell", path: "provision-apt-get-install", + config.vm.provision "shell", name: "apt-get-install", path: "provision-apt-get-install", args: [configfile['debian_mirror']] - config.vm.provision "shell", path: "provision-android-sdk" - config.vm.provision "shell", path: "provision-android-ndk", + config.vm.provision "shell", name: "android-sdk", path: "provision-android-sdk" + config.vm.provision "shell", name: "android-ndk", path: "provision-android-ndk", args: ["/opt/android-sdk/ndk", "r21e", "r22b"] - config.vm.provision "shell", path: "provision-gradle" - config.vm.provision "shell", path: "provision-buildserverid", + config.vm.provision "shell", name: "gradle", path: "provision-gradle" + config.vm.provision "shell", name: "buildserverid", path: "provision-buildserverid", args: [`git rev-parse HEAD`] end From ca5ebcb30f0cd23800e1f5fa960e1410be116665 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 23 Dec 2021 21:39:29 +0100 Subject: [PATCH 0478/2116] gitlab-ci: fix plugin_fetchsrclibs by using Debian packages * https://gitlab.com/eighthave/fdroidserver/-/jobs/1961701458 Collecting pynacl>=1.0.1 (from paramiko->fdroidserver==2.1a0) Downloading https://files.pythonhosted.org/packages/a7/22/27582568be639dfe22ddb3902225f91f2f17ceff88ce80e4db396c8986da/PyNaCl-1.5.0.tar.gz (3.4MB) Installing build dependencies: started Installing build dependencies: finished with status 'error' Complete output from command /builds/eighthave/fdroidserver/env/bin/python3 -m pip install --ignore-installed --no-user --prefix /tmp/pip-build-env-xokvr6uk --no-warn-script-location --no-binary :none: --only-binary :none: -i https://pypi.org/simple -- setuptools>=40.8.0 wheel "cffi>=1.4.1; python_implementation != 'PyPy'": Collecting setuptools>=40.8.0 Using cached https://files.pythonhosted.org/packages/eb/53/0dd4c7960579da8be13fa9b2c2591643d37f323e3d79f8bc8b1b6c8e6217/setuptools-60.5.0-py3-none-any.whl Collecting wheel Using cached https://files.pythonhosted.org/packages/27/d6/003e593296a85fd6ed616ed962795b2f87709c3eee2bca4f6d0fe55c6d00/wheel-0.37.1-py2.py3-none-any.whl Collecting cffi>=1.4.1 Downloading https://files.pythonhosted.org/packages/00/9e/92de7e1217ccc3d5f352ba21e52398372525765b2e0c4530e6eb2ba9282a/cffi-1.15.0.tar.gz (484kB) Collecting pycparser (from cffi>=1.4.1) Downloading https://files.pythonhosted.org/packages/62/d5/5f610ebe421e85889f2e55e33b7f9a6795bd982198517d912eb1c76e1a53/pycparser-2.21-py2.py3-none-any.whl (118kB) Building wheels for collected packages: cffi Running setup.py bdist_wheel for cffi: started Running setup.py bdist_wheel for cffi: finished with status 'error' Complete output from command /builds/eighthave/fdroidserver/env/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-djg9jc8p/cffi/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" bdist_wheel -d /tmp/pip-wheel-d1knhl7l --python-tag cp37: unable to execute 'x86_64-linux-gnu-gcc': No such file or directory unable to execute 'x86_64-linux-gnu-gcc': No such file or directory No working compiler found, or bogus compiler options passed to the compiler from Python's standard "distutils" module. See the error messages above. Likely, the problem is not related to CFFI but generic to the setup.py of any Python package that tries to compile C code. (Hints: on OS/X 10.8, for errors about -mno-fused-madd see http://stackoverflow.com/questions/22313407/ Otherwise, see https://wiki.python.org/moin/CompLangPython or the IRC channel #python on irc.libera.chat.) Trying to continue anyway. If you are trying to install CFFI from a build done in a different context, you can ignore this warning. running bdist_wheel running build running build_py creating build creating build/lib.linux-x86_64-3.7 creating build/lib.linux-x86_64-3.7/cffi copying cffi/backend_ctypes.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/vengine_gen.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/vengine_cpy.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/pkgconfig.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/lock.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/recompiler.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/__init__.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/cparser.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/ffiplatform.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/verifier.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/cffi_opcode.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/setuptools_ext.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/api.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/commontypes.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/error.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/model.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/_cffi_include.h -> build/lib.linux-x86_64-3.7/cffi copying cffi/parse_c_type.h -> build/lib.linux-x86_64-3.7/cffi copying cffi/_embedding.h -> build/lib.linux-x86_64-3.7/cffi copying cffi/_cffi_errors.h -> build/lib.linux-x86_64-3.7/cffi running build_ext building '_cffi_backend' extension creating build/temp.linux-x86_64-3.7 creating build/temp.linux-x86_64-3.7/c x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/ffi -I/usr/include/libffi -I/builds/eighthave/fdroidserver/env/include -I/usr/include/python3.7m -c c/_cffi_backend.c -o build/temp.linux-x86_64-3.7/c/_cffi_backend.o unable to execute 'x86_64-linux-gnu-gcc': No such file or directory error: command 'x86_64-linux-gnu-gcc' failed with exit status 1 ---------------------------------------- Failed building wheel for cffi Running setup.py clean for cffi Failed to build cffi Installing collected packages: setuptools, wheel, pycparser, cffi Running setup.py install for cffi: started Running setup.py install for cffi: finished with status 'error' Complete output from command /builds/eighthave/fdroidserver/env/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-djg9jc8p/cffi/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-ek80c81s/install-record.txt --single-version-externally-managed --prefix /tmp/pip-build-env-xokvr6uk --compile --install-headers /builds/eighthave/fdroidserver/env/include/site/python3.7/cffi: unable to execute 'x86_64-linux-gnu-gcc': No such file or directory unable to execute 'x86_64-linux-gnu-gcc': No such file or directory No working compiler found, or bogus compiler options passed to the compiler from Python's standard "distutils" module. See the error messages above. Likely, the problem is not related to CFFI but generic to the setup.py of any Python package that tries to compile C code. (Hints: on OS/X 10.8, for errors about -mno-fused-madd see http://stackoverflow.com/questions/22313407/ Otherwise, see https://wiki.python.org/moin/CompLangPython or the IRC channel #python on irc.libera.chat.) Trying to continue anyway. If you are trying to install CFFI from a build done in a different context, you can ignore this warning. running install running build running build_py creating build creating build/lib.linux-x86_64-3.7 creating build/lib.linux-x86_64-3.7/cffi copying cffi/backend_ctypes.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/vengine_gen.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/vengine_cpy.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/pkgconfig.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/lock.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/recompiler.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/__init__.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/cparser.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/ffiplatform.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/verifier.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/cffi_opcode.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/setuptools_ext.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/api.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/commontypes.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/error.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/model.py -> build/lib.linux-x86_64-3.7/cffi copying cffi/_cffi_include.h -> build/lib.linux-x86_64-3.7/cffi copying cffi/parse_c_type.h -> build/lib.linux-x86_64-3.7/cffi copying cffi/_embedding.h -> build/lib.linux-x86_64-3.7/cffi copying cffi/_cffi_errors.h -> build/lib.linux-x86_64-3.7/cffi running build_ext building '_cffi_backend' extension creating build/temp.linux-x86_64-3.7 creating build/temp.linux-x86_64-3.7/c x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/ffi -I/usr/include/libffi -I/builds/eighthave/fdroidserver/env/include -I/usr/include/python3.7m -c c/_cffi_backend.c -o build/temp.linux-x86_64-3.7/c/_cffi_backend.o unable to execute 'x86_64-linux-gnu-gcc': No such file or directory error: command 'x86_64-linux-gnu-gcc' failed with exit status 1 ---------------------------------------- Command "/builds/eighthave/fdroidserver/env/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-djg9jc8p/cffi/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-ek80c81s/install-record.txt --single-version-externally-managed --prefix /tmp/pip-build-env-xokvr6uk --compile --install-headers /builds/eighthave/fdroidserver/env/include/site/python3.7/cffi" failed with error code 1 in /tmp/pip-install-djg9jc8p/cffi/ ---------------------------------------- Command "/builds/eighthave/fdroidserver/env/bin/python3 -m pip install --ignore-installed --no-user --prefix /tmp/pip-build-env-xokvr6uk --no-warn-script-location --no-binary :none: --only-binary :none: -i https://pypi.org/simple -- setuptools>=40.8.0 wheel "cffi>=1.4.1; python_implementation != 'PyPy'"" failed with error code 1 in None --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3a44d413..88464987 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -395,8 +395,10 @@ plugin_fetchsrclibs: python3-cffi python3-cryptography python3-matplotlib + python3-nacl python3-pip python3-pil + python3-pycparser python3-venv - python3 -m venv --system-site-packages env - . env/bin/activate From 55b39059517f69237268f701a1a0eeb43232beb4 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 3 Feb 2022 16:41:57 +0100 Subject: [PATCH 0479/2116] gitlab-ci: fix servergitmirrors by using Debian packages this is like: * ca5ebcb30f0cd23800e1f5fa960e1410be116665 * 972bfe346f377777288de00931fcd685d2b2ca86 * 23bd62c31c576077ed81315beaf02dca1fa2b22a * !1035 * !1034 * !1029 * !1028 --- .gitlab-ci.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 88464987..4131b8c2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -434,11 +434,13 @@ servergitmirrors: git openssh-client openssl + python3-cffi python3-cryptography python3-matplotlib - python3-cffi - python3-pip + python3-nacl python3-pil + python3-pip + python3-pycparser python3-venv rsync wget From 3f62e0ebde435440835d2e5b8355241ce408b3db Mon Sep 17 00:00:00 2001 From: linsui Date: Thu, 10 Feb 2022 16:47:03 +0800 Subject: [PATCH 0480/2116] update preinstalled ndk to r23b --- buildserver/Vagrantfile | 2 +- buildserver/provision-android-ndk | 2 +- makebuildserver | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/buildserver/Vagrantfile b/buildserver/Vagrantfile index 140e800a..02fadf8d 100644 --- a/buildserver/Vagrantfile +++ b/buildserver/Vagrantfile @@ -84,7 +84,7 @@ Vagrant.configure("2") do |config| args: [configfile['debian_mirror']] config.vm.provision "shell", name: "android-sdk", path: "provision-android-sdk" config.vm.provision "shell", name: "android-ndk", path: "provision-android-ndk", - args: ["/opt/android-sdk/ndk", "r21e", "r22b"] + args: ["/opt/android-sdk/ndk", "r21e", "r23b"] config.vm.provision "shell", name: "gradle", path: "provision-gradle" config.vm.provision "shell", name: "buildserverid", path: "provision-buildserverid", args: [`git rev-parse HEAD`] diff --git a/buildserver/provision-android-ndk b/buildserver/provision-android-ndk index ca2cc325..63f5eee7 100644 --- a/buildserver/provision-android-ndk +++ b/buildserver/provision-android-ndk @@ -15,7 +15,7 @@ cd $NDK_BASE for version in $@; do if [ ! -e ${NDK_BASE}/${version} ]; then - unzip /vagrant/cache/android-ndk-${version}-linux-x86_64.zip > /dev/null + unzip /vagrant/cache/android-ndk-${version}-linux*.zip > /dev/null mv android-ndk-${version} \ `sed -En 's,^Pkg.Revision *= *(.+),\1,p' android-ndk-${version}/source.properties` fi diff --git a/makebuildserver b/makebuildserver index 24fe201a..b373383a 100755 --- a/makebuildserver +++ b/makebuildserver @@ -304,8 +304,8 @@ CACHE_FILES = [ '0e46229820205440b48a5501122002842b82886e76af35f0f3a069243dca4b3c'), ('https://dl.google.com/android/repository/android-ndk-r21e-linux-x86_64.zip', 'ad7ce5467e18d40050dc51b8e7affc3e635c85bd8c59be62de32352328ed467e'), - ('https://dl.google.com/android/repository/android-ndk-r22b-linux-x86_64.zip', - 'ac3a0421e76f71dd330d0cd55f9d99b9ac864c4c034fc67e0d671d022d4e806b'), + ('https://dl.google.com/android/repository/android-ndk-r23b-linux.zip', + 'c6e97f9c8cfe5b7be0a9e6c15af8e7a179475b7ded23e2d1c1fa0945d6fb4382'), ] From 93836f3af8dbc11857b5bfc6ddf07bbe5f98c80d Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Tue, 15 Feb 2022 10:31:09 +0000 Subject: [PATCH 0481/2116] gradle v7.4 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index cbd7ec74..60e8b5d8 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -175,6 +175,7 @@ get_sha() { '7.3.1') echo '9afb3ca688fc12c761a0e9e4321e4d24e977a4a8916c8a768b1fe05ddb4d6b66' ;; '7.3.2') echo '23b89f8eac363f5f4b8336e0530c7295c55b728a9caa5268fdd4a532610d5392' ;; '7.3.3') echo 'b586e04868a22fd817c8971330fec37e298f3242eb85c374181b12d637f80302' ;; + '7.4') echo '8cc27038d5dbd815759851ba53e70cf62e481b87494cc97cfd97982ada5ba634' ;; *) exit 1 esac } @@ -195,7 +196,7 @@ d_plugin_k=(4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 d_plugin_v=(6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From ca57bf1b0e5c92f7fd74bbc4fcfe84f2d3647d1f Mon Sep 17 00:00:00 2001 From: gub Date: Mon, 6 Sep 2021 15:35:04 +0200 Subject: [PATCH 0482/2116] Translated using Weblate: French (fr) by gub Currently translated at 87.1% (502 of 576 strings) Co-authored-by: gub Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 1a107448..9dc43100 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -28,8 +28,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-28 22:09+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2021-02-05 14:41+0000\n" +"Last-Translator: gub \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2254,7 +2254,7 @@ msgstr "dest= est requis pour les options comme %r" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" -msgstr "" +msgstr "binaire exécutable, possiblement du code" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From bbc4e2eca01e0663b9dbf275cebddb498938425b Mon Sep 17 00:00:00 2001 From: Gavy Date: Mon, 6 Sep 2021 15:35:04 +0200 Subject: [PATCH 0483/2116] Translated using Weblate: French (fr) by Gavy Currently translated at 87.1% (502 of 576 strings) Co-authored-by: Gavy Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 9dc43100..b4c0233a 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -23,13 +23,14 @@ # gub , 2021. # ButterflyOfFire , 2021. # Vincent Finance , 2021. +# Gavy , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-02-05 14:41+0000\n" -"Last-Translator: gub \n" +"Last-Translator: Gavy \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -86,7 +87,7 @@ msgstr "\"%s/\" n'a pas de fichier de métadonnées correspondant !" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" +msgstr "\"repo_pubkey\" doit être présent dans config.yml lors de l'utilisation de --nosign!" #: ../fdroidserver/install.py #, python-brace-format From 44489553eb9b09b0109e02d76b7ccbb0fdd731f3 Mon Sep 17 00:00:00 2001 From: Oymate Date: Mon, 6 Sep 2021 15:35:04 +0200 Subject: [PATCH 0484/2116] Translated using Weblate: Bengali (bn) by Oymate Currently translated at 3.4% (20 of 576 strings) Co-authored-by: Oymate Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/bn/ Translation: F-Droid/F-Droid Server --- locale/bn/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index e8ae283b..c6007bb9 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-15 13:25+0000\n" +"PO-Revision-Date: 2021-02-12 09:48+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali \n" "Language: bn\n" @@ -116,7 +116,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "%prog [options]" -msgstr "" +msgstr "%prog [অপশন]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -1407,7 +1407,7 @@ msgstr "{apkfilename} প্রক্রিয়ারত" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" -msgstr "" +msgstr "{appid} প্রক্রিয়ারত" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" From 01d3476d89f0bf40eeb5fcae3ccd66d26b1cb992 Mon Sep 17 00:00:00 2001 From: Liu Tao Date: Mon, 6 Sep 2021 15:35:05 +0200 Subject: [PATCH 0485/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Liu Tao Currently translated at 35.5% (205 of 576 strings) Co-authored-by: Liu Tao Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 2b5c3dd9..4044889e 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -7,13 +7,14 @@ # Eric , 2020, 2021. # Carlos , 2021. # Hans-Christoph Steiner , 2021. +# Liu Tao , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-31 22:07+0000\n" -"Last-Translator: Eric \n" +"PO-Revision-Date: 2021-02-15 21:33+0000\n" +"Last-Translator: Liu Tao \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" @@ -284,11 +285,11 @@ msgstr "同时提示格式问题,如 rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" -msgstr "" +msgstr "Android AAR 库" #: ../fdroidserver/scanner.py msgid "Android APK file" -msgstr "" +msgstr "Android APK 文件" #: ../fdroidserver/scanner.py msgid "Android DEX code" @@ -367,7 +368,7 @@ msgstr "分支 '{branch}' 在源码库 '{srclib}' 里被用作相应的 commit" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" -msgstr "" +msgstr "断开的符号链接:{path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Build a package from source" @@ -407,13 +408,13 @@ msgstr[0] "因扫描时的{}错误而无法构建" #: ../fdroidserver/vmtools.py #, python-brace-format msgid "Cannot read \"{path}\"!" -msgstr "" +msgstr "无法读取“{path}”!" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/metadata.py #, python-brace-format msgid "Cannot resolve application ID {appid}" -msgstr "" +msgstr "无法解析应用程序 ID {appid}" #: ../fdroidserver/rewritemeta.py #, python-brace-format From de66c06bc81ef75653b00b722f38421910b0dbe8 Mon Sep 17 00:00:00 2001 From: Michalis Date: Mon, 6 Sep 2021 15:35:06 +0200 Subject: [PATCH 0486/2116] Translated using Weblate: Greek (el) by Michalis Currently translated at 13.5% (78 of 576 strings) Co-authored-by: Michalis Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/el/ Translation: F-Droid/F-Droid Server --- locale/el/LC_MESSAGES/fdroidserver.po | 105 +++++++++++++++----------- 1 file changed, 59 insertions(+), 46 deletions(-) diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index 9280945a..f4e52dfb 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -2,20 +2,21 @@ # This file is put in the public domain. # THANOS SIOURDAKIS , 2020. # fresh , 2020, 2021. +# Michalis , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-04 15:47+0000\n" -"Last-Translator: fresh \n" +"PO-Revision-Date: 2021-02-18 17:50+0000\n" +"Last-Translator: Michalis \n" "Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4.1-dev\n" +"X-Generator: Weblate 4.5\n" #: ../fdroidserver/common.py msgid "" @@ -26,18 +27,28 @@ msgid "" " tools on https://gitlab.com/fdroid.\n" " " msgstr "" +"\n" +" Αυτό είναι ένα αποθετήριο εφαρμογών που θα χρησιμοποιηθεί με το FDroid. Οι εφαρμογές\n" +" σε αυτό το αποθετήριο είναι είτε επίσημα δυαδικά αρχεία που δημιουργήθηκαν από τους\n" +" προγραμματιστές της εφαρμογής ή είναι δυαδικά αρχεία που έχουν δημιουργηθεί από \n" +" την πηγή με το f-droid.org χρησιμοποιώντας τα εργαλεία στο https://gitlab.com/fdroid.\n" +" " #: ../fdroidserver/nightly.py msgid "" "\n" "SSH Public Key to be used as Deploy Key:" msgstr "" +"\n" +"Δημόσιο κλειδί SSH που θα χρησιμοποιηθεί ως κλειδί ανάπτυξης:" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" +"\n" +"Δημόσιο κλειδί SSH που θα χρησιμοποιηθεί ως κλειδί ανάπτυξης:" #: ../fdroidserver/nightly.py #, python-brace-format @@ -45,63 +56,65 @@ msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" +"\n" +"{path} κωδικοποιημένη για τη μυστική μεταβλητή DEBUG_KEYSTORE:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" -msgstr "" +msgstr "\"%s/\" δεν έχει αρχείο μετα-δεδομένων που να ταιριάζει!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" +msgstr "Το \"repo_pubkey\" πρέπει να υπάρχει στο config.yml όταν χρησιμοποιείτε το --nosign!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "" +msgstr "Το \"{apkfilename}\" είναι ήδη εγκατεστημένο στο {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" +msgstr "Το \"{path}\" περιέχει ένα ξεπερασμένο {name} ({version})" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" -msgstr "" +msgstr "Το \"{path}\" περιέχει ένα πρόσφατο {name} ({version})" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" -msgstr "" +msgstr "Το \"{path}\" υπάρχει, αλλά το s3cmd δεν έχει εγκατασταθεί!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "" +msgstr "Το \"{path}\" δεν είναι υποστηριζόμενη μορφή αρχείου (χρήση: μεταδεδομένα/*.yml)" #: ../fdroidserver/metadata.py #, python-brace-format msgid "\"{path}\" is not an accepted format, convert to: {formats}" -msgstr "" +msgstr "Το \"{path}\" δεν είναι αποδεκτή μορφή, μετατροπή σε: {formats}" #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" -msgstr "" +msgstr "Το \"{url}\" δεν είναι έγκυρο URL!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Η επιλογή %(option)s απαιτεί %(number)d όρισμα" +msgstr[1] "Η επιλογή %(option)s απαιτεί %(number)d ορίσματα" #: ../fdroidserver/mirror.py #, python-format msgid "%(prog)s [options] url" -msgstr "" +msgstr "%(prog)s [επιλογές] url" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -112,7 +125,7 @@ msgstr "%(prog)s: σφάλμα: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" -msgstr "" +msgstr "%d προβλήματα εντοπίστηκαν" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -123,34 +136,34 @@ msgstr "%prog [επιλογές]" #: /usr/lib/python3.7/argparse.py #, python-format msgid "%r is not callable" -msgstr "" +msgstr "Δεν είναι δυνατή η κλήση του %r" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" -msgstr "" +msgstr "Το %s δεν είναι αποδεκτό πεδίο δόμησης" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "%s option does not take a value" -msgstr "" +msgstr "Η επιλογή %s δεν λαμβάνει τιμή" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" -msgstr "" +msgstr "Το «keypass» δεν βρέθηκε στο config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" +msgstr "Το \"keystore\" είναι NONE και το \"smartcardoptions\" είναι κενό!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" -msgstr "" +msgstr "Το 'keystore' δεν βρέθηκε στο config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" -msgstr "" +msgstr "Το 'keystorepass' δεν βρέθηκε στο config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" @@ -215,7 +228,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid ".__call__() not defined" -msgstr "" +msgstr ". __call__ () δεν έχει οριστεί" #: ../fdroidserver/metadata.py msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." @@ -569,7 +582,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "" +msgstr "Διαγραφή APKs και/ή OBBs χωρίς μεταδεδομένα από το αποθετήριο" #: ../fdroidserver/deploy.py #, python-brace-format @@ -672,7 +685,7 @@ msgstr "" #: ../fdroid msgid "Dynamically scan APKs post build" -msgstr "" +msgstr "Δυναμική σάρωση APK μετά τη δημιουργία" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -1005,7 +1018,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" -msgstr "" +msgstr "Αλληλεπίδραση με το διακομιστή HTTP του αποθετηρίου" #: ../fdroidserver/update.py msgid "Invalid APK" @@ -1505,7 +1518,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" -msgstr "" +msgstr "Επανεγγραφή όλων των αρχείων μετα-δεδομένων" #: ../fdroidserver/rewritemeta.py msgid "Rewrite to a specific format: " @@ -1590,11 +1603,11 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" -msgstr "" +msgstr "Υπογράψτε και τοποθετήστε τα πακέτα στο αποθετήριο" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" -msgstr "" +msgstr "Υπογραφή ευρετηρίων που δημιουργήθηκαν με τη χρήση update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" @@ -1880,7 +1893,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" -msgstr "" +msgstr "Ενημέρωση πληροφοριών αποθετηρίου για νέα πακέτα" #: ../fdroid ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" @@ -1888,7 +1901,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Update the stats of the repo" -msgstr "" +msgstr "Ενημέρωση των στατιστικών του αποθετηρίου" #: ../fdroidserver/update.py ../fdroidserver/build.py msgid "Update the wiki" @@ -2001,7 +2014,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" -msgstr "" +msgstr "Επαλήθευση της ακεραιότητας των πακέτων που έχουν ληφθεί" #: ../fdroidserver/index.py msgid "Verifying index signature:" @@ -2014,7 +2027,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" -msgstr "" +msgstr "Προειδοποίηση για πιθανά σφάλματα μετα-δεδομένων" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2053,13 +2066,13 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "" +msgstr "Ασαφής επιλογή: %(option)s θα μπορούσε να ταιριάζει με %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" -msgstr "" +msgstr "ασαφής επιλογή: %s (%s;)" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2113,7 +2126,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "can't open '%s': %s" -msgstr "" +msgstr "δεν είναι δυνατό το άνοιγμα του '%s': %s" #: ../fdroidserver/build.py #, python-brace-format @@ -2252,7 +2265,7 @@ msgstr "" #: ../fdroidserver/metadata.py msgid "force errors to be warnings, or ignore" -msgstr "" +msgstr "Επιβάλετε τα σφάλματα ως προειδοποιήσεις ή αγνοήστε τα" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." @@ -2341,7 +2354,7 @@ msgstr "" #: /usr/lib/python3.7/optparse.py #, python-format msgid "no such option: %s" -msgstr "" +msgstr "δεν υπάρχει τέτοια επιλογή: %s" #: ../fdroid ../fdroidserver/__main__.py msgid "no version info found!" @@ -2396,13 +2409,13 @@ msgstr "η επιλογή -%s απαιτεί επιχείρημα" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s must not have an argument" -msgstr "" +msgstr "η επιλογή --%s δεν πρέπει να έχει όρισμα" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s not a unique prefix" -msgstr "" +msgstr "η επιλογή --%s δεν είναι ένα μοναδικό πρόθεμα" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2414,7 +2427,7 @@ msgstr "η επιλογή --%s δεν αναγνωρίζεται" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s requires argument" -msgstr "" +msgstr "η επιλογή --%s απαιτεί όρισμα" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2514,7 +2527,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "the following arguments are required: %s" -msgstr "" +msgstr "Απαιτούνται τα ακόλουθα ορίσματα: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2532,12 +2545,12 @@ msgstr "άγνωστος συντακτικός αναλυτής %(parser_name)r #: /usr/lib/python3.7/argparse.py #, python-format msgid "unrecognized arguments: %s" -msgstr "" +msgstr "μη αναγνωρίσιμα ορίσματα: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" -msgstr "" +msgstr "μη ασφαλή δικαιώματα στο '{config_file}' (πρέπει να είναι 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py @@ -2546,7 +2559,7 @@ msgstr "χρήση: " #: ../fdroid msgid "usage: fdroid [-h|--help|--version] []" -msgstr "" +msgstr "χρήση: fdroid [-h|--help|--version] []" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format From 2ae2aed6f37c8760749c71d61cc5d11862e31bc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Mon, 6 Sep 2021 15:35:06 +0200 Subject: [PATCH 0487/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Chine?= =?UTF-8?q?se=20(Simplified)=20(zh=5FHans)=20by=20=E4=B8=96=E7=95=8C=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 37.8% (218 of 576 strings) Translated using Weblate: Chinese (Simplified) (zh_Hans) by 世界 Currently translated at 37.8% (218 of 576 strings) Co-authored-by: 世界 Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 208 ++++++++++----------- 1 file changed, 103 insertions(+), 105 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 4044889e..518316f8 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -8,20 +8,21 @@ # Carlos , 2021. # Hans-Christoph Steiner , 2021. # Liu Tao , 2021. +# 世界 , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-02-15 21:33+0000\n" -"Last-Translator: Liu Tao \n" +"PO-Revision-Date: 2021-03-06 21:40+0000\n" +"Last-Translator: 世界 \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.5.1\n" #: ../fdroidserver/common.py msgid "" @@ -33,10 +34,7 @@ msgid "" " " msgstr "" "\n" -" 这是一个与FDroid一起使用的应用程序的仓库。这个仓库中的应用程序\n" -" 要么是原应用程序开发者构建的官方二进制文件,要么是f-droid.org使用\n" -" https://gitlab.com/fdroid上的工具从源代码构建而来的\n" -" 二进制文件。\n" +" 这是 F-Droid 中应用的存储库. 此存储库中之应用二进制文件要么是由源开发者构建的, 要么是由 F-Droid 使用 https://gitlab.com/fdroid 工具从源代码构建的.\n" " " #: ../fdroidserver/nightly.py @@ -45,7 +43,7 @@ msgid "" "SSH Public Key to be used as Deploy Key:" msgstr "" "\n" -"SSH 公钥被用来作为布署密钥:" +"用作布署密钥的 SSH 公钥:" #: ../fdroidserver/nightly.py msgid "" @@ -53,7 +51,7 @@ msgid "" "SSH public key to be used as deploy key:" msgstr "" "\n" -"SSH 公钥将被用作布署密钥:" +"用作布署密钥的 SSH 公钥:" #: ../fdroidserver/nightly.py #, python-brace-format @@ -62,21 +60,21 @@ msgid "" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" -"编给DEBUG_KEYSTORE秘密变量的{path}:" +"编码的 DEBUG_KEYSTORE {path} 秘密变量:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" -msgstr "\"%s/\" 没有匹配的元数据文件!" +msgstr "\"%s/\" 不与任何元数据文件匹配!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" +msgstr "当您使用 --nosign 时, config.yml 中必须存在 \"repo_pubkey\" !" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "'{apkfilename}'已安装在{dev}上。" +msgstr "'{apkfilename}' 已安装在 {dev} 上." #: ../fdroidserver/update.py #, python-brace-format @@ -91,12 +89,12 @@ msgstr "\"{path}\" 包含近期的 {name} ({version})" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" -msgstr "\"{path}\"存在,但未安装 s3cmd!" +msgstr "\"{path}\" 存在, 但 s3cmd 未安装!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "\"{path}\"不是可接受的文件格式 (使用:metadata/*.yml)" +msgstr "\"{path}\" 不是被支持的格式 ( 使用: metadata/*.yml )" #: ../fdroidserver/metadata.py #, python-brace-format @@ -106,7 +104,7 @@ msgstr "\"{path}\" 不是可接受的格式, 需转换成 : {formats}" #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" -msgstr "\"{url}\" 不是有效的网址!" +msgstr "\"{url}\" 不是有效的链接!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -118,7 +116,7 @@ msgstr[0] "%(option)s 选项需要 %(number)d 个参数" #: ../fdroidserver/mirror.py #, python-format msgid "%(prog)s [options] url" -msgstr "%(prog)s [选项] url" +msgstr "%(prog)s [选项] 链接" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -140,51 +138,51 @@ msgstr "%prog [选项]" #: /usr/lib/python3.7/argparse.py #, python-format msgid "%r is not callable" -msgstr "%r 不是可调用的" +msgstr "%r 不可调用" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" -msgstr "%s 不是可接受的构建字段" +msgstr "%s 不是一个被接受的构建字段" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "%s option does not take a value" -msgstr "%s 选项不采用值" +msgstr "%s 选项不采用参数" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" -msgstr "config.yml中找不到'keypass'!" +msgstr "config.yml 中找不到 'keypass'!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "'keystore' 没有赋值,'smartcardoptions' 为空!" +msgstr "'keystore' 没有赋值, 'smartcardoptions' 为空 !" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" -msgstr "config.yml中找不到'keypass'!" +msgstr "config.yml 中找不到 'keystore'!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" -msgstr "config.yml中找不到'keystorepass'!" +msgstr "config.yml 中找不到 'keystorepass'!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" -msgstr "config.yml中找不到'repo_keyalias'!" +msgstr "config.yml 中找不到 'repo_keyalias'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" -msgstr "'required'是无效的位置参数" +msgstr "'required' 是位置的无效参数" #: ../fdroidserver/common.py msgid "'sdk_path' not set in 'config.yml'!" -msgstr "未在“ config.yml”中设置“ sdk_path”!" +msgstr "未在 'config.yml' 中设置 'sdk_path'!" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" -msgstr "config.yml 中未设置'sdk_path'!" +msgstr "未在 config.yml 中设置 'sdk_path'!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -192,42 +190,42 @@ msgstr "config.yml 中未设置'sdk_path'!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-23.0.0 or newer!" -msgstr "'{aapt}'太旧,fdroid需要build-tools-23.0.0或更高版本!" +msgstr "'{aapt}' 太旧, F-Droid 需要 build-tools-23.0.0 或更新的版本!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" -msgstr "'{aapt}'太旧,fdroid需要build-tools- {version}或更高版本!" +msgstr "'{aapt}' 太旧, F-Droid 需要 build-tools-{version} 或更新的版本!" #: ../fdroidserver/install.py #, python-brace-format msgid "'{apkfilename}' is already installed on {dev}." -msgstr "'{apkfilename}'已安装在{dev}上。" +msgstr "'{apkfilename}'已安装在 {dev} 上." #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{field}' in {linedesc} is obsolete, see docs for current fields:" -msgstr "{linedesc}中的'{field}'已过时,请参阅文档以获取当前字段:" +msgstr "{linedesc} 中的 '{field}' 已废弃, 请参阅文档以获取当前字段:" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "“ {field}”将随机排列!如果顺序很重要,请使用()或[]括号!" +msgstr "{field} 将随机排列! 如果顺序很重要, 请使用 () 或 [] 括号!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" -msgstr "'{path}'执行失败!" +msgstr "'{path}' 执行失败!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" -msgstr "'{value}'不是{appid}的一个有效{field}。正则表达式模式:{pattern}" +msgstr "'{value}' 不是 {appid} 之有效 {field}. 正则表达式: {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" -msgstr "... {appid}的checkupdate失败:{error}" +msgstr "...为 {appid} 检查更新失败: {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -236,44 +234,44 @@ msgstr ".__call__() 未定义" #: ../fdroidserver/metadata.py msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." -msgstr "不支持.fdroid.txt!转换为.fdroid.yml或.fdroid.json。" +msgstr ".fdroid.txt 不受支持! 需转换为 .fdroid.yml 或 .fdroid.json." #: ../fdroidserver/lint.py msgid "/issues is missing" -msgstr "/问题丢失" +msgstr "路径缺少 /issues ( 译者注: 此处仅支持 github 或 gitlab 之 issues 链接 )" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" -msgstr "需要有URL为参数!" +msgstr "需要有一个链接作为参数!" #: ../fdroid ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" -msgstr "添加 gpg 签名至资源库软件包" +msgstr "使用 GnuPG 为存储库之软件包添加 PGP 签名" #: ../fdroid ../fdroidserver/__main__.py msgid "Add a new application from its source code" -msgstr "从源码添加新的应用程序" +msgstr "从源代码添加新的应用" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" -msgstr "给未签署的资源库添加一个资源库签署密匙" +msgstr "添加存储库签名密钥到未签名的存储库" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" -msgstr "为缺少骨架元数据文件的 APK 添加这些文件" +msgstr "为缺少主干元数据文件的 APK 添加这些文件" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" -msgstr "仅为 {name} 添加新资源库" +msgstr "仅为 {name} 添加新存储库" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" -msgstr "密钥存储中资源库签名密钥的别名" +msgstr "密钥库中存储库签名密钥的别名" #: ../fdroidserver/import.py msgid "Allows a different revision (or git branch) to be specified for the initial import" -msgstr "可让运行初始导入时指定不同修订(或 git 分支)" +msgstr "可让运行初始导入时指定不同修订 ( 或 git 分支 )" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" @@ -281,7 +279,7 @@ msgstr "同时对存档部分完整镜像" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" -msgstr "同时提示格式问题,如 rewritemeta -l" +msgstr "同时警告格式问题, 如同 rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" @@ -293,36 +291,36 @@ msgstr "Android APK 文件" #: ../fdroidserver/scanner.py msgid "Android DEX code" -msgstr "安卓DEX代码" +msgstr "Android DEX 代码" #: ../fdroidserver/common.py ../fdroidserver/build.py #, python-brace-format msgid "Android SDK '{path}' does not have '{dirname}' installed!" -msgstr "Android SDK‘{path}’未安装‘{dirname}’!" +msgstr "Android SDK {path} 未安装 {dirname}!" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "未在 {path} 中找到 Android SDK!" +msgstr "未在 {path} 中找到 Android SDK!" #: ../fdroidserver/common.py msgid "Android SDK not found!" -msgstr "未找到 Android SDK!" +msgstr "找不到 Android SDK!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" -msgstr "Android SDK路径“ {path}”不存在!" +msgstr "Android SDK 路径 {path} 不存在!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" -msgstr "Android SDK路径'{path}'不是目录!" +msgstr "Android SDK 路径 '{path}' 不是目录!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "找到了 Android SDK 工具{cmd}!" +msgstr "找到 Android SDK 工具 {cmd}!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -330,49 +328,49 @@ msgstr "找到了 Android SDK 工具{cmd}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android build-tools path '{path}' does not exist!" -msgstr "Android构建工具路径“ {path}”不存在!" +msgstr "Android build-tools 路径 '{path}' 不存在!" #: ../fdroidserver/update.py msgid "AndroidManifest.xml has no date" -msgstr "AndroidManifest.xml没有日期" +msgstr "AndroidManifest.xml 没有日期" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" -msgstr "应用程序在\"{repo}\",但有一个链接到{url}" +msgstr "应用 在 '{repo}' 中, 但有一个链接到 {url}" #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" -msgstr "不需要附加.git" +msgstr "不需要附加 .git" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" -msgstr "正使用无效签名归档{apkfilename}!" +msgstr "正使用无效签名归档 {apkfilename}!" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" -msgstr "" +msgstr "镜像的基本链接可以使用此请求参数包含索引签名键: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "分支 '{branch}' 在构建 '{versionName}' 时被用作相应的 commit" +msgstr "分支 '{branch}' 在构建 '{versionName}' 时被用作相应的提交" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" -msgstr "分支 '{branch}' 在源码库 '{srclib}' 里被用作相应的 commit" +msgstr "分支 '{branch}' 在源码库 '{srclib}' 里被用作相应的提交" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" -msgstr "断开的符号链接:{path}" +msgstr "断开的符号链接: {path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Build a package from source" -msgstr "从源生成包" +msgstr "从源代码构建安装包" #: ../fdroidserver/build.py msgid "Build all applications available" @@ -380,25 +378,25 @@ msgstr "编译全部可用应用程序" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" -msgstr "由 `fdroid import` 生成的 build ——一旦准备就绪将删除禁用行" +msgstr "由 'fdroid import' 生成的构建 - 一旦准备就绪将删除禁用行" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" -msgstr "" +msgstr "构建元数据 git 存储库包含未提交的更改!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" -msgstr "仅编译每个包的最新版本" +msgstr "仅编译每个应用的最新版本" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" -msgstr "" +msgstr "构建应使用逗号分隔的 versionName 和 versionCode, 而不是 {linedesc} 中的 {value}" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" -msgstr "使用此配置并基于 \"%s\" 的构建储存库:" +msgstr "使用此配置并基于 \"%s\" 的构建存储库:" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -419,7 +417,7 @@ msgstr "无法解析应用程序 ID {appid}" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" -msgstr "" +msgstr "无法重写 {path}" #: ../fdroidserver/rewritemeta.py msgid "Cannot use --list and --to at the same time" @@ -428,12 +426,12 @@ msgstr "不能同时使用 --list 与 --to" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" -msgstr "" +msgstr "无法写入 {path}, 该格式不被接受, 请使用 {formats}" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" -msgstr "" +msgstr "类别 '%s' 无效" #: ../fdroidserver/lint.py msgid "Categories are not set" @@ -441,21 +439,21 @@ msgstr "没有设置类别" #: ../fdroid ../fdroidserver/__main__.py msgid "Check for updates to applications" -msgstr "检查应用更新" +msgstr "检查应用的更新" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "" +msgstr "正为 {appid} 检查存档: 安装包: {integer}, 保留版本数: {keep}, 架构安装包: {arch}" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "" +msgstr "正为 {appid} 检查存档: 安装包: {integer}, 保留版本数: {keep}, 架构安装包: {arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" -msgstr "干净更新- 不用缓存,重新处理全部 APK文件" +msgstr "干净的更新 - 不使用缓存,重新处理全部 APK 文件" #: ../fdroidserver/import.py msgid "Comma separated list of categories." @@ -472,12 +470,12 @@ msgstr "提交更改" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." -msgstr "" +msgstr "冲突的参数: '--verbose' 和 '--quiet' 不能被同时使用." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "冲突的配置文件! 使用 {newfile}, 忽略 {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format @@ -495,12 +493,12 @@ msgstr "找不到最新的版本名" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" -msgstr "" +msgstr "找不到 {path} 以移除" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "" +msgstr "无法打开 apk 文件 {path} 用于分析: " #: ../fdroidserver/common.py #, python-brace-format @@ -585,7 +583,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "从资源库中删除没有元数据的 APK 和 OBB" +msgstr "从存储库中删除没有元数据的 APK 和 OBB" #: ../fdroidserver/deploy.py #, python-brace-format @@ -997,7 +995,7 @@ msgstr "安装全部可用的已签名应用" #: ../fdroid ../fdroidserver/__main__.py msgid "Install built packages on devices" -msgstr "在设备上安装生成包" +msgstr "在设备上安装生成的安装包" #: ../fdroidserver/install.py #, python-format @@ -1021,7 +1019,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" -msgstr "与资源库 HTTP 服务器互动" +msgstr "与存储库 HTTP 服务器互动" #: ../fdroidserver/update.py msgid "Invalid APK" @@ -1458,7 +1456,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Quickly start a new repository" -msgstr "快速新建资源库" +msgstr "快速新建存储库" #: ../fdroid ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" @@ -1496,7 +1494,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" -msgstr "对于文件名不符合 package.name_123.apk 的文件进行重命名" +msgstr "重命名文件名不符合 package.name_123.apk 的 APK 文件" #: ../fdroidserver/update.py msgid "Report on build data status" @@ -1560,7 +1558,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Scan the source code of a package" -msgstr "扫描包源码" +msgstr "扫描一个应用的源代码" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1605,11 +1603,11 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" -msgstr "对包进行签名并将其加入资源库" +msgstr "对包进行签名并将其加入存储库" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" -msgstr "签署使用更新创建的索引 --nosign" +msgstr "签名使用 update --nosign 创建的索引" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" @@ -1734,7 +1732,7 @@ msgstr "" #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "这是一个与F-Droid一起使用的应用程序的仓库。这个仓库中的应用程序要么是原应用程序开发者构建的官方二进制文件,要么是 f-droid.org 的管理员使用 https://gitlab.com/fdroid 上的工具从源代码构建而来的二进制文件。" +msgstr "这是一个与F-Droid一起使用的应用程序的存储库。这个存储库中的应用程序要么是原应用程序开发者构建的官方二进制文件,要么是 f-droid.org 的管理员使用 https://gitlab.com/fdroid 上的工具从源代码构建而来的二进制文件。" #: ../fdroidserver/import.py #, python-format @@ -1895,7 +1893,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" -msgstr "更新新包的资源库信息" +msgstr "更新新包的存储库信息" #: ../fdroid ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" @@ -1903,7 +1901,7 @@ msgstr "更新 URL 的二进制透明度日志" #: ../fdroid ../fdroidserver/__main__.py msgid "Update the stats of the repo" -msgstr "更新资源库统计信息" +msgstr "更新存储库统计信息" #: ../fdroidserver/update.py ../fdroidserver/build.py msgid "Update the wiki" @@ -2029,7 +2027,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" -msgstr "有关元数据可能错误的警告" +msgstr "有关元数据可能出现的错误的警告" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2068,13 +2066,13 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "模糊选项:%(option)s 可以相配 %(matches)s" +msgstr "模糊的选项:%(option)s 可以相配 %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" -msgstr "不明确的选项:%s(%s?)" +msgstr "模糊的选项:%s(%s?)" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2265,7 +2263,7 @@ msgstr "" #: ../fdroidserver/metadata.py msgid "force errors to be warnings, or ignore" -msgstr "强制错误提示警告或忽略" +msgstr "强制将错误设为警告, 或忽略" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." @@ -2397,13 +2395,13 @@ msgstr "" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option -%s not recognized" -msgstr "无法识别命令 -%s" +msgstr "未知的选项 -%s" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py #, python-format msgid "option -%s requires argument" -msgstr "命令 -%s 需要参数" +msgstr "选项 -%s 需要参数" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2415,7 +2413,7 @@ msgstr "选项 --%s 不能有参数" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s not a unique prefix" -msgstr "选项 --%s 不是独特的前缀" +msgstr "选项 --%s 不是一个唯一前缀" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2432,7 +2430,7 @@ msgstr "选项 --%s 需要参数" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "optional arguments" -msgstr "可用参数" +msgstr "可选参数" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2485,7 +2483,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "show program's version number and exit" -msgstr "显示本程序的版本号并退出" +msgstr "显示程序的版本号并退出" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py @@ -2527,13 +2525,13 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "the following arguments are required: %s" -msgstr "必须有此下参数:%s" +msgstr "需要此下参数:%s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "unexpected option string: %s" -msgstr "意料之外的选项字符串:%s" +msgstr "未预期的选项字符串:%s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2550,16 +2548,16 @@ msgstr "未识别的参数:%s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" -msgstr "{config_file}有不安全的权限(应该是0600)!" +msgstr "{config_file} 的文件权限不安全 ( 应该设为0600 ) !" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py msgid "usage: " -msgstr "用法: " +msgstr "用法: " #: ../fdroid msgid "usage: fdroid [-h|--help|--version] []" -msgstr "用法:fdroid [-h|--help|--version] []" +msgstr "用法:fdroid [-h|--help|--version] <命令> [<参数>]" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format From 4737784e53835f2d986bc3b4d4f665cb90d2cd38 Mon Sep 17 00:00:00 2001 From: Reza Almanda Date: Mon, 6 Sep 2021 15:35:06 +0200 Subject: [PATCH 0488/2116] Translated using Weblate: Indonesian (id) by Reza Almanda Currently translated at 13.5% (78 of 576 strings) Co-authored-by: Reza Almanda Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/id/ Translation: F-Droid/F-Droid Server --- locale/id/LC_MESSAGES/fdroidserver.po | 39 +++++++++++++++------------ 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index 524efb66..94608080 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -1,20 +1,21 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # signz signotorez , 2020. +# Reza Almanda , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2020-10-06 08:26+0000\n" -"Last-Translator: signz signotorez \n" +"PO-Revision-Date: 2021-03-13 19:36+0000\n" +"Last-Translator: Reza Almanda \n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.3-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: ../fdroidserver/common.py msgid "" @@ -31,12 +32,16 @@ msgid "" "\n" "SSH Public Key to be used as Deploy Key:" msgstr "" +"\n" +"Kunci Publik SSH yang akan digunakan sebagai Kunci Deploy:" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" +"\n" +"Kunci Publik SSH yang akan digunakan sebagai Kunci Deploy:" #: ../fdroidserver/nightly.py #, python-brace-format @@ -82,7 +87,7 @@ msgstr "\"{path}\" format berkas tidak didukung (gunakan: metadata/*.yml)" #: ../fdroidserver/metadata.py #, python-brace-format msgid "\"{path}\" is not an accepted format, convert to: {formats}" -msgstr "" +msgstr "\"{path}\" bukan format yang diterima, dikonversi ke: {formats}" #: ../fdroidserver/common.py #, python-brace-format @@ -105,7 +110,7 @@ msgstr "%(prog)s [opsi] url" #: /usr/lib/python3.7/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" -msgstr "" +msgstr "%(prog)s: galat: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format @@ -115,7 +120,7 @@ msgstr "%d terdapat masalah" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "%prog [options]" -msgstr "" +msgstr "%prog [opsi]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -126,13 +131,13 @@ msgstr "%r tidak bisa dipanggil" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" -msgstr "" +msgstr "%s bukan bidang build yang diterima" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "%s option does not take a value" -msgstr "" +msgstr "%s opsi tidak mengambil nilai" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" @@ -140,7 +145,7 @@ msgstr "'keypass' tidak ditemukan dalam config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" +msgstr "'keystore' adalah NONE dan 'smartcardoptions' kosong!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" @@ -354,7 +359,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Build a package from source" -msgstr "" +msgstr "Bangun paket dari sumber" #: ../fdroidserver/build.py msgid "Build all applications available" @@ -670,7 +675,7 @@ msgstr "" #: ../fdroid msgid "Dynamically scan APKs post build" -msgstr "" +msgstr "Pindai APK secara dinamis pasca build" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -979,7 +984,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Install built packages on devices" -msgstr "" +msgstr "Instal paket bawaan di perangkat" #: ../fdroidserver/install.py #, python-format @@ -1414,7 +1419,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Produce human-readable index.xml" -msgstr "" +msgstr "Buat index.xml yang bisa dibaca manusia" #: ../fdroidserver/import.py msgid "Project URL to import from." @@ -1591,7 +1596,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" -msgstr "" +msgstr "Tanda tangani indeks yang dibuat menggunakan update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" @@ -2391,7 +2396,7 @@ msgstr "opsi -%s memerlukan argumen" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s must not have an argument" -msgstr "" +msgstr "opsi --%s harus tidak mengandung argumen" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2424,7 +2429,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "positional arguments" -msgstr "" +msgstr "argumen posisi" #: ../fdroidserver/common.py #, python-brace-format @@ -2515,7 +2520,7 @@ msgstr "argumen berikut ini diperlukan: %s" #: /usr/lib/python3.7/argparse.py #, python-format msgid "unexpected option string: %s" -msgstr "" +msgstr "string opsi tak terduga: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From c8bbbaae118a76a97f1c0f37ddef602e7cdb11e0 Mon Sep 17 00:00:00 2001 From: signz signotorez Date: Mon, 6 Sep 2021 15:35:07 +0200 Subject: [PATCH 0489/2116] Translated using Weblate: Indonesian (id) by signz signotorez Currently translated at 13.5% (78 of 576 strings) Co-authored-by: signz signotorez Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/id/ Translation: F-Droid/F-Droid Server --- locale/id/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index 94608080..2d2340f2 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -1,6 +1,6 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# signz signotorez , 2020. +# signz signotorez , 2020, 2021. # Reza Almanda , 2021. msgid "" msgstr "" @@ -8,7 +8,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-03-13 19:36+0000\n" -"Last-Translator: Reza Almanda \n" +"Last-Translator: signz signotorez \n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" @@ -77,7 +77,7 @@ msgstr "\"{path}\" berisi {name}({version}) sekarang" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" -msgstr "" +msgstr "\"{path}\" ada tetapi s3cmd tidak terpasang!" #: ../fdroidserver/lint.py #, python-brace-format @@ -1592,7 +1592,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" -msgstr "" +msgstr "Tandai dan tempatkan paket ke dalam repo" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" From dbac5ec5c77e37ecf249bb1e245dd53d3967b75f Mon Sep 17 00:00:00 2001 From: hilariousperson Date: Mon, 6 Sep 2021 15:35:07 +0200 Subject: [PATCH 0490/2116] Translated using Weblate: French (fr) by hilariousperson Currently translated at 87.6% (505 of 576 strings) Co-authored-by: hilariousperson Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index b4c0233a..4f2aedd1 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -29,15 +29,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-02-05 14:41+0000\n" -"Last-Translator: Gavy \n" +"PO-Revision-Date: 2021-03-14 10:18+0000\n" +"Last-Translator: hilariousperson \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.5.2-dev\n" #: ../fdroidserver/common.py msgid "" @@ -1965,7 +1965,7 @@ msgstr "" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "" +msgstr "UpdateCheckName est défini sur l’ID d’application connu, il peut être supprimé" #: ../fdroidserver/deploy.py #, python-brace-format From 5d52d2ee13115c2b58174335609df7a2433d57be Mon Sep 17 00:00:00 2001 From: lilim Date: Mon, 6 Sep 2021 15:35:08 +0200 Subject: [PATCH 0491/2116] Translated using Weblate: French (fr) by lilim Currently translated at 87.6% (505 of 576 strings) Co-authored-by: lilim Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 4f2aedd1..4227b6be 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -24,13 +24,14 @@ # ButterflyOfFire , 2021. # Vincent Finance , 2021. # Gavy , 2021. +# lilim , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-03-14 10:18+0000\n" -"Last-Translator: hilariousperson \n" +"Last-Translator: lilim \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -1841,7 +1842,7 @@ msgstr "Version inconnue de aapt, peut causer des problèmes : " #: ../fdroidserver/lint.py msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "" +msgstr "Lien non lié - utiliser [http://foo.bar Titre du lien] ou [http://foo.bar]" #: ../fdroidserver/lint.py msgid "Unnecessary leading space" @@ -1863,7 +1864,7 @@ msgstr "Champ application non reconnu : " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" -msgstr "" +msgstr "Option de compilation '{build_flag}' non reconnue dans '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format From eb3eb5a3391d8f6e9c1e2a428f392f195c0bd836 Mon Sep 17 00:00:00 2001 From: gub Date: Mon, 6 Sep 2021 15:35:08 +0200 Subject: [PATCH 0492/2116] Translated using Weblate: French (fr) by gub Currently translated at 88.0% (507 of 576 strings) Translated using Weblate: French (fr) by gub Currently translated at 87.8% (506 of 576 strings) Co-authored-by: gub Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 4227b6be..1e78a62e 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -30,8 +30,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-03-14 10:18+0000\n" -"Last-Translator: lilim \n" +"PO-Revision-Date: 2021-03-14 10:24+0000\n" +"Last-Translator: gub \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2222,11 +2222,11 @@ msgstr "impossible de lire '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "" +msgstr "impossible d'analyser la spécification srclib (pas de référence spécifiée): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" +msgstr "impossible d'analyser la spécification srclib (trop de caractères '@'): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format From bbeeaab4ff4446d92e18d4c9e5c23a34952b2ce2 Mon Sep 17 00:00:00 2001 From: lilim Date: Mon, 6 Sep 2021 15:35:09 +0200 Subject: [PATCH 0493/2116] Translated using Weblate: French (fr) by lilim Currently translated at 88.8% (512 of 576 strings) Translated using Weblate: French (fr) by lilim Currently translated at 88.0% (507 of 576 strings) Co-authored-by: lilim Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 1e78a62e..c4846788 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -30,8 +30,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-03-14 10:24+0000\n" -"Last-Translator: gub \n" +"PO-Revision-Date: 2021-03-14 10:37+0000\n" +"Last-Translator: lilim \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2222,11 +2222,11 @@ msgstr "impossible de lire '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "impossible d'analyser la spécification srclib (pas de référence spécifiée): '{}'" +msgstr "impossible d'analyser la spécification srclib (pas de référence spécifiée) : '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "impossible d'analyser la spécification srclib (trop de caractères '@'): '{}'" +msgstr "impossible d'analyser la spécification srclib (trop de caractères '@') : '{}'" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2246,7 +2246,7 @@ msgstr "déploiement des journaux de compilation sur « {path} »" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" -msgstr "" +msgstr "log du processus {path} déployé vers {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2263,8 +2263,8 @@ msgstr "binaire exécutable, possiblement du code" #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "argument %s requis" +msgstr[1] "arguments %s requis" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2319,11 +2319,11 @@ msgstr "archive GZIP" #: /usr/lib/python3.7/argparse.py #, python-format msgid "ignored explicit argument %r" -msgstr "" +msgstr "argument explicite %r ignoré" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" -msgstr "" +msgstr "index-v1 doit avoir une signature, utilisez `fdroid signindex` pour la créer !" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2346,7 +2346,7 @@ msgstr "choix non valide : %(value)r (choisissez parmi %(choices)s)" #: /usr/lib/python3.7/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" -msgstr "" +msgstr "valeur conflict_resolution invalide : %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From fc28ead082f2d64126f08eba7629ec02bb1802ae Mon Sep 17 00:00:00 2001 From: gub Date: Mon, 6 Sep 2021 15:35:09 +0200 Subject: [PATCH 0494/2116] Translated using Weblate: French (fr) by gub Currently translated at 89.2% (514 of 576 strings) Translated using Weblate: French (fr) by gub Currently translated at 88.8% (512 of 576 strings) Co-authored-by: gub Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index c4846788..757b90f4 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -30,8 +30,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-03-14 10:37+0000\n" -"Last-Translator: lilim \n" +"PO-Revision-Date: 2021-03-14 10:41+0000\n" +"Last-Translator: gub \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2346,7 +2346,7 @@ msgstr "choix non valide : %(value)r (choisissez parmi %(choices)s)" #: /usr/lib/python3.7/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" -msgstr "valeur conflict_resolution invalide : %r" +msgstr "valeur de conflict_resolution invalide : %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2400,7 +2400,7 @@ msgstr "aucun information de version n'a été trouvée !" #: /usr/lib/python3.7/argparse.py #, python-format msgid "not allowed with argument %s" -msgstr "" +msgstr "non permis avec les arguments %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From 13d220ffd489d855e7b36debc4dbb0fa8a11c36f Mon Sep 17 00:00:00 2001 From: lilim Date: Mon, 6 Sep 2021 15:35:10 +0200 Subject: [PATCH 0495/2116] Translated using Weblate: French (fr) by lilim Currently translated at 89.2% (514 of 576 strings) Co-authored-by: lilim Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 757b90f4..e88f23cd 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -30,8 +30,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-03-14 10:41+0000\n" -"Last-Translator: gub \n" +"PO-Revision-Date: 2021-03-14 10:42+0000\n" +"Last-Translator: lilim \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2375,7 +2375,7 @@ msgstr "le miroir «%s» ne se termine pas par «fdroid» !" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "mutually exclusive arguments must be optional" -msgstr "" +msgstr "les arguments qui s'excluent mutuellement doivent être optionnels" #: ../fdroidserver/mirror.py #, fuzzy, python-brace-format From b10e80c34177f73c06cd8d1b7475f4bd2722c74d Mon Sep 17 00:00:00 2001 From: gub Date: Mon, 6 Sep 2021 15:35:10 +0200 Subject: [PATCH 0496/2116] Translated using Weblate: French (fr) by gub Currently translated at 89.7% (517 of 576 strings) Translated using Weblate: French (fr) by gub Currently translated at 89.5% (516 of 576 strings) Translated using Weblate: French (fr) by gub Currently translated at 89.4% (515 of 576 strings) Co-authored-by: gub Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index e88f23cd..484ca08c 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -30,8 +30,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-03-14 10:42+0000\n" -"Last-Translator: lilim \n" +"PO-Revision-Date: 2021-03-14 11:08+0000\n" +"Last-Translator: gub \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2406,16 +2406,16 @@ msgstr "non permis avec les arguments %s" #: /usr/lib/python3.7/argparse.py #, python-format msgid "one of the arguments %s is required" -msgstr "" +msgstr "un des arguments %s est requis" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "only accepts strings, lists, and tuples" -msgstr "" +msgstr "accepte uniquement les chaînes de caractères, listes et tuples." #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" +msgstr "option %s : Si vous voulez vraiment installer toutes les applications signées, utilisez --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py From 23c4b592e1db4fc034f5db4cb7957cbb8409cba1 Mon Sep 17 00:00:00 2001 From: lilim Date: Mon, 6 Sep 2021 15:35:11 +0200 Subject: [PATCH 0497/2116] Translated using Weblate: French (fr) by lilim Currently translated at 89.7% (517 of 576 strings) Co-authored-by: lilim Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 484ca08c..c985bb38 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -31,7 +31,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-03-14 11:08+0000\n" -"Last-Translator: gub \n" +"Last-Translator: lilim \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2410,7 +2410,7 @@ msgstr "un des arguments %s est requis" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "only accepts strings, lists, and tuples" -msgstr "accepte uniquement les chaînes de caractères, listes et tuples." +msgstr "accepte uniquement les chaînes de caractères, listes et tuples" #: ../fdroidserver/install.py #, python-format From ce9a82655e14a2e85c10bdb062b2b7924442fdbd Mon Sep 17 00:00:00 2001 From: gub Date: Mon, 6 Sep 2021 15:35:11 +0200 Subject: [PATCH 0498/2116] Translated using Weblate: French (fr) by gub Currently translated at 90.2% (520 of 576 strings) Translated using Weblate: French (fr) by gub Currently translated at 89.9% (518 of 576 strings) Co-authored-by: gub Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index c985bb38..af31bcef 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -30,8 +30,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-03-14 11:08+0000\n" -"Last-Translator: lilim \n" +"PO-Revision-Date: 2021-03-14 11:15+0000\n" +"Last-Translator: gub \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2427,7 +2427,7 @@ msgstr "option %s : valeur %s non valide : %r" #: /usr/lib/python3.7/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" +msgstr "option %s : choix non valide : %r (choisissez depuis %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2483,7 +2483,7 @@ msgstr "arguments de position" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" -msgstr "" +msgstr "le déploiement du journal de procédure {path} à {dest} a echoué !" #: ../fdroidserver/signatures.py #, python-brace-format From 4e2df6012279496f3f62c415ea8e2f98392ba6b1 Mon Sep 17 00:00:00 2001 From: lilim Date: Mon, 6 Sep 2021 15:35:12 +0200 Subject: [PATCH 0499/2116] Translated using Weblate: French (fr) by lilim Currently translated at 90.2% (520 of 576 strings) Co-authored-by: lilim Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index af31bcef..210a4a81 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -31,7 +31,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-03-14 11:15+0000\n" -"Last-Translator: gub \n" +"Last-Translator: lilim \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2473,7 +2473,7 @@ msgstr "arguments optionnels" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" -msgstr "" +msgstr "en train d'écraser l'existant {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From 136465f533aa1a514ac6698d7806adeb09aa6145 Mon Sep 17 00:00:00 2001 From: gub Date: Mon, 6 Sep 2021 15:35:12 +0200 Subject: [PATCH 0500/2116] Translated using Weblate: French (fr) by gub Currently translated at 90.4% (521 of 576 strings) Co-authored-by: gub Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 210a4a81..cff3042e 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -30,8 +30,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-03-14 11:15+0000\n" -"Last-Translator: lilim \n" +"PO-Revision-Date: 2021-03-14 11:19+0000\n" +"Last-Translator: gub \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2488,7 +2488,7 @@ msgstr "le déploiement du journal de procédure {path} à {dest} a echoué !" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "" +msgstr "refusez de télécharger via une connexion HTTP non sécurisée (utilisez HTTPS ou précisez --no-https-check) : {apkfilename}" #: ../fdroidserver/signatures.py #, python-brace-format From 04850ace3b902176a0d82457715b064e08b57003 Mon Sep 17 00:00:00 2001 From: lilim Date: Mon, 6 Sep 2021 15:35:13 +0200 Subject: [PATCH 0501/2116] Translated using Weblate: French (fr) by lilim Currently translated at 91.4% (527 of 576 strings) Translated using Weblate: French (fr) by lilim Currently translated at 90.4% (521 of 576 strings) Co-authored-by: lilim Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index cff3042e..ca4a399a 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -30,8 +30,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-03-14 11:19+0000\n" -"Last-Translator: gub \n" +"PO-Revision-Date: 2021-03-15 02:09+0000\n" +"Last-Translator: lilim \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2483,12 +2483,12 @@ msgstr "arguments de position" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" -msgstr "le déploiement du journal de procédure {path} à {dest} a echoué !" +msgstr "le déploiement du journal du processus {path} vers {dest} a echoué !" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "refusez de télécharger via une connexion HTTP non sécurisée (utilisez HTTPS ou précisez --no-https-check) : {apkfilename}" +msgstr "refuser le téléchargement via une connexion HTTP non sécurisée (utilisez HTTPS ou précisez --no-https-check) : {apkfilename}" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2498,7 +2498,7 @@ msgstr "" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "" +msgstr "repo_icon \"repo/icons/%s\" n'existe pas, génération d'une icône de substitution." #: ../fdroidserver/index.py #, python-format @@ -2558,7 +2558,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" -msgstr "" +msgstr "valeur d'horodatage donnée '{timestamp}' n'est pas un horodatage au format Unix" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2576,7 +2576,7 @@ msgstr "chaîne d'option inattendue : %s" #: /usr/lib/python3.7/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "" +msgstr "parser inconnu %(parser_name)r (choix: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2667,12 +2667,12 @@ msgstr "{appid} manque de {name}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" -msgstr "" +msgstr "{appid} : Bibliothèque externe (extlib) {path} inconnue dans la version '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" -msgstr "" +msgstr "{appid} : pas de versions spécifiées, s'exécute à partir de l'état présent du code source" #: ../fdroidserver/lint.py #, python-brace-format @@ -2702,7 +2702,7 @@ msgstr "{file} est vide ou corrompu !" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{path}\" does not exist! Correct it in config.yml." -msgstr "" +msgstr "{name} \"{path}\" n'existe pas! Corrigez le dans config.yml." #: ../fdroidserver/update.py #, python-brace-format From ee242f21492422fd6aeb2a23724c3cd3250f50f7 Mon Sep 17 00:00:00 2001 From: Liu Tao Date: Mon, 6 Sep 2021 15:35:13 +0200 Subject: [PATCH 0502/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Liu Tao Currently translated at 39.0% (225 of 576 strings) Co-authored-by: Liu Tao Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 518316f8..2a327566 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -14,15 +14,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-03-06 21:40+0000\n" -"Last-Translator: 世界 \n" +"PO-Revision-Date: 2021-03-21 07:29+0000\n" +"Last-Translator: Liu Tao \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.5.1\n" +"X-Generator: Weblate 4.5.2-dev\n" #: ../fdroidserver/common.py msgid "" @@ -539,25 +539,25 @@ msgstr "创建缺少的主干元数据文件" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Created new container \"{name}\"" -msgstr "" +msgstr "创建新容器 \"{name}\"" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." -msgstr "" +msgstr "创建用于配置 s3cmd 的 \"{path}\"。" #: ../fdroidserver/publish.py msgid "Creating log directory" -msgstr "" +msgstr "创建日志目录" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Creating new S3 bucket: {url}" -msgstr "" +msgstr "创建新的 S3 存储桶:{url}" #: ../fdroidserver/publish.py msgid "Creating output directory" -msgstr "" +msgstr "创建输出目录" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" @@ -566,11 +566,11 @@ msgstr "" #: ../fdroidserver/import.py ../fdroidserver/verify.py #: ../fdroidserver/publish.py msgid "Creating temporary directory" -msgstr "" +msgstr "创建临时目录" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" -msgstr "" +msgstr "创建未签名的索引以准备签名" #: ../fdroidserver/lint.py #, python-brace-format From af3ae8a4a3b72cf251a71e078119b6284158b0f0 Mon Sep 17 00:00:00 2001 From: Germe the fur star Date: Mon, 6 Sep 2021 15:35:14 +0200 Subject: [PATCH 0503/2116] Translated using Weblate: Spanish (Argentina) (es_AR) by Germe the fur star Currently translated at 20.4% (118 of 576 strings) Translated using Weblate: Spanish (es) by Germe the fur star Currently translated at 100.0% (576 of 576 strings) Translated using Weblate: Spanish (Argentina) (es_AR) by Germe the fur star Currently translated at 20.1% (116 of 576 strings) Co-authored-by: Germe the fur star Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es_AR/ Translation: F-Droid/F-Droid Server --- locale/es/LC_MESSAGES/fdroidserver.po | 29 +++++++++--------------- locale/es_AR/LC_MESSAGES/fdroidserver.po | 23 ++++++++++++------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 1844e57f..b7ae55e5 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -8,20 +8,21 @@ # Fioddor Superconcentrado , 2021. # Adolfo Jayme Barrientos , 2021. # mondstern , 2021. +# Germe the fur star , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-03-10 21:51+0000\n" -"Last-Translator: mondstern \n" +"PO-Revision-Date: 2021-04-03 20:26+0000\n" +"Last-Translator: Germe the fur star \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.5.2-dev\n" +"X-Generator: Weblate 4.6-dev\n" #: ../fdroidserver/common.py msgid "" @@ -48,7 +49,6 @@ msgstr "" "Clave pública SSH que se usará como clave de despliegue:" #: ../fdroidserver/nightly.py -#, fuzzy msgid "" "\n" "SSH public key to be used as deploy key:" @@ -452,9 +452,9 @@ msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, arc msgstr "Comprobando la operación de archivo para {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Comprobando la operación de archivo para {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Comprobando la operación de archivo para {appid} - APKs:{integer}, versiones mantenidas:{keep}, arquitecturas de apk:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -1741,15 +1741,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Estas son aplicaciones del repositorio principal que se han archivado." #: ../fdroidserver/common.py -#, fuzzy msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" -"\n" -" Este es un repositorio de aplicaciones para usar con FDroid. Las aplicaciones en este\n" -" repositorio son binarios oficiales construidos por los desarrolladores originales de la \n" -" aplicación, o son binarios creados a partir de su código fuente por f-droid.org \n" -" utilizando las herramientas de https://gitlab.com/fdroid.\n" -" " +msgstr "Este es un repositorio de aplicaciones para usar con F-Droid. Las aplicaciones en este repositorio son binarios oficiales construidos por los desarrolladores originales de la aplicación, o son binarios creados a partir de su código fuente por f-droid.org utilizando las herramientas de https://gitlab.com/fdroid." #: ../fdroidserver/import.py #, python-format @@ -2477,9 +2470,9 @@ msgid "refuse downloading via insecure http connection (use https or specify --n msgstr "rechazar descarga por conexión HTTP insegura (use HTTPS o especifique --no-https-check): {apkfilename}" #: ../fdroidserver/index.py -#, fuzzy, python-format +#, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "No existe repo_icon %s. Reservando espacio." +msgstr "repo_icon \"repo/icons/%s\" no existe, generando placeholder." #: ../fdroidserver/index.py #, python-format @@ -2685,9 +2678,9 @@ msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "¡{name} \"{path}\" no existe! Corrijalo en config.yml." #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "¡{name} \"{path}\" no existe! Corrijalo en config.yml." +msgstr "¡{name} \"{section}/icons/{path}\" no existe! Corrijalo en config.yml." #: ../fdroidserver/common.py #, python-brace-format diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index 0384405f..f8ea65b6 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -5,20 +5,21 @@ # riveravaldez , 2020. # Eduardo Rodrigues , 2020. # Lilian Sosa , 2021. +# Germe the fur star , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-15 13:24+0000\n" -"Last-Translator: Lilian Sosa \n" +"PO-Revision-Date: 2021-04-10 21:26+0000\n" +"Last-Translator: Germe the fur star \n" "Language-Team: Spanish (Argentina) \n" "Language: es_AR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.6-dev\n" #: ../fdroidserver/common.py msgid "" @@ -29,6 +30,12 @@ msgid "" " tools on https://gitlab.com/fdroid.\n" " " msgstr "" +"\n" +" Este es un repositorio de apps para ser usado con FDroid. Las aplicaciones\n" +" en este repositorio son tanto binarios oficiales construidos por el autor original\n" +" de la aplicacion, o son binarios construidos desde la fuente por f-droid.org usando\n" +" herramientas en https://gitlab.com/fdroid.\n" +" " #: ../fdroidserver/nightly.py msgid "" @@ -2493,7 +2500,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "shared library" -msgstr "" +msgstr "librería compartida" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2529,12 +2536,12 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "static library" -msgstr "" +msgstr "librería estática" #: ../fdroidserver/common.py #, python-brace-format msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" -msgstr "" +msgstr "valor marca de tiempo suministrado'{timestamp}' no es un marca de tiempo de unix" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2558,7 +2565,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "unrecognized arguments: %s" -msgstr "" +msgstr "argumentos no reconocidos: %s" #: ../fdroidserver/common.py #, python-brace-format @@ -2607,7 +2614,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " -msgstr "" +msgstr "el AndroidManifest.xml del {apkfilename} tiene una mala fecha: " #: ../fdroidserver/update.py #, python-brace-format From 6bea5cd6ed0025ddb32a8421606415a5257d638a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Mon, 6 Sep 2021 15:35:14 +0200 Subject: [PATCH 0504/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Norwe?= =?UTF-8?q?gian=20Bokm=C3=A5l=20(nb=5FNO)=20by=20Allan=20Nordh=C3=B8y=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 58.5% (337 of 576 strings) Co-authored-by: Allan Nordhøy Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/nb_NO/ Translation: F-Droid/F-Droid Server --- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index 977e9045..54d50f24 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -1,13 +1,13 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. -# Allan Nordhøy , 2020. +# Allan Nordhøy , 2020, 2021. # Hans-Christoph Steiner , 2020. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2020-10-14 09:28+0000\n" +"PO-Revision-Date: 2021-04-12 20:32+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Norwegian Bokmål \n" "Language: nb_NO\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.3-dev\n" +"X-Generator: Weblate 4.6-dev\n" #: ../fdroidserver/common.py msgid "" @@ -296,9 +296,9 @@ msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "Android-SDK '{path}' har ikke '{dirname}' installert." #: ../fdroidserver/init.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "Fant ikke Android-SDK!" +msgstr "Fant ikke Android-SDK i {path}!" #: ../fdroidserver/common.py msgid "Android SDK not found!" @@ -315,9 +315,9 @@ msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK-stien '{path}' er ikke ei mappe." #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "Fant ikke Android-SDK!" +msgstr "Fant ikke Android-SDK-verktøyet {cmd}!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -500,7 +500,7 @@ msgstr "Fant ikke \"{path}\" for fjerning derav" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "Kunne ikke åpne APK-fil for analyse" +msgstr "Kunne ikke åpne APK {path} for analyse: " #: ../fdroidserver/common.py #, python-brace-format @@ -2750,7 +2750,7 @@ msgstr "{name} \"{path}\" finnes ikke. Rett det i config.yml." #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "{name} \"{path}\" finnes ikke. Rett det i config.yml." +msgstr "{name} «{path}» finnes ikke. Rett det i config.yml." #: ../fdroidserver/common.py #, python-brace-format From 6851907fbc5fa20a5b8e1f2f2caed1fdb4797697 Mon Sep 17 00:00:00 2001 From: mondstern Date: Mon, 6 Sep 2021 15:35:15 +0200 Subject: [PATCH 0505/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Norwe?= =?UTF-8?q?gian=20Bokm=C3=A5l=20(nb=5FNO)=20by=20mondstern=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 59.0% (340 of 576 strings) Co-authored-by: mondstern Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/nb_NO/ Translation: F-Droid/F-Droid Server --- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index 54d50f24..18b4af63 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -2,20 +2,21 @@ # Copyright (C) YEAR Free Software Foundation, Inc. # Allan Nordhøy , 2020, 2021. # Hans-Christoph Steiner , 2020. +# mondstern , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-04-12 20:32+0000\n" -"Last-Translator: Allan Nordhøy \n" +"PO-Revision-Date: 2021-04-21 17:29+0000\n" +"Last-Translator: mondstern \n" "Language-Team: Norwegian Bokmål \n" "Language: nb_NO\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.6-dev\n" +"X-Generator: Weblate 4.7-dev\n" #: ../fdroidserver/common.py msgid "" @@ -363,7 +364,7 @@ msgstr "Forgrening '{branch}' brukt som innsendelse i srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" -msgstr "" +msgstr "Brutt symlink: {path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Build a package from source" @@ -627,7 +628,7 @@ msgstr "Beskrivelse av lengde {length} overstiger {limit} tegngrensen" #: ../fdroidserver/import.py msgid "Do not add 'disable:' to the generated build entries" -msgstr "" +msgstr "Ikke legg \"deaktiver:\" til den genererte bygge oppføringer" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" @@ -860,7 +861,7 @@ msgstr "Tving gjennom byggstans etter {0} sek. tidsavbrudd." #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." -msgstr "" +msgstr "Force skanning av funksjonshemmede apps og bygger." #: ../fdroidserver/update.py #, fuzzy, python-brace-format From c0deb873795d38bd1072adcbf86042a05dee5ea2 Mon Sep 17 00:00:00 2001 From: ifurther Date: Mon, 6 Sep 2021 15:35:15 +0200 Subject: [PATCH 0506/2116] Translated using Weblate: Chinese (Traditional) (zh_Hant) by ifurther Currently translated at 81.2% (468 of 576 strings) Co-authored-by: ifurther Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hant/ Translation: F-Droid/F-Droid Server --- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 14cf0a6f..d344b4cd 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -3,20 +3,21 @@ # Jeff Huang , 2020. # Hans-Christoph Steiner , 2020, 2021. # NightFeather , 2020. +# ifurther , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-28 22:09+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2021-04-25 12:32+0000\n" +"Last-Translator: ifurther \n" "Language-Team: Chinese (Traditional) \n" "Language: zh_Hant\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.7-dev\n" #: ../fdroidserver/common.py msgid "" @@ -34,16 +35,15 @@ msgid "" "SSH Public Key to be used as Deploy Key:" msgstr "" "\n" -"SSH 公鑰被用來作為佈署密鑰:" +"SSH 公鑰被用來作為部署密鑰:" #: ../fdroidserver/nightly.py -#, fuzzy msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" "\n" -"SSH 公鑰被用來作為佈署密鑰:" +"SSH 公鑰被用來作為部署密鑰:" #: ../fdroidserver/nightly.py #, python-brace-format @@ -61,7 +61,7 @@ msgstr "\"%s 1/\" 沒有符合的中介資料檔案!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" +msgstr "\"repo_pubkey\" 需要在使用--nosign參數時寫在config.yml 檔案裡!" #: ../fdroidserver/install.py #, fuzzy, python-brace-format @@ -96,7 +96,7 @@ msgstr "\"{path}\" 不是可接受的格式,轉換成: {formats}" #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" -msgstr "" +msgstr "\"{url}\" 不是一個有效的網址!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2678,7 +2678,7 @@ msgstr "{name} \"{path}\" 不存在! 請更正 config.yml." #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "{name} \"{path}\" 不存在! 請更正 config.yml." +msgstr "{name} \"{section}/icons/{path}\" 不存在! 請檢查 \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format From 010d318ab4f418d6fb653c85a9f7fb727883de23 Mon Sep 17 00:00:00 2001 From: Stiffen Date: Mon, 6 Sep 2021 15:35:16 +0200 Subject: [PATCH 0507/2116] Translated using Weblate: Chinese (Traditional) (zh_Hant) by Stiffen Currently translated at 81.0% (467 of 576 strings) Translated using Weblate: Chinese (Traditional) (zh_Hant) by Stiffen Currently translated at 81.7% (471 of 576 strings) Translated using Weblate: Chinese (Traditional) (zh_Hant) by Stiffen Currently translated at 81.7% (471 of 576 strings) Translated using Weblate: Chinese (Traditional) (zh_Hant) by Stiffen Currently translated at 81.4% (469 of 576 strings) Co-authored-by: Stiffen Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hant/ Translation: F-Droid/F-Droid Server --- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 327 ++++++++++++--------- 1 file changed, 187 insertions(+), 140 deletions(-) diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index d344b4cd..37d26619 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -4,13 +4,14 @@ # Hans-Christoph Steiner , 2020, 2021. # NightFeather , 2020. # ifurther , 2021. +# Stiffen , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-04-25 12:32+0000\n" -"Last-Translator: ifurther \n" +"PO-Revision-Date: 2021-05-19 11:33+0000\n" +"Last-Translator: Stiffen \n" "Language-Team: Chinese (Traditional) \n" "Language: zh_Hant\n" "MIME-Version: 1.0\n" @@ -20,6 +21,7 @@ msgstr "" "X-Generator: Weblate 4.7-dev\n" #: ../fdroidserver/common.py +#, fuzzy msgid "" "\n" " This is a repository of apps to be used with FDroid. Applications in this\n" @@ -28,6 +30,9 @@ msgid "" " tools on https://gitlab.com/fdroid.\n" " " msgstr "" +"\n" +" 這是一個和F-Droid配套使用的軟體庫。此軟體庫中包含由程式原開發者編譯製作而成的二進制包和由 fdroid.org 使用 https://gitlab.com/fdroid 上的開發者工具編譯製作而成的二進制包。\n" +" " #: ../fdroidserver/nightly.py msgid "" @@ -64,9 +69,9 @@ msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "\"repo_pubkey\" 需要在使用--nosign參數時寫在config.yml 檔案裡!" #: ../fdroidserver/install.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "'{apkfilename}' 已安裝在 {dev} 上。" +msgstr "\"{apkfilename}\" 已經安裝在 {dev} 上了。" #: ../fdroidserver/update.py #, python-brace-format @@ -112,9 +117,9 @@ msgstr "%(prog)s [選項]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py -#, python-format +#, fuzzy, python-format msgid "%(prog)s: error: %(message)s\n" -msgstr "%(prog)s:錯誤:%(message)s\n" +msgstr "%(prog)s: 錯誤: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format @@ -123,6 +128,7 @@ msgstr "發現 %d 個問題" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py +#, fuzzy msgid "%prog [options]" msgstr "%prog [選項]" @@ -149,7 +155,7 @@ msgstr "config.yml 找不到 'keypass'!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" +msgstr "沒有'keystore', 而且'smartcardoptions'是空的!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" @@ -275,16 +281,19 @@ msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "還要提醒格式化問題,如 rewritemeta -l" #: ../fdroidserver/scanner.py +#, fuzzy msgid "Android AAR library" -msgstr "" +msgstr "Android AAR 庫" #: ../fdroidserver/scanner.py +#, fuzzy msgid "Android APK file" -msgstr "" +msgstr "Android APK 文件" #: ../fdroidserver/scanner.py +#, fuzzy msgid "Android DEX code" -msgstr "" +msgstr "Android DEX 碼" #: ../fdroidserver/common.py ../fdroidserver/build.py #, python-brace-format @@ -311,9 +320,9 @@ msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK 路徑 '{path}' 不是目錄資料夾!" #: ../fdroidserver/common.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "" +msgstr "找到 Android SDK 工具 {cmd} 了!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -357,9 +366,9 @@ msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "分支 '{branch}' 用於 srclib '{srclib}' 的提交" #: ../fdroidserver/update.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Broken symlink: {path}" -msgstr "" +msgstr "無效的連結:{path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Build a package from source" @@ -410,7 +419,7 @@ msgstr "無法解析 {appid} id" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" -msgstr "" +msgstr "無法重寫到 \"{path}\"" #: ../fdroidserver/rewritemeta.py msgid "Cannot use --list and --to at the same time" @@ -453,22 +462,23 @@ msgid "Comma separated list of categories." msgstr "以逗號分隔類別清單。" #: ../fdroid ../fdroidserver/__main__.py -#, c-format, python-format +#, c-format, fuzzy, python-format msgid "Command '%s' not recognised.\n" -msgstr "無法識別指令「%s」。\n" +msgstr "無法識別指令 '%s' 。\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" msgstr "提交變更" #: ../fdroidserver/__main__.py +#, fuzzy msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." -msgstr "" +msgstr "衝突的參數:無法同時使用 '--verbose' 和 '--quiet' 參數。" #: ../fdroidserver/common.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "衝突的配置文件! 使用新文件 {newfile}, 忽略舊文件 {oldfile} !" #: ../fdroidserver/common.py #, python-brace-format @@ -478,12 +488,12 @@ msgstr "在您的系統上找不到 '{command}'" #: ../fdroidserver/import.py #, fuzzy msgid "Could not find latest version code" -msgstr "找到不最新版的代碼" +msgstr "找不到最新版的代碼" #: ../fdroidserver/import.py #, fuzzy msgid "Could not find latest version name" -msgstr "找不到最新版本名稱" +msgstr "找不到最新的版本名稱" #: ../fdroidserver/update.py #, python-brace-format @@ -496,15 +506,15 @@ msgid "Could not open APK {path} for analysis: " msgstr "無法開啟 APK 檔{path}案作分析 : " #: ../fdroidserver/common.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" -msgstr "" +msgstr "無法解析大小 (\"{size}\") , \"{type}\" 是錯的" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/import.py #, fuzzy msgid "Couldn't find Application ID" -msgstr "找不到包 ID" +msgstr "找不到應用的 ID" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py @@ -582,14 +592,14 @@ msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "從軟體庫刪除缺少中介資料的 APK 和/或 OBB" #: ../fdroidserver/deploy.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "" +msgstr "正在刪除檔案, 軟體庫已經滿了({size} / {limit})" #: ../fdroidserver/deploy.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "" +msgstr "正在刪除 git-mirror 的歷史檔案, 軟體庫已經滿了 ({size} / {limit})" #: ../fdroidserver/update.py #, python-brace-format @@ -616,8 +626,9 @@ msgid "Description of length {length} is over the {limit} char limit" msgstr "描述的長度 {length} 已超過 {limit} 個字符限制" #: ../fdroidserver/import.py +#, fuzzy msgid "Do not add 'disable:' to the generated build entries" -msgstr "" +msgstr "不要在生成的編譯路徑中添加 'disable:'" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" @@ -685,8 +696,9 @@ msgid "Dynamically scan APKs post build" msgstr "動態掃描建置後的 APK" #: ../fdroidserver/__main__.py +#, fuzzy msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" +msgstr "ERROR: 子命令 \"server\" 已經被移除了, 請使用 \"deploy\" !" #: ../fdroidserver/mirror.py msgid "" @@ -706,9 +718,9 @@ msgid "Empty build flag at {linedesc}" msgstr "{linedesc} 空白的編譯標誌" #: ../fdroidserver/__main__.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "" +msgstr "編碼已被設置為 '{enc}' fdroid 可能出現了編碼問題。 為了達到較好的效果, 請將編碼設置為 'UTF-8'。" #: ../fdroidserver/init.py #, python-format @@ -720,9 +732,9 @@ msgstr "" "> " #: ../fdroidserver/common.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "配置文件 {configname} 中的 環境變量 {var} 還沒有設置 !" #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py @@ -741,7 +753,7 @@ msgstr "自 APKs 捽取出簽名" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Failed copying {path}: {error}" -msgstr "讀取 {path} 失敗:錯誤訊息{error}" +msgstr "讀取路徑 {path} 失敗:錯誤訊息{error}" #: ../fdroidserver/signatures.py #, python-brace-format @@ -805,9 +817,9 @@ msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "抓取 '{apkfilename}' 的簽署資料 -> '{sigdir}'" #: ../fdroidserver/update.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "File disappeared while processing it: {path}" -msgstr "" +msgstr "檔案 「路徑: {path}」在處理過程中消失了!" #: ../fdroidserver/verify.py ../fdroidserver/stats.py ../fdroidserver/update.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/build.py @@ -839,8 +851,9 @@ msgid "Force halting build after {0} sec timeout!" msgstr "在 {0} 秒超時後強制停止構建!" #: ../fdroidserver/scanner.py +#, fuzzy msgid "Force scan of disabled apps and builds." -msgstr "" +msgstr "強制掃描被禁用的軟體和二進制檔案 。" #: ../fdroidserver/update.py #, python-brace-format @@ -848,9 +861,9 @@ msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" msgstr "找到 \"{path}\" 圖像不包含 \"{name}\" 應用的中介資料!" #: ../fdroidserver/update.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" -msgstr "" +msgstr "找到了 \"{name}\" 的錯誤的籌款檔案 \"{path}\":" #: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" @@ -890,9 +903,9 @@ msgid "Found non-file at %s" msgstr "%s 中找到 non-file" #: ../fdroidserver/deploy.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Found {apkfilename} at {url}" -msgstr "" +msgstr "在鏈接 {url} 找到了Android軟體程式包 {apkfilename} 。" #: ../fdroidserver/update.py #, python-brace-format @@ -938,23 +951,24 @@ msgid "HTTPS must be used with Subversion URLs!" msgstr "HTTPS 必須與 Subversion 網址一起使用!" #: ../fdroidserver/deploy.py +#, fuzzy msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "" +msgstr "如果一個 git mirror 變得太大, 允許刪除該 git mirror 的檔案。" #: ../fdroidserver/deploy.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "" +msgstr "如果本次上傳失敗, 嘗試手動上傳至 {url} 。" #: ../fdroidserver/metadata.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "" +msgstr "忽略 '{metapath}' 中的 '{field}' , 因為它已經過時了。" #: ../fdroidserver/update.py -#, python-format +#, fuzzy, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" -msgstr "" +msgstr "忽略文檔 FUNDING.yml , 文檔大小超過 2048: %s 。" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -975,16 +989,19 @@ msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "包含 APKs 其簽名為有弱點的演算法,如 MD5" #: ../fdroidserver/mirror.py +#, fuzzy msgid "Include the PGP signature .asc files in the mirror" -msgstr "" +msgstr "在鏡像中加入 PGP 簽名和 .asc 文檔。" #: ../fdroidserver/mirror.py +#, fuzzy msgid "Include the build logs in the mirror" -msgstr "" +msgstr "在鏡像中加入編譯紀錄。" #: ../fdroidserver/mirror.py +#, fuzzy msgid "Include the source tarballs in the mirror" -msgstr "" +msgstr "在鏡像中加入軟體的源代碼包。" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1001,7 +1018,7 @@ msgstr "在裝置上安裝構建套件包" #: ../fdroidserver/install.py #, fuzzy, python-format msgid "Installing %s..." -msgstr "安裝 %s…" +msgstr "正在安裝中 %s…" #: ../fdroidserver/install.py #, python-format @@ -1011,7 +1028,7 @@ msgstr "安裝 %s…" #: ../fdroidserver/install.py #, fuzzy, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." -msgstr "在 {dev} 安裝 '{apkfilename}' …" +msgstr "正在將軟體 '{apkfilename}' 安裝到設備 {dev} 上 ..." #: ../fdroidserver/install.py #, python-brace-format @@ -1032,9 +1049,9 @@ msgid "Invalid VercodeOperation: {field}" msgstr "無效的 VercodeOperation:{field}" #: ../fdroidserver/common.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Invalid application ID {appid}" -msgstr "" +msgstr "無效的 application ID {appid} 。" #: ../fdroidserver/metadata.py #, python-format @@ -1089,19 +1106,19 @@ msgid "Invalid redirect to non-HTTPS: {before} -> {after} " msgstr "無效的重新導向到非 HTTPS:{before}->{after}。 " #: ../fdroidserver/metadata.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" -msgstr "" +msgstr "無效的 scrlib metadata: 檔案 '{file}' 不存在。" #: ../fdroidserver/metadata.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" -msgstr "" +msgstr "無效的 scrlib metadata: 無法解析檔案 '{file}' 。" #: ../fdroidserver/metadata.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "" +msgstr "無效的 scrlib metadata: 檔案 '{file}' 裡有未知的密鑰 '{key}'。" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1119,8 +1136,9 @@ msgid "JAR signature verified: {path}" msgstr "JAR 簽名已驗證:{path}" #: ../fdroidserver/scanner.py +#, fuzzy msgid "Java JAR file" -msgstr "" +msgstr "Java JAR 檔案" #: ../fdroidserver/publish.py ../fdroidserver/update.py #: ../fdroidserver/mirror.py @@ -1128,8 +1146,9 @@ msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "找不到 Java JDK!請安裝在標準的位置或是設定 java_paths!" #: ../fdroidserver/scanner.py +#, fuzzy msgid "Java compiled class" -msgstr "" +msgstr "Java .class 檔案" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" @@ -1146,7 +1165,7 @@ msgstr "金鑰庫的簽署金鑰:\t" #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "最近採用的提交 '{commit}' 似乎是一個標籤,但更新的檢查模式為 '{ucm}'" +msgstr "最近採用的提交 '{commit}' 似乎是一個標籤,但是更新的檢查模式為 '{ucm}'" #: ../fdroidserver/lint.py #, fuzzy @@ -1178,8 +1197,9 @@ msgid "Malformed serverwebroot line:" msgstr "異常的 serverwebroot 行:" #: ../fdroidserver/mirror.py +#, fuzzy msgid "Mirror the full repo and archive, all file types." -msgstr "" +msgstr "保存整個軟體庫和檔案的副本, 所有的檔案格式 。" #: ../fdroidserver/gpgsign.py msgid "Missing output directory" @@ -1214,7 +1234,7 @@ msgstr "{linedesc} 沒有指定給 {versionName} 的提交" #: ../fdroidserver/common.py #, fuzzy msgid "No config.yml found, using defaults." -msgstr "找不到 'config.yml',使用預設。" +msgstr "找不到檔案 'config.yml',使用預設。" #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1227,7 +1247,7 @@ msgstr "無可用的 git 子模組" #: ../fdroidserver/import.py #, fuzzy msgid "No gradle project could be found. Specify --subdir?" -msgstr "找無 android 或 kivy 專案。指定子目錄嗎?" +msgstr "找不到任何 gradle 專案。 需要用參數 '--subdir' 指定子目錄嗎?" #: ../fdroidserver/import.py ../fdroidserver/common.py msgid "No information found." @@ -1279,8 +1299,9 @@ msgid "No unsigned directory - nothing to do" msgstr "無未簽署目錄 - 無須採取行動" #: ../fdroidserver/common.py +#, fuzzy msgid "Not a valid size definition: \"{}\"" -msgstr "" +msgstr "檔案大小的定義是無效的: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" @@ -1310,8 +1331,9 @@ msgid "OBB's packagename does not match a supported APK:" msgstr "OBB 的套件包名稱與支援的 APK 並不相符:" #: ../fdroidserver/deploy.py +#, fuzzy msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" +msgstr "因為機器是離線的, 跳過 git mirror 的生成直到 `fdroid deploy`" #: ../fdroidserver/common.py #, python-brace-format @@ -1338,10 +1360,11 @@ msgstr "只處理具有自動更新的應用程式" #: ../fdroidserver/lint.py #, fuzzy msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "Flattr 捐款方式在 FlattrID 標誌下" +msgstr "OpenCollective 的捐款方式在 OpenCollective: 的標誌下面" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py +#, fuzzy msgid "Options" msgstr "選項" @@ -1350,14 +1373,16 @@ msgid "Output JSON report to file named after APK." msgstr "將 json 報告輸出到以 APK 命名的檔案。" #: ../fdroidserver/scanner.py +#, fuzzy msgid "Output JSON to stdout." -msgstr "" +msgstr "輸出 JSON 到 stdout 。" #: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py #: ../fdroidserver/update.py ../fdroidserver/signindex.py #: ../fdroidserver/checkupdates.py +#, fuzzy msgid "Outputting JSON" -msgstr "" +msgstr "正在導出 JSON 中 ..." #: ../fdroidserver/import.py msgid "Overall license of the project." @@ -1369,9 +1394,9 @@ msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "覆蓋在 {apkfilename} 中的空白 versionName 從詮釋資料:{version}" #: ../fdroidserver/import.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Package \"{appid}\" already exists" -msgstr "" +msgstr "軟體 \"{appid}\" 已經存在了" #: ../fdroidserver/common.py #, python-brace-format @@ -1558,8 +1583,9 @@ msgid "Running wget in {path}" msgstr "在 {path} 裡執行 wget" #: ../fdroidserver/build.py +#, fuzzy msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "" +msgstr "在生成的 APK 檔案中掃描已知的閉源軟體 。" #: ../fdroid ../fdroidserver/__main__.py msgid "Scan the source code of a package" @@ -1585,8 +1611,9 @@ msgid "Set clock to that time using:" msgstr "設定時鐘到那時使用:" #: ../fdroidserver/nightly.py +#, fuzzy msgid "Set maximum releases in repo before older ones are archived" -msgstr "" +msgstr "先設置軟體庫的軟體最大釋出數, 再將舊軟體歸檔。" #: ../fdroidserver/build.py #, python-brace-format @@ -1671,7 +1698,7 @@ msgstr "正從 {apkfilename} 除去隱秘簽名" #: ../fdroidserver/nightly.py #, fuzzy, python-brace-format msgid "Stripping mystery signature from {apkfilename}" -msgstr "正從 {apkfilename} 除去隱秘簽名" +msgstr "正從軟體 {apkfilename} 除去未知的簽名" #: ../fdroidserver/lint.py #, python-format @@ -1732,12 +1759,14 @@ msgid "There is a keyalias collision - publishing halted" msgstr "發生主要別名衝突 - 發佈中止" #: ../fdroidserver/common.py +#, fuzzy msgid "These are the apps that have been archived from the main repo." -msgstr "" +msgstr "這些是從主軟體庫中歸檔的軟體。" #: ../fdroidserver/common.py +#, fuzzy msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" +msgstr "這是一個和 F-Droid 配套使用的軟體庫。此軟體庫中包含由程式原開發者編譯製作而成的二進制包和由 fdroid.org 的管理員使用 https://gitlab.com/fdroid 上的開發者工具編譯製作而成的二進制包。" #: ../fdroidserver/import.py #, python-format @@ -1749,8 +1778,9 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "要使用 awsbucket, awssecretkey 與 awsaccesskeyid 必須在 config.yml 進行設定!" #: ../fdroidserver/lint.py +#, fuzzy msgid "URL must start with https:// or http://" -msgstr "" +msgstr "URL 必須由 https:// 和 http:// 起頭" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" @@ -1768,11 +1798,12 @@ msgstr "描述中的 URL {url} : {error}" #: ../fdroidserver/lint.py #, fuzzy msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "無效的執照標籤 \"%s\"!請使用 https://spdx.org/license-list 標籤" +msgstr "這個許可證標籤不符合預期 \"{}\"! 只能使用 https://spdx.org/license-list 上的,經過 FSF 或 OSI 驗證的許可證標籤啦。" #: ../fdroidserver/lint.py +#, fuzzy msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "" +msgstr "這個許可證標籤不符合預期 \"{}\"! 只能使用你的配置文檔裡面配置好的許可證標籤啦。" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1780,9 +1811,9 @@ msgid "Unexpected text on same line as {field} in {linedesc}" msgstr "在 {linedesc} 在同一行的 {field} 出現未預期的文字" #: ../fdroidserver/common.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "" +msgstr "配置文檔 {configname} 裡面登記的密鑰 {key} 是未知的" #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" @@ -1807,7 +1838,7 @@ msgstr "未知的中介資料格式t:{path}" #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" -msgstr "未知的中介資料格式t:{path}" +msgstr "Metadata 的格式是未知的: 路徑: {path} (使用: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " @@ -1890,12 +1921,12 @@ msgstr "在 %s 未使用的檔案" #: ../fdroidserver/scanner.py #, fuzzy, python-format msgid "Unused scandelete path: %s" -msgstr "在 %s 未使用的檔案" +msgstr "路徑: %s 被標記為掃描並刪除,但並未執行" #: ../fdroidserver/scanner.py #, fuzzy, python-format msgid "Unused scanignore path: %s" -msgstr "在 %s 未使用的檔案" +msgstr "檔案路徑: %s 被標記為不掃描,但並未出現" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -1936,22 +1967,22 @@ msgstr "UpdateCheckMode 已被設定但它似乎尚未曾執行更新檢查" #: ../fdroidserver/lint.py #, fuzzy msgid "UpdateCheckName is set to the known application ID - it can be removed" -msgstr "更新 Check Name 被設定成已知的應用 id - 它可以被移除" +msgstr "UpdateCheckName 已被設定成已知的 application id - 它可以被移除" #: ../fdroidserver/lint.py #, fuzzy msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "更新 Check Name 被設定成已知的應用 id - 它可以被移除" +msgstr "UpdateCheckName 已經被設定成已知的 application id - 它可以被移除" #: ../fdroidserver/deploy.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" -msgstr "" +msgstr "正在將軟體檔案 {apkfilename} 上傳到 androidobservatory.org 。" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "Uploading {apkfilename} to virustotal" -msgstr "從緩存讀取 {apkfilename}" +msgstr "正在將軟體檔案 {apkfilename} 上傳到 virustotal 。" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -1986,12 +2017,14 @@ msgid "Using \"{path}\" for configuring s3cmd." msgstr "使用 \"{path}\" 對 s3cmd 組態。" #: ../fdroidserver/common.py +#, fuzzy msgid "Using APK Signature v2" -msgstr "" +msgstr "使用 APK Signature v2" #: ../fdroidserver/common.py +#, fuzzy msgid "Using APK Signature v3" -msgstr "" +msgstr "使用 APK Signature v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -2029,9 +2062,9 @@ msgid "Verifying index signature:" msgstr "正在驗證索引簽名:" #: ../fdroidserver/deploy.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "" +msgstr "VirusTotal API key 無法上傳大於 32MB 的檔案, 選擇使用 {url} 來上傳檔案 {path} 。" #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" @@ -2042,8 +2075,9 @@ msgid "When configured for signed indexes, create only unsigned indexes at this msgstr "當已組態為簽名的索引時,只能在此階段建立無簽名的索引" #: ../fdroidserver/lint.py +#, fuzzy msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "" +msgstr "在默認情況下, 檢查整個軟體庫中的可疑代碼時不會檢查 yaml 檔案 (yamllint) 。 使用本選項將會忽略默認選項,在檢查整個軟體庫中的可疑代碼時強制檢查 yaml 檔案 (yamllint) 。" msgid "X.509 'Distiguished Name' used when generating keys" msgstr "產生金鑰時使用 X.509 '專有名稱'" @@ -2057,8 +2091,9 @@ msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" msgstr "可以使用 ANDROID_HOME 來設定 SDK 的路徑,i.e.:" #: ../fdroidserver/scanner.py +#, fuzzy msgid "ZIP file archive" -msgstr "" +msgstr "ZIP 壓縮檔案" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2083,21 +2118,22 @@ msgid "ambiguous option: %s (%s?)" msgstr "不明確的選項:%s (%s?)" #: ../fdroidserver/common.py +#, fuzzy msgid "apksigner not found, it's required for signing!" -msgstr "" +msgstr "apksigner 不見了 , 我們需要用它來生成數字簽名 !" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py #: ../fdroidserver/checkupdates.py #, fuzzy msgid "application ID of file to operate on" -msgstr "以 applicationId 檢查更新" +msgstr "從檔案的 application ID 著手" #: ../fdroidserver/verify.py ../fdroidserver/publish.py #: ../fdroidserver/build.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py #, fuzzy msgid "application ID with optional versionCode in the form APPID[:VERCODE]" -msgstr "applicationId 具有任選的 versionCode 在此格式為 APPID [:VERCODE]" +msgstr "application ID 具有任選的 versionCode 在此的格式為 APPID [:VERCODE]" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py msgid "applicationId in the form APPID" @@ -2123,15 +2159,16 @@ msgstr "引數 \"-\" 為帶 %r 模式" #: ../fdroidserver/nightly.py #, fuzzy msgid "attempting bare SSH connection to test deploy key:" -msgstr "試圖顯露 ssh 連線來測試佈署金鑰:" +msgstr "試圖用裸的 ssh 連線來測試佈署金鑰:" #: ../fdroidserver/nightly.py msgid "attempting bare ssh connection to test deploy key:" msgstr "試圖顯露 ssh 連線來測試佈署金鑰:" #: ../fdroidserver/common.py +#, fuzzy msgid "can not parse scrlib spec (not a string): '{}'" -msgstr "" +msgstr "無法解析 scrlib spec (不是字符): '{}'" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2140,9 +2177,9 @@ msgid "can't open '%s': %s" msgstr "無法打開 '%s':%s" #: ../fdroidserver/build.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "cannot find required srclibs: \"{path}\"" -msgstr "" +msgstr "找不到必須的 scrlibs: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2169,8 +2206,9 @@ msgid "command to execute, either 'init' or 'update'" msgstr "命令執行,'init' 或 'update' 中的任何一個" #: ../fdroidserver/__main__.py +#, fuzzy msgid "commands from plugin modules:" -msgstr "" +msgstr "來自插換式模塊的命令:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2190,17 +2228,19 @@ msgid "copying {apkfilename} into {path}" msgstr "複製 {apkfilename} 到 {path}" #: ../fdroidserver/metadata.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "could not parse '{path}'" -msgstr "" +msgstr "無法解析 '{path}'" #: ../fdroidserver/common.py +#, fuzzy msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "" +msgstr "無法解析 scrlib spec (沒有指定參考文獻): '{}'" #: ../fdroidserver/common.py +#, fuzzy msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" +msgstr "無法解析 scrlib spec (符號 '@' 出現太多次了): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2218,9 +2258,9 @@ msgid "deployed build logs to '{path}'" msgstr "已將構建記錄部署到「{path}」" #: ../fdroidserver/common.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "deployed process log {path} to {dest}" -msgstr "" +msgstr "將進程日誌 {path} 部署到 {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2229,8 +2269,9 @@ msgid "dest= is required for options like %r" msgstr "dest= 如 %r 選項為必須" #: ../fdroidserver/scanner.py +#, fuzzy msgid "executable binary, possibly code" -msgstr "" +msgstr "可執行二進制檔案, 估計是代碼" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2285,8 +2326,9 @@ msgid "git svn clone failed" msgstr "Git svn 複製失敗" #: ../fdroidserver/scanner.py +#, fuzzy msgid "gzip file archive" -msgstr "" +msgstr "gzip 壓縮檔案" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2454,9 +2496,9 @@ msgid "positional arguments" msgstr "位置參數" #: ../fdroidserver/common.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "process log deploy {path} to {dest} failed!" -msgstr "" +msgstr "將進程日誌 {path} 部署到 {dest} 但失敗了!" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2469,18 +2511,19 @@ msgid "refuse downloading via insecure http connection (use https or specify --n msgstr "拒絕透過不安全 http 連線下載 (使用 https 或指明 --no-https-check): {apkfilename}" #: ../fdroidserver/index.py -#, python-format +#, fuzzy, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "" +msgstr "軟體庫圖標 (repo_icon)\"repo/icons/%s\" 不存在, 正在生成佔位用的圖標。" #: ../fdroidserver/index.py -#, python-format +#, fuzzy, python-format msgid "repo_icon %s does not exist, generating placeholder." -msgstr "" +msgstr "軟體庫圖標 (repo_icon)%s 不存在, 正在生成佔位用的圖標。" #: ../fdroidserver/metadata.py +#, fuzzy msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" +msgstr "因為沒有設置 ruamel.yaml, 無法寫入 metadata 。" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -2488,8 +2531,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd 同步索引 {path} 到 {url} 並刪除" #: ../fdroidserver/scanner.py +#, fuzzy msgid "shared library" -msgstr "" +msgstr "共享庫 (shared library)" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2524,8 +2568,9 @@ msgid "srclibs missing name and/or @" msgstr "srclibs 缺失名稱或 @" #: ../fdroidserver/scanner.py +#, fuzzy msgid "static library" -msgstr "" +msgstr "靜態庫 (static library)" #: ../fdroidserver/common.py #, python-brace-format @@ -2576,12 +2621,14 @@ msgid "using Apache libcloud to sync with {url}" msgstr "使用 Apache libcloud 來同步 {url}" #: ../fdroidserver/deploy.py +#, fuzzy msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "" +msgstr "因為 virustotal.com 正在限制收到請求的頻率, 這邊正在等待中, 過一會再試 ..." #: ../fdroidserver/update.py +#, fuzzy msgid "wiki support is deprecated and will be removed in the next release!" -msgstr "" +msgstr "對於 wiki 的支持已經過時了並且將會在下一個釋出版本中移除 !" #: ../fdroidserver/publish.py #, python-brace-format @@ -2607,7 +2654,7 @@ msgstr "{apkfilename} AndroidManifest.xml 有一個無效的日期: " #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{appid} does not have a name! Using application ID instead." -msgstr "{appid}沒有名字! 使用套件名代替." +msgstr "軟體 {appid} 沒有名字! 使用 application ID 代替。" #: ../fdroidserver/update.py #, python-brace-format @@ -2622,7 +2669,7 @@ msgstr "來自 {path} 的 {appid} 並不是一個有效的 android 套件名稱 #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" -msgstr "來自 {path} 的 {appid} 並不是一個有效的 android 套件名稱!" +msgstr "來自路徑 {path} 的 {appid} 並不是一個有效的 android application ID!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format @@ -2656,9 +2703,9 @@ msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "{appid}:{field} 必須是一個 '{type}',但它是一個 '{fieldtype}'!" #: ../fdroidserver/metadata.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{build_flag} must be an integer, found: {value}" -msgstr "" +msgstr "{build_flag} 必須是整數, 找到: {value}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2666,9 +2713,9 @@ msgid "{field} not terminated in {name}" msgstr "{field} 未終結在 {name}" #: ../fdroidserver/metadata.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{file} is blank or corrupt!" -msgstr "" +msgstr "檔案 {file} 是空的或損壞的 !" #: ../fdroidserver/update.py #, python-brace-format @@ -2681,14 +2728,14 @@ msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" 不存在! 請檢查 \"config.yml\"." #: ../fdroidserver/common.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "檔案 {oldfile} 已經過時了, 請使用檔案 {newfile} 。" #: ../fdroidserver/import.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{path} already exists, ignoring import results!" -msgstr "" +msgstr "路徑 {path} 已存在, 忽略導入的結果!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2706,9 +2753,9 @@ msgid "{path} is zero size!" msgstr "{path} 為零尺寸!" #: ../fdroidserver/deploy.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" -msgstr "" +msgstr "檔案 {path} 大於 200MB , 手動上傳: {url}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2718,7 +2765,7 @@ msgstr "{url} 未以 \"fdroid\" 結尾,檢查 URL 路徑!" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "{url} does not start with \"http\"!" -msgstr "{url} 未以 \"fdroid\" 結尾,檢查 URL 路徑!" +msgstr "{url} 未以 \"http\" 起頭 !" #: ../fdroidserver/build.py msgid "{} build failed" From c264f8e04ea43a570648ad1c574d8fc36068ce59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Mesk=C3=B3?= Date: Mon, 6 Sep 2021 15:35:16 +0200 Subject: [PATCH 0508/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Hunga?= =?UTF-8?q?rian=20(hu)=20by=20Bal=C3=A1zs=20Mesk=C3=B3=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 67.0% (386 of 576 strings) Translated using Weblate: Hungarian (hu) by Balázs Meskó Currently translated at 39.4% (227 of 576 strings) Translated using Weblate: Hungarian (hu) by Balázs Meskó Currently translated at 37.8% (218 of 576 strings) Translated using Weblate: Hungarian (hu) by Balázs Meskó Currently translated at 22.5% (130 of 576 strings) Translated using Weblate: Hungarian (hu) by Balázs Meskó Currently translated at 14.7% (85 of 576 strings) Co-authored-by: Balázs Meskó Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/hu/ Translation: F-Droid/F-Droid Server --- locale/hu/LC_MESSAGES/fdroidserver.po | 638 +++++++++++++------------- 1 file changed, 323 insertions(+), 315 deletions(-) diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index 69dc9129..8ed1f401 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -1,21 +1,21 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# Balázs Meskó , 2020. +# Balázs Meskó , 2020, 2021. # Hans-Christoph Steiner , 2020, 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-14 14:58+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2021-07-05 17:03+0000\n" +"Last-Translator: Balázs Meskó \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.8-dev\n" #: ../fdroidserver/common.py msgid "" @@ -26,6 +26,12 @@ msgid "" " tools on https://gitlab.com/fdroid.\n" " " msgstr "" +"\n" +" Ez egy F-Droiddal használható alkalmazástároló. Az ebben a tárolóban\n" +" lévő alkalmazások az eredeti fejlesztők hivatalos binárisai, vagy forrásból\n" +" készültek az f-droid.org által, az itt található eszközök segítségével:\n" +" https://gitlab.com/fdroid.\n" +" " #: ../fdroidserver/nightly.py msgid "" @@ -36,7 +42,6 @@ msgstr "" "A telepítési kulcsként használandó nyilvános SSH-kulcs:" #: ../fdroidserver/nightly.py -#, fuzzy msgid "" "\n" "SSH public key to be used as deploy key:" @@ -60,10 +65,10 @@ msgstr "A(z) „%s/” nem rendelkezik megfelelő metaadatfájllal." #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" +msgstr "A „repo_pubkey” megadása kötelező a config.yml-ben, ha a --nosign kapcsolót használja!" #: ../fdroidserver/install.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "A(z) „{apkfilename}” már telepítve van ezen: {dev}." @@ -95,15 +100,15 @@ msgstr "A(z) „{path}” nem egy elfogadott formátum, alakítsa át erre: {for #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" -msgstr "" +msgstr "A(z) „{url}” nem érvényes URL!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "a(z) %(option)s kapcsoló %(number)d argumentumot igényel" -msgstr[1] "a(z) %(option)s kapcsoló %(number)d argumentumot igényel" +msgstr[0] "A(z) %(option)s kapcsoló %(number)d argumentumot igényel" +msgstr[1] "A(z) %(option)s kapcsoló %(number)d argumentumot igényel" #: ../fdroidserver/mirror.py #, python-format @@ -130,7 +135,7 @@ msgstr "%prog [kapcsolók]" #: /usr/lib/python3.7/argparse.py #, python-format msgid "%r is not callable" -msgstr "a(z) %r nem hívható" +msgstr "A(z) %r nem hívható" #: ../fdroidserver/lint.py #, python-format @@ -149,7 +154,7 @@ msgstr "A „keypass” nem található a config.yml fájlban." #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" +msgstr "A „keystore” értéke NONE és a „smartcardoptions” üres." #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" @@ -166,14 +171,13 @@ msgstr "A „repo_keyalias” nem található a config.yml fájlban." #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "'required' is an invalid argument for positionals" -msgstr "" +msgstr "A „required” argumentum érvénytelen argumentum pozicionális paraméterek esetén" #: ../fdroidserver/common.py msgid "'sdk_path' not set in 'config.yml'!" msgstr "Az „sdk_path” nincs megadva a „config.yml” fájlban." #: ../fdroidserver/common.py -#, fuzzy msgid "'sdk_path' not set in config.yml!" msgstr "Az „sdk_path” nincs megadva a „config.yml” fájlban." @@ -198,7 +202,7 @@ msgstr "A(z) „{apkfilename}” már telepítve van ezen: {dev}." #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{field}' in {linedesc} is obsolete, see docs for current fields:" -msgstr "" +msgstr "A(z) „{field}” elavult itt: {linedesc}, a jelenlegi mezőkhöz lásd a dokumentációt:" #: ../fdroidserver/common.py #, python-brace-format @@ -208,7 +212,7 @@ msgstr "A(z) „{field}” véletlenszerű sorrendben lesz. Használjon () vagy #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" -msgstr "A(z) „{path}” végrehajtása meghiúsult." +msgstr "A(z) „{path}” végrehajtása sikertelen." #: ../fdroidserver/metadata.py #, python-brace-format @@ -256,64 +260,64 @@ msgstr "Metaadatfájl-vázak hozzáadása azon APK-khoz, melyeknél hiányoznak" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" -msgstr "" +msgstr "Új tároló hozzáadása csak a következő miatt: {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" -msgstr "" +msgstr "A tároló aláírókulcsának álneve a kulcstárolóban" #: ../fdroidserver/import.py msgid "Allows a different revision (or git branch) to be specified for the initial import" -msgstr "" +msgstr "Lehetővé teszi, hogy különböző verziót (vagy git ágat) adjon meg a kezdeti importáláshoz" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" -msgstr "" +msgstr "Letükrözi a teljes archívum szakaszt is" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" -msgstr "" +msgstr "Figyelmeztet a formázási problémákra is, mint a „rewritemeta -l”" #: ../fdroidserver/scanner.py msgid "Android AAR library" -msgstr "" +msgstr "Android AAR programkönyvtár" #: ../fdroidserver/scanner.py msgid "Android APK file" -msgstr "" +msgstr "Android APK-fájl" #: ../fdroidserver/scanner.py msgid "Android DEX code" -msgstr "" +msgstr "Android DEX kód" #: ../fdroidserver/common.py ../fdroidserver/build.py #, python-brace-format msgid "Android SDK '{path}' does not have '{dirname}' installed!" -msgstr "" +msgstr "A(z) „{dirname}” nincs telepítve a(z) „{path}” Android SDK elérési úton." #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "" +msgstr "Az Android SDK nem található itt: {path}!" #: ../fdroidserver/common.py msgid "Android SDK not found!" -msgstr "" +msgstr "Az Android SDK nem található." #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" -msgstr "" +msgstr "A(z) „{path}” Android SDK elérési út nem található." #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" -msgstr "" +msgstr "A(z) „{path}” Android SDK elérési út nem könyvtár." #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "" +msgstr "A(z) „{cmd}” Android SDK eszköz megtalálva." #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -321,45 +325,45 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Android build-tools path '{path}' does not exist!" -msgstr "" +msgstr "A(z) „{path}” Android build-tools elérési út nem létezik." #: ../fdroidserver/update.py msgid "AndroidManifest.xml has no date" -msgstr "" +msgstr "Az AndroidManifest.xml fájlnak nincs dátuma" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" -msgstr "" +msgstr "Az alkalmazás a(z) „{repo}” tárolóban található, de erre hivatkozik: {url}" #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" -msgstr "" +msgstr "A .git hozzáfűzése nem szükséges" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" -msgstr "" +msgstr "Az érvénytelen aláírású {apkfilename} archiválása." #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" -msgstr "" +msgstr "A tükrözendő alap URL, tartalmazhatja az index aláírókulcsát a lekérdezésben: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "" +msgstr "A(z) „{branch}” ág véglegesítésként használva a(z) „{versionName}” összeállításnál" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" -msgstr "" +msgstr "A(z) „{branch}” ág véglegesítésként használva a(z) „{srclib}” srclibnél" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" -msgstr "" +msgstr "Törött szimbolikus link: {path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Build a package from source" @@ -367,69 +371,69 @@ msgstr "Csomag összeállítása forrásból" #: ../fdroidserver/build.py msgid "Build all applications available" -msgstr "" +msgstr "Az összes elérhető alkalmazás összeállítása" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" -msgstr "" +msgstr "Az összeállítást az „fdroid import” állította elő – törölje a letiltási sort, ha végzett" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" -msgstr "" +msgstr "A metaadatok git tárolójában nem véglegesített változások találhatók!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" -msgstr "" +msgstr "Csak a csomagok legújabb verziójának összeállítása" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" -msgstr "" +msgstr "Az összeállításnál vesszővel elválasztva kell megadni a versionName és versionCode paramétereket, nem így: „{value}”, itt: {linedesc}" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" -msgstr "" +msgstr "A tároló összeállítva itt: „%s”, ezzel a konfigurációval:" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Nem lehet összeállítani, mert {} hiba történt az átvizsgáláskor" +msgstr[1] "Nem lehet összeállítani, mert {} hiba történt az átvizsgáláskor" #: ../fdroidserver/vmtools.py #, python-brace-format msgid "Cannot read \"{path}\"!" -msgstr "" +msgstr "A(z) „{path}” nem olvasható!" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/metadata.py #, python-brace-format msgid "Cannot resolve application ID {appid}" -msgstr "" +msgstr "A(z) {appid} alkalmazásazonosító nem oldható fel" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" -msgstr "" +msgstr "A(z) „{path}” nem írható újra" #: ../fdroidserver/rewritemeta.py msgid "Cannot use --list and --to at the same time" -msgstr "" +msgstr "A --list és a --to kapcsoló egyszerre nem használható" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" -msgstr "" +msgstr "A(z) „{path}” nem írható, nem elfogadott formátumú, használja ezt: {formats}" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" -msgstr "" +msgstr "A(z) „%s” kategória érvénytelen" #: ../fdroidserver/lint.py msgid "Categories are not set" -msgstr "" +msgstr "A kategóriák nincsenek megadva" #: ../fdroid ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -438,20 +442,20 @@ msgstr "Alkalmazásfrissítések keresése" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "" +msgstr "Archiválás ellenőrzése ennél: {appid} – APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "" +msgstr "Archiválás ellenőrzése ennél: {appid} – apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" -msgstr "" +msgstr "Tiszta frissítés – nem használ gyorsítótárat, minden APK-k újra feldolgoz" #: ../fdroidserver/import.py msgid "Comma separated list of categories." -msgstr "" +msgstr "Kategóriák vesszőkkel elválasztott listája." #: ../fdroid ../fdroidserver/__main__.py #, c-format, python-format @@ -460,71 +464,71 @@ msgstr "A(z) „%s” nem ismerhető fel.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" -msgstr "" +msgstr "Változások véglegesítése" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." -msgstr "" +msgstr "Ütköző argumentumok: a „--verbose” és a „--quite” kapcsolók együtt nem adhatók meg." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "Ütköző konfigurációs fájlok! {newfile} használata, {oldfile} mellőzése." #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" -msgstr "" +msgstr "A(z) „{command}” nem található a rendszeren" #: ../fdroidserver/import.py msgid "Could not find latest version code" -msgstr "" +msgstr "A legfrissebb verzió kódja nem található" #: ../fdroidserver/import.py msgid "Could not find latest version name" -msgstr "" +msgstr "A legfrissebb verzió neve nem található" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" -msgstr "" +msgstr "A(z) {path} eltávolítandó fájl nem található" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "" +msgstr "A(z) {path} APK nem nyitható meg az elemzéshez: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" -msgstr "" +msgstr "A(z) „{size}” méret nem dolgozható fel, hibás „{type}” típus" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/import.py msgid "Couldn't find Application ID" -msgstr "" +msgstr "Az alkalmazásazonosító nem található" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" -msgstr "" +msgstr "A legfrissebb verzió kódja nem található" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import.py msgid "Couldn't find latest version name" -msgstr "" +msgstr "A legfrissebb verzió neve nem található" #: ../fdroidserver/import.py msgid "Couldn't find package ID" -msgstr "" +msgstr "A csomagazonosító nem található" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" -msgstr "" +msgstr "A meglévő aláírókulcs-beállítás felülírása megtagadva." #: ../fdroidserver/update.py msgid "Create a repo signing key in a keystore" -msgstr "" +msgstr "Tároló-aláírókulcs létrehozása a kulcstárban" #: ../fdroidserver/update.py msgid "Create skeleton metadata files that are missing" @@ -533,150 +537,150 @@ msgstr "Hiányzó metaadatfájl-vázak létrehozása" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Created new container \"{name}\"" -msgstr "" +msgstr "Új „{name}” konténer létrehozva" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." -msgstr "" +msgstr "„{path}” létrehozása a s3cmd beállításához." #: ../fdroidserver/publish.py msgid "Creating log directory" -msgstr "" +msgstr "Naplókönyvtár létrehozása" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Creating new S3 bucket: {url}" -msgstr "" +msgstr "Új S3 vödör létrehozása: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" -msgstr "" +msgstr "Kimeneti könyvtár létrehozása" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" -msgstr "" +msgstr "Aláírt index létrehozása ezzel a kulccsal (SHA256):" #: ../fdroidserver/import.py ../fdroidserver/verify.py #: ../fdroidserver/publish.py msgid "Creating temporary directory" -msgstr "" +msgstr "Ideiglenes könyvtár létrehozása" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" -msgstr "" +msgstr "Nem aláírt index létrehozása az aláírás előkészítéséhez" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "" +msgstr "A CurrentVersionCode ({cv}) kisebb, mint a legrégebbi összeállítási bejegyzés: {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" -msgstr "" +msgstr "A DEBUG_KEYSTORE nincs beállítva, vagy az értéke nem teljes" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "Minden metaadat nélküli APK és OBB fájl törlése a tárolóból" +msgstr "Minden metaadat nélküli APK- és OBB-fájl törlése a tárolóból" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "" +msgstr "Archívum törlése, a tároló túl nagy ({size}, korlát: {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "" +msgstr "A git-mirror előzményeinek törlése, a tároló túl nagy ({size}, korlát: {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" -msgstr "" +msgstr "Ismeretlen fájl törlése: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" -msgstr "" +msgstr "A(z) „%s” leírás csak az alkalmazás összegzése" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" -msgstr "" +msgstr "A leírás ismételt sorokat tartalmaz" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" +msgstr "A leírás listát (%s) tartalmaz, de nem pontozott (*) vagy számozott (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" -msgstr "" +msgstr "A leírás {length} karakteres hossza több, mint a {limit} karakteres korlát" #: ../fdroidserver/import.py msgid "Do not add 'disable:' to the generated build entries" -msgstr "" +msgstr "Ne adja a hozzá a „disable:” szöveget az előállított összeállítási elemekhez" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" -msgstr "" +msgstr "Ne telepítse az új fájlokat a tárolóba" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" -msgstr "" +msgstr "Ne adja hozzá a(z) „{path}” elérési utat az URL-hez." #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" -msgstr "" +msgstr "Ne kérdezze meg az Android SDK elérési utat, csak álljon le sikertelenül" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" -msgstr "" +msgstr "Ne távolítsa el a kulcstárolóból előállított privát kulcsokat" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" -msgstr "" +msgstr "Ne hozzon létre forráscsomagot, ez egy összeállítás tesztelésekor hasznos" #: ../fdroidserver/stats.py msgid "Don't do anything logs-related" -msgstr "" +msgstr "Ne tegyen semmilyen naplózással kapcsolatos dolgot" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" -msgstr "" +msgstr "Ne frissítse a tárolót, hasznos ha internetkapcsolat nélkül tesztel egy összeállítást" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py #: ../fdroidserver/upload.py msgid "Don't use rsync checksums" -msgstr "" +msgstr "Ne használja az rsync ellenőrzőösszegeit" #: ../fdroid ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" -msgstr "" +msgstr "Kis tárolók teljes tükrének letöltése" #: ../fdroidserver/stats.py msgid "Download logs we don't have" -msgstr "" +msgstr "Helyben nem meglévő naplók letöltése" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." -msgstr "" +msgstr "A tároló letöltése már egyszer sikertelen volt, nem próbálja meg újra." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" -msgstr "" +msgstr "A(z) {url} letöltése sikertelen. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" -msgstr "" +msgstr "Ismételt összeállítási recept található a(z) {versionCode} verziókódhoz itt: {linedesc}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" -msgstr "" +msgstr "Ismételt hivatkozás a(z) „{field}” mezőben: {url}" #: ../fdroid msgid "Dynamically scan APKs post build" @@ -684,27 +688,29 @@ msgstr "APK-k dinamikus átvizsgálása összeállítás után" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" +msgstr "HIBA: A „server” alparancs eltávolításra került, használja ezt: „deploy”!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" +"HIBA: a parancsot sose használja az f-droid.org tükrözéséhez.\n" +"Az f-droid.org teljes tükrözéséhez több mint 200 GB tárhely szükséges." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" -msgstr "" +msgstr "HIBA: nem támogatott CI típus, foltokat szívesen fogadunk." #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" -msgstr "" +msgstr "Hibás összeállítási kapcsoló itt: {linedesc}" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "" +msgstr "A karakterkódolás beállítása „{enc}”, az fdroid kódolási problémákba futhat. A legjobb eredmény érdekében használjon „UTF-8” kódolást." #: ../fdroidserver/init.py #, python-format @@ -712,280 +718,282 @@ msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" +"Adja meg az Android SDK (%s) elérési útját itt:\n" +"> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "A(z) {configname} konfigurációból származó {var} környezeti változó nincs beállítva." #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format msgid "Error while attempting to publish log: %s" -msgstr "" +msgstr "Hiba történt a napló közzétételekor: %s" #: ../fdroidserver/import.py ../fdroidserver/common.py msgid "Error while getting repo address" -msgstr "" +msgstr "Hiba történt a tároló címének lekérésekor" #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" -msgstr "" +msgstr "Aláírások kinyerése az APK-kból" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" -msgstr "" +msgstr "A(z) {path} másolása sikertelen: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" -msgstr "" +msgstr "A(z) „{apkfilename}” aláírásainak összegyűjtése sikertelen: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" -msgstr "" +msgstr "A(z) {path} olvasása sikertelen: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" -msgstr "" +msgstr "A(z) {path} átméretezése sikertelen: {error}" #: ../fdroidserver/publish.py msgid "Failed to align application" -msgstr "" +msgstr "Az alkalmazás igazítása sikertelen" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" -msgstr "" +msgstr "Az S3 vödör létrehozása sikertelen: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" -msgstr "" +msgstr "Az APK információk lekérése sikertelen, a(z) {path} törlése" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" -msgstr "" +msgstr "Az APK információk lekérése sikertelen, a(z) {path} kihagyása" #: ../fdroidserver/common.py msgid "Failed to get APK manifest information" -msgstr "" +msgstr "Az APK leíró információk lekérése sikertelen" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" -msgstr "" +msgstr "A(z) „{apkfilename}” telepítése a(z) {dev} eszközön sikertelen: {error}" #: ../fdroidserver/publish.py ../fdroidserver/common.py msgid "Failed to sign application" -msgstr "" +msgstr "Az alkalmazás aláírása sikertelen" #: ../fdroidserver/common.py msgid "Failed to zipalign application" -msgstr "" +msgstr "Az alkalmazás elrendezése a ZIP-fájlban sikertelen" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" -msgstr "" +msgstr "A virtuális géptől lekért buildserverid: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" -msgstr "" +msgstr "A(z) „{apkfilename}” APK aláírásai lekérve -> „{sigdir}”" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" -msgstr "" +msgstr "A fájl feldolgozás közben eltűnt: {path}" #: ../fdroidserver/verify.py ../fdroidserver/stats.py ../fdroidserver/update.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/build.py #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py msgid "Finished" -msgstr "" +msgstr "Befejezve" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID flag" -msgstr "" +msgstr "A Flattr adományozási módok a FlattrID jelzőbe tartoznak" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" +msgstr "A Flattr adományozási módok a FlattrID: mezőbe tartoznak" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" -msgstr "" +msgstr "Tiltott HTML címkék" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." -msgstr "" +msgstr "Letiltott alkalmazások összeállításának kényszerítése, és folytatás az átvizsgálási problémáktól függetlenül. Csak teszt módban engedélyezett." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" -msgstr "" +msgstr "Összeállítás kényszerített leállítása {0} másodperces időtúllépés után." #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." -msgstr "" +msgstr "Letiltott alkalmazások és összeállítások átvizsgálásának kényszerítése." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" -msgstr "" +msgstr "Metaadatok nélküli „{path}” grafika található a(z) „{name}” alkalmazásnál." #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" -msgstr "" +msgstr "Hibás „{path}” finanszírozási fájl található a(z) „{name}” alkalmazásnál:" #: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" -msgstr "" +msgstr "Érvénytelen alkalmazásazonosítók találhatók az argumentumokban" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" -msgstr "" +msgstr "Egyes alkalmazásoknál érvénytelen versionCode paraméterek találhatók" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "" +msgstr "Több JAR aláírásblokkfájl található itt: {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" -msgstr "" +msgstr "Több metaadatfájl található ennél: {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." -msgstr "" +msgstr "Több aláíró-tanúsítvány található a tárolóhoz." #: ../fdroidserver/update.py #, python-brace-format msgid "Found multiple signing certificates in {path}" -msgstr "" +msgstr "Több aláíró-tanúsítvány található itt: {path}" #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." -msgstr "" +msgstr "Nem található aláíró-tanúsítvány a tárolóhoz." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" -msgstr "" +msgstr "Nem fájl található itt: %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" -msgstr "" +msgstr "{apkfilename} található itt: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" -msgstr "" +msgstr "Metaadatváz előállítva ehhez: {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" -msgstr "" +msgstr "A(z) „%s” git ágra váltás sikertelen" #: ../fdroidserver/common.py msgid "Git clean failed" -msgstr "" +msgstr "A git tisztítás sikertelen" #: ../fdroidserver/common.py msgid "Git fetch failed" -msgstr "" +msgstr "A git lekérés sikertelen" #: ../fdroidserver/common.py msgid "Git remote set-head failed" -msgstr "" +msgstr "A git távoli fej beállítás sikertelen" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" -msgstr "" +msgstr "A git távoli fej beállítás sikertelen: „%s”" #: ../fdroidserver/common.py msgid "Git reset failed" -msgstr "" +msgstr "A git helyreállítás sikertelen" #: ../fdroidserver/common.py msgid "Git submodule sync failed" -msgstr "" +msgstr "A git almodul szinkronizációs sikertelen" #: ../fdroidserver/common.py msgid "Git submodule update failed" -msgstr "" +msgstr "A git almodul frissítése sikertelen" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" -msgstr "" +msgstr "HTTPS-t kell használni a Subversion URL-ekhez." #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "" +msgstr "Ha egy tükör túl naggyá válik, akkor engedélyezze az archívum törlését" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "" +msgstr "Ha a feltöltés sikertelen, próbálja meg kézzel feltölteni ide: {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "" +msgstr "A(z) „{field}” mellőzése a(z) „{metapath}” metaadatokban, mert elavult." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" -msgstr "" +msgstr "A 2048-nál hosszabb FUNDING.yml bejegyzés figyelmen kívül hagyása: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " -msgstr "" +msgstr "A metaadatok nélküli csomag figyelmen kívül hagyása: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" -msgstr "" +msgstr "A(z) {apkfilename} elévült gyorsítótáradatainak figyelmen kívül hagyása" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Ignoring {ext} file at '{path}'" -msgstr "" +msgstr "A(z) {ext} fájl figyelmen kívül hagyása itt: „{path}”" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "" +msgstr "A letiltott algoritmusokkal (például MD5) aláírt APK-k belevétele" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" -msgstr "" +msgstr "A PGP-aláírást tartalmazó .asc fájlok belevétele a tükörbe" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" -msgstr "" +msgstr "Az összeállítási napló belevétele a tükörbe" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" -msgstr "" +msgstr "A forráscsomagok belevétele a tükörbe" #: ../fdroidserver/common.py msgid "Initialising submodules" -msgstr "" +msgstr "Almodulok előkészítése" #: ../fdroidserver/install.py msgid "Install all signed applications available" -msgstr "" +msgstr "Összes aláírt alkalmazás telepítése" #: ../fdroid ../fdroidserver/__main__.py msgid "Install built packages on devices" @@ -994,22 +1002,22 @@ msgstr "Összeállított csomagok telepítése az eszközökre" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." -msgstr "" +msgstr "%s telepítése…" #: ../fdroidserver/install.py #, python-format msgid "Installing %s…" -msgstr "" +msgstr "%s telepítése…" #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." -msgstr "" +msgstr "A(z) „{apkfilename}” telepítése ezen: {dev}…" #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}…" -msgstr "" +msgstr "A(z) „{apkfilename}” telepítése ezen: {dev}…" #: ../fdroid ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" @@ -1017,317 +1025,317 @@ msgstr "Interakció a tároló HTTP kiszolgálójával" #: ../fdroidserver/update.py msgid "Invalid APK" -msgstr "" +msgstr "Érvénytelen APK" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" -msgstr "" +msgstr "Érvénytelen VercodeOperation: {field}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" -msgstr "" +msgstr "Érvénytelen alkalmazásazonosító: {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" -msgstr "" +msgstr "Érvénytelen logikai érték: „%s”" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid build flag at {line} in {linedesc}" -msgstr "" +msgstr "Érvénytelen összeállítási jelző a(z) {line}. sorban, itt: {linedesc}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid build format: {value} in {name}" -msgstr "" +msgstr "Érvénytelen összeállítási formátum: {value} itt: {name}" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" -msgstr "" +msgstr "Érvénytelen felsorolás" #: ../fdroidserver/lint.py #, python-format msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" -msgstr "" +msgstr "Érvénytelen „%s” licenccímke! Csak az itt lévő címkéket használja: https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "" +msgstr "Érvénytelen hivatkozás – ezek egyikét használja: [http://foo.bar Hivatkozás címe] vagy [http://foo.bar]" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid metadata in %s:%d" -msgstr "" +msgstr "Érvénytelen metaadatok itt: %s:%d" #: ../fdroidserver/metadata.py msgid "Invalid metadata in: " -msgstr "" +msgstr "Érvénytelen metaadatok itt: " #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" -msgstr "" +msgstr "Érvénytelen név a közzétett fájlnak: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" -msgstr "" +msgstr "Érvénytelen csomagnév: {0}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " -msgstr "" +msgstr "Érvénytelen átirányítás nem HTTPS oldalra: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" -msgstr "" +msgstr "Érvénytelen srclib metaadatok: a(z) „{file}” nem létezik" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" -msgstr "" +msgstr "Érvénytelen srclib metaadatok: a(z) „{file}” nem dolgozható fel" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "" +msgstr "Érvénytelen srclib metaadatok: ismeretlen „{key}” kulcs itt: „{file}”" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid versionCode: \"{versionCode}\" is not an integer!" -msgstr "" +msgstr "Érvénytelen versionCode: a(z) „{versionCode}” nem egész szám." #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" -msgstr "" +msgstr "A JAR aláírásának ellenőrzése sikertelen: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" -msgstr "" +msgstr "A JAR aláírása ellenőrizve: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" -msgstr "" +msgstr "Java JAR-fájl" #: ../fdroidserver/publish.py ../fdroidserver/update.py #: ../fdroidserver/mirror.py msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "" +msgstr "A Java JDK nem található. Telepítse szabványos helyre, vagy adja meg a JAVA_PATH változókat." #: ../fdroidserver/scanner.py msgid "Java compiled class" -msgstr "" +msgstr "Legfordított Java osztály" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" -msgstr "" +msgstr "A Java „jarsigner” nem található. Telepítse szabványos helyre, vagy adja meg a JAVA_PATH változókat." #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" -msgstr "" +msgstr "JavaScript a HTML src attribútumokban" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" -msgstr "" +msgstr "Kulcstároló az aláírókulcshoz:\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "" +msgstr "A legutóbb használt „{commit}” véglegesítés címkének tűnik, de az UpdateCheckMode „{ucm}”" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" -msgstr "" +msgstr "A Liberapay adományozási módok a Liberapay: mezőbe tartoznak" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the LiberapayID flag" -msgstr "" +msgstr "A Liberapay adományozási módok a LiberapayID jelzőbe tartoznak" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted" -msgstr "" +msgstr "Az újra formázásra kerülendő fájlok felsorolása" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" -msgstr "" +msgstr "A területi beállítás szerepel az f-droid.org URL-ben" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" -msgstr "" +msgstr "Az összeállítás álljon meg a kivételeknél" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." -msgstr "" +msgstr "Rosszul formázott tárolótükrök." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" -msgstr "" +msgstr "Rosszul formázott serverwebroot sor:" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." -msgstr "" +msgstr "A teljes tároló és archívum tükrözés, minden fájltípussal." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" -msgstr "" +msgstr "Hiányzó kimeneti könyvtár" #: ../fdroidserver/lint.py #, python-format msgid "Name '%s' is just the auto name - remove it" -msgstr "" +msgstr "A(z) „%s” név csak az automatikus név – eltávolítás" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." -msgstr "" +msgstr "Nem található „config.yml”, alapértelmezések használata." #: ../fdroidserver/common.py msgid "No Android SDK found!" -msgstr "" +msgstr "Nem található Android SDK." #: ../fdroidserver/import.py msgid "No android or kivy project could be found. Specify --subdir?" -msgstr "" +msgstr "Nem található android vagy kivy projekt. Megad --subdir argumentumot?" #: ../fdroidserver/install.py msgid "No attached devices found" -msgstr "" +msgstr "Nem található csatolt eszköz" #: ../fdroidserver/metadata.py #, python-brace-format msgid "No commit specified for {versionName} in {linedesc}" -msgstr "" +msgstr "Nincs megadva véglegesítés a(z) {versionName} verzióhoz itt: {linedesc}" #: ../fdroidserver/common.py msgid "No config.yml found, using defaults." -msgstr "" +msgstr "Nem található config.yml, alapértelmezések használata." #: ../fdroidserver/index.py msgid "No fingerprint in URL." -msgstr "" +msgstr "Nincs ujjlenyomat az URL-ben." #: ../fdroidserver/common.py msgid "No git submodules available" -msgstr "" +msgstr "Nem érhetők el git almodulok" #: ../fdroidserver/import.py msgid "No gradle project could be found. Specify --subdir?" -msgstr "" +msgstr "Nem található gradle projekt. Megad --subdir argumentumot?" #: ../fdroidserver/import.py ../fdroidserver/common.py msgid "No information found." -msgstr "" +msgstr "Nem található információ." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" -msgstr "" +msgstr "Nem kell megadnia, hogy az alkalmazás szabad szoftver" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" -msgstr "" +msgstr "Nem kell megadnia, hogy az alkalmazás androidos" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" -msgstr "" +msgstr "Nincs beállítás megadva. Szerkessze a config.yml fájlt, hogy ezek közül legalább egyet megadjon:" #: ../fdroidserver/common.py msgid "No packages specified" -msgstr "" +msgstr "Nincs csomag megadva" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" -msgstr "" +msgstr "Nem érhetők el aláírt APK-k ehhez: %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" -msgstr "" +msgstr "Nincs aláírt kimeneti könyvtár – nincs teendő" #: ../fdroidserver/update.py ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" -msgstr "" +msgstr "Nem található aláíró-tanúsítvány itt: {path}" #: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" -msgstr "" +msgstr "Nincs ilyen csomag: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" -msgstr "" +msgstr "Nincs {versionCode} versionCode a(z) {appid} alkalmazáshoz" #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" -msgstr "" +msgstr "Nincs aláíratlan könyvtár – nincs teendő" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" -msgstr "" +msgstr "Nem érvényes méretmegadás: „{}”" #: ../fdroidserver/signindex.py msgid "Nothing to do" -msgstr "" +msgstr "Nincs teendő" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." -msgstr "" +msgstr "Nincs teendő a(z) {appid} alkalmazásnál." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" -msgstr "" +msgstr "Most adja meg ezeket a config.yml fájlban:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" -msgstr "" +msgstr "Az OBB-fájlnak újabb versionCode értéke ({integer}) van, mint bármelyik APK-nak:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" -msgstr "" +msgstr "Az OBB-fájl nevének „main.” vagy „patch.” szöveggel kell kezdődnie:" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" -msgstr "" +msgstr "Az OBB csomagneve nem egyezik egyik támogatott APK-val sem:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" +msgstr "Offline gép, git tükör előállításának kihagyása az „fdroid deploy” kiadásáig" #: ../fdroidserver/common.py #, python-brace-format msgid "Old APK signature failed to verify: {path}" -msgstr "" +msgstr "A régi APK aláírásának ellenőrzése sikertelen: {path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Old, deprecated name for fdroid deploy" -msgstr "" +msgstr "Régi, elavult név az fdroid deploy parancshoz" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" -msgstr "" +msgstr "A grafikáknál csak PNG és JPEG formátum támogatott, ez található: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" -msgstr "" +msgstr "Csak a különbségek kiírása Play Áruház esetén" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" -msgstr "" +msgstr "Csak az automatikus frissítésekkel rendelkező alkalmazások feldolgozása" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "" +msgstr "Az OpenCollective adományozási módok a OpenCollective: mezőbe tartoznak" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -1336,91 +1344,91 @@ msgstr "Beállítások" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." -msgstr "" +msgstr "A JSON jelentés kiírása egy APK után elnevezett fájlba." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." -msgstr "" +msgstr "A JSON kiírása a szabványos kimenetre." #: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py #: ../fdroidserver/update.py ../fdroidserver/signindex.py #: ../fdroidserver/checkupdates.py msgid "Outputting JSON" -msgstr "" +msgstr "JSON kiírása" #: ../fdroidserver/import.py msgid "Overall license of the project." -msgstr "" +msgstr "Az egész projekt átfogó licence." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "" +msgstr "Az üres versionName felülírása a(z) {apkfilename} fájlban a metaadatokból: {version}" #: ../fdroidserver/import.py #, python-brace-format msgid "Package \"{appid}\" already exists" -msgstr "" +msgstr "A(z) „{appid}” csomag már létezik" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" -msgstr "" +msgstr "A(z) „{path}” helyen lévő leírófájl feldolgozása" #: ../fdroidserver/common.py msgid "Password required with username" -msgstr "" +msgstr "Jelszó szükséges a felhasználónévvel" #: ../fdroidserver/import.py msgid "Path to main Android project subdirectory, if not in root." -msgstr "" +msgstr "A fő androidos projekt alkönyvtár elérési útja, ha nem a gyökér." msgid "Path to main android project subdirectory, if not in root." -msgstr "" +msgstr "A fő androidos projekt alkönyvtár elérési útja, ha nem a gyökér." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" -msgstr "" +msgstr "Az Android SDK elérési útja (néha az ANDROID_HOME-ban van megadva)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" -msgstr "" +msgstr "A naplóként használandó git tároló elérési útja" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" -msgstr "" +msgstr "A tároló aláírókulcsához használt kulcstároló elérési útja" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" -msgstr "" +msgstr "A titkos változó kiírása a terminálba a könnyű másolás és beillesztés érdekében" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" -msgstr "" +msgstr "Probléma a(z) {appid} leírásával: {error}" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" -msgstr "" +msgstr "Probléma az itt lévő XML-lel: „{path}”" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" -msgstr "" +msgstr "Automatikus frissítések feldolgozása" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" -msgstr "" +msgstr "{apkfilename} feldolgozása" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" -msgstr "" +msgstr "{appid} feldolgozása" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" -msgstr "" +msgstr "Ember számára olvasható XML/JSON fájlok készítése indexfájlként" #: ../fdroidserver/update.py msgid "Produce human-readable index.xml" @@ -1428,25 +1436,25 @@ msgstr "Ember számára olvasható index.xml előállítása" #: ../fdroidserver/import.py msgid "Project URL to import from." -msgstr "" +msgstr "Importálási forrásként használandó projekt URL." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" -msgstr "" +msgstr "A központozást kerülni kell" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" -msgstr "" +msgstr "A napló beküldése ebbe a távoli git tárolóba" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Pushing binary transparency log to {url}" -msgstr "" +msgstr "A bináris átláthatósági napló beküldése ide: {url}" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Pushing to {url}" -msgstr "" +msgstr "Beküldés ide: {url}" #: ../fdroid ../fdroidserver/__main__.py msgid "Quickly start a new repository" @@ -1459,32 +1467,32 @@ msgstr "Összes metaadatfájl felolvasása és kilépés" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" -msgstr "" +msgstr "„{config_file}” olvasása" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading minSdkVersion failed: \"{apkfilename}\"" -msgstr "" +msgstr "A minSdkVersion olvasása sikertelen: „{apkfilename}”" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" -msgstr "" +msgstr "A packageName/versionCode/versionName olvasása sikertelen, az APK érvénytelen: „{apkfilename}”" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" -msgstr "" +msgstr "A(z) {apkfilename} olvasása gyorsítótárból" #: ../fdroidserver/stats.py msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." -msgstr "" +msgstr "Aggregált statisztikák újraszámítása – akkor használja, ha a változtatások érvénytelenítenék a régi gyorsítótárazott adatokat." #: ../fdroidserver/common.py msgid "Removing specified files" -msgstr "" +msgstr "Megadott fájlok eltávolítása" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -1492,24 +1500,24 @@ msgstr "Azon APK fájlok átnevezése, melyek nem illeszkednek a csomag.név_123 #: ../fdroidserver/update.py msgid "Report on build data status" -msgstr "" +msgstr "Összeállítás adatainak állapotának jelentése" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" +msgstr "Visszaállítás és teljesen új összeállítási kiszolgáló létrehozása, még akkor is, ha a meglévő rendben lévőnek tűnik." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" -msgstr "" +msgstr "A(z) {apkfilename} újra aláírása a megadott debug.keystore segítségével" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" -msgstr "" +msgstr "A legnagyobb képpontméretet meghaladó összes ikon átméretezése, és kilépés" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" -msgstr "" +msgstr "A kimenet figyelmeztetésekre és hibákra korlátozása" #: ../fdroid ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1517,38 +1525,38 @@ msgstr "Összes metaadatfájl újraírása" #: ../fdroidserver/rewritemeta.py msgid "Rewrite to a specific format: " -msgstr "" +msgstr "Újraírás megadott formátumba: " #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" -msgstr "" +msgstr "„{appid}” újraírása" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}' to '{path}'" -msgstr "" +msgstr "„{appid}” újraírása ide: „{path}”" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" -msgstr "" +msgstr "Futtatás azon a git tárolón, amelyben nem véglegesített változtatások vannak" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" -msgstr "" +msgstr "A rewritemeta futtatása a formázás javításához" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Running first pass with MD5 checking disabled" -msgstr "" +msgstr "Az MD5 ellenőrzés első menetének futtatása letiltva" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" -msgstr "" +msgstr "A wget futtatása itt: {path}" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "" +msgstr "Az elkészült APK-k átvizsgálása ismert nem szabad osztályokat keresve." #: ../fdroid ../fdroidserver/__main__.py msgid "Scan the source code of a package" @@ -1557,31 +1565,31 @@ msgstr "A csomag forráskódjának átvizsgálása" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" -msgstr "" +msgstr "Az átvizsgáló {count} problémát talált a(z) „{appid}” alkalmazásban:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" -msgstr "" +msgstr "Az átvizsgáló {count} problémát talált a(z) „{appid}:{versionCode}” alkalmazásban:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Az átvizsgáló {count} problémát talált" +msgstr[1] "Az átvizsgáló {count} problémát talált" #: ../fdroidserver/common.py msgid "Set clock to that time using:" -msgstr "" +msgstr "Óra beállítása ara az időre a következővel:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "" +msgstr "A tárolókban szereplő kiadások számának legnagyobb száma, mielőtt a régebbieket archiválni kezdi" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" -msgstr "" +msgstr "A nyitott fájlok korlátjának beállítása erre: {integer}" #: ../fdroid ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" @@ -1589,12 +1597,12 @@ msgstr "" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " -msgstr "" +msgstr "A nyitott fájlok korlátjának beállítása sikertelen: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" -msgstr "" +msgstr "{0} másodperces időtúllépés beállítása ehhez az összeállításhoz" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" @@ -1606,32 +1614,32 @@ msgstr "Az update --nosign paranccsal készült indexek aláírása" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" -msgstr "" +msgstr "A forráskód binárisok és egyéb problémák miatti átvizsgálásának kihagyása" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" -msgstr "" +msgstr "Az érvénytelen aláírású „{apkfilename}” kihagyása." #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" -msgstr "" +msgstr "A(z) „{appid}” indexelőállításának kihagyása" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" -msgstr "" +msgstr "Az érvénytelen aláírású {apkfilename} kihagyása." #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" -msgstr "" +msgstr "{appid} kihagyása: letiltott" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: no builds specified" -msgstr "" +msgstr "{appid} kihagyása: nincs összeállítás megadva" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Specify a local folder to sync the repo to" @@ -2159,7 +2167,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "complex" -msgstr "" +msgstr "komplex" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2260,7 +2268,7 @@ msgstr "lebegőpontos" #: ../fdroidserver/metadata.py msgid "force errors to be warnings, or ignore" -msgstr "" +msgstr "hibák figyelmeztetéssé változtatása, vagy figyelmen kívül hagyása" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." @@ -2349,7 +2357,7 @@ msgstr "" #: /usr/lib/python3.7/optparse.py #, python-format msgid "no such option: %s" -msgstr "" +msgstr "nincs ilyen kapcsoló: %s" #: ../fdroid ../fdroidserver/__main__.py msgid "no version info found!" @@ -2404,13 +2412,13 @@ msgstr "a(z) -%s kapcsolóhoz argumentum szükséges" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s must not have an argument" -msgstr "" +msgstr "a(z) --%s kapcsolóhoz argumentum szükséges" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s not a unique prefix" -msgstr "" +msgstr "a(z) --%s kapcsoló nem egyedi előtag" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2422,7 +2430,7 @@ msgstr "a(z) --%s kapcsoló nem ismert" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s requires argument" -msgstr "" +msgstr "a(z) --%s kapcsolóhoz argumentum szükséges" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2437,7 +2445,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "positional arguments" -msgstr "" +msgstr "pozicionális argumentumok" #: ../fdroidserver/common.py #, python-brace-format @@ -2522,13 +2530,13 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "the following arguments are required: %s" -msgstr "" +msgstr "a következő argumentumok szükségesek: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "unexpected option string: %s" -msgstr "" +msgstr "váratlan kapcsoló karakterlánc: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2540,12 +2548,12 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "unrecognized arguments: %s" -msgstr "" +msgstr "nem felismert argumentumok: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" -msgstr "" +msgstr "nem biztonságos jogosultságok ennél: „{config_file}” (0600-nak kellene lennie)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py From 729e14bf6301ff7a7d08b63f0a035e25863dc69f Mon Sep 17 00:00:00 2001 From: ZZY2357 Date: Mon, 6 Sep 2021 15:35:17 +0200 Subject: [PATCH 0509/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by ZZY2357 Currently translated at 40.4% (233 of 576 strings) Translated using Weblate: Chinese (Simplified) (zh_Hans) by ZZY2357 Currently translated at 39.7% (229 of 576 strings) Co-authored-by: ZZY2357 Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 23 +++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 2a327566..2efd489a 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -9,20 +9,21 @@ # Hans-Christoph Steiner , 2021. # Liu Tao , 2021. # 世界 , 2021. +# ZZY2357 , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-03-21 07:29+0000\n" -"Last-Translator: Liu Tao \n" +"PO-Revision-Date: 2021-06-19 21:30+0000\n" +"Last-Translator: ZZY2357 \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.5.2-dev\n" +"X-Generator: Weblate 4.7\n" #: ../fdroidserver/common.py msgid "" @@ -598,7 +599,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" -msgstr "" +msgstr "删除未知文件: {path}" #: ../fdroidserver/lint.py #, python-format @@ -625,12 +626,12 @@ msgstr "" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" -msgstr "" +msgstr "不要给这个仓库部署新文件" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" -msgstr "" +msgstr "不要在链接中包含“{path}”!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" @@ -638,7 +639,7 @@ msgstr "不提示输入 Android SDK 路径,仅显示失败" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" -msgstr "" +msgstr "不要删除从密钥商店生成的私钥" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" @@ -659,7 +660,7 @@ msgstr "请勿使用 rsync 校验和" #: ../fdroid ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" -msgstr "" +msgstr "下载小型仓库的完整镜像" #: ../fdroidserver/stats.py msgid "Download logs we don't have" @@ -667,12 +668,12 @@ msgstr "下载当前没有的日志" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." -msgstr "" +msgstr "下载仓库已经失败了一次,不再尝试。" #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" -msgstr "" +msgstr "下载 {url} 失败。{error}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -690,7 +691,7 @@ msgstr "动态扫描已编译的 APKs" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" +msgstr "错误:\"server\" 子命令已被删除,请使用 \"deploy\"!" #: ../fdroidserver/mirror.py msgid "" From 772ee5688809f4a3fc01e6a3a1078e86b9fbb35c Mon Sep 17 00:00:00 2001 From: Eric Date: Mon, 6 Sep 2021 15:35:17 +0200 Subject: [PATCH 0510/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Eric Currently translated at 40.6% (234 of 576 strings) Translated using Weblate: Chinese (Simplified) (zh_Hans) by Eric Currently translated at 40.4% (233 of 576 strings) Translated using Weblate: Chinese (Simplified) (zh_Hans) by Eric Currently translated at 40.4% (233 of 576 strings) Co-authored-by: Eric Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 2efd489a..be52b604 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -15,15 +15,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-06-19 21:30+0000\n" -"Last-Translator: ZZY2357 \n" +"PO-Revision-Date: 2021-06-23 23:32+0000\n" +"Last-Translator: Eric \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.7\n" +"X-Generator: Weblate 4.7.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -639,7 +639,7 @@ msgstr "不提示输入 Android SDK 路径,仅显示失败" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" -msgstr "不要删除从密钥商店生成的私钥" +msgstr "不要删除从密钥库生成的私钥" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" @@ -1949,7 +1949,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "Usage" -msgstr "用法" +msgstr "使用" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2165,7 +2165,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "complex" -msgstr "" +msgstr "复合体" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From 872d2434e03d7feaa0f60756c85cab6b371feb3b Mon Sep 17 00:00:00 2001 From: whenwesober Date: Mon, 6 Sep 2021 15:35:17 +0200 Subject: [PATCH 0511/2116] Translated using Weblate: Indonesian (id) by whenwesober Currently translated at 13.7% (79 of 576 strings) Co-authored-by: whenwesober Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/id/ Translation: F-Droid/F-Droid Server --- locale/id/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index 2d2340f2..d973b6a2 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -2,20 +2,21 @@ # This file is put in the public domain. # signz signotorez , 2020, 2021. # Reza Almanda , 2021. +# whenwesober , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-03-13 19:36+0000\n" -"Last-Translator: signz signotorez \n" +"PO-Revision-Date: 2021-06-23 23:32+0000\n" +"Last-Translator: whenwesober \n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.5.2-dev\n" +"X-Generator: Weblate 4.7.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -2153,7 +2154,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "complex" -msgstr "" +msgstr "rumit" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From 2cf5c883d59eeb634595c49b12e820df73342586 Mon Sep 17 00:00:00 2001 From: Vancha March Date: Mon, 6 Sep 2021 15:35:18 +0200 Subject: [PATCH 0512/2116] Translated using Weblate: Frisian (fy) by Vancha March Currently translated at 3.6% (21 of 576 strings) Added translation using Weblate: Frisian (fy) by Vancha March Co-authored-by: Vancha March Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fy/ Translation: F-Droid/F-Droid Server --- locale/fy/LC_MESSAGES/fdroidserver.po | 2711 +++++++++++++++++++++++++ 1 file changed, 2711 insertions(+) create mode 100644 locale/fy/LC_MESSAGES/fdroidserver.po diff --git a/locale/fy/LC_MESSAGES/fdroidserver.po b/locale/fy/LC_MESSAGES/fdroidserver.po new file mode 100644 index 00000000..65805aca --- /dev/null +++ b/locale/fy/LC_MESSAGES/fdroidserver.po @@ -0,0 +1,2711 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# Vancha March , 2021. +msgid "" +msgstr "" +"Project-Id-Version: fdroidserver 2.0\n" +"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" +"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"PO-Revision-Date: 2021-07-01 15:29+0000\n" +"Last-Translator: Vancha March \n" +"Language-Team: Frisian \n" +"Language: fy\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.8-dev\n" + +#: ../fdroidserver/common.py +msgid "" +"\n" +" This is a repository of apps to be used with FDroid. Applications in this\n" +" repository are either official binaries built by the original application\n" +" developers, or are binaries built from source by f-droid.org using the\n" +" tools on https://gitlab.com/fdroid.\n" +" " +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH Public Key to be used as Deploy Key:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH public key to be used as deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "" +"\n" +"{path} encoded for the DEBUG_KEYSTORE secret variable:" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "\"%s/\" has no matching metadata file!" +msgstr "" + +#: ../fdroidserver/index.py +msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "\"{apkfilename}\" is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains outdated {name} ({version})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains recent {name} ({version})" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "\"{path}\" exists but s3cmd is not installed!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "\"{path}\" is not an accepted format, convert to: {formats}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "\"{url}\" is not a valid URL!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "%(option)s option requires %(number)d argument" +msgid_plural "%(option)s option requires %(number)d arguments" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/mirror.py +#, python-format +msgid "%(prog)s [options] url" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "%(prog)s: error: %(message)s\n" +msgstr "%(prog)s: flater: %(message)s\n" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "%d problems found" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "%prog [options]" +msgstr "%prog [options]" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "%r is not callable" +msgstr "%r is net opropber" + +#: ../fdroidserver/lint.py +#, python-format +msgid "%s is not an accepted build field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "%s option does not take a value" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' is NONE and 'smartcardoptions' is blank!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "'required' is an invalid argument for positionals" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in 'config.yml'!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + +#. Translators: "build-tools" is the file name of a package from +#. Google, it is part of the Android SDK. So it probably shouldn't be +#. translated or transliterated. +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-23.0.0 or newer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "'{apkfilename}' is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{field}' in {linedesc} is obsolete, see docs for current fields:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{path}' failed to execute!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "...checkupdate failed for {appid} : {error}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid ".__call__() not defined" +msgstr ".__call__() net definiearre" + +#: ../fdroidserver/metadata.py +msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "/issues is missing" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "A URL is required as an argument!" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Add PGP signatures using GnuPG for packages in repo" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Add a new application from its source code" +msgstr "Foech in nije applikaasje oan de hân fan harren boarne koade ta" + +#: ../fdroidserver/update.py +msgid "Add a repo signing key to an unsigned repo" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add skeleton metadata files for APKs that are missing them" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Adding new repo for only {name}" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Alias of the repo signing key in the keystore" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Also mirror the full archive section" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Also warn about formatting issues, like rewritemeta -l" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android AAR library" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android APK file" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android DEX code" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/build.py +#, python-brace-format +msgid "Android SDK '{path}' does not have '{dirname}' installed!" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Android SDK not found!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' is not a directory!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} found!" +msgstr "" + +#. Translators: "build-tools" is the file name of a package from +#. Google, it is part of the Android SDK. So it probably shouldn't be +#. translated or transliterated. +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android build-tools path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/update.py +msgid "AndroidManifest.xml has no date" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "App is in '{repo}' but has a link to {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Appending .git is not necessary" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Archiving {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in srclib '{srclib}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Broken symlink: {path}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Build a package from source" +msgstr "In pakket fan út de boarne opbouwe" + +#: ../fdroidserver/build.py +msgid "Build all applications available" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Build generated by `fdroid import` - remove disable line once ready" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Build metadata git repo has uncommited changes!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build only the latest version of each package" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "Built repo based in \"%s\" with this config:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Can't build due to {} error while scanning" +msgid_plural "Can't build due to {} errors while scanning" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/vmtools.py +#, python-brace-format +msgid "Cannot read \"{path}\"!" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Cannot resolve application ID {appid}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Cannot rewrite \"{path}\"" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "Cannot use --list and --to at the same time" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Categories '%s' is not valid" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Categories are not set" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Check for updates to applications" +msgstr "Kontrolearje op fernijingen fan applikaasjes" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Clean update - don't uses caches, reprocess all APKs" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Comma separated list of categories." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +#, c-format, python-format +msgid "Command '%s' not recognised.\n" +msgstr "Kommando '%s' net werkend.\n" + +#: ../fdroidserver/checkupdates.py +msgid "Commit changes" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not find '{command}' on your system" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Could not find latest version code" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Could not find latest version name" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not find {path} to remove it" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not parse size \"{size}\", wrong type \"{type}\"" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/import.py +msgid "Couldn't find Application ID" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/import.py +msgid "Couldn't find latest version code" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/import.py +msgid "Couldn't find latest version name" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Couldn't find package ID" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Cowardily refusing to overwrite existing signing key setup!" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Create a repo signing key in a keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Create skeleton metadata files that are missing" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Created new container \"{name}\"" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Creating \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating log directory" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Creating new S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating output directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating signed index with this key (SHA256):" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/verify.py +#: ../fdroidserver/publish.py +msgid "Creating temporary directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating unsigned index in preparation for signing" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "DEBUG_KEYSTORE is not set or the value is incomplete" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Delete APKs and/or OBBs without metadata from the repo" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting archive, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Deleting unknown file: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description '%s' is just the app's summary" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Description has a duplicate line" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Description of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Do not add 'disable:' to the generated build entries" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not deploy the new files to the repo" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Do not include \"{path}\" in URL!" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Do not prompt for Android SDK path, just fail" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not remove the private keys generated from the keystore" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't create a source tarball, useful when testing a build" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Don't do anything logs-related" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/nightly.py +#: ../fdroidserver/upload.py +msgid "Don't use rsync checksums" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Download complete mirrors of small repos" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Download logs we don't have" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Downloading the repository already failed once, not trying again." +msgstr "" + +#: ../fdroidserver/verify.py +#, python-brace-format +msgid "Downloading {url} failed. {error}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Duplicate link in '{field}': {url}" +msgstr "" + +#: ../fdroid +msgid "Dynamically scan APKs post build" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "" +"ERROR: this command should never be used to mirror f-droid.org!\n" +"A full mirror of f-droid.org requires more than 200GB." +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "ERROR: unsupported CI type, patches welcome!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Empty build flag at {linedesc}" +msgstr "" + +#: ../fdroidserver/__main__.py +#, python-brace-format +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"Enter the path to the Android SDK (%s) here:\n" +"> " +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py +#: ../fdroidserver/upload.py +#, python-format +msgid "Error while attempting to publish log: %s" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/common.py +msgid "Error while getting repo address" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Extract signatures from APKs" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed copying {path}: {error}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Failed fetching signatures for '{apkfilename}': {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed reading {path}: {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed resizing {path}: {error}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Failed to align application" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Failed to create S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get APK information, deleting {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get APK information, skipping {path}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to get APK manifest information" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Failed to install '{apkfilename}' on {dev}: {error}" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/common.py +msgid "Failed to sign application" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to zipalign application" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Fetched buildserverid from VM: {buildserverid}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "File disappeared while processing it: {path}" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/stats.py ../fdroidserver/update.py +#: ../fdroidserver/rewritemeta.py ../fdroidserver/build.py +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py +msgid "Finished" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID flag" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Forbidden HTML tags" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Force halting build after {0} sec timeout!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Force scan of disabled apps and builds." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found bad funding file \"{path}\" for \"{name}\":" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/metadata.py +msgid "Found invalid appids in arguments" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +msgid "Found invalid versionCodes for some apps" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Found multiple JAR Signature Block Files in {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Found multiple metadata files for {appid}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found multiple signing certificates for repository." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found multiple signing certificates in {path}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found no signing certificates for repository." +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Found non-file at %s" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Found {apkfilename} at {url}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Generated skeleton metadata for {appid}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git checkout of '%s' failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git clean failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git fetch failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git remote set-head failed" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git remote set-head failed: \"%s\"" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git reset failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule sync failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule update failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "HTTPS must be used with Subversion URLs!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "If a git mirror gets to big, allow the archive to be deleted" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "If this upload fails, try manually uploading to {url}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." +msgstr "" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring FUNDING.yml entry longer than 2048: %s" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Ignoring package without metadata: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Ignoring stale cache data for {apkfilename}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Ignoring {ext} file at '{path}'" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Include APKs that are signed with disabled algorithms like MD5" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the PGP signature .asc files in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the build logs in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the source tarballs in the mirror" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Initialising submodules" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Install all signed applications available" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Install built packages on devices" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s…" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}…" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Interact with the repo HTTP server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Invalid APK" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid VercodeOperation: {field}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid application ID {appid}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid boolean '%s'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid build flag at {line} in {linedesc}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid build format: {value} in {name}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid bulleted list" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid metadata in %s:%d" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Invalid metadata in: " +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Invalid name for published file: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid package name {0}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid redirect to non-HTTPS: {before} -> {after} " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid scrlib metadata: '{file}' does not exist" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: could not parse '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid versionCode: \"{versionCode}\" is not an integer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature failed to verify: {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature verified: {path}" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java JAR file" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#: ../fdroidserver/mirror.py +msgid "Java JDK not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java compiled class" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Javascript in HTML src attributes" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Keystore for signing key:\t" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the Liberapay: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the LiberapayID flag" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Locale included in f-droid.org URL" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Make the build stop on exceptions" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Malformed repository mirrors." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Malformed serverwebroot line:" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Mirror the full repo and archive, all file types." +msgstr "" + +#: ../fdroidserver/gpgsign.py +msgid "Missing output directory" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Name '%s' is just the auto name - remove it" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No 'config.yml' found, using defaults." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No Android SDK found!" +msgstr "" + +#: ../fdroidserver/import.py +msgid "No android or kivy project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No attached devices found" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "No commit specified for {versionName} in {linedesc}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No config.yml found, using defaults." +msgstr "" + +#: ../fdroidserver/index.py +msgid "No fingerprint in URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No git submodules available" +msgstr "" + +#: ../fdroidserver/import.py +msgid "No gradle project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/import.py ../fdroidserver/common.py +msgid "No information found." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is Free Software" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is for Android" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No packages specified" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "No signed APK available for %s" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No signed output directory - nothing to do" +msgstr "" + +#: ../fdroidserver/update.py ../fdroidserver/common.py +#, python-brace-format +msgid "No signing certificates found in {path}" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/metadata.py +#, python-format +msgid "No such package: %s" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No such versionCode {versionCode} for app {appid}" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +msgid "No unsigned directory - nothing to do" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Not a valid size definition: \"{}\"" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Nothing to do" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Nothing to do for {appid}." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "OBB file has newer versionCode({integer}) than any APK:" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB filename must start with \"main.\" or \"patch.\":" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB's packagename does not match a supported APK:" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Old APK signature failed to verify: {path}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Old, deprecated name for fdroid deploy" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Only PNG and JPEG are supported for graphics, found: {path}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only print differences with the Play Store" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only process apps with auto-updates" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "OpenCollective donation methods belong in the OpenCollective: field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "Options" +msgstr "Opsjes" + +#: ../fdroidserver/verify.py +msgid "Output JSON report to file named after APK." +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Output JSON to stdout." +msgstr "" + +#: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py +#: ../fdroidserver/update.py ../fdroidserver/signindex.py +#: ../fdroidserver/checkupdates.py +msgid "Outputting JSON" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Overall license of the project." +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" +msgstr "" + +#: ../fdroidserver/import.py +#, python-brace-format +msgid "Package \"{appid}\" already exists" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Parsing manifest at '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Password required with username" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Path to main Android project subdirectory, if not in root." +msgstr "" + +msgid "Path to main android project subdirectory, if not in root." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Path to the git repo to use as the log" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the keystore for the repo signing key" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Print the secret variable to the terminal for easy copy/paste" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Problem with description of {appid}: {error}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Problem with xml at '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Process auto-updates" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#, python-brace-format +msgid "Processing {apkfilename}" +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#, python-brace-format +msgid "Processing {appid}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable XML/JSON for index files" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable index.xml" +msgstr "" + +#: ../fdroidserver/import.py +msgid "Project URL to import from." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Punctuation should be avoided" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Push the log to this git remote repository" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Pushing binary transparency log to {url}" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Pushing to {url}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Quickly start a new repository" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Read all the metadata files and exit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading '{config_file}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading minSdkVersion failed: \"{apkfilename}\"" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Reading {apkfilename} from cache" +msgstr "" + +#: ../fdroidserver/stats.py +msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Removing specified files" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Rename APK files that do not match package.name_123.apk" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Report on build data status" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Resigning {apkfilename} with provided debug.keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Resize all the icons exceeding the max pixel size and exit" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Restrict output to warnings and errors" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Rewrite all the metadata files" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "Rewrite to a specific format: " +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}'" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}' to '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Run on git repo that has uncommitted changes" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Run rewritemeta to fix formatting" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Running first pass with MD5 checking disabled" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Running wget in {path}" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scan the resulting APK(s) for known non-free classes." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Scan the source code of a package" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:{versionCode}:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scanner found {} problem" +msgid_plural "Scanner found {} problems" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/common.py +msgid "Set clock to that time using:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Set maximum releases in repo before older ones are archived" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Set open file limit to {integer}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Set up an app build for a nightly build repo" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setting open file limit failed: " +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Setting {0} sec timeout for this build" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Sign and place packages in the repo" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Sign indexes created using update --nosign" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Skip scanning the source code for binaries and other problems" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping '{apkfilename}' with invalid signature!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping index generation for {appid}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: disabled" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: no builds specified" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Specify a local folder to sync the repo to" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "Specify an identity file to provide to SSH for rsyncing" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Specify that we're running on the build server" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Specify which debug keystore file to use." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Spew out even more information than normal" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Striping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Stripping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Summary '%s' is just the app's name" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Summary of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "System clock is older than date in {path}!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "The OBB version code must come after \"{name}.\":" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "The base URL for the repo to log (default: https://f-droid.org)" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "The directory to write the mirror to" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "The file to be included in the repo (path or glob)" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "The only commands currently supported are 'init' and 'update'" +msgstr "" + +#: ../fdroidserver/index.py +msgid "The repository's fingerprint does not match." +msgstr "" + +#: ../fdroidserver/common.py +msgid "The repository's index could not be verified." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "The root dir for local_copy_dir \"{path}\" does not exist!" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "There is a keyalias collision - publishing halted" +msgstr "" + +#: ../fdroidserver/common.py +msgid "These are the apps that have been archived from the main repo." +msgstr "" + +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + +#: ../fdroidserver/import.py +#, python-format +msgid "This repo already has local metadata: %s" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL must start with https:// or http://" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL shorteners should not be used" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "URL title is just the URL, use brackets: [URL]" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "URL {url} in Description: {error}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unexpected text on same line as {field} in {linedesc}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Unknown exception found!" +msgstr "Ûnbekende útsûndering fûn!" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Unknown file '{filename}' in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Unknown metadata format: %s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path} (use: *.yml)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Unknown version of aapt, might cause problems: " +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary leading space" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary trailing space" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised app field '{fieldname}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unrecognised app field: " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised build flag '{build_flag}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised field '{field}' in {linedesc}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported file type \"{extension}\" for repo graphic" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported graphics file found: {path}" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Unsupported metadata format, use: --to [{supported}]" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unterminated ]" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Unterminated ]]" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unterminated build in {name}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unterminated continuation in {name}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused extlib at %s" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused file at %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scandelete path: %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scanignore path: %s" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update repo information for new packages" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update the binary transparency log for a URL" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Update the stats of the repo" +msgstr "" + +#: ../fdroidserver/update.py ../fdroidserver/build.py +msgid "Update the wiki" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "UpdateCheckData has invalid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must use HTTPS URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData not a valid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID - it can be removed" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID, it can be removed" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to androidobservatory.org" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to virustotal" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "Usage" +msgstr "Gebrûk" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "Usage: %s\n" +msgstr "Gebrûk: %s\n" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master to point at a file in the default branch" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use `fdroid update -c` to create it." +msgstr "" + +#: ../fdroidserver/build.py +msgid "Use build server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Using \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v2" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v3" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Using androguard from \"{path}\"" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Using existing keystore \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "Using s3cmd to sync with: {url}" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Valid commands are:" +msgstr "Jildige kommando's binne:" + +#: ../fdroidserver/verify.py +msgid "Verify against locally cached copy rather than redownloading." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Verify the integrity of downloaded packages" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Verifying index signature:" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "Warn about possible metadata errors" +msgstr "" + +#: ../fdroidserver/update.py +msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgstr "" + +msgid "X.509 'Distiguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/init.py +msgid "X.509 'Distinguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/common.py +msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "ZIP file archive" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "adding IdentityFile to {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "adding to {name}: {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "ambiguous option: %s (%s?)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "apksigner not found, it's required for signing!" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py +#: ../fdroidserver/checkupdates.py +msgid "application ID of file to operate on" +msgstr "" + +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py +msgid "application ID with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py +msgid "applicationId in the form APPID" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "applicationId to check for updates" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/verify.py ../fdroidserver/publish.py +#: ../fdroidserver/build.py ../fdroidserver/scanner.py +#: ../fdroidserver/install.py +msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "argument \"-\" with mode %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare SSH connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare ssh connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "can not parse scrlib spec (not a string): '{}'" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "can't open '%s': %s" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "cannot find required srclibs: \"{path}\"" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "cannot have multiple subparser arguments" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "cannot merge actions - two groups are named %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "cannot publish update, did you set the deploy key?" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "cloning {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "command to execute, either 'init' or 'update'" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "commands from plugin modules:" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "complex" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "conflicting option string: %s" +msgid_plural "conflicting option strings: %s" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "copying {apkfilename} into {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "could not parse '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no ref specified): '{}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (too many '@' signs): '{}'" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "created {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "deleting: repo/{apkfilename}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed build logs to '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed process log {path} to {dest}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "dest= is required for options like %r" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "executable binary, possibly code" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "expected %s argument" +msgid_plural "expected %s arguments" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected at least one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected at most one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "expected one argument" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "failed deploying build logs to '{path}'" +msgstr "" + +#: ../fdroid +msgid "fdroid [-h|--help|--version] []" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "fdroid [] [-h|--help|--version|]" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "floating-point" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force errors to be warnings, or ignore" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force metadata errors (default) to be warnings, or to be ignored." +msgstr "" + +#: ../fdroidserver/common.py +msgid "git svn clone failed" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "gzip file archive" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "ignored explicit argument %r" +msgstr "" + +#: ../fdroidserver/index.py +msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "integer" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid %(type)s value: %(value)r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid choice: %(value)r (choose from %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid conflict_resolution value: %r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be an absolute path!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be directory, not a file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "mirror '%s' does not end with 'fdroid'!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "mutually exclusive arguments must be optional" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "no \"icon\" in {appid}" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "no APK supplied" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "no such option: %s" +msgstr "" + +#: ../fdroid ../fdroidserver/__main__.py +msgid "no version info found!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "not allowed with argument %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "one of the arguments %s is required" +msgstr "" + +#: ../fdroidserver/index.py ../fdroidserver/common.py +msgid "only accepts strings, lists, and tuples" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "option %s: If you really want to install all the signed apps, use --all" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "option %s: invalid %s value: %r" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +#, python-format +msgid "option %s: invalid choice: %r (choose from %s)" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option -%s not recognized" +msgstr "opsje -%s wurd net werkend" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option -%s requires argument" +msgstr "opsje -%s hat in argumint nedich" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s must not have an argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s not a unique prefix" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s not recognized" +msgstr "opsje --%s wurd net werkend" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py +#, python-format +msgid "option --%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "optional arguments" +msgstr "opsjonele arguminten" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "overwriting existing {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +msgid "positional arguments" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "process log deploy {path} to {dest} failed!" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon %s does not exist, generating placeholder." +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "ruamel.yaml not installed, can not write metadata." +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "s3cmd sync indexes {path} to {url} and delete" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "shared library" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py +msgid "show program's version number and exit" +msgstr "lit it ferzje nûmer fan de applikaasje sjen en slút ôf" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py +#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +msgid "show this help message and exit" +msgstr "dit help berjocht sjen litte en ôfslute" + +#: ../fdroidserver/signatures.py +msgid "signed APK, either a file-path or HTTPS URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: log content is empty" +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: not enabled in config" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "skipping source tarball: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "srclibs missing name and/or @" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "static library" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "the following arguments are required: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unexpected option string: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py +#, python-format +msgid "unrecognized arguments: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "unsafe permissions on '{config_file}' (should be 0600)!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid +#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +msgid "usage: " +msgstr "gebrûk: " + +#: ../fdroid +msgid "usage: fdroid [-h|--help|--version] []" +msgstr "gebrûk: fdroid [-h|--help|--version] []" + +#: ../fdroidserver/deploy.py ../fdroidserver/upload.py +#, python-brace-format +msgid "using Apache libcloud to sync with {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "virustotal.com is rate limiting, waiting to retry..." +msgstr "" + +#: ../fdroidserver/update.py +msgid "wiki support is deprecated and will be removed in the next release!" +msgstr "" + +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "{0} app, {1} key aliases" +msgid_plural "{0} apps, {1} key aliases" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} ({appid}) has no metadata!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using application ID instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using package name instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android Package Name!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android application ID!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Java Package Name!" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{appid} is missing {name}" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: Unknown extlib {path} in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "{appid}: no builds specified, running on current source state" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be an integer, found: {value}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{field} not terminated in {name}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{file} is blank or corrupt!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{path}\" does not exist! Correct it in config.yml." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + +#: ../fdroidserver/import.py +#, python-brace-format +msgid "{path} already exists, ignoring import results!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "{path} does not exist! Create it by running:" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} is zero size!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} more than 200MB, manually upload: {url}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{url} does not end with \"fdroid\", check the URL path!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{url} does not start with \"http\"!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "{} build failed" +msgid_plural "{} builds failed" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/build.py +msgid "{} build succeeded" +msgid_plural "{} builds succeeded" +msgstr[0] "" +msgstr[1] "" From b600a8cfd493b93e279888c18efe93788a7a9657 Mon Sep 17 00:00:00 2001 From: Orhan Date: Mon, 6 Sep 2021 15:35:18 +0200 Subject: [PATCH 0513/2116] Translated using Weblate: Turkish (tr) by Orhan Currently translated at 100.0% (576 of 576 strings) Co-authored-by: Orhan Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/tr/ Translation: F-Droid/F-Droid Server --- locale/tr/LC_MESSAGES/fdroidserver.po | 31 ++++++++++++++------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index 1f9d9e7b..3cbf7081 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -1,20 +1,21 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # Oğuz Ersen , 2020, 2021. +# Orhan , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-31 22:07+0000\n" -"Last-Translator: Oğuz Ersen \n" +"PO-Revision-Date: 2021-07-01 22:06+0000\n" +"Last-Translator: Orhan \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.8-dev\n" #: ../fdroidserver/common.py msgid "" @@ -366,7 +367,7 @@ msgstr "Bozuk simgesel bağlantı: {path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Build a package from source" -msgstr "Kaynaktan bir paket inşa et" +msgstr "Kaynaktan bir paket oluştur" #: ../fdroidserver/build.py msgid "Build all applications available" @@ -459,7 +460,7 @@ msgstr "Kategorilerin virgülle ayrılmış listesi." #: ../fdroid ../fdroidserver/__main__.py #, c-format, python-format msgid "Command '%s' not recognised.\n" -msgstr "Komut '%s' tanınmıyor.\n" +msgstr "'%s' komutu tanınmıyor.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" @@ -531,7 +532,7 @@ msgstr "Bir anahtar deposunda, depo imzalama anahtarı yaratır" #: ../fdroidserver/update.py msgid "Create skeleton metadata files that are missing" -msgstr "Eksik olan iskelet üst veri dosyalarını yarat" +msgstr "Eksik olan iskelet üst veri dosyalarını oluştur" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -580,7 +581,7 @@ msgstr "DEBUG_KEYSTORE ayarlı değil veya değer eksik" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "Depodan üst verisi olmayan APKları ve/veya OBBleri sil" +msgstr "Depoda üst verisi olmayan APK ve/veya OBB dosyalarını sil" #: ../fdroidserver/deploy.py #, python-brace-format @@ -683,7 +684,7 @@ msgstr "'{field}' içinde yinelenen bağlantı: {url}" #: ../fdroid msgid "Dynamically scan APKs post build" -msgstr "İnşa sonrası APKları dinamik olarak tara" +msgstr "Oluşturma sonrası APK dosyalarını dinamik olarak tara" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -996,7 +997,7 @@ msgstr "Kullanılabilir tüm imzalı uygulamaları kur" #: ../fdroid ../fdroidserver/__main__.py msgid "Install built packages on devices" -msgstr "İnşa edilen paketleri aygıtlara kur" +msgstr "Oluşturulan paketleri aygıtlara kur" #: ../fdroidserver/install.py #, python-format @@ -1495,7 +1496,7 @@ msgstr "Belirtilen dosyalar kaldırılıyor" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" -msgstr "paket.ad_123.apk ile eşleşmeyen tüm APK dosyalarını yeniden adlandır" +msgstr "paket.adı_123.apk örüntüsüyle eşleşmeyen tüm APK dosyalarını yeniden adlandır" #: ../fdroidserver/update.py msgid "Report on build data status" @@ -1782,7 +1783,7 @@ msgstr "{configname} içinde bilinmeyen girdi {key}" #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" -msgstr "Bilinmeyen özel durum bulundu!" +msgstr "Bilinmeyen istisna bulundu!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py @@ -2399,13 +2400,13 @@ msgstr "seçenek %s: geçersiz seçim: %r (%s içinden seçin)" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option -%s not recognized" -msgstr "seçenek -%s tanınmıyor" +msgstr "-%s seçeneği tanınmıyor" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py #, python-format msgid "option -%s requires argument" -msgstr "şeçenek -%s argüman gerektirir" +msgstr "-%s seçeneği argüman gerektirir" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2423,7 +2424,7 @@ msgstr "--%s seçeneği tekil ön ek değil" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s not recognized" -msgstr "seçenek --%s tanınmıyor" +msgstr "--%s seçeneği tanınmıyor" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2561,7 +2562,7 @@ msgstr "kullanım: " #: ../fdroid msgid "usage: fdroid [-h|--help|--version] []" -msgstr "kullanım: fdroid [-h|--help|--version] []" +msgstr "kullanım: fdroid [-h|--help|--version] []" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format From a508636fe24be0a60dc097f48de35626070c07df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A7=D1=82=D0=B0=D0=B1=D1=81?= Date: Mon, 6 Sep 2021 15:35:19 +0200 Subject: [PATCH 0514/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Russi?= =?UTF-8?q?an=20(ru)=20by=20=D0=A7=D1=82=D0=B0=D0=B1=D1=81=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (576 of 576 strings) Co-authored-by: Чтабс Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translation: F-Droid/F-Droid Server --- locale/ru/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index cfc56634..9d13959c 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -15,15 +15,15 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-06-06 13:34+0000\n" -"Last-Translator: Andrey \n" +"PO-Revision-Date: 2021-07-01 22:06+0000\n" +"Last-Translator: Чтабс \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.8-dev\n" #: ../fdroidserver/common.py msgid "" @@ -2179,7 +2179,7 @@ msgstr "Команды из подключаемых модулей:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "complex" -msgstr "complex" +msgstr "комплекс" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From ac5b117b12ed2cdd4131a2c9696c75f3d8242ce6 Mon Sep 17 00:00:00 2001 From: gub Date: Mon, 6 Sep 2021 15:35:19 +0200 Subject: [PATCH 0515/2116] Translated using Weblate: French (fr) by gub Currently translated at 93.9% (541 of 576 strings) Co-authored-by: gub Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index ca4a399a..b4bd908b 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -30,15 +30,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-03-15 02:09+0000\n" -"Last-Translator: lilim \n" +"PO-Revision-Date: 2021-07-02 07:38+0000\n" +"Last-Translator: gub \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.5.2-dev\n" +"X-Generator: Weblate 4.8-dev\n" #: ../fdroidserver/common.py msgid "" @@ -2493,7 +2493,7 @@ msgstr "refuser le téléchargement via une connexion HTTP non sécurisée (util #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" -msgstr "" +msgstr "refusez de télécharger via une connexion http non sécurisée (utilisez https ou précisez --no-https-check) : {apkfilename}" #: ../fdroidserver/index.py #, python-format From 41dcb59c4e15989444063b9a1d7763d2e5b7b105 Mon Sep 17 00:00:00 2001 From: Jaxom Date: Mon, 6 Sep 2021 15:35:20 +0200 Subject: [PATCH 0516/2116] Translated using Weblate: French (fr) by Jaxom Currently translated at 93.9% (541 of 576 strings) Co-authored-by: Jaxom Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 37 +++++++++++---------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index b4bd908b..4b6a8ec3 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -25,13 +25,14 @@ # Vincent Finance , 2021. # Gavy , 2021. # lilim , 2021. +# Jaxom , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-07-02 07:38+0000\n" -"Last-Translator: gub \n" +"Last-Translator: Jaxom \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -1757,15 +1758,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Voici les applications qui ont été archivées à partir du dépôt principal." #: ../fdroidserver/common.py -#, fuzzy msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" -"\n" -" Ceci est un dépôt d’applications à utiliser avec FDroid. Les applications publiées\n" -" dans ce dépôt sont soit celles compilées par les développeurs\n" -" de ces applications, soit celles compilées par f-droid.org à partir des\n" -" sources en utilisant les outils disponibles sur https://gitlab.com/fdroid.\n" -" " +msgstr "Ceci est un dépôt d’applications à utiliser avec FDroid. Les applications publiées dans ce dépôt sont soit les binaires officiels compilés par les développeurs de ces applications, soit celles compilées par f-droid.org à partir des sources en utilisant les outils disponibles sur https://gitlab.com/fdroid." #: ../fdroidserver/import.py #, python-format @@ -2120,7 +2114,6 @@ msgstr "applicationId pour vérifier les mises à jour" #: ../fdroidserver/verify.py ../fdroidserver/publish.py #: ../fdroidserver/build.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py -#, fuzzy msgid "application ID with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId avec le versionCode optionnel sous la forme APPID[:VERCODE]" @@ -2204,11 +2197,11 @@ msgstr "complexe" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py -#, python-format +#, fuzzy, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "chaîne de caractères optionnelle en conflit : %s" +msgstr[1] "chaînes de caractères optionnelles en conflit : %s" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2250,9 +2243,9 @@ msgstr "log du processus {path} déployé vers {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py -#, fuzzy, python-format +#, python-format msgid "dest= is required for options like %r" -msgstr "dest= est requis pour les options comme %r" +msgstr "dest= est obligatoire pour les options comme %r" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" @@ -2282,9 +2275,9 @@ msgid "expected one argument" msgstr "un seul argument est attendu" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "failed deploying build logs to '{path}'" -msgstr "le journal de construction n'a pas pu être déployé sur '{path}'" +msgstr "le journal de compilation n'a pas pu être déployé sur '{path}'" #: ../fdroid msgid "fdroid [-h|--help|--version] []" @@ -2332,13 +2325,13 @@ msgstr "entier" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py -#, fuzzy, python-format +#, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valeur %(type)s non valide : %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py -#, fuzzy, python-format +#, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "choix non valide : %(value)r (choisissez parmi %(choices)s)" @@ -2350,7 +2343,7 @@ msgstr "valeur de conflict_resolution invalide : %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py -#, fuzzy, python-format +#, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "chaîne d’option non valide %(option)r : doit commencer par un caractère %(prefix_chars)r" @@ -2368,7 +2361,7 @@ msgid "local_copy_dir must be directory, not a file!" msgstr "local_copy_dir doit être absolument un dossier, pas un fichier !" #: ../fdroidserver/index.py -#, fuzzy, python-format +#, python-format msgid "mirror '%s' does not end with 'fdroid'!" msgstr "le miroir «%s» ne se termine pas par «fdroid» !" @@ -2419,7 +2412,7 @@ msgstr "option %s : Si vous voulez vraiment installer toutes les applications si #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py -#, fuzzy, python-format +#, python-format msgid "option %s: invalid %s value: %r" msgstr "option %s : valeur %s non valide : %r" From fad47948b8d7a48c2a1c9ffd7010eee9a0806629 Mon Sep 17 00:00:00 2001 From: booteille Date: Mon, 6 Sep 2021 15:35:20 +0200 Subject: [PATCH 0517/2116] Translated using Weblate: French (fr) by booteille Currently translated at 93.9% (541 of 576 strings) Co-authored-by: booteille Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 4b6a8ec3..b6af274d 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -26,13 +26,14 @@ # Gavy , 2021. # lilim , 2021. # Jaxom , 2021. +# booteille , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-07-02 07:38+0000\n" -"Last-Translator: Jaxom \n" +"PO-Revision-Date: 2021-07-02 07:39+0000\n" +"Last-Translator: booteille \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2107,9 +2108,8 @@ msgstr "apksigner est introuvable, il est requis pour la signature !" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "application ID of file to operate on" -msgstr "applicationId pour vérifier les mises à jour" +msgstr "ID d'application du fichier sur lequel agir" #: ../fdroidserver/verify.py ../fdroidserver/publish.py #: ../fdroidserver/build.py ../fdroidserver/scanner.py @@ -2164,7 +2164,7 @@ msgstr "Impossible de trouver srclibs : \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "cannot have multiple subparser arguments" -msgstr "" +msgstr "Impossible d'avoir plusieurs arguments du sous-parseur" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2186,7 +2186,6 @@ msgid "command to execute, either 'init' or 'update'" msgstr "Commande à exécuter : 'init' ou 'update'" #: ../fdroidserver/__main__.py -#, fuzzy msgid "commands from plugin modules:" msgstr "commandes des modules d'extension :" From fdc9eb192547616783892b2d4fdb713b385453f1 Mon Sep 17 00:00:00 2001 From: hilariousperson Date: Mon, 6 Sep 2021 15:35:20 +0200 Subject: [PATCH 0518/2116] Translated using Weblate: French (fr) by hilariousperson Currently translated at 93.9% (541 of 576 strings) Co-authored-by: hilariousperson Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index b6af274d..dafb4d54 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -33,7 +33,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-07-02 07:39+0000\n" -"Last-Translator: booteille \n" +"Last-Translator: hilariousperson \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -1957,7 +1957,7 @@ msgstr "UpdateCheckMode est configuré mais on dirait que checkupdates n'a pas e #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID - it can be removed" -msgstr "" +msgstr "UpdateCheckName est défini sur l'ID d’application connu - il peut être supprimé" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" From 5abbc70351a5223b7b1cab70daafd020a74534ad Mon Sep 17 00:00:00 2001 From: gub Date: Mon, 6 Sep 2021 15:35:21 +0200 Subject: [PATCH 0519/2116] Translated using Weblate: French (fr) by gub Currently translated at 94.0% (542 of 576 strings) Co-authored-by: gub Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index dafb4d54..947361d8 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -32,8 +32,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-07-02 07:39+0000\n" -"Last-Translator: hilariousperson \n" +"PO-Revision-Date: 2021-07-02 07:40+0000\n" +"Last-Translator: gub \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2495,7 +2495,7 @@ msgstr "repo_icon \"repo/icons/%s\" n'existe pas, génération d'une icône de s #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." -msgstr "" +msgstr "repo_icon %s n'existe pas, génération d'une icône de remplacement." #: ../fdroidserver/metadata.py #, fuzzy From 58f5a2fc24cc17066c0777223077e033b55dc407 Mon Sep 17 00:00:00 2001 From: Jaxom Date: Mon, 6 Sep 2021 15:35:21 +0200 Subject: [PATCH 0520/2116] Translated using Weblate: French (fr) by Jaxom Currently translated at 94.0% (542 of 576 strings) Co-authored-by: Jaxom Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 947361d8..9130a1d3 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -33,7 +33,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-07-02 07:40+0000\n" -"Last-Translator: gub \n" +"Last-Translator: Jaxom \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2485,7 +2485,7 @@ msgstr "refuser le téléchargement via une connexion HTTP non sécurisée (util #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" -msgstr "refusez de télécharger via une connexion http non sécurisée (utilisez https ou précisez --no-https-check) : {apkfilename}" +msgstr "refuser de télécharger via une connexion http non sécurisée (utiliser https ou préciser --no-https-check) : {apkfilename}" #: ../fdroidserver/index.py #, python-format From bd2cce972d028833e14d6fb05f65d6c9961a131a Mon Sep 17 00:00:00 2001 From: lilim Date: Mon, 6 Sep 2021 15:35:22 +0200 Subject: [PATCH 0521/2116] Translated using Weblate: French (fr) by lilim Currently translated at 94.7% (546 of 576 strings) Co-authored-by: lilim Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 9130a1d3..fdd5e703 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -32,8 +32,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-07-02 07:40+0000\n" -"Last-Translator: Jaxom \n" +"PO-Revision-Date: 2021-07-02 07:46+0000\n" +"Last-Translator: lilim \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2528,11 +2528,11 @@ msgstr "" #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "" +msgstr "passer le déploiement des journaux de compilation complets: le contenu du journal est vide" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" -msgstr "" +msgstr "passer le déploiement des journaux de compilation complets: non activé dans la configuration" #: ../fdroidserver/update.py #, python-brace-format From bd6dcd405bde6f2a62386bcea56533c29f555685 Mon Sep 17 00:00:00 2001 From: gub Date: Mon, 6 Sep 2021 15:35:22 +0200 Subject: [PATCH 0522/2116] Translated using Weblate: French (fr) by gub Currently translated at 94.7% (546 of 576 strings) Co-authored-by: gub Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index fdd5e703..053c5bb0 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -33,7 +33,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-07-02 07:46+0000\n" -"Last-Translator: lilim \n" +"Last-Translator: gub \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2524,7 +2524,7 @@ msgstr "afficher ce message d'aide et quitter" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." -msgstr "" +msgstr "APK signé, soit un chemin de fichier ou une URL HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" From 34f498896a9781f8ce49380376b8d755028ee967 Mon Sep 17 00:00:00 2001 From: Jaxom Date: Mon, 6 Sep 2021 15:35:23 +0200 Subject: [PATCH 0523/2116] Translated using Weblate: French (fr) by Jaxom Currently translated at 94.7% (546 of 576 strings) Co-authored-by: Jaxom Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 053c5bb0..1d78fb4a 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -32,8 +32,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-07-02 07:46+0000\n" -"Last-Translator: gub \n" +"PO-Revision-Date: 2021-07-02 07:47+0000\n" +"Last-Translator: Jaxom \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2495,17 +2495,16 @@ msgstr "repo_icon \"repo/icons/%s\" n'existe pas, génération d'une icône de s #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." -msgstr "repo_icon %s n'existe pas, génération d'une icône de remplacement." +msgstr "Le repo_icon %s n'existe pas, génération d'une icône de remplacement." #: ../fdroidserver/metadata.py -#, fuzzy msgid "ruamel.yaml not installed, can not write metadata." -msgstr "ruamel.yaml n’est pas installé, impossible d’écrire des métadonnées." +msgstr "ruamel.yaml n’est pas installé, impossible d’écrire les métadonnées." #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" -msgstr "" +msgstr "s3cmd synchroniser les index {path} vers {url} et les supprimer" #: ../fdroidserver/scanner.py msgid "shared library" From 50604e6e6eb73cf1f4e4a586b1ce6c7aa09e7aef Mon Sep 17 00:00:00 2001 From: lilim Date: Mon, 6 Sep 2021 15:35:23 +0200 Subject: [PATCH 0524/2116] Translated using Weblate: French (fr) by lilim Currently translated at 94.9% (547 of 576 strings) Co-authored-by: lilim Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 1d78fb4a..a1f050e6 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -32,8 +32,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-07-02 07:47+0000\n" -"Last-Translator: Jaxom \n" +"PO-Revision-Date: 2021-07-02 07:48+0000\n" +"Last-Translator: lilim \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2536,7 +2536,7 @@ msgstr "passer le déploiement des journaux de compilation complets: non activé #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" -msgstr "" +msgstr "omission de la tarball de sources: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" From 2e6fbad2af898038396cf84e06a4023d95f0b89e Mon Sep 17 00:00:00 2001 From: Jaxom Date: Mon, 6 Sep 2021 15:35:24 +0200 Subject: [PATCH 0525/2116] Translated using Weblate: French (fr) by Jaxom Currently translated at 94.9% (547 of 576 strings) Co-authored-by: Jaxom Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index a1f050e6..a84a4202 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -33,7 +33,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-07-02 07:48+0000\n" -"Last-Translator: lilim \n" +"Last-Translator: Jaxom \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2531,7 +2531,7 @@ msgstr "passer le déploiement des journaux de compilation complets: le contenu #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" -msgstr "passer le déploiement des journaux de compilation complets: non activé dans la configuration" +msgstr "passer le déploiement des journaux de compilation complets : non activé dans la configuration" #: ../fdroidserver/update.py #, python-brace-format From aa876d2c14f22c12aae18168715e3afcedb0dfc1 Mon Sep 17 00:00:00 2001 From: lilim Date: Mon, 6 Sep 2021 15:35:24 +0200 Subject: [PATCH 0526/2116] Translated using Weblate: French (fr) by lilim Currently translated at 95.4% (550 of 576 strings) Co-authored-by: lilim Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index a84a4202..c4ca6fff 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -32,8 +32,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-07-02 07:48+0000\n" -"Last-Translator: Jaxom \n" +"PO-Revision-Date: 2021-07-02 07:51+0000\n" +"Last-Translator: lilim \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2540,7 +2540,7 @@ msgstr "omission de la tarball de sources: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" -msgstr "" +msgstr "les srclibs manquent un nom ou un @" #: ../fdroidserver/scanner.py msgid "static library" @@ -2596,7 +2596,7 @@ msgstr "utilisation de Apache libcloud pour syncronizer avec {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "" +msgstr "virustotal.com limite le nombre de requête, en attente avant de réessayer..." #: ../fdroidserver/update.py msgid "wiki support is deprecated and will be removed in the next release!" From 47b732635d1118b174648907cac02742485090f3 Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Mon, 6 Sep 2021 15:35:25 +0200 Subject: [PATCH 0527/2116] Translated using Weblate: French (fr) by ButterflyOfFire Currently translated at 95.4% (550 of 576 strings) Co-authored-by: ButterflyOfFire Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index c4ca6fff..e7460489 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -33,7 +33,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-07-02 07:51+0000\n" -"Last-Translator: lilim \n" +"Last-Translator: ButterflyOfFire \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2544,7 +2544,7 @@ msgstr "les srclibs manquent un nom ou un @" #: ../fdroidserver/scanner.py msgid "static library" -msgstr "" +msgstr "bibliothèque statique" #: ../fdroidserver/common.py #, python-brace-format From bd72a98c9436528a9e26c8b960332b0edbb4da2f Mon Sep 17 00:00:00 2001 From: Jaxom Date: Mon, 6 Sep 2021 15:35:25 +0200 Subject: [PATCH 0528/2116] Translated using Weblate: French (fr) by Jaxom Currently translated at 95.4% (550 of 576 strings) Co-authored-by: Jaxom Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index e7460489..8d477695 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -32,8 +32,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-07-02 07:51+0000\n" -"Last-Translator: ButterflyOfFire \n" +"PO-Revision-Date: 2021-07-02 07:52+0000\n" +"Last-Translator: Jaxom \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2536,7 +2536,7 @@ msgstr "passer le déploiement des journaux de compilation complets : non activ #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" -msgstr "omission de la tarball de sources: {path}" +msgstr "omission de la tarball de sources : {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" From e8a645c4b6d8852b961f9414c1a8f2fbbee12ff5 Mon Sep 17 00:00:00 2001 From: lilim Date: Mon, 6 Sep 2021 15:35:26 +0200 Subject: [PATCH 0529/2116] Translated using Weblate: French (fr) by lilim Currently translated at 96.1% (554 of 576 strings) Co-authored-by: lilim Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 8d477695..1ca5a4dc 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -32,8 +32,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-07-02 07:52+0000\n" -"Last-Translator: Jaxom \n" +"PO-Revision-Date: 2021-07-02 07:56+0000\n" +"Last-Translator: lilim \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2606,8 +2606,8 @@ msgstr "" #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{0} appli, {1} alias de clé" +msgstr[1] "{0} applis, {1} alias de clé" #: ../fdroidserver/update.py #, fuzzy, python-brace-format @@ -2617,7 +2617,7 @@ msgstr "{apkfilename} ({appid}) n’a pas de métadonnées !" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" +msgstr "{apkfilename} a pluseiurs fichiers {name}, on dirait que c'est une faille ou exploitation de la clé maître (Master Key) !" #: ../fdroidserver/update.py #, fuzzy, python-brace-format From db9f69a1306e01e1f75000aeb6e969547781a61a Mon Sep 17 00:00:00 2001 From: Jaxom Date: Mon, 6 Sep 2021 15:35:26 +0200 Subject: [PATCH 0530/2116] Translated using Weblate: French (fr) by Jaxom Currently translated at 96.1% (554 of 576 strings) Co-authored-by: Jaxom Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 1ca5a4dc..b0538cba 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -33,7 +33,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-07-02 07:56+0000\n" -"Last-Translator: lilim \n" +"Last-Translator: Jaxom \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2596,11 +2596,11 @@ msgstr "utilisation de Apache libcloud pour syncronizer avec {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "virustotal.com limite le nombre de requête, en attente avant de réessayer..." +msgstr "virustotal.com limite le nombre de requêtes, en attente avant de réessayer..." #: ../fdroidserver/update.py msgid "wiki support is deprecated and will be removed in the next release!" -msgstr "" +msgstr "l'assistance wiki est obsolète et sera enlevée dans la prochaine version !" #: ../fdroidserver/publish.py #, python-brace-format @@ -2610,9 +2610,9 @@ msgstr[0] "{0} appli, {1} alias de clé" msgstr[1] "{0} applis, {1} alias de clé" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" -msgstr "{apkfilename} ({appid}) n’a pas de métadonnées !" +msgstr "{apkfilename} ({appid}) ne contient pas de métadonnées !" #: ../fdroidserver/update.py #, python-brace-format From 86161f1efc0594a9aa3730f6d3b6d2d3b95bfd4a Mon Sep 17 00:00:00 2001 From: lilim Date: Mon, 6 Sep 2021 15:35:27 +0200 Subject: [PATCH 0531/2116] Translated using Weblate: French (fr) by lilim Currently translated at 97.5% (562 of 576 strings) Co-authored-by: lilim Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index b0538cba..9fc1f274 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -32,8 +32,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-07-02 07:56+0000\n" -"Last-Translator: Jaxom \n" +"PO-Revision-Date: 2021-07-02 07:58+0000\n" +"Last-Translator: lilim \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2668,7 +2668,7 @@ msgstr "{appid} : pas de versions spécifiées, s'exécute à partir de l'éta #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "" +msgstr "{appid}: {field} doit être un '{type}', mais est un '{fieldtype}'!" #: ../fdroidserver/lint.py #, python-brace-format From b98a341b5de4170c14735ec9e9e034ef9b3e9ac1 Mon Sep 17 00:00:00 2001 From: Jaxom Date: Mon, 6 Sep 2021 15:35:27 +0200 Subject: [PATCH 0532/2116] Translated using Weblate: French (fr) by Jaxom Currently translated at 97.5% (562 of 576 strings) Co-authored-by: Jaxom Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 9fc1f274..b57a2705 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -32,8 +32,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-07-02 07:58+0000\n" -"Last-Translator: lilim \n" +"PO-Revision-Date: 2021-07-02 07:59+0000\n" +"Last-Translator: Jaxom \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2617,42 +2617,42 @@ msgstr "{apkfilename} ({appid}) ne contient pas de métadonnées !" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} a pluseiurs fichiers {name}, on dirait que c'est une faille ou exploitation de la clé maître (Master Key) !" +msgstr "{apkfilename} a plusieurs fichiers {name}, on dirait que c'est une faille ou exploitation de la clé maître (Master Key) !" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "Le fichier AndroidManifest.xml de {apkfilename} possède une date incorrecte : " #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} n’a pas de nom ! Utilisation de l’ID d’application à la place." #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{appid} does not have a name! Using package name instead." msgstr "{appid} n’a pas de nom ! Utilisation du nom du paquet à la place." #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{appid} from {path} is not a valid Android Package Name!" msgstr "{appid} de {path} n’est pas un nom de paquet Android valide !" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" msgstr "{appid} de {path} n’est pas un ID d’application Android valide !" #: ../fdroidserver/metadata.py ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} de {path} n’est pas un nom de paquet Java valide !" #: ../fdroidserver/mirror.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{appid} is missing {name}" -msgstr "{appid} manque de {name}" +msgstr "{appid} n'a pas de {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py From 6077b0761727fe6b42dc9d1cf0b6e661bd9e3c8e Mon Sep 17 00:00:00 2001 From: lilim Date: Mon, 6 Sep 2021 15:35:28 +0200 Subject: [PATCH 0533/2116] Translated using Weblate: French (fr) by lilim Currently translated at 97.7% (563 of 576 strings) Co-authored-by: lilim Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index b57a2705..ecc38e23 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -32,8 +32,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-07-02 07:59+0000\n" -"Last-Translator: Jaxom \n" +"PO-Revision-Date: 2021-07-02 08:00+0000\n" +"Last-Translator: lilim \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2673,7 +2673,7 @@ msgstr "{appid}: {field} doit être un '{type}', mais est un '{fieldtype}'!" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" -msgstr "" +msgstr "{appid}: {field} doit être un '{type}', mais est un '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format From 25c8ad5d6baf095468dfb2c4e704e1186a8efe19 Mon Sep 17 00:00:00 2001 From: Jaxom Date: Mon, 6 Sep 2021 15:35:28 +0200 Subject: [PATCH 0534/2116] Translated using Weblate: French (fr) by Jaxom Currently translated at 97.7% (563 of 576 strings) Co-authored-by: Jaxom Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index ecc38e23..b0a04408 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -32,8 +32,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-07-02 08:00+0000\n" -"Last-Translator: lilim \n" +"PO-Revision-Date: 2021-07-02 08:01+0000\n" +"Last-Translator: Jaxom \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2668,7 +2668,7 @@ msgstr "{appid} : pas de versions spécifiées, s'exécute à partir de l'éta #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "{appid}: {field} doit être un '{type}', mais est un '{fieldtype}'!" +msgstr "{appid}: {field} doit être un '{type}', mais est un '{fieldtype}' !" #: ../fdroidserver/lint.py #, python-brace-format From 53018a1b4a544a6b59dbee0b65ae4ac17c9a345f Mon Sep 17 00:00:00 2001 From: lilim Date: Mon, 6 Sep 2021 15:35:29 +0200 Subject: [PATCH 0535/2116] Translated using Weblate: French (fr) by lilim Currently translated at 98.2% (566 of 576 strings) Co-authored-by: lilim Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index b0a04408..b06c0595 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -32,8 +32,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-07-02 08:01+0000\n" -"Last-Translator: Jaxom \n" +"PO-Revision-Date: 2021-07-02 08:09+0000\n" +"Last-Translator: lilim \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2678,7 +2678,7 @@ msgstr "{appid}: {field} doit être un '{type}', mais est un '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" -msgstr "" +msgstr "{build_flag} doit être un entier, a trouvé: {value}" #: ../fdroidserver/metadata.py #, python-brace-format From c54775ef48e0c156ec989559abdc8f5824f1fba5 Mon Sep 17 00:00:00 2001 From: Jaxom Date: Mon, 6 Sep 2021 15:35:29 +0200 Subject: [PATCH 0536/2116] Translated using Weblate: French (fr) by Jaxom Currently translated at 98.2% (566 of 576 strings) Co-authored-by: Jaxom Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index b06c0595..55dac089 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -32,8 +32,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-07-02 08:09+0000\n" -"Last-Translator: lilim \n" +"PO-Revision-Date: 2021-07-02 08:10+0000\n" +"Last-Translator: Jaxom \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -470,7 +470,7 @@ msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, arc msgstr "Vérification de l'archivage pour {appid} - APKs : {integer}, keepversions : {keep}, archapks : {arch}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "Vérification de l'archivage pour {appid} - APKs : {integer}, keepversions : {keep}, archapks : {arch}" @@ -2199,8 +2199,8 @@ msgstr "complexe" #, fuzzy, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" -msgstr[0] "chaîne de caractères optionnelle en conflit : %s" -msgstr[1] "chaînes de caractères optionnelles en conflit : %s" +msgstr[0] "chaîne d'options en conflit : %s" +msgstr[1] "chaînes d'options en conflit : %s" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2370,7 +2370,7 @@ msgid "mutually exclusive arguments must be optional" msgstr "les arguments qui s'excluent mutuellement doivent être optionnels" #: ../fdroidserver/mirror.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "no \"icon\" in {appid}" msgstr "aucune \"icon\" dans {appid}" @@ -2673,7 +2673,7 @@ msgstr "{appid}: {field} doit être un '{type}', mais est un '{fieldtype}' !" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" -msgstr "{appid}: {field} doit être un '{type}', mais est un '{fieldtype}'!" +msgstr "{appid}: {field} doit être un '{type}', mais est un '{fieldtype}' !" #: ../fdroidserver/metadata.py #, python-brace-format From c9fc162d6e863148a55e74544e22f95dd5ab74ca Mon Sep 17 00:00:00 2001 From: lilim Date: Mon, 6 Sep 2021 15:35:30 +0200 Subject: [PATCH 0537/2116] Translated using Weblate: French (fr) by lilim Currently translated at 98.6% (568 of 576 strings) Co-authored-by: lilim Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 55dac089..357d30d8 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -32,8 +32,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-07-02 08:10+0000\n" -"Last-Translator: Jaxom \n" +"PO-Revision-Date: 2021-07-02 08:33+0000\n" +"Last-Translator: lilim \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2698,7 +2698,7 @@ msgstr "{name} \"{path}\" n'existe pas! Corrigez le dans config.yml." #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "" +msgstr "{name} \"{section}/icons/{path}\" n'existe pas ! Vérifiez \"config.yml\"." #: ../fdroidserver/common.py #, fuzzy, python-brace-format @@ -2708,7 +2708,7 @@ msgstr "{oldfile} est obsolète, utilisez {newfile}" #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" -msgstr "" +msgstr "{path} existe déjà, ignorance des résultats de l'importation" #: ../fdroidserver/nightly.py #, fuzzy, python-brace-format From b8d0bc50ddb0176c57052740c7f6ae99c7f62731 Mon Sep 17 00:00:00 2001 From: Jaxom Date: Mon, 6 Sep 2021 15:35:30 +0200 Subject: [PATCH 0538/2116] Translated using Weblate: French (fr) by Jaxom Currently translated at 99.4% (573 of 576 strings) Translated using Weblate: French (fr) by Jaxom Currently translated at 98.6% (568 of 576 strings) Co-authored-by: Jaxom Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 357d30d8..042206e0 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -32,8 +32,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-07-02 08:33+0000\n" -"Last-Translator: lilim \n" +"PO-Revision-Date: 2021-07-02 14:30+0000\n" +"Last-Translator: Jaxom \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2668,7 +2668,7 @@ msgstr "{appid} : pas de versions spécifiées, s'exécute à partir de l'éta #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "{appid}: {field} doit être un '{type}', mais est un '{fieldtype}' !" +msgstr "{appid}: {field} doit être un '{type}', mais est un '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format @@ -2676,9 +2676,9 @@ msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "{appid}: {field} doit être un '{type}', mais est un '{fieldtype}' !" #: ../fdroidserver/metadata.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{build_flag} must be an integer, found: {value}" -msgstr "{build_flag} doit être un entier, a trouvé: {value}" +msgstr "{build_flag} doit être un entier, valeur trouvée : {value}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2686,7 +2686,7 @@ msgid "{field} not terminated in {name}" msgstr "" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{file} is blank or corrupt!" msgstr "{file} est vide ou corrompu !" @@ -2701,19 +2701,19 @@ msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" n'existe pas ! Vérifiez \"config.yml\"." #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} est obsolète, utilisez {newfile}" #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" -msgstr "{path} existe déjà, ignorance des résultats de l'importation" +msgstr "{path} existe déjà, ignorance des résultats de l'importation !" #: ../fdroidserver/nightly.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} does not exist! Create it by running:" -msgstr "{path} n’existe pas ! Créez-le en exécutant :" +msgstr "{path} n’existe pas ! Créez-le en exécutant :" #: ../fdroidserver/update.py #, python-brace-format @@ -2721,7 +2721,7 @@ msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} is zero size!" msgstr "{path} a une taille nulle !" From 2bfc566206625e0a0ba1072bd7e7c309174ef541 Mon Sep 17 00:00:00 2001 From: lilim Date: Mon, 6 Sep 2021 15:35:31 +0200 Subject: [PATCH 0539/2116] Translated using Weblate: French (fr) by lilim Currently translated at 99.4% (573 of 576 strings) Co-authored-by: lilim Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 042206e0..75b5a1d4 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -33,7 +33,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-07-02 14:30+0000\n" -"Last-Translator: Jaxom \n" +"Last-Translator: lilim \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2683,7 +2683,7 @@ msgstr "{build_flag} doit être un entier, valeur trouvée : {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{field} not terminated in {name}" -msgstr "" +msgstr "{field} n'est pas terminé dans {name}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2718,7 +2718,7 @@ msgstr "{path} n’existe pas ! Créez-le en exécutant :" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "" +msgstr "{path} a une mauvaise signature de fichier \"{pattern}\", possibilité d'une faille Janus !" #: ../fdroidserver/update.py #, python-brace-format From e674acbec1427570118889ae4c74087aca011847 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?yahoo=EF=BD=9E=EF=BD=9E?= Date: Mon, 6 Sep 2021 15:35:31 +0200 Subject: [PATCH 0540/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Chine?= =?UTF-8?q?se=20(Simplified)=20(zh=5FHans)=20by=20yahoo=EF=BD=9E=EF=BD=9E?= =?UTF-8?q?=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 41.4% (239 of 576 strings) Co-authored-by: yahoo~~ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index be52b604..5ade9351 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -10,20 +10,21 @@ # Liu Tao , 2021. # 世界 , 2021. # ZZY2357 , 2021. +# yahoo~~ , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-06-23 23:32+0000\n" -"Last-Translator: Eric \n" +"PO-Revision-Date: 2021-07-05 17:03+0000\n" +"Last-Translator: yahoo~~ \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.7.1-dev\n" +"X-Generator: Weblate 4.8-dev\n" #: ../fdroidserver/common.py msgid "" @@ -504,7 +505,7 @@ msgstr "无法打开 apk 文件 {path} 用于分析: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" -msgstr "" +msgstr "无法解析大小 \"{size}\", 错误类型 \"{type}\"" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/import.py @@ -527,7 +528,7 @@ msgstr "找不到安装包 ID" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" -msgstr "" +msgstr "拒绝覆盖现有的签署密钥设置!" #: ../fdroidserver/update.py msgid "Create a repo signing key in a keystore" @@ -562,7 +563,7 @@ msgstr "创建输出目录" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" -msgstr "" +msgstr "使用此密钥 (SHA256) 创建签名索引:" #: ../fdroidserver/import.py ../fdroidserver/verify.py #: ../fdroidserver/publish.py @@ -576,11 +577,11 @@ msgstr "创建未签名的索引以准备签名" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "" +msgstr "当前版本代码 {cv} 小于最旧的构建 {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" -msgstr "" +msgstr "DEBUG_KEYSTORE 未被设置或不完整" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" From a3710fe26582000aa43a4760922d93a14dfa922f Mon Sep 17 00:00:00 2001 From: Agnieszka C Date: Mon, 6 Sep 2021 15:35:31 +0200 Subject: [PATCH 0541/2116] Translated using Weblate: Polish (pl) by Agnieszka C Currently translated at 100.0% (576 of 576 strings) Translated using Weblate: Polish (pl) by Agnieszka C Currently translated at 100.0% (576 of 576 strings) Co-authored-by: Agnieszka C Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ Translation: F-Droid/F-Droid Server --- locale/pl/LC_MESSAGES/fdroidserver.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index b9467a7a..816cf243 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -4,20 +4,21 @@ # Michal L , 2020, 2021. # mondstern , 2021. # Hans-Christoph Steiner , 2021. +# Agnieszka C , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-03-13 19:36+0000\n" -"Last-Translator: WaldiS \n" +"PO-Revision-Date: 2021-07-17 22:14+0000\n" +"Last-Translator: Agnieszka C \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.5.2-dev\n" +"X-Generator: Weblate 4.7.2-dev\n" #: ../fdroidserver/common.py msgid "" @@ -752,7 +753,7 @@ msgstr "Nieudane kopiowanie {path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" -msgstr "Nie powiodło się pobieranie sygnatur dla '{apkfilename}': {error}" +msgstr "Nie powiodło się pobieranie podpisów dla '{apkfilename}': {error}" #: ../fdroidserver/update.py #, python-brace-format @@ -1740,7 +1741,7 @@ msgstr "To są aplikacje, które zostały zarchiwizowane w głównym repozytoriu #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "To jest repozytorium aplikacji używanych z F-Droid. Aplikacje w tym repozytorium są albo oficjalnymi plikami binarnymi utworzonymi przez pierwotnych twórców aplikacji, albo plikami binarnymi utworzonymi ze źródła przez administratora f-droid.org przy użyciu narzędzi na https://gitlab.com/fdroid." +msgstr "To jest repozytorium aplikacji używanych z F-Droid. Aplikacje w tym repozytorium są albo oficjalnymi plikami binarnymi utworzonymi przez oryginalnych programistów aplikacji, albo plikami binarnymi utworzonymi ze źródła przez administratora f-droid.org przy użyciu narzędzi na https://gitlab.com/fdroid." #: ../fdroidserver/import.py #, python-format From 473063a7cbd422a0b895ae609ecd27c3786d1e0a Mon Sep 17 00:00:00 2001 From: Myeongjin Lee Date: Mon, 6 Sep 2021 15:35:32 +0200 Subject: [PATCH 0542/2116] Translated using Weblate: Korean (ko) by Myeongjin Lee Currently translated at 38.7% (223 of 576 strings) Translated using Weblate: Korean (ko) by Myeongjin Lee Currently translated at 36.2% (209 of 576 strings) Co-authored-by: Myeongjin Lee Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ko/ Translation: F-Droid/F-Droid Server --- locale/ko/LC_MESSAGES/fdroidserver.po | 64 +++++++++++++-------------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index 3da18e51..f5c9b9b3 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -1,20 +1,21 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # Hans-Christoph Steiner , 2020, 2021. +# Myeongjin Lee , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-28 22:09+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2021-08-16 19:53+0000\n" +"Last-Translator: Myeongjin Lee \n" "Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.8-dev\n" #: ../fdroidserver/common.py msgid "" @@ -35,7 +36,6 @@ msgstr "" "배포 키로 사용될 SSH 공개 키:" #: ../fdroidserver/nightly.py -#, fuzzy msgid "" "\n" "SSH public key to be used as deploy key:" @@ -62,9 +62,9 @@ msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" #: ../fdroidserver/install.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "'{apkfilename}'는 이미 {dev}에 설치되어 있습니다." +msgstr "\"{apkfilename}\"는 이미 {dev}에 설치되어 있습니다." #: ../fdroidserver/update.py #, python-brace-format @@ -94,7 +94,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" -msgstr "" +msgstr "\"{url}\"은 올바른 URL이 아닙니다!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -147,7 +147,7 @@ msgstr "'keypass'를 config.yml에서 찾을 수 없습니다!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" +msgstr "'keystore'이 없고 'smartcardoptions'가 비어 있습니다!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" @@ -168,12 +168,11 @@ msgstr "'required'는 고정적을 위한 잘못된 인수입니다" #: ../fdroidserver/common.py msgid "'sdk_path' not set in 'config.yml'!" -msgstr "'sdk_path'를 'config.yml'에서 설정할 수 없습니다!" +msgstr "'sdk_path'가 'config.yml'에서 설정되어 있지 않습니다!" #: ../fdroidserver/common.py -#, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "'sdk_path'를 'config.yml'에서 설정할 수 없습니다!" +msgstr "'sdk_path'가 config.yml에서 설정되어 있지 않습니다!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -401,9 +400,9 @@ msgstr "\"{path}\"를 읽을 수 없습니다!" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Cannot resolve application ID {appid}" -msgstr "앱 id {appid}를 해결할 수 없습니다" +msgstr "애플리케이션 ID {appid}를 해결할 수 없습니다" #: ../fdroidserver/rewritemeta.py #, python-brace-format @@ -989,7 +988,7 @@ msgid "Install built packages on devices" msgstr "기기에 내장된 패키지 설치" #: ../fdroidserver/install.py -#, fuzzy, python-format +#, python-format msgid "Installing %s..." msgstr "%s 설치 중…" @@ -999,9 +998,9 @@ msgid "Installing %s…" msgstr "%s 설치 중…" #: ../fdroidserver/install.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." -msgstr "{dev}에서 '{apkfilename}' 설치 중…" +msgstr "{dev}에서 '{apkfilename}' 설치 중..." #: ../fdroidserver/install.py #, python-brace-format @@ -1752,9 +1751,8 @@ msgid "URL {url} in Description: {error}" msgstr "" #: ../fdroidserver/lint.py -#, fuzzy msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "잘못된 라이선스 태그 \"%s\"! https://spdx.org/license-list 에서의 태그만을 사용하세요" +msgstr "잘못된 라이선스 태그 \"{}\"! https://spdx.org/license-list 에서 FSF 또는 OSI에서 승인된 태그만을 사용하세요" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" @@ -1791,9 +1789,9 @@ msgid "Unknown metadata format: {path}" msgstr "알 수 없는 메타데이터 형식: {path}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" -msgstr "알 수 없는 메타데이터 형식: {path}" +msgstr "알 수 없는 메타데이터 형식: {path} (사용: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " @@ -1874,14 +1872,14 @@ msgid "Unused file at %s" msgstr "%s에서 사용되지 않은 파일" #: ../fdroidserver/scanner.py -#, fuzzy, python-format +#, python-format msgid "Unused scandelete path: %s" -msgstr "%s에서 사용되지 않은 파일" +msgstr "사용되지 않은 스캔삭제 경로: %s" #: ../fdroidserver/scanner.py -#, fuzzy, python-format +#, python-format msgid "Unused scanignore path: %s" -msgstr "%s에서 사용되지 않은 파일" +msgstr "사용되지 않은 스캔삭제 경로: %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -2072,16 +2070,14 @@ msgstr "" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "application ID of file to operate on" -msgstr "업데이트를 확인할 applicationId" +msgstr "작업할 파일의 애플리케이션 ID" #: ../fdroidserver/verify.py ../fdroidserver/publish.py #: ../fdroidserver/build.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py -#, fuzzy msgid "application ID with optional versionCode in the form APPID[:VERCODE]" -msgstr "양식 APPID[:VERCODE]에서 선택적인 versionCode로 된 applicationId" +msgstr "양식 APPID[:VERCODE]에서 선택적인 versionCode로 된 애플리케이션 ID" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py msgid "applicationId in the form APPID" @@ -2588,9 +2584,9 @@ msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "{apkfilename}의 AndroidManifest.xml에 잘못된 날짜가 있습니다: " #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{appid} does not have a name! Using application ID instead." -msgstr "{appid}는 이름을 가지지 않습니다! 대신 패키지 이름 사용." +msgstr "{appid}는 이름을 가지지 않습니다! 대신 애플리케이션 ID를 사용." #: ../fdroidserver/update.py #, python-brace-format @@ -2659,9 +2655,9 @@ msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\"는 존재하지 않습니다! config.yml에서 그것을 고치세요." #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "{name} \"{path}\"는 존재하지 않습니다! config.yml에서 그것을 고치세요." +msgstr "{name} \"{section}/icons/{path}\"는 존재하지 않습니다! \"config.yml\"을 확인하세요." #: ../fdroidserver/common.py #, python-brace-format @@ -2699,9 +2695,9 @@ msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url}는 \"fdroid\"로 끝나지 않습니다, URL 경로를 확인하세요!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{url} does not start with \"http\"!" -msgstr "{url}는 \"fdroid\"로 끝나지 않습니다, URL 경로를 확인하세요!" +msgstr "{url}는 \"http\"로 시작하지 않습니다!" #: ../fdroidserver/build.py msgid "{} build failed" From 5014da84c351997b376c13d07e05d2846bcfa5dc Mon Sep 17 00:00:00 2001 From: Simona Iacob Date: Mon, 6 Sep 2021 15:35:32 +0200 Subject: [PATCH 0543/2116] Translated using Weblate: Romanian (ro) by Simona Iacob Currently translated at 100.0% (576 of 576 strings) Translated using Weblate: Romanian (ro) by Simona Iacob Currently translated at 100.0% (576 of 576 strings) Co-authored-by: Simona Iacob Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ro/ Translation: F-Droid/F-Droid Server --- locale/ro/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 3aedd1c6..d2a8016e 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-06-23 23:32+0000\n" +"PO-Revision-Date: 2021-08-05 15:35+0000\n" "Last-Translator: Simona Iacob \n" "Language-Team: Romanian \n" "Language: ro\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n" -"X-Generator: Weblate 4.7.1-dev\n" +"X-Generator: Weblate 4.8-dev\n" #: ../fdroidserver/common.py msgid "" @@ -2261,11 +2261,11 @@ msgstr "a eșuat distribuirea jurnalelor de construcție în '{path}'" #: ../fdroid msgid "fdroid [-h|--help|--version] []" -msgstr "fdroid [-h|--help|--version] []" +msgstr "fdroid [-h|--help|--version] []" #: ../fdroid ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" -msgstr "fdroid [] [-h|--help|--version|]" +msgstr "fdroid [] [-h|--help|--version|]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py From b5dcd3e9168fbed7b864ccd1c356c1de64e78367 Mon Sep 17 00:00:00 2001 From: hilariousperson Date: Mon, 6 Sep 2021 15:35:32 +0200 Subject: [PATCH 0544/2116] Translated using Weblate: French (fr) by hilariousperson Currently translated at 100.0% (576 of 576 strings) Co-authored-by: hilariousperson Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 75b5a1d4..182c643b 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -32,15 +32,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-07-02 14:30+0000\n" -"Last-Translator: lilim \n" +"PO-Revision-Date: 2021-07-13 17:46+0000\n" +"Last-Translator: hilariousperson \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 4.7.2-dev\n" #: ../fdroidserver/common.py msgid "" @@ -120,7 +120,7 @@ msgstr "\"{path}\" n'est pas un format supporté (utiliser : metadata/*.yml)" #: ../fdroidserver/metadata.py #, python-brace-format msgid "\"{path}\" is not an accepted format, convert to: {formats}" -msgstr "{path} n'est pas un format accepté, convertir en {formats}" +msgstr "\"{path}\" n'est pas un format accepté, convertir en : \"{formats}\"" #: ../fdroidserver/common.py #, python-brace-format From c8da25b4ffda6771fe4779e21f78c30e3d4e6a07 Mon Sep 17 00:00:00 2001 From: translator Date: Mon, 6 Sep 2021 15:35:33 +0200 Subject: [PATCH 0545/2116] Translated using Weblate: French (fr) by translator Currently translated at 100.0% (576 of 576 strings) Translated using Weblate: French (fr) by translator Currently translated at 100.0% (576 of 576 strings) Co-authored-by: translator Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 182c643b..a87703d1 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -27,13 +27,14 @@ # lilim , 2021. # Jaxom , 2021. # booteille , 2021. +# translator , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-07-13 17:46+0000\n" -"Last-Translator: hilariousperson \n" +"PO-Revision-Date: 2021-07-14 16:55+0000\n" +"Last-Translator: translator \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -115,12 +116,12 @@ msgstr "\"{path}\" existe mais s3cmd n'est pas installé !" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "\"{path}\" n'est pas un format supporté (utiliser : metadata/*.yml)" +msgstr "Le format du ficher \"{path}\" n'est pas supporté (utiliser : metadata/*.yml)" #: ../fdroidserver/metadata.py #, python-brace-format msgid "\"{path}\" is not an accepted format, convert to: {formats}" -msgstr "\"{path}\" n'est pas un format accepté, convertir en : \"{formats}\"" +msgstr "\"{path}\" n'est pas un format accepté, convertir en : {formats}" #: ../fdroidserver/common.py #, python-brace-format @@ -2196,7 +2197,7 @@ msgstr "complexe" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py -#, fuzzy, python-format +#, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "chaîne d'options en conflit : %s" @@ -2502,9 +2503,9 @@ msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml n’est pas installé, impossible d’écrire les métadonnées." #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" -msgstr "s3cmd synchroniser les index {path} vers {url} et les supprimer" +msgstr "s3cmd synchroniser les index de {path} vers {url} et les supprimer" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2676,7 +2677,7 @@ msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" msgstr "{appid}: {field} doit être un '{type}', mais est un '{fieldtype}' !" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} doit être un entier, valeur trouvée : {value}" From 4f74fc8a627e152fedb7e65c26ed46a6d4f5f8b4 Mon Sep 17 00:00:00 2001 From: privacysimp Date: Mon, 6 Sep 2021 15:35:33 +0200 Subject: [PATCH 0546/2116] Translated using Weblate: Dutch (nl) by privacysimp Currently translated at 3.4% (20 of 576 strings) Co-authored-by: privacysimp Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/nl/ Translation: F-Droid/F-Droid Server --- locale/nl/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index 3f2bef85..5e5bb53c 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -1,20 +1,21 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # Bart Groeneveld , 2020. +# privacysimp , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2020-10-01 20:58+0000\n" -"Last-Translator: Bart Groeneveld \n" +"PO-Revision-Date: 2021-07-16 15:35+0000\n" +"Last-Translator: privacysimp \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.3-dev\n" +"X-Generator: Weblate 4.7.2-dev\n" #: ../fdroidserver/common.py msgid "" @@ -2151,7 +2152,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "complex" -msgstr "" +msgstr "complex" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From a3a20337ea3b317692bb3981e2f493850b938b68 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Mon, 6 Sep 2021 15:35:34 +0200 Subject: [PATCH 0547/2116] Translated using Weblate: Persian (fa) by Danial Behzadi Currently translated at 4.1% (24 of 576 strings) Translated using Weblate: Persian (fa) by Danial Behzadi Currently translated at 4.1% (24 of 576 strings) Co-authored-by: Danial Behzadi Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fa/ Translation: F-Droid/F-Droid Server --- locale/fa/LC_MESSAGES/fdroidserver.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index 2a805a1a..ccb331e5 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -2,20 +2,21 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Mostafa Ahangarha , 2020. +# Danial Behzadi , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2020-10-06 08:26+0000\n" -"Last-Translator: Mostafa Ahangarha \n" +"PO-Revision-Date: 2021-07-27 15:49+0000\n" +"Last-Translator: Danial Behzadi \n" "Language-Team: Persian \n" "Language: fa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.3-dev\n" +"X-Generator: Weblate 4.7.2-dev\n" #: ../fdroidserver/common.py msgid "" @@ -1935,7 +1936,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "Usage" -msgstr "مصرف" +msgstr "استفاده" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2151,7 +2152,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "complex" -msgstr "" +msgstr "پیچیده" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From 5b0e5a5f283f1e06ea4b5326d9ee2f0671db8cb8 Mon Sep 17 00:00:00 2001 From: Joel A Date: Mon, 6 Sep 2021 15:35:34 +0200 Subject: [PATCH 0548/2116] Translated using Weblate: Swedish (sv) by Joel A Currently translated at 8.8% (51 of 576 strings) Co-authored-by: Joel A Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sv/ Translation: F-Droid/F-Droid Server --- locale/sv/LC_MESSAGES/fdroidserver.po | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index b2fc2597..727e7c47 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -2,20 +2,21 @@ # This file is put in the public domain. # Hans-Christoph Steiner , 2020. # Elias Mårtenson , 2021. +# Joel A , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-01-15 13:25+0000\n" -"Last-Translator: Elias Mårtenson \n" +"PO-Revision-Date: 2021-08-03 09:50+0000\n" +"Last-Translator: Joel A \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.8-dev\n" #: ../fdroidserver/common.py msgid "" @@ -2253,7 +2254,7 @@ msgstr "" #: ../fdroidserver/metadata.py msgid "force errors to be warnings, or ignore" -msgstr "" +msgstr "tvinga fel att bli varningar, eller ignorera" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." @@ -2342,7 +2343,7 @@ msgstr "" #: /usr/lib/python3.7/optparse.py #, python-format msgid "no such option: %s" -msgstr "" +msgstr "inget sådant val: %s" #: ../fdroid ../fdroidserver/__main__.py msgid "no version info found!" @@ -2515,7 +2516,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "the following arguments are required: %s" -msgstr "" +msgstr "följande argument krävs: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From 5652f305209072db8b7a2ca1588aa14b9c250cac Mon Sep 17 00:00:00 2001 From: ssantos Date: Mon, 6 Sep 2021 15:35:34 +0200 Subject: [PATCH 0549/2116] Translated using Weblate: Portuguese (pt) by ssantos Currently translated at 100.0% (576 of 576 strings) Co-authored-by: ssantos Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/ Translation: F-Droid/F-Droid Server --- locale/pt/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 6c4e7b6c..b0a3fe98 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-05-10 06:47+0000\n" +"PO-Revision-Date: 2021-08-07 21:34+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" "Language: pt\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.8-dev\n" #: ../fdroidserver/common.py msgid "" From 4cf2cdcec6b28279a6bc81521f01f9371eb953dd Mon Sep 17 00:00:00 2001 From: Kaantaja Date: Mon, 6 Sep 2021 15:35:35 +0200 Subject: [PATCH 0550/2116] Translated using Weblate: Finnish (fi) by Kaantaja Currently translated at 0.1% (1 of 576 strings) Co-authored-by: Kaantaja Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fi/ Translation: F-Droid/F-Droid Server --- locale/fi/LC_MESSAGES/fdroidserver.po | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index 0fb19648..c5f27dd0 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -1,19 +1,21 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # A , 2020. +# Kaantaja , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" +"PO-Revision-Date: 2021-08-23 01:29+0000\n" +"Last-Translator: Kaantaja \n" +"Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.8.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -2149,7 +2151,7 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "complex" -msgstr "" +msgstr "monimutkainen" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From 8e251e234f675479490d25f728e8db29615588f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Mon, 6 Sep 2021 15:35:35 +0200 Subject: [PATCH 0551/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Norwe?= =?UTF-8?q?gian=20Bokm=C3=A5l=20(nb=5FNO)=20by=20Allan=20Nordh=C3=B8y=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 59.0% (340 of 576 strings) Co-authored-by: Allan Nordhøy Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/nb_NO/ Translation: F-Droid/F-Droid Server --- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index 18b4af63..824a16dd 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -8,15 +8,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-04-21 17:29+0000\n" -"Last-Translator: mondstern \n" +"PO-Revision-Date: 2021-09-01 21:33+0000\n" +"Last-Translator: Allan Nordhøy \n" "Language-Team: Norwegian Bokmål \n" "Language: nb_NO\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.8.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -364,7 +364,7 @@ msgstr "Forgrening '{branch}' brukt som innsendelse i srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" -msgstr "Brutt symlink: {path}" +msgstr "Brutt symbolsk lenke: {path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Build a package from source" @@ -628,7 +628,7 @@ msgstr "Beskrivelse av lengde {length} overstiger {limit} tegngrensen" #: ../fdroidserver/import.py msgid "Do not add 'disable:' to the generated build entries" -msgstr "Ikke legg \"deaktiver:\" til den genererte bygge oppføringer" +msgstr "Ikke legg til «deaktivert:» blant genererte bygg" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" @@ -861,7 +861,7 @@ msgstr "Tving gjennom byggstans etter {0} sek. tidsavbrudd." #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." -msgstr "Force skanning av funksjonshemmede apps og bygger." +msgstr "Påtving skanning av avskrudde programmer og bygg." #: ../fdroidserver/update.py #, fuzzy, python-brace-format From eff8d26019e76373b0bb21430c552f66e4252967 Mon Sep 17 00:00:00 2001 From: lilim Date: Mon, 6 Sep 2021 15:35:36 +0200 Subject: [PATCH 0552/2116] Translated using Weblate: French (fr) by lilim Currently translated at 100.0% (576 of 576 strings) Co-authored-by: lilim Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index a87703d1..34844e77 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -33,15 +33,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-07-14 16:55+0000\n" -"Last-Translator: translator \n" +"PO-Revision-Date: 2021-09-02 20:49+0000\n" +"Last-Translator: lilim \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.7.2-dev\n" +"X-Generator: Weblate 4.8.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -2568,7 +2568,7 @@ msgstr "chaîne d'option inattendue : %s" #: /usr/lib/python3.7/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "parser inconnu %(parser_name)r (choix: %(choices)s)" +msgstr "parser inconnu %(parser_name)r (choix : %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2694,7 +2694,7 @@ msgstr "{file} est vide ou corrompu !" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{path}\" does not exist! Correct it in config.yml." -msgstr "{name} \"{path}\" n'existe pas! Corrigez le dans config.yml." +msgstr "{name} \"{path}\" n'existe pas ! Corrigez le dans config.yml." #: ../fdroidserver/update.py #, python-brace-format From daec62f57c06155d85ae5d6b8a29150e6b095549 Mon Sep 17 00:00:00 2001 From: translator Date: Mon, 6 Sep 2021 15:35:36 +0200 Subject: [PATCH 0553/2116] Translated using Weblate: French (fr) by translator Currently translated at 100.0% (576 of 576 strings) Co-authored-by: translator Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 34844e77..6988f580 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -34,7 +34,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" "PO-Revision-Date: 2021-09-02 20:49+0000\n" -"Last-Translator: lilim \n" +"Last-Translator: translator \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2528,7 +2528,7 @@ msgstr "APK signé, soit un chemin de fichier ou une URL HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "passer le déploiement des journaux de compilation complets: le contenu du journal est vide" +msgstr "passer le déploiement des journaux de compilation complets : le contenu du journal est vide" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" From 7c849a27017ae5746539cf22d731edc0e8ff033c Mon Sep 17 00:00:00 2001 From: Liu Wenyuan <15816141883@163.com> Date: Mon, 6 Sep 2021 15:35:36 +0200 Subject: [PATCH 0554/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Liu Wenyuan <15816141883@163.com> Currently translated at 44.6% (257 of 576 strings) Co-authored-by: Liu Wenyuan <15816141883@163.com> Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 62 ++++++++++++---------- 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 5ade9351..851cbfa2 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -11,20 +11,21 @@ # 世界 , 2021. # ZZY2357 , 2021. # yahoo~~ , 2021. +# Liu Wenyuan <15816141883@163.com>, 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-07-05 17:03+0000\n" -"Last-Translator: yahoo~~ \n" +"PO-Revision-Date: 2021-09-06 13:35+0000\n" +"Last-Translator: Liu Wenyuan <15816141883@163.com>\n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 4.8.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -590,12 +591,12 @@ msgstr "从存储库中删除没有元数据的 APK 和 OBB" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "" +msgstr "存储库过大,将删除存档(大小 {size},限制 {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "" +msgstr "存储库过大,将删除镜像历史(大小 {size},限制 {limit})" #: ../fdroidserver/update.py #, python-brace-format @@ -605,25 +606,26 @@ msgstr "删除未知文件: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" -msgstr "" +msgstr "简介“%s”与应用的概括文字相同" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" -msgstr "" +msgstr "简介有重复行" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" +msgstr "简介中带有列表(%s),但它既不是子弹(*)形列表也不是编号(#)型列表" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" -msgstr "" +msgstr "简介长度 {length} 超过 {limit} 字限制" #: ../fdroidserver/import.py +#, fuzzy msgid "Do not add 'disable:' to the generated build entries" -msgstr "" +msgstr "不要给生成的构建项添加 'disable:'" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" @@ -677,14 +679,14 @@ msgid "Downloading {url} failed. {error}" msgstr "下载 {url} 失败。{error}" #: ../fdroidserver/metadata.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" -msgstr "" +msgstr "在 {linedesc} 中找到了重复的为 versionCode {versionCode} 使用的构建配方" #: ../fdroidserver/lint.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Duplicate link in '{field}': {url}" -msgstr "" +msgstr "“{field}”中有重复的链接:{url}" #: ../fdroid msgid "Dynamically scan APKs post build" @@ -699,20 +701,22 @@ msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" +"错误:请不要使用此命令镜像 f-droid.org!\n" +"对 f-droid.org 进行完整镜像需要超过 200GB 的储存空间。" #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" -msgstr "" +msgstr "错误:不支持此类 CI,如果有能力请帮我们添加支持!" #: ../fdroidserver/metadata.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Empty build flag at {linedesc}" -msgstr "" +msgstr "{linedesc} 中构建标志为空" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "" +msgstr "编码被设置为“{enc}”,可能会导致 fdroid 出现编码问题。为了最佳效果,请将其更改为“UTF-8”。" #: ../fdroidserver/init.py #, python-format @@ -720,54 +724,56 @@ msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" +"请在此处输入 Android SDK(%s)的路径:\n" +"> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "没有设置 {configname} 中的环境变量 {var}!" #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format msgid "Error while attempting to publish log: %s" -msgstr "" +msgstr "尝试发布日志时出错:%s" #: ../fdroidserver/import.py ../fdroidserver/common.py msgid "Error while getting repo address" -msgstr "" +msgstr "获取存储库地址时出错" #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" -msgstr "" +msgstr "从 APK 中提取签名" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" -msgstr "" +msgstr "复制 {path} 失败:{error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" -msgstr "" +msgstr "获取“{apkfilename}”的签名时出错:{error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" -msgstr "" +msgstr "读取 {path} 失败:{error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" -msgstr "" +msgstr "缩放 {path} 失败:{error}" #: ../fdroidserver/publish.py msgid "Failed to align application" msgstr "未能匹配应用程序" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Failed to create S3 bucket: {url}" -msgstr "" +msgstr "创建 S3 桶失败:{url}" #: ../fdroidserver/update.py #, python-brace-format From 157468570f133e2080323f611ad1704faa55789d Mon Sep 17 00:00:00 2001 From: Licaon Kter Date: Wed, 22 Sep 2021 07:06:57 +0000 Subject: [PATCH 0555/2116] Translated using Weblate: Romanian (ro) by Licaon Kter Currently translated at 100.0% (576 of 576 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ro/ --- locale/ro/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index d2a8016e..a8c7c005 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -3,20 +3,21 @@ # Daniel Șerbănescu , 2021. # Christian Eichert , 2021. # Simona Iacob , 2021. +# Licaon Kter , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-08-05 15:35+0000\n" -"Last-Translator: Simona Iacob \n" +"PO-Revision-Date: 2021-09-23 07:37+0000\n" +"Last-Translator: Licaon Kter \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 4.9-dev\n" #: ../fdroidserver/common.py msgid "" @@ -381,7 +382,7 @@ msgstr "Construire generată de `fdroid import` - eliminați linia de dezactivar #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" -msgstr "Build metadata git repo are modificări necomandate!" +msgstr "Depozitul git al metadatelor de construire are modificări necomandate!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" From 52bb905ff50bb64815c2a410186741c4cce13a9d Mon Sep 17 00:00:00 2001 From: Eric Date: Sat, 25 Sep 2021 01:24:01 +0000 Subject: [PATCH 0556/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Eric Currently translated at 45.4% (262 of 576 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 851cbfa2..cc3d156f 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -17,15 +17,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-09-06 13:35+0000\n" -"Last-Translator: Liu Wenyuan <15816141883@163.com>\n" +"PO-Revision-Date: 2021-09-26 01:35+0000\n" +"Last-Translator: Eric \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.8.1-dev\n" +"X-Generator: Weblate 4.9-dev\n" #: ../fdroidserver/common.py msgid "" @@ -623,7 +623,6 @@ msgid "Description of length {length} is over the {limit} char limit" msgstr "简介长度 {length} 超过 {limit} 字限制" #: ../fdroidserver/import.py -#, fuzzy msgid "Do not add 'disable:' to the generated build entries" msgstr "不要给生成的构建项添加 'disable:'" @@ -679,12 +678,12 @@ msgid "Downloading {url} failed. {error}" msgstr "下载 {url} 失败。{error}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" -msgstr "在 {linedesc} 中找到了重复的为 versionCode {versionCode} 使用的构建配方" +msgstr "在 {linedesc} 中找到了 versionCode {versionCode} 的重复构建配方" #: ../fdroidserver/lint.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Duplicate link in '{field}': {url}" msgstr "“{field}”中有重复的链接:{url}" @@ -709,9 +708,9 @@ msgid "ERROR: unsupported CI type, patches welcome!" msgstr "错误:不支持此类 CI,如果有能力请帮我们添加支持!" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Empty build flag at {linedesc}" -msgstr "{linedesc} 中构建标志为空" +msgstr "位于 {linedesc} 的空构建标志" #: ../fdroidserver/__main__.py #, python-brace-format @@ -771,9 +770,9 @@ msgid "Failed to align application" msgstr "未能匹配应用程序" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Failed to create S3 bucket: {url}" -msgstr "创建 S3 桶失败:{url}" +msgstr "创建亚马逊简易储存服务失败:{url}" #: ../fdroidserver/update.py #, python-brace-format From 3cf9d3103f74ed904caa8999489ece4b067fa726 Mon Sep 17 00:00:00 2001 From: Agnieszka C Date: Fri, 1 Oct 2021 09:19:31 +0000 Subject: [PATCH 0557/2116] Translated using Weblate: Polish (pl) by Agnieszka C Currently translated at 100.0% (576 of 576 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ --- locale/pl/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 816cf243..cb4468fb 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-07-17 22:14+0000\n" +"PO-Revision-Date: 2021-10-01 13:11+0000\n" "Last-Translator: Agnieszka C \n" "Language-Team: Polish \n" "Language: pl\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.7.2-dev\n" +"X-Generator: Weblate 4.9-dev\n" #: ../fdroidserver/common.py msgid "" @@ -1454,12 +1454,12 @@ msgstr "Przepchnij dziennik do tego zdalnego repozytorium git" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Pushing binary transparency log to {url}" -msgstr "Przesyłanie dziennika zmian binarnych do {url}" +msgstr "Przesyłanie dziennika przejrzystości plików binarnych do {url}" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Pushing to {url}" -msgstr "Naciśnij na {url}" +msgstr "Wyślij do {url}" #: ../fdroid ../fdroidserver/__main__.py msgid "Quickly start a new repository" @@ -1906,7 +1906,7 @@ msgstr "Zaktualizuj informacje o repozytorium dla nowych pakietów" #: ../fdroid ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" -msgstr "Zaktualizuj dziennik przezroczystości binarnej dla adresu URL" +msgstr "Zaktualizuj dziennik przejrzystości plików binarnych dla adresu URL" #: ../fdroid ../fdroidserver/__main__.py msgid "Update the stats of the repo" From b4105b037a9aa66a79f5e9921392136ae8325206 Mon Sep 17 00:00:00 2001 From: Agnieszka C Date: Tue, 5 Oct 2021 12:23:11 +0000 Subject: [PATCH 0558/2116] Translated using Weblate: Polish (pl) by Agnieszka C Currently translated at 100.0% (576 of 576 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ --- locale/pl/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index cb4468fb..b8212c15 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-10-01 13:11+0000\n" +"PO-Revision-Date: 2021-10-05 14:45+0000\n" "Last-Translator: Agnieszka C \n" "Language-Team: Polish \n" "Language: pl\n" @@ -529,7 +529,7 @@ msgstr "Nie można znaleźć identyfikatora pakietu" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" -msgstr "Cowardily odmawia zastąpienia istniejącej konfiguracji klucza podpisującego!" +msgstr "Tchórzliwa odmowa nadpisania istniejącej konfiguracji klucza podpisu!" #: ../fdroidserver/update.py msgid "Create a repo signing key in a keystore" From c71a56b03ade6f004500eb26e3d0424044a1911d Mon Sep 17 00:00:00 2001 From: Agnieszka C Date: Mon, 11 Oct 2021 18:57:23 +0000 Subject: [PATCH 0559/2116] Translated using Weblate: Polish (pl) by Agnieszka C Currently translated at 100.0% (576 of 576 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ --- locale/pl/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index b8212c15..5d3c13d9 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-10-05 14:45+0000\n" +"PO-Revision-Date: 2021-10-12 17:21+0000\n" "Last-Translator: Agnieszka C \n" "Language-Team: Polish \n" "Language: pl\n" @@ -825,7 +825,7 @@ msgstr "Skończone" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID flag" -msgstr "Metody flattr donation należą do flagi FlattrID" +msgstr "Metody darowizn Flattr należą do flagi FlattrID" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" From 96b233b58b73b2ab7203d425fa21a091550ff9da Mon Sep 17 00:00:00 2001 From: JY3 Date: Sat, 16 Oct 2021 07:39:07 +0000 Subject: [PATCH 0560/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by JY3 Currently translated at 45.4% (262 of 576 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index cc3d156f..f166c0a8 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -12,13 +12,14 @@ # ZZY2357 , 2021. # yahoo~~ , 2021. # Liu Wenyuan <15816141883@163.com>, 2021. +# JY3 , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-09-26 01:35+0000\n" -"Last-Translator: Eric \n" +"PO-Revision-Date: 2021-10-16 13:25+0000\n" +"Last-Translator: JY3 \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" @@ -377,7 +378,7 @@ msgstr "从源代码构建安装包" #: ../fdroidserver/build.py msgid "Build all applications available" -msgstr "编译全部可用应用程序" +msgstr "编译全部可用应用" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" @@ -415,7 +416,7 @@ msgstr "无法读取“{path}”!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Cannot resolve application ID {appid}" -msgstr "无法解析应用程序 ID {appid}" +msgstr "无法解析应用 ID {appid}" #: ../fdroidserver/rewritemeta.py #, python-brace-format @@ -511,7 +512,7 @@ msgstr "无法解析大小 \"{size}\", 错误类型 \"{type}\"" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/import.py msgid "Couldn't find Application ID" -msgstr "找不到应用程序ID" +msgstr "找不到应用ID" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py @@ -767,7 +768,7 @@ msgstr "缩放 {path} 失败:{error}" #: ../fdroidserver/publish.py msgid "Failed to align application" -msgstr "未能匹配应用程序" +msgstr "未能匹配应用" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -799,7 +800,7 @@ msgstr "" #: ../fdroidserver/common.py msgid "Failed to zipalign application" -msgstr "未能归档对齐(zipalign)应用程序" +msgstr "未能归档对齐(zipalign)应用" #: ../fdroidserver/build.py #, python-brace-format @@ -1739,7 +1740,7 @@ msgstr "" #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "这是一个与F-Droid一起使用的应用程序的存储库。这个存储库中的应用程序要么是原应用程序开发者构建的官方二进制文件,要么是 f-droid.org 的管理员使用 https://gitlab.com/fdroid 上的工具从源代码构建而来的二进制文件。" +msgstr "这是一个与F-Droid一起使用的应用的存储库。这个存储库中的应用要么是原应用开发者构建的官方二进制文件,要么是 f-droid.org 的管理员使用 https://gitlab.com/fdroid 上的工具从源代码构建而来的二进制文件。" #: ../fdroidserver/import.py #, python-format @@ -2088,13 +2089,13 @@ msgstr "" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py #: ../fdroidserver/checkupdates.py msgid "application ID of file to operate on" -msgstr "要操作的文件的应用程序ID" +msgstr "要操作的文件的应用ID" #: ../fdroidserver/verify.py ../fdroidserver/publish.py #: ../fdroidserver/build.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" -msgstr "带APPID[:VERCODE]格式可选的versionCode的应用程序 ID" +msgstr "带APPID[:VERCODE]格式可选的versionCode的应用 ID" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py msgid "applicationId in the form APPID" From b4692d261809026cc13304d791cf737ed4c4eb94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristoffer=20Grundstr=C3=B6m?= Date: Sat, 16 Oct 2021 03:43:40 +0000 Subject: [PATCH 0561/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Swedi?= =?UTF-8?q?sh=20(sv)=20by=20Kristoffer=20Grundstr=C3=B6m=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 11.8% (68 of 576 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sv/ --- locale/sv/LC_MESSAGES/fdroidserver.po | 43 ++++++++++++++------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index 727e7c47..6aeabb77 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -3,20 +3,21 @@ # Hans-Christoph Steiner , 2020. # Elias Mårtenson , 2021. # Joel A , 2021. +# Kristoffer Grundström , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-08-03 09:50+0000\n" -"Last-Translator: Joel A \n" +"PO-Revision-Date: 2021-10-16 13:25+0000\n" +"Last-Translator: Kristoffer Grundström \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 4.9-dev\n" #: ../fdroidserver/common.py msgid "" @@ -50,46 +51,46 @@ msgstr "" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" -msgstr "" +msgstr "\"%s/\" har ingen matchande meta-datafil!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" #: ../fdroidserver/install.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "'{apkfilename}' är redan installerad på {dev}." +msgstr "'{apkfilename}' är redan installerad i {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" +msgstr "\"{path}\" innehåller utdaterat {name} ({version})" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" -msgstr "" +msgstr "\"{path}\" innehåller senaste {name} ({version})" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" -msgstr "" +msgstr "\"{path}\" existerar, men s3cmd är inte installerat!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "" +msgstr "\"{path}\" är inte ett filformat som stöds (använd: metadata/*.yml)" #: ../fdroidserver/metadata.py #, python-brace-format msgid "\"{path}\" is not an accepted format, convert to: {formats}" -msgstr "" +msgstr "\"{path}\" är inte ett accepterat format, konvertera till: {formats}" #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" -msgstr "" +msgstr "\"{url}\" är inte en giltig URL!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -1596,7 +1597,7 @@ msgstr "Signera och placera paket i förrådet" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" -msgstr "" +msgstr "Signera index som har skapats med att använda update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" @@ -1886,7 +1887,7 @@ msgstr "Uppdatera förrådinformation för nya paket" #: ../fdroid ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" -msgstr "" +msgstr "Uppdatera binärens genomskinliga logg för en URL" #: ../fdroid ../fdroidserver/__main__.py msgid "Update the stats of the repo" @@ -2398,13 +2399,13 @@ msgstr "alternativet -%s kräver argument" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s must not have an argument" -msgstr "" +msgstr "alternativet --%s måste inte ha ett argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s not a unique prefix" -msgstr "" +msgstr "alternativet --%s inte ett unikt prefix" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2416,7 +2417,7 @@ msgstr "alternativet --%s kändes inte igen" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s requires argument" -msgstr "" +msgstr "alternativet --%s kräver argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2431,7 +2432,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "positional arguments" -msgstr "" +msgstr "positionella argument" #: ../fdroidserver/common.py #, python-brace-format @@ -2522,7 +2523,7 @@ msgstr "följande argument krävs: %s" #: /usr/lib/python3.7/argparse.py #, python-format msgid "unexpected option string: %s" -msgstr "" +msgstr "oväntad alternativ-sträng: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2534,12 +2535,12 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "unrecognized arguments: %s" -msgstr "" +msgstr "argumenten känns inte igen: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" -msgstr "" +msgstr "o-säkra behörigheter på '{config_file}' (borde vara 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py From 53f43fe2326c3ea30a9b5bb5b232ce51574385a9 Mon Sep 17 00:00:00 2001 From: Agnieszka C Date: Sat, 16 Oct 2021 08:05:46 +0000 Subject: [PATCH 0562/2116] Translated using Weblate: Polish (pl) by Agnieszka C Currently translated at 100.0% (576 of 576 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ --- locale/pl/LC_MESSAGES/fdroidserver.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 5d3c13d9..8806566b 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-10-12 17:21+0000\n" +"PO-Revision-Date: 2021-10-16 13:25+0000\n" "Last-Translator: Agnieszka C \n" "Language-Team: Polish \n" "Language: pl\n" @@ -383,7 +383,7 @@ msgstr "Kompilacja generowana przez `fdroid import` - usuń wyłączenie linii p #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" -msgstr "Zbuduj metadane repozytorium git z niezmienionymi zmianami!" +msgstr "Repozytorium git metadanych kompilacji zawiera niescommitowane zmiany!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" @@ -469,7 +469,7 @@ msgstr "Polecenie '%s' nie rozpoznane.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" -msgstr "Zatwierdź zmiany" +msgstr "Scommituj zmiany" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." @@ -1152,7 +1152,7 @@ msgstr "Magazyn kluczy do podpisywania klucza:\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "Ostatnio używane zatwierdzenie '{commit}' wygląda jak tag, ale UpdateCheckMode to '{ucm}'" +msgstr "Ostatnio używany commit '{commit}' wygląda jak tag, ale UpdateCheckMode to '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" @@ -1214,7 +1214,7 @@ msgstr "Nie znaleziono podłączonych urządzeń" #: ../fdroidserver/metadata.py #, python-brace-format msgid "No commit specified for {versionName} in {linedesc}" -msgstr "Nie określono zatwierdzenia dla {versionName} w {linedesc}" +msgstr "Nie określono commita dla {versionName} w {linedesc}" #: ../fdroidserver/common.py msgid "No config.yml found, using defaults." @@ -1544,7 +1544,7 @@ msgstr "Przepisywanie '{appid}' do '{path}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" -msgstr "Uruchom ponownie repozytorium git z niezatwierdzonymi zmianami" +msgstr "Uruchom ponownie repozytorium git z niescommitowanymi zmianami" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" From 1dc82f56afec356af6a6c0dfdc1344ce259bb1a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Thu, 4 Nov 2021 02:32:55 +0000 Subject: [PATCH 0563/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Norwe?= =?UTF-8?q?gian=20Bokm=C3=A5l=20(nb=5FNO)=20by=20Allan=20Nordh=C3=B8y=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 59.2% (341 of 576 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/nb_NO/ --- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index 824a16dd..e880a6d8 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-09-01 21:33+0000\n" +"PO-Revision-Date: 2021-11-04 09:29+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Norwegian Bokmål \n" "Language: nb_NO\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8.1-dev\n" +"X-Generator: Weblate 4.9-dev\n" #: ../fdroidserver/common.py msgid "" @@ -2749,9 +2749,9 @@ msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\" finnes ikke. Rett det i config.yml." #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "{name} «{path}» finnes ikke. Rett det i config.yml." +msgstr "{name} «{section}/icons/{path}» finnes ikke. Rett det i config.yml." #: ../fdroidserver/common.py #, python-brace-format From 3d67e4f07362192efeb0be15905904e65bcaaeb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Nov=C3=A1k?= Date: Tue, 9 Nov 2021 21:40:33 +0000 Subject: [PATCH 0564/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Czech?= =?UTF-8?q?=20(cs)=20by=20Petr=20Nov=C3=A1k=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 8.5% (49 of 576 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ --- locale/cs/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 70c7cee2..967241da 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -1,20 +1,21 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # mondstern , 2021. +# Petr Novák , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2021-01-29 16:12+0100\n" -"PO-Revision-Date: 2021-03-05 16:50+0000\n" -"Last-Translator: mondstern \n" +"PO-Revision-Date: 2021-11-10 21:49+0000\n" +"Last-Translator: Petr Novák \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.5.1-dev\n" +"X-Generator: Weblate 4.9.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -494,9 +495,8 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/import.py -#, fuzzy msgid "Couldn't find Application ID" -msgstr "Nedaří se nalézt identif. balíčku" +msgstr "Nedaří se nalézt ID aplikace" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py From b3e126a3ba1ecd5b94d472fc887f0e6a0b0bccfe Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 15 Feb 2022 20:06:25 +0100 Subject: [PATCH 0565/2116] make -C locale update --- locale/ang/LC_MESSAGES/fdroidserver.po | 178 +++++++++++++- locale/bn/LC_MESSAGES/fdroidserver.po | 178 +++++++++++++- locale/bo/LC_MESSAGES/fdroidserver.po | 185 ++++++++++++++- locale/cs/LC_MESSAGES/fdroidserver.po | 179 +++++++++++++- locale/cy/LC_MESSAGES/fdroidserver.po | 178 +++++++++++++- locale/de/LC_MESSAGES/fdroidserver.po | 187 ++++++++++++++- locale/el/LC_MESSAGES/fdroidserver.po | 178 +++++++++++++- locale/enm/LC_MESSAGES/fdroidserver.po | 178 +++++++++++++- locale/es/LC_MESSAGES/fdroidserver.po | 187 ++++++++++++++- locale/es_AR/LC_MESSAGES/fdroidserver.po | 181 +++++++++++++- locale/es_MX/LC_MESSAGES/fdroidserver.po | 191 +++++++++++++-- locale/eu/LC_MESSAGES/fdroidserver.po | 178 +++++++++++++- locale/fa/LC_MESSAGES/fdroidserver.po | 178 +++++++++++++- locale/fdroidserver.pot | 180 +++++++++++++- locale/fi/LC_MESSAGES/fdroidserver.po | 178 +++++++++++++- locale/fr/LC_MESSAGES/fdroidserver.po | 245 ++++++++++++++----- locale/fy/LC_MESSAGES/fdroidserver.po | 178 +++++++++++++- locale/hi/LC_MESSAGES/fdroidserver.po | 178 +++++++++++++- locale/hu/LC_MESSAGES/fdroidserver.po | 186 ++++++++++++++- locale/id/LC_MESSAGES/fdroidserver.po | 178 +++++++++++++- locale/it/LC_MESSAGES/fdroidserver.po | 220 ++++++++++++++--- locale/ja/LC_MESSAGES/fdroidserver.po | 178 +++++++++++++- locale/kab/LC_MESSAGES/fdroidserver.po | 183 ++++++++++++++- locale/ko/LC_MESSAGES/fdroidserver.po | 192 +++++++++++++-- locale/ml/LC_MESSAGES/fdroidserver.po | 178 +++++++++++++- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 230 ++++++++++++++---- locale/nl/LC_MESSAGES/fdroidserver.po | 178 +++++++++++++- locale/pl/LC_MESSAGES/fdroidserver.po | 226 ++++++++++++++---- locale/pt/LC_MESSAGES/fdroidserver.po | 223 +++++++++++++++--- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 254 ++++++++++++++------ locale/pt_PT/LC_MESSAGES/fdroidserver.po | 223 +++++++++++++++--- locale/ro/LC_MESSAGES/fdroidserver.po | 187 ++++++++++++++- locale/ru/LC_MESSAGES/fdroidserver.po | 223 +++++++++++++++--- locale/sk/LC_MESSAGES/fdroidserver.po | 178 +++++++++++++- locale/sq/LC_MESSAGES/fdroidserver.po | 223 +++++++++++++++--- locale/sv/LC_MESSAGES/fdroidserver.po | 178 +++++++++++++- locale/tr/LC_MESSAGES/fdroidserver.po | 257 ++++++++++++++------ locale/tzm/LC_MESSAGES/fdroidserver.po | 178 +++++++++++++- locale/ug/LC_MESSAGES/fdroidserver.po | 179 +++++++++++++- locale/uk/LC_MESSAGES/fdroidserver.po | 259 +++++++++++++++------ locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 241 ++++++++++++++----- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 256 ++++++++++++++------ 42 files changed, 7556 insertions(+), 767 deletions(-) diff --git a/locale/ang/LC_MESSAGES/fdroidserver.po b/locale/ang/LC_MESSAGES/fdroidserver.po index 25406480..db299322 100644 --- a/locale/ang/LC_MESSAGES/fdroidserver.po +++ b/locale/ang/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -49,6 +49,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -83,6 +88,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -305,6 +315,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -381,6 +396,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -494,6 +513,10 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -504,7 +527,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -649,6 +672,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -765,6 +793,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -895,6 +927,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -969,6 +1005,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1009,6 +1055,16 @@ msgstr "" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1061,6 +1117,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1122,6 +1183,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1143,6 +1209,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1176,6 +1246,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1213,6 +1288,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1254,6 +1338,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1476,10 +1564,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1560,6 +1657,15 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1603,6 +1709,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1668,6 +1779,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1724,6 +1843,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1753,6 +1884,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1876,6 +2012,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -2059,6 +2200,10 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2182,6 +2327,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2303,6 +2453,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2345,6 +2500,10 @@ msgstr "" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2463,6 +2622,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2606,6 +2770,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2687,6 +2856,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index c6007bb9..7e1c376f 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-02-12 09:48+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali \n" @@ -50,6 +50,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -84,6 +89,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -306,6 +316,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -382,6 +397,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -495,6 +514,10 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -505,7 +528,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -650,6 +673,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -766,6 +794,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -896,6 +928,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -970,6 +1006,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "উপমডিউল শুরু করা হচ্ছে" @@ -1010,6 +1056,16 @@ msgstr "" msgid "Invalid APK" msgstr "অবৈধ এপিকে" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1062,6 +1118,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1123,6 +1184,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, fuzzy, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "{apkfilename} প্রক্রিয়ারত" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1144,6 +1210,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1177,6 +1247,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1214,6 +1289,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1255,6 +1339,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1477,10 +1565,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1561,6 +1658,15 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1604,6 +1710,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1669,6 +1780,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1725,6 +1844,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1754,6 +1885,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1877,6 +2013,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -2060,6 +2201,10 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2183,6 +2328,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2304,6 +2454,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2346,6 +2501,10 @@ msgstr "" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2464,6 +2623,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2607,6 +2771,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2688,6 +2857,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index 6d167219..b994f072 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-01-14 14:58+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tibetan \n" @@ -57,6 +57,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" འདི་དང་མཐུན་པའི་རྒྱབ་ལྗོངས་ཡིག་ཆ་མིན་འདུག!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "dir གྱི་རྩ་བ་ for local_copy_dir \"{path}\" མིན་འདུག!" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -91,6 +96,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}སྒྲིག་བཀོད་འདི་ངོས་ལེན་བྱེད་ཐུབ་ཀྱི་མིན་འདུག:{formats}" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -315,6 +325,11 @@ msgstr "ཨེན་ཀྲོཌSDKཐབས་ལམ་ '{path}1' ཡིག་ msgid "Android SDK tool {cmd} found!" msgstr "ཨེན་ཀྲོཌ་ SDK རྙེད་སོན་བྱུང་མ་སོང་།!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "ཨེན་ཀྲོཌ་ SDK རྙེད་སོན་བྱུང་མ་སོང་།!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -391,6 +406,10 @@ msgstr "བཟོ་སྐྲུན་ལ་ངེས་པར་དུ་བར msgid "Built repo based in \"%s\" with this config:" msgstr "རེ་པོ་བཟོ་སྐྲུན་གཞི་རྩ་ \"%s\" སྒྲིག་བཀོད་འདི་དང་མཉམ་དུ་ཡོད།:" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -506,6 +525,11 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "ཐུམ་སྒྲིལ་ངོས་འཛིན་རྙེད་སོན་བྱུང་མ་སོང་།" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "ཐོན་རིམ་གསར་ཤོས་འདིའི་མིང་རྙེད་མ་སོང་།" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -516,7 +540,7 @@ msgstr "ཐོན་རིམ་གསར་གསར་ཤོས་ཀྱི་ msgid "Couldn't find latest version name" msgstr "ཐོན་རིམ་གསར་ཤོས་འདིའི་མིང་རྙེད་མ་སོང་།" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "ཐུམ་སྒྲིལ་ངོས་འཛིན་རྙེད་སོན་བྱུང་མ་སོང་།" @@ -661,6 +685,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "ཐོ་གཞུང་ཕབ་ལེན་ང་ཚོར་མེད།" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "མཛོད་ཁང་ཕབ་ལེན་ཐེངས་གཅིག་བྱས་པ་འདི་ཐུབ་མ་སོང་། ཡང་སྐྱར་ཐབས་ཤེས་བྱེད་ཀྱི་མིན་།." @@ -779,6 +808,11 @@ msgstr "APK གནས་ཚུལ་རག་གི་མིན་འདུག { msgid "Failed to get APK manifest information" msgstr "APKནང་གསལ་བའི་གནས་ཚུལ་རྣམས་ལེན་ཐུབ་མ་སོང་།" +#: ../fdroidserver/update.py +#, fuzzy +msgid "Failed to get APK signing key fingerprint" +msgstr "APKནང་གསལ་བའི་གནས་ཚུལ་རྣམས་ལེན་ཐུབ་མ་སོང་།" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -911,6 +945,11 @@ msgstr "གིཊ་གཙང་བཟོ་ཐུབ་མ་སོང་།" msgid "Git fetch failed" msgstr "གིཊ་འཚོལ་ཐུབ་མ་སོང་།" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git prune failed" +msgstr "གིཊ་སྐྱར་སྒྲིག་ཐུབ་མ་སོང་།" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "གིཊ་རྒྱང་ཐག་སྒྲིག་འགོ་ཐུབ་མ་སོང་།" @@ -985,6 +1024,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, fuzzy, python-format +msgid "Including metadata from %s@%s" +msgstr "ཁུངས་ལྡན་མིན་པའི་རྒྱབ་ལྗོངས་ཡིག་ཆའི་ནང་།%s 1:%d 2" + +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "Including metadata from {path}" +msgstr "ངོས་འཛིན་མི་ཐུབ་པའི་རྒྱབ་ལྗོངས་ཡིག་ཆའི་སྒྲིག་བཀོད། : {path}" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "ཐོག་མིའི་ཡན་ལག་རྒྱ་ཁྱོན།" @@ -1025,6 +1074,16 @@ msgstr "རེ་པོ་HTTP ཞབས་ཞུ་འཕྲུལ་ཆས་ msgid "Invalid APK" msgstr "ཁུངས་ལྡན་མིན་པའི་APK" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, fuzzy, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "ཁུངས་ལྡན་མིན་པའི་ཐུམ་སྒྲིལ་གྱི་མིང་།{0}" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1077,6 +1136,11 @@ msgstr "ཁུངས་ལྡན་མིན་པའི་རྒྱབ་ལྗ msgid "Invalid name for published file: %s" msgstr "པར་སྐྲུན་ཡིག་ཆའི་ཆེད་དུ་ཁུངས་ལྡན་མིན་པའིན་མིང་།: %s 1" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1138,6 +1202,11 @@ msgstr "Java jarsigner རྙེད་མ་སོང་། !ཚད་ལྡན msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, fuzzy, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "ཐུམ་སྒྲིལ་གྱི་མིང་ཀློག་བཞིནཔ།/ཐོན་རིམ་ཨང་རྟགས་/ཐོན་རིམ་གྱི་མིང་བདེ་སྤྱོད་མེད། APK ཁུངས་ལྡན་མིན།: '{apkfilename}'" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "མིང་རྟགས་བཀོད་པའི་ལྡེ་མིག་ཆེད་དུ་སྟོན་པའི་ལྡེ་མིག་གསོག་ཉར་ཁང་གི་ལམ།\t" @@ -1161,6 +1230,11 @@ msgstr "Flattr ཞལ་འདེབས་ཐབས་ལམ་འདི་བ msgid "List files that would be reformatted" msgstr "སྐྱར་དུ་བཀོད་སྒྲིག་བྱེད་དགོས་པའི་ཡག་ཆ་རྣམས་ཀྱི་ཐོ་གཞུང་།" +#: ../fdroidserver/rewritemeta.py +#, fuzzy +msgid "List files that would be reformatted (dry run)" +msgstr "སྐྱར་དུ་བཀོད་སྒྲིག་བྱེད་དགོས་པའི་ཡག་ཆ་རྣམས་ཀྱི་ཐོ་གཞུང་།" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1194,6 +1268,11 @@ msgstr "མིང་། '%s 1' ནི་རང་མིང་ཁོ་ན་ར msgid "No 'config.yml' found, using defaults." msgstr "'config.yml' རྙེད་མ་སོང་།, སོར་བཞག་བེད་སྤྱོད་བྱེད་བཞིན་པ།." +#: ../fdroidserver/verify.py +#, fuzzy, python-format +msgid "No APK for package: %s" +msgstr "ཐུམ་སྒྲིལ་དེ་འདྲ་མིན་འདུག: %s 1" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "ཨེན་ཀྲོཌ་ SDK རྙེད་མ་སོང་།!" @@ -1233,6 +1312,16 @@ msgstr "ཨེན་ཀྲོཌ་དང་ཡང་ན་ཀི་བི་ལ msgid "No information found." msgstr "གནས་ཚུལ་རྙེད་མ་སོང་།." +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No matching tags found" +msgstr "གནས་ཚུལ་རྙེད་མ་སོང་།." + +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "'config.yml' རྙེད་མ་སོང་།, སོར་བཞག་བེད་སྤྱོད་བྱེད་བཞིན་པ།." + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "མཉེས་ཆས་འདི་རིན་མེད་མཉེན་ཆས་ཡིན་པ་དམིགས་སྟོན་བྱེད་དགོས་དོན་མེད་།" @@ -1274,6 +1363,11 @@ msgstr "ཐུམ་སྒྲིལ་དེ་འདྲ་མིན་འདུ msgid "No such versionCode {versionCode} for app {appid}" msgstr "ཐོན་རིམ་ཨང་རྟགས་དེ་འདྲ་མིན་འདུག {versionCode} མཉེན་ཆས་ཆེད་དུ།{appid}" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No tags found" +msgstr "ཟུར་སྣོན་ཡོ་བྱད་རྙེད་མ་སོང་།" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "མིང་རྟགས་མ་བཀོད་པའི་ཕྱོགས་དེབ་མིན་འདུག-བྱ་རྒྱུ་གང་ཡང་མེད།" @@ -1497,10 +1591,19 @@ msgstr "ཕྱོགས་བསྡོམས་བྱས་པའི་གྲང msgid "Removing specified files" msgstr "དམིགས་སྟོན་བྱས་པའི་ཡིག་ཆ་རྣམས་མེད་པ་བཟོ་བཞིན་པ།" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "package.name_123.apk དང་མི་འདྲ་བའི་APK ཡིག་ཆ་དེ་ཚོར་མིང་སྐྱར་ཏུ་བཏགས།" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "ཐོན་སྐྱེད་ཡིག་ཚགས་གནས་བབས་སྒང་གི་སྙན་ཐོ།" @@ -1580,6 +1683,15 @@ msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "འཚག་རྒྱབ་ལ་སྐྱོན་རྙེད་པ།" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1623,6 +1735,11 @@ msgstr "འབྱུང་ཁུངས་ཨ་རྟགས་དང་དཀའ msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "'{apkfilename}'མཆོང་ནས་ཁུངས་ལྡན་མ་ཡིན་པའི་མིང་རྟགས་དང་མཉམ་དུ།!" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1688,6 +1805,14 @@ msgstr "སྙིང་བསྔུས་ཀྱི་རིང་ཐུང་། msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "ཚོད་ལྟའི་ཚུལ་-གལ་སྲིད་ཡིག་ཚགས་འདི་སྔོན་ཚོད་ནས་ཡོད་ནའང་། ཡིག་ཚགས་འདི་སྐབས་ཕྲལ་གྱི་ཕྱོགས་དེབ་ཁོ་ནའི་ནང་ལ་བླུགས་པ་དང་རྟག་ཏུ་ཐོན་སྐྱེད་བཟོས།." @@ -1744,6 +1869,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "རེ་པོ་འདི་ལ་སྔོན་ཚོད་ནས་ས་གནས་ཀྱི་རྒྱབ་ལྗོངས་ཡིག་ཆ་འདུག: %s 1" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "awsbucket, awssecretkey དང་། awsaccesskeyid བེད་སྤྱོད་བྱེད་པའི་ཆེད་དུ་ config.yml ནང་དུ་ངེས་པར་དུ་སྒྲིག་དགོས།!" @@ -1774,6 +1911,11 @@ msgstr "ཁུངས་ལྡན་མིན་པའི་ཆོག་མཆན msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1897,6 +2039,11 @@ msgstr "%s 1 དེ་ལ་བེད་སྤྱོད་མེད་པའི msgid "Unused scanignore path: %s" msgstr "%s 1 དེ་ལ་བེད་སྤྱོད་མེད་པའི་ཡིག་ཆ།" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "ཐུམ་སྒྲིལ་གསར་པའི་ཆེད་དུ་རེ་པོ་གནས་ཚུལ་གསར་བསྒྱུར་བྱེད།" @@ -2082,6 +2229,10 @@ msgstr "གསལ་ཁ་མེད་པའི་གདམ་ཀ: %(option)s msgid "ambiguous option: %s (%s?)" msgstr "གསལ་ཁ་མེད་པའི་གདམ་ཀ:%s 1 (%s 2?)" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2207,6 +2358,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2330,6 +2486,11 @@ msgstr "ཁུངས་ལྡན་མིན་པའི་རྙོག་ཕྲ msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "ཁུངས་ལྡན་མིན་པའི་ཚིག་སྒྲུབ་གདམ་ཀ། %(option)r: ཁྱད་ཆོས་དང་མཉམ་དུ་འགོ་བཙུགས། %(prefix_chars)r" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2372,6 +2533,11 @@ msgstr "གདམ་ཀ་དེ་འདྲ་མིན་འདུག: %s" msgid "no version info found!" msgstr "ཆ་རྒྱུས་མེད་པའི་དམིགས་བསལ་ཞིག་རྙེད་སོང་།!" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "no version information found" +msgstr "ཆ་རྒྱུས་མེད་པའི་དམིགས་བསལ་ཞིག་རྙེད་སོང་།!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2490,6 +2656,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sync ཕྱོགས་སྟོན།{path}1 དེ་ནས {url} དང་སུབས།" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2632,6 +2803,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2713,6 +2889,11 @@ msgstr "{path} ལ་ཆེ་ཆུང་མེད།!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{path}: {error}" +msgstr "ཀློག་མི་ཐུབ།{path}: {error}" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 967241da..1c346bd8 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-11-10 21:49+0000\n" "Last-Translator: Petr Novák \n" "Language-Team: Czech \n" @@ -51,6 +51,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -85,6 +90,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -308,6 +318,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -384,6 +399,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -498,6 +517,11 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "Nedaří se nalézt ID aplikace" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "Nedaří se nalézt ID aplikace" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -508,7 +532,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Nedaří se nalézt identif. balíčku" @@ -653,6 +677,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -769,6 +798,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -899,6 +932,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -973,6 +1010,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1013,6 +1060,16 @@ msgstr "Interakce se serverem repo HTTP" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1065,6 +1122,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1126,6 +1188,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1147,6 +1214,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1180,6 +1251,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1217,6 +1293,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1258,6 +1343,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1480,10 +1569,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1565,6 +1663,15 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1608,6 +1715,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1673,6 +1785,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1729,6 +1849,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1758,6 +1890,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1881,6 +2018,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Aktualizujte informace o repo pro nové balíčky" @@ -2064,6 +2206,10 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2188,6 +2334,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2310,6 +2461,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2352,6 +2508,10 @@ msgstr "žádná taková volba: %s" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2470,6 +2630,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2614,6 +2779,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2695,6 +2865,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/cy/LC_MESSAGES/fdroidserver.po b/locale/cy/LC_MESSAGES/fdroidserver.po index 821a6bd2..f688e2e4 100644 --- a/locale/cy/LC_MESSAGES/fdroidserver.po +++ b/locale/cy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-01-16 21:23+0000\n" "Last-Translator: Aled Powell \n" "Language-Team: Welsh \n" @@ -56,6 +56,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -90,6 +95,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -316,6 +326,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -392,6 +407,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -509,6 +528,10 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -519,7 +542,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -664,6 +687,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -780,6 +808,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -910,6 +942,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -984,6 +1020,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1024,6 +1070,16 @@ msgstr "Rhyngweithio â gweinydd HTTP yr ystorfa" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1076,6 +1132,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1137,6 +1198,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1158,6 +1224,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1191,6 +1261,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1228,6 +1303,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1269,6 +1353,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1491,10 +1579,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Ailenwi ffeiliau APK na sy'n dilyn y ffurf package.name_123.apk" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1579,6 +1676,15 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1622,6 +1728,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1687,6 +1798,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1750,6 +1869,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1779,6 +1910,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1902,6 +2038,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Diweddaru gwybodaeth ystorfa am becynnau newydd" @@ -2085,6 +2226,10 @@ msgstr "dewis amwys: gall %(option)s gydweddu â %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "dewis amwys: %s (%s?)" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2212,6 +2357,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2337,6 +2487,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2379,6 +2534,10 @@ msgstr "dim dewis o'r fath: %s" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2497,6 +2656,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2644,6 +2808,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2725,6 +2894,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index ab04368d..ac277ada 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -22,7 +22,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-06-21 18:34+0000\n" "Last-Translator: VfBFan \n" "Language-Team: German \n" @@ -80,6 +80,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" besitzt keine zugehörige Metadaten-Datei!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "Das Wurzelverzeichnis für local_copy_dir \"{path}\" existiert nicht!" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "\"repo_pubkey\" muss in config.yml vorhanden sein, wenn --nosign verwendet wird!" @@ -114,6 +119,11 @@ msgstr "\"{path}\" ist ein nicht unterstütztes Dateiformat (Verwendung: metadat msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" ist kein akzeptiertes Format, umwandeln in: {formats}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "„{path}” vorhanden, aber S3cmd ist nicht installiert!" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -336,6 +346,11 @@ msgstr "Android-SDK-Pfad »{path}« ist kein Verzeichnis!" msgid "Android SDK tool {cmd} found!" msgstr "Android-SDK-Tool {cmd} nicht gefunden!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "Android-SDK-Tool {cmd} nicht gefunden!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -412,6 +427,10 @@ msgstr "Build sollte kommagetrennte versionName und versionCode enthalten, nicht msgid "Built repo based in \"%s\" with this config:" msgstr "Built-Repo basiert in „%s” auf der Konfiguration von:" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -525,6 +544,11 @@ msgstr "Konnte Größe \"{size}\" nicht parsen, falscher Typ \"{type}\"" msgid "Couldn't find Application ID" msgstr "Konnte Anwendungs-ID nicht finden" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "Neuester Versionsname konnte nicht gefunden werden" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -535,7 +559,7 @@ msgstr "Neuester Versionscode konnte nicht gefunden werden" msgid "Couldn't find latest version name" msgstr "Neuester Versionsname konnte nicht gefunden werden" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Konnte Paket-ID nicht finden" @@ -680,6 +704,11 @@ msgstr "Komplette Spiegel von kleinen Paketquellen herunterladen" msgid "Download logs we don't have" msgstr "Herunterladung von Logs welche wir nicht haben" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Herunterladen des Repositorys bereits einmal fehlgeschlagen, versuche es nicht nochmal." @@ -800,6 +829,11 @@ msgstr "Abrufen der APK-Informationen fehlgeschlagen, {path} wird übersprungen" msgid "Failed to get APK manifest information" msgstr "Abrufen der APK-Manifest-Informationen fehlgeschlagen" +#: ../fdroidserver/update.py +#, fuzzy +msgid "Failed to get APK signing key fingerprint" +msgstr "Abrufen der APK-Manifest-Informationen fehlgeschlagen" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -930,6 +964,11 @@ msgstr "Git clean fehlgeschlagen" msgid "Git fetch failed" msgstr "Git fetch fehlgeschlagen" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git prune failed" +msgstr "Git reset fehlgeschlagen" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "Git remote set-head fehlgeschlagen" @@ -1004,6 +1043,16 @@ msgstr "Einbinden der Build-Protokolle in den Spiegelserver" msgid "Include the source tarballs in the mirror" msgstr "Einbinden der Quellen-Tarballs in den Spiegelserver" +#: ../fdroidserver/metadata.py +#, fuzzy, python-format +msgid "Including metadata from %s@%s" +msgstr "Ungültige Metadaten in %s:%d" + +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "Including metadata from {path}" +msgstr "Unbekanntes Metadaten-Format: {path}" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Initialisiere Submodule" @@ -1044,6 +1093,16 @@ msgstr "Mit dem HTTP-Server des Repository kommunizieren" msgid "Invalid APK" msgstr "Ungültige APK" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, fuzzy, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "Ungültiger Paketname {0}" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1096,6 +1155,11 @@ msgstr "Ungültige Metadaten in: " msgid "Invalid name for published file: %s" msgstr "Ungültiger Name für die veröffentlichte Datei: %s" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1157,6 +1221,11 @@ msgstr "Java jarsigner nicht gefunden! Installieren Sie es in einem Standardordn msgid "Javascript in HTML src attributes" msgstr "Javascript in HTML src-Attributen" +#: ../fdroidserver/build.py +#, fuzzy, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "Lesen von minSdkVersion fehlgeschlagen: \"{apkfilename}\"" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Schlüsselspeicher für den Signierschlüssel:\t" @@ -1178,6 +1247,11 @@ msgstr "Liberapay-Spendenmethoden gehören in das LiberapayID-Flag" msgid "List files that would be reformatted" msgstr "Dateien listen, die reformatiert würden" +#: ../fdroidserver/rewritemeta.py +#, fuzzy +msgid "List files that would be reformatted (dry run)" +msgstr "Dateien listen, die reformatiert würden" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Gebietsschema in der f-droid.org URL enthalten" @@ -1211,6 +1285,11 @@ msgstr "Name '%s' ist nur der automatische Name - entfernen Sie ihn" msgid "No 'config.yml' found, using defaults." msgstr "Keine 'config.yml' gefunden, nutze Standardeinstellungen." +#: ../fdroidserver/verify.py +#, fuzzy, python-format +msgid "No APK for package: %s" +msgstr "Kein solches Paket: %s" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Keine Android SDK gefunden!" @@ -1248,6 +1327,16 @@ msgstr "Es konnte kein Gradle-Projekt gefunden werden. \"--subdir\" angeben?" msgid "No information found." msgstr "Keine Informationen gefunden." +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No matching tags found" +msgstr "Keine Informationen gefunden." + +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "Keine config.yml gefunden, nutze Standardeinstellungen." + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Sie müssen nicht angeben, dass die App freie Software ist" @@ -1289,6 +1378,11 @@ msgstr "Kein solches Paket: %s" msgid "No such versionCode {versionCode} for app {appid}" msgstr "Kein Versionscode {versionCode} für App {appid}" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No tags found" +msgstr "Keine angeschlossenen Geräte gefunden" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "Kein unsigniertes Verzeichnis - nichts zu tun" @@ -1511,10 +1605,19 @@ msgstr "Sammelstatistik neu berechnen - nach Änderungen anwenden, die alte zwis msgid "Removing specified files" msgstr "Entferne angegebene Dateien" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "APK-Dateien umbenennen, die nicht dem Muster „package.name_123.apk“ entsprechen" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "Bericht zum Build-Datenstatus" @@ -1595,6 +1698,16 @@ msgid_plural "Scanner found {} problems" msgstr[0] "Scanner fand {count} Problem" msgstr[1] "Scanner fand {count} Probleme" +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "Scannen Sie die entstandene(n) APK(s) nach bekannten non-free-Klassen." + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Einstellen der Uhr auf diese Zeit mit:" @@ -1638,6 +1751,11 @@ msgstr "Durchsuchen des Quellcodes nach Binärdateien und anderen Problemen übe msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Überspringen von '{apkfilename}' mit ungültiger Signatur!" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1703,6 +1821,14 @@ msgstr "Zusammenfassung mit der Länge {length} liegt über der {limit} Zeicheng msgid "System clock is older than date in {path}!" msgstr "Die System-Uhr ist älter als das Datum in {path}!" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Testmodus - Ausgabe nur ins tmp-Verzeichnis einfügen, immer erstellen, selbst wenn die Ausgabe bereits vorhanden ist." @@ -1759,6 +1885,18 @@ msgstr "Dies ist eine Paketquelle für Anwendungen, die für die Benutzung zusam msgid "This repo already has local metadata: %s" msgstr "Dieses Repo hat bereits lokale Metadaten: %s" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Um awsbucket zu benutzen, müssen awssecretkey und awsaccesskeyid auch in der config.yml gesetzt sein!" @@ -1788,6 +1926,11 @@ msgstr "Ungültiges Lizenz-Tag \"{}\"! Verwenden Sie nur Kennzeichen von https:/ msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Unerwartetes Lizenz-Tag \"{}\"! Nur Lizenz-Tags verwenden, die in deiner config-Datei eingerichtet sind" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1911,6 +2054,11 @@ msgstr "Nicht verwendeter „scandelete“ Pfad: %s" msgid "Unused scanignore path: %s" msgstr "Nicht verwendeter „scanignore“ Pfad: %s" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Paketquelleninformationen zu neuen Programmpaketen aktualisieren" @@ -2094,6 +2242,11 @@ msgstr "Mehrdeutige Option: %(option)s könnte übereinstimmen mit %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "Mehrdeutige Option: %s (%s?)" +#: ../fdroidserver/common.py +#, fuzzy +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "apksigner nicht gefunden, er wird zum Signieren benötigt!" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "apksigner nicht gefunden, er wird zum Signieren benötigt!" @@ -2217,6 +2370,11 @@ msgstr "konnte srclib-Spezifikation nicht parsen (zu viele '@'-Zeichen): '{}'" msgid "created {path}" msgstr "{path} erzeugt" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2338,6 +2496,11 @@ msgstr "Ungültiger conflict_resolution-Wert: %r" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "Ungültige Optionszeichenfolge %(option)r: muss mit einem Zeichen %(prefix_chars)r beginnen" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2380,6 +2543,11 @@ msgstr "keine solche Option: %s" msgid "no version info found!" msgstr "Keine Versionsinformationen gefunden!" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "no version information found" +msgstr "Keine Versionsinformationen gefunden!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2498,6 +2666,11 @@ msgstr "ruamel.yaml ist nicht installiert, kann Metadaten nicht schreiben." msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd-Sync {path} indizieren auf {url} und dann löschen" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "dynamische Bibliothek" @@ -2641,6 +2814,11 @@ msgstr "{appid} von {path} ist keine gültige Android-Anwendungs-ID!" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} von {path} ist kein gültiger Java-Paketname!" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2722,6 +2900,11 @@ msgstr "{path} hat Dateigröße Null!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} ist größer als 200MB und muss manuell auf {url} hochgeladen werden" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{path}: {error}" +msgstr "Kopieren von {path} fehlgeschlagen: {error}" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index f4e52dfb..3d25a1fe 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-02-18 17:50+0000\n" "Last-Translator: Michalis \n" "Language-Team: Greek \n" @@ -64,6 +64,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" δεν έχει αρχείο μετα-δεδομένων που να ταιριάζει!" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "Το \"repo_pubkey\" πρέπει να υπάρχει στο config.yml όταν χρησιμοποιείτε το --nosign!" @@ -98,6 +103,11 @@ msgstr "Το \"{path}\" δεν είναι υποστηριζόμενη μορφ msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "Το \"{path}\" δεν είναι αποδεκτή μορφή, μετατροπή σε: {formats}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "Το \"{path}\" υπάρχει, αλλά το s3cmd δεν έχει εγκατασταθεί!" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -320,6 +330,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -396,6 +411,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -509,6 +528,10 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -519,7 +542,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -664,6 +687,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -780,6 +808,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -910,6 +942,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -984,6 +1020,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1024,6 +1070,16 @@ msgstr "Αλληλεπίδραση με το διακομιστή HTTP του α msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1076,6 +1132,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1137,6 +1198,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1158,6 +1224,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1191,6 +1261,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1228,6 +1303,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1269,6 +1353,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1491,10 +1579,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Μετονομασία αρχείων APK που δεν αντιστοιχούν με «όνομα.πακέτου_123.apk»" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1575,6 +1672,15 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1618,6 +1724,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1683,6 +1794,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1739,6 +1858,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1768,6 +1899,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1891,6 +2027,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Ενημέρωση πληροφοριών αποθετηρίου για νέα πακέτα" @@ -2074,6 +2215,10 @@ msgstr "Ασαφής επιλογή: %(option)s θα μπορούσε να τα msgid "ambiguous option: %s (%s?)" msgstr "ασαφής επιλογή: %s (%s;)" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2197,6 +2342,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2318,6 +2468,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2360,6 +2515,10 @@ msgstr "δεν υπάρχει τέτοια επιλογή: %s" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2478,6 +2637,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2621,6 +2785,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2702,6 +2871,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/enm/LC_MESSAGES/fdroidserver.po b/locale/enm/LC_MESSAGES/fdroidserver.po index 1bf4e711..cf0b6542 100644 --- a/locale/enm/LC_MESSAGES/fdroidserver.po +++ b/locale/enm/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -49,6 +49,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -83,6 +88,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -305,6 +315,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -381,6 +396,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -494,6 +513,10 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -504,7 +527,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -649,6 +672,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -765,6 +793,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -895,6 +927,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -969,6 +1005,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1009,6 +1055,16 @@ msgstr "" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1061,6 +1117,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1122,6 +1183,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1143,6 +1209,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1176,6 +1246,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1213,6 +1288,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1254,6 +1338,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1476,10 +1564,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1560,6 +1657,15 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1603,6 +1709,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1668,6 +1779,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1724,6 +1843,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1753,6 +1884,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1876,6 +2012,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -2059,6 +2200,10 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2182,6 +2327,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2303,6 +2453,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2345,6 +2500,10 @@ msgstr "" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2463,6 +2622,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2606,6 +2770,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2687,6 +2856,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index b7ae55e5..3b46c730 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-04-03 20:26+0000\n" "Last-Translator: Germe the fur star \n" "Language-Team: Spanish \n" @@ -70,6 +70,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "¡\"%s/\" no tiene su correspondiente fichero de metadatos!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "¡El directorio raíz para local_copy_dir \"{path}\" no existe!" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "\"repo_pubkey\" debe estar presente en la configuración.yml al usar --nosign!" @@ -104,6 +109,11 @@ msgstr "\"{path}\" no es un formato reconocido, convertir a metadata/*.yml" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" no es un formato reconocido, convertir a: {formats}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "\"{path}\" existe pero ¡s3cmd no está instalado!" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -326,6 +336,11 @@ msgstr "¡La ruta al SDK de Android '{path}' no es un directorio!" msgid "Android SDK tool {cmd} found!" msgstr "¡Se encontró la herramienta de desarrollo (SDK) {cmd}!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "¡Se encontró la herramienta de desarrollo (SDK) {cmd}!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -402,6 +417,10 @@ msgstr "La compilación debe tener versionName y versionCode separados por comas msgid "Built repo based in \"%s\" with this config:" msgstr "Repositorio creado en \"%s\" con esta configuración:" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -515,6 +534,11 @@ msgstr "No se puede procesar el tamaño \"{size}\", tipo erróneo \"{type}\"" msgid "Couldn't find Application ID" msgstr "No se pudo encontrar el identificador de aplicación" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "No se ha podido encontrar el último nombre de versión" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -525,7 +549,7 @@ msgstr "No se ha podido encontrar el último código de versión" msgid "Couldn't find latest version name" msgstr "No se ha podido encontrar el último nombre de versión" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "No se ha podido encontrar el identificador de paquete" @@ -670,6 +694,11 @@ msgstr "Descargar réplicas completas de repositorios pequeños" msgid "Download logs we don't have" msgstr "Descargar registros que no tenemos" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "La descarga del repositorio ya falló una vez, no se intentará de nuevo." @@ -790,6 +819,11 @@ msgstr "Fallo al obtener la información de APK, omitiendo {path}" msgid "Failed to get APK manifest information" msgstr "Fallo al obtener la información de manifiesto APK" +#: ../fdroidserver/update.py +#, fuzzy +msgid "Failed to get APK signing key fingerprint" +msgstr "Fallo al obtener la información de manifiesto APK" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -920,6 +954,11 @@ msgstr "Git clean falló" msgid "Git fetch failed" msgstr "Git fetch falló" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git prune failed" +msgstr "Git reset falló" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "Falló el remote set-head de Git" @@ -994,6 +1033,16 @@ msgstr "Incluir las bitácoras de compilación en el repositorio espejo" msgid "Include the source tarballs in the mirror" msgstr "Incluir en el espejo los archivos tarball de código fuente" +#: ../fdroidserver/metadata.py +#, fuzzy, python-format +msgid "Including metadata from %s@%s" +msgstr "Metadatos no válidos en %s:%d" + +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "Including metadata from {path}" +msgstr "Formato de metadatos desconocido: {path}" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Inicializando submodules" @@ -1034,6 +1083,16 @@ msgstr "Interactuar con el servidor HTTP del repositorio" msgid "Invalid APK" msgstr "APK no válido" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, fuzzy, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "Nombre de paquete no válido {0}" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1086,6 +1145,11 @@ msgstr "Metadatos no válidos en: " msgid "Invalid name for published file: %s" msgstr "Nombre no válido para archivo publicado: %s" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1147,6 +1211,11 @@ msgstr "Java jarsigner no encontrado! Instalar en una ubicación estándar o est msgid "Javascript in HTML src attributes" msgstr "Javascript en atributos src de HTML src" +#: ../fdroidserver/build.py +#, fuzzy, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "Falló lectura de minSdkVersion: \"{apkfilename}\"" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Depósito de claves para la clave de firma de repositorio:\t" @@ -1168,6 +1237,11 @@ msgstr "Los métodos de donación de Liberapay pertenecen a la bandera de Libera msgid "List files that would be reformatted" msgstr "Lista de archivos que se reformatearán" +#: ../fdroidserver/rewritemeta.py +#, fuzzy +msgid "List files that would be reformatted (dry run)" +msgstr "Lista de archivos que se reformatearán" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Locale incluída en la URL de f-droid.org" @@ -1201,6 +1275,11 @@ msgstr "El nombre '%s' es simplemente el nombre automático - elimínelo" msgid "No 'config.yml' found, using defaults." msgstr "No se encontró 'config.yml', se usarán los valores predeterminados." +#: ../fdroidserver/verify.py +#, fuzzy, python-format +msgid "No APK for package: %s" +msgstr "No existe tal paquete: %s" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "¡No se encontró Android SDK!" @@ -1238,6 +1317,16 @@ msgstr "No se encontró ningún proyecto gradle. ¿Quizá quiera especificar --s msgid "No information found." msgstr "No se encontró información." +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No matching tags found" +msgstr "No se encontró información." + +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "No se encontró 'config.yml'. Se usarán los valores predeterminados." + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "No hay necesidad de especificar que la aplicación es software libre" @@ -1279,6 +1368,11 @@ msgstr "No existe tal paquete: %s" msgid "No such versionCode {versionCode} for app {appid}" msgstr "No existe tal versiónCode {versionCode} para app {appid}" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No tags found" +msgstr "No se han encontrado dispositivos asociados" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "No hay directorio sin firma - nada que hacer" @@ -1501,10 +1595,19 @@ msgstr "Recalcular agregación de estados - usar cuando se hacen cambios que inv msgid "Removing specified files" msgstr "Removiendo archivos especificados" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Cambiar el nombre de archivos APK que no coinciden con el formato package.name_123.apk" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "Informe sobre el estado de los datos de compilación" @@ -1585,6 +1688,16 @@ msgid_plural "Scanner found {} problems" msgstr[0] "El escáner encontró {} problema" msgstr[1] "El escáner encontró {} problemas" +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "Escaneando los APK(s) resultantes en busca de clases no libres conocidas." + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Ajustar el reloj a esa hora usando:" @@ -1628,6 +1741,11 @@ msgstr "Omitir el escaneo del código fuente por problemas binarios u otros prob msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "¡Ignorando '{apkfilename}' por firma no válida!" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1693,6 +1811,14 @@ msgstr "El resumen de longitud {length} supera el límite de {limit} caracteres" msgid "System clock is older than date in {path}!" msgstr "¡El fecha del sistema es anterior a la de {path}!" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Modo de prueba: ponga la salida solo en el directorio tmp y siga desarrollando, incluso si la salida ya existe." @@ -1749,6 +1875,18 @@ msgstr "Este es un repositorio de aplicaciones para usar con F-Droid. Las aplica msgid "This repo already has local metadata: %s" msgstr "Este repo ya tiene metadatos locales: %s" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "¡Para usar awsbucket hay que configurar también awssecretkey y awsaccesskeyid en config.yml!" @@ -1778,6 +1916,11 @@ msgstr "¡Etiqueta de licencia inesperada \"{}\"! Use solo etiquetas aprobadas p msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "¡Etiqueta de licencia inesperada \"{}\"! Use solo etiquetas de licencia configuradas en su archivo de configuración" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1901,6 +2044,11 @@ msgstr "Ruta scandelete sin uso: %s" msgid "Unused scanignore path: %s" msgstr "Ruta scanignore sin uso: %s" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Actualizar la información del repositorio para nuevos paquetes" @@ -2084,6 +2232,11 @@ msgstr "opción ambigua: %(option)s podría corresponderse con %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "opción ambigua: %s (%s?)" +#: ../fdroidserver/common.py +#, fuzzy +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "¡Se requiere apksigner para firmar pero no se encontró!" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "¡Se requiere apksigner para firmar pero no se encontró!" @@ -2207,6 +2360,11 @@ msgstr "no se pudo procesar especificación srclib (demasiadas arrobas '@'): '{} msgid "created {path}" msgstr "{path} creado" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2328,6 +2486,11 @@ msgstr "valor para conflict_resolution no válido: %r" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "cadena de opciones %(option)r no válida: tiene que comenzar por un carácter %(prefix_chars)r" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2370,6 +2533,11 @@ msgstr "no hay tal opción: %s" msgid "no version info found!" msgstr "¡no se encontró información de la versión!" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "no version information found" +msgstr "¡no se encontró información de la versión!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2488,6 +2656,11 @@ msgstr "ruamel.yaml no instalado. No se pueden escribir metadatos." msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sync indexa {path} a {url} y elimina" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "biblioteca compartida" @@ -2631,6 +2804,11 @@ msgstr "¡{appid} de {path} no es un identificador (ID) de aplicación Android v msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "¡{appid} de {path} no es un nombre de paquete Java válido!" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2712,6 +2890,11 @@ msgstr "¡{path} está vacío!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} mayor de 200MB, subir manualmente: {url}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{path}: {error}" +msgstr "Fallo copiando {path}: {error}" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index f8ea65b6..d5bbe28c 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-04-10 21:26+0000\n" "Last-Translator: Germe the fur star \n" "Language-Team: Spanish (Argentina) \n" @@ -61,6 +61,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "directorio_copia_local ¡tiene que ser una ruta absoluta!" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -95,6 +100,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -320,6 +330,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "No se encontró Android SDK!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -396,6 +411,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "Empaquetar repositorio basado en %s con esta configuración:" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -512,6 +531,11 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "Construir todas las aplicaciones disponibles" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "Empaquetado con la ultima versión de cada paquete" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -522,7 +546,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -668,6 +692,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "Descargar los registros que no faltan" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -785,6 +814,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -916,6 +949,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -990,6 +1027,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1030,6 +1077,16 @@ msgstr "Interactuar con el servidor HTTP del repositorio" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1082,6 +1139,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1143,6 +1205,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py #, fuzzy msgid "Keystore for signing key:\t" @@ -1165,6 +1232,11 @@ msgstr "" msgid "List files that would be reformatted" msgstr "Listar archivos que serán reformateados" +#: ../fdroidserver/rewritemeta.py +#, fuzzy +msgid "List files that would be reformatted (dry run)" +msgstr "Listar archivos que serán reformateados" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1198,6 +1270,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1235,6 +1312,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1276,6 +1362,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1500,10 +1590,19 @@ msgstr "Recalcular agregación de estados - usar cuando se hacen cambios que inv msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Renombrar archivos APK que no corresponden a package.name_123.apk" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "Reportar el estado de la construcción" @@ -1584,6 +1683,15 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1627,6 +1735,11 @@ msgstr "Saltear el escaneo de binarios y otros problemas en el código fuente" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1692,6 +1805,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Modo prueba - pone la salida solo en el directorio temporal, y siempre construye, incluso cuando la salida ya exista." @@ -1749,6 +1870,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1778,6 +1911,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1901,6 +2039,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Actualizar información del repositorio para paquetes nuevos" @@ -2085,6 +2228,10 @@ msgstr "opción ambigua: %(option)s podría corresponderse con %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "opción ambigua: %s (%s?)" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2213,6 +2360,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2336,6 +2488,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2380,6 +2537,11 @@ msgstr "no hay tal opción: %s" msgid "no version info found!" msgstr "¡Se encontró una excepción desconocida!" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "no version information found" +msgstr "¡Se encontró una excepción desconocida!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2498,6 +2660,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "librería compartida" @@ -2641,6 +2808,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2722,6 +2894,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/es_MX/LC_MESSAGES/fdroidserver.po b/locale/es_MX/LC_MESSAGES/fdroidserver.po index a27141bd..31c0570a 100644 --- a/locale/es_MX/LC_MESSAGES/fdroidserver.po +++ b/locale/es_MX/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2020-04-29 12:49+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Spanish (Mexico) \n" @@ -51,6 +51,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -85,6 +90,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -307,6 +317,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -383,6 +398,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -499,6 +518,11 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "No se pudo encontrar la ID del paquete" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "No se pudo encontrar el nombre de la última versión" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -509,7 +533,7 @@ msgstr "No se pudo encontrar el código de la última versión" msgid "Couldn't find latest version name" msgstr "No se pudo encontrar el nombre de la última versión" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "No se pudo encontrar la ID del paquete" @@ -654,6 +678,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -770,6 +799,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -900,6 +933,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -974,6 +1011,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1014,6 +1061,16 @@ msgstr "" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1066,6 +1123,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1127,6 +1189,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1148,6 +1215,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1181,6 +1252,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1218,6 +1294,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1259,6 +1344,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1481,10 +1570,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1565,6 +1663,15 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1608,6 +1715,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1673,6 +1785,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1729,6 +1849,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1758,6 +1890,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1881,6 +2018,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -2064,6 +2206,10 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2187,6 +2333,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2308,6 +2459,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2350,6 +2506,10 @@ msgstr "" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2468,6 +2628,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2611,6 +2776,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2692,6 +2862,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" @@ -2713,15 +2888,3 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "" msgstr[1] "" - -#~ msgid "Clean after all scans have finished" -#~ msgstr "Limpiar después de que todos los escaneos hayan terminado" - -#~ msgid "Clean before the scans start and rebuild the container" -#~ msgstr "Limpiar antes de que comiencen los escaneos y reconstruya el contenedor" - -#~ msgid "Clean up all containers and then exit" -#~ msgstr "Limpiar todos los contenedores y luego salir" - -#~ msgid "Could not open APK file for analysis" -#~ msgstr "No se pudo abrir el archivo APK para su análisis" diff --git a/locale/eu/LC_MESSAGES/fdroidserver.po b/locale/eu/LC_MESSAGES/fdroidserver.po index 935fcda9..f6962be1 100644 --- a/locale/eu/LC_MESSAGES/fdroidserver.po +++ b/locale/eu/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -49,6 +49,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -83,6 +88,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -305,6 +315,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -381,6 +396,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -494,6 +513,10 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -504,7 +527,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -649,6 +672,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -765,6 +793,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -895,6 +927,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -969,6 +1005,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1009,6 +1055,16 @@ msgstr "" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1061,6 +1117,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1122,6 +1183,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1143,6 +1209,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1176,6 +1246,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1213,6 +1288,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1254,6 +1338,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1476,10 +1564,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1560,6 +1657,15 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1603,6 +1709,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1668,6 +1779,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1724,6 +1843,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1753,6 +1884,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1876,6 +2012,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -2059,6 +2200,10 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2182,6 +2327,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2303,6 +2453,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2345,6 +2500,10 @@ msgstr "" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2463,6 +2622,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2606,6 +2770,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2687,6 +2856,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index ccb331e5..94df3d99 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-07-27 15:49+0000\n" "Last-Translator: Danial Behzadi \n" "Language-Team: Persian \n" @@ -52,6 +52,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -86,6 +91,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -308,6 +318,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -384,6 +399,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -497,6 +516,10 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -507,7 +530,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -652,6 +675,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -768,6 +796,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -898,6 +930,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -972,6 +1008,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1012,6 +1058,16 @@ msgstr "" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1064,6 +1120,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1125,6 +1186,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1146,6 +1212,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1179,6 +1249,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1216,6 +1291,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1257,6 +1341,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1479,10 +1567,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1563,6 +1660,15 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1606,6 +1712,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1671,6 +1782,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1727,6 +1846,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1756,6 +1887,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1879,6 +2015,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -2062,6 +2203,10 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2185,6 +2330,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2306,6 +2456,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2348,6 +2503,10 @@ msgstr "" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2466,6 +2625,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2609,6 +2773,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2690,6 +2859,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/fdroidserver.pot b/locale/fdroidserver.pot index 6e9d6008..dc716b1a 100644 --- a/locale/fdroidserver.pot +++ b/locale/fdroidserver.pot @@ -5,9 +5,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: fdroidserver 2.0\n" +"Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -51,6 +51,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -85,6 +90,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -307,6 +317,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -383,6 +398,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -496,6 +515,10 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -506,7 +529,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -651,6 +674,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -767,6 +795,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -897,6 +929,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -971,6 +1007,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1011,6 +1057,16 @@ msgstr "" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1063,6 +1119,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1124,6 +1185,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1145,6 +1211,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1178,6 +1248,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1215,6 +1290,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1256,6 +1340,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1478,10 +1566,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1562,6 +1659,15 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1605,6 +1711,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1670,6 +1781,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1726,6 +1845,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1755,6 +1886,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1878,6 +2014,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -2061,6 +2202,10 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2184,6 +2329,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2305,6 +2455,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2347,6 +2502,10 @@ msgstr "" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2465,6 +2624,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2608,6 +2772,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2689,6 +2858,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index c5f27dd0..5d356a14 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-08-23 01:29+0000\n" "Last-Translator: Kaantaja \n" "Language-Team: Finnish \n" @@ -51,6 +51,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -85,6 +90,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -307,6 +317,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -383,6 +398,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -496,6 +515,10 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -506,7 +529,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -651,6 +674,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -767,6 +795,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -897,6 +929,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -971,6 +1007,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1011,6 +1057,16 @@ msgstr "" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1063,6 +1119,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1124,6 +1185,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1145,6 +1211,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1178,6 +1248,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1215,6 +1290,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1256,6 +1340,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1478,10 +1566,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1562,6 +1659,15 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1605,6 +1711,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1670,6 +1781,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1726,6 +1845,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1755,6 +1886,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1878,6 +2014,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -2061,6 +2202,10 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2184,6 +2329,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2305,6 +2455,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2347,6 +2502,10 @@ msgstr "" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2465,6 +2624,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2608,6 +2772,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2689,6 +2858,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 6988f580..c8c49394 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -32,7 +32,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-09-02 20:49+0000\n" "Last-Translator: translator \n" "Language-Team: French \n" @@ -89,6 +89,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" n'a pas de fichier de métadonnées correspondant !" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "Le dossier racine pour local_copy_dir \"{path}\" n'existe pas !" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "\"repo_pubkey\" doit être présent dans config.yml lors de l'utilisation de --nosign!" @@ -123,6 +128,11 @@ msgstr "Le format du ficher \"{path}\" n'est pas supporté (utiliser : metadata msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" n'est pas un format accepté, convertir en : {formats}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "\"{path}\" existe mais s3cmd n'est pas installé !" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -345,6 +355,11 @@ msgstr "Le chemin du SDK Android '{path}' n'est pas un dossier !" msgid "Android SDK tool {cmd} found!" msgstr "Outil SDK Android {cmd} trouvé !" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "Outil SDK Android {cmd} trouvé !" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -421,6 +436,10 @@ msgstr "Le build devrait avoir un versionName et un versionCode séparés par de msgid "Built repo based in \"%s\" with this config:" msgstr "Dépôt du build basé sur \"%s\" avec cette config :" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -534,6 +553,11 @@ msgstr "Impossible de récupérer la taille \"{size}\", mauvais type \"{type}\"" msgid "Couldn't find Application ID" msgstr "Impossible de trouver l'ID de l'application" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "Impossible de trouver le nom de la dernière version" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -544,7 +568,7 @@ msgstr "Impossible de trouver la dernière version du code" msgid "Couldn't find latest version name" msgstr "Impossible de trouver le nom de la dernière version" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Impossible de trouver l'ID du paquet" @@ -689,6 +713,11 @@ msgstr "Télécharger une image complète des petits dépôts" msgid "Download logs we don't have" msgstr "Télécharger les journaux que n'avons pas" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Le téléchargement du référentiel a déjà échoué une fois, ne pas réessayer." @@ -809,6 +838,11 @@ msgstr "Échoument lors de la récupération des informations de l'APK, saut de msgid "Failed to get APK manifest information" msgstr "Échoument lors de la récupération de l'information manifest de l'APK" +#: ../fdroidserver/update.py +#, fuzzy +msgid "Failed to get APK signing key fingerprint" +msgstr "Échoument lors de la récupération de l'information manifest de l'APK" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -939,6 +973,11 @@ msgstr "Nettoyage du Git échoué" msgid "Git fetch failed" msgstr "Recherche du Git échouée" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git prune failed" +msgstr "Reset de Git échouée" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "Set-head distant du Git à échouer" @@ -1013,6 +1052,16 @@ msgstr "Inclure les journaux de construction dans le miroir" msgid "Include the source tarballs in the mirror" msgstr "Inclure au miroir les tarballs de source" +#: ../fdroidserver/metadata.py +#, fuzzy, python-format +msgid "Including metadata from %s@%s" +msgstr "Métadonnées non valides dans %s:%d" + +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "Including metadata from {path}" +msgstr "Format de métadonnée inconnu : {path}" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Initialisation des sous-modules" @@ -1053,6 +1102,16 @@ msgstr "Interagir avec le serveur HTTP du dépôt" msgid "Invalid APK" msgstr "APK invalide" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, fuzzy, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "Nom de package non valide {0}" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1105,6 +1164,11 @@ msgstr "Métadonnées non valides dans : " msgid "Invalid name for published file: %s" msgstr "Nom non valide pour le fichier publié :%s" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1166,6 +1230,11 @@ msgstr "Java jarsigner introuvable ! Installez dans un emplacement standard ou msgid "Javascript in HTML src attributes" msgstr "Attributs Javascript trouvée dans HTML src" +#: ../fdroidserver/build.py +#, fuzzy, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "La lecture de minSdkVersion a échoué : \"{apkfilename}\"" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Stockage des clés signée :\t" @@ -1187,6 +1256,11 @@ msgstr "La méthode de donnation Liberapay appartien dans le flag LiberapayID" msgid "List files that would be reformatted" msgstr "Lister les fichiers qui seront reformater" +#: ../fdroidserver/rewritemeta.py +#, fuzzy +msgid "List files that would be reformatted (dry run)" +msgstr "Lister les fichiers qui seront reformater" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Les paramètres de lieu sont inclus dans f-droid.org URL" @@ -1220,6 +1294,11 @@ msgstr "Le nom '%s' est just un nom générer - retirer le" msgid "No 'config.yml' found, using defaults." msgstr "Aucun 'config.yml' trouvée, utilisation des originales." +#: ../fdroidserver/verify.py +#, fuzzy, python-format +msgid "No APK for package: %s" +msgstr "Aucun packet comme sa : %s" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Aucun SDK Android trouvée !" @@ -1257,6 +1336,16 @@ msgstr "Aucun projet gradle n'a pu être trouvé. Spécifier --subdir ?" msgid "No information found." msgstr "Aucune information trouvée." +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No matching tags found" +msgstr "Aucune information trouvée." + +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "Aucun 'config.yml' trouvée, utilisation des valeurs par défaut." + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Pas besoin de spécifier que l'application est un logiciel libre" @@ -1298,6 +1387,11 @@ msgstr "Aucun packet comme sa : %s" msgid "No such versionCode {versionCode} for app {appid}" msgstr "Aucun code de version {versionCode} pour l'application {appid}" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No tags found" +msgstr "Aucun périphérique connecté trouvé" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "Aucun dossier signée - rien n'est a faire" @@ -1520,10 +1614,19 @@ msgstr "Recalculer les statistiques agrégées - à utiliser quand les modificat msgid "Removing specified files" msgstr "Suppression des fichiers spécifiés" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Renomme les fichiers APK dont le nom ne ressemble pas à nom.paquet_123.apk" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "Rapport sur l'état des données de construction" @@ -1604,6 +1707,16 @@ msgid_plural "Scanner found {} problems" msgstr[0] "Le scanneur a trouvé {} problème" msgstr[1] "Le scanneur a trouvé {} problèmes" +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "Scanne le(s) APK(s) résultants pour des classes non-libres connues." + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Réglez l'horloge à cette heure à l'aide de :" @@ -1647,6 +1760,11 @@ msgstr "Sauter le scan du code source pour des fichiers binaires et d'autres pro msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Omission de '{apkfilename}' qui a une signature non valide !" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1712,6 +1830,14 @@ msgstr "Le résumé de taille {length} est au-dessus de la limite de {limit} car msgid "System clock is older than date in {path}!" msgstr "L'horloge système est plus âgée que la date dans {path} !" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Mode test – mettre la sortie dans le dossier tmp uniquement et toujours compiler, même si la sortie existe déjà." @@ -1768,6 +1894,18 @@ msgstr "Ceci est un dépôt d’applications à utiliser avec FDroid. Les applic msgid "This repo already has local metadata: %s" msgstr "Ce dépôt a déjà des méta-données locales : %s" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Pour utiliser awsbucket, awssecretkey et awsaccesskeyid doivent aussi être configurées dans config.yml !" @@ -1797,6 +1935,11 @@ msgstr "Balise de licence non valide \"{}\" ! Utilisez uniquement des balises msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Balise de licence non valide \"{}\" ! Utilisez uniquement des balises de licence configurées dans votre fichier de configuration" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1920,6 +2063,11 @@ msgstr "Chemin scandelete inutilisé : %s" msgid "Unused scanignore path: %s" msgstr "Chemin scanignore inutilisé : %s" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Mettre à jour les données des dépôts pour les nouveaux paquets" @@ -2103,6 +2251,11 @@ msgstr "option ambiguë : %(option)s peut correspondre à %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "option ambiguë : %s (%s?)" +#: ../fdroidserver/common.py +#, fuzzy +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "apksigner est introuvable, il est requis pour la signature !" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "apksigner est introuvable, il est requis pour la signature !" @@ -2226,6 +2379,11 @@ msgstr "impossible d'analyser la spécification srclib (trop de caractères '@') msgid "created {path}" msgstr "{path} a été créé" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2347,6 +2505,11 @@ msgstr "valeur de conflict_resolution invalide : %r" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "chaîne d’option non valide %(option)r : doit commencer par un caractère %(prefix_chars)r" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2389,6 +2552,11 @@ msgstr "option inexistante : %s" msgid "no version info found!" msgstr "aucun information de version n'a été trouvée !" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "no version information found" +msgstr "aucun information de version n'a été trouvée !" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2507,6 +2675,11 @@ msgstr "ruamel.yaml n’est pas installé, impossible d’écrire les métadonn msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd synchroniser les index de {path} vers {url} et les supprimer" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "bibliothèque partagée" @@ -2650,6 +2823,11 @@ msgstr "{appid} de {path} n’est pas un ID d’application Android valide !" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} de {path} n’est pas un nom de paquet Java valide !" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2731,6 +2909,11 @@ msgstr "{path} a une taille nulle !" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} supérieur à 200MB, envoi manuel : {url}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{path}: {error}" +msgstr "Erreur durant la copie de {path} : {error}" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" @@ -2752,61 +2935,3 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} compilation réussie" msgstr[1] "{} compilations réussies" - -#, fuzzy -#~ msgid "Add PGP signatures for packages in repo using GnuPG" -#~ msgstr "Ajouter des signatures GPG pour les paquets dans le dépôt" - -#~ msgid "Add gpg signatures for packages in repo" -#~ msgstr "Ajouter des signatures GPG pour les paquets dans le dépôt" - -#~ msgid "Android Build Tools path '{path}' does not exist!" -#~ msgstr "Le chemin '{path}' pour Android Build Tools n'existe pas !" - -#~ msgid "Cannot find a packageName for {path}!" -#~ msgstr "Impossible de trouver un packageName pour {path} !" - -#~ msgid "Cannot find an appid for {path}!" -#~ msgstr "Impossible de trouver un appid pour {path} !" - -#~ msgid "Clean after all scans have finished" -#~ msgstr "Nettoyer après la fin de tous les scans" - -#~ msgid "Clean before the scans start and rebuild the container" -#~ msgstr "Nettoyer avant le début des scans et recréer le container" - -#~ msgid "Clean up all containers and then exit" -#~ msgstr "Vider tous les conteneurs puis sortir" - -#~ msgid "Could not open APK file for analysis" -#~ msgstr "Impossible d'ouvrir le fichier APK pour analyse" - -#~ msgid "Interactively ask about things that need updating." -#~ msgstr "Demander de manière interactive les choses nécessitant une mise à jour." - -#~ msgid "Override path for repo APKs (default: ./repo)" -#~ msgstr "Remplacer le chemin pour les fichiers APK de dépôt (par défaut : ./repo)" - -#~ msgid "Prepare Drozer to run a scan" -#~ msgstr "Préparer Drozer pour lancer une analyse" - -#~ msgid "Prepare drozer to run a scan" -#~ msgstr "Préparer Drozer pour lancer un scanne" - -#~ msgid "Scan only the latest version of each package" -#~ msgstr "Analyser seulement la dernière version de chaque paquet" - -#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -#~ msgstr "Installez un émulateur, installez l'APK dessus et effectuez un scan Drozer" - -#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" -#~ msgstr "Met en place un émulateur, y installe l’APK et réalise un scan drozer" - -#~ msgid "Specify editor to use in interactive mode. Default " -#~ msgstr "Définir l'éditeur à utiliser en mode interactif. Par défaut " - -#~ msgid "Specify editor to use in interactive mode. Default %s" -#~ msgstr "Définir l'éditeur à utiliser en mode interactif. Par défaut %s" - -#~ msgid "Specify editor to use in interactive mode. Default is {path}" -#~ msgstr "Définir l'éditeur à utiliser en mode interactif. {path} est utilisé par défaut" diff --git a/locale/fy/LC_MESSAGES/fdroidserver.po b/locale/fy/LC_MESSAGES/fdroidserver.po index 65805aca..ca30e75f 100644 --- a/locale/fy/LC_MESSAGES/fdroidserver.po +++ b/locale/fy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-07-01 15:29+0000\n" "Last-Translator: Vancha March \n" "Language-Team: Frisian \n" @@ -50,6 +50,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -84,6 +89,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -306,6 +316,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -382,6 +397,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -495,6 +514,10 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -505,7 +528,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -650,6 +673,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -766,6 +794,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -896,6 +928,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -970,6 +1006,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1010,6 +1056,16 @@ msgstr "" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1062,6 +1118,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1123,6 +1184,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1144,6 +1210,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1177,6 +1247,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1214,6 +1289,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1255,6 +1339,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1477,10 +1565,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1561,6 +1658,15 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1604,6 +1710,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1669,6 +1780,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1725,6 +1844,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1754,6 +1885,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1877,6 +2013,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -2060,6 +2201,10 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2183,6 +2328,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2304,6 +2454,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2346,6 +2501,10 @@ msgstr "" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2464,6 +2623,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2607,6 +2771,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2688,6 +2857,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/hi/LC_MESSAGES/fdroidserver.po b/locale/hi/LC_MESSAGES/fdroidserver.po index b8d9ab6e..759d5327 100644 --- a/locale/hi/LC_MESSAGES/fdroidserver.po +++ b/locale/hi/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-01-24 08:48+0000\n" "Last-Translator: Isrg Rajan \n" "Language-Team: Hindi \n" @@ -50,6 +50,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -84,6 +89,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -306,6 +316,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -382,6 +397,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -495,6 +514,10 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -505,7 +528,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -650,6 +673,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -766,6 +794,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -896,6 +928,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -970,6 +1006,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1010,6 +1056,16 @@ msgstr "" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1062,6 +1118,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1123,6 +1184,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1144,6 +1210,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1177,6 +1247,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1214,6 +1289,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1255,6 +1339,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1477,10 +1565,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1561,6 +1658,15 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1604,6 +1710,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1669,6 +1780,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1725,6 +1844,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1754,6 +1885,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1877,6 +2013,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -2060,6 +2201,10 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2183,6 +2328,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2304,6 +2454,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2346,6 +2501,10 @@ msgstr "" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2464,6 +2623,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2607,6 +2771,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2688,6 +2857,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index 8ed1f401..3eb151c7 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-07-05 17:03+0000\n" "Last-Translator: Balázs Meskó \n" "Language-Team: Hungarian \n" @@ -63,6 +63,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "A(z) „%s/” nem rendelkezik megfelelő metaadatfájllal." +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "A(z) „{path}” Android SDK elérési út nem található." + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "A „repo_pubkey” megadása kötelező a config.yml-ben, ha a --nosign kapcsolót használja!" @@ -97,6 +102,11 @@ msgstr "A(z) „{path}” nem egy elfogadott formátum, alakítsa át erre: meta msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "A(z) „{path}” nem egy elfogadott formátum, alakítsa át erre: {formats}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "A(z) „{path}” létezik, de az s3cmd nincs telepítve." + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -319,6 +329,11 @@ msgstr "A(z) „{path}” Android SDK elérési út nem könyvtár." msgid "Android SDK tool {cmd} found!" msgstr "A(z) „{cmd}” Android SDK eszköz megtalálva." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "A(z) „{cmd}” Android SDK eszköz megtalálva." + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -395,6 +410,10 @@ msgstr "Az összeállításnál vesszővel elválasztva kell megadni a versionNa msgid "Built repo based in \"%s\" with this config:" msgstr "A tároló összeállítva itt: „%s”, ezzel a konfigurációval:" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -508,6 +527,11 @@ msgstr "A(z) „{size}” méret nem dolgozható fel, hibás „{type}” típus msgid "Couldn't find Application ID" msgstr "Az alkalmazásazonosító nem található" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "A legfrissebb verzió neve nem található" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -518,7 +542,7 @@ msgstr "A legfrissebb verzió kódja nem található" msgid "Couldn't find latest version name" msgstr "A legfrissebb verzió neve nem található" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "A csomagazonosító nem található" @@ -663,6 +687,11 @@ msgstr "Kis tárolók teljes tükrének letöltése" msgid "Download logs we don't have" msgstr "Helyben nem meglévő naplók letöltése" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "A tároló letöltése már egyszer sikertelen volt, nem próbálja meg újra." @@ -783,6 +812,11 @@ msgstr "Az APK információk lekérése sikertelen, a(z) {path} kihagyása" msgid "Failed to get APK manifest information" msgstr "Az APK leíró információk lekérése sikertelen" +#: ../fdroidserver/update.py +#, fuzzy +msgid "Failed to get APK signing key fingerprint" +msgstr "Az APK leíró információk lekérése sikertelen" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -913,6 +947,11 @@ msgstr "A git tisztítás sikertelen" msgid "Git fetch failed" msgstr "A git lekérés sikertelen" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git prune failed" +msgstr "A git helyreállítás sikertelen" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "A git távoli fej beállítás sikertelen" @@ -987,6 +1026,16 @@ msgstr "Az összeállítási napló belevétele a tükörbe" msgid "Include the source tarballs in the mirror" msgstr "A forráscsomagok belevétele a tükörbe" +#: ../fdroidserver/metadata.py +#, fuzzy, python-format +msgid "Including metadata from %s@%s" +msgstr "Érvénytelen metaadatok itt: %s:%d" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Almodulok előkészítése" @@ -1027,6 +1076,16 @@ msgstr "Interakció a tároló HTTP kiszolgálójával" msgid "Invalid APK" msgstr "Érvénytelen APK" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, fuzzy, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "Érvénytelen csomagnév: {0}" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1079,6 +1138,11 @@ msgstr "Érvénytelen metaadatok itt: " msgid "Invalid name for published file: %s" msgstr "Érvénytelen név a közzétett fájlnak: %s" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1140,6 +1204,11 @@ msgstr "A Java „jarsigner” nem található. Telepítse szabványos helyre, v msgid "Javascript in HTML src attributes" msgstr "JavaScript a HTML src attribútumokban" +#: ../fdroidserver/build.py +#, fuzzy, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "A minSdkVersion olvasása sikertelen: „{apkfilename}”" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Kulcstároló az aláírókulcshoz:\t" @@ -1161,6 +1230,11 @@ msgstr "A Liberapay adományozási módok a LiberapayID jelzőbe tartoznak" msgid "List files that would be reformatted" msgstr "Az újra formázásra kerülendő fájlok felsorolása" +#: ../fdroidserver/rewritemeta.py +#, fuzzy +msgid "List files that would be reformatted (dry run)" +msgstr "Az újra formázásra kerülendő fájlok felsorolása" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "A területi beállítás szerepel az f-droid.org URL-ben" @@ -1194,6 +1268,11 @@ msgstr "A(z) „%s” név csak az automatikus név – eltávolítás" msgid "No 'config.yml' found, using defaults." msgstr "Nem található „config.yml”, alapértelmezések használata." +#: ../fdroidserver/verify.py +#, fuzzy, python-format +msgid "No APK for package: %s" +msgstr "Nincs ilyen csomag: %s" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Nem található Android SDK." @@ -1231,6 +1310,16 @@ msgstr "Nem található gradle projekt. Megad --subdir argumentumot?" msgid "No information found." msgstr "Nem található információ." +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No matching tags found" +msgstr "Nem található információ." + +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "Nem található config.yml, alapértelmezések használata." + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Nem kell megadnia, hogy az alkalmazás szabad szoftver" @@ -1272,6 +1361,11 @@ msgstr "Nincs ilyen csomag: %s" msgid "No such versionCode {versionCode} for app {appid}" msgstr "Nincs {versionCode} versionCode a(z) {appid} alkalmazáshoz" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No tags found" +msgstr "Nem található csatolt eszköz" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "Nincs aláíratlan könyvtár – nincs teendő" @@ -1494,10 +1588,19 @@ msgstr "Aggregált statisztikák újraszámítása – akkor használja, ha a v msgid "Removing specified files" msgstr "Megadott fájlok eltávolítása" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Azon APK fájlok átnevezése, melyek nem illeszkednek a csomag.név_123.apk mintára" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "Összeállítás adatainak állapotának jelentése" @@ -1578,6 +1681,16 @@ msgid_plural "Scanner found {} problems" msgstr[0] "Az átvizsgáló {count} problémát talált" msgstr[1] "Az átvizsgáló {count} problémát talált" +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "Az elkészült APK-k átvizsgálása ismert nem szabad osztályokat keresve." + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Óra beállítása ara az időre a következővel:" @@ -1621,6 +1734,11 @@ msgstr "A forráskód binárisok és egyéb problémák miatti átvizsgálásán msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Az érvénytelen aláírású „{apkfilename}” kihagyása." +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1686,6 +1804,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1742,6 +1868,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1771,6 +1909,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1894,6 +2037,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Tárolóinformációk frissítése az új csomagoknál" @@ -2077,6 +2225,10 @@ msgstr "nem egyértelmű kapcsoló: %(option)s, ezekre illeszkedhet: %(matches)s msgid "ambiguous option: %s (%s?)" msgstr "nem egyértelmű kapcsoló: %s (%s?)" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2200,6 +2352,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2321,6 +2478,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2363,6 +2525,11 @@ msgstr "nincs ilyen kapcsoló: %s" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "no version information found" +msgstr "Nem található információ." + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2481,6 +2648,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2624,6 +2796,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2705,6 +2882,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{path}: {error}" +msgstr "A(z) {path} másolása sikertelen: {error}" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index d973b6a2..011fc41c 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-06-23 23:32+0000\n" "Last-Translator: whenwesober \n" "Language-Team: Indonesian \n" @@ -56,6 +56,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" tidak ada kesesuaian pada berkas metadata!" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -90,6 +95,11 @@ msgstr "\"{path}\" format berkas tidak didukung (gunakan: metadata/*.yml)" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" bukan format yang diterima, dikonversi ke: {formats}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "\"{path}\" ada tetapi s3cmd tidak terpasang!" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -312,6 +322,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -388,6 +403,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -500,6 +519,10 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -510,7 +533,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -655,6 +678,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -771,6 +799,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -901,6 +933,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -975,6 +1011,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1015,6 +1061,16 @@ msgstr "Interaksi dengan server repo HTTP" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1067,6 +1123,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1128,6 +1189,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1149,6 +1215,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1182,6 +1252,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1219,6 +1294,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1260,6 +1344,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1482,10 +1570,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Ubah nama berkas APK yang tidak sesuai dengan package.nama_123.apk" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1565,6 +1662,15 @@ msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1608,6 +1714,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1673,6 +1784,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1729,6 +1848,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1758,6 +1889,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1881,6 +2017,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Perbarui informasi repo untuk paket yang baru" @@ -2064,6 +2205,10 @@ msgstr "opsi ambigu: %(option)s bisa sesuai dengan %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "opsi ambigu: %s (%s?)" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2186,6 +2331,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2306,6 +2456,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2348,6 +2503,10 @@ msgstr "tidak ada opsi: %s" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2466,6 +2625,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2608,6 +2772,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2689,6 +2858,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index d358865b..75ac7844 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-03-03 06:19+0000\n" "Last-Translator: mondstern \n" "Language-Team: Italian \n" @@ -71,6 +71,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" non ha un file di metadati corrispondente!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "La directory principale per local_copy_dir \"{path}\" non esiste!" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "\"repo_pubkey\" deve essere presente in config.yml quando si utilizza nos nosign!" @@ -105,6 +110,11 @@ msgstr "\"{path}\" non è un formato accettato (usa: metadata/*.yml)" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" non è un formato accettato, convertire a: {formats}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "\"{path}\" esiste ma s3cmd non è installato!" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -327,6 +337,11 @@ msgstr "Il path di Android SDK \"{path}\" non è una directory!" msgid "Android SDK tool {cmd} found!" msgstr "Android SDK tool {cmd} trovato!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "Android SDK tool {cmd} trovato!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -403,6 +418,10 @@ msgstr "La build dovrebbe avere versionName e versionCode separati da una virgol msgid "Built repo based in \"%s\" with this config:" msgstr "Costruito il repository in \"%s\" con questa configurazione:" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -516,6 +535,11 @@ msgstr "Impossibile analizzare la dimensione \"{size}\", tipo sbagliato \"{type} msgid "Couldn't find Application ID" msgstr "Impossibile trovare l'ID dell'applicazione" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "Impossibile trovare il nome dell'ultima versione" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -526,7 +550,7 @@ msgstr "Impossibile trovare il codice dell'ultima versione" msgid "Couldn't find latest version name" msgstr "Impossibile trovare il nome dell'ultima versione" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Impossibile trovare l'ID del pacchetto" @@ -671,6 +695,11 @@ msgstr "Scarica mirror completi di piccoli repository" msgid "Download logs we don't have" msgstr "Scarica registri che non abbiamo" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Lo scaricamento del repository è gia fallito una volta, non verrà riprovato." @@ -791,6 +820,11 @@ msgstr "Impossibile ottenere informazioni dell’APK, saltando {path}" msgid "Failed to get APK manifest information" msgstr "Impossibile ottenere informazioni del manifest dell’APK" +#: ../fdroidserver/update.py +#, fuzzy +msgid "Failed to get APK signing key fingerprint" +msgstr "Impossibile ottenere informazioni del manifest dell’APK" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -921,6 +955,11 @@ msgstr "Git clean non riuscito" msgid "Git fetch failed" msgstr "Recupero Git non riuscito" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git prune failed" +msgstr "Ripristino Git non riuscito" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "Set-head remoto Git non riuscito" @@ -995,6 +1034,16 @@ msgstr "Includere i log di build nel mirror" msgid "Include the source tarballs in the mirror" msgstr "Includere i tarball dei sorgenti nel mirror" +#: ../fdroidserver/metadata.py +#, fuzzy, python-format +msgid "Including metadata from %s@%s" +msgstr "Metadati non validi in %s:%d" + +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "Including metadata from {path}" +msgstr "Formato dei metadati sconosciuto: {path}" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Inizializzazione dei sottomoduli" @@ -1035,6 +1084,16 @@ msgstr "Interagisci col server HTTP del repository" msgid "Invalid APK" msgstr "APK non valido" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, fuzzy, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "Nome del pacchetto non valido {0}" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1087,6 +1146,11 @@ msgstr "Metadati non validi in: " msgid "Invalid name for published file: %s" msgstr "Nome non valido per il file pubblicato: %s" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1148,6 +1212,11 @@ msgstr "Java jarsigner non trovato! Installa nella posizione standard o imposta msgid "Javascript in HTML src attributes" msgstr "Javascript negli attributi HTML src" +#: ../fdroidserver/build.py +#, fuzzy, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "Lettura di minSdkVersion non riuscita: \"{apkfilename}\"" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Keystore per la firma della chiave:\t" @@ -1169,6 +1238,11 @@ msgstr "I metodi di donazione di Liberapay appartengono alla bandiera LiberapayI msgid "List files that would be reformatted" msgstr "Elenca i file che verrebbero riformattati" +#: ../fdroidserver/rewritemeta.py +#, fuzzy +msgid "List files that would be reformatted (dry run)" +msgstr "Elenca i file che verrebbero riformattati" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Locale incluso in f-droid.org URL" @@ -1202,6 +1276,11 @@ msgstr "Il nome '%s' è solo il nome automatico - rimuovilo" msgid "No 'config.yml' found, using defaults." msgstr "Nessun 'config.yml' trovato, utilizzando i valori predefiniti." +#: ../fdroidserver/verify.py +#, fuzzy, python-format +msgid "No APK for package: %s" +msgstr "Nessun pacchetto di questo tipo: %s" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Android SDK non trovato!" @@ -1239,6 +1318,16 @@ msgstr "Nessun progetto gradle è stato trovato. Specificare --subdir?" msgid "No information found." msgstr "Nessun informazione trovata." +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No matching tags found" +msgstr "Nessun informazione trovata." + +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "Nessun config.yml trovato, utilizzando i valori predefiniti." + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Non è necessario specificare che l'app è un Software Libero" @@ -1280,6 +1369,11 @@ msgstr "Nessun pacchetto di questo tipo: %s" msgid "No such versionCode {versionCode} for app {appid}" msgstr "Nessun versionCode di questo tipo {versionCode} per l'app {appid}" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No tags found" +msgstr "Nessun dispositivo collegato trovato" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "Nessuna directory non firmata - niente da fare" @@ -1502,10 +1596,19 @@ msgstr "Ricalcola statistiche aggregate: da utilizzare quando sono state apporta msgid "Removing specified files" msgstr "Rimozione dei file specificati" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Rinomina i file APK che non corrispondono a package.name_123.apk" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "Report sullo stato dei dati di compilazione" @@ -1586,6 +1689,16 @@ msgid_plural "Scanner found {} problems" msgstr[0] "Scanner trovato {} problema" msgstr[1] "Scanner trovato {} problemi" +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "Scansiona gli APK risultanti per le classi non libere note." + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Imposta l'orologio a quell'ora usando:" @@ -1629,6 +1742,11 @@ msgstr "Salta la scansione del codice sorgente per i binari e altri problemi" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Saltare '{apkfilename} con firma non valida!" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1694,6 +1812,14 @@ msgstr "Riepilogo di length {length} supera il limite di caratteri {limit}" msgid "System clock is older than date in {path}!" msgstr "L'orologio di sistema è più vecchio della data in {path}!" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Modalità test - mette l'output solo nella directory tmp, e costruisce sempre, anche se l'output esiste già." @@ -1750,6 +1876,18 @@ msgstr "Questo è un repository di applicazioni da utilizzare con F-Droid. Le ap msgid "This repo already has local metadata: %s" msgstr "Questo repo ha già metadati locali: %s" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Per usare awsbucket, awssecretkey e awsaccesskeyid devono essere impostati anche in config.yml!" @@ -1779,6 +1917,11 @@ msgstr "Tag di licenza inaspettato \"{}\"! Usare solo tag approvati da FSF o OSI msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Tag di licenza inaspettato \"{}\"! Usa solo i tag di licenza configurati nel tuo file di configurazione" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1902,6 +2045,11 @@ msgstr "Percorso scandelete non utilizzato: %s" msgid "Unused scanignore path: %s" msgstr "Percorso scanignore non utilizzato: %s" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Aggiorna le informazioni del repository coi nuovi pacchetti" @@ -2085,6 +2233,11 @@ msgstr "opzione ambigua: %(option)s potrebbe corrispondere a %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "opzione ambigua: %s (%s?)" +#: ../fdroidserver/common.py +#, fuzzy +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "apksigner non trovato, è necessario per la firma!" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "apksigner non trovato, è necessario per la firma!" @@ -2208,6 +2361,11 @@ msgstr "non ha potuto analizzare la specifica srclib (troppi segni '@'): '{}'" msgid "created {path}" msgstr "creato {path}" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2329,6 +2487,11 @@ msgstr "valore di risoluzione dei conflitti non valido: %r" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "stringa di opzioni non valida %(option)r: deve iniziare con un carattere %(prefix_chars)r" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2371,6 +2534,11 @@ msgstr "opzione inesistente: %s" msgid "no version info found!" msgstr "nessuna informazione sulla versione è stata trovata!" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "no version information found" +msgstr "nessuna informazione sulla versione è stata trovata!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2489,6 +2657,11 @@ msgstr "ruamel.yaml non installato, non può scrivere metadati." msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincronizza gli indici {path} con {url} e cancella" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "biblioteca condivisa" @@ -2632,6 +2805,11 @@ msgstr "{appid} da {path} non è un ID di applicazione Android valido!" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} da {path} non è un nome di pacchetto Java valido!" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2713,6 +2891,11 @@ msgstr "{path} è di dimensioni zero!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} più di 200MB, caricare manualmente: {url}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{path}: {error}" +msgstr "Copia non riuscita {path}: {error}" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" @@ -2734,36 +2917,3 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} costruzione riuscita" msgstr[1] "{} costruisce con successo" - -#~ msgid "Cannot find a packageName for {path}!" -#~ msgstr "Impossibile trovare un packageName per {path}!" - -#~ msgid "Cannot find an appid for {path}!" -#~ msgstr "Impossibile trovare un appid per {path}!" - -#~ msgid "Clean after all scans have finished" -#~ msgstr "Pulisci dopo aver terminato le scansioni" - -#~ msgid "Clean before the scans start and rebuild the container" -#~ msgstr "Pulisci prima delle scansioni e ricostruisci il container" - -#~ msgid "Clean up all containers and then exit" -#~ msgstr "Pulisci tutti i container ed esci" - -#~ msgid "Could not open APK file for analysis" -#~ msgstr "Impossibile aprire il file APK per l'analisi" - -#~ msgid "Interactively ask about things that need updating." -#~ msgstr "Chiedi interattivamente riguardo a ciò che deve essere aggiornato." - -#~ msgid "Override path for repo APKs (default: ./repo)" -#~ msgstr "Sostituisci il percorso per gli APK del repository (impostazione predefinita: ./repo)" - -#~ msgid "Prepare Drozer to run a scan" -#~ msgstr "Prepara Drozer per eseguire una scansione" - -#~ msgid "Prepare drozer to run a scan" -#~ msgstr "Preparare drozer per eseguire una scansione" - -#~ msgid "Scan only the latest version of each package" -#~ msgstr "Scansiona solo l'ultima versione di ogni pacchetto" diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 6faa762e..fd0106d2 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2020-09-02 16:10+0000\n" "Last-Translator: Hinaloe \n" "Language-Team: Japanese \n" @@ -50,6 +50,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "local_copy_dir は絶対パスの必要があります!" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -84,6 +89,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -305,6 +315,11 @@ msgstr "Android SDK パス '{path}' はディレクトリではありません msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -381,6 +396,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -493,6 +512,10 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -503,7 +526,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -648,6 +671,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -764,6 +792,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -894,6 +926,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -968,6 +1004,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1008,6 +1054,16 @@ msgstr "" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1060,6 +1116,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1121,6 +1182,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1142,6 +1208,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1175,6 +1245,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1212,6 +1287,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1253,6 +1337,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1475,10 +1563,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1558,6 +1655,15 @@ msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1601,6 +1707,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1666,6 +1777,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1722,6 +1841,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1751,6 +1882,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1874,6 +2010,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -2057,6 +2198,10 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2179,6 +2324,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2299,6 +2449,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2341,6 +2496,10 @@ msgstr "" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2459,6 +2618,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2601,6 +2765,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2682,6 +2851,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index 481c65cf..c150232b 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-01-15 13:25+0000\n" "Last-Translator: R_SACI \n" "Language-Team: Kabyle \n" @@ -52,6 +52,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -86,6 +91,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -308,6 +318,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -384,6 +399,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -497,6 +516,11 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "Ur izmir ara ad d-yaf isem n lqem aneggaru" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -507,7 +531,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -652,6 +676,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -768,6 +797,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -898,6 +931,11 @@ msgstr "Asfaḍ Git yecceḍ" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git prune failed" +msgstr "Asfaḍ Git yecceḍ" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -972,6 +1010,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "Including metadata from {path}" +msgstr "Amasal n yidfersefka d arussim: {path}" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1012,6 +1060,16 @@ msgstr "" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1064,6 +1122,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1125,6 +1188,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1146,6 +1214,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1179,6 +1251,11 @@ msgstr "Isem '%s' d isem awurman kan - kkes-it" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1216,6 +1293,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1257,6 +1343,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1479,10 +1569,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1563,6 +1662,15 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1606,6 +1714,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1671,6 +1784,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1727,6 +1848,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1756,6 +1889,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1879,6 +2017,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -2062,6 +2205,10 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2185,6 +2332,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2306,6 +2458,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2348,6 +2505,10 @@ msgstr "" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2466,6 +2627,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2609,6 +2775,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2690,6 +2861,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" @@ -2711,6 +2887,3 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "" msgstr[1] "" - -#~ msgid "Could not open APK file for analysis" -#~ msgstr "Ur yezmir ara a d-ildi afaylu APK i tesleḍt" diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index f5c9b9b3..44ef8306 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-08-16 19:53+0000\n" "Last-Translator: Myeongjin Lee \n" "Language-Team: Korean \n" @@ -57,6 +57,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\"에 일치하는 메타데이터 파일이 없습니다!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "Android SDK 경로 '{path}'는 존재하지 않습니다!" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -91,6 +96,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "\"{path}\"는 존재하지만 s3cmd는 설치되어 있지 않습니다!" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -312,6 +322,11 @@ msgstr "Android SDK 경로 '{path}'는 디렉터리가 아닙니다!" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "Android SDK를 찾을 수 없습니다!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -388,6 +403,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -500,6 +519,10 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -510,7 +533,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -655,6 +678,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -771,6 +799,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -901,6 +933,11 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git prune failed" +msgstr "git svn 복제에 실패됨" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -975,6 +1012,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, fuzzy, python-format +msgid "Including metadata from %s@%s" +msgstr "%s:%d에서 잘못된 메타데이터" + +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "Including metadata from {path}" +msgstr "알 수 없는 메타데이터 형식: {path}" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "하위 모듈을 초기 설정 중" @@ -1015,6 +1062,16 @@ msgstr "저장소 HTTP 서버와의 상호 작용" msgid "Invalid APK" msgstr "올바르지 않은 APK" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, fuzzy, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "잘못된 패키지 이름 {0}" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1067,6 +1124,11 @@ msgstr "다음 안에서 잘못된 메타데이터: " msgid "Invalid name for published file: %s" msgstr "게시된 파일을 위한 잘못된 이름: %s" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1128,6 +1190,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, fuzzy, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "삭제 중: repo/{apkfilename}" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "서명 키를 위한 키저장소:\t" @@ -1149,6 +1216,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1182,6 +1253,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1219,6 +1295,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1260,6 +1345,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1482,10 +1571,19 @@ msgstr "집계 통계 재계산 - 오래된 캐시된 데이터를 무효로 하 msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "package.name_123.apk와 일치하지 않는 APK 파일의 이름을 바꿉니다" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1565,6 +1663,15 @@ msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1608,6 +1715,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1673,6 +1785,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1729,6 +1849,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1758,6 +1890,11 @@ msgstr "잘못된 라이선스 태그 \"{}\"! https://spdx.org/license-list 에 msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1881,6 +2018,11 @@ msgstr "사용되지 않은 스캔삭제 경로: %s" msgid "Unused scanignore path: %s" msgstr "사용되지 않은 스캔삭제 경로: %s" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "새 패키지를 위한 저장소 정보를 업데이트합니다" @@ -2064,6 +2206,10 @@ msgstr "모호한 옵션: %(option)s은 %(matches)s와 일치했을 수 있습 msgid "ambiguous option: %s (%s?)" msgstr "모호한 옵션: %s (%s?)" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2186,6 +2332,11 @@ msgstr "" msgid "created {path}" msgstr "{path}가 만들어짐" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2306,6 +2457,11 @@ msgstr "올바르지 않은 conflict_resolution 값: %r" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "올바르지 않은 옵션 문자열 %(option)r: 문자 %(prefix_chars)r로 시작해야 합니다" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2348,6 +2504,11 @@ msgstr "이러한 옵션이 없습니다: %s" msgid "no version info found!" msgstr "버전 정보를 찾지 못했습니다!" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "no version information found" +msgstr "버전 정보를 찾지 못했습니다!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2466,6 +2627,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd 동기화는 {url}로 {path}를 색인하고 삭제합나다" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2608,6 +2774,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2689,6 +2860,11 @@ msgstr "{path}는 영 크기입니다!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" @@ -2708,15 +2884,3 @@ msgstr[0] "{} 빌드 실패됨" msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} 빌드 성공됨" - -#~ msgid "Add gpg signatures for packages in repo" -#~ msgstr "저장소에서 패키지에 gpg 서명을 추가합니다" - -#~ msgid "Cannot find a packageName for {path}!" -#~ msgstr "{path}를 위한 packageName을 찾을 수 없습니다!" - -#~ msgid "Cannot find an appid for {path}!" -#~ msgstr "{path}를 위한 appid를 찾을 수 없습니다!" - -#~ msgid "Override path for repo APKs (default: ./repo)" -#~ msgstr "저장소 APK를 위한 경로 재정의 (기본값: ./repo)" diff --git a/locale/ml/LC_MESSAGES/fdroidserver.po b/locale/ml/LC_MESSAGES/fdroidserver.po index 01800730..652b434e 100644 --- a/locale/ml/LC_MESSAGES/fdroidserver.po +++ b/locale/ml/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-01-14 14:58+0000\n" "Last-Translator: Coding Otaku \n" "Language-Team: Malayalam \n" @@ -63,6 +63,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -97,6 +102,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -319,6 +329,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -395,6 +410,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -508,6 +527,10 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -518,7 +541,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -663,6 +686,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -779,6 +807,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -909,6 +941,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -983,6 +1019,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1023,6 +1069,16 @@ msgstr "" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1075,6 +1131,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1136,6 +1197,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1157,6 +1223,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1190,6 +1260,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1227,6 +1302,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1268,6 +1352,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1490,10 +1578,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1574,6 +1671,15 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1617,6 +1723,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1682,6 +1793,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1745,6 +1864,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1774,6 +1905,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1897,6 +2033,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -2080,6 +2221,10 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2203,6 +2348,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2324,6 +2474,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2366,6 +2521,10 @@ msgstr "" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2484,6 +2643,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2627,6 +2791,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2708,6 +2877,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index e880a6d8..03cebc5f 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-11-04 09:29+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Norwegian Bokmål \n" @@ -60,6 +60,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" har ingen samsvarende metadatafil!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "Rotmappen for local_copy_dir \"{path}\" finnes ikke." + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -94,6 +99,11 @@ msgstr "\"{path}\" er ikke et støttet filformat. (bruk: metadata/*.yml)" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" er ikke et godtatt format, konverter til: {formats}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "\"{path}\" finnes, men s3cmd er ikke installert!" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -320,6 +330,11 @@ msgstr "Android SDK-stien '{path}' er ikke ei mappe." msgid "Android SDK tool {cmd} found!" msgstr "Fant ikke Android-SDK-verktøyet {cmd}!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "Fant ikke Android-SDK-verktøyet {cmd}!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -398,6 +413,10 @@ msgstr "Bygg skal ha kommainndelt versionName og versionCode, ikke \"{value}\", msgid "Built repo based in \"%s\" with this config:" msgstr "Bygde pakkebrønn med base i \"%s\" med dette oppsettet:" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -514,6 +533,11 @@ msgstr "Kunne ikke fortolke størrelse \"{size}\", feil type \"{type}\"" msgid "Couldn't find Application ID" msgstr "Fant ikke pakke-ID" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "Fant ikke seneste versjonsnavn" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -524,7 +548,7 @@ msgstr "Fant ikke seneste versjonskode" msgid "Couldn't find latest version name" msgstr "Fant ikke seneste versjonsnavn" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Fant ikke pakke-ID" @@ -676,6 +700,11 @@ msgstr "Last ned fullstendige speilinger av små pakkebrønner" msgid "Download logs we don't have" msgstr "Last ned logger som ikke finnes lokalt" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Nedlasting av pakkebrønn mislyktes én gang, prøver ikke igjen." @@ -801,6 +830,11 @@ msgstr "Klarte ikke å hente APK-info, hopper over {path}" msgid "Failed to get APK manifest information" msgstr "Klarte ikke å hente APK-manifestinfo" +#: ../fdroidserver/update.py +#, fuzzy +msgid "Failed to get APK signing key fingerprint" +msgstr "Klarte ikke å hente APK-manifestinfo" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -936,6 +970,11 @@ msgstr "Git-tømming mislyktes" msgid "Git fetch failed" msgstr "Git-innhenting mislyktes" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git prune failed" +msgstr "Git-tilbakestilling mislyktes" + #: ../fdroidserver/common.py #, fuzzy msgid "Git remote set-head failed" @@ -1012,6 +1051,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, fuzzy, python-format +msgid "Including metadata from %s@%s" +msgstr "Ugyldig metadata i %s:%d" + +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "Including metadata from {path}" +msgstr "Ukjent metadataformat: {path}" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Igangsetter undermoduler" @@ -1053,6 +1102,16 @@ msgstr "Interagere med repo HTTP-serveren" msgid "Invalid APK" msgstr "Ugyldig APK" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, fuzzy, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "Ugyldig pakkenavn {0}" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1106,6 +1165,11 @@ msgstr "Ugyldig metadata i: " msgid "Invalid name for published file: %s" msgstr "Ugyldig navn for publisert fil: %s" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1170,6 +1234,11 @@ msgstr "Fant ikke Java-jarsigner. Installer på vanlig plass, eller sett java_pa msgid "Javascript in HTML src attributes" msgstr "JavaScript i HTML -src-attributter" +#: ../fdroidserver/build.py +#, fuzzy, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "Kunne ikke lese minSdkVersion: \"{apkfilename}\"" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Nøkkellager for signeringsnøkkel:\t" @@ -1192,6 +1261,11 @@ msgstr "Flatter-donasjonsmetoder hører hjemme i FlattrID-flagget" msgid "List files that would be reformatted" msgstr "Liste over filer som ville blitt formatert" +#: ../fdroidserver/rewritemeta.py +#, fuzzy +msgid "List files that would be reformatted (dry run)" +msgstr "Liste over filer som ville blitt formatert" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Lokalitet inkludert i f-droid.org -nettadresse" @@ -1227,6 +1301,11 @@ msgstr "Navnet \"%s\" er kun det forvalgte navnet, fjern det." msgid "No 'config.yml' found, using defaults." msgstr "Fant ingen 'config.yml' , bruker forvalg." +#: ../fdroidserver/verify.py +#, fuzzy, python-format +msgid "No APK for package: %s" +msgstr "Ingen slik pakke: %s" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Fant ingen Android-SDK." @@ -1267,6 +1346,16 @@ msgstr "Fant inget Android- eller Kivy-prosjekt. Angi --subdir?" msgid "No information found." msgstr "Ingen informasjon funnet." +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No matching tags found" +msgstr "Ingen informasjon funnet." + +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "Fant ingen 'config.yml' , bruker forvalg." + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Inget behov for å spesifisere at programmet er fri programvare" @@ -1308,6 +1397,11 @@ msgstr "Ingen slik pakke: %s" msgid "No such versionCode {versionCode} for app {appid}" msgstr "Ingen slik versionCode {versionCode} for programmet {appid}" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No tags found" +msgstr "Fant ingen tilknyttede enheter" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "Ingen usignert mappe - ingenting å gjøre" @@ -1538,10 +1632,19 @@ msgstr "Rekalkuler resultatmengdestatistikk - bruk når endringer har blitt gjor msgid "Removing specified files" msgstr "Fjerner angitte filer" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Gi nytt navn til APK-filer som ikke samsvarer med package.name_123.apk" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "Rapporter byggdatastatus" @@ -1625,6 +1728,15 @@ msgid_plural "Scanner found {} problems" msgstr[0] "Skanner fant {} problem" msgstr[1] "Skanner fant {} problemer" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Sett klokke til sådan tid ved bruk av:" @@ -1669,6 +1781,11 @@ msgstr "Hopp over skanning av kildekoden for binærfiler og andre problemer" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Hopper over '{apkfilename}' med ugyldig signatur." +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1736,6 +1853,14 @@ msgstr "Sammendrag av lengde {length} overstiger {limit} tegngrensen" msgid "System clock is older than date in {path}!" msgstr "Systemklokka er eldre enn datoen i {path}." +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Testmodus - putt utdata kun i tmp-mappe, og alltid bygg, selv når utdataen finnes allerede." @@ -1794,6 +1919,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "Denne pakkebrønnen har allerede lokal metadata: %s" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, fuzzy msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -1826,6 +1963,11 @@ msgstr "Ugyldig lisenstagg \"%s\". Kun bruk de som er å finne på https://spdx. msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1950,6 +2092,11 @@ msgstr "Ubrukt fil i %s" msgid "Unused scanignore path: %s" msgstr "Ubrukt fil i %s" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Oppdater repo informasjon for nye pakker" @@ -2140,6 +2287,11 @@ msgstr "tvetydig valg: %(option)s kan passe overens med %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "tvetydig valg: %s (%s?)" +#: ../fdroidserver/common.py +#, fuzzy +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "fant ikke apksigner (som kreves for signering)." + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "fant ikke apksigner (som kreves for signering)." @@ -2270,6 +2422,11 @@ msgstr "" msgid "created {path}" msgstr "opprettet {path}" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2395,6 +2552,11 @@ msgstr "ugyldig conflict_resolution-verdi: %r" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "Ugyldig valgstreng %(option)r: Må starte med et tegn %(prefix_chars)r" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2437,6 +2599,11 @@ msgstr "Inget slikt valg: %s" msgid "no version info found!" msgstr "ingen versjonsinfo funnet!" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "no version information found" +msgstr "ingen versjonsinfo funnet!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, fuzzy, python-format @@ -2556,6 +2723,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd synkroniserer indekser {path} til {url} og sletter" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "delt bibliotek" @@ -2702,6 +2874,11 @@ msgstr "{appid} fra {path} er ikke et gyldig Android-pakkenavn!" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} fra {path} er ikke et gyldig Java-pakkenavn!" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2783,6 +2960,11 @@ msgstr "{path} er null størrelse." msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} er mer enn 200MB, last opp manuelt: {url}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{path}: {error}" +msgstr "Klarte ikke å lese {path}: {error}" + #: ../fdroidserver/mirror.py #, fuzzy, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" @@ -2804,47 +2986,3 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} bygg fullført" msgstr[1] "{} bygg fullført" - -#~ msgid "Add PGP signatures for packages in repo using GnuPG" -#~ msgstr "Legg til PGP-signaturer for pakker i pakkebrønnen ved bruk av GnuPG" - -#, fuzzy -#~ msgid "Cannot find a packageName for {path}!" -#~ msgstr "Fant ikke packageName for {path}." - -#, fuzzy -#~ msgid "Cannot find an appid for {path}!" -#~ msgstr "Finner ikke AppID for {path}." - -#~ msgid "Clean after all scans have finished" -#~ msgstr "Rydd opp etter at alle skanninger er fullførte" - -#~ msgid "Clean before the scans start and rebuild the container" -#~ msgstr "Tøm før skanninger starter og bygg beholderen på ny" - -#~ msgid "Clean up all containers and then exit" -#~ msgstr "Tøm alle beholdere og avslutt" - -#, fuzzy -#~ msgid "Could not open APK file for analysis" -#~ msgstr "Kunne ikke åpne APK-fil for analyse" - -#~ msgid "Override path for repo APKs (default: ./repo)" -#~ msgstr "Overskriv sti for pakkebrønns-APK-er (forvalg: ./repo)" - -#~ msgid "Prepare Drozer to run a scan" -#~ msgstr "Forbered Drozer på kjøring av skanning" - -#~ msgid "Prepare drozer to run a scan" -#~ msgstr "Forbered Drozer på kjøring av skanning" - -#~ msgid "Scan only the latest version of each package" -#~ msgstr "Skann kun siste versjon av hver pakke" - -#, fuzzy -#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -#~ msgstr "Sett opp en emulator, installer APK-en på den og utfør en Drozer-skanning" - -#, fuzzy -#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" -#~ msgstr "Sett opp en emulator, installer APK-en på den og utfør en Drozer-skanning" diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index 5e5bb53c..b942afc7 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-07-16 15:35+0000\n" "Last-Translator: privacysimp \n" "Language-Team: Dutch \n" @@ -51,6 +51,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -85,6 +90,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -307,6 +317,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -384,6 +399,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -497,6 +516,10 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -507,7 +530,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -652,6 +675,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -768,6 +796,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -898,6 +930,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -972,6 +1008,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1012,6 +1058,16 @@ msgstr "" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1064,6 +1120,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1125,6 +1186,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1146,6 +1212,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1179,6 +1249,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1216,6 +1291,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1257,6 +1341,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1479,10 +1567,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1563,6 +1660,15 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1606,6 +1712,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1671,6 +1782,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1727,6 +1846,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1756,6 +1887,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1879,6 +2015,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -2062,6 +2203,10 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2185,6 +2330,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2306,6 +2456,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2348,6 +2503,10 @@ msgstr "" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2466,6 +2625,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2609,6 +2773,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2690,6 +2859,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 8806566b..0aa76cc7 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-10-16 13:25+0000\n" "Last-Translator: Agnieszka C \n" "Language-Team: Polish \n" @@ -66,6 +66,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" nie ma pasującego pliku metadanych!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "Katalog główny katalogu local_copy_dir \"{path}\" nie istnieje!" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "\"repo_pubkey\" musi być obecne w config.yml kiedy używasz --nosign!" @@ -100,6 +105,11 @@ msgstr "„{path}” nie jest obsługiwanym formatem pliku (użyj: metadata/*.ym msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" nie jest akceptowanym formatem, zamień na: {formats}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "\"{path}\" istnieje, ale s3cmd nie jest zainstalowany!" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -323,6 +333,11 @@ msgstr "Android SDK ścieżka '{path}' nie jest katalogiem!" msgid "Android SDK tool {cmd} found!" msgstr "Android SDK narzędzie {cmd} znaleziono!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "Android SDK narzędzie {cmd} znaleziono!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -399,6 +414,10 @@ msgstr "Kompilacja powinna mieć oddzieloną przecinkami versionName i versionCo msgid "Built repo based in \"%s\" with this config:" msgstr "Zbudowane repo w oparciu o \"%s\" z tą konfiguracją:" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -513,6 +532,11 @@ msgstr "Nie można przeanalizować rozmiaru \"{size}\", nieprawidłowy typ \"{ty msgid "Couldn't find Application ID" msgstr "Nie można odnaleźć identyfikatora aplikacji" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "Nie można znaleźć najnowszej wersji nazwy" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -523,7 +547,7 @@ msgstr "Nie można znaleźć najnowszej wersji kodu" msgid "Couldn't find latest version name" msgstr "Nie można znaleźć najnowszej wersji nazwy" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Nie można znaleźć identyfikatora pakietu" @@ -668,6 +692,11 @@ msgstr "Pobierz pełne mirrors małych repozytoriów" msgid "Download logs we don't have" msgstr "Pobierz dzienniki, których nie mamy" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Pobieranie repozytorium już raz się nie powiodło, nie próbuje ponownie." @@ -788,6 +817,11 @@ msgstr "Nie udało się uzyskać informacji o APK, pomijając {path}" msgid "Failed to get APK manifest information" msgstr "Nie można uzyskać informacji o manifeście APK" +#: ../fdroidserver/update.py +#, fuzzy +msgid "Failed to get APK signing key fingerprint" +msgstr "Nie można uzyskać informacji o manifeście APK" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -918,6 +952,11 @@ msgstr "Git clean nie powiódł się" msgid "Git fetch failed" msgstr "Pobranie Git nie powiodło się" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git prune failed" +msgstr "Resetowanie Git nie powiodło się" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "Git remote set-head nie powiódł się" @@ -992,6 +1031,16 @@ msgstr "Dołącz dzienniki budowy do lustra" msgid "Include the source tarballs in the mirror" msgstr "Dołącz źródło tarballs w lustrze" +#: ../fdroidserver/metadata.py +#, fuzzy, python-format +msgid "Including metadata from %s@%s" +msgstr "Nieprawidłowe metadane w %s:%d" + +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "Including metadata from {path}" +msgstr "Nieznany format metadanych: {path}" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Inicjowanie submodułów" @@ -1032,6 +1081,16 @@ msgstr "Wejdź w interakcje z repozytorium serwera HTTP" msgid "Invalid APK" msgstr "Nieprawidłowy plik APK" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, fuzzy, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "Niepoprawna nazwa pakietu {0}" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1084,6 +1143,11 @@ msgstr "Nieprawidłowe metadane w: " msgid "Invalid name for published file: %s" msgstr "Niepoprawna nazwa opublikowanego pliku: %s" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1145,6 +1209,11 @@ msgstr "Jarsigner Java nie został znaleziony! Zainstaluj w standardowej lokaliz msgid "Javascript in HTML src attributes" msgstr "JavaScript w atrybutach src HTML" +#: ../fdroidserver/build.py +#, fuzzy, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "Nie udało się odczytać minSdkVersion: \"{apkfilename}\"" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Magazyn kluczy do podpisywania klucza:\t" @@ -1166,6 +1235,11 @@ msgstr "Metody darowizny Liberapay należą do flagi LiberapayID" msgid "List files that would be reformatted" msgstr "Lista plików, które zostaną sformatowane" +#: ../fdroidserver/rewritemeta.py +#, fuzzy +msgid "List files that would be reformatted (dry run)" +msgstr "Lista plików, które zostaną sformatowane" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Ustawienia regionalne zawarte w adresie URL f-droid.org" @@ -1199,6 +1273,11 @@ msgstr "Nazwa '%s' jest nazwą automatyczną - usuń ją" msgid "No 'config.yml' found, using defaults." msgstr "Nie znaleziono pliku 'config.yml', używając wartości domyślnych." +#: ../fdroidserver/verify.py +#, fuzzy, python-format +msgid "No APK for package: %s" +msgstr "Brak takiego pakietu: %s" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Nie znaleziono pakietu SDK Androida!" @@ -1236,6 +1315,16 @@ msgstr "Nie można znaleźć żadnego projektu gradle. Podaj --subdir?" msgid "No information found." msgstr "Nie znaleziono informacji." +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No matching tags found" +msgstr "Nie znaleziono informacji." + +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "Nie znaleziono pliku config.yml, przy użyciu wartości domyślnych." + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Nie musisz określać, że aplikacja jest wolnym oprogramowaniem" @@ -1277,6 +1366,11 @@ msgstr "Brak takiego pakietu: %s" msgid "No such versionCode {versionCode} for app {appid}" msgstr "Brak takiego kodu wersji {versionCode} dla aplikacji {appid}" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No tags found" +msgstr "Nie znaleziono podłączonych urządzeń" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "Brak katalogu bez podpisu - nic nie można zrobić" @@ -1499,10 +1593,19 @@ msgstr "Przelicz statystyki zagregowane - użyj kiedy wprowadzono zmiany, które msgid "Removing specified files" msgstr "Usuwanie określonych plików" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Zmień nazwy plików APK, które nie pasują do pliku package.name_123.apk" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "Raport o stanie danych dotyczących kompilacji" @@ -1584,6 +1687,16 @@ msgstr[0] "Skaner znalazł {} problem" msgstr[1] "Skaner znalazł {} problemów" msgstr[2] "Skaner znalazł {} problemy" +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "Przeskanuj otrzymany plik APK w poszukiwaniu znanych niewolnych klas." + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Ustaw zegar na ten czas, używając:" @@ -1627,6 +1740,11 @@ msgstr "Pomiń skanowanie kodu źródłowego dla plików binarnych i innych prob msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Pomijaj '{apkfilename}' z nieprawidłowym podpisem!" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1692,6 +1810,14 @@ msgstr "Podsumowanie długości {length} przekracza limit {limit} char" msgid "System clock is older than date in {path}!" msgstr "Zegar systemowy jest starszy niż data w {path}!" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Tryb testowy - umieszczaj dane wyjściowe tylko w katalogu tmp i zawsze buduj, nawet jeśli dane wyjściowe już istnieją." @@ -1748,6 +1874,18 @@ msgstr "To jest repozytorium aplikacji używanych z F-Droid. Aplikacje w tym rep msgid "This repo already has local metadata: %s" msgstr "To repo ma już lokalne metadane: %s" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Aby użyć awsbucket, awssecretkey i awsaccesskeyid muszą być również ustawione w config.yml!" @@ -1777,6 +1915,11 @@ msgstr "Nieprawidłowy tag licencji \"{}\"! Używaj tylko tagów zgodnych z FSF msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Nieprawidłowy tag licencji \"{}\"! Używaj tylko tagów licencji skonfigurowanych w twoim pliku konfiguracji" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1900,6 +2043,11 @@ msgstr "Nieużywana ścieżka scandelete: %s" msgid "Unused scanignore path: %s" msgstr "Nieużywana ścieżka scanignore: %s" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Zaktualizuj informacje o repozytorium dla nowych pakietów" @@ -2083,6 +2231,11 @@ msgstr "niejednoznaczna opcja: %(option)s może dopasować %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "niejednoznaczna opcja: %s (%s?)" +#: ../fdroidserver/common.py +#, fuzzy +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "apksigner nie znaleziono, jest wymagane do podpisania!" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "apksigner nie znaleziono, jest wymagane do podpisania!" @@ -2207,6 +2360,11 @@ msgstr "nie można przeanalizować specyfikacji srclib (za dużo znaków '@'): ' msgid "created {path}" msgstr "tworzony {path}" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2329,6 +2487,11 @@ msgstr "niepoprawna wartość parametru conflict_resolution: %r" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "niepoprawny ciąg opcji %(option)r: musi zaczynać się od postaci %(prefix_chars)r" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2371,6 +2534,11 @@ msgstr "brak takiej opcji: %s" msgid "no version info found!" msgstr "nie znaleziono informacji o wersji!" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "no version information found" +msgstr "nie znaleziono informacji o wersji!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2489,6 +2657,11 @@ msgstr "nie zainstalowano ruamel.yaml, nie można zapisać metadanych." msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd zsynchronizuj indeksy {path} do {url} i usuń" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "biblioteka współdzielona" @@ -2633,6 +2806,11 @@ msgstr "{appid} z {path} nie jest prawidłowym identyfikatorem aplikacji na syst msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} z {path} nie jest prawidłową nazwą pakietu Java!" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2714,6 +2892,11 @@ msgstr "{path} ma zerowy rozmiar!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} więcej niż 200MB, przesłane ręcznie: {url}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{path}: {error}" +msgstr "Nieudane kopiowanie {path}: {error}" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" @@ -2737,42 +2920,3 @@ msgid_plural "{} builds succeeded" msgstr[0] "{} kompilacja powiodła się" msgstr[1] "{} kompilacji powiodło się" msgstr[2] "{} kompilacje powiodły się" - -#~ msgid "Cannot find a packageName for {path}!" -#~ msgstr "Nie można znaleźć nazwy pakietu dla {path}!" - -#~ msgid "Cannot find an appid for {path}!" -#~ msgstr "Nie można znaleźć załącznika dla {path}!" - -#~ msgid "Clean after all scans have finished" -#~ msgstr "Wyczyść po zakończeniu wszystkich skanów" - -#~ msgid "Clean before the scans start and rebuild the container" -#~ msgstr "Wyczyść przed rozpoczęciem skanowania i odbuduj kontener" - -#~ msgid "Clean up all containers and then exit" -#~ msgstr "Oczyść wszystkie pojemniki, a następnie wyjdź" - -#~ msgid "Could not open APK file for analysis" -#~ msgstr "Nie można otworzyć pliku APK do analizy" - -#~ msgid "Interactively ask about things that need updating." -#~ msgstr "Interaktywnie pytaj o rzeczy, które wymagają aktualizacji." - -#~ msgid "Override path for repo APKs (default: ./repo)" -#~ msgstr "Zastąp ścieżkę dla plików APK repo (domyślnie: ./repo)" - -#~ msgid "Prepare Drozer to run a scan" -#~ msgstr "Przygotuj Drozera do uruchomienia skanowania" - -#~ msgid "Prepare drozer to run a scan" -#~ msgstr "Przygotuj drozer do uruchomienia skanowania" - -#~ msgid "Scan only the latest version of each package" -#~ msgstr "Skanuj tylko najnowszą wersję każdego pakietu" - -#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -#~ msgstr "Skonfiguruj emulator, zainstaluj na nim plik APK i wykonaj skanowanie Drozera" - -#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" -#~ msgstr "Skonfiguruj emulator, zainstaluj na nim APK i wykonaj skanowanie drozer" diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index b0a3fe98..55601b47 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-08-07 21:34+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" @@ -64,6 +64,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" não tem ficheiro de metadados correspondente!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "O diretório raiz para local_copy_dir \"{path}\" não existe!" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "\"repo_pubkey\" deve estar presente em config.yml quando se usa --nosign!" @@ -98,6 +103,11 @@ msgstr "\"{path}\" não é um formato de ficheiro aceito (use: metadata/*.yml)" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" não é um formato aceito, converter para: {formats}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "\"{path}\" existe, mas s3cmd não está instalado!" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -320,6 +330,11 @@ msgstr "O caminho do SDK Android '{path}' não é um diretório!" msgid "Android SDK tool {cmd} found!" msgstr "Ferramenta {cmd} do Android SDK foi encontrada!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "Ferramenta {cmd} do Android SDK foi encontrada!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -396,6 +411,10 @@ msgstr "A compilação deve ter versionName e versionCode separados por vírgula msgid "Built repo based in \"%s\" with this config:" msgstr "Repo construído baseado em \"%s\" com esta configuração:" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -509,6 +528,11 @@ msgstr "Não foi possível analisar o tamanho \"{size}\", tipo \"{type}\" incorr msgid "Couldn't find Application ID" msgstr "Não foi possível encontrar o ID da aplicação" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "Não foi possível encontrar o nome da versão mais recente" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -519,7 +543,7 @@ msgstr "Não foi possível encontrar o código de versão mais recente" msgid "Couldn't find latest version name" msgstr "Não foi possível encontrar o nome da versão mais recente" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Não foi possível encontrar o ID do pacote" @@ -664,6 +688,11 @@ msgstr "Descarregar espelhos completos de repos pequenos" msgid "Download logs we don't have" msgstr "Descarregar os registos que nós não temos" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "O descarregamento do repositório já falhou uma vez, não tento novamente." @@ -784,6 +813,11 @@ msgstr "Falha ao obter informações do APK, ignorando {path}" msgid "Failed to get APK manifest information" msgstr "Falha ao obter informações de manifesto do APK" +#: ../fdroidserver/update.py +#, fuzzy +msgid "Failed to get APK signing key fingerprint" +msgstr "Falha ao obter informações de manifesto do APK" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -914,6 +948,11 @@ msgstr "Git clean falhou" msgid "Git fetch failed" msgstr "Git fetch falhou" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git prune failed" +msgstr "Git reset falhou" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "Git remote set-head falhou" @@ -988,6 +1027,16 @@ msgstr "Incluir os registos de construção no espelho" msgid "Include the source tarballs in the mirror" msgstr "Incluir os tarballs de fontes no espelho" +#: ../fdroidserver/metadata.py +#, fuzzy, python-format +msgid "Including metadata from %s@%s" +msgstr "Metadados inválidos em %s:%d" + +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "Including metadata from {path}" +msgstr "Formato de metadados desconhecido: {path}" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Inicializando submódulos" @@ -1028,6 +1077,16 @@ msgstr "Interacção com o repositório do servidor HTTP" msgid "Invalid APK" msgstr "APK inválido" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, fuzzy, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "Nome do pacote inválido {0}" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1080,6 +1139,11 @@ msgstr "Metadados inválidos em: " msgid "Invalid name for published file: %s" msgstr "Nome inválido para o ficheiro publicado: %s" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1141,6 +1205,11 @@ msgstr "Java jarsigner não encontrado! Instale no local predefinido ou define j msgid "Javascript in HTML src attributes" msgstr "JavaScript em atributos HTML src" +#: ../fdroidserver/build.py +#, fuzzy, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "A leitura de minSdkVersion falhou: \"{apkfilename}\"" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Armazenamento de chaves de assinatura:\t" @@ -1162,6 +1231,11 @@ msgstr "Os métodos de doação de Liberapay pertencem na bandeira de LiberapayI msgid "List files that would be reformatted" msgstr "Listar ficheiros que devem ser reformatados" +#: ../fdroidserver/rewritemeta.py +#, fuzzy +msgid "List files that would be reformatted (dry run)" +msgstr "Listar ficheiros que devem ser reformatados" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Locale incluído no URL do f-droid.org" @@ -1195,6 +1269,11 @@ msgstr "O nome '%s' é apenas o nome automático - remover" msgid "No 'config.yml' found, using defaults." msgstr "'config.yml' não encontrado, utilizando as predefinições." +#: ../fdroidserver/verify.py +#, fuzzy, python-format +msgid "No APK for package: %s" +msgstr "Nenhum pacote desses: %s" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Android SDK não encontrado!" @@ -1232,6 +1311,16 @@ msgstr "Não foi possível encontrar nenhum projeto de gradle. Especificar --sub msgid "No information found." msgstr "Nenhuma informação encontrada." +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No matching tags found" +msgstr "Nenhuma informação encontrada." + +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "Nenhum config.yml foi encontrado, usando predefinições." + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Não há necessidade de especificar que o app é software livre" @@ -1273,6 +1362,11 @@ msgstr "Nenhum pacote desses: %s" msgid "No such versionCode {versionCode} for app {appid}" msgstr "Nenhum versionCode {versionCode} para o app {appid}" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No tags found" +msgstr "Nenhum aparelho anexado encontrado" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "Nenhum diretório não assinado - nada a fazer" @@ -1495,10 +1589,19 @@ msgstr "Recalcular estatísticas agregadas - use quando foram feitas alteraçõe msgid "Removing specified files" msgstr "Apagando ficheiros especificados" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Renomear todos os ficheiros APKs que não correspondem com package.name_123.apk" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "Relatório sobre o estado dos dados de compilação" @@ -1579,6 +1682,16 @@ msgid_plural "Scanner found {} problems" msgstr[0] "Scanner encontrou {} problema" msgstr[1] "Scanner encontrou {} problemas" +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "Procure no(s) APK(s) resultante(s) por classes conhecidas não livres." + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Configurar o relógio para esse tempo usando:" @@ -1622,6 +1735,11 @@ msgstr "Pular o escaneamento do código-fonte atrás de binários e outros probl msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Ignorando '{apkfilename}' com uma assinatura inválida!" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1687,6 +1805,14 @@ msgstr "A descrição de comprimento {length} é sobre o limite de charácteres msgid "System clock is older than date in {path}!" msgstr "O relógio do sistema é mais antigo que a data em {path}!" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Modo de teste - coloque a saída apenas no diretório tmp e sempre compile, mesmo que a saída já exista." @@ -1743,6 +1869,18 @@ msgstr "Este é um repositório de apps a serem usados com o F-Droid. Aplicaçõ msgid "This repo already has local metadata: %s" msgstr "Este repositório já tem metadados locais: %s" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" @@ -1772,6 +1910,11 @@ msgstr "Etiqueta de licença \"{}\" inesperada! Use somente as etiquetas aprovad msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Etiqueta de licença \"{}\" inesperada! Use somente as etiquetas de licença configuradas no seu ficheiro de configuração" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1895,6 +2038,11 @@ msgstr "O caminho de scandelete não é usado: %s" msgid "Unused scanignore path: %s" msgstr "O caminho de scanignore não é usado: %s" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Atualizar a informação do repositório para novos pacotes" @@ -2078,6 +2226,11 @@ msgstr "opção ambígua: %(option)s poderia corresponder %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "opção ambígua: %s (%s?)" +#: ../fdroidserver/common.py +#, fuzzy +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "Nenhum apksigner encontrado, é necessário para assinar!" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "Nenhum apksigner encontrado, é necessário para assinar!" @@ -2201,6 +2354,11 @@ msgstr "não foi possível analisar a especificação srclib (demais símbolos ' msgid "created {path}" msgstr "{path} criado" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2322,6 +2480,11 @@ msgstr "valor conflict_resolution inválido: %r" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "Opção cadeia %(option)r inválida: deve começar com o caractere %(prefix_chars)r" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2364,6 +2527,11 @@ msgstr "não tem tal opção: %s" msgid "no version info found!" msgstr "não há informações de versão encontrada!" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "no version information found" +msgstr "não há informações de versão encontrada!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2482,6 +2650,11 @@ msgstr "o ruamel.yaml não está instalado, não é possível escrever metadados msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincroniza índices {path} para {url} e apaga" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "biblioteca compartilhada" @@ -2625,6 +2798,11 @@ msgstr "{appid} de {path} não é um ID de aplicação Android válido!" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} do {path} não é um Nome de Pacote Java válido!" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2706,6 +2884,11 @@ msgstr "{path} tem um tamanho de zero!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} mais de 200MB, enviar manualmente: {url}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{path}: {error}" +msgstr "Falha ao copiar {path}: {error}" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" @@ -2727,39 +2910,3 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} compilação com sucesso" msgstr[1] "{} compilações com sucesso" - -#~ msgid "Cannot find a packageName for {path}!" -#~ msgstr "Não é possível encontrar um packageName para {path} 1!" - -#~ msgid "Cannot find an appid for {path}!" -#~ msgstr "Não é possível encontrar um appid para {path} 1!" - -#~ msgid "Clean after all scans have finished" -#~ msgstr "Limpar depois que todos os escaneamentos terminarem" - -#~ msgid "Clean before the scans start and rebuild the container" -#~ msgstr "Limpar antes do escanemento começar e recompilar o container" - -#~ msgid "Clean up all containers and then exit" -#~ msgstr "Limpar todos os containers e então sair" - -#~ msgid "Could not open APK file for analysis" -#~ msgstr "Não foi possível abrir ficheiro APK para análise" - -#~ msgid "Override path for repo APKs (default: ./repo)" -#~ msgstr "Substituir o caminho para os APKs do repositório (predefinição: ./repo)" - -#~ msgid "Prepare Drozer to run a scan" -#~ msgstr "Preparar Drozer para executar uma verificação" - -#~ msgid "Prepare drozer to run a scan" -#~ msgstr "Preparar Drozer para executar uma verificação" - -#~ msgid "Scan only the latest version of each package" -#~ msgstr "Escanear apenas a versão mais recente de cada pacote" - -#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -#~ msgstr "Configure um emulador, instale o APK nele e execute um scan do Drozer" - -#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" -#~ msgstr "Configure um emulador, instale o APK nele e execute um scan do drozer" diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index e9ddad5c..2c6de286 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-02-19 19:50+0000\n" "Last-Translator: Eduardo Rodrigues \n" "Language-Team: Portuguese (Brazil) \n" @@ -69,6 +69,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" não tem arquivo de metadados correspondente!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "O diretório raiz para local_copy_dir \"{path}\" não existe!" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "\"repo_pubkey\" deve estar presente em config.yml quando se usa --nosign!" @@ -103,6 +108,11 @@ msgstr "\"{path}\" não é um formato aceito (use: metadata/*.yml)" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" não é um formato aceito, converter para: {formats}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "\"{path}\" existe, mas s3cmd não está instalado!" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -325,6 +335,11 @@ msgstr "O caminho do SDK Android '{path}' não é um diretório!" msgid "Android SDK tool {cmd} found!" msgstr "Ferramenta {cmd} do Android SDK encontrada!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "Ferramenta {cmd} do Android SDK encontrada!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -401,6 +416,10 @@ msgstr "A compilação deve ter versionName e versionCode separados por vírgula msgid "Built repo based in \"%s\" with this config:" msgstr "Repo construído baseado em \"%s\" com esta configuração:" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -514,6 +533,11 @@ msgstr "Não foi possível analisar o tamanho \"{size}\", tipo incorreto \"{type msgid "Couldn't find Application ID" msgstr "Não foi possível encontrar o ID do aplicativo" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "Impossível encontrar o nome da versão mais recente" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -524,7 +548,7 @@ msgstr "Impossível encontrar o código da versão mais recente" msgid "Couldn't find latest version name" msgstr "Impossível encontrar o nome da versão mais recente" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Impossível encontrar o ID do pacote" @@ -669,6 +693,11 @@ msgstr "Faça o download de espelhos completos de pequenos repositórios" msgid "Download logs we don't have" msgstr "Baixar os registros de alterações que nós não temos" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "O download do repositório já falhou uma vez, não tente novamente." @@ -789,6 +818,11 @@ msgstr "Falha ao obter informações do APK, ignorando {path}" msgid "Failed to get APK manifest information" msgstr "Falha ao obter informações de manifesto do APK" +#: ../fdroidserver/update.py +#, fuzzy +msgid "Failed to get APK signing key fingerprint" +msgstr "Falha ao obter informações de manifesto do APK" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -919,6 +953,11 @@ msgstr "Falha ao limpar o Git" msgid "Git fetch failed" msgstr "Falha no 'fetch' do Git" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git prune failed" +msgstr "Falha no 'reset' do Git" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "Falha ao indicar o 'head' do Git remoto" @@ -993,6 +1032,16 @@ msgstr "Inclui os logs de compilação no espelho" msgid "Include the source tarballs in the mirror" msgstr "Inclui os tarballs fonte no espelho" +#: ../fdroidserver/metadata.py +#, fuzzy, python-format +msgid "Including metadata from %s@%s" +msgstr "Metadados inválidos em %s: %d" + +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "Including metadata from {path}" +msgstr "Formato de metadados desconhecido: {path}" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Inicializando submódulos" @@ -1033,6 +1082,16 @@ msgstr "Interage com o servidor HTTP do repositório" msgid "Invalid APK" msgstr "APK inválido" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, fuzzy, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "Nome do pacote inválido {0}" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1085,6 +1144,11 @@ msgstr "Metadados inválidos em: " msgid "Invalid name for published file: %s" msgstr "Nome inválido para o arquivo publicado: %s" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1146,6 +1210,11 @@ msgstr "Java jarsigner não encontrado! Instale no local padrão ou defina java_ msgid "Javascript in HTML src attributes" msgstr "Javascript em atributo 'src' de HTML" +#: ../fdroidserver/build.py +#, fuzzy, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "Falha na leitura de minSdkVersion: \"{apkfilename}\"" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Armazenamento de chaves de assinatura:\t" @@ -1167,6 +1236,11 @@ msgstr "Métodos de doação Liberapay pertencem à bandeira LiberapayID" msgid "List files that would be reformatted" msgstr "Listar arquivos que devem ser reformatados" +#: ../fdroidserver/rewritemeta.py +#, fuzzy +msgid "List files that would be reformatted (dry run)" +msgstr "Listar arquivos que devem ser reformatados" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "A localização foi incluída na URL f-droid.org" @@ -1200,6 +1274,11 @@ msgstr "O nome '%s' é apenas o nome automático. Remova-o!" msgid "No 'config.yml' found, using defaults." msgstr "Nenhum 'config.yml' encontrado, usando padrões." +#: ../fdroidserver/verify.py +#, fuzzy, python-format +msgid "No APK for package: %s" +msgstr "Nenhum pacote desse tipo: %s" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Nenhum 'Android SDK' foi encontrado!" @@ -1237,6 +1316,16 @@ msgstr "Nenhum projeto gradle foi encontrado. Especifique --subdir?" msgid "No information found." msgstr "Nenhuma informação encontrada." +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No matching tags found" +msgstr "Nenhuma informação encontrada." + +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "Nenhum config.yml encontrado, usando padrões." + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Não há necessidade de especificar que o aplicativo é Software Livre" @@ -1278,6 +1367,11 @@ msgstr "Nenhum pacote desse tipo: %s" msgid "No such versionCode {versionCode} for app {appid}" msgstr "Nenhum tal versionCode {versionCode} para o aplicativo {appid}" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No tags found" +msgstr "Nenhum dispositivo conectado encontrado" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "Nenhum diretório não assinado - nada a fazer" @@ -1500,10 +1594,19 @@ msgstr "Recalcular estatísticas agregadas - use quando foram feitas alteraçõe msgid "Removing specified files" msgstr "Removendo arquivos especificados" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Renomeia arquivos APK que não correspondem a pacote.nome_123.apk" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "Relatório sobre o status dos dados de compilação" @@ -1584,6 +1687,16 @@ msgid_plural "Scanner found {} problems" msgstr[0] "O Scanner encontrou {} problema" msgstr[1] "O Scanner encontrou {} problemas" +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "Verifique os APKs resultantes na busca das classes não gratuitas já conhecidas." + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Ajuste o relógio para esse horário usando:" @@ -1627,6 +1740,11 @@ msgstr "Pular o escaneamento do código fonte atrás de binários e outros probl msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Ignorando '{apkfilename}' com assinatura inválida!" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1692,6 +1810,14 @@ msgstr "O resumo do tamanho {length} está acima do limite de caracteres {limit} msgid "System clock is older than date in {path}!" msgstr "O relógio/calendário do sistema é mais atrasado que em '{path}'!" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Modo de teste - coloque a saída apenas no diretório tmp e sempre compile, mesmo que a saída já exista." @@ -1748,6 +1874,18 @@ msgstr "Este é um repositório de aplicativos a serem usados com o F-Droid. Os msgid "This repo already has local metadata: %s" msgstr "Este repositório já tem metadados locais: %s" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" @@ -1777,6 +1915,11 @@ msgstr "A etiqueta da licença foi inesperada \"{}\"! Use apenas etiquetas FSF o msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "A etiqueta da licença foi inesperada \"{}\"! Use apenas as etiquetas configuradas no seu arquivo de configuração" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1900,6 +2043,11 @@ msgstr "Caminho scandelete não usado: %s" msgid "Unused scanignore path: %s" msgstr "Caminho scanignore não usado: %s" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Atualiza as informações do repositório para novos pacotes" @@ -2083,6 +2231,11 @@ msgstr "opção ambígua: %(option)s pode corresponder a %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "opção ambígua: %s (%s?)" +#: ../fdroidserver/common.py +#, fuzzy +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "o apksigner não foi encontrado, ele é necessário para assinar!" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "o apksigner não foi encontrado, ele é necessário para assinar!" @@ -2206,6 +2359,11 @@ msgstr "não foi possível analisar a especificação srclib (excesso de sinais msgid "created {path}" msgstr "{path} criado" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2327,6 +2485,11 @@ msgstr "valor conflict_resolution inválido: %r" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "Opção cadeia %(option)r inválida: deve começar com o caractere %(prefix_chars)r" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2369,6 +2532,11 @@ msgstr "não tem tal opção: %s" msgid "no version info found!" msgstr "não há informações de versão encontrada!" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "no version information found" +msgstr "não há informações de versão encontrada!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2487,6 +2655,11 @@ msgstr "o ruamel.yaml não está instalado, não é possível escrever os metada msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincroniza índices {path} para {url} e exclui" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "biblioteca compartilhada" @@ -2630,6 +2803,11 @@ msgstr "O {appid} do {path} não é um ID de aplicativo Android válido!" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "O {appid} do {path} não é um Nome de Pacote Java válido!" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2711,6 +2889,11 @@ msgstr "{path} tem um tamanho de zero!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "o {path} tem mais de 200MB, upload manual: {url}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{path}: {error}" +msgstr "Falha ao copiar {path}: {error}" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" @@ -2732,70 +2915,3 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} compilação foi bem sucedida" msgstr[1] "{} compilações foram bem sucedidas" - -#, fuzzy -#~ msgid "Add PGP signatures for packages in repo using GnuPG" -#~ msgstr "Adicione assinaturas gpg para os pacotes no repositório" - -#~ msgid "Add gpg signatures for packages in repo" -#~ msgstr "Adicione assinaturas gpg para os pacotes no repositório" - -#~ msgid "Cannot find a packageName for {path}!" -#~ msgstr "Não é possível encontrar um packageName para {path} 1!" - -#~ msgid "Cannot find an appid for {path}!" -#~ msgstr "Não é possível encontrar um appid para {path} 1!" - -#~ msgid "Clean after all scans have finished" -#~ msgstr "Limpar depois que todos os escaneamentos terminarem" - -#~ msgid "Clean before the scans start and rebuild the container" -#~ msgstr "Limpar antes do escanemento começar e recompilar o container" - -#~ msgid "Clean up all containers and then exit" -#~ msgstr "Limpar todos os containers e então sair" - -#~ msgid "Could not open APK file for analysis" -#~ msgstr "Impossível abrir o arquivo de APK para analisá-lo" - -#~ msgid "Interactively ask about things that need updating." -#~ msgstr "Perguntar interativamente sobre elementos que precisam de atualização." - -#~ msgid "Override path for repo APKs (default: ./repo)" -#~ msgstr "Substituir o caminho para os APKs do repositório (padrão: ./repo)" - -#~ msgid "Prepare Drozer to run a scan" -#~ msgstr "Preparar o Drozer para executar uma varredura" - -#~ msgid "Prepare drozer to run a scan" -#~ msgstr "Preparar o Drozer para fazer um escaneamento" - -#~ msgid "Scan only the latest version of each package" -#~ msgstr "Escanear apenas a versão mais recente de cada pacote" - -#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -#~ msgstr "Configurar um emulador, instalar o APK nele e escanear com o Drozer" - -#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" -#~ msgstr "Configurar um emulador, instalar o APK nele e escanear com o drozer" - -#~ msgid "Specify editor to use in interactive mode. Default " -#~ msgstr "Especifique o editor a ser usado no modo interativo. Padrão " - -#~ msgid "Specify editor to use in interactive mode. Default %s" -#~ msgstr "Especificar o editor que será usado no modo interativo. O padrão é %s" - -#~ msgid "Specify editor to use in interactive mode. Default is {path}" -#~ msgstr "Especifique o editor a ser usado no modo interativo. O padrão é {path}" - -#~ msgid "app-id in the form APPID" -#~ msgstr "app-id na forma APPID" - -#~ msgid "app-id to check for updates" -#~ msgstr "app-id para verificar por atualizações" - -#~ msgid "app-id with optional versionCode in the form APPID[:VERCODE]" -#~ msgstr "app-id, com código de versão (versionCode) opcional, na forma APPID[:VERCODE]" - -#~ msgid "app-id with optional versioncode in the form APPID[:VERCODE]" -#~ msgstr "app-id, com código de versão (versioncode) opcional, na forma APPID[:VERCODE]" diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 275f17b3..5c5369b6 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-01-31 22:07+0000\n" "Last-Translator: Peter J. Mello \n" "Language-Team: Portuguese (Portugal) \n" @@ -66,6 +66,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" não tem ficheiro de metadados correspondente!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "O diretório raiz para local_copy_dir \"{path}\" não existe!" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "\"repo_pubkey\" deve estar presente em config.yml quando se usa --nosign!" @@ -100,6 +105,11 @@ msgstr "\"{path}\" não é um formato de ficheiro aceito (use: metadata/*.yml)" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" não é um formato aceito, converter para: {formats}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "\"{path}\" existe, mas s3cmd não está instalado!" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -322,6 +332,11 @@ msgstr "O caminho do SDK Android '{path}' não é um diretório!" msgid "Android SDK tool {cmd} found!" msgstr "Ferramenta {cmd} do Android SDK foi encontrada!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "Ferramenta {cmd} do Android SDK foi encontrada!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -398,6 +413,10 @@ msgstr "A compilação deve ter versionName e versionCode separados por vírgula msgid "Built repo based in \"%s\" with this config:" msgstr "Repo construído baseado em \"%s\" com esta configuração:" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -511,6 +530,11 @@ msgstr "Não foi possível analisar o tamanho \"{size}\", tipo \"{type}\" incorr msgid "Couldn't find Application ID" msgstr "Não foi possível encontrar o ID da aplicação" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "Não foi possível encontrar o nome da versão mais recente" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -521,7 +545,7 @@ msgstr "Não foi possível encontrar o código de versão mais recente" msgid "Couldn't find latest version name" msgstr "Não foi possível encontrar o nome da versão mais recente" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Não foi possível encontrar o ID do pacote" @@ -666,6 +690,11 @@ msgstr "Descarregar espelhos completos de repos pequenos" msgid "Download logs we don't have" msgstr "Descarregar os registos que nós não temos" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "O descarregamento do repositório já falhou uma vez, não tento novamente." @@ -786,6 +815,11 @@ msgstr "Falha ao obter informações do APK, ignorando {path}" msgid "Failed to get APK manifest information" msgstr "Falha ao obter informações de manifesto do APK" +#: ../fdroidserver/update.py +#, fuzzy +msgid "Failed to get APK signing key fingerprint" +msgstr "Falha ao obter informações de manifesto do APK" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -916,6 +950,11 @@ msgstr "Git clean falhou" msgid "Git fetch failed" msgstr "Git fetch falhou" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git prune failed" +msgstr "Git reset falhou" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "Git remote set-head falhou" @@ -990,6 +1029,16 @@ msgstr "Incluir os registos de construção no espelho" msgid "Include the source tarballs in the mirror" msgstr "Incluir os tarballs de fontes no espelho" +#: ../fdroidserver/metadata.py +#, fuzzy, python-format +msgid "Including metadata from %s@%s" +msgstr "Metadados inválidos em %s:%d" + +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "Including metadata from {path}" +msgstr "Formato de metadados desconhecido: {path}" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Inicializando submódulos" @@ -1030,6 +1079,16 @@ msgstr "Interacção com o repositório do servidor HTTP" msgid "Invalid APK" msgstr "APK inválido" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, fuzzy, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "Nome do pacote inválido {0}" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1082,6 +1141,11 @@ msgstr "Metadados inválidos em: " msgid "Invalid name for published file: %s" msgstr "Nome inválido para o ficheiro publicado: %s" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1143,6 +1207,11 @@ msgstr "Java jarsigner não encontrado! Instale no local predefinido ou define j msgid "Javascript in HTML src attributes" msgstr "JavaScript em atributos HTML src" +#: ../fdroidserver/build.py +#, fuzzy, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "A leitura de minSdkVersion falhou: \"{apkfilename}\"" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Armazenamento de chaves de assinatura:\t" @@ -1164,6 +1233,11 @@ msgstr "Os métodos de doação de Liberapay pertencem na bandeira de LiberapayI msgid "List files that would be reformatted" msgstr "Listar ficheiros que devem ser reformatados" +#: ../fdroidserver/rewritemeta.py +#, fuzzy +msgid "List files that would be reformatted (dry run)" +msgstr "Listar ficheiros que devem ser reformatados" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Locale incluído no URL do f-droid.org" @@ -1197,6 +1271,11 @@ msgstr "O nome '%s' é apenas o nome automático - remover" msgid "No 'config.yml' found, using defaults." msgstr "'config.yml' não encontrado, utilizando as predefinições." +#: ../fdroidserver/verify.py +#, fuzzy, python-format +msgid "No APK for package: %s" +msgstr "Nenhum pacote desses: %s" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Android SDK não encontrado!" @@ -1234,6 +1313,16 @@ msgstr "Não foi possível encontrar nenhum projeto de gradle. Especificar --sub msgid "No information found." msgstr "Nenhuma informação encontrada." +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No matching tags found" +msgstr "Nenhuma informação encontrada." + +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "Nenhum config.yml foi encontrado, usando predefinições." + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Não há necessidade de especificar que o app é software livre" @@ -1275,6 +1364,11 @@ msgstr "Nenhum pacote desses: %s" msgid "No such versionCode {versionCode} for app {appid}" msgstr "Nenhum versionCode {versionCode} para o app {appid}" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No tags found" +msgstr "Nenhum aparelho anexado encontrado" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "Nenhum diretório não assinado - nada a fazer" @@ -1497,10 +1591,19 @@ msgstr "Recalcular estatísticas agregadas - use quando foram feitas alteraçõe msgid "Removing specified files" msgstr "Apagando ficheiros especificados" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Renomear todos os ficheiros APKs que não correspondem com package.name_123.apk" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "Relatório sobre o status dos dados de compilação" @@ -1581,6 +1684,16 @@ msgid_plural "Scanner found {} problems" msgstr[0] "Scanner encontrou {} problema" msgstr[1] "Scanner encontrou {} problemas" +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "Procure no(s) APK(s) resultante(s) por classes conhecidas não livres." + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Configurar o relógio para esse tempo usando:" @@ -1624,6 +1737,11 @@ msgstr "Pular o escaneamento do código-fonte atrás de binários e outros probl msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Ignorando '{apkfilename}' com uma assinatura inválida!" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1689,6 +1807,14 @@ msgstr "A descrição de comprimento {length} é sobre o limite de charácteres msgid "System clock is older than date in {path}!" msgstr "O relógio do sistema é mais antigo que a data em {path}!" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Modo de teste - coloque a saída apenas no diretório tmp e sempre compile, mesmo que a saída já exista." @@ -1745,6 +1871,18 @@ msgstr "Este é um repositório de apps a serem usados com o F-Droid. Aplicaçõ msgid "This repo already has local metadata: %s" msgstr "Este repositório já tem metadados locais: %s" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" @@ -1774,6 +1912,11 @@ msgstr "Etiqueta de licença \"{}\" inesperada! Use somente as etiquetas aprovad msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Etiqueta de licença \"{}\" inesperada! Use somente as etiquetas de licença configuradas no seu ficheiro de configuração" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1897,6 +2040,11 @@ msgstr "O caminho de scandelete não é usado: %s" msgid "Unused scanignore path: %s" msgstr "O caminho de scanignore não é usado: %s" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Atualizar a informação do repositório para novos pacotes" @@ -2080,6 +2228,11 @@ msgstr "opção ambígua: %(option)s poderia corresponder %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "opção ambígua: %s (%s?)" +#: ../fdroidserver/common.py +#, fuzzy +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "Nenhum apksigner encontrado, é necessário para assinar!" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "Nenhum apksigner encontrado, é necessário para assinar!" @@ -2203,6 +2356,11 @@ msgstr "não foi possível analisar a especificação srclib (demais símbolos ' msgid "created {path}" msgstr "{path} criado" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2324,6 +2482,11 @@ msgstr "valor conflict_resolution inválido: %r" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "Opção cadeia %(option)r inválida: deve começar com o caractere %(prefix_chars)r" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2366,6 +2529,11 @@ msgstr "não tem tal opção: %s" msgid "no version info found!" msgstr "não há informações de versão encontrada!" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "no version information found" +msgstr "não há informações de versão encontrada!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2484,6 +2652,11 @@ msgstr "o ruamel.yaml não está instalado, não é possível escrever metadados msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincroniza índices {path} para {url} e exclui" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "biblioteca compartilhada" @@ -2627,6 +2800,11 @@ msgstr "{appid} de {path} não é um ID de aplicação Android válido!" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} do {path} não é um Nome de Pacote Java válido!" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2708,6 +2886,11 @@ msgstr "{path} tem um tamanho de zero!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} mais de 200MB, enviar manualmente: {url}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{path}: {error}" +msgstr "Falha ao copiar {path}: {error}" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" @@ -2729,39 +2912,3 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} compilação com sucesso" msgstr[1] "{} compilações com sucesso" - -#~ msgid "Cannot find a packageName for {path}!" -#~ msgstr "Não é possível encontrar um packageName para {path} 1!" - -#~ msgid "Cannot find an appid for {path}!" -#~ msgstr "Não é possível encontrar um appid para {path} 1!" - -#~ msgid "Clean after all scans have finished" -#~ msgstr "Limpar depois que todos os escaneamentos terminarem" - -#~ msgid "Clean before the scans start and rebuild the container" -#~ msgstr "Limpar antes do escanemento começar e recompilar o container" - -#~ msgid "Clean up all containers and then exit" -#~ msgstr "Limpar todos os containers e então sair" - -#~ msgid "Could not open APK file for analysis" -#~ msgstr "Não foi possível abrir ficheiro APK para análise" - -#~ msgid "Override path for repo APKs (default: ./repo)" -#~ msgstr "Substituir o caminho para os APKs do repositório (predefinição: ./repo)" - -#~ msgid "Prepare Drozer to run a scan" -#~ msgstr "Preparar Drozer para executar uma verificação" - -#~ msgid "Prepare drozer to run a scan" -#~ msgstr "Preparar Drozer para executar uma verificação" - -#~ msgid "Scan only the latest version of each package" -#~ msgstr "Escanear apenas a versão mais recente de cada pacote" - -#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -#~ msgstr "Configure um emulador, instale o APK nele e execute um scan do Drozer" - -#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" -#~ msgstr "Configure um emulador, instale o APK nele e execute um scan do drozer" diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index a8c7c005..265d0c06 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-09-23 07:37+0000\n" "Last-Translator: Licaon Kter \n" "Language-Team: Romanian \n" @@ -65,6 +65,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" nu are un fișier de metadate corespunzător!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "Directorul root pentru local_copy_dir \"{path}\" nu există!" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "\"repo_pubkey\" trebuie să fie prezent în config.yml atunci când se folosește --nosign!" @@ -99,6 +104,11 @@ msgstr "\"{path}\" nu este un format de fișier acceptat (utilizați: metadata/* msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" nu este un format acceptat, convertiți în: {formats}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "\"{path}\" există, dar s3cmd nu este instalat!" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -322,6 +332,11 @@ msgstr "Calea Android SDK '{path}' nu este un director!" msgid "Android SDK tool {cmd} found!" msgstr "Instrumentul Android SDK {cmd} găsit!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "Instrumentul Android SDK {cmd} găsit!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -398,6 +413,10 @@ msgstr "Build ar trebui să aibă versionName și versionCode separate prin virg msgid "Built repo based in \"%s\" with this config:" msgstr "Construit depozit bazat în \"%s\" cu această configurație:" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -512,6 +531,11 @@ msgstr "Nu a putut analiza dimensiunea \"{size}\", tip greșit \"{type}\"" msgid "Couldn't find Application ID" msgstr "Nu s-a putut găsi ID-ul aplicației" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "Nu a putut găsi numele celei mai recente versiuni" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -522,7 +546,7 @@ msgstr "Nu am putut găsi codul ultimei versiuni" msgid "Couldn't find latest version name" msgstr "Nu a putut găsi numele celei mai recente versiuni" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Nu a putut găsi ID-ul pachetului" @@ -667,6 +691,11 @@ msgstr "Descărcați oglinzi complete ale depozitelor mici" msgid "Download logs we don't have" msgstr "Descărcați jurnalele pe care nu le avem" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Descărcarea depozitului a eșuat deja o dată, nu mai încerc din nou." @@ -787,6 +816,11 @@ msgstr "Nu a reușit să obțină informații despre APK, sărind peste {path}" msgid "Failed to get APK manifest information" msgstr "Nu a reușit să obțină informații despre manifestul APK" +#: ../fdroidserver/update.py +#, fuzzy +msgid "Failed to get APK signing key fingerprint" +msgstr "Nu a reușit să obțină informații despre manifestul APK" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -917,6 +951,11 @@ msgstr "Curățarea Git a eșuat" msgid "Git fetch failed" msgstr "Git fetch a eșuat" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git prune failed" +msgstr "Resetarea Git a eșuat" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "Git remote set-head eșuat" @@ -991,6 +1030,16 @@ msgstr "Includeți jurnalele de construcție în oglindă" msgid "Include the source tarballs in the mirror" msgstr "Includeți tarball-urile sursă în oglindă" +#: ../fdroidserver/metadata.py +#, fuzzy, python-format +msgid "Including metadata from %s@%s" +msgstr "Metadate nevalabile în %s:%d" + +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "Including metadata from {path}" +msgstr "Format de metadate necunoscut: {path}" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Inițializarea submodulelor" @@ -1031,6 +1080,16 @@ msgstr "" msgid "Invalid APK" msgstr "APK invalid" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, fuzzy, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "Nume de pachet nevalabil {0}" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1083,6 +1142,11 @@ msgstr "Metadate invalide în: " msgid "Invalid name for published file: %s" msgstr "Nume nevalabil pentru fișierul publicat: %s" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1144,6 +1208,11 @@ msgstr "Java jarsigner nu a fost găsit! Instalați în locația standard sau se msgid "Javascript in HTML src attributes" msgstr "Javascript în atributele src HTML" +#: ../fdroidserver/build.py +#, fuzzy, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "Citirea minSdkVersion a eșuat: \"{apkfilename}\"" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Keystore pentru cheia de semnare:\t" @@ -1165,6 +1234,11 @@ msgstr "Metodele de donație Liberapay fac parte din indicatorul LiberapayID" msgid "List files that would be reformatted" msgstr "Lista fișierelor care vor fi reformatate" +#: ../fdroidserver/rewritemeta.py +#, fuzzy +msgid "List files that would be reformatted (dry run)" +msgstr "Lista fișierelor care vor fi reformatate" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Locale incluse în URL-ul f-droid.org" @@ -1198,6 +1272,11 @@ msgstr "Numele \"%s\" este doar un nume auto - eliminați-l" msgid "No 'config.yml' found, using defaults." msgstr "Nu s-a găsit niciun 'config.yml', se folosesc valorile implicite." +#: ../fdroidserver/verify.py +#, fuzzy, python-format +msgid "No APK for package: %s" +msgstr "Nu există un astfel de pachet: %s" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Nu s-a găsit niciun SDK Android!" @@ -1235,6 +1314,16 @@ msgstr "Nu a putut fi găsit niciun proiect gradle. Specificați --subdir?" msgid "No information found." msgstr "Nu s-au găsit informații." +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No matching tags found" +msgstr "Nu s-au găsit informații." + +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "Nu s-a găsit niciun config.yml, se folosesc valorile implicite." + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Nu este nevoie să specificați că aplicația este Free Software" @@ -1276,6 +1365,11 @@ msgstr "Nu există un astfel de pachet: %s" msgid "No such versionCode {versionCode} for app {appid}" msgstr "Nu există un astfel de versionCode {versionCode} pentru aplicația {appid}" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No tags found" +msgstr "Nu s-au găsit dispozitive atașate" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "Niciun director nesemnat - nimic de făcut" @@ -1498,10 +1592,19 @@ msgstr "Recalculează statisticile agregate - se utilizează atunci când au fos msgid "Removing specified files" msgstr "Eliminarea fișierelor specificate" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "Deleting specified files" @@ -1583,6 +1686,16 @@ msgstr[0] "Scannerul a găsit o problemă {}" msgstr[1] "Scannerul a găsit {} probleme" msgstr[2] "Scannerul a găsit {} probleme" +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "Scanați APK-ul (APK-urile) rezultat(e) pentru clasele cunoscute care nu sunt libere." + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Setați ceasul la ora respectivă folosind:" @@ -1626,6 +1739,11 @@ msgstr "Treceți peste scanarea codului sursă pentru binare și alte probleme" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Ignorarea '{apkfilename}' cu semnătură invalidă!" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1691,6 +1809,14 @@ msgstr "Rezumat al lungimii {length} depășește limita de caractere {limit} ch msgid "System clock is older than date in {path}!" msgstr "Ceasul sistemului este mai vechi decât data din {path}!" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Modul test - puneți ieșirea numai în directorul tmp și construiți întotdeauna, chiar dacă ieșirea există deja." @@ -1747,6 +1873,18 @@ msgstr "Acesta este un depozit de aplicații care pot fi utilizate cu F-Droid. A msgid "This repo already has local metadata: %s" msgstr "Acest depozit are deja metadate locale: %s" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Pentru a utiliza awsbucket, awssecretkey și awsaccesskeyid trebuie să fie de asemenea setate în config.yml!" @@ -1776,6 +1914,11 @@ msgstr "Etichetă de licență neașteptată \"{}\"! Folosiți numai etichete ap msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Etichetă de licență neașteptată \"{}\"! Utilizați numai etichetele de licență configurate în fișierul de configurare" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1899,6 +2042,11 @@ msgstr "Calea de scanare a ștergerii neutilizată: %s" msgid "Unused scanignore path: %s" msgstr "Cale de scanare neutilizată: %s" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Actualizarea informațiilor repo pentru noile pachete" @@ -2082,6 +2230,11 @@ msgstr "opțiune ambiguă: %(option)s ar putea corespunde cu %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "opțiune ambiguă: %s (%s?)" +#: ../fdroidserver/common.py +#, fuzzy +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "apksigner nu a fost găsit, este necesar pentru a semna!" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "apksigner nu a fost găsit, este necesar pentru a semna!" @@ -2206,6 +2359,11 @@ msgstr "could not parse srclib spec (prea multe semne '@'): '{}'" msgid "created {path}" msgstr "a creat {path}" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2328,6 +2486,11 @@ msgstr "valoare invalidă a rezoluției_conflictului: %r" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "șir de opțiuni invalid %(option)r: trebuie să înceapă cu un caracter %(prefix_chars)r" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2370,6 +2533,11 @@ msgstr "nu există o astfel de opțiune: %s" msgid "no version info found!" msgstr "nu s-au găsit informații despre versiune!" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "no version information found" +msgstr "nu s-au găsit informații despre versiune!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2488,6 +2656,11 @@ msgstr "ruamel.yaml nu este instalat, nu poate scrie metadatele." msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincronizează indexurile {path} cu {url} și șterge" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "bibliotecă partajată" @@ -2632,6 +2805,11 @@ msgstr "{appid} din {path} nu este un ID de aplicație Android valid!" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} din {path} nu este un nume de pachet Java valid!" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2713,6 +2891,11 @@ msgstr "{path} este de dimensiune zero!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} mai mult de 200MB, încărcați manual: {url}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{path}: {error}" +msgstr "A eșuat copierea {path}: {error}" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 9d13959c..1478590f 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-07-01 22:06+0000\n" "Last-Translator: Чтабс \n" "Language-Team: Russian \n" @@ -72,6 +72,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "У \"%s/\" нет соответствующего файла метаданных!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "Корневой директории для local_copy_dir \"{path}\" нет!" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "При использовании --nosign в config.yml должен быть задан \"repo_pubkey\"!" @@ -106,6 +111,11 @@ msgstr "\"{path}\" не поддерживаемый формат файла (и msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "формат пути \"{path}\" не принимается, преобразуйте в другой доступный: {formats}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "путь \"{path}\" существует, но s3cmd клиент не установлен!" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -329,6 +339,11 @@ msgstr "Путь Android SDK '{path}' указывает не на директ msgid "Android SDK tool {cmd} found!" msgstr "Утилита {cmd} из Android SDK не найдена!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "Утилита {cmd} из Android SDK не найдена!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -405,6 +420,10 @@ msgstr "Для сборки необходимо разделять versionName msgid "Built repo based in \"%s\" with this config:" msgstr "Репозиторий создан в \"%s\", основываясь на конфигурации:" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -519,6 +538,11 @@ msgstr "Не удалось разобрать размер «{size}», неве msgid "Couldn't find Application ID" msgstr "Не удалось найти Application ID" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "Не удалось найти публичную версию приложения (versionName)" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -529,7 +553,7 @@ msgstr "Не удалось найти внутреннюю версию при msgid "Couldn't find latest version name" msgstr "Не удалось найти публичную версию приложения (versionName)" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Не удалось найти package ID" @@ -674,6 +698,11 @@ msgstr "Полностью загружать зеркала для неболь msgid "Download logs we don't have" msgstr "Загрузить отсутствующие логи" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Репозиторий не удалось склонировать с первой попытки." @@ -794,6 +823,11 @@ msgstr "Не удалось получить информацию об APK фа msgid "Failed to get APK manifest information" msgstr "Извлечь информацию из APK манифеста не получилось" +#: ../fdroidserver/update.py +#, fuzzy +msgid "Failed to get APK signing key fingerprint" +msgstr "Извлечь информацию из APK манифеста не получилось" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -924,6 +958,11 @@ msgstr "Очистка репозитория (git clean) не удалась" msgid "Git fetch failed" msgstr "Не удалось получить данные из репозитория (git fetch)" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git prune failed" +msgstr "Не удалось отменить изменения (git reset)" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "Не удалось настроить HEAD для удаленного репозитория (git remote set-head)" @@ -998,6 +1037,16 @@ msgstr "Включать логи сборки в зеркало" msgid "Include the source tarballs in the mirror" msgstr "Включать архивы с исходным кодом в зеркало" +#: ../fdroidserver/metadata.py +#, fuzzy, python-format +msgid "Including metadata from %s@%s" +msgstr "Неверные метаданные в %s:%d" + +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "Including metadata from {path}" +msgstr "Неизвестный формат метаданных: {path}" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Подключение модулей" @@ -1038,6 +1087,16 @@ msgstr "Взаимодействовать с HTTP сервером репози msgid "Invalid APK" msgstr "Непригодный файл APK" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, fuzzy, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "Неверное имя (package name) {0}" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1090,6 +1149,11 @@ msgstr "Неверные метаданные: " msgid "Invalid name for published file: %s" msgstr "Неверное имя для опубликованного файла: %s" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1151,6 +1215,11 @@ msgstr "Java jarsigner не обнаружен! Установите по ста msgid "Javascript in HTML src attributes" msgstr "В атрибутах исходного HTML кода содержится Javascript" +#: ../fdroidserver/build.py +#, fuzzy, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "Не удалось извлечь minSdkVersion для \"{apkfilename}\"" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Хранилище ключа для подписывания:→\t" @@ -1172,6 +1241,11 @@ msgstr "Способ пожертвования Liberapay определяетс msgid "List files that would be reformatted" msgstr "Отобразить список файлов, формат которых поменяется" +#: ../fdroidserver/rewritemeta.py +#, fuzzy +msgid "List files that would be reformatted (dry run)" +msgstr "Отобразить список файлов, формат которых поменяется" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "В URL f-droid.org включена локаль" @@ -1205,6 +1279,11 @@ msgstr "Удалите автоматически сгенерированное msgid "No 'config.yml' found, using defaults." msgstr "Файл 'config.yml' не обнаружен. Используется конфигурация по умолчанию." +#: ../fdroidserver/verify.py +#, fuzzy, python-format +msgid "No APK for package: %s" +msgstr "Такого пакета не существует: %s" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Android SDK не обнаружена!" @@ -1242,6 +1321,16 @@ msgstr "Проект gradle не найден. Возможно, нужно ук msgid "No information found." msgstr "Информация о репозитории неверна." +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No matching tags found" +msgstr "Информация о репозитории неверна." + +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "Файл 'config.yml' не обнаружен. Используется конфигурация по умолчанию." + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Указывать в описании, что приложение свободное, необязательно. Других здесь не держат" @@ -1283,6 +1372,11 @@ msgstr "Такого пакета не существует: %s" msgid "No such versionCode {versionCode} for app {appid}" msgstr "Внутренней версии (versionCode) с номером {versionCode} для приложения {appid} не существует" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No tags found" +msgstr "Подключенных устройств не найдено" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "Директории с неподписанными данными не существует. До новых встреч" @@ -1505,10 +1599,19 @@ msgstr "Пересчитать совокупную статистику. Исп msgid "Removing specified files" msgstr "Удаление выбранных файлов" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Переименовать все APK файлы, не соответствующие шаблону \"название.пакета_123.apk\"" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "Отчет от состоянии данных сборки" @@ -1590,6 +1693,16 @@ msgstr[0] "Сканирование обнаружило {} ошибку" msgstr[1] "Сканирование обнаружило {} ошибки" msgstr[2] "Сканирование обнаружило {} ошибок" +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "Проскандировать получившиеся APK на известные несвободные классы." + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Настроить системное время с помощью:" @@ -1633,6 +1746,11 @@ msgstr "Пропустить сканирование исходного код msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Неверная подпись '{apkfilename}', пропустить!" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1698,6 +1816,14 @@ msgstr "Короткое описание приложения ({length} зна msgid "System clock is older than date in {path}!" msgstr "Системное время отстает от date в {path}!" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Тестовый режим. Все собранное попадает во временную директорию; сборка запускается снова в любом случае." @@ -1754,6 +1880,18 @@ msgstr "Это репозиторий приложений, предназнач msgid "This repo already has local metadata: %s" msgstr "Локальная копия метаданных репозитория уже существует: %s" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Необходимо определить переменные awsbucket, awssecretkey и awsaccesskeyid в config.yml!" @@ -1783,6 +1921,11 @@ msgstr "Неожиданная метка лицензии: \"{}\"! Исполь msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Неожиданная метка лицензии: \"{}\"! Используйте только метки, указанные в вашем файле настроек" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1906,6 +2049,11 @@ msgstr "Неиспользованный scandelete-путь: %s" msgid "Unused scanignore path: %s" msgstr "Неиспользованный scanignore-путь: %s" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Обновить информацию о репозитории для новых пакетов" @@ -2089,6 +2237,11 @@ msgstr "неоднозначный выбор: %(option)s совпадает с msgid "ambiguous option: %s (%s?)" msgstr "неоднозначный выбор: %s (%s?)" +#: ../fdroidserver/common.py +#, fuzzy +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "apksigner не найден, он необходим для создания подписи!" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "apksigner не найден, он необходим для создания подписи!" @@ -2213,6 +2366,11 @@ msgstr "не удалось разобрать спецификацию scrlib ( msgid "created {path}" msgstr "создан {path}" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2335,6 +2493,11 @@ msgstr "неверное значение conflict_resolution: %r" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "неверный синтаксис в строке параметра %(option)r: она должна начинаться с символа %(prefix_chars)r" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2377,6 +2540,11 @@ msgstr "такого параметра нет: %s" msgid "no version info found!" msgstr "определить версию не удалось!" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "no version information found" +msgstr "определить версию не удалось!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2495,6 +2663,11 @@ msgstr "ruamel.yaml не установлен, не получается зап msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd синхронизировать индексы из {path} в {url} и удалить их" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "разделяемая библиотека" @@ -2639,6 +2812,11 @@ msgstr "{appid} из {path} не годится в качестве ID прил msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} из {path} не годится в качестве имени пакета Java!" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2720,6 +2898,11 @@ msgstr "размер {path} равен нулю!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "Размер {path} больше 200MB, загрузите его вручную на {url}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{path}: {error}" +msgstr "Не удалось скопировать {path}: {error}" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" @@ -2743,39 +2926,3 @@ msgid_plural "{} builds succeeded" msgstr[0] "{} успешная сборка" msgstr[1] "{} успешные сборки" msgstr[2] "{} успешных сборок" - -#~ msgid "Cannot find a packageName for {path}!" -#~ msgstr "По указанному пути {path} не удалось найти packageName!" - -#~ msgid "Cannot find an appid for {path}!" -#~ msgstr "По указанному пути {path} не удалось найти appid!" - -#~ msgid "Clean after all scans have finished" -#~ msgstr "Очистить после завершения сканирования" - -#~ msgid "Clean before the scans start and rebuild the container" -#~ msgstr "Очистить до начала сканирования и пересоздать контейнер" - -#~ msgid "Clean up all containers and then exit" -#~ msgstr "Очистить все контейнеры и выйти" - -#~ msgid "Could not open APK file for analysis" -#~ msgstr "Не удалось открыть и проанализировать файл APK" - -#~ msgid "Override path for repo APKs (default: ./repo)" -#~ msgstr "Переопределить путь к APK файлам репозитория (по умолчанию это ./repo)" - -#~ msgid "Prepare Drozer to run a scan" -#~ msgstr "Подготовка Drozer к сканированию репозитория" - -#~ msgid "Prepare drozer to run a scan" -#~ msgstr "Подготовка к сканированию Drozer" - -#~ msgid "Scan only the latest version of each package" -#~ msgstr "Сканировать только самую свежую версию каждого пакета" - -#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -#~ msgstr "Настроить эмулятор, установить в него APK и запустить сканирование Drozer" - -#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" -#~ msgstr "Настроить эмулятор, установить в него APK и запустить сканирование Drozer" diff --git a/locale/sk/LC_MESSAGES/fdroidserver.po b/locale/sk/LC_MESSAGES/fdroidserver.po index 20b3bf50..4ef39eb9 100644 --- a/locale/sk/LC_MESSAGES/fdroidserver.po +++ b/locale/sk/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -49,6 +49,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -83,6 +88,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -306,6 +316,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -382,6 +397,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -496,6 +515,10 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -506,7 +529,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -651,6 +674,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -767,6 +795,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -897,6 +929,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -971,6 +1007,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1011,6 +1057,16 @@ msgstr "" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1063,6 +1119,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1124,6 +1185,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1145,6 +1211,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1178,6 +1248,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1215,6 +1290,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1256,6 +1340,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1478,10 +1566,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1563,6 +1660,15 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1606,6 +1712,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1671,6 +1782,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1727,6 +1846,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1756,6 +1887,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1879,6 +2015,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -2062,6 +2203,10 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2186,6 +2331,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2308,6 +2458,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2350,6 +2505,10 @@ msgstr "" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2468,6 +2627,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2612,6 +2776,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2693,6 +2862,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index fdec9da6..2cc6a4e1 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-03-22 16:55+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" @@ -63,6 +63,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" s’ka kartel tejtëdhënash me përputhje!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "Drejtoria rrënjë për local_copy_dir \"{path}\" s’ekziston!" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "\"repo_pubkey\" duhet të jetë i pranishëm te config.yml, kur përdoret --nosign!" @@ -97,6 +102,11 @@ msgstr "\"{path}\" s’është format kartelash i mbuluar (përdorni: metadata/* msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" s’është në një format të pranuar, shndërrojeni në: {formats}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "\"{path}\" ekziston, por s3cmd s’është e instaluar!" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -319,6 +329,11 @@ msgstr "Shtegu Android SDK '{path}' s’është drejtori!" msgid "Android SDK tool {cmd} found!" msgstr "U gjet {cmd} mjeti SDK-je Android!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "U gjet {cmd} mjeti SDK-je Android!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -395,6 +410,10 @@ msgstr "Montimi duhet të ketë versionName dhe versionCode ndarë me presje, jo msgid "Built repo based in \"%s\" with this config:" msgstr "Depo montimesh e bazua në \"%s\" me këtë formësim:" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -508,6 +527,11 @@ msgstr "S’u përtyp dot madhësia \"{size}\", lloj i gabuar \"{type}\"" msgid "Couldn't find Application ID" msgstr "S’u gjet dot ID Aplikacione" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "S’ u gjet dot emër versioni më të ri" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -518,7 +542,7 @@ msgstr "S’ u gjet dot kod i versionit më të ri" msgid "Couldn't find latest version name" msgstr "S’ u gjet dot emër versioni më të ri" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "S’u gjet dot ID pakete" @@ -663,6 +687,11 @@ msgstr "Shkarko pasqyra të plota deposh të vogla" msgid "Download logs we don't have" msgstr "Shkarkoni regjistra që s’i kemi" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Shkarkimi i depos dështoi një herë, nuk po riprovohet." @@ -783,6 +812,11 @@ msgstr "S’u arrit të merren të dhëna APK-je, po anashkalohet {path}" msgid "Failed to get APK manifest information" msgstr "S’u arrit të merren të dhëna manifesti APK-je" +#: ../fdroidserver/update.py +#, fuzzy +msgid "Failed to get APK signing key fingerprint" +msgstr "S’u arrit të merren të dhëna manifesti APK-je" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -913,6 +947,11 @@ msgstr "Veprimi “git clean” dështoi" msgid "Git fetch failed" msgstr "Veprimi “git fetch” dështoi" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git prune failed" +msgstr "Veprimi “git reset” dështoi" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "Veprimi “git remote set-head” dështoi" @@ -987,6 +1026,16 @@ msgstr "Përfshi te pasqyra regjistrat e montimive" msgid "Include the source tarballs in the mirror" msgstr "Përfshi te pasqyra paketa tarball" +#: ../fdroidserver/metadata.py +#, fuzzy, python-format +msgid "Including metadata from %s@%s" +msgstr "Tejtëdhëna të pavlefshme te %s:%d" + +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "Including metadata from {path}" +msgstr "Format i panjohur tejtëdhënash: {path}" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Po gatiten nënmodule" @@ -1027,6 +1076,16 @@ msgstr "Ndërveproni me shërbyesin HTTP të depos" msgid "Invalid APK" msgstr "APK e pavlefshme" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, fuzzy, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "Emër i pavlefshëm pakete {0}" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1079,6 +1138,11 @@ msgstr "Tejtëdhëna të pavlefshme te: " msgid "Invalid name for published file: %s" msgstr "Emër i pavlefshëm për kartelë të botuar: %s" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1140,6 +1204,11 @@ msgstr "S’u gjet Java jarsigner! Instalojeni në vendndodhje standarde ose cak msgid "Javascript in HTML src attributes" msgstr "Javascript në atribute src HTML" +#: ../fdroidserver/build.py +#, fuzzy, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "Leximi i minSdkVersion dështoi: \"{apkfilename}\"" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Depo kyçesh për kyç nënshkrimi:\t" @@ -1161,6 +1230,11 @@ msgstr "Metodat e dhurimit përmes Liberapay i takojnë flamurkës Liberapay" msgid "List files that would be reformatted" msgstr "Paraqit kartela që do të riformatoheshin" +#: ../fdroidserver/rewritemeta.py +#, fuzzy +msgid "List files that would be reformatted (dry run)" +msgstr "Paraqit kartela që do të riformatoheshin" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Vendore e përfshirë te URL f-droid.org" @@ -1194,6 +1268,11 @@ msgstr "Emri '%s' është thjesht emër i automatizuar - hiqeni" msgid "No 'config.yml' found, using defaults." msgstr "S’u gjet 'config.yml', po përdoren parazgjedhjet." +#: ../fdroidserver/verify.py +#, fuzzy, python-format +msgid "No APK for package: %s" +msgstr "S’ka paketë të tillë: %s" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "S’u gjet SDK Android!" @@ -1231,6 +1310,16 @@ msgstr "" msgid "No information found." msgstr "S’u gjetën të dhëna." +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No matching tags found" +msgstr "S’u gjetën të dhëna." + +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "S’u gjet config.yml, po përdoren parazgjedhjet." + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "S’ka nevojë të specifikohet që aplikacioni është Software i Lirë" @@ -1272,6 +1361,11 @@ msgstr "S’ka paketë të tillë: %s" msgid "No such versionCode {versionCode} for app {appid}" msgstr "S’ka versionCode {versionCode} për aplikacionin {appid}" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No tags found" +msgstr "S’u gjetën pajisje të bashkëngjitura" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "S’ka drejtori të panënshkruar - s’ka ç’bëhet" @@ -1494,10 +1588,19 @@ msgstr "Rinjehso statistika përmbledhëse - përdoreni kur janë bërë ndryshi msgid "Removing specified files" msgstr "Po hiqen kartelat e treguara" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Riemërtoni kartelat APK që nuk përputhen me package.name_123.apk" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "Raport mbi gjendje të dhënash montimi" @@ -1578,6 +1681,16 @@ msgid_plural "Scanner found {} problems" msgstr[0] "Skaneri gjeti {} problem" msgstr[1] "Skaneri gjeti {} probleme" +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "Kontrollo për klasa jo të lira të ditura APK-në(të) e prodhuara." + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Vëre sahatin në atë kohë duke përdorur:" @@ -1621,6 +1734,11 @@ msgstr "Anashkalo skanimin e kodit burim për dyorë dhe probleme të tjera" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Po anashkalohet '{apkfilename}' me nënshkrim i pavlefshëm!" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1686,6 +1804,14 @@ msgstr "Përmbledhja me gjatësi {length} është mbi kufirin prej {limit} shenj msgid "System clock is older than date in {path}!" msgstr "Ora e sistemit është më herët se sa data në {path}!" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Mënyra testim - hidhe output-in vetëm te drejtoria tmp, dhe monto përherë, edhe nëse output-i ekziston tashmë." @@ -1742,6 +1868,18 @@ msgstr "Kjo është një depo aplikacionesh për t’u përdorur me F-Droid. Apl msgid "This repo already has local metadata: %s" msgstr "Kjo depo ka tashmë tejtëdhëna vendore: %s" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Për të përdorur awsbucket, te config.yml duhen ujdisur edhe awssecretkey dhe awsaccesskey!" @@ -1771,6 +1909,11 @@ msgstr "Etiketë licence \"{}\" e papritur! Përdorni vetëm etiketa të miratua msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Etiketë e papritur licence \"{}\"! Përdorni vetëm etiketa licencash të formësuara te kartela e formësimit tuaj" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1894,6 +2037,11 @@ msgstr "Shteg scandelete i papërdorur: %s" msgid "Unused scanignore path: %s" msgstr "Shteg scanignore i papërdorur: %s" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Përditësoni të dhëna depoje për paketa të reja" @@ -2077,6 +2225,11 @@ msgstr "mundësi e dykuptimtë: %(option)s mund të përputhej me %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "mundësi e dykuptimtë: %s (%s?)" +#: ../fdroidserver/common.py +#, fuzzy +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "S’u gjet apksigner, është i domosdoshëm për nënshkrim!" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "S’u gjet apksigner, është i domosdoshëm për nënshkrim!" @@ -2200,6 +2353,11 @@ msgstr "s’u përtyp dot specifikim scrlib (shumë shenja '@'): '{}'" msgid "created {path}" msgstr "u krijua {path}" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2321,6 +2479,11 @@ msgstr "vlerë e pavlefshme conflict_resolution: %r" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "varg i pavlefshëm mundësie %(option)r: duhet të fillojë me një shenjë %(prefix_chars)r" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2363,6 +2526,11 @@ msgstr "s’ka mundësi të tillë: %s" msgid "no version info found!" msgstr "s’u gjetën të dhëna versioni!" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "no version information found" +msgstr "s’u gjetën të dhëna versioni!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2481,6 +2649,11 @@ msgstr "ruamel.yaml s’është i instalaur, s’mund të shkruhen tejtëdhëna. msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sync indexes {path} to {url} and delete" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "librari e përbashkët" @@ -2624,6 +2797,11 @@ msgstr "{appid} prej {path} s’është ID e vlefshme aplikacioni Android!" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} prej {path} s;është Emër i vlefshëm Pakete Java!" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2705,6 +2883,11 @@ msgstr "{path} është me madhësi zero!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} më tepër se 200MB, ngarkojeni dorazi: {url}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{path}: {error}" +msgstr "S’u arrit të kopjohej {path}: {error}" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" @@ -2726,39 +2909,3 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} doli me sukses" msgstr[1] "{} dolën me sukses" - -#~ msgid "Cannot find a packageName for {path}!" -#~ msgstr "S’gjendet dot një packageName për {path}!" - -#~ msgid "Cannot find an appid for {path}!" -#~ msgstr "S’gjendet dot një appid për {path}!" - -#~ msgid "Clean after all scans have finished" -#~ msgstr "Pastroje, pasi të kenë përfunduar krejt skanimet" - -#~ msgid "Clean before the scans start and rebuild the container" -#~ msgstr "Pastrojeni përpara se të fillojnë skanimet dhe të rimontohet kontejneri" - -#~ msgid "Clean up all containers and then exit" -#~ msgstr "Pastroji krejt kontejnerët dhe mandej dil" - -#~ msgid "Could not open APK file for analysis" -#~ msgstr "S’u hap dot kartela APK për analizim" - -#~ msgid "Override path for repo APKs (default: ./repo)" -#~ msgstr "Shteg anashkalimi për APK-ra depoje (parazgjedhje: ./repo)" - -#~ msgid "Prepare Drozer to run a scan" -#~ msgstr "Përgatite Drozer-in të bëjë një skanim" - -#~ msgid "Prepare drozer to run a scan" -#~ msgstr "Përgatite Drozer-in të kryejë një skanim" - -#~ msgid "Scan only the latest version of each package" -#~ msgstr "Skano vetëm versionin më të ri të çdo pakete" - -#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -#~ msgstr "Ujdisni një emulues, instaloni në të APK-në dhe kryeni një skanim Drozer" - -#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" -#~ msgstr "Ujdisni një emulues, instaloni në të APK-në dhe kryeni një skanim Drozer" diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index 6aeabb77..d6357b06 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-10-16 13:25+0000\n" "Last-Translator: Kristoffer Grundström \n" "Language-Team: Swedish \n" @@ -53,6 +53,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" har ingen matchande meta-datafil!" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -87,6 +92,11 @@ msgstr "\"{path}\" är inte ett filformat som stöds (använd: metadata/*.yml)" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" är inte ett accepterat format, konvertera till: {formats}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "\"{path}\" existerar, men s3cmd är inte installerat!" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -309,6 +319,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -385,6 +400,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -498,6 +517,10 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -508,7 +531,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -653,6 +676,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -770,6 +798,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -900,6 +932,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -974,6 +1010,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1014,6 +1060,16 @@ msgstr "Interagera med förrådets HTTP-servern" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1066,6 +1122,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1127,6 +1188,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1148,6 +1214,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1181,6 +1251,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1218,6 +1293,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1259,6 +1343,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1481,10 +1569,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Byt namn på APK-filer som inte matchar paket.namn_123.apk" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1565,6 +1662,15 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1608,6 +1714,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1673,6 +1784,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1729,6 +1848,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1758,6 +1889,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1881,6 +2017,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Uppdatera förrådinformation för nya paket" @@ -2064,6 +2205,10 @@ msgstr "Tvetydiga optioner: %(option) kan motsvara %(matches)" msgid "ambiguous option: %s (%s?)" msgstr "tvetydig option: %s (%s?)" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2187,6 +2332,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2308,6 +2458,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2350,6 +2505,10 @@ msgstr "inget sådant val: %s" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2468,6 +2627,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2611,6 +2775,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2692,6 +2861,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index 3cbf7081..1dabbfc1 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-07-01 22:06+0000\n" "Last-Translator: Orhan \n" "Language-Team: Turkish \n" @@ -63,6 +63,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" eşleşen üst veri dosyasına sahip değil!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "local_copy_dir \"{path}\" için kök dizini yok!" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "--nosign kullanılırken \"repo_pubkey\" config.yml içinde bulunmalı!" @@ -97,6 +102,11 @@ msgstr "\"{path}\" desteklenen bir dosya biçimi değil (şunu kullanın: metada msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" kabul edilebilir bir biçim değil, şuna dönüştürün: {formats}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "\"{path}\" var ancak s3cmd kurulu değil!" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -319,6 +329,11 @@ msgstr "Android SDK yolu '{path}' bir dizin değil!" msgid "Android SDK tool {cmd} found!" msgstr "Android SDK aracı {cmd} bulundu!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "Android SDK aracı {cmd} bulundu!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -395,6 +410,10 @@ msgstr "İnşa virgülle ayrılmış versionName ve versionCode içermeli, {line msgid "Built repo based in \"%s\" with this config:" msgstr "Depo \"%s\" tabanında bu yapılandırma ile inşa edildi:" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -508,6 +527,11 @@ msgstr "\"{size}\" boyutu ayrıştırılamadı, yanlış tür \"{type}\"" msgid "Couldn't find Application ID" msgstr "Uygulama kimliği bulunamadı" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "Son sürüm adı bulunamadı" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -518,7 +542,7 @@ msgstr "Son sürüm kodu bulunamadı" msgid "Couldn't find latest version name" msgstr "Son sürüm adı bulunamadı" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Paket ID bulunamadı" @@ -663,6 +687,11 @@ msgstr "Küçük depoların tam yansımasını indir" msgid "Download logs we don't have" msgstr "Bizde olmayan günlükleri indir" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Depoyu indirmek zaten bir kez başarısız oldu, tekrar denenmiyor." @@ -783,6 +812,11 @@ msgstr "APK bilgisi alınamadı, {path} atlanıyor" msgid "Failed to get APK manifest information" msgstr "APK bildirim bilgileri alınamadı" +#: ../fdroidserver/update.py +#, fuzzy +msgid "Failed to get APK signing key fingerprint" +msgstr "APK bildirim bilgileri alınamadı" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -913,6 +947,11 @@ msgstr "Git clean başarısız" msgid "Git fetch failed" msgstr "Git fetch başarısız" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git prune failed" +msgstr "Git reset başarısız" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "Git remote set-head başarısız" @@ -987,6 +1026,16 @@ msgstr "Derleme günlüklerini yansıya dahil et" msgid "Include the source tarballs in the mirror" msgstr "Kaynak tar arşivlerini yansıya dahil et" +#: ../fdroidserver/metadata.py +#, fuzzy, python-format +msgid "Including metadata from %s@%s" +msgstr "%s:%d içinde geçersiz üst veri" + +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "Including metadata from {path}" +msgstr "Bilinmeyen üst veri biçimi: {path}" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Alt modüller başlatılıyor" @@ -1027,6 +1076,16 @@ msgstr "Depo HTTP sunucusu ile etkileşim kur" msgid "Invalid APK" msgstr "Geçersiz APK" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, fuzzy, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "Geçersiz paket adı {0}" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1079,6 +1138,11 @@ msgstr "Geçersiz üst veri: " msgid "Invalid name for published file: %s" msgstr "Yayımlanmış dosya için geçersiz ad: %s" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1140,6 +1204,11 @@ msgstr "Java jarsigner bulunamadı! Standart konuma kurun veya java_path ayarlay msgid "Javascript in HTML src attributes" msgstr "HTML src özniteliklerinde javascript" +#: ../fdroidserver/build.py +#, fuzzy, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "minSdkVersion okuma başarısız: \"{apkfilename}\"" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "İmzalama için anahtar deposu:\t" @@ -1161,6 +1230,11 @@ msgstr "Liberapay bağış yöntemleri LiberapayID bayrağında olmalı" msgid "List files that would be reformatted" msgstr "Yeniden biçimlendirilecek olan dosyaları listele" +#: ../fdroidserver/rewritemeta.py +#, fuzzy +msgid "List files that would be reformatted (dry run)" +msgstr "Yeniden biçimlendirilecek olan dosyaları listele" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "f-droid.org URL'sine dahil yerel ayar" @@ -1194,6 +1268,11 @@ msgstr "Ad '%s' yalnızca kendiliğinden bir ad - kaldırın" msgid "No 'config.yml' found, using defaults." msgstr "'config.yml' bulunamadı, öntanımlı değerler kullanılıyor." +#: ../fdroidserver/verify.py +#, fuzzy, python-format +msgid "No APK for package: %s" +msgstr "Böyle bir paket yok: %s" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Android SDK bulunamadı!" @@ -1231,6 +1310,16 @@ msgstr "Gradle projesi bulunamadı. --subdir belirtin?" msgid "No information found." msgstr "Bilgi bulunamadı." +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No matching tags found" +msgstr "Bilgi bulunamadı." + +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "config.yml bulunamadı, öntanımlı değerler kullanılıyor." + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Uygulamanın Özgür Yazılım olduğunu belirtmeye gerek yok" @@ -1272,6 +1361,11 @@ msgstr "Böyle bir paket yok: %s" msgid "No such versionCode {versionCode} for app {appid}" msgstr "Uygulama {appid} için böyle bir versionCode {versionCode} yok" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No tags found" +msgstr "Bağlı aygıt bulunamadı" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "İmzalanmamış dizin yok - yapılacak işlem yok" @@ -1494,10 +1588,19 @@ msgstr "Toplam istatistikleri yeniden hesapla - eski önbelleklenen veriyi geçe msgid "Removing specified files" msgstr "Belirtilen dosyalar kaldırılıyor" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "paket.adı_123.apk örüntüsüyle eşleşmeyen tüm APK dosyalarını yeniden adlandır" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "İnşa veri durumunu bildir" @@ -1578,6 +1681,16 @@ msgid_plural "Scanner found {} problems" msgstr[0] "Tarayıcı {} sorun buldu" msgstr[1] "Tarayıcı {} sorun buldu" +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "Bilinen özgür olmayan sınıflar için ortaya çıkan APK'leri tara." + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Saati o zamana şunu kullanarak ayarla:" @@ -1621,6 +1734,11 @@ msgstr "Kaynak kodu, çalıştırılabilir dosyalar ve diğer sorunlar için tar msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Geçersiz imzalı '{apkfilename}' atlanıyor!" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1686,6 +1804,14 @@ msgstr "{length} uzunluğundaki özet, {limit} karakter sınırının üstünde" msgid "System clock is older than date in {path}!" msgstr "Sistem saati {path} konumundaki tarihten daha eski!" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Sınama kipi - çıkışı sadece tmp dizinine koy, ve her zaman inşa et, çıkış zaten var olsa bile." @@ -1742,6 +1868,18 @@ msgstr "Bu, F-Droid ile kullanılacak uygulamaların bir deposudur. Bu depodaki msgid "This repo already has local metadata: %s" msgstr "Bu deponun zaten yerel üst verisi var: %s" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Awsbucket kullanmak için, awssecretkey ve awsaccesskeyid de config.yml içinde ayarlanmalı!" @@ -1771,6 +1909,11 @@ msgstr "Beklenmeyen lisans etiketi \"{}\"! Yalnızca https://spdx.org/license-li msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Beklenmeyen lisans etiketi \"{}\"! Yalnızca yapılandırma dosyanızda yapılandırılan lisans etiketlerini kullanın" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1894,6 +2037,11 @@ msgstr "Kullanılmayan scandelete yolu: %s" msgid "Unused scanignore path: %s" msgstr "Kullanılmayan scanignore yolu: %s" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Yeni paketler için depo bilgisini güncelle" @@ -2077,6 +2225,11 @@ msgstr "belirsiz şeçenek: %(option)s ile %(matches)s eşleşebilir" msgid "ambiguous option: %s (%s?)" msgstr "belirsiz şeçenek: %s (%s?)" +#: ../fdroidserver/common.py +#, fuzzy +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "apksigner bulunamadı, imzalamak için gereklidir!" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "apksigner bulunamadı, imzalamak için gereklidir!" @@ -2200,6 +2353,11 @@ msgstr "srclib belirtimi ayrıştırılamadı (çok fazla '@' işareti): '{}'" msgid "created {path}" msgstr "{path} oluşturuldu" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2321,6 +2479,11 @@ msgstr "geçersiz conflict_resolution değeri: %r" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "geçersiz seçenek satırı %(option)r: %(prefix_chars)r karakteri ile başlamalı" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2363,6 +2526,11 @@ msgstr "böyle bir şeçenek yok: %s" msgid "no version info found!" msgstr "Sürüm bilgisi bulunamadı!" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "no version information found" +msgstr "Sürüm bilgisi bulunamadı!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2481,6 +2649,11 @@ msgstr "ruamel.yaml kurulu değil, üst veriler yazılamıyor." msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sync {path} konumunu {url} adresine indeksler ve siler" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "paylaşımlı kütüphane" @@ -2624,6 +2797,11 @@ msgstr "{path}'den {appid} geçerli bir Android uygulama kimliği değil!" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{path}'den {appid} geçerli bir Java Paket Adı değil!" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2705,6 +2883,11 @@ msgstr "{path} boyutu sıfır!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} 200MB'den fazla, elle yükleyin: {url}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{path}: {error}" +msgstr "{path} kopyalanamadı: {error}" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" @@ -2726,73 +2909,3 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} inşa başarılı" msgstr[1] "{} inşa başarılı" - -#, fuzzy -#~ msgid "Add PGP signatures for packages in repo using GnuPG" -#~ msgstr "Depodaki paketler için GPG imzaları ekle" - -#~ msgid "Add gpg signatures for packages in repo" -#~ msgstr "Depodaki paketler için GPG imzaları ekle" - -#~ msgid "Android Build Tools path '{path}' does not exist!" -#~ msgstr "Android Build Tools konumu '{path}' yok!" - -#~ msgid "Cannot find a packageName for {path}!" -#~ msgstr "{path} için bir packageName bulunamıyor!" - -#~ msgid "Cannot find an appid for {path}!" -#~ msgstr "{path} için bir appid bulunamıyor!" - -#~ msgid "Clean after all scans have finished" -#~ msgstr "Tüm taramalar bitince temizle" - -#~ msgid "Clean before the scans start and rebuild the container" -#~ msgstr "Taramalar başlamadan önce temizle ve kapsayıcıyı yeniden inşa et" - -#~ msgid "Clean up all containers and then exit" -#~ msgstr "Bütün kapsayıcılar temizle ve sonra çık" - -#~ msgid "Could not open APK file for analysis" -#~ msgstr "İnceleme için APK dosyası açılamadı" - -#~ msgid "Interactively ask about things that need updating." -#~ msgstr "Güncelleme gerektiren şeyler hakkında etkileşimli olarak sor." - -#~ msgid "Override path for repo APKs (default: ./repo)" -#~ msgstr "Depo APK'ları için konumu geçersiz kıl (öntanımlı olarak: ./repo)" - -#~ msgid "Prepare Drozer to run a scan" -#~ msgstr "Drozer'i bir tarama çalıştırmak için hazırla" - -#~ msgid "Prepare drozer to run a scan" -#~ msgstr "Drozer'i bir tarama çalıştırmak için hazırla" - -#~ msgid "Scan only the latest version of each package" -#~ msgstr "Her paketin sadece en son sürümünü tara" - -#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -#~ msgstr "Bir emülatör kur, APKyı ona kur ve bir Drozer taraması yap" - -#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" -#~ msgstr "Bir emülatör kur, APKyı ona kur ve bir Drozer taraması yap" - -#~ msgid "Specify editor to use in interactive mode. Default " -#~ msgstr "Etkileşimli kipte kullanılacak editörü belirtin. Öntanımlı " - -#~ msgid "Specify editor to use in interactive mode. Default %s" -#~ msgstr "Etkileşimli kipte kullanılacak editörü belirtin. Öntanımlı %s" - -#~ msgid "Specify editor to use in interactive mode. Default is {path}" -#~ msgstr "Etkileşimli kipte kullanılacak düzenleyiciyi belirtin. Öntanımlı olan {path}" - -#~ msgid "app-id in the form APPID" -#~ msgstr "APPID biçiminde app-id" - -#~ msgid "app-id to check for updates" -#~ msgstr "Güncellemeleri denetlemek için app-id" - -#~ msgid "app-id with optional versionCode in the form APPID[:VERCODE]" -#~ msgstr "APPID[:VERCODE] biçiminde app-id, isteğe bağlı versionCode ile" - -#~ msgid "app-id with optional versioncode in the form APPID[:VERCODE]" -#~ msgstr "APPID[:VERCODE] biçiminde app-id, isteğe bağlı versioncode ile" diff --git a/locale/tzm/LC_MESSAGES/fdroidserver.po b/locale/tzm/LC_MESSAGES/fdroidserver.po index 59bd7fc5..96d067b9 100644 --- a/locale/tzm/LC_MESSAGES/fdroidserver.po +++ b/locale/tzm/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-681-gc19e8952\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2020-10-29 08:32+0000\n" "Last-Translator: Hakim Oubouali \n" "Language-Team: Central Atlas Tamazight \n" @@ -50,6 +50,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -84,6 +89,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -306,6 +316,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -382,6 +397,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -495,6 +514,10 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -505,7 +528,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -650,6 +673,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -766,6 +794,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -896,6 +928,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -970,6 +1006,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1010,6 +1056,16 @@ msgstr "" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1062,6 +1118,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1123,6 +1184,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1144,6 +1210,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1177,6 +1247,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1214,6 +1289,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1255,6 +1339,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1477,10 +1565,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1561,6 +1658,15 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1604,6 +1710,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1669,6 +1780,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1725,6 +1844,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1754,6 +1885,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1877,6 +2013,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -2060,6 +2201,10 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2183,6 +2328,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2304,6 +2454,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2346,6 +2501,10 @@ msgstr "" msgid "no version info found!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2464,6 +2623,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2607,6 +2771,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2688,6 +2857,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/ug/LC_MESSAGES/fdroidserver.po b/locale/ug/LC_MESSAGES/fdroidserver.po index 5dcbc691..759252d3 100644 --- a/locale/ug/LC_MESSAGES/fdroidserver.po +++ b/locale/ug/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2018-06-08 03:44+0000\n" "Last-Translator: ۋولقان \n" "Language-Team: Uyghur \n" @@ -51,6 +51,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "" @@ -85,6 +90,11 @@ msgstr "" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -307,6 +317,11 @@ msgstr "" msgid "Android SDK tool {cmd} found!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -383,6 +398,10 @@ msgstr "" msgid "Built repo based in \"%s\" with this config:" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -496,6 +515,10 @@ msgstr "" msgid "Couldn't find Application ID" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -506,7 +529,7 @@ msgstr "" msgid "Couldn't find latest version name" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "" @@ -651,6 +674,11 @@ msgstr "" msgid "Download logs we don't have" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -767,6 +795,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -897,6 +929,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -971,6 +1007,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1011,6 +1057,16 @@ msgstr "" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1063,6 +1119,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1124,6 +1185,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "" @@ -1145,6 +1211,10 @@ msgstr "" msgid "List files that would be reformatted" msgstr "" +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1178,6 +1248,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1215,6 +1290,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1256,6 +1340,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1478,10 +1566,19 @@ msgstr "" msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "" @@ -1562,6 +1659,15 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1605,6 +1711,11 @@ msgstr "" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1670,6 +1781,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" @@ -1726,6 +1845,18 @@ msgstr "" msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1755,6 +1886,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1878,6 +2014,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -2061,6 +2202,10 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2184,6 +2329,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2305,6 +2455,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2347,6 +2502,11 @@ msgstr "" msgid "no version info found!" msgstr "نەشىر ئۇچۇرى تېپىلمىدى!" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "no version information found" +msgstr "نەشىر ئۇچۇرى تېپىلمىدى!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2465,6 +2625,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2608,6 +2773,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2689,6 +2859,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index d1a164af..a995fb2f 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-06-28 18:52+0000\n" "Last-Translator: DankXylese \n" "Language-Team: Ukrainian \n" @@ -66,6 +66,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" не має відповідного файлу метаданих!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "Кореневої теки local_copy_dir \"{path}\" не існує!" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "\"repo_pubkey\" повинен бути присутній у config.yml коли використовується --nosign!" @@ -100,6 +105,11 @@ msgstr "\"{path}\" має непідтримуваний формат (скор msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" має непідтримуваний формат, конвертувати до: {formats}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "\"{path}\" існує, але s3cmd не встановлений!" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -323,6 +333,11 @@ msgstr "Android SDK шлях '{path}' це не каталог!" msgid "Android SDK tool {cmd} found!" msgstr "{cmd} засіб Android SDK знайдено!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "{cmd} засіб Android SDK знайдено!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -399,6 +414,10 @@ msgstr "Для побудови необхідно розділяти versionNam msgid "Built repo based in \"%s\" with this config:" msgstr "Вбудований репозиторій створено у \"%s\" на основі конфігурації:" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -513,6 +532,11 @@ msgstr "Не вдалося проаналізувати розмір \"{size}\" msgid "Couldn't find Application ID" msgstr "Не вдалося знайти ID застосунку" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "Не вдається знайти найновішу назву версії" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -523,7 +547,7 @@ msgstr "Не вдається знайти останню версію коду" msgid "Couldn't find latest version name" msgstr "Не вдається знайти найновішу назву версії" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "Не вдається знайти ідентифікатор пакунка" @@ -668,6 +692,11 @@ msgstr "Завантажувати повноцінні дзеркала нев msgid "Download logs we don't have" msgstr "Журналів завантаження у нас немає" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Завантаження репозиторію вже не вдалося, не намагайтеся знову." @@ -788,6 +817,11 @@ msgstr "Не вдалося отримати подробиці про APK, {pat msgid "Failed to get APK manifest information" msgstr "Не вдалося отримати подробиці про APK" +#: ../fdroidserver/update.py +#, fuzzy +msgid "Failed to get APK signing key fingerprint" +msgstr "Не вдалося отримати подробиці про APK" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -918,6 +952,11 @@ msgstr "Очистити Git невдалося" msgid "Git fetch failed" msgstr "Git вибірка не вдалася" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git prune failed" +msgstr "Скидання Git не вдалося" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "Не вдалося налаштувати remote set-head для Git" @@ -992,6 +1031,16 @@ msgstr "Включити журнали збірки в дзеркало" msgid "Include the source tarballs in the mirror" msgstr "Включити джерело tarballs в дзеркало" +#: ../fdroidserver/metadata.py +#, fuzzy, python-format +msgid "Including metadata from %s@%s" +msgstr "Недійсні метадані у %s: %d" + +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "Including metadata from {path}" +msgstr "Створення скелетів файлів метаданих: {path}" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "Під'єднання підмодулів" @@ -1032,6 +1081,16 @@ msgstr "Взаємодія з HTTP-сервером репозиторію" msgid "Invalid APK" msgstr "Недійсний APK" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, fuzzy, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "Неправильна назва пакунку {0}" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1084,6 +1143,11 @@ msgstr "Недійсні метадані в: " msgid "Invalid name for published file: %s" msgstr "Неправильне ім'я для оприлюдненого файлу: %s" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1145,6 +1209,11 @@ msgstr "Jarsigner Java не знайдено! Встановіть в устал msgid "Javascript in HTML src attributes" msgstr "В атрибутах джерельного HTML коду міститься Javascript" +#: ../fdroidserver/build.py +#, fuzzy, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "Не вдалося прочитати minSdkVersion: \"{apkfilename}\"" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "Шлях до сховища ключів для ключа підпису сховища\t" @@ -1166,6 +1235,11 @@ msgstr "Методи допомоги Flattr належать до прапор msgid "List files that would be reformatted" msgstr "Список файлів, які будуть переформатовані" +#: ../fdroidserver/rewritemeta.py +#, fuzzy +msgid "List files that would be reformatted (dry run)" +msgstr "Список файлів, які будуть переформатовані" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "Переклад включено до URL-адреси f-droid.org" @@ -1199,6 +1273,11 @@ msgstr "Назву '%s' — створено самочинно, вилучіт msgid "No 'config.yml' found, using defaults." msgstr "Не знайдено 'config.yml', використовуючи типові налаштування." +#: ../fdroidserver/verify.py +#, fuzzy, python-format +msgid "No APK for package: %s" +msgstr "Такого пакунка немає: %s" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "Не знайдено Android SDK!" @@ -1236,6 +1315,16 @@ msgstr "Не знайдено жодного проєкту gradle. Вказат msgid "No information found." msgstr "Подробиць не знайдено." +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No matching tags found" +msgstr "Подробиць не знайдено." + +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "config.yml не знайдено, використання типових налаштувань." + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "Не має потреби вказувати, що застосунок є вільним ПЗ" @@ -1277,6 +1366,11 @@ msgstr "Такого пакунка немає: %s" msgid "No such versionCode {versionCode} for app {appid}" msgstr "Немає такого versionCode {versionCode} для застосунку {appid}" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No tags found" +msgstr "Не знайдено приєднаних пристроїв" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "Немає непідписаної теки — нічого виконувати" @@ -1499,10 +1593,19 @@ msgstr "Перерахуйте сукупну статистику - викор msgid "Removing specified files" msgstr "Вилучення вказаних файлів" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Перейменування файлів APK, які не відповідають package.name_123.apk" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "Звіт про статус створення даних" @@ -1584,6 +1687,16 @@ msgstr[0] "Знайдено {} проблему" msgstr[1] "Знайдено {} проблеми" msgstr[2] "Знайдено {} проблем" +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "Перевірити отриманий файл APK на наявність відомих невільних класів." + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "Встановіть годинник на цей час, використовуючи:" @@ -1627,6 +1740,11 @@ msgstr "Пропустити сканування вихідного коду д msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Недійсний підпис '{apkfilename}', пропускаємо!" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1692,6 +1810,14 @@ msgstr "Довжина опису {length} перевищує обмеження msgid "System clock is older than date in {path}!" msgstr "Системний годинник відстає від date в {path}!" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Тестовий режим - надсилайте випуск лише в каталозі tmp і завжди створюйте його, навіть якщо випуск вже існує." @@ -1748,6 +1874,18 @@ msgstr "Цей репозиторій застосунків для викори msgid "This repo already has local metadata: %s" msgstr "Репозиторій вже має локальні метадані: %s" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Для використання awsbucket, awssecretkey та awsaccesskeyid також слід налаштувати config.yml!" @@ -1777,6 +1915,11 @@ msgstr "Недійсна мітка ліцензії \"{}\"! Використо msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Неочікувана мітка ліцензії \"{}\"! Використовуйте лише мітки ліцензій, налаштовані у файлі налаштувань" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1900,6 +2043,11 @@ msgstr "Невикористаний шлях scandelete: %s" msgid "Unused scanignore path: %s" msgstr "Невикористаний шлях scanignore: %s" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Оновіть дані репозиторію для нових пакунків" @@ -2083,6 +2231,11 @@ msgstr "неоднозначний параметр: %(option)s може від msgid "ambiguous option: %s (%s?)" msgstr "неоднозначний параметр: %s (%s?)" +#: ../fdroidserver/common.py +#, fuzzy +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "apksigner не знайдено, це потрібно для підписання!" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "apksigner не знайдено, це потрібно для підписання!" @@ -2207,6 +2360,11 @@ msgstr "не вдалося проаналізувати специфікаці msgid "created {path}" msgstr "створено {path}" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2329,6 +2487,11 @@ msgstr "недійсне значення conflict_resolution: %r" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "неправильний рядок параметра %(option)r: повинен починатися зі знаку %(prefix_chars)r" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2371,6 +2534,11 @@ msgstr "такого параметру немає: %s" msgid "no version info found!" msgstr "не вдалося визначити версію!" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "no version information found" +msgstr "не вдалося визначити версію!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2489,6 +2657,11 @@ msgstr "ruamel.yaml не встановлено, не вдається запи msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd синхронізувати індекси з {path} до {url} та видалити" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "спільна бібліотека" @@ -2633,6 +2806,11 @@ msgstr "{appid} з {path} є недійсним ID застосунку Android! msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} з {path} є недійсною назвою пакунка Java!" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2714,6 +2892,11 @@ msgstr "{path} не має розміру!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} понад 200 МБ, вивантажити власноруч: {url}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{path}: {error}" +msgstr "Не вдалося копіювати {path}: {error}" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" @@ -2737,75 +2920,3 @@ msgid_plural "{} builds succeeded" msgstr[0] "{} зібрано успішно" msgstr[1] "{} зібрано успішно" msgstr[2] "{} зібрано успішно" - -#, fuzzy -#~ msgid "Add PGP signatures for packages in repo using GnuPG" -#~ msgstr "Додайте підписи gpg для пакетів у репозиторії" - -#~ msgid "Add gpg signatures for packages in repo" -#~ msgstr "Додайте підписи gpg для пакетів у репозиторії" - -#~ msgid "Android Build Tools path '{path}' does not exist!" -#~ msgstr "Шлях '{path}' до інструментів створення Android не існує!" - -#~ msgid "Cannot find a packageName for {path}!" -#~ msgstr "Неможливо знайти packageName за шляхом {path}!" - -#~ msgid "Cannot find an appid for {path}!" -#~ msgstr "Не вдається знайти appid за шляхом {path}!" - -#~ msgid "Clean after all scans have finished" -#~ msgstr "Очистити після завершення сканування" - -#~ msgid "Clean before the scans start and rebuild the container" -#~ msgstr "Очистити перед початком сканування і перебудуйте контейнер" - -#~ msgid "Clean up all containers and then exit" -#~ msgstr "Очистити усі контейнери, а потім вийти" - -#~ msgid "Could not open APK file for analysis" -#~ msgstr "Не вдалося відкрити файл APK для аналізу" - -#~ msgid "Interactively ask about things that need updating." -#~ msgstr "Інтерактивно запитайте про речі, які потребують оновлення." - -#~ msgid "Override path for repo APKs (default: ./repo)" -#~ msgstr "Перевизначити шлях для сховища APK-файлів (типово: ./repo)" - -#~ msgid "Prepare Drozer to run a scan" -#~ msgstr "Підготувати Drozer до початку сканування" - -#~ msgid "Prepare drozer to run a scan" -#~ msgstr "Підготувати drozer для запуску сканування" - -#~ msgid "Scan only the latest version of each package" -#~ msgstr "Сканувати лише останню версію кожного пакета" - -#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -#~ msgstr "Налаштуйте емулятор, встановіть на нього APK та виконайте сканування з Drozer" - -#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" -#~ msgstr "Налаштуйте емулятор, встановіть APK на нього та виконайте drozer сканування" - -#, fuzzy -#~ msgid "Specify editor to use in interactive mode. Default " -#~ msgstr "Вкажіть редактор для використання в інтерактивному режимі. За замовчуванням %s" - -#~ msgid "Specify editor to use in interactive mode. Default %s" -#~ msgstr "Вкажіть редактор для використання в інтерактивному режимі. За замовчуванням %s" - -#, fuzzy -#~ msgid "Specify editor to use in interactive mode. Default is {path}" -#~ msgstr "Вкажіть редактор для використання в інтерактивному режимі. За замовчуванням %s" - -#~ msgid "app-id in the form APPID" -#~ msgstr "app-id у формі APPID" - -#~ msgid "app-id to check for updates" -#~ msgstr "app-id для перевірки наявність оновлень" - -#~ msgid "app-id with optional versionCode in the form APPID[:VERCODE]" -#~ msgstr "app-id з необов'язковою версією коду у формі APPID[:VERCODE]" - -#~ msgid "app-id with optional versioncode in the form APPID[:VERCODE]" -#~ msgstr "app-id з необов'язковим кодом версії у формі APPID[:VERCODE]" diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index f166c0a8..326f9fdc 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-10-16 13:25+0000\n" "Last-Translator: JY3 \n" "Language-Team: Chinese (Simplified) \n" @@ -71,6 +71,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" 不与任何元数据文件匹配!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "local_copy_dir必须为绝对路径!" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "当您使用 --nosign 时, config.yml 中必须存在 \"repo_pubkey\" !" @@ -105,6 +110,11 @@ msgstr "\"{path}\" 不是被支持的格式 ( 使用: metadata/*.yml )" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" 不是可接受的格式, 需转换成 : {formats}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "\"{path}\" 存在, 但 s3cmd 未安装!" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -326,6 +336,11 @@ msgstr "Android SDK 路径 '{path}' 不是目录!" msgid "Android SDK tool {cmd} found!" msgstr "找到 Android SDK 工具 {cmd}!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "找到 Android SDK 工具 {cmd}!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -402,6 +417,10 @@ msgstr "构建应使用逗号分隔的 versionName 和 versionCode, 而不是 {l msgid "Built repo based in \"%s\" with this config:" msgstr "使用此配置并基于 \"%s\" 的构建存储库:" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -514,6 +533,11 @@ msgstr "无法解析大小 \"{size}\", 错误类型 \"{type}\"" msgid "Couldn't find Application ID" msgstr "找不到应用ID" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "找不到最新的版本名" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -524,7 +548,7 @@ msgstr "找不到最新的版本代码" msgid "Couldn't find latest version name" msgstr "找不到最新的版本名" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "找不到安装包 ID" @@ -669,6 +693,11 @@ msgstr "下载小型仓库的完整镜像" msgid "Download logs we don't have" msgstr "下载当前没有的日志" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "下载仓库已经失败了一次,不再尝试。" @@ -789,6 +818,10 @@ msgstr "" msgid "Failed to get APK manifest information" msgstr "" +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -919,6 +952,10 @@ msgstr "" msgid "Git fetch failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "" @@ -993,6 +1030,16 @@ msgstr "" msgid "Include the source tarballs in the mirror" msgstr "" +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "Including metadata from {path}" +msgstr "未知元数据格式:{path}" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "" @@ -1033,6 +1080,16 @@ msgstr "与存储库 HTTP 服务器互动" msgid "Invalid APK" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1085,6 +1142,11 @@ msgstr "" msgid "Invalid name for published file: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1146,6 +1208,11 @@ msgstr "" msgid "Javascript in HTML src attributes" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "签名密钥的密钥库:\t" @@ -1167,6 +1234,11 @@ msgstr "" msgid "List files that would be reformatted" msgstr "列出全部需重新设定格式的文件" +#: ../fdroidserver/rewritemeta.py +#, fuzzy +msgid "List files that would be reformatted (dry run)" +msgstr "列出全部需重新设定格式的文件" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "" @@ -1200,6 +1272,11 @@ msgstr "" msgid "No 'config.yml' found, using defaults." msgstr "" +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "" @@ -1237,6 +1314,15 @@ msgstr "" msgid "No information found." msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "" @@ -1278,6 +1364,10 @@ msgstr "" msgid "No such versionCode {versionCode} for app {appid}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "" @@ -1500,10 +1590,19 @@ msgstr "重新计算聚合统计数据-当已经做出更改而导致旧的缓 msgid "Removing specified files" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "重命名文件名不符合 package.name_123.apk 的 APK 文件" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "报告编译数据状态" @@ -1583,6 +1682,15 @@ msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "" @@ -1626,6 +1734,11 @@ msgstr "跳过二进制源码扫描和其他问题" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1691,6 +1804,14 @@ msgstr "" msgid "System clock is older than date in {path}!" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "测试模式:仅将输出保存至 tmp 目录,即使输出已存在,仍然编译。" @@ -1747,6 +1868,18 @@ msgstr "这是一个与F-Droid一起使用的应用的存储库。这个存储 msgid "This repo already has local metadata: %s" msgstr "" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" @@ -1776,6 +1909,11 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1899,6 +2037,11 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "更新新包的存储库信息" @@ -2082,6 +2225,10 @@ msgstr "模糊的选项:%(option)s 可以相配 %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "模糊的选项:%s(%s?)" +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" msgstr "" @@ -2204,6 +2351,11 @@ msgstr "" msgid "created {path}" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2324,6 +2476,11 @@ msgstr "" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2366,6 +2523,11 @@ msgstr "没有此选项:%s" msgid "no version info found!" msgstr "没有找到版本信息!" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "no version information found" +msgstr "没有找到版本信息!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2484,6 +2646,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2626,6 +2793,11 @@ msgstr "" msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2707,6 +2879,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{path}: {error}" +msgstr "复制 {path} 失败:{error}" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" @@ -2726,63 +2903,3 @@ msgstr[0] "" msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "" - -#, fuzzy -#~ msgid "Add PGP signatures for packages in repo using GnuPG" -#~ msgstr "添加包 gpg 签名至资源库" - -#~ msgid "Add gpg signatures for packages in repo" -#~ msgstr "添加包 gpg 签名至资源库" - -#~ msgid "Clean after all scans have finished" -#~ msgstr "扫描全部完成后清除" - -#~ msgid "Clean before the scans start and rebuild the container" -#~ msgstr "在扫描启动和容器重新编译之前清除" - -#~ msgid "Clean up all containers and then exit" -#~ msgstr "清除所有容器,然后退出" - -#~ msgid "Interactively ask about things that need updating." -#~ msgstr "需更新事项的互动提示。" - -#~ msgid "Override path for repo APKs (default: ./repo)" -#~ msgstr "覆盖资源库 APK 路径(默认为 ./repo)" - -#~ msgid "Prepare Drozer to run a scan" -#~ msgstr "准备Drozer进行扫描" - -#~ msgid "Prepare drozer to run a scan" -#~ msgstr "准备运行 drozer 扫描" - -#~ msgid "Scan only the latest version of each package" -#~ msgstr "仅扫描每个包的最新版本" - -#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -#~ msgstr "设置一个模拟器,在其中安装APK并执行Drozer扫描" - -#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" -#~ msgstr "设置一个模拟器,然后在其中安装 APK 并执行 drozer 扫描" - -#, fuzzy -#~ msgid "Specify editor to use in interactive mode. Default " -#~ msgstr "指定编辑器使用互动模式。默认 %s" - -#~ msgid "Specify editor to use in interactive mode. Default %s" -#~ msgstr "指定编辑器使用互动模式。默认 %s" - -#, fuzzy -#~ msgid "Specify editor to use in interactive mode. Default is {path}" -#~ msgstr "指定编辑器使用互动模式。默认 %s" - -#~ msgid "app-id in the form APPID" -#~ msgstr "app-id,格式:APPID" - -#~ msgid "app-id to check for updates" -#~ msgstr "app-id,用于检查更新" - -#~ msgid "app-id with optional versionCode in the form APPID[:VERCODE]" -#~ msgstr "带有可选项 versionCode 的 app-id,格式:APPID[:VERCODE]" - -#~ msgid "app-id with optional versioncode in the form APPID[:VERCODE]" -#~ msgstr "带有可选项 versioncode 的 app-id,格式:APPID[:VERCODE]" diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 37d26619..a683ac24 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2021-01-29 16:12+0100\n" +"POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-05-19 11:33+0000\n" "Last-Translator: Stiffen \n" "Language-Team: Chinese (Traditional) \n" @@ -64,6 +64,11 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s 1/\" 沒有符合的中介資料檔案!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "local_copy_dir \"{path}\" 根目錄不存在!" + #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" msgstr "\"repo_pubkey\" 需要在使用--nosign參數時寫在config.yml 檔案裡!" @@ -98,6 +103,11 @@ msgstr "\"{path}\" 不是可接受的格式,轉換成: metadata/*.yml" msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" 不是可接受的格式,轉換成: {formats}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "有 \"{path}\" 存在,但是沒有安裝 s3cmd!" + #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" @@ -324,6 +334,11 @@ msgstr "Android SDK 路徑 '{path}' 不是目錄資料夾!" msgid "Android SDK tool {cmd} found!" msgstr "找到 Android SDK 工具 {cmd} 了!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "找到 Android SDK 工具 {cmd} 了!" + #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be #. translated or transliterated. @@ -400,6 +415,10 @@ msgstr "在 {linedesc} 版本編譯的版本名稱和版本代號應以逗號分 msgid "Built repo based in \"%s\" with this config:" msgstr "軟體庫的編譯依照 \"%s\" 與此設定:" +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" @@ -462,7 +481,7 @@ msgid "Comma separated list of categories." msgstr "以逗號分隔類別清單。" #: ../fdroid ../fdroidserver/__main__.py -#, c-format, fuzzy, python-format +#, fuzzy, c-format, python-format msgid "Command '%s' not recognised.\n" msgstr "無法識別指令 '%s' 。\n" @@ -516,6 +535,11 @@ msgstr "無法解析大小 (\"{size}\") , \"{type}\" 是錯的" msgid "Couldn't find Application ID" msgstr "找不到應用的 ID" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "Couldn't find any version information" +msgstr "找不到最新版本名稱" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" @@ -526,7 +550,7 @@ msgstr "找到不最新版的代碼" msgid "Couldn't find latest version name" msgstr "找不到最新版本名稱" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" msgstr "找不到包 ID" @@ -672,6 +696,11 @@ msgstr "下載小型軟體庫完整的鏡像" msgid "Download logs we don't have" msgstr "下載我們沒有的日誌" +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "下載軟體庫已失敗過一次,尚未重試。" @@ -793,6 +822,11 @@ msgstr "無法取得 APK 資訊,略過 {path}" msgid "Failed to get APK manifest information" msgstr "無法取得 APK 單號資訊" +#: ../fdroidserver/update.py +#, fuzzy +msgid "Failed to get APK signing key fingerprint" +msgstr "無法取得 APK 單號資訊" + #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" @@ -925,6 +959,11 @@ msgstr "Git 清理失敗" msgid "Git fetch failed" msgstr "Git 抓取失敗" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git prune failed" +msgstr "Git 重置失敗" + #: ../fdroidserver/common.py msgid "Git remote set-head failed" msgstr "Git 遠端 set-head 失敗" @@ -1003,6 +1042,16 @@ msgstr "在鏡像中加入編譯紀錄。" msgid "Include the source tarballs in the mirror" msgstr "在鏡像中加入軟體的源代碼包。" +#: ../fdroidserver/metadata.py +#, fuzzy, python-format +msgid "Including metadata from %s@%s" +msgstr "%s 中有無效的中介資料 : %d" + +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "Including metadata from {path}" +msgstr "未知的中介資料格式t:{path}" + #: ../fdroidserver/common.py msgid "Initialising submodules" msgstr "初始化子模組" @@ -1043,6 +1092,16 @@ msgstr "與軟體庫 HTTP 伺服器互動" msgid "Invalid APK" msgstr "無效的 APK" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, fuzzy, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "無效的套件包稱 {0}" + #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" @@ -1095,6 +1154,11 @@ msgstr "無效的中介資料: " msgid "Invalid name for published file: %s" msgstr "無效的已發佈檔案名稱:%s" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" @@ -1158,6 +1222,11 @@ msgstr "找不到 Java jarsigner!請安裝在標準的位置或是設定 java_ msgid "Javascript in HTML src attributes" msgstr "JavaScript 在 HTML src 的屬性" +#: ../fdroidserver/build.py +#, fuzzy, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "讀取 minSdkVersion 失敗:\"{apkfilename}\"" + #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" msgstr "金鑰庫的簽署金鑰:\t" @@ -1180,6 +1249,11 @@ msgstr "Liberapay 捐款方式在 LiberapayID 標誌下" msgid "List files that would be reformatted" msgstr "列出將重新格式化的檔案" +#: ../fdroidserver/rewritemeta.py +#, fuzzy +msgid "List files that would be reformatted (dry run)" +msgstr "列出將重新格式化的檔案" + #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" msgstr "在 f-droid.org 網址中已含括區域" @@ -1214,6 +1288,11 @@ msgstr "名稱 '%s' 為自動產生 - 請移除它" msgid "No 'config.yml' found, using defaults." msgstr "找不到 'config.yml',使用預設。" +#: ../fdroidserver/verify.py +#, fuzzy, python-format +msgid "No APK for package: %s" +msgstr "無此套件包:%s" + #: ../fdroidserver/common.py msgid "No Android SDK found!" msgstr "未找到 Android SDK!" @@ -1253,6 +1332,16 @@ msgstr "找不到任何 gradle 專案。 需要用參數 '--subdir' 指定子目 msgid "No information found." msgstr "查無資訊。" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No matching tags found" +msgstr "查無資訊。" + +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "找不到檔案 'config.yml',使用預設。" + #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" msgstr "不必要指明的應用程式為自由軟體" @@ -1294,6 +1383,11 @@ msgstr "無此套件包:%s" msgid "No such versionCode {versionCode} for app {appid}" msgstr "應用 {appid} 無版本代號 {versionCode}" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "No tags found" +msgstr "查無附加的設備" + #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" msgstr "無未簽署目錄 - 無須採取行動" @@ -1522,10 +1616,19 @@ msgstr "重新計算集合統計 - 使用時進行更改,這會使得舊的快 msgid "Removing specified files" msgstr "移除指定檔案" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "為不符合 package.name_123.apk 格式的 APK 檔案更名" +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "報告構建資料的狀態" @@ -1606,6 +1709,16 @@ msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "掃瞄器發現 {} 問題" +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with apkanalyzer for known non-free classes." +msgstr "在生成的 APK 檔案中掃描已知的閉源軟體 。" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + #: ../fdroidserver/common.py msgid "Set clock to that time using:" msgstr "設定時鐘到那時使用:" @@ -1650,6 +1763,11 @@ msgstr "跳過掃描二進制碼和其它問題的原始碼" msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "略過帶無效簽署的 '{apkfilename}'!" +#: ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" @@ -1715,6 +1833,14 @@ msgstr "摘要的長度 {length} 超過了字符 {limit} 限制" msgid "System clock is older than date in {path}!" msgstr "在 {path} 中的系統時鐘比日期早!" +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "測試模式 - 將輸出只放在 tmp 目錄中,即使輸出已經存在,仍然構建。" @@ -1773,6 +1899,18 @@ msgstr "這是一個和 F-Droid 配套使用的軟體庫。此軟體庫中包含 msgid "This repo already has local metadata: %s" msgstr "這個軟體庫已有本地的中介資料:%s" +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "要使用 awsbucket, awssecretkey 與 awsaccesskeyid 必須在 config.yml 進行設定!" @@ -1805,6 +1943,11 @@ msgstr "這個許可證標籤不符合預期 \"{}\"! 只能使用 https://spdx msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "這個許可證標籤不符合預期 \"{}\"! 只能使用你的配置文檔裡面配置好的許可證標籤啦。" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" @@ -1928,6 +2071,11 @@ msgstr "路徑: %s 被標記為掃描並刪除,但並未執行" msgid "Unused scanignore path: %s" msgstr "檔案路徑: %s 被標記為不掃描,但並未出現" +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "為新的套件包更新軟體庫資訊" @@ -2117,6 +2265,11 @@ msgstr "模糊選項:%(option)s 可以相配 %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "不明確的選項:%s (%s?)" +#: ../fdroidserver/common.py +#, fuzzy +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "apksigner 不見了 , 我們需要用它來生成數字簽名 !" + #: ../fdroidserver/common.py #, fuzzy msgid "apksigner not found, it's required for signing!" @@ -2247,6 +2400,11 @@ msgstr "無法解析 scrlib spec (符號 '@' 出現太多次了): '{}'" msgid "created {path}" msgstr "已建立 {path}" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" @@ -2369,6 +2527,11 @@ msgstr "無效 conflict_resolution 值:%r" msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "無效的選項字串 %(option)r:必須以字符 %(prefix_chars)r為起頭" +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" @@ -2411,6 +2574,11 @@ msgstr "沒這樣的選項:%s" msgid "no version info found!" msgstr "未發現版本資訊!" +#: ../fdroidserver/checkupdates.py +#, fuzzy +msgid "no version information found" +msgstr "未發現版本資訊!" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2530,6 +2698,11 @@ msgstr "因為沒有設置 ruamel.yaml, 無法寫入 metadata 。" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd 同步索引 {path} 到 {url} 並刪除" +#: ../fdroidserver/scanner.py +#, python-format +msgid "scanner not cleanly run apkanalyzer: %s" +msgstr "" + #: ../fdroidserver/scanner.py #, fuzzy msgid "shared library" @@ -2676,6 +2849,11 @@ msgstr "來自路徑 {path} 的 {appid} 並不是一個有效的 android applica msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "來自 {path} 的 {appid} 並不是一個有效的 Java 套件名稱!" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" @@ -2757,6 +2935,11 @@ msgstr "{path} 為零尺寸!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "檔案 {path} 大於 200MB , 手動上傳: {url}" +#: ../fdroidserver/update.py +#, fuzzy, python-brace-format +msgid "{path}: {error}" +msgstr "讀取路徑 {path} 失敗:錯誤訊息{error}" + #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" @@ -2776,70 +2959,3 @@ msgstr[0] "{} 編譯失敗" msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} 編譯成功" - -#, fuzzy -#~ msgid "Add PGP signatures for packages in repo using GnuPG" -#~ msgstr "在軟體倉庫中加入套件包的 gpg 簽署" - -#~ msgid "Add gpg signatures for packages in repo" -#~ msgstr "在軟體倉庫中加入套件包的 gpg 簽署" - -#~ msgid "Cannot find a packageName for {path}!" -#~ msgstr "路徑 {path} 找不到套件名稱!" - -#~ msgid "Cannot find an appid for {path}!" -#~ msgstr "找不到 {path} 的 appid!" - -#~ msgid "Clean after all scans have finished" -#~ msgstr "所有掃描完成後清除" - -#~ msgid "Clean before the scans start and rebuild the container" -#~ msgstr "在掃描開始與重新構建容器之前清除" - -#~ msgid "Clean up all containers and then exit" -#~ msgstr "清除所有容器,然後退出" - -#~ msgid "Could not open APK file for analysis" -#~ msgstr "無法開啟 APK 檔案作分析" - -#~ msgid "Interactively ask about things that need updating." -#~ msgstr "以對話方式詢問需要更新的內容。" - -#~ msgid "Override path for repo APKs (default: ./repo)" -#~ msgstr "覆蓋軟體庫 APK 的路徑 (預設:./repo)" - -#~ msgid "Prepare Drozer to run a scan" -#~ msgstr "準備 drozer 以執行掃描" - -#~ msgid "Prepare drozer to run a scan" -#~ msgstr "準備 drozer 以執行掃描" - -#~ msgid "Scan only the latest version of each package" -#~ msgstr "只掃描每個套件包的最新版本" - -#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -#~ msgstr "設置一個模擬器,在其上安裝 APK 並執行 drozer 掃描" - -#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" -#~ msgstr "設置一個模擬器,在其上安裝 APK 並執行 drozer 掃描" - -#~ msgid "Specify editor to use in interactive mode. Default " -#~ msgstr "指定編輯器在交互模式使用。預設 " - -#~ msgid "Specify editor to use in interactive mode. Default %s" -#~ msgstr "指定編輯器在互動模式使用。預設 %s" - -#~ msgid "Specify editor to use in interactive mode. Default is {path}" -#~ msgstr "指定編輯器在互動模式使用。預設 {path}" - -#~ msgid "app-id in the form APPID" -#~ msgstr "app-id,格式為 APPID" - -#~ msgid "app-id to check for updates" -#~ msgstr "以 app-id 檢查更新" - -#~ msgid "app-id with optional versionCode in the form APPID[:VERCODE]" -#~ msgstr "app-id 具有任選的 versionCode 在此格式為 APPID [:VERCODE]" - -#~ msgid "app-id with optional versioncode in the form APPID[:VERCODE]" -#~ msgstr "app-id 具有任選的 versioncode 在此格式為 APPID [:VERCODE]" From fb61168c383afbdd4544f5dfb56e4daac2cabc02 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Tue, 15 Feb 2022 22:36:44 +0000 Subject: [PATCH 0566/2116] Also detect versioned so files --- fdroidserver/scanner.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 68369dc9..45ed3918 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -347,33 +347,33 @@ def scan_source(build_dir, build=metadata.Build()): continue path_in_build_dir = os.path.relpath(filepath, build_dir) - extension = os.path.splitext(path_in_build_dir)[1] if curfile in ('gradle-wrapper.jar', 'gradlew', 'gradlew.bat'): removeproblem(curfile, path_in_build_dir, filepath) - elif extension == '.apk': + elif curfile.endswith('.apk'): removeproblem(_('Android APK file'), path_in_build_dir, filepath) - elif extension == '.a': + elif curfile.endswith('.a'): count += handleproblem(_('static library'), path_in_build_dir, filepath) - elif extension == '.aar': + elif curfile.endswith('.aar'): count += handleproblem(_('Android AAR library'), path_in_build_dir, filepath) - elif extension == '.class': + elif curfile.endswith('.class'): count += handleproblem(_('Java compiled class'), path_in_build_dir, filepath) - elif extension == '.dex': + elif curfile.endswith('.dex'): count += handleproblem(_('Android DEX code'), path_in_build_dir, filepath) - elif extension == '.gz': + elif curfile.endswith('.gz'): count += handleproblem(_('gzip file archive'), path_in_build_dir, filepath) - elif extension == '.so': + # We use a regular expression here to also match versioned shared objects like .so.0.0.0 + elif re.match(r'.*\.so(\..+)*$', curfile): count += handleproblem(_('shared library'), path_in_build_dir, filepath) - elif extension == '.zip': + elif curfile.endswith('.zip'): count += handleproblem(_('ZIP file archive'), path_in_build_dir, filepath) - elif extension == '.jar': + elif curfile.endswith('.jar'): for name in suspects_found(curfile): count += handleproblem('usual suspect \'%s\'' % name, path_in_build_dir, filepath) count += handleproblem(_('Java JAR file'), path_in_build_dir, filepath) - elif extension == '.java': + elif curfile.endswith('.java'): if not os.path.isfile(filepath): continue with open(filepath, 'r', errors='replace') as f: @@ -382,7 +382,7 @@ def scan_source(build_dir, build=metadata.Build()): count += handleproblem('DexClassLoader', path_in_build_dir, filepath) break - elif extension == '.gradle': + elif curfile.endswith('.gradle'): if not os.path.isfile(filepath): continue with open(filepath, 'r', errors='replace') as f: @@ -398,7 +398,7 @@ def scan_source(build_dir, build=metadata.Build()): if not any(r.match(url) for r in allowed_repos): count += handleproblem('unknown maven repo \'%s\'' % url, path_in_build_dir, filepath) - elif extension in ['', '.bin', '.out', '.exe']: + elif curfile.endswith(('.', '.bin', '.out', '.exe')): if is_binary(filepath): count += handleproblem('binary', path_in_build_dir, filepath) From 1f75090fa2152ab62e5accf65ba0b62173ecac6e Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Tue, 15 Feb 2022 22:39:08 +0000 Subject: [PATCH 0567/2116] Fix --use-date-from-apk flag --- fdroidserver/update.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 4c217180..8c87d5f9 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1500,8 +1500,8 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal # resize existing icons for densities missing in the APK fill_missing_icon_densities(empty_densities, iconfilename, apk, repodir) - if use_date_from_apk and manifest.date_time[1] != 0: - default_date_param = datetime(*manifest.date_time) + if use_date_from_apk: + default_date_param = datetime.fromtimestamp(os.stat(apkfile).st_mtime) else: default_date_param = None From 04242f162be7ad0f19565e9eaa3c3ed716c96c34 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 15 Feb 2022 20:11:29 +0100 Subject: [PATCH 0568/2116] add Romanian locale --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index e15f9ecd..33e3d78b 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -32,6 +32,7 @@ include locale/pl/LC_MESSAGES/fdroidserver.po include locale/pt/LC_MESSAGES/fdroidserver.po include locale/pt_BR/LC_MESSAGES/fdroidserver.po include locale/pt_PT/LC_MESSAGES/fdroidserver.po +include locale/ro/LC_MESSAGES/fdroidserver.po include locale/ru/LC_MESSAGES/fdroidserver.po include locale/sq/LC_MESSAGES/fdroidserver.po include locale/tr/LC_MESSAGES/fdroidserver.po From 421e07db12e2e0679aeb96855ace08a6ed7f1221 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 15 Feb 2022 21:06:02 +0100 Subject: [PATCH 0569/2116] stop compiling locale files for the sdist tarballs !1014 #934 --- setup.cfg | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/setup.cfg b/setup.cfg index 3414de70..e33cfbc3 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,10 +1,9 @@ [metadata] license_file = LICENSE -# uploading here requires Python 3.5.3+ or setuptools 27+, -# use instead: twine upload --sign dist/fdroidserver*.tar.gz +# publish with: twine upload --sign dist/fdroidserver*.tar.gz [aliases] -release = versioncheck compile_catalog sdist +release = versioncheck sdist # All this below is for Babel config. Ideally we would only use # Babel, but it is still missing some key features that gettext gives From 36a7b83be198ace2759cb85637f288518be22301 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 15 Feb 2022 17:24:16 +0100 Subject: [PATCH 0570/2116] version 2.1b0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 61d66657..6c6041e0 100755 --- a/setup.py +++ b/setup.py @@ -82,7 +82,7 @@ with open("README.md", "r") as fh: setup( name='fdroidserver', - version='2.1a0', + version='2.1b0', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From 3309cb495a577277db0088b46d5df0b3b7e9bc2a Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Thu, 17 Feb 2022 20:57:41 +0100 Subject: [PATCH 0571/2116] Translated using Weblate: Albanian (sq) by Besnik Bleta Currently translated at 97.7% (563 of 576 strings) Co-authored-by: Besnik Bleta Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/ Translation: F-Droid/F-Droid Server --- locale/sq/LC_MESSAGES/fdroidserver.po | 494 +++++++++++++++++++------- 1 file changed, 372 insertions(+), 122 deletions(-) diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index 2cc6a4e1..3a08464d 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,8 @@ msgstr "" "POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2021-03-22 16:55+0000\n" "Last-Translator: Besnik Bleta \n" -"Language-Team: Albanian \n" +"Language-Team: Albanian \n" "Language: sq\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,16 +21,22 @@ msgstr "" #: ../fdroidserver/common.py msgid "" "\n" -" This is a repository of apps to be used with FDroid. Applications in this\n" -" repository are either official binaries built by the original application\n" -" developers, or are binaries built from source by f-droid.org using the\n" +" This is a repository of apps to be used with FDroid. Applications in " +"this\n" +" repository are either official binaries built by the original " +"application\n" +" developers, or are binaries built from source by f-droid.org using " +"the\n" " tools on https://gitlab.com/fdroid.\n" " " msgstr "" "\n" -" Kjo është një depo aplikacionesh për t’u përdorur me FDroid. Aplikacionet\n" -" në këtë depo ose janë dyorë zyrtarë të montuar nga zhvilluesit e aplikacionit\n" -" origjinal, ose janë dyorë të montuar nga burimi prej f-droid.org duke përdorur\n" +" Kjo është një depo aplikacionesh për t’u përdorur me FDroid. " +"Aplikacionet\n" +" në këtë depo ose janë dyorë zyrtarë të montuar nga zhvilluesit e " +"aplikacionit\n" +" origjinal, ose janë dyorë të montuar nga burimi prej f-droid.org " +"duke përdorur\n" " mjetet në https://gitlab.com/fdroid.\n" " " @@ -61,7 +68,7 @@ msgstr "" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" -msgstr "\"%s/\" s’ka kartel tejtëdhënash me përputhje!" +msgstr "\"%s/\" s’ka kartelë tejtëdhënash me përputhje!" #: ../fdroidserver/index.py #, fuzzy, python-brace-format @@ -70,7 +77,9 @@ msgstr "Drejtoria rrënjë për local_copy_dir \"{path}\" s’ekziston!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "\"repo_pubkey\" duhet të jetë i pranishëm te config.yml, kur përdoret --nosign!" +msgstr "" +"\"repo_pubkey\" duhet të jetë i pranishëm te config.yml, kur përdoret --" +"nosign!" #: ../fdroidserver/install.py #, python-brace-format @@ -95,12 +104,14 @@ msgstr "\"{path}\" ekziston, por s3cmd s’është e instaluar!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "\"{path}\" s’është format kartelash i mbuluar (përdorni: metadata/*.yml)" +msgstr "" +"\"{path}\" s’është format kartelash i mbuluar (përdorni: metadata/*.yml)" #: ../fdroidserver/metadata.py #, python-brace-format msgid "\"{path}\" is not an accepted format, convert to: {formats}" -msgstr "\"{path}\" s’është në një format të pranuar, shndërrojeni në: {formats}" +msgstr "" +"\"{path}\" s’është në një format të pranuar, shndërrojeni në: {formats}" #: ../fdroidserver/update.py #, fuzzy, python-brace-format @@ -197,12 +208,14 @@ msgstr "'sdk_path' te 'config.yml' s’është ujdisur!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-23.0.0 or newer!" -msgstr "'{aapt}' është shumë i vjetër, fdroid lyp build-tools-23.0.0 ose më të ri!" +msgstr "" +"'{aapt}' është shumë i vjetër, fdroid lyp build-tools-23.0.0 ose më të ri!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" -msgstr "'{aapt}' është shumë i vjetër, fdroid lyp build-tools-{version} ose më të ri!" +msgstr "" +"'{aapt}' është shumë i vjetër, fdroid lyp build-tools-{version} ose më të ri!" #: ../fdroidserver/install.py #, python-brace-format @@ -212,12 +225,18 @@ msgstr "'{apkfilename}' është tashmë e instaluar në {dev}." #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{field}' in {linedesc} is obsolete, see docs for current fields:" -msgstr "'{field}' te {linedesc} është e vjetruar, për fushat në përdorim, shihni dokumentimin:" +msgstr "" +"'{field}' te {linedesc} është e vjetruar, për fushat në përdorim, shihni " +"dokumentimin:" #: ../fdroidserver/common.py #, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' do të jetë sipas një rendi kuturu! Nëse rendi është i rëndësishëm, përdorni kllapa () ose []!" +msgid "" +"'{field}' will be in random order! Use () or [] brackets if order is " +"important!" +msgstr "" +"'{field}' do të jetë sipas një rendi kuturu! Nëse rendi është i rëndësishëm, " +"përdorni kllapa () ose []!" #: ../fdroidserver/common.py #, python-brace-format @@ -227,7 +246,9 @@ msgstr "S’u arrit të përmbushet '{path}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" -msgstr "'{value}' s’është një {field} e vlefshme te {appid}. Rregullsi shprehjeje të rregullt: {pattern}" +msgstr "" +"'{value}' s’është një {field} e vlefshme te {appid}. Rregullsi shprehjeje të " +"rregullt: {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -241,7 +262,8 @@ msgstr ".__call__() e pacaktuar" #: ../fdroidserver/metadata.py msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." -msgstr ".fdroid.txt nuk mbulohet! Shndërrojeni në .fdroid.yml ose .fdroid.json." +msgstr "" +".fdroid.txt nuk mbulohet! Shndërrojeni në .fdroid.yml ose .fdroid.json." #: ../fdroidserver/lint.py msgid "/issues is missing" @@ -277,8 +299,12 @@ msgid "Alias of the repo signing key in the keystore" msgstr "Alias i kyçit të nënshkrimeve të depos te depo kyçesh" #: ../fdroidserver/import.py -msgid "Allows a different revision (or git branch) to be specified for the initial import" -msgstr "Lejon të specifikohet një rishikim tjetër (ose kryeni “git branch”) për importimin fillestar" +msgid "" +"Allows a different revision (or git branch) to be specified for the initial " +"import" +msgstr "" +"Lejon të specifikohet një rishikim tjetër (ose kryeni “git branch”) për " +"importimin fillestar" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" @@ -361,8 +387,12 @@ msgid "Archiving {apkfilename} with invalid signature!" msgstr "Po arkivohet {apkfilename} me nënshkrim të pavlefshëm!" #: ../fdroidserver/mirror.py -msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" -msgstr "URL bazë për t’u pasqyruar, mund të përfshijë kyçin e nënshkrimit të treguesit që përdor vargun e kërkimi: ?fingerprint=" +msgid "" +"Base URL to mirror, can include the index signing key using the query " +"string: ?fingerprint=" +msgstr "" +"URL bazë për t’u pasqyruar, mund të përfshijë kyçin e nënshkrimit të " +"treguesit që përdor vargun e kërkimi: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py @@ -390,7 +420,9 @@ msgstr "Monto krejt aplikacionet e mundshme" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" -msgstr "Montim i prodhuar nga `fdroid import` - hiqni rreshtin e çaktivizimit, pasi të jetë gati" +msgstr "" +"Montim i prodhuar nga `fdroid import` - hiqni rreshtin e çaktivizimit, pasi " +"të jetë gati" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" @@ -402,8 +434,12 @@ msgstr "Monto vetëm versionin më të ri të çdo pakete" #: ../fdroidserver/metadata.py #, python-brace-format -msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" -msgstr "Montimi duhet të ketë versionName dhe versionCode ndarë me presje, jo \"{value}\", te {linedesc}" +msgid "" +"Build should have comma-separated versionName and versionCode, not " +"\"{value}\", in {linedesc}" +msgstr "" +"Montimi duhet të ketë versionName dhe versionCode ndarë me presje, jo " +"\"{value}\", te {linedesc}" #: ../fdroidserver/init.py #, python-format @@ -443,7 +479,8 @@ msgstr "S’mund të përdoret --list dhe --to në të njëjtën kohë" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" -msgstr "S’shkruhet dot \"{path}\", s’është format i pranuar, përdorni: {formats}" +msgstr "" +"S’shkruhet dot \"{path}\", s’është format i pranuar, përdorni: {formats}" #: ../fdroidserver/lint.py #, python-format @@ -460,13 +497,21 @@ msgstr "Kontrollo për përditësime aplikacionesh" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Po kontrollohet arkivimi përr {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "" +"Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, " +"archapks:{arch}" +msgstr "" +"Po kontrollohet arkivimi përr {appid} - APKs:{integer}, keepversions:{keep}, " +"archapks:{arch}" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Po kontrollohet arkivimi për {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "" +"Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, " +"archapks:{arch}" +msgstr "" +"Po kontrollohet arkivimi për {appid} - apks:{integer}, keepversions:{keep}, " +"archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -486,13 +531,19 @@ msgid "Commit changes" msgstr "Depozito ndryshimet" #: ../fdroidserver/__main__.py -msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." -msgstr "Argumente që përplasen: '--verbose' dhe '--quiet' s’mund të përdoren në të njëjtën kohë." +msgid "" +"Conflicting arguments: '--verbose' and '--quiet' can not be specified at the " +"same time." +msgstr "" +"Argumente që përplasen: '--verbose' dhe '--quiet' s’mund të përdoren në të " +"njëjtën kohë." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Kartela formësimi me përplasje! Po përdoret {newfile}, po shpërfillet {oldfile}!" +msgstr "" +"Kartela formësimi me përplasje! Po përdoret {newfile}, po shpërfillet " +"{oldfile}!" #: ../fdroidserver/common.py #, python-brace-format @@ -548,7 +599,9 @@ msgstr "S’u gjet dot ID pakete" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" -msgstr "Po refuzohet me burracakëri të mbishkruhet ujdisje ekzistuese kyçesh nënshkrimi!" +msgstr "" +"Po refuzohet me burracakëri të mbishkruhet ujdisje ekzistuese kyçesh " +"nënshkrimi!" #: ../fdroidserver/update.py msgid "Create a repo signing key in a keystore" @@ -597,7 +650,9 @@ msgstr "Po krijohet tregues i panënshkruar, si përgatitje për nënshkrim" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "CurrentVersionCode {cv} është më i vogël sesa zëri {versionCode} i montimit më të vjetër" +msgstr "" +"CurrentVersionCode {cv} është më i vogël sesa zëri {versionCode} i montimit " +"më të vjetër" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" @@ -615,7 +670,9 @@ msgstr "Po fshihet arkivi, depoja është shumë e madhe ({size} maks. {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "Po fshihet historik git-mirror, depoja është shumë e madhe ({size} maks. {limit})" +msgstr "" +"Po fshihet historik git-mirror, depoja është shumë e madhe ({size} maks. " +"{limit})" #: ../fdroidserver/update.py #, python-brace-format @@ -634,7 +691,9 @@ msgstr "Përshkrimi ka një rresht të përsëdytur" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "Përshkrimi ka një listë (%s), por kjo s’është as me toptha (*), as e numërtuar (#)" +msgstr "" +"Përshkrimi ka një listë (%s), por kjo s’është as me toptha (*), as e " +"numërtuar (#)" #: ../fdroidserver/lint.py #, python-brace-format @@ -671,8 +730,11 @@ msgid "Don't do anything logs-related" msgstr "Mos bëj gjë që lidhet me regjistrat" #: ../fdroidserver/build.py -msgid "Don't refresh the repository, useful when testing a build with no internet connection" -msgstr "Mos rifresko depon, e dobishme kur testohet një montim pa lidhje internet" +msgid "" +"Don't refresh the repository, useful when testing a build with no internet " +"connection" +msgstr "" +"Mos rifresko depon, e dobishme kur testohet një montim pa lidhje internet" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py #: ../fdroidserver/upload.py @@ -703,8 +765,10 @@ msgstr "Shkarkimi i {url} dështoi. {error}" #: ../fdroidserver/metadata.py #, python-brace-format -msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" -msgstr "U gjet përsëdytje recete montimi për versionCode {versionCode} te {linedesc}" +msgid "" +"Duplicate build recipe found for versionCode {versionCode} in {linedesc}" +msgstr "" +"U gjet përsëdytje recete montimi për versionCode {versionCode} te {linedesc}" #: ../fdroidserver/lint.py #, python-brace-format @@ -724,7 +788,8 @@ msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" -"GABIM: ky urdhër s’duhet përdorur kurrë për krijimin e një pasqyre të f-droid.org!\n" +"GABIM: ky urdhër s’duhet përdorur kurrë për krijimin e një pasqyre të f-" +"droid.org!\n" "Një pasqyrë e plotë e f-droid.org lyp më tepër se 200GB." #: ../fdroidserver/nightly.py @@ -738,8 +803,12 @@ msgstr "Flamurkë e zbrazët montimi te {linedesc}" #: ../fdroidserver/__main__.py #, python-brace-format -msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "Si kodim është caktuar '{enc}'. Fdroid mund të hasë probleme kodimi. Për përfundimet më të mira, caktojeni si 'UTF-8'." +msgid "" +"Encoding is set to '{enc}' fdroid might run into encoding issues. Please set " +"it to 'UTF-8' for best results." +msgstr "" +"Si kodim është caktuar '{enc}'. Fdroid mund të hasë probleme kodimi. Për " +"përfundimet më të mira, caktojeni si 'UTF-8'." #: ../fdroidserver/init.py #, python-format @@ -865,8 +934,12 @@ msgid "Forbidden HTML tags" msgstr "Etiketa HTML të ndaluara" #: ../fdroidserver/build.py -msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." -msgstr "Detyro montim aplikacionesh të çaktivizuara, dhe vazhdon pavarësisht problemesh skanimi. E lejuar vetëm nën mënyrën testim." +msgid "" +"Force build of disabled apps, and carries on regardless of scan problems. " +"Only allowed in test mode." +msgstr "" +"Detyro montim aplikacionesh të çaktivizuara, dhe vazhdon pavarësisht " +"problemesh skanimi. E lejuar vetëm nën mënyrën testim." #: ../fdroidserver/build.py #, python-brace-format @@ -989,7 +1062,9 @@ msgstr "Nëse ky ngarkim dështon, provoni ta ngarkoni dorazi te {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "Po shpërfillet '{field}' te tejtëdhëna '{metapath}', ngaqë është nxjerrë nga përdorimi." +msgstr "" +"Po shpërfillet '{field}' te tejtëdhëna '{metapath}', ngaqë është nxjerrë nga " +"përdorimi." #: ../fdroidserver/update.py #, python-format @@ -1012,7 +1087,9 @@ msgstr "Po shpërfillet kartelë {ext} te '{path}'" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "Përfshi APKra që janë nënshkruar me algoritme të çaktivizuar, bie fjala, me MD5" +msgstr "" +"Përfshi APKra që janë nënshkruar me algoritme të çaktivizuar, bie fjala, me " +"MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" @@ -1117,12 +1194,17 @@ msgstr "Listë me toptha e pavlefshme" #: ../fdroidserver/lint.py #, python-format -msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" -msgstr "Etiketë e pavlefshme licence \"%s\"! Përdorni vetëm etiketa nga https://spdx.org/license-list" +msgid "" +"Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" +msgstr "" +"Etiketë e pavlefshme licence \"%s\"! Përdorni vetëm etiketa nga https://spdx." +"org/license-list" #: ../fdroidserver/lint.py msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "Lidhje e pavlefshme - përdorni [http://lidhja_që_na_intereson Lidhje titull] ose [http://lidhja_që_na_intereson]" +msgstr "" +"Lidhje e pavlefshme - përdorni [http://lidhja_që_na_intereson Lidhje titull] " +"ose [http://lidhja_që_na_intereson]" #: ../fdroidserver/metadata.py #, python-format @@ -1166,7 +1248,8 @@ msgstr "Tejtëdhëna srclib të pavlefshme: s’u përtyp dot '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "Tejtëdhëna srclib të pavlefshme: kyçi panjohur '{key}' te kartela '{file}'" +msgstr "" +"Tejtëdhëna srclib të pavlefshme: kyçi panjohur '{key}' te kartela '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1190,15 +1273,20 @@ msgstr "Kartelë JAR Java" #: ../fdroidserver/publish.py ../fdroidserver/update.py #: ../fdroidserver/mirror.py msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "S’u gjet Java JDK! Instalojeni në vendndodhje standarde ose caktoni java_paths!" +msgstr "" +"S’u gjet Java JDK! Instalojeni në vendndodhje standarde ose caktoni " +"java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Klasë Java e përpiluar" #: ../fdroidserver/signindex.py -msgid "Java jarsigner not found! Install in standard location or set java_paths!" -msgstr "S’u gjet Java jarsigner! Instalojeni në vendndodhje standarde ose caktoni java_paths!" +msgid "" +"Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "" +"S’u gjet Java jarsigner! Instalojeni në vendndodhje standarde ose caktoni " +"java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" @@ -1215,8 +1303,11 @@ msgstr "Depo kyçesh për kyç nënshkrimi:\t" #: ../fdroidserver/lint.py #, python-brace-format -msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "Parashtrimi '{commit}' i përdorur së fundi duket si etiketë, por si UpdateCheckMode është '{ucm}'" +msgid "" +"Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" +"Parashtrimi '{commit}' i përdorur së fundi duket si etiketë, por si " +"UpdateCheckMode është '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" @@ -1330,7 +1421,9 @@ msgstr "S’ka nevojë të specifikohet që aplikacioni është për Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" -msgstr "S’ka mundësi të ujdisur! Përpunoni config.yml tuaj që të ujdisni të paktën një prej:" +msgstr "" +"S’ka mundësi të ujdisur! Përpunoni config.yml tuaj që të ujdisni të paktën " +"një prej:" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1403,7 +1496,9 @@ msgstr "packagename i OBB-së nuk përputhet me ndonjë APK të mbuluar:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "Makinë jo në linjë, po anashkalohet prodhim pasqyre git, deri sa `fdroid deploy`" +msgstr "" +"Makinë jo në linjë, po anashkalohet prodhim pasqyre git, deri sa `fdroid " +"deploy`" #: ../fdroidserver/common.py #, python-brace-format @@ -1429,7 +1524,8 @@ msgstr "Kryeje vetëm për aplikacione me vetëpërditësime" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "Metodat e dhurimit përmes OpenCollective i takojnë fushës OpenCollective:" +msgstr "" +"Metodat e dhurimit përmes OpenCollective i takojnë fushës OpenCollective:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -1457,7 +1553,9 @@ msgstr "Licenca e përgjithshme e projektit." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "Po anashkalohet versionName i zbrazët te {apkfilename} prej tejtëdhënash: {version}" +msgstr "" +"Po anashkalohet versionName i zbrazët te {apkfilename} prej tejtëdhënash: " +"{version}" #: ../fdroidserver/import.py #, python-brace-format @@ -1475,10 +1573,12 @@ msgstr "Me emrin e përdoruesit lypset fjalëkalim" #: ../fdroidserver/import.py msgid "Path to main Android project subdirectory, if not in root." -msgstr "Shteg për te nëndrejtoria e projektit kryesor Android, në mos qoftë rrënja." +msgstr "" +"Shteg për te nëndrejtoria e projektit kryesor Android, në mos qoftë rrënja." msgid "Path to main android project subdirectory, if not in root." -msgstr "Shteg për te nëndrejtoria e projektit kryesor android, në mos qoftë rrënja." +msgstr "" +"Shteg për te nëndrejtoria e projektit kryesor android, në mos qoftë rrënja." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" @@ -1494,7 +1594,8 @@ msgstr "Shteg për te depo kyçesh për kyçin e nënshkrimit të depos" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" -msgstr "Shtype ndryshoren e fshehtë te terminali, për kopjim/ngjitje të kollajtë" +msgstr "" +"Shtype ndryshoren e fshehtë te terminali, për kopjim/ngjitje të kollajtë" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1572,8 +1673,12 @@ msgstr "Leximi i minSdkVersion dështoi: \"{apkfilename}\"" #. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/common.py #, python-brace-format -msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" -msgstr "Leximi i packageName/versionCode/versionName dështoi, APK e pavlefshme: '{apkfilename}'" +msgid "" +"Reading packageName/versionCode/versionName failed, APK invalid: " +"'{apkfilename}'" +msgstr "" +"Leximi i packageName/versionCode/versionName dështoi, APK e pavlefshme: " +"'{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format @@ -1581,8 +1686,13 @@ msgid "Reading {apkfilename} from cache" msgstr "Po lexohet {apkfilename} prej fshehtine" #: ../fdroidserver/stats.py -msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." -msgstr "Rinjehso statistika përmbledhëse - përdoreni kur janë bërë ndryshime të cilat mund të bënin të pavlefshme të dhëna të vjetra të ruajtura në fshehtinë." +msgid "" +"Recalculate aggregate stats - use when changes have been made that would " +"invalidate old cached data." +msgstr "" +"Rinjehso statistika përmbledhëse - përdoreni kur janë bërë ndryshime të " +"cilat mund të bënin të pavlefshme të dhëna të vjetra të ruajtura në " +"fshehtinë." #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1606,8 +1716,12 @@ msgid "Report on build data status" msgstr "Raport mbi gjendje të dhënash montimi" #: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Zeroje dhe krijo një shërbyes montimesh të ri fringo, edhe nëse ai ekzistuesi duket të jetë në rregull." +msgid "" +"Reset and create a brand new build server, even if the existing one appears " +"to be ok." +msgstr "" +"Zeroje dhe krijo një shërbyes montimesh të ri fringo, edhe nëse ai " +"ekzistuesi duket të jetë në rregull." #: ../fdroidserver/nightly.py #, python-brace-format @@ -1616,7 +1730,8 @@ msgstr "Po rinënshkruhet {apkfilename} me debug.keystore e furnizuar" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" -msgstr "Ripërmaso krejt ikonat që tejkalojnë madhësinë maksimum në piksel dhe dil" +msgstr "" +"Ripërmaso krejt ikonat që tejkalojnë madhësinë maksimum në piksel dhe dil" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" @@ -1697,7 +1812,9 @@ msgstr "Vëre sahatin në atë kohë duke përdorur:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "Caktoni numër maksimum hedhjesh në qarkullim, përpara se të arkivohen të vjetrat" +msgstr "" +"Caktoni numër maksimum hedhjesh në qarkullim, përpara se të arkivohen të " +"vjetrat" #: ../fdroidserver/build.py #, python-brace-format @@ -1765,7 +1882,9 @@ msgstr "Specifikoni një dosje vendore te e cila të njëkohësohet depoja" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Specify an identity file to provide to SSH for rsyncing" -msgstr "Specifikoni një kartelë identiteti për t’ia furnizuar SSH-s për njëkohësim me rsync-un" +msgstr "" +"Specifikoni një kartelë identiteti për t’ia furnizuar SSH-s për njëkohësim " +"me rsync-un" #: ../fdroidserver/build.py msgid "Specify that we're running on the build server" @@ -1797,7 +1916,8 @@ msgstr "Përmbledhja '%s' është thjesht emri i aplikacionit" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" -msgstr "Përmbledhja me gjatësi {length} është mbi kufirin prej {limit} shenjash" +msgstr "" +"Përmbledhja me gjatësi {length} është mbi kufirin prej {limit} shenjash" #: ../fdroidserver/common.py #, python-brace-format @@ -1805,7 +1925,9 @@ msgid "System clock is older than date in {path}!" msgstr "Ora e sistemit është më herët se sa data në {path}!" #: ../fdroidserver/checkupdates.py -msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgid "" +"Tags update mode only works for git, hg, bzr and git-svn repositories " +"currently" msgstr "" #: ../fdroidserver/checkupdates.py @@ -1813,8 +1935,12 @@ msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "" #: ../fdroidserver/build.py -msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." -msgstr "Mënyra testim - hidhe output-in vetëm te drejtoria tmp, dhe monto përherë, edhe nëse output-i ekziston tashmë." +msgid "" +"Test mode - put output in the tmp directory only, and always build, even if " +"the output already exists." +msgstr "" +"Mënyra testim - hidhe output-in vetëm te drejtoria tmp, dhe monto përherë, " +"edhe nëse output-i ekziston tashmë." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1832,7 +1958,8 @@ msgstr "Drejtoria ku të shkruhet pasqyra" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" -msgstr "Kartela që duhet përfshirë te depoja (shteg ose shenjë e gjithëpushtetshme)" +msgstr "" +"Kartela që duhet përfshirë te depoja (shteg ose shenjë e gjithëpushtetshme)" #: ../fdroidserver/deploy.py msgid "The only commands currently supported are 'init' and 'update'" @@ -1860,8 +1987,16 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Këto janë aplikacionet që janë arkivuar nga depoja kryesore." #: ../fdroidserver/common.py -msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "Kjo është një depo aplikacionesh për t’u përdorur me F-Droid. Aplikacionet në këtë depo ose janë dyorë zyrtarë të montuar nga zhvilluesit e aplikacionit rigjinal, ose janë dyorë të montuar nga burimi prej f-droid.org duke përdorur mjetet në https://gitlab.com/fdroid." +msgid "" +"This is a repository of apps to be used with F-Droid. Applications in this " +"repository are either official binaries built by the original application " +"developers, or are binaries built from source by the admin of f-droid.org " +"using the tools on https://gitlab.com/fdroid." +msgstr "" +"Kjo është një depo aplikacionesh për t’u përdorur me F-Droid. Aplikacionet " +"në këtë depo ose janë dyorë zyrtarë të montuar nga zhvilluesit e " +"aplikacionit rigjinal, ose janë dyorë të montuar nga burimi prej f-droid.org " +"duke përdorur mjetet në https://gitlab.com/fdroid." #: ../fdroidserver/import.py #, python-format @@ -1881,8 +2016,12 @@ msgid "" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Për të përdorur awsbucket, te config.yml duhen ujdisur edhe awssecretkey dhe awsaccesskey!" +msgid "" +"To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config." +"yml!" +msgstr "" +"Për të përdorur awsbucket, te config.yml duhen ujdisur edhe awssecretkey dhe " +"awsaccesskey!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1902,12 +2041,20 @@ msgid "URL {url} in Description: {error}" msgstr "URL {url} te Përshkrim: {error}" #: ../fdroidserver/lint.py -msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "Etiketë licence \"{}\" e papritur! Përdorni vetëm etiketa të miratuara nga FSF ose OSI, prej https://spdx.org/license-list" +msgid "" +"Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from " +"https://spdx.org/license-list" +msgstr "" +"Etiketë licence \"{}\" e papritur! Përdorni vetëm etiketa të miratuara nga " +"FSF ose OSI, prej https://spdx.org/license-list" #: ../fdroidserver/lint.py -msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "Etiketë e papritur licence \"{}\"! Përdorni vetëm etiketa licencash të formësuara te kartela e formësimit tuaj" +msgid "" +"Unexpected license tag \"{}\"! Only use license tags configured in your " +"config file" +msgstr "" +"Etiketë e papritur licence \"{}\"! Përdorni vetëm etiketa licencash të " +"formësuara te kartela e formësimit tuaj" #: ../fdroidserver/common.py #, python-brace-format @@ -1955,7 +2102,9 @@ msgstr "Version i panjohur i aapt-së, mund të sjellë probleme: " #: ../fdroidserver/lint.py msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "Lidhje e cila është hequr nga lidhje - përdorni [http://lidhja_që_na_intereson Lidhje titull] ose [http://lidhja_që_na_intereson]" +msgstr "" +"Lidhje e cila është hequr nga lidhje - përdorni [http://" +"lidhja_që_na_intereson Lidhje titull] ose [http://lidhja_që_na_intereson]" #: ../fdroidserver/lint.py msgid "Unnecessary leading space" @@ -2074,17 +2223,23 @@ msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData s’është URL e vlefshme: {url}" #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" -msgstr "UpdateCheckMode është ujdisur, por duket sikur checkupdates s’është xhiruar ende" +msgid "" +"UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" +msgstr "" +"UpdateCheckMode është ujdisur, por duket sikur checkupdates s’është xhiruar " +"ende" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID - it can be removed" -msgstr "Si UpdateCheckName është caktuar ID-ja e aplikacionit të njohur - s’mund të hiqet" +msgstr "" +"Si UpdateCheckName është caktuar ID-ja e aplikacionit të njohur - s’mund të " +"hiqet" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "Si UpdateCheckName është caktuar ID aplikacioni të njohur - s’mund të hiqet" +msgstr "" +"Si UpdateCheckName është caktuar ID aplikacioni të njohur - s’mund të hiqet" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2109,7 +2264,9 @@ msgstr "Përdorim: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Për të treguar një kartelë te dega parazgjedhje, përdorni /HEAD, në vend se /master" +msgstr "" +"Për të treguar një kartelë te dega parazgjedhje, përdorni /HEAD, në vend se /" +"master" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." @@ -2121,7 +2278,9 @@ msgstr "Përdor shërbyes montimesh" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" -msgstr "Për APK-ra të shtuara rishtazi, përdor datë prej APK-je, në vend se kohën e tanishme" +msgstr "" +"Për APK-ra të shtuara rishtazi, përdor datë prej APK-je, në vend se kohën e " +"tanishme" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -2137,8 +2296,11 @@ msgid "Using APK Signature v3" msgstr "Po përdoret Nënshkrimi APK-je v3" #: ../fdroidserver/common.py -msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" -msgstr "Po përdoret jarsigner Java, nuk rekomandohet për verifikim APK-sh! Përdorni apksigner" +msgid "" +"Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "" +"Po përdoret jarsigner Java, nuk rekomandohet për verifikim APK-sh! Përdorni " +"apksigner" #: ../fdroidserver/common.py #, python-brace-format @@ -2161,7 +2323,9 @@ msgstr "Urdhrat e vlefshëm janë:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." -msgstr "Verifikoje ndaj një kopjeje të ruajtur lokalisht në fshehtinë, në vend se ta rishkarkosh." +msgstr "" +"Verifikoje ndaj një kopjeje të ruajtur lokalisht në fshehtinë, në vend se ta " +"rishkarkosh." #: ../fdroid ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" @@ -2173,19 +2337,29 @@ msgstr "Po verifikohet nënshkrim treguesi:" #: ../fdroidserver/deploy.py #, python-brace-format -msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "Kyçi API VirusTotal s’mund të ngarkojë kartela më të mëdha se 2MB, përdorni {url} që të ngarkoni {path}." +msgid "" +"VirusTotal API key cannot upload files larger than 32MB, use {url} to upload " +"{path}." +msgstr "" +"Kyçi API VirusTotal s’mund të ngarkojë kartela më të mëdha se 2MB, përdorni " +"{url} që të ngarkoni {path}." #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Sinjalizo rreth gabimesh të mundshëm tejtëdhënash" #: ../fdroidserver/update.py -msgid "When configured for signed indexes, create only unsigned indexes at this stage" -msgstr "Kur është formësuar për tregues të nënshkruar, në këtë fazë krijo vetëm tregues të panënshkruar" +msgid "" +"When configured for signed indexes, create only unsigned indexes at this " +"stage" +msgstr "" +"Kur është formësuar për tregues të nënshkruar, në këtë fazë krijo vetëm " +"tregues të panënshkruar" #: ../fdroidserver/lint.py -msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgid "" +"When linting the entire repository yamllint is disabled by default. This " +"option forces yamllint regardless." msgstr "" msgid "X.509 'Distiguished Name' used when generating keys" @@ -2197,7 +2371,9 @@ msgstr "X.509 'Distinguished Name' i përdorur teksa prodhoheshin kyçe" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" -msgstr "Mund të përdorni ANDROID_HOME që të caktoni shtegun për te SDK-ja juaj, domethënë:" +msgstr "" +"Mund të përdorni ANDROID_HOME që të caktoni shtegun për te SDK-ja juaj, " +"domethënë:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" @@ -2430,7 +2606,9 @@ msgstr "bëji detyrimisht gabimet të jenë sinjalizime, ose shpërfilli" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." -msgstr "bëji gabimet e tejtëdhënave (parazgjedhje) të jenë sinjalizime, ose të shpërfillen." +msgstr "" +"bëji gabimet e tejtëdhënave (parazgjedhje) të jenë sinjalizime, ose të " +"shpërfillen." #: ../fdroidserver/common.py msgid "git svn clone failed" @@ -2448,7 +2626,9 @@ msgstr "u shpërfill argumenti eksplicit %r" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v1 duhet të ketë një nënshkrim, përdorni `fdroid signindex` për ta krijuar!" +msgstr "" +"index-v1 duhet të ketë një nënshkrim, përdorni `fdroid signindex` për ta " +"krijuar!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2476,8 +2656,12 @@ msgstr "vlerë e pavlefshme conflict_resolution: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format -msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" -msgstr "varg i pavlefshëm mundësie %(option)r: duhet të fillojë me një shenjë %(prefix_chars)r" +msgid "" +"invalid option string %(option)r: must start with a character " +"%(prefix_chars)r" +msgstr "" +"varg i pavlefshëm mundësie %(option)r: duhet të fillojë me një shenjë " +"%(prefix_chars)r" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -2486,8 +2670,11 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format -msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" -msgstr "local_copy_dir does s’mbaron me \"fdroid\", ndoshta kishit në mendje: \"{path}\"" +msgid "" +"local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "" +"local_copy_dir does s’mbaron me \"fdroid\", ndoshta kishit në mendje: " +"\"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" @@ -2550,7 +2737,9 @@ msgstr "prano vetëm vargje, lista dhe dyshe" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "mundësi %s: Nëse doni vërtet të instaloni krejt aplikacionet e nënshkruar, përdorni --all" +msgstr "" +"mundësi %s: Nëse doni vërtet të instaloni krejt aplikacionet e nënshkruar, " +"përdorni --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2622,13 +2811,21 @@ msgstr "" #: ../fdroidserver/signatures.py #, python-brace-format -msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "refuzo shkarkim përmes lidhjeje HTTP të pasigurt (përdorni HTTPS ose specifikoni --no-https-check): {apkfilename}" +msgid "" +"refuse downloading via insecure HTTP connection (use HTTPS or specify --no-" +"https-check): {apkfilename}" +msgstr "" +"refuzo shkarkim përmes lidhjeje HTTP të pasigurt (përdorni HTTPS ose " +"specifikoni --no-https-check): {apkfilename}" #: ../fdroidserver/signatures.py #, python-brace-format -msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" -msgstr "mos pranon shkarkim përmes lidhjeje http të pasigurt (përdorni https ose specifikoni --no-https-check): {apkfilename}" +msgid "" +"refuse downloading via insecure http connection (use https or specify --no-" +"https-check): {apkfilename}" +msgstr "" +"mos pranon shkarkim përmes lidhjeje http të pasigurt (përdorni https ose " +"specifikoni --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format @@ -2675,11 +2872,14 @@ msgstr "APK e nënshkruar, ose një shteg-kartele, ose URL HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "anashkalo sendërtim regjistrash të plotë montimesh: lëndë e regjistrit është e zbrazët" +msgstr "" +"anashkalo sendërtim regjistrash të plotë montimesh: lëndë e regjistrit është " +"e zbrazët" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" -msgstr "anashkalo krijim regjistrash të plotë montimi: e paaktivizuar te formësimi" +msgstr "" +"anashkalo krijim regjistrash të plotë montimi: e paaktivizuar te formësimi" #: ../fdroidserver/update.py #, python-brace-format @@ -2748,7 +2948,9 @@ msgstr "virustotal.com i kufizon shpejtësitë, po pritet për riprovim…" #: ../fdroidserver/update.py msgid "wiki support is deprecated and will be removed in the next release!" -msgstr "Mbulimi për wiki është nxjerrë nga përdorimi dhe do të hiqet në hedhjen e ardhshme në qarkullim!" +msgstr "" +"Mbulimi për wiki është nxjerrë nga përdorimi dhe do të hiqet në hedhjen e " +"ardhshme në qarkullim!" #: ../fdroidserver/publish.py #, python-brace-format @@ -2765,7 +2967,9 @@ msgstr "{apkfilename} ({appid}) s’ka tejtëdhëna!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} ka shumë kartela {name}, duket si rreng me Kyçin e Përgjithshëm!" +msgstr "" +"{apkfilename} ka shumë kartela {name}, duket si rreng me Kyçin e " +"Përgjithshëm!" #: ../fdroidserver/update.py #, python-brace-format @@ -2816,17 +3020,21 @@ msgstr "{appid}: extlib i panjohur {path} te montimi '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" -msgstr "{appid}: s’u specifikuan montime, po xhirohet me gjendjen e tanishme të burimit" +msgstr "" +"{appid}: s’u specifikuan montime, po xhirohet me gjendjen e tanishme të " +"burimit" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "{appid}: {field} duhet të jetë një '{type}', po është një '{fieldtype}!'" +msgstr "" +"{appid}: {field} duhet të jetë një '{type}', po është një '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" -msgstr "{appid}: {field} duhet të jetë një '{type}', por është një '{fieldtype}'!" +msgstr "" +"{appid}: {field} duhet të jetë një '{type}', por është një '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2851,7 +3059,8 @@ msgstr "{name} \"{path}\" s’ekziston! Ndreqeni te config.yml." #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "{name} \"{section}/icons/{path}\" s’ekziston! Kontrolloni \"config.yml\"." +msgstr "" +"{name} \"{section}/icons/{path}\" s’ekziston! Kontrolloni \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format @@ -2871,7 +3080,9 @@ msgstr "{path} s’ekziston! Krijojeni duke xhiruar:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "{path} ka \"{pattern}\" të gabuar nënshkrimi kartele, ka gjasa të jetë rreng Janus!" +msgstr "" +"{path} ka \"{pattern}\" të gabuar nënshkrimi kartele, ka gjasa të jetë rreng " +"Janus!" #: ../fdroidserver/update.py #, python-brace-format @@ -2909,3 +3120,42 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} doli me sukses" msgstr[1] "{} dolën me sukses" + +#~ msgid "Cannot find a packageName for {path}!" +#~ msgstr "S’gjendet dot një packageName për {path}!" + +#~ msgid "Cannot find an appid for {path}!" +#~ msgstr "S’gjendet dot një appid për {path}!" + +#~ msgid "Clean after all scans have finished" +#~ msgstr "Pastroje, pasi të kenë përfunduar krejt skanimet" + +#~ msgid "Clean before the scans start and rebuild the container" +#~ msgstr "" +#~ "Pastrojeni përpara se të fillojnë skanimet dhe të rimontohet kontejneri" + +#~ msgid "Clean up all containers and then exit" +#~ msgstr "Pastroji krejt kontejnerët dhe mandej dil" + +#~ msgid "Could not open APK file for analysis" +#~ msgstr "S’u hap dot kartela APK për analizim" + +#~ msgid "Override path for repo APKs (default: ./repo)" +#~ msgstr "Shteg anashkalimi për APK-ra depoje (parazgjedhje: ./repo)" + +#~ msgid "Prepare Drozer to run a scan" +#~ msgstr "Përgatite Drozer-in të bëjë një skanim" + +#~ msgid "Prepare drozer to run a scan" +#~ msgstr "Përgatite Drozer-in të kryejë një skanim" + +#~ msgid "Scan only the latest version of each package" +#~ msgstr "Skano vetëm versionin më të ri të çdo pakete" + +#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" +#~ msgstr "" +#~ "Ujdisni një emulues, instaloni në të APK-në dhe kryeni një skanim Drozer" + +#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" +#~ msgstr "" +#~ "Ujdisni një emulues, instaloni në të APK-në dhe kryeni një skanim Drozer" From 8b4aa4685cee0b63753328b565c9d5f7e7599457 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Thu, 17 Feb 2022 20:57:42 +0100 Subject: [PATCH 0572/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Turki?= =?UTF-8?q?sh=20(tr)=20by=20O=C4=9Fuz=20Ersen=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (612 of 612 strings) Co-authored-by: Oğuz Ersen Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/tr/ Translation: F-Droid/F-Droid Server --- locale/tr/LC_MESSAGES/fdroidserver.po | 116 +++++++++++++------------- 1 file changed, 57 insertions(+), 59 deletions(-) diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index 1dabbfc1..02b95810 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -1,21 +1,21 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. -# Oğuz Ersen , 2020, 2021. +# Oğuz Ersen , 2020, 2021, 2022. # Orhan , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2021-07-01 22:06+0000\n" -"Last-Translator: Orhan \n" +"PO-Revision-Date: 2022-02-15 22:36+0000\n" +"Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 4.11-dev\n" #: ../fdroidserver/common.py msgid "" @@ -64,9 +64,9 @@ msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" eşleşen üst veri dosyasına sahip değil!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "local_copy_dir \"{path}\" için kök dizini yok!" +msgstr "\"local_copy_dir\" {path} mevcut değil!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" @@ -103,9 +103,9 @@ msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" kabul edilebilir bir biçim değil, şuna dönüştürün: {formats}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "\"{path}\" var ancak s3cmd kurulu değil!" +msgstr "\"{path}\", izin verilmeyen bir anahtarla imzalandı:" #: ../fdroidserver/common.py #, python-brace-format @@ -330,9 +330,9 @@ msgid "Android SDK tool {cmd} found!" msgstr "Android SDK aracı {cmd} bulundu!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "Android SDK aracı {cmd} bulundu!" +msgstr "Android SDK aracı {cmd} bulunamadı!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -378,7 +378,7 @@ msgstr "Srclib '{srclib}' içine işleme için dal '{branch}' kullanıldı" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" -msgstr "Bozuk simgesel bağlantı: {path}" +msgstr "Bozuk sembolik bağlantı: {path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Build a package from source" @@ -412,7 +412,7 @@ msgstr "Depo \"%s\" tabanında bu yapılandırma ile inşa edildi:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "CurrentVersionCode olmadan uygulama otomatik olarak güncellenemiyor" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -528,9 +528,8 @@ msgid "Couldn't find Application ID" msgstr "Uygulama kimliği bulunamadı" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "Couldn't find any version information" -msgstr "Son sürüm adı bulunamadı" +msgstr "Herhangi bir sürüm bilgisi bulunamadı" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py @@ -690,7 +689,7 @@ msgstr "Bizde olmayan günlükleri indir" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "%s indiriliyor" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." @@ -813,9 +812,8 @@ msgid "Failed to get APK manifest information" msgstr "APK bildirim bilgileri alınamadı" #: ../fdroidserver/update.py -#, fuzzy msgid "Failed to get APK signing key fingerprint" -msgstr "APK bildirim bilgileri alınamadı" +msgstr "APK imzalama anahtarı parmak izi alınamadı" #: ../fdroidserver/install.py #, python-brace-format @@ -948,9 +946,8 @@ msgid "Git fetch failed" msgstr "Git fetch başarısız" #: ../fdroidserver/common.py -#, fuzzy msgid "Git prune failed" -msgstr "Git reset başarısız" +msgstr "Git prune başarısız" #: ../fdroidserver/common.py msgid "Git remote set-head failed" @@ -1027,14 +1024,14 @@ msgid "Include the source tarballs in the mirror" msgstr "Kaynak tar arşivlerini yansıya dahil et" #: ../fdroidserver/metadata.py -#, fuzzy, python-format +#, python-format msgid "Including metadata from %s@%s" -msgstr "%s:%d içinde geçersiz üst veri" +msgstr "%s@%s üst verileri dahil ediliyor" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Including metadata from {path}" -msgstr "Bilinmeyen üst veri biçimi: {path}" +msgstr "{path} üst verileri dahil ediliyor" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1079,12 +1076,12 @@ msgstr "Geçersiz APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "Geçersiz AutoUpdateMode: {mode}" #: ../fdroidserver/checkupdates.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "Geçersiz paket adı {0}" +msgstr "Geçersiz UpdateCheckMode: {mode}" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format @@ -1141,7 +1138,7 @@ msgstr "Yayımlanmış dosya için geçersiz ad: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "Geçersiz ndk: yapıdaki değer: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format @@ -1205,9 +1202,9 @@ msgid "Javascript in HTML src attributes" msgstr "HTML src özniteliklerinde javascript" #: ../fdroidserver/build.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "minSdkVersion okuma başarısız: \"{apkfilename}\"" +msgstr "Başarısız yapı \"{apkfilename}\" tutuluyor" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" @@ -1231,9 +1228,8 @@ msgid "List files that would be reformatted" msgstr "Yeniden biçimlendirilecek olan dosyaları listele" #: ../fdroidserver/rewritemeta.py -#, fuzzy msgid "List files that would be reformatted (dry run)" -msgstr "Yeniden biçimlendirilecek olan dosyaları listele" +msgstr "Yeniden biçimlendirilecek olan dosyaları listele (deneme çalışması)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" @@ -1269,9 +1265,9 @@ msgid "No 'config.yml' found, using defaults." msgstr "'config.yml' bulunamadı, öntanımlı değerler kullanılıyor." #: ../fdroidserver/verify.py -#, fuzzy, python-format +#, python-format msgid "No APK for package: %s" -msgstr "Böyle bir paket yok: %s" +msgstr "Paket için APK yok: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1311,14 +1307,13 @@ msgid "No information found." msgstr "Bilgi bulunamadı." #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No matching tags found" -msgstr "Bilgi bulunamadı." +msgstr "Eşleşen etiket bulunamadı" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "config.yml bulunamadı, öntanımlı değerler kullanılıyor." +msgstr "{0} içinde en düşük SDK sürümü bulunamadı, öntanımlı değer kullanılıyor (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1362,9 +1357,8 @@ msgid "No such versionCode {versionCode} for app {appid}" msgstr "Uygulama {appid} için böyle bir versionCode {versionCode} yok" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No tags found" -msgstr "Bağlı aygıt bulunamadı" +msgstr "Etiket bulunamadı" #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" @@ -1591,7 +1585,7 @@ msgstr "Belirtilen dosyalar kaldırılıyor" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "\"{path}\" kaldırılıyor" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -1599,7 +1593,7 @@ msgstr "paket.adı_123.apk örüntüsüyle eşleşmeyen tüm APK dosyalarını y #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "RepoTrunk güncelleme modu yalnızca git-svn depolarında anlamlıdır" #: ../fdroidserver/update.py msgid "Report on build data status" @@ -1682,14 +1676,13 @@ msgstr[0] "Tarayıcı {} sorun buldu" msgstr[1] "Tarayıcı {} sorun buldu" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with apkanalyzer for known non-free classes." -msgstr "Bilinen özgür olmayan sınıflar için ortaya çıkan APK'leri tara." +msgstr "Bilinen özgür olmayan sınıflar için apkanalyzer ile APK taranıyor." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "" +msgstr "NDK {release} ({version}) kuruldu" #: ../fdroidserver/common.py msgid "Set clock to that time using:" @@ -1737,7 +1730,7 @@ msgstr "Geçersiz imzalı '{apkfilename}' atlanıyor!" #: ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "Depo çok büyük olduğundan (>%.2fGB) GitLab Sayfaları yansısı atlanıyor!" #: ../fdroidserver/update.py #, python-brace-format @@ -1806,11 +1799,11 @@ msgstr "Sistem saati {path} konumundaki tarihten daha eski!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" +msgstr "Etiket güncelleme modu şu anda yalnızca git, hg, bzr ve git-svn depoları için çalışıyor" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" +msgstr "git-svn'de etiket güncelleme modu kullanıldı, ancak depo etiketlerle ayarlanmadı" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." @@ -1879,6 +1872,13 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" +"Kurulumu tamamlamak için APK'larınızı \"%s\" içine\n" +"ekleyin ve ardından \"fdroid update -c; fdroid update\" komutunu çalıştırın. URL'yi, depo\n" +"adını ve daha fazlasını ayarlamak için \"config.yml\" dosyasını da düzenlemek isteyebilirsiniz.\n" +"Ayrıca bir imzalama anahtarı da ayarlamalısınız (geçici bir anahtar otomatik olarak oluşturulmuş olabilir).\n" +"\n" +"Daha fazla bilgi için: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"ve https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -1912,7 +1912,7 @@ msgstr "Beklenmeyen lisans etiketi \"{}\"! Yalnızca yapılandırma dosyanızda #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" +msgstr "Beklenmeyen sembolik bağlantı hedefi: {link} -> {target}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2040,7 +2040,7 @@ msgstr "Kullanılmayan scanignore yolu: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "%s konumuna çıkarılıyor" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -2226,9 +2226,8 @@ msgid "ambiguous option: %s (%s?)" msgstr "belirsiz şeçenek: %s (%s?)" #: ../fdroidserver/common.py -#, fuzzy msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "apksigner bulunamadı, imzalamak için gereklidir!" +msgstr "apksigner bulunamadı! Modern APK'lar imzalanamıyor veya doğrulanamıyor" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2356,7 +2355,7 @@ msgstr "{path} oluşturuldu" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "şu anki sürüm daha yeni: eski sürüm kodu={old}, yeni sürüm kodu={new}" #: ../fdroidserver/update.py #, python-brace-format @@ -2482,7 +2481,7 @@ msgstr "geçersiz seçenek satırı %(option)r: %(prefix_chars)r karakteri ile b #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "en son yapı tarifi daha yeni: eski sürüm kodu={old}, yeni sürüm kodu={new}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2527,9 +2526,8 @@ msgid "no version info found!" msgstr "Sürüm bilgisi bulunamadı!" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "no version information found" -msgstr "Sürüm bilgisi bulunamadı!" +msgstr "sürüm bilgisi bulunamadı" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2652,7 +2650,7 @@ msgstr "s3cmd sync {path} konumunu {url} adresine indeksler ve siler" #: ../fdroidserver/scanner.py #, python-format msgid "scanner not cleanly run apkanalyzer: %s" -msgstr "" +msgstr "apkanalyzer, tarayıcı tarafından temiz bir şekilde çalıştırılmadı: %s" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2800,7 +2798,7 @@ msgstr "{path}'den {appid} geçerli bir Java Paket Adı değil!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid} hem APK hem de dosyalara sahip: {files}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2884,9 +2882,9 @@ msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} 200MB'den fazla, elle yükleyin: {url}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path}: {error}" -msgstr "{path} kopyalanamadı: {error}" +msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format From a1c56b6686c23179a3dadf708ef22becf5df1b93 Mon Sep 17 00:00:00 2001 From: marzzzello Date: Thu, 17 Feb 2022 20:57:43 +0100 Subject: [PATCH 0573/2116] Translated using Weblate: German (de) by marzzzello Currently translated at 97.3% (596 of 612 strings) Translated using Weblate: German (de) by marzzzello Currently translated at 95.7% (586 of 612 strings) Translated using Weblate: German (de) by marzzzello Currently translated at 95.2% (583 of 612 strings) Co-authored-by: marzzzello Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 578 ++++++++++++++++++-------- 1 file changed, 404 insertions(+), 174 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index ac277ada..b496091f 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -3,7 +3,7 @@ # Oliver , 2020. # Fynn Godau , 2020. # melusine , 2020. -# marzzzello , 2020. +# marzzzello , 2020, 2022. # Hans-Christoph Steiner , 2020, 2021. # Predatorix Phoenix , 2021. # cheese1 , 2021. @@ -23,22 +23,26 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2021-06-21 18:34+0000\n" -"Last-Translator: VfBFan \n" -"Language-Team: German \n" +"PO-Revision-Date: 2022-02-16 18:56+0000\n" +"Last-Translator: marzzzello \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7\n" +"X-Generator: Weblate 4.11-dev\n" #: ../fdroidserver/common.py msgid "" "\n" -" This is a repository of apps to be used with FDroid. Applications in this\n" -" repository are either official binaries built by the original application\n" -" developers, or are binaries built from source by f-droid.org using the\n" +" This is a repository of apps to be used with FDroid. Applications in " +"this\n" +" repository are either official binaries built by the original " +"application\n" +" developers, or are binaries built from source by f-droid.org using " +"the\n" " tools on https://gitlab.com/fdroid.\n" " " msgstr "" @@ -56,7 +60,8 @@ msgid "" "SSH Public Key to be used as Deploy Key:" msgstr "" "\n" -"Öffentlicher SSH-Schlüssel, der als Bereitstellungsschlüssel verwendet werden soll:" +"Öffentlicher SSH-Schlüssel, der als Bereitstellungsschlüssel verwendet " +"werden soll:" #: ../fdroidserver/nightly.py msgid "" @@ -64,7 +69,8 @@ msgid "" "SSH public key to be used as deploy key:" msgstr "" "\n" -"Öffentlicher SSH-Schlüssel, der als Bereitstellungsschlüssel verwendet werden soll:" +"Öffentlicher SSH-Schlüssel, der als Bereitstellungsschlüssel verwendet " +"werden soll:" #: ../fdroidserver/nightly.py #, python-brace-format @@ -81,13 +87,15 @@ msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" besitzt keine zugehörige Metadaten-Datei!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "Das Wurzelverzeichnis für local_copy_dir \"{path}\" existiert nicht!" +msgstr "\"local_copy_dir\" {path}\" existiert nicht!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "\"repo_pubkey\" muss in config.yml vorhanden sein, wenn --nosign verwendet wird!" +msgstr "" +"\"repo_pubkey\" muss in config.yml vorhanden sein, wenn --nosign verwendet " +"wird!" #: ../fdroidserver/install.py #, python-brace-format @@ -112,7 +120,9 @@ msgstr "„{path}” vorhanden, aber S3cmd ist nicht installiert!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "\"{path}\" ist ein nicht unterstütztes Dateiformat (Verwendung: metadata/*.yml)" +msgstr "" +"\"{path}\" ist ein nicht unterstütztes Dateiformat (Verwendung: metadata/*." +"yml)" #: ../fdroidserver/metadata.py #, python-brace-format @@ -120,9 +130,9 @@ msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" ist kein akzeptiertes Format, umwandeln in: {formats}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "„{path}” vorhanden, aber S3cmd ist nicht installiert!" +msgstr "\"{path}” ist mit einem nicht zulässigen Schlüssel signiert:" #: ../fdroidserver/common.py #, python-brace-format @@ -219,7 +229,8 @@ msgstr "'{aapt}' ist zu alt, fdroid benötigt build-tools-23.0.0 oder neuer!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" -msgstr "„{aapt}” ist veraltet, fdroid benötigt build-tools-{version} oder neuer!" +msgstr "" +"„{aapt}” ist veraltet, fdroid benötigt build-tools-{version} oder neuer!" #: ../fdroidserver/install.py #, python-brace-format @@ -229,12 +240,18 @@ msgstr "'{apkfilename}' ist auf {dev} bereits installiert." #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{field}' in {linedesc} is obsolete, see docs for current fields:" -msgstr "'{field}' in {linedesc} ist veraltet, siehe Dokumentation für aktuelle Felder:" +msgstr "" +"'{field}' in {linedesc} ist veraltet, siehe Dokumentation für aktuelle " +"Felder:" #: ../fdroidserver/common.py #, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "Das Feld „{field}” wird in zufälliger Reihenfolge angezeigt! Verwenden Sie runde ( ) oder eckige [ ] Klammern, wenn die Reihenfolge wichtig ist!" +msgid "" +"'{field}' will be in random order! Use () or [] brackets if order is " +"important!" +msgstr "" +"Das Feld „{field}” wird in zufälliger Reihenfolge angezeigt! Verwenden Sie " +"runde ( ) oder eckige [ ] Klammern, wenn die Reihenfolge wichtig ist!" #: ../fdroidserver/common.py #, python-brace-format @@ -244,7 +261,8 @@ msgstr "„{path}” konnte nicht ausgeführt werden!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" -msgstr "„{value}” ist kein gültiges {field} in {appid}. Regex-Muster: {pattern}" +msgstr "" +"„{value}” ist kein gültiges {field} in {appid}. Regex-Muster: {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -258,7 +276,9 @@ msgstr ".__call__() nicht festgelegt" #: ../fdroidserver/metadata.py msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." -msgstr ".fdroid.txt wird nicht unterstützt! Konvertieren Sie in .fdroid.yml oder .fdroid.json." +msgstr "" +".fdroid.txt wird nicht unterstützt! Konvertieren Sie in .fdroid.yml oder ." +"fdroid.json." #: ../fdroidserver/lint.py msgid "/issues is missing" @@ -278,7 +298,8 @@ msgstr "Eine neue Anwendung aus ihrem Quellcode hinzufügen" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" -msgstr "Füge einen Repository-Signierschlüssel zu einem unsignierten Repository hinzu" +msgstr "" +"Füge einen Repository-Signierschlüssel zu einem unsignierten Repository hinzu" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" @@ -294,8 +315,12 @@ msgid "Alias of the repo signing key in the keystore" msgstr "Pseudonym des Repository-Signierchlüssels im Schlüsselspeicher" #: ../fdroidserver/import.py -msgid "Allows a different revision (or git branch) to be specified for the initial import" -msgstr "Ermöglicht die Bestimmung unterschiedlicher Überarbeitungen (oder Git-Zweige) für den Erstimport" +msgid "" +"Allows a different revision (or git branch) to be specified for the initial " +"import" +msgstr "" +"Ermöglicht die Bestimmung unterschiedlicher Überarbeitungen (oder Git-" +"Zweige) für den Erstimport" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" @@ -347,7 +372,7 @@ msgid "Android SDK tool {cmd} found!" msgstr "Android-SDK-Tool {cmd} nicht gefunden!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} not found!" msgstr "Android-SDK-Tool {cmd} nicht gefunden!" @@ -378,14 +403,19 @@ msgid "Archiving {apkfilename} with invalid signature!" msgstr "Archivierung von {apkfilename} mit ungültiger Signatur!" #: ../fdroidserver/mirror.py -msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" -msgstr "Basis-URL zum Spiegeln, kann den Index-Signierungsschlüssel mit Hilfe des Abfrage-Strings enthalten: ?fingerprint=" +msgid "" +"Base URL to mirror, can include the index signing key using the query " +"string: ?fingerprint=" +msgstr "" +"Basis-URL zum Spiegeln, kann den Index-Signierungsschlüssel mit Hilfe des " +"Abfrage-Strings enthalten: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "Zweig „{branch}”, der als Bestätigung im Build verwendet wird „{versionName}”" +msgstr "" +"Zweig „{branch}”, der als Bestätigung im Build verwendet wird „{versionName}”" #: ../fdroidserver/lint.py #, python-brace-format @@ -407,7 +437,9 @@ msgstr "Alle verfügbaren Anwendungen erstellen" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" -msgstr "Build durch „fdroid import” erstellt - Entfernen Sie die Zeile „Deaktiviert”, sobald sie fertig ist" +msgstr "" +"Build durch „fdroid import” erstellt - Entfernen Sie die Zeile " +"„Deaktiviert”, sobald sie fertig ist" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" @@ -419,8 +451,12 @@ msgstr "Nur die neueste Version jedes Programmpakets erstellen" #: ../fdroidserver/metadata.py #, python-brace-format -msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" -msgstr "Build sollte kommagetrennte versionName und versionCode enthalten, nicht „{value}”, in {linedesc}" +msgid "" +"Build should have comma-separated versionName and versionCode, not " +"\"{value}\", in {linedesc}" +msgstr "" +"Build sollte kommagetrennte versionName und versionCode enthalten, nicht " +"„{value}”, in {linedesc}" #: ../fdroidserver/init.py #, python-format @@ -434,8 +470,10 @@ msgstr "" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" -msgstr[0] "Kann nicht erstellt werden, da {} Fehler beim Prüfen aufgetreten ist" -msgstr[1] "Kann nicht erstellt werden, da {} Fehler beim Prüfen aufgetreten sind" +msgstr[0] "" +"Kann nicht erstellt werden, da {} Fehler beim Prüfen aufgetreten ist" +msgstr[1] "" +"Kann nicht erstellt werden, da {} Fehler beim Prüfen aufgetreten sind" #: ../fdroidserver/vmtools.py #, python-brace-format @@ -460,7 +498,9 @@ msgstr "--list und --to können nicht gleichzeitig verwendet werden" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" -msgstr "„{path}” konnte nicht geschrieben werden, kein akzeptiertes Format, verwenden Sie: {formats}" +msgstr "" +"„{path}” konnte nicht geschrieben werden, kein akzeptiertes Format, " +"verwenden Sie: {formats}" #: ../fdroidserver/lint.py #, python-format @@ -477,17 +517,27 @@ msgstr "Auf Aktualisierungen für Anwendungen prüfen" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Archivierung auf {appid} überprüfen - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "" +"Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, " +"archapks:{arch}" +msgstr "" +"Archivierung auf {appid} überprüfen - APKs:{integer}, keepversions:{keep}, " +"archapks:{arch}" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Archivierung auf {appid} überprüfen - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "" +"Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, " +"archapks:{arch}" +msgstr "" +"Archivierung auf {appid} überprüfen - apks:{integer}, keepversions:{keep}, " +"archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" -msgstr "Sauber aktualisieren - ohne Verwendung der Zwischenspeicher, alle APKs wiederaufbereiten" +msgstr "" +"Sauber aktualisieren - ohne Verwendung der Zwischenspeicher, alle APKs " +"wiederaufbereiten" #: ../fdroidserver/import.py msgid "Comma separated list of categories." @@ -503,13 +553,18 @@ msgid "Commit changes" msgstr "Änderungen übergeben" #: ../fdroidserver/__main__.py -msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." -msgstr "Widersprüchliche Argumente: '--verbose' und '--quiet' können nicht gleichzeitig angegeben werden." +msgid "" +"Conflicting arguments: '--verbose' and '--quiet' can not be specified at the " +"same time." +msgstr "" +"Widersprüchliche Argumente: '--verbose' und '--quiet' können nicht " +"gleichzeitig angegeben werden." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Konflikt in der Konfiguration. Verwende {newfile}, ignoriere {oldfile}!" +msgstr "" +"Konflikt in der Konfiguration. Verwende {newfile}, ignoriere {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format @@ -545,9 +600,8 @@ msgid "Couldn't find Application ID" msgstr "Konnte Anwendungs-ID nicht finden" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "Couldn't find any version information" -msgstr "Neuester Versionsname konnte nicht gefunden werden" +msgstr "Versionsinformationen konnten nicht gefunden werden" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py @@ -565,7 +619,9 @@ msgstr "Konnte Paket-ID nicht finden" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" -msgstr "Es ist ungehörig, bestehende Signaturschlüssel-Einstellungen zu überschreiben!" +msgstr "" +"Es ist ungehörig, bestehende Signaturschlüssel-Einstellungen zu " +"überschreiben!" #: ../fdroidserver/update.py msgid "Create a repo signing key in a keystore" @@ -614,7 +670,9 @@ msgstr "Unsignierter Index zur Vorbereitung der Signierung wird erstellt" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "CurrentVersionCode {cv} ist kleiner als der älteste Build-Eintrag {versionCode}" +msgstr "" +"CurrentVersionCode {cv} ist kleiner als der älteste Build-Eintrag " +"{versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" @@ -632,7 +690,8 @@ msgstr "Lösche Archiv, Repository ist zu groß ({size} max {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "Git-Mirror-Verlauf löschen, Repository ist zu groß ({size} max {limit})" +msgstr "" +"Git-Mirror-Verlauf löschen, Repository ist zu groß ({size} max {limit})" #: ../fdroidserver/update.py #, python-brace-format @@ -651,12 +710,15 @@ msgstr "Beschreibung enthält eine doppelte Zeile" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "Beschreibung enthält eine Liste (%s), ist aber weder aufgezählt (*) noch nummeriert (#)" +msgstr "" +"Beschreibung enthält eine Liste (%s), ist aber weder aufgezählt (*) noch " +"nummeriert (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" -msgstr "Länge der Beschreibung {length} übersteigt die zulässige Zeichenzahl {limit}" +msgstr "" +"Länge der Beschreibung {length} übersteigt die zulässige Zeichenzahl {limit}" #: ../fdroidserver/import.py msgid "Do not add 'disable:' to the generated build entries" @@ -677,7 +739,8 @@ msgstr "Android-SDK-Pfad nicht abfragen, einfach überspringen" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" -msgstr "Entfernen Sie die vom Schlüsselspeicher erzeugten privaten Schlüssel nicht" +msgstr "" +"Entfernen Sie die vom Schlüsselspeicher erzeugten privaten Schlüssel nicht" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" @@ -688,8 +751,12 @@ msgid "Don't do anything logs-related" msgstr "Mache auf Logs bezogen nichts" #: ../fdroidserver/build.py -msgid "Don't refresh the repository, useful when testing a build with no internet connection" -msgstr "Keine Aktualisierung des Repositorys. Nützlich, wenn ein Build ohne Internetverbindung getestet wird" +msgid "" +"Don't refresh the repository, useful when testing a build with no internet " +"connection" +msgstr "" +"Keine Aktualisierung des Repositorys. Nützlich, wenn ein Build ohne " +"Internetverbindung getestet wird" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py #: ../fdroidserver/upload.py @@ -707,11 +774,13 @@ msgstr "Herunterladung von Logs welche wir nicht haben" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "Herunterladen %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." -msgstr "Herunterladen des Repositorys bereits einmal fehlgeschlagen, versuche es nicht nochmal." +msgstr "" +"Herunterladen des Repositorys bereits einmal fehlgeschlagen, versuche es " +"nicht nochmal." #: ../fdroidserver/verify.py #, python-brace-format @@ -720,8 +789,10 @@ msgstr "Herunterladen von {url} fehlgeschlagen. {error}" #: ../fdroidserver/metadata.py #, python-brace-format -msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" -msgstr "Doppelte Build-Rezeptur für versionCode {versionCode} in {linedesc} gefunden" +msgid "" +"Duplicate build recipe found for versionCode {versionCode} in {linedesc}" +msgstr "" +"Doppelte Build-Rezeptur für versionCode {versionCode} in {linedesc} gefunden" #: ../fdroidserver/lint.py #, python-brace-format @@ -734,14 +805,16 @@ msgstr "APKs nach Erstellung dynamisch durchsuchen" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "FEHLER: Der \"server\"-Unterbefehl wurde entfernt, verwende \"deploy\"!" +msgstr "" +"FEHLER: Der \"server\"-Unterbefehl wurde entfernt, verwende \"deploy\"!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" -"FEHLER: Dieser Befehl sollte niemals verwendet werden, um f-droid.org zu spiegeln!\n" +"FEHLER: Dieser Befehl sollte niemals verwendet werden, um f-droid.org zu " +"spiegeln!\n" "Ein vollständiger Spiegel von f-droid.org erfordert mehr als 200 GB." #: ../fdroidserver/nightly.py @@ -755,8 +828,12 @@ msgstr "Build-Flag bei {linedesc} leeren" #: ../fdroidserver/__main__.py #, python-brace-format -msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "Die Kodierung ist auf '{enc}' gesetzt. Dies könnte zu Kodierungsproblemen führen. Bitte setze sie auf ''UTF-8'' für beste Ergebnisse." +msgid "" +"Encoding is set to '{enc}' fdroid might run into encoding issues. Please set " +"it to 'UTF-8' for best results." +msgstr "" +"Die Kodierung ist auf '{enc}' gesetzt. Dies könnte zu Kodierungsproblemen " +"führen. Bitte setze sie auf ''UTF-8'' für beste Ergebnisse." #: ../fdroidserver/init.py #, python-format @@ -830,9 +907,8 @@ msgid "Failed to get APK manifest information" msgstr "Abrufen der APK-Manifest-Informationen fehlgeschlagen" #: ../fdroidserver/update.py -#, fuzzy msgid "Failed to get APK signing key fingerprint" -msgstr "Abrufen der APK-Manifest-Informationen fehlgeschlagen" +msgstr "Abrufen des APK-Signierschlüssel-Fingerabdrucks fehlgeschlagen" #: ../fdroidserver/install.py #, python-brace-format @@ -882,8 +958,12 @@ msgid "Forbidden HTML tags" msgstr "Verbotene HTML-Befehle" #: ../fdroidserver/build.py -msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." -msgstr "Erstellung deaktivierter Apps erzwingen und ungeachtet von Scan-Problemen ausüben. Nur im Testmodus erlaubt." +msgid "" +"Force build of disabled apps, and carries on regardless of scan problems. " +"Only allowed in test mode." +msgstr "" +"Erstellung deaktivierter Apps erzwingen und ungeachtet von Scan-Problemen " +"ausüben. Nur im Testmodus erlaubt." #: ../fdroidserver/build.py #, python-brace-format @@ -965,9 +1045,8 @@ msgid "Git fetch failed" msgstr "Git fetch fehlgeschlagen" #: ../fdroidserver/common.py -#, fuzzy msgid "Git prune failed" -msgstr "Git reset fehlgeschlagen" +msgstr "Git prune fehlgeschlagen" #: ../fdroidserver/common.py msgid "Git remote set-head failed" @@ -996,17 +1075,21 @@ msgstr "HTTPS muss bei Subversion-URLs verwendet werden!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "Wenn ein Git-Mirror zu groß wird, erlaube dem Archiv gelöscht zu werden" +msgstr "" +"Wenn ein Git-Mirror zu groß wird, erlaube dem Archiv gelöscht zu werden" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "Wenn das Hochladen fehlschlägt, versuchen Sie es händisch auf {url} hochzuladen" +msgstr "" +"Wenn das Hochladen fehlschlägt, versuchen Sie es händisch auf {url} " +"hochzuladen" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "'{field}' in '{metapath}' Metadaten wird ignoriert, da es veraltet ist." +msgstr "" +"'{field}' in '{metapath}' Metadaten wird ignoriert, da es veraltet ist." #: ../fdroidserver/update.py #, python-format @@ -1029,7 +1112,8 @@ msgstr "Ignoriere die Datei {ext} bei '{path}'" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "APKs einschließen, die mit deaktivierten Algorithmen wie MD5 signiert sind" +msgstr "" +"APKs einschließen, die mit deaktivierten Algorithmen wie MD5 signiert sind" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" @@ -1044,14 +1128,14 @@ msgid "Include the source tarballs in the mirror" msgstr "Einbinden der Quellen-Tarballs in den Spiegelserver" #: ../fdroidserver/metadata.py -#, fuzzy, python-format +#, python-format msgid "Including metadata from %s@%s" -msgstr "Ungültige Metadaten in %s:%d" +msgstr "Einschließlich der Metadaten von %s@%s" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Including metadata from {path}" -msgstr "Unbekanntes Metadaten-Format: {path}" +msgstr "Einschließlich der Metadaten von {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1134,12 +1218,17 @@ msgstr "Ungültige Aufzählung" #: ../fdroidserver/lint.py #, python-format -msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" -msgstr "Ungültiges Lizenz-Tag \"%s\"! Verwenden Sie nur Tags von https://spdx.org/license-list" +msgid "" +"Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" +msgstr "" +"Ungültiges Lizenz-Tag \"%s\"! Verwenden Sie nur Tags von https://spdx.org/" +"license-list" #: ../fdroidserver/lint.py msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "Ungültiger Link - verwenden Sie [http://foo.bar Linktitel] oder [http://foo.bar]" +msgstr "" +"Ungültiger Link - verwenden Sie [http://foo.bar Linktitel] oder [http://foo." +"bar]" #: ../fdroidserver/metadata.py #, python-format @@ -1207,24 +1296,29 @@ msgstr "Java JAR-Datei" #: ../fdroidserver/publish.py ../fdroidserver/update.py #: ../fdroidserver/mirror.py msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "Java JDK nicht gefunden! Installieren Sie es in einem Standardordner oder setzen Sie java_paths!" +msgstr "" +"Java JDK nicht gefunden! Installieren Sie es in einem Standardordner oder " +"setzen Sie java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Java-kompilierte Klasse" #: ../fdroidserver/signindex.py -msgid "Java jarsigner not found! Install in standard location or set java_paths!" -msgstr "Java jarsigner nicht gefunden! Installieren Sie es in einem Standardordner oder setzen Sie java_paths!" +msgid "" +"Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "" +"Java jarsigner nicht gefunden! Installieren Sie es in einem Standardordner " +"oder setzen Sie java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" msgstr "Javascript in HTML src-Attributen" #: ../fdroidserver/build.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "Lesen von minSdkVersion fehlgeschlagen: \"{apkfilename}\"" +msgstr "Fehlgeschlagener Build \"{apkfilename}\" behalten" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" @@ -1232,8 +1326,11 @@ msgstr "Schlüsselspeicher für den Signierschlüssel:\t" #: ../fdroidserver/lint.py #, python-brace-format -msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "Der zuletzt verwendete Commit '{commit}' sieht aus wie ein Tag, aber der Aktualisierung-Überprüfungs-Modus ist '{ucm}'" +msgid "" +"Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" +"Der zuletzt verwendete Commit '{commit}' sieht aus wie ein Tag, aber der " +"Aktualisierung-Überprüfungs-Modus ist '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" @@ -1270,7 +1367,9 @@ msgstr "Fehlerhafte serverwebroot Zeile:" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." -msgstr "Spiegeln Sie die komplette Paketquelle und das Archiv, inklusive aller Dateitypen." +msgstr "" +"Spiegeln Sie die komplette Paketquelle und das Archiv, inklusive aller " +"Dateitypen." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" @@ -1286,9 +1385,9 @@ msgid "No 'config.yml' found, using defaults." msgstr "Keine 'config.yml' gefunden, nutze Standardeinstellungen." #: ../fdroidserver/verify.py -#, fuzzy, python-format +#, python-format msgid "No APK for package: %s" -msgstr "Kein solches Paket: %s" +msgstr "Keine APK für das Paket: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1296,7 +1395,8 @@ msgstr "Keine Android SDK gefunden!" #: ../fdroidserver/import.py msgid "No android or kivy project could be found. Specify --subdir?" -msgstr "Es konnte kein Android- oder Kivy-Projekt gefunden werden. --subdir angeben?" +msgstr "" +"Es konnte kein Android- oder Kivy-Projekt gefunden werden. --subdir angeben?" #: ../fdroidserver/install.py msgid "No attached devices found" @@ -1333,9 +1433,9 @@ msgid "No matching tags found" msgstr "Keine Informationen gefunden." #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "Keine config.yml gefunden, nutze Standardeinstellungen." +msgstr "Keine Mindest-SDK-Version in {0} gefunden, Standard (3) verwendet." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1347,7 +1447,9 @@ msgstr "Sie müssen nicht angeben, dass die App für Android ist" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" -msgstr "Keine Option gesetzt! Bearbeiten Sie Ihre config.yml, um mindestens eine davon zu setzen:" +msgstr "" +"Keine Option gesetzt! Bearbeiten Sie Ihre config.yml, um mindestens eine " +"davon zu setzen:" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1420,7 +1522,8 @@ msgstr "Der OBB-Packetname stimmt mit keinem unterstützten APK überein:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "Maschine offline, überspringe git-Spiegelgeneration bis `fdroid deploy`" +msgstr "" +"Maschine offline, überspringe git-Spiegelgeneration bis `fdroid deploy`" #: ../fdroidserver/common.py #, python-brace-format @@ -1434,7 +1537,8 @@ msgstr "Veralteter Name für fdroid deploy" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" -msgstr "Nur PNG und JPEG werden für Grafiken unterstützt, gefunden wurde: {path}" +msgstr "" +"Nur PNG und JPEG werden für Grafiken unterstützt, gefunden wurde: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" @@ -1474,7 +1578,9 @@ msgstr "Gesamt-Lizenz des Projekts." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "Überschreiben von leeren Versionsnamen in {apkfilename} aus Metadaten: {version}" +msgstr "" +"Überschreiben von leeren Versionsnamen in {apkfilename} aus Metadaten: " +"{version}" #: ../fdroidserver/import.py #, python-brace-format @@ -1492,14 +1598,20 @@ msgstr "Passwort mit Benutzername benötigt" #: ../fdroidserver/import.py msgid "Path to main Android project subdirectory, if not in root." -msgstr "Pfad zum Unterverzeichnis des Android-Hauptprojekts, wenn es nicht im Stammverzeichnis ist." +msgstr "" +"Pfad zum Unterverzeichnis des Android-Hauptprojekts, wenn es nicht im " +"Stammverzeichnis ist." msgid "Path to main android project subdirectory, if not in root." -msgstr "Pfad zum zentralen Androidprojekt-Unterverzeichnis, wenn es nicht im Stammverzeichnis ist." +msgstr "" +"Pfad zum zentralen Androidprojekt-Unterverzeichnis, wenn es nicht im " +"Stammverzeichnis ist." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" -msgstr "Pfad zum Android-SDK (Softwareentwicklungsbaukasten) (mitunter in ANDROID_HOME festgelegt)" +msgstr "" +"Pfad zum Android-SDK (Softwareentwicklungsbaukasten) (mitunter in " +"ANDROID_HOME festgelegt)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" @@ -1511,7 +1623,8 @@ msgstr "Pfad zum Schlüsselspeicher für den Repository-Signierschlüssel" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" -msgstr "Drucken der geheimen Variable in das Terminal zum einfachen Kopieren/Einfügen" +msgstr "" +"Drucken der geheimen Variable in das Terminal zum einfachen Kopieren/Einfügen" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1589,8 +1702,12 @@ msgstr "Lesen von minSdkVersion fehlgeschlagen: \"{apkfilename}\"" #. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/common.py #, python-brace-format -msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" -msgstr "Lesen von packageName/versionCode/versionName fehlgeschlagen, APK ungültig: '{apkfilename}'" +msgid "" +"Reading packageName/versionCode/versionName failed, APK invalid: " +"'{apkfilename}'" +msgstr "" +"Lesen von packageName/versionCode/versionName fehlgeschlagen, APK ungültig: " +"'{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format @@ -1598,8 +1715,12 @@ msgid "Reading {apkfilename} from cache" msgstr "Lese {apkfilename} aus dem Cache" #: ../fdroidserver/stats.py -msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." -msgstr "Sammelstatistik neu berechnen - nach Änderungen anwenden, die alte zwischengespeicherte Daten entwerten würden." +msgid "" +"Recalculate aggregate stats - use when changes have been made that would " +"invalidate old cached data." +msgstr "" +"Sammelstatistik neu berechnen - nach Änderungen anwenden, die alte " +"zwischengespeicherte Daten entwerten würden." #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1608,11 +1729,13 @@ msgstr "Entferne angegebene Dateien" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "Entferne {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" -msgstr "APK-Dateien umbenennen, die nicht dem Muster „package.name_123.apk“ entsprechen" +msgstr "" +"APK-Dateien umbenennen, die nicht dem Muster „package.name_123.apk“ " +"entsprechen" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" @@ -1623,8 +1746,12 @@ msgid "Report on build data status" msgstr "Bericht zum Build-Datenstatus" #: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Zurücksetzen und ganz neuen Build-Server einrichten, auch wenn der bestehende in Ordnung zu sein scheint." +msgid "" +"Reset and create a brand new build server, even if the existing one appears " +"to be ok." +msgstr "" +"Zurücksetzen und ganz neuen Build-Server einrichten, auch wenn der " +"bestehende in Ordnung zu sein scheint." #: ../fdroidserver/nightly.py #, python-brace-format @@ -1633,7 +1760,9 @@ msgstr "{apkfilename} erneut mit dem mitgelieferten debug.keystore signieren" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" -msgstr "Größe aller Symbole ändern, welche die maximale Pixelgröße überschreiten, und beenden" +msgstr "" +"Größe aller Symbole ändern, welche die maximale Pixelgröße überschreiten, " +"und beenden" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" @@ -1699,9 +1828,8 @@ msgstr[0] "Scanner fand {count} Problem" msgstr[1] "Scanner fand {count} Probleme" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with apkanalyzer for known non-free classes." -msgstr "Scannen Sie die entstandene(n) APK(s) nach bekannten non-free-Klassen." +msgstr "APK mit apkanalyzer nach bekannten nicht-quelloffenen Klassen scannen." #: ../fdroidserver/common.py #, python-brace-format @@ -1714,7 +1842,8 @@ msgstr "Einstellen der Uhr auf diese Zeit mit:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "Setze maximale Veröffentlichungen im Repo bevor ältere archiviert werden" +msgstr "" +"Setze maximale Veröffentlichungen im Repo bevor ältere archiviert werden" #: ../fdroidserver/build.py #, python-brace-format @@ -1744,7 +1873,9 @@ msgstr "Erstellte Indizes durch Verwendung von „update --nosign“ signieren" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" -msgstr "Durchsuchen des Quellcodes nach Binärdateien und anderen Problemen überspringen" +msgstr "" +"Durchsuchen des Quellcodes nach Binärdateien und anderen Problemen " +"überspringen" #: ../fdroidserver/update.py #, python-brace-format @@ -1778,11 +1909,14 @@ msgstr "Überspringe {appid}: keine Builds angegeben" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Specify a local folder to sync the repo to" -msgstr "Einen lokalen Ordner bestimmen, in dem das Repository synchronisiert wird" +msgstr "" +"Einen lokalen Ordner bestimmen, in dem das Repository synchronisiert wird" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Specify an identity file to provide to SSH for rsyncing" -msgstr "Eine Identitätsdatei bestimmen, die bei Re-Synchronisation an SSH übergeben wird" +msgstr "" +"Eine Identitätsdatei bestimmen, die bei Re-Synchronisation an SSH übergeben " +"wird" #: ../fdroidserver/build.py msgid "Specify that we're running on the build server" @@ -1814,7 +1948,8 @@ msgstr "Zusammenfassung '%s' ist nur der Name der App" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" -msgstr "Zusammenfassung mit der Länge {length} liegt über der {limit} Zeichengrenze" +msgstr "" +"Zusammenfassung mit der Länge {length} liegt über der {limit} Zeichengrenze" #: ../fdroidserver/common.py #, python-brace-format @@ -1822,7 +1957,9 @@ msgid "System clock is older than date in {path}!" msgstr "Die System-Uhr ist älter als das Datum in {path}!" #: ../fdroidserver/checkupdates.py -msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgid "" +"Tags update mode only works for git, hg, bzr and git-svn repositories " +"currently" msgstr "" #: ../fdroidserver/checkupdates.py @@ -1830,8 +1967,12 @@ msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "" #: ../fdroidserver/build.py -msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." -msgstr "Testmodus - Ausgabe nur ins tmp-Verzeichnis einfügen, immer erstellen, selbst wenn die Ausgabe bereits vorhanden ist." +msgid "" +"Test mode - put output in the tmp directory only, and always build, even if " +"the output already exists." +msgstr "" +"Testmodus - Ausgabe nur ins tmp-Verzeichnis einfügen, immer erstellen, " +"selbst wenn die Ausgabe bereits vorhanden ist." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1841,7 +1982,8 @@ msgstr "Der OBB-Versionscode muss nach \"{name}.\" stehen:" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" -msgstr "Basis-Adresse zur Anmeldung am Repository (Standard: https://f-droid.org)" +msgstr "" +"Basis-Adresse zur Anmeldung am Repository (Standard: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" @@ -1877,8 +2019,17 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Dies sind die Apps, die aus dem Hauptrepository archiviert wurden." #: ../fdroidserver/common.py -msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "Dies ist eine Paketquelle für Anwendungen, die für die Benutzung zusammen mit F-Droid gedacht ist. Die darin enthaltenen Anwendungen sind entweder offizielle von den Entwicklern erstellte Binärdateien oder werden von f-droid.org mithilfe des Werkzeugs auf https://gitlab.com/fdroid aus dem Quellcode erstellt." +msgid "" +"This is a repository of apps to be used with F-Droid. Applications in this " +"repository are either official binaries built by the original application " +"developers, or are binaries built from source by the admin of f-droid.org " +"using the tools on https://gitlab.com/fdroid." +msgstr "" +"Dies ist eine Paketquelle für Anwendungen, die für die Benutzung zusammen " +"mit F-Droid gedacht ist. Die darin enthaltenen Anwendungen sind entweder " +"offizielle von den Entwicklern erstellte Binärdateien oder werden von f-" +"droid.org mithilfe des Werkzeugs auf https://gitlab.com/fdroid aus dem " +"Quellcode erstellt." #: ../fdroidserver/import.py #, python-format @@ -1898,8 +2049,12 @@ msgid "" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Um awsbucket zu benutzen, müssen awssecretkey und awsaccesskeyid auch in der config.yml gesetzt sein!" +msgid "" +"To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config." +"yml!" +msgstr "" +"Um awsbucket zu benutzen, müssen awssecretkey und awsaccesskeyid auch in der " +"config.yml gesetzt sein!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1919,12 +2074,20 @@ msgid "URL {url} in Description: {error}" msgstr "URL {url} in der Beschreibung: {error}" #: ../fdroidserver/lint.py -msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "Ungültiges Lizenz-Tag \"{}\"! Verwenden Sie nur Kennzeichen von https://spdx.org/license-list, die von FSF oder OSI anerkannt sind" +msgid "" +"Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from " +"https://spdx.org/license-list" +msgstr "" +"Ungültiges Lizenz-Tag \"{}\"! Verwenden Sie nur Kennzeichen von https://spdx." +"org/license-list, die von FSF oder OSI anerkannt sind" #: ../fdroidserver/lint.py -msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "Unerwartetes Lizenz-Tag \"{}\"! Nur Lizenz-Tags verwenden, die in deiner config-Datei eingerichtet sind" +msgid "" +"Unexpected license tag \"{}\"! Only use license tags configured in your " +"config file" +msgstr "" +"Unerwartetes Lizenz-Tag \"{}\"! Nur Lizenz-Tags verwenden, die in deiner " +"config-Datei eingerichtet sind" #: ../fdroidserver/common.py #, python-brace-format @@ -1972,7 +2135,9 @@ msgstr "Unbekannte Version von aapt, könnte Probleme verursachen: " #: ../fdroidserver/lint.py msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "Nicht verlinkter Link - verwenden Sie [http://foo.bar Linktitel] oder [http://foo.bar]" +msgstr "" +"Nicht verlinkter Link - verwenden Sie [http://foo.bar Linktitel] oder " +"[http://foo.bar]" #: ../fdroidserver/lint.py msgid "Unnecessary leading space" @@ -2057,7 +2222,7 @@ msgstr "Nicht verwendeter „scanignore“ Pfad: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "Entpacke nach %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -2091,17 +2256,24 @@ msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData hat eine ungültige URL: {url}" #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" -msgstr "UpdateCheckMode ist gesetzt, aber es sieht so aus, als ob checkupdates noch nicht ausgeführt wurde" +msgid "" +"UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" +msgstr "" +"UpdateCheckMode ist gesetzt, aber es sieht so aus, als ob checkupdates noch " +"nicht ausgeführt wurde" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID - it can be removed" -msgstr "UpdateCheckName ist auf die bekannte App-ID gesetzt - sie kann entfernt werden" +msgstr "" +"UpdateCheckName ist auf die bekannte App-ID gesetzt - sie kann entfernt " +"werden" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "UpdateCheckName ist auf eine bekannte App-ID gesetzt, sie kann entfernt werden" +msgstr "" +"UpdateCheckName ist auf eine bekannte App-ID gesetzt, sie kann entfernt " +"werden" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2126,7 +2298,9 @@ msgstr "Syntax: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Verwenden Sie /HEAD anstelle von /master, um auf eine Datei im Hauptzweig zu verweisen" +msgstr "" +"Verwenden Sie /HEAD anstelle von /master, um auf eine Datei im Hauptzweig zu " +"verweisen" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." @@ -2154,8 +2328,11 @@ msgid "Using APK Signature v3" msgstr "Verwende APK-Signatur v3" #: ../fdroidserver/common.py -msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" -msgstr "Von Java jarsigner zur Verifikation von APKs wird abgeraten! Verwenden Sie apksigner" +msgid "" +"Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "" +"Von Java jarsigner zur Verifikation von APKs wird abgeraten! Verwenden Sie " +"apksigner" #: ../fdroidserver/common.py #, python-brace-format @@ -2178,7 +2355,9 @@ msgstr "Gültige Befehle sind:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." -msgstr "Vergleichen Sie mit lokal zwischengespeicherter Kopie, anstatt erneut herunterzuladen." +msgstr "" +"Vergleichen Sie mit lokal zwischengespeicherter Kopie, anstatt erneut " +"herunterzuladen." #: ../fdroid ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" @@ -2190,20 +2369,32 @@ msgstr "Überprüfe die Index-Signatur:" #: ../fdroidserver/deploy.py #, python-brace-format -msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "VirusTotal-API-Schlüssel kann nicht Dateien größer 32MB hochladen, verwende {url} um {path} hochzuladen." +msgid "" +"VirusTotal API key cannot upload files larger than 32MB, use {url} to upload " +"{path}." +msgstr "" +"VirusTotal-API-Schlüssel kann nicht Dateien größer 32MB hochladen, verwende " +"{url} um {path} hochzuladen." #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Vor möglichen Metadaten-Fehlern warnen" #: ../fdroidserver/update.py -msgid "When configured for signed indexes, create only unsigned indexes at this stage" -msgstr "Bei einer Konfiguration mit signierten Indizes, in dieser Phase nur unsignierte Indizes erstellen" +msgid "" +"When configured for signed indexes, create only unsigned indexes at this " +"stage" +msgstr "" +"Bei einer Konfiguration mit signierten Indizes, in dieser Phase nur " +"unsignierte Indizes erstellen" #: ../fdroidserver/lint.py -msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "Beim Linting des gesamten Repositoriums wird yamllint standardmäßig deaktiviert. Diese Option erzwingt yamllint ungeachtet dessen." +msgid "" +"When linting the entire repository yamllint is disabled by default. This " +"option forces yamllint regardless." +msgstr "" +"Beim Linting des gesamten Repositoriums wird yamllint standardmäßig " +"deaktiviert. Diese Option erzwingt yamllint ungeachtet dessen." msgid "X.509 'Distiguished Name' used when generating keys" msgstr "X.509 'Angesehener Name' wenn Schlüssel generiert werden" @@ -2214,7 +2405,8 @@ msgstr "X.509 'Distinguished Name' zum Erzeugen von Schlüsseln" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" -msgstr "Sie können ANDROID_HOME verwenden, um den Pfad zu Ihrem SDK zu setzen, z.B.:" +msgstr "" +"Sie können ANDROID_HOME verwenden, um den Pfad zu Ihrem SDK zu setzen, z.B.:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" @@ -2243,9 +2435,10 @@ msgid "ambiguous option: %s (%s?)" msgstr "Mehrdeutige Option: %s (%s?)" #: ../fdroidserver/common.py -#, fuzzy msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "apksigner nicht gefunden, er wird zum Signieren benötigt!" +msgstr "" +"apksigner nicht gefunden! Moderne APKs können nicht signiert oder " +"verifiziert werden" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2319,7 +2512,8 @@ msgstr "kann keine Aktionen zusammenführen - zwei Gruppen heißen %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" -msgstr "Kann das Update nicht veröffentlichen. Ist der Deploy-Schlüssel gesetzt?" +msgstr "" +"Kann das Update nicht veröffentlichen. Ist der Deploy-Schlüssel gesetzt?" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2374,6 +2568,7 @@ msgstr "{path} erzeugt" #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" msgstr "" +"die aktuelle Version ist neuer: alter vercode={old}, neuer vercode={new}" #: ../fdroidserver/update.py #, python-brace-format @@ -2447,7 +2642,9 @@ msgstr "Fehler zwingend als Warnungen ausgeben oder ignorieren" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." -msgstr "Erzwingen, dass Metadatenfehler (Standard) als Warnung ausgegeben oder ignoriert werden." +msgstr "" +"Erzwingen, dass Metadatenfehler (Standard) als Warnung ausgegeben oder " +"ignoriert werden." #: ../fdroidserver/common.py msgid "git svn clone failed" @@ -2465,7 +2662,9 @@ msgstr "Ausdrückliches Argument %r ignoriert" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v1 muß eine Signatur haben, verwenden Sie `fdroid signindex` um sie zu erzeugen!" +msgstr "" +"index-v1 muß eine Signatur haben, verwenden Sie `fdroid signindex` um sie zu " +"erzeugen!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2493,8 +2692,12 @@ msgstr "Ungültiger conflict_resolution-Wert: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format -msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" -msgstr "Ungültige Optionszeichenfolge %(option)r: muss mit einem Zeichen %(prefix_chars)r beginnen" +msgid "" +"invalid option string %(option)r: must start with a character " +"%(prefix_chars)r" +msgstr "" +"Ungültige Optionszeichenfolge %(option)r: muss mit einem Zeichen " +"%(prefix_chars)r beginnen" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -2503,8 +2706,11 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format -msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" -msgstr "local_copy_dir endet nicht auf \"fdroid\", meinten Sie stattdessen: \"{path}\"" +msgid "" +"local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "" +"local_copy_dir endet nicht auf \"fdroid\", meinten Sie stattdessen: " +"\"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" @@ -2544,9 +2750,8 @@ msgid "no version info found!" msgstr "Keine Versionsinformationen gefunden!" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "no version information found" -msgstr "Keine Versionsinformationen gefunden!" +msgstr "keine Versionsinformation gefunden" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2567,7 +2772,9 @@ msgstr "akzeptiert nur Zeichenketten, Listen und Tupel" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "Option %s: Wenn Sie wirklich alle signierten Apps installieren wollen, verwenden Sie --all" +msgstr "" +"Option %s: Wenn Sie wirklich alle signierten Apps installieren wollen, " +"verwenden Sie --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2639,13 +2846,21 @@ msgstr "Bereitstellen des Process Log {path} auf {dest} ist fehlgeschlagen!" #: ../fdroidserver/signatures.py #, python-brace-format -msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "Download über ungesicherte HTTP-Verbindung verweigert (verwenden Sie HTTPS oder geben Sie --no-https-check an): {apkfilename}" +msgid "" +"refuse downloading via insecure HTTP connection (use HTTPS or specify --no-" +"https-check): {apkfilename}" +msgstr "" +"Download über ungesicherte HTTP-Verbindung verweigert (verwenden Sie HTTPS " +"oder geben Sie --no-https-check an): {apkfilename}" #: ../fdroidserver/signatures.py #, python-brace-format -msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" -msgstr "Download über ungesicherte HTTP-Verbindung verweigert (verwenden Sie HTTPS oder geben Sie --no-https-check an): {apkfilename}" +msgid "" +"refuse downloading via insecure http connection (use https or specify --no-" +"https-check): {apkfilename}" +msgstr "" +"Download über ungesicherte HTTP-Verbindung verweigert (verwenden Sie HTTPS " +"oder geben Sie --no-https-check an): {apkfilename}" #: ../fdroidserver/index.py #, python-format @@ -2692,11 +2907,15 @@ msgstr "signiertes APK, entweder ein Dateipfad oder eine HTTPS-URL." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "Überspringen des Deployens von vollständigen Build-Logs: der Log-Inhalt ist leer" +msgstr "" +"Überspringen des Deployens von vollständigen Build-Logs: der Log-Inhalt ist " +"leer" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" -msgstr "Überspringen des Deployens von vollständigen Build-Logs: nicht in der Konfiguration aktiviert" +msgstr "" +"Überspringen des Deployens von vollständigen Build-Logs: nicht in der " +"Konfiguration aktiviert" #: ../fdroidserver/update.py #, python-brace-format @@ -2765,7 +2984,9 @@ msgstr "virustotal.com limitiert die Zugriffe, warte auf Wiederholung …" #: ../fdroidserver/update.py msgid "wiki support is deprecated and will be removed in the next release!" -msgstr "Die wiki-Unterstützung ist veraltet und wird in der nächsten Version entfernt!" +msgstr "" +"Die wiki-Unterstützung ist veraltet und wird in der nächsten Version " +"entfernt!" #: ../fdroidserver/publish.py #, python-brace-format @@ -2782,17 +3003,20 @@ msgstr "{apkfilename} ({appid}) besitzt keine Metadaten!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} hat mehrere {name} Dateien, sieht aus wie Master Key Exploit!" +msgstr "" +"{apkfilename} hat mehrere {name} Dateien, sieht aus wie Master Key Exploit!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " -msgstr "Die AndroidManifest.xml der App „{apkfilename}” hat ein ungültiges Datum: " +msgstr "" +"Die AndroidManifest.xml der App „{apkfilename}” hat ein ungültiges Datum: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." -msgstr "{appid} besitzt keinen Namen! Die Anwendungs-ID wird stattdessen verwendet." +msgstr "" +"{appid} besitzt keinen Namen! Die Anwendungs-ID wird stattdessen verwendet." #: ../fdroidserver/update.py #, python-brace-format @@ -2817,7 +3041,7 @@ msgstr "{appid} von {path} ist kein gültiger Java-Paketname!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid} hat sowohl APKs als auch Dateien: {files}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2863,12 +3087,14 @@ msgstr "{file} ist leer oder beschädigt!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{path}\" does not exist! Correct it in config.yml." -msgstr "{name} \"{path}\" existiert nicht! Korrigieren Sie es in der config.yml." +msgstr "" +"{name} \"{path}\" existiert nicht! Korrigieren Sie es in der config.yml." #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "{name} \"{section}/icons/{path}\" existiert nicht! Überprüfe \"config.yml\"." +msgstr "" +"{name} \"{section}/icons/{path}\" existiert nicht! Überprüfe \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format @@ -2878,7 +3104,8 @@ msgstr "{oldfile} ist veraltet, benutze {newfile}" #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" -msgstr "{path} existiert schon, importierte Ergebnisse werden nicht berücksichtigt!" +msgstr "" +"{path} existiert schon, importierte Ergebnisse werden nicht berücksichtigt!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2888,7 +3115,9 @@ msgstr "{path} existiert nicht! Erstellen Sie es durch Ausführen von:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "{path} hat die schlechte Dateisignatur \"{pattern}\", möglicher Janus-Exploit!" +msgstr "" +"{path} hat die schlechte Dateisignatur \"{pattern}\", möglicher Janus-" +"Exploit!" #: ../fdroidserver/update.py #, python-brace-format @@ -2898,12 +3127,13 @@ msgstr "{path} hat Dateigröße Null!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" -msgstr "{path} ist größer als 200MB und muss manuell auf {url} hochgeladen werden" +msgstr "" +"{path} ist größer als 200MB und muss manuell auf {url} hochgeladen werden" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path}: {error}" -msgstr "Kopieren von {path} fehlgeschlagen: {error}" +msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format From 2123623ae7eeb04b76e3b4e9d10276bb6666567d Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Thu, 17 Feb 2022 20:57:43 +0100 Subject: [PATCH 0574/2116] Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk Currently translated at 100.0% (612 of 612 strings) Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk Currently translated at 98.5% (603 of 612 strings) Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk Currently translated at 94.2% (577 of 612 strings) Co-authored-by: Ihor Hordiichuk Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 114 +++++++++++++------------- 1 file changed, 56 insertions(+), 58 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index a995fb2f..901be91d 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -2,7 +2,7 @@ # Copyright (C) YEAR Free Software Foundation, Inc. # Hans-Christoph Steiner , 2020. # ihor_ck , 2020. -# Ihor Hordiichuk , 2020, 2021. +# Ihor Hordiichuk , 2020, 2021, 2022. # Tymofij Lytvynenko , 2021. # DankXylese , 2021. msgid "" @@ -10,15 +10,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2021-06-28 18:52+0000\n" -"Last-Translator: DankXylese \n" +"PO-Revision-Date: 2022-02-17 19:57+0000\n" +"Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.7.1-dev\n" +"X-Generator: Weblate 4.11-dev\n" #: ../fdroidserver/common.py msgid "" @@ -67,9 +67,9 @@ msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" не має відповідного файлу метаданих!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "Кореневої теки local_copy_dir \"{path}\" не існує!" +msgstr "\"local_copy_dir\" {path} не існує!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" @@ -106,9 +106,9 @@ msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" має непідтримуваний формат, конвертувати до: {formats}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "\"{path}\" існує, але s3cmd не встановлений!" +msgstr "«{path}» підписано не дозволеним ключем:" #: ../fdroidserver/common.py #, python-brace-format @@ -334,9 +334,9 @@ msgid "Android SDK tool {cmd} found!" msgstr "{cmd} засіб Android SDK знайдено!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "{cmd} засіб Android SDK знайдено!" +msgstr "Інструмент Android SDK {cmd} не знайдено!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -416,7 +416,7 @@ msgstr "Вбудований репозиторій створено у \"%s\" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "Автооновлення застосунку без CurrentVersionCode неможливе" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -533,9 +533,8 @@ msgid "Couldn't find Application ID" msgstr "Не вдалося знайти ID застосунку" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "Couldn't find any version information" -msgstr "Не вдається знайти найновішу назву версії" +msgstr "Не вдалося знайти відомості про версію" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py @@ -695,7 +694,7 @@ msgstr "Журналів завантаження у нас немає" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "Завантаження %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." @@ -818,9 +817,8 @@ msgid "Failed to get APK manifest information" msgstr "Не вдалося отримати подробиці про APK" #: ../fdroidserver/update.py -#, fuzzy msgid "Failed to get APK signing key fingerprint" -msgstr "Не вдалося отримати подробиці про APK" +msgstr "Не вдалося отримати відбиток ключа підпису APK" #: ../fdroidserver/install.py #, python-brace-format @@ -953,9 +951,8 @@ msgid "Git fetch failed" msgstr "Git вибірка не вдалася" #: ../fdroidserver/common.py -#, fuzzy msgid "Git prune failed" -msgstr "Скидання Git не вдалося" +msgstr "Не вдалося виконати Git prune" #: ../fdroidserver/common.py msgid "Git remote set-head failed" @@ -1032,14 +1029,14 @@ msgid "Include the source tarballs in the mirror" msgstr "Включити джерело tarballs в дзеркало" #: ../fdroidserver/metadata.py -#, fuzzy, python-format +#, python-format msgid "Including metadata from %s@%s" -msgstr "Недійсні метадані у %s: %d" +msgstr "Включно з метаданими від %s@%s" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Including metadata from {path}" -msgstr "Створення скелетів файлів метаданих: {path}" +msgstr "Включно з метаданими з {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1084,12 +1081,12 @@ msgstr "Недійсний APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "Неприпустимий AutoUpdateMode: {mode}" #: ../fdroidserver/checkupdates.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "Неправильна назва пакунку {0}" +msgstr "Неприпустимий UpdateCheckMode: {mode}" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format @@ -1146,7 +1143,7 @@ msgstr "Неправильне ім'я для оприлюдненого фай #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "Неприпустимий ndk: запис у збірці: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format @@ -1210,9 +1207,9 @@ msgid "Javascript in HTML src attributes" msgstr "В атрибутах джерельного HTML коду міститься Javascript" #: ../fdroidserver/build.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "Не вдалося прочитати minSdkVersion: \"{apkfilename}\"" +msgstr "Зберігання невдалої збірки \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" @@ -1236,9 +1233,8 @@ msgid "List files that would be reformatted" msgstr "Список файлів, які будуть переформатовані" #: ../fdroidserver/rewritemeta.py -#, fuzzy msgid "List files that would be reformatted (dry run)" -msgstr "Список файлів, які будуть переформатовані" +msgstr "Список файлів, які будуть переформатовані (пробний запуск)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" @@ -1274,9 +1270,9 @@ msgid "No 'config.yml' found, using defaults." msgstr "Не знайдено 'config.yml', використовуючи типові налаштування." #: ../fdroidserver/verify.py -#, fuzzy, python-format +#, python-format msgid "No APK for package: %s" -msgstr "Такого пакунка немає: %s" +msgstr "Немає APK для пакунка: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1316,14 +1312,13 @@ msgid "No information found." msgstr "Подробиць не знайдено." #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No matching tags found" -msgstr "Подробиць не знайдено." +msgstr "Не знайдено відповідних тегів" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "config.yml не знайдено, використання типових налаштувань." +msgstr "У {0} не знайдено мінімальної версії SDK, усталено (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1367,9 +1362,8 @@ msgid "No such versionCode {versionCode} for app {appid}" msgstr "Немає такого versionCode {versionCode} для застосунку {appid}" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No tags found" -msgstr "Не знайдено приєднаних пристроїв" +msgstr "Теги не знайдено" #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" @@ -1596,7 +1590,7 @@ msgstr "Вилучення вказаних файлів" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "Вилучення {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -1604,7 +1598,7 @@ msgstr "Перейменування файлів APK, які не відпов #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "Режим оновлення RepoTrunk має сенс лише в репозиторіях git-svn" #: ../fdroidserver/update.py msgid "Report on build data status" @@ -1688,14 +1682,13 @@ msgstr[1] "Знайдено {} проблеми" msgstr[2] "Знайдено {} проблем" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with apkanalyzer for known non-free classes." -msgstr "Перевірити отриманий файл APK на наявність відомих невільних класів." +msgstr "Перевірка APK на наявність відомих невільних класів за допомогою apkanalyzer." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "" +msgstr "Установити NDK {release} ({version})" #: ../fdroidserver/common.py msgid "Set clock to that time using:" @@ -1743,7 +1736,7 @@ msgstr "Недійсний підпис '{apkfilename}', пропускаємо! #: ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "Пропуск дзеркала GitLab Pages через завеликий розмір репозиторію (>%.2fГБ)!" #: ../fdroidserver/update.py #, python-brace-format @@ -1812,11 +1805,11 @@ msgstr "Системний годинник відстає від date в {path} #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" +msgstr "Режим оновлення тегів наразі працює лише для репозиторіїв git, hg, bzr та git-svn" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" +msgstr "Режим оновлення тегів, який використовується в git-svn, але репозиторій не було налаштовано за допомогою тегів" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." @@ -1885,6 +1878,13 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" +"Щоб завершити налаштування, додайте свої файли .apk до «%s»\n" +"потім запустіть \"fdroid update -c; fdroid update\". Ви також можете відредагувати\n" +"\"config.yml\", щоб установити URL-адресу, назву репозиторію тощо. Ви також повинні\n" +"налаштувати ключ підпису (тимчасовий ключ може бути створено автоматично).\n" +"\n" +"Докладніше: : https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -1918,7 +1918,7 @@ msgstr "Неочікувана мітка ліцензії \"{}\"! Викори #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" +msgstr "Неочікувана ціль символічного посилання: {link} -> {target}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2046,7 +2046,7 @@ msgstr "Невикористаний шлях scanignore: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "Видобути в %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -2232,9 +2232,8 @@ msgid "ambiguous option: %s (%s?)" msgstr "неоднозначний параметр: %s (%s?)" #: ../fdroidserver/common.py -#, fuzzy msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "apksigner не знайдено, це потрібно для підписання!" +msgstr "apksigner не знайдено! Не вдалося підписати або перевірити актуальні файли APK" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2363,7 +2362,7 @@ msgstr "створено {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "поточна версія новіша: застаріла vercode={old}, нова vercode={new}" #: ../fdroidserver/update.py #, python-brace-format @@ -2490,7 +2489,7 @@ msgstr "неправильний рядок параметра %(option)r: по #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "остання подана збірка новіша: застаріла vercode={old}, нова vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2535,9 +2534,8 @@ msgid "no version info found!" msgstr "не вдалося визначити версію!" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "no version information found" -msgstr "не вдалося визначити версію!" +msgstr "не знайдено відомостей про версію" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2660,7 +2658,7 @@ msgstr "s3cmd синхронізувати індекси з {path} до {url} #: ../fdroidserver/scanner.py #, python-format msgid "scanner not cleanly run apkanalyzer: %s" -msgstr "" +msgstr "сканер не запускає apkanalyzer начисто: %s" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2809,7 +2807,7 @@ msgstr "{appid} з {path} є недійсною назвою пакунка Java #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid} має APK і файли: {files}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2893,9 +2891,9 @@ msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} понад 200 МБ, вивантажити власноруч: {url}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path}: {error}" -msgstr "Не вдалося копіювати {path}: {error}" +msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format From 58370dbdc4c1169184738d0268f779a486052eed Mon Sep 17 00:00:00 2001 From: Agnieszka C Date: Thu, 17 Feb 2022 20:57:44 +0100 Subject: [PATCH 0575/2116] Translated using Weblate: Polish (pl) by Agnieszka C Currently translated at 100.0% (612 of 612 strings) Co-authored-by: Agnieszka C Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ Translation: F-Droid/F-Droid Server --- locale/pl/LC_MESSAGES/fdroidserver.po | 112 +++++++++++++------------- 1 file changed, 55 insertions(+), 57 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 0aa76cc7..52491ff9 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -4,13 +4,13 @@ # Michal L , 2020, 2021. # mondstern , 2021. # Hans-Christoph Steiner , 2021. -# Agnieszka C , 2021. +# Agnieszka C , 2021, 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2021-10-16 13:25+0000\n" +"PO-Revision-Date: 2022-02-15 22:36+0000\n" "Last-Translator: Agnieszka C \n" "Language-Team: Polish \n" "Language: pl\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 4.11-dev\n" #: ../fdroidserver/common.py msgid "" @@ -67,9 +67,9 @@ msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" nie ma pasującego pliku metadanych!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "Katalog główny katalogu local_copy_dir \"{path}\" nie istnieje!" +msgstr "„local_copy_dir” {path} nie istnieje!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" @@ -106,9 +106,9 @@ msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" nie jest akceptowanym formatem, zamień na: {formats}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "\"{path}\" istnieje, ale s3cmd nie jest zainstalowany!" +msgstr "„{path}” jest podpisany kluczem, który jest niedozwolony:" #: ../fdroidserver/common.py #, python-brace-format @@ -334,9 +334,9 @@ msgid "Android SDK tool {cmd} found!" msgstr "Android SDK narzędzie {cmd} znaleziono!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "Android SDK narzędzie {cmd} znaleziono!" +msgstr "Nie znaleziono narzędzia Android SDK {cmd}!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -416,7 +416,7 @@ msgstr "Zbudowane repo w oparciu o \"%s\" z tą konfiguracją:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "Nie można automatycznie zaktualizować aplikacji bez CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -533,9 +533,8 @@ msgid "Couldn't find Application ID" msgstr "Nie można odnaleźć identyfikatora aplikacji" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "Couldn't find any version information" -msgstr "Nie można znaleźć najnowszej wersji nazwy" +msgstr "Nie udało się znaleźć żadnych informacji o wersji" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py @@ -695,7 +694,7 @@ msgstr "Pobierz dzienniki, których nie mamy" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "Pobieranie %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." @@ -818,9 +817,8 @@ msgid "Failed to get APK manifest information" msgstr "Nie można uzyskać informacji o manifeście APK" #: ../fdroidserver/update.py -#, fuzzy msgid "Failed to get APK signing key fingerprint" -msgstr "Nie można uzyskać informacji o manifeście APK" +msgstr "Nie udało się uzyskać odcisku palca klucza podpisywania APK" #: ../fdroidserver/install.py #, python-brace-format @@ -953,9 +951,8 @@ msgid "Git fetch failed" msgstr "Pobranie Git nie powiodło się" #: ../fdroidserver/common.py -#, fuzzy msgid "Git prune failed" -msgstr "Resetowanie Git nie powiodło się" +msgstr "Git prune nie powiodło się" #: ../fdroidserver/common.py msgid "Git remote set-head failed" @@ -1032,14 +1029,14 @@ msgid "Include the source tarballs in the mirror" msgstr "Dołącz źródło tarballs w lustrze" #: ../fdroidserver/metadata.py -#, fuzzy, python-format +#, python-format msgid "Including metadata from %s@%s" -msgstr "Nieprawidłowe metadane w %s:%d" +msgstr "Włączenie metadanych z %s@%s" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Including metadata from {path}" -msgstr "Nieznany format metadanych: {path}" +msgstr "Włączenie metadanych z {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1084,12 +1081,12 @@ msgstr "Nieprawidłowy plik APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "Nieprawidłowy AutoUpdateMode: {mode}" #: ../fdroidserver/checkupdates.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "Niepoprawna nazwa pakietu {0}" +msgstr "Nieprawidłowy UpdateCheckMode: {mode}" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format @@ -1146,7 +1143,7 @@ msgstr "Niepoprawna nazwa opublikowanego pliku: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "Nieprawidłowy ndk: wpis w kompilacji: „{ndk}”" #: ../fdroidserver/common.py #, python-brace-format @@ -1210,9 +1207,9 @@ msgid "Javascript in HTML src attributes" msgstr "JavaScript w atrybutach src HTML" #: ../fdroidserver/build.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "Nie udało się odczytać minSdkVersion: \"{apkfilename}\"" +msgstr "Utrzymywanie nieudanej kompilacji „{apkfilename}”" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" @@ -1236,9 +1233,8 @@ msgid "List files that would be reformatted" msgstr "Lista plików, które zostaną sformatowane" #: ../fdroidserver/rewritemeta.py -#, fuzzy msgid "List files that would be reformatted (dry run)" -msgstr "Lista plików, które zostaną sformatowane" +msgstr "Lista plików, które mają zostać ponownie sformatowane (przebieg próbny)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" @@ -1274,9 +1270,9 @@ msgid "No 'config.yml' found, using defaults." msgstr "Nie znaleziono pliku 'config.yml', używając wartości domyślnych." #: ../fdroidserver/verify.py -#, fuzzy, python-format +#, python-format msgid "No APK for package: %s" -msgstr "Brak takiego pakietu: %s" +msgstr "Brak APK dla pakietu: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1316,14 +1312,13 @@ msgid "No information found." msgstr "Nie znaleziono informacji." #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No matching tags found" -msgstr "Nie znaleziono informacji." +msgstr "Nie znaleziono pasujących tagów" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "Nie znaleziono pliku config.yml, przy użyciu wartości domyślnych." +msgstr "Nie znaleziono minimalnej wersji SDK w {0}, użyto domyślnej (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1367,9 +1362,8 @@ msgid "No such versionCode {versionCode} for app {appid}" msgstr "Brak takiego kodu wersji {versionCode} dla aplikacji {appid}" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No tags found" -msgstr "Nie znaleziono podłączonych urządzeń" +msgstr "Nie znaleziono tagów" #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" @@ -1596,7 +1590,7 @@ msgstr "Usuwanie określonych plików" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "Usuwanie „{path}”" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -1604,7 +1598,7 @@ msgstr "Zmień nazwy plików APK, które nie pasują do pliku package.name_123.a #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "Tryb aktualizacji RepoTrunk ma sens tylko w repozytoriach git-svn" #: ../fdroidserver/update.py msgid "Report on build data status" @@ -1688,14 +1682,13 @@ msgstr[1] "Skaner znalazł {} problemów" msgstr[2] "Skaner znalazł {} problemy" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with apkanalyzer for known non-free classes." -msgstr "Przeskanuj otrzymany plik APK w poszukiwaniu znanych niewolnych klas." +msgstr "Skanowanie pakietu APK za pomocą apkanalyzer w poszukiwaniu znanych niewolnych klas." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "" +msgstr "Ustaw NDK {release} ({version})" #: ../fdroidserver/common.py msgid "Set clock to that time using:" @@ -1743,7 +1736,7 @@ msgstr "Pomijaj '{apkfilename}' z nieprawidłowym podpisem!" #: ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "Pomijanie serwera lustrzanego GitLab Pages, ponieważ repozytorium jest zbyt duże (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format @@ -1812,11 +1805,11 @@ msgstr "Zegar systemowy jest starszy niż data w {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" +msgstr "Tryb aktualizacji tagów działa obecnie tylko dla repozytoriów git, hg, bzr i git-svn" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" +msgstr "Tryb aktualizacji tagów użyty w git-svn, ale repozytorium nie zostało skonfigurowane z tagami" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." @@ -1885,6 +1878,13 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" +"Aby zakończyć konfigurację, dodaj swoje pliki APK do „%s”\n" +"następnie uruchom „fdroid update -c; fdroid update”. Możesz też chcieć zedytować\n" +"„config.yml”, aby ustawić adres URL, nazwę repozytorium i inne. Powinieneś również skonfigurować\n" +"klucz podpisu (tymczasowy mógł zostać wygenerowany automatycznie).\n" +"\n" +"Więcej informacji: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"i https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -1918,7 +1918,7 @@ msgstr "Nieprawidłowy tag licencji \"{}\"! Używaj tylko tagów licencji skonfi #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" +msgstr "Nieoczekiwany cel dowiązania symbolicznego: {link} -> {target}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2046,7 +2046,7 @@ msgstr "Nieużywana ścieżka scanignore: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "Rozpakowywanie do %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -2232,9 +2232,8 @@ msgid "ambiguous option: %s (%s?)" msgstr "niejednoznaczna opcja: %s (%s?)" #: ../fdroidserver/common.py -#, fuzzy msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "apksigner nie znaleziono, jest wymagane do podpisania!" +msgstr "Nie znaleziono apksignera! Nie można podpisać ani zweryfikować nowoczesnych pakietów APK" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2363,7 +2362,7 @@ msgstr "tworzony {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "aktualna wersja jest nowsza: stary vercode={old}, nowy vercode={new}" #: ../fdroidserver/update.py #, python-brace-format @@ -2490,7 +2489,7 @@ msgstr "niepoprawny ciąg opcji %(option)r: musi zaczynać się od postaci %(pre #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "najnowsza instrukcja kompilacji jest nowsza: stary vercode={old}, nowy vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2535,9 +2534,8 @@ msgid "no version info found!" msgstr "nie znaleziono informacji o wersji!" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "no version information found" -msgstr "nie znaleziono informacji o wersji!" +msgstr "nie znaleziono informacji o wersji" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2660,7 +2658,7 @@ msgstr "s3cmd zsynchronizuj indeksy {path} do {url} i usuń" #: ../fdroidserver/scanner.py #, python-format msgid "scanner not cleanly run apkanalyzer: %s" -msgstr "" +msgstr "skaner nie może czysto uruchomić apkanalyzera: %s" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2809,7 +2807,7 @@ msgstr "{appid} z {path} nie jest prawidłową nazwą pakietu Java!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid} zawiera zarówno pliki APK, jak i pliki: {files}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2893,9 +2891,9 @@ msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} więcej niż 200MB, przesłane ręcznie: {url}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path}: {error}" -msgstr "Nieudane kopiowanie {path}: {error}" +msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format From b7a9a7be85586f2820b20db904eda5058fdcfc89 Mon Sep 17 00:00:00 2001 From: Eric Date: Thu, 17 Feb 2022 20:57:44 +0100 Subject: [PATCH 0576/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Eric Currently translated at 44.1% (270 of 612 strings) Co-authored-by: Eric Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 36 ++++++++++------------ 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 326f9fdc..6a980c0c 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -13,20 +13,21 @@ # yahoo~~ , 2021. # Liu Wenyuan <15816141883@163.com>, 2021. # JY3 , 2021. +# Eric , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2021-10-16 13:25+0000\n" -"Last-Translator: JY3 \n" +"PO-Revision-Date: 2022-02-16 07:41+0000\n" +"Last-Translator: Eric \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 4.11-dev\n" #: ../fdroidserver/common.py msgid "" @@ -72,9 +73,9 @@ msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" 不与任何元数据文件匹配!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "local_copy_dir必须为绝对路径!" +msgstr "\"local_copy_dir\" {path} 不存在!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" @@ -111,9 +112,9 @@ msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" 不是可接受的格式, 需转换成 : {formats}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "\"{path}\" 存在, 但 s3cmd 未安装!" +msgstr "\"{path}\" 由不允许的密钥所签署:" #: ../fdroidserver/common.py #, python-brace-format @@ -337,9 +338,9 @@ msgid "Android SDK tool {cmd} found!" msgstr "找到 Android SDK 工具 {cmd}!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "找到 Android SDK 工具 {cmd}!" +msgstr "没找到 Android SDK 工具 {cmd}!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -534,9 +535,8 @@ msgid "Couldn't find Application ID" msgstr "找不到应用ID" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "Couldn't find any version information" -msgstr "找不到最新的版本名" +msgstr "无法找到任何的版本信息" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py @@ -1036,9 +1036,9 @@ msgid "Including metadata from %s@%s" msgstr "" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Including metadata from {path}" -msgstr "未知元数据格式:{path}" +msgstr "包含来自 {path} 的元数据" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1235,9 +1235,8 @@ msgid "List files that would be reformatted" msgstr "列出全部需重新设定格式的文件" #: ../fdroidserver/rewritemeta.py -#, fuzzy msgid "List files that would be reformatted (dry run)" -msgstr "列出全部需重新设定格式的文件" +msgstr "列出将被重新设定格式的文件 (dry run)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" @@ -2524,9 +2523,8 @@ msgid "no version info found!" msgstr "没有找到版本信息!" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "no version information found" -msgstr "没有找到版本信息!" +msgstr "没有找到版本信息" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2880,9 +2878,9 @@ msgid "{path} more than 200MB, manually upload: {url}" msgstr "" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path}: {error}" -msgstr "复制 {path} 失败:{error}" +msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format From f03f0515c6eb27f6e810683b2cbe6e96ee7e181b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Thu, 17 Feb 2022 20:57:44 +0100 Subject: [PATCH 0577/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Norwe?= =?UTF-8?q?gian=20Bokm=C3=A5l=20(nb=5FNO)=20by=20Allan=20Nordh=C3=B8y=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 59.6% (365 of 612 strings) Translated using Weblate: Norwegian Bokmål (nb_NO) by Allan Nordhøy Currently translated at 58.3% (357 of 612 strings) Co-authored-by: Allan Nordhøy Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/nb_NO/ Translation: F-Droid/F-Droid Server --- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 108 +++++++++++++---------- 1 file changed, 59 insertions(+), 49 deletions(-) diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index 03cebc5f..559bbbee 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -1,6 +1,6 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. -# Allan Nordhøy , 2020, 2021. +# Allan Nordhøy , 2020, 2021, 2022. # Hans-Christoph Steiner , 2020. # mondstern , 2021. msgid "" @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2021-11-04 09:29+0000\n" +"PO-Revision-Date: 2022-02-16 15:13+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Norwegian Bokmål \n" "Language: nb_NO\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 4.11-dev\n" #: ../fdroidserver/common.py msgid "" @@ -67,7 +67,7 @@ msgstr "Rotmappen for local_copy_dir \"{path}\" finnes ikke." #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" +msgstr "«repo_pubkey» må være å finne i config.yml når du bruker «--nosign»!" #: ../fdroidserver/install.py #, fuzzy, python-brace-format @@ -161,7 +161,7 @@ msgstr "'keypass' ble ikke funnet i config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" +msgstr "«keystore» er NONE og «smartcardoptions» er tom!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" @@ -415,7 +415,7 @@ msgstr "Bygde pakkebrønn med base i \"%s\" med dette oppsettet:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "Kan ikke auto-uppgradere program som mangler «CurrentVersionCode»" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -495,7 +495,7 @@ msgstr "Argumenter i konflikt: '--verbose' og '--quiet' kan ikke angis samtidig. #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "Filer i konflikt med hverandre. Bruker {newfile}, ser bort fra {oldfile}." #: ../fdroidserver/common.py #, python-brace-format @@ -703,7 +703,7 @@ msgstr "Last ned logger som ikke finnes lokalt" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "Laster ned %s …" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." @@ -729,8 +729,9 @@ msgid "Dynamically scan APKs post build" msgstr "Dynamisk skanne APKs postbygg" #: ../fdroidserver/__main__.py +#, fuzzy msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" +msgstr "Feil: «server»-underkommandoen har blitt fjernet. Bruk «depoloy»." #: ../fdroidserver/mirror.py #, fuzzy @@ -768,7 +769,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "Miljøvariabelen {var} fra {configname} er ikke satt!" #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py @@ -862,7 +863,7 @@ msgstr "Hentet signaturer for '{apkfilename}' → '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" -msgstr "" +msgstr "En fil ble borte mens den ble behandlet: {path}" #: ../fdroidserver/verify.py ../fdroidserver/stats.py ../fdroidserver/update.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/build.py @@ -905,7 +906,7 @@ msgstr "Fant \"{path}\"-grafikk uten metadata for programmet \"{name}\"." #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" -msgstr "" +msgstr "Fant feilaktig kronerullingsfil «{path}» for «{name}»:" #: ../fdroidserver/common.py ../fdroidserver/metadata.py #, fuzzy @@ -1002,23 +1003,24 @@ msgid "HTTPS must be used with Subversion URLs!" msgstr "HTTPS må brukes sammen med Subversjon-nettadresser." #: ../fdroidserver/deploy.py +#, fuzzy msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "" +msgstr "Hvis en Git-avspeiling blir for stor, tillat sletting av arkivet" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "" +msgstr "Hvis opplasting mislykkes kan du prøve å laste opp manuelt til {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "" +msgstr "Ser bort fra «{field}» i «{metapath}» fordi det er er foreldet." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" -msgstr "" +msgstr "Ser bort fra FUNDING.yml-oppføring som er lengre enn 2048: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1040,16 +1042,17 @@ msgid "Include APKs that are signed with disabled algorithms like MD5" msgstr "Inkluder APK-er som er signert med svartelistede algoritmer, som MD5" #: ../fdroidserver/mirror.py +#, fuzzy msgid "Include the PGP signature .asc files in the mirror" -msgstr "" +msgstr "Inkluder .asc-filer for PGP-signaturen i avspeilingen" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" -msgstr "" +msgstr "Inkluder byggloggene i avspeilingen" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" -msgstr "" +msgstr "Inkluder kildetjæreballene i avspeilingen" #: ../fdroidserver/metadata.py #, fuzzy, python-format @@ -1105,7 +1108,7 @@ msgstr "Ugyldig APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "Ugyldig AutoUpdateMode: {mode}" #: ../fdroidserver/checkupdates.py #, fuzzy, python-brace-format @@ -1166,9 +1169,9 @@ msgid "Invalid name for published file: %s" msgstr "Ugyldig navn for publisert fil: %s" #: ../fdroidserver/common.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "Ugyldig NDK: oppføring i bygg: «{ndk}»" #: ../fdroidserver/common.py #, python-brace-format @@ -1188,12 +1191,12 @@ msgstr "Ugyldig scrlib-metadata: «{file}» finnes ikke" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" -msgstr "" +msgstr "Ugyldig srclib-metadata: kunne ikke tolke «{file}»" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "" +msgstr "Ugyldig srclib-metadata: ukjent nøkkel «{key}» i «{file}»" #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format @@ -1408,7 +1411,7 @@ msgstr "Ingen usignert mappe - ingenting å gjøre" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" -msgstr "" +msgstr "Ikke en gyldig størrelsesdefinisjon: «{}»" #: ../fdroidserver/signindex.py msgid "Nothing to do" @@ -1420,8 +1423,9 @@ msgid "Nothing to do for {appid}." msgstr "Ingenting å gjøre for {appid}." #: ../fdroidserver/init.py +#, fuzzy msgid "Now set these in config.yml:" -msgstr "" +msgstr "Nå må du sette disse i config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1438,8 +1442,9 @@ msgid "OBB's packagename does not match a supported APK:" msgstr "OBB-pakkenavn samsvarer ikke med noen støttet APK:" #: ../fdroidserver/deploy.py +#, fuzzy msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" +msgstr "Frakoblet maskin. Hopper over Git-avspeilingsgenerering til «fdroid deploy»" #: ../fdroidserver/common.py #, fuzzy, python-brace-format @@ -1486,8 +1491,9 @@ msgstr "Send utdata-JSON til stdout." #: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py #: ../fdroidserver/update.py ../fdroidserver/signindex.py #: ../fdroidserver/checkupdates.py +#, fuzzy msgid "Outputting JSON" -msgstr "" +msgstr "Produserer JSON" #: ../fdroidserver/import.py msgid "Overall license of the project." @@ -1501,7 +1507,7 @@ msgstr "Overskriver blank versionName i {apkfilename} fra metadata: {version}." #: ../fdroidserver/import.py #, python-brace-format msgid "Package \"{appid}\" already exists" -msgstr "" +msgstr "Pakken «{appid}» finnes allerede" #: ../fdroidserver/common.py #, fuzzy, python-brace-format @@ -1633,17 +1639,18 @@ msgid "Removing specified files" msgstr "Fjerner angitte filer" #: ../fdroidserver/update.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "Fjerner {path}\" …" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" msgstr "Gi nytt navn til APK-filer som ikke samsvarer med package.name_123.apk" #: ../fdroidserver/checkupdates.py +#, fuzzy msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "RepoTrunk-oppdateringsmodus gir kun mening i Git-SVN-kodelager" #: ../fdroidserver/update.py msgid "Report on build data status" @@ -1706,7 +1713,7 @@ msgstr "Kjører wget i {path}." #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "" +msgstr "Skann resulterende APK(er) for kjente ufrie klasser." #: ../fdroid ../fdroidserver/__main__.py msgid "Scan the source code of a package" @@ -1729,8 +1736,9 @@ msgstr[0] "Skanner fant {} problem" msgstr[1] "Skanner fant {} problemer" #: ../fdroidserver/scanner.py +#, fuzzy msgid "Scanning APK with apkanalyzer for known non-free classes." -msgstr "" +msgstr "Skanner APK med APK Analyzer for kjente ikke-frie klasser." #: ../fdroidserver/common.py #, python-brace-format @@ -1782,9 +1790,9 @@ msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Hopper over '{apkfilename}' med ugyldig signatur." #: ../fdroidserver/index.py -#, python-format +#, fuzzy, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "Hopper over GitLab Pages-avspeiling fordi kodelageret er for stort (>%.2f GB)!" #: ../fdroidserver/update.py #, python-brace-format @@ -2093,9 +2101,9 @@ msgid "Unused scanignore path: %s" msgstr "Ubrukt fil i %s" #: ../fdroidserver/common.py -#, python-format +#, fuzzy, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "Pakker ut til %s …" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -2146,7 +2154,7 @@ msgstr "\"Update Check Name\" er satt til den kjente App-ID-en - den kan fjernes #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" -msgstr "" +msgstr "Laster opp {apkfilename} to androidobservatory.org" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format @@ -2232,9 +2240,9 @@ msgid "Verifying index signature:" msgstr "Bekrefter indekssignatur:" #: ../fdroidserver/deploy.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "" +msgstr "VirusTotal API-nøkkel kan ikke laste opp filer større enn 32 MB, bruk {url} for å laste opp {path}." #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" @@ -2383,7 +2391,7 @@ msgstr "kommando å kjøre, enten 'init' eller 'update'" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" -msgstr "" +msgstr "kommandoer fra programtilleggsmodulene:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2510,8 +2518,9 @@ msgid "git svn clone failed" msgstr "\"git svn clone\" mislyktes" #: ../fdroidserver/scanner.py +#, fuzzy msgid "gzip file archive" -msgstr "" +msgstr ".gzip-filarkiv" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2715,8 +2724,9 @@ msgid "repo_icon %s does not exist, generating placeholder." msgstr "" #: ../fdroidserver/metadata.py +#, fuzzy msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" +msgstr "ruamel.yaml er ikke installert. Kan ikke skrive metadata." #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, fuzzy, python-brace-format @@ -2724,9 +2734,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd synkroniserer indekser {path} til {url} og sletter" #: ../fdroidserver/scanner.py -#, python-format +#, fuzzy, python-format msgid "scanner not cleanly run apkanalyzer: %s" -msgstr "" +msgstr "skanneren kjørte ikke APK Analyzer uten feil: %s" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2825,7 +2835,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "wiki support is deprecated and will be removed in the next release!" -msgstr "" +msgstr "wiki-støtte er foreldet og vil bli fjernet i neste utgave." #: ../fdroidserver/publish.py #, python-brace-format @@ -2877,7 +2887,7 @@ msgstr "{appid} fra {path} er ikke et gyldig Java-pakkenavn!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid} har både APK-er og filer: {files}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2933,7 +2943,7 @@ msgstr "{name} «{section}/icons/{path}» finnes ikke. Rett det i config.yml." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "{oldfile} er avleggs, bruk {newfile}" #: ../fdroidserver/import.py #, python-brace-format From 92c2717d1d96606a41dbc4a3beba635941b9921c Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 17 Feb 2022 20:57:45 +0100 Subject: [PATCH 0578/2116] Translated using Weblate: Russian (ru) by Andrey Currently translated at 100.0% (612 of 612 strings) Co-authored-by: Andrey Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translation: F-Droid/F-Droid Server --- locale/ru/LC_MESSAGES/fdroidserver.po | 114 +++++++++++++------------- 1 file changed, 56 insertions(+), 58 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 1478590f..ecf04d5d 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -3,7 +3,7 @@ # Golubev Alexander , 2020, 2021. # Mingun , 2020. # anonymous , 2020. -# Andrey , 2020, 2021. +# Andrey , 2020, 2021, 2022. # gardenapple , 2020. # Boris Timofeev , 2020. # Hans-Christoph Steiner , 2020. @@ -15,15 +15,15 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2021-07-01 22:06+0000\n" -"Last-Translator: Чтабс \n" +"PO-Revision-Date: 2022-02-16 15:13+0000\n" +"Last-Translator: Andrey \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 4.11-dev\n" #: ../fdroidserver/common.py msgid "" @@ -73,9 +73,9 @@ msgid "\"%s/\" has no matching metadata file!" msgstr "У \"%s/\" нет соответствующего файла метаданных!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "Корневой директории для local_copy_dir \"{path}\" нет!" +msgstr "\"local_copy_dir\" {path} не существует!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" @@ -112,9 +112,9 @@ msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "формат пути \"{path}\" не принимается, преобразуйте в другой доступный: {formats}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "путь \"{path}\" существует, но s3cmd клиент не установлен!" +msgstr "\"{path}\" подписан ключом, который не разрешен:" #: ../fdroidserver/common.py #, python-brace-format @@ -340,9 +340,9 @@ msgid "Android SDK tool {cmd} found!" msgstr "Утилита {cmd} из Android SDK не найдена!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "Утилита {cmd} из Android SDK не найдена!" +msgstr "Инструмент Android SDK {cmd} не найден!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -422,7 +422,7 @@ msgstr "Репозиторий создан в \"%s\", основываясь н #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "Невозможно автоматически обновить приложение без CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -539,9 +539,8 @@ msgid "Couldn't find Application ID" msgstr "Не удалось найти Application ID" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "Couldn't find any version information" -msgstr "Не удалось найти публичную версию приложения (versionName)" +msgstr "Не удалось найти никакой информации о версии" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py @@ -701,7 +700,7 @@ msgstr "Загрузить отсутствующие логи" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "Загрузка %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." @@ -824,9 +823,8 @@ msgid "Failed to get APK manifest information" msgstr "Извлечь информацию из APK манифеста не получилось" #: ../fdroidserver/update.py -#, fuzzy msgid "Failed to get APK signing key fingerprint" -msgstr "Извлечь информацию из APK манифеста не получилось" +msgstr "Не удалось получить отпечаток ключа подписи APK" #: ../fdroidserver/install.py #, python-brace-format @@ -959,9 +957,8 @@ msgid "Git fetch failed" msgstr "Не удалось получить данные из репозитория (git fetch)" #: ../fdroidserver/common.py -#, fuzzy msgid "Git prune failed" -msgstr "Не удалось отменить изменения (git reset)" +msgstr "Не удалось выполнить Git prune" #: ../fdroidserver/common.py msgid "Git remote set-head failed" @@ -1038,14 +1035,14 @@ msgid "Include the source tarballs in the mirror" msgstr "Включать архивы с исходным кодом в зеркало" #: ../fdroidserver/metadata.py -#, fuzzy, python-format +#, python-format msgid "Including metadata from %s@%s" -msgstr "Неверные метаданные в %s:%d" +msgstr "Включение метаданных из %s@%s" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Including metadata from {path}" -msgstr "Неизвестный формат метаданных: {path}" +msgstr "Включение метаданных из {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1090,12 +1087,12 @@ msgstr "Непригодный файл APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "Неверный режим автообновления: {mode}" #: ../fdroidserver/checkupdates.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "Неверное имя (package name) {0}" +msgstr "Недопустимый UpdateCheckMode: {mode}" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format @@ -1152,7 +1149,7 @@ msgstr "Неверное имя для опубликованного файла #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "Недопустимый ndk: запись в сборке: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format @@ -1216,9 +1213,9 @@ msgid "Javascript in HTML src attributes" msgstr "В атрибутах исходного HTML кода содержится Javascript" #: ../fdroidserver/build.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "Не удалось извлечь minSdkVersion для \"{apkfilename}\"" +msgstr "Сохранение неудачной сборки \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" @@ -1242,9 +1239,8 @@ msgid "List files that would be reformatted" msgstr "Отобразить список файлов, формат которых поменяется" #: ../fdroidserver/rewritemeta.py -#, fuzzy msgid "List files that would be reformatted (dry run)" -msgstr "Отобразить список файлов, формат которых поменяется" +msgstr "Список файлов, которые будут переформатированы (сухой прогон)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" @@ -1280,9 +1276,9 @@ msgid "No 'config.yml' found, using defaults." msgstr "Файл 'config.yml' не обнаружен. Используется конфигурация по умолчанию." #: ../fdroidserver/verify.py -#, fuzzy, python-format +#, python-format msgid "No APK for package: %s" -msgstr "Такого пакета не существует: %s" +msgstr "Нет APK для пакета: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1322,14 +1318,13 @@ msgid "No information found." msgstr "Информация о репозитории неверна." #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No matching tags found" -msgstr "Информация о репозитории неверна." +msgstr "Соответствующие теги не найдены" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "Файл 'config.yml' не обнаружен. Используется конфигурация по умолчанию." +msgstr "Не найдена минимальная версия SDK в {0}, используется версия по умолчанию (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1373,9 +1368,8 @@ msgid "No such versionCode {versionCode} for app {appid}" msgstr "Внутренней версии (versionCode) с номером {versionCode} для приложения {appid} не существует" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No tags found" -msgstr "Подключенных устройств не найдено" +msgstr "Теги не найдены" #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" @@ -1602,7 +1596,7 @@ msgstr "Удаление выбранных файлов" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "Удаление {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -1610,7 +1604,7 @@ msgstr "Переименовать все APK файлы, не соответс #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "Режим обновления RepoTrunk имеет смысл только в репозиториях git-svn" #: ../fdroidserver/update.py msgid "Report on build data status" @@ -1694,14 +1688,13 @@ msgstr[1] "Сканирование обнаружило {} ошибки" msgstr[2] "Сканирование обнаружило {} ошибок" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with apkanalyzer for known non-free classes." -msgstr "Проскандировать получившиеся APK на известные несвободные классы." +msgstr "Сканирование APK с помощью apkanalyzer на наличие известных несвободных классов." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "" +msgstr "Настройка NDK {release} ({version})" #: ../fdroidserver/common.py msgid "Set clock to that time using:" @@ -1749,7 +1742,7 @@ msgstr "Неверная подпись '{apkfilename}', пропустить!" #: ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "Пропуск зеркала GitLab Pages из-за слишком большого размера репозитория (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format @@ -1818,11 +1811,11 @@ msgstr "Системное время отстает от date в {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" +msgstr "Режим обновления тегов в настоящее время работает только для репозиториев git, hg, bzr и git-svn" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" +msgstr "Режим обновления тегов используется в git-svn, но репозиторий не был настроен с тегами" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." @@ -1891,6 +1884,13 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" +"Для завершения настройки добавьте свои APK в \"%s\"\n" +"затем запустите \"fdroid update -c; fdroid update\". Возможно, вы также захотите отредактировать\n" +"\"config.yml\", чтобы задать URL, имя репозитория и многое другое. Вам также следует установить\n" +"ключ подписи (временный ключ может быть сгенерирован автоматически).\n" +"\n" +"Дополнительная информация: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"и https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -1924,7 +1924,7 @@ msgstr "Неожиданная метка лицензии: \"{}\"! Исполь #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" +msgstr "Неожиданная цель симлинка: {link} -> {target}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2052,7 +2052,7 @@ msgstr "Неиспользованный scanignore-путь: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "Распаковка в %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -2238,9 +2238,8 @@ msgid "ambiguous option: %s (%s?)" msgstr "неоднозначный выбор: %s (%s?)" #: ../fdroidserver/common.py -#, fuzzy msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "apksigner не найден, он необходим для создания подписи!" +msgstr "apksigner не найден! Невозможно подписать или проверить актуальные APK-файлы" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2369,7 +2368,7 @@ msgstr "создан {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "текущая версия новее: old vercode={old}, new vercode={new}" #: ../fdroidserver/update.py #, python-brace-format @@ -2496,7 +2495,7 @@ msgstr "неверный синтаксис в строке параметра % #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "рецепт последней сборки более новый: old vercode={old}, new vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2541,9 +2540,8 @@ msgid "no version info found!" msgstr "определить версию не удалось!" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "no version information found" -msgstr "определить версию не удалось!" +msgstr "информация о версии не найдена" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2666,7 +2664,7 @@ msgstr "s3cmd синхронизировать индексы из {path} в {ur #: ../fdroidserver/scanner.py #, python-format msgid "scanner not cleanly run apkanalyzer: %s" -msgstr "" +msgstr "сканер не может начисто запустить apkanalyzer: %s" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2815,7 +2813,7 @@ msgstr "{appid} из {path} не годится в качестве имени #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid} содержит как APK, так и файлы: {files}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2899,9 +2897,9 @@ msgid "{path} more than 200MB, manually upload: {url}" msgstr "Размер {path} больше 200MB, загрузите его вручную на {url}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path}: {error}" -msgstr "Не удалось скопировать {path}: {error}" +msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format From 8451a0b9f781299c2817743755c4b82c13ec9a89 Mon Sep 17 00:00:00 2001 From: nautilusx Date: Thu, 17 Feb 2022 20:57:46 +0100 Subject: [PATCH 0579/2116] Translated using Weblate: German (de) by nautilusx Currently translated at 97.3% (596 of 612 strings) Translated using Weblate: German (de) by nautilusx Currently translated at 95.7% (586 of 612 strings) Co-authored-by: nautilusx Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index b496091f..5fb80666 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -100,7 +100,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "'{apkfilename}' ist bereits auf {dev} installiert." +msgstr "\"{apkfilename}\" ist bereits auf {dev} installiert." #: ../fdroidserver/update.py #, python-brace-format @@ -115,7 +115,7 @@ msgstr "{name} ({version}) in \"{path}\" ist aktuell" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" -msgstr "„{path}” vorhanden, aber S3cmd ist nicht installiert!" +msgstr "\"{path}” vorhanden, aber S3cmd ist nicht installiert!" #: ../fdroidserver/lint.py #, python-brace-format @@ -2737,7 +2737,7 @@ msgstr "kein \"icon\" in {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" -msgstr "Kein APK bereitgestellt" +msgstr "kein APK bereitgestellt" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2747,7 +2747,7 @@ msgstr "keine solche Option: %s" #: ../fdroid ../fdroidserver/__main__.py msgid "no version info found!" -msgstr "Keine Versionsinformationen gefunden!" +msgstr "keine Versionsinformation gefunden!" #: ../fdroidserver/checkupdates.py msgid "no version information found" From addc32e4ec88124fa41b0b422324ed60171dae0f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 15 Feb 2022 20:55:44 +0100 Subject: [PATCH 0580/2116] update required gradle versions for Android Gradle Plugin https://developer.android.com/studio/releases/gradle-plugin.html#updating-gradle --- gradlew-fdroid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 60e8b5d8..081c5fed 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -192,8 +192,8 @@ contains() { # (key) should accept. plugin versions are actually prefixes and catch sub- # versions as well. Pairs are taken from: # https://developer.android.com/studio/releases/gradle-plugin.html#updating-gradle -d_plugin_k=(4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 1.3 1.2 1.1 1.0 0.14 0.13 0.12 0.11 0.10 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2) -d_plugin_v=(6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) +d_plugin_k=(7.2 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 1.3 1.2 1.1 1.0 0.14 0.13 0.12 0.11 0.10 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2) +d_plugin_v=(7.3 7.2 7.0 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about plugin_v=(7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) From 01d1869d592ff25b642dc7f56ae5ab11f9b08dc6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 21 Feb 2022 22:41:18 +0100 Subject: [PATCH 0581/2116] nightly: fix "deploy key URL" that is printed to log output GitLab now uses the "/-/" form as the canonical. --- fdroidserver/nightly.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 79a2f404..ce363cf9 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -206,7 +206,7 @@ def main(): clone_url = os.getenv('CI_PROJECT_URL') + NIGHTLY repo_base = clone_url + '/raw/master/fdroid' servergitmirror = 'git@' + urlparse(clone_url).netloc + ':' + repo_git_base - deploy_key_url = clone_url + '/settings/repository' + deploy_key_url = clone_url + '/-/settings/repository#js-deploy-keys-settings' git_user_name = os.getenv('GITLAB_USER_NAME') git_user_email = os.getenv('GITLAB_USER_EMAIL') elif 'TRAVIS_REPO_SLUG' in os.environ: From d1fd58681e1f9edd4f05777b60a36a07c5167457 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 21 Feb 2022 22:40:22 +0100 Subject: [PATCH 0582/2116] nightly: stop stripping APKs before signing, apksigner does it * https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1033#note_742563869 * https://github.com/wardvl/f-droid-nightly-action/issues/3 --- fdroidserver/nightly.py | 1 - tests/common.TestCase | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index ce363cf9..b2ca69f2 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -349,7 +349,6 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, 'Resigning {apkfilename} with provided debug.keystore' ).format(apkfilename=os.path.basename(apkfilename)) ) - common.apk_strip_v1_signatures(apkfilename, strip_manifest=True) common.sign_apk(apkfilename, destapk, KEY_ALIAS) if options.verbose: diff --git a/tests/common.TestCase b/tests/common.TestCase index 37f50219..dcdaa20a 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -870,6 +870,46 @@ class CommonTest(unittest.TestCase): self.assertFalse(os.path.isfile(unsigned)) self.assertTrue(fdroidserver.common.verify_apk_signature(signed)) + def test_resign_apk(self): + """When using apksigner, it should resign signed APKs""" + config = fdroidserver.common.read_config(fdroidserver.common.options) + if 'apksigner' not in config: + self.skipTest('SKIPPING test_resign_apk, apksigner not installed!') + + config['keyalias'] = 'sova' + config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' + config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' + config['keystore'] = os.path.join(self.basedir, 'keystore.jks') + fdroidserver.common.config = config + fdroidserver.signindex.config = config + + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.chdir(testdir) + os.mkdir('unsigned') + os.mkdir('repo') + + for apk in ( + 'org.bitbucket.tickytacky.mirrormirror_4.apk', + 'v2.only.sig_2.apk', + 'SystemWebView-repack.apk', + ): + original = os.path.join(self.basedir, apk) + unsigned = os.path.join('unsigned', apk) + resign = os.path.join('repo', apk) + shutil.copy(original, unsigned) + fdroidserver.common.sign_apk(unsigned, resign, config['keyalias']) + self.assertTrue( + fdroidserver.common.verify_apk_signature(resign), apk + " verifies" + ) + self.assertTrue(os.path.isfile(resign)) + self.assertFalse(os.path.isfile(unsigned)) + self.assertNotEqual( + fdroidserver.common.get_first_signer_certificate(original), + fdroidserver.common.get_first_signer_certificate(resign) + ) + def test_get_apk_id(self): config = dict() fdroidserver.common.fill_config_defaults(config) From e38f7dad68aac51a507a459a3e5fda32429ba3fc Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 22 Feb 2022 22:16:20 +0100 Subject: [PATCH 0583/2116] locale: fix corrupt python formats --- locale/bo/LC_MESSAGES/fdroidserver.po | 8 ++++---- locale/es/LC_MESSAGES/fdroidserver.po | 8 ++++---- locale/fr/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/hu/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/it/LC_MESSAGES/fdroidserver.po | 8 ++++---- locale/ko/LC_MESSAGES/fdroidserver.po | 8 ++++---- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 8 ++++---- locale/pt/LC_MESSAGES/fdroidserver.po | 8 ++++---- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 8 ++++---- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 8 ++++---- locale/ro/LC_MESSAGES/fdroidserver.po | 8 ++++---- locale/sq/LC_MESSAGES/fdroidserver.po | 8 ++++---- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 8 ++++---- 13 files changed, 48 insertions(+), 48 deletions(-) diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index b994f072..74720eb1 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -1025,14 +1025,14 @@ msgid "Include the source tarballs in the mirror" msgstr "" #: ../fdroidserver/metadata.py -#, fuzzy, python-format +#, python-format msgid "Including metadata from %s@%s" -msgstr "ཁུངས་ལྡན་མིན་པའི་རྒྱབ་ལྗོངས་ཡིག་ཆའི་ནང་།%s 1:%d 2" +msgstr "" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Including metadata from {path}" -msgstr "ངོས་འཛིན་མི་ཐུབ་པའི་རྒྱབ་ལྗོངས་ཡིག་ཆའི་སྒྲིག་བཀོད། : {path}" +msgstr "" #: ../fdroidserver/common.py msgid "Initialising submodules" diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 3b46c730..13533014 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -1034,14 +1034,14 @@ msgid "Include the source tarballs in the mirror" msgstr "Incluir en el espejo los archivos tarball de código fuente" #: ../fdroidserver/metadata.py -#, fuzzy, python-format +#, python-format msgid "Including metadata from %s@%s" -msgstr "Metadatos no válidos en %s:%d" +msgstr "" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Including metadata from {path}" -msgstr "Formato de metadatos desconocido: {path}" +msgstr "" #: ../fdroidserver/common.py msgid "Initialising submodules" diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index c8c49394..d42851a0 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -1053,9 +1053,9 @@ msgid "Include the source tarballs in the mirror" msgstr "Inclure au miroir les tarballs de source" #: ../fdroidserver/metadata.py -#, fuzzy, python-format +#, python-format msgid "Including metadata from %s@%s" -msgstr "Métadonnées non valides dans %s:%d" +msgstr "" #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index 3eb151c7..aeb8d2f5 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -1027,9 +1027,9 @@ msgid "Include the source tarballs in the mirror" msgstr "A forráscsomagok belevétele a tükörbe" #: ../fdroidserver/metadata.py -#, fuzzy, python-format +#, python-format msgid "Including metadata from %s@%s" -msgstr "Érvénytelen metaadatok itt: %s:%d" +msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 75ac7844..ddc99107 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -1035,14 +1035,14 @@ msgid "Include the source tarballs in the mirror" msgstr "Includere i tarball dei sorgenti nel mirror" #: ../fdroidserver/metadata.py -#, fuzzy, python-format +#, python-format msgid "Including metadata from %s@%s" -msgstr "Metadati non validi in %s:%d" +msgstr "" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Including metadata from {path}" -msgstr "Formato dei metadati sconosciuto: {path}" +msgstr "" #: ../fdroidserver/common.py msgid "Initialising submodules" diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index 44ef8306..c9db0b6b 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -1013,14 +1013,14 @@ msgid "Include the source tarballs in the mirror" msgstr "" #: ../fdroidserver/metadata.py -#, fuzzy, python-format +#, python-format msgid "Including metadata from %s@%s" -msgstr "%s:%d에서 잘못된 메타데이터" +msgstr "" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Including metadata from {path}" -msgstr "알 수 없는 메타데이터 형식: {path}" +msgstr "" #: ../fdroidserver/common.py msgid "Initialising submodules" diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index 559bbbee..06aab5e8 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -1055,14 +1055,14 @@ msgid "Include the source tarballs in the mirror" msgstr "Inkluder kildetjæreballene i avspeilingen" #: ../fdroidserver/metadata.py -#, fuzzy, python-format +#, python-format msgid "Including metadata from %s@%s" -msgstr "Ugyldig metadata i %s:%d" +msgstr "" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Including metadata from {path}" -msgstr "Ukjent metadataformat: {path}" +msgstr "" #: ../fdroidserver/common.py msgid "Initialising submodules" diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 55601b47..56b05b7d 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -1028,14 +1028,14 @@ msgid "Include the source tarballs in the mirror" msgstr "Incluir os tarballs de fontes no espelho" #: ../fdroidserver/metadata.py -#, fuzzy, python-format +#, python-format msgid "Including metadata from %s@%s" -msgstr "Metadados inválidos em %s:%d" +msgstr "" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Including metadata from {path}" -msgstr "Formato de metadados desconhecido: {path}" +msgstr "" #: ../fdroidserver/common.py msgid "Initialising submodules" diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 2c6de286..290026fa 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -1033,14 +1033,14 @@ msgid "Include the source tarballs in the mirror" msgstr "Inclui os tarballs fonte no espelho" #: ../fdroidserver/metadata.py -#, fuzzy, python-format +#, python-format msgid "Including metadata from %s@%s" -msgstr "Metadados inválidos em %s: %d" +msgstr "" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Including metadata from {path}" -msgstr "Formato de metadados desconhecido: {path}" +msgstr "" #: ../fdroidserver/common.py msgid "Initialising submodules" diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 5c5369b6..2abe8404 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -1030,14 +1030,14 @@ msgid "Include the source tarballs in the mirror" msgstr "Incluir os tarballs de fontes no espelho" #: ../fdroidserver/metadata.py -#, fuzzy, python-format +#, python-format msgid "Including metadata from %s@%s" -msgstr "Metadados inválidos em %s:%d" +msgstr "" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Including metadata from {path}" -msgstr "Formato de metadados desconhecido: {path}" +msgstr "" #: ../fdroidserver/common.py msgid "Initialising submodules" diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 265d0c06..59b17550 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -1031,14 +1031,14 @@ msgid "Include the source tarballs in the mirror" msgstr "Includeți tarball-urile sursă în oglindă" #: ../fdroidserver/metadata.py -#, fuzzy, python-format +#, python-format msgid "Including metadata from %s@%s" -msgstr "Metadate nevalabile în %s:%d" +msgstr "" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Including metadata from {path}" -msgstr "Format de metadate necunoscut: {path}" +msgstr "" #: ../fdroidserver/common.py msgid "Initialising submodules" diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index 3a08464d..2fa20a16 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -1104,14 +1104,14 @@ msgid "Include the source tarballs in the mirror" msgstr "Përfshi te pasqyra paketa tarball" #: ../fdroidserver/metadata.py -#, fuzzy, python-format +#, python-format msgid "Including metadata from %s@%s" -msgstr "Tejtëdhëna të pavlefshme te %s:%d" +msgstr "" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Including metadata from {path}" -msgstr "Format i panjohur tejtëdhënash: {path}" +msgstr "" #: ../fdroidserver/common.py msgid "Initialising submodules" diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index a683ac24..84f6c898 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -1043,14 +1043,14 @@ msgid "Include the source tarballs in the mirror" msgstr "在鏡像中加入軟體的源代碼包。" #: ../fdroidserver/metadata.py -#, fuzzy, python-format +#, python-format msgid "Including metadata from %s@%s" -msgstr "%s 中有無效的中介資料 : %d" +msgstr "" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Including metadata from {path}" -msgstr "未知的中介資料格式t:{path}" +msgstr "" #: ../fdroidserver/common.py msgid "Initialising submodules" From 707cd7addbf4ea7d1f00da5718b374d3789765a8 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 21 Feb 2022 22:40:22 +0100 Subject: [PATCH 0584/2116] publish index-v1.json and include a gpg signature This gives a more flexible and direct way for many clients to consume the index file. #969 --- fdroidserver/deploy.py | 10 ++++++++++ fdroidserver/gpgsign.py | 2 +- tests/deploy.TestCase | 8 ++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 1ce9e141..a19bdeda 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -107,6 +107,8 @@ def update_awsbucket_s3cmd(repo_section): indexxml = os.path.join(repo_section, 'index.xml') indexjar = os.path.join(repo_section, 'index.jar') indexv1jar = os.path.join(repo_section, 'index-v1.jar') + indexv1json = os.path.join(repo_section, 'index-v1.json') + indexv1jsonasc = os.path.join(repo_section, 'index-v1.json.asc') s3url = s3bucketurl + '/fdroid/' logging.debug('s3cmd sync new files in ' + repo_section + ' to ' + s3url) @@ -116,6 +118,8 @@ def update_awsbucket_s3cmd(repo_section): '--exclude', indexxml, '--exclude', indexjar, '--exclude', indexv1jar, + '--exclude', indexv1json, + '--exclude', indexv1jsonasc, repo_section, s3url]) != 0: raise FDroidException() logging.debug('s3cmd sync all files in ' + repo_section + ' to ' + s3url) @@ -124,6 +128,8 @@ def update_awsbucket_s3cmd(repo_section): '--exclude', indexxml, '--exclude', indexjar, '--exclude', indexv1jar, + '--exclude', indexv1json, + '--exclude', indexv1jsonasc, repo_section, s3url]) != 0: raise FDroidException() @@ -251,6 +257,8 @@ def update_serverwebroot(serverwebroot, repo_section): indexxml = os.path.join(repo_section, 'index.xml') indexjar = os.path.join(repo_section, 'index.jar') indexv1jar = os.path.join(repo_section, 'index-v1.jar') + indexv1json = os.path.join(repo_section, 'index-v1.json') + indexv1jsonasc = os.path.join(repo_section, 'index-v1.json.asc') # Upload the first time without the index files and delay the deletion as # much as possible, that keeps the repo functional while this update is # running. Then once it is complete, rerun the command again to upload @@ -263,6 +271,8 @@ def update_serverwebroot(serverwebroot, repo_section): + ['--exclude', indexxml, '--exclude', indexjar, '--exclude', indexv1jar, + '--exclude', indexv1json, + '--exclude', indexv1jsonasc, repo_section, serverwebroot]) != 0: raise FDroidException() if subprocess.call(rsyncargs + [repo_section, serverwebroot]) != 0: diff --git a/fdroidserver/gpgsign.py b/fdroidserver/gpgsign.py index 447c3906..726805b6 100644 --- a/fdroidserver/gpgsign.py +++ b/fdroidserver/gpgsign.py @@ -67,7 +67,7 @@ def main(): for f in sorted(glob.glob(os.path.join(output_dir, '*.*'))): if common.get_file_extension(f) == 'asc': continue - if not common.is_repo_file(f): + if not common.is_repo_file(f) and not f.endswith('/index-v1.json'): continue filename = os.path.basename(f) sigfilename = filename + ".asc" diff --git a/tests/deploy.TestCase b/tests/deploy.TestCase index 54137949..f493d7ea 100755 --- a/tests/deploy.TestCase +++ b/tests/deploy.TestCase @@ -62,6 +62,10 @@ class DeployTest(unittest.TestCase): 'repo/index.jar', '--exclude', 'repo/index-v1.jar', + '--exclude', + 'repo/index-v1.json', + '--exclude', + 'repo/index-v1.json.asc', 'repo', 'example.com:/var/www/fdroid', ], @@ -143,6 +147,10 @@ class DeployTest(unittest.TestCase): 'archive/index.jar', '--exclude', 'archive/index-v1.jar', + '--exclude', + 'archive/index-v1.json', + '--exclude', + 'archive/index-v1.json.asc', 'archive', serverwebroot, ], From 5bf2c899575046eb4a8035939989983f1def96dd Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 22 Feb 2022 23:06:32 +0100 Subject: [PATCH 0585/2116] list .po files in the manifest, not .mo !1014 #934 --- locale/pick-complete-translations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locale/pick-complete-translations.py b/locale/pick-complete-translations.py index 3f343685..a866a231 100755 --- a/locale/pick-complete-translations.py +++ b/locale/pick-complete-translations.py @@ -44,7 +44,7 @@ with open(manifest_file) as fp: manifest_lines = set() for locale in active: - manifest_lines.add('include locale/%s/LC_MESSAGES/fdroidserver.mo\n' % locale) + manifest_lines.add('include locale/%s/LC_MESSAGES/fdroidserver.po\n' % locale) with open(manifest_file, 'a') as fp: for line in manifest_lines: From d566628ad8f003b231ec2c1763d1ab5de618ba52 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 22 Feb 2022 23:08:05 +0100 Subject: [PATCH 0586/2116] version 2.1 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 6c6041e0..1d2cf6c6 100755 --- a/setup.py +++ b/setup.py @@ -82,7 +82,7 @@ with open("README.md", "r") as fh: setup( name='fdroidserver', - version='2.1b0', + version='2.1', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From 14ab54636577a645a720ce30fa35f8d63ca55972 Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Sat, 26 Feb 2022 18:15:58 +0100 Subject: [PATCH 0587/2116] Fix CI for users with uppercase letters in username --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4131b8c2..cc59f2a8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -547,8 +547,8 @@ docker: services: - docker:dind variables: - TEST_IMAGE: registry.gitlab.com/$CI_PROJECT_NAMESPACE/${CI_PROJECT_NAME}:$CI_BUILD_REF_NAME - RELEASE_IMAGE: registry.gitlab.com/$CI_PROJECT_NAMESPACE/${CI_PROJECT_NAME}:buildserver + TEST_IMAGE: $CI_REGISTRY_IMAGE:$CI_BUILD_REF_NAME + RELEASE_IMAGE: $CI_REGISTRY_IMAGE:buildserver script: - cd buildserver - docker build -t $TEST_IMAGE --build-arg GIT_REV_PARSE_HEAD=$(git rev-parse HEAD) . From 8fb37445f29a670242d79b8665cc1a67ac3cdfc4 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 2 Mar 2022 10:21:20 +0100 Subject: [PATCH 0588/2116] Fix detection of binary files without extension Regression of fb61168c. --- fdroidserver/scanner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 45ed3918..34772a6d 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -398,7 +398,7 @@ def scan_source(build_dir, build=metadata.Build()): if not any(r.match(url) for r in allowed_repos): count += handleproblem('unknown maven repo \'%s\'' % url, path_in_build_dir, filepath) - elif curfile.endswith(('.', '.bin', '.out', '.exe')): + elif os.path.splitext(path_in_build_dir)[1] in ['', '.bin', '.out', '.exe']: if is_binary(filepath): count += handleproblem('binary', path_in_build_dir, filepath) From 47ce37888b4f234018d5222f270cd86fcf6fc70e Mon Sep 17 00:00:00 2001 From: linsui Date: Wed, 2 Mar 2022 00:42:10 +0800 Subject: [PATCH 0589/2116] Fix Gradle version for AGP --- gradlew-fdroid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 081c5fed..936b1b01 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -193,7 +193,7 @@ contains() { # versions as well. Pairs are taken from: # https://developer.android.com/studio/releases/gradle-plugin.html#updating-gradle d_plugin_k=(7.2 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 1.3 1.2 1.1 1.0 0.14 0.13 0.12 0.11 0.10 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2) -d_plugin_v=(7.3 7.2 7.0 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) +d_plugin_v=(7.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about plugin_v=(7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) From fdc88650eba58684c76a6bd520f99dc77db956c8 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Sun, 6 Mar 2022 16:42:56 +0100 Subject: [PATCH 0590/2116] Add support for Triple-T metadata in Flutter projects Closes: https://gitlab.com/fdroid/fdroidserver/-/issues/975 --- fdroidserver/update.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 8c87d5f9..83154ec8 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -844,6 +844,9 @@ def copy_triple_t_store_metadata(apps): gradle_subdirs.add(p) if not gradle_subdirs: gradle_subdirs.update(glob.glob(os.path.join('build', packageName, '*', 'src', '*', 'play'))) + if not gradle_subdirs: + # Flutter-style android subdir + gradle_subdirs.update(glob.glob(os.path.join('build', packageName, 'android', 'app', 'src', '*', 'play'))) for d in sorted(gradle_subdirs): logging.debug('Triple-T Gradle Play Publisher: ' + d) From 757e30ad8578f8581dc521d3f00989abbeda3288 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Sun, 6 Mar 2022 21:45:21 +0100 Subject: [PATCH 0591/2116] Add test case for Triple-T metadata in a Flutter project --- MANIFEST.in | 5 ++++ .../app/src/main/play/contact-website.txt | 1 + .../play/listings/en-US/full-description.txt | 11 +++++++ .../play/listings/en-US/short-description.txt | 1 + .../src/main/play/listings/en-US/title.txt | 1 + .../metadata/fr.emersion.goguma.yml | 30 +++++++++++++++++++ tests/update.TestCase | 24 +++++++++++++++ 7 files changed, 73 insertions(+) create mode 100644 tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/contact-website.txt create mode 100644 tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/full-description.txt create mode 100644 tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/short-description.txt create mode 100644 tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/title.txt create mode 100644 tests/triple-t-flutter/metadata/fr.emersion.goguma.yml diff --git a/MANIFEST.in b/MANIFEST.in index 33e3d78b..e05a92c3 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -833,6 +833,11 @@ include tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/i include tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/settings.gradle include tests/triple-t-anysoftkeyboard/metadata/com.anysoftkeyboard.languagepack.dutch.yml include tests/triple-t-anysoftkeyboard/metadata/com.menny.android.anysoftkeyboard.yml +include tests/triple-t-flutter/metadata/fr.emersion.goguma.yml +include tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/title.txt +include tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/short-description.txt +include tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/full-description.txt +include tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/contact-website.txt include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/settings.gradle include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src/main/play/listings/en-US/title.txt include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/main/play/listings/en-US/title.txt diff --git a/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/contact-website.txt b/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/contact-website.txt new file mode 100644 index 00000000..5c15e481 --- /dev/null +++ b/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/contact-website.txt @@ -0,0 +1 @@ +https://emersion.fr diff --git a/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/full-description.txt b/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/full-description.txt new file mode 100644 index 00000000..b72afe53 --- /dev/null +++ b/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/full-description.txt @@ -0,0 +1,11 @@ +An IRC client for mobile devices. + +Goals: + +
      +
    • Modern: support for many IRCv3 extensions, plus some special support for IRC bouncers.
    • +
    • Easy to use: offer a simple, straightforward interface.
    • +
    • Offline-first: users should be able to read past conversations while offline, and network disruptions should be handled transparently.
    • +
    • Lightweight: go easy on resource usage to run smoothly on older phones and save battery power.
    • +
    • Cross-platform: the main target platforms are Linux and Android.
    • +
    diff --git a/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/short-description.txt b/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/short-description.txt new file mode 100644 index 00000000..98eb88a5 --- /dev/null +++ b/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/short-description.txt @@ -0,0 +1 @@ +An IRC client for mobile devices diff --git a/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/title.txt b/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/title.txt new file mode 100644 index 00000000..d2f3b402 --- /dev/null +++ b/tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/title.txt @@ -0,0 +1 @@ +Goguma diff --git a/tests/triple-t-flutter/metadata/fr.emersion.goguma.yml b/tests/triple-t-flutter/metadata/fr.emersion.goguma.yml new file mode 100644 index 00000000..da1897fc --- /dev/null +++ b/tests/triple-t-flutter/metadata/fr.emersion.goguma.yml @@ -0,0 +1,30 @@ +Categories: + - Internet +License: AGPL-3.0-only +WebSite: https://sr.ht/~emersion/goguma +SourceCode: https://git.sr.ht/~emersion/goguma +IssueTracker: https://todo.sr.ht/~emersion/goguma + +AutoName: Goguma + +RepoType: git +Repo: https://git.sr.ht/~emersion/goguma + +Builds: + - versionName: 0.1.0 + versionCode: 1 + commit: 944d2d1e000901365392e850a98ee03f5dedba32 + output: build/app/outputs/flutter-apk/app-release.apk + srclibs: + - flutter@2.10.2 + build: + - $$flutter$$/bin/flutter config --no-analytics + - $$flutter$$/bin/flutter create --org fr.emersion --project-name goguma --platforms + android --no-overwrite . + - $$flutter$$/bin/flutter build apk --release --verbose + +AutoUpdateMode: Version +UpdateCheckMode: Tags +UpdateCheckData: pubspec.yaml|version:\s.+\+(\d+)|.|version:\s(.+)\+ +CurrentVersion: 0.1.0 +CurrentVersionCode: 1 diff --git a/tests/update.TestCase b/tests/update.TestCase index acc9f3b4..cc56f455 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -461,6 +461,30 @@ class UpdateTest(unittest.TestCase): app = apps[packageName] self.assertEqual(app['localized']['en-US']['name'], names[p]) + def test_insert_triple_t_flutter(self): + packageName = 'fr.emersion.goguma' + + tmptestsdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.rmdir(tmptestsdir) + shutil.copytree(os.path.join(self.basedir, 'triple-t-flutter'), tmptestsdir) + os.chdir(tmptestsdir) + + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.common.config = config + fdroidserver.update.config = config + fdroidserver.update.options = fdroidserver.common.options + + apps = fdroidserver.metadata.read_metadata() + self.assertTrue(packageName in apps) + fdroidserver.update.copy_triple_t_store_metadata(apps) + app = apps[packageName] + self.assertEqual(app['authorWebSite'], 'https://emersion.fr') + self.assertEqual(app['localized']['en-US']['name'], 'Goguma') + self.assertEqual(app['localized']['en-US']['summary'], 'An IRC client for mobile devices') + def javagetsig(self, apkfile): getsig_dir = 'getsig' if not os.path.exists(os.path.join(getsig_dir, "getsig.class")): From 0c390c943d2be4845b40e9f78d708296cd7a19a7 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 10 Mar 2022 09:51:36 +0100 Subject: [PATCH 0592/2116] [checkupdates] update submodules according to tag In case the version information is inside a submodule we need to checkout the submodule at the version of the tag we test. Found with org.courville.nova. Closes: #622 --- fdroidserver/checkupdates.py | 1 + tests/run-tests | 48 ++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index eb30693e..69b2f544 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -141,6 +141,7 @@ def check_tags(app, pattern): for tag in tags: logging.debug("Check tag: '{0}'".format(tag)) vcs.gotorevision(tag) + try_init_submodules(app, last_build, vcs) if app.UpdateCheckData: filecode, codeex, filever, verex = app.UpdateCheckData.split('|') diff --git a/tests/run-tests b/tests/run-tests index 460179ab..59fb08e5 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -1367,6 +1367,54 @@ $fdroid checkupdates --allow-dirty grep "CurrentVersionCode: 2" metadata/fake.yml +#------------------------------------------------------------------------------# +echo_header "checkupdates check version in submodule" + +ROOT=$(create_test_dir) +cd "$ROOT" +mkdir app sub +cd sub +$git init +echo 1 > ver +$git add ver +$git commit -m 1 + +cd ../app +$git init +$git submodule add "file://$(pwd)/../sub" +$git commit -am 1 +$git tag 1 + +cd ../sub +echo 2 > ver +$git commit -am 2 + +cd ../app +$git init +$git submodule update --remote +$git commit -am 2 + +cd .. +mkdir repo +mkdir metadata +cat > metadata/fake.yml < Date: Fri, 11 Mar 2022 09:03:03 +0100 Subject: [PATCH 0593/2116] Handle XML parser errors Found in checkupdates of com.dar.nclientv2. --- fdroidserver/common.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 4a436e01..664e5cc8 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1564,7 +1564,11 @@ def retrieve_string(app_dir, string, xmlfiles=None): for path in xmlfiles: if not os.path.isfile(path): continue - xml = parse_xml(path) + try: + xml = parse_xml(path) + except XMLElementTree.ParseError: + logging.warning(_("Problem with xml at '{path}'").format(path=path)) + continue element = xml.find('string[@name="' + name + '"]') if element is not None: content = element_content(element) @@ -1606,7 +1610,11 @@ def fetch_real_name(app_dir, flavours): if not path.endswith('.xml') or not os.path.isfile(path): continue logging.debug("fetch_real_name: Checking manifest at " + path) - xml = parse_xml(path) + try: + xml = parse_xml(path) + except XMLElementTree.ParseError: + logging.warning(_("Problem with xml at '{path}'").format(path=path)) + continue app = xml.find('application') if app is None: continue From bbb9242428488da03eca5036738ff0f215d41272 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Sun, 13 Mar 2022 08:50:50 +0000 Subject: [PATCH 0594/2116] gradle v7.4.1 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 936b1b01..d38483a5 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -176,6 +176,7 @@ get_sha() { '7.3.2') echo '23b89f8eac363f5f4b8336e0530c7295c55b728a9caa5268fdd4a532610d5392' ;; '7.3.3') echo 'b586e04868a22fd817c8971330fec37e298f3242eb85c374181b12d637f80302' ;; '7.4') echo '8cc27038d5dbd815759851ba53e70cf62e481b87494cc97cfd97982ada5ba634' ;; + '7.4.1') echo 'e5444a57cda4a95f90b0c9446a9e1b47d3d7f69057765bfb54bd4f482542d548' ;; *) exit 1 esac } @@ -196,7 +197,7 @@ d_plugin_k=(7.2 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1. d_plugin_v=(7.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 849e671353049ed14f29ffca1596ee00d17e2de4 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Tue, 15 Mar 2022 02:53:59 +0000 Subject: [PATCH 0595/2116] Add junrar to blocklist --- fdroidserver/scanner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 34772a6d..aa5e2375 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -83,6 +83,7 @@ NON_FREE_GRADLE_LINES = { r'cloudrail', r'com.tencent.bugly', r'appcenter-push', + r'com.github.junrar:junrar', ] } From 287fe1fb167ae10ce5be745199a094c417e042c0 Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Wed, 23 Mar 2022 12:30:28 +0000 Subject: [PATCH 0596/2116] Add NDK24 --- fdroidserver/common.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 664e5cc8..c2394c06 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4554,6 +4554,12 @@ NDKS = [ "revision": "23.1.7779620", "sha256": "c6e97f9c8cfe5b7be0a9e6c15af8e7a179475b7ded23e2d1c1fa0945d6fb4382", "url": "https://dl.google.com/android/repository/android-ndk-r23b-linux.zip" + }, + { + "release": "r24", + "revision": "24.0.8215888", + "sha256": "caac638f060347c9aae994e718ba00bb18413498d8e0ad4e12e1482964032997", + "url": "https://dl.google.com/android/repository/android-ndk-r24-linux.zip" } ] From a872d8688d027f35739f82f98027497297a25af8 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 29 Mar 2022 15:28:31 +0200 Subject: [PATCH 0597/2116] Fix pylint warnings --- fdroidserver/apksigcopier.py | 1 + fdroidserver/build.py | 3 ++- fdroidserver/common.py | 1 + fdroidserver/exception.py | 2 ++ fdroidserver/tail.py | 1 + fdroidserver/update.py | 6 +++++- 6 files changed, 12 insertions(+), 2 deletions(-) diff --git a/fdroidserver/apksigcopier.py b/fdroidserver/apksigcopier.py index 122f8302..adc3e507 100644 --- a/fdroidserver/apksigcopier.py +++ b/fdroidserver/apksigcopier.py @@ -99,6 +99,7 @@ class ReproducibleZipInfo(zipfile.ZipInfo): _override = {} # type: Dict[str, Union[int, Tuple[int, ...]]] def __init__(self, zinfo, **override): + super().__init__() if override: self._override = {**self._override, **override} for k in self.__slots__: diff --git a/fdroidserver/build.py b/fdroidserver/build.py index ec697398..d7cf8ca5 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -48,6 +48,8 @@ try: except ImportError: pass +buildserverid = None + # Note that 'force' here also implies test mode. def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): @@ -951,7 +953,6 @@ def parse_commandline(): options = None config = None -buildserverid = None fdroidserverid = None start_timestamp = time.gmtime() status_output = None diff --git a/fdroidserver/common.py b/fdroidserver/common.py index c2394c06..a4679ff6 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3257,6 +3257,7 @@ class ClonedZipInfo(zipfile.ZipInfo): """ def __init__(self, zinfo): + super().__init__() self.original = zinfo for k in self.__slots__: try: diff --git a/fdroidserver/exception.py b/fdroidserver/exception.py index 7e6e32ab..097f4f68 100644 --- a/fdroidserver/exception.py +++ b/fdroidserver/exception.py @@ -1,5 +1,6 @@ class FDroidException(Exception): def __init__(self, value=None, detail=None): + super().__init__() self.value = value self.detail = detail @@ -23,6 +24,7 @@ class FDroidException(Exception): class MetaDataException(Exception): def __init__(self, value): + super().__init__() self.value = value def __str__(self): diff --git a/fdroidserver/tail.py b/fdroidserver/tail.py index d6e09691..8107f10d 100644 --- a/fdroidserver/tail.py +++ b/fdroidserver/tail.py @@ -105,6 +105,7 @@ class Tail(object): class TailError(Exception): def __init__(self, msg): + super().__init__() self.message = msg def __str__(self): diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 83154ec8..4db8a2cc 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -2177,10 +2177,11 @@ def main(): apks += files appid_has_apks = set() appid_has_repo_files = set() + remove_apks = [] for apk in apks: to_remove = get_apks_without_allowed_signatures(apps.get(apk['packageName']), apk) if to_remove: - apks.remove(apk) + remove_apks.append(apk) logging.warning( _('"{path}" is signed by a key that is not allowed:').format( path=to_remove @@ -2217,6 +2218,9 @@ def main(): else: logging.warning(msg + '\n\t' + _('Use `fdroid update -c` to create it.')) + for apk in remove_apks: + apks.remove(apk) + mismatch_errors = '' for appid in appid_has_apks: if appid in appid_has_repo_files: From 6b28ce8b32a39584f9703bbc139041832900ab64 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Fri, 1 Apr 2022 13:02:45 +0000 Subject: [PATCH 0598/2116] gradle v7.4.2 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index d38483a5..1081607e 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -177,6 +177,7 @@ get_sha() { '7.3.3') echo 'b586e04868a22fd817c8971330fec37e298f3242eb85c374181b12d637f80302' ;; '7.4') echo '8cc27038d5dbd815759851ba53e70cf62e481b87494cc97cfd97982ada5ba634' ;; '7.4.1') echo 'e5444a57cda4a95f90b0c9446a9e1b47d3d7f69057765bfb54bd4f482542d548' ;; + '7.4.2') echo '29e49b10984e585d8118b7d0bc452f944e386458df27371b49b4ac1dec4b7fda' ;; *) exit 1 esac } @@ -197,7 +198,7 @@ d_plugin_k=(7.2 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1. d_plugin_v=(7.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From b6ea0d6acda5e9a88083ddfc273a536976dead2e Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sun, 10 Apr 2022 09:27:17 +0200 Subject: [PATCH 0599/2116] Consider namespace for applicationId > If the application ID is not explicitly defined using the > applicationId property, it automatically takes on the same value as > the namespace. https://developer.android.com/studio/build/configure-app-module Found in com.amanoteam.unalix, see: https://gitlab.com/fdroid/fdroiddata/-/merge_requests/10895#note_907080341 --- fdroidserver/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index a4679ff6..bf3e5ff2 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1670,7 +1670,7 @@ def remove_debuggable_flags(root_dir): vcsearch_g = re.compile(r'''\b[Vv]ersionCode\s*=?\s*["'(]*([0-9][0-9_]*)["')]*''').search vnsearch_g = re.compile(r'''\b[Vv]ersionName\s*=?\s*\(?(["'])((?:(?=(\\?))\3.)*?)\1''').search vnssearch_g = re.compile(r'''\b[Vv]ersionNameSuffix\s*=?\s*(["'])((?:(?=(\\?))\3.)*?)\1''').search -psearch_g = re.compile(r'''\b(packageName|applicationId)\s*=*\s*["']([^"']+)["']''').search +psearch_g = re.compile(r'''\b(packageName|applicationId|namespace)\s*=*\s*["']([^"']+)["']''').search fsearch_g = re.compile(r'''\b(applicationIdSuffix)\s*=*\s*["']([^"']+)["']''').search From 1df6b1db905e0328305515e20796f183e7501904 Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Tue, 12 Apr 2022 09:59:27 +0000 Subject: [PATCH 0600/2116] Import - some fixes for flutter apps --- fdroidserver/import.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fdroidserver/import.py b/fdroidserver/import.py index adf18252..0b615fc8 100644 --- a/fdroidserver/import.py +++ b/fdroidserver/import.py @@ -227,7 +227,9 @@ def main(): app.License = data.get('license', app.License) app.Description = data.get('description', app.Description) build.srclibs = ['flutter@stable'] - build.output = 'build/app/outputs/apk/release/app-release.apk' + build.output = 'build/app/outputs/apk/release/app-release-unsigned.apk' + build.subdir = None + build.gradle = None build.build = [ '$$flutter$$/bin/flutter config --no-analytics', '$$flutter$$/bin/flutter packages pub get', From c19f46b706adaed10c7d296439f93e964c844e15 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 14 Apr 2022 12:47:27 +0200 Subject: [PATCH 0601/2116] [checkupdates] move gradle var check to parser 3638acddc added a check if the version name string is actually a unresolved gradle variable. This moves the check into the common.parse_androidmanifests() as it is the only where the it could happen. This also resolves the case where checkupdates returns "Unknown". Closes: #751 --- fdroidserver/checkupdates.py | 6 ------ fdroidserver/common.py | 25 +++++++++++++++++++------ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 69b2f544..86a18c2e 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -455,12 +455,6 @@ def checkupdates_app(app): vercode = str(common.calculate_math_string(op)) logging.debug("Applied vercode operation: %s -> %s" % (oldvercode, vercode)) - if version and any(version.startswith(s) for s in [ - '${', # Gradle variable names - '@string/', # Strings we could not resolve - ]): - version = "Unknown" - updating = False if version is None: raise FDroidException(_('no version information found')) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index bf3e5ff2..61285c08 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1703,6 +1703,18 @@ def parse_androidmanifests(paths, app): max_vercode = None max_package = None + def vnsearch(line): + matches = vnsearch_g(line) + if matches and not any( + matches.group(2).startswith(s) + for s in [ + '${', # Gradle variable names + '@string/', # Strings we could not resolve + ] + ): + return matches.group(2) + return None + for path in paths: # TODO: Remove this in Python3.6 path = str(path) @@ -1735,9 +1747,9 @@ def parse_androidmanifests(paths, app): temp_app_id = matches.group(2) if "versionName" in line and not temp_version_name: - matches = vnsearch_g(line) + matches = vnsearch(line) if matches: - temp_version_name = matches.group(2) + temp_version_name = matches if inside_flavour_group > 0: if inside_required_flavour > 1: @@ -1755,9 +1767,10 @@ def parse_androidmanifests(paths, app): if app_matches_packagename(app, temp_app_id): package = temp_app_id - matches = vnsearch_g(line) + matches = vnsearch(line) if matches: - version = matches.group(2) + version = matches + else: # If build.gradle contains applicationNameSuffix add it to the end of version name matches = vnssearch_g(line) @@ -1799,9 +1812,9 @@ def parse_androidmanifests(paths, app): if app_matches_packagename(app, s): package = s if not version: - matches = vnsearch_g(line) + matches = vnsearch(line) if matches: - version = matches.group(2) + version = matches if not vercode: matches = vcsearch_g(line) if matches: From 9721b60d7cfe354bc1a94ca612db842033d38e17 Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Thu, 3 Mar 2022 13:40:02 +0100 Subject: [PATCH 0602/2116] Use buildserver image from fdroidserver This is derived from the "fdroid build" job in fdroiddata --- .gitlab-ci.yml | 61 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cc59f2a8..dda4ccc0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -330,11 +330,10 @@ gradle/ndk: # Run an actual build in a simple, faked version of the buildserver guest VM. fdroid build: - image: registry.gitlab.com/fdroid/ci-images-client + image: registry.gitlab.com/fdroid/fdroidserver:buildserver only: changes: - .gitlab-ci.yml - - buildserver/provision-apt-get-install - fdroidserver/build.py - fdroidserver/common.py - fdroidserver/exception.py @@ -347,33 +346,47 @@ fdroid build: paths: - .gradle script: - - bash buildserver/provision-apt-get-install http://deb.debian.org/debian + - apt-get update - apt-get dist-upgrade - - apt-get install -t stretch-backports - python3-asn1crypto - python3-pip - python3-ruamel.yaml - python3-setuptools - python3-venv - - apt-get purge fdroidserver - - pyvenv env --system-site-packages - - . env/bin/activate - - $pip install -e . - - export PATH="$CI_PROJECT_DIR:$PATH" - - export PYTHONPATH=$CI_PROJECT_DIR - - export PYTHONUNBUFFERED=true + - apt-get clean - - git clone https://gitlab.com/fdroid/fdroiddata.git --depth 1 + - test -n "$fdroidserver" || source /etc/profile.d/bsenv.sh + + - ln -fsv "$CI_PROJECT_DIR" "$fdroidserver" + + # TODO remove sdkmanager install once it is included in the buildserver image + - pip3 install git+https://gitlab.com/fdroid/sdkmanager.git@0.5.2 + - rm -rf "$ANDROID_HOME/tools" # TODO remove once sdkmanager can upgrade installed packages + - sdkmanager "tools" "platform-tools" "build-tools;31.0.0" + + - git ls-remote https://gitlab.com/fdroid/fdroiddata.git master + - git clone --depth 1 https://gitlab.com/fdroid/fdroiddata.git - cd fdroiddata - - test -d build || mkdir build + - for d in build logs repo tmp unsigned $home_vagrant/.android; do + test -d $d || mkdir $d; + chown -R vagrant $d; + done - - export GRADLE_USER_HOME=$CI_PROJECT_DIR/.gradle - # try a user build first - - fdroid build --verbose --latest org.fdroid.fdroid.privileged - # each `fdroid build --on-server` run expects sudo, then uninstalls it - - apt-get install sudo + - export GRADLE_USER_HOME=$home_vagrant/.gradle + - export fdroid="sudo --preserve-env --user vagrant + env PATH=$fdroidserver:$PATH + env PYTHONPATH=$fdroidserver:$fdroidserver/examples + env PYTHONUNBUFFERED=true + env TERM=$TERM + env HOME=$home_vagrant + fdroid" + + - chown -R vagrant $home_vagrant + + # try user build + - $fdroid build --verbose --latest org.fdroid.fdroid.privileged + + # try on-server build - currentVersionCode=`python3 -c "import yaml; print(yaml.load(open('metadata/org.fdroid.fdroid.yml'))['CurrentVersionCode'])"` - - fdroid build --verbose --on-server --no-tarball org.fdroid.fdroid:$currentVersionCode + - $fdroid build --verbose --on-server --no-tarball org.fdroid.fdroid:$currentVersionCode + + # each `fdroid build --on-server` run expects sudo, then uninstalls it + - ! dpkg --list sudo # test the plugin API and specifically the fetchsrclibs plugin, which From 3027dc014ed2432028f8bb4490d631c53eb5619d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 18 Apr 2022 14:35:21 +0200 Subject: [PATCH 0603/2116] gitlab-ci: fix sudo test in "fdroid build" job --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index dda4ccc0..2320696f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -386,7 +386,7 @@ fdroid build: - $fdroid build --verbose --on-server --no-tarball org.fdroid.fdroid:$currentVersionCode # each `fdroid build --on-server` run expects sudo, then uninstalls it - - ! dpkg --list sudo + - if dpkg --list sudo; then echo "sudo should not be still there"; exit 1; fi # test the plugin API and specifically the fetchsrclibs plugin, which From 65cd3e3b0aaba0839ae0afc0d1c109e8607b2b0f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 20 Apr 2022 15:14:23 +0200 Subject: [PATCH 0604/2116] gitlab-ci: tag docker buildserver image with "stretch" This should make the migration to bullseye easier because we'll have a fallback stretch image available as needed. !1012 --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2320696f..a1266302 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -566,5 +566,7 @@ docker: - cd buildserver - docker build -t $TEST_IMAGE --build-arg GIT_REV_PARSE_HEAD=$(git rev-parse HEAD) . - docker tag $TEST_IMAGE $RELEASE_IMAGE + - docker tag $TEST_IMAGE ${RELEASE_IMAGE}-stretch - echo $CI_BUILD_TOKEN | docker login -u gitlab-ci-token --password-stdin registry.gitlab.com - docker push $RELEASE_IMAGE + - docker push $RELEASE_IMAGE-stretch From 5f3eb601df6073fc20bf977967b09328e3c8d5e5 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 21 Apr 2022 09:54:30 +0200 Subject: [PATCH 0605/2116] Add check for repo/archive_url --- examples/config.yml | 2 ++ fdroidserver/common.py | 8 ++++++ tests/common.TestCase | 57 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/examples/config.yml b/examples/config.yml index c66d157f..67e5d5b9 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -48,6 +48,8 @@ # The same policy is applied to the archive repo, if there is one. # repo_maxage: 0 +# Canonical URL of the repositoy, needs to end in /repo. Is is used to identity +# the repo in the client, as well. # repo_url: https://MyFirstFDroidRepo.org/fdroid/repo # repo_name: My First F-Droid Repo Demo # repo_description: >- diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 61285c08..2658d4a4 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -433,6 +433,14 @@ def read_config(opts=None): limit = config['git_mirror_size_limit'] config['git_mirror_size_limit'] = parse_human_readable_size(limit) + if 'repo_url' in config: + if not config['repo_url'].endswith('/repo'): + raise FDroidException(_('repo_url needs to end with /repo')) + + if 'archive_url' in config: + if not config['archive_url'].endswith('/archive'): + raise FDroidException(_('archive_url needs to end with /archive')) + confignames_to_delete = set() for configname, dictvalue in config.items(): if configname == 'java_paths': diff --git a/tests/common.TestCase b/tests/common.TestCase index dcdaa20a..be2a04bd 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1845,6 +1845,63 @@ class CommonTest(unittest.TestCase): config = fdroidserver.common.read_config(fdroidserver.common.options) self.assertEqual('yml', config.get('apksigner')) + def test_config_repo_url(self): + """repo_url ends in /repo, archive_url ends in /archive.""" + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.chdir(testdir) + with open('config.yml', 'w') as fp: + fp.write('repo_url: https://MyFirstFDroidRepo.org/fdroid/repo\n') + fp.write('archive_url: https://MyFirstFDroidRepo.org/fdroid/archive') + config = fdroidserver.common.read_config() + self.assertEqual('https://MyFirstFDroidRepo.org/fdroid/repo', config.get('repo_url')) + self.assertEqual('https://MyFirstFDroidRepo.org/fdroid/archive', config.get('archive_url')) + + def test_config_repo_url_extra_slash(self): + """repo_url ends in /repo, archive_url ends in /archive.""" + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.chdir(testdir) + with open('config.yml', 'w') as fp: + fp.write('repo_url: https://MyFirstFDroidRepo.org/fdroid/repo/') + with self.assertRaises(FDroidException): + fdroidserver.common.read_config() + + def test_config_repo_url_not_repo(self): + """repo_url ends in /repo, archive_url ends in /archive.""" + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.chdir(testdir) + with open('config.yml', 'w') as fp: + fp.write('repo_url: https://MyFirstFDroidRepo.org/fdroid/foo') + with self.assertRaises(FDroidException): + fdroidserver.common.read_config() + + def test_config_archive_url_extra_slash(self): + """repo_url ends in /repo, archive_url ends in /archive.""" + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.chdir(testdir) + with open('config.yml', 'w') as fp: + fp.write('archive_url: https://MyFirstFDroidRepo.org/fdroid/archive/') + with self.assertRaises(FDroidException): + fdroidserver.common.read_config() + + def test_config_archive_url_not_repo(self): + """repo_url ends in /repo, archive_url ends in /archive.""" + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.chdir(testdir) + with open('config.yml', 'w') as fp: + fp.write('archive_url: https://MyFirstFDroidRepo.org/fdroid/foo') + with self.assertRaises(FDroidException): + fdroidserver.common.read_config() + def test_write_to_config_yml(self): testdir = tempfile.mkdtemp( prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir From 253f2e5fef212fbe169395e51358cf2fb8e07e30 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 11 Apr 2022 10:18:38 +0200 Subject: [PATCH 0606/2116] [scanner] Deep copy json structs (Closes: #985) The lists in the DEFAULT_JSON_PER_BUILD where only initialized and thus shared between builds resulting in accumulating the entries over all versions. As per 2f5d780c4 DEFAULT_JSON_PER_BUILD is used as an API, so use deepcopy to work around it. --- fdroidserver/scanner.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index aa5e2375..62570d9d 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -23,6 +23,7 @@ import re import sys import traceback from argparse import ArgumentParser +from copy import deepcopy import logging import itertools @@ -35,7 +36,7 @@ config = None options = None DEFAULT_JSON_PER_BUILD = {'errors': [], 'warnings': [], 'infos': []} # type: ignore -json_per_build = DEFAULT_JSON_PER_BUILD +json_per_build = deepcopy(DEFAULT_JSON_PER_BUILD) MAVEN_URL_REGEX = re.compile(r"""\smaven\s*{.*?(?:setUrl|url)\s*=?\s*(?:uri)?\(?\s*["']?([^\s"']+)["']?[^}]*}""", re.DOTALL) @@ -479,7 +480,7 @@ def main(): else: logging.info(_("{appid}: no builds specified, running on current source state") .format(appid=appid)) - json_per_build = DEFAULT_JSON_PER_BUILD + json_per_build = deepcopy(DEFAULT_JSON_PER_BUILD) json_per_appid['current-source-state'] = json_per_build count = scan_source(build_dir) if count > 0: @@ -489,7 +490,7 @@ def main(): app['Builds'] = [] for build in app.get('Builds', []): - json_per_build = DEFAULT_JSON_PER_BUILD + json_per_build = deepcopy(DEFAULT_JSON_PER_BUILD) json_per_appid[build.versionCode] = json_per_build if build.disable and not options.force: From c6fddebecd2eae13a4451f0f5e04684d695463cc Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 21 Apr 2022 15:36:03 +0200 Subject: [PATCH 0607/2116] buildserver: disable flutter dev/build analytics globally The Flutter dev tools includes opt-out analytics, with a config option to opt out. We can at least try to disable them in the buildserver. That config option is unfortunately not even guaranteed to work: https://github.com/flutter/flutter/issues/19304 https://github.com/flutter/flutter/issues/45369 issuebot#21 issuebot!49 https://github.com/flutter/flutter/issues/73657 --- buildserver/Vagrantfile | 1 + buildserver/provision-disable-analytics | 15 +++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 buildserver/provision-disable-analytics diff --git a/buildserver/Vagrantfile b/buildserver/Vagrantfile index 02fadf8d..8a0e8b67 100644 --- a/buildserver/Vagrantfile +++ b/buildserver/Vagrantfile @@ -86,6 +86,7 @@ Vagrant.configure("2") do |config| config.vm.provision "shell", name: "android-ndk", path: "provision-android-ndk", args: ["/opt/android-sdk/ndk", "r21e", "r23b"] config.vm.provision "shell", name: "gradle", path: "provision-gradle" + config.vm.provision "shell", name: "disable-analytics", path: "provision-disable-analytics" config.vm.provision "shell", name: "buildserverid", path: "provision-buildserverid", args: [`git rev-parse HEAD`] diff --git a/buildserver/provision-disable-analytics b/buildserver/provision-disable-analytics new file mode 100644 index 00000000..5be736a6 --- /dev/null +++ b/buildserver/provision-disable-analytics @@ -0,0 +1,15 @@ +#!/bin/bash + +set -ex + +# Flutter +# https://github.com/flutter/flutter/issues/73657 +flutter_conf=/home/vagrant/.flutter +cat < $flutter_conf +{ + "enabled": false +} +EOF +chown -R vagrant.vagrant $flutter_conf +chmod -R 0644 $flutter_conf + From 483bbecf3e71311eec14e3370e3f8f3ff2829079 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 22 Apr 2022 14:26:55 +0200 Subject: [PATCH 0608/2116] [CI] Bump client build to fix CI failure --- .gitlab-ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a1266302..2ce215bc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -382,8 +382,7 @@ fdroid build: - $fdroid build --verbose --latest org.fdroid.fdroid.privileged # try on-server build - - currentVersionCode=`python3 -c "import yaml; print(yaml.load(open('metadata/org.fdroid.fdroid.yml'))['CurrentVersionCode'])"` - - $fdroid build --verbose --on-server --no-tarball org.fdroid.fdroid:$currentVersionCode + - $fdroid build --verbose --on-server --no-tarball --latest org.fdroid.fdroid # each `fdroid build --on-server` run expects sudo, then uninstalls it - if dpkg --list sudo; then echo "sudo should not be still there"; exit 1; fi From 46f4205fffc3fb090de466e5e7ddfd04ae8d13c6 Mon Sep 17 00:00:00 2001 From: Sergey Bobrenok Date: Sun, 24 Apr 2022 16:33:33 +0300 Subject: [PATCH 0609/2116] Avoid zero-length prefixes in PATH A zero-length prefix in PATH is a legacy feature that indicates the current working directory. https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03 Found in ru.nsu.bobrofon.easysshfs, see: https://gitlab.com/fdroid/fdroiddata/-/merge_requests/10953#note_921802636 --- fdroidserver/common.py | 2 +- tests/common.TestCase | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 2658d4a4..403bb74d 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3006,7 +3006,7 @@ def set_FDroidPopen_env(build=None): if build is not None: path = build.ndk_path() paths = orig_path.split(os.pathsep) - if path not in paths: + if path and path not in paths: paths = [path] + paths env['PATH'] = os.pathsep.join(paths) for n in ['ANDROID_NDK', 'NDK', 'ANDROID_NDK_HOME']: diff --git a/tests/common.TestCase b/tests/common.TestCase index be2a04bd..a29920be 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -2364,6 +2364,14 @@ class CommonTest(unittest.TestCase): "%s_%s.exe" % (app.id, build.versionCode), ) + def test_no_zero_length_ndk_path_prefixes(self): + fdroidserver.common.config = {'ndk_paths': {}} + build = fdroidserver.metadata.Build() + + os.environ['PATH'] = '/usr/bin:/usr/sbin' + fdroidserver.common.set_FDroidPopen_env(build) + self.assertNotIn('', os.getenv('PATH').split(os.pathsep)) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From d05bcafe14b6ed4e2e8864dfac45ae97f353e865 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sun, 10 Apr 2022 20:03:08 +0200 Subject: [PATCH 0610/2116] Test index before signing --- fdroidserver/signindex.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/fdroidserver/signindex.py b/fdroidserver/signindex.py index a586c92b..c1a53b89 100644 --- a/fdroidserver/signindex.py +++ b/fdroidserver/signindex.py @@ -16,6 +16,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import json import os import time import zipfile @@ -24,6 +25,7 @@ import logging from . import _ from . import common +from . import metadata from .exception import FDroidException config = None @@ -78,6 +80,12 @@ def sign_index_v1(repodir, json_name): """ name, ext = common.get_extension(json_name) index_file = os.path.join(repodir, json_name) + + # Test if index is valid + with open(index_file, encoding="utf-8") as fp: + index = json.load(fp) + [metadata.App(app) for app in index["apps"]] + jar_file = os.path.join(repodir, name + '.jar') with zipfile.ZipFile(jar_file, 'w', zipfile.ZIP_DEFLATED) as jar: jar.write(index_file, json_name) From 9f477dee560144fa10f1be94b1004c101b29ccbc Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 25 Apr 2022 22:25:32 +0200 Subject: [PATCH 0611/2116] signindex: added simple test case --- .gitlab-ci.yml | 1 + MANIFEST.in | 1 + tests/signindex.TestCase | 75 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+) create mode 100755 tests/signindex.TestCase diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2ce215bc..e571652e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -246,6 +246,7 @@ black: tests/metadata.TestCase tests/ndk-release-checksums.py tests/rewritemeta.TestCase + tests/signindex.TestCase fedora_latest: diff --git a/MANIFEST.in b/MANIFEST.in index e05a92c3..87b82802 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -695,6 +695,7 @@ include tests/rewritemeta.TestCase include tests/run-tests include tests/scanner.TestCase include tests/signatures.TestCase +include tests/signindex.TestCase include tests/signindex/guardianproject.jar include tests/signindex/guardianproject-v1.jar include tests/signindex/testy.jar diff --git a/tests/signindex.TestCase b/tests/signindex.TestCase new file mode 100755 index 00000000..84b19655 --- /dev/null +++ b/tests/signindex.TestCase @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 + +import inspect +import json +import logging +import optparse +import os +import shutil +import sys +import tempfile +import unittest + +localmodule = os.path.realpath( + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) +print('localmodule: ' + localmodule) +if localmodule not in sys.path: + sys.path.insert(0, localmodule) + +from fdroidserver import common, signindex +from pathlib import Path + + +class SignindexTest(unittest.TestCase): + + basedir = Path(__file__).resolve().parent + + def setUp(self): + signindex.config = None + config = common.read_config(common.options) + config['jarsigner'] = common.find_sdk_tools_cmd('jarsigner') + config['verbose'] = True + config['keystore'] = str(self.basedir / 'keystore.jks') + config['repo_keyalias'] = 'sova' + config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' + config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' + signindex.config = config + + logging.basicConfig(level=logging.DEBUG) + self.tempdir = tempfile.TemporaryDirectory() + os.chdir(self.tempdir.name) + self.repodir = Path('repo') + self.repodir.mkdir() + + def tearDown(self): + self.tempdir.cleanup() + + def test_sign_index_v1(self): + shutil.copy(str(self.basedir / 'repo/index-v1.json'), 'repo') + signindex.sign_index_v1(str(self.repodir), 'index-v1.json') + self.assertTrue((self.repodir / 'index-v1.jar').exists()) + + def test_sign_index_v1_corrupt(self): + with open('repo/index-v1.json', 'w') as fp: + fp.write('corrupt JSON!') + with self.assertRaises(json.decoder.JSONDecodeError, msg='error on bad JSON'): + signindex.sign_index_v1(str(self.repodir), 'index-v1.json') + + +if __name__ == "__main__": + os.chdir(os.path.dirname(__file__)) + + parser = optparse.OptionParser() + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) + (common.options, args) = parser.parse_args(['--verbose']) + + newSuite = unittest.TestSuite() + newSuite.addTest(unittest.makeSuite(SignindexTest)) + unittest.main(failfast=False) From e678df14ce03465ae2b2cb007cd6491327442569 Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Fri, 8 Apr 2022 14:13:32 +0300 Subject: [PATCH 0612/2116] buildserver: remove old LTS NDK and only pre-install current LTS --- buildserver/Vagrantfile | 2 +- makebuildserver | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/buildserver/Vagrantfile b/buildserver/Vagrantfile index 8a0e8b67..09fed05d 100644 --- a/buildserver/Vagrantfile +++ b/buildserver/Vagrantfile @@ -84,7 +84,7 @@ Vagrant.configure("2") do |config| args: [configfile['debian_mirror']] config.vm.provision "shell", name: "android-sdk", path: "provision-android-sdk" config.vm.provision "shell", name: "android-ndk", path: "provision-android-ndk", - args: ["/opt/android-sdk/ndk", "r21e", "r23b"] + args: ["/opt/android-sdk/ndk", "r23b"] config.vm.provision "shell", name: "gradle", path: "provision-gradle" config.vm.provision "shell", name: "disable-analytics", path: "provision-disable-analytics" config.vm.provision "shell", name: "buildserverid", path: "provision-buildserverid", diff --git a/makebuildserver b/makebuildserver index b373383a..1c419872 100755 --- a/makebuildserver +++ b/makebuildserver @@ -302,8 +302,6 @@ CACHE_FILES = [ '7faa7198769f872826c8ef4f1450f839ec27f0b4d5d1e51bade63667cbccd205'), ('https://services.gradle.org/distributions/gradle-7.0.2-bin.zip', '0e46229820205440b48a5501122002842b82886e76af35f0f3a069243dca4b3c'), - ('https://dl.google.com/android/repository/android-ndk-r21e-linux-x86_64.zip', - 'ad7ce5467e18d40050dc51b8e7affc3e635c85bd8c59be62de32352328ed467e'), ('https://dl.google.com/android/repository/android-ndk-r23b-linux.zip', 'c6e97f9c8cfe5b7be0a9e6c15af8e7a179475b7ded23e2d1c1fa0945d6fb4382'), ] From 189ff9cd7bdbd56be86ce9c23c252477775af5fa Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 26 Apr 2022 10:25:04 +0200 Subject: [PATCH 0613/2116] build: improve error message when NDK SHA-256 does not match --- fdroidserver/common.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 403bb74d..3c4eeb2d 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4341,8 +4341,9 @@ def _install_ndk(ndk): os.path.basename(url) ) net.download_file(url, zipball) - if sha256 != sha256sum(zipball): - raise FDroidException('SHA-256 %s does not match expected for %s' % (sha256, url)) + calced = sha256sum(zipball) + if sha256 != calced: + raise FDroidException('SHA-256 %s does not match expected for %s (%s)' % (calced, url, sha256)) logging.info(_('Unzipping to %s') % ndk_base) with zipfile.ZipFile(zipball) as zipfp: for info in zipfp.infolist(): From 23d9f0ed5054fe8a6ef5e7874b7d5425e7de8eae Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 2 May 2022 14:20:57 +0200 Subject: [PATCH 0614/2116] mirror-to-mirror.sh: replace mirror.f-droid.org with ftp.agdsn.de * ftp.agdsn.de is a new official mirror that receives push updates. * mirror.f-droid.org is no more, it is now a DNS round robin redirector. admin#247 admin#298 [skip ci] --- examples/mirror-to-mirror.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/mirror-to-mirror.sh b/examples/mirror-to-mirror.sh index 7799c020..71b66f11 100644 --- a/examples/mirror-to-mirror.sh +++ b/examples/mirror-to-mirror.sh @@ -15,7 +15,7 @@ set -e cd /home/fdroid for section in repo archive; do echo "Started $section at `date`:" - for host in fdroid@ftp-push.lysator.liu.se fdroid@plug-mirror.rcac.purdue.edu fdroid@mirror.f-droid.org; do + for host in fdroid@ftp-push.lysator.liu.se fdroid@plug-mirror.rcac.purdue.edu fdroid@ftp.agdsn.de; do set -x # be super careful with the trailing slashes here! if one is wrong, it'll delete the entire section! rsync --archive --delay-updates --progress --delete \ From 9c8e1280644be085c324a6e0fbb8355f82d6e945 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 21 Apr 2022 21:49:08 +0200 Subject: [PATCH 0615/2116] [scanner] replace apkanalyzer by dexdump --- .gitlab-ci.yml | 2 +- fdroidserver/scanner.py | 66 ++++++++++++++++++++++------------------- tests/scanner.TestCase | 23 ++++++++++++++ 3 files changed, 59 insertions(+), 32 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e571652e..177a8f18 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -122,7 +122,7 @@ ubuntu_bionic_pip: image: ubuntu:bionic <<: *apt-template script: - - apt-get install git default-jdk-headless python3-pip python3-venv rsync zipalign libarchive13 + - apt-get install git default-jdk-headless python3-pip python3-venv rsync zipalign libarchive13 dexdump - rm -rf env - pyvenv env - . env/bin/activate diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 62570d9d..68a274e0 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -22,8 +22,10 @@ import os import re import sys import traceback +import zipfile from argparse import ArgumentParser from copy import deepcopy +from tempfile import TemporaryDirectory import logging import itertools @@ -42,19 +44,13 @@ MAVEN_URL_REGEX = re.compile(r"""\smaven\s*{.*?(?:setUrl|url)\s*=?\s*(?:uri)?\(? re.DOTALL) CODE_SIGNATURES = { - # The `apkanalyzer dex packages` output looks like this: - # M d 1 1 93 - # The first column has P/C/M/F for package, class, method or field - # The second column has x/k/r/d for removed, kept, referenced and defined. - # We already filter for defined only in the apkanalyzer call. 'r' will be - # for things referenced but not distributed in the apk. - exp: re.compile(r'.[\s]*d[\s]*[0-9]*[\s]*[0-9*][\s]*[0-9]*[\s]*' + exp, re.IGNORECASE) for exp in [ - r'(com\.google\.firebase[^\s]*)', - r'(com\.google\.android\.gms[^\s]*)', - r'(com\.google\.android\.play\.core[^\s]*)', - r'(com\.google\.tagmanager[^\s]*)', - r'(com\.google\.analytics[^\s]*)', - r'(com\.android\.billing[^\s]*)', + exp: re.compile(r'.*' + exp, re.IGNORECASE) for exp in [ + r'com/google/firebase', + r'com/google/android/gms', + r'com/google/android/play/core', + r'com/google/tagmanager', + r'com/google/analytics', + r'com/android/billing', ] } @@ -106,26 +102,34 @@ def get_gradle_compile_commands(build): return [re.compile(r'\s*' + c, re.IGNORECASE) for c in commands] -def scan_binary(apkfile): - """Scan output of apkanalyzer for known non-free classes. - - apkanalyzer produces useful output when it can run, but it does - not support all recent JDK versions, and also some DEX versions, - so this cannot count on it to always produce useful output or even - to run without exiting with an error. - +def get_embedded_classes(apkfile): """ - logging.info(_('Scanning APK with apkanalyzer for known non-free classes.')) - result = common.SdkToolsPopen(["apkanalyzer", "dex", "packages", "--defined-only", apkfile], output=False) - if result.returncode != 0: - logging.warning(_('scanner not cleanly run apkanalyzer: %s') % result.output) + Get the list of Java classes embedded into all DEX files. + + :return: set of Java classes names as string + """ + class_regex = re.compile(r'classes.*\.dex') + with TemporaryDirectory() as tmp_dir: + with zipfile.ZipFile(apkfile, 'r') as apk_zip: + class_infos = [info for info in apk_zip.infolist() if class_regex.search(info.filename)] + for info in class_infos: + apk_zip.extract(info, tmp_dir) + dexes = ['{}/{}'.format(tmp_dir, dex.filename) for dex in class_infos] + run = common.SdkToolsPopen(["dexdump"] + dexes) + classes = set(re.findall(r'[A-Z]+((?:\w+\/)+\w+)', run.output)) + return classes + + +def scan_binary(apkfile): + """Scan output of dexdump for known non-free classes.""" + logging.info(_('Scanning APK with dexdump for known non-free classes.')) + result = get_embedded_classes(apkfile) problems = 0 - for suspect, regexp in CODE_SIGNATURES.items(): - matches = regexp.findall(result.output) - if matches: - for m in set(matches): - logging.debug("Found class '%s'" % m) - problems += 1 + for classname in result: + for suspect, regexp in CODE_SIGNATURES.items(): + if regexp.match(classname): + logging.debug("Found class '%s'" % classname) + problems += 1 if problems: logging.critical("Found problems in %s" % apkfile) return problems diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 03609cf2..d1a0f63b 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -5,6 +5,7 @@ import inspect import logging import optparse import os +import re import shutil import sys import tempfile @@ -202,6 +203,28 @@ class ScannerTest(unittest.TestCase): self.assertTrue(f in files['infos'], f + ' should be removed with an info message') + def test_scan_binary(self): + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.common.config = config + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.verbose = False + + apkfile = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') + self.assertEqual( + 0, + fdroidserver.scanner.scan_binary(apkfile), + 'Found false positives in binary', + ) + fdroidserver.scanner.CODE_SIGNATURES["java/lang/Object"] = re.compile( + r'.*java/lang/Object', re.IGNORECASE | re.UNICODE + ) + self.assertEqual( + 1, + fdroidserver.scanner.scan_binary(apkfile), + 'Did not find bad code signature in binary', + ) + def test_build_local_scanner(self): """`fdroid build` calls scanner functions, test them here""" testdir = tempfile.mkdtemp( From 635f12e43863cd35b917a029fc0c0394ae902009 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 22 Apr 2022 14:30:11 +0200 Subject: [PATCH 0616/2116] Use latest build-tools version --- fdroidserver/common.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 3c4eeb2d..5318d6c1 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -585,6 +585,9 @@ def find_sdk_tools_cmd(cmd): sdk_platform_tools = os.path.join(config['sdk_path'], 'platform-tools') if os.path.exists(sdk_platform_tools): tooldirs.append(sdk_platform_tools) + sdk_build_tools = glob.glob(os.path.join(config['sdk_path'], 'build-tools', '*.*')) + if sdk_build_tools: + tooldirs.append(sorted(sdk_build_tools)[-1]) # use most recent version if os.path.exists('/usr/bin'): tooldirs.append('/usr/bin') for d in tooldirs: From d0d56173c92fd9970fbde523c099d3db2860356f Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 27 Apr 2022 23:22:15 +0200 Subject: [PATCH 0617/2116] Support nested apks --- fdroidserver/scanner.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 68a274e0..2cdbecd3 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -102,22 +102,31 @@ def get_gradle_compile_commands(build): return [re.compile(r'\s*' + c, re.IGNORECASE) for c in commands] -def get_embedded_classes(apkfile): +def get_embedded_classes(apkfile, depth=0): """ Get the list of Java classes embedded into all DEX files. :return: set of Java classes names as string """ + apk_regex = re.compile(r'.*\.apk') class_regex = re.compile(r'classes.*\.dex') with TemporaryDirectory() as tmp_dir: with zipfile.ZipFile(apkfile, 'r') as apk_zip: + # apk files can contain apk files, again + apk_infos = [info for info in apk_zip.infolist() if apk_regex.search(info.filename)] class_infos = [info for info in apk_zip.infolist() if class_regex.search(info.filename)] - for info in class_infos: + for info in apk_infos + class_infos: apk_zip.extract(info, tmp_dir) + apks = ['{}/{}'.format(tmp_dir, apk.filename) for apk in apk_infos] + apk_classes = set() + if apks and depth < 10: # zipbomb protection + apk_classes = set.union(*(get_embedded_classes(apk, depth + 1) for apk in apks)) dexes = ['{}/{}'.format(tmp_dir, dex.filename) for dex in class_infos] + if not dexes: + return apk_classes run = common.SdkToolsPopen(["dexdump"] + dexes) classes = set(re.findall(r'[A-Z]+((?:\w+\/)+\w+)', run.output)) - return classes + return classes.union(apk_classes) def scan_binary(apkfile): From 5fc88431f83e26080399a14156a3c19243dbd83e Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 28 Apr 2022 12:42:18 +0200 Subject: [PATCH 0618/2116] Simplify code --- fdroidserver/scanner.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 2cdbecd3..27a4f04a 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -111,20 +111,20 @@ def get_embedded_classes(apkfile, depth=0): apk_regex = re.compile(r'.*\.apk') class_regex = re.compile(r'classes.*\.dex') with TemporaryDirectory() as tmp_dir: + apk_classes = set() with zipfile.ZipFile(apkfile, 'r') as apk_zip: # apk files can contain apk files, again - apk_infos = [info for info in apk_zip.infolist() if apk_regex.search(info.filename)] - class_infos = [info for info in apk_zip.infolist() if class_regex.search(info.filename)] - for info in apk_infos + class_infos: - apk_zip.extract(info, tmp_dir) - apks = ['{}/{}'.format(tmp_dir, apk.filename) for apk in apk_infos] - apk_classes = set() - if apks and depth < 10: # zipbomb protection - apk_classes = set.union(*(get_embedded_classes(apk, depth + 1) for apk in apks)) - dexes = ['{}/{}'.format(tmp_dir, dex.filename) for dex in class_infos] + if depth < 10: # zipbomb protection + for apk in [name for name in apk_zip.namelist() if apk_regex.search(name)]: + with apk_zip.open(apk) as apk_fp: + apk_classes = apk_classes.union(get_embedded_classes(apk_fp, depth + 1)) + dexes = [name for name in apk_zip.namelist() if class_regex.search(name)] + for name in dexes: + apk_zip.extract(name, tmp_dir) if not dexes: return apk_classes - run = common.SdkToolsPopen(["dexdump"] + dexes) + tmp_dexes = ['{}/{}'.format(tmp_dir, dex) for dex in dexes] + run = common.SdkToolsPopen(["dexdump"] + tmp_dexes) classes = set(re.findall(r'[A-Z]+((?:\w+\/)+\w+)', run.output)) return classes.union(apk_classes) From 7ec39057341aa0c73d7088bf6a3a56d30f4209db Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 28 Apr 2022 12:49:25 +0200 Subject: [PATCH 0619/2116] Log zip recursion limit --- fdroidserver/scanner.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 27a4f04a..35ad9556 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -110,22 +110,29 @@ def get_embedded_classes(apkfile, depth=0): """ apk_regex = re.compile(r'.*\.apk') class_regex = re.compile(r'classes.*\.dex') + with TemporaryDirectory() as tmp_dir: apk_classes = set() + with zipfile.ZipFile(apkfile, 'r') as apk_zip: # apk files can contain apk files, again - if depth < 10: # zipbomb protection + if depth > 10: # zipbomb protection + logging.error(_('max recursion depth in zip file reached: %s') % apk_zip) + else: for apk in [name for name in apk_zip.namelist() if apk_regex.search(name)]: with apk_zip.open(apk) as apk_fp: apk_classes = apk_classes.union(get_embedded_classes(apk_fp, depth + 1)) + dexes = [name for name in apk_zip.namelist() if class_regex.search(name)] for name in dexes: apk_zip.extract(name, tmp_dir) if not dexes: return apk_classes + tmp_dexes = ['{}/{}'.format(tmp_dir, dex) for dex in dexes] run = common.SdkToolsPopen(["dexdump"] + tmp_dexes) classes = set(re.findall(r'[A-Z]+((?:\w+\/)+\w+)', run.output)) + return classes.union(apk_classes) From 91320fa10e92d9007ec4ffe89fa0bf5a0e56f5d1 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 28 Apr 2022 15:40:45 +0200 Subject: [PATCH 0620/2116] Rework code --- fdroidserver/scanner.py | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 35ad9556..93feaad0 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -108,32 +108,27 @@ def get_embedded_classes(apkfile, depth=0): :return: set of Java classes names as string """ + if depth > 10: # zipbomb protection + logging.error(_('max recursion depth in zip file reached: %s') % apk_zip) + return set() + apk_regex = re.compile(r'.*\.apk') class_regex = re.compile(r'classes.*\.dex') + classes = set() - with TemporaryDirectory() as tmp_dir: - apk_classes = set() - - with zipfile.ZipFile(apkfile, 'r') as apk_zip: + with TemporaryDirectory() as tmp_dir, zipfile.ZipFile(apkfile, 'r') as apk_zip: + for info in apk_zip.infolist(): # apk files can contain apk files, again - if depth > 10: # zipbomb protection - logging.error(_('max recursion depth in zip file reached: %s') % apk_zip) - else: - for apk in [name for name in apk_zip.namelist() if apk_regex.search(name)]: - with apk_zip.open(apk) as apk_fp: - apk_classes = apk_classes.union(get_embedded_classes(apk_fp, depth + 1)) + if apk_regex.search(info.filename): + with apk_zip.open(info) as apk_fp: + classes = classes.union(get_embedded_classes(apk_fp, depth + 1)) - dexes = [name for name in apk_zip.namelist() if class_regex.search(name)] - for name in dexes: - apk_zip.extract(name, tmp_dir) - if not dexes: - return apk_classes + elif class_regex.search(info.filename): + apk_zip.extract(info, tmp_dir) + run = common.SdkToolsPopen(["dexdump", '{}/{}'.format(tmp_dir, info.filename)]) + classes = classes.union(set(re.findall(r'[A-Z]+((?:\w+\/)+\w+)', run.output))) - tmp_dexes = ['{}/{}'.format(tmp_dir, dex) for dex in dexes] - run = common.SdkToolsPopen(["dexdump"] + tmp_dexes) - classes = set(re.findall(r'[A-Z]+((?:\w+\/)+\w+)', run.output)) - - return classes.union(apk_classes) + return classes def scan_binary(apkfile): From 9eaab6050e26d50dc827ae3bfd882b1034950bcc Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 28 Apr 2022 16:01:16 +0200 Subject: [PATCH 0621/2116] Fix variable name --- fdroidserver/scanner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 93feaad0..b17f74c3 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -109,7 +109,7 @@ def get_embedded_classes(apkfile, depth=0): :return: set of Java classes names as string """ if depth > 10: # zipbomb protection - logging.error(_('max recursion depth in zip file reached: %s') % apk_zip) + logging.error(_('max recursion depth in zip file reached: %s') % apkfile) return set() apk_regex = re.compile(r'.*\.apk') From 94ccd022c478450c1a1285d3ac95defea1fe0b1e Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 29 Apr 2022 14:35:36 +0200 Subject: [PATCH 0622/2116] Add apk.embedded_1.apk test --- MANIFEST.in | 1 + tests/apk.embedded_1.apk | Bin 0 -> 16876 bytes tests/scanner.TestCase | 6 ++++++ 3 files changed, 7 insertions(+) create mode 100644 tests/apk.embedded_1.apk diff --git a/MANIFEST.in b/MANIFEST.in index 87b82802..9ea77a1b 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -42,6 +42,7 @@ include locale/zh_Hant/LC_MESSAGES/fdroidserver.po include makebuildserver include README.md include tests/androguard_test.py +include tests/apk.embedded_1.apk include tests/bad-unicode-*.apk include tests/build.TestCase include tests/build-tools/17.0.0/aapt-output-com.moez.QKSMS_182.txt diff --git a/tests/apk.embedded_1.apk b/tests/apk.embedded_1.apk new file mode 100644 index 0000000000000000000000000000000000000000..f0dd47f099809d41be8fbd2219a6cbc3f583db43 GIT binary patch literal 16876 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%0ACV5!5S^emjI)y#b z5M}Nlm`V?B!-=MMzfJJ}^f_n(>>PR_H#4WVe@ege-w6Ch;5P#QuOsl+d%mcWEV+u6 z1^HVWdlPGNPIe_(2uN&j#KB*G0Qmc|>6bqM{8#$h{{UWgLvdEVevHvDB@Mnnsus-&m3jQ8f@v?gI-{cARf3%kJFU5cP`~Df0@i)a}|2atG zpBnxdckpiwi{$@F12_udpDO<8bo{pp3hKY9_?rt-Nfrk7r57A{n|XN=6?rNBFT3an A;Q#;t literal 0 HcmV?d00001 diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index d1a0f63b..c40fc6a1 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -224,6 +224,12 @@ class ScannerTest(unittest.TestCase): fdroidserver.scanner.scan_binary(apkfile), 'Did not find bad code signature in binary', ) + apkfile = os.path.join(self.basedir, 'apk.embedded_1.apk') + self.assertEqual( + 1, + fdroidserver.scanner.scan_binary(apkfile), + 'Did not find bad code signature in binary', + ) def test_build_local_scanner(self): """`fdroid build` calls scanner functions, test them here""" From 925cdbe54227291701b89de6cd2c4ff8a1e29701 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 29 Apr 2022 14:36:41 +0200 Subject: [PATCH 0623/2116] Improve recursion warning, thx Hans! --- fdroidserver/scanner.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index b17f74c3..78dd4eb5 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -109,8 +109,7 @@ def get_embedded_classes(apkfile, depth=0): :return: set of Java classes names as string """ if depth > 10: # zipbomb protection - logging.error(_('max recursion depth in zip file reached: %s') % apkfile) - return set() + return {_('Max recursion depth in ZIP file reached: %s') % apkfile} apk_regex = re.compile(r'.*\.apk') class_regex = re.compile(r'classes.*\.dex') From c80fdd5ce8220204ae347c11ccb3be9e01dd2710 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 2 May 2022 13:37:08 +0200 Subject: [PATCH 0624/2116] Handle BadZipFile --- fdroidserver/scanner.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 78dd4eb5..d77b03f9 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -115,17 +115,20 @@ def get_embedded_classes(apkfile, depth=0): class_regex = re.compile(r'classes.*\.dex') classes = set() - with TemporaryDirectory() as tmp_dir, zipfile.ZipFile(apkfile, 'r') as apk_zip: - for info in apk_zip.infolist(): - # apk files can contain apk files, again - if apk_regex.search(info.filename): - with apk_zip.open(info) as apk_fp: - classes = classes.union(get_embedded_classes(apk_fp, depth + 1)) + try: + with TemporaryDirectory() as tmp_dir, zipfile.ZipFile(apkfile, 'r') as apk_zip: + for info in apk_zip.infolist(): + # apk files can contain apk files, again + if apk_regex.search(info.filename): + with apk_zip.open(info) as apk_fp: + classes = classes.union(get_embedded_classes(apk_fp, depth + 1)) - elif class_regex.search(info.filename): - apk_zip.extract(info, tmp_dir) - run = common.SdkToolsPopen(["dexdump", '{}/{}'.format(tmp_dir, info.filename)]) - classes = classes.union(set(re.findall(r'[A-Z]+((?:\w+\/)+\w+)', run.output))) + elif class_regex.search(info.filename): + apk_zip.extract(info, tmp_dir) + run = common.SdkToolsPopen(["dexdump", '{}/{}'.format(tmp_dir, info.filename)]) + classes = classes.union(set(re.findall(r'[A-Z]+((?:\w+\/)+\w+)', run.output))) + except zipfile.BadZipFile as ex: + return {_('Problem with ZIP file: %s, error %s') % (apkfile, ex)} return classes From 50e680be93c3d1d1733f82d1a2836207de9e22f3 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 3 May 2022 18:30:02 +0200 Subject: [PATCH 0625/2116] Silence dexdump output in build --verbose --- fdroidserver/scanner.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index d77b03f9..5f30392e 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -125,7 +125,10 @@ def get_embedded_classes(apkfile, depth=0): elif class_regex.search(info.filename): apk_zip.extract(info, tmp_dir) - run = common.SdkToolsPopen(["dexdump", '{}/{}'.format(tmp_dir, info.filename)]) + run = common.SdkToolsPopen( + ["dexdump", '{}/{}'.format(tmp_dir, info.filename)], + output=False, + ) classes = classes.union(set(re.findall(r'[A-Z]+((?:\w+\/)+\w+)', run.output))) except zipfile.BadZipFile as ex: return {_('Problem with ZIP file: %s, error %s') % (apkfile, ex)} From cea192b9fbca797466f48f3be39773af082ae633 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 3 May 2022 22:05:39 +0200 Subject: [PATCH 0626/2116] gitlab-ci: fix debian_testing and ubuntu_lts_ppa jobs !1110 These setups did not have dexdump at all. --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 177a8f18..3eeff9a6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -84,6 +84,7 @@ debian_testing: aapt androguard apksigner + dexdump fdroidserver git gnupg @@ -110,7 +111,7 @@ ubuntu_lts_ppa: - echo "deb http://ppa.launchpad.net/fdroid/fdroidserver/ubuntu $RELEASE main" >> /etc/apt/sources.list - apt-get update - apt-get dist-upgrade - - apt-get install --install-recommends fdroidserver git python3-setuptools + - apt-get install --install-recommends dexdump fdroidserver git python3-setuptools - cd tests - ./run-tests From 4f04bd9200f6d061e80a7c0c2acf0aed391dff9e Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Thu, 5 May 2022 03:39:49 +0000 Subject: [PATCH 0627/2116] Update scanner.py --- fdroidserver/scanner.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 5f30392e..cfd1f729 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -81,6 +81,8 @@ NON_FREE_GRADLE_LINES = { r'com.tencent.bugly', r'appcenter-push', r'com.github.junrar:junrar', + r'androidx.navigation:navigation-dynamic-features', + r'xyz.belvi.mobilevision:barcodescanner', ] } From 90bc8e1e8fdc2c53cf789c6294de687b759938e4 Mon Sep 17 00:00:00 2001 From: linsui Date: Sat, 7 May 2022 00:43:55 +0800 Subject: [PATCH 0628/2116] scan gradle.kts --- fdroidserver/scanner.py | 2 +- tests/scanner.TestCase | 1 + .../core/build.gradle.kts | 94 +++++++++++++++++++ .../mobile/build.gradle.kts | 28 ++++++ 4 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 tests/source-files/com.github.shadowsocks/core/build.gradle.kts create mode 100644 tests/source-files/com.github.shadowsocks/mobile/build.gradle.kts diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index cfd1f729..b316bc73 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -406,7 +406,7 @@ def scan_source(build_dir, build=metadata.Build()): count += handleproblem('DexClassLoader', path_in_build_dir, filepath) break - elif curfile.endswith('.gradle'): + elif curfile.endswith('.gradle') or curfile.endswith('.gradle.kts'): if not os.path.isfile(filepath): continue with open(filepath, 'r', errors='replace') as f: diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index c40fc6a1..d9a343a9 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -50,6 +50,7 @@ class ScannerTest(unittest.TestCase): 'realm': 1, 'se.manyver': 2, 'com.jens.automation2': 2, + 'com.github.shadowsocks': 5, } for d in glob.glob(os.path.join(source_files, '*')): build = fdroidserver.metadata.Build() diff --git a/tests/source-files/com.github.shadowsocks/core/build.gradle.kts b/tests/source-files/com.github.shadowsocks/core/build.gradle.kts new file mode 100644 index 00000000..b9708b02 --- /dev/null +++ b/tests/source-files/com.github.shadowsocks/core/build.gradle.kts @@ -0,0 +1,94 @@ +import com.android.build.gradle.internal.tasks.factory.dependsOn + +plugins { + id("com.android.library") + id("org.mozilla.rust-android-gradle.rust-android") + kotlin("android") + kotlin("kapt") + id("kotlin-parcelize") +} + +setupCore() + +android { + defaultConfig { + consumerProguardFiles("proguard-rules.pro") + + externalNativeBuild.ndkBuild { + abiFilters("armeabi-v7a", "arm64-v8a", "x86", "x86_64") + arguments("-j${Runtime.getRuntime().availableProcessors()}") + } + + kapt.arguments { + arg("room.incremental", true) + arg("room.schemaLocation", "$projectDir/schemas") + } + } + + externalNativeBuild.ndkBuild.path("src/main/jni/Android.mk") + + sourceSets.getByName("androidTest") { + assets.setSrcDirs(assets.srcDirs + files("$projectDir/schemas")) + } +} + +cargo { + module = "src/main/rust/shadowsocks-rust" + libname = "sslocal" + targets = listOf("arm", "arm64", "x86", "x86_64") + profile = findProperty("CARGO_PROFILE")?.toString() ?: currentFlavor + extraCargoBuildArguments = listOf("--bin", libname!!) + featureSpec.noDefaultBut(arrayOf( + "stream-cipher", + "aead-cipher-extra", + "logging", + "local-flow-stat", + "local-dns")) + exec = { spec, toolchain -> + spec.environment("RUST_ANDROID_GRADLE_LINKER_WRAPPER_PY", "$projectDir/$module/../linker-wrapper.py") + spec.environment("RUST_ANDROID_GRADLE_TARGET", "target/${toolchain.target}/$profile/lib$libname.so") + } +} + +tasks.whenTaskAdded { + when (name) { + "mergeDebugJniLibFolders", "mergeReleaseJniLibFolders" -> dependsOn("cargoBuild") + } +} + +tasks.register("cargoClean") { + executable("cargo") // cargo.cargoCommand + args("clean") + workingDir("$projectDir/${cargo.module}") +} +tasks.clean.dependsOn("cargoClean") + +dependencies { + val coroutinesVersion = "1.5.2" + val roomVersion = "2.3.0" + val workVersion = "2.7.0-beta01" + + api(project(":plugin")) + api("androidx.core:core-ktx:1.6.0") + // https://android-developers.googleblog.com/2019/07/android-q-beta-5-update.html + api("androidx.drawerlayout:drawerlayout:1.1.1") + api("androidx.fragment:fragment-ktx:1.3.6") + api("com.google.android.material:material:1.4.0") + + api("androidx.lifecycle:lifecycle-livedata-core-ktx:$lifecycleVersion") + api("androidx.preference:preference:1.1.1") + api("androidx.room:room-runtime:$roomVersion") + api("androidx.work:work-multiprocess:$workVersion") + api("androidx.work:work-runtime-ktx:$workVersion") + api("com.google.android.gms:play-services-oss-licenses:17.0.0") + api("com.google.code.gson:gson:2.8.8") + api("com.google.firebase:firebase-analytics-ktx:19.0.1") + api("com.google.firebase:firebase-crashlytics:18.2.1") + api("com.jakewharton.timber:timber:5.0.1") + api("dnsjava:dnsjava:3.4.1") + api("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion") + api("org.jetbrains.kotlinx:kotlinx-coroutines-play-services:$coroutinesVersion") + kapt("androidx.room:room-compiler:$roomVersion") + androidTestImplementation("androidx.room:room-testing:$roomVersion") + androidTestImplementation("androidx.test.ext:junit-ktx:1.1.3") +} diff --git a/tests/source-files/com.github.shadowsocks/mobile/build.gradle.kts b/tests/source-files/com.github.shadowsocks/mobile/build.gradle.kts new file mode 100644 index 00000000..874ea857 --- /dev/null +++ b/tests/source-files/com.github.shadowsocks/mobile/build.gradle.kts @@ -0,0 +1,28 @@ +plugins { + id("com.android.application") + id("com.google.android.gms.oss-licenses-plugin") + id("com.google.gms.google-services") + id("com.google.firebase.crashlytics") + kotlin("android") + id("kotlin-parcelize") +} + +setupApp() + +android.defaultConfig.applicationId = "com.github.shadowsocks" + +dependencies { + val cameraxVersion = "1.0.1" + + implementation("androidx.browser:browser:1.3.0") + implementation("androidx.camera:camera-camera2:$cameraxVersion") + implementation("androidx.camera:camera-lifecycle:$cameraxVersion") + implementation("androidx.camera:camera-view:1.0.0-alpha28") + implementation("androidx.constraintlayout:constraintlayout:2.1.0") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:$lifecycleVersion") + implementation("com.google.mlkit:barcode-scanning:17.0.0") + implementation("com.google.zxing:core:3.4.1") + implementation("com.takisoft.preferencex:preferencex-simplemenu:1.1.0") + implementation("com.twofortyfouram:android-plugin-api-for-locale:1.0.4") + implementation("me.zhanghai.android.fastscroll:library:1.1.7") +} From c16d170f127e941fcb5daabfcc9d8817a1bf1513 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sat, 7 May 2022 01:49:56 +0000 Subject: [PATCH 0629/2116] scanner: add kotlinx-coroutines-play-services --- fdroidserver/scanner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index b316bc73..7424cec1 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -83,6 +83,7 @@ NON_FREE_GRADLE_LINES = { r'com.github.junrar:junrar', r'androidx.navigation:navigation-dynamic-features', r'xyz.belvi.mobilevision:barcodescanner', + r'org.jetbrains.kotlinx:kotlinx-coroutines-play-services', ] } From df1e0e30d5f9b4d9b1e6cfde7e05c7ec616b0658 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sat, 7 May 2022 02:17:26 +0000 Subject: [PATCH 0630/2116] fix tests --- tests/scanner.TestCase | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index d9a343a9..5e4c0666 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -50,7 +50,7 @@ class ScannerTest(unittest.TestCase): 'realm': 1, 'se.manyver': 2, 'com.jens.automation2': 2, - 'com.github.shadowsocks': 5, + 'com.github.shadowsocks': 6, } for d in glob.glob(os.path.join(source_files, '*')): build = fdroidserver.metadata.Build() From 107593d3babd398e7a8c9ad5fb820851fad70f86 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 9 May 2022 18:51:41 +0200 Subject: [PATCH 0631/2116] net: improve parsing filenames from URL This is more relevant to issuebot than fdroidserver, but it can't hurt here also. --- fdroidserver/net.py | 3 +- tests/net.TestCase | 70 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100755 tests/net.TestCase diff --git a/fdroidserver/net.py b/fdroidserver/net.py index b914d5b6..da88df29 100644 --- a/fdroidserver/net.py +++ b/fdroidserver/net.py @@ -18,12 +18,13 @@ import os import requests +import urllib HEADERS = {'User-Agent': 'F-Droid'} def download_file(url, local_filename=None, dldir='tmp'): - filename = url.split('/')[-1] + filename = urllib.parse.urlparse(url).path.split('/')[-1] if local_filename is None: local_filename = os.path.join(dldir, filename) # the stream=True parameter keeps memory usage low diff --git a/tests/net.TestCase b/tests/net.TestCase new file mode 100755 index 00000000..3f2d51a1 --- /dev/null +++ b/tests/net.TestCase @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 + +import inspect +import logging +import optparse +import os +import sys +import tempfile +import unittest +from unittest.mock import MagicMock, patch + +localmodule = os.path.realpath( + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) +print('localmodule: ' + localmodule) +if localmodule not in sys.path: + sys.path.insert(0, localmodule) + +from fdroidserver import common, net +from pathlib import Path + + +class NetTest(unittest.TestCase): + + basedir = Path(__file__).resolve().parent + + def setUp(self): + logging.basicConfig(level=logging.DEBUG) + self.tempdir = tempfile.TemporaryDirectory() + os.chdir(self.tempdir.name) + Path('tmp').mkdir() + + def tearDown(self): + self.tempdir.cleanup() + + @patch('requests.get') + def test_download_file_url_parsing(self, requests_get): + def _get(url, stream, allow_redirects, headers): # pylint: disable=W0613 + return MagicMock() + + requests_get.side_effect = _get + f = net.download_file('https://f-droid.org/repo/index-v1.jar') + self.assertTrue(requests_get.called) + self.assertTrue(os.path.exists(f)) + self.assertEqual('tmp/index-v1.jar', f) + + f = net.download_file( + 'https://d-05.example.com/custom/com.downloader.aegis-3175421.apk?_fn=QVBLUHVyZV92My4xNy41NF9hcGtwdXJlLmNvbS5hcGs&_p=Y29tLmFwa3B1cmUuYWVnb24&am=6avvTpfJ1dMl9-K6JYKzQw&arg=downloader%3A%2F%2Fcampaign%2F%3Futm_medium%3Ddownloader%26utm_source%3Daegis&at=1652080635&k=1f6e58465df3a441665e585719ab0b13627a117f&r=https%3A%2F%2Fdownloader.com%2Fdownloader-app.html%3Ficn%3Daegis%26ici%3Dimage_qr&uu=http%3A%2F%2F172.16.82.1%2Fcustom%2Fcom.downloader.aegis-3175421.apk%3Fk%3D3fb9c4ae0be578206f6a1c330736fac1627a117f' + ) + self.assertTrue(requests_get.called) + self.assertTrue(os.path.exists(f)) + self.assertEqual('tmp/com.downloader.aegis-3175421.apk', f) + + +if __name__ == "__main__": + os.chdir(os.path.dirname(__file__)) + + parser = optparse.OptionParser() + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) + (common.options, args) = parser.parse_args(['--verbose']) + + newSuite = unittest.TestSuite() + newSuite.addTest(unittest.makeSuite(NetTest)) + unittest.main(failfast=False) From e82888837e71686ad9c1b4359dc9c7c718fa5316 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sun, 8 May 2022 12:21:49 +0200 Subject: [PATCH 0632/2116] Fix androguard_test - SdkToolsPopen expects a list. - info.guardianproject.urzip.apk is not in the repo. - scan_apk_aapt was removed in 08931f45 so define output. --- tests/androguard_test.py | 54 +++++++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/tests/androguard_test.py b/tests/androguard_test.py index 162dffb3..b2eb5f96 100644 --- a/tests/androguard_test.py +++ b/tests/androguard_test.py @@ -48,25 +48,61 @@ class UpdateTest(unittest.TestCase): fdroidserver.update.options.clean = True fdroidserver.update.options.delete_unknown = True - self.assertTrue(fdroidserver.common.SdkToolsPopen('aapt')) + self.assertTrue(fdroidserver.common.SdkToolsPopen(['aapt'])) try: from androguard.core.bytecodes.apk import APK dir(APK) except ImportError: raise Exception("androguard not installed!") - apkList = ['../info.guardianproject.urzip.apk', '../org.dyndns.fules.ck_20.apk'] + apkList = [ + ( + '../org.dyndns.fules.ck_20.apk', + { + 'apkName': '../org.dyndns.fules.ck_20.apk', + 'uses-permission': [ + fdroidserver.update.UsesPermission( + name='android.permission.BIND_INPUT_METHOD', + maxSdkVersion=None, + ), + fdroidserver.update.UsesPermission( + name='android.permission.READ_EXTERNAL_STORAGE', + maxSdkVersion=None, + ), + fdroidserver.update.UsesPermission( + name='android.permission.VIBRATE', maxSdkVersion=None + ), + ], + 'uses-permission-sdk-23': [], + 'features': [], + 'icons_src': { + '240': 'res/drawable-hdpi-v4/icon_launcher.png', + '120': 'res/drawable-ldpi-v4/icon_launcher.png', + '160': 'res/drawable-mdpi-v4/icon_launcher.png', + '-1': 'res/drawable-mdpi-v4/icon_launcher.png', + }, + 'packageName': 'org.dyndns.fules.ck', + 'versionCode': 20, + 'versionName': 'v1.6pre2', + 'minSdkVersion': 7, + 'targetSdkVersion': 8, + 'nativecode': [ + 'arm64-v8a', + 'armeabi', + 'armeabi-v7a', + 'mips', + 'mips64', + 'x86', + 'x86_64', + ], + }, + ) + ] - for apkName in apkList: + for apkName, apkaapt in apkList: logging.debug("Processing " + apkName) apkfile = os.path.join('repo', apkName) - apkaapt = _create_apkmetadata_object(apkName) - logging.debug("Using AAPT for metadata") - fdroidserver.update.scan_apk_aapt(apkaapt, apkfile) - # avoid AAPT application name bug - del apkaapt['name'] - apkandroguard = _create_apkmetadata_object(apkName) logging.debug("Using androguard for metadata") fdroidserver.update.scan_apk_androguard(apkandroguard, apkfile) From 08e3e445fbbd0108eabf5b09873753e3e415f882 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sun, 8 May 2022 12:41:23 +0200 Subject: [PATCH 0633/2116] Merge androguard_test into update.TestCase --- tests/androguard_test.py | 124 --------------------------------------- tests/update.TestCase | 64 ++++++++++++++++++++ 2 files changed, 64 insertions(+), 124 deletions(-) delete mode 100644 tests/androguard_test.py diff --git a/tests/androguard_test.py b/tests/androguard_test.py deleted file mode 100644 index b2eb5f96..00000000 --- a/tests/androguard_test.py +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/env python3 - -import inspect -import logging -import optparse -import os -import sys -import unittest - -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) -print('localmodule: ' + localmodule) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) - -import fdroidserver.common -import fdroidserver.metadata -import fdroidserver.update - - -class UpdateTest(unittest.TestCase): - '''fdroid androguard manual tests''' - - def testScanMetadataAndroguardAAPT(self): - - def _create_apkmetadata_object(apkName): - '''Create an empty apk metadata object''' - apk = {} - apk['apkName'] = apkName - apk['uses-permission'] = [] - apk['uses-permission-sdk-23'] = [] - apk['features'] = [] - apk['icons_src'] = {} - return apk - - config = dict() - fdroidserver.common.fill_config_defaults(config) - fdroidserver.update.config = config - os.chdir(os.path.dirname(__file__)) - if os.path.basename(os.getcwd()) != 'tests': - raise Exception('This test must be run in the "tests/" subdir') - - config['ndk_paths'] = dict() - fdroidserver.common.config = config - fdroidserver.update.config = config - - fdroidserver.update.options = type('', (), {})() - fdroidserver.update.options.clean = True - fdroidserver.update.options.delete_unknown = True - - self.assertTrue(fdroidserver.common.SdkToolsPopen(['aapt'])) - try: - from androguard.core.bytecodes.apk import APK - dir(APK) - except ImportError: - raise Exception("androguard not installed!") - - apkList = [ - ( - '../org.dyndns.fules.ck_20.apk', - { - 'apkName': '../org.dyndns.fules.ck_20.apk', - 'uses-permission': [ - fdroidserver.update.UsesPermission( - name='android.permission.BIND_INPUT_METHOD', - maxSdkVersion=None, - ), - fdroidserver.update.UsesPermission( - name='android.permission.READ_EXTERNAL_STORAGE', - maxSdkVersion=None, - ), - fdroidserver.update.UsesPermission( - name='android.permission.VIBRATE', maxSdkVersion=None - ), - ], - 'uses-permission-sdk-23': [], - 'features': [], - 'icons_src': { - '240': 'res/drawable-hdpi-v4/icon_launcher.png', - '120': 'res/drawable-ldpi-v4/icon_launcher.png', - '160': 'res/drawable-mdpi-v4/icon_launcher.png', - '-1': 'res/drawable-mdpi-v4/icon_launcher.png', - }, - 'packageName': 'org.dyndns.fules.ck', - 'versionCode': 20, - 'versionName': 'v1.6pre2', - 'minSdkVersion': 7, - 'targetSdkVersion': 8, - 'nativecode': [ - 'arm64-v8a', - 'armeabi', - 'armeabi-v7a', - 'mips', - 'mips64', - 'x86', - 'x86_64', - ], - }, - ) - ] - - for apkName, apkaapt in apkList: - logging.debug("Processing " + apkName) - apkfile = os.path.join('repo', apkName) - - apkandroguard = _create_apkmetadata_object(apkName) - logging.debug("Using androguard for metadata") - fdroidserver.update.scan_apk_androguard(apkandroguard, apkfile) - # avoid AAPT application name bug - del apkandroguard['name'] - - self.maxDiff = None - self.assertEqual(apkaapt, apkandroguard) - - -if __name__ == "__main__": - parser = optparse.OptionParser() - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="Spew out even more information than normal") - (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(UpdateTest)) - unittest.main() diff --git a/tests/update.TestCase b/tests/update.TestCase index cc56f455..4d425382 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1652,6 +1652,70 @@ class UpdateTest(unittest.TestCase): self.assertEqual(fdroidserver.update.config['jarsigner'], data['jarsigner']) self.assertEqual(fdroidserver.update.config['keytool'], data['keytool']) + def test_scan_metadata_androguard(self): + + def _create_apkmetadata_object(apkName): + """Create an empty apk metadata object.""" + apk = {} + apk['apkName'] = apkName + apk['uses-permission'] = [] + apk['uses-permission-sdk-23'] = [] + apk['features'] = [] + apk['icons_src'] = {} + return apk + + apkList = [ + ( + 'org.dyndns.fules.ck_20.apk', + { + 'apkName': 'org.dyndns.fules.ck_20.apk', + 'uses-permission': [ + fdroidserver.update.UsesPermission( + name='android.permission.BIND_INPUT_METHOD', + maxSdkVersion=None, + ), + fdroidserver.update.UsesPermission( + name='android.permission.READ_EXTERNAL_STORAGE', + maxSdkVersion=None, + ), + fdroidserver.update.UsesPermission( + name='android.permission.VIBRATE', maxSdkVersion=None + ), + ], + 'uses-permission-sdk-23': [], + 'features': [], + 'icons_src': { + '240': 'res/drawable-hdpi-v4/icon_launcher.png', + '120': 'res/drawable-ldpi-v4/icon_launcher.png', + '160': 'res/drawable-mdpi-v4/icon_launcher.png', + '-1': 'res/drawable-mdpi-v4/icon_launcher.png', + }, + 'packageName': 'org.dyndns.fules.ck', + 'versionCode': 20, + 'versionName': 'v1.6pre2', + 'minSdkVersion': 7, + 'name': 'Compass Keyboard', + 'targetSdkVersion': 8, + 'nativecode': [ + 'arm64-v8a', + 'armeabi', + 'armeabi-v7a', + 'mips', + 'mips64', + 'x86', + 'x86_64', + ], + }, + ) + ] + + for apkfile, apkaapt in apkList: + apkandroguard = _create_apkmetadata_object(apkfile) + fdroidserver.update.scan_apk_androguard(apkandroguard, apkfile) + + self.maxDiff = None + self.assertEqual(apkaapt, apkandroguard) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 73c31e6e63cc7a6d6c7592e41f3d247f19464589 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 17 May 2022 12:57:44 +0200 Subject: [PATCH 0634/2116] signindex: do not remove index-v1.json after signing With ~index-v2, the model is changing to offer the plain JSON file for easy consumption. Then gpgsign will also provide a detached PGP signature for systems that would rather verify based on PGP signatures than JAR signatures. !1080 closes #969 --- fdroidserver/signindex.py | 1 - tests/signindex.TestCase | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/fdroidserver/signindex.py b/fdroidserver/signindex.py index c1a53b89..fae079de 100644 --- a/fdroidserver/signindex.py +++ b/fdroidserver/signindex.py @@ -139,7 +139,6 @@ def main(): index_file = os.path.join(output_dir, json_name) if os.path.exists(index_file): sign_index_v1(output_dir, json_name) - os.remove(index_file) logging.info('Signed ' + index_file) signed.append(index_file) diff --git a/tests/signindex.TestCase b/tests/signindex.TestCase index 84b19655..7966821d 100755 --- a/tests/signindex.TestCase +++ b/tests/signindex.TestCase @@ -17,8 +17,19 @@ print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) -from fdroidserver import common, signindex +from fdroidserver import common, signindex, update from pathlib import Path +from unittest.mock import patch + + +class Options: + allow_disabled_algorithms = False + clean = False + delete_unknown = False + nosign = False + pretty = True + rename_apks = False + verbose = False class SignindexTest(unittest.TestCase): @@ -49,6 +60,7 @@ class SignindexTest(unittest.TestCase): shutil.copy(str(self.basedir / 'repo/index-v1.json'), 'repo') signindex.sign_index_v1(str(self.repodir), 'index-v1.json') self.assertTrue((self.repodir / 'index-v1.jar').exists()) + self.assertTrue((self.repodir / 'index-v1.json').exists()) def test_sign_index_v1_corrupt(self): with open('repo/index-v1.json', 'w') as fp: @@ -56,6 +68,27 @@ class SignindexTest(unittest.TestCase): with self.assertRaises(json.decoder.JSONDecodeError, msg='error on bad JSON'): signindex.sign_index_v1(str(self.repodir), 'index-v1.json') + def test_signindex(self): + os.mkdir('archive') + metadata = Path('metadata') + metadata.mkdir() + with (metadata / 'info.guardianproject.urzip.yml').open('w') as fp: + fp.write('# placeholder') + shutil.copy(str(self.basedir / 'urzip.apk'), 'repo') + index_files = [] + for f in ('index.xml', 'index.jar', 'index-v1.json', 'index-v1.jar'): + for section in (Path('repo'), Path('archive')): + path = section / f + self.assertFalse(path.exists(), '%s should not exist yet!' % path) + index_files.append(path) + common.options = Options + with patch('sys.argv', ['fdroid update']): + update.main() + with patch('sys.argv', ['fdroid signindex', '--verbose']): + signindex.main() + for f in index_files: + self.assertTrue(f.exists(), '%s should exist!' % f) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 6ef60f0d6bdc4264ba020367c54e408a32c26e4c Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 19 May 2022 15:43:55 +0200 Subject: [PATCH 0635/2116] scanner: include dexdump in buildserver for APK analysis This scanner feature is not yet ready for the production buildserver but it is already useful in CI. --- buildserver/provision-apt-get-install | 1 + 1 file changed, 1 insertion(+) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index d0b903e2..24cb1a5e 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -70,6 +70,7 @@ packages=" ca-certificates-java cmake curl + dexdump disorderfs expect faketime From 13534bf02ebf3956f439f39859815229211035a8 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sat, 21 May 2022 12:25:11 +0000 Subject: [PATCH 0636/2116] scanner: add me.pushy --- fdroidserver/scanner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 7424cec1..fa59fae1 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -84,6 +84,7 @@ NON_FREE_GRADLE_LINES = { r'androidx.navigation:navigation-dynamic-features', r'xyz.belvi.mobilevision:barcodescanner', r'org.jetbrains.kotlinx:kotlinx-coroutines-play-services', + r'me.pushy:sdk', ] } From d70e5c2cd92eb1924caf51a1f88202749956038f Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 23 May 2022 10:39:17 +0000 Subject: [PATCH 0637/2116] Index v2 --- .gitlab-ci.yml | 1 + fdroidserver/common.py | 41 ++-- fdroidserver/gpgsign.py | 4 +- fdroidserver/index.py | 398 +++++++++++++++++++++++++++++++++++++- fdroidserver/signindex.py | 73 ++++--- fdroidserver/update.py | 46 ++++- tests/common.TestCase | 66 +++++++ tests/gpgsign.TestCase | 91 +++++++++ tests/index.TestCase | 2 +- tests/signindex.TestCase | 8 +- 10 files changed, 677 insertions(+), 53 deletions(-) create mode 100755 tests/gpgsign.TestCase diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3eeff9a6..156c89a1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,6 +9,7 @@ variables: ci-images-base run-tests: image: registry.gitlab.com/fdroid/ci-images-base script: + - $pip install --upgrade pip setuptools wheel # make this go away: "error: invalid command 'bdist_wheel'" - $pip install -e . - ./tests/run-tests # make sure that translations do not cause stacktraces diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 5318d6c1..8cb96cac 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4088,26 +4088,33 @@ def get_per_app_repos(): return repos -def is_repo_file(filename): +def is_repo_file(filename, for_gpg_signing=False): """Whether the file in a repo is a build product to be delivered to users.""" if isinstance(filename, str): filename = filename.encode('utf-8', errors="surrogateescape") - return os.path.isfile(filename) \ - and not filename.endswith(b'.asc') \ - and not filename.endswith(b'.sig') \ - and not filename.endswith(b'.idsig') \ - and not filename.endswith(b'.log.gz') \ - and os.path.basename(filename) not in [ - b'index.css', - b'index.jar', - b'index_unsigned.jar', - b'index.xml', - b'index.html', - b'index.png', - b'index-v1.jar', - b'index-v1.json', - b'categories.txt', - ] + ignore_files = [ + b'categories.txt', + b'entry.jar', + b'index-v1.jar', + b'index-v2.jar', + b'index.css', + b'index.html', + b'index.jar', + b'index.png', + b'index.xml', + b'index_unsigned.jar', + ] + if not for_gpg_signing: + ignore_files += [b'entry.json', b'index-v1.json', b'index-v2.json'] + + return ( + os.path.isfile(filename) + and not filename.endswith(b'.asc') + and not filename.endswith(b'.sig') + and not filename.endswith(b'.idsig') + and not filename.endswith(b'.log.gz') + and os.path.basename(filename) not in ignore_files + ) def get_examples_dir(): diff --git a/fdroidserver/gpgsign.py b/fdroidserver/gpgsign.py index 726805b6..6c8842bd 100644 --- a/fdroidserver/gpgsign.py +++ b/fdroidserver/gpgsign.py @@ -65,9 +65,7 @@ def main(): # Process any apks that are waiting to be signed... for f in sorted(glob.glob(os.path.join(output_dir, '*.*'))): - if common.get_file_extension(f) == 'asc': - continue - if not common.is_repo_file(f) and not f.endswith('/index-v1.json'): + if not common.is_repo_file(f, for_gpg_signing=True): continue filename = os.path.basename(f) sigfilename = filename + ".asc" diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 5ba728e7..fbc6a351 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -28,11 +28,13 @@ import re import shutil import tempfile import urllib.parse +import yaml import zipfile import calendar import qrcode from binascii import hexlify, unhexlify from datetime import datetime, timezone +from pathlib import Path from xml.dom.minidom import Document from . import _ @@ -136,6 +138,8 @@ def make(apps, apks, repodir, archive): fdroid_signing_key_fingerprints) make_v1(sortedapps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fingerprints) + make_v2(sortedapps, apks, repodir, repodict, requestsdict, + fdroid_signing_key_fingerprints, archive) make_website(sortedapps, repodir, repodict) @@ -469,6 +473,393 @@ fieldset select, fieldset input, #reposelect select, #reposelect input { }""") +def dict_diff(source, target): + if not isinstance(target, dict) or not isinstance(source, dict): + return target + + result = {key: None for key in source if key not in target} + + for key, value in target.items(): + if key not in source: + result[key] = value + elif value != source[key]: + result[key] = dict_diff(source[key], value) + + return result + + +def file_entry(filename, hashType=None, hsh=None, size=None): + meta = {} + meta["name"] = "/" + filename.split("/", 1)[1] + if hsh: + meta[hashType] = hsh + if hsh != "sha256": + meta["sha256"] = common.sha256sum(filename) + if size: + meta["size"] = size + else: + meta["size"] = os.stat(filename).st_size + return meta + + +def load_locale(name, repodir): + lst = {} + for yml in Path().glob("config/**/{name}.yml".format(name=name)): + locale = yml.parts[1] + if len(yml.parts) == 2: + locale = "en-US" + with open(yml, encoding="utf-8") as fp: + elem = yaml.safe_load(fp) + for akey, avalue in elem.items(): + if akey not in lst: + lst[akey] = {} + for key, value in avalue.items(): + if key not in lst[akey]: + lst[akey][key] = {} + if key == "icon": + shutil.copy(os.path.join("config", value), os.path.join(repodir, "icons")) + lst[akey][key][locale] = file_entry(os.path.join(repodir, "icons", value)) + else: + lst[akey][key][locale] = value + + return lst + + +def convert_datetime(obj): + if isinstance(obj, datetime): + # Java prefers milliseconds + # we also need to account for time zone/daylight saving time + return int(calendar.timegm(obj.timetuple()) * 1000) + return obj + + +def package_metadata(app, repodir): + meta = {} + for element in ( + "added", + # "binaries", + "Categories", + "Changelog", + "IssueTracker", + "lastUpdated", + "License", + "SourceCode", + "Translation", + "WebSite", + "video", + "featureGraphic", + "promoGraphic", + "tvBanner", + "screenshots", + "AuthorEmail", + "AuthorName", + "AuthorPhone", + "AuthorWebSite", + "Bitcoin", + "FlattrID", + "Liberapay", + "LiberapayID", + "Litecoin", + "OpenCollective", + ): + if element in app and app[element]: + element_new = element[:1].lower() + element[1:] + meta[element_new] = convert_datetime(app[element]) + + for element in ( + "Name", + "Summary", + "Description", + ): + element_new = element[:1].lower() + element[1:] + if element in app and app[element]: + meta[element_new] = {"en-US": convert_datetime(app[element])} + elif "localized" in app: + localized = {k: v[element_new] for k, v in app["localized"].items() if element_new in v} + if localized: + meta[element_new] = localized + + if "name" not in meta and app["AutoName"]: + meta["name"] = {"en-US": app["AutoName"]} + + # fdroidserver/metadata.py App default + if meta["license"] == "Unknown": + del meta["license"] + + if app["Donate"]: + meta["donate"] = [app["Donate"]] + + # TODO handle different resolutions + if app.get("icon"): + meta["icon"] = {"en-US": file_entry(os.path.join(repodir, "icons", app["icon"]))} + + if "iconv2" in app: + meta["icon"] = app["iconv2"] + + return meta + + +def convert_version(version, app, repodir): + ver = {} + if "added" in version: + ver["added"] = convert_datetime(version["added"]) + else: + ver["added"] = 0 + + ver["file"] = { + "name": "/{}".format(version["apkName"]), + version["hashType"]: version["hash"], + "size": version["size"] + } + + if "srcname" in version: + ver["src"] = file_entry(os.path.join(repodir, version["srcname"])) + + if "obbMainFile" in version: + ver["obbMainFile"] = file_entry( + os.path.join(repodir, version["obbMainFile"]), + "sha256", version["obbMainFileSha256"] + ) + + if "obbPatchFile" in version: + ver["obbPatchFile"] = file_entry( + os.path.join(repodir, version["obbPatchFile"]), + "sha256", version["obbPatchFileSha256"] + ) + + ver["manifest"] = manifest = {} + + for element in ( + "nativecode", + "versionName", + "maxSdkVersion", + ): + if element in version: + manifest[element] = version[element] + + if "versionCode" in version: + manifest["versionCode"] = int(version["versionCode"]) + + if "features" in version and version["features"]: + manifest["features"] = features = [] + for feature in version["features"]: + # TODO get version from manifest, default (0) is omitted + # features.append({"name": feature, "version": 1}) + features.append({"name": feature}) + + if "minSdkVersion" in version: + manifest["usesSdk"] = {} + manifest["usesSdk"]["minSdkVersion"] = version["minSdkVersion"] + if "targetSdkVersion" in version: + manifest["usesSdk"]["targetSdkVersion"] = version["targetSdkVersion"] + else: + # https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#target + manifest["usesSdk"]["targetSdkVersion"] = manifest["usesSdk"]["minSdkVersion"] + + if "signer" in version: + manifest["signer"] = {"sha256": [version["signer"]]} + + for element in ("uses-permission", "uses-permission-sdk-23"): + en = element.replace("uses-permission", "usesPermission").replace("-sdk-23", "Sdk23") + if element in version and version[element]: + manifest[en] = [] + for perm in version[element]: + if perm[1]: + manifest[en].append({"name": perm[0], "maxSdkVersion": perm[1]}) + else: + manifest[en].append({"name": perm[0]}) + + if "AntiFeatures" in app and app["AntiFeatures"]: + ver["antiFeatures"] = {} + for antif in app["AntiFeatures"]: + # TODO: get reasons from fdroiddata + # ver["antiFeatures"][antif] = {"en-US": "reason"} + ver["antiFeatures"][antif] = {} + + if "AntiFeatures" in version and version["AntiFeatures"]: + if "antiFeatures" not in ver: + ver["antiFeatures"] = {} + for antif in version["AntiFeatures"]: + # TODO: get reasons from fdroiddata + # ver["antiFeatures"][antif] = {"en-US": "reason"} + ver["antiFeatures"][antif] = {} + + if "versionCode" in version: + if int(version["versionCode"]) > int(app["CurrentVersionCode"]): + ver["releaseChannels"] = ["Beta"] + + versionCodeStr = str(version['versionCode']) # TODO build.versionCode should be int! + for build in app.get('Builds', []): + if build['versionCode'] == versionCodeStr and "whatsNew" in build: + ver["whatsNew"] = build["whatsNew"] + break + + return ver + + +def v2_repo(repodict, repodir, archive): + repo = {} + + repo["name"] = {"en-US": repodict["name"]} + repo["description"] = {"en-US": repodict["description"]} + repo["icon"] = {"en-US": file_entry("{}/icons/{}".format(repodir, repodict["icon"]))} + + config = load_locale("config", repodir) + if config: + repo["name"] = config["archive" if archive else "repo"]["name"] + repo["description"] = config["archive" if archive else "repo"]["description"] + repo["icon"] = config["archive" if archive else "repo"]["icon"] + + repo["address"] = repodict["address"] + repo["webBaseUrl"] = "https://f-droid.org/packages/" + + if "repo_url" in common.config: + primary_mirror = common.config["repo_url"][:-len("/repo")] + if "mirrors" in repodict and primary_mirror not in repodict["mirrors"]: + repodict["mirrors"].append(primary_mirror) + + if "mirrors" in repodict: + repo["mirrors"] = [{"url": mirror} for mirror in repodict["mirrors"]] + + repo["timestamp"] = repodict["timestamp"] + + anti_features = load_locale("antiFeatures", repodir) + if anti_features: + repo["antiFeatures"] = anti_features + + categories = load_locale("categories", repodir) + if categories: + repo["categories"] = categories + + channels = load_locale("channels", repodir) + if channels: + repo["releaseChannels"] = channels + + return repo + + +def make_v2(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_fingerprints, archive): + + def _index_encoder_default(obj): + if isinstance(obj, set): + return sorted(list(obj)) + if isinstance(obj, datetime): + # Java prefers milliseconds + # we also need to account for time zone/daylight saving time + return int(calendar.timegm(obj.timetuple()) * 1000) + if isinstance(obj, dict): + d = collections.OrderedDict() + for key in sorted(obj.keys()): + d[key] = obj[key] + return d + raise TypeError(repr(obj) + " is not JSON serializable") + + output = collections.OrderedDict() + output["repo"] = v2_repo(repodict, repodir, archive) + if requestsdict and requestsdict["install"] or requestsdict["uninstall"]: + output["repo"]["requests"] = requestsdict + + # establish sort order of the index + v1_sort_packages(packages, fdroid_signing_key_fingerprints) + + output_packages = collections.OrderedDict() + output['packages'] = output_packages + for package in packages: + packageName = package['packageName'] + if packageName not in apps: + logging.info(_('Ignoring package without metadata: ') + package['apkName']) + continue + if not package.get('versionName'): + app = apps[packageName] + versionCodeStr = str(package['versionCode']) # TODO build.versionCode should be int! + for build in app.get('Builds', []): + if build['versionCode'] == versionCodeStr: + versionName = build.get('versionName') + logging.info(_('Overriding blank versionName in {apkfilename} from metadata: {version}') + .format(apkfilename=package['apkName'], version=versionName)) + package['versionName'] = versionName + break + if packageName in output_packages: + packagelist = output_packages[packageName] + else: + packagelist = {} + output_packages[packageName] = packagelist + packagelist["metadata"] = package_metadata(apps[packageName], repodir) + if "signer" in package: + packagelist["metadata"]["preferredSigner"] = package["signer"] + + packagelist["versions"] = {} + + packagelist["versions"][package["hash"]] = convert_version(package, apps[packageName], repodir) + + entry = {} + entry["timestamp"] = repodict["timestamp"] + + entry["version"] = repodict["version"] + if "maxage" in repodict: + entry["maxAge"] = repodict["maxage"] + + json_name = 'index-v2.json' + index_file = os.path.join(repodir, json_name) + with open(index_file, "w", encoding="utf-8") as fp: + if common.options.pretty: + json.dump(output, fp, default=_index_encoder_default, indent=2, ensure_ascii=False) + else: + json.dump(output, fp, default=_index_encoder_default, ensure_ascii=False) + + json_name = "tmp/{}_{}.json".format(repodir, convert_datetime(repodict["timestamp"])) + with open(json_name, "w", encoding="utf-8") as fp: + if common.options.pretty: + json.dump(output, fp, default=_index_encoder_default, indent=2, ensure_ascii=False) + else: + json.dump(output, fp, default=_index_encoder_default, ensure_ascii=False) + + entry["index"] = file_entry(index_file) + entry["index"]["numPackages"] = len(output.get("packages", [])) + + indexes = sorted(Path().glob("tmp/{}*.json".format(repodir)), key=lambda x: x.name) + indexes.pop() # remove current index + # remove older indexes + while len(indexes) > 10: + indexes.pop(0).unlink() + + indexes = [json.loads(Path(fn).read_text(encoding="utf-8")) for fn in indexes] + + for diff in Path().glob("{}/diff/*.json".format(repodir)): + diff.unlink() + + entry["diffs"] = {} + for old in indexes: + diff_name = str(old["repo"]["timestamp"]) + ".json" + diff_file = os.path.join(repodir, "diff", diff_name) + diff = dict_diff(old, output) + if not os.path.exists(os.path.join(repodir, "diff")): + os.makedirs(os.path.join(repodir, "diff")) + with open(diff_file, "w", encoding="utf-8") as fp: + if common.options.pretty: + json.dump(diff, fp, default=_index_encoder_default, indent=2, ensure_ascii=False) + else: + json.dump(diff, fp, default=_index_encoder_default, ensure_ascii=False) + + entry["diffs"][old["repo"]["timestamp"]] = file_entry(diff_file) + entry["diffs"][old["repo"]["timestamp"]]["numPackages"] = len(diff.get("packages", [])) + + json_name = "entry.json" + index_file = os.path.join(repodir, json_name) + with open(index_file, "w", encoding="utf-8") as fp: + if common.options.pretty: + json.dump(entry, fp, default=_index_encoder_default, indent=2, ensure_ascii=False) + else: + json.dump(entry, fp, default=_index_encoder_default, ensure_ascii=False) + + if common.options.nosign: + _copy_to_local_copy_dir(repodir, index_file) + logging.debug(_('index-v2 must have a signature, use `fdroid signindex` to create it!')) + else: + signindex.config = common.config + signindex.sign_index(repodir, json_name, signindex.HashAlg.SHA256) + + def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_fingerprints): def _index_encoder_default(obj): @@ -504,7 +895,10 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ 'ArchivePolicy', 'AutoName', 'AutoUpdateMode', 'MaintainerNotes', 'Provides', 'Repo', 'RepoType', 'RequiresRoot', 'UpdateCheckData', 'UpdateCheckIgnore', 'UpdateCheckMode', - 'UpdateCheckName', 'NoSourceSince', 'VercodeOperation'): + 'UpdateCheckName', 'NoSourceSince', 'VercodeOperation', + 'summary', 'description', 'promoGraphic', 'screenshots', 'whatsNew', + 'featureGraphic', 'iconv2', 'tvBanner', + ): continue # name things after the App class fields in fdroidclient @@ -573,7 +967,7 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ logging.debug(_('index-v1 must have a signature, use `fdroid signindex` to create it!')) else: signindex.config = common.config - signindex.sign_index_v1(repodir, json_name) + signindex.sign_index(repodir, json_name) def _copy_to_local_copy_dir(repodir, f): diff --git a/fdroidserver/signindex.py b/fdroidserver/signindex.py index fae079de..3e532f17 100644 --- a/fdroidserver/signindex.py +++ b/fdroidserver/signindex.py @@ -21,6 +21,7 @@ import os import time import zipfile from argparse import ArgumentParser +from enum import Enum import logging from . import _ @@ -33,29 +34,46 @@ options = None start_timestamp = time.gmtime() -def sign_jar(jar): +HashAlg = Enum("SHA1", "SHA256") + + +def sign_jar(jar, hash_algorithm=None): """Sign a JAR file with Java's jarsigner. This method requires a properly initialized config object. - - This does use old hashing algorithms, i.e. SHA1, but that's not - broken yet for file verification. This could be set to SHA256, - but then Android < 4.3 would not be able to verify it. - https://code.google.com/p/android/issues/detail?id=38321 """ - args = [ - config['jarsigner'], - '-keystore', - config['keystore'], - '-storepass:env', - 'FDROID_KEY_STORE_PASS', - '-digestalg', - 'SHA1', - '-sigalg', - 'SHA1withRSA', - jar, - config['repo_keyalias'], - ] + if hash_algorithm == HashAlg.SHA256: + args = [ + config['jarsigner'], + '-keystore', + config['keystore'], + '-storepass:env', + 'FDROID_KEY_STORE_PASS', + '-digestalg', + 'SHA-256', + '-sigalg', + 'SHA256withRSA', + jar, + config['repo_keyalias'], + ] + else: + # This does use old hashing algorithms, i.e. SHA1, but that's not + # broken yet for file verification. This could be set to SHA256, + # but then Android < 4.3 would not be able to verify it. + # https://code.google.com/p/android/issues/detail?id=38321 + args = [ + config['jarsigner'], + '-keystore', + config['keystore'], + '-storepass:env', + 'FDROID_KEY_STORE_PASS', + '-digestalg', + 'SHA1', + '-sigalg', + 'SHA1withRSA', + jar, + config['repo_keyalias'], + ] if config['keystore'] == 'NONE': args += config['smartcardoptions'] else: # smardcards never use -keypass @@ -69,7 +87,7 @@ def sign_jar(jar): raise FDroidException("Failed to sign %s!" % jar) -def sign_index_v1(repodir, json_name): +def sign_index(repodir, json_name, hash_algorithm=None): """Sign index-v1.json to make index-v1.jar. This is a bit different than index.jar: instead of their being index.xml @@ -84,12 +102,14 @@ def sign_index_v1(repodir, json_name): # Test if index is valid with open(index_file, encoding="utf-8") as fp: index = json.load(fp) - [metadata.App(app) for app in index["apps"]] + # TODO: add test for index-v2 + if "apps" in index: + [metadata.App(app) for app in index["apps"]] jar_file = os.path.join(repodir, name + '.jar') with zipfile.ZipFile(jar_file, 'w', zipfile.ZIP_DEFLATED) as jar: jar.write(index_file, json_name) - sign_jar(jar_file) + sign_jar(jar_file, hash_algorithm) def status_update_json(signed): @@ -138,7 +158,14 @@ def main(): json_name = 'index-v1.json' index_file = os.path.join(output_dir, json_name) if os.path.exists(index_file): - sign_index_v1(output_dir, json_name) + sign_index(output_dir, json_name) + logging.info('Signed ' + index_file) + signed.append(index_file) + + json_name = 'entry.json' + index_file = os.path.join(output_dir, json_name) + if os.path.exists(index_file): + sign_index(output_dir, json_name, HashAlg.SHA256) logging.info('Signed ' + index_file) signed.append(index_file) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 4db8a2cc..7d88bdde 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -554,7 +554,7 @@ def _get_localized_dict(app, locale): return app['localized'][locale] -def _set_localized_text_entry(app, locale, key, f): +def _set_localized_text_entry(app, locale, key, f, versionCode=None): """Read a fastlane/triple-t metadata file and add an entry to the app. This reads more than the limit, in case there is leading or @@ -563,9 +563,17 @@ def _set_localized_text_entry(app, locale, key, f): """ try: limit = config['char_limits'][key] - localized = _get_localized_dict(app, locale) + if not versionCode: + localized = _get_localized_dict(app, locale) with open(f, errors='replace') as fp: text = fp.read(limit * 2) + if versionCode: + for build in app["Builds"]: + if int(build["versionCode"]) == versionCode: + if "whatsNew" not in build: + build["whatsNew"] = collections.OrderedDict() + build["whatsNew"][locale] = text[:limit] + return if len(text) > 0: if key in ('name', 'summary', 'video'): # hardcoded as a single line localized[key] = text.strip('\n')[:limit] @@ -987,15 +995,33 @@ def insert_localized_app_metadata(apps): locale = segments[-2] _set_localized_text_entry(apps[packageName], locale, 'whatsNew', os.path.join(root, f)) - continue base, extension = common.get_extension(f) + + if extension == 'txt': + try: + versionCode = int(base) + locale = segments[-2] + if base in [a["versionCode"] for a in apps[packageName]["Builds"]]: + _set_localized_text_entry(apps[packageName], locale, 'whatsNew', + os.path.join(root, f), versionCode) + continue + except ValueError: + pass + if locale == 'images': locale = segments[-2] destdir = os.path.join('repo', packageName, locale) if base in GRAPHIC_NAMES and extension in ALLOWED_EXTENSIONS: os.makedirs(destdir, mode=0o755, exist_ok=True) _strip_and_copy_image(os.path.join(root, f), destdir) + dst = os.path.join(destdir, f) + if os.path.isfile(dst): + if base == "icon": + base = "iconv2" + if base not in apps[packageName] or not isinstance(apps[packageName][base], collections.OrderedDict): + apps[packageName][base] = collections.OrderedDict() + apps[packageName][base][locale] = index.file_entry(dst) for d in dirs: if d in SCREENSHOT_DIRS: if locale == 'images': @@ -1044,12 +1070,26 @@ def insert_localized_app_metadata(apps): if not os.path.exists(index_file): os.link(f, index_file, follow_symlinks=False) graphics[base] = filename + if base == "icon": + base = "iconv2" + if base not in apps[packageName] or not isinstance(apps[packageName][base], collections.OrderedDict): + apps[packageName][base] = collections.OrderedDict() + apps[packageName][base][locale] = index.file_entry(index_file) elif screenshotdir in SCREENSHOT_DIRS: # there can any number of these per locale logging.debug(_('adding to {name}: {path}').format(name=screenshotdir, path=f)) if screenshotdir not in graphics: graphics[screenshotdir] = [] graphics[screenshotdir].append(filename) + + newKey = screenshotdir.replace("Screenshots", "") + if "screenshots" not in apps[packageName]: + apps[packageName]["screenshots"] = collections.OrderedDict() + if newKey not in apps[packageName]["screenshots"]: + apps[packageName]["screenshots"][newKey] = collections.OrderedDict() + if locale not in apps[packageName]["screenshots"][newKey]: + apps[packageName]["screenshots"][newKey][locale] = [] + apps[packageName]["screenshots"][newKey][locale].append(index.file_entry(f)) else: logging.warning(_('Unsupported graphics file found: {path}').format(path=f)) diff --git a/tests/common.TestCase b/tests/common.TestCase index a29920be..e77d7b34 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -2372,6 +2372,72 @@ class CommonTest(unittest.TestCase): fdroidserver.common.set_FDroidPopen_env(build) self.assertNotIn('', os.getenv('PATH').split(os.pathsep)) + def test_is_repo_file(self): + is_repo_file = fdroidserver.common.is_repo_file + self.assertFalse(is_repo_file('does-not-exist')) + + with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): + Path('repo').mkdir() + repo_files = [ + 'repo/com.example.test.helloworld_1.apk', + 'repo/com.politedroid_6.apk', + 'repo/duplicate.permisssions_9999999.apk', + 'repo/fake.ota.update_1234.zip', + 'repo/info.guardianproject.index-v1.jar_123.apk', + 'repo/info.zwanenburg.caffeinetile_4.apk', + 'repo/main.1101613.obb.main.twoversions.obb', + ] + index_files = [ + 'repo/entry.jar', + 'repo/entry.json', + 'repo/index-v1.jar', + 'repo/index-v1.json', + 'repo/index-v2.jar', + 'repo/index-v2.json', + 'repo/index.css', + 'repo/index.html', + 'repo/index.jar', + 'repo/index.png', + 'repo/index.xml', + ] + non_repo_files = ['repo/categories.txt'] + for f in repo_files + index_files + non_repo_files: + open(f, 'w').close() + + repo_dirs = [ + 'repo/com.politedroid', + 'repo/info.guardianproject.index-v1.jar', + 'repo/status', + ] + for d in repo_dirs: + os.mkdir(d) + + for f in repo_files: + self.assertTrue(os.path.exists(f), f + ' was created') + self.assertTrue(is_repo_file(f), f + ' is repo file') + + for f in index_files: + self.assertTrue(os.path.exists(f), f + ' was created') + self.assertFalse(is_repo_file(f), f + ' is repo file') + gpg_signed = [ + 'repo/entry.json', + 'repo/index-v1.json', + 'repo/index-v2.json', + ] + self.assertEqual( + (f in gpg_signed or is_repo_file(f, for_gpg_signing=False)), + is_repo_file(f, for_gpg_signing=True), + f + ' gpg signable?', + ) + + for d in repo_dirs: + self.assertTrue(os.path.exists(d), d + ' was created') + self.assertFalse(is_repo_file(d), d + ' not repo file') + + for f in non_repo_files: + self.assertTrue(os.path.exists(f), f + ' was created') + self.assertFalse(is_repo_file(f), f + ' not repo file') + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) diff --git a/tests/gpgsign.TestCase b/tests/gpgsign.TestCase new file mode 100755 index 00000000..a4e8a0d3 --- /dev/null +++ b/tests/gpgsign.TestCase @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 + +import inspect +import json +import logging +import optparse +import os +import shutil +import sys +import tempfile +import unittest + +localmodule = os.path.realpath( + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) +print('localmodule: ' + localmodule) +if localmodule not in sys.path: + sys.path.insert(0, localmodule) + +from fdroidserver import common, gpgsign +from pathlib import Path +from unittest.mock import MagicMock, patch + + +class GpgsignTest(unittest.TestCase): + + basedir = Path(__file__).resolve().parent + + def setUp(self): + logging.basicConfig(level=logging.DEBUG) + self.tempdir = tempfile.TemporaryDirectory() + os.chdir(self.tempdir.name) + self.repodir = Path('repo') + self.repodir.mkdir() + + gpgsign.config = None + config = common.read_config(common.options) + config['verbose'] = True + config['gpghome'] = str((self.basedir / 'gnupghome').resolve()) + config['gpgkey'] = '1DBA2E89' + gpgsign.config = config + + def tearDown(self): + self.tempdir.cleanup() + + @patch('sys.argv', ['fdroid gpgsign', '--verbose']) + @patch('fdroidserver.gpgsign.FDroidPopen') + def test_sign_index(self, FDroidPopen): + """This skips running gpg because its hard to setup in a test env""" + index_v1_json = 'repo/index-v1.json' + shutil.copy(str(self.basedir / index_v1_json), 'repo') + shutil.copy(str(self.basedir / 'SpeedoMeterApp.main_1.apk'), 'repo') + + def _side_effect(gpg): + f = gpg[-1] + sig = gpg[3] + self.assertTrue(sig.startswith(f)) + open(sig, 'w').close() + p = MagicMock() + p.returncode = 0 + return p + + FDroidPopen.side_effect = _side_effect + gpgsign.main() + self.assertTrue(FDroidPopen.called) + self.assertTrue((self.repodir / 'index-v1.json').exists()) + self.assertTrue((self.repodir / 'index-v1.json.asc').exists()) + self.assertTrue((self.repodir / 'SpeedoMeterApp.main_1.apk.asc').exists()) + self.assertFalse((self.repodir / 'index.jar.asc').exists()) + # smoke check status JSON + with (self.repodir / 'status/gpgsign.json').open() as fp: + data = json.load(fp) + self.assertTrue('index-v1.json' in data['signed']) + + +if __name__ == "__main__": + os.chdir(os.path.dirname(__file__)) + + parser = optparse.OptionParser() + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) + (common.options, args) = parser.parse_args(['--verbose']) + + newSuite = unittest.TestSuite() + newSuite.addTest(unittest.makeSuite(GpgsignTest)) + unittest.main(failfast=False) diff --git a/tests/index.TestCase b/tests/index.TestCase index 0c8b80ab..b101eb46 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -57,7 +57,7 @@ class IndexTest(unittest.TestCase): fdroidserver.signindex.config = config if not os.path.exists('repo/index-v1.jar'): - fdroidserver.signindex.sign_index_v1( + fdroidserver.signindex.sign_index( os.path.join(self.basedir, 'repo'), 'index-v1.json' ) diff --git a/tests/signindex.TestCase b/tests/signindex.TestCase index 7966821d..98ff8313 100755 --- a/tests/signindex.TestCase +++ b/tests/signindex.TestCase @@ -56,17 +56,17 @@ class SignindexTest(unittest.TestCase): def tearDown(self): self.tempdir.cleanup() - def test_sign_index_v1(self): + def test_sign_index(self): shutil.copy(str(self.basedir / 'repo/index-v1.json'), 'repo') - signindex.sign_index_v1(str(self.repodir), 'index-v1.json') + signindex.sign_index(str(self.repodir), 'index-v1.json') self.assertTrue((self.repodir / 'index-v1.jar').exists()) self.assertTrue((self.repodir / 'index-v1.json').exists()) - def test_sign_index_v1_corrupt(self): + def test_sign_index_corrupt(self): with open('repo/index-v1.json', 'w') as fp: fp.write('corrupt JSON!') with self.assertRaises(json.decoder.JSONDecodeError, msg='error on bad JSON'): - signindex.sign_index_v1(str(self.repodir), 'index-v1.json') + signindex.sign_index(str(self.repodir), 'index-v1.json') def test_signindex(self): os.mkdir('archive') From b07d23ff5c69f47319a305c10eac0e47aac2a5fd Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 19 May 2022 13:49:15 +0200 Subject: [PATCH 0638/2116] Don't include disabled apks in the index This needs a rerun of `fdroid update --clean`. In case a build is disabled delete_disabled_builds takes care of deleting it from the repo. But this only works if the apk follows the normal name pattern. Otherwise it will stay in the folder and be picked up by process_apks and added to the index. Closes: #1002 --- fdroidserver/update.py | 18 +++++++++++++----- tests/update.TestCase | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 7d88bdde..5ab7ad14 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1415,7 +1415,7 @@ def scan_apk_androguard(apk, apkfile): def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=False, - allow_disabled_algorithms=False, archive_bad_sig=False): + allow_disabled_algorithms=False, archive_bad_sig=False, apps=None): """Process the apk with the given filename in the given repo directory. This also extracts the icons. @@ -1468,6 +1468,12 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal .format(apkfilename=apkfilename)) return True, None, False + if apps: + if apk['packageName'] in apps: + for build in apps[apk['packageName']].get('Builds', []): + if int(build['versionCode']) == apk['versionCode'] and build['disable']: + return True, None, False + # Check for debuggable apks... if common.is_apk_and_debuggable(apkfile): logging.warning('{0} is set to android:debuggable="true"'.format(apkfile)) @@ -1560,7 +1566,7 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal return False, apk, cachechanged -def process_apks(apkcache, repodir, knownapks, use_date_from_apk=False): +def process_apks(apkcache, repodir, knownapks, use_date_from_apk=False, apps=None): """Process the apks in the given repo directory. This also extracts the icons. @@ -1596,7 +1602,7 @@ def process_apks(apkcache, repodir, knownapks, use_date_from_apk=False): apkfilename = apkfile[len(repodir) + 1:] ada = disabled_algorithms_allowed() (skip, apk, cachethis) = process_apk(apkcache, apkfilename, repodir, knownapks, - use_date_from_apk, ada, True) + use_date_from_apk, ada, True, apps) if skip: continue apks.append(apk) @@ -2209,7 +2215,8 @@ def main(): delete_disabled_builds(apps, apkcache, repodirs) # Scan all apks in the main repo - apks, cachechanged = process_apks(apkcache, repodirs[0], knownapks, options.use_date_from_apk) + apks, cachechanged = process_apks(apkcache, repodirs[0], knownapks, + options.use_date_from_apk, apps) files, fcachechanged = scan_repo_files(apkcache, repodirs[0], knownapks, options.use_date_from_apk) @@ -2272,7 +2279,8 @@ def main(): # Scan the archive repo for apks as well if len(repodirs) > 1: - archapks, cc = process_apks(apkcache, repodirs[1], knownapks, options.use_date_from_apk) + archapks, cc = process_apks(apkcache, repodirs[1], knownapks, + options.use_date_from_apk, apps) if cc: cachechanged = True else: diff --git a/tests/update.TestCase b/tests/update.TestCase index 4d425382..1c2d3d95 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1716,6 +1716,38 @@ class UpdateTest(unittest.TestCase): self.maxDiff = None self.assertEqual(apkaapt, apkandroguard) + def test_exclude_disabled_apks(self): + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.chdir(testdir) + os.mkdir('repo') + testapk = os.path.join('repo', 'com.politedroid_6.apk') + testapk_new = os.path.join('repo', 'Politedroid-1.5.apk') + shutil.copy(os.path.join(self.basedir, testapk), testapk_new) + + config = dict() + fdroidserver.common.fill_config_defaults(config) + config['ndk_paths'] = dict() + fdroidserver.common.config = config + fdroidserver.update.config = config + + fdroidserver.common.options = Options + fdroidserver.update.options = fdroidserver.common.options + fdroidserver.update.options.clean = True + + app = fdroidserver.metadata.App() + app.id = 'com.politedroid' + apps = {app.id: app} + build = fdroidserver.metadata.Build() + build.versionCode = 6 + build.disable = "disabled" + app['Builds'] = [build] + + knownapks = fdroidserver.common.KnownApks() + apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False, apps) + self.assertEqual([], apks) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From e6944ea4c26c4131b5c4761cb17ce4747f42d410 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 19 May 2022 09:12:55 +0200 Subject: [PATCH 0639/2116] gitlab-ci: run test suite in the buildserver environment Run the whole test suite in an environment that is like the buildserver guest VM. This installs python3-babel because that is only used by the test suite, and not needed in the buildserver. Some extra packages are required for this test run that are not provided by the buildserver since they are not needed there: * gnupg-agent for the full signing setup * python3-babel for compiling localization files * python3-clint for fancy progress bars for users fdroid/ci-images-base is deprecated and archived. --- .gitlab-ci.yml | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 156c89a1..71a1e410 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,12 +5,20 @@ variables: GIT_DEPTH: 1 -# Run the whole test suite in an environment that is like the buildserver guest VM. -ci-images-base run-tests: - image: registry.gitlab.com/fdroid/ci-images-base +# Run the whole test suite in an environment that is like the +# buildserver guest VM. This installs python3-babel because that is +# only used by the test suite, and not needed in the buildserver. +# +# Some extra packages are required for this test run that are not +# provided by the buildserver since they are not needed there: +# * python3-babel for compiling localization files +# * gnupg-agent for the full signing setup +# * python3-clint for fancy progress bars for users +buildserver run-tests: + image: registry.gitlab.com/fdroid/fdroidserver:buildserver script: - - $pip install --upgrade pip setuptools wheel # make this go away: "error: invalid command 'bdist_wheel'" - - $pip install -e . + - apt-get update + - apt-get install gnupg-agent python3-babel python3-clint - ./tests/run-tests # make sure that translations do not cause stacktraces - cd $CI_PROJECT_DIR/locale @@ -29,7 +37,7 @@ ci-images-base run-tests: # The COMMIT_ID should be bumped after each release, so that the list # of sed hacks needed does not continuously grow. metadata_v0: - image: registry.gitlab.com/fdroid/ci-images-base + image: registry.gitlab.com/fdroid/fdroidserver:buildserver variables: GIT_DEPTH: 1000 RELEASE_COMMIT_ID: 37c95f59a17d86723fdb71e984121726db777f32 # 2.0a5~ From 053a64718a90e37d2bc5e90c40b29e3159cd415d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 23 May 2022 11:36:06 +0200 Subject: [PATCH 0640/2116] deploy: handle index-v2 files on two pass sync methods When using rsync or s3cmd, the upload is done in multiple passes. This reduces the chance of interfering with an existing client-server interaction. - rsync: In the first pass, upload without the index files and delay the deletion as much as possible. That keeps the repo functional while this update is running. Then second pass uploads the index files. - s3cmd: In the first pass, only new files are uploaded. In the second pass, changed files are uploaded, overwriting what is on the server. On the third/last pass, the indexes are uploaded, and any removed files are deleted from the server. The last pass is the only pass to use a full MD5 checksum of all files to detect changes. --- fdroidserver/deploy.py | 75 +++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 33 deletions(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index a19bdeda..304bc2fd 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -46,6 +46,35 @@ USER_S3CFG = 's3cfg' REMOTE_HOSTNAME_REGEX = re.compile(r'\W*\w+\W+(\w+).*') +def _get_index_excludes(repo_section): + """The list of files to be synced last, since they finalize the deploy. + + The process of pushing all the new packages to the various + services can take a while. So the index files should be updated + last. That ensures that the package files are available when the + client learns about them from the new index files. + + """ + indexes = [ + os.path.join(repo_section, 'entry.jar'), + os.path.join(repo_section, 'entry.json'), + os.path.join(repo_section, 'entry.json.asc'), + os.path.join(repo_section, 'index-v1.jar'), + os.path.join(repo_section, 'index-v1.json'), + os.path.join(repo_section, 'index-v1.json.asc'), + os.path.join(repo_section, 'index-v2.jar'), + os.path.join(repo_section, 'index-v2.json'), + os.path.join(repo_section, 'index-v2.json.asc'), + os.path.join(repo_section, 'index.jar'), + os.path.join(repo_section, 'index.xml'), + ] + index_excludes = [] + for f in indexes: + index_excludes.append('--exclude') + index_excludes.append(f) + return index_excludes + + def update_awsbucket(repo_section): """Upload the contents of the directory `repo_section` (including subdirectories) to the AWS S3 "bucket". @@ -104,33 +133,23 @@ def update_awsbucket_s3cmd(repo_section): s3cmd_sync += ['--verbose'] if options.quiet: s3cmd_sync += ['--quiet'] - indexxml = os.path.join(repo_section, 'index.xml') - indexjar = os.path.join(repo_section, 'index.jar') - indexv1jar = os.path.join(repo_section, 'index-v1.jar') - indexv1json = os.path.join(repo_section, 'index-v1.json') - indexv1jsonasc = os.path.join(repo_section, 'index-v1.json.asc') s3url = s3bucketurl + '/fdroid/' logging.debug('s3cmd sync new files in ' + repo_section + ' to ' + s3url) logging.debug(_('Running first pass with MD5 checking disabled')) - if subprocess.call(s3cmd_sync - + ['--no-check-md5', '--skip-existing', - '--exclude', indexxml, - '--exclude', indexjar, - '--exclude', indexv1jar, - '--exclude', indexv1json, - '--exclude', indexv1jsonasc, - repo_section, s3url]) != 0: + excludes = _get_index_excludes(repo_section) + returncode = subprocess.call( + s3cmd_sync + + excludes + + ['--no-check-md5', '--skip-existing', repo_section, s3url] + ) + if returncode != 0: raise FDroidException() logging.debug('s3cmd sync all files in ' + repo_section + ' to ' + s3url) - if subprocess.call(s3cmd_sync - + ['--no-check-md5', - '--exclude', indexxml, - '--exclude', indexjar, - '--exclude', indexv1jar, - '--exclude', indexv1json, - '--exclude', indexv1jsonasc, - repo_section, s3url]) != 0: + returncode = subprocess.call( + s3cmd_sync + excludes + ['--no-check-md5', repo_section, s3url] + ) + if returncode != 0: raise FDroidException() logging.debug(_('s3cmd sync indexes {path} to {url} and delete') @@ -254,11 +273,6 @@ def update_serverwebroot(serverwebroot, repo_section): rsyncargs += ['-e', 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + options.identity_file] elif 'identity_file' in config: rsyncargs += ['-e', 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + config['identity_file']] - indexxml = os.path.join(repo_section, 'index.xml') - indexjar = os.path.join(repo_section, 'index.jar') - indexv1jar = os.path.join(repo_section, 'index-v1.jar') - indexv1json = os.path.join(repo_section, 'index-v1.json') - indexv1jsonasc = os.path.join(repo_section, 'index-v1.json.asc') # Upload the first time without the index files and delay the deletion as # much as possible, that keeps the repo functional while this update is # running. Then once it is complete, rerun the command again to upload @@ -267,13 +281,8 @@ def update_serverwebroot(serverwebroot, repo_section): # the one rsync command that is allowed to run in ~/.ssh/authorized_keys. # (serverwebroot is guaranteed to have a trailing slash in common.py) logging.info('rsyncing ' + repo_section + ' to ' + serverwebroot) - if subprocess.call(rsyncargs - + ['--exclude', indexxml, - '--exclude', indexjar, - '--exclude', indexv1jar, - '--exclude', indexv1json, - '--exclude', indexv1jsonasc, - repo_section, serverwebroot]) != 0: + excludes = _get_index_excludes(repo_section) + if subprocess.call(rsyncargs + excludes + [repo_section, serverwebroot]) != 0: raise FDroidException() if subprocess.call(rsyncargs + [repo_section, serverwebroot]) != 0: raise FDroidException() From 293975d08112105dbe5e955dc88ea8c777a052ce Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 23 May 2022 11:36:06 +0200 Subject: [PATCH 0641/2116] refactor comment into docstring for update_serverwebroot --- fdroidserver/deploy.py | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 304bc2fd..318250b4 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -260,8 +260,22 @@ def update_awsbucket_libcloud(repo_section): def update_serverwebroot(serverwebroot, repo_section): - # use a checksum comparison for accurate comparisons on different - # filesystems, for example, FAT has a low resolution timestamp + """Deploy the index files to the serverwebroot using rsync. + + Upload the first time without the index files and delay the + deletion as much as possible. That keeps the repo functional + while this update is running. Then once it is complete, rerun the + command again to upload the index files. Always using the same + target with rsync allows for very strict settings on the receiving + server, you can literally specify the one rsync command that is + allowed to run in ~/.ssh/authorized_keys. (serverwebroot is + guaranteed to have a trailing slash in common.py) + + It is possible to optionally use a checksum comparison for + accurate comparisons on different filesystems, for example, FAT + has a low resolution timestamp + + """ rsyncargs = ['rsync', '--archive', '--delete-after', '--safe-links'] if not options.no_checksum: rsyncargs.append('--checksum') @@ -273,13 +287,6 @@ def update_serverwebroot(serverwebroot, repo_section): rsyncargs += ['-e', 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + options.identity_file] elif 'identity_file' in config: rsyncargs += ['-e', 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + config['identity_file']] - # Upload the first time without the index files and delay the deletion as - # much as possible, that keeps the repo functional while this update is - # running. Then once it is complete, rerun the command again to upload - # the index files. Always using the same target with rsync allows for - # very strict settings on the receiving server, you can literally specify - # the one rsync command that is allowed to run in ~/.ssh/authorized_keys. - # (serverwebroot is guaranteed to have a trailing slash in common.py) logging.info('rsyncing ' + repo_section + ' to ' + serverwebroot) excludes = _get_index_excludes(repo_section) if subprocess.call(rsyncargs + excludes + [repo_section, serverwebroot]) != 0: From 2448f070e9a9e88f048370d82e4acc761f308ab2 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 23 May 2022 15:25:05 +0200 Subject: [PATCH 0642/2116] fix tests and docstring error --- fdroidserver/deploy.py | 2 +- tests/deploy.TestCase | 32 ++++++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 318250b4..953c6f71 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -47,7 +47,7 @@ REMOTE_HOSTNAME_REGEX = re.compile(r'\W*\w+\W+(\w+).*') def _get_index_excludes(repo_section): - """The list of files to be synced last, since they finalize the deploy. + """Return the list of files to be synced last, since they finalize the deploy. The process of pushing all the new packages to the various services can take a while. So the index files should be updated diff --git a/tests/deploy.TestCase b/tests/deploy.TestCase index f493d7ea..046dcc2b 100755 --- a/tests/deploy.TestCase +++ b/tests/deploy.TestCase @@ -57,15 +57,27 @@ class DeployTest(unittest.TestCase): '--safe-links', '--quiet', '--exclude', - 'repo/index.xml', + 'repo/entry.jar', '--exclude', - 'repo/index.jar', + 'repo/entry.json', + '--exclude', + 'repo/entry.json.asc', '--exclude', 'repo/index-v1.jar', '--exclude', 'repo/index-v1.json', '--exclude', 'repo/index-v1.json.asc', + '--exclude', + 'repo/index-v2.jar', + '--exclude', + 'repo/index-v2.json', + '--exclude', + 'repo/index-v2.json.asc', + '--exclude', + 'repo/index.jar', + '--exclude', + 'repo/index.xml', 'repo', 'example.com:/var/www/fdroid', ], @@ -142,15 +154,27 @@ class DeployTest(unittest.TestCase): 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + fdroidserver.deploy.config['identity_file'], '--exclude', - 'archive/index.xml', + 'archive/entry.jar', '--exclude', - 'archive/index.jar', + 'archive/entry.json', + '--exclude', + 'archive/entry.json.asc', '--exclude', 'archive/index-v1.jar', '--exclude', 'archive/index-v1.json', '--exclude', 'archive/index-v1.json.asc', + '--exclude', + 'archive/index-v2.jar', + '--exclude', + 'archive/index-v2.json', + '--exclude', + 'archive/index-v2.json.asc', + '--exclude', + 'archive/index.jar', + '--exclude', + 'archive/index.xml', 'archive', serverwebroot, ], From 7be0ec35721f77a8a49169167d7b9fb2e80ec3b4 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 23 May 2022 20:35:08 +0200 Subject: [PATCH 0643/2116] btlog: include index-v2.json entry.json and entry.jar --- fdroidserver/btlog.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/fdroidserver/btlog.py b/fdroidserver/btlog.py index e014b639..8238a5d8 100755 --- a/fdroidserver/btlog.py +++ b/fdroidserver/btlog.py @@ -182,7 +182,15 @@ def main(): os.makedirs(tempdir, exist_ok=True) gitrepodir = os.path.join(options.git_repo, repodir) os.makedirs(gitrepodir, exist_ok=True) - for f in ('index.jar', 'index.xml', 'index-v1.jar', 'index-v1.json'): + for f in ( + 'entry.jar', + 'entry.json', + 'index-v1.jar', + 'index-v1.json', + 'index-v2.json', + 'index.jar', + 'index.xml', + ): dlfile = os.path.join(tempdir, f) dlurl = options.url + '/' + repodir + '/' + f http_headers_file = os.path.join(gitrepodir, f + '.HTTP-headers.json') From 4ce3da476dadc53c5ef05d42b151d9257bff85b0 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 23 May 2022 20:41:05 +0200 Subject: [PATCH 0644/2116] btlog: run black to format code --- .gitlab-ci.yml | 1 + fdroidserver/btlog.py | 38 ++++++++++++++++++++++++++------------ 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 71a1e410..97e799c5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -235,6 +235,7 @@ black: examples/fdroid_extract_repo_pubkey.py examples/makebuildserver.config.py fdroid + fdroidserver/btlog.py fdroidserver/exception.py fdroidserver/gpgsign.py fdroidserver/lint.py diff --git a/fdroidserver/btlog.py b/fdroidserver/btlog.py index 8238a5d8..b5499d09 100755 --- a/fdroidserver/btlog.py +++ b/fdroidserver/btlog.py @@ -70,7 +70,8 @@ def make_binary_transparency_log( if not url: url = common.config['repo_url'].rstrip('/') with open(os.path.join(btrepo, 'README.md'), 'w') as fp: - fp.write(""" + fp.write( + """ # Binary Transparency Log for %s This is a log of the signed app index metadata. This is stored in a @@ -80,8 +81,10 @@ F-Droid repository was a publicly released file. For more info on this idea: * https://wiki.mozilla.org/Security/Binary_Transparency -""" % url[:url.rindex('/')]) # strip '/repo' - gitrepo.index.add(['README.md', ]) +""" + % url[: url.rindex('/')] # strip '/repo' + ) + gitrepo.index.add(['README.md']) gitrepo.index.commit('add README') for repodir in repodirs: @@ -150,13 +153,22 @@ def main(): parser = ArgumentParser() common.setup_global_opts(parser) - parser.add_argument("--git-repo", - default=os.path.join(os.getcwd(), 'binary_transparency'), - help=_("Path to the git repo to use as the log")) - parser.add_argument("-u", "--url", default='https://f-droid.org', - help=_("The base URL for the repo to log (default: https://f-droid.org)")) - parser.add_argument("--git-remote", default=None, - help=_("Push the log to this git remote repository")) + parser.add_argument( + "--git-repo", + default=os.path.join(os.getcwd(), 'binary_transparency'), + help=_("Path to the git repo to use as the log"), + ) + parser.add_argument( + "-u", + "--url", + default='https://f-droid.org', + help=_("The base URL for the repo to log (default: https://f-droid.org)"), + ) + parser.add_argument( + "--git-remote", + default=None, + help=_("Push the log to this git remote repository"), + ) options = parser.parse_args() if options.verbose: @@ -204,7 +216,7 @@ def main(): r = session.head(dlurl, headers=headers, allow_redirects=False) if r.status_code != 200: logging.debug( - 'HTTP Response (' + str(r.status_code) + '), did not download ' + dlurl + 'HTTP Response (%d), did not download %s' % (r.status_code, dlurl) ) continue if etag and etag == r.headers.get('ETag'): @@ -226,7 +238,9 @@ def main(): if new_files: os.chdir(tempdirbase) - make_binary_transparency_log(repodirs, options.git_repo, options.url, 'fdroid btlog') + make_binary_transparency_log( + repodirs, options.git_repo, options.url, 'fdroid btlog' + ) if options.git_remote: deploy.push_binary_transparency(options.git_repo, options.git_remote) shutil.rmtree(tempdirbase, ignore_errors=True) From 5448fa2a2d94e1d561eaa7d51ae66d300d624af1 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 23 May 2022 21:20:41 +0200 Subject: [PATCH 0645/2116] update: hide confusing androguard warning that is irrelevant here This is related to androguard features that fdroidserver does not use: WARNING: Requested API level 31 is larger than maximum we have, returning API level 28 instead. --- fdroidserver/common.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 8cb96cac..b18887c7 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2592,6 +2592,7 @@ def use_androguard(): use_androguard.show_path = False if options and options.verbose: logging.getLogger("androguard.axml").setLevel(logging.INFO) + logging.getLogger("androguard.core.api_specific_resources").setLevel(logging.ERROR) return True except ImportError: return False From cbd4828561257ebb4f2af545784513b63c0c7b94 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 23 May 2022 23:10:52 +0200 Subject: [PATCH 0646/2116] include index-v2 in signindex tests --- tests/signindex.TestCase | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/signindex.TestCase b/tests/signindex.TestCase index 98ff8313..79977e8d 100755 --- a/tests/signindex.TestCase +++ b/tests/signindex.TestCase @@ -76,7 +76,15 @@ class SignindexTest(unittest.TestCase): fp.write('# placeholder') shutil.copy(str(self.basedir / 'urzip.apk'), 'repo') index_files = [] - for f in ('index.xml', 'index.jar', 'index-v1.json', 'index-v1.jar'): + for f in ( + 'entry.jar', + 'entry.json', + 'index-v1.jar', + 'index-v1.json', + 'index-v2.json', + 'index.jar', + 'index.xml', + ): for section in (Path('repo'), Path('archive')): path = section / f self.assertFalse(path.exists(), '%s should not exist yet!' % path) From a4d0698628c39e5b2ba06ae3344441e75abb1a5e Mon Sep 17 00:00:00 2001 From: Danilo Bargen Date: Tue, 19 Apr 2022 17:42:26 +0200 Subject: [PATCH 0647/2116] Fix parsing of smartcardoptions config With the previous code, a trailing newline would result in an empty space being part of the list. When this is passed to keytool, it fails with "Illegal option: ". Instead of doing overly complicated regex based string substitution followed by parametrized splitting, we can simply use `.split()` without any parameters, and Python will automatically strip any whitespace. --- fdroidserver/common.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index b18887c7..7d1b6715 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -385,7 +385,8 @@ def read_config(opts=None): # smartcardoptions must be a list since its command line args for Popen smartcardoptions = config.get('smartcardoptions') if isinstance(smartcardoptions, str): - config['smartcardoptions'] = re.sub(r'\s+', r' ', config['smartcardoptions']).split(' ') + options = re.sub(r'\s+', r' ', config['smartcardoptions']).split(' ') + config['smartcardoptions'] = [i.strip() for i in options if i] elif not smartcardoptions and 'keystore' in config and config['keystore'] == 'NONE': # keystore='NONE' means use smartcard, these are required defaults config['smartcardoptions'] = ['-storetype', 'PKCS11', '-providerName', From 2639909f90a4e756b6d2a24b49126006aca8b8fd Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 25 May 2022 10:09:52 +0200 Subject: [PATCH 0648/2116] add test cases for parsing smartcardoptions config field --- tests/common.TestCase | 94 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/tests/common.TestCase b/tests/common.TestCase index e77d7b34..955de457 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -54,6 +54,8 @@ class CommonTest(unittest.TestCase): os.makedirs(self.tmpdir) os.chdir(self.basedir) fdroidserver.common.config = None + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.verbose = False self.path = os.environ['PATH'] self.android_home = os.environ.get('ANDROID_HOME') @@ -2438,6 +2440,98 @@ class CommonTest(unittest.TestCase): self.assertTrue(os.path.exists(f), f + ' was created') self.assertFalse(is_repo_file(f), f + ' not repo file') + def test_get_smartcardoptions_list(self): + os.chdir(self.tmpdir) + with open('config.yml', 'w') as fp: + fp.write( + textwrap.dedent( + """ + smartcardoptions: + - -storetype + - PKCS11 + - -providerName + - SunPKCS11-OpenSC + - -providerClass + - sun.security.pkcs11.SunPKCS11 + - -providerArg + - opensc-fdroid.cfg + """ + ) + ) + config = fdroidserver.common.read_config() + fdroidserver.common.config = config + self.assertTrue(isinstance(config['smartcardoptions'], list)) + self.assertEqual( + [ + '-storetype', + 'PKCS11', + '-providerName', + 'SunPKCS11-OpenSC', + '-providerClass', + 'sun.security.pkcs11.SunPKCS11', + '-providerArg', + 'opensc-fdroid.cfg', + ], + config['smartcardoptions'], + ) + + def test_get_smartcardoptions_spaces(self): + os.chdir(self.tmpdir) + with open('config.yml', 'w') as fp: + fp.write( + textwrap.dedent( + """smartcardoptions: | + -storetype PKCS11 + -providerClass sun.security.pkcs11.SunPKCS11 + -providerArg /etc/pkcs11_java.cfg + + """ + ) + ) + config = fdroidserver.common.read_config() + fdroidserver.common.config = config + self.assertTrue(isinstance(config['smartcardoptions'], list)) + self.assertEqual( + [ + '-storetype', + 'PKCS11', + '-providerClass', + 'sun.security.pkcs11.SunPKCS11', + '-providerArg', + '/etc/pkcs11_java.cfg', + ], + config['smartcardoptions'], + ) + + def test_get_smartcardoptions_config_py(self): + os.chdir(self.tmpdir) + with open('config.py', 'w') as fp: + fp.write( + textwrap.dedent( + """ + smartcardoptions = ''' + \t-storetype\tPKCS11 + \t-providerClass\tsun.security.pkcs11.SunPKCS11 + \t-providerArg\t/etc/pkcs11_java.cfg + + ''' + """ + ) + ) + config = fdroidserver.common.read_config() + fdroidserver.common.config = config + self.assertEqual( + [ + '-storetype', + 'PKCS11', + '-providerClass', + 'sun.security.pkcs11.SunPKCS11', + '-providerArg', + '/etc/pkcs11_java.cfg', + ], + config['smartcardoptions'], + ) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 2c1659935affcb0f2e24815494d7611d1079c1d9 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sun, 22 May 2022 05:30:51 +0000 Subject: [PATCH 0649/2116] AGP 7.2.0 requires gradle 7.3.3 --- gradlew-fdroid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 1081607e..f3764f42 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -194,8 +194,8 @@ contains() { # (key) should accept. plugin versions are actually prefixes and catch sub- # versions as well. Pairs are taken from: # https://developer.android.com/studio/releases/gradle-plugin.html#updating-gradle -d_plugin_k=(7.2 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 1.3 1.2 1.1 1.0 0.14 0.13 0.12 0.11 0.10 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2) -d_plugin_v=(7.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) +d_plugin_k=(7.2.0 7.2 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 1.3 1.2 1.1 1.0 0.14 0.13 0.12 0.11 0.10 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2) +d_plugin_v=(7.3.3 7.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about plugin_v=(7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) From b75a34241f7deecd2734c79571940ed04fc73156 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 25 May 2022 02:39:36 +0000 Subject: [PATCH 0650/2116] Apply 2 suggestion(s) to 1 file(s) --- gradlew-fdroid | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index f3764f42..92315738 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -193,9 +193,9 @@ contains() { # key-value pairs of what gradle version (value) each gradle plugin version # (key) should accept. plugin versions are actually prefixes and catch sub- # versions as well. Pairs are taken from: -# https://developer.android.com/studio/releases/gradle-plugin.html#updating-gradle -d_plugin_k=(7.2.0 7.2 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 1.3 1.2 1.1 1.0 0.14 0.13 0.12 0.11 0.10 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2) -d_plugin_v=(7.3.3 7.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) +# https://developer.android.com/studio/releases/gradle-plugin#updating-gradle +d_plugin_k=(7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 1.3 1.2 1.1 1.0 0.14 0.13 0.12 0.11 0.10 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2) +d_plugin_v=(7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about plugin_v=(7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) From 762c945c42e70b6b2019f8cdfe0fa994011735b5 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Thu, 26 May 2022 15:10:14 +0000 Subject: [PATCH 0651/2116] Android NDK None (None) --- fdroidserver/common.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 7d1b6715..6aa44a28 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4590,6 +4590,12 @@ NDKS = [ "sha256": "c6e97f9c8cfe5b7be0a9e6c15af8e7a179475b7ded23e2d1c1fa0945d6fb4382", "url": "https://dl.google.com/android/repository/android-ndk-r23b-linux.zip" }, + { + "release": "r23c", + "revision": "23.2.8568313", + "sha256": "6ce94604b77d28113ecd588d425363624a5228d9662450c48d2e4053f8039242", + "url": "https://dl.google.com/android/repository/android-ndk-r23c-linux.zip" + }, { "release": "r24", "revision": "24.0.8215888", From 5951a6c2b1f7c1ee7b02b80e2333aed88b4a78e4 Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Thu, 26 May 2022 19:56:50 +0200 Subject: [PATCH 0652/2116] [import] Fix crash when no Gradle subdir is found --- fdroidserver/import.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fdroidserver/import.py b/fdroidserver/import.py index 0b615fc8..d524632b 100644 --- a/fdroidserver/import.py +++ b/fdroidserver/import.py @@ -194,6 +194,9 @@ def main(): elif subdir: build.subdir = subdir.as_posix() build.gradle = ['yes'] + else: + # subdir might be None + subdir = Path() if options.license: app.License = options.license From c6dcc82ca4f62fc69dff31c4cdd026f72fc39d5f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 27 Apr 2022 13:18:04 +0200 Subject: [PATCH 0653/2116] allow common.get_apk_id() to be used in the API If a project uses fdroidserver as a library, then just calls common.get_apk_id(), it will now work. Before, that project would have had to include something like `common.config = {}` to avoid a stacktrace. --- fdroidserver/common.py | 6 ++++-- tests/common.TestCase | 17 ++++++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 6aa44a28..36ec0071 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2689,9 +2689,11 @@ def get_apk_id(apkfile): try: return get_apk_id_androguard(apkfile) except zipfile.BadZipFile as e: - logging.error(apkfile + ': ' + str(e)) - if 'aapt' in config: + if config and 'aapt' in config: + logging.error(apkfile + ': ' + str(e)) return get_apk_id_aapt(apkfile) + else: + raise e def get_apk_id_androguard(apkfile): diff --git a/tests/common.TestCase b/tests/common.TestCase index 955de457..c511901d 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -21,7 +21,7 @@ import textwrap import yaml import gzip import stat -from zipfile import ZipFile, ZipInfo +from zipfile import BadZipFile, ZipFile, ZipInfo from unittest import mock from pathlib import Path @@ -959,9 +959,24 @@ class CommonTest(unittest.TestCase): self.assertEqual(versionCode, vc, 'aapt versionCode parsing failed for ' + apkfilename) self.assertEqual(versionName, vn, 'aapt versionName parsing failed for ' + apkfilename) + def test_get_apk_id_bad_path(self): with self.assertRaises(FDroidException): fdroidserver.common.get_apk_id('nope') + def test_get_apk_id_api_call(self): + self.assertEqual( + ('info.guardianproject.urzip', '100', '0.1'), + fdroidserver.common.get_apk_id('urzip.apk'), + ) + + def test_get_apk_id_bad_zip(self): + os.chdir(self.tmpdir) + badzip = 'badzip.apk' + with open(badzip, 'w') as fp: + fp.write('not a ZIP') + with self.assertRaises(BadZipFile): + fdroidserver.common.get_apk_id(badzip) + def test_get_apk_id_aapt_regex(self): files = glob.glob(os.path.join(self.basedir, 'build-tools', '[1-9]*.*', '*.txt')) self.assertNotEqual(0, len(files)) From 4ce79a7eaa5cfa1f438d9934b13e74eff896c079 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 1 Jun 2022 22:52:22 +0200 Subject: [PATCH 0654/2116] explicitly re-raising exceptions To fix pylint. --- fdroidserver/apksigcopier.py | 4 ++-- fdroidserver/build.py | 6 +++--- fdroidserver/checkupdates.py | 4 ++-- fdroidserver/common.py | 24 ++++++++++++------------ fdroidserver/update.py | 2 +- fdroidserver/verify.py | 2 +- fdroidserver/vmtools.py | 2 +- 7 files changed, 22 insertions(+), 22 deletions(-) diff --git a/fdroidserver/apksigcopier.py b/fdroidserver/apksigcopier.py index adc3e507..50a26945 100644 --- a/fdroidserver/apksigcopier.py +++ b/fdroidserver/apksigcopier.py @@ -147,8 +147,8 @@ def noautoyes(value): return value try: return {False: NO, None: AUTO, True: YES}[value] - except KeyError: - raise ValueError("expected False, None, or True") + except KeyError as exc: + raise ValueError("expected False, None, or True") from exc def is_meta(filename): diff --git a/fdroidserver/build.py b/fdroidserver/build.py index d7cf8ca5..a358d7d3 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -131,7 +131,7 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): sshinfo['user'] + "@" + sshinfo['hostname'] + ":" + ftp.getcwd()], stderr=subprocess.STDOUT) except subprocess.CalledProcessError as e: - raise FDroidException(str(e), e.output.decode()) + raise FDroidException(str(e), e.output.decode()) from e logging.info("Preparing server for build...") serverpath = os.path.abspath(os.path.dirname(__file__)) @@ -290,10 +290,10 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): ftp.get(apkfile, os.path.join(output_dir, apkfile)) if not options.notarball: ftp.get(tarball, os.path.join(output_dir, tarball)) - except Exception: + except Exception as exc: raise BuildException( "Build failed for {0}:{1} - missing output files".format( - app.id, build.versionName), str(output, 'utf-8')) + app.id, build.versionName), str(output, 'utf-8')) from exc ftp.close() finally: diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 86a18c2e..d781fc4e 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -495,8 +495,8 @@ def checkupdates_app(app): if pattern.startswith('+'): try: suffix, pattern = pattern[1:].split(' ', 1) - except ValueError: - raise MetaDataException("Invalid AutoUpdateMode: " + mode) + except ValueError as exc: + raise MetaDataException("Invalid AutoUpdateMode: " + mode) from exc gotcur = False latest = None diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 36ec0071..cf490682 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -480,14 +480,14 @@ def parse_human_readable_size(size): } try: return int(float(size)) - except (ValueError, TypeError): + except (ValueError, TypeError) as exc: if type(size) != str: raise ValueError(_('Could not parse size "{size}", wrong type "{type}"') - .format(size=size, type=type(size))) + .format(size=size, type=type(size))) from exc s = size.lower().replace(' ', '') m = re.match(r'^(?P[0-9][0-9.]*) *(?P' + r'|'.join(units.keys()) + r')$', s) if not m: - raise ValueError(_('Not a valid size definition: "{}"').format(size)) + raise ValueError(_('Not a valid size definition: "{}"').format(size)) from exc return int(float(m.group("value")) * units[m.group("unit")]) @@ -793,8 +793,8 @@ def publishednameinfo(filename): m = publish_name_regex.match(filename) try: result = (m.group(1), m.group(2)) - except AttributeError: - raise FDroidException(_("Invalid name for published file: %s") % filename) + except AttributeError as exc: + raise FDroidException(_("Invalid name for published file: %s") % filename) from exc return result @@ -1350,7 +1350,7 @@ class vcs_gitsvn(vcs): r = requests.head(remote) r.raise_for_status() except Exception as e: - raise VCSException('SVN certificate pre-validation failed: ' + str(e)) + raise VCSException('SVN certificate pre-validation failed: ' + str(e)) from e location = r.headers.get('location') if location and not location.startswith('https://'): raise VCSException(_('Invalid redirect to non-HTTPS: {before} -> {after} ') @@ -2605,8 +2605,8 @@ use_androguard.show_path = True # type: ignore def _get_androguard_APK(apkfile): try: from androguard.core.bytecodes.apk import APK - except ImportError: - raise FDroidException("androguard library is not installed") + except ImportError as exc: + raise FDroidException("androguard library is not installed") from exc return APK(apkfile) @@ -2835,7 +2835,7 @@ def FDroidPopenBytes(commands, cwd=None, envs=None, output=True, stderr_to_stdou stderr=stderr_param) except OSError as e: raise BuildException("OSError while trying to execute " - + ' '.join(commands) + ': ' + str(e)) + + ' '.join(commands) + ': ' + str(e)) from e # TODO are these AsynchronousFileReader threads always exiting? if not stderr_to_stdout and options.verbose: @@ -3535,7 +3535,7 @@ def verify_jar_signature(jar): if e.returncode == 4: logging.debug(_('JAR signature verified: {path}').format(path=jar)) else: - raise VerificationException(error + '\n' + e.output.decode('utf-8')) + raise VerificationException(error + '\n' + e.output.decode('utf-8')) from e def verify_apk_signature(apk, min_sdk_version=None): @@ -4200,10 +4200,10 @@ def calculate_math_string(expr): if '#' in expr: raise SyntaxError('no comments allowed') return execute_ast(ast.parse(expr, mode='eval').body) - except SyntaxError: + except SyntaxError as exc: raise SyntaxError("could not parse expression '{expr}', " "only basic math operations are allowed (+, -, *)" - .format(expr=expr)) + .format(expr=expr)) from exc def force_exit(exitvalue=0): diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 5ab7ad14..ad804041 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1317,7 +1317,7 @@ def scan_apk_androguard(apk, apkfile): except (FileNotFoundError, zipfile.BadZipFile) as e: logging.error(_("Could not open APK {path} for analysis: ").format(path=apkfile) + str(e)) - raise BuildException(_("Invalid APK")) + raise BuildException(_("Invalid APK")) from e apk['packageName'] = apkobject.get_package() diff --git a/fdroidserver/verify.py b/fdroidserver/verify.py index f2348cc0..f117feaa 100644 --- a/fdroidserver/verify.py +++ b/fdroidserver/verify.py @@ -221,7 +221,7 @@ def main(): net.download_file(url.replace('/repo', '/archive'), dldir=tmp_dir) except requests.exceptions.HTTPError as e: raise FDroidException(_('Downloading {url} failed. {error}') - .format(url=url, error=e)) + .format(url=url, error=e)) from e unsigned_apk = os.path.join(unsigned_dir, apkfilename) compare_result = common.verify_apks(remote_apk, unsigned_apk, tmp_dir) diff --git a/fdroidserver/vmtools.py b/fdroidserver/vmtools.py index 2483a251..f4e3a416 100644 --- a/fdroidserver/vmtools.py +++ b/fdroidserver/vmtools.py @@ -401,7 +401,7 @@ class LibvirtBuildVm(FDroidBuildVm): try: self.conn = libvirt.open('qemu:///system') except libvirt.libvirtError as e: - raise FDroidBuildVmException('could not connect to libvirtd: %s' % (e)) + raise FDroidBuildVmException('could not connect to libvirtd: %s' % (e)) from e def destroy(self): From 8a2f013508656a47ad2aa66ba4909616a9050003 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 1 Jun 2022 22:27:10 +0200 Subject: [PATCH 0655/2116] Archive .idsig and .log.gz.asc files as well --- fdroidserver/update.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index ad804041..4fd9a003 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1885,7 +1885,9 @@ def move_apk_between_sections(from_dir, to_dir, apk): logging.info("Moving %s from %s to %s" % (apk['apkName'], from_dir, to_dir)) _move_file(from_dir, to_dir, apk['apkName'], False) _move_file(from_dir, to_dir, apk['apkName'] + '.asc', True) + _move_file(from_dir, to_dir, apk['apkName'] + '.idsig', True) _move_file(from_dir, to_dir, apk['apkName'][:-4] + '.log.gz', True) + _move_file(from_dir, to_dir, apk['apkName'][:-4] + '.log.gz.asc', True) for density in all_screen_densities: from_icon_dir = get_icon_dir(from_dir, density) to_icon_dir = get_icon_dir(to_dir, density) From edc9390628e3f24b24f0771b635f883cbd79bcc7 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 3 Jun 2022 12:41:47 +0200 Subject: [PATCH 0656/2116] Pass --scan-binary to build server --- fdroidserver/build.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index a358d7d3..aac14e67 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -235,6 +235,8 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): cmdline += ' --skip-scan' if options.notarball: cmdline += ' --no-tarball' + if (options.scan_binary or config.get('scan_binary')) and not options.skipscan: + cmdline += ' --scan-binary' cmdline += " %s:%s" % (app.id, build.versionCode) chan.exec_command('bash --login -c "' + cmdline + '"') # nosec B601 inputs are sanitized From 72e3d07acb73e7578c727b466a86b6d800eb84fd Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 3 Jun 2022 09:17:28 +0200 Subject: [PATCH 0657/2116] Simplify primary mirror logic Assume repo_url/archive_url to be valid URL and mark it as a primary mirror. --- fdroidserver/index.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index fbc6a351..02443cae 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -713,14 +713,13 @@ def v2_repo(repodict, repodir, archive): repo["address"] = repodict["address"] repo["webBaseUrl"] = "https://f-droid.org/packages/" - if "repo_url" in common.config: - primary_mirror = common.config["repo_url"][:-len("/repo")] - if "mirrors" in repodict and primary_mirror not in repodict["mirrors"]: - repodict["mirrors"].append(primary_mirror) - if "mirrors" in repodict: repo["mirrors"] = [{"url": mirror} for mirror in repodict["mirrors"]] + # the first entry is traditionally the primary mirror + if repodict['address'] not in repodict["mirrors"]: + repo["mirrors"].insert(0, {"url": repodict['address'], "isPrimary": True}) + repo["timestamp"] = repodict["timestamp"] anti_features = load_locale("antiFeatures", repodir) From 1073dd57f79d586a35d1ca27f96026599060b57b Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 3 Jun 2022 09:35:43 +0200 Subject: [PATCH 0658/2116] Make webBaseUrl configurable --- fdroidserver/index.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 02443cae..8e5dafd7 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -91,11 +91,15 @@ def make(apps, apks, repodir, archive): repodict['description'] = common.config['archive_description'] archive_url = common.config.get('archive_url', common.config['repo_url'][:-4] + 'archive') repodict['address'] = archive_url + if 'archive_web_base_url' in common.config: + repodict["webBaseUrl"] = common.config['archive_web_base_url'] urlbasepath = os.path.basename(urllib.parse.urlparse(archive_url).path) else: repodict['name'] = common.config['repo_name'] repodict['icon'] = common.config.get('repo_icon', common.default_config['repo_icon']) repodict['address'] = common.config['repo_url'] + if 'repo_web_base_url' in common.config: + repodict["webBaseUrl"] = common.config['repo_web_base_url'] repodict['description'] = common.config['repo_description'] urlbasepath = os.path.basename(urllib.parse.urlparse(common.config['repo_url']).path) @@ -711,7 +715,8 @@ def v2_repo(repodict, repodir, archive): repo["icon"] = config["archive" if archive else "repo"]["icon"] repo["address"] = repodict["address"] - repo["webBaseUrl"] = "https://f-droid.org/packages/" + if "webBaseUrl" in repodict: + repo["webBaseUrl"] = repodict["webBaseUrl"] if "mirrors" in repodict: repo["mirrors"] = [{"url": mirror} for mirror in repodict["mirrors"]] From 9933f540936327a503df88b460819913a08b8c24 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 17 May 2022 23:46:44 +0200 Subject: [PATCH 0659/2116] Fix --nosign semantics This reverts parts of 197ca7e36 as it never triggered the FDroidException as 'keystore' not in common.config is always False. --- fdroidserver/index.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 8e5dafd7..24d4655d 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -66,10 +66,7 @@ def make(apps, apks, repodir, archive): """ from fdroidserver.update import METADATA_VERSION - if hasattr(common.options, 'nosign') and common.options.nosign: - if 'keystore' not in common.config and 'repo_pubkey' not in common.config: - raise FDroidException(_('"repo_pubkey" must be present in config.yml when using --nosign!')) - else: + if not hasattr(common.options, 'nosign') or not common.options.nosign: common.assert_config_keystore(common.config) # Historically the index has been sorted by App Name, so we enforce this ordering here @@ -1378,7 +1375,7 @@ def extract_pubkey(): """ if 'repo_pubkey' in common.config: pubkey = unhexlify(common.config['repo_pubkey']) - else: + elif 'keystorepass' in common.config: env_vars = {'LC_ALL': 'C.UTF-8', 'FDROID_KEY_STORE_PASS': common.config['keystorepass']} p = FDroidPopenBytes([common.config['keytool'], '-exportcert', @@ -1393,6 +1390,9 @@ def extract_pubkey(): msg += ' Is your crypto smartcard plugged in?' raise FDroidException(msg) pubkey = p.output + else: + raise FDroidException(_('Neither "repo_pubkey" nor "keystorepass" set in config.yml')) + repo_pubkey_fingerprint = common.get_cert_fingerprint(pubkey) return hexlify(pubkey), repo_pubkey_fingerprint From 7544761e86cb5e4a25c6c81bb3634212da31ec6d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 7 Jun 2022 13:15:36 +0200 Subject: [PATCH 0660/2116] index: add test for --nosign config and file generation --- tests/index.TestCase | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/tests/index.TestCase b/tests/index.TestCase index b101eb46..23b0560d 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -359,6 +359,49 @@ class IndexTest(unittest.TestCase): ) self.assertTrue(os.path.exists(os.path.join('repo', 'index.xml'))) + def test_v0_invalid_config_exception(self): + """Index v0 needs additional config values when using --nosign + + index.xml aka Index v0 includes the full repo public key in + the XML itself. So when running `fdroid update --nosign`, + there needs to be either repo_pubkey or a full keystore config + present. + + """ + tmptestsdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.chdir(tmptestsdir) + os.mkdir('repo') + repo_icons_dir = os.path.join('repo', 'icons') + self.assertFalse(os.path.isdir(repo_icons_dir)) + repodict = { + 'address': 'https://example.com/fdroid/repo', + 'description': 'This is just a test', + 'icon': 'blahblah', + 'name': 'test', + 'timestamp': datetime.datetime.now(), + 'version': 12, + } + requestsdict = {'install': [], 'uninstall': []} + + fdroidserver.common.options.nosign = False + with self.assertRaises(fdroidserver.exception.FDroidException): + fdroidserver.index.make_v0({}, [], 'repo', repodict, requestsdict, {}) + + fdroidserver.common.options.nosign = True + with self.assertRaises(fdroidserver.exception.FDroidException): + fdroidserver.index.make_v0({}, [], 'repo', repodict, requestsdict, {}) + + fdroidserver.common.config['repo_pubkey'] = 'ffffffffffffffffffffffffffffffffff' + self.assertFalse(os.path.exists(os.path.join('repo', 'index.xml'))) + self.assertFalse(os.path.exists(os.path.join('repo', 'index_unsigned.jar'))) + self.assertFalse(os.path.exists(os.path.join('repo', 'index.jar'))) + fdroidserver.index.make_v0({}, [], 'repo', repodict, requestsdict, {}) + self.assertTrue(os.path.exists(os.path.join('repo', 'index.xml'))) + self.assertTrue(os.path.exists(os.path.join('repo', 'index_unsigned.jar'))) + self.assertFalse(os.path.exists(os.path.join('repo', 'index.jar'))) + def test_github_get_mirror_service_urls(self): for url in [ 'git@github.com:foo/bar', From e6c875b77e62ce10f7bbc28c3713d197ac5121cc Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sat, 4 Jun 2022 13:41:34 +0200 Subject: [PATCH 0661/2116] Archive _src.tar.gz.asc not .log.gz.asc --- fdroidserver/update.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 4fd9a003..32b6b55d 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1887,7 +1887,6 @@ def move_apk_between_sections(from_dir, to_dir, apk): _move_file(from_dir, to_dir, apk['apkName'] + '.asc', True) _move_file(from_dir, to_dir, apk['apkName'] + '.idsig', True) _move_file(from_dir, to_dir, apk['apkName'][:-4] + '.log.gz', True) - _move_file(from_dir, to_dir, apk['apkName'][:-4] + '.log.gz.asc', True) for density in all_screen_densities: from_icon_dir = get_icon_dir(from_dir, density) to_icon_dir = get_icon_dir(to_dir, density) @@ -1896,6 +1895,7 @@ def move_apk_between_sections(from_dir, to_dir, apk): _move_file(from_icon_dir, to_icon_dir, apk['icons'][density], True) if 'srcname' in apk: _move_file(from_dir, to_dir, apk['srcname'], False) + _move_file(from_dir, to_dir, apk['srcname'] + '.asc', True) def add_apks_to_per_app_repos(repodir, apks): From 3182b77d180b2313f4fdb101af96c035380abfd7 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 23 May 2022 23:08:16 +0200 Subject: [PATCH 0662/2116] use apksigner to sign index-v2 with modern, supported algorithms The current signing method uses apksigner to sign the JAR so that it will automatically select algorithms that are compatible with Android SDK 23, which added the most recent algorithms: https://developer.android.com/reference/java/security/Signature This signing method uses then inherits the default signing algothim settings, since Java and Android both maintain those. That helps avoid a repeat of being stuck on an old signing algorithm. That means specifically that this call to apksigner does not specify any of the algorithms. The old indexes must be signed by SHA1withRSA otherwise they will no longer be compatible with old Androids. apksigner 30.0.0+ is available in Debian/bullseye, Debian/buster-backports, Ubuntu 21.10, and Ubuntu 20.04 from the fdroid PPA. Here's a quick way to test: for f in `ls -1 /opt/android-sdk/build-tools/*/apksigner | sort ` /usr/bin/apksigner; do printf "$f : "; $f sign --v4-signing-enabled false; done closes #1005 --- .gitlab-ci.yml | 7 +++- fdroidserver/common.py | 26 +++++++----- fdroidserver/index.py | 4 +- fdroidserver/signindex.py | 85 ++++++++++++++++++++++++++------------- tests/common.TestCase | 51 +++++++++++++++++++++-- tests/signindex.TestCase | 31 +++++++++++++- 6 files changed, 158 insertions(+), 46 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 97e799c5..84644945 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -125,7 +125,7 @@ ubuntu_lts_ppa: - ./run-tests -# Test using Ubuntu/bionic LTS (supported til 2022) with all depends +# Test using Ubuntu/bionic LTS (supported til April, 2023) with all depends # from pypi. The venv is used to isolate the dist tarball generation # environment from the clean install environment. ubuntu_bionic_pip: @@ -145,6 +145,11 @@ ubuntu_bionic_pip: - tar tzf dist/fdroidserver-*.tar.gz # back to bare machine to act as user's install machine - $pip install --upgrade pip setuptools wheel # make this go away: "error: invalid command 'bdist_wheel'" + + - export ANDROID_HOME=/opt/android-sdk + - $pip install sdkmanager + - sdkmanager 'build-tools;30.0.0' + - $pip install dist/fdroidserver-*.tar.gz - tar xzf dist/fdroidserver-*.tar.gz - cd fdroidserver-* diff --git a/fdroidserver/common.py b/fdroidserver/common.py index cf490682..3bdf573a 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -87,9 +87,10 @@ FDROID_PATH = os.path.realpath(os.path.join(os.path.dirname(__file__), '..')) # this is the build-tools version, aapt has a separate version that # has to be manually set in test_aapt_version() MINIMUM_AAPT_BUILD_TOOLS_VERSION = '26.0.0' +# 30.0.0 is the first version to support --v4-signing-enabled. # 26.0.2 is the first version recognizing md5 based signatures as valid again # (as does android, so we want that) -MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION = '26.0.2' +MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION = '30.0.0' VERCODE_OPERATION_RE = re.compile(r'^([ 0-9/*+-]|%c)+$') @@ -3412,6 +3413,18 @@ def get_min_sdk_version(apk): return 1 +def get_apksigner_smartcardoptions(smartcardoptions): + if '-providerName' in smartcardoptions.copy(): + pos = smartcardoptions.index('-providerName') + # remove -providerName and it's argument + del smartcardoptions[pos] + del smartcardoptions[pos] + replacements = {'-storetype': '--ks-type', + '-providerClass': '--provider-class', + '-providerArg': '--provider-arg'} + return [replacements.get(n, n) for n in smartcardoptions] + + def sign_apk(unsigned_path, signed_path, keyalias): """Sign and zipalign an unsigned APK, then save to a new file, deleting the unsigned. @@ -3429,16 +3442,7 @@ def sign_apk(unsigned_path, signed_path, keyalias): """ if config['keystore'] == 'NONE': - apksigner_smartcardoptions = config['smartcardoptions'].copy() - if '-providerName' in apksigner_smartcardoptions: - pos = config['smartcardoptions'].index('-providerName') - # remove -providerName and it's argument - del apksigner_smartcardoptions[pos] - del apksigner_smartcardoptions[pos] - replacements = {'-storetype': '--ks-type', - '-providerClass': '--provider-class', - '-providerArg': '--provider-arg'} - signing_args = [replacements.get(n, n) for n in apksigner_smartcardoptions] + signing_args = get_apksigner_smartcardoptions(config['smartcardoptions']) else: signing_args = ['--key-pass', 'env:FDROID_KEY_PASS'] apksigner = config.get('apksigner', '') diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 24d4655d..5536fe74 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -858,7 +858,7 @@ def make_v2(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ logging.debug(_('index-v2 must have a signature, use `fdroid signindex` to create it!')) else: signindex.config = common.config - signindex.sign_index(repodir, json_name, signindex.HashAlg.SHA256) + signindex.sign_index(repodir, json_name) def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_fingerprints): @@ -1345,7 +1345,7 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing os.remove(signed) else: signindex.config = common.config - signindex.sign_jar(signed) + signindex.sign_jar(signed, use_old_algs=True) # Copy the repo icon into the repo directory... icon_dir = os.path.join(repodir, 'icons') diff --git a/fdroidserver/signindex.py b/fdroidserver/signindex.py index 3e532f17..62d40640 100644 --- a/fdroidserver/signindex.py +++ b/fdroidserver/signindex.py @@ -21,7 +21,6 @@ import os import time import zipfile from argparse import ArgumentParser -from enum import Enum import logging from . import _ @@ -34,29 +33,27 @@ options = None start_timestamp = time.gmtime() -HashAlg = Enum("SHA1", "SHA256") +def sign_jar(jar, use_old_algs=False): + """Sign a JAR file with the best available algorithm. + The current signing method uses apksigner to sign the JAR so that + it will automatically select algorithms that are compatible with + Android SDK 23, which added the most recent algorithms: + https://developer.android.com/reference/java/security/Signature -def sign_jar(jar, hash_algorithm=None): - """Sign a JAR file with Java's jarsigner. + This signing method uses then inherits the default signing + algothim settings, since Java and Android both maintain those. + That helps avoid a repeat of being stuck on an old signing + algorithm. That means specifically that this call to apksigner + does not specify any of the algorithms. + + The old indexes must be signed by SHA1withRSA otherwise they will + no longer be compatible with old Androids. This method requires a properly initialized config object. + """ - if hash_algorithm == HashAlg.SHA256: - args = [ - config['jarsigner'], - '-keystore', - config['keystore'], - '-storepass:env', - 'FDROID_KEY_STORE_PASS', - '-digestalg', - 'SHA-256', - '-sigalg', - 'SHA256withRSA', - jar, - config['repo_keyalias'], - ] - else: + if use_old_algs: # This does use old hashing algorithms, i.e. SHA1, but that's not # broken yet for file verification. This could be set to SHA256, # but then Android < 4.3 would not be able to verify it. @@ -74,20 +71,50 @@ def sign_jar(jar, hash_algorithm=None): jar, config['repo_keyalias'], ] - if config['keystore'] == 'NONE': - args += config['smartcardoptions'] - else: # smardcards never use -keypass - args += ['-keypass:env', 'FDROID_KEY_PASS'] + if config['keystore'] == 'NONE': + args += config['smartcardoptions'] + else: # smardcards never use -keypass + args += ['-keypass:env', 'FDROID_KEY_PASS'] + else: + # https://developer.android.com/studio/command-line/apksigner + args = [ + config['apksigner'], + 'sign', + '--min-sdk-version', + '23', # enable all current algorithms + '--max-sdk-version', + '24', # avoid future incompatible algorithms + # disable all APK signature types, only use JAR sigs aka v1 + '--v1-signing-enabled', + 'true', + '--v2-signing-enabled', + 'false', + '--v3-signing-enabled', + 'false', + '--v4-signing-enabled', + 'false', + '--ks', + config['keystore'], + '--ks-pass', + 'env:FDROID_KEY_STORE_PASS', + '--ks-key-alias', + config['repo_keyalias'], + ] + if config['keystore'] == 'NONE': + args += common.get_apksigner_smartcardoptions(config['smartcardoptions']) + else: # smardcards never use --key-pass + args += ['--key-pass', 'env:FDROID_KEY_PASS'] + args += [jar] env_vars = { 'FDROID_KEY_STORE_PASS': config['keystorepass'], 'FDROID_KEY_PASS': config.get('keypass', ""), } p = common.FDroidPopen(args, envs=env_vars) if p.returncode != 0: - raise FDroidException("Failed to sign %s!" % jar) + raise FDroidException("Failed to sign %s: %s" % (jar, p.output)) -def sign_index(repodir, json_name, hash_algorithm=None): +def sign_index(repodir, json_name): """Sign index-v1.json to make index-v1.jar. This is a bit different than index.jar: instead of their being index.xml @@ -109,7 +136,11 @@ def sign_index(repodir, json_name, hash_algorithm=None): jar_file = os.path.join(repodir, name + '.jar') with zipfile.ZipFile(jar_file, 'w', zipfile.ZIP_DEFLATED) as jar: jar.write(index_file, json_name) - sign_jar(jar_file, hash_algorithm) + + if json_name in ('index.xml', 'index-v1.json'): + sign_jar(jar_file, use_old_algs=True) + else: + sign_jar(jar_file) def status_update_json(signed): @@ -165,7 +196,7 @@ def main(): json_name = 'entry.json' index_file = os.path.join(output_dir, json_name) if os.path.exists(index_file): - sign_index(output_dir, json_name, HashAlg.SHA256) + sign_index(output_dir, json_name) logging.info('Signed ' + index_file) signed.append(index_file) diff --git a/tests/common.TestCase b/tests/common.TestCase index c511901d..6c22c9e6 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -450,7 +450,7 @@ class CommonTest(unittest.TestCase): sourcefile = os.path.join(sourcedir, f) testfile = os.path.join(testsdir, f) shutil.copy(sourcefile, testsdir) - fdroidserver.signindex.sign_jar(testfile) + fdroidserver.signindex.sign_jar(testfile, use_old_algs=True) # these should be resigned, and therefore different self.assertNotEqual( open(sourcefile, 'rb').read(), open(testfile, 'rb').read() @@ -872,6 +872,9 @@ class CommonTest(unittest.TestCase): self.assertFalse(os.path.isfile(unsigned)) self.assertTrue(fdroidserver.common.verify_apk_signature(signed)) + @unittest.skipUnless( + os.path.exists('tests/SystemWebView-repack.apk'), "file too big for sdist" + ) def test_resign_apk(self): """When using apksigner, it should resign signed APKs""" config = fdroidserver.common.read_config(fdroidserver.common.options) @@ -2455,8 +2458,42 @@ class CommonTest(unittest.TestCase): self.assertTrue(os.path.exists(f), f + ' was created') self.assertFalse(is_repo_file(f), f + ' not repo file') + def test_get_apksigner_smartcardoptions(self): + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.chdir(testdir) + with open('config.yml', 'w') as fp: + d = { + 'smartcardoptions': '-storetype PKCS11' + ' -providerName SunPKCS11-OpenSC' + ' -providerClass sun.security.pkcs11.SunPKCS11' + ' -providerArg opensc-fdroid.cfg' + } + yaml.dump(d, fp) + config = fdroidserver.common.read_config() + fdroidserver.common.config = config + self.assertTrue(isinstance(d['smartcardoptions'], str)) + self.assertTrue(isinstance(config['smartcardoptions'], list)) + self.assertEqual( + [ + '--ks-type', + 'PKCS11', + '--provider-class', + 'sun.security.pkcs11.SunPKCS11', + '--provider-arg', + 'opensc-fdroid.cfg', + ], + fdroidserver.common.get_apksigner_smartcardoptions( + config['smartcardoptions'] + ), + ) + def test_get_smartcardoptions_list(self): - os.chdir(self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.chdir(testdir) with open('config.yml', 'w') as fp: fp.write( textwrap.dedent( @@ -2491,7 +2528,10 @@ class CommonTest(unittest.TestCase): ) def test_get_smartcardoptions_spaces(self): - os.chdir(self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.chdir(testdir) with open('config.yml', 'w') as fp: fp.write( textwrap.dedent( @@ -2519,7 +2559,10 @@ class CommonTest(unittest.TestCase): ) def test_get_smartcardoptions_config_py(self): - os.chdir(self.tmpdir) + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.chdir(testdir) with open('config.py', 'w') as fp: fp.write( textwrap.dedent( diff --git a/tests/signindex.TestCase b/tests/signindex.TestCase index 79977e8d..f51d7e11 100755 --- a/tests/signindex.TestCase +++ b/tests/signindex.TestCase @@ -6,6 +6,7 @@ import logging import optparse import os import shutil +import subprocess import sys import tempfile import unittest @@ -17,7 +18,7 @@ print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) -from fdroidserver import common, signindex, update +from fdroidserver import apksigcopier, common, signindex, update from pathlib import Path from unittest.mock import patch @@ -96,6 +97,34 @@ class SignindexTest(unittest.TestCase): signindex.main() for f in index_files: self.assertTrue(f.exists(), '%s should exist!' % f) + self.assertFalse(os.path.exists('index-v2.jar')) # no JAR version of this file + + # index.jar aka v0 must by signed by SHA1withRSA + f = 'repo/index.jar' + common.verify_jar_signature(f) + self.assertIsNone(apksigcopier.extract_v2_sig(f, expected=False)) + cp = subprocess.run( + ['jarsigner', '-verify', '-verbose', f], stdout=subprocess.PIPE + ) + self.assertTrue(b'SHA1withRSA' in cp.stdout) + + # index-v1.jar must by signed by SHA1withRSA + f = 'repo/index-v1.jar' + common.verify_jar_signature(f) + self.assertIsNone(apksigcopier.extract_v2_sig(f, expected=False)) + cp = subprocess.run( + ['jarsigner', '-verify', '-verbose', f], stdout=subprocess.PIPE + ) + self.assertTrue(b'SHA1withRSA' in cp.stdout) + + # entry.jar aka index v2 must by signed by a modern algorithm + f = 'repo/entry.jar' + common.verify_jar_signature(f) + self.assertIsNone(apksigcopier.extract_v2_sig(f, expected=False)) + cp = subprocess.run( + ['jarsigner', '-verify', '-verbose', f], stdout=subprocess.PIPE + ) + self.assertFalse(b'SHA1withRSA' in cp.stdout) if __name__ == "__main__": From fe22958476cf53169800e53c8d96875d677cdcfb Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 25 May 2022 09:44:39 +0200 Subject: [PATCH 0663/2116] run-tests: skip tests that require apksigner when running on Java8 The buildserver VM has not been upgraded yet to bullseye, so it is still on Debian/stretch. The buildserver VM does not need to run `fdroid update`, `fdroid signindex`, etc. so this new apksigner requirement should not affect app builds even though they are stuck on Debian/stretch. --- tests/run-tests | 11 +++++++++++ tests/signindex.TestCase | 2 ++ tests/update.TestCase | 2 ++ 3 files changed, 15 insertions(+) diff --git a/tests/run-tests b/tests/run-tests index 59fb08e5..408c72a2 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -202,6 +202,17 @@ if use_apksigner; then grep -F ' Date: Wed, 8 Jun 2022 17:45:50 +0200 Subject: [PATCH 0664/2116] gitlab-ci: port fedora job to fdroid/sdkmanager and Java 17 This is also needed to support _apksigner_ as in !1134 --- .gitlab-ci.yml | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 84644945..48a27f72 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -281,35 +281,27 @@ fedora_latest: findutils git gnupg - java-1.8.0-openjdk-devel + java-17-openjdk-devel python3 python3-babel python3-matplotlib python3-pip rsync - unzip - wget which + - $pip install sdkmanager - ./setup.py sdist - useradd -m -c "test account" --password "fakepassword" testuser - su testuser --login --command "cd `pwd`; $pip install --user dist/fdroidserver-*.tar.gz" - test -e ~testuser/.local/share/locale/de/LC_MESSAGES/fdroidserver.mo - - wget --no-verbose -O tools.zip https://dl.google.com/android/repository/tools_r25.2.5-linux.zip - - unzip -q tools.zip - - rm tools.zip - export BUILD_TOOLS_VERSION=`sed -n "s,^MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION\s*=\s*['\"]\(.*\)[['\"],\1,p" fdroidserver/common.py` - - export JAVA_HOME=/etc/alternatives/jre - export ANDROID_HOME=`pwd`/android-sdk - - mkdir $ANDROID_HOME - - mv tools $ANDROID_HOME/ - mkdir -p $ANDROID_HOME/licenses/ - printf "\n8933bad161af4178b1185d1a37fbf41ea5269c55\nd56f5187479451eabf01fb78af6dfcb131a6481e\n24333f8a63b6825ea9c5514f83c2829b004d1fee" > $ANDROID_HOME/licenses/android-sdk-license - printf "\n84831b9409646a918e30573bab4c9c91346d8abd" > $ANDROID_HOME/licenses/android-sdk-preview-license - printf "\n79120722343a6f314e0719f863036c702b0e6b2a\n84831b9409646a918e30573bab4c9c91346d8abd" > $ANDROID_HOME/licenses/android-sdk-preview-license-old - mkdir ~/.android - touch ~/.android/repositories.cfg - - echo y | $ANDROID_HOME/tools/bin/sdkmanager "platform-tools" > /dev/null - - echo y | $ANDROID_HOME/tools/bin/sdkmanager "build-tools;$BUILD_TOOLS_VERSION" > /dev/null + - sdkmanager "platform-tools" "build-tools;$BUILD_TOOLS_VERSION" - chown -R testuser . - cd tests - su testuser --login --command From f04af445ddad344fb5a3b70b540e3120ee353d03 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 8 Jun 2022 18:23:39 +0200 Subject: [PATCH 0665/2116] gitlab-ci: upgrade 'servergitmirrors' job to Debian/bullseye-backports apksigner is now a requirement !1134 --- .gitlab-ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 48a27f72..4c5140ad 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -445,7 +445,7 @@ plugin_fetchsrclibs: # test a full update and deploy cycle to gitlab.com servergitmirrors: - image: debian:buster + image: debian:bullseye-backports <<: *apt-template only: - master@fdroid/fdroidserver @@ -462,12 +462,15 @@ servergitmirrors: python3-pil python3-pip python3-pycparser + python3-setuptools python3-venv rsync wget + - apt-get install -t bullseye-backports apksigner - python3 -m venv --system-site-packages env - . env/bin/activate - export PYTHONPATH=`pwd` + - export SETUPTOOLS_USE_DISTUTILS=stdlib # https://github.com/pypa/setuptools/issues/2956 - $pip install -e . - mkdir /root/.ssh/ - ./tests/key-tricks.py From 2bf6848391a9a1a014a2ef40743f6d95a5dcff0a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 8 Jun 2022 20:00:36 +0200 Subject: [PATCH 0666/2116] test_find_apksigner_system_package_android_home if build_tools is new enough --- tests/common.TestCase | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/tests/common.TestCase b/tests/common.TestCase index 6c22c9e6..d90bb180 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -21,6 +21,7 @@ import textwrap import yaml import gzip import stat +from distutils.version import LooseVersion from zipfile import BadZipFile, ZipFile, ZipInfo from unittest import mock from pathlib import Path @@ -782,6 +783,7 @@ class CommonTest(unittest.TestCase): self.assertEqual(apksigner, config.get('apksigner')) def test_find_apksigner_system_package_android_home(self): + """Test that apksigner v30 or newer is found""" testdir = tempfile.mkdtemp( prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir ) @@ -789,8 +791,19 @@ class CommonTest(unittest.TestCase): android_home = os.getenv('ANDROID_HOME') if not android_home or not os.path.isdir(android_home): self.skipTest('SKIPPING since ANDROID_HOME (%s) is not a dir!' % android_home) - if not glob.glob(os.path.join(android_home, 'build-tools', '*', 'apksigner')): + build_tools = glob.glob(os.path.join(android_home, 'build-tools', '*', 'apksigner')) + if not build_tools: self.skipTest('SKIPPING since ANDROID_HOME (%s) build-tools has no apksigner!' % android_home) + min_version = fdroidserver.common.MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION + version = '0' + for bt in sorted(build_tools): + v = bt.split('/')[-2] + if v == 'debian': + continue + if LooseVersion(version) < LooseVersion(v): + version = v + if LooseVersion(version) < LooseVersion(min_version): + self.skipTest('SKIPPING since build-tools %s or higher is required!' % min_version) fdroidserver.common.config = {'sdk_path': android_home} os.environ['PATH'] = '/fake/path/to/avoid/conflicts' config = fdroidserver.common.read_config() From e2d9dedbb12c5b18ee881cc7637905d0854deae0 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 6 Jun 2022 13:43:19 +0200 Subject: [PATCH 0667/2116] build: add test to ensure the flags are passed to the buildserver !1141 --- tests/build.TestCase | 88 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/tests/build.TestCase b/tests/build.TestCase index 7558237d..13378060 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -26,6 +26,7 @@ import fdroidserver.build import fdroidserver.common import fdroidserver.metadata import fdroidserver.scanner +import fdroidserver.vmtools class FakeProcess: @@ -544,6 +545,93 @@ class BuildTest(unittest.TestCase): self.assertFalse(os.path.exists(production_result)) self.assertFalse(os.path.exists(production_compare_file)) + @mock.patch('fdroidserver.vmtools.get_build_vm') + @mock.patch('fdroidserver.vmtools.get_clean_builder') + @mock.patch('paramiko.SSHClient') + @mock.patch('subprocess.check_output') + def test_build_server_cmdline( + self, + subprocess_check_output, + paramiko_SSHClient, + fdroidserver_vmtools_get_clean_builder, + fdroidserver_vmtools_get_build_vm, + ): + """Test command line flags passed to the buildserver""" + global cmdline_args + test_flag = ['', False] + + def _exec_command(args): + flag = test_flag[0] + if test_flag[1]: + self.assertTrue(flag in args, flag + ' should be present') + else: + self.assertFalse(flag in args, flag + ' should not be present') + + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.chdir(testdir) + os.mkdir('tmp') + + chan = mock.MagicMock() + chan.exec_command = _exec_command + chan.recv_exit_status = lambda: 0 + transport = mock.MagicMock() + transport.open_session = mock.Mock(return_value=chan) + sshs = mock.MagicMock() + sshs.get_transport = mock.Mock(return_value=transport) + paramiko_SSHClient.return_value = sshs + subprocess_check_output.return_value = ( + b'0123456789abcdef0123456789abcdefcafebabe' + ) + fdroidserver_vmtools_get_clean_builder.side_effect = lambda s: { + 'hostname': 'example.com', + 'idfile': '/path/to/id/file', + 'port': 123, + 'user': 'fake', + } + fdroidserver.common.config = {'sdk_path': '/fake/android/sdk/path'} + fdroidserver.build.options = mock.MagicMock() + vcs = mock.Mock() + vcs.getsrclib = mock.Mock(return_value=None) + app = fdroidserver.metadata.App() + app['metadatapath'] = 'metadata/fake.id.yml' + app['id'] = 'fake.id' + app['RepoType'] = 'git' + build = fdroidserver.metadata.Build( + { + 'versionCode': 123, + 'versionName': '1.2.3', + 'commit': '1.2.3', + 'disable': False, + } + ) + app['Builds'] = [build] + + test_flag = ('--on-server', True) + fdroidserver.build.build_server(app, build, vcs, '', '', '', False) + self.assertTrue(fdroidserver_vmtools_get_build_vm.called) + + for force in (True, False): + test_flag = ('--force', force) + fdroidserver.build.build_server(app, build, vcs, '', '', '', force) + + fdroidserver.build.options.notarball = True + test_flag = ('--no-tarball', True) + fdroidserver.build.build_server(app, build, vcs, '', '', '', False) + fdroidserver.build.options.notarball = False + test_flag = ('--no-tarball', False) + fdroidserver.build.build_server(app, build, vcs, '', '', '', False) + + fdroidserver.build.options.skipscan = False + test_flag = ('--scan-binary', True) + fdroidserver.build.build_server(app, build, vcs, '', '', '', False) + fdroidserver.build.options.skipscan = True + test_flag = ('--scan-binary', False) + fdroidserver.build.build_server(app, build, vcs, '', '', '', False) + test_flag = ('--skip-scan', True) + fdroidserver.build.build_server(app, build, vcs, '', '', '', False) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 5472cf88b859ffac56dd98fe928e8c14d56e53b4 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Tue, 14 Jun 2022 11:03:42 +0000 Subject: [PATCH 0668/2116] Update preinstalled NDK to r23c --- buildserver/Vagrantfile | 3 +-- makebuildserver | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/buildserver/Vagrantfile b/buildserver/Vagrantfile index 09fed05d..5a420b62 100644 --- a/buildserver/Vagrantfile +++ b/buildserver/Vagrantfile @@ -1,4 +1,3 @@ - require 'yaml' require 'pathname' @@ -84,7 +83,7 @@ Vagrant.configure("2") do |config| args: [configfile['debian_mirror']] config.vm.provision "shell", name: "android-sdk", path: "provision-android-sdk" config.vm.provision "shell", name: "android-ndk", path: "provision-android-ndk", - args: ["/opt/android-sdk/ndk", "r23b"] + args: ["/opt/android-sdk/ndk", "r23c"] config.vm.provision "shell", name: "gradle", path: "provision-gradle" config.vm.provision "shell", name: "disable-analytics", path: "provision-disable-analytics" config.vm.provision "shell", name: "buildserverid", path: "provision-buildserverid", diff --git a/makebuildserver b/makebuildserver index 1c419872..b8926f95 100755 --- a/makebuildserver +++ b/makebuildserver @@ -302,8 +302,8 @@ CACHE_FILES = [ '7faa7198769f872826c8ef4f1450f839ec27f0b4d5d1e51bade63667cbccd205'), ('https://services.gradle.org/distributions/gradle-7.0.2-bin.zip', '0e46229820205440b48a5501122002842b82886e76af35f0f3a069243dca4b3c'), - ('https://dl.google.com/android/repository/android-ndk-r23b-linux.zip', - 'c6e97f9c8cfe5b7be0a9e6c15af8e7a179475b7ded23e2d1c1fa0945d6fb4382'), + ('https://dl.google.com/android/repository/android-ndk-r23c-linux.zip', + '6ce94604b77d28113ecd588d425363624a5228d9662450c48d2e4053f8039242'), ] From 534c1706156019a8b54b246c85a2ab40c42be540 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Thu, 14 Jul 2022 06:35:55 +0000 Subject: [PATCH 0669/2116] NDK r25 --- fdroidserver/common.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 3bdf573a..39c1dcd4 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4607,6 +4607,12 @@ NDKS = [ "revision": "24.0.8215888", "sha256": "caac638f060347c9aae994e718ba00bb18413498d8e0ad4e12e1482964032997", "url": "https://dl.google.com/android/repository/android-ndk-r24-linux.zip" + }, + { + "release": "r25", + "revision": "25.0.8775105", + "sha256": "cd661aeda5d9b7cfb6e64bd80737c274d7c1c0d026df2f85be3bf3327b25e545", + "url": "https://dl.google.com/android/repository/android-ndk-r25-linux.zip" } ] From 3b1ab74354d72c0d2a0f51bf8293c6fda2338195 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 14 Jul 2022 16:09:22 -0700 Subject: [PATCH 0670/2116] gitlab-ci: 'Safety' now needs git to run Unhandled exception happened: [Errno 2] No such file or directory: 'git' https://gitlab.com/fdroid/fdroidserver/-/jobs/2724632572 --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4c5140ad..daa95686 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -190,7 +190,7 @@ lint_format_safety_bandit_checks: variables: LANG: C.UTF-8 script: - - apk add --no-cache bash build-base dash ca-certificates gcc python3 python3-dev + - apk add --no-cache bash build-base dash ca-certificates gcc git python3 python3-dev - python3 -m ensurepip - $pip install Babel bandit pycodestyle pyflakes pylint safety - export EXITVALUE=0 From 848e29294c50b257f7411cc11626f3a4b0e5a2dc Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Thu, 14 Jul 2022 23:10:37 +0000 Subject: [PATCH 0671/2116] gradle v7.5 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 92315738..5e18f545 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -178,6 +178,7 @@ get_sha() { '7.4') echo '8cc27038d5dbd815759851ba53e70cf62e481b87494cc97cfd97982ada5ba634' ;; '7.4.1') echo 'e5444a57cda4a95f90b0c9446a9e1b47d3d7f69057765bfb54bd4f482542d548' ;; '7.4.2') echo '29e49b10984e585d8118b7d0bc452f944e386458df27371b49b4ac1dec4b7fda' ;; + '7.5') echo 'cb87f222c5585bd46838ad4db78463a5c5f3d336e5e2b98dc7c0c586527351c2' ;; *) exit 1 esac } @@ -198,7 +199,7 @@ d_plugin_k=(7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2. d_plugin_v=(7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From ea9299f216afaef9352606a469de64a368d2bbfd Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 1 Jun 2022 17:22:46 +0200 Subject: [PATCH 0672/2116] Use binary scanner with fdroid scanner path/to.apk Closes: #806 --- fdroidserver/scanner.py | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index fa59fae1..bc9f304f 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -449,7 +449,9 @@ def main(): global config, options, json_per_build # Parse command line... - parser = ArgumentParser(usage="%(prog)s [options] [APPID[:VERCODE] [APPID[:VERCODE] ...]]") + parser = ArgumentParser( + usage="%(prog)s [options] [APPID[:VERCODE] path/to.apk ...]" + ) common.setup_global_opts(parser) parser.add_argument("appid", nargs='*', help=_("application ID with optional versionCode in the form APPID[:VERCODE]")) parser.add_argument("-f", "--force", action="store_true", default=False, @@ -469,11 +471,28 @@ def main(): config = common.read_config(options) + probcount = 0 + + appids = [] + for apk in options.appid: + if os.path.isfile(apk): + count = scan_binary(apk) + if count > 0: + logging.warning( + _('Scanner found {count} problems in {apk}:').format( + count=count, apk=apk + ) + ) + probcount += count + else: + appids.append(apk) + + if not appids: + return + # Read all app and srclib metadata allapps = metadata.read_metadata() - apps = common.read_app_args(options.appid, allapps, True) - - probcount = 0 + apps = common.read_app_args(appids, allapps, True) build_dir = 'build' if not os.path.isdir(build_dir): From 3bd09ef7f4703c605137d7397a8e6ed08d07b60d Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 1 Jun 2022 17:24:32 +0200 Subject: [PATCH 0673/2116] Integrate Exodus (Closes: #566, #1008) Code taken from: https://github.com/Exodus-Privacy/exodus-core/blob/v1/exodus_core/analysis/static_analysis.py --- fdroidserver/scanner.py | 77 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 2 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index bc9f304f..7f4aa846 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -24,11 +24,14 @@ import sys import traceback import zipfile from argparse import ArgumentParser +from collections import namedtuple from copy import deepcopy from tempfile import TemporaryDirectory import logging import itertools +import requests + from . import _ from . import common from . import metadata @@ -140,7 +143,45 @@ def get_embedded_classes(apkfile, depth=0): return classes -def scan_binary(apkfile): +# taken from exodus_core +def _compile_signatures(signatures): + """ + Compiles the regex associated to each signature, in order to speed up the trackers detection. + + :return: A compiled list of signatures. + """ + compiled_tracker_signature = [] + try: + compiled_tracker_signature = [ + re.compile(track.code_signature) for track in signatures + ] + except TypeError: + print("signatures is not iterable") + return compiled_tracker_signature + + +# taken from exodus_core +def load_trackers_signatures(): + """ + Load trackers signatures from the official Exodus database. + + :return: a dictionary containing signatures. + """ + signatures = [] + exodus_url = "https://reports.exodus-privacy.eu.org/api/trackers" + r = requests.get(exodus_url) + data = r.json() + for e in data['trackers']: + signatures.append( + namedtuple('tracker', data['trackers'][e].keys())( + *data['trackers'][e].values() + ) + ) + logging.debug('{} trackers signatures loaded'.format(len(signatures))) + return signatures, _compile_signatures(signatures) + + +def scan_binary(apkfile, extract_signatures=None): """Scan output of dexdump for known non-free classes.""" logging.info(_('Scanning APK with dexdump for known non-free classes.')) result = get_embedded_classes(apkfile) @@ -150,6 +191,29 @@ def scan_binary(apkfile): if regexp.match(classname): logging.debug("Found class '%s'" % classname) problems += 1 + + if extract_signatures: + + def _detect_tracker(sig, tracker, class_list): + for clazz in class_list: + if sig.search(clazz): + return tracker + return None + + results = [] + args = [(extract_signatures[1][index], tracker, result) + for (index, tracker) in enumerate(extract_signatures[0]) if + len(tracker.code_signature) > 3] + + for res in itertools.starmap(_detect_tracker, args): + if res: + results.append(res) + + trackers = [t for t in results if t is not None] + for tracker in trackers: + logging.debug("Found tracker {}".format(tracker.code_signature)) + problems += len(trackers) + if problems: logging.critical("Found problems in %s" % apkfile) return problems @@ -454,6 +518,11 @@ def main(): ) common.setup_global_opts(parser) parser.add_argument("appid", nargs='*', help=_("application ID with optional versionCode in the form APPID[:VERCODE]")) + parser.add_argument( + "--exodus", + action="store_true", + help="Use tracker scanner from Exodus project (requires internet)", + ) parser.add_argument("-f", "--force", action="store_true", default=False, help=_("Force scan of disabled apps and builds.")) parser.add_argument("--json", action="store_true", default=False, @@ -473,10 +542,14 @@ def main(): probcount = 0 + exodus = [] + if options.exodus: + exodus = load_trackers_signatures() + appids = [] for apk in options.appid: if os.path.isfile(apk): - count = scan_binary(apk) + count = scan_binary(apk, exodus) if count > 0: logging.warning( _('Scanner found {count} problems in {apk}:').format( From a1677b5cb09b2c6a76cfae987ba06c245d0e004f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Wed, 6 Jul 2022 02:14:17 +0200 Subject: [PATCH 0674/2116] add test case for _exodus_compile_signatures --- fdroidserver/scanner.py | 4 ++-- tests/scanner.TestCase | 26 +++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 7f4aa846..01fda1c6 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -144,7 +144,7 @@ def get_embedded_classes(apkfile, depth=0): # taken from exodus_core -def _compile_signatures(signatures): +def _exodus_compile_signatures(signatures): """ Compiles the regex associated to each signature, in order to speed up the trackers detection. @@ -178,7 +178,7 @@ def load_trackers_signatures(): ) ) logging.debug('{} trackers signatures loaded'.format(len(signatures))) - return signatures, _compile_signatures(signatures) + return signatures, _exodus_compile_signatures(signatures) def scan_binary(apkfile, extract_signatures=None): diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 5e4c0666..47cccccf 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -338,6 +338,27 @@ class ScannerTest(unittest.TestCase): self.assertEqual(0, count, 'there should be this many errors') +class Test__exodus_compile_signatures(unittest.TestCase): + + def setUp(self): + self.m1 = mock.Mock() + self.m1.code_signature = r"^random\sregex$" + self.m2 = mock.Mock() + self.m2.code_signature = r"^another.+regex$" + self.mock_sigs = [self.m1, self.m2] + + def test_ok(self): + result = fdroidserver.scanner._exodus_compile_signatures(self.mock_sigs) + self.assertListEqual(result, [ + re.compile(self.m1.code_signature), + re.compile(self.m2.code_signature), + ]) + + def test_not_iterable(self): + result = fdroidserver.scanner._exodus_compile_signatures(123) + self.assertListEqual(result, []) + + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) @@ -352,5 +373,8 @@ if __name__ == "__main__": (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(ScannerTest)) + newSuite.addTests([ + unittest.makeSuite(ScannerTest), + unittest.makeSuite(Test__exodus_compile_signatures), + ]) unittest.main(failfast=False) From 544772d3ab71fb4baaacce59141c28b1295ec47d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Tue, 5 Jul 2022 09:47:46 +0200 Subject: [PATCH 0675/2116] add missing "or" to scanner cli synopsis --- fdroidserver/scanner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 01fda1c6..b67e6df2 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -514,7 +514,7 @@ def main(): # Parse command line... parser = ArgumentParser( - usage="%(prog)s [options] [APPID[:VERCODE] path/to.apk ...]" + usage="%(prog)s [options] [(APPID[:VERCODE] | path/to.apk) ...]" ) common.setup_global_opts(parser) parser.add_argument("appid", nargs='*', help=_("application ID with optional versionCode in the form APPID[:VERCODE]")) From 07a366a4d645329bb2137d9ec8b63c512b0d0019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Wed, 6 Jul 2022 02:05:58 +0200 Subject: [PATCH 0676/2116] add tests for scanner.load_exodus_trackers_signatures --- fdroidserver/scanner.py | 7 +++--- tests/scanner.TestCase | 48 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index b67e6df2..9aeb0f20 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -36,6 +36,7 @@ from . import _ from . import common from . import metadata from .exception import BuildException, VCSException +from . import scanner config = None options = None @@ -161,7 +162,7 @@ def _exodus_compile_signatures(signatures): # taken from exodus_core -def load_trackers_signatures(): +def load_exodus_trackers_signatures(): """ Load trackers signatures from the official Exodus database. @@ -178,7 +179,7 @@ def load_trackers_signatures(): ) ) logging.debug('{} trackers signatures loaded'.format(len(signatures))) - return signatures, _exodus_compile_signatures(signatures) + return signatures, scanner._exodus_compile_signatures(signatures) def scan_binary(apkfile, extract_signatures=None): @@ -544,7 +545,7 @@ def main(): exodus = [] if options.exodus: - exodus = load_trackers_signatures() + exodus = load_exodus_trackers_signatures() appids = [] for apk in options.appid: diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 47cccccf..15a75edb 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -359,6 +359,53 @@ class Test__exodus_compile_signatures(unittest.TestCase): self.assertListEqual(result, []) +class Test_load_exodus_trackers_signatures(unittest.TestCase): + + def setUp(self): + self.requests_ret = mock.Mock() + self.requests_ret.json = mock.Mock(return_value={ + "trackers": { + "1": { + "id": 1, + "name": "Steyer Puch 1", + "description": "blah blah blah", + "creation_date": "1956-01-01", + "code_signature": "com.puch.|com.steyer.", + "network_signature": "pst\\.com", + "website": "https://pst.com", + "categories": ["tracker"], + "documentation": [], + }, + "2": { + "id": 2, + "name": "Steyer Puch 2", + "description": "blah blah blah", + "creation_date": "1956-01-01", + "code_signature": "com.puch.|com.steyer.", + "network_signature": "pst\\.com", + "website": "https://pst.com", + "categories": ["tracker"], + "documentation": [], + } + }, + }) + self.requests_func = mock.Mock(return_value=self.requests_ret) + self.compilesig_func = mock.Mock(return_value=9999) + + def test_ok(self): + with mock.patch("requests.get", self.requests_func), mock.patch( + "fdroidserver.scanner._exodus_compile_signatures", self.compilesig_func + ): + result_sigs, result_regex = fdroidserver.scanner.load_exodus_trackers_signatures() + self.requests_func.assert_called_once_with("https://reports.exodus-privacy.eu.org/api/trackers") + self.assertEqual(len(result_sigs), 2) + self.assertEqual(result_sigs[0].id, 1) + self.assertEqual(result_sigs[1].id, 2) + + self.compilesig_func.assert_called_once_with(result_sigs) + self.assertEqual(result_regex, 9999) + + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) @@ -376,5 +423,6 @@ if __name__ == "__main__": newSuite.addTests([ unittest.makeSuite(ScannerTest), unittest.makeSuite(Test__exodus_compile_signatures), + unittest.makeSuite(Test_load_exodus_trackers_signatures), ]) unittest.main(failfast=False) From 1c2b0844103bbfd76133aac00eaf62022b2735aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Sun, 10 Jul 2022 13:35:26 +0200 Subject: [PATCH 0677/2116] =?UTF-8?q?=F0=9F=94=A7=20improve=20scanner.scan?= =?UTF-8?q?=5Fapk=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refactor test function it a TestCase and split into separate test cases. Fix and improve tests for scanning apks with embedded apks. --- tests/scanner.TestCase | 77 +++++++++++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 28 deletions(-) diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 15a75edb..0c554be6 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -204,34 +204,6 @@ class ScannerTest(unittest.TestCase): self.assertTrue(f in files['infos'], f + ' should be removed with an info message') - def test_scan_binary(self): - config = dict() - fdroidserver.common.fill_config_defaults(config) - fdroidserver.common.config = config - fdroidserver.common.options = mock.Mock() - fdroidserver.common.options.verbose = False - - apkfile = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') - self.assertEqual( - 0, - fdroidserver.scanner.scan_binary(apkfile), - 'Found false positives in binary', - ) - fdroidserver.scanner.CODE_SIGNATURES["java/lang/Object"] = re.compile( - r'.*java/lang/Object', re.IGNORECASE | re.UNICODE - ) - self.assertEqual( - 1, - fdroidserver.scanner.scan_binary(apkfile), - 'Did not find bad code signature in binary', - ) - apkfile = os.path.join(self.basedir, 'apk.embedded_1.apk') - self.assertEqual( - 1, - fdroidserver.scanner.scan_binary(apkfile), - 'Did not find bad code signature in binary', - ) - def test_build_local_scanner(self): """`fdroid build` calls scanner functions, test them here""" testdir = tempfile.mkdtemp( @@ -338,6 +310,54 @@ class ScannerTest(unittest.TestCase): self.assertEqual(0, count, 'there should be this many errors') +class Test_scan_binary(unittest.TestCase): + + def setUp(self): + self.basedir = os.path.join(localmodule, 'tests') + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.common.config = config + fdroidserver.common.options = mock.Mock() + + def test_code_signature_match(self): + apkfile = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') + with mock.patch("fdroidserver.scanner.CODE_SIGNATURES", {"java/lang/Object": re.compile( + r'.*java/lang/Object', re.IGNORECASE | re.UNICODE + )}): + self.assertEqual( + 1, + fdroidserver.scanner.scan_binary(apkfile), + 'Did not find bad code signature in binary', + ) + + def test_embedded_apk_code_signature(self): + apkfile = os.path.join(self.basedir, 'apk.embedded_1.apk') + with mock.patch("fdroidserver.scanner.CODE_SIGNATURES", {"org/bitbucket/tickytacky/mirrormirror/MainActivity": re.compile( + r'.*org/bitbucket/tickytacky/mirrormirror/MainActivity', re.IGNORECASE | re.UNICODE + )}): + self.assertEqual( + 1, + fdroidserver.scanner.scan_binary(apkfile), + 'Did not find bad code signature in binary', + ) + + def test_top_level_signature_embedded_apk_present(self): + apkfile = os.path.join(self.basedir, 'apk.embedded_1.apk') + with mock.patch("fdroidserver.scanner.CODE_SIGNATURES", {"org/fdroid/ci/BuildConfig": re.compile( + r'.*org/fdroid/ci/BuildConfig', re.IGNORECASE | re.UNICODE + )}): + self.assertEqual( + 1, + fdroidserver.scanner.scan_binary(apkfile), + 'Did not find bad code signature in binary', + ) + + def test_ok(self): + apkfile = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') + result = fdroidserver.scanner.scan_binary(apkfile) + self.assertEqual(0, result, 'Found false positives in binary') + + class Test__exodus_compile_signatures(unittest.TestCase): def setUp(self): @@ -422,6 +442,7 @@ if __name__ == "__main__": newSuite = unittest.TestSuite() newSuite.addTests([ unittest.makeSuite(ScannerTest), + unittest.makeSuite(Test_scan_binary), unittest.makeSuite(Test__exodus_compile_signatures), unittest.makeSuite(Test_load_exodus_trackers_signatures), ]) From 66adf4c5087ae1cf38c3daa031482d4b0578c68d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Tue, 12 Jul 2022 17:18:34 +0200 Subject: [PATCH 0678/2116] add .ropeproject/ to .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 44799e9a..98c5b90b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ *.box TAGS .idea +.ropeproject/ # files generated by build build/ @@ -70,4 +71,4 @@ makebuildserver.config.py locale/*/LC_MESSAGES/fdroidserver.mo # sphinx -public/ \ No newline at end of file +public/ From 42d9ac446ce487733f298c3582948055b9acfa22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 14 Jul 2022 12:56:15 +0200 Subject: [PATCH 0679/2116] get tests working on ci --- tests/scanner.TestCase | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 0c554be6..d074150f 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -327,10 +327,16 @@ class Test_scan_binary(unittest.TestCase): self.assertEqual( 1, fdroidserver.scanner.scan_binary(apkfile), - 'Did not find bad code signature in binary', + "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner.CODE_SIGNATURES.values(), apkfile), ) - def test_embedded_apk_code_signature(self): + @unittest.skipIf( + sys.version_info < (3, 9), + "Our implementation for traversing zip files will silently fail to work" + "on older python versions, also see: " + "https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1110#note_932026766" + ) + def test_bottom_level_embedded_apk_code_signature(self): apkfile = os.path.join(self.basedir, 'apk.embedded_1.apk') with mock.patch("fdroidserver.scanner.CODE_SIGNATURES", {"org/bitbucket/tickytacky/mirrormirror/MainActivity": re.compile( r'.*org/bitbucket/tickytacky/mirrormirror/MainActivity', re.IGNORECASE | re.UNICODE @@ -338,7 +344,7 @@ class Test_scan_binary(unittest.TestCase): self.assertEqual( 1, fdroidserver.scanner.scan_binary(apkfile), - 'Did not find bad code signature in binary', + "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner.CODE_SIGNATURES.values(), apkfile), ) def test_top_level_signature_embedded_apk_present(self): @@ -349,13 +355,13 @@ class Test_scan_binary(unittest.TestCase): self.assertEqual( 1, fdroidserver.scanner.scan_binary(apkfile), - 'Did not find bad code signature in binary', + "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner.CODE_SIGNATURES.values(), apkfile), ) - def test_ok(self): + def test_no_match(self): apkfile = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') result = fdroidserver.scanner.scan_binary(apkfile) - self.assertEqual(0, result, 'Found false positives in binary') + self.assertEqual(0, result, "Found false positives in binary '{}'".format(apkfile)) class Test__exodus_compile_signatures(unittest.TestCase): @@ -410,7 +416,7 @@ class Test_load_exodus_trackers_signatures(unittest.TestCase): }, }) self.requests_func = mock.Mock(return_value=self.requests_ret) - self.compilesig_func = mock.Mock(return_value=9999) + self.compilesig_func = mock.Mock(return_value="mocked return value") def test_ok(self): with mock.patch("requests.get", self.requests_func), mock.patch( @@ -419,11 +425,10 @@ class Test_load_exodus_trackers_signatures(unittest.TestCase): result_sigs, result_regex = fdroidserver.scanner.load_exodus_trackers_signatures() self.requests_func.assert_called_once_with("https://reports.exodus-privacy.eu.org/api/trackers") self.assertEqual(len(result_sigs), 2) - self.assertEqual(result_sigs[0].id, 1) - self.assertEqual(result_sigs[1].id, 2) + self.assertListEqual([1, 2], sorted([x.id for x in result_sigs])) self.compilesig_func.assert_called_once_with(result_sigs) - self.assertEqual(result_regex, 9999) + self.assertEqual(result_regex, "mocked return value") if __name__ == "__main__": From ab579be6b535c7f1fdd07a8531c8fe0ca027b8f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Sun, 17 Jul 2022 15:52:52 +0200 Subject: [PATCH 0680/2116] add some basic tests for scanner.main --- fdroidserver/scanner.py | 3 ++- tests/scanner.TestCase | 50 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 9aeb0f20..05b9c2b8 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -550,7 +550,7 @@ def main(): appids = [] for apk in options.appid: if os.path.isfile(apk): - count = scan_binary(apk, exodus) + count = scanner.scan_binary(apk, exodus) if count > 0: logging.warning( _('Scanner found {count} problems in {apk}:').format( @@ -565,6 +565,7 @@ def main(): return # Read all app and srclib metadata + allapps = metadata.read_metadata() apps = common.read_app_args(appids, allapps, True) diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index d074150f..2e5f6305 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -13,6 +13,8 @@ import textwrap import unittest import uuid import yaml +import collections +import pathlib from unittest import mock localmodule = os.path.realpath( @@ -26,6 +28,7 @@ import fdroidserver.build import fdroidserver.common import fdroidserver.metadata import fdroidserver.scanner +from testcommon import TmpCwd class ScannerTest(unittest.TestCase): @@ -431,6 +434,52 @@ class Test_load_exodus_trackers_signatures(unittest.TestCase): self.assertEqual(result_regex, "mocked return value") +class Test_main(unittest.TestCase): + + def setUp(self): + self.args = ["com.example.app", "local/additional.apk", "another.apk"] + self.exit_func = mock.Mock() + self.read_app_args_func = mock.Mock(return_value={}) + self.scan_binary_func = mock.Mock(return_value=0) + + def test_parsing_appid(self): + """ + This test verifies that app id get parsed correctly + (doesn't test how they get processed) + """ + self.args = ["com.example.app"] + with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir), mock.patch( + "sys.exit", self.exit_func + ), mock.patch("sys.argv", ["fdroid scanner", *self.args]), mock.patch( + "fdroidserver.common.read_app_args", self.read_app_args_func + ), mock.patch("fdroidserver.scanner.scan_binary", self.scan_binary_func): + fdroidserver.scanner.main() + + self.exit_func.assert_not_called() + self.read_app_args_func.assert_called_once_with( + ['com.example.app'], collections.OrderedDict(), True + ) + self.scan_binary_func.assert_not_called() + + def test_parsing_apkpath(self): + """ + This test verifies that apk paths get parsed correctly + (doesn't test how they get processed) + """ + self.args = ["local.application.apk"] + with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir), mock.patch( + "sys.exit", self.exit_func + ), mock.patch("sys.argv", ["fdroid scanner", *self.args]), mock.patch( + "fdroidserver.common.read_app_args", self.read_app_args_func + ), mock.patch("fdroidserver.scanner.scan_binary", self.scan_binary_func): + pathlib.Path(self.args[0]).touch() + fdroidserver.scanner.main() + + self.exit_func.assert_not_called() + self.read_app_args_func.assert_not_called() + self.scan_binary_func.assert_called_once_with('local.application.apk', []) + + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) @@ -450,5 +499,6 @@ if __name__ == "__main__": unittest.makeSuite(Test_scan_binary), unittest.makeSuite(Test__exodus_compile_signatures), unittest.makeSuite(Test_load_exodus_trackers_signatures), + unittest.makeSuite(Test_main), ]) unittest.main(failfast=False) From f8452c4f0cfd5491fa341243fe896b259fcfd9ca Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 18 Jul 2022 15:12:43 +0200 Subject: [PATCH 0681/2116] scan_binary: Log matched class --- fdroidserver/scanner.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 05b9c2b8..0c2a5751 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -198,6 +198,7 @@ def scan_binary(apkfile, extract_signatures=None): def _detect_tracker(sig, tracker, class_list): for clazz in class_list: if sig.search(clazz): + logging.debug("Found tracker, class {} matching {}".format(clazz, tracker.code_signature)) return tracker return None @@ -211,8 +212,6 @@ def scan_binary(apkfile, extract_signatures=None): results.append(res) trackers = [t for t in results if t is not None] - for tracker in trackers: - logging.debug("Found tracker {}".format(tracker.code_signature)) problems += len(trackers) if problems: From 7e1d97435134bf0185f84f2898978bb1b4f3cb06 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 25 Jul 2022 08:51:47 +0200 Subject: [PATCH 0682/2116] Reduce try/except block --- fdroidserver/common.py | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 39c1dcd4..ecf4629c 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1846,20 +1846,21 @@ def parse_androidmanifests(paths, app): else: try: xml = parse_xml(path) - if "package" in xml.attrib: - s = xml.attrib["package"] - if app_matches_packagename(app, s): - package = s - if XMLNS_ANDROID + "versionName" in xml.attrib: - version = xml.attrib[XMLNS_ANDROID + "versionName"] - base_dir = os.path.dirname(path) - version = retrieve_string_singleline(base_dir, version) - if XMLNS_ANDROID + "versionCode" in xml.attrib: - a = xml.attrib[XMLNS_ANDROID + "versionCode"] - if string_is_integer(a): - vercode = a except Exception: logging.warning(_("Problem with xml at '{path}'").format(path=path)) + continue + if "package" in xml.attrib: + s = xml.attrib["package"] + if app_matches_packagename(app, s): + package = s + if XMLNS_ANDROID + "versionName" in xml.attrib: + version = xml.attrib[XMLNS_ANDROID + "versionName"] + base_dir = os.path.dirname(path) + version = retrieve_string_singleline(base_dir, version) + if XMLNS_ANDROID + "versionCode" in xml.attrib: + a = xml.attrib[XMLNS_ANDROID + "versionCode"] + if string_is_integer(a): + vercode = a # Remember package name, may be defined separately from version+vercode if package is None: From 7822db2881539bf64c01f82570feb6130a2a459f Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 25 Jul 2022 08:52:57 +0200 Subject: [PATCH 0683/2116] Catch DefusedXmlException (as ValueError) defusedxml can't handle the nbsp in the strings.xml (etree can). --- MANIFEST.in | 2 + fdroidserver/common.py | 6 +- tests/common.TestCase | 11 + .../app/build.gradle.kts | 306 +++++ .../app/src/main/res/values/strings.xml | 1023 +++++++++++++++++ 5 files changed, 1345 insertions(+), 3 deletions(-) create mode 100644 tests/source-files/com.ubergeek42.WeechatAndroid/app/build.gradle.kts create mode 100644 tests/source-files/com.ubergeek42.WeechatAndroid/app/src/main/res/values/strings.xml diff --git a/MANIFEST.in b/MANIFEST.in index 9ea77a1b..2d330a4a 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -748,6 +748,8 @@ include tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata include tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/en-US/short_description.txt include tests/source-files/com.nextcloud.client/src/versionDev/fastlane/metadata/android/en-US/title.txt include tests/source-files/com.seafile.seadroid2/app/build.gradle +include tests/source-files/com.ubergeek42.WeechatAndroid/app/build.gradle.kts +include tests/source-files/com.ubergeek42.WeechatAndroid/app/src/main/res/values/strings.xml include tests/source-files/de.varengold.activeTAN/build.gradle include tests/source-files/dev.patrickgold.florisboard/app/build.gradle.kts include tests/source-files/eu.siacs.conversations/build.gradle diff --git a/fdroidserver/common.py b/fdroidserver/common.py index ecf4629c..bbb4fc47 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1579,7 +1579,7 @@ def retrieve_string(app_dir, string, xmlfiles=None): continue try: xml = parse_xml(path) - except XMLElementTree.ParseError: + except (XMLElementTree.ParseError, ValueError): logging.warning(_("Problem with xml at '{path}'").format(path=path)) continue element = xml.find('string[@name="' + name + '"]') @@ -1625,7 +1625,7 @@ def fetch_real_name(app_dir, flavours): logging.debug("fetch_real_name: Checking manifest at " + path) try: xml = parse_xml(path) - except XMLElementTree.ParseError: + except (XMLElementTree.ParseError, ValueError): logging.warning(_("Problem with xml at '{path}'").format(path=path)) continue app = xml.find('application') @@ -1846,7 +1846,7 @@ def parse_androidmanifests(paths, app): else: try: xml = parse_xml(path) - except Exception: + except (XMLElementTree.ParseError, ValueError): logging.warning(_("Problem with xml at '{path}'").format(path=path)) continue if "package" in xml.attrib: diff --git a/tests/common.TestCase b/tests/common.TestCase index d90bb180..b107b278 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1168,6 +1168,17 @@ class CommonTest(unittest.TestCase): self.assertEqual(('0.3.10', '29', 'dev.patrickgold.florisboard'), fdroidserver.common.parse_androidmanifests(paths, app)) + app = fdroidserver.metadata.App() + app.id = 'com.ubergeek42.WeechatAndroid' + paths = [ + os.path.join('source-files', 'com.ubergeek42.WeechatAndroid', 'app', 'build.gradle.kts'), + os.path.join('source-files', 'com.ubergeek42.WeechatAndroid', 'app', 'src', 'main', 'res', 'values', 'strings.xml'), + ] + for path in paths: + self.assertTrue(os.path.isfile(path)) + self.assertEqual(('1.8.1', '1_08_01', None), + fdroidserver.common.parse_androidmanifests(paths, app)) + def test_parse_androidmanifests_ignore(self): app = fdroidserver.metadata.App() app.id = 'org.fdroid.fdroid' diff --git a/tests/source-files/com.ubergeek42.WeechatAndroid/app/build.gradle.kts b/tests/source-files/com.ubergeek42.WeechatAndroid/app/build.gradle.kts new file mode 100644 index 00000000..88c03a08 --- /dev/null +++ b/tests/source-files/com.ubergeek42.WeechatAndroid/app/build.gradle.kts @@ -0,0 +1,306 @@ +import com.android.build.api.transform.* +import com.android.build.api.variant.VariantInfo +import com.android.utils.FileUtils +import org.gradle.internal.os.OperatingSystem +import org.aspectj.bridge.IMessage +import org.aspectj.bridge.MessageHandler +import org.aspectj.tools.ajc.Main + +plugins { + id("com.android.application") + kotlin("android") + kotlin("kapt") +} + +dependencies { + implementation(project(":cats")) + implementation(project(":relay")) + + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.0") + + // these two are required for logging within the relay module. todo remove? + implementation("org.slf4j:slf4j-api:1.7.36") + implementation("com.noveogroup.android:android-logger:1.3.6") + + implementation("androidx.core:core-ktx:1.8.0") + implementation("androidx.legacy:legacy-support-v4:1.0.0") + implementation("androidx.annotation:annotation:1.3.0") // For @Nullable/@NonNull + implementation("androidx.appcompat:appcompat:1.4.2") + implementation("androidx.emoji2:emoji2:1.1.0") + implementation("androidx.preference:preference-ktx:1.2.0") // preference fragment & al + implementation("androidx.legacy:legacy-preference-v14:1.0.0") // styling for the fragment + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.4.1") + implementation("androidx.lifecycle:lifecycle-common-java8:2.4.1") + implementation("androidx.sharetarget:sharetarget:1.2.0-rc01") + + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.2") + + implementation("com.github.bumptech.glide:glide:4.13.2") + kapt("com.github.bumptech.glide:compiler:4.13.2") + implementation("com.squareup.okhttp3:okhttp:4.10.0") + + val roomVersion = "2.4.2" + implementation("androidx.room:room-runtime:$roomVersion") + annotationProcessor("androidx.room:room-compiler:$roomVersion") + kapt("androidx.room:room-compiler:$roomVersion") + + implementation("org.yaml:snakeyaml:1.30") + + implementation("org.bouncycastle:bcpkix-jdk15on:1.70") + + // needed for thread-safe date formatting as SimpleDateFormat isn"t thread-safe + // the alternatives, including apache commons and threetenabp, seem to be much slower + // todo perhaps replace with core library desugaring, if it"s fast + implementation("net.danlew:android.joda:2.10.14") + + implementation("org.greenrobot:eventbus:3.3.1") + + debugImplementation("org.aspectj:aspectjrt:1.9.9.1") + debugImplementation("com.squareup.leakcanary:leakcanary-android:2.9.1") + + testImplementation("org.junit.jupiter:junit-jupiter:5.8.2") + testImplementation("org.junit.jupiter:junit-jupiter-params:5.8.2") +} + +tasks.withType { + options.encoding = "UTF-8" +} + +android { + compileSdk = 31 + + defaultConfig { + versionCode = 1_08_01 + versionName = "1.8.1" + + minSdk = 21 + targetSdk = 31 + buildConfigField("String", "VERSION_BANNER", "\"" + versionBanner() + "\"") + + vectorDrawables.useSupportLibrary = true + + javaCompileOptions { + annotationProcessorOptions { + arguments["room.schemaLocation"] = "$projectDir/schemas" + arguments["room.incremental"] = "true" + } + } + + kotlinOptions { + freeCompilerArgs = listOf( + "-language-version", "1.7", + "-api-version", "1.7") + jvmTarget = "11" + } + } + + signingConfigs { + create("dev") { + try { + storeFile = file(project.properties["devStorefile"] as String) + storePassword = project.properties["devStorePassword"] as String + keyAlias = project.properties["devKeyAlias"] as String + keyPassword = project.properties["devKeyPassword"] as String + } catch (e: Exception) { + project.logger.warn("WARNING: Set the values devStorefile, devStorePassword, " + + "devKeyAlias, and devKeyPassword " + + "in ~/.gradle/gradle.properties to sign the release.") + } + } + } + + buildTypes { + getByName("debug") { + applicationIdSuffix = ".debug" + versionNameSuffix = "-debug" + } + + getByName("release") { + isMinifyEnabled = true + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro", + "../cats/proguard-rules.pro") + // kotlinx-coroutines-core debug-only artifact + // see https://github.com/Kotlin/kotlinx.coroutines#avoiding-including-the-debug-infrastructure-in-the-resulting-apk + packagingOptions { + resources.excludes += "DebugProbesKt.bin" + } + } + + create("dev") { + initWith(getByName("release")) + matchingFallbacks += listOf("release") + applicationIdSuffix = ".dev" + versionNameSuffix = "-dev" + signingConfig = signingConfigs.getByName("dev") + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + } + + buildFeatures { + viewBinding = true + } +} + +fun versionBanner(): String { + val os = org.apache.commons.io.output.ByteArrayOutputStream() + project.exec { + commandLine = "git describe --long".split(" ") + standardOutput = os + } + return String(os.toByteArray()).trim() +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////// cats +//////////////////////////////////////////////////////////////////////////////////////////////////// + +// ajc gets hold of some files such as R.jar, and on Windows it leads to errors such as: +// The process cannot access the file because it is being used by another process +// to avoid these, weave in a process, which `javaexec` will helpfully launch for us. + +fun weave(classPath: Iterable, aspectPath: Iterable, input: Iterable, output: File) { + val runInAProcess = OperatingSystem.current().isWindows + val bootClassPath = android.bootClasspath + + println(if (runInAProcess) ":: weaving in a process..." else ":: weaving...") + println(":: boot class path: $bootClassPath") + println(":: class path: $classPath") + println(":: aspect path: $aspectPath") + println(":: input: $input") + println(":: output: $output") + + val arguments = listOf("-showWeaveInfo", + "-1.8", + "-preserveAllLocals", + "-bootclasspath", bootClassPath.asArgument, + "-classpath", classPath.asArgument, + "-aspectpath", aspectPath.asArgument, + "-inpath", input.asArgument, + "-d", output.absolutePath) + + if (runInAProcess) { + javaexec { + classpath = weaving + main = "org.aspectj.tools.ajc.Main" + args = arguments + } + } else { + val handler = MessageHandler(true) + Main().run(arguments.toTypedArray(), handler) + + val log = project.logger + for (message in handler.getMessages(null, true)) { + when (message.kind) { + IMessage.DEBUG -> log.debug("DEBUG " + message.message, message.thrown) + IMessage.INFO -> log.info("INFO: " + message.message, message.thrown) + IMessage.WARNING -> log.warn("WARN: " + message.message, message.thrown) + IMessage.FAIL, + IMessage.ERROR, + IMessage.ABORT -> log.error("ERROR: " + message.message, message.thrown) + } + } + } +} + +// the only purpose of the following is to get a hold of aspectjtools jar +// this jar is already on build script classpath, but that classpath is impossible to get +// see https://discuss.gradle.org/t/how-do-i-determine-buildscript-classpath/37973/3 + +val weaving: Configuration by configurations.creating + +dependencies { + weaving("org.aspectj:aspectjtools:1.9.9.1") +} + +// historical note: the problem with weaving Kotlin and Java in-place is that: +// * Java is compiled by task compileDebugJavaWithJavac +// * gradle can run either one of these tasks, or both of them +// * compileDebugJavaWithJavac depends on compileDebugKotlin +// * weaving Kotlin requires Java classes +// +// a transformation is a poorly advertised feature that works on merged code, and also has its own +// inputs and outputs, so this fixes all of our problems... + + class TransformCats : Transform() { + override fun getName(): String = TransformCats::class.simpleName!! + + override fun getInputTypes() = setOf(QualifiedContent.DefaultContentType.CLASSES) + + // only look for annotations in app classes + // transformation will consume these and put woven classes in the output dir + override fun getScopes() = mutableSetOf(QualifiedContent.Scope.PROJECT) + + // but also have the rest on our class path + // these will not be touched by the transformation + override fun getReferencedScopes() = mutableSetOf(QualifiedContent.Scope.SUB_PROJECTS, + QualifiedContent.Scope.EXTERNAL_LIBRARIES) + + override fun isIncremental() = false + + // only run on debug builds + override fun applyToVariant(variant: VariantInfo) = variant.isDebuggable + + override fun transform(invocation: TransformInvocation) { + if (!invocation.isIncremental) { + invocation.outputProvider.deleteAll() + } + + val output = invocation.outputProvider.getContentLocation(name, outputTypes, + scopes, Format.DIRECTORY) + if (output.isDirectory) FileUtils.deleteDirectoryContents(output) + FileUtils.mkdirs(output) + + val input = mutableListOf() + val classPath = mutableListOf() + val aspectPath = mutableListOf() + + invocation.inputs.forEach { source -> + source.directoryInputs.forEach { dir -> + input.add(dir.file) + classPath.add(dir.file) + } + + source.jarInputs.forEach { jar -> + input.add(jar.file) + classPath.add(jar.file) + } + } + + invocation.referencedInputs.forEach { source -> + source.directoryInputs.forEach { dir -> + classPath.add(dir.file) + } + + source.jarInputs.forEach { jar -> + classPath.add(jar.file) + // this used to read `if (jar.name == ":cats") ...`, + // but with android gradle plugin 4.2.0 jar names contain garbage + // this is a very simple but a bit fragile workaround. todo improve + if (jar.file.directoriesInsideRootProject().contains("cats")) { + aspectPath.add(jar.file) + } + } + + } + + weave(classPath, aspectPath, input, output) + } +} + +android.registerTransform(TransformCats()) + +val Iterable.asArgument get() = joinToString(File.pathSeparator) + +fun File.directoriesInsideRootProject() = sequence { + var file = this@directoriesInsideRootProject + while (true) { + yield(file.name) + file = file.parentFile ?: break + if (file == rootProject.projectDir) break + } +} diff --git a/tests/source-files/com.ubergeek42.WeechatAndroid/app/src/main/res/values/strings.xml b/tests/source-files/com.ubergeek42.WeechatAndroid/app/src/main/res/values/strings.xml new file mode 100644 index 00000000..0e1ff29b --- /dev/null +++ b/tests/source-files/com.ubergeek42.WeechatAndroid/app/src/main/res/values/strings.xml @@ -0,0 +1,1023 @@ + + +]> + + + + + + + + + Weechat-Android + com.ubergeek42.WeechatAndroid + + + + Relay host is not set + Relay password is not set + SSH host is not set + SSH password is not set + SSH private key is not set + + + + Server unexpectedly closed connection while connecting. + Wrong password or connection type? + + Could not resolve address %s + + Error: %s + Buffer lost some hot messages because of new lines + There are no hot buffers for now + Not connected + Buffer list empty + Activity not found for intent %s + + + + Upload file + Tab + Upload + Send + + Cancel search + Search up + Search down + More + + Go to bottom + + Fetch more lines + Fetching lines… + + search + + filter + + Open drawer + Close drawer + + + + + + Search + + Users + + Hotlist + Show hot message + + Close + + Connect + Disconnect + Stop connecting + + Settings + + Filter lines + + Dark theme + + Attach image + Attach media + Attach file + Attach image + Attach media + Take photo + + Debug + Sync hotlist + Die + + + + Prefix + Message + Both + + Regex + Case sensitive + + + + With timestamps + Without timestamps + Messages only + + + + + + Connection Status + Hotlist + + Waiting for network + Will connect in %d seconds… + Connecting now… + Connected to %s + + + + %d message + %d messages + + +  in %d buffer +  in %d buffers + + + + + New message in %2$s + %1$d new messages in %2$s + + + + (user unknown) + (users unknown) + + (message not fetched) + + (message not fetched) + (%d messages not fetched) + + + + Me + + Reply + + + + + + + + %1$s (%2$s) + + %1$d user + %1$d users + + %s (away) + + + Copy + Select text + + Paste + + + Permission required + + To take photos, app needs write access to public storage + OK + + + + + + Issued to:

    generated by GitLab CI Job #%s


    + %1$s
    +
    + Issued by:
    + %2$s
    +
    + Validity period:
    + Issued on: %3$s
    + Expires on: %4$s
    +
    + SHA-256 fingerprint:
    + %5$s + ]]> + Unknown + + Reject + Back to safety + + + + + Invalid hostname + + %1$s + but the certificate is only valid for the following hosts: %2$s + ]]> + Note that Android P and beyond does not fall back to Common Name (CN) validation. + Subject Alternative Name (SAN) must be used instead. + Learn more + ]]> +       %s + ]]> +       (none) + ]]> + + + + + Certificate expired + + This certificate is no longer valid. + Please make sure that the device date is correct. + + + + + Certificate not yet valid + + This certificate will be valid in the future. + Please make sure that the device date is correct. + + + + + Untrusted certificate + + This certificate isn’t trusted by Android, but you can still connect. + The app will remember the selected certificate + and trust it and any certificates signed by it. + + + Accept selected + + + + + Certificate not pinned + + This server is trusted by Android, + but a setting requires you to confirm that you trust it as well. + The app will remember the selected certificate + and trust it and any certificates signed by it. + + + Pin selected + + + + + + + Unknown + + + + + Unknown server + %1$s
    has never been encountered. +
    +
    %2$s key SHA256 fingerprint: +
    %3$s + ]]> + + Accept server key + Reject + + + + + Server changed key + ⚠ Warning:
    it’s possible that someone is trying to hijack this connection! +
    +
    Server at %1$s is known, but its key doesn’t match the key you previously accepted. +
    +
    %2$s key SHA256 fingerprint: +
    %3$s +
    +
    If you want to continue, please clear known hosts in preferences. + ]]> + + + + + + + + + + Clear + Paste + Choose file + %1$s (%2$s) + set + not set + Clipboard is empty + + password + + Save + Default + Discard changes? + Cancel + Discard + + None + Unknown + + Invalid number + No spaces allowed in hostnames + + + + + + Connection + + Connection type + + Plain connection + WeeChat SSL + SSH tunnel + WebSocket + WebSocket (SSL) + + + + + WebSocket path + + + + + + SSL settings + + + Require certificate pins + + Prompt to confirm that you trust the server, even if the system trusts it + + Clear certificates + No trusted certificates + One trusted certificate + + One trusted certificate + %s trusted certificates + + Clear certificates? + Clear + Cancel + Certificates cleared + Could not clear certificates + + + Client certificate + + PKCS #12 file containing private key and client certificate + + Certificate was stored inside security hardware + + Certificate was stored inside software key store + + Certificate was stored inside key store + + Certificate forgotten + + + Server is asking for a client certificate but none is set. + Wanted: %1$s certificate issued by: %2$s + + Server is asking for a client certificate but the one we have doesn’t fit. + Wanted: %1$s certificate issued by: %2$s + + + + SSH tunnel settings + + SSH host + + SSH port + + SSH username + + Authentication method + + Password + Key + + + Password + + Private key + Ed25519, ECDSA, RSA or DSA key + + %s key was stored inside security hardware + + %s key was stored inside software key store + + %s key was stored inside key store + + %1$s key was stored inside the app. + \n + \nThe key couldn’t be stored in the key store: %2$s + + Key forgotten + + Clear known hosts + No entries + + %s entry + %s entries + + Clear known hosts? + Cancel + Clear + Known hosts cleared + + + Failed to authenticate with password + + Failed to authenticate with key + + + + Relay + + Relay host + + Relay port + + Relay password + + + + Handshake settings + + Handshake + + Compatibility + Modern & fast + Modern + + + In compatibility mode, the password isn’t hashed. This is the fastest method. + This method is required if using WeeChat < 2.9, but works on the later versions as well. + +

    Modern & fast handshake limits algorithms to the SHA-2 family. + +

    Modern handshake also includes PBKDF2. + These algorithms can be very slow, depending on the number of iterations. + +

    Password hashing offers little to no benefit if the connection is encrypted. + Learn more + ]]> + + + + Synchronization settings + + + Only sync open buffers + + Can significantly reduce traffic and battery usage, + but hotlist updates will only happen once 5 minutes + + + Sync buffer read status + + Mark buffers as read in WeeChat when you read them in this app + + + Number of lines to fetch + + The number of lines requested when opening a buffer + or when you press the “Load more lines” button (%s) + + + Number of lines to fetch for search + + When starting a new search, unless already fetched, + the app will request up to this many lines from WeeChat (%s) + + + These settings take effect after reconnection. + Note that due to filtering the number of lines actually shown + might be less than the number of loaded lines. + Also note that due to WeeChat’s limitations + the app has to re-fetch all lines every times it requests more lines. + + + + Miscellaneous + + Reconnect on connection loss + + Connect on system boot + + + + Ping settings + + + Enable ping + + Periodically check that the relay connection is still alive when idle + + + Idle time + + Number of seconds to wait before sending a ping when the connection is idle (%s) + + + Ping timeout + + Number of seconds to wait before closing an unresponsive connection (%s) + + + + + + Buffer list + + + Sort buffer list + + Sort by number of highlights/private messages/unread messages + + + Hide non-conversation buffers + + E.g. server buffers and plugin buffers + + + Hide hidden buffers + + Hide buffers hidden with /buffer hide + + + Show buffer filter + + Filter matches full buffer names and reveals matching hidden buffers + + + System gesture exclusion zone + + On Android Q, the left side of the screen is reserved for the back gesture. + Enable this to have a small area in the bottom of the screen + where you can open the buffer list normally. + + + + + + Look & feel + + Text size + + + Hide action bar + + Hide action bar when the keyboard is open or when scrolling up + + + Filter messages + + Hide messages filtered by WeeChat (e.g. irc_smart_filter) + + + Prefix alignment + + Left aligned + Right aligned + Timestamp aligned + No alignment + + + + Maximum width of prefix + + In terms of letters; longer nicknames will be cut (%s) + + + Enclose nicknames + + Enclose the nicknames in < and > + + Timestamp format + %s (default: HH:mm:ss) + Invalid timestamp format + + + Buffer font + Default + Import + Imported: %s + + + Non-monospace fonts will not work well with alignment. + Import fonts from the dialog, + or put them into one of the following locations:%1$s + + + + + + Theme + + @string/pref__theme__theme__system + Dark + Light + + + Set by battery saver + + Theme switch + Show theme switch in the menu + + Light color scheme + Dark color scheme + Error loading color scheme %s + Not set + Error + Import + Imported: %s + + Learn more +
    +
    Import color schemes from the dialogs + or put them into the following location:%1$s + ]]>
    + + + Dim down non-human lines + + Display joins/quits in a faint color, as set in the color scheme + + + + + + Buttons + + Show tab button + + Show send button + + Show paperclip button + + Paperclip button short tap + + @string/pref__buttons__paperclip__actions__content_images + @string/pref__buttons__paperclip__actions__content_media + @string/pref__buttons__paperclip__actions__content_anything + @string/pref__buttons__paperclip__actions__mediastore_images + @string/pref__buttons__paperclip__actions__mediastore_media + @string/pref__buttons__paperclip__actions__camera + + + Paperclip button long tap + + @string/pref__buttons__paperclip__actions__none + @string/pref__buttons__paperclip__actions__content_images + @string/pref__buttons__paperclip__actions__content_media + @string/pref__buttons__paperclip__actions__content_anything + @string/pref__buttons__paperclip__actions__mediastore_images + @string/pref__buttons__paperclip__actions__mediastore_media + @string/pref__buttons__paperclip__actions__camera + + + Disabled + + System: attach images + + System: attach images and videos + + System: attach any files + + Gallery: attach images + + Gallery: attach images and videos + + Take photo + + + When the paperclip button gets hidden to provide more space for the input field, + you can still attach files via overflow menu. + + + Volume buttons change text size + + If set, volume buttons will change text size instead of volume + + + + + + Notifications + + + Enable notifications + + Notify about hot messages such as private messages or highlights + + Notification sound + + Vibration + + Notification light + + + + + + Media preview + + Enabled + + Never + On Wi-Fi only + On unmetered networks only + Always + + + Context + Disabled everywhere + Enabled for %s + + Chat + Paste dialog + Notifications + + + + Insecure requests + + Allow + Rewrite as HTTPS + Disallow + + + +
    ⚠ Warning: the app is accessing the web directly. + A malicious person could craft a website to learn your IP address and other data. + To prevent the app from accessing websites you don’t know, + remove the strategy for the wildcard host “*” or set it to “none”. + Learn more + ]]>
    + + + Strategies + + Defines the ways images are fetched from individual websites, and some filters. + \n + \n%1$s; %2$s; + \n + \n%3$s + Error + Message filter set + Message filter not set + line filters not set + + %d line filter set + %d line filters set + + No strategies loaded + Strategies: %s + +"# don’t look for links in the part +# of the message that matches the +# following regex. this prevents +# the app from showing broken links +# in matrix clients’ quotes, e.g. +# <nick "http://broken.co"> message +#message filter: +# ^<[^ ]{1,16} \".{1,33}\">\\s + +line filters: +# don’t display thumbnails for any +# lines that match the following regex +- regex: '^(?:Title: |[↑^] )' + +# don’t display thumbnails +# for any lines from bot +#- nicks: [bot] + +# don’t display thumbnails +# for any lines from bot +# that also math the given regex +#- nicks: [bot] +# regex: ^<\\S+>\\s + +strategies: +- name: skip pastebins + type: none + hosts: + - pastebin.com + - bpa.st + - dpaste.com + - termbin.com + +- name: skip site banners + type: none + hosts: + - github.com + - gist.github.com + - stackoverflow.com + - '*.stackexchange.com' + - twitch.tv + - '*.twitch.tv' + +#- name: skip the rest, including redirects +# type: none +# hosts: ['*'] + +- name: try the rest + type: any + hosts: ['*'] + +- name: youtube + type: image + hosts: [www.youtube.com, m.youtube.com, youtube.com, youtu.be] + regex: (?i)^https?://(?:(?:www\\.|m\\.)?youtube\\.com/watch\\?v=|youtu\\.be/)([A-Za-z0-9_-]+) + small: https://img.youtube.com/vi/$1/mqdefault.jpg + big: https://img.youtube.com/vi/$1/hqdefault.jpg + +- name: i.imgur + type: image + hosts: [i.imgur.com] + regex: (?i)^https?://i\\.imgur\\.com/([A-Za-z0-9]+) + small: https://i.imgur.com/$1m.jpg + big: https://i.imgur.com/$1h.jpg + +- name: imgur/gallery + type: any + hosts: [imgur.com, www.imgur.com] + regex: (?i)^https?://(?:www\\.)?imgur\\.com/gallery/(.*) + sub: https://imgur.com/a/$1 + +- name: 9gag + type: image + hosts: [9gag.com, img-9gag-fun.9cache.com] + regex: (?i)^https?://(?:9gag\\.com/gag|img-9gag-fun\\.9cache\\.com/photo)/([^_]+) + small: https://images-cdn.9gag.com/photo/$1_700b.jpg + big: https://images-cdn.9gag.com/photo/$1_700b.jpg + +- name: mobile.twitter + type: any + hosts: [mobile.twitter.com] + regex: (?i)^https?://mobile\\.twitter\\.com/(.*) + sub: https://twitter.com/$1 + +- name: common + type: any + regex: (?i)^https?://(.+) + sub: https://$1 + hosts: + - '*.wikipedia.org' + - gfycat.com + - imgur.com + +- name: reddit + type: any + hosts: [v.redd.it, reddit.com, www.reddit.com, old.reddit.com] + body size: 196608 +" + + Advanced + + Download size limit + %s MB + + + Disk cache + + %s MB; takes effect on restart + + + Success cooldown + + %s hours. The app will consider successfully fetched image available, + either from cache or the web, + for the specified amount of time. + + Thumbnail width + + Minimum thumbnail height + + Maximum thumbnail height + + + + + + File sharing + + Accept from other apps + + Text only + Text, images and videos + Everything + + + Direct share + + Disabled + Up to one buffer + Up to two buffers + Up to three buffers + Up to four buffers + + + Upload URL + + File field + + Regex + + +
    curl -s --user user:pass \\ +
      --header \'Additional: Header\' \\ +
      --form additional=field \\ +
      --form file=@file.ext \\ +
      https://example.com | perl -nle \\ +
      \'m#^https://\\S+#; print $1//$&\'
    +
    +
    If the regular expression is set, it is used to find the URL in the response body; + either the first capture group is used, or the whole match. + Learn more + ]]>
    + + Advanced + + Additional headers + + Additional fields + + Authentication + + None + Basic + + + User + + Password + + Remember uploads for + %s hours + + + + + + About + + Weechat-Android %s + + created by ubergeek42 + + build ID %s + Unknown version ID + + + \nThis project uses the following libraries: + \n + \n    • Android Logger by Noveo Group + \n    • AspectJ by Eclipse Foundation + \n    • Bouncy Castle + \n    • EventBus by greenrobot + \n    • Glide by Bump Technologies + \n    • Hugo by Jake Wharton + \n    • Java-WebSocket by Nathan Rajlich + \n    • joda-time-android by Daniel Lew + \n    • JSch by JCraft + \n    • LeakCanary by Square, Inc + \n    • Mockito by Szczepan Faber and friends + \n    • nv-websocket-client by Takahiko Kawasaki + \n    • OkHttp by Square, Inc + \n    • SLF4J by QOS.ch + \n    • SnakeYAML by Andrey Somov + \n    • sshlib by ConnectBot + \n + \nPlease create an issue on GitHub + if you find a bug or have a feature request. + \n + \n + From eb79522a363a3e5cd0164827b8123477df4a5bc3 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sun, 31 Jul 2022 09:14:17 +0200 Subject: [PATCH 0684/2116] Fix flake8 E275 missing whitespace after keyword --- fdroidserver/common.py | 10 +++++----- fdroidserver/index.py | 2 +- fdroidserver/metadata.py | 2 +- fdroidserver/update.py | 4 ++-- makebuildserver | 2 +- tests/update.TestCase | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index bbb4fc47..5c9eff52 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -468,7 +468,7 @@ def read_config(opts=None): .format(key=k, configname=configname)) for configname in confignames_to_delete: - del(config[configname]) + del config[configname] return config @@ -3656,7 +3656,7 @@ def compare_apks(apk1, apk2, tmp_dir, log_dir=None): '--max-report-size', '12345678', '--max-diff-block-lines', '128', '--html', htmlfile, '--text', textfile, absapk1, absapk2]) != 0: - return("Failed to run diffoscope " + apk1) + return "Failed to run diffoscope " + apk1 apk1dir = os.path.join(tmp_dir, apk_badchars.sub('_', apk1[0:-4])) # trim .apk apk2dir = os.path.join(tmp_dir, apk_badchars.sub('_', apk2[0:-4])) # trim .apk @@ -3675,17 +3675,17 @@ def compare_apks(apk1, apk2, tmp_dir, log_dir=None): if set_command_in_config('apktool'): if subprocess.call([config['apktool'], 'd', absapk1, '--output', 'apktool'], cwd=apk1dir) != 0: - return("Failed to run apktool " + apk1) + return "Failed to run apktool " + apk1 if subprocess.call([config['apktool'], 'd', absapk2, '--output', 'apktool'], cwd=apk2dir) != 0: - return("Failed to run apktool " + apk2) + return "Failed to run apktool " + apk2 p = FDroidPopen(['diff', '-r', apk1dir, apk2dir], output=False) lines = p.output.splitlines() if len(lines) != 1 or 'META-INF' not in lines[0]: if set_command_in_config('meld'): p = FDroidPopen([config['meld'], apk1dir, apk2dir], output=False) - return("Unexpected diff output:\n" + p.output) + return "Unexpected diff output:\n" + p.output # since everything verifies, delete the comparison to keep cruft down shutil.rmtree(apk1dir) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 5536fe74..6599565b 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -1017,7 +1017,7 @@ def v1_sort_packages(packages, fdroid_signing_key_fingerprints): if package.get('versionCode', None): versionCode = -int(package['versionCode']) - return(packageName, group, signer, versionCode) + return packageName, group, signer, versionCode packages.sort(key=v1_sort_keys) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 72737d41..d69fb6f1 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -816,7 +816,7 @@ def parse_yaml_metadata(mf, app): "metadata because it is deprecated.") .format(field=deprecated_field, metapath=mf.name)) - del(yamldata[deprecated_field]) + del yamldata[deprecated_field] if yamldata.get('Builds', None): for build in yamldata.get('Builds', []): diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 32b6b55d..fe3a0874 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -751,9 +751,9 @@ def insert_funding_yml_donation_links(apps): app['OpenCollective'] = s if not app.get('Donate'): if 'liberapay' in data: - del(data['liberapay']) + del data['liberapay'] if 'open_collective' in data: - del(data['open_collective']) + del data['open_collective'] # this tuple provides a preference ordering for k in ('custom', 'github', 'patreon', 'community_bridge', 'ko_fi', 'issuehunt'): v = data.get(k) diff --git a/makebuildserver b/makebuildserver index b8926f95..428dec50 100755 --- a/makebuildserver +++ b/makebuildserver @@ -133,7 +133,7 @@ elif os.path.exists('makebs.config.py'): # this is the old name for the config file exec(compile(open('makebs.config.py').read(), 'makebs.config.py', 'exec'), config) if '__builtins__' in config: - del(config['__builtins__']) # added by compile/exec + del config['__builtins__'] # added by compile/exec logging.debug("makebuildserver.config.py parsed -> %s", json.dumps(config, indent=4, sort_keys=True)) if config['basebox'] == BASEBOX_DEFAULT and 'basebox_version' not in config: config['basebox_version'] = BASEBOX_VERSION_DEFAULT diff --git a/tests/update.TestCase b/tests/update.TestCase index 6428dce2..4c35bf86 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -319,7 +319,7 @@ class UpdateTest(unittest.TestCase): repoapps['info.guardianproject.urzip']['localized']['en-US']['name']) self.assertIsNone(repoapps['obb.mainpatch.current'].get('Name')) - del(repoapps['info.guardianproject.urzip']['localized']) + del repoapps['info.guardianproject.urzip']['localized'] fdroidserver.update.insert_missing_app_names_from_apks(repoapps, apks) self.assertEqual('urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234', repoapps['info.guardianproject.urzip']['localized']['en-US']['name']) From 543c9fc77fdd14a6eb5647b6911398e3356fa60a Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Thu, 4 Aug 2022 10:44:48 +0000 Subject: [PATCH 0685/2116] Update approved official SPDX license tags --- fdroidserver/lint.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 9b7ab967..bfbe4543 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -805,10 +805,8 @@ APPROVED_LICENSES = [ 'Artistic-1.0-Perl', 'Artistic-1.0-cl8', 'Artistic-2.0', - 'Beerware', 'BSD-1-Clause', 'BSD-2-Clause', - 'BSD-2-Clause-FreeBSD', 'BSD-2-Clause-Patent', 'BSD-3-Clause', 'BSD-3-Clause-Clear', @@ -880,7 +878,6 @@ APPROVED_LICENSES = [ 'LiLiQ-Rplus-1.1', 'MIT', 'MIT-0', - 'MIT-CMU', 'MPL-1.0', 'MPL-1.1', 'MPL-2.0', @@ -946,7 +943,6 @@ APPROVED_LICENSES = [ 'X11', 'XFree86-1.1', 'Xnet', - 'XSkat', 'YPL-1.1', 'ZPL-2.0', 'ZPL-2.1', From e207f45cb60a2f7dc40eb8e72c7afa556fd2d1a6 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Mon, 8 Aug 2022 15:37:07 +0000 Subject: [PATCH 0686/2116] gradle v7.5.1 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 5e18f545..571da45b 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -179,6 +179,7 @@ get_sha() { '7.4.1') echo 'e5444a57cda4a95f90b0c9446a9e1b47d3d7f69057765bfb54bd4f482542d548' ;; '7.4.2') echo '29e49b10984e585d8118b7d0bc452f944e386458df27371b49b4ac1dec4b7fda' ;; '7.5') echo 'cb87f222c5585bd46838ad4db78463a5c5f3d336e5e2b98dc7c0c586527351c2' ;; + '7.5.1') echo 'f6b8596b10cce501591e92f229816aa4046424f3b24d771751b06779d58c8ec4' ;; *) exit 1 esac } @@ -199,7 +200,7 @@ d_plugin_k=(7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2. d_plugin_v=(7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From f99dbec012683686183490faf9aaf849949b2004 Mon Sep 17 00:00:00 2001 From: linsui Date: Sun, 7 Aug 2022 17:55:39 +0800 Subject: [PATCH 0687/2116] scanner: fix maven url check for kts files --- fdroidserver/scanner.py | 2 +- tests/gradle-maven-blocks.yaml | 2 ++ tests/scanner.TestCase | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 0c2a5751..a67cf5b7 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -44,7 +44,7 @@ options = None DEFAULT_JSON_PER_BUILD = {'errors': [], 'warnings': [], 'infos': []} # type: ignore json_per_build = deepcopy(DEFAULT_JSON_PER_BUILD) -MAVEN_URL_REGEX = re.compile(r"""\smaven\s*{.*?(?:setUrl|url)\s*=?\s*(?:uri)?\(?\s*["']?([^\s"']+)["']?[^}]*}""", +MAVEN_URL_REGEX = re.compile(r"""\smaven\s*(?:{.*?(?:setUrl|url)|\((?:url)?)\s*=?\s*(?:uri)?\(?\s*["']?([^\s"']+)["']?[^})]*[)}]""", re.DOTALL) CODE_SIGNATURES = { diff --git a/tests/gradle-maven-blocks.yaml b/tests/gradle-maven-blocks.yaml index f6587f94..886bb667 100644 --- a/tests/gradle-maven-blocks.yaml +++ b/tests/gradle-maven-blocks.yaml @@ -776,3 +776,5 @@ - ' maven{ url ''https://maven.aliyun.com/repository/public''}' - ' maven{url "https://jitpack.io"}' - ' maven{url "https://plugins.gradle.org/m2/"}' +- ' maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")' +- ' maven(url = "https://maven.pkg.jetbrains.space/public/p/kotlinx-html/maven")' diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 2e5f6305..7f04bb18 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -54,6 +54,7 @@ class ScannerTest(unittest.TestCase): 'se.manyver': 2, 'com.jens.automation2': 2, 'com.github.shadowsocks': 6, + 'org.tasks': 1, } for d in glob.glob(os.path.join(source_files, '*')): build = fdroidserver.metadata.Build() From 8267fb2cafe4fd5f517f27ea4d2646e7f1ff4ef2 Mon Sep 17 00:00:00 2001 From: proletarius101 Date: Wed, 17 Aug 2022 07:59:36 +0000 Subject: [PATCH 0688/2116] stop checking existence for build-tools, platform-tools, tools --- fdroidserver/build.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index aac14e67..32b3306f 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -994,12 +994,6 @@ def main(): if options.reset_server and not options.server: parser.error("option %s: Using --reset-server without --server makes no sense" % "reset-server") - if options.onserver or not options.server: - for d in ['build-tools', 'platform-tools', 'tools']: - if not os.path.isdir(os.path.join(config['sdk_path'], d)): - raise FDroidException(_("Android SDK '{path}' does not have '{dirname}' installed!") - .format(path=config['sdk_path'], dirname=d)) - log_dir = 'logs' if not os.path.isdir(log_dir): logging.info("Creating log directory") From 6ce271ac15d18b3fcbae7a85811cbe58f5053746 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 17 Aug 2022 12:31:32 +0200 Subject: [PATCH 0689/2116] Fix variable in exception --- fdroidserver/checkupdates.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index d781fc4e..35466193 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -55,7 +55,7 @@ def check_http(app): if urlver != '.': parsed = urllib.parse.urlparse(urlver) if not parsed.netloc or not parsed.scheme or parsed.scheme != 'https': - raise FDroidException(_('UpdateCheckData has invalid URL: {url}').format(url=urlcode)) + raise FDroidException(_('UpdateCheckData has invalid URL: {url}').format(url=urlver)) logging.debug("...requesting {0}".format(urlcode)) req = urllib.request.Request(urlcode, None, headers=net.HEADERS) From cf7eb913d9785b2bb0acef71766c5cb4ef4cd526 Mon Sep 17 00:00:00 2001 From: linsui Date: Fri, 19 Aug 2022 18:01:31 +0800 Subject: [PATCH 0690/2116] Show all unused scanner path at once --- fdroidserver/common.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 5c9eff52..c32c9c67 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2445,13 +2445,19 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver= def getpaths_map(build_dir, globpaths): """Extend via globbing the paths from a field and return them as a map from original path to resulting paths.""" paths = dict() + not_found_paths = [] for p in globpaths: p = p.strip() full_path = os.path.join(build_dir, p) full_path = os.path.normpath(full_path) paths[p] = [r[len(build_dir) + 1:] for r in glob.glob(full_path)] if not paths[p]: - raise FDroidException("glob path '%s' did not match any files/dirs" % p) + not_found_paths.append(p) + if not_found_paths: + raise FDroidException( + "Some glob paths did not match any files/dirs:\n" + + "\n".join(not_found_paths) + ) return paths From 516a0c2ce8179fb3fcef03ebf24e84655203362d Mon Sep 17 00:00:00 2001 From: linsui Date: Tue, 9 Aug 2022 22:37:44 +0800 Subject: [PATCH 0691/2116] Fix tag match with GitPython --- fdroidserver/common.py | 33 +++++++------------------------- tests/common.TestCase | 43 ++++++++++++++++++++++-------------------- 2 files changed, 30 insertions(+), 46 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index c32c9c67..e4b43fdb 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1238,34 +1238,15 @@ class vcs_git(vcs): p = FDroidPopen(['git', 'tag'], cwd=self.local, output=False) return p.output.splitlines() - tag_format = re.compile(r'tag: ([^) ]*)') - def latesttags(self): - """Return a list of latest tags. - - The definition is a little blurry here, Android does not care for the - version name of an app as normally used as the tag name so versions do - not need to follow strverscmp() or similar. Also they can be rather - arbitrary so git tag --sort=-version:refname does not work. On the other side - sorting them by creation date, i.e. git tag --sort=-authordate does not - work either as there are a lot of repos where older tags were created - later. - - So git log preserves the graph order and only sorts by date afterwards. - This results in tags of beta versions being sorted earlier then the - latest tag as long as they are part of the graph below the latest tag - or are created earlier. - """ + """Return a list of latest tags.""" self.checkrepo() - p = FDroidPopen(['git', 'log', '--tags', - '--simplify-by-decoration', '--pretty=format:%d'], - cwd=self.local, output=False) - tags = [] - for line in p.output.splitlines(): - for entry in line.split(', '): - for tag in self.tag_format.findall(entry): - tags.append(tag) - return tags + # TODO: Python3.6: Should accept path-like + return [tag.name for tag in sorted( + git.Repo(self.local).tags, + key=lambda t: t.commit.committed_date, + reverse=True + )] def getref(self, revname='HEAD'): self.checkrepo() diff --git a/tests/common.TestCase b/tests/common.TestCase index b107b278..e80ecd35 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -2357,26 +2357,29 @@ class CommonTest(unittest.TestCase): ) def test_vcs_git_latesttags(self): - vcs = fdroidserver.common.vcs_git(None, None) - popenmock = mock.Mock() - popenmock.output = """ - (HEAD, tag: 8.9.5, origin/master, origin/HEAD, master) - (tag: 8.9.4) - (tag: 8.9.3, tag: 8,9,3) - (tag: 8.9.3b) - (tag: awesome_release) - (origin/feature/cast) - (tag: 8.6.3) -""" - with mock.patch( - 'fdroidserver.common.FDroidPopen', lambda a, **b: popenmock - ) as _ignored, mock.patch( - 'fdroidserver.common.vcs_git.checkrepo' - ) as _ignored: - _ignored # silence the linters - tags = vcs.latesttags() - self.assertEqual(tags, ['8.9.5', '8.9.4', '8.9.3', '8,9,3', - '8.9.3b', 'awesome_release', '8.6.3']) + tags = [ + "1.1.1", + "2.2.2", + "v3.0", + "0.0.4", + "0.5.0-beta", + "666(6)", + "seven", + ] + with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): + # TODO: Python3.6: Should accept path-like + repo = git.Repo.init(str(Path.cwd())) + f = Path("test") + date = 10**9 + for tag in tags: + date += 1 + f.write_text(tag) + repo.index.add([str(f)]) + repo.index.commit(tag, commit_date=str(date) + " +0000") + repo.create_tag(tag) + + vcs = fdroidserver.common.vcs_git(None, Path.cwd()) + self.assertEqual(vcs.latesttags(), tags[::-1]) def test_get_release_filename(self): app = fdroidserver.metadata.App() From 53c6dffbceddecbde605aa0d58d64c9f20d08272 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Wed, 24 Aug 2022 11:07:33 +0000 Subject: [PATCH 0692/2116] Android NDK None (None) --- fdroidserver/common.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index e4b43fdb..5cf824f2 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4601,6 +4601,12 @@ NDKS = [ "revision": "25.0.8775105", "sha256": "cd661aeda5d9b7cfb6e64bd80737c274d7c1c0d026df2f85be3bf3327b25e545", "url": "https://dl.google.com/android/repository/android-ndk-r25-linux.zip" + }, + { + "release": "r25b", + "revision": "25.1.8937393", + "sha256": "403ac3e3020dd0db63a848dcaba6ceb2603bf64de90949d5c4361f848e44b005", + "url": "https://dl.google.com/android/repository/android-ndk-r25b-linux.zip" } ] From 43ea0c35d8b9d0b932f235b3df9d7ea95cd06fec Mon Sep 17 00:00:00 2001 From: linsui Date: Wed, 24 Aug 2022 19:00:57 +0800 Subject: [PATCH 0693/2116] Sort the xml file pathes for consistent result --- fdroidserver/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 5cf824f2..b4217f94 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1555,7 +1555,7 @@ def retrieve_string(app_dir, string, xmlfiles=None): s = XMLElementTree.tostring(element, encoding='utf-8', method='text') return s.decode('utf-8').strip() - for path in xmlfiles: + for path in sorted(xmlfiles): if not os.path.isfile(path): continue try: From 9e58fc8cda4009b346ef60940e3f8267e412f156 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 8 Aug 2022 22:35:57 -0700 Subject: [PATCH 0694/2116] verify: normalize dicts via JSON for reliable comparisons 13016c5d6372cfcf3b8112e54a317eb4a992f3dc in !602 used a set to prevent duplicate entries, but that worked poorly because it required lots of data wrapping. Instead, just normalize to JSON, then equality is easy. --- fdroidserver/verify.py | 66 +++++++++---------------- tests/verify.TestCase | 110 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+), 43 deletions(-) create mode 100755 tests/verify.TestCase diff --git a/fdroidserver/verify.py b/fdroidserver/verify.py index f117feaa..fd4f9539 100644 --- a/fdroidserver/verify.py +++ b/fdroidserver/verify.py @@ -34,39 +34,6 @@ options = None config = None -class hashabledict(OrderedDict): - def __key(self): - return tuple((k, self[k]) for k in sorted(self)) - - def __hash__(self): - try: - return hash(self.__key()) - except TypeError as e: - print(self.__key()) - raise e - - def __eq__(self, other): - return self.__key() == other.__key() - - def __lt__(self, other): - return self.__key() < other.__key() - - def __qt__(self, other): - return self.__key() > other.__key() - - -class Decoder(json.JSONDecoder): - def __init__(self, **kwargs): - json.JSONDecoder.__init__(self, **kwargs) - self.parse_array = self.JSONArray - # Use the python implemenation of the scanner - self.scan_once = json.scanner.py_make_scanner(self) - - def JSONArray(self, s_and_end, scan_once, **kwargs): - values, end = json.decoder.JSONArray(s_and_end, scan_once, **kwargs) - return set(values), end - - def _add_diffoscope_info(d): """Add diffoscope setup metadata to provided dict under 'diffoscope' key. @@ -76,7 +43,7 @@ def _add_diffoscope_info(d): """ try: import diffoscope - d['diffoscope'] = hashabledict() + d['diffoscope'] = dict() d['diffoscope']['VERSION'] = diffoscope.VERSION from diffoscope.comparators import ComparatorManager @@ -89,7 +56,7 @@ def _add_diffoscope_info(d): for tool in external_tools if not tool_check_installed(tool) ] - d['diffoscope']['External-Tools-Required'] = tuple(external_tools) + d['diffoscope']['External-Tools-Required'] = external_tools from diffoscope.tools import OS_NAMES, get_current_os from diffoscope.external_tools import EXTERNAL_TOOLS @@ -102,10 +69,12 @@ def _add_diffoscope_info(d): tools.add(EXTERNAL_TOOLS[x][os_]) except KeyError: pass - d['diffoscope']['Available-in-{}-packages'.format(OS_NAMES[os_])] = tuple(sorted(tools)) + tools = sorted(tools) + d['diffoscope']['Available-in-{}-packages'.format(OS_NAMES[os_])] = tools - from diffoscope.tools import python_module_missing - d['diffoscope']['Missing-Python-Modules'] = tuple(sorted(python_module_missing.modules)) + from diffoscope.tools import python_module_missing as pmm + + d['diffoscope']['Missing-Python-Modules'] = sorted(pmm.modules) except ImportError: pass @@ -118,6 +87,9 @@ def write_json_report(url, remote_apk, unsigned_apk, compare_result): ensure that there is only one report per file, even when run repeatedly. + The output is run through JSON to normalize things like tuples vs + lists. + """ jsonfile = unsigned_apk + '.json' if os.path.exists(jsonfile): @@ -125,11 +97,11 @@ def write_json_report(url, remote_apk, unsigned_apk, compare_result): data = json.load(fp, object_pairs_hook=OrderedDict) else: data = OrderedDict() - output = hashabledict() + output = dict() _add_diffoscope_info(output) output['url'] = url for key, filename in (('local', unsigned_apk), ('remote', remote_apk)): - d = hashabledict() + d = dict() output[key] = d d['file'] = filename d['sha256'] = common.sha256sum(filename) @@ -148,14 +120,22 @@ def write_json_report(url, remote_apk, unsigned_apk, compare_result): jsonfile = 'unsigned/verified.json' if os.path.exists(jsonfile): with open(jsonfile) as fp: - data = json.load(fp, cls=Decoder, object_pairs_hook=hashabledict) + data = json.load(fp) else: data = OrderedDict() data['packages'] = OrderedDict() packageName = output['local']['packageName'] + if packageName not in data['packages']: - data['packages'][packageName] = set() - data['packages'][packageName].add(output) + data['packages'][packageName] = [] + found = False + output_dump = json.dumps(output, sort_keys=True) + for p in data['packages'][packageName]: + if output_dump == json.dumps(p, sort_keys=True): + found = True + break + if not found: + data['packages'][packageName].insert(0, json.loads(output_dump)) with open(jsonfile, 'w') as fp: json.dump(data, fp, cls=common.Encoder, sort_keys=True) diff --git a/tests/verify.TestCase b/tests/verify.TestCase new file mode 100755 index 00000000..c62ea95d --- /dev/null +++ b/tests/verify.TestCase @@ -0,0 +1,110 @@ +#!/usr/bin/env python3 + +import inspect +import json +import logging +import optparse +import os +import shutil +import sys +import tempfile +import unittest + +from pathlib import Path +from unittest.mock import patch + +localmodule = os.path.realpath( + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) +print('localmodule: ' + localmodule) +if localmodule not in sys.path: + sys.path.insert(0, localmodule) + +from fdroidserver import common, verify + + +TEST_APP_ENTRY = { + "1539780240.3885746": { + "local": { + "file": "unsigned/com.politedroid_6.apk", + "packageName": "com.politedroid", + "sha256": "70c2f776a2bac38a58a7d521f96ee0414c6f0fb1de973c3ca8b10862a009247d", + "timestamp": 1234567.8900000, + "versionCode": "6", + "versionName": "1.5", + }, + "remote": { + "file": "tmp/com.politedroid_6.apk", + "packageName": "com.politedroid", + "sha256": "70c2f776a2bac38a58a7d521f96ee0414c6f0fb1de973c3ca8b10862a009247d", + "timestamp": 1234567.8900000, + "versionCode": "6", + "versionName": "1.5", + }, + "url": "https://f-droid.org/repo/com.politedroid_6.apk", + "verified": True, + } +} + + +class VerifyTest(unittest.TestCase): + + basedir = Path(__file__).resolve().parent + + def setUp(self): + logging.basicConfig(level=logging.DEBUG) + self.tempdir = tempfile.TemporaryDirectory() + os.chdir(self.tempdir.name) + self.repodir = Path('repo') + self.repodir.mkdir() + + def tearDown(self): + self.tempdir.cleanup() + + @patch('fdroidserver.common.sha256sum') + def test_write_json_report(self, sha256sum): + sha256sum.return_value = ( + '70c2f776a2bac38a58a7d521f96ee0414c6f0fb1de973c3ca8b10862a009247d' + ) + os.mkdir('tmp') + os.mkdir('unsigned') + verified_json = Path('unsigned/verified.json') + packageName = 'com.politedroid' + apk_name = packageName + '_6.apk' + remote_apk = 'tmp/' + apk_name + unsigned_apk = 'unsigned/' + apk_name + # TODO common.use apk_strip_v1_signatures() on unsigned_apk + shutil.copy(str(self.basedir / 'repo' / apk_name), remote_apk) + shutil.copy(str(self.basedir / 'repo' / apk_name), unsigned_apk) + url = TEST_APP_ENTRY['1539780240.3885746']['url'] + + self.assertFalse(verified_json.exists()) + verify.write_json_report(url, remote_apk, unsigned_apk, {}) + self.assertTrue(verified_json.exists()) + # smoke check status JSON + with verified_json.open() as fp: + firstpass = json.load(fp) + + verify.write_json_report(url, remote_apk, unsigned_apk, {}) + with verified_json.open() as fp: + secondpass = json.load(fp) + + self.assertEqual(firstpass, secondpass) + + +if __name__ == "__main__": + os.chdir(os.path.dirname(__file__)) + + parser = optparse.OptionParser() + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) + (common.options, args) = parser.parse_args(['--verbose']) + + newSuite = unittest.TestSuite() + newSuite.addTest(unittest.makeSuite(VerifyTest)) + unittest.main(failfast=False) From ed3622fffffcd472f3b203e344b0c94edfbab5ef Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 8 Aug 2022 22:57:18 -0700 Subject: [PATCH 0695/2116] convert verify.py and verify.TestCase to black code format --- .gitlab-ci.yml | 2 ++ fdroidserver/verify.py | 52 ++++++++++++++++++++++++++++++------------ 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index daa95686..1ee61b26 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -249,6 +249,7 @@ black: fdroidserver/readmeta.py fdroidserver/signindex.py fdroidserver/tail.py + fdroidserver/verify.py setup.py tests/build.TestCase tests/deploy.TestCase @@ -263,6 +264,7 @@ black: tests/ndk-release-checksums.py tests/rewritemeta.TestCase tests/signindex.TestCase + tests/verify.TestCase fedora_latest: diff --git a/fdroidserver/verify.py b/fdroidserver/verify.py index fd4f9539..e12f72ea 100644 --- a/fdroidserver/verify.py +++ b/fdroidserver/verify.py @@ -43,23 +43,25 @@ def _add_diffoscope_info(d): """ try: import diffoscope + d['diffoscope'] = dict() d['diffoscope']['VERSION'] = diffoscope.VERSION from diffoscope.comparators import ComparatorManager + ComparatorManager().reload() from diffoscope.tools import tool_check_installed, tool_required + external_tools = sorted(tool_required.all) external_tools = [ - tool - for tool in external_tools - if not tool_check_installed(tool) + tool for tool in external_tools if not tool_check_installed(tool) ] d['diffoscope']['External-Tools-Required'] = external_tools from diffoscope.tools import OS_NAMES, get_current_os from diffoscope.external_tools import EXTERNAL_TOOLS + current_os = get_current_os() os_list = [current_os] if (current_os in OS_NAMES) else iter(OS_NAMES) for os_ in os_list: @@ -106,13 +108,16 @@ def write_json_report(url, remote_apk, unsigned_apk, compare_result): d['file'] = filename d['sha256'] = common.sha256sum(filename) d['timestamp'] = os.stat(filename).st_ctime - d['packageName'], d['versionCode'], d['versionName'] = common.get_apk_id(filename) + d['packageName'], d['versionCode'], d['versionName'] = common.get_apk_id( + filename + ) if compare_result: output['verified'] = False output['result'] = compare_result else: output['verified'] = True - data[str(output['local']['timestamp'])] = output # str makes better dict keys than float + # str makes better dict keys than float + data[str(output['local']['timestamp'])] = output with open(jsonfile, 'w') as fp: json.dump(data, fp, sort_keys=True) @@ -145,13 +150,27 @@ def main(): global options, config # Parse command line... - parser = ArgumentParser(usage="%(prog)s [options] [APPID[:VERCODE] [APPID[:VERCODE] ...]]") + parser = ArgumentParser( + usage="%(prog)s [options] [APPID[:VERCODE] [APPID[:VERCODE] ...]]" + ) common.setup_global_opts(parser) - parser.add_argument("appid", nargs='*', help=_("application ID with optional versionCode in the form APPID[:VERCODE]")) - parser.add_argument("--reuse-remote-apk", action="store_true", default=False, - help=_("Verify against locally cached copy rather than redownloading.")) - parser.add_argument("--output-json", action="store_true", default=False, - help=_("Output JSON report to file named after APK.")) + parser.add_argument( + "appid", + nargs='*', + help=_("application ID with optional versionCode in the form APPID[:VERCODE]"), + ) + parser.add_argument( + "--reuse-remote-apk", + action="store_true", + default=False, + help=_("Verify against locally cached copy rather than redownloading."), + ) + parser.add_argument( + "--output-json", + action="store_true", + default=False, + help=_("Output JSON report to file named after APK."), + ) options = parser.parse_args() config = common.read_config(options) @@ -198,10 +217,15 @@ def main(): net.download_file(url, dldir=tmp_dir) except requests.exceptions.HTTPError: try: - net.download_file(url.replace('/repo', '/archive'), dldir=tmp_dir) + net.download_file( + url.replace('/repo', '/archive'), dldir=tmp_dir + ) except requests.exceptions.HTTPError as e: - raise FDroidException(_('Downloading {url} failed. {error}') - .format(url=url, error=e)) from e + raise FDroidException( + _('Downloading {url} failed. {error}').format( + url=url, error=e + ) + ) from e unsigned_apk = os.path.join(unsigned_dir, apkfilename) compare_result = common.verify_apks(remote_apk, unsigned_apk, tmp_dir) From 22ce23ebe02acef5d8a4f9eae892b4b9a4948236 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 24 Aug 2022 19:53:54 +0200 Subject: [PATCH 0696/2116] gitlab-ci: paramiko from Debian to avoid crypto libs from source Before it was cryptography, now bcrypt requires a Rust compiler: https://gitlab.com/fdroid/fdroidserver/-/jobs/2929483724 --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1ee61b26..0d8a9f06 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -416,11 +416,11 @@ plugin_fetchsrclibs: curl git python3-cffi - python3-cryptography python3-matplotlib python3-nacl - python3-pip + python3-paramiko python3-pil + python3-pip python3-pycparser python3-venv - python3 -m venv --system-site-packages env From ae79e8b96743713aa356083aab68f7e31e3f3ef7 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Tue, 21 Jun 2022 11:19:31 +0000 Subject: [PATCH 0697/2116] scanner: add sinaweibosdk --- fdroidserver/scanner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index a67cf5b7..406e7bc0 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -89,6 +89,7 @@ NON_FREE_GRADLE_LINES = { r'xyz.belvi.mobilevision:barcodescanner', r'org.jetbrains.kotlinx:kotlinx-coroutines-play-services', r'me.pushy:sdk', + r'io.github.sinaweibosdk', ] } From 82525dbc4e3165d753135345e8c255a03f76076f Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Tue, 21 Jun 2022 11:32:18 +0000 Subject: [PATCH 0698/2116] Apply 1 suggestion(s) to 1 file(s) --- fdroidserver/scanner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 406e7bc0..78f4639e 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -90,6 +90,7 @@ NON_FREE_GRADLE_LINES = { r'org.jetbrains.kotlinx:kotlinx-coroutines-play-services', r'me.pushy:sdk', r'io.github.sinaweibosdk', + r'com.umeng.umsdk', ] } From b2eb189a3b95ec42a2f4ff3a5d5b78f1d3508085 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 22 Jun 2022 13:48:23 +0000 Subject: [PATCH 0699/2116] Apply 1 suggestion(s) to 1 file(s) --- fdroidserver/scanner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 78f4639e..27788435 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -91,6 +91,7 @@ NON_FREE_GRADLE_LINES = { r'me.pushy:sdk', r'io.github.sinaweibosdk', r'com.umeng.umsdk', + r'com.google.android.exoplayer:extension-cast', ] } From 832ed18fca9259295738d3446f0a5ad4888d31cf Mon Sep 17 00:00:00 2001 From: linsui Date: Tue, 9 Aug 2022 23:04:30 +0800 Subject: [PATCH 0700/2116] scanner: also scan classpath --- fdroidserver/scanner.py | 1 + tests/scanner.TestCase | 7 +- tests/source-files/OtakuWorld/build.gradle | 166 +++++++++++++++++++++ 3 files changed, 171 insertions(+), 3 deletions(-) create mode 100644 tests/source-files/OtakuWorld/build.gradle diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 27788435..c6cdf0cf 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -101,6 +101,7 @@ def get_gradle_compile_commands(build): 'provided', 'apk', 'implementation', + 'classpath', 'api', 'compileOnly', 'runtimeOnly'] diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 7f04bb18..ac27d0b3 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -55,6 +55,7 @@ class ScannerTest(unittest.TestCase): 'com.jens.automation2': 2, 'com.github.shadowsocks': 6, 'org.tasks': 1, + 'OtakuWorld': 2, } for d in glob.glob(os.path.join(source_files, '*')): build = fdroidserver.metadata.Build() @@ -66,15 +67,15 @@ class ScannerTest(unittest.TestCase): def test_get_gradle_compile_commands(self): test_files = [ - ('source-files/fdroid/fdroidclient/build.gradle', 'yes', 17), - ('source-files/com.nextcloud.client/build.gradle', 'generic', 24), + ('source-files/fdroid/fdroidclient/build.gradle', 'yes', 18), + ('source-files/com.nextcloud.client/build.gradle', 'generic', 28), ('source-files/com.kunzisoft.testcase/build.gradle', 'libre', 4), ('source-files/cn.wildfirechat.chat/chat/build.gradle', 'yes', 33), ('source-files/org.tasks/app/build.gradle.kts', 'generic', 39), ('source-files/at.bitfire.davdroid/build.gradle', 'standard', 16), ('source-files/se.manyver/android/app/build.gradle', 'indie', 29), ('source-files/osmandapp/osmand/build.gradle', 'free', 5), - ('source-files/eu.siacs.conversations/build.gradle', 'free', 23), + ('source-files/eu.siacs.conversations/build.gradle', 'free', 24), ('source-files/org.mozilla.rocket/app/build.gradle', 'focus', 42), ('source-files/com.jens.automation2/app/build.gradle', 'fdroidFlavor', 8), ] diff --git a/tests/source-files/OtakuWorld/build.gradle b/tests/source-files/OtakuWorld/build.gradle new file mode 100644 index 00000000..cfbc1450 --- /dev/null +++ b/tests/source-files/OtakuWorld/build.gradle @@ -0,0 +1,166 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + ext.kotlin_version = "1.6.21" + ext.latestAboutLibsRelease = "10.3.0" + + ext.coroutinesVersion = "1.6.2" + + ext.coroutinesCore = "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion" + ext.coroutinesAndroid = "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion" + ext.coroutinesRX = "org.jetbrains.kotlinx:kotlinx-coroutines-rx2:$coroutinesVersion" + + ext.gson = 'com.google.code.gson:gson:2.9.0' + + ext.glideVersion = "4.13.1" + ext.glide = "com.github.bumptech.glide:glide:$glideVersion" + ext.glideCompiler = "com.github.bumptech.glide:compiler:$glideVersion" + + ext.paging_version = "3.1.1" + + ext.rxkotlin = "io.reactivex.rxjava2:rxkotlin:2.4.0" + ext.rxandroid = "io.reactivex.rxjava2:rxandroid:2.1.1" + ext.rxbinding = 'com.jakewharton.rxbinding2:rxbinding:2.2.0' + ext.rxbindingKotlin = 'com.jakewharton.rxbinding2:rxbinding-kotlin:2.2.0' + + ext.androidCore = 'androidx.core:core-ktx:1.8.0' + ext.appCompat = 'androidx.appcompat:appcompat:1.4.2' + ext.material = 'com.google.android.material:material:1.6.0-beta01' + + ext.preference = "androidx.preference:preference-ktx:1.2.0" + + ext.recyclerview = 'androidx.recyclerview:recyclerview:1.2.1' + ext.constraintlayout = 'androidx.constraintlayout:constraintlayout:2.1.4' + ext.swiperefresh = 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' + + ext.jsoup = 'org.jsoup:jsoup:1.15.1' + + ext.crashlytics = 'com.google.firebase:firebase-crashlytics:18.2.8' + ext.analytics = 'com.google.firebase:firebase-analytics:20.1.0' + ext.play_services = 'com.google.android.gms:play-services-auth:20.1.0' + + ext.exoplayer_version = "2.16.1" + ext.room_version = "2.4.2" + + ext.nav_version = "2.4.2" + + def koin_version = "3.0.2" + + // Koin main features for Android (Scope,ViewModel ...) + ext.koinAndroid = "io.insert-koin:koin-android:$koin_version" + // Koin Android - experimental builder extensions + ext.koinAndroidExt = "io.insert-koin:koin-android-ext:$koin_version" + + ext.lottieVersion = "4.2.2" + + ext.coil = "2.1.0" + + ext.jetpack = "1.2.0-rc01" + + ext.accompanist = "0.24.11-rc" + + ext.composeUi = "androidx.compose.ui:ui:$jetpack" + // Tooling support (Previews, etc.) + ext.composeUiTooling = "androidx.compose.ui:ui-tooling:$jetpack" + // Foundation (Border, Background, Box, Image, Scroll, shapes, animations, etc.) + ext.composeFoundation = "androidx.compose.foundation:foundation:$jetpack" + // Material Design + ext.composeMaterial = "androidx.compose.material:material:$jetpack" + ext.materialYou = "androidx.compose.material3:material3:1.0.0-alpha13" + // Material design icons + ext.composeMaterialIconsCore = "androidx.compose.material:material-icons-core:$jetpack" + ext.composeMaterialIconsExtended = "androidx.compose.material:material-icons-extended:$jetpack" + // Integration with activities + ext.composeActivity = 'androidx.activity:activity-compose:1.4.0' + // Integration with ViewModels + ext.composeLifecycle = 'androidx.lifecycle:lifecycle-viewmodel-compose:2.4.1' + // Integration with observables + ext.composeRuntimeLivedata = "androidx.compose.runtime:runtime-livedata:$jetpack" + ext.composeRuntimeRxjava2 = "androidx.compose.runtime:runtime-rxjava2:$jetpack" + ext.composeMaterialThemeAdapter = "com.google.android.material:compose-theme-adapter:1.1.11" + ext.composeMaterial3ThemeAdapter = "com.google.android.material:compose-theme-adapter-3:1.0.11" + ext.landscapistGlide = "com.github.skydoves:landscapist-glide:1.5.2" + ext.composeConstraintLayout = "androidx.constraintlayout:constraintlayout-compose:1.0.1" + ext.composeAnimation = "androidx.compose.animation:animation:$jetpack" + ext.materialPlaceholder = "com.google.accompanist:accompanist-placeholder-material:$accompanist" + ext.drawablePainter = "com.google.accompanist:accompanist-drawablepainter:$accompanist" + ext.permissions = "com.google.accompanist:accompanist-permissions:$accompanist" + ext.uiUtil = "androidx.compose.ui:ui-util:$jetpack" + ext.coilCompose = "io.coil-kt:coil-compose:$coil" + ext.navCompose = "androidx.navigation:navigation-compose:$nav_version" + ext.navMaterial = "com.google.accompanist:accompanist-navigation-material:$accompanist" + ext.navAnimation = "com.google.accompanist:accompanist-navigation-animation:$accompanist" + + ext.swipeRefresh = "com.google.accompanist:accompanist-swiperefresh:$accompanist" + ext.systemUiController = "com.google.accompanist:accompanist-systemuicontroller:$accompanist" + + ext.inset = "com.google.accompanist:accompanist-insets:$accompanist" + // If using insets-ui + ext.insetUi = "com.google.accompanist:accompanist-insets-ui:$accompanist" + + ext.datastore = "androidx.datastore:datastore:1.0.0" + ext.datastorePref = "androidx.datastore:datastore-preferences:1.0.0" + + ext { + jakepurple13Tools = [ + helpfultools: [ + Deps.gsonutils, + Deps.helpfulutils, + Deps.loggingutils, + Deps.dragswipe, + Deps.funutils, + Deps.rxutils + ] + ] + room = [ + room: [ + "androidx.room:room-runtime:$room_version", + "androidx.room:room-ktx:$room_version", + "androidx.room:room-rxjava2:$room_version" + ] + ] + + koin = [koin: [koinAndroid, koinAndroidExt]] + + compose = [ + compose: [ + composeUi, composeUiTooling, composeFoundation, composeMaterial, + composeMaterialIconsCore, composeMaterialIconsExtended, + composeActivity, composeLifecycle, + composeRuntimeLivedata, composeRuntimeRxjava2, + composeMaterialThemeAdapter, composeMaterial3ThemeAdapter, + landscapistGlide, coilCompose, + composeConstraintLayout, permissions, + materialPlaceholder, drawablePainter, uiUtil, + materialYou, + inset, insetUi, + navCompose, navMaterial, navAnimation, + swipeRefresh, systemUiController + ] + ] + + firebaseCrash = [ crash: [crashlytics, analytics] ] + + datastore = [ datastore: [datastore, datastorePref] ] + } + + repositories { + google() + gradlePluginPortal() + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:7.1.2' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath 'com.google.gms:google-services:4.3.10' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1' + classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:10.3.0" + classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version" + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} From 7b7f863c65f127c382c7e013bd0e01d6495e7f32 Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Fri, 5 Aug 2022 19:34:28 +0200 Subject: [PATCH 0701/2116] [import] Rename to import_subcommand internally This enables normal import of the module without the need for workarounds. --- .gitlab-ci.yml | 3 +-- MANIFEST.in | 3 +-- fdroidserver/__main__.py | 4 ++- .../{import.py => import_subcommand.py} | 5 +--- tests/import_proxy.py | 27 ------------------- ...rt.TestCase => import_subcommand.TestCase} | 10 +++---- 6 files changed, 11 insertions(+), 41 deletions(-) rename fdroidserver/{import.py => import_subcommand.py} (98%) delete mode 100644 tests/import_proxy.py rename tests/{import.TestCase => import_subcommand.TestCase} (93%) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0d8a9f06..ed1998ee 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -254,8 +254,7 @@ black: tests/build.TestCase tests/deploy.TestCase tests/exception.TestCase - tests/import.TestCase - tests/import_proxy.py + tests/import_subcommand.TestCase tests/init.TestCase tests/install.TestCase tests/key-tricks.py diff --git a/MANIFEST.in b/MANIFEST.in index 2d330a4a..33266a64 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -567,8 +567,7 @@ include tests/gnupghome/secring.gpg include tests/gnupghome/trustdb.gpg include tests/gradle-maven-blocks.yaml include tests/gradle-release-checksums.py -include tests/import_proxy.py -include tests/import.TestCase +include tests/import_subcommand.TestCase include tests/index.TestCase include tests/init.TestCase include tests/install.TestCase diff --git a/fdroidserver/__main__.py b/fdroidserver/__main__.py index 037c33d5..e470099c 100755 --- a/fdroidserver/__main__.py +++ b/fdroidserver/__main__.py @@ -40,7 +40,7 @@ COMMANDS = OrderedDict([ ("deploy", _("Interact with the repo HTTP server")), ("verify", _("Verify the integrity of downloaded packages")), ("checkupdates", _("Check for updates to applications")), - ("import", _("Add a new application from its source code")), + ("import", _("Extract application metadata from a source repository")), ("install", _("Install built packages on devices")), ("readmeta", _("Read all the metadata files and exit")), ("rewritemeta", _("Rewrite all the metadata files")), @@ -197,6 +197,8 @@ def main(): del sys.argv[1] if command in COMMANDS.keys(): + # import is named import_subcommand internally b/c import is reserved by Python + command = 'import_subcommand' if command == 'import' else command mod = __import__('fdroidserver.' + command, None, None, [command]) else: mod = __import__(available_plugins[command]['name'], None, None, [command]) diff --git a/fdroidserver/import.py b/fdroidserver/import_subcommand.py similarity index 98% rename from fdroidserver/import.py rename to fdroidserver/import_subcommand.py index d524632b..63aefe15 100644 --- a/fdroidserver/import.py +++ b/fdroidserver/import_subcommand.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # -# import.py - part of the FDroid server tools +# import_subcommand.py - part of the FDroid server tools # Copyright (C) 2010-13, Ciaran Gultnieks, ciaran@ciarang.com # Copyright (C) 2013-2014 Daniel Martí # @@ -42,9 +42,6 @@ config = None options = None -# WARNING! This cannot be imported as a Python module, so reuseable functions need to go into common.py! - - def clone_to_tmp_dir(app): tmp_dir = Path('tmp') tmp_dir.mkdir(exist_ok=True) diff --git a/tests/import_proxy.py b/tests/import_proxy.py deleted file mode 100644 index 5a6dfced..00000000 --- a/tests/import_proxy.py +++ /dev/null @@ -1,27 +0,0 @@ -# workaround the syntax error from: import fdroidserver.import - -import inspect -import sys -from pathlib import Path - -localmodule = Path(__file__).resolve().parent.parent -print('localmodule: ' + str(localmodule)) -if localmodule not in sys.path: - sys.path.insert(0, str(localmodule)) - - -class Options: - def __init__(self): - self.rev = None - self.subdir = None - - -module = __import__('fdroidserver.import') -for name, obj in inspect.getmembers(module): - if name == 'import': - clone_to_tmp_dir = obj.clone_to_tmp_dir - obj.options = Options() - options = obj.options - break - -globals().update(vars(module)) diff --git a/tests/import.TestCase b/tests/import_subcommand.TestCase similarity index 93% rename from tests/import.TestCase rename to tests/import_subcommand.TestCase index 81aeac39..f4400e40 100755 --- a/tests/import.TestCase +++ b/tests/import_subcommand.TestCase @@ -15,15 +15,13 @@ from pathlib import Path import requests from testcommon import TmpCwd -# work around the syntax error from: import fdroidserver.import -import import_proxy - localmodule = Path(__file__).resolve().parent.parent print('localmodule: ' + str(localmodule)) if localmodule not in sys.path: sys.path.insert(0, str(localmodule)) import fdroidserver.common +import fdroidserver.import_subcommand import fdroidserver.metadata @@ -37,6 +35,8 @@ class ImportTest(unittest.TestCase): self.tmpdir.mkdir(exist_ok=True) # TODO: Python3.6: Accepts a path-like object. os.chdir(str(self.basedir)) + fdroidserver.import_subcommand.options = mock.Mock() + fdroidserver.import_subcommand.options.rev = None def test_import_gitlab(self): # FDroidPopen needs some config to work @@ -52,7 +52,7 @@ class ImportTest(unittest.TestCase): return app = fdroidserver.common.get_app_from_url(url) - import_proxy.clone_to_tmp_dir(app) + fdroidserver.import_subcommand.clone_to_tmp_dir(app) self.assertEqual(app.RepoType, 'git') self.assertEqual(app.Repo, 'https://gitlab.com/fdroid/ci-test-app.git') @@ -103,7 +103,7 @@ class ImportTest(unittest.TestCase): ), mock.patch( 'shutil.rmtree', lambda a, onerror=None: None ): - build_dir = import_proxy.clone_to_tmp_dir(app) + build_dir = fdroidserver.import_subcommand.clone_to_tmp_dir(app) self.assertEqual('git', app.RepoType) self.assertEqual(url, app.Repo) self.assertEqual(url, app.SourceCode) From 7c89e923f63061279d707d7679df3a4e46d645f8 Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Sat, 6 Aug 2022 10:21:12 +0200 Subject: [PATCH 0702/2116] Move methods specific to import to it's module --- fdroidserver/common.py | 124 ---------------------------- fdroidserver/import_subcommand.py | 131 +++++++++++++++++++++++++++++- tests/common.TestCase | 13 --- tests/import_subcommand.TestCase | 19 ++++- 4 files changed, 145 insertions(+), 142 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index b4217f94..1eaa2e2f 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -45,8 +45,6 @@ import logging import hashlib import socket import base64 -import urllib.parse -import urllib.request import yaml import zipfile import tempfile @@ -1944,121 +1942,6 @@ def get_gradle_subdir(build_dir, paths): return -def getrepofrompage(url): - """Get the repo type and address from the given web page. - - The page is scanned in a rather naive manner for 'git clone xxxx', - 'hg clone xxxx', etc, and when one of these is found it's assumed - that's the information we want. Returns repotype, address, or - None, reason - - """ - if not url.startswith('http'): - return (None, _('{url} does not start with "http"!'.format(url=url))) - req = urllib.request.urlopen(url) # nosec B310 non-http URLs are filtered out - if req.getcode() != 200: - return (None, 'Unable to get ' + url + ' - return code ' + str(req.getcode())) - page = req.read().decode(req.headers.get_content_charset()) - - # Works for BitBucket - m = re.search('data-fetch-url="(.*)"', page) - if m is not None: - repo = m.group(1) - - if repo.endswith('.git'): - return ('git', repo) - - return ('hg', repo) - - # Works for BitBucket (obsolete) - index = page.find('hg clone') - if index != -1: - repotype = 'hg' - repo = page[index + 9:] - index = repo.find('<') - if index == -1: - return (None, _("Error while getting repo address")) - repo = repo[:index] - repo = repo.split('"')[0] - return (repotype, repo) - - # Works for BitBucket (obsolete) - index = page.find('git clone') - if index != -1: - repotype = 'git' - repo = page[index + 10:] - index = repo.find('<') - if index == -1: - return (None, _("Error while getting repo address")) - repo = repo[:index] - repo = repo.split('"')[0] - return (repotype, repo) - - return (None, _("No information found.") + page) - - -def get_app_from_url(url): - """Guess basic app metadata from the URL. - - The URL must include a network hostname, unless it is an lp:, - file:, or git/ssh URL. This throws ValueError on bad URLs to - match urlparse(). - - """ - parsed = urllib.parse.urlparse(url) - invalid_url = False - if not parsed.scheme or not parsed.path: - invalid_url = True - - app = fdroidserver.metadata.App() - app.Repo = url - if url.startswith('git://') or url.startswith('git@'): - app.RepoType = 'git' - elif parsed.netloc == 'github.com': - app.RepoType = 'git' - app.SourceCode = url - app.IssueTracker = url + '/issues' - elif parsed.netloc == 'gitlab.com' or parsed.netloc == 'framagit.org': - # git can be fussy with gitlab URLs unless they end in .git - if url.endswith('.git'): - url = url[:-4] - app.Repo = url + '.git' - app.RepoType = 'git' - app.SourceCode = url - app.IssueTracker = url + '/issues' - elif parsed.netloc == 'notabug.org': - if url.endswith('.git'): - url = url[:-4] - app.Repo = url + '.git' - app.RepoType = 'git' - app.SourceCode = url - app.IssueTracker = url + '/issues' - elif parsed.netloc == 'bitbucket.org': - if url.endswith('/'): - url = url[:-1] - app.SourceCode = url + '/src' - app.IssueTracker = url + '/issues' - # Figure out the repo type and adddress... - app.RepoType, app.Repo = getrepofrompage(url) - elif parsed.netloc == 'codeberg.org': - app.RepoType = 'git' - app.SourceCode = url - app.IssueTracker = url + '/issues' - elif url.startswith('https://') and url.endswith('.git'): - app.RepoType = 'git' - - if not parsed.netloc and parsed.scheme in ('git', 'http', 'https', 'ssh'): - invalid_url = True - - if invalid_url: - raise ValueError(_('"{url}" is not a valid URL!'.format(url=url))) - - if not app.RepoType: - raise FDroidException("Unable to determine vcs type. " + app.Repo) - - return app - - def parse_srclib_spec(spec): if type(spec) != str: @@ -4609,10 +4492,3 @@ NDKS = [ "url": "https://dl.google.com/android/repository/android-ndk-r25b-linux.zip" } ] - - -def handle_retree_error_on_windows(function, path, excinfo): - """Python can't remove a readonly file on Windows so chmod first.""" - if function in (os.unlink, os.rmdir, os.remove) and excinfo[0] == PermissionError: - os.chmod(path, stat.S_IWRITE) - function(path) diff --git a/fdroidserver/import_subcommand.py b/fdroidserver/import_subcommand.py index 63aefe15..e32a9f90 100644 --- a/fdroidserver/import_subcommand.py +++ b/fdroidserver/import_subcommand.py @@ -18,6 +18,11 @@ # along with this program. If not, see . import configparser +import os +import re +import stat +import urllib + import git import json import shutil @@ -42,6 +47,13 @@ config = None options = None +def handle_retree_error_on_windows(function, path, excinfo): + """Python can't remove a readonly file on Windows so chmod first.""" + if function in (os.unlink, os.rmdir, os.remove) and excinfo[0] == PermissionError: + os.chmod(path, stat.S_IWRITE) + function(path) + + def clone_to_tmp_dir(app): tmp_dir = Path('tmp') tmp_dir.mkdir(exist_ok=True) @@ -49,13 +61,128 @@ def clone_to_tmp_dir(app): tmp_dir = tmp_dir / 'importer' if tmp_dir.exists(): - shutil.rmtree(str(tmp_dir), onerror=common.handle_retree_error_on_windows) + shutil.rmtree(str(tmp_dir), onerror=handle_retree_error_on_windows) vcs = common.getvcs(app.RepoType, app.Repo, tmp_dir) vcs.gotorevision(options.rev) return tmp_dir +def getrepofrompage(url): + """Get the repo type and address from the given web page. + + The page is scanned in a rather naive manner for 'git clone xxxx', + 'hg clone xxxx', etc, and when one of these is found it's assumed + that's the information we want. Returns repotype, address, or + None, reason + + """ + if not url.startswith('http'): + return (None, _('{url} does not start with "http"!'.format(url=url))) + req = urllib.request.urlopen(url) # nosec B310 non-http URLs are filtered out + if req.getcode() != 200: + return (None, 'Unable to get ' + url + ' - return code ' + str(req.getcode())) + page = req.read().decode(req.headers.get_content_charset()) + + # Works for BitBucket + m = re.search('data-fetch-url="(.*)"', page) + if m is not None: + repo = m.group(1) + + if repo.endswith('.git'): + return ('git', repo) + + return ('hg', repo) + + # Works for BitBucket (obsolete) + index = page.find('hg clone') + if index != -1: + repotype = 'hg' + repo = page[index + 9:] + index = repo.find('<') + if index == -1: + return (None, _("Error while getting repo address")) + repo = repo[:index] + repo = repo.split('"')[0] + return (repotype, repo) + + # Works for BitBucket (obsolete) + index = page.find('git clone') + if index != -1: + repotype = 'git' + repo = page[index + 10:] + index = repo.find('<') + if index == -1: + return (None, _("Error while getting repo address")) + repo = repo[:index] + repo = repo.split('"')[0] + return (repotype, repo) + + return (None, _("No information found.") + page) + + +def get_app_from_url(url): + """Guess basic app metadata from the URL. + + The URL must include a network hostname, unless it is an lp:, + file:, or git/ssh URL. This throws ValueError on bad URLs to + match urlparse(). + + """ + parsed = urllib.parse.urlparse(url) + invalid_url = False + if not parsed.scheme or not parsed.path: + invalid_url = True + + app = metadata.App() + app.Repo = url + if url.startswith('git://') or url.startswith('git@'): + app.RepoType = 'git' + elif parsed.netloc == 'github.com': + app.RepoType = 'git' + app.SourceCode = url + app.IssueTracker = url + '/issues' + elif parsed.netloc == 'gitlab.com' or parsed.netloc == 'framagit.org': + # git can be fussy with gitlab URLs unless they end in .git + if url.endswith('.git'): + url = url[:-4] + app.Repo = url + '.git' + app.RepoType = 'git' + app.SourceCode = url + app.IssueTracker = url + '/issues' + elif parsed.netloc == 'notabug.org': + if url.endswith('.git'): + url = url[:-4] + app.Repo = url + '.git' + app.RepoType = 'git' + app.SourceCode = url + app.IssueTracker = url + '/issues' + elif parsed.netloc == 'bitbucket.org': + if url.endswith('/'): + url = url[:-1] + app.SourceCode = url + '/src' + app.IssueTracker = url + '/issues' + # Figure out the repo type and adddress... + app.RepoType, app.Repo = getrepofrompage(url) + elif parsed.netloc == 'codeberg.org': + app.RepoType = 'git' + app.SourceCode = url + app.IssueTracker = url + '/issues' + elif url.startswith('https://') and url.endswith('.git'): + app.RepoType = 'git' + + if not parsed.netloc and parsed.scheme in ('git', 'http', 'https', 'ssh'): + invalid_url = True + + if invalid_url: + raise ValueError(_('"{url}" is not a valid URL!'.format(url=url))) + + if not app.RepoType: + raise FDroidException("Unable to determine vcs type. " + app.Repo) + + return app + + def check_for_kivy_buildozer(tmp_importer_dir, app, build): versionCode = None buildozer_spec = tmp_importer_dir / 'buildozer.spec' @@ -148,7 +275,7 @@ def main(): break write_local_file = True elif options.url: - app = common.get_app_from_url(options.url) + app = get_app_from_url(options.url) tmp_importer_dir = clone_to_tmp_dir(app) # TODO: Python3.6: Should accept path-like git_repo = git.Repo(str(tmp_importer_dir)) diff --git a/tests/common.TestCase b/tests/common.TestCase index e80ecd35..549167fc 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1419,19 +1419,6 @@ class CommonTest(unittest.TestCase): with self.assertRaises(MetaDataException): self.assertEqual(fdroidserver.common.parse_srclib_spec('@multi@at-signs@')) - def test_bad_urls(self): - for url in ( - 'asdf', - 'file://thing.git', - 'https:///github.com/my/project', - 'git:///so/many/slashes', - 'ssh:/notabug.org/missing/a/slash', - 'git:notabug.org/missing/some/slashes', - 'https//github.com/bar/baz', - ): - with self.assertRaises(ValueError): - fdroidserver.common.get_app_from_url(url) - def test_remove_signing_keys(self): testdir = tempfile.mkdtemp( prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir diff --git a/tests/import_subcommand.TestCase b/tests/import_subcommand.TestCase index f4400e40..8c2d7792 100755 --- a/tests/import_subcommand.TestCase +++ b/tests/import_subcommand.TestCase @@ -51,7 +51,7 @@ class ImportTest(unittest.TestCase): print('Skipping ImportTest!') return - app = fdroidserver.common.get_app_from_url(url) + app = fdroidserver.import_subcommand.get_app_from_url(url) fdroidserver.import_subcommand.clone_to_tmp_dir(app) self.assertEqual(app.RepoType, 'git') self.assertEqual(app.Repo, 'https://gitlab.com/fdroid/ci-test-app.git') @@ -88,13 +88,13 @@ class ImportTest(unittest.TestCase): # TODO: Python3.6: Accepts a path-like object. shutil.rmtree( str(tmp_importer), - onerror=fdroidserver.common.handle_retree_error_on_windows, + onerror=fdroidserver.import_subcommand.handle_retree_error_on_windows, ) shutil.copytree( str(self.basedir / 'source-files' / appid), str(tmp_importer) ) - app = fdroidserver.common.get_app_from_url(url) + app = fdroidserver.import_subcommand.get_app_from_url(url) with mock.patch( 'fdroidserver.common.getvcs', lambda a, b, c: fdroidserver.common.vcs(url, testdir), @@ -119,6 +119,19 @@ class ImportTest(unittest.TestCase): self.assertEqual(vc, versionCode) self.assertEqual(appid, package) + def test_bad_urls(self): + for url in ( + 'asdf', + 'file://thing.git', + 'https:///github.com/my/project', + 'git:///so/many/slashes', + 'ssh:/notabug.org/missing/a/slash', + 'git:notabug.org/missing/some/slashes', + 'https//github.com/bar/baz', + ): + with self.assertRaises(ValueError): + fdroidserver.import_subcommand.get_app_from_url(url) + if __name__ == "__main__": parser = optparse.OptionParser() From 153f136e79dea2da95698b3e72eb015db3dc67d4 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sat, 20 Aug 2022 19:52:57 +0200 Subject: [PATCH 0703/2116] Also write status.json when command finished --- fdroidserver/common.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 1eaa2e2f..e9056634 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -900,13 +900,17 @@ def write_status_json(output, pretty=False, name=None): os.makedirs(status_dir) if not name: output['endTimestamp'] = int(datetime.now(timezone.utc).timestamp() * 1000) - name = sys.argv[0].split()[1] # fdroid subcommand - path = os.path.join(status_dir, name + '.json') - with open(path, 'w') as fp: - if pretty: - json.dump(output, fp, sort_keys=True, cls=Encoder, indent=2) - else: - json.dump(output, fp, sort_keys=True, cls=Encoder, separators=(',', ':')) + names = ['running', sys.argv[0].split()[1]] # fdroid subcommand + else: + names = [name] + + for fname in names: + path = os.path.join(status_dir, fname + '.json') + with open(path, "w", encoding="utf-8") as fp: + if pretty: + json.dump(output, fp, sort_keys=True, cls=Encoder, indent=2) + else: + json.dump(output, fp, sort_keys=True, cls=Encoder, separators=(',', ':')) rsync_status_file_to_repo(path, repo_subdir='status') From b352e9a9ccc0e6823d202924f0125836142fdc89 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 25 Aug 2022 11:09:27 +0200 Subject: [PATCH 0704/2116] gitlab-ci: fix Windows job after import rename !1142 --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ed1998ee..22623e4c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -530,7 +530,7 @@ Windows: # these are the tests that must pass - python tests\checkupdates.TestCase - python tests\exception.TestCase - - python tests\import.TestCase + - python tests\import_subcommand.TestCase - python tests\init.TestCase - python tests\lint.TestCase - python tests\main.TestCase From c6cf0468ede269d52b95c70a854d6987cb13c577 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 26 Aug 2022 07:18:19 +0000 Subject: [PATCH 0705/2116] nightly: update Raw URLs to fix breakage and avoid redirects --- fdroidserver/nightly.py | 21 ++++++++++++---- tests/nightly.TestCase | 56 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 5 deletions(-) create mode 100755 tests/nightly.TestCase diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index b2ca69f2..4d0d80ad 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -131,6 +131,17 @@ def _ssh_key_from_debug_keystore(keystore=KEYSTORE_FILE): return ssh_private_key_file +def get_repo_base_url(clone_url, repo_git_base, force_type=None): + if force_type is None: + force_type = urlparse(clone_url).netloc + if force_type == 'gitlab.com': + return clone_url + '/-/raw/master/fdroid' + if force_type == 'github.com': + return 'https://raw.githubusercontent.com/%s/master/fdroid' % repo_git_base + print(_('ERROR: unsupported git host "%s", patches welcome!') % force_type) + sys.exit(1) + + def main(): parser = ArgumentParser() @@ -200,11 +211,12 @@ def main(): cibase = os.getcwd() os.makedirs(repodir, exist_ok=True) + # the 'master' branch is hardcoded in fdroidserver/deploy.py if 'CI_PROJECT_PATH' in os.environ and 'CI_PROJECT_URL' in os.environ: # we are in GitLab CI repo_git_base = os.getenv('CI_PROJECT_PATH') + NIGHTLY clone_url = os.getenv('CI_PROJECT_URL') + NIGHTLY - repo_base = clone_url + '/raw/master/fdroid' + repo_base = get_repo_base_url(clone_url, repo_git_base, force_type='gitlab.com') servergitmirror = 'git@' + urlparse(clone_url).netloc + ':' + repo_git_base deploy_key_url = clone_url + '/-/settings/repository#js-deploy-keys-settings' git_user_name = os.getenv('GITLAB_USER_NAME') @@ -213,8 +225,7 @@ def main(): # we are in Travis CI repo_git_base = os.getenv('TRAVIS_REPO_SLUG') + NIGHTLY clone_url = 'https://github.com/' + repo_git_base - _branch = os.getenv('TRAVIS_BRANCH') - repo_base = 'https://raw.githubusercontent.com/' + repo_git_base + '/' + _branch + '/fdroid' + repo_base = get_repo_base_url(clone_url, repo_git_base, force_type='github.com') servergitmirror = 'git@github.com:' + repo_git_base deploy_key_url = ('https://github.com/' + repo_git_base + '/settings/keys' + '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys') @@ -229,7 +240,7 @@ def main(): repo_git_base = (os.getenv('CIRCLE_PROJECT_USERNAME') + '/' + os.getenv('CIRCLE_PROJECT_REPONAME') + NIGHTLY) clone_url = os.getenv('CIRCLE_REPOSITORY_URL') + NIGHTLY - repo_base = clone_url + '/raw/master/fdroid' + repo_base = get_repo_base_url(clone_url, repo_git_base, force_type='github.com') servergitmirror = 'git@' + urlparse(clone_url).netloc + ':' + repo_git_base deploy_key_url = ('https://github.com/' + repo_git_base + '/settings/keys' + '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys') @@ -239,7 +250,7 @@ def main(): # we are in Github actions repo_git_base = (os.getenv('GITHUB_REPOSITORY') + NIGHTLY) clone_url = (os.getenv('GITHUB_SERVER_URL') + '/' + repo_git_base) - repo_base = clone_url + '/raw/master/fdroid' + repo_base = get_repo_base_url(clone_url, repo_git_base, force_type='github.com') servergitmirror = 'git@' + urlparse(clone_url).netloc + ':' + repo_git_base deploy_key_url = ('https://github.com/' + repo_git_base + '/settings/keys' + '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys') diff --git a/tests/nightly.TestCase b/tests/nightly.TestCase new file mode 100755 index 00000000..afe34752 --- /dev/null +++ b/tests/nightly.TestCase @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 + +import inspect +import optparse +import os +import requests +import sys +import unittest + +localmodule = os.path.realpath( + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) +print('localmodule: ' + localmodule) +if localmodule not in sys.path: + sys.path.insert(0, localmodule) + +from fdroidserver import common, nightly + + +class NightlyTest(unittest.TestCase): + def test_get_repo_base_url(self): + for clone_url, repo_git_base, result in [ + ( + 'https://github.com/onionshare/onionshare-android-nightly', + 'onionshare/onionshare-android-nightly', + 'https://raw.githubusercontent.com/onionshare/onionshare-android-nightly/master/fdroid', + ), + ( + 'https://gitlab.com/fdroid/fdroidclient-nightly', + 'fdroid/fdroidclient-nightly', + 'https://gitlab.com/fdroid/fdroidclient-nightly/-/raw/master/fdroid', + ), + ]: + url = nightly.get_repo_base_url(clone_url, repo_git_base) + self.assertEqual(result, url) + r = requests.head(os.path.join(url, 'repo/index-v1.jar')) + # gitlab.com often returns 403 Forbidden from their cloudflare restrictions + self.assertTrue(r.status_code in (200, 403), 'should not be a redirect') + + +if __name__ == "__main__": + os.chdir(os.path.dirname(__file__)) + + parser = optparse.OptionParser() + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) + (common.options, args) = parser.parse_args(['--verbose']) + + newSuite = unittest.TestSuite() + newSuite.addTest(unittest.makeSuite(NightlyTest)) + unittest.main(failfast=False) From cf0100cf1155b7544a87613d8ba2f335489d264e Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 5 Sep 2022 17:14:51 +0200 Subject: [PATCH 0706/2116] Merge comparisons with 'in' --- fdroidserver/checkupdates.py | 2 +- fdroidserver/common.py | 2 +- fdroidserver/import_subcommand.py | 2 +- fdroidserver/init.py | 2 +- fdroidserver/update.py | 26 ++++++++++++++------------ makebuildserver | 2 +- 6 files changed, 19 insertions(+), 17 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 35466193..aeda879f 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -191,7 +191,7 @@ def check_tags(app, pattern): root_dir = build_dir / subdir paths = common.manifest_paths(root_dir, last_build.gradle) version, vercode, _package = common.parse_androidmanifests(paths, app) - if version == 'Unknown' or version == 'Ignore': + if version in ('Unknown', 'Ignore'): version = tag if vercode: logging.debug("Manifest exists in subdir '{0}'. Found version {1} ({2})" diff --git a/fdroidserver/common.py b/fdroidserver/common.py index e9056634..17b939d3 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2616,7 +2616,7 @@ def get_apk_id_androguard(apkfile): if axml.getName() == 'manifest': break - elif _type == END_TAG or _type == TEXT or _type == END_DOCUMENT: + elif _type in (END_TAG, TEXT, END_DOCUMENT): raise RuntimeError('{path}: must be the first element in AndroidManifest.xml' .format(path=apkfile)) diff --git a/fdroidserver/import_subcommand.py b/fdroidserver/import_subcommand.py index e32a9f90..ec3b0036 100644 --- a/fdroidserver/import_subcommand.py +++ b/fdroidserver/import_subcommand.py @@ -142,7 +142,7 @@ def get_app_from_url(url): app.RepoType = 'git' app.SourceCode = url app.IssueTracker = url + '/issues' - elif parsed.netloc == 'gitlab.com' or parsed.netloc == 'framagit.org': + elif parsed.netloc in ('gitlab.com', 'framagit.org'): # git can be fussy with gitlab URLs unless they end in .git if url.endswith('.git'): url = url[:-4] diff --git a/fdroidserver/init.py b/fdroidserver/init.py index c429f096..1fbba382 100644 --- a/fdroidserver/init.py +++ b/fdroidserver/init.py @@ -98,7 +98,7 @@ def main(): # exist, prompt the user using platform-specific default # and if the user leaves it blank, ignore and move on. default_sdk_path = '' - if sys.platform == 'win32' or sys.platform == 'cygwin': + if sys.platform in ('win32', 'cygwin'): p = os.path.join( os.getenv('USERPROFILE'), 'AppData', 'Local', 'Android', 'android-sdk' ) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index fe3a0874..11aa801e 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -108,7 +108,7 @@ def px_to_dpi(px): def get_icon_dir(repodir, density): - if density == '0' or density == '65534': + if density in ('0', '65534'): return os.path.join(repodir, "icons") else: return os.path.join(repodir, "icons-%s" % density) @@ -647,7 +647,7 @@ def _strip_and_copy_image(in_file, outpath): except Exception as e: logging.error(_("Failed copying {path}: {error}".format(path=in_file, error=e))) return - elif extension == 'jpg' or extension == 'jpeg': + elif extension in ('jpg', 'jpeg'): try: with open(in_file, 'rb') as fp: in_image = Image.open(fp) @@ -866,16 +866,16 @@ def copy_triple_t_store_metadata(apps): locale = segments[-2] for f in files: - if f == 'fulldescription' or f == 'full-description.txt': + if f in ('fulldescription', 'full-description.txt'): _set_localized_text_entry(app, locale, 'description', os.path.join(root, f)) - elif f == 'shortdescription' or f == 'short-description.txt': + elif f in ('shortdescription', 'short-description.txt'): _set_localized_text_entry(app, locale, 'summary', os.path.join(root, f)) - elif f == 'title' or f == 'title.txt': + elif f in ('title', 'title.txt'): _set_localized_text_entry(app, locale, 'name', os.path.join(root, f)) - elif f == 'video' or f == 'video-url.txt': + elif f in ('video', 'video-url.txt'): _set_localized_text_entry(app, locale, 'video', os.path.join(root, f)) elif f == 'whatsnew': @@ -884,11 +884,11 @@ def copy_triple_t_store_metadata(apps): elif f == 'default.txt' and segments[-2] == 'release-notes': _set_localized_text_entry(app, locale, 'whatsNew', os.path.join(root, f)) - elif f == 'contactEmail' or f == 'contact-email.txt': + elif f in ('contactEmail', 'contact-email.txt'): _set_author_entry(app, 'authorEmail', os.path.join(root, f)) - elif f == 'contactPhone' or f == 'contact-phone.txt': + elif f in ('contactPhone', 'contact-phone.txt'): _set_author_entry(app, 'authorPhone', os.path.join(root, f)) - elif f == 'contactWebsite' or f == 'contact-website.txt': + elif f in ('contactWebsite', 'contact-website.txt'): _set_author_entry(app, 'authorWebSite', os.path.join(root, f)) else: base, extension = common.get_extension(f) @@ -1113,7 +1113,7 @@ def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False): repodir = repodir.encode() for name in os.listdir(repodir): file_extension = common.get_file_extension(name) - if file_extension == 'apk' or file_extension == 'obb': + if file_extension in ('apk', 'obb'): continue filename = os.path.join(repodir, name) name_utf8 = name.decode() @@ -1405,8 +1405,10 @@ def scan_apk_androguard(apk, apkfile): if key not in item.attrib: continue feature = str(item.attrib[key]) - if feature != "android.hardware.screen.portrait" \ - and feature != "android.hardware.screen.landscape": + if feature not in ( + 'android.hardware.screen.portrait', + 'android.hardware.screen.landscape', + ): if feature.startswith("android.feature."): feature = feature[16:] required = item.attrib.get(xmlns + 'required') diff --git a/makebuildserver b/makebuildserver index 428dec50..cb4d1b92 100755 --- a/makebuildserver +++ b/makebuildserver @@ -616,7 +616,7 @@ if __name__ == '__main__': virt = subprocess.check_output('/usr/bin/systemd-detect-virt').strip().decode('utf-8') except subprocess.CalledProcessError: virt = 'none' - if virt == 'qemu' or virt == 'kvm' or virt == 'bochs': + if virt in ('qemu', 'kvm', 'bochs'): logging.info('Running in a VM guest, defaulting to QEMU/KVM via libvirt') config['vm_provider'] = 'libvirt' elif virt != 'none': From c89a9f0e8b4def0f8e77cbcba88ea515ff98a4fd Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 5 Sep 2022 17:15:15 +0200 Subject: [PATCH 0707/2116] Add timeout argument to requests.(get,post) --- fdroidserver/common.py | 2 +- fdroidserver/deploy.py | 10 +++++----- fdroidserver/net.py | 4 +++- fdroidserver/scanner.py | 2 +- tests/gradle-release-checksums.py | 5 ++++- tests/import_subcommand.TestCase | 2 +- tests/ndk-release-checksums.py | 3 ++- tests/net.TestCase | 2 +- tests/nightly.TestCase | 2 +- tests/openssl-version-check-test.py | 2 +- tests/scanner.TestCase | 4 +++- 11 files changed, 23 insertions(+), 15 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 17b939d3..035ee506 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1331,7 +1331,7 @@ class vcs_gitsvn(vcs): # git-svn sucks at certificate validation, this throws useful errors: try: import requests - r = requests.head(remote) + r = requests.head(remote, timeout=300) r.raise_for_status() except Exception as e: raise VCSException('SVN certificate pre-validation failed: ' + str(e)) from e diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 953c6f71..cecf8c65 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -506,7 +506,7 @@ def upload_apk_to_android_observatory(path): apkfilename = os.path.basename(path) r = requests.post('https://androidobservatory.org/', data={'q': update.sha256sum(path), 'searchby': 'hash'}, - headers=net.HEADERS) + headers=net.HEADERS, timeout=300) if r.status_code == 200: # from now on XPath will be used to retrieve the message in the HTML # androidobservatory doesn't have a nice API to talk with @@ -534,7 +534,7 @@ def upload_apk_to_android_observatory(path): r = requests.post('https://androidobservatory.org/upload', files={'apk': (apkfilename, open(path, 'rb'))}, headers=net.HEADERS, - allow_redirects=False) + allow_redirects=False, timeout=300) def upload_to_virustotal(repo_section, virustotal_apikey): @@ -586,7 +586,7 @@ def upload_apk_to_virustotal(virustotal_apikey, packageName, apkName, hash, needs_file_upload = False while True: r = requests.get('https://www.virustotal.com/vtapi/v2/file/report?' - + urllib.parse.urlencode(data), headers=headers) + + urllib.parse.urlencode(data), headers=headers, timeout=300) if r.status_code == 200: response = r.json() if response['response_code'] == 0: @@ -620,7 +620,7 @@ def upload_apk_to_virustotal(virustotal_apikey, packageName, apkName, hash, elif size > 32000000: # VirusTotal API requires fetching a URL to upload bigger files r = requests.get('https://www.virustotal.com/vtapi/v2/file/scan/upload_url?' - + urllib.parse.urlencode(data), headers=headers) + + urllib.parse.urlencode(data), headers=headers, timeout=300) if r.status_code == 200: upload_url = r.json().get('upload_url') elif r.status_code == 403: @@ -638,7 +638,7 @@ def upload_apk_to_virustotal(virustotal_apikey, packageName, apkName, hash, files = { 'file': (apkName, open(repofilename, 'rb')) } - r = requests.post(upload_url, data=data, headers=headers, files=files) + r = requests.post(upload_url, data=data, headers=headers, files=files, timeout=300) logging.debug(_('If this upload fails, try manually uploading to {url}') .format(url=manual_url)) r.raise_for_status() diff --git a/fdroidserver/net.py b/fdroidserver/net.py index da88df29..688eda68 100644 --- a/fdroidserver/net.py +++ b/fdroidserver/net.py @@ -28,7 +28,9 @@ def download_file(url, local_filename=None, dldir='tmp'): if local_filename is None: local_filename = os.path.join(dldir, filename) # the stream=True parameter keeps memory usage low - r = requests.get(url, stream=True, allow_redirects=True, headers=HEADERS) + r = requests.get( + url, stream=True, allow_redirects=True, headers=HEADERS, timeout=300 + ) r.raise_for_status() with open(local_filename, 'wb') as f: for chunk in r.iter_content(chunk_size=1024): diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index c6cdf0cf..d4f14c05 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -174,7 +174,7 @@ def load_exodus_trackers_signatures(): """ signatures = [] exodus_url = "https://reports.exodus-privacy.eu.org/api/trackers" - r = requests.get(exodus_url) + r = requests.get(exodus_url, timeout=300) data = r.json() for e in data['trackers']: signatures.append( diff --git a/tests/gradle-release-checksums.py b/tests/gradle-release-checksums.py index 1fca803c..38784052 100755 --- a/tests/gradle-release-checksums.py +++ b/tests/gradle-release-checksums.py @@ -14,7 +14,10 @@ checksums = None versions = dict() while not checksums: - r = requests.get('https://gitlab.com/fdroid/gradle-transparency-log/-/raw/master/checksums.json') + r = requests.get( + 'https://gitlab.com/fdroid/gradle-transparency-log/-/raw/master/checksums.json', + timeout=300, + ) if r.status_code == 200: checksums = r.json() diff --git a/tests/import_subcommand.TestCase b/tests/import_subcommand.TestCase index 8c2d7792..8b871ee3 100755 --- a/tests/import_subcommand.TestCase +++ b/tests/import_subcommand.TestCase @@ -45,7 +45,7 @@ class ImportTest(unittest.TestCase): fdroidserver.common.config = config url = 'https://gitlab.com/fdroid/ci-test-app' - r = requests.head(url) + r = requests.head(url, timeout=300) if r.status_code != 200: print("ERROR", url, 'unreachable (', r.status_code, ')') print('Skipping ImportTest!') diff --git a/tests/ndk-release-checksums.py b/tests/ndk-release-checksums.py index b948abf0..2f39bc68 100755 --- a/tests/ndk-release-checksums.py +++ b/tests/ndk-release-checksums.py @@ -15,7 +15,8 @@ versions = dict() while not checksums: r = requests.get( - 'https://gitlab.com/fdroid/android-sdk-transparency-log/-/raw/master/checksums.json' + 'https://gitlab.com/fdroid/android-sdk-transparency-log/-/raw/master/checksums.json', + timeout=300, ) if r.status_code == 200: checksums = r.json() diff --git a/tests/net.TestCase b/tests/net.TestCase index 3f2d51a1..e5ea6b24 100755 --- a/tests/net.TestCase +++ b/tests/net.TestCase @@ -35,7 +35,7 @@ class NetTest(unittest.TestCase): @patch('requests.get') def test_download_file_url_parsing(self, requests_get): - def _get(url, stream, allow_redirects, headers): # pylint: disable=W0613 + def _get(url, stream, allow_redirects, headers, timeout): # pylint: disable=W0613 return MagicMock() requests_get.side_effect = _get diff --git a/tests/nightly.TestCase b/tests/nightly.TestCase index afe34752..cf3ccf8b 100755 --- a/tests/nightly.TestCase +++ b/tests/nightly.TestCase @@ -33,7 +33,7 @@ class NightlyTest(unittest.TestCase): ]: url = nightly.get_repo_base_url(clone_url, repo_git_base) self.assertEqual(result, url) - r = requests.head(os.path.join(url, 'repo/index-v1.jar')) + r = requests.head(os.path.join(url, 'repo/index-v1.jar'), timeout=300) # gitlab.com often returns 403 Forbidden from their cloudflare restrictions self.assertTrue(r.status_code in (200, 403), 'should not be a redirect') diff --git a/tests/openssl-version-check-test.py b/tests/openssl-version-check-test.py index 69d4d1ce..d4022126 100755 --- a/tests/openssl-version-check-test.py +++ b/tests/openssl-version-check-test.py @@ -13,7 +13,7 @@ import requests versions = [ ] -r = requests.get('https://www.openssl.org/news/changelog.html') +r = requests.get('https://www.openssl.org/news/changelog.html', timeout=300) safe = set() bad = set() diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index ac27d0b3..9455f6cd 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -428,7 +428,9 @@ class Test_load_exodus_trackers_signatures(unittest.TestCase): "fdroidserver.scanner._exodus_compile_signatures", self.compilesig_func ): result_sigs, result_regex = fdroidserver.scanner.load_exodus_trackers_signatures() - self.requests_func.assert_called_once_with("https://reports.exodus-privacy.eu.org/api/trackers") + self.requests_func.assert_called_once_with( + "https://reports.exodus-privacy.eu.org/api/trackers", timeout=300 + ) self.assertEqual(len(result_sigs), 2) self.assertListEqual([1, 2], sorted([x.id for x in result_sigs])) From 5b79e7aea8b10e28bcaa9d72a4fa2be2dc7d6dba Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 5 Sep 2022 17:15:42 +0200 Subject: [PATCH 0708/2116] Fix trailing whitespace --- tests/extra/manual-vmtools-test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/extra/manual-vmtools-test.py b/tests/extra/manual-vmtools-test.py index 6b6c6964..03ef22f5 100755 --- a/tests/extra/manual-vmtools-test.py +++ b/tests/extra/manual-vmtools-test.py @@ -112,7 +112,7 @@ def main(args): if __name__ == '__main__': logging.basicConfig(format='%(message)s', level=logging.DEBUG) - + parser = ArgumentParser(description="""\ This is intended for manually testing vmtools.py From 8f24cae3be8ed9226bf5c98580830751ec0a3e78 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 14 Jul 2022 14:56:08 +0200 Subject: [PATCH 0709/2116] Fix added type The added time should be a datetime, not a time.struct_time. Regression of 290b9050 Closes: #1012 --- fdroidserver/update.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 11aa801e..c957dab4 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -34,7 +34,7 @@ import json import time import yaml import copy -from datetime import datetime +from datetime import datetime, timezone from argparse import ArgumentParser from pathlib import Path @@ -1167,7 +1167,7 @@ def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False): if use_date_from_file: timestamp = stat.st_ctime - default_date_param = time.gmtime(time.mktime(datetime.fromtimestamp(timestamp).timetuple())) + default_date_param = datetime.fromtimestamp(timestamp, tz=timezone.utc) else: default_date_param = None From bb7f80b1e17abf861535d72ee52ee89932e7e5cb Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 6 Sep 2022 16:05:48 +0200 Subject: [PATCH 0710/2116] sort MANIFEST.in --- MANIFEST.in | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index 33266a64..60dedbe1 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -755,22 +755,22 @@ include tests/source-files/eu.siacs.conversations/build.gradle include tests/source-files/eu.siacs.conversations/metadata/en-US/name.txt include tests/source-files/fdroid/fdroidclient/AndroidManifest.xml include tests/source-files/fdroid/fdroidclient/build.gradle -include tests/source-files/firebase-suspect/app/build.gradle -include tests/source-files/firebase-suspect/build.gradle include tests/source-files/firebase-allowlisted/app/build.gradle include tests/source-files/firebase-allowlisted/build.gradle +include tests/source-files/firebase-suspect/app/build.gradle +include tests/source-files/firebase-suspect/build.gradle include tests/source-files/info.guardianproject.ripple/build.gradle include tests/source-files/open-keychain/open-keychain/build.gradle include tests/source-files/open-keychain/open-keychain/OpenKeychain/build.gradle include tests/source-files/org.mozilla.rocket/app/build.gradle +include tests/source-files/org.noise_planet.noisecapture/app/build.gradle +include tests/source-files/org.noise_planet.noisecapture/settings.gradle +include tests/source-files/org.noise_planet.noisecapture/sosfilter/build.gradle include tests/source-files/org.tasks/app/build.gradle.kts include tests/source-files/org.tasks/build.gradle include tests/source-files/org.tasks/build.gradle.kts include tests/source-files/org.tasks/buildSrc/build.gradle.kts include tests/source-files/org.tasks/settings.gradle.kts -include tests/source-files/org.noise_planet.noisecapture/app/build.gradle -include tests/source-files/org.noise_planet.noisecapture/settings.gradle -include tests/source-files/org.noise_planet.noisecapture/sosfilter/build.gradle include tests/source-files/osmandapp/osmand/build.gradle include tests/source-files/osmandapp/osmand/gradle/wrapper/gradle-wrapper.properties include tests/source-files/realm/react-native/android/build.gradle @@ -836,11 +836,11 @@ include tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/i include tests/triple-t-anysoftkeyboard/build/com.menny.android.anysoftkeyboard/settings.gradle include tests/triple-t-anysoftkeyboard/metadata/com.anysoftkeyboard.languagepack.dutch.yml include tests/triple-t-anysoftkeyboard/metadata/com.menny.android.anysoftkeyboard.yml -include tests/triple-t-flutter/metadata/fr.emersion.goguma.yml -include tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/title.txt -include tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/short-description.txt -include tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/full-description.txt include tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/contact-website.txt +include tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/full-description.txt +include tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/short-description.txt +include tests/triple-t-flutter/build/fr.emersion.goguma/android/app/src/main/play/listings/en-US/title.txt +include tests/triple-t-flutter/metadata/fr.emersion.goguma.yml include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/settings.gradle include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/verifier/src/main/play/listings/en-US/title.txt include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.verifier/wallet/src/main/play/listings/en-US/title.txt From 8ef43dee0bf311ba3a35675ba1a74e09bfff3a36 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sat, 26 Mar 2022 17:14:46 +0100 Subject: [PATCH 0711/2116] Deleted translation using Weblate: English (Middle) (enm) Deleted translation using Weblate: English (Old) (ang) Co-authored-by: Hans-Christoph Steiner --- locale/ang/LC_MESSAGES/fdroidserver.po | 2884 ------------------------ locale/enm/LC_MESSAGES/fdroidserver.po | 2884 ------------------------ 2 files changed, 5768 deletions(-) delete mode 100644 locale/ang/LC_MESSAGES/fdroidserver.po delete mode 100644 locale/enm/LC_MESSAGES/fdroidserver.po diff --git a/locale/ang/LC_MESSAGES/fdroidserver.po b/locale/ang/LC_MESSAGES/fdroidserver.po deleted file mode 100644 index db299322..00000000 --- a/locale/ang/LC_MESSAGES/fdroidserver.po +++ /dev/null @@ -1,2884 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# This file is put in the public domain. -# Jennifer Kitts , 2021. -msgid "" -msgstr "" -"Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" -"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: ang\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -#: ../fdroidserver/common.py -msgid "" -"\n" -" This is a repository of apps to be used with FDroid. Applications in this\n" -" repository are either official binaries built by the original application\n" -" developers, or are binaries built from source by f-droid.org using the\n" -" tools on https://gitlab.com/fdroid.\n" -" " -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "" -"\n" -"SSH Public Key to be used as Deploy Key:" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "" -"\n" -"SSH public key to be used as deploy key:" -msgstr "" - -#: ../fdroidserver/nightly.py -#, python-brace-format -msgid "" -"\n" -"{path} encoded for the DEBUG_KEYSTORE secret variable:" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "\"%s/\" has no matching metadata file!" -msgstr "" - -#: ../fdroidserver/index.py -#, python-brace-format -msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "" - -#: ../fdroidserver/index.py -msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" - -#: ../fdroidserver/install.py -#, python-brace-format -msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains recent {name} ({version})" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "\"{path}\" exists but s3cmd is not installed!" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "\"{path}\" is not an accepted format, convert to: {formats}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "\"{url}\" is not a valid URL!" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: ../fdroidserver/mirror.py -#, python-format -msgid "%(prog)s [options] url" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "%(prog)s: error: %(message)s\n" -msgstr "" - -#: ../fdroidserver/scanner.py -#, python-format -msgid "%d problems found" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -msgid "%prog [options]" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "%r is not callable" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "%s is not an accepted build field" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - -#: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - -#: ../fdroidserver/common.py -msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" - -#: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - -#: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - -#: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -msgid "'required' is an invalid argument for positionals" -msgstr "" - -#: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.yml'!" -msgstr "" - -#: ../fdroidserver/common.py -msgid "'sdk_path' not set in config.yml!" -msgstr "" - -#. Translators: "build-tools" is the file name of a package from -#. Google, it is part of the Android SDK. So it probably shouldn't be -#. translated or transliterated. -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{aapt}' is too old, fdroid requires build-tools-23.0.0 or newer!" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" -msgstr "" - -#: ../fdroidserver/install.py -#, python-brace-format -msgid "'{apkfilename}' is already installed on {dev}." -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "'{field}' in {linedesc} is obsolete, see docs for current fields:" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{path}' failed to execute!" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" -msgstr "" - -#: ../fdroidserver/checkupdates.py -#, python-brace-format -msgid "...checkupdate failed for {appid} : {error}" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -msgid ".__call__() not defined" -msgstr "" - -#: ../fdroidserver/metadata.py -msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." -msgstr "" - -#: ../fdroidserver/lint.py -msgid "/issues is missing" -msgstr "" - -#: ../fdroidserver/mirror.py -msgid "A URL is required as an argument!" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Add PGP signatures using GnuPG for packages in repo" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Add a new application from its source code" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Add a repo signing key to an unsigned repo" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Add skeleton metadata files for APKs that are missing them" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Adding new repo for only {name}" -msgstr "" - -#: ../fdroidserver/init.py -msgid "Alias of the repo signing key in the keystore" -msgstr "" - -#: ../fdroidserver/import.py -msgid "Allows a different revision (or git branch) to be specified for the initial import" -msgstr "" - -#: ../fdroidserver/mirror.py -msgid "Also mirror the full archive section" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Also warn about formatting issues, like rewritemeta -l" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "Android AAR library" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "Android APK file" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "Android DEX code" -msgstr "" - -#: ../fdroidserver/common.py ../fdroidserver/build.py -#, python-brace-format -msgid "Android SDK '{path}' does not have '{dirname}' installed!" -msgstr "" - -#: ../fdroidserver/init.py -#, python-brace-format -msgid "Android SDK not found at {path}!" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Android SDK not found!" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Android SDK path '{path}' does not exist!" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Android SDK path '{path}' is not a directory!" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Android SDK tool {cmd} found!" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Android SDK tool {cmd} not found!" -msgstr "" - -#. Translators: "build-tools" is the file name of a package from -#. Google, it is part of the Android SDK. So it probably shouldn't be -#. translated or transliterated. -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Android build-tools path '{path}' does not exist!" -msgstr "" - -#: ../fdroidserver/update.py -msgid "AndroidManifest.xml has no date" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "App is in '{repo}' but has a link to {url}" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Appending .git is not necessary" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Archiving {apkfilename} with invalid signature!" -msgstr "" - -#: ../fdroidserver/mirror.py -msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "Branch '{branch}' used as commit in srclib '{srclib}'" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Broken symlink: {path}" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Build a package from source" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Build all applications available" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Build generated by `fdroid import` - remove disable line once ready" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "Build metadata git repo has uncommited changes!" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Build only the latest version of each package" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" -msgstr "" - -#: ../fdroidserver/init.py -#, python-format -msgid "Built repo based in \"%s\" with this config:" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Can't build due to {} error while scanning" -msgid_plural "Can't build due to {} errors while scanning" -msgstr[0] "" -msgstr[1] "" - -#: ../fdroidserver/vmtools.py -#, python-brace-format -msgid "Cannot read \"{path}\"!" -msgstr "" - -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Cannot resolve application ID {appid}" -msgstr "" - -#: ../fdroidserver/rewritemeta.py -#, python-brace-format -msgid "Cannot rewrite \"{path}\"" -msgstr "" - -#: ../fdroidserver/rewritemeta.py -msgid "Cannot use --list and --to at the same time" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "Categories '%s' is not valid" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Categories are not set" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Check for updates to applications" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Clean update - don't uses caches, reprocess all APKs" -msgstr "" - -#: ../fdroidserver/import.py -msgid "Comma separated list of categories." -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -#, c-format, python-format -msgid "Command '%s' not recognised.\n" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "Commit changes" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Could not find '{command}' on your system" -msgstr "" - -#: ../fdroidserver/import.py -msgid "Could not find latest version code" -msgstr "" - -#: ../fdroidserver/import.py -msgid "Could not find latest version name" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Could not find {path} to remove it" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Could not open APK {path} for analysis: " -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Could not parse size \"{size}\", wrong type \"{type}\"" -msgstr "" - -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py -msgid "Couldn't find Application ID" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "Couldn't find any version information" -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode -#: ../fdroidserver/import.py -msgid "Couldn't find latest version code" -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname -#: ../fdroidserver/import.py -msgid "Couldn't find latest version name" -msgstr "" - -#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py -msgid "Couldn't find package ID" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Cowardily refusing to overwrite existing signing key setup!" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Create a repo signing key in a keystore" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Create skeleton metadata files that are missing" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "Created new container \"{name}\"" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "Creating \"{path}\" for configuring s3cmd." -msgstr "" - -#: ../fdroidserver/publish.py -msgid "Creating log directory" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "Creating new S3 bucket: {url}" -msgstr "" - -#: ../fdroidserver/publish.py -msgid "Creating output directory" -msgstr "" - -#: ../fdroidserver/index.py -msgid "Creating signed index with this key (SHA256):" -msgstr "" - -#: ../fdroidserver/import.py ../fdroidserver/verify.py -#: ../fdroidserver/publish.py -msgid "Creating temporary directory" -msgstr "" - -#: ../fdroidserver/index.py -msgid "Creating unsigned index in preparation for signing" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "DEBUG_KEYSTORE is not set or the value is incomplete" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "" - -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "" - -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Deleting unknown file: {path}" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "Description '%s' is just the app's summary" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Description has a duplicate line" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "Description of length {length} is over the {limit} char limit" -msgstr "" - -#: ../fdroidserver/import.py -msgid "Do not add 'disable:' to the generated build entries" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "Do not deploy the new files to the repo" -msgstr "" - -#: ../fdroidserver/mirror.py -#, python-brace-format -msgid "Do not include \"{path}\" in URL!" -msgstr "" - -#: ../fdroidserver/init.py -msgid "Do not prompt for Android SDK path, just fail" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "Do not remove the private keys generated from the keystore" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Don't create a source tarball, useful when testing a build" -msgstr "" - -#: ../fdroidserver/stats.py -msgid "Don't do anything logs-related" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Don't refresh the repository, useful when testing a build with no internet connection" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/nightly.py -#: ../fdroidserver/upload.py -msgid "Don't use rsync checksums" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Download complete mirrors of small repos" -msgstr "" - -#: ../fdroidserver/stats.py -msgid "Download logs we don't have" -msgstr "" - -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Downloading the repository already failed once, not trying again." -msgstr "" - -#: ../fdroidserver/verify.py -#, python-brace-format -msgid "Downloading {url} failed. {error}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "Duplicate link in '{field}': {url}" -msgstr "" - -#: ../fdroid -msgid "Dynamically scan APKs post build" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" - -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "ERROR: unsupported CI type, patches welcome!" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Empty build flag at {linedesc}" -msgstr "" - -#: ../fdroidserver/__main__.py -#, python-brace-format -msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "" - -#: ../fdroidserver/init.py -#, python-format -msgid "" -"Enter the path to the Android SDK (%s) here:\n" -"> " -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Environment variable {var} from {configname} is not set!" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py -#: ../fdroidserver/upload.py -#, python-format -msgid "Error while attempting to publish log: %s" -msgstr "" - -#: ../fdroidserver/import.py ../fdroidserver/common.py -msgid "Error while getting repo address" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Extract signatures from APKs" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Failed copying {path}: {error}" -msgstr "" - -#: ../fdroidserver/signatures.py -#, python-brace-format -msgid "Failed fetching signatures for '{apkfilename}': {error}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Failed reading {path}: {error}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Failed resizing {path}: {error}" -msgstr "" - -#: ../fdroidserver/publish.py -msgid "Failed to align application" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "Failed to create S3 bucket: {url}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Failed to get APK information, deleting {path}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Failed to get APK information, skipping {path}" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Failed to get APK signing key fingerprint" -msgstr "" - -#: ../fdroidserver/install.py -#, python-brace-format -msgid "Failed to install '{apkfilename}' on {dev}: {error}" -msgstr "" - -#: ../fdroidserver/publish.py ../fdroidserver/common.py -msgid "Failed to sign application" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Failed to zipalign application" -msgstr "" - -#: ../fdroidserver/build.py -#, python-brace-format -msgid "Fetched buildserverid from VM: {buildserverid}" -msgstr "" - -#: ../fdroidserver/signatures.py -#, python-brace-format -msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "File disappeared while processing it: {path}" -msgstr "" - -#: ../fdroidserver/verify.py ../fdroidserver/stats.py ../fdroidserver/update.py -#: ../fdroidserver/rewritemeta.py ../fdroidserver/build.py -#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py -#: ../fdroidserver/install.py -msgid "Finished" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID flag" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Forbidden HTML tags" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." -msgstr "" - -#: ../fdroidserver/build.py -#, python-brace-format -msgid "Force halting build after {0} sec timeout!" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "Force scan of disabled apps and builds." -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Found bad funding file \"{path}\" for \"{name}\":" -msgstr "" - -#: ../fdroidserver/common.py ../fdroidserver/metadata.py -msgid "Found invalid appids in arguments" -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode -#: ../fdroidserver/common.py -msgid "Found invalid versionCodes for some apps" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Found multiple metadata files for {appid}" -msgstr "" - -#: ../fdroidserver/index.py -msgid "Found multiple signing certificates for repository." -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Found multiple signing certificates in {path}" -msgstr "" - -#: ../fdroidserver/index.py -msgid "Found no signing certificates for repository." -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "Found non-file at %s" -msgstr "" - -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "Found {apkfilename} at {url}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Generated skeleton metadata for {appid}" -msgstr "" - -#: ../fdroidserver/common.py -#, python-format -msgid "Git checkout of '%s' failed" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Git clean failed" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Git fetch failed" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Git remote set-head failed" -msgstr "" - -#: ../fdroidserver/common.py -#, python-format -msgid "Git remote set-head failed: \"%s\"" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Git reset failed" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Git submodule sync failed" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Git submodule update failed" -msgstr "" - -#: ../fdroidserver/common.py -msgid "HTTPS must be used with Subversion URLs!" -msgstr "" - -#: ../fdroidserver/deploy.py -msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "" - -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "If this upload fails, try manually uploading to {url}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "" - -#: ../fdroidserver/update.py -#, python-format -msgid "Ignoring FUNDING.yml entry longer than 2048: %s" -msgstr "" - -#: ../fdroidserver/index.py -msgid "Ignoring package without metadata: " -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Ignoring stale cache data for {apkfilename}" -msgstr "" - -#: ../fdroidserver/rewritemeta.py -#, python-brace-format -msgid "Ignoring {ext} file at '{path}'" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "" - -#: ../fdroidserver/mirror.py -msgid "Include the PGP signature .asc files in the mirror" -msgstr "" - -#: ../fdroidserver/mirror.py -msgid "Include the build logs in the mirror" -msgstr "" - -#: ../fdroidserver/mirror.py -msgid "Include the source tarballs in the mirror" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-format -msgid "Including metadata from %s@%s" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Including metadata from {path}" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Initialising submodules" -msgstr "" - -#: ../fdroidserver/install.py -msgid "Install all signed applications available" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Install built packages on devices" -msgstr "" - -#: ../fdroidserver/install.py -#, python-format -msgid "Installing %s..." -msgstr "" - -#: ../fdroidserver/install.py -#, python-format -msgid "Installing %s…" -msgstr "" - -#: ../fdroidserver/install.py -#, python-brace-format -msgid "Installing '{apkfilename}' on {dev}..." -msgstr "" - -#: ../fdroidserver/install.py -#, python-brace-format -msgid "Installing '{apkfilename}' on {dev}…" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Interact with the repo HTTP server" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Invalid APK" -msgstr "" - -#: ../fdroidserver/checkupdates.py -#, python-brace-format -msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" - -#: ../fdroidserver/checkupdates.py -#, python-brace-format -msgid "Invalid UpdateCheckMode: {mode}" -msgstr "" - -#: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py -#, python-brace-format -msgid "Invalid VercodeOperation: {field}" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Invalid application ID {appid}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Invalid build flag at {line} in {linedesc}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Invalid build format: {value} in {name}" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Invalid bulleted list" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid metadata in %s:%d" -msgstr "" - -#: ../fdroidserver/metadata.py -msgid "Invalid metadata in: " -msgstr "" - -#: ../fdroidserver/common.py -#, python-format -msgid "Invalid name for published file: %s" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Invalid package name {0}" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Invalid redirect to non-HTTPS: {before} -> {after} " -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Invalid scrlib metadata: '{file}' does not exist" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Invalid srclib metadata: could not parse '{file}'" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Invalid versionCode: \"{versionCode}\" is not an integer!" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "JAR signature failed to verify: {path}" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "JAR signature verified: {path}" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "Java JAR file" -msgstr "" - -#: ../fdroidserver/publish.py ../fdroidserver/update.py -#: ../fdroidserver/mirror.py -msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "Java compiled class" -msgstr "" - -#: ../fdroidserver/signindex.py -msgid "Java jarsigner not found! Install in standard location or set java_paths!" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Javascript in HTML src attributes" -msgstr "" - -#: ../fdroidserver/build.py -#, python-brace-format -msgid "Keeping failed build \"{apkfilename}\"" -msgstr "" - -#: ../fdroidserver/init.py -msgid "Keystore for signing key:\t" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Liberapay donation methods belong in the Liberapay: field" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Liberapay donation methods belong in the LiberapayID flag" -msgstr "" - -#: ../fdroidserver/rewritemeta.py -msgid "List files that would be reformatted" -msgstr "" - -#: ../fdroidserver/rewritemeta.py -msgid "List files that would be reformatted (dry run)" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Locale included in f-droid.org URL" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Make the build stop on exceptions" -msgstr "" - -#: ../fdroidserver/index.py -msgid "Malformed repository mirrors." -msgstr "" - -#: ../fdroidserver/deploy.py -msgid "Malformed serverwebroot line:" -msgstr "" - -#: ../fdroidserver/mirror.py -msgid "Mirror the full repo and archive, all file types." -msgstr "" - -#: ../fdroidserver/gpgsign.py -msgid "Missing output directory" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "Name '%s' is just the auto name - remove it" -msgstr "" - -#: ../fdroidserver/common.py -msgid "No 'config.yml' found, using defaults." -msgstr "" - -#: ../fdroidserver/verify.py -#, python-format -msgid "No APK for package: %s" -msgstr "" - -#: ../fdroidserver/common.py -msgid "No Android SDK found!" -msgstr "" - -#: ../fdroidserver/import.py -msgid "No android or kivy project could be found. Specify --subdir?" -msgstr "" - -#: ../fdroidserver/install.py -msgid "No attached devices found" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "No commit specified for {versionName} in {linedesc}" -msgstr "" - -#: ../fdroidserver/common.py -msgid "No config.yml found, using defaults." -msgstr "" - -#: ../fdroidserver/index.py -msgid "No fingerprint in URL." -msgstr "" - -#: ../fdroidserver/common.py -msgid "No git submodules available" -msgstr "" - -#: ../fdroidserver/import.py -msgid "No gradle project could be found. Specify --subdir?" -msgstr "" - -#: ../fdroidserver/import.py ../fdroidserver/common.py -msgid "No information found." -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "No matching tags found" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "" - -#: ../fdroidserver/lint.py -msgid "No need to specify that the app is Free Software" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "No need to specify that the app is for Android" -msgstr "" - -#: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.yml to set at least one of these:" -msgstr "" - -#: ../fdroidserver/common.py -msgid "No packages specified" -msgstr "" - -#: ../fdroidserver/install.py -#, python-format -msgid "No signed APK available for %s" -msgstr "" - -#: ../fdroidserver/install.py -msgid "No signed output directory - nothing to do" -msgstr "" - -#: ../fdroidserver/update.py ../fdroidserver/common.py -#, python-brace-format -msgid "No signing certificates found in {path}" -msgstr "" - -#: ../fdroidserver/common.py ../fdroidserver/metadata.py -#, python-format -msgid "No such package: %s" -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode -#: ../fdroidserver/common.py -#, python-brace-format -msgid "No such versionCode {versionCode} for app {appid}" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "No tags found" -msgstr "" - -#: ../fdroidserver/verify.py ../fdroidserver/publish.py -msgid "No unsigned directory - nothing to do" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Not a valid size definition: \"{}\"" -msgstr "" - -#: ../fdroidserver/signindex.py -msgid "Nothing to do" -msgstr "" - -#: ../fdroidserver/checkupdates.py -#, python-brace-format -msgid "Nothing to do for {appid}." -msgstr "" - -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode -#: ../fdroidserver/update.py -#, python-brace-format -msgid "OBB file has newer versionCode({integer}) than any APK:" -msgstr "" - -#: ../fdroidserver/update.py -msgid "OBB filename must start with \"main.\" or \"patch.\":" -msgstr "" - -#: ../fdroidserver/update.py -msgid "OBB's packagename does not match a supported APK:" -msgstr "" - -#: ../fdroidserver/deploy.py -msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Old APK signature failed to verify: {path}" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Old, deprecated name for fdroid deploy" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Only PNG and JPEG are supported for graphics, found: {path}" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "Only process apps with auto-updates" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -msgid "Options" -msgstr "" - -#: ../fdroidserver/verify.py -msgid "Output JSON report to file named after APK." -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "Output JSON to stdout." -msgstr "" - -#: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py -#: ../fdroidserver/update.py ../fdroidserver/signindex.py -#: ../fdroidserver/checkupdates.py -msgid "Outputting JSON" -msgstr "" - -#: ../fdroidserver/import.py -msgid "Overall license of the project." -msgstr "" - -#: ../fdroidserver/index.py -#, python-brace-format -msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "" - -#: ../fdroidserver/import.py -#, python-brace-format -msgid "Package \"{appid}\" already exists" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Parsing manifest at '{path}'" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Password required with username" -msgstr "" - -#: ../fdroidserver/import.py -msgid "Path to main Android project subdirectory, if not in root." -msgstr "" - -msgid "Path to main android project subdirectory, if not in root." -msgstr "" - -#: ../fdroidserver/init.py -msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" -msgstr "" - -#: ../fdroidserver/btlog.py -msgid "Path to the git repo to use as the log" -msgstr "" - -#: ../fdroidserver/init.py -msgid "Path to the keystore for the repo signing key" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "Print the secret variable to the terminal for easy copy/paste" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Problem with description of {appid}: {error}" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Problem with xml at '{path}'" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "Process auto-updates" -msgstr "" - -#: ../fdroidserver/publish.py ../fdroidserver/update.py -#, python-brace-format -msgid "Processing {apkfilename}" -msgstr "" - -#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py -#, python-brace-format -msgid "Processing {appid}" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Produce human-readable XML/JSON for index files" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Produce human-readable index.xml" -msgstr "" - -#: ../fdroidserver/import.py -msgid "Project URL to import from." -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Punctuation should be avoided" -msgstr "" - -#: ../fdroidserver/btlog.py -msgid "Push the log to this git remote repository" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "Pushing binary transparency log to {url}" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "Pushing to {url}" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Quickly start a new repository" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Read all the metadata files and exit" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Reading '{config_file}'" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Reading minSdkVersion failed: \"{apkfilename}\"" -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode -#. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Reading {apkfilename} from cache" -msgstr "" - -#: ../fdroidserver/stats.py -msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." -msgstr "" - -#: ../fdroidserver/common.py -msgid "Removing specified files" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Removing {path}\"" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Rename APK files that do not match package.name_123.apk" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Report on build data status" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - -#: ../fdroidserver/nightly.py -#, python-brace-format -msgid "Resigning {apkfilename} with provided debug.keystore" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Resize all the icons exceeding the max pixel size and exit" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Restrict output to warnings and errors" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Rewrite all the metadata files" -msgstr "" - -#: ../fdroidserver/rewritemeta.py -msgid "Rewrite to a specific format: " -msgstr "" - -#: ../fdroidserver/rewritemeta.py -#, python-brace-format -msgid "Rewriting '{appid}'" -msgstr "" - -#: ../fdroidserver/rewritemeta.py -#, python-brace-format -msgid "Rewriting '{appid}' to '{path}'" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "Run on git repo that has uncommitted changes" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Run rewritemeta to fix formatting" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "Running first pass with MD5 checking disabled" -msgstr "" - -#: ../fdroidserver/mirror.py -#, python-brace-format -msgid "Running wget in {path}" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Scan the source code of a package" -msgstr "" - -#: ../fdroidserver/scanner.py -#, python-brace-format -msgid "Scanner found {count} problems in {appid}:" -msgstr "" - -#: ../fdroidserver/scanner.py -#, python-brace-format -msgid "Scanner found {count} problems in {appid}:{versionCode}:" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Scanner found {} problem" -msgid_plural "Scanner found {} problems" -msgstr[0] "" -msgstr[1] "" - -#: ../fdroidserver/scanner.py -msgid "Scanning APK with apkanalyzer for known non-free classes." -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Set NDK {release} ({version}) up" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Set clock to that time using:" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "Set maximum releases in repo before older ones are archived" -msgstr "" - -#: ../fdroidserver/build.py -#, python-brace-format -msgid "Set open file limit to {integer}" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Set up an app build for a nightly build repo" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Setting open file limit failed: " -msgstr "" - -#: ../fdroidserver/build.py -#, python-brace-format -msgid "Setting {0} sec timeout for this build" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Sign and place packages in the repo" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Sign indexes created using update --nosign" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Skip scanning the source code for binaries and other problems" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Skipping '{apkfilename}' with invalid signature!" -msgstr "" - -#: ../fdroidserver/index.py -#, python-format -msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Skipping index generation for {appid}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Skipping {apkfilename} with invalid signature!" -msgstr "" - -#: ../fdroidserver/scanner.py -#, python-brace-format -msgid "Skipping {appid}: disabled" -msgstr "" - -#: ../fdroidserver/scanner.py -#, python-brace-format -msgid "Skipping {appid}: no builds specified" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "Specify a local folder to sync the repo to" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "Specify an identity file to provide to SSH for rsyncing" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Specify that we're running on the build server" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "Specify which debug keystore file to use." -msgstr "" - -#: ../fdroidserver/common.py -msgid "Spew out even more information than normal" -msgstr "" - -#: ../fdroidserver/nightly.py -#, python-brace-format -msgid "Striping mystery signature from {apkfilename}" -msgstr "" - -#: ../fdroidserver/nightly.py -#, python-brace-format -msgid "Stripping mystery signature from {apkfilename}" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "Summary '%s' is just the app's name" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "Summary of length {length} is over the {limit} char limit" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "System clock is older than date in {path}!" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode -#: ../fdroidserver/update.py -#, python-brace-format -msgid "The OBB version code must come after \"{name}.\":" -msgstr "" - -#: ../fdroidserver/btlog.py -msgid "The base URL for the repo to log (default: https://f-droid.org)" -msgstr "" - -#: ../fdroidserver/mirror.py -msgid "The directory to write the mirror to" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "The file to be included in the repo (path or glob)" -msgstr "" - -#: ../fdroidserver/deploy.py -msgid "The only commands currently supported are 'init' and 'update'" -msgstr "" - -#: ../fdroidserver/index.py -msgid "The repository's fingerprint does not match." -msgstr "" - -#: ../fdroidserver/common.py -msgid "The repository's index could not be verified." -msgstr "" - -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "The root dir for local_copy_dir \"{path}\" does not exist!" -msgstr "" - -#: ../fdroidserver/publish.py -msgid "There is a keyalias collision - publishing halted" -msgstr "" - -#: ../fdroidserver/common.py -msgid "These are the apps that have been archived from the main repo." -msgstr "" - -#: ../fdroidserver/common.py -msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" - -#: ../fdroidserver/import.py -#, python-format -msgid "This repo already has local metadata: %s" -msgstr "" - -#: ../fdroidserver/init.py -#, python-format -msgid "" -"To complete the setup, add your APKs to \"%s\"\n" -"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" -"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" -"a signing key (a temporary one might have been automatically generated).\n" -"\n" -"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" -"and https://f-droid.org/docs/Signing_Process" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "URL must start with https:// or http://" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "URL shorteners should not be used" -msgstr "" - -#: ../fdroidserver/metadata.py -msgid "URL title is just the URL, use brackets: [URL]" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "URL {url} in Description: {error}" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Unexpected text on same line as {field} in {linedesc}" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unknown entry {key} in {configname}" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Unknown exception found!" -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "Unknown file '{filename}' in build '{versionName}'" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-format -msgid "Unknown metadata format: %s" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Unknown metadata format: {path}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Unknown metadata format: {path} (use: *.yml)" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Unknown version of aapt, might cause problems: " -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Unnecessary leading space" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Unnecessary trailing space" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Unrecognised app field '{fieldname}' in '{path}'" -msgstr "" - -#: ../fdroidserver/metadata.py -msgid "Unrecognised app field: " -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Unrecognised build flag '{build_flag}' in '{path}'" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Unrecognised field '{field}' in {linedesc}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Unsupported file type \"{extension}\" for repo graphic" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Unsupported graphics file found: {path}" -msgstr "" - -#: ../fdroidserver/rewritemeta.py -#, python-brace-format -msgid "Unsupported metadata format, use: --to [{supported}]" -msgstr "" - -#: ../fdroidserver/metadata.py -msgid "Unterminated ]" -msgstr "" - -#: ../fdroidserver/metadata.py -msgid "Unterminated ]]" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Unterminated build in {name}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Unterminated continuation in {name}" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "Unused extlib at %s" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "Unused file at %s" -msgstr "" - -#: ../fdroidserver/scanner.py -#, python-format -msgid "Unused scandelete path: %s" -msgstr "" - -#: ../fdroidserver/scanner.py -#, python-format -msgid "Unused scanignore path: %s" -msgstr "" - -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Update repo information for new packages" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Update the binary transparency log for a URL" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Update the stats of the repo" -msgstr "" - -#: ../fdroidserver/update.py ../fdroidserver/build.py -msgid "Update the wiki" -msgstr "" - -#: ../fdroidserver/checkupdates.py -#, python-brace-format -msgid "UpdateCheckData has invalid URL: {url}" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "UpdateCheckData must use HTTPS URL: {url}" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "UpdateCheckData not a valid URL: {url}" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" -msgstr "" - -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckName is set to the known application ID - it can be removed" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "" - -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "Uploading {apkfilename} to androidobservatory.org" -msgstr "" - -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "Uploading {apkfilename} to virustotal" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -msgid "Usage" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Use `fdroid update -c` to create it." -msgstr "" - -#: ../fdroidserver/build.py -msgid "Use build server" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "Using \"{path}\" for configuring s3cmd." -msgstr "" - -#: ../fdroidserver/common.py -msgid "Using APK Signature v2" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Using APK Signature v3" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - -#: ../fdroidserver/init.py -#, python-brace-format -msgid "Using existing keystore \"{path}\"" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "Using s3cmd to sync with: {url}" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Valid commands are:" -msgstr "" - -#: ../fdroidserver/verify.py -msgid "Verify against locally cached copy rather than redownloading." -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Verify the integrity of downloaded packages" -msgstr "" - -#: ../fdroidserver/index.py -msgid "Verifying index signature:" -msgstr "" - -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Warn about possible metadata errors" -msgstr "" - -#: ../fdroidserver/update.py -msgid "When configured for signed indexes, create only unsigned indexes at this stage" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "" - -msgid "X.509 'Distiguished Name' used when generating keys" -msgstr "" - -#: ../fdroidserver/init.py -msgid "X.509 'Distinguished Name' used when generating keys" -msgstr "" - -#: ../fdroidserver/common.py -msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "ZIP file archive" -msgstr "" - -#: ../fdroidserver/nightly.py -#, python-brace-format -msgid "adding IdentityFile to {path}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "adding to {name}: {path}" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - -#: ../fdroidserver/common.py -msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "" - -#: ../fdroidserver/common.py -msgid "apksigner not found, it's required for signing!" -msgstr "" - -#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py -#: ../fdroidserver/checkupdates.py -msgid "application ID of file to operate on" -msgstr "" - -#: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/build.py ../fdroidserver/scanner.py -#: ../fdroidserver/install.py -msgid "application ID with optional versionCode in the form APPID[:VERCODE]" -msgstr "" - -#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py -msgid "applicationId in the form APPID" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "applicationId to check for updates" -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode -#: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/build.py ../fdroidserver/scanner.py -#: ../fdroidserver/install.py -msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "argument \"-\" with mode %r" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "attempting bare SSH connection to test deploy key:" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "attempting bare ssh connection to test deploy key:" -msgstr "" - -#: ../fdroidserver/common.py -msgid "can not parse scrlib spec (not a string): '{}'" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "can't open '%s': %s" -msgstr "" - -#: ../fdroidserver/build.py -#, python-brace-format -msgid "cannot find required srclibs: \"{path}\"" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -msgid "cannot have multiple subparser arguments" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "cannot merge actions - two groups are named %r" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "cannot publish update, did you set the deploy key?" -msgstr "" - -#: ../fdroidserver/nightly.py -#, python-brace-format -msgid "cloning {url}" -msgstr "" - -#: ../fdroidserver/deploy.py -msgid "command to execute, either 'init' or 'update'" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "commands from plugin modules:" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -msgid "complex" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "conflicting option string: %s" -msgid_plural "conflicting option strings: %s" -msgstr[0] "" -msgstr[1] "" - -#: ../fdroidserver/nightly.py -#, python-brace-format -msgid "copying {apkfilename} into {path}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "could not parse '{path}'" -msgstr "" - -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "" - -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - -#: ../fdroidserver/nightly.py -#, python-brace-format -msgid "created {path}" -msgstr "" - -#: ../fdroidserver/checkupdates.py -#, python-brace-format -msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "deleting: repo/{apkfilename}" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "deployed build logs to '{path}'" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "deployed process log {path} to {dest}" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "dest= is required for options like %r" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "executable binary, possibly code" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "expected %s argument" -msgid_plural "expected %s arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -msgid "expected at least one argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -msgid "expected at most one argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -msgid "expected one argument" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "failed deploying build logs to '{path}'" -msgstr "" - -#: ../fdroid -msgid "fdroid [-h|--help|--version] []" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "fdroid [] [-h|--help|--version|]" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -msgid "floating-point" -msgstr "" - -#: ../fdroidserver/metadata.py -msgid "force errors to be warnings, or ignore" -msgstr "" - -#: ../fdroidserver/metadata.py -msgid "force metadata errors (default) to be warnings, or to be ignored." -msgstr "" - -#: ../fdroidserver/common.py -msgid "git svn clone failed" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "gzip file archive" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "ignored explicit argument %r" -msgstr "" - -#: ../fdroidserver/index.py -msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "invalid %(type)s value: %(value)r" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "invalid conflict_resolution value: %r" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" -msgstr "" - -#: ../fdroidserver/checkupdates.py -#, python-brace-format -msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" - -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" -msgstr "" - -#: ../fdroidserver/deploy.py -msgid "local_copy_dir must be an absolute path!" -msgstr "" - -#: ../fdroidserver/deploy.py -msgid "local_copy_dir must be directory, not a file!" -msgstr "" - -#: ../fdroidserver/index.py -#, python-format -msgid "mirror '%s' does not end with 'fdroid'!" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -msgid "mutually exclusive arguments must be optional" -msgstr "" - -#: ../fdroidserver/mirror.py -#, python-brace-format -msgid "no \"icon\" in {appid}" -msgstr "" - -#: ../fdroidserver/signatures.py -msgid "no APK supplied" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "no version information found" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "not allowed with argument %s" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "one of the arguments %s is required" -msgstr "" - -#: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "only accepts strings, lists, and tuples" -msgstr "" - -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -msgid "optional arguments" -msgstr "" - -#: ../fdroidserver/nightly.py -#, python-brace-format -msgid "overwriting existing {path}" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -msgid "positional arguments" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "process log deploy {path} to {dest} failed!" -msgstr "" - -#: ../fdroidserver/signatures.py -#, python-brace-format -msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "" - -#: ../fdroidserver/signatures.py -#, python-brace-format -msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" -msgstr "" - -#: ../fdroidserver/index.py -#, python-format -msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "" - -#: ../fdroidserver/index.py -#, python-format -msgid "repo_icon %s does not exist, generating placeholder." -msgstr "" - -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "s3cmd sync indexes {path} to {url} and delete" -msgstr "" - -#: ../fdroidserver/scanner.py -#, python-format -msgid "scanner not cleanly run apkanalyzer: %s" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "shared library" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -msgid "show program's version number and exit" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -msgid "show this help message and exit" -msgstr "" - -#: ../fdroidserver/signatures.py -msgid "signed APK, either a file-path or HTTPS URL." -msgstr "" - -#: ../fdroidserver/common.py -msgid "skip deploying full build logs: log content is empty" -msgstr "" - -#: ../fdroidserver/common.py -msgid "skip deploying full build logs: not enabled in config" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "skipping source tarball: {path}" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "srclibs missing name and/or @" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "static library" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "the following arguments are required: %s" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "unexpected option string: %s" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "unrecognized arguments: %s" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "unsafe permissions on '{config_file}' (should be 0600)!" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -msgid "usage: " -msgstr "" - -#: ../fdroid -msgid "usage: fdroid [-h|--help|--version] []" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "using Apache libcloud to sync with {url}" -msgstr "" - -#: ../fdroidserver/deploy.py -msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "" - -#: ../fdroidserver/update.py -msgid "wiki support is deprecated and will be removed in the next release!" -msgstr "" - -#: ../fdroidserver/publish.py -#, python-brace-format -msgid "{0} app, {1} key aliases" -msgid_plural "{0} apps, {1} key aliases" -msgstr[0] "" -msgstr[1] "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} ({appid}) has no metadata!" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{appid} does not have a name! Using application ID instead." -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{appid} does not have a name! Using package name instead." -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{appid} from {path} is not a valid Android Package Name!" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{appid} from {path} is not a valid Android application ID!" -msgstr "" - -#: ../fdroidserver/metadata.py ../fdroidserver/update.py -#, python-brace-format -msgid "{appid} from {path} is not a valid Java Package Name!" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{appid} has both APKs and files: {files}" -msgstr "" - -#: ../fdroidserver/mirror.py -#, python-brace-format -msgid "{appid} is missing {name}" -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "{appid}: Unknown extlib {path} in build '{versionName}'" -msgstr "" - -#: ../fdroidserver/scanner.py -#, python-brace-format -msgid "{appid}: no builds specified, running on current source state" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "{build_flag} must be an integer, found: {value}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "{field} not terminated in {name}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "{file} is blank or corrupt!" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.yml." -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - -#: ../fdroidserver/import.py -#, python-brace-format -msgid "{path} already exists, ignoring import results!" -msgstr "" - -#: ../fdroidserver/nightly.py -#, python-brace-format -msgid "{path} does not exist! Create it by running:" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{path} is zero size!" -msgstr "" - -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "{path} more than 200MB, manually upload: {url}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{path}: {error}" -msgstr "" - -#: ../fdroidserver/mirror.py -#, python-brace-format -msgid "{url} does not end with \"fdroid\", check the URL path!" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{url} does not start with \"http\"!" -msgstr "" - -#: ../fdroidserver/build.py -msgid "{} build failed" -msgid_plural "{} builds failed" -msgstr[0] "" -msgstr[1] "" - -#: ../fdroidserver/build.py -msgid "{} build succeeded" -msgid_plural "{} builds succeeded" -msgstr[0] "" -msgstr[1] "" diff --git a/locale/enm/LC_MESSAGES/fdroidserver.po b/locale/enm/LC_MESSAGES/fdroidserver.po deleted file mode 100644 index cf0b6542..00000000 --- a/locale/enm/LC_MESSAGES/fdroidserver.po +++ /dev/null @@ -1,2884 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# This file is put in the public domain. -# jace , 2021. -msgid "" -msgstr "" -"Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" -"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: enm\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -#: ../fdroidserver/common.py -msgid "" -"\n" -" This is a repository of apps to be used with FDroid. Applications in this\n" -" repository are either official binaries built by the original application\n" -" developers, or are binaries built from source by f-droid.org using the\n" -" tools on https://gitlab.com/fdroid.\n" -" " -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "" -"\n" -"SSH Public Key to be used as Deploy Key:" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "" -"\n" -"SSH public key to be used as deploy key:" -msgstr "" - -#: ../fdroidserver/nightly.py -#, python-brace-format -msgid "" -"\n" -"{path} encoded for the DEBUG_KEYSTORE secret variable:" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "\"%s/\" has no matching metadata file!" -msgstr "" - -#: ../fdroidserver/index.py -#, python-brace-format -msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "" - -#: ../fdroidserver/index.py -msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" - -#: ../fdroidserver/install.py -#, python-brace-format -msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains recent {name} ({version})" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "\"{path}\" exists but s3cmd is not installed!" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "\"{path}\" is not an accepted format, convert to: {formats}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "\"{url}\" is not a valid URL!" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: ../fdroidserver/mirror.py -#, python-format -msgid "%(prog)s [options] url" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "%(prog)s: error: %(message)s\n" -msgstr "" - -#: ../fdroidserver/scanner.py -#, python-format -msgid "%d problems found" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -msgid "%prog [options]" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "%r is not callable" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "%s is not an accepted build field" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - -#: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keypass' not found in config.yml!" -msgstr "" - -#: ../fdroidserver/common.py -msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" - -#: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystore' not found in config.yml!" -msgstr "" - -#: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'keystorepass' not found in config.yml!" -msgstr "" - -#: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "'repo_keyalias' not found in config.yml!" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -msgid "'required' is an invalid argument for positionals" -msgstr "" - -#: ../fdroidserver/common.py -msgid "'sdk_path' not set in 'config.yml'!" -msgstr "" - -#: ../fdroidserver/common.py -msgid "'sdk_path' not set in config.yml!" -msgstr "" - -#. Translators: "build-tools" is the file name of a package from -#. Google, it is part of the Android SDK. So it probably shouldn't be -#. translated or transliterated. -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{aapt}' is too old, fdroid requires build-tools-23.0.0 or newer!" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" -msgstr "" - -#: ../fdroidserver/install.py -#, python-brace-format -msgid "'{apkfilename}' is already installed on {dev}." -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "'{field}' in {linedesc} is obsolete, see docs for current fields:" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{path}' failed to execute!" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" -msgstr "" - -#: ../fdroidserver/checkupdates.py -#, python-brace-format -msgid "...checkupdate failed for {appid} : {error}" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -msgid ".__call__() not defined" -msgstr "" - -#: ../fdroidserver/metadata.py -msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." -msgstr "" - -#: ../fdroidserver/lint.py -msgid "/issues is missing" -msgstr "" - -#: ../fdroidserver/mirror.py -msgid "A URL is required as an argument!" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Add PGP signatures using GnuPG for packages in repo" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Add a new application from its source code" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Add a repo signing key to an unsigned repo" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Add skeleton metadata files for APKs that are missing them" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Adding new repo for only {name}" -msgstr "" - -#: ../fdroidserver/init.py -msgid "Alias of the repo signing key in the keystore" -msgstr "" - -#: ../fdroidserver/import.py -msgid "Allows a different revision (or git branch) to be specified for the initial import" -msgstr "" - -#: ../fdroidserver/mirror.py -msgid "Also mirror the full archive section" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Also warn about formatting issues, like rewritemeta -l" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "Android AAR library" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "Android APK file" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "Android DEX code" -msgstr "" - -#: ../fdroidserver/common.py ../fdroidserver/build.py -#, python-brace-format -msgid "Android SDK '{path}' does not have '{dirname}' installed!" -msgstr "" - -#: ../fdroidserver/init.py -#, python-brace-format -msgid "Android SDK not found at {path}!" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Android SDK not found!" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Android SDK path '{path}' does not exist!" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Android SDK path '{path}' is not a directory!" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Android SDK tool {cmd} found!" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Android SDK tool {cmd} not found!" -msgstr "" - -#. Translators: "build-tools" is the file name of a package from -#. Google, it is part of the Android SDK. So it probably shouldn't be -#. translated or transliterated. -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Android build-tools path '{path}' does not exist!" -msgstr "" - -#: ../fdroidserver/update.py -msgid "AndroidManifest.xml has no date" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "App is in '{repo}' but has a link to {url}" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Appending .git is not necessary" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Archiving {apkfilename} with invalid signature!" -msgstr "" - -#: ../fdroidserver/mirror.py -msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "Branch '{branch}' used as commit in srclib '{srclib}'" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Broken symlink: {path}" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Build a package from source" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Build all applications available" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Build generated by `fdroid import` - remove disable line once ready" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "Build metadata git repo has uncommited changes!" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Build only the latest version of each package" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" -msgstr "" - -#: ../fdroidserver/init.py -#, python-format -msgid "Built repo based in \"%s\" with this config:" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Can't build due to {} error while scanning" -msgid_plural "Can't build due to {} errors while scanning" -msgstr[0] "" -msgstr[1] "" - -#: ../fdroidserver/vmtools.py -#, python-brace-format -msgid "Cannot read \"{path}\"!" -msgstr "" - -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Cannot resolve application ID {appid}" -msgstr "" - -#: ../fdroidserver/rewritemeta.py -#, python-brace-format -msgid "Cannot rewrite \"{path}\"" -msgstr "" - -#: ../fdroidserver/rewritemeta.py -msgid "Cannot use --list and --to at the same time" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "Categories '%s' is not valid" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Categories are not set" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Check for updates to applications" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Clean update - don't uses caches, reprocess all APKs" -msgstr "" - -#: ../fdroidserver/import.py -msgid "Comma separated list of categories." -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -#, c-format, python-format -msgid "Command '%s' not recognised.\n" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "Commit changes" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Could not find '{command}' on your system" -msgstr "" - -#: ../fdroidserver/import.py -msgid "Could not find latest version code" -msgstr "" - -#: ../fdroidserver/import.py -msgid "Could not find latest version name" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Could not find {path} to remove it" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Could not open APK {path} for analysis: " -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Could not parse size \"{size}\", wrong type \"{type}\"" -msgstr "" - -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py -msgid "Couldn't find Application ID" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "Couldn't find any version information" -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode -#: ../fdroidserver/import.py -msgid "Couldn't find latest version code" -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname -#: ../fdroidserver/import.py -msgid "Couldn't find latest version name" -msgstr "" - -#: ../fdroidserver/import.py ../fdroidserver/checkupdates.py -msgid "Couldn't find package ID" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Cowardily refusing to overwrite existing signing key setup!" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Create a repo signing key in a keystore" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Create skeleton metadata files that are missing" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "Created new container \"{name}\"" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "Creating \"{path}\" for configuring s3cmd." -msgstr "" - -#: ../fdroidserver/publish.py -msgid "Creating log directory" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "Creating new S3 bucket: {url}" -msgstr "" - -#: ../fdroidserver/publish.py -msgid "Creating output directory" -msgstr "" - -#: ../fdroidserver/index.py -msgid "Creating signed index with this key (SHA256):" -msgstr "" - -#: ../fdroidserver/import.py ../fdroidserver/verify.py -#: ../fdroidserver/publish.py -msgid "Creating temporary directory" -msgstr "" - -#: ../fdroidserver/index.py -msgid "Creating unsigned index in preparation for signing" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "DEBUG_KEYSTORE is not set or the value is incomplete" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "" - -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "" - -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Deleting unknown file: {path}" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "Description '%s' is just the app's summary" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Description has a duplicate line" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "Description of length {length} is over the {limit} char limit" -msgstr "" - -#: ../fdroidserver/import.py -msgid "Do not add 'disable:' to the generated build entries" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "Do not deploy the new files to the repo" -msgstr "" - -#: ../fdroidserver/mirror.py -#, python-brace-format -msgid "Do not include \"{path}\" in URL!" -msgstr "" - -#: ../fdroidserver/init.py -msgid "Do not prompt for Android SDK path, just fail" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "Do not remove the private keys generated from the keystore" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Don't create a source tarball, useful when testing a build" -msgstr "" - -#: ../fdroidserver/stats.py -msgid "Don't do anything logs-related" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Don't refresh the repository, useful when testing a build with no internet connection" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/nightly.py -#: ../fdroidserver/upload.py -msgid "Don't use rsync checksums" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Download complete mirrors of small repos" -msgstr "" - -#: ../fdroidserver/stats.py -msgid "Download logs we don't have" -msgstr "" - -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Downloading the repository already failed once, not trying again." -msgstr "" - -#: ../fdroidserver/verify.py -#, python-brace-format -msgid "Downloading {url} failed. {error}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "Duplicate link in '{field}': {url}" -msgstr "" - -#: ../fdroid -msgid "Dynamically scan APKs post build" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" - -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "ERROR: unsupported CI type, patches welcome!" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Empty build flag at {linedesc}" -msgstr "" - -#: ../fdroidserver/__main__.py -#, python-brace-format -msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "" - -#: ../fdroidserver/init.py -#, python-format -msgid "" -"Enter the path to the Android SDK (%s) here:\n" -"> " -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Environment variable {var} from {configname} is not set!" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py -#: ../fdroidserver/upload.py -#, python-format -msgid "Error while attempting to publish log: %s" -msgstr "" - -#: ../fdroidserver/import.py ../fdroidserver/common.py -msgid "Error while getting repo address" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Extract signatures from APKs" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Failed copying {path}: {error}" -msgstr "" - -#: ../fdroidserver/signatures.py -#, python-brace-format -msgid "Failed fetching signatures for '{apkfilename}': {error}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Failed reading {path}: {error}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Failed resizing {path}: {error}" -msgstr "" - -#: ../fdroidserver/publish.py -msgid "Failed to align application" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "Failed to create S3 bucket: {url}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Failed to get APK information, deleting {path}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Failed to get APK information, skipping {path}" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Failed to get APK manifest information" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Failed to get APK signing key fingerprint" -msgstr "" - -#: ../fdroidserver/install.py -#, python-brace-format -msgid "Failed to install '{apkfilename}' on {dev}: {error}" -msgstr "" - -#: ../fdroidserver/publish.py ../fdroidserver/common.py -msgid "Failed to sign application" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Failed to zipalign application" -msgstr "" - -#: ../fdroidserver/build.py -#, python-brace-format -msgid "Fetched buildserverid from VM: {buildserverid}" -msgstr "" - -#: ../fdroidserver/signatures.py -#, python-brace-format -msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "File disappeared while processing it: {path}" -msgstr "" - -#: ../fdroidserver/verify.py ../fdroidserver/stats.py ../fdroidserver/update.py -#: ../fdroidserver/rewritemeta.py ../fdroidserver/build.py -#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py -#: ../fdroidserver/install.py -msgid "Finished" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID flag" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Forbidden HTML tags" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." -msgstr "" - -#: ../fdroidserver/build.py -#, python-brace-format -msgid "Force halting build after {0} sec timeout!" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "Force scan of disabled apps and builds." -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Found bad funding file \"{path}\" for \"{name}\":" -msgstr "" - -#: ../fdroidserver/common.py ../fdroidserver/metadata.py -msgid "Found invalid appids in arguments" -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode -#: ../fdroidserver/common.py -msgid "Found invalid versionCodes for some apps" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Found multiple metadata files for {appid}" -msgstr "" - -#: ../fdroidserver/index.py -msgid "Found multiple signing certificates for repository." -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Found multiple signing certificates in {path}" -msgstr "" - -#: ../fdroidserver/index.py -msgid "Found no signing certificates for repository." -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "Found non-file at %s" -msgstr "" - -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "Found {apkfilename} at {url}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Generated skeleton metadata for {appid}" -msgstr "" - -#: ../fdroidserver/common.py -#, python-format -msgid "Git checkout of '%s' failed" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Git clean failed" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Git fetch failed" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Git remote set-head failed" -msgstr "" - -#: ../fdroidserver/common.py -#, python-format -msgid "Git remote set-head failed: \"%s\"" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Git reset failed" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Git submodule sync failed" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Git submodule update failed" -msgstr "" - -#: ../fdroidserver/common.py -msgid "HTTPS must be used with Subversion URLs!" -msgstr "" - -#: ../fdroidserver/deploy.py -msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "" - -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "If this upload fails, try manually uploading to {url}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "" - -#: ../fdroidserver/update.py -#, python-format -msgid "Ignoring FUNDING.yml entry longer than 2048: %s" -msgstr "" - -#: ../fdroidserver/index.py -msgid "Ignoring package without metadata: " -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Ignoring stale cache data for {apkfilename}" -msgstr "" - -#: ../fdroidserver/rewritemeta.py -#, python-brace-format -msgid "Ignoring {ext} file at '{path}'" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "" - -#: ../fdroidserver/mirror.py -msgid "Include the PGP signature .asc files in the mirror" -msgstr "" - -#: ../fdroidserver/mirror.py -msgid "Include the build logs in the mirror" -msgstr "" - -#: ../fdroidserver/mirror.py -msgid "Include the source tarballs in the mirror" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-format -msgid "Including metadata from %s@%s" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Including metadata from {path}" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Initialising submodules" -msgstr "" - -#: ../fdroidserver/install.py -msgid "Install all signed applications available" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Install built packages on devices" -msgstr "" - -#: ../fdroidserver/install.py -#, python-format -msgid "Installing %s..." -msgstr "" - -#: ../fdroidserver/install.py -#, python-format -msgid "Installing %s…" -msgstr "" - -#: ../fdroidserver/install.py -#, python-brace-format -msgid "Installing '{apkfilename}' on {dev}..." -msgstr "" - -#: ../fdroidserver/install.py -#, python-brace-format -msgid "Installing '{apkfilename}' on {dev}…" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Interact with the repo HTTP server" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Invalid APK" -msgstr "" - -#: ../fdroidserver/checkupdates.py -#, python-brace-format -msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" - -#: ../fdroidserver/checkupdates.py -#, python-brace-format -msgid "Invalid UpdateCheckMode: {mode}" -msgstr "" - -#: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py -#, python-brace-format -msgid "Invalid VercodeOperation: {field}" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Invalid application ID {appid}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Invalid build flag at {line} in {linedesc}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Invalid build format: {value} in {name}" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Invalid bulleted list" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid metadata in %s:%d" -msgstr "" - -#: ../fdroidserver/metadata.py -msgid "Invalid metadata in: " -msgstr "" - -#: ../fdroidserver/common.py -#, python-format -msgid "Invalid name for published file: %s" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Invalid package name {0}" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Invalid redirect to non-HTTPS: {before} -> {after} " -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Invalid scrlib metadata: '{file}' does not exist" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Invalid srclib metadata: could not parse '{file}'" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Invalid versionCode: \"{versionCode}\" is not an integer!" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "JAR signature failed to verify: {path}" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "JAR signature verified: {path}" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "Java JAR file" -msgstr "" - -#: ../fdroidserver/publish.py ../fdroidserver/update.py -#: ../fdroidserver/mirror.py -msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "Java compiled class" -msgstr "" - -#: ../fdroidserver/signindex.py -msgid "Java jarsigner not found! Install in standard location or set java_paths!" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Javascript in HTML src attributes" -msgstr "" - -#: ../fdroidserver/build.py -#, python-brace-format -msgid "Keeping failed build \"{apkfilename}\"" -msgstr "" - -#: ../fdroidserver/init.py -msgid "Keystore for signing key:\t" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Liberapay donation methods belong in the Liberapay: field" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Liberapay donation methods belong in the LiberapayID flag" -msgstr "" - -#: ../fdroidserver/rewritemeta.py -msgid "List files that would be reformatted" -msgstr "" - -#: ../fdroidserver/rewritemeta.py -msgid "List files that would be reformatted (dry run)" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Locale included in f-droid.org URL" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Make the build stop on exceptions" -msgstr "" - -#: ../fdroidserver/index.py -msgid "Malformed repository mirrors." -msgstr "" - -#: ../fdroidserver/deploy.py -msgid "Malformed serverwebroot line:" -msgstr "" - -#: ../fdroidserver/mirror.py -msgid "Mirror the full repo and archive, all file types." -msgstr "" - -#: ../fdroidserver/gpgsign.py -msgid "Missing output directory" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "Name '%s' is just the auto name - remove it" -msgstr "" - -#: ../fdroidserver/common.py -msgid "No 'config.yml' found, using defaults." -msgstr "" - -#: ../fdroidserver/verify.py -#, python-format -msgid "No APK for package: %s" -msgstr "" - -#: ../fdroidserver/common.py -msgid "No Android SDK found!" -msgstr "" - -#: ../fdroidserver/import.py -msgid "No android or kivy project could be found. Specify --subdir?" -msgstr "" - -#: ../fdroidserver/install.py -msgid "No attached devices found" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "No commit specified for {versionName} in {linedesc}" -msgstr "" - -#: ../fdroidserver/common.py -msgid "No config.yml found, using defaults." -msgstr "" - -#: ../fdroidserver/index.py -msgid "No fingerprint in URL." -msgstr "" - -#: ../fdroidserver/common.py -msgid "No git submodules available" -msgstr "" - -#: ../fdroidserver/import.py -msgid "No gradle project could be found. Specify --subdir?" -msgstr "" - -#: ../fdroidserver/import.py ../fdroidserver/common.py -msgid "No information found." -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "No matching tags found" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "" - -#: ../fdroidserver/lint.py -msgid "No need to specify that the app is Free Software" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "No need to specify that the app is for Android" -msgstr "" - -#: ../fdroidserver/deploy.py -msgid "No option set! Edit your config.yml to set at least one of these:" -msgstr "" - -#: ../fdroidserver/common.py -msgid "No packages specified" -msgstr "" - -#: ../fdroidserver/install.py -#, python-format -msgid "No signed APK available for %s" -msgstr "" - -#: ../fdroidserver/install.py -msgid "No signed output directory - nothing to do" -msgstr "" - -#: ../fdroidserver/update.py ../fdroidserver/common.py -#, python-brace-format -msgid "No signing certificates found in {path}" -msgstr "" - -#: ../fdroidserver/common.py ../fdroidserver/metadata.py -#, python-format -msgid "No such package: %s" -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode -#: ../fdroidserver/common.py -#, python-brace-format -msgid "No such versionCode {versionCode} for app {appid}" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "No tags found" -msgstr "" - -#: ../fdroidserver/verify.py ../fdroidserver/publish.py -msgid "No unsigned directory - nothing to do" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Not a valid size definition: \"{}\"" -msgstr "" - -#: ../fdroidserver/signindex.py -msgid "Nothing to do" -msgstr "" - -#: ../fdroidserver/checkupdates.py -#, python-brace-format -msgid "Nothing to do for {appid}." -msgstr "" - -#: ../fdroidserver/init.py -msgid "Now set these in config.yml:" -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode -#: ../fdroidserver/update.py -#, python-brace-format -msgid "OBB file has newer versionCode({integer}) than any APK:" -msgstr "" - -#: ../fdroidserver/update.py -msgid "OBB filename must start with \"main.\" or \"patch.\":" -msgstr "" - -#: ../fdroidserver/update.py -msgid "OBB's packagename does not match a supported APK:" -msgstr "" - -#: ../fdroidserver/deploy.py -msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Old APK signature failed to verify: {path}" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Old, deprecated name for fdroid deploy" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Only PNG and JPEG are supported for graphics, found: {path}" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "Only process apps with auto-updates" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -msgid "Options" -msgstr "" - -#: ../fdroidserver/verify.py -msgid "Output JSON report to file named after APK." -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "Output JSON to stdout." -msgstr "" - -#: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py -#: ../fdroidserver/update.py ../fdroidserver/signindex.py -#: ../fdroidserver/checkupdates.py -msgid "Outputting JSON" -msgstr "" - -#: ../fdroidserver/import.py -msgid "Overall license of the project." -msgstr "" - -#: ../fdroidserver/index.py -#, python-brace-format -msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "" - -#: ../fdroidserver/import.py -#, python-brace-format -msgid "Package \"{appid}\" already exists" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Parsing manifest at '{path}'" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Password required with username" -msgstr "" - -#: ../fdroidserver/import.py -msgid "Path to main Android project subdirectory, if not in root." -msgstr "" - -msgid "Path to main android project subdirectory, if not in root." -msgstr "" - -#: ../fdroidserver/init.py -msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" -msgstr "" - -#: ../fdroidserver/btlog.py -msgid "Path to the git repo to use as the log" -msgstr "" - -#: ../fdroidserver/init.py -msgid "Path to the keystore for the repo signing key" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "Print the secret variable to the terminal for easy copy/paste" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Problem with description of {appid}: {error}" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Problem with xml at '{path}'" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "Process auto-updates" -msgstr "" - -#: ../fdroidserver/publish.py ../fdroidserver/update.py -#, python-brace-format -msgid "Processing {apkfilename}" -msgstr "" - -#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py -#, python-brace-format -msgid "Processing {appid}" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Produce human-readable XML/JSON for index files" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Produce human-readable index.xml" -msgstr "" - -#: ../fdroidserver/import.py -msgid "Project URL to import from." -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Punctuation should be avoided" -msgstr "" - -#: ../fdroidserver/btlog.py -msgid "Push the log to this git remote repository" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "Pushing binary transparency log to {url}" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "Pushing to {url}" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Quickly start a new repository" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Read all the metadata files and exit" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Reading '{config_file}'" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Reading minSdkVersion failed: \"{apkfilename}\"" -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode -#. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Reading {apkfilename} from cache" -msgstr "" - -#: ../fdroidserver/stats.py -msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." -msgstr "" - -#: ../fdroidserver/common.py -msgid "Removing specified files" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Removing {path}\"" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Rename APK files that do not match package.name_123.apk" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Report on build data status" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - -#: ../fdroidserver/nightly.py -#, python-brace-format -msgid "Resigning {apkfilename} with provided debug.keystore" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Resize all the icons exceeding the max pixel size and exit" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Restrict output to warnings and errors" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Rewrite all the metadata files" -msgstr "" - -#: ../fdroidserver/rewritemeta.py -msgid "Rewrite to a specific format: " -msgstr "" - -#: ../fdroidserver/rewritemeta.py -#, python-brace-format -msgid "Rewriting '{appid}'" -msgstr "" - -#: ../fdroidserver/rewritemeta.py -#, python-brace-format -msgid "Rewriting '{appid}' to '{path}'" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "Run on git repo that has uncommitted changes" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Run rewritemeta to fix formatting" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "Running first pass with MD5 checking disabled" -msgstr "" - -#: ../fdroidserver/mirror.py -#, python-brace-format -msgid "Running wget in {path}" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Scan the source code of a package" -msgstr "" - -#: ../fdroidserver/scanner.py -#, python-brace-format -msgid "Scanner found {count} problems in {appid}:" -msgstr "" - -#: ../fdroidserver/scanner.py -#, python-brace-format -msgid "Scanner found {count} problems in {appid}:{versionCode}:" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Scanner found {} problem" -msgid_plural "Scanner found {} problems" -msgstr[0] "" -msgstr[1] "" - -#: ../fdroidserver/scanner.py -msgid "Scanning APK with apkanalyzer for known non-free classes." -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Set NDK {release} ({version}) up" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Set clock to that time using:" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "Set maximum releases in repo before older ones are archived" -msgstr "" - -#: ../fdroidserver/build.py -#, python-brace-format -msgid "Set open file limit to {integer}" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Set up an app build for a nightly build repo" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Setting open file limit failed: " -msgstr "" - -#: ../fdroidserver/build.py -#, python-brace-format -msgid "Setting {0} sec timeout for this build" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Sign and place packages in the repo" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Sign indexes created using update --nosign" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Skip scanning the source code for binaries and other problems" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Skipping '{apkfilename}' with invalid signature!" -msgstr "" - -#: ../fdroidserver/index.py -#, python-format -msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Skipping index generation for {appid}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Skipping {apkfilename} with invalid signature!" -msgstr "" - -#: ../fdroidserver/scanner.py -#, python-brace-format -msgid "Skipping {appid}: disabled" -msgstr "" - -#: ../fdroidserver/scanner.py -#, python-brace-format -msgid "Skipping {appid}: no builds specified" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "Specify a local folder to sync the repo to" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "Specify an identity file to provide to SSH for rsyncing" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Specify that we're running on the build server" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "Specify which debug keystore file to use." -msgstr "" - -#: ../fdroidserver/common.py -msgid "Spew out even more information than normal" -msgstr "" - -#: ../fdroidserver/nightly.py -#, python-brace-format -msgid "Striping mystery signature from {apkfilename}" -msgstr "" - -#: ../fdroidserver/nightly.py -#, python-brace-format -msgid "Stripping mystery signature from {apkfilename}" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "Summary '%s' is just the app's name" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "Summary of length {length} is over the {limit} char limit" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "System clock is older than date in {path}!" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode -#: ../fdroidserver/update.py -#, python-brace-format -msgid "The OBB version code must come after \"{name}.\":" -msgstr "" - -#: ../fdroidserver/btlog.py -msgid "The base URL for the repo to log (default: https://f-droid.org)" -msgstr "" - -#: ../fdroidserver/mirror.py -msgid "The directory to write the mirror to" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "The file to be included in the repo (path or glob)" -msgstr "" - -#: ../fdroidserver/deploy.py -msgid "The only commands currently supported are 'init' and 'update'" -msgstr "" - -#: ../fdroidserver/index.py -msgid "The repository's fingerprint does not match." -msgstr "" - -#: ../fdroidserver/common.py -msgid "The repository's index could not be verified." -msgstr "" - -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "The root dir for local_copy_dir \"{path}\" does not exist!" -msgstr "" - -#: ../fdroidserver/publish.py -msgid "There is a keyalias collision - publishing halted" -msgstr "" - -#: ../fdroidserver/common.py -msgid "These are the apps that have been archived from the main repo." -msgstr "" - -#: ../fdroidserver/common.py -msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" - -#: ../fdroidserver/import.py -#, python-format -msgid "This repo already has local metadata: %s" -msgstr "" - -#: ../fdroidserver/init.py -#, python-format -msgid "" -"To complete the setup, add your APKs to \"%s\"\n" -"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" -"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" -"a signing key (a temporary one might have been automatically generated).\n" -"\n" -"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" -"and https://f-droid.org/docs/Signing_Process" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "URL must start with https:// or http://" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "URL shorteners should not be used" -msgstr "" - -#: ../fdroidserver/metadata.py -msgid "URL title is just the URL, use brackets: [URL]" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "URL {url} in Description: {error}" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Unexpected text on same line as {field} in {linedesc}" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unknown entry {key} in {configname}" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Unknown exception found!" -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "Unknown file '{filename}' in build '{versionName}'" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-format -msgid "Unknown metadata format: %s" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Unknown metadata format: {path}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Unknown metadata format: {path} (use: *.yml)" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Unknown version of aapt, might cause problems: " -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Unnecessary leading space" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Unnecessary trailing space" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Unrecognised app field '{fieldname}' in '{path}'" -msgstr "" - -#: ../fdroidserver/metadata.py -msgid "Unrecognised app field: " -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Unrecognised build flag '{build_flag}' in '{path}'" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Unrecognised field '{field}' in {linedesc}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Unsupported file type \"{extension}\" for repo graphic" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "Unsupported graphics file found: {path}" -msgstr "" - -#: ../fdroidserver/rewritemeta.py -#, python-brace-format -msgid "Unsupported metadata format, use: --to [{supported}]" -msgstr "" - -#: ../fdroidserver/metadata.py -msgid "Unterminated ]" -msgstr "" - -#: ../fdroidserver/metadata.py -msgid "Unterminated ]]" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Unterminated build in {name}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "Unterminated continuation in {name}" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "Unused extlib at %s" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-format -msgid "Unused file at %s" -msgstr "" - -#: ../fdroidserver/scanner.py -#, python-format -msgid "Unused scandelete path: %s" -msgstr "" - -#: ../fdroidserver/scanner.py -#, python-format -msgid "Unused scanignore path: %s" -msgstr "" - -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Update repo information for new packages" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Update the binary transparency log for a URL" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Update the stats of the repo" -msgstr "" - -#: ../fdroidserver/update.py ../fdroidserver/build.py -msgid "Update the wiki" -msgstr "" - -#: ../fdroidserver/checkupdates.py -#, python-brace-format -msgid "UpdateCheckData has invalid URL: {url}" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "UpdateCheckData must use HTTPS URL: {url}" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "UpdateCheckData not a valid URL: {url}" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" -msgstr "" - -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckName is set to the known application ID - it can be removed" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "" - -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "Uploading {apkfilename} to androidobservatory.org" -msgstr "" - -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "Uploading {apkfilename} to virustotal" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -msgid "Usage" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Use `fdroid update -c` to create it." -msgstr "" - -#: ../fdroidserver/build.py -msgid "Use build server" -msgstr "" - -#: ../fdroidserver/update.py -msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "Using \"{path}\" for configuring s3cmd." -msgstr "" - -#: ../fdroidserver/common.py -msgid "Using APK Signature v2" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Using APK Signature v3" -msgstr "" - -#: ../fdroidserver/common.py -msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - -#: ../fdroidserver/init.py -#, python-brace-format -msgid "Using existing keystore \"{path}\"" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "Using s3cmd to sync with: {url}" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Valid commands are:" -msgstr "" - -#: ../fdroidserver/verify.py -msgid "Verify against locally cached copy rather than redownloading." -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Verify the integrity of downloaded packages" -msgstr "" - -#: ../fdroidserver/index.py -msgid "Verifying index signature:" -msgstr "" - -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "Warn about possible metadata errors" -msgstr "" - -#: ../fdroidserver/update.py -msgid "When configured for signed indexes, create only unsigned indexes at this stage" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "" - -msgid "X.509 'Distiguished Name' used when generating keys" -msgstr "" - -#: ../fdroidserver/init.py -msgid "X.509 'Distinguished Name' used when generating keys" -msgstr "" - -#: ../fdroidserver/common.py -msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "ZIP file archive" -msgstr "" - -#: ../fdroidserver/nightly.py -#, python-brace-format -msgid "adding IdentityFile to {path}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "adding to {name}: {path}" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - -#: ../fdroidserver/common.py -msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "" - -#: ../fdroidserver/common.py -msgid "apksigner not found, it's required for signing!" -msgstr "" - -#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py -#: ../fdroidserver/checkupdates.py -msgid "application ID of file to operate on" -msgstr "" - -#: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/build.py ../fdroidserver/scanner.py -#: ../fdroidserver/install.py -msgid "application ID with optional versionCode in the form APPID[:VERCODE]" -msgstr "" - -#: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py -msgid "applicationId in the form APPID" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "applicationId to check for updates" -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode -#: ../fdroidserver/verify.py ../fdroidserver/publish.py -#: ../fdroidserver/build.py ../fdroidserver/scanner.py -#: ../fdroidserver/install.py -msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "argument \"-\" with mode %r" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "attempting bare SSH connection to test deploy key:" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "attempting bare ssh connection to test deploy key:" -msgstr "" - -#: ../fdroidserver/common.py -msgid "can not parse scrlib spec (not a string): '{}'" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "can't open '%s': %s" -msgstr "" - -#: ../fdroidserver/build.py -#, python-brace-format -msgid "cannot find required srclibs: \"{path}\"" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -msgid "cannot have multiple subparser arguments" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "cannot merge actions - two groups are named %r" -msgstr "" - -#: ../fdroidserver/nightly.py -msgid "cannot publish update, did you set the deploy key?" -msgstr "" - -#: ../fdroidserver/nightly.py -#, python-brace-format -msgid "cloning {url}" -msgstr "" - -#: ../fdroidserver/deploy.py -msgid "command to execute, either 'init' or 'update'" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "commands from plugin modules:" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -msgid "complex" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "conflicting option string: %s" -msgid_plural "conflicting option strings: %s" -msgstr[0] "" -msgstr[1] "" - -#: ../fdroidserver/nightly.py -#, python-brace-format -msgid "copying {apkfilename} into {path}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "could not parse '{path}'" -msgstr "" - -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "" - -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - -#: ../fdroidserver/nightly.py -#, python-brace-format -msgid "created {path}" -msgstr "" - -#: ../fdroidserver/checkupdates.py -#, python-brace-format -msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "deleting: repo/{apkfilename}" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "deployed build logs to '{path}'" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "deployed process log {path} to {dest}" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "dest= is required for options like %r" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "executable binary, possibly code" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "expected %s argument" -msgid_plural "expected %s arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -msgid "expected at least one argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -msgid "expected at most one argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -msgid "expected one argument" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "failed deploying build logs to '{path}'" -msgstr "" - -#: ../fdroid -msgid "fdroid [-h|--help|--version] []" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "fdroid [] [-h|--help|--version|]" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -msgid "floating-point" -msgstr "" - -#: ../fdroidserver/metadata.py -msgid "force errors to be warnings, or ignore" -msgstr "" - -#: ../fdroidserver/metadata.py -msgid "force metadata errors (default) to be warnings, or to be ignored." -msgstr "" - -#: ../fdroidserver/common.py -msgid "git svn clone failed" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "gzip file archive" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "ignored explicit argument %r" -msgstr "" - -#: ../fdroidserver/index.py -msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "invalid %(type)s value: %(value)r" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "invalid conflict_resolution value: %r" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" -msgstr "" - -#: ../fdroidserver/checkupdates.py -#, python-brace-format -msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" - -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" -msgstr "" - -#: ../fdroidserver/deploy.py -msgid "local_copy_dir must be an absolute path!" -msgstr "" - -#: ../fdroidserver/deploy.py -msgid "local_copy_dir must be directory, not a file!" -msgstr "" - -#: ../fdroidserver/index.py -#, python-format -msgid "mirror '%s' does not end with 'fdroid'!" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -msgid "mutually exclusive arguments must be optional" -msgstr "" - -#: ../fdroidserver/mirror.py -#, python-brace-format -msgid "no \"icon\" in {appid}" -msgstr "" - -#: ../fdroidserver/signatures.py -msgid "no APK supplied" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroid ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - -#: ../fdroidserver/checkupdates.py -msgid "no version information found" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "not allowed with argument %s" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "one of the arguments %s is required" -msgstr "" - -#: ../fdroidserver/index.py ../fdroidserver/common.py -msgid "only accepts strings, lists, and tuples" -msgstr "" - -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -msgid "optional arguments" -msgstr "" - -#: ../fdroidserver/nightly.py -#, python-brace-format -msgid "overwriting existing {path}" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -msgid "positional arguments" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "process log deploy {path} to {dest} failed!" -msgstr "" - -#: ../fdroidserver/signatures.py -#, python-brace-format -msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "" - -#: ../fdroidserver/signatures.py -#, python-brace-format -msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" -msgstr "" - -#: ../fdroidserver/index.py -#, python-format -msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "" - -#: ../fdroidserver/index.py -#, python-format -msgid "repo_icon %s does not exist, generating placeholder." -msgstr "" - -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "s3cmd sync indexes {path} to {url} and delete" -msgstr "" - -#: ../fdroidserver/scanner.py -#, python-format -msgid "scanner not cleanly run apkanalyzer: %s" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "shared library" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py -msgid "show program's version number and exit" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -msgid "show this help message and exit" -msgstr "" - -#: ../fdroidserver/signatures.py -msgid "signed APK, either a file-path or HTTPS URL." -msgstr "" - -#: ../fdroidserver/common.py -msgid "skip deploying full build logs: log content is empty" -msgstr "" - -#: ../fdroidserver/common.py -msgid "skip deploying full build logs: not enabled in config" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "skipping source tarball: {path}" -msgstr "" - -#: ../fdroidserver/lint.py -msgid "srclibs missing name and/or @" -msgstr "" - -#: ../fdroidserver/scanner.py -msgid "static library" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "the following arguments are required: %s" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "unexpected option string: %s" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py -#, python-format -msgid "unrecognized arguments: %s" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "unsafe permissions on '{config_file}' (should be 0600)!" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -msgid "usage: " -msgstr "" - -#: ../fdroid -msgid "usage: fdroid [-h|--help|--version] []" -msgstr "" - -#: ../fdroidserver/deploy.py ../fdroidserver/upload.py -#, python-brace-format -msgid "using Apache libcloud to sync with {url}" -msgstr "" - -#: ../fdroidserver/deploy.py -msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "" - -#: ../fdroidserver/update.py -msgid "wiki support is deprecated and will be removed in the next release!" -msgstr "" - -#: ../fdroidserver/publish.py -#, python-brace-format -msgid "{0} app, {1} key aliases" -msgid_plural "{0} apps, {1} key aliases" -msgstr[0] "" -msgstr[1] "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} ({appid}) has no metadata!" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{appid} does not have a name! Using application ID instead." -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{appid} does not have a name! Using package name instead." -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{appid} from {path} is not a valid Android Package Name!" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{appid} from {path} is not a valid Android application ID!" -msgstr "" - -#: ../fdroidserver/metadata.py ../fdroidserver/update.py -#, python-brace-format -msgid "{appid} from {path} is not a valid Java Package Name!" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{appid} has both APKs and files: {files}" -msgstr "" - -#: ../fdroidserver/mirror.py -#, python-brace-format -msgid "{appid} is missing {name}" -msgstr "" - -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "{appid}: Unknown extlib {path} in build '{versionName}'" -msgstr "" - -#: ../fdroidserver/scanner.py -#, python-brace-format -msgid "{appid}: no builds specified, running on current source state" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "{build_flag} must be an integer, found: {value}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "{field} not terminated in {name}" -msgstr "" - -#: ../fdroidserver/metadata.py -#, python-brace-format -msgid "{file} is blank or corrupt!" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{name} \"{path}\" does not exist! Correct it in config.yml." -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - -#: ../fdroidserver/import.py -#, python-brace-format -msgid "{path} already exists, ignoring import results!" -msgstr "" - -#: ../fdroidserver/nightly.py -#, python-brace-format -msgid "{path} does not exist! Create it by running:" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{path} is zero size!" -msgstr "" - -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "{path} more than 200MB, manually upload: {url}" -msgstr "" - -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{path}: {error}" -msgstr "" - -#: ../fdroidserver/mirror.py -#, python-brace-format -msgid "{url} does not end with \"fdroid\", check the URL path!" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{url} does not start with \"http\"!" -msgstr "" - -#: ../fdroidserver/build.py -msgid "{} build failed" -msgid_plural "{} builds failed" -msgstr[0] "" -msgstr[1] "" - -#: ../fdroidserver/build.py -msgid "{} build succeeded" -msgid_plural "{} builds succeeded" -msgstr[0] "" -msgstr[1] "" From 5c7ecd0520400251d789e09fe25a7de41f5288bc Mon Sep 17 00:00:00 2001 From: Fjuro Date: Sun, 15 May 2022 06:10:07 +0000 Subject: [PATCH 0712/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 15.0% (92 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ --- locale/cs/LC_MESSAGES/fdroidserver.po | 101 +++++++++++++++----------- 1 file changed, 57 insertions(+), 44 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 1c346bd8..a517df02 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -2,20 +2,21 @@ # This file is put in the public domain. # mondstern , 2021. # Petr Novák , 2021. +# Fjuro , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2021-11-10 21:49+0000\n" -"Last-Translator: Petr Novák \n" +"PO-Revision-Date: 2022-05-15 12:15+0000\n" +"Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.9.1-dev\n" +"X-Generator: Weblate 4.13-dev\n" #: ../fdroidserver/common.py msgid "" @@ -26,18 +27,28 @@ msgid "" " tools on https://gitlab.com/fdroid.\n" " " msgstr "" +"\n" +" Toto je repozitář aplikací, které mají být použity s F-Droidem. Aplikace\n" +" v tomto repozitáři jsou buď oficiálními binárními soubory postavenými\n" +" původními vývojáři aplikace, nebo jsou binárními soubory postavenými\n" +" ze zdroje F-Droidem s nástroji na https://gitlab.com/fdroid.\n" +" " #: ../fdroidserver/nightly.py msgid "" "\n" "SSH Public Key to be used as Deploy Key:" msgstr "" +"\n" +"Veřejný klíč SSH, který se použijte jako klíč pro nasazení:" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" +"\n" +"Veřejný klíč SSH, který se použijte jako klíč pro nasazení:" #: ../fdroidserver/nightly.py #, python-brace-format @@ -45,74 +56,76 @@ msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" +"\n" +"{path} zakódováno pro tajnou proměnnou DEBUG_KEYSTORE:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" -msgstr "" +msgstr "\"%s/\" nemá žádný odpovídající soubor metadat!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "" +msgstr "\"local_copy_dir\" {path} neexistuje!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" +msgstr "při používání --nosign se musí v souboru config.yml nacházet \"repo_pubkey\"!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "" +msgstr "aplikace \"{apkfilename}\" je již nainstalována na {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" +msgstr "\"{path}\" obsahuje zastaralý název {name} ({version})" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" -msgstr "" +msgstr "\"{path}\" obsahuje nedávné {name} ({version})" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" -msgstr "" +msgstr "\"{path}\" existuje, ale s3cmd není nainstalován!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "" +msgstr "\"{path}\" není podporovaný formát souboru (použijte: metadata/*.yml)" #: ../fdroidserver/metadata.py #, python-brace-format msgid "\"{path}\" is not an accepted format, convert to: {formats}" -msgstr "" +msgstr "\"{path}\" není přijatelný formát, převeďte na: {formats}" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "" +msgstr "\"{path}\" je podepsáno klíčem, který není povolen:" #: ../fdroidserver/common.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" -msgstr "" +msgstr "\"{url}\" není platná adresa URL!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "možnost %(option)s vyžaduje %(number)d argument" +msgstr[1] "možnost %(option)s vyžaduje %(number)d argumenty" +msgstr[2] "možnost %(option)s vyžaduje %(number)d argumentů" #: ../fdroidserver/mirror.py #, python-format msgid "%(prog)s [options] url" -msgstr "" +msgstr "%(prog)s [možnosti] url" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -123,12 +136,12 @@ msgstr "%(prog)s: chyba: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" -msgstr "" +msgstr "nalezeno %d problémů" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "%prog [options]" -msgstr "" +msgstr "%prog [možnosti]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -139,33 +152,33 @@ msgstr "%r není možné volat" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" -msgstr "" +msgstr "%s není akceptované pole sestavení" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "%s option does not take a value" -msgstr "" +msgstr "možnost %s nepřebírá hodnotu" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" -msgstr "" +msgstr "'keypass' nebyl nalezen v souboru config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" +msgstr "'keystore' je NONE a 'smartcardoptions' je prázdný!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" -msgstr "" +msgstr "'keystore' nebyl nalezen v souboru config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" -msgstr "" +msgstr "'keystorepass' nebyl nalezen v souboru config.yml!" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" -msgstr "" +msgstr "'repo_keyalias' nebyl nalezen v config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -174,11 +187,11 @@ msgstr "'povinné' je Neplatný argument pro pozicials" #: ../fdroidserver/common.py msgid "'sdk_path' not set in 'config.yml'!" -msgstr "" +msgstr "'sdk_path' není nastaven v souboru 'config.yml'!" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" -msgstr "" +msgstr "'sdk_path' není nastaven v souboru config.yml!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -186,7 +199,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-23.0.0 or newer!" -msgstr "" +msgstr "'{aapt}' je příliš starý, fdroid vyžaduje build-tools-23.0.0 nebo novější!" #: ../fdroidserver/common.py #, python-brace-format @@ -226,7 +239,7 @@ msgstr "...kontrola selhala pro {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid ".__call__() not defined" -msgstr "" +msgstr ".__call__() není definováno" #: ../fdroidserver/metadata.py msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." @@ -595,7 +608,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "" +msgstr "Odstraňte soubory APK a/nebo OBB bez metadat z úložiště" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1576,7 +1589,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" -msgstr "" +msgstr "Přejmenujte soubory APK, které se neshodují s package.name_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" @@ -2198,13 +2211,13 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "" +msgstr "nejednoznačná možnost: %(option)s by mohlo odpovídat %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" -msgstr "" +msgstr "nejednoznačná možnost: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" @@ -2262,7 +2275,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "can't open '%s': %s" -msgstr "" +msgstr "nelze otevřít '%s': %s" #: ../fdroidserver/build.py #, python-brace-format @@ -2408,7 +2421,7 @@ msgstr "" #: ../fdroidserver/metadata.py msgid "force errors to be warnings, or ignore" -msgstr "" +msgstr "vynutit, aby chyby byly varováními, nebo je ignorovat" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." @@ -2561,13 +2574,13 @@ msgstr "možnost - %s vyžaduje argument" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s must not have an argument" -msgstr "" +msgstr "možnost --%s nesmí mít argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s not a unique prefix" -msgstr "" +msgstr "možnost --%s není jedinečná předpona" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2579,7 +2592,7 @@ msgstr "možnost -%s není rozpoznána" #: /usr/lib/python3.7/getopt.py #, python-format msgid "option --%s requires argument" -msgstr "" +msgstr "možnost --%s vyžaduje argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2684,13 +2697,13 @@ msgstr "" #: /usr/lib/python3.7/argparse.py #, python-format msgid "the following arguments are required: %s" -msgstr "" +msgstr "jsou vyžadovány následující argumenty: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "unexpected option string: %s" -msgstr "" +msgstr "neočekávaný řetězec možností: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2707,7 +2720,7 @@ msgstr "nerozpoznané argumenty: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" -msgstr "" +msgstr "nebezpečné oprávnění na '{config_file}' (má být 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py @@ -2716,7 +2729,7 @@ msgstr "použití: " #: ../fdroid msgid "usage: fdroid [-h|--help|--version] []" -msgstr "" +msgstr "použití: fdroid [-h|--help|--version] []" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format From 3a8248c8b14d5c54bdbbd89ce40fac04bec4b51a Mon Sep 17 00:00:00 2001 From: Fjuro Date: Wed, 18 May 2022 16:43:21 +0000 Subject: [PATCH 0713/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 16.3% (100 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ --- locale/cs/LC_MESSAGES/fdroidserver.po | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index a517df02..58d4745f 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-05-15 12:15+0000\n" +"PO-Revision-Date: 2022-05-19 17:18+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" @@ -204,7 +204,7 @@ msgstr "'{aapt}' je příliš starý, fdroid vyžaduje build-tools-23.0.0 nebo n #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" -msgstr "" +msgstr "'{aapt}' je příliš starý, fdroid vyžaduje build-tools-{version} nebo novější!" #: ../fdroidserver/install.py #, python-brace-format @@ -219,17 +219,17 @@ msgstr "'{field} ' v {linedesc} je zastaralý, viz dokumenty pro aktuální pole #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" +msgstr "'{field}' bude v náhodném pořadí! Pokud je pořadí důležité, použijte závorky () nebo []!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" -msgstr "" +msgstr "'{path}' nepodařilo se provést!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" -msgstr "" +msgstr "'{value}' není platný {field} v {appid}. Vzor regulárního výrazu: {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -243,7 +243,7 @@ msgstr ".__call__() není definováno" #: ../fdroidserver/metadata.py msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." -msgstr "" +msgstr ".fdroid.txt není podporován! Převeďte na .fdroid.yml nebo .fdroid.json." #: ../fdroidserver/lint.py msgid "/issues is missing" @@ -251,7 +251,7 @@ msgstr "/issues chybí" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" -msgstr "" +msgstr "Jako argument je vyžadována adresa URL!" #: ../fdroid ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -267,12 +267,12 @@ msgstr "Přidejte podpisový klíč repo k nepodepsanému repo" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" -msgstr "" +msgstr "Přidání souborů metadat kostry pro soubory APK, které chybí" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" -msgstr "" +msgstr "Přidání nového repozitáře pouze pro {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" From 810bf46534321b4d0855a5fd5b9a3c95c5c01222 Mon Sep 17 00:00:00 2001 From: Fjuro Date: Sat, 16 Jul 2022 20:26:29 +0000 Subject: [PATCH 0714/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 34.6% (212 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ --- locale/cs/LC_MESSAGES/fdroidserver.po | 233 +++++++++++++------------- 1 file changed, 118 insertions(+), 115 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 58d4745f..99fbea08 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-05-19 17:18+0000\n" +"PO-Revision-Date: 2022-07-17 12:26+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: ../fdroidserver/common.py msgid "" @@ -276,65 +276,65 @@ msgstr "Přidání nového repozitáře pouze pro {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" -msgstr "" +msgstr "Alias podepisovacího klíče repozitáře v keystore" #: ../fdroidserver/import.py msgid "Allows a different revision (or git branch) to be specified for the initial import" -msgstr "" +msgstr "Umožňuje zadat jinou revizi (nebo větev gitu) pro počáteční import" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" -msgstr "" +msgstr "Také zrcadlit celou sekci archivu" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" -msgstr "" +msgstr "Také varovat před problémy s formátování, jako rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" -msgstr "" +msgstr "Knihovna AAR pro Android" #: ../fdroidserver/scanner.py msgid "Android APK file" -msgstr "" +msgstr "Soubor APK pro Android" #: ../fdroidserver/scanner.py msgid "Android DEX code" -msgstr "" +msgstr "Kód Android DEX" #: ../fdroidserver/common.py ../fdroidserver/build.py #, python-brace-format msgid "Android SDK '{path}' does not have '{dirname}' installed!" -msgstr "" +msgstr "Android SDK '{path}' nemá nainstalovaný '{dirname}'!" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "" +msgstr "Android SDK nebylo nalezeno v {path}!" #: ../fdroidserver/common.py msgid "Android SDK not found!" -msgstr "" +msgstr "Android SDK nenalezeno!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" -msgstr "" +msgstr "Android SDK s cestou '{path}' neexistuje!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" -msgstr "" +msgstr "Cesta Android SDK '{path}' není adresář!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "" +msgstr "Nástroj Android SDK {cmd} nalezen!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "" +msgstr "Nástroj Android SDK {cmd} nenalezen!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -342,45 +342,45 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Android build-tools path '{path}' does not exist!" -msgstr "" +msgstr "Cesta k build-tools Androidu '{path}' neexistuje!" #: ../fdroidserver/update.py msgid "AndroidManifest.xml has no date" -msgstr "" +msgstr "AndroidManifest.xml nemá datum" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" -msgstr "" +msgstr "Aplikace je v repozitáři '{repo}' ale má odkaz na {url}" #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" -msgstr "" +msgstr "Přidání .git není nutné" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" -msgstr "" +msgstr "Archivování {apkfilename} s neplatným podpisem!" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" -msgstr "" +msgstr "Základní adresa URL pro zrcadlení, může obsahovat klíč pro podepisování indexu pomocí řetězce dotazu: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "" +msgstr "Větev '{branch}' použitá jako revize v sestavení '{versionName}'" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" -msgstr "" +msgstr "Větev '{branch}' použitá jako revize v srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" -msgstr "" +msgstr "Rozbitý symlink: {path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Build a package from source" @@ -388,65 +388,65 @@ msgstr "Sestavit balíček ze zdroje" #: ../fdroidserver/build.py msgid "Build all applications available" -msgstr "" +msgstr "Sestavit všechny dostupné aplikace" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" -msgstr "" +msgstr "Sestavení vygenerováno pomocí `fdroid import` - odeberte řádek se zakázáním po dokončení" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" -msgstr "" +msgstr "Git repozitář s metadaty sestavení má neodeslané změny!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" -msgstr "" +msgstr "Sestavit pouze nejnovější verzi každého balíčku" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" -msgstr "" +msgstr "Sestavení by mělo být versionName a versionCode oddělené čárkami, ne „{value}“ v {linedesc}" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" -msgstr "" +msgstr "Sestaven repozitář založený v „%s“ s touto konfigurací:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "Nelze automaticky aktualizovat aplikaci bez CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Nelze sestavit kvůli {} chybě při skenování" +msgstr[1] "Nelze sestavit kvůli {} chybám při skenování" +msgstr[2] "Nelze sestavit kvůli {} chybám při skenování" #: ../fdroidserver/vmtools.py #, python-brace-format msgid "Cannot read \"{path}\"!" -msgstr "" +msgstr "Nelze přečíst „{path}“!" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/metadata.py #, python-brace-format msgid "Cannot resolve application ID {appid}" -msgstr "" +msgstr "Nelze přeložit ID aplikace {appid}" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" -msgstr "" +msgstr "Nelze přepsat „{path}“" #: ../fdroidserver/rewritemeta.py msgid "Cannot use --list and --to at the same time" -msgstr "" +msgstr "Nelze současně použít --list a --to" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" -msgstr "" +msgstr "Nelze zapsat „{path}“, není akceptovaný formát, použijte: {formats}" #: ../fdroidserver/lint.py #, python-format @@ -464,20 +464,20 @@ msgstr "Zkontrolujte aktualizace aplikací" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "" +msgstr "Kontrola archivace u {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "" +msgstr "Kontrola archivace u {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" -msgstr "" +msgstr "Čistá aktualizace - nepoužívat mezipaměti, znovu zpracovat všechny soubory APK" #: ../fdroidserver/import.py msgid "Comma separated list of categories." -msgstr "" +msgstr "Seznam kategorií oddělený čárkami." #: ../fdroid ../fdroidserver/__main__.py #, c-format, python-format @@ -486,44 +486,44 @@ msgstr "Příkaz '%s' nebyl rozpoznán.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" -msgstr "" +msgstr "Odeslat změny" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." -msgstr "" +msgstr "Konfliktní argumenty: '--verbose' a '--quiet' nelze zadat současně." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "Konfliktní konfigurační soubory! Používám {newfile}, ignoruji {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" -msgstr "" +msgstr "Ve vašem systému se nepodařilo najít příkaz '{command}'" #: ../fdroidserver/import.py msgid "Could not find latest version code" -msgstr "" +msgstr "Nepodařilo se najít kód poslední verze" #: ../fdroidserver/import.py msgid "Could not find latest version name" -msgstr "" +msgstr "Nepodařilo se najít název poslední verze" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" -msgstr "" +msgstr "Nepodařilo se nalézt {path} k odstranění" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "" +msgstr "Nepodařilo se otevřít APK {path} pro analýzu: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" -msgstr "" +msgstr "Nepodařilo se zpracovat velikost „{size}“, nesprávný typ „{type}“" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/import.py @@ -531,19 +531,18 @@ msgid "Couldn't find Application ID" msgstr "Nedaří se nalézt ID aplikace" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "Couldn't find any version information" -msgstr "Nedaří se nalézt ID aplikace" +msgstr "Nepodařilo se najít žádné informace o verzi" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py msgid "Couldn't find latest version code" -msgstr "" +msgstr "Nepodařilo se nalézt kód poslední verze" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import.py msgid "Couldn't find latest version name" -msgstr "" +msgstr "Nepodařilo se nalézt název poslední verze" #: ../fdroidserver/import.py ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" @@ -551,11 +550,11 @@ msgstr "Nedaří se nalézt identif. balíčku" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" -msgstr "" +msgstr "Zbaběle odmítám přepsat existující nastavení podpisového klíče!" #: ../fdroidserver/update.py msgid "Create a repo signing key in a keystore" -msgstr "" +msgstr "Vytvořit podepisující klíč repozitáře v keystore" #: ../fdroidserver/update.py msgid "Create skeleton metadata files that are missing" @@ -564,29 +563,29 @@ msgstr "Vytvořte soubory metadat kostry, které chybí" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Created new container \"{name}\"" -msgstr "" +msgstr "Vytvořen nový kontejner „{name}“" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." -msgstr "" +msgstr "Vytváření „{path}“ pro konfiguraci s3cmd." #: ../fdroidserver/publish.py msgid "Creating log directory" -msgstr "" +msgstr "Vytváření adresáře protokolů" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Creating new S3 bucket: {url}" -msgstr "" +msgstr "Vytváření nového bucketu S3: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" -msgstr "" +msgstr "Vytváření výstupního adresáře" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" -msgstr "" +msgstr "Vytváření podepsaného indexu s tímto klíčem (SHA256):" #: ../fdroidserver/import.py ../fdroidserver/verify.py #: ../fdroidserver/publish.py @@ -595,16 +594,16 @@ msgstr "Vytváření dočasné složky" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" -msgstr "" +msgstr "Vytváření nepodepsaného indexu v rámci přípravy na podpis" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "" +msgstr "CurrentVersionCode {cv} je menší než nejstarší položka sestavení {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" -msgstr "" +msgstr "DEBUG_KEYSTORE není nastaven nebo je hodnota neúplná" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" @@ -613,106 +612,106 @@ msgstr "Odstraňte soubory APK a/nebo OBB bez metadat z úložiště" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "" +msgstr "Mazání archivu, repozitář je příliš velký ({size} max {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "" +msgstr "Mazání historie git-mirroru, repozitář je příliš velký ({size} max {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" -msgstr "" +msgstr "Mazání neznámého souboru: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" -msgstr "" +msgstr "Popis ‚%s‘ je pouze souhrn aplikace" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" -msgstr "" +msgstr "Popis má duplicitní řádek" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" +msgstr "Popis má seznam (%s) ale není opatřen odrážkami (*) ani očíslován (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" -msgstr "" +msgstr "Popis délky {length} přesahuje limit {limit} znaků" #: ../fdroidserver/import.py msgid "Do not add 'disable:' to the generated build entries" -msgstr "" +msgstr "Nepřidávat ‚disable:‘ k vygenerovaným položkám sestavení" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" -msgstr "" +msgstr "Nevydávat nové soubory do repozitáře" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" -msgstr "" +msgstr "V URL neuvádějte „{path}“!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" -msgstr "" +msgstr "Nevyžadovat cestu Android SDK, prostě selhat" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" -msgstr "" +msgstr "Nemazat soukromé klíče vygenerované z keystore" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" -msgstr "" +msgstr "Nevytvářet zdrojový tarball, užitečné při testování sestavení" #: ../fdroidserver/stats.py msgid "Don't do anything logs-related" -msgstr "" +msgstr "Nedělat nic, co souvisí s protokoly" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" -msgstr "" +msgstr "Neobnovovat repozitář, užitečné při testování bez připojení k internetu" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py #: ../fdroidserver/upload.py msgid "Don't use rsync checksums" -msgstr "" +msgstr "Nepoužívat kontrolní součty rsync" #: ../fdroid ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" -msgstr "" +msgstr "Stáhnout kompletní zrcadla malých repozitářů" #: ../fdroidserver/stats.py msgid "Download logs we don't have" -msgstr "" +msgstr "Stáhnout protokoly, které nemáme" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "Stahování %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." -msgstr "" +msgstr "Stahování repozitáře již jednou selhalo, nezkouším to znovu." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" -msgstr "" +msgstr "Stahování {url} selhalo. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" -msgstr "" +msgstr "Nalezen duplicitní recept sestavení pro versionCode {versionCode} v {linedesc}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" -msgstr "" +msgstr "Duplicitní odkaz v '{field}': {url}" #: ../fdroid msgid "Dynamically scan APKs post build" @@ -720,27 +719,29 @@ msgstr "Dynamicky skenovat APKs post build" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" +msgstr "CHYBA: Podpříkaz „server“ byl odebrán, použijte „deploy“!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" +"CHYBA: tento příkaz by nikdy neměl být použit k zrcadlení f-droid.org!\n" +"Celé zrcadlo f-droid.org vyžaduje více než 200GB." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" -msgstr "" +msgstr "CHYBA: nepodporovaný typ CI, opravy vítány!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" -msgstr "" +msgstr "Prázdný příznak sestavení na řádku {linedesc}" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "" +msgstr "Kódování je nastaveno na ‚{enc}‘ fdroid může mít problémy s kódováním. Pro dosažení nejlepších výsledků jej prosím nastavte na ‚UTF-8‘." #: ../fdroidserver/init.py #, python-format @@ -748,100 +749,102 @@ msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" +"Zadejte cestu k Android SDK (%s) zde:\n" +"> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "Proměnná prostředí {var} z {configname} není nastavena!" #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py #, python-format msgid "Error while attempting to publish log: %s" -msgstr "" +msgstr "Chyba při pokusu o zveřejnění protokolu: %s" #: ../fdroidserver/import.py ../fdroidserver/common.py msgid "Error while getting repo address" -msgstr "" +msgstr "Chyba při získávání adresy repozitáře" #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" -msgstr "" +msgstr "Extrahovat podpisy ze souborů APK" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" -msgstr "" +msgstr "Chyba při kopírování {path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" -msgstr "" +msgstr "Chyba při načítání podpisů pro ‚{apkfilename}‘: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" -msgstr "" +msgstr "Chyba při čtení {path}: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" -msgstr "" +msgstr "Chyba při změně velikosti {path}: {error}" #: ../fdroidserver/publish.py msgid "Failed to align application" -msgstr "" +msgstr "Nepodařilo se zarovnat aplikaci" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" -msgstr "" +msgstr "Nepodařilo se vytvořit bucket S3: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" -msgstr "" +msgstr "Nepodařilo se získat informace o APK, mazání {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" -msgstr "" +msgstr "Nepodařilo se získat informace o APK, přeskakování {path}" #: ../fdroidserver/common.py msgid "Failed to get APK manifest information" -msgstr "" +msgstr "Nepodařilo se získat informace o manifestu APK" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" -msgstr "" +msgstr "Nepodařilo se získat otisk podpisového klíče APK" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" -msgstr "" +msgstr "Nepodařilo se nainstalovat ‚{apkfilename}‘ na {dev}: {error}" #: ../fdroidserver/publish.py ../fdroidserver/common.py msgid "Failed to sign application" -msgstr "" +msgstr "Nepodařilo se podepsat aplikaci" #: ../fdroidserver/common.py msgid "Failed to zipalign application" -msgstr "" +msgstr "Nepodařilo se udělat zipalign aplikace" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" -msgstr "" +msgstr "Načteno buildserverid z VM: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" -msgstr "" +msgstr "Načteny podpisy pro ‚{apkfilename}‘ -> ‚{sigdir}‘" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" -msgstr "" +msgstr "Soubor zmizel při jeho zpracování: {path}" #: ../fdroidserver/verify.py ../fdroidserver/stats.py ../fdroidserver/update.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/build.py From 09fcd99d08ab0749e7d4c1e8ebc81bb6d81c368f Mon Sep 17 00:00:00 2001 From: Fjuro Date: Mon, 18 Jul 2022 14:11:05 +0000 Subject: [PATCH 0715/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 36.9% (226 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ --- locale/cs/LC_MESSAGES/fdroidserver.po | 30 +++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 99fbea08..3ac4b1f4 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-07-17 12:26+0000\n" +"PO-Revision-Date: 2022-07-19 17:13+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" @@ -851,65 +851,65 @@ msgstr "Soubor zmizel při jeho zpracování: {path}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py msgid "Finished" -msgstr "" +msgstr "Dokončeno" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID flag" -msgstr "" +msgstr "Metody darování Flattr patří do příznaku FlattrID" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" +msgstr "Metody darování Flattr patří do pole FlattrID:" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" -msgstr "" +msgstr "Zakázané značky HTML" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." -msgstr "" +msgstr "Vynutí sestavení zakázaných aplikací a pokračuje bez ohledu na problémy se skenováním. Povoleno pouze v testovacím režimu." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" -msgstr "" +msgstr "Vynutit zastavení sestavování po uplynutí časového limitu {0} sekund!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." -msgstr "" +msgstr "Vynutit kontrolu zakázaných aplikací a sestavení." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" -msgstr "" +msgstr "Nalezena grafika „{path}“ bez metadat u aplikace „{name}“!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" -msgstr "" +msgstr "Nalezeno špatné financování souboru „{path}“ pro „{name}“:" #: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" -msgstr "" +msgstr "V argumentech nalezena neplatná id aplikací" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" -msgstr "" +msgstr "U některých aplikací nalezeny neplatné versionCodes" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "" +msgstr "V {path} nalezeno několik podpisových bloků JAR" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" -msgstr "" +msgstr "Nalezeno několik souborů metadat pro {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." -msgstr "" +msgstr "Nalezeno více podpisových certifikátů pro repozitář." #: ../fdroidserver/update.py #, python-brace-format From 0ddb947db251212a995db4a8317e69cd36844806 Mon Sep 17 00:00:00 2001 From: Fjuro Date: Thu, 21 Jul 2022 15:55:23 +0000 Subject: [PATCH 0716/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 36.9% (226 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ --- locale/cs/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 3ac4b1f4..b16519e7 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-07-19 17:13+0000\n" +"PO-Revision-Date: 2022-07-22 02:58+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" @@ -859,7 +859,7 @@ msgstr "Metody darování Flattr patří do příznaku FlattrID" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Metody darování Flattr patří do pole FlattrID:" +msgstr "Metody darování Flattr patří do pole „FlattrID:“" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" From 2e8c04115b324d83808b308cf4f78a6e9ec1099c Mon Sep 17 00:00:00 2001 From: Filip Klopec Date: Thu, 18 Aug 2022 00:32:53 +0000 Subject: [PATCH 0717/2116] Translated using Weblate: Czech (cs) by Filip Klopec Currently translated at 37.4% (229 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ --- locale/cs/LC_MESSAGES/fdroidserver.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index b16519e7..17d49929 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -3,13 +3,14 @@ # mondstern , 2021. # Petr Novák , 2021. # Fjuro , 2022. +# Filip Klopec , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-07-22 02:58+0000\n" -"Last-Translator: Fjuro \n" +"PO-Revision-Date: 2022-08-19 01:16+0000\n" +"Last-Translator: Filip Klopec \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" @@ -914,11 +915,11 @@ msgstr "Nalezeno více podpisových certifikátů pro repozitář." #: ../fdroidserver/update.py #, python-brace-format msgid "Found multiple signing certificates in {path}" -msgstr "" +msgstr "Nalezeno více podpisových certifikátů v {path}" #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." -msgstr "" +msgstr "Pro repozitář nenalezen žádný podpisový certifikát." #: ../fdroidserver/lint.py #, python-format @@ -928,7 +929,7 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" -msgstr "" +msgstr "Nalezen {apkfilename} na {url}" #: ../fdroidserver/update.py #, python-brace-format From 17059ae78a916e23a7ba37289d953597bf6d412b Mon Sep 17 00:00:00 2001 From: Fjuro Date: Mon, 22 Aug 2022 21:22:01 +0000 Subject: [PATCH 0718/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 41.1% (252 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ --- locale/cs/LC_MESSAGES/fdroidserver.po | 54 +++++++++++++-------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 17d49929..fec232ba 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -9,8 +9,8 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-08-19 01:16+0000\n" -"Last-Translator: Filip Klopec \n" +"PO-Revision-Date: 2022-08-23 13:16+0000\n" +"Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" @@ -684,7 +684,7 @@ msgstr "Nepoužívat kontrolní součty rsync" #: ../fdroid ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" -msgstr "Stáhnout kompletní zrcadla malých repozitářů" +msgstr "Stáhnout kompletní mirrory malých repozitářů" #: ../fdroidserver/stats.py msgid "Download logs we don't have" @@ -728,7 +728,7 @@ msgid "" "A full mirror of f-droid.org requires more than 200GB." msgstr "" "CHYBA: tento příkaz by nikdy neměl být použit k zrcadlení f-droid.org!\n" -"Celé zrcadlo f-droid.org vyžaduje více než 200GB." +"Celý mirror f-droid.org vyžaduje více než 200GB." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" @@ -924,7 +924,7 @@ msgstr "Pro repozitář nenalezen žádný podpisový certifikát." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" -msgstr "" +msgstr "Nalezen ne-soubor v %s" #: ../fdroidserver/deploy.py #, python-brace-format @@ -934,98 +934,98 @@ msgstr "Nalezen {apkfilename} na {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" -msgstr "" +msgstr "Vygenerována kostra metadat pro {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" -msgstr "" +msgstr "Git checkout '%s' se nezdařil" #: ../fdroidserver/common.py msgid "Git clean failed" -msgstr "" +msgstr "Git clean se nezdařil" #: ../fdroidserver/common.py msgid "Git fetch failed" -msgstr "" +msgstr "Git fetch se nezdařil" #: ../fdroidserver/common.py msgid "Git prune failed" -msgstr "" +msgstr "Git prune se nezdařil" #: ../fdroidserver/common.py msgid "Git remote set-head failed" -msgstr "" +msgstr "Git remote set-head se nezdařil" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" -msgstr "" +msgstr "Git remote set-head se nezdařil: „%s“" #: ../fdroidserver/common.py msgid "Git reset failed" -msgstr "" +msgstr "Git reset se nezdařil" #: ../fdroidserver/common.py msgid "Git submodule sync failed" -msgstr "" +msgstr "Git submodule sync se nezdařil" #: ../fdroidserver/common.py msgid "Git submodule update failed" -msgstr "" +msgstr "Git submodule update se nezdařil" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" -msgstr "" +msgstr "U URL adres Subversion musí být použito HTTPS!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "" +msgstr "Pokud se git mirror stane příliš velkým, umožnit smazání archivu" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "" +msgstr "Pokud toto nahrání selže, zkuste manuálně nahrát na {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "" +msgstr "Ignorování pole ‚{field}‘ v metadatech ‚{metapath}‘, protože je zastaralé." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" -msgstr "" +msgstr "Ignorování vstupu FUNDING.yml delšího než 2048: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " -msgstr "" +msgstr "Ignorování balíčku bez metadat: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" -msgstr "" +msgstr "Ignorování zastaralých dat mezipaměti {apkfilename}" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Ignoring {ext} file at '{path}'" -msgstr "" +msgstr "Ignorování souboru {ext} v ‚{path}‘" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "" +msgstr "Zahrnout soubory APK, které jsou podepsané zakázanými algoritmy jako MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" -msgstr "" +msgstr "Zahrnout .asc soubory podpisu PGP do mirroru" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" -msgstr "" +msgstr "Zahrnout protokoly sestavení do mirroru" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" -msgstr "" +msgstr "Zahrnout zdrojové tarbally do mirroru" #: ../fdroidserver/metadata.py #, python-format From b419ca882fe003256c271f63998d9a3668957880 Mon Sep 17 00:00:00 2001 From: Fjuro Date: Wed, 24 Aug 2022 16:37:43 +0000 Subject: [PATCH 0719/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 54.7% (335 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ --- locale/cs/LC_MESSAGES/fdroidserver.po | 168 +++++++++++++------------- 1 file changed, 84 insertions(+), 84 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index fec232ba..fccf976a 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-08-23 13:16+0000\n" +"PO-Revision-Date: 2022-08-24 17:32+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" @@ -1030,20 +1030,20 @@ msgstr "Zahrnout zdrojové tarbally do mirroru" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" -msgstr "" +msgstr "Včetně metadat z %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" -msgstr "" +msgstr "Včetně metadat z {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" -msgstr "" +msgstr "Inicializace submodulů" #: ../fdroidserver/install.py msgid "Install all signed applications available" -msgstr "" +msgstr "Instalace všech dostupných podepsaných aplikací" #: ../fdroid ../fdroidserver/__main__.py msgid "Install built packages on devices" @@ -1052,22 +1052,22 @@ msgstr "Nainstalujte vestavěné balíčky na zařízení" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." -msgstr "" +msgstr "Instalace %s..." #: ../fdroidserver/install.py #, python-format msgid "Installing %s…" -msgstr "" +msgstr "Instalace %s…" #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." -msgstr "" +msgstr "Instalace ‚{apkfilename}‘ na {dev}..." #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}…" -msgstr "" +msgstr "Instalace ‚{apkfilename}‘ na {dev}…" #: ../fdroid ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" @@ -1075,338 +1075,338 @@ msgstr "Interakce se serverem repo HTTP" #: ../fdroidserver/update.py msgid "Invalid APK" -msgstr "" +msgstr "Neplatné APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "Neplatný AutoUpdateMode: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "" +msgstr "Neplatný UpdateCheckMode: {mode}" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" -msgstr "" +msgstr "Neplatný VercodeOperation: {field}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" -msgstr "" +msgstr "Neplatné ID aplikace {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" -msgstr "" +msgstr "Neplatná logická hodnota ‚%s‘" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid build flag at {line} in {linedesc}" -msgstr "" +msgstr "Neplatný příznak sestavení na {line} v {linedesc}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid build format: {value} in {name}" -msgstr "" +msgstr "Neplatný formát sestavení: {value} v {name}" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" -msgstr "" +msgstr "Neplatný seznam s odrážkami" #: ../fdroidserver/lint.py #, python-format msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" -msgstr "" +msgstr "Neplatná licenční značka „%s“! Používejte pouze značky z https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "" +msgstr "Neplatný odkaz - použijte [http://foo.bar Název odkazu] nebo [http://foo.bar]" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid metadata in %s:%d" -msgstr "" +msgstr "Neplatná metadata v %s:%d" #: ../fdroidserver/metadata.py msgid "Invalid metadata in: " -msgstr "" +msgstr "Neplatná metadata v: " #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" -msgstr "" +msgstr "Neplatný název pro publikovaný soubor: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "Neplatné ndk: záznam v sestavení: „{ndk}“" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" -msgstr "" +msgstr "Nesprávný název balíčku {0}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " -msgstr "" +msgstr "Neplatné přesměrování na jiný než HTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" -msgstr "" +msgstr "Neplatná metadata scrlib: ‚{file}‘ neexistuje" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" -msgstr "" +msgstr "Neplatná srclib metadata: nelze parsovat ‚{file}‘" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "" +msgstr "Neplatná srclib metadata: neznámý klíč ‚{key}‘ v ‚{file}‘" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid versionCode: \"{versionCode}\" is not an integer!" -msgstr "" +msgstr "Neplatný versionCode: „{versionCode}“ není celé číslo!" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" -msgstr "" +msgstr "Podpis JAR se nepodařilo ověřit: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" -msgstr "" +msgstr "Ověření podpisu JAR: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" -msgstr "" +msgstr "Soubor Java JAR" #: ../fdroidserver/publish.py ../fdroidserver/update.py #: ../fdroidserver/mirror.py msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "" +msgstr "Java JDK nenalezeno! Nainstalujte jej do standardního umístění nebo nastavte java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" -msgstr "" +msgstr "Zkompilovaná třída Java" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" -msgstr "" +msgstr "Java jarsigner nebyl nalezen! Nainstalujte jej do standardního umístění nebo nastavte java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" -msgstr "" +msgstr "Javascript v atributech HTML src" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "" +msgstr "Uchovávání neúspěšného sestavení „{apkfilename}“" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" -msgstr "" +msgstr "Úložiště klíčů pro podpisový klíč:\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "" +msgstr "Poslední použitá revize ‚{commit}‘ vypadá jako značka, ale UpdateCheckMode je ‚{ucm}‘" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" -msgstr "" +msgstr "Darovací metody Liberapay patří do pole Liberapay:" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the LiberapayID flag" -msgstr "" +msgstr "Darovací metody Liberapay patří do příznaku LiberapayID" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted" -msgstr "" +msgstr "Seznam souborů, které budou přeformátovány" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" -msgstr "" +msgstr "Seznam souborů, které budou přeformátovány (zkušební provoz)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" -msgstr "" +msgstr "Překlad obsažený v URL f-droid.org" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" -msgstr "" +msgstr "Zastavení sestavování při výjimkách" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." -msgstr "" +msgstr "Poškozené mirrory repozitáře." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" -msgstr "" +msgstr "Poškozený řádek serverwebroot:" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." -msgstr "" +msgstr "Zrcadlení celého repozitáře a archivu, všechny typy souborů." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" -msgstr "" +msgstr "Chybějící výstupní adresář" #: ../fdroidserver/lint.py #, python-format msgid "Name '%s' is just the auto name - remove it" -msgstr "" +msgstr "Název ‚%s‘ je pouze automatický název - odstraňte jej" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." -msgstr "" +msgstr "Nenalezen soubor 'config.yml', použito výchozí nastavení." #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" -msgstr "" +msgstr "Žádné APK pro balíček: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" -msgstr "" +msgstr "Nebylo nalezeno Android SDK!" #: ../fdroidserver/import.py msgid "No android or kivy project could be found. Specify --subdir?" -msgstr "" +msgstr "Nepodařilo se najít žádný projekt Android nebo Kivy. Specifikujte --subdir?" #: ../fdroidserver/install.py msgid "No attached devices found" -msgstr "" +msgstr "Nebyla nalezena žádná připojená zařízení" #: ../fdroidserver/metadata.py #, python-brace-format msgid "No commit specified for {versionName} in {linedesc}" -msgstr "" +msgstr "Pro {versionName} není uvedena žádná revize v {linedesc}" #: ../fdroidserver/common.py msgid "No config.yml found, using defaults." -msgstr "" +msgstr "Nenalezen config.yml, použito výchozí nastavení." #: ../fdroidserver/index.py msgid "No fingerprint in URL." -msgstr "" +msgstr "V adrese URL není otisk prstu." #: ../fdroidserver/common.py msgid "No git submodules available" -msgstr "" +msgstr "Nejsou k dispozici žádné submoduly git" #: ../fdroidserver/import.py msgid "No gradle project could be found. Specify --subdir?" -msgstr "" +msgstr "Nebyl nalezen žádný projekt gradle. Specifikujte --subdir?" #: ../fdroidserver/import.py ../fdroidserver/common.py msgid "No information found." -msgstr "" +msgstr "Nebyly nalezeny žádné informace." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" -msgstr "" +msgstr "Nebyly nalezeny žádné odpovídající štítky" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "" +msgstr "V {0} nebyla nalezena minimální verze SDK, použita výchozí (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" -msgstr "" +msgstr "Není třeba uvádět, že aplikace je svobodný software" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" -msgstr "" +msgstr "Není třeba uvádět, že je aplikace určena pro Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" -msgstr "" +msgstr "Není nastavena žádná možnost! Upravte svůj config.yml a nastavte alespoň jedno z těchto:" #: ../fdroidserver/common.py msgid "No packages specified" -msgstr "" +msgstr "Nebyly zadány žádné balíčky" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" -msgstr "" +msgstr "Žádné podepsané APK k dispozici pro %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" -msgstr "" +msgstr "Žádný podepsaný výstupní adresář - není co dělat" #: ../fdroidserver/update.py ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" -msgstr "" +msgstr "Nenalezeny žádné podpisové certifikáty v {path}" #: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" -msgstr "" +msgstr "Žádný takový balíček: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" -msgstr "" +msgstr "Žádný takový versionCode {versionCode} pro aplikaci {appid}" #: ../fdroidserver/checkupdates.py msgid "No tags found" -msgstr "" +msgstr "Nebyly nalezeny žádné značky" #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" -msgstr "" +msgstr "Žádný nepodepsaný adresář - není co dělat" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" -msgstr "" +msgstr "Neplatná definice velikosti: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" -msgstr "" +msgstr "Není co dělat" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." -msgstr "" +msgstr "Pro {appid} není co dělat." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" -msgstr "" +msgstr "Nyní nastavte následující v config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" -msgstr "" +msgstr "Soubor OBB má novější versionCode({integer}) než jakýkoli APK:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" -msgstr "" +msgstr "Název souboru OBB musí začínat s \"main.\" nebo \"patch.\":" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" -msgstr "" +msgstr "Packagename souboru OBB neodpovídá podporovanému souboru APK:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" +msgstr "Offline počítač, přeskočení generování mirroru git až do `fdroid deploy`" #: ../fdroidserver/common.py #, python-brace-format msgid "Old APK signature failed to verify: {path}" -msgstr "" +msgstr "Starý podpis APK se nepodařilo ověřit: {path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Old, deprecated name for fdroid deploy" From 718e40562776f4bcffd1d85823232aa43d6d7685 Mon Sep 17 00:00:00 2001 From: Fjuro Date: Wed, 24 Aug 2022 19:08:01 +0000 Subject: [PATCH 0720/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 54.9% (336 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ --- locale/cs/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index fccf976a..17fd3d53 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-08-24 17:32+0000\n" +"PO-Revision-Date: 2022-08-24 19:14+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" @@ -1410,7 +1410,7 @@ msgstr "Starý podpis APK se nepodařilo ověřit: {path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Old, deprecated name for fdroid deploy" -msgstr "" +msgstr "Starý, zastaralý název pro fdroid deploy" #: ../fdroidserver/update.py #, python-brace-format From a9ea04380abf6af24df73ae712ae704fa5e9f193 Mon Sep 17 00:00:00 2001 From: Fjuro Date: Wed, 24 Aug 2022 19:23:25 +0000 Subject: [PATCH 0721/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 61.9% (379 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ --- locale/cs/LC_MESSAGES/fdroidserver.po | 88 +++++++++++++-------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 17fd3d53..7bd48a03 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-08-24 19:14+0000\n" +"PO-Revision-Date: 2022-08-24 19:49+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" @@ -1415,19 +1415,19 @@ msgstr "Starý, zastaralý název pro fdroid deploy" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" -msgstr "" +msgstr "Pro grafiku jsou podporovány pouze formáty PNG a JPEG, nalezeno: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" -msgstr "" +msgstr "Zobrazit pouze rozdíly s Obchodem Play" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" -msgstr "" +msgstr "Zpracovat pouze aplikace s automatickými aktualizacemi" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "" +msgstr "Darovací metody OpenCollective patří do pole OpenCollective:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -1436,91 +1436,91 @@ msgstr "Možnosti" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." -msgstr "" +msgstr "Uložit hlášení JSON do souboru pojmenovaného podle APK." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." -msgstr "" +msgstr "Uložit JSON do stdout." #: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py #: ../fdroidserver/update.py ../fdroidserver/signindex.py #: ../fdroidserver/checkupdates.py msgid "Outputting JSON" -msgstr "" +msgstr "Ukládání výstupu JSON" #: ../fdroidserver/import.py msgid "Overall license of the project." -msgstr "" +msgstr "Celková licence projektu." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "" +msgstr "Přepisování prázdného versionName v {apkfilename} z metadat: {version}" #: ../fdroidserver/import.py #, python-brace-format msgid "Package \"{appid}\" already exists" -msgstr "" +msgstr "Balíček „{appid}“ již existuje" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" -msgstr "" +msgstr "Parsování manifestu v ‚{path}‘" #: ../fdroidserver/common.py msgid "Password required with username" -msgstr "" +msgstr "Vyžadováno heslo s uživatelským jménem" #: ../fdroidserver/import.py msgid "Path to main Android project subdirectory, if not in root." -msgstr "" +msgstr "Cesta k hlavnímu podadresáři projektu Android, pokud není v kořenovém adresáři." msgid "Path to main android project subdirectory, if not in root." -msgstr "" +msgstr "Cesta k hlavnímu podadresáři projektu android, pokud není v kořenovém adresáři." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" -msgstr "" +msgstr "Cesta k Android SDK (někdy nastavena v ANDROID_HOME)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" -msgstr "" +msgstr "Cesta ke git repozitáři k použití jako protokol" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" -msgstr "" +msgstr "Cesta k úložišti klíčů pro podpisový klíč repozitáře" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" -msgstr "" +msgstr "Zobrazit tajnou proměnnou v terminálu pro jednoduché kopírování/vložení" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" -msgstr "" +msgstr "Problém s popisem {appid}: {error}" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" -msgstr "" +msgstr "Problém s xml v '{path}'" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" -msgstr "" +msgstr "Zpracovat auto-aktualizace" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" -msgstr "" +msgstr "Zpracování {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" -msgstr "" +msgstr "Zpracování {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" -msgstr "" +msgstr "Vytváření lidsky čitelných souborů XML/JSON pro indexové soubory" #: ../fdroidserver/update.py msgid "Produce human-readable index.xml" @@ -1528,25 +1528,25 @@ msgstr "Vytvořit člověku čitelný index.xml" #: ../fdroidserver/import.py msgid "Project URL to import from." -msgstr "" +msgstr "Adresa URL projektu, ze které se má importovat." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" -msgstr "" +msgstr "Mělo by být vyvarováno interpunkce" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" -msgstr "" +msgstr "Odeslat protokol do tohoto vzdáleného git repozitáře" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Pushing binary transparency log to {url}" -msgstr "" +msgstr "Odeslání protokolu binární průhlednosti do {url}" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Pushing to {url}" -msgstr "" +msgstr "Odesílání do {url}" #: ../fdroid ../fdroidserver/__main__.py msgid "Quickly start a new repository" @@ -1559,37 +1559,37 @@ msgstr "Přečtěte si všechny soubory metadat a ukončete" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" -msgstr "" +msgstr "Čtení ‚{config_file}‘" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading minSdkVersion failed: \"{apkfilename}\"" -msgstr "" +msgstr "Čtení minSdkVersion selhalo: „{apkfilename}“" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" -msgstr "" +msgstr "Čtení packageName/versionCode/versionName se nezdařilo, APK nepatné: ‚{apkfilename}‘" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" -msgstr "" +msgstr "Čtení {apkfilename} z mezipaměti" #: ../fdroidserver/stats.py msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." -msgstr "" +msgstr "Přepočítat souhrnné statistiky - používá se, pokud byly provedeny změny, které by zneplatnily stará data uložená v mezipaměti." #: ../fdroidserver/common.py msgid "Removing specified files" -msgstr "" +msgstr "Odebírání určených souborů" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "Odebírání {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -1597,28 +1597,28 @@ msgstr "Přejmenujte soubory APK, které se neshodují s package.name_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "Režim aktualizace RepoTrunk má smysl pouze v repozitářích git-svn" #: ../fdroidserver/update.py msgid "Report on build data status" -msgstr "" +msgstr "Hlášení o stavu dat sestavení" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" +msgstr "Resetovat a vytvořit zcela nový server sestavení, i když se stávající zdá být v pořádku." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" -msgstr "" +msgstr "Opětovné podepisování {apkfilename} s poskytnutým debug.keystore" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" -msgstr "" +msgstr "Změnit velikost všech ikon přesahujících maximální velikost pixelů a ukončit aplikaci" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" -msgstr "" +msgstr "Omezit výstup na varování a chyby" #: ../fdroid ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1626,7 +1626,7 @@ msgstr "Přepsat všechny soubory metadat" #: ../fdroidserver/rewritemeta.py msgid "Rewrite to a specific format: " -msgstr "" +msgstr "Přepis do určitého formátu: " #: ../fdroidserver/rewritemeta.py #, python-brace-format From 0446dd8f11fb2454cca9ae481c47809f1f797c0a Mon Sep 17 00:00:00 2001 From: Fjuro Date: Wed, 24 Aug 2022 20:11:12 +0000 Subject: [PATCH 0722/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 66.0% (404 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ --- locale/cs/LC_MESSAGES/fdroidserver.po | 56 +++++++++++++-------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 7bd48a03..17002bf7 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-08-24 19:49+0000\n" +"PO-Revision-Date: 2022-08-24 20:35+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" @@ -1631,33 +1631,33 @@ msgstr "Přepis do určitého formátu: " #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" -msgstr "" +msgstr "Přepisování ‚{appid}‘" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}' to '{path}'" -msgstr "" +msgstr "Přepisování ‚{appid}‘ na ‚{path}‘" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" -msgstr "" +msgstr "Spustit v repozitáři git s nezveřejněnými změnami" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" -msgstr "" +msgstr "Spustit rewritemeta pro opravu formátování" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Running first pass with MD5 checking disabled" -msgstr "" +msgstr "Spuštění prvního průchodu s vypnutou kontrolou MD5" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" -msgstr "" +msgstr "Spouštění wget v {path}" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "" +msgstr "Oskenovat výsledná APK, zda neobsahují známé nesvobodné třídy." #: ../fdroid ../fdroidserver/__main__.py msgid "Scan the source code of a package" @@ -1666,54 +1666,54 @@ msgstr "Naskenujte zdrojový kód balíčku" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" -msgstr "" +msgstr "Skener našel {count} problémů v {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" -msgstr "" +msgstr "Skener našel {count} problémů v {appid}:{versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Skener našel {} problém" +msgstr[1] "Skener našel {} problémy" +msgstr[2] "Skener našel {} problémů" #: ../fdroidserver/scanner.py msgid "Scanning APK with apkanalyzer for known non-free classes." -msgstr "" +msgstr "Skenování APK pomocí apkanalyzer pro známé nesvobodné třídy." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "" +msgstr "Nastavit NDK {release} ({version})" #: ../fdroidserver/common.py msgid "Set clock to that time using:" -msgstr "" +msgstr "Nastavit hodiny na daný čas pomocí:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "" +msgstr "Nastavit maximální počet vydání před archivací starších" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" -msgstr "" +msgstr "Nastavit limit otevřených souborů na {integer}" #: ../fdroid ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" -msgstr "" +msgstr "Nastavit sestavení aplikace pro nightly sestavení repozitáře" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " -msgstr "" +msgstr "Nastavení limitu otevřených souborů se nezdařilo: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" -msgstr "" +msgstr "Nastavení časového limitu {0} sek pro toto sestavení" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" @@ -1725,37 +1725,37 @@ msgstr "Podepsat indexy vytvořené pomocí aktualizace -- nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" -msgstr "" +msgstr "Přeskočení kontroly zdrojového kódu binárních souborů a dalších problémů" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" -msgstr "" +msgstr "Přeskakování ‚{apkfilename}‘ s neplatným podpisem!" #: ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "Přeskakování mirroru GitLab Pages, protože je repozitář příliš velký (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" -msgstr "" +msgstr "Přeskakování generování indexu pro {appid}" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" -msgstr "" +msgstr "Přeskakování {apkfilename} s neplatným podpisem!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" -msgstr "" +msgstr "Přeskakování {appid}: zakázáno" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: no builds specified" -msgstr "" +msgstr "Přeskakování {appid}: nebyla uvedena žádná sestavení" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Specify a local folder to sync the repo to" From d8a1e9fdc055d1edbcf0ac0c6cb70569b1ac686b Mon Sep 17 00:00:00 2001 From: Fjuro Date: Thu, 25 Aug 2022 13:16:21 +0000 Subject: [PATCH 0723/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 83.6% (512 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ --- locale/cs/LC_MESSAGES/fdroidserver.po | 223 +++++++++++++------------- 1 file changed, 115 insertions(+), 108 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 17002bf7..d1014cab 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-08-24 20:35+0000\n" +"PO-Revision-Date: 2022-08-26 07:18+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" @@ -1759,112 +1759,112 @@ msgstr "Přeskakování {appid}: nebyla uvedena žádná sestavení" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Specify a local folder to sync the repo to" -msgstr "" +msgstr "Určete místní složku, do které chcete synchronizovat repozitář" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Specify an identity file to provide to SSH for rsyncing" -msgstr "" +msgstr "Určete soubor identity k poskytnutí pro SSH pro rsyncing" #: ../fdroidserver/build.py msgid "Specify that we're running on the build server" -msgstr "" +msgstr "Určete, že běžíme na serveru sestavení" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." -msgstr "" +msgstr "Určete, který ladicí soubor úložiště klíčů se má použít." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" -msgstr "" +msgstr "Zobrazovat ještě více informací než normálně" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Striping mystery signature from {apkfilename}" -msgstr "" +msgstr "Oděbírání tajemného podpisu z {apkfilename}" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" -msgstr "" +msgstr "Odstraňování tajemného podpisu z {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" -msgstr "" +msgstr "Shrnutí ‚%s‘ je pouze název aplikace" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" -msgstr "" +msgstr "Souhrn délky {length} je nad limitem {limit} znaků" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" -msgstr "" +msgstr "Systémové hodiny jsou starší než datum v {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" +msgstr "Režim aktualizace štítků v současné době funguje pouze pro repozitáře git, hg, bzr a git-svn" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" +msgstr "Režim aktualizace pomocí značek se používá v git-svn, ale repozitář nebyl nastaven se značkami" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." -msgstr "" +msgstr "Testovací režim - výstup se ukládá pouze do adresáře tmp a vždy se sestavuje, i když výstup již existuje." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" -msgstr "" +msgstr "Kód verze OBB musí být uveden za „{name}.“:" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" -msgstr "" +msgstr "Základní URL repozitáře k logování (výchozí: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" -msgstr "" +msgstr "Adresář, do kterého se má zapsat mirror" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" -msgstr "" +msgstr "Soubor, který má být zahrnut do repozitáře (cesta nebo glob)" #: ../fdroidserver/deploy.py msgid "The only commands currently supported are 'init' and 'update'" -msgstr "" +msgstr "V současné době jsou podporovány pouze příkazy 'init' a 'update'" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." -msgstr "" +msgstr "Otisk prstu repozitáře se neshoduje." #: ../fdroidserver/common.py msgid "The repository's index could not be verified." -msgstr "" +msgstr "Index repozitáře nebylo možné ověřit." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" -msgstr "" +msgstr "Kořenový adresář pro local_copy_dir „{path}“ neexistuje!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" -msgstr "" +msgstr "Došlo ke kolizi keyalias – publikování zastaveno" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." -msgstr "" +msgstr "Aplikace, které byly archivovány z hlavního repozitáře." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" +msgstr "Toto je repozitář aplikací, který lze používat s aplikací F-Droid. Aplikace v tomto repozitáři jsou buď oficiální binární soubory sestavené původními vývojáři aplikací, nebo binární soubory sestavené ze zdrojových kódů správcem f-droid.org pomocí nástrojů na adrese https://gitlab.com/fdroid." #: ../fdroidserver/import.py #, python-format msgid "This repo already has local metadata: %s" -msgstr "" +msgstr "Tento repozitář již má místní metadata: %s" #: ../fdroidserver/init.py #, python-format @@ -1877,50 +1877,57 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" +"Chcete-li dokončit nastavení, přidejte soubory APK na adresu \"%s\".\n" +"poté spusťte příkaz „fdroid update -c; fdroid update“. Možná budete chtít také upravit\n" +"„config.yml“, abyste nastavili adresu URL, název repozitáře a další údaje. Měli byste také nastavit\n" +"podpisový klíč (dočasný klíč již mohl být vygenerován automaticky).\n" +"\n" +"Další informace: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"a https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" +msgstr "Chcete-li používat awsbucket, musí být v souboru config.yml nastaven také awssecretkey a awsaccesskeyid!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" -msgstr "" +msgstr "URL musí začínat s https:// nebo http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" -msgstr "" +msgstr "Zkracovače URL by neměly být používány" #: ../fdroidserver/metadata.py msgid "URL title is just the URL, use brackets: [URL]" -msgstr "" +msgstr "Název URL je pouze URL, použijte závorky: [URL]" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" -msgstr "" +msgstr "URL {url} v popisu: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "" +msgstr "Neočekávaná licenční značka „{}“! Používejte pouze značky schválené FSF nebo OSI z https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "" +msgstr "Neočekávaná licenční značka „{}“! Používejte pouze licenční značky nakonfigurované v konfiguračním souboru" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" +msgstr "Neočekávaný cíl symlinku: {link} -> {target}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" -msgstr "" +msgstr "Neočekávaný text na stejném řádku jako {field} v {linedesc}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "" +msgstr "Neznámá položka {key} in {configname}" #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" @@ -1930,115 +1937,115 @@ msgstr "Došlo k neznámé chybě!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" -msgstr "" +msgstr "Neznámý soubor ‚{filename}‘ v sestavení ‚{versionName}‘" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" -msgstr "" +msgstr "Neznámý formát metadat: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path}" -msgstr "" +msgstr "Neznámý formát metadat: {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" -msgstr "" +msgstr "Neznámý formát metadat: {path} (použijte: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " -msgstr "" +msgstr "Neznámá verze aapt, může způsobit problémy: " #: ../fdroidserver/lint.py msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "" +msgstr "Neodlinkovaný odkaz - použijte [http://foo.bar Název odkazu] nebo [http://foo.bar]" #: ../fdroidserver/lint.py msgid "Unnecessary leading space" -msgstr "" +msgstr "Zbytečná úvodní mezera" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" -msgstr "" +msgstr "Zbytečná mezera na konci" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" -msgstr "" +msgstr "Nerozpoznané pole aplikace ‚{fieldname}‘ v ‚{path}‘" #: ../fdroidserver/metadata.py msgid "Unrecognised app field: " -msgstr "" +msgstr "Nerozpoznané pole aplikace: " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" -msgstr "" +msgstr "Nerozpoznaný příznak sestavení ‚{build_flag}‘ v ‚{path}‘" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised field '{field}' in {linedesc}" -msgstr "" +msgstr "Nerozpoznané pole ‚{field}‘ v {linedesc}" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" -msgstr "" +msgstr "Nepodporovaný typ souboru „{extension}“ pro grafiku repozitáře" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" -msgstr "" +msgstr "Nalezen nepodporovaný soubor grafiky: {path}" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Unsupported metadata format, use: --to [{supported}]" -msgstr "" +msgstr "Nepodporovaný formát metadat, použijte: --to [{supported}]" #: ../fdroidserver/metadata.py msgid "Unterminated ]" -msgstr "" +msgstr "Neukončeno]" #: ../fdroidserver/metadata.py msgid "Unterminated ]]" -msgstr "" +msgstr "Neukončeno ]]" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unterminated build in {name}" -msgstr "" +msgstr "Neukončené sestavení v {name}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unterminated continuation in {name}" -msgstr "" +msgstr "Neukončené pokračování v {name}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" -msgstr "" +msgstr "Nepoužitý extlib na %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" -msgstr "" +msgstr "Nepoužitý soubor na %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" -msgstr "" +msgstr "Nepoužitá cesta scandelete: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" -msgstr "" +msgstr "Nepoužitá cesta scanignore: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "Rozbalování do %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -2054,45 +2061,45 @@ msgstr "Aktualizovat statistiky repozitáře" #: ../fdroidserver/update.py ../fdroidserver/build.py msgid "Update the wiki" -msgstr "" +msgstr "Aktualizovat wiki" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" -msgstr "" +msgstr "UpdateCheckData má neplatnou URL: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" -msgstr "" +msgstr "UpdateCheckData musí používat HTTPS URL: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" -msgstr "" +msgstr "UpdateCheckData není platná URL: {url}" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" -msgstr "" +msgstr "UpdateCheckMode je nastaven, ale vypadá to, že checkupdates ještě nebylo spuštěno" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID - it can be removed" -msgstr "" +msgstr "UpdateCheckName je nastaveno na známé ID aplikace - lze jej odstranit" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "" +msgstr "UpdateCheckName je nastaveno na známé ID aplikace, lze jej odstranit" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" -msgstr "" +msgstr "Nahrávání {apkfilename} na androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" -msgstr "" +msgstr "Nahrávání {apkfilename} na virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2107,46 +2114,46 @@ msgstr "Použití: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" +msgstr "Použijte /HEAD místo /master k ukázání na soubor ve výchozí větvi" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." -msgstr "" +msgstr "K vytvoření použijte `fdroid update -c`." #: ../fdroidserver/build.py msgid "Use build server" -msgstr "" +msgstr "Použít server pro sestavení" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" +msgstr "Pro nově přidaná APK použít datum z APK místo aktuálního času" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." -msgstr "" +msgstr "Používám „{path}“ pro konfiguraci s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" -msgstr "" +msgstr "Používám APK Signature v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" -msgstr "" +msgstr "Používám APK Signature v3" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" -msgstr "" +msgstr "Používám jarsigner Javy, není doporučeno pro ověřování APK! Použijte apksigner" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" -msgstr "" +msgstr "Používám androguard z „{path}“" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" -msgstr "" +msgstr "Používám existující keystore „{path}“" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -2159,7 +2166,7 @@ msgstr "Platné příkazy jsou:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." -msgstr "" +msgstr "Ověřit proti lokálně uložené kopii místo opětovného stahování." #: ../fdroid ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" @@ -2167,12 +2174,12 @@ msgstr "Ověřte integritu stažených balíčků" #: ../fdroidserver/index.py msgid "Verifying index signature:" -msgstr "" +msgstr "Ověřování podpisu indexu:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "" +msgstr "Klíč API VirusTotal neumožňuje nahrávání souborů větších než 32 MB, k nahrání {path} použijte {url}." #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" @@ -2184,32 +2191,32 @@ msgstr "" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "" +msgstr "Při lintingu celého úložiště je yamllint ve výchozím nastavení zakázán. Tato volba vynucuje yamllint bez ohledu na to." msgid "X.509 'Distiguished Name' used when generating keys" -msgstr "" +msgstr "X.509 'Distiguished Name' používané při generování klíčů" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" -msgstr "" +msgstr "X.509 'Distinguished Name' používané při generování klíčů" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" -msgstr "" +msgstr "Pro nastavení cesty k vašemu SDK můžete použít ANDROID_HOME, např.:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" -msgstr "" +msgstr "Archiv souborů ZIP" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" -msgstr "" +msgstr "přidávám IdentityFile do {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" -msgstr "" +msgstr "přidávání do {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2225,55 +2232,55 @@ msgstr "nejednoznačná možnost: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "" +msgstr "apksigner nenalezen! Nelze podepsat nebo ověřit moderní APK" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" -msgstr "" +msgstr "apksigner nenalezen, je vyžadován k podepisování!" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py #: ../fdroidserver/checkupdates.py msgid "application ID of file to operate on" -msgstr "" +msgstr "ID aplikace nebo soubor, se kterým se má pracovat" #: ../fdroidserver/verify.py ../fdroidserver/publish.py #: ../fdroidserver/build.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" -msgstr "" +msgstr "ID aplikace s nepovinným kódem verze ve tvaru APPID[:VERCODE]" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py msgid "applicationId in the form APPID" -msgstr "" +msgstr "applicationId ve tvaru APPID" #: ../fdroidserver/checkupdates.py msgid "applicationId to check for updates" -msgstr "" +msgstr "applicationId pro kontrolu aktualizací" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/verify.py ../fdroidserver/publish.py #: ../fdroidserver/build.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" -msgstr "" +msgstr "applicationId s nepovinným versionCode ve tvaru APPID[:VERCODE]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "argument \"-\" with mode %r" -msgstr "" +msgstr "argument \"-\" s režimem %r" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" -msgstr "" +msgstr "pokus o holé připojení SSH k testování klíče pro nasazení:" #: ../fdroidserver/nightly.py msgid "attempting bare ssh connection to test deploy key:" -msgstr "" +msgstr "pokus o holé ssh připojení k testování klíče pro nasazení:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" -msgstr "" +msgstr "nelze parsovat specifikaci scrlib (není to řetězec): ‚{}‘" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2284,40 +2291,40 @@ msgstr "nelze otevřít '%s': %s" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" -msgstr "" +msgstr "nelze najít požadované srclibs: „{path}“" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "cannot have multiple subparser arguments" -msgstr "" +msgstr "nelze mít více argumentů subparseru" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" -msgstr "" +msgstr "nelze sloučit akce - dvě skupiny jsou pojmenovány %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" -msgstr "" +msgstr "nelze publikovat aktualizaci, nastavili jste klíč pro nasazení?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" -msgstr "" +msgstr "klonování {url}" #: ../fdroidserver/deploy.py msgid "command to execute, either 'init' or 'update'" -msgstr "" +msgstr "příkaz k provedení, buď 'init', nebo 'update'" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" -msgstr "" +msgstr "příkazy z modulů pluginů:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "complex" -msgstr "" +msgstr "komplexní" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From 7a243c177020cf4d6d7719e5d50ae5d0658a6593 Mon Sep 17 00:00:00 2001 From: Fjuro Date: Sat, 27 Aug 2022 10:06:57 +0000 Subject: [PATCH 0724/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 100.0% (612 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ --- locale/cs/LC_MESSAGES/fdroidserver.po | 224 +++++++++++++------------- 1 file changed, 112 insertions(+), 112 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index d1014cab..2ad9fc53 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-08-26 07:18+0000\n" +"PO-Revision-Date: 2022-08-27 18:18+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -2158,7 +2158,7 @@ msgstr "Používám existující keystore „{path}“" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" -msgstr "" +msgstr "Používám s3cmd pro synchronizaci s: {url}" #: ../fdroid ../fdroidserver/__main__.py msgid "Valid commands are:" @@ -2187,7 +2187,7 @@ msgstr "Varovat ohledně možných chyb metadat" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" -msgstr "" +msgstr "Pokud jsou nakonfigurovány podepsané indexy, vytvořit v této fázi pouze nepodepsané indexy" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." @@ -2331,104 +2331,104 @@ msgstr "komplexní" #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "konfliktní řetězec možnosti: %s" +msgstr[1] "konfliktní řetězce možnosti: %s" +msgstr[2] "konfliktní řetězce možnosti: %s" #: ../fdroidserver/nightly.py #, python-brace-format msgid "copying {apkfilename} into {path}" -msgstr "" +msgstr "kopírování {apkfilename} do {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" -msgstr "" +msgstr "nepodařilo se parsovat '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "" +msgstr "nepodařilo se parsovat srclib spec (není určen ref): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" +msgstr "nepodařilo se parsovat srclib spec (příliš mnoho značek '@'): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" -msgstr "" +msgstr "vytvořeno {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "současná verze je novější: starý vercode={old}, nový vercode={new}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" -msgstr "" +msgstr "mazání: repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed build logs to '{path}'" -msgstr "" +msgstr "protokoly sestavení nasazeny do '{path}'" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" -msgstr "" +msgstr "protokol procesu {path} nasazen do {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "dest= is required for options like %r" -msgstr "" +msgstr "dest= je vyžadován pro možnosti jako %r" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" -msgstr "" +msgstr "spustitelná binárka, případně kód" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "očekáván %s argument" +msgstr[1] "očekávány %s argumenty" +msgstr[2] "očekáváno %s argumentů" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "expected at least one argument" -msgstr "" +msgstr "očekáván alespoň jeden argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "expected at most one argument" -msgstr "" +msgstr "očekáván maximálně jeden argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "expected one argument" -msgstr "" +msgstr "očekáván jeden argument" #: ../fdroidserver/common.py #, python-brace-format msgid "failed deploying build logs to '{path}'" -msgstr "" +msgstr "nepodařilo se nasadit protokoly sestavení do '{path}'" #: ../fdroid msgid "fdroid [-h|--help|--version] []" -msgstr "" +msgstr "fdroid [-h|--help|--version] []" #: ../fdroid ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" -msgstr "" +msgstr "fdroid [] [-h|--help|--version|]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "floating-point" -msgstr "" +msgstr "floating-point" #: ../fdroidserver/metadata.py msgid "force errors to be warnings, or ignore" @@ -2436,91 +2436,91 @@ msgstr "vynutit, aby chyby byly varováními, nebo je ignorovat" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." -msgstr "" +msgstr "vynutit, aby chyby metadat (výchozí) byly varovány nebo vyly ignorovány." #: ../fdroidserver/common.py msgid "git svn clone failed" -msgstr "" +msgstr "git svn clone selhalo" #: ../fdroidserver/scanner.py msgid "gzip file archive" -msgstr "" +msgstr "archiv souborů gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "ignored explicit argument %r" -msgstr "" +msgstr "ignorován explicitní argument %r" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" -msgstr "" +msgstr "index-v1 musí mít podpis, použijte `fdroid signindex` pro jeho vytvoření!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py msgid "integer" -msgstr "" +msgstr "celé číslo" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" -msgstr "" +msgstr "neplatná hodnota %(type)s: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "" +msgstr "neplatná volba: %(value)r (vyberte si z %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" -msgstr "" +msgstr "neplatná hodnota conflict_resolution: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" -msgstr "" +msgstr "neplatný řetězec možnosti %(option)r: musí začínat znakem %(prefix_chars)r" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "poslední recept sestavení je novější: starý vercode={old}, nový vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" -msgstr "" +msgstr "local_copy_dir nekončí s \"fdroid\", možná jste měli na mysli: \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" -msgstr "" +msgstr "local_copy_dir musí být absolutní cesta!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" -msgstr "" +msgstr "local_copy_dir musí být adresář, ne soubor!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" -msgstr "" +msgstr "mirror '%s' nekončí s 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid "mutually exclusive arguments must be optional" -msgstr "" +msgstr "společně exkluzivní argumenty musí být volitelné" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" -msgstr "" +msgstr "žádná \"icon\" v {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" -msgstr "" +msgstr "neposkytnuto APK" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2530,44 +2530,44 @@ msgstr "žádná taková volba: %s" #: ../fdroid ../fdroidserver/__main__.py msgid "no version info found!" -msgstr "" +msgstr "nenalezeno info o verzi!" #: ../fdroidserver/checkupdates.py msgid "no version information found" -msgstr "" +msgstr "nenalezeny informace o verzi" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "not allowed with argument %s" -msgstr "" +msgstr "není povoleno s argumentem %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "one of the arguments %s is required" -msgstr "" +msgstr "jeden z argumentů %s je vyžadován" #: ../fdroidserver/index.py ../fdroidserver/common.py msgid "only accepts strings, lists, and tuples" -msgstr "" +msgstr "přijímá pouze řetězce, seznamy a tuply" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" +msgstr "možnost %s: pokud opravdu chcete nainstalovat všechny podepsané aplikace, použijte --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "option %s: invalid %s value: %r" -msgstr "" +msgstr "možnost %s: neplatná hodnota %s: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" +msgstr "možnost %s: neplatná volba: %r (vyberte si z %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py @@ -2613,7 +2613,7 @@ msgstr "volitelné argumenty" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" -msgstr "" +msgstr "přepisování existující {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2623,45 +2623,45 @@ msgstr "poziční argumenty" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" -msgstr "" +msgstr "proces nasazení protokolu {path} do {dest} selhal!" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "" +msgstr "odmítnout stahování přes nezabezpečené spojení HTTP (použít HTTPS nebo upřesnit --no-https-check): {apkfilename}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" -msgstr "" +msgstr "odmítnout stahování přes nezabezpečené spojení http (použít https nebo upřesnit --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "" +msgstr "repo_icon \"repo/icons/%s\" neexistuje, generování placeholderu." #: ../fdroidserver/index.py #, python-format msgid "repo_icon %s does not exist, generating placeholder." -msgstr "" +msgstr "repo_icon %s neexistuje, generování placeholderu." #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" +msgstr "ruamel.yaml není nainstalován, nelze zapisovat metadata." #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" -msgstr "" +msgstr "s3cmd sync indexes {path} do {url} a odstranit" #: ../fdroidserver/scanner.py #, python-format msgid "scanner not cleanly run apkanalyzer: %s" -msgstr "" +msgstr "skener nesprávně spustil apkanalyzer: %s" #: ../fdroidserver/scanner.py msgid "shared library" -msgstr "" +msgstr "sdílená knihovna" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -2676,33 +2676,33 @@ msgstr "zobrazí tuto nápovědu a skončí" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." -msgstr "" +msgstr "podepsané APK, buď file-path nebo HTTPS URL." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "" +msgstr "přeskočit nasazení plných protokolů sestavení: obsah protokolu je prázdný" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" -msgstr "" +msgstr "přeskočit nasazení plných protokolů sestavení: není povoleno v configu" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" -msgstr "" +msgstr "přeskakování zdrojového tarballu: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" -msgstr "" +msgstr "scribls chybí název a/nebo @" #: ../fdroidserver/scanner.py msgid "static library" -msgstr "" +msgstr "statická knihovna" #: ../fdroidserver/common.py #, python-brace-format msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" -msgstr "" +msgstr "poskytnutá hodnota timestamp '{timestamp}' není unixová timestamp" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2720,7 +2720,7 @@ msgstr "neočekávaný řetězec možností: %s" #: /usr/lib/python3.7/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "" +msgstr "neznámý parser %(parser_name)r (volby: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2745,175 +2745,175 @@ msgstr "použití: fdroid [-h|--help|--version] []" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" -msgstr "" +msgstr "používám Apache libcloud pro synchronizaci s {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "" +msgstr "virustotal.com omezuje rychlost, čekám na opětovný pokus..." #: ../fdroidserver/update.py msgid "wiki support is deprecated and will be removed in the next release!" -msgstr "" +msgstr "podpora wiki je zastaralá a bude v příštím vydání odebrána!" #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{0} aplikace, {1} aliasů klíčů" +msgstr[1] "{0} aplikace, {1} aliasů klíčů" +msgstr[2] "{0} aplikací, {1} aliasů klíčů" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" -msgstr "" +msgstr "{apkfilename} ({appid}) nemá žádná metadata!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" +msgstr "{apkfilename} má několik souborů {name}, vypadá to na exploit Master Key!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " -msgstr "" +msgstr "AndroidManifest.xml aplikace {apkfilename} má špatné datum: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." -msgstr "" +msgstr "{appid} nemá název! Používám ID aplikace." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using package name instead." -msgstr "" +msgstr "{appid} nemá název! Používám název balíčku." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android Package Name!" -msgstr "" +msgstr "{appid} z {path} není platný název balíčku Android!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" -msgstr "" +msgstr "{appid} z {path} není platné ID Android aplikace!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" -msgstr "" +msgstr "{appid} z {path} není platný název balíčku Java!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid} má APK i soubory: {files}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" -msgstr "" +msgstr "{appid} chybí {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" -msgstr "" +msgstr "{appid}: Neznámá extlib {path} v sestavení '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" -msgstr "" +msgstr "{appid}: žádná určená sestavení, běžím na současném stavu zdroje" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "" +msgstr "{appid}: {field} musí být '{type}', ale je '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" -msgstr "" +msgstr "{appid}: {field} musí být '{type}', ale je '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" -msgstr "" +msgstr "{build_flag} musí být celé číslo, nalezeno: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{field} not terminated in {name}" -msgstr "" +msgstr "{field} není terminován v {name}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" -msgstr "" +msgstr "{file} je prázdný nebo poškozený!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{path}\" does not exist! Correct it in config.yml." -msgstr "" +msgstr "{name} \"{path}\" neexistuje! Opravte jej v config.yml." #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "" +msgstr "{name} \"{section}/icons/{path}\" neexistuje! Zkontrolujte \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "{oldfile} je zastaralý, použijte {newfile}" #: ../fdroidserver/import.py #, python-brace-format msgid "{path} already exists, ignoring import results!" -msgstr "" +msgstr "{path} již existuje, ignorování importování výsledků!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" -msgstr "" +msgstr "{path} neexistuje! Vytvořte ji spuštěním:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "" +msgstr "{path} má nesprávný podpis balíčku \"{pattern}\", možný exploit Janus!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" -msgstr "" +msgstr "{path} má nulovou velikost!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" -msgstr "" +msgstr "{path} více než 200 MB, ruční nahrání: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" -msgstr "" +msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" -msgstr "" +msgstr "{url} nekončí s \"fdroid\", zkontrolujte cestu URL!" #: ../fdroidserver/common.py #, python-brace-format msgid "{url} does not start with \"http\"!" -msgstr "" +msgstr "{url} nezačíná s \"http\"!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{} sestavení selhalo" +msgstr[1] "{} sestavení selhala" +msgstr[2] "{} sestavení selhalo" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "{} sestavení úspěšné" +msgstr[1] "{} sestavení úspěšná" +msgstr[2] "{} sestavení úspěšných" From 3f6a780723a0816c902f96dd5819fbbe5b6af020 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 6 Sep 2022 16:07:59 +0200 Subject: [PATCH 0725/2116] enable Czech as official language --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index 60dedbe1..6415d387 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -21,6 +21,7 @@ include examples/template.yml include gradlew-fdroid include LICENSE include locale/bo/LC_MESSAGES/fdroidserver.po +include locale/cs/LC_MESSAGES/fdroidserver.po include locale/de/LC_MESSAGES/fdroidserver.po include locale/es/LC_MESSAGES/fdroidserver.po include locale/fr/LC_MESSAGES/fdroidserver.po From df54a01e17d789befcb8255ce9bf0b0abae597a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=2E=20R=C3=BCdinger?= Date: Sat, 26 Mar 2022 17:14:46 +0100 Subject: [PATCH 0726/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Germa?= =?UTF-8?q?n=20(de)=20by=20C.=20R=C3=BCdinger=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 98.6% (604 of 612 strings) Co-authored-by: C. Rüdinger Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 32 ++++++++++++--------------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 5fb80666..60512fc3 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -14,7 +14,7 @@ # FW , 2021. # fossdd , 2021. # Ceeee , 2021. -# C. Rüdinger , 2021. +# C. Rüdinger , 2021, 2022. # VfBFan , 2021. # Roman Leo , 2021. # Follpvosten , 2021. @@ -23,10 +23,9 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-02-16 18:56+0000\n" -"Last-Translator: marzzzello \n" -"Language-Team: German \n" +"PO-Revision-Date: 2022-02-22 21:46+0000\n" +"Last-Translator: C. Rüdinger \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -465,7 +464,7 @@ msgstr "Built-Repo basiert in „%s” auf der Konfiguration von:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "Auto-Update der App ohne CurrentVersionCode nicht möglich" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -1180,12 +1179,12 @@ msgstr "Ungültige APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "Ungültiger AutoUpdateMode: {mode}" #: ../fdroidserver/checkupdates.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "Ungültiger Paketname {0}" +msgstr "Ungültiger UpdateCheckMode: {mode}" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format @@ -1247,7 +1246,7 @@ msgstr "Ungültiger Name für die veröffentlichte Datei: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "Ungültiger ndk: Eintrag in Build: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format @@ -1345,9 +1344,8 @@ msgid "List files that would be reformatted" msgstr "Dateien listen, die reformatiert würden" #: ../fdroidserver/rewritemeta.py -#, fuzzy msgid "List files that would be reformatted (dry run)" -msgstr "Dateien listen, die reformatiert würden" +msgstr "Dateien listen, die reformatiert würden (Probelauf)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" @@ -1428,9 +1426,8 @@ msgid "No information found." msgstr "Keine Informationen gefunden." #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No matching tags found" -msgstr "Keine Informationen gefunden." +msgstr "Keine passenden Tags gefunden." #: ../fdroidserver/update.py #, python-brace-format @@ -1481,9 +1478,8 @@ msgid "No such versionCode {versionCode} for app {appid}" msgstr "Kein Versionscode {versionCode} für App {appid}" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No tags found" -msgstr "Keine angeschlossenen Geräte gefunden" +msgstr "Keine Tags gefunden" #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" @@ -1834,7 +1830,7 @@ msgstr "APK mit apkanalyzer nach bekannten nicht-quelloffenen Klassen scannen." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "" +msgstr "NDK {release} ({version}) einrichten" #: ../fdroidserver/common.py msgid "Set clock to that time using:" @@ -2058,7 +2054,7 @@ msgstr "" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" -msgstr "Die URL muss mit https:// oder http:// beginnen" +msgstr "URL muss mit https:// oder http:// beginnen" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" From 4d77d170f17851eab700c3c59b6736300694f518 Mon Sep 17 00:00:00 2001 From: ssantos Date: Sat, 26 Mar 2022 17:14:47 +0100 Subject: [PATCH 0727/2116] Translated using Weblate: German (de) by ssantos Currently translated at 99.5% (609 of 612 strings) Co-authored-by: ssantos Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 60512fc3..3c6747f4 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -18,13 +18,14 @@ # VfBFan , 2021. # Roman Leo , 2021. # Follpvosten , 2021. +# ssantos , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-02-22 21:46+0000\n" -"Last-Translator: C. Rüdinger \n" +"PO-Revision-Date: 2022-02-23 21:29+0000\n" +"Last-Translator: ssantos \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -1735,7 +1736,7 @@ msgstr "" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "Der RepoTrunk-Aktualisierungsmodus ist nur bei git-svn-Paketquellen sinnvoll" #: ../fdroidserver/update.py msgid "Report on build data status" @@ -1881,7 +1882,7 @@ msgstr "Überspringen von '{apkfilename}' mit ungültiger Signatur!" #: ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "GitLab Pages Mirror wird übersprungen, da das Repo zu groß ist (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format @@ -1956,11 +1957,11 @@ msgstr "Die System-Uhr ist älter als das Datum in {path}!" msgid "" "Tags update mode only works for git, hg, bzr and git-svn repositories " "currently" -msgstr "" +msgstr "Der Aktualisierungsmodus funktioniert derzeit nur für Git-, Hg-, Bzr- und Git-SVN-Paketquellen" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" +msgstr "Aktualisierungsmodus mit Tags in git-svn verwendet, aber das Repo wurde nicht mit Tags eingerichtet" #: ../fdroidserver/build.py msgid "" @@ -2088,7 +2089,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" +msgstr "Unerwartetes Symlink-Ziel: {link} -> {target}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2696,9 +2697,9 @@ msgstr "" "%(prefix_chars)r beginnen" #: ../fdroidserver/checkupdates.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "Das neueste Build-Rezept ist neuer: alter Vercode={old}, neuer Vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format From 460d50fc3e0cd1361b063809546f23dd4bd38d86 Mon Sep 17 00:00:00 2001 From: nautilusx Date: Sat, 26 Mar 2022 17:14:48 +0100 Subject: [PATCH 0728/2116] Translated using Weblate: German (de) by nautilusx Currently translated at 100.0% (612 of 612 strings) Co-authored-by: nautilusx Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 3c6747f4..8e1325e3 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ # Predatorix Phoenix , 2021. # cheese1 , 2021. # Aleph Null , 2021. -# nautilusx , 2021. +# nautilusx , 2021, 2022. # forght , 2021. # TobiGr , 2021. # FW , 2021. @@ -24,15 +24,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-02-23 21:29+0000\n" -"Last-Translator: ssantos \n" +"PO-Revision-Date: 2022-03-01 21:48+0000\n" +"Last-Translator: nautilusx \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 4.11.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -1428,7 +1428,7 @@ msgstr "Keine Informationen gefunden." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" -msgstr "Keine passenden Tags gefunden." +msgstr "Keine passenden Tags gefunden" #: ../fdroidserver/update.py #, python-brace-format @@ -2044,6 +2044,13 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" +"Um die Einrichtung abzuschließen, fügen Sie Ihre APKs zu \"%s\"\n" +"und führen Sie dann \"fdroid update -c; fdroid update\" aus. Vielleicht möchten Sie auch\n" +"\"config.yml\" bearbeiten, um die URL, den Repo-Namen und mehr festzulegen. Sie sollten auch\n" +"einen Signierschlüssel einrichten (ein temporärer Schlüssel könnte automatisch generiert worden sein).\n" +"\n" +"Für weitere Informationen: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"und https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "" @@ -2697,9 +2704,9 @@ msgstr "" "%(prefix_chars)r beginnen" #: ../fdroidserver/checkupdates.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "Das neueste Build-Rezept ist neuer: alter Vercode={old}, neuer Vercode={new}" +msgstr "Neuestes Build-Rezept ist neuer: alter Vercode={old}, neuer Vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2881,7 +2888,7 @@ msgstr "s3cmd-Sync {path} indizieren auf {url} und dann löschen" #: ../fdroidserver/scanner.py #, python-format msgid "scanner not cleanly run apkanalyzer: %s" -msgstr "" +msgstr "Scanner führt apkanalyzer nicht sauber aus: %s" #: ../fdroidserver/scanner.py msgid "shared library" From fc4c87e4d6cce000de2ec26cf1cacc19f7c20775 Mon Sep 17 00:00:00 2001 From: Iago Date: Tue, 21 Jun 2022 15:09:53 +0000 Subject: [PATCH 0729/2116] Translated using Weblate: Spanish (es) by Iago Currently translated at 95.0% (582 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ --- locale/es/LC_MESSAGES/fdroidserver.po | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 13533014..c3e6731a 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -9,20 +9,21 @@ # Adolfo Jayme Barrientos , 2021. # mondstern , 2021. # Germe the fur star , 2021. +# Iago , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2021-04-03 20:26+0000\n" -"Last-Translator: Germe the fur star \n" +"PO-Revision-Date: 2022-06-21 15:32+0000\n" +"Last-Translator: Iago \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.6-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -71,7 +72,7 @@ msgid "\"%s/\" has no matching metadata file!" msgstr "¡\"%s/\" no tiene su correspondiente fichero de metadatos!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" msgstr "¡El directorio raíz para local_copy_dir \"{path}\" no existe!" @@ -110,9 +111,9 @@ msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" no es un formato reconocido, convertir a: {formats}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "\"{path}\" existe pero ¡s3cmd no está instalado!" +msgstr "\"{path}\" está firmado por una clave no permitida:" #: ../fdroidserver/common.py #, python-brace-format @@ -535,9 +536,8 @@ msgid "Couldn't find Application ID" msgstr "No se pudo encontrar el identificador de aplicación" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "Couldn't find any version information" -msgstr "No se ha podido encontrar el último nombre de versión" +msgstr "No se pudo encontrar ninguna información sobre la versión" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py @@ -697,7 +697,7 @@ msgstr "Descargar registros que no tenemos" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "Descargando %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." @@ -820,7 +820,6 @@ msgid "Failed to get APK manifest information" msgstr "Fallo al obtener la información de manifiesto APK" #: ../fdroidserver/update.py -#, fuzzy msgid "Failed to get APK signing key fingerprint" msgstr "Fallo al obtener la información de manifiesto APK" @@ -1086,7 +1085,7 @@ msgstr "APK no válido" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "ModoActualizaciónAutomática Inválido: {mode}" #: ../fdroidserver/checkupdates.py #, fuzzy, python-brace-format From f00fa6a36a29e017ce3a99ad7805ed4c1cc81a03 Mon Sep 17 00:00:00 2001 From: Iago Date: Tue, 21 Jun 2022 16:48:15 +0000 Subject: [PATCH 0730/2116] Translated using Weblate: Spanish (es) by Iago Currently translated at 96.5% (591 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ --- locale/es/LC_MESSAGES/fdroidserver.po | 30 +++++++++++++++------------ 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index c3e6731a..4b682f1b 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -15,7 +15,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-06-21 15:32+0000\n" +"PO-Revision-Date: 2022-06-21 17:33+0000\n" "Last-Translator: Iago \n" "Language-Team: Spanish \n" "Language: es\n" @@ -1317,9 +1317,8 @@ msgid "No information found." msgstr "No se encontró información." #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No matching tags found" -msgstr "No se encontró información." +msgstr "No se encontraron etiquetas coincidentes" #: ../fdroidserver/update.py #, fuzzy, python-brace-format @@ -1368,9 +1367,8 @@ msgid "No such versionCode {versionCode} for app {appid}" msgstr "No existe tal versiónCode {versionCode} para app {appid}" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No tags found" -msgstr "No se han encontrado dispositivos asociados" +msgstr "No se encontró ninguna etiqueta" #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" @@ -1597,7 +1595,7 @@ msgstr "Removiendo archivos especificados" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "Eliminando {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -1812,7 +1810,7 @@ msgstr "¡El fecha del sistema es anterior a la de {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" +msgstr "El modo de actualización de etiquetas actualmente solo funciona para repositorios de git, hg, bzr y git-svn" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" @@ -1885,6 +1883,13 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" +"Para completar la configuración, añade tus APKs a \"%s\"\n" +"después ejecuta \"fdroid update -c; fdroid update\". Puede que también quieras editar \"config.yml\" \n" +"para especificar la URL, el nombre del repositorio, y más. También debes de configurar una \n" +"llave de firmado (puede que se haya generrado automáticamente una temporal).\n" +"\n" +"ara más información: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"y https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -2362,7 +2367,7 @@ msgstr "{path} creado" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "la versión actual es más nueva: código de versión viejo={old}, código de versión nuevo={new}" #: ../fdroidserver/update.py #, python-brace-format @@ -2533,9 +2538,8 @@ msgid "no version info found!" msgstr "¡no se encontró información de la versión!" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "no version information found" -msgstr "¡no se encontró información de la versión!" +msgstr "no se encontró información de la versión" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2806,7 +2810,7 @@ msgstr "¡{appid} de {path} no es un nombre de paquete Java válido!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid} tiene tanto APKs como archivos: {files}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2890,9 +2894,9 @@ msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} mayor de 200MB, subir manualmente: {url}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path}: {error}" -msgstr "Fallo copiando {path}: {error}" +msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format From dacffbad00bd8c7d8f450bdb95fbdf58395c0672 Mon Sep 17 00:00:00 2001 From: Iago Date: Sun, 24 Jul 2022 09:52:07 +0000 Subject: [PATCH 0731/2116] Translated using Weblate: Spanish (es) by Iago Currently translated at 98.3% (602 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ --- locale/es/LC_MESSAGES/fdroidserver.po | 36 +++++++++++++-------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 4b682f1b..aa92f75f 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -10,20 +10,21 @@ # mondstern , 2021. # Germe the fur star , 2021. # Iago , 2022. +# Iago , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-06-21 17:33+0000\n" -"Last-Translator: Iago \n" +"PO-Revision-Date: 2022-07-25 10:24+0000\n" +"Last-Translator: Iago \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: ../fdroidserver/common.py msgid "" @@ -338,9 +339,9 @@ msgid "Android SDK tool {cmd} found!" msgstr "¡Se encontró la herramienta de desarrollo (SDK) {cmd}!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "¡Se encontró la herramienta de desarrollo (SDK) {cmd}!" +msgstr "¡No se encontró la herramienta {cmd} del SDK de Android!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -420,7 +421,7 @@ msgstr "Repositorio creado en \"%s\" con esta configuración:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "No se puede actualizar automáticamente, app sin CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -1035,12 +1036,12 @@ msgstr "Incluir en el espejo los archivos tarball de código fuente" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" -msgstr "" +msgstr "Incluyendo metadatos de %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" -msgstr "" +msgstr "Incluyendo metadatos de {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1147,7 +1148,7 @@ msgstr "Nombre no válido para archivo publicado: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "Ndk no válido: entrada en paquete: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format @@ -1237,9 +1238,8 @@ msgid "List files that would be reformatted" msgstr "Lista de archivos que se reformatearán" #: ../fdroidserver/rewritemeta.py -#, fuzzy msgid "List files that would be reformatted (dry run)" -msgstr "Lista de archivos que se reformatearán" +msgstr "Lista de archivos que se reformatearán (ejecución en seco)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" @@ -1275,9 +1275,9 @@ msgid "No 'config.yml' found, using defaults." msgstr "No se encontró 'config.yml', se usarán los valores predeterminados." #: ../fdroidserver/verify.py -#, fuzzy, python-format +#, python-format msgid "No APK for package: %s" -msgstr "No existe tal paquete: %s" +msgstr "No existe APK para tal paquete: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1321,9 +1321,9 @@ msgid "No matching tags found" msgstr "No se encontraron etiquetas coincidentes" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "No se encontró 'config.yml'. Se usarán los valores predeterminados." +msgstr "No se encontró una versión de SDK mínima en {0}, utilizando el valor por defecto (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1603,7 +1603,7 @@ msgstr "Cambiar el nombre de archivos APK que no coinciden con el formato packag #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "El modo de actualización RepoTrunk solo tiene sentido en repositorios git-svn" #: ../fdroidserver/update.py msgid "Report on build data status" @@ -1741,7 +1741,7 @@ msgstr "¡Ignorando '{apkfilename}' por firma no válida!" #: ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "Saltando el mirror de GitLab Pages porque el repositorio es demasiado grande (¡>%.2fGB!)" #: ../fdroidserver/update.py #, python-brace-format @@ -2493,7 +2493,7 @@ msgstr "cadena de opciones %(option)r no válida: tiene que comenzar por un car #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "la última receta de empaquetado es más nueva: vercode={old}, nuevo vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format From 5a77a08a0a0c7b6d1f4812f238ded04f36cbcb8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20Marqu=C3=ADnez=20Ferr=C3=A1ndiz?= Date: Wed, 10 Aug 2022 21:02:03 +0000 Subject: [PATCH 0732/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Spani?= =?UTF-8?q?sh=20(es)=20by=20Jaime=20Marqu=C3=ADnez=20Ferr=C3=A1ndiz=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 99.1% (607 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ --- locale/es/LC_MESSAGES/fdroidserver.po | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index aa92f75f..1993fb76 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -11,13 +11,14 @@ # Germe the fur star , 2021. # Iago , 2022. # Iago , 2022. +# Jaime Marquínez Ferrándiz , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-07-25 10:24+0000\n" -"Last-Translator: Iago \n" +"PO-Revision-Date: 2022-08-11 20:47+0000\n" +"Last-Translator: Jaime Marquínez Ferrándiz \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" @@ -1089,9 +1090,9 @@ msgid "Invalid AutoUpdateMode: {mode}" msgstr "ModoActualizaciónAutomática Inválido: {mode}" #: ../fdroidserver/checkupdates.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "Nombre de paquete no válido {0}" +msgstr "UpdateCheckMode no válido {mode}" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format @@ -1214,7 +1215,7 @@ msgstr "Javascript en atributos src de HTML src" #: ../fdroidserver/build.py #, fuzzy, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "Falló lectura de minSdkVersion: \"{apkfilename}\"" +msgstr "Conservando la compilación fallida \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" @@ -1688,7 +1689,7 @@ msgstr[1] "El escáner encontró {} problemas" #: ../fdroidserver/scanner.py #, fuzzy msgid "Scanning APK with apkanalyzer for known non-free classes." -msgstr "Escaneando los APK(s) resultantes en busca de clases no libres conocidas." +msgstr "Escaneando el APK con apkanalyzer en busca de clases no libres conocidas." #: ../fdroidserver/common.py #, python-brace-format @@ -1923,7 +1924,7 @@ msgstr "¡Etiqueta de licencia inesperada \"{}\"! Use solo etiquetas de licencia #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" +msgstr "Destino del enlace simbólico inesperado: {link} ->{target}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2051,7 +2052,7 @@ msgstr "Ruta scanignore sin uso: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "Descomprimiendo a %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -2237,9 +2238,8 @@ msgid "ambiguous option: %s (%s?)" msgstr "opción ambigua: %s (%s?)" #: ../fdroidserver/common.py -#, fuzzy msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "¡Se requiere apksigner para firmar pero no se encontró!" +msgstr "¡No se encontró apksigner! No se pueden firmar o verificar los APKs modernos" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2660,9 +2660,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sync indexa {path} a {url} y elimina" #: ../fdroidserver/scanner.py -#, python-format +#, fuzzy, python-format msgid "scanner not cleanly run apkanalyzer: %s" -msgstr "" +msgstr "El escáner no ejecutó apkanalyzer adecuadamente: %s" #: ../fdroidserver/scanner.py msgid "shared library" From ad4cb37bdb80dd25f6092c03c9f3251477df38c3 Mon Sep 17 00:00:00 2001 From: Iago Date: Wed, 10 Aug 2022 21:06:05 +0000 Subject: [PATCH 0733/2116] Translated using Weblate: Spanish (es) by Iago Currently translated at 99.1% (607 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ --- locale/es/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 1993fb76..5354246e 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -18,7 +18,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2022-08-11 20:47+0000\n" -"Last-Translator: Jaime Marquínez Ferrándiz \n" +"Last-Translator: Iago \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" @@ -1815,7 +1815,7 @@ msgstr "El modo de actualización de etiquetas actualmente solo funciona para re #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" +msgstr "El modo de actualización de etiquetas se utilizó en git-svn, pero el repositorio no se configuró con etiquetas" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." From f883c1d8e0ac5c2e262b31ba4faab2c09ac023f9 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 6 Sep 2022 14:25:33 +0000 Subject: [PATCH 0734/2116] Translated using Weblate: Spanish (es) by Hans-Christoph Steiner Currently translated at 99.1% (607 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ --- locale/es/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 5354246e..43e71096 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -3,7 +3,7 @@ # This file is distributed under the same license as the PACKAGE package. # Maximiliano Castañón , 2020. # Jo , 2020. -# Hans-Christoph Steiner , 2020, 2021. +# Hans-Christoph Steiner , 2020, 2021, 2022. # Alvaro , 2020. # Fioddor Superconcentrado , 2021. # Adolfo Jayme Barrientos , 2021. @@ -17,15 +17,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-08-11 20:47+0000\n" -"Last-Translator: Iago \n" +"PO-Revision-Date: 2022-09-06 14:30+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -1742,7 +1742,7 @@ msgstr "¡Ignorando '{apkfilename}' por firma no válida!" #: ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "Saltando el mirror de GitLab Pages porque el repositorio es demasiado grande (¡>%.2fGB!)" +msgstr "¡Saltando el mirror de GitLab Pages porque el repositorio es demasiado grande (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format From ae81c369d4180c8ac54ae06204c2b4dc92332cc0 Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Sat, 26 Mar 2022 17:14:49 +0100 Subject: [PATCH 0735/2116] Translated using Weblate: French (fr) by ButterflyOfFire Currently translated at 94.6% (579 of 612 strings) Co-authored-by: ButterflyOfFire Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 83 ++++++++++++++------------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index d42851a0..06a5a46e 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -21,7 +21,7 @@ # Madeorsk , 2021. # Adrien le Maire , 2021. # gub , 2021. -# ButterflyOfFire , 2021. +# ButterflyOfFire , 2021, 2022. # Vincent Finance , 2021. # Gavy , 2021. # lilim , 2021. @@ -33,15 +33,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2021-09-02 20:49+0000\n" -"Last-Translator: translator \n" +"PO-Revision-Date: 2022-03-26 16:14+0000\n" +"Last-Translator: ButterflyOfFire \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.8.1-dev\n" +"X-Generator: Weblate 4.12-dev\n" #: ../fdroidserver/common.py msgid "" @@ -92,7 +92,7 @@ msgstr "\"%s/\" n'a pas de fichier de métadonnées correspondant !" #: ../fdroidserver/index.py #, fuzzy, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "Le dossier racine pour local_copy_dir \"{path}\" n'existe pas !" +msgstr "« local_copy_dir » {path} n’existe pas !" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" @@ -129,9 +129,9 @@ msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" n'est pas un format accepté, convertir en : {formats}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "\"{path}\" existe mais s3cmd n'est pas installé !" +msgstr "\"{path}\" est signé avec une clé non autorisée :" #: ../fdroidserver/common.py #, python-brace-format @@ -358,7 +358,7 @@ msgstr "Outil SDK Android {cmd} trouvé !" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "Outil SDK Android {cmd} trouvé !" +msgstr "Outil Android SDK {cmd} introuvable !" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -437,8 +437,9 @@ msgid "Built repo based in \"%s\" with this config:" msgstr "Dépôt du build basé sur \"%s\" avec cette config :" #: ../fdroidserver/checkupdates.py +#, fuzzy msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "Impossible d’effectuer une mise à jour automatique d’une application sans code de version actuel." #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -556,7 +557,7 @@ msgstr "Impossible de trouver l'ID de l'application" #: ../fdroidserver/checkupdates.py #, fuzzy msgid "Couldn't find any version information" -msgstr "Impossible de trouver le nom de la dernière version" +msgstr "Impossible de trouver des informations sur la version" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py @@ -714,9 +715,9 @@ msgid "Download logs we don't have" msgstr "Télécharger les journaux que n'avons pas" #: ../fdroidserver/common.py -#, python-format +#, fuzzy, python-format msgid "Downloading %s" -msgstr "" +msgstr "Téléchargement %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." @@ -841,7 +842,7 @@ msgstr "Échoument lors de la récupération de l'information manifest de l'APK" #: ../fdroidserver/update.py #, fuzzy msgid "Failed to get APK signing key fingerprint" -msgstr "Échoument lors de la récupération de l'information manifest de l'APK" +msgstr "Échec de l’obtention de l’empreinte de la clé de signature de l’APK" #: ../fdroidserver/install.py #, python-brace-format @@ -976,7 +977,7 @@ msgstr "Recherche du Git échouée" #: ../fdroidserver/common.py #, fuzzy msgid "Git prune failed" -msgstr "Reset de Git échouée" +msgstr "Git prune a échoué" #: ../fdroidserver/common.py msgid "Git remote set-head failed" @@ -1053,14 +1054,14 @@ msgid "Include the source tarballs in the mirror" msgstr "Inclure au miroir les tarballs de source" #: ../fdroidserver/metadata.py -#, python-format +#, fuzzy, python-format msgid "Including metadata from %s@%s" -msgstr "" +msgstr "Inclure les métadonnées de %s@%s." #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "Including metadata from {path}" -msgstr "Format de métadonnée inconnu : {path}" +msgstr "Inclure les métadonnées de {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1103,14 +1104,14 @@ msgid "Invalid APK" msgstr "APK invalide" #: ../fdroidserver/checkupdates.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "AutoUpdateMode non valide : {mode}" #: ../fdroidserver/checkupdates.py #, fuzzy, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "Nom de package non valide {0}" +msgstr "UpdateCheckMode non valide : {mode}" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format @@ -1165,9 +1166,9 @@ msgid "Invalid name for published file: %s" msgstr "Nom non valide pour le fichier publié :%s" #: ../fdroidserver/common.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "Ndk non valide : entrée dans la build : « {ndk} »" #: ../fdroidserver/common.py #, python-brace-format @@ -1233,7 +1234,7 @@ msgstr "Attributs Javascript trouvée dans HTML src" #: ../fdroidserver/build.py #, fuzzy, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "La lecture de minSdkVersion a échoué : \"{apkfilename}\"" +msgstr "Conserver la version ayant échoué « {apkfilename} »" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" @@ -1297,7 +1298,7 @@ msgstr "Aucun 'config.yml' trouvée, utilisation des originales." #: ../fdroidserver/verify.py #, fuzzy, python-format msgid "No APK for package: %s" -msgstr "Aucun packet comme sa : %s" +msgstr "Pas d’APK pour le paquet: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1339,12 +1340,12 @@ msgstr "Aucune information trouvée." #: ../fdroidserver/checkupdates.py #, fuzzy msgid "No matching tags found" -msgstr "Aucune information trouvée." +msgstr "Aucune étiquette correspondante n’a été trouvée" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "Aucun 'config.yml' trouvée, utilisation des valeurs par défaut." +msgstr "Aucune version minimale du SDK trouvée dans {0}, en utilisant la valeur par défaut (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1390,7 +1391,7 @@ msgstr "Aucun code de version {versionCode} pour l'application {appid}" #: ../fdroidserver/checkupdates.py #, fuzzy msgid "No tags found" -msgstr "Aucun périphérique connecté trouvé" +msgstr "Aucune étiquette trouvée" #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" @@ -1615,9 +1616,9 @@ msgid "Removing specified files" msgstr "Suppression des fichiers spécifiés" #: ../fdroidserver/update.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "Suppression de {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -1710,7 +1711,7 @@ msgstr[1] "Le scanneur a trouvé {} problèmes" #: ../fdroidserver/scanner.py #, fuzzy msgid "Scanning APK with apkanalyzer for known non-free classes." -msgstr "Scanne le(s) APK(s) résultants pour des classes non-libres connues." +msgstr "Analyse de l’APK avec apkanalyzer pour les classes non libres connues." #: ../fdroidserver/common.py #, python-brace-format @@ -1761,9 +1762,9 @@ msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Omission de '{apkfilename}' qui a une signature non valide !" #: ../fdroidserver/index.py -#, python-format +#, fuzzy, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "Ignorer le miroir GitLab Pages car le référentiel est trop volumineux (>%.2fGo) !" #: ../fdroidserver/update.py #, python-brace-format @@ -1936,9 +1937,9 @@ msgid "Unexpected license tag \"{}\"! Only use license tags configured in your c msgstr "Balise de licence non valide \"{}\" ! Utilisez uniquement des balises de licence configurées dans votre fichier de configuration" #: ../fdroidserver/common.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" +msgstr "Cible de lien symbolique inattendue : {link} -> {target}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2066,7 +2067,7 @@ msgstr "Chemin scanignore inutilisé : %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "Décompression vers %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -2254,7 +2255,7 @@ msgstr "option ambiguë : %s (%s?)" #: ../fdroidserver/common.py #, fuzzy msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "apksigner est introuvable, il est requis pour la signature !" +msgstr "apksigner introuvable ! Impossible de signer ou de vérifier les APK modernes" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2555,7 +2556,7 @@ msgstr "aucun information de version n'a été trouvée !" #: ../fdroidserver/checkupdates.py #, fuzzy msgid "no version information found" -msgstr "aucun information de version n'a été trouvée !" +msgstr "aucune information sur la version n’a été trouvée" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2824,9 +2825,9 @@ msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} de {path} n’est pas un nom de paquet Java valide !" #: ../fdroidserver/update.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid} possède à la fois des fichiers APK et des fichiers : {files}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2910,9 +2911,9 @@ msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} supérieur à 200MB, envoi manuel : {url}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path}: {error}" -msgstr "Erreur durant la copie de {path} : {error}" +msgstr "{path} : {error}" #: ../fdroidserver/mirror.py #, python-brace-format From 8ddc1a52ae2dad73e0c6d3cc69a216fba4f4d9a7 Mon Sep 17 00:00:00 2001 From: translator Date: Fri, 20 May 2022 17:02:28 +0000 Subject: [PATCH 0736/2116] Translated using Weblate: French (fr) by translator Currently translated at 95.2% (583 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ --- locale/fr/LC_MESSAGES/fdroidserver.po | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 06a5a46e..43740662 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -28,20 +28,21 @@ # Jaxom , 2021. # booteille , 2021. # translator , 2021. +# translator , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-03-26 16:14+0000\n" -"Last-Translator: ButterflyOfFire \n" +"PO-Revision-Date: 2022-05-21 17:18+0000\n" +"Last-Translator: translator \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.13-dev\n" #: ../fdroidserver/common.py msgid "" @@ -90,9 +91,9 @@ msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" n'a pas de fichier de métadonnées correspondant !" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "« local_copy_dir » {path} n’existe pas !" +msgstr "Le dossier racine pour « local_copy_dir » {path} n’existe pas !" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" @@ -555,7 +556,6 @@ msgid "Couldn't find Application ID" msgstr "Impossible de trouver l'ID de l'application" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "Couldn't find any version information" msgstr "Impossible de trouver des informations sur la version" @@ -840,7 +840,6 @@ msgid "Failed to get APK manifest information" msgstr "Échoument lors de la récupération de l'information manifest de l'APK" #: ../fdroidserver/update.py -#, fuzzy msgid "Failed to get APK signing key fingerprint" msgstr "Échec de l’obtention de l’empreinte de la clé de signature de l’APK" @@ -975,7 +974,6 @@ msgid "Git fetch failed" msgstr "Recherche du Git échouée" #: ../fdroidserver/common.py -#, fuzzy msgid "Git prune failed" msgstr "Git prune a échoué" From 801b5b4512c1496b4ada2bf7a387c25b30ee9568 Mon Sep 17 00:00:00 2001 From: Julien Maulny Date: Mon, 13 Jun 2022 19:15:19 +0000 Subject: [PATCH 0737/2116] Translated using Weblate: French (fr) by Julien Maulny Currently translated at 96.5% (591 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ --- locale/fr/LC_MESSAGES/fdroidserver.po | 46 +++++++++++++-------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 43740662..90778676 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -29,13 +29,14 @@ # booteille , 2021. # translator , 2021. # translator , 2022. +# Julien Maulny , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-05-21 17:18+0000\n" -"Last-Translator: translator \n" +"PO-Revision-Date: 2022-06-13 19:19+0000\n" +"Last-Translator: Julien Maulny \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -357,9 +358,9 @@ msgid "Android SDK tool {cmd} found!" msgstr "Outil SDK Android {cmd} trouvé !" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "Outil Android SDK {cmd} introuvable !" +msgstr "L'outil SDK Android {cmd} n'a pas été trouvé !" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -438,9 +439,8 @@ msgid "Built repo based in \"%s\" with this config:" msgstr "Dépôt du build basé sur \"%s\" avec cette config :" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "Impossible d’effectuer une mise à jour automatique d’une application sans code de version actuel." +msgstr "Impossible de mettre à jour l'application automatiquement sans \"CurrentVersionCode\"." #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -715,9 +715,9 @@ msgid "Download logs we don't have" msgstr "Télécharger les journaux que n'avons pas" #: ../fdroidserver/common.py -#, fuzzy, python-format +#, python-format msgid "Downloading %s" -msgstr "Téléchargement %s" +msgstr "Téléchargement de %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." @@ -1023,7 +1023,7 @@ msgstr "Ignorer l'entrée FUNDING.yml supérieure à 2048 : %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " -msgstr "Ignorer le package sans métadonnées : " +msgstr "Paquet sans métadonnées ignoré : " #: ../fdroidserver/update.py #, python-brace-format @@ -1052,12 +1052,12 @@ msgid "Include the source tarballs in the mirror" msgstr "Inclure au miroir les tarballs de source" #: ../fdroidserver/metadata.py -#, fuzzy, python-format +#, python-format msgid "Including metadata from %s@%s" -msgstr "Inclure les métadonnées de %s@%s." +msgstr "Inclure les métadonnées de %s@%s" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Including metadata from {path}" msgstr "Inclure les métadonnées de {path}" @@ -1102,12 +1102,12 @@ msgid "Invalid APK" msgstr "APK invalide" #: ../fdroidserver/checkupdates.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" msgstr "AutoUpdateMode non valide : {mode}" #: ../fdroidserver/checkupdates.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" msgstr "UpdateCheckMode non valide : {mode}" @@ -1164,9 +1164,9 @@ msgid "Invalid name for published file: %s" msgstr "Nom non valide pour le fichier publié :%s" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "Ndk non valide : entrée dans la build : « {ndk} »" +msgstr "Ndk non valide : entrée dans le build : « {ndk} »" #: ../fdroidserver/common.py #, python-brace-format @@ -1355,30 +1355,30 @@ msgstr "Pas besoin de spécifier que l'application est pour Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" -msgstr "Aucune option configurer ! Éditer votre config.yml pour le mettre au moins a l'un d'eux :" +msgstr "Aucune option configurée ! Éditez votre config.yml pour définir au moins l'une d'entre elles :" #: ../fdroidserver/common.py msgid "No packages specified" -msgstr "Aucun packet spécifier" +msgstr "Aucun paquet spécifié" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" -msgstr "Aucun APK signée dispognible pour %s" +msgstr "Aucun APK signé disponible pour %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" -msgstr "Aucun dossier de sortie signée - rien n'est a faire" +msgstr "Aucun répertoire de sortie signé — il n'y a rien à faire" #: ../fdroidserver/update.py ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" -msgstr "Aucun certificat signée trouvée dans {path}" +msgstr "Aucun certificat signé trouvé dans {path}" #: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" -msgstr "Aucun packet comme sa : %s" +msgstr "Ce paquet n'existe pas : %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py @@ -1393,7 +1393,7 @@ msgstr "Aucune étiquette trouvée" #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" -msgstr "Aucun dossier signée - rien n'est a faire" +msgstr "Aucun dossier non signé — il n'y a rien à faire" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" From 020bf8c7c6ca08cab6c2a31636a7c7c812efe522 Mon Sep 17 00:00:00 2001 From: translator Date: Wed, 22 Jun 2022 20:19:28 +0000 Subject: [PATCH 0738/2116] Translated using Weblate: French (fr) by translator Currently translated at 97.3% (596 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ --- locale/fr/LC_MESSAGES/fdroidserver.po | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 90778676..f0cc4089 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -35,15 +35,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-06-13 19:19+0000\n" -"Last-Translator: Julien Maulny \n" +"PO-Revision-Date: 2022-06-23 06:12+0000\n" +"Last-Translator: translator \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -1256,9 +1256,8 @@ msgid "List files that would be reformatted" msgstr "Lister les fichiers qui seront reformater" #: ../fdroidserver/rewritemeta.py -#, fuzzy msgid "List files that would be reformatted (dry run)" -msgstr "Lister les fichiers qui seront reformater" +msgstr "Lister les fichiers qui seront reformater (test à blanc)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" @@ -1336,14 +1335,13 @@ msgid "No information found." msgstr "Aucune information trouvée." #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No matching tags found" msgstr "Aucune étiquette correspondante n’a été trouvée" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "Aucune version minimale du SDK trouvée dans {0}, en utilisant la valeur par défaut (3)." +msgstr "Aucune version minimale du SDK trouvée dans {0}, utilisation de la valeur par défaut (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1387,7 +1385,6 @@ msgid "No such versionCode {versionCode} for app {appid}" msgstr "Aucun code de version {versionCode} pour l'application {appid}" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No tags found" msgstr "Aucune étiquette trouvée" @@ -1614,7 +1611,7 @@ msgid "Removing specified files" msgstr "Suppression des fichiers spécifiés" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Removing {path}\"" msgstr "Suppression de {path}\"" From 8287e260ee3dbbac25cdbf5c0ff26a75aca10ea0 Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 23 Jun 2022 12:13:39 +0000 Subject: [PATCH 0739/2116] Translated using Weblate: French (fr) by Translator Currently translated at 97.7% (598 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ --- locale/fr/LC_MESSAGES/fdroidserver.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index f0cc4089..0fea074f 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -30,13 +30,14 @@ # translator , 2021. # translator , 2022. # Julien Maulny , 2022. +# Translator , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-06-23 06:12+0000\n" -"Last-Translator: translator \n" +"PO-Revision-Date: 2022-06-23 12:17+0000\n" +"Last-Translator: Translator \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -1293,9 +1294,9 @@ msgid "No 'config.yml' found, using defaults." msgstr "Aucun 'config.yml' trouvée, utilisation des originales." #: ../fdroidserver/verify.py -#, fuzzy, python-format +#, python-format msgid "No APK for package: %s" -msgstr "Pas d’APK pour le paquet: %s" +msgstr "Pas d’APK pour le paquet : %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1621,7 +1622,7 @@ msgstr "Renomme les fichiers APK dont le nom ne ressemble pas à nom.paquet_123. #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "Le mode de mise à jour de RepoTrunk n'a de sens seulement dans les dépôts git-svn" #: ../fdroidserver/update.py msgid "Report on build data status" From 0b2aa3eb69cd0cb03bb52fb91500451ca42d91ba Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 23 Jun 2022 12:30:58 +0000 Subject: [PATCH 0740/2116] Translated using Weblate: French (fr) by Translator Currently translated at 99.1% (607 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ --- locale/fr/LC_MESSAGES/fdroidserver.po | 37 +++++++++++++++------------ 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 0fea074f..2c3d657a 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -36,7 +36,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-06-23 12:17+0000\n" +"PO-Revision-Date: 2022-06-23 13:31+0000\n" "Last-Translator: Translator \n" "Language-Team: French \n" "Language: fr\n" @@ -419,7 +419,7 @@ msgstr "Compiler toutes les applications disponibles" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" -msgstr "Build généré par `fdroid import` - supprimer la ligne désactivée une fois prêt" +msgstr "Build généré par `fdroid import` — supprimer la ligne désactivée une fois prêt" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" @@ -441,7 +441,7 @@ msgstr "Dépôt du build basé sur \"%s\" avec cette config :" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "Impossible de mettre à jour l'application automatiquement sans \"CurrentVersionCode\"." +msgstr "Impossible de mettre à jour l'application automatiquement sans \"CurrentVersionCode\"" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -1712,7 +1712,7 @@ msgstr "Analyse de l’APK avec apkanalyzer pour les classes non libres connues. #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "" +msgstr "Installer NDK {release} ({version})" #: ../fdroidserver/common.py msgid "Set clock to that time using:" @@ -1829,11 +1829,11 @@ msgstr "L'horloge système est plus âgée que la date dans {path} !" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" +msgstr "Le mode de mise à jour des étiquettes fonctionne seulement pour dépôt git, hg, bzr et git-svn pour le moment" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" +msgstr "Le mode de mise à jour d'étiquettes utilisé dans git-svn, mais le dépôt n'était pas configuré avec des étiquettes" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." @@ -1902,6 +1902,13 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" +"Pour terminer la configuration, ajoutez vos APK dans « %s »\n" +"ensuite lancez « fdroid update -c ; fdroid update ». Vous voudriez peut-être modifier\n" +"« config.yml » pour mettre l'URL, le nom du dépôt, et plus. Vous devriez aussi configurer\n" +"une clé de signature (une clé temporaire devrait avoir été générée automatiquement).\n" +"\n" +"Pour plus d'information : https://f-droid.org/fr/docs/Setup_an_F-Droid_App_Repo\n" +"et https://f-droid.org/fr/docs/Signing_Process" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -1926,16 +1933,16 @@ msgstr "URL {url} en Description : {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "Balise de licence non valide \"{}\" ! Utilisez uniquement des balises approuvées par la FSF ou l'OSI de https ://spdx.org/license-list" +msgstr "Balise de licence non valide \"{}\" ! Utilisez uniquement des balises approuvées par la FSF ou l'OSI de https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Balise de licence non valide \"{}\" ! Utilisez uniquement des balises de licence configurées dans votre fichier de configuration" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "Cible de lien symbolique inattendue : {link} -> {target}" +msgstr "Cible du lien symbolique inattendue : {link} -> {target}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2249,7 +2256,6 @@ msgid "ambiguous option: %s (%s?)" msgstr "option ambiguë : %s (%s?)" #: ../fdroidserver/common.py -#, fuzzy msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner introuvable ! Impossible de signer ou de vérifier les APK modernes" @@ -2379,7 +2385,7 @@ msgstr "{path} a été créé" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "la version actuel est plus récente : ancien vercode={old}, nouveau vercode={new}" #: ../fdroidserver/update.py #, python-brace-format @@ -2550,7 +2556,6 @@ msgid "no version info found!" msgstr "aucun information de version n'a été trouvée !" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "no version information found" msgstr "aucune information sur la version n’a été trouvée" @@ -2821,9 +2826,9 @@ msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "{appid} de {path} n’est pas un nom de paquet Java valide !" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "{appid} possède à la fois des fichiers APK et des fichiers : {files}" +msgstr "{appid} possède à la fois des APK et des fichiers : {files}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2844,12 +2849,12 @@ msgstr "{appid} : pas de versions spécifiées, s'exécute à partir de l'éta #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "{appid}: {field} doit être un '{type}', mais est un '{fieldtype}!'" +msgstr "{appid} : {field} doit être un '{type}', mais est un '{fieldtype} !'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" -msgstr "{appid}: {field} doit être un '{type}', mais est un '{fieldtype}' !" +msgstr "{appid} : {field} doit être un '{type}', mais est un '{fieldtype}' !" #: ../fdroidserver/metadata.py #, python-brace-format From 79547d5131591a5c5727b1034c29943ceaa179ac Mon Sep 17 00:00:00 2001 From: booteille Date: Thu, 23 Jun 2022 13:23:18 +0000 Subject: [PATCH 0741/2116] Translated using Weblate: French (fr) by booteille Currently translated at 99.1% (607 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ --- locale/fr/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 2c3d657a..2b721312 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -26,7 +26,7 @@ # Gavy , 2021. # lilim , 2021. # Jaxom , 2021. -# booteille , 2021. +# booteille , 2021, 2022. # translator , 2021. # translator , 2022. # Julien Maulny , 2022. @@ -37,7 +37,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2022-06-23 13:31+0000\n" -"Last-Translator: Translator \n" +"Last-Translator: booteille \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2272,7 +2272,7 @@ msgstr "ID d'application du fichier sur lequel agir" #: ../fdroidserver/build.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" -msgstr "applicationId avec le versionCode optionnel sous la forme APPID[:VERCODE]" +msgstr "ID d'application avec le versionCode optionnel sous la forme APPID[:VERCODE]" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py msgid "applicationId in the form APPID" From 92baf98724e305b18225a2cb9e6acfb63402fc59 Mon Sep 17 00:00:00 2001 From: Ldm Public Date: Thu, 23 Jun 2022 12:18:46 +0000 Subject: [PATCH 0742/2116] Translated using Weblate: French (fr) by Ldm Public Currently translated at 99.1% (607 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ --- locale/fr/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 2b721312..a56cea71 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -31,13 +31,14 @@ # translator , 2022. # Julien Maulny , 2022. # Translator , 2022. +# Ldm Public , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-06-23 13:31+0000\n" -"Last-Translator: booteille \n" +"PO-Revision-Date: 2022-06-23 13:32+0000\n" +"Last-Translator: Ldm Public \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -1296,7 +1297,7 @@ msgstr "Aucun 'config.yml' trouvée, utilisation des originales." #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" -msgstr "Pas d’APK pour le paquet : %s" +msgstr "Aucun APK pour le paquet : %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1622,7 +1623,7 @@ msgstr "Renomme les fichiers APK dont le nom ne ressemble pas à nom.paquet_123. #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "Le mode de mise à jour de RepoTrunk n'a de sens seulement dans les dépôts git-svn" +msgstr "Le mode de mise à jour de RepoTrunk n'a de sens que pour les dépôts git-svn" #: ../fdroidserver/update.py msgid "Report on build data status" From 87cbd7c19cc822a8d78aa2a3ceae0976cd941212 Mon Sep 17 00:00:00 2001 From: Ldm Public Date: Thu, 23 Jun 2022 13:34:09 +0000 Subject: [PATCH 0743/2116] Translated using Weblate: French (fr) by Ldm Public Currently translated at 100.0% (612 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ --- locale/fr/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index a56cea71..8f1d88d5 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -37,7 +37,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-06-23 13:32+0000\n" +"PO-Revision-Date: 2022-06-23 17:27+0000\n" "Last-Translator: Ldm Public \n" "Language-Team: French \n" "Language: fr\n" @@ -1830,11 +1830,11 @@ msgstr "L'horloge système est plus âgée que la date dans {path} !" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "Le mode de mise à jour des étiquettes fonctionne seulement pour dépôt git, hg, bzr et git-svn pour le moment" +msgstr "Le mode de mise à jour par étiquettes fonctionne seulement pour les dépôts git, hg, bzr et git-svn pour le moment" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "Le mode de mise à jour d'étiquettes utilisé dans git-svn, mais le dépôt n'était pas configuré avec des étiquettes" +msgstr "Le mode de mise à jour par étiquettes est utilisé dans git-svn, mais le dépôt n'était pas paramétré avec des étiquettes" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." @@ -2386,7 +2386,7 @@ msgstr "{path} a été créé" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "la version actuel est plus récente : ancien vercode={old}, nouveau vercode={new}" +msgstr "la version actuelle est plus récente : ancien vercode={old}, nouveau vercode={new}" #: ../fdroidserver/update.py #, python-brace-format @@ -2850,7 +2850,7 @@ msgstr "{appid} : pas de versions spécifiées, s'exécute à partir de l'éta #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "{appid} : {field} doit être un '{type}', mais est un '{fieldtype} !'" +msgstr "{appid} : {field} doit être de '{type}', mais est un '{fieldtype} !'" #: ../fdroidserver/lint.py #, python-brace-format From 9dd7064eaa51926dbef3468205eef7b667aab0e6 Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 23 Jun 2022 15:27:31 +0000 Subject: [PATCH 0744/2116] Translated using Weblate: French (fr) by Translator Currently translated at 100.0% (612 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ --- locale/fr/LC_MESSAGES/fdroidserver.po | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 8f1d88d5..0958ffb2 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -38,7 +38,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2022-06-23 17:27+0000\n" -"Last-Translator: Ldm Public \n" +"Last-Translator: Translator \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -1232,7 +1232,7 @@ msgid "Javascript in HTML src attributes" msgstr "Attributs Javascript trouvée dans HTML src" #: ../fdroidserver/build.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" msgstr "Conserver la version ayant échoué « {apkfilename} »" @@ -1706,7 +1706,6 @@ msgstr[0] "Le scanneur a trouvé {} problème" msgstr[1] "Le scanneur a trouvé {} problèmes" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Analyse de l’APK avec apkanalyzer pour les classes non libres connues." @@ -1759,9 +1758,9 @@ msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Omission de '{apkfilename}' qui a une signature non valide !" #: ../fdroidserver/index.py -#, fuzzy, python-format +#, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "Ignorer le miroir GitLab Pages car le référentiel est trop volumineux (>%.2fGo) !" +msgstr "Ignorer le miroir GitLab Pages car le dépôt est trop volumineux (>%.2fGB) !" #: ../fdroidserver/update.py #, python-brace-format @@ -1986,7 +1985,7 @@ msgstr "Version inconnue de aapt, peut causer des problèmes : " #: ../fdroidserver/lint.py msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "Lien non lié - utiliser [http://foo.bar Titre du lien] ou [http://foo.bar]" +msgstr "Lien non lié — utiliser [http://foo.bar Titre du lien] ou [http://foo.bar]" #: ../fdroidserver/lint.py msgid "Unnecessary leading space" @@ -2512,7 +2511,7 @@ msgstr "chaîne d’option non valide %(option)r : doit commencer par un caract #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "la recette de la dernière version est plus récente : ancien vercode={old}, nouveau vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2681,7 +2680,7 @@ msgstr "s3cmd synchroniser les index de {path} vers {url} et les supprimer" #: ../fdroidserver/scanner.py #, python-format msgid "scanner not cleanly run apkanalyzer: %s" -msgstr "" +msgstr "l'analyseur n'a pas exécuté proprement apkanalyzer : %s" #: ../fdroidserver/scanner.py msgid "shared library" From e8e6227752b086a51a04f1a6eb1094b3e574bb52 Mon Sep 17 00:00:00 2001 From: Ldm Public Date: Sat, 25 Jun 2022 17:30:56 +0000 Subject: [PATCH 0745/2116] Translated using Weblate: French (fr) by Ldm Public Currently translated at 100.0% (612 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ --- locale/fr/LC_MESSAGES/fdroidserver.po | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 0958ffb2..bcce4b6a 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -37,8 +37,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-06-23 17:27+0000\n" -"Last-Translator: Translator \n" +"PO-Revision-Date: 2022-06-26 18:15+0000\n" +"Last-Translator: Ldm Public \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -1902,13 +1902,15 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" -"Pour terminer la configuration, ajoutez vos APK dans « %s »\n" -"ensuite lancez « fdroid update -c ; fdroid update ». Vous voudriez peut-être modifier\n" -"« config.yml » pour mettre l'URL, le nom du dépôt, et plus. Vous devriez aussi configurer\n" -"une clé de signature (une clé temporaire devrait avoir été générée automatiquement).\n" +"Pour terminer la configuration, ajoutez vos APK dans « %s ».\n" +"Ensuite lancez « fdroid update -c ; fdroid update ».\n" +"Pensez à modifier le fichier « config.yml »\n" +"pour indiquer l'URL, le nom du dépôt et d'autres éléments.\n" +"Vous devriez aussi paramétrer une clé de signature\n" +"(une clé temporaire peut avoir été générée automatiquement).\n" "\n" -"Pour plus d'information : https://f-droid.org/fr/docs/Setup_an_F-Droid_App_Repo\n" -"et https://f-droid.org/fr/docs/Signing_Process" +"Plus d'informations sur : https://f-droid.org/fr/docs/Setup_an_F-Droid_App_Repo\n" +"et https://f-droid.org/fr/docs/Signing_Process." #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" From e94a4e747702199c62f4a030c993d2b29384d842 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 6 Sep 2022 14:15:02 +0000 Subject: [PATCH 0746/2116] Translated using Weblate: Hungarian (hu) by Hans-Christoph Steiner Currently translated at 63.2% (387 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/hu/ --- locale/hu/LC_MESSAGES/fdroidserver.po | 72 +++++++++++++-------------- 1 file changed, 35 insertions(+), 37 deletions(-) diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index aeb8d2f5..83cd8568 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -1,21 +1,21 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # Balázs Meskó , 2020, 2021. -# Hans-Christoph Steiner , 2020, 2021. +# Hans-Christoph Steiner , 2020, 2021, 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2021-07-05 17:03+0000\n" -"Last-Translator: Balázs Meskó \n" +"PO-Revision-Date: 2022-09-06 14:30+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -64,9 +64,9 @@ msgid "\"%s/\" has no matching metadata file!" msgstr "A(z) „%s/” nem rendelkezik megfelelő metaadatfájllal." #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "A(z) „{path}” Android SDK elérési út nem található." +msgstr "" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" @@ -103,9 +103,9 @@ msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "A(z) „{path}” nem egy elfogadott formátum, alakítsa át erre: {formats}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "A(z) „{path}” létezik, de az s3cmd nincs telepítve." +msgstr "" #: ../fdroidserver/common.py #, python-brace-format @@ -303,7 +303,7 @@ msgstr "Android DEX kód" #: ../fdroidserver/common.py ../fdroidserver/build.py #, python-brace-format msgid "Android SDK '{path}' does not have '{dirname}' installed!" -msgstr "A(z) „{dirname}” nincs telepítve a(z) „{path}” Android SDK elérési úton." +msgstr "A(z) „{dirname}” nincs telepítve a(z) „{path}” Android SDK elérési úton!" #: ../fdroidserver/init.py #, python-brace-format @@ -312,27 +312,27 @@ msgstr "Az Android SDK nem található itt: {path}!" #: ../fdroidserver/common.py msgid "Android SDK not found!" -msgstr "Az Android SDK nem található." +msgstr "Az Android SDK nem található!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" -msgstr "A(z) „{path}” Android SDK elérési út nem található." +msgstr "A(z) „{path}” Android SDK elérési út nem található!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" -msgstr "A(z) „{path}” Android SDK elérési út nem könyvtár." +msgstr "A(z) „{path}” Android SDK elérési út nem könyvtár!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "A(z) „{cmd}” Android SDK eszköz megtalálva." +msgstr "A(z) „{cmd}” Android SDK eszköz megtalálva!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "A(z) „{cmd}” Android SDK eszköz megtalálva." +msgstr "A(z) „{cmd}” Android SDK eszköz megtalálva!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -340,7 +340,7 @@ msgstr "A(z) „{cmd}” Android SDK eszköz megtalálva." #: ../fdroidserver/common.py #, python-brace-format msgid "Android build-tools path '{path}' does not exist!" -msgstr "A(z) „{path}” Android build-tools elérési út nem létezik." +msgstr "A(z) „{path}” Android build-tools elérési út nem létezik!" #: ../fdroidserver/update.py msgid "AndroidManifest.xml has no date" @@ -358,7 +358,7 @@ msgstr "A .git hozzáfűzése nem szükséges" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" -msgstr "Az érvénytelen aláírású {apkfilename} archiválása." +msgstr "Az érvénytelen aláírású {apkfilename} archiválása!" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -492,7 +492,7 @@ msgstr "Ütköző argumentumok: a „--verbose” és a „--quite” kapcsolók #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Ütköző konfigurációs fájlok! {newfile} használata, {oldfile} mellőzése." +msgstr "Ütköző konfigurációs fájlok! {newfile} használata, {oldfile} mellőzése!" #: ../fdroidserver/common.py #, python-brace-format @@ -548,7 +548,7 @@ msgstr "A csomagazonosító nem található" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" -msgstr "A meglévő aláírókulcs-beállítás felülírása megtagadva." +msgstr "A meglévő aláírókulcs-beállítás felülírása megtagadva!" #: ../fdroidserver/update.py msgid "Create a repo signing key in a keystore" @@ -652,7 +652,7 @@ msgstr "Ne telepítse az új fájlokat a tárolóba" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" -msgstr "Ne adja hozzá a(z) „{path}” elérési utat az URL-hez." +msgstr "Ne adja hozzá a(z) „{path}” elérési utat az URL-hez!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" @@ -729,7 +729,7 @@ msgstr "" #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" -msgstr "HIBA: nem támogatott CI típus, foltokat szívesen fogadunk." +msgstr "HIBA: nem támogatott CI típus, foltokat szívesen fogadunk!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -753,7 +753,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "A(z) {configname} konfigurációból származó {var} környezeti változó nincs beállítva." +msgstr "A(z) {configname} konfigurációból származó {var} környezeti változó nincs beállítva!" #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py @@ -975,7 +975,7 @@ msgstr "A git almodul frissítése sikertelen" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" -msgstr "HTTPS-t kell használni a Subversion URL-ekhez." +msgstr "HTTPS-t kell használni a Subversion URL-ekhez!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" @@ -1082,9 +1082,9 @@ msgid "Invalid AutoUpdateMode: {mode}" msgstr "" #: ../fdroidserver/checkupdates.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "Érvénytelen csomagnév: {0}" +msgstr "" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format @@ -1171,7 +1171,7 @@ msgstr "Érvénytelen srclib metaadatok: ismeretlen „{key}” kulcs itt: „{f #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid versionCode: \"{versionCode}\" is not an integer!" -msgstr "Érvénytelen versionCode: a(z) „{versionCode}” nem egész szám." +msgstr "Érvénytelen versionCode: a(z) „{versionCode}” nem egész szám!" #: ../fdroidserver/common.py #, python-brace-format @@ -1190,7 +1190,7 @@ msgstr "Java JAR-fájl" #: ../fdroidserver/publish.py ../fdroidserver/update.py #: ../fdroidserver/mirror.py msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "A Java JDK nem található. Telepítse szabványos helyre, vagy adja meg a JAVA_PATH változókat." +msgstr "A Java JDK nem található. Telepítse szabványos helyre, vagy adja meg a java_paths változókat!" #: ../fdroidserver/scanner.py msgid "Java compiled class" @@ -1198,7 +1198,7 @@ msgstr "Legfordított Java osztály" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" -msgstr "A Java „jarsigner” nem található. Telepítse szabványos helyre, vagy adja meg a JAVA_PATH változókat." +msgstr "A Java „jarsigner” nem található. Telepítse szabványos helyre, vagy adja meg a java_paths változókat!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" @@ -1275,7 +1275,7 @@ msgstr "Nincs ilyen csomag: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" -msgstr "Nem található Android SDK." +msgstr "Nem található Android SDK!" #: ../fdroidserver/import.py msgid "No android or kivy project could be found. Specify --subdir?" @@ -1311,14 +1311,13 @@ msgid "No information found." msgstr "Nem található információ." #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No matching tags found" -msgstr "Nem található információ." +msgstr "" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "Nem található config.yml, alapértelmezések használata." +msgstr "" #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1732,7 +1731,7 @@ msgstr "A forráskód binárisok és egyéb problémák miatti átvizsgálásán #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" -msgstr "Az érvénytelen aláírású „{apkfilename}” kihagyása." +msgstr "Az érvénytelen aláírású „{apkfilename}” kihagyása!" #: ../fdroidserver/index.py #, python-format @@ -1747,7 +1746,7 @@ msgstr "A(z) „{appid}” indexelőállításának kihagyása" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" -msgstr "Az érvénytelen aláírású {apkfilename} kihagyása." +msgstr "Az érvénytelen aláírású {apkfilename} kihagyása!" #: ../fdroidserver/scanner.py #, python-brace-format @@ -2526,9 +2525,8 @@ msgid "no version info found!" msgstr "" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "no version information found" -msgstr "Nem található információ." +msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From 9d4caeefafd083ab287653b26ea7d7528dcdaca0 Mon Sep 17 00:00:00 2001 From: Frankie McEyes Date: Wed, 20 Apr 2022 13:32:55 +0000 Subject: [PATCH 0747/2116] Translated using Weblate: Italian (it) by Frankie McEyes Currently translated at 95.9% (587 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ --- locale/it/LC_MESSAGES/fdroidserver.po | 38 +++++++++++++-------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index ddc99107..78dc7a6b 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -10,20 +10,21 @@ # Francesco Saltori , 2020. # Francesco Esposito , 2021. # mondstern , 2021. +# Frankie McEyes , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2021-03-03 06:19+0000\n" -"Last-Translator: mondstern \n" +"PO-Revision-Date: 2022-04-21 10:12+0000\n" +"Last-Translator: Frankie McEyes \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.5\n" +"X-Generator: Weblate 4.12-dev\n" #: ../fdroidserver/common.py msgid "" @@ -72,9 +73,9 @@ msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" non ha un file di metadati corrispondente!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "La directory principale per local_copy_dir \"{path}\" non esiste!" +msgstr "La directory principale per \"local_copy_dir\" {path} non esiste!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" @@ -111,9 +112,9 @@ msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" non è un formato accettato, convertire a: {formats}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "\"{path}\" esiste ma s3cmd non è installato!" +msgstr "\"{path}\" è firmato da una chiave non autorizzata:" #: ../fdroidserver/common.py #, python-brace-format @@ -338,9 +339,9 @@ msgid "Android SDK tool {cmd} found!" msgstr "Android SDK tool {cmd} trovato!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "Android SDK tool {cmd} trovato!" +msgstr "Strumento Android SDK {cmd} non trovato!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -420,7 +421,7 @@ msgstr "Costruito il repository in \"%s\" con questa configurazione:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "Impossibile aggiornare automaticamente app prive del CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -536,9 +537,8 @@ msgid "Couldn't find Application ID" msgstr "Impossibile trovare l'ID dell'applicazione" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "Couldn't find any version information" -msgstr "Impossibile trovare il nome dell'ultima versione" +msgstr "Impossibile trovare informazioni sulla versione" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py @@ -698,7 +698,7 @@ msgstr "Scarica registri che non abbiamo" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "Scaricando %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." @@ -821,9 +821,8 @@ msgid "Failed to get APK manifest information" msgstr "Impossibile ottenere informazioni del manifest dell’APK" #: ../fdroidserver/update.py -#, fuzzy msgid "Failed to get APK signing key fingerprint" -msgstr "Impossibile ottenere informazioni del manifest dell’APK" +msgstr "Impossibile ottenere l'impronta digitale della chiave di firma del pacchetto APK" #: ../fdroidserver/install.py #, python-brace-format @@ -956,9 +955,8 @@ msgid "Git fetch failed" msgstr "Recupero Git non riuscito" #: ../fdroidserver/common.py -#, fuzzy msgid "Git prune failed" -msgstr "Ripristino Git non riuscito" +msgstr "Cancellazione Git non riuscita" #: ../fdroidserver/common.py msgid "Git remote set-head failed" @@ -1037,12 +1035,12 @@ msgstr "Includere i tarball dei sorgenti nel mirror" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" -msgstr "" +msgstr "Includo metadati da %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" -msgstr "" +msgstr "Includo metadati da {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1149,7 +1147,7 @@ msgstr "Nome non valido per il file pubblicato: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "nkd non valido: entry nella compilazione: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format From 5e93bfd14b4ffd29bd4e24ce49dd039176ba70ad Mon Sep 17 00:00:00 2001 From: random r Date: Mon, 30 May 2022 07:47:54 +0000 Subject: [PATCH 0748/2116] Translated using Weblate: Italian (it) by random r Currently translated at 97.3% (596 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ --- locale/it/LC_MESSAGES/fdroidserver.po | 37 ++++++++++++--------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 78dc7a6b..9ab04800 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# random r , 2020. +# random r , 2020, 2022. # Luca Zambarda , 2020. # IvanDan , 2020, 2021. # Massimiliano Caniparoli , 2020. @@ -16,15 +16,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-04-21 10:12+0000\n" -"Last-Translator: Frankie McEyes \n" +"PO-Revision-Date: 2022-05-31 08:19+0000\n" +"Last-Translator: random r \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.13-dev\n" #: ../fdroidserver/common.py msgid "" @@ -1085,12 +1085,12 @@ msgstr "APK non valido" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "Modalità di aggiornamento automatico non valida: {mode}" #: ../fdroidserver/checkupdates.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "Nome del pacchetto non valido {0}" +msgstr "Modalità di controllo aggiornamento non valida: {mode}" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format @@ -1211,9 +1211,9 @@ msgid "Javascript in HTML src attributes" msgstr "Javascript negli attributi HTML src" #: ../fdroidserver/build.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "Lettura di minSdkVersion non riuscita: \"{apkfilename}\"" +msgstr "Mantenimento della build fallita \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" @@ -1237,9 +1237,8 @@ msgid "List files that would be reformatted" msgstr "Elenca i file che verrebbero riformattati" #: ../fdroidserver/rewritemeta.py -#, fuzzy msgid "List files that would be reformatted (dry run)" -msgstr "Elenca i file che verrebbero riformattati" +msgstr "Elenca i file che verrebbero riformattati (simulazione)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" @@ -1275,9 +1274,9 @@ msgid "No 'config.yml' found, using defaults." msgstr "Nessun 'config.yml' trovato, utilizzando i valori predefiniti." #: ../fdroidserver/verify.py -#, fuzzy, python-format +#, python-format msgid "No APK for package: %s" -msgstr "Nessun pacchetto di questo tipo: %s" +msgstr "Nessun APK per il pacchetto: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1317,14 +1316,13 @@ msgid "No information found." msgstr "Nessun informazione trovata." #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No matching tags found" -msgstr "Nessun informazione trovata." +msgstr "Nessuna etichetta corrispondente trovata" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "Nessun config.yml trovato, utilizzando i valori predefiniti." +msgstr "Nessuna versione minima dell'SDK trovata in {0}, viene usata la predefinita (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1368,9 +1366,8 @@ msgid "No such versionCode {versionCode} for app {appid}" msgstr "Nessun versionCode di questo tipo {versionCode} per l'app {appid}" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No tags found" -msgstr "Nessun dispositivo collegato trovato" +msgstr "Nessuna etichetta trovata" #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" @@ -1597,7 +1594,7 @@ msgstr "Rimozione dei file specificati" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "Rimozione di {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" From e00538a3fa148583d5b01de5079b10929726f1c8 Mon Sep 17 00:00:00 2001 From: random r Date: Fri, 3 Jun 2022 08:20:55 +0000 Subject: [PATCH 0749/2116] Translated using Weblate: Italian (it) by random r Currently translated at 97.7% (598 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ --- locale/it/LC_MESSAGES/fdroidserver.po | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 9ab04800..3643218a 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -16,7 +16,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-05-31 08:19+0000\n" +"PO-Revision-Date: 2022-06-03 10:53+0000\n" "Last-Translator: random r \n" "Language-Team: Italian \n" "Language: it\n" @@ -2229,9 +2229,8 @@ msgid "ambiguous option: %s (%s?)" msgstr "opzione ambigua: %s (%s?)" #: ../fdroidserver/common.py -#, fuzzy msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "apksigner non trovato, è necessario per la firma!" +msgstr "apksigner non trovato! Impossibile firmare o verificare gli APK moderni" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2530,9 +2529,8 @@ msgid "no version info found!" msgstr "nessuna informazione sulla versione è stata trovata!" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "no version information found" -msgstr "nessuna informazione sulla versione è stata trovata!" +msgstr "nessuna informazione sulla versione trovata" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From 2972605314d4cc3916ec71e3237f6d9f1e57e0ef Mon Sep 17 00:00:00 2001 From: Antonello Pirina Date: Tue, 28 Jun 2022 16:38:41 +0000 Subject: [PATCH 0750/2116] Translated using Weblate: Italian (it) by Antonello Pirina Currently translated at 98.0% (600 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ --- locale/it/LC_MESSAGES/fdroidserver.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 3643218a..d427fdd2 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -11,20 +11,21 @@ # Francesco Esposito , 2021. # mondstern , 2021. # Frankie McEyes , 2022. +# Antonello Pirina , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-06-03 10:53+0000\n" -"Last-Translator: random r \n" +"PO-Revision-Date: 2022-06-28 20:54+0000\n" +"Last-Translator: Antonello Pirina \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -1685,9 +1686,8 @@ msgstr[0] "Scanner trovato {} problema" msgstr[1] "Scanner trovato {} problemi" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with apkanalyzer for known non-free classes." -msgstr "Scansiona gli APK risultanti per le classi non libere note." +msgstr "Scansiona gli APK con apkanalyzer per le classi non libere note." #: ../fdroidserver/common.py #, python-brace-format @@ -1740,7 +1740,7 @@ msgstr "Saltare '{apkfilename} con firma non valida!" #: ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "Saltando il mirror di GitLab Pages perché la repo è troppo grande (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format From b85caf26f208a462cfb594fddf9bea06154509c2 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 6 Sep 2022 14:23:36 +0000 Subject: [PATCH 0751/2116] Translated using Weblate: Korean (ko) by Hans-Christoph Steiner Currently translated at 36.6% (224 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ko/ --- locale/ko/LC_MESSAGES/fdroidserver.po | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index c9db0b6b..eec9804e 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -1,21 +1,21 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# Hans-Christoph Steiner , 2020, 2021. +# Hans-Christoph Steiner , 2020, 2021, 2022. # Myeongjin Lee , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2021-08-16 19:53+0000\n" -"Last-Translator: Myeongjin Lee \n" +"PO-Revision-Date: 2022-09-06 14:30+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -97,9 +97,9 @@ msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "\"{path}\"는 존재하지만 s3cmd는 설치되어 있지 않습니다!" +msgstr "" #: ../fdroidserver/common.py #, python-brace-format @@ -323,9 +323,9 @@ msgid "Android SDK tool {cmd} found!" msgstr "" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "Android SDK를 찾을 수 없습니다!" +msgstr "" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -1068,9 +1068,9 @@ msgid "Invalid AutoUpdateMode: {mode}" msgstr "" #: ../fdroidserver/checkupdates.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "잘못된 패키지 이름 {0}" +msgstr "" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format @@ -2505,9 +2505,8 @@ msgid "no version info found!" msgstr "버전 정보를 찾지 못했습니다!" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "no version information found" -msgstr "버전 정보를 찾지 못했습니다!" +msgstr "버전 정보를 찾지 못했습니다" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From 4ec45c4f0fb3fabcba17b2cd2a0b40df1ebd581b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 6 Sep 2022 14:29:05 +0000 Subject: [PATCH 0752/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Norwe?= =?UTF-8?q?gian=20Bokm=C3=A5l=20(nb=5FNO)=20by=20Hans-Christoph=20Steiner?= =?UTF-8?q?=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 59.9% (367 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/nb_NO/ --- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 30 ++++++++++++------------ 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index 06aab5e8..4aba2980 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -1,22 +1,22 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # Allan Nordhøy , 2020, 2021, 2022. -# Hans-Christoph Steiner , 2020. +# Hans-Christoph Steiner , 2020, 2022. # mondstern , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-02-16 15:13+0000\n" -"Last-Translator: Allan Nordhøy \n" +"PO-Revision-Date: 2022-09-06 14:30+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Norwegian Bokmål \n" "Language: nb_NO\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -100,9 +100,9 @@ msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" er ikke et godtatt format, konverter til: {formats}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "\"{path}\" finnes, men s3cmd er ikke installert!" +msgstr "" #: ../fdroidserver/common.py #, python-brace-format @@ -703,7 +703,7 @@ msgstr "Last ned logger som ikke finnes lokalt" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "Laster ned %s …" +msgstr "Laster ned %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." @@ -1111,9 +1111,9 @@ msgid "Invalid AutoUpdateMode: {mode}" msgstr "Ugyldig AutoUpdateMode: {mode}" #: ../fdroidserver/checkupdates.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "Ugyldig pakkenavn {0}" +msgstr "" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format @@ -1355,9 +1355,9 @@ msgid "No matching tags found" msgstr "Ingen informasjon funnet." #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "Fant ingen 'config.yml' , bruker forvalg." +msgstr "" #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1639,9 +1639,9 @@ msgid "Removing specified files" msgstr "Fjerner angitte filer" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Removing {path}\"" -msgstr "Fjerner {path}\" …" +msgstr "Fjerner {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -2101,9 +2101,9 @@ msgid "Unused scanignore path: %s" msgstr "Ubrukt fil i %s" #: ../fdroidserver/common.py -#, fuzzy, python-format +#, python-format msgid "Unzipping to %s" -msgstr "Pakker ut til %s …" +msgstr "Pakker ut til %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" From af98452e694671c7b0619238a0fc2b5afe83bd71 Mon Sep 17 00:00:00 2001 From: "Flavio F. M" Date: Sat, 26 Mar 2022 17:14:49 +0100 Subject: [PATCH 0753/2116] Translated using Weblate: Portuguese (Brazil) (pt_BR) by Flavio F. M. Currently translated at 97.3% (596 of 612 strings) Translated using Weblate: Portuguese (Brazil) (pt_BR) by Flavio F. M. Currently translated at 96.5% (591 of 612 strings) Translated using Weblate: Portuguese (Brazil) (pt_BR) by Flavio F. M. Currently translated at 94.4% (578 of 612 strings) Co-authored-by: Flavio F. M Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/ Translation: F-Droid/F-Droid Server --- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 90 +++++++++++++----------- 1 file changed, 48 insertions(+), 42 deletions(-) diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 290026fa..5d51437a 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -7,20 +7,21 @@ # ssantos , 2020. # The Cats , 2020. # Eduardo Rodrigues , 2021. +# Flavio F. M. , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2021-02-19 19:50+0000\n" -"Last-Translator: Eduardo Rodrigues \n" +"PO-Revision-Date: 2022-03-23 21:41+0000\n" +"Last-Translator: Flavio F. M. \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.5\n" +"X-Generator: Weblate 4.12-dev\n" #: ../fdroidserver/common.py msgid "" @@ -70,9 +71,9 @@ msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" não tem arquivo de metadados correspondente!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "O diretório raiz para local_copy_dir \"{path}\" não existe!" +msgstr "O diretório raiz para \"local_copy_dir\" {path} não existe!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" @@ -109,9 +110,9 @@ msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" não é um formato aceito, converter para: {formats}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "\"{path}\" existe, mas s3cmd não está instalado!" +msgstr "\"{path}\" é assinado por uma chave que não é permitida:" #: ../fdroidserver/common.py #, python-brace-format @@ -336,9 +337,9 @@ msgid "Android SDK tool {cmd} found!" msgstr "Ferramenta {cmd} do Android SDK encontrada!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "Ferramenta {cmd} do Android SDK encontrada!" +msgstr "A ferramenta SDK do Android {cmd} não foi encontrada!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -418,7 +419,7 @@ msgstr "Repo construído baseado em \"%s\" com esta configuração:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "Não pode atualizar automaticamente o aplicativo sem CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -696,7 +697,7 @@ msgstr "Baixar os registros de alterações que nós não temos" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "Baixando %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." @@ -819,9 +820,8 @@ msgid "Failed to get APK manifest information" msgstr "Falha ao obter informações de manifesto do APK" #: ../fdroidserver/update.py -#, fuzzy msgid "Failed to get APK signing key fingerprint" -msgstr "Falha ao obter informações de manifesto do APK" +msgstr "Falha ao obter a impressão digital da chave de assinatura do APK" #: ../fdroidserver/install.py #, python-brace-format @@ -1035,12 +1035,12 @@ msgstr "Inclui os tarballs fonte no espelho" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" -msgstr "" +msgstr "Incluindo metadados de %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" -msgstr "" +msgstr "Incluindo metadados de {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1085,12 +1085,12 @@ msgstr "APK inválido" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "Modo de Atualização Automática inválido: {mode}" #: ../fdroidserver/checkupdates.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "Nome do pacote inválido {0}" +msgstr "Modo de Verificação Automática inválido: {mode} {0}" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format @@ -1147,7 +1147,7 @@ msgstr "Nome inválido para o arquivo publicado: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "ndk inválido: entrada na compilação: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format @@ -1597,7 +1597,7 @@ msgstr "Removendo arquivos especificados" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "Removendo {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -1605,7 +1605,7 @@ msgstr "Renomeia arquivos APK que não correspondem a pacote.nome_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "O modo de atualização repoTrunk só faz sentido em repositórios git-svn" #: ../fdroidserver/update.py msgid "Report on build data status" @@ -1688,14 +1688,13 @@ msgstr[0] "O Scanner encontrou {} problema" msgstr[1] "O Scanner encontrou {} problemas" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with apkanalyzer for known non-free classes." -msgstr "Verifique os APKs resultantes na busca das classes não gratuitas já conhecidas." +msgstr "Verifique os APKs resultantes na busca das classes não-livres já conhecidas." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "" +msgstr "Defina NDK {release} ({version}) para cima" #: ../fdroidserver/common.py msgid "Set clock to that time using:" @@ -1741,9 +1740,9 @@ msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Ignorando '{apkfilename}' com assinatura inválida!" #: ../fdroidserver/index.py -#, python-format +#, fuzzy, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "Pular o espelho do GitLab Pages porque o repo é muito grande (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format @@ -1812,11 +1811,12 @@ msgstr "O relógio/calendário do sistema é mais atrasado que em '{path}'!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" +msgstr "O modo de atualização de tags só funciona para repositórios git, hg, bzr e git-svn atualmente" #: ../fdroidserver/checkupdates.py +#, fuzzy msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" +msgstr "Modo de atualização de tags usado no git-svn, mas o repositório não foi configurado com tags" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." @@ -1885,6 +1885,13 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" +"Para concluir a configuração, adicione seus APKs a \"%s\"\n" +"em seguida, execute \"fdroid update -c; atualização do fdroid\". Você também pode querer editar\n" +"\"config.yml\" para definir o URL, o nome do repositório e muito mais. Você também deve configurar\n" +"uma chave de assinatura (uma temporária pode ter sido gerada automaticamente).\n" +"\n" +"Para mais informações: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"e https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -1916,9 +1923,9 @@ msgid "Unexpected license tag \"{}\"! Only use license tags configured in your c msgstr "A etiqueta da licença foi inesperada \"{}\"! Use apenas as etiquetas configuradas no seu arquivo de configuração" #: ../fdroidserver/common.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" +msgstr "Destino de symlink inesperado: {link} -> {target}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2044,9 +2051,9 @@ msgid "Unused scanignore path: %s" msgstr "Caminho scanignore não usado: %s" #: ../fdroidserver/common.py -#, python-format +#, fuzzy, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "Descompactar para %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -2362,7 +2369,7 @@ msgstr "{path} criado" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "versão atual é mais recente: old vercode={old}, new vercode={new}" #: ../fdroidserver/update.py #, python-brace-format @@ -2488,7 +2495,7 @@ msgstr "Opção cadeia %(option)r inválida: deve começar com o caractere %(pre #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "receita de compilação mais recente é: old vercode={old}, new vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2501,7 +2508,7 @@ msgstr "local_copy_dir deve ser um caminho absoluto!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" -msgstr "local_copy_dir deve ser directory, não um arquivo!" +msgstr "local_copy_dir deve ser um diretório, não um arquivo!" #: ../fdroidserver/index.py #, python-format @@ -2533,9 +2540,8 @@ msgid "no version info found!" msgstr "não há informações de versão encontrada!" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "no version information found" -msgstr "não há informações de versão encontrada!" +msgstr "nenhuma informação de versão encontrada!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2634,7 +2640,7 @@ msgstr "Recuse o download inseguro via conexão HTTP (use HTTPS ou especifique - #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" -msgstr "Recuse o download insegura via conexão http (use https ou especifique --no-https-check): {apkfilename}" +msgstr "Recuse o download inseguro via conexão http (use https ou especifique --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format @@ -2656,9 +2662,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincroniza índices {path} para {url} e exclui" #: ../fdroidserver/scanner.py -#, python-format +#, fuzzy, python-format msgid "scanner not cleanly run apkanalyzer: %s" -msgstr "" +msgstr "escaneador não executa de forma limpa o analisador apk: %s" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2804,9 +2810,9 @@ msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "O {appid} do {path} não é um Nome de Pacote Java válido!" #: ../fdroidserver/update.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid} tem APKs e arquivos: {files}" #: ../fdroidserver/mirror.py #, python-brace-format From 9c1975d765df2ef452fc9509860dfcbb1774b3d3 Mon Sep 17 00:00:00 2001 From: ssantos Date: Sun, 10 Apr 2022 20:00:25 +0000 Subject: [PATCH 0754/2116] Translated using Weblate: Portuguese (pt) by ssantos Currently translated at 98.2% (601 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/ --- locale/pt/LC_MESSAGES/fdroidserver.po | 66 ++++++++++++++------------- 1 file changed, 35 insertions(+), 31 deletions(-) diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 56b05b7d..56fd7787 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -1,6 +1,6 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# ssantos , 2020, 2021. +# ssantos , 2020, 2021, 2022. # Peter J. Mello , 2021. # Eduardo Rodrigues , 2021. msgid "" @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2021-08-07 21:34+0000\n" +"PO-Revision-Date: 2022-04-11 21:51+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" "Language: pt\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.8-dev\n" +"X-Generator: Weblate 4.12-dev\n" #: ../fdroidserver/common.py msgid "" @@ -104,9 +104,9 @@ msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" não é um formato aceito, converter para: {formats}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "\"{path}\" existe, mas s3cmd não está instalado!" +msgstr "\"{path}\" é assinado por uma chave que não é permitida:" #: ../fdroidserver/common.py #, python-brace-format @@ -691,7 +691,7 @@ msgstr "Descarregar os registos que nós não temos" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "A descarregar %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." @@ -1030,12 +1030,12 @@ msgstr "Incluir os tarballs de fontes no espelho" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" -msgstr "" +msgstr "Incluindo metadados de %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" -msgstr "" +msgstr "Incluindo metadados de {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1080,12 +1080,12 @@ msgstr "APK inválido" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "AutoUpdateMode inválido: {mode}" #: ../fdroidserver/checkupdates.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "Nome do pacote inválido {0}" +msgstr "UpdateCheckMode inválido: {mode}" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format @@ -1142,7 +1142,7 @@ msgstr "Nome inválido para o ficheiro publicado: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "Ndk inválido: entrada na compilação: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format @@ -1312,14 +1312,13 @@ msgid "No information found." msgstr "Nenhuma informação encontrada." #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No matching tags found" -msgstr "Nenhuma informação encontrada." +msgstr "Não foram encontradas marcações correspondentes" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "Nenhum config.yml foi encontrado, usando predefinições." +msgstr "Nenhuma versão mínima do SDK encontrada em {0}, a usar a predefinição (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1592,7 +1591,7 @@ msgstr "Apagando ficheiros especificados" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "A remover {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -1600,7 +1599,7 @@ msgstr "Renomear todos os ficheiros APKs que não correspondem com package.name_ #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "O modo de atualização repoTrunk só faz sentido em repositórios de git-svn" #: ../fdroidserver/update.py msgid "Report on build data status" @@ -1807,11 +1806,11 @@ msgstr "O relógio do sistema é mais antigo que a data em {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" +msgstr "O modo de atualização de marcações só funciona atualmente para repositórios git, hg, bzr e git-svn" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" +msgstr "Modo de atualização de marcações usado no git-svn, mas a repo não foi configurada com marcações" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." @@ -1880,6 +1879,13 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" +"Para completar a configuração, adicione os seus APKs ao \"%s\",\n" +"depois execute \"fdroid update -c; fdroid update\". Também pode editar\n" +"\"config.yml\" para definir a URL, nome do repo, e muito mais. Também deve configurar\n" +"uma chave de assinatura (uma chave temporária pode ter sido gerada automaticamente).\n" +"\n" +"Para mais informações: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"e https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -1913,7 +1919,7 @@ msgstr "Etiqueta de licença \"{}\" inesperada! Use somente as etiquetas de lice #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" +msgstr "Alvo symlink inesperado: {link} -> {target}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2041,7 +2047,7 @@ msgstr "O caminho de scanignore não é usado: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "A descompactar para %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -2227,9 +2233,8 @@ msgid "ambiguous option: %s (%s?)" msgstr "opção ambígua: %s (%s?)" #: ../fdroidserver/common.py -#, fuzzy msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "Nenhum apksigner encontrado, é necessário para assinar!" +msgstr "apksigner não encontrado! Não é possível assinar ou verificar APKs modernos" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2357,7 +2362,7 @@ msgstr "{path} criado" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "a versão atual é mais nova: velho vercódigo={old}, novo vercódigo={new}" #: ../fdroidserver/update.py #, python-brace-format @@ -2483,7 +2488,7 @@ msgstr "Opção cadeia %(option)r inválida: deve começar com o caractere %(pre #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "a última receita de construção é mais recente: velho vercódigo={old}, novo vercódigo={new}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2528,9 +2533,8 @@ msgid "no version info found!" msgstr "não há informações de versão encontrada!" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "no version information found" -msgstr "não há informações de versão encontrada!" +msgstr "nenhuma informação de versão encontrada" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2651,9 +2655,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincroniza índices {path} para {url} e apaga" #: ../fdroidserver/scanner.py -#, python-format +#, fuzzy, python-format msgid "scanner not cleanly run apkanalyzer: %s" -msgstr "" +msgstr "o scanner não executa corretamente o apkanalyzer: %s" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2801,7 +2805,7 @@ msgstr "{appid} do {path} não é um Nome de Pacote Java válido!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid} tem APKs e ficheiros: {files}" #: ../fdroidserver/mirror.py #, python-brace-format From 4c9a58fdac6cd68ccefff7ac4f7d2100cd8414c5 Mon Sep 17 00:00:00 2001 From: SC Date: Mon, 11 Apr 2022 11:25:00 +0000 Subject: [PATCH 0755/2116] Translated using Weblate: Portuguese (pt) by SC Currently translated at 98.2% (601 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/ --- locale/pt/LC_MESSAGES/fdroidserver.po | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 56fd7787..2bccdd70 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -3,13 +3,14 @@ # ssantos , 2020, 2021, 2022. # Peter J. Mello , 2021. # Eduardo Rodrigues , 2021. +# SC , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2022-04-11 21:51+0000\n" -"Last-Translator: ssantos \n" +"Last-Translator: SC \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" @@ -65,9 +66,9 @@ msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" não tem ficheiro de metadados correspondente!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "O diretório raiz para local_copy_dir \"{path}\" não existe!" +msgstr "O diretório raiz para \"local_copy_dir\" {path} não existe!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" @@ -331,9 +332,9 @@ msgid "Android SDK tool {cmd} found!" msgstr "Ferramenta {cmd} do Android SDK foi encontrada!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "Ferramenta {cmd} do Android SDK foi encontrada!" +msgstr "A ferramenta SDK do Android {cmd} não foi encontrada!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -413,7 +414,7 @@ msgstr "Repo construído baseado em \"%s\" com esta configuração:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "Não é possível atualizar automaticamente a aplicação sem CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -529,9 +530,8 @@ msgid "Couldn't find Application ID" msgstr "Não foi possível encontrar o ID da aplicação" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "Couldn't find any version information" -msgstr "Não foi possível encontrar o nome da versão mais recente" +msgstr "Não foi encontrada qualquer informação da versão" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py From 480feed2044b9602bbff56984584361ef5008827 Mon Sep 17 00:00:00 2001 From: ssantos Date: Tue, 19 Apr 2022 17:31:56 +0000 Subject: [PATCH 0756/2116] Translated using Weblate: Portuguese (pt) by ssantos Currently translated at 98.3% (602 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/ --- locale/pt/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 2bccdd70..ba09cf39 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -9,8 +9,8 @@ msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-04-11 21:51+0000\n" -"Last-Translator: SC \n" +"PO-Revision-Date: 2022-04-20 13:32+0000\n" +"Last-Translator: ssantos \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" @@ -1687,9 +1687,9 @@ msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Procure no(s) APK(s) resultante(s) por classes conhecidas não livres." #: ../fdroidserver/common.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "" +msgstr "Definir NDK {release} ({version}) para cima" #: ../fdroidserver/common.py msgid "Set clock to that time using:" @@ -1737,7 +1737,7 @@ msgstr "Ignorando '{apkfilename}' com uma assinatura inválida!" #: ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "A ignorar o espelho do GitLab Pages porque o repositório é muito grande (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format From 498255b79d83162561f5e41d1559e42e31c5e8d1 Mon Sep 17 00:00:00 2001 From: "Flavio F. M" Date: Mon, 9 May 2022 22:55:43 +0000 Subject: [PATCH 0757/2116] Translated using Weblate: Portuguese (Brazil) (pt_BR) by Flavio F. M. Currently translated at 100.0% (612 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/ --- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 65 +++++++++++------------- 1 file changed, 29 insertions(+), 36 deletions(-) diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 5d51437a..77519d45 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -13,7 +13,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-03-23 21:41+0000\n" +"PO-Revision-Date: 2022-05-10 03:07+0000\n" "Last-Translator: Flavio F. M. \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" @@ -21,7 +21,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.12.1\n" #: ../fdroidserver/common.py msgid "" @@ -535,9 +535,8 @@ msgid "Couldn't find Application ID" msgstr "Não foi possível encontrar o ID do aplicativo" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "Couldn't find any version information" -msgstr "Impossível encontrar o nome da versão mais recente" +msgstr "Não foi possível encontrar nenhuma informação de versão" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py @@ -954,9 +953,8 @@ msgid "Git fetch failed" msgstr "Falha no 'fetch' do Git" #: ../fdroidserver/common.py -#, fuzzy msgid "Git prune failed" -msgstr "Falha no 'reset' do Git" +msgstr "Falha na remoção do Git" #: ../fdroidserver/common.py msgid "Git remote set-head failed" @@ -1090,7 +1088,7 @@ msgstr "Modo de Atualização Automática inválido: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "Modo de Verificação Automática inválido: {mode} {0}" +msgstr "UpdateCheckMode inválido: {mode}" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format @@ -1110,7 +1108,7 @@ msgstr "Booleano inválido '%s'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid build flag at {line} in {linedesc}" -msgstr "Sinalizador de compilação inválido em {line} em {linedesc}" +msgstr "Sinalização de compilação inválida em {line} e {linedesc}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1211,9 +1209,9 @@ msgid "Javascript in HTML src attributes" msgstr "Javascript em atributo 'src' de HTML" #: ../fdroidserver/build.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "Falha na leitura de minSdkVersion: \"{apkfilename}\"" +msgstr "Mantendo a compilação com falha \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" @@ -1237,9 +1235,8 @@ msgid "List files that would be reformatted" msgstr "Listar arquivos que devem ser reformatados" #: ../fdroidserver/rewritemeta.py -#, fuzzy msgid "List files that would be reformatted (dry run)" -msgstr "Listar arquivos que devem ser reformatados" +msgstr "Listar arquivos que seriam reformatados (execução a seco)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" @@ -1268,16 +1265,16 @@ msgstr "Diretório de saída ausente" #: ../fdroidserver/lint.py #, python-format msgid "Name '%s' is just the auto name - remove it" -msgstr "O nome '%s' é apenas o nome automático. Remova-o!" +msgstr "O nome '%s' é apenas o nome automático - remova-o" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "Nenhum 'config.yml' encontrado, usando padrões." #: ../fdroidserver/verify.py -#, fuzzy, python-format +#, python-format msgid "No APK for package: %s" -msgstr "Nenhum pacote desse tipo: %s" +msgstr "Nenhum APK para o pacote: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1317,14 +1314,13 @@ msgid "No information found." msgstr "Nenhuma informação encontrada." #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No matching tags found" -msgstr "Nenhuma informação encontrada." +msgstr "Nenhuma tag correspondente encontrada" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "Nenhum config.yml encontrado, usando padrões." +msgstr "Nenhuma versão mínima do SDK encontrada em {0}, usando o padrão (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1368,9 +1364,8 @@ msgid "No such versionCode {versionCode} for app {appid}" msgstr "Nenhum tal versionCode {versionCode} para o aplicativo {appid}" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No tags found" -msgstr "Nenhum dispositivo conectado encontrado" +msgstr "Nenhuma etiqueta encontrada" #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" @@ -1740,9 +1735,9 @@ msgid "Skipping '{apkfilename}' with invalid signature!" msgstr "Ignorando '{apkfilename}' com assinatura inválida!" #: ../fdroidserver/index.py -#, fuzzy, python-format +#, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "Pular o espelho do GitLab Pages porque o repo é muito grande (>%.2fGB)!" +msgstr "Ignorando o espelho do GitLab Pages porque o repositório é muito grande (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format @@ -1814,7 +1809,6 @@ msgid "Tags update mode only works for git, hg, bzr and git-svn repositories cur msgstr "O modo de atualização de tags só funciona para repositórios git, hg, bzr e git-svn atualmente" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "Modo de atualização de tags usado no git-svn, mas o repositório não foi configurado com tags" @@ -1923,7 +1917,7 @@ msgid "Unexpected license tag \"{}\"! Only use license tags configured in your c msgstr "A etiqueta da licença foi inesperada \"{}\"! Use apenas as etiquetas configuradas no seu arquivo de configuração" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" msgstr "Destino de symlink inesperado: {link} -> {target}" @@ -2051,9 +2045,9 @@ msgid "Unused scanignore path: %s" msgstr "Caminho scanignore não usado: %s" #: ../fdroidserver/common.py -#, fuzzy, python-format +#, python-format msgid "Unzipping to %s" -msgstr "Descompactar para %s" +msgstr "Descompactando para %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -2239,9 +2233,8 @@ msgid "ambiguous option: %s (%s?)" msgstr "opção ambígua: %s (%s?)" #: ../fdroidserver/common.py -#, fuzzy msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "o apksigner não foi encontrado, ele é necessário para assinar!" +msgstr "apksigner não encontrado! Não é possível assinar ou verificar APKs modernos" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2541,7 +2534,7 @@ msgstr "não há informações de versão encontrada!" #: ../fdroidserver/checkupdates.py msgid "no version information found" -msgstr "nenhuma informação de versão encontrada!" +msgstr "nenhuma informação de versão encontrada" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2662,7 +2655,7 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincroniza índices {path} para {url} e exclui" #: ../fdroidserver/scanner.py -#, fuzzy, python-format +#, python-format msgid "scanner not cleanly run apkanalyzer: %s" msgstr "escaneador não executa de forma limpa o analisador apk: %s" @@ -2687,11 +2680,11 @@ msgstr "APK assinado, seja um caminho de arquivo ou um URL HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "Pule a implantação de logs completos de compilação: o conteúdo do log está vazio." +msgstr "ignorar a implantação de logs de compilação completos: o conteúdo do log está vazio" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" -msgstr "Pule a implantação de logs de criação completos: não habilitado em configuração." +msgstr "ignorar a implantação de logs de compilação completos: não habilitado na configuração" #: ../fdroidserver/update.py #, python-brace-format @@ -2709,7 +2702,7 @@ msgstr "biblioteca estática" #: ../fdroidserver/common.py #, python-brace-format msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" -msgstr "O valor do data-hora fornecido ('{timestamp}') não está no formato timestamp unix." +msgstr "O valor da data-hora fornecido ('{timestamp}') não está no formato timestamp unix" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2810,7 +2803,7 @@ msgid "{appid} from {path} is not a valid Java Package Name!" msgstr "O {appid} do {path} não é um Nome de Pacote Java válido!" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{appid} has both APKs and files: {files}" msgstr "{appid} tem APKs e arquivos: {files}" @@ -2896,7 +2889,7 @@ msgid "{path} more than 200MB, manually upload: {url}" msgstr "o {path} tem mais de 200MB, upload manual: {url}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path}: {error}" msgstr "Falha ao copiar {path}: {error}" From 3d1b18d65bc8b58269114ce3a303473a71c0a46a Mon Sep 17 00:00:00 2001 From: SC Date: Tue, 24 May 2022 10:21:32 +0000 Subject: [PATCH 0758/2116] Translated using Weblate: Portuguese (pt) by SC Currently translated at 100.0% (612 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/ --- locale/pt/LC_MESSAGES/fdroidserver.po | 37 ++++++++++++--------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index ba09cf39..14acfe17 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -9,15 +9,15 @@ msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-04-20 13:32+0000\n" -"Last-Translator: ssantos \n" +"PO-Revision-Date: 2022-05-24 20:28+0000\n" +"Last-Translator: SC \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.13-dev\n" #: ../fdroidserver/common.py msgid "" @@ -814,9 +814,8 @@ msgid "Failed to get APK manifest information" msgstr "Falha ao obter informações de manifesto do APK" #: ../fdroidserver/update.py -#, fuzzy msgid "Failed to get APK signing key fingerprint" -msgstr "Falha ao obter informações de manifesto do APK" +msgstr "Falha ao obter a impressão digital da chave de assinatura do APK" #: ../fdroidserver/install.py #, python-brace-format @@ -949,9 +948,8 @@ msgid "Git fetch failed" msgstr "Git fetch falhou" #: ../fdroidserver/common.py -#, fuzzy msgid "Git prune failed" -msgstr "Git reset falhou" +msgstr "Falha na remoção do Git" #: ../fdroidserver/common.py msgid "Git remote set-head failed" @@ -1206,9 +1204,9 @@ msgid "Javascript in HTML src attributes" msgstr "JavaScript em atributos HTML src" #: ../fdroidserver/build.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "A leitura de minSdkVersion falhou: \"{apkfilename}\"" +msgstr "Mantendo a compilação com falha \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" @@ -1232,9 +1230,8 @@ msgid "List files that would be reformatted" msgstr "Listar ficheiros que devem ser reformatados" #: ../fdroidserver/rewritemeta.py -#, fuzzy msgid "List files that would be reformatted (dry run)" -msgstr "Listar ficheiros que devem ser reformatados" +msgstr "Listar ficheiros que devem ser reformatados (execução a seco)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" @@ -1270,9 +1267,9 @@ msgid "No 'config.yml' found, using defaults." msgstr "'config.yml' não encontrado, utilizando as predefinições." #: ../fdroidserver/verify.py -#, fuzzy, python-format +#, python-format msgid "No APK for package: %s" -msgstr "Nenhum pacote desses: %s" +msgstr "Nenhum APK para o pacote: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1362,9 +1359,8 @@ msgid "No such versionCode {versionCode} for app {appid}" msgstr "Nenhum versionCode {versionCode} para o app {appid}" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No tags found" -msgstr "Nenhum aparelho anexado encontrado" +msgstr "Nenhuma etiqueta encontrada" #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" @@ -1682,12 +1678,11 @@ msgstr[0] "Scanner encontrou {} problema" msgstr[1] "Scanner encontrou {} problemas" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with apkanalyzer for known non-free classes." -msgstr "Procure no(s) APK(s) resultante(s) por classes conhecidas não livres." +msgstr "Varrer os APK com apkanalyzer para classes não-livres." #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Set NDK {release} ({version}) up" msgstr "Definir NDK {release} ({version}) para cima" @@ -2655,7 +2650,7 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincroniza índices {path} para {url} e apaga" #: ../fdroidserver/scanner.py -#, fuzzy, python-format +#, python-format msgid "scanner not cleanly run apkanalyzer: %s" msgstr "o scanner não executa corretamente o apkanalyzer: %s" @@ -2889,9 +2884,9 @@ msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} mais de 200MB, enviar manualmente: {url}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path}: {error}" -msgstr "Falha ao copiar {path}: {error}" +msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format From 2beec6b524c54d163aa995bd52dd6623815a0401 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 6 Sep 2022 14:25:54 +0000 Subject: [PATCH 0759/2116] Translated using Weblate: Portuguese (Portugal) (pt_PT) by Hans-Christoph Steiner Currently translated at 94.2% (577 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_PT/ --- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 29 +++++++++++------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 2abe8404..f63a02ee 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -3,22 +3,22 @@ # This file is distributed under the same license as the PACKAGE package. # Manuela Silva , 2020. # ssantos , 2020, 2021. -# Hans-Christoph Steiner , 2020. +# Hans-Christoph Steiner , 2020, 2022. # Peter J. Mello , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2021-01-31 22:07+0000\n" -"Last-Translator: Peter J. Mello \n" +"PO-Revision-Date: 2022-09-06 14:30+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Portuguese (Portugal) \n" "Language: pt_PT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -106,9 +106,9 @@ msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" não é um formato aceito, converter para: {formats}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "\"{path}\" existe, mas s3cmd não está instalado!" +msgstr "" #: ../fdroidserver/common.py #, python-brace-format @@ -1085,9 +1085,9 @@ msgid "Invalid AutoUpdateMode: {mode}" msgstr "" #: ../fdroidserver/checkupdates.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "Nome do pacote inválido {0}" +msgstr "" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format @@ -1314,14 +1314,13 @@ msgid "No information found." msgstr "Nenhuma informação encontrada." #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No matching tags found" -msgstr "Nenhuma informação encontrada." +msgstr "" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "Nenhum config.yml foi encontrado, usando predefinições." +msgstr "" #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -2229,9 +2228,8 @@ msgid "ambiguous option: %s (%s?)" msgstr "opção ambígua: %s (%s?)" #: ../fdroidserver/common.py -#, fuzzy msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "Nenhum apksigner encontrado, é necessário para assinar!" +msgstr "" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2530,9 +2528,8 @@ msgid "no version info found!" msgstr "não há informações de versão encontrada!" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "no version information found" -msgstr "não há informações de versão encontrada!" +msgstr "não há informações de versão encontrada" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From 34d97a6dab697398e175fa932fb6314c5ec97139 Mon Sep 17 00:00:00 2001 From: Simona Iacob Date: Sat, 26 Mar 2022 17:14:48 +0100 Subject: [PATCH 0760/2116] Translated using Weblate: Romanian (ro) by Simona Iacob Currently translated at 100.0% (612 of 612 strings) Co-authored-by: Simona Iacob Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ro/ Translation: F-Droid/F-Droid Server --- locale/ro/LC_MESSAGES/fdroidserver.po | 138 +++++++++++++------------- 1 file changed, 68 insertions(+), 70 deletions(-) diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 59b17550..1cce9e5c 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -2,22 +2,22 @@ # This file is put in the public domain. # Daniel Șerbănescu , 2021. # Christian Eichert , 2021. -# Simona Iacob , 2021. +# Simona Iacob , 2021, 2022. # Licaon Kter , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2021-09-23 07:37+0000\n" -"Last-Translator: Licaon Kter \n" +"PO-Revision-Date: 2022-03-03 02:51+0000\n" +"Last-Translator: Simona Iacob \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 4.11.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -66,9 +66,9 @@ msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" nu are un fișier de metadate corespunzător!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "Directorul root pentru local_copy_dir \"{path}\" nu există!" +msgstr "\"local_copy_dir\" {path} nu există!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" @@ -105,9 +105,9 @@ msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" nu este un format acceptat, convertiți în: {formats}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "\"{path}\" există, dar s3cmd nu este instalat!" +msgstr "\"{path}\" \"{path}\" este semnat de o cheie care nu este permisă:" #: ../fdroidserver/common.py #, python-brace-format @@ -240,7 +240,7 @@ msgstr "...checkupdate a eșuat pentru {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py msgid ".__call__() not defined" -msgstr "" +msgstr ".__call__() nu este definit" #: ../fdroidserver/metadata.py msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." @@ -260,7 +260,7 @@ msgstr "Adăugați semnături PGP folosind GnuPG pentru pachetele din depozit" #: ../fdroid ../fdroidserver/__main__.py msgid "Add a new application from its source code" -msgstr "" +msgstr "Adăugați o nouă aplicație din codul său sursă" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" @@ -333,9 +333,9 @@ msgid "Android SDK tool {cmd} found!" msgstr "Instrumentul Android SDK {cmd} găsit!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "Instrumentul Android SDK {cmd} găsit!" +msgstr "Instrumentul Android SDK {cmd} nu a fost găsit!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -385,7 +385,7 @@ msgstr "Legătură sym ruptă: {path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Build a package from source" -msgstr "" +msgstr "Construiți un pachet din sursă" #: ../fdroidserver/build.py msgid "Build all applications available" @@ -415,7 +415,7 @@ msgstr "Construit depozit bazat în \"%s\" cu această configurație:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "Nu se poate actualiza automat aplicația fără CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -460,7 +460,7 @@ msgstr "Categoriile nu sunt setate" #: ../fdroid ../fdroidserver/__main__.py msgid "Check for updates to applications" -msgstr "" +msgstr "Verificați dacă există actualizări ale aplicațiilor" #: ../fdroidserver/update.py #, python-brace-format @@ -532,9 +532,8 @@ msgid "Couldn't find Application ID" msgstr "Nu s-a putut găsi ID-ul aplicației" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "Couldn't find any version information" -msgstr "Nu a putut găsi numele celei mai recente versiuni" +msgstr "Nu am putut găsi nicio informație despre versiune" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py @@ -560,7 +559,7 @@ msgstr "Creați o cheie de semnare repo într-un depozit de chei" #: ../fdroidserver/update.py msgid "Create skeleton metadata files that are missing" -msgstr "" +msgstr "Creați fișiere de metadate schelet care lipsesc" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -609,7 +608,7 @@ msgstr "DEBUG_KEYSTORE nu este setat sau valoarea este incompletă" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "" +msgstr "Ștergeți APK-urile și/sau OBB-urile fără metadate din repo" #: ../fdroidserver/deploy.py #, python-brace-format @@ -694,7 +693,7 @@ msgstr "Descărcați jurnalele pe care nu le avem" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "Descărcare %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." @@ -717,7 +716,7 @@ msgstr "Legătură duplicată în \"{field}\": {url}" #: ../fdroid msgid "Dynamically scan APKs post build" -msgstr "" +msgstr "Scanarea dinamică a APK-urilor post build" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -817,9 +816,8 @@ msgid "Failed to get APK manifest information" msgstr "Nu a reușit să obțină informații despre manifestul APK" #: ../fdroidserver/update.py -#, fuzzy msgid "Failed to get APK signing key fingerprint" -msgstr "Nu a reușit să obțină informații despre manifestul APK" +msgstr "Nu a reușit să obțină amprenta digitală a cheii de semnare APK" #: ../fdroidserver/install.py #, python-brace-format @@ -952,9 +950,8 @@ msgid "Git fetch failed" msgstr "Git fetch a eșuat" #: ../fdroidserver/common.py -#, fuzzy msgid "Git prune failed" -msgstr "Resetarea Git a eșuat" +msgstr "Git plum a eșuat" #: ../fdroidserver/common.py msgid "Git remote set-head failed" @@ -1033,12 +1030,12 @@ msgstr "Includeți tarball-urile sursă în oglindă" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" -msgstr "" +msgstr "Includerea metadatelor din %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" -msgstr "" +msgstr "Includerea metadatelor din {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1050,7 +1047,7 @@ msgstr "Instalați toate aplicațiile semnate disponibile" #: ../fdroid ../fdroidserver/__main__.py msgid "Install built packages on devices" -msgstr "" +msgstr "Instalarea pachetelor construite pe dispozitive" #: ../fdroidserver/install.py #, python-format @@ -1074,7 +1071,7 @@ msgstr "Instalarea '{apkfilename}' pe {dev}…" #: ../fdroid ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" -msgstr "" +msgstr "Interacționați cu serverul HTTP repo" #: ../fdroidserver/update.py msgid "Invalid APK" @@ -1083,12 +1080,12 @@ msgstr "APK invalid" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "AutoUpdateMode invalid: {mode}" #: ../fdroidserver/checkupdates.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "Nume de pachet nevalabil {0}" +msgstr "UpdateCheckMode invalid: {mode}" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format @@ -1145,7 +1142,7 @@ msgstr "Nume nevalabil pentru fișierul publicat: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "Ndk invalid: intrare în build: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format @@ -1209,9 +1206,9 @@ msgid "Javascript in HTML src attributes" msgstr "Javascript în atributele src HTML" #: ../fdroidserver/build.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "Citirea minSdkVersion a eșuat: \"{apkfilename}\"" +msgstr "Nu a reușit să construiască \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" @@ -1235,9 +1232,8 @@ msgid "List files that would be reformatted" msgstr "Lista fișierelor care vor fi reformatate" #: ../fdroidserver/rewritemeta.py -#, fuzzy msgid "List files that would be reformatted (dry run)" -msgstr "Lista fișierelor care vor fi reformatate" +msgstr "Lista fișierelor care ar urma să fie reformatate (execuție în regim de probă)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" @@ -1273,9 +1269,9 @@ msgid "No 'config.yml' found, using defaults." msgstr "Nu s-a găsit niciun 'config.yml', se folosesc valorile implicite." #: ../fdroidserver/verify.py -#, fuzzy, python-format +#, python-format msgid "No APK for package: %s" -msgstr "Nu există un astfel de pachet: %s" +msgstr "Nu există APK pentru pachetul: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1315,14 +1311,13 @@ msgid "No information found." msgstr "Nu s-au găsit informații." #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No matching tags found" -msgstr "Nu s-au găsit informații." +msgstr "Nu s-au găsit etichete corespunzătoare" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "Nu s-a găsit niciun config.yml, se folosesc valorile implicite." +msgstr "Nu a fost găsită nicio versiune minimă a SDK în {0}, se utilizează versiunea implicită (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1366,9 +1361,8 @@ msgid "No such versionCode {versionCode} for app {appid}" msgstr "Nu există un astfel de versionCode {versionCode} pentru aplicația {appid}" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No tags found" -msgstr "Nu s-au găsit dispozitive atașate" +msgstr "Nu s-au găsit etichete" #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" @@ -1530,7 +1524,7 @@ msgstr "Producerea de fișiere XML/JSON lizibile de către om pentru fișierele #: ../fdroidserver/update.py msgid "Produce human-readable index.xml" -msgstr "" +msgstr "Produce index.xml lizibil pentru oameni" #: ../fdroidserver/import.py msgid "Project URL to import from." @@ -1556,11 +1550,11 @@ msgstr "Împingerea către {url}" #: ../fdroid ../fdroidserver/__main__.py msgid "Quickly start a new repository" -msgstr "" +msgstr "Începeți rapid un nou depozit" #: ../fdroid ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" -msgstr "" +msgstr "Citiți toate fișierele de metadate și ieșiți" #: ../fdroidserver/common.py #, python-brace-format @@ -1595,15 +1589,15 @@ msgstr "Eliminarea fișierelor specificate" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "Eliminarea lui {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" -msgstr "" +msgstr "Redenumiți fișierele APK care nu se potrivesc cu package.name_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "Modul de actualizare RepoTrunk are sens doar în depozitele git-svn" #: ../fdroidserver/update.py msgid "Report on build data status" @@ -1628,7 +1622,7 @@ msgstr "Limitarea ieșirii la avertismente și erori" #: ../fdroid ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" -msgstr "" +msgstr "Rescrieți toate fișierele de metadate" #: ../fdroidserver/rewritemeta.py msgid "Rewrite to a specific format: " @@ -1687,14 +1681,13 @@ msgstr[1] "Scannerul a găsit {} probleme" msgstr[2] "Scannerul a găsit {} probleme" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with apkanalyzer for known non-free classes." -msgstr "Scanați APK-ul (APK-urile) rezultat(e) pentru clasele cunoscute care nu sunt libere." +msgstr "Scanarea APK cu apkanalyzer pentru clasele non-libere cunoscute." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "" +msgstr "Setați NDK {release} ({version}) sus" #: ../fdroidserver/common.py msgid "Set clock to that time using:" @@ -1742,7 +1735,7 @@ msgstr "Ignorarea '{apkfilename}' cu semnătură invalidă!" #: ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "Omiterea oglinzii GitLab Pages pentru că repo-ul este prea mare (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format @@ -1811,11 +1804,11 @@ msgstr "Ceasul sistemului este mai vechi decât data din {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" +msgstr "Modul de actualizare a etichetelor funcționează doar pentru depozitele git, hg, bzr și git-svn în prezent" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" +msgstr "Modul de actualizare a etichetelor folosit în git-svn, dar repo-ul nu a fost configurat cu etichete" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." @@ -1884,6 +1877,13 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" +"Pentru a finaliza configurarea, adăugați APK-urile la \"%s\"\n" +"apoi rulați \"fdroid update -c; fdroid update\". De asemenea, este posibil să doriți să editați\n" +"\"config.yml\" pentru a seta URL-ul, numele repo și altele. De asemenea, ar trebui să configurați\n" +"o cheie de semnare (este posibil ca una temporară să fi fost generată automat).\n" +"\n" +"Pentru mai multe informații: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"și https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -1917,7 +1917,7 @@ msgstr "Etichetă de licență neașteptată \"{}\"! Utilizați numai etichetele #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" +msgstr "Neașteptată țintă symlink: {link} -> {target}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2045,7 +2045,7 @@ msgstr "Cale de scanare neutilizată: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "Decomprimarea la %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -2231,9 +2231,8 @@ msgid "ambiguous option: %s (%s?)" msgstr "opțiune ambiguă: %s (%s?)" #: ../fdroidserver/common.py -#, fuzzy msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "apksigner nu a fost găsit, este necesar pentru a semna!" +msgstr "apksigner nu a fost găsit! Nu se poate semna sau verifica APK-urile moderne" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2362,7 +2361,7 @@ msgstr "a creat {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "versiunea curentă este mai nouă: old vercode={old}, new vercode={new}" #: ../fdroidserver/update.py #, python-brace-format @@ -2489,7 +2488,7 @@ msgstr "șir de opțiuni invalid %(option)r: trebuie să înceapă cu un caracte #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "ultima rețetă de construcție este mai nouă: old vercode={old}, new vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2534,9 +2533,8 @@ msgid "no version info found!" msgstr "nu s-au găsit informații despre versiune!" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "no version information found" -msgstr "nu s-au găsit informații despre versiune!" +msgstr "nu s-au găsit informații despre versiune" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2659,7 +2657,7 @@ msgstr "s3cmd sincronizează indexurile {path} cu {url} și șterge" #: ../fdroidserver/scanner.py #, python-format msgid "scanner not cleanly run apkanalyzer: %s" -msgstr "" +msgstr "scanerul nu a rulat curat apkanalyzer: %s" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2808,7 +2806,7 @@ msgstr "{appid} din {path} nu este un nume de pachet Java valid!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid} are atât APK-uri, cât și fișiere: {files}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2892,9 +2890,9 @@ msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} mai mult de 200MB, încărcați manual: {url}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path}: {error}" -msgstr "A eșuat copierea {path}: {error}" +msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format From 9557a0ba150c4e6822dc938ddbc30f304185847a Mon Sep 17 00:00:00 2001 From: JY3 Date: Sat, 26 Mar 2022 17:14:47 +0100 Subject: [PATCH 0761/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by JY3 Currently translated at 44.1% (270 of 612 strings) Co-authored-by: JY3 Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 6a980c0c..855116aa 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -12,22 +12,22 @@ # ZZY2357 , 2021. # yahoo~~ , 2021. # Liu Wenyuan <15816141883@163.com>, 2021. -# JY3 , 2021. +# JY3 , 2021, 2022. # Eric , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-02-16 07:41+0000\n" -"Last-Translator: Eric \n" +"PO-Revision-Date: 2022-02-27 11:55+0000\n" +"Last-Translator: JY3 \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 4.11.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -394,7 +394,7 @@ msgstr "从源代码构建安装包" #: ../fdroidserver/build.py msgid "Build all applications available" -msgstr "编译全部可用应用" +msgstr "构建全部可用应用" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" From 96935e26d53d5deac6e544024e845b6d49cc9f4a Mon Sep 17 00:00:00 2001 From: shenzhui007 <12231252@bjtu.edu.cn> Date: Sat, 26 Mar 2022 17:14:49 +0100 Subject: [PATCH 0762/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by shenzhui007 <12231252@bjtu.edu.cn> Currently translated at 44.4% (272 of 612 strings) Co-authored-by: shenzhui007 <12231252@bjtu.edu.cn> Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 855116aa..ace53e1a 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -14,20 +14,21 @@ # Liu Wenyuan <15816141883@163.com>, 2021. # JY3 , 2021, 2022. # Eric , 2022. +# shenzhui007 <12231252@bjtu.edu.cn>, 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-02-27 11:55+0000\n" -"Last-Translator: JY3 \n" +"PO-Revision-Date: 2022-03-26 16:14+0000\n" +"Last-Translator: shenzhui007 <12231252@bjtu.edu.cn>\n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.11.1-dev\n" +"X-Generator: Weblate 4.12-dev\n" #: ../fdroidserver/common.py msgid "" @@ -696,7 +697,7 @@ msgstr "下载当前没有的日志" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "下载%s中" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." @@ -807,7 +808,7 @@ msgstr "创建亚马逊简易储存服务失败:{url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" -msgstr "" +msgstr "获取APK信息失败,删除{path}中" #: ../fdroidserver/update.py #, python-brace-format From 6f742fa5cc5f548ff7e4e8d6eca7e41d47173cde Mon Sep 17 00:00:00 2001 From: JY3 Date: Sat, 9 Apr 2022 15:59:35 +0000 Subject: [PATCH 0763/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by JY3 Currently translated at 44.4% (272 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index ace53e1a..14d0c0d5 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -20,8 +20,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-03-26 16:14+0000\n" -"Last-Translator: shenzhui007 <12231252@bjtu.edu.cn>\n" +"PO-Revision-Date: 2022-04-10 16:08+0000\n" +"Last-Translator: JY3 \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" @@ -697,7 +697,7 @@ msgstr "下载当前没有的日志" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "下载%s中" +msgstr "正在下载 %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." @@ -808,7 +808,7 @@ msgstr "创建亚马逊简易储存服务失败:{url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" -msgstr "获取APK信息失败,删除{path}中" +msgstr "获取 APK 信息失败,正在删除 {path}" #: ../fdroidserver/update.py #, python-brace-format From 41265994e4896220819d7c7f315dcc8f7bb78eb2 Mon Sep 17 00:00:00 2001 From: Trey Yang Date: Mon, 6 Jun 2022 15:04:17 +0000 Subject: [PATCH 0764/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Trey Yang Currently translated at 48.0% (294 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 55 +++++++++++----------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 14d0c0d5..a84333cc 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -2,7 +2,7 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # ERDwaYbR , 2020. -# Trey Yang , 2020. +# Trey Yang , 2020, 2022. # taiyuan <1006333969@qq.com>, 2020. # Eric , 2020, 2021. # Carlos , 2021. @@ -20,15 +20,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-04-10 16:08+0000\n" -"Last-Translator: JY3 \n" +"PO-Revision-Date: 2022-06-06 23:27+0000\n" +"Last-Translator: Trey Yang \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.13-dev\n" #: ../fdroidserver/common.py msgid "" @@ -421,7 +421,7 @@ msgstr "使用此配置并基于 \"%s\" 的构建存储库:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "在没有CurrentVersionCode的情况下不能自动更新应用程序" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -813,24 +813,24 @@ msgstr "获取 APK 信息失败,正在删除 {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" -msgstr "" +msgstr "获取APK信息失败,跳过{path}" #: ../fdroidserver/common.py msgid "Failed to get APK manifest information" -msgstr "" +msgstr "未能获取 APK 清单信息" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" -msgstr "" +msgstr "未能获取APK签名密钥指纹" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" -msgstr "" +msgstr "无法在 {dev} 上安装“{apkfilename}”:{error}" #: ../fdroidserver/publish.py ../fdroidserver/common.py msgid "Failed to sign application" -msgstr "" +msgstr "未能对应用程序进行签名" #: ../fdroidserver/common.py msgid "Failed to zipalign application" @@ -839,24 +839,24 @@ msgstr "未能归档对齐(zipalign)应用" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" -msgstr "" +msgstr "从虚拟机获取了buildserverid:{buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" -msgstr "" +msgstr "获取了'{apkfilename}'的签名-> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" -msgstr "" +msgstr "文件在处理时消失: {path}" #: ../fdroidserver/verify.py ../fdroidserver/stats.py ../fdroidserver/update.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/build.py #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py msgid "Finished" -msgstr "" +msgstr "已完成" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID flag" @@ -868,7 +868,7 @@ msgstr "" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" -msgstr "" +msgstr "禁止的HTML标签" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." @@ -877,35 +877,35 @@ msgstr "强制编译已禁用应用,忽略扫描出错。仅用于测试模式 #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" -msgstr "" +msgstr "在{0}秒超时后强制停止构建!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." -msgstr "" +msgstr "强制扫描已禁用的应用和内部版本。" #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" -msgstr "" +msgstr "为应用程序“{name}”找到了没有元数据的“{path}”图形!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" -msgstr "" +msgstr "为“{name}”找到了错误的资金文件“{path}”:" #: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" -msgstr "" +msgstr "在参数中发现无效的appids" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" -msgstr "" +msgstr "发现某些应用的版本代码无效" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "" +msgstr "在{path}中发现多个JAR签名块文件" #: ../fdroidserver/metadata.py #, python-brace-format @@ -913,27 +913,28 @@ msgid "Found multiple metadata files for {appid}" msgstr "找到多个{appid}的元数据文件" #: ../fdroidserver/index.py +#, fuzzy msgid "Found multiple signing certificates for repository." -msgstr "" +msgstr "发现存储库的多个签名证书。" #: ../fdroidserver/update.py #, python-brace-format msgid "Found multiple signing certificates in {path}" -msgstr "" +msgstr "在{path}中发现多个签名证书" #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." -msgstr "" +msgstr "未找到存储库的签名证书。" #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" -msgstr "" +msgstr "在%s处发现非文件" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" -msgstr "" +msgstr "在{url}发现{apkfilename}" #: ../fdroidserver/update.py #, python-brace-format From 558d94c87b3f39c8aadcfce79b664a48239fe262 Mon Sep 17 00:00:00 2001 From: Eric Date: Mon, 6 Jun 2022 23:27:24 +0000 Subject: [PATCH 0765/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Eric Currently translated at 48.2% (295 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index a84333cc..cdc8a5d3 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -20,8 +20,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-06-06 23:27+0000\n" -"Last-Translator: Trey Yang \n" +"PO-Revision-Date: 2022-06-07 05:47+0000\n" +"Last-Translator: Eric \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" @@ -913,7 +913,6 @@ msgid "Found multiple metadata files for {appid}" msgstr "找到多个{appid}的元数据文件" #: ../fdroidserver/index.py -#, fuzzy msgid "Found multiple signing certificates for repository." msgstr "发现存储库的多个签名证书。" From 831918d8bb9c1e094f2cd27f6892d25555acb17f Mon Sep 17 00:00:00 2001 From: linsui Date: Wed, 8 Jun 2022 05:27:38 +0000 Subject: [PATCH 0766/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by linsui Currently translated at 53.5% (328 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 71 +++++++++++----------- 1 file changed, 36 insertions(+), 35 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index cdc8a5d3..0cea679b 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -15,13 +15,14 @@ # JY3 , 2021, 2022. # Eric , 2022. # shenzhui007 <12231252@bjtu.edu.cn>, 2022. +# linsui , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-06-07 05:47+0000\n" -"Last-Translator: Eric \n" +"PO-Revision-Date: 2022-06-08 13:41+0000\n" +"Last-Translator: linsui \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" @@ -860,11 +861,11 @@ msgstr "已完成" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID flag" -msgstr "" +msgstr "Flattr 捐赠方法属于 FlattrID 标志" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" +msgstr "Flattr 捐赠方法属于 FlattrID: 字段" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" @@ -943,98 +944,98 @@ msgstr "生成了{appid}的骨架元数据" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" -msgstr "" +msgstr "'%s' 的 Git 签出失败" #: ../fdroidserver/common.py msgid "Git clean failed" -msgstr "" +msgstr "Git clean 失败" #: ../fdroidserver/common.py msgid "Git fetch failed" -msgstr "" +msgstr "Git fetch 失败" #: ../fdroidserver/common.py msgid "Git prune failed" -msgstr "" +msgstr "Git prune 失败" #: ../fdroidserver/common.py msgid "Git remote set-head failed" -msgstr "" +msgstr "Git remote set-head 失败" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" -msgstr "" +msgstr "Git remote set-head 失败:\"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" -msgstr "" +msgstr "Git reset 失败" #: ../fdroidserver/common.py msgid "Git submodule sync failed" -msgstr "" +msgstr "Git 子模块同步失败" #: ../fdroidserver/common.py msgid "Git submodule update failed" -msgstr "" +msgstr "Git 子模块更新失败" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" -msgstr "" +msgstr "HTTPS 必须与 Subversion URL 一起使用!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "" +msgstr "如果 git 镜像变大,允许删除存档" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "" +msgstr "如果此上传失败,请尝试手动上传到 {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "" +msgstr "忽略“{metapath}”元数据中的“{field}”,因为它已被弃用。" #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" -msgstr "" +msgstr "忽略超过 2048 的 FUNDING.yml 条目:%s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " -msgstr "" +msgstr "忽略没有元数据的包: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" -msgstr "" +msgstr "忽略 {apkfilename} 的过时缓存数据" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Ignoring {ext} file at '{path}'" -msgstr "" +msgstr "忽略“{path}”处的 {ext} 文件" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "" +msgstr "包括使用已禁用的算法(如 MD5)签名的 APK" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" -msgstr "" +msgstr "在镜像中包含 PGP 签名 .asc 文件" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" -msgstr "" +msgstr "在镜像中包含构建日志" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" -msgstr "" +msgstr "在镜像中包含源 tarball" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" -msgstr "" +msgstr "包括来自 %s@%s 的元数据" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1043,7 +1044,7 @@ msgstr "包含来自 {path} 的元数据" #: ../fdroidserver/common.py msgid "Initialising submodules" -msgstr "" +msgstr "初始化子模块" #: ../fdroidserver/install.py msgid "Install all signed applications available" @@ -1056,22 +1057,22 @@ msgstr "在设备上安装生成的安装包" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." -msgstr "" +msgstr "正在安装 %s..." #: ../fdroidserver/install.py #, python-format msgid "Installing %s…" -msgstr "" +msgstr "正在安装 %s…" #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." -msgstr "" +msgstr "在 {dev} 上安装“{apkfilename}”..." #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}…" -msgstr "" +msgstr "在 {dev} 上安装“{apkfilename}”…" #: ../fdroid ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" @@ -1079,22 +1080,22 @@ msgstr "与存储库 HTTP 服务器互动" #: ../fdroidserver/update.py msgid "Invalid APK" -msgstr "" +msgstr "无效的 APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "无效的 AutoUpdateMode: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "" +msgstr "无效的 UpdateCheckMode:{mode}" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" -msgstr "" +msgstr "无效的 VercodeOperation:{field}" #: ../fdroidserver/common.py #, python-brace-format From cf59b2a6d636b95bcea1ed9bd3d4e01e3945299c Mon Sep 17 00:00:00 2001 From: linsui Date: Thu, 9 Jun 2022 10:55:01 +0000 Subject: [PATCH 0767/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by linsui Currently translated at 54.4% (333 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 0cea679b..43f72634 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -21,7 +21,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-06-08 13:41+0000\n" +"PO-Revision-Date: 2022-06-10 11:01+0000\n" "Last-Translator: linsui \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" @@ -1100,26 +1100,26 @@ msgstr "无效的 VercodeOperation:{field}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" -msgstr "" +msgstr "无效的应用 ID {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" -msgstr "" +msgstr "无效的布尔值'%s'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid build flag at {line} in {linedesc}" -msgstr "" +msgstr "{linedesc} 中 {line} 的构建标志无效" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid build format: {value} in {name}" -msgstr "" +msgstr "无效的构建格式:{name} 中的 {value}" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" -msgstr "" +msgstr "无效的项目符号列表" #: ../fdroidserver/lint.py #, python-format From db5fa45728c30f19ff1a5bafec862cd0564bc0f9 Mon Sep 17 00:00:00 2001 From: YangYulin Date: Sun, 3 Jul 2022 01:11:19 +0000 Subject: [PATCH 0768/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by YangYulin Currently translated at 54.7% (335 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 43f72634..43b9fc0e 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -16,20 +16,21 @@ # Eric , 2022. # shenzhui007 <12231252@bjtu.edu.cn>, 2022. # linsui , 2022. +# YangYulin , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-06-10 11:01+0000\n" -"Last-Translator: linsui \n" +"PO-Revision-Date: 2022-07-03 09:32+0000\n" +"Last-Translator: YangYulin \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -1124,11 +1125,11 @@ msgstr "无效的项目符号列表" #: ../fdroidserver/lint.py #, python-format msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" -msgstr "" +msgstr "无效的许可证标签“%s”!仅使用 https://spdx.org/license-list 中的标签" #: ../fdroidserver/lint.py msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "" +msgstr "无效链接 - 使用 [http://foo.bar 链接标题] 或 [http://foo.bar]" #: ../fdroidserver/metadata.py #, python-format From d84b2da77c35c31dc91c87a2f444444ebdb2c599 Mon Sep 17 00:00:00 2001 From: YangYulin Date: Thu, 14 Jul 2022 03:02:31 +0000 Subject: [PATCH 0769/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by YangYulin Currently translated at 56.3% (345 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 24 +++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 43b9fc0e..8a342eaf 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -22,7 +22,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-07-03 09:32+0000\n" +"PO-Revision-Date: 2022-07-14 21:54+0000\n" "Last-Translator: YangYulin \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" @@ -30,7 +30,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: ../fdroidserver/common.py msgid "" @@ -1134,31 +1134,31 @@ msgstr "无效链接 - 使用 [http://foo.bar 链接标题] 或 [http://foo.bar] #: ../fdroidserver/metadata.py #, python-format msgid "Invalid metadata in %s:%d" -msgstr "" +msgstr "%s 中的元数据无效:%d" #: ../fdroidserver/metadata.py msgid "Invalid metadata in: " -msgstr "" +msgstr "以下位置的元数据无效: " #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" -msgstr "" +msgstr "已发布文件的名称无效: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "ndk 无效:构建中的条目:“{ndk}”" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid package name {0}" -msgstr "" +msgstr "无效的安装包名称{0}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " -msgstr "" +msgstr "无效的重定向至非 HTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format @@ -1168,22 +1168,22 @@ msgstr "无效的scrlib元数据:'{file}'不存在" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" -msgstr "" +msgstr "无效的 srclib 元数据:无法解析“{file}”" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "" +msgstr "无效的 srclib 元数据:“{file}”中的未知键“{key}”" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid versionCode: \"{versionCode}\" is not an integer!" -msgstr "" +msgstr "版本代码无效:“{versionCode}”不是整数!" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" -msgstr "" +msgstr "无法验证 JAR 签名:{path}" #: ../fdroidserver/common.py #, python-brace-format From 9816b42373b44b037569020d5e9f1e39f69856bb Mon Sep 17 00:00:00 2001 From: YangYulin Date: Sat, 16 Jul 2022 04:53:16 +0000 Subject: [PATCH 0770/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by YangYulin Currently translated at 58.0% (355 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 8a342eaf..3df444d0 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -22,7 +22,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-07-14 21:54+0000\n" +"PO-Revision-Date: 2022-07-17 12:26+0000\n" "Last-Translator: YangYulin \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" @@ -1188,33 +1188,33 @@ msgstr "无法验证 JAR 签名:{path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" -msgstr "" +msgstr "已验证的 JAR 签名:{path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" -msgstr "" +msgstr "Java JAR 文件" #: ../fdroidserver/publish.py ../fdroidserver/update.py #: ../fdroidserver/mirror.py msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "" +msgstr "未找到 Java JDK!安装在标准位置或设置java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" -msgstr "" +msgstr "Java 编译类" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" -msgstr "" +msgstr "未找到 Java jarsigner!安装在标准位置或设置java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" -msgstr "" +msgstr "HTML src 属性中的 Javascript" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "" +msgstr "保持失败的生成“{apkfilename}”" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" @@ -1223,15 +1223,15 @@ msgstr "签名密钥的密钥库:\t" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "" +msgstr "最后使用的提交 '{commit}' 看起来像一个标签,但 UpdateCheckMode 是 '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" -msgstr "" +msgstr "Liberapay 捐赠方式属于 Liberapay: 字段" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the LiberapayID flag" -msgstr "" +msgstr "Liberapay 捐赠方式属于 LiberapayID 标志" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted" From 977a2661a93a38cb8484b9326b3eaee579be5e77 Mon Sep 17 00:00:00 2001 From: Yang Yulin Date: Tue, 19 Jul 2022 04:18:23 +0000 Subject: [PATCH 0771/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Yang Yulin Currently translated at 60.6% (371 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 35 +++++++++++----------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 3df444d0..f80cbc43 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -17,13 +17,14 @@ # shenzhui007 <12231252@bjtu.edu.cn>, 2022. # linsui , 2022. # YangYulin , 2022. +# Yang Yulin , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-07-17 12:26+0000\n" -"Last-Translator: YangYulin \n" +"PO-Revision-Date: 2022-07-19 17:13+0000\n" +"Last-Translator: Yang Yulin \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" @@ -1243,7 +1244,7 @@ msgstr "列出将被重新设定格式的文件 (dry run)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" -msgstr "" +msgstr "包含在 f-droid.org URL 中的区域设置" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" @@ -1251,62 +1252,62 @@ msgstr "异常时中止编译" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." -msgstr "" +msgstr "格式错误的存储库镜像。" #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" -msgstr "" +msgstr "格式错误的服务器网络根行:" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." -msgstr "" +msgstr "镜像完整存储库和存档,所有文件类型。" #: ../fdroidserver/gpgsign.py msgid "Missing output directory" -msgstr "" +msgstr "缺少输出目录" #: ../fdroidserver/lint.py #, python-format msgid "Name '%s' is just the auto name - remove it" -msgstr "" +msgstr "名称 '%s' 只是自动名称 - 删除它" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." -msgstr "" +msgstr "未找到“config.yml”,使用默认值。" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" -msgstr "" +msgstr "没有 APK 安装包: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" -msgstr "" +msgstr "未找到 Android SDK!" #: ../fdroidserver/import.py msgid "No android or kivy project could be found. Specify --subdir?" -msgstr "" +msgstr "找不到 android 或 kivy 项目。指定 --subdir?" #: ../fdroidserver/install.py msgid "No attached devices found" -msgstr "" +msgstr "未找到连接的设备" #: ../fdroidserver/metadata.py #, python-brace-format msgid "No commit specified for {versionName} in {linedesc}" -msgstr "" +msgstr "在 {linedesc} 中没有为 {versionName} 指定提交" #: ../fdroidserver/common.py msgid "No config.yml found, using defaults." -msgstr "" +msgstr "未找到 config.yml,使用默认值。" #: ../fdroidserver/index.py msgid "No fingerprint in URL." -msgstr "" +msgstr "URL 中没有指纹。" #: ../fdroidserver/common.py msgid "No git submodules available" -msgstr "" +msgstr "没有可用的 git 子模块" #: ../fdroidserver/import.py msgid "No gradle project could be found. Specify --subdir?" From 776019964bd4930da15abd805821e713c5d93719 Mon Sep 17 00:00:00 2001 From: JY3 Date: Mon, 18 Jul 2022 15:17:06 +0000 Subject: [PATCH 0772/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by JY3 Currently translated at 60.6% (371 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index f80cbc43..c666962f 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -24,7 +24,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2022-07-19 17:13+0000\n" -"Last-Translator: Yang Yulin \n" +"Last-Translator: JY3 \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" @@ -2864,7 +2864,7 @@ msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" -msgstr "" +msgstr "{path} 不存在!通过运行以下命令创建它:" #: ../fdroidserver/update.py #, python-brace-format From 1fe5d140d3f9c6d65ce3cedb506e9b63a444756b Mon Sep 17 00:00:00 2001 From: Yang Yulin Date: Sat, 30 Jul 2022 01:49:01 +0000 Subject: [PATCH 0773/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Yang Yulin Currently translated at 61.1% (374 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index c666962f..e76336ed 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -23,8 +23,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-07-19 17:13+0000\n" -"Last-Translator: JY3 \n" +"PO-Revision-Date: 2022-07-30 07:00+0000\n" +"Last-Translator: Yang Yulin \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" @@ -1311,15 +1311,15 @@ msgstr "没有可用的 git 子模块" #: ../fdroidserver/import.py msgid "No gradle project could be found. Specify --subdir?" -msgstr "" +msgstr "找不到任何 gradle 项目。指定 --subdir?" #: ../fdroidserver/import.py ../fdroidserver/common.py msgid "No information found." -msgstr "" +msgstr "未找到任何信息。" #: ../fdroidserver/checkupdates.py msgid "No matching tags found" -msgstr "" +msgstr "未找到匹配的标签" #: ../fdroidserver/update.py #, python-brace-format From 51c730f8e5cc003e1e80fdf24e8016efe01db65a Mon Sep 17 00:00:00 2001 From: yangyangdaji <1504305527@qq.com> Date: Thu, 11 Aug 2022 06:36:30 +0000 Subject: [PATCH 0774/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by yangyangdaji <1504305527@qq.com> Currently translated at 61.4% (376 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index e76336ed..819ad301 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -18,13 +18,14 @@ # linsui , 2022. # YangYulin , 2022. # Yang Yulin , 2022. +# yangyangdaji <1504305527@qq.com>, 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-07-30 07:00+0000\n" -"Last-Translator: Yang Yulin \n" +"PO-Revision-Date: 2022-08-11 20:47+0000\n" +"Last-Translator: yangyangdaji <1504305527@qq.com>\n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" @@ -1328,11 +1329,11 @@ msgstr "" #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" -msgstr "" +msgstr "不需要说明该应用是自由软件" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" -msgstr "" +msgstr "不需要说明该应用是用于安卓的" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" From 5497f6e4dd6d84d48ebd6d78ff4eec2d00e154de Mon Sep 17 00:00:00 2001 From: Yang Yulin Date: Sat, 13 Aug 2022 08:58:18 +0000 Subject: [PATCH 0775/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Yang Yulin Currently translated at 63.7% (390 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 32 +++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 819ad301..4f15c77b 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -24,8 +24,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-08-11 20:47+0000\n" -"Last-Translator: yangyangdaji <1504305527@qq.com>\n" +"PO-Revision-Date: 2022-08-14 09:14+0000\n" +"Last-Translator: Yang Yulin \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" @@ -1325,7 +1325,7 @@ msgstr "未找到匹配的标签" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "" +msgstr "在 {0} 中找不到最低 SDK 版本,使用默认值 (3)。" #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1337,61 +1337,61 @@ msgstr "不需要说明该应用是用于安卓的" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" -msgstr "" +msgstr "未设置选项!编辑您的 config.yml 以设置以下至少一个:" #: ../fdroidserver/common.py msgid "No packages specified" -msgstr "" +msgstr "未指定包" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" -msgstr "" +msgstr "%s 没有可用的签名 APK" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" -msgstr "" +msgstr "无签名输出目录 - 无任何操作" #: ../fdroidserver/update.py ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" -msgstr "" +msgstr "在 {path} 中找不到签名证书" #: ../fdroidserver/common.py ../fdroidserver/metadata.py #, python-format msgid "No such package: %s" -msgstr "" +msgstr "没有这样的包:%s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" -msgstr "" +msgstr "应用程序 {appid} 没有此类版本代码 {versionCode}" #: ../fdroidserver/checkupdates.py msgid "No tags found" -msgstr "" +msgstr "未找到标签" #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" -msgstr "" +msgstr "没有未签名的目录 - 无操作" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" -msgstr "" +msgstr "不是有效的大小定义:“{}”" #: ../fdroidserver/signindex.py msgid "Nothing to do" -msgstr "" +msgstr "无操作" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." -msgstr "" +msgstr "对 {appid} 无任何可操作。" #: ../fdroidserver/init.py msgid "Now set these in config.yml:" -msgstr "" +msgstr "现在在 config.yml 中设置这些:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py From c94a9894cc20907e63178e4180394e5ee292ad60 Mon Sep 17 00:00:00 2001 From: Yang Yulin Date: Mon, 15 Aug 2022 04:54:24 +0000 Subject: [PATCH 0776/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Yang Yulin Currently translated at 67.3% (412 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 46 +++++++++++----------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 4f15c77b..8a105719 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -24,7 +24,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-08-14 09:14+0000\n" +"PO-Revision-Date: 2022-08-16 05:21+0000\n" "Last-Translator: Yang Yulin \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" @@ -1397,33 +1397,33 @@ msgstr "现在在 config.yml 中设置这些:" #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" -msgstr "" +msgstr "OBB 文件的版本代码({integer})比任何 APK 都要新:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" -msgstr "" +msgstr "OBB 文件名必须以“main.”或“patch.”开头:" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" -msgstr "" +msgstr "OBB 的软件包名称与受支持的 APK 不匹配:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" +msgstr "脱机计算机,跳过 git 镜像生成直到 `fdroid deploy`" #: ../fdroidserver/common.py #, python-brace-format msgid "Old APK signature failed to verify: {path}" -msgstr "" +msgstr "旧版 APK 签名验证失败:{path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Old, deprecated name for fdroid deploy" -msgstr "" +msgstr "fdroid deploy 的旧名称,已弃用" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" -msgstr "" +msgstr "图形仅支持 PNG 和 JPEG,发现:{path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" @@ -1435,7 +1435,7 @@ msgstr "仅处理使用自动更新的应用" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "" +msgstr "OpenCollective 捐赠方法属于 OpenCollective: 字段" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py @@ -1444,17 +1444,17 @@ msgstr "选项" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." -msgstr "" +msgstr "将 JSON 报告输出到以 APK 命名的文件。" #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." -msgstr "" +msgstr "将 JSON 输出到标准输出。" #: ../fdroidserver/gpgsign.py ../fdroidserver/publish.py #: ../fdroidserver/update.py ../fdroidserver/signindex.py #: ../fdroidserver/checkupdates.py msgid "Outputting JSON" -msgstr "" +msgstr "输出 JSON" #: ../fdroidserver/import.py msgid "Overall license of the project." @@ -1463,21 +1463,21 @@ msgstr "项目总体许可证。" #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "" +msgstr "从元数据覆盖 {apkfilename} 中的空白版本名称:{version}" #: ../fdroidserver/import.py #, python-brace-format msgid "Package \"{appid}\" already exists" -msgstr "" +msgstr "包“{appid}”已经存在" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" -msgstr "" +msgstr "在“{path}”处解析清单" #: ../fdroidserver/common.py msgid "Password required with username" -msgstr "" +msgstr "需要密码和用户名" #: ../fdroidserver/import.py msgid "Path to main Android project subdirectory, if not in root." @@ -1500,17 +1500,17 @@ msgstr "资源库签名密钥的密钥存储(keystore)路径" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" -msgstr "" +msgstr "将秘密变量打印到终端以便于复制/粘贴" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" -msgstr "" +msgstr "{appid} 的描述问题:{error}" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" -msgstr "" +msgstr "'{path}' 处的 xml 问题" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" @@ -1519,12 +1519,12 @@ msgstr "处理自动更新" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" -msgstr "" +msgstr "处理 {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" -msgstr "" +msgstr "处理 {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" @@ -1540,7 +1540,7 @@ msgstr "项目 URL 导入位置。" #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" -msgstr "" +msgstr "应避免使用标点符号" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" @@ -1554,7 +1554,7 @@ msgstr "正推送二进制文件透明日志到{url}" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Pushing to {url}" -msgstr "" +msgstr "正在推送至 {url}" #: ../fdroid ../fdroidserver/__main__.py msgid "Quickly start a new repository" From 25a5754c3cf65a111e09dc0693d6468485efd514 Mon Sep 17 00:00:00 2001 From: linsui Date: Mon, 22 Aug 2022 11:06:27 +0000 Subject: [PATCH 0777/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by linsui Currently translated at 70.4% (431 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 32 +++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 8a105719..5c0a061f 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -24,8 +24,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2022-08-16 05:21+0000\n" -"Last-Translator: Yang Yulin \n" +"PO-Revision-Date: 2022-08-23 13:16+0000\n" +"Last-Translator: linsui \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" @@ -1567,24 +1567,24 @@ msgstr "读取全部元数据文件并退出" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" -msgstr "" +msgstr "读取 '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading minSdkVersion failed: \"{apkfilename}\"" -msgstr "" +msgstr "读取 minSdkVersion 失败:\"{apkfilename}\"" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" -msgstr "" +msgstr "读取 packageName/versionCode/versionName 失败,APK 无效:'{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" -msgstr "" +msgstr "从缓存读取 {apkfilename}" #: ../fdroidserver/stats.py msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." @@ -1592,12 +1592,12 @@ msgstr "重新计算聚合统计数据-当已经做出更改而导致旧的缓 #: ../fdroidserver/common.py msgid "Removing specified files" -msgstr "" +msgstr "删除指定文件" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "删除 {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -1605,7 +1605,7 @@ msgstr "重命名文件名不符合 package.name_123.apk 的 APK 文件" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "RepoTrunk 更新模式仅对 git-svn 存储库有意义" #: ../fdroidserver/update.py msgid "Report on build data status" @@ -1618,7 +1618,7 @@ msgstr "即使已有服务器看起来运行正常,请重置并创建一个全 #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" -msgstr "" +msgstr "使用提供的 debug.keystore 重签名 {apkfilename}" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" @@ -1639,16 +1639,16 @@ msgstr "重写为特定格式: " #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" -msgstr "" +msgstr "重写 '{appid}'" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}' to '{path}'" -msgstr "" +msgstr "将 '{appid}' 重写为 '{path}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" -msgstr "" +msgstr "在具有未提交更改的 git 存储库上运行" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1656,16 +1656,16 @@ msgstr "运行“重写元数据”(rewritemeta)修复格式" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Running first pass with MD5 checking disabled" -msgstr "" +msgstr "禁用 MD5 检查并运行第一遍" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" -msgstr "" +msgstr "在 {path} 中运行 wget" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "" +msgstr "扫描产生的 APK(s) 是否有已知的非自由类。" #: ../fdroid ../fdroidserver/__main__.py msgid "Scan the source code of a package" From 8d73bb45ea7ff6147504ea2f6fd5c35dc724abdf Mon Sep 17 00:00:00 2001 From: Yang Yulin Date: Tue, 23 Aug 2022 09:46:41 +0000 Subject: [PATCH 0778/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Yang Yulin Currently translated at 70.4% (431 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 5c0a061f..4a66ae09 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -19,13 +19,14 @@ # YangYulin , 2022. # Yang Yulin , 2022. # yangyangdaji <1504305527@qq.com>, 2022. +# Yang Yulin , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" "PO-Revision-Date: 2022-08-23 13:16+0000\n" -"Last-Translator: linsui \n" +"Last-Translator: Yang Yulin \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" @@ -1674,26 +1675,26 @@ msgstr "扫描一个应用的源代码" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" -msgstr "" +msgstr "扫描仪在 {appid} 中发现 {count} 个问题:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" -msgstr "" +msgstr "扫描仪在 {appid}:{versionCode} 中发现 {count} 个问题:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" -msgstr[0] "" +msgstr[0] "扫描仪发现 {} 个问题" #: ../fdroidserver/scanner.py msgid "Scanning APK with apkanalyzer for known non-free classes." -msgstr "" +msgstr "使用 apkanalyzer 扫描 APK 以查找已知的非免费类。" #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "" +msgstr "设置 NDK {release} ({version})" #: ../fdroidserver/common.py msgid "Set clock to that time using:" From 56e5846dd69ecbc11f48e0f05d6085f4d652bb5a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 6 Sep 2022 14:22:30 +0000 Subject: [PATCH 0779/2116] Translated using Weblate: Tibetan (bo) by Hans-Christoph Steiner Currently translated at 61.7% (378 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/bo/ --- locale/bo/LC_MESSAGES/fdroidserver.po | 40 +++++++++++++-------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index 74720eb1..0f730959 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -1,12 +1,12 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. -# Hans-Christoph Steiner , 2020, 2021. +# Hans-Christoph Steiner , 2020, 2021, 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2021-01-14 14:58+0000\n" +"PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tibetan \n" "Language: bo\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -242,9 +242,8 @@ msgid "/issues is missing" msgstr "/གནས་དོན་བོར་བརླག་སོང་འདུག" #: ../fdroidserver/mirror.py -#, fuzzy msgid "A URL is required as an argument!" -msgstr "གདམ་ཀ། -%s 1 རྩོད་དགོས།" +msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -292,9 +291,8 @@ msgid "Android APK file" msgstr "" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Android DEX code" -msgstr "ཨེན་ཀྲོཌ་ SDK རྙེད་མ་སོང་།!" +msgstr "" #: ../fdroidserver/common.py ../fdroidserver/build.py #, python-brace-format @@ -302,9 +300,9 @@ msgid "Android SDK '{path}' does not have '{dirname}' installed!" msgstr "ཨེན་ཀྲོཌ་SDK '{path}1{dirname}' '{dirname}'སྒྲིག་བཅུག་མིན་འདུག!" #: ../fdroidserver/init.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "ཨེན་ཀྲོཌ་ SDK རྙེད་སོན་བྱུང་མ་སོང་།!" +msgstr "" #: ../fdroidserver/common.py msgid "Android SDK not found!" @@ -321,14 +319,14 @@ msgid "Android SDK path '{path}' is not a directory!" msgstr "ཨེན་ཀྲོཌSDKཐབས་ལམ་ '{path}1' ཡིག་ཆ་གསོག་ཉར་རེད་མིན་འདུག!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} found!" -msgstr "ཨེན་ཀྲོཌ་ SDK རྙེད་སོན་བྱུང་མ་སོང་།!" +msgstr "" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "ཨེན་ཀྲོཌ་ SDK རྙེད་སོན་བྱུང་མ་སོང་།!" +msgstr "" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -510,9 +508,9 @@ msgid "Could not find {path} to remove it" msgstr "{path}མེད་པ་བཟོས་པ་ལ་རྙེད་མ་སོང་།" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "དཔྱད་ཞིབ་ཀྱི་ཆེད་དུ་APK ཡིག་ཆ་ཁ་ཕྱེས་ཐུབ་ཀྱི་མིན་འདུག" +msgstr "" #: ../fdroidserver/common.py #, python-brace-format @@ -1080,9 +1078,9 @@ msgid "Invalid AutoUpdateMode: {mode}" msgstr "" #: ../fdroidserver/checkupdates.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "ཁུངས་ལྡན་མིན་པའི་ཐུམ་སྒྲིལ་གྱི་མིང་།{0}" +msgstr "" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format @@ -1318,9 +1316,9 @@ msgid "No matching tags found" msgstr "གནས་ཚུལ་རྙེད་མ་སོང་།." #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "'config.yml' རྙེད་མ་སོང་།, སོར་བཞག་བེད་སྤྱོད་བྱེད་བཞིན་པ།." +msgstr "" #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -2855,9 +2853,9 @@ msgid "{name} \"{path}\" does not exist! Correct it in config.yml." msgstr "{name} \"{path}\" མིན་འདུག! config.ymlནོར་བཅོས་བྱེད།." #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "{name} \"{path}\" མིན་འདུག! config.ymlནོར་བཅོས་བྱེད།." +msgstr "" #: ../fdroidserver/common.py #, python-brace-format From 78c552aa0a192e327149d08a23a2a58cec2ed6fa Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 6 Sep 2022 14:27:11 +0000 Subject: [PATCH 0780/2116] Translated using Weblate: Chinese (Traditional) (zh_Hant) by Hans-Christoph Steiner Currently translated at 76.3% (467 of 612 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hant/ --- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 84f6c898..95b931c7 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # Jeff Huang , 2020. -# Hans-Christoph Steiner , 2020, 2021. +# Hans-Christoph Steiner , 2020, 2021, 2022. # NightFeather , 2020. # ifurther , 2021. # Stiffen , 2021. @@ -10,15 +10,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-02-15 20:04+0100\n" -"PO-Revision-Date: 2021-05-19 11:33+0000\n" -"Last-Translator: Stiffen \n" +"PO-Revision-Date: 2022-09-06 14:30+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Chinese (Traditional) \n" "Language: zh_Hant\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.7-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: ../fdroidserver/common.py #, fuzzy @@ -1098,9 +1098,9 @@ msgid "Invalid AutoUpdateMode: {mode}" msgstr "" #: ../fdroidserver/checkupdates.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "無效的套件包稱 {0}" +msgstr "" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format @@ -1338,9 +1338,9 @@ msgid "No matching tags found" msgstr "查無資訊。" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "找不到檔案 'config.yml',使用預設。" +msgstr "" #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" From 4fc9c309c1e4e4eff03a661c682502b5be2d4850 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 6 Sep 2022 22:26:05 +0200 Subject: [PATCH 0781/2116] make -C locale/ update --- locale/bn/LC_MESSAGES/fdroidserver.po | 181 ++++-- locale/bo/LC_MESSAGES/fdroidserver.po | 182 ++++-- locale/cs/LC_MESSAGES/fdroidserver.po | 183 ++++-- locale/cy/LC_MESSAGES/fdroidserver.po | 181 ++++-- locale/de/LC_MESSAGES/fdroidserver.po | 692 ++++++++------------- locale/es/LC_MESSAGES/fdroidserver.po | 183 ++++-- locale/fdroidserver.pot | 183 ++++-- locale/fi/LC_MESSAGES/fdroidserver.po | 181 ++++-- locale/fr/LC_MESSAGES/fdroidserver.po | 183 ++++-- locale/fy/LC_MESSAGES/fdroidserver.po | 181 ++++-- locale/hi/LC_MESSAGES/fdroidserver.po | 181 ++++-- locale/hu/LC_MESSAGES/fdroidserver.po | 183 ++++-- locale/it/LC_MESSAGES/fdroidserver.po | 183 ++++-- locale/ja/LC_MESSAGES/fdroidserver.po | 181 ++++-- locale/kab/LC_MESSAGES/fdroidserver.po | 181 ++++-- locale/ko/LC_MESSAGES/fdroidserver.po | 182 ++++-- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 183 ++++-- locale/nl/LC_MESSAGES/fdroidserver.po | 181 ++++-- locale/pl/LC_MESSAGES/fdroidserver.po | 183 ++++-- locale/pt/LC_MESSAGES/fdroidserver.po | 183 ++++-- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 183 ++++-- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 183 ++++-- locale/ro/LC_MESSAGES/fdroidserver.po | 183 ++++-- locale/ru/LC_MESSAGES/fdroidserver.po | 183 ++++-- locale/sk/LC_MESSAGES/fdroidserver.po | 181 ++++-- locale/sq/LC_MESSAGES/fdroidserver.po | 673 +++++++------------- locale/tr/LC_MESSAGES/fdroidserver.po | 183 ++++-- locale/tzm/LC_MESSAGES/fdroidserver.po | 181 ++++-- locale/ug/LC_MESSAGES/fdroidserver.po | 181 ++++-- locale/uk/LC_MESSAGES/fdroidserver.po | 183 ++++-- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 182 ++++-- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 183 ++++-- 32 files changed, 4039 insertions(+), 2791 deletions(-) diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index 7e1c376f..befcfae6 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2021-02-12 09:48+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali \n" @@ -94,13 +94,13 @@ msgstr "" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -113,7 +113,7 @@ msgid "%(prog)s [options] url" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: ত্রুটি: %(message)s\n" @@ -124,12 +124,12 @@ msgid "%d problems found" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [অপশন]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "" @@ -140,7 +140,7 @@ msgid "%s is not an accepted build field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "" @@ -166,7 +166,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -222,7 +222,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr "" @@ -263,7 +263,7 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -459,7 +459,7 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -486,11 +486,11 @@ msgstr "" msgid "Could not find '{command}' on your system" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -510,7 +510,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -627,7 +627,7 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -715,6 +715,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" +#: ../fdroidserver/nightly.py +#, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -744,9 +749,14 @@ msgid "Error while attempting to publish log: %s" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "" @@ -1230,6 +1240,11 @@ msgstr "" msgid "Malformed serverwebroot line:" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" @@ -1243,6 +1258,10 @@ msgstr "" msgid "Name '%s' is just the auto name - remove it" msgstr "" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "" @@ -1281,11 +1300,12 @@ msgstr "" msgid "No git submodules available" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "" @@ -1409,7 +1429,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "বিকল্পসমূহ" @@ -1427,7 +1447,7 @@ msgstr "" msgid "Outputting JSON" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "" @@ -1436,7 +1456,7 @@ msgstr "" msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "" @@ -1450,7 +1470,7 @@ msgstr "" msgid "Password required with username" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "" @@ -1473,6 +1493,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1505,7 +1530,7 @@ msgstr "" msgid "Produce human-readable index.xml" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "" @@ -1642,6 +1667,11 @@ msgstr "" msgid "Scan the source code of a package" msgstr "" +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1662,6 +1692,10 @@ msgstr[1] "" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1839,7 +1873,7 @@ msgstr "" msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "" @@ -2073,12 +2107,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "ব্যবহার" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "ব্যবহার: %s\n" @@ -2190,13 +2224,13 @@ msgid "adding to {name}: {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "" @@ -2235,8 +2269,12 @@ msgstr "" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "" @@ -2253,6 +2291,11 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" +#: /usr/lib/python3.9/argparse.py +#, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2265,12 +2308,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "" @@ -2293,12 +2336,12 @@ msgid "commands from plugin modules:" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "জটিল" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2349,7 +2392,7 @@ msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "" @@ -2359,7 +2402,7 @@ msgid "executable binary, possibly code" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2367,17 +2410,17 @@ msgstr[0] "" msgstr[1] "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "" @@ -2395,7 +2438,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "ফ্লোটিং-পয়েন্ট" @@ -2416,7 +2459,7 @@ msgid "gzip file archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "" @@ -2425,31 +2468,35 @@ msgstr "" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "" +#: ../fdroidserver/index.py +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "ইন্টিজার" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" @@ -2478,7 +2525,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2492,7 +2539,7 @@ msgid "no APK supplied" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "" @@ -2506,13 +2553,13 @@ msgid "no version information found" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "" @@ -2527,55 +2574,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "" @@ -2585,7 +2632,7 @@ msgid "overwriting existing {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "" @@ -2614,6 +2661,10 @@ msgstr "" msgid "repo_icon %s does not exist, generating placeholder." msgstr "" +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2633,13 +2684,14 @@ msgid "shared library" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "" @@ -2674,25 +2726,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "" @@ -2704,6 +2756,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "ব্যবহার: " @@ -2832,7 +2885,7 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "" @@ -2867,7 +2920,7 @@ msgstr "" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "" diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index 0f730959..004ff6a2 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tibetan \n" @@ -101,13 +101,13 @@ msgstr "\"{path}སྒྲིག་བཀོད་འདི་ངོས་ལེ msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -119,7 +119,7 @@ msgid "%(prog)s [options] url" msgstr "%(prog)s [གདམ་ཀ།] url" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: ནོར་སྐྱོན: %(message)s\n" @@ -130,12 +130,12 @@ msgid "%d problems found" msgstr "%d དཀའ་རྙོག་ཐོན་སོང་།" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [གདམ་ཀ།]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "%r 1 བྱེད་ལས་མིན་འདུག" @@ -146,7 +146,7 @@ msgid "%s is not an accepted build field" msgstr "%s 1འདི་ཁས་ལེན་ཐུབ་པའི་བཟོ་སྐྲུན་རྭ་བ་མ་རེད།" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "%sགདམ་ཀ་ནུས་མེད་རེད་འདུག" @@ -172,7 +172,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' འདི་ config.yml ནང་རྙེད་མ་སོང་།!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'དགསོ་མཁོ།' ནི་གནས་སྟངས་འདི་ལ་ཁུངས་ལྡན་གྱི་རྩོད་པ་རེད་མིན་འདུག" @@ -229,7 +229,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "...{appid} གྱི་ཆེད་དུ་གསར་བསྒྱུར་འཚོལ་མི་ཐུབ།་: {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() ངོས་འཛིན་ཐུབ་མེད།" @@ -270,7 +270,7 @@ msgstr "{name}ཁོ་ནའི་ཆེད་དུ་རེ་པོ་གས msgid "Alias of the repo signing key in the keystore" msgstr "ལྡེ་མིག་གསོག་ཉར་ཁང་ནང་རེ་པོ་མིང་རྟགས་ལྡེ་མིག་བཀོད་པའི་གསང་མིང་།" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "ཐོག་མའི་ནང་འདྲེན་བྱེད་པའི་སྐབས་གསལ་པོའི་ཐོག་ནས་སྐྱར་སྦྱོང་(ཡང་ན་གིཊ་ཡན་ལག་)མི་འདྲ་བ་རྣམས་ལ་ཆོག་མཆན་སྤྲོད།" @@ -465,7 +465,7 @@ msgstr "མཛོད་ཁང་ཚོད་ལྟའི་ཆེད་དུ། msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "གསར་བསྒྱུར་གཙང་བཟོ།-ཡིག་ཆ་གསོག་ཉར་བེད་སྤྱོ་མ་བྱེད། APKs ཚང་མ་སྐྱར་སྤྱོད་བྱེད།" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "སྡེ་ཚན་སོ་སོའི་ཐོ་གཞུང་ལ་བར་མཚམས་རེ་འཇོག།." @@ -492,12 +492,12 @@ msgstr "" msgid "Could not find '{command}' on your system" msgstr "ཁྱེད་རང་གི་མ་ལག་སྒང་ལ་'{command}1' རྙེད་མ་སོང་།" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, fuzzy msgid "Could not find latest version code" msgstr "ཐོན་རིམ་གསར་གསར་ཤོས་ཀྱི་ཨང་རྟགས་འདི་འདི་རྙེད་མ་སོང་།" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, fuzzy msgid "Could not find latest version name" msgstr "ཐོན་རིམ་གསར་ཤོས་འདིའི་མིང་རྙེད་མ་སོང་།" @@ -518,7 +518,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, fuzzy msgid "Couldn't find Application ID" msgstr "ཐུམ་སྒྲིལ་ངོས་འཛིན་རྙེད་སོན་བྱུང་མ་སོང་།" @@ -637,7 +637,7 @@ msgstr "འགྲེལ་བཤད་འདི་ལ་ཐོ་གཞུང་ msgid "Description of length {length} is over the {limit} char limit" msgstr "རིང་ཐུང་གི་འགྲེལ་བཤད་ {length} {limit} ལས་བརྒལ་འདུག char limit" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -725,6 +725,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ནོར་འཁྲུལ།: རྒྱབ་སྐྱོར་མེད་པའི་CI རྣམ་གྲངས་དང་ལྷན་པ་རྒྱབ་ནའང་འགྲིག་གི་ཡོད།!" +#: ../fdroidserver/nightly.py +#, fuzzy, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "ནོར་འཁྲུལ།: རྒྱབ་སྐྱོར་མེད་པའི་CI རྣམ་གྲངས་དང་ལྷན་པ་རྒྱབ་ནའང་འགྲིག་གི་ཡོད།!" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -756,9 +761,14 @@ msgid "Error while attempting to publish log: %s" msgstr "རེ་པོ་ཁ་བྱང་ལེན་སྐབས་ནོར་སྐྱོན།: %s" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "རེ་པོ་ཁ་བྱང་ལེན་སྐབས་ནོར་སྐྱོན།" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "APKs ནས་མིང་རྟགས་ཕྱིར་སྟོན་བྱེད།" @@ -1249,6 +1259,11 @@ msgstr "བཟོ་ལྟ་མེད་པའི་མཛོད་ཁང་ཤ msgid "Malformed serverwebroot line:" msgstr "བཟོ་ལྟ་ཤོར་བའི་ serverwebroot line:" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" @@ -1262,6 +1277,10 @@ msgstr "ཕྱོགས་དེབ་ཐོན་སྐྱེད་བོར་ msgid "Name '%s' is just the auto name - remove it" msgstr "མིང་། '%s 1' ནི་རང་མིང་ཁོ་ན་རེད་། - མེད་པ་བཟོས།" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "'config.yml' རྙེད་མ་སོང་།, སོར་བཞག་བེད་སྤྱོད་བྱེད་བཞིན་པ།." @@ -1301,12 +1320,13 @@ msgstr "URL ནང་ལག་མཐིལ་པར་ཤུས་རྙེད msgid "No git submodules available" msgstr "གིཊ་ཡན་ལག་རྒྱ་ཁྱོན་མིན་འདུག" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, fuzzy msgid "No gradle project could be found. Specify --subdir?" msgstr "ཨེན་ཀྲོཌ་དང་ཡང་ན་ཀི་བི་ལས་འཆར་གང་ཡང་རྙེད་ས་མ་རེད། དམིགས་སྟོན་བྱེད་--subdir?" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "གནས་ཚུལ་རྙེད་མ་སོང་།." @@ -1433,7 +1453,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Flattr ཞལ་འདེབས་ཐབས་ལམ་འདི་བཞིན་FlattrID flag ལ་ཐོབ་ཀྱི་ཡོད་།" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "གདམ་ཀ།" @@ -1451,7 +1471,7 @@ msgstr "" msgid "Outputting JSON" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "ལས་འཆར་འདིའི་ཁྱོན་ཡོངས་ཀྱི་ཆོག་མཆན་ལག་ཁྱེར།." @@ -1460,7 +1480,7 @@ msgstr "ལས་འཆར་འདིའི་ཁྱོན་ཡོངས་ཀ msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "" @@ -1474,7 +1494,7 @@ msgstr "'{path}'འདིའི་ནང་དབྱེ་མཚམས་མང msgid "Password required with username" msgstr "སྤྱོད་མིང་དང་མཉམ་དུ་གསང་ཨང་དགོས།" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "གལ་སྲིད་ཆོག་མཆན་ཨ་མའི་ནང་ལ་མེད་ན། ལམ་གྱི་གཙོ་བོ་འདི་ཨེན་ཀྲོཌ་ལས་འཆར་གྱི་ཕྱོགས་དེབ་ཡན་ལག་སྟོན་ཡོད།." @@ -1497,6 +1517,11 @@ msgstr "རེ་པོ་མིང་རྟགས་བཀོད་པའི་ msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "ས་ཚིགས་ཀྱི་གསང་ཁྱབ་ངོ་བཤུས་དང་/སྦྱར་བ་སྟབས་བདེ་ཡོང་བའི་ཆེད་དུ་འདྲ་བཤུས་" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1529,7 +1554,7 @@ msgstr "མིས་ཀློག་ཐུབ་པའི་XML/JSON ཕྱོག msgid "Produce human-readable index.xml" msgstr "མིས་ཀློག་ཐུབ་པའི་index.xml བཟོས།" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "URL ལས་འཆར་ནང་འདྲེན།." @@ -1666,6 +1691,11 @@ msgstr "" msgid "Scan the source code of a package" msgstr "ཐུམ་སྒྲིལ་བྱས་པའི་འབྱུང་ཁུངས་ཨང་རྟགས་འཚག་རྒྱབ" +#: ../fdroidserver/scanner.py +#, fuzzy, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "འཚག་རྒྱབ་ལ་སྐྱོན་རྙེད་པ།" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1685,6 +1715,10 @@ msgstr[0] "འཚག་རྒྱབ་ལ་སྐྱོན་རྙེད་པ msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1862,7 +1896,7 @@ msgstr "" msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "རེ་པོ་འདི་ལ་སྔོན་ཚོད་ནས་ས་གནས་ཀྱི་རྒྱབ་ལྗོངས་ཡིག་ཆ་འདུག: %s 1" @@ -2099,12 +2133,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "སྦས་ཁུང་ནས་ {apkfilename}ཀློག་བཞིན་པ།" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "བེད་སྤྱོད།" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "བེད་སྤྱོད།:%s 1\n" @@ -2216,13 +2250,13 @@ msgid "adding to {name}: {path}" msgstr "{name}ལ་ཁ་སྣོན་བྱེད།: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "གསལ་ཁ་མེད་པའི་གདམ་ཀ: %(option)s མཐུན་མི་སོང་།%(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "གསལ་ཁ་མེད་པའི་གདམ་ཀ:%s 1 (%s 2?)" @@ -2263,8 +2297,12 @@ msgstr "མཉེས་ཆས་ཁ་བྱང་རྒྱུད་གསར་ msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "མཉེན་ཆས་ཀྱི་ངོ་བོ་དང་མཉམ་དུ་གདམ་ཀ་ཅན་གྱི་ཐོན་རིམ་ཨང་རྟགས་APPID[:VERCODE]" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "རྩོད་པ།\"-\" འགྲོ་ལུགས་འདི་དང་མཉམ་དུ། %r 1" @@ -2282,6 +2320,11 @@ msgstr "ཕྱོགས་སྐྱོད་ལྡེ་མིག་ཚོད་ msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" +#: /usr/lib/python3.9/argparse.py +#, fuzzy, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "ཁ་ཕྱེས་ཐུབ་མ་སོང་།'%s 1': %s 2" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2294,12 +2337,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "{path}!གྱི་ཆེད་དུ་ཐུམ་སྒྲིལ་གྱི་མིང་རྙེད་མ་སོང་།" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "subparser རྩོད་པ་དུ་མ་ཡོད་ཐབས་མེད།" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "བྱ་བ་ཟླ་སྒྲིལ་བཏང་ཐུབ་མ་སོང་། - སྡེ་ཚན་གཉིས་ཀྱི་མིང་ལ་%r 1" @@ -2322,12 +2365,12 @@ msgid "commands from plugin modules:" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "མགོ་རྙོག" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2377,7 +2420,7 @@ msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= ནི་གདམ་ཀ་འདི་འདྲ་ལ་%r 1དགོས་པ་ཡོད།" @@ -2387,24 +2430,24 @@ msgid "executable binary, possibly code" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "ཚོད་དཔག་བྱེད་པའི་%s 1 རྩོད་པ་" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "མ་མཐའ་ཡིན་ནའང་རེ་བ་བྱེད་པའི་རྩོད་པ།" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "རེ་བ་བྱས་པའི་རྩོད་པ་ཆེ་ཤེོས་གཅིག" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "རེ་བ་བྱས་པའི་རྩོད་པ་གཅིག" @@ -2423,7 +2466,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "བེད་སྤྱོད་: ཨེཕ་རོཌ་ [-h|-རོགས་པ་|--ཐོན་རིམ་] []" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "གཡེང་ཚེག" @@ -2446,7 +2489,7 @@ msgid "gzip file archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "དངོས་སུ་རྩོད་པ་པ་ལ་ཡ་ལན་མེད། %r 1" @@ -2455,31 +2498,36 @@ msgstr "དངོས་སུ་རྩོད་པ་པ་ལ་ཡ་ལན་ msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 ངེས་པར་དུ་མིང་རྟགས་དགོས། བེད་སྤྱོད་`fdroid signindex`འདི་བཟོས་པ་རེད།!" +#: ../fdroidserver/index.py +#, fuzzy +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "index-v1 ངེས་པར་དུ་མིང་རྟགས་དགོས། བེད་སྤྱོད་`fdroid signindex`འདི་བཟོས་པ་རེད།!" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "གོང་བུ།" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "ཁུངས་ལྡན་མིན་པ་ %(type)s value: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "ཁུངས་ལྡན་མིན་པའི་གདམ་ཀ: %(value)r (དེ་ནས་གདམ་ཀ་%(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "ཁུངས་ལྡན་མིན་པའི་རྙོག་ཕྲ།_resolution value: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "ཁུངས་ལྡན་མིན་པའི་ཚིག་སྒྲུབ་གདམ་ཀ། %(option)r: ཁྱད་ཆོས་དང་མཉམ་དུ་འགོ་བཙུགས། %(prefix_chars)r" @@ -2508,7 +2556,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "མེ་ལོང་། '%s 1' 'fdroid'དང་མཉམ་དུ་མཇུག་སྐྱོང་མི་ཐུབ།!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "ནང་ཕན་ཚུན་རྩོད་པ་དེ་གདམ་ཀ་ཅན་ངེས་པར་དུ་བཞག་དགོས་།" @@ -2522,7 +2570,7 @@ msgid "no APK supplied" msgstr "APK མཁོ་སྤྲོད་མིན་འདུག" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "གདམ་ཀ་དེ་འདྲ་མིན་འདུག: %s" @@ -2537,13 +2585,13 @@ msgid "no version information found" msgstr "ཆ་རྒྱུས་མེད་པའི་དམིགས་བསལ་ཞིག་རྙེད་སོང་།!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "རྩོད་པ་དང་མཉམ་དུ་ཆོག་མཆན་མེད། %s 1" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "རྩོད་པ་གཅིག་དགོས་ཀྱི་ཡོད། %s 1" @@ -2558,55 +2606,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "གདམ་ཀ %s 1: གལ་ཏེ་ཁྱེད་ཀྱིས་མིང་རྟགས་བཀོད་པའི་མཉེན་ཆས་རིགས་ཚང་མ་ངེས་པར་དུ་སྒྲིག་བཅུག་བྱེད་འདོད་ཡོད་། བེད་སྤྱོད་ --ཚང་མ།" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "གདམ་ཀ %s 1: ཁུངས་ལྡན་མིན་པ་ %s 2 རིན་ཐང་།: %r 3" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "གདམ་ཀ %s 1: ཁུངས་ལྡན་མིན་པའི་གདམ་ཀ: %r 2 (choose from %s 3)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "གདམ་ཀ། '%s 1'ངོས་འཛིན་ཐུབ་མ་སོང་།" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "གདམ་ཀ། -%s 1 རྩོད་དགོས།" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "གདམ་ཀ། --%s 1གང་བྱས་ཀྱང་རྩོད་པ་མེད།" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "གདམ་ཀ་--%s ཐུན་མོང་མ་ཡིན་པའི་སྔོན་འཇུག་མ་རེད།" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "གདམ་ཀ།--%s 1 ངོས་འཛིན་ཐུབ་མ་སོང་།" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "གདམ་ཀ། --%s རྩོད་དགོས།" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "གདམ་ཀ་ཅན་གྱི་རྩོད་པ།" @@ -2616,7 +2664,7 @@ msgid "overwriting existing {path}" msgstr "སྐྱར་བྲིས་ཡོད་།{path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "གནས་སྟངས་ལ་གཞིགས་པའི་རྩོད་པ།" @@ -2645,6 +2693,10 @@ msgstr "" msgid "repo_icon %s does not exist, generating placeholder." msgstr "" +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2664,13 +2716,14 @@ msgid "shared library" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "ལས་རིམ་རྣམ་གཞག་གི་ཐོན་རིམ་ཨང་གྲངས་སྟོན་ནས་ཕྱིར་ཐོན་བྱེད།" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "རོགས་པ་བྱེད་པའི་འཕྲིན་ཐུང་སྟོན་ནས་ཕྱིར་ཐོན།" @@ -2705,25 +2758,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "གཤམ་གྱི་རྩོད་པ་དེ་དག་དགོས།:%s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "རེ་བ་མེད་པའི་གདམ་ཀ་ཅན་གྱི་ཚིག་སྒྲུབ།:%s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "ངོས་འཛིན་མི་ཐུབ་པའི་ parser %(parser_name)r (གདམ་ཀ།: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "ངོས་འཛིན་མི་ཐུབ་པའི་རྩོད་པ།: %s" @@ -2735,6 +2788,7 @@ msgstr "'{config_file}' སྒང་གི་བདེ་ཆགས་མེད #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "བེད་སྤྱོད།: " @@ -2862,7 +2916,7 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "" @@ -2897,7 +2951,7 @@ msgstr "ཀློག་མི་ཐུབ།{path}: {error}" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "" diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 2ad9fc53..4e41c873 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2022-08-27 18:18+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" @@ -109,13 +109,13 @@ msgstr "\"{path}\" není přijatelný formát, převeďte na: {formats}" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\" je podepsáno klíčem, který není povolen:" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" není platná adresa URL!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -129,7 +129,7 @@ msgid "%(prog)s [options] url" msgstr "%(prog)s [možnosti] url" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: chyba: %(message)s\n" @@ -140,12 +140,12 @@ msgid "%d problems found" msgstr "nalezeno %d problémů" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [možnosti]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "%r není možné volat" @@ -156,7 +156,7 @@ msgid "%s is not an accepted build field" msgstr "%s není akceptované pole sestavení" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "možnost %s nepřebírá hodnotu" @@ -182,7 +182,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' nebyl nalezen v config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'povinné' je Neplatný argument pro pozicials" @@ -238,7 +238,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "...kontrola selhala pro {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() není definováno" @@ -279,7 +279,7 @@ msgstr "Přidání nového repozitáře pouze pro {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias podepisovacího klíče repozitáře v keystore" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Umožňuje zadat jinou revizi (nebo větev gitu) pro počáteční import" @@ -476,7 +476,7 @@ msgstr "Kontrola archivace u {appid} - apks:{integer}, keepversions:{keep}, arch msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Čistá aktualizace - nepoužívat mezipaměti, znovu zpracovat všechny soubory APK" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Seznam kategorií oddělený čárkami." @@ -503,11 +503,11 @@ msgstr "Konfliktní konfigurační soubory! Používám {newfile}, ignoruji {old msgid "Could not find '{command}' on your system" msgstr "Ve vašem systému se nepodařilo najít příkaz '{command}'" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Nepodařilo se najít kód poslední verze" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Nepodařilo se najít název poslední verze" @@ -527,7 +527,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Nepodařilo se zpracovat velikost „{size}“, nesprávný typ „{type}“" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Nedaří se nalézt ID aplikace" @@ -644,7 +644,7 @@ msgstr "Popis má seznam (%s) ale není opatřen odrážkami (*) ani očíslová msgid "Description of length {length} is over the {limit} char limit" msgstr "Popis délky {length} přesahuje limit {limit} znaků" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Nepřidávat ‚disable:‘ k vygenerovaným položkám sestavení" @@ -734,6 +734,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "CHYBA: nepodporovaný typ CI, opravy vítány!" +#: ../fdroidserver/nightly.py +#, fuzzy, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "CHYBA: nepodporovaný typ CI, opravy vítány!" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -765,9 +770,14 @@ msgid "Error while attempting to publish log: %s" msgstr "Chyba při pokusu o zveřejnění protokolu: %s" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Chyba při získávání adresy repozitáře" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Extrahovat podpisy ze souborů APK" @@ -1251,6 +1261,11 @@ msgstr "Poškozené mirrory repozitáře." msgid "Malformed serverwebroot line:" msgstr "Poškozený řádek serverwebroot:" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Zrcadlení celého repozitáře a archivu, všechny typy souborů." @@ -1264,6 +1279,10 @@ msgstr "Chybějící výstupní adresář" msgid "Name '%s' is just the auto name - remove it" msgstr "Název ‚%s‘ je pouze automatický název - odstraňte jej" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "Nenalezen soubor 'config.yml', použito výchozí nastavení." @@ -1302,11 +1321,12 @@ msgstr "V adrese URL není otisk prstu." msgid "No git submodules available" msgstr "Nejsou k dispozici žádné submoduly git" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Nebyl nalezen žádný projekt gradle. Specifikujte --subdir?" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Nebyly nalezeny žádné informace." @@ -1430,7 +1450,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Darovací metody OpenCollective patří do pole OpenCollective:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "Možnosti" @@ -1448,7 +1468,7 @@ msgstr "Uložit JSON do stdout." msgid "Outputting JSON" msgstr "Ukládání výstupu JSON" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Celková licence projektu." @@ -1457,7 +1477,7 @@ msgstr "Celková licence projektu." msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Přepisování prázdného versionName v {apkfilename} z metadat: {version}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "Balíček „{appid}“ již existuje" @@ -1471,7 +1491,7 @@ msgstr "Parsování manifestu v ‚{path}‘" msgid "Password required with username" msgstr "Vyžadováno heslo s uživatelským jménem" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Cesta k hlavnímu podadresáři projektu Android, pokud není v kořenovém adresáři." @@ -1494,6 +1514,11 @@ msgstr "Cesta k úložišti klíčů pro podpisový klíč repozitáře" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Zobrazit tajnou proměnnou v terminálu pro jednoduché kopírování/vložení" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1526,7 +1551,7 @@ msgstr "Vytváření lidsky čitelných souborů XML/JSON pro indexové soubory" msgid "Produce human-readable index.xml" msgstr "Vytvořit člověku čitelný index.xml" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "Adresa URL projektu, ze které se má importovat." @@ -1663,6 +1688,11 @@ msgstr "Oskenovat výsledná APK, zda neobsahují známé nesvobodné třídy." msgid "Scan the source code of a package" msgstr "Naskenujte zdrojový kód balíčku" +#: ../fdroidserver/scanner.py +#, fuzzy, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "Skener našel {count} problémů v {appid}:" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1684,6 +1714,11 @@ msgstr[2] "Skener našel {} problémů" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Skenování APK pomocí apkanalyzer pro známé nesvobodné třídy." +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "Skenování APK pomocí apkanalyzer pro známé nesvobodné třídy." + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1861,7 +1896,7 @@ msgstr "Aplikace, které byly archivovány z hlavního repozitáře." msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Toto je repozitář aplikací, který lze používat s aplikací F-Droid. Aplikace v tomto repozitáři jsou buď oficiální binární soubory sestavené původními vývojáři aplikací, nebo binární soubory sestavené ze zdrojových kódů správcem f-droid.org pomocí nástrojů na adrese https://gitlab.com/fdroid." -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Tento repozitář již má místní metadata: %s" @@ -2102,12 +2137,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "Nahrávání {apkfilename} na virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "Použití" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Použití: %s\n" @@ -2219,13 +2254,13 @@ msgid "adding to {name}: {path}" msgstr "přidávání do {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "nejednoznačná možnost: %(option)s by mohlo odpovídat %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "nejednoznačná možnost: %s (%s?)" @@ -2264,8 +2299,12 @@ msgstr "applicationId pro kontrolu aktualizací" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId s nepovinným versionCode ve tvaru APPID[:VERCODE]" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argument \"-\" s režimem %r" @@ -2282,6 +2321,11 @@ msgstr "pokus o holé ssh připojení k testování klíče pro nasazení:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "nelze parsovat specifikaci scrlib (není to řetězec): ‚{}‘" +#: /usr/lib/python3.9/argparse.py +#, fuzzy, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "nelze otevřít '%s': %s" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2294,12 +2338,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "nelze najít požadované srclibs: „{path}“" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "nelze mít více argumentů subparseru" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "nelze sloučit akce - dvě skupiny jsou pojmenovány %r" @@ -2322,12 +2366,12 @@ msgid "commands from plugin modules:" msgstr "příkazy z modulů pluginů:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "komplexní" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2379,7 +2423,7 @@ msgid "deployed process log {path} to {dest}" msgstr "protokol procesu {path} nasazen do {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= je vyžadován pro možnosti jako %r" @@ -2389,7 +2433,7 @@ msgid "executable binary, possibly code" msgstr "spustitelná binárka, případně kód" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2398,17 +2442,17 @@ msgstr[1] "očekávány %s argumenty" msgstr[2] "očekáváno %s argumentů" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "očekáván alespoň jeden argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "očekáván maximálně jeden argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "očekáván jeden argument" @@ -2426,7 +2470,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "floating-point" @@ -2447,7 +2491,7 @@ msgid "gzip file archive" msgstr "archiv souborů gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "ignorován explicitní argument %r" @@ -2456,31 +2500,36 @@ msgstr "ignorován explicitní argument %r" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 musí mít podpis, použijte `fdroid signindex` pro jeho vytvoření!" +#: ../fdroidserver/index.py +#, fuzzy +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "index-v1 musí mít podpis, použijte `fdroid signindex` pro jeho vytvoření!" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "celé číslo" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "neplatná hodnota %(type)s: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "neplatná volba: %(value)r (vyberte si z %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "neplatná hodnota conflict_resolution: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "neplatný řetězec možnosti %(option)r: musí začínat znakem %(prefix_chars)r" @@ -2509,7 +2558,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "mirror '%s' nekončí s 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "společně exkluzivní argumenty musí být volitelné" @@ -2523,7 +2572,7 @@ msgid "no APK supplied" msgstr "neposkytnuto APK" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "žádná taková volba: %s" @@ -2537,13 +2586,13 @@ msgid "no version information found" msgstr "nenalezeny informace o verzi" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "není povoleno s argumentem %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "jeden z argumentů %s je vyžadován" @@ -2558,55 +2607,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "možnost %s: pokud opravdu chcete nainstalovat všechny podepsané aplikace, použijte --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "možnost %s: neplatná hodnota %s: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "možnost %s: neplatná volba: %r (vyberte si z %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "možnost - %s není rozpoznána" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "možnost - %s vyžaduje argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "možnost --%s nesmí mít argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "možnost --%s není jedinečná předpona" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "možnost -%s není rozpoznána" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "možnost --%s vyžaduje argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "volitelné argumenty" @@ -2616,7 +2665,7 @@ msgid "overwriting existing {path}" msgstr "přepisování existující {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "poziční argumenty" @@ -2645,6 +2694,10 @@ msgstr "repo_icon \"repo/icons/%s\" neexistuje, generování placeholderu." msgid "repo_icon %s does not exist, generating placeholder." msgstr "repo_icon %s neexistuje, generování placeholderu." +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml není nainstalován, nelze zapisovat metadata." @@ -2664,13 +2717,14 @@ msgid "shared library" msgstr "sdílená knihovna" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "zobrazit číslo verze programu a ukončit" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "zobrazí tuto nápovědu a skončí" @@ -2705,25 +2759,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "poskytnutá hodnota timestamp '{timestamp}' není unixová timestamp" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "jsou vyžadovány následující argumenty: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "neočekávaný řetězec možností: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "neznámý parser %(parser_name)r (volby: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "nerozpoznané argumenty: %s" @@ -2735,6 +2789,7 @@ msgstr "nebezpečné oprávnění na '{config_file}' (má být 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "použití: " @@ -2864,7 +2919,7 @@ msgstr "{name} \"{section}/icons/{path}\" neexistuje! Zkontrolujte \"config.yml\ msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} je zastaralý, použijte {newfile}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} již existuje, ignorování importování výsledků!" @@ -2899,7 +2954,7 @@ msgstr "{path}: {error}" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} nekončí s \"fdroid\", zkontrolujte cestu URL!" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} nezačíná s \"http\"!" diff --git a/locale/cy/LC_MESSAGES/fdroidserver.po b/locale/cy/LC_MESSAGES/fdroidserver.po index f688e2e4..cdfdf04e 100644 --- a/locale/cy/LC_MESSAGES/fdroidserver.po +++ b/locale/cy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2021-01-16 21:23+0000\n" "Last-Translator: Aled Powell \n" "Language-Team: Welsh \n" @@ -100,13 +100,13 @@ msgstr "" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -123,7 +123,7 @@ msgid "%(prog)s [options] url" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "" @@ -134,12 +134,12 @@ msgid "%d problems found" msgstr "canfuwyd %d problem" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "" @@ -150,7 +150,7 @@ msgid "%s is not an accepted build field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "" @@ -176,7 +176,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -232,7 +232,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr "" @@ -273,7 +273,7 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -473,7 +473,7 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -500,11 +500,11 @@ msgstr "" msgid "Could not find '{command}' on your system" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -524,7 +524,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -641,7 +641,7 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -729,6 +729,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" +#: ../fdroidserver/nightly.py +#, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -758,9 +763,14 @@ msgid "Error while attempting to publish log: %s" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "" @@ -1244,6 +1254,11 @@ msgstr "" msgid "Malformed serverwebroot line:" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" @@ -1257,6 +1272,10 @@ msgstr "" msgid "Name '%s' is just the auto name - remove it" msgstr "" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "" @@ -1295,11 +1314,12 @@ msgstr "" msgid "No git submodules available" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "" @@ -1423,7 +1443,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "Dewisiadau" @@ -1441,7 +1461,7 @@ msgstr "" msgid "Outputting JSON" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "" @@ -1450,7 +1470,7 @@ msgstr "" msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "" @@ -1464,7 +1484,7 @@ msgstr "" msgid "Password required with username" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "" @@ -1487,6 +1507,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1519,7 +1544,7 @@ msgstr "" msgid "Produce human-readable index.xml" msgstr "Creu index.html darllenadwy i bobl" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "" @@ -1656,6 +1681,11 @@ msgstr "" msgid "Scan the source code of a package" msgstr "Sganio cod ffynhonnell pecyn" +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1680,6 +1710,10 @@ msgstr[5] "" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1864,7 +1898,7 @@ msgstr "" " wrth ddefnyddio'r offer ar https://gitlab.com/F-Droid.\n" " " -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "" @@ -2098,12 +2132,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Defndd: %s\n" @@ -2215,13 +2249,13 @@ msgid "adding to {name}: {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "dewis amwys: gall %(option)s gydweddu â %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "dewis amwys: %s (%s?)" @@ -2260,8 +2294,12 @@ msgstr "" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "" @@ -2278,6 +2316,11 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" +#: /usr/lib/python3.9/argparse.py +#, fuzzy, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "methu agor '%s': %s" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2290,12 +2333,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "" @@ -2318,12 +2361,12 @@ msgid "commands from plugin modules:" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2378,7 +2421,7 @@ msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "" @@ -2388,7 +2431,7 @@ msgid "executable binary, possibly code" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2400,17 +2443,17 @@ msgstr[4] "" msgstr[5] "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "" @@ -2428,7 +2471,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "" @@ -2449,7 +2492,7 @@ msgid "gzip file archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "" @@ -2458,31 +2501,35 @@ msgstr "" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "" +#: ../fdroidserver/index.py +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" @@ -2511,7 +2558,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2525,7 +2572,7 @@ msgid "no APK supplied" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "dim dewis o'r fath: %s" @@ -2539,13 +2586,13 @@ msgid "no version information found" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "" @@ -2560,55 +2607,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "dewis -%s heb ei adnabod" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "dewis -%s angen ymresymiad" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "dewis --%s heb ei adnabod" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "ymresymiadau dewisol" @@ -2618,7 +2665,7 @@ msgid "overwriting existing {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "" @@ -2647,6 +2694,10 @@ msgstr "" msgid "repo_icon %s does not exist, generating placeholder." msgstr "" +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2666,13 +2717,14 @@ msgid "shared library" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "dangos rhif fersiwn y rhaglen a gadael" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "dangos y neges cymorth hon a gadael" @@ -2707,25 +2759,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "" @@ -2737,6 +2789,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "defnydd: " @@ -2869,7 +2922,7 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "" @@ -2904,7 +2957,7 @@ msgstr "" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "" diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 8e1325e3..026b7f01 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -23,7 +23,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2022-03-01 21:48+0000\n" "Last-Translator: nautilusx \n" "Language-Team: German \n" @@ -37,12 +37,9 @@ msgstr "" #: ../fdroidserver/common.py msgid "" "\n" -" This is a repository of apps to be used with FDroid. Applications in " -"this\n" -" repository are either official binaries built by the original " -"application\n" -" developers, or are binaries built from source by f-droid.org using " -"the\n" +" This is a repository of apps to be used with FDroid. Applications in this\n" +" repository are either official binaries built by the original application\n" +" developers, or are binaries built from source by f-droid.org using the\n" " tools on https://gitlab.com/fdroid.\n" " " msgstr "" @@ -60,8 +57,7 @@ msgid "" "SSH Public Key to be used as Deploy Key:" msgstr "" "\n" -"Öffentlicher SSH-Schlüssel, der als Bereitstellungsschlüssel verwendet " -"werden soll:" +"Öffentlicher SSH-Schlüssel, der als Bereitstellungsschlüssel verwendet werden soll:" #: ../fdroidserver/nightly.py msgid "" @@ -69,8 +65,7 @@ msgid "" "SSH public key to be used as deploy key:" msgstr "" "\n" -"Öffentlicher SSH-Schlüssel, der als Bereitstellungsschlüssel verwendet " -"werden soll:" +"Öffentlicher SSH-Schlüssel, der als Bereitstellungsschlüssel verwendet werden soll:" #: ../fdroidserver/nightly.py #, python-brace-format @@ -93,9 +88,7 @@ msgstr "\"local_copy_dir\" {path}\" existiert nicht!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" -"\"repo_pubkey\" muss in config.yml vorhanden sein, wenn --nosign verwendet " -"wird!" +msgstr "\"repo_pubkey\" muss in config.yml vorhanden sein, wenn --nosign verwendet wird!" #: ../fdroidserver/install.py #, python-brace-format @@ -120,9 +113,7 @@ msgstr "\"{path}” vorhanden, aber S3cmd ist nicht installiert!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "" -"\"{path}\" ist ein nicht unterstütztes Dateiformat (Verwendung: metadata/*." -"yml)" +msgstr "\"{path}\" ist ein nicht unterstütztes Dateiformat (Verwendung: metadata/*.yml)" #: ../fdroidserver/metadata.py #, python-brace-format @@ -134,13 +125,13 @@ msgstr "\"{path}\" ist kein akzeptiertes Format, umwandeln in: {formats}" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}” ist mit einem nicht zulässigen Schlüssel signiert:" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" ist keine gültige URL!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -153,7 +144,7 @@ msgid "%(prog)s [options] url" msgstr "%(prog)s [options]-URL" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: Fehler: %(message)s\n" @@ -164,12 +155,12 @@ msgid "%d problems found" msgstr "%d Probleme gefunden" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [Optionen]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "%r ist nicht abrufbar" @@ -180,7 +171,7 @@ msgid "%s is not an accepted build field" msgstr "%s ist kein zulässiges Build-Feld" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "Option %s verfügt über keinen Wert" @@ -206,7 +197,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "„repo_keyalias” nicht in config.yml vorhanden!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "„required” ist ein ungültiges Argument für Positionsangaben" @@ -229,8 +220,7 @@ msgstr "'{aapt}' ist zu alt, fdroid benötigt build-tools-23.0.0 oder neuer!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" -msgstr "" -"„{aapt}” ist veraltet, fdroid benötigt build-tools-{version} oder neuer!" +msgstr "„{aapt}” ist veraltet, fdroid benötigt build-tools-{version} oder neuer!" #: ../fdroidserver/install.py #, python-brace-format @@ -240,18 +230,12 @@ msgstr "'{apkfilename}' ist auf {dev} bereits installiert." #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{field}' in {linedesc} is obsolete, see docs for current fields:" -msgstr "" -"'{field}' in {linedesc} ist veraltet, siehe Dokumentation für aktuelle " -"Felder:" +msgstr "'{field}' in {linedesc} ist veraltet, siehe Dokumentation für aktuelle Felder:" #: ../fdroidserver/common.py #, python-brace-format -msgid "" -"'{field}' will be in random order! Use () or [] brackets if order is " -"important!" -msgstr "" -"Das Feld „{field}” wird in zufälliger Reihenfolge angezeigt! Verwenden Sie " -"runde ( ) oder eckige [ ] Klammern, wenn die Reihenfolge wichtig ist!" +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgstr "Das Feld „{field}” wird in zufälliger Reihenfolge angezeigt! Verwenden Sie runde ( ) oder eckige [ ] Klammern, wenn die Reihenfolge wichtig ist!" #: ../fdroidserver/common.py #, python-brace-format @@ -261,8 +245,7 @@ msgstr "„{path}” konnte nicht ausgeführt werden!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" -msgstr "" -"„{value}” ist kein gültiges {field} in {appid}. Regex-Muster: {pattern}" +msgstr "„{value}” ist kein gültiges {field} in {appid}. Regex-Muster: {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -270,15 +253,13 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate für {appid} fehlgeschlagen: {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() nicht festgelegt" #: ../fdroidserver/metadata.py msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." -msgstr "" -".fdroid.txt wird nicht unterstützt! Konvertieren Sie in .fdroid.yml oder ." -"fdroid.json." +msgstr ".fdroid.txt wird nicht unterstützt! Konvertieren Sie in .fdroid.yml oder .fdroid.json." #: ../fdroidserver/lint.py msgid "/issues is missing" @@ -298,8 +279,7 @@ msgstr "Eine neue Anwendung aus ihrem Quellcode hinzufügen" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" -msgstr "" -"Füge einen Repository-Signierschlüssel zu einem unsignierten Repository hinzu" +msgstr "Füge einen Repository-Signierschlüssel zu einem unsignierten Repository hinzu" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" @@ -314,13 +294,9 @@ msgstr "Nur für {name} eine neue Repro hinzufügen" msgid "Alias of the repo signing key in the keystore" msgstr "Pseudonym des Repository-Signierchlüssels im Schlüsselspeicher" -#: ../fdroidserver/import.py -msgid "" -"Allows a different revision (or git branch) to be specified for the initial " -"import" -msgstr "" -"Ermöglicht die Bestimmung unterschiedlicher Überarbeitungen (oder Git-" -"Zweige) für den Erstimport" +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py +msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgstr "Ermöglicht die Bestimmung unterschiedlicher Überarbeitungen (oder Git-Zweige) für den Erstimport" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" @@ -403,19 +379,14 @@ msgid "Archiving {apkfilename} with invalid signature!" msgstr "Archivierung von {apkfilename} mit ungültiger Signatur!" #: ../fdroidserver/mirror.py -msgid "" -"Base URL to mirror, can include the index signing key using the query " -"string: ?fingerprint=" -msgstr "" -"Basis-URL zum Spiegeln, kann den Index-Signierungsschlüssel mit Hilfe des " -"Abfrage-Strings enthalten: ?fingerprint=" +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgstr "Basis-URL zum Spiegeln, kann den Index-Signierungsschlüssel mit Hilfe des Abfrage-Strings enthalten: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "" -"Zweig „{branch}”, der als Bestätigung im Build verwendet wird „{versionName}”" +msgstr "Zweig „{branch}”, der als Bestätigung im Build verwendet wird „{versionName}”" #: ../fdroidserver/lint.py #, python-brace-format @@ -437,9 +408,7 @@ msgstr "Alle verfügbaren Anwendungen erstellen" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" -msgstr "" -"Build durch „fdroid import” erstellt - Entfernen Sie die Zeile " -"„Deaktiviert”, sobald sie fertig ist" +msgstr "Build durch „fdroid import” erstellt - Entfernen Sie die Zeile „Deaktiviert”, sobald sie fertig ist" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" @@ -451,12 +420,8 @@ msgstr "Nur die neueste Version jedes Programmpakets erstellen" #: ../fdroidserver/metadata.py #, python-brace-format -msgid "" -"Build should have comma-separated versionName and versionCode, not " -"\"{value}\", in {linedesc}" -msgstr "" -"Build sollte kommagetrennte versionName und versionCode enthalten, nicht " -"„{value}”, in {linedesc}" +msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" +msgstr "Build sollte kommagetrennte versionName und versionCode enthalten, nicht „{value}”, in {linedesc}" #: ../fdroidserver/init.py #, python-format @@ -470,10 +435,8 @@ msgstr "Auto-Update der App ohne CurrentVersionCode nicht möglich" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" -msgstr[0] "" -"Kann nicht erstellt werden, da {} Fehler beim Prüfen aufgetreten ist" -msgstr[1] "" -"Kann nicht erstellt werden, da {} Fehler beim Prüfen aufgetreten sind" +msgstr[0] "Kann nicht erstellt werden, da {} Fehler beim Prüfen aufgetreten ist" +msgstr[1] "Kann nicht erstellt werden, da {} Fehler beim Prüfen aufgetreten sind" #: ../fdroidserver/vmtools.py #, python-brace-format @@ -498,9 +461,7 @@ msgstr "--list und --to können nicht gleichzeitig verwendet werden" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" -msgstr "" -"„{path}” konnte nicht geschrieben werden, kein akzeptiertes Format, " -"verwenden Sie: {formats}" +msgstr "„{path}” konnte nicht geschrieben werden, kein akzeptiertes Format, verwenden Sie: {formats}" #: ../fdroidserver/lint.py #, python-format @@ -517,29 +478,19 @@ msgstr "Auf Aktualisierungen für Anwendungen prüfen" #: ../fdroidserver/update.py #, python-brace-format -msgid "" -"Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, " -"archapks:{arch}" -msgstr "" -"Archivierung auf {appid} überprüfen - APKs:{integer}, keepversions:{keep}, " -"archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Archivierung auf {appid} überprüfen - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py #, python-brace-format -msgid "" -"Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, " -"archapks:{arch}" -msgstr "" -"Archivierung auf {appid} überprüfen - apks:{integer}, keepversions:{keep}, " -"archapks:{arch}" +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Archivierung auf {appid} überprüfen - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" -msgstr "" -"Sauber aktualisieren - ohne Verwendung der Zwischenspeicher, alle APKs " -"wiederaufbereiten" +msgstr "Sauber aktualisieren - ohne Verwendung der Zwischenspeicher, alle APKs wiederaufbereiten" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Liste der Kategorien durch Kommata getrennt." @@ -553,29 +504,24 @@ msgid "Commit changes" msgstr "Änderungen übergeben" #: ../fdroidserver/__main__.py -msgid "" -"Conflicting arguments: '--verbose' and '--quiet' can not be specified at the " -"same time." -msgstr "" -"Widersprüchliche Argumente: '--verbose' und '--quiet' können nicht " -"gleichzeitig angegeben werden." +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgstr "Widersprüchliche Argumente: '--verbose' und '--quiet' können nicht gleichzeitig angegeben werden." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" -"Konflikt in der Konfiguration. Verwende {newfile}, ignoriere {oldfile}!" +msgstr "Konflikt in der Konfiguration. Verwende {newfile}, ignoriere {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "„{command}” konnte auf Ihrem System nicht gefunden werden" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Neuester Versionscode konnte nicht gefunden werden" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Neuester Versionsname konnte nicht gefunden werden" @@ -595,7 +541,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Konnte Größe \"{size}\" nicht parsen, falscher Typ \"{type}\"" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Konnte Anwendungs-ID nicht finden" @@ -619,9 +565,7 @@ msgstr "Konnte Paket-ID nicht finden" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" -msgstr "" -"Es ist ungehörig, bestehende Signaturschlüssel-Einstellungen zu " -"überschreiben!" +msgstr "Es ist ungehörig, bestehende Signaturschlüssel-Einstellungen zu überschreiben!" #: ../fdroidserver/update.py msgid "Create a repo signing key in a keystore" @@ -670,9 +614,7 @@ msgstr "Unsignierter Index zur Vorbereitung der Signierung wird erstellt" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "" -"CurrentVersionCode {cv} ist kleiner als der älteste Build-Eintrag " -"{versionCode}" +msgstr "CurrentVersionCode {cv} ist kleiner als der älteste Build-Eintrag {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" @@ -690,8 +632,7 @@ msgstr "Lösche Archiv, Repository ist zu groß ({size} max {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "" -"Git-Mirror-Verlauf löschen, Repository ist zu groß ({size} max {limit})" +msgstr "Git-Mirror-Verlauf löschen, Repository ist zu groß ({size} max {limit})" #: ../fdroidserver/update.py #, python-brace-format @@ -710,17 +651,14 @@ msgstr "Beschreibung enthält eine doppelte Zeile" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" -"Beschreibung enthält eine Liste (%s), ist aber weder aufgezählt (*) noch " -"nummeriert (#)" +msgstr "Beschreibung enthält eine Liste (%s), ist aber weder aufgezählt (*) noch nummeriert (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" -msgstr "" -"Länge der Beschreibung {length} übersteigt die zulässige Zeichenzahl {limit}" +msgstr "Länge der Beschreibung {length} übersteigt die zulässige Zeichenzahl {limit}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Nicht 'disable:' zu den erzeugten Erstellungseinträgen hinzufügen" @@ -739,8 +677,7 @@ msgstr "Android-SDK-Pfad nicht abfragen, einfach überspringen" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" -msgstr "" -"Entfernen Sie die vom Schlüsselspeicher erzeugten privaten Schlüssel nicht" +msgstr "Entfernen Sie die vom Schlüsselspeicher erzeugten privaten Schlüssel nicht" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" @@ -751,12 +688,8 @@ msgid "Don't do anything logs-related" msgstr "Mache auf Logs bezogen nichts" #: ../fdroidserver/build.py -msgid "" -"Don't refresh the repository, useful when testing a build with no internet " -"connection" -msgstr "" -"Keine Aktualisierung des Repositorys. Nützlich, wenn ein Build ohne " -"Internetverbindung getestet wird" +msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgstr "Keine Aktualisierung des Repositorys. Nützlich, wenn ein Build ohne Internetverbindung getestet wird" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py #: ../fdroidserver/upload.py @@ -778,9 +711,7 @@ msgstr "Herunterladen %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." -msgstr "" -"Herunterladen des Repositorys bereits einmal fehlgeschlagen, versuche es " -"nicht nochmal." +msgstr "Herunterladen des Repositorys bereits einmal fehlgeschlagen, versuche es nicht nochmal." #: ../fdroidserver/verify.py #, python-brace-format @@ -789,10 +720,8 @@ msgstr "Herunterladen von {url} fehlgeschlagen. {error}" #: ../fdroidserver/metadata.py #, python-brace-format -msgid "" -"Duplicate build recipe found for versionCode {versionCode} in {linedesc}" -msgstr "" -"Doppelte Build-Rezeptur für versionCode {versionCode} in {linedesc} gefunden" +msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" +msgstr "Doppelte Build-Rezeptur für versionCode {versionCode} in {linedesc} gefunden" #: ../fdroidserver/lint.py #, python-brace-format @@ -805,22 +734,25 @@ msgstr "APKs nach Erstellung dynamisch durchsuchen" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" -"FEHLER: Der \"server\"-Unterbefehl wurde entfernt, verwende \"deploy\"!" +msgstr "FEHLER: Der \"server\"-Unterbefehl wurde entfernt, verwende \"deploy\"!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" -"FEHLER: Dieser Befehl sollte niemals verwendet werden, um f-droid.org zu " -"spiegeln!\n" +"FEHLER: Dieser Befehl sollte niemals verwendet werden, um f-droid.org zu spiegeln!\n" "Ein vollständiger Spiegel von f-droid.org erfordert mehr als 200 GB." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "FEHLER: nicht unterstützter CI-Typ, Patches willkommen!" +#: ../fdroidserver/nightly.py +#, fuzzy, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "FEHLER: nicht unterstützter CI-Typ, Patches willkommen!" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -828,12 +760,8 @@ msgstr "Build-Flag bei {linedesc} leeren" #: ../fdroidserver/__main__.py #, python-brace-format -msgid "" -"Encoding is set to '{enc}' fdroid might run into encoding issues. Please set " -"it to 'UTF-8' for best results." -msgstr "" -"Die Kodierung ist auf '{enc}' gesetzt. Dies könnte zu Kodierungsproblemen " -"führen. Bitte setze sie auf ''UTF-8'' für beste Ergebnisse." +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "Die Kodierung ist auf '{enc}' gesetzt. Dies könnte zu Kodierungsproblemen führen. Bitte setze sie auf ''UTF-8'' für beste Ergebnisse." #: ../fdroidserver/init.py #, python-format @@ -856,9 +784,14 @@ msgid "Error while attempting to publish log: %s" msgstr "Fehler beim Versuch, das Protokoll zu veröffentlichen: %s" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Fehler bei der Ermittlung der Repro-Adresse" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Signaturen aus APKs extrahieren" @@ -958,12 +891,8 @@ msgid "Forbidden HTML tags" msgstr "Verbotene HTML-Befehle" #: ../fdroidserver/build.py -msgid "" -"Force build of disabled apps, and carries on regardless of scan problems. " -"Only allowed in test mode." -msgstr "" -"Erstellung deaktivierter Apps erzwingen und ungeachtet von Scan-Problemen " -"ausüben. Nur im Testmodus erlaubt." +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgstr "Erstellung deaktivierter Apps erzwingen und ungeachtet von Scan-Problemen ausüben. Nur im Testmodus erlaubt." #: ../fdroidserver/build.py #, python-brace-format @@ -1075,21 +1004,17 @@ msgstr "HTTPS muss bei Subversion-URLs verwendet werden!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "" -"Wenn ein Git-Mirror zu groß wird, erlaube dem Archiv gelöscht zu werden" +msgstr "Wenn ein Git-Mirror zu groß wird, erlaube dem Archiv gelöscht zu werden" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "" -"Wenn das Hochladen fehlschlägt, versuchen Sie es händisch auf {url} " -"hochzuladen" +msgstr "Wenn das Hochladen fehlschlägt, versuchen Sie es händisch auf {url} hochzuladen" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "" -"'{field}' in '{metapath}' Metadaten wird ignoriert, da es veraltet ist." +msgstr "'{field}' in '{metapath}' Metadaten wird ignoriert, da es veraltet ist." #: ../fdroidserver/update.py #, python-format @@ -1112,8 +1037,7 @@ msgstr "Ignoriere die Datei {ext} bei '{path}'" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "" -"APKs einschließen, die mit deaktivierten Algorithmen wie MD5 signiert sind" +msgstr "APKs einschließen, die mit deaktivierten Algorithmen wie MD5 signiert sind" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" @@ -1218,17 +1142,12 @@ msgstr "Ungültige Aufzählung" #: ../fdroidserver/lint.py #, python-format -msgid "" -"Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" -msgstr "" -"Ungültiges Lizenz-Tag \"%s\"! Verwenden Sie nur Tags von https://spdx.org/" -"license-list" +msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" +msgstr "Ungültiges Lizenz-Tag \"%s\"! Verwenden Sie nur Tags von https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "" -"Ungültiger Link - verwenden Sie [http://foo.bar Linktitel] oder [http://foo." -"bar]" +msgstr "Ungültiger Link - verwenden Sie [http://foo.bar Linktitel] oder [http://foo.bar]" #: ../fdroidserver/metadata.py #, python-format @@ -1296,20 +1215,15 @@ msgstr "Java JAR-Datei" #: ../fdroidserver/publish.py ../fdroidserver/update.py #: ../fdroidserver/mirror.py msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "" -"Java JDK nicht gefunden! Installieren Sie es in einem Standardordner oder " -"setzen Sie java_paths!" +msgstr "Java JDK nicht gefunden! Installieren Sie es in einem Standardordner oder setzen Sie java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Java-kompilierte Klasse" #: ../fdroidserver/signindex.py -msgid "" -"Java jarsigner not found! Install in standard location or set java_paths!" -msgstr "" -"Java jarsigner nicht gefunden! Installieren Sie es in einem Standardordner " -"oder setzen Sie java_paths!" +msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "Java jarsigner nicht gefunden! Installieren Sie es in einem Standardordner oder setzen Sie java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" @@ -1326,11 +1240,8 @@ msgstr "Schlüsselspeicher für den Signierschlüssel:\t" #: ../fdroidserver/lint.py #, python-brace-format -msgid "" -"Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "" -"Der zuletzt verwendete Commit '{commit}' sieht aus wie ein Tag, aber der " -"Aktualisierung-Überprüfungs-Modus ist '{ucm}'" +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "Der zuletzt verwendete Commit '{commit}' sieht aus wie ein Tag, aber der Aktualisierung-Überprüfungs-Modus ist '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" @@ -1364,11 +1275,14 @@ msgstr "Fehlerhafte Paketquellen-Spiegelserver." msgid "Malformed serverwebroot line:" msgstr "Fehlerhafte serverwebroot Zeile:" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." -msgstr "" -"Spiegeln Sie die komplette Paketquelle und das Archiv, inklusive aller " -"Dateitypen." +msgstr "Spiegeln Sie die komplette Paketquelle und das Archiv, inklusive aller Dateitypen." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" @@ -1379,6 +1293,10 @@ msgstr "Fehlendes Ausgabeverzeichnis" msgid "Name '%s' is just the auto name - remove it" msgstr "Name '%s' ist nur der automatische Name - entfernen Sie ihn" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "Keine 'config.yml' gefunden, nutze Standardeinstellungen." @@ -1394,8 +1312,7 @@ msgstr "Keine Android SDK gefunden!" #: ../fdroidserver/import.py msgid "No android or kivy project could be found. Specify --subdir?" -msgstr "" -"Es konnte kein Android- oder Kivy-Projekt gefunden werden. --subdir angeben?" +msgstr "Es konnte kein Android- oder Kivy-Projekt gefunden werden. --subdir angeben?" #: ../fdroidserver/install.py msgid "No attached devices found" @@ -1418,11 +1335,12 @@ msgstr "Kein Fingerabdruck in der URL." msgid "No git submodules available" msgstr "Keine Git-Submodule verfügbar" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Es konnte kein Gradle-Projekt gefunden werden. \"--subdir\" angeben?" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Keine Informationen gefunden." @@ -1445,9 +1363,7 @@ msgstr "Sie müssen nicht angeben, dass die App für Android ist" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" -msgstr "" -"Keine Option gesetzt! Bearbeiten Sie Ihre config.yml, um mindestens eine " -"davon zu setzen:" +msgstr "Keine Option gesetzt! Bearbeiten Sie Ihre config.yml, um mindestens eine davon zu setzen:" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1519,8 +1435,7 @@ msgstr "Der OBB-Packetname stimmt mit keinem unterstützten APK überein:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" -"Maschine offline, überspringe git-Spiegelgeneration bis `fdroid deploy`" +msgstr "Maschine offline, überspringe git-Spiegelgeneration bis `fdroid deploy`" #: ../fdroidserver/common.py #, python-brace-format @@ -1534,8 +1449,7 @@ msgstr "Veralteter Name für fdroid deploy" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" -msgstr "" -"Nur PNG und JPEG werden für Grafiken unterstützt, gefunden wurde: {path}" +msgstr "Nur PNG und JPEG werden für Grafiken unterstützt, gefunden wurde: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" @@ -1550,7 +1464,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "OpenCollective-Spendenmethoden gehören in das OpenCollective: Feld" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "Optionen" @@ -1568,18 +1482,16 @@ msgstr "JSON an stdout ausgeben." msgid "Outputting JSON" msgstr "JSON ausgeben" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Gesamt-Lizenz des Projekts." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "" -"Überschreiben von leeren Versionsnamen in {apkfilename} aus Metadaten: " -"{version}" +msgstr "Überschreiben von leeren Versionsnamen in {apkfilename} aus Metadaten: {version}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "Paket \"{appid}\" existiert bereits" @@ -1593,22 +1505,16 @@ msgstr "Analysiere Manifest bei {path}" msgid "Password required with username" msgstr "Passwort mit Benutzername benötigt" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." -msgstr "" -"Pfad zum Unterverzeichnis des Android-Hauptprojekts, wenn es nicht im " -"Stammverzeichnis ist." +msgstr "Pfad zum Unterverzeichnis des Android-Hauptprojekts, wenn es nicht im Stammverzeichnis ist." msgid "Path to main android project subdirectory, if not in root." -msgstr "" -"Pfad zum zentralen Androidprojekt-Unterverzeichnis, wenn es nicht im " -"Stammverzeichnis ist." +msgstr "Pfad zum zentralen Androidprojekt-Unterverzeichnis, wenn es nicht im Stammverzeichnis ist." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" -msgstr "" -"Pfad zum Android-SDK (Softwareentwicklungsbaukasten) (mitunter in " -"ANDROID_HOME festgelegt)" +msgstr "Pfad zum Android-SDK (Softwareentwicklungsbaukasten) (mitunter in ANDROID_HOME festgelegt)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" @@ -1620,8 +1526,12 @@ msgstr "Pfad zum Schlüsselspeicher für den Repository-Signierschlüssel" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" +msgstr "Drucken der geheimen Variable in das Terminal zum einfachen Kopieren/Einfügen" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" msgstr "" -"Drucken der geheimen Variable in das Terminal zum einfachen Kopieren/Einfügen" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1655,7 +1565,7 @@ msgstr "Erstelle menschenlesbares XML/JSON für Indexdateien" msgid "Produce human-readable index.xml" msgstr "Visuell lesbare „index.xml“ herstellen" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "Projekt-Adresse, von der importiert werden soll." @@ -1699,12 +1609,8 @@ msgstr "Lesen von minSdkVersion fehlgeschlagen: \"{apkfilename}\"" #. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/common.py #, python-brace-format -msgid "" -"Reading packageName/versionCode/versionName failed, APK invalid: " -"'{apkfilename}'" -msgstr "" -"Lesen von packageName/versionCode/versionName fehlgeschlagen, APK ungültig: " -"'{apkfilename}'" +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "Lesen von packageName/versionCode/versionName fehlgeschlagen, APK ungültig: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format @@ -1712,12 +1618,8 @@ msgid "Reading {apkfilename} from cache" msgstr "Lese {apkfilename} aus dem Cache" #: ../fdroidserver/stats.py -msgid "" -"Recalculate aggregate stats - use when changes have been made that would " -"invalidate old cached data." -msgstr "" -"Sammelstatistik neu berechnen - nach Änderungen anwenden, die alte " -"zwischengespeicherte Daten entwerten würden." +msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." +msgstr "Sammelstatistik neu berechnen - nach Änderungen anwenden, die alte zwischengespeicherte Daten entwerten würden." #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1730,9 +1632,7 @@ msgstr "Entferne {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" -msgstr "" -"APK-Dateien umbenennen, die nicht dem Muster „package.name_123.apk“ " -"entsprechen" +msgstr "APK-Dateien umbenennen, die nicht dem Muster „package.name_123.apk“ entsprechen" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" @@ -1743,12 +1643,8 @@ msgid "Report on build data status" msgstr "Bericht zum Build-Datenstatus" #: ../fdroidserver/build.py -msgid "" -"Reset and create a brand new build server, even if the existing one appears " -"to be ok." -msgstr "" -"Zurücksetzen und ganz neuen Build-Server einrichten, auch wenn der " -"bestehende in Ordnung zu sein scheint." +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgstr "Zurücksetzen und ganz neuen Build-Server einrichten, auch wenn der bestehende in Ordnung zu sein scheint." #: ../fdroidserver/nightly.py #, python-brace-format @@ -1757,9 +1653,7 @@ msgstr "{apkfilename} erneut mit dem mitgelieferten debug.keystore signieren" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" -msgstr "" -"Größe aller Symbole ändern, welche die maximale Pixelgröße überschreiten, " -"und beenden" +msgstr "Größe aller Symbole ändern, welche die maximale Pixelgröße überschreiten, und beenden" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" @@ -1808,6 +1702,11 @@ msgstr "Scannen Sie die entstandene(n) APK(s) nach bekannten non-free-Klassen." msgid "Scan the source code of a package" msgstr "Quellcode eines Programmpakets durchsuchen" +#: ../fdroidserver/scanner.py +#, fuzzy, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "Scanner fand {count} Probleme in {appid}:" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1828,6 +1727,11 @@ msgstr[1] "Scanner fand {count} Probleme" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "APK mit apkanalyzer nach bekannten nicht-quelloffenen Klassen scannen." +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "APK mit apkanalyzer nach bekannten nicht-quelloffenen Klassen scannen." + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1839,8 +1743,7 @@ msgstr "Einstellen der Uhr auf diese Zeit mit:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "" -"Setze maximale Veröffentlichungen im Repo bevor ältere archiviert werden" +msgstr "Setze maximale Veröffentlichungen im Repo bevor ältere archiviert werden" #: ../fdroidserver/build.py #, python-brace-format @@ -1870,9 +1773,7 @@ msgstr "Erstellte Indizes durch Verwendung von „update --nosign“ signieren" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" -msgstr "" -"Durchsuchen des Quellcodes nach Binärdateien und anderen Problemen " -"überspringen" +msgstr "Durchsuchen des Quellcodes nach Binärdateien und anderen Problemen überspringen" #: ../fdroidserver/update.py #, python-brace-format @@ -1906,14 +1807,11 @@ msgstr "Überspringe {appid}: keine Builds angegeben" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Specify a local folder to sync the repo to" -msgstr "" -"Einen lokalen Ordner bestimmen, in dem das Repository synchronisiert wird" +msgstr "Einen lokalen Ordner bestimmen, in dem das Repository synchronisiert wird" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Specify an identity file to provide to SSH for rsyncing" -msgstr "" -"Eine Identitätsdatei bestimmen, die bei Re-Synchronisation an SSH übergeben " -"wird" +msgstr "Eine Identitätsdatei bestimmen, die bei Re-Synchronisation an SSH übergeben wird" #: ../fdroidserver/build.py msgid "Specify that we're running on the build server" @@ -1945,8 +1843,7 @@ msgstr "Zusammenfassung '%s' ist nur der Name der App" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" -msgstr "" -"Zusammenfassung mit der Länge {length} liegt über der {limit} Zeichengrenze" +msgstr "Zusammenfassung mit der Länge {length} liegt über der {limit} Zeichengrenze" #: ../fdroidserver/common.py #, python-brace-format @@ -1954,9 +1851,7 @@ msgid "System clock is older than date in {path}!" msgstr "Die System-Uhr ist älter als das Datum in {path}!" #: ../fdroidserver/checkupdates.py -msgid "" -"Tags update mode only works for git, hg, bzr and git-svn repositories " -"currently" +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "Der Aktualisierungsmodus funktioniert derzeit nur für Git-, Hg-, Bzr- und Git-SVN-Paketquellen" #: ../fdroidserver/checkupdates.py @@ -1964,12 +1859,8 @@ msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "Aktualisierungsmodus mit Tags in git-svn verwendet, aber das Repo wurde nicht mit Tags eingerichtet" #: ../fdroidserver/build.py -msgid "" -"Test mode - put output in the tmp directory only, and always build, even if " -"the output already exists." -msgstr "" -"Testmodus - Ausgabe nur ins tmp-Verzeichnis einfügen, immer erstellen, " -"selbst wenn die Ausgabe bereits vorhanden ist." +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgstr "Testmodus - Ausgabe nur ins tmp-Verzeichnis einfügen, immer erstellen, selbst wenn die Ausgabe bereits vorhanden ist." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1979,8 +1870,7 @@ msgstr "Der OBB-Versionscode muss nach \"{name}.\" stehen:" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" -msgstr "" -"Basis-Adresse zur Anmeldung am Repository (Standard: https://f-droid.org)" +msgstr "Basis-Adresse zur Anmeldung am Repository (Standard: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" @@ -2016,19 +1906,10 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Dies sind die Apps, die aus dem Hauptrepository archiviert wurden." #: ../fdroidserver/common.py -msgid "" -"This is a repository of apps to be used with F-Droid. Applications in this " -"repository are either official binaries built by the original application " -"developers, or are binaries built from source by the admin of f-droid.org " -"using the tools on https://gitlab.com/fdroid." -msgstr "" -"Dies ist eine Paketquelle für Anwendungen, die für die Benutzung zusammen " -"mit F-Droid gedacht ist. Die darin enthaltenen Anwendungen sind entweder " -"offizielle von den Entwicklern erstellte Binärdateien oder werden von f-" -"droid.org mithilfe des Werkzeugs auf https://gitlab.com/fdroid aus dem " -"Quellcode erstellt." +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "Dies ist eine Paketquelle für Anwendungen, die für die Benutzung zusammen mit F-Droid gedacht ist. Die darin enthaltenen Anwendungen sind entweder offizielle von den Entwicklern erstellte Binärdateien oder werden von f-droid.org mithilfe des Werkzeugs auf https://gitlab.com/fdroid aus dem Quellcode erstellt." -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Dieses Repo hat bereits lokale Metadaten: %s" @@ -2053,12 +1934,8 @@ msgstr "" "und https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "" -"To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config." -"yml!" -msgstr "" -"Um awsbucket zu benutzen, müssen awssecretkey und awsaccesskeyid auch in der " -"config.yml gesetzt sein!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Um awsbucket zu benutzen, müssen awssecretkey und awsaccesskeyid auch in der config.yml gesetzt sein!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -2078,20 +1955,12 @@ msgid "URL {url} in Description: {error}" msgstr "URL {url} in der Beschreibung: {error}" #: ../fdroidserver/lint.py -msgid "" -"Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from " -"https://spdx.org/license-list" -msgstr "" -"Ungültiges Lizenz-Tag \"{}\"! Verwenden Sie nur Kennzeichen von https://spdx." -"org/license-list, die von FSF oder OSI anerkannt sind" +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "Ungültiges Lizenz-Tag \"{}\"! Verwenden Sie nur Kennzeichen von https://spdx.org/license-list, die von FSF oder OSI anerkannt sind" #: ../fdroidserver/lint.py -msgid "" -"Unexpected license tag \"{}\"! Only use license tags configured in your " -"config file" -msgstr "" -"Unerwartetes Lizenz-Tag \"{}\"! Nur Lizenz-Tags verwenden, die in deiner " -"config-Datei eingerichtet sind" +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgstr "Unerwartetes Lizenz-Tag \"{}\"! Nur Lizenz-Tags verwenden, die in deiner config-Datei eingerichtet sind" #: ../fdroidserver/common.py #, python-brace-format @@ -2139,9 +2008,7 @@ msgstr "Unbekannte Version von aapt, könnte Probleme verursachen: " #: ../fdroidserver/lint.py msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "" -"Nicht verlinkter Link - verwenden Sie [http://foo.bar Linktitel] oder " -"[http://foo.bar]" +msgstr "Nicht verlinkter Link - verwenden Sie [http://foo.bar Linktitel] oder [http://foo.bar]" #: ../fdroidserver/lint.py msgid "Unnecessary leading space" @@ -2260,24 +2127,17 @@ msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData hat eine ungültige URL: {url}" #: ../fdroidserver/lint.py -msgid "" -"UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" -msgstr "" -"UpdateCheckMode ist gesetzt, aber es sieht so aus, als ob checkupdates noch " -"nicht ausgeführt wurde" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" +msgstr "UpdateCheckMode ist gesetzt, aber es sieht so aus, als ob checkupdates noch nicht ausgeführt wurde" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID - it can be removed" -msgstr "" -"UpdateCheckName ist auf die bekannte App-ID gesetzt - sie kann entfernt " -"werden" +msgstr "UpdateCheckName ist auf die bekannte App-ID gesetzt - sie kann entfernt werden" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "" -"UpdateCheckName ist auf eine bekannte App-ID gesetzt, sie kann entfernt " -"werden" +msgstr "UpdateCheckName ist auf eine bekannte App-ID gesetzt, sie kann entfernt werden" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2290,21 +2150,19 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "Lade {apkfilename} auf VirusTotal hoch" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "Syntax" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Syntax: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" -"Verwenden Sie /HEAD anstelle von /master, um auf eine Datei im Hauptzweig zu " -"verweisen" +msgstr "Verwenden Sie /HEAD anstelle von /master, um auf eine Datei im Hauptzweig zu verweisen" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." @@ -2332,11 +2190,8 @@ msgid "Using APK Signature v3" msgstr "Verwende APK-Signatur v3" #: ../fdroidserver/common.py -msgid "" -"Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" -msgstr "" -"Von Java jarsigner zur Verifikation von APKs wird abgeraten! Verwenden Sie " -"apksigner" +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "Von Java jarsigner zur Verifikation von APKs wird abgeraten! Verwenden Sie apksigner" #: ../fdroidserver/common.py #, python-brace-format @@ -2359,9 +2214,7 @@ msgstr "Gültige Befehle sind:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." -msgstr "" -"Vergleichen Sie mit lokal zwischengespeicherter Kopie, anstatt erneut " -"herunterzuladen." +msgstr "Vergleichen Sie mit lokal zwischengespeicherter Kopie, anstatt erneut herunterzuladen." #: ../fdroid ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" @@ -2373,32 +2226,20 @@ msgstr "Überprüfe die Index-Signatur:" #: ../fdroidserver/deploy.py #, python-brace-format -msgid "" -"VirusTotal API key cannot upload files larger than 32MB, use {url} to upload " -"{path}." -msgstr "" -"VirusTotal-API-Schlüssel kann nicht Dateien größer 32MB hochladen, verwende " -"{url} um {path} hochzuladen." +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "VirusTotal-API-Schlüssel kann nicht Dateien größer 32MB hochladen, verwende {url} um {path} hochzuladen." #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Vor möglichen Metadaten-Fehlern warnen" #: ../fdroidserver/update.py -msgid "" -"When configured for signed indexes, create only unsigned indexes at this " -"stage" -msgstr "" -"Bei einer Konfiguration mit signierten Indizes, in dieser Phase nur " -"unsignierte Indizes erstellen" +msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgstr "Bei einer Konfiguration mit signierten Indizes, in dieser Phase nur unsignierte Indizes erstellen" #: ../fdroidserver/lint.py -msgid "" -"When linting the entire repository yamllint is disabled by default. This " -"option forces yamllint regardless." -msgstr "" -"Beim Linting des gesamten Repositoriums wird yamllint standardmäßig " -"deaktiviert. Diese Option erzwingt yamllint ungeachtet dessen." +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgstr "Beim Linting des gesamten Repositoriums wird yamllint standardmäßig deaktiviert. Diese Option erzwingt yamllint ungeachtet dessen." msgid "X.509 'Distiguished Name' used when generating keys" msgstr "X.509 'Angesehener Name' wenn Schlüssel generiert werden" @@ -2409,8 +2250,7 @@ msgstr "X.509 'Distinguished Name' zum Erzeugen von Schlüsseln" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" -msgstr "" -"Sie können ANDROID_HOME verwenden, um den Pfad zu Ihrem SDK zu setzen, z.B.:" +msgstr "Sie können ANDROID_HOME verwenden, um den Pfad zu Ihrem SDK zu setzen, z.B.:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" @@ -2427,22 +2267,20 @@ msgid "adding to {name}: {path}" msgstr "Hinzufügen zu {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "Mehrdeutige Option: %(option)s könnte übereinstimmen mit %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "Mehrdeutige Option: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "" -"apksigner nicht gefunden! Moderne APKs können nicht signiert oder " -"verifiziert werden" +msgstr "apksigner nicht gefunden! Moderne APKs können nicht signiert oder verifiziert werden" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2474,8 +2312,12 @@ msgstr "App-ID, um auf Aktualisierungen zu prüfen" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "App-ID mit optionalem Versionscode in der Form APPID[:VERCODE]" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "Argument \"-\" mit Modus %r" @@ -2492,6 +2334,11 @@ msgstr "Versuch einer reinen ssh-Verbindung, um den Deployment-Key zu testen:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "kann scrlib-Spezifikation nicht parsen (keine Zeichenkette): '{}'" +#: /usr/lib/python3.9/argparse.py +#, fuzzy, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "„%s” konnte nicht geöffnet werden: %s" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2504,20 +2351,19 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "Konnte die benötigten srclibs nicht finden: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "Mehrere Subparser-Argumente sind unzulässig" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "kann keine Aktionen zusammenführen - zwei Gruppen heißen %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" -msgstr "" -"Kann das Update nicht veröffentlichen. Ist der Deploy-Schlüssel gesetzt?" +msgstr "Kann das Update nicht veröffentlichen. Ist der Deploy-Schlüssel gesetzt?" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2533,12 +2379,12 @@ msgid "commands from plugin modules:" msgstr "Befehle aus den PlugIn-Modulen:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "komplex" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2571,8 +2417,7 @@ msgstr "{path} erzeugt" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" -"die aktuelle Version ist neuer: alter vercode={old}, neuer vercode={new}" +msgstr "die aktuelle Version ist neuer: alter vercode={old}, neuer vercode={new}" #: ../fdroidserver/update.py #, python-brace-format @@ -2590,7 +2435,7 @@ msgid "deployed process log {path} to {dest}" msgstr "Verarbeitungsprotokoll {path} unter {dest} bereitgestellt" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= wird benötigt für Optionen wie %r" @@ -2600,7 +2445,7 @@ msgid "executable binary, possibly code" msgstr "ausführbare Binärdatei, vermutlich Code" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2608,17 +2453,17 @@ msgstr[0] "%s Argument erwartet" msgstr[1] "%s Argumente erwartet" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "mindestens ein Argument erwartet" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "höchstens ein Argument erwartet" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "ein Argument erwartet" @@ -2636,7 +2481,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "Gleitkomma" @@ -2646,9 +2491,7 @@ msgstr "Fehler zwingend als Warnungen ausgeben oder ignorieren" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." -msgstr "" -"Erzwingen, dass Metadatenfehler (Standard) als Warnung ausgegeben oder " -"ignoriert werden." +msgstr "Erzwingen, dass Metadatenfehler (Standard) als Warnung ausgegeben oder ignoriert werden." #: ../fdroidserver/common.py msgid "git svn clone failed" @@ -2659,49 +2502,48 @@ msgid "gzip file archive" msgstr "gzip Dateiarchiv" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "Ausdrückliches Argument %r ignoriert" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" -msgstr "" -"index-v1 muß eine Signatur haben, verwenden Sie `fdroid signindex` um sie zu " -"erzeugen!" +msgstr "index-v1 muß eine Signatur haben, verwenden Sie `fdroid signindex` um sie zu erzeugen!" + +#: ../fdroidserver/index.py +#, fuzzy +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "index-v1 muß eine Signatur haben, verwenden Sie `fdroid signindex` um sie zu erzeugen!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "Ganzzahl" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "Ungültige(r) %(type)s mit Wert: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "Ungültige Auswahl: %(value)r (Wählen Sie aus %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "Ungültiger conflict_resolution-Wert: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format -msgid "" -"invalid option string %(option)r: must start with a character " -"%(prefix_chars)r" -msgstr "" -"Ungültige Optionszeichenfolge %(option)r: muss mit einem Zeichen " -"%(prefix_chars)r beginnen" +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgstr "Ungültige Optionszeichenfolge %(option)r: muss mit einem Zeichen %(prefix_chars)r beginnen" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -2710,11 +2552,8 @@ msgstr "Neuestes Build-Rezept ist neuer: alter Vercode={old}, neuer Vercode={new #: ../fdroidserver/deploy.py #, python-brace-format -msgid "" -"local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" -msgstr "" -"local_copy_dir endet nicht auf \"fdroid\", meinten Sie stattdessen: " -"\"{path}\"" +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "local_copy_dir endet nicht auf \"fdroid\", meinten Sie stattdessen: \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" @@ -2730,7 +2569,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "Spiegelserver '%s' ended nicht mit 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "sich gegenseitig ausschließende Argumente müssen optional sein" @@ -2744,7 +2583,7 @@ msgid "no APK supplied" msgstr "kein APK bereitgestellt" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "keine solche Option: %s" @@ -2758,13 +2597,13 @@ msgid "no version information found" msgstr "keine Versionsinformation gefunden" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "unzulässig mit Argument %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "eines der Argumente %s ist erforderlich" @@ -2776,60 +2615,58 @@ msgstr "akzeptiert nur Zeichenketten, Listen und Tupel" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" -"Option %s: Wenn Sie wirklich alle signierten Apps installieren wollen, " -"verwenden Sie --all" +msgstr "Option %s: Wenn Sie wirklich alle signierten Apps installieren wollen, verwenden Sie --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "Option %s: ungültiger %s Wert: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "Option %s: ungültige Wahl: %r (wählen Sie aus %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "Option -%s nicht erkannt" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "Option -%s erfordert Argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "Option --%s darf kein Argument haben" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "option --%s ist kein eindeutiges Präfix" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "Option --%s nicht erkannt" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "Option --%s erfordert Argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "optionale Argumente" @@ -2839,7 +2676,7 @@ msgid "overwriting existing {path}" msgstr "überschreiben des vorhandenen {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "Positionsparameter" @@ -2850,21 +2687,13 @@ msgstr "Bereitstellen des Process Log {path} auf {dest} ist fehlgeschlagen!" #: ../fdroidserver/signatures.py #, python-brace-format -msgid "" -"refuse downloading via insecure HTTP connection (use HTTPS or specify --no-" -"https-check): {apkfilename}" -msgstr "" -"Download über ungesicherte HTTP-Verbindung verweigert (verwenden Sie HTTPS " -"oder geben Sie --no-https-check an): {apkfilename}" +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgstr "Download über ungesicherte HTTP-Verbindung verweigert (verwenden Sie HTTPS oder geben Sie --no-https-check an): {apkfilename}" #: ../fdroidserver/signatures.py #, python-brace-format -msgid "" -"refuse downloading via insecure http connection (use https or specify --no-" -"https-check): {apkfilename}" -msgstr "" -"Download über ungesicherte HTTP-Verbindung verweigert (verwenden Sie HTTPS " -"oder geben Sie --no-https-check an): {apkfilename}" +msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" +msgstr "Download über ungesicherte HTTP-Verbindung verweigert (verwenden Sie HTTPS oder geben Sie --no-https-check an): {apkfilename}" #: ../fdroidserver/index.py #, python-format @@ -2876,6 +2705,10 @@ msgstr "repo_icon \"repo/icons/%s\" existiert nicht, erzeuge Platzhalter." msgid "repo_icon %s does not exist, generating placeholder." msgstr "repo_icon %s existiert nicht, erzeuge Platzhalter." +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml ist nicht installiert, kann Metadaten nicht schreiben." @@ -2895,13 +2728,14 @@ msgid "shared library" msgstr "dynamische Bibliothek" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "Versionsnummer der Anwendung anzeigen und beenden" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "diese Hilfemeldung anzeigen und beenden" @@ -2911,15 +2745,11 @@ msgstr "signiertes APK, entweder ein Dateipfad oder eine HTTPS-URL." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "" -"Überspringen des Deployens von vollständigen Build-Logs: der Log-Inhalt ist " -"leer" +msgstr "Überspringen des Deployens von vollständigen Build-Logs: der Log-Inhalt ist leer" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" -msgstr "" -"Überspringen des Deployens von vollständigen Build-Logs: nicht in der " -"Konfiguration aktiviert" +msgstr "Überspringen des Deployens von vollständigen Build-Logs: nicht in der Konfiguration aktiviert" #: ../fdroidserver/update.py #, python-brace-format @@ -2940,25 +2770,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "gelieferter Zeitstempelwert '{timestamp}' ist kein Unix-Zeitstempel" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "die Folgenden Argumente sind erforderlich: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "Unerwartete Optionsverkettung: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "Unbekannter Parser %(parser_name)r (Auswahl: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "nicht erkannte Argumente: %s" @@ -2970,6 +2800,7 @@ msgstr "Unsichere Berechtigungen in „{config_file}” (sollte 0600 sein)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "Syntax: " @@ -2988,9 +2819,7 @@ msgstr "virustotal.com limitiert die Zugriffe, warte auf Wiederholung …" #: ../fdroidserver/update.py msgid "wiki support is deprecated and will be removed in the next release!" -msgstr "" -"Die wiki-Unterstützung ist veraltet und wird in der nächsten Version " -"entfernt!" +msgstr "Die wiki-Unterstützung ist veraltet und wird in der nächsten Version entfernt!" #: ../fdroidserver/publish.py #, python-brace-format @@ -3007,20 +2836,17 @@ msgstr "{apkfilename} ({appid}) besitzt keine Metadaten!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" -"{apkfilename} hat mehrere {name} Dateien, sieht aus wie Master Key Exploit!" +msgstr "{apkfilename} hat mehrere {name} Dateien, sieht aus wie Master Key Exploit!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " -msgstr "" -"Die AndroidManifest.xml der App „{apkfilename}” hat ein ungültiges Datum: " +msgstr "Die AndroidManifest.xml der App „{apkfilename}” hat ein ungültiges Datum: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." -msgstr "" -"{appid} besitzt keinen Namen! Die Anwendungs-ID wird stattdessen verwendet." +msgstr "{appid} besitzt keinen Namen! Die Anwendungs-ID wird stattdessen verwendet." #: ../fdroidserver/update.py #, python-brace-format @@ -3091,25 +2917,22 @@ msgstr "{file} ist leer oder beschädigt!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{path}\" does not exist! Correct it in config.yml." -msgstr "" -"{name} \"{path}\" existiert nicht! Korrigieren Sie es in der config.yml." +msgstr "{name} \"{path}\" existiert nicht! Korrigieren Sie es in der config.yml." #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "" -"{name} \"{section}/icons/{path}\" existiert nicht! Überprüfe \"config.yml\"." +msgstr "{name} \"{section}/icons/{path}\" existiert nicht! Überprüfe \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} ist veraltet, benutze {newfile}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" -msgstr "" -"{path} existiert schon, importierte Ergebnisse werden nicht berücksichtigt!" +msgstr "{path} existiert schon, importierte Ergebnisse werden nicht berücksichtigt!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -3119,9 +2942,7 @@ msgstr "{path} existiert nicht! Erstellen Sie es durch Ausführen von:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "" -"{path} hat die schlechte Dateisignatur \"{pattern}\", möglicher Janus-" -"Exploit!" +msgstr "{path} hat die schlechte Dateisignatur \"{pattern}\", möglicher Janus-Exploit!" #: ../fdroidserver/update.py #, python-brace-format @@ -3131,8 +2952,7 @@ msgstr "{path} hat Dateigröße Null!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" -msgstr "" -"{path} ist größer als 200MB und muss manuell auf {url} hochgeladen werden" +msgstr "{path} ist größer als 200MB und muss manuell auf {url} hochgeladen werden" #: ../fdroidserver/update.py #, python-brace-format @@ -3144,7 +2964,7 @@ msgstr "{path}: {error}" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} endet nicht mit \"fdroid\", überprüfen Sie den URL-Pfad!" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} beginnt nicht mit \"http\"!" diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 43e71096..1bf257ec 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -16,7 +16,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Spanish \n" @@ -117,13 +117,13 @@ msgstr "\"{path}\" no es un formato reconocido, convertir a: {formats}" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\" está firmado por una clave no permitida:" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" no es una URL válida!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -136,7 +136,7 @@ msgid "%(prog)s [options] url" msgstr "%(prog)s [opciones] url" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: error: %(message)s\n" @@ -147,12 +147,12 @@ msgid "%d problems found" msgstr "%d problemas encontrados" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [opciones]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "no se puede llamar a %r" @@ -163,7 +163,7 @@ msgid "%s is not an accepted build field" msgstr "%s no es un campo de construcción aceptado" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "la opción %s no toma un valor" @@ -189,7 +189,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "¡'repo_keyalias' no encontrado en config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' es un argumento inválido para posicionales" @@ -245,7 +245,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "...falló la comprobación de actualizaciones para {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() no definida" @@ -286,7 +286,7 @@ msgstr "Agregando nuevo repo solamente para {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias de la clave de firma de repositorio en el depósitio de claves" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Permite especificar una revisión diferente (o git sector) para la importación inicial" @@ -482,7 +482,7 @@ msgstr "Comprobando la operación de archivo para {appid} - APKs:{integer}, vers msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Actualización limpia, no usa la caché, procesa todas las APKs" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Lista de categorías separadas por comas." @@ -509,11 +509,11 @@ msgstr "¡Conflicto de ficheros de configuración! Usando {newfile}, ignorando { msgid "Could not find '{command}' on your system" msgstr "No se pudo encontrar '{command}' en el sistema" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "No se pudo encontrar el último código de versión" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "No se pudo encontrar el último nombre de versión" @@ -533,7 +533,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "No se puede procesar el tamaño \"{size}\", tipo erróneo \"{type}\"" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "No se pudo encontrar el identificador de aplicación" @@ -650,7 +650,7 @@ msgstr "La descripción tiene una lista (%s) pero no está estructurada (*) ni n msgid "Description of length {length} is over the {limit} char limit" msgstr "La descripción de longitud {length} supera el límite de caracteres, {limit}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "No agregar 'disable:' a las entradas de compilaciones generadas" @@ -740,6 +740,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERROR: tipo de CI no soportado, ¡se aceptan parches!" +#: ../fdroidserver/nightly.py +#, fuzzy, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "ERROR: tipo de CI no soportado, ¡se aceptan parches!" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -771,9 +776,14 @@ msgid "Error while attempting to publish log: %s" msgstr "Error mientras se intentaba publicar el registro: %s" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Error al obtener la dirección del repositorio" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Extraer firmas de APKs" @@ -1258,6 +1268,11 @@ msgstr "Réplicas de repositorio mal formadas." msgid "Malformed serverwebroot line:" msgstr "Línea serverwebroot mal formada:" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Crea un espejo completo del repositorio y del archivo, todos los tipos de fichero." @@ -1271,6 +1286,10 @@ msgstr "Falta el directorio de salida" msgid "Name '%s' is just the auto name - remove it" msgstr "El nombre '%s' es simplemente el nombre automático - elimínelo" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "No se encontró 'config.yml', se usarán los valores predeterminados." @@ -1309,11 +1328,12 @@ msgstr "No hay huella digital en la URL." msgid "No git submodules available" msgstr "No hay git submodules disponibles" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "No se encontró ningún proyecto gradle. ¿Quizá quiera especificar --subdir?" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "No se encontró información." @@ -1437,7 +1457,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Los métodos de donación de OpenCollective pertenecen al OpenCollective: field" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "Opciones" @@ -1455,7 +1475,7 @@ msgstr "Sacar JSON a stdout." msgid "Outputting JSON" msgstr "Sacando JSON" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Licencia general del proyecto." @@ -1464,7 +1484,7 @@ msgstr "Licencia general del proyecto." msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Sobrescribir versionName vacío en {apkfilename} con el de los metadatos: {version}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "El paquete \"{appid}\" ya existe" @@ -1478,7 +1498,7 @@ msgstr "Procesando el manifiesto en '{path}'" msgid "Password required with username" msgstr "Se requiere contraseña con el nombre de usuario" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Ruta al subdirectorio principal del proyecto Android, si no está en la raíz." @@ -1501,6 +1521,11 @@ msgstr "Ruta al depósito de claves para la clave de firma de repositorio" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Mostrar la variable secreta en el terminal para copiar/pegar fácilmente" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1533,7 +1558,7 @@ msgstr "Para los ficheros de índice, produce un documento XML/JSON legible por msgid "Produce human-readable index.xml" msgstr "Produce un índice legible index.xml" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "importar desde.URL del proyecto." @@ -1670,6 +1695,11 @@ msgstr "Escaneando los APK(s) resultantes en busca de clases no libres conocidas msgid "Scan the source code of a package" msgstr "Escanear el código fuente de un paquete" +#: ../fdroidserver/scanner.py +#, fuzzy, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "El escáner encontró {count} problemas en {appid}:" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1691,6 +1721,11 @@ msgstr[1] "El escáner encontró {} problemas" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Escaneando el APK con apkanalyzer en busca de clases no libres conocidas." +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "Escaneando el APK con apkanalyzer en busca de clases no libres conocidas." + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1868,7 +1903,7 @@ msgstr "Estas son aplicaciones del repositorio principal que se han archivado." msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Este es un repositorio de aplicaciones para usar con F-Droid. Las aplicaciones en este repositorio son binarios oficiales construidos por los desarrolladores originales de la aplicación, o son binarios creados a partir de su código fuente por f-droid.org utilizando las herramientas de https://gitlab.com/fdroid." -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Este repo ya tiene metadatos locales: %s" @@ -2109,12 +2144,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "Subiendo {apkfilename} a virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "Uso" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Uso: %s\n" @@ -2226,13 +2261,13 @@ msgid "adding to {name}: {path}" msgstr "añadiendo a {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opción ambigua: %(option)s podría corresponderse con %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "opción ambigua: %s (%s?)" @@ -2271,8 +2306,12 @@ msgstr "applicationId para buscar actualizaciones" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId con código de versión opcional en la forma APPID [: VERCODE]" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argumento \"-\" con modo %r" @@ -2289,6 +2328,11 @@ msgstr "intentando conexión SSH en claro para probar la clave de despliegue:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "no se puede procesar (no es una cadena) la especificación scrlib: '{}'" +#: /usr/lib/python3.9/argparse.py +#, fuzzy, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "no se puede abrir '%s': %s" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2301,12 +2345,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "no se encuentran las srclibs requeridas: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "no se puede tener varios argumentos de subparser" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "no se pueden fundir acciones - 2 grupos se llaman %r" @@ -2329,12 +2373,12 @@ msgid "commands from plugin modules:" msgstr "órdenes de módulos de extensión (plugins):" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "complejo" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2385,7 +2429,7 @@ msgid "deployed process log {path} to {dest}" msgstr "registro de proceso {path} desplegado en '{dest}'" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "las opciones como %r requieren dest =" @@ -2395,7 +2439,7 @@ msgid "executable binary, possibly code" msgstr "binario ejecutable, posiblemente código" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2403,17 +2447,17 @@ msgstr[0] "argumento inesperado %s" msgstr[1] "argumentos inesperados %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "se esperaba al menos 1 argumento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "no se esperaba más de 1 argumento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "se esperaba 1 argumento" @@ -2431,7 +2475,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "punto flotante" @@ -2452,7 +2496,7 @@ msgid "gzip file archive" msgstr "archivo de ficheros gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "argumento explícito %r ignorado" @@ -2461,31 +2505,36 @@ msgstr "argumento explícito %r ignorado" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "¡index-v1 tiene que tener una firma, use `fdroid signindex` para crearla!" +#: ../fdroidserver/index.py +#, fuzzy +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "¡index-v1 tiene que tener una firma, use `fdroid signindex` para crearla!" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "entero" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valor inválido de tipo %(type)s: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "opción no válida: %(value)r (escoja de entre %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valor para conflict_resolution no válido: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "cadena de opciones %(option)r no válida: tiene que comenzar por un carácter %(prefix_chars)r" @@ -2514,7 +2563,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "¡el espejo '%s' no termina en 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "los argumentos mutuamente exclusivos tienen que ser opcionales" @@ -2528,7 +2577,7 @@ msgid "no APK supplied" msgstr "no se ha indicado APK" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "no hay tal opción: %s" @@ -2542,13 +2591,13 @@ msgid "no version information found" msgstr "no se encontró información de la versión" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "no permitido con el argumento %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "se necesita 1 de los argumentos %s" @@ -2563,55 +2612,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "opción %s: Si de verdad quiere instalar todas las apps firmadas use --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "opción %s: valor de %s no válido: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "opción %s: selección no válida: %r (elija de entre %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "opción -%s no reconocida" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "opción -%s requiere un argumento" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "opción --%s no puede llevar argumento" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "opción --%s no es un prefijo único" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "opción --%s no reconocida" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "opción --%s requiere un argumento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "argumentos opcionales" @@ -2621,7 +2670,7 @@ msgid "overwriting existing {path}" msgstr "sobrescribiendo {path} existente" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "argumentos posicionales" @@ -2650,6 +2699,10 @@ msgstr "repo_icon \"repo/icons/%s\" no existe, generando placeholder." msgid "repo_icon %s does not exist, generating placeholder." msgstr "No existe repo_icon %s. Reservando espacio." +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml no instalado. No se pueden escribir metadatos." @@ -2669,13 +2722,14 @@ msgid "shared library" msgstr "biblioteca compartida" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "mostrar el número de versión del programa y salir" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "mostrar este mensaje de ayuda y salir" @@ -2710,25 +2764,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "valor proporcionado de timestamp '{timestamp}' no está en formato unix" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "se requieren los siguientes argumentos: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "cadena de opción inesperada: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "parser '%(parser_name)r' desconocido. (Opciones válidas: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "argumentos no reconocidos: %s" @@ -2740,6 +2794,7 @@ msgstr "permisos inseguros en '{config_file}' (¡debería ser 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "uso: " @@ -2868,7 +2923,7 @@ msgstr "¡{name} \"{section}/icons/{path}\" no existe! Corrijalo en config.yml." msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} está obsoleto, use {newfile}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "¡{path} ya existe, ignorando resultados de importaciones!" @@ -2903,7 +2958,7 @@ msgstr "{path}: {error}" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "¡{url} no termina en \"fdroid\", verifique la URL!" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "¡{url} no empieza por \"http\"!" diff --git a/locale/fdroidserver.pot b/locale/fdroidserver.pot index dc716b1a..f84b40d3 100644 --- a/locale/fdroidserver.pot +++ b/locale/fdroidserver.pot @@ -5,9 +5,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: fdroidserver 2.1b0\n" +"Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -95,13 +95,13 @@ msgstr "" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -114,7 +114,7 @@ msgid "%(prog)s [options] url" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "" @@ -125,12 +125,12 @@ msgid "%d problems found" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "" @@ -141,7 +141,7 @@ msgid "%s is not an accepted build field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "" @@ -167,7 +167,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -223,7 +223,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr "" @@ -264,7 +264,7 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -460,7 +460,7 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -487,11 +487,11 @@ msgstr "" msgid "Could not find '{command}' on your system" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -511,7 +511,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -628,7 +628,7 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -716,6 +716,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" +#: ../fdroidserver/nightly.py +#, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -745,9 +750,14 @@ msgid "Error while attempting to publish log: %s" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "" @@ -1231,6 +1241,11 @@ msgstr "" msgid "Malformed serverwebroot line:" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" @@ -1244,6 +1259,10 @@ msgstr "" msgid "Name '%s' is just the auto name - remove it" msgstr "" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "" @@ -1282,11 +1301,12 @@ msgstr "" msgid "No git submodules available" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "" @@ -1410,7 +1430,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "" @@ -1428,7 +1448,7 @@ msgstr "" msgid "Outputting JSON" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "" @@ -1437,7 +1457,7 @@ msgstr "" msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "" @@ -1451,7 +1471,7 @@ msgstr "" msgid "Password required with username" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "" @@ -1474,6 +1494,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1506,7 +1531,7 @@ msgstr "" msgid "Produce human-readable index.xml" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "" @@ -1643,6 +1668,11 @@ msgstr "" msgid "Scan the source code of a package" msgstr "" +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1663,6 +1693,10 @@ msgstr[1] "" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1840,7 +1874,7 @@ msgstr "" msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "" @@ -2074,12 +2108,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "" @@ -2191,13 +2225,13 @@ msgid "adding to {name}: {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "" @@ -2236,8 +2270,12 @@ msgstr "" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "" @@ -2254,6 +2292,11 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" +#: /usr/lib/python3.9/argparse.py +#, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2266,12 +2309,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "" @@ -2294,12 +2337,12 @@ msgid "commands from plugin modules:" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2350,7 +2393,7 @@ msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "" @@ -2360,7 +2403,7 @@ msgid "executable binary, possibly code" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2368,17 +2411,17 @@ msgstr[0] "" msgstr[1] "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "" @@ -2396,7 +2439,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "" @@ -2417,7 +2460,7 @@ msgid "gzip file archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "" @@ -2426,31 +2469,35 @@ msgstr "" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "" +#: ../fdroidserver/index.py +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" @@ -2479,7 +2526,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2493,7 +2540,7 @@ msgid "no APK supplied" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "" @@ -2507,13 +2554,13 @@ msgid "no version information found" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "" @@ -2528,55 +2575,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "" @@ -2586,7 +2633,7 @@ msgid "overwriting existing {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "" @@ -2615,6 +2662,10 @@ msgstr "" msgid "repo_icon %s does not exist, generating placeholder." msgstr "" +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2634,13 +2685,14 @@ msgid "shared library" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "" @@ -2675,25 +2727,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "" @@ -2705,6 +2757,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "" @@ -2833,7 +2886,7 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "" @@ -2868,7 +2921,7 @@ msgstr "" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "" diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index 5d356a14..ef109eee 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2021-08-23 01:29+0000\n" "Last-Translator: Kaantaja \n" "Language-Team: Finnish \n" @@ -95,13 +95,13 @@ msgstr "" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -114,7 +114,7 @@ msgid "%(prog)s [options] url" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "" @@ -125,12 +125,12 @@ msgid "%d problems found" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "" @@ -141,7 +141,7 @@ msgid "%s is not an accepted build field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "" @@ -167,7 +167,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -223,7 +223,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr "" @@ -264,7 +264,7 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -460,7 +460,7 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -487,11 +487,11 @@ msgstr "" msgid "Could not find '{command}' on your system" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -511,7 +511,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -628,7 +628,7 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -716,6 +716,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" +#: ../fdroidserver/nightly.py +#, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -745,9 +750,14 @@ msgid "Error while attempting to publish log: %s" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "" @@ -1231,6 +1241,11 @@ msgstr "" msgid "Malformed serverwebroot line:" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" @@ -1244,6 +1259,10 @@ msgstr "" msgid "Name '%s' is just the auto name - remove it" msgstr "" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "" @@ -1282,11 +1301,12 @@ msgstr "" msgid "No git submodules available" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "" @@ -1410,7 +1430,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "" @@ -1428,7 +1448,7 @@ msgstr "" msgid "Outputting JSON" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "" @@ -1437,7 +1457,7 @@ msgstr "" msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "" @@ -1451,7 +1471,7 @@ msgstr "" msgid "Password required with username" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "" @@ -1474,6 +1494,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1506,7 +1531,7 @@ msgstr "" msgid "Produce human-readable index.xml" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "" @@ -1643,6 +1668,11 @@ msgstr "" msgid "Scan the source code of a package" msgstr "" +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1663,6 +1693,10 @@ msgstr[1] "" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1840,7 +1874,7 @@ msgstr "" msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "" @@ -2074,12 +2108,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "" @@ -2191,13 +2225,13 @@ msgid "adding to {name}: {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "" @@ -2236,8 +2270,12 @@ msgstr "" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "" @@ -2254,6 +2292,11 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" +#: /usr/lib/python3.9/argparse.py +#, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2266,12 +2309,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "" @@ -2294,12 +2337,12 @@ msgid "commands from plugin modules:" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "monimutkainen" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2350,7 +2393,7 @@ msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "" @@ -2360,7 +2403,7 @@ msgid "executable binary, possibly code" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2368,17 +2411,17 @@ msgstr[0] "" msgstr[1] "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "" @@ -2396,7 +2439,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "" @@ -2417,7 +2460,7 @@ msgid "gzip file archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "" @@ -2426,31 +2469,35 @@ msgstr "" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "" +#: ../fdroidserver/index.py +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" @@ -2479,7 +2526,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2493,7 +2540,7 @@ msgid "no APK supplied" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "" @@ -2507,13 +2554,13 @@ msgid "no version information found" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "" @@ -2528,55 +2575,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "" @@ -2586,7 +2633,7 @@ msgid "overwriting existing {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "" @@ -2615,6 +2662,10 @@ msgstr "" msgid "repo_icon %s does not exist, generating placeholder." msgstr "" +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2634,13 +2685,14 @@ msgid "shared library" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "" @@ -2675,25 +2727,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "" @@ -2705,6 +2757,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "" @@ -2833,7 +2886,7 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "" @@ -2868,7 +2921,7 @@ msgstr "" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "" diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index bcce4b6a..1480e36a 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -36,7 +36,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2022-06-26 18:15+0000\n" "Last-Translator: Ldm Public \n" "Language-Team: French \n" @@ -137,13 +137,13 @@ msgstr "\"{path}\" n'est pas un format accepté, convertir en : {formats}" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\" est signé avec une clé non autorisée :" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" n'est pas une URL valide !" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -156,7 +156,7 @@ msgid "%(prog)s [options] url" msgstr "%(prog)s [options] url" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s : erreur : %(message)s\n" @@ -167,12 +167,12 @@ msgid "%d problems found" msgstr "%d problèmes trouvés" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [options]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "%r n’est pas appelable" @@ -183,7 +183,7 @@ msgid "%s is not an accepted build field" msgstr "%s n'est pas un champ de construction acceptable" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "l'option %s ne prend pas de valeur" @@ -209,7 +209,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' non trouvé dans config.yml !" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' est invalide comme argument positionnel" @@ -265,7 +265,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate a échoué pour {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() n'est pas défini" @@ -306,7 +306,7 @@ msgstr "Ajout d'un nouveau dépôt pour seulement {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias de la clé de signature du dépôt dans le trousseau" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Autoriser une version différente (ou branche git) a être spécifiée pour l'import initial" @@ -502,7 +502,7 @@ msgstr "Vérification de l'archivage pour {appid} - APKs : {integer}, keepversio msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Mise à jour propre - n'utilise pas les caches, traite à nouveau tous les APKs" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Liste de catégories séparées par des virgules." @@ -529,11 +529,11 @@ msgstr "Conflit de fichiers de configuration ! Utilisation de {newfile}, ignoran msgid "Could not find '{command}' on your system" msgstr "Impossible de trouver '{command}' sur votre système" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Impossible de trouver la dernière version du code" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Impossible de trouver le nom de la dernière version" @@ -553,7 +553,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Impossible de récupérer la taille \"{size}\", mauvais type \"{type}\"" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Impossible de trouver l'ID de l'application" @@ -670,7 +670,7 @@ msgstr "La description contient une liste (%s) mais ce n'est ni une liste à puc msgid "Description of length {length} is over the {limit} char limit" msgstr "La longueur de la description {length} dépasser la limite du nombre de caractères autorisés {limit}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Ne pas ajouter \"disable:\" aux entrées générées" @@ -760,6 +760,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERREUR : type de CI non supporté, les corrections sont bienvenues !" +#: ../fdroidserver/nightly.py +#, fuzzy, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "ERREUR : type de CI non supporté, les corrections sont bienvenues !" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -791,9 +796,14 @@ msgid "Error while attempting to publish log: %s" msgstr "Erreur lors de la publication du journal : %s" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Erreur lors de l'obtention de l'adresse du dépôt" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Extraction des signatures à partir des APKs" @@ -1277,6 +1287,11 @@ msgstr "Mirroirs de dépot malformée." msgid "Malformed serverwebroot line:" msgstr "serverwebroot malformer en ligne :" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Cloner entièrement le repo et les archives, tous les fichiers." @@ -1290,6 +1305,10 @@ msgstr "Répertoire de destination manquant" msgid "Name '%s' is just the auto name - remove it" msgstr "Le nom '%s' est just un nom générer - retirer le" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "Aucun 'config.yml' trouvée, utilisation des originales." @@ -1328,11 +1347,12 @@ msgstr "Aucune empreinte dans l'URL." msgid "No git submodules available" msgstr "Aucun sous-module git disponible" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Aucun projet gradle n'a pu être trouvé. Spécifier --subdir ?" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Aucune information trouvée." @@ -1456,7 +1476,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Les méthodes de donation OpenCollective vont dans le champ OpenCollective:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "Options" @@ -1474,7 +1494,7 @@ msgstr "Sortie JSON vers stdout." msgid "Outputting JSON" msgstr "Sortie vers JSON" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Licence globale du projet." @@ -1483,7 +1503,7 @@ msgstr "Licence globale du projet." msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Substitution du nom de version vide dans {apkfilename} des métadonnées : {version}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "Le paquet \"{appid}\" existe déjà" @@ -1497,7 +1517,7 @@ msgstr "Analyse du fichier manifeste sur « {path} »" msgid "Password required with username" msgstr "Mot de passe requis avec le nom d'utilisateur" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Chemin d'accès au sous-répertoire principal du projet Android, si ce n'est pas dans le répertoire racine." @@ -1520,6 +1540,11 @@ msgstr "Chemin vers le keystore pour la clé de signature du dépôt" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Afficher la variable secrète dans le terminal pour un copier/coller facilité" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1552,7 +1577,7 @@ msgstr "Produire des fichiers d'index XML ou JSON lisibles par un humain" msgid "Produce human-readable index.xml" msgstr "Produire un fichier index.xml lisible par un humain" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "URL du projet à importer" @@ -1689,6 +1714,11 @@ msgstr "Scanne le(s) APK(s) résultants pour des classes non-libres connues." msgid "Scan the source code of a package" msgstr "Scanner le code source d'un paquet" +#: ../fdroidserver/scanner.py +#, fuzzy, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "Le scan a détecté {count} problèmes dans {appid} :" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1709,6 +1739,11 @@ msgstr[1] "Le scanneur a trouvé {} problèmes" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Analyse de l’APK avec apkanalyzer pour les classes non libres connues." +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "Analyse de l’APK avec apkanalyzer pour les classes non libres connues." + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1886,7 +1921,7 @@ msgstr "Voici les applications qui ont été archivées à partir du dépôt pri msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Ceci est un dépôt d’applications à utiliser avec FDroid. Les applications publiées dans ce dépôt sont soit les binaires officiels compilés par les développeurs de ces applications, soit celles compilées par f-droid.org à partir des sources en utilisant les outils disponibles sur https://gitlab.com/fdroid." -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Ce dépôt a déjà des méta-données locales : %s" @@ -2129,12 +2164,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "Téléversement de {apkfilename} vers virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "Usage" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Usage : %s\n" @@ -2246,13 +2281,13 @@ msgid "adding to {name}: {path}" msgstr "ajoute à {name} : {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "option ambiguë : %(option)s peut correspondre à %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "option ambiguë : %s (%s?)" @@ -2291,8 +2326,12 @@ msgstr "applicationId pour vérifier les mises à jour" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId avec le versionCode optionnel sous la forme APPID[:VERCODE]" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argument \"-\" avec le mode %r" @@ -2309,6 +2348,11 @@ msgstr "tentative de connexion ssh simple pour tester la clé de déploiement :" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "Impossible de parcourir la spécification de srclib (pas une chaîne de caractères) : '{}'" +#: /usr/lib/python3.9/argparse.py +#, fuzzy, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "Impossible d'ouvrir %s : %s" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2321,12 +2365,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "Impossible de trouver srclibs : \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "Impossible d'avoir plusieurs arguments du sous-parseur" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "impossible de fusionner les actions - deux groupes sont nommés %r" @@ -2349,12 +2393,12 @@ msgid "commands from plugin modules:" msgstr "commandes des modules d'extension :" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "complexe" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2405,7 +2449,7 @@ msgid "deployed process log {path} to {dest}" msgstr "log du processus {path} déployé vers {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= est obligatoire pour les options comme %r" @@ -2415,7 +2459,7 @@ msgid "executable binary, possibly code" msgstr "binaire exécutable, possiblement du code" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2423,17 +2467,17 @@ msgstr[0] "argument %s requis" msgstr[1] "arguments %s requis" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "au moins un argument est attendu" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "un seul argument au plus est attendu" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "un seul argument est attendu" @@ -2451,7 +2495,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "virgule flottante" @@ -2472,7 +2516,7 @@ msgid "gzip file archive" msgstr "archive GZIP" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "argument explicite %r ignoré" @@ -2481,31 +2525,36 @@ msgstr "argument explicite %r ignoré" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 doit avoir une signature, utilisez `fdroid signindex` pour la créer !" +#: ../fdroidserver/index.py +#, fuzzy +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "index-v1 doit avoir une signature, utilisez `fdroid signindex` pour la créer !" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "entier" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valeur %(type)s non valide : %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "choix non valide : %(value)r (choisissez parmi %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valeur de conflict_resolution invalide : %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "chaîne d’option non valide %(option)r : doit commencer par un caractère %(prefix_chars)r" @@ -2534,7 +2583,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "le miroir «%s» ne se termine pas par «fdroid» !" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "les arguments qui s'excluent mutuellement doivent être optionnels" @@ -2548,7 +2597,7 @@ msgid "no APK supplied" msgstr "aucun APK n’est fourni" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "option inexistante : %s" @@ -2562,13 +2611,13 @@ msgid "no version information found" msgstr "aucune information sur la version n’a été trouvée" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "non permis avec les arguments %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "un des arguments %s est requis" @@ -2583,55 +2632,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "option %s : Si vous voulez vraiment installer toutes les applications signées, utilisez --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "option %s : valeur %s non valide : %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "option %s : choix non valide : %r (choisissez depuis %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "L'option -%s n'est pas reconnue" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "l'option -%s requiert un argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "L'option %s ne doit pas avoir d'argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "option --%s n'est pas un préfixe unique" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "option --%s non reconnue" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "L'option %s requiert un argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "arguments optionnels" @@ -2641,7 +2690,7 @@ msgid "overwriting existing {path}" msgstr "en train d'écraser l'existant {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "arguments de position" @@ -2670,6 +2719,10 @@ msgstr "repo_icon \"repo/icons/%s\" n'existe pas, génération d'une icône de s msgid "repo_icon %s does not exist, generating placeholder." msgstr "Le repo_icon %s n'existe pas, génération d'une icône de remplacement." +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml n’est pas installé, impossible d’écrire les métadonnées." @@ -2689,13 +2742,14 @@ msgid "shared library" msgstr "bibliothèque partagée" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "afficher le numéro de version du programme et quitter" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "afficher ce message d'aide et quitter" @@ -2730,25 +2784,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "valeur d'horodatage donnée '{timestamp}' n'est pas un horodatage au format Unix" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "les arguments suivants sont requis %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "chaîne d'option inattendue : %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "parser inconnu %(parser_name)r (choix : %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "arguments non reconnu : %s" @@ -2760,6 +2814,7 @@ msgstr "permissions dangereuses sur '{config_file}' (doit être 0600) !" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "usage : " @@ -2888,7 +2943,7 @@ msgstr "{name} \"{section}/icons/{path}\" n'existe pas ! Vérifiez \"config.yml\ msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} est obsolète, utilisez {newfile}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} existe déjà, ignorance des résultats de l'importation !" @@ -2923,7 +2978,7 @@ msgstr "{path} : {error}" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} ne fini pas par \"fdroid\", vérifiez l'URL !" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} ne commence pas par \"http\" !" diff --git a/locale/fy/LC_MESSAGES/fdroidserver.po b/locale/fy/LC_MESSAGES/fdroidserver.po index ca30e75f..4c559e73 100644 --- a/locale/fy/LC_MESSAGES/fdroidserver.po +++ b/locale/fy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2021-07-01 15:29+0000\n" "Last-Translator: Vancha March \n" "Language-Team: Frisian \n" @@ -94,13 +94,13 @@ msgstr "" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -113,7 +113,7 @@ msgid "%(prog)s [options] url" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: flater: %(message)s\n" @@ -124,12 +124,12 @@ msgid "%d problems found" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [options]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "%r is net opropber" @@ -140,7 +140,7 @@ msgid "%s is not an accepted build field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "" @@ -166,7 +166,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -222,7 +222,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() net definiearre" @@ -263,7 +263,7 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -459,7 +459,7 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -486,11 +486,11 @@ msgstr "" msgid "Could not find '{command}' on your system" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -510,7 +510,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -627,7 +627,7 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -715,6 +715,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" +#: ../fdroidserver/nightly.py +#, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -744,9 +749,14 @@ msgid "Error while attempting to publish log: %s" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "" @@ -1230,6 +1240,11 @@ msgstr "" msgid "Malformed serverwebroot line:" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" @@ -1243,6 +1258,10 @@ msgstr "" msgid "Name '%s' is just the auto name - remove it" msgstr "" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "" @@ -1281,11 +1300,12 @@ msgstr "" msgid "No git submodules available" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "" @@ -1409,7 +1429,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "Opsjes" @@ -1427,7 +1447,7 @@ msgstr "" msgid "Outputting JSON" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "" @@ -1436,7 +1456,7 @@ msgstr "" msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "" @@ -1450,7 +1470,7 @@ msgstr "" msgid "Password required with username" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "" @@ -1473,6 +1493,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1505,7 +1530,7 @@ msgstr "" msgid "Produce human-readable index.xml" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "" @@ -1642,6 +1667,11 @@ msgstr "" msgid "Scan the source code of a package" msgstr "" +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1662,6 +1692,10 @@ msgstr[1] "" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1839,7 +1873,7 @@ msgstr "" msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "" @@ -2073,12 +2107,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "Gebrûk" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Gebrûk: %s\n" @@ -2190,13 +2224,13 @@ msgid "adding to {name}: {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "" @@ -2235,8 +2269,12 @@ msgstr "" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "" @@ -2253,6 +2291,11 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" +#: /usr/lib/python3.9/argparse.py +#, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2265,12 +2308,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "" @@ -2293,12 +2336,12 @@ msgid "commands from plugin modules:" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2349,7 +2392,7 @@ msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "" @@ -2359,7 +2402,7 @@ msgid "executable binary, possibly code" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2367,17 +2410,17 @@ msgstr[0] "" msgstr[1] "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "" @@ -2395,7 +2438,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "" @@ -2416,7 +2459,7 @@ msgid "gzip file archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "" @@ -2425,31 +2468,35 @@ msgstr "" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "" +#: ../fdroidserver/index.py +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" @@ -2478,7 +2525,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2492,7 +2539,7 @@ msgid "no APK supplied" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "" @@ -2506,13 +2553,13 @@ msgid "no version information found" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "" @@ -2527,55 +2574,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "opsje -%s wurd net werkend" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "opsje -%s hat in argumint nedich" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "opsje --%s wurd net werkend" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "opsjonele arguminten" @@ -2585,7 +2632,7 @@ msgid "overwriting existing {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "" @@ -2614,6 +2661,10 @@ msgstr "" msgid "repo_icon %s does not exist, generating placeholder." msgstr "" +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2633,13 +2684,14 @@ msgid "shared library" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "lit it ferzje nûmer fan de applikaasje sjen en slút ôf" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "dit help berjocht sjen litte en ôfslute" @@ -2674,25 +2726,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "" @@ -2704,6 +2756,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "gebrûk: " @@ -2832,7 +2885,7 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "" @@ -2867,7 +2920,7 @@ msgstr "" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "" diff --git a/locale/hi/LC_MESSAGES/fdroidserver.po b/locale/hi/LC_MESSAGES/fdroidserver.po index 759d5327..4175f70a 100644 --- a/locale/hi/LC_MESSAGES/fdroidserver.po +++ b/locale/hi/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2021-01-24 08:48+0000\n" "Last-Translator: Isrg Rajan \n" "Language-Team: Hindi \n" @@ -94,13 +94,13 @@ msgstr "" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -113,7 +113,7 @@ msgid "%(prog)s [options] url" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "" @@ -124,12 +124,12 @@ msgid "%d problems found" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "%r कॉल करने योग्य नहीं है" @@ -140,7 +140,7 @@ msgid "%s is not an accepted build field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "" @@ -166,7 +166,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -222,7 +222,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() परिभाषित नहीं" @@ -263,7 +263,7 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -459,7 +459,7 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -486,11 +486,11 @@ msgstr "" msgid "Could not find '{command}' on your system" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -510,7 +510,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -627,7 +627,7 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -715,6 +715,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" +#: ../fdroidserver/nightly.py +#, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -744,9 +749,14 @@ msgid "Error while attempting to publish log: %s" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "" @@ -1230,6 +1240,11 @@ msgstr "" msgid "Malformed serverwebroot line:" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" @@ -1243,6 +1258,10 @@ msgstr "" msgid "Name '%s' is just the auto name - remove it" msgstr "" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "" @@ -1281,11 +1300,12 @@ msgstr "" msgid "No git submodules available" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "" @@ -1409,7 +1429,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "विकल्प" @@ -1427,7 +1447,7 @@ msgstr "" msgid "Outputting JSON" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "" @@ -1436,7 +1456,7 @@ msgstr "" msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "" @@ -1450,7 +1470,7 @@ msgstr "" msgid "Password required with username" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "" @@ -1473,6 +1493,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1505,7 +1530,7 @@ msgstr "" msgid "Produce human-readable index.xml" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "" @@ -1642,6 +1667,11 @@ msgstr "" msgid "Scan the source code of a package" msgstr "" +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1662,6 +1692,10 @@ msgstr[1] "" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1839,7 +1873,7 @@ msgstr "" msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "" @@ -2073,12 +2107,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "प्रयोग" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "प्रयोग: %s\n" @@ -2190,13 +2224,13 @@ msgid "adding to {name}: {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "" @@ -2235,8 +2269,12 @@ msgstr "" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "" @@ -2253,6 +2291,11 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" +#: /usr/lib/python3.9/argparse.py +#, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2265,12 +2308,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "" @@ -2293,12 +2336,12 @@ msgid "commands from plugin modules:" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2349,7 +2392,7 @@ msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "" @@ -2359,7 +2402,7 @@ msgid "executable binary, possibly code" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2367,17 +2410,17 @@ msgstr[0] "" msgstr[1] "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "" @@ -2395,7 +2438,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "" @@ -2416,7 +2459,7 @@ msgid "gzip file archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "" @@ -2425,31 +2468,35 @@ msgstr "" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "" +#: ../fdroidserver/index.py +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" @@ -2478,7 +2525,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2492,7 +2539,7 @@ msgid "no APK supplied" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "" @@ -2506,13 +2553,13 @@ msgid "no version information found" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "" @@ -2527,55 +2574,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "विकल्प -%s मान्यता प्राप्त नहीं" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "वैकल्पिक तर्क" @@ -2585,7 +2632,7 @@ msgid "overwriting existing {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "" @@ -2614,6 +2661,10 @@ msgstr "" msgid "repo_icon %s does not exist, generating placeholder." msgstr "" +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2633,13 +2684,14 @@ msgid "shared library" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "यह मदद संदेश दिखाएं और बाहर निकलें" @@ -2674,25 +2726,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "" @@ -2704,6 +2756,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "प्रयोग: " @@ -2832,7 +2885,7 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "" @@ -2867,7 +2920,7 @@ msgstr "" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "" diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index 83cd8568..399ae74b 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Hungarian \n" @@ -107,13 +107,13 @@ msgstr "A(z) „{path}” nem egy elfogadott formátum, alakítsa át erre: {for msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "A(z) „{url}” nem érvényes URL!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -126,7 +126,7 @@ msgid "%(prog)s [options] url" msgstr "%(prog)s [kapcsolók] url" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: hiba: %(message)s\n" @@ -137,12 +137,12 @@ msgid "%d problems found" msgstr "%d probléma található" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [kapcsolók]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "A(z) %r nem hívható" @@ -153,7 +153,7 @@ msgid "%s is not an accepted build field" msgstr "A(z) %s nem elfogadott összeállítási mező" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "A(z) %s kapcsoló nem fogad értéket" @@ -179,7 +179,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "A „repo_keyalias” nem található a config.yml fájlban." #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "A „required” argumentum érvénytelen argumentum pozicionális paraméterek esetén" @@ -235,7 +235,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "…checkupdate sikertelen ennél: {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() nincs definiálva" @@ -276,7 +276,7 @@ msgstr "Új tároló hozzáadása csak a következő miatt: {name}" msgid "Alias of the repo signing key in the keystore" msgstr "A tároló aláírókulcsának álneve a kulcstárolóban" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Lehetővé teszi, hogy különböző verziót (vagy git ágat) adjon meg a kezdeti importáláshoz" @@ -472,7 +472,7 @@ msgstr "Archiválás ellenőrzése ennél: {appid} – apks:{integer}, keepversi msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Tiszta frissítés – nem használ gyorsítótárat, minden APK-k újra feldolgoz" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Kategóriák vesszőkkel elválasztott listája." @@ -499,11 +499,11 @@ msgstr "Ütköző konfigurációs fájlok! {newfile} használata, {oldfile} mell msgid "Could not find '{command}' on your system" msgstr "A(z) „{command}” nem található a rendszeren" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "A legfrissebb verzió kódja nem található" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "A legfrissebb verzió neve nem található" @@ -523,7 +523,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "A(z) „{size}” méret nem dolgozható fel, hibás „{type}” típus" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Az alkalmazásazonosító nem található" @@ -641,7 +641,7 @@ msgstr "A leírás listát (%s) tartalmaz, de nem pontozott (*) vagy számozott msgid "Description of length {length} is over the {limit} char limit" msgstr "A leírás {length} karakteres hossza több, mint a {limit} karakteres korlát" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Ne adja a hozzá a „disable:” szöveget az előállított összeállítási elemekhez" @@ -731,6 +731,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "HIBA: nem támogatott CI típus, foltokat szívesen fogadunk!" +#: ../fdroidserver/nightly.py +#, fuzzy, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "HIBA: nem támogatott CI típus, foltokat szívesen fogadunk!" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -762,9 +767,14 @@ msgid "Error while attempting to publish log: %s" msgstr "Hiba történt a napló közzétételekor: %s" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Hiba történt a tároló címének lekérésekor" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Aláírások kinyerése az APK-kból" @@ -1251,6 +1261,11 @@ msgstr "Rosszul formázott tárolótükrök." msgid "Malformed serverwebroot line:" msgstr "Rosszul formázott serverwebroot sor:" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "A teljes tároló és archívum tükrözés, minden fájltípussal." @@ -1264,6 +1279,10 @@ msgstr "Hiányzó kimeneti könyvtár" msgid "Name '%s' is just the auto name - remove it" msgstr "A(z) „%s” név csak az automatikus név – eltávolítás" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "Nem található „config.yml”, alapértelmezések használata." @@ -1302,11 +1321,12 @@ msgstr "Nincs ujjlenyomat az URL-ben." msgid "No git submodules available" msgstr "Nem érhetők el git almodulok" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Nem található gradle projekt. Megad --subdir argumentumot?" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Nem található információ." @@ -1431,7 +1451,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Az OpenCollective adományozási módok a OpenCollective: mezőbe tartoznak" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "Beállítások" @@ -1449,7 +1469,7 @@ msgstr "A JSON kiírása a szabványos kimenetre." msgid "Outputting JSON" msgstr "JSON kiírása" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Az egész projekt átfogó licence." @@ -1458,7 +1478,7 @@ msgstr "Az egész projekt átfogó licence." msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Az üres versionName felülírása a(z) {apkfilename} fájlban a metaadatokból: {version}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "A(z) „{appid}” csomag már létezik" @@ -1472,7 +1492,7 @@ msgstr "A(z) „{path}” helyen lévő leírófájl feldolgozása" msgid "Password required with username" msgstr "Jelszó szükséges a felhasználónévvel" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "A fő androidos projekt alkönyvtár elérési útja, ha nem a gyökér." @@ -1495,6 +1515,11 @@ msgstr "A tároló aláírókulcsához használt kulcstároló elérési útja" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "A titkos változó kiírása a terminálba a könnyű másolás és beillesztés érdekében" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1527,7 +1552,7 @@ msgstr "Ember számára olvasható XML/JSON fájlok készítése indexfájlként msgid "Produce human-readable index.xml" msgstr "Ember számára olvasható index.xml előállítása" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "Importálási forrásként használandó projekt URL." @@ -1664,6 +1689,11 @@ msgstr "Az elkészült APK-k átvizsgálása ismert nem szabad osztályokat kere msgid "Scan the source code of a package" msgstr "A csomag forráskódjának átvizsgálása" +#: ../fdroidserver/scanner.py +#, fuzzy, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "Az átvizsgáló {count} problémát talált a(z) „{appid}” alkalmazásban:" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1685,6 +1715,11 @@ msgstr[1] "Az átvizsgáló {count} problémát talált" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Az elkészült APK-k átvizsgálása ismert nem szabad osztályokat keresve." +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "Az elkészült APK-k átvizsgálása ismert nem szabad osztályokat keresve." + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1862,7 +1897,7 @@ msgstr "" msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "" @@ -2096,12 +2131,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "Használat" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Használat: %s\n" @@ -2213,13 +2248,13 @@ msgid "adding to {name}: {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "nem egyértelmű kapcsoló: %(option)s, ezekre illeszkedhet: %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "nem egyértelmű kapcsoló: %s (%s?)" @@ -2258,8 +2293,12 @@ msgstr "" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "" @@ -2276,6 +2315,11 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" +#: /usr/lib/python3.9/argparse.py +#, fuzzy, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "„%s” nem nyitható meg: %s" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2288,12 +2332,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "" @@ -2316,12 +2360,12 @@ msgid "commands from plugin modules:" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "komplex" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2372,7 +2416,7 @@ msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "" @@ -2382,7 +2426,7 @@ msgid "executable binary, possibly code" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2390,17 +2434,17 @@ msgstr[0] "" msgstr[1] "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "" @@ -2418,7 +2462,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "lebegőpontos" @@ -2439,7 +2483,7 @@ msgid "gzip file archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "a(z) %r. explicit argumentum mellőzése" @@ -2448,31 +2492,36 @@ msgstr "a(z) %r. explicit argumentum mellőzése" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "az index-v1-nek kell legyen aláírása, használja az „fdroid signindex” parancsot a létrehozásához." +#: ../fdroidserver/index.py +#, fuzzy +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "az index-v1-nek kell legyen aláírása, használja az „fdroid signindex” parancsot a létrehozásához." + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" @@ -2501,7 +2550,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2515,7 +2564,7 @@ msgid "no APK supplied" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "nincs ilyen kapcsoló: %s" @@ -2529,13 +2578,13 @@ msgid "no version information found" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "" @@ -2550,55 +2599,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "a(z) -%s kapcsoló nem ismert" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "a(z) -%s kapcsolóhoz argumentum szükséges" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "a(z) --%s kapcsolóhoz argumentum szükséges" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "a(z) --%s kapcsoló nem egyedi előtag" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "a(z) --%s kapcsoló nem ismert" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "a(z) --%s kapcsolóhoz argumentum szükséges" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "nem kötelező argumentumok" @@ -2608,7 +2657,7 @@ msgid "overwriting existing {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "pozicionális argumentumok" @@ -2637,6 +2686,10 @@ msgstr "" msgid "repo_icon %s does not exist, generating placeholder." msgstr "" +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2656,13 +2709,14 @@ msgid "shared library" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "a programverzió megjelenítése és kilépés" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "ezen üzenet kiírása és kilépés" @@ -2697,25 +2751,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "a következő argumentumok szükségesek: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "váratlan kapcsoló karakterlánc: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "nem felismert argumentumok: %s" @@ -2727,6 +2781,7 @@ msgstr "nem biztonságos jogosultságok ennél: „{config_file}” (0600-nak ke #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "használat: " @@ -2855,7 +2910,7 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "" @@ -2890,7 +2945,7 @@ msgstr "A(z) {path} másolása sikertelen: {error}" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "" diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index d427fdd2..1576fe64 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -16,7 +16,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2022-06-28 20:54+0000\n" "Last-Translator: Antonello Pirina \n" "Language-Team: Italian \n" @@ -117,13 +117,13 @@ msgstr "\"{path}\" non è un formato accettato, convertire a: {formats}" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\" è firmato da una chiave non autorizzata:" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" non è un URL valido!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -136,7 +136,7 @@ msgid "%(prog)s [options] url" msgstr "%(prog)s [options] url" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: errore: %(message)s\n" @@ -147,12 +147,12 @@ msgid "%d problems found" msgstr "trovati %d problemi" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [opzioni]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "%r non è richiamabile" @@ -163,7 +163,7 @@ msgid "%s is not an accepted build field" msgstr "%s non è un campo di build accettato" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "l'opzione %s non accetta un valore" @@ -189,7 +189,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "\"repo_keyalias\" non trovato in config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "\"required\" è un argomento invalido per i posizionali" @@ -245,7 +245,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate fallito per {appid}:{error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() non definita" @@ -286,7 +286,7 @@ msgstr "Aggiungendo un repository solo per {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias della chiave di firma del repository nel keystore" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Permetti di specificare una revisione (o branch git) diversa per l'importazione iniziale" @@ -482,7 +482,7 @@ msgstr "Controllo dell'archiviazione per {appid} - apks:{integer}, keepversions: msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Aggiornamento pulito - non usa cache, riprocessa tutti gli APK" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Lista di categorie separate da una virgola." @@ -509,11 +509,11 @@ msgstr "File di configurazione in conflitto! Utilizzando {newfile}, ignorando {o msgid "Could not find '{command}' on your system" msgstr "Impossibile trovare \"{command}\" sul tuo sistema" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Impossibile trovare il codice della versione più recente" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Impossibile trovare il nome della versione più recente" @@ -533,7 +533,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Impossibile analizzare la dimensione \"{size}\", tipo sbagliato \"{type}\"" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Impossibile trovare l'ID dell'applicazione" @@ -650,7 +650,7 @@ msgstr "La descrizione ha un elenco (%s) ma non è puntato (*) né numerato (#)" msgid "Description of length {length} is over the {limit} char limit" msgstr "La descrizione di lunghezza {length} supera il limite di {limit} caratteri" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Non aggiungere 'disable:' alle voci di compilazione generate" @@ -740,6 +740,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERRORE: tipo di CI non supportato, le patch sono benvenute!" +#: ../fdroidserver/nightly.py +#, fuzzy, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "ERRORE: tipo di CI non supportato, le patch sono benvenute!" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -771,9 +776,14 @@ msgid "Error while attempting to publish log: %s" msgstr "Errore tentando di pubblicare il log: %s" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Errore nell'ottenere l'indirizzo del repo" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Estrai le firme dagli APK" @@ -1257,6 +1267,11 @@ msgstr "Mirror del repository malformati." msgid "Malformed serverwebroot line:" msgstr "Riga del serverwebroot malformata:" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Rispecchiare il repository completo e l'archivio, tutti i tipi di file." @@ -1270,6 +1285,10 @@ msgstr "Directory di output mancante" msgid "Name '%s' is just the auto name - remove it" msgstr "Il nome '%s' è solo il nome automatico - rimuovilo" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "Nessun 'config.yml' trovato, utilizzando i valori predefiniti." @@ -1308,11 +1327,12 @@ msgstr "Nessuna impronta digitale nell'URL." msgid "No git submodules available" msgstr "Nessun sottomodulo git disponibile" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Nessun progetto gradle è stato trovato. Specificare --subdir?" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Nessun informazione trovata." @@ -1436,7 +1456,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "I metodi di donazione di OpenCollective appartengono al campo OpenCollective" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "Opzioni" @@ -1454,7 +1474,7 @@ msgstr "Invia l'output del JSON allo stdout." msgid "Outputting JSON" msgstr "Output di JSON" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Licenza generale del progetto." @@ -1463,7 +1483,7 @@ msgstr "Licenza generale del progetto." msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Sostituzione di versionName vuoto in {apkfilename} dai metadati: {version}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "Pacchetto \"{appid}\" già esistente" @@ -1477,7 +1497,7 @@ msgstr "Analisi del manifesto in '{path}'" msgid "Password required with username" msgstr "Password richiesta con nome utente" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Percorso alla sottodirectory principale del progetto Android, se non in root." @@ -1500,6 +1520,11 @@ msgstr "Percorso del keystore per la chiave di firma del repository" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Stampa la variabile segreta sul terminale per un facile copia/incolla" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1532,7 +1557,7 @@ msgstr "Produci XML/JSON leggibili dagli utenti per i file di indice" msgid "Produce human-readable index.xml" msgstr "Produci un index.xml leggibile" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "URL del progetto da cui importare." @@ -1669,6 +1694,11 @@ msgstr "Scansiona gli APK risultanti per le classi non libere note." msgid "Scan the source code of a package" msgstr "Scansiona il codice sorgente di un pacchetto" +#: ../fdroidserver/scanner.py +#, fuzzy, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "Scanner trovato {count} problemi in {appid}:" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1689,6 +1719,11 @@ msgstr[1] "Scanner trovato {} problemi" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Scansiona gli APK con apkanalyzer per le classi non libere note." +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "Scansiona gli APK con apkanalyzer per le classi non libere note." + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1866,7 +1901,7 @@ msgstr "Queste sono le applicazioni che sono state archiviate dal repo principal msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Questo è un repository di applicazioni da utilizzare con F-Droid. Le applicazioni in questo repository sono o binari ufficiali compilati dagli sviluppatori dell'applicazione originale, o sono binari compilati dai sorgenti dall'amministratore di f-droid.org usando gli strumenti su https://gitlab.com/fdroid." -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Questo repo ha già metadati locali: %s" @@ -2100,12 +2135,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "Caricamento di {apkfilename} su virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "Uso" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Utilizzo: %s\n" @@ -2217,13 +2252,13 @@ msgid "adding to {name}: {path}" msgstr "aggiungendo a {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opzione ambigua: %(option)s potrebbe corrispondere a %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "opzione ambigua: %s (%s?)" @@ -2262,8 +2297,12 @@ msgstr "applicationId per controllare gli aggiornamenti" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId con versionCode opzionale nella forma APPID[:VERCODE]" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argomento \" -\" con la modalità %r" @@ -2280,6 +2319,11 @@ msgstr "tentativo di connessione ssh nuda per testare la chiave di distribuzione msgid "can not parse scrlib spec (not a string): '{}'" msgstr "impossibile analizzare le specifiche scrlib (non una stringa): '{}'" +#: /usr/lib/python3.9/argparse.py +#, fuzzy, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "impossibile aprire \"%s\": %s" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2292,12 +2336,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "impossibile trovare srclibs richiesto: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "impossibile avere più argomenti subparser" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "impossibile unire le azioni : due gruppi sono denominati %r" @@ -2320,12 +2364,12 @@ msgid "commands from plugin modules:" msgstr "dai moduli dei plugin:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "complesso" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2376,7 +2420,7 @@ msgid "deployed process log {path} to {dest}" msgstr "log di processo distribuito {path} a {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= è richiesto per opzioni come %r" @@ -2386,7 +2430,7 @@ msgid "executable binary, possibly code" msgstr "binario eseguibile, eventualmente codice" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2394,17 +2438,17 @@ msgstr[0] "atteso %s argomento" msgstr[1] "atteso %s argomenti" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "si aspettava almeno un argomento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "atteso al massimo un argomento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "atteso un argomento" @@ -2422,7 +2466,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "in virgola mobile" @@ -2443,7 +2487,7 @@ msgid "gzip file archive" msgstr "archivio file gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "ignorava l'argomento esplicito %r" @@ -2452,31 +2496,36 @@ msgstr "ignorava l'argomento esplicito %r" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 deve avere una firma, usa `fdroid signindex` per crearla!" +#: ../fdroidserver/index.py +#, fuzzy +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "index-v1 deve avere una firma, usa `fdroid signindex` per crearla!" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "intero" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valore %(type)s non valido: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "scelta non valida: %(value)r (scegliere tra %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valore di risoluzione dei conflitti non valido: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "stringa di opzioni non valida %(option)r: deve iniziare con un carattere %(prefix_chars)r" @@ -2505,7 +2554,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "il mirror '%s' non finisce con 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "gli argomenti che si escludono a vicenda devono essere opzionali" @@ -2519,7 +2568,7 @@ msgid "no APK supplied" msgstr "nessun APK fornito" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "opzione inesistente: %s" @@ -2533,13 +2582,13 @@ msgid "no version information found" msgstr "nessuna informazione sulla versione trovata" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "non consentito con argomento %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "uno degli argomenti %s è richiesto" @@ -2554,55 +2603,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "opzione %s: Se volete davvero installare tutte le app firmate, usate --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "opzione %s: valore %s non valido: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "opzione %s: scelta non valida: %r (scegliere da %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "opzione -%s non riconosciuta" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "l'opzione -%s richiede degli argomenti" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "l'opzione --%s non deve avere argomenti" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "l'opzione --%s non ha un prefisso univoco" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "opzione --%s non riconosciuta" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "l'opzione --%s richiede un argomento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "argomenti facoltativi" @@ -2612,7 +2661,7 @@ msgid "overwriting existing {path}" msgstr "sovrascrivendo il {path} esistente" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "argomenti posizionali" @@ -2641,6 +2690,10 @@ msgstr "repo_icon \"repo/icons/%s\" non esiste, genera un segnaposto." msgid "repo_icon %s does not exist, generating placeholder." msgstr "repo_icon %s non esiste, genera un segnaposto." +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml non installato, non può scrivere metadati." @@ -2660,13 +2713,14 @@ msgid "shared library" msgstr "biblioteca condivisa" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "mostra il numero di versione del programma ed esci" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "mostra questo messaggio di aiuto ed esci" @@ -2701,25 +2755,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "il valore di timestamp fornito '{timestamp}' non è un timestamp unix" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "i seguenti argomenti sono obbligatori: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "stringa di opzioni inaspettata: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "parser sconosciuto %(parser_name)r (scelte: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "argomenti sconosciuti: %s" @@ -2731,6 +2785,7 @@ msgstr "permessi su \"{config_file}\" insicuri (dovrebbero essere 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "utilizzo: " @@ -2859,7 +2914,7 @@ msgstr "{name} \"{section}/icons/{path}\" non esiste! Controlla \"config.yml\"." msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} è deprecato, usa {newfile}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} esiste già, ignorando i risultati dell'importazione!" @@ -2894,7 +2949,7 @@ msgstr "Copia non riuscita {path}: {error}" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} non finisce con \"fdroid\", controlla il percorso dell'URL!" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} non inizia con \"http\"!" diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index fd0106d2..e7abc471 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2020-09-02 16:10+0000\n" "Last-Translator: Hinaloe \n" "Language-Team: Japanese \n" @@ -94,13 +94,13 @@ msgstr "" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -112,7 +112,7 @@ msgid "%(prog)s [options] url" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "" @@ -123,12 +123,12 @@ msgid "%d problems found" msgstr "%d個の問題が見つかりました" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "" @@ -139,7 +139,7 @@ msgid "%s is not an accepted build field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "" @@ -165,7 +165,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -221,7 +221,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr "" @@ -262,7 +262,7 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -457,7 +457,7 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -484,11 +484,11 @@ msgstr "" msgid "Could not find '{command}' on your system" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -508,7 +508,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -625,7 +625,7 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -713,6 +713,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" +#: ../fdroidserver/nightly.py +#, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -742,9 +747,14 @@ msgid "Error while attempting to publish log: %s" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "" @@ -1228,6 +1238,11 @@ msgstr "" msgid "Malformed serverwebroot line:" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" @@ -1241,6 +1256,10 @@ msgstr "" msgid "Name '%s' is just the auto name - remove it" msgstr "" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "" @@ -1279,11 +1298,12 @@ msgstr "" msgid "No git submodules available" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "" @@ -1407,7 +1427,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "" @@ -1425,7 +1445,7 @@ msgstr "" msgid "Outputting JSON" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "" @@ -1434,7 +1454,7 @@ msgstr "" msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "" @@ -1448,7 +1468,7 @@ msgstr "" msgid "Password required with username" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "" @@ -1471,6 +1491,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1503,7 +1528,7 @@ msgstr "" msgid "Produce human-readable index.xml" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "" @@ -1640,6 +1665,11 @@ msgstr "" msgid "Scan the source code of a package" msgstr "" +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1659,6 +1689,10 @@ msgstr[0] "" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1836,7 +1870,7 @@ msgstr "" msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "" @@ -2070,12 +2104,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "" @@ -2187,13 +2221,13 @@ msgid "adding to {name}: {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "" @@ -2232,8 +2266,12 @@ msgstr "" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "" @@ -2250,6 +2288,11 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" +#: /usr/lib/python3.9/argparse.py +#, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2262,12 +2305,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "" @@ -2290,12 +2333,12 @@ msgid "commands from plugin modules:" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2345,7 +2388,7 @@ msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "" @@ -2355,24 +2398,24 @@ msgid "executable binary, possibly code" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "" @@ -2390,7 +2433,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "" @@ -2411,7 +2454,7 @@ msgid "gzip file archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "" @@ -2420,31 +2463,35 @@ msgstr "" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "" +#: ../fdroidserver/index.py +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" @@ -2473,7 +2520,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2487,7 +2534,7 @@ msgid "no APK supplied" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "" @@ -2501,13 +2548,13 @@ msgid "no version information found" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "" @@ -2522,55 +2569,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "" @@ -2580,7 +2627,7 @@ msgid "overwriting existing {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "" @@ -2609,6 +2656,10 @@ msgstr "" msgid "repo_icon %s does not exist, generating placeholder." msgstr "" +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2628,13 +2679,14 @@ msgid "shared library" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "" @@ -2669,25 +2721,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "" @@ -2699,6 +2751,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "" @@ -2826,7 +2879,7 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "" @@ -2861,7 +2914,7 @@ msgstr "" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "" diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index c150232b..865b8756 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2021-01-15 13:25+0000\n" "Last-Translator: R_SACI \n" "Language-Team: Kabyle \n" @@ -96,13 +96,13 @@ msgstr "" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" mačči d aseɣwen URL ameɣtu!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -115,7 +115,7 @@ msgid "%(prog)s [options] url" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: tuccḍa: %(message)s\n" @@ -126,12 +126,12 @@ msgid "%d problems found" msgstr "%d n wuguren ttwafen" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [d afrayan]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "" @@ -142,7 +142,7 @@ msgid "%s is not an accepted build field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "" @@ -168,7 +168,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' ulac-it deg config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' d taɣiret ur iṣeḥḥan ara i usideg" @@ -224,7 +224,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "...anadi n ileqman ur yeddi ara i {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() ur yettwasbadu ara" @@ -265,7 +265,7 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -461,7 +461,7 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Tabdart n taggayin i yebḍan s ticcert." @@ -488,11 +488,11 @@ msgstr "" msgid "Could not find '{command}' on your system" msgstr "D awezɣi tifin n '{command}' deg unagraw-ik.im" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Ur izmir ara ad d-yaf isem n lqem aneggaru" @@ -512,7 +512,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -630,7 +630,7 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -718,6 +718,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" +#: ../fdroidserver/nightly.py +#, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -747,9 +752,14 @@ msgid "Error while attempting to publish log: %s" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Izmal-nniḍen sɣur APKs" @@ -1234,6 +1244,11 @@ msgstr "" msgid "Malformed serverwebroot line:" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" @@ -1247,6 +1262,10 @@ msgstr "" msgid "Name '%s' is just the auto name - remove it" msgstr "Isem '%s' d isem awurman kan - kkes-it" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "" @@ -1285,11 +1304,12 @@ msgstr "" msgid "No git submodules available" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "" @@ -1413,7 +1433,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "Tixtiṛiyin" @@ -1431,7 +1451,7 @@ msgstr "" msgid "Outputting JSON" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "" @@ -1440,7 +1460,7 @@ msgstr "" msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "" @@ -1454,7 +1474,7 @@ msgstr "" msgid "Password required with username" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "" @@ -1477,6 +1497,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1509,7 +1534,7 @@ msgstr "" msgid "Produce human-readable index.xml" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "" @@ -1646,6 +1671,11 @@ msgstr "" msgid "Scan the source code of a package" msgstr "" +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1666,6 +1696,10 @@ msgstr[1] "" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1843,7 +1877,7 @@ msgstr "" msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "" @@ -2077,12 +2111,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "Aseqdec" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Aseqdec: %s\n" @@ -2194,13 +2228,13 @@ msgid "adding to {name}: {path}" msgstr "timerniwt ɣer {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "" @@ -2239,8 +2273,12 @@ msgstr "" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "" @@ -2257,6 +2295,11 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" +#: /usr/lib/python3.9/argparse.py +#, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2269,12 +2312,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "" @@ -2297,12 +2340,12 @@ msgid "commands from plugin modules:" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2353,7 +2396,7 @@ msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "" @@ -2363,7 +2406,7 @@ msgid "executable binary, possibly code" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2371,17 +2414,17 @@ msgstr[0] "" msgstr[1] "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "" @@ -2399,7 +2442,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--tallelt|--lqem|]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "" @@ -2420,7 +2463,7 @@ msgid "gzip file archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "" @@ -2429,31 +2472,35 @@ msgstr "" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "" +#: ../fdroidserver/index.py +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "amḍan ummid" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" @@ -2482,7 +2529,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2496,7 +2543,7 @@ msgid "no APK supplied" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "" @@ -2510,13 +2557,13 @@ msgid "no version information found" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "" @@ -2531,55 +2578,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "Taxtiṛt -%s ur tettwassen ara" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "Taxtiṛt -%s yesra afakul" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "aɣewwar --%s yessefk ad yesεu tiɣiret" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "" @@ -2589,7 +2636,7 @@ msgid "overwriting existing {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "" @@ -2618,6 +2665,10 @@ msgstr "" msgid "repo_icon %s does not exist, generating placeholder." msgstr "" +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2637,13 +2688,14 @@ msgid "shared library" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "" @@ -2678,25 +2730,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "" @@ -2708,6 +2760,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "aqseqdac: " @@ -2836,7 +2889,7 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "" @@ -2871,7 +2924,7 @@ msgstr "" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "" diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index eec9804e..1f1fb802 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Korean \n" @@ -101,13 +101,13 @@ msgstr "" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\"은 올바른 URL이 아닙니다!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -119,7 +119,7 @@ msgid "%(prog)s [options] url" msgstr "%(prog)s [옵션] url" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: 오류: %(message)s\n" @@ -130,12 +130,12 @@ msgid "%d problems found" msgstr "문제 %d개를 찾음" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [옵션]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "%r는 호출할 수 없습니다" @@ -146,7 +146,7 @@ msgid "%s is not an accepted build field" msgstr "%s는 빌드 필드 값으로 허용되지 않습니다" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "%s 옵션은 값을 받지 않습니다" @@ -172,7 +172,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias'를 config.yml에서 찾을 수 없습니다!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required'는 고정적을 위한 잘못된 인수입니다" @@ -228,7 +228,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "...{appid}를 위한 checkupdate가 실패됨 : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__()이 정의되지 않음" @@ -269,7 +269,7 @@ msgstr "{name}를 위해서만 새 저장소를 추가하기" msgid "Alias of the repo signing key in the keystore" msgstr "키스토어에서 저장소 서명 키의 별칭" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -464,7 +464,7 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -491,11 +491,11 @@ msgstr "" msgid "Could not find '{command}' on your system" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -515,7 +515,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -632,7 +632,7 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -720,6 +720,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" +#: ../fdroidserver/nightly.py +#, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -749,9 +754,14 @@ msgid "Error while attempting to publish log: %s" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "" @@ -1236,6 +1246,11 @@ msgstr "" msgid "Malformed serverwebroot line:" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" @@ -1249,6 +1264,10 @@ msgstr "" msgid "Name '%s' is just the auto name - remove it" msgstr "" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "" @@ -1287,11 +1306,12 @@ msgstr "" msgid "No git submodules available" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "" @@ -1415,7 +1435,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "옵션" @@ -1433,7 +1453,7 @@ msgstr "" msgid "Outputting JSON" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "" @@ -1442,7 +1462,7 @@ msgstr "" msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "" @@ -1456,7 +1476,7 @@ msgstr "" msgid "Password required with username" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "" @@ -1479,6 +1499,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1511,7 +1536,7 @@ msgstr "사람이 읽을 수 있는 색인 파일을 위한 XML/JSON을 생산 msgid "Produce human-readable index.xml" msgstr "사람이 읽을 수 있는 index.xml을 생산합니다" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "" @@ -1648,6 +1673,11 @@ msgstr "" msgid "Scan the source code of a package" msgstr "패키지의 소스 코드를 스캔합니다" +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1667,6 +1697,10 @@ msgstr[0] "" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1844,7 +1878,7 @@ msgstr "" msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "" @@ -2078,12 +2112,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "사용법" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "사용법: %s\n" @@ -2195,13 +2229,13 @@ msgid "adding to {name}: {path}" msgstr "{name}에 추가 중: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "모호한 옵션: %(option)s은 %(matches)s와 일치했을 수 있습니다" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "모호한 옵션: %s (%s?)" @@ -2240,8 +2274,12 @@ msgstr "업데이트를 확인할 applicationId" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "양식 APPID[:VERCODE]에서 선택적인 versionCode로 된 applicationId" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "" @@ -2258,6 +2296,11 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" +#: /usr/lib/python3.9/argparse.py +#, fuzzy, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "'%s'를 열 수 없습니다: %s" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2270,12 +2313,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "작동을 병합할 수 없습니다 - 두 그룹은 %r로 이름지어져 있습니다" @@ -2298,12 +2341,12 @@ msgid "commands from plugin modules:" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "복잡" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2353,7 +2396,7 @@ msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest=는 %r과 같은 옵션을 위해 필요합니다" @@ -2363,24 +2406,24 @@ msgid "executable binary, possibly code" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "" @@ -2398,7 +2441,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [<명령>] [-h|--help|--version|<인수>]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "부동소수점" @@ -2419,7 +2462,7 @@ msgid "gzip file archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "" @@ -2428,31 +2471,36 @@ msgstr "" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1은 서명이 있어야 합니다, 그것을 만드려면 `fdroid signindex`를 사용하세요!" +#: ../fdroidserver/index.py +#, fuzzy +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "index-v1은 서명이 있어야 합니다, 그것을 만드려면 `fdroid signindex`를 사용하세요!" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "정수" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "올바르지 않은 %(type)s 값: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "올바르지 않은 선택: %(value)r (%(choices)s에서 선택하세요)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "올바르지 않은 conflict_resolution 값: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "올바르지 않은 옵션 문자열 %(option)r: 문자 %(prefix_chars)r로 시작해야 합니다" @@ -2481,7 +2529,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "미러 '%s'는 'fdroid'로 끝나지 않습니다!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2495,7 +2543,7 @@ msgid "no APK supplied" msgstr "제공된 APK가 없습니다" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "이러한 옵션이 없습니다: %s" @@ -2509,13 +2557,13 @@ msgid "no version information found" msgstr "버전 정보를 찾지 못했습니다" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "" @@ -2530,55 +2578,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "옵션 %s: 당신이 정말 모든 서명된 앱을 설치하기를 원한다면, --all을 사용하세요" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "옵션 %s: 올바르지 않은 %s 값: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "옵션 %s: 올바르지 않은 선택: %r (%s에서 선택하세요)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "옵션 -%s은 인식되지 않습니다" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "옵션 -%s은 인수가 필요합니다" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "옵션 --%s은 인수를 가지지 않아야 합니다" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "옵션 --%s는 고유한 접두어가 아닙니다" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "옵션 --%s은 인식되지 않습니다" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "옵션 --%s은 인수가 필요합니다" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "선택적 인수" @@ -2588,7 +2636,7 @@ msgid "overwriting existing {path}" msgstr "기존 {path}를 덮어쓰는 중" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "고정적 인수" @@ -2617,6 +2665,10 @@ msgstr "" msgid "repo_icon %s does not exist, generating placeholder." msgstr "" +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2636,13 +2688,14 @@ msgid "shared library" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "프로그램의 버전 번호를 보여주고 종료합니다" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "이 도움말 메시지를 보여주고 종료합니다" @@ -2677,25 +2730,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "제공된 타임스탬프 값 '{timestamp}'는 유닉스 타임스탬프가 아닙니다" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "다음 인수들이 필요합니다: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "예기치 않은 옵션 문자열: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "알 수 없는 파서 %(parser_name)r (선택: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "인식할 수 없는 인수: %s" @@ -2707,6 +2760,7 @@ msgstr "'{config_file}'에 안전하지 않은 권한 (0600이어야 합니다)! #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "사용법: " @@ -2834,7 +2888,7 @@ msgstr "{name} \"{section}/icons/{path}\"는 존재하지 않습니다! \"config msgid "{oldfile} is deprecated, use {newfile}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "" @@ -2869,7 +2923,7 @@ msgstr "" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url}는 \"fdroid\"로 끝나지 않습니다, URL 경로를 확인하세요!" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url}는 \"http\"로 시작하지 않습니다!" diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index 4aba2980..5e4003de 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Norwegian Bokmål \n" @@ -104,13 +104,13 @@ msgstr "\"{path}\" er ikke et godtatt format, konverter til: {formats}" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" er ikke en gyldig nettadresse." #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -123,7 +123,7 @@ msgid "%(prog)s [options] url" msgstr "%(prog)s [valg] url" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: feil: %(message)s\n" @@ -134,12 +134,12 @@ msgid "%d problems found" msgstr "%d problemer funnet" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [valg]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "%r kan ikke kalles" @@ -150,7 +150,7 @@ msgid "%s is not an accepted build field" msgstr "%s er ikke et godtatt bygge-felt" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "%s-valget tar ikke en verdi" @@ -176,7 +176,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' ble ikke funnet i config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, fuzzy msgid "'required' is an invalid argument for positionals" msgstr "'required' er et ugyldig argument for posisjonsinfo" @@ -234,7 +234,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "…oppdateringssjekk mislyktes for {appid}: {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() udefinert" @@ -276,7 +276,7 @@ msgstr "Legger til ny pakkebrønn kun for {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias for pakkebrønnssigneringsnøkkel i nøkkellageret" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Tillater en annen revisjon (eller git-avgreining) å angis for igangsettende import" @@ -475,7 +475,7 @@ msgstr "Sjekker arkivering for {appid} - APK-er:{integer}, keepversions:{keep}, msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Ren oppdatering, ikke bruk hurtiglager, behandle alle APK-er på ny" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Kommainndelt liste over kategorier." @@ -502,12 +502,12 @@ msgstr "Filer i konflikt med hverandre. Bruker {newfile}, ser bort fra {oldfile} msgid "Could not find '{command}' on your system" msgstr "Fant ikke \"{command}\" på ditt system" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, fuzzy msgid "Could not find latest version code" msgstr "Fant ikke seneste versjonskode" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, fuzzy msgid "Could not find latest version name" msgstr "Fant ikke seneste versjonsnavn" @@ -528,7 +528,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Kunne ikke fortolke størrelse \"{size}\", feil type \"{type}\"" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, fuzzy msgid "Couldn't find Application ID" msgstr "Fant ikke pakke-ID" @@ -650,7 +650,7 @@ msgstr "Beskrivelsen har en liste (%s), men er ikke punktvis (*) eller nummerert msgid "Description of length {length} is over the {limit} char limit" msgstr "Beskrivelse av lengde {length} overstiger {limit} tegngrensen" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Ikke legg til «deaktivert:» blant genererte bygg" @@ -747,6 +747,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "Feil: Ustøttet CI-type, feilrettinger er velkomne." +#: ../fdroidserver/nightly.py +#, fuzzy, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "Feil: Ustøttet CI-type, feilrettinger er velkomne." + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -778,10 +783,15 @@ msgid "Error while attempting to publish log: %s" msgstr "Kunne ikke offentliggjøre logg: %s" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Error while getting repo address" msgstr "Kunne ikke hente pakkebrønnsadresse" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Hent ut signaturer fra APK-er" @@ -1287,6 +1297,11 @@ msgstr "Feilaktig innskrevne pakkebrønnsspeil." msgid "Malformed serverwebroot line:" msgstr "Feilaktig innskrevet serverwebroot-linje:" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Avspeil hele pakkebrønnen og arkivet, alle filtyper." @@ -1300,6 +1315,10 @@ msgstr "Manglende utdatamappe" msgid "Name '%s' is just the auto name - remove it" msgstr "Navnet \"%s\" er kun det forvalgte navnet, fjern det." +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "Fant ingen 'config.yml' , bruker forvalg." @@ -1340,12 +1359,13 @@ msgstr "Inget fingeravtrykk i nettadresse." msgid "No git submodules available" msgstr "Ingen Git-undermoduler tilgjengelige" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, fuzzy msgid "No gradle project could be found. Specify --subdir?" msgstr "Fant inget Android- eller Kivy-prosjekt. Angi --subdir?" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Ingen informasjon funnet." @@ -1476,7 +1496,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Flatter-donasjonsmetoder hører hjemme i FlattrID-flagget" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "Valg" @@ -1495,7 +1515,7 @@ msgstr "Send utdata-JSON til stdout." msgid "Outputting JSON" msgstr "Produserer JSON" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Overnevnt lisens for prosjektet." @@ -1504,7 +1524,7 @@ msgstr "Overnevnt lisens for prosjektet." msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Overskriver blank versionName i {apkfilename} fra metadata: {version}." -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "Pakken «{appid}» finnes allerede" @@ -1518,7 +1538,7 @@ msgstr "Tolker manifest i \"{path}\"." msgid "Password required with username" msgstr "Passord påkrevd med brukernavn" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, fuzzy msgid "Path to main Android project subdirectory, if not in root." msgstr "Sti til hovedundermappe for Androidprosjekt, hvis ikke i rot." @@ -1545,6 +1565,11 @@ msgstr "Sti til nøkkellager for pakkebrønnssigneringsnøkkel" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Skriv den hemmelige variabelen til terminalen for enkel kopiering/innliming." +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1577,7 +1602,7 @@ msgstr "Produser menneskelig lesbar XML/JSON for indeksfiler" msgid "Produce human-readable index.xml" msgstr "Produser menneskelig lesbar index.xml" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "Prosjektnettadresse å importere fra." @@ -1719,6 +1744,11 @@ msgstr "Skann resulterende APK(er) for kjente ufrie klasser." msgid "Scan the source code of a package" msgstr "Skann kildekoden til en pakke" +#: ../fdroidserver/scanner.py +#, fuzzy, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "Skanner fant {count} problemer i {appid}:" + #: ../fdroidserver/scanner.py #, fuzzy, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1740,6 +1770,11 @@ msgstr[1] "Skanner fant {} problemer" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Skanner APK med APK Analyzer for kjente ikke-frie klasser." +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "Skanner APK med APK Analyzer for kjente ikke-frie klasser." + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1922,7 +1957,7 @@ msgstr "" msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Denne pakkebrønnen har allerede lokal metadata: %s" @@ -2162,12 +2197,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "Behandler {apkfilename}" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "Bruk" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Bruk: %s\n" @@ -2284,13 +2319,13 @@ msgid "adding to {name}: {path}" msgstr "legger til i {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, fuzzy, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "tvetydig valg: %(option)s kan passe overens med %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "tvetydig valg: %s (%s?)" @@ -2333,8 +2368,12 @@ msgstr "App-ID å sjekke for oppdateringer" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "App-ID med valgfri versionCode, i formen APPID[:VERCODE]" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argument \"-\" med modus %r" @@ -2353,6 +2392,11 @@ msgstr "forsøker naken SSH-tilkobling for å teste utrullingsnøkkel:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" +#: /usr/lib/python3.9/argparse.py +#, fuzzy, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "kan ikke åpne '%s': %s" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2365,12 +2409,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "Finner ikke AppID for {path}." #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "kan ikke ha flere underfortolkningsargumenter" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "kan ikke flette handlinger - to grupper heter %r" @@ -2394,13 +2438,13 @@ msgid "commands from plugin modules:" msgstr "kommandoer fra programtilleggsmodulene:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, fuzzy msgid "complex" msgstr "kompleks" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2451,7 +2495,7 @@ msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= er påkrevd for valg som %r" @@ -2461,7 +2505,7 @@ msgid "executable binary, possibly code" msgstr "kjørbar binærfil, muligens kode" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2469,17 +2513,17 @@ msgstr[0] "forventet %s argument" msgstr[1] "forventet %s argumenter" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "forventet minst ett argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "forventet på det meste ett argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "forventet ett argument" @@ -2498,7 +2542,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "bruk: fdroid [-h|--help|--version] []" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, fuzzy msgid "floating-point" msgstr "flyttall" @@ -2523,7 +2567,7 @@ msgid "gzip file archive" msgstr ".gzip-filarkiv" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, fuzzy, python-format msgid "ignored explicit argument %r" msgstr "ignorerte eksplisitt argument %r" @@ -2532,31 +2576,36 @@ msgstr "ignorerte eksplisitt argument %r" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 må ha en signatur, bruk `fdroid signindex` for å opprette den." +#: ../fdroidserver/index.py +#, fuzzy +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "index-v1 må ha en signatur, bruk `fdroid signindex` for å opprette den." + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "heltall" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, fuzzy, python-format msgid "invalid %(type)s value: %(value)r" msgstr "ugydlig %(type)s verdi: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "ugyldig valg: %(value)r (velg fra %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "ugyldig conflict_resolution-verdi: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "Ugyldig valgstreng %(option)r: Må starte med et tegn %(prefix_chars)r" @@ -2585,7 +2634,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "speilet \"%s\" slutter ikke med \"fdroid\"." #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "gjensidig utelukkende argumenter må være valgfrie" @@ -2599,7 +2648,7 @@ msgid "no APK supplied" msgstr "ingen APK angitt" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "Inget slikt valg: %s" @@ -2614,13 +2663,13 @@ msgid "no version information found" msgstr "ingen versjonsinfo funnet!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, fuzzy, python-format msgid "not allowed with argument %s" msgstr "ikke tillatt med argument %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, fuzzy, python-format msgid "one of the arguments %s is required" msgstr "ett av argumentene %s kreves" @@ -2636,55 +2685,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "valg %s: Hvis du virkelig ønsker å installere alle signerte programmer, bruk -all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "valg %s: ugyldig %s verdi: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, fuzzy, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "valg %s: ugyldig valg: %r (velg mellom %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "Kommandoen \"-%s\" gjenkjennes ikke" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "valg -%s krever et argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, fuzzy, python-format msgid "option --%s must not have an argument" msgstr "valget --%s kan ikke ha et argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, fuzzy, python-format msgid "option --%s not a unique prefix" msgstr "valget --%s er ikke et unikt prefiks" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "Kommandoen \"--%s\" gjenkjennes ikke" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "valget --%s krever et argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "valgfrie argumenter" @@ -2694,7 +2743,7 @@ msgid "overwriting existing {path}" msgstr "overskriver eksisterende {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "Posisjonelle argumenter" @@ -2723,6 +2772,10 @@ msgstr "" msgid "repo_icon %s does not exist, generating placeholder." msgstr "" +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py #, fuzzy msgid "ruamel.yaml not installed, can not write metadata." @@ -2743,13 +2796,14 @@ msgid "shared library" msgstr "delt bibliotek" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "vis programmets versjonsnummer og avslutt" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "vis denne hjelpemeldingen og avslutt" @@ -2787,25 +2841,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "angitt tidsstempelverdi \"{timestamp}\" er ikke et Unix-tidsstempel" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "følgende argumenter kreves: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "uventet valgstreng: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "ukjent fortolker %(parser_name)r (valg: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "ugjengkjente argumenter: %s" @@ -2817,6 +2871,7 @@ msgstr "utrygge tilganger for '{config_file}' (skal være 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "bruk: " @@ -2945,7 +3000,7 @@ msgstr "{name} «{section}/icons/{path}» finnes ikke. Rett det i config.yml." msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} er avleggs, bruk {newfile}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} finnes allerede, ignorerer importeringsresultater." @@ -2980,7 +3035,7 @@ msgstr "Klarte ikke å lese {path}: {error}" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} slutter ikke med \"fdroid\", sjekk nettadressestien." -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, fuzzy, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} slutter ikke med \"fdroid\", sjekk nettadressestien." diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index b942afc7..24308fa1 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2021-07-16 15:35+0000\n" "Last-Translator: privacysimp \n" "Language-Team: Dutch \n" @@ -95,13 +95,13 @@ msgstr "" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -114,7 +114,7 @@ msgid "%(prog)s [options] url" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: fout: %(message)s\n" @@ -125,12 +125,12 @@ msgid "%d problems found" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [opties]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "%r kan niet aangeroepen worden" @@ -141,7 +141,7 @@ msgid "%s is not an accepted build field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "" @@ -167,7 +167,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -223,7 +223,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() niet gedefinieerd" @@ -264,7 +264,7 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -461,7 +461,7 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -488,11 +488,11 @@ msgstr "" msgid "Could not find '{command}' on your system" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -512,7 +512,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -629,7 +629,7 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -717,6 +717,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" +#: ../fdroidserver/nightly.py +#, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -746,9 +751,14 @@ msgid "Error while attempting to publish log: %s" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "" @@ -1232,6 +1242,11 @@ msgstr "" msgid "Malformed serverwebroot line:" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" @@ -1245,6 +1260,10 @@ msgstr "" msgid "Name '%s' is just the auto name - remove it" msgstr "" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "" @@ -1283,11 +1302,12 @@ msgstr "" msgid "No git submodules available" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "" @@ -1411,7 +1431,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "Opties" @@ -1429,7 +1449,7 @@ msgstr "" msgid "Outputting JSON" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "" @@ -1438,7 +1458,7 @@ msgstr "" msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "" @@ -1452,7 +1472,7 @@ msgstr "" msgid "Password required with username" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "" @@ -1475,6 +1495,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1507,7 +1532,7 @@ msgstr "" msgid "Produce human-readable index.xml" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "" @@ -1644,6 +1669,11 @@ msgstr "" msgid "Scan the source code of a package" msgstr "" +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1664,6 +1694,10 @@ msgstr[1] "" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1841,7 +1875,7 @@ msgstr "" msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "" @@ -2075,12 +2109,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "Gebruik" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Gebruik: %s\n" @@ -2192,13 +2226,13 @@ msgid "adding to {name}: {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "" @@ -2237,8 +2271,12 @@ msgstr "" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "" @@ -2255,6 +2293,11 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" +#: /usr/lib/python3.9/argparse.py +#, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2267,12 +2310,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "" @@ -2295,12 +2338,12 @@ msgid "commands from plugin modules:" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "complex" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2351,7 +2394,7 @@ msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "" @@ -2361,7 +2404,7 @@ msgid "executable binary, possibly code" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2369,17 +2412,17 @@ msgstr[0] "" msgstr[1] "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "" @@ -2397,7 +2440,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "" @@ -2418,7 +2461,7 @@ msgid "gzip file archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "" @@ -2427,31 +2470,35 @@ msgstr "" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "" +#: ../fdroidserver/index.py +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" @@ -2480,7 +2527,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2494,7 +2541,7 @@ msgid "no APK supplied" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "" @@ -2508,13 +2555,13 @@ msgid "no version information found" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "" @@ -2529,55 +2576,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "optie -%s wordt niet herkend" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "optie -%s vereist een argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "optie --%s wordt niet herkend" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "optionele argumenten" @@ -2587,7 +2634,7 @@ msgid "overwriting existing {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "" @@ -2616,6 +2663,10 @@ msgstr "" msgid "repo_icon %s does not exist, generating placeholder." msgstr "" +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2635,13 +2686,14 @@ msgid "shared library" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "toon versienummer van programma en sluit af" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "toon dit hulpbericht en sluit af" @@ -2676,25 +2728,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "" @@ -2706,6 +2758,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "gebruik: " @@ -2834,7 +2887,7 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "" @@ -2869,7 +2922,7 @@ msgstr "" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "" diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 52491ff9..ea580e4d 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2022-02-15 22:36+0000\n" "Last-Translator: Agnieszka C \n" "Language-Team: Polish \n" @@ -110,13 +110,13 @@ msgstr "\"{path}\" nie jest akceptowanym formatem, zamień na: {formats}" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "„{path}” jest podpisany kluczem, który jest niedozwolony:" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" nie jest prawidłowym adresem URL!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -130,7 +130,7 @@ msgid "%(prog)s [options] url" msgstr "%(prog)s [opcje] url" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: błąd: %(message)s\n" @@ -141,12 +141,12 @@ msgid "%d problems found" msgstr "%d problemy odnalezione" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [opcje]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "%r nie można wywołać" @@ -157,7 +157,7 @@ msgid "%s is not an accepted build field" msgstr "%s nie jest akceptowanym polem kompilacji" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "%s opcja nie przyjmuje wartości" @@ -183,7 +183,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' nie znaleziono w config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'wymagane' jest nieprawidłowym argumentem dla pozycji" @@ -239,7 +239,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "...sprawdzenie aktualizacji nie powiodło się {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() nie określono" @@ -280,7 +280,7 @@ msgstr "Dodaje tylko nowe repozytorium {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias klucza podpisu repozytorium w magazynie kluczy" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Umożliwia określenie innej wersji (lub gałęzi git) dla początkowego importu" @@ -477,7 +477,7 @@ msgstr "Sprawdzanie archiwizacji dla {appid} - apks: {integer}, keepversions: {k msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Czysta aktualizacja - nie używa pamięci podręcznych, przetwarzaj ponownie wszystkie pakiety APK" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Rozdzielana przecinkami lista kategorii." @@ -504,11 +504,11 @@ msgstr "Pliki konfiguracyjne powodujące konflikt! Używając {newfile}, ignoruj msgid "Could not find '{command}' on your system" msgstr "Nie można znaleźć '{command}' w twoim systemie" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Nie można znaleźć najnowszej wersji kodu" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Nie można odnaleźć nazwy najnowszej wersji" @@ -528,7 +528,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Nie można przeanalizować rozmiaru \"{size}\", nieprawidłowy typ \"{type}\"" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Nie można odnaleźć identyfikatora aplikacji" @@ -645,7 +645,7 @@ msgstr "Opis ma listę (%s), ale nie jest wypunktowana (*) ani ponumerowana (#)" msgid "Description of length {length} is over the {limit} char limit" msgstr "Opis długości {length} przekracza limit {limit} char" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Nie dodawaj „wyłącz:” do wygenerowanych wpisów kompilacji" @@ -735,6 +735,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "BŁĄD: nieobsługiwany typ CI, mile widziane poprawki!" +#: ../fdroidserver/nightly.py +#, fuzzy, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "BŁĄD: nieobsługiwany typ CI, mile widziane poprawki!" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -766,9 +771,14 @@ msgid "Error while attempting to publish log: %s" msgstr "Błąd podczas próby opublikowania dziennika: %s" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Błąd podczas uzyskiwania adresu repo" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Wyciągnij podpisy z plików APK" @@ -1252,6 +1262,11 @@ msgstr "Nieprawidłowo repozytorium mirrors." msgid "Malformed serverwebroot line:" msgstr "Nieprawidłowy wiersz serverwebroot:" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Mirror pełnego repo i archiwum, wszystkie typy plików." @@ -1265,6 +1280,10 @@ msgstr "Brakujący katalog wyjściowy" msgid "Name '%s' is just the auto name - remove it" msgstr "Nazwa '%s' jest nazwą automatyczną - usuń ją" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "Nie znaleziono pliku 'config.yml', używając wartości domyślnych." @@ -1303,11 +1322,12 @@ msgstr "Brak odcisku palca w adresie URL." msgid "No git submodules available" msgstr "Brak dostępnych submodułów git" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Nie można znaleźć żadnego projektu gradle. Podaj --subdir?" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Nie znaleziono informacji." @@ -1431,7 +1451,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Metody darowizn OpenCollective należą do OpenCollective: field" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "Opcje" @@ -1449,7 +1469,7 @@ msgstr "Wyjście JSON na stdout." msgid "Outputting JSON" msgstr "Wyprowadzanie JSON" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Całkowita licencja na projekt." @@ -1458,7 +1478,7 @@ msgstr "Całkowita licencja na projekt." msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Przesłaniam pustą versionName w {apkfilename} z metadanych: {version}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "Pakiet \"{appid}\" już istnieje" @@ -1472,7 +1492,7 @@ msgstr "Analizowanie manifestu w{path}" msgid "Password required with username" msgstr "Hasło wymagane przy użyciu nazwy użytkownika" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Ścieżka do głównego podkatalogu projektu Android, jeśli nie w katalogu głównym." @@ -1495,6 +1515,11 @@ msgstr "Ścieżka do magazynu kluczy dla klucza podpisywania repo" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Wydrukuj tajną zmienną do terminala, aby ułatwić kopiowanie/wklejanie" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1527,7 +1552,7 @@ msgstr "Przygotuj czytelny dla człowieka XML/JSON dla plików index" msgid "Produce human-readable index.xml" msgstr "Przygotuj czytelny dla człowieka index.xml" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "Adres URL projektu do zaimportowania z." @@ -1664,6 +1689,11 @@ msgstr "Przeskanuj otrzymany plik APK w poszukiwaniu znanych niewolnych klas." msgid "Scan the source code of a package" msgstr "Zeskanuj kod źródłowy pakietu" +#: ../fdroidserver/scanner.py +#, fuzzy, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "Skaner znalazł {count} problem w {appid}:" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1685,6 +1715,11 @@ msgstr[2] "Skaner znalazł {} problemy" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Skanowanie pakietu APK za pomocą apkanalyzer w poszukiwaniu znanych niewolnych klas." +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "Skanowanie pakietu APK za pomocą apkanalyzer w poszukiwaniu znanych niewolnych klas." + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1862,7 +1897,7 @@ msgstr "To są aplikacje, które zostały zarchiwizowane w głównym repozytoriu msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "To jest repozytorium aplikacji używanych z F-Droid. Aplikacje w tym repozytorium są albo oficjalnymi plikami binarnymi utworzonymi przez oryginalnych programistów aplikacji, albo plikami binarnymi utworzonymi ze źródła przez administratora f-droid.org przy użyciu narzędzi na https://gitlab.com/fdroid." -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "To repo ma już lokalne metadane: %s" @@ -2103,12 +2138,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "Przesyłanie {apkfilename} do virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "Zastosowanie" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Użycie: %s\n" @@ -2220,13 +2255,13 @@ msgid "adding to {name}: {path}" msgstr "dodaj do {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "niejednoznaczna opcja: %(option)s może dopasować %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "niejednoznaczna opcja: %s (%s?)" @@ -2265,8 +2300,12 @@ msgstr "applicationId, aby sprawdzić dostępność aktualizacji" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId z opcjonalnym versionCode w postaci APPID [:VERCODE]" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argument \"-\" w trybie %r" @@ -2283,6 +2322,11 @@ msgstr "próbując odsłoniętego połączenia ssh, aby przetestować klucz wdro msgid "can not parse scrlib spec (not a string): '{}'" msgstr "can not parse scrlib spec (not a string):' {}'" +#: /usr/lib/python3.9/argparse.py +#, fuzzy, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "nie można otworzyć '%s':%s" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2295,12 +2339,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "Nie można znaleźć wymaganych srclibs: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "nie może mieć wielu argumentów o różnych argumentach" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "nie można scalać działania - dwie grupy są nazywane %r" @@ -2323,12 +2367,12 @@ msgid "commands from plugin modules:" msgstr "polecenia z modułów plugin:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "złożony" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2380,7 +2424,7 @@ msgid "deployed process log {path} to {dest}" msgstr "wdrożony dziennik procesów {path} do {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest = jest wymagany dla opcji takich jak %r" @@ -2390,7 +2434,7 @@ msgid "executable binary, possibly code" msgstr "wykonywalny binarny, ewentualnie kod" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2399,17 +2443,17 @@ msgstr[1] "oczekiwanych argumentów %s" msgstr[2] "oczekiwane argumenty %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "spodziewano się co najmniej jednego argumentu" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "spodziewano się co najwyżej jednego argumentu" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "oczekiwano jednego argumentu" @@ -2427,7 +2471,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "zmiennoprzecinkowy" @@ -2448,7 +2492,7 @@ msgid "gzip file archive" msgstr "plik archiwum gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "zignorował wyraźny argument %r" @@ -2457,31 +2501,36 @@ msgstr "zignorował wyraźny argument %r" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 musi mieć podpis, użyj `fdroid signindex` aby go utworzyć!" +#: ../fdroidserver/index.py +#, fuzzy +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "index-v1 musi mieć podpis, użyj `fdroid signindex` aby go utworzyć!" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "liczba całkowita (ang. integer)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "nieprawidłowe %(type)s wartość: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "nieprawidłowy wybór: %(value)r (wybierz z %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "niepoprawna wartość parametru conflict_resolution: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "niepoprawny ciąg opcji %(option)r: musi zaczynać się od postaci %(prefix_chars)r" @@ -2510,7 +2559,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "mirror '%s'nie kończy się na 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "wykluczające się wzajemnie argumenty muszą być opcjonalne" @@ -2524,7 +2573,7 @@ msgid "no APK supplied" msgstr "nie dostarczono pakietu APK" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "brak takiej opcji: %s" @@ -2538,13 +2587,13 @@ msgid "no version information found" msgstr "nie znaleziono informacji o wersji" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "niedozwolone z argumentem %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "jeden z argumentów %s jest wymagany" @@ -2559,55 +2608,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "opcja %s: Jeśli naprawdę chcesz zainstalować wszystkie podpisane aplikacje, użyj --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "opcja %s: nieprawidłowa %s wartość: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "opcja %s: nieprawidłowy wybór: %r (wybierz z %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "opcja -%s nie został rozpoznany" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "opcja -%s wymaga argumentu" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "opcja --%s nie może mieć argumentu" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "opcja --%s nie jest to unikalny prefiks" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "opcja --%s nie został rozpoznany" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "opcja --%s wymaga argumentu" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "opcjonalne argumenty" @@ -2617,7 +2666,7 @@ msgid "overwriting existing {path}" msgstr "nadpisanie istniejącego {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "argumenty pozycyjne" @@ -2646,6 +2695,10 @@ msgstr "repo_icon \"repo / icons / %s\" nie istnieje, generuje symbol zastępczy msgid "repo_icon %s does not exist, generating placeholder." msgstr "repo_icon %s nie istnieje, generuje symbol zastępczy." +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "nie zainstalowano ruamel.yaml, nie można zapisać metadanych." @@ -2665,13 +2718,14 @@ msgid "shared library" msgstr "biblioteka współdzielona" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "pokaż numer wersji programu i zakończ" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "pokaż ten komunikat pomocy i zakończ" @@ -2706,25 +2760,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "dostarczona wartość znacznika czasu '{timestamp}' nie jest znacznikiem czasu unix" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "wymagane są następujące argumenty: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "nieoczekiwany ciąg opcji: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "nieznana składnia (parser) %(parser_name)r (wybierz: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "nierozpoznane argumenty: %s" @@ -2736,6 +2790,7 @@ msgstr "niebezpieczne uprawnienia na '{config_file}' (powinno być 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "stosowanie: " @@ -2865,7 +2920,7 @@ msgstr "{name} \"{section}/icons/{path}\" nie istnieje! Sprawdź \"config.yml\". msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} jest przestarzałe, użyj {newfile}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} już istnieje, ignorowanie rezultatów importowania!" @@ -2900,7 +2955,7 @@ msgstr "{path}: {error}" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} nie kończy się na 'fdroid', sprawdź ścieżkę URL!" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} nie zaczyna się od \"http\"!" diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 14acfe17..fcf60bd9 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2022-05-24 20:28+0000\n" "Last-Translator: SC \n" "Language-Team: Portuguese \n" @@ -109,13 +109,13 @@ msgstr "\"{path}\" não é um formato aceito, converter para: {formats}" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\" é assinado por uma chave que não é permitida:" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" não é uma URL válida!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -128,7 +128,7 @@ msgid "%(prog)s [options] url" msgstr "%(prog)s [opções] url" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: erro: %(message)s\n" @@ -139,12 +139,12 @@ msgid "%d problems found" msgstr "%d problemas encontrados" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [opções]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "%r não pode ser invocado" @@ -155,7 +155,7 @@ msgid "%s is not an accepted build field" msgstr "%s não é um campo criado aceito" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "opção %s não leva um valor" @@ -181,7 +181,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' não encontrada em config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' é um argumento inválido para posicionadores" @@ -237,7 +237,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate falhou para {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() não definida" @@ -278,7 +278,7 @@ msgstr "Adicionando novo repositório para apenas {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias (apelido) da chave de assinatura do repositório na keystore" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Permite que uma revisão diferente (ou árvore do git) seja especificada para a importação inicial" @@ -474,7 +474,7 @@ msgstr "Verificando o arquivamento para {appid} - apks:{integer}, keepversions:{ msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Atualização limpa - não usa cache, reprocessa todos os APKs" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Lista de categorias separadas por vírgula." @@ -501,11 +501,11 @@ msgstr "Ficheiros de configuração conflitantes! Usando {newfile}, ignorando {o msgid "Could not find '{command}' on your system" msgstr "Não foi possível encontrar '{command}' no seu sistema" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Não foi possível encontrar o código de versão mais recente" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Não foi possível encontrar o nome da versão mais recente" @@ -525,7 +525,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Não foi possível analisar o tamanho \"{size}\", tipo \"{type}\" incorreto" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Não foi possível encontrar o ID da aplicação" @@ -642,7 +642,7 @@ msgstr "A descrição tem a lista (%s), mas não tem marcadores (*), nem é nume msgid "Description of length {length} is over the {limit} char limit" msgstr "A descrição de comprimento {length} é sobre o limite de char {limit}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Não adicionar 'disable:' às entradas de compilação geradas" @@ -732,6 +732,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERRO: tipo de CI sem suporte, patches são bem-vindos!" +#: ../fdroidserver/nightly.py +#, fuzzy, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "ERRO: tipo de CI sem suporte, patches são bem-vindos!" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -763,9 +768,14 @@ msgid "Error while attempting to publish log: %s" msgstr "Erro ao tentar publicar o log: %s" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Erro ao obter o endereço do repo" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Extrato de assinaturas de APKs" @@ -1249,6 +1259,11 @@ msgstr "Espelhos de repositório malformados." msgid "Malformed serverwebroot line:" msgstr "Linha de serverwebroot malformada:" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Espelha todo o repositório e pacotes, todos os tipos de ficheiros." @@ -1262,6 +1277,10 @@ msgstr "Falta diretório de saída" msgid "Name '%s' is just the auto name - remove it" msgstr "O nome '%s' é apenas o nome automático - remover" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "'config.yml' não encontrado, utilizando as predefinições." @@ -1300,11 +1319,12 @@ msgstr "Nenhuma impressão digital no URL." msgid "No git submodules available" msgstr "Não há submódulos git disponíveis" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Não foi possível encontrar nenhum projeto de gradle. Especificar --subdir?" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Nenhuma informação encontrada." @@ -1428,7 +1448,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Os métodos de doação OpenCollective pertencem no campo OpenCollective:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "Opções" @@ -1446,7 +1466,7 @@ msgstr "Saída de JSON para stdout." msgid "Outputting JSON" msgstr "Saída do JSON" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Licença geral do projeto." @@ -1455,7 +1475,7 @@ msgstr "Licença geral do projeto." msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Substituindo versionName em branco em {apkfilename} dos metadados: {version}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "O pacote \"{appid}\" já existe" @@ -1469,7 +1489,7 @@ msgstr "Analisando o manifesto em '{path}'" msgid "Password required with username" msgstr "Palavra-passe necessária com o nome de utilizador" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Caminho para o subdiretório principal do projeto Android, se não estiver na raiz." @@ -1492,6 +1512,11 @@ msgstr "Caminho até a keystore para a chave de assinatura do repositório" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Imprimir a variável secreta para o terminal para copiar/colar fácilmente" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1524,7 +1549,7 @@ msgstr "Produzir XML/JSON legível por humanos para ficheiros de índice" msgid "Produce human-readable index.xml" msgstr "Criação human-readable index.xml" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "URL do projeto para importar." @@ -1661,6 +1686,11 @@ msgstr "Procure no(s) APK(s) resultante(s) por classes conhecidas não livres." msgid "Scan the source code of a package" msgstr "Analisar o código fonte de um pacote" +#: ../fdroidserver/scanner.py +#, fuzzy, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "O scanner encontrou {count} problemas em {appid}:" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1681,6 +1711,11 @@ msgstr[1] "Scanner encontrou {} problemas" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Varrer os APK com apkanalyzer para classes não-livres." +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "Varrer os APK com apkanalyzer para classes não-livres." + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1858,7 +1893,7 @@ msgstr "Estas são as aplicações que foram arquivadas do repositório principa msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Este é um repositório de apps a serem usados com o F-Droid. Aplicações neste repositório são binários oficiais compilados pelos programadores da aplicação original ou são binários compilados da fonte por f-droid.org a usar as ferramentas em https://gitlab.com/fdroid." -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Este repositório já tem metadados locais: %s" @@ -2099,12 +2134,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "A enviar {apkfilename} ao virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "Utilização" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Utilização: %s\n" @@ -2216,13 +2251,13 @@ msgid "adding to {name}: {path}" msgstr "adicionando a {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opção ambígua: %(option)s poderia corresponder %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "opção ambígua: %s (%s?)" @@ -2261,8 +2296,12 @@ msgstr "applicationId para verificar se há atualizações" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId com versionCode opcional na forma APPID[:VERCODE]" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argumento \"-\" com o modo %r" @@ -2279,6 +2318,11 @@ msgstr "tentativa de conexão nua por SSH para testar a implantação da chave:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "não é possível analisar as especificações do scrlib (não é uma cadeia): '{}'" +#: /usr/lib/python3.9/argparse.py +#, fuzzy, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "não dá pra abrir '%s': %s" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2291,12 +2335,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "não é possível encontrar os srclibs necessários: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "não é possível ter vários argumentos de subparser" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "não é possível unir ações - dois grupos são denominados %r" @@ -2319,12 +2363,12 @@ msgid "commands from plugin modules:" msgstr "comandos dos módulos de plugin:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "complexo" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2375,7 +2419,7 @@ msgid "deployed process log {path} to {dest}" msgstr "registo de processo implantado {path} a {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest = é necessário para opções como %r" @@ -2385,7 +2429,7 @@ msgid "executable binary, possibly code" msgstr "binário executável, possivelmente código" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2393,17 +2437,17 @@ msgstr[0] "%s argumento esperado" msgstr[1] "%s argumentos esperados" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "esperado pelo menos um argumento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "esperado um argumento no máximo" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "esperado um argumento" @@ -2421,7 +2465,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "ponto flutuante" @@ -2442,7 +2486,7 @@ msgid "gzip file archive" msgstr "arquivo de ficheiros gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "argumento explícito %r ignorado" @@ -2451,31 +2495,36 @@ msgstr "argumento explícito %r ignorado" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 deve ter uma assinatura, use ' fdroid signindex ' para criá-lo!" +#: ../fdroidserver/index.py +#, fuzzy +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "index-v1 deve ter uma assinatura, use ' fdroid signindex ' para criá-lo!" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "inteiro" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valor inválido do tipo %(type)s: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "opção inválida: %(value)r (escolha de %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valor conflict_resolution inválido: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "Opção cadeia %(option)r inválida: deve começar com o caractere %(prefix_chars)r" @@ -2504,7 +2553,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "espelho '%s' não termina com 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "argumentos mutuamente exclusivos devem ser opcional" @@ -2518,7 +2567,7 @@ msgid "no APK supplied" msgstr "nenhum APK fornecido" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "não tem tal opção: %s" @@ -2532,13 +2581,13 @@ msgid "no version information found" msgstr "nenhuma informação de versão encontrada" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "não é permitido com o argumento %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "um dos argumentos %s é necessário" @@ -2553,55 +2602,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "opção %s: se realmente deseja instalar todas as apps assinadas, use --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "Opção %s: valor %s inválido: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "opção %s: escolha inválida: %r (escolha entre %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "opção -%s não reconhecida" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "opção -%s requer um argumento" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "opção --%s não pode ter argumento" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "opção --%s não é prefixo único" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "opção --%s não reconhecida" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "opção --%s necessita argumento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "argumentos opcionais" @@ -2611,7 +2660,7 @@ msgid "overwriting existing {path}" msgstr "sobrescrevendo {path} existente" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "argumentos posicionais" @@ -2640,6 +2689,10 @@ msgstr "repo_icon \"repo/icons/%s\" não existe, a gerar um espaço reservado." msgid "repo_icon %s does not exist, generating placeholder." msgstr "repo_icon %s não existe, a gerar um espaço reservado." +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "o ruamel.yaml não está instalado, não é possível escrever metadados." @@ -2659,13 +2712,14 @@ msgid "shared library" msgstr "biblioteca compartilhada" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "mostrar versão do programa e sair" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "mostrar esta ajuda e sair" @@ -2700,25 +2754,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "o valor do data-hora fornecido ('{timestamp}') não está no formato timestamp unix" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "os seguintes argumentos são necessários: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "opção de cadeia de texto inesperada: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "O formato '%(parser_name)r' é desconhecido. (Opções Válidas: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "argumentos não reconhecidos: %s" @@ -2730,6 +2784,7 @@ msgstr "permissões inseguras em '{config_file}' (deveria ser 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "utilização: " @@ -2858,7 +2913,7 @@ msgstr "{name} \"{section}/icons/{path}\" não existe! Corrija-o no \"config.yml msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} está obsoleto, use {newfile}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} já existe, a ignorar os resultados das importações!" @@ -2893,7 +2948,7 @@ msgstr "{path}: {error}" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} não termina com \"fdroid\", verifique o caminho na URL!" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} não começa com \"http\"!" diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 77519d45..05458c80 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2022-05-10 03:07+0000\n" "Last-Translator: Flavio F. M. \n" "Language-Team: Portuguese (Brazil) \n" @@ -114,13 +114,13 @@ msgstr "\"{path}\" não é um formato aceito, converter para: {formats}" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\" é assinado por uma chave que não é permitida:" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" não é uma URL válida!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -133,7 +133,7 @@ msgid "%(prog)s [options] url" msgstr "%(prog)s [opções] url" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: erro: %(message)s\n" @@ -144,12 +144,12 @@ msgid "%d problems found" msgstr "%d problemas encontrados" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [opções]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "%r não é chamável" @@ -160,7 +160,7 @@ msgid "%s is not an accepted build field" msgstr "%s não é um campo criado aceito" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "opção %s não leva um valor" @@ -186,7 +186,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' não encontrada em config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' é um argumento inválido para posicionadores" @@ -242,7 +242,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate falhou para {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() não definida" @@ -283,7 +283,7 @@ msgstr "Adicionando novo repositório para apenas {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias (apelido) da chave de assinatura do repositório na keystore" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Permite que uma revisão diferente (ou árvore do git) seja especificada para a importação inicial" @@ -479,7 +479,7 @@ msgstr "Verificar o arquivamento de {appid} - apks:{integer}, keepversions:{keep msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Atualização limpa - não utiliza o cache, reprocessa todos os APKs" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Lista de categorias separadas por vírgula." @@ -506,11 +506,11 @@ msgstr "Arquivos de configuração conflitantes! Usando {newfile}, ignorando {ol msgid "Could not find '{command}' on your system" msgstr "Impossível encontrar '{command}' em seu sistema" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Não foi possível encontrar o código da versão mais recente" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Não foi possível encontrar o nome da versão mais recente" @@ -530,7 +530,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Não foi possível analisar o tamanho \"{size}\", tipo incorreto \"{type}\"" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Não foi possível encontrar o ID do aplicativo" @@ -647,7 +647,7 @@ msgstr "Descrição tem uma lista (%s), mas não é com marcadores (*) nem numer msgid "Description of length {length} is over the {limit} char limit" msgstr "A descrição de tamanho {length} está acima do limite de {limit} caracteres" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Não adicione \"disable:\" para as entradas de compilação geradas" @@ -737,6 +737,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERRO: tipo de IC não suportado, correções bem-vindas!" +#: ../fdroidserver/nightly.py +#, fuzzy, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "ERRO: tipo de IC não suportado, correções bem-vindas!" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -768,9 +773,14 @@ msgid "Error while attempting to publish log: %s" msgstr "Erro ao tentar publicar o registro: %s" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Erro ao obter o endereço do repositório" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Extrair assinaturas de APKs" @@ -1254,6 +1264,11 @@ msgstr "Espelhos de repositórios malformados." msgid "Malformed serverwebroot line:" msgstr "Linha mal-formada do 'serverwebroot':" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Espelha todo o repositório e pacotes, todos os tipos de arquivos." @@ -1267,6 +1282,10 @@ msgstr "Diretório de saída ausente" msgid "Name '%s' is just the auto name - remove it" msgstr "O nome '%s' é apenas o nome automático - remova-o" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "Nenhum 'config.yml' encontrado, usando padrões." @@ -1305,11 +1324,12 @@ msgstr "Nenhuma impressão digital (fingerprint) no URL." msgid "No git submodules available" msgstr "Nenhum Submódulo Git disponível" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Nenhum projeto gradle foi encontrado. Especifique --subdir?" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Nenhuma informação encontrada." @@ -1433,7 +1453,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Os métodos de doação opencollective pertencem ao campo OpenCollective" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "Opções" @@ -1451,7 +1471,7 @@ msgstr "Emite JSON para stdout (saída padrão)." msgid "Outputting JSON" msgstr "Emitindo JSON" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Licença geral do projeto." @@ -1460,7 +1480,7 @@ msgstr "Licença geral do projeto." msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Substituindo versionName em branco em {apkfilename} dos metadados: {version}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "O pacote \"{appid}\" já existe" @@ -1474,7 +1494,7 @@ msgstr "Manifesto de análise no '{path}'" msgid "Password required with username" msgstr "Senha requerida com nome de usuário" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Caminho para os principais subdiretórios do projeto android, se não estiver na raiz (root)." @@ -1497,6 +1517,11 @@ msgstr "Caminho até a keystore para a chave de assinatura do repositório" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Imprima a variável secreta no terminal para facilitar a cópia/colagem" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1529,7 +1554,7 @@ msgstr "Produzir XML/JSON legível por humanos para arquivos de índice" msgid "Produce human-readable index.xml" msgstr "Produz um index.xml legível por humanos" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "URL do projeto para importar." @@ -1666,6 +1691,11 @@ msgstr "Verifique os APKs resultantes na busca das classes não gratuitas já co msgid "Scan the source code of a package" msgstr "Percorre o código-fonte de um pacote" +#: ../fdroidserver/scanner.py +#, fuzzy, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "O scanner encontrou {count} problemas em {appid}:" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1686,6 +1716,11 @@ msgstr[1] "O Scanner encontrou {} problemas" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Verifique os APKs resultantes na busca das classes não-livres já conhecidas." +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "Verifique os APKs resultantes na busca das classes não-livres já conhecidas." + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1863,7 +1898,7 @@ msgstr "Estas são as aplicações que foram arquivadas a partir do repositório msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Este é um repositório de aplicativos a serem usados com o F-Droid. Os aplicativos neste repositório são binários oficiais compilados pelos desenvolvedores do aplicativo original ou são binários compilados a partir da fonte por f-droid.org usando as ferramentas em https://gitlab.com/fdroid." -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Este repositório já tem metadados locais: %s" @@ -2104,12 +2139,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "Enviando o {apkfilename} para o virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "Uso" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Uso: %s\n" @@ -2221,13 +2256,13 @@ msgid "adding to {name}: {path}" msgstr "adicionando a {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opção ambígua: %(option)s pode corresponder a %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "opção ambígua: %s (%s?)" @@ -2266,8 +2301,12 @@ msgstr "applicationId para verificar se há atualizações" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId com versionCode opcional na forma APPID[:VERCODE]" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argumento \"-\" com o modo %r" @@ -2284,6 +2323,11 @@ msgstr "tentativa de conexão nua por SSH para testar a implantação da chave:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "não é possível analisar a especificação scrlib (não uma string): '{}'" +#: /usr/lib/python3.9/argparse.py +#, fuzzy, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "não foi possível abrir \"%s\": %s" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2296,12 +2340,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "não é possível encontrar os srclibs necessários: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "não é possível ter vários argumentos de subparser" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "não é possível unir ações - dois grupos são denominados %r" @@ -2324,12 +2368,12 @@ msgid "commands from plugin modules:" msgstr "comandos a partir dos módulos de plugin:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "complexo" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2380,7 +2424,7 @@ msgid "deployed process log {path} to {dest}" msgstr "registro de processo implantado {path} para {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest = é necessário para opções como %r" @@ -2390,7 +2434,7 @@ msgid "executable binary, possibly code" msgstr "binário executável, possivelmente código" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2398,17 +2442,17 @@ msgstr[0] "foi previsto %s argumento" msgstr[1] "foi previsto %s argumentos" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "esperado pelo menos um argumento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "esperado um argumento no máximo" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "esperado um argumento" @@ -2426,7 +2470,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "ponto flutuante" @@ -2447,7 +2491,7 @@ msgid "gzip file archive" msgstr "arquivo gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "argumento explícito %r ignorado" @@ -2456,31 +2500,36 @@ msgstr "argumento explícito %r ignorado" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 deve ter uma assinatura, use ' fdroid signindex ' para criá-lo!" +#: ../fdroidserver/index.py +#, fuzzy +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "index-v1 deve ter uma assinatura, use ' fdroid signindex ' para criá-lo!" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "inteiro" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valor inválido do tipo %(type)s: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "opção inválida: %(value)r (escolha de %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valor conflict_resolution inválido: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "Opção cadeia %(option)r inválida: deve começar com o caractere %(prefix_chars)r" @@ -2509,7 +2558,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "espelho '%s' não termina com 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "argumentos mutuamente exclusivos devem ser opcional" @@ -2523,7 +2572,7 @@ msgid "no APK supplied" msgstr "nenhum APK fornecido" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "não tem tal opção: %s" @@ -2537,13 +2586,13 @@ msgid "no version information found" msgstr "nenhuma informação de versão encontrada" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "não é permitido com o argumento %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "um dos argumentos %s é necessário" @@ -2558,55 +2607,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "opção %s: se você realmente deseja instalar todas as apps assinadas, use --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "Opção %s: valor %s inválido: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "opção %s: escolha inválida: %r (escolha entre %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "opção -%s não reconhecida" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "a opção -%s necessita de argumento" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "opção --%s não pode ter argumento" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "opção --%s não é prefixo único" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "opção --%s não reconhecida" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "opção --%s necessita argumento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "argumentos opcionais" @@ -2616,7 +2665,7 @@ msgid "overwriting existing {path}" msgstr "sobrescrevendo {path} existente" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "argumentos posicionais" @@ -2645,6 +2694,10 @@ msgstr "repo_icon \"repo/icons/%s\" não existe, gerando um espaço reservado." msgid "repo_icon %s does not exist, generating placeholder." msgstr "repo_icon %s não existe, gerando um espaço reservado." +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "o ruamel.yaml não está instalado, não é possível escrever os metadados." @@ -2664,13 +2717,14 @@ msgid "shared library" msgstr "biblioteca compartilhada" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "mostra o número da versão do programa e sai" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "mostra esta mensagem de ajuda e sai" @@ -2705,25 +2759,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "O valor da data-hora fornecido ('{timestamp}') não está no formato timestamp unix" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "os seguintes argumentos são necessários: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "opção de cadeia de texto inesperada: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "O formato '%(parser_name)r' é desconhecido. (Opções Válidas: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "argumentos não reconhecidos: %s" @@ -2735,6 +2789,7 @@ msgstr "permissões inseguras em '{config_file}' (deveria ser 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "uso: " @@ -2863,7 +2918,7 @@ msgstr "{name} \"{section}/icons/{path}\" não existe! Corrija-o no \"config.yml msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} foi descontinuado, use {newfile}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "o {path} já existe, ignorando os resultados de importação!" @@ -2898,7 +2953,7 @@ msgstr "Falha ao copiar {path}: {error}" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} não termina com \"fdroid\", verifique o caminho na URL!" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "a {url} não começa com \"http\"!" diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index f63a02ee..ef2ebf00 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Portuguese (Portugal) \n" @@ -110,13 +110,13 @@ msgstr "\"{path}\" não é um formato aceito, converter para: {formats}" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" não é uma URL válida!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -129,7 +129,7 @@ msgid "%(prog)s [options] url" msgstr "%(prog)s [opções] url" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: erro: %(message)s\n" @@ -140,12 +140,12 @@ msgid "%d problems found" msgstr "%d problemas encontrados" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [opções]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "%r não pode ser invocado" @@ -156,7 +156,7 @@ msgid "%s is not an accepted build field" msgstr "%s não é um campo criado aceito" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "opção %s não leva um valor" @@ -182,7 +182,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' não encontrada em config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' é um argumento inválido para posicionadores" @@ -238,7 +238,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate falhou para {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() não definida" @@ -279,7 +279,7 @@ msgstr "Adicionando novo repositório para apenas {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias (apelido) da chave de assinatura do repositório na keystore" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Permite que uma revisão diferente (ou árvore do git) seja especificada para a importação inicial" @@ -475,7 +475,7 @@ msgstr "A verificar o arquivamento para {appid} - apks:{integer}, keepversions:{ msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Atualização limpa - não usa cache, reprocessa todos os APKs" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Lista de categorias separadas por vírgula." @@ -502,11 +502,11 @@ msgstr "Ficheiros de configuração conflitantes! Usando {newfile}, ignorando {o msgid "Could not find '{command}' on your system" msgstr "Não foi possível encontrar '{command}' no seu sistema" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Não foi possível encontrar o código de versão mais recente" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Não foi possível encontrar o nome da versão mais recente" @@ -526,7 +526,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Não foi possível analisar o tamanho \"{size}\", tipo \"{type}\" incorreto" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Não foi possível encontrar o ID da aplicação" @@ -644,7 +644,7 @@ msgstr "A descrição tem a lista (%s), mas não tem marcadores (*), nem é nume msgid "Description of length {length} is over the {limit} char limit" msgstr "A descrição de comprimento {length} é sobre o limite de char {limit}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Não adicionar 'disable:' às entradas de compilação geradas" @@ -734,6 +734,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERRO: tipo de CI sem suporte, patches são bem-vindos!" +#: ../fdroidserver/nightly.py +#, fuzzy, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "ERRO: tipo de CI sem suporte, patches são bem-vindos!" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -765,9 +770,14 @@ msgid "Error while attempting to publish log: %s" msgstr "Erro ao tentar publicar o log: %s" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Erro ao obter o endereço do repo" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Extrato de assinaturas de APKs" @@ -1254,6 +1264,11 @@ msgstr "Espelhos de repositório malformados." msgid "Malformed serverwebroot line:" msgstr "Linha de serverwebroot malformada:" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Espelha todo o repositório e pacotes, todos os tipos de ficheiros." @@ -1267,6 +1282,10 @@ msgstr "Falta diretório de saída" msgid "Name '%s' is just the auto name - remove it" msgstr "O nome '%s' é apenas o nome automático - remover" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "'config.yml' não encontrado, utilizando as predefinições." @@ -1305,11 +1324,12 @@ msgstr "Nenhuma impressão digital no URL." msgid "No git submodules available" msgstr "Não há submódulos git disponíveis" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Não foi possível encontrar nenhum projeto de gradle. Especificar --subdir?" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Nenhuma informação encontrada." @@ -1434,7 +1454,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Os métodos de doação OpenCollective pertencem no campo OpenCollective:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "Opções" @@ -1452,7 +1472,7 @@ msgstr "Saída de JSON para stdout." msgid "Outputting JSON" msgstr "Saída do JSON" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Licença geral do projeto." @@ -1461,7 +1481,7 @@ msgstr "Licença geral do projeto." msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Substituindo versionName em branco em {apkfilename} dos metadados: {version}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "O pacote \"{appid}\" já existe" @@ -1475,7 +1495,7 @@ msgstr "Analisando o manifesto em '{path}'" msgid "Password required with username" msgstr "Palavra-passe necessária com o nome de utilizador" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Caminho para o subdiretório principal do projeto Android, se não estiver na raiz." @@ -1498,6 +1518,11 @@ msgstr "Caminho até a keystore para a chave de assinatura do repositório" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Imprimir a variável secreta para o terminal para copiar/colar fácilmente" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1530,7 +1555,7 @@ msgstr "Produzir XML/JSON legível por humanos para ficheiros de índice" msgid "Produce human-readable index.xml" msgstr "Criação human-readable index.xml" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "URL do projeto para importar." @@ -1667,6 +1692,11 @@ msgstr "Procure no(s) APK(s) resultante(s) por classes conhecidas não livres." msgid "Scan the source code of a package" msgstr "Analisar o código fonte de um pacote" +#: ../fdroidserver/scanner.py +#, fuzzy, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "O scanner encontrou {count} problemas em {appid}:" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1688,6 +1718,11 @@ msgstr[1] "Scanner encontrou {} problemas" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Procure no(s) APK(s) resultante(s) por classes conhecidas não livres." +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "Procure no(s) APK(s) resultante(s) por classes conhecidas não livres." + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1865,7 +1900,7 @@ msgstr "Estas são as aplicações que foram arquivadas do repositório principa msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Este é um repositório de apps a serem usados com o F-Droid. Aplicações neste repositório são binários oficiais compilados pelos programadores da aplicação original ou são binários compilados da fonte por f-droid.org a usar as ferramentas em https://gitlab.com/fdroid." -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Este repositório já tem metadados locais: %s" @@ -2099,12 +2134,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "A enviar {apkfilename} ao virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "Utilização" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Utilização: %s\n" @@ -2216,13 +2251,13 @@ msgid "adding to {name}: {path}" msgstr "adicionando a {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opção ambígua: %(option)s poderia corresponder %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "opção ambígua: %s (%s?)" @@ -2261,8 +2296,12 @@ msgstr "applicationId para verificar se há atualizações" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId com versionCode opcional na forma APPID[:VERCODE]" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argumento \"-\" com o modo %r" @@ -2279,6 +2318,11 @@ msgstr "tentativa de conexão nua por SSH para testar a implantação da chave:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "não é possível analisar as especificações do scrlib (não é uma cadeia): '{}'" +#: /usr/lib/python3.9/argparse.py +#, fuzzy, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "não dá pra abrir '%s': %s" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2291,12 +2335,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "não é possível encontrar os srclibs necessários: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "não é possível ter vários argumentos de subparser" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "não é possível unir ações - dois grupos são denominados %r" @@ -2319,12 +2363,12 @@ msgid "commands from plugin modules:" msgstr "comandos dos módulos de plugin:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "complexo" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2375,7 +2419,7 @@ msgid "deployed process log {path} to {dest}" msgstr "registo de processo implantado {path} a {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest = é necessário para opções como %r" @@ -2385,7 +2429,7 @@ msgid "executable binary, possibly code" msgstr "binário executável, possivelmente código" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2393,17 +2437,17 @@ msgstr[0] "%s argumento esperado" msgstr[1] "%s argumentos esperados" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "esperado pelo menos um argumento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "esperado um argumento no máximo" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "esperado um argumento" @@ -2421,7 +2465,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "ponto flutuante" @@ -2442,7 +2486,7 @@ msgid "gzip file archive" msgstr "arquivo de ficheiros gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "argumento explícito %r ignorado" @@ -2451,31 +2495,36 @@ msgstr "argumento explícito %r ignorado" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 deve ter uma assinatura, use ' fdroid signindex ' para criá-lo!" +#: ../fdroidserver/index.py +#, fuzzy +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "index-v1 deve ter uma assinatura, use ' fdroid signindex ' para criá-lo!" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "inteiro" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valor inválido do tipo %(type)s: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "opção inválida: %(value)r (escolha de %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valor conflict_resolution inválido: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "Opção cadeia %(option)r inválida: deve começar com o caractere %(prefix_chars)r" @@ -2504,7 +2553,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "espelho '%s' não termina com 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "argumentos mutuamente exclusivos devem ser opcional" @@ -2518,7 +2567,7 @@ msgid "no APK supplied" msgstr "nenhum APK fornecido" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "não tem tal opção: %s" @@ -2532,13 +2581,13 @@ msgid "no version information found" msgstr "não há informações de versão encontrada" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "não é permitido com o argumento %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "um dos argumentos %s é necessário" @@ -2553,55 +2602,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "opção %s: se realmente deseja instalar todas as apps assinadas, use --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "Opção %s: valor %s inválido: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "opção %s: escolha inválida: %r (escolha entre %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "opção -%s não reconhecida" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "opção -%s requer um argumento" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "opção --%s não pode ter argumento" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "opção --%s não é prefixo único" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "opção --%s não reconhecida" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "opção --%s necessita argumento" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "argumentos opcionais" @@ -2611,7 +2660,7 @@ msgid "overwriting existing {path}" msgstr "sobrescrevendo {path} existente" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "argumentos posicionais" @@ -2640,6 +2689,10 @@ msgstr "repo_icon \"repo/icons/%s\" não existe, a gerar um espaço reservado." msgid "repo_icon %s does not exist, generating placeholder." msgstr "repo_icon %s não existe, a gerar um espaço reservado." +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "o ruamel.yaml não está instalado, não é possível escrever metadados." @@ -2659,13 +2712,14 @@ msgid "shared library" msgstr "biblioteca compartilhada" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "mostrar versão do programa e sair" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "mostrar esta ajuda e sair" @@ -2700,25 +2754,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "O valor do data-hora fornecido ('{timestamp}') não está no formato timestamp unix." #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "os seguintes argumentos são necessários: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "opção de cadeia de texto inesperada: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "O formato '%(parser_name)r' é desconhecido. (Opções Válidas: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "argumentos não reconhecidos: %s" @@ -2730,6 +2784,7 @@ msgstr "permissões inseguras em '{config_file}' (deveria ser 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "utilização: " @@ -2858,7 +2913,7 @@ msgstr "{name} \"{section}/icons/{path}\" não existe! Corrija-o no \"config.yml msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} está obsoleto, use {newfile}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} já existe, a ignorar os resultados das importações!" @@ -2893,7 +2948,7 @@ msgstr "Falha ao copiar {path}: {error}" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} não termina com \"fdroid\", verifique o caminho na URL!" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} não começa com \"http\"!" diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 1cce9e5c..d9966a9e 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2022-03-03 02:51+0000\n" "Last-Translator: Simona Iacob \n" "Language-Team: Romanian \n" @@ -109,13 +109,13 @@ msgstr "\"{path}\" nu este un format acceptat, convertiți în: {formats}" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\" \"{path}\" este semnat de o cheie care nu este permisă:" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" nu este un URL valid!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -129,7 +129,7 @@ msgid "%(prog)s [options] url" msgstr "%(prog)s [opțiuni] url" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: eroare: %(message)s\n" @@ -140,12 +140,12 @@ msgid "%d problems found" msgstr "%d probleme găsite" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [opțiuni]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "%r nu este apelabil" @@ -156,7 +156,7 @@ msgid "%s is not an accepted build field" msgstr "%s nu este un câmp de construcție acceptat" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "Opțiunea %s nu acceptă o valoare" @@ -182,7 +182,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' nu se găsește în config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' este un argument invalid pentru poziționale" @@ -238,7 +238,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate a eșuat pentru {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() nu este definit" @@ -279,7 +279,7 @@ msgstr "Adăugarea unui nou depozit doar pentru {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias al cheii de semnare repo din magazinul de chei" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Permite specificarea unei revizuiri diferite (sau a unei ramuri git) pentru importul inițial" @@ -476,7 +476,7 @@ msgstr "Verificarea arhivării pentru {appid} - apks:{integer}, keepversions:{ke msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Actualizare curată - nu folosește memoria cache, reprocesează toate APK-urile" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Lista de categorii separate prin virgulă." @@ -503,11 +503,11 @@ msgstr "Fișiere de configurare conflictuale! Folosind {newfile}, ignorând {old msgid "Could not find '{command}' on your system" msgstr "Nu a putut găsi '{command}' pe sistemul dvs" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Nu a putut găsi codul ultimei versiuni" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Nu a putut găsi numele celei mai recente versiuni" @@ -527,7 +527,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Nu a putut analiza dimensiunea \"{size}\", tip greșit \"{type}\"" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Nu s-a putut găsi ID-ul aplicației" @@ -644,7 +644,7 @@ msgstr "Descrierea are o listă (%s), dar nu este punctată (*) și nici numerot msgid "Description of length {length} is over the {limit} char limit" msgstr "Descrierea lungimii {length} este peste limita {limit} limitei de caractere" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Nu adăugați \"disable:\" la intrările de construcție generate" @@ -734,6 +734,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERROR: tip CI neacceptat, patch-uri binevenite!" +#: ../fdroidserver/nightly.py +#, fuzzy, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "ERROR: tip CI neacceptat, patch-uri binevenite!" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -765,9 +770,14 @@ msgid "Error while attempting to publish log: %s" msgstr "Eroare la încercarea de a publica jurnalul: %s" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Eroare la obținerea adresei repo" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Extrageți semnăturile din APK-uri" @@ -1251,6 +1261,11 @@ msgstr "Oglinzi de depozit malformate." msgid "Malformed serverwebroot line:" msgstr "Linie de root a serverului web deformată:" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Oglindește întregul repo și arhiva, toate tipurile de fișiere." @@ -1264,6 +1279,10 @@ msgstr "Lipsește directorul de ieșire" msgid "Name '%s' is just the auto name - remove it" msgstr "Numele \"%s\" este doar un nume auto - eliminați-l" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "Nu s-a găsit niciun 'config.yml', se folosesc valorile implicite." @@ -1302,11 +1321,12 @@ msgstr "Nu există amprente în URL." msgid "No git submodules available" msgstr "Nu există submodule git disponibile" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Nu a putut fi găsit niciun proiect gradle. Specificați --subdir?" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Nu s-au găsit informații." @@ -1430,7 +1450,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Metodele de donație OpenCollective aparțin OpenCollective: câmp" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "Opțiuni" @@ -1448,7 +1468,7 @@ msgstr "Emite JSON către stdout." msgid "Outputting JSON" msgstr "Ieșirea JSON" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Licența generală a proiectului." @@ -1457,7 +1477,7 @@ msgstr "Licența generală a proiectului." msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Suprascrierea versiunii goale VersionName în {apkfilename} din metadate: {version}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "Pachetul \"{appid}\" există deja" @@ -1471,7 +1491,7 @@ msgstr "Analiza manifestului la '{path}'" msgid "Password required with username" msgstr "Parola este necesară cu numele de utilizator" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Calea de acces la subdirectorul principal al proiectului Android, dacă nu se află în root." @@ -1494,6 +1514,11 @@ msgstr "Calea către depozitul de chei pentru cheia de semnare a repo-ului" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Tipărește variabila secretă în terminal pentru un ușor copy/paste" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1526,7 +1551,7 @@ msgstr "Producerea de fișiere XML/JSON lizibile de către om pentru fișierele msgid "Produce human-readable index.xml" msgstr "Produce index.xml lizibil pentru oameni" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "URL-ul proiectului din care se importă." @@ -1663,6 +1688,11 @@ msgstr "Scanați APK-ul (APK-urile) rezultat(e) pentru clasele cunoscute care nu msgid "Scan the source code of a package" msgstr "Scanarea codului sursă al unui pachet" +#: ../fdroidserver/scanner.py +#, fuzzy, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "Scanerul a găsit {count} probleme în {appid}:" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1684,6 +1714,11 @@ msgstr[2] "Scannerul a găsit {} probleme" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Scanarea APK cu apkanalyzer pentru clasele non-libere cunoscute." +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "Scanarea APK cu apkanalyzer pentru clasele non-libere cunoscute." + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1861,7 +1896,7 @@ msgstr "Acestea sunt aplicațiile care au fost arhivate din depozitul principal. msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Acesta este un depozit de aplicații care pot fi utilizate cu F-Droid. Aplicațiile din acest depozit sunt fie binare oficiale construite de către dezvoltatorii aplicațiilor originale, fie binare construite din sursă de către administratorul f-droid.org folosind instrumentele de pe https://gitlab.com/fdroid." -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Acest depozit are deja metadate locale: %s" @@ -2102,12 +2137,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "Încărcarea {apkfilename} la virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "Utilizare" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Utilizare: %s\n" @@ -2219,13 +2254,13 @@ msgid "adding to {name}: {path}" msgstr "adăugând la {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opțiune ambiguă: %(option)s ar putea corespunde cu %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "opțiune ambiguă: %s (%s?)" @@ -2264,8 +2299,12 @@ msgstr "applicationId pentru a verifica dacă există actualizări" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId cu versionCode opțional sub forma APPID[:VERCODE]" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argumentul \"-\" cu modul %r" @@ -2282,6 +2321,11 @@ msgstr "încercând o conexiune ssh goală pentru a testa cheia de implementare: msgid "can not parse scrlib spec (not a string): '{}'" msgstr "nu poate analiza specificația scrlib (not a string): '{}'" +#: /usr/lib/python3.9/argparse.py +#, fuzzy, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "nu se poate deschide '%s': %s" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2294,12 +2338,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "nu poate găsi srclibs necesare: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "nu poate avea mai multe argumente subparser" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "nu poate fuziona acțiuni - două grupuri se numesc %r" @@ -2322,12 +2366,12 @@ msgid "commands from plugin modules:" msgstr "comenzi din modulele plugin:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "complexă" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2379,7 +2423,7 @@ msgid "deployed process log {path} to {dest}" msgstr "a implementat jurnalul de proces {path} la {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= este necesar pentru opțiuni precum %r" @@ -2389,7 +2433,7 @@ msgid "executable binary, possibly code" msgstr "binar executabil, eventual cod" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2398,17 +2442,17 @@ msgstr[1] "argumente %s așteptate" msgstr[2] "argumente %s așteptate" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "se așteaptă cel puțin un argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "se așteaptă cel mult un argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "se așteaptă un singur argument" @@ -2426,7 +2470,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "punct flotant" @@ -2447,7 +2491,7 @@ msgid "gzip file archive" msgstr "Arhiva de fișiere gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "a ignorat argumentul explicit %r" @@ -2456,31 +2500,36 @@ msgstr "a ignorat argumentul explicit %r" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 trebuie să aibă o semnătură, folosiți `fdroid signindex` pentru a o crea!" +#: ../fdroidserver/index.py +#, fuzzy +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "index-v1 trebuie să aibă o semnătură, folosiți `fdroid signindex` pentru a o crea!" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "întreg" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "invalid %(type)s valoare: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "alegere invalidă: %(value)r (alege din %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valoare invalidă a rezoluției_conflictului: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "șir de opțiuni invalid %(option)r: trebuie să înceapă cu un caracter %(prefix_chars)r" @@ -2509,7 +2558,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "oglinda '%s' nu se termină cu 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "argumentele care se exclud reciproc trebuie să fie opționale" @@ -2523,7 +2572,7 @@ msgid "no APK supplied" msgstr "nici un APK furnizat" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "nu există o astfel de opțiune: %s" @@ -2537,13 +2586,13 @@ msgid "no version information found" msgstr "nu s-au găsit informații despre versiune" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "nu este permis cu argumentul %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "unul dintre argumentele %s este necesar" @@ -2558,55 +2607,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "opțiunea %s: Dacă doriți cu adevărat să instalați toate aplicațiile semnate, utilizați --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "opțiunea %s: valoare %s invalidă: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "opțiunea %s: alegere invalidă: %r (alege din %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "opțiunea -%s nerecunoscută" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "opțiunea -%s necesită argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "opțiunea --%s nu trebuie să aibă un argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "opțiunea --%s nu este un prefix unic" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "opțiunea --%s nerecunoscută" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "opțiunea --%s necesită un argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "argumente opționale" @@ -2616,7 +2665,7 @@ msgid "overwriting existing {path}" msgstr "suprascriere {path} existent" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "argumente poziționale" @@ -2645,6 +2694,10 @@ msgstr "repo_icon \"repo/icons/%s\" nu există, se generează un înlocuitor." msgid "repo_icon %s does not exist, generating placeholder." msgstr "repo_icon %s nu există, se generează un spațiu rezervat." +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml nu este instalat, nu poate scrie metadatele." @@ -2664,13 +2717,14 @@ msgid "shared library" msgstr "bibliotecă partajată" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "arată numărul versiunii programului și iese" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "arată acest mesaj de ajutor și iese" @@ -2705,25 +2759,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "valoarea timestamp furnizată '{timestamp}' nu este un timestamp unix" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "sunt necesare următoarele argumente: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "șir de opțiuni neașteptate: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "parser necunoscut %(parser_name)r (choices: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "argumente nerecunoscute: %s" @@ -2735,6 +2789,7 @@ msgstr "permisiuni nesigure pe '{config_file}' (ar trebui să fie 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "utilizare: " @@ -2864,7 +2919,7 @@ msgstr "{name} \"{section}/icons/{path}\" nu există! Verificați \"config.yml\" msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} este depreciat, folosiți {newfile}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} există deja, ignorând rezultatele importului!" @@ -2899,7 +2954,7 @@ msgstr "{path}: {error}" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} nu se termină cu \"fdroid\", verificați calea URL!" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} nu începe cu \"http\"!" diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index ecf04d5d..48772b2c 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2022-02-16 15:13+0000\n" "Last-Translator: Andrey \n" "Language-Team: Russian \n" @@ -116,13 +116,13 @@ msgstr "формат пути \"{path}\" не принимается, преоб msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\" подписан ключом, который не разрешен:" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" — не корректный URL!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -136,7 +136,7 @@ msgid "%(prog)s [options] url" msgstr "%(prog)s [параметры] URL" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: ошибка: %(message)s\n" @@ -147,12 +147,12 @@ msgid "%d problems found" msgstr "найдено %d ошибок" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [параметры]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "к %r нельзя обратиться" @@ -163,7 +163,7 @@ msgid "%s is not an accepted build field" msgstr "%s не является допустимым полем" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "%s параметр не принимает значений" @@ -189,7 +189,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "В config.yml нет переменной 'repo_ keyalias'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' не годится в качестве позиционного аргумента" @@ -245,7 +245,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate для {appid} завершился ошибкой: {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() не определен" @@ -286,7 +286,7 @@ msgstr "Добавление нового репозитория только д msgid "Alias of the repo signing key in the keystore" msgstr "Алиас для ключа для подписи репозитория в хранилище ключей" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Позволяет выбрать разные ревизии или ветки для первичного импорта" @@ -483,7 +483,7 @@ msgstr "Проверка перед помещением в архив для {a msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Очистка с обновлением: не использовать кэш, повторно сгенерировать все APK" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Категории перечислены через запятую." @@ -510,11 +510,11 @@ msgstr "Конфликтуюущие файлы настроек! {newfile} — msgid "Could not find '{command}' on your system" msgstr "В вашей системе недоступна команда '{command}'" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Не удалось найти последнюю версию приложения (versionCode)" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Не удалось найти название последней версии" @@ -534,7 +534,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Не удалось разобрать размер «{size}», неверный тип «{type}»" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Не удалось найти Application ID" @@ -651,7 +651,7 @@ msgstr "В описании есть неразмеченный список (%s msgid "Description of length {length} is over the {limit} char limit" msgstr "Описание {length} превышает лимит по количеству знаков {limit}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Не добавлять 'disable:' к сгенерированным данным сборки" @@ -741,6 +741,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ОШИБКА: этот тип CI не поддерживается, налаживайте и присылайте патчи!" +#: ../fdroidserver/nightly.py +#, fuzzy, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "ОШИБКА: этот тип CI не поддерживается, налаживайте и присылайте патчи!" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -772,9 +777,14 @@ msgid "Error while attempting to publish log: %s" msgstr "Ошибка во время публикации лога: %s" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Ошибка при получении адреса репозитория" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Извлечь подписи из APK файлов" @@ -1258,6 +1268,11 @@ msgstr "Неверные адреса зеркал для репозитория msgid "Malformed serverwebroot line:" msgstr "Неверный путь serverwebroot:" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Создать зеркало всего репозитория и архива, включая все типы файлов." @@ -1271,6 +1286,10 @@ msgstr "Директории для хранения выводных данны msgid "Name '%s' is just the auto name - remove it" msgstr "Удалите автоматически сгенерированное имя приложения '%s'" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "Файл 'config.yml' не обнаружен. Используется конфигурация по умолчанию." @@ -1309,11 +1328,12 @@ msgstr "URL-адрес не содержит идентификационной msgid "No git submodules available" msgstr "Модулей Git не обнаружено" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Проект gradle не найден. Возможно, нужно указать его в параметре --subdir?" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Информация о репозитории неверна." @@ -1437,7 +1457,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Cсылка на пожертвования через OpenCollective должна быть в поле «OpenCollective:»" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "Параметры" @@ -1455,7 +1475,7 @@ msgstr "Вывести JSON в stdout." msgid "Outputting JSON" msgstr "Выводится JSON" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Основная лицензия проекта." @@ -1464,7 +1484,7 @@ msgstr "Основная лицензия проекта." msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Заменить пустое значение versionName в {apkfilename} значением из метаданных: {version}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "Пакет {appid}\" уже существует" @@ -1478,7 +1498,7 @@ msgstr "Чтение манифеста: '{path}'" msgid "Password required with username" msgstr "Необходимо указать не только имя пользователя, но и пароль" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Путь к рабочей директории проекта Android (если она не в его корне)." @@ -1501,6 +1521,11 @@ msgstr "Путь к хранилищу с ключом для подписыва msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Отобразить секретную переменную в терминале (чтобы ее было легче скопировать и вставить)" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1533,7 +1558,7 @@ msgstr "Отобразить XML/JSON для индекс файлов в удо msgid "Produce human-readable index.xml" msgstr "Создать удобочитаемый файл index.xml" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "URL-адрес проекта для импорта." @@ -1670,6 +1695,11 @@ msgstr "Проскандировать получившиеся APK на изв msgid "Scan the source code of a package" msgstr "Сканировать исходный код пакета" +#: ../fdroidserver/scanner.py +#, fuzzy, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "Сканирование обнаружило {count} ошибок в {appid}:" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1691,6 +1721,11 @@ msgstr[2] "Сканирование обнаружило {} ошибок" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Сканирование APK с помощью apkanalyzer на наличие известных несвободных классов." +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "Сканирование APK с помощью apkanalyzer на наличие известных несвободных классов." + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1868,7 +1903,7 @@ msgstr "Это те приложения, которые были заархив msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Это репозиторий приложений, предназначенных для использования в FDroid. Приложения в этом репозитории являются либо официальными бинарными файлами, созданными разработчиками оригинального приложения, либо бинарными файлами, созданными f-droid.org из исходного кода с помощью инструментов на https://gitlab.com/fdroid." -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Локальная копия метаданных репозитория уже существует: %s" @@ -2109,12 +2144,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "Загрузка {apkfilename} на virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "Использование" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Использование: %s\n" @@ -2226,13 +2261,13 @@ msgid "adding to {name}: {path}" msgstr "добавление в {name}:{path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "неоднозначный выбор: %(option)s совпадает с %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "неоднозначный выбор: %s (%s?)" @@ -2271,8 +2306,12 @@ msgstr "applicationId для проверки обновлений" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId и внутренняя версия приложения (versionCode) в виде APPID[:VERCODE]" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "аргумент \"-\" c режимом %r" @@ -2289,6 +2328,11 @@ msgstr "попытка установить SSH соединение для пр msgid "can not parse scrlib spec (not a string): '{}'" msgstr "не удалось разобрать спецификацию scrlib (не является строкой): '{}'" +#: /usr/lib/python3.9/argparse.py +#, fuzzy, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "не получается открыть '%s': %s" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2301,12 +2345,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "не удалось найти необходимые srclibs: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "у субпарсера должен быть только один аргумент" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "не получается объединить действия: указаны две группы %r" @@ -2329,12 +2373,12 @@ msgid "commands from plugin modules:" msgstr "Команды из подключаемых модулей:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "комплекс" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2386,7 +2430,7 @@ msgid "deployed process log {path} to {dest}" msgstr "лог {path} загружен на {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "для параметра %r необходимо указать dest=" @@ -2396,7 +2440,7 @@ msgid "executable binary, possibly code" msgstr "исполняемый бинарный файл, возможно код" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2405,17 +2449,17 @@ msgstr[1] "необходимо указать %s аргумента" msgstr[2] "необходимо указать %s аргументов" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "необходимо указать хотя бы один аргумент" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "можно указать только один аргумент" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "можно указать только один аргумент" @@ -2433,7 +2477,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [<команда>] [-h|--help|--version|<аргументы>]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "с плавающей запятой" @@ -2454,7 +2498,7 @@ msgid "gzip file archive" msgstr "архив gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "указанный аргумент %r проигнорирован" @@ -2463,31 +2507,36 @@ msgstr "указанный аргумент %r проигнорирован" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 должен быть подписан, сделайте это с помощью `fdroid signindex`!" +#: ../fdroidserver/index.py +#, fuzzy +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "index-v1 должен быть подписан, сделайте это с помощью `fdroid signindex`!" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "число" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "неверное %(type)s значение: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "неверный выбор: %(value)r (следует выбрать из %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "неверное значение conflict_resolution: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "неверный синтаксис в строке параметра %(option)r: она должна начинаться с символа %(prefix_chars)r" @@ -2516,7 +2565,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "адрес зеркала '%s' должен заканчиваться 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "взаимоисключающие аргументы не должны быть обязательными" @@ -2530,7 +2579,7 @@ msgid "no APK supplied" msgstr "APK файл не указан" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "такого параметра нет: %s" @@ -2544,13 +2593,13 @@ msgid "no version information found" msgstr "информация о версии не найдена" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "недопустимо с аргументом %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "необходимо указать хотя бы один аргумент из списка %s" @@ -2565,55 +2614,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "параметр %s: если вы действительно хотите установить все подписанные приложения, то используйте --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "параметр %s: неверное %s значение: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "параметр %s: неверный выбор: %r (следует выбрать из %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "параметр -%s не распознан" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "параметр -%s требует аргумент" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "параметру --%s не нужны аргументы" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "параметр --%s не является уникальным префиксом" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "параметр --%s не распознан" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "параметру --%s нужен аргумент" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "необязательные аргументы" @@ -2623,7 +2672,7 @@ msgid "overwriting existing {path}" msgstr "перезапись существующего пути {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "позиционные аргументы" @@ -2652,6 +2701,10 @@ msgstr "значок репозитория (repo_icon) 'repo/icons/%s' не с msgid "repo_icon %s does not exist, generating placeholder." msgstr "значок репозитория (repo_icon) '%s' не существует, генерируется суррогат." +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml не установлен, не получается записать метаданные." @@ -2671,13 +2724,14 @@ msgid "shared library" msgstr "разделяемая библиотека" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "показать номер версии программы и выйти" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "показать это справочное сообщение и выйти" @@ -2712,25 +2766,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "указанная метка времени '{timestamp}' противоречит формату, принятому в UNIX" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "требуются аргументы: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "неизвестная строка параметра: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "неизвестный парсер %(parser_name)r (следует выбрать из %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "неизвестные аргументы: %s" @@ -2742,6 +2796,7 @@ msgstr "небезопасные права доступа к файлу '{confi #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "использование: " @@ -2871,7 +2926,7 @@ msgstr "{name}: \"{section}/icons/{path}\" не существует! Попра msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} признан устаревшим; используйте {newfile}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} уже существует, результаты импорта игнорируются!" @@ -2906,7 +2961,7 @@ msgstr "{path}: {error}" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "Адрес {url} должен заканчиваться на \"fdroid\". Проверьте URL-адрес!" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "Адрес {url} должен начинаться с \"http\"!" diff --git a/locale/sk/LC_MESSAGES/fdroidserver.po b/locale/sk/LC_MESSAGES/fdroidserver.po index 4ef39eb9..088825dd 100644 --- a/locale/sk/LC_MESSAGES/fdroidserver.po +++ b/locale/sk/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -93,13 +93,13 @@ msgstr "" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -113,7 +113,7 @@ msgid "%(prog)s [options] url" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "" @@ -124,12 +124,12 @@ msgid "%d problems found" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "" @@ -140,7 +140,7 @@ msgid "%s is not an accepted build field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "" @@ -166,7 +166,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -222,7 +222,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr "" @@ -263,7 +263,7 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -460,7 +460,7 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -487,11 +487,11 @@ msgstr "" msgid "Could not find '{command}' on your system" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -511,7 +511,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -628,7 +628,7 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -716,6 +716,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" +#: ../fdroidserver/nightly.py +#, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -745,9 +750,14 @@ msgid "Error while attempting to publish log: %s" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "" @@ -1231,6 +1241,11 @@ msgstr "" msgid "Malformed serverwebroot line:" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" @@ -1244,6 +1259,10 @@ msgstr "" msgid "Name '%s' is just the auto name - remove it" msgstr "" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "" @@ -1282,11 +1301,12 @@ msgstr "" msgid "No git submodules available" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "" @@ -1410,7 +1430,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "" @@ -1428,7 +1448,7 @@ msgstr "" msgid "Outputting JSON" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "" @@ -1437,7 +1457,7 @@ msgstr "" msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "" @@ -1451,7 +1471,7 @@ msgstr "" msgid "Password required with username" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "" @@ -1474,6 +1494,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1506,7 +1531,7 @@ msgstr "" msgid "Produce human-readable index.xml" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "" @@ -1643,6 +1668,11 @@ msgstr "" msgid "Scan the source code of a package" msgstr "" +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1664,6 +1694,10 @@ msgstr[2] "" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1841,7 +1875,7 @@ msgstr "" msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "" @@ -2075,12 +2109,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "" @@ -2192,13 +2226,13 @@ msgid "adding to {name}: {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "" @@ -2237,8 +2271,12 @@ msgstr "" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "" @@ -2255,6 +2293,11 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" +#: /usr/lib/python3.9/argparse.py +#, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2267,12 +2310,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "" @@ -2295,12 +2338,12 @@ msgid "commands from plugin modules:" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2352,7 +2395,7 @@ msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "" @@ -2362,7 +2405,7 @@ msgid "executable binary, possibly code" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2371,17 +2414,17 @@ msgstr[1] "" msgstr[2] "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "" @@ -2399,7 +2442,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "" @@ -2420,7 +2463,7 @@ msgid "gzip file archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "" @@ -2429,31 +2472,35 @@ msgstr "" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "" +#: ../fdroidserver/index.py +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" @@ -2482,7 +2529,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2496,7 +2543,7 @@ msgid "no APK supplied" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "" @@ -2510,13 +2557,13 @@ msgid "no version information found" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "" @@ -2531,55 +2578,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "" @@ -2589,7 +2636,7 @@ msgid "overwriting existing {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "" @@ -2618,6 +2665,10 @@ msgstr "" msgid "repo_icon %s does not exist, generating placeholder." msgstr "" +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2637,13 +2688,14 @@ msgid "shared library" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "" @@ -2678,25 +2730,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "" @@ -2708,6 +2760,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "" @@ -2837,7 +2890,7 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "" @@ -2872,7 +2925,7 @@ msgstr "" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "" diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index 2fa20a16..b309cdf2 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -6,11 +6,10 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2021-03-22 16:55+0000\n" "Last-Translator: Besnik Bleta \n" -"Language-Team: Albanian \n" +"Language-Team: Albanian \n" "Language: sq\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,22 +20,16 @@ msgstr "" #: ../fdroidserver/common.py msgid "" "\n" -" This is a repository of apps to be used with FDroid. Applications in " -"this\n" -" repository are either official binaries built by the original " -"application\n" -" developers, or are binaries built from source by f-droid.org using " -"the\n" +" This is a repository of apps to be used with FDroid. Applications in this\n" +" repository are either official binaries built by the original application\n" +" developers, or are binaries built from source by f-droid.org using the\n" " tools on https://gitlab.com/fdroid.\n" " " msgstr "" "\n" -" Kjo është një depo aplikacionesh për t’u përdorur me FDroid. " -"Aplikacionet\n" -" në këtë depo ose janë dyorë zyrtarë të montuar nga zhvilluesit e " -"aplikacionit\n" -" origjinal, ose janë dyorë të montuar nga burimi prej f-droid.org " -"duke përdorur\n" +" Kjo është një depo aplikacionesh për t’u përdorur me FDroid. Aplikacionet\n" +" në këtë depo ose janë dyorë zyrtarë të montuar nga zhvilluesit e aplikacionit\n" +" origjinal, ose janë dyorë të montuar nga burimi prej f-droid.org duke përdorur\n" " mjetet në https://gitlab.com/fdroid.\n" " " @@ -77,9 +70,7 @@ msgstr "Drejtoria rrënjë për local_copy_dir \"{path}\" s’ekziston!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "" -"\"repo_pubkey\" duhet të jetë i pranishëm te config.yml, kur përdoret --" -"nosign!" +msgstr "\"repo_pubkey\" duhet të jetë i pranishëm te config.yml, kur përdoret --nosign!" #: ../fdroidserver/install.py #, python-brace-format @@ -104,27 +95,25 @@ msgstr "\"{path}\" ekziston, por s3cmd s’është e instaluar!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "" -"\"{path}\" s’është format kartelash i mbuluar (përdorni: metadata/*.yml)" +msgstr "\"{path}\" s’është format kartelash i mbuluar (përdorni: metadata/*.yml)" #: ../fdroidserver/metadata.py #, python-brace-format msgid "\"{path}\" is not an accepted format, convert to: {formats}" -msgstr "" -"\"{path}\" s’është në një format të pranuar, shndërrojeni në: {formats}" +msgstr "\"{path}\" s’është në një format të pranuar, shndërrojeni në: {formats}" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\" ekziston, por s3cmd s’është e instaluar!" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" s’është URL e vlefshme!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -137,7 +126,7 @@ msgid "%(prog)s [options] url" msgstr "%(prog)s [mundësi] url" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: gabim: %(message)s\n" @@ -148,12 +137,12 @@ msgid "%d problems found" msgstr "U gjetën %d probleme" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [mundësi]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "%r s’mund të thirret" @@ -164,7 +153,7 @@ msgid "%s is not an accepted build field" msgstr "%s s’është fushë e pranuar montimi" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "Mundësia %s s’merr ndonjë vlerë" @@ -190,7 +179,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "S’u gjet 'repo_keyalias' te config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' është argument i pavlefshëm për pozicionalë" @@ -208,14 +197,12 @@ msgstr "'sdk_path' te 'config.yml' s’është ujdisur!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-23.0.0 or newer!" -msgstr "" -"'{aapt}' është shumë i vjetër, fdroid lyp build-tools-23.0.0 ose më të ri!" +msgstr "'{aapt}' është shumë i vjetër, fdroid lyp build-tools-23.0.0 ose më të ri!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" -msgstr "" -"'{aapt}' është shumë i vjetër, fdroid lyp build-tools-{version} ose më të ri!" +msgstr "'{aapt}' është shumë i vjetër, fdroid lyp build-tools-{version} ose më të ri!" #: ../fdroidserver/install.py #, python-brace-format @@ -225,18 +212,12 @@ msgstr "'{apkfilename}' është tashmë e instaluar në {dev}." #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{field}' in {linedesc} is obsolete, see docs for current fields:" -msgstr "" -"'{field}' te {linedesc} është e vjetruar, për fushat në përdorim, shihni " -"dokumentimin:" +msgstr "'{field}' te {linedesc} është e vjetruar, për fushat në përdorim, shihni dokumentimin:" #: ../fdroidserver/common.py #, python-brace-format -msgid "" -"'{field}' will be in random order! Use () or [] brackets if order is " -"important!" -msgstr "" -"'{field}' do të jetë sipas një rendi kuturu! Nëse rendi është i rëndësishëm, " -"përdorni kllapa () ose []!" +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgstr "'{field}' do të jetë sipas një rendi kuturu! Nëse rendi është i rëndësishëm, përdorni kllapa () ose []!" #: ../fdroidserver/common.py #, python-brace-format @@ -246,9 +227,7 @@ msgstr "S’u arrit të përmbushet '{path}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" -msgstr "" -"'{value}' s’është një {field} e vlefshme te {appid}. Rregullsi shprehjeje të " -"rregullt: {pattern}" +msgstr "'{value}' s’është një {field} e vlefshme te {appid}. Rregullsi shprehjeje të rregullt: {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -256,14 +235,13 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "…checkupdate dështoi për {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() e pacaktuar" #: ../fdroidserver/metadata.py msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." -msgstr "" -".fdroid.txt nuk mbulohet! Shndërrojeni në .fdroid.yml ose .fdroid.json." +msgstr ".fdroid.txt nuk mbulohet! Shndërrojeni në .fdroid.yml ose .fdroid.json." #: ../fdroidserver/lint.py msgid "/issues is missing" @@ -298,13 +276,9 @@ msgstr "Po shtohet depo e re për vetëm {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias i kyçit të nënshkrimeve të depos te depo kyçesh" -#: ../fdroidserver/import.py -msgid "" -"Allows a different revision (or git branch) to be specified for the initial " -"import" -msgstr "" -"Lejon të specifikohet një rishikim tjetër (ose kryeni “git branch”) për " -"importimin fillestar" +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py +msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgstr "Lejon të specifikohet një rishikim tjetër (ose kryeni “git branch”) për importimin fillestar" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" @@ -387,12 +361,8 @@ msgid "Archiving {apkfilename} with invalid signature!" msgstr "Po arkivohet {apkfilename} me nënshkrim të pavlefshëm!" #: ../fdroidserver/mirror.py -msgid "" -"Base URL to mirror, can include the index signing key using the query " -"string: ?fingerprint=" -msgstr "" -"URL bazë për t’u pasqyruar, mund të përfshijë kyçin e nënshkrimit të " -"treguesit që përdor vargun e kërkimi: ?fingerprint=" +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgstr "URL bazë për t’u pasqyruar, mund të përfshijë kyçin e nënshkrimit të treguesit që përdor vargun e kërkimi: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py @@ -420,9 +390,7 @@ msgstr "Monto krejt aplikacionet e mundshme" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" -msgstr "" -"Montim i prodhuar nga `fdroid import` - hiqni rreshtin e çaktivizimit, pasi " -"të jetë gati" +msgstr "Montim i prodhuar nga `fdroid import` - hiqni rreshtin e çaktivizimit, pasi të jetë gati" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" @@ -434,12 +402,8 @@ msgstr "Monto vetëm versionin më të ri të çdo pakete" #: ../fdroidserver/metadata.py #, python-brace-format -msgid "" -"Build should have comma-separated versionName and versionCode, not " -"\"{value}\", in {linedesc}" -msgstr "" -"Montimi duhet të ketë versionName dhe versionCode ndarë me presje, jo " -"\"{value}\", te {linedesc}" +msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" +msgstr "Montimi duhet të ketë versionName dhe versionCode ndarë me presje, jo \"{value}\", te {linedesc}" #: ../fdroidserver/init.py #, python-format @@ -479,8 +443,7 @@ msgstr "S’mund të përdoret --list dhe --to në të njëjtën kohë" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" -msgstr "" -"S’shkruhet dot \"{path}\", s’është format i pranuar, përdorni: {formats}" +msgstr "S’shkruhet dot \"{path}\", s’është format i pranuar, përdorni: {formats}" #: ../fdroidserver/lint.py #, python-format @@ -497,27 +460,19 @@ msgstr "Kontrollo për përditësime aplikacionesh" #: ../fdroidserver/update.py #, python-brace-format -msgid "" -"Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, " -"archapks:{arch}" -msgstr "" -"Po kontrollohet arkivimi përr {appid} - APKs:{integer}, keepversions:{keep}, " -"archapks:{arch}" +msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Po kontrollohet arkivimi përr {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py #, python-brace-format -msgid "" -"Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, " -"archapks:{arch}" -msgstr "" -"Po kontrollohet arkivimi për {appid} - apks:{integer}, keepversions:{keep}, " -"archapks:{arch}" +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Po kontrollohet arkivimi për {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Përditësim na e para - nuk përdor fshehtina, ripërpuno krejt APK-të" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Listë kategorish ndarë me presje." @@ -531,30 +486,24 @@ msgid "Commit changes" msgstr "Depozito ndryshimet" #: ../fdroidserver/__main__.py -msgid "" -"Conflicting arguments: '--verbose' and '--quiet' can not be specified at the " -"same time." -msgstr "" -"Argumente që përplasen: '--verbose' dhe '--quiet' s’mund të përdoren në të " -"njëjtën kohë." +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgstr "Argumente që përplasen: '--verbose' dhe '--quiet' s’mund të përdoren në të njëjtën kohë." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" -"Kartela formësimi me përplasje! Po përdoret {newfile}, po shpërfillet " -"{oldfile}!" +msgstr "Kartela formësimi me përplasje! Po përdoret {newfile}, po shpërfillet {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Në sistemin tuaj s’u gjet '{command}'" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "S’ u gjet dot kod i versionit më të ri" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "S’ u gjet dot emër i versionit më të ri" @@ -574,7 +523,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "S’u përtyp dot madhësia \"{size}\", lloj i gabuar \"{type}\"" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "S’u gjet dot ID Aplikacione" @@ -599,9 +548,7 @@ msgstr "S’u gjet dot ID pakete" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" -msgstr "" -"Po refuzohet me burracakëri të mbishkruhet ujdisje ekzistuese kyçesh " -"nënshkrimi!" +msgstr "Po refuzohet me burracakëri të mbishkruhet ujdisje ekzistuese kyçesh nënshkrimi!" #: ../fdroidserver/update.py msgid "Create a repo signing key in a keystore" @@ -650,9 +597,7 @@ msgstr "Po krijohet tregues i panënshkruar, si përgatitje për nënshkrim" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "" -"CurrentVersionCode {cv} është më i vogël sesa zëri {versionCode} i montimit " -"më të vjetër" +msgstr "CurrentVersionCode {cv} është më i vogël sesa zëri {versionCode} i montimit më të vjetër" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" @@ -670,9 +615,7 @@ msgstr "Po fshihet arkivi, depoja është shumë e madhe ({size} maks. {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "" -"Po fshihet historik git-mirror, depoja është shumë e madhe ({size} maks. " -"{limit})" +msgstr "Po fshihet historik git-mirror, depoja është shumë e madhe ({size} maks. {limit})" #: ../fdroidserver/update.py #, python-brace-format @@ -691,16 +634,14 @@ msgstr "Përshkrimi ka një rresht të përsëdytur" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" -"Përshkrimi ka një listë (%s), por kjo s’është as me toptha (*), as e " -"numërtuar (#)" +msgstr "Përshkrimi ka një listë (%s), por kjo s’është as me toptha (*), as e numërtuar (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" msgstr "Përshkrimi me gjatësi {length} është mbi kufirin prej {limit} shenjash" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Mos shtoni 'disable:' te zëra të prodhuar të montimit" @@ -730,11 +671,8 @@ msgid "Don't do anything logs-related" msgstr "Mos bëj gjë që lidhet me regjistrat" #: ../fdroidserver/build.py -msgid "" -"Don't refresh the repository, useful when testing a build with no internet " -"connection" -msgstr "" -"Mos rifresko depon, e dobishme kur testohet një montim pa lidhje internet" +msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgstr "Mos rifresko depon, e dobishme kur testohet një montim pa lidhje internet" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py #: ../fdroidserver/upload.py @@ -765,10 +703,8 @@ msgstr "Shkarkimi i {url} dështoi. {error}" #: ../fdroidserver/metadata.py #, python-brace-format -msgid "" -"Duplicate build recipe found for versionCode {versionCode} in {linedesc}" -msgstr "" -"U gjet përsëdytje recete montimi për versionCode {versionCode} te {linedesc}" +msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" +msgstr "U gjet përsëdytje recete montimi për versionCode {versionCode} te {linedesc}" #: ../fdroidserver/lint.py #, python-brace-format @@ -788,14 +724,18 @@ msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" -"GABIM: ky urdhër s’duhet përdorur kurrë për krijimin e një pasqyre të f-" -"droid.org!\n" +"GABIM: ky urdhër s’duhet përdorur kurrë për krijimin e një pasqyre të f-droid.org!\n" "Një pasqyrë e plotë e f-droid.org lyp më tepër se 200GB." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "GABIM: lloj CI i pambuluar, arnimet janë të mirëpritura!" +#: ../fdroidserver/nightly.py +#, fuzzy, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "GABIM: lloj CI i pambuluar, arnimet janë të mirëpritura!" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -803,12 +743,8 @@ msgstr "Flamurkë e zbrazët montimi te {linedesc}" #: ../fdroidserver/__main__.py #, python-brace-format -msgid "" -"Encoding is set to '{enc}' fdroid might run into encoding issues. Please set " -"it to 'UTF-8' for best results." -msgstr "" -"Si kodim është caktuar '{enc}'. Fdroid mund të hasë probleme kodimi. Për " -"përfundimet më të mira, caktojeni si 'UTF-8'." +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "Si kodim është caktuar '{enc}'. Fdroid mund të hasë probleme kodimi. Për përfundimet më të mira, caktojeni si 'UTF-8'." #: ../fdroidserver/init.py #, python-format @@ -831,9 +767,14 @@ msgid "Error while attempting to publish log: %s" msgstr "Gabim gjatë përpjekjes për botim regjistri: %s" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Gabim teksa merrej adresë depoje" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Përfto nënshkrime prej APK-sh" @@ -934,12 +875,8 @@ msgid "Forbidden HTML tags" msgstr "Etiketa HTML të ndaluara" #: ../fdroidserver/build.py -msgid "" -"Force build of disabled apps, and carries on regardless of scan problems. " -"Only allowed in test mode." -msgstr "" -"Detyro montim aplikacionesh të çaktivizuara, dhe vazhdon pavarësisht " -"problemesh skanimi. E lejuar vetëm nën mënyrën testim." +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgstr "Detyro montim aplikacionesh të çaktivizuara, dhe vazhdon pavarësisht problemesh skanimi. E lejuar vetëm nën mënyrën testim." #: ../fdroidserver/build.py #, python-brace-format @@ -1062,9 +999,7 @@ msgstr "Nëse ky ngarkim dështon, provoni ta ngarkoni dorazi te {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "" -"Po shpërfillet '{field}' te tejtëdhëna '{metapath}', ngaqë është nxjerrë nga " -"përdorimi." +msgstr "Po shpërfillet '{field}' te tejtëdhëna '{metapath}', ngaqë është nxjerrë nga përdorimi." #: ../fdroidserver/update.py #, python-format @@ -1087,9 +1022,7 @@ msgstr "Po shpërfillet kartelë {ext} te '{path}'" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "" -"Përfshi APKra që janë nënshkruar me algoritme të çaktivizuar, bie fjala, me " -"MD5" +msgstr "Përfshi APKra që janë nënshkruar me algoritme të çaktivizuar, bie fjala, me MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" @@ -1194,17 +1127,12 @@ msgstr "Listë me toptha e pavlefshme" #: ../fdroidserver/lint.py #, python-format -msgid "" -"Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" -msgstr "" -"Etiketë e pavlefshme licence \"%s\"! Përdorni vetëm etiketa nga https://spdx." -"org/license-list" +msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" +msgstr "Etiketë e pavlefshme licence \"%s\"! Përdorni vetëm etiketa nga https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "" -"Lidhje e pavlefshme - përdorni [http://lidhja_që_na_intereson Lidhje titull] " -"ose [http://lidhja_që_na_intereson]" +msgstr "Lidhje e pavlefshme - përdorni [http://lidhja_që_na_intereson Lidhje titull] ose [http://lidhja_që_na_intereson]" #: ../fdroidserver/metadata.py #, python-format @@ -1248,8 +1176,7 @@ msgstr "Tejtëdhëna srclib të pavlefshme: s’u përtyp dot '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "" -"Tejtëdhëna srclib të pavlefshme: kyçi panjohur '{key}' te kartela '{file}'" +msgstr "Tejtëdhëna srclib të pavlefshme: kyçi panjohur '{key}' te kartela '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1273,20 +1200,15 @@ msgstr "Kartelë JAR Java" #: ../fdroidserver/publish.py ../fdroidserver/update.py #: ../fdroidserver/mirror.py msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "" -"S’u gjet Java JDK! Instalojeni në vendndodhje standarde ose caktoni " -"java_paths!" +msgstr "S’u gjet Java JDK! Instalojeni në vendndodhje standarde ose caktoni java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Klasë Java e përpiluar" #: ../fdroidserver/signindex.py -msgid "" -"Java jarsigner not found! Install in standard location or set java_paths!" -msgstr "" -"S’u gjet Java jarsigner! Instalojeni në vendndodhje standarde ose caktoni " -"java_paths!" +msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "S’u gjet Java jarsigner! Instalojeni në vendndodhje standarde ose caktoni java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" @@ -1303,11 +1225,8 @@ msgstr "Depo kyçesh për kyç nënshkrimi:\t" #: ../fdroidserver/lint.py #, python-brace-format -msgid "" -"Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "" -"Parashtrimi '{commit}' i përdorur së fundi duket si etiketë, por si " -"UpdateCheckMode është '{ucm}'" +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "Parashtrimi '{commit}' i përdorur së fundi duket si etiketë, por si UpdateCheckMode është '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" @@ -1342,6 +1261,11 @@ msgstr "Pasqyra depoje të keqformuara." msgid "Malformed serverwebroot line:" msgstr "Rresht serverwebroot i keqformuar:" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Pasqyro depon e plotë dhe arkivin, krejt llojet e kartelave." @@ -1355,6 +1279,10 @@ msgstr "Mungon drejtori përfundimesh" msgid "Name '%s' is just the auto name - remove it" msgstr "Emri '%s' është thjesht emër i automatizuar - hiqeni" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "S’u gjet 'config.yml', po përdoren parazgjedhjet." @@ -1393,11 +1321,12 @@ msgstr "S’ka shenja gishtash te URL-ja." msgid "No git submodules available" msgstr "S’ka “git submodules”" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "S’u gjetën të dhëna." @@ -1421,9 +1350,7 @@ msgstr "S’ka nevojë të specifikohet që aplikacioni është për Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" -msgstr "" -"S’ka mundësi të ujdisur! Përpunoni config.yml tuaj që të ujdisni të paktën " -"një prej:" +msgstr "S’ka mundësi të ujdisur! Përpunoni config.yml tuaj që të ujdisni të paktën një prej:" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1496,9 +1423,7 @@ msgstr "packagename i OBB-së nuk përputhet me ndonjë APK të mbuluar:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" -"Makinë jo në linjë, po anashkalohet prodhim pasqyre git, deri sa `fdroid " -"deploy`" +msgstr "Makinë jo në linjë, po anashkalohet prodhim pasqyre git, deri sa `fdroid deploy`" #: ../fdroidserver/common.py #, python-brace-format @@ -1524,11 +1449,10 @@ msgstr "Kryeje vetëm për aplikacione me vetëpërditësime" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "" -"Metodat e dhurimit përmes OpenCollective i takojnë fushës OpenCollective:" +msgstr "Metodat e dhurimit përmes OpenCollective i takojnë fushës OpenCollective:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "Mundësi" @@ -1546,18 +1470,16 @@ msgstr "" msgid "Outputting JSON" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Licenca e përgjithshme e projektit." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "" -"Po anashkalohet versionName i zbrazët te {apkfilename} prej tejtëdhënash: " -"{version}" +msgstr "Po anashkalohet versionName i zbrazët te {apkfilename} prej tejtëdhënash: {version}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "Paketa \"{appid}\" ekziston tashmë" @@ -1571,14 +1493,12 @@ msgstr "Po përtypet manifest te '{path}'" msgid "Password required with username" msgstr "Me emrin e përdoruesit lypset fjalëkalim" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." -msgstr "" -"Shteg për te nëndrejtoria e projektit kryesor Android, në mos qoftë rrënja." +msgstr "Shteg për te nëndrejtoria e projektit kryesor Android, në mos qoftë rrënja." msgid "Path to main android project subdirectory, if not in root." -msgstr "" -"Shteg për te nëndrejtoria e projektit kryesor android, në mos qoftë rrënja." +msgstr "Shteg për te nëndrejtoria e projektit kryesor android, në mos qoftë rrënja." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" @@ -1594,8 +1514,12 @@ msgstr "Shteg për te depo kyçesh për kyçin e nënshkrimit të depos" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" +msgstr "Shtype ndryshoren e fshehtë te terminali, për kopjim/ngjitje të kollajtë" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" msgstr "" -"Shtype ndryshoren e fshehtë te terminali, për kopjim/ngjitje të kollajtë" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1629,7 +1553,7 @@ msgstr "Për kartela treguesish, prodho XML/JSON të lexueshëm nga syri njerëz msgid "Produce human-readable index.xml" msgstr "Prodho index.xml të lexueshme nga syri njerëzor" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "URL prej nga të importohet projekt." @@ -1673,12 +1597,8 @@ msgstr "Leximi i minSdkVersion dështoi: \"{apkfilename}\"" #. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/common.py #, python-brace-format -msgid "" -"Reading packageName/versionCode/versionName failed, APK invalid: " -"'{apkfilename}'" -msgstr "" -"Leximi i packageName/versionCode/versionName dështoi, APK e pavlefshme: " -"'{apkfilename}'" +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "Leximi i packageName/versionCode/versionName dështoi, APK e pavlefshme: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format @@ -1686,13 +1606,8 @@ msgid "Reading {apkfilename} from cache" msgstr "Po lexohet {apkfilename} prej fshehtine" #: ../fdroidserver/stats.py -msgid "" -"Recalculate aggregate stats - use when changes have been made that would " -"invalidate old cached data." -msgstr "" -"Rinjehso statistika përmbledhëse - përdoreni kur janë bërë ndryshime të " -"cilat mund të bënin të pavlefshme të dhëna të vjetra të ruajtura në " -"fshehtinë." +msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." +msgstr "Rinjehso statistika përmbledhëse - përdoreni kur janë bërë ndryshime të cilat mund të bënin të pavlefshme të dhëna të vjetra të ruajtura në fshehtinë." #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1716,12 +1631,8 @@ msgid "Report on build data status" msgstr "Raport mbi gjendje të dhënash montimi" #: ../fdroidserver/build.py -msgid "" -"Reset and create a brand new build server, even if the existing one appears " -"to be ok." -msgstr "" -"Zeroje dhe krijo një shërbyes montimesh të ri fringo, edhe nëse ai " -"ekzistuesi duket të jetë në rregull." +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgstr "Zeroje dhe krijo një shërbyes montimesh të ri fringo, edhe nëse ai ekzistuesi duket të jetë në rregull." #: ../fdroidserver/nightly.py #, python-brace-format @@ -1730,8 +1641,7 @@ msgstr "Po rinënshkruhet {apkfilename} me debug.keystore e furnizuar" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" -msgstr "" -"Ripërmaso krejt ikonat që tejkalojnë madhësinë maksimum në piksel dhe dil" +msgstr "Ripërmaso krejt ikonat që tejkalojnë madhësinë maksimum në piksel dhe dil" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" @@ -1780,6 +1690,11 @@ msgstr "Kontrollo për klasa jo të lira të ditura APK-në(të) e prodhuara." msgid "Scan the source code of a package" msgstr "Skanoni kodin burim të një pakete" +#: ../fdroidserver/scanner.py +#, fuzzy, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "Skaneri gjeti {count} probleme te {appid}:" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1801,6 +1716,11 @@ msgstr[1] "Skaneri gjeti {} probleme" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Kontrollo për klasa jo të lira të ditura APK-në(të) e prodhuara." +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "Kontrollo për klasa jo të lira të ditura APK-në(të) e prodhuara." + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1812,9 +1732,7 @@ msgstr "Vëre sahatin në atë kohë duke përdorur:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "" -"Caktoni numër maksimum hedhjesh në qarkullim, përpara se të arkivohen të " -"vjetrat" +msgstr "Caktoni numër maksimum hedhjesh në qarkullim, përpara se të arkivohen të vjetrat" #: ../fdroidserver/build.py #, python-brace-format @@ -1882,9 +1800,7 @@ msgstr "Specifikoni një dosje vendore te e cila të njëkohësohet depoja" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Specify an identity file to provide to SSH for rsyncing" -msgstr "" -"Specifikoni një kartelë identiteti për t’ia furnizuar SSH-s për njëkohësim " -"me rsync-un" +msgstr "Specifikoni një kartelë identiteti për t’ia furnizuar SSH-s për njëkohësim me rsync-un" #: ../fdroidserver/build.py msgid "Specify that we're running on the build server" @@ -1916,8 +1832,7 @@ msgstr "Përmbledhja '%s' është thjesht emri i aplikacionit" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" -msgstr "" -"Përmbledhja me gjatësi {length} është mbi kufirin prej {limit} shenjash" +msgstr "Përmbledhja me gjatësi {length} është mbi kufirin prej {limit} shenjash" #: ../fdroidserver/common.py #, python-brace-format @@ -1925,9 +1840,7 @@ msgid "System clock is older than date in {path}!" msgstr "Ora e sistemit është më herët se sa data në {path}!" #: ../fdroidserver/checkupdates.py -msgid "" -"Tags update mode only works for git, hg, bzr and git-svn repositories " -"currently" +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "" #: ../fdroidserver/checkupdates.py @@ -1935,12 +1848,8 @@ msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "" #: ../fdroidserver/build.py -msgid "" -"Test mode - put output in the tmp directory only, and always build, even if " -"the output already exists." -msgstr "" -"Mënyra testim - hidhe output-in vetëm te drejtoria tmp, dhe monto përherë, " -"edhe nëse output-i ekziston tashmë." +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgstr "Mënyra testim - hidhe output-in vetëm te drejtoria tmp, dhe monto përherë, edhe nëse output-i ekziston tashmë." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1958,8 +1867,7 @@ msgstr "Drejtoria ku të shkruhet pasqyra" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" -msgstr "" -"Kartela që duhet përfshirë te depoja (shteg ose shenjë e gjithëpushtetshme)" +msgstr "Kartela që duhet përfshirë te depoja (shteg ose shenjë e gjithëpushtetshme)" #: ../fdroidserver/deploy.py msgid "The only commands currently supported are 'init' and 'update'" @@ -1987,18 +1895,10 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Këto janë aplikacionet që janë arkivuar nga depoja kryesore." #: ../fdroidserver/common.py -msgid "" -"This is a repository of apps to be used with F-Droid. Applications in this " -"repository are either official binaries built by the original application " -"developers, or are binaries built from source by the admin of f-droid.org " -"using the tools on https://gitlab.com/fdroid." -msgstr "" -"Kjo është një depo aplikacionesh për t’u përdorur me F-Droid. Aplikacionet " -"në këtë depo ose janë dyorë zyrtarë të montuar nga zhvilluesit e " -"aplikacionit rigjinal, ose janë dyorë të montuar nga burimi prej f-droid.org " -"duke përdorur mjetet në https://gitlab.com/fdroid." +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "Kjo është një depo aplikacionesh për t’u përdorur me F-Droid. Aplikacionet në këtë depo ose janë dyorë zyrtarë të montuar nga zhvilluesit e aplikacionit rigjinal, ose janë dyorë të montuar nga burimi prej f-droid.org duke përdorur mjetet në https://gitlab.com/fdroid." -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Kjo depo ka tashmë tejtëdhëna vendore: %s" @@ -2016,12 +1916,8 @@ msgid "" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "" -"To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config." -"yml!" -msgstr "" -"Për të përdorur awsbucket, te config.yml duhen ujdisur edhe awssecretkey dhe " -"awsaccesskey!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Për të përdorur awsbucket, te config.yml duhen ujdisur edhe awssecretkey dhe awsaccesskey!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -2041,20 +1937,12 @@ msgid "URL {url} in Description: {error}" msgstr "URL {url} te Përshkrim: {error}" #: ../fdroidserver/lint.py -msgid "" -"Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from " -"https://spdx.org/license-list" -msgstr "" -"Etiketë licence \"{}\" e papritur! Përdorni vetëm etiketa të miratuara nga " -"FSF ose OSI, prej https://spdx.org/license-list" +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "Etiketë licence \"{}\" e papritur! Përdorni vetëm etiketa të miratuara nga FSF ose OSI, prej https://spdx.org/license-list" #: ../fdroidserver/lint.py -msgid "" -"Unexpected license tag \"{}\"! Only use license tags configured in your " -"config file" -msgstr "" -"Etiketë e papritur licence \"{}\"! Përdorni vetëm etiketa licencash të " -"formësuara te kartela e formësimit tuaj" +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgstr "Etiketë e papritur licence \"{}\"! Përdorni vetëm etiketa licencash të formësuara te kartela e formësimit tuaj" #: ../fdroidserver/common.py #, python-brace-format @@ -2102,9 +1990,7 @@ msgstr "Version i panjohur i aapt-së, mund të sjellë probleme: " #: ../fdroidserver/lint.py msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "" -"Lidhje e cila është hequr nga lidhje - përdorni [http://" -"lidhja_që_na_intereson Lidhje titull] ose [http://lidhja_që_na_intereson]" +msgstr "Lidhje e cila është hequr nga lidhje - përdorni [http://lidhja_që_na_intereson Lidhje titull] ose [http://lidhja_që_na_intereson]" #: ../fdroidserver/lint.py msgid "Unnecessary leading space" @@ -2223,23 +2109,17 @@ msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData s’është URL e vlefshme: {url}" #: ../fdroidserver/lint.py -msgid "" -"UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" -msgstr "" -"UpdateCheckMode është ujdisur, por duket sikur checkupdates s’është xhiruar " -"ende" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" +msgstr "UpdateCheckMode është ujdisur, por duket sikur checkupdates s’është xhiruar ende" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID - it can be removed" -msgstr "" -"Si UpdateCheckName është caktuar ID-ja e aplikacionit të njohur - s’mund të " -"hiqet" +msgstr "Si UpdateCheckName është caktuar ID-ja e aplikacionit të njohur - s’mund të hiqet" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "" -"Si UpdateCheckName është caktuar ID aplikacioni të njohur - s’mund të hiqet" +msgstr "Si UpdateCheckName është caktuar ID aplikacioni të njohur - s’mund të hiqet" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2252,21 +2132,19 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "Po ngarkohet {apkfilename} to virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "Përdorim" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Përdorim: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" -"Për të treguar një kartelë te dega parazgjedhje, përdorni /HEAD, në vend se /" -"master" +msgstr "Për të treguar një kartelë te dega parazgjedhje, përdorni /HEAD, në vend se /master" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." @@ -2278,9 +2156,7 @@ msgstr "Përdor shërbyes montimesh" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" -"Për APK-ra të shtuara rishtazi, përdor datë prej APK-je, në vend se kohën e " -"tanishme" +msgstr "Për APK-ra të shtuara rishtazi, përdor datë prej APK-je, në vend se kohën e tanishme" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -2296,11 +2172,8 @@ msgid "Using APK Signature v3" msgstr "Po përdoret Nënshkrimi APK-je v3" #: ../fdroidserver/common.py -msgid "" -"Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" -msgstr "" -"Po përdoret jarsigner Java, nuk rekomandohet për verifikim APK-sh! Përdorni " -"apksigner" +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "Po përdoret jarsigner Java, nuk rekomandohet për verifikim APK-sh! Përdorni apksigner" #: ../fdroidserver/common.py #, python-brace-format @@ -2323,9 +2196,7 @@ msgstr "Urdhrat e vlefshëm janë:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." -msgstr "" -"Verifikoje ndaj një kopjeje të ruajtur lokalisht në fshehtinë, në vend se ta " -"rishkarkosh." +msgstr "Verifikoje ndaj një kopjeje të ruajtur lokalisht në fshehtinë, në vend se ta rishkarkosh." #: ../fdroid ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" @@ -2337,29 +2208,19 @@ msgstr "Po verifikohet nënshkrim treguesi:" #: ../fdroidserver/deploy.py #, python-brace-format -msgid "" -"VirusTotal API key cannot upload files larger than 32MB, use {url} to upload " -"{path}." -msgstr "" -"Kyçi API VirusTotal s’mund të ngarkojë kartela më të mëdha se 2MB, përdorni " -"{url} që të ngarkoni {path}." +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "Kyçi API VirusTotal s’mund të ngarkojë kartela më të mëdha se 2MB, përdorni {url} që të ngarkoni {path}." #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Sinjalizo rreth gabimesh të mundshëm tejtëdhënash" #: ../fdroidserver/update.py -msgid "" -"When configured for signed indexes, create only unsigned indexes at this " -"stage" -msgstr "" -"Kur është formësuar për tregues të nënshkruar, në këtë fazë krijo vetëm " -"tregues të panënshkruar" +msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgstr "Kur është formësuar për tregues të nënshkruar, në këtë fazë krijo vetëm tregues të panënshkruar" #: ../fdroidserver/lint.py -msgid "" -"When linting the entire repository yamllint is disabled by default. This " -"option forces yamllint regardless." +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" msgid "X.509 'Distiguished Name' used when generating keys" @@ -2371,9 +2232,7 @@ msgstr "X.509 'Distinguished Name' i përdorur teksa prodhoheshin kyçe" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" -msgstr "" -"Mund të përdorni ANDROID_HOME që të caktoni shtegun për te SDK-ja juaj, " -"domethënë:" +msgstr "Mund të përdorni ANDROID_HOME që të caktoni shtegun për te SDK-ja juaj, domethënë:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" @@ -2390,13 +2249,13 @@ msgid "adding to {name}: {path}" msgstr "po shtohet te {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "mundësi e dykuptimtë: %(option)s mund të përputhej me %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "mundësi e dykuptimtë: %s (%s?)" @@ -2436,8 +2295,12 @@ msgstr "applicationId për të cilin të kontrollohet për përditësime" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId me versionCode opsional në formën APPID[:VERCODE]" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "argument \"-\" me mënyrën %r" @@ -2454,6 +2317,11 @@ msgstr "po tentohet lidhje ssh e zhveshur, për të testuar kyç sendërtimesh:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "s’përtyp dot specifikim scrlib (s’është një varg): '{}'" +#: /usr/lib/python3.9/argparse.py +#, fuzzy, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "s’hapet dot '%s': %s" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2466,12 +2334,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "s’gjenden dot srclibs të domosdoshme: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "s’mund të kihen argumente të shumtë për subparser" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "s’mund të përzihen veprimet - ka dy grupe të quajtur %r" @@ -2494,12 +2362,12 @@ msgid "commands from plugin modules:" msgstr "urdhra prej modulesh shtojce:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2550,7 +2418,7 @@ msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= është e domosdoshme për mundësi si %r" @@ -2560,7 +2428,7 @@ msgid "executable binary, possibly code" msgstr "dyor i ekzekutueshëm, ka gjasa të jetë kod" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2568,17 +2436,17 @@ msgstr[0] "pritej %s argument" msgstr[1] "priteshin %s argumente" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "pritej e pakta një argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "pritej e shumta një argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "pritej një argument" @@ -2596,7 +2464,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "" @@ -2606,9 +2474,7 @@ msgstr "bëji detyrimisht gabimet të jenë sinjalizime, ose shpërfilli" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." -msgstr "" -"bëji gabimet e tejtëdhënave (parazgjedhje) të jenë sinjalizime, ose të " -"shpërfillen." +msgstr "bëji gabimet e tejtëdhënave (parazgjedhje) të jenë sinjalizime, ose të shpërfillen." #: ../fdroidserver/common.py msgid "git svn clone failed" @@ -2619,49 +2485,48 @@ msgid "gzip file archive" msgstr "Arkiv gzip kartelash" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "u shpërfill argumenti eksplicit %r" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" -msgstr "" -"index-v1 duhet të ketë një nënshkrim, përdorni `fdroid signindex` për ta " -"krijuar!" +msgstr "index-v1 duhet të ketë një nënshkrim, përdorni `fdroid signindex` për ta krijuar!" + +#: ../fdroidserver/index.py +#, fuzzy +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "index-v1 duhet të ketë një nënshkrim, përdorni `fdroid signindex` për ta krijuar!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "numër i plotë" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "vlerë %(type)s e pavlefshme: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "zgjedhje e pavlefshme: %(value)r (zgjidhni nga %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "vlerë e pavlefshme conflict_resolution: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format -msgid "" -"invalid option string %(option)r: must start with a character " -"%(prefix_chars)r" -msgstr "" -"varg i pavlefshëm mundësie %(option)r: duhet të fillojë me një shenjë " -"%(prefix_chars)r" +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgstr "varg i pavlefshëm mundësie %(option)r: duhet të fillojë me një shenjë %(prefix_chars)r" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -2670,11 +2535,8 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format -msgid "" -"local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" -msgstr "" -"local_copy_dir does s’mbaron me \"fdroid\", ndoshta kishit në mendje: " -"\"{path}\"" +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "local_copy_dir does s’mbaron me \"fdroid\", ndoshta kishit në mendje: \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" @@ -2690,7 +2552,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "pasqyra '%s' s’përfundon me 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "argumentet që përjashtojnë njëri-tjetrin duhet të jenë opsionalë" @@ -2704,7 +2566,7 @@ msgid "no APK supplied" msgstr "s’u dha APK" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "s’ka mundësi të tillë: %s" @@ -2719,13 +2581,13 @@ msgid "no version information found" msgstr "s’u gjetën të dhëna versioni!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "e palejuar me argumentin %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "një nga argumentet %s është i domosdoshëm" @@ -2737,60 +2599,58 @@ msgstr "prano vetëm vargje, lista dhe dyshe" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" -"mundësi %s: Nëse doni vërtet të instaloni krejt aplikacionet e nënshkruar, " -"përdorni --all" +msgstr "mundësi %s: Nëse doni vërtet të instaloni krejt aplikacionet e nënshkruar, përdorni --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "mundësi %s: vlerë %s e pavlefshme: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "mundësia %s: zgjedhje e pavlefshme: %r (zgjidhni nga %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "mundësi -%s jo e pranuar" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "mundësia -%s lyp argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "mundësia --%s s’duhet të ketë një argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "mundësia --%s s’është parashtesë unike" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "mundësi --%s e papranuar" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "mundësia --%s lyp argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "argumente opsionalë" @@ -2800,7 +2660,7 @@ msgid "overwriting existing {path}" msgstr "po mbishkruhet {path} ekzistues" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "argumente pozicionalë" @@ -2811,21 +2671,13 @@ msgstr "" #: ../fdroidserver/signatures.py #, python-brace-format -msgid "" -"refuse downloading via insecure HTTP connection (use HTTPS or specify --no-" -"https-check): {apkfilename}" -msgstr "" -"refuzo shkarkim përmes lidhjeje HTTP të pasigurt (përdorni HTTPS ose " -"specifikoni --no-https-check): {apkfilename}" +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgstr "refuzo shkarkim përmes lidhjeje HTTP të pasigurt (përdorni HTTPS ose specifikoni --no-https-check): {apkfilename}" #: ../fdroidserver/signatures.py #, python-brace-format -msgid "" -"refuse downloading via insecure http connection (use https or specify --no-" -"https-check): {apkfilename}" -msgstr "" -"mos pranon shkarkim përmes lidhjeje http të pasigurt (përdorni https ose " -"specifikoni --no-https-check): {apkfilename}" +msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" +msgstr "mos pranon shkarkim përmes lidhjeje http të pasigurt (përdorni https ose specifikoni --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format @@ -2837,6 +2689,10 @@ msgstr "repo_icon \"repo/icons/%s\" s’ekziston, po prodhohet vendmbajtëse." msgid "repo_icon %s does not exist, generating placeholder." msgstr "repo_icon %s s’ekziston, po prodhohet vendmbajtëse." +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml s’është i instalaur, s’mund të shkruhen tejtëdhëna." @@ -2856,13 +2712,14 @@ msgid "shared library" msgstr "librari e përbashkët" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "shfaq numër versioni programi dhe dil" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "shfaq këtë mesazh ndihme dhe dil" @@ -2872,14 +2729,11 @@ msgstr "APK e nënshkruar, ose një shteg-kartele, ose URL HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "" -"anashkalo sendërtim regjistrash të plotë montimesh: lëndë e regjistrit është " -"e zbrazët" +msgstr "anashkalo sendërtim regjistrash të plotë montimesh: lëndë e regjistrit është e zbrazët" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" -msgstr "" -"anashkalo krijim regjistrash të plotë montimi: e paaktivizuar te formësimi" +msgstr "anashkalo krijim regjistrash të plotë montimi: e paaktivizuar te formësimi" #: ../fdroidserver/update.py #, python-brace-format @@ -2900,25 +2754,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "vlera '{timestamp}' e dhënë për vulën kohore s’është vulë kohore Unix" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "argumentet vijuese janë të domosdoshëm: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "varg i papritur mundësie: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "përtypës i panjohur %(parser_name)r (choices: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "argumente të papranuar: %s" @@ -2930,6 +2784,7 @@ msgstr "leje jo të parrezikshme mbi '{config_file}' (duhet të ishin 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "përdorimi: " @@ -2948,9 +2803,7 @@ msgstr "virustotal.com i kufizon shpejtësitë, po pritet për riprovim…" #: ../fdroidserver/update.py msgid "wiki support is deprecated and will be removed in the next release!" -msgstr "" -"Mbulimi për wiki është nxjerrë nga përdorimi dhe do të hiqet në hedhjen e " -"ardhshme në qarkullim!" +msgstr "Mbulimi për wiki është nxjerrë nga përdorimi dhe do të hiqet në hedhjen e ardhshme në qarkullim!" #: ../fdroidserver/publish.py #, python-brace-format @@ -2967,9 +2820,7 @@ msgstr "{apkfilename} ({appid}) s’ka tejtëdhëna!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" -"{apkfilename} ka shumë kartela {name}, duket si rreng me Kyçin e " -"Përgjithshëm!" +msgstr "{apkfilename} ka shumë kartela {name}, duket si rreng me Kyçin e Përgjithshëm!" #: ../fdroidserver/update.py #, python-brace-format @@ -3020,21 +2871,17 @@ msgstr "{appid}: extlib i panjohur {path} te montimi '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" -msgstr "" -"{appid}: s’u specifikuan montime, po xhirohet me gjendjen e tanishme të " -"burimit" +msgstr "{appid}: s’u specifikuan montime, po xhirohet me gjendjen e tanishme të burimit" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "" -"{appid}: {field} duhet të jetë një '{type}', po është një '{fieldtype}!'" +msgstr "{appid}: {field} duhet të jetë një '{type}', po është një '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" -msgstr "" -"{appid}: {field} duhet të jetë një '{type}', por është një '{fieldtype}'!" +msgstr "{appid}: {field} duhet të jetë një '{type}', por është një '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -3059,15 +2906,14 @@ msgstr "{name} \"{path}\" s’ekziston! Ndreqeni te config.yml." #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "" -"{name} \"{section}/icons/{path}\" s’ekziston! Kontrolloni \"config.yml\"." +msgstr "{name} \"{section}/icons/{path}\" s’ekziston! Kontrolloni \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} është nxjerrë nga përdorimi, përdorni {newfile}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} ekziston tashmë, po shpërfillen përfundimet e importimit!" @@ -3080,9 +2926,7 @@ msgstr "{path} s’ekziston! Krijojeni duke xhiruar:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "" -"{path} ka \"{pattern}\" të gabuar nënshkrimi kartele, ka gjasa të jetë rreng " -"Janus!" +msgstr "{path} ka \"{pattern}\" të gabuar nënshkrimi kartele, ka gjasa të jetë rreng Janus!" #: ../fdroidserver/update.py #, python-brace-format @@ -3104,7 +2948,7 @@ msgstr "S’u arrit të kopjohej {path}: {error}" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} s’përfundon me \"fdroid\", kontrolloni shtegun e URL-së!" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} nuk fillon me \"http\"!" @@ -3120,42 +2964,3 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "{} doli me sukses" msgstr[1] "{} dolën me sukses" - -#~ msgid "Cannot find a packageName for {path}!" -#~ msgstr "S’gjendet dot një packageName për {path}!" - -#~ msgid "Cannot find an appid for {path}!" -#~ msgstr "S’gjendet dot një appid për {path}!" - -#~ msgid "Clean after all scans have finished" -#~ msgstr "Pastroje, pasi të kenë përfunduar krejt skanimet" - -#~ msgid "Clean before the scans start and rebuild the container" -#~ msgstr "" -#~ "Pastrojeni përpara se të fillojnë skanimet dhe të rimontohet kontejneri" - -#~ msgid "Clean up all containers and then exit" -#~ msgstr "Pastroji krejt kontejnerët dhe mandej dil" - -#~ msgid "Could not open APK file for analysis" -#~ msgstr "S’u hap dot kartela APK për analizim" - -#~ msgid "Override path for repo APKs (default: ./repo)" -#~ msgstr "Shteg anashkalimi për APK-ra depoje (parazgjedhje: ./repo)" - -#~ msgid "Prepare Drozer to run a scan" -#~ msgstr "Përgatite Drozer-in të bëjë një skanim" - -#~ msgid "Prepare drozer to run a scan" -#~ msgstr "Përgatite Drozer-in të kryejë një skanim" - -#~ msgid "Scan only the latest version of each package" -#~ msgstr "Skano vetëm versionin më të ri të çdo pakete" - -#~ msgid "Setup an emulator, install the APK on it and perform a Drozer scan" -#~ msgstr "" -#~ "Ujdisni një emulues, instaloni në të APK-në dhe kryeni një skanim Drozer" - -#~ msgid "Setup an emulator, install the APK on it and perform a drozer scan" -#~ msgstr "" -#~ "Ujdisni një emulues, instaloni në të APK-në dhe kryeni një skanim Drozer" diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index 02b95810..dd9f7f78 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2022-02-15 22:36+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" @@ -107,13 +107,13 @@ msgstr "\"{path}\" kabul edilebilir bir biçim değil, şuna dönüştürün: {f msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\", izin verilmeyen bir anahtarla imzalandı:" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" geçerli bir URL değil!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -126,7 +126,7 @@ msgid "%(prog)s [options] url" msgstr "%(prog)s [seçenekler] url" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: hata: %(message)s\n" @@ -137,12 +137,12 @@ msgid "%d problems found" msgstr "%d sorun bulundu" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [seçenekler]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "%r çağrılabilir değil" @@ -153,7 +153,7 @@ msgid "%s is not an accepted build field" msgstr "%s kabul edilen bir inşa alanı değil" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "%s seçeneği bir değer almaz" @@ -179,7 +179,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' config.yml içinde bulunamadı!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' positionals için geçersiz bir argüman" @@ -235,7 +235,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr ".. .checkupdate {appid} için başarısız oldu: {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() tanımlı değil" @@ -276,7 +276,7 @@ msgstr "Yalnızca {name} için yeni depo ekleniyor" msgid "Alias of the repo signing key in the keystore" msgstr "Depo imzalama anahtarının anahtar deposundaki takma adı" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "İlk içe aktarım için farklı bir revizyonun (veya git dalının) belirtilmesine izin verir" @@ -472,7 +472,7 @@ msgstr "{appid} için arşivleme denetleniyor - apks:{integer}, keepversions:{ke msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Temiz güncelleme - önbellekleri kullanmaz, tüm APKları yeniden işler" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Kategorilerin virgülle ayrılmış listesi." @@ -499,11 +499,11 @@ msgstr "Çakışan yapılandırma dosyaları! {newfile} kullanılıyor, {oldfile msgid "Could not find '{command}' on your system" msgstr "'{command}' sisteminizde bulunamadı" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Son sürüm kodu bulunamadı" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Son sürüm adı bulunamadı" @@ -523,7 +523,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "\"{size}\" boyutu ayrıştırılamadı, yanlış tür \"{type}\"" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Uygulama kimliği bulunamadı" @@ -640,7 +640,7 @@ msgstr "Açıklamanın bir listesi (%s) var fakat madde imli (*) veya numaralı( msgid "Description of length {length} is over the {limit} char limit" msgstr "{length} uzunluğundaki açıklama, {limit} karakter sınırının üstünde" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Oluşturulan derleme girdilerine 'disable:' ekleme" @@ -730,6 +730,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "HATA: desteklenmeyen CI türü, yama gönderebilirsiniz!" +#: ../fdroidserver/nightly.py +#, fuzzy, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "HATA: desteklenmeyen CI türü, yama gönderebilirsiniz!" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -761,9 +766,14 @@ msgid "Error while attempting to publish log: %s" msgstr "Günlük yayımlamaya çalışırken hata: %s" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Depo adresi alınırken hata" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "APK'lardan imzaları ayıkla" @@ -1247,6 +1257,11 @@ msgstr "Bozuk depo yansımaları." msgid "Malformed serverwebroot line:" msgstr "Bozuk serverwebroot satırı:" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Tüm dosya türlerini, tam depoyu ve arşivi yansıla." @@ -1260,6 +1275,10 @@ msgstr "Eksik çıktı dizini" msgid "Name '%s' is just the auto name - remove it" msgstr "Ad '%s' yalnızca kendiliğinden bir ad - kaldırın" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "'config.yml' bulunamadı, öntanımlı değerler kullanılıyor." @@ -1298,11 +1317,12 @@ msgstr "URL'de parmak izi yok." msgid "No git submodules available" msgstr "Kullanılabilir git alt modülü yok" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Gradle projesi bulunamadı. --subdir belirtin?" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Bilgi bulunamadı." @@ -1426,7 +1446,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "OpenCollective bağış yöntemleri OpenCollective: alanında olmalı" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "Seçenekler" @@ -1444,7 +1464,7 @@ msgstr "Standart çıkışa JSON yazdır." msgid "Outputting JSON" msgstr "JSON yazdırılıyor" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Projenin genel lisansı." @@ -1453,7 +1473,7 @@ msgstr "Projenin genel lisansı." msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "{apkfilename} içindeki boş versionName değerine üst verideki yazılıyor: {version}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "\"{appid}\" paketi zaten var" @@ -1467,7 +1487,7 @@ msgstr "'{path}' konumundaki bildirim ayrıştırılıyor" msgid "Password required with username" msgstr "Kullanıcı adıyla parola gerekli" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Kökte değilse, ana Android proje alt dizininin konumu." @@ -1490,6 +1510,11 @@ msgstr "Depo imzalama anahtarı için anahtar deposunun konumu" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Kolay kopyala yapıştır için gizli değişkeni terminale yaz" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1522,7 +1547,7 @@ msgstr "İndeks dosyaları için okunabilir XML/JSON üret" msgid "Produce human-readable index.xml" msgstr "Okunabilir index.xml üret" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "İçe aktarma için proje URL'si." @@ -1659,6 +1684,11 @@ msgstr "Bilinen özgür olmayan sınıflar için ortaya çıkan APK'leri tara." msgid "Scan the source code of a package" msgstr "Bir paketin kaynak kodunu tara" +#: ../fdroidserver/scanner.py +#, fuzzy, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "Tarayıcı {appid} içinde {count} sorun buldu:" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1679,6 +1709,11 @@ msgstr[1] "Tarayıcı {} sorun buldu" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Bilinen özgür olmayan sınıflar için apkanalyzer ile APK taranıyor." +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "Bilinen özgür olmayan sınıflar için apkanalyzer ile APK taranıyor." + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1856,7 +1891,7 @@ msgstr "Bunlar ana depodan arşivlenmiş uygulamalardır." msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Bu, F-Droid ile kullanılacak uygulamaların bir deposudur. Bu depodaki uygulamalar ya gerçek uygulama geliştiricileri tarafından oluşturulan resmi ikili dosyalardır ya da https://gitlab.com/fdroid adresindeki araçlar kullanılarak f-droid.org yöneticisi tarafından kaynaktan oluşturulan ikili dosyalardır." -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Bu deponun zaten yerel üst verisi var: %s" @@ -2097,12 +2132,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "{apkfilename} virustotal'e yükleniyor" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "Kullanım" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Kullanım: %s\n" @@ -2214,13 +2249,13 @@ msgid "adding to {name}: {path}" msgstr "{name} adına ekleniyor: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "belirsiz şeçenek: %(option)s ile %(matches)s eşleşebilir" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "belirsiz şeçenek: %s (%s?)" @@ -2259,8 +2294,12 @@ msgstr "Güncellemeleri denetlemek için applicationId" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "APPID[:VERCODE] biçiminde applicationId, isteğe bağlı versionCode ile" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "%r kipiyle \"-\" argümanı" @@ -2277,6 +2316,11 @@ msgstr "Dağıtım anahtarını sınamak için çıplak ssh bağlantısı deneni msgid "can not parse scrlib spec (not a string): '{}'" msgstr "scrlib belirtimi ayrıştırılamıyor (bir dizge değil): '{}'" +#: /usr/lib/python3.9/argparse.py +#, fuzzy, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "'%s' açılamıyor: %s" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2289,12 +2333,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "gerekli srclibs bulunamıyor: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "birden çok alt-ayrıştırıcı argümanı verilemez" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "eylemler birleştirilemiyor - %r adlı iki grup" @@ -2317,12 +2361,12 @@ msgid "commands from plugin modules:" msgstr "eklenti modüllerinden komutlar:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "karmaşık" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2373,7 +2417,7 @@ msgid "deployed process log {path} to {dest}" msgstr "{path} işlem günlüğü {dest}'e dağıtıldı" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= %r gibi seçenekler için gerekli" @@ -2383,7 +2427,7 @@ msgid "executable binary, possibly code" msgstr "çalıştırılabilir ikili dosya, muhtemelen kod" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2391,17 +2435,17 @@ msgstr[0] "beklenen %s argümandı" msgstr[1] "beklenen %s argümandı" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "beklenen en az bir argümandı" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "beklenen en çok bir argümandı" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "beklenen bir argümandı" @@ -2419,7 +2463,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [] [-h|--help|--version|]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "kayan nokta" @@ -2440,7 +2484,7 @@ msgid "gzip file archive" msgstr "gzip dosya arşivi" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "açık argüman %r yok sayıldı" @@ -2449,31 +2493,36 @@ msgstr "açık argüman %r yok sayıldı" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 bir imzaya sahip olmalı, oluşturmak için `fdroid signindex` kullanın!" +#: ../fdroidserver/index.py +#, fuzzy +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "index-v1 bir imzaya sahip olmalı, oluşturmak için `fdroid signindex` kullanın!" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "tamsayı" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "geçersiz %(type)s değeri: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "geçersiz seçim: %(value)r (%(choices)s içinden seçin)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "geçersiz conflict_resolution değeri: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "geçersiz seçenek satırı %(option)r: %(prefix_chars)r karakteri ile başlamalı" @@ -2502,7 +2551,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "Yansıma '%s' 'fdroid' ile bitmiyor!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "birbirinden bağımsız argümanlar isteğe bağlı olmalıdır" @@ -2516,7 +2565,7 @@ msgid "no APK supplied" msgstr "APK sağlanmadı" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "böyle bir şeçenek yok: %s" @@ -2530,13 +2579,13 @@ msgid "no version information found" msgstr "sürüm bilgisi bulunamadı" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "argüman %s ile izin verilmez" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "%s argümanlarından biri gerekli" @@ -2551,55 +2600,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "seçenek %s: Tüm imzalı uygulamaları gerçekten kurmak istiyorsanız, --all kullanın" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "seçenek %s: geçersiz %s değeri: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "seçenek %s: geçersiz seçim: %r (%s içinden seçin)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "-%s seçeneği tanınmıyor" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "-%s seçeneği argüman gerektirir" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "--%s seçeneğinin argümanı olmamalı" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "--%s seçeneği tekil ön ek değil" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "--%s seçeneği tanınmıyor" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "--%s seçeneği argüman gerektirir" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "isteğe bağlı argümanlar" @@ -2609,7 +2658,7 @@ msgid "overwriting existing {path}" msgstr "var olan {path} üzerine yazılıyor" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "konumsal argümanlar" @@ -2638,6 +2687,10 @@ msgstr "repo_icon \"repo/icons/%s\" yok, yer tutucu oluşturuyor." msgid "repo_icon %s does not exist, generating placeholder." msgstr "repo_icon %s yok, yer tutucu oluşturuyor." +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml kurulu değil, üst veriler yazılamıyor." @@ -2657,13 +2710,14 @@ msgid "shared library" msgstr "paylaşımlı kütüphane" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "programın sürüm numarasını göster ve çık" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "bu yardım yazısını göster ve çık" @@ -2698,25 +2752,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "sağlanan zaman damgası değeri '{timestamp}' bir unix zaman damgası değil" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "şu argümanlar gerekli: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "beklenmeyen seçenek satırı: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "bilinmeyen ayrıştırıcı %(parser_name)r (seçenekler: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "tanınmayan argümanlar: %s" @@ -2728,6 +2782,7 @@ msgstr "'{config_file}' üzerinde güvenli olmayan izinler (0600 olmalı)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "kullanım: " @@ -2856,7 +2911,7 @@ msgstr "{name} \"{section}/icons/{path}\" yok! config.yml içinde düzeltin." msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} kullanımdan kaldırıldı, {newfile} kullanın" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} zaten var, içe aktarma sonuçları yok sayılıyor!" @@ -2891,7 +2946,7 @@ msgstr "{path}: {error}" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} \"fdroid\" ile bitmiyor, URL konumunu doğrulayın!" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} \"http\" ile başlamıyor!" diff --git a/locale/tzm/LC_MESSAGES/fdroidserver.po b/locale/tzm/LC_MESSAGES/fdroidserver.po index 96d067b9..e474559f 100644 --- a/locale/tzm/LC_MESSAGES/fdroidserver.po +++ b/locale/tzm/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-681-gc19e8952\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2020-10-29 08:32+0000\n" "Last-Translator: Hakim Oubouali \n" "Language-Team: Central Atlas Tamazight \n" @@ -94,13 +94,13 @@ msgstr "" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -113,7 +113,7 @@ msgid "%(prog)s [options] url" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: tazgalt: %(message)s\n" @@ -124,12 +124,12 @@ msgid "%d problems found" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [tidɣrin]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "" @@ -140,7 +140,7 @@ msgid "%s is not an accepted build field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "" @@ -166,7 +166,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -222,7 +222,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr "" @@ -263,7 +263,7 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -459,7 +459,7 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -486,11 +486,11 @@ msgstr "" msgid "Could not find '{command}' on your system" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -510,7 +510,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -627,7 +627,7 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -715,6 +715,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" +#: ../fdroidserver/nightly.py +#, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -744,9 +749,14 @@ msgid "Error while attempting to publish log: %s" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "" @@ -1230,6 +1240,11 @@ msgstr "" msgid "Malformed serverwebroot line:" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" @@ -1243,6 +1258,10 @@ msgstr "" msgid "Name '%s' is just the auto name - remove it" msgstr "" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "" @@ -1281,11 +1300,12 @@ msgstr "" msgid "No git submodules available" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "" @@ -1409,7 +1429,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "Tidɣrin" @@ -1427,7 +1447,7 @@ msgstr "" msgid "Outputting JSON" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "" @@ -1436,7 +1456,7 @@ msgstr "" msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "" @@ -1450,7 +1470,7 @@ msgstr "" msgid "Password required with username" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "" @@ -1473,6 +1493,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1505,7 +1530,7 @@ msgstr "" msgid "Produce human-readable index.xml" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "" @@ -1642,6 +1667,11 @@ msgstr "" msgid "Scan the source code of a package" msgstr "" +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1662,6 +1692,10 @@ msgstr[1] "" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1839,7 +1873,7 @@ msgstr "" msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "" @@ -2073,12 +2107,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "" @@ -2190,13 +2224,13 @@ msgid "adding to {name}: {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "" @@ -2235,8 +2269,12 @@ msgstr "" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "" @@ -2253,6 +2291,11 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" +#: /usr/lib/python3.9/argparse.py +#, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2265,12 +2308,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "" @@ -2293,12 +2336,12 @@ msgid "commands from plugin modules:" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2349,7 +2392,7 @@ msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "" @@ -2359,7 +2402,7 @@ msgid "executable binary, possibly code" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2367,17 +2410,17 @@ msgstr[0] "" msgstr[1] "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "" @@ -2395,7 +2438,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "" @@ -2416,7 +2459,7 @@ msgid "gzip file archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "" @@ -2425,31 +2468,35 @@ msgstr "" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "" +#: ../fdroidserver/index.py +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" @@ -2478,7 +2525,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2492,7 +2539,7 @@ msgid "no APK supplied" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "" @@ -2506,13 +2553,13 @@ msgid "no version information found" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "" @@ -2527,55 +2574,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "" @@ -2585,7 +2632,7 @@ msgid "overwriting existing {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "" @@ -2614,6 +2661,10 @@ msgstr "" msgid "repo_icon %s does not exist, generating placeholder." msgstr "" +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2633,13 +2684,14 @@ msgid "shared library" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "Smal taleqqemt n uhil, tffeɣd" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "" @@ -2674,25 +2726,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "" @@ -2704,6 +2756,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "" @@ -2832,7 +2885,7 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "" @@ -2867,7 +2920,7 @@ msgstr "" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "" diff --git a/locale/ug/LC_MESSAGES/fdroidserver.po b/locale/ug/LC_MESSAGES/fdroidserver.po index 759252d3..31f267fb 100644 --- a/locale/ug/LC_MESSAGES/fdroidserver.po +++ b/locale/ug/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2018-06-08 03:44+0000\n" "Last-Translator: ۋولقان \n" "Language-Team: Uyghur \n" @@ -95,13 +95,13 @@ msgstr "" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -114,7 +114,7 @@ msgid "%(prog)s [options] url" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "" @@ -125,12 +125,12 @@ msgid "%d problems found" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "" @@ -141,7 +141,7 @@ msgid "%s is not an accepted build field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "" @@ -167,7 +167,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -223,7 +223,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr "" @@ -264,7 +264,7 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -460,7 +460,7 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -487,11 +487,11 @@ msgstr "" msgid "Could not find '{command}' on your system" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -511,7 +511,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -628,7 +628,7 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -716,6 +716,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" +#: ../fdroidserver/nightly.py +#, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -745,9 +750,14 @@ msgid "Error while attempting to publish log: %s" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "" @@ -1231,6 +1241,11 @@ msgstr "" msgid "Malformed serverwebroot line:" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" @@ -1244,6 +1259,10 @@ msgstr "" msgid "Name '%s' is just the auto name - remove it" msgstr "" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "" @@ -1282,11 +1301,12 @@ msgstr "" msgid "No git submodules available" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "" @@ -1410,7 +1430,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "" @@ -1428,7 +1448,7 @@ msgstr "" msgid "Outputting JSON" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "" @@ -1437,7 +1457,7 @@ msgstr "" msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "" @@ -1451,7 +1471,7 @@ msgstr "" msgid "Password required with username" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "" @@ -1474,6 +1494,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1506,7 +1531,7 @@ msgstr "" msgid "Produce human-readable index.xml" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "" @@ -1643,6 +1668,11 @@ msgstr "" msgid "Scan the source code of a package" msgstr "" +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1663,6 +1693,10 @@ msgstr[1] "" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1840,7 +1874,7 @@ msgstr "" msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "" @@ -2074,12 +2108,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "" @@ -2191,13 +2225,13 @@ msgid "adding to {name}: {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "" @@ -2236,8 +2270,12 @@ msgstr "" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "" @@ -2254,6 +2292,11 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" +#: /usr/lib/python3.9/argparse.py +#, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2266,12 +2309,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "" @@ -2294,12 +2337,12 @@ msgid "commands from plugin modules:" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2350,7 +2393,7 @@ msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "" @@ -2360,7 +2403,7 @@ msgid "executable binary, possibly code" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2368,17 +2411,17 @@ msgstr[0] "" msgstr[1] "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "" @@ -2396,7 +2439,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "" @@ -2417,7 +2460,7 @@ msgid "gzip file archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "" @@ -2426,31 +2469,35 @@ msgstr "" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "" +#: ../fdroidserver/index.py +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" @@ -2479,7 +2526,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2493,7 +2540,7 @@ msgid "no APK supplied" msgstr "ھېچقانداق APK تەمىنلەنمىگەن" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "" @@ -2508,13 +2555,13 @@ msgid "no version information found" msgstr "نەشىر ئۇچۇرى تېپىلمىدى!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "" @@ -2529,55 +2576,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "" @@ -2587,7 +2634,7 @@ msgid "overwriting existing {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "" @@ -2616,6 +2663,10 @@ msgstr "" msgid "repo_icon %s does not exist, generating placeholder." msgstr "" +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2635,13 +2686,14 @@ msgid "shared library" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "" @@ -2676,25 +2728,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "" @@ -2706,6 +2758,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "" @@ -2834,7 +2887,7 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "" @@ -2869,7 +2922,7 @@ msgstr "" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "" diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 901be91d..610c237b 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2022-02-17 19:57+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" @@ -110,13 +110,13 @@ msgstr "\"{path}\" має непідтримуваний формат, конв msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "«{path}» підписано не дозволеним ключем:" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" є недійсною URL-адресою!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -130,7 +130,7 @@ msgid "%(prog)s [options] url" msgstr "%(prog)s url [можливості]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: помилка: %(message)s\n" @@ -141,12 +141,12 @@ msgid "%d problems found" msgstr "%d знайдено проблем" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [параметри]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "%r не можна викликати" @@ -157,7 +157,7 @@ msgid "%s is not an accepted build field" msgstr "%s не є прийнятним полем для створення" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "%s параметр не приймає значення" @@ -183,7 +183,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' не знайдено в config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' недійсний аргумент для позицій" @@ -239,7 +239,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "... checkupdate не вдалося для {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() не визначено" @@ -280,7 +280,7 @@ msgstr "Додати новий репозиторій лише для {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Псевдонім підписного ключа репозиторію у сховищі ключів" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Дозволяє вказати іншу версію (або git гілку) для початкового імпорту" @@ -477,7 +477,7 @@ msgstr "Перевірка архівації на {appid} — apks:{integer}, k msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Очистити оновлення - не використовує кеш, повторно обробляє всі APK" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Список категорій, розділених комами." @@ -504,11 +504,11 @@ msgstr "Суперечливі файли налаштувань! Викорис msgid "Could not find '{command}' on your system" msgstr "Не вдалося знайти '{command}' у вашій системі" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Не вдалося знайти останню версію коду" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Не вдалося знайти найновішу назву версії" @@ -528,7 +528,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Не вдалося проаналізувати розмір \"{size}\", неправильний тип \"{type}\"" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Не вдалося знайти ID застосунку" @@ -645,7 +645,7 @@ msgstr "Опис містить список (%s) але не маркірова msgid "Description of length {length} is over the {limit} char limit" msgstr "Довжина опису {length} перевищує ліміт {limit}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Не додавайте 'disable:' до створених записів збірки" @@ -735,6 +735,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ПОМИЛКА: непідтримуваний вид CI, виправлення вітається!" +#: ../fdroidserver/nightly.py +#, fuzzy, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "ПОМИЛКА: непідтримуваний вид CI, виправлення вітається!" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -766,9 +771,14 @@ msgid "Error while attempting to publish log: %s" msgstr "Помилка під час отримання адреси сховища: %s" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Помилка отримання адреси репозиторію" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "Експортування підписів з APK" @@ -1252,6 +1262,11 @@ msgstr "Несправні дзеркала репозиторію." msgid "Malformed serverwebroot line:" msgstr "Несправний шлях serverwebroot:" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Дзеркало всього репозиторію та архіву всіх типів файлів." @@ -1265,6 +1280,10 @@ msgstr "Відсутній вихідний шлях" msgid "Name '%s' is just the auto name - remove it" msgstr "Назву '%s' — створено самочинно, вилучіть її" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "Не знайдено 'config.yml', використовуючи типові налаштування." @@ -1303,11 +1322,12 @@ msgstr "Немає власного цифрового відбитка в URL- msgid "No git submodules available" msgstr "Немає доступних підмодулів git" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "Не знайдено жодного проєкту gradle. Вказати його у --subdir?" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "Подробиць не знайдено." @@ -1431,7 +1451,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Належний до OpenCollective метод допомоги OpenCollective: не вдалося" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "Параметри" @@ -1449,7 +1469,7 @@ msgstr "Вивід JSON на stdout." msgid "Outputting JSON" msgstr "Вивід JSON" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "Загальна ліцензія проєкту." @@ -1458,7 +1478,7 @@ msgstr "Загальна ліцензія проєкту." msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "Перезапис порожнього versionName у {apkfilename} з метаданих: {version}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "Пакунок \"{appid}\" вже існує" @@ -1472,7 +1492,7 @@ msgstr "Читання маніфесту у '{path}'" msgid "Password required with username" msgstr "Потрібен парольіз іменем користувача" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "Шлях до основного підкаталогу проєкту Android, якщо не в кореневому каталозі." @@ -1495,6 +1515,11 @@ msgstr "Шлях до сховища ключів для підписного к msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Вивести таємну змінну до термінала для легкого копіювання/вставлення" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1527,7 +1552,7 @@ msgstr "Створити доступний для читання людиною msgid "Produce human-readable index.xml" msgstr "Створити зручний для сприйняття index.xml" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "URL-адреса проєкту для імпорту." @@ -1664,6 +1689,11 @@ msgstr "Перевірити отриманий файл APK на наявніс msgid "Scan the source code of a package" msgstr "Сканування джерельного коду пакунка" +#: ../fdroidserver/scanner.py +#, fuzzy, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "Зчитувач знайшов {count} проблеми в {appid}:" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1685,6 +1715,11 @@ msgstr[2] "Знайдено {} проблем" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Перевірка APK на наявність відомих невільних класів за допомогою apkanalyzer." +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "Перевірка APK на наявність відомих невільних класів за допомогою apkanalyzer." + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1862,7 +1897,7 @@ msgstr "Ці застосунки, заархівовано з основног msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Цей репозиторій застосунків для використання з FDroid. Застосунки в цьому репозиторії — це або офіційні двійкові файли, побудовані розробниками оригінального застосунку, або двійкові файли, побудовані з джерела f-droid.org за допомогою інструментів з https://gitlab.com/fdroid." -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "Репозиторій вже має локальні метадані: %s" @@ -2103,12 +2138,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "Завантаження {apkfilename} до virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "Використання" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "Використання: %s\n" @@ -2220,13 +2255,13 @@ msgid "adding to {name}: {path}" msgstr "додавання до {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "неоднозначний параметр: %(option)s може відповідати %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "неоднозначний параметр: %s (%s?)" @@ -2265,8 +2300,12 @@ msgstr "applicationId для перевірки наявності оновле msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId з необов'язковим versionCode у формі APPID[:VERCODE]" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "аргумент \"-\" в режимі %r" @@ -2283,6 +2322,11 @@ msgstr "спроба відкритого з'єднання ssh для пере msgid "can not parse scrlib spec (not a string): '{}'" msgstr "не вдається проаналізувати специфікацію scrlib (не рядок): '{}'" +#: /usr/lib/python3.9/argparse.py +#, fuzzy, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "не може відкрити '%s': %s" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2295,12 +2339,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "не вдалося знайти потрібні srclibs: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "не може мати кілька аргументів підпарсера" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "не може об'єднати дії - дві групи мають ім'я %r" @@ -2323,12 +2367,12 @@ msgid "commands from plugin modules:" msgstr "команди з модулів плагіна:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "складний" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2380,7 +2424,7 @@ msgid "deployed process log {path} to {dest}" msgstr "розгорнуто журнал процесів {path} до {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= потрібен для таких варіантів, як %r" @@ -2390,7 +2434,7 @@ msgid "executable binary, possibly code" msgstr "виконуваний двійковий файл, можливо, код" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" @@ -2399,17 +2443,17 @@ msgstr[1] "очікується %s аргументи" msgstr[2] "очікується %s аргументів" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "очікується хоча б один аргумент" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "очікується не більше одного аргументу" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "очікується один аргумент" @@ -2427,7 +2471,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "fdroid [<команда>] [-h|--help|--version|<аргументи>]" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "з комою, що плаває" @@ -2448,7 +2492,7 @@ msgid "gzip file archive" msgstr "gzip-архів" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "нехтується явний аргумент %r" @@ -2457,31 +2501,36 @@ msgstr "нехтується явний аргумент %r" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 повинен мати підпис, використовуйте `fdroid signindex`, щоб створити його!" +#: ../fdroidserver/index.py +#, fuzzy +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "index-v1 повинен мати підпис, використовуйте `fdroid signindex`, щоб створити його!" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "ціле число" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "недійсне %(type)s значення: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "неправильний вибір: %(value)r (варто обрати з %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "недійсне значення conflict_resolution: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "неправильний рядок параметра %(option)r: повинен починатися зі знаку %(prefix_chars)r" @@ -2510,7 +2559,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "дзеркало '%s' не закінчується на 'fdroid'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "взаємозаперечні аргументи повинні бути необов'язковими" @@ -2524,7 +2573,7 @@ msgid "no APK supplied" msgstr "APK не надано" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "такого параметру немає: %s" @@ -2538,13 +2587,13 @@ msgid "no version information found" msgstr "не знайдено відомостей про версію" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "не дозволено з аргументом %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "потрібен один з аргументів %s" @@ -2559,55 +2608,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "параметр %s: Якщо ви дійсно хочете встановити всі підписані застосунки, використовуйте --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "параметр %s: недійсне %s значення: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "для параметра %s: неправильний вибір: %r (вибрати з %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "параметр -%s не розпізнано" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "параметр -%s потрібен аргумент" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "параметр --%s не має аргументу" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "параметр --%s не унікальний префікс" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "параметр --%s не визнано" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "параметр --%s потрібен аргумент" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "необов'язкові аргументи" @@ -2617,7 +2666,7 @@ msgid "overwriting existing {path}" msgstr "перезаписування наявного шляху {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "позиційні аргументи" @@ -2646,6 +2695,10 @@ msgstr "repo_icon \"repo/icons/%s\" не існує, створення запо msgid "repo_icon %s does not exist, generating placeholder." msgstr "repo_icon %s не існує, створення заповнювача." +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml не встановлено, не вдається записати метадані." @@ -2665,13 +2718,14 @@ msgid "shared library" msgstr "спільна бібліотека" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "показати номер версії програми та вийти" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "показати довідку та вийти" @@ -2706,25 +2760,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "надане значення часової позначки '{timestamp}' не є часовою міткою Unix" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "такі аргументи зобов'язані: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "неочікуваний рядок параметрів: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "невідомий парсер %(parser_name)r (варто вибрати: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "нерозпізнані аргументи: %s" @@ -2736,6 +2790,7 @@ msgstr "небезпечні дозволи на '{config_file}' (should be 0600 #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "використання: " @@ -2865,7 +2920,7 @@ msgstr "{name} \"{section}/icons/{path}\" не існує! Виправте йо msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} вилучено, використовується {newfile}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "{path} вже існує, нехтування результатами імпорту!" @@ -2900,7 +2955,7 @@ msgstr "{path}: {error}" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} не закінчується на \"fdroid\", перевірте шлях URL!" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} не починається на \"http\"!" diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 4a66ae09..2ec3049c 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -24,7 +24,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2022-08-23 13:16+0000\n" "Last-Translator: Yang Yulin \n" "Language-Team: Chinese (Simplified) \n" @@ -122,13 +122,13 @@ msgstr "\"{path}\" 不是可接受的格式, 需转换成 : {formats}" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "\"{path}\" 由不允许的密钥所签署:" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" 不是有效的链接!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -140,7 +140,7 @@ msgid "%(prog)s [options] url" msgstr "%(prog)s [选项] 链接" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: 错误: %(message)s\n" @@ -151,12 +151,12 @@ msgid "%d problems found" msgstr "发现 %d 个问题" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "%prog [options]" msgstr "%prog [选项]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "%r 不可调用" @@ -167,7 +167,7 @@ msgid "%s is not an accepted build field" msgstr "%s 不是一个被接受的构建字段" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "%s 选项不采用参数" @@ -193,7 +193,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "config.yml 中找不到 'repo_keyalias'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' 是位置的无效参数" @@ -249,7 +249,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "...为 {appid} 检查更新失败: {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() 未定义" @@ -290,7 +290,7 @@ msgstr "仅为 {name} 添加新存储库" msgid "Alias of the repo signing key in the keystore" msgstr "密钥库中存储库签名密钥的别名" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "可让运行初始导入时指定不同修订 ( 或 git 分支 )" @@ -485,7 +485,7 @@ msgstr "正为 {appid} 检查存档: 安装包: {integer}, 保留版本数: {kee msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "干净的更新 - 不使用缓存,重新处理全部 APK 文件" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "逗号分割的目录列表。" @@ -512,11 +512,11 @@ msgstr "冲突的配置文件! 使用 {newfile}, 忽略 {oldfile}!" msgid "Could not find '{command}' on your system" msgstr "在您的系统中无法找到 '{command}'" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "找不到最新版本代码" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "找不到最新的版本名" @@ -536,7 +536,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "无法解析大小 \"{size}\", 错误类型 \"{type}\"" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "找不到应用ID" @@ -653,7 +653,7 @@ msgstr "简介中带有列表(%s),但它既不是子弹(*)形列表也 msgid "Description of length {length} is over the {limit} char limit" msgstr "简介长度 {length} 超过 {limit} 字限制" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "不要给生成的构建项添加 'disable:'" @@ -743,6 +743,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "错误:不支持此类 CI,如果有能力请帮我们添加支持!" +#: ../fdroidserver/nightly.py +#, fuzzy, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "错误:不支持此类 CI,如果有能力请帮我们添加支持!" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -774,9 +779,14 @@ msgid "Error while attempting to publish log: %s" msgstr "尝试发布日志时出错:%s" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "获取存储库地址时出错" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "从 APK 中提取签名" @@ -1260,6 +1270,11 @@ msgstr "格式错误的存储库镜像。" msgid "Malformed serverwebroot line:" msgstr "格式错误的服务器网络根行:" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "镜像完整存储库和存档,所有文件类型。" @@ -1273,6 +1288,10 @@ msgstr "缺少输出目录" msgid "Name '%s' is just the auto name - remove it" msgstr "名称 '%s' 只是自动名称 - 删除它" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "未找到“config.yml”,使用默认值。" @@ -1311,11 +1330,12 @@ msgstr "URL 中没有指纹。" msgid "No git submodules available" msgstr "没有可用的 git 子模块" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" msgstr "找不到任何 gradle 项目。指定 --subdir?" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "未找到任何信息。" @@ -1439,7 +1459,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "OpenCollective 捐赠方法属于 OpenCollective: 字段" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Options" msgstr "选项" @@ -1457,7 +1477,7 @@ msgstr "将 JSON 输出到标准输出。" msgid "Outputting JSON" msgstr "输出 JSON" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "项目总体许可证。" @@ -1466,7 +1486,7 @@ msgstr "项目总体许可证。" msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "从元数据覆盖 {apkfilename} 中的空白版本名称:{version}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "包“{appid}”已经存在" @@ -1480,7 +1500,7 @@ msgstr "在“{path}”处解析清单" msgid "Password required with username" msgstr "需要密码和用户名" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "主Android项目子目录的路径(如果不是根目录)." @@ -1503,6 +1523,11 @@ msgstr "资源库签名密钥的密钥存储(keystore)路径" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "将秘密变量打印到终端以便于复制/粘贴" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1535,7 +1560,7 @@ msgstr "为索引文件生成人类可读的XML/JSON" msgid "Produce human-readable index.xml" msgstr "生成用户可读的 index.xml" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "项目 URL 导入位置。" @@ -1672,6 +1697,11 @@ msgstr "扫描产生的 APK(s) 是否有已知的非自由类。" msgid "Scan the source code of a package" msgstr "扫描一个应用的源代码" +#: ../fdroidserver/scanner.py +#, fuzzy, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "扫描仪在 {appid} 中发现 {count} 个问题:" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1691,6 +1721,11 @@ msgstr[0] "扫描仪发现 {} 个问题" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "使用 apkanalyzer 扫描 APK 以查找已知的非免费类。" +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "使用 apkanalyzer 扫描 APK 以查找已知的非免费类。" + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1868,7 +1903,7 @@ msgstr "" msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "这是一个与F-Droid一起使用的应用的存储库。这个存储库中的应用要么是原应用开发者构建的官方二进制文件,要么是 f-droid.org 的管理员使用 https://gitlab.com/fdroid 上的工具从源代码构建而来的二进制文件。" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "" @@ -2102,12 +2137,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "使用" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "用法:%s\n" @@ -2219,13 +2254,13 @@ msgid "adding to {name}: {path}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "模糊的选项:%(option)s 可以相配 %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "模糊的选项:%s(%s?)" @@ -2264,8 +2299,12 @@ msgstr "检查更新的applicationId" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "带有可选 versionCode 的 app-id,格式:APPID[:VERCODE]" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "" @@ -2282,6 +2321,11 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" +#: /usr/lib/python3.9/argparse.py +#, fuzzy, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "无法打开 '%s': %s" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2294,12 +2338,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "" @@ -2322,12 +2366,12 @@ msgid "commands from plugin modules:" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "复合体" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2377,7 +2421,7 @@ msgid "deployed process log {path} to {dest}" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "" @@ -2387,24 +2431,24 @@ msgid "executable binary, possibly code" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "" @@ -2422,7 +2466,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "用法:fdroid [-h|--help|--version] []" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "" @@ -2443,7 +2487,7 @@ msgid "gzip file archive" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "" @@ -2452,31 +2496,35 @@ msgstr "" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "" +#: ../fdroidserver/index.py +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" @@ -2505,7 +2553,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2519,7 +2567,7 @@ msgid "no APK supplied" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "没有此选项:%s" @@ -2533,13 +2581,13 @@ msgid "no version information found" msgstr "没有找到版本信息" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "" @@ -2554,55 +2602,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "未知的选项 -%s" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "选项 -%s 需要参数" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "选项 --%s 不能有参数" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "选项 --%s 不是一个唯一前缀" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "无法识别选项 -%s" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "选项 --%s 需要参数" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "可选参数" @@ -2612,7 +2660,7 @@ msgid "overwriting existing {path}" msgstr "正在覆盖现有{path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "位置参数" @@ -2641,6 +2689,10 @@ msgstr "" msgid "repo_icon %s does not exist, generating placeholder." msgstr "" +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2660,13 +2712,14 @@ msgid "shared library" msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "显示程序的版本号并退出" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "显示本帮助信息并退出" @@ -2701,25 +2754,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "需要此下参数:%s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "未预期的选项字符串:%s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "未识别的参数:%s" @@ -2731,6 +2784,7 @@ msgstr "{config_file} 的文件权限不安全 ( 应该设为0600 ) !" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "用法: " @@ -2858,7 +2912,7 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "" @@ -2893,7 +2947,7 @@ msgstr "{path}: {error}" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "" diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 95b931c7..13de51e5 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2022-02-15 20:04+0100\n" +"POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Chinese (Traditional) \n" @@ -108,13 +108,13 @@ msgstr "\"{path}\" 不是可接受的格式,轉換成: {formats}" msgid "\"{path}\" is signed by a key that is not allowed:" msgstr "有 \"{path}\" 存在,但是沒有安裝 s3cmd!" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" 不是一個有效的網址!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" @@ -126,7 +126,7 @@ msgid "%(prog)s [options] url" msgstr "%(prog)s [選項]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, fuzzy, python-format msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: 錯誤: %(message)s\n" @@ -137,13 +137,13 @@ msgid "%d problems found" msgstr "發現 %d 個問題" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, fuzzy msgid "%prog [options]" msgstr "%prog [選項]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%r is not callable" msgstr "%r 不可呼叫" @@ -154,7 +154,7 @@ msgid "%s is not an accepted build field" msgstr "%s 為不可編譯欄位" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "%s option does not take a value" msgstr "%s 選項不帶值" @@ -180,7 +180,7 @@ msgid "'repo_keyalias' not found in config.yml!" msgstr "config.yml 找不到 'repo_keyalias'!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "這些地方的 '必填' 為無效引數" @@ -237,7 +237,7 @@ msgid "...checkupdate failed for {appid} : {error}" msgstr "{appid} 檢查更新失敗:{error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid ".__call__() not defined" msgstr ".__call__() 未定義" @@ -278,7 +278,7 @@ msgstr "只為 {name} 新增軟體庫" msgid "Alias of the repo signing key in the keystore" msgstr "在金鑰庫裡軟體庫簽署金鑰的別名" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "允許為初始匯入指定不同的校訂(或 git 分支)" @@ -476,7 +476,7 @@ msgstr "檢查 {appid} 的歸檔 - APKs:{integer},keepversions:{keep},archap msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "清除更新 - 不使用快取,重新處理全部的 APK" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "以逗號分隔類別清單。" @@ -504,12 +504,12 @@ msgstr "衝突的配置文件! 使用新文件 {newfile}, 忽略舊文件 {old msgid "Could not find '{command}' on your system" msgstr "在您的系統上找不到 '{command}'" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, fuzzy msgid "Could not find latest version code" msgstr "找不到最新版的代碼" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, fuzzy msgid "Could not find latest version name" msgstr "找不到最新的版本名稱" @@ -530,7 +530,7 @@ msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "無法解析大小 (\"{size}\") , \"{type}\" 是錯的" #. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, fuzzy msgid "Couldn't find Application ID" msgstr "找不到應用的 ID" @@ -649,7 +649,7 @@ msgstr "描述中有一個列表 (%s) 但它並未被編排 (*) 或作編號 (#) msgid "Description of length {length} is over the {limit} char limit" msgstr "描述的長度 {length} 已超過 {limit} 個字符限制" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, fuzzy msgid "Do not add 'disable:' to the generated build entries" msgstr "不要在生成的編譯路徑中添加 'disable:'" @@ -741,6 +741,11 @@ msgstr "" msgid "ERROR: unsupported CI type, patches welcome!" msgstr "出錯:未支援 CI 類型,歡迎補強!" +#: ../fdroidserver/nightly.py +#, fuzzy, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "出錯:未支援 CI 類型,歡迎補強!" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Empty build flag at {linedesc}" @@ -772,9 +777,14 @@ msgid "Error while attempting to publish log: %s" msgstr "在嘗試刊登日誌時出錯:%s" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "在接取軟體庫的地址時出錯" +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "自 APKs 捽取出簽名" @@ -1270,6 +1280,11 @@ msgstr "軟體庫鏡像異常。" msgid "Malformed serverwebroot line:" msgstr "異常的 serverwebroot 行:" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + #: ../fdroidserver/mirror.py #, fuzzy msgid "Mirror the full repo and archive, all file types." @@ -1284,6 +1299,10 @@ msgstr "輸出目錄消失" msgid "Name '%s' is just the auto name - remove it" msgstr "名稱 '%s' 為自動產生 - 請移除它" +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "找不到 'config.yml',使用預設。" @@ -1323,12 +1342,13 @@ msgstr "在 URL 無指紋。" msgid "No git submodules available" msgstr "無可用的 git 子模組" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, fuzzy msgid "No gradle project could be found. Specify --subdir?" msgstr "找不到任何 gradle 專案。 需要用參數 '--subdir' 指定子目錄嗎?" #: ../fdroidserver/import.py ../fdroidserver/common.py +#: ../fdroidserver/import_subcommand.py msgid "No information found." msgstr "查無資訊。" @@ -1457,7 +1477,7 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "OpenCollective 的捐款方式在 OpenCollective: 的標誌下面" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, fuzzy msgid "Options" msgstr "選項" @@ -1478,7 +1498,7 @@ msgstr "輸出 JSON 到 stdout 。" msgid "Outputting JSON" msgstr "正在導出 JSON 中 ..." -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Overall license of the project." msgstr "該專案的整體授權。" @@ -1487,7 +1507,7 @@ msgstr "該專案的整體授權。" msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" msgstr "覆蓋在 {apkfilename} 中的空白 versionName 從詮釋資料:{version}" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, fuzzy, python-brace-format msgid "Package \"{appid}\" already exists" msgstr "軟體 \"{appid}\" 已經存在了" @@ -1501,7 +1521,7 @@ msgstr "解析 '{path}' 的單號" msgid "Password required with username" msgstr "用戶名稱須有密碼" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." msgstr "如果不在根目錄下,路徑為 android 主要專案的子目錄。" @@ -1524,6 +1544,11 @@ msgstr "給軟體庫簽署金鑰的金鑰庫路徑" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "在終端機顥示祕密變數以便於複製/貼上" +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Problem with description of {appid}: {error}" @@ -1556,7 +1581,7 @@ msgstr "產生可讀懂的 XML/JSON 格式以進行檔案索引" msgid "Produce human-readable index.xml" msgstr "產生可讀懂的 index.xml 格式" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Project URL to import from." msgstr "要導入的專案網址。" @@ -1694,6 +1719,11 @@ msgstr "在生成的 APK 檔案中掃描已知的閉源軟體 。" msgid "Scan the source code of a package" msgstr "掃描套件包的原始碼" +#: ../fdroidserver/scanner.py +#, fuzzy, python-brace-format +msgid "Scanner found {count} problems in {apk}:" +msgstr "掃瞄器在 {appid} 發現{count} 個問題:" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" @@ -1714,6 +1744,11 @@ msgstr[0] "掃瞄器發現 {} 問題" msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "在生成的 APK 檔案中掃描已知的閉源軟體 。" +#: ../fdroidserver/scanner.py +#, fuzzy +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "在生成的 APK 檔案中掃描已知的閉源軟體 。" + #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" @@ -1894,7 +1929,7 @@ msgstr "這些是從主軟體庫中歸檔的軟體。" msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "這是一個和 F-Droid 配套使用的軟體庫。此軟體庫中包含由程式原開發者編譯製作而成的二進制包和由 fdroid.org 的管理員使用 https://gitlab.com/fdroid 上的開發者工具編譯製作而成的二進制包。" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" msgstr "這個軟體庫已有本地的中介資料:%s" @@ -2133,12 +2168,12 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "正在將軟體檔案 {apkfilename} 上傳到 virustotal 。" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" msgstr "使用方法" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "Usage: %s\n" msgstr "使用方法:%s\n" @@ -2254,13 +2289,13 @@ msgid "adding to {name}: {path}" msgstr "添加到 {name}:{path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "模糊選項:%(option)s 可以相配 %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" msgstr "不明確的選項:%s (%s?)" @@ -2303,8 +2338,12 @@ msgstr "以 applicationId 檢查更新" msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" msgstr "applicationId 具有任選的 versionCode 在此格式為 APPID [:VERCODE]" +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" msgstr "引數 \"-\" 為帶 %r 模式" @@ -2323,6 +2362,11 @@ msgstr "試圖顯露 ssh 連線來測試佈署金鑰:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "無法解析 scrlib spec (不是字符): '{}'" +#: /usr/lib/python3.9/argparse.py +#, fuzzy, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "無法打開 '%s':%s" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format @@ -2335,12 +2379,12 @@ msgid "cannot find required srclibs: \"{path}\"" msgstr "找不到必須的 scrlibs: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "cannot have multiple subparser arguments" msgstr "無法有多個子解析器引數" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" msgstr "無法合併動作 - 二個群體被命名為 %r" @@ -2364,12 +2408,12 @@ msgid "commands from plugin modules:" msgstr "來自插換式模塊的命令:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" msgstr "複雜" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" @@ -2421,7 +2465,7 @@ msgid "deployed process log {path} to {dest}" msgstr "將進程日誌 {path} 部署到 {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "dest= is required for options like %r" msgstr "dest= 如 %r 選項為必須" @@ -2432,24 +2476,24 @@ msgid "executable binary, possibly code" msgstr "可執行二進制檔案, 估計是代碼" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "預期的 %s 引數" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at least one argument" msgstr "預期至少有一個引數" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected at most one argument" msgstr "最多一個引數" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "expected one argument" msgstr "預期有一個引數" @@ -2467,7 +2511,7 @@ msgid "fdroid [] [-h|--help|--version|]" msgstr "用法:fdroid [-h|--help|--version] <命令> []" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "floating-point" msgstr "浮點" @@ -2489,7 +2533,7 @@ msgid "gzip file archive" msgstr "gzip 壓縮檔案" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "ignored explicit argument %r" msgstr "被忽略的明確引數 %r" @@ -2498,31 +2542,36 @@ msgstr "被忽略的明確引數 %r" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 必須要有簽名, 使用 `fdroid signindex`來建立一組簽名!" +#: ../fdroidserver/index.py +#, fuzzy +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "index-v1 必須要有簽名, 使用 `fdroid signindex`來建立一組簽名!" + #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "integer" msgstr "整數" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "無效 %(type)s 值:%(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "無效選項:%(value)r (選取自 %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "無效 conflict_resolution 值:%r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "無效的選項字串 %(option)r:必須以字符 %(prefix_chars)r為起頭" @@ -2551,7 +2600,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "鏡像 '%s' 並不是以 'fdroid' 作結尾!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "相互獨佔的引數必須為可選的" @@ -2565,7 +2614,7 @@ msgid "no APK supplied" msgstr "無 APK 被供應" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "no such option: %s" msgstr "沒這樣的選項:%s" @@ -2580,13 +2629,13 @@ msgid "no version information found" msgstr "未發現版本資訊!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "不許可帶引數 %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "one of the arguments %s is required" msgstr "引數 %s 必須要有一個" @@ -2601,55 +2650,55 @@ msgid "option %s: If you really want to install all the signed apps, use --all" msgstr "選項 %s: 如果真要安裝全部的簽署應用, 請使用 --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid %s value: %r" msgstr "選項 %s: 無效的 %s 值: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" msgstr "選項 %s: 無效選項: %r (選自 %s )" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s not recognized" msgstr "不能識別選項 -%s" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option -%s requires argument" msgstr "選項 -%s 需要參數" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s must not have an argument" msgstr "選項 --%s 不能有參數" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not a unique prefix" msgstr "選項 --%s 不是單獨的字首" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s not recognized" msgstr "不能識別選項 --%s" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #, python-format msgid "option --%s requires argument" msgstr "選項 --%s 需要參數" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" msgstr "可選參數" @@ -2659,7 +2708,7 @@ msgid "overwriting existing {path}" msgstr "覆寫現有的 {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "positional arguments" msgstr "位置參數" @@ -2688,6 +2737,10 @@ msgstr "軟體庫圖標 (repo_icon)\"repo/icons/%s\" 不存在, 正在生 msgid "repo_icon %s does not exist, generating placeholder." msgstr "軟體庫圖標 (repo_icon)%s 不存在, 正在生成佔位用的圖標。" +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + #: ../fdroidserver/metadata.py #, fuzzy msgid "ruamel.yaml not installed, can not write metadata." @@ -2709,13 +2762,14 @@ msgid "shared library" msgstr "共享庫 (shared library)" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "show program's version number and exit" msgstr "顯示程式的版本號碼並離開" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py msgid "show this help message and exit" msgstr "顯示此說明訊息並離開" @@ -2751,25 +2805,25 @@ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" msgstr "提供的時間戳值「{timestamp}」並非 unix 時間戳" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "the following arguments are required: %s" msgstr "需要下列參數:%s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "非預期選項字串: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "不明解析器 %(parser_name)r (選項: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "unrecognized arguments: %s" msgstr "無法辨識的引數:%s" @@ -2781,6 +2835,7 @@ msgstr "'{config_file}' 檔案不安全的權限(應為 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py msgid "usage: " msgstr "使用方法: " @@ -2910,7 +2965,7 @@ msgstr "{name} \"{section}/icons/{path}\" 不存在! 請檢查 \"config.yml\"." msgid "{oldfile} is deprecated, use {newfile}" msgstr "檔案 {oldfile} 已經過時了, 請使用檔案 {newfile} 。" -#: ../fdroidserver/import.py +#: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, fuzzy, python-brace-format msgid "{path} already exists, ignoring import results!" msgstr "路徑 {path} 已存在, 忽略導入的結果!" @@ -2945,7 +3000,7 @@ msgstr "讀取路徑 {path} 失敗:錯誤訊息{error}" msgid "{url} does not end with \"fdroid\", check the URL path!" msgstr "{url} 未以 \"fdroid\" 結尾,檢查 URL 路徑!" -#: ../fdroidserver/common.py +#: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, fuzzy, python-brace-format msgid "{url} does not start with \"http\"!" msgstr "{url} 未以 \"http\" 起頭 !" From dbe4af795171800168cf6793f4040a804cb784c7 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 8 Sep 2022 11:28:59 +0200 Subject: [PATCH 0782/2116] gitlab-ci: make push in "docker" job opt-in gitlab.com has added pretty small quotas to free tier accounts, and this job pushes a docker image that is nearly 1GB. And those rarely get used, so this makes it opt in via a variable that can be set when manually running a job, or globally in the "CI/CD Variables" Settings. --- .gitlab-ci.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 22623e4c..2278c408 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -580,5 +580,10 @@ docker: - docker tag $TEST_IMAGE $RELEASE_IMAGE - docker tag $TEST_IMAGE ${RELEASE_IMAGE}-stretch - echo $CI_BUILD_TOKEN | docker login -u gitlab-ci-token --password-stdin registry.gitlab.com + # This avoids filling up gitlab.com free tier accounts with unused docker images. + - echo "Skipping docker push to save quota on your gitlab namespace." + - echo "If you want to enable the push, set FDROID_PUSH_DOCKER_IMAGE in" + - echo "https://gitlab.com/$CI_PROJECT_NAMESPACE/fdroidserver/-/settings/ci_cd#js-cicd-variables-settings" + - test -n "$FDROID_PUSH_DOCKER_IMAGE" || exit 0 - docker push $RELEASE_IMAGE - docker push $RELEASE_IMAGE-stretch From 2d5d98fe32c30cd184d0b28f121c1e3982b9fccc Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 8 Sep 2022 17:51:23 +0200 Subject: [PATCH 0783/2116] gitlab-ci: stop tags/branches overwriting buildserver docker image https://gitlab.com/fdroid/fdroidserver/-/jobs/2988110595 https://gitlab.com/eighthave/fdroidserver/-/jobs/2997738047 --- .gitlab-ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2278c408..6edcb467 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -560,6 +560,10 @@ pages: - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' # only publish pages on default (master) branch +# This job pushes the official CI docker image based on the master +# branch, so in fdroid/fdroidserver, it should only run on the master +# branch. Otherwise, tags or other branches will overwrite the docker +# image which is supposed to be what is in master. docker: dependencies: - fdroid build @@ -568,6 +572,8 @@ docker: - .gitlab-ci.yml - makebuildserver - buildserver/* + variables: + - $CI_COMMIT_BRANCH == "master" || $CI_PROJECT_NAMESPACE != "fdroid" image: docker:git services: - docker:dind From da9a12bf5ad06d39bd3a60a7c8fe3b20e69391c6 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 8 Sep 2022 08:56:47 +0200 Subject: [PATCH 0784/2116] CI: Bump RELEASE_COMMIT_ID for new release Drop old sed hacks. --- .gitlab-ci.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6edcb467..d1b1597b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -40,7 +40,7 @@ metadata_v0: image: registry.gitlab.com/fdroid/fdroidserver:buildserver variables: GIT_DEPTH: 1000 - RELEASE_COMMIT_ID: 37c95f59a17d86723fdb71e984121726db777f32 # 2.0a5~ + RELEASE_COMMIT_ID: b987a4af5c770472f7db8958b304b28b1e6624fd # 2.1.1 script: - git fetch https://gitlab.com/fdroid/fdroidserver.git $RELEASE_COMMIT_ID - cd tests @@ -55,11 +55,6 @@ metadata_v0: - git checkout $GITCOMMIT - cd fdroiddata - ../tests/dump_internal_metadata_format.py - - sed -i - -e '/AllowedAPKSigningKeys:/d' - -e '/Liberapay:/d' - -e '/OpenCollective/d' - metadata/dump_*/*.yaml - diff -uw metadata/dump_* .apt-template: &apt-template From e79585b0c068b41e72c87f05b61c4f2c29dfedfb Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 5 Sep 2022 18:51:05 +0200 Subject: [PATCH 0785/2116] index: remove unused, confusing args to file_entry() --- fdroidserver/index.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 6599565b..bdb1dd86 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -489,17 +489,11 @@ def dict_diff(source, target): return result -def file_entry(filename, hashType=None, hsh=None, size=None): +def file_entry(filename, hash_value=None): meta = {} meta["name"] = "/" + filename.split("/", 1)[1] - if hsh: - meta[hashType] = hsh - if hsh != "sha256": - meta["sha256"] = common.sha256sum(filename) - if size: - meta["size"] = size - else: - meta["size"] = os.stat(filename).st_size + meta["sha256"] = hash_value or common.sha256sum(filename) + meta["size"] = os.stat(filename).st_size return meta @@ -619,13 +613,13 @@ def convert_version(version, app, repodir): if "obbMainFile" in version: ver["obbMainFile"] = file_entry( os.path.join(repodir, version["obbMainFile"]), - "sha256", version["obbMainFileSha256"] + version["obbMainFileSha256"], ) if "obbPatchFile" in version: ver["obbPatchFile"] = file_entry( os.path.join(repodir, version["obbPatchFile"]), - "sha256", version["obbPatchFileSha256"] + version["obbPatchFileSha256"], ) ver["manifest"] = manifest = {} From b854f3bab76fa1e507d4134602e42672ea229679 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 5 Sep 2022 20:46:32 +0200 Subject: [PATCH 0786/2116] update: fully isolate testInsertStoreMetadata test The test was failing due to something on my local filesystem, this runs the test in a new dir every time. --- tests/update.TestCase | 55 ++++++++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/tests/update.TestCase b/tests/update.TestCase index 4c35bf86..736a50b7 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -88,28 +88,49 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.config = None fdroidserver.common.options = None - def testInsertStoreMetadata(self): + def test_insert_store_metadata(self): + tmptestsdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.chdir(tmptestsdir) + config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.update.config = config - os.chdir(os.path.join(localmodule, 'tests')) - shutil.rmtree(os.path.join('repo', 'info.guardianproject.urzip'), ignore_errors=True) - - shutil.rmtree(os.path.join('build', 'com.nextcloud.client'), ignore_errors=True) - shutil.copytree(os.path.join('source-files', 'com.nextcloud.client'), - os.path.join('build', 'com.nextcloud.client')) - - shutil.rmtree(os.path.join('build', 'com.nextcloud.client.dev'), ignore_errors=True) - shutil.copytree(os.path.join('source-files', 'com.nextcloud.client.dev'), - os.path.join('build', 'com.nextcloud.client.dev')) - - shutil.rmtree(os.path.join('build', 'eu.siacs.conversations'), ignore_errors=True) - shutil.copytree(os.path.join('source-files', 'eu.siacs.conversations'), - os.path.join('build', 'eu.siacs.conversations')) + repo_dir = os.path.join(self.basedir, 'repo') + os.mkdir('metadata') + for packageName in ( + 'obb.mainpatch.current', + 'org.videolan.vlc', + ): + shutil.copytree( + os.path.join(repo_dir, packageName), + os.path.join('repo', packageName) + ) + for packageName in ( + 'info.guardianproject.checkey', + 'info.guardianproject.urzip', + 'org.smssecure.smssecure', + ): + if not os.path.exists('metadata'): + os.mkdir('metadata') + shutil.copytree( + os.path.join(self.basedir, 'metadata', packageName), + os.path.join('metadata', packageName) + ) + for packageName in ( + 'com.nextcloud.client', + 'com.nextcloud.client.dev', + 'eu.siacs.conversations', + ): + shutil.copytree( + os.path.join(self.basedir, 'source-files', packageName), + os.path.join(tmptestsdir, 'build', packageName), + ) testfilename = 'icon_yAfSvPRJukZzMMfUzvbYqwaD1XmHXNtiPBtuPVHW-6s=.png' - testfile = os.path.join('repo', 'org.videolan.vlc', 'en-US', 'icon.png') + testfile = os.path.join(repo_dir, 'org.videolan.vlc', 'en-US', 'icon.png') cpdir = os.path.join('metadata', 'org.videolan.vlc', 'en-US') cpfile = os.path.join(cpdir, testfilename) os.makedirs(cpdir, exist_ok=True) @@ -155,7 +176,7 @@ class UpdateTest(unittest.TestCase): self.assertEqual(6, len(apps)) for packageName, app in apps.items(): - self.assertTrue('localized' in app) + self.assertTrue('localized' in app, packageName) self.assertTrue('en-US' in app['localized']) self.assertEqual(1, len(app['localized'])) if packageName == 'info.guardianproject.urzip': From 53a507d7c4f35421da4c6dc9b2bf89a993113f69 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 22 Apr 2022 11:11:43 +0200 Subject: [PATCH 0787/2116] buildserver: default to HTTPS for apt sources Debian Docker images will soon default to HTTPS for apt sources, so force it now: https://github.com/debuerreotype/docker-debian-artifacts/issues/15 --- buildserver/Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/buildserver/Dockerfile b/buildserver/Dockerfile index 0d968a07..3d9ee52f 100644 --- a/buildserver/Dockerfile +++ b/buildserver/Dockerfile @@ -31,9 +31,13 @@ RUN useradd --create-home -s /bin/bash vagrant && echo -n 'vagrant:vagrant' | ch # the provision scripts must be run in the same order as in Vagrantfile # - vagrant needs openssh-client iproute2 ssh sudo # - ansible needs python3 +# Debian Docker images will soon default to HTTPS for apt sources, so force it. +# https://github.com/debuerreotype/docker-debian-artifacts/issues/15 RUN printf "path-exclude=/usr/share/locale/*\npath-exclude=/usr/share/man/*\npath-exclude=/usr/share/doc/*\npath-include=/usr/share/doc/*/copyright\n" >/etc/dpkg/dpkg.cfg.d/01_nodoc \ && mkdir -p /usr/share/man/man1 \ && apt-get update \ + && apt-get install apt-transport-https ca-certificates \ + && sed -i 's,http:,https:,' /etc/apt/sources.list \ && apt-get upgrade \ && apt-get dist-upgrade \ && apt-get install openssh-client iproute2 python3 openssh-server sudo \ From 66d8b783f0cc4396a1ea80f989973b6063638ddc Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 8 Sep 2022 18:11:33 +0200 Subject: [PATCH 0788/2116] gitlab-ci: only display message if not running docker push --- .gitlab-ci.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d1b1597b..3c6094f1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -582,9 +582,11 @@ docker: - docker tag $TEST_IMAGE ${RELEASE_IMAGE}-stretch - echo $CI_BUILD_TOKEN | docker login -u gitlab-ci-token --password-stdin registry.gitlab.com # This avoids filling up gitlab.com free tier accounts with unused docker images. - - echo "Skipping docker push to save quota on your gitlab namespace." - - echo "If you want to enable the push, set FDROID_PUSH_DOCKER_IMAGE in" - - echo "https://gitlab.com/$CI_PROJECT_NAMESPACE/fdroidserver/-/settings/ci_cd#js-cicd-variables-settings" - - test -n "$FDROID_PUSH_DOCKER_IMAGE" || exit 0 + - if test -n "$FDROID_PUSH_DOCKER_IMAGE"; then + echo "Skipping docker push to save quota on your gitlab namespace."; + echo "If you want to enable the push, set FDROID_PUSH_DOCKER_IMAGE in"; + echo "https://gitlab.com/$CI_PROJECT_NAMESPACE/fdroidserver/-/settings/ci_cd#js-cicd-variables-settings"; + exit 0; + fi - docker push $RELEASE_IMAGE - docker push $RELEASE_IMAGE-stretch From 483d6da51c574102aebacbb263b524ab4afa27ba Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 8 Sep 2022 18:26:38 +0200 Subject: [PATCH 0789/2116] Cleanup tests/dump_internal_metadata_format.py - Update usage documentation. - Use argparse. - Simplify config handling (similar to readmeta.py). - Drop code for fdroidserver before 0.7.0. - Reformat with black. --- .gitlab-ci.yml | 1 + tests/dump_internal_metadata_format.py | 81 +++++++------------------- 2 files changed, 23 insertions(+), 59 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3c6094f1..3a04d6dd 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -248,6 +248,7 @@ black: setup.py tests/build.TestCase tests/deploy.TestCase + tests/dump_internal_metadata_format.py tests/exception.TestCase tests/import_subcommand.TestCase tests/init.TestCase diff --git a/tests/dump_internal_metadata_format.py b/tests/dump_internal_metadata_format.py index e4679449..c3975902 100755 --- a/tests/dump_internal_metadata_format.py +++ b/tests/dump_internal_metadata_format.py @@ -9,27 +9,28 @@ # The idea is to test changes using all of the files in # fdroiddata.git. To run it, do: # -# cd fdroidserver/tests -# cp dump_internal_metadata_format.py dump.py # since this isn't in old commits -# git checkout 0.7.0 # or any old commit of your choosing -# cd ../../fdroiddata -# ../fdroidserver/tests/dump.py -# mv metadata/dump metadata/dump_0.7.0 +# cd fdroidserver +# git checkout +# cd ../fdroiddata +# ../fdroidserver/tests/dump_internal_metadata_format.py # cd ../fdroidserver # git checkout master # cd ../fdroiddata -# ../fdroidserver/tests/dump.py -# meld metadata/dump_0.7.0 metadata/dump_0.7.0-179-ge85486a/ +# ../fdroidserver/tests/dump_internal_metadata_format.py +# diff -uw metadata/dump_* -import git import inspect -import optparse import os import sys +from argparse import ArgumentParser + +import git + import yaml localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')) + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) if localmodule not in sys.path: sys.path.insert(0, localmodule) @@ -38,47 +39,21 @@ import fdroidserver.metadata # noqa def _build_yaml_representer(dumper, data): - '''Creates a YAML representation of a Build instance''' - if hasattr(data, 'append_flag'): - # for 0.7.0 and earlier, before https://gitlab.com/fdroid/fdroidserver/merge_requests/210 - del(data._modified) - readdict = data.__dict__ - else: - readdict = data - - # these key names were all renamed in - # https://gitlab.com/fdroid/fdroidserver/merge_requests/210 - output = dict() - for k, v in readdict.items(): - if k == 'vercode': - output['versionCode'] = v - elif k == 'version': - output['versionName'] = v - elif k == 'update': - output['androidupdate'] = v - else: - output[k] = v - - return dumper.represent_dict(output) + """Create a YAML representation of a Build instance.""" + return dumper.represent_dict(data) -parser = optparse.OptionParser() -parser.add_option("-v", "--verbose", action="store_true", default=False, - help="Spew out even more information than normal") -(fdroidserver.common.options, args) = parser.parse_args(['--verbose']) +parser = ArgumentParser() +fdroidserver.common.setup_global_opts(parser) +fdroidserver.metadata.add_metadata_arguments(parser) +options = parser.parse_args() +fdroidserver.metadata.warnings_action = options.W +fdroidserver.common.read_config(None) if not os.path.isdir('metadata'): print("This script must be run in an F-Droid data folder with a 'metadata' subdir!") sys.exit(1) -# these need to be set to prevent code running on None, only -# 'accepted_formats' is actually used in metadata.py -config = dict() -config['sdk_path'] = os.getenv('ANDROID_HOME') or '/opt/android-sdk' -config['ndk_paths'] = dict() -config['accepted_formats'] = ['yml'] -fdroidserver.common.config = config - repo = git.Repo(localmodule) savedir = os.path.join('metadata', 'dump_' + repo.git.describe()) if not os.path.isdir(savedir): @@ -87,20 +62,8 @@ if not os.path.isdir(savedir): apps = fdroidserver.metadata.read_metadata() for appid, app in apps.items(): savepath = os.path.join(savedir, appid + '.yaml') - if hasattr(app, 'attr_to_field'): - # for 0.7.0 and earlier, before https://gitlab.com/fdroid/fdroidserver/merge_requests/210 - app.__dict__['lastUpdated'] = app.__dict__['lastupdated'] - del(app.__dict__['lastupdated']) - del(app._modified) - frommeta = dict(app.__dict__) - else: - frommeta = dict(app) + frommeta = dict(app) - with open(savepath, 'w') as f: + with open(savepath, "w", encoding="utf-8") as f: yaml.add_representer(fdroidserver.metadata.Build, _build_yaml_representer) yaml.dump(frommeta, f, default_flow_style=False) - - # if appid == 'at.tomtasche.reader': - # import pprint - # pprint.pprint(app) - # sys.exit(1) From d32e53798dca0233f7966bbc26cd5ad388273efa Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Mon, 12 Sep 2022 12:04:13 +0200 Subject: [PATCH 0790/2116] [lint] Check if checking for updates makes no sense --- fdroidserver/lint.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index bfbe4543..ffef8bd6 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -662,6 +662,16 @@ def check_current_version_code(app): ) +def check_updates_expected(app): + """Check if update checking makes sense.""" + if (app.get('NoSourceSince') or app.get('ArchivePolicy') == '0 versions') and ( + app.get('AutoUpdateMode') or app.get('UpdateCheckMode') + ): + yield _( + 'App has NoSourceSince or ArchivePolicy "0 versions" but AutoUpateMode or UpdateCheck are not None' + ) + + def main(): global config, options @@ -768,6 +778,7 @@ def main(): check_format, check_license_tag, check_current_version_code, + check_updates_expected, ] for check_func in app_check_funcs: From 7b31535c25995dd2f6bc5e879324b27e615d5fe6 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sat, 10 Sep 2022 13:01:57 +0200 Subject: [PATCH 0791/2116] git.getref: use python-git Fixes a "warning: refname is ambiguous." problem: $ git clone https://gitlab.com/joshua.tee/wx.git $ cd wx $ git rev-parse 55699 warning: refname '55699' is ambiguous. https://gitlab.com/fdroid/fdroiddata/-/commit/8760bb0ce77f4bc97e6ad7a2e244d4ad2bb0c3e3#note_1090707468 --- fdroidserver/common.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 035ee506..6e2ae762 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1252,12 +1252,10 @@ class vcs_git(vcs): def getref(self, revname='HEAD'): self.checkrepo() - p = FDroidPopen(['git', 'rev-parse', '--verify', - '{revname}^{{commit}}'.format(revname=revname)], cwd=self.local, - output=False) - if p.returncode != 0: + repo = git.Repo(self.local) + if not repo.is_valid_object(revname): return None - return p.output.strip() + return repo.commit(revname).hexsha class vcs_gitsvn(vcs): From 0ad45a94a81a4d48207f14222261a4b9301dca71 Mon Sep 17 00:00:00 2001 From: pmmayero Date: Wed, 14 Sep 2022 06:42:23 +0000 Subject: [PATCH 0792/2116] Addition of IPFS CIDv1 to Index IPFS CIDv1 is only generated for APKs and "repo files" --- .gitlab-ci.yml | 1 + fdroidserver/common.py | 19 +++++++++++++++++++ fdroidserver/index.py | 6 +++++- fdroidserver/update.py | 6 +++++- tests/common.TestCase | 14 ++++++++++++++ .../apk/info.guardianproject.urzip.yaml | 1 + tests/metadata/apk/org.dyndns.fules.ck.yaml | 1 + tests/repo/index-v1.json | 2 +- tests/repo/index.xml | 2 +- tests/update.TestCase | 14 ++++++++++++-- 10 files changed, 60 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3a04d6dd..e9f70075 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -92,6 +92,7 @@ debian_testing: fdroidserver git gnupg + ipfs-cid python3-defusedxml python3-setuptools zipalign diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 6e2ae762..16315376 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4118,6 +4118,25 @@ def run_yamllint(path, indent=0): return '\n'.join(result) +def calculate_IPFS_cid(filename): + """ + Calculate the IPFS CID of a file and add it to the index. + + uses ipfs_cid package at https://packages.debian.org/sid/ipfs-cid + Returns CIDv1 of a file as per IPFS recommendation + """ + exe_name = 'ipfs_cid' + if not set_command_in_config(exe_name) or not config.get(exe_name): + logging.info(_("%s not found, skipping CIDv1 generation") % exe_name) + return + file_cid = subprocess.run([config[exe_name], filename], capture_output=True) + + if file_cid.returncode == 0: + cid_output = file_cid.stdout.decode() + cid_output_dict = json.loads(cid_output) + return cid_output_dict['CIDv1'] + + def sha256sum(filename): """Calculate the sha256 of the given file.""" sha = hashlib.sha256() diff --git a/fdroidserver/index.py b/fdroidserver/index.py index bdb1dd86..24f8a56e 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -607,6 +607,10 @@ def convert_version(version, app, repodir): "size": version["size"] } + ipfsCIDv1 = version.get("ipfsCIDv1") + if ipfsCIDv1: + ver["file"]["ipfsCIDv1"] = ipfsCIDv1 + if "srcname" in version: ver["src"] = file_entry(os.path.join(repodir, version["srcname"])) @@ -945,7 +949,7 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ for k, v in sorted(package.items()): if not v: continue - if k in ('icon', 'icons', 'icons_src', 'name', ): + if k in ('icon', 'icons', 'icons_src', 'ipfsCIDv1', 'name'): continue d[k] = v diff --git a/fdroidserver/update.py b/fdroidserver/update.py index c957dab4..e6bea4bf 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -58,7 +58,7 @@ if hasattr(Image, 'DecompressionBombWarning'): warnings.simplefilter('error', Image.DecompressionBombWarning) Image.MAX_IMAGE_PIXELS = 0xffffff # 4096x4096 -METADATA_VERSION = 20001 +METADATA_VERSION = 20002 # less than the valid range of versionCode, i.e. Java's Integer.MIN_VALUE UNSET_VERSION_CODE = -0x100000000 @@ -1148,6 +1148,7 @@ def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False): repo_file['apkName'] = name_utf8 repo_file['hash'] = shasum repo_file['hashType'] = 'sha256' + repo_file['ipfsCIDv1'] = common.calculate_IPFS_cid(name_utf8) repo_file['versionCode'] = 0 repo_file['versionName'] = shasum[0:7] # the static ID is the SHA256 unless it is set in the metadata @@ -1212,6 +1213,9 @@ def scan_apk(apk_file, require_signature=True): 'icons': {}, 'antiFeatures': set(), } + ipfsCIDv1 = common.calculate_IPFS_cid(apk_file) + if ipfsCIDv1: + apk['ipfsCIDv1'] = ipfsCIDv1 scan_apk_androguard(apk, apk_file) diff --git a/tests/common.TestCase b/tests/common.TestCase index 549167fc..470e3443 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1508,6 +1508,20 @@ class CommonTest(unittest.TestCase): with self.assertRaises(SyntaxError): fdroidserver.common.calculate_math_string('1-1 # no comment') + def test_calculate_IPFS_cid_with_no_tool(self): + fdroidserver.common.config = {'ipfs_cid': None} + self.assertIsNone(fdroidserver.common.calculate_IPFS_cid('urzip.apk')) + self.assertIsNone(fdroidserver.common.calculate_IPFS_cid('FileDoesNotExist')) + + @unittest.skipUnless(shutil.which('ipfs_cid'), 'calculate_IPFS_cid needs ipfs_cid') + def test_calculate_IPFS_cid(self): + fdroidserver.common.config = dict() + self.assertIsNone(fdroidserver.common.calculate_IPFS_cid('FileDoesNotExist')) + self.assertEqual( + fdroidserver.common.calculate_IPFS_cid('urzip.apk'), + "bafybeigmtgrwyvj77jaflje2rf533haeqtpu2wtwsctryjusjnsawacsam", + ) + def test_deploy_build_log_with_rsync_with_id_file(self): mocklogcontent = bytes( diff --git a/tests/metadata/apk/info.guardianproject.urzip.yaml b/tests/metadata/apk/info.guardianproject.urzip.yaml index 4632c314..a3e75d87 100644 --- a/tests/metadata/apk/info.guardianproject.urzip.yaml +++ b/tests/metadata/apk/info.guardianproject.urzip.yaml @@ -9,6 +9,7 @@ icons: icons_src: '-1': res/drawable/ic_launcher.png '160': res/drawable/ic_launcher.png +ipfsCIDv1: bafybeigmtgrwyvj77jaflje2rf533haeqtpu2wtwsctryjusjnsawacsam minSdkVersion: 4 name: urzip packageName: info.guardianproject.urzip diff --git a/tests/metadata/apk/org.dyndns.fules.ck.yaml b/tests/metadata/apk/org.dyndns.fules.ck.yaml index 23a0325f..b4e16511 100644 --- a/tests/metadata/apk/org.dyndns.fules.ck.yaml +++ b/tests/metadata/apk/org.dyndns.fules.ck.yaml @@ -13,6 +13,7 @@ icons_src: '120': res/drawable-ldpi-v4/icon_launcher.png '160': res/drawable-mdpi-v4/icon_launcher.png '240': res/drawable-hdpi-v4/icon_launcher.png +ipfsCIDv1: bafybeifijmr5ygvfvig4vzbmdc3ysj6m46ddohaol4vgp4qoyooqpc27zu minSdkVersion: 7 name: Compass Keyboard nativecode: diff --git a/tests/repo/index-v1.json b/tests/repo/index-v1.json index b6b870bc..409f333a 100644 --- a/tests/repo/index-v1.json +++ b/tests/repo/index-v1.json @@ -1,7 +1,7 @@ { "repo": { "timestamp": 1502845383782, - "version": 20001, + "version": 20002, "name": "My First F-Droid Repo Demo", "icon": "icon.png", "address": "https://MyFirstFDroidRepo.org/fdroid/repo", diff --git a/tests/repo/index.xml b/tests/repo/index.xml index 78fd1c99..7c9a1cd6 100644 --- a/tests/repo/index.xml +++ b/tests/repo/index.xml @@ -1,6 +1,6 @@ - + This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid. http://foobarfoobarfoobar.onion/fdroid/repo https://foo.bar/fdroid/repo diff --git a/tests/update.TestCase b/tests/update.TestCase index 736a50b7..7e7f8583 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -836,7 +836,7 @@ class UpdateTest(unittest.TestCase): fdroidserver.update.config = config apk_info = fdroidserver.update.scan_apk('repo/no.min.target.sdk_987.apk') self.maxDiff = None - self.assertDictEqual(apk_info, { + expected = { 'icons': {}, 'icons_src': {'-1': 'res/drawable/ic_launcher.png', '160': 'res/drawable/ic_launcher.png'}, @@ -859,11 +859,18 @@ class UpdateTest(unittest.TestCase): fdroidserver.update.UsesPermission(name='android.permission.READ_PHONE_STATE', maxSdkVersion=None), fdroidserver.update.UsesPermission(name='android.permission.READ_EXTERNAL_STORAGE', - maxSdkVersion=None)]}) + maxSdkVersion=None), + ], + } + if config.get('ipfs_cid'): + expected['ipfsCIDv1'] = 'bafybeidwxseoagnew3gtlasttqovl7ciuwxaud5a5p4a5pzpbrfcfj2gaa' + + self.assertDictEqual(apk_info, expected) def test_scan_apk_no_sig(self): config = dict() fdroidserver.common.fill_config_defaults(config) + fdroidserver.common.config = config fdroidserver.update.config = config os.chdir(os.path.join(localmodule, 'tests')) if os.path.basename(os.getcwd()) != 'tests': @@ -929,6 +936,7 @@ class UpdateTest(unittest.TestCase): config = dict() fdroidserver.common.fill_config_defaults(config) + fdroidserver.common.config = config fdroidserver.update.config = config os.chdir(os.path.join(localmodule, 'tests')) @@ -986,6 +994,8 @@ class UpdateTest(unittest.TestCase): with open(savepath, 'r') as f: from_yaml = yaml.load(f, Loader=TestLoader) self.maxDiff = None + if not config.get('ipfs_cid'): + del from_yaml['ipfsCIDv1'] # handle when ipfs_cid is not installed self.assertEqual(apk, from_yaml) def test_process_apk_signed_by_disabled_algorithms(self): From 580ce8541227327ea0f42cac8ef6b7c3e19df2ae Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Wed, 14 Sep 2022 11:52:49 +0200 Subject: [PATCH 0793/2116] [lint] Fix comparisons in check_updates_expected --- fdroidserver/lint.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index ffef8bd6..685bda54 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -664,8 +664,10 @@ def check_current_version_code(app): def check_updates_expected(app): """Check if update checking makes sense.""" - if (app.get('NoSourceSince') or app.get('ArchivePolicy') == '0 versions') and ( - app.get('AutoUpdateMode') or app.get('UpdateCheckMode') + if ( + app.get('NoSourceSince') or app.get('ArchivePolicy') == '0 versions' + ) and not all( + app.get(key, 'None') == 'None' for key in ('AutoUpdateMode', 'UpdateCheckMode') ): yield _( 'App has NoSourceSince or ArchivePolicy "0 versions" but AutoUpateMode or UpdateCheck are not None' From ac96e43e1301567b835160b2af0a651a9a4fbb6f Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 14 Sep 2022 15:02:37 +0000 Subject: [PATCH 0794/2116] scanner: add some rules --- .gitignore | 1 + fdroidserver/scanner.py | 19 +++++++++++++++++-- tests/scanner.TestCase | 12 ++++++------ 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 98c5b90b..84ee6344 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ README.rst # editor tmp files .*.swp +.ropeproject/ # files generated by tests tmp/ diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index d4f14c05..60f97729 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -68,6 +68,8 @@ NON_FREE_GRADLE_LINES = { r'google.*admob', r'google.*play.*services', r'com.google.android.play:core.*', + r'com.google.android.play:app-update', + r'com.google.android.libraries.places:places', r'com.google.mlkit', r'com.android.billingclient', r'androidx.work:work-gcm', @@ -92,6 +94,17 @@ NON_FREE_GRADLE_LINES = { r'io.github.sinaweibosdk', r'com.umeng.umsdk', r'com.google.android.exoplayer:extension-cast', + r'io.objectbox:objectbox-gradle-plugin', + r'com.evernote:android-job', + r'com.yayandroid:LocationManager', + r'com.onesignal:OneSignal', + r'com.cloudinary:cloudinary-android', + r'com.google.android.exoplayer:extension-cronet', + r'com.anjlab.android.iab.v3:library', + r'com.github.penn5:donations', + r'com.mapbox', + r'com.yandex.android', + r'com.hypertrack', ] } @@ -234,8 +247,10 @@ def scan_source(build_dir, build=metadata.Build()): allowlisted = [ 'firebase-jobdispatcher', # https://github.com/firebase/firebase-jobdispatcher-android/blob/master/LICENSE - 'com.firebaseui', # https://github.com/firebase/FirebaseUI-Android/blob/master/LICENSE - 'geofire-android' # https://github.com/firebase/geofire-java/blob/master/LICENSE + 'com.firebaseui', # https://github.com/firebase/FirebaseUI-Android/blob/master/LICENSE + 'geofire-android', # https://github.com/firebase/geofire-java/blob/master/LICENSE + 'com.yandex.android:authsdk', # https://github.com/yandexmobile/yandex-login-sdk-android/blob/master/LICENSE.txt + 'com.hypertrack:hyperlog', # https://github.com/hypertrack/hyperlog-android#license ] def is_allowlisted(s): diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 9455f6cd..65b2a8fd 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -45,17 +45,17 @@ class ScannerTest(unittest.TestCase): fdroidserver.scanner.options.json = False source_files = os.path.join(self.basedir, 'source-files') projects = { - 'cn.wildfirechat.chat': 4, - 'com.integreight.onesheeld': 11, + 'OtakuWorld': 2, 'Zillode': 1, + 'cn.wildfirechat.chat': 4, + 'com.github.shadowsocks': 6, + 'com.integreight.onesheeld': 11, + 'com.jens.automation2': 2, 'firebase-suspect': 1, 'org.mozilla.rocket': 3, + 'org.tasks': 3, 'realm': 1, 'se.manyver': 2, - 'com.jens.automation2': 2, - 'com.github.shadowsocks': 6, - 'org.tasks': 1, - 'OtakuWorld': 2, } for d in glob.glob(os.path.join(source_files, '*')): build = fdroidserver.metadata.Build() From 0f48294a6ec1b93f40b255647e6b51338e2d139e Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 15 Sep 2022 07:44:02 +0200 Subject: [PATCH 0795/2116] Use old python-git exception API for getref The is_valid_object method is not even in Debian bullseye. --- fdroidserver/common.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 16315376..3b2da2a1 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1253,9 +1253,10 @@ class vcs_git(vcs): def getref(self, revname='HEAD'): self.checkrepo() repo = git.Repo(self.local) - if not repo.is_valid_object(revname): + try: + return repo.commit(revname).hexsha + except git.BadName: return None - return repo.commit(revname).hexsha class vcs_gitsvn(vcs): From f96f24709529f97dd19e5b83171710831adf4873 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 15 Sep 2022 13:32:11 +0200 Subject: [PATCH 0796/2116] Add test for git getref --- tests/common.TestCase | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/common.TestCase b/tests/common.TestCase index 470e3443..26270a1b 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -2382,6 +2382,23 @@ class CommonTest(unittest.TestCase): vcs = fdroidserver.common.vcs_git(None, Path.cwd()) self.assertEqual(vcs.latesttags(), tags[::-1]) + def test_vcs_git_getref(self): + + with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): + # TODO: Python3.6: Should accept path-like + repo = git.Repo.init(str(Path.cwd())) + tag = "1.1.1" + f = Path("test") + f.write_text(tag) + repo.index.add([str(f)]) + repo.index.commit("foo") + repo.create_tag(tag) + + vcs = fdroidserver.common.vcs_git(None, Path.cwd()) + + self.assertIsNotNone(vcs.getref("1.1.1")) + self.assertIsNone(vcs.getref("invalid")) + def test_get_release_filename(self): app = fdroidserver.metadata.App() app.id = 'test.app' From cf228d35a36f561fce03a72a13c9ba0a8cd844df Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 20 Sep 2022 13:58:41 +0000 Subject: [PATCH 0797/2116] Work around old apksigner on f-droid.org publish server --- .gitlab-ci.yml | 21 +++++++++++++++++++++ fdroidserver/common.py | 3 ++- fdroidserver/signindex.py | 8 +++++++- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e9f70075..e94e6e1a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -102,6 +102,27 @@ debian_testing: - ./run-tests +# This tests with buster-backports to match what is used on the f-droid.org publish server. +buster_backports: + image: debian:buster-backports + <<: *apt-template + script: + - apt-get install + aapt + androguard + apksigner + dexdump + fdroidserver + git + gnupg + python3-defusedxml + python3-setuptools + zipalign + - apt-get install -t buster-backports apksigner + - cd tests + - ./run-tests + + # Test using latest LTS set up with the PPA, including Recommends. ubuntu_lts_ppa: image: ubuntu:latest diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 3b2da2a1..0265f3b7 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -85,7 +85,8 @@ FDROID_PATH = os.path.realpath(os.path.join(os.path.dirname(__file__), '..')) # this is the build-tools version, aapt has a separate version that # has to be manually set in test_aapt_version() MINIMUM_AAPT_BUILD_TOOLS_VERSION = '26.0.0' -# 30.0.0 is the first version to support --v4-signing-enabled. +# 31.0.0 is the first version to support --v4-signing-enabled. +# we only require 30.0.0 for now as that's the version in buster-backports, see also signindex.py # 26.0.2 is the first version recognizing md5 based signatures as valid again # (as does android, so we want that) MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION = '30.0.0' diff --git a/fdroidserver/signindex.py b/fdroidserver/signindex.py index 62d40640..d46c737e 100644 --- a/fdroidserver/signindex.py +++ b/fdroidserver/signindex.py @@ -111,7 +111,13 @@ def sign_jar(jar, use_old_algs=False): } p = common.FDroidPopen(args, envs=env_vars) if p.returncode != 0: - raise FDroidException("Failed to sign %s: %s" % (jar, p.output)) + # workaround for buster-backports apksigner on f-droid.org publish server + v4 = args.index("--v4-signing-enabled") + del args[v4 + 1] + del args[v4] + p = common.FDroidPopen(args, envs=env_vars) + if p.returncode != 0: + raise FDroidException("Failed to sign %s: %s" % (jar, p.output)) def sign_index(repodir, json_name): From ecc9ad0e8cb59cb7925b7506d5a034466a39bf89 Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Mon, 19 Sep 2022 22:18:07 +0200 Subject: [PATCH 0798/2116] Add .editorconfig See https://editorconfig.org/ --- .editorconfig | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..43412092 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[**.py] +indent_style = space +indent_size = 4 + +[.gitlab-ci.yml] +indent_style = space +indent_size = 2 From ec69be04ce09925124c6d6ac29823c0dc7df9799 Mon Sep 17 00:00:00 2001 From: linsui Date: Mon, 26 Sep 2022 15:49:32 +0800 Subject: [PATCH 0799/2116] scanner: allow repo.clojars.org --- fdroidserver/scanner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 60f97729..7bc28444 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -272,6 +272,7 @@ def scan_source(build_dir, build=metadata.Build()): 'oss.sonatype.org/content/repositories/releases', 'oss.sonatype.org/content/groups/public', 'clojars.org/repo', # Clojure free software libs + 'repo.clojars.org', # Clojure free software libs 's3.amazonaws.com/repo.commonsware.com', # CommonsWare 'plugins.gradle.org/m2', # Gradle plugin repo 'maven.google.com', # Google Maven Repo, https://developer.android.com/studio/build/dependencies.html#google-maven From 96f8284a509f0bb44b4fa1e815acc3ce4ccc9487 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 29 Sep 2022 19:41:12 +0200 Subject: [PATCH 0800/2116] Sync all status files --- fdroidserver/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 0265f3b7..8ed76fb7 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -912,7 +912,7 @@ def write_status_json(output, pretty=False, name=None): json.dump(output, fp, sort_keys=True, cls=Encoder, indent=2) else: json.dump(output, fp, sort_keys=True, cls=Encoder, separators=(',', ':')) - rsync_status_file_to_repo(path, repo_subdir='status') + rsync_status_file_to_repo(path, repo_subdir='status') def get_head_commit_id(git_repo): From e4d16ec1e813994b5ef606a3091a4be1e5aa2831 Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Tue, 20 Sep 2022 12:29:59 +0200 Subject: [PATCH 0801/2116] Move lint tools configuration to pyproject.toml This commit removes the mypy CI job, since there are no or few type hints in the codebase and it failed on unrelated changes in the past. It might be reintroduced when type hints get added. --- .gitlab-ci.yml | 19 ++-------------- .pylint-rcfile | 47 -------------------------------------- mypy.ini | 17 -------------- pyproject.toml | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 81 deletions(-) delete mode 100644 .pylint-rcfile delete mode 100644 mypy.ini diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e94e6e1a..baa7ed82 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -219,7 +219,7 @@ lint_format_safety_bandit_checks: --ini .bandit || set_error - safety check --full-report || set_error - - pylint --rcfile=.pylint-rcfile --output-format=colorized --reports=n + - pylint --output-format=colorized --reports=n fdroid makebuildserver setup.py @@ -234,26 +234,11 @@ lint_format_safety_bandit_checks: - exit $EXITVALUE -lint_mypy: - image: debian:bullseye-backports - <<: *apt-template - script: - # use Debian packages to avoid building C/rust sources - - apt-get install - mypy - python3-cryptography - python3-pip - python3-wheel - - apt-get install -t bullseye-backports python3-pyjks - - pip install -e .[test] - - mypy - - black: image: python:slim script: - pip install black - - black --check --diff --color --skip-string-normalization + - black --check --diff --color examples/fdroid_extract_repo_pubkey.py examples/makebuildserver.config.py fdroid diff --git a/.pylint-rcfile b/.pylint-rcfile deleted file mode 100644 index d32d90c4..00000000 --- a/.pylint-rcfile +++ /dev/null @@ -1,47 +0,0 @@ -[MASTER] - -# Use multiple processes to speed up Pylint. -jobs=4 - -# Allow loading of arbitrary C extensions. Extensions are imported into the -# active Python interpreter and may run arbitrary code. -unsafe-load-any-extension=no - - -[MESSAGES CONTROL] - -# Only show warnings with the listed confidence levels. Leave empty to show -# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED -confidence=HIGH,INFERENCE - -# Disable the message, report, category or checker with the given id(s). You -# can either give multiple identifiers separated by comma (,) or put this -# option multiple times (only on the command line, not in the configuration -# file where it should appear only once).You can also use "--disable=all" to -# disable everything first and then reenable specific checks. For example, if -# you want to run only the similarities checker, you can use "--disable=all -# --enable=similarities". If you want to run only the classes checker, but have -# no Warning level messages displayed, use"--disable=all --enable=classes -# --disable=W" -disable=invalid-name,missing-docstring,no-member - - -[MISCELLANEOUS] - -# List of note tags to take in consideration, separated by a comma. -notes=FIXME,XXX,TODO - - -[BASIC] - -# Good variable names which should always be accepted, separated by a comma -good-names=i,j,k,ex,Run,f,fp - - -[ELIF] - -# Maximum number of nested blocks for function / method body -max-nested-blocks=5 - -[FORMAT] -max-line-length=88 diff --git a/mypy.ini b/mypy.ini deleted file mode 100644 index 30ab6eaa..00000000 --- a/mypy.ini +++ /dev/null @@ -1,17 +0,0 @@ -[mypy] -files = fdroidserver -# exclude vendored file -exclude = fdroidserver/apksigcopier.py - -# this is de-facto the linter setting for this file -warn_unused_configs = True - -# TODO: we should either upgrade the used packages to a version which includes type hints OR install/write stub packages for these libraries. -# Further details here: https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-type-hints-for-third-party-library -ignore_missing_imports = True - -# ignore the [no-redef] errors, as they collide with the bandit "# nosec" exclusion (common.py) -# unfortunately both tools expect their ignore flag as a comment in the same line -# [misc] is ignored for the "incompatible import" -# [arg-type] is ignored because when there are missing envs, everything will crash, not just the types -disable_error_code = no-redef, misc, arg-type diff --git a/pyproject.toml b/pyproject.toml index 0097e9f6..ba6a2e12 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,2 +1,64 @@ [tool.black] skip-string-normalization = true +target-version = ["py35"] + + +[tool.mypy] +python_version = "3.5" + +files = "fdroidserver" + +# exclude vendored file +exclude = "fdroidserver/apksigcopier.py" + +# this is de-facto the linter setting for this file +warn_unused_configs = true + +# TODO: we should either upgrade the used packages to a version which includes type hints OR install/write stub packages for these libraries. +# Further details here: https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-type-hints-for-third-party-library +ignore_missing_imports = true + +# ignore the [no-redef] errors, as they collide with the bandit "# nosec" exclusion (common.py) +# unfortunately both tools expect their ignore flag as a comment in the same line +# [misc] is ignored for the "incompatible import" +# [arg-type] is ignored because when there are missing envs, everything will crash, not just the types +disable_error_code = "no-redef, misc, arg-type" + + +[tool.pylint.main] +# Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the +# number of processors available to use, and will cap the count on Windows to +# avoid hangs. +jobs = 4 + +[tool.pylint.basic] +# Good variable names which should always be accepted, separated by a comma. +good-names = ["i", "j", "k", "ex", "Run", "f", "fp"] + +[tool.pylint."messages control"] +# Only show warnings with the listed confidence levels. Leave empty to show all. +# Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE, UNDEFINED. +confidence = ["HIGH", "INFERENCE"] + +# Disable the message, report, category or checker with the given id(s). You can +# either give multiple identifiers separated by comma (,) or put this option +# multiple times (only on the command line, not in the configuration file where +# it should appear only once). You can also use "--disable=all" to disable +# everything first and then re-enable specific checks. For example, if you want +# to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use "--disable=all --enable=classes +# --disable=W". +disable = ["invalid-name", "missing-module-docstring", "missing-class-docstring", "missing-function-docstring", "no-member"] + +[tool.pylint.miscellaneous] +# List of note tags to take in consideration, separated by a comma. +notes = ["FIXME", "XXX", "TODO"] + +[tool.pylint.refactoring] +# Maximum number of nested blocks for function / method body +max-nested-blocks = 5 + +[tool.pylint.format] +# Maximum number of characters on a single line. +max-line-length = 88 From 4197455436b4680c5099ee5dc0c1791c95283744 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 10 May 2022 14:54:32 +0200 Subject: [PATCH 0802/2116] Support more file types in get_embedded_classes Closes: #999 --- fdroidserver/scanner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 7bc28444..85688cfb 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -136,7 +136,7 @@ def get_embedded_classes(apkfile, depth=0): if depth > 10: # zipbomb protection return {_('Max recursion depth in ZIP file reached: %s') % apkfile} - apk_regex = re.compile(r'.*\.apk') + archive_regex = re.compile(r'.*\.(aab|aar|apk|apks|jar|war|xapk|zip)$') class_regex = re.compile(r'classes.*\.dex') classes = set() @@ -144,7 +144,7 @@ def get_embedded_classes(apkfile, depth=0): with TemporaryDirectory() as tmp_dir, zipfile.ZipFile(apkfile, 'r') as apk_zip: for info in apk_zip.infolist(): # apk files can contain apk files, again - if apk_regex.search(info.filename): + if archive_regex.search(info.filename): with apk_zip.open(info) as apk_fp: classes = classes.union(get_embedded_classes(apk_fp, depth + 1)) From aa190d532fa72062d0dbdc4bbadee825e36e98df Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 22 Sep 2022 11:51:59 +0200 Subject: [PATCH 0803/2116] scanner.TestCase: manually convert to black code format I manually changed some code structures to give a decent code format. --- .gitlab-ci.yml | 1 + tests/scanner.TestCase | 208 +++++++++++++++++++++++++---------------- 2 files changed, 129 insertions(+), 80 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index baa7ed82..e4c9a813 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -265,6 +265,7 @@ black: tests/metadata.TestCase tests/ndk-release-checksums.py tests/rewritemeta.TestCase + tests/scanner.TestCase tests/signindex.TestCase tests/verify.TestCase diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 65b2a8fd..0dac2fb1 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -188,26 +188,37 @@ class ScannerTest(unittest.TestCase): for msg, f in fdroidserver.scanner.json_per_build[section]: files[section].append(f) - self.assertFalse('ascii.out' in files['errors'], - 'an ASCII .out file is not an error') - self.assertFalse('snippet.png' in files['errors'], - 'an executable valid image is not an error') + self.assertFalse( + 'ascii.out' in files['errors'], 'ASCII .out file is not an error' + ) + self.assertFalse( + 'snippet.png' in files['errors'], 'executable valid image is not an error' + ) self.assertTrue('arg.jar' in files['errors'], 'all JAR files are errors') self.assertTrue('baz.so' in files['errors'], 'all .so files are errors') - self.assertTrue('binary.out' in files['errors'], 'a binary .out file is an error') - self.assertTrue('classes.dex' in files['errors'], 'all classes.dex files are errors') + self.assertTrue( + 'binary.out' in files['errors'], 'a binary .out file is an error' + ) + self.assertTrue( + 'classes.dex' in files['errors'], 'all classes.dex files are errors' + ) self.assertTrue('sqlcipher.aar' in files['errors'], 'all AAR files are errors') self.assertTrue('static.a' in files['errors'], 'all .a files are errors') - self.assertTrue('fake.png' in files['warnings'], - 'a random binary that is executable that is not an image is a warning') - self.assertTrue('src/test/resources/classes.dex' in files['warnings'], - 'suspicious file but in a test dir is a warning') + self.assertTrue( + 'fake.png' in files['warnings'], + 'a random binary that is executable that is not an image is a warning', + ) + self.assertTrue( + 'src/test/resources/classes.dex' in files['warnings'], + 'suspicious file but in a test dir is a warning', + ) for f in remove: - self.assertTrue(f in files['infos'], - f + ' should be removed with an info message') + self.assertTrue( + f in files['infos'], '%s should be removed with an info message' % f + ) def test_build_local_scanner(self): """`fdroid build` calls scanner functions, test them here""" @@ -260,14 +271,26 @@ class ScannerTest(unittest.TestCase): with mock.patch('fdroidserver.common.replace_build_vars', wraps=make_fake_apk): with mock.patch('fdroidserver.common.get_native_code', return_value='x86'): - with mock.patch('fdroidserver.common.get_apk_id', - return_value=(app.id, build.versionCode, build.versionName)): - with mock.patch('fdroidserver.common.is_apk_and_debuggable', return_value=False): + with mock.patch( + 'fdroidserver.common.get_apk_id', + return_value=(app.id, build.versionCode, build.versionName), + ): + with mock.patch( + 'fdroidserver.common.is_apk_and_debuggable', return_value=False + ): fdroidserver.build.build_local( - app, build, vcs, - build_dir=testdir, output_dir=testdir, - log_dir=None, srclib_dir=None, extlib_dir=None, tmp_dir=None, - force=False, onserver=False, refresh=False + app, + build, + vcs, + build_dir=testdir, + output_dir=testdir, + log_dir=None, + srclib_dir=None, + extlib_dir=None, + tmp_dir=None, + force=False, + onserver=False, + refresh=False, ) self.assertTrue(os.path.exists('baz.so')) self.assertTrue(os.path.exists('foo.aar')) @@ -316,7 +339,6 @@ class ScannerTest(unittest.TestCase): class Test_scan_binary(unittest.TestCase): - def setUp(self): self.basedir = os.path.join(localmodule, 'tests') config = dict() @@ -326,51 +348,68 @@ class Test_scan_binary(unittest.TestCase): def test_code_signature_match(self): apkfile = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') - with mock.patch("fdroidserver.scanner.CODE_SIGNATURES", {"java/lang/Object": re.compile( - r'.*java/lang/Object', re.IGNORECASE | re.UNICODE - )}): + mock_code_signatures = { + "java/lang/Object": re.compile( + r'.*java/lang/Object', re.IGNORECASE | re.UNICODE + ) + } + with mock.patch("fdroidserver.scanner.CODE_SIGNATURES", mock_code_signatures): self.assertEqual( 1, fdroidserver.scanner.scan_binary(apkfile), - "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner.CODE_SIGNATURES.values(), apkfile), + "Did not find expected code signature '{}' in binary '{}'".format( + fdroidserver.scanner.CODE_SIGNATURES.values(), apkfile + ), ) @unittest.skipIf( sys.version_info < (3, 9), "Our implementation for traversing zip files will silently fail to work" "on older python versions, also see: " - "https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1110#note_932026766" + "https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1110#note_932026766", ) def test_bottom_level_embedded_apk_code_signature(self): apkfile = os.path.join(self.basedir, 'apk.embedded_1.apk') - with mock.patch("fdroidserver.scanner.CODE_SIGNATURES", {"org/bitbucket/tickytacky/mirrormirror/MainActivity": re.compile( - r'.*org/bitbucket/tickytacky/mirrormirror/MainActivity', re.IGNORECASE | re.UNICODE - )}): + mock_code_signatures = { + "org/bitbucket/tickytacky/mirrormirror/MainActivity": re.compile( + r'.*org/bitbucket/tickytacky/mirrormirror/MainActivity', + re.IGNORECASE | re.UNICODE, + ) + } + with mock.patch("fdroidserver.scanner.CODE_SIGNATURES", mock_code_signatures): self.assertEqual( 1, fdroidserver.scanner.scan_binary(apkfile), - "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner.CODE_SIGNATURES.values(), apkfile), + "Did not find expected code signature '{}' in binary '{}'".format( + fdroidserver.scanner.CODE_SIGNATURES.values(), apkfile + ), ) def test_top_level_signature_embedded_apk_present(self): apkfile = os.path.join(self.basedir, 'apk.embedded_1.apk') - with mock.patch("fdroidserver.scanner.CODE_SIGNATURES", {"org/fdroid/ci/BuildConfig": re.compile( - r'.*org/fdroid/ci/BuildConfig', re.IGNORECASE | re.UNICODE - )}): + mock_code_signatures = { + "org/fdroid/ci/BuildConfig": re.compile( + r'.*org/fdroid/ci/BuildConfig', re.IGNORECASE | re.UNICODE + ) + } + with mock.patch("fdroidserver.scanner.CODE_SIGNATURES", mock_code_signatures): self.assertEqual( 1, fdroidserver.scanner.scan_binary(apkfile), - "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner.CODE_SIGNATURES.values(), apkfile), + "Did not find expected code signature '{}' in binary '{}'".format( + fdroidserver.scanner.CODE_SIGNATURES.values(), apkfile + ), ) def test_no_match(self): apkfile = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') result = fdroidserver.scanner.scan_binary(apkfile) - self.assertEqual(0, result, "Found false positives in binary '{}'".format(apkfile)) + self.assertEqual( + 0, result, "Found false positives in binary '{}'".format(apkfile) + ) class Test__exodus_compile_signatures(unittest.TestCase): - def setUp(self): self.m1 = mock.Mock() self.m1.code_signature = r"^random\sregex$" @@ -380,10 +419,13 @@ class Test__exodus_compile_signatures(unittest.TestCase): def test_ok(self): result = fdroidserver.scanner._exodus_compile_signatures(self.mock_sigs) - self.assertListEqual(result, [ - re.compile(self.m1.code_signature), - re.compile(self.m2.code_signature), - ]) + self.assertListEqual( + result, + [ + re.compile(self.m1.code_signature), + re.compile(self.m2.code_signature), + ], + ) def test_not_iterable(self): result = fdroidserver.scanner._exodus_compile_signatures(123) @@ -391,35 +433,36 @@ class Test__exodus_compile_signatures(unittest.TestCase): class Test_load_exodus_trackers_signatures(unittest.TestCase): - def setUp(self): self.requests_ret = mock.Mock() - self.requests_ret.json = mock.Mock(return_value={ - "trackers": { - "1": { - "id": 1, - "name": "Steyer Puch 1", - "description": "blah blah blah", - "creation_date": "1956-01-01", - "code_signature": "com.puch.|com.steyer.", - "network_signature": "pst\\.com", - "website": "https://pst.com", - "categories": ["tracker"], - "documentation": [], + self.requests_ret.json = mock.Mock( + return_value={ + "trackers": { + "1": { + "id": 1, + "name": "Steyer Puch 1", + "description": "blah blah blah", + "creation_date": "1956-01-01", + "code_signature": "com.puch.|com.steyer.", + "network_signature": "pst\\.com", + "website": "https://pst.com", + "categories": ["tracker"], + "documentation": [], + }, + "2": { + "id": 2, + "name": "Steyer Puch 2", + "description": "blah blah blah", + "creation_date": "1956-01-01", + "code_signature": "com.puch.|com.steyer.", + "network_signature": "pst\\.com", + "website": "https://pst.com", + "categories": ["tracker"], + "documentation": [], + }, }, - "2": { - "id": 2, - "name": "Steyer Puch 2", - "description": "blah blah blah", - "creation_date": "1956-01-01", - "code_signature": "com.puch.|com.steyer.", - "network_signature": "pst\\.com", - "website": "https://pst.com", - "categories": ["tracker"], - "documentation": [], - } - }, - }) + } + ) self.requests_func = mock.Mock(return_value=self.requests_ret) self.compilesig_func = mock.Mock(return_value="mocked return value") @@ -427,19 +470,18 @@ class Test_load_exodus_trackers_signatures(unittest.TestCase): with mock.patch("requests.get", self.requests_func), mock.patch( "fdroidserver.scanner._exodus_compile_signatures", self.compilesig_func ): - result_sigs, result_regex = fdroidserver.scanner.load_exodus_trackers_signatures() + sigs, regex = fdroidserver.scanner.load_exodus_trackers_signatures() self.requests_func.assert_called_once_with( "https://reports.exodus-privacy.eu.org/api/trackers", timeout=300 ) - self.assertEqual(len(result_sigs), 2) - self.assertListEqual([1, 2], sorted([x.id for x in result_sigs])) + self.assertEqual(len(sigs), 2) + self.assertListEqual([1, 2], sorted([x.id for x in sigs])) - self.compilesig_func.assert_called_once_with(result_sigs) - self.assertEqual(result_regex, "mocked return value") + self.compilesig_func.assert_called_once_with(sigs) + self.assertEqual(regex, "mocked return value") class Test_main(unittest.TestCase): - def setUp(self): self.args = ["com.example.app", "local/additional.apk", "another.apk"] self.exit_func = mock.Mock() @@ -456,7 +498,9 @@ class Test_main(unittest.TestCase): "sys.exit", self.exit_func ), mock.patch("sys.argv", ["fdroid scanner", *self.args]), mock.patch( "fdroidserver.common.read_app_args", self.read_app_args_func - ), mock.patch("fdroidserver.scanner.scan_binary", self.scan_binary_func): + ), mock.patch( + "fdroidserver.scanner.scan_binary", self.scan_binary_func + ): fdroidserver.scanner.main() self.exit_func.assert_not_called() @@ -475,7 +519,9 @@ class Test_main(unittest.TestCase): "sys.exit", self.exit_func ), mock.patch("sys.argv", ["fdroid scanner", *self.args]), mock.patch( "fdroidserver.common.read_app_args", self.read_app_args_func - ), mock.patch("fdroidserver.scanner.scan_binary", self.scan_binary_func): + ), mock.patch( + "fdroidserver.scanner.scan_binary", self.scan_binary_func + ): pathlib.Path(self.args[0]).touch() fdroidserver.scanner.main() @@ -498,11 +544,13 @@ if __name__ == "__main__": (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() - newSuite.addTests([ - unittest.makeSuite(ScannerTest), - unittest.makeSuite(Test_scan_binary), - unittest.makeSuite(Test__exodus_compile_signatures), - unittest.makeSuite(Test_load_exodus_trackers_signatures), - unittest.makeSuite(Test_main), - ]) + newSuite.addTests( + [ + unittest.makeSuite(ScannerTest), + unittest.makeSuite(Test_scan_binary), + unittest.makeSuite(Test__exodus_compile_signatures), + unittest.makeSuite(Test_load_exodus_trackers_signatures), + unittest.makeSuite(Test_main), + ] + ) unittest.main(failfast=False) From 3de6063a01ec2242b80023f76d6dc04030855e1a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 29 Sep 2022 17:21:03 +0200 Subject: [PATCH 0804/2116] scanner: open DEX/ZIP by file magic; throw errors on bad filenames --- fdroidserver/scanner.py | 16 +++++-- tests/scanner.TestCase | 100 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 3 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 85688cfb..710d0c23 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -144,11 +144,21 @@ def get_embedded_classes(apkfile, depth=0): with TemporaryDirectory() as tmp_dir, zipfile.ZipFile(apkfile, 'r') as apk_zip: for info in apk_zip.infolist(): # apk files can contain apk files, again - if archive_regex.search(info.filename): - with apk_zip.open(info) as apk_fp: + with apk_zip.open(info) as apk_fp: + if zipfile.is_zipfile(apk_fp): classes = classes.union(get_embedded_classes(apk_fp, depth + 1)) + if not archive_regex.search(info.filename): + classes.add( + 'ZIP file without proper file extension: %s' + % info.filename + ) + continue - elif class_regex.search(info.filename): + with apk_zip.open(info.filename) as fp: + file_magic = fp.read(3) + if file_magic == b'dex': + if not class_regex.search(info.filename): + classes.add('DEX file with fake name: %s' % info.filename) apk_zip.extract(info, tmp_dir) run = common.SdkToolsPopen( ["dexdump", '{}/{}'.format(tmp_dir, info.filename)], diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 0dac2fb1..991cd9f0 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -13,6 +13,7 @@ import textwrap import unittest import uuid import yaml +import zipfile import collections import pathlib from unittest import mock @@ -337,6 +338,105 @@ class ScannerTest(unittest.TestCase): self.assertFalse(os.path.exists("build.gradle")) self.assertEqual(0, count, 'there should be this many errors') + def test_get_embedded_classes(self): + config = dict() + fdroidserver.common.config = config + fdroidserver.common.fill_config_defaults(config) + for f in ( + 'apk.embedded_1.apk', + 'bad-unicode-πÇÇ现代通用字-български-عربي1.apk', + 'janus.apk', + 'minimal_targetsdk_30_unsigned.apk', + 'no_targetsdk_minsdk1_unsigned.apk', + 'org.bitbucket.tickytacky.mirrormirror_1.apk', + 'org.bitbucket.tickytacky.mirrormirror_2.apk', + 'org.bitbucket.tickytacky.mirrormirror_3.apk', + 'org.bitbucket.tickytacky.mirrormirror_4.apk', + 'org.dyndns.fules.ck_20.apk', + 'SpeedoMeterApp.main_1.apk', + 'urzip.apk', + 'urzip-badcert.apk', + 'urzip-badsig.apk', + 'urzip-release.apk', + 'urzip-release-unsigned.apk', + 'repo/com.example.test.helloworld_1.apk', + 'repo/com.politedroid_3.apk', + 'repo/com.politedroid_4.apk', + 'repo/com.politedroid_5.apk', + 'repo/com.politedroid_6.apk', + 'repo/duplicate.permisssions_9999999.apk', + 'repo/info.zwanenburg.caffeinetile_4.apk', + 'repo/no.min.target.sdk_987.apk', + 'repo/obb.main.oldversion_1444412523.apk', + 'repo/obb.mainpatch.current_1619_another-release-key.apk', + 'repo/obb.mainpatch.current_1619.apk', + 'repo/obb.main.twoversions_1101613.apk', + 'repo/obb.main.twoversions_1101615.apk', + 'repo/obb.main.twoversions_1101617.apk', + 'repo/souch.smsbypass_9.apk', + 'repo/urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk', + 'repo/v1.v2.sig_1020.apk', + ): + self.assertNotEqual( + set(), + fdroidserver.scanner.get_embedded_classes(f), + 'should return results for ' + f, + ) + + def test_get_embedded_classes_empty_archives(self): + config = dict() + fdroidserver.common.config = config + fdroidserver.common.fill_config_defaults(config) + print('basedir') + for f in ( + 'Norway_bouvet_europe_2.obf.zip', + 'repo/fake.ota.update_1234.zip', + ): + self.assertEqual( + set(), + fdroidserver.scanner.get_embedded_classes(f), + 'should return not results for ' + f, + ) + + @unittest.skipIf( + sys.hexversion < 0x03090000, 'Python < 3.9 has a limited zipfile.is_zipfile()' + ) + def test_get_embedded_classes_secret_apk(self): + """Try to hide an APK+DEX in an APK and see if we can find it""" + config = dict() + fdroidserver.common.config = config + fdroidserver.common.fill_config_defaults(config) + apk = 'urzip.apk' + mapzip = 'Norway_bouvet_europe_2.obf.zip' + secretfile = os.path.join( + self.basedir, 'org.bitbucket.tickytacky.mirrormirror_1.apk' + ) + with tempfile.TemporaryDirectory() as tmpdir: + shutil.copy(apk, tmpdir) + shutil.copy(mapzip, tmpdir) + os.chdir(tmpdir) + with zipfile.ZipFile(mapzip, 'a') as zipfp: + zipfp.write(secretfile, 'secretapk') + with zipfile.ZipFile(apk) as readfp: + with readfp.open('classes.dex') as cfp: + zipfp.writestr('secretdex', cfp.read()) + with zipfile.ZipFile(apk, 'a') as zipfp: + zipfp.write(mapzip) + + cls = fdroidserver.scanner.get_embedded_classes(apk) + self.assertTrue( + 'org/bitbucket/tickytacky/mirrormirror/MainActivity' in cls, + 'this should find the classes in the hidden, embedded APK', + ) + self.assertTrue( + 'DEX file with fake name: secretdex' in cls, + 'badly named embedded DEX fils should throw an error', + ) + self.assertTrue( + 'ZIP file without proper file extension: secretapk' in cls, + 'badly named embedded ZIPs should throw an error', + ) + class Test_scan_binary(unittest.TestCase): def setUp(self): From 5354661fb41d092fdb21789f5321b1ac7e370064 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 5 Oct 2022 06:15:53 +0000 Subject: [PATCH 0805/2116] fix typo --- fdroidserver/lint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 685bda54..001e5a20 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -670,7 +670,7 @@ def check_updates_expected(app): app.get(key, 'None') == 'None' for key in ('AutoUpdateMode', 'UpdateCheckMode') ): yield _( - 'App has NoSourceSince or ArchivePolicy "0 versions" but AutoUpateMode or UpdateCheck are not None' + 'App has NoSourceSince or ArchivePolicy "0 versions" but AutoUpdateMode or UpdateCheckMode are not None' ) From f56b1f3012c6dc6576f07c1deb6865c794890e0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 22 Sep 2022 01:33:23 +0200 Subject: [PATCH 0806/2116] basic downloading for scan_binary signatures --- fdroidserver/common.py | 1 + fdroidserver/exception.py | 7 ++ fdroidserver/scanner.py | 161 +++++++++++++++++++++++--- tests/scanner.TestCase | 235 ++++++++++++++++++++++++++++++-------- tests/testcommon.py | 9 +- 5 files changed, 351 insertions(+), 62 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 8ed76fb7..f4a1fe77 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -125,6 +125,7 @@ default_config = { 'sdk_path': "$ANDROID_HOME", 'ndk_paths': {}, 'cachedir': str(Path.home() / '.cache/fdroidserver'), + 'cachedir_scanner': str(Path.home() / '.cache/fdroidserver/scanner'), 'java_paths': None, 'scan_binary': False, 'ant': "ant", diff --git a/fdroidserver/exception.py b/fdroidserver/exception.py index 097f4f68..a598b368 100644 --- a/fdroidserver/exception.py +++ b/fdroidserver/exception.py @@ -45,3 +45,10 @@ class BuildException(FDroidException): class VerificationException(FDroidException): pass + + +class ConfigurationException(FDroidException): + def __init__(self, value=None, detail=None): + super().__init__() + self.value = value + self.detail = detail diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 710d0c23..6321af8b 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -23,19 +23,23 @@ import re import sys import traceback import zipfile +import yaml from argparse import ArgumentParser from collections import namedtuple from copy import deepcopy from tempfile import TemporaryDirectory +from pathlib import Path import logging import itertools +import urllib.request +from datetime import datetime, timedelta import requests from . import _ from . import common from . import metadata -from .exception import BuildException, VCSException +from .exception import BuildException, VCSException, ConfigurationException from . import scanner config = None @@ -47,17 +51,6 @@ json_per_build = deepcopy(DEFAULT_JSON_PER_BUILD) MAVEN_URL_REGEX = re.compile(r"""\smaven\s*(?:{.*?(?:setUrl|url)|\((?:url)?)\s*=?\s*(?:uri)?\(?\s*["']?([^\s"']+)["']?[^})]*[)}]""", re.DOTALL) -CODE_SIGNATURES = { - exp: re.compile(r'.*' + exp, re.IGNORECASE) for exp in [ - r'com/google/firebase', - r'com/google/android/gms', - r'com/google/android/play/core', - r'com/google/tagmanager', - r'com/google/analytics', - r'com/android/billing', - ] -} - # Common known non-free blobs (always lower case): NON_FREE_GRADLE_LINES = { exp: re.compile(r'.*' + exp, re.IGNORECASE) for exp in [ @@ -109,6 +102,9 @@ NON_FREE_GRADLE_LINES = { } +SCANNER_CACHE_VERSION = 1 + + def get_gradle_compile_commands(build): compileCommands = ['compile', 'provided', @@ -188,6 +184,145 @@ def _exodus_compile_signatures(signatures): return compiled_tracker_signature +def _datetime_now(): + """ + simple warpper for datetime.now to allow mocking it for testing + """ + return datetime.now().astimezone() + + +def _scanner_cachedir(): + """ + get `Path` to local cache dir + """ + if not common.config or "cachedir_scanner" not in common.config: + raise ConfigurationException("could not load 'cachedir_scanner' config") + cachedir = Path(config["cachedir_scanner"]) + cachedir.mkdir(exist_ok=True, parents=True) + return cachedir + + +class SignatureCacheMalformedException(Exception): + pass + + +class SignatureCacheOutdatedException(Exception): + pass + + +class SignatureDataController: + def __init__(self, name, filename): + self.name = name + self.filename = filename + self.cache_outdated_interval = timedelta(days=7) + self.data = {} + + def check_data_version(self): + if self.data.get("version") != SCANNER_CACHE_VERSION: + raise SignatureCacheMalformedException() + + def check_last_updated(self): + timestamp = self.data.get("timestamp") + if not timestamp: + raise SignatureCacheMalformedException() + try: + timestamp = datetime.fromisoformat(timestamp) + except ValueError as e: + raise SignatureCacheMalformedException() from e + except TypeError as e: + raise SignatureCacheMalformedException() from e + if (timestamp + self.cache_outdated_interval) < scanner._datetime_now(): + raise SignatureCacheOutdatedException() + + def load_from_defaults(self): + sig_file = Path(__file__).absolute().parent / 'scanner_signatures' / self.file_name + with open(sig_file) as f: + self.data = yaml.safe_load(f) + + def load_from_cache(self): + sig_file = scanner._scanner_cachedir() / self.filename + if not sig_file.exists(): + raise SignatureCacheMalformedException() + with open(sig_file) as f: + self.data = yaml.safe_load(f) + + def write_to_cache(self): + sig_file = scanner._scanner_cachedir() / self.filename + with open(sig_file, "w", encoding="utf-8") as f: + yaml.safe_dump(self.data, f) + logging.debug("write '{}' to cache".format(self.filename)) + + def verify_data(self): + valid_keys = ['timestamp', 'version', 'signatures'] + for k in [x for x in self.data.keys() if x not in valid_keys]: + del self.data[k] + + # def scan + + +class ExodusSignatureDataController(SignatureDataController): + def __init__(self): + super().__init__('Exodus signatures', 'exodus.yml') + + def fetch_signatures_from_web(): + pass + # TODO + # exodus_url = "https://reports.exodus-privacy.eu.org/api/trackers" + # sigs = { + # "signatures": [], + # "timestamp": scanner._datetime_now().isoformat(), + # "version": SCANNER_CACHE_VERSION, + # } + + # with urllib.request.urlopen(exodus_url) as f: + # data = json.load(f) + # for tracker in data["trackers"].values(): + # sigs["signatures"].append({ + # "name": tracker["name"], + # "binary_signature": tracker["code_signature"], + # "network_signature": tracker["network_signature"], + # "types": ["tracker", "non-free"] # right now we assume all trackers in exodus are non-free + # }) + + +class ScannerSignatureDataController(SignatureDataController): + def __init__(self): + super().__init__('Scanner signatures', 'scanner.yml') + + def fetch_signatures_from_web(self): + url = "https://uniqx.gitlab.io/fdroid-scanner-signatures/sigs.json" + with urllib.request.urlopen(url) as f: + data = yaml.safe_load(f) + # TODO: validate parsed data + # TODO: error message 'please update fdroidserver/report' when fetching failed due to changes in the data strucutre + self.data = data + + +class SignatureTool(): + def __init__(self): + self.sdcs = [ScannerSignatureDataController()] + for sdc in self.sdcs: + sdc.fetch_signatures_from_web() + # TODO: use cache + # if not sdc.check_cache(): + # sdc.load_from_defaults() + self.compile_regexes() + + def compile_regexes(self): + self.regex = {'code_signatures': {}} + for sdc in self.sdcs: + for lname, ldef in sdc.data.get('signatures', []).items(): + self.regex['code_signatures'].update({(x, re.compile(x)) for x in ldef.get('code_signatures', [])}) + + def binary_signatures(self): + for sdc in self.sdcs: + for sig in sdc.binary_signatures(): + yield sig + + +SIGNATURE_TOOL = SignatureTool() + + # taken from exodus_core def load_exodus_trackers_signatures(): """ @@ -215,7 +350,7 @@ def scan_binary(apkfile, extract_signatures=None): result = get_embedded_classes(apkfile) problems = 0 for classname in result: - for suspect, regexp in CODE_SIGNATURES.items(): + for suspect, regexp in SIGNATURE_TOOL.regex['code_signatures'].items(): if regexp.match(classname): logging.debug("Found class '%s'" % classname) problems += 1 diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 991cd9f0..01076a6e 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -4,6 +4,7 @@ import glob import inspect import logging import optparse +import io import os import re import shutil @@ -17,6 +18,7 @@ import zipfile import collections import pathlib from unittest import mock +from datetime import datetime, timedelta localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') @@ -446,21 +448,19 @@ class Test_scan_binary(unittest.TestCase): fdroidserver.common.config = config fdroidserver.common.options = mock.Mock() + fdroidserver.scanner.SIGNATURE_TOOL = mock.Mock() + fdroidserver.scanner.SIGNATURE_TOOL.regex = {} + fdroidserver.scanner.SIGNATURE_TOOL.regex['code_signatures'] = { + "java/lang/Object": re.compile(r'.*java/lang/Object', re.IGNORECASE | re.UNICODE) + } + def test_code_signature_match(self): apkfile = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') - mock_code_signatures = { - "java/lang/Object": re.compile( - r'.*java/lang/Object', re.IGNORECASE | re.UNICODE - ) - } - with mock.patch("fdroidserver.scanner.CODE_SIGNATURES", mock_code_signatures): - self.assertEqual( - 1, - fdroidserver.scanner.scan_binary(apkfile), - "Did not find expected code signature '{}' in binary '{}'".format( - fdroidserver.scanner.CODE_SIGNATURES.values(), apkfile - ), - ) + self.assertEqual( + 1, + fdroidserver.scanner.scan_binary(apkfile), + "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner.SIGNATURE_TOOL.regex['code_signatures'].values(), apkfile), + ) @unittest.skipIf( sys.version_info < (3, 9), @@ -470,44 +470,85 @@ class Test_scan_binary(unittest.TestCase): ) def test_bottom_level_embedded_apk_code_signature(self): apkfile = os.path.join(self.basedir, 'apk.embedded_1.apk') - mock_code_signatures = { + fdroidserver.scanner.SIGNATURE_TOOL.regex['code_signatures'] = { "org/bitbucket/tickytacky/mirrormirror/MainActivity": re.compile( - r'.*org/bitbucket/tickytacky/mirrormirror/MainActivity', - re.IGNORECASE | re.UNICODE, + r'.*org/bitbucket/tickytacky/mirrormirror/MainActivity', re.IGNORECASE | re.UNICODE ) } - with mock.patch("fdroidserver.scanner.CODE_SIGNATURES", mock_code_signatures): - self.assertEqual( - 1, - fdroidserver.scanner.scan_binary(apkfile), - "Did not find expected code signature '{}' in binary '{}'".format( - fdroidserver.scanner.CODE_SIGNATURES.values(), apkfile - ), - ) + + self.assertEqual( + 1, + fdroidserver.scanner.scan_binary(apkfile), + "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner.SIGNATURE_TOOL.regex['code_signatures'].values(), apkfile), + ) def test_top_level_signature_embedded_apk_present(self): apkfile = os.path.join(self.basedir, 'apk.embedded_1.apk') - mock_code_signatures = { + fdroidserver.scanner.SIGNATURE_TOOL.regex['code_signatures'] = { "org/fdroid/ci/BuildConfig": re.compile( r'.*org/fdroid/ci/BuildConfig', re.IGNORECASE | re.UNICODE ) } - with mock.patch("fdroidserver.scanner.CODE_SIGNATURES", mock_code_signatures): - self.assertEqual( - 1, - fdroidserver.scanner.scan_binary(apkfile), - "Did not find expected code signature '{}' in binary '{}'".format( - fdroidserver.scanner.CODE_SIGNATURES.values(), apkfile - ), - ) - - def test_no_match(self): - apkfile = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') - result = fdroidserver.scanner.scan_binary(apkfile) self.assertEqual( - 0, result, "Found false positives in binary '{}'".format(apkfile) + 1, + fdroidserver.scanner.scan_binary(apkfile), + "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner.SIGNATURE_TOOL.regex['code_signatures'].values(), apkfile), ) + # TODO: re-enable once allow-listing migrated to more complex regexes + # def test_no_match(self): + # apkfile = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') + # result = fdroidserver.scanner.scan_binary(apkfile) + # self.assertEqual(0, result, "Found false positives in binary '{}'".format(apkfile)) + + +# class Test__fetch_exodus_signatures_to_cache(unittest.TestCase): +# def setUp(self): +# self.web_req_func = mock.Mock(return_value=io.StringIO(json.dumps({ +# "trackers": { +# "1": { +# "id": 1, +# "name": "Steyer Puch 1", +# "description": "blah blah blah", +# "creation_date": "1956-01-01", +# "code_signature": "com.puch.|com.steyer.", +# "network_signature": "pst\\.com", +# "website": "https://pst.com", +# "categories": ["tracker"], +# "documentation": [], +# }, +# "2": { +# "id": 2, +# "name": "Steyer Puch 2", +# "description": "blah blah blah", +# "creation_date": "1956-01-01", +# "code_signature": "com.puch.|com.steyer.", +# "network_signature": "pst\\.com", +# "website": "https://pst.com", +# "categories": ["tracker"], +# "documentation": [], +# } +# }, +# }))) +# self.open_func = mock.mock_open() +# self.cachedir_func = mock.Mock(return_value=pathlib.Path("mocked/path")) +# +# def test_ok(self): +# with mock.patch("urllib.request.urlopen", self.web_req_func), mock.patch( +# "builtins.open", self.open_func +# ) as outfilemock, mock.patch( +# "fdroidserver.scanner._scanner_cachedir", self.cachedir_func +# ), mock.patch("fdroidserver.scanner._datetime_now", unittest.mock.Mock(return_value=datetime(1999, 12, 31, 23, 59, 59))): +# fdroidserver.scanner.fetch_exodus_signatures_to_cache() +# +# self.cachedir_func.assert_called_once() +# self.web_req_func.assert_called_once_with("https://reports.exodus-privacy.eu.org/api/trackers") +# self.open_func.assert_called_once_with(pathlib.Path("mocked/path/exodus.json"), "w", encoding="utf-8") +# self.assertEqual( +# mock_open_to_str(self.open_func), +# """{"signatures": {"exodus-1": {"name": "Steyer Puch 1", "code_signature": "com.puch.|com.steyer.", "network_signature": "pst\\\\.com", "types": ["tracker", "non-free"]}, "exodus-2": {"name": "Steyer Puch 2", "code_signature": "com.puch.|com.steyer.", "network_signature": "pst\\\\.com", "types": ["tracker", "non-free"]}}, "timestamp": "1999-12-31T23:59:59"}""" +# ) + class Test__exodus_compile_signatures(unittest.TestCase): def setUp(self): @@ -581,6 +622,106 @@ class Test_load_exodus_trackers_signatures(unittest.TestCase): self.assertEqual(regex, "mocked return value") +class Test_SignatureDataController(unittest.TestCase): + # __init__ + def test_init(self): + sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') + self.assertEqual(sdc.name, 'nnn') + self.assertEqual(sdc.filename, 'fff.yml') + self.assertEqual(sdc.cache_outdated_interval, timedelta(days=7)) + self.assertDictEqual(sdc.data, {}) + + # check_last_updated + def test_check_last_updated_ok(self): + sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') + sdc.data['timestamp'] = datetime.now().astimezone().isoformat() + sdc.check_last_updated() + + def test_check_last_updated_exception_cache_outdated(self): + sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') + sdc.data['timestamp'] = (datetime.now().astimezone() - timedelta(days=30)).isoformat() + with self.assertRaises(fdroidserver.scanner.SignatureCacheOutdatedException): + sdc.check_last_updated() + + def test_check_last_updated_exception_missing_timestamp_value(self): + sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') + with self.assertRaises(fdroidserver.scanner.SignatureCacheMalformedException): + sdc.check_last_updated() + + def test_check_last_updated_exception_not_string(self): + sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') + sdc.data['timestamp'] = 12345 + with self.assertRaises(fdroidserver.scanner.SignatureCacheMalformedException): + sdc.check_last_updated() + + def test_check_last_updated_exception_not_iso_formatted_string(self): + sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') + sdc.data['timestamp'] = '01/09/2002 10:11' + with self.assertRaises(fdroidserver.scanner.SignatureCacheMalformedException): + sdc.check_last_updated() + + # check_data_version + def test_check_data_version_ok(self): + sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') + sdc.data['version'] = fdroidserver.scanner.SCANNER_CACHE_VERSION + sdc.check_data_version() + + def test_check_data_version_exception(self): + sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') + with self.assertRaises(fdroidserver.scanner.SignatureCacheMalformedException): + sdc.check_data_version() + + +class Test_ScannerSignatureDataController_fetch_signatures_from_web(unittest.TestCase): + def setUp(self): + self.uo_func = mock.Mock(return_value=io.StringIO(textwrap.dedent('''\ + version: 999 + timestamp: "1999-12-31T23:59:59.999999+00:00" + signatures: + - binary_signature: com/google/firebase + name: Google Firebase + types: + - tracker + - non-free + - gradle_signature: com/google/android/gms + name: Google Mobile Services + types: + - non-free + - network_signature: doubleclick\\.net + name: Another thing to test. + types: + - ads + '''))) + + def test_fetch_signatures_from_web(self): + sdc = fdroidserver.scanner.ScannerSignatureDataController() + with unittest.mock.patch('urllib.request.urlopen', self.uo_func): + sdc.fetch_signatures_from_web() + self.assertEqual(sdc.data.get('version'), 999) + self.assertEqual(sdc.data.get('timestamp'), "1999-12-31T23:59:59.999999+00:00") + self.assertListEqual( + sdc.data.get('signatures'), + [ + { + 'binary_signature': 'com/google/firebase', + 'name': 'Google Firebase', + 'types': ['tracker', 'non-free'], + }, + { + 'gradle_signature': 'com/google/android/gms', + 'name': 'Google Mobile Services', + 'types': ['non-free'], + }, + { + 'network_signature': 'doubleclick\\.net', + 'name': 'Another thing to test.', + 'types': ['ads'], + }, + ] + ) + self.assertEqual(len(sdc.data), 3) + + class Test_main(unittest.TestCase): def setUp(self): self.args = ["com.example.app", "local/additional.apk", "another.apk"] @@ -644,13 +785,13 @@ if __name__ == "__main__": (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() - newSuite.addTests( - [ - unittest.makeSuite(ScannerTest), - unittest.makeSuite(Test_scan_binary), - unittest.makeSuite(Test__exodus_compile_signatures), - unittest.makeSuite(Test_load_exodus_trackers_signatures), - unittest.makeSuite(Test_main), - ] - ) + newSuite.addTests([ + unittest.makeSuite(ScannerTest), + unittest.makeSuite(Test_scan_binary), + unittest.makeSuite(Test__exodus_compile_signatures), + unittest.makeSuite(Test_load_exodus_trackers_signatures), + unittest.makeSuite(Test_SignatureDataController), + unittest.makeSuite(Test_ScannerSignatureDataController_fetch_signatures_from_web), + unittest.makeSuite(Test_main), + ]) unittest.main(failfast=False) diff --git a/tests/testcommon.py b/tests/testcommon.py index 2557bd61..128ead00 100644 --- a/tests/testcommon.py +++ b/tests/testcommon.py @@ -36,8 +36,7 @@ class TmpCwd(): class TmpPyPath(): - """Context-manager for temporarily changing the current working - directory. + """Context-manager for temporarily adding a direcory to python path """ def __init__(self, additional_path): @@ -48,3 +47,9 @@ class TmpPyPath(): def __exit__(self, a, b, c): sys.path.remove(self.additional_path) + + +def mock_open_to_str(mock): + return "".join([ + x.args[0] for x in mock.mock_calls if str(x).startswith("call().write(") + ]) From 9c5b35742df52a55f3c21f23c3e3292ae6c75079 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 22 Sep 2022 14:43:16 +0200 Subject: [PATCH 0807/2116] use ScannerTool for basic cacheing and scanning --- fdroidserver/data/scanner/scanner.json | 42 ++++++++++++++++++++++ fdroidserver/scanner.py | 48 ++++++++++++++++---------- 2 files changed, 71 insertions(+), 19 deletions(-) create mode 100644 fdroidserver/data/scanner/scanner.json diff --git a/fdroidserver/data/scanner/scanner.json b/fdroidserver/data/scanner/scanner.json new file mode 100644 index 00000000..19eb1564 --- /dev/null +++ b/fdroidserver/data/scanner/scanner.json @@ -0,0 +1,42 @@ +{ + "signatures": { + "com.android.billing": { + "code_signatures": [ + "com/android/billing" + ], + "license": "NonFree" + }, + "com.google.analytics": { + "code_signatures": [ + "com/google/analytics" + ], + "license": "NonFree" + }, + "com.google.android.gms": { + "code_signatures": [ + "com/google/android/gms" + ], + "license": "NonFree" + }, + "com.google.android.play.core": { + "code_signatures": [ + "com/google/android/play/core" + ], + "license": "NonFree" + }, + "com.google.firebase": { + "code_signatures": [ + "com/google/firebase" + ], + "license": "NonFree" + }, + "com.google.tagmanager": { + "code_signatures": [ + "com/google/tagmanager" + ], + "license": "NonFree" + } + }, + "timestamp": "2022-09-15T12:43:06.508370+00:00", + "version": 1 +} diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 6321af8b..6848e1e8 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -234,22 +234,30 @@ class SignatureDataController: if (timestamp + self.cache_outdated_interval) < scanner._datetime_now(): raise SignatureCacheOutdatedException() + def load(self): + try: + self.load_from_cache() + self.verify_data() + except SignatureCacheMalformedException as e: + self.load_from_defaults() + self.write_to_cache() + def load_from_defaults(self): - sig_file = Path(__file__).absolute().parent / 'scanner_signatures' / self.file_name + sig_file = Path(__file__).absolute().parent / 'data' / 'scanner' / self.filename with open(sig_file) as f: - self.data = yaml.safe_load(f) + self.data = json.load(f) def load_from_cache(self): sig_file = scanner._scanner_cachedir() / self.filename if not sig_file.exists(): raise SignatureCacheMalformedException() with open(sig_file) as f: - self.data = yaml.safe_load(f) + self.data = json.load(f) def write_to_cache(self): sig_file = scanner._scanner_cachedir() / self.filename with open(sig_file, "w", encoding="utf-8") as f: - yaml.safe_dump(self.data, f) + json.dump(self.data, f, indent=2) logging.debug("write '{}' to cache".format(self.filename)) def verify_data(self): @@ -287,7 +295,7 @@ class ExodusSignatureDataController(SignatureDataController): class ScannerSignatureDataController(SignatureDataController): def __init__(self): - super().__init__('Scanner signatures', 'scanner.yml') + super().__init__('Scanner signatures', 'scanner.json') def fetch_signatures_from_web(self): url = "https://uniqx.gitlab.io/fdroid-scanner-signatures/sigs.json" @@ -298,29 +306,31 @@ class ScannerSignatureDataController(SignatureDataController): self.data = data -class SignatureTool(): +class ScannerTool(): def __init__(self): self.sdcs = [ScannerSignatureDataController()] for sdc in self.sdcs: - sdc.fetch_signatures_from_web() - # TODO: use cache - # if not sdc.check_cache(): - # sdc.load_from_defaults() + sdc.load() self.compile_regexes() def compile_regexes(self): self.regex = {'code_signatures': {}} for sdc in self.sdcs: - for lname, ldef in sdc.data.get('signatures', []).items(): - self.regex['code_signatures'].update({(x, re.compile(x)) for x in ldef.get('code_signatures', [])}) - - def binary_signatures(self): - for sdc in self.sdcs: - for sig in sdc.binary_signatures(): - yield sig + print(']]]', sdc.data) + for signame, sigdef in sdc.data.get('signatures', {}).items(): + for sig in sigdef['code_signatures']: + self.regex['code_signatures'][sig] = re.compile(sig, re.IGNORECASE) + print(')))', self.regex['code_signatures']) -SIGNATURE_TOOL = SignatureTool() +# TODO: change this from global instance to dependency injection +SCANNER_TOOL = None + + +def _get_tool(): + if not scanner.SCANNER_TOOL: + scanner.SCANNER_TOOL = ScannerTool() + return scanner.SCANNER_TOOL # taken from exodus_core @@ -350,7 +360,7 @@ def scan_binary(apkfile, extract_signatures=None): result = get_embedded_classes(apkfile) problems = 0 for classname in result: - for suspect, regexp in SIGNATURE_TOOL.regex['code_signatures'].items(): + for suspect, regexp in _get_tool().regex['code_signatures'].items(): if regexp.match(classname): logging.debug("Found class '%s'" % classname) problems += 1 From e4b54fe4a7cb31afb799beea75674edfbdc3828d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 22 Sep 2022 15:34:25 +0200 Subject: [PATCH 0808/2116] move NON_FREE_GRADLE_LINES to signature definition files --- fdroidserver/data/scanner/scanner.json | 253 ++++++++++++++++++++++++- fdroidserver/scanner.py | 62 +----- 2 files changed, 257 insertions(+), 58 deletions(-) diff --git a/fdroidserver/data/scanner/scanner.json b/fdroidserver/data/scanner/scanner.json index 19eb1564..f2479f22 100644 --- a/fdroidserver/data/scanner/scanner.json +++ b/fdroidserver/data/scanner/scanner.json @@ -1,23 +1,116 @@ { "signatures": { + "admob": { + "gradle_signatures": [ + "admob.*sdk.*android" + ], + "license": "NonFree" + }, + "androidx": { + "gradle_signatures": [ + "androidx.navigation:navigation-dynamic-features", + "androidx.work:work-gcm" + ], + "license": "NonFree" + }, + "appcenter-push": { + "gradle_signatures": [ + "appcenter-push" + ], + "license": "NonFree" + }, + "bugsense": { + "gradle_signatures": [ + "bugsense" + ], + "license": "NonFree" + }, + "cloudrail": { + "gradle_signatures": [ + "cloudrail" + ], + "license": "NonFree" + }, "com.android.billing": { "code_signatures": [ "com/android/billing" ], "license": "NonFree" }, + "com.android.billingclient": { + "gradle_signatures": [ + "com.android.billingclient" + ], + "license": "NonFree" + }, + "com.anjlab.android.iab.v3": { + "gradle_signatures": [ + "com.anjlab.android.iab.v3:library" + ], + "license": "NonFree" + }, + "com.cloudinary": { + "gradle_signatures": [ + "com.cloudinary:cloudinary-android" + ], + "license": "NonFree" + }, + "com.evernote": { + "gradle_signatures": [ + "com.evernote:android-job" + ], + "license": "NonFree" + }, + "com.facebook": { + "gradle_signatures": [ + "[\"']com.facebook.android['\":]" + ], + "license": "NonFree" + }, + "com.github.junrar": { + "gradle_signatures": [ + "com.github.junrar:junrar" + ], + "license": "NonFree" + }, + "com.github.penn5": { + "gradle_signatures": [ + "com.github.penn5:donations" + ], + "license": "NonFree" + }, "com.google.analytics": { "code_signatures": [ "com/google/analytics" ], "license": "NonFree" }, + "com.google.android.exoplayer": { + "gradle_signatures": [ + "com.google.android.exoplayer:extension-cast", + "com.google.android.exoplayer:extension-cronet" + ], + "license": "NonFree" + }, "com.google.android.gms": { "code_signatures": [ "com/google/android/gms" ], "license": "NonFree" }, + "com.google.android.libraries.places": { + "gradle_signatures": [ + "com.google.android.libraries.places:places" + ], + "license": "NonFree" + }, + "com.google.android.play": { + "gradle_signatures": [ + "com.google.android.play:app-update", + "com.google.android.play:core.*" + ], + "license": "NonFree" + }, "com.google.android.play.core": { "code_signatures": [ "com/google/android/play/core" @@ -30,13 +123,169 @@ ], "license": "NonFree" }, + "com.google.mlkit": { + "gradle_signatures": [ + "com.google.mlkit" + ], + "license": "NonFree" + }, "com.google.tagmanager": { "code_signatures": [ "com/google/tagmanager" ], "license": "NonFree" + }, + "com.hypertrack": { + "gradle_signatures": [ + "com.hypertrack" + ], + "license": "NonFree" + }, + "com.mapbox": { + "gradle_signatures": [ + "com.mapbox" + ], + "license": "NonFree" + }, + "com.onesignal": { + "gradle_signatures": [ + "com.onesignal:OneSignal" + ], + "license": "NonFree" + }, + "com.tencent.bugly": { + "gradle_signatures": [ + "com.tencent.bugly" + ], + "license": "NonFree" + }, + "com.umeng.umsdk": { + "gradle_signatures": [ + "com.umeng.umsdk" + ], + "license": "NonFree" + }, + "com.yandex.android": { + "gradle_signatures": [ + "com.yandex.android" + ], + "license": "NonFree" + }, + "com.yayandroid": { + "gradle_signatures": [ + "com.yayandroid:LocationManager" + ], + "license": "NonFree" + }, + "crashlytics": { + "gradle_signatures": [ + "crashlytics" + ], + "license": "NonFree" + }, + "crittercism": { + "gradle_signatures": [ + "crittercism" + ], + "license": "NonFree" + }, + "firebase": { + "gradle_signatures": [ + "firebase" + ], + "license": "NonFree" + }, + "flurryagent": { + "gradle_signatures": [ + "flurryagent" + ], + "license": "NonFree" + }, + "google-ad": { + "gradle_signatures": [ + "google.*ad.*view" + ], + "license": "NonFree" + }, + "google.admob": { + "gradle_signatures": [ + "google.*admob" + ], + "license": "NonFree" + }, + "google.play.services": { + "gradle_signatures": [ + "google.*play.*services" + ], + "license": "NonFree" + }, + "heyzap": { + "gradle_signatures": [ + "heyzap" + ], + "license": "NonFree" + }, + "io.github.sinaweibosdk": { + "gradle_signatures": [ + "io.github.sinaweibosdk" + ], + "license": "NonFree" + }, + "io.objectbox": { + "gradle_signatures": [ + "io.objectbox:objectbox-gradle-plugin" + ], + "license": "NonFree" + }, + "jpct": { + "gradle_signatures": [ + "jpct.*ae" + ], + "license": "NonFree" + }, + "libspen23": { + "gradle_signatures": [ + "libspen23" + ], + "license": "NonFree" + }, + "me.pushy": { + "gradle_signatures": [ + "me.pushy:sdk" + ], + "license": "NonFree" + }, + "org.jetbrains.kotlinx": { + "gradle_signatures": [ + "org.jetbrains.kotlinx:kotlinx-coroutines-play-services" + ], + "license": "NonFree" + }, + "ouya": { + "gradle_signatures": [ + "ouya.*sdk" + ], + "license": "NonFree" + }, + "paypal": { + "gradle_signatures": [ + "paypal.*mpl" + ], + "license": "NonFree" + }, + "xyz.belvi.mobilevision": { + "gradle_signatures": [ + "xyz.belvi.mobilevision:barcodescanner" + ], + "license": "NonFree" + }, + "youtube": { + "gradle_signatures": [ + "youtube.*android.*player.*api" + ], + "license": "NonFree" } }, - "timestamp": "2022-09-15T12:43:06.508370+00:00", + "timestamp": "2022-09-22T13:16:29.313769+00:00", "version": 1 -} +} \ No newline at end of file diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 6848e1e8..4b949723 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -51,56 +51,6 @@ json_per_build = deepcopy(DEFAULT_JSON_PER_BUILD) MAVEN_URL_REGEX = re.compile(r"""\smaven\s*(?:{.*?(?:setUrl|url)|\((?:url)?)\s*=?\s*(?:uri)?\(?\s*["']?([^\s"']+)["']?[^})]*[)}]""", re.DOTALL) -# Common known non-free blobs (always lower case): -NON_FREE_GRADLE_LINES = { - exp: re.compile(r'.*' + exp, re.IGNORECASE) for exp in [ - r'flurryagent', - r'paypal.*mpl', - r'admob.*sdk.*android', - r'google.*ad.*view', - r'google.*admob', - r'google.*play.*services', - r'com.google.android.play:core.*', - r'com.google.android.play:app-update', - r'com.google.android.libraries.places:places', - r'com.google.mlkit', - r'com.android.billingclient', - r'androidx.work:work-gcm', - r'crittercism', - r'heyzap', - r'jpct.*ae', - r'youtube.*android.*player.*api', - r'bugsense', - r'crashlytics', - r'ouya.*sdk', - r'libspen23', - r'firebase', - r'''["']com.facebook.android['":]''', - r'cloudrail', - r'com.tencent.bugly', - r'appcenter-push', - r'com.github.junrar:junrar', - r'androidx.navigation:navigation-dynamic-features', - r'xyz.belvi.mobilevision:barcodescanner', - r'org.jetbrains.kotlinx:kotlinx-coroutines-play-services', - r'me.pushy:sdk', - r'io.github.sinaweibosdk', - r'com.umeng.umsdk', - r'com.google.android.exoplayer:extension-cast', - r'io.objectbox:objectbox-gradle-plugin', - r'com.evernote:android-job', - r'com.yayandroid:LocationManager', - r'com.onesignal:OneSignal', - r'com.cloudinary:cloudinary-android', - r'com.google.android.exoplayer:extension-cronet', - r'com.anjlab.android.iab.v3:library', - r'com.github.penn5:donations', - r'com.mapbox', - r'com.yandex.android', - r'com.hypertrack', - ] -} - SCANNER_CACHE_VERSION = 1 @@ -314,13 +264,13 @@ class ScannerTool(): self.compile_regexes() def compile_regexes(self): - self.regex = {'code_signatures': {}} + self.regex = {'code_signatures': {}, 'gradle_signatures': {}} for sdc in self.sdcs: - print(']]]', sdc.data) for signame, sigdef in sdc.data.get('signatures', {}).items(): - for sig in sigdef['code_signatures']: - self.regex['code_signatures'][sig] = re.compile(sig, re.IGNORECASE) - print(')))', self.regex['code_signatures']) + for sig in sigdef.get('code_signatures', []): + self.regex['code_signatures'][sig] = re.compile('.*' + sig, re.IGNORECASE) + for sig in sigdef.get('gradle_signatures', []): + self.regex['gradle_signatures'][sig] = re.compile('.*' + sig, re.IGNORECASE) # TODO: change this from global instance to dependency injection @@ -412,7 +362,7 @@ def scan_source(build_dir, build=metadata.Build()): return any(al in s for al in allowlisted) def suspects_found(s): - for n, r in NON_FREE_GRADLE_LINES.items(): + for n, r in _get_tool().regex['gradle_signatures'].items(): if r.match(s) and not is_allowlisted(s): yield n From d5ef1b2e95fc7ffe09ba6b5487b34d0b50942aaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Fri, 23 Sep 2022 18:33:02 +0200 Subject: [PATCH 0809/2116] add --clear-cache option to scanner --- fdroidserver/scanner.py | 101 ++++++++++++++++++++++++++++------------ tests/scanner.TestCase | 26 +++++------ 2 files changed, 83 insertions(+), 44 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 4b949723..8dcb512a 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -16,26 +16,26 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import imghdr -import json import os import re import sys -import traceback -import zipfile +import json import yaml +import imghdr +import shutil +import logging +import zipfile +import requests +import itertools +import traceback +import urllib.request from argparse import ArgumentParser from collections import namedtuple from copy import deepcopy from tempfile import TemporaryDirectory from pathlib import Path -import logging -import itertools -import urllib.request from datetime import datetime, timedelta -import requests - from . import _ from . import common from . import metadata @@ -145,18 +145,24 @@ def _scanner_cachedir(): """ get `Path` to local cache dir """ - if not common.config or "cachedir_scanner" not in common.config: - raise ConfigurationException("could not load 'cachedir_scanner' config") - cachedir = Path(config["cachedir_scanner"]) + if not common.config: + raise ConfigurationException('config not initialized') + if "cachedir_scanner" not in common.config: + raise ConfigurationException("could not load 'cachedir_scanner' from config") + cachedir = Path(common.config["cachedir_scanner"]) cachedir.mkdir(exist_ok=True, parents=True) return cachedir -class SignatureCacheMalformedException(Exception): +class SignatureDataMalformedException(Exception): pass -class SignatureCacheOutdatedException(Exception): +class SignatureDataOutdatedException(Exception): + pass + + +class SignatureDataVersionMismatchException(Exception): pass @@ -169,26 +175,37 @@ class SignatureDataController: def check_data_version(self): if self.data.get("version") != SCANNER_CACHE_VERSION: - raise SignatureCacheMalformedException() + raise SignatureDataVersionMismatchException() def check_last_updated(self): + ''' + NOTE: currently not in use + + Checks if the timestamp value is ok. Raises an exception if something + is not ok. + + :raises SignatureDataMalformedException: when timestamp value is + inaccessible or not parseable + :raises SignatureDataOutdatedException: when timestamp is older then + `self.cache_outdated_interval` + ''' timestamp = self.data.get("timestamp") if not timestamp: - raise SignatureCacheMalformedException() + raise SignatureDataMalformedException() try: timestamp = datetime.fromisoformat(timestamp) except ValueError as e: - raise SignatureCacheMalformedException() from e + raise SignatureDataMalformedException() from e except TypeError as e: - raise SignatureCacheMalformedException() from e + raise SignatureDataMalformedException() from e if (timestamp + self.cache_outdated_interval) < scanner._datetime_now(): - raise SignatureCacheOutdatedException() + raise SignatureDataOutdatedException() def load(self): try: self.load_from_cache() self.verify_data() - except SignatureCacheMalformedException as e: + except (SignatureDataMalformedException, SignatureDataVersionMismatchException): self.load_from_defaults() self.write_to_cache() @@ -200,7 +217,7 @@ class SignatureDataController: def load_from_cache(self): sig_file = scanner._scanner_cachedir() / self.filename if not sig_file.exists(): - raise SignatureCacheMalformedException() + raise SignatureDataMalformedException() with open(sig_file) as f: self.data = json.load(f) @@ -211,7 +228,12 @@ class SignatureDataController: logging.debug("write '{}' to cache".format(self.filename)) def verify_data(self): + ''' + cleans and validates and cleans `self.data` + ''' + self.check_data_version() valid_keys = ['timestamp', 'version', 'signatures'] + for k in [x for x in self.data.keys() if x not in valid_keys]: del self.data[k] @@ -264,23 +286,35 @@ class ScannerTool(): self.compile_regexes() def compile_regexes(self): - self.regex = {'code_signatures': {}, 'gradle_signatures': {}} + self.err_regex = {'code_signatures': {}, 'gradle_signatures': {}} for sdc in self.sdcs: for signame, sigdef in sdc.data.get('signatures', {}).items(): for sig in sigdef.get('code_signatures', []): - self.regex['code_signatures'][sig] = re.compile('.*' + sig, re.IGNORECASE) + self.err_regex['code_signatures'][sig] = re.compile('.*' + sig, re.IGNORECASE) for sig in sigdef.get('gradle_signatures', []): - self.regex['gradle_signatures'][sig] = re.compile('.*' + sig, re.IGNORECASE) + self.err_regex['gradle_signatures'][sig] = re.compile('.*' + sig, re.IGNORECASE) + + def clear_cache(self): + # delete cache folder and all its contents + shutil.rmtree(scanner._scanner_cachedir(), ignore_errors=True) + # re-initialize, this will re-populate the cache from default values + self.__init__() -# TODO: change this from global instance to dependency injection -SCANNER_TOOL = None +# TODO: change this from singleton instance to dependency injection +# use `_get_tool()` instead of accessing this directly +_SCANNER_TOOL = None def _get_tool(): - if not scanner.SCANNER_TOOL: - scanner.SCANNER_TOOL = ScannerTool() - return scanner.SCANNER_TOOL + ''' + lazy loading factory for ScannerTool singleton + + ScannerTool initialization need to access `common.config` values. Those are only available after initialization through `common.read_config()` So this factory assumes config was called at an erlier point in time + ''' + if not scanner._SCANNER_TOOL: + scanner._SCANNER_TOOL = ScannerTool() + return scanner._SCANNER_TOOL # taken from exodus_core @@ -310,7 +344,7 @@ def scan_binary(apkfile, extract_signatures=None): result = get_embedded_classes(apkfile) problems = 0 for classname in result: - for suspect, regexp in _get_tool().regex['code_signatures'].items(): + for suspect, regexp in _get_tool().err_regex['code_signatures'].items(): if regexp.match(classname): logging.debug("Found class '%s'" % classname) problems += 1 @@ -362,7 +396,7 @@ def scan_source(build_dir, build=metadata.Build()): return any(al in s for al in allowlisted) def suspects_found(s): - for n, r in _get_tool().regex['gradle_signatures'].items(): + for n, r in _get_tool().err_regex['gradle_signatures'].items(): if r.match(s) and not is_allowlisted(s): yield n @@ -652,6 +686,8 @@ def main(): help=_("Force scan of disabled apps and builds.")) parser.add_argument("--json", action="store_true", default=False, help=_("Output JSON to stdout.")) + parser.add_argument("--clear-cache", action="store_true", default=False, + help=_("purge local scanner definitions cache")) metadata.add_metadata_arguments(parser) options = parser.parse_args() metadata.warnings_action = options.W @@ -665,6 +701,9 @@ def main(): config = common.read_config(options) + if options.clear_cache: + scanner._get_tool().clear_cache() + probcount = 0 exodus = [] diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 01076a6e..bb595832 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -448,9 +448,9 @@ class Test_scan_binary(unittest.TestCase): fdroidserver.common.config = config fdroidserver.common.options = mock.Mock() - fdroidserver.scanner.SIGNATURE_TOOL = mock.Mock() - fdroidserver.scanner.SIGNATURE_TOOL.regex = {} - fdroidserver.scanner.SIGNATURE_TOOL.regex['code_signatures'] = { + fdroidserver.scanner._SCANNER_TOOL = mock.Mock() + fdroidserver.scanner._SCANNER_TOOL.err_regex = {} + fdroidserver.scanner._SCANNER_TOOL.err_regex['code_signatures'] = { "java/lang/Object": re.compile(r'.*java/lang/Object', re.IGNORECASE | re.UNICODE) } @@ -459,7 +459,7 @@ class Test_scan_binary(unittest.TestCase): self.assertEqual( 1, fdroidserver.scanner.scan_binary(apkfile), - "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner.SIGNATURE_TOOL.regex['code_signatures'].values(), apkfile), + "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner._SCANNER_TOOL.err_regex['code_signatures'].values(), apkfile), ) @unittest.skipIf( @@ -470,7 +470,7 @@ class Test_scan_binary(unittest.TestCase): ) def test_bottom_level_embedded_apk_code_signature(self): apkfile = os.path.join(self.basedir, 'apk.embedded_1.apk') - fdroidserver.scanner.SIGNATURE_TOOL.regex['code_signatures'] = { + fdroidserver.scanner._SCANNER_TOOL.err_regex['code_signatures'] = { "org/bitbucket/tickytacky/mirrormirror/MainActivity": re.compile( r'.*org/bitbucket/tickytacky/mirrormirror/MainActivity', re.IGNORECASE | re.UNICODE ) @@ -479,12 +479,12 @@ class Test_scan_binary(unittest.TestCase): self.assertEqual( 1, fdroidserver.scanner.scan_binary(apkfile), - "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner.SIGNATURE_TOOL.regex['code_signatures'].values(), apkfile), + "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner._SCANNER_TOOL.err_regex['code_signatures'].values(), apkfile), ) def test_top_level_signature_embedded_apk_present(self): apkfile = os.path.join(self.basedir, 'apk.embedded_1.apk') - fdroidserver.scanner.SIGNATURE_TOOL.regex['code_signatures'] = { + fdroidserver.scanner._SCANNER_TOOL.err_regex['code_signatures'] = { "org/fdroid/ci/BuildConfig": re.compile( r'.*org/fdroid/ci/BuildConfig', re.IGNORECASE | re.UNICODE ) @@ -492,7 +492,7 @@ class Test_scan_binary(unittest.TestCase): self.assertEqual( 1, fdroidserver.scanner.scan_binary(apkfile), - "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner.SIGNATURE_TOOL.regex['code_signatures'].values(), apkfile), + "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner._SCANNER_TOOL.err_regex['code_signatures'].values(), apkfile), ) # TODO: re-enable once allow-listing migrated to more complex regexes @@ -640,24 +640,24 @@ class Test_SignatureDataController(unittest.TestCase): def test_check_last_updated_exception_cache_outdated(self): sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') sdc.data['timestamp'] = (datetime.now().astimezone() - timedelta(days=30)).isoformat() - with self.assertRaises(fdroidserver.scanner.SignatureCacheOutdatedException): + with self.assertRaises(fdroidserver.scanner.SignatureDataOutdatedException): sdc.check_last_updated() def test_check_last_updated_exception_missing_timestamp_value(self): sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') - with self.assertRaises(fdroidserver.scanner.SignatureCacheMalformedException): + with self.assertRaises(fdroidserver.scanner.SignatureDataMalformedException): sdc.check_last_updated() def test_check_last_updated_exception_not_string(self): sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') sdc.data['timestamp'] = 12345 - with self.assertRaises(fdroidserver.scanner.SignatureCacheMalformedException): + with self.assertRaises(fdroidserver.scanner.SignatureDataMalformedException): sdc.check_last_updated() def test_check_last_updated_exception_not_iso_formatted_string(self): sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') sdc.data['timestamp'] = '01/09/2002 10:11' - with self.assertRaises(fdroidserver.scanner.SignatureCacheMalformedException): + with self.assertRaises(fdroidserver.scanner.SignatureDataMalformedException): sdc.check_last_updated() # check_data_version @@ -668,7 +668,7 @@ class Test_SignatureDataController(unittest.TestCase): def test_check_data_version_exception(self): sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') - with self.assertRaises(fdroidserver.scanner.SignatureCacheMalformedException): + with self.assertRaises(fdroidserver.scanner.SignatureDataVersionMismatchException): sdc.check_data_version() From c10633eac594c1a5613afcebe5b4ddec081778ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Wed, 28 Sep 2022 17:35:31 +0200 Subject: [PATCH 0810/2116] convert fdroid scanner --exodus to SignatureDataController --- fdroidserver/common.py | 18 ++++- fdroidserver/scanner.py | 169 ++++++++++++++++++++++------------------ tests/build.TestCase | 2 +- tests/scanner.TestCase | 64 +++++++-------- tests/testcommon.py | 5 ++ 5 files changed, 142 insertions(+), 116 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index f4a1fe77..0da602ad 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -76,7 +76,7 @@ from fdroidserver.exception import FDroidException, VCSException, NoSubmodulesEx BuildException, VerificationException, MetaDataException from .asynchronousfilereader import AsynchronousFileReader -from . import apksigcopier +from . import apksigcopier, common # The path to this fdroidserver distribution @@ -321,6 +321,22 @@ def fill_config_defaults(thisconfig): break +def get_config(options=None): + """ + helper function for getting access to commons.config while safely + initializing if it wasn't initialized yet. + """ + global config + + if config is not None: + return config + + config = {} + common.fill_config_defaults(config) + common.read_config(options) + return config + + def regsub_file(pattern, repl, path): with open(path, 'rb') as f: text = f.read() diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 8dcb512a..31344288 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -20,7 +20,6 @@ import os import re import sys import json -import yaml import imghdr import shutil import logging @@ -42,7 +41,6 @@ from . import metadata from .exception import BuildException, VCSException, ConfigurationException from . import scanner -config = None options = None DEFAULT_JSON_PER_BUILD = {'errors': [], 'warnings': [], 'infos': []} # type: ignore @@ -136,7 +134,7 @@ def _exodus_compile_signatures(signatures): def _datetime_now(): """ - simple warpper for datetime.now to allow mocking it for testing + simple wrapper for datetime.now to allow mocking it for testing """ return datetime.now().astimezone() @@ -145,11 +143,12 @@ def _scanner_cachedir(): """ get `Path` to local cache dir """ - if not common.config: + cfg = common.get_config() + if not cfg: raise ConfigurationException('config not initialized') - if "cachedir_scanner" not in common.config: + if "cachedir_scanner" not in cfg: raise ConfigurationException("could not load 'cachedir_scanner' from config") - cachedir = Path(common.config["cachedir_scanner"]) + cachedir = Path(cfg["cachedir_scanner"]) cachedir.mkdir(exist_ok=True, parents=True) return cachedir @@ -170,7 +169,7 @@ class SignatureDataController: def __init__(self, name, filename): self.name = name self.filename = filename - self.cache_outdated_interval = timedelta(days=7) + self.cache_outdated_interval = None self.data = {} def check_data_version(self): @@ -198,8 +197,27 @@ class SignatureDataController: raise SignatureDataMalformedException() from e except TypeError as e: raise SignatureDataMalformedException() from e - if (timestamp + self.cache_outdated_interval) < scanner._datetime_now(): - raise SignatureDataOutdatedException() + if self.cache_outdated_interval: + if (timestamp + self.cache_outdated_interval) < scanner._datetime_now(): + raise SignatureDataOutdatedException() + + def fetch(self): + try: + self.load_from_cache() + self.verify_data() + self.check_last_updated() + except ( + SignatureDataMalformedException, + SignatureDataVersionMismatchException, + SignatureDataOutdatedException + ): + try: + self.fetch_signatures_from_web() + except AttributeError: + # just load from defaults if fetch_signatures_from_web is not + # implemented + self.load_from_defaults() + self.write_to_cache() def load(self): try: @@ -237,62 +255,70 @@ class SignatureDataController: for k in [x for x in self.data.keys() if x not in valid_keys]: del self.data[k] - # def scan - class ExodusSignatureDataController(SignatureDataController): def __init__(self): super().__init__('Exodus signatures', 'exodus.yml') + self.cache_outdated_interval = timedelta(days=1) # refresh exodus cache after one day - def fetch_signatures_from_web(): - pass - # TODO - # exodus_url = "https://reports.exodus-privacy.eu.org/api/trackers" - # sigs = { - # "signatures": [], - # "timestamp": scanner._datetime_now().isoformat(), - # "version": SCANNER_CACHE_VERSION, - # } + def fetch_signatures_from_web(self): + exodus_url = "https://reports.exodus-privacy.eu.org/api/trackers" + self.data = { + "signatures": {}, + "timestamp": scanner._datetime_now().isoformat(), + "version": SCANNER_CACHE_VERSION, + } - # with urllib.request.urlopen(exodus_url) as f: - # data = json.load(f) - # for tracker in data["trackers"].values(): - # sigs["signatures"].append({ - # "name": tracker["name"], - # "binary_signature": tracker["code_signature"], - # "network_signature": tracker["network_signature"], - # "types": ["tracker", "non-free"] # right now we assume all trackers in exodus are non-free - # }) + with urllib.request.urlopen(exodus_url) as f: + d = json.load(f) + for tracker in d["trackers"].values(): + if tracker.get('code_signature'): + self.data["signatures"][tracker["name"]] = { + "name": tracker["name"], + "warn_code_signatures": [tracker["code_signature"]], + # exodus also provides network signatures, unused atm. + # "network_signatures": [tracker["network_signature"]], + "AntiFeatures": ["Tracking"], + "license": "NonFree" # We assume all trackers in exodus + # are non-free, alought free + # trackers like piwik, acra, + # etc. might be listed by exodus + # too. + } class ScannerSignatureDataController(SignatureDataController): def __init__(self): super().__init__('Scanner signatures', 'scanner.json') - def fetch_signatures_from_web(self): - url = "https://uniqx.gitlab.io/fdroid-scanner-signatures/sigs.json" - with urllib.request.urlopen(url) as f: - data = yaml.safe_load(f) - # TODO: validate parsed data - # TODO: error message 'please update fdroidserver/report' when fetching failed due to changes in the data strucutre - self.data = data - class ScannerTool(): def __init__(self): self.sdcs = [ScannerSignatureDataController()] - for sdc in self.sdcs: - sdc.load() + self.load() self.compile_regexes() + def load(self): + for sdc in self.sdcs: + sdc.load() + def compile_regexes(self): - self.err_regex = {'code_signatures': {}, 'gradle_signatures': {}} + self.regexs = { + 'err_code_signatures': {}, + 'err_gradle_signatures': {}, + 'warn_code_signatures': {}, + 'warn_gradle_signatures': {}, + } for sdc in self.sdcs: for signame, sigdef in sdc.data.get('signatures', {}).items(): for sig in sigdef.get('code_signatures', []): - self.err_regex['code_signatures'][sig] = re.compile('.*' + sig, re.IGNORECASE) + self.regexs['err_code_signatures'][sig] = re.compile('.*' + sig, re.IGNORECASE) for sig in sigdef.get('gradle_signatures', []): - self.err_regex['gradle_signatures'][sig] = re.compile('.*' + sig, re.IGNORECASE) + self.regexs['err_gradle_signatures'][sig] = re.compile('.*' + sig, re.IGNORECASE) + for sig in sigdef.get('warn_code_signatures', []): + self.regexs['warn_code_signatures'][sig] = re.compile('.*' + sig, re.IGNORECASE) + for sig in sigdef.get('warn_gradle_signatures', []): + self.regexs['warn_gradle_signatures'][sig] = re.compile('.*' + sig, re.IGNORECASE) def clear_cache(self): # delete cache folder and all its contents @@ -300,6 +326,10 @@ class ScannerTool(): # re-initialize, this will re-populate the cache from default values self.__init__() + def add(self, new_controller: SignatureDataController): + self.sdcs.append(new_controller) + self.compile_regexes() + # TODO: change this from singleton instance to dependency injection # use `_get_tool()` instead of accessing this directly @@ -342,36 +372,20 @@ def scan_binary(apkfile, extract_signatures=None): """Scan output of dexdump for known non-free classes.""" logging.info(_('Scanning APK with dexdump for known non-free classes.')) result = get_embedded_classes(apkfile) - problems = 0 + problems, warnings = 0, 0 for classname in result: - for suspect, regexp in _get_tool().err_regex['code_signatures'].items(): + for suspect, regexp in _get_tool().regexs['warn_code_signatures'].items(): if regexp.match(classname): - logging.debug("Found class '%s'" % classname) + logging.debug("Warning: found class '%s'" % classname) + warnings += 1 + for suspect, regexp in _get_tool().regexs['err_code_signatures'].items(): + if regexp.match(classname): + logging.debug("Problem: found class '%s'" % classname) problems += 1 - - if extract_signatures: - - def _detect_tracker(sig, tracker, class_list): - for clazz in class_list: - if sig.search(clazz): - logging.debug("Found tracker, class {} matching {}".format(clazz, tracker.code_signature)) - return tracker - return None - - results = [] - args = [(extract_signatures[1][index], tracker, result) - for (index, tracker) in enumerate(extract_signatures[0]) if - len(tracker.code_signature) > 3] - - for res in itertools.starmap(_detect_tracker, args): - if res: - results.append(res) - - trackers = [t for t in results if t is not None] - problems += len(trackers) - + if warnings: + logging.warning(_("Found {count} warnings in {filename}").format(count=warnings, filename=apkfile)) if problems: - logging.critical("Found problems in %s" % apkfile) + logging.critical(_("Found {count} problems in {filename}").format(count=problems, filename=apkfile)) return problems @@ -396,7 +410,7 @@ def scan_source(build_dir, build=metadata.Build()): return any(al in s for al in allowlisted) def suspects_found(s): - for n, r in _get_tool().err_regex['gradle_signatures'].items(): + for n, r in _get_tool().regexs['err_gradle_signatures'].items(): if r.match(s) and not is_allowlisted(s): yield n @@ -669,7 +683,7 @@ def scan_source(build_dir, build=metadata.Build()): def main(): - global config, options, json_per_build + global options, json_per_build # Parse command line... parser = ArgumentParser( @@ -699,24 +713,25 @@ def main(): else: logging.getLogger().setLevel(logging.ERROR) - config = common.read_config(options) + # initialize/load configuration values + common.get_config(options) if options.clear_cache: scanner._get_tool().clear_cache() + if options.exodus: + c = ExodusSignatureDataController() + c.fetch() + scanner._get_tool().add(c) probcount = 0 - exodus = [] - if options.exodus: - exodus = load_exodus_trackers_signatures() - appids = [] for apk in options.appid: if os.path.isfile(apk): - count = scanner.scan_binary(apk, exodus) + count = scanner.scan_binary(apk) if count > 0: logging.warning( - _('Scanner found {count} problems in {apk}:').format( + _('Scanner found {count} problems in {apk}').format( count=count, apk=apk ) ) diff --git a/tests/build.TestCase b/tests/build.TestCase index 13378060..cca5fa0c 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -402,7 +402,7 @@ class BuildTest(unittest.TestCase): os.chdir(testdir) os.mkdir("build") - config = dict() + config = fdroidserver.common.get_config() config['sdk_path'] = os.getenv('ANDROID_HOME') config['ndk_paths'] = {'r10d': os.getenv('ANDROID_NDK_HOME')} fdroidserver.common.config = config diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index bb595832..ade8bd0a 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -31,7 +31,7 @@ import fdroidserver.build import fdroidserver.common import fdroidserver.metadata import fdroidserver.scanner -from testcommon import TmpCwd +from testcommon import TmpCwd, mock_open_to_str class ScannerTest(unittest.TestCase): @@ -449,17 +449,18 @@ class Test_scan_binary(unittest.TestCase): fdroidserver.common.options = mock.Mock() fdroidserver.scanner._SCANNER_TOOL = mock.Mock() - fdroidserver.scanner._SCANNER_TOOL.err_regex = {} - fdroidserver.scanner._SCANNER_TOOL.err_regex['code_signatures'] = { + fdroidserver.scanner._SCANNER_TOOL.regexs = {} + fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'] = { "java/lang/Object": re.compile(r'.*java/lang/Object', re.IGNORECASE | re.UNICODE) } + fdroidserver.scanner._SCANNER_TOOL.regexs['warn_code_signatures'] = {} def test_code_signature_match(self): apkfile = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') self.assertEqual( 1, fdroidserver.scanner.scan_binary(apkfile), - "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner._SCANNER_TOOL.err_regex['code_signatures'].values(), apkfile), + "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'].values(), apkfile), ) @unittest.skipIf( @@ -470,7 +471,7 @@ class Test_scan_binary(unittest.TestCase): ) def test_bottom_level_embedded_apk_code_signature(self): apkfile = os.path.join(self.basedir, 'apk.embedded_1.apk') - fdroidserver.scanner._SCANNER_TOOL.err_regex['code_signatures'] = { + fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'] = { "org/bitbucket/tickytacky/mirrormirror/MainActivity": re.compile( r'.*org/bitbucket/tickytacky/mirrormirror/MainActivity', re.IGNORECASE | re.UNICODE ) @@ -479,12 +480,12 @@ class Test_scan_binary(unittest.TestCase): self.assertEqual( 1, fdroidserver.scanner.scan_binary(apkfile), - "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner._SCANNER_TOOL.err_regex['code_signatures'].values(), apkfile), + "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'].values(), apkfile), ) def test_top_level_signature_embedded_apk_present(self): apkfile = os.path.join(self.basedir, 'apk.embedded_1.apk') - fdroidserver.scanner._SCANNER_TOOL.err_regex['code_signatures'] = { + fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'] = { "org/fdroid/ci/BuildConfig": re.compile( r'.*org/fdroid/ci/BuildConfig', re.IGNORECASE | re.UNICODE ) @@ -492,7 +493,7 @@ class Test_scan_binary(unittest.TestCase): self.assertEqual( 1, fdroidserver.scanner.scan_binary(apkfile), - "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner._SCANNER_TOOL.err_regex['code_signatures'].values(), apkfile), + "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'].values(), apkfile), ) # TODO: re-enable once allow-listing migrated to more complex regexes @@ -671,6 +672,23 @@ class Test_SignatureDataController(unittest.TestCase): with self.assertRaises(fdroidserver.scanner.SignatureDataVersionMismatchException): sdc.check_data_version() + def test_write_to_cache(self): + open_func = mock.mock_open() + sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') + sdc.data = {"mocked": "data"} + + with mock.patch("builtins.open", open_func), mock.patch( + "fdroidserver.scanner._scanner_cachedir", + return_value=pathlib.Path('.'), + ): + sdc.write_to_cache() + + open_func.assert_called_with(pathlib.Path('fff.yml'), 'w', encoding="utf-8") + self.assertEqual( + mock_open_to_str(open_func), + """{\n "mocked": "data"\n}""" + ) + class Test_ScannerSignatureDataController_fetch_signatures_from_web(unittest.TestCase): def setUp(self): @@ -693,34 +711,6 @@ class Test_ScannerSignatureDataController_fetch_signatures_from_web(unittest.Tes - ads '''))) - def test_fetch_signatures_from_web(self): - sdc = fdroidserver.scanner.ScannerSignatureDataController() - with unittest.mock.patch('urllib.request.urlopen', self.uo_func): - sdc.fetch_signatures_from_web() - self.assertEqual(sdc.data.get('version'), 999) - self.assertEqual(sdc.data.get('timestamp'), "1999-12-31T23:59:59.999999+00:00") - self.assertListEqual( - sdc.data.get('signatures'), - [ - { - 'binary_signature': 'com/google/firebase', - 'name': 'Google Firebase', - 'types': ['tracker', 'non-free'], - }, - { - 'gradle_signature': 'com/google/android/gms', - 'name': 'Google Mobile Services', - 'types': ['non-free'], - }, - { - 'network_signature': 'doubleclick\\.net', - 'name': 'Another thing to test.', - 'types': ['ads'], - }, - ] - ) - self.assertEqual(len(sdc.data), 3) - class Test_main(unittest.TestCase): def setUp(self): @@ -768,7 +758,7 @@ class Test_main(unittest.TestCase): self.exit_func.assert_not_called() self.read_app_args_func.assert_not_called() - self.scan_binary_func.assert_called_once_with('local.application.apk', []) + self.scan_binary_func.assert_called_once_with('local.application.apk') if __name__ == "__main__": diff --git a/tests/testcommon.py b/tests/testcommon.py index 128ead00..29b3f9b6 100644 --- a/tests/testcommon.py +++ b/tests/testcommon.py @@ -50,6 +50,11 @@ class TmpPyPath(): def mock_open_to_str(mock): + """ + helper function for accessing all data written into a + unittest.mock.mock_open() instance as a string. + """ + return "".join([ x.args[0] for x in mock.mock_calls if str(x).startswith("call().write(") ]) From c9b59b525d486662d6e007711a3814ef35b2f0a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Wed, 28 Sep 2022 18:18:19 +0200 Subject: [PATCH 0811/2116] fix timestamp check; remove dead code --- fdroidserver/scanner.py | 40 ------------ tests/scanner.TestCase | 131 +--------------------------------------- 2 files changed, 2 insertions(+), 169 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 31344288..b4d46a4d 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -24,12 +24,10 @@ import imghdr import shutil import logging import zipfile -import requests import itertools import traceback import urllib.request from argparse import ArgumentParser -from collections import namedtuple from copy import deepcopy from tempfile import TemporaryDirectory from pathlib import Path @@ -115,23 +113,6 @@ def get_embedded_classes(apkfile, depth=0): return classes -# taken from exodus_core -def _exodus_compile_signatures(signatures): - """ - Compiles the regex associated to each signature, in order to speed up the trackers detection. - - :return: A compiled list of signatures. - """ - compiled_tracker_signature = [] - try: - compiled_tracker_signature = [ - re.compile(track.code_signature) for track in signatures - ] - except TypeError: - print("signatures is not iterable") - return compiled_tracker_signature - - def _datetime_now(): """ simple wrapper for datetime.now to allow mocking it for testing @@ -347,27 +328,6 @@ def _get_tool(): return scanner._SCANNER_TOOL -# taken from exodus_core -def load_exodus_trackers_signatures(): - """ - Load trackers signatures from the official Exodus database. - - :return: a dictionary containing signatures. - """ - signatures = [] - exodus_url = "https://reports.exodus-privacy.eu.org/api/trackers" - r = requests.get(exodus_url, timeout=300) - data = r.json() - for e in data['trackers']: - signatures.append( - namedtuple('tracker', data['trackers'][e].keys())( - *data['trackers'][e].values() - ) - ) - logging.debug('{} trackers signatures loaded'.format(len(signatures))) - return signatures, scanner._exodus_compile_signatures(signatures) - - def scan_binary(apkfile, extract_signatures=None): """Scan output of dexdump for known non-free classes.""" logging.info(_('Scanning APK with dexdump for known non-free classes.')) diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index ade8bd0a..4922fdf3 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -496,132 +496,6 @@ class Test_scan_binary(unittest.TestCase): "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'].values(), apkfile), ) - # TODO: re-enable once allow-listing migrated to more complex regexes - # def test_no_match(self): - # apkfile = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') - # result = fdroidserver.scanner.scan_binary(apkfile) - # self.assertEqual(0, result, "Found false positives in binary '{}'".format(apkfile)) - - -# class Test__fetch_exodus_signatures_to_cache(unittest.TestCase): -# def setUp(self): -# self.web_req_func = mock.Mock(return_value=io.StringIO(json.dumps({ -# "trackers": { -# "1": { -# "id": 1, -# "name": "Steyer Puch 1", -# "description": "blah blah blah", -# "creation_date": "1956-01-01", -# "code_signature": "com.puch.|com.steyer.", -# "network_signature": "pst\\.com", -# "website": "https://pst.com", -# "categories": ["tracker"], -# "documentation": [], -# }, -# "2": { -# "id": 2, -# "name": "Steyer Puch 2", -# "description": "blah blah blah", -# "creation_date": "1956-01-01", -# "code_signature": "com.puch.|com.steyer.", -# "network_signature": "pst\\.com", -# "website": "https://pst.com", -# "categories": ["tracker"], -# "documentation": [], -# } -# }, -# }))) -# self.open_func = mock.mock_open() -# self.cachedir_func = mock.Mock(return_value=pathlib.Path("mocked/path")) -# -# def test_ok(self): -# with mock.patch("urllib.request.urlopen", self.web_req_func), mock.patch( -# "builtins.open", self.open_func -# ) as outfilemock, mock.patch( -# "fdroidserver.scanner._scanner_cachedir", self.cachedir_func -# ), mock.patch("fdroidserver.scanner._datetime_now", unittest.mock.Mock(return_value=datetime(1999, 12, 31, 23, 59, 59))): -# fdroidserver.scanner.fetch_exodus_signatures_to_cache() -# -# self.cachedir_func.assert_called_once() -# self.web_req_func.assert_called_once_with("https://reports.exodus-privacy.eu.org/api/trackers") -# self.open_func.assert_called_once_with(pathlib.Path("mocked/path/exodus.json"), "w", encoding="utf-8") -# self.assertEqual( -# mock_open_to_str(self.open_func), -# """{"signatures": {"exodus-1": {"name": "Steyer Puch 1", "code_signature": "com.puch.|com.steyer.", "network_signature": "pst\\\\.com", "types": ["tracker", "non-free"]}, "exodus-2": {"name": "Steyer Puch 2", "code_signature": "com.puch.|com.steyer.", "network_signature": "pst\\\\.com", "types": ["tracker", "non-free"]}}, "timestamp": "1999-12-31T23:59:59"}""" -# ) - - -class Test__exodus_compile_signatures(unittest.TestCase): - def setUp(self): - self.m1 = mock.Mock() - self.m1.code_signature = r"^random\sregex$" - self.m2 = mock.Mock() - self.m2.code_signature = r"^another.+regex$" - self.mock_sigs = [self.m1, self.m2] - - def test_ok(self): - result = fdroidserver.scanner._exodus_compile_signatures(self.mock_sigs) - self.assertListEqual( - result, - [ - re.compile(self.m1.code_signature), - re.compile(self.m2.code_signature), - ], - ) - - def test_not_iterable(self): - result = fdroidserver.scanner._exodus_compile_signatures(123) - self.assertListEqual(result, []) - - -class Test_load_exodus_trackers_signatures(unittest.TestCase): - def setUp(self): - self.requests_ret = mock.Mock() - self.requests_ret.json = mock.Mock( - return_value={ - "trackers": { - "1": { - "id": 1, - "name": "Steyer Puch 1", - "description": "blah blah blah", - "creation_date": "1956-01-01", - "code_signature": "com.puch.|com.steyer.", - "network_signature": "pst\\.com", - "website": "https://pst.com", - "categories": ["tracker"], - "documentation": [], - }, - "2": { - "id": 2, - "name": "Steyer Puch 2", - "description": "blah blah blah", - "creation_date": "1956-01-01", - "code_signature": "com.puch.|com.steyer.", - "network_signature": "pst\\.com", - "website": "https://pst.com", - "categories": ["tracker"], - "documentation": [], - }, - }, - } - ) - self.requests_func = mock.Mock(return_value=self.requests_ret) - self.compilesig_func = mock.Mock(return_value="mocked return value") - - def test_ok(self): - with mock.patch("requests.get", self.requests_func), mock.patch( - "fdroidserver.scanner._exodus_compile_signatures", self.compilesig_func - ): - sigs, regex = fdroidserver.scanner.load_exodus_trackers_signatures() - self.requests_func.assert_called_once_with( - "https://reports.exodus-privacy.eu.org/api/trackers", timeout=300 - ) - self.assertEqual(len(sigs), 2) - self.assertListEqual([1, 2], sorted([x.id for x in sigs])) - - self.compilesig_func.assert_called_once_with(sigs) - self.assertEqual(regex, "mocked return value") - class Test_SignatureDataController(unittest.TestCase): # __init__ @@ -629,7 +503,7 @@ class Test_SignatureDataController(unittest.TestCase): sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') self.assertEqual(sdc.name, 'nnn') self.assertEqual(sdc.filename, 'fff.yml') - self.assertEqual(sdc.cache_outdated_interval, timedelta(days=7)) + self.assertEqual(sdc.cache_outdated_interval, None) self.assertDictEqual(sdc.data, {}) # check_last_updated @@ -640,6 +514,7 @@ class Test_SignatureDataController(unittest.TestCase): def test_check_last_updated_exception_cache_outdated(self): sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') + sdc.cache_outdated_interval = timedelta(days=7) sdc.data['timestamp'] = (datetime.now().astimezone() - timedelta(days=30)).isoformat() with self.assertRaises(fdroidserver.scanner.SignatureDataOutdatedException): sdc.check_last_updated() @@ -778,8 +653,6 @@ if __name__ == "__main__": newSuite.addTests([ unittest.makeSuite(ScannerTest), unittest.makeSuite(Test_scan_binary), - unittest.makeSuite(Test__exodus_compile_signatures), - unittest.makeSuite(Test_load_exodus_trackers_signatures), unittest.makeSuite(Test_SignatureDataController), unittest.makeSuite(Test_ScannerSignatureDataController_fetch_signatures_from_web), unittest.makeSuite(Test_main), From dc1a2db3f49f48c1bb99ba8e87648c48c5a49274 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 29 Sep 2022 10:33:01 +0200 Subject: [PATCH 0812/2116] scanner: use Path.resovle instead of undocumented absolute() --- fdroidserver/scanner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index b4d46a4d..c77caab1 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -209,7 +209,7 @@ class SignatureDataController: self.write_to_cache() def load_from_defaults(self): - sig_file = Path(__file__).absolute().parent / 'data' / 'scanner' / self.filename + sig_file = (Path(__file__).parent / 'data' / 'scanner' / self.filename).resolve() with open(sig_file) as f: self.data = json.load(f) From 1e6694112a09292827fda3993cfee9300c7601e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 29 Sep 2022 16:42:04 +0200 Subject: [PATCH 0813/2116] rename to suss --- fdroidserver/data/scanner/{scanner.json => suss.json} | 0 fdroidserver/scanner.py | 6 +++--- tests/scanner.TestCase | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) rename fdroidserver/data/scanner/{scanner.json => suss.json} (100%) diff --git a/fdroidserver/data/scanner/scanner.json b/fdroidserver/data/scanner/suss.json similarity index 100% rename from fdroidserver/data/scanner/scanner.json rename to fdroidserver/data/scanner/suss.json diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index c77caab1..6fe49dd1 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -268,14 +268,14 @@ class ExodusSignatureDataController(SignatureDataController): } -class ScannerSignatureDataController(SignatureDataController): +class SUSSDataController(SignatureDataController): def __init__(self): - super().__init__('Scanner signatures', 'scanner.json') + super().__init__('SUSS', 'suss.json') class ScannerTool(): def __init__(self): - self.sdcs = [ScannerSignatureDataController()] + self.sdcs = [SUSSDataController()] self.load() self.compile_regexes() diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 4922fdf3..1e21e7b5 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -565,7 +565,7 @@ class Test_SignatureDataController(unittest.TestCase): ) -class Test_ScannerSignatureDataController_fetch_signatures_from_web(unittest.TestCase): +class Test_SUSSDataController_fetch_signatures_from_web(unittest.TestCase): def setUp(self): self.uo_func = mock.Mock(return_value=io.StringIO(textwrap.dedent('''\ version: 999 @@ -654,7 +654,7 @@ if __name__ == "__main__": unittest.makeSuite(ScannerTest), unittest.makeSuite(Test_scan_binary), unittest.makeSuite(Test_SignatureDataController), - unittest.makeSuite(Test_ScannerSignatureDataController_fetch_signatures_from_web), + unittest.makeSuite(Test_SUSSDataController_fetch_signatures_from_web), unittest.makeSuite(Test_main), ]) unittest.main(failfast=False) From 4a38908bd7b455805905389f4440d6ee362eca7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 29 Sep 2022 16:43:52 +0200 Subject: [PATCH 0814/2116] make cachedir subdirectories pick their place correctly based on parent folder --- fdroidserver/common.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 0da602ad..7e6bed29 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -125,13 +125,11 @@ default_config = { 'sdk_path': "$ANDROID_HOME", 'ndk_paths': {}, 'cachedir': str(Path.home() / '.cache/fdroidserver'), - 'cachedir_scanner': str(Path.home() / '.cache/fdroidserver/scanner'), 'java_paths': None, 'scan_binary': False, 'ant': "ant", 'mvn3': "mvn", 'gradle': os.path.join(FDROID_PATH, 'gradlew-fdroid'), - 'gradle_version_dir': str(Path.home() / '.cache/fdroidserver/gradle'), 'sync_from_local_copy_dir': False, 'allow_disabled_algorithms': False, 'per_app_repos': False, @@ -320,6 +318,11 @@ def fill_config_defaults(thisconfig): ndk_paths[ndkdict['release']] = ndk_paths.pop(k) break + if 'cachedir_scanner' not in thisconfig: + thisconfig['cachedir_scanner'] = str(Path(thisconfig['cachedir']) / 'scanner') + if 'gradle_version_dir' not in thisconfig: + thisconfig['gradle_version_dir'] = str(Path(thisconfig['cachedir']) / 'gradle') + def get_config(options=None): """ From bfcc30b85441ae736e22161e955f91f89ce57c5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 29 Sep 2022 19:55:27 +0200 Subject: [PATCH 0815/2116] add --refresh to scanner --- fdroidserver/scanner.py | 71 ++++++++++++++++++++++++----------------- tests/scanner.TestCase | 44 ++++++------------------- 2 files changed, 52 insertions(+), 63 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 6fe49dd1..9fc5fcb2 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -21,7 +21,6 @@ import re import sys import json import imghdr -import shutil import logging import zipfile import itertools @@ -147,10 +146,12 @@ class SignatureDataVersionMismatchException(Exception): class SignatureDataController: - def __init__(self, name, filename): + def __init__(self, name, filename, url): self.name = name self.filename = filename - self.cache_outdated_interval = None + self.url = url + # by default we assume cache is valid indefinitely + self.cache_outdated_interval = timedelta(days=999999) self.data = {} def check_data_version(self): @@ -165,7 +166,7 @@ class SignatureDataController: is not ok. :raises SignatureDataMalformedException: when timestamp value is - inaccessible or not parseable + inaccessible or not parse-able :raises SignatureDataOutdatedException: when timestamp is older then `self.cache_outdated_interval` ''' @@ -178,9 +179,8 @@ class SignatureDataController: raise SignatureDataMalformedException() from e except TypeError as e: raise SignatureDataMalformedException() from e - if self.cache_outdated_interval: - if (timestamp + self.cache_outdated_interval) < scanner._datetime_now(): - raise SignatureDataOutdatedException() + if (timestamp + self.cache_outdated_interval) < scanner._datetime_now(): + raise SignatureDataOutdatedException() def fetch(self): try: @@ -233,24 +233,31 @@ class SignatureDataController: self.check_data_version() valid_keys = ['timestamp', 'version', 'signatures'] - for k in [x for x in self.data.keys() if x not in valid_keys]: - del self.data[k] + for k in list(self.data.keys()): + if k not in valid_keys: + del self.data[k] + + def fetch_signatures_from_web(self): + logging.debug(_("downloading '{}'").format(self.url)) + with urllib.request.urlopen(self.url) as f: + self.data = json.load(f) class ExodusSignatureDataController(SignatureDataController): def __init__(self): - super().__init__('Exodus signatures', 'exodus.yml') + super().__init__('Exodus signatures', 'exodus.yml', 'https://reports.exodus-privacy.eu.org/api/trackers') self.cache_outdated_interval = timedelta(days=1) # refresh exodus cache after one day def fetch_signatures_from_web(self): - exodus_url = "https://reports.exodus-privacy.eu.org/api/trackers" + logging.debug(_("downloading '{}'").format(self.url)) + self.data = { "signatures": {}, "timestamp": scanner._datetime_now().isoformat(), "version": SCANNER_CACHE_VERSION, } - with urllib.request.urlopen(exodus_url) as f: + with urllib.request.urlopen(self.url) as f: d = json.load(f) for tracker in d["trackers"].values(): if tracker.get('code_signature'): @@ -261,21 +268,26 @@ class ExodusSignatureDataController(SignatureDataController): # "network_signatures": [tracker["network_signature"]], "AntiFeatures": ["Tracking"], "license": "NonFree" # We assume all trackers in exodus - # are non-free, alought free + # are non-free, although free # trackers like piwik, acra, # etc. might be listed by exodus # too. } -class SUSSDataController(SignatureDataController): - def __init__(self): - super().__init__('SUSS', 'suss.json') - - class ScannerTool(): def __init__(self): - self.sdcs = [SUSSDataController()] + self.sdcs = [ + SignatureDataController( + 'SUSS', + 'suss.json', + 'https://fdroid.gitlab.io/fdroid-suss/suss.json' + ), + ] + + # we could add support for loading additional signature source + # definitions from config.yml here + self.load() self.compile_regexes() @@ -301,11 +313,9 @@ class ScannerTool(): for sig in sigdef.get('warn_gradle_signatures', []): self.regexs['warn_gradle_signatures'][sig] = re.compile('.*' + sig, re.IGNORECASE) - def clear_cache(self): - # delete cache folder and all its contents - shutil.rmtree(scanner._scanner_cachedir(), ignore_errors=True) - # re-initialize, this will re-populate the cache from default values - self.__init__() + def refresh(self): + for sdc in self.sdcs: + sdc.fetch_signatures_from_web() def add(self, new_controller: SignatureDataController): self.sdcs.append(new_controller) @@ -660,8 +670,8 @@ def main(): help=_("Force scan of disabled apps and builds.")) parser.add_argument("--json", action="store_true", default=False, help=_("Output JSON to stdout.")) - parser.add_argument("--clear-cache", action="store_true", default=False, - help=_("purge local scanner definitions cache")) + parser.add_argument("--refresh", "-r", action="store_true", default=False, + help=_("fetach the latest version of signatures from the web")) metadata.add_metadata_arguments(parser) options = parser.parse_args() metadata.warnings_action = options.W @@ -676,11 +686,14 @@ def main(): # initialize/load configuration values common.get_config(options) - if options.clear_cache: - scanner._get_tool().clear_cache() + if options.refresh: + scanner._get_tool().refresh() if options.exodus: c = ExodusSignatureDataController() - c.fetch() + if options.refresh: + c.fetch_signatures_from_web() + else: + c.fetch() scanner._get_tool().add(c) probcount = 0 diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 1e21e7b5..65b70b60 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -4,7 +4,6 @@ import glob import inspect import logging import optparse -import io import os import re import shutil @@ -500,56 +499,56 @@ class Test_scan_binary(unittest.TestCase): class Test_SignatureDataController(unittest.TestCase): # __init__ def test_init(self): - sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') + sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') self.assertEqual(sdc.name, 'nnn') self.assertEqual(sdc.filename, 'fff.yml') - self.assertEqual(sdc.cache_outdated_interval, None) + self.assertEqual(sdc.cache_outdated_interval, timedelta(999999)) self.assertDictEqual(sdc.data, {}) # check_last_updated def test_check_last_updated_ok(self): - sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') + sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') sdc.data['timestamp'] = datetime.now().astimezone().isoformat() sdc.check_last_updated() def test_check_last_updated_exception_cache_outdated(self): - sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') + sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') sdc.cache_outdated_interval = timedelta(days=7) sdc.data['timestamp'] = (datetime.now().astimezone() - timedelta(days=30)).isoformat() with self.assertRaises(fdroidserver.scanner.SignatureDataOutdatedException): sdc.check_last_updated() def test_check_last_updated_exception_missing_timestamp_value(self): - sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') + sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') with self.assertRaises(fdroidserver.scanner.SignatureDataMalformedException): sdc.check_last_updated() def test_check_last_updated_exception_not_string(self): - sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') + sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') sdc.data['timestamp'] = 12345 with self.assertRaises(fdroidserver.scanner.SignatureDataMalformedException): sdc.check_last_updated() def test_check_last_updated_exception_not_iso_formatted_string(self): - sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') + sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') sdc.data['timestamp'] = '01/09/2002 10:11' with self.assertRaises(fdroidserver.scanner.SignatureDataMalformedException): sdc.check_last_updated() # check_data_version def test_check_data_version_ok(self): - sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') + sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') sdc.data['version'] = fdroidserver.scanner.SCANNER_CACHE_VERSION sdc.check_data_version() def test_check_data_version_exception(self): - sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') + sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') with self.assertRaises(fdroidserver.scanner.SignatureDataVersionMismatchException): sdc.check_data_version() def test_write_to_cache(self): open_func = mock.mock_open() - sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml') + sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') sdc.data = {"mocked": "data"} with mock.patch("builtins.open", open_func), mock.patch( @@ -565,28 +564,6 @@ class Test_SignatureDataController(unittest.TestCase): ) -class Test_SUSSDataController_fetch_signatures_from_web(unittest.TestCase): - def setUp(self): - self.uo_func = mock.Mock(return_value=io.StringIO(textwrap.dedent('''\ - version: 999 - timestamp: "1999-12-31T23:59:59.999999+00:00" - signatures: - - binary_signature: com/google/firebase - name: Google Firebase - types: - - tracker - - non-free - - gradle_signature: com/google/android/gms - name: Google Mobile Services - types: - - non-free - - network_signature: doubleclick\\.net - name: Another thing to test. - types: - - ads - '''))) - - class Test_main(unittest.TestCase): def setUp(self): self.args = ["com.example.app", "local/additional.apk", "another.apk"] @@ -654,7 +631,6 @@ if __name__ == "__main__": unittest.makeSuite(ScannerTest), unittest.makeSuite(Test_scan_binary), unittest.makeSuite(Test_SignatureDataController), - unittest.makeSuite(Test_SUSSDataController_fetch_signatures_from_web), unittest.makeSuite(Test_main), ]) unittest.main(failfast=False) From a8bcaa3d7081a7fb63f04564ac346c317f67d933 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Fri, 30 Sep 2022 04:44:14 +0200 Subject: [PATCH 0816/2116] scanner: implement caching rules for suss --- fdroidserver/build.py | 2 +- fdroidserver/common.py | 13 ++++-- fdroidserver/scanner.py | 99 ++++++++++++++++++++++++----------------- tests/scanner.TestCase | 21 +++++---- 4 files changed, 78 insertions(+), 57 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 32b3306f..ca37a4bb 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -987,7 +987,7 @@ def main(): if not options.appid and not options.all: parser.error("option %s: If you really want to build all the apps, use --all" % "all") - config = common.read_config(options) + config = common.read_config(opts=options) if config['build_server_always']: options.server = True diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 7e6bed29..7793c51f 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -324,19 +324,26 @@ def fill_config_defaults(thisconfig): thisconfig['gradle_version_dir'] = str(Path(thisconfig['cachedir']) / 'gradle') -def get_config(options=None): +def get_config(opts=None): """ helper function for getting access to commons.config while safely initializing if it wasn't initialized yet. """ - global config + global config, options if config is not None: return config config = {} common.fill_config_defaults(config) - common.read_config(options) + common.read_config(opts=opts) + + # make sure these values are available in common.py even if they didn't + # declare global in a scope + common.config = config + if opts is not None: + common.options = opts + return config diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 9fc5fcb2..e0852eea 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -141,6 +141,10 @@ class SignatureDataOutdatedException(Exception): pass +class SignatureDataCacheMissException(Exception): + pass + + class SignatureDataVersionMismatchException(Exception): pass @@ -151,7 +155,7 @@ class SignatureDataController: self.filename = filename self.url = url # by default we assume cache is valid indefinitely - self.cache_outdated_interval = timedelta(days=999999) + self.cache_duration = timedelta(days=999999) self.data = {} def check_data_version(self): @@ -162,63 +166,65 @@ class SignatureDataController: ''' NOTE: currently not in use - Checks if the timestamp value is ok. Raises an exception if something - is not ok. + Checks if the last_updated value is ok. Raises an exception if + it's expired or inaccessible. :raises SignatureDataMalformedException: when timestamp value is inaccessible or not parse-able :raises SignatureDataOutdatedException: when timestamp is older then - `self.cache_outdated_interval` + `self.cache_duration` ''' - timestamp = self.data.get("timestamp") - if not timestamp: - raise SignatureDataMalformedException() - try: - timestamp = datetime.fromisoformat(timestamp) - except ValueError as e: - raise SignatureDataMalformedException() from e - except TypeError as e: - raise SignatureDataMalformedException() from e - if (timestamp + self.cache_outdated_interval) < scanner._datetime_now(): - raise SignatureDataOutdatedException() + last_updated = self.data.get("last_updated", None) + if last_updated: + try: + last_updated = datetime.fromisoformat(last_updated) + except ValueError as e: + raise SignatureDataMalformedException() from e + except TypeError as e: + raise SignatureDataMalformedException() from e + delta = (last_updated + self.cache_duration) - scanner._datetime_now() + if delta > timedelta(seconds=0): + logging.debug(_('next {name} cache update due in {time}').format( + name=self.filename, time=delta + )) + else: + raise SignatureDataOutdatedException() def fetch(self): try: - self.load_from_cache() - self.verify_data() - self.check_last_updated() - except ( - SignatureDataMalformedException, - SignatureDataVersionMismatchException, - SignatureDataOutdatedException - ): - try: - self.fetch_signatures_from_web() - except AttributeError: - # just load from defaults if fetch_signatures_from_web is not - # implemented - self.load_from_defaults() + self.fetch_signatures_from_web() self.write_to_cache() + except Exception as e: + raise Exception(_("downloading scanner signatures from '{}' failed").format(self.url)) from e def load(self): try: - self.load_from_cache() - self.verify_data() - except (SignatureDataMalformedException, SignatureDataVersionMismatchException): - self.load_from_defaults() + try: + self.load_from_cache() + self.verify_data() + self.check_last_updated() + except SignatureDataCacheMissException: + self.load_from_defaults() + except SignatureDataOutdatedException: + self.fetch_signatures_from_web() self.write_to_cache() + except (SignatureDataMalformedException, SignatureDataVersionMismatchException) as e: + logging.critical(_("scanner cache is malformed! You can clear it with: '{clear}'").format( + clear='rm -r {}'.format(common.get_config()['cachedir_scanner']) + )) + raise e def load_from_defaults(self): sig_file = (Path(__file__).parent / 'data' / 'scanner' / self.filename).resolve() with open(sig_file) as f: - self.data = json.load(f) + self.set_data(json.load(f)) def load_from_cache(self): sig_file = scanner._scanner_cachedir() / self.filename if not sig_file.exists(): - raise SignatureDataMalformedException() + raise SignatureDataCacheMissException() with open(sig_file) as f: - self.data = json.load(f) + self.set_data(json.load(f)) def write_to_cache(self): sig_file = scanner._scanner_cachedir() / self.filename @@ -231,29 +237,36 @@ class SignatureDataController: cleans and validates and cleans `self.data` ''' self.check_data_version() - valid_keys = ['timestamp', 'version', 'signatures'] + valid_keys = ['timestamp', 'last_updated', 'version', 'signatures', 'cache_duration'] for k in list(self.data.keys()): if k not in valid_keys: del self.data[k] + def set_data(self, new_data): + self.data = new_data + if 'cache_duration' in new_data: + self.cache_duration = timedelta(seconds=new_data['cache_duration']) + def fetch_signatures_from_web(self): logging.debug(_("downloading '{}'").format(self.url)) with urllib.request.urlopen(self.url) as f: - self.data = json.load(f) + self.set_data(json.load(f)) + self.data['last_updated'] = scanner._datetime_now().isoformat() class ExodusSignatureDataController(SignatureDataController): def __init__(self): super().__init__('Exodus signatures', 'exodus.yml', 'https://reports.exodus-privacy.eu.org/api/trackers') - self.cache_outdated_interval = timedelta(days=1) # refresh exodus cache after one day + self.cache_duration = timedelta(days=1) # refresh exodus cache after one day def fetch_signatures_from_web(self): logging.debug(_("downloading '{}'").format(self.url)) - self.data = { + data = { "signatures": {}, "timestamp": scanner._datetime_now().isoformat(), + "last_updated": scanner._datetime_now().isoformat(), "version": SCANNER_CACHE_VERSION, } @@ -261,7 +274,7 @@ class ExodusSignatureDataController(SignatureDataController): d = json.load(f) for tracker in d["trackers"].values(): if tracker.get('code_signature'): - self.data["signatures"][tracker["name"]] = { + data["signatures"][tracker["name"]] = { "name": tracker["name"], "warn_code_signatures": [tracker["code_signature"]], # exodus also provides network signatures, unused atm. @@ -273,6 +286,7 @@ class ExodusSignatureDataController(SignatureDataController): # etc. might be listed by exodus # too. } + self.set_data(data) class ScannerTool(): @@ -316,6 +330,7 @@ class ScannerTool(): def refresh(self): for sdc in self.sdcs: sdc.fetch_signatures_from_web() + sdc.write_to_cache() def add(self, new_controller: SignatureDataController): self.sdcs.append(new_controller) @@ -684,7 +699,7 @@ def main(): logging.getLogger().setLevel(logging.ERROR) # initialize/load configuration values - common.get_config(options) + common.get_config(opts=options) if options.refresh: scanner._get_tool().refresh() diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 65b70b60..32274396 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -502,39 +502,38 @@ class Test_SignatureDataController(unittest.TestCase): sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') self.assertEqual(sdc.name, 'nnn') self.assertEqual(sdc.filename, 'fff.yml') - self.assertEqual(sdc.cache_outdated_interval, timedelta(999999)) + self.assertEqual(sdc.cache_duration, timedelta(999999)) self.assertDictEqual(sdc.data, {}) # check_last_updated def test_check_last_updated_ok(self): sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') - sdc.data['timestamp'] = datetime.now().astimezone().isoformat() + sdc.data['last_updated'] = datetime.now().astimezone().isoformat() sdc.check_last_updated() def test_check_last_updated_exception_cache_outdated(self): sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') - sdc.cache_outdated_interval = timedelta(days=7) - sdc.data['timestamp'] = (datetime.now().astimezone() - timedelta(days=30)).isoformat() + sdc.cache_duration = timedelta(days=7) + sdc.data['last_updated'] = (datetime.now().astimezone() - timedelta(days=30)).isoformat() with self.assertRaises(fdroidserver.scanner.SignatureDataOutdatedException): sdc.check_last_updated() - def test_check_last_updated_exception_missing_timestamp_value(self): - sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') - with self.assertRaises(fdroidserver.scanner.SignatureDataMalformedException): - sdc.check_last_updated() - def test_check_last_updated_exception_not_string(self): sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') - sdc.data['timestamp'] = 12345 + sdc.data['last_updated'] = 12345 with self.assertRaises(fdroidserver.scanner.SignatureDataMalformedException): sdc.check_last_updated() def test_check_last_updated_exception_not_iso_formatted_string(self): sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') - sdc.data['timestamp'] = '01/09/2002 10:11' + sdc.data['last_updated'] = '01/09/2002 10:11' with self.assertRaises(fdroidserver.scanner.SignatureDataMalformedException): sdc.check_last_updated() + def test_check_last_updated_no_exception_missing_when_last_updated_not_set(self): + sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') + sdc.check_last_updated() + # check_data_version def test_check_data_version_ok(self): sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') From 6899c22f48d0003379c47f2f2424787e7f7abbfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Fri, 30 Sep 2022 05:32:18 +0200 Subject: [PATCH 0817/2116] scanner: remove allowlisted from scan_source --- fdroidserver/scanner.py | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index e0852eea..dd6272d0 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -383,20 +383,9 @@ def scan_source(build_dir, build=metadata.Build()): """ count = 0 - allowlisted = [ - 'firebase-jobdispatcher', # https://github.com/firebase/firebase-jobdispatcher-android/blob/master/LICENSE - 'com.firebaseui', # https://github.com/firebase/FirebaseUI-Android/blob/master/LICENSE - 'geofire-android', # https://github.com/firebase/geofire-java/blob/master/LICENSE - 'com.yandex.android:authsdk', # https://github.com/yandexmobile/yandex-login-sdk-android/blob/master/LICENSE.txt - 'com.hypertrack:hyperlog', # https://github.com/hypertrack/hyperlog-android#license - ] - - def is_allowlisted(s): - return any(al in s for al in allowlisted) - def suspects_found(s): for n, r in _get_tool().regexs['err_gradle_signatures'].items(): - if r.match(s) and not is_allowlisted(s): + if r.match(s): yield n allowed_repos = [re.compile(r'^https://' + re.escape(repo) + r'/*') for repo in [ From 0921863fa6dd791b2806a75f50c18976fad4ba97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Fri, 30 Sep 2022 05:36:36 +0200 Subject: [PATCH 0818/2116] scanner: update suss defaults after removal of allowlisted feature --- fdroidserver/data/scanner/suss.json | 15 +++++++++------ tests/scanner.TestCase | 4 ++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/fdroidserver/data/scanner/suss.json b/fdroidserver/data/scanner/suss.json index f2479f22..bc58db2a 100644 --- a/fdroidserver/data/scanner/suss.json +++ b/fdroidserver/data/scanner/suss.json @@ -1,4 +1,5 @@ { + "cache_duration": 86400, "signatures": { "admob": { "gradle_signatures": [ @@ -137,13 +138,14 @@ }, "com.hypertrack": { "gradle_signatures": [ - "com.hypertrack" + "com\\.hypertrack(?!:hyperlog)" ], "license": "NonFree" }, "com.mapbox": { + "MaintainerNotes": "com.mapbox.mapboxsdk:mapbox-sdk-services seems to be fully under this license:\nhttps://github.com/mapbox/mapbox-java/blob/main/LICENSE\n", "gradle_signatures": [ - "com.mapbox" + "com\\.mapbox(?!\\.mapboxsdk:mapbox-sdk-services)" ], "license": "NonFree" }, @@ -167,7 +169,7 @@ }, "com.yandex.android": { "gradle_signatures": [ - "com.yandex.android" + "com\\.yandex\\.android(?!:authsdk)" ], "license": "NonFree" }, @@ -191,7 +193,7 @@ }, "firebase": { "gradle_signatures": [ - "firebase" + "com(\\.google)?\\.firebase[.:](?!firebase-jobdispatcher|geofire-java)" ], "license": "NonFree" }, @@ -286,6 +288,7 @@ "license": "NonFree" } }, - "timestamp": "2022-09-22T13:16:29.313769+00:00", - "version": 1 + "timestamp": "2022-09-29T19:35:04.875586+00:00", + "version": 1, + "last_updated": "2022-09-30T05:13:18.411707+02:00" } \ No newline at end of file diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 32274396..c3c70ffe 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -54,8 +54,8 @@ class ScannerTest(unittest.TestCase): 'com.integreight.onesheeld': 11, 'com.jens.automation2': 2, 'firebase-suspect': 1, - 'org.mozilla.rocket': 3, - 'org.tasks': 3, + 'org.mozilla.rocket': 1, + 'org.tasks': 2, 'realm': 1, 'se.manyver': 2, } From 036b788424474e9d65bcb2da50b1f7147d3823a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Fri, 30 Sep 2022 06:56:26 +0200 Subject: [PATCH 0819/2116] move suss defaults into scanner.py As discussed with _hc, we're going to keep the default values for SUSS inside the python code for now. To avoid compilcated packaging issues. Once fdroidserver does not have to support python verison older than 3.7 we can utilize to `importlib.resources` for shipping these defaults as separate file. --- fdroidserver/data/scanner/suss.json | 294 -------------------------- fdroidserver/scanner.py | 314 +++++++++++++++++++++++++++- 2 files changed, 309 insertions(+), 299 deletions(-) delete mode 100644 fdroidserver/data/scanner/suss.json diff --git a/fdroidserver/data/scanner/suss.json b/fdroidserver/data/scanner/suss.json deleted file mode 100644 index bc58db2a..00000000 --- a/fdroidserver/data/scanner/suss.json +++ /dev/null @@ -1,294 +0,0 @@ -{ - "cache_duration": 86400, - "signatures": { - "admob": { - "gradle_signatures": [ - "admob.*sdk.*android" - ], - "license": "NonFree" - }, - "androidx": { - "gradle_signatures": [ - "androidx.navigation:navigation-dynamic-features", - "androidx.work:work-gcm" - ], - "license": "NonFree" - }, - "appcenter-push": { - "gradle_signatures": [ - "appcenter-push" - ], - "license": "NonFree" - }, - "bugsense": { - "gradle_signatures": [ - "bugsense" - ], - "license": "NonFree" - }, - "cloudrail": { - "gradle_signatures": [ - "cloudrail" - ], - "license": "NonFree" - }, - "com.android.billing": { - "code_signatures": [ - "com/android/billing" - ], - "license": "NonFree" - }, - "com.android.billingclient": { - "gradle_signatures": [ - "com.android.billingclient" - ], - "license": "NonFree" - }, - "com.anjlab.android.iab.v3": { - "gradle_signatures": [ - "com.anjlab.android.iab.v3:library" - ], - "license": "NonFree" - }, - "com.cloudinary": { - "gradle_signatures": [ - "com.cloudinary:cloudinary-android" - ], - "license": "NonFree" - }, - "com.evernote": { - "gradle_signatures": [ - "com.evernote:android-job" - ], - "license": "NonFree" - }, - "com.facebook": { - "gradle_signatures": [ - "[\"']com.facebook.android['\":]" - ], - "license": "NonFree" - }, - "com.github.junrar": { - "gradle_signatures": [ - "com.github.junrar:junrar" - ], - "license": "NonFree" - }, - "com.github.penn5": { - "gradle_signatures": [ - "com.github.penn5:donations" - ], - "license": "NonFree" - }, - "com.google.analytics": { - "code_signatures": [ - "com/google/analytics" - ], - "license": "NonFree" - }, - "com.google.android.exoplayer": { - "gradle_signatures": [ - "com.google.android.exoplayer:extension-cast", - "com.google.android.exoplayer:extension-cronet" - ], - "license": "NonFree" - }, - "com.google.android.gms": { - "code_signatures": [ - "com/google/android/gms" - ], - "license": "NonFree" - }, - "com.google.android.libraries.places": { - "gradle_signatures": [ - "com.google.android.libraries.places:places" - ], - "license": "NonFree" - }, - "com.google.android.play": { - "gradle_signatures": [ - "com.google.android.play:app-update", - "com.google.android.play:core.*" - ], - "license": "NonFree" - }, - "com.google.android.play.core": { - "code_signatures": [ - "com/google/android/play/core" - ], - "license": "NonFree" - }, - "com.google.firebase": { - "code_signatures": [ - "com/google/firebase" - ], - "license": "NonFree" - }, - "com.google.mlkit": { - "gradle_signatures": [ - "com.google.mlkit" - ], - "license": "NonFree" - }, - "com.google.tagmanager": { - "code_signatures": [ - "com/google/tagmanager" - ], - "license": "NonFree" - }, - "com.hypertrack": { - "gradle_signatures": [ - "com\\.hypertrack(?!:hyperlog)" - ], - "license": "NonFree" - }, - "com.mapbox": { - "MaintainerNotes": "com.mapbox.mapboxsdk:mapbox-sdk-services seems to be fully under this license:\nhttps://github.com/mapbox/mapbox-java/blob/main/LICENSE\n", - "gradle_signatures": [ - "com\\.mapbox(?!\\.mapboxsdk:mapbox-sdk-services)" - ], - "license": "NonFree" - }, - "com.onesignal": { - "gradle_signatures": [ - "com.onesignal:OneSignal" - ], - "license": "NonFree" - }, - "com.tencent.bugly": { - "gradle_signatures": [ - "com.tencent.bugly" - ], - "license": "NonFree" - }, - "com.umeng.umsdk": { - "gradle_signatures": [ - "com.umeng.umsdk" - ], - "license": "NonFree" - }, - "com.yandex.android": { - "gradle_signatures": [ - "com\\.yandex\\.android(?!:authsdk)" - ], - "license": "NonFree" - }, - "com.yayandroid": { - "gradle_signatures": [ - "com.yayandroid:LocationManager" - ], - "license": "NonFree" - }, - "crashlytics": { - "gradle_signatures": [ - "crashlytics" - ], - "license": "NonFree" - }, - "crittercism": { - "gradle_signatures": [ - "crittercism" - ], - "license": "NonFree" - }, - "firebase": { - "gradle_signatures": [ - "com(\\.google)?\\.firebase[.:](?!firebase-jobdispatcher|geofire-java)" - ], - "license": "NonFree" - }, - "flurryagent": { - "gradle_signatures": [ - "flurryagent" - ], - "license": "NonFree" - }, - "google-ad": { - "gradle_signatures": [ - "google.*ad.*view" - ], - "license": "NonFree" - }, - "google.admob": { - "gradle_signatures": [ - "google.*admob" - ], - "license": "NonFree" - }, - "google.play.services": { - "gradle_signatures": [ - "google.*play.*services" - ], - "license": "NonFree" - }, - "heyzap": { - "gradle_signatures": [ - "heyzap" - ], - "license": "NonFree" - }, - "io.github.sinaweibosdk": { - "gradle_signatures": [ - "io.github.sinaweibosdk" - ], - "license": "NonFree" - }, - "io.objectbox": { - "gradle_signatures": [ - "io.objectbox:objectbox-gradle-plugin" - ], - "license": "NonFree" - }, - "jpct": { - "gradle_signatures": [ - "jpct.*ae" - ], - "license": "NonFree" - }, - "libspen23": { - "gradle_signatures": [ - "libspen23" - ], - "license": "NonFree" - }, - "me.pushy": { - "gradle_signatures": [ - "me.pushy:sdk" - ], - "license": "NonFree" - }, - "org.jetbrains.kotlinx": { - "gradle_signatures": [ - "org.jetbrains.kotlinx:kotlinx-coroutines-play-services" - ], - "license": "NonFree" - }, - "ouya": { - "gradle_signatures": [ - "ouya.*sdk" - ], - "license": "NonFree" - }, - "paypal": { - "gradle_signatures": [ - "paypal.*mpl" - ], - "license": "NonFree" - }, - "xyz.belvi.mobilevision": { - "gradle_signatures": [ - "xyz.belvi.mobilevision:barcodescanner" - ], - "license": "NonFree" - }, - "youtube": { - "gradle_signatures": [ - "youtube.*android.*player.*api" - ], - "license": "NonFree" - } - }, - "timestamp": "2022-09-29T19:35:04.875586+00:00", - "version": 1, - "last_updated": "2022-09-30T05:13:18.411707+02:00" -} \ No newline at end of file diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index dd6272d0..0fe97cb4 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -289,14 +289,22 @@ class ExodusSignatureDataController(SignatureDataController): self.set_data(data) +class SUSSDataController(SignatureDataController): + def __init__(self): + super().__init__( + 'SUSS', + 'suss.json', + 'https://fdroid.gitlab.io/fdroid-suss/suss.json' + ) + + def load_from_defaults(self): + self.set_data(json.loads(SUSS_DEFAULT)) + + class ScannerTool(): def __init__(self): self.sdcs = [ - SignatureDataController( - 'SUSS', - 'suss.json', - 'https://fdroid.gitlab.io/fdroid-suss/suss.json' - ), + SUSSDataController(), ] # we could add support for loading additional signature source @@ -809,3 +817,299 @@ def main(): if __name__ == "__main__": main() + + +SUSS_DEFAULT = '''{ + "cache_duration": 86400, + "signatures": { + "admob": { + "gradle_signatures": [ + "admob.*sdk.*android" + ], + "license": "NonFree" + }, + "androidx": { + "gradle_signatures": [ + "androidx.navigation:navigation-dynamic-features", + "androidx.work:work-gcm" + ], + "license": "NonFree" + }, + "appcenter-push": { + "gradle_signatures": [ + "appcenter-push" + ], + "license": "NonFree" + }, + "bugsense": { + "gradle_signatures": [ + "bugsense" + ], + "license": "NonFree" + }, + "cloudrail": { + "gradle_signatures": [ + "cloudrail" + ], + "license": "NonFree" + }, + "com.android.billing": { + "code_signatures": [ + "com/android/billing" + ], + "license": "NonFree" + }, + "com.android.billingclient": { + "gradle_signatures": [ + "com.android.billingclient" + ], + "license": "NonFree" + }, + "com.anjlab.android.iab.v3": { + "gradle_signatures": [ + "com.anjlab.android.iab.v3:library" + ], + "license": "NonFree" + }, + "com.cloudinary": { + "gradle_signatures": [ + "com.cloudinary:cloudinary-android" + ], + "license": "NonFree" + }, + "com.evernote": { + "gradle_signatures": [ + "com.evernote:android-job" + ], + "license": "NonFree" + }, + "com.facebook": { + "gradle_signatures": [ + "[\\"']com.facebook.android['\\":]" + ], + "license": "NonFree" + }, + "com.github.junrar": { + "gradle_signatures": [ + "com.github.junrar:junrar" + ], + "license": "NonFree" + }, + "com.github.penn5": { + "gradle_signatures": [ + "com.github.penn5:donations" + ], + "license": "NonFree" + }, + "com.google.analytics": { + "code_signatures": [ + "com/google/analytics" + ], + "license": "NonFree" + }, + "com.google.android.exoplayer": { + "gradle_signatures": [ + "com.google.android.exoplayer:extension-cast", + "com.google.android.exoplayer:extension-cronet" + ], + "license": "NonFree" + }, + "com.google.android.gms": { + "code_signatures": [ + "com/google/android/gms" + ], + "license": "NonFree" + }, + "com.google.android.libraries.places": { + "gradle_signatures": [ + "com.google.android.libraries.places:places" + ], + "license": "NonFree" + }, + "com.google.android.play": { + "gradle_signatures": [ + "com.google.android.play:app-update", + "com.google.android.play:core.*" + ], + "license": "NonFree" + }, + "com.google.android.play.core": { + "code_signatures": [ + "com/google/android/play/core" + ], + "license": "NonFree" + }, + "com.google.firebase": { + "code_signatures": [ + "com/google/firebase" + ], + "license": "NonFree" + }, + "com.google.mlkit": { + "gradle_signatures": [ + "com.google.mlkit" + ], + "license": "NonFree" + }, + "com.google.tagmanager": { + "code_signatures": [ + "com/google/tagmanager" + ], + "license": "NonFree" + }, + "com.hypertrack": { + "gradle_signatures": [ + "com\\\\.hypertrack(?!:hyperlog)" + ], + "license": "NonFree" + }, + "com.mapbox": { + "MaintainerNotes": "com.mapbox.mapboxsdk:mapbox-sdk-services seems to be fully under this license:\\nhttps://github.com/mapbox/mapbox-java/blob/main/LICENSE\\n", + "gradle_signatures": [ + "com\\\\.mapbox(?!\\\\.mapboxsdk:mapbox-sdk-services)" + ], + "license": "NonFree" + }, + "com.onesignal": { + "gradle_signatures": [ + "com.onesignal:OneSignal" + ], + "license": "NonFree" + }, + "com.tencent.bugly": { + "gradle_signatures": [ + "com.tencent.bugly" + ], + "license": "NonFree" + }, + "com.umeng.umsdk": { + "gradle_signatures": [ + "com.umeng.umsdk" + ], + "license": "NonFree" + }, + "com.yandex.android": { + "gradle_signatures": [ + "com\\\\.yandex\\\\.android(?!:authsdk)" + ], + "license": "NonFree" + }, + "com.yayandroid": { + "gradle_signatures": [ + "com.yayandroid:LocationManager" + ], + "license": "NonFree" + }, + "crashlytics": { + "gradle_signatures": [ + "crashlytics" + ], + "license": "NonFree" + }, + "crittercism": { + "gradle_signatures": [ + "crittercism" + ], + "license": "NonFree" + }, + "firebase": { + "gradle_signatures": [ + "com(\\\\.google)?\\\\.firebase[.:](?!firebase-jobdispatcher|geofire-java)" + ], + "license": "NonFree" + }, + "flurryagent": { + "gradle_signatures": [ + "flurryagent" + ], + "license": "NonFree" + }, + "google-ad": { + "gradle_signatures": [ + "google.*ad.*view" + ], + "license": "NonFree" + }, + "google.admob": { + "gradle_signatures": [ + "google.*admob" + ], + "license": "NonFree" + }, + "google.play.services": { + "gradle_signatures": [ + "google.*play.*services" + ], + "license": "NonFree" + }, + "heyzap": { + "gradle_signatures": [ + "heyzap" + ], + "license": "NonFree" + }, + "io.github.sinaweibosdk": { + "gradle_signatures": [ + "io.github.sinaweibosdk" + ], + "license": "NonFree" + }, + "io.objectbox": { + "gradle_signatures": [ + "io.objectbox:objectbox-gradle-plugin" + ], + "license": "NonFree" + }, + "jpct": { + "gradle_signatures": [ + "jpct.*ae" + ], + "license": "NonFree" + }, + "libspen23": { + "gradle_signatures": [ + "libspen23" + ], + "license": "NonFree" + }, + "me.pushy": { + "gradle_signatures": [ + "me.pushy:sdk" + ], + "license": "NonFree" + }, + "org.jetbrains.kotlinx": { + "gradle_signatures": [ + "org.jetbrains.kotlinx:kotlinx-coroutines-play-services" + ], + "license": "NonFree" + }, + "ouya": { + "gradle_signatures": [ + "ouya.*sdk" + ], + "license": "NonFree" + }, + "paypal": { + "gradle_signatures": [ + "paypal.*mpl" + ], + "license": "NonFree" + }, + "xyz.belvi.mobilevision": { + "gradle_signatures": [ + "xyz.belvi.mobilevision:barcodescanner" + ], + "license": "NonFree" + }, + "youtube": { + "gradle_signatures": [ + "youtube.*android.*player.*api" + ], + "license": "NonFree" + } + }, + "timestamp": "2022-09-29T19:35:04.875586+00:00", + "version": 1, + "last_updated": "2022-09-30T05:13:18.411707+02:00" +}''' From 7933623e9372efb38ec423d4e387bf0f445d7368 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Fri, 30 Sep 2022 06:08:00 +0200 Subject: [PATCH 0820/2116] fix pydocstyle lint errors --- fdroidserver/common.py | 5 +---- fdroidserver/scanner.py | 31 +++++++++++++------------------ 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 7793c51f..0f001019 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -325,10 +325,7 @@ def fill_config_defaults(thisconfig): def get_config(opts=None): - """ - helper function for getting access to commons.config while safely - initializing if it wasn't initialized yet. - """ + """Get config instace. This function takes care of initaling config data before returning it.""" global config, options if config is not None: diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 0fe97cb4..81f4ce70 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -113,16 +113,12 @@ def get_embedded_classes(apkfile, depth=0): def _datetime_now(): - """ - simple wrapper for datetime.now to allow mocking it for testing - """ + """Get datetime.now(), using this funciton allows mocking it for testing.""" return datetime.now().astimezone() def _scanner_cachedir(): - """ - get `Path` to local cache dir - """ + """Get `Path` to fdroidserver cache dir.""" cfg = common.get_config() if not cfg: raise ConfigurationException('config not initialized') @@ -163,17 +159,14 @@ class SignatureDataController: raise SignatureDataVersionMismatchException() def check_last_updated(self): - ''' - NOTE: currently not in use - - Checks if the last_updated value is ok. Raises an exception if - it's expired or inaccessible. + """ + Check if the last_updated value is ok and raise an exception if expired or inaccessible. :raises SignatureDataMalformedException: when timestamp value is inaccessible or not parse-able :raises SignatureDataOutdatedException: when timestamp is older then `self.cache_duration` - ''' + """ last_updated = self.data.get("last_updated", None) if last_updated: try: @@ -233,9 +226,11 @@ class SignatureDataController: logging.debug("write '{}' to cache".format(self.filename)) def verify_data(self): - ''' - cleans and validates and cleans `self.data` - ''' + """ + Clean and validate `self.data`. + + Right now this function does just a basic key sanitation. + """ self.check_data_version() valid_keys = ['timestamp', 'last_updated', 'version', 'signatures', 'cache_duration'] @@ -351,11 +346,11 @@ _SCANNER_TOOL = None def _get_tool(): - ''' - lazy loading factory for ScannerTool singleton + """ + Lazy loading function for getting a ScannerTool instance. ScannerTool initialization need to access `common.config` values. Those are only available after initialization through `common.read_config()` So this factory assumes config was called at an erlier point in time - ''' + """ if not scanner._SCANNER_TOOL: scanner._SCANNER_TOOL = ScannerTool() return scanner._SCANNER_TOOL From 9560ed955c0d07d1e56588c8d373e29a13591bbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Fri, 30 Sep 2022 11:13:59 +0200 Subject: [PATCH 0821/2116] avoid running into native-date object issue Seem I ran into this issue: https://bugs.python.org/issue47228 This change tries to fix it by using utcnow insteas of astimezone. --- fdroidserver/scanner.py | 2 +- tests/scanner.TestCase | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 81f4ce70..797d694e 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -114,7 +114,7 @@ def get_embedded_classes(apkfile, depth=0): def _datetime_now(): """Get datetime.now(), using this funciton allows mocking it for testing.""" - return datetime.now().astimezone() + return datetime.utcnow() def _scanner_cachedir(): diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index c3c70ffe..a5ad3779 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -508,13 +508,13 @@ class Test_SignatureDataController(unittest.TestCase): # check_last_updated def test_check_last_updated_ok(self): sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') - sdc.data['last_updated'] = datetime.now().astimezone().isoformat() + sdc.data['last_updated'] = datetime.utcnow().isoformat() sdc.check_last_updated() def test_check_last_updated_exception_cache_outdated(self): sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') sdc.cache_duration = timedelta(days=7) - sdc.data['last_updated'] = (datetime.now().astimezone() - timedelta(days=30)).isoformat() + sdc.data['last_updated'] = (datetime.utcnow() - timedelta(days=30)).isoformat() with self.assertRaises(fdroidserver.scanner.SignatureDataOutdatedException): sdc.check_last_updated() From 59b1899d7957b1f0c7a7425a3d34934524f9898b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Fri, 30 Sep 2022 14:18:31 +0200 Subject: [PATCH 0822/2116] scanner: switch form iso8601 to unix timestamp for python3.5 support --- fdroidserver/scanner.py | 12 ++++++------ tests/scanner.TestCase | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 797d694e..8eb94a8c 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -170,7 +170,7 @@ class SignatureDataController: last_updated = self.data.get("last_updated", None) if last_updated: try: - last_updated = datetime.fromisoformat(last_updated) + last_updated = datetime.fromtimestamp(last_updated) except ValueError as e: raise SignatureDataMalformedException() from e except TypeError as e: @@ -247,7 +247,7 @@ class SignatureDataController: logging.debug(_("downloading '{}'").format(self.url)) with urllib.request.urlopen(self.url) as f: self.set_data(json.load(f)) - self.data['last_updated'] = scanner._datetime_now().isoformat() + self.data['last_updated'] = scanner._datetime_now().timestamp() class ExodusSignatureDataController(SignatureDataController): @@ -260,8 +260,8 @@ class ExodusSignatureDataController(SignatureDataController): data = { "signatures": {}, - "timestamp": scanner._datetime_now().isoformat(), - "last_updated": scanner._datetime_now().isoformat(), + "timestamp": scanner._datetime_now().timestamp(), + "last_updated": scanner._datetime_now().timestamp(), "version": SCANNER_CACHE_VERSION, } @@ -1104,7 +1104,7 @@ SUSS_DEFAULT = '''{ "license": "NonFree" } }, - "timestamp": "2022-09-29T19:35:04.875586+00:00", + "timestamp": 1664480104.875586, "version": 1, - "last_updated": "2022-09-30T05:13:18.411707+02:00" + "last_updated": 1664480104.875586 }''' diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index a5ad3779..e674197f 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -508,19 +508,19 @@ class Test_SignatureDataController(unittest.TestCase): # check_last_updated def test_check_last_updated_ok(self): sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') - sdc.data['last_updated'] = datetime.utcnow().isoformat() + sdc.data['last_updated'] = datetime.utcnow().timestamp() sdc.check_last_updated() def test_check_last_updated_exception_cache_outdated(self): sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') sdc.cache_duration = timedelta(days=7) - sdc.data['last_updated'] = (datetime.utcnow() - timedelta(days=30)).isoformat() + sdc.data['last_updated'] = (datetime.utcnow() - timedelta(days=30)).timestamp() with self.assertRaises(fdroidserver.scanner.SignatureDataOutdatedException): sdc.check_last_updated() def test_check_last_updated_exception_not_string(self): sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') - sdc.data['last_updated'] = 12345 + sdc.data['last_updated'] = 'sepp' with self.assertRaises(fdroidserver.scanner.SignatureDataMalformedException): sdc.check_last_updated() From b7233dfb2e20184c4c11a00bc05e53f67ff45962 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Fri, 30 Sep 2022 14:54:28 +0200 Subject: [PATCH 0823/2116] ignore cache write test case on older python versions --- tests/scanner.TestCase | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index e674197f..85c55cf2 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -545,6 +545,10 @@ class Test_SignatureDataController(unittest.TestCase): with self.assertRaises(fdroidserver.scanner.SignatureDataVersionMismatchException): sdc.check_data_version() + @unittest.skipIf( + sys.version_info < (3, 9, 0), + "mock_open doesn't allow easy access to written data in older python versions", + ) def test_write_to_cache(self): open_func = mock.mock_open() sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') From d815a64fdb3a7f214dd82b8ea023d4bbfeb555c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Fri, 30 Sep 2022 17:34:41 +0200 Subject: [PATCH 0824/2116] scanner: filter urlopen schemes, mute bandit --- fdroidserver/scanner.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 8eb94a8c..39bffd67 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -244,8 +244,10 @@ class SignatureDataController: self.cache_duration = timedelta(seconds=new_data['cache_duration']) def fetch_signatures_from_web(self): + if not self.url.startswith("https://"): + raise Exception(_("can't open non-https url: '{};".format(self.url))) logging.debug(_("downloading '{}'").format(self.url)) - with urllib.request.urlopen(self.url) as f: + with urllib.request.urlopen(self.url) as f: # nosec B310 scheme filtered above self.set_data(json.load(f)) self.data['last_updated'] = scanner._datetime_now().timestamp() @@ -265,7 +267,9 @@ class ExodusSignatureDataController(SignatureDataController): "version": SCANNER_CACHE_VERSION, } - with urllib.request.urlopen(self.url) as f: + if not self.url.startswith("https://"): + raise Exception(_("can't open non-https url: '{};".format(self.url))) + with urllib.request.urlopen(self.url) as f: # nosec B310 scheme filtered above d = json.load(f) for tracker in d["trackers"].values(): if tracker.get('code_signature'): @@ -356,7 +360,7 @@ def _get_tool(): return scanner._SCANNER_TOOL -def scan_binary(apkfile, extract_signatures=None): +def scan_binary(apkfile): """Scan output of dexdump for known non-free classes.""" logging.info(_('Scanning APK with dexdump for known non-free classes.')) result = get_embedded_classes(apkfile) From e967fc61cfd3733f840c69e365b8f1a8389ae35d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 6 Oct 2022 14:50:30 +0200 Subject: [PATCH 0825/2116] scanner: add regression tests for signautre load logic --- tests/scanner.TestCase | 171 +++++++++++++++++++++++++++++++++++------ 1 file changed, 146 insertions(+), 25 deletions(-) diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 85c55cf2..b301b9ea 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -450,7 +450,9 @@ class Test_scan_binary(unittest.TestCase): fdroidserver.scanner._SCANNER_TOOL = mock.Mock() fdroidserver.scanner._SCANNER_TOOL.regexs = {} fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'] = { - "java/lang/Object": re.compile(r'.*java/lang/Object', re.IGNORECASE | re.UNICODE) + "java/lang/Object": re.compile( + r'.*java/lang/Object', re.IGNORECASE | re.UNICODE + ) } fdroidserver.scanner._SCANNER_TOOL.regexs['warn_code_signatures'] = {} @@ -459,7 +461,12 @@ class Test_scan_binary(unittest.TestCase): self.assertEqual( 1, fdroidserver.scanner.scan_binary(apkfile), - "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'].values(), apkfile), + "Did not find expected code signature '{}' in binary '{}'".format( + fdroidserver.scanner._SCANNER_TOOL.regexs[ + 'err_code_signatures' + ].values(), + apkfile, + ), ) @unittest.skipIf( @@ -472,14 +479,20 @@ class Test_scan_binary(unittest.TestCase): apkfile = os.path.join(self.basedir, 'apk.embedded_1.apk') fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'] = { "org/bitbucket/tickytacky/mirrormirror/MainActivity": re.compile( - r'.*org/bitbucket/tickytacky/mirrormirror/MainActivity', re.IGNORECASE | re.UNICODE + r'.*org/bitbucket/tickytacky/mirrormirror/MainActivity', + re.IGNORECASE | re.UNICODE, ) } self.assertEqual( 1, fdroidserver.scanner.scan_binary(apkfile), - "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'].values(), apkfile), + "Did not find expected code signature '{}' in binary '{}'".format( + fdroidserver.scanner._SCANNER_TOOL.regexs[ + 'err_code_signatures' + ].values(), + apkfile, + ), ) def test_top_level_signature_embedded_apk_present(self): @@ -492,14 +505,21 @@ class Test_scan_binary(unittest.TestCase): self.assertEqual( 1, fdroidserver.scanner.scan_binary(apkfile), - "Did not find expected code signature '{}' in binary '{}'".format(fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'].values(), apkfile), + "Did not find expected code signature '{}' in binary '{}'".format( + fdroidserver.scanner._SCANNER_TOOL.regexs[ + 'err_code_signatures' + ].values(), + apkfile, + ), ) class Test_SignatureDataController(unittest.TestCase): # __init__ def test_init(self): - sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') + sdc = fdroidserver.scanner.SignatureDataController( + 'nnn', 'fff.yml', 'https://example.com/test.json' + ) self.assertEqual(sdc.name, 'nnn') self.assertEqual(sdc.filename, 'fff.yml') self.assertEqual(sdc.cache_duration, timedelta(999999)) @@ -507,51 +527,144 @@ class Test_SignatureDataController(unittest.TestCase): # check_last_updated def test_check_last_updated_ok(self): - sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') + sdc = fdroidserver.scanner.SignatureDataController( + 'nnn', 'fff.yml', 'https://example.com/test.json' + ) sdc.data['last_updated'] = datetime.utcnow().timestamp() sdc.check_last_updated() def test_check_last_updated_exception_cache_outdated(self): - sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') + sdc = fdroidserver.scanner.SignatureDataController( + 'nnn', 'fff.yml', 'https://example.com/test.json' + ) sdc.cache_duration = timedelta(days=7) sdc.data['last_updated'] = (datetime.utcnow() - timedelta(days=30)).timestamp() with self.assertRaises(fdroidserver.scanner.SignatureDataOutdatedException): sdc.check_last_updated() def test_check_last_updated_exception_not_string(self): - sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') + sdc = fdroidserver.scanner.SignatureDataController( + 'nnn', 'fff.yml', 'https://example.com/test.json' + ) sdc.data['last_updated'] = 'sepp' with self.assertRaises(fdroidserver.scanner.SignatureDataMalformedException): sdc.check_last_updated() def test_check_last_updated_exception_not_iso_formatted_string(self): - sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') + sdc = fdroidserver.scanner.SignatureDataController( + 'nnn', 'fff.yml', 'https://example.com/test.json' + ) sdc.data['last_updated'] = '01/09/2002 10:11' with self.assertRaises(fdroidserver.scanner.SignatureDataMalformedException): sdc.check_last_updated() def test_check_last_updated_no_exception_missing_when_last_updated_not_set(self): - sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') + sdc = fdroidserver.scanner.SignatureDataController( + 'nnn', 'fff.yml', 'https://example.com/test.json' + ) sdc.check_last_updated() # check_data_version def test_check_data_version_ok(self): - sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') + sdc = fdroidserver.scanner.SignatureDataController( + 'nnn', 'fff.yml', 'https://example.com/test.json' + ) sdc.data['version'] = fdroidserver.scanner.SCANNER_CACHE_VERSION sdc.check_data_version() def test_check_data_version_exception(self): - sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') - with self.assertRaises(fdroidserver.scanner.SignatureDataVersionMismatchException): + sdc = fdroidserver.scanner.SignatureDataController( + 'nnn', 'fff.yml', 'https://example.com/test.json' + ) + with self.assertRaises( + fdroidserver.scanner.SignatureDataVersionMismatchException + ): sdc.check_data_version() + def test_load_ok(self): + sdc = fdroidserver.scanner.SignatureDataController( + 'nnn', 'fff.yml', 'https://example.com/test.json' + ) + func_lfc = mock.Mock() + func_vd = mock.Mock() + func_clu = mock.Mock() + with mock.patch( + 'fdroidserver.scanner.SignatureDataController.load_from_cache', + func_lfc, + ), mock.patch( + 'fdroidserver.scanner.SignatureDataController.verify_data', + func_vd, + ), mock.patch( + 'fdroidserver.scanner.SignatureDataController.check_last_updated', + func_clu, + ): + sdc.load() + func_lfc.assert_called_once_with() + func_vd.assert_called_once_with() + func_clu.assert_called_once_with() + + def test_load_initial_cache_miss(self): + sdc = fdroidserver.scanner.SignatureDataController( + 'nnn', 'fff.yml', 'https://example.com/test.json' + ) + func_lfc = mock.Mock( + side_effect=fdroidserver.scanner.SignatureDataCacheMissException + ) + func_lfd = mock.Mock() + with mock.patch( + 'fdroidserver.scanner.SignatureDataController.load_from_cache', + func_lfc, + ), mock.patch( + 'fdroidserver.scanner.SignatureDataController.load_from_defaults', + func_lfd, + ): + sdc.load() + func_lfc.assert_called_once_with() + func_lfd.assert_called_once_with() + + def test_load_cache_auto_refresh(self): + sdc = fdroidserver.scanner.SignatureDataController( + 'nnn', 'fff.yml', 'https://example.com/test.json' + ) + func_lfc = mock.Mock() + func_vd = mock.Mock() + func_clu = mock.Mock( + side_effect=fdroidserver.scanner.SignatureDataOutdatedException() + ) + func_fsfw = mock.Mock() + func_wtc = mock.Mock() + with mock.patch( + 'fdroidserver.scanner.SignatureDataController.load_from_cache', + func_lfc, + ), mock.patch( + 'fdroidserver.scanner.SignatureDataController.verify_data', + func_vd, + ), mock.patch( + 'fdroidserver.scanner.SignatureDataController.check_last_updated', + func_clu, + ), mock.patch( + 'fdroidserver.scanner.SignatureDataController.fetch_signatures_from_web', + func_fsfw, + ), mock.patch( + 'fdroidserver.scanner.SignatureDataController.write_to_cache', + func_wtc, + ): + sdc.load() + func_lfc.assert_called_once_with() + func_vd.assert_called_once_with() + func_clu.assert_called_once_with() + func_fsfw.assert_called_once_with() + func_wtc.assert_called_once_with() + @unittest.skipIf( sys.version_info < (3, 9, 0), "mock_open doesn't allow easy access to written data in older python versions", ) def test_write_to_cache(self): open_func = mock.mock_open() - sdc = fdroidserver.scanner.SignatureDataController('nnn', 'fff.yml', 'https://example.com/test.json') + sdc = fdroidserver.scanner.SignatureDataController( + 'nnn', 'fff.yml', 'https://example.com/test.json' + ) sdc.data = {"mocked": "data"} with mock.patch("builtins.open", open_func), mock.patch( @@ -561,10 +674,16 @@ class Test_SignatureDataController(unittest.TestCase): sdc.write_to_cache() open_func.assert_called_with(pathlib.Path('fff.yml'), 'w', encoding="utf-8") - self.assertEqual( - mock_open_to_str(open_func), - """{\n "mocked": "data"\n}""" - ) + self.assertEqual(mock_open_to_str(open_func), """{\n "mocked": "data"\n}""") + + +class Test_ScannerTool(unittest.TestCase): + def test_load(self): + st = mock.Mock() + st.sdcs = [mock.Mock(), mock.Mock()] + fdroidserver.scanner.ScannerTool.load(st) + st.sdcs[0].load.assert_called_once_with() + st.sdcs[1].load.assert_called_once_with() class Test_main(unittest.TestCase): @@ -630,10 +749,12 @@ if __name__ == "__main__": (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() - newSuite.addTests([ - unittest.makeSuite(ScannerTest), - unittest.makeSuite(Test_scan_binary), - unittest.makeSuite(Test_SignatureDataController), - unittest.makeSuite(Test_main), - ]) + newSuite.addTests( + [ + unittest.makeSuite(ScannerTest), + unittest.makeSuite(Test_scan_binary), + unittest.makeSuite(Test_SignatureDataController), + unittest.makeSuite(Test_main), + ] + ) unittest.main(failfast=False) From 9ccf583061e22b04bf3ee48ab4827a4b3d3ebe43 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 6 Oct 2022 13:55:38 +0000 Subject: [PATCH 0826/2116] Apply 3 suggestion(s) to 2 file(s) --- fdroidserver/common.py | 2 +- fdroidserver/scanner.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 0f001019..421e6a54 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -325,7 +325,7 @@ def fill_config_defaults(thisconfig): def get_config(opts=None): - """Get config instace. This function takes care of initaling config data before returning it.""" + """Get config instace. This function takes care of initializing config data before returning it.""" global config, options if config is not None: diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 39bffd67..e14aadae 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -353,7 +353,7 @@ def _get_tool(): """ Lazy loading function for getting a ScannerTool instance. - ScannerTool initialization need to access `common.config` values. Those are only available after initialization through `common.read_config()` So this factory assumes config was called at an erlier point in time + ScannerTool initialization need to access `common.config` values. Those are only available after initialization through `common.read_config()`. So this factory assumes config was called at an erlier point in time. """ if not scanner._SCANNER_TOOL: scanner._SCANNER_TOOL = ScannerTool() @@ -682,7 +682,7 @@ def main(): parser.add_argument("--json", action="store_true", default=False, help=_("Output JSON to stdout.")) parser.add_argument("--refresh", "-r", action="store_true", default=False, - help=_("fetach the latest version of signatures from the web")) + help=_("fetch the latest version of signatures from the web")) metadata.add_metadata_arguments(parser) options = parser.parse_args() metadata.warnings_action = options.W From df46eb86c339c10826a111b6ec151ba0eff81a48 Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Fri, 3 Sep 2021 12:18:13 +0200 Subject: [PATCH 0827/2116] Upgrade Buildserver VM Use Vagrant boxes built with cloud-team/debian-vagrant-images instead of fdroid/basebox, Use Debian Bullseye (11) instead of Debian Stretch (9) --- .gitlab-ci.yml | 4 +- buildserver/Dockerfile | 2 +- buildserver/provision-apt-get-install | 23 ++++---- fdroidserver/import_subcommand.py | 2 +- jenkins-build-all | 2 +- jenkins-test | 2 +- makebuildserver | 78 +++++---------------------- 7 files changed, 29 insertions(+), 84 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e4c9a813..7bfe690d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -588,7 +588,7 @@ docker: - cd buildserver - docker build -t $TEST_IMAGE --build-arg GIT_REV_PARSE_HEAD=$(git rev-parse HEAD) . - docker tag $TEST_IMAGE $RELEASE_IMAGE - - docker tag $TEST_IMAGE ${RELEASE_IMAGE}-stretch + - docker tag $TEST_IMAGE ${RELEASE_IMAGE}-bullseye - echo $CI_BUILD_TOKEN | docker login -u gitlab-ci-token --password-stdin registry.gitlab.com # This avoids filling up gitlab.com free tier accounts with unused docker images. - if test -n "$FDROID_PUSH_DOCKER_IMAGE"; then @@ -598,4 +598,4 @@ docker: exit 0; fi - docker push $RELEASE_IMAGE - - docker push $RELEASE_IMAGE-stretch + - docker push $RELEASE_IMAGE-bullseye diff --git a/buildserver/Dockerfile b/buildserver/Dockerfile index 3d9ee52f..6ecdf544 100644 --- a/buildserver/Dockerfile +++ b/buildserver/Dockerfile @@ -1,5 +1,5 @@ -FROM debian:stretch +FROM debian:bullseye ENV LANG=C.UTF-8 \ DEBIAN_FRONTEND=noninteractive diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index 24cb1a5e..17b229fd 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -37,14 +37,11 @@ if echo $debian_mirror | grep '^https' 2>&1 > /dev/null; then fi cat << EOF > /etc/apt/sources.list -deb ${debian_mirror} stretch main -deb http://security.debian.org/debian-security stretch/updates main -deb ${debian_mirror} stretch-updates main +deb ${debian_mirror} bullseye main +deb http://security.debian.org/debian-security bullseye-security main +deb ${debian_mirror} bullseye-updates main EOF -echo "deb ${debian_mirror} stretch-backports main" > /etc/apt/sources.list.d/stretch-backports.list -echo "deb ${debian_mirror} stretch-backports-sloppy main" > /etc/apt/sources.list.d/stretch-backports-sloppy.list -echo "deb ${debian_mirror} testing main" > /etc/apt/sources.list.d/testing.list -printf "Package: *\nPin: release o=Debian,a=testing\nPin-Priority: -300\n" > /etc/apt/preferences.d/debian-testing +echo "deb ${debian_mirror} bullseye-backports main" > /etc/apt/sources.list.d/backports.list dpkg --add-architecture i386 @@ -56,7 +53,7 @@ apt-get upgrade apt-get update || apt-get update packages=" - androguard/stretch-backports + androguard ant asn1c ant-contrib @@ -80,10 +77,10 @@ packages=" git-core git-svn gperf - gpg/stretch-backports-sloppy - gpgconf/stretch-backports-sloppy - libassuan0/stretch-backports - libgpg-error0/stretch-backports + gpg + gpgconf + libassuan0 + libgpg-error0 javacc libarchive-zip-perl libexpat1-dev @@ -110,7 +107,7 @@ packages=" python-magic python-pip python-setuptools - python3-asn1crypto/stretch-backports + python3-asn1crypto python3-defusedxml python3-git python3-gitdb diff --git a/fdroidserver/import_subcommand.py b/fdroidserver/import_subcommand.py index ec3b0036..8f89148b 100644 --- a/fdroidserver/import_subcommand.py +++ b/fdroidserver/import_subcommand.py @@ -334,7 +334,7 @@ def main(): package_json = tmp_importer_dir / 'package.json' # react-native pubspec_yaml = tmp_importer_dir / 'pubspec.yaml' # flutter if package_json.exists(): - build.sudo = ['apt-get update || apt-get update', 'apt-get install -t stretch-backports npm', 'npm install -g react-native-cli'] + build.sudo = ['apt-get update || apt-get update', 'apt-get install npm', 'npm install -g react-native-cli'] build.init = ['npm install'] with package_json.open() as fp: data = json.load(fp) diff --git a/jenkins-build-all b/jenkins-build-all index aa663fc5..5dfebbf2 100755 --- a/jenkins-build-all +++ b/jenkins-build-all @@ -62,7 +62,7 @@ vagrant global-status \ # so we need to "manually" clone the git repo here… cd $WORKSPACE -# set up Android SDK to use the Debian packages in stretch +# set up Android SDK to use the Debian packages export ANDROID_HOME=/usr/lib/android-sdk # now build the whole archive diff --git a/jenkins-test b/jenkins-test index fb8eb3b6..cdacea32 100755 --- a/jenkins-test +++ b/jenkins-test @@ -29,7 +29,7 @@ fi set -e set -x -# set up Android SDK to use the Debian packages in stretch +# set up Android SDK to use the Debian packages export ANDROID_HOME=/usr/lib/android-sdk rm -rf "$WORKSPACE/.testfiles" diff --git a/makebuildserver b/makebuildserver index cb4d1b92..3aa93765 100755 --- a/makebuildserver +++ b/makebuildserver @@ -43,74 +43,22 @@ logging.basicConfig(format=logformat, level=loglevel) tail = None -BASEBOX_DEFAULT = 'fdroid/basebox-stretch64' -BASEBOX_VERSION_DEFAULT = '0.5.1' +BASEBOX_DEFAULT = 'fdroid/bullseye64' +BASEBOX_VERSION_DEFAULT = '11.20220317.1' BASEBOX_CHECKSUMS = { - '0.6.1': { + '11.20220317.1': { 'libvirt': { - 'box.img': 'a45342ad238271815f9197325cd0317d6df87e1c20372015532919d817d0dc07', - 'metadata.json': '9b5f62362ce3cd25c50881d8ae124879fc21ed4fdb16cc78d57058f116680f25', - 'Vagrantfile': '4435901624f21dad201c3bd7f0d8d4ece842bc9fbbb70e312eee54f07173f24e', + 'box.img': 'fbde152a2f61d191983be9d1dbeae2591af32cca1ec27daa342485d97187515e', + 'metadata.json': '42b96a01106c25f3a222ddad0baead0b811cc64926f924fb836bbfa43580e646', + 'Vagrantfile': 'f9c6fcbb47a4d0d33eb066859c8e87efd642287a638bd7da69a9e7a6f25fec47', }, 'virtualbox': { - 'box-disk1.vmdk': '6b536f26dcee137aca9a3f5f6f20aef795193ef2e8c387a0ffbdb7c5fe2ec0fb', - 'box.ovf': 'cbdd6315187d4ce8ff15ed5a00a2c8b0d33abe6b0356439ce4d8d9ac3724f875', - 'metadata.json': '098439524f76cafe026140b787ca419297a055a3f6006b9d60e6d5326d18ba99', - 'Vagrantfile': '95c64a0e82a6420845c05038c4c97b3aba629b09eb2b78e879423d06f6b54a54', + 'box.ovf': 'becd5cea2666d42e12def13a91766aa0d4b0e8e6f53102486c2a6cdb4e401b08', + 'box.vmdk': '49c96a58a3ee99681d348075864a290c60a8d334fddd21be453c825fcee75eda', + 'metadata.json': 'ffdaa989f2f6932cd8042e1102371f405cc7ad38e324210a1326192e4689e83a', + 'Vagrantfile': '0bbc2ae97668d8da27ab97b766752dcd0bf9e41900e21057de15a58ee7fae47d', } }, - '0.6.0': { - 'libvirt': { - 'box.img': '82c2c3548cf48f0f4c6601f40f8bec36ff37e9a74d6f717067a526250ad790ad', - 'metadata.json': '9b5f62362ce3cd25c50881d8ae124879fc21ed4fdb16cc78d57058f116680f25', - 'Vagrantfile': '4435901624f21dad201c3bd7f0d8d4ece842bc9fbbb70e312eee54f07173f24e', - }, - 'virtualbox': { - 'box-disk1.vmdk': '6b536f26dcee137aca9a3f5f6f20aef795193ef2e8c387a0ffbdb7c5fe2ec0fb', - 'box.ovf': 'cbdd6315187d4ce8ff15ed5a00a2c8b0d33abe6b0356439ce4d8d9ac3724f875', - 'metadata.json': '098439524f76cafe026140b787ca419297a055a3f6006b9d60e6d5326d18ba99', - 'Vagrantfile': '95c64a0e82a6420845c05038c4c97b3aba629b09eb2b78e879423d06f6b54a54', - } - }, - '0.5.1': { - 'libvirt': { - 'box.img': 'ad015940b866e36a593ef5fa0035ec6703f74a7f082ab76a1d2bd9463714cd4a', - 'metadata.json': '5ced8ecf886722a5152095e099b778b1d2b859c2e1dcf834182274034b8a629d', - 'Vagrantfile': 'cc7b8edb26481c158b2c28d15d32f7e146de892847c9308ac262678cf0ae8260', - }, - 'virtualbox': { - 'box-disk1.vmdk': 'cba36a9c9814bdff9aabaea8786c27477ef8958cf6ee65ad844cb2726bdab93e', - 'box.ovf': 'cbdd6315187d4ce8ff15ed5a00a2c8b0d33abe6b0356439ce4d8d9ac3724f875', - 'metadata.json': '098439524f76cafe026140b787ca419297a055a3f6006b9d60e6d5326d18ba99', - 'Vagrantfile': 'ae50c3d152c3016e853176005d1a5da7a8e6ae424c9074e93b1a1015aa2f2e14', - } - }, - '0.5': { - 'virtualbox': { - 'box-disk1.vmdk': '8834d5eb78758437c2517f83282172fd5e3842d88f657d577592d0917cd02f89', - 'box.ovf': 'cbdd6315187d4ce8ff15ed5a00a2c8b0d33abe6b0356439ce4d8d9ac3724f875', - 'metadata.json': '098439524f76cafe026140b787ca419297a055a3f6006b9d60e6d5326d18ba99', - 'Vagrantfile': 'ae50c3d152c3016e853176005d1a5da7a8e6ae424c9074e93b1a1015aa2f2e14', - }, - 'libvirt': { - 'box.img': '2ef5f1fdc98c24a4f67cecb526d21e1d73dedf5a0072ceff528a0e75da3ff452', - 'metadata.json': 'da79a5e2327dcf81a18a9d66a6e91205a20e440f23d3928e633fd39d60c641e5', - 'Vagrantfile': 'cc7b8edb26481c158b2c28d15d32f7e146de892847c9308ac262678cf0ae8260', - } - }, - '0.3': { - 'libvirt': { - 'box.img': '24f06f415dde4cdb01d68c904fc57386ea060ba7b94e700670c58694b3d3635e', - 'metadata.json': '0965955659082fd2e67723deb3311ba253c96153d3176d856db1b3e6e461cf23', - 'Vagrantfile': 'cc7b8edb26481c158b2c28d15d32f7e146de892847c9308ac262678cf0ae8260', - }, - 'virtualbox': { - 'box-disk1.vmdk': '103114977f1a36f7121ef9b3a1495129baa10bfedfada61a13345c8863c4dcd6', - 'box.ovf': '33a5fbaf3dba443237baefcba6d56ca7a76121ca530f1140aa8263a69d7d3695', - 'metadata.json': '098439524f76cafe026140b787ca419297a055a3f6006b9d60e6d5326d18ba99', - 'Vagrantfile': 'ae50c3d152c3016e853176005d1a5da7a8e6ae424c9074e93b1a1015aa2f2e14', - } - } } config = { @@ -138,7 +86,7 @@ logging.debug("makebuildserver.config.py parsed -> %s", json.dumps(config, inden if config['basebox'] == BASEBOX_DEFAULT and 'basebox_version' not in config: config['basebox_version'] = BASEBOX_VERSION_DEFAULT # note: vagrant allows putting '/' into the name of a local box, -# so this check is not completely relyable, but better than nothing +# so this check is not completely reliable, but better than nothing if 'basebox_version' in config and 'basebox' in config and '/' not in config['basebox']: logging.critical("Can not get version '{version}' for basebox '{box}', " "vagrant does not support versioning for locally added boxes." @@ -488,7 +436,7 @@ def main(): "virtualbox, libvirt)" .format(vm_provider=config['cm_provider'])) sys.exit(1) - # Check if selected basebox is available + # Check if selected Vagrant box is available available_boxes_by_provider = [x.name for x in v.box_list() if x.provider == config['vm_provider']] if '/' not in config['basebox'] and config['basebox'] not in available_boxes_by_provider: logging.critical("Vagrant box '{basebox}' not available " @@ -501,7 +449,7 @@ def main(): basebox=config['basebox'])) sys.exit(1) - # download and verfiy fdroid pre-built basebox + # Download and verify pre-built Vagrant boxes if config['basebox'] == BASEBOX_DEFAULT: buildserver_not_created = any([True for x in v.status() if x.state == 'not_created' and x.name == 'default']) if buildserver_not_created or options.clean: From cc641b5470c3fb3755c88b64d47c6e26db7aca27 Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Fri, 3 Sep 2021 13:09:55 +0200 Subject: [PATCH 0828/2116] Stop adding i386 architecture to dpkg --- buildserver/provision-apt-get-install | 2 -- 1 file changed, 2 deletions(-) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index 17b229fd..96655b4b 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -43,8 +43,6 @@ deb ${debian_mirror} bullseye-updates main EOF echo "deb ${debian_mirror} bullseye-backports main" > /etc/apt/sources.list.d/backports.list -dpkg --add-architecture i386 - apt-get update || apt-get update apt-get upgrade --download-only apt-get upgrade From be5aefd3eebe6abc915c344c04f9b1d028f89dcd Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Fri, 3 Sep 2021 13:48:36 +0200 Subject: [PATCH 0829/2116] Install required packages for fdroidserver automatically --- buildserver/provision-apt-get-install | 90 +++------------------------ 1 file changed, 8 insertions(+), 82 deletions(-) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index 96655b4b..634a01a5 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -51,94 +51,20 @@ apt-get upgrade apt-get update || apt-get update packages=" - androguard - ant - asn1c - ant-contrib - autoconf - autoconf2.13 - automake - automake1.11 - autopoint - bison - bzr - ca-certificates-java - cmake - curl + default-jdk-headless + default-jre-headless dexdump - disorderfs - expect - faketime - flex - gettext - gettext-base - git-core - git-svn - gperf - gpg - gpgconf - libassuan0 - libgpg-error0 - javacc - libarchive-zip-perl - libexpat1-dev - libgcc1:i386 - libglib2.0-dev - liblzma-dev - libncurses5:i386 - librsvg2-bin - libsaxonb-java - libssl-dev - libstdc++6:i386 - libtool - libtool-bin - make - maven - mercurial - nasm - openjdk-8-jre-headless - openjdk-8-jdk-headless - optipng - pkg-config - python-gnupg - python-lxml - python-magic - python-pip - python-setuptools - python3-asn1crypto - python3-defusedxml - python3-git - python3-gitdb - python3-gnupg - python3-pip - python3-pyasn1 - python3-pyasn1-modules - python3-qrcode - python3-requests - python3-setuptools - python3-smmap - python3-yaml - python3-ruamel.yaml - python3-pil - python3-paramiko - quilt - rsync - scons - sqlite3 - subversion + fdroidserver + gnupg sudo - swig - unzip - xsltproc - yasm - zip - zlib1g:i386 " + apt-get install $packages --download-only apt-get install $packages +apt-get purge fdroidserver highestjava=`update-java-alternatives --list | sort -n | tail -1 | cut -d ' ' -f 1` update-java-alternatives --set $highestjava -# configure headless openjdk to work without gtk accessability dependencies -sed -i -e 's@\(assistive_technologies=org.GNOME.Accessibility.AtkWrapper\)@#\1@' /etc/java-8-openjdk/accessibility.properties +# configure headless openjdk to work without gtk accessibility dependencies +sed -i -e 's@\(assistive_technologies=org.GNOME.Accessibility.AtkWrapper\)@#\1@' /etc/java-11-openjdk/accessibility.properties From cb2c3a34bb57b9d020f2f62d47fe72d020fc5ccc Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 7 Sep 2021 11:10:44 +0000 Subject: [PATCH 0830/2116] remove hack to disable GNOME.Accessibility for minimal deps This is commented out by default on all OpenJDK packages since Java 8. https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1012?diff_id=263085985#note_726457435 root@sid:/# grep Accessibility /etc/java-*-openjdk/accessibility.properties /etc/java-11-openjdk/accessibility.properties:#assistive_technologies=org.GNOME.Accessibility.AtkWrapper /etc/java-17-openjdk/accessibility.properties:#assistive_technologies=org.GNOME.Accessibility.AtkWrapper /etc/java-18-openjdk/accessibility.properties:#assistive_technologies=org.GNOME.Accessibility.AtkWrapper /etc/java-8-openjdk/accessibility.properties:assistive_technologies=org.GNOME.Accessibility.AtkWrapper --- buildserver/provision-apt-get-install | 3 --- 1 file changed, 3 deletions(-) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index 634a01a5..a1cfd6bc 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -65,6 +65,3 @@ apt-get purge fdroidserver highestjava=`update-java-alternatives --list | sort -n | tail -1 | cut -d ' ' -f 1` update-java-alternatives --set $highestjava - -# configure headless openjdk to work without gtk accessibility dependencies -sed -i -e 's@\(assistive_technologies=org.GNOME.Accessibility.AtkWrapper\)@#\1@' /etc/java-11-openjdk/accessibility.properties From b4f8ab289dd458110fe16b64b1bbfe5fa05fa407 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sun, 17 Oct 2021 21:46:39 +0200 Subject: [PATCH 0831/2116] Use yaml.safe_* --- makebuildserver | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/makebuildserver b/makebuildserver index 3aa93765..68d07547 100755 --- a/makebuildserver +++ b/makebuildserver @@ -416,7 +416,7 @@ def main(): logging.info('Halting %s', serverdir) v.halt() with open(vf, 'r', encoding='utf-8') as f: - oldconfig = yaml.load(f) + oldconfig = yaml.safe_load(f) if config != oldconfig: logging.info("Server configuration has changed, rebuild from scratch is required") vm.destroy() @@ -427,7 +427,7 @@ def main(): logging.info("No existing server - building from scratch") if writevf: with open(vf, 'w', encoding='utf-8') as f: - yaml.dump(config, f) + yaml.safe_dump(config, f) # Check if selected provider is supported if config['vm_provider'] not in ['libvirt', 'virtualbox']: From d762f423ce227fe67ac7f8e44739935b3bb4955e Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sun, 17 Oct 2021 21:47:21 +0200 Subject: [PATCH 0832/2116] Install patch and rsync (required by fdroidserver) --- buildserver/provision-apt-get-install | 2 ++ 1 file changed, 2 insertions(+) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index a1cfd6bc..916798aa 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -56,6 +56,8 @@ packages=" dexdump fdroidserver gnupg + patch + rsync sudo " From f03e812a137c99bd0a78ac0f1c8a5fc1ae8328b6 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sun, 17 Oct 2021 22:58:12 +0200 Subject: [PATCH 0833/2116] Drop obsolete apt-transport-https --- buildserver/provision-apt-get-install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index 916798aa..b4855f51 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -33,7 +33,7 @@ EOF if echo $debian_mirror | grep '^https' 2>&1 > /dev/null; then apt-get update || apt-get update - apt-get install apt-transport-https ca-certificates + apt-get install ca-certificates fi cat << EOF > /etc/apt/sources.list From dbaa3f6ec2509c2556c3bb0bb872f60a5182fc85 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 17 Jan 2022 09:08:28 +0100 Subject: [PATCH 0834/2116] Stop installing ConstraintLayout sdkmanager does not work anymore with Java 11 and these can be installed in the app's build metadata. --- buildserver/provision-android-sdk | 5 ----- 1 file changed, 5 deletions(-) diff --git a/buildserver/provision-android-sdk b/buildserver/provision-android-sdk index e8fa1834..ac3a0b99 100644 --- a/buildserver/provision-android-sdk +++ b/buildserver/provision-android-sdk @@ -122,11 +122,6 @@ cat < $ANDROID_HOME/licenses/intel-android-extra-license d975f751698a77b662f1254ddbeed3901e976f5a EOF -echo y | $ANDROID_HOME/tools/bin/sdkmanager "extras;m2repository;com;android;support;constraint;constraint-layout;1.0.1" -echo y | $ANDROID_HOME/tools/bin/sdkmanager "extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.1" -echo y | $ANDROID_HOME/tools/bin/sdkmanager "extras;m2repository;com;android;support;constraint;constraint-layout;1.0.2" -echo y | $ANDROID_HOME/tools/bin/sdkmanager "extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.2" - chmod a+X $(dirname $ANDROID_HOME/) chmod -R a+rX $ANDROID_HOME/ chgrp vagrant $ANDROID_HOME From 9ddf38b69abc990583ef093eaaa71c20e9b9b386 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 18 Oct 2021 12:14:21 +0200 Subject: [PATCH 0835/2116] Drop vagrant ssh config Not needed and breaks login with debian/bullseye64 image. --- fdroidserver/vmtools.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/fdroidserver/vmtools.py b/fdroidserver/vmtools.py index f4e3a416..9462e446 100644 --- a/fdroidserver/vmtools.py +++ b/fdroidserver/vmtools.py @@ -465,8 +465,6 @@ class LibvirtBuildVm(FDroidBuildVm): vagrantfile = textwrap.dedent( """\ Vagrant.configure("2") do |config| - config.ssh.username = "vagrant" - config.ssh.password = "vagrant" config.vm.provider :libvirt do |libvirt| From c208582e75c53dbbf22349379b5bcb0cb13dc35d Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sat, 30 Oct 2021 19:14:12 +0200 Subject: [PATCH 0836/2116] Drop old java_paths --- buildserver/config.buildserver.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/buildserver/config.buildserver.yml b/buildserver/config.buildserver.yml index f5fff843..944535c5 100644 --- a/buildserver/config.buildserver.yml +++ b/buildserver/config.buildserver.yml @@ -1,6 +1,2 @@ sdk_path: /opt/android-sdk - -java_paths: - 8: /usr/lib/jvm/java-8-openjdk-amd64 - gradle_version_dir: /opt/gradle/versions From 046d3c8dcf5a0f58cf3eec9cbc3ff489863753ed Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sat, 30 Oct 2021 20:58:42 +0200 Subject: [PATCH 0837/2116] Use ssh_config.d --- buildserver/setup-env-vars | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/buildserver/setup-env-vars b/buildserver/setup-env-vars index a5f53fd8..d7d8d245 100644 --- a/buildserver/setup-env-vars +++ b/buildserver/setup-env-vars @@ -18,5 +18,9 @@ echo 'export fdroidserver=$home_vagrant/fdroidserver' >> $bsenv chmod 0644 $bsenv # make sure that SSH never hangs at a password or key prompt -printf ' StrictHostKeyChecking yes\n' >> /etc/ssh/ssh_config -printf ' BatchMode yes\n' >> /etc/ssh/ssh_config +mkdir -p /etc/ssh/ssh_config.d/ +cat << EOF >> /etc/ssh/ssh_config.d/fdroid +Host * + StrictHostKeyChecking yes + BatchMode yes +EOF From c6f59565378b9f1aed83f08666f439a6f1a3ca45 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 18 Apr 2022 10:17:12 +0200 Subject: [PATCH 0838/2116] install Vagrant insecure_private_key into buildserver box Vagrant uses the "insecure private key" to establish the first SSH connection to a new VM based on a clean public box. In theory, the `vagrant package` command should do that automatically. This process is still using custom code instead of `vagrant package`, hence this script. This public key can be generated on any Vagrant install using: ssh-keygen -y -f ~/.vagrant.d/insecure_private_key https://www.vagrantup.com/docs/vagrantfile/ssh_settings#config-ssh-private_key_path fdroid-bootstrap-buildserver#12 !1012 !1099 --- buildserver/Vagrantfile | 2 ++ .../provision-vagrant-insecure-private-key | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100755 buildserver/provision-vagrant-insecure-private-key diff --git a/buildserver/Vagrantfile b/buildserver/Vagrantfile index 5a420b62..57509ffe 100644 --- a/buildserver/Vagrantfile +++ b/buildserver/Vagrantfile @@ -77,6 +77,8 @@ Vagrant.configure("2") do |config| owner: 'root', group: 'root', create: true end + config.vm.provision "shell", name: "vagrant-insecure-private-key", + path: "provision-vagrant-insecure-private-key" config.vm.provision "shell", name: "setup-env-vars", path: "setup-env-vars", args: ["/opt/android-sdk"] config.vm.provision "shell", name: "apt-get-install", path: "provision-apt-get-install", diff --git a/buildserver/provision-vagrant-insecure-private-key b/buildserver/provision-vagrant-insecure-private-key new file mode 100755 index 00000000..b6ed681e --- /dev/null +++ b/buildserver/provision-vagrant-insecure-private-key @@ -0,0 +1,17 @@ +#!/bin/bash -e +# +# Vagrant uses the "insecure private key" to establish the first SSH +# connection to a new VM based on a clean public box. In theory, the +# `vagrant package` command should do that automatically. This +# process is still using custom code instead of `vagrant package`, +# hence this script. +# +# https://gitlab.com/fdroid/fdroid-bootstrap-buildserver/-/issues/12 +# https://www.vagrantup.com/docs/vagrantfile/ssh_settings#config-ssh-private_key_path +# +# This public key can be generated using: +# ssh-keygen -y -f ~/.vagrant.d/insecure_private_key + +echo "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== ~/.vagrant.d/insecure_private_key" > /home/vagrant/.ssh/authorized_keys +chown vagrant:vagrant /home/vagrant/.ssh/authorized_keys +chmod 600 /home/vagrant/.ssh/authorized_keys From 4eb189ad2e8677bbc1e3a01d1e91cfc3d0df4527 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 24 Aug 2022 21:23:42 +0200 Subject: [PATCH 0839/2116] gitlab-ci: plugin_fetchsrclibs runs in same base OS as fdroiddata --- .gitlab-ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7bfe690d..5e9a47f1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -407,7 +407,7 @@ fdroid build: # fdroiddata because that one is known to work, and this is a CI job, # so it should be isolated from the normal churn of fdroiddata. plugin_fetchsrclibs: - image: debian:buster + image: debian:bullseye <<: *apt-template only: changes: @@ -430,7 +430,8 @@ plugin_fetchsrclibs: - . env/bin/activate - export PATH="$CI_PROJECT_DIR:$PATH" - export PYTHONPATH="$CI_PROJECT_DIR/examples" - - $pip install wheel # to make this go away: "error: invalid command 'bdist_wheel'" + # workaround https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1003252 + - export SETUPTOOLS_USE_DISTUTILS=stdlib - $pip install -e . - fdroid | grep fetchsrclibs From a0ea27632e61d06980364a4e7d19b68967c6b957 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 5 Sep 2022 18:45:17 +0200 Subject: [PATCH 0840/2116] buildserver: use HTTPS for security.debian.org It is now officially supported: https://guardianproject.info/2021/12/08/debian-over-https/ --- buildserver/provision-apt-get-install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index b4855f51..a975ac74 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -38,7 +38,7 @@ fi cat << EOF > /etc/apt/sources.list deb ${debian_mirror} bullseye main -deb http://security.debian.org/debian-security bullseye-security main +deb https://security.debian.org/debian-security bullseye-security main deb ${debian_mirror} bullseye-updates main EOF echo "deb ${debian_mirror} bullseye-backports main" > /etc/apt/sources.list.d/backports.list From 4e839ac63b15de835d63dc153fc94987a0cf907f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 10 Oct 2022 21:22:32 +0200 Subject: [PATCH 0841/2116] switch to latest vagrant boxes --- makebuildserver | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/makebuildserver b/makebuildserver index 68d07547..aec0192e 100755 --- a/makebuildserver +++ b/makebuildserver @@ -44,8 +44,21 @@ logging.basicConfig(format=logformat, level=loglevel) tail = None BASEBOX_DEFAULT = 'fdroid/bullseye64' -BASEBOX_VERSION_DEFAULT = '11.20220317.1' +BASEBOX_VERSION_DEFAULT = "11.20221010.1" BASEBOX_CHECKSUMS = { + "11.20221010.1": { + "libvirt": { + "box.img": "c2114aa276c176fa65b8072f5dcd1e8a6ab9f7d15fd5da791727a0164fd43254", + "Vagrantfile": "f9c6fcbb47a4d0d33eb066859c8e87efd642287a638bd7da69a9e7a6f25fec47", + "metadata.json": "42b96a01106c25f3a222ddad0baead0b811cc64926f924fb836bbfa43580e646", + }, + "virtualbox": { + "box.ovf": "5e4de5f1f4b481b2c1917c0b2f6e6334f4741cc18c5b278e3bafb094535ff2cb", + "box.vmdk": "737053bc886037ae76bb38a1776eba2a5579d49423de990e93ef4a3f0cab4f1c", + "Vagrantfile": "0bbc2ae97668d8da27ab97b766752dcd0bf9e41900e21057de15a58ee7fae47d", + "metadata.json": "ffdaa989f2f6932cd8042e1102371f405cc7ad38e324210a1326192e4689e83a", + } + }, '11.20220317.1': { 'libvirt': { 'box.img': 'fbde152a2f61d191983be9d1dbeae2591af32cca1ec27daa342485d97187515e', From b4720d9201292d9827bb49a95a1cbe45a2c7484c Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 11 Oct 2022 09:52:33 +0200 Subject: [PATCH 0842/2116] gitlab-ci: fix reversed logic in docker push I got it backwards in 66d8b783f0cc4396a1ea80f989973b6063638ddc from !1183 --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5e9a47f1..232ec136 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -592,7 +592,7 @@ docker: - docker tag $TEST_IMAGE ${RELEASE_IMAGE}-bullseye - echo $CI_BUILD_TOKEN | docker login -u gitlab-ci-token --password-stdin registry.gitlab.com # This avoids filling up gitlab.com free tier accounts with unused docker images. - - if test -n "$FDROID_PUSH_DOCKER_IMAGE"; then + - if test -z "$FDROID_PUSH_DOCKER_IMAGE"; then echo "Skipping docker push to save quota on your gitlab namespace."; echo "If you want to enable the push, set FDROID_PUSH_DOCKER_IMAGE in"; echo "https://gitlab.com/$CI_PROJECT_NAMESPACE/fdroidserver/-/settings/ci_cd#js-cicd-variables-settings"; From e192eb4a32b78936ff310e637847020ba46172c5 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 11 Oct 2022 10:52:15 +0200 Subject: [PATCH 0843/2116] buildserver: prevent fdroidserver deps from being purged in Docker --- buildserver/Dockerfile | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/buildserver/Dockerfile b/buildserver/Dockerfile index 6ecdf544..f974620e 100644 --- a/buildserver/Dockerfile +++ b/buildserver/Dockerfile @@ -28,11 +28,15 @@ LABEL org.opencontainers.image.revision=$GIT_REV_PARSE_HEAD # setup 'vagrant' user for compatibility RUN useradd --create-home -s /bin/bash vagrant && echo -n 'vagrant:vagrant' | chpasswd -# the provision scripts must be run in the same order as in Vagrantfile +# The provision scripts must be run in the same order as in Vagrantfile # - vagrant needs openssh-client iproute2 ssh sudo # - ansible needs python3 +# # Debian Docker images will soon default to HTTPS for apt sources, so force it. # https://github.com/debuerreotype/docker-debian-artifacts/issues/15 +# +# Ensure fdroidserver is installed before purging unneeded packages, +# otherwise, all its dependencies get purged. RUN printf "path-exclude=/usr/share/locale/*\npath-exclude=/usr/share/man/*\npath-exclude=/usr/share/doc/*\npath-include=/usr/share/doc/*/copyright\n" >/etc/dpkg/dpkg.cfg.d/01_nodoc \ && mkdir -p /usr/share/man/man1 \ && apt-get update \ @@ -53,7 +57,9 @@ RUN printf "path-exclude=/usr/share/locale/*\npath-exclude=/usr/share/man/*\npat && bash /opt/buildserver/provision-gradle \ && bash /opt/buildserver/provision-buildserverid $GIT_REV_PARSE_HEAD \ && rm -rf /vagrant/cache \ + && apt-get install fdroidserver \ && apt-get autoremove --purge \ + && apt-get purge fdroidserver \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* From e90f03a4947026ace8413d3b01c3117d1c7600dd Mon Sep 17 00:00:00 2001 From: linsui Date: Tue, 11 Oct 2022 15:51:26 +0800 Subject: [PATCH 0844/2116] remove MVN3 --- fdroidserver/common.py | 1 - 1 file changed, 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 421e6a54..45505fe9 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2930,7 +2930,6 @@ def replace_build_vars(cmd, build): def replace_config_vars(cmd, build): cmd = cmd.replace('$$SDK$$', config['sdk_path']) cmd = cmd.replace('$$NDK$$', build.ndk_path()) - cmd = cmd.replace('$$MVN3$$', config['mvn3']) if build is not None: cmd = replace_build_vars(cmd, build) return cmd From d33907606e63e6a7b3eaa6161eea0a6e44687105 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 11 Oct 2022 13:56:28 +0200 Subject: [PATCH 0845/2116] gitlab-ci: install sdkmanager from bullseye-backports --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 232ec136..7727ee2b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -369,7 +369,7 @@ fdroid build: - ln -fsv "$CI_PROJECT_DIR" "$fdroidserver" # TODO remove sdkmanager install once it is included in the buildserver image - - pip3 install git+https://gitlab.com/fdroid/sdkmanager.git@0.5.2 + - apt-get install sdkmanager - rm -rf "$ANDROID_HOME/tools" # TODO remove once sdkmanager can upgrade installed packages - sdkmanager "tools" "platform-tools" "build-tools;31.0.0" From b58eaa224b3d0af98f1e27d8965c0fce5387c2c5 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 11 Oct 2022 11:28:26 +0200 Subject: [PATCH 0846/2116] buildserver: include apksigner for Binaries: verification Verification of Binaries: happens in the buildserver VM first, so it needs a matching version of apksigner as the rest of the process. This fixes: https://gitlab.com/fdroid/fdroidserver/-/jobs/3154772374 --- buildserver/provision-apt-get-install | 1 + 1 file changed, 1 insertion(+) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index a975ac74..c29cd39c 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -51,6 +51,7 @@ apt-get upgrade apt-get update || apt-get update packages=" + apksigner/bullseye-backports default-jdk-headless default-jre-headless dexdump From 47cbc47346ca8d8a8f5183402103ded696ac5a8e Mon Sep 17 00:00:00 2001 From: linsui Date: Tue, 11 Oct 2022 18:09:05 +0800 Subject: [PATCH 0847/2116] Pre-install git-svn and mercurial --- buildserver/provision-apt-get-install | 2 ++ 1 file changed, 2 insertions(+) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index c29cd39c..52cbbba7 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -56,7 +56,9 @@ packages=" default-jre-headless dexdump fdroidserver + git-svn gnupg + mercurial patch rsync sudo From 759fa3b40a9e2d4ad783768dc6bd25fc9004dd44 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 11 Oct 2022 16:21:59 +0200 Subject: [PATCH 0848/2116] buildserver: fix apksigner install Adding /bullseye-backports confuses things apparently. Without it, apt will look in bullseye-backports automatically, including for deps. But it will not look for deps in bullseye-backports if /bullseye-backports is used. !1205 --- buildserver/provision-apt-get-install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index 52cbbba7..b2c60a6c 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -51,7 +51,7 @@ apt-get upgrade apt-get update || apt-get update packages=" - apksigner/bullseye-backports + apksigner default-jdk-headless default-jre-headless dexdump From 29838a8baeed0cc36f2aea36b78772c7a181f29c Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 5 Oct 2022 14:31:42 +0200 Subject: [PATCH 0849/2116] gitlab-ci: update alpine to supported version --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7727ee2b..37dd1dff 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -203,7 +203,7 @@ gradlew-fdroid: # Run all the various linters and static analysis tools. lint_format_safety_bandit_checks: - image: alpine:3.13 + image: alpine:3.16 variables: LANG: C.UTF-8 script: From 02a91cba66f8ac46cdfbc2561f2339b680bc5bd2 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 23 Sep 2022 10:58:05 +0200 Subject: [PATCH 0850/2116] update: only show missing ipfs_cid warning once. --- fdroidserver/common.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 45505fe9..2c642675 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -287,6 +287,9 @@ def fill_config_defaults(thisconfig): if not thisconfig.get('apksigner'): logging.warning(_('apksigner not found! Cannot sign or verify modern APKs')) + if 'ipfs_cid' not in thisconfig and shutil.which('ipfs_cid'): + logging.warning(_("ipfs_cid not found, skipping CIDv1 generation")) + for k in ['ndk_paths', 'java_paths']: d = thisconfig[k] for k2 in d.copy(): @@ -4144,17 +4147,15 @@ def run_yamllint(path, indent=0): def calculate_IPFS_cid(filename): - """ - Calculate the IPFS CID of a file and add it to the index. + """Calculate the IPFS CID of a file and add it to the index. uses ipfs_cid package at https://packages.debian.org/sid/ipfs-cid Returns CIDv1 of a file as per IPFS recommendation """ - exe_name = 'ipfs_cid' - if not set_command_in_config(exe_name) or not config.get(exe_name): - logging.info(_("%s not found, skipping CIDv1 generation") % exe_name) + cmd = config and config.get('ipfs_cid') + if not cmd: return - file_cid = subprocess.run([config[exe_name], filename], capture_output=True) + file_cid = subprocess.run([cmd, filename], capture_output=True) if file_cid.returncode == 0: cid_output = file_cid.stdout.decode() From 828eb938c33c472dff7fceaa931375f1acb96c45 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 5 Oct 2022 14:45:57 +0200 Subject: [PATCH 0851/2116] gradlew-fdroid: Gradle Android Plugin 7.3 needs Gradle 7.4 --- gradlew-fdroid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 571da45b..b07ccba7 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -196,8 +196,8 @@ contains() { # (key) should accept. plugin versions are actually prefixes and catch sub- # versions as well. Pairs are taken from: # https://developer.android.com/studio/releases/gradle-plugin#updating-gradle -d_plugin_k=(7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 1.3 1.2 1.1 1.0 0.14 0.13 0.12 0.11 0.10 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2) -d_plugin_v=(7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) +d_plugin_k=(7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 1.3 1.2 1.1 1.0 0.14 0.13 0.12 0.11 0.10 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2) +d_plugin_v=(7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about plugin_v=(7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) From 353ee84a6fc864fbf2d10165fa1514459292d962 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 5 Oct 2022 16:46:26 +0200 Subject: [PATCH 0852/2116] test that get_apk_id throws exceptions (issuebot#60) --- tests/common.TestCase | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/common.TestCase b/tests/common.TestCase index 26270a1b..ff260046 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -975,6 +975,17 @@ class CommonTest(unittest.TestCase): self.assertEqual(versionCode, vc, 'aapt versionCode parsing failed for ' + apkfilename) self.assertEqual(versionName, vn, 'aapt versionName parsing failed for ' + apkfilename) + def test_get_apk_id_bad_apk(self): + """get_apk_id should never return None on error, only raise exceptions""" + with self.assertRaises(KeyError): + fdroidserver.common.get_apk_id('Norway_bouvet_europe_2.obf.zip') + shutil.copy('Norway_bouvet_europe_2.obf.zip', self.tmpdir) + os.chdir(self.tmpdir) + with ZipFile('Norway_bouvet_europe_2.obf.zip', 'a') as zipfp: + zipfp.writestr('AndroidManifest.xml', 'not a manifest') + with self.assertRaises(KeyError): + fdroidserver.common.get_apk_id('Norway_bouvet_europe_2.obf.zip') + def test_get_apk_id_bad_path(self): with self.assertRaises(FDroidException): fdroidserver.common.get_apk_id('nope') From f97dc0d010c1a637fa821936fa003646785b70c4 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 6 Sep 2022 15:49:21 +0200 Subject: [PATCH 0853/2116] version 2.2 alpha 0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 1d2cf6c6..253637ec 100755 --- a/setup.py +++ b/setup.py @@ -82,7 +82,7 @@ with open("README.md", "r") as fh: setup( name='fdroidserver', - version='2.1', + version='2.2a0', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From ade0122d479b062757ebc07b0edc0f8378d0213e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 18 Apr 2022 17:49:07 +0200 Subject: [PATCH 0854/2116] fix ipfs_cid detection logic @obfusk caught this. I messed up in 02a91cba66f8ac46cdfbc2561f2339b680b from !1202 --- fdroidserver/common.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 2c642675..29572185 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -288,6 +288,8 @@ def fill_config_defaults(thisconfig): logging.warning(_('apksigner not found! Cannot sign or verify modern APKs')) if 'ipfs_cid' not in thisconfig and shutil.which('ipfs_cid'): + thisconfig['ipfs_cid'] = shutil.which('ipfs_cid') + if not thisconfig.get('ipfs_cid'): logging.warning(_("ipfs_cid not found, skipping CIDv1 generation")) for k in ['ndk_paths', 'java_paths']: From 8244ffa0ffa9d0995b97ba060305927fb5f1e7c5 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 25 Jul 2022 16:49:48 +0200 Subject: [PATCH 0855/2116] Allow pow in VercodeOperation (Closes: #1021) --- fdroidserver/common.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 29572185..c7df13e3 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4090,6 +4090,7 @@ def calculate_math_string(expr): ast.Mult: operator.mul, ast.Sub: operator.sub, ast.USub: operator.neg, + ast.Pow: operator.pow, } def execute_ast(node): From dfdd29131f86e88c3a5db2592f7be3f48992d669 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 12 Oct 2022 12:07:40 +0200 Subject: [PATCH 0856/2116] Write build/running.json only on build This should reduce the runtime. Also test if it was written. --- .gitlab-ci.yml | 2 ++ fdroidserver/build.py | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 37dd1dff..28633f26 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -400,6 +400,8 @@ fdroid build: # each `fdroid build --on-server` run expects sudo, then uninstalls it - if dpkg --list sudo; then echo "sudo should not be still there"; exit 1; fi + - 'if [ ! -f repo/status/running.json ]; then echo "ERROR: running.json does not exist!"; exit 1; fi' + - 'if [ ! -f repo/status/build.json ]; then echo "ERROR: build.json does not exist!"; exit 1; fi' # test the plugin API and specifically the fetchsrclibs plugin, which diff --git a/fdroidserver/build.py b/fdroidserver/build.py index ca37a4bb..cf27cc57 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -877,6 +877,9 @@ def trybuild(app, build, build_dir, output_dir, log_dir, also_check_dir, logging.info("Building version %s (%s) of %s" % ( build.versionName, build.versionCode, app.id)) + if not onserver: + common.write_running_status_json(status_output) + if server: # When using server mode, still keep a local cache of the repo, by # grabbing the source now. @@ -1070,6 +1073,9 @@ def main(): app['Builds'] = [build] break + if not options.onserver: + common.write_running_status_json(status_output) + # Build applications... failed_builds = [] build_succeeded = [] @@ -1105,7 +1111,6 @@ def main(): tools_version_log = '' if not options.onserver: tools_version_log = common.get_android_tools_version_log() - common.write_running_status_json(status_output) try: # For the first build of a particular app, we need to set up From fd9b911a42252064678c7ed1acaebab743afd75f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 Oct 2022 18:05:20 +0200 Subject: [PATCH 0857/2116] Dockerfile: apt-mark manual fdroidserver dependencies Then apt-get does not warn about unneeded deps that could be autoremoved. --- buildserver/Dockerfile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/buildserver/Dockerfile b/buildserver/Dockerfile index f974620e..647ef4a8 100644 --- a/buildserver/Dockerfile +++ b/buildserver/Dockerfile @@ -35,8 +35,8 @@ RUN useradd --create-home -s /bin/bash vagrant && echo -n 'vagrant:vagrant' | ch # Debian Docker images will soon default to HTTPS for apt sources, so force it. # https://github.com/debuerreotype/docker-debian-artifacts/issues/15 # -# Ensure fdroidserver is installed before purging unneeded packages, -# otherwise, all its dependencies get purged. +# Ensure fdroidserver's dependencies are marked manual before purging +# unneeded packages, otherwise, all its dependencies get purged. RUN printf "path-exclude=/usr/share/locale/*\npath-exclude=/usr/share/man/*\npath-exclude=/usr/share/doc/*\npath-include=/usr/share/doc/*/copyright\n" >/etc/dpkg/dpkg.cfg.d/01_nodoc \ && mkdir -p /usr/share/man/man1 \ && apt-get update \ @@ -57,9 +57,8 @@ RUN printf "path-exclude=/usr/share/locale/*\npath-exclude=/usr/share/man/*\npat && bash /opt/buildserver/provision-gradle \ && bash /opt/buildserver/provision-buildserverid $GIT_REV_PARSE_HEAD \ && rm -rf /vagrant/cache \ - && apt-get install fdroidserver \ + && apt-mark manual `apt-cache depends fdroidserver | sed -nE 's,^[| ]*Depends: ([a-z0-9 -]+),\1,p'` \ && apt-get autoremove --purge \ - && apt-get purge fdroidserver \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* From 300278e7c2283e8086ed513971e774f58e94428b Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 12 Oct 2022 17:53:08 +0000 Subject: [PATCH 0858/2116] remove transitional apt-transport-https package --- buildserver/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildserver/Dockerfile b/buildserver/Dockerfile index 647ef4a8..e1fe8804 100644 --- a/buildserver/Dockerfile +++ b/buildserver/Dockerfile @@ -40,7 +40,7 @@ RUN useradd --create-home -s /bin/bash vagrant && echo -n 'vagrant:vagrant' | ch RUN printf "path-exclude=/usr/share/locale/*\npath-exclude=/usr/share/man/*\npath-exclude=/usr/share/doc/*\npath-include=/usr/share/doc/*/copyright\n" >/etc/dpkg/dpkg.cfg.d/01_nodoc \ && mkdir -p /usr/share/man/man1 \ && apt-get update \ - && apt-get install apt-transport-https ca-certificates \ + && apt-get install ca-certificates \ && sed -i 's,http:,https:,' /etc/apt/sources.list \ && apt-get upgrade \ && apt-get dist-upgrade \ From 1d710947b947ab411f80b81ee1d76239a86830f3 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 18 May 2022 17:52:26 +0200 Subject: [PATCH 0859/2116] buildserver: stop installing 'android;m2repository' by default It is a huge package, it is rarely used, its not supported by fdroid/sdkmanager yet, and it is a pain to manage the install. If this breaks any app builds, the package can be installed as part of the build metadata. --- makebuildserver | 2 -- 1 file changed, 2 deletions(-) diff --git a/makebuildserver b/makebuildserver index aec0192e..11d132e2 100755 --- a/makebuildserver +++ b/makebuildserver @@ -139,8 +139,6 @@ CACHE_FILES = [ # Until we find a solution for that we need to stay at this revision. ('https://dl.google.com/android/repository/tools_r25.2.5-linux.zip', '577516819c8b5fae680f049d39014ff1ba4af870b687cab10595783e6f22d33e'), - ('https://dl.google.com/android/repository/android_m2repository_r47.zip', - 'a3f91808dce50c1717737de90c18479ed3a78b147e06985247d138e7ab5123d0'), ('https://dl.google.com/android/repository/android-2.1_r03.zip', 'b9cc140a9b879586181b22cfc7d4aa18b979251e16e9b17771c5d0acb71ba940'), ('https://dl.google.com/android/repository/android-2.2_r03.zip', From e4f1066bb1aa7ff65fa3000b0759e8533226ddd1 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 18 May 2022 22:41:17 +0200 Subject: [PATCH 0860/2116] stop installing ancient plaforms: 2.1 (7), 2.2 (8), 2.3 (9) fdroid/sdkmanager has bugs with some of these, and some of these have been taken down. https://dl.google.com/android/repository/android-2.3_r01-linux.zip gives a 404. --- makebuildserver | 6 ------ 1 file changed, 6 deletions(-) diff --git a/makebuildserver b/makebuildserver index 11d132e2..04ff5396 100755 --- a/makebuildserver +++ b/makebuildserver @@ -139,12 +139,6 @@ CACHE_FILES = [ # Until we find a solution for that we need to stay at this revision. ('https://dl.google.com/android/repository/tools_r25.2.5-linux.zip', '577516819c8b5fae680f049d39014ff1ba4af870b687cab10595783e6f22d33e'), - ('https://dl.google.com/android/repository/android-2.1_r03.zip', - 'b9cc140a9b879586181b22cfc7d4aa18b979251e16e9b17771c5d0acb71ba940'), - ('https://dl.google.com/android/repository/android-2.2_r03.zip', - '7c9ea1bd7cb225504bd085d7c93ae27d52bd88d29b621d28108f82fef68177c0'), - ('https://dl.google.com/android/repository/android-2.3.1_r02.zip', - 'b2ab4896d0a4857e4f688f69eb08b0e1a8074709d4445a92a83ece7ec7cd198c'), ('https://dl.google.com/android/repository/android-2.3.3_r02.zip', '54bdb0f1ca06ba5747061ddeea20f431af72c448334fd4d3d7f84ea2ccd29fea'), ('https://dl.google.com/android/repository/android-3.0_r02.zip', From daa5ad152e63ec24913d1e578c5455b2fb666fd3 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 22 Apr 2022 10:28:25 +0200 Subject: [PATCH 0861/2116] buildserver: install default SDK packages using fdroid/sdkmanager fdroid/sdkmanager provides a root of trust to verify all the packages it downloads, so it fully replaces what makebuildserver was doing. closes #927 --- buildserver/Dockerfile | 6 +- buildserver/provision-android-sdk | 144 +++++++++++++++----------- buildserver/provision-apt-get-install | 1 + makebuildserver | 117 --------------------- 4 files changed, 84 insertions(+), 184 deletions(-) diff --git a/buildserver/Dockerfile b/buildserver/Dockerfile index e1fe8804..fcb50974 100644 --- a/buildserver/Dockerfile +++ b/buildserver/Dockerfile @@ -48,11 +48,7 @@ RUN printf "path-exclude=/usr/share/locale/*\npath-exclude=/usr/share/man/*\npat && bash /opt/buildserver/setup-env-vars /opt/android-sdk \ && . /etc/profile.d/bsenv.sh \ && bash /opt/buildserver/provision-apt-get-install https://deb.debian.org/debian \ - && tools=tools_r25.2.5-linux.zip \ - && mkdir -p /vagrant/cache \ - && curl https://dl.google.com/android/repository/$tools > /vagrant/cache/$tools \ - && echo "577516819c8b5fae680f049d39014ff1ba4af870b687cab10595783e6f22d33e /vagrant/cache/$tools" | sha256sum -c \ - && bash /opt/buildserver/provision-android-sdk \ + && bash /opt/buildserver/provision-android-sdk "tools;25.2.5" \ && bash /opt/buildserver/provision-android-ndk /opt/android-sdk/ndk \ && bash /opt/buildserver/provision-gradle \ && bash /opt/buildserver/provision-buildserverid $GIT_REV_PARSE_HEAD \ diff --git a/buildserver/provision-android-sdk b/buildserver/provision-android-sdk index ac3a0b99..c591642e 100644 --- a/buildserver/provision-android-sdk +++ b/buildserver/provision-android-sdk @@ -1,5 +1,4 @@ #!/bin/bash -# echo $0 set -e @@ -10,19 +9,6 @@ if [ -z $ANDROID_HOME ]; then exit 1 fi -# TODO remove the rm, this should work with an existing ANDROID_HOME -if [ ! -x $ANDROID_HOME/tools/android ]; then - rm -rf $ANDROID_HOME - mkdir ${ANDROID_HOME} - mkdir ${ANDROID_HOME}/temp - mkdir ${ANDROID_HOME}/platforms - mkdir ${ANDROID_HOME}/build-tools - cd $ANDROID_HOME - - tools=`ls -1 /vagrant/cache/tools_*.zip | sort -n | tail -1` - unzip -qq $tools -fi - # disable the repositories of proprietary stuff disabled=" @version@=1 @@ -40,59 +26,92 @@ for line in $disabled; do echo $line >> ${HOME}/.android/sites-settings.cfg done - -cd /vagrant/cache - -# make links for `android update sdk` to use and delete -blocklist="build-tools_r17-linux.zip - build-tools_r18.0.1-linux.zip - build-tools_r18.1-linux.zip - build-tools_r18.1.1-linux.zip - build-tools_r19-linux.zip - build-tools_r19.0.1-linux.zip - build-tools_r19.0.2-linux.zip - build-tools_r19.0.3-linux.zip - build-tools_r21-linux.zip - build-tools_r21.0.1-linux.zip - build-tools_r21.0.2-linux.zip - build-tools_r21.1-linux.zip - build-tools_r21.1.1-linux.zip - build-tools_r22-linux.zip - build-tools_r23-linux.zip - android-1.5_r04-linux.zip - android-1.6_r03-linux.zip - android-2.0_r01-linux.zip - android-2.0.1_r01-linux.zip" -latestm2=`ls -1 android_m2repository*.zip | sort -n | tail -1` -for f in $latestm2 android-[0-9]*.zip platform-[0-9]*.zip build-tools_r*-linux.zip; do - rm -f ${ANDROID_HOME}/temp/$f - if [[ $blocklist != *$f* ]]; then - ln -s /vagrant/cache/$f ${ANDROID_HOME}/temp/ - fi +# Include old makebuildserver cache that is a Vagrant synced_folder +# for sdkmanager to use. +cachedir=$HOME/.cache/sdkmanager +mkdir -p $cachedir +pushd $cachedir +for f in /vagrant/cache/*.zip; do + test -e $f && ln -s $f done +popd -# install all cached platforms -cached="" -for f in `ls -1 android-[0-9]*.zip platform-[0-9]*.zip`; do - sdk=`unzip -c $f "*/build.prop" | sed -n 's,^ro.build.version.sdk=,,p'` - cached=,android-${sdk}${cached} -done +# TODO do not preinstall 'tools' or 'platform-tools' at all, app builds don't need them +packages=" + tools;25.2.5 + platform-tools + build-tools;19.1.0 + build-tools;20.0.0 + build-tools;21.1.2 + build-tools;22.0.1 + build-tools;23.0.1 + build-tools;23.0.2 + build-tools;23.0.3 + build-tools;24.0.0 + build-tools;24.0.1 + build-tools;24.0.2 + build-tools;24.0.3 + build-tools;25.0.0 + build-tools;25.0.1 + build-tools;25.0.2 + build-tools;25.0.3 + build-tools;26.0.0 + build-tools;26.0.1 + build-tools;26.0.2 + build-tools;26.0.3 + build-tools;27.0.0 + build-tools;27.0.1 + build-tools;27.0.2 + build-tools;27.0.3 + build-tools;28.0.0 + build-tools;28.0.1 + build-tools;28.0.2 + build-tools;28.0.3 + build-tools;29.0.2 + build-tools;29.0.3 + build-tools;30.0.0 + build-tools;30.0.1 + build-tools;30.0.2 + build-tools;30.0.3 + build-tools;31.0.0 + platforms;android-10 + platforms;android-11 + platforms;android-12 + platforms;android-13 + platforms;android-14 + platforms;android-15 + platforms;android-16 + platforms;android-17 + platforms;android-18 + platforms;android-19 + platforms;android-20 + platforms;android-21 + platforms;android-22 + platforms;android-23 + platforms;android-24 + platforms;android-25 + platforms;android-26 + platforms;android-27 + platforms;android-28 + platforms;android-29 + platforms;android-30 + platforms;android-31 +" -# install all cached build-tools -for f in `ls -1 build-tools*.zip`; do - ver=`unzip -c $f "*/source.properties" | sed -n 's,^Pkg.Revision=,,p'` - if [[ $ver == 24.0.0 ]] && [[ $f =~ .*r24\.0\.1.* ]]; then - # 24.0.1 has the wrong revision in the zip - ver=24.0.1 - fi - cached=,build-tools-${ver}${cached} -done +if [ $# -gt 0 ]; then + echo found args + packages=$@ +fi -${ANDROID_HOME}/tools/android update sdk --no-ui --all \ - --filter platform-tools,extra-android-m2repository${cached} < Date: Wed, 12 Oct 2022 20:14:27 +0200 Subject: [PATCH 0862/2116] add missing build-tools and platforms --- buildserver/provision-android-sdk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/buildserver/provision-android-sdk b/buildserver/provision-android-sdk index c591642e..4bf66389 100644 --- a/buildserver/provision-android-sdk +++ b/buildserver/provision-android-sdk @@ -74,6 +74,8 @@ packages=" build-tools;30.0.2 build-tools;30.0.3 build-tools;31.0.0 + build-tools;32.0.0 + build-tools;33.0.0 platforms;android-10 platforms;android-11 platforms;android-12 @@ -96,6 +98,8 @@ packages=" platforms;android-29 platforms;android-30 platforms;android-31 + platforms;android-32 + platforms;android-33 " if [ $# -gt 0 ]; then From 06b815092230296e8b27e890823d81e86be69ebd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 13 Oct 2022 10:53:25 +0200 Subject: [PATCH 0863/2116] scanner: fix loading config.yml With my last merge request I accidentally intoduced a bug where scanner.py stopped loading 'config.yml' because the helper functions from common.py get called in the wrong places. This change fixes this issue. --- fdroidserver/common.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index c7df13e3..98d1052c 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -336,8 +336,6 @@ def get_config(opts=None): if config is not None: return config - config = {} - common.fill_config_defaults(config) common.read_config(opts=opts) # make sure these values are available in common.py even if they didn't From 9c0d50a9b238bb5908174fcb155126dd4ca47a0e Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 13 Oct 2022 08:29:31 +0200 Subject: [PATCH 0864/2116] Sync status json after every build dfdd2913 the logic to only write the status json upon build but before the build happens. This makes sure that it is written after a successful build or exception. --- fdroidserver/build.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index cf27cc57..8cbc492a 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -877,9 +877,6 @@ def trybuild(app, build, build_dir, output_dir, log_dir, also_check_dir, logging.info("Building version %s (%s) of %s" % ( build.versionName, build.versionCode, app.id)) - if not onserver: - common.write_running_status_json(status_output) - if server: # When using server mode, still keep a local cache of the repo, by # grabbing the source now. @@ -1199,6 +1196,9 @@ def main(): build_succeeded.append(app) build_succeeded_ids.append([app['id'], build.versionCode]) + if not options.onserver: + common.write_running_status_json(status_output) + except VCSException as vcse: reason = str(vcse).split('\n', 1)[0] if options.verbose else str(vcse) logging.error("VCS error while building app %s: %s" % ( @@ -1210,6 +1210,9 @@ def main(): common.deploy_build_log_with_rsync( appid, build.versionCode, "".join(traceback.format_exc()) ) + if not options.onserver: + common.write_running_status_json(status_output) + except FDroidException as e: tstamp = time.strftime("%Y-%m-%d %H:%M:%SZ", time.gmtime()) with open(os.path.join(log_dir, appid + '.log'), 'a+') as f: @@ -1228,6 +1231,9 @@ def main(): common.deploy_build_log_with_rsync( appid, build.versionCode, "".join(traceback.format_exc()) ) + if not options.onserver: + common.write_running_status_json(status_output) + except Exception as e: logging.error("Could not build app %s due to unknown error: %s" % ( appid, traceback.format_exc())) @@ -1238,6 +1244,8 @@ def main(): common.deploy_build_log_with_rsync( appid, build.versionCode, "".join(traceback.format_exc()) ) + if not options.onserver: + common.write_running_status_json(status_output) if timer: timer.cancel() # kill the watchdog timer From b4d25d2834761ffade7b3e94091b57ce7449df53 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 18 Apr 2022 17:49:07 +0200 Subject: [PATCH 0865/2116] makebuildserver: use `vagrant package`; purge custom code Years ago, vagrant-libvirt did not implement the `vagrant package` command that we needed, and there were no Ruby people around to implement it for us. So we hacked a custom version in our Python wrapper. Now, vagrant-libvirt v0.7.0 does implement it, so this switches things to just using `vagrant package` --- fdroidserver/vmtools.py | 182 ---------------------------------------- makebuildserver | 2 +- 2 files changed, 1 insertion(+), 183 deletions(-) diff --git a/fdroidserver/vmtools.py b/fdroidserver/vmtools.py index 9462e446..16f2b605 100644 --- a/fdroidserver/vmtools.py +++ b/fdroidserver/vmtools.py @@ -18,16 +18,13 @@ from os.path import isdir, isfile, basename, abspath, expanduser import os -import math import json -import tarfile import shutil import subprocess import textwrap import logging from .common import FDroidException -from fdroidserver import _ import threading lock = threading.Lock() @@ -283,9 +280,6 @@ class FDroidBuildVm: except subprocess.CalledProcessError as e: logging.debug('pruning global vagrant status failed: %s', e) - def package(self, output=None): - self.vgrnt.package(output=output) - def vagrant_uuid_okay(self): """Having an uuid means that vagrant up has run successfully.""" if self.srvuuid is None: @@ -379,18 +373,6 @@ class FDroidBuildVm: except subprocess.CalledProcessError as e: raise FDroidBuildVmException("Error getting ssh config") from e - def snapshot_create(self, snapshot_name): - raise NotImplementedError('not implemented, please use a sub-type instance') - - def snapshot_list(self): - raise NotImplementedError('not implemented, please use a sub-type instance') - - def snapshot_exists(self, snapshot_name): - raise NotImplementedError('not implemented, please use a sub-type instance') - - def snapshot_revert(self, snapshot_name): - raise NotImplementedError('not implemented, please use a sub-type instance') - class LibvirtBuildVm(FDroidBuildVm): def __init__(self, srvdir): @@ -421,95 +403,6 @@ class LibvirtBuildVm(FDroidBuildVm): except subprocess.CalledProcessError as e: logging.info("could not undefine libvirt domain '%s': %s", self.srvname, e) - def package(self, output=None, keep_box_file=False): - if not output: - output = "buildserver.box" - logging.debug("no output name set for packaging '%s', " - "defaulting to %s", self.srvname, output) - storagePool = self.conn.storagePoolLookupByName('default') - domainInfo = self.conn.lookupByName(self.srvname).info() - if storagePool: - - if isfile('metadata.json'): - os.remove('metadata.json') - if isfile('Vagrantfile'): - os.remove('Vagrantfile') - if isfile('box.img'): - os.remove('box.img') - - logging.debug('preparing box.img for box %s', output) - vol = storagePool.storageVolLookupByName(self.srvname + '.img') - imagepath = vol.path() - # TODO use a libvirt storage pool to ensure the img file is readable - if not os.access(imagepath, os.R_OK): - logging.warning(_('Cannot read "{path}"!').format(path=imagepath)) - _check_call( - ['sudo', '/bin/chmod', '-R', 'a+rX', '/var/lib/libvirt/images'] - ) - shutil.copy2(imagepath, 'box.img') - _check_call(['qemu-img', 'rebase', '-p', '-b', '', 'box.img']) - img_info_raw = _check_output( - ['qemu-img', 'info', '--output=json', 'box.img'] - ) - img_info = json.loads(img_info_raw.decode('utf-8')) - metadata = { - "provider": "libvirt", - "format": img_info['format'], - "virtual_size": math.ceil(img_info['virtual-size'] / (1024.0 ** 3)), - } - - logging.debug('preparing metadata.json for box %s', output) - with open('metadata.json', 'w') as fp: - fp.write(json.dumps(metadata)) - logging.debug('preparing Vagrantfile for box %s', output) - vagrantfile = textwrap.dedent( - """\ - Vagrant.configure("2") do |config| - - config.vm.provider :libvirt do |libvirt| - - libvirt.driver = "kvm" - libvirt.host = "" - libvirt.connect_via_ssh = false - libvirt.storage_pool_name = "default" - libvirt.cpus = {cpus} - libvirt.memory = {memory} - - end - end""".format_map( - { - 'memory': str(int(domainInfo[1] / 1024)), - 'cpus': str(domainInfo[3]), - } - ) - ) - with open('Vagrantfile', 'w') as fp: - fp.write(vagrantfile) - try: - import libarchive - - with libarchive.file_writer(output, 'gnutar', 'gzip') as tar: - logging.debug('adding files to box %s ...', output) - tar.add_files('metadata.json', 'Vagrantfile', 'box.img') - except (ImportError, AttributeError): - with tarfile.open(output, 'w:gz') as tar: - logging.debug('adding metadata.json to box %s ...', output) - tar.add('metadata.json') - logging.debug('adding Vagrantfile to box %s ...', output) - tar.add('Vagrantfile') - logging.debug('adding box.img to box %s ...', output) - tar.add('box.img') - - if not keep_box_file: - logging.debug('box packaging complete, removing temporary files.') - os.remove('metadata.json') - os.remove('Vagrantfile') - os.remove('box.img') - - else: - logging.warning("could not connect to storage-pool 'default', " - "skip packaging buildserver box") - def box_add(self, boxname, boxfile, force=True): boximg = '%s_vagrant_box_image_0.img' % (boxname) if force: @@ -530,84 +423,9 @@ class LibvirtBuildVm(FDroidBuildVm): except subprocess.CalledProcessError as e: logging.debug("tried removing '%s', file was not present in first place", boxname, exc_info=e) - def snapshot_create(self, snapshot_name): - logging.info("creating snapshot '%s' for vm '%s'", snapshot_name, self.srvname) - try: - _check_call(['virsh', '-c', 'qemu:///system', 'snapshot-create-as', self.srvname, snapshot_name]) - except subprocess.CalledProcessError as e: - raise FDroidBuildVmException("could not create snapshot '%s' " - "of libvirt vm '%s'" - % (snapshot_name, self.srvname)) from e - - def snapshot_list(self): - import libvirt - try: - dom = self.conn.lookupByName(self.srvname) - return dom.listAllSnapshots() - except libvirt.libvirtError as e: - raise FDroidBuildVmException('could not list snapshots for domain \'%s\'' % self.srvname) from e - - def snapshot_exists(self, snapshot_name): - import libvirt - - try: - dom = self.conn.lookupByName(self.srvname) - return dom.snapshotLookupByName(snapshot_name) is not None - except libvirt.libvirtError: - return False - - def snapshot_revert(self, snapshot_name): - logging.info("reverting vm '%s' to snapshot '%s'", self.srvname, snapshot_name) - import libvirt - - try: - dom = self.conn.lookupByName(self.srvname) - snap = dom.snapshotLookupByName(snapshot_name) - dom.revertToSnapshot(snap) - except libvirt.libvirtError as e: - raise FDroidBuildVmException('could not revert domain \'%s\' to snapshot \'%s\'' - % (self.srvname, snapshot_name)) from e - class VirtualboxBuildVm(FDroidBuildVm): def __init__(self, srvdir): self.provider = 'virtualbox' super().__init__(srvdir) - - def snapshot_create(self, snapshot_name): - logging.info("creating snapshot '%s' for vm '%s'", snapshot_name, self.srvname) - try: - _check_call(['VBoxManage', 'snapshot', self.srvuuid, 'take', 'fdroidclean'], cwd=self.srvdir) - except subprocess.CalledProcessError as e: - raise FDroidBuildVmException('could not cerate snapshot ' - 'of virtualbox vm %s' - % self.srvname) from e - - def snapshot_list(self): - try: - o = _check_output(['VBoxManage', 'snapshot', - self.srvuuid, 'list', - '--details'], cwd=self.srvdir) - return o - except subprocess.CalledProcessError as e: - raise FDroidBuildVmException("could not list snapshots " - "of virtualbox vm '%s'" - % (self.srvname)) from e - - def snapshot_exists(self, snapshot_name): - try: - return str(snapshot_name) in str(self.snapshot_list()) - except FDroidBuildVmException: - return False - - def snapshot_revert(self, snapshot_name): - logging.info("reverting vm '%s' to snapshot '%s'", - self.srvname, snapshot_name) - try: - _check_call(['VBoxManage', 'snapshot', self.srvuuid, - 'restore', 'fdroidclean'], cwd=self.srvdir) - except subprocess.CalledProcessError as e: - raise FDroidBuildVmException("could not load snapshot " - "'fdroidclean' for vm '%s'" - % (self.srvname)) from e diff --git a/makebuildserver b/makebuildserver index d78ede84..bf165730 100755 --- a/makebuildserver +++ b/makebuildserver @@ -426,7 +426,7 @@ def main(): if os.path.exists(boxfile): os.remove(boxfile) - vm.package(output=boxfile) + v.package(output=boxfile) logging.info("Adding box") vm.box_add('buildserver', boxfile, force=True) From 9089750277891204219b769e67093b85705325f3 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 18 May 2022 21:20:25 +0200 Subject: [PATCH 0866/2116] buildserver: show informative message if Vagrant is not configed --- buildserver/Vagrantfile | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/buildserver/Vagrantfile b/buildserver/Vagrantfile index 57509ffe..89ab1940 100644 --- a/buildserver/Vagrantfile +++ b/buildserver/Vagrantfile @@ -2,7 +2,13 @@ require 'yaml' require 'pathname' srvpath = Pathname.new(File.dirname(__FILE__)).realpath -configfile = YAML.load_file(File.join(srvpath, "/Vagrantfile.yaml")) +configpath = File.join(srvpath, "/Vagrantfile.yaml") +if File.exists? configpath + configfile = YAML.load_file(configpath) +else + puts "#{configpath} does not exist, run ./makebuildserver?" + configfile = Hash.new +end Vagrant.configure("2") do |config| From 6f73a87eb190741a2889e4940e07b4cb931a4ac4 Mon Sep 17 00:00:00 2001 From: linsui Date: Wed, 14 Sep 2022 09:45:19 +0800 Subject: [PATCH 0867/2116] fix typo: Build -> Builds --- fdroidserver/metadata.py | 2 +- tests/metadata.TestCase | 8 ++++++++ tests/update.TestCase | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index d69fb6f1..15f5779d 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -203,7 +203,7 @@ fieldtypes = { 'Categories': TYPE_LIST, 'AntiFeatures': TYPE_LIST, 'AllowedAPKSigningKeys': TYPE_LIST, - 'Build': TYPE_BUILD, + 'Builds': TYPE_BUILD, } diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 07d8edcf..607dc92f 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -46,6 +46,14 @@ class MetadataTest(unittest.TestCase): # TODO: Python3.6: Accepts a path-like object. os.chdir(str(self.basedir)) + def test_fieldtypes_key_exist(self): + for k in fdroidserver.metadata.fieldtypes.keys(): + self.assertTrue(k in fdroidserver.metadata.yaml_app_fields) + + def test_build_flagtypes_key_exist(self): + for k in fdroidserver.metadata.flagtypes.keys(): + self.assertTrue(k in fdroidserver.metadata.build_flags) + def test_FieldValidator_BitcoinAddress(self): validator = None for vali in fdroidserver.metadata.valuetypes: diff --git a/tests/update.TestCase b/tests/update.TestCase index 7e7f8583..7c669760 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1424,7 +1424,7 @@ class UpdateTest(unittest.TestCase): 'AutoUpdateMode': '', 'Binaries': '', 'Bitcoin': '', - 'Builds': '', + 'Builds': None, 'Changelog': '', 'CurrentVersion': '', 'CurrentVersionCode': '', From 5a28f20301a0172a9d1ed936caff32d5823bd114 Mon Sep 17 00:00:00 2001 From: linsui Date: Wed, 14 Sep 2022 09:45:24 +0800 Subject: [PATCH 0868/2116] make versionCode/build.timeout an integer Co-authored-by: Jochen Sprickerhof --- .gitlab-ci.yml | 5 + fdroidserver/build.py | 12 +- fdroidserver/checkupdates.py | 40 +++--- fdroidserver/common.py | 36 ++--- fdroidserver/import_subcommand.py | 2 +- fdroidserver/index.py | 26 ++-- fdroidserver/lint.py | 19 ++- fdroidserver/metadata.py | 33 +++-- fdroidserver/update.py | 32 +++-- tests/build.TestCase | 52 +++---- tests/checkupdates.TestCase | 14 +- tests/common.TestCase | 102 ++++++------- tests/import_subcommand.TestCase | 4 +- tests/index.TestCase | 2 +- tests/metadata/dump/com.politedroid.yaml | 10 +- tests/metadata/dump/org.adaway.yaml | 58 ++++---- .../dump/org.smssecure.smssecure.yaml | 18 +-- tests/metadata/dump/org.videolan.vlc.yaml | 134 +++++++++--------- tests/scanner.TestCase | 2 +- tests/update.TestCase | 2 +- 20 files changed, 308 insertions(+), 295 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 28633f26..90b6341d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -55,6 +55,11 @@ metadata_v0: - git checkout $GITCOMMIT - cd fdroiddata - ../tests/dump_internal_metadata_format.py + - sed -i + -e "s/CurrentVersionCode:.'\([0-9]*\)'/CurrentVersionCode:\1/" + -e "s/ versionCode:.'\([0-9]*\)'/ versionCode:\1/" + -e "s/ timeout:.'\([0-9]*\)'/ timeout:\1/" + metadata/dump_*/*.yaml - diff -uw metadata/dump_* .apt-template: &apt-template diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 8cbc492a..0549bb48 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -336,7 +336,7 @@ def transform_first_char(string, method): def add_failed_builds_entry(failed_builds, appid, build, entry): - failed_builds.append([appid, int(build.versionCode), str(entry)]) + failed_builds.append([appid, build.versionCode, str(entry)]) def get_metadata_from_apk(app, build, apkfile): @@ -807,10 +807,10 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext vercode, version = get_metadata_from_apk(app, build, src) if version != build.versionName or vercode != build.versionCode: raise BuildException(("Unexpected version/version code in output;" - " APK: '%s' / '%s', " - " Expected: '%s' / '%s'") - % (version, str(vercode), build.versionName, - str(build.versionCode))) + " APK: '%s' / '%d', " + " Expected: '%s' / '%d'") + % (version, vercode, build.versionName, + build.versionCode)) if (options.scan_binary or config.get('scan_binary')) and not options.skipscan: if scanner.scan_binary(src): raise BuildException("Found blocklisted packages in final apk!") @@ -1096,7 +1096,7 @@ def main(): if build.timeout is None: timeout = 7200 else: - timeout = int(build.timeout) + timeout = build.timeout if options.server and timeout > 0: logging.debug(_('Setting {0} sec timeout for this build').format(timeout)) timer = threading.Timer(timeout, force_halt_build, [timeout]) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index aeda879f..ecba9ba6 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -65,7 +65,7 @@ def check_http(app): m = re.search(codeex, page) if not m: raise FDroidException("No RE match for version code") - vercode = m.group(1).strip() + vercode = common.version_code_string_to_int(m.group(1).strip()) if urlver != '.': logging.debug("...requesting {0}".format(urlver)) @@ -116,7 +116,7 @@ def check_tags(app, pattern): htag = None hver = None - hcode = "0" + hcode = 0 tags = [] if repotype == 'git': @@ -181,10 +181,10 @@ def check_tags(app, pattern): logging.debug("UpdateCheckData found version {0} ({1})" .format(version, vercode)) - i_vercode = common.version_code_string_to_int(vercode) - if i_vercode > common.version_code_string_to_int(hcode): + vercode = common.version_code_string_to_int(vercode) + if vercode > hcode: htag = tag - hcode = str(i_vercode) + hcode = vercode hver = version else: for subdir in possible_subdirs(app): @@ -196,10 +196,9 @@ def check_tags(app, pattern): if vercode: logging.debug("Manifest exists in subdir '{0}'. Found version {1} ({2})" .format(subdir, version, vercode)) - i_vercode = common.version_code_string_to_int(vercode) - if i_vercode > common.version_code_string_to_int(hcode): + if vercode > hcode: htag = tag - hcode = str(i_vercode) + hcode = vercode hver = version if hver: @@ -255,7 +254,7 @@ def check_repomanifest(app, branch=None): hpak = None hver = None - hcode = "0" + hcode = 0 for subdir in possible_subdirs(app): root_dir = build_dir / subdir paths = common.manifest_paths(root_dir, last_build.gradle) @@ -263,10 +262,9 @@ def check_repomanifest(app, branch=None): if vercode: logging.debug("Manifest exists in subdir '{0}'. Found version {1} ({2})" .format(subdir, version, vercode)) - i_vercode = common.version_code_string_to_int(vercode) - if i_vercode > common.version_code_string_to_int(hcode): + if vercode > hcode: hpak = package - hcode = str(i_vercode) + hcode = vercode hver = version if not hpak: @@ -460,11 +458,11 @@ def checkupdates_app(app): raise FDroidException(_('no version information found')) elif vercode == app.CurrentVersionCode: logging.debug("...up to date") - elif int(vercode) > int(app.CurrentVersionCode): + elif vercode > app.CurrentVersionCode: logging.debug("...updating - old vercode={0}, new vercode={1}".format( app.CurrentVersionCode, vercode)) app.CurrentVersion = version - app.CurrentVersionCode = str(int(vercode)) + app.CurrentVersionCode = vercode updating = True else: raise FDroidException( @@ -501,12 +499,12 @@ def checkupdates_app(app): gotcur = False latest = None for build in app.get('Builds', []): - if int(build.versionCode) >= int(app.CurrentVersionCode): + if build.versionCode >= app.CurrentVersionCode: gotcur = True - if not latest or int(build.versionCode) > int(latest.versionCode): + if not latest or build.versionCode > latest.versionCode: latest = build - if int(latest.versionCode) > int(app.CurrentVersionCode): + if latest.versionCode > app.CurrentVersionCode: raise FDroidException( _( 'latest build recipe is newer: old vercode={old}, new vercode={new}' @@ -517,13 +515,15 @@ def checkupdates_app(app): newbuild = copy.deepcopy(latest) newbuild.disable = False newbuild.versionCode = app.CurrentVersionCode - newbuild.versionName = app.CurrentVersion + suffix.replace('%c', newbuild.versionCode) + newbuild.versionName = app.CurrentVersion + suffix.replace( + '%c', str(newbuild.versionCode) + ) logging.info("...auto-generating build for " + newbuild.versionName) if tag: newbuild.commit = tag else: - commit = pattern.replace('%v', app.CurrentVersion) - commit = commit.replace('%c', newbuild.versionCode) + commit = pattern.replace('%v', str(app.CurrentVersion)) + commit = commit.replace('%c', str(newbuild.versionCode)) newbuild.commit = commit app['Builds'].append(newbuild) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 98d1052c..d8038cdf 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -712,11 +712,7 @@ def read_pkg_args(appid_versionCode_pairs, allow_vercodes=False): p = apk_regex.sub(r':\1', p) if allow_vercodes and ':' in p: package, vercode = p.split(':') - try: - i_vercode = int(vercode, 0) - except ValueError: - i_vercode = int(vercode) - vercode = str(i_vercode) + vercode = version_code_string_to_int(vercode) else: package, vercode = p, None if package not in vercodes: @@ -819,7 +815,7 @@ def publishednameinfo(filename): filename = os.path.basename(filename) m = publish_name_regex.match(filename) try: - result = (m.group(1), m.group(2)) + result = (m.group(1), int(m.group(2))) except AttributeError as exc: raise FDroidException(_("Invalid name for published file: %s") % filename) from exc return result @@ -846,10 +842,10 @@ def apk_parse_release_filename(apkname): """ m = apk_release_filename_with_sigfp.match(apkname) if m: - return m.group('appid'), m.group('vercode'), m.group('sigfp') + return m.group('appid'), int(m.group('vercode')), m.group('sigfp') m = apk_release_filename.match(apkname) if m: - return m.group('appid'), m.group('vercode'), None + return m.group('appid'), int(m.group('vercode')), None return None, None, None @@ -1803,7 +1799,7 @@ def parse_androidmanifests(paths, app): matches = vcsearch_g(line) if matches: - vercode = matches.group(1) + vercode = version_code_string_to_int(matches.group(1)) if inside_required_flavour > 0: if '{' in line: @@ -1841,7 +1837,7 @@ def parse_androidmanifests(paths, app): if not vercode: matches = vcsearch_g(line) if matches: - vercode = matches.group(1) + vercode = version_code_string_to_int(matches.group(1)) if not android_plugin_file and ANDROID_PLUGIN_REGEX.match(line): android_plugin_file = True if android_plugin_file: @@ -1868,9 +1864,8 @@ def parse_androidmanifests(paths, app): base_dir = os.path.dirname(path) version = retrieve_string_singleline(base_dir, version) if XMLNS_ANDROID + "versionCode" in xml.attrib: - a = xml.attrib[XMLNS_ANDROID + "versionCode"] - if string_is_integer(a): - vercode = a + vercode = version_code_string_to_int( + xml.attrib[XMLNS_ANDROID + "versionCode"]) # Remember package name, may be defined separately from version+vercode if package is None: @@ -2635,9 +2630,9 @@ def get_apk_id_androguard(apkfile): appid = value elif versionCode is None and name == 'versionCode': if value.startswith('0x'): - versionCode = str(int(value, 16)) + versionCode = int(value, 16) else: - versionCode = value + versionCode = int(value) elif versionName is None and name == 'versionName': versionName = value @@ -2657,12 +2652,15 @@ def get_apk_id_androguard(apkfile): def get_apk_id_aapt(apkfile): + """Read (appid, versionCode, versionName) from an APK.""" p = SdkToolsPopen(['aapt', 'dump', 'badging', apkfile], output=False) m = APK_ID_TRIPLET_REGEX.match(p.output[0:p.output.index('\n')]) if m: - return m.group(1), m.group(2), m.group(3) - raise FDroidException(_("Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'") - .format(apkfilename=apkfile)) + return m.group(1), int(m.group(2)), m.group(3) + raise FDroidException(_( + "Reading packageName/versionCode/versionName failed," + "APK invalid: '{apkfilename}'" + ).format(apkfilename=apkfile)) def get_native_code(apkfile): @@ -3859,6 +3857,8 @@ def string_is_integer(string): def version_code_string_to_int(vercode): """Convert an version code string of any base into an int.""" + # TODO: Python 3.6 allows underscores in numeric literals + vercode = vercode.replace('_', '') try: return int(vercode, 0) except ValueError: diff --git a/fdroidserver/import_subcommand.py b/fdroidserver/import_subcommand.py index 8f89148b..b9fe070a 100644 --- a/fdroidserver/import_subcommand.py +++ b/fdroidserver/import_subcommand.py @@ -311,7 +311,7 @@ def main(): # Create a build line... build.versionName = versionName or 'Unknown' - build.versionCode = versionCode or '0' # TODO heinous but this is still a str + build.versionCode = versionCode or 0 if options.subdir: build.subdir = options.subdir build.gradle = ['yes'] diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 24f8a56e..f4f5c08f 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -637,7 +637,7 @@ def convert_version(version, app, repodir): manifest[element] = version[element] if "versionCode" in version: - manifest["versionCode"] = int(version["versionCode"]) + manifest["versionCode"] = version["versionCode"] if "features" in version and version["features"]: manifest["features"] = features = [] @@ -684,12 +684,11 @@ def convert_version(version, app, repodir): ver["antiFeatures"][antif] = {} if "versionCode" in version: - if int(version["versionCode"]) > int(app["CurrentVersionCode"]): + if version["versionCode"] > app["CurrentVersionCode"]: ver["releaseChannels"] = ["Beta"] - versionCodeStr = str(version['versionCode']) # TODO build.versionCode should be int! for build in app.get('Builds', []): - if build['versionCode'] == versionCodeStr and "whatsNew" in build: + if build['versionCode'] == version['versionCode'] and "whatsNew" in build: ver["whatsNew"] = build["whatsNew"] break @@ -770,9 +769,8 @@ def make_v2(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ continue if not package.get('versionName'): app = apps[packageName] - versionCodeStr = str(package['versionCode']) # TODO build.versionCode should be int! for build in app.get('Builds', []): - if build['versionCode'] == versionCodeStr: + if build['versionCode'] == package['versionCode']: versionName = build.get('versionName') logging.info(_('Overriding blank versionName in {apkfilename} from metadata: {version}') .format(apkfilename=package['apkName'], version=versionName)) @@ -905,6 +903,7 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ k = 'packageName' elif k == 'CurrentVersionCode': # TODO make SuggestedVersionCode the canonical name k = 'suggestedVersionCode' + v = str(v) elif k == 'CurrentVersion': # TODO make SuggestedVersionName the canonical name k = 'suggestedVersionName' else: @@ -931,9 +930,8 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ continue if not package.get('versionName'): app = apps[packageName] - versionCodeStr = str(package['versionCode']) # TODO build.versionCode should be int! for build in app.get('Builds', []): - if build['versionCode'] == versionCodeStr: + if build['versionCode'] == package['versionCode']: versionName = build.get('versionName') logging.info(_('Overriding blank versionName in {apkfilename} from metadata: {version}') .format(apkfilename=package['apkName'], version=versionName)) @@ -1013,7 +1011,7 @@ def v1_sort_packages(packages, fdroid_signing_key_fingerprints): versionCode = None if package.get('versionCode', None): - versionCode = -int(package['versionCode']) + versionCode = -package['versionCode'] return packageName, group, signer, versionCode @@ -1179,7 +1177,7 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing # one is recommended. They are historically mis-named, and need # changing, but stay like this for now to support existing clients. addElement('marketversion', app.CurrentVersion, doc, apel) - addElement('marketvercode', app.CurrentVersionCode, doc, apel) + addElement('marketvercode', str(app.CurrentVersionCode), doc, apel) if app.Provides: pv = app.Provides.split(',') @@ -1214,7 +1212,7 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing for apk in apklist: file_extension = common.get_file_extension(apk['apkName']) # find the APK for the "Current Version" - if current_version_code < int(app.CurrentVersionCode): + if current_version_code < app.CurrentVersionCode: current_version_file = apk['apkName'] if current_version_code < apk['versionCode']: current_version_code = apk['versionCode'] @@ -1224,9 +1222,11 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing versionName = apk.get('versionName') if not versionName: - versionCodeStr = str(apk['versionCode']) # TODO build.versionCode should be int! for build in app.get('Builds', []): - if build['versionCode'] == versionCodeStr and 'versionName' in build: + if ( + build['versionCode'] == apk['versionCode'] + and 'versionName' in build + ): versionName = build['versionName'] break if versionName: diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 001e5a20..43b101a9 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -240,10 +240,10 @@ def get_lastbuild(builds): lastbuild = None for build in builds: if not build.disable: - vercode = int(build.versionCode) + vercode = build.versionCode if lowest_vercode == -1 or vercode < lowest_vercode: lowest_vercode = vercode - if not lastbuild or int(build.versionCode) > int(lastbuild.versionCode): + if not lastbuild or build.versionCode > lastbuild.versionCode: lastbuild = build return lastbuild @@ -327,13 +327,10 @@ filling_ucms = re.compile(r'^(Tags.*|RepoManifest.*)') def check_checkupdates_ran(app): if filling_ucms.match(app.UpdateCheckMode): - if ( - not app.AutoName - and not app.CurrentVersion - and app.CurrentVersionCode == '0' - ): + if not app.AutoName and not app.CurrentVersion and app.CurrentVersionCode == 0: yield _( - "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" + "UpdateCheckMode is set but it looks like" + "checkupdates hasn't been run yet" ) @@ -637,7 +634,7 @@ def check_current_version_code(app): if archive_policy and archive_policy.split()[0] == "0": return cv = app.get('CurrentVersionCode') - if cv is not None and int(cv) == 0: + if cv is not None and cv == 0: return builds = app.get('Builds') @@ -645,7 +642,7 @@ def check_current_version_code(app): min_versionCode = None if builds: for build in builds: - vc = int(build['versionCode']) + vc = build['versionCode'] if min_versionCode is None or min_versionCode > vc: min_versionCode = vc if not build.get('disable'): @@ -654,7 +651,7 @@ def check_current_version_code(app): break if active_builds == 0: return # all builds are disabled - if cv is not None and int(cv) < min_versionCode: + if cv is not None and cv < min_versionCode: yield ( _( 'CurrentVersionCode {cv} is less than oldest build entry {versionCode}' diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 15f5779d..c6cc4b6b 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -204,6 +204,7 @@ fieldtypes = { 'AntiFeatures': TYPE_LIST, 'AllowedAPKSigningKeys': TYPE_LIST, 'Builds': TYPE_BUILD, + 'CurrentVersionCode': TYPE_INT, } @@ -615,29 +616,31 @@ def split_list_values(s): def sorted_builds(builds): - return sorted(builds, key=lambda build: int(build.versionCode)) + return sorted(builds, key=lambda build: build.versionCode) esc_newlines = re.compile(r'\\( |\n)') def post_metadata_parse(app): - # TODO keep native types, convert only for .txt metadata - for k, v in app.items(): - if type(v) in (float, int): - app[k] = str(v) - if 'flavours' in app and app['flavours'] == [True]: app['flavours'] = 'yes' - for field, fieldtype in fieldtypes.items(): - if fieldtype != TYPE_LIST: - continue - value = app.get(field) - if isinstance(value, str): - app[field] = [value, ] - elif value is not None: - app[field] = [str(i) for i in value] + for k, v in app.items(): + if fieldtype(k) == TYPE_LIST: + if isinstance(v, str): + app[k] = [v, ] + elif v: + app[k] = [str(i) for i in v] + elif fieldtype(k) == TYPE_INT: + if v: + app[k] = int(v) + elif fieldtype(k) == TYPE_STRING: + if v: + app[k] = str(v) + else: + if type(v) in (float, int): + app[k] = str(v) def _yaml_bool_unmapable(v): return v in (True, False, [True], [False]) @@ -673,7 +676,7 @@ def post_metadata_parse(app): else: build[k] = [] elif flagtype(k) is TYPE_INT: - build[k] = str(v) + build[k] = v elif flagtype(k) is TYPE_STRING: if isinstance(v, bool) and k in _bool_allowed: build[k] = v diff --git a/fdroidserver/update.py b/fdroidserver/update.py index e6bea4bf..1ed8a3a8 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -168,7 +168,7 @@ def status_update_json(apps, apks): gotcurrentver = False for apk in apks: if apk['packageName'] == appid: - if str(apk['versionCode']) == app.get('CurrentVersionCode'): + if apk['versionCode'] == app.get('CurrentVersionCode'): gotcurrentver = True apklist.append(apk) validapks = 0 @@ -181,7 +181,7 @@ def status_update_json(apps, apks): if not build.get('disable'): builtit = False for apk in apklist: - if apk['versionCode'] == int(build.versionCode): + if apk['versionCode'] == build.versionCode: builtit = True validapks += 1 break @@ -493,8 +493,9 @@ def insert_obbs(repodir, apps, apks): if packagename == apk['packageName'] and apk['versionCode'] > highestVersionCode: highestVersionCode = apk['versionCode'] if versionCode > highestVersionCode: - obbWarnDelete(f, _('OBB file has newer versionCode({integer}) than any APK:') - .format(integer=str(versionCode))) + obbWarnDelete(f, _( + 'OBB file has newer versionCode({integer}) than any APK:' + ).format(integer=versionCode)) continue obbsha256 = common.sha256sum(f) obbs.append((packagename, versionCode, obbfile, obbsha256)) @@ -533,7 +534,7 @@ def translate_per_build_anti_features(apps, apks): for build in app.get('Builds', []): afl = build.get('antifeatures') if afl: - d[int(build.versionCode)] = afl + d[build.versionCode] = afl if len(d) > 0: antiFeatures[packageName] = d @@ -569,7 +570,7 @@ def _set_localized_text_entry(app, locale, key, f, versionCode=None): text = fp.read(limit * 2) if versionCode: for build in app["Builds"]: - if int(build["versionCode"]) == versionCode: + if build["versionCode"] == versionCode: if "whatsNew" not in build: build["whatsNew"] = collections.OrderedDict() build["whatsNew"][locale] = text[:limit] @@ -1002,9 +1003,16 @@ def insert_localized_app_metadata(apps): try: versionCode = int(base) locale = segments[-2] - if base in [a["versionCode"] for a in apps[packageName]["Builds"]]: - _set_localized_text_entry(apps[packageName], locale, 'whatsNew', - os.path.join(root, f), versionCode) + if versionCode in [ + a["versionCode"] for a in apps[packageName]["Builds"] + ]: + _set_localized_text_entry( + apps[packageName], + locale, + 'whatsNew', + os.path.join(root, f), + versionCode, + ) continue except ValueError: pass @@ -1477,7 +1485,7 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal if apps: if apk['packageName'] in apps: for build in apps[apk['packageName']].get('Builds', []): - if int(build['versionCode']) == apk['versionCode'] and build['disable']: + if build['versionCode'] == apk['versionCode'] and build['disable']: return True, None, False # Check for debuggable apks... @@ -1809,7 +1817,7 @@ def apply_info_from_latest_apk(apps, apks): else: app.icon = bestapk['icon'] if 'icon' in bestapk else None if app.get('CurrentVersionCode') is None: - app['CurrentVersionCode'] = str(bestver) + app['CurrentVersionCode'] = bestver def make_categories_txt(repodir, categories): @@ -1828,7 +1836,7 @@ def archive_old_apks(apps, apks, archapks, repodir, archivedir, defaultkeepversi for apk in apk_list: if apk['packageName'] == appid: if app.get('CurrentVersionCode') is not None: - if apk['versionCode'] == common.version_code_string_to_int(app['CurrentVersionCode']): + if apk['versionCode'] == app['CurrentVersionCode']: currentVersionApk = apk continue apkList.append(apk) diff --git a/tests/build.TestCase b/tests/build.TestCase index cca5fa0c..0bfee1be 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -71,42 +71,42 @@ class BuildTest(unittest.TestCase): ( 'repo/obb.main.twoversions_1101613.apk', 'obb.main.twoversions', - '1101613', + 1101613, '0.1', None, ), ( 'org.bitbucket.tickytacky.mirrormirror_1.apk', 'org.bitbucket.tickytacky.mirrormirror', - '1', + 1, '1.0', None, ), ( 'org.bitbucket.tickytacky.mirrormirror_2.apk', 'org.bitbucket.tickytacky.mirrormirror', - '2', + 2, '1.0.1', None, ), ( 'org.bitbucket.tickytacky.mirrormirror_3.apk', 'org.bitbucket.tickytacky.mirrormirror', - '3', + 3, '1.0.2', None, ), ( 'org.bitbucket.tickytacky.mirrormirror_4.apk', 'org.bitbucket.tickytacky.mirrormirror', - '4', + 4, '1.0.3', None, ), ( 'org.dyndns.fules.ck_20.apk', 'org.dyndns.fules.ck', - '20', + 20, 'v1.6pre2', [ 'arm64-v8a', @@ -118,81 +118,81 @@ class BuildTest(unittest.TestCase): 'x86_64', ], ), - ('urzip.apk', 'info.guardianproject.urzip', '100', '0.1', None), - ('urzip-badcert.apk', 'info.guardianproject.urzip', '100', '0.1', None), - ('urzip-badsig.apk', 'info.guardianproject.urzip', '100', '0.1', None), - ('urzip-release.apk', 'info.guardianproject.urzip', '100', '0.1', None), + ('urzip.apk', 'info.guardianproject.urzip', 100, '0.1', None), + ('urzip-badcert.apk', 'info.guardianproject.urzip', 100, '0.1', None), + ('urzip-badsig.apk', 'info.guardianproject.urzip', 100, '0.1', None), + ('urzip-release.apk', 'info.guardianproject.urzip', 100, '0.1', None), ( 'urzip-release-unsigned.apk', 'info.guardianproject.urzip', - '100', + 100, '0.1', None, ), - ('repo/com.politedroid_3.apk', 'com.politedroid', '3', '1.2', None), - ('repo/com.politedroid_4.apk', 'com.politedroid', '4', '1.3', None), - ('repo/com.politedroid_5.apk', 'com.politedroid', '5', '1.4', None), - ('repo/com.politedroid_6.apk', 'com.politedroid', '6', '1.5', None), + ('repo/com.politedroid_3.apk', 'com.politedroid', 3, '1.2', None), + ('repo/com.politedroid_4.apk', 'com.politedroid', 4, '1.3', None), + ('repo/com.politedroid_5.apk', 'com.politedroid', 5, '1.4', None), + ('repo/com.politedroid_6.apk', 'com.politedroid', 6, '1.5', None), ( 'repo/duplicate.permisssions_9999999.apk', 'duplicate.permisssions', - '9999999', + 9999999, '', None, ), ( 'repo/info.zwanenburg.caffeinetile_4.apk', 'info.zwanenburg.caffeinetile', - '4', + 4, '1.3', None, ), ( 'repo/obb.main.oldversion_1444412523.apk', 'obb.main.oldversion', - '1444412523', + 1444412523, '0.1', None, ), ( 'repo/obb.mainpatch.current_1619_another-release-key.apk', 'obb.mainpatch.current', - '1619', + 1619, '0.1', None, ), ( 'repo/obb.mainpatch.current_1619.apk', 'obb.mainpatch.current', - '1619', + 1619, '0.1', None, ), ( 'repo/obb.main.twoversions_1101613.apk', 'obb.main.twoversions', - '1101613', + 1101613, '0.1', None, ), ( 'repo/obb.main.twoversions_1101615.apk', 'obb.main.twoversions', - '1101615', + 1101615, '0.1', None, ), ( 'repo/obb.main.twoversions_1101617.apk', 'obb.main.twoversions', - '1101617', + 1101617, '0.1', None, ), ( 'repo/urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk', 'info.guardianproject.urzip', - '100', + 100, '0.1', None, ), @@ -228,7 +228,7 @@ class BuildTest(unittest.TestCase): build = fdroidserver.metadata.Build() build.commit = '1.0' build.output = app.id + '.apk' - build.versionCode = '1' + build.versionCode = 1 build.versionName = '1.0' build.ndk = 'r21e' # aka 21.4.7075529 vcs = mock.Mock() @@ -326,7 +326,7 @@ class BuildTest(unittest.TestCase): build.output = app.id + '.apk' build.scandelete = ['baz.so'] build.scanignore = ['foo.aar'] - build.versionCode = '1' + build.versionCode = 1 build.versionName = '1.0' vcs = mock.Mock() diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index 0a6fd135..ea59a63e 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -179,7 +179,7 @@ class CheckupdatesTest(unittest.TestCase): with mock.patch('urllib.request.urlopen', lambda a, b, c: respmock): vername, vercode = fdroidserver.checkupdates.check_http(app) self.assertEqual(vername, '1.1.9') - self.assertEqual(vercode, '10109') + self.assertEqual(vercode, 10109) def test_check_http_blocks_unknown_schemes(self): app = fdroidserver.metadata.App() @@ -230,7 +230,7 @@ class CheckupdatesTest(unittest.TestCase): mock_path.is_file.return_falue = True vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) self.assertEqual(vername, '1.1.9') - self.assertEqual(vercode, '10109') + self.assertEqual(vercode, 10109) app.UpdateCheckData = r'b.txt|c(.*)|.|v(.*)' with mock.patch( @@ -242,7 +242,7 @@ class CheckupdatesTest(unittest.TestCase): mock_path.is_file.return_falue = True vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) self.assertEqual(vername, '1.1.0') - self.assertEqual(vercode, '10109') + self.assertEqual(vercode, 10109) app.UpdateCheckData = r'b.txt|c(.*)||' with mock.patch( @@ -254,7 +254,7 @@ class CheckupdatesTest(unittest.TestCase): mock_path.is_file.return_falue = True vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) self.assertEqual(vername, '1.1.9') - self.assertEqual(vercode, '10109') + self.assertEqual(vercode, 10109) vcs.latesttags.return_value = ['Android-1.1.0', '1.1.8'] app.UpdateCheckData = r'b.txt|c(.*)||Android-([\d.]+)' @@ -267,21 +267,21 @@ class CheckupdatesTest(unittest.TestCase): mock_path.is_file.return_falue = True vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) self.assertEqual(vername, '1.1.0') - self.assertEqual(vercode, '10109') + self.assertEqual(vercode, 10109) app.UpdateCheckData = r'|\+(\d+)||Android-([\d.]+)' vcs.latesttags.return_value = ['Android-1.1.0+1'] with mock.patch('fdroidserver.common.getvcs', return_value=vcs): vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) self.assertEqual(vername, '1.1.0') - self.assertEqual(vercode, '1') + self.assertEqual(vercode, 1) app.UpdateCheckData = '|||' vcs.latesttags.return_value = ['2'] with mock.patch('fdroidserver.common.getvcs', return_value=vcs): vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) self.assertEqual(vername, '2') - self.assertEqual(vercode, '2') + self.assertEqual(vercode, 2) if __name__ == "__main__": diff --git a/tests/common.TestCase b/tests/common.TestCase index ff260046..3a301ee8 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -939,30 +939,30 @@ class CommonTest(unittest.TestCase): pass # aapt is not required if androguard is present testcases = [ - ('repo/obb.main.twoversions_1101613.apk', 'obb.main.twoversions', '1101613', '0.1'), - ('org.bitbucket.tickytacky.mirrormirror_1.apk', 'org.bitbucket.tickytacky.mirrormirror', '1', '1.0'), - ('org.bitbucket.tickytacky.mirrormirror_2.apk', 'org.bitbucket.tickytacky.mirrormirror', '2', '1.0.1'), - ('org.bitbucket.tickytacky.mirrormirror_3.apk', 'org.bitbucket.tickytacky.mirrormirror', '3', '1.0.2'), - ('org.bitbucket.tickytacky.mirrormirror_4.apk', 'org.bitbucket.tickytacky.mirrormirror', '4', '1.0.3'), - ('org.dyndns.fules.ck_20.apk', 'org.dyndns.fules.ck', '20', 'v1.6pre2'), - ('urzip.apk', 'info.guardianproject.urzip', '100', '0.1'), - ('urzip-badcert.apk', 'info.guardianproject.urzip', '100', '0.1'), - ('urzip-badsig.apk', 'info.guardianproject.urzip', '100', '0.1'), - ('urzip-release.apk', 'info.guardianproject.urzip', '100', '0.1'), - ('urzip-release-unsigned.apk', 'info.guardianproject.urzip', '100', '0.1'), - ('repo/com.politedroid_3.apk', 'com.politedroid', '3', '1.2'), - ('repo/com.politedroid_4.apk', 'com.politedroid', '4', '1.3'), - ('repo/com.politedroid_5.apk', 'com.politedroid', '5', '1.4'), - ('repo/com.politedroid_6.apk', 'com.politedroid', '6', '1.5'), - ('repo/duplicate.permisssions_9999999.apk', 'duplicate.permisssions', '9999999', ''), - ('repo/info.zwanenburg.caffeinetile_4.apk', 'info.zwanenburg.caffeinetile', '4', '1.3'), - ('repo/obb.main.oldversion_1444412523.apk', 'obb.main.oldversion', '1444412523', '0.1'), - ('repo/obb.mainpatch.current_1619_another-release-key.apk', 'obb.mainpatch.current', '1619', '0.1'), - ('repo/obb.mainpatch.current_1619.apk', 'obb.mainpatch.current', '1619', '0.1'), - ('repo/obb.main.twoversions_1101613.apk', 'obb.main.twoversions', '1101613', '0.1'), - ('repo/obb.main.twoversions_1101615.apk', 'obb.main.twoversions', '1101615', '0.1'), - ('repo/obb.main.twoversions_1101617.apk', 'obb.main.twoversions', '1101617', '0.1'), - ('repo/urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk', 'info.guardianproject.urzip', '100', '0.1'), + ('repo/obb.main.twoversions_1101613.apk', 'obb.main.twoversions', 1101613, '0.1'), + ('org.bitbucket.tickytacky.mirrormirror_1.apk', 'org.bitbucket.tickytacky.mirrormirror', 1, '1.0'), + ('org.bitbucket.tickytacky.mirrormirror_2.apk', 'org.bitbucket.tickytacky.mirrormirror', 2, '1.0.1'), + ('org.bitbucket.tickytacky.mirrormirror_3.apk', 'org.bitbucket.tickytacky.mirrormirror', 3, '1.0.2'), + ('org.bitbucket.tickytacky.mirrormirror_4.apk', 'org.bitbucket.tickytacky.mirrormirror', 4, '1.0.3'), + ('org.dyndns.fules.ck_20.apk', 'org.dyndns.fules.ck', 20, 'v1.6pre2'), + ('urzip.apk', 'info.guardianproject.urzip', 100, '0.1'), + ('urzip-badcert.apk', 'info.guardianproject.urzip', 100, '0.1'), + ('urzip-badsig.apk', 'info.guardianproject.urzip', 100, '0.1'), + ('urzip-release.apk', 'info.guardianproject.urzip', 100, '0.1'), + ('urzip-release-unsigned.apk', 'info.guardianproject.urzip', 100, '0.1'), + ('repo/com.politedroid_3.apk', 'com.politedroid', 3, '1.2'), + ('repo/com.politedroid_4.apk', 'com.politedroid', 4, '1.3'), + ('repo/com.politedroid_5.apk', 'com.politedroid', 5, '1.4'), + ('repo/com.politedroid_6.apk', 'com.politedroid', 6, '1.5'), + ('repo/duplicate.permisssions_9999999.apk', 'duplicate.permisssions', 9999999, ''), + ('repo/info.zwanenburg.caffeinetile_4.apk', 'info.zwanenburg.caffeinetile', 4, '1.3'), + ('repo/obb.main.oldversion_1444412523.apk', 'obb.main.oldversion', 1444412523, '0.1'), + ('repo/obb.mainpatch.current_1619_another-release-key.apk', 'obb.mainpatch.current', 1619, '0.1'), + ('repo/obb.mainpatch.current_1619.apk', 'obb.mainpatch.current', 1619, '0.1'), + ('repo/obb.main.twoversions_1101613.apk', 'obb.main.twoversions', 1101613, '0.1'), + ('repo/obb.main.twoversions_1101615.apk', 'obb.main.twoversions', 1101615, '0.1'), + ('repo/obb.main.twoversions_1101617.apk', 'obb.main.twoversions', 1101617, '0.1'), + ('repo/urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk', 'info.guardianproject.urzip', 100, '0.1'), ] for apkfilename, appid, versionCode, versionName in testcases: a, vc, vn = fdroidserver.common.get_apk_id(apkfilename) @@ -992,7 +992,7 @@ class CommonTest(unittest.TestCase): def test_get_apk_id_api_call(self): self.assertEqual( - ('info.guardianproject.urzip', '100', '0.1'), + ('info.guardianproject.urzip', 100, '0.1'), fdroidserver.common.get_apk_id('urzip.apk'), ) @@ -1089,12 +1089,12 @@ class CommonTest(unittest.TestCase): def test_apk_release_name(self): appid, vercode, sigfp = fdroidserver.common.apk_parse_release_filename('com.serwylo.lexica_905.apk') self.assertEqual(appid, 'com.serwylo.lexica') - self.assertEqual(vercode, '905') + self.assertEqual(vercode, 905) self.assertEqual(sigfp, None) appid, vercode, sigfp = fdroidserver.common.apk_parse_release_filename('com.serwylo.lexica_905_c82e0f6.apk') self.assertEqual(appid, 'com.serwylo.lexica') - self.assertEqual(vercode, '905') + self.assertEqual(vercode, 905) self.assertEqual(sigfp, 'c82e0f6') appid, vercode, sigfp = fdroidserver.common.apk_parse_release_filename('beverly_hills-90210.apk') @@ -1121,7 +1121,7 @@ class CommonTest(unittest.TestCase): ] for path in paths: self.assertTrue(os.path.isfile(path)) - self.assertEqual(('0.94-test', '940', 'org.fdroid.fdroid'), + self.assertEqual(('0.94-test', 940, 'org.fdroid.fdroid'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() @@ -1145,7 +1145,7 @@ class CommonTest(unittest.TestCase): ] for path in paths: self.assertTrue(os.path.isfile(path)) - self.assertEqual(('0.6.9', '23', 'cn.wildfirechat.chat'), + self.assertEqual(('0.6.9', 23, 'cn.wildfirechat.chat'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() @@ -1166,7 +1166,7 @@ class CommonTest(unittest.TestCase): ] for path in paths: self.assertTrue(os.path.isfile(path)) - self.assertEqual(('1.9.0', '170521', 'com.integreight.onesheeld'), + self.assertEqual(('1.9.0', 170521, 'com.integreight.onesheeld'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() @@ -1176,7 +1176,7 @@ class CommonTest(unittest.TestCase): ] for path in paths: self.assertTrue(os.path.isfile(path)) - self.assertEqual(('0.3.10', '29', 'dev.patrickgold.florisboard'), + self.assertEqual(('0.3.10', 29, 'dev.patrickgold.florisboard'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() @@ -1187,7 +1187,7 @@ class CommonTest(unittest.TestCase): ] for path in paths: self.assertTrue(os.path.isfile(path)) - self.assertEqual(('1.8.1', '1_08_01', None), + self.assertEqual(('1.8.1', 10801, None), fdroidserver.common.parse_androidmanifests(paths, app)) def test_parse_androidmanifests_ignore(self): @@ -1215,7 +1215,7 @@ class CommonTest(unittest.TestCase): ] for path in paths: self.assertTrue(os.path.isfile(path)) - self.assertEqual(('0.95-dev', '949', 'org.fdroid.fdroid.dev'), + self.assertEqual(('0.95-dev', 949, 'org.fdroid.fdroid.dev'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() @@ -1228,7 +1228,7 @@ class CommonTest(unittest.TestCase): ] for path in paths: self.assertTrue(os.path.isfile(path)) - self.assertEqual(('1.23.1', '245', 'eu.siacs.conversations'), + self.assertEqual(('1.23.1', 245, 'eu.siacs.conversations'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() @@ -1241,7 +1241,7 @@ class CommonTest(unittest.TestCase): ] for path in paths: self.assertTrue(os.path.isfile(path)) - self.assertEqual(('2.0.0', '20000099', 'com.nextcloud.client'), + self.assertEqual(('2.0.0', 20000099, 'com.nextcloud.client'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() @@ -1254,7 +1254,7 @@ class CommonTest(unittest.TestCase): ] for path in paths: self.assertTrue(os.path.isfile(path)) - self.assertEqual(('20171223', '20171223', 'com.nextcloud.android.beta'), + self.assertEqual(('20171223', 20171223, 'com.nextcloud.android.beta'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() @@ -1267,7 +1267,7 @@ class CommonTest(unittest.TestCase): ] for path in paths: self.assertTrue(os.path.isfile(path)) - self.assertEqual(('1.9.8.1-ose', '197', 'at.bitfire.davdroid'), + self.assertEqual(('1.9.8.1-ose', 197, 'at.bitfire.davdroid'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() @@ -1280,7 +1280,7 @@ class CommonTest(unittest.TestCase): ] for path in paths: self.assertTrue(os.path.isfile(path)) - self.assertEqual(('1.0-libre', '1', 'com.kunzisoft.fdroidtest.applicationidsuffix.libre'), + self.assertEqual(('1.0-libre', 1, 'com.kunzisoft.fdroidtest.applicationidsuffix.libre'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() @@ -1293,7 +1293,7 @@ class CommonTest(unittest.TestCase): ] for path in paths: self.assertTrue(os.path.isfile(path)) - self.assertEqual(('20180430-pro', '20180430', 'com.kunzisoft.fdroidtest.applicationidsuffix.pro'), + self.assertEqual(('20180430-pro', 20180430, 'com.kunzisoft.fdroidtest.applicationidsuffix.pro'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() @@ -1306,7 +1306,7 @@ class CommonTest(unittest.TestCase): ] for path in paths: self.assertTrue(os.path.isfile(path)) - self.assertEqual(('1.0-free', '1', 'com.kunzisoft.fdroidtest.applicationidsuffix'), + self.assertEqual(('1.0-free', 1, 'com.kunzisoft.fdroidtest.applicationidsuffix'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() @@ -1319,7 +1319,7 @@ class CommonTest(unittest.TestCase): ] for path in paths: self.assertTrue(os.path.isfile(path)) - self.assertEqual(('20180430-underscore', '2018_04_30', 'com.kunzisoft.fdroidtest.applicationidsuffix.underscore'), + self.assertEqual(('20180430-underscore', 20180430, 'com.kunzisoft.fdroidtest.applicationidsuffix.underscore'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() @@ -1332,7 +1332,7 @@ class CommonTest(unittest.TestCase): ] for path in paths: self.assertTrue(os.path.isfile(path)) - self.assertEqual(('1.0', '1', 'com.kunzisoft.fdroidtest.applicationidsuffix.underscore_first'), + self.assertEqual(('1.0', 1, 'com.kunzisoft.fdroidtest.applicationidsuffix.underscore_first'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() @@ -1345,7 +1345,7 @@ class CommonTest(unittest.TestCase): ] for path in paths: self.assertTrue(os.path.isfile(path)) - self.assertEqual(('2.5.2-fdroid', '73', 'com.github.jameshnsears.quoteunquote'), + self.assertEqual(('2.5.2-fdroid', 73, 'com.github.jameshnsears.quoteunquote'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() @@ -1358,7 +1358,7 @@ class CommonTest(unittest.TestCase): ] for path in paths: self.assertTrue(os.path.isfile(path)) - self.assertEqual(('1.6.34-fdroid', '105', 'com.jens.automation2'), + self.assertEqual(('1.6.34-fdroid', 105, 'com.jens.automation2'), fdroidserver.common.parse_androidmanifests(paths, app)) app = fdroidserver.metadata.App() @@ -1371,7 +1371,7 @@ class CommonTest(unittest.TestCase): ] for path in paths: self.assertTrue(os.path.isfile(path)) - self.assertEqual(('2021-06-30', '34', 'de.varengold.activeTAN'), + self.assertEqual(('2021-06-30', 34, 'de.varengold.activeTAN'), fdroidserver.common.parse_androidmanifests(paths, app)) def test_get_all_gradle_and_manifests(self): @@ -1598,7 +1598,7 @@ class CommonTest(unittest.TestCase): side_effect=assert_subprocess_call): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): fdroidserver.common.deploy_build_log_with_rsync( - 'com.example.app', '4711', mocklogcontent) + 'com.example.app', 4711, mocklogcontent) expected_log_path = os.path.join(tmpdir, 'repo', 'com.example.app_4711.log.gz') self.assertTrue(os.path.isfile(expected_log_path)) @@ -2115,7 +2115,7 @@ class CommonTest(unittest.TestCase): fdroidserver.common.read_pkg_args(['org.fdroid.fdroid'], allow_vercodes), ) self.assertNotEqual( - {'com.example': ['123456']}, + {'com.example': [123456]}, fdroidserver.common.read_pkg_args(['com.example:123456'], allow_vercodes), ) @@ -2125,11 +2125,11 @@ class CommonTest(unittest.TestCase): fdroidserver.common.read_pkg_args(['org.fdroid.fdroid'], allow_vercodes), ) self.assertEqual( - {'com.example': ['123456']}, + {'com.example': [123456]}, fdroidserver.common.read_pkg_args(['com.example:123456'], allow_vercodes), ) self.assertEqual( - {'org.debian_kit': ['6']}, + {'org.debian_kit': [6]}, fdroidserver.common.read_pkg_args(['org.debian_kit_6.apk'], allow_vercodes), ) appid_versionCode_pairs = ( @@ -2138,7 +2138,7 @@ class CommonTest(unittest.TestCase): 'com.example:67890', ) self.assertEqual( - {'com.example': ['12345', '67890'], 'org.fdroid.fdroid': ['1']}, + {'com.example': [12345, 67890], 'org.fdroid.fdroid': [1]}, fdroidserver.common.read_pkg_args(appid_versionCode_pairs, allow_vercodes) ) appid_versionCode_pairs = ( @@ -2146,7 +2146,7 @@ class CommonTest(unittest.TestCase): 'org.c_base.c_beam_29.apk', ) self.assertEqual( - {'com.example': ['67890'], 'org.c_base.c_beam': ['29']}, + {'com.example': [67890], 'org.c_base.c_beam': [29]}, fdroidserver.common.read_pkg_args(appid_versionCode_pairs, allow_vercodes), ) diff --git a/tests/import_subcommand.TestCase b/tests/import_subcommand.TestCase index 8b871ee3..307f2bca 100755 --- a/tests/import_subcommand.TestCase +++ b/tests/import_subcommand.TestCase @@ -69,7 +69,7 @@ class ImportTest(unittest.TestCase): 'cn.wildfirechat.chat', 'https://github.com/wildfirechat/android-chat', '0.6.9', - '23', + 23, ), ( 'com.anpmech.launcher', @@ -81,7 +81,7 @@ class ImportTest(unittest.TestCase): 'ut.ewh.audiometrytest', 'https://github.com/ReeceStevens/ut_ewh_audiometer_2014', '1.65', - '14', + 14, ), ) for appid, url, vn, vc in data: diff --git a/tests/index.TestCase b/tests/index.TestCase index 23b0560d..b04d81c0 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -318,7 +318,7 @@ class IndexTest(unittest.TestCase): } app = fdroidserver.metadata.parse_metadata(metadatafile) app['icon'] = 'info.zwanenburg.caffeinetile.4.xml' - app['CurrentVersionCode'] = '4' + app['CurrentVersionCode'] = 4 apps = {app.id: app} apk = { 'hash': 'dbbdd7deadb038862f426b71efe4a64df8c3edf25d669e935f349510e16f65db', diff --git a/tests/metadata/dump/com.politedroid.yaml b/tests/metadata/dump/com.politedroid.yaml index 6f83af0a..01ea946e 100644 --- a/tests/metadata/dump/com.politedroid.yaml +++ b/tests/metadata/dump/com.politedroid.yaml @@ -44,7 +44,7 @@ Builds: sudo: '' target: android-10 timeout: null - versionCode: '3' + versionCode: 3 versionName: '1.2' - androidupdate: [] antcommands: [] @@ -78,7 +78,7 @@ Builds: sudo: '' target: android-15 timeout: null - versionCode: '4' + versionCode: 4 versionName: '1.3' - androidupdate: [] antcommands: [] @@ -112,7 +112,7 @@ Builds: sudo: '' target: android-10 timeout: null - versionCode: '5' + versionCode: 5 versionName: '1.4' - androidupdate: [] antcommands: [] @@ -147,13 +147,13 @@ Builds: sudo: echo 'this is just a test' target: null timeout: null - versionCode: '6' + versionCode: 6 versionName: '1.5' Categories: - Time Changelog: '' CurrentVersion: '1.5' -CurrentVersionCode: '6' +CurrentVersionCode: 6 Description: Activates silent mode during calendar events. Disabled: null Donate: null diff --git a/tests/metadata/dump/org.adaway.yaml b/tests/metadata/dump/org.adaway.yaml index 95bca2ce..dd1fcd4f 100644 --- a/tests/metadata/dump/org.adaway.yaml +++ b/tests/metadata/dump/org.adaway.yaml @@ -42,7 +42,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '13' + versionCode: 13 versionName: '1.12' - androidupdate: [] antcommands: [] @@ -78,7 +78,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '16' + versionCode: 16 versionName: '1.15' - androidupdate: [] antcommands: [] @@ -114,7 +114,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '19' + versionCode: 19 versionName: '1.18' - androidupdate: [] antcommands: [] @@ -150,7 +150,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '20' + versionCode: 20 versionName: '1.19' - androidupdate: [] antcommands: [] @@ -186,7 +186,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '21' + versionCode: 21 versionName: '1.20' - androidupdate: [] antcommands: [] @@ -222,7 +222,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '22' + versionCode: 22 versionName: '1.21' - androidupdate: [] antcommands: [] @@ -256,7 +256,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '24' + versionCode: 24 versionName: '1.23' - androidupdate: [] antcommands: [] @@ -291,7 +291,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '25' + versionCode: 25 versionName: '1.24' - androidupdate: [] antcommands: [] @@ -326,7 +326,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '26' + versionCode: 26 versionName: '1.25' - androidupdate: [] antcommands: [] @@ -361,7 +361,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '27' + versionCode: 27 versionName: '1.26' - androidupdate: [] antcommands: [] @@ -396,7 +396,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '28' + versionCode: 28 versionName: '1.27' - androidupdate: [] antcommands: [] @@ -431,7 +431,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '30' + versionCode: 30 versionName: '1.29' - androidupdate: [] antcommands: [] @@ -466,7 +466,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '33' + versionCode: 33 versionName: '1.32' - androidupdate: [] antcommands: [] @@ -500,7 +500,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '34' + versionCode: 34 versionName: '1.33' - androidupdate: [] antcommands: [] @@ -535,7 +535,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '35' + versionCode: 35 versionName: '1.34' - androidupdate: [] antcommands: [] @@ -570,7 +570,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '36' + versionCode: 36 versionName: '1.35' - androidupdate: [] antcommands: [] @@ -605,7 +605,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '37' + versionCode: 37 versionName: '1.36' - androidupdate: [] antcommands: [] @@ -640,7 +640,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '38' + versionCode: 38 versionName: '1.37' - androidupdate: - . @@ -687,7 +687,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '40' + versionCode: 40 versionName: '2.1' - androidupdate: - . @@ -734,7 +734,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '42' + versionCode: 42 versionName: '2.3' - androidupdate: [] antcommands: [] @@ -771,7 +771,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '45' + versionCode: 45 versionName: '2.6' - androidupdate: [] antcommands: [] @@ -808,7 +808,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '46' + versionCode: 46 versionName: '2.7' - androidupdate: [] antcommands: [] @@ -845,7 +845,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '47' + versionCode: 47 versionName: '2.8' - androidupdate: [] antcommands: [] @@ -882,7 +882,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '48' + versionCode: 48 versionName: 2.8.1 - androidupdate: [] antcommands: [] @@ -919,7 +919,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '49' + versionCode: 49 versionName: '2.9' - androidupdate: [] antcommands: [] @@ -956,7 +956,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '50' + versionCode: 50 versionName: 2.9.1 - androidupdate: [] antcommands: [] @@ -993,7 +993,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '51' + versionCode: 51 versionName: 2.9.2 - androidupdate: [] antcommands: [] @@ -1030,14 +1030,14 @@ Builds: sudo: '' target: null timeout: null - versionCode: '52' + versionCode: 52 versionName: '3.0' Categories: - System - Security Changelog: '' CurrentVersion: '3.0' -CurrentVersionCode: '52' +CurrentVersionCode: 52 Description: 'An ad blocker that uses the hosts file. The hosts file contains a list of mappings between hostnames and IP addresses. When diff --git a/tests/metadata/dump/org.smssecure.smssecure.yaml b/tests/metadata/dump/org.smssecure.smssecure.yaml index c30f6c79..c3ad76b6 100644 --- a/tests/metadata/dump/org.smssecure.smssecure.yaml +++ b/tests/metadata/dump/org.smssecure.smssecure.yaml @@ -53,7 +53,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '5' + versionCode: 5 versionName: 0.3.3 - androidupdate: [] antcommands: [] @@ -91,7 +91,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '6' + versionCode: 6 versionName: 0.3.3 - androidupdate: [] antcommands: [] @@ -128,7 +128,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '9' + versionCode: 9 versionName: 0.4.2 - androidupdate: [] antcommands: [] @@ -165,7 +165,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '11' + versionCode: 11 versionName: 0.5.1 - androidupdate: [] antcommands: [] @@ -201,7 +201,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '12' + versionCode: 12 versionName: 0.5.2 - androidupdate: [] antcommands: [] @@ -237,7 +237,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '100' + versionCode: 100 versionName: 0.5.3 - androidupdate: [] antcommands: [] @@ -273,7 +273,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '101' + versionCode: 101 versionName: 0.5.4 - androidupdate: [] antcommands: [] @@ -309,13 +309,13 @@ Builds: sudo: '' target: null timeout: null - versionCode: '102' + versionCode: 102 versionName: 0.6.0 Categories: - Phone & SMS Changelog: '' CurrentVersion: 0.6.0 -CurrentVersionCode: '102' +CurrentVersionCode: 102 Description: 'SMSSecure is an SMS/MMS application that allows you to protect your privacy while communicating with friends. diff --git a/tests/metadata/dump/org.videolan.vlc.yaml b/tests/metadata/dump/org.videolan.vlc.yaml index c6f928e3..652b5c2b 100644 --- a/tests/metadata/dump/org.videolan.vlc.yaml +++ b/tests/metadata/dump/org.videolan.vlc.yaml @@ -44,7 +44,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '110' + versionCode: 110 versionName: 0.0.11-ARMv7 - androidupdate: - . @@ -81,7 +81,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '111' + versionCode: 111 versionName: 0.0.11-ARM - androidupdate: - . @@ -118,7 +118,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '112' + versionCode: 112 versionName: 0.0.11-x86 - androidupdate: - . @@ -155,7 +155,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '113' + versionCode: 113 versionName: 0.0.11-mips - androidupdate: [] antcommands: [] @@ -191,7 +191,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1301' + versionCode: 1301 versionName: 0.1.3-MIPS - androidupdate: [] antcommands: [] @@ -227,7 +227,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1302' + versionCode: 1302 versionName: 0.1.3-x86 - androidupdate: [] antcommands: [] @@ -263,7 +263,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1303' + versionCode: 1303 versionName: 0.1.3-ARM - androidupdate: [] antcommands: [] @@ -299,7 +299,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1304' + versionCode: 1304 versionName: 0.1.3-ARMv7 - androidupdate: [] antcommands: [] @@ -334,7 +334,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '9002' + versionCode: 9002 versionName: 0.9.0 - androidupdate: [] antcommands: [] @@ -369,7 +369,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '9004' + versionCode: 9004 versionName: 0.9.0 - androidupdate: [] antcommands: [] @@ -404,7 +404,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '9102' + versionCode: 9102 versionName: 0.9.1 - androidupdate: [] antcommands: [] @@ -439,7 +439,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '9104' + versionCode: 9104 versionName: 0.9.1 - androidupdate: [] antcommands: [] @@ -474,7 +474,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '9502' + versionCode: 9502 versionName: 0.9.5 - androidupdate: [] antcommands: [] @@ -509,7 +509,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '9504' + versionCode: 9504 versionName: 0.9.5 - androidupdate: [] antcommands: [] @@ -544,7 +544,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '9602' + versionCode: 9602 versionName: 0.9.6 - androidupdate: [] antcommands: [] @@ -579,7 +579,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '9604' + versionCode: 9604 versionName: 0.9.6 - androidupdate: [] antcommands: [] @@ -614,7 +614,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '9702' + versionCode: 9702 versionName: 0.9.7 - androidupdate: [] antcommands: [] @@ -649,7 +649,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '9704' + versionCode: 9704 versionName: 0.9.7 - androidupdate: [] antcommands: [] @@ -684,7 +684,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '9711' + versionCode: 9711 versionName: 0.9.7.1 - androidupdate: [] antcommands: [] @@ -719,7 +719,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '9712' + versionCode: 9712 versionName: 0.9.7.1 - androidupdate: [] antcommands: [] @@ -754,7 +754,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '9714' + versionCode: 9714 versionName: 0.9.7.1 - androidupdate: [] antcommands: [] @@ -789,7 +789,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '9802' + versionCode: 9802 versionName: 0.9.8 - androidupdate: [] antcommands: [] @@ -824,7 +824,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '9803' + versionCode: 9803 versionName: 0.9.8 - androidupdate: [] antcommands: [] @@ -859,7 +859,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '9804' + versionCode: 9804 versionName: 0.9.8 - androidupdate: [] antcommands: [] @@ -894,7 +894,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '9902' + versionCode: 9902 versionName: 0.9.9 - androidupdate: [] antcommands: [] @@ -929,7 +929,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '9903' + versionCode: 9903 versionName: 0.9.9 - androidupdate: [] antcommands: [] @@ -964,7 +964,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '9904' + versionCode: 9904 versionName: 0.9.9 - androidupdate: [] antcommands: [] @@ -999,7 +999,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '10002' + versionCode: 10002 versionName: 0.9.10 - androidupdate: [] antcommands: [] @@ -1034,7 +1034,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '10003' + versionCode: 10003 versionName: 0.9.10 - androidupdate: [] antcommands: [] @@ -1069,7 +1069,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '10004' + versionCode: 10004 versionName: 0.9.10 - androidupdate: [] antcommands: [] @@ -1104,7 +1104,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '10006' + versionCode: 10006 versionName: 1.0.0 - androidupdate: [] antcommands: [] @@ -1139,7 +1139,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '10007' + versionCode: 10007 versionName: 1.0.0 - androidupdate: [] antcommands: [] @@ -1174,7 +1174,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '10008' + versionCode: 10008 versionName: 1.0.0 - androidupdate: [] antcommands: [] @@ -1209,7 +1209,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '10102' + versionCode: 10102 versionName: 1.0.1 - androidupdate: [] antcommands: [] @@ -1244,7 +1244,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '10103' + versionCode: 10103 versionName: 1.0.1 - androidupdate: [] antcommands: [] @@ -1279,7 +1279,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '10104' + versionCode: 10104 versionName: 1.0.1 - androidupdate: [] antcommands: [] @@ -1316,7 +1316,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1010303' + versionCode: 1010303 versionName: 1.1.3 - androidupdate: [] antcommands: [] @@ -1353,7 +1353,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1010304' + versionCode: 1010304 versionName: 1.1.3 - androidupdate: [] antcommands: [] @@ -1390,7 +1390,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1010305' + versionCode: 1010305 versionName: 1.1.3 - androidupdate: [] antcommands: [] @@ -1427,7 +1427,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1010503' + versionCode: 1010503 versionName: 1.1.5 - androidupdate: [] antcommands: [] @@ -1464,7 +1464,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1010504' + versionCode: 1010504 versionName: 1.1.5 - androidupdate: [] antcommands: [] @@ -1501,7 +1501,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1010505' + versionCode: 1010505 versionName: 1.1.5 - androidupdate: [] antcommands: [] @@ -1538,7 +1538,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1010603' + versionCode: 1010603 versionName: 1.1.6 - androidupdate: [] antcommands: [] @@ -1575,7 +1575,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1010604' + versionCode: 1010604 versionName: 1.1.6 - androidupdate: [] antcommands: [] @@ -1612,7 +1612,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1010605' + versionCode: 1010605 versionName: 1.1.6 - androidupdate: [] antcommands: [] @@ -1649,7 +1649,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1020003' + versionCode: 1020003 versionName: 1.2.0 - androidupdate: [] antcommands: [] @@ -1686,7 +1686,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1020004' + versionCode: 1020004 versionName: 1.2.0 - androidupdate: [] antcommands: [] @@ -1723,7 +1723,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1020005' + versionCode: 1020005 versionName: 1.2.0 - androidupdate: [] antcommands: [] @@ -1760,7 +1760,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1020103' + versionCode: 1020103 versionName: 1.2.1 - androidupdate: [] antcommands: [] @@ -1797,7 +1797,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1020104' + versionCode: 1020104 versionName: 1.2.1 - androidupdate: [] antcommands: [] @@ -1834,7 +1834,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1020105' + versionCode: 1020105 versionName: 1.2.1 - androidupdate: [] antcommands: [] @@ -1871,7 +1871,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1020203' + versionCode: 1020203 versionName: 1.2.2 - androidupdate: [] antcommands: [] @@ -1908,7 +1908,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1020204' + versionCode: 1020204 versionName: 1.2.2 - androidupdate: [] antcommands: [] @@ -1945,7 +1945,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1020205' + versionCode: 1020205 versionName: 1.2.2 - androidupdate: [] antcommands: [] @@ -1982,7 +1982,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1020303' + versionCode: 1020303 versionName: 1.2.3 - androidupdate: [] antcommands: [] @@ -2019,7 +2019,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1020304' + versionCode: 1020304 versionName: 1.2.3 - androidupdate: [] antcommands: [] @@ -2056,7 +2056,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1020305' + versionCode: 1020305 versionName: 1.2.3 - androidupdate: [] antcommands: [] @@ -2093,7 +2093,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1020403' + versionCode: 1020403 versionName: 1.2.4 - androidupdate: [] antcommands: [] @@ -2130,7 +2130,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1020404' + versionCode: 1020404 versionName: 1.2.4 - androidupdate: [] antcommands: [] @@ -2167,7 +2167,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1020405' + versionCode: 1020405 versionName: 1.2.4 - androidupdate: [] antcommands: [] @@ -2204,7 +2204,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1020503' + versionCode: 1020503 versionName: 1.2.5 - androidupdate: [] antcommands: [] @@ -2241,7 +2241,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1020504' + versionCode: 1020504 versionName: 1.2.5 - androidupdate: [] antcommands: [] @@ -2278,7 +2278,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1020505' + versionCode: 1020505 versionName: 1.2.5 - androidupdate: [] antcommands: [] @@ -2315,7 +2315,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1030003' + versionCode: 1030003 versionName: 1.2.6 - androidupdate: [] antcommands: [] @@ -2352,7 +2352,7 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1030004' + versionCode: 1030004 versionName: 1.2.6 - androidupdate: [] antcommands: [] @@ -2389,13 +2389,13 @@ Builds: sudo: '' target: null timeout: null - versionCode: '1030005' + versionCode: 1030005 versionName: 1.2.6 Categories: - Multimedia Changelog: '' CurrentVersion: 1.2.6 -CurrentVersionCode: '1030005' +CurrentVersionCode: 1030005 Description: 'Video and audio player that supports a wide range of formats, for both local and remote playback. diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index b301b9ea..5f5898cb 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -246,7 +246,7 @@ class ScannerTest(unittest.TestCase): build.commit = '1.0' build.output = app.id + '.apk' build.scanignore = ['baz.so', 'foo.aar'] - build.versionCode = '1' + build.versionCode = 1 build.versionName = '1.0' vcs = mock.Mock() diff --git a/tests/update.TestCase b/tests/update.TestCase index 7c669760..5b4e8142 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1427,7 +1427,7 @@ class UpdateTest(unittest.TestCase): 'Builds': None, 'Changelog': '', 'CurrentVersion': '', - 'CurrentVersionCode': '', + 'CurrentVersionCode': None, 'Disabled': '', 'Donate': '', 'FlattrID': '', From 0d39169840514d8ab48df1224b72ff4bea0991c6 Mon Sep 17 00:00:00 2001 From: linsui Date: Sat, 15 Oct 2022 16:09:19 +0800 Subject: [PATCH 0869/2116] checkupdates.TestCase: remove indentation These assert functions doesn't need to be in the mock context. --- tests/checkupdates.TestCase | 58 ++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index ea59a63e..b6b7286f 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -56,9 +56,10 @@ class CheckupdatesTest(unittest.TestCase): with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): with mock.patch('subprocess.call', lambda cmd: 0): fdroidserver.checkupdates.checkupdates_app(app) - build = app['Builds'][-1] - self.assertEqual(build.versionName, '1.1.9') - self.assertEqual(build.commit, '1.1.9') + + build = app['Builds'][-1] + self.assertEqual(build.versionName, '1.1.9') + self.assertEqual(build.commit, '1.1.9') with mock.patch( 'fdroidserver.checkupdates.check_http', lambda app: ('1.7.9', 10107) @@ -67,9 +68,10 @@ class CheckupdatesTest(unittest.TestCase): with mock.patch('subprocess.call', lambda cmd: 0): with self.assertRaises(FDroidException): fdroidserver.checkupdates.checkupdates_app(app) - build = app['Builds'][-1] - self.assertEqual(build.versionName, '1.1.9') - self.assertEqual(build.commit, '1.1.9') + + build = app['Builds'][-1] + self.assertEqual(build.versionName, '1.1.9') + self.assertEqual(build.commit, '1.1.9') def test_autoupdatemode_suffix(self): fdroidserver.checkupdates.options = mock.Mock() @@ -95,9 +97,10 @@ class CheckupdatesTest(unittest.TestCase): with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): with mock.patch('subprocess.call', lambda cmd: 0): fdroidserver.checkupdates.checkupdates_app(app) - build = app['Builds'][-1] - self.assertEqual(build.versionName, '1.1.9.10109-fdroid') - self.assertEqual(build.commit, 'v1.1.9_10109') + + build = app['Builds'][-1] + self.assertEqual(build.versionName, '1.1.9.10109-fdroid') + self.assertEqual(build.commit, 'v1.1.9_10109') def test_checkupdates_app_http(self): fdroidserver.checkupdates.options = mock.Mock() @@ -159,9 +162,10 @@ class CheckupdatesTest(unittest.TestCase): with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): with mock.patch('subprocess.call', lambda cmd: 0): fdroidserver.checkupdates.checkupdates_app(app) - build = app['Builds'][-1] - self.assertEqual(build.versionName, '1.1.9') - self.assertEqual(build.commit, 'v1.1.9') + + build = app['Builds'][-1] + self.assertEqual(build.versionName, '1.1.9') + self.assertEqual(build.commit, 'v1.1.9') def test_check_http(self): fdroidserver.checkupdates.options = mock.Mock() @@ -178,8 +182,8 @@ class CheckupdatesTest(unittest.TestCase): respmock.read = lambda: 'v1.1.9\nc10109'.encode('utf-8') with mock.patch('urllib.request.urlopen', lambda a, b, c: respmock): vername, vercode = fdroidserver.checkupdates.check_http(app) - self.assertEqual(vername, '1.1.9') - self.assertEqual(vercode, 10109) + self.assertEqual(vername, '1.1.9') + self.assertEqual(vercode, 10109) def test_check_http_blocks_unknown_schemes(self): app = fdroidserver.metadata.App() @@ -206,7 +210,7 @@ class CheckupdatesTest(unittest.TestCase): respmock.read = lambda: 'v1.1.9-beta\nc10109'.encode('utf-8') with mock.patch('urllib.request.urlopen', lambda a, b, c: respmock): vername, vercode = fdroidserver.checkupdates.check_http(app) - self.assertEqual(vername, None) + self.assertEqual(vername, None) def test_check_tags_data(self): fdroidserver.checkupdates.options = mock.Mock() @@ -229,8 +233,8 @@ class CheckupdatesTest(unittest.TestCase): _ignored # silence the linters mock_path.is_file.return_falue = True vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) - self.assertEqual(vername, '1.1.9') - self.assertEqual(vercode, 10109) + self.assertEqual(vername, '1.1.9') + self.assertEqual(vercode, 10109) app.UpdateCheckData = r'b.txt|c(.*)|.|v(.*)' with mock.patch( @@ -241,8 +245,8 @@ class CheckupdatesTest(unittest.TestCase): _ignored # silence the linters mock_path.is_file.return_falue = True vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) - self.assertEqual(vername, '1.1.0') - self.assertEqual(vercode, 10109) + self.assertEqual(vername, '1.1.0') + self.assertEqual(vercode, 10109) app.UpdateCheckData = r'b.txt|c(.*)||' with mock.patch( @@ -253,8 +257,8 @@ class CheckupdatesTest(unittest.TestCase): _ignored # silence the linters mock_path.is_file.return_falue = True vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) - self.assertEqual(vername, '1.1.9') - self.assertEqual(vercode, 10109) + self.assertEqual(vername, '1.1.9') + self.assertEqual(vercode, 10109) vcs.latesttags.return_value = ['Android-1.1.0', '1.1.8'] app.UpdateCheckData = r'b.txt|c(.*)||Android-([\d.]+)' @@ -266,22 +270,22 @@ class CheckupdatesTest(unittest.TestCase): _ignored # silence the linters mock_path.is_file.return_falue = True vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) - self.assertEqual(vername, '1.1.0') - self.assertEqual(vercode, 10109) + self.assertEqual(vername, '1.1.0') + self.assertEqual(vercode, 10109) app.UpdateCheckData = r'|\+(\d+)||Android-([\d.]+)' vcs.latesttags.return_value = ['Android-1.1.0+1'] with mock.patch('fdroidserver.common.getvcs', return_value=vcs): vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) - self.assertEqual(vername, '1.1.0') - self.assertEqual(vercode, 1) + self.assertEqual(vername, '1.1.0') + self.assertEqual(vercode, 1) app.UpdateCheckData = '|||' vcs.latesttags.return_value = ['2'] with mock.patch('fdroidserver.common.getvcs', return_value=vcs): vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) - self.assertEqual(vername, '2') - self.assertEqual(vercode, 2) + self.assertEqual(vername, '2') + self.assertEqual(vercode, 2) if __name__ == "__main__": From 68b58c043f8da3a771b9abc793571cbb9369e671 Mon Sep 17 00:00:00 2001 From: linsui Date: Sat, 15 Oct 2022 17:19:49 +0800 Subject: [PATCH 0870/2116] Change VercodeOperation to list ... so that we can calculate multiple version codes to support multi-arch autoupdate --- fdroidserver/checkupdates.py | 100 ++++++++++++++++++++--------------- fdroidserver/lint.py | 19 +++++-- tests/checkupdates.TestCase | 50 ++++++++++++++++++ 3 files changed, 122 insertions(+), 47 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index ecba9ba6..756a8064 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -379,7 +379,6 @@ def _getcvname(app): def fetch_autoname(app, tag): - if not app.RepoType or app.UpdateCheckMode in ('None', 'Static') \ or app.UpdateCheckName == "Ignore": return None @@ -417,14 +416,23 @@ def fetch_autoname(app, tag): return commitmsg -def checkupdates_app(app): +def operate_vercode(operation, vercode): + if not common.VERCODE_OPERATION_RE.match(operation): + raise MetaDataException(_('Invalid VercodeOperation: {field}') + .format(field=operation)) + oldvercode = vercode + op = operation.replace("%c", str(oldvercode)) + vercode = common.calculate_math_string(op) + logging.debug("Applied vercode operation: %d -> %d" % (oldvercode, vercode)) + return vercode + +def checkupdates_app(app): # If a change is made, commitmsg should be set to a description of it. # Only if this is set will changes be written back to the metadata. commitmsg = None tag = None - vercode = None mode = app.UpdateCheckMode if mode.startswith('Tags'): pattern = mode[5:] if len(mode) > 4 else None @@ -444,30 +452,33 @@ def checkupdates_app(app): else: raise MetaDataException(_('Invalid UpdateCheckMode: {mode}').format(mode=mode)) - if version and vercode and app.VercodeOperation: - if not common.VERCODE_OPERATION_RE.match(app.VercodeOperation): - raise MetaDataException(_('Invalid VercodeOperation: {field}') - .format(field=app.VercodeOperation)) - oldvercode = str(int(vercode)) - op = app.VercodeOperation.replace("%c", oldvercode) - vercode = str(common.calculate_math_string(op)) - logging.debug("Applied vercode operation: %s -> %s" % (oldvercode, vercode)) + if not version or not vercode: + raise FDroidException(_('no version information found')) + + if app.VercodeOperation: + if isinstance(app.VercodeOperation, str): + vercodes = [operate_vercode(app.VercodeOperation, vercode)] + else: + vercodes = sorted([ + operate_vercode(operation, vercode) + for operation in app.VercodeOperation + ]) + else: + vercodes = [vercode] updating = False - if version is None: - raise FDroidException(_('no version information found')) - elif vercode == app.CurrentVersionCode: + if vercodes[-1] == app.CurrentVersionCode: logging.debug("...up to date") - elif vercode > app.CurrentVersionCode: + elif vercodes[-1] > app.CurrentVersionCode: logging.debug("...updating - old vercode={0}, new vercode={1}".format( - app.CurrentVersionCode, vercode)) + app.CurrentVersionCode, vercodes[-1])) app.CurrentVersion = version - app.CurrentVersionCode = vercode + app.CurrentVersionCode = vercodes[-1] updating = True else: raise FDroidException( _('current version is newer: old vercode={old}, new vercode={new}').format( - old=app.CurrentVersionCode, new=vercode + old=app.CurrentVersionCode, new=vercodes[-1] ) ) @@ -498,35 +509,38 @@ def checkupdates_app(app): gotcur = False latest = None - for build in app.get('Builds', []): - if build.versionCode >= app.CurrentVersionCode: - gotcur = True - if not latest or build.versionCode > latest.versionCode: - latest = build + builds = app.get('Builds', []) - if latest.versionCode > app.CurrentVersionCode: - raise FDroidException( - _( - 'latest build recipe is newer: old vercode={old}, new vercode={new}' - ).format(old=latest.versionCode, new=app.CurrentVersionCode) - ) + if builds: + latest = builds[-1] + if latest.versionCode == app.CurrentVersionCode: + gotcur = True + elif latest.versionCode > app.CurrentVersionCode: + raise FDroidException( + _( + 'latest build recipe is newer: ' + 'old vercode={old}, new vercode={new}' + ).format(old=latest.versionCode, new=app.CurrentVersionCode) + ) if not gotcur: - newbuild = copy.deepcopy(latest) - newbuild.disable = False - newbuild.versionCode = app.CurrentVersionCode - newbuild.versionName = app.CurrentVersion + suffix.replace( - '%c', str(newbuild.versionCode) - ) - logging.info("...auto-generating build for " + newbuild.versionName) - if tag: - newbuild.commit = tag - else: - commit = pattern.replace('%v', str(app.CurrentVersion)) - commit = commit.replace('%c', str(newbuild.versionCode)) - newbuild.commit = commit + newbuilds = copy.deepcopy(builds[-len(vercodes):]) + for b, v in zip(newbuilds, vercodes): + b.disable = False + b.versionCode = v + b.versionName = app.CurrentVersion + suffix.replace( + '%c', str(v) + ) + logging.info("...auto-generating build for " + b.versionName) + if tag: + b.commit = tag + else: + commit = pattern.replace('%v', app.CurrentVersion) + commit = commit.replace('%c', str(v)) + b.commit = commit + + app['Builds'].extend(newbuilds) - app['Builds'].append(newbuild) name = _getappname(app) ver = _getcvname(app) commitmsg = "Update %s to %s" % (name, ver) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 43b101a9..c4c98143 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -262,10 +262,21 @@ def check_update_check_data_url(app): # noqa: D403 def check_vercode_operation(app): - if app.VercodeOperation and not common.VERCODE_OPERATION_RE.match( - app.VercodeOperation - ): - yield _('Invalid VercodeOperation: {field}').format(field=app.VercodeOperation) + if not app.VercodeOperation: + return + ops = ( + [app.VercodeOperation] + if isinstance(app.VercodeOperation, str) + else app.VercodeOperation + ) + invalid_ops = [] + for op in ops: + if not common.VERCODE_OPERATION_RE.match(op): + invalid_ops += op + if invalid_ops: + yield _('Invalid VercodeOperation: {invalid_ops}').format( + invalid_ops=invalid_ops + ) def check_ucm_tags(app): diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index b6b7286f..e6b2b6d9 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -102,6 +102,56 @@ class CheckupdatesTest(unittest.TestCase): self.assertEqual(build.versionName, '1.1.9.10109-fdroid') self.assertEqual(build.commit, 'v1.1.9_10109') + def test_autoupdate_multi_variants(self): + fdroidserver.checkupdates.options = mock.Mock() + fdroidserver.checkupdates.options.auto = 'bleh' + fdroidserver.checkupdates.config = {} + + app = fdroidserver.metadata.App() + app.id = 'loop.starts.shooting' + app.metadatapath = 'metadata/' + app.id + '.yml' + app.CurrentVersion = '1.1.8' + app.CurrentVersionCode = 101083 + app.UpdateCheckMode = 'Tags' + app.AutoUpdateMode = r'Version' + app.VercodeOperation = [ + "10*%c+1", + "10*%c+3", + ] + + build = fdroidserver.metadata.Build() + build.versionCode = app.CurrentVersionCode - 2 + build.versionName = app.CurrentVersion + build.gradle = ["arm"] + app['Builds'].append(build) + + build = fdroidserver.metadata.Build() + build.versionCode = app.CurrentVersionCode + build.versionName = app.CurrentVersion + build.gradle = ["x86"] + app['Builds'].append(build) + + with mock.patch( + 'fdroidserver.checkupdates.check_tags', + lambda app, pattern: ('1.1.9', 10109, 'v1.1.9'), + ): + with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): + with mock.patch('subprocess.call', lambda cmd: 0): + fdroidserver.checkupdates.checkupdates_app(app) + + build = app['Builds'][-2] + self.assertEqual(build.versionName, '1.1.9') + self.assertEqual(build.versionCode, 101091) + self.assertEqual(build.gradle, ["arm"]) + + build = app['Builds'][-1] + self.assertEqual(build.versionName, '1.1.9') + self.assertEqual(build.versionCode, 101093) + self.assertEqual(build.gradle, ["x86"]) + + self.assertEqual(app.CurrentVersion, '1.1.9') + self.assertEqual(app.CurrentVersionCode, 101093) + def test_checkupdates_app_http(self): fdroidserver.checkupdates.options = mock.Mock() fdroidserver.checkupdates.options.auto = 'bleh' From 81f02b82798b5e4cdf767857b3182114c51db0af Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 19 Oct 2022 13:18:03 +0200 Subject: [PATCH 0871/2116] gitlab-ci: fix apt.conf syntax for Acquire::Retries --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 90b6341d..d48cd3ae 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -70,8 +70,8 @@ metadata_v0: - echo Etc/UTC > /etc/timezone - echo 'APT::Install-Recommends "0";' 'APT::Install-Suggests "0";' - 'APT::Acquire::Retries "20";' 'APT::Get::Assume-Yes "true";' + 'Acquire::Retries "20";' 'Dpkg::Use-Pty "0";' 'quiet "1";' >> /etc/apt/apt.conf.d/99gitlab From eafa7f5e70a50650b9b302b17a03ec89f43035a2 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 19 Oct 2022 14:00:16 +0200 Subject: [PATCH 0872/2116] gitlab-ci: delete buster_backports job, prod signing is on bullseye Via private email with @CiaranG --- .gitlab-ci.yml | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d48cd3ae..69060c2e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -107,27 +107,6 @@ debian_testing: - ./run-tests -# This tests with buster-backports to match what is used on the f-droid.org publish server. -buster_backports: - image: debian:buster-backports - <<: *apt-template - script: - - apt-get install - aapt - androguard - apksigner - dexdump - fdroidserver - git - gnupg - python3-defusedxml - python3-setuptools - zipalign - - apt-get install -t buster-backports apksigner - - cd tests - - ./run-tests - - # Test using latest LTS set up with the PPA, including Recommends. ubuntu_lts_ppa: image: ubuntu:latest From 2bde06a60f03bce4a109933998f8730136c68dad Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 19 Oct 2022 13:55:41 +0200 Subject: [PATCH 0873/2116] gitlab-ci: port ubuntu_bionic_pip to Ubuntu/jammy This job is here to test using fdroidserver with only depends from pip and sdkmanager (e.g. not apt-get). Production is now on bullseye #1038 --- .gitlab-ci.yml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 69060c2e..555e2fd3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -126,16 +126,16 @@ ubuntu_lts_ppa: - ./run-tests -# Test using Ubuntu/bionic LTS (supported til April, 2023) with all depends -# from pypi. The venv is used to isolate the dist tarball generation -# environment from the clean install environment. -ubuntu_bionic_pip: - image: ubuntu:bionic +# Test using Ubuntu/jammy LTS (supported til April, 2027) with depends +# from pypi and sdkmanager. The venv is used to isolate the dist +# tarball generation environment from the clean install environment. +ubuntu_jammy_pip: + image: ubuntu:jammy <<: *apt-template script: - - apt-get install git default-jdk-headless python3-pip python3-venv rsync zipalign libarchive13 dexdump + - apt-get install git default-jdk-headless python3-pip python3-venv rsync - rm -rf env - - pyvenv env + - python3 -m venv env - . env/bin/activate - $pip install --upgrade babel pip setuptools # setup venv to act as release build machine @@ -145,8 +145,6 @@ ubuntu_bionic_pip: - deactivate - tar tzf dist/fdroidserver-*.tar.gz # back to bare machine to act as user's install machine - - $pip install --upgrade pip setuptools wheel # make this go away: "error: invalid command 'bdist_wheel'" - - export ANDROID_HOME=/opt/android-sdk - $pip install sdkmanager - sdkmanager 'build-tools;30.0.0' From 2b5c35829f575d6d581815805ed42f8b9238c036 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 20 Oct 2022 16:41:59 +0200 Subject: [PATCH 0874/2116] tests/run-tests: fix "fatal: transport 'file' not allowed" https://gitlab.com/eighthave/fdroidserver/-/jobs/3202418899 --- tests/run-tests | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/run-tests b/tests/run-tests index 408c72a2..e5349dc8 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -1303,6 +1303,9 @@ fi #------------------------------------------------------------------------------# echo_header "Test recovering from from broken git submodules" +# On some platforms, checkupdates submodule tests need explicit perms to use file:/// +export GIT_ALLOW_PROTOCOL=file + ROOT=$(create_test_dir) cd "$ROOT" mkdir foo bar @@ -1425,6 +1428,7 @@ EOF $fdroid checkupdates --allow-dirty --auto -v grep "CurrentVersionCode: 1" metadata/fake.yml +unset GIT_ALLOW_PROTOCOL #------------------------------------------------------------------------------# From 1e2e82fbdeb06fb97bc79c8a1f7152613c21ba43 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 19 Oct 2022 08:52:06 +0200 Subject: [PATCH 0875/2116] makebuildserver: use HTTPS in default debian apt source --- makebuildserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/makebuildserver b/makebuildserver index bf165730..fe2cc9b1 100755 --- a/makebuildserver +++ b/makebuildserver @@ -76,7 +76,7 @@ BASEBOX_CHECKSUMS = { config = { 'basebox': BASEBOX_DEFAULT, - 'debian_mirror': 'http://deb.debian.org/debian/', + 'debian_mirror': 'https://deb.debian.org/debian/', 'apt_package_cache': False, 'copy_caches_from_host': False, 'boot_timeout': 600, From 1dd480405ea9eb7e9ef120f4e194a5162735dc2c Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 19 Oct 2022 09:50:01 +0200 Subject: [PATCH 0876/2116] buildserver: let `vagrant package ` handle insecure private key This script was overwriting the provisioning that `vagrant package` does already, and breaking `vagrant ssh`. It should have been removed in !1099 closes #990 fdroid-bootstrap-buildserver#12 !1012 !1099 c6f59565378b9f1aed83f08666f439a6f1a3ca45 --- buildserver/Vagrantfile | 2 -- .../provision-vagrant-insecure-private-key | 17 ----------------- 2 files changed, 19 deletions(-) delete mode 100755 buildserver/provision-vagrant-insecure-private-key diff --git a/buildserver/Vagrantfile b/buildserver/Vagrantfile index 89ab1940..8caa3296 100644 --- a/buildserver/Vagrantfile +++ b/buildserver/Vagrantfile @@ -83,8 +83,6 @@ Vagrant.configure("2") do |config| owner: 'root', group: 'root', create: true end - config.vm.provision "shell", name: "vagrant-insecure-private-key", - path: "provision-vagrant-insecure-private-key" config.vm.provision "shell", name: "setup-env-vars", path: "setup-env-vars", args: ["/opt/android-sdk"] config.vm.provision "shell", name: "apt-get-install", path: "provision-apt-get-install", diff --git a/buildserver/provision-vagrant-insecure-private-key b/buildserver/provision-vagrant-insecure-private-key deleted file mode 100755 index b6ed681e..00000000 --- a/buildserver/provision-vagrant-insecure-private-key +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -e -# -# Vagrant uses the "insecure private key" to establish the first SSH -# connection to a new VM based on a clean public box. In theory, the -# `vagrant package` command should do that automatically. This -# process is still using custom code instead of `vagrant package`, -# hence this script. -# -# https://gitlab.com/fdroid/fdroid-bootstrap-buildserver/-/issues/12 -# https://www.vagrantup.com/docs/vagrantfile/ssh_settings#config-ssh-private_key_path -# -# This public key can be generated using: -# ssh-keygen -y -f ~/.vagrant.d/insecure_private_key - -echo "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== ~/.vagrant.d/insecure_private_key" > /home/vagrant/.ssh/authorized_keys -chown vagrant:vagrant /home/vagrant/.ssh/authorized_keys -chmod 600 /home/vagrant/.ssh/authorized_keys From d19d34d944b7de055d8e52acd0d5b08cfd290790 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Thu, 20 Oct 2022 16:03:14 +0000 Subject: [PATCH 0877/2116] gradle v7.5.1 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index b07ccba7..a7eaa6db 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -165,6 +165,7 @@ get_sha() { '6.9') echo '765442b8069c6bee2ea70713861c027587591c6b1df2c857a23361512560894e' ;; '6.9.1') echo '8c12154228a502b784f451179846e518733cf856efc7d45b2e6691012977b2fe' ;; '6.9.2') echo '8b356fd8702d5ffa2e066ed0be45a023a779bba4dd1a68fd11bc2a6bdc981e8f' ;; + '6.9.3') echo 'dcf350b8ae1aa192fc299aed6efc77b43825d4fedb224c94118ae7faf5fb035d' ;; '7.0') echo 'eb8b89184261025b0430f5b2233701ff1377f96da1ef5e278af6ae8bac5cc305' ;; '7.0.1') echo 'dccda8aa069563c8ba2f6cdfd0777df0e34a5b4d15138ca8b9757e94f4e8a8cb' ;; '7.0.2') echo '0e46229820205440b48a5501122002842b82886e76af35f0f3a069243dca4b3c' ;; @@ -200,7 +201,7 @@ d_plugin_k=(7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 d_plugin_v=(7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From d1ddd525c1b664102d776f0964631f48d0bb9f55 Mon Sep 17 00:00:00 2001 From: FC Stegerman Date: Sat, 22 Oct 2022 23:15:13 +0200 Subject: [PATCH 0878/2116] net.download_file(): retry on errors --- fdroidserver/net.py | 48 +++++++++++++++++++++++++++++++++------------ tests/net.TestCase | 5 +++-- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/fdroidserver/net.py b/fdroidserver/net.py index 688eda68..cf01395a 100644 --- a/fdroidserver/net.py +++ b/fdroidserver/net.py @@ -2,6 +2,7 @@ # # net.py - part of the FDroid server tools # Copyright (C) 2015 Hans-Christoph Steiner +# Copyright (C) 2022 FC Stegerman # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by @@ -16,28 +17,51 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import logging import os import requests +import time import urllib +from requests.adapters import HTTPAdapter, Retry +from requests.exceptions import ChunkedEncodingError HEADERS = {'User-Agent': 'F-Droid'} -def download_file(url, local_filename=None, dldir='tmp'): +def download_file(url, local_filename=None, dldir='tmp', retries=3, backoff_factor=0.1): filename = urllib.parse.urlparse(url).path.split('/')[-1] if local_filename is None: local_filename = os.path.join(dldir, filename) - # the stream=True parameter keeps memory usage low - r = requests.get( - url, stream=True, allow_redirects=True, headers=HEADERS, timeout=300 - ) - r.raise_for_status() - with open(local_filename, 'wb') as f: - for chunk in r.iter_content(chunk_size=1024): - if chunk: # filter out keep-alive new chunks - f.write(chunk) - f.flush() - return local_filename + # Retry applies to failed DNS lookups, socket connections and connection + # timeouts, never to requests where data has made it to the server; so we + # handle ChunkedEncodingError during transfer ourselves. + for i in range(retries + 1): + if retries: + max_retries = Retry(total=retries - i, backoff_factor=backoff_factor) + adapter = HTTPAdapter(max_retries=max_retries) + session = requests.Session() + session.mount('http://', adapter) + session.mount('https://', adapter) + else: + session = requests + # the stream=True parameter keeps memory usage low + r = session.get( + url, stream=True, allow_redirects=True, headers=HEADERS, timeout=300 + ) + r.raise_for_status() + try: + with open(local_filename, 'wb') as f: + for chunk in r.iter_content(chunk_size=1024): + if chunk: # filter out keep-alive new chunks + f.write(chunk) + f.flush() + return local_filename + except ChunkedEncodingError as err: + if i == retries: + raise err + logging.warning('Download interrupted, retrying...') + time.sleep(backoff_factor * 2**i) + raise ValueError("retries must be >= 0") def http_get(url, etag=None, timeout=600): diff --git a/tests/net.TestCase b/tests/net.TestCase index e5ea6b24..0addc355 100755 --- a/tests/net.TestCase +++ b/tests/net.TestCase @@ -39,13 +39,14 @@ class NetTest(unittest.TestCase): return MagicMock() requests_get.side_effect = _get - f = net.download_file('https://f-droid.org/repo/index-v1.jar') + f = net.download_file('https://f-droid.org/repo/index-v1.jar', retries=0) self.assertTrue(requests_get.called) self.assertTrue(os.path.exists(f)) self.assertEqual('tmp/index-v1.jar', f) f = net.download_file( - 'https://d-05.example.com/custom/com.downloader.aegis-3175421.apk?_fn=QVBLUHVyZV92My4xNy41NF9hcGtwdXJlLmNvbS5hcGs&_p=Y29tLmFwa3B1cmUuYWVnb24&am=6avvTpfJ1dMl9-K6JYKzQw&arg=downloader%3A%2F%2Fcampaign%2F%3Futm_medium%3Ddownloader%26utm_source%3Daegis&at=1652080635&k=1f6e58465df3a441665e585719ab0b13627a117f&r=https%3A%2F%2Fdownloader.com%2Fdownloader-app.html%3Ficn%3Daegis%26ici%3Dimage_qr&uu=http%3A%2F%2F172.16.82.1%2Fcustom%2Fcom.downloader.aegis-3175421.apk%3Fk%3D3fb9c4ae0be578206f6a1c330736fac1627a117f' + 'https://d-05.example.com/custom/com.downloader.aegis-3175421.apk?_fn=QVBLUHVyZV92My4xNy41NF9hcGtwdXJlLmNvbS5hcGs&_p=Y29tLmFwa3B1cmUuYWVnb24&am=6avvTpfJ1dMl9-K6JYKzQw&arg=downloader%3A%2F%2Fcampaign%2F%3Futm_medium%3Ddownloader%26utm_source%3Daegis&at=1652080635&k=1f6e58465df3a441665e585719ab0b13627a117f&r=https%3A%2F%2Fdownloader.com%2Fdownloader-app.html%3Ficn%3Daegis%26ici%3Dimage_qr&uu=http%3A%2F%2F172.16.82.1%2Fcustom%2Fcom.downloader.aegis-3175421.apk%3Fk%3D3fb9c4ae0be578206f6a1c330736fac1627a117f', + retries=0 ) self.assertTrue(requests_get.called) self.assertTrue(os.path.exists(f)) From 625dc11930f5ce17f546bec633eb9197b8443325 Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Thu, 20 Oct 2022 22:08:00 +0200 Subject: [PATCH 0879/2116] Require Python 3.9 --- .gitlab-ci.yml | 6 ++++-- pyproject.toml | 4 ++-- setup.py | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 555e2fd3..46463e6b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -479,9 +479,11 @@ servergitmirrors: - diff repo/index-v1.jar index-v1.jar Build documentation: - image: python:3.9-buster + image: debian:bullseye + <<: *apt-template script: - - pip install -e .[docs] + - apt-get install python3-pip make + - pip install .[docs] - pydocstyle fdroidserver - cd docs - sphinx-apidoc -o ./source ../fdroidserver -M -e diff --git a/pyproject.toml b/pyproject.toml index ba6a2e12..558596e9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,10 +1,10 @@ [tool.black] skip-string-normalization = true -target-version = ["py35"] +target-version = ["py39"] [tool.mypy] -python_version = "3.5" +python_version = "3.9" files = "fdroidserver" diff --git a/setup.py b/setup.py index 253637ec..741b6877 100755 --- a/setup.py +++ b/setup.py @@ -94,7 +94,7 @@ setup( scripts=['makebuildserver'], entry_points={'console_scripts': ['fdroid=fdroidserver.__main__:main']}, data_files=get_data_files(), - python_requires='>=3.5', + python_requires='>=3.9', cmdclass={ 'versioncheck': VersionCheckCommand, 'install': InstallWithCompile, From 5e1bdfc2785d090f01f7afd744baddd0aed4d019 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 24 Oct 2022 11:43:47 +0200 Subject: [PATCH 0880/2116] Fix ipfs test config --- tests/common.TestCase | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/common.TestCase b/tests/common.TestCase index 3a301ee8..bbf692de 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1526,7 +1526,9 @@ class CommonTest(unittest.TestCase): @unittest.skipUnless(shutil.which('ipfs_cid'), 'calculate_IPFS_cid needs ipfs_cid') def test_calculate_IPFS_cid(self): - fdroidserver.common.config = dict() + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.common.config = config self.assertIsNone(fdroidserver.common.calculate_IPFS_cid('FileDoesNotExist')) self.assertEqual( fdroidserver.common.calculate_IPFS_cid('urzip.apk'), From b86d815743c0deef2a2ae9f01e91f39de610dfec Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 25 Oct 2022 12:55:44 +0200 Subject: [PATCH 0881/2116] Support 0 as versionCode See: !1230 --- fdroidserver/metadata.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index c6cc4b6b..9c08b584 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -965,16 +965,17 @@ def write_yaml(mf, app): build = Build(build) b = ruamel.yaml.comments.CommentedMap() for field in build_flags: - value = getattr(build, field) - if hasattr(build, field) and value: + if hasattr(build, field): + value = getattr(build, field) if field == 'gradle' and value == ['off']: value = [ruamel.yaml.scalarstring.SingleQuotedScalarString('off')] if field in ('maven', 'buildozer'): if value == 'no': continue - elif value == 'yes': - value = 'yes' - b.update({field: _field_to_yaml(flagtype(field), value)}) + typ = flagtype(field) + # don't check value == True for TYPE_INT as it could be 0 + if value is not None and (typ == TYPE_INT or value): + b.update({field: _field_to_yaml(typ, value)}) builds.append(b) # insert extra empty lines between build entries From 817a156ea5a8d5e6518b4c805f3d9316b12332b3 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 25 Oct 2022 18:19:31 +0200 Subject: [PATCH 0882/2116] buildserver: strip extraneous packages installed in Vagrant base box The official Debian Vagrant box seems to be a "batteries included" kind of thing. The buildserver should be as small as possible, so this removes all the extraneous packages I could find in the Vagrant basebox. --- buildserver/provision-apt-get-install | 55 +++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index 9b1b503e..7edec156 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -44,6 +44,54 @@ EOF echo "deb ${debian_mirror} bullseye-backports main" > /etc/apt/sources.list.d/backports.list apt-get update || apt-get update + +# purge things that might come from the base box, but we don't want +# https://salsa.debian.org/cloud-team/debian-vagrant-images/-/tree/master/config_space/package_config +# cat config_space/package_config/* | sort -u | grep -v '[A-Z#]' +purge=" + apt-listchanges + apt-utils + bash-completion + bind9-* + bsdextrautils + build-essential + bzip2 + chrony + cloud-utils + cron + dbus + debconf-i18n + debian-faq + dmidecode + doc-debian + fdisk + file + groff-base + krb5-locales + less + locales + logrotate + lsof + manpages + nano + ncurses-term + netcat-traditional + pciutils + reportbug + rsyslog + tasksel + telnet + traceroute + unattended-upgrades + vim-* + wamerican + wget + whiptail + xxd + xz-utils +" +apt-get purge $purge + apt-get upgrade --download-only apt-get upgrade @@ -67,7 +115,14 @@ packages=" apt-get install $packages --download-only apt-get install $packages +apt-get autoremove --purge + +# fdroidserver comes from git, it was installed just for dependencies apt-get purge fdroidserver +# clean up things that will become outdated anyway +apt-get clean +rm -rf /var/lib/apt/lists/* + highestjava=`update-java-alternatives --list | sort -n | tail -1 | cut -d ' ' -f 1` update-java-alternatives --set $highestjava From 7976ecc12af5a460b2755494d460aeb1d2ae58c7 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 25 Oct 2022 19:11:24 +0200 Subject: [PATCH 0883/2116] buildserver: mark fdroidserver deps as manual This lets build steps use `apt-get autoremove` and still have a working fdroidserver. --- buildserver/Dockerfile | 1 - buildserver/provision-apt-get-install | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/buildserver/Dockerfile b/buildserver/Dockerfile index fcb50974..73f5ffe3 100644 --- a/buildserver/Dockerfile +++ b/buildserver/Dockerfile @@ -53,7 +53,6 @@ RUN printf "path-exclude=/usr/share/locale/*\npath-exclude=/usr/share/man/*\npat && bash /opt/buildserver/provision-gradle \ && bash /opt/buildserver/provision-buildserverid $GIT_REV_PARSE_HEAD \ && rm -rf /vagrant/cache \ - && apt-mark manual `apt-cache depends fdroidserver | sed -nE 's,^[| ]*Depends: ([a-z0-9 -]+),\1,p'` \ && apt-get autoremove --purge \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index 7edec156..b369d36f 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -115,12 +115,13 @@ packages=" apt-get install $packages --download-only apt-get install $packages -apt-get autoremove --purge # fdroidserver comes from git, it was installed just for dependencies +apt-mark manual `apt-cache depends fdroidserver | sed -nE 's,^[| ]*Depends: ([a-z0-9 -]+),\1,p'` apt-get purge fdroidserver # clean up things that will become outdated anyway +apt-get autoremove --purge apt-get clean rm -rf /var/lib/apt/lists/* From 618e2c7d72a8e46a14983e328e9d58d16b92867f Mon Sep 17 00:00:00 2001 From: linsui Date: Thu, 27 Oct 2022 19:11:37 +0800 Subject: [PATCH 0884/2116] change VercodeOperation to TYPE_LIST --- .gitlab-ci.yml | 2 ++ fdroidserver/checkupdates.py | 10 +++------- fdroidserver/lint.py | 7 +------ fdroidserver/metadata.py | 3 ++- tests/lint.TestCase | 4 ++-- tests/metadata/dump/com.politedroid.yaml | 2 +- tests/metadata/dump/org.adaway.yaml | 2 +- tests/metadata/dump/org.smssecure.smssecure.yaml | 2 +- tests/metadata/dump/org.videolan.vlc.yaml | 3 ++- tests/metadata/org.videolan.vlc.yml | 3 ++- tests/update.TestCase | 2 +- 11 files changed, 18 insertions(+), 22 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 46463e6b..a635b038 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -59,6 +59,8 @@ metadata_v0: -e "s/CurrentVersionCode:.'\([0-9]*\)'/CurrentVersionCode:\1/" -e "s/ versionCode:.'\([0-9]*\)'/ versionCode:\1/" -e "s/ timeout:.'\([0-9]*\)'/ timeout:\1/" + -e "/VercodeOperation/s/null/[]/" + -e 's/VercodeOperation:.\([^[]\+\)/VercodeOperation:\n- \1/' metadata/dump_*/*.yaml - diff -uw metadata/dump_* diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 756a8064..c5318742 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -456,13 +456,9 @@ def checkupdates_app(app): raise FDroidException(_('no version information found')) if app.VercodeOperation: - if isinstance(app.VercodeOperation, str): - vercodes = [operate_vercode(app.VercodeOperation, vercode)] - else: - vercodes = sorted([ - operate_vercode(operation, vercode) - for operation in app.VercodeOperation - ]) + vercodes = sorted([ + operate_vercode(operation, vercode) for operation in app.VercodeOperation + ]) else: vercodes = [vercode] diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index c4c98143..6e11c8a6 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -264,13 +264,8 @@ def check_update_check_data_url(app): # noqa: D403 def check_vercode_operation(app): if not app.VercodeOperation: return - ops = ( - [app.VercodeOperation] - if isinstance(app.VercodeOperation, str) - else app.VercodeOperation - ) invalid_ops = [] - for op in ops: + for op in app.VercodeOperation: if not common.VERCODE_OPERATION_RE.match(op): invalid_ops += op if invalid_ops: diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 9c08b584..43c2ca9d 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -153,7 +153,7 @@ class App(dict): self.AutoUpdateMode = 'None' self.UpdateCheckMode = 'None' self.UpdateCheckIgnore = None - self.VercodeOperation = None + self.VercodeOperation = [] self.UpdateCheckName = None self.UpdateCheckData = None self.CurrentVersion = '' @@ -204,6 +204,7 @@ fieldtypes = { 'AntiFeatures': TYPE_LIST, 'AllowedAPKSigningKeys': TYPE_LIST, 'Builds': TYPE_BUILD, + 'VercodeOperation': TYPE_LIST, 'CurrentVersionCode': TYPE_INT, } diff --git a/tests/lint.TestCase b/tests/lint.TestCase index 3cf6b857..07f775c4 100755 --- a/tests/lint.TestCase +++ b/tests/lint.TestCase @@ -222,7 +222,7 @@ class LintTest(unittest.TestCase): anywarns = False for good in good_fields: - app.VercodeOperation = good + app.VercodeOperation = [good] for warn in fdroidserver.lint.check_vercode_operation(app): anywarns = True logging.debug(warn) @@ -230,7 +230,7 @@ class LintTest(unittest.TestCase): for bad in bad_fields: anywarns = False - app.VercodeOperation = bad + app.VercodeOperation = [bad] for warn in fdroidserver.lint.check_vercode_operation(app): anywarns = True logging.debug(warn) diff --git a/tests/metadata/dump/com.politedroid.yaml b/tests/metadata/dump/com.politedroid.yaml index 01ea946e..aacff98c 100644 --- a/tests/metadata/dump/com.politedroid.yaml +++ b/tests/metadata/dump/com.politedroid.yaml @@ -178,7 +178,7 @@ UpdateCheckData: null UpdateCheckIgnore: null UpdateCheckMode: Tags UpdateCheckName: null -VercodeOperation: null +VercodeOperation: [] WebSite: '' added: null comments: {} diff --git a/tests/metadata/dump/org.adaway.yaml b/tests/metadata/dump/org.adaway.yaml index dd1fcd4f..7fe21c4d 100644 --- a/tests/metadata/dump/org.adaway.yaml +++ b/tests/metadata/dump/org.adaway.yaml @@ -1084,7 +1084,7 @@ UpdateCheckData: null UpdateCheckIgnore: null UpdateCheckMode: Tags UpdateCheckName: null -VercodeOperation: null +VercodeOperation: [] WebSite: http://sufficientlysecure.org/index.php/adaway added: null comments: {} diff --git a/tests/metadata/dump/org.smssecure.smssecure.yaml b/tests/metadata/dump/org.smssecure.smssecure.yaml index c3ad76b6..b010502b 100644 --- a/tests/metadata/dump/org.smssecure.smssecure.yaml +++ b/tests/metadata/dump/org.smssecure.smssecure.yaml @@ -360,7 +360,7 @@ UpdateCheckData: null UpdateCheckIgnore: null UpdateCheckMode: Tags UpdateCheckName: null -VercodeOperation: null +VercodeOperation: [] WebSite: http://www.smssecure.org added: null comments: {} diff --git a/tests/metadata/dump/org.videolan.vlc.yaml b/tests/metadata/dump/org.videolan.vlc.yaml index 652b5c2b..569724d8 100644 --- a/tests/metadata/dump/org.videolan.vlc.yaml +++ b/tests/metadata/dump/org.videolan.vlc.yaml @@ -2442,7 +2442,8 @@ UpdateCheckData: null UpdateCheckIgnore: null UpdateCheckMode: Tags UpdateCheckName: null -VercodeOperation: '%c + 5' +VercodeOperation: + - '%c + 5' WebSite: http://www.videolan.org/vlc/download-android.html added: null comments: {} diff --git a/tests/metadata/org.videolan.vlc.yml b/tests/metadata/org.videolan.vlc.yml index 62afe259..969c9674 100644 --- a/tests/metadata/org.videolan.vlc.yml +++ b/tests/metadata/org.videolan.vlc.yml @@ -804,6 +804,7 @@ ArchivePolicy: 9 versions AutoUpdateMode: None UpdateCheckMode: Tags # Only use higher vercode ops, if we do build those arches -VercodeOperation: "%c + 5" +VercodeOperation: + - "%c + 5" CurrentVersion: 1.2.6 CurrentVersionCode: 1030005 diff --git a/tests/update.TestCase b/tests/update.TestCase index 5b4e8142..59c1aac5 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1447,7 +1447,7 @@ class UpdateTest(unittest.TestCase): 'UpdateCheckIgnore': '', 'UpdateCheckMode': '', 'UpdateCheckName': '', - 'VercodeOperation': '', + 'VercodeOperation': None, 'WebSite': '', }, ) From afec880c81b58683bfa10680d95c68ae0408bd5f Mon Sep 17 00:00:00 2001 From: Ashutosh Gangwar Date: Sun, 30 Oct 2022 19:00:51 +0530 Subject: [PATCH 0885/2116] use default.txt as fallback changelog when inserting fastlane metadata --- fdroidserver/update.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 1ed8a3a8..1bf20530 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -996,6 +996,12 @@ def insert_localized_app_metadata(apps): locale = segments[-2] _set_localized_text_entry(apps[packageName], locale, 'whatsNew', os.path.join(root, f)) + elif f == 'default.txt': + # use `default.txt` changelog entry as fallback. + localized = _get_localized_dict(apps[packageName], locale) + if not localized.get('whatsNew', ''): + _set_localized_text_entry(apps[packageName], locale, 'whatsNew', + os.path.join(root, f)) base, extension = common.get_extension(f) From 8b484b37bd51dec17e42a8485266ab2a5a55306a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 31 Oct 2022 09:23:09 +0100 Subject: [PATCH 0886/2116] add tests for Fastlane changelogs including default.txt --- fdroidserver/update.py | 2 +- .../en-US/changelogs/default.txt | 1 + tests/update.TestCase | 46 +++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 tests/metadata/info.guardianproject.urzip/en-US/changelogs/default.txt diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 1bf20530..a6c086ea 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -997,7 +997,7 @@ def insert_localized_app_metadata(apps): _set_localized_text_entry(apps[packageName], locale, 'whatsNew', os.path.join(root, f)) elif f == 'default.txt': - # use `default.txt` changelog entry as fallback. + # use "default.txt" changelog entry as fallback. localized = _get_localized_dict(apps[packageName], locale) if not localized.get('whatsNew', ''): _set_localized_text_entry(apps[packageName], locale, 'whatsNew', diff --git a/tests/metadata/info.guardianproject.urzip/en-US/changelogs/default.txt b/tests/metadata/info.guardianproject.urzip/en-US/changelogs/default.txt new file mode 100644 index 00000000..331d858c --- /dev/null +++ b/tests/metadata/info.guardianproject.urzip/en-US/changelogs/default.txt @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/tests/update.TestCase b/tests/update.TestCase index 59c1aac5..a46b0fb9 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -74,6 +74,7 @@ class UpdateTest(unittest.TestCase): def setUp(self): logging.basicConfig(level=logging.INFO) + logging.getLogger('androguard.apk').setLevel(logging.WARNING) logging.getLogger('androguard.axml').setLevel(logging.INFO) logging.getLogger('androguard.core.api_specific_resources').setLevel(logging.INFO) from PIL import PngImagePlugin @@ -212,6 +213,49 @@ class UpdateTest(unittest.TestCase): elif packageName == 'eu.siacs.conversations': self.assertEqual('Conversations', app['localized']['en-US']['name']) + def test_insert_fastlane_default_txt_changelog(self): + """Test that Fastlane's default.txt is handled properly + + https://docs.fastlane.tools/actions/supply/#changelogs-whats-new + """ + tmptestsdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.chdir(tmptestsdir) + + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.update.config = config + + app = fdroidserver.metadata.App() + app.id = 'com.example.app' + changelogs_dir = 'build/%s/metadata/en-US/changelogs' % app.id + os.makedirs(changelogs_dir) + with open(os.path.join(changelogs_dir, 'default.txt'), 'w') as fp: + fp.write('default') + with open(os.path.join(changelogs_dir, '42.txt'), 'w') as fp: + fp.write('42') + apps = {app.id: app} + build = fdroidserver.metadata.Build() + build.versionCode = 42 + app['Builds'] = [build] + + fdroidserver.update.insert_localized_app_metadata(apps) + self.assertEqual('default', apps[app.id]['localized']['en-US']['whatsNew']) + + app.CurrentVersionCode = 1 + fdroidserver.update.insert_localized_app_metadata(apps) + self.assertEqual('default', apps[app.id]['localized']['en-US']['whatsNew']) + + app.CurrentVersionCode = 10000 + fdroidserver.update.insert_localized_app_metadata(apps) + self.assertEqual('default', apps[app.id]['localized']['en-US']['whatsNew']) + + app.CurrentVersionCode = 42 + fdroidserver.update.insert_localized_app_metadata(apps) + self.assertEqual('42', apps[app.id]['localized']['en-US']['whatsNew']) + + def test_name_title_scraping(self): """metadata file --> fdroiddata localized files --> fastlane/triple-t in app source --> APK""" config = dict() @@ -225,6 +269,7 @@ class UpdateTest(unittest.TestCase): fdroidserver.update.options.delete_unknown = True apps = fdroidserver.metadata.read_metadata() + apps['info.guardianproject.urzip']['CurrentVersionCode'] = 100 knownapks = fdroidserver.common.KnownApks() apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False) fdroidserver.update.insert_localized_app_metadata(apps) @@ -233,6 +278,7 @@ class UpdateTest(unittest.TestCase): self.assertIsNone(app.Name) self.assertTrue('localized' in app) self.assertEqual('title', app['localized']['en-US']['name']) + self.assertEqual('100\n', app['localized']['en-US']['whatsNew']) app = apps['org.videolan.vlc'] self.assertIsNone(app.Name) self.assertTrue('localized' in app) From f149b8fbe1a6ad81098f50e9ed45da9d8e2125c1 Mon Sep 17 00:00:00 2001 From: FC Stegerman Date: Sun, 30 Oct 2022 22:38:26 +0000 Subject: [PATCH 0887/2116] gradlew-fdroid: use curl --retry 3 --retry-all-errors --- gradlew-fdroid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index a7eaa6db..c2281a74 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -46,7 +46,7 @@ download_gradle() { else tmpdir=$(mktemp -d) fi - curl -o "${tmpdir}/gradle-$1-bin.zip" --silent --fail --show-error --location "${URL}" + curl -o "${tmpdir}/gradle-$1-bin.zip" --silent --fail --show-error --location --retry 3 --retry-all-errors "${URL}" gradle_zip="${tmpdir}/gradle-$1-bin.zip" fi echo "${shasum} ${gradle_zip}" | sha256sum -c - From e799f32d7160cd0943b72e648cc82eeb85ed3de8 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 31 Oct 2022 09:52:32 +0100 Subject: [PATCH 0888/2116] set black to format to py38 to support Debian/bullseye package Debian/bullseye (stable) includes black v20.8b1, which does not yet know about the py39 target-version. --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 558596e9..9e7fc078 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.black] skip-string-normalization = true -target-version = ["py39"] +target-version = ["py38"] [tool.mypy] From 99e0c28d37485f37ce6c5c870bc1bed56a983770 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 31 Oct 2022 09:54:45 +0100 Subject: [PATCH 0889/2116] run black on tests/updates.TestCase to fix lint failure --- tests/update.TestCase | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/tests/update.TestCase b/tests/update.TestCase index a46b0fb9..12380d1b 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -102,28 +102,27 @@ class UpdateTest(unittest.TestCase): repo_dir = os.path.join(self.basedir, 'repo') os.mkdir('metadata') for packageName in ( - 'obb.mainpatch.current', - 'org.videolan.vlc', + 'obb.mainpatch.current', + 'org.videolan.vlc', ): shutil.copytree( - os.path.join(repo_dir, packageName), - os.path.join('repo', packageName) + os.path.join(repo_dir, packageName), os.path.join('repo', packageName) ) for packageName in ( - 'info.guardianproject.checkey', - 'info.guardianproject.urzip', - 'org.smssecure.smssecure', + 'info.guardianproject.checkey', + 'info.guardianproject.urzip', + 'org.smssecure.smssecure', ): if not os.path.exists('metadata'): os.mkdir('metadata') shutil.copytree( os.path.join(self.basedir, 'metadata', packageName), - os.path.join('metadata', packageName) + os.path.join('metadata', packageName), ) for packageName in ( - 'com.nextcloud.client', - 'com.nextcloud.client.dev', - 'eu.siacs.conversations', + 'com.nextcloud.client', + 'com.nextcloud.client.dev', + 'eu.siacs.conversations', ): shutil.copytree( os.path.join(self.basedir, 'source-files', packageName), @@ -255,7 +254,6 @@ class UpdateTest(unittest.TestCase): fdroidserver.update.insert_localized_app_metadata(apps) self.assertEqual('42', apps[app.id]['localized']['en-US']['whatsNew']) - def test_name_title_scraping(self): """metadata file --> fdroiddata localized files --> fastlane/triple-t in app source --> APK""" config = dict() @@ -360,7 +358,7 @@ class UpdateTest(unittest.TestCase): appid = 'info.guardianproject.checkey' testapps = {appid: copy.copy(apps[appid])} self.assertEqual('Checkey the app!', testapps[appid]['Name']) - del (testapps[appid]['Name']) + del testapps[appid]['Name'] fdroidserver.update.insert_missing_app_names_from_apks(testapps, apks) self.assertIsNone(testapps[appid].get('Name')) From 97f3e78fa80a2e59b21181d4d6a5b4c25739ca05 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 31 Oct 2022 10:05:40 +0100 Subject: [PATCH 0890/2116] fixup from 8b484b37bd51 in !1240 --- MANIFEST.in | 1 + tests/repo/index-v1.json | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index 6415d387..297dae0b 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -596,6 +596,7 @@ include tests/metadata/info.guardianproject.checkey/en-US/summary.txt include tests/metadata/info.guardianproject.checkey/ja-JP/name.txt include tests/metadata/info.guardianproject.checkey.yml include tests/metadata/info.guardianproject.urzip/en-US/changelogs/100.txt +include tests/metadata/info.guardianproject.urzip/en-US/changelogs/default.txt include tests/metadata/info.guardianproject.urzip/en-US/full_description.txt include tests/metadata/info.guardianproject.urzip/en-US/images/featureGraphic.png include tests/metadata/info.guardianproject.urzip/en-US/images/icon.png diff --git a/tests/repo/index-v1.json b/tests/repo/index-v1.json index 409f333a..257a815d 100644 --- a/tests/repo/index-v1.json +++ b/tests/repo/index-v1.json @@ -221,7 +221,8 @@ "icon": "icon_NJXNzMcyf-v9i5a1ElJi0j9X1LvllibCa48xXYPlOqQ=.png", "name": "title", "summary": "short description", - "video": "video" + "video": "video", + "whatsNew": "default" } } } From ffc3fbe28883e07a4c780f5fa757ce8f1eed3728 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 31 Oct 2022 12:50:06 +0100 Subject: [PATCH 0891/2116] handle default.txt changelog in fdroid metadata/ fixup !1240 --- fdroidserver/update.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index a6c086ea..5f1178d8 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -998,6 +998,7 @@ def insert_localized_app_metadata(apps): os.path.join(root, f)) elif f == 'default.txt': # use "default.txt" changelog entry as fallback. + locale = segments[-2] localized = _get_localized_dict(apps[packageName], locale) if not localized.get('whatsNew', ''): _set_localized_text_entry(apps[packageName], locale, 'whatsNew', From ca13325913863ed071b893696a825fde08776ae4 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 31 Oct 2022 12:55:20 +0100 Subject: [PATCH 0892/2116] gitlab-ci: simplify ubuntu_jammy_pip job, babel is not needed Babel runs on install now, before it was used to pre-generated the compiled gettext files. --- .gitlab-ci.yml | 13 ++++++------- .yamllint | 5 +++++ 2 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 .yamllint diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a635b038..4fe44dba 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,3 +1,4 @@ +--- variables: pip: pip3 --timeout 100 --retries 10 @@ -136,16 +137,14 @@ ubuntu_jammy_pip: <<: *apt-template script: - apt-get install git default-jdk-headless python3-pip python3-venv rsync - - rm -rf env - - python3 -m venv env - - . env/bin/activate - - $pip install --upgrade babel pip setuptools + # setup venv to act as release build machine - - python -m venv sdist-env + - python3 -m venv sdist-env - . sdist-env/bin/activate - ./setup.py sdist - deactivate - tar tzf dist/fdroidserver-*.tar.gz + # back to bare machine to act as user's install machine - export ANDROID_HOME=/opt/android-sdk - $pip install sdkmanager @@ -354,7 +353,7 @@ fdroid build: # TODO remove sdkmanager install once it is included in the buildserver image - apt-get install sdkmanager - - rm -rf "$ANDROID_HOME/tools" # TODO remove once sdkmanager can upgrade installed packages + - rm -rf "$ANDROID_HOME/tools" # TODO remove once sdkmanager can upgrade installed packages - sdkmanager "tools" "platform-tools" "build-tools;31.0.0" - git ls-remote https://gitlab.com/fdroid/fdroiddata.git master @@ -462,7 +461,7 @@ servergitmirrors: - python3 -m venv --system-site-packages env - . env/bin/activate - export PYTHONPATH=`pwd` - - export SETUPTOOLS_USE_DISTUTILS=stdlib # https://github.com/pypa/setuptools/issues/2956 + - export SETUPTOOLS_USE_DISTUTILS=stdlib # https://github.com/pypa/setuptools/issues/2956 - $pip install -e . - mkdir /root/.ssh/ - ./tests/key-tricks.py diff --git a/.yamllint b/.yamllint new file mode 100644 index 00000000..6105b5d4 --- /dev/null +++ b/.yamllint @@ -0,0 +1,5 @@ +--- + +extends: default +rules: + line-length: disable From cd0c049b034d247b64082d301dcbf39db45aa91d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 20 Oct 2022 11:33:41 +0200 Subject: [PATCH 0893/2116] btlog: include index-v2 files --- fdroidserver/btlog.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/btlog.py b/fdroidserver/btlog.py index b5499d09..870ff93b 100755 --- a/fdroidserver/btlog.py +++ b/fdroidserver/btlog.py @@ -91,7 +91,7 @@ For more info on this idea: cpdir = os.path.join(btrepo, repodir) if not os.path.exists(cpdir): os.mkdir(cpdir) - for f in ('index.xml', 'index-v1.json'): + for f in ('index.xml', 'index-v1.json', 'index-v2.json', 'entry.json'): repof = os.path.join(repodir, f) if not os.path.exists(repof): continue @@ -107,7 +107,7 @@ For more info on this idea: with open(dest, 'w') as fp: json.dump(output, fp, indent=2) gitrepo.index.add([repof]) - for f in ('index.jar', 'index-v1.jar'): + for f in ('index.jar', 'index-v1.jar', 'entry.jar'): repof = os.path.join(repodir, f) if not os.path.exists(repof): continue From 886712026de6cb2a6de3949caa106ae83df12d83 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 1 Nov 2022 09:53:09 +0100 Subject: [PATCH 0894/2116] index: Anti-Features should always be a sorted set There are diffs in the index caused by unstable order: * https://gitlab.com/fdroid/f-droid.org-transparency-log/-/commit/184cdd9c656edefbc7d48873c6046ad931ac4f93#572d84bb16becb794e10614840972554f333c66e_169259_169353 * https://gitlab.com/fdroid/f-droid.org-transparency-log/-/commit/184cdd9c656edefbc7d48873c6046ad931ac4f93#24c372740761176e67461dbc9136a799b15cfdbf_204154_204185 --- fdroidserver/index.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index f4f5c08f..a29d32c5 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -910,7 +910,7 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ k = k[:1].lower() + k[1:] d[k] = v - # establish sort order in localized dicts + # establish sort order in lists, sets, and localized dicts for app in output['apps']: localized = app.get('localized') if localized: @@ -920,6 +920,9 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ for ikey, iname in sorted(lvalue.items()): lordered[lkey][ikey] = iname app['localized'] = lordered + antiFeatures = app.get('AntiFeatures') + if antiFeatures: + app['AntiFeatures'] = sorted(set(antiFeatures)) output_packages = collections.OrderedDict() output['packages'] = output_packages @@ -1192,7 +1195,8 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing if 'antiFeatures' in apklist[0]: app.AntiFeatures.extend(apklist[0]['antiFeatures']) if app.AntiFeatures: - addElementNonEmpty('antifeatures', ','.join(app.AntiFeatures), doc, apel) + afout = sorted(set(app.AntiFeatures)) + addElementNonEmpty('antifeatures', ','.join(afout), doc, apel) # Check for duplicates - they will make the client unhappy... for i in range(len(apklist) - 1): From 890513fcbaa7f0eca24981af4febe35e1441f826 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 1 Nov 2022 09:54:06 +0100 Subject: [PATCH 0895/2116] index: standardized AntiFeature variable names This is the only occurance of "anti_features". --- fdroidserver/index.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index a29d32c5..28f0f285 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -721,9 +721,9 @@ def v2_repo(repodict, repodir, archive): repo["timestamp"] = repodict["timestamp"] - anti_features = load_locale("antiFeatures", repodir) - if anti_features: - repo["antiFeatures"] = anti_features + antiFeatures = load_locale("antiFeatures", repodir) + if antiFeatures: + repo["antiFeatures"] = antiFeatures categories = load_locale("categories", repodir) if categories: From 6c5ffdc428bc7b7292f78310c9f196095c7b6949 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 3 Nov 2022 12:44:21 +0100 Subject: [PATCH 0896/2116] buildserver: clean up secondary libvirt box image after rebuild Boxes are stored in two places when using vagrant-libvirt: 1. `vagrant box add` -> ~/.vagrant.d/boxes/buildserver/0/libvirt/ 2. `vagrant up` -> /var/lib/libvirt/images/buildserver_vagrant_box_image_0_box.img If the second box is not cleaned up, then `fdroid build` will continue to use the one from the second location, thereby ignoring the updated one at the first location. This keeps the second one around until the new box is ready in case `fdroid build` is using it while this script is running. --- makebuildserver | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/makebuildserver b/makebuildserver index fe2cc9b1..21432a38 100755 --- a/makebuildserver +++ b/makebuildserver @@ -435,6 +435,22 @@ def main(): logging.critical('could not add box \'%s\' as \'buildserver\', terminating', boxfile) sys.exit(1) + # Boxes are stored in two places when using vagrant-libvirt: + # + # 1. `vagrant box add` -> ~/.vagrant.d/boxes/buildserver/0/libvirt/ + # 2. `vagrant up` -> /var/lib/libvirt/images/buildserver_vagrant_box_image_0_box.img + # + # If the second box is not cleaned up, then `fdroid build` will + # continue to use that one from the second location, thereby + # ignoring the updated one at the first location. This process + # keeps the second one around until the new box is ready in case + # `fdroid build` is using it while this script is running. + img = 'buildserver_vagrant_box_image_0_box.img' + if os.path.exists(os.path.join('/var/lib/libvirt/images', img)): + subprocess.call( + ['virsh', '-c', 'qemu:///system', 'vol-delete', '--pool', 'default', '--vol', img] + ) + if not options.keep_box_file: logging.debug("""box added to vagrant, removing generated box file '%s'""", boxfile) From 557fe87d44d4048cd08e44106c03087c5f8464c6 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 9 Sep 2022 12:36:54 +0200 Subject: [PATCH 0897/2116] Run shell scripts with -e (Closes: #1035) Make sudo, init prebuild, build and Prepare fields lists and only concatenate them with '; ' before execution. This allows arbitrary commands inside the fileds (even && and ';') as we don't need to split the commands again for rewritemeta. --- fdroidserver/build.py | 6 +- fdroidserver/common.py | 12 +- fdroidserver/metadata.py | 18 +- tests/common.TestCase | 2 +- tests/dump_internal_metadata_format.py | 12 +- tests/metadata.TestCase | 126 +++--- tests/metadata/dump/com.politedroid.yaml | 3 +- tests/metadata/dump/org.adaway.yaml | 86 ++-- .../dump/org.smssecure.smssecure.yaml | 70 +++- tests/metadata/dump/org.videolan.vlc.yaml | 396 ++++++++++++------ 10 files changed, 477 insertions(+), 254 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 0549bb48..ad9c090f 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -390,7 +390,7 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext logging.info("Running 'sudo' commands in %s" % os.getcwd()) p = FDroidPopen(['sudo', 'DEBIAN_FRONTEND=noninteractive', - 'bash', '-x', '-c', build.sudo]) + 'bash', '-e', '-u', '-o', 'pipefail', '-x', '-c', '; '.join(build.sudo)]) if p.returncode != 0: raise BuildException("Error running sudo command for %s:%s" % (app.id, build.versionName), p.output) @@ -535,13 +535,13 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext # Run a build command if one is required... if build.build: logging.info("Running 'build' commands in %s" % root_dir) - cmd = common.replace_config_vars(build.build, build) + cmd = common.replace_config_vars("; ".join(build.build), build) # Substitute source library paths into commands... for name, number, libpath in srclibpaths: cmd = cmd.replace('$$' + name + '$$', os.path.join(os.getcwd(), libpath)) - p = FDroidPopen(['bash', '-x', '-c', cmd], cwd=root_dir) + p = FDroidPopen(['bash', '-e', '-u', '-o', 'pipefail', '-x', '-c', cmd], cwd=root_dir) if p.returncode != 0: raise BuildException("Error running build command for %s:%s" % diff --git a/fdroidserver/common.py b/fdroidserver/common.py index d8038cdf..a8a93cd4 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2055,9 +2055,9 @@ def getsrclib(spec, srclib_dir, basepath=False, if prepare: if srclib["Prepare"]: - cmd = replace_config_vars(srclib["Prepare"], build) + cmd = replace_config_vars("; ".join(srclib["Prepare"]), build) - p = FDroidPopen(['bash', '-x', '-c', '--', cmd], cwd=libdir) + p = FDroidPopen(['bash', '-e', '-u', '-o', 'pipefail', '-x', '-c', '--', cmd], cwd=libdir) if p.returncode != 0: raise BuildException("Error running prepare command for srclib %s" % name, p.output) @@ -2119,10 +2119,10 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver= # Run an init command if one is required if build.init: - cmd = replace_config_vars(build.init, build) + cmd = replace_config_vars("; ".join(build.init), build) logging.info("Running 'init' commands in %s" % root_dir) - p = FDroidPopen(['bash', '-x', '-c', '--', cmd], cwd=root_dir) + p = FDroidPopen(['bash', '-e', '-u', '-o', 'pipefail', '-x', '-c', '--', cmd], cwd=root_dir) if p.returncode != 0: raise BuildException("Error running init command for %s:%s" % (app.id, build.versionName), p.output) @@ -2286,13 +2286,13 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver= if build.prebuild: logging.info("Running 'prebuild' commands in %s" % root_dir) - cmd = replace_config_vars(build.prebuild, build) + cmd = replace_config_vars("; ".join(build.prebuild), build) # Substitute source library paths into prebuild commands for name, number, libpath in srclibpaths: cmd = cmd.replace('$$' + name + '$$', os.path.join(os.getcwd(), libpath)) - p = FDroidPopen(['bash', '-x', '-c', '--', cmd], cwd=root_dir) + p = FDroidPopen(['bash', '-e', '-u', '-o', 'pipefail', '-x', '-c', '--', cmd], cwd=root_dir) if p.returncode != 0: raise BuildException("Error running prebuild command for %s:%s" % (app.id, build.versionName), p.output) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 43c2ca9d..64122b62 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -516,8 +516,11 @@ def parse_yaml_srclib(metadatapath): thisinfo[key] = data[key] elif data[key] is None: thisinfo[key] = [''] - elif key == 'Prepare' and isinstance(data[key], list): - thisinfo[key] = ' && '.join(data[key]) + elif key == 'Prepare' or flagtype(key) == TYPE_SCRIPT: + if isinstance(data[key], list): + thisinfo[key] = data[key] + else: + thisinfo[key] = [data[key]] if data[key] else [] else: thisinfo[key] = str(data[key] or '') @@ -847,9 +850,8 @@ def post_parse_yaml_metadata(yamldata): _flagtype = flagtype(flag) if _flagtype is TYPE_SCRIPT: - # concatenate script flags into a single string if they are stored as list - if isinstance(build[flag], list): - build[flag] = ' && '.join(build[flag]) + if isinstance(build[flag], str): + build[flag] = [build[flag]] elif _flagtype is TYPE_STRING: # things like versionNames are strings, but without quotes can be numbers if isinstance(build[flag], float) or isinstance(build[flag], int): @@ -916,12 +918,6 @@ def write_yaml(mf, app): return value[0] else: return value - else: - script_lines = value.split(' && ') - if len(script_lines) > 1: - return script_lines - else: - return value else: return value diff --git a/tests/common.TestCase b/tests/common.TestCase index bbf692de..fbf277e9 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -375,7 +375,7 @@ class CommonTest(unittest.TestCase): build = fdroidserver.metadata.Build() build.commit = 'master' build.gradle = ['yes'] - build.prebuild = 'test -d $$FakeSrcLib$$/testdirshouldexist' # actual test condition + build.prebuild = ['test -d $$FakeSrcLib$$/testdirshouldexist'] # actual test condition build.srclibs = [srclibname + '@1.2.3'] build.subdir = subdir build.versionCode = 0xCAFE diff --git a/tests/dump_internal_metadata_format.py b/tests/dump_internal_metadata_format.py index c3975902..5dade52b 100755 --- a/tests/dump_internal_metadata_format.py +++ b/tests/dump_internal_metadata_format.py @@ -40,7 +40,17 @@ import fdroidserver.metadata # noqa def _build_yaml_representer(dumper, data): """Create a YAML representation of a Build instance.""" - return dumper.represent_dict(data) + # internal representation of keys were switched + # to lists instead of strings concatenated by && + # https://gitlab.com/fdroid/fdroidserver/merge_requests/1185 + output = {} + for k, v in data.items(): + if k in ("build", "init", "prebuild", "sudo"): + output[k] = " && ".join(v) + else: + output[k] = v + + return dumper.represent_dict(output) parser = ArgumentParser() diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 607dc92f..ef018b99 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -504,15 +504,24 @@ class MetadataTest(unittest.TestCase): { 'versionCode': 1, 'versionName': 'v0.1.0', - 'sudo': "apt-get update && " - "apt-get install -y whatever && " - "sed -i -e 's/> /a/file", - 'build': "./gradlew someSpecialTask && " - "sed -i 'd/that wrong config/' gradle.properties && " - "./gradlew compile", + 'sudo': [ + "apt-get update", + "apt-get install -y whatever", + "sed -i -e 's/> /a/file", + ], + 'build': [ + "./gradlew someSpecialTask", + "sed -i 'd/that wrong config/' gradle.properties", + "./gradlew compile", + ], } ], }, @@ -551,15 +560,23 @@ class MetadataTest(unittest.TestCase): { 'versionCode': 1, 'versionName': 'v0.1.0', - 'sudo': "apt-get update && " - "apt-get install -y whatever && " - "sed -i -e 's/> /a/file", - 'build': "./gradlew someSpecialTask && " - "sed -i 'd/that wrong config/' gradle.properties && " - "./gradlew compile", + 'sudo': [ + "apt-get update && " + "apt-get install -y whatever && " + "sed -i -e 's/> /a/file" + ], + 'build': [ + "./gradlew someSpecialTask && " + "sed -i 'd/that wrong config/' gradle.properties && " + "./gradlew compile" + ], } ], }, @@ -593,7 +610,7 @@ class MetadataTest(unittest.TestCase): { 'versionCode': 1, 'versionName': 'v0.1.0', - 'prebuild': "a && b && " "sed -i 's,a,b,'", + 'prebuild': ["a && b && " "sed -i 's,a,b,'"], } ], }, @@ -630,10 +647,10 @@ class MetadataTest(unittest.TestCase): build = fdroidserver.metadata.Build() build.versionCode = 102030 build.versionName = 'v1.2.3' - build.sudo = "chmod +rwx /opt" - build.init = "sed -i -e 'g/what/ever/' /some/file" - build.prebuild = "sed -i 'd/that wrong config/' gradle.properties" - build.build = "./gradlew compile" + build.sudo = ["chmod +rwx /opt"] + build.init = ["sed -i -e 'g/what/ever/' /some/file"] + build.prebuild = ["sed -i 'd/that wrong config/' gradle.properties"] + build.build = ["./gradlew compile"] app['Builds'].append(build) fdroidserver.metadata.write_yaml(mf, app) mf.seek(0) @@ -762,10 +779,21 @@ class MetadataTest(unittest.TestCase): build = fdroidserver.metadata.Build() build.versionCode = 102030 build.versionName = 'v1.2.3' - build.sudo = "apt-get update && apt-get install -y whatever && sed -i -e 's/> /a/file"] + build.build = [ + "./gradlew someSpecialTask", + "sed -i 'd/that wrong config/' gradle.properties", + "./gradlew compile", + ] app['Builds'].append(build) fdroidserver.metadata.write_yaml(mf, app) mf.seek(0) @@ -914,7 +942,7 @@ class MetadataTest(unittest.TestCase): 'Repo': 'https://git.host/repo.git', 'RepoType': 'git', 'Subdir': [''], - 'Prepare': '', + 'Prepare': [], }, srclib, ) @@ -943,9 +971,11 @@ class MetadataTest(unittest.TestCase): 'Repo': 'https://github.com/cketti/ckChangeLog', 'RepoType': 'git', 'Subdir': ['library', 'ckChangeLog/src/main'], - 'Prepare': "[ -f project.properties ] || echo 'source.dir=java' > " - "ant.properties && echo -e " - "'android.library=true\\ntarget=android-19' > project.properties", + 'Prepare': [ + "[ -f project.properties ] || echo 'source.dir=java' > " + "ant.properties && echo -e " + "'android.library=true\\ntarget=android-19' > project.properties" + ], }, ) @@ -993,8 +1023,10 @@ class MetadataTest(unittest.TestCase): 'You take the red pill—you stay in Wonderland', 'and I show you how deep the rabbit-hole goes.', ], - 'Prepare': 'There is a difference between knowing the path ' - 'and walking the path.', + 'Prepare': [ + 'There is a difference between knowing the path ' + 'and walking the path.' + ], } }, ) @@ -1014,14 +1046,10 @@ class MetadataTest(unittest.TestCase): Subdir: Prepare: - - The Matrix is a system, Neo. - - That system is our enemy. - - But when you're inside, you look around, what do you see? - - Businessmen, teachers, lawyers, carpenters. - - The very minds of the people we are trying to save. - - But until we do, these people are still a part of that system and that makes them our enemy. - - You have to understand, most of these people are not ready to be unplugged. - - And many of them are so inert, so hopelessly dependent on the system that they will fight to protect it. + - Many + - invalid + - commands + - here. ''' ) ) @@ -1034,14 +1062,12 @@ class MetadataTest(unittest.TestCase): 'RepoType': 'git', 'Repo': 'https://git.host/repo.git', 'Subdir': [''], - 'Prepare': 'The Matrix is a system, Neo. && ' - 'That system is our enemy. && ' - 'But when you\'re inside, you look around, what do you see? && ' - 'Businessmen, teachers, lawyers, carpenters. && ' - 'The very minds of the people we are trying to save. && ' - 'But until we do, these people are still a part of that system and that makes them our enemy. && ' - 'You have to understand, most of these people are not ready to be unplugged. && ' - 'And many of them are so inert, so hopelessly dependent on the system that they will fight to protect it.', + 'Prepare': [ + 'Many', + 'invalid', + 'commands', + 'here.', + ], } }, ) @@ -1081,7 +1107,7 @@ class MetadataTest(unittest.TestCase): 'RepoType': 'git', 'Repo': 'https://git.host/repo.git', 'Subdir': [''], - 'Prepare': '', + 'Prepare': [], }, 'simple': { 'RepoType': 'git', diff --git a/tests/metadata/dump/com.politedroid.yaml b/tests/metadata/dump/com.politedroid.yaml index aacff98c..46a5cd6b 100644 --- a/tests/metadata/dump/com.politedroid.yaml +++ b/tests/metadata/dump/com.politedroid.yaml @@ -144,7 +144,8 @@ Builds: srclibs: [] subdir: null submodules: false - sudo: echo 'this is just a test' + sudo: + - echo 'this is just a test' target: null timeout: null versionCode: 6 diff --git a/tests/metadata/dump/org.adaway.yaml b/tests/metadata/dump/org.adaway.yaml index 7fe21c4d..8972dc17 100644 --- a/tests/metadata/dump/org.adaway.yaml +++ b/tests/metadata/dump/org.adaway.yaml @@ -281,7 +281,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: android update project -p ../com_actionbarsherlock + prebuild: + - android update project -p ../com_actionbarsherlock rm: [] scandelete: [] scanignore: [] @@ -316,7 +317,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: android update project -p ../com_actionbarsherlock + prebuild: + - android update project -p ../com_actionbarsherlock rm: [] scandelete: [] scanignore: [] @@ -351,7 +353,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: android update project -p ../com_actionbarsherlock + prebuild: + - android update project -p ../com_actionbarsherlock rm: [] scandelete: [] scanignore: [] @@ -386,7 +389,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: android update project -p ../com_actionbarsherlock + prebuild: + - android update project -p ../com_actionbarsherlock rm: [] scandelete: [] scanignore: [] @@ -421,7 +425,9 @@ Builds: output: null patch: [] preassemble: [] - prebuild: android update project -p ../com_actionbarsherlock && rm -rf libs/armeabi/* + prebuild: + - android update project -p ../com_actionbarsherlock + - rm -rf libs/armeabi/* rm: [] scandelete: [] scanignore: [] @@ -455,8 +461,10 @@ Builds: output: null patch: [] preassemble: [] - prebuild: android update project -p ../com_actionbarsherlock && rm -rf libs/armeabi/* - && rm libs/android-support-v4.jar + prebuild: + - android update project -p ../com_actionbarsherlock + - rm -rf libs/armeabi/* + - rm libs/android-support-v4.jar rm: [] scandelete: [] scanignore: [] @@ -490,7 +498,9 @@ Builds: output: null patch: [] preassemble: [] - prebuild: android update project -p ../com_actionbarsherlock && rm -rf libs/armeabi/* + prebuild: + - android update project -p ../com_actionbarsherlock + - rm -rf libs/armeabi/* rm: [] scandelete: [] scanignore: [] @@ -524,8 +534,10 @@ Builds: output: null patch: [] preassemble: [] - prebuild: android update project -p ../com_actionbarsherlock && rm -rf libs/armeabi/* - && android update project -p ../org_donations + prebuild: + - android update project -p ../com_actionbarsherlock + - rm -rf libs/armeabi/* + - android update project -p ../org_donations rm: [] scandelete: [] scanignore: [] @@ -559,8 +571,10 @@ Builds: output: null patch: [] preassemble: [] - prebuild: android update project -p ../com_actionbarsherlock && rm -rf libs/armeabi/* - && android update project -p ../org_donations + prebuild: + - android update project -p ../com_actionbarsherlock + - rm -rf libs/armeabi/* + - android update project -p ../org_donations rm: [] scandelete: [] scanignore: [] @@ -594,8 +608,10 @@ Builds: output: null patch: [] preassemble: [] - prebuild: android update project -p ../com_actionbarsherlock && rm -rf libs/armeabi/* - && android update project -p ../org_donations + prebuild: + - android update project -p ../com_actionbarsherlock + - rm -rf libs/armeabi/* + - android update project -p ../org_donations rm: [] scandelete: [] scanignore: [] @@ -629,8 +645,10 @@ Builds: output: null patch: [] preassemble: [] - prebuild: android update project -p ../com_actionbarsherlock && rm -rf libs/armeabi/* - && android update project -p ../org_donations + prebuild: + - android update project -p ../com_actionbarsherlock + - rm -rf libs/armeabi/* + - android update project -p ../org_donations rm: [] scandelete: [] scanignore: [] @@ -662,8 +680,9 @@ Builds: forceversion: false gradle: [] gradleprops: [] - init: rm android-libs/Donations/custom_rules.xml && git clone https://github.com/dschuermann/HtmlSpanner - android-libs/HtmlSpanner + init: + - rm android-libs/Donations/custom_rules.xml + - git clone https://github.com/dschuermann/HtmlSpanner android-libs/HtmlSpanner maven: false ndk: null novcheck: false @@ -671,12 +690,13 @@ Builds: output: null patch: [] preassemble: [] - prebuild: rm -rf ../update_zip libs/root-commands-1.2.jar libs/htmlspanner-0.2-fork.jar - && cp -f libs/htmlcleaner-2.2.jar android-libs/HtmlSpanner/htmlspanner/libs/ && - echo "android.library.reference.3=$$RootCommands$$" >> project.properties && echo - "android.library.reference.4=android-libs/HtmlSpanner/htmlspanner" >> project.properties - && find . -type f -print0 | xargs -0 sed -i 's/org.rootcommands/org.sufficientlysecure.rootcommands/g' - && cp android-libs/Donations/ant-templates/other/DonationsConfig.java android-libs/Donations/src/org/donations/ + prebuild: + - rm -rf ../update_zip libs/root-commands-1.2.jar libs/htmlspanner-0.2-fork.jar + - cp -f libs/htmlcleaner-2.2.jar android-libs/HtmlSpanner/htmlspanner/libs/ + - echo "android.library.reference.3=$$RootCommands$$" >> project.properties + - echo "android.library.reference.4=android-libs/HtmlSpanner/htmlspanner" >> project.properties + - find . -type f -print0 | xargs -0 sed -i 's/org.rootcommands/org.sufficientlysecure.rootcommands/g' + - cp android-libs/Donations/ant-templates/other/DonationsConfig.java android-libs/Donations/src/org/donations/ rm: [] scandelete: [] scanignore: [] @@ -709,8 +729,9 @@ Builds: forceversion: false gradle: [] gradleprops: [] - init: rm android-libs/Donations/custom_rules.xml && git clone https://github.com/dschuermann/HtmlSpanner - android-libs/HtmlSpanner + init: + - rm android-libs/Donations/custom_rules.xml + - git clone https://github.com/dschuermann/HtmlSpanner android-libs/HtmlSpanner maven: false ndk: null novcheck: false @@ -718,12 +739,13 @@ Builds: output: null patch: [] preassemble: [] - prebuild: rm -rf ../update_zip libs/root-commands-1.2.jar libs/htmlspanner-0.2-fork.jar - && cp -f libs/htmlcleaner-2.2.jar android-libs/HtmlSpanner/htmlspanner/libs/ && - echo "android.library.reference.3=$$RootCommands$$" >> project.properties && echo - "android.library.reference.4=android-libs/HtmlSpanner/htmlspanner" >> project.properties - && find . -type f -print0 | xargs -0 sed -i 's/org.rootcommands/org.sufficientlysecure.rootcommands/g' - && cp android-libs/Donations/ant-templates/other/DonationsConfig.java android-libs/Donations/src/org/donations/ + prebuild: + - rm -rf ../update_zip libs/root-commands-1.2.jar libs/htmlspanner-0.2-fork.jar + - cp -f libs/htmlcleaner-2.2.jar android-libs/HtmlSpanner/htmlspanner/libs/ + - echo "android.library.reference.3=$$RootCommands$$" >> project.properties + - echo "android.library.reference.4=android-libs/HtmlSpanner/htmlspanner" >> project.properties + - find . -type f -print0 | xargs -0 sed -i 's/org.rootcommands/org.sufficientlysecure.rootcommands/g' + - cp android-libs/Donations/ant-templates/other/DonationsConfig.java android-libs/Donations/src/org/donations/ rm: [] scandelete: [] scanignore: [] diff --git a/tests/metadata/dump/org.smssecure.smssecure.yaml b/tests/metadata/dump/org.smssecure.smssecure.yaml index b010502b..3c20d20a 100644 --- a/tests/metadata/dump/org.smssecure.smssecure.yaml +++ b/tests/metadata/dump/org.smssecure.smssecure.yaml @@ -32,13 +32,27 @@ Builds: output: null patch: [] preassemble: [] - prebuild: touch signing.properties && pushd $$GradleWitness$$ && gradle jar && popd - && cp $$GradleWitness$$/build/libs/GradleWitness.jar libs/gradle-witness.jar && - sed -i -e '20,22d' build.gradle && pushd $$PreferenceFragment$$ && gradle uploadArchives - && popd && sed -i -e '/5470f5872514a6226fa1fc6f4e000991f38805691c534cf0bd2778911fc773ad/d' - build.gradle && mkdir smil && pushd smil && wget -c http://www.w3.org/TR/smil-boston-dom/java-binding.zip - && unzip java-binding.zip && popd && cp -fR smil/java/org src/ && rm -fR smil - && sed -i -e '/org.w3c.smil/d' build.gradle && cp -fR $$AospMms$$/src/org src/ + prebuild: + - touch signing.properties + - pushd $$GradleWitness$$ + - gradle jar + - popd + - cp $$GradleWitness$$/build/libs/GradleWitness.jar libs/gradle-witness.jar + - sed -i -e '20,22d' build.gradle + - pushd $$PreferenceFragment$$ + - gradle uploadArchives + - popd + - sed -i -e '/5470f5872514a6226fa1fc6f4e000991f38805691c534cf0bd2778911fc773ad/d' + build.gradle + - mkdir smil + - pushd smil + - wget -c http://www.w3.org/TR/smil-boston-dom/java-binding.zip + - unzip java-binding.zip + - popd + - cp -fR smil/java/org src/ + - rm -fR smil + - sed -i -e '/org.w3c.smil/d' build.gradle + - cp -fR $$AospMms$$/src/org src/ rm: - libs/* scandelete: [] @@ -78,8 +92,12 @@ Builds: output: null patch: [] preassemble: [] - prebuild: touch signing.properties && pushd $$GradleWitness$$ && gradle jar && popd - && cp $$GradleWitness$$/build/libs/GradleWitness.jar libs/gradle-witness.jar + prebuild: + - touch signing.properties + - pushd $$GradleWitness$$ + - gradle jar + - popd + - cp $$GradleWitness$$/build/libs/GradleWitness.jar libs/gradle-witness.jar rm: - libs/*.jar scandelete: [] @@ -116,8 +134,11 @@ Builds: output: null patch: [] preassemble: [] - prebuild: touch signing.properties && ./build-witness.sh && rm -rf libs/gradle-witness/build - && echo "org.gradle.jvmargs=-Xms512m -Xmx512m -XX:MaxPermSize=512m" >> gradle.properties + prebuild: + - touch signing.properties + - ./build-witness.sh + - rm -rf libs/gradle-witness/build + - echo "org.gradle.jvmargs=-Xms512m -Xmx512m -XX:MaxPermSize=512m" >> gradle.properties rm: - libs/*.jar scandelete: [] @@ -153,8 +174,11 @@ Builds: output: null patch: [] preassemble: [] - prebuild: touch signing.properties && ./build-witness.sh && rm -rf libs/gradle-witness/build - && echo "org.gradle.jvmargs=-Xms512m -Xmx512m -XX:MaxPermSize=512m" >> gradle.properties + prebuild: + - touch signing.properties + - ./build-witness.sh + - rm -rf libs/gradle-witness/build + - echo "org.gradle.jvmargs=-Xms512m -Xmx512m -XX:MaxPermSize=512m" >> gradle.properties rm: - libs/*.jar scandelete: [] @@ -190,7 +214,10 @@ Builds: output: null patch: [] preassemble: [] - prebuild: touch signing.properties && ./scripts/build-witness.sh && rm -rf libs/gradle-witness/build + prebuild: + - touch signing.properties + - ./scripts/build-witness.sh + - rm -rf libs/gradle-witness/build rm: - libs/*.jar scandelete: [] @@ -226,7 +253,10 @@ Builds: output: null patch: [] preassemble: [] - prebuild: touch signing.properties && ./scripts/build-witness.sh && rm -rf libs/gradle-witness/build + prebuild: + - touch signing.properties + - ./scripts/build-witness.sh + - rm -rf libs/gradle-witness/build rm: - libs/*.jar scandelete: [] @@ -262,7 +292,10 @@ Builds: output: null patch: [] preassemble: [] - prebuild: touch signing.properties && ./scripts/build-witness.sh && rm -rf libs/gradle-witness/build + prebuild: + - touch signing.properties + - ./scripts/build-witness.sh + - rm -rf libs/gradle-witness/build rm: - libs/*.jar scandelete: [] @@ -298,7 +331,10 @@ Builds: output: null patch: [] preassemble: [] - prebuild: touch signing.properties && ./scripts/build-witness.sh && rm -rf libs/gradle-witness/build + prebuild: + - touch signing.properties + - ./scripts/build-witness.sh + - rm -rf libs/gradle-witness/build rm: - libs/*.jar scandelete: [] diff --git a/tests/metadata/dump/org.videolan.vlc.yaml b/tests/metadata/dump/org.videolan.vlc.yaml index 569724d8..ef25d9a8 100644 --- a/tests/metadata/dump/org.videolan.vlc.yaml +++ b/tests/metadata/dump/org.videolan.vlc.yaml @@ -15,7 +15,8 @@ Builds: - ../java-libs/ActionBarSherlock antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release + build: + - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] buildozer: false commit: 0.0.11 @@ -34,7 +35,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '48d' ../Makefile + prebuild: + - sed -i '48d' ../Makefile rm: [] scandelete: [] scanignore: [] @@ -52,7 +54,8 @@ Builds: - ../java-libs/ActionBarSherlock antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release + build: + - cd ../ && ANDROID_ABI=armeabi ./compile.sh release buildjni: [] buildozer: false commit: 0.0.11 @@ -71,7 +74,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '48d' ../Makefile + prebuild: + - sed -i '48d' ../Makefile rm: [] scandelete: [] scanignore: [] @@ -89,7 +93,8 @@ Builds: - ../java-libs/ActionBarSherlock antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=x86 ./compile.sh release + build: + - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] buildozer: false commit: unknown - see disabled @@ -108,7 +113,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '48d' ../Makefile + prebuild: + - sed -i '48d' ../Makefile rm: [] scandelete: [] scanignore: [] @@ -126,7 +132,8 @@ Builds: - ../java-libs/ActionBarSherlock antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=mips ./compile.sh release + build: + - cd ../ && ANDROID_ABI=mips ./compile.sh release buildjni: [] buildozer: false commit: 0.0.11 @@ -145,7 +152,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '48d' ../Makefile + prebuild: + - sed -i '48d' ../Makefile rm: [] scandelete: [] scanignore: [] @@ -160,7 +168,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=mips ./compile.sh release + build: + - cd ../ && ANDROID_ABI=mips ./compile.sh release buildjni: [] buildozer: false commit: 0.1.3 @@ -180,7 +189,8 @@ Builds: patch: - ndkr9.patch preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -196,7 +206,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=x86 ./compile.sh release + build: + - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] buildozer: false commit: 0.1.3 @@ -216,7 +227,8 @@ Builds: patch: - ndkr9.patch preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -232,7 +244,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release + build: + - cd ../ && ANDROID_ABI=armeabi ./compile.sh release buildjni: [] buildozer: false commit: 0.1.3 @@ -252,7 +265,8 @@ Builds: patch: - ndkr9.patch preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -268,7 +282,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release + build: + - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] buildozer: false commit: 0.1.3 @@ -288,7 +303,8 @@ Builds: patch: - ndkr9.patch preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -304,7 +320,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=x86 ./compile.sh release + build: + - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] buildozer: false commit: 0.9.0 @@ -323,7 +340,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -339,7 +357,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release + build: + - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] buildozer: false commit: 0.9.0 @@ -358,7 +377,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -374,7 +394,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=x86 ./compile.sh release + build: + - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] buildozer: false commit: 0.9.1 @@ -393,7 +414,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -409,7 +431,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release + build: + - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] buildozer: false commit: 0.9.1 @@ -428,7 +451,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -444,7 +468,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=x86 ./compile.sh release + build: + - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] buildozer: false commit: 0.9.5 @@ -463,7 +488,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -479,7 +505,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release + build: + - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] buildozer: false commit: 0.9.5 @@ -498,7 +525,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -514,7 +542,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=x86 ./compile.sh release + build: + - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] buildozer: false commit: 0.9.6 @@ -533,7 +562,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -549,7 +579,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release + build: + - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] buildozer: false commit: 0.9.6 @@ -568,7 +599,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -584,7 +616,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=x86 ./compile.sh release + build: + - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] buildozer: false commit: 0.9.7 @@ -603,7 +636,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -619,7 +653,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release + build: + - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] buildozer: false commit: 0.9.7 @@ -638,7 +673,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -654,7 +690,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=mips ./compile.sh release + build: + - cd ../ && ANDROID_ABI=mips ./compile.sh release buildjni: [] buildozer: false commit: 0.9.7.1 @@ -673,7 +710,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -689,7 +727,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=x86 ./compile.sh release + build: + - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] buildozer: false commit: 0.9.7.1 @@ -708,7 +747,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -724,7 +764,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release + build: + - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] buildozer: false commit: 0.9.7.1 @@ -743,7 +784,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -759,7 +801,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=x86 ./compile.sh release + build: + - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] buildozer: false commit: 0.9.8 @@ -778,7 +821,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -794,7 +838,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release + build: + - cd ../ && ANDROID_ABI=armeabi ./compile.sh release buildjni: [] buildozer: false commit: 0.9.8 @@ -813,7 +858,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -829,7 +875,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release + build: + - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] buildozer: false commit: 0.9.8 @@ -848,7 +895,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -864,7 +912,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=x86 ./compile.sh release + build: + - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] buildozer: false commit: 0.9.9 @@ -883,7 +932,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -899,7 +949,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release + build: + - cd ../ && ANDROID_ABI=armeabi ./compile.sh release buildjni: [] buildozer: false commit: 0.9.9 @@ -918,7 +969,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -934,7 +986,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release + build: + - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] buildozer: false commit: 0.9.9 @@ -953,7 +1006,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -969,7 +1023,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=x86 ./compile.sh release + build: + - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] buildozer: false commit: 0.9.10 @@ -988,7 +1043,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -1004,7 +1060,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release + build: + - cd ../ && ANDROID_ABI=armeabi ./compile.sh release buildjni: [] buildozer: false commit: 0.9.10 @@ -1023,7 +1080,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -1039,7 +1097,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release + build: + - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] buildozer: false commit: 0.9.10 @@ -1058,7 +1117,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -1074,7 +1134,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=x86 ./compile.sh release + build: + - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] buildozer: false commit: 1.0.0 @@ -1093,7 +1154,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -1109,7 +1171,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release + build: + - cd ../ && ANDROID_ABI=armeabi ./compile.sh release buildjni: [] buildozer: false commit: 1.0.0 @@ -1128,7 +1191,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -1144,7 +1208,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release + build: + - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] buildozer: false commit: 1.0.0 @@ -1163,7 +1228,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -1179,7 +1245,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=x86 ./compile.sh release + build: + - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] buildozer: false commit: 1.0.1 @@ -1198,7 +1265,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -1214,7 +1282,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release + build: + - cd ../ && ANDROID_ABI=armeabi ./compile.sh release buildjni: [] buildozer: false commit: 1.0.1 @@ -1233,7 +1302,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -1249,7 +1319,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release + build: + - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] buildozer: false commit: 1.0.1 @@ -1268,7 +1339,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc + prebuild: + - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc rm: [] scandelete: [] scanignore: [] @@ -1284,7 +1356,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "armeabi" --release + build: + - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] buildozer: false commit: 1.1.3 @@ -1304,7 +1377,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -1321,7 +1395,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "armeabi-v7a" --release + build: + - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] buildozer: false commit: 1.1.3 @@ -1341,7 +1416,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -1358,7 +1434,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "x86" --release + build: + - cd ../ && ./compile.sh -a "x86" --release buildjni: [] buildozer: false commit: 1.1.3 @@ -1378,7 +1455,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -1395,7 +1473,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "armeabi" --release + build: + - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] buildozer: false commit: 1.1.5 @@ -1415,7 +1494,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -1432,7 +1512,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "armeabi-v7a" --release + build: + - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] buildozer: false commit: 1.1.5 @@ -1452,7 +1533,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -1469,7 +1551,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "x86" --release + build: + - cd ../ && ./compile.sh -a "x86" --release buildjni: [] buildozer: false commit: 1.1.5 @@ -1489,7 +1572,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -1506,7 +1590,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "armeabi" --release + build: + - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] buildozer: false commit: 1.1.6 @@ -1526,7 +1611,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -1543,7 +1629,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "armeabi-v7a" --release + build: + - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] buildozer: false commit: 1.1.6 @@ -1563,7 +1650,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -1580,7 +1668,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "x86" --release + build: + - cd ../ && ./compile.sh -a "x86" --release buildjni: [] buildozer: false commit: 1.1.6 @@ -1600,7 +1689,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -1617,7 +1707,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "armeabi" --release + build: + - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] buildozer: false commit: 1.2.0 @@ -1637,7 +1728,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -1654,7 +1746,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "armeabi-v7a" --release + build: + - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] buildozer: false commit: 1.2.0 @@ -1674,7 +1767,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -1691,7 +1785,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "x86" --release + build: + - cd ../ && ./compile.sh -a "x86" --release buildjni: [] buildozer: false commit: 1.2.0 @@ -1711,7 +1806,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -1728,7 +1824,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "armeabi" --release + build: + - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] buildozer: false commit: 1.2.1 @@ -1748,7 +1845,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -1765,7 +1863,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "armeabi-v7a" --release + build: + - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] buildozer: false commit: 1.2.1 @@ -1785,7 +1884,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -1802,7 +1902,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "x86" --release + build: + - cd ../ && ./compile.sh -a "x86" --release buildjni: [] buildozer: false commit: 1.2.1 @@ -1822,7 +1923,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -1839,7 +1941,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "armeabi" --release + build: + - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] buildozer: false commit: 1.2.2 @@ -1859,7 +1962,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -1876,7 +1980,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "armeabi-v7a" --release + build: + - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] buildozer: false commit: 1.2.2 @@ -1896,7 +2001,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -1913,7 +2019,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "x86" --release + build: + - cd ../ && ./compile.sh -a "x86" --release buildjni: [] buildozer: false commit: 1.2.2 @@ -1933,7 +2040,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -1950,7 +2058,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "armeabi" --release + build: + - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] buildozer: false commit: 1.2.3 @@ -1970,7 +2079,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -1987,7 +2097,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "armeabi-v7a" --release + build: + - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] buildozer: false commit: 1.2.3 @@ -2007,7 +2118,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -2024,7 +2136,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "x86" --release + build: + - cd ../ && ./compile.sh -a "x86" --release buildjni: [] buildozer: false commit: 1.2.3 @@ -2044,7 +2157,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -2061,7 +2175,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "armeabi" --release + build: + - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] buildozer: false commit: 1.2.4 @@ -2081,7 +2196,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -2098,7 +2214,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "armeabi-v7a" --release + build: + - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] buildozer: false commit: 1.2.4 @@ -2118,7 +2235,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -2135,7 +2253,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "x86" --release + build: + - cd ../ && ./compile.sh -a "x86" --release buildjni: [] buildozer: false commit: 1.2.4 @@ -2155,7 +2274,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -2172,7 +2292,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "armeabi" --release + build: + - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] buildozer: false commit: 1.2.5 @@ -2192,7 +2313,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -2209,7 +2331,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "armeabi-v7a" --release + build: + - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] buildozer: false commit: 1.2.5 @@ -2229,7 +2352,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -2246,7 +2370,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "x86" --release + build: + - cd ../ && ./compile.sh -a "x86" --release buildjni: [] buildozer: false commit: 1.2.5 @@ -2266,7 +2391,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -2283,7 +2409,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "armeabi" --release + build: + - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] buildozer: false commit: 1.2.6 @@ -2303,7 +2430,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -2320,7 +2448,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "armeabi-v7a" --release + build: + - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] buildozer: false commit: 1.2.6 @@ -2340,7 +2469,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] @@ -2357,7 +2487,8 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] - build: cd ../ && ./compile.sh -a "x86" --release + build: + - cd ../ && ./compile.sh -a "x86" --release buildjni: [] buildozer: false commit: 1.2.6 @@ -2377,7 +2508,8 @@ Builds: output: null patch: [] preassemble: [] - prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh + prebuild: + - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc rm: [] scandelete: [] From 21ea1c1c89f8eea2090a9fe3175304bdd2117d89 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 19 Oct 2022 10:30:13 +0200 Subject: [PATCH 0898/2116] makebuildserver: purge apt_package_cache feature This is unmaintained, lightly used, a tangled mess, and can be replaced by things like the vagrant-cachier plugin or #418 --- buildserver/Vagrantfile | 9 +-------- examples/makebuildserver.config.py | 7 ------- jenkins-setup-build-environment | 1 - makebuildserver | 13 ------------- 4 files changed, 1 insertion(+), 29 deletions(-) diff --git a/buildserver/Vagrantfile b/buildserver/Vagrantfile index 8caa3296..2a170bdf 100644 --- a/buildserver/Vagrantfile +++ b/buildserver/Vagrantfile @@ -12,8 +12,7 @@ end Vagrant.configure("2") do |config| - # these two caching methods conflict, so only use one at a time - if Vagrant.has_plugin?("vagrant-cachier") and not configfile.has_key? "aptcachedir" + if Vagrant.has_plugin?("vagrant-cachier") config.cache.scope = :box config.cache.auto_detect = false config.cache.enable :apt @@ -77,12 +76,6 @@ Vagrant.configure("2") do |config| # necessary with 9p synced folders Dir.mkdir('cache') unless File.exists?('cache') - # cache .deb packages on the host via a mount trick - if configfile.has_key? "aptcachedir" - config.vm.synced_folder configfile["aptcachedir"], "/var/cache/apt/archives", - owner: 'root', group: 'root', create: true - end - config.vm.provision "shell", name: "setup-env-vars", path: "setup-env-vars", args: ["/opt/android-sdk"] config.vm.provision "shell", name: "apt-get-install", path: "provision-apt-get-install", diff --git a/examples/makebuildserver.config.py b/examples/makebuildserver.config.py index cb47f95f..7bba2c75 100644 --- a/examples/makebuildserver.config.py +++ b/examples/makebuildserver.config.py @@ -32,13 +32,6 @@ # # cachedir = 'buildserver/cache' -# A big part of creating a new instance is downloading packages from Debian. -# This setups up a folder in ~/.cache/fdroidserver to cache the downloaded -# packages when rebuilding the build server from scratch. This requires -# that virtualbox-guest-utils is installed. -# -# apt_package_cache = True - # The buildserver can use some local caches to speed up builds, # especially when the internet connection is slow and/or expensive. # If enabled, the buildserver setup will look for standard caches in diff --git a/jenkins-setup-build-environment b/jenkins-setup-build-environment index 489717b2..bc81530e 100755 --- a/jenkins-setup-build-environment +++ b/jenkins-setup-build-environment @@ -69,7 +69,6 @@ fi cat < $WORKSPACE/makebuildserver.config.py debian_mirror = 'http://deb.debian.org/debian/' boot_timeout = 1200 -apt_package_cache = True copy_caches_from_host = True memory = $memory cpus = $cpus diff --git a/makebuildserver b/makebuildserver index 21432a38..47928cd8 100755 --- a/makebuildserver +++ b/makebuildserver @@ -77,7 +77,6 @@ BASEBOX_CHECKSUMS = { config = { 'basebox': BASEBOX_DEFAULT, 'debian_mirror': 'https://deb.debian.org/debian/', - 'apt_package_cache': False, 'copy_caches_from_host': False, 'boot_timeout': 600, 'cachedir': os.path.join(os.getenv('HOME'), '.cache', 'fdroidserver'), @@ -121,18 +120,6 @@ if config['vm_provider'] == 'libvirt': tmp = os.path.dirname(tmp) logging.debug('cache dir %s is accessible for libvirt vm.', config['cachedir']) -if config['apt_package_cache']: - config['aptcachedir'] = config['cachedir'] + '/apt/archives' - logging.debug('aptcachedir is set to %s', config['aptcachedir']) - aptcachelock = os.path.join(config['aptcachedir'], 'lock') - if os.path.isfile(aptcachelock): - logging.info('apt cache dir is locked, removing lock') - os.remove(aptcachelock) - aptcachepartial = os.path.join(config['aptcachedir'], 'partial') - if os.path.isdir(aptcachepartial): - logging.info('removing partial downloads from apt cache dir') - shutil.rmtree(aptcachepartial) - CACHE_FILES = [ ('https://services.gradle.org/distributions/gradle-6.8.3-bin.zip', '7faa7198769f872826c8ef4f1450f839ec27f0b4d5d1e51bade63667cbccd205'), From abdd02f33a42cc7050121baab7d3b41a4279e5dc Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 19 Oct 2022 10:31:36 +0200 Subject: [PATCH 0899/2116] makebuildserver: move copy_caches_from_host to command line flag --- examples/makebuildserver.config.py | 10 ---------- jenkins-setup-build-environment | 1 - makebuildserver | 5 +++-- 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/examples/makebuildserver.config.py b/examples/makebuildserver.config.py index 7bba2c75..ff668a63 100644 --- a/examples/makebuildserver.config.py +++ b/examples/makebuildserver.config.py @@ -32,16 +32,6 @@ # # cachedir = 'buildserver/cache' -# The buildserver can use some local caches to speed up builds, -# especially when the internet connection is slow and/or expensive. -# If enabled, the buildserver setup will look for standard caches in -# your HOME dir and copy them to the buildserver VM. Be aware: this -# will reduce the isolation of the buildserver from your host machine, -# so the buildserver will provide an environment only as trustworthy -# as the host machine's environment. -# -# copy_caches_from_host = True - # To specify which Debian mirror the build server VM should use, by # default it uses http.debian.net, which auto-detects which is the # best mirror to use. diff --git a/jenkins-setup-build-environment b/jenkins-setup-build-environment index bc81530e..80bdade0 100755 --- a/jenkins-setup-build-environment +++ b/jenkins-setup-build-environment @@ -69,7 +69,6 @@ fi cat < $WORKSPACE/makebuildserver.config.py debian_mirror = 'http://deb.debian.org/debian/' boot_timeout = 1200 -copy_caches_from_host = True memory = $memory cpus = $cpus EOF diff --git a/makebuildserver b/makebuildserver index 47928cd8..b90e8ba9 100755 --- a/makebuildserver +++ b/makebuildserver @@ -27,6 +27,8 @@ parser.add_option("-c", "--clean", action="store_true", default=False, parser.add_option('--skip-cache-update', action="store_true", default=False, help="""Skip downloading and checking cache.""" """This assumes that the cache is already downloaded completely.""") +parser.add_option('--copy-caches-from-host', action="store_true", default=False, + help="""Copy gradle and pip caches into the buildserver VM""") parser.add_option('--keep-box-file', action="store_true", default=False, help="""Box file will not be deleted after adding it to box storage""" """ (KVM-only).""") @@ -77,7 +79,6 @@ BASEBOX_CHECKSUMS = { config = { 'basebox': BASEBOX_DEFAULT, 'debian_mirror': 'https://deb.debian.org/debian/', - 'copy_caches_from_host': False, 'boot_timeout': 600, 'cachedir': os.path.join(os.getenv('HOME'), '.cache', 'fdroidserver'), 'cpus': 1, @@ -376,7 +377,7 @@ def main(): logging.error("'vagrant up' failed.") sys.exit(1) - if config['copy_caches_from_host']: + if options.copy_caches_from_host: ssh_config = v.ssh_config() user = re.search(r'User ([^ \n]+)', ssh_config).group(1) hostname = re.search(r'HostName ([^ \n]+)', ssh_config).group(1) From e2fcd633fcf32e30f0ba3dc0bc6d3658004ffa0f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 19 Oct 2022 15:03:07 +0200 Subject: [PATCH 0900/2116] buildserver: hard code basebox name and version This is not user-configurable, so it should not be setup to be. This process is only tested on the one basebox, and devs can just edit Vagrantfile directly to test other base boxes. # Conflicts: # makebuildserver --- buildserver/Vagrantfile | 5 +--- examples/makebuildserver.config.py | 23 ------------------ makebuildserver | 38 ++++++++++-------------------- 3 files changed, 14 insertions(+), 52 deletions(-) diff --git a/buildserver/Vagrantfile b/buildserver/Vagrantfile index 2a170bdf..3b65e61a 100644 --- a/buildserver/Vagrantfile +++ b/buildserver/Vagrantfile @@ -19,10 +19,7 @@ Vagrant.configure("2") do |config| config.cache.enable :chef end - config.vm.box = configfile['basebox'] - if configfile.has_key? "basebox_version" - config.vm.box_version = configfile['basebox_version'] - end + config.vm.box = "fdroid/bullseye64" if not configfile.has_key? "vm_provider" or configfile["vm_provider"] == "virtualbox" # default to VirtualBox if not set diff --git a/examples/makebuildserver.config.py b/examples/makebuildserver.config.py index ff668a63..96e0c9ec 100644 --- a/examples/makebuildserver.config.py +++ b/examples/makebuildserver.config.py @@ -2,29 +2,6 @@ # # You may want to alter these before running ./makebuildserver -# Name of the Vagrant basebox to use, by default it will be downloaded -# from Vagrant Cloud. For release builds setup, generate the basebox -# locally using https://gitlab.com/fdroid/basebox, add it to Vagrant, -# then set this to the local basebox name. -# This defaults to "fdroid/basebox-stretch64" which will download a -# prebuilt basebox from https://app.vagrantup.com/fdroid. -# -# (If you change this value you have to supply the `--clean` option on -# your next `makebuildserver` run.) -# -# basebox = "basebox-stretch64" - -# This allows you to pin your basebox to a specific versions. It defaults -# the most recent basebox version which can be aumotaically verifyed by -# `makebuildserver`. -# Please note that vagrant does not support versioning of locally added -# boxes, so we can't support that either. -# -# (If you change this value you have to supply the `--clean` option on -# your next `makebuildserver` run.) -# -# basebox_version = "0.1" - # In the process of setting up the build server, many gigs of files # are downloaded (Android SDK components, gradle, etc). These are # cached so that they are not redownloaded each time. By default, diff --git a/makebuildserver b/makebuildserver index b90e8ba9..9d18c954 100755 --- a/makebuildserver +++ b/makebuildserver @@ -24,6 +24,8 @@ parser.add_option('-v', '--verbose', action="count", dest='verbosity', default=1 parser.add_option('-q', action='store_const', const=0, dest='verbosity') parser.add_option("-c", "--clean", action="store_true", default=False, help="Build from scratch, rather than attempting to update the existing server") +parser.add_option('--skip-box-verification', action="store_true", default=False, + help="""Skip verifying the downloaded base box.""") parser.add_option('--skip-cache-update', action="store_true", default=False, help="""Skip downloading and checking cache.""" """This assumes that the cache is already downloaded completely.""") @@ -77,7 +79,6 @@ BASEBOX_CHECKSUMS = { } config = { - 'basebox': BASEBOX_DEFAULT, 'debian_mirror': 'https://deb.debian.org/debian/', 'boot_timeout': 600, 'cachedir': os.path.join(os.getenv('HOME'), '.cache', 'fdroidserver'), @@ -87,6 +88,13 @@ config = { 'vm_provider': 'virtualbox', } +with open('buildserver/Vagrantfile') as fp: + m = re.search(r"""\.vm\.box\s*=\s*["'](.*)["']""", fp.read()) + if not m: + logging.error('Cannot find box name in buildserver/Vagrantfile!') + exit(1) + config['basebox'] = m.group(1) +config['basebox_version'] = BASEBOX_VERSION_DEFAULT # load config file, if present if os.path.exists('makebuildserver.config.py'): exec(compile(open('makebuildserver.config.py').read(), 'makebuildserver.config.py', 'exec'), config) @@ -96,14 +104,6 @@ elif os.path.exists('makebs.config.py'): if '__builtins__' in config: del config['__builtins__'] # added by compile/exec logging.debug("makebuildserver.config.py parsed -> %s", json.dumps(config, indent=4, sort_keys=True)) -if config['basebox'] == BASEBOX_DEFAULT and 'basebox_version' not in config: - config['basebox_version'] = BASEBOX_VERSION_DEFAULT -# note: vagrant allows putting '/' into the name of a local box, -# so this check is not completely reliable, but better than nothing -if 'basebox_version' in config and 'basebox' in config and '/' not in config['basebox']: - logging.critical("Can not get version '{version}' for basebox '{box}', " - "vagrant does not support versioning for locally added boxes." - .format(box=config['basebox'], version=config['basebox_version'])) # Update cached files. if not os.path.exists(config['cachedir']): @@ -312,27 +312,15 @@ def main(): "virtualbox, libvirt)" .format(vm_provider=config['cm_provider'])) sys.exit(1) - # Check if selected Vagrant box is available - available_boxes_by_provider = [x.name for x in v.box_list() if x.provider == config['vm_provider']] - if '/' not in config['basebox'] and config['basebox'] not in available_boxes_by_provider: - logging.critical("Vagrant box '{basebox}' not available " - "for '{vm_provider}' VM provider. " - "Please make sure it's added to vagrant. " - "(If you need a basebox to begin with, " - "here is how we're bootstrapping it: " - "https://gitlab.com/fdroid/basebox)" - .format(vm_provider=config['vm_provider'], - basebox=config['basebox'])) - sys.exit(1) # Download and verify pre-built Vagrant boxes - if config['basebox'] == BASEBOX_DEFAULT: + if not options.skip_box_verification: buildserver_not_created = any([True for x in v.status() if x.state == 'not_created' and x.name == 'default']) if buildserver_not_created or options.clean: # make vagrant download and add basebox - target_basebox_installed = any([x for x in v.box_list() if x.name == BASEBOX_DEFAULT and x.provider == config['vm_provider'] and x.version == config['basebox_version']]) + target_basebox_installed = any([x for x in v.box_list() if x.name == config['basebox'] and x.provider == config['vm_provider'] and x.version == config['basebox_version']]) if not target_basebox_installed: - cmd = [shutil.which('vagrant'), 'box', 'add', BASEBOX_DEFAULT, + cmd = [shutil.which('vagrant'), 'box', 'add', config['basebox'], '--box-version=' + config['basebox_version'], '--provider=' + config['vm_provider']] ret_val = subprocess.call(cmd) @@ -353,7 +341,7 @@ def main(): for filename, sha256 in BASEBOX_CHECKSUMS[config['basebox_version']][config['vm_provider']].items(): verify_file_sha256(os.path.join(get_vagrant_home(), 'boxes', - BASEBOX_DEFAULT.replace('/', '-VAGRANTSLASH-'), + config['basebox'].replace('/', '-VAGRANTSLASH-'), config['basebox_version'], config['vm_provider'], filename), From abf535aabe8e18acefea25dfe7d59752c1d3b995 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 19 Oct 2022 11:31:38 +0200 Subject: [PATCH 0901/2116] buildserver: move config to buildserver/Vagrantfile.yaml --- buildserver/Vagrantfile | 26 +++++++++++------- jenkins-setup-build-environment | 10 +++---- makebuildserver | 48 ++++++++++++++++----------------- 3 files changed, 44 insertions(+), 40 deletions(-) diff --git a/buildserver/Vagrantfile b/buildserver/Vagrantfile index 3b65e61a..44373e57 100644 --- a/buildserver/Vagrantfile +++ b/buildserver/Vagrantfile @@ -1,13 +1,22 @@ require 'yaml' require 'pathname' +configfile = { + 'boot_timeout' => 600, + 'cachedir' => File.join(ENV['HOME'], '.cache', 'fdroidserver'), + 'cpus' => 1, + 'debian_mirror' => 'https://deb.debian.org/debian/', + 'hwvirtex' => 'on', + 'memory' => 2048, + 'vm_provider' => 'virtualbox', +} + srvpath = Pathname.new(File.dirname(__FILE__)).realpath configpath = File.join(srvpath, "/Vagrantfile.yaml") if File.exists? configpath - configfile = YAML.load_file(configpath) -else - puts "#{configpath} does not exist, run ./makebuildserver?" - configfile = Hash.new + YAML.load_file(configpath).each do |k,v| + configfile[k] = v + end end Vagrant.configure("2") do |config| @@ -62,12 +71,9 @@ Vagrant.configure("2") do |config| args: [configfile["aptproxy"]] end - # buildserver/ is shared to the VM's /vagrant by default so the old - # default does not need a custom mount - if configfile["cachedir"] != "buildserver/cache" - config.vm.synced_folder configfile["cachedir"], '/vagrant/cache', - create: true, type: synced_folder_type - end + config.vm.synced_folder configfile["cachedir"], '/vagrant/cache', + create: true, type: synced_folder_type + # Make sure dir exists to mount to, since buildserver/ is # automatically mounted as /vagrant in the guest VM. This is more # necessary with 9p synced folders diff --git a/jenkins-setup-build-environment b/jenkins-setup-build-environment index 80bdade0..95c2049a 100755 --- a/jenkins-setup-build-environment +++ b/jenkins-setup-build-environment @@ -66,11 +66,11 @@ if [ `nproc` -le 6 ]; then else cpus=6 fi -cat < $WORKSPACE/makebuildserver.config.py -debian_mirror = 'http://deb.debian.org/debian/' -boot_timeout = 1200 -memory = $memory -cpus = $cpus +cat < $WORKSPACE/buildserver/Vagrantfile.yaml +debian_mirror: https://deb.debian.org/debian/ +boot_timeout: 1200 +memory: $memory +cpus: $cpus EOF cd $WORKSPACE diff --git a/makebuildserver b/makebuildserver index 9d18c954..4af88601 100755 --- a/makebuildserver +++ b/makebuildserver @@ -78,16 +78,12 @@ BASEBOX_CHECKSUMS = { }, } -config = { - 'debian_mirror': 'https://deb.debian.org/debian/', - 'boot_timeout': 600, - 'cachedir': os.path.join(os.getenv('HOME'), '.cache', 'fdroidserver'), - 'cpus': 1, - 'memory': 2048, - 'hwvirtex': 'off', - 'vm_provider': 'virtualbox', -} - +configfile = 'buildserver/Vagrantfile.yaml' +if not os.path.exists(configfile): + logging.warning('%s does not exist, copying template file.' % configfile) + shutil.copy('examples/Vagrantfile.yaml', configfile) +with open(configfile) as fp: + config = yaml.safe_load(fp) with open('buildserver/Vagrantfile') as fp: m = re.search(r"""\.vm\.box\s*=\s*["'](.*)["']""", fp.read()) if not m: @@ -95,14 +91,21 @@ with open('buildserver/Vagrantfile') as fp: exit(1) config['basebox'] = m.group(1) config['basebox_version'] = BASEBOX_VERSION_DEFAULT -# load config file, if present +config['cachedir'] = os.path.join(os.getenv('HOME'), '.cache', 'fdroidserver') + +show_config_deprecation = False if os.path.exists('makebuildserver.config.py'): - exec(compile(open('makebuildserver.config.py').read(), 'makebuildserver.config.py', 'exec'), config) + show_config_deprecation = True + logging.error('makebuildserver.config.py exists!') elif os.path.exists('makebs.config.py'): + show_config_deprecation = True # this is the old name for the config file - exec(compile(open('makebs.config.py').read(), 'makebs.config.py', 'exec'), config) -if '__builtins__' in config: - del config['__builtins__'] # added by compile/exec + logging.error('makebs.config.py exists!') +if show_config_deprecation: + logging.error('Config is via buildserver/Vagrantfile.yaml and command line flags.') + parser.print_help() + exit(1) + logging.debug("makebuildserver.config.py parsed -> %s", json.dumps(config, indent=4, sort_keys=True)) # Update cached files. @@ -253,17 +256,14 @@ def main(): # use VirtualBox software virtualization if hardware is not available, # like if this is being run in kvm or some other VM platform, like # http://jenkins.debian.net, the values are 'on' or 'off' - if sys.platform.startswith('darwin'): - # all < 10 year old Macs work, and OSX servers as VM host are very - # rare, but this could also be auto-detected if someone codes it - config['hwvirtex'] = 'on' - logging.info('platform is darwnin -> hwvirtex = \'on\'') - elif os.path.exists('/proc/cpuinfo'): + if config.get('hwvirtex') != 'off' and os.path.exists('/proc/cpuinfo'): with open('/proc/cpuinfo') as f: contents = f.read() if 'vmx' in contents or 'svm' in contents: - config['hwvirtex'] = 'on' - logging.info('found \'vmx\' or \'svm\' in /proc/cpuinfo -> hwvirtex = \'on\'') + logging.debug('found \'vmx\' or \'svm\' in /proc/cpuinfo -> hwvirtex = \'on\'') + else: + logging.error('hwvirtex = \'on\' and no \'vmx\' or \'svm\' found in /proc/cpuinfo!') + exit(1) serverdir = os.path.join(os.getcwd(), 'buildserver') logfilename = os.path.join(serverdir, 'up.log') @@ -351,8 +351,6 @@ def main(): .format(box=config['basebox'], provider=config['vm_provider'], version=config['basebox_version'])) - else: - logging.debug('not updating basebox ...') else: logging.debug('using unverified basebox ...') From d6008cdb2aebf32fd92246d221847de5c0913c15 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 20 Oct 2022 18:24:13 +0200 Subject: [PATCH 0902/2116] convert examples/makebuildserver.config.py to Vagrantfile.yaml Also, tests/androguard_test.py was removed long ago --- .gitlab-ci.yml | 1 - MANIFEST.in | 3 +-- buildserver/Vagrantfile | 11 +++++++-- ...buildserver.config.py => Vagrantfile.yaml} | 23 +++++++++---------- 4 files changed, 21 insertions(+), 17 deletions(-) rename examples/{makebuildserver.config.py => Vagrantfile.yaml} (83%) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4fe44dba..3a4f230b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -223,7 +223,6 @@ black: - pip install black - black --check --diff --color examples/fdroid_extract_repo_pubkey.py - examples/makebuildserver.config.py fdroid fdroidserver/btlog.py fdroidserver/exception.py diff --git a/MANIFEST.in b/MANIFEST.in index 297dae0b..3adec161 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -14,10 +14,10 @@ include examples/fdroid_export_keystore_to_nitrokey.py include examples/fdroid_extract_repo_pubkey.py include examples/fdroid_fetchsrclibs.py include examples/fdroid_nitrokeyimport.py -include examples/makebuildserver.config.py include examples/opensc-fdroid.cfg include examples/public-read-only-s3-bucket-policy.json include examples/template.yml +include examples/Vagrantfile.yaml include gradlew-fdroid include LICENSE include locale/bo/LC_MESSAGES/fdroidserver.po @@ -42,7 +42,6 @@ include locale/zh_Hans/LC_MESSAGES/fdroidserver.po include locale/zh_Hant/LC_MESSAGES/fdroidserver.po include makebuildserver include README.md -include tests/androguard_test.py include tests/apk.embedded_1.apk include tests/bad-unicode-*.apk include tests/build.TestCase diff --git a/buildserver/Vagrantfile b/buildserver/Vagrantfile index 44373e57..f5172870 100644 --- a/buildserver/Vagrantfile +++ b/buildserver/Vagrantfile @@ -1,5 +1,6 @@ require 'yaml' require 'pathname' +require 'fileutils' configfile = { 'boot_timeout' => 600, @@ -14,9 +15,15 @@ configfile = { srvpath = Pathname.new(File.dirname(__FILE__)).realpath configpath = File.join(srvpath, "/Vagrantfile.yaml") if File.exists? configpath - YAML.load_file(configpath).each do |k,v| - configfile[k] = v + c = YAML.load_file(configpath) + if c and not c.empty? + c.each do |k,v| + configfile[k] = v + end end +else + puts "Copying example file to #{configpath}" + FileUtils.cp('../examples/Vagrantfile.yaml', configpath) end Vagrant.configure("2") do |config| diff --git a/examples/makebuildserver.config.py b/examples/Vagrantfile.yaml similarity index 83% rename from examples/makebuildserver.config.py rename to examples/Vagrantfile.yaml index 96e0c9ec..6bf9c5ca 100644 --- a/examples/makebuildserver.config.py +++ b/examples/Vagrantfile.yaml @@ -1,5 +1,4 @@ -#!/usr/bin/env python3 -# + # You may want to alter these before running ./makebuildserver # In the process of setting up the build server, many gigs of files @@ -7,28 +6,28 @@ # cached so that they are not redownloaded each time. By default, # these are stored in ~/.cache/fdroidserver # -# cachedir = 'buildserver/cache' +# cachedir: buildserver/cache # To specify which Debian mirror the build server VM should use, by # default it uses http.debian.net, which auto-detects which is the # best mirror to use. # -# debian_mirror = 'http://ftp.uk.debian.org/debian/' +# debian_mirror: https://debian.osuosl.org/debian/ # The amount of RAM the build server will have (default: 2048) -# memory = 3584 +# memory: 3584 # The number of CPUs the build server will have -# cpus = 1 +# cpus: 1 # Debian package proxy server - if you have one -# aptproxy = "http://192.168.0.19:8000" +# aptproxy: http://192.168.0.19:8000 # If this is running on an older machine or on a virtualized system, # it can run a lot slower. If the provisioning fails with a warning # about the timeout, extend the timeout here. (default: 600 seconds) # -# boot_timeout = 1200 +# boot_timeout: 1200 # By default, this whole process uses VirtualBox as the provider, but # QEMU+KVM is also supported via the libvirt plugin to vagrant. If @@ -36,19 +35,19 @@ # automatically. It can also be manually enabled by uncommenting # below: # -# vm_provider = 'libvirt' +# vm_provider: libvirt # By default libvirt uses 'virtio' for both network and disk drivers. # Some systems (eg. nesting VMware ESXi) do not support virtio. As a # workaround for such rare cases, this setting allows to configure # KVM/libvirt to emulate hardware rather than using virtio. # -# libvirt_disk_bus = 'sata' -# libvirt_nic_model_type = 'rtl8139' +# libvirt_disk_bus: sata +# libvirt_nic_model_type: rtl8139 # Sometimes, it is not possible to use the 9p synced folder type with # libvirt, like if running a KVM buildserver instance inside of a # VMware ESXi guest. In that case, using NFS or another method is # required. # -# synced_folder_type = 'nfs' +# synced_folder_type: nfs From 2bf706ebe64b4cc70f6ef1113ffadef4cf2c1099 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 1 Nov 2022 08:40:21 +0100 Subject: [PATCH 0903/2116] buildserver: clean up dirs from purged packages --- buildserver/provision-apt-get-install | 2 ++ 1 file changed, 2 insertions(+) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index b369d36f..b856562c 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -90,6 +90,8 @@ purge=" xxd xz-utils " +# clean up files packages to be purged, then purge the packages +rm -rf /var/run/dbus /var/log/unattended-upgrades apt-get purge $purge apt-get upgrade --download-only From 29079a4423b033b2fece7a9a6ed7d9ea874e001a Mon Sep 17 00:00:00 2001 From: linsui Date: Sat, 29 Oct 2022 10:21:05 +0800 Subject: [PATCH 0904/2116] update AGP/Gradle map --- gradlew-fdroid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index c2281a74..458972c0 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -197,8 +197,8 @@ contains() { # (key) should accept. plugin versions are actually prefixes and catch sub- # versions as well. Pairs are taken from: # https://developer.android.com/studio/releases/gradle-plugin#updating-gradle -d_plugin_k=(7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 1.3 1.2 1.1 1.0 0.14 0.13 0.12 0.11 0.10 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2) -d_plugin_v=(7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) +d_plugin_k=(7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 1.3 1.2 1.1 1.0 0.14 0.13 0.12 0.11 0.10 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2) +d_plugin_v=(7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about plugin_v=(7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) From 9509707df67de76cfaa1838a02c67944d2f7cea8 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 3 Nov 2022 17:33:54 +0100 Subject: [PATCH 0905/2116] 8.0 Android Gradle Plugin is already listed --- gradlew-fdroid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 458972c0..6ed7fba7 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -197,8 +197,8 @@ contains() { # (key) should accept. plugin versions are actually prefixes and catch sub- # versions as well. Pairs are taken from: # https://developer.android.com/studio/releases/gradle-plugin#updating-gradle -d_plugin_k=(7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 1.3 1.2 1.1 1.0 0.14 0.13 0.12 0.11 0.10 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2) -d_plugin_v=(7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) +d_plugin_k=(8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 1.3 1.2 1.1 1.0 0.14 0.13 0.12 0.11 0.10 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2) +d_plugin_v=(8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about plugin_v=(7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) From a2050a72fa99f5ada41ea95a0a0f21dad281eb95 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 26 Oct 2022 14:39:05 +0200 Subject: [PATCH 0906/2116] Disable man-db auto-update (as done by sbuild) --- buildserver/provision-apt-get-install | 2 ++ 1 file changed, 2 insertions(+) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index b856562c..69f84b5d 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -31,6 +31,8 @@ cat < /etc/apt/apt.conf.d/99confdef Dpkg::Options { "--force-confdef"; }; EOF +echo "man-db man-db/auto-update boolean false" | debconf-set-selections + if echo $debian_mirror | grep '^https' 2>&1 > /dev/null; then apt-get update || apt-get update apt-get install ca-certificates From 6ec7e05c761aec7ad06af918e55b2e18dcf3b11d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 4 Nov 2022 11:32:59 +0100 Subject: [PATCH 0907/2116] makebuildserver: stop trying to write to Vagrantfile.yaml If Vagrantfile.yaml exists, makebuildserver should no longer try to write to it. It is now manully managed now that makebuildserver.config.py no longer exists. Also, now that the buildserver is smaller, the workflow is to always destroy and recreate it rather than ever try to reprovision it. --- makebuildserver | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/makebuildserver b/makebuildserver index 4af88601..fe7a0de9 100755 --- a/makebuildserver +++ b/makebuildserver @@ -102,11 +102,11 @@ elif os.path.exists('makebs.config.py'): # this is the old name for the config file logging.error('makebs.config.py exists!') if show_config_deprecation: - logging.error('Config is via buildserver/Vagrantfile.yaml and command line flags.') + logging.error('Config is via %s and command line flags.' % configfile) parser.print_help() exit(1) -logging.debug("makebuildserver.config.py parsed -> %s", json.dumps(config, indent=4, sort_keys=True)) +logging.debug("Vagrantfile.yaml parsed -> %s", json.dumps(config, indent=4, sort_keys=True)) # Update cached files. if not os.path.exists(config['cachedir']): @@ -284,27 +284,6 @@ def main(): if options.clean: vm.destroy() - # Check against the existing Vagrantfile.yaml, and if they differ, we - # need to create a new box: - vf = os.path.join(serverdir, 'Vagrantfile.yaml') - writevf = True - if os.path.exists(vf): - logging.info('Halting %s', serverdir) - v.halt() - with open(vf, 'r', encoding='utf-8') as f: - oldconfig = yaml.safe_load(f) - if config != oldconfig: - logging.info("Server configuration has changed, rebuild from scratch is required") - vm.destroy() - else: - logging.info("Re-provisioning existing server") - writevf = False - else: - logging.info("No existing server - building from scratch") - if writevf: - with open(vf, 'w', encoding='utf-8') as f: - yaml.safe_dump(config, f) - # Check if selected provider is supported if config['vm_provider'] not in ['libvirt', 'virtualbox']: logging.critical("Currently selected VM provider '{vm_provider}' " From 034735a81d995a60c9f1135b70aedae228b69ee6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 4 Nov 2022 11:43:54 +0100 Subject: [PATCH 0908/2116] gitlab-ci: fix Windows job by installing Python 3.10, which has wheels It seems that 3.11 whl packages are not yet always available. We have other jobs for testing new Python versions. --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3a4f230b..94d49ed2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -500,7 +500,7 @@ Windows: script: - Import-Module "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1" - choco install --no-progress -y git --force --params "/GitAndUnixToolsOnPath" - - choco install --no-progress -y python3 + - choco install --no-progress -y python3 --version=3.10 - choco install --no-progress -y jdk8 - choco install --no-progress -y rsync - refreshenv From b8ea90f252824369763bae917210453202fcef62 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 13 Oct 2022 10:16:49 +0200 Subject: [PATCH 0909/2116] Drop JDK 11 on checkupdates --- fdroidserver/checkupdates.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index c5318742..7215c64e 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -521,6 +521,21 @@ def checkupdates_app(app): if not gotcur: newbuilds = copy.deepcopy(builds[-len(vercodes):]) + + bullseye_blocklist = [ + 'apt-get install -y openjdk-11-jdk', + 'apt-get install -y openjdk-11-jdk-headless', + 'apt-get install -t stretch-backports openjdk-11-jdk-headless openjdk-11-jre-headless', + 'apt-get install -y -t stretch-backports openjdk-11-jdk-headless openjdk-11-jre-headless', + 'update-alternatives --auto java', + ] + + for build in newbuilds: + if "sudo" in build: + build["sudo"] = [line for line in build["sudo"] if line not in bullseye_blocklist] + if build["sudo"] == ['apt-get update']: + build["sudo"] = '' + for b, v in zip(newbuilds, vercodes): b.disable = False b.versionCode = v From 551fca21b3eb717e874af31aba24939b6e1501d2 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 4 Nov 2022 19:18:31 +0100 Subject: [PATCH 0910/2116] lint: UpdateCheckData regex must match integers --- fdroidserver/lint.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 6e11c8a6..a052557e 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -218,6 +218,8 @@ regex_checks = { locale_pattern = re.compile(r"[a-z]{2,3}(-([A-Z][a-zA-Z]+|\d+|[a-z]+))*") +versioncode_check_pattern = re.compile(r"(\\d|\[(0-9|\\d)_?(a-fA-F)?])[+]") + def check_regexes(app): for f, checks in regex_checks.items(): @@ -261,6 +263,17 @@ def check_update_check_data_url(app): # noqa: D403 yield _('UpdateCheckData must use HTTPS URL: {url}').format(url=url) +def check_update_check_data_int(app): # noqa: D403 + """UpdateCheckData regex must match integers.""" + if app.UpdateCheckData: + urlcode, codeex, urlver, verex = app.UpdateCheckData.split('|') + # codeex can be empty as well + if codeex and not versioncode_check_pattern.search(codeex): + yield _( + f'UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}' + ) + + def check_vercode_operation(app): if not app.VercodeOperation: return @@ -767,6 +780,7 @@ def main(): check_app_field_types, check_regexes, check_update_check_data_url, + check_update_check_data_int, check_vercode_operation, check_ucm_tags, check_char_limits, From dedce2f2368c374318ec951a3f951ccfa9545db1 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 4 Nov 2022 19:48:21 +0100 Subject: [PATCH 0911/2116] lint: AUM with UCM: HTTP must have a pattern Closes: #1029 --- fdroidserver/lint.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index a052557e..e8417510 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -690,6 +690,12 @@ def check_updates_expected(app): ) +def check_updates_ucm_http_aum_pattern(app): # noqa: D403 + """AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern.""" + if app.UpdateCheckMode == "HTTP" and app.AutoUpdateMode == "Version": + yield _("AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern.") + + def main(): global config, options @@ -798,6 +804,7 @@ def main(): check_license_tag, check_current_version_code, check_updates_expected, + check_updates_ucm_http_aum_pattern, ] for check_func in app_check_funcs: From b73c4b92142ddfba78bbb7abf4b8e67488dc052e Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 12 Oct 2022 15:33:27 +0200 Subject: [PATCH 0912/2116] Drop successfulBuilds from build.json This should reduce the file size from 34MB to 1MB and it is not used by the monitor. --- fdroidserver/build.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index ad9c090f..d441662b 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -1075,10 +1075,8 @@ def main(): # Build applications... failed_builds = [] - build_succeeded = [] build_succeeded_ids = [] status_output['failedBuilds'] = failed_builds - status_output['successfulBuilds'] = build_succeeded status_output['successfulBuildIds'] = build_succeeded_ids # Only build for 72 hours, then stop gracefully. endtime = time.time() + 72 * 60 * 60 @@ -1193,7 +1191,6 @@ def main(): 'supplied reference binary ' 'successfully') - build_succeeded.append(app) build_succeeded_ids.append([app['id'], build.versionCode]) if not options.onserver: @@ -1255,17 +1252,17 @@ def main(): logging.info("Stopping after global build timeout...") break - for app in build_succeeded: - logging.info("success: %s" % (app.id)) + for app in build_succeeded_ids: + logging.info("success: %s" % app[0]) if not options.verbose: for fb in failed_builds: logging.info('Build for app {}:{} failed:\n{}'.format(*fb)) logging.info(_("Finished")) - if len(build_succeeded) > 0: + if len(build_succeeded_ids) > 0: logging.info(ngettext("{} build succeeded", - "{} builds succeeded", len(build_succeeded)).format(len(build_succeeded))) + "{} builds succeeded", len(build_succeeded_ids)).format(len(build_succeeded_ids))) if len(failed_builds) > 0: logging.info(ngettext("{} build failed", "{} builds failed", len(failed_builds)).format(len(failed_builds))) From e395cd4f799ff30d48d3167bd4b3e0edce783d8d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 9 Nov 2022 10:32:59 +0100 Subject: [PATCH 0913/2116] makebuildserver: delete unused libvirt image after process is complete This process creates three copies of the buildserver image, all of which are large. So deleting the unused one is quite helpful: ``` -rw-r--r-- 1 fdroid fdroid 20G 8. Nov 15:22 /home/fdroid/.vagrant.d/boxes/buildserver/0/libvirt/box.img -rw------- 1 root root 19G 8. Nov 14:07 /var/lib/libvirt/images/buildserver_default.img -rwxr--r-- 1 libvirt-qemu libvirt-qemu 20G 8. Nov 16:08 /var/lib/libvirt/images/buildserver_vagrant_box_image_0_box.img ``` --- makebuildserver | 3 +++ 1 file changed, 3 insertions(+) diff --git a/makebuildserver b/makebuildserver index fe7a0de9..4a49ce6c 100755 --- a/makebuildserver +++ b/makebuildserver @@ -409,6 +409,9 @@ def main(): boxfile) os.remove(boxfile) + # This was needed just to create the box, after that, it is unused. + vm.destroy() + if __name__ == '__main__': From 038697cba5f1af53101f5d3734f19218fddbfa5a Mon Sep 17 00:00:00 2001 From: FC Stegerman Date: Thu, 3 Nov 2022 21:14:52 +0100 Subject: [PATCH 0914/2116] copy apksigcopier v1.1.0 --- fdroidserver/apksigcopier.py | 501 +++++++++++++++++++++++++++++------ 1 file changed, 418 insertions(+), 83 deletions(-) diff --git a/fdroidserver/apksigcopier.py b/fdroidserver/apksigcopier.py index 50a26945..90fc5e71 100644 --- a/fdroidserver/apksigcopier.py +++ b/fdroidserver/apksigcopier.py @@ -1,22 +1,28 @@ #!/usr/bin/python3 # encoding: utf-8 +# SPDX-FileCopyrightText: 2022 FC Stegerman +# SPDX-License-Identifier: GPL-3.0-or-later # -- ; {{{1 # # File : apksigcopier -# Maintainer : Felix C. Stegerman -# Date : 2021-04-14 +# Maintainer : FC Stegerman +# Date : 2022-11-01 # -# Copyright : Copyright (C) 2021 Felix C. Stegerman -# Version : v0.4.0 +# Copyright : Copyright (C) 2022 FC Stegerman +# Version : v1.1.0 # License : GPLv3+ # # -- ; }}}1 -"""Copy/extract/patch apk signatures. +""" +copy/extract/patch android apk signatures & compare apks -apksigcopier is a tool for copying APK signatures from a signed APK to an -unsigned one (in order to verify reproducible builds). +apksigcopier is a tool for copying android APK signatures from a signed APK to +an unsigned one (in order to verify reproducible builds). + +It can also be used to compare two APKs with different signatures; this requires +apksigner. CLI @@ -25,9 +31,10 @@ CLI $ apksigcopier extract [OPTIONS] SIGNED_APK OUTPUT_DIR $ apksigcopier patch [OPTIONS] METADATA_DIR UNSIGNED_APK OUTPUT_APK $ apksigcopier copy [OPTIONS] SIGNED_APK UNSIGNED_APK OUTPUT_APK +$ apksigcopier compare [OPTIONS] FIRST_APK SECOND_APK The following environment variables can be set to 1, yes, or true to -overide the default behaviour: +override the default behaviour: * set APKSIGCOPIER_EXCLUDE_ALL_META=1 to exclude all metadata files * set APKSIGCOPIER_COPY_EXTRA_BYTES=1 to copy extra bytes after data (e.g. a v2 sig) @@ -36,10 +43,11 @@ overide the default behaviour: API === ->> from apksigcopier import do_extract, do_patch, do_copy +>> from apksigcopier import do_extract, do_patch, do_copy, do_compare >> do_extract(signed_apk, output_dir, v1_only=NO) >> do_patch(metadata_dir, unsigned_apk, output_apk, v1_only=NO) >> do_copy(signed_apk, unsigned_apk, output_apk, v1_only=NO) +>> do_compare(first_apk, second_apk, unsigned=False) You can use False, None, and True instead of NO, AUTO, and YES respectively. @@ -51,28 +59,72 @@ override the default behaviour: """ import glob +import json import os import re import struct +import subprocess import sys +import tempfile import zipfile import zlib from collections import namedtuple -from typing import Dict, Tuple, Union +from typing import Any, BinaryIO, Dict, Iterable, Iterator, Optional, Tuple, Union -__version__ = "0.4.0" +__version__ = "1.1.0" NAME = "apksigcopier" +if sys.version_info >= (3, 8): + from typing import Literal + NoAutoYes = Literal["no", "auto", "yes"] +else: + NoAutoYes = str + +DateTime = Tuple[int, int, int, int, int, int] +NoAutoYesBoolNone = Union[NoAutoYes, bool, None] +ZipInfoDataPairs = Iterable[Tuple[zipfile.ZipInfo, bytes]] + SIGBLOCK, SIGOFFSET = "APKSigningBlock", "APKSigningBlockOffset" -NOAUTOYES = NO, AUTO, YES = ("no", "auto", "yes") +NOAUTOYES: Tuple[NoAutoYes, NoAutoYes, NoAutoYes] = ("no", "auto", "yes") +NO, AUTO, YES = NOAUTOYES APK_META = re.compile(r"^META-INF/([0-9A-Za-z_-]+\.(SF|RSA|DSA|EC)|MANIFEST\.MF)$") -META_EXT = ("SF", "RSA|DSA|EC", "MF") -COPY_EXCLUDE = ("META-INF/MANIFEST.MF",) -DATETIMEZERO = (1980, 0, 0, 0, 0, 0) +META_EXT: Tuple[str, ...] = ("SF", "RSA|DSA|EC", "MF") +COPY_EXCLUDE: Tuple[str, ...] = ("META-INF/MANIFEST.MF",) +DATETIMEZERO: DateTime = (1980, 0, 0, 0, 0, 0) +VERIFY_CMD: Tuple[str, ...] = ("apksigner", "verify") + +################################################################################ +# +# NB: these values are all from apksigner (the first element of each tuple, same +# as APKZipInfo) or signflinger/zipflinger, except for external_attr w/ 0664 +# permissions and flag_bits 0x08, added for completeness. +# +# NB: zipflinger changed from 0666 to 0644 in commit 895ba5fba6ab84617dd67e38f456a8f96aa37ff0 +# +# https://android.googlesource.com/platform/tools/apksig +# src/main/java/com/android/apksig/internal/zip/{CentralDirectoryRecord,LocalFileRecord,ZipUtils}.java +# https://android.googlesource.com/platform/tools/base +# signflinger/src/com/android/signflinger/SignedApk.java +# zipflinger/src/com/android/zipflinger/{CentralDirectoryRecord,LocalFileHeader,Source}.java +# +################################################################################ + +VALID_ZIP_META = dict( + compresslevel=(9, 1), # best compression, best speed + create_system=(0, 3), # fat, unx + create_version=(20, 0), # 2.0, 0.0 + external_attr=(0, # N/A + 0o100644 << 16, # regular file rw-r--r-- + 0o100664 << 16, # regular file rw-rw-r-- + 0o100666 << 16), # regular file rw-rw-rw- + extract_version=(20, 0), # 2.0, 0.0 + flag_bits=(0x800, 0, 0x08, 0x808), # 0x800 = utf8, 0x08 = data_descriptor +) ZipData = namedtuple("ZipData", ("cd_offset", "eocd_offset", "cd_and_eocd")) +exclude_all_meta = False # exclude all metadata files in copy_apk() copy_extra_bytes = False # copy extra bytes after data in copy_apk() @@ -96,10 +148,9 @@ class ZipError(APKSigCopierError): class ReproducibleZipInfo(zipfile.ZipInfo): """Reproducible ZipInfo hack.""" - _override = {} # type: Dict[str, Union[int, Tuple[int, ...]]] + _override: Dict[str, Any] = {} - def __init__(self, zinfo, **override): - super().__init__() + def __init__(self, zinfo, **override): # pylint: disable=W0231 if override: self._override = {**self._override, **override} for k in self.__slots__: @@ -115,9 +166,12 @@ class ReproducibleZipInfo(zipfile.ZipInfo): return object.__getattribute__(self, name) +# See VALID_ZIP_META class APKZipInfo(ReproducibleZipInfo): """Reproducible ZipInfo for APK files.""" + COMPRESSLEVEL = 9 + _override = dict( compress_type=8, create_system=0, @@ -129,8 +183,9 @@ class APKZipInfo(ReproducibleZipInfo): ) -def noautoyes(value): - """Turn False into NO, None into AUTO, and True into YES. +def noautoyes(value: NoAutoYesBoolNone) -> NoAutoYes: + """ + Turns False into NO, None into AUTO, and True into YES. >>> from apksigcopier import noautoyes, NO, AUTO, YES >>> noautoyes(False) == NO == noautoyes(NO) @@ -147,13 +202,12 @@ def noautoyes(value): return value try: return {False: NO, None: AUTO, True: YES}[value] - except KeyError as exc: - raise ValueError("expected False, None, or True") from exc + except KeyError: + raise ValueError("expected False, None, or True") # pylint: disable=W0707 -def is_meta(filename): - """No summary. - +def is_meta(filename: str) -> bool: + """ Returns whether filename is a v1 (JAR) signature file (.SF), signature block file (.RSA, .DSA, or .EC), or manifest (MANIFEST.MF). @@ -162,15 +216,58 @@ def is_meta(filename): return APK_META.fullmatch(filename) is not None -def exclude_from_copying(filename): - """Fdroidserver always wants JAR Signature files to be excluded.""" - return is_meta(filename) +def exclude_from_copying(filename: str) -> bool: + """ + Returns whether to exclude a file during copy_apk(). + + Excludes filenames in COPY_EXCLUDE (i.e. MANIFEST.MF) by default; when + exclude_all_meta is set to True instead, excludes all metadata files as + matched by is_meta(). + """ + return is_meta(filename) if exclude_all_meta else filename in COPY_EXCLUDE + + +################################################################################ +# +# There is usually a 132-byte virtual entry at the start of an APK signed with a +# v1 signature by signflinger/zipflinger; almost certainly this is a default +# manifest ZIP entry created at initialisation, deleted (from the CD but not +# from the file) during v1 signing, and eventually replaced by a virtual entry. +# +# >>> (30 + len("META-INF/MANIFEST.MF") + +# ... len("Manifest-Version: 1.0\r\n" +# ... "Created-By: Android Gradle 7.1.3\r\n" +# ... "Built-By: Signflinger\r\n\r\n")) +# 132 +# +# NB: they could be a different size, depending on Created-By and Built-By. +# +# FIXME: could virtual entries occur elsewhere as well? +# +# https://android.googlesource.com/platform/tools/base +# signflinger/src/com/android/signflinger/SignedApk.java +# zipflinger/src/com/android/zipflinger/{LocalFileHeader,ZipArchive}.java +# +################################################################################ + +def zipflinger_virtual_entry(size: int) -> bytes: + """Create zipflinger virtual entry.""" + if size < 30: + raise ValueError("Minimum size for virtual entries is 30 bytes") + return ( + # header extract_version flag_bits + b"\x50\x4b\x03\x04" b"\x00\x00" b"\x00\x00" + # compress_type (1981,1,1,1,1,2) crc32 + b"\x00\x00" b"\x21\x08\x21\x02" b"\x00\x00\x00\x00" + # compress_size file_size filename length + b"\x00\x00\x00\x00" b"\x00\x00\x00\x00" b"\x00\x00" + ) + int.to_bytes(size - 30, 2, "little") + b"\x00" * (size - 30) ################################################################################ # # https://en.wikipedia.org/wiki/ZIP_(file_format) -# https://source.android.com/security/apksigning/v2#apk-signing-block-format +# https://source.android.com/docs/security/features/apksigning/v2#apk-signing-block-format # # ================================= # | Contents of ZIP entries | @@ -198,24 +295,36 @@ def exclude_from_copying(filename): # FIXME: makes certain assumptions and doesn't handle all valid ZIP files! -def copy_apk(unsigned_apk, output_apk): - """Copy APK like apksigner would, excluding files matched by exclude_from_copying(). +# FIXME: support zip64? +# FIXME: handle utf8 filenames w/o utf8 flag (as produced by zipflinger)? +# https://android.googlesource.com/platform/tools/apksig +# src/main/java/com/android/apksig/ApkSigner.java +def copy_apk(unsigned_apk: str, output_apk: str, *, zfe_size: Optional[int] = None) -> DateTime: + """ + Copy APK like apksigner would, excluding files matched by + exclude_from_copying(). + + Adds a zipflinger virtual entry of zfe_size bytes if one is not already + present and zfe_size is not None. + + Returns max date_time. The following global variables (which default to False), can be set to override the default behaviour: * set exclude_all_meta=True to exclude all metadata files * set copy_extra_bytes=True to copy extra bytes after data (e.g. a v2 sig) - - Returns - ------- - max date_time. """ with zipfile.ZipFile(unsigned_apk, "r") as zf: infos = zf.infolist() zdata = zip_data(unsigned_apk) offsets = {} with open(unsigned_apk, "rb") as fhi, open(output_apk, "w+b") as fho: + if zfe_size: + zfe = zipflinger_virtual_entry(zfe_size) + if fhi.read(zfe_size) != zfe: + fho.write(zfe) + fhi.seek(0) for info in sorted(infos, key=lambda info: info.header_offset): off_i = fhi.tell() if info.header_offset > off_i: @@ -231,7 +340,7 @@ def copy_apk(unsigned_apk, output_apk): fhi.seek(info.compress_size, os.SEEK_CUR) else: if info.filename in offsets: - raise ZipError("Duplicate ZIP entry: " + info.filename) + raise ZipError(f"Duplicate ZIP entry: {info.filename!r}") offsets[info.filename] = off_o = fho.tell() if info.compress_type == 0 and off_o != info.header_offset: hdr = _realign_zip_entry(info, hdr, n, m, off_o) @@ -268,7 +377,7 @@ def copy_apk(unsigned_apk, output_apk): # NB: doesn't sync local & CD headers! -def _realign_zip_entry(info, hdr, n, m, off_o): +def _realign_zip_entry(info: zipfile.ZipInfo, hdr: bytes, n: int, m: int, off_o: int) -> bytes: align = 4096 if info.filename.endswith(".so") else 4 old_off = 30 + n + m + info.header_offset new_off = 30 + n + m + off_o @@ -293,7 +402,7 @@ def _realign_zip_entry(info, hdr, n, m, off_o): return hdr -def _copy_bytes(fhi, fho, size, blocksize=4096): +def _copy_bytes(fhi: BinaryIO, fho: BinaryIO, size: int, blocksize: int = 4096) -> None: while size > 0: data = fhi.read(min(size, blocksize)) if not data: @@ -304,7 +413,7 @@ def _copy_bytes(fhi, fho, size, blocksize=4096): raise ZipError("Unexpected EOF") -def extract_meta(signed_apk): +def extract_meta(signed_apk: str) -> Iterator[Tuple[zipfile.ZipInfo, bytes]]: """ Extract v1 signature metadata files from signed APK. @@ -316,34 +425,97 @@ def extract_meta(signed_apk): yield info, zf_sig.read(info.filename) -def patch_meta(extracted_meta, output_apk, date_time=DATETIMEZERO): +def extract_differences(signed_apk: str, extracted_meta: ZipInfoDataPairs) \ + -> Optional[Dict[str, Any]]: + """Extract ZIP metadata differences from signed APK.""" + differences: Dict[str, Any] = {} + files = {} + for info, data in extracted_meta: + diffs = {} + for k in VALID_ZIP_META.keys(): + if k != "compresslevel": + v = getattr(info, k) + if v != APKZipInfo._override[k]: + if v not in VALID_ZIP_META[k]: + raise ZipError(f"Unsupported {k}") + diffs[k] = v + level = _get_compresslevel(info, data) + if level != APKZipInfo.COMPRESSLEVEL: + diffs["compresslevel"] = level + if diffs: + files[info.filename] = diffs + if files: + differences["files"] = files + with open(signed_apk, "rb") as fh: + zfe_start = zipflinger_virtual_entry(30)[:28] # w/o len(extra) + if fh.read(28) == zfe_start: + zfe_size = 30 + int.from_bytes(fh.read(2), "little") + if not (30 <= zfe_size <= 4096): + raise ZipError("Unsupported virtual entry size") + if not fh.read(zfe_size - 30) == b"\x00" * (zfe_size - 30): + raise ZipError("Unsupported virtual entry data") + differences["zipflinger_virtual_entry"] = zfe_size + return differences or None + + +def validate_differences(differences: Dict[str, Any]) -> Optional[str]: + """ + Validate differences dict. + + Returns None if valid, error otherwise. + """ + if set(differences.keys()) - {"files", "zipflinger_virtual_entry"}: + return "contains unknown key(s)" + if "zipflinger_virtual_entry" in differences: + if type(differences["zipflinger_virtual_entry"]) is not int: + return ".zipflinger_virtual_entry is not an int" + if not (30 <= differences["zipflinger_virtual_entry"] <= 4096): + return ".zipflinger_virtual_entry is < 30 or > 4096" + if "files" in differences: + if not isinstance(differences["files"], dict): + return ".files is not a dict" + for name, info in differences["files"].items(): + if not isinstance(info, dict): + return f".files[{name!r}] is not a dict" + if set(info.keys()) - set(VALID_ZIP_META.keys()): + return f".files[{name!r}] contains unknown key(s)" + for k, v in info.items(): + if v not in VALID_ZIP_META[k]: + return f".files[{name!r}].{k} has an unexpected value" + return None + + +# FIXME: false positives on same compressed size? compare actual data? +def _get_compresslevel(info: zipfile.ZipInfo, data: bytes) -> int: + if info.compress_type != 8: + raise ZipError("Unsupported compress_type") + for level in VALID_ZIP_META["compresslevel"]: + comp = zlib.compressobj(level, 8, -15) + if len(comp.compress(data) + comp.flush()) == info.compress_size: + return level + raise ZipError("Unsupported compresslevel") + + +def patch_meta(extracted_meta: ZipInfoDataPairs, output_apk: str, + date_time: DateTime = DATETIMEZERO, *, + differences: Optional[Dict[str, Any]] = None) -> None: """Add v1 signature metadata to APK (removes v2 sig block, if any).""" with zipfile.ZipFile(output_apk, "r") as zf_out: for info in zf_out.infolist(): if is_meta(info.filename): raise ZipError("Unexpected metadata") with zipfile.ZipFile(output_apk, "a") as zf_out: - info_data = [(APKZipInfo(info, date_time=date_time), data) - for info, data in extracted_meta] - _write_to_zip(info_data, zf_out) + for info, data in extracted_meta: + if differences and "files" in differences: + more = differences["files"].get(info.filename, {}).copy() + else: + more = {} + level = more.pop("compresslevel", APKZipInfo.COMPRESSLEVEL) + zinfo = APKZipInfo(info, date_time=date_time, **more) + zf_out.writestr(zinfo, data, compresslevel=level) -if sys.version_info >= (3, 7): - def _write_to_zip(info_data, zf_out): - for info, data in info_data: - zf_out.writestr(info, data, compresslevel=9) -else: - def _write_to_zip(info_data, zf_out): - old = zipfile._get_compressor - zipfile._get_compressor = lambda _: zlib.compressobj(9, 8, -15) - try: - for info, data in info_data: - zf_out.writestr(info, data) - finally: - zipfile._get_compressor = old - - -def extract_v2_sig(apkfile, expected=True): +def extract_v2_sig(apkfile: str, expected: bool = True) -> Optional[Tuple[int, bytes]]: """ Extract APK Signing Block and offset from APK. @@ -369,13 +541,12 @@ def extract_v2_sig(apkfile, expected=True): return sb_offset, sig_block -def zip_data(apkfile, count=1024): +# FIXME: OSError for APKs < 1024 bytes [wontfix] +def zip_data(apkfile: str, count: int = 1024) -> ZipData: """ Extract central directory, EOCD, and offsets from ZIP. - Returns - ------- - ZipData + Returns ZipData. """ with open(apkfile, "rb") as fh: fh.seek(-count, os.SEEK_END) @@ -393,7 +564,7 @@ def zip_data(apkfile, count=1024): # FIXME: can we determine signed_sb_offset? -def patch_v2_sig(extracted_v2_sig, output_apk): +def patch_v2_sig(extracted_v2_sig: Tuple[int, bytes], output_apk: str) -> None: """Implant extracted v2/v3 signature into APK.""" signed_sb_offset, signed_sb = extracted_v2_sig data_out = zip_data(output_apk) @@ -410,24 +581,45 @@ def patch_v2_sig(extracted_v2_sig, output_apk): fh.write(int.to_bytes(data_out.cd_offset + offset, 4, "little")) -def patch_apk(extracted_meta, extracted_v2_sig, unsigned_apk, output_apk): - """Patch extracted_meta + extracted_v2_sig. - - Patches extracted_meta + extracted_v2_sig (if not None) - onto unsigned_apk and save as output_apk. +def patch_apk(extracted_meta: ZipInfoDataPairs, extracted_v2_sig: Optional[Tuple[int, bytes]], + unsigned_apk: str, output_apk: str, *, + differences: Optional[Dict[str, Any]] = None) -> None: """ - date_time = copy_apk(unsigned_apk, output_apk) - patch_meta(extracted_meta, output_apk, date_time=date_time) + Patch extracted_meta + extracted_v2_sig (if not None) onto unsigned_apk and + save as output_apk. + """ + if differences and "zipflinger_virtual_entry" in differences: + zfe_size = differences["zipflinger_virtual_entry"] + else: + zfe_size = None + date_time = copy_apk(unsigned_apk, output_apk, zfe_size=zfe_size) + patch_meta(extracted_meta, output_apk, date_time=date_time, differences=differences) if extracted_v2_sig is not None: patch_v2_sig(extracted_v2_sig, output_apk) -def do_extract(signed_apk, output_dir, v1_only=NO): - """Extract signatures from signed_apk and save in output_dir. +def verify_apk(apk: str, min_sdk_version: Optional[int] = None) -> None: + """Verifies APK using apksigner.""" + args = VERIFY_CMD + if min_sdk_version is not None: + args += (f"--min-sdk-version={min_sdk_version}",) + args += ("--", apk) + try: + subprocess.run(args, check=True, stdout=subprocess.PIPE) + except subprocess.CalledProcessError: + raise APKSigCopierError(f"failed to verify {apk}") # pylint: disable=W0707 + except FileNotFoundError: + raise APKSigCopierError(f"{VERIFY_CMD[0]} command not found") # pylint: disable=W0707 + + +# FIXME: support multiple signers? +def do_extract(signed_apk: str, output_dir: str, v1_only: NoAutoYesBoolNone = NO, + *, ignore_differences: bool = False) -> None: + """ + Extract signatures from signed_apk and save in output_dir. The v1_only parameter controls whether the absence of a v1 signature is considered an error or not: - * use v1_only=NO (or v1_only=False) to only accept (v1+)v2/v3 signatures; * use v1_only=AUTO (or v1_only=None) to automatically detect v2/v3 signatures; * use v1_only=YES (or v1_only=True) to ignore any v2/v3 signatures. @@ -455,20 +647,29 @@ def do_extract(signed_apk, output_dir, v1_only=NO): fh.write(str(signed_sb_offset) + "\n") with open(os.path.join(output_dir, SIGBLOCK), "wb") as fh: fh.write(signed_sb) + if not ignore_differences: + differences = extract_differences(signed_apk, extracted_meta) + if differences: + with open(os.path.join(output_dir, "differences.json"), "w") as fh: + json.dump(differences, fh, sort_keys=True, indent=2) + fh.write("\n") -def do_patch(metadata_dir, unsigned_apk, output_apk, v1_only=NO): - """Patch signatures from metadata_dir onto unsigned_apk and save as output_apk. +# FIXME: support multiple signers? +def do_patch(metadata_dir: str, unsigned_apk: str, output_apk: str, + v1_only: NoAutoYesBoolNone = NO, *, ignore_differences: bool = False) -> None: + """ + Patch signatures from metadata_dir onto unsigned_apk and save as output_apk. The v1_only parameter controls whether the absence of a v1 signature is considered an error or not: - * use v1_only=NO (or v1_only=False) to only accept (v1+)v2/v3 signatures; * use v1_only=AUTO (or v1_only=None) to automatically detect v2/v3 signatures; * use v1_only=YES (or v1_only=True) to ignore any v2/v3 signatures. """ v1_only = noautoyes(v1_only) extracted_meta = [] + differences = None for pat in META_EXT: files = [fn for ext in pat.split("|") for fn in glob.glob(os.path.join(metadata_dir, "*." + ext))] @@ -492,27 +693,161 @@ def do_patch(metadata_dir, unsigned_apk, output_apk, v1_only=NO): with open(sigblock_file, "rb") as fh: signed_sb = fh.read() extracted_v2_sig = signed_sb_offset, signed_sb + differences_file = os.path.join(metadata_dir, "differences.json") + if not ignore_differences and os.path.exists(differences_file): + with open(differences_file, "r") as fh: + try: + differences = json.load(fh) + except json.JSONDecodeError as e: + raise APKSigCopierError(f"Invalid differences.json: {e}") # pylint: disable=W0707 + error = validate_differences(differences) + if error: + raise APKSigCopierError(f"Invalid differences.json: {error}") if not extracted_meta and extracted_v2_sig is None: raise APKSigCopierError("Expected v1 and/or v2/v3 signature, found neither") - patch_apk(extracted_meta, extracted_v2_sig, unsigned_apk, output_apk) + patch_apk(extracted_meta, extracted_v2_sig, unsigned_apk, output_apk, + differences=differences) -def do_copy(signed_apk, unsigned_apk, output_apk, v1_only=NO): - """Copy signatures from signed_apk onto unsigned_apk and save as output_apk. +def do_copy(signed_apk: str, unsigned_apk: str, output_apk: str, + v1_only: NoAutoYesBoolNone = NO, *, ignore_differences: bool = False) -> None: + """ + Copy signatures from signed_apk onto unsigned_apk and save as output_apk. The v1_only parameter controls whether the absence of a v1 signature is considered an error or not: - * use v1_only=NO (or v1_only=False) to only accept (v1+)v2/v3 signatures; * use v1_only=AUTO (or v1_only=None) to automatically detect v2/v3 signatures; * use v1_only=YES (or v1_only=True) to ignore any v2/v3 signatures. """ v1_only = noautoyes(v1_only) - extracted_meta = extract_meta(signed_apk) + extracted_meta = tuple(extract_meta(signed_apk)) + differences = None if v1_only == YES: extracted_v2_sig = None else: extracted_v2_sig = extract_v2_sig(signed_apk, expected=v1_only == NO) - patch_apk(extracted_meta, extracted_v2_sig, unsigned_apk, output_apk) + if extracted_v2_sig is not None and not ignore_differences: + differences = extract_differences(signed_apk, extracted_meta) + patch_apk(extracted_meta, extracted_v2_sig, unsigned_apk, output_apk, + differences=differences) + + +def do_compare(first_apk: str, second_apk: str, unsigned: bool = False, + min_sdk_version: Optional[int] = None, *, + ignore_differences: bool = False) -> None: + """ + Compare first_apk to second_apk by: + * using apksigner to check if the first APK verifies + * checking if the second APK also verifies (unless unsigned is True) + * copying the signature from first_apk to a copy of second_apk + * checking if the resulting APK verifies + """ + global exclude_all_meta + verify_apk(first_apk, min_sdk_version=min_sdk_version) + if not unsigned: + verify_apk(second_apk, min_sdk_version=min_sdk_version) + with tempfile.TemporaryDirectory() as tmpdir: + output_apk = os.path.join(tmpdir, "output.apk") # FIXME + old_exclude_all_meta = exclude_all_meta # FIXME + exclude_all_meta = not unsigned + try: + do_copy(first_apk, second_apk, output_apk, AUTO, + ignore_differences=ignore_differences) + finally: + exclude_all_meta = old_exclude_all_meta + verify_apk(output_apk, min_sdk_version=min_sdk_version) + + +def main(): + """CLI; requires click.""" + + global exclude_all_meta, copy_extra_bytes + exclude_all_meta = os.environ.get("APKSIGCOPIER_EXCLUDE_ALL_META") in ("1", "yes", "true") + copy_extra_bytes = os.environ.get("APKSIGCOPIER_COPY_EXTRA_BYTES") in ("1", "yes", "true") + + import click + + NAY = click.Choice(NOAUTOYES) + + @click.group(help=""" + apksigcopier - copy/extract/patch android apk signatures & compare apks + """) + @click.version_option(__version__) + def cli(): + pass + + @cli.command(help=""" + Extract APK signatures from signed APK. + """) + @click.option("--v1-only", type=NAY, default=NO, show_default=True, + envvar="APKSIGCOPIER_V1_ONLY", help="Expect only a v1 signature.") + @click.option("--ignore-differences", is_flag=True, help="Don't write differences.json.") + @click.argument("signed_apk", type=click.Path(exists=True, dir_okay=False)) + @click.argument("output_dir", type=click.Path(exists=True, file_okay=False)) + def extract(*args, **kwargs): + do_extract(*args, **kwargs) + + @cli.command(help=""" + Patch extracted APK signatures onto unsigned APK. + """) + @click.option("--v1-only", type=NAY, default=NO, show_default=True, + envvar="APKSIGCOPIER_V1_ONLY", help="Expect only a v1 signature.") + @click.option("--ignore-differences", is_flag=True, help="Don't read differences.json.") + @click.argument("metadata_dir", type=click.Path(exists=True, file_okay=False)) + @click.argument("unsigned_apk", type=click.Path(exists=True, dir_okay=False)) + @click.argument("output_apk", type=click.Path(dir_okay=False)) + def patch(*args, **kwargs): + do_patch(*args, **kwargs) + + @cli.command(help=""" + Copy (extract & patch) signatures from signed to unsigned APK. + """) + @click.option("--v1-only", type=NAY, default=NO, show_default=True, + envvar="APKSIGCOPIER_V1_ONLY", help="Expect only a v1 signature.") + @click.option("--ignore-differences", is_flag=True, help="Don't copy metadata differences.") + @click.argument("signed_apk", type=click.Path(exists=True, dir_okay=False)) + @click.argument("unsigned_apk", type=click.Path(exists=True, dir_okay=False)) + @click.argument("output_apk", type=click.Path(dir_okay=False)) + def copy(*args, **kwargs): + do_copy(*args, **kwargs) + + @cli.command(help=""" + Compare two APKs by copying the signature from the first to a copy of + the second and checking if the resulting APK verifies. + + This command requires apksigner. + """) + @click.option("--unsigned", is_flag=True, help="Accept unsigned SECOND_APK.") + @click.option("--min-sdk-version", type=click.INT, help="Passed to apksigner.") + @click.option("--ignore-differences", is_flag=True, help="Don't copy metadata differences.") + @click.argument("first_apk", type=click.Path(exists=True, dir_okay=False)) + @click.argument("second_apk", type=click.Path(exists=True, dir_okay=False)) + def compare(*args, **kwargs): + do_compare(*args, **kwargs) + + # FIXME: click autocompletion is broken and this workaround fails w/ >= 8.0 + if click.__version__.startswith("7."): + def autocomplete_path(ctx=None, args=(), incomplete=""): # pylint: disable=W0613 + head, tail = os.path.split(os.path.expanduser(incomplete)) + return sorted( + (e.path if head else e.path[2:]) + ("/" if e.is_dir() else "") + for e in os.scandir(head or ".") if e.name.startswith(tail) + ) + + for command in cli.commands.values(): + for param in command.params: + if isinstance(param.type, click.Path): + param.autocompletion = autocomplete_path + + try: + cli(prog_name=NAME) + except APKSigCopierError as e: + click.echo(f"Error: {e}.", err=True) + sys.exit(1) + + +if __name__ == "__main__": + main() # vim: set tw=80 sw=4 sts=4 et fdm=marker : From ae23175a6b5ea238932769a0811fd833f91ea7f3 Mon Sep 17 00:00:00 2001 From: FC Stegerman Date: Thu, 3 Nov 2022 21:28:25 +0100 Subject: [PATCH 0915/2116] f-droid modifications: rm do_compare(), main(), ... --- fdroidserver/apksigcopier.py | 194 ++++------------------------------- 1 file changed, 22 insertions(+), 172 deletions(-) diff --git a/fdroidserver/apksigcopier.py b/fdroidserver/apksigcopier.py index 90fc5e71..321aec52 100644 --- a/fdroidserver/apksigcopier.py +++ b/fdroidserver/apksigcopier.py @@ -16,14 +16,11 @@ # -- ; }}}1 """ -copy/extract/patch android apk signatures & compare apks +Copy/extract/patch android apk signatures. apksigcopier is a tool for copying android APK signatures from a signed APK to an unsigned one (in order to verify reproducible builds). -It can also be used to compare two APKs with different signatures; this requires -apksigner. - CLI === @@ -31,30 +28,26 @@ CLI $ apksigcopier extract [OPTIONS] SIGNED_APK OUTPUT_DIR $ apksigcopier patch [OPTIONS] METADATA_DIR UNSIGNED_APK OUTPUT_APK $ apksigcopier copy [OPTIONS] SIGNED_APK UNSIGNED_APK OUTPUT_APK -$ apksigcopier compare [OPTIONS] FIRST_APK SECOND_APK The following environment variables can be set to 1, yes, or true to override the default behaviour: -* set APKSIGCOPIER_EXCLUDE_ALL_META=1 to exclude all metadata files * set APKSIGCOPIER_COPY_EXTRA_BYTES=1 to copy extra bytes after data (e.g. a v2 sig) API === ->> from apksigcopier import do_extract, do_patch, do_copy, do_compare +>> from apksigcopier import do_extract, do_patch, do_copy >> do_extract(signed_apk, output_dir, v1_only=NO) >> do_patch(metadata_dir, unsigned_apk, output_apk, v1_only=NO) >> do_copy(signed_apk, unsigned_apk, output_apk, v1_only=NO) ->> do_compare(first_apk, second_apk, unsigned=False) You can use False, None, and True instead of NO, AUTO, and YES respectively. The following global variables (which default to False), can be set to override the default behaviour: -* set exclude_all_meta=True to exclude all metadata files * set copy_extra_bytes=True to copy extra bytes after data (e.g. a v2 sig) """ @@ -63,25 +56,17 @@ import json import os import re import struct -import subprocess -import sys -import tempfile import zipfile import zlib from collections import namedtuple -from typing import Any, BinaryIO, Dict, Iterable, Iterator, Optional, Tuple, Union +from typing import Any, BinaryIO, Dict, Iterable, Iterator, Literal, Optional, Tuple, Union __version__ = "1.1.0" NAME = "apksigcopier" -if sys.version_info >= (3, 8): - from typing import Literal - NoAutoYes = Literal["no", "auto", "yes"] -else: - NoAutoYes = str - DateTime = Tuple[int, int, int, int, int, int] +NoAutoYes = Literal["no", "auto", "yes"] NoAutoYesBoolNone = Union[NoAutoYes, bool, None] ZipInfoDataPairs = Iterable[Tuple[zipfile.ZipInfo, bytes]] @@ -90,9 +75,7 @@ NOAUTOYES: Tuple[NoAutoYes, NoAutoYes, NoAutoYes] = ("no", "auto", "yes") NO, AUTO, YES = NOAUTOYES APK_META = re.compile(r"^META-INF/([0-9A-Za-z_-]+\.(SF|RSA|DSA|EC)|MANIFEST\.MF)$") META_EXT: Tuple[str, ...] = ("SF", "RSA|DSA|EC", "MF") -COPY_EXCLUDE: Tuple[str, ...] = ("META-INF/MANIFEST.MF",) DATETIMEZERO: DateTime = (1980, 0, 0, 0, 0, 0) -VERIFY_CMD: Tuple[str, ...] = ("apksigner", "verify") ################################################################################ # @@ -124,7 +107,6 @@ VALID_ZIP_META = dict( ZipData = namedtuple("ZipData", ("cd_offset", "eocd_offset", "cd_and_eocd")) -exclude_all_meta = False # exclude all metadata files in copy_apk() copy_extra_bytes = False # copy extra bytes after data in copy_apk() @@ -185,7 +167,7 @@ class APKZipInfo(ReproducibleZipInfo): def noautoyes(value: NoAutoYesBoolNone) -> NoAutoYes: """ - Turns False into NO, None into AUTO, and True into YES. + Turn False into NO, None into AUTO, and True into YES. >>> from apksigcopier import noautoyes, NO, AUTO, YES >>> noautoyes(False) == NO == noautoyes(NO) @@ -208,8 +190,10 @@ def noautoyes(value: NoAutoYesBoolNone) -> NoAutoYes: def is_meta(filename: str) -> bool: """ - Returns whether filename is a v1 (JAR) signature file (.SF), signature block - file (.RSA, .DSA, or .EC), or manifest (MANIFEST.MF). + Check whether filename is a JAR metadata file. + + This is true when filename is a v1 (JAR) signature file (.SF), signature + block file (.RSA, .DSA, or .EC), or manifest (MANIFEST.MF). See https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html """ @@ -218,13 +202,12 @@ def is_meta(filename: str) -> bool: def exclude_from_copying(filename: str) -> bool: """ - Returns whether to exclude a file during copy_apk(). + Check whether to exclude a file during copy_apk(). - Excludes filenames in COPY_EXCLUDE (i.e. MANIFEST.MF) by default; when - exclude_all_meta is set to True instead, excludes all metadata files as - matched by is_meta(). + Fdroidserver always wants JAR Signature files to be excluded, so + it excludes all metadata files as matched by is_meta(). """ - return is_meta(filename) if exclude_all_meta else filename in COPY_EXCLUDE + return is_meta(filename) ################################################################################ @@ -301,19 +284,19 @@ def zipflinger_virtual_entry(size: int) -> bytes: # src/main/java/com/android/apksig/ApkSigner.java def copy_apk(unsigned_apk: str, output_apk: str, *, zfe_size: Optional[int] = None) -> DateTime: """ - Copy APK like apksigner would, excluding files matched by - exclude_from_copying(). + Copy APK like apksigner would, excluding files matched by exclude_from_copying(). Adds a zipflinger virtual entry of zfe_size bytes if one is not already present and zfe_size is not None. - Returns max date_time. - The following global variables (which default to False), can be set to override the default behaviour: - * set exclude_all_meta=True to exclude all metadata files * set copy_extra_bytes=True to copy extra bytes after data (e.g. a v2 sig) + + Returns + ------- + max date_time """ with zipfile.ZipFile(unsigned_apk, "r") as zf: infos = zf.infolist() @@ -546,7 +529,9 @@ def zip_data(apkfile: str, count: int = 1024) -> ZipData: """ Extract central directory, EOCD, and offsets from ZIP. - Returns ZipData. + Returns + ------- + ZipData """ with open(apkfile, "rb") as fh: fh.seek(-count, os.SEEK_END) @@ -584,10 +569,7 @@ def patch_v2_sig(extracted_v2_sig: Tuple[int, bytes], output_apk: str) -> None: def patch_apk(extracted_meta: ZipInfoDataPairs, extracted_v2_sig: Optional[Tuple[int, bytes]], unsigned_apk: str, output_apk: str, *, differences: Optional[Dict[str, Any]] = None) -> None: - """ - Patch extracted_meta + extracted_v2_sig (if not None) onto unsigned_apk and - save as output_apk. - """ + """Patch extracted_meta + extracted_v2_sig (if not None) onto unsigned_apk and save as output_apk.""" if differences and "zipflinger_virtual_entry" in differences: zfe_size = differences["zipflinger_virtual_entry"] else: @@ -598,20 +580,6 @@ def patch_apk(extracted_meta: ZipInfoDataPairs, extracted_v2_sig: Optional[Tuple patch_v2_sig(extracted_v2_sig, output_apk) -def verify_apk(apk: str, min_sdk_version: Optional[int] = None) -> None: - """Verifies APK using apksigner.""" - args = VERIFY_CMD - if min_sdk_version is not None: - args += (f"--min-sdk-version={min_sdk_version}",) - args += ("--", apk) - try: - subprocess.run(args, check=True, stdout=subprocess.PIPE) - except subprocess.CalledProcessError: - raise APKSigCopierError(f"failed to verify {apk}") # pylint: disable=W0707 - except FileNotFoundError: - raise APKSigCopierError(f"{VERIFY_CMD[0]} command not found") # pylint: disable=W0707 - - # FIXME: support multiple signers? def do_extract(signed_apk: str, output_dir: str, v1_only: NoAutoYesBoolNone = NO, *, ignore_differences: bool = False) -> None: @@ -732,122 +700,4 @@ def do_copy(signed_apk: str, unsigned_apk: str, output_apk: str, patch_apk(extracted_meta, extracted_v2_sig, unsigned_apk, output_apk, differences=differences) - -def do_compare(first_apk: str, second_apk: str, unsigned: bool = False, - min_sdk_version: Optional[int] = None, *, - ignore_differences: bool = False) -> None: - """ - Compare first_apk to second_apk by: - * using apksigner to check if the first APK verifies - * checking if the second APK also verifies (unless unsigned is True) - * copying the signature from first_apk to a copy of second_apk - * checking if the resulting APK verifies - """ - global exclude_all_meta - verify_apk(first_apk, min_sdk_version=min_sdk_version) - if not unsigned: - verify_apk(second_apk, min_sdk_version=min_sdk_version) - with tempfile.TemporaryDirectory() as tmpdir: - output_apk = os.path.join(tmpdir, "output.apk") # FIXME - old_exclude_all_meta = exclude_all_meta # FIXME - exclude_all_meta = not unsigned - try: - do_copy(first_apk, second_apk, output_apk, AUTO, - ignore_differences=ignore_differences) - finally: - exclude_all_meta = old_exclude_all_meta - verify_apk(output_apk, min_sdk_version=min_sdk_version) - - -def main(): - """CLI; requires click.""" - - global exclude_all_meta, copy_extra_bytes - exclude_all_meta = os.environ.get("APKSIGCOPIER_EXCLUDE_ALL_META") in ("1", "yes", "true") - copy_extra_bytes = os.environ.get("APKSIGCOPIER_COPY_EXTRA_BYTES") in ("1", "yes", "true") - - import click - - NAY = click.Choice(NOAUTOYES) - - @click.group(help=""" - apksigcopier - copy/extract/patch android apk signatures & compare apks - """) - @click.version_option(__version__) - def cli(): - pass - - @cli.command(help=""" - Extract APK signatures from signed APK. - """) - @click.option("--v1-only", type=NAY, default=NO, show_default=True, - envvar="APKSIGCOPIER_V1_ONLY", help="Expect only a v1 signature.") - @click.option("--ignore-differences", is_flag=True, help="Don't write differences.json.") - @click.argument("signed_apk", type=click.Path(exists=True, dir_okay=False)) - @click.argument("output_dir", type=click.Path(exists=True, file_okay=False)) - def extract(*args, **kwargs): - do_extract(*args, **kwargs) - - @cli.command(help=""" - Patch extracted APK signatures onto unsigned APK. - """) - @click.option("--v1-only", type=NAY, default=NO, show_default=True, - envvar="APKSIGCOPIER_V1_ONLY", help="Expect only a v1 signature.") - @click.option("--ignore-differences", is_flag=True, help="Don't read differences.json.") - @click.argument("metadata_dir", type=click.Path(exists=True, file_okay=False)) - @click.argument("unsigned_apk", type=click.Path(exists=True, dir_okay=False)) - @click.argument("output_apk", type=click.Path(dir_okay=False)) - def patch(*args, **kwargs): - do_patch(*args, **kwargs) - - @cli.command(help=""" - Copy (extract & patch) signatures from signed to unsigned APK. - """) - @click.option("--v1-only", type=NAY, default=NO, show_default=True, - envvar="APKSIGCOPIER_V1_ONLY", help="Expect only a v1 signature.") - @click.option("--ignore-differences", is_flag=True, help="Don't copy metadata differences.") - @click.argument("signed_apk", type=click.Path(exists=True, dir_okay=False)) - @click.argument("unsigned_apk", type=click.Path(exists=True, dir_okay=False)) - @click.argument("output_apk", type=click.Path(dir_okay=False)) - def copy(*args, **kwargs): - do_copy(*args, **kwargs) - - @cli.command(help=""" - Compare two APKs by copying the signature from the first to a copy of - the second and checking if the resulting APK verifies. - - This command requires apksigner. - """) - @click.option("--unsigned", is_flag=True, help="Accept unsigned SECOND_APK.") - @click.option("--min-sdk-version", type=click.INT, help="Passed to apksigner.") - @click.option("--ignore-differences", is_flag=True, help="Don't copy metadata differences.") - @click.argument("first_apk", type=click.Path(exists=True, dir_okay=False)) - @click.argument("second_apk", type=click.Path(exists=True, dir_okay=False)) - def compare(*args, **kwargs): - do_compare(*args, **kwargs) - - # FIXME: click autocompletion is broken and this workaround fails w/ >= 8.0 - if click.__version__.startswith("7."): - def autocomplete_path(ctx=None, args=(), incomplete=""): # pylint: disable=W0613 - head, tail = os.path.split(os.path.expanduser(incomplete)) - return sorted( - (e.path if head else e.path[2:]) + ("/" if e.is_dir() else "") - for e in os.scandir(head or ".") if e.name.startswith(tail) - ) - - for command in cli.commands.values(): - for param in command.params: - if isinstance(param.type, click.Path): - param.autocompletion = autocomplete_path - - try: - cli(prog_name=NAME) - except APKSigCopierError as e: - click.echo(f"Error: {e}.", err=True) - sys.exit(1) - - -if __name__ == "__main__": - main() - # vim: set tw=80 sw=4 sts=4 et fdm=marker : From 5b7c186e4a9ccd72bc8f840bd750fe7261904c80 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 14 Nov 2022 13:17:42 +0100 Subject: [PATCH 0916/2116] Fix locale on buildserver to C.UTF-8 Regression of 817a156ea. --- buildserver/setup-env-vars | 1 + 1 file changed, 1 insertion(+) diff --git a/buildserver/setup-env-vars b/buildserver/setup-env-vars index d7d8d245..1c3599e9 100644 --- a/buildserver/setup-env-vars +++ b/buildserver/setup-env-vars @@ -14,6 +14,7 @@ echo 'export PATH=$PATH:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:/op echo "export DEBIAN_FRONTEND=noninteractive" >> $bsenv echo 'export home_vagrant=/home/vagrant' >> $bsenv echo 'export fdroidserver=$home_vagrant/fdroidserver' >> $bsenv +echo 'export LC_ALL=C.UTF-8' >> $bsenv chmod 0644 $bsenv From beed746740e4db4d77d245249b343763295dae60 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sun, 30 Oct 2022 00:22:15 +0200 Subject: [PATCH 0917/2116] Replace custom code by verify_jar_signature() --- fdroidserver/common.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index a8a93cd4..dae4dac9 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3748,11 +3748,11 @@ def load_stats_fdroid_signing_key_fingerprints(): jar_file = os.path.join('stats', 'publishsigkeys.jar') if not os.path.isfile(jar_file): return {} - cmd = [config['jarsigner'], '-strict', '-verify', jar_file] - p = FDroidPopen(cmd, output=False) - if p.returncode != 4: + try: + verify_jar_signature(jar_file) + except VerificationException as e: raise FDroidException("Signature validation of '{}' failed! " - "Please run publish again to rebuild this file.".format(jar_file)) + "Please run publish again to rebuild this file.".format(jar_file)) from e jar_sigkey = apk_signer_fingerprint(jar_file) repo_key_sig = config.get('repo_key_sha256') From 24630dfe6806b7563b9e9179c188bb0549c6dc89 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sun, 30 Oct 2022 07:14:20 +0100 Subject: [PATCH 0918/2116] Drop old getsig.java test getsig.java was replaced by a Python implementation in 6e2d0a9e (2014) and the test was only there to compare the results for the transition. Dropping this as it no longer works starting with 11.0.17+8. --- MANIFEST.in | 3 -- tests/getsig/getsig.java | 105 --------------------------------------- tests/getsig/make.sh | 2 - tests/getsig/run.sh | 2 - tests/run-tests | 5 +- tests/update.TestCase | 44 ---------------- 6 files changed, 1 insertion(+), 160 deletions(-) delete mode 100644 tests/getsig/getsig.java delete mode 100755 tests/getsig/make.sh delete mode 100755 tests/getsig/run.sh diff --git a/MANIFEST.in b/MANIFEST.in index 3adec161..d1535466 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -558,9 +558,6 @@ include tests/get_android_tools_versions/android-sdk/patcher/v4/source.propertie include tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties include tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties include tests/get_android_tools_versions/android-sdk/tools/source.properties -include tests/getsig/getsig.java -include tests/getsig/make.sh -include tests/getsig/run.sh include tests/gnupghome/pubring.gpg include tests/gnupghome/random_seed include tests/gnupghome/secring.gpg diff --git a/tests/getsig/getsig.java b/tests/getsig/getsig.java deleted file mode 100644 index 78e7ac0c..00000000 --- a/tests/getsig/getsig.java +++ /dev/null @@ -1,105 +0,0 @@ -import java.io.IOException; -import java.io.InputStream; -import java.math.BigInteger; -import java.security.Signature; -import java.security.cert.*; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.Enumeration; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; - -public class getsig { - - public static void main(String[] args) { - - String apkPath = null; - boolean full = false; - - if(args.length == 1) { - apkPath = args[0]; - } else if (args.length == 2) { - if(!args[0].equals("-f")) { - System.out.println("Only -f is supported"); - System.exit(1); - } - apkPath = args[1]; - full = true; - } else { - System.out.println("Specify the APK file to get the signature from!"); - System.exit(1); - } - - try { - - JarFile apk = new JarFile(apkPath); - java.security.cert.Certificate[] certs = null; - - Enumeration entries = apk.entries(); - while (entries.hasMoreElements()) { - JarEntry je = (JarEntry) entries.nextElement(); - if (!je.isDirectory() && !je.getName().startsWith("META-INF/")) { - // Just need to read the stream (discarding the data) to get - // it to process the certificate... - byte[] b = new byte[4096]; - InputStream is = apk.getInputStream(je); - while (is.read(b, 0, b.length) != -1); - is.close(); - certs = je.getCertificates(); - if(certs != null) - break; - } - } - apk.close(); - - if (certs == null) { - System.out.println("Not signed"); - System.exit(1); - } - if (certs.length != 1) { - System.out.println("One signature expected"); - System.exit(1); - } - - // Get the signature in the same form that is returned by - // android.content.pm.Signature.toCharsString() (but in the - // form of a byte array so we can pass it to the MD5 function)... - byte[] sig = certs[0].getEncoded(); - byte[] csig = new byte[sig.length * 2]; - for (int j=0; j>4)&0xf; - csig[j*2] = (byte)(d >= 10 ? ('a' + d - 10) : ('0' + d)); - d = v&0xf; - csig[j*2+1] = (byte)(d >= 10 ? ('a' + d - 10) : ('0' + d)); - } - - String result; - if(full) { - result = new String(csig); - } else { - // Get the MD5 sum... - MessageDigest md; - md = MessageDigest.getInstance("MD5"); - byte[] md5sum = new byte[32]; - md.update(csig); - md5sum = md.digest(); - BigInteger bigInt = new BigInteger(1, md5sum); - String md5hash = bigInt.toString(16); - while (md5hash.length() < 32) - md5hash = "0" + md5hash; - result = md5hash; - } - - System.out.println("Result:" + result); - System.exit(0); - - } catch (Exception e) { - System.out.println("Exception:" + e); - System.exit(1); - } - } - -} - - diff --git a/tests/getsig/make.sh b/tests/getsig/make.sh deleted file mode 100755 index aa63c1a2..00000000 --- a/tests/getsig/make.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -javac getsig.java diff --git a/tests/getsig/run.sh b/tests/getsig/run.sh deleted file mode 100755 index 726995bf..00000000 --- a/tests/getsig/run.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -java getsig $1 $2 $3 diff --git a/tests/run-tests b/tests/run-tests index e5349dc8..82af2148 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -151,10 +151,7 @@ test -x ./hooks/pre-commit && ./hooks/pre-commit #------------------------------------------------------------------------------# -echo_header "test python getsig replacement" - -cd $WORKSPACE/tests/getsig -./make.sh +echo_header "run unit tests" cd $WORKSPACE/tests for testcase in $WORKSPACE/tests/*.TestCase; do diff --git a/tests/update.TestCase b/tests/update.TestCase index 12380d1b..91428b22 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -20,7 +20,6 @@ import unittest import yaml import zipfile import textwrap -from binascii import unhexlify from datetime import datetime from distutils.version import LooseVersion from testcommon import TmpCwd @@ -53,7 +52,6 @@ import fdroidserver.common import fdroidserver.exception import fdroidserver.metadata import fdroidserver.update -from fdroidserver.common import FDroidPopen DONATION_FIELDS = ('Donate', 'Liberapay', 'OpenCollective') @@ -550,48 +548,6 @@ class UpdateTest(unittest.TestCase): self.assertEqual(app['localized']['en-US']['name'], 'Goguma') self.assertEqual(app['localized']['en-US']['summary'], 'An IRC client for mobile devices') - def javagetsig(self, apkfile): - getsig_dir = 'getsig' - if not os.path.exists(os.path.join(getsig_dir, "getsig.class")): - logging.critical("getsig.class not found. To fix: cd '%s' && ./make.sh" % getsig_dir) - sys.exit(1) - # FDroidPopen needs some config to work - config = dict() - fdroidserver.common.fill_config_defaults(config) - fdroidserver.common.config = config - p = FDroidPopen(['java', '-cp', 'getsig', 'getsig', apkfile]) - sig = None - for line in p.output.splitlines(): - if line.startswith('Result:'): - sig = line[7:].strip() - break - if p.returncode == 0: - return sig - else: - return None - - def testGoodGetsig(self): - # config needed to use jarsigner and keytool - config = dict() - fdroidserver.common.fill_config_defaults(config) - fdroidserver.common.options = Options - fdroidserver.update.config = config - apkfile = 'urzip.apk' - sig = self.javagetsig(apkfile) - self.assertIsNotNone(sig, "sig is None") - pysig = fdroidserver.update.getsig(apkfile) - self.assertIsNotNone(pysig, "pysig is None") - self.assertEqual(sig, fdroidserver.update.getsig(apkfile), - "python sig not equal to java sig!") - self.assertEqual(len(sig), len(pysig), - "the length of the two sigs are different!") - try: - self.assertEqual(unhexlify(sig), unhexlify(pysig), - "the length of the two sigs are different!") - except TypeError as e: - print(e) - self.assertTrue(False, 'TypeError!') - def testBadGetsig(self): """getsig() should still be able to fetch the fingerprint of bad signatures""" # config needed to use jarsigner and keytool From d4b6e95c4e8f5fccc4ca3480e40d5bee48e3213c Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sun, 30 Oct 2022 07:39:16 +0100 Subject: [PATCH 0919/2116] init: use provided keyalias --- fdroidserver/init.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/init.py b/fdroidserver/init.py index 1fbba382..313dcc22 100644 --- a/fdroidserver/init.py +++ b/fdroidserver/init.py @@ -264,7 +264,7 @@ def main(): c = dict(test_config) c['keystorepass'] = password c['keypass'] = password - c['repo_keyalias'] = socket.getfqdn() + c['repo_keyalias'] = repo_keyalias or socket.getfqdn() c['keydname'] = 'CN=' + c['repo_keyalias'] + ', OU=F-Droid' common.write_to_config(test_config, 'keystorepass', password) common.write_to_config(test_config, 'keypass', password) From 1bb963d7682485ba9cfeeb7eb049a053feb10c3c Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sat, 29 Oct 2022 22:09:07 +0200 Subject: [PATCH 0920/2116] jarsigner: allow weak signatures openjdk-11 11.0.17 in Debian unstable fails to verify weak signatures: jarsigner -verbose -strict -verify tests/signindex/guardianproject.jar 131 Fri Dec 02 20:10:00 CET 2016 META-INF/MANIFEST.MF 252 Fri Dec 02 20:10:04 CET 2016 META-INF/1.SF 2299 Fri Dec 02 20:10:04 CET 2016 META-INF/1.RSA 0 Fri Dec 02 20:09:58 CET 2016 META-INF/ m ? 48743 Fri Dec 02 20:09:58 CET 2016 index.xml s = signature was verified m = entry is listed in manifest k = at least one certificate was found in keystore ? = unsigned entry - Signed by "EMAILADDRESS=root@guardianproject.info, CN=guardianproject.info, O=Guardian Project, OU=FDroid Repo, L=New York, ST=New York, C=US" Digest algorithm: SHA1 (disabled) Signature algorithm: SHA1withRSA (disabled), 4096-bit key WARNING: The jar will be treated as unsigned, because it is signed with a weak algorithm that is now disabled by the security property: jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, DSA keySize < 1024, SHA1 denyAfter 2019-01-01, include jdk.disabled.namedCurves --- fdroidserver/common.py | 89 +++++++++++++++------------------------- fdroidserver/index.py | 2 +- fdroidserver/update.py | 7 ++-- tests/common.TestCase | 44 ++++++++++---------- tests/signindex.TestCase | 6 +-- 5 files changed, 64 insertions(+), 84 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index dae4dac9..4367981b 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3416,13 +3416,27 @@ def verify_apks(signed_apk, unsigned_apk, tmp_dir, v1_only=None): return None -def verify_jar_signature(jar): +def verify_deprecated_jar_signature(jar): """Verify the signature of a given JAR file. jarsigner is very shitty: unsigned JARs pass as "verified"! So this has to turn on -strict then check for result 4, since this does not expect the signature to be from a CA-signed certificate. + Also used to verify the signature on an archived APK, supporting deprecated + algorithms. + + F-Droid aims to keep every single binary that it ever published. Therefore, + it needs to be able to verify APK signatures that include deprecated/removed + algorithms. For example, jarsigner treats an MD5 signature as unsigned. + + jarsigner passes unsigned APKs as "verified"! So this has to turn + on -strict then check for result 4. + + Just to be safe, this never reuses the file, and locks down the + file permissions while in use. That should prevent a bad actor + from changing the settings during operation. + Raises ------ VerificationException @@ -3430,15 +3444,30 @@ def verify_jar_signature(jar): """ error = _('JAR signature failed to verify: {path}').format(path=jar) + _java_security = os.path.join(os.getcwd(), '.java.security') + if os.path.exists(_java_security): + os.remove(_java_security) + with open(_java_security, 'w') as fp: + fp.write('jdk.jar.disabledAlgorithms=MD2, RSA keySize < 1024') + os.chmod(_java_security, 0o400) + try: - output = subprocess.check_output([config['jarsigner'], '-strict', '-verify', jar], - stderr=subprocess.STDOUT) + cmd = [ + config['jarsigner'], + '-J-Djava.security.properties=' + _java_security, + '-strict', '-verify', jar + ] + output = subprocess.check_output(cmd, stderr=subprocess.STDOUT) raise VerificationException(error + '\n' + output.decode('utf-8')) except subprocess.CalledProcessError as e: if e.returncode == 4: logging.debug(_('JAR signature verified: {path}').format(path=jar)) else: raise VerificationException(error + '\n' + e.output.decode('utf-8')) from e + finally: + if os.path.exists(_java_security): + os.chmod(_java_security, 0o600) + os.remove(_java_security) def verify_apk_signature(apk, min_sdk_version=None): @@ -3471,63 +3500,13 @@ def verify_apk_signature(apk, min_sdk_version=None): config['jarsigner_warning_displayed'] = True logging.warning(_("Using Java's jarsigner, not recommended for verifying APKs! Use apksigner")) try: - verify_jar_signature(apk) + verify_deprecated_jar_signature(apk) return True except Exception as e: logging.error(e) return False -def verify_old_apk_signature(apk): - """Verify the signature on an archived APK, supporting deprecated algorithms. - - F-Droid aims to keep every single binary that it ever published. Therefore, - it needs to be able to verify APK signatures that include deprecated/removed - algorithms. For example, jarsigner treats an MD5 signature as unsigned. - - jarsigner passes unsigned APKs as "verified"! So this has to turn - on -strict then check for result 4. - - Just to be safe, this never reuses the file, and locks down the - file permissions while in use. That should prevent a bad actor - from changing the settings during operation. - - Returns - ------- - Boolean - whether the APK was verified - - """ - _java_security = os.path.join(os.getcwd(), '.java.security') - if os.path.exists(_java_security): - os.remove(_java_security) - with open(_java_security, 'w') as fp: - fp.write('jdk.jar.disabledAlgorithms=MD2, RSA keySize < 1024') - os.chmod(_java_security, 0o400) - - try: - cmd = [ - config['jarsigner'], - '-J-Djava.security.properties=' + _java_security, - '-strict', '-verify', apk - ] - output = subprocess.check_output(cmd, stderr=subprocess.STDOUT) - except subprocess.CalledProcessError as e: - if e.returncode != 4: - output = e.output - else: - logging.debug(_('JAR signature verified: {path}').format(path=apk)) - return True - finally: - if os.path.exists(_java_security): - os.chmod(_java_security, 0o600) - os.remove(_java_security) - - logging.error(_('Old APK signature failed to verify: {path}').format(path=apk) - + '\n' + output.decode('utf-8')) - return False - - apk_badchars = re.compile('''[/ :;'"]''') @@ -3749,7 +3728,7 @@ def load_stats_fdroid_signing_key_fingerprints(): if not os.path.isfile(jar_file): return {} try: - verify_jar_signature(jar_file) + verify_deprecated_jar_signature(jar_file) except VerificationException as e: raise FDroidException("Signature validation of '{}' failed! " "Please run publish again to rebuild this file.".format(jar_file)) from e diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 28f0f285..c788509d 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -1518,7 +1518,7 @@ def get_index_from_jar(jarfile, fingerprint=None): """ logging.debug(_('Verifying index signature:')) - common.verify_jar_signature(jarfile) + common.verify_deprecated_jar_signature(jarfile) with zipfile.ZipFile(jarfile) as jar: public_key, public_key_fingerprint = get_public_key_from_jar(jar) if fingerprint is not None: diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 5f1178d8..12c9dfe6 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -50,7 +50,7 @@ from . import _ from . import common from . import index from . import metadata -from .exception import BuildException, FDroidException +from .exception import BuildException, FDroidException, VerificationException from PIL import Image, PngImagePlugin @@ -1532,9 +1532,10 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal skipapk = False if not common.verify_apk_signature(apkfile): if repodir == 'archive' or allow_disabled_algorithms: - if common.verify_old_apk_signature(apkfile): + try: + common.verify_deprecated_jar_signature(apkfile) apk['antiFeatures'].update(['KnownVuln', 'DisabledAlgorithm']) - else: + except VerificationException: skipapk = True else: skipapk = True diff --git a/tests/common.TestCase b/tests/common.TestCase index fbf277e9..b36cdcd1 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -39,7 +39,8 @@ import fdroidserver.signindex import fdroidserver.common import fdroidserver.metadata from testcommon import TmpCwd -from fdroidserver.exception import FDroidException, VCSException, MetaDataException +from fdroidserver.exception import FDroidException, VCSException,\ + MetaDataException, VerificationException class CommonTest(unittest.TestCase): @@ -484,34 +485,33 @@ class CommonTest(unittest.TestCase): config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') fdroidserver.common.config = config - self.assertTrue(fdroidserver.common.verify_old_apk_signature('bad-unicode-πÇÇ现代通用字-български-عربي1.apk')) - self.assertTrue(fdroidserver.common.verify_old_apk_signature('org.bitbucket.tickytacky.mirrormirror_1.apk')) - self.assertTrue(fdroidserver.common.verify_old_apk_signature('org.bitbucket.tickytacky.mirrormirror_2.apk')) - self.assertTrue(fdroidserver.common.verify_old_apk_signature('org.bitbucket.tickytacky.mirrormirror_3.apk')) - self.assertTrue(fdroidserver.common.verify_old_apk_signature('org.bitbucket.tickytacky.mirrormirror_4.apk')) - self.assertTrue(fdroidserver.common.verify_old_apk_signature('org.dyndns.fules.ck_20.apk')) - self.assertTrue(fdroidserver.common.verify_old_apk_signature('urzip.apk')) - self.assertFalse(fdroidserver.common.verify_old_apk_signature('urzip-badcert.apk')) - self.assertFalse(fdroidserver.common.verify_old_apk_signature('urzip-badsig.apk')) - self.assertTrue(fdroidserver.common.verify_old_apk_signature('urzip-release.apk')) - self.assertFalse(fdroidserver.common.verify_old_apk_signature('urzip-release-unsigned.apk')) + try: + fdroidserver.common.verify_deprecated_jar_signature('bad-unicode-πÇÇ现代通用字-български-عربي1.apk') + fdroidserver.common.verify_deprecated_jar_signature('org.bitbucket.tickytacky.mirrormirror_1.apk') + fdroidserver.common.verify_deprecated_jar_signature('org.bitbucket.tickytacky.mirrormirror_2.apk') + fdroidserver.common.verify_deprecated_jar_signature('org.bitbucket.tickytacky.mirrormirror_3.apk') + fdroidserver.common.verify_deprecated_jar_signature('org.bitbucket.tickytacky.mirrormirror_4.apk') + fdroidserver.common.verify_deprecated_jar_signature('org.dyndns.fules.ck_20.apk') + fdroidserver.common.verify_deprecated_jar_signature('urzip.apk') + fdroidserver.common.verify_deprecated_jar_signature('urzip-release.apk') + except VerificationException: + self.fail("failed to jarsigner failed to verify an old apk") + self.assertRaises(VerificationException, fdroidserver.common.verify_deprecated_jar_signature, 'urzip-badcert.apk') + self.assertRaises(VerificationException, fdroidserver.common.verify_deprecated_jar_signature, 'urzip-badsig.apk') + self.assertRaises(VerificationException, fdroidserver.common.verify_deprecated_jar_signature, 'urzip-release-unsigned.apk') - def test_verify_jar_signature_succeeds(self): - config = fdroidserver.common.read_config(fdroidserver.common.options) - fdroidserver.common.config = config - source_dir = os.path.join(self.basedir, 'signindex') - for f in ('testy.jar', 'guardianproject.jar'): - testfile = os.path.join(source_dir, f) - fdroidserver.common.verify_jar_signature(testfile) - - def test_verify_jar_signature_fails(self): + def test_verify_deprecated_jar_signature(self): config = fdroidserver.common.read_config(fdroidserver.common.options) config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') fdroidserver.common.config = config source_dir = os.path.join(self.basedir, 'signindex') + for f in ('testy.jar', 'guardianproject.jar'): + testfile = os.path.join(source_dir, f) + fdroidserver.common.verify_deprecated_jar_signature(testfile) + testfile = os.path.join(source_dir, 'unsigned.jar') with self.assertRaises(fdroidserver.index.VerificationException): - fdroidserver.common.verify_jar_signature(testfile) + fdroidserver.common.verify_deprecated_jar_signature(testfile) def test_verify_apks(self): config = fdroidserver.common.read_config(fdroidserver.common.options) diff --git a/tests/signindex.TestCase b/tests/signindex.TestCase index 63fac860..6e2165cc 100755 --- a/tests/signindex.TestCase +++ b/tests/signindex.TestCase @@ -103,7 +103,7 @@ class SignindexTest(unittest.TestCase): # index.jar aka v0 must by signed by SHA1withRSA f = 'repo/index.jar' - common.verify_jar_signature(f) + common.verify_deprecated_jar_signature(f) self.assertIsNone(apksigcopier.extract_v2_sig(f, expected=False)) cp = subprocess.run( ['jarsigner', '-verify', '-verbose', f], stdout=subprocess.PIPE @@ -112,7 +112,7 @@ class SignindexTest(unittest.TestCase): # index-v1.jar must by signed by SHA1withRSA f = 'repo/index-v1.jar' - common.verify_jar_signature(f) + common.verify_deprecated_jar_signature(f) self.assertIsNone(apksigcopier.extract_v2_sig(f, expected=False)) cp = subprocess.run( ['jarsigner', '-verify', '-verbose', f], stdout=subprocess.PIPE @@ -121,7 +121,7 @@ class SignindexTest(unittest.TestCase): # entry.jar aka index v2 must by signed by a modern algorithm f = 'repo/entry.jar' - common.verify_jar_signature(f) + common.verify_deprecated_jar_signature(f) self.assertIsNone(apksigcopier.extract_v2_sig(f, expected=False)) cp = subprocess.run( ['jarsigner', '-verify', '-verbose', f], stdout=subprocess.PIPE From 0549535bab2dd4f9a9eaa127cab21970a8c1db0a Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sun, 30 Oct 2022 08:23:48 +0100 Subject: [PATCH 0921/2116] signindex: fix buster workaround Don't try to remove arg if the old args where used. --- fdroidserver/signindex.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/signindex.py b/fdroidserver/signindex.py index d46c737e..852ed958 100644 --- a/fdroidserver/signindex.py +++ b/fdroidserver/signindex.py @@ -110,8 +110,8 @@ def sign_jar(jar, use_old_algs=False): 'FDROID_KEY_PASS': config.get('keypass', ""), } p = common.FDroidPopen(args, envs=env_vars) - if p.returncode != 0: - # workaround for buster-backports apksigner on f-droid.org publish server + if not use_old_algs and p.returncode != 0: + # workaround for apksigner v30 on f-droid.org publish server v4 = args.index("--v4-signing-enabled") del args[v4 + 1] del args[v4] From bd51b2e99ff6bfa1bfcd442cc82aab4a626302cb Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 15 Nov 2022 08:50:23 +0100 Subject: [PATCH 0922/2116] build: read VM CPUs/RAM from builder/Vagrantfile makebuildserver.config.py is no more, builder/Vagrantfile is now where the CPU and memory is configured for the buildserver VM. In fact, that was always the actual place, the makebuildserver.config.py thing was just confused. This should have been part of !1222 --- fdroidserver/build.py | 3 +-- tests/builder/Vagrantfile | 12 ++++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 tests/builder/Vagrantfile diff --git a/fdroidserver/build.py b/fdroidserver/build.py index d441662b..206f5715 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -1277,8 +1277,7 @@ def main(): if m: status_output['hostProcMeminfoMemTotal'] = m.group(1) break - fdroid_path = os.path.realpath(os.path.join(os.path.dirname(__file__), '..')) - buildserver_config = os.path.join(fdroid_path, 'makebuildserver.config.py') + buildserver_config = 'builder/Vagrantfile' if os.path.isfile(buildserver_config) and os.access(buildserver_config, os.R_OK): with open(buildserver_config) as configfile: for line in configfile: diff --git a/tests/builder/Vagrantfile b/tests/builder/Vagrantfile new file mode 100644 index 00000000..376a19c7 --- /dev/null +++ b/tests/builder/Vagrantfile @@ -0,0 +1,12 @@ +# generated file, do not change. +# https://gitlab.com/fdroid/fdroid-bootstrap-buildserver/-/blob/c0762bf9398d0/provision.yml#L552 + +Vagrant.configure("2") do |config| + config.vm.box = "buildserver" + config.vm.synced_folder ".", "/vagrant", disabled: true + + config.vm.provider :libvirt do |libvirt| + libvirt.cpus = 24 + libvirt.memory = 30720 + end +end From e0fa38bab347f95c4fa7f20a08b2e0c9f63290ca Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 9 Nov 2022 14:46:25 +0100 Subject: [PATCH 0923/2116] status.json: drop logs of failed builds Those are uploaded separately. --- fdroidserver/build.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 206f5715..726666b3 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -335,10 +335,6 @@ def transform_first_char(string, method): return method(string[0]) + string[1:] -def add_failed_builds_entry(failed_builds, appid, build, entry): - failed_builds.append([appid, build.versionCode, str(entry)]) - - def get_metadata_from_apk(app, build, apkfile): """Get the required metadata from the built APK. @@ -1203,7 +1199,7 @@ def main(): if options.stop: logging.debug("Error encoutered, stopping by user request.") common.force_exit(1) - add_failed_builds_entry(failed_builds, appid, build, vcse) + failed_builds.append((appid, build.versionCode)) common.deploy_build_log_with_rsync( appid, build.versionCode, "".join(traceback.format_exc()) ) @@ -1224,20 +1220,20 @@ def main(): if options.stop: logging.debug("Error encoutered, stopping by user request.") common.force_exit(1) - add_failed_builds_entry(failed_builds, appid, build, e) + failed_builds.append((appid, build.versionCode)) common.deploy_build_log_with_rsync( appid, build.versionCode, "".join(traceback.format_exc()) ) if not options.onserver: common.write_running_status_json(status_output) - except Exception as e: + except Exception: logging.error("Could not build app %s due to unknown error: %s" % ( appid, traceback.format_exc())) if options.stop: logging.debug("Error encoutered, stopping by user request.") common.force_exit(1) - add_failed_builds_entry(failed_builds, appid, build, e) + failed_builds.append((appid, build.versionCode)) common.deploy_build_log_with_rsync( appid, build.versionCode, "".join(traceback.format_exc()) ) @@ -1257,7 +1253,7 @@ def main(): if not options.verbose: for fb in failed_builds: - logging.info('Build for app {}:{} failed:\n{}'.format(*fb)) + logging.info('Build for app {}:{} failed'.format(*fb)) logging.info(_("Finished")) if len(build_succeeded_ids) > 0: From 24d88705fa1820cbf46940ecef6034a5764d7c08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 13 Oct 2022 16:33:33 +0200 Subject: [PATCH 0924/2116] =?UTF-8?q?=F0=9F=94=8D=20add=20`scanner=5Fsigna?= =?UTF-8?q?ture=5Fsources`=20config=20option?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This adds the option to configure which set of signatures `fdroid scanner` should use, by configuring it in `config.yml`. It allows fetching signatures in our custom json format. It also adds 3 additional sources: 'suss', 'exodus', 'etip' --- examples/config.yml | 16 ++++++++++ fdroidserver/common.py | 1 + fdroidserver/scanner.py | 71 +++++++++++++++++++++++++++++++---------- tests/scanner.TestCase | 31 ++++++++++++++++++ 4 files changed, 102 insertions(+), 17 deletions(-) diff --git a/examples/config.yml b/examples/config.yml index 67e5d5b9..a0943a8c 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -355,3 +355,19 @@ # lint_licenses: # - Custom-License-A # - Another-License + +# `fdroid scanner` can scan for signatures from various sources. By default +# it's configured to only use F-Droids official SUSS collection. We have +# support for these special collections: +# * 'exodus' - official exodus-privacy.org signatures +# * 'etip' - exodus privacy investigation platfrom community contributed +# signatures +# * 'suss' - official F-Droid: Suspicious or Unwanted Software Signatures +# You can also configure scanner to use custom collections of signatures here. +# They have to follow the format specified in the SUSS readme. +# (https://gitlab.com/fdroid/fdroid-suss/#cache-file-data-format) +# +# scanner_signature_sources: +# - suss +# - exodus +# - https://example.com/signatures.json diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 4367981b..73d899b9 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -163,6 +163,7 @@ default_config = { 'archive_older': 0, 'lint_licenses': fdroidserver.lint.APPROVED_LICENSES, # type: ignore 'git_mirror_size_limit': 10000000000, + 'scanner_signature_sources': ['suss'], } diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index e14aadae..e42d8d8c 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -25,6 +25,7 @@ import logging import zipfile import itertools import traceback +import urllib.parse import urllib.request from argparse import ArgumentParser from copy import deepcopy @@ -141,6 +142,10 @@ class SignatureDataCacheMissException(Exception): pass +class SignatureDataNoDefaultsException(Exception): + pass + + class SignatureDataVersionMismatchException(Exception): pass @@ -198,7 +203,7 @@ class SignatureDataController: self.check_last_updated() except SignatureDataCacheMissException: self.load_from_defaults() - except SignatureDataOutdatedException: + except (SignatureDataOutdatedException, SignatureDataNoDefaultsException): self.fetch_signatures_from_web() self.write_to_cache() except (SignatureDataMalformedException, SignatureDataVersionMismatchException) as e: @@ -208,9 +213,7 @@ class SignatureDataController: raise e def load_from_defaults(self): - sig_file = (Path(__file__).parent / 'data' / 'scanner' / self.filename).resolve() - with open(sig_file) as f: - self.set_data(json.load(f)) + raise SignatureDataNoDefaultsException() def load_from_cache(self): sig_file = scanner._scanner_cachedir() / self.filename @@ -254,8 +257,9 @@ class SignatureDataController: class ExodusSignatureDataController(SignatureDataController): def __init__(self): - super().__init__('Exodus signatures', 'exodus.yml', 'https://reports.exodus-privacy.eu.org/api/trackers') + super().__init__('Exodus signatures', 'exodus.json', 'https://reports.exodus-privacy.eu.org/api/trackers') self.cache_duration = timedelta(days=1) # refresh exodus cache after one day + self.has_trackers_json_key = True def fetch_signatures_from_web(self): logging.debug(_("downloading '{}'").format(self.url)) @@ -270,8 +274,10 @@ class ExodusSignatureDataController(SignatureDataController): if not self.url.startswith("https://"): raise Exception(_("can't open non-https url: '{};".format(self.url))) with urllib.request.urlopen(self.url) as f: # nosec B310 scheme filtered above - d = json.load(f) - for tracker in d["trackers"].values(): + trackerlist = json.load(f) + if self.has_trackers_json_key: + trackerlist = trackerlist["trackers"].values() + for tracker in trackerlist: if tracker.get('code_signature'): data["signatures"][tracker["name"]] = { "name": tracker["name"], @@ -288,6 +294,15 @@ class ExodusSignatureDataController(SignatureDataController): self.set_data(data) +class EtipSignatureDataController(ExodusSignatureDataController): + def __init__(self): + super().__init__() + self.name = 'ETIP signatures' + self.filename = 'etip.json' + self.url = 'https://etip.exodus-privacy.eu.org/api/trackers/?format=json' + self.has_trackers_json_key = False + + class SUSSDataController(SignatureDataController): def __init__(self): super().__init__( @@ -302,16 +317,42 @@ class SUSSDataController(SignatureDataController): class ScannerTool(): def __init__(self): - self.sdcs = [ - SUSSDataController(), - ] # we could add support for loading additional signature source # definitions from config.yml here + self.scanner_data_lookup() self.load() self.compile_regexes() + def scanner_data_lookup(self): + sigsources = common.get_config().get('scanner_signature_sources', []) + logging.debug( + "scanner is configured to use signature data from: '{}'" + .format("', '".join(sigsources)) + ) + self.sdcs = [] + for i, source_url in enumerate(sigsources): + if source_url.lower() == 'suss': + self.sdcs.append(SUSSDataController()) + elif source_url.lower() == 'exodus': + self.sdcs.append(ExodusSignatureDataController()) + elif source_url.lower() == 'etip': + self.sdcs.append(EtipSignatureDataController()) + else: + u = urllib.parse.urlparse(source_url) + if u.scheme != 'https' or u.path == "": + raise ConfigurationException( + "Invalid 'scanner_signature_sources' configuration: '{}'. " + "Has to be a valid HTTPS-URL or match a predefined " + "constants: 'suss', 'exodus'".format(source_url) + ) + self.sdcs.append(SignatureDataController( + source_url, + '{}_{}'.format(i, os.path.basename(u.path)), + source_url, + )) + def load(self): for sdc in self.sdcs: sdc.load() @@ -697,15 +738,11 @@ def main(): # initialize/load configuration values common.get_config(opts=options) + if options.exodus: + if "exodus" not in common.get_config()['scanner_signature_sources']: + common.get_config()['scanner_signature_sources'].append('exodus') if options.refresh: scanner._get_tool().refresh() - if options.exodus: - c = ExodusSignatureDataController() - if options.refresh: - c.fetch_signatures_from_web() - else: - c.fetch() - scanner._get_tool().add(c) probcount = 0 diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 5f5898cb..49efee00 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -656,6 +656,37 @@ class Test_SignatureDataController(unittest.TestCase): func_fsfw.assert_called_once_with() func_wtc.assert_called_once_with() + def test_load_try_web_when_no_defaults(self): + sdc = fdroidserver.scanner.SignatureDataController( + 'nnn', 'fff.yml', 'https://example.com/test.json' + ) + func_lfc = mock.Mock( + side_effect=fdroidserver.scanner.SignatureDataCacheMissException() + ) + func_lfd = mock.Mock( + side_effect=fdroidserver.scanner.SignatureDataNoDefaultsException() + ) + func_fsfw = mock.Mock() + func_wtc = mock.Mock() + with mock.patch( + 'fdroidserver.scanner.SignatureDataController.load_from_cache', + func_lfc, + ), mock.patch( + 'fdroidserver.scanner.SignatureDataController.load_from_defaults', + func_lfd, + ), mock.patch( + 'fdroidserver.scanner.SignatureDataController.fetch_signatures_from_web', + func_fsfw, + ), mock.patch( + 'fdroidserver.scanner.SignatureDataController.write_to_cache', + func_wtc, + ): + sdc.load() + func_lfc.assert_called_once_with() + func_lfd.assert_called_once_with() + func_fsfw.assert_called_once_with() + func_wtc.assert_called_once_with() + @unittest.skipIf( sys.version_info < (3, 9, 0), "mock_open doesn't allow easy access to written data in older python versions", From 4ce2f291e311ade59b51b257e3fa9f0e34735be7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Sun, 13 Nov 2022 13:09:54 +0100 Subject: [PATCH 0925/2116] remove --exodus cli option from scanner.py --- fdroidserver/scanner.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index e42d8d8c..06fcaf81 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -713,11 +713,6 @@ def main(): ) common.setup_global_opts(parser) parser.add_argument("appid", nargs='*', help=_("application ID with optional versionCode in the form APPID[:VERCODE]")) - parser.add_argument( - "--exodus", - action="store_true", - help="Use tracker scanner from Exodus project (requires internet)", - ) parser.add_argument("-f", "--force", action="store_true", default=False, help=_("Force scan of disabled apps and builds.")) parser.add_argument("--json", action="store_true", default=False, @@ -738,9 +733,6 @@ def main(): # initialize/load configuration values common.get_config(opts=options) - if options.exodus: - if "exodus" not in common.get_config()['scanner_signature_sources']: - common.get_config()['scanner_signature_sources'].append('exodus') if options.refresh: scanner._get_tool().refresh() From d25995c0849846f108bdb39f96f45b340d499532 Mon Sep 17 00:00:00 2001 From: linsui Date: Tue, 15 Nov 2022 18:50:09 +0800 Subject: [PATCH 0926/2116] Set ArchivePolicy based on VercodeOperation/signature --- fdroidserver/update.py | 4 ++++ tests/update.TestCase | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 12c9dfe6..06dd762f 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1862,6 +1862,10 @@ def archive_old_apks(apps, apks, archapks, repodir, archivedir, defaultkeepversi keepversions = int(app['ArchivePolicy'][:-9]) else: keepversions = defaultkeepversions + if app.get('VercodeOperation'): + keepversions *= len(app['VercodeOperation']) + if common.metadata_find_developer_signing_files(appid, app['CurrentVersionCode']): + keepversions *= 2 logging.debug(_("Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}") .format(appid=appid, integer=len(apks), keep=keepversions, arch=len(archapks))) diff --git a/tests/update.TestCase b/tests/update.TestCase index 91428b22..0cac25c7 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1781,6 +1781,27 @@ class UpdateTest(unittest.TestCase): apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False, apps) self.assertEqual([], apks) + def test_archive_old_apks(self): + app = fdroidserver.metadata.App() + app.id = 'test' + app.VercodeOperation = ['%c+1', '%c+2', '%c+3', '%c+4'] + apps = {app.id: app} + with self.assertLogs(level='DEBUG') as cm: + fdroidserver.update.archive_old_apks(apps, [], [], '', '', 3) + self.assertEqual(cm.output, [ + "DEBUG:root:Checking archiving for test - apks:0, keepversions:12, archapks:0" + ]) + + app = fdroidserver.metadata.App() + app.id = 'org.smssecure.smssecure' + app.CurrentVersionCode = 135 + apps = {app.id: app} + with self.assertLogs(level='DEBUG') as cm: + fdroidserver.update.archive_old_apks(apps, [], [], '', '', 3) + self.assertEqual(cm.output, [ + "DEBUG:root:Checking archiving for org.smssecure.smssecure - apks:0, keepversions:6, archapks:0" + ]) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 01f7dfd0b35b61a950ecaceef4a1346996fb424a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 7 Nov 2022 08:09:53 +0100 Subject: [PATCH 0927/2116] index-v2.jar is not a valid file, remove references entry.jar is the signed file, it references index-v2.json. --- fdroidserver/common.py | 1 - fdroidserver/deploy.py | 1 - tests/common.TestCase | 1 - tests/deploy.TestCase | 4 ---- 4 files changed, 7 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 73d899b9..7f12f19e 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3985,7 +3985,6 @@ def is_repo_file(filename, for_gpg_signing=False): b'categories.txt', b'entry.jar', b'index-v1.jar', - b'index-v2.jar', b'index.css', b'index.html', b'index.jar', diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index cecf8c65..1ca90ab4 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -62,7 +62,6 @@ def _get_index_excludes(repo_section): os.path.join(repo_section, 'index-v1.jar'), os.path.join(repo_section, 'index-v1.json'), os.path.join(repo_section, 'index-v1.json.asc'), - os.path.join(repo_section, 'index-v2.jar'), os.path.join(repo_section, 'index-v2.json'), os.path.join(repo_section, 'index-v2.json.asc'), os.path.join(repo_section, 'index.jar'), diff --git a/tests/common.TestCase b/tests/common.TestCase index b36cdcd1..a5d8daf1 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -2470,7 +2470,6 @@ class CommonTest(unittest.TestCase): 'repo/entry.json', 'repo/index-v1.jar', 'repo/index-v1.json', - 'repo/index-v2.jar', 'repo/index-v2.json', 'repo/index.css', 'repo/index.html', diff --git a/tests/deploy.TestCase b/tests/deploy.TestCase index 046dcc2b..70030e4d 100755 --- a/tests/deploy.TestCase +++ b/tests/deploy.TestCase @@ -69,8 +69,6 @@ class DeployTest(unittest.TestCase): '--exclude', 'repo/index-v1.json.asc', '--exclude', - 'repo/index-v2.jar', - '--exclude', 'repo/index-v2.json', '--exclude', 'repo/index-v2.json.asc', @@ -166,8 +164,6 @@ class DeployTest(unittest.TestCase): '--exclude', 'archive/index-v1.json.asc', '--exclude', - 'archive/index-v2.jar', - '--exclude', 'archive/index-v2.json', '--exclude', 'archive/index-v2.json.asc', From c1342ab9d6c3f0fd69d91d8ff9f1e49961811855 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 14 Oct 2022 21:46:50 +0200 Subject: [PATCH 0928/2116] stop pre-installing the ndk --- buildserver/Vagrantfile | 2 +- makebuildserver | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/buildserver/Vagrantfile b/buildserver/Vagrantfile index f5172870..3ba5f2b7 100644 --- a/buildserver/Vagrantfile +++ b/buildserver/Vagrantfile @@ -92,7 +92,7 @@ Vagrant.configure("2") do |config| args: [configfile['debian_mirror']] config.vm.provision "shell", name: "android-sdk", path: "provision-android-sdk" config.vm.provision "shell", name: "android-ndk", path: "provision-android-ndk", - args: ["/opt/android-sdk/ndk", "r23c"] + args: ["/opt/android-sdk/ndk"] config.vm.provision "shell", name: "gradle", path: "provision-gradle" config.vm.provision "shell", name: "disable-analytics", path: "provision-disable-analytics" config.vm.provision "shell", name: "buildserverid", path: "provision-buildserverid", diff --git a/makebuildserver b/makebuildserver index 4a49ce6c..be3ab9bd 100755 --- a/makebuildserver +++ b/makebuildserver @@ -129,8 +129,6 @@ CACHE_FILES = [ '7faa7198769f872826c8ef4f1450f839ec27f0b4d5d1e51bade63667cbccd205'), ('https://services.gradle.org/distributions/gradle-7.0.2-bin.zip', '0e46229820205440b48a5501122002842b82886e76af35f0f3a069243dca4b3c'), - ('https://dl.google.com/android/repository/android-ndk-r23c-linux.zip', - '6ce94604b77d28113ecd588d425363624a5228d9662450c48d2e4053f8039242'), ] From e58637374c9672a266c4db2a58f354035b0d44b0 Mon Sep 17 00:00:00 2001 From: FC Stegerman Date: Thu, 10 Nov 2022 19:16:02 +0100 Subject: [PATCH 0929/2116] verify_deprecated_jar_signature(): use temp dir instead of $PWD/.java.security --- fdroidserver/common.py | 41 ++++++++++++++++++----------------------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 7f12f19e..c882f891 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3445,30 +3445,25 @@ def verify_deprecated_jar_signature(jar): """ error = _('JAR signature failed to verify: {path}').format(path=jar) - _java_security = os.path.join(os.getcwd(), '.java.security') - if os.path.exists(_java_security): - os.remove(_java_security) - with open(_java_security, 'w') as fp: - fp.write('jdk.jar.disabledAlgorithms=MD2, RSA keySize < 1024') - os.chmod(_java_security, 0o400) + with tempfile.TemporaryDirectory() as tmpdir: + java_security = os.path.join(tmpdir, 'java.security') + with open(java_security, 'w') as fp: + fp.write('jdk.jar.disabledAlgorithms=MD2, RSA keySize < 1024') + os.chmod(java_security, 0o400) - try: - cmd = [ - config['jarsigner'], - '-J-Djava.security.properties=' + _java_security, - '-strict', '-verify', jar - ] - output = subprocess.check_output(cmd, stderr=subprocess.STDOUT) - raise VerificationException(error + '\n' + output.decode('utf-8')) - except subprocess.CalledProcessError as e: - if e.returncode == 4: - logging.debug(_('JAR signature verified: {path}').format(path=jar)) - else: - raise VerificationException(error + '\n' + e.output.decode('utf-8')) from e - finally: - if os.path.exists(_java_security): - os.chmod(_java_security, 0o600) - os.remove(_java_security) + try: + cmd = [ + config['jarsigner'], + '-J-Djava.security.properties=' + java_security, + '-strict', '-verify', jar + ] + output = subprocess.check_output(cmd, stderr=subprocess.STDOUT) + raise VerificationException(error + '\n' + output.decode('utf-8')) + except subprocess.CalledProcessError as e: + if e.returncode == 4: + logging.debug(_('JAR signature verified: {path}').format(path=jar)) + else: + raise VerificationException(error + '\n' + e.output.decode('utf-8')) from e def verify_apk_signature(apk, min_sdk_version=None): From 2cbb5576c7404c4447bcb6e843f53fe4be984d8d Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 12 Oct 2022 19:10:50 +0200 Subject: [PATCH 0930/2116] Drop VCS version check on every build This was introduced in https://gitlab.com/fdroid/fdroidserver/-/merge_requests/391 I don't think it is needed anymore. Also log appid:versionCode --- fdroidserver/build.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 726666b3..d724a3c2 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -1111,8 +1111,7 @@ def main(): vcs, build_dir = common.setup_vcs(app) first = False - logging.info("Using %s" % vcs.clientversion()) - logging.debug("Checking " + build.versionName) + logging.debug("Checking %s:%s" % (appid, build.versionCode)) if trybuild(app, build, build_dir, output_dir, log_dir, also_check_dir, srclib_dir, extlib_dir, tmp_dir, repo_dir, vcs, options.test, From 3eea5f7c09f9ce34ee381a9cd05116cb5c53ef97 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 14 Oct 2022 15:13:55 +0200 Subject: [PATCH 0931/2116] Don't get_android_tools_version_log for non builds --- fdroidserver/build.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index d724a3c2..794cbbd9 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -1100,8 +1100,6 @@ def main(): timer = None tools_version_log = '' - if not options.onserver: - tools_version_log = common.get_android_tools_version_log() try: # For the first build of a particular app, we need to set up From a15fc28982ee338cd0b519c6988bbb54b94c6249 Mon Sep 17 00:00:00 2001 From: Adam Novak Date: Mon, 5 Oct 2020 18:06:08 -0700 Subject: [PATCH 0932/2116] Point user to Vagrant log if build server failed to build --- makebuildserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/makebuildserver b/makebuildserver index be3ab9bd..e7c006f1 100755 --- a/makebuildserver +++ b/makebuildserver @@ -337,7 +337,7 @@ def main(): v.up(provision=True) except subprocess.CalledProcessError: debug_log_vagrant_vm(serverdir, config) - logging.error("'vagrant up' failed.") + logging.error("'vagrant up' failed. Consult %s", logfilename) sys.exit(1) if options.copy_caches_from_host: From 553c9aa7e70d13568b45552b1626fc89e475fcd8 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 14 Nov 2022 23:25:21 +0100 Subject: [PATCH 0933/2116] include tests/nightly.TestCase in dist tarball --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index d1535466..048c139e 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -623,6 +623,7 @@ include tests/metadata-rewrite-yml/org.fdroid.fdroid.yml include tests/metadata/souch.smsbypass.yml include tests/metadata.TestCase include tests/minimal_targetsdk_30_unsigned.apk +include tests/nightly.TestCase include tests/Norway_bouvet_europe_2.obf.zip include tests/no_targetsdk_minsdk1_unsigned.apk include tests/no_targetsdk_minsdk30_unsigned.apk From bf945a3062e7e4ab78f389977e03d72ae44be228 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 14 Sep 2022 22:51:31 +0200 Subject: [PATCH 0934/2116] nightly: only write SSH key files if ~/.ssh exists on dev's machine --- fdroidserver/nightly.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 4d0d80ad..bfeca16f 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -430,11 +430,11 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, + '\n -dname "CN=Android Debug,O=Android,C=US"') sys.exit(1) ssh_dir = os.path.join(os.getenv('HOME'), '.ssh') - os.makedirs(os.path.dirname(ssh_dir), exist_ok=True) privkey = _ssh_key_from_debug_keystore(options.keystore) - ssh_private_key_file = os.path.join(ssh_dir, os.path.basename(privkey)) - shutil.move(privkey, ssh_private_key_file) - shutil.move(privkey + '.pub', ssh_private_key_file + '.pub') + if os.path.exists(ssh_dir): + ssh_private_key_file = os.path.join(ssh_dir, os.path.basename(privkey)) + shutil.move(privkey, ssh_private_key_file) + shutil.move(privkey + '.pub', ssh_private_key_file + '.pub') if shutil.rmtree.avoids_symlink_attacks: shutil.rmtree(os.path.dirname(privkey)) From 1c5506ae054b1590cca28e5d6c0c9ad923c3ae22 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 14 Sep 2022 23:48:12 +0200 Subject: [PATCH 0935/2116] nightly: support OpenSSL 3.0 with Paramiko OpenSSL 3.0 changed the default output format from PKCS#1 to PKCS#8, which paramiko does not support. https://www.openssl.org/docs/man3.0/man1/openssl-rsa.html#traditional https://github.com/paramiko/paramiko/issues/1015 --- .gitlab-ci.yml | 1 + MANIFEST.in | 1 + fdroidserver/nightly.py | 20 ++++-- tests/aosp_testkey_debug.keystore | Bin 0 -> 2557 bytes tests/nightly.TestCase | 108 ++++++++++++++++++++++++++++++ 5 files changed, 126 insertions(+), 4 deletions(-) create mode 100644 tests/aosp_testkey_debug.keystore diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 94d49ed2..de48b3c8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -246,6 +246,7 @@ black: tests/lint.TestCase tests/metadata.TestCase tests/ndk-release-checksums.py + tests/nightly.TestCase tests/rewritemeta.TestCase tests/scanner.TestCase tests/signindex.TestCase diff --git a/MANIFEST.in b/MANIFEST.in index 048c139e..87af42b9 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -42,6 +42,7 @@ include locale/zh_Hans/LC_MESSAGES/fdroidserver.po include locale/zh_Hant/LC_MESSAGES/fdroidserver.po include makebuildserver include README.md +include tests/aosp_testkey_debug.keystore include tests/apk.embedded_1.apk include tests/bad-unicode-*.apk include tests/build.TestCase diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index bfeca16f..14db7fbd 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -25,6 +25,7 @@ import os import paramiko import platform import shutil +import ssl import subprocess import sys import tempfile @@ -47,7 +48,11 @@ DISTINGUISHED_NAME = 'CN=Android Debug,O=Android,C=US' NIGHTLY = '-nightly' -def _ssh_key_from_debug_keystore(keystore=KEYSTORE_FILE): +def _ssh_key_from_debug_keystore(keystore=None): + if keystore is None: + # set this here so it can be overridden in the tests + # TODO convert this to a class to get rid of this nonsense + keystore = KEYSTORE_FILE tmp_dir = tempfile.mkdtemp(prefix='.') privkey = os.path.join(tmp_dir, '.privkey') key_pem = os.path.join(tmp_dir, '.key.pem') @@ -94,10 +99,17 @@ def _ssh_key_from_debug_keystore(keystore=KEYSTORE_FILE): ], env={'LC_ALL': 'C.UTF-8'}, ) + + # OpenSSL 3.0 changed the default output format from PKCS#1 to + # PKCS#8, which paramiko does not support. + # https://www.openssl.org/docs/man3.0/man1/openssl-rsa.html#traditional + # https://github.com/paramiko/paramiko/issues/1015 + openssl_rsa_cmd = ['openssl', 'rsa'] + if ssl.OPENSSL_VERSION_INFO[0] >= 3: + openssl_rsa_cmd += ['-traditional'] subprocess.check_call( - [ - 'openssl', - 'rsa', + openssl_rsa_cmd + + [ '-in', key_pem, '-out', diff --git a/tests/aosp_testkey_debug.keystore b/tests/aosp_testkey_debug.keystore new file mode 100644 index 0000000000000000000000000000000000000000..ecbdcb4dc59dfbacd33f24d6f1690900c6ee16b0 GIT binary patch literal 2557 zcmd6o`8(A88pr25Gsf1C21Ajd5n1XxcCr+aeG3nh9D^a-sIg`rYKlB0Tcf6IMGx7F z!r0f;v6X$-NJu1GH6A^ub57TF&L8mna9{Uzzwgfv_vdrH@7IU5%vy#(Ake)4{t8|K z$&Kvi>E=ds3H0zLUfI(_)jo=wK_F}Z7z6(f@*ucm5da*Jf${+W8w4H$UtknmK#bJ! zhV)t`=U>ek<&Q8?=!q``vPP3p5JNv%tF$wt>5xnOR`a^_KV~WK6m~TuG#Wp;KM9vn z<`{Hx!n+xc$i~ov&a2^MYfA z@j`!x<_Pl|kHsos$>-#>(~Qz3Walt&n83262lUZTD6Q)=CO0AI?nJ%w`sCmFgx6Fn zoDj~@>g~l&>i1a@Xn8}r&g3f>Gcwf8h+;HSowZ}RP9r?ztsb}?$P(qvXws`l<0-ik zR>OR}f3oPIG~U~j-XC`DDRFE14e^S~eeOZh&VenbK5C;FshH&-Ieu?mpeWAUbxBg4 zxREfSVljn1INlJ>s~8YFt^#dKDdx#%Ce5st%X8g*ep*po(O_d5m*9!dyumB|+xIbN zw$I^yOOR~m%Bb}y%7Dd{IqU7!N|N)tH})AX4VvqdqzB875fB{GyVAXP9zqZ1y4Xe%)Yo%_^G z35AfH+MPh#hdWXlmV;c|LyHKc$yiSC5tq_4B0_hzjk>MP1e4;j-K{UY#glzA1U*s+`HZe(1zcIxs?Po?p^y^(XQPqh}@4T&ozvun%41?L#58 zpEiT;lZq^_IS$~nwE94Gl@+ZP8?5kj#ml*`0(oM?h?^z{^@aPT8O&%#O(|K&J{#vR zXTUw^%SG0RYbnsIoicF2e7XA)NAK%}IM#07=?H9JlksrGbtvsJObJTjUa2UeK8fnn z97GOLgZ1RZ=s2mYcvjZ=1_9^VImZ)Ytxh!sD6wnc!}h;9d!weayR1a#R_QX`%EZpK zr{4Xv0hI<=GatEl%f(XwL+JeB> zM@jdt>t8zvIz z%r|&d4qg6mZ)bYZx2X$Re5pr|&>2&?eOd8P#^7O`Gp$HyKzo%4i*s9^ZIyMbU-Hkv z&MV7wwANmX{mvGq^Y&`9mRNzn^n7eW>($tLM{G?N2kO!vUcoNcpYK;zvEY}K*AA|d zs)DLj3A_-gR?e0Cz0*HUuXW1@iqUI8a=A1Rqa#KQhUafD;7ye~9cTq?unJDS+Tf!q|BdgK_)! zh`XnAq1aFVi_HI4xc^6i{a29yG5?u?6A(oGr246!`M9f}FL)S@1l2$V1$7XosHmiZ zMPAXp55gn%&s2Q&r%Aa7HI;S+7#*s|qzm#N_)Np0;{ zK8vC=yNHB>_q7GDy!%5)`CR!vOr9EEnzF<0uy*icz4`ZACT`Vptek$P-Rg`-!J+zc z@M%aBT#sQ&7OFP*A}&Dvq?ThTk92O3Dex~uj=lPnmed*8sB5ufqq zYOKAmAy6UdhO(%ixYH>eY&iPG!^;LqvFWJkVt+n!)>e_P#XED;Z(^xC(R02drzbJw zC?-{hMvl;gv&b}2+T`70wXAY6oBPYzJZi&P;}2YqC9XxIKQC-#7;{} z&Y+l&%9a-(T*TRxzz0$~fAo*QDUBe75&eJ9WK%NpC>eiKC&c`+ar=H;1qEjVVF0lE zt3CGiZ_ge8B(x+wVbQYXG@F%B&q!eja6Uc=FO@Hl(^P38!7s2o@*2j8ug{a;Wal9J zU_9S7lg5kT5XLcmIS!Mi$YVdz>oP&ULr>QL0tBQQ3qqXQ*IjK)by}*aA4 Date: Fri, 11 Nov 2022 10:14:39 +0100 Subject: [PATCH 0936/2116] nightly: convert to config.yml --- fdroidserver/nightly.py | 43 ++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 14db7fbd..2ce83557 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -328,28 +328,27 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, with open(ssh_config, 'a') as fp: fp.write('\n\nHost *\n\tIdentityFile %s\n' % ssh_private_key_file) - config = '' - config += "identity_file = '%s'\n" % ssh_private_key_file - config += "repo_name = '%s'\n" % repo_git_base - config += "repo_url = '%s'\n" % repo_url - config += "repo_description = 'Nightly builds from %s'\n" % git_user_email - config += "archive_name = '%s'\n" % (repo_git_base + ' archive') - config += "archive_url = '%s'\n" % (repo_base + '/archive') - config += ( - "archive_description = 'Old nightly builds that have been archived.'\n" - ) - config += "archive_older = %i\n" % options.archive_older - config += "servergitmirrors = '%s'\n" % servergitmirror - config += "keystore = '%s'\n" % KEYSTORE_FILE - config += "repo_keyalias = '%s'\n" % KEY_ALIAS - config += "keystorepass = '%s'\n" % PASSWORD - config += "keypass = '%s'\n" % PASSWORD - config += "keydname = '%s'\n" % DISTINGUISHED_NAME - config += "make_current_version_link = False\n" - config += "update_stats = True\n" - with open('config.py', 'w') as fp: - fp.write(config) - os.chmod('config.py', 0o600) + config = { + 'identity_file': ssh_private_key_file, + 'repo_name': repo_git_base, + 'repo_url': repo_url, + 'repo_description': 'Nightly builds from %s' % git_user_email, + 'archive_name': repo_git_base + ' archive', + 'archive_url': repo_base + '/archive', + 'archive_description': 'Old nightly builds that have been archived.', + 'archive_older': options.archive_older, + 'servergitmirrors': servergitmirror, + 'keystore': KEYSTORE_FILE, + 'repo_keyalias': KEY_ALIAS, + 'keystorepass': PASSWORD, + 'keypass': PASSWORD, + 'keydname': DISTINGUISHED_NAME, + 'make_current_version_link': False, + 'update_stats': True, + } + with open('config.yml', 'w') as fp: + yaml.dump(config, fp, default_flow_style=False) + os.chmod('config.yml', 0o600) config = common.read_config(options) common.assert_config_keystore(config) From 15bd7057f0a2037ef434325c952a3dcc66ffe0f7 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 14 Nov 2022 23:25:21 +0100 Subject: [PATCH 0937/2116] nightly: add tests --- .gitlab-ci.yml | 1 + fdroidserver/nightly.py | 8 +- tests/nightly.TestCase | 172 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 178 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index de48b3c8..20a82096 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -153,6 +153,7 @@ ubuntu_jammy_pip: - $pip install dist/fdroidserver-*.tar.gz - tar xzf dist/fdroidserver-*.tar.gz - cd fdroidserver-* + - export PATH=$PATH:$ANDROID_HOME/build-tools/33.0.0 - fdroid=`which fdroid` ./tests/run-tests diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 2ce83557..d1f69e40 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -48,6 +48,11 @@ DISTINGUISHED_NAME = 'CN=Android Debug,O=Android,C=US' NIGHTLY = '-nightly' +def _get_keystore_secret_var(keystore): + with open(keystore, 'rb') as fp: + return base64.standard_b64encode(fp.read()).decode('ascii') + + def _ssh_key_from_debug_keystore(keystore=None): if keystore is None: # set this here so it can be overridden in the tests @@ -450,8 +455,7 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, shutil.rmtree(os.path.dirname(privkey)) if options.show_secret_var: - with open(options.keystore, 'rb') as fp: - debug_keystore = base64.standard_b64encode(fp.read()).decode('ascii') + debug_keystore = _get_keystore_secret_var(options.keystore) print( _('\n{path} encoded for the DEBUG_KEYSTORE secret variable:').format( path=options.keystore diff --git a/tests/nightly.TestCase b/tests/nightly.TestCase index c5fbf0cd..ab854faf 100755 --- a/tests/nightly.TestCase +++ b/tests/nightly.TestCase @@ -6,10 +6,12 @@ import optparse import os import requests import shutil +import subprocess import sys import tempfile import time import unittest +import yaml from pathlib import Path from unittest.mock import patch @@ -21,9 +23,15 @@ print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) -from fdroidserver import common, nightly +from fdroidserver import common, index, nightly +DEBUG_KEYSTORE = '/u3+7QAAAAIAAAABAAAAAQAPYW5kcm9pZGRlYnVna2V5AAABNYhAuskAAAK8MIICuDAOBgorBgEEASoCEQEBBQAEggKkqRnFlhidQmVff83bsAeewXPIsF0jiymzJnvrnUAQtCK0MV9uZonu37Mrj/qKLn56mf6QcvEoKvpCstZxzftgYYpAHWMVLM+hy2Z707QZEHlY7Ukppt8DItj+dXkeqGt7f8KzOb2AQwDbt9lm1fJb+MefLowTaubtvrLMcKIne43CbCu2D8HyN7RPWpEkVetA2Qgr5W4sa3tIUT80afqo9jzwJjKCspuxY9A1M8EIM3/kvyLo2B9r0cuWwRjYZXJ6gmTYI2ARNz0KQnCZUok14NDg+mZTb1B7AzRfb0lfjbA6grbzuAL+WaEpO8/LgGfuOh7QBZBT498TElOaFfQ9toQWA79wAmrQCm4OoFukpPIy2m/l6VjJSmlK5Q+CMOl/Au7OG1sUUCTvPaIr0XKnsiwDJ7a71n9garnPWHkvuWapSRCzCNgaUoGQjB+fTMJFFrwT8P1aLfM6onc3KNrDStoQZuYe5ngCLlNS56bENkVGvJBfdkboxtHZjqDXXON9jWGSOI527J3o2D5sjSVyx3T9XPrsL4TA/nBtdU+c/+M6aoASZR2VymzAKdMrGfj9kE5GXp8vv2vkJj9+OJ4Jm5yeczocc/Idtojjb1yg+sq1yY8kAQxgezpY1rpgi2jF3tSN01c23DNvAaSJLJX2ZuH8sD40ACc80Y1Qp1nUTdpwBZUeaeNruBwx4PHU8GnC71FwtiUpwNs0OoSl0pgDUJ3ODC5bs8B5QmW1wu1eg7I4mMSmCsNGW6VN3sFcu+WEqnmTxPoZombdFZKxsr2oq359Nn4bJ6Uc9PBz/sXsns7Zx1vND/oK/Jv5Y269UVAMeKX/eGpfnxzagW3tqGbOu12C2p9Azo5VxiU2fG/tmk2PjaG5hV/ywReco7I6C1p8OWM2fwAAAAEABVguNTA5AAAB6TCCAeUwggFOoAMCAQICBE89gTUwDQYJKoZIhvcNAQEFBQAwNzELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0FuZHJvaWQxFjAUBgNVBAMTDUFuZHJvaWQgRGVidWcwHhcNMTIwMjE2MjIyMDM3WhcNNDIwMjA4MjIyMDM3WjA3MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHQW5kcm9pZDEWMBQGA1UEAxMNQW5kcm9pZCBEZWJ1ZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3AKU7S7JXhUjEwxWP1/LPHXieh61SaA/+xbpqsPA+yjGz1sAcGAyuG6bjNAVm56pq7nkjJzicX7Wi83nUBo58DEC/quxOLdy0C4PEOSAeTnTT1RJIwMDvOgiL1GFCErvQ7gCH6zuAID/JRFbN6nIkhDjs2DYnSBl7aJJf8wCLc0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQAoq/TJffA0l+ZGf89xndmHdxrO6qi+TzSlByvLZ4eFfCovTh1iO+Edrd5V1yXGLxyyvdsadMAFZT8SaxMrP5xxhJ0nra0APWYLpA96M//auMhQBWPgqPntwgvEZuEH7f0kdItjBJ39yijbG8xfgwid6XqNUo0TDDkp/wNWKpJ9tJe+2PrGw1NAvrgSydoH2j8DI1Eq' +DEBUG_KEYSTORE_KEY_FILE_NAME = ( + 'debug_keystore_QW+xRCJDGHXyyFtgCW8QRajj+6uYmsLwGWpCfYqYQ5M_id_rsa' +) + +AOSP_TESTKEY_DEBUG_KEYSTORE = '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' AOSP_TESTKEY_DEBUG_KEYSTORE_KEY_FILE_NAME = ( 'debug_keystore_k47SVrA85+oMZAexHc62PkgvIgO8TJBYN00U82xSlxc_id_rsa' ) @@ -45,6 +53,8 @@ class NightlyTest(unittest.TestCase): path = os.environ['PATH'] def setUp(self): + common.config = None + nightly.config = None logging.basicConfig(level=logging.WARNING) self.basedir = Path(localmodule) / 'tests' self.testroot = Path(localmodule) / '.testfiles' @@ -69,6 +79,11 @@ class NightlyTest(unittest.TestCase): self.dot_android / 'debug.keystore', ) + def _copy_debug_apk(self): + outputdir = Path('app/build/output/apk/debug') + outputdir.mkdir(parents=True) + shutil.copy(self.basedir / 'urzip.apk', outputdir / 'urzip-debug.apk') + def test_get_repo_base_url(self): for clone_url, repo_git_base, result in [ ( @@ -88,6 +103,14 @@ class NightlyTest(unittest.TestCase): # gitlab.com often returns 403 Forbidden from their cloudflare restrictions self.assertTrue(r.status_code in (200, 403), 'should not be a redirect') + def test_get_keystore_secret_var(self): + self.assertEqual( + AOSP_TESTKEY_DEBUG_KEYSTORE, + nightly._get_keystore_secret_var( + self.basedir / 'aosp_testkey_debug.keystore' + ), + ) + @patch.dict(os.environ, clear=True) def test_ssh_key_from_debug_keystore(self): os.environ['HOME'] = str(self.home) @@ -145,6 +168,153 @@ class NightlyTest(unittest.TestCase): assert (dot_ssh / AOSP_TESTKEY_DEBUG_KEYSTORE_KEY_FILE_NAME).exists() assert (dot_ssh / (AOSP_TESTKEY_DEBUG_KEYSTORE_KEY_FILE_NAME + '.pub')).exists() + def _put_fdroid_in_args(self, args): + """Find fdroid command that belongs to this source code tree""" + fdroid = os.path.join(localmodule, 'fdroid') + if not os.path.exists(fdroid): + fdroid = os.getenv('fdroid') + return [fdroid] + args[1:] + + @patch('sys.argv', ['fdroid nightly', '--verbose']) + @patch('platform.node', lambda: 'example.com') + def test_github_actions(self): + """Careful! If the test env is bad, it'll mess up the local SSH setup + + https://docs.github.com/en/actions/learn-github-actions/environment-variables + + """ + + called = [] + orig_check_call = subprocess.check_call + os.chdir(self.testdir) + os.makedirs('fdroid/git-mirror/fdroid/repo') # fake this to avoid cloning + self._copy_test_debug_keystore() + self._copy_debug_apk() + + def _subprocess_check_call(args, cwd=None, env=None): + if os.path.basename(args[0]) in ('keytool', 'openssl'): + orig_check_call(args, cwd=cwd, env=env) + elif args[:2] == ['fdroid', 'update']: + orig_check_call(self._put_fdroid_in_args(args), cwd=cwd, env=env) + else: + called.append(args[:2]) + return + + with patch.dict( + os.environ, + { + 'CI': 'true', + 'DEBUG_KEYSTORE': DEBUG_KEYSTORE, + 'GITHUB_ACTIONS': 'true', + 'GITHUB_ACTOR': 'username', + 'GITHUB_REPOSITORY': 'f-droid/test', + 'GITHUB_SERVER_URL': 'https://github.com', + 'HOME': str(self.testdir), + 'PATH': os.getenv('PATH'), + 'fdroid': os.getenv('fdroid', ''), + }, + clear=True, + ): + self.assertTrue(self.testroot == Path.home().parent) + with patch('subprocess.check_call', _subprocess_check_call): + nightly.main() + self.assertEqual(called, [['ssh', '-Tvi'], ['fdroid', 'deploy']]) + self.assertFalse(os.path.exists('config.py')) + git_url = 'git@github.com:f-droid/test-nightly' + mirror_url = index.get_mirror_service_urls(git_url)[0] + expected = { + 'archive_description': 'Old nightly builds that have been archived.', + 'archive_name': 'f-droid/test-nightly archive', + 'archive_older': 20, + 'archive_url': mirror_url + '/archive', + 'keydname': 'CN=Android Debug,O=Android,C=US', + 'keypass': 'android', + 'keystore': nightly.KEYSTORE_FILE, + 'keystorepass': 'android', + 'make_current_version_link': False, + 'repo_description': 'Nightly builds from username@example.com', + 'repo_keyalias': 'androiddebugkey', + 'repo_name': 'f-droid/test-nightly', + 'repo_url': mirror_url + '/repo', + 'servergitmirrors': git_url, + 'update_stats': True, + } + with open('config.yml') as fp: + config = yaml.safe_load(fp) + # .ssh is random tmpdir set in nightly.py, so test basename only + self.assertEqual( + os.path.basename(config['identity_file']), + DEBUG_KEYSTORE_KEY_FILE_NAME, + ) + del config['identity_file'] + self.assertEqual(expected, config) + + @patch('sys.argv', ['fdroid nightly', '--verbose']) + def test_gitlab_ci(self): + """Careful! If the test env is bad, it can mess up the local SSH setup""" + called = [] + orig_check_call = subprocess.check_call + os.chdir(self.testdir) + os.makedirs('fdroid/git-mirror/fdroid/repo') # fake this to avoid cloning + self._copy_test_debug_keystore() + self._copy_debug_apk() + + def _subprocess_check_call(args, cwd=None, env=None): + if os.path.basename(args[0]) in ('keytool', 'openssl'): + orig_check_call(args, cwd=cwd, env=env) + elif args[:2] == ['fdroid', 'update']: + orig_check_call(self._put_fdroid_in_args(args), cwd=cwd, env=env) + else: + called.append(args[:2]) + return + + with patch.dict( + os.environ, + { + 'CI': 'true', + 'CI_PROJECT_PATH': 'fdroid/test', + 'CI_PROJECT_URL': 'https://gitlab.com/fdroid/test', + 'DEBUG_KEYSTORE': DEBUG_KEYSTORE, + 'GITLAB_USER_NAME': 'username', + 'GITLAB_USER_EMAIL': 'username@example.com', + 'HOME': str(self.testdir), + 'PATH': os.getenv('PATH'), + 'fdroid': os.getenv('fdroid', ''), + }, + clear=True, + ): + self.assertTrue(self.testroot == Path.home().parent) + with patch('subprocess.check_call', _subprocess_check_call): + nightly.main() + self.assertEqual(called, [['ssh', '-Tvi'], ['fdroid', 'deploy']]) + self.assertFalse(os.path.exists('config.py')) + expected = { + 'archive_description': 'Old nightly builds that have been archived.', + 'archive_name': 'fdroid/test-nightly archive', + 'archive_older': 20, + 'archive_url': 'https://gitlab.com/fdroid/test-nightly/-/raw/master/fdroid/archive', + 'keydname': 'CN=Android Debug,O=Android,C=US', + 'keypass': 'android', + 'keystore': nightly.KEYSTORE_FILE, + 'keystorepass': 'android', + 'make_current_version_link': False, + 'repo_description': 'Nightly builds from username@example.com', + 'repo_keyalias': 'androiddebugkey', + 'repo_name': 'fdroid/test-nightly', + 'repo_url': 'https://gitlab.com/fdroid/test-nightly/-/raw/master/fdroid/repo', + 'servergitmirrors': 'git@gitlab.com:fdroid/test-nightly', + 'update_stats': True, + } + with open('config.yml') as fp: + config = yaml.safe_load(fp) + # .ssh is random tmpdir set in nightly.py, so test basename only + self.assertEqual( + os.path.basename(config['identity_file']), + DEBUG_KEYSTORE_KEY_FILE_NAME, + ) + del config['identity_file'] + self.assertEqual(expected, config) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From c2567d71d16deb2c78278e2b629830fcc4864daf Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 14 Nov 2022 23:13:13 +0100 Subject: [PATCH 0938/2116] nightly: fail if *-nightly git repo is not publicly available --- fdroidserver/common.py | 6 +++--- fdroidserver/nightly.py | 12 +++++++----- tests/nightly.TestCase | 29 ++++++++++++++++++++++++++++- 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index c882f891..5172f233 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2680,9 +2680,9 @@ def get_native_code(apkfile): class PopenResult: - def __init__(self): - self.returncode = None - self.output = None + def __init__(self, returncode=None, output=None): + self.returncode = returncode + self.output = output def SdkToolsPopen(commands, cwd=None, output=True): diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index d1f69e40..8e11fa0b 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -35,7 +35,7 @@ from argparse import ArgumentParser from . import _ from . import common - +from .exception import VCSException # hard coded defaults for Android ~/.android/debug.keystore files # https://developers.google.com/android/guides/client-auth @@ -205,6 +205,7 @@ def main(): ) # TODO add --with-btlog options = parser.parse_args() + common.options = options # force a tighter umask since this writes private key material umask = os.umask(0o077) @@ -284,10 +285,11 @@ def main(): git_mirror_statsdir = os.path.join(git_mirror_path, 'fdroid', 'stats') if not os.path.isdir(git_mirror_repodir): logging.debug(_('cloning {url}').format(url=clone_url)) - try: - git.Repo.clone_from(clone_url, git_mirror_path) - except Exception: - pass + vcs = common.getvcs('git', clone_url, git_mirror_path) + p = vcs.git(['clone', '--', vcs.remote, str(vcs.local)]) + if p.returncode != 0: + print('WARNING: only public git repos are supported!') + raise VCSException('git clone %s failed:' % clone_url, p.output) if not os.path.isdir(git_mirror_repodir): os.makedirs(git_mirror_repodir, mode=0o755) diff --git a/tests/nightly.TestCase b/tests/nightly.TestCase index ab854faf..85a75abd 100755 --- a/tests/nightly.TestCase +++ b/tests/nightly.TestCase @@ -23,7 +23,7 @@ print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) -from fdroidserver import common, index, nightly +from fdroidserver import common, exception, index, nightly DEBUG_KEYSTORE = '/u3+7QAAAAIAAAABAAAAAQAPYW5kcm9pZGRlYnVna2V5AAABNYhAuskAAAK8MIICuDAOBgorBgEEASoCEQEBBQAEggKkqRnFlhidQmVff83bsAeewXPIsF0jiymzJnvrnUAQtCK0MV9uZonu37Mrj/qKLn56mf6QcvEoKvpCstZxzftgYYpAHWMVLM+hy2Z707QZEHlY7Ukppt8DItj+dXkeqGt7f8KzOb2AQwDbt9lm1fJb+MefLowTaubtvrLMcKIne43CbCu2D8HyN7RPWpEkVetA2Qgr5W4sa3tIUT80afqo9jzwJjKCspuxY9A1M8EIM3/kvyLo2B9r0cuWwRjYZXJ6gmTYI2ARNz0KQnCZUok14NDg+mZTb1B7AzRfb0lfjbA6grbzuAL+WaEpO8/LgGfuOh7QBZBT498TElOaFfQ9toQWA79wAmrQCm4OoFukpPIy2m/l6VjJSmlK5Q+CMOl/Au7OG1sUUCTvPaIr0XKnsiwDJ7a71n9garnPWHkvuWapSRCzCNgaUoGQjB+fTMJFFrwT8P1aLfM6onc3KNrDStoQZuYe5ngCLlNS56bENkVGvJBfdkboxtHZjqDXXON9jWGSOI527J3o2D5sjSVyx3T9XPrsL4TA/nBtdU+c/+M6aoASZR2VymzAKdMrGfj9kE5GXp8vv2vkJj9+OJ4Jm5yeczocc/Idtojjb1yg+sq1yY8kAQxgezpY1rpgi2jF3tSN01c23DNvAaSJLJX2ZuH8sD40ACc80Y1Qp1nUTdpwBZUeaeNruBwx4PHU8GnC71FwtiUpwNs0OoSl0pgDUJ3ODC5bs8B5QmW1wu1eg7I4mMSmCsNGW6VN3sFcu+WEqnmTxPoZombdFZKxsr2oq359Nn4bJ6Uc9PBz/sXsns7Zx1vND/oK/Jv5Y269UVAMeKX/eGpfnxzagW3tqGbOu12C2p9Azo5VxiU2fG/tmk2PjaG5hV/ywReco7I6C1p8OWM2fwAAAAEABVguNTA5AAAB6TCCAeUwggFOoAMCAQICBE89gTUwDQYJKoZIhvcNAQEFBQAwNzELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0FuZHJvaWQxFjAUBgNVBAMTDUFuZHJvaWQgRGVidWcwHhcNMTIwMjE2MjIyMDM3WhcNNDIwMjA4MjIyMDM3WjA3MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHQW5kcm9pZDEWMBQGA1UEAxMNQW5kcm9pZCBEZWJ1ZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3AKU7S7JXhUjEwxWP1/LPHXieh61SaA/+xbpqsPA+yjGz1sAcGAyuG6bjNAVm56pq7nkjJzicX7Wi83nUBo58DEC/quxOLdy0C4PEOSAeTnTT1RJIwMDvOgiL1GFCErvQ7gCH6zuAID/JRFbN6nIkhDjs2DYnSBl7aJJf8wCLc0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQAoq/TJffA0l+ZGf89xndmHdxrO6qi+TzSlByvLZ4eFfCovTh1iO+Edrd5V1yXGLxyyvdsadMAFZT8SaxMrP5xxhJ0nra0APWYLpA96M//auMhQBWPgqPntwgvEZuEH7f0kdItjBJ39yijbG8xfgwid6XqNUo0TDDkp/wNWKpJ9tJe+2PrGw1NAvrgSydoH2j8DI1Eq' @@ -168,6 +168,33 @@ class NightlyTest(unittest.TestCase): assert (dot_ssh / AOSP_TESTKEY_DEBUG_KEYSTORE_KEY_FILE_NAME).exists() assert (dot_ssh / (AOSP_TESTKEY_DEBUG_KEYSTORE_KEY_FILE_NAME + '.pub')).exists() + @patch('fdroidserver.common.vcs_git.git', lambda args, e: common.PopenResult(1)) + @patch('sys.argv', ['fdroid nightly', '--verbose']) + def test_private_or_non_existent_git_mirror(self): + """Test that this exits with an error when the git mirror repo won't work + + Careful! If the test environment is setup wrong, it can mess + up local files in ~/.ssh or ~/.android. + + """ + os.chdir(self.testdir) + with patch.dict( + os.environ, + { + 'CI': 'true', + 'CI_PROJECT_PATH': 'thisshouldneverexist/orthistoo', + 'CI_PROJECT_URL': 'https://gitlab.com/thisshouldneverexist/orthistoo', + 'DEBUG_KEYSTORE': DEBUG_KEYSTORE, + 'GITLAB_USER_NAME': 'username', + 'GITLAB_USER_EMAIL': 'username@example.com', + 'HOME': str(self.testdir), + 'PATH': os.getenv('PATH'), + }, + clear=True, + ): + with self.assertRaises(exception.VCSException): + nightly.main() + def _put_fdroid_in_args(self, args): """Find fdroid command that belongs to this source code tree""" fdroid = os.path.join(localmodule, 'fdroid') From 83335437b9ed7eb6548c7c25c3d3e5faf677b957 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 15 Nov 2022 11:10:50 +0100 Subject: [PATCH 0939/2116] nightly: if repo is too large, set archive_older to 3 If the user has not manually set --archive-older, then this will auto-switch it from 20 to 3 to shrink the repo down so it fits into GitLab Pages. --- fdroidserver/nightly.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 8e11fa0b..045f5496 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -197,10 +197,11 @@ def main(): default=False, help=_("Don't use rsync checksums"), ) + archive_older_unset = -1 parser.add_argument( "--archive-older", type=int, - default=20, + default=archive_older_unset, help=_("Set maximum releases in repo before older ones are archived"), ) # TODO add --with-btlog @@ -280,9 +281,10 @@ def main(): repo_url = repo_base + '/repo' git_mirror_path = os.path.join(repo_basedir, 'git-mirror') - git_mirror_repodir = os.path.join(git_mirror_path, 'fdroid', 'repo') - git_mirror_metadatadir = os.path.join(git_mirror_path, 'fdroid', 'metadata') - git_mirror_statsdir = os.path.join(git_mirror_path, 'fdroid', 'stats') + git_mirror_fdroiddir = os.path.join(git_mirror_path, 'fdroid') + git_mirror_repodir = os.path.join(git_mirror_fdroiddir, 'repo') + git_mirror_metadatadir = os.path.join(git_mirror_fdroiddir, 'metadata') + git_mirror_statsdir = os.path.join(git_mirror_fdroiddir, 'stats') if not os.path.isdir(git_mirror_repodir): logging.debug(_('cloning {url}').format(url=clone_url)) vcs = common.getvcs('git', clone_url, git_mirror_path) @@ -335,6 +337,19 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, with open(ssh_config, 'a') as fp: fp.write('\n\nHost *\n\tIdentityFile %s\n' % ssh_private_key_file) + if options.archive_older == archive_older_unset: + fdroid_size = common.get_dir_size(git_mirror_fdroiddir) + max_size = common.GITLAB_COM_PAGES_MAX_SIZE + if fdroid_size < max_size: + options.archive_older = 20 + else: + options.archive_older = 3 + print( + 'WARNING: repo is %s over the GitLab Pages limit (%s)' + % (fdroid_size - max_size, max_size) + ) + print('Setting --archive-older to 3') + config = { 'identity_file': ssh_private_key_file, 'repo_name': repo_git_base, From f24613b70170036ae09d2b7d19a07a8dbef8e2bc Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 15 Nov 2022 11:25:28 +0100 Subject: [PATCH 0940/2116] index: fix git-mirror size check for GitLab Pages The test case had the wrong folder setup, this was confirmed on a production repo setup. --- fdroidserver/index.py | 3 ++- tests/index.TestCase | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index c788509d..500c2e9e 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -1438,7 +1438,8 @@ def get_mirror_service_urls(url): segments.extend([branch, folder]) urls.append('/'.join(segments)) elif hostname == "gitlab.com": - if common.get_dir_size(folder) <= common.GITLAB_COM_PAGES_MAX_SIZE: + git_mirror_path = os.path.join('git-mirror', folder) + if common.get_dir_size(git_mirror_path) <= common.GITLAB_COM_PAGES_MAX_SIZE: # Gitlab-like Pages segments "https://user.gitlab.io/repo/folder" gitlab_pages = ["https:", "", user + ".gitlab.io", repo, folder] urls.append('/'.join(gitlab_pages)) diff --git a/tests/index.TestCase b/tests/index.TestCase index b04d81c0..6e63ffcf 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -416,8 +416,9 @@ class IndexTest(unittest.TestCase): def test_gitlab_get_mirror_service_urls(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): - os.mkdir('fdroid') - with Path('fdroid/placeholder').open('w') as fp: + git_mirror_path = Path('git-mirror/fdroid') + git_mirror_path.mkdir(parents=True) + with (git_mirror_path / 'placeholder').open('w') as fp: fp.write(' ') for url in [ 'git@gitlab.com:group/project', From cdce0958f8caed7011c5c2815b7de5b33d255956 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 15 Nov 2022 12:39:25 +0100 Subject: [PATCH 0941/2116] deploy: convert .gitlab-ci.yml generation to dict + yaml.dump() --- fdroidserver/deploy.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 1ca90ab4..e9b30ac6 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -25,6 +25,7 @@ import re import subprocess import time import urllib +import yaml from argparse import ArgumentParser import logging import shutil @@ -445,16 +446,21 @@ def update_servergitmirrors(servergitmirrors, repo_section): continue if remote.name == 'gitlab': logging.debug('Writing .gitlab-ci.yml to deploy to GitLab Pages') - with open(os.path.join(git_mirror_path, ".gitlab-ci.yml"), "wt") as out_file: - out_file.write("""pages: - script: - - mkdir .public - - cp -r * .public/ - - mv .public public - artifacts: - paths: - - public -""") + with open(os.path.join(git_mirror_path, ".gitlab-ci.yml"), "wt") as fp: + yaml.dump( + { + 'pages': { + 'script': [ + 'mkdir .public', + 'cp -r * .public/', + 'mv .public public', + ], + 'artifacts': {'paths': ['public']}, + } + }, + fp, + default_flow_style=False, + ) repo.git.add(all=True) repo.index.commit("fdroidserver git-mirror: Deploy to GitLab Pages") From d0976a3684fcd66a18341ba268fdda1d86b540e9 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 15 Nov 2022 12:10:27 +0100 Subject: [PATCH 0942/2116] deploy: check repo size before enabling GitLab Pages --- fdroidserver/deploy.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index e9b30ac6..69d09784 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -377,7 +377,8 @@ def update_servergitmirrors(servergitmirrors, repo_section): if repo_section == 'repo': git_mirror_path = 'git-mirror' dotgit = os.path.join(git_mirror_path, '.git') - git_repodir = os.path.join(git_mirror_path, 'fdroid', repo_section) + git_fdroiddir = os.path.join(git_mirror_path, 'fdroid') + git_repodir = os.path.join(git_fdroiddir, repo_section) if not os.path.isdir(git_repodir): os.makedirs(git_repodir) # github/gitlab use bare git repos, so only count the .git folder @@ -439,6 +440,18 @@ def update_servergitmirrors(servergitmirrors, repo_section): else: progress = None + # only deploy to GitLab Artifacts if too big for GitLab Pages + if common.get_dir_size(git_fdroiddir) <= common.GITLAB_COM_PAGES_MAX_SIZE: + gitlab_ci_job_name = 'pages' + else: + gitlab_ci_job_name = 'GitLab Artifacts' + logging.warning( + _( + 'Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!' + ) + % (common.GITLAB_COM_PAGES_MAX_SIZE / 1000000000) + ) + # push for every remote. This will overwrite the git history for remote in repo.remotes: if remote.name not in enabled_remotes: @@ -449,7 +462,7 @@ def update_servergitmirrors(servergitmirrors, repo_section): with open(os.path.join(git_mirror_path, ".gitlab-ci.yml"), "wt") as fp: yaml.dump( { - 'pages': { + gitlab_ci_job_name: { 'script': [ 'mkdir .public', 'cp -r * .public/', From 947d94e0a9f7f42977beb42d76a73b6d83a6ef46 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 15 Nov 2022 14:37:08 +0100 Subject: [PATCH 0943/2116] deploy: support GitLab Job Artifacts as a mirror --- fdroidserver/index.py | 20 ++++++++++++++++++++ tests/index.TestCase | 34 +++++++++++++++++++++++++++------- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 500c2e9e..59610d53 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -1453,6 +1453,26 @@ def get_mirror_service_urls(url): # GitLab Raw "https://gitlab.com/user/repo/-/raw/branch/folder" gitlab_raw = segments + ['-', 'raw', branch, folder] urls.append('/'.join(gitlab_raw)) + # GitLab Artifacts "https://user.gitlab.io/-/repo/-/jobs/job_id/artifacts/public/folder" + job_id = os.getenv('CI_JOB_ID') + try: + int(job_id) + gitlab_artifacts = [ + "https:", + "", + user + ".gitlab.io", + '-', + repo, + '-', + 'jobs', + job_id, + 'artifacts', + 'public', + folder, + ] + urls.append('/'.join(gitlab_artifacts)) + except (TypeError, ValueError): + pass # no Job ID to use, ignore return urls diff --git a/tests/index.TestCase b/tests/index.TestCase index 6e63ffcf..1c8e9854 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -414,10 +414,16 @@ class IndexTest(unittest.TestCase): fdroidserver.index.get_mirror_service_urls(url), ) + @patch.dict(os.environ, clear=True) def test_gitlab_get_mirror_service_urls(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): git_mirror_path = Path('git-mirror/fdroid') git_mirror_path.mkdir(parents=True) + ci_job_id = '12345678' + artifacts_url = ( + 'https://group.gitlab.io/-/project/-/jobs/%s/artifacts/public/fdroid' + % ci_job_id + ) with (git_mirror_path / 'placeholder').open('w') as fp: fp.write(' ') for url in [ @@ -427,20 +433,34 @@ class IndexTest(unittest.TestCase): 'https://gitlab.com/group/project.git', ]: with patch('fdroidserver.common.GITLAB_COM_PAGES_MAX_SIZE', 1000): + expected = [ + 'https://group.gitlab.io/project/fdroid', + 'https://gitlab.com/group/project/-/raw/master/fdroid', + ] self.assertEqual( - [ - 'https://group.gitlab.io/project/fdroid', - 'https://gitlab.com/group/project/-/raw/master/fdroid', - ], + expected, fdroidserver.index.get_mirror_service_urls(url), ) + with patch.dict(os.environ, clear=True): + os.environ['CI_JOB_ID'] = ci_job_id + self.assertEqual( + expected + [artifacts_url], + fdroidserver.index.get_mirror_service_urls(url), + ) with patch('fdroidserver.common.GITLAB_COM_PAGES_MAX_SIZE', 10): + expected = [ + 'https://gitlab.com/group/project/-/raw/master/fdroid', + ] self.assertEqual( - [ - 'https://gitlab.com/group/project/-/raw/master/fdroid', - ], + expected, fdroidserver.index.get_mirror_service_urls(url), ) + with patch.dict(os.environ, clear=True): + os.environ['CI_JOB_ID'] = ci_job_id + self.assertEqual( + expected + [artifacts_url], + fdroidserver.index.get_mirror_service_urls(url), + ) def test_make_website(self): tmptestsdir = tempfile.mkdtemp( From 1a30766c24caef4873329beddbd783fb84d29754 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 15 Nov 2022 14:50:23 +0100 Subject: [PATCH 0944/2116] deploy: GIT_DEPTH=1 so GitLab Pages job runs as quick as possible * https://docs.gitlab.com/ee/ci/large_repositories/index.html#shallow-cloning --- fdroidserver/deploy.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 69d09784..13a8982b 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -469,6 +469,7 @@ def update_servergitmirrors(servergitmirrors, repo_section): 'mv .public public', ], 'artifacts': {'paths': ['public']}, + 'variables': {'GIT_DEPTH': 1}, } }, fp, From 09b0405eb01b39e7c293d5fc36384873ce762eef Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 14 Sep 2022 23:48:12 +0200 Subject: [PATCH 0945/2116] gitlab-ci: apksigner from current build-tools in ubuntu_jammy_pip --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 20a82096..8c21edf2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -148,7 +148,7 @@ ubuntu_jammy_pip: # back to bare machine to act as user's install machine - export ANDROID_HOME=/opt/android-sdk - $pip install sdkmanager - - sdkmanager 'build-tools;30.0.0' + - sdkmanager 'build-tools;33.0.0' - $pip install dist/fdroidserver-*.tar.gz - tar xzf dist/fdroidserver-*.tar.gz From 1015225a00b37f6b2322a6ad0450079178c03d17 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 24 Oct 2022 12:02:33 +0200 Subject: [PATCH 0946/2116] Add plugin to cleanup app VCSs --- examples/fdroid_clean_repos.py | 39 ++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 examples/fdroid_clean_repos.py diff --git a/examples/fdroid_clean_repos.py b/examples/fdroid_clean_repos.py new file mode 100644 index 00000000..e3fb2fa4 --- /dev/null +++ b/examples/fdroid_clean_repos.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 +# +# an fdroid plugin for resetting app VCSs to the latest version for the metadata + +import argparse +import logging + +from fdroidserver import _, common, metadata + +from fdserver.exeption import VCSException + +fdroid_summary = 'reset app VCSs to the latest version' + + +def main(): + parser = argparse.ArgumentParser(usage="%(prog)s [options] [APPID[:VERCODE] [APPID[:VERCODE] ...]]") + common.setup_global_opts(parser) + parser.add_argument("appid", nargs='*', help=_("applicationId with optional versionCode in the form APPID[:VERCODE]")) + metadata.add_metadata_arguments(parser) + options = parser.parse_args() + common.options = options + pkgs = common.read_pkg_args(options.appid, True) + allapps = metadata.read_metadata(pkgs) + apps = common.read_app_args(options.appid, allapps, True) + common.read_config(options) + + for appid, app in apps.items(): + if "Builds" in app and len(app["Builds"]) > 0: + logging.info(_("Cleaning up '{appid}' VCS").format(appid=appid)) + try: + vcs, build_dir = common.setup_vcs(app) + vcs.gotorevision(app["Builds"][-1].commit) + + except VCSException: + pass + + +if __name__ == "__main__": + main() From 052c7530756bc49791fbce49b983256b3057b74a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 22 Nov 2022 20:43:19 +0100 Subject: [PATCH 0947/2116] examples/fdroid_clean_repos.py: black code format !1227 --- .gitlab-ci.yml | 1 + examples/fdroid_clean_repos.py | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8c21edf2..353aa2ed 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -223,6 +223,7 @@ black: script: - pip install black - black --check --diff --color + examples/fdroid_clean_repos.py examples/fdroid_extract_repo_pubkey.py fdroid fdroidserver/btlog.py diff --git a/examples/fdroid_clean_repos.py b/examples/fdroid_clean_repos.py index e3fb2fa4..4c5b23a6 100644 --- a/examples/fdroid_clean_repos.py +++ b/examples/fdroid_clean_repos.py @@ -13,9 +13,15 @@ fdroid_summary = 'reset app VCSs to the latest version' def main(): - parser = argparse.ArgumentParser(usage="%(prog)s [options] [APPID[:VERCODE] [APPID[:VERCODE] ...]]") + parser = argparse.ArgumentParser( + usage="%(prog)s [options] [APPID[:VERCODE] [APPID[:VERCODE] ...]]" + ) common.setup_global_opts(parser) - parser.add_argument("appid", nargs='*', help=_("applicationId with optional versionCode in the form APPID[:VERCODE]")) + parser.add_argument( + "appid", + nargs='*', + help=_("applicationId with optional versionCode in the form APPID[:VERCODE]"), + ) metadata.add_metadata_arguments(parser) options = parser.parse_args() common.options = options From e70ef18d529227830942490dd55ae64a8cf86181 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 22 Nov 2022 20:46:56 +0100 Subject: [PATCH 0948/2116] examples/fdroid_clean_repos.py: fix typo !1227 --- examples/fdroid_clean_repos.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/fdroid_clean_repos.py b/examples/fdroid_clean_repos.py index 4c5b23a6..252f57ba 100644 --- a/examples/fdroid_clean_repos.py +++ b/examples/fdroid_clean_repos.py @@ -7,7 +7,7 @@ import logging from fdroidserver import _, common, metadata -from fdserver.exeption import VCSException +from fdroidserver.exception import VCSException fdroid_summary = 'reset app VCSs to the latest version' From e6bf930fd4dde258bb47f09a939939daba1306c5 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Mon, 28 Nov 2022 10:13:18 +0000 Subject: [PATCH 0949/2116] gradle 7.6 --- gradlew-fdroid | 1 + 1 file changed, 1 insertion(+) diff --git a/gradlew-fdroid b/gradlew-fdroid index 6ed7fba7..08389f90 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -181,6 +181,7 @@ get_sha() { '7.4.2') echo '29e49b10984e585d8118b7d0bc452f944e386458df27371b49b4ac1dec4b7fda' ;; '7.5') echo 'cb87f222c5585bd46838ad4db78463a5c5f3d336e5e2b98dc7c0c586527351c2' ;; '7.5.1') echo 'f6b8596b10cce501591e92f229816aa4046424f3b24d771751b06779d58c8ec4' ;; + '7.6') echo '7ba68c54029790ab444b39d7e293d3236b2632631fb5f2e012bb28b4ff669e4b' ;; *) exit 1 esac } From 4574728bb4fcdb739cd6e1bbc629f6039a365e2d Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Mon, 28 Nov 2022 13:20:41 +0000 Subject: [PATCH 0950/2116] gradle v7.6 --- gradlew-fdroid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 08389f90..e48105ab 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -181,7 +181,7 @@ get_sha() { '7.4.2') echo '29e49b10984e585d8118b7d0bc452f944e386458df27371b49b4ac1dec4b7fda' ;; '7.5') echo 'cb87f222c5585bd46838ad4db78463a5c5f3d336e5e2b98dc7c0c586527351c2' ;; '7.5.1') echo 'f6b8596b10cce501591e92f229816aa4046424f3b24d771751b06779d58c8ec4' ;; - '7.6') echo '7ba68c54029790ab444b39d7e293d3236b2632631fb5f2e012bb28b4ff669e4b' ;; + '7.6') echo '7ba68c54029790ab444b39d7e293d3236b2632631fb5f2e012bb28b4ff669e4b' ;; *) exit 1 esac } @@ -202,7 +202,7 @@ d_plugin_k=(8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2. d_plugin_v=(8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 46e5fa37140d75d5b9de25c031abcd97a490ac7f Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 24 Nov 2022 20:50:39 +0100 Subject: [PATCH 0951/2116] clean_repos plugin: also clean submodules --- examples/fdroid_clean_repos.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/examples/fdroid_clean_repos.py b/examples/fdroid_clean_repos.py index 252f57ba..aa535fc4 100644 --- a/examples/fdroid_clean_repos.py +++ b/examples/fdroid_clean_repos.py @@ -32,10 +32,13 @@ def main(): for appid, app in apps.items(): if "Builds" in app and len(app["Builds"]) > 0: + build = app.get('Builds')[-1] logging.info(_("Cleaning up '{appid}' VCS").format(appid=appid)) try: vcs, build_dir = common.setup_vcs(app) - vcs.gotorevision(app["Builds"][-1].commit) + vcs.gotorevision(build.commit) + if build.submodules: + vcs.initsubmodules() except VCSException: pass From c81ad4485cf482fe628a9234af03d2559da9a1cf Mon Sep 17 00:00:00 2001 From: FC Stegerman Date: Sat, 19 Nov 2022 19:56:16 +0100 Subject: [PATCH 0952/2116] verify_apks(): compare to unsigned APK if copying fails --- fdroidserver/common.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 5172f233..d61befb5 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3403,15 +3403,21 @@ def verify_apks(signed_apk, unsigned_apk, tmp_dir, v1_only=None): apksigcopier.do_copy(signed_apk, unsigned_apk, tmp_apk, v1_only=v1_only) except apksigcopier.APKSigCopierError as e: logging.info('...NOT verified - {0}'.format(tmp_apk)) - return 'signature copying failed: {}'.format(str(e)) + error = 'signature copying failed: {}'.format(str(e)) + result = compare_apks(signed_apk, unsigned_apk, tmp_dir, + os.path.dirname(unsigned_apk)) + if result is not None: + error += '\nComparing reference APK to unsigned APK...\n' + result + return error if not verify_apk_signature(tmp_apk): logging.info('...NOT verified - {0}'.format(tmp_apk)) + error = 'verification of APK with copied signature failed' result = compare_apks(signed_apk, tmp_apk, tmp_dir, os.path.dirname(unsigned_apk)) if result is not None: - return result - return 'verification of APK with copied signature failed' + error += '\nComparing reference APK to APK with copied signature...\n' + result + return error logging.info('...successfully verified') return None From a739a262f2841b1c965c9bdf09201e3d36258121 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 6 Dec 2022 10:06:47 +0100 Subject: [PATCH 0953/2116] checkupdates: Block one more openjdk-11 See: https://gitlab.com/fdroid/fdroiddata/-/commit/e397da79620d0c37b04090d0e3c73efb665968de#note_1197704481 --- fdroidserver/checkupdates.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 7215c64e..e1de08f6 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -524,6 +524,7 @@ def checkupdates_app(app): bullseye_blocklist = [ 'apt-get install -y openjdk-11-jdk', + 'apt-get install openjdk-11-jdk-headless', 'apt-get install -y openjdk-11-jdk-headless', 'apt-get install -t stretch-backports openjdk-11-jdk-headless openjdk-11-jre-headless', 'apt-get install -y -t stretch-backports openjdk-11-jdk-headless openjdk-11-jre-headless', From cefcf432c308e74cf3f03e6a4f057d8bd6a1dfc8 Mon Sep 17 00:00:00 2001 From: FC Stegerman Date: Wed, 7 Dec 2022 03:37:55 +0100 Subject: [PATCH 0954/2116] checkupdates: only use bullseye_blocklist when openjdk-11 is mentioned --- fdroidserver/checkupdates.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index e1de08f6..9b18538b 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -533,7 +533,8 @@ def checkupdates_app(app): for build in newbuilds: if "sudo" in build: - build["sudo"] = [line for line in build["sudo"] if line not in bullseye_blocklist] + if any("openjdk-11" in line for line in build["sudo"]): + build["sudo"] = [line for line in build["sudo"] if line not in bullseye_blocklist] if build["sudo"] == ['apt-get update']: build["sudo"] = '' From 37dd416aeb217d8520ef5e5227723d8393ba868b Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 3 Jan 2023 15:17:00 +0100 Subject: [PATCH 0955/2116] CI: Use Debian packages for documenation build --- .gitlab-ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 353aa2ed..5575ebfc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -482,16 +482,16 @@ servergitmirrors: - diff repo/index-v1.jar index-v1.jar Build documentation: - image: debian:bullseye + image: debian:bullseye-backports <<: *apt-template script: - - apt-get install python3-pip make - - pip install .[docs] + - apt-get install make python3-sphinx python3-numpydoc python3-pydata-sphinx-theme pydocstyle fdroidserver + - apt purge fdroidserver - pydocstyle fdroidserver - cd docs - sphinx-apidoc -o ./source ../fdroidserver -M -e - - sphinx-autogen -o generated source/*.rst - - make html + - PYTHONPATH=.. sphinx-autogen -o generated source/*.rst + - PYTHONPATH=.. make html artifacts: paths: - docs/build/html/ From fc8820ff8ebcec49afeec4b61f21a2b0eaa2cf8f Mon Sep 17 00:00:00 2001 From: FC Stegerman Date: Tue, 10 Jan 2023 19:40:52 +0100 Subject: [PATCH 0956/2116] index.make_v0: ensure name is a str --- fdroidserver/index.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 59610d53..7c079993 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -1300,7 +1300,7 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing name = app.get('localized', {}).get('en-US', {}).get('name') if not name: name = app.id - sanitized_name = re.sub(b'''[ '"&%?+=/]''', b'', name.encode('utf-8')) + sanitized_name = re.sub(b'''[ '"&%?+=/]''', b'', str(name).encode('utf-8')) apklinkname = sanitized_name + os.path.splitext(current_version_file)[1].encode('utf-8') current_version_path = os.path.join(repodir, current_version_file).encode('utf-8', 'surrogateescape') if os.path.islink(apklinkname): From 671a264dfe3a007352f0746c7839f67804956493 Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Wed, 29 Dec 2021 12:07:45 +0100 Subject: [PATCH 0957/2116] Use ruamel.yaml in metadata.py and metadata.TestCase This is to read metadata based on YAML 1.2 rather than 1.1. --- fdroidserver/metadata.py | 23 ++-- tests/metadata.TestCase | 11 +- tests/metadata/org.videolan.vlc.yml | 156 ++++++++-------------------- 3 files changed, 60 insertions(+), 130 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 64122b62..296310aa 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -23,14 +23,11 @@ from pathlib import Path import platform import re import logging -import yaml -try: - from yaml import CSafeLoader as SafeLoader -except ImportError: - from yaml import SafeLoader import importlib from collections import OrderedDict +from ruamel.yaml import YAML, YAMLError + from . import common from . import _ from .exception import MetaDataException, FDroidException @@ -483,18 +480,19 @@ def parse_yaml_srclib(metadatapath): with metadatapath.open("r", encoding="utf-8") as f: try: - data = yaml.load(f, Loader=SafeLoader) + yaml = YAML(typ='safe') + data = yaml.load(f) if type(data) is not dict: if platform.system() == 'Windows': # Handle symlink on Windows symlink = metadatapath.parent / metadatapath.read_text(encoding='utf-8') if symlink.is_file(): with symlink.open("r", encoding="utf-8") as s: - data = yaml.load(s, Loader=SafeLoader) + data = yaml.load(s) if type(data) is not dict: - raise yaml.error.YAMLError(_('{file} is blank or corrupt!') - .format(file=metadatapath)) - except yaml.error.YAMLError as e: + raise YAMLError(_('{file} is blank or corrupt!') + .format(file=metadatapath)) + except YAMLError as e: _warn_or_exception(_("Invalid srclib metadata: could not " "parse '{file}'") .format(file=metadatapath) + '\n' @@ -797,8 +795,9 @@ def parse_yaml_metadata(mf, app): """ try: - yamldata = yaml.load(mf, Loader=SafeLoader) - except yaml.YAMLError as e: + yaml = YAML(typ='safe') + yamldata = yaml.load(mf) + except YAMLError as e: _warn_or_exception(_("could not parse '{path}'") .format(path=mf.name) + '\n' + common.run_yamllint(mf.name, indent=4), diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index ef018b99..ccc76a32 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -15,14 +15,11 @@ from collections import OrderedDict from pathlib import Path -import yaml from testcommon import TmpCwd +from ruamel.yaml import YAML -try: - from yaml import CSafeLoader as SafeLoader -except ImportError: - from yaml import SafeLoader +yaml = YAML(typ='safe') localmodule = Path(__file__).resolve().parent.parent print('localmodule: ' + str(localmodule)) @@ -173,7 +170,7 @@ class MetadataTest(unittest.TestCase): def test_valid_funding_yml_regex(self): """Check the regex can find all the cases""" with (self.basedir / 'funding-usernames.yaml').open() as fp: - data = yaml.load(fp, Loader=SafeLoader) + data = yaml.load(fp) for k, entries in data.items(): for entry in entries: @@ -212,7 +209,7 @@ class MetadataTest(unittest.TestCase): frommeta = dict(apps[appid]) self.assertTrue(appid in apps) with savepath.open('r') as f: - from_yaml = yaml.load(f, Loader=SafeLoader) + from_yaml = yaml.load(f) self.assertEqual(frommeta, from_yaml) # comment above assert and uncomment below to update test # files when new metadata fields are added diff --git a/tests/metadata/org.videolan.vlc.yml b/tests/metadata/org.videolan.vlc.yml index 969c9674..266f517d 100644 --- a/tests/metadata/org.videolan.vlc.yml +++ b/tests/metadata/org.videolan.vlc.yml @@ -22,58 +22,54 @@ Builds: versionCode: 110 commit: 0.0.11 subdir: vlc-android - forceversion: yes - forcevercode: yes + forceversion: true + forcevercode: true prebuild: sed -i '48d' ../Makefile androidupdate: - . - ../java-libs/SlidingMenu - ../java-libs/ActionBarSherlock build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - buildjni: no - versionName: 0.0.11-ARM versionCode: 111 commit: 0.0.11 subdir: vlc-android - forceversion: yes - forcevercode: yes + forceversion: true + forcevercode: true prebuild: sed -i '48d' ../Makefile androidupdate: - . - ../java-libs/SlidingMenu - ../java-libs/ActionBarSherlock build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release - buildjni: no - versionName: 0.0.11-x86 versionCode: 112 disable: ffmpeg error 0.0.11 commit: unknown - see disabled subdir: vlc-android - forceversion: yes - forcevercode: yes + forceversion: true + forcevercode: true prebuild: sed -i '48d' ../Makefile androidupdate: - . - ../java-libs/SlidingMenu - ../java-libs/ActionBarSherlock build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - buildjni: no - versionName: 0.0.11-mips versionCode: 113 commit: 0.0.11 subdir: vlc-android - forceversion: yes - forcevercode: yes + forceversion: true + forcevercode: true prebuild: sed -i '48d' ../Makefile androidupdate: - . - ../java-libs/SlidingMenu - ../java-libs/ActionBarSherlock build: cd ../ && ANDROID_ABI=mips ./compile.sh release - buildjni: no - versionName: 0.1.3-MIPS versionCode: 1301 @@ -82,11 +78,10 @@ Builds: subdir: vlc-android patch: ndkr9.patch srclibs: VLC@7c52aacbe - forceversion: yes - forcevercode: yes + forceversion: true + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ANDROID_ABI=mips ./compile.sh release - buildjni: no - versionName: 0.1.3-x86 versionCode: 1302 @@ -94,11 +89,10 @@ Builds: subdir: vlc-android patch: ndkr9.patch srclibs: VLC@7c52aacbe - forceversion: yes - forcevercode: yes + forceversion: true + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - buildjni: no - versionName: 0.1.3-ARM versionCode: 1303 @@ -106,11 +100,10 @@ Builds: subdir: vlc-android patch: ndkr9.patch srclibs: VLC@7c52aacbe - forceversion: yes - forcevercode: yes + forceversion: true + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release - buildjni: no - versionName: 0.1.3-ARMv7 versionCode: 1304 @@ -118,51 +111,46 @@ Builds: subdir: vlc-android patch: ndkr9.patch srclibs: VLC@7c52aacbe - forceversion: yes - forcevercode: yes + forceversion: true + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - buildjni: no - versionName: 0.9.0 versionCode: 9002 commit: 0.9.0 subdir: vlc-android srclibs: VLC@31ffb20309264994 - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - buildjni: no - versionName: 0.9.0 versionCode: 9004 commit: 0.9.0 subdir: vlc-android srclibs: VLC@31ffb20309264994 - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - buildjni: no - versionName: 0.9.1 versionCode: 9102 commit: 0.9.1 subdir: vlc-android srclibs: VLC@37e886d113b8b567c15208579fb2f - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - buildjni: no - versionName: 0.9.1 versionCode: 9104 commit: 0.9.1 subdir: vlc-android srclibs: VLC@37e886d113b8b567c15208579fb2f - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - buildjni: no - versionName: 0.9.5 versionCode: 9502 @@ -170,10 +158,9 @@ Builds: commit: 0.9.5 subdir: vlc-android srclibs: VLC@052600173f376ff58ff04d53746961a2 - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - buildjni: no - versionName: 0.9.5 versionCode: 9504 @@ -181,50 +168,45 @@ Builds: commit: 0.9.5 subdir: vlc-android srclibs: VLC@052600173f376ff58ff04d53746961a2 - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - buildjni: no - versionName: 0.9.6 versionCode: 9602 commit: 0.9.6 subdir: vlc-android srclibs: VLC-2.2@27f4799 - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - buildjni: no - versionName: 0.9.6 versionCode: 9604 commit: 0.9.6 subdir: vlc-android srclibs: VLC-2.2@27f4799 - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - buildjni: no - versionName: 0.9.7 versionCode: 9702 commit: 0.9.7 subdir: vlc-android srclibs: VLC-2.2@9e1c6ff - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - buildjni: no - versionName: 0.9.7 versionCode: 9704 commit: 0.9.7 subdir: vlc-android srclibs: VLC-2.2@9e1c6ff - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - buildjni: no - versionName: 0.9.7.1 versionCode: 9711 @@ -232,120 +214,108 @@ Builds: commit: 0.9.7.1 subdir: vlc-android srclibs: VLC-2.2@57cd36b - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=mips ./compile.sh release - buildjni: no - versionName: 0.9.7.1 versionCode: 9712 commit: 0.9.7.1 subdir: vlc-android srclibs: VLC-2.2@57cd36b - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - buildjni: no - versionName: 0.9.7.1 versionCode: 9714 commit: 0.9.7.1 subdir: vlc-android srclibs: VLC-2.2@57cd36b - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - buildjni: no - versionName: 0.9.8 versionCode: 9802 commit: 0.9.8 subdir: vlc-android srclibs: VLC-2.2@f2db364 - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - buildjni: no - versionName: 0.9.8 versionCode: 9803 commit: 0.9.8 subdir: vlc-android srclibs: VLC-2.2@f2db364 - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release - buildjni: no - versionName: 0.9.8 versionCode: 9804 commit: 0.9.8 subdir: vlc-android srclibs: VLC-2.2@f2db364 - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - buildjni: no - versionName: 0.9.9 versionCode: 9902 commit: 0.9.9 subdir: vlc-android srclibs: VLC-2.2@e731dc23a4f8ef6782c7cc2236bbbf41c034dad1 - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - buildjni: no - versionName: 0.9.9 versionCode: 9903 commit: 0.9.9 subdir: vlc-android srclibs: VLC-2.2@e731dc23a4f8ef6782c7cc2236bbbf41c034dad1 - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release - buildjni: no - versionName: 0.9.9 versionCode: 9904 commit: 0.9.9 subdir: vlc-android srclibs: VLC-2.2@e731dc23a4f8ef6782c7cc2236bbbf41c034dad1 - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - buildjni: no - versionName: 0.9.10 versionCode: 10002 commit: 0.9.10 subdir: vlc-android srclibs: VLC-2.2@e33e5de - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - buildjni: no - versionName: 0.9.10 versionCode: 10003 commit: 0.9.10 subdir: vlc-android srclibs: VLC-2.2@e33e5de - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release - buildjni: no - versionName: 0.9.10 versionCode: 10004 commit: 0.9.10 subdir: vlc-android srclibs: VLC-2.2@e33e5de - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - buildjni: no #0.9.10 vercodes were off - versionName: 1.0.0 @@ -354,10 +324,9 @@ Builds: commit: 1.0.0 subdir: vlc-android srclibs: VLC-2.2@036010e - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - buildjni: no #0.9.10 vercodes were off - versionName: 1.0.0 @@ -366,10 +335,9 @@ Builds: commit: 1.0.0 subdir: vlc-android srclibs: VLC-2.2@036010e - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release - buildjni: no #0.9.10 vercodes were off - versionName: 1.0.0 @@ -378,40 +346,36 @@ Builds: commit: 1.0.0 subdir: vlc-android srclibs: VLC-2.2@036010e - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - buildjni: no - versionName: 1.0.1 versionCode: 10102 commit: 1.0.1 subdir: vlc-android srclibs: VLC-2.2@59409d5 - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release - buildjni: no - versionName: 1.0.1 versionCode: 10103 commit: 1.0.1 subdir: vlc-android srclibs: VLC-2.2@59409d5 - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release - buildjni: no - versionName: 1.0.1 versionCode: 10104 commit: 1.0.1 subdir: vlc-android srclibs: VLC-2.2@59409d5 - forcevercode: yes + forcevercode: true prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release - buildjni: no - versionName: 1.1.3 versionCode: 1010303 @@ -422,7 +386,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi" --release - buildjni: no ndk: r10d - versionName: 1.1.3 @@ -434,7 +397,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi-v7a" --release - buildjni: no ndk: r10d - versionName: 1.1.3 @@ -446,7 +408,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "x86" --release - buildjni: no ndk: r10d - versionName: 1.1.5 @@ -458,7 +419,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi" --release - buildjni: no ndk: r10d - versionName: 1.1.5 @@ -470,7 +430,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi-v7a" --release - buildjni: no ndk: r10d - versionName: 1.1.5 @@ -482,7 +441,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "x86" --release - buildjni: no ndk: r10d - versionName: 1.1.6 @@ -494,7 +452,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi" --release - buildjni: no ndk: r10d - versionName: 1.1.6 @@ -506,7 +463,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi-v7a" --release - buildjni: no ndk: r10d - versionName: 1.1.6 @@ -518,7 +474,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "x86" --release - buildjni: no ndk: r10d - versionName: 1.2.0 @@ -530,7 +485,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi" --release - buildjni: no ndk: r10d - versionName: 1.2.0 @@ -542,7 +496,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi-v7a" --release - buildjni: no ndk: r10d - versionName: 1.2.0 @@ -554,7 +507,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "x86" --release - buildjni: no ndk: r10d - versionName: 1.2.1 @@ -566,7 +518,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi" --release - buildjni: no ndk: r10d - versionName: 1.2.1 @@ -578,7 +529,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi-v7a" --release - buildjni: no ndk: r10d - versionName: 1.2.1 @@ -590,7 +540,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "x86" --release - buildjni: no ndk: r10d - versionName: 1.2.2 @@ -602,7 +551,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi" --release - buildjni: no ndk: r10d - versionName: 1.2.2 @@ -614,7 +562,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi-v7a" --release - buildjni: no ndk: r10d - versionName: 1.2.2 @@ -626,7 +573,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "x86" --release - buildjni: no ndk: r10d - versionName: 1.2.3 @@ -638,7 +584,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi" --release - buildjni: no ndk: r10d - versionName: 1.2.3 @@ -650,7 +595,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi-v7a" --release - buildjni: no ndk: r10d - versionName: 1.2.3 @@ -662,7 +606,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "x86" --release - buildjni: no ndk: r10d - versionName: 1.2.4 @@ -674,7 +617,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi" --release - buildjni: no ndk: r10d - versionName: 1.2.4 @@ -686,7 +628,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi-v7a" --release - buildjni: no ndk: r10d - versionName: 1.2.4 @@ -698,7 +639,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "x86" --release - buildjni: no ndk: r10d - versionName: 1.2.5 @@ -710,7 +650,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi" --release - buildjni: no ndk: r10d - versionName: 1.2.5 @@ -722,7 +661,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi-v7a" --release - buildjni: no ndk: r10d - versionName: 1.2.5 @@ -734,7 +672,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "x86" --release - buildjni: no ndk: r10d - versionName: 1.2.6 @@ -746,7 +683,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi" --release - buildjni: no ndk: r10d - versionName: 1.2.6 @@ -758,7 +694,6 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "armeabi-v7a" --release - buildjni: no ndk: r10d - versionName: 1.2.6 @@ -770,14 +705,13 @@ Builds: prebuild: sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh && ln -s vlc-android/$$VLC$$ ../vlc build: cd ../ && ./compile.sh -a "x86" --release - buildjni: no ndk: r10d MaintainerNotes: | Instructions and dependencies here: http://wiki.videolan.org/AndroidCompile see http://buildbot.videolan.org/builders/ for version code scheme The VLC srclib commit can be found out from TESTED_HASH value in compile.sh - + On new releases remove the updatecheck and force the CV to the last working build. This will make sure users don't get notified about the update until the final build from the BS has been reviewed and tested. Once done, undo From aa71dd57f665c6b666753106360ebc09521fb506 Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Wed, 29 Dec 2021 13:29:00 +0100 Subject: [PATCH 0958/2116] update.TestCase: Avoid creating metadata with duplicate keys --- tests/update.TestCase | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/update.TestCase b/tests/update.TestCase index 0cac25c7..d83e4b0a 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1179,6 +1179,7 @@ class UpdateTest(unittest.TestCase): def test_update_with_AllowedAPKSigningKeys(self): """Test that APKs without allowed signatures get deleted.""" + # Prepare test environment testdir = tempfile.mkdtemp( prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir ) @@ -1188,12 +1189,15 @@ class UpdateTest(unittest.TestCase): shutil.copy(os.path.join(self.basedir, testapk), testapk) os.mkdir('metadata') metadatafile = os.path.join('metadata', 'com.politedroid.yml') + + # Copy and manipulate metadata file shutil.copy(os.path.join(self.basedir, metadatafile), metadatafile) with open(metadatafile, 'a') as fp: fp.write( '\n\nAllowedAPKSigningKeys: 32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6\n' ) + # Set up options fdroidserver.common.options = Options config = fdroidserver.common.read_config(fdroidserver.common.options) if 'apksigner' not in config: # TODO remove me for buildserver-bullseye @@ -1204,14 +1208,20 @@ class UpdateTest(unittest.TestCase): config['keystore'] = os.path.join(self.basedir, 'keystore.jks') self.assertTrue(os.path.exists(testapk)) + + # Test for non-deletion with mock.patch('sys.argv', ['fdroid update', '--delete-unknown']): fdroidserver.update.main() self.assertTrue(os.path.exists(testapk)) + # Copy and manipulate metadata file again + shutil.copy(os.path.join(self.basedir, metadatafile), metadatafile) with open(metadatafile, 'a') as fp: fp.write( '\n\nAllowedAPKSigningKeys: fa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edead\n' ) + + # Test for deletion with mock.patch('sys.argv', ['fdroid update', '--delete-unknown']): fdroidserver.update.main() self.assertFalse(os.path.exists(testapk)) From a3f760f8498d6dab65f63fdc184696ca743354ca Mon Sep 17 00:00:00 2001 From: linsui Date: Mon, 16 Jan 2023 17:14:57 +0800 Subject: [PATCH 0959/2116] Add codeberg.org --- fdroidserver/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index d61befb5..0ef3881a 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1145,7 +1145,7 @@ class vcs_git(vcs): '-c', 'core.sshCommand=/bin/false', '-c', 'url.https://.insteadOf=ssh://', ] - for domain in ('bitbucket.org', 'github.com', 'gitlab.com'): + for domain in ('bitbucket.org', 'github.com', 'gitlab.com', 'codeberg.org'): git_config.append('-c') git_config.append('url.https://u:p@' + domain + '/.insteadOf=git@' + domain + ':') git_config.append('-c') From 5858d8fcb410dbd9b7e757ff7b775a9c0e2e707f Mon Sep 17 00:00:00 2001 From: linsui Date: Tue, 3 Jan 2023 19:00:05 +0800 Subject: [PATCH 0960/2116] remove liberapayID --- .gitlab-ci.yml | 1 + fdroidserver/index.py | 2 -- fdroidserver/metadata.py | 6 ------ locale/fi/LC_MESSAGES/fdroidserver.po | 4 ---- tests/metadata/dump/com.politedroid.yaml | 1 - tests/metadata/dump/org.adaway.yaml | 1 - tests/metadata/dump/org.smssecure.smssecure.yaml | 1 - tests/metadata/dump/org.videolan.vlc.yaml | 1 - tests/metadata/info.guardianproject.urzip.yml | 1 - tests/metadata/org.adaway.yml | 1 - tests/repo/index-v1.json | 1 - tests/repo/index.xml | 1 - tests/update.TestCase | 2 -- 13 files changed, 1 insertion(+), 22 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5575ebfc..dc046642 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -62,6 +62,7 @@ metadata_v0: -e "s/ timeout:.'\([0-9]*\)'/ timeout:\1/" -e "/VercodeOperation/s/null/[]/" -e 's/VercodeOperation:.\([^[]\+\)/VercodeOperation:\n- \1/' + -e '/LiberapayID/d' metadata/dump_*/*.yaml - diff -uw metadata/dump_* diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 7c079993..b598b2bd 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -553,7 +553,6 @@ def package_metadata(app, repodir): "Bitcoin", "FlattrID", "Liberapay", - "LiberapayID", "Litecoin", "OpenCollective", ): @@ -1173,7 +1172,6 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing addElementNonEmpty('bitcoin', app.Bitcoin, doc, apel) addElementNonEmpty('litecoin', app.Litecoin, doc, apel) addElementNonEmpty('flattr', app.FlattrID, doc, apel) - addElementNonEmpty('liberapay', app.LiberapayID, doc, apel) addElementNonEmpty('openCollective', app.OpenCollective, doc, apel) # These elements actually refer to the current version (i.e. which diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 296310aa..55fe954e 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -69,7 +69,6 @@ yaml_app_field_order = [ 'Donate', 'FlattrID', 'Liberapay', - 'LiberapayID', 'OpenCollective', 'Bitcoin', 'Litecoin', @@ -132,7 +131,6 @@ class App(dict): self.Donate = None self.FlattrID = None self.Liberapay = None - self.LiberapayID = None self.OpenCollective = None self.Bitcoin = None self.Litecoin = None @@ -404,10 +402,6 @@ valuetypes = { VALID_USERNAME_REGEX, ['Liberapay']), - FieldValidator("Liberapay ID", - r'^[0-9]+$', - ['LiberapayID']), - FieldValidator("Open Collective", VALID_USERNAME_REGEX, ['OpenCollective']), diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index ef109eee..eb36b726 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -1213,10 +1213,6 @@ msgstr "" msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "" -#: ../fdroidserver/lint.py -msgid "Liberapay donation methods belong in the LiberapayID flag" -msgstr "" - #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted" msgstr "" diff --git a/tests/metadata/dump/com.politedroid.yaml b/tests/metadata/dump/com.politedroid.yaml index 46a5cd6b..ebb6977f 100644 --- a/tests/metadata/dump/com.politedroid.yaml +++ b/tests/metadata/dump/com.politedroid.yaml @@ -161,7 +161,6 @@ Donate: null FlattrID: null IssueTracker: https://github.com/miguelvps/PoliteDroid/issues Liberapay: null -LiberapayID: null License: GPL-3.0-only Litecoin: null MaintainerNotes: '' diff --git a/tests/metadata/dump/org.adaway.yaml b/tests/metadata/dump/org.adaway.yaml index 8972dc17..a5411576 100644 --- a/tests/metadata/dump/org.adaway.yaml +++ b/tests/metadata/dump/org.adaway.yaml @@ -1088,7 +1088,6 @@ Donate: http://sufficientlysecure.org/index.php/adaway FlattrID: '369138' IssueTracker: https://github.com/dschuermann/ad-away/issues Liberapay: null -LiberapayID: '1234567890' License: GPL-3.0-only Litecoin: null MaintainerNotes: '' diff --git a/tests/metadata/dump/org.smssecure.smssecure.yaml b/tests/metadata/dump/org.smssecure.smssecure.yaml index 3c20d20a..db476b66 100644 --- a/tests/metadata/dump/org.smssecure.smssecure.yaml +++ b/tests/metadata/dump/org.smssecure.smssecure.yaml @@ -378,7 +378,6 @@ Donate: null FlattrID: null IssueTracker: https://github.com/SMSSecure/SMSSecure/issues Liberapay: null -LiberapayID: null License: GPL-3.0-only Litecoin: null MaintainerNotes: '' diff --git a/tests/metadata/dump/org.videolan.vlc.yaml b/tests/metadata/dump/org.videolan.vlc.yaml index ef25d9a8..20e92b83 100644 --- a/tests/metadata/dump/org.videolan.vlc.yaml +++ b/tests/metadata/dump/org.videolan.vlc.yaml @@ -2541,7 +2541,6 @@ Donate: http://www.videolan.org/contribute.html#money FlattrID: null IssueTracker: http://www.videolan.org/support/index.html#bugs Liberapay: null -LiberapayID: null License: GPL-3.0-only Litecoin: null MaintainerNotes: 'Instructions and dependencies here: http://wiki.videolan.org/AndroidCompile diff --git a/tests/metadata/info.guardianproject.urzip.yml b/tests/metadata/info.guardianproject.urzip.yml index bab1d763..d35f7887 100644 --- a/tests/metadata/info.guardianproject.urzip.yml +++ b/tests/metadata/info.guardianproject.urzip.yml @@ -1,7 +1,6 @@ AutoName: Urzip:本地应用的信息 AutoUpdateMode: None Bitcoin: 1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk -LiberapayID: '9999999' OpenCollective: f-droid-just-testing Categories: - Development diff --git a/tests/metadata/org.adaway.yml b/tests/metadata/org.adaway.yml index edfb2cd5..41bdb083 100644 --- a/tests/metadata/org.adaway.yml +++ b/tests/metadata/org.adaway.yml @@ -8,7 +8,6 @@ IssueTracker: https://github.com/dschuermann/ad-away/issues Translation: https://www.transifex.com/dominikschuermann/adaway Donate: http://sufficientlysecure.org/index.php/adaway FlattrID: '369138' -LiberapayID: '1234567890' AutoName: AdAway Summary: Block advertisements diff --git a/tests/repo/index-v1.json b/tests/repo/index-v1.json index 257a815d..b103ba8d 100644 --- a/tests/repo/index-v1.json +++ b/tests/repo/index-v1.json @@ -204,7 +204,6 @@ "suggestedVersionCode": "2147483647", "description": "It\u2019s Urzip \u662f\u4e00\u4e2a\u83b7\u5f97\u5df2\u5b89\u88c5 APK \u76f8\u5173\u4fe1\u606f\u7684\u5b9e\u7528\u5de5\u5177\u3002\u5b83\u4ece\u60a8\u7684\u8bbe\u5907\u4e0a\u5df2\u5b89\u88c5\u7684\u6240\u6709\u5e94\u7528\u5f00\u59cb\uff0c\u4e00\u952e\u89e6\u6478\u5373\u53ef\u663e\u793a APK \u7684\u6307\u7eb9\uff0c\u5e76\u4e14\u63d0\u4f9b\u5230\u8fbe virustotal.com \u548c androidobservatory.org \u7684\u5feb\u6377\u94fe\u63a5\uff0c\u8ba9\u60a8\u65b9\u4fbf\u5730\u4e86\u89e3\u7279\u5b9a APK \u7684\u6863\u6848\u3002\u5b83\u8fd8\u53ef\u4ee5\u8ba9\u60a8\u5bfc\u51fa\u7b7e\u540d\u8bc1\u4e66\u548c\u751f\u6210 ApkSignaturePin Pin \u6587\u4ef6\u4f9b TrustedIntents \u5e93\u4f7f\u7528\u3002\n\n\u2605 Urzip \u652f\u6301\u4e0b\u5217\u8bed\u8a00\uff1a Deutsch, English, espa\u00f1ol, suomi, \u65e5\u672c\u8a9e, \ud55c\uad6d\uc5b4, Norsk, portugu\u00eas (Portugal), \u0420\u0443\u0441\u0441\u043a\u0438\u0439, Sloven\u0161\u010dina, T\u00fcrk\u00e7e\n\u6ca1\u770b\u5230\u60a8\u7684\u8bed\u8a00\uff1f\u5e2e\u5fd9\u7ffb\u8bd1\u672c\u5e94\u7528\u5427\uff1a\nhttps://www.transifex.com/projects/p/urzip\n\n\u2605 \u81f4\u7528\u6237\uff1a\u6211\u4eec\u8fd8\u7f3a\u5c11\u4f60\u559c\u6b22\u7684\u529f\u80fd\uff1f\u53d1\u73b0\u4e86\u4e00\u4e2a bug\uff1f\u8bf7\u544a\u8bc9\u6211\u4eec\uff01\u6211\u4eec\u4e50\u4e8e\u542c\u53d6\u60a8\u7684\u610f\u89c1\u3002\u8bf7\u53d1\u9001\u7535\u5b50\u90ae\u4ef6\u81f3: support@guardianproject.info \u6216\u8005\u52a0\u5165\u6211\u4eec\u7684\u804a\u5929\u5ba4 https://guardianproject.info/contact\n", "issueTracker": "https://dev.guardianproject.info/projects/urzip/issues", - "liberapayID": "9999999", "license": "GPL-3.0-only", "openCollective": "f-droid-just-testing", "sourceCode": "https://github.com/guardianproject/urzip", diff --git a/tests/repo/index.xml b/tests/repo/index.xml index 7c9a1cd6..31578bb0 100644 --- a/tests/repo/index.xml +++ b/tests/repo/index.xml @@ -388,7 +388,6 @@ https://www.transifex.com/projects/p/urzip https://github.com/guardianproject/urzip https://dev.guardianproject.info/projects/urzip/issues 1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk - 9999999 f-droid-just-testing 2147483647 diff --git a/tests/update.TestCase b/tests/update.TestCase index d83e4b0a..76b2739f 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1395,7 +1395,6 @@ class UpdateTest(unittest.TestCase): Changelog: Donate: FlattrID: - LiberapayID: Bitcoin: Litecoin: Name: @@ -1442,7 +1441,6 @@ class UpdateTest(unittest.TestCase): 'Donate': '', 'FlattrID': '', 'IssueTracker': '', - 'LiberapayID': '', 'License': '', 'Litecoin': '', 'Name': 'rocks.janicerand', From f8e3356365de6a96e660f68e5aae04aac5bda592 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 2 Feb 2023 09:28:02 +0100 Subject: [PATCH 0961/2116] Distroy VM when running into timeout (Closes: #1094) halt results in an Traceback. --- fdroidserver/build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 794cbbd9..00de15f2 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -893,7 +893,7 @@ def force_halt_build(timeout): logging.error(_('Force halting build after {0} sec timeout!').format(timeout)) timeout_event.set() vm = vmtools.get_build_vm('builder') - vm.halt() + vm.destroy() def parse_commandline(): From e71afa12999ad63a8141609e43cf91aef3eaab6e Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Thu, 2 Feb 2023 13:35:29 +0000 Subject: [PATCH 0962/2116] Android NDK None (None) --- fdroidserver/common.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 0ef3881a..7b1e0552 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4518,5 +4518,11 @@ NDKS = [ "revision": "25.1.8937393", "sha256": "403ac3e3020dd0db63a848dcaba6ceb2603bf64de90949d5c4361f848e44b005", "url": "https://dl.google.com/android/repository/android-ndk-r25b-linux.zip" + }, + { + "release": "r25c", + "revision": "25.2.9519653", + "sha256": "769ee342ea75f80619d985c2da990c48b3d8eaf45f48783a2d48870d04b46108", + "url": "https://dl.google.com/android/repository/android-ndk-r25c-linux.zip" } ] From a27cf3d42dc9525820e56aec7f86fd2ec2a6c71b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 2 Feb 2023 14:44:54 +0100 Subject: [PATCH 0963/2116] gitlab-ci: use black from Debian for a stable code format This avoids surprise code format CI breakage when black pushes new rules: https://gitlab.com/fdroid-bot/fdroidserver/-/jobs/3703868702 --- .gitlab-ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index dc046642..63c17f01 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -220,9 +220,10 @@ lint_format_safety_bandit_checks: black: - image: python:slim + image: debian:bookworm-slim + <<: *apt-template script: - - pip install black + - apt-get install black - black --check --diff --color examples/fdroid_clean_repos.py examples/fdroid_extract_repo_pubkey.py From 98769d840533de1f3294fa7b13ce5d937f745fb6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 2 Feb 2023 15:10:48 +0100 Subject: [PATCH 0964/2116] gitlab-ci: ignore setuptools DoS error from safety --- .safety-policy.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .safety-policy.yml diff --git a/.safety-policy.yml b/.safety-policy.yml new file mode 100644 index 00000000..7415406d --- /dev/null +++ b/.safety-policy.yml @@ -0,0 +1,7 @@ +--- + +security: + ignore-vulnerabilities: + 52495: + reason: setuptools comes from Debian + expires: '2025-01-31' From 156b3f91cc06531fcc3f2aa19910acc93e8802f0 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 2 Feb 2023 15:30:35 +0100 Subject: [PATCH 0965/2116] fix pylint W0404: Reimport 're' (imported line 21) (reimported) --- fdroidserver/__main__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/fdroidserver/__main__.py b/fdroidserver/__main__.py index e470099c..216e00c4 100755 --- a/fdroidserver/__main__.py +++ b/fdroidserver/__main__.py @@ -159,7 +159,6 @@ def main(): output = 'git commit ' + subprocess.check_output(['git', 'rev-parse', 'HEAD'], universal_newlines=True) elif os.path.exists('setup.py'): - import re m = re.search(r'''.*[\s,\(]+version\s*=\s*["']([0-9a-z.]+)["'].*''', open('setup.py').read(), flags=re.MULTILINE) if m: From 176301d831f475c1688ad14bd10d634612d9bd9d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 2 Feb 2023 15:47:51 +0100 Subject: [PATCH 0966/2116] fix pylint W0715: Exception arguments suggest string formatting might be intended (raising-format-tuple) --- fdroidserver/vmtools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/vmtools.py b/fdroidserver/vmtools.py index 16f2b605..e489ce4b 100644 --- a/fdroidserver/vmtools.py +++ b/fdroidserver/vmtools.py @@ -323,7 +323,7 @@ class FDroidBuildVm: boxfile = abspath(boxfile) if not isfile(boxfile): raise FDroidBuildVmException( - 'supplied boxfile \'%s\' does not exist', boxfile + 'supplied boxfile \'%s\' does not exist' % boxfile ) self.vgrnt.box_add(boxname, abspath(boxfile), force=force) From 9d2cc1ecc57e64ec55d991666e2775f68b01762a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 2 Feb 2023 15:58:15 +0100 Subject: [PATCH 0967/2116] fix pylint C1803: 'icons_src == {}' can be simplified to 'not icons_src' as an empty dict is falsey (use-implicit-booleaness-not-comparison) --- tests/update.TestCase | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/update.TestCase b/tests/update.TestCase index 76b2739f..fe3159ce 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1358,7 +1358,7 @@ class UpdateTest(unittest.TestCase): # pylint: disable=protected-access icons_src = fdroidserver.update._get_apk_icons_src('urzip-release.apk', None) - assert icons_src == {} + assert not icons_src def test_strip_and_copy_image(self): tmptestsdir = tempfile.mkdtemp( From 75bf953c80daf5508fcdefe1d6b21a1a83d4900b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 2 Feb 2023 16:01:00 +0100 Subject: [PATCH 0968/2116] fix pylint: C0104: Disallowed name "bar" (disallowed-name) --- fdroidserver/deploy.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 13a8982b..0661bb3a 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -430,12 +430,12 @@ def update_servergitmirrors(servergitmirrors, repo_section): repo.index.commit("fdroidserver git-mirror") if options.verbose: - bar = progress.Bar() + progressbar = progress.Bar() class MyProgressPrinter(git.RemoteProgress): def update(self, op_code, current, maximum=None, message=None): if isinstance(maximum, float): - bar.show(current, maximum) + progressbar.show(current, maximum) progress = MyProgressPrinter() else: progress = None @@ -497,7 +497,7 @@ def update_servergitmirrors(servergitmirrors, repo_section): logging.debug(remote.url + ': ' + pushinfo.summary) if progress: - bar.done() + progressbar.done() def upload_to_android_observatory(repo_section): From b152916b492916314733ea2008d53f8e9d62d188 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 2 Feb 2023 16:02:14 +0100 Subject: [PATCH 0969/2116] fix pylint: C1803: 'local_metadata_files != []' can be simplified to 'local_metadata_files' as an empty list is falsey (use-implicit-booleaness-not-comparison) --- fdroidserver/import_subcommand.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/import_subcommand.py b/fdroidserver/import_subcommand.py index b9fe070a..ab0e0ed7 100644 --- a/fdroidserver/import_subcommand.py +++ b/fdroidserver/import_subcommand.py @@ -252,7 +252,7 @@ def main(): tmp_importer_dir = None local_metadata_files = common.get_local_metadata_files() - if local_metadata_files != []: + if local_metadata_files: raise FDroidException(_("This repo already has local metadata: %s") % local_metadata_files[0]) build = metadata.Build() From 497fcfc84888131c44d03c81b2cb5a92e27f708b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 2 Feb 2023 15:30:15 +0100 Subject: [PATCH 0970/2116] silence new pylint checks that are too much for the current state Ideally, these would be fixed. But it'll be a project. * C0201: Consider iterating the dictionary directly instead of calling .keys() (consider-iterating-dictionary) * R1705: Unnecessary "else" after "return", remove the "else" and de-indent the code inside it (no-else-return) * R1720: Unnecessary "elif" after "raise", remove the leading "el" from "elif" (no-else-raise) * R1720: Unnecessary "else" after "raise", remove the "else" and de-indent the code inside it (no-else-raise) * R1722: Consider using 'sys.exit' instead (consider-using-sys-exit) * R1723: Unnecessary "elif" after "break", remove the leading "el" from "elif" (no-else-break) * R1724: Unnecessary "elif" after "continue", remove the leading "el" from "elif" (no-else-continue) * R1735: Consider using '{}' instead of a call to 'dict'. (use-dict-literal) * W0133: Exception statement has no effect (pointless-exception-statement) * W0718: Catching too general exception Exception (broad-exception-caught) * W0719: Raising too general exception: Exception (broad-exception-raised) * W1510: 'subprocess.run' used without explicitly defining the value for 'check'. (subprocess-run-check) --- pyproject.toml | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 9e7fc078..f4f8c7b5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,27 @@ confidence = ["HIGH", "INFERENCE"] # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use "--disable=all --enable=classes # --disable=W". -disable = ["invalid-name", "missing-module-docstring", "missing-class-docstring", "missing-function-docstring", "no-member"] + +# TODO many of these could be fixed if someone wants to spend the time +disable = [ + "broad-exception-caught", + "broad-exception-raised", + "consider-iterating-dictionary", + "consider-using-sys-exit", + "invalid-name", + "missing-class-docstring", + "missing-function-docstring", + "missing-module-docstring", + "no-else-break", + "no-else-continue", + "no-else-raise", + "no-else-return", + "no-member", + "pointless-exception-statement", + "subprocess-run-check", + "use-dict-literal", +] + [tool.pylint.miscellaneous] # List of note tags to take in consideration, separated by a comma. From 306ff33800dc8cd69a4f01979895022f378438f6 Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 1 Feb 2023 01:47:39 +0100 Subject: [PATCH 0971/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Eric Currently translated at 69.8% (435 of 623 strings) Co-authored-by: Eric Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 2ec3049c..361d47eb 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -20,20 +20,21 @@ # Yang Yulin , 2022. # yangyangdaji <1504305527@qq.com>, 2022. # Yang Yulin , 2022. +# Eric , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-08-23 13:16+0000\n" -"Last-Translator: Yang Yulin \n" +"PO-Revision-Date: 2022-09-08 14:15+0000\n" +"Last-Translator: Eric \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -744,9 +745,9 @@ msgid "ERROR: unsupported CI type, patches welcome!" msgstr "错误:不支持此类 CI,如果有能力请帮我们添加支持!" #: ../fdroidserver/nightly.py -#, fuzzy, python-format +#, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "错误:不支持此类 CI,如果有能力请帮我们添加支持!" +msgstr "错误:不支持的 git 主机“%s”,欢迎提交补丁!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1698,9 +1699,9 @@ msgid "Scan the source code of a package" msgstr "扫描一个应用的源代码" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Scanner found {count} problems in {apk}:" -msgstr "扫描仪在 {appid} 中发现 {count} 个问题:" +msgstr "扫描仪在 {apk} 中发现 {count} 个问题:" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1722,9 +1723,8 @@ msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "使用 apkanalyzer 扫描 APK 以查找已知的非免费类。" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with dexdump for known non-free classes." -msgstr "使用 apkanalyzer 扫描 APK 以查找已知的非免费类。" +msgstr "使用 dexdump 扫描 APK 以查找已知的非自由类。" #: ../fdroidserver/common.py #, python-brace-format @@ -2322,9 +2322,9 @@ msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" #: /usr/lib/python3.9/argparse.py -#, fuzzy, python-format +#, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "无法打开 '%s': %s" +msgstr "无法打开 '%(filename)s':%(error)s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From 796f42fe1db24d7260ff0345798806db00e3a494 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Wed, 1 Feb 2023 01:47:40 +0100 Subject: [PATCH 0972/2116] Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk Currently translated at 100.0% (623 of 623 strings) Co-authored-by: Ihor Hordiichuk Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 34 +++++++++++++-------------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 610c237b..e3dfd7f7 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-02-17 19:57+0000\n" +"PO-Revision-Date: 2022-09-08 14:15+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" "Language: uk\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -736,9 +736,9 @@ msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ПОМИЛКА: непідтримуваний вид CI, виправлення вітається!" #: ../fdroidserver/nightly.py -#, fuzzy, python-format +#, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "ПОМИЛКА: непідтримуваний вид CI, виправлення вітається!" +msgstr "ПОМИЛКА: непідтримуваний git-хост «%s», виправлення вітаються!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -777,7 +777,7 @@ msgstr "Помилка отримання адреси репозиторію" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "" +msgstr "Витяг метаданих застосунку з вихідного репозиторію" #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" @@ -1265,7 +1265,7 @@ msgstr "Несправний шлях serverwebroot:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "" +msgstr "Досягнуто максимальної глибини рекурсії у ZIP-файлі: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1282,7 +1282,7 @@ msgstr "Назву '%s' — створено самочинно, вилучіт #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" +msgstr "Ні \"repo_pubkey\", ні \"keystorepass\" не встановлені в config.yml" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." @@ -1518,7 +1518,7 @@ msgstr "Вивести таємну змінну до термінала для #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" -msgstr "" +msgstr "Проблема з ZIP файлом: %s, помилка %s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1690,9 +1690,9 @@ msgid "Scan the source code of a package" msgstr "Сканування джерельного коду пакунка" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Scanner found {count} problems in {apk}:" -msgstr "Зчитувач знайшов {count} проблеми в {appid}:" +msgstr "Сканер виявив {count} проблем у {apk}:" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1716,9 +1716,8 @@ msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Перевірка APK на наявність відомих невільних класів за допомогою apkanalyzer." #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with dexdump for known non-free classes." -msgstr "Перевірка APK на наявність відомих невільних класів за допомогою apkanalyzer." +msgstr "Сканування APK за допомогою dexdump на наявність відомих невільних класів." #: ../fdroidserver/common.py #, python-brace-format @@ -2302,7 +2301,7 @@ msgstr "applicationId з необов'язковим versionCode у формі A #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" -msgstr "" +msgstr "archive_url має закінчуватися на /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2323,9 +2322,9 @@ msgid "can not parse scrlib spec (not a string): '{}'" msgstr "не вдається проаналізувати специфікацію scrlib (не рядок): '{}'" #: /usr/lib/python3.9/argparse.py -#, fuzzy, python-format +#, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "не може відкрити '%s': %s" +msgstr "не вдалося відкрити «%(filename)s»: %(error)s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2502,9 +2501,8 @@ msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 повинен мати підпис, використовуйте `fdroid signindex`, щоб створити його!" #: ../fdroidserver/index.py -#, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v1 повинен мати підпис, використовуйте `fdroid signindex`, щоб створити його!" +msgstr "index-v2 повинен мати підпис, використовуйте `fdroid signindex`, щоб створити його!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2697,7 +2695,7 @@ msgstr "repo_icon %s не існує, створення заповнювача. #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" -msgstr "" +msgstr "repo_url повинен закінчуватися на /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." From c915c61ead11279970092023524123737f2d8fcc Mon Sep 17 00:00:00 2001 From: Andrei Stepanov Date: Wed, 1 Feb 2023 01:47:40 +0100 Subject: [PATCH 0973/2116] Translated using Weblate: Russian (ru) by Andrei Stepanov Currently translated at 100.0% (623 of 623 strings) Co-authored-by: Andrei Stepanov Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translation: F-Droid/F-Droid Server --- locale/ru/LC_MESSAGES/fdroidserver.po | 37 +++++++++++++-------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 48772b2c..400e12c5 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -10,20 +10,21 @@ # Roman , 2020. # S3aBreeze , 2021. # Чтабс , 2021. +# Andrei Stepanov , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-02-16 15:13+0000\n" -"Last-Translator: Andrey \n" +"PO-Revision-Date: 2022-09-08 14:15+0000\n" +"Last-Translator: Andrei Stepanov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -742,9 +743,9 @@ msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ОШИБКА: этот тип CI не поддерживается, налаживайте и присылайте патчи!" #: ../fdroidserver/nightly.py -#, fuzzy, python-format +#, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "ОШИБКА: этот тип CI не поддерживается, налаживайте и присылайте патчи!" +msgstr "ОШИБКА: неподдерживаемый хост git «%s», патчи приветствуются!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -783,7 +784,7 @@ msgstr "Ошибка при получении адреса репозитори #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "" +msgstr "Извлекать метаданные приложения из исходного репозитория" #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" @@ -1271,7 +1272,7 @@ msgstr "Неверный путь serverwebroot:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "" +msgstr "Достигнута максимальная глубина рекурсии в ZIP-файле: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1288,7 +1289,7 @@ msgstr "Удалите автоматически сгенерированное #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" +msgstr "Ни «repo_pubkey», ни «keystorepass» не указаны в config.yml" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." @@ -1524,7 +1525,7 @@ msgstr "Отобразить секретную переменную в терм #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" -msgstr "" +msgstr "Проблема с файлом ZIP: %s, ошибка %s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1696,9 +1697,9 @@ msgid "Scan the source code of a package" msgstr "Сканировать исходный код пакета" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Scanner found {count} problems in {apk}:" -msgstr "Сканирование обнаружило {count} ошибок в {appid}:" +msgstr "Сканер выявил {count} проблем в {apk}:" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1722,9 +1723,8 @@ msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Сканирование APK с помощью apkanalyzer на наличие известных несвободных классов." #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with dexdump for known non-free classes." -msgstr "Сканирование APK с помощью apkanalyzer на наличие известных несвободных классов." +msgstr "Сканирование APK с помощью dexdump на наличие известных несвободных классов." #: ../fdroidserver/common.py #, python-brace-format @@ -2308,7 +2308,7 @@ msgstr "applicationId и внутренняя версия приложения #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" -msgstr "" +msgstr "archive_url должен оканчиваться «/archive»" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2329,9 +2329,9 @@ msgid "can not parse scrlib spec (not a string): '{}'" msgstr "не удалось разобрать спецификацию scrlib (не является строкой): '{}'" #: /usr/lib/python3.9/argparse.py -#, fuzzy, python-format +#, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "не получается открыть '%s': %s" +msgstr "не удаётся открыть «%(filename)s»: %(error)s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2508,9 +2508,8 @@ msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 должен быть подписан, сделайте это с помощью `fdroid signindex`!" #: ../fdroidserver/index.py -#, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v1 должен быть подписан, сделайте это с помощью `fdroid signindex`!" +msgstr "index-v2 должен быть подписан, сделайте это с помощью `fdroid signindex`!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2703,7 +2702,7 @@ msgstr "значок репозитория (repo_icon) '%s' не существ #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" -msgstr "" +msgstr "repo_url должен оканчиваться «/repo»" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." From 1f6d1feec99965a5c2ee7492d3bec3c96ce7dadf Mon Sep 17 00:00:00 2001 From: Agnieszka C Date: Wed, 1 Feb 2023 01:47:40 +0100 Subject: [PATCH 0974/2116] Translated using Weblate: Polish (pl) by Agnieszka C Currently translated at 100.0% (623 of 623 strings) Co-authored-by: Agnieszka C Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ Translation: F-Droid/F-Droid Server --- locale/pl/LC_MESSAGES/fdroidserver.po | 34 +++++++++++++-------------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index ea580e4d..e757a172 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-02-15 22:36+0000\n" +"PO-Revision-Date: 2022-09-08 14:15+0000\n" "Last-Translator: Agnieszka C \n" "Language-Team: Polish \n" "Language: pl\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -736,9 +736,9 @@ msgid "ERROR: unsupported CI type, patches welcome!" msgstr "BŁĄD: nieobsługiwany typ CI, mile widziane poprawki!" #: ../fdroidserver/nightly.py -#, fuzzy, python-format +#, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "BŁĄD: nieobsługiwany typ CI, mile widziane poprawki!" +msgstr "BŁĄD: nieobsługiwany host git „%s”, łatki mile widziane!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -777,7 +777,7 @@ msgstr "Błąd podczas uzyskiwania adresu repo" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "" +msgstr "Wyodrębnij metadane aplikacji z repozytorium źródłowego" #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" @@ -1265,7 +1265,7 @@ msgstr "Nieprawidłowy wiersz serverwebroot:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "" +msgstr "Osiągnięto maksymalną głębokość rekurencji w pliku ZIP: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1282,7 +1282,7 @@ msgstr "Nazwa '%s' jest nazwą automatyczną - usuń ją" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" +msgstr "Ani „repo_pubkey”, ani „keystorepass” nie są ustawione w config.yml" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." @@ -1518,7 +1518,7 @@ msgstr "Wydrukuj tajną zmienną do terminala, aby ułatwić kopiowanie/wklejani #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" -msgstr "" +msgstr "Problem z plikiem ZIP: %s, błąd %s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1690,9 +1690,9 @@ msgid "Scan the source code of a package" msgstr "Zeskanuj kod źródłowy pakietu" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Scanner found {count} problems in {apk}:" -msgstr "Skaner znalazł {count} problem w {appid}:" +msgstr "Skaner wykrył {count} problem(-y/-ów) w {apk}:" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1716,9 +1716,8 @@ msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Skanowanie pakietu APK za pomocą apkanalyzer w poszukiwaniu znanych niewolnych klas." #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with dexdump for known non-free classes." -msgstr "Skanowanie pakietu APK za pomocą apkanalyzer w poszukiwaniu znanych niewolnych klas." +msgstr "Skanowanie pakietu APK za pomocą dexdump w poszukiwaniu znanych niewolnych klas." #: ../fdroidserver/common.py #, python-brace-format @@ -2302,7 +2301,7 @@ msgstr "applicationId z opcjonalnym versionCode w postaci APPID [:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" -msgstr "" +msgstr "archive_url musi kończyć się na /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2323,9 +2322,9 @@ msgid "can not parse scrlib spec (not a string): '{}'" msgstr "can not parse scrlib spec (not a string):' {}'" #: /usr/lib/python3.9/argparse.py -#, fuzzy, python-format +#, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "nie można otworzyć '%s':%s" +msgstr "nie można otworzyć „%(filename)s”: %(error)s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2502,9 +2501,8 @@ msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 musi mieć podpis, użyj `fdroid signindex` aby go utworzyć!" #: ../fdroidserver/index.py -#, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v1 musi mieć podpis, użyj `fdroid signindex` aby go utworzyć!" +msgstr "index-v2 musi mieć podpis, użyj `fdroid signindex`, aby go utworzyć!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2697,7 +2695,7 @@ msgstr "repo_icon %s nie istnieje, generuje symbol zastępczy." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" -msgstr "" +msgstr "repo_url musi kończyć się na /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." From 14c7b8e1b8c883d48b6dbccc9ee8cf22d81c9e06 Mon Sep 17 00:00:00 2001 From: Fjuro Date: Wed, 1 Feb 2023 01:47:41 +0100 Subject: [PATCH 0975/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 100.0% (623 of 623 strings) Translated using Weblate: Czech (cs) by Fjuro Currently translated at 98.7% (615 of 623 strings) Co-authored-by: Fjuro Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ Translation: F-Droid/F-Droid Server --- locale/cs/LC_MESSAGES/fdroidserver.po | 35 +++++++++++++-------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 4e41c873..2943a748 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -4,13 +4,14 @@ # Petr Novák , 2021. # Fjuro , 2022. # Filip Klopec , 2022. +# Fjuro , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-08-27 18:18+0000\n" -"Last-Translator: Fjuro \n" +"PO-Revision-Date: 2022-09-08 19:54+0000\n" +"Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" @@ -735,9 +736,9 @@ msgid "ERROR: unsupported CI type, patches welcome!" msgstr "CHYBA: nepodporovaný typ CI, opravy vítány!" #: ../fdroidserver/nightly.py -#, fuzzy, python-format +#, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "CHYBA: nepodporovaný typ CI, opravy vítány!" +msgstr "CHYBA: nepodporovaný git host \"%s\", opravy vítány!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -776,7 +777,7 @@ msgstr "Chyba při získávání adresy repozitáře" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "" +msgstr "Extrahovat metadata aplikace ze zdrojového repozitáře" #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" @@ -1264,7 +1265,7 @@ msgstr "Poškozený řádek serverwebroot:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "" +msgstr "Dosažena maximální hloubka rekurze v souboru ZIP: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1281,7 +1282,7 @@ msgstr "Název ‚%s‘ je pouze automatický název - odstraňte jej" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" +msgstr "V souboru config.yml není nastaven \"repo_pubkey\" ani \"keystorepass\"" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." @@ -1517,7 +1518,7 @@ msgstr "Zobrazit tajnou proměnnou v terminálu pro jednoduché kopírování/vl #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" -msgstr "" +msgstr "Problém se souborem ZIP: %s, chyba %s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1689,9 +1690,9 @@ msgid "Scan the source code of a package" msgstr "Naskenujte zdrojový kód balíčku" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Scanner found {count} problems in {apk}:" -msgstr "Skener našel {count} problémů v {appid}:" +msgstr "Skener našel {count} problémů v {apk}:" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1715,9 +1716,8 @@ msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Skenování APK pomocí apkanalyzer pro známé nesvobodné třídy." #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with dexdump for known non-free classes." -msgstr "Skenování APK pomocí apkanalyzer pro známé nesvobodné třídy." +msgstr "Skenování APK pomocí dexdump na známé nesvobodné třídy." #: ../fdroidserver/common.py #, python-brace-format @@ -2301,7 +2301,7 @@ msgstr "applicationId s nepovinným versionCode ve tvaru APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" -msgstr "" +msgstr "archive_url musí končit na /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2322,9 +2322,9 @@ msgid "can not parse scrlib spec (not a string): '{}'" msgstr "nelze parsovat specifikaci scrlib (není to řetězec): ‚{}‘" #: /usr/lib/python3.9/argparse.py -#, fuzzy, python-format +#, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "nelze otevřít '%s': %s" +msgstr "nelze otevřít '%(filename)s': %(error)s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2501,9 +2501,8 @@ msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 musí mít podpis, použijte `fdroid signindex` pro jeho vytvoření!" #: ../fdroidserver/index.py -#, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v1 musí mít podpis, použijte `fdroid signindex` pro jeho vytvoření!" +msgstr "index-v2 musí mít podpis, použijte `fdroid signindex` pro jeho vytvoření!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2696,7 +2695,7 @@ msgstr "repo_icon %s neexistuje, generování placeholderu." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" -msgstr "" +msgstr "repo_url musí končit na /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." From dfe7e1fbd5170e99975020beb3160231043da980 Mon Sep 17 00:00:00 2001 From: random r Date: Wed, 1 Feb 2023 01:47:42 +0100 Subject: [PATCH 0976/2116] Translated using Weblate: Italian (it) by random r Currently translated at 96.7% (603 of 623 strings) Co-authored-by: random r Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ Translation: F-Droid/F-Droid Server --- locale/it/LC_MESSAGES/fdroidserver.po | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 1576fe64..d141f1b6 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -17,15 +17,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-06-28 20:54+0000\n" -"Last-Translator: Antonello Pirina \n" +"PO-Revision-Date: 2022-09-17 13:20+0000\n" +"Last-Translator: random r \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -741,9 +741,9 @@ msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERRORE: tipo di CI non supportato, le patch sono benvenute!" #: ../fdroidserver/nightly.py -#, fuzzy, python-format +#, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "ERRORE: tipo di CI non supportato, le patch sono benvenute!" +msgstr "ERRORE: host git \"%s\" non supportato, le patch sono benvenute!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1695,9 +1695,9 @@ msgid "Scan the source code of a package" msgstr "Scansiona il codice sorgente di un pacchetto" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Scanner found {count} problems in {apk}:" -msgstr "Scanner trovato {count} problemi in {appid}:" +msgstr "Lo scanner ha trovato {count} problemi in {apk}:" #: ../fdroidserver/scanner.py #, python-brace-format @@ -2320,9 +2320,9 @@ msgid "can not parse scrlib spec (not a string): '{}'" msgstr "impossibile analizzare le specifiche scrlib (non una stringa): '{}'" #: /usr/lib/python3.9/argparse.py -#, fuzzy, python-format +#, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "impossibile aprire \"%s\": %s" +msgstr "impossibile aprire '%(filename)s': %(error)s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py From da735504015780fd19a05c058c9227ed4b56ae2d Mon Sep 17 00:00:00 2001 From: Xiang Heng Wei Date: Wed, 1 Feb 2023 01:47:42 +0100 Subject: [PATCH 0977/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Xiang Heng Wei Currently translated at 76.8% (479 of 623 strings) Translated using Weblate: Chinese (Simplified) (zh_Hans) by Xiang Heng Wei Currently translated at 75.7% (472 of 623 strings) Translated using Weblate: Chinese (Simplified) (zh_Hans) by Xu ZhuoHan Currently translated at 74.9% (467 of 623 strings) Co-authored-by: Xiang Heng Wei Co-authored-by: Xu ZhuoHan Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 269 ++++++++++++++------- 1 file changed, 180 insertions(+), 89 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 361d47eb..b06e8125 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -21,32 +21,40 @@ # yangyangdaji <1504305527@qq.com>, 2022. # Yang Yulin , 2022. # Eric , 2022. +# Xu ZhuoHan , 2022. +# Xiang Heng Wei , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-09-08 14:15+0000\n" -"Last-Translator: Eric \n" -"Language-Team: Chinese (Simplified) \n" +"PO-Revision-Date: 2022-12-04 00:47+0000\n" +"Last-Translator: Xiang Heng Wei \n" +"Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: ../fdroidserver/common.py msgid "" "\n" -" This is a repository of apps to be used with FDroid. Applications in this\n" -" repository are either official binaries built by the original application\n" -" developers, or are binaries built from source by f-droid.org using the\n" +" This is a repository of apps to be used with FDroid. Applications in " +"this\n" +" repository are either official binaries built by the original " +"application\n" +" developers, or are binaries built from source by f-droid.org using " +"the\n" " tools on https://gitlab.com/fdroid.\n" " " msgstr "" "\n" -" 这是 F-Droid 中应用的存储库. 此存储库中之应用二进制文件要么是由源开发者构建的, 要么是由 F-Droid 使用 https://gitlab.com/fdroid 工具从源代码构建的.\n" +" 这是 F-Droid 中应用的存储库. 此存储库中之应用二进制文件要么是由源开发" +"者构建的, 要么是由 F-Droid 使用 https://gitlab.com/fdroid 工具从源代码构建" +"的.\n" " " #: ../fdroidserver/nightly.py @@ -231,7 +239,9 @@ msgstr "{linedesc} 中的 '{field}' 已废弃, 请参阅文档以获取当前字 #: ../fdroidserver/common.py #, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgid "" +"'{field}' will be in random order! Use () or [] brackets if order is " +"important!" msgstr "{field} 将随机排列! 如果顺序很重要, 请使用 () 或 [] 括号!" #: ../fdroidserver/common.py @@ -260,7 +270,8 @@ msgstr ".fdroid.txt 不受支持! 需转换为 .fdroid.yml 或 .fdroid.json." #: ../fdroidserver/lint.py msgid "/issues is missing" -msgstr "路径缺少 /issues ( 译者注: 此处仅支持 github 或 gitlab 之 issues 链接 )" +msgstr "" +"路径缺少 /issues ( 译者注: 此处仅支持 github 或 gitlab 之 issues 链接 )" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" @@ -292,7 +303,9 @@ msgid "Alias of the repo signing key in the keystore" msgstr "密钥库中存储库签名密钥的别名" #: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py -msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgid "" +"Allows a different revision (or git branch) to be specified for the initial " +"import" msgstr "可让运行初始导入时指定不同修订 ( 或 git 分支 )" #: ../fdroidserver/mirror.py @@ -376,7 +389,9 @@ msgid "Archiving {apkfilename} with invalid signature!" msgstr "正使用无效签名归档 {apkfilename}!" #: ../fdroidserver/mirror.py -msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgid "" +"Base URL to mirror, can include the index signing key using the query " +"string: ?fingerprint=" msgstr "镜像的基本链接可以使用此请求参数包含索引签名键: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname @@ -417,8 +432,12 @@ msgstr "仅编译每个应用的最新版本" #: ../fdroidserver/metadata.py #, python-brace-format -msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" -msgstr "构建应使用逗号分隔的 versionName 和 versionCode, 而不是 {linedesc} 中的 {value}" +msgid "" +"Build should have comma-separated versionName and versionCode, not " +"\"{value}\", in {linedesc}" +msgstr "" +"构建应使用逗号分隔的 versionName 和 versionCode, 而不是 {linedesc} 中的 " +"{value}" #: ../fdroidserver/init.py #, python-format @@ -474,13 +493,21 @@ msgstr "检查应用的更新" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "正为 {appid} 检查存档: 安装包: {integer}, 保留版本数: {keep}, 架构安装包: {arch}" +msgid "" +"Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, " +"archapks:{arch}" +msgstr "" +"正为 {appid} 检查存档: 安装包: {integer}, 保留版本数: {keep}, 架构安装包: " +"{arch}" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "正为 {appid} 检查存档: 安装包: {integer}, 保留版本数: {keep}, 架构安装包: {arch}" +msgid "" +"Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, " +"archapks:{arch}" +msgstr "" +"正为 {appid} 检查存档: 安装包: {integer}, 保留版本数: {keep}, 架构安装包: " +"{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -500,7 +527,9 @@ msgid "Commit changes" msgstr "提交更改" #: ../fdroidserver/__main__.py -msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgid "" +"Conflicting arguments: '--verbose' and '--quiet' can not be specified at the " +"same time." msgstr "冲突的参数: '--verbose' 和 '--quiet' 不能被同时使用." #: ../fdroidserver/common.py @@ -684,7 +713,9 @@ msgid "Don't do anything logs-related" msgstr "请勿做任何日志相关的操作" #: ../fdroidserver/build.py -msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgid "" +"Don't refresh the repository, useful when testing a build with no internet " +"connection" msgstr "不刷新资源库,便于没有互联网时的内部版本测试" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py @@ -716,7 +747,8 @@ msgstr "下载 {url} 失败。{error}" #: ../fdroidserver/metadata.py #, python-brace-format -msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" +msgid "" +"Duplicate build recipe found for versionCode {versionCode} in {linedesc}" msgstr "在 {linedesc} 中找到了 versionCode {versionCode} 的重复构建配方" #: ../fdroidserver/lint.py @@ -756,8 +788,12 @@ msgstr "位于 {linedesc} 的空构建标志" #: ../fdroidserver/__main__.py #, python-brace-format -msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "编码被设置为“{enc}”,可能会导致 fdroid 出现编码问题。为了最佳效果,请将其更改为“UTF-8”。" +msgid "" +"Encoding is set to '{enc}' fdroid might run into encoding issues. Please set " +"it to 'UTF-8' for best results." +msgstr "" +"编码被设置为“{enc}”,可能会导致 fdroid 出现编码问题。为了最佳效果,请将其更改" +"为“UTF-8”。" #: ../fdroidserver/init.py #, python-format @@ -786,7 +822,7 @@ msgstr "获取存储库地址时出错" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "" +msgstr "从源存储库中提取应用程序元数据" #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" @@ -887,7 +923,9 @@ msgid "Forbidden HTML tags" msgstr "禁止的HTML标签" #: ../fdroidserver/build.py -msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgid "" +"Force build of disabled apps, and carries on regardless of scan problems. " +"Only allowed in test mode." msgstr "强制编译已禁用应用,忽略扫描出错。仅用于测试模式。" #: ../fdroidserver/build.py @@ -1138,7 +1176,8 @@ msgstr "无效的项目符号列表" #: ../fdroidserver/lint.py #, python-format -msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" +msgid "" +"Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" msgstr "无效的许可证标签“%s”!仅使用 https://spdx.org/license-list 中的标签" #: ../fdroidserver/lint.py @@ -1218,7 +1257,8 @@ msgid "Java compiled class" msgstr "Java 编译类" #: ../fdroidserver/signindex.py -msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgid "" +"Java jarsigner not found! Install in standard location or set java_paths!" msgstr "未找到 Java jarsigner!安装在标准位置或设置java_paths!" #: ../fdroidserver/lint.py @@ -1236,8 +1276,10 @@ msgstr "签名密钥的密钥库:\t" #: ../fdroidserver/lint.py #, python-brace-format -msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "最后使用的提交 '{commit}' 看起来像一个标签,但 UpdateCheckMode 是 '{ucm}'" +msgid "" +"Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" +"最后使用的提交 '{commit}' 看起来像一个标签,但 UpdateCheckMode 是 '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" @@ -1274,7 +1316,7 @@ msgstr "格式错误的服务器网络根行:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "" +msgstr "达到 ZIP 文件中的最大递归深度:%s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1291,7 +1333,7 @@ msgstr "名称 '%s' 只是自动名称 - 删除它" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" +msgstr "config.yml 中既没有设置“repo_pubkey”也没有设置“keystorepass”" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." @@ -1527,7 +1569,7 @@ msgstr "将秘密变量打印到终端以便于复制/粘贴" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" -msgstr "" +msgstr "ZIP 文件问题:%s,错误 %s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1605,8 +1647,11 @@ msgstr "读取 minSdkVersion 失败:\"{apkfilename}\"" #. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/common.py #, python-brace-format -msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" -msgstr "读取 packageName/versionCode/versionName 失败,APK 无效:'{apkfilename}'" +msgid "" +"Reading packageName/versionCode/versionName failed, APK invalid: " +"'{apkfilename}'" +msgstr "" +"读取 packageName/versionCode/versionName 失败,APK 无效:'{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format @@ -1614,7 +1659,9 @@ msgid "Reading {apkfilename} from cache" msgstr "从缓存读取 {apkfilename}" #: ../fdroidserver/stats.py -msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." +msgid "" +"Recalculate aggregate stats - use when changes have been made that would " +"invalidate old cached data." msgstr "重新计算聚合统计数据-当已经做出更改而导致旧的缓存数据无效时使用。" #: ../fdroidserver/common.py @@ -1639,7 +1686,9 @@ msgid "Report on build data status" msgstr "报告编译数据状态" #: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgid "" +"Reset and create a brand new build server, even if the existing one appears " +"to be ok." msgstr "即使已有服务器看起来运行正常,请重置并创建一个全新的编译服务器。" #: ../fdroidserver/nightly.py @@ -1733,29 +1782,29 @@ msgstr "设置 NDK {release} ({version})" #: ../fdroidserver/common.py msgid "Set clock to that time using:" -msgstr "" +msgstr "使用以下方法将时钟设置为该时间:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "" +msgstr "在存档旧版本之前,在存储库中设置最大版本数" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" -msgstr "" +msgstr "将打开文件限制设置为 {integer}" #: ../fdroid ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" -msgstr "" +msgstr "为每日构建存储库设置应用构建" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " -msgstr "" +msgstr "设置打开文件限制失败: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" -msgstr "" +msgstr "为此构建设置 {0} 秒超时" #: ../fdroid ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" @@ -1772,32 +1821,32 @@ msgstr "跳过二进制源码扫描和其他问题" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" -msgstr "" +msgstr "跳过签名无效的“{apkfilename}”!" #: ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "跳过 GitLab 页面镜像,因为存储库太大(> %.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" -msgstr "" +msgstr "跳过 {appid} 的索引生成" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" -msgstr "" +msgstr "跳过 {apkfilename} ,签名无效!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" -msgstr "" +msgstr "正在跳过 {appid}:已禁用" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: no builds specified" -msgstr "" +msgstr "正在跳过 {appid}:未指定内部版本" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "Specify a local folder to sync the repo to" @@ -1813,7 +1862,7 @@ msgstr "指定在编译服务器上运行" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." -msgstr "" +msgstr "指定要使用的调试密钥库文件。" #: ../fdroidserver/common.py msgid "Spew out even more information than normal" @@ -1822,45 +1871,49 @@ msgstr "比一般情况输出更多的信息" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Striping mystery signature from {apkfilename}" -msgstr "" +msgstr "从 {apkfilename} 中剥离神秘签名" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" -msgstr "" +msgstr "从 {apkfilename} 中剥离神秘签名" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" -msgstr "" +msgstr "摘要“%s”只是应用程序的名称" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" -msgstr "" +msgstr "长度摘要 {length} 超过 {limit} 字符限制" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" -msgstr "" +msgstr "系统时钟早于 {path} 中的日期!" #: ../fdroidserver/checkupdates.py -msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" +msgid "" +"Tags update mode only works for git, hg, bzr and git-svn repositories " +"currently" +msgstr "标签更新模式目前仅适用于 git、hg、bzr 和 git-svn 存储库" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" +msgstr "git-svn 中使用的标记更新模式,但未使用标记设置存储库" #: ../fdroidserver/build.py -msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgid "" +"Test mode - put output in the tmp directory only, and always build, even if " +"the output already exists." msgstr "测试模式:仅将输出保存至 tmp 目录,即使输出已存在,仍然编译。" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" -msgstr "" +msgstr "OBB 版本号必须位于“{name}”之后:" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" @@ -1868,11 +1921,11 @@ msgstr "资源库基 URL的日志(默认为 https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" -msgstr "" +msgstr "写入镜像的目录" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" -msgstr "" +msgstr "要包含在存储库中的文件(path 或 glob)" #: ../fdroidserver/deploy.py msgid "The only commands currently supported are 'init' and 'update'" @@ -1880,33 +1933,40 @@ msgstr "当前支持的命令只有'init'和'update'" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." -msgstr "" +msgstr "存储库的指纹不匹配。" #: ../fdroidserver/common.py msgid "The repository's index could not be verified." -msgstr "" +msgstr "无法验证存储库的索引。" #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" -msgstr "" +msgstr "local_copy_dir“{path}”的根目录不存在!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" -msgstr "" +msgstr "存在密钥别名冲突 - 发布已停止" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." -msgstr "" +msgstr "这些是已从主存储库存档的应用。" #: ../fdroidserver/common.py -msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "这是一个与F-Droid一起使用的应用的存储库。这个存储库中的应用要么是原应用开发者构建的官方二进制文件,要么是 f-droid.org 的管理员使用 https://gitlab.com/fdroid 上的工具从源代码构建而来的二进制文件。" +msgid "" +"This is a repository of apps to be used with F-Droid. Applications in this " +"repository are either official binaries built by the original application " +"developers, or are binaries built from source by the admin of f-droid.org " +"using the tools on https://gitlab.com/fdroid." +msgstr "" +"这是一个与F-Droid一起使用的应用的存储库。这个存储库中的应用要么是原应用开发者" +"构建的官方二进制文件,要么是 f-droid.org 的管理员使用 https://gitlab.com/" +"fdroid 上的工具从源代码构建而来的二进制文件。" #: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" -msgstr "" +msgstr "此存储库已具有本地元数据:%s" #: ../fdroidserver/init.py #, python-format @@ -1919,50 +1979,66 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" +"要完成设置,请将您的 APK 添加到“%s”\n" +"然后运行“FDrod 更新 -C;FDroid更新”。 您可能还想编辑\n" +"“config.yml”来设置 URL、存储库名称等。 您还应该设置\n" +"签名密钥(可能已自动生成临时密钥)。\n" +"\n" +"更多信息: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"和 https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgid "" +"To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config." +"yml!" msgstr "" +"要使用 awsbucket,还必须在 config.yml 中设置 awssecretkey 和 awsaccesskeyid!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" -msgstr "" +msgstr "网址必须以 https:// 或 http:// 开头" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" -msgstr "" +msgstr "不应使用 URL 缩短器" #: ../fdroidserver/metadata.py msgid "URL title is just the URL, use brackets: [URL]" -msgstr "" +msgstr "网址标题只能是网址,用中括号括住:[网址]" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" -msgstr "" +msgstr "描述中的网址 {url}:{error}" #: ../fdroidserver/lint.py -msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgid "" +"Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from " +"https://spdx.org/license-list" msgstr "" +"意外的许可证标签“{}”!仅使用来自 https://spdx.org/license-list 的 FSF 或 OSI " +"批准的标签" #: ../fdroidserver/lint.py -msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "" +msgid "" +"Unexpected license tag \"{}\"! Only use license tags configured in your " +"config file" +msgstr "意外的许可证标签“{}”!仅使用配置文件中配置的许可证标记" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" +msgstr "意外的符号链接目标:{link} -> {target}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unexpected text on same line as {field} in {linedesc}" -msgstr "" +msgstr "与 {linedesc} 中的 {field} 在同一行上出现意外文本" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "" +msgstr "{configname} 中的未知条目 {key}" #: ../fdroid ../fdroidserver/__main__.py msgid "Unknown exception found!" @@ -2114,7 +2190,8 @@ msgid "UpdateCheckData not a valid URL: {url}" msgstr "" #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" +msgid "" +"UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" msgstr "" #. Translators: https://developer.android.com/studio/build/application-id @@ -2177,7 +2254,8 @@ msgid "Using APK Signature v3" msgstr "" #: ../fdroidserver/common.py -msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgid "" +"Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" #: ../fdroidserver/common.py @@ -2213,7 +2291,9 @@ msgstr "验证目录签名中:" #: ../fdroidserver/deploy.py #, python-brace-format -msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgid "" +"VirusTotal API key cannot upload files larger than 32MB, use {url} to upload " +"{path}." msgstr "" #: ../fdroid ../fdroidserver/__main__.py @@ -2221,11 +2301,15 @@ msgid "Warn about possible metadata errors" msgstr "有关元数据可能出现的错误的警告" #: ../fdroidserver/update.py -msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgid "" +"When configured for signed indexes, create only unsigned indexes at this " +"stage" msgstr "如果已配置为使用签名索引,该阶段仅创建未签名索引" #: ../fdroidserver/lint.py -msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgid "" +"When linting the entire repository yamllint is disabled by default. This " +"option forces yamllint regardless." msgstr "" msgid "X.509 'Distiguished Name' used when generating keys" @@ -2526,7 +2610,9 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format -msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgid "" +"invalid option string %(option)r: must start with a character " +"%(prefix_chars)r" msgstr "" #: ../fdroidserver/checkupdates.py @@ -2536,7 +2622,8 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format -msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgid "" +"local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir未以“ fdroid”结尾,也许你指的是:“ {path}”" #: ../fdroidserver/deploy.py @@ -2671,12 +2758,16 @@ msgstr "" #: ../fdroidserver/signatures.py #, python-brace-format -msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgid "" +"refuse downloading via insecure HTTP connection (use HTTPS or specify --no-" +"https-check): {apkfilename}" msgstr "" #: ../fdroidserver/signatures.py #, python-brace-format -msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" +msgid "" +"refuse downloading via insecure http connection (use https or specify --no-" +"https-check): {apkfilename}" msgstr "" #: ../fdroidserver/index.py From 46ccddfede24bd0845d7da7902407bbf9b70f6c2 Mon Sep 17 00:00:00 2001 From: nautilusx Date: Wed, 1 Feb 2023 01:47:43 +0100 Subject: [PATCH 0978/2116] Translated using Weblate: German (de) by nautilusx Currently translated at 100.0% (623 of 623 strings) Co-authored-by: nautilusx Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 34 +++++++++++++-------------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 026b7f01..6f54692f 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -24,7 +24,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-03-01 21:48+0000\n" +"PO-Revision-Date: 2022-09-30 17:55+0000\n" "Last-Translator: nautilusx \n" "Language-Team: German \n" "Language: de\n" @@ -32,7 +32,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11.1-dev\n" +"X-Generator: Weblate 4.14.1\n" #: ../fdroidserver/common.py msgid "" @@ -749,9 +749,9 @@ msgid "ERROR: unsupported CI type, patches welcome!" msgstr "FEHLER: nicht unterstützter CI-Typ, Patches willkommen!" #: ../fdroidserver/nightly.py -#, fuzzy, python-format +#, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "FEHLER: nicht unterstützter CI-Typ, Patches willkommen!" +msgstr "FEHLER: nicht unterstützter Git-Host \"%s\", Patches willkommen!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -790,7 +790,7 @@ msgstr "Fehler bei der Ermittlung der Repro-Adresse" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "" +msgstr "Extrahieren von Anwendungsmetadaten aus einem Quell-Repository" #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" @@ -1278,7 +1278,7 @@ msgstr "Fehlerhafte serverwebroot Zeile:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "" +msgstr "Maximale Rekursionstiefe in ZIP-Datei erreicht: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1295,7 +1295,7 @@ msgstr "Name '%s' ist nur der automatische Name - entfernen Sie ihn" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" +msgstr "Weder \"repo_pubkey\" noch \"keystorepass\" in config.yml gesetzt" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." @@ -1531,7 +1531,7 @@ msgstr "Drucken der geheimen Variable in das Terminal zum einfachen Kopieren/Ein #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" -msgstr "" +msgstr "Problem mit der ZIP-Datei: %s, Fehler %s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1703,9 +1703,9 @@ msgid "Scan the source code of a package" msgstr "Quellcode eines Programmpakets durchsuchen" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Scanner found {count} problems in {apk}:" -msgstr "Scanner fand {count} Probleme in {appid}:" +msgstr "Scanner fand {count} Probleme in {apk}:" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1728,9 +1728,8 @@ msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "APK mit apkanalyzer nach bekannten nicht-quelloffenen Klassen scannen." #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with dexdump for known non-free classes." -msgstr "APK mit apkanalyzer nach bekannten nicht-quelloffenen Klassen scannen." +msgstr "APK mit dexdump nach bekannten nicht-quelloffenen Klassen scannen." #: ../fdroidserver/common.py #, python-brace-format @@ -2314,7 +2313,7 @@ msgstr "App-ID mit optionalem Versionscode in der Form APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" -msgstr "" +msgstr "archive_url muss mit /archive enden" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2335,9 +2334,9 @@ msgid "can not parse scrlib spec (not a string): '{}'" msgstr "kann scrlib-Spezifikation nicht parsen (keine Zeichenkette): '{}'" #: /usr/lib/python3.9/argparse.py -#, fuzzy, python-format +#, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "„%s” konnte nicht geöffnet werden: %s" +msgstr "'%(filename)s' kann nicht geöffnet werden: %(error)s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2512,9 +2511,8 @@ msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 muß eine Signatur haben, verwenden Sie `fdroid signindex` um sie zu erzeugen!" #: ../fdroidserver/index.py -#, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v1 muß eine Signatur haben, verwenden Sie `fdroid signindex` um sie zu erzeugen!" +msgstr "index-v2 muss eine Signatur haben, verwenden Sie `fdroid signindex`, um sie zu erstellen!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2707,7 +2705,7 @@ msgstr "repo_icon %s existiert nicht, erzeuge Platzhalter." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" -msgstr "" +msgstr "repo_url muss mit /repo enden" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." From b26942e0fdb79ebf6779fcd842b413ca3dc04ccc Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Wed, 1 Feb 2023 01:47:45 +0100 Subject: [PATCH 0979/2116] Translated using Weblate: Spanish (es) by gallegonovato Currently translated at 100.0% (623 of 623 strings) Translated using Weblate: Spanish (es) by gallegonovato Currently translated at 97.7% (609 of 623 strings) Co-authored-by: gallegonovato Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ Translation: F-Droid/F-Droid Server --- locale/es/LC_MESSAGES/fdroidserver.po | 59 +++++++++++++-------------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 1bf257ec..d31b40f5 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -12,20 +12,21 @@ # Iago , 2022. # Iago , 2022. # Jaime Marquínez Ferrándiz , 2022. +# gallegonovato , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-09-06 14:30+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2022-12-09 13:49+0000\n" +"Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: ../fdroidserver/common.py msgid "" @@ -502,7 +503,7 @@ msgstr "Argumentos incompatibles: No se puede especificar \"--verbose\" y \"--qu #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "¡Conflicto de ficheros de configuración! Usando {newfile}, ignorando {oldfile}." +msgstr "Archivos de configuración en conflicto. ¡Usando {newfile}, ignorando {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format @@ -741,9 +742,9 @@ msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERROR: tipo de CI no soportado, ¡se aceptan parches!" #: ../fdroidserver/nightly.py -#, fuzzy, python-format +#, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "ERROR: tipo de CI no soportado, ¡se aceptan parches!" +msgstr "ERROR: host git no soportado \"%s\", ¡parches bienvenidos!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -782,7 +783,7 @@ msgstr "Error al obtener la dirección del repositorio" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "" +msgstr "Extraer los metadatos de la aplicación de un repositorio de origen" #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" @@ -966,9 +967,8 @@ msgid "Git fetch failed" msgstr "Git fetch falló" #: ../fdroidserver/common.py -#, fuzzy msgid "Git prune failed" -msgstr "Git reset falló" +msgstr "Falló la extracción de Git" #: ../fdroidserver/common.py msgid "Git remote set-head failed" @@ -1122,7 +1122,7 @@ msgstr "Valor booleano no válido '%s'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid build flag at {line} in {linedesc}" -msgstr "Bandera de compilación no válida en {line} en {linedesc}" +msgstr "Marca de la compilación no válida en la {line} en {linedesc}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1223,9 +1223,9 @@ msgid "Javascript in HTML src attributes" msgstr "Javascript en atributos src de HTML src" #: ../fdroidserver/build.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "Conservando la compilación fallida \"{apkfilename}\"" +msgstr "Mantener la compilación fallida \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" @@ -1271,7 +1271,7 @@ msgstr "Línea serverwebroot mal formada:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "" +msgstr "Se alcanzó el máximo en el archivo ZIP: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1288,7 +1288,7 @@ msgstr "El nombre '%s' es simplemente el nombre automático - elimínelo" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" +msgstr "Ni \"repo_pubkey\" ni \"keystorepass\" establecidos en config.yml" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." @@ -1524,7 +1524,7 @@ msgstr "Mostrar la variable secreta en el terminal para copiar/pegar fácilmente #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" -msgstr "" +msgstr "Problema con el archivo ZIP: %s, error %s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1696,9 +1696,9 @@ msgid "Scan the source code of a package" msgstr "Escanear el código fuente de un paquete" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Scanner found {count} problems in {apk}:" -msgstr "El escáner encontró {count} problemas en {appid}:" +msgstr "El escáner encontró {count} problemas en {apk}:" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1717,19 +1717,17 @@ msgstr[0] "El escáner encontró {} problema" msgstr[1] "El escáner encontró {} problemas" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with apkanalyzer for known non-free classes." -msgstr "Escaneando el APK con apkanalyzer en busca de clases no libres conocidas." +msgstr "El escaneo del APK con apkanalyzer para clases no gratuitas conocidas." #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with dexdump for known non-free classes." -msgstr "Escaneando el APK con apkanalyzer en busca de clases no libres conocidas." +msgstr "Escaneo del APK con dexdump para clases no gratuitas conocidas." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "" +msgstr "Configurar el NDK de {release} ({version}) arriba" #: ../fdroidserver/common.py msgid "Set clock to that time using:" @@ -2146,7 +2144,7 @@ msgstr "Subiendo {apkfilename} a virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "Usage" -msgstr "Uso" +msgstr "Utilización" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2308,7 +2306,7 @@ msgstr "applicationId con código de versión opcional en la forma APPID [: VERC #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" -msgstr "" +msgstr "El archive_url debe terminar con /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2329,9 +2327,9 @@ msgid "can not parse scrlib spec (not a string): '{}'" msgstr "no se puede procesar (no es una cadena) la especificación scrlib: '{}'" #: /usr/lib/python3.9/argparse.py -#, fuzzy, python-format +#, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "no se puede abrir '%s': %s" +msgstr "no se puede abrir '%(filename)s': %(error)s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2506,9 +2504,8 @@ msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "¡index-v1 tiene que tener una firma, use `fdroid signindex` para crearla!" #: ../fdroidserver/index.py -#, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "¡index-v1 tiene que tener una firma, use `fdroid signindex` para crearla!" +msgstr "index-v2 debe tener una firma, ¡ use `f droid signindex` para crearla!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2701,7 +2698,7 @@ msgstr "No existe repo_icon %s. Reservando espacio." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" -msgstr "" +msgstr "repo_url debe terminar con /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." @@ -2713,9 +2710,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sync indexa {path} a {url} y elimina" #: ../fdroidserver/scanner.py -#, fuzzy, python-format +#, python-format msgid "scanner not cleanly run apkanalyzer: %s" -msgstr "El escáner no ejecutó apkanalyzer adecuadamente: %s" +msgstr "el escáner no ejecuta adecuadamente apkanalyzer: %s" #: ../fdroidserver/scanner.py msgid "shared library" From fd9911d41b10a37854970926255f69a724845c09 Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 1 Feb 2023 01:47:47 +0100 Subject: [PATCH 0980/2116] Translated using Weblate: Ukrainian (uk) by Dan Currently translated at 100.0% (623 of 623 strings) Co-authored-by: Dan Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index e3dfd7f7..e1be850f 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -5,20 +5,21 @@ # Ihor Hordiichuk , 2020, 2021, 2022. # Tymofij Lytvynenko , 2021. # DankXylese , 2021. +# Dan , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-09-08 14:15+0000\n" -"Last-Translator: Ihor Hordiichuk \n" +"PO-Revision-Date: 2022-12-15 13:16+0000\n" +"Last-Translator: Dan \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: ../fdroidserver/common.py msgid "" @@ -261,7 +262,7 @@ msgstr "Додати підписи GnuPG для пакунків у репоз #: ../fdroid ../fdroidserver/__main__.py msgid "Add a new application from its source code" -msgstr "Додайте новий застосунку зі свого вихідного коду" +msgstr "Додайте новий застосунок зі свого вихідного коду" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" From adf039286c7aeda913ab0d1bfc72cc10f82fb6c3 Mon Sep 17 00:00:00 2001 From: ZZY2357 Date: Wed, 1 Feb 2023 01:47:47 +0100 Subject: [PATCH 0981/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by ZZY2357 Currently translated at 75.9% (473 of 623 strings) Co-authored-by: ZZY2357 Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index b06e8125..36d1ec5d 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -807,7 +807,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "没有设置 {configname} 中的环境变量 {var}!" +msgstr "来自 {configname} 的环境变量没有被设置!" #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py From ca5f40273374d1eb03c9048f9e121d7136cd6123 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BF=AB=E4=B9=90=E7=9A=84=E8=80=81=E9=BC=A0=E5=AE=9D?= =?UTF-8?q?=E5=AE=9D?= Date: Wed, 1 Feb 2023 01:47:47 +0100 Subject: [PATCH 0982/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Chine?= =?UTF-8?q?se=20(Simplified)=20(zh=5FHans)=20by=20=E5=BF=AB=E4=B9=90?= =?UTF-8?q?=E7=9A=84=E8=80=81=E9=BC=A0=E5=AE=9D=E5=AE=9D=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 75.9% (473 of 623 strings) Co-authored-by: 快乐的老鼠宝宝 Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 36d1ec5d..6fc5fe50 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -702,7 +702,7 @@ msgstr "不提示输入 Android SDK 路径,仅显示失败" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" -msgstr "不要删除从密钥库生成的私钥" +msgstr "不要从密钥库删除已生成的私钥" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" From db74db3ccc24b464f20823922b413116db1ab3e5 Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 1 Feb 2023 01:47:48 +0100 Subject: [PATCH 0983/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Eric Currently translated at 75.9% (473 of 623 strings) Co-authored-by: Eric Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 6fc5fe50..59548471 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -807,7 +807,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "来自 {configname} 的环境变量没有被设置!" +msgstr "没有设置 {configname} 中的环境变量 {var}!" #: ../fdroidserver/deploy.py ../fdroidserver/checkupdates.py #: ../fdroidserver/upload.py From 136c5bffc68ab4ce7790a2fdb303a644e9dbd5ee Mon Sep 17 00:00:00 2001 From: Sergii Horichenko Date: Wed, 1 Feb 2023 01:47:52 +0100 Subject: [PATCH 0984/2116] Translated using Weblate: Ukrainian (uk) by Sergii Horichenko Currently translated at 100.0% (623 of 623 strings) Co-authored-by: Sergii Horichenko Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index e1be850f..666abf1b 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -6,20 +6,21 @@ # Tymofij Lytvynenko , 2021. # DankXylese , 2021. # Dan , 2022. +# Sergii Horichenko , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-12-15 13:16+0000\n" -"Last-Translator: Dan \n" +"PO-Revision-Date: 2023-01-15 21:28+0000\n" +"Last-Translator: Sergii Horichenko \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 4.15.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -262,7 +263,7 @@ msgstr "Додати підписи GnuPG для пакунків у репоз #: ../fdroid ../fdroidserver/__main__.py msgid "Add a new application from its source code" -msgstr "Додайте новий застосунок зі свого вихідного коду" +msgstr "Додайте нову програму з її початкового коду" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" @@ -1688,7 +1689,7 @@ msgstr "Перевірити отриманий файл APK на наявніс #: ../fdroid ../fdroidserver/__main__.py msgid "Scan the source code of a package" -msgstr "Сканування джерельного коду пакунка" +msgstr "Сканування початкового коду пакунка" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1761,7 +1762,7 @@ msgstr "Запис індексів, створених за допомогою #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" -msgstr "Пропустити сканування вихідного коду для двійкових файлів та інших проблем" +msgstr "Пропустити сканування початкового коду на наявність двійкових файлів та інших проблем" #: ../fdroidserver/update.py #, python-brace-format @@ -2962,9 +2963,9 @@ msgstr "{url} не починається на \"http\"!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" -msgstr[0] "{} не вдалося створити" -msgstr[1] "{} не вдалося створити" -msgstr[2] "{} не вдалося створити" +msgstr[0] "{} не вдалося зібрати" +msgstr[1] "{} не вдалося зібрати" +msgstr[2] "{} не вдалося зібрати" #: ../fdroidserver/build.py msgid "{} build succeeded" From bf12406b9827ce78ad4c4ee27daf37510d626dc7 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Wed, 1 Feb 2023 01:47:53 +0100 Subject: [PATCH 0985/2116] Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk Currently translated at 100.0% (623 of 623 strings) Co-authored-by: Ihor Hordiichuk Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 666abf1b..6df408a1 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -2,7 +2,7 @@ # Copyright (C) YEAR Free Software Foundation, Inc. # Hans-Christoph Steiner , 2020. # ihor_ck , 2020. -# Ihor Hordiichuk , 2020, 2021, 2022. +# Ihor Hordiichuk , 2020, 2021, 2022, 2023. # Tymofij Lytvynenko , 2021. # DankXylese , 2021. # Dan , 2022. @@ -12,8 +12,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2023-01-15 21:28+0000\n" -"Last-Translator: Sergii Horichenko \n" +"PO-Revision-Date: 2023-01-16 14:02+0000\n" +"Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" @@ -263,7 +263,7 @@ msgstr "Додати підписи GnuPG для пакунків у репоз #: ../fdroid ../fdroidserver/__main__.py msgid "Add a new application from its source code" -msgstr "Додайте нову програму з її початкового коду" +msgstr "Додайте новий застосунок з його початкового коду" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" @@ -388,7 +388,7 @@ msgstr "Недійсне посилання: {path}" #: ../fdroid ../fdroidserver/__main__.py msgid "Build a package from source" -msgstr "Побудувати пакунок з джерела" +msgstr "Зібрати пакунок з джерела" #: ../fdroidserver/build.py msgid "Build all applications available" From e3e64b8a42c7d2eff5100fb04fcbe0bec4958a5a Mon Sep 17 00:00:00 2001 From: Pixel-Tux Date: Wed, 1 Feb 2023 01:47:53 +0100 Subject: [PATCH 0986/2116] Translated using Weblate: Italian (it) by Pixel-Tux Currently translated at 99.0% (617 of 623 strings) Translated using Weblate: Italian (it) by Pixel-Tux Currently translated at 98.7% (615 of 623 strings) Translated using Weblate: Italian (it) by Pixel-Tux Currently translated at 97.5% (608 of 623 strings) Co-authored-by: Pixel-Tux Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ Translation: F-Droid/F-Droid Server --- locale/it/LC_MESSAGES/fdroidserver.po | 44 +++++++++++++-------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index d141f1b6..7ee6af4e 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -12,20 +12,21 @@ # mondstern , 2021. # Frankie McEyes , 2022. # Antonello Pirina , 2022. +# Pixel-Tux , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-09-17 13:20+0000\n" -"Last-Translator: random r \n" +"PO-Revision-Date: 2023-01-29 13:57+0000\n" +"Last-Translator: Pixel-Tux \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" #: ../fdroidserver/common.py msgid "" @@ -782,7 +783,7 @@ msgstr "Errore nell'ottenere l'indirizzo del repo" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "" +msgstr "Estrarre i metadati dell'applicazione da una repository di origine" #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" @@ -1270,7 +1271,7 @@ msgstr "Riga del serverwebroot malformata:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "" +msgstr "Raggiunta la massima profondità di ricorsione nel file ZIP: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1287,7 +1288,7 @@ msgstr "Il nome '%s' è solo il nome automatico - rimuovilo" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" +msgstr "Né \"repo_pubkey\" o \"keystorepass\" sono stati impostati in config.yml" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." @@ -1523,7 +1524,7 @@ msgstr "Stampa la variabile segreta sul terminale per un facile copia/incolla" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" -msgstr "" +msgstr "Problema con il file ZIP: %s, errore %s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1628,7 +1629,7 @@ msgstr "Rinomina i file APK che non corrispondono a package.name_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "La modalità di aggiornamento RepoTrunk ha senso solo nei repository git-svn" #: ../fdroidserver/update.py msgid "Report on build data status" @@ -1720,14 +1721,13 @@ msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Scansiona gli APK con apkanalyzer per le classi non libere note." #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with dexdump for known non-free classes." -msgstr "Scansiona gli APK con apkanalyzer per le classi non libere note." +msgstr "Scansiona gli APK con apkanalyzer per le classi note non libere." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "" +msgstr "Impostare NDK {release} ({version})" #: ../fdroidserver/common.py msgid "Set clock to that time using:" @@ -1844,11 +1844,11 @@ msgstr "L'orologio di sistema è più vecchio della data in {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" +msgstr "La modalità di aggiornamento dei tag attualmente funziona solo per i repository git, hg, bzr e git-svn" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" +msgstr "Modalità di aggiornamento dei tag utilizzata in git-svn, ma il repo non è stato configurato con i tag" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." @@ -2078,7 +2078,7 @@ msgstr "Percorso scanignore non utilizzato: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "Decomposizione in %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -2299,7 +2299,7 @@ msgstr "applicationId con versionCode opzionale nella forma APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" -msgstr "" +msgstr "archive_url deve terminare con /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2402,7 +2402,7 @@ msgstr "creato {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "la versione attuale è più recente: old vercode={old}, new vercode={new}" #: ../fdroidserver/update.py #, python-brace-format @@ -2499,7 +2499,7 @@ msgstr "index-v1 deve avere una firma, usa `fdroid signindex` per crearla!" #: ../fdroidserver/index.py #, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v1 deve avere una firma, usa `fdroid signindex` per crearla!" +msgstr "index-v2 deve avere una firma, usare `fdroid signindex` per crearla!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2531,9 +2531,9 @@ msgid "invalid option string %(option)r: must start with a character %(prefix_ch msgstr "stringa di opzioni non valida %(option)r: deve iniziare con un carattere %(prefix_chars)r" #: ../fdroidserver/checkupdates.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "ultima ricetta di costruzione è più recente: vecchio vercode={old}, nuovo vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2692,7 +2692,7 @@ msgstr "repo_icon %s non esiste, genera un segnaposto." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" -msgstr "" +msgstr "Il repo_url deve terminare con /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." @@ -2856,7 +2856,7 @@ msgstr "{appid} da {path} non è un nome di pacchetto Java valido!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid} ha sia APK che file: {files}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2942,7 +2942,7 @@ msgstr "{path} più di 200MB, caricare manualmente: {url}" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{path}: {error}" -msgstr "Copia non riuscita {path}: {error}" +msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format From 5c8ab5581384c9e533a0e71c371e8e7cb0137e54 Mon Sep 17 00:00:00 2001 From: RainSlide Date: Wed, 1 Feb 2023 01:47:54 +0100 Subject: [PATCH 0987/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by RainSlide Currently translated at 78.8% (491 of 623 strings) Translated using Weblate: Chinese (Simplified) (zh_Hans) by RainSlide Currently translated at 77.2% (481 of 623 strings) Co-authored-by: RainSlide Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 70 +++++++++++----------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 59548471..cb66744f 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -23,21 +23,21 @@ # Eric , 2022. # Xu ZhuoHan , 2022. # Xiang Heng Wei , 2022. +# RainSlide , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-12-04 00:47+0000\n" -"Last-Translator: Xiang Heng Wei \n" -"Language-Team: Chinese (Simplified) \n" +"PO-Revision-Date: 2023-01-30 21:55+0000\n" +"Last-Translator: RainSlide \n" +"Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 4.16-dev\n" #: ../fdroidserver/common.py msgid "" @@ -85,7 +85,7 @@ msgstr "" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" -msgstr "\"%s/\" 不与任何元数据文件匹配!" +msgstr "\"%s/\" 没有与之匹配的元数据文件!" #: ../fdroidserver/index.py #, python-brace-format @@ -119,7 +119,7 @@ msgstr "\"{path}\" 存在, 但 s3cmd 未安装!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "\"{path}\" 不是被支持的格式 ( 使用: metadata/*.yml )" +msgstr "\"{path}\" 不是受支持的文件格式(请用:metadata/*.yml)" #: ../fdroidserver/metadata.py #, python-brace-format @@ -152,7 +152,7 @@ msgstr "%(prog)s [选项] 链接" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" -msgstr "%(prog)s: 错误: %(message)s\n" +msgstr "%(prog)s:错误:%(message)s\n" #: ../fdroidserver/scanner.py #, python-format @@ -257,7 +257,7 @@ msgstr "'{value}' 不是 {appid} 之有效 {field}. 正则表达式: {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" -msgstr "...为 {appid} 检查更新失败: {error}" +msgstr "…为 {appid} 检查更新失败: {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -743,7 +743,7 @@ msgstr "下载仓库已经失败了一次,不再尝试。" #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" -msgstr "下载 {url} 失败。{error}" +msgstr "{url} 下载失败。{error}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -769,17 +769,17 @@ msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" -"错误:请不要使用此命令镜像 f-droid.org!\n" -"对 f-droid.org 进行完整镜像需要超过 200GB 的储存空间。" +"错误:请不要使用此命令来镜像 f-droid.org!\n" +"对 f-droid.org 进行完整镜像至少需要超过 200GB 的储存空间。" #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" -msgstr "错误:不支持此类 CI,如果有能力请帮我们添加支持!" +msgstr "错误:不支持的 CI 类型,欢迎提交补丁添加支持!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "错误:不支持的 git 主机“%s”,欢迎提交补丁!" +msgstr "错误:不支持的 git 主机类型 \"%s\",欢迎提交补丁添加支持!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -836,7 +836,7 @@ msgstr "复制 {path} 失败:{error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" -msgstr "获取“{apkfilename}”的签名时出错:{error}" +msgstr "获取 '{apkfilename}' 的签名时出错:{error}" #: ../fdroidserver/update.py #, python-brace-format @@ -878,7 +878,7 @@ msgstr "未能获取APK签名密钥指纹" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" -msgstr "无法在 {dev} 上安装“{apkfilename}”:{error}" +msgstr "无法在 {dev} 上安装 '{apkfilename}':{error}" #: ../fdroidserver/publish.py ../fdroidserver/common.py msgid "Failed to sign application" @@ -964,7 +964,7 @@ msgstr "在{path}中发现多个JAR签名块文件" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" -msgstr "找到多个{appid}的元数据文件" +msgstr "找到多个 {appid} 的元数据文件" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." @@ -992,7 +992,7 @@ msgstr "在{url}发现{apkfilename}" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" -msgstr "生成了{appid}的骨架元数据" +msgstr "已生成 {appid} 的主干元数据" #: ../fdroidserver/common.py #, python-format @@ -1706,7 +1706,7 @@ msgstr "仅输出警告和出错信息" #: ../fdroid ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" -msgstr "重写全部元数据文件" +msgstr "重写所有元数据文件" #: ../fdroidserver/rewritemeta.py msgid "Rewrite to a specific format: " @@ -2048,12 +2048,12 @@ msgstr "发生未知异常!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" -msgstr "" +msgstr "在构建版本 '{versionName}' 中出现了未知文件 '{filename}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" -msgstr "" +msgstr "未知元数据格式:%s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2075,30 +2075,30 @@ msgstr "" #: ../fdroidserver/lint.py msgid "Unnecessary leading space" -msgstr "" +msgstr "不必要的前置空格" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" -msgstr "" +msgstr "不必要的尾随空格" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" -msgstr "" +msgstr "'{path}' 中存在无法识别的应用栏目 '{fieldname}'" #: ../fdroidserver/metadata.py msgid "Unrecognised app field: " -msgstr "" +msgstr "无法识别的应用条目: " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" -msgstr "" +msgstr "'{path}' 中有无法识别的构建 flag '{build_flag}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised field '{field}' in {linedesc}" -msgstr "" +msgstr "{linedesc} 中有无法识别的栏目 '{field}'" #: ../fdroidserver/update.py #, python-brace-format @@ -2298,7 +2298,7 @@ msgstr "" #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" -msgstr "有关元数据可能出现的错误的警告" +msgstr "警告元数据中可能存在的错误" #: ../fdroidserver/update.py msgid "" @@ -2439,7 +2439,7 @@ msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" -msgstr "" +msgstr "正在克隆 {url}" #: ../fdroidserver/deploy.py msgid "command to execute, either 'init' or 'update'" @@ -2452,24 +2452,24 @@ msgstr "" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py msgid "complex" -msgstr "复合体" +msgstr "复杂" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" -msgstr[0] "" +msgstr[0] "有冲突的选项字串:%s" #: ../fdroidserver/nightly.py #, python-brace-format msgid "copying {apkfilename} into {path}" -msgstr "" +msgstr "将 {apkfilename} 复制到 {path}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" -msgstr "" +msgstr "无法解析 '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" @@ -2560,7 +2560,7 @@ msgstr "强制将错误设为警告, 或忽略" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." -msgstr "强制元数据错误(默认)为警告,或忽略。" +msgstr "将元数据错误(默认)强制设为警告,或忽略。" #: ../fdroidserver/common.py msgid "git svn clone failed" @@ -3031,7 +3031,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" -msgstr "{path}: {error}" +msgstr "{path}:{error}" #: ../fdroidserver/mirror.py #, python-brace-format From 98aa39a597f0f81a93daf3e5f0b0fdd2df0bd74c Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 2 Feb 2023 17:07:55 +0100 Subject: [PATCH 0988/2116] gitlab-ci: sanitize git ref names for use as docker tags git ref names can contain many chars that are not allowed in docker tags. https://docs.docker.com/engine/reference/commandline/tag/ A tag name must be valid ASCII and may contain lowercase and uppercase letters, digits, underscores, periods and dashes. A tag name may not start with a period or a dash and may contain a maximum of 128 characters. https://gitlab.com/brandsimon/fdroidserver/-/jobs/3705004274 --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 63c17f01..d80df69d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -574,9 +574,10 @@ docker: services: - docker:dind variables: - TEST_IMAGE: $CI_REGISTRY_IMAGE:$CI_BUILD_REF_NAME RELEASE_IMAGE: $CI_REGISTRY_IMAGE:buildserver script: + # git ref names can contain many chars that are not allowed in docker tags + - export TEST_IMAGE=$CI_REGISTRY_IMAGE:$(printf $CI_BUILD_REF_NAME | sed 's,[^a-zA-Z0-9_.-],_,g') - cd buildserver - docker build -t $TEST_IMAGE --build-arg GIT_REV_PARSE_HEAD=$(git rev-parse HEAD) . - docker tag $TEST_IMAGE $RELEASE_IMAGE From 702f84e92045af09781b5f0f3868e10a892f4d1e Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 3 Feb 2023 23:12:29 +0100 Subject: [PATCH 0989/2116] CI: fix permissions for git diff --cached fdroid build runs git diff --cached for git_repo.is_dirty(). This does no longer work without these permissions. --- .gitlab-ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d80df69d..9df46726 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -378,6 +378,10 @@ fdroid build: fdroid" - chown -R vagrant $home_vagrant + - chown -R vagrant $fdroidserver/.git + - chown vagrant $fdroidserver/ + - chown -R vagrant .git + - chown vagrant . # try user build - $fdroid build --verbose --latest org.fdroid.fdroid.privileged From 5e081875672cd950ad5983296cf02e1e7a63c1c6 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 2 Feb 2023 14:57:47 +0100 Subject: [PATCH 0990/2116] build: Rename chan to ssh_channel --- fdroidserver/build.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 00de15f2..2ebd9127 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -223,8 +223,8 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): # Execute the build script... logging.info("Starting build...") - chan = sshs.get_transport().open_session() - chan.get_pty() + ssh_channel = sshs.get_transport().open_session() + ssh_channel.get_pty() cmdline = posixpath.join(homedir, 'fdroidserver', 'fdroid') cmdline += ' build --on-server' if force: @@ -238,14 +238,14 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): if (options.scan_binary or config.get('scan_binary')) and not options.skipscan: cmdline += ' --scan-binary' cmdline += " %s:%s" % (app.id, build.versionCode) - chan.exec_command('bash --login -c "' + cmdline + '"') # nosec B601 inputs are sanitized + ssh_channel.exec_command('bash --login -c "' + cmdline + '"') # nosec B601 inputs are sanitized # Fetch build process output ... try: - cmd_stdout = chan.makefile('rb', 1024) + cmd_stdout = ssh_channel.makefile('rb', 1024) output = bytes() output += common.get_android_tools_version_log().encode() - while not chan.exit_status_ready(): + while not ssh_channel.exit_status_ready(): line = cmd_stdout.readline() if line: if options.verbose: @@ -262,7 +262,7 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): # Check build process exit status ... logging.info("...getting exit status") - returncode = chan.recv_exit_status() + returncode = ssh_channel.recv_exit_status() if returncode != 0: if timeout_event.is_set(): message = "Timeout exceeded! Build VM force-stopped for {0}:{1}" From a6700e65ed1aa45017d6b8723caedf3338910be2 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 2 Feb 2023 14:58:02 +0100 Subject: [PATCH 0991/2116] build: close ssh_channel upon timeout The build can get stuck when running into the timeout and paramiko not noticing it. This can be reproduced by setting a small build timeout for an app. I tried setting set_keepalive() but it did not help. This forcefully closes the ssh channel to the VM so the fdroid build will continue. As we destroy the VM in the next step anyhow I think this is fine. --- fdroidserver/build.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 2ebd9127..cc291eac 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -49,6 +49,7 @@ except ImportError: pass buildserverid = None +ssh_channel = None # Note that 'force' here also implies test mode. @@ -68,7 +69,7 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): target folder for the build result force """ - global buildserverid + global buildserverid, ssh_channel try: paramiko @@ -892,6 +893,8 @@ def force_halt_build(timeout): """Halt the currently running Vagrant VM, to be called from a Timer.""" logging.error(_('Force halting build after {0} sec timeout!').format(timeout)) timeout_event.set() + if ssh_channel: + ssh_channel.close() vm = vmtools.get_build_vm('builder') vm.destroy() From 4a6ccae71a7070c5dc4572db0e578ed5d2e4d35a Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 25 Nov 2022 12:41:52 +0100 Subject: [PATCH 0992/2116] install_ndk: cleanup tempdir --- fdroidserver/common.py | 81 +++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 7b1e0552..cfc7c03c 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4253,47 +4253,48 @@ def _install_ndk(ndk): raise FDroidException("NDK %s not found" % ndk) ndk_base = os.path.join(config['sdk_path'], 'ndk') logging.info(_('Downloading %s') % url) - zipball = os.path.join( - tempfile.mkdtemp(prefix='android-ndk-'), - os.path.basename(url) - ) - net.download_file(url, zipball) - calced = sha256sum(zipball) - if sha256 != calced: - raise FDroidException('SHA-256 %s does not match expected for %s (%s)' % (calced, url, sha256)) - logging.info(_('Unzipping to %s') % ndk_base) - with zipfile.ZipFile(zipball) as zipfp: - for info in zipfp.infolist(): - permbits = info.external_attr >> 16 - if stat.S_ISLNK(permbits): - link = os.path.join(ndk_base, info.filename) - link_target = zipfp.read(info).decode() - link_dir = os.path.dirname(link) - os.makedirs(link_dir, 0o755, True) # ensure intermediate directories are created - os.symlink(link_target, link) + with tempfile.TemporaryDirectory(prefix='android-ndk-') as ndk_dir: + zipball = os.path.join( + ndk_dir, + os.path.basename(url) + ) + net.download_file(url, zipball) + calced = sha256sum(zipball) + if sha256 != calced: + raise FDroidException('SHA-256 %s does not match expected for %s (%s)' % (calced, url, sha256)) + logging.info(_('Unzipping to %s') % ndk_base) + with zipfile.ZipFile(zipball) as zipfp: + for info in zipfp.infolist(): + permbits = info.external_attr >> 16 + if stat.S_ISLNK(permbits): + link = os.path.join(ndk_base, info.filename) + link_target = zipfp.read(info).decode() + link_dir = os.path.dirname(link) + os.makedirs(link_dir, 0o755, True) # ensure intermediate directories are created + os.symlink(link_target, link) - real_target = os.path.realpath(link) - if not real_target.startswith(ndk_base): - os.remove(link) - logging.error(_('Unexpected symlink target: {link} -> {target}') - .format(link=link, target=real_target)) - elif stat.S_ISDIR(permbits) or stat.S_IXUSR & permbits: - zipfp.extract(info.filename, path=ndk_base) - os.chmod(os.path.join(ndk_base, info.filename), 0o755) # nosec bandit B103 - else: - zipfp.extract(info.filename, path=ndk_base) - os.chmod(os.path.join(ndk_base, info.filename), 0o644) # nosec bandit B103 - os.remove(zipball) - for extracted in glob.glob(os.path.join(ndk_base, '*')): - version = get_ndk_version(extracted) - if os.path.basename(extracted) != version: - ndk_dir = os.path.join(ndk_base, version) - os.rename(extracted, ndk_dir) - if 'ndk_paths' not in config: - config['ndk_paths'] = dict() - config['ndk_paths'][ndk] = ndk_dir - logging.info(_('Set NDK {release} ({version}) up') - .format(release=ndk, version=version)) + real_target = os.path.realpath(link) + if not real_target.startswith(ndk_base): + os.remove(link) + logging.error(_('Unexpected symlink target: {link} -> {target}') + .format(link=link, target=real_target)) + elif stat.S_ISDIR(permbits) or stat.S_IXUSR & permbits: + zipfp.extract(info.filename, path=ndk_base) + os.chmod(os.path.join(ndk_base, info.filename), 0o755) # nosec bandit B103 + else: + zipfp.extract(info.filename, path=ndk_base) + os.chmod(os.path.join(ndk_base, info.filename), 0o644) # nosec bandit B103 + os.remove(zipball) + for extracted in glob.glob(os.path.join(ndk_base, '*')): + version = get_ndk_version(extracted) + if os.path.basename(extracted) != version: + ndk_dir = os.path.join(ndk_base, version) + os.rename(extracted, ndk_dir) + if 'ndk_paths' not in config: + config['ndk_paths'] = dict() + config['ndk_paths'][ndk] = ndk_dir + logging.info(_('Set NDK {release} ({version}) up') + .format(release=ndk, version=version)) """Derived from https://gitlab.com/fdroid/android-sdk-transparency-log/-/blob/master/checksums.json""" From d5400549f6122b17fb45be527ed13726d1332d12 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 25 Nov 2022 12:18:50 +0100 Subject: [PATCH 0993/2116] update test: set update options --- tests/update.TestCase | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/update.TestCase b/tests/update.TestCase index fe3159ce..1582968e 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -753,6 +753,7 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.config = config fdroidserver.update.config = config fdroidserver.common.options = Options + fdroidserver.update.options = fdroidserver.common.options os.chdir(os.path.join(localmodule, 'tests')) apps = fdroidserver.metadata.read_metadata() knownapks = fdroidserver.common.KnownApks() @@ -1122,6 +1123,7 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.common.options = Options + fdroidserver.update.options = fdroidserver.common.options app = fdroidserver.metadata.App() knownapks = fdroidserver.common.KnownApks() From 1eeb99211837181a6dbbf09461fa9d03dda2040d Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 23 Nov 2022 08:09:37 +0100 Subject: [PATCH 0994/2116] Don't create unused testfiles directory --- tests/checkupdates.TestCase | 2 -- tests/rewritemeta.TestCase | 2 -- 2 files changed, 4 deletions(-) diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index e6b2b6d9..7ffc548a 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -27,8 +27,6 @@ class CheckupdatesTest(unittest.TestCase): def setUp(self): logging.basicConfig(level=logging.DEBUG) self.basedir = localmodule / 'tests' - self.tmpdir = localmodule / '.testfiles' - self.tmpdir.mkdir(exist_ok=True) # TODO: Python3.6: Accepts a path-like object. os.chdir(str(self.basedir)) diff --git a/tests/rewritemeta.TestCase b/tests/rewritemeta.TestCase index 309e2f45..4fc4d8ac 100755 --- a/tests/rewritemeta.TestCase +++ b/tests/rewritemeta.TestCase @@ -29,8 +29,6 @@ class RewriteMetaTest(unittest.TestCase): def setUp(self): logging.basicConfig(level=logging.DEBUG) self.basedir = localmodule / 'tests' - self.tmpdir = localmodule / '.testfiles' - self.tmpdir.mkdir(exist_ok=True) # TODO: Python3.6: Accepts a path-like object. os.chdir(str(self.basedir)) From d29a486e31e1b0fc0a71251308d4cf634cbc7ab2 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 22 Nov 2022 17:17:45 +0100 Subject: [PATCH 0995/2116] tests: use context manager and/or standard setup temp files --- tests/build.TestCase | 189 ++++++++-------- tests/common.TestCase | 360 +++++++++++-------------------- tests/import_subcommand.TestCase | 39 ++-- tests/index.TestCase | 33 ++- tests/init.TestCase | 24 +-- tests/metadata.TestCase | 70 +++--- tests/nightly.TestCase | 1 + tests/publish.TestCase | 54 ++--- tests/scanner.TestCase | 42 ++-- tests/testcommon.py | 8 + tests/update.TestCase | 309 +++++++++++--------------- tests/vcs.TestCase | 16 +- 12 files changed, 465 insertions(+), 680 deletions(-) diff --git a/tests/build.TestCase b/tests/build.TestCase index 0bfee1be..b6ceee10 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -22,11 +22,14 @@ print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) +from testcommon import TmpCwd + import fdroidserver.build import fdroidserver.common import fdroidserver.metadata import fdroidserver.scanner import fdroidserver.vmtools +from testcommon import mkdtemp class FakeProcess: @@ -45,12 +48,15 @@ class BuildTest(unittest.TestCase): logger = logging.getLogger('androguard.axml') logger.setLevel(logging.INFO) # tame the axml debug messages self.basedir = os.path.join(localmodule, 'tests') - self.tmpdir = os.path.abspath(os.path.join(self.basedir, '..', '.testfiles')) - if not os.path.exists(self.tmpdir): - os.makedirs(self.tmpdir) os.chdir(self.basedir) fdroidserver.common.config = None fdroidserver.build.config = None + self._td = mkdtemp() + self.testdir = self._td.name + + def tearDown(self): + os.chdir(self.basedir) + self._td.cleanup() def create_fake_android_home(self, d): os.makedirs(os.path.join(d, 'build-tools'), exist_ok=True) @@ -210,106 +216,100 @@ class BuildTest(unittest.TestCase): def test_build_local_ndk(self): """Test if `fdroid build` detects installed NDKs and auto-installs when missing""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + with tempfile.TemporaryDirectory() as testdir, TmpCwd( + testdir + ), tempfile.TemporaryDirectory() as sdk_path: + config = {'ndk_paths': {}, 'sdk_path': sdk_path} + fdroidserver.common.config = config + fdroidserver.build.config = config + fdroidserver.build.options = mock.Mock() + fdroidserver.build.options.scan_binary = False + fdroidserver.build.options.notarball = True + fdroidserver.build.options.skipscan = True - config = {'ndk_paths': {}, 'sdk_path': tempfile.mkdtemp(prefix='android-sdk-')} - fdroidserver.common.config = config - fdroidserver.build.config = config - fdroidserver.build.options = mock.Mock() - fdroidserver.build.options.scan_binary = False - fdroidserver.build.options.notarball = True - fdroidserver.build.options.skipscan = True + app = fdroidserver.metadata.App() + app.id = 'mocked.app.id' + build = fdroidserver.metadata.Build() + build.commit = '1.0' + build.output = app.id + '.apk' + build.versionCode = 1 + build.versionName = '1.0' + build.ndk = 'r21e' # aka 21.4.7075529 + vcs = mock.Mock() - app = fdroidserver.metadata.App() - app.id = 'mocked.app.id' - build = fdroidserver.metadata.Build() - build.commit = '1.0' - build.output = app.id + '.apk' - build.versionCode = 1 - build.versionName = '1.0' - build.ndk = 'r21e' # aka 21.4.7075529 - vcs = mock.Mock() + def make_fake_apk(output, build): + with open(build.output, 'w') as fp: + fp.write('APK PLACEHOLDER') + return output - def make_fake_apk(output, build): - with open(build.output, 'w') as fp: - fp.write('APK PLACEHOLDER') - return output + def fake_download_file(_ignored, local_filename): + _ignored # silence the linters + with zipfile.ZipFile(local_filename, 'x') as zipfp: + zipfp.writestr( + 'android-ndk-r21e/source.properties', + 'Pkg.Revision = 21.4.7075529\n', + ) - def fake_download_file(_ignored, local_filename): - _ignored # silence the linters - with zipfile.ZipFile(local_filename, 'x') as zipfp: - zipfp.writestr( - 'android-ndk-r21e/source.properties', - 'Pkg.Revision = 21.4.7075529\n', - ) - - # use "as _ignored" just to make a pretty layout - with mock.patch( - 'fdroidserver.common.replace_build_vars', wraps=make_fake_apk - ) as _ignored, mock.patch( - 'fdroidserver.common.get_native_code', return_value='x86' - ) as _ignored, mock.patch( - 'fdroidserver.common.get_apk_id', - return_value=(app.id, build.versionCode, build.versionName), - ) as _ignored, mock.patch( - 'fdroidserver.common.is_apk_and_debuggable', return_value=False - ) as _ignored, mock.patch( - 'fdroidserver.common.sha256sum', - return_value='ad7ce5467e18d40050dc51b8e7affc3e635c85bd8c59be62de32352328ed467e', - ) as _ignored, mock.patch( - 'fdroidserver.common.is_apk_and_debuggable', return_value=False - ) as _ignored, mock.patch( - 'fdroidserver.build.FDroidPopen', FakeProcess - ) as _ignored, mock.patch( - 'fdroidserver.net.download_file', wraps=fake_download_file - ) as _ignored: - _ignored # silence the linters - with self.assertRaises( - fdroidserver.exception.FDroidException, - msg="No NDK setup, `fdroid build` should fail with error", - ): + # use "as _ignored" just to make a pretty layout + with mock.patch( + 'fdroidserver.common.replace_build_vars', wraps=make_fake_apk + ) as _ignored, mock.patch( + 'fdroidserver.common.get_native_code', return_value='x86' + ) as _ignored, mock.patch( + 'fdroidserver.common.get_apk_id', + return_value=(app.id, build.versionCode, build.versionName), + ) as _ignored, mock.patch( + 'fdroidserver.common.is_apk_and_debuggable', return_value=False + ) as _ignored, mock.patch( + 'fdroidserver.common.sha256sum', + return_value='ad7ce5467e18d40050dc51b8e7affc3e635c85bd8c59be62de32352328ed467e', + ) as _ignored, mock.patch( + 'fdroidserver.common.is_apk_and_debuggable', return_value=False + ) as _ignored, mock.patch( + 'fdroidserver.build.FDroidPopen', FakeProcess + ) as _ignored, mock.patch( + 'fdroidserver.net.download_file', wraps=fake_download_file + ) as _ignored: + _ignored # silence the linters + with self.assertRaises( + fdroidserver.exception.FDroidException, + msg="No NDK setup, `fdroid build` should fail with error", + ): + fdroidserver.build.build_local( + app, + build, + vcs, + build_dir=testdir, + output_dir=testdir, + log_dir=None, + srclib_dir=None, + extlib_dir=None, + tmp_dir=None, + force=False, + onserver=False, + refresh=False, + ) + # now run `fdroid build --onserver` + self.assertTrue('r21e' not in config['ndk_paths']) fdroidserver.build.build_local( app, build, vcs, build_dir=testdir, output_dir=testdir, - log_dir=None, + log_dir=os.getcwd(), srclib_dir=None, extlib_dir=None, tmp_dir=None, force=False, - onserver=False, + onserver=True, refresh=False, ) - # now run `fdroid build --onserver` - self.assertTrue('r21e' not in config['ndk_paths']) - fdroidserver.build.build_local( - app, - build, - vcs, - build_dir=testdir, - output_dir=testdir, - log_dir=os.getcwd(), - srclib_dir=None, - extlib_dir=None, - tmp_dir=None, - force=False, - onserver=True, - refresh=False, - ) - self.assertTrue(os.path.exists(config['ndk_paths']['r21e'])) + self.assertTrue(os.path.exists(config['ndk_paths']['r21e'])) def test_build_local_clean(self): """Test if `fdroid build` cleans ant and gradle build products""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) - + os.chdir(self.testdir) config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config @@ -374,8 +374,8 @@ class BuildTest(unittest.TestCase): app, build, vcs, - build_dir=testdir, - output_dir=testdir, + build_dir=self.testdir, + output_dir=self.testdir, log_dir=None, srclib_dir=None, extlib_dir=None, @@ -396,10 +396,7 @@ class BuildTest(unittest.TestCase): self.assertFalse(os.path.exists('gradle-wrapper.jar')) def test_scan_with_extlib(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.testdir) os.mkdir("build") config = fdroidserver.common.get_config() @@ -446,11 +443,8 @@ class BuildTest(unittest.TestCase): def test_failed_verifies_are_not_in_unsigned(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) - sdk_path = os.path.join(testdir, 'android-sdk') + os.chdir(self.testdir) + sdk_path = os.path.join(self.testdir, 'android-sdk') self.create_fake_android_home(sdk_path) with open('config.yml', 'w') as fp: yaml.dump({'sdk_path': sdk_path}, fp) @@ -567,10 +561,7 @@ class BuildTest(unittest.TestCase): else: self.assertFalse(flag in args, flag + ' should not be present') - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.testdir) os.mkdir('tmp') chan = mock.MagicMock() diff --git a/tests/common.TestCase b/tests/common.TestCase index a5d8daf1..43ca5823 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -38,7 +38,7 @@ import fdroidserver.index import fdroidserver.signindex import fdroidserver.common import fdroidserver.metadata -from testcommon import TmpCwd +from testcommon import TmpCwd, mkdtemp from fdroidserver.exception import FDroidException, VCSException,\ MetaDataException, VerificationException @@ -60,8 +60,13 @@ class CommonTest(unittest.TestCase): fdroidserver.common.options.verbose = False self.path = os.environ['PATH'] self.android_home = os.environ.get('ANDROID_HOME') + self._td = mkdtemp() + self.testdir = self._td.name def tearDown(self): + os.chdir(self.basedir) + self._td.cleanup() + shutil.rmtree(self.tmpdir) os.environ['PATH'] = self.path if self.android_home: os.environ['ANDROID_HOME'] = self.android_home @@ -142,10 +147,7 @@ class CommonTest(unittest.TestCase): print('no build-tools found: ' + build_tools) def test_find_java_root_path(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) all_pathlists = [ ( @@ -282,16 +284,13 @@ class CommonTest(unittest.TestCase): testint = 99999999 teststr = 'FAKE_STR_FOR_TESTING' - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) shutil.copytree( os.path.join(self.basedir, 'source-files'), - os.path.join(testdir, 'source-files'), + os.path.join(self.tmpdir, 'source-files'), ) fdroidclient_testdir = os.path.join( - testdir, 'source-files', 'fdroid', 'fdroidclient' + self.tmpdir, 'source-files', 'fdroid', 'fdroidclient' ) config = dict() @@ -340,10 +339,7 @@ class CommonTest(unittest.TestCase): @unittest.skipIf(os.name == 'nt', "`fdroid build` assumes POSIX scripting") def test_prepare_sources_with_prebuild_subdir(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - app_build_dir = os.path.join(testdir, 'build', 'com.example') + app_build_dir = os.path.join(self.testdir, 'build', 'com.example') shutil.copytree( os.path.join(self.basedir, 'source-files', 'fdroid', 'fdroidclient'), app_build_dir, @@ -360,7 +356,7 @@ class CommonTest(unittest.TestCase): fdroidserver.common.config = config srclibname = 'FakeSrcLib' - srclib_testdir = os.path.join(testdir, 'build', 'srclib') + srclib_testdir = os.path.join(self.testdir, 'build', 'srclib') os.makedirs(os.path.join(srclib_testdir, srclibname, 'testdirshouldexist')) fdroidserver.metadata.srclibs = { srclibname: { @@ -397,11 +393,7 @@ class CommonTest(unittest.TestCase): def test_prepare_sources_refresh(self): packageName = 'org.fdroid.ci.test.app' - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - print('testdir', testdir) - os.chdir(testdir) + os.chdir(self.tmpdir) os.mkdir('build') os.mkdir('metadata') @@ -419,7 +411,7 @@ class CommonTest(unittest.TestCase): with open(os.path.join('metadata', packageName + '.yml'), 'w') as fp: yaml.dump(metadata, fp) - gitrepo = os.path.join(testdir, 'build', packageName) + gitrepo = os.path.join(self.tmpdir, 'build', packageName) vcs0 = fdroidserver.common.getvcs('git', git_url, gitrepo) vcs0.gotorevision('0.3', refresh=True) vcs1 = fdroidserver.common.getvcs('git', git_url, gitrepo) @@ -445,18 +437,18 @@ class CommonTest(unittest.TestCase): fdroidserver.signindex.config = config sourcedir = os.path.join(self.basedir, 'signindex') - testsdir = tempfile.mkdtemp( + with tempfile.TemporaryDirectory( prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - for f in ('testy.jar', 'guardianproject.jar'): - sourcefile = os.path.join(sourcedir, f) - testfile = os.path.join(testsdir, f) - shutil.copy(sourcefile, testsdir) - fdroidserver.signindex.sign_jar(testfile, use_old_algs=True) - # these should be resigned, and therefore different - self.assertNotEqual( - open(sourcefile, 'rb').read(), open(testfile, 'rb').read() - ) + ) as testsdir: + for f in ('testy.jar', 'guardianproject.jar'): + sourcefile = os.path.join(sourcedir, f) + testfile = os.path.join(testsdir, f) + shutil.copy(sourcefile, testsdir) + fdroidserver.signindex.sign_jar(testfile, use_old_algs=True) + # these should be resigned, and therefore different + self.assertNotEqual( + open(sourcefile, 'rb').read(), open(testfile, 'rb').read() + ) def test_verify_apk_signature(self): config = fdroidserver.common.read_config(fdroidserver.common.options) @@ -519,19 +511,14 @@ class CommonTest(unittest.TestCase): sourceapk = os.path.join(self.basedir, 'urzip.apk') - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - print('testdir', testdir) - - copyapk = os.path.join(testdir, 'urzip-copy.apk') + copyapk = os.path.join(self.testdir, 'urzip-copy.apk') shutil.copy(sourceapk, copyapk) self.assertTrue(fdroidserver.common.verify_apk_signature(copyapk)) self.assertIsNone( fdroidserver.common.verify_apks(sourceapk, copyapk, self.tmpdir) ) - unsignedapk = os.path.join(testdir, 'urzip-unsigned.apk') + unsignedapk = os.path.join(self.testdir, 'urzip-unsigned.apk') with ZipFile(sourceapk, 'r') as apk: with ZipFile(unsignedapk, 'w') as testapk: for info in apk.infolist(): @@ -541,7 +528,7 @@ class CommonTest(unittest.TestCase): fdroidserver.common.verify_apks(sourceapk, unsignedapk, self.tmpdir) ) - twosigapk = os.path.join(testdir, 'urzip-twosig.apk') + twosigapk = os.path.join(self.testdir, 'urzip-twosig.apk') otherapk = ZipFile(os.path.join(self.basedir, 'urzip-release.apk'), 'r') with ZipFile(sourceapk, 'r') as apk: with ZipFile(twosigapk, 'w') as testapk: @@ -715,17 +702,14 @@ class CommonTest(unittest.TestCase): def test_find_apksigner_config_overrides(self): """apksigner should come from config before any auto-detection""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) - android_home = os.path.join(testdir, 'ANDROID_HOME') + os.chdir(self.tmpdir) + android_home = os.path.join(self.tmpdir, 'ANDROID_HOME') do_not_use = os.path.join(android_home, 'build-tools', '30.0.3', 'apksigner') os.makedirs(os.path.dirname(do_not_use)) with open(do_not_use, 'w') as fp: fp.write('#!/bin/sh\ndate\n') os.chmod(do_not_use, 0o0755) - apksigner = os.path.join(testdir, 'apksigner') + apksigner = os.path.join(self.tmpdir, 'apksigner') config = {'apksigner': apksigner} os.environ['ANDROID_HOME'] = android_home os.environ['PATH'] = '%s:/usr/local/bin:/usr/bin:/bin' % android_home @@ -734,17 +718,13 @@ class CommonTest(unittest.TestCase): def test_find_apksigner_prefer_path(self): """apksigner should come from PATH before ANDROID_HOME""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) - - apksigner = os.path.join(testdir, 'apksigner') + os.chdir(self.tmpdir) + apksigner = os.path.join(self.tmpdir, 'apksigner') with open(apksigner, 'w') as fp: fp.write('#!/bin/sh\ndate\n') os.chmod(apksigner, 0o0755) - android_home = os.path.join(testdir, 'ANDROID_HOME') + android_home = os.path.join(self.tmpdir, 'ANDROID_HOME') do_not_use = os.path.join(android_home, 'build-tools', '30.0.3', 'apksigner') os.makedirs(os.path.dirname(do_not_use)) with open(do_not_use, 'w') as fp: @@ -759,11 +739,8 @@ class CommonTest(unittest.TestCase): def test_find_apksigner_prefer_newest(self): """apksigner should be the newest available in ANDROID_HOME""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) - android_home = os.path.join(testdir, 'ANDROID_HOME') + os.chdir(self.tmpdir) + android_home = os.path.join(self.tmpdir, 'ANDROID_HOME') apksigner = os.path.join(android_home, 'build-tools', '30.0.3', 'apksigner') os.makedirs(os.path.dirname(apksigner)) @@ -784,10 +761,7 @@ class CommonTest(unittest.TestCase): def test_find_apksigner_system_package_android_home(self): """Test that apksigner v30 or newer is found""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) android_home = os.getenv('ANDROID_HOME') if not android_home or not os.path.isdir(android_home): self.skipTest('SKIPPING since ANDROID_HOME (%s) is not a dir!' % android_home) @@ -825,12 +799,9 @@ class CommonTest(unittest.TestCase): fdroidserver.common.config = config fdroidserver.signindex.config = config - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - unsigned = os.path.join(testdir, 'urzip-release-unsigned.apk') - signed = os.path.join(testdir, 'urzip-release.apk') - shutil.copy(os.path.join(self.basedir, 'urzip-release-unsigned.apk'), testdir) + unsigned = os.path.join(self.testdir, 'urzip-release-unsigned.apk') + signed = os.path.join(self.testdir, 'urzip-release.apk') + shutil.copy(os.path.join(self.basedir, 'urzip-release-unsigned.apk'), self.testdir) self.assertFalse(fdroidserver.common.verify_apk_signature(unsigned)) @@ -840,8 +811,8 @@ class CommonTest(unittest.TestCase): self.assertTrue(fdroidserver.common.verify_apk_signature(signed)) # now sign an APK with minSdkVersion >= 18 - unsigned = os.path.join(testdir, 'duplicate.permisssions_9999999-unsigned.apk') - signed = os.path.join(testdir, 'duplicate.permisssions_9999999.apk') + unsigned = os.path.join(self.testdir, 'duplicate.permisssions_9999999-unsigned.apk') + signed = os.path.join(self.testdir, 'duplicate.permisssions_9999999.apk') shutil.copy( os.path.join(self.basedir, 'repo', 'duplicate.permisssions_9999999.apk'), os.path.join(unsigned), @@ -853,9 +824,9 @@ class CommonTest(unittest.TestCase): self.assertTrue(fdroidserver.common.verify_apk_signature(signed)) self.assertEqual('18', fdroidserver.common._get_androguard_APK(signed).get_min_sdk_version()) - shutil.copy(os.path.join(self.basedir, 'minimal_targetsdk_30_unsigned.apk'), testdir) - unsigned = os.path.join(testdir, 'minimal_targetsdk_30_unsigned.apk') - signed = os.path.join(testdir, 'minimal_targetsdk_30.apk') + shutil.copy(os.path.join(self.basedir, 'minimal_targetsdk_30_unsigned.apk'), self.testdir) + unsigned = os.path.join(self.testdir, 'minimal_targetsdk_30_unsigned.apk') + signed = os.path.join(self.testdir, 'minimal_targetsdk_30.apk') self.assertFalse(fdroidserver.common.verify_apk_signature(unsigned)) fdroidserver.common.sign_apk(unsigned, signed, config['keyalias']) @@ -866,17 +837,17 @@ class CommonTest(unittest.TestCase): # verify it has a v2 signature self.assertTrue(fdroidserver.common._get_androguard_APK(signed).is_signed_v2()) - shutil.copy(os.path.join(self.basedir, 'no_targetsdk_minsdk30_unsigned.apk'), testdir) - unsigned = os.path.join(testdir, 'no_targetsdk_minsdk30_unsigned.apk') - signed = os.path.join(testdir, 'no_targetsdk_minsdk30_signed.apk') + shutil.copy(os.path.join(self.basedir, 'no_targetsdk_minsdk30_unsigned.apk'), self.testdir) + unsigned = os.path.join(self.testdir, 'no_targetsdk_minsdk30_unsigned.apk') + signed = os.path.join(self.testdir, 'no_targetsdk_minsdk30_signed.apk') fdroidserver.common.sign_apk(unsigned, signed, config['keyalias']) self.assertTrue(fdroidserver.common.verify_apk_signature(signed)) self.assertTrue(fdroidserver.common._get_androguard_APK(signed).is_signed_v2()) - shutil.copy(os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk'), testdir) - unsigned = os.path.join(testdir, 'no_targetsdk_minsdk1_unsigned.apk') - signed = os.path.join(testdir, 'no_targetsdk_minsdk1_signed.apk') + shutil.copy(os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk'), self.testdir) + unsigned = os.path.join(self.testdir, 'no_targetsdk_minsdk1_unsigned.apk') + signed = os.path.join(self.testdir, 'no_targetsdk_minsdk1_signed.apk') self.assertFalse(fdroidserver.common.verify_apk_signature(unsigned)) fdroidserver.common.sign_apk(unsigned, signed, config['keyalias']) @@ -901,10 +872,7 @@ class CommonTest(unittest.TestCase): fdroidserver.common.config = config fdroidserver.signindex.config = config - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) os.mkdir('unsigned') os.mkdir('repo') @@ -1431,15 +1399,11 @@ class CommonTest(unittest.TestCase): self.assertEqual(fdroidserver.common.parse_srclib_spec('@multi@at-signs@')) def test_remove_signing_keys(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - print(testdir) shutil.copytree( os.path.join(self.basedir, 'source-files'), - os.path.join(testdir, 'source-files'), + os.path.join(self.tmpdir, 'source-files'), ) - os.chdir(testdir) + os.chdir(self.tmpdir) with_signingConfigs = [ 'source-files/com.seafile.seadroid2/app/build.gradle', 'source-files/eu.siacs.conversations/build.gradle', @@ -1608,14 +1572,11 @@ class CommonTest(unittest.TestCase): self.assertEqual(f.read(), mocklogcontent) def test_deploy_status_json(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - + os.chdir(self.tmpdir) fakesubcommand = 'fakesubcommand' fake_timestamp = 1234567890 fakeserver = 'example.com:/var/www/fbot/' - expected_dir = os.path.join(testdir, fakeserver.replace(':', ''), 'repo', 'status') + expected_dir = os.path.join(self.tmpdir, fakeserver.replace(':', ''), 'repo', 'status') fdroidserver.common.options = mock.Mock() fdroidserver.common.config = {} @@ -1623,7 +1584,7 @@ class CommonTest(unittest.TestCase): fdroidserver.common.config['identity_file'] = 'ssh/id_rsa' def assert_subprocess_call(cmd): - dest_path = os.path.join(testdir, cmd[-1].replace(':', '')) + dest_path = os.path.join(self.tmpdir, cmd[-1].replace(':', '')) if not os.path.exists(dest_path): os.makedirs(dest_path) return subprocess.run(cmd[:-1] + [dest_path]).returncode @@ -1779,10 +1740,7 @@ class CommonTest(unittest.TestCase): def test_with_no_config(self): """It should set defaults if no config file is found""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) self.assertFalse(os.path.exists('config.yml')) self.assertFalse(os.path.exists('config.py')) config = fdroidserver.common.read_config(fdroidserver.common.options) @@ -1791,8 +1749,7 @@ class CommonTest(unittest.TestCase): def test_with_zero_size_config(self): """It should set defaults if config file has nothing in it""" - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) - os.chdir(testdir) + os.chdir(self.tmpdir) open('config.yml', 'w').close() self.assertTrue(os.path.exists('config.yml')) self.assertFalse(os.path.exists('config.py')) @@ -1802,10 +1759,7 @@ class CommonTest(unittest.TestCase): def test_with_config_yml(self): """Make sure it is possible to use config.yml alone.""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write('apksigner: yml') self.assertTrue(os.path.exists('config.yml')) @@ -1815,10 +1769,7 @@ class CommonTest(unittest.TestCase): def test_with_config_yml_utf8(self): """Make sure it is possible to use config.yml in UTF-8 encoding.""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) teststr = '/πÇÇ现代通用字-български-عربي1/ö/yml' with open('config.yml', 'w', encoding='utf-8') as fp: fp.write('apksigner: ' + teststr) @@ -1829,10 +1780,7 @@ class CommonTest(unittest.TestCase): def test_with_config_yml_utf8_as_ascii(self): """Make sure it is possible to use config.yml Unicode encoded as ASCII.""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) teststr = '/πÇÇ现代通用字-български-عربي1/ö/yml' with open('config.yml', 'w') as fp: yaml.dump({'apksigner': teststr}, fp) @@ -1843,10 +1791,7 @@ class CommonTest(unittest.TestCase): def test_with_config_yml_with_env_var(self): """Make sure it is possible to use config.yml alone.""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) os.environ['SECRET'] = 'mysecretpassword' with open('config.yml', 'w') as fp: fp.write("""keypass: {'env': 'SECRET'}""") @@ -1857,10 +1802,7 @@ class CommonTest(unittest.TestCase): def test_with_config_py(self): """Make sure it is still possible to use config.py alone.""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) with open('config.py', 'w') as fp: fp.write('apksigner = "py"') self.assertFalse(os.path.exists('config.yml')) @@ -1870,10 +1812,7 @@ class CommonTest(unittest.TestCase): def test_config_perm_warning(self): """Exercise the code path that issues a warning about unsafe permissions.""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write('keystore: foo.jks') self.assertTrue(os.path.exists(fp.name)) @@ -1890,10 +1829,7 @@ class CommonTest(unittest.TestCase): def test_with_both_config_yml_py(self): """If config.yml and config.py are present, config.py should be ignored.""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write('apksigner: yml') with open('config.py', 'w') as fp: @@ -1905,10 +1841,7 @@ class CommonTest(unittest.TestCase): def test_config_repo_url(self): """repo_url ends in /repo, archive_url ends in /archive.""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write('repo_url: https://MyFirstFDroidRepo.org/fdroid/repo\n') fp.write('archive_url: https://MyFirstFDroidRepo.org/fdroid/archive') @@ -1918,10 +1851,7 @@ class CommonTest(unittest.TestCase): def test_config_repo_url_extra_slash(self): """repo_url ends in /repo, archive_url ends in /archive.""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write('repo_url: https://MyFirstFDroidRepo.org/fdroid/repo/') with self.assertRaises(FDroidException): @@ -1929,10 +1859,7 @@ class CommonTest(unittest.TestCase): def test_config_repo_url_not_repo(self): """repo_url ends in /repo, archive_url ends in /archive.""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write('repo_url: https://MyFirstFDroidRepo.org/fdroid/foo') with self.assertRaises(FDroidException): @@ -1940,10 +1867,7 @@ class CommonTest(unittest.TestCase): def test_config_archive_url_extra_slash(self): """repo_url ends in /repo, archive_url ends in /archive.""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write('archive_url: https://MyFirstFDroidRepo.org/fdroid/archive/') with self.assertRaises(FDroidException): @@ -1951,20 +1875,14 @@ class CommonTest(unittest.TestCase): def test_config_archive_url_not_repo(self): """repo_url ends in /repo, archive_url ends in /archive.""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write('archive_url: https://MyFirstFDroidRepo.org/fdroid/foo') with self.assertRaises(FDroidException): fdroidserver.common.read_config() def test_write_to_config_yml(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write('apksigner: yml') self.assertTrue(os.path.exists(fp.name)) @@ -1980,10 +1898,7 @@ class CommonTest(unittest.TestCase): self.assertEqual('mysecretpassword', config['keypass']) def test_write_to_config_py(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) with open('config.py', 'w') as fp: fp.write('apksigner = "py"') self.assertTrue(os.path.exists(fp.name)) @@ -1997,10 +1912,7 @@ class CommonTest(unittest.TestCase): self.assertEqual('mysecretpassword', config['keypass']) def test_config_dict_with_int_keys(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write('java_paths:\n 8: /usr/lib/jvm/java-8-openjdk\n') self.assertTrue(os.path.exists(fp.name)) @@ -2010,17 +1922,14 @@ class CommonTest(unittest.TestCase): def test_loading_config_buildserver_yml(self): """Smoke check to make sure this file is properly parsed""" - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) - os.chdir(testdir) + os.chdir(self.tmpdir) shutil.copy(os.path.join(self.basedir, '..', 'buildserver', 'config.buildserver.yml'), 'config.yml') self.assertFalse(os.path.exists('config.py')) fdroidserver.common.read_config(fdroidserver.common.options) def test_setup_status_output(self): - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) - print(testdir) - os.chdir(testdir) + os.chdir(self.tmpdir) start_timestamp = time.gmtime() subcommand = 'test' @@ -2036,13 +1945,9 @@ class CommonTest(unittest.TestCase): self.assertEqual(subcommand, data['subcommand']) def test_setup_status_output_in_git_repo(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) - + os.chdir(self.tmpdir) logging.getLogger('git.cmd').setLevel(logging.INFO) - git_repo = git.Repo.init(testdir) + git_repo = git.Repo.init(self.tmpdir) file_in_git = 'README.md' with open(file_in_git, 'w') as fp: fp.write('this is just a test') @@ -2153,11 +2058,8 @@ class CommonTest(unittest.TestCase): ) def test_apk_strip_v1_signatures(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) before = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') - after = os.path.join(testdir, 'after.apk') + after = os.path.join(self.testdir, 'after.apk') shutil.copy(before, after) fdroidserver.common.apk_strip_v1_signatures(after, strip_manifest=False) @@ -2229,13 +2131,10 @@ class CommonTest(unittest.TestCase): @unittest.skip("This test downloads and unzips a 1GB file.") def test_install_ndk(self): """NDK r10e is a special case since its missing source.properties""" - sdk_path = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - config = {'sdk_path': sdk_path} + config = {'sdk_path': self.tmpdir} fdroidserver.common.config = config fdroidserver.common._install_ndk('r10e') - r10e = os.path.join(sdk_path, 'ndk', 'r10e') + r10e = os.path.join(self.tmpdir, 'ndk', 'r10e') self.assertEqual('r10e', fdroidserver.common.get_ndk_version(r10e)) fdroidserver.common.fill_config_defaults(config) self.assertEqual({'r10e': r10e}, config['ndk_paths']) @@ -2248,31 +2147,31 @@ class CommonTest(unittest.TestCase): with ZipFile(zipball, 'w') as zipfp: zipfp.writestr(os.path.basename(url), url) - sdk_path = tempfile.mkdtemp( + with tempfile.TemporaryDirectory( prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - config = {'sdk_path': sdk_path} - fdroidserver.common.config = config - for r, sha256 in ( - ( - 'r10e', - 'ee5f405f3b57c4f5c3b3b8b5d495ae12b660e03d2112e4ed5c728d349f1e520c', - ), - ('r20', '57435158f109162f41f2f43d5563d2164e4d5d0364783a9a6fab3ef12cb06ce0'), - ( - '23.0.7599858', - 'e3eacf80016b91d4cd2c8ca9f34eebd32df912bb799c859cc5450b6b19277b4f', - ), - ): - with mock.patch( - 'fdroidserver.net.download_file', side_effect=fake_download - ) as _ignored, mock.patch( - 'fdroidserver.common.get_ndk_version', return_value=r - ) as _ignored, mock.patch( - 'fdroidserver.common.sha256sum', return_value=sha256 + ) as sdk_path: + config = {'sdk_path': sdk_path} + fdroidserver.common.config = config + for r, sha256 in ( + ( + 'r10e', + 'ee5f405f3b57c4f5c3b3b8b5d495ae12b660e03d2112e4ed5c728d349f1e520c', + ), + ('r20', '57435158f109162f41f2f43d5563d2164e4d5d0364783a9a6fab3ef12cb06ce0'), + ( + '23.0.7599858', + 'e3eacf80016b91d4cd2c8ca9f34eebd32df912bb799c859cc5450b6b19277b4f', + ), ): - _ignored # silence the linters - fdroidserver.common._install_ndk(r) + with mock.patch( + 'fdroidserver.net.download_file', side_effect=fake_download + ) as _ignored, mock.patch( + 'fdroidserver.common.get_ndk_version', return_value=r + ) as _ignored, mock.patch( + 'fdroidserver.common.sha256sum', return_value=sha256 + ): + _ignored # silence the linters + fdroidserver.common._install_ndk(r) def test_install_ndk_with_symlinks(self): """Some NDK zipballs might have symlinks in them.""" @@ -2314,10 +2213,7 @@ class CommonTest(unittest.TestCase): zipInfo.external_attr = unix_st_mode << 16 zipfp.writestr(zipInfo, 'foo/../../../../../../../../../etc/passwd') - sdk_path = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - config = {'sdk_path': sdk_path} + config = {'sdk_path': self.tmpdir} fdroidserver.common.config = config r = 'r20' sha256 = '57435158f109162f41f2f43d5563d2164e4d5d0364783a9a6fab3ef12cb06ce0' @@ -2331,40 +2227,36 @@ class CommonTest(unittest.TestCase): _ignored # silence the linters fdroidserver.common._install_ndk(r) - self.assertTrue(os.path.exists(os.path.join(sdk_path, 'ndk', 'r20'))) - self.assertTrue(os.path.exists(os.path.join(sdk_path, 'ndk', 'r20', 'basename'))) - self.assertFalse(os.path.exists(os.path.join(sdk_path, 'ndk', 'r20', 'bad_abs_link'))) - self.assertFalse(os.path.exists(os.path.join(sdk_path, 'ndk', 'r20', 'bad_rel_link'))) - self.assertFalse(os.path.exists(os.path.join(sdk_path, 'ndk', 'r20', 'bad_rel_link2'))) - os.system('ls -l ' + os.path.join(sdk_path, 'ndk', 'r20')) + self.assertTrue(os.path.exists(os.path.join(self.tmpdir, 'ndk', 'r20'))) + self.assertTrue(os.path.exists(os.path.join(self.tmpdir, 'ndk', 'r20', 'basename'))) + self.assertFalse(os.path.exists(os.path.join(self.tmpdir, 'ndk', 'r20', 'bad_abs_link'))) + self.assertFalse(os.path.exists(os.path.join(self.tmpdir, 'ndk', 'r20', 'bad_rel_link'))) + self.assertFalse(os.path.exists(os.path.join(self.tmpdir, 'ndk', 'r20', 'bad_rel_link2'))) + os.system('ls -l ' + os.path.join(self.tmpdir, 'ndk', 'r20')) def test_fill_config_defaults(self): """Test the auto-detection of NDKs installed in standard paths""" - sdk_path = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - - ndk_bundle = os.path.join(sdk_path, 'ndk-bundle') + ndk_bundle = os.path.join(self.tmpdir, 'ndk-bundle') os.makedirs(ndk_bundle) with open(os.path.join(ndk_bundle, 'source.properties'), 'w') as fp: fp.write('Pkg.Desc = Android NDK\nPkg.Revision = 17.2.4988734\n') - config = {'sdk_path': sdk_path} + config = {'sdk_path': self.tmpdir} fdroidserver.common.fill_config_defaults(config) self.assertEqual({'r17c': ndk_bundle}, config['ndk_paths']) - r21e = os.path.join(sdk_path, 'ndk', '21.4.7075529') + r21e = os.path.join(self.tmpdir, 'ndk', '21.4.7075529') os.makedirs(r21e) with open(os.path.join(r21e, 'source.properties'), 'w') as fp: fp.write('Pkg.Desc = Android NDK\nPkg.Revision = 21.4.7075529\n') - config = {'sdk_path': sdk_path} + config = {'sdk_path': self.tmpdir} fdroidserver.common.fill_config_defaults(config) self.assertEqual({'r17c': ndk_bundle, 'r21e': r21e}, config['ndk_paths']) - r10e = os.path.join(sdk_path, 'ndk', 'r10e') + r10e = os.path.join(self.tmpdir, 'ndk', 'r10e') os.makedirs(r10e) with open(os.path.join(r10e, 'RELEASE.TXT'), 'w') as fp: fp.write('r10e-rc4 (64-bit)\n') - config = {'sdk_path': sdk_path} + config = {'sdk_path': self.tmpdir} fdroidserver.common.fill_config_defaults(config) self.assertEqual( {'r10e': r10e, 'r17c': ndk_bundle, 'r21e': r21e}, config['ndk_paths'] @@ -2516,10 +2408,7 @@ class CommonTest(unittest.TestCase): self.assertFalse(is_repo_file(f), f + ' not repo file') def test_get_apksigner_smartcardoptions(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: d = { 'smartcardoptions': '-storetype PKCS11' @@ -2547,10 +2436,7 @@ class CommonTest(unittest.TestCase): ) def test_get_smartcardoptions_list(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write( textwrap.dedent( @@ -2585,10 +2471,7 @@ class CommonTest(unittest.TestCase): ) def test_get_smartcardoptions_spaces(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write( textwrap.dedent( @@ -2616,10 +2499,7 @@ class CommonTest(unittest.TestCase): ) def test_get_smartcardoptions_config_py(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.tmpdir) with open('config.py', 'w') as fp: fp.write( textwrap.dedent( diff --git a/tests/import_subcommand.TestCase b/tests/import_subcommand.TestCase index 307f2bca..dbe6ec38 100755 --- a/tests/import_subcommand.TestCase +++ b/tests/import_subcommand.TestCase @@ -4,7 +4,6 @@ import logging import optparse -import os import shutil import sys import tempfile @@ -31,36 +30,30 @@ class ImportTest(unittest.TestCase): def setUp(self): logging.basicConfig(level=logging.DEBUG) self.basedir = localmodule / 'tests' - self.tmpdir = localmodule / '.testfiles' - self.tmpdir.mkdir(exist_ok=True) - # TODO: Python3.6: Accepts a path-like object. - os.chdir(str(self.basedir)) fdroidserver.import_subcommand.options = mock.Mock() fdroidserver.import_subcommand.options.rev = None def test_import_gitlab(self): - # FDroidPopen needs some config to work - config = dict() - fdroidserver.common.fill_config_defaults(config) - fdroidserver.common.config = config + with tempfile.TemporaryDirectory() as testdir, TmpCwd(testdir): + # FDroidPopen needs some config to work + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.common.config = config - url = 'https://gitlab.com/fdroid/ci-test-app' - r = requests.head(url, timeout=300) - if r.status_code != 200: - print("ERROR", url, 'unreachable (', r.status_code, ')') - print('Skipping ImportTest!') - return + url = 'https://gitlab.com/fdroid/ci-test-app' + r = requests.head(url, timeout=300) + if r.status_code != 200: + print("ERROR", url, 'unreachable (', r.status_code, ')') + print('Skipping ImportTest!') + return - app = fdroidserver.import_subcommand.get_app_from_url(url) - fdroidserver.import_subcommand.clone_to_tmp_dir(app) - self.assertEqual(app.RepoType, 'git') - self.assertEqual(app.Repo, 'https://gitlab.com/fdroid/ci-test-app.git') + app = fdroidserver.import_subcommand.get_app_from_url(url) + fdroidserver.import_subcommand.clone_to_tmp_dir(app) + self.assertEqual(app.RepoType, 'git') + self.assertEqual(app.Repo, 'https://gitlab.com/fdroid/ci-test-app.git') def test_get_app_from_url(self): - # TODO: Pytohn3.6: The dir parameter now accepts a path-like object. - with tempfile.TemporaryDirectory(dir=str(self.tmpdir)) as testdir, TmpCwd( - testdir - ): + with tempfile.TemporaryDirectory() as testdir, TmpCwd(testdir): testdir = Path(testdir) (testdir / 'tmp').mkdir() tmp_importer = testdir / 'tmp/importer' diff --git a/tests/index.TestCase b/tests/index.TestCase index 1c8e9854..9797a0b3 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -26,7 +26,7 @@ import fdroidserver.index import fdroidserver.net import fdroidserver.signindex import fdroidserver.publish -from testcommon import TmpCwd +from testcommon import TmpCwd, mkdtemp from pathlib import Path @@ -44,10 +44,6 @@ class IndexTest(unittest.TestCase): logging.basicConfig(level=logging.DEBUG) self.basedir = os.path.join(localmodule, 'tests') os.chmod(os.path.join(self.basedir, 'config.py'), 0o600) - self.tmpdir = os.path.abspath(os.path.join(self.basedir, '..', '.testfiles')) - if not os.path.exists(self.tmpdir): - os.makedirs(self.tmpdir) - os.chdir(self.basedir) fdroidserver.common.config = None fdroidserver.common.options = Options @@ -60,6 +56,13 @@ class IndexTest(unittest.TestCase): fdroidserver.signindex.sign_index( os.path.join(self.basedir, 'repo'), 'index-v1.json' ) + self._td = mkdtemp() + self.testdir = self._td.name + + def tearDown(self): + os.chdir(self.basedir) + self._td.cleanup() + os.remove('repo/index-v1.jar') def test_get_public_key_from_jar_succeeds(self): source_dir = os.path.join(self.basedir, 'signindex') @@ -269,10 +272,7 @@ class IndexTest(unittest.TestCase): self.assertEqual(json.dumps(i, indent=2), json.dumps(o, indent=2)) def test_make_v0_repo_only(self): - tmptestsdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(tmptestsdir) + os.chdir(self.testdir) os.mkdir('repo') repo_icons_dir = os.path.join('repo', 'icons') self.assertFalse(os.path.isdir(repo_icons_dir)) @@ -298,10 +298,7 @@ class IndexTest(unittest.TestCase): self.assertTrue(os.path.exists(os.path.join('repo', 'index.xml'))) def test_make_v0(self): - tmptestsdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(tmptestsdir) + os.chdir(self.testdir) os.mkdir('metadata') os.mkdir('repo') metadatafile = 'metadata/info.zwanenburg.caffeinetile.yml' @@ -368,10 +365,7 @@ class IndexTest(unittest.TestCase): present. """ - tmptestsdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(tmptestsdir) + os.chdir(self.testdir) os.mkdir('repo') repo_icons_dir = os.path.join('repo', 'icons') self.assertFalse(os.path.isdir(repo_icons_dir)) @@ -463,10 +457,7 @@ class IndexTest(unittest.TestCase): ) def test_make_website(self): - tmptestsdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(tmptestsdir) + os.chdir(self.testdir) os.mkdir('metadata') os.mkdir('repo') diff --git a/tests/init.TestCase b/tests/init.TestCase index f19c59e5..8e1042c3 100755 --- a/tests/init.TestCase +++ b/tests/init.TestCase @@ -8,7 +8,6 @@ import os import optparse import shutil import sys -import tempfile import unittest @@ -20,6 +19,7 @@ if localmodule not in sys.path: sys.path.insert(0, localmodule) import fdroidserver.init +from testcommon import mkdtemp class InitTest(unittest.TestCase): @@ -28,18 +28,17 @@ class InitTest(unittest.TestCase): def setUp(self): logging.basicConfig(level=logging.DEBUG) self.basedir = os.path.join(localmodule, 'tests') - self.tmpdir = os.path.abspath(os.path.join(self.basedir, '..', '.testfiles')) - if not os.path.exists(self.tmpdir): - os.makedirs(self.tmpdir) - os.chdir(self.basedir) fdroidserver.common.config = None fdroidserver.init.config = None + self._td = mkdtemp() + self.testdir = self._td.name + + def tearDown(self): + self._td.cleanup() + os.chdir(self.basedir) def test_disable_in_config(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.testdir) with open('config.yml', 'w') as fp: fp.write('keystore: NONE\n') fp.write('keypass: mysupersecrets\n') @@ -57,12 +56,9 @@ class InitTest(unittest.TestCase): @unittest.skipIf(os.name == 'nt', "calling main() like this hangs on Windows") def test_main_in_empty_dir(self): """Test that `fdroid init` will find apksigner and add it to the config""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.testdir) - shutil.copy(os.path.join(self.basedir, 'keystore.jks'), testdir) + shutil.copy(os.path.join(self.basedir, 'keystore.jks'), self.testdir) bindir = os.path.join(os.getcwd(), 'bin') os.mkdir(bindir) diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index ccc76a32..7d96bf5b 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -38,10 +38,18 @@ class MetadataTest(unittest.TestCase): def setUp(self): logging.basicConfig(level=logging.DEBUG) self.basedir = localmodule / 'tests' - self.tmpdir = localmodule / '.testfiles' - self.tmpdir.mkdir(exist_ok=True) - # TODO: Python3.6: Accepts a path-like object. - os.chdir(str(self.basedir)) + os.chdir(self.basedir) + + def tearDown(self): + # auto-generated dirs by functions, not tests, so they are not always cleaned up + try: + os.rmdir("srclibs") + except OSError: + pass + try: + os.rmdir("tmp") + except OSError: + pass def test_fieldtypes_key_exist(self): for k in fdroidserver.metadata.fieldtypes.keys(): @@ -218,8 +226,7 @@ class MetadataTest(unittest.TestCase): # yaml.dump(frommeta, f, default_flow_style=False) def test_rewrite_yaml_fakeotaupdate(self): - # TODO: Pytohn3.6: The dir parameter now accepts a path-like object. - with tempfile.TemporaryDirectory(dir=str(self.tmpdir)) as testdir: + with tempfile.TemporaryDirectory() as testdir: testdir = Path(testdir) fdroidserver.common.config = {'accepted_formats': ['yml']} fdroidserver.metadata.warnings_action = None @@ -241,8 +248,7 @@ class MetadataTest(unittest.TestCase): ) def test_rewrite_yaml_fdroidclient(self): - # TODO: Pytohn3.6: The dir parameter now accepts a path-like object. - with tempfile.TemporaryDirectory(dir=str(self.tmpdir)) as testdir: + with tempfile.TemporaryDirectory() as testdir: testdir = Path(testdir) fdroidserver.common.config = {'accepted_formats': ['yml']} @@ -263,8 +269,7 @@ class MetadataTest(unittest.TestCase): ) def test_rewrite_yaml_special_build_params(self): - # TODO: Pytohn3.6: The dir parameter now accepts a path-like object. - with tempfile.TemporaryDirectory(dir=str(self.tmpdir)) as testdir: + with tempfile.TemporaryDirectory() as testdir: testdir = Path(testdir) # rewrite metadata @@ -334,10 +339,7 @@ class MetadataTest(unittest.TestCase): self.assertEqual('1234567890', yamldata['Builds'][0]['commit']) def test_read_metadata_sort_by_time(self): - # TODO: Pytohn3.6: The dir parameter now accepts a path-like object. - with tempfile.TemporaryDirectory(dir=str(self.tmpdir)) as testdir, TmpCwd( - testdir - ): + with tempfile.TemporaryDirectory() as testdir, TmpCwd(testdir): testdir = Path(testdir) metadatadir = testdir / 'metadata' metadatadir.mkdir() @@ -393,8 +395,7 @@ class MetadataTest(unittest.TestCase): fdroidserver.metadata.parse_yaml_metadata(mf, {}) def test_parse_yaml_srclib_corrupt_file(self): - # TODO: Pytohn3.6: The dir parameter now accepts a path-like object. - with tempfile.TemporaryDirectory(dir=str(self.tmpdir)) as testdir: + with tempfile.TemporaryDirectory() as testdir: testdir = Path(testdir) srclibfile = testdir / 'srclib/mock.yml' srclibfile.parent.mkdir() @@ -1117,29 +1118,30 @@ class MetadataTest(unittest.TestCase): def test_build_ndk_path(self): """""" - config = {'ndk_paths': {}, 'sdk_path': tempfile.mkdtemp(prefix='android-sdk-')} - fdroidserver.common.config = config + with tempfile.TemporaryDirectory(prefix='android-sdk-') as sdk_path: + config = {'ndk_paths': {}, 'sdk_path': sdk_path} + fdroidserver.common.config = config - build = fdroidserver.metadata.Build() - build.ndk = 'r10e' - self.assertEqual('', build.ndk_path()) + build = fdroidserver.metadata.Build() + build.ndk = 'r10e' + self.assertEqual('', build.ndk_path()) - correct = '/fake/path/ndk/r21b' - config['ndk_paths'] = {'r21b': correct} - self.assertEqual('', build.ndk_path()) - config['ndk_paths'] = {'r10e': correct} - self.assertEqual(correct, build.ndk_path()) + correct = '/fake/path/ndk/r21b' + config['ndk_paths'] = {'r21b': correct} + self.assertEqual('', build.ndk_path()) + config['ndk_paths'] = {'r10e': correct} + self.assertEqual(correct, build.ndk_path()) - r10e = '/fake/path/ndk/r10e' - r22b = '/fake/path/ndk/r22e' - config['ndk_paths'] = {'r10e': r10e, 'r22b': r22b} - self.assertEqual(r10e, build.ndk_path()) + r10e = '/fake/path/ndk/r10e' + r22b = '/fake/path/ndk/r22e' + config['ndk_paths'] = {'r10e': r10e, 'r22b': r22b} + self.assertEqual(r10e, build.ndk_path()) - build.ndk = ['r10e', 'r22b'] - self.assertEqual(r10e, build.ndk_path()) + build.ndk = ['r10e', 'r22b'] + self.assertEqual(r10e, build.ndk_path()) - build.ndk = ['r22b', 'r10e'] - self.assertEqual(r22b, build.ndk_path()) + build.ndk = ['r22b', 'r10e'] + self.assertEqual(r22b, build.ndk_path()) if __name__ == "__main__": diff --git a/tests/nightly.TestCase b/tests/nightly.TestCase index 85a75abd..f93d3b66 100755 --- a/tests/nightly.TestCase +++ b/tests/nightly.TestCase @@ -122,6 +122,7 @@ class NightlyTest(unittest.TestCase): assert '-----BEGIN RSA PRIVATE KEY-----' in fp.read() with open(ssh_private_key_file + '.pub') as fp: assert fp.read(8) == 'ssh-rsa ' + shutil.rmtree(os.path.dirname(ssh_private_key_file)) @patch.dict(os.environ, clear=True) @patch('sys.argv', ['fdroid nightly', '--verbose']) diff --git a/tests/publish.TestCase b/tests/publish.TestCase index ccad450f..7542c5f7 100755 --- a/tests/publish.TestCase +++ b/tests/publish.TestCase @@ -34,6 +34,7 @@ from fdroidserver import common from fdroidserver import metadata from fdroidserver import signatures from fdroidserver.exception import FDroidException +from testcommon import mkdtemp class PublishTest(unittest.TestCase): @@ -42,9 +43,12 @@ class PublishTest(unittest.TestCase): def setUp(self): logging.basicConfig(level=logging.DEBUG) self.basedir = os.path.join(localmodule, 'tests') - self.tmpdir = os.path.abspath(os.path.join(self.basedir, '..', '.testfiles')) - if not os.path.exists(self.tmpdir): - os.makedirs(self.tmpdir) + os.chdir(self.basedir) + self._td = mkdtemp() + self.testdir = self._td.name + + def tearDown(self): + self._td.cleanup() os.chdir(self.basedir) def test_key_alias(self): @@ -88,7 +92,7 @@ class PublishTest(unittest.TestCase): publish.config = common.config publish.config['keystorepass'] = '123456' publish.config['keypass'] = '123456' - publish.config['keystore'] = os.path.join(os.getcwd(), 'dummy-keystore.jks') + publish.config['keystore'] = os.path.join(self.basedir, 'dummy-keystore.jks') publish.config['repo_keyalias'] = 'repokey' appids = [ @@ -99,10 +103,7 @@ class PublishTest(unittest.TestCase): 'org.org.org', ] - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.testdir) with open('config.py', 'w') as f: pass @@ -142,14 +143,11 @@ class PublishTest(unittest.TestCase): publish.config = common.config publish.config['keystorepass'] = '123456' publish.config['keypass'] = '123456' - publish.config['keystore'] = os.path.join(os.getcwd(), 'dummy-keystore.jks') + publish.config['keystore'] = os.path.join(self.basedir, 'dummy-keystore.jks') publish.config['repo_keyalias'] = 'repokey' publish.config['repo_key_sha256'] = 'bad bad bad bad bad bad bad bad bad bad bad bad' - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.testdir) publish.store_stats_fdroid_signing_key_fingerprints({}, indent=2) with self.assertRaises(FDroidException): common.load_stats_fdroid_signing_key_fingerprints() @@ -162,24 +160,20 @@ class PublishTest(unittest.TestCase): publish.config['repo_keyalias'] = 'sova' publish.config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' publish.config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - - shutil.copy('keystore.jks', testdir) - os.mkdir(os.path.join(testdir, 'repo')) - metadata_dir = os.path.join(testdir, 'metadata') + shutil.copy('keystore.jks', self.testdir) + os.mkdir(os.path.join(self.testdir, 'repo')) + metadata_dir = os.path.join(self.testdir, 'metadata') os.mkdir(metadata_dir) shutil.copy(os.path.join('metadata', 'com.politedroid.yml'), metadata_dir) with open(os.path.join(metadata_dir, 'com.politedroid.yml'), 'a') as fp: fp.write('\nBinaries: https://placeholder/foo%v.apk\n') - os.mkdir(os.path.join(testdir, 'unsigned')) - shutil.copy('repo/com.politedroid_6.apk', os.path.join(testdir, 'unsigned')) - os.mkdir(os.path.join(testdir, 'unsigned', 'binaries')) + os.mkdir(os.path.join(self.testdir, 'unsigned')) + shutil.copy('repo/com.politedroid_6.apk', os.path.join(self.testdir, 'unsigned')) + os.mkdir(os.path.join(self.testdir, 'unsigned', 'binaries')) shutil.copy('repo/com.politedroid_6.apk', - os.path.join(testdir, 'unsigned', 'binaries', 'com.politedroid_6.binary.apk')) + os.path.join(self.testdir, 'unsigned', 'binaries', 'com.politedroid_6.binary.apk')) - os.chdir(testdir) + os.chdir(self.testdir) with mock.patch.object(sys, 'argv', ['fdroid fakesubcommand']): publish.main() @@ -222,8 +216,7 @@ class PublishTest(unittest.TestCase): publish.config['keypass'] = '654321' publish.config['keystore'] = "keystore.jks" publish.config['keydname'] = 'CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US' - testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir) - os.chdir(testdir) + os.chdir(self.testdir) keystore = jks.KeyStore.new("jks", []) keystore.save(publish.config['keystore'], publish.config['keystorepass']) @@ -272,10 +265,7 @@ class PublishTest(unittest.TestCase): class Options: verbose = False - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.testdir) config = common.read_config(Options) if 'apksigner' not in config: @@ -283,7 +273,7 @@ class PublishTest(unittest.TestCase): config['repo_keyalias'] = 'sova' config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' - shutil.copy(os.path.join(self.basedir, 'keystore.jks'), testdir) + shutil.copy(os.path.join(self.basedir, 'keystore.jks'), self.testdir) config['keystore'] = 'keystore.jks' config['keydname'] = 'CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US' publish.config = config diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 49efee00..9e17750a 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -30,17 +30,20 @@ import fdroidserver.build import fdroidserver.common import fdroidserver.metadata import fdroidserver.scanner -from testcommon import TmpCwd, mock_open_to_str +from testcommon import TmpCwd, mkdtemp, mock_open_to_str class ScannerTest(unittest.TestCase): def setUp(self): logging.basicConfig(level=logging.INFO) self.basedir = os.path.join(localmodule, 'tests') - self.tmpdir = os.path.abspath(os.path.join(self.basedir, '..', '.testfiles')) - if not os.path.exists(self.tmpdir): - os.makedirs(self.tmpdir) os.chdir(self.basedir) + self._td = mkdtemp() + self.testdir = self._td.name + + def tearDown(self): + os.chdir(self.basedir) + self._td.cleanup() def test_scan_source_files(self): fdroidserver.scanner.options = mock.Mock() @@ -97,10 +100,7 @@ class ScannerTest(unittest.TestCase): def test_scan_source_files_sneaky_maven(self): """Check for sneaking in banned maven repos""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.testdir) fdroidserver.scanner.config = None fdroidserver.scanner.options = mock.Mock() fdroidserver.scanner.options.json = True @@ -119,7 +119,7 @@ class ScannerTest(unittest.TestCase): """ ) ) - count = fdroidserver.scanner.scan_source(testdir) + count = fdroidserver.scanner.scan_source(self.testdir) self.assertEqual(2, count, 'there should be this many errors') def test_scan_source_file_types(self): @@ -129,11 +129,8 @@ class ScannerTest(unittest.TestCase): difference between absolute and relative paths. """ - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) build_dir = os.path.join('build', 'fake.app') - abs_build_dir = os.path.join(testdir, build_dir) + abs_build_dir = os.path.join(self.testdir, build_dir) os.makedirs(abs_build_dir, exist_ok=True) os.chdir(abs_build_dir) @@ -174,7 +171,7 @@ class ScannerTest(unittest.TestCase): os.system('ls -l fake.png') # run scanner as if from `fdroid build` - os.chdir(testdir) + os.chdir(self.testdir) count = fdroidserver.scanner.scan_source(build_dir) self.assertEqual(6, count, 'there should be this many errors') os.chdir(build_dir) @@ -224,11 +221,7 @@ class ScannerTest(unittest.TestCase): def test_build_local_scanner(self): """`fdroid build` calls scanner functions, test them here""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) - + os.chdir(self.testdir) config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config @@ -284,8 +277,8 @@ class ScannerTest(unittest.TestCase): app, build, vcs, - build_dir=testdir, - output_dir=testdir, + build_dir=self.testdir, + output_dir=self.testdir, log_dir=None, srclib_dir=None, extlib_dir=None, @@ -314,10 +307,7 @@ class ScannerTest(unittest.TestCase): def test_scan_gradle_file_with_multiple_problems(self): """Check that the scanner can handle scandelete with gradle files with multiple problems""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.testdir) fdroidserver.scanner.config = None fdroidserver.scanner.options = mock.Mock() build = fdroidserver.metadata.Build() @@ -335,7 +325,7 @@ class ScannerTest(unittest.TestCase): """ ) ) - count = fdroidserver.scanner.scan_source(testdir, build) + count = fdroidserver.scanner.scan_source(self.testdir, build) self.assertFalse(os.path.exists("build.gradle")) self.assertEqual(0, count, 'there should be this many errors') diff --git a/tests/testcommon.py b/tests/testcommon.py index 29b3f9b6..61c1a904 100644 --- a/tests/testcommon.py +++ b/tests/testcommon.py @@ -17,6 +17,7 @@ import os import sys +import tempfile class TmpCwd(): @@ -58,3 +59,10 @@ def mock_open_to_str(mock): return "".join([ x.args[0] for x in mock.mock_calls if str(x).startswith("call().write(") ]) + + +def mkdtemp(): + if sys.version_info < (3, 10): # ignore_cleanup_errors was added in 3.10 + return tempfile.TemporaryDirectory() + else: + return tempfile.TemporaryDirectory(ignore_cleanup_errors=True) diff --git a/tests/update.TestCase b/tests/update.TestCase index 1582968e..0a102dfd 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -22,7 +22,7 @@ import zipfile import textwrap from datetime import datetime from distutils.version import LooseVersion -from testcommon import TmpCwd +from testcommon import TmpCwd, mkdtemp from unittest import mock try: @@ -79,19 +79,19 @@ class UpdateTest(unittest.TestCase): logging.getLogger(PngImagePlugin.__name__).setLevel(logging.INFO) self.basedir = os.path.join(localmodule, 'tests') - self.tmpdir = os.path.abspath(os.path.join(self.basedir, '..', '.testfiles')) - if not os.path.exists(self.tmpdir): - os.makedirs(self.tmpdir) os.chdir(self.basedir) + self._td = mkdtemp() + self.testdir = self._td.name fdroidserver.common.config = None fdroidserver.common.options = None + def tearDown(self): + os.chdir(self.basedir) + self._td.cleanup() + def test_insert_store_metadata(self): - tmptestsdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(tmptestsdir) + os.chdir(self.testdir) config = dict() fdroidserver.common.fill_config_defaults(config) @@ -124,7 +124,7 @@ class UpdateTest(unittest.TestCase): ): shutil.copytree( os.path.join(self.basedir, 'source-files', packageName), - os.path.join(tmptestsdir, 'build', packageName), + os.path.join(self.testdir, 'build', packageName), ) testfilename = 'icon_yAfSvPRJukZzMMfUzvbYqwaD1XmHXNtiPBtuPVHW-6s=.png' @@ -215,10 +215,7 @@ class UpdateTest(unittest.TestCase): https://docs.fastlane.tools/actions/supply/#changelogs-whats-new """ - tmptestsdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(tmptestsdir) + os.chdir(self.testdir) config = dict() fdroidserver.common.fill_config_defaults(config) @@ -254,11 +251,12 @@ class UpdateTest(unittest.TestCase): def test_name_title_scraping(self): """metadata file --> fdroiddata localized files --> fastlane/triple-t in app source --> APK""" + shutil.copytree(self.basedir, self.testdir, dirs_exist_ok=True) config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config - os.chdir(os.path.join(localmodule, 'tests')) + os.chdir(self.testdir) fdroidserver.common.options = Options fdroidserver.update.options = fdroidserver.common.options fdroidserver.update.options.clean = True @@ -340,6 +338,8 @@ class UpdateTest(unittest.TestCase): self.assertEqual(testvalue, app['localized']['en-US']['name']) def test_insert_missing_app_names_from_apks_from_repo(self): + os.chdir(self.testdir) + shutil.copytree(self.basedir, self.testdir, dirs_exist_ok=True) config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config @@ -393,9 +393,7 @@ class UpdateTest(unittest.TestCase): if not os.path.isdir(importer): logging.warning('skipping test_insert_triple_t_metadata, import.TestCase must run first!') return - tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, - dir=self.tmpdir) - packageDir = os.path.join(tmptestsdir, 'build', packageName) + packageDir = os.path.join(self.testdir, 'build', packageName) shutil.copytree(importer, packageDir) # always use the same commit so these tests work when ci-test-app.git is updated @@ -405,17 +403,17 @@ class UpdateTest(unittest.TestCase): repo.git.reset('--hard', 'b9e5d1a0d8d6fc31d4674b2f0514fef10762ed4f') repo.git.clean('-fdx') - os.mkdir(os.path.join(tmptestsdir, 'metadata')) + os.mkdir(os.path.join(self.testdir, 'metadata')) metadata = dict() metadata['Description'] = 'This is just a test app' - with open(os.path.join(tmptestsdir, 'metadata', packageName + '.yml'), 'w') as fp: + with open(os.path.join(self.testdir, 'metadata', packageName + '.yml'), 'w') as fp: yaml.dump(metadata, fp) config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config - os.chdir(tmptestsdir) + os.chdir(self.testdir) apps = fdroidserver.metadata.read_metadata() fdroidserver.update.copy_triple_t_store_metadata(apps) @@ -436,12 +434,8 @@ class UpdateTest(unittest.TestCase): def test_insert_triple_t_2_metadata(self): packageName = 'org.piwigo.android' - tmptestsdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.rmdir(tmptestsdir) - shutil.copytree(os.path.join(self.basedir, 'triple-t-2'), tmptestsdir) - os.chdir(tmptestsdir) + shutil.copytree(os.path.join(self.basedir, 'triple-t-2'), self.testdir, dirs_exist_ok=True) + os.chdir(self.testdir) config = dict() fdroidserver.common.fill_config_defaults(config) @@ -478,12 +472,8 @@ class UpdateTest(unittest.TestCase): packages = ('com.anysoftkeyboard.languagepack.dutch', 'com.menny.android.anysoftkeyboard') names = ('Dutch for AnySoftKeyboard', 'AnySoftKeyboard') - tmptestsdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.rmdir(tmptestsdir) - shutil.copytree(os.path.join(self.basedir, 'triple-t-anysoftkeyboard'), tmptestsdir) - os.chdir(tmptestsdir) + shutil.copytree(os.path.join(self.basedir, 'triple-t-anysoftkeyboard'), self.testdir, dirs_exist_ok=True) + os.chdir(self.testdir) for packageName, name in zip(packages, names): config = dict() @@ -503,12 +493,8 @@ class UpdateTest(unittest.TestCase): packages = ('verifier', 'wallet') names = dict(verifier='COVID Certificate Check', wallet='COVID Certificate') - tmptestsdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.rmdir(tmptestsdir) - shutil.copytree(os.path.join(self.basedir, 'triple-t-multiple'), tmptestsdir) - os.chdir(tmptestsdir) + shutil.copytree(os.path.join(self.basedir, 'triple-t-multiple'), self.testdir, dirs_exist_ok=True) + os.chdir(self.testdir) for p in packages: packageName = namespace + p @@ -527,12 +513,8 @@ class UpdateTest(unittest.TestCase): def test_insert_triple_t_flutter(self): packageName = 'fr.emersion.goguma' - tmptestsdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.rmdir(tmptestsdir) - shutil.copytree(os.path.join(self.basedir, 'triple-t-flutter'), tmptestsdir) - os.chdir(tmptestsdir) + shutil.copytree(os.path.join(self.basedir, 'triple-t-flutter'), self.testdir, dirs_exist_ok=True) + os.chdir(self.testdir) config = dict() fdroidserver.common.fill_config_defaults(config) @@ -609,11 +591,7 @@ class UpdateTest(unittest.TestCase): "python sig was: " + str(sig)) def testScanApksAndObbs(self): - os.chdir(os.path.join(localmodule, 'tests')) - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.testdir) shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') shutil.copytree(os.path.join(self.basedir, 'metadata'), 'metadata') config = dict() @@ -668,11 +646,7 @@ class UpdateTest(unittest.TestCase): def test_apkcache_json(self): """test the migration from pickle to json""" - os.chdir(os.path.join(localmodule, 'tests')) - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.testdir) shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') config = dict() fdroidserver.common.fill_config_defaults(config) @@ -711,10 +685,7 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.config = config fdroidserver.update.config = config - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.testdir) os.mkdir('repo') os.mkdir('stats') with open(os.path.join('stats', 'known_apks.txt'), 'w') as fp: @@ -736,25 +707,27 @@ class UpdateTest(unittest.TestCase): ) def test_read_added_date_from_all_apks(self): + os.chdir(self.testdir) + shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config fdroidserver.common.options = Options - os.chdir(os.path.join(localmodule, 'tests')) apps = fdroidserver.metadata.read_metadata() knownapks = fdroidserver.common.KnownApks() apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks) fdroidserver.update.read_added_date_from_all_apks(apps, apks) def test_apply_info_from_latest_apk(self): + os.chdir(self.testdir) + shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config fdroidserver.common.options = Options fdroidserver.update.options = fdroidserver.common.options - os.chdir(os.path.join(localmodule, 'tests')) apps = fdroidserver.metadata.read_metadata() knownapks = fdroidserver.common.KnownApks() apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks) @@ -765,7 +738,7 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config - os.chdir(os.path.join(localmodule, 'tests')) + os.chdir(self.basedir) if 'apksigner' in config: apk_info = fdroidserver.update.scan_apk('v2.only.sig_2.apk') @@ -873,7 +846,7 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config - os.chdir(os.path.join(localmodule, 'tests')) + os.chdir(self.basedir) if os.path.basename(os.getcwd()) != 'tests': raise Exception('This test must be run in the "tests/" subdir') @@ -885,10 +858,7 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.testdir) os.mkdir('repo') apkfile = 'repo/badzip_1.apk' with open(apkfile, 'w') as fp: @@ -935,11 +905,13 @@ class UpdateTest(unittest.TestCase): '''Creates a YAML representation of a Build instance''' return dumper.represent_dict(data) + os.chdir(self.testdir) + shutil.copytree(self.basedir, 'tests') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config - os.chdir(os.path.join(localmodule, 'tests')) + os.chdir("tests") config['ndk_paths'] = dict() fdroidserver.common.config = config @@ -1016,87 +988,83 @@ class UpdateTest(unittest.TestCase): knownapks = fdroidserver.common.KnownApks() - tmptestsdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - print('tmptestsdir', tmptestsdir) - os.chdir(tmptestsdir) - os.mkdir('repo') - os.mkdir('archive') - # setup the repo, create icons dirs, etc. - fdroidserver.update.process_apks({}, 'repo', knownapks) - fdroidserver.update.process_apks({}, 'archive', knownapks) + with tempfile.TemporaryDirectory() as tmptestsdir, TmpCwd(tmptestsdir): + os.mkdir('repo') + os.mkdir('archive') + # setup the repo, create icons dirs, etc. + fdroidserver.update.process_apks({}, 'repo', knownapks) + fdroidserver.update.process_apks({}, 'archive', knownapks) - disabledsigs = ['org.bitbucket.tickytacky.mirrormirror_2.apk'] - for apkName in disabledsigs: - shutil.copy(os.path.join(self.basedir, apkName), - os.path.join(tmptestsdir, 'repo')) + disabledsigs = ['org.bitbucket.tickytacky.mirrormirror_2.apk'] + for apkName in disabledsigs: + shutil.copy(os.path.join(self.basedir, apkName), + os.path.join(tmptestsdir, 'repo')) - skip, apk, cachechanged = fdroidserver.update.process_apk({}, apkName, 'repo', - knownapks, - allow_disabled_algorithms=True, - archive_bad_sig=False) - self.assertFalse(skip) - self.assertIsNotNone(apk) - self.assertTrue(cachechanged) - self.assertFalse(os.path.exists(os.path.join('archive', apkName))) - self.assertTrue(os.path.exists(os.path.join('repo', apkName))) + skip, apk, cachechanged = fdroidserver.update.process_apk({}, apkName, 'repo', + knownapks, + allow_disabled_algorithms=True, + archive_bad_sig=False) + self.assertFalse(skip) + self.assertIsNotNone(apk) + self.assertTrue(cachechanged) + self.assertFalse(os.path.exists(os.path.join('archive', apkName))) + self.assertTrue(os.path.exists(os.path.join('repo', apkName))) - if os.path.exists('/usr/bin/apksigner') or 'apksigner' in config: - print('SKIPPING: apksigner installed and it allows MD5 signatures') - return + if os.path.exists('/usr/bin/apksigner') or 'apksigner' in config: + print('SKIPPING: apksigner installed and it allows MD5 signatures') + return - javac = config['jarsigner'].replace('jarsigner', 'javac') - v = subprocess.check_output([javac, '-version'], stderr=subprocess.STDOUT)[6:-1].decode('utf-8') - if LooseVersion(v) < LooseVersion('1.8.0_132'): - print('SKIPPING: running tests with old Java (' + v + ')') - return + javac = config['jarsigner'].replace('jarsigner', 'javac') + v = subprocess.check_output([javac, '-version'], stderr=subprocess.STDOUT)[6:-1].decode('utf-8') + if LooseVersion(v) < LooseVersion('1.8.0_132'): + print('SKIPPING: running tests with old Java (' + v + ')') + return - # this test only works on systems with fully updated Java/jarsigner - # that has MD5 listed in jdk.jar.disabledAlgorithms in java.security - # https://blogs.oracle.com/java-platform-group/oracle-jre-will-no-longer-trust-md5-signed-code-by-default - skip, apk, cachechanged = fdroidserver.update.process_apk({}, apkName, 'repo', - knownapks, - allow_disabled_algorithms=False, - archive_bad_sig=True) - self.assertTrue(skip) - self.assertIsNone(apk) - self.assertFalse(cachechanged) - self.assertTrue(os.path.exists(os.path.join('archive', apkName))) - self.assertFalse(os.path.exists(os.path.join('repo', apkName))) + # this test only works on systems with fully updated Java/jarsigner + # that has MD5 listed in jdk.jar.disabledAlgorithms in java.security + # https://blogs.oracle.com/java-platform-group/oracle-jre-will-no-longer-trust-md5-signed-code-by-default + skip, apk, cachechanged = fdroidserver.update.process_apk({}, apkName, 'repo', + knownapks, + allow_disabled_algorithms=False, + archive_bad_sig=True) + self.assertTrue(skip) + self.assertIsNone(apk) + self.assertFalse(cachechanged) + self.assertTrue(os.path.exists(os.path.join('archive', apkName))) + self.assertFalse(os.path.exists(os.path.join('repo', apkName))) - skip, apk, cachechanged = fdroidserver.update.process_apk({}, apkName, 'archive', - knownapks, - allow_disabled_algorithms=False, - archive_bad_sig=False) - self.assertFalse(skip) - self.assertIsNotNone(apk) - self.assertTrue(cachechanged) - self.assertTrue(os.path.exists(os.path.join('archive', apkName))) - self.assertFalse(os.path.exists(os.path.join('repo', apkName))) + skip, apk, cachechanged = fdroidserver.update.process_apk({}, apkName, 'archive', + knownapks, + allow_disabled_algorithms=False, + archive_bad_sig=False) + self.assertFalse(skip) + self.assertIsNotNone(apk) + self.assertTrue(cachechanged) + self.assertTrue(os.path.exists(os.path.join('archive', apkName))) + self.assertFalse(os.path.exists(os.path.join('repo', apkName))) - # ensure that icons have been moved to the archive as well - for density in fdroidserver.update.screen_densities: - icon_path = os.path.join(fdroidserver.update.get_icon_dir('archive', density), - apk['icon']) - self.assertTrue(os.path.isfile(icon_path)) - self.assertTrue(os.path.getsize(icon_path) > 1) + # ensure that icons have been moved to the archive as well + for density in fdroidserver.update.screen_densities: + icon_path = os.path.join(fdroidserver.update.get_icon_dir('archive', density), + apk['icon']) + self.assertTrue(os.path.isfile(icon_path)) + self.assertTrue(os.path.getsize(icon_path) > 1) - badsigs = ['urzip-badcert.apk', 'urzip-badsig.apk', 'urzip-release-unsigned.apk', ] - for apkName in badsigs: - shutil.copy(os.path.join(self.basedir, apkName), - os.path.join(tmptestsdir, 'repo')) + badsigs = ['urzip-badcert.apk', 'urzip-badsig.apk', 'urzip-release-unsigned.apk', ] + for apkName in badsigs: + shutil.copy(os.path.join(self.basedir, apkName), + os.path.join(self.testdir, 'repo')) - skip, apk, cachechanged = fdroidserver.update.process_apk({}, apkName, 'repo', - knownapks, - allow_disabled_algorithms=False, - archive_bad_sig=False) - self.assertTrue(skip) - self.assertIsNone(apk) - self.assertFalse(cachechanged) + skip, apk, cachechanged = fdroidserver.update.process_apk({}, apkName, 'repo', + knownapks, + allow_disabled_algorithms=False, + archive_bad_sig=False) + self.assertTrue(skip) + self.assertIsNone(apk) + self.assertFalse(cachechanged) def test_process_invalid_apk(self): - os.chdir(os.path.join(localmodule, 'tests')) + os.chdir(self.basedir) if os.path.basename(os.getcwd()) != 'tests': raise Exception('This test must be run in the "tests/" subdir') @@ -1119,6 +1087,8 @@ class UpdateTest(unittest.TestCase): def test_get_apks_without_allowed_signatures(self): """Test when no AllowedAPKSigningKeys is specified""" + os.chdir(self.testdir) + shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config @@ -1127,6 +1097,7 @@ class UpdateTest(unittest.TestCase): app = fdroidserver.metadata.App() knownapks = fdroidserver.common.KnownApks() + apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks) apkfile = 'v1.v2.sig_1020.apk' (skip, apk, cachechanged) = fdroidserver.update.process_apk( {}, apkfile, 'repo', knownapks, False @@ -1137,6 +1108,8 @@ class UpdateTest(unittest.TestCase): def test_get_apks_without_allowed_signatures_allowed(self): """Test when the APK matches the specified AllowedAPKSigningKeys""" + os.chdir(self.testdir) + shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config @@ -1149,6 +1122,7 @@ class UpdateTest(unittest.TestCase): } ) knownapks = fdroidserver.common.KnownApks() + apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks) apkfile = 'v1.v2.sig_1020.apk' (skip, apk, cachechanged) = fdroidserver.update.process_apk( {}, apkfile, 'repo', knownapks, False @@ -1159,6 +1133,8 @@ class UpdateTest(unittest.TestCase): def test_get_apks_without_allowed_signatures_blocked(self): """Test when the APK does not match any specified AllowedAPKSigningKeys""" + os.chdir(self.testdir) + shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config @@ -1171,6 +1147,7 @@ class UpdateTest(unittest.TestCase): } ) knownapks = fdroidserver.common.KnownApks() + apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks) apkfile = 'v1.v2.sig_1020.apk' (skip, apk, cachechanged) = fdroidserver.update.process_apk( {}, apkfile, 'repo', knownapks, False @@ -1181,11 +1158,7 @@ class UpdateTest(unittest.TestCase): def test_update_with_AllowedAPKSigningKeys(self): """Test that APKs without allowed signatures get deleted.""" - # Prepare test environment - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.testdir) os.mkdir('repo') testapk = os.path.join('repo', 'com.politedroid_6.apk') shutil.copy(os.path.join(self.basedir, testapk), testapk) @@ -1229,11 +1202,7 @@ class UpdateTest(unittest.TestCase): self.assertFalse(os.path.exists(testapk)) def test_translate_per_build_anti_features(self): - os.chdir(os.path.join(localmodule, 'tests')) - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.testdir) shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') shutil.copytree(os.path.join(self.basedir, 'metadata'), 'metadata') config = dict() @@ -1262,11 +1231,7 @@ class UpdateTest(unittest.TestCase): self.assertTrue(foundtest) def test_create_metadata_from_template(self): - tmptestsdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - print('tmptestsdir', tmptestsdir) - os.chdir(tmptestsdir) + os.chdir(self.testdir) os.mkdir('repo') os.mkdir('metadata') shutil.copy(os.path.join(localmodule, 'tests', 'urzip.apk'), 'repo') @@ -1308,7 +1273,7 @@ class UpdateTest(unittest.TestCase): # test using external template.yml os.remove(testfile) self.assertFalse(os.path.exists(testfile)) - shutil.copy(os.path.join(localmodule, 'examples', 'template.yml'), tmptestsdir) + shutil.copy(os.path.join(localmodule, 'examples', 'template.yml'), self.testdir) fdroidserver.update.create_metadata_from_template(apk) self.assertTrue(os.path.exists(testfile)) apps = fdroidserver.metadata.read_metadata() @@ -1363,17 +1328,13 @@ class UpdateTest(unittest.TestCase): assert not icons_src def test_strip_and_copy_image(self): - tmptestsdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - in_file = os.path.join(self.basedir, 'metadata', 'info.guardianproject.urzip', 'en-US', 'images', 'icon.png') - out_file = os.path.join(tmptestsdir, 'icon.png') + out_file = os.path.join(self.testdir, 'icon.png') fdroidserver.update._strip_and_copy_image(in_file, out_file) self.assertTrue(os.path.exists(out_file)) in_file = os.path.join(self.basedir, 'corrupt-featureGraphic.png') - out_file = os.path.join(tmptestsdir, 'corrupt-featureGraphic.png') + out_file = os.path.join(self.testdir, 'corrupt-featureGraphic.png') fdroidserver.update._strip_and_copy_image(in_file, out_file) self.assertFalse(os.path.exists(out_file)) @@ -1463,10 +1424,7 @@ class UpdateTest(unittest.TestCase): ) def test_insert_funding_yml_donation_links(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.testdir) os.mkdir('build') content = textwrap.dedent( """ @@ -1507,10 +1465,7 @@ class UpdateTest(unittest.TestCase): def test_insert_funding_yml_donation_links_one_at_a_time(self): """Exercise the FUNDING.yml code one entry at a time""" - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.testdir) os.mkdir('build') app = fdroidserver.metadata.App() @@ -1551,10 +1506,7 @@ class UpdateTest(unittest.TestCase): self.assertEqual(app.get('Donate', '').split('/')[-1], v) def test_insert_funding_yml_donation_links_with_corrupt_file(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.testdir) os.mkdir('build') app = fdroidserver.metadata.App() app.id = 'fake.app.id' @@ -1598,10 +1550,7 @@ class UpdateTest(unittest.TestCase): self.assertIsNotNone(fdroidserver.update.sanitize_funding_yml_entry(['first', 'second'])) def test_set_localized_text_entry(self): - tmptestsdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(tmptestsdir) + os.chdir(self.testdir) config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.update.config = config @@ -1630,10 +1579,7 @@ class UpdateTest(unittest.TestCase): self.assertIsNone(app['localized'].get(locale, {}).get(key)) def test_set_author_entry(self): - tmptestsdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(tmptestsdir) + os.chdir(self.testdir) config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.update.config = config @@ -1760,10 +1706,7 @@ class UpdateTest(unittest.TestCase): self.assertEqual(apkaapt, apkandroguard) def test_exclude_disabled_apks(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.testdir) os.mkdir('repo') testapk = os.path.join('repo', 'com.politedroid_6.apk') testapk_new = os.path.join('repo', 'Politedroid-1.5.apk') diff --git a/tests/vcs.TestCase b/tests/vcs.TestCase index 2a408685..4eff7dec 100755 --- a/tests/vcs.TestCase +++ b/tests/vcs.TestCase @@ -7,7 +7,6 @@ import logging import optparse import os import sys -import tempfile import unittest from git import Repo @@ -23,6 +22,7 @@ import fdroidserver.build import fdroidserver.common import fdroidserver.metadata import fdroidserver.scanner +from testcommon import mkdtemp class VCSTest(unittest.TestCase): @@ -31,16 +31,16 @@ class VCSTest(unittest.TestCase): def setUp(self): logging.basicConfig(level=logging.DEBUG) self.basedir = os.path.join(localmodule, 'tests') - self.tmpdir = os.path.abspath(os.path.join(self.basedir, '..', '.testfiles')) - if not os.path.exists(self.tmpdir): - os.makedirs(self.tmpdir) + os.chdir(self.basedir) + self._td = mkdtemp() + self.testdir = self._td.name + + def tearDown(self): + self._td.cleanup() os.chdir(self.basedir) def test_remote_set_head_can_fail(self): - testdir = tempfile.mkdtemp( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) - os.chdir(testdir) + os.chdir(self.testdir) # First create an upstream repo with one commit upstream_repo = Repo.init("upstream_repo") with open(upstream_repo.working_dir + "/file", 'w') as f: From 6ba40b734938057af3556104aee4aec0ad27c2d3 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 25 Nov 2022 16:12:01 +0100 Subject: [PATCH 0996/2116] common tests: use patch.dict for os.environ --- tests/common.TestCase | 76 ++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/tests/common.TestCase b/tests/common.TestCase index 43ca5823..6e7cb27b 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -58,8 +58,6 @@ class CommonTest(unittest.TestCase): fdroidserver.common.config = None fdroidserver.common.options = mock.Mock() fdroidserver.common.options.verbose = False - self.path = os.environ['PATH'] - self.android_home = os.environ.get('ANDROID_HOME') self._td = mkdtemp() self.testdir = self._td.name @@ -67,9 +65,6 @@ class CommonTest(unittest.TestCase): os.chdir(self.basedir) self._td.cleanup() shutil.rmtree(self.tmpdir) - os.environ['PATH'] = self.path - if self.android_home: - os.environ['ANDROID_HOME'] = self.android_home def test_parse_human_readable_size(self): for k, v in ( @@ -695,10 +690,11 @@ class CommonTest(unittest.TestCase): usr_bin_apksigner = '/usr/bin/apksigner' if not os.path.isfile(usr_bin_apksigner): self.skipTest('SKIPPING since %s is not installed!' % usr_bin_apksigner) - os.environ['PATH'] = '/usr/local/bin:/usr/bin:/bin' - config = {} - fdroidserver.common.find_apksigner(config) - self.assertEqual(usr_bin_apksigner, config.get('apksigner')) + with mock.patch.dict(os.environ, clear=True): + os.environ['PATH'] = '/usr/local/bin:/usr/bin:/bin' + config = {} + fdroidserver.common.find_apksigner(config) + self.assertEqual(usr_bin_apksigner, config.get('apksigner')) def test_find_apksigner_config_overrides(self): """apksigner should come from config before any auto-detection""" @@ -711,10 +707,11 @@ class CommonTest(unittest.TestCase): os.chmod(do_not_use, 0o0755) apksigner = os.path.join(self.tmpdir, 'apksigner') config = {'apksigner': apksigner} - os.environ['ANDROID_HOME'] = android_home - os.environ['PATH'] = '%s:/usr/local/bin:/usr/bin:/bin' % android_home - fdroidserver.common.find_apksigner(config) - self.assertEqual(apksigner, config.get('apksigner')) + with mock.patch.dict(os.environ, clear=True): + os.environ['ANDROID_HOME'] = android_home + os.environ['PATH'] = '%s:/usr/local/bin:/usr/bin:/bin' % android_home + fdroidserver.common.find_apksigner(config) + self.assertEqual(apksigner, config.get('apksigner')) def test_find_apksigner_prefer_path(self): """apksigner should come from PATH before ANDROID_HOME""" @@ -732,10 +729,11 @@ class CommonTest(unittest.TestCase): os.chmod(do_not_use, 0o0755) config = {'sdk_path': android_home} - os.environ['ANDROID_HOME'] = android_home - os.environ['PATH'] = '%s:/usr/local/bin:/usr/bin:/bin' % os.path.dirname(apksigner) - fdroidserver.common.find_apksigner(config) - self.assertEqual(apksigner, config.get('apksigner')) + with mock.patch.dict(os.environ, clear=True): + os.environ['ANDROID_HOME'] = android_home + os.environ['PATH'] = '%s:/usr/local/bin:/usr/bin:/bin' % os.path.dirname(apksigner) + fdroidserver.common.find_apksigner(config) + self.assertEqual(apksigner, config.get('apksigner')) def test_find_apksigner_prefer_newest(self): """apksigner should be the newest available in ANDROID_HOME""" @@ -755,9 +753,10 @@ class CommonTest(unittest.TestCase): os.chmod(do_not_use, 0o0755) config = {'sdk_path': android_home} - os.environ['PATH'] = '/fake/path/to/avoid/conflicts' - fdroidserver.common.find_apksigner(config) - self.assertEqual(apksigner, config.get('apksigner')) + with mock.patch.dict(os.environ, clear=True): + os.environ['PATH'] = '/fake/path/to/avoid/conflicts' + fdroidserver.common.find_apksigner(config) + self.assertEqual(apksigner, config.get('apksigner')) def test_find_apksigner_system_package_android_home(self): """Test that apksigner v30 or newer is found""" @@ -779,13 +778,14 @@ class CommonTest(unittest.TestCase): if LooseVersion(version) < LooseVersion(min_version): self.skipTest('SKIPPING since build-tools %s or higher is required!' % min_version) fdroidserver.common.config = {'sdk_path': android_home} - os.environ['PATH'] = '/fake/path/to/avoid/conflicts' - config = fdroidserver.common.read_config() - fdroidserver.common.find_apksigner(config) - self.assertEqual( - os.path.join(android_home, 'build-tools'), - os.path.dirname(os.path.dirname(config.get('apksigner'))), - ) + with mock.patch.dict(os.environ, clear=True): + os.environ['PATH'] = '/fake/path/to/avoid/conflicts' + config = fdroidserver.common.read_config() + fdroidserver.common.find_apksigner(config) + self.assertEqual( + os.path.join(android_home, 'build-tools'), + os.path.dirname(os.path.dirname(config.get('apksigner'))), + ) def test_sign_apk(self): config = fdroidserver.common.read_config(fdroidserver.common.options) @@ -1792,13 +1792,14 @@ class CommonTest(unittest.TestCase): def test_with_config_yml_with_env_var(self): """Make sure it is possible to use config.yml alone.""" os.chdir(self.tmpdir) - os.environ['SECRET'] = 'mysecretpassword' - with open('config.yml', 'w') as fp: - fp.write("""keypass: {'env': 'SECRET'}""") - self.assertTrue(os.path.exists('config.yml')) - self.assertFalse(os.path.exists('config.py')) - config = fdroidserver.common.read_config(fdroidserver.common.options) - self.assertEqual(os.getenv('SECRET', 'fail'), config.get('keypass')) + with mock.patch.dict(os.environ): + os.environ['SECRET'] = 'mysecretpassword' + with open('config.yml', 'w') as fp: + fp.write("""keypass: {'env': 'SECRET'}""") + self.assertTrue(os.path.exists('config.yml')) + self.assertFalse(os.path.exists('config.py')) + config = fdroidserver.common.read_config(fdroidserver.common.options) + self.assertEqual(os.getenv('SECRET', 'fail'), config.get('keypass')) def test_with_config_py(self): """Make sure it is still possible to use config.py alone.""" @@ -2338,9 +2339,10 @@ class CommonTest(unittest.TestCase): fdroidserver.common.config = {'ndk_paths': {}} build = fdroidserver.metadata.Build() - os.environ['PATH'] = '/usr/bin:/usr/sbin' - fdroidserver.common.set_FDroidPopen_env(build) - self.assertNotIn('', os.getenv('PATH').split(os.pathsep)) + with mock.patch.dict(os.environ, clear=True): + os.environ['PATH'] = '/usr/bin:/usr/sbin' + fdroidserver.common.set_FDroidPopen_env(build) + self.assertNotIn('', os.getenv('PATH').split(os.pathsep)) def test_is_repo_file(self): is_repo_file = fdroidserver.common.is_repo_file From b1fca3f72251cc17a8f1a369d04594827bf02262 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 25 Nov 2022 11:32:15 +0100 Subject: [PATCH 0997/2116] run-tests: always cleanup testfiles --- tests/run-tests | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/tests/run-tests b/tests/run-tests index 82af2148..306c54dc 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -80,6 +80,17 @@ exit(c.get('apksigner') is None) " } +err_handler() { +# remove this to prevent git conflicts and complaining + rm -rf "$WORKSPACE"/fdroidserver.egg-info/ + rm -rf "$WORKSPACE"/.testfiles/run-tests.* + rm -rf "$WORKSPACE"/.testfiles/test_* + rm -f "$WORKSPACE"/.testfiles/tmp.* + rmdir --ignore-fail-on-non-empty "$WORKSPACE"/.testfiles +} + +trap err_handler INT EXIT + #------------------------------------------------------------------------------# # "main" @@ -1427,9 +1438,4 @@ grep "CurrentVersionCode: 1" metadata/fake.yml unset GIT_ALLOW_PROTOCOL -#------------------------------------------------------------------------------# - -# remove this to prevent git conflicts and complaining -rm -rf $WORKSPACE/fdroidserver.egg-info/ - echo SUCCESS From a667074d89c710fecefc87b73d8fac00ae32254c Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 25 Nov 2022 11:41:43 +0100 Subject: [PATCH 0998/2116] run-tests: make scanner test independent on importer test --- tests/run-tests | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/run-tests b/tests/run-tests index 306c54dc..ec5591e3 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -257,7 +257,7 @@ echo "" >> metadata/org.fdroid.ci.test.app.yml echo "Repo: https://gitlab.com/fdroid/ci-test-app.git" >> metadata/org.fdroid.ci.test.app.yml echo "RepoType: git" >> metadata/org.fdroid.ci.test.app.yml mkdir build -cp -a $WORKSPACE/tests/tmp/importer build/org.fdroid.ci.test.app +git clone https://gitlab.com/fdroid/ci-test-app.git build/org.fdroid.ci.test.app ls -l build/org.fdroid.ci.test.app $fdroid scanner org.fdroid.ci.test.app --verbose From 55c3a28568eb811e18675c9c92897bd5220a9c66 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 25 Nov 2022 12:23:48 +0100 Subject: [PATCH 0999/2116] run-tests: make mirror test independent of update test --- tests/run-tests | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/run-tests b/tests/run-tests index ec5591e3..7556f149 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -1277,10 +1277,13 @@ fi echo_header 'test mirroring a repo' if which wget; then + TESTROOT=`create_test_dir` REPOROOT=`create_test_dir` - cd $WORKSPACE/tests + cp -r "$WORKSPACE/tests" "$TESTROOT" + cd "$TESTROOT/tests" test -d archive || mkdir archive cp repo/index-v1.json $REPOROOT/ + $fdroid update $fdroid signindex mv $REPOROOT/index-v1.json repo/index-v1.json From 5715e377b02a90e3f8b7be11a1e8d8c47b572065 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 23 Nov 2022 10:15:16 +0100 Subject: [PATCH 1000/2116] nightly test: cleaup test directory --- tests/nightly.TestCase | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/nightly.TestCase b/tests/nightly.TestCase index f93d3b66..8eddc6d7 100755 --- a/tests/nightly.TestCase +++ b/tests/nightly.TestCase @@ -71,6 +71,7 @@ class NightlyTest(unittest.TestCase): def tearDown(self): self.tempdir.cleanup() + os.rmdir(self.testroot) def _copy_test_debug_keystore(self): self.dot_android.mkdir() From 611892538736f73e0ee8fca7d89ff9fb19beab5f Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 30 Nov 2022 12:49:21 +0100 Subject: [PATCH 1001/2116] Skip nightly test on Fedora with pip in $HOME --- .gitlab-ci.yml | 1 + tests/nightly.TestCase | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9df46726..6376424f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -274,6 +274,7 @@ fedora_latest: git gnupg java-17-openjdk-devel + openssl python3 python3-babel python3-matplotlib diff --git a/tests/nightly.TestCase b/tests/nightly.TestCase index 8eddc6d7..e7f41a8a 100755 --- a/tests/nightly.TestCase +++ b/tests/nightly.TestCase @@ -246,7 +246,14 @@ class NightlyTest(unittest.TestCase): ): self.assertTrue(self.testroot == Path.home().parent) with patch('subprocess.check_call', _subprocess_check_call): - nightly.main() + try: + nightly.main() + except exception.BuildException as e: + if "apksigner not found" in e.value: + self.skipTest("skipping, apksigner not found due to fake $HOME") + else: + raise + self.assertEqual(called, [['ssh', '-Tvi'], ['fdroid', 'deploy']]) self.assertFalse(os.path.exists('config.py')) git_url = 'git@github.com:f-droid/test-nightly' @@ -314,7 +321,14 @@ class NightlyTest(unittest.TestCase): ): self.assertTrue(self.testroot == Path.home().parent) with patch('subprocess.check_call', _subprocess_check_call): - nightly.main() + try: + nightly.main() + except exception.BuildException as e: + if "apksigner not found" in e.value: + self.skipTest("skipping, apksigner not found due to fake $HOME") + else: + raise + self.assertEqual(called, [['ssh', '-Tvi'], ['fdroid', 'deploy']]) self.assertFalse(os.path.exists('config.py')) expected = { From 406652988a35020839164cf5a1b245cf879a319a Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Sat, 28 Jan 2023 16:38:48 +0100 Subject: [PATCH 1002/2116] Remove references to Travis CI We do not use it any longer. --- .travis.yml | 92 ----------------------------------------------------- README.md | 11 +++---- 2 files changed, 5 insertions(+), 98 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 44c7ea70..00000000 --- a/.travis.yml +++ /dev/null @@ -1,92 +0,0 @@ - -# Use the Android base system since it provides the SDK, etc. -language: java - -matrix: - include: - - os: osx - osx_image: xcode12 - env: ANDROID_SDK_ROOT=/usr/local/share/android-sdk - env: ANDROID_HOME=/usr/local/share/android-sdk - - os: osx - osx_image: xcode10.3 - env: ANDROID_SDK_ROOT=/usr/local/share/android-sdk - env: ANDROID_HOME=/usr/local/share/android-sdk - -android: - components: - - android-23 # required for `fdroid build` test - - build-tools-28.0.3 # required for `fdroid build` test - licenses: - - 'android-sdk-preview-.+' - - 'android-sdk-license-.+' - -# * ensure java8 is installed since Android SDK doesn't work with Java9 -# * Java needs to be at least 1.8.0_131 to have MD5 properly disabled -# https://blogs.oracle.com/java-platform-group/oracle-jre-will-no-longer-trust-md5-signed-code-by-default -# https://opsech.io/posts/2017/Jun/09/openjdk-april-2017-security-update-131-8u131-and-md5-signed-jars.html -# * mercurial is unused and requires Python 2.x -install: - - export HOMEBREW_CURL_RETRIES=10 - - brew update > /dev/null - - if [ "`sw_vers -productVersion | sed 's,10\.\([0-9]*\).*,\1,'`" -ge 14 ]; then - python3 --version; - elif [ "`sw_vers -productVersion | sed 's,10\.\([0-9]*\).*,\1,'`" -gt 10 ]; then - brew uninstall mercurial --force; - brew upgrade python; - else - brew install python3; - fi - - brew install dash bash gnu-sed gradle jenv - - export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH" - - brew uninstall java --force || true - - brew cask uninstall java --force || true - - brew tap adoptopenjdk/openjdk - - travis_retry brew install --cask adoptopenjdk8 - - export JAVA_HOME=`/usr/libexec/java_home -v 1.8` - - travis_retry brew install --cask android-sdk - - - export AAPT_VERSION=`sed -n "s,^MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION\s*=\s*['\"]\(.*\)[['\"],\1,p" fdroidserver/common.py` - - mkdir -p "$ANDROID_HOME/licenses" - - echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_HOME/licenses/android-sdk-license" - - echo -e "\nd56f5187479451eabf01fb78af6dfcb131a6481e" >> "$ANDROID_HOME/licenses/android-sdk-license" - - echo -e "\n24333f8a63b6825ea9c5514f83c2829b004d1fee" >> "$ANDROID_HOME/licenses/android-sdk-license" - - echo -e "\n84831b9409646a918e30573bab4c9c91346d8abd" > "$ANDROID_HOME/licenses/android-sdk-preview-license" - - echo y | travis_retry $ANDROID_HOME/tools/bin/sdkmanager "platform-tools" > /dev/null - - echo y | travis_retry $ANDROID_HOME/tools/bin/sdkmanager "build-tools;$AAPT_VERSION" > /dev/null - - echo y | travis_retry $ANDROID_HOME/tools/bin/sdkmanager "platforms;android-23" > /dev/null - - - travis_retry sudo pip3 install --progress-bar off babel - - travis_retry sudo pip3 install --quiet --progress-bar off --editable . - - sudo rm -rf fdroidserver.egg-info - - - ls -l /System/Library/Java/JavaVirtualMachines || true - - ls -l /Library/Java/JavaVirtualMachines || true - - for f in /Library/Java/JavaVirtualMachines/*.jdk; do jenv add $f; done - - echo $PATH - - echo $JAVA_HOME - - jenv versions - - /usr/libexec/java_home - - java -version - - which java - - javac -version - - which javac - - jarsigner -help - - which jarsigner - - keytool -help - - which keytool - - sudo rm -rf /Library/Java/JavaVirtualMachines/jdk1.8.0_1*.jdk || true - -# The OSX tests seem to run slower, they often timeout. So only run -# the test suite with the installed version of fdroid. -# -# macOS sticks with bash 3.x because of licenses, so avoid use new bash syntax -script: - - /bin/bash --version - - /bin/bash -n gradlew-fdroid tests/run-tests - - - ./tests/run-tests - -after_failure: - - cd $TRAVIS_BUILD_DIR - - ls -lR | curl -F 'clbin=<-' https://clbin.com diff --git a/README.md b/README.md index c96dc872..7bd42b50 100644 --- a/README.md +++ b/README.md @@ -32,10 +32,9 @@ find the source for the documentation in ## CI/CD status -| | fdroidserver | buildserver | fdroid build --all | publishing tools | -|--------------------------|:-------------:|:-----------:|:------------------:|:----------------:| -| GNU/Linux | [![fdroidserver status on GNU/Linux](https://gitlab.com/fdroid/fdroidserver/badges/master/pipeline.svg)](https://gitlab.com/fdroid/fdroidserver/-/jobs) | [![buildserver status](https://jenkins.debian.net/job/reproducible_setup_fdroid_build_environment/badge/icon)](https://jenkins.debian.net/job/reproducible_setup_fdroid_build_environment) | [![fdroid build all status](https://jenkins.debian.net/job/reproducible_fdroid_build_apps/badge/icon)](https://jenkins.debian.net/job/reproducible_fdroid_build_apps/) | [![fdroid test status](https://jenkins.debian.net/job/reproducible_fdroid_test/badge/icon)](https://jenkins.debian.net/job/reproducible_fdroid_test/) | -| macOS | [![fdroidserver status on macOS](https://travis-ci.org/f-droid/fdroidserver.svg?branch=master)](https://travis-ci.org/f-droid/fdroidserver) | | | | +| fdroidserver | buildserver | fdroid build --all | publishing tools | +|:-------------:|:-----------:|:------------------:|:----------------:| +| [![fdroidserver status on GNU/Linux](https://gitlab.com/fdroid/fdroidserver/badges/master/pipeline.svg)](https://gitlab.com/fdroid/fdroidserver/-/jobs) | [![buildserver status](https://jenkins.debian.net/job/reproducible_setup_fdroid_build_environment/badge/icon)](https://jenkins.debian.net/job/reproducible_setup_fdroid_build_environment) | [![fdroid build all status](https://jenkins.debian.net/job/reproducible_fdroid_build_apps/badge/icon)](https://jenkins.debian.net/job/reproducible_fdroid_build_apps/) | [![fdroid test status](https://jenkins.debian.net/job/reproducible_fdroid_test/badge/icon)](https://jenkins.debian.net/job/reproducible_fdroid_test/) | ## Installing @@ -102,7 +101,7 @@ It can be built locally via pip install -e .[docs] cd docs sphinx-apidoc -o ./source ../fdroidserver -M -e -sphinx-autogen -o generated source/*.rst +sphinx-autogen -o generated source/*.rst make html ``` @@ -119,7 +118,7 @@ When writing docstrings you should follow the Everything can be translated. See [Translation and Localization](https://f-droid.org/docs/Translation_and_Localization) -for more info. +for more info.

    From 1074b5938d7ac7fd9c31088c8170bd8dad90450c Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Sat, 28 Jan 2023 16:54:58 +0100 Subject: [PATCH 1003/2116] README: Remove CI/CD status section --- README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/README.md b/README.md index 7bd42b50..9a11de8b 100644 --- a/README.md +++ b/README.md @@ -30,13 +30,6 @@ find the source for the documentation in [fdroid/fdroid-website](https://gitlab.com/fdroid/fdroid-website). -## CI/CD status - -| fdroidserver | buildserver | fdroid build --all | publishing tools | -|:-------------:|:-----------:|:------------------:|:----------------:| -| [![fdroidserver status on GNU/Linux](https://gitlab.com/fdroid/fdroidserver/badges/master/pipeline.svg)](https://gitlab.com/fdroid/fdroidserver/-/jobs) | [![buildserver status](https://jenkins.debian.net/job/reproducible_setup_fdroid_build_environment/badge/icon)](https://jenkins.debian.net/job/reproducible_setup_fdroid_build_environment) | [![fdroid build all status](https://jenkins.debian.net/job/reproducible_fdroid_build_apps/badge/icon)](https://jenkins.debian.net/job/reproducible_fdroid_build_apps/) | [![fdroid test status](https://jenkins.debian.net/job/reproducible_fdroid_test/badge/icon)](https://jenkins.debian.net/job/reproducible_fdroid_test/) | - - ## Installing There are many ways to install _fdroidserver_, they are documented on From 629b2650d0b1abfe7a95843a963da27c53822079 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 6 Feb 2023 16:30:15 +0100 Subject: [PATCH 1004/2116] makebuildserver: make sure config is a dict yaml.safe_load returns None for an empty file. --- makebuildserver | 3 +++ 1 file changed, 3 insertions(+) diff --git a/makebuildserver b/makebuildserver index e7c006f1..5d181b53 100755 --- a/makebuildserver +++ b/makebuildserver @@ -84,6 +84,9 @@ if not os.path.exists(configfile): shutil.copy('examples/Vagrantfile.yaml', configfile) with open(configfile) as fp: config = yaml.safe_load(fp) + if not isinstance(config, dict): + logging.info("config is empty or not a dict, using default.") + config = {} with open('buildserver/Vagrantfile') as fp: m = re.search(r"""\.vm\.box\s*=\s*["'](.*)["']""", fp.read()) if not m: From 4a581bdfb6b3cc1a2db2352319486ebd445a32a3 Mon Sep 17 00:00:00 2001 From: Simon Brand Date: Wed, 15 Feb 2023 19:25:48 +0000 Subject: [PATCH 1005/2116] Remove path workarounds for old python versions --- fdroidserver/checkupdates.py | 3 +- fdroidserver/common.py | 43 +++++--------- fdroidserver/import_subcommand.py | 9 +-- fdroidserver/metadata.py | 3 +- fdroidserver/rewritemeta.py | 5 +- tests/checkupdates.TestCase | 3 +- tests/common.TestCase | 99 +++++++++++++++---------------- tests/import_subcommand.TestCase | 7 +-- tests/lint.TestCase | 8 +-- tests/metadata.TestCase | 6 +- tests/rewritemeta.TestCase | 3 +- 11 files changed, 79 insertions(+), 110 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 9b18538b..26a78fae 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -343,8 +343,7 @@ def try_init_submodules(app, last_build, vcs): # Return all directories under startdir that contain any of the manifest # files, and thus are probably an Android project. def dirs_with_manifest(startdir): - # TODO: Python3.6: Accepts a path-like object. - for root, _dirs, files in os.walk(str(startdir)): + for root, _dirs, files in os.walk(startdir): if any(m in files for m in [ 'AndroidManifest.xml', 'pom.xml', 'build.gradle', 'build.gradle.kts']): yield Path(root) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index cfc7c03c..802ea4ee 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -950,8 +950,6 @@ def get_head_commit_id(git_repo): def setup_vcs(app): """Checkout code from VCS and return instance of vcs and the build dir.""" build_dir = get_build_dir(app) - # TODO: Remove this - build_dir = str(build_dir) # Set up vcs interface and make sure we have the latest code... logging.debug("Getting {0} vcs interface for {1}" @@ -966,8 +964,6 @@ def setup_vcs(app): def getvcs(vcstype, remote, local): - # TODO: Remove this in Python3.6 - local = str(local) if vcstype == 'git': return vcs_git(remote, local) if vcstype == 'git-svn': @@ -995,8 +991,6 @@ class vcs: def __init__(self, remote, local): - # TODO: Remove this in Python3.6 - local = str(local) # svn, git-svn and bzr may require auth self.username = None if self.repotype() in ('git-svn', 'bzr'): @@ -1268,7 +1262,6 @@ class vcs_git(vcs): def latesttags(self): """Return a list of latest tags.""" self.checkrepo() - # TODO: Python3.6: Should accept path-like return [tag.name for tag in sorted( git.Repo(self.local).tags, key=lambda t: t.commit.committed_date, @@ -1603,29 +1596,25 @@ def retrieve_string_singleline(app_dir, string, xmlfiles=None): def manifest_paths(app_dir, flavours): """Return list of existing files that will be used to find the highest vercode.""" - # TODO: Remove this in Python3.6 - app_dir = str(app_dir) possible_manifests = \ - [os.path.join(app_dir, 'AndroidManifest.xml'), - os.path.join(app_dir, 'src', 'main', 'AndroidManifest.xml'), - os.path.join(app_dir, 'src', 'AndroidManifest.xml'), - os.path.join(app_dir, 'build.gradle'), - os.path.join(app_dir, 'build-extras.gradle'), - os.path.join(app_dir, 'build.gradle.kts')] + [Path(app_dir) / 'AndroidManifest.xml', + Path(app_dir) / 'src/main/AndroidManifest.xml', + Path(app_dir) / 'src/AndroidManifest.xml', + Path(app_dir) / 'build.gradle', + Path(app_dir) / 'build-extras.gradle', + Path(app_dir) / 'build.gradle.kts'] for flavour in flavours: if flavour == 'yes': continue possible_manifests.append( - os.path.join(app_dir, 'src', flavour, 'AndroidManifest.xml')) + Path(app_dir) / 'src' / flavour / 'AndroidManifest.xml') - return [path for path in possible_manifests if os.path.isfile(path)] + return [path for path in possible_manifests if path.is_file()] def fetch_real_name(app_dir, flavours): """Retrieve the package name. Returns the name, or None if not found.""" - # TODO: Remove this in Python3.6 - app_dir = str(app_dir) for path in manifest_paths(app_dir, flavours): if not path.endswith('.xml') or not os.path.isfile(path): continue @@ -1736,8 +1725,6 @@ def parse_androidmanifests(paths, app): return None for path in paths: - # TODO: Remove this in Python3.6 - path = str(path) if not os.path.isfile(path): continue @@ -1752,7 +1739,7 @@ def parse_androidmanifests(paths, app): if len(app.get('Builds', [])) > 0 and 'gradle' in app['Builds'][-1] and app['Builds'][-1].gradle: flavours = app['Builds'][-1].gradle - if path.endswith('.gradle') or path.endswith('.gradle.kts'): + if path.suffix == '.gradle' or path.name.endswith('.gradle.kts'): with open(path, 'r', encoding='utf-8') as f: android_plugin_file = False inside_flavour_group = 0 @@ -2221,11 +2208,11 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver= for path in manifest_paths(root_dir, flavours): if not os.path.isfile(path): continue - if path.endswith('.xml'): + if path.suffix == '.xml': regsub_file(r'android:versionName="[^"]*"', r'android:versionName="%s"' % build.versionName, path) - elif path.endswith('.gradle'): + elif path.suffix == '.gradle': regsub_file(r"""(\s*)versionName[\s'"=]+.*""", r"""\1versionName '%s'""" % build.versionName, path) @@ -2233,13 +2220,13 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver= if build.forcevercode: logging.info("Changing the version code") for path in manifest_paths(root_dir, flavours): - if not os.path.isfile(path): + if not path.is_file(): continue - if path.endswith('.xml'): + if path.suffix == '.xml': regsub_file(r'android:versionCode="[^"]*"', r'android:versionCode="%s"' % build.versionCode, path) - elif path.endswith('.gradle'): + elif path.suffix == '.gradle': regsub_file(r'versionCode[ =]+[0-9]+', r'versionCode %s' % build.versionCode, path) @@ -2341,7 +2328,7 @@ def getpaths_map(build_dir, globpaths): p = p.strip() full_path = os.path.join(build_dir, p) full_path = os.path.normpath(full_path) - paths[p] = [r[len(build_dir) + 1:] for r in glob.glob(full_path)] + paths[p] = [r[len(str(build_dir)) + 1:] for r in glob.glob(full_path)] if not paths[p]: not_found_paths.append(p) if not_found_paths: diff --git a/fdroidserver/import_subcommand.py b/fdroidserver/import_subcommand.py index ab0e0ed7..792c2799 100644 --- a/fdroidserver/import_subcommand.py +++ b/fdroidserver/import_subcommand.py @@ -264,8 +264,7 @@ def main(): if Path('build.gradle').exists() or Path('build.gradle.kts').exists(): build.gradle = ['yes'] - # TODO: Python3.6: Should accept path-like - git_repo = git.Repo(str(Path.cwd())) + git_repo = git.Repo(Path.cwd()) for remote in git.Remote.iter_items(git_repo): if remote.name == 'origin': url = git_repo.remotes.origin.url @@ -277,8 +276,7 @@ def main(): elif options.url: app = get_app_from_url(options.url) tmp_importer_dir = clone_to_tmp_dir(app) - # TODO: Python3.6: Should accept path-like - git_repo = git.Repo(str(tmp_importer_dir)) + git_repo = git.Repo(tmp_importer_dir) if not options.omit_disable: build.disable = 'Generated by import.py - check/set version fields and commit id' @@ -387,8 +385,7 @@ def main(): git_repo.close() except AttributeError: # Debian/stretch's version does not have close() pass - # TODO: Python3.9: Accepts a path-like object for both src and dst. - shutil.move(str(tmp_importer_dir), str(build_dir)) + shutil.move(tmp_importer_dir, build_dir) Path('build/.fdroidvcs-' + appid).write_text(app.RepoType + ' ' + app.Repo) metadatapath = Path('metadata') / (appid + '.yml') diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 55fe954e..b6483cc9 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -752,8 +752,7 @@ def parse_metadata(metadatapath): metadata_in_repo = build_dir / '.fdroid.yml' if metadata_in_repo.is_file(): try: - # TODO: Python3.6: Should accept path-like - commit_id = common.get_head_commit_id(git.Repo(str(build_dir))) + commit_id = common.get_head_commit_id(git.Repo(build_dir)) logging.debug(_('Including metadata from %s@%s') % (metadata_in_repo, commit_id)) except git.exc.InvalidGitRepositoryError: logging.debug(_('Including metadata from {path}').format(metadata_in_repo)) diff --git a/fdroidserver/rewritemeta.py b/fdroidserver/rewritemeta.py index 0437469b..3a133c72 100644 --- a/fdroidserver/rewritemeta.py +++ b/fdroidserver/rewritemeta.py @@ -87,13 +87,12 @@ def main(): newbuilds.append(new) app['Builds'] = newbuilds - # rewrite to temporary file before overwriting existsing + # rewrite to temporary file before overwriting existing # file in case there's a bug in write_metadata with tempfile.TemporaryDirectory() as tmpdir: tmp_path = Path(tmpdir) / path.name metadata.write_metadata(tmp_path, app) - # TODO: Python3.6: Accept path-lik - shutil.move(str(tmp_path), str(path)) + shutil.move(tmp_path, path) logging.debug(_("Finished")) diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index 7ffc548a..972f1eef 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -27,8 +27,7 @@ class CheckupdatesTest(unittest.TestCase): def setUp(self): logging.basicConfig(level=logging.DEBUG) self.basedir = localmodule / 'tests' - # TODO: Python3.6: Accepts a path-like object. - os.chdir(str(self.basedir)) + os.chdir(self.basedir) def test_autoupdatemode_no_suffix(self): fdroidserver.checkupdates.options = mock.Mock() diff --git a/tests/common.TestCase b/tests/common.TestCase index 6e7cb27b..9db6a56f 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1075,7 +1075,7 @@ class CommonTest(unittest.TestCase): self.assertEqual('b30bb971af0d134866e158ec748fcd553df97c150f58b0a963190bbafbeb0868', sig) def test_parse_xml(self): - manifest = os.path.join('source-files', 'fdroid', 'fdroidclient', 'AndroidManifest.xml') + manifest = Path('source-files/fdroid/fdroidclient/AndroidManifest.xml') parsed = fdroidserver.common.parse_xml(manifest) self.assertIsNotNone(parsed) self.assertEqual(str(type(parsed)), "") @@ -1084,8 +1084,8 @@ class CommonTest(unittest.TestCase): app = fdroidserver.metadata.App() app.id = 'org.fdroid.fdroid' paths = [ - os.path.join('source-files', 'fdroid', 'fdroidclient', 'AndroidManifest.xml'), - os.path.join('source-files', 'fdroid', 'fdroidclient', 'build.gradle'), + Path('source-files/fdroid/fdroidclient/AndroidManifest.xml'), + Path('source-files/fdroid/fdroidclient/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) @@ -1099,17 +1099,17 @@ class CommonTest(unittest.TestCase): app.SourceCode = url.rstrip('.git') app.Repo = url paths = [ - os.path.join('source-files', 'cn.wildfirechat.chat', 'avenginekit', 'build.gradle'), - os.path.join('source-files', 'cn.wildfirechat.chat', 'build.gradle'), - os.path.join('source-files', 'cn.wildfirechat.chat', 'client', 'build.gradle'), - os.path.join('source-files', 'cn.wildfirechat.chat', 'client', 'src', 'main', 'AndroidManifest.xml'), - os.path.join('source-files', 'cn.wildfirechat.chat', 'emojilibrary', 'build.gradle'), - os.path.join('source-files', 'cn.wildfirechat.chat', 'gradle', 'build_libraries.gradle'), - os.path.join('source-files', 'cn.wildfirechat.chat', 'imagepicker', 'build.gradle'), - os.path.join('source-files', 'cn.wildfirechat.chat', 'mars-core-release', 'build.gradle'), - os.path.join('source-files', 'cn.wildfirechat.chat', 'push', 'build.gradle'), - os.path.join('source-files', 'cn.wildfirechat.chat', 'settings.gradle'), - os.path.join('source-files', 'cn.wildfirechat.chat', 'chat', 'build.gradle'), + Path('source-files/cn.wildfirechat.chat/avenginekit/build.gradle'), + Path('source-files/cn.wildfirechat.chat/build.gradle'), + Path('source-files/cn.wildfirechat.chat/client/build.gradle'), + Path('source-files/cn.wildfirechat.chat/client/src/main/AndroidManifest.xml'), + Path('source-files/cn.wildfirechat.chat/emojilibrary/build.gradle'), + Path('source-files/cn.wildfirechat.chat/gradle/build_libraries.gradle'), + Path('source-files/cn.wildfirechat.chat/imagepicker/build.gradle'), + Path('source-files/cn.wildfirechat.chat/mars-core-release/build.gradle'), + Path('source-files/cn.wildfirechat.chat/push/build.gradle'), + Path('source-files/cn.wildfirechat.chat/settings.gradle'), + Path('source-files/cn.wildfirechat.chat/chat/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) @@ -1119,18 +1119,18 @@ class CommonTest(unittest.TestCase): app = fdroidserver.metadata.App() app.Repo = 'https://github.com/Integreight/1Sheeld-Android-App' paths = [ - os.path.join('source-files', 'com.integreight.onesheeld', 'pagerIndicator', 'src', 'main', 'AndroidManifest.xml'), - os.path.join('source-files', 'com.integreight.onesheeld', 'pagerIndicator', 'build.gradle'), - os.path.join('source-files', 'com.integreight.onesheeld', 'oneSheeld', 'src', 'main', 'AndroidManifest.xml'), - os.path.join('source-files', 'com.integreight.onesheeld', 'oneSheeld', 'build.gradle'), - os.path.join('source-files', 'com.integreight.onesheeld', 'localeapi', 'src', 'main', 'AndroidManifest.xml'), - os.path.join('source-files', 'com.integreight.onesheeld', 'localeapi', 'build.gradle'), - os.path.join('source-files', 'com.integreight.onesheeld', 'build.gradle'), - os.path.join('source-files', 'com.integreight.onesheeld', 'settings.gradle'), - os.path.join('source-files', 'com.integreight.onesheeld', 'quickReturnHeader', 'src', 'main', 'AndroidManifest.xml'), - os.path.join('source-files', 'com.integreight.onesheeld', 'quickReturnHeader', 'build.gradle'), - os.path.join('source-files', 'com.integreight.onesheeld', 'pullToRefreshlibrary', 'src', 'main', 'AndroidManifest.xml'), - os.path.join('source-files', 'com.integreight.onesheeld', 'pullToRefreshlibrary', 'build.gradle'), + Path('source-files/com.integreight.onesheeld/pagerIndicator/src/main/AndroidManifest.xml'), + Path('source-files/com.integreight.onesheeld/pagerIndicator/build.gradle'), + Path('source-files/com.integreight.onesheeld/oneSheeld/src/main/AndroidManifest.xml'), + Path('source-files/com.integreight.onesheeld/oneSheeld/build.gradle'), + Path('source-files/com.integreight.onesheeld/localeapi/src/main/AndroidManifest.xml'), + Path('source-files/com.integreight.onesheeld/localeapi/build.gradle'), + Path('source-files/com.integreight.onesheeld/build.gradle'), + Path('source-files/com.integreight.onesheeld/settings.gradle'), + Path('source-files/com.integreight.onesheeld/quickReturnHeader/src/main/AndroidManifest.xml'), + Path('source-files/com.integreight.onesheeld/quickReturnHeader/build.gradle'), + Path('source-files/com.integreight.onesheeld/pullToRefreshlibrary/src/main/AndroidManifest.xml'), + Path('source-files/com.integreight.onesheeld/pullToRefreshlibrary/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) @@ -1140,7 +1140,7 @@ class CommonTest(unittest.TestCase): app = fdroidserver.metadata.App() app.id = 'dev.patrickgold.florisboard' paths = [ - os.path.join('source-files', 'dev.patrickgold.florisboard', 'app', 'build.gradle.kts'), + Path('source-files/dev.patrickgold.florisboard/app/build.gradle.kts'), ] for path in paths: self.assertTrue(os.path.isfile(path)) @@ -1150,8 +1150,8 @@ class CommonTest(unittest.TestCase): app = fdroidserver.metadata.App() app.id = 'com.ubergeek42.WeechatAndroid' paths = [ - os.path.join('source-files', 'com.ubergeek42.WeechatAndroid', 'app', 'build.gradle.kts'), - os.path.join('source-files', 'com.ubergeek42.WeechatAndroid', 'app', 'src', 'main', 'res', 'values', 'strings.xml'), + Path('source-files/com.ubergeek42.WeechatAndroid/app/build.gradle.kts'), + Path('source-files/com.ubergeek42.WeechatAndroid/app/src/main/res/values/strings.xml'), ] for path in paths: self.assertTrue(os.path.isfile(path)) @@ -1163,8 +1163,8 @@ class CommonTest(unittest.TestCase): app.id = 'org.fdroid.fdroid' app.UpdateCheckIgnore = '-test' paths = [ - os.path.join('source-files', 'fdroid', 'fdroidclient', 'AndroidManifest.xml'), - os.path.join('source-files', 'fdroid', 'fdroidclient', 'build.gradle'), + Path('source-files/fdroid/fdroidclient/AndroidManifest.xml'), + Path('source-files/fdroid/fdroidclient/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) @@ -1178,8 +1178,8 @@ class CommonTest(unittest.TestCase): app['Builds'] = [build] app.id = 'org.fdroid.fdroid.dev' paths = [ - os.path.join('source-files', 'fdroid', 'fdroidclient', 'AndroidManifest.xml'), - os.path.join('source-files', 'fdroid', 'fdroidclient', 'build.gradle'), + Path('source-files/fdroid/fdroidclient/AndroidManifest.xml'), + Path('source-files/fdroid/fdroidclient/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) @@ -1192,7 +1192,7 @@ class CommonTest(unittest.TestCase): app['Builds'] = [build] app.id = 'eu.siacs.conversations' paths = [ - os.path.join('source-files', 'eu.siacs.conversations', 'build.gradle'), + Path('source-files/eu.siacs.conversations/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) @@ -1205,7 +1205,7 @@ class CommonTest(unittest.TestCase): app['Builds'] = [build] app.id = 'com.nextcloud.client' paths = [ - os.path.join('source-files', 'com.nextcloud.client', 'build.gradle'), + Path('source-files/com.nextcloud.client/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) @@ -1218,7 +1218,7 @@ class CommonTest(unittest.TestCase): app['Builds'] = [build] app.id = 'com.nextcloud.android.beta' paths = [ - os.path.join('source-files', 'com.nextcloud.client', 'build.gradle'), + Path('source-files/com.nextcloud.client/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) @@ -1231,7 +1231,7 @@ class CommonTest(unittest.TestCase): app['Builds'] = [build] app.id = 'at.bitfire.davdroid' paths = [ - os.path.join('source-files', 'at.bitfire.davdroid', 'build.gradle'), + Path('source-files/at.bitfire.davdroid/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) @@ -1244,7 +1244,7 @@ class CommonTest(unittest.TestCase): app['Builds'] = [build] app.id = 'com.kunzisoft.fdroidtest.applicationidsuffix.libre' paths = [ - os.path.join('source-files', 'com.kunzisoft.testcase', 'build.gradle'), + Path('source-files/com.kunzisoft.testcase/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) @@ -1257,7 +1257,7 @@ class CommonTest(unittest.TestCase): app['Builds'] = [build] app.id = 'com.kunzisoft.fdroidtest.applicationidsuffix.pro' paths = [ - os.path.join('source-files', 'com.kunzisoft.testcase', 'build.gradle'), + Path('source-files/com.kunzisoft.testcase/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) @@ -1270,7 +1270,7 @@ class CommonTest(unittest.TestCase): app['Builds'] = [build] app.id = 'com.kunzisoft.fdroidtest.applicationidsuffix' paths = [ - os.path.join('source-files', 'com.kunzisoft.testcase', 'build.gradle'), + Path('source-files/com.kunzisoft.testcase/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) @@ -1283,7 +1283,7 @@ class CommonTest(unittest.TestCase): app['Builds'] = [build] app.id = 'com.kunzisoft.fdroidtest.applicationidsuffix.underscore' paths = [ - os.path.join('source-files', 'com.kunzisoft.testcase', 'build.gradle'), + Path('source-files/com.kunzisoft.testcase/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) @@ -1296,7 +1296,7 @@ class CommonTest(unittest.TestCase): app['Builds'] = [build] app.id = 'com.kunzisoft.fdroidtest.applicationidsuffix.underscore_first' paths = [ - os.path.join('source-files', 'com.kunzisoft.testcase', 'build.gradle'), + Path('source-files/com.kunzisoft.testcase/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) @@ -1309,7 +1309,7 @@ class CommonTest(unittest.TestCase): app['Builds'] = [build] app.id = 'com.github.jameshnsears.quoteunquote' paths = [ - os.path.join('source-files', 'com.github.jameshnsears.quoteunquote', 'build.gradle'), + Path('source-files/com.github.jameshnsears.quoteunquote/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) @@ -1322,7 +1322,7 @@ class CommonTest(unittest.TestCase): app['Builds'] = [build] app.id = 'com.jens.automation2' paths = [ - os.path.join('source-files', 'com.jens.automation2', 'build.gradle'), + Path('source-files/com.jens.automation2/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) @@ -1335,7 +1335,7 @@ class CommonTest(unittest.TestCase): app['Builds'] = [build] app.id = 'de.varengold.activeTAN' paths = [ - os.path.join('source-files', 'de.varengold.activeTAN', 'build.gradle'), + Path('source-files/de.varengold.activeTAN/build.gradle'), ] for path in paths: self.assertTrue(os.path.isfile(path)) @@ -1364,8 +1364,7 @@ class CommonTest(unittest.TestCase): abspath = Path(self.basedir) / 'source-files/realm' p = fdroidserver.common.get_all_gradle_and_manifests(abspath) self.assertEqual(1, len(p)) - # TODO: Pathon3.9: self.assertTrue(p[0].is_relative_to(abspath)) - self.assertTrue(abspath in p[0].parents) + self.assertTrue(p[0].is_relative_to(abspath)) def test_get_gradle_subdir(self): subdirs = { @@ -2274,8 +2273,7 @@ class CommonTest(unittest.TestCase): "seven", ] with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): - # TODO: Python3.6: Should accept path-like - repo = git.Repo.init(str(Path.cwd())) + repo = git.Repo.init(Path.cwd()) f = Path("test") date = 10**9 for tag in tags: @@ -2291,8 +2289,7 @@ class CommonTest(unittest.TestCase): def test_vcs_git_getref(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): - # TODO: Python3.6: Should accept path-like - repo = git.Repo.init(str(Path.cwd())) + repo = git.Repo.init(Path.cwd()) tag = "1.1.1" f = Path("test") f.write_text(tag) diff --git a/tests/import_subcommand.TestCase b/tests/import_subcommand.TestCase index dbe6ec38..cd11775e 100755 --- a/tests/import_subcommand.TestCase +++ b/tests/import_subcommand.TestCase @@ -78,14 +78,11 @@ class ImportTest(unittest.TestCase): ), ) for appid, url, vn, vc in data: - # TODO: Python3.6: Accepts a path-like object. shutil.rmtree( - str(tmp_importer), + tmp_importer, onerror=fdroidserver.import_subcommand.handle_retree_error_on_windows, ) - shutil.copytree( - str(self.basedir / 'source-files' / appid), str(tmp_importer) - ) + shutil.copytree(self.basedir / 'source-files' / appid, tmp_importer) app = fdroidserver.import_subcommand.get_app_from_url(url) with mock.patch( diff --git a/tests/lint.TestCase b/tests/lint.TestCase index 07f775c4..07bd567d 100755 --- a/tests/lint.TestCase +++ b/tests/lint.TestCase @@ -29,8 +29,7 @@ class LintTest(unittest.TestCase): self.basedir = localmodule / 'tests' self.tmpdir = localmodule / '.testfiles' self.tmpdir.mkdir(exist_ok=True) - # TODO: Python3.6: Accepts a path-like object. - os.chdir(str(self.basedir)) + os.chdir(self.basedir) def test_check_for_unsupported_metadata_files(self): self.assertTrue(fdroidserver.lint.check_for_unsupported_metadata_files()) @@ -40,10 +39,9 @@ class LintTest(unittest.TestCase): self.assertFalse( fdroidserver.lint.check_for_unsupported_metadata_files(testdir) ) - # TODO: Python3.6: Accepts a path-like object. shutil.copytree( - str(self.basedir / 'metadata'), - str(testdir / 'metadata'), + self.basedir / 'metadata', + testdir / 'metadata', ignore=shutil.ignore_patterns('apk', 'dump', '*.json'), ) self.assertFalse( diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 7d96bf5b..73650834 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -349,12 +349,10 @@ class MetadataTest(unittest.TestCase): random.shuffle(randomapps) i = 1 for f in randomapps: - # TODO: Pytohn3.6: The parameter now accepts a path-like object. - shutil.copy(str(f), str(metadatadir)) + shutil.copy(f, metadatadir) new = metadatadir / f.name stat = new.stat() - # TODO: Changed in version 3.6: Accepts a path-like object. - os.utime(str(new), (stat.st_ctime, stat.st_mtime + i)) + os.utime(new, (stat.st_ctime, stat.st_mtime + i)) # prepend new item so newest is always first randomlist = [f.stem] + randomlist i += 1 diff --git a/tests/rewritemeta.TestCase b/tests/rewritemeta.TestCase index 4fc4d8ac..7c245a8a 100755 --- a/tests/rewritemeta.TestCase +++ b/tests/rewritemeta.TestCase @@ -29,8 +29,7 @@ class RewriteMetaTest(unittest.TestCase): def setUp(self): logging.basicConfig(level=logging.DEBUG) self.basedir = localmodule / 'tests' - # TODO: Python3.6: Accepts a path-like object. - os.chdir(str(self.basedir)) + os.chdir(self.basedir) def test_rewrite_scenario_trivial(self): From ecfbdef60f517d3a24d8bbc13d5de3f73be291cd Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 16 Feb 2023 09:23:07 +0100 Subject: [PATCH 1006/2116] Fix pathlib usage Regression from 4a581bdf. --- fdroidserver/common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 802ea4ee..831b0cb5 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1616,7 +1616,7 @@ def manifest_paths(app_dir, flavours): def fetch_real_name(app_dir, flavours): """Retrieve the package name. Returns the name, or None if not found.""" for path in manifest_paths(app_dir, flavours): - if not path.endswith('.xml') or not os.path.isfile(path): + if not path.suffix == '.xml' or not path.is_file(): continue logging.debug("fetch_real_name: Checking manifest at " + path) try: @@ -1725,7 +1725,7 @@ def parse_androidmanifests(paths, app): return None for path in paths: - if not os.path.isfile(path): + if not path.is_file(): continue logging.debug(_("Parsing manifest at '{path}'").format(path=path)) From fd54633f520723bc8eac0492cc41f437ce48bdde Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Thu, 16 Feb 2023 08:38:19 +0000 Subject: [PATCH 1007/2116] gradle v8.0 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index e48105ab..a0cb3aa6 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -182,6 +182,7 @@ get_sha() { '7.5') echo 'cb87f222c5585bd46838ad4db78463a5c5f3d336e5e2b98dc7c0c586527351c2' ;; '7.5.1') echo 'f6b8596b10cce501591e92f229816aa4046424f3b24d771751b06779d58c8ec4' ;; '7.6') echo '7ba68c54029790ab444b39d7e293d3236b2632631fb5f2e012bb28b4ff669e4b' ;; + '8.0') echo '4159b938ec734a8388ce03f52aa8f3c7ed0d31f5438622545de4f83a89b79788' ;; *) exit 1 esac } @@ -202,7 +203,7 @@ d_plugin_k=(8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2. d_plugin_v=(8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.0 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 33def096f5b4ca478ca2941c9b27a5257ff3d037 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Thu, 16 Feb 2023 12:11:26 +0000 Subject: [PATCH 1008/2116] Add postbuild --- .gitlab-ci.yml | 1 + fdroidserver/build.py | 18 +++++ fdroidserver/metadata.py | 3 + tests/metadata/dump/com.politedroid.yaml | 4 ++ tests/metadata/dump/org.adaway.yaml | 28 ++++++++ .../dump/org.smssecure.smssecure.yaml | 8 +++ tests/metadata/dump/org.videolan.vlc.yaml | 66 +++++++++++++++++++ 7 files changed, 128 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6376424f..7fa2b23c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -63,6 +63,7 @@ metadata_v0: -e "/VercodeOperation/s/null/[]/" -e 's/VercodeOperation:.\([^[]\+\)/VercodeOperation:\n- \1/' -e '/LiberapayID/d' + -e '/postbuild/d' metadata/dump_*/*.yaml - diff -uw metadata/dump_* diff --git a/fdroidserver/build.py b/fdroidserver/build.py index cc291eac..5977822d 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -33,6 +33,7 @@ import argparse from configparser import ConfigParser import logging from gettext import ngettext +from pathlib import Path from . import _ from . import common @@ -790,6 +791,23 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext raise BuildException('No apks match %s' % globpath) src = os.path.normpath(apks[0]) + # Run a postbuild command if one is required... + if build.postbuild: + logging.info(f"Running 'postbuild' commands in {root_dir}") + cmd = common.replace_config_vars("; ".join(build.postbuild), build) + + # Substitute source library paths into commands... + for name, number, libpath in srclibpaths: + cmd = cmd.replace(f"$${name}$$", str(Path.cwd() / libpath)) + + cmd = cmd.replace('$$OUT$$', str(Path(src).resolve())) + + p = FDroidPopen(['bash', '-e', '-u', '-o', 'pipefail', '-x', '-c', cmd], cwd=root_dir) + + if p.returncode != 0: + raise BuildException("Error running postbuild command for " + f"{app.id}:{build.versionName}", p.output) + # Make sure it's not debuggable... if common.is_apk_and_debuggable(src): raise BuildException("APK is debuggable") diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index b6483cc9..40d6c582 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -245,6 +245,7 @@ build_flags = [ 'preassemble', 'gradleprops', 'antcommands', + 'postbuild', 'novcheck', 'antifeatures', ] @@ -284,6 +285,7 @@ class Build(dict): self.preassemble = [] self.gradleprops = [] self.antcommands = [] + self.postbuild = '' self.novcheck = False self.antifeatures = [] if copydict: @@ -348,6 +350,7 @@ flagtypes = { 'init': TYPE_SCRIPT, 'prebuild': TYPE_SCRIPT, 'build': TYPE_SCRIPT, + 'postbuild': TYPE_SCRIPT, 'submodules': TYPE_BOOL, 'oldsdkloc': TYPE_BOOL, 'forceversion': TYPE_BOOL, diff --git a/tests/metadata/dump/com.politedroid.yaml b/tests/metadata/dump/com.politedroid.yaml index ebb6977f..0838cf12 100644 --- a/tests/metadata/dump/com.politedroid.yaml +++ b/tests/metadata/dump/com.politedroid.yaml @@ -33,6 +33,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: '' rm: [] @@ -67,6 +68,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: '' rm: [] @@ -101,6 +103,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: '' rm: [] @@ -136,6 +139,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: '' rm: [] diff --git a/tests/metadata/dump/org.adaway.yaml b/tests/metadata/dump/org.adaway.yaml index a5411576..2cde8fdd 100644 --- a/tests/metadata/dump/org.adaway.yaml +++ b/tests/metadata/dump/org.adaway.yaml @@ -31,6 +31,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: '' rm: [] @@ -67,6 +68,7 @@ Builds: output: null patch: - defprop.patch + postbuild: '' preassemble: [] prebuild: '' rm: [] @@ -103,6 +105,7 @@ Builds: output: null patch: - defprop.patch + postbuild: '' preassemble: [] prebuild: '' rm: [] @@ -139,6 +142,7 @@ Builds: output: null patch: - defprop.patch + postbuild: '' preassemble: [] prebuild: '' rm: [] @@ -175,6 +179,7 @@ Builds: output: null patch: - defprop.patch + postbuild: '' preassemble: [] prebuild: '' rm: [] @@ -211,6 +216,7 @@ Builds: output: null patch: - defprop.patch + postbuild: '' preassemble: [] prebuild: '' rm: [] @@ -245,6 +251,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: '' rm: [] @@ -280,6 +287,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock @@ -316,6 +324,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock @@ -352,6 +361,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock @@ -388,6 +398,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock @@ -424,6 +435,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock @@ -460,6 +472,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock @@ -497,6 +510,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock @@ -533,6 +547,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock @@ -570,6 +585,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock @@ -607,6 +623,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock @@ -644,6 +661,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - android update project -p ../com_actionbarsherlock @@ -689,6 +707,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - rm -rf ../update_zip libs/root-commands-1.2.jar libs/htmlspanner-0.2-fork.jar @@ -738,6 +757,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - rm -rf ../update_zip libs/root-commands-1.2.jar libs/htmlspanner-0.2-fork.jar @@ -781,6 +801,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: - renameExecutables prebuild: '' @@ -818,6 +839,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: - renameExecutables prebuild: '' @@ -855,6 +877,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: - renameExecutables prebuild: '' @@ -892,6 +915,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: - renameExecutables prebuild: '' @@ -929,6 +953,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: - renameExecutables prebuild: '' @@ -966,6 +991,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: - renameExecutables prebuild: '' @@ -1003,6 +1029,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: - renameExecutables prebuild: '' @@ -1040,6 +1067,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: - renameExecutables prebuild: '' diff --git a/tests/metadata/dump/org.smssecure.smssecure.yaml b/tests/metadata/dump/org.smssecure.smssecure.yaml index db476b66..cc5111e3 100644 --- a/tests/metadata/dump/org.smssecure.smssecure.yaml +++ b/tests/metadata/dump/org.smssecure.smssecure.yaml @@ -31,6 +31,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - touch signing.properties @@ -91,6 +92,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - touch signing.properties @@ -133,6 +135,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - touch signing.properties @@ -173,6 +176,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - touch signing.properties @@ -213,6 +217,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - touch signing.properties @@ -252,6 +257,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - touch signing.properties @@ -291,6 +297,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - touch signing.properties @@ -330,6 +337,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - touch signing.properties diff --git a/tests/metadata/dump/org.videolan.vlc.yaml b/tests/metadata/dump/org.videolan.vlc.yaml index 20e92b83..7a61cf15 100644 --- a/tests/metadata/dump/org.videolan.vlc.yaml +++ b/tests/metadata/dump/org.videolan.vlc.yaml @@ -34,6 +34,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '48d' ../Makefile @@ -73,6 +74,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '48d' ../Makefile @@ -112,6 +114,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '48d' ../Makefile @@ -151,6 +154,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '48d' ../Makefile @@ -188,6 +192,7 @@ Builds: output: null patch: - ndkr9.patch + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc @@ -226,6 +231,7 @@ Builds: output: null patch: - ndkr9.patch + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc @@ -264,6 +270,7 @@ Builds: output: null patch: - ndkr9.patch + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc @@ -302,6 +309,7 @@ Builds: output: null patch: - ndkr9.patch + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc @@ -339,6 +347,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc @@ -376,6 +385,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc @@ -413,6 +423,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc @@ -450,6 +461,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc @@ -487,6 +499,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc @@ -524,6 +537,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC$$ ../vlc @@ -561,6 +575,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -598,6 +613,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -635,6 +651,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -672,6 +689,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -709,6 +727,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -746,6 +765,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -783,6 +803,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -820,6 +841,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -857,6 +879,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -894,6 +917,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -931,6 +955,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -968,6 +993,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -1005,6 +1031,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -1042,6 +1069,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -1079,6 +1107,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -1116,6 +1145,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -1153,6 +1183,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -1190,6 +1221,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -1227,6 +1259,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -1264,6 +1297,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -1301,6 +1335,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -1338,6 +1373,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc @@ -1376,6 +1412,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -1415,6 +1452,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -1454,6 +1492,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -1493,6 +1532,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -1532,6 +1572,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -1571,6 +1612,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -1610,6 +1652,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -1649,6 +1692,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -1688,6 +1732,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -1727,6 +1772,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -1766,6 +1812,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -1805,6 +1852,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -1844,6 +1892,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -1883,6 +1932,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -1922,6 +1972,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -1961,6 +2012,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -2000,6 +2052,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -2039,6 +2092,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -2078,6 +2132,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -2117,6 +2172,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -2156,6 +2212,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -2195,6 +2252,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -2234,6 +2292,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -2273,6 +2332,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -2312,6 +2372,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -2351,6 +2412,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -2390,6 +2452,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -2429,6 +2492,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -2468,6 +2532,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh @@ -2507,6 +2572,7 @@ Builds: oldsdkloc: false output: null patch: [] + postbuild: '' preassemble: [] prebuild: - sed -i -e '/^TARGET/aexit 0' -e 's@\-d \"gradle\/wrapper\"@1@g' ../compile.sh From 58f167b7e507ada3ed2ace5bb6bf5db6c858ff27 Mon Sep 17 00:00:00 2001 From: linsui Date: Sat, 4 Feb 2023 20:26:24 +0800 Subject: [PATCH 1009/2116] Add build.binary --- .gitlab-ci.yml | 1 + fdroidserver/build.py | 3 +- fdroidserver/common.py | 1 + fdroidserver/metadata.py | 2 + fdroidserver/publish.py | 6 +- tests/metadata/dump/com.politedroid.yaml | 4 ++ tests/metadata/dump/org.adaway.yaml | 28 ++++++++ .../dump/org.smssecure.smssecure.yaml | 8 +++ tests/metadata/dump/org.videolan.vlc.yaml | 66 +++++++++++++++++++ 9 files changed, 116 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7fa2b23c..4672e077 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -64,6 +64,7 @@ metadata_v0: -e 's/VercodeOperation:.\([^[]\+\)/VercodeOperation:\n- \1/' -e '/LiberapayID/d' -e '/postbuild/d' + -e '/binary:/d' metadata/dump_*/*.yaml - diff -uw metadata/dump_* diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 5977822d..3c37b99b 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -1143,7 +1143,7 @@ def main(): tools_version_log = ''.join(f.readlines()) os.remove(toolslog) - if app.Binaries is not None: + if url := build.binary or app.Binaries: # This is an app where we build from source, and # verify the APK contents against a developer's # binary. We get that binary now, and save it @@ -1155,7 +1155,6 @@ def main(): "developer supplied reference " "binaries: '{path}'" .format(path=binaries_dir)) - url = app.Binaries url = url.replace('%v', build.versionName) url = url.replace('%c', str(build.versionCode)) logging.info("...retrieving " + url) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 831b0cb5..3a4cdf0d 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -710,6 +710,7 @@ def read_pkg_args(appid_versionCode_pairs, allow_vercodes=False): apk_regex = re.compile(r'_(\d+)\.apk$') for p in appid_versionCode_pairs: + # Convert the apk name to a appid:versioncode pair p = apk_regex.sub(r':\1', p) if allow_vercodes and ':' in p: package, vercode = p.split(':') diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 40d6c582..6b8fad31 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -227,6 +227,7 @@ build_flags = [ 'maven', 'buildozer', 'output', + 'binary', 'srclibs', 'oldsdkloc', 'encoding', @@ -267,6 +268,7 @@ class Build(dict): self.maven = False self.buildozer = False self.output = None + self.binary = None self.srclibs = [] self.oldsdkloc = False self.encoding = None diff --git a/fdroidserver/publish.py b/fdroidserver/publish.py index 12280628..68e8c907 100644 --- a/fdroidserver/publish.py +++ b/fdroidserver/publish.py @@ -346,7 +346,11 @@ def main(): sys.exit(1) app = allapps[appid] - if app.Binaries: + build = None + for b in app.get("Builds", ()): + if b.get("versionCode") == vercode: + build = b + if app.Binaries or (build and build.binary): # It's an app where we build from source, and verify the apk # contents against a developer's binary, and then publish their diff --git a/tests/metadata/dump/com.politedroid.yaml b/tests/metadata/dump/com.politedroid.yaml index 0838cf12..0ae096f2 100644 --- a/tests/metadata/dump/com.politedroid.yaml +++ b/tests/metadata/dump/com.politedroid.yaml @@ -15,6 +15,7 @@ Builds: - KnownVuln - UpstreamNonFree - NonFreeAssets + binary: null build: '' buildjni: [] buildozer: false @@ -50,6 +51,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: [] buildozer: false @@ -85,6 +87,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: [] buildozer: false @@ -120,6 +123,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: [] buildozer: false diff --git a/tests/metadata/dump/org.adaway.yaml b/tests/metadata/dump/org.adaway.yaml index 2cde8fdd..3e27646e 100644 --- a/tests/metadata/dump/org.adaway.yaml +++ b/tests/metadata/dump/org.adaway.yaml @@ -12,6 +12,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: - 'yes' @@ -48,6 +49,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: - 'yes' @@ -85,6 +87,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: - 'yes' @@ -122,6 +125,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: - 'yes' @@ -159,6 +163,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: - 'yes' @@ -196,6 +201,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: - 'yes' @@ -233,6 +239,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: [] buildozer: false @@ -268,6 +275,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: - 'yes' @@ -305,6 +313,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: - 'yes' @@ -342,6 +351,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: - 'yes' @@ -379,6 +389,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: - 'yes' @@ -416,6 +427,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: - 'yes' @@ -454,6 +466,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: [] buildozer: false @@ -492,6 +505,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: [] buildozer: false @@ -529,6 +543,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: [] buildozer: false @@ -567,6 +582,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: [] buildozer: false @@ -605,6 +621,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: [] buildozer: false @@ -643,6 +660,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: [] buildozer: false @@ -685,6 +703,7 @@ Builds: - android-libs/HtmlSpanner/htmlspanner antcommands: [] antifeatures: [] + binary: null build: '' buildjni: - 'yes' @@ -735,6 +754,7 @@ Builds: - android-libs/HtmlSpanner/htmlspanner antcommands: [] antifeatures: [] + binary: null build: '' buildjni: - 'yes' @@ -781,6 +801,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: - 'yes' @@ -819,6 +840,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: - 'yes' @@ -857,6 +879,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: - 'yes' @@ -895,6 +918,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: - 'yes' @@ -933,6 +957,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: - 'yes' @@ -971,6 +996,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: - 'yes' @@ -1009,6 +1035,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: - 'yes' @@ -1047,6 +1074,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: - 'yes' diff --git a/tests/metadata/dump/org.smssecure.smssecure.yaml b/tests/metadata/dump/org.smssecure.smssecure.yaml index cc5111e3..ab970bcf 100644 --- a/tests/metadata/dump/org.smssecure.smssecure.yaml +++ b/tests/metadata/dump/org.smssecure.smssecure.yaml @@ -12,6 +12,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: [] buildozer: false @@ -73,6 +74,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: [] buildozer: false @@ -116,6 +118,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: [] buildozer: false @@ -157,6 +160,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: [] buildozer: false @@ -198,6 +202,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: [] buildozer: false @@ -238,6 +243,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: [] buildozer: false @@ -278,6 +284,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: [] buildozer: false @@ -318,6 +325,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: '' buildjni: [] buildozer: false diff --git a/tests/metadata/dump/org.videolan.vlc.yaml b/tests/metadata/dump/org.videolan.vlc.yaml index 7a61cf15..47b27d75 100644 --- a/tests/metadata/dump/org.videolan.vlc.yaml +++ b/tests/metadata/dump/org.videolan.vlc.yaml @@ -15,6 +15,7 @@ Builds: - ../java-libs/ActionBarSherlock antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] @@ -55,6 +56,7 @@ Builds: - ../java-libs/ActionBarSherlock antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=armeabi ./compile.sh release buildjni: [] @@ -95,6 +97,7 @@ Builds: - ../java-libs/ActionBarSherlock antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] @@ -135,6 +138,7 @@ Builds: - ../java-libs/ActionBarSherlock antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=mips ./compile.sh release buildjni: [] @@ -172,6 +176,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=mips ./compile.sh release buildjni: [] @@ -211,6 +216,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] @@ -250,6 +256,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=armeabi ./compile.sh release buildjni: [] @@ -289,6 +296,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] @@ -328,6 +336,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] @@ -366,6 +375,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] @@ -404,6 +414,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] @@ -442,6 +453,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] @@ -480,6 +492,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] @@ -518,6 +531,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] @@ -556,6 +570,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] @@ -594,6 +609,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] @@ -632,6 +648,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] @@ -670,6 +687,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] @@ -708,6 +726,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=mips ./compile.sh release buildjni: [] @@ -746,6 +765,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] @@ -784,6 +804,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] @@ -822,6 +843,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] @@ -860,6 +882,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=armeabi ./compile.sh release buildjni: [] @@ -898,6 +921,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] @@ -936,6 +960,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] @@ -974,6 +999,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=armeabi ./compile.sh release buildjni: [] @@ -1012,6 +1038,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] @@ -1050,6 +1077,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] @@ -1088,6 +1116,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=armeabi ./compile.sh release buildjni: [] @@ -1126,6 +1155,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] @@ -1164,6 +1194,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] @@ -1202,6 +1233,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=armeabi ./compile.sh release buildjni: [] @@ -1240,6 +1272,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] @@ -1278,6 +1311,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release buildjni: [] @@ -1316,6 +1350,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=armeabi ./compile.sh release buildjni: [] @@ -1354,6 +1389,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release buildjni: [] @@ -1392,6 +1428,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] @@ -1432,6 +1469,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] @@ -1472,6 +1510,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "x86" --release buildjni: [] @@ -1512,6 +1551,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] @@ -1552,6 +1592,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] @@ -1592,6 +1633,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "x86" --release buildjni: [] @@ -1632,6 +1674,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] @@ -1672,6 +1715,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] @@ -1712,6 +1756,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "x86" --release buildjni: [] @@ -1752,6 +1797,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] @@ -1792,6 +1838,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] @@ -1832,6 +1879,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "x86" --release buildjni: [] @@ -1872,6 +1920,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] @@ -1912,6 +1961,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] @@ -1952,6 +2002,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "x86" --release buildjni: [] @@ -1992,6 +2043,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] @@ -2032,6 +2084,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] @@ -2072,6 +2125,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "x86" --release buildjni: [] @@ -2112,6 +2166,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] @@ -2152,6 +2207,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] @@ -2192,6 +2248,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "x86" --release buildjni: [] @@ -2232,6 +2289,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] @@ -2272,6 +2330,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] @@ -2312,6 +2371,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "x86" --release buildjni: [] @@ -2352,6 +2412,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] @@ -2392,6 +2453,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] @@ -2432,6 +2494,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "x86" --release buildjni: [] @@ -2472,6 +2535,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release buildjni: [] @@ -2512,6 +2576,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release buildjni: [] @@ -2552,6 +2617,7 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: [] + binary: null build: - cd ../ && ./compile.sh -a "x86" --release buildjni: [] From fef42dbc87ae383a2e7921e0693d1f3f23f9959f Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 16 Feb 2023 14:28:14 +0100 Subject: [PATCH 1010/2116] build: support PosixPath in log message (Closes: #1096) --- fdroidserver/build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 3c37b99b..cd09b5dc 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -118,7 +118,7 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): # Helper to copy the contents of a directory to the server... def send_dir(path): - logging.debug("rsyncing " + path + " to " + ftp.getcwd()) + logging.debug("rsyncing %s to %s" % (path, ftp.getcwd())) # TODO this should move to `vagrant rsync` from >= v1.5 try: subprocess.check_output(['rsync', '--recursive', '--perms', '--links', '--quiet', '--rsh=' From 04230dc7c0cb3490124b3a54cc4987553d0be579 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 16 Feb 2023 15:17:14 +0100 Subject: [PATCH 1011/2116] common: support PosixPath in log message --- fdroidserver/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 3a4cdf0d..19f5f9e5 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1619,7 +1619,7 @@ def fetch_real_name(app_dir, flavours): for path in manifest_paths(app_dir, flavours): if not path.suffix == '.xml' or not path.is_file(): continue - logging.debug("fetch_real_name: Checking manifest at " + path) + logging.debug("fetch_real_name: Checking manifest at %s" % path) try: xml = parse_xml(path) except (XMLElementTree.ParseError, ValueError): From 0f151a3779ec2ecc40acffec05b7ec415a471d1e Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 7 Feb 2023 15:04:14 +0100 Subject: [PATCH 1012/2116] v2: move video to translated text (Closes: #1095) It contains a link to the actual video and can be translated. --- fdroidserver/index.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index b598b2bd..ebf8fe64 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -541,7 +541,6 @@ def package_metadata(app, repodir): "SourceCode", "Translation", "WebSite", - "video", "featureGraphic", "promoGraphic", "tvBanner", @@ -564,6 +563,7 @@ def package_metadata(app, repodir): "Name", "Summary", "Description", + "video", ): element_new = element[:1].lower() + element[1:] if element in app and app[element]: From b697845bda48d7d16f17dd9fe1a6b2cee525b388 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 16 Feb 2023 21:41:46 +0100 Subject: [PATCH 1013/2116] add test case for index.package_metadata() --- tests/index.TestCase | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/index.TestCase b/tests/index.TestCase index 9797a0b3..7cf46561 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -23,6 +23,7 @@ if localmodule not in sys.path: import fdroidserver.common import fdroidserver.index +import fdroidserver.metadata import fdroidserver.net import fdroidserver.signindex import fdroidserver.publish @@ -51,6 +52,7 @@ class IndexTest(unittest.TestCase): config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') fdroidserver.common.config = config fdroidserver.signindex.config = config + fdroidserver.update.config = config if not os.path.exists('repo/index-v1.jar'): fdroidserver.signindex.sign_index( @@ -509,6 +511,40 @@ class IndexTest(unittest.TestCase): i, fdroidserver.common.load_stats_fdroid_signing_key_fingerprints() ) + def test_package_metadata(self): + """A smoke check and format check of index.package_metadata()""" + def _kn(key): + return key[0].lower() + key[1:] + + apps = fdroidserver.metadata.read_metadata() + fdroidserver.update.insert_localized_app_metadata(apps) + + # smoke check all metadata files + for appid, app in apps.items(): + metadata = fdroidserver.index.package_metadata(app, 'repo') + for k in ('Description', 'Name', 'Summary', 'video'): + if app.get(k): + self.assertTrue(isinstance(metadata[_kn(k)], dict)) + for k in ('AuthorWebSite', 'IssueTracker', 'Translation', 'WebSite'): + if app.get(k): + self.assertTrue(isinstance(metadata[_kn(k)], str)) + + # make sure these known values were properly parsed and included + appid = 'info.guardianproject.urzip' + app = apps[appid] + metadata = fdroidserver.index.package_metadata(app, 'repo') + # files + self.assertEqual(36027, metadata['featureGraphic']['en-US']['size']) + self.assertEqual(1413, metadata['icon']['en-US']['size']) + # localized strings + self.assertEqual({'en-US': 'title'}, metadata['name']) + self.assertEqual({'en-US': 'video'}, metadata['video']) + # strings + self.assertEqual( + 'https://dev.guardianproject.info/projects/urzip', + metadata['webSite'], + ) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From ada36a3ee504ab11fd03fd338925712106a1ad52 Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Mon, 8 Aug 2022 18:06:30 +0200 Subject: [PATCH 1014/2116] Fix l10n broken in venvs --- setup.py | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/setup.py b/setup.py index 741b6877..0cc4e88c 100755 --- a/setup.py +++ b/setup.py @@ -1,6 +1,5 @@ #!/usr/bin/env python3 -import os import re import subprocess import sys @@ -50,30 +49,20 @@ class InstallWithCompile(install): def get_data_files(): - # workaround issue on OSX or --user installs, where sys.prefix is not an installable location - if os.access(sys.prefix, os.W_OK | os.X_OK): - data_prefix = sys.prefix - else: - data_prefix = '.' - data_files = [] with open('MANIFEST.in') as fp: data = fp.read() data_files.append( - ( - data_prefix + '/share/doc/fdroidserver/examples', - ['buildserver/config.buildserver.yml'] - + re.findall(r'include (examples/.*)', data), - ) + ('share/doc/fdroidserver/examples', re.findall(r'include (examples/.*)', data)) + ) + data_files.append( + ('share/doc/fdroidserver/examples', ['buildserver/config.buildserver.yml']) ) - for f in re.findall( - r'include (locale/[a-z][a-z][a-zA-Z_]*/LC_MESSAGES/fdroidserver\.)po', data - ): - f += 'mo' - d = os.path.join(data_prefix, 'share', os.path.dirname(f)) - data_files.append((d, [f])) + for d in re.findall(r'include (locale/.*)/fdroidserver\.po', data): + data_files.append(('share/' + d, [d + '/fdroidserver.mo'])) + return data_files From beb49eea48b97ee734d49112e9bbccd8e0a8f7cd Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Sun, 31 Jul 2022 21:52:54 +0200 Subject: [PATCH 1015/2116] Stop packaging makebuildserver script makebuildserver requires this repository to be cloned locally. Fixes #1014. --- setup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/setup.py b/setup.py index 0cc4e88c..0f6e9939 100755 --- a/setup.py +++ b/setup.py @@ -80,7 +80,6 @@ setup( url='https://f-droid.org', license='AGPL-3.0', packages=['fdroidserver', 'fdroidserver.asynchronousfilereader'], - scripts=['makebuildserver'], entry_points={'console_scripts': ['fdroid=fdroidserver.__main__:main']}, data_files=get_data_files(), python_requires='>=3.9', From ac9b20f6ab6702750c0914ca5d6579da5952fe62 Mon Sep 17 00:00:00 2001 From: FestplattenSchnitzel Date: Thu, 16 Feb 2023 21:52:26 +0100 Subject: [PATCH 1016/2116] gitlab-ci: check that localization works when installed with pip --- .gitlab-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4672e077..63b7c97c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -159,6 +159,9 @@ ubuntu_jammy_pip: - export PATH=$PATH:$ANDROID_HOME/build-tools/33.0.0 - fdroid=`which fdroid` ./tests/run-tests + # check localization was properly installed + - LANGUAGE='de' fdroid --help | grep 'Gültige Befehle sind' + # test installation process on a bleeding edge distro with pip arch_pip_install: From 5cebb839d4f5ee02ba5cf40886a21e634065fb9c Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 16 Feb 2023 21:05:05 +0100 Subject: [PATCH 1017/2116] gitlab-ci: only run Windows job in branches called "windows --- .gitlab-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 63b7c97c..96b9b59b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -509,9 +509,12 @@ Build documentation: - docs/build/html/ +# this job will only run in branches called "windows" until the Windows port is complete Windows: tags: - windows + only: + - windows script: - Import-Module "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1" - choco install --no-progress -y git --force --params "/GitAndUnixToolsOnPath" From c68e1489bd67ec9a7f7c0cf27367858fa078b1c7 Mon Sep 17 00:00:00 2001 From: FC Stegerman Date: Thu, 16 Feb 2023 21:14:56 +0100 Subject: [PATCH 1018/2116] import apksigcopier v1.1.1 --- fdroidserver/apksigcopier.py | 556 +++++++++++++++++++++++++++++++---- 1 file changed, 493 insertions(+), 63 deletions(-) diff --git a/fdroidserver/apksigcopier.py b/fdroidserver/apksigcopier.py index 321aec52..b6a89ad5 100644 --- a/fdroidserver/apksigcopier.py +++ b/fdroidserver/apksigcopier.py @@ -1,26 +1,29 @@ #!/usr/bin/python3 # encoding: utf-8 -# SPDX-FileCopyrightText: 2022 FC Stegerman +# SPDX-FileCopyrightText: 2023 FC Stegerman # SPDX-License-Identifier: GPL-3.0-or-later # -- ; {{{1 # # File : apksigcopier # Maintainer : FC Stegerman -# Date : 2022-11-01 +# Date : 2023-02-08 # -# Copyright : Copyright (C) 2022 FC Stegerman -# Version : v1.1.0 +# Copyright : Copyright (C) 2023 FC Stegerman +# Version : v1.1.1 # License : GPLv3+ # # -- ; }}}1 """ -Copy/extract/patch android apk signatures. +copy/extract/patch android apk signatures & compare apks apksigcopier is a tool for copying android APK signatures from a signed APK to an unsigned one (in order to verify reproducible builds). +It can also be used to compare two APKs with different signatures; this requires +apksigner. + CLI === @@ -28,27 +31,33 @@ CLI $ apksigcopier extract [OPTIONS] SIGNED_APK OUTPUT_DIR $ apksigcopier patch [OPTIONS] METADATA_DIR UNSIGNED_APK OUTPUT_APK $ apksigcopier copy [OPTIONS] SIGNED_APK UNSIGNED_APK OUTPUT_APK +$ apksigcopier compare [OPTIONS] FIRST_APK SECOND_APK The following environment variables can be set to 1, yes, or true to override the default behaviour: +* set APKSIGCOPIER_EXCLUDE_ALL_META=1 to exclude all metadata files * set APKSIGCOPIER_COPY_EXTRA_BYTES=1 to copy extra bytes after data (e.g. a v2 sig) +* set APKSIGCOPIER_SKIP_REALIGNMENT=1 to skip realignment of ZIP entries API === ->> from apksigcopier import do_extract, do_patch, do_copy +>> from apksigcopier import do_extract, do_patch, do_copy, do_compare >> do_extract(signed_apk, output_dir, v1_only=NO) >> do_patch(metadata_dir, unsigned_apk, output_apk, v1_only=NO) >> do_copy(signed_apk, unsigned_apk, output_apk, v1_only=NO) +>> do_compare(first_apk, second_apk, unsigned=False) You can use False, None, and True instead of NO, AUTO, and YES respectively. The following global variables (which default to False), can be set to override the default behaviour: +* set exclude_all_meta=True to exclude all metadata files * set copy_extra_bytes=True to copy extra bytes after data (e.g. a v2 sig) +* set skip_realignment=True to skip realignment of ZIP entries """ import glob @@ -56,17 +65,25 @@ import json import os import re import struct +import subprocess +import sys +import tempfile import zipfile import zlib from collections import namedtuple -from typing import Any, BinaryIO, Dict, Iterable, Iterator, Literal, Optional, Tuple, Union +from typing import Any, BinaryIO, Callable, Dict, Iterable, Iterator, Optional, Tuple, Union -__version__ = "1.1.0" +__version__ = "1.1.1" NAME = "apksigcopier" +if sys.version_info >= (3, 8): + from typing import Literal + NoAutoYes = Literal["no", "auto", "yes"] +else: + NoAutoYes = str + DateTime = Tuple[int, int, int, int, int, int] -NoAutoYes = Literal["no", "auto", "yes"] NoAutoYesBoolNone = Union[NoAutoYes, bool, None] ZipInfoDataPairs = Iterable[Tuple[zipfile.ZipInfo, bytes]] @@ -75,7 +92,9 @@ NOAUTOYES: Tuple[NoAutoYes, NoAutoYes, NoAutoYes] = ("no", "auto", "yes") NO, AUTO, YES = NOAUTOYES APK_META = re.compile(r"^META-INF/([0-9A-Za-z_-]+\.(SF|RSA|DSA|EC)|MANIFEST\.MF)$") META_EXT: Tuple[str, ...] = ("SF", "RSA|DSA|EC", "MF") +COPY_EXCLUDE: Tuple[str, ...] = ("META-INF/MANIFEST.MF",) DATETIMEZERO: DateTime = (1980, 0, 0, 0, 0, 0) +VERIFY_CMD: Tuple[str, ...] = ("apksigner", "verify") ################################################################################ # @@ -107,7 +126,9 @@ VALID_ZIP_META = dict( ZipData = namedtuple("ZipData", ("cd_offset", "eocd_offset", "cd_and_eocd")) +exclude_all_meta = False # exclude all metadata files in copy_apk() copy_extra_bytes = False # copy extra bytes after data in copy_apk() +skip_realignment = False # skip realignment of ZIP entries in copy_apk() class APKSigCopierError(Exception): @@ -132,14 +153,15 @@ class ReproducibleZipInfo(zipfile.ZipInfo): _override: Dict[str, Any] = {} - def __init__(self, zinfo, **override): # pylint: disable=W0231 + def __init__(self, zinfo: zipfile.ZipInfo, **override: Any) -> None: + # pylint: disable=W0231 if override: self._override = {**self._override, **override} for k in self.__slots__: if hasattr(zinfo, k): setattr(self, k, getattr(zinfo, k)) - def __getattribute__(self, name): + def __getattribute__(self, name: str) -> Any: if name != "_override": try: return self._override[name] @@ -167,7 +189,7 @@ class APKZipInfo(ReproducibleZipInfo): def noautoyes(value: NoAutoYesBoolNone) -> NoAutoYes: """ - Turn False into NO, None into AUTO, and True into YES. + Turns False into NO, None into AUTO, and True into YES. >>> from apksigcopier import noautoyes, NO, AUTO, YES >>> noautoyes(False) == NO == noautoyes(NO) @@ -190,24 +212,84 @@ def noautoyes(value: NoAutoYesBoolNone) -> NoAutoYes: def is_meta(filename: str) -> bool: """ - Check whether filename is a JAR metadata file. - - This is true when filename is a v1 (JAR) signature file (.SF), signature - block file (.RSA, .DSA, or .EC), or manifest (MANIFEST.MF). + Returns whether filename is a v1 (JAR) signature file (.SF), signature block + file (.RSA, .DSA, or .EC), or manifest (MANIFEST.MF). See https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html + + >>> from apksigcopier import is_meta + >>> is_meta("classes.dex") + False + >>> is_meta("META-INF/CERT.SF") + True + >>> is_meta("META-INF/CERT.RSA") + True + >>> is_meta("META-INF/MANIFEST.MF") + True + >>> is_meta("META-INF/OOPS") + False + """ return APK_META.fullmatch(filename) is not None def exclude_from_copying(filename: str) -> bool: """ - Check whether to exclude a file during copy_apk(). + Returns whether to exclude a file during copy_apk(). + + Excludes filenames in COPY_EXCLUDE (i.e. MANIFEST.MF) by default; when + exclude_all_meta is set to True instead, excludes all metadata files as + matched by is_meta(). + + Directories are always excluded. + + >>> import apksigcopier + >>> from apksigcopier import exclude_from_copying + >>> exclude_from_copying("classes.dex") + False + >>> exclude_from_copying("foo/") + True + >>> exclude_from_copying("META-INF/") + True + >>> exclude_from_copying("META-INF/MANIFEST.MF") + True + >>> exclude_from_copying("META-INF/CERT.SF") + False + >>> exclude_from_copying("META-INF/OOPS") + False + + >>> apksigcopier.exclude_all_meta = True + >>> exclude_from_copying("classes.dex") + False + >>> exclude_from_copying("META-INF/") + True + >>> exclude_from_copying("META-INF/MANIFEST.MF") + True + >>> exclude_from_copying("META-INF/CERT.SF") + True + >>> exclude_from_copying("META-INF/OOPS") + False - Fdroidserver always wants JAR Signature files to be excluded, so - it excludes all metadata files as matched by is_meta(). """ - return is_meta(filename) + return exclude_meta(filename) if exclude_all_meta else exclude_default(filename) + + +def exclude_default(filename: str) -> bool: + """ + Like exclude_from_copying(); excludes directories and filenames in + COPY_EXCLUDE (i.e. MANIFEST.MF). + """ + return is_directory(filename) or filename in COPY_EXCLUDE + + +def exclude_meta(filename: str) -> bool: + """Like exclude_from_copying(); excludes directories and all metadata files.""" + return is_directory(filename) or is_meta(filename) + + +def is_directory(filename: str) -> bool: + """ZIP entries with filenames that end with a '/' are directories.""" + return filename.endswith("/") ################################################################################ @@ -247,6 +329,27 @@ def zipflinger_virtual_entry(size: int) -> bytes: ) + int.to_bytes(size - 30, 2, "little") + b"\x00" * (size - 30) +def detect_zfe(apkfile: str) -> Optional[int]: + """ + Detect zipflinger virtual entry. + + Returns the size of the virtual entry if found, None otherwise. + + Raises ZipError if the size is less than 30 or greater than 4096, or the + data isn't all zeroes. + """ + with open(apkfile, "rb") as fh: + zfe_start = zipflinger_virtual_entry(30)[:28] # w/o len(extra) + if fh.read(28) == zfe_start: + zfe_size = 30 + int.from_bytes(fh.read(2), "little") + if not (30 <= zfe_size <= 4096): + raise ZipError("Unsupported virtual entry size") + if not fh.read(zfe_size - 30) == b"\x00" * (zfe_size - 30): + raise ZipError("Unsupported virtual entry data") + return zfe_size + return None + + ################################################################################ # # https://en.wikipedia.org/wiki/ZIP_(file_format) @@ -282,22 +385,73 @@ def zipflinger_virtual_entry(size: int) -> bytes: # FIXME: handle utf8 filenames w/o utf8 flag (as produced by zipflinger)? # https://android.googlesource.com/platform/tools/apksig # src/main/java/com/android/apksig/ApkSigner.java -def copy_apk(unsigned_apk: str, output_apk: str, *, zfe_size: Optional[int] = None) -> DateTime: +def copy_apk(unsigned_apk: str, output_apk: str, *, + copy_extra: Optional[bool] = None, + exclude: Optional[Callable[[str], bool]] = None, + realign: Optional[bool] = None, + zfe_size: Optional[int] = None) -> DateTime: """ Copy APK like apksigner would, excluding files matched by exclude_from_copying(). Adds a zipflinger virtual entry of zfe_size bytes if one is not already present and zfe_size is not None. + Returns max date_time. + The following global variables (which default to False), can be set to override the default behaviour: + * set exclude_all_meta=True to exclude all metadata files * set copy_extra_bytes=True to copy extra bytes after data (e.g. a v2 sig) + * set skip_realignment=True to skip realignment of ZIP entries + + The default behaviour can also be changed using the keyword-only arguments + exclude, copy_extra, and realign; these take precedence over the global + variables when not None. NB: exclude is a callable, not a bool; realign is + the inverse of skip_realignment. + + >>> import apksigcopier, os, zipfile + >>> apk = "test/apks/apks/golden-aligned-in.apk" + >>> with zipfile.ZipFile(apk, "r") as zf: + ... infos_in = zf.infolist() + >>> with tempfile.TemporaryDirectory() as tmpdir: + ... out = os.path.join(tmpdir, "out.apk") + ... apksigcopier.copy_apk(apk, out) + ... with zipfile.ZipFile(out, "r") as zf: + ... infos_out = zf.infolist() + (2017, 5, 15, 11, 28, 40) + >>> for i in infos_in: + ... print(i.filename) + META-INF/ + META-INF/MANIFEST.MF + AndroidManifest.xml + classes.dex + temp.txt + lib/armeabi/fake.so + resources.arsc + temp2.txt + >>> for i in infos_out: + ... print(i.filename) + AndroidManifest.xml + classes.dex + temp.txt + lib/armeabi/fake.so + resources.arsc + temp2.txt + >>> infos_in[2] + + >>> infos_out[0] + + >>> repr(infos_in[2:]) == repr(infos_out) + True - Returns - ------- - max date_time """ + if copy_extra is None: + copy_extra = copy_extra_bytes + if exclude is None: + exclude = exclude_from_copying + if realign is None: + realign = not skip_realignment with zipfile.ZipFile(unsigned_apk, "r") as zf: infos = zf.infolist() zdata = zip_data(unsigned_apk) @@ -318,15 +472,16 @@ def copy_apk(unsigned_apk: str, output_apk: str, *, zfe_size: Optional[int] = No raise ZipError("Expected local file header signature") n, m = struct.unpack(" bytes: +def _realign_zip_entry(info: zipfile.ZipInfo, hdr: bytes, n: int, m: int, + off_o: int, pad_like_apksigner: bool = True) -> bytes: align = 4096 if info.filename.endswith(".so") else 4 old_off = 30 + n + m + info.header_offset new_off = 30 + n + m + off_o - old_xtr = info.extra + old_xtr = hdr[30 + n:30 + n + m] new_xtr = b"" while len(old_xtr) >= 4: hdr_id, size = struct.unpack(" Iterator[Tuple[zipfile.ZipInfo, bytes]]: Extract v1 signature metadata files from signed APK. Yields (ZipInfo, data) pairs. + + >>> from apksigcopier import extract_meta + >>> apk = "test/apks/apks/golden-aligned-v1v2v3-out.apk" + >>> meta = tuple(extract_meta(apk)) + >>> [ x.filename for x, _ in meta ] + ['META-INF/RSA-2048.SF', 'META-INF/RSA-2048.RSA', 'META-INF/MANIFEST.MF'] + >>> for line in meta[0][1].splitlines()[:4]: + ... print(line.decode()) + Signature-Version: 1.0 + Created-By: 1.0 (Android) + SHA-256-Digest-Manifest: hz7AxDJU9Namxoou/kc4Z2GVRS9anCGI+M52tbCsXT0= + X-Android-APK-Signed: 2, 3 + >>> for line in meta[2][1].splitlines()[:2]: + ... print(line.decode()) + Manifest-Version: 1.0 + Created-By: 1.8.0_45-internal (Oracle Corporation) + """ with zipfile.ZipFile(signed_apk, "r") as zf_sig: for info in zf_sig.infolist(): @@ -410,34 +587,62 @@ def extract_meta(signed_apk: str) -> Iterator[Tuple[zipfile.ZipInfo, bytes]]: def extract_differences(signed_apk: str, extracted_meta: ZipInfoDataPairs) \ -> Optional[Dict[str, Any]]: - """Extract ZIP metadata differences from signed APK.""" + """ + Extract ZIP metadata differences from signed APK. + + >>> import apksigcopier as asc, pprint + >>> apk = "test/apks/apks/debuggable-boolean.apk" + >>> meta = tuple(asc.extract_meta(apk)) + >>> [ x.filename for x, _ in meta ] + ['META-INF/CERT.SF', 'META-INF/CERT.RSA', 'META-INF/MANIFEST.MF'] + >>> diff = asc.extract_differences(apk, meta) + >>> pprint.pprint(diff) + {'files': {'META-INF/CERT.RSA': {'flag_bits': 2056}, + 'META-INF/CERT.SF': {'flag_bits': 2056}, + 'META-INF/MANIFEST.MF': {'flag_bits': 2056}}} + + >>> meta[2][0].extract_version = 42 + >>> try: + ... asc.extract_differences(apk, meta) + ... except asc.ZipError as e: + ... print(e) + Unsupported extract_version + + >>> asc.validate_differences(diff) is None + True + >>> diff["files"]["META-INF/OOPS"] = {} + >>> asc.validate_differences(diff) + ".files key 'META-INF/OOPS' is not a metadata file" + >>> del diff["files"]["META-INF/OOPS"] + >>> diff["files"]["META-INF/CERT.RSA"]["compresslevel"] = 42 + >>> asc.validate_differences(diff) + ".files['META-INF/CERT.RSA'].compresslevel has an unexpected value" + >>> diff["oops"] = 42 + >>> asc.validate_differences(diff) + 'contains unknown key(s)' + + """ differences: Dict[str, Any] = {} files = {} for info, data in extracted_meta: diffs = {} - for k in VALID_ZIP_META.keys(): + for k in VALID_ZIP_META: if k != "compresslevel": v = getattr(info, k) if v != APKZipInfo._override[k]: if v not in VALID_ZIP_META[k]: raise ZipError(f"Unsupported {k}") diffs[k] = v - level = _get_compresslevel(info, data) + level = _get_compresslevel(signed_apk, info, data) if level != APKZipInfo.COMPRESSLEVEL: diffs["compresslevel"] = level if diffs: files[info.filename] = diffs if files: differences["files"] = files - with open(signed_apk, "rb") as fh: - zfe_start = zipflinger_virtual_entry(30)[:28] # w/o len(extra) - if fh.read(28) == zfe_start: - zfe_size = 30 + int.from_bytes(fh.read(2), "little") - if not (30 <= zfe_size <= 4096): - raise ZipError("Unsupported virtual entry size") - if not fh.read(zfe_size - 30) == b"\x00" * (zfe_size - 30): - raise ZipError("Unsupported virtual entry data") - differences["zipflinger_virtual_entry"] = zfe_size + zfe_size = detect_zfe(signed_apk) + if zfe_size: + differences["zipflinger_virtual_entry"] = zfe_size return differences or None @@ -447,7 +652,7 @@ def validate_differences(differences: Dict[str, Any]) -> Optional[str]: Returns None if valid, error otherwise. """ - if set(differences.keys()) - {"files", "zipflinger_virtual_entry"}: + if set(differences) - {"files", "zipflinger_virtual_entry"}: return "contains unknown key(s)" if "zipflinger_virtual_entry" in differences: if type(differences["zipflinger_virtual_entry"]) is not int: @@ -458,9 +663,11 @@ def validate_differences(differences: Dict[str, Any]) -> Optional[str]: if not isinstance(differences["files"], dict): return ".files is not a dict" for name, info in differences["files"].items(): + if not is_meta(name): + return f".files key {name!r} is not a metadata file" if not isinstance(info, dict): return f".files[{name!r}] is not a dict" - if set(info.keys()) - set(VALID_ZIP_META.keys()): + if set(info) - set(VALID_ZIP_META): return f".files[{name!r}] contains unknown key(s)" for k, v in info.items(): if v not in VALID_ZIP_META[k]: @@ -468,21 +675,72 @@ def validate_differences(differences: Dict[str, Any]) -> Optional[str]: return None -# FIXME: false positives on same compressed size? compare actual data? -def _get_compresslevel(info: zipfile.ZipInfo, data: bytes) -> int: +def _get_compresslevel(apkfile: str, info: zipfile.ZipInfo, data: bytes) -> int: if info.compress_type != 8: raise ZipError("Unsupported compress_type") + crc = _get_compressed_crc(apkfile, info) for level in VALID_ZIP_META["compresslevel"]: comp = zlib.compressobj(level, 8, -15) - if len(comp.compress(data) + comp.flush()) == info.compress_size: + if zlib.crc32(comp.compress(data) + comp.flush()) == crc: return level raise ZipError("Unsupported compresslevel") +def _get_compressed_crc(apkfile: str, info: zipfile.ZipInfo) -> int: + with open(apkfile, "rb") as fh: + fh.seek(info.header_offset) + hdr = fh.read(30) + if hdr[:4] != b"\x50\x4b\x03\x04": + raise ZipError("Expected local file header signature") + n, m = struct.unpack(" None: - """Add v1 signature metadata to APK (removes v2 sig block, if any).""" + """ + Add v1 signature metadata to APK (removes v2 sig block, if any). + + >>> import apksigcopier as asc + >>> unsigned_apk = "test/apks/apks/golden-aligned-in.apk" + >>> signed_apk = "test/apks/apks/golden-aligned-v1v2v3-out.apk" + >>> meta = tuple(asc.extract_meta(signed_apk)) + >>> [ x.filename for x, _ in meta ] + ['META-INF/RSA-2048.SF', 'META-INF/RSA-2048.RSA', 'META-INF/MANIFEST.MF'] + >>> with zipfile.ZipFile(unsigned_apk, "r") as zf: + ... infos_in = zf.infolist() + >>> with tempfile.TemporaryDirectory() as tmpdir: + ... out = os.path.join(tmpdir, "out.apk") + ... asc.copy_apk(unsigned_apk, out) + ... asc.patch_meta(meta, out) + ... with zipfile.ZipFile(out, "r") as zf: + ... infos_out = zf.infolist() + (2017, 5, 15, 11, 28, 40) + >>> for i in infos_in: + ... print(i.filename) + META-INF/ + META-INF/MANIFEST.MF + AndroidManifest.xml + classes.dex + temp.txt + lib/armeabi/fake.so + resources.arsc + temp2.txt + >>> for i in infos_out: + ... print(i.filename) + AndroidManifest.xml + classes.dex + temp.txt + lib/armeabi/fake.so + resources.arsc + temp2.txt + META-INF/RSA-2048.SF + META-INF/RSA-2048.RSA + META-INF/MANIFEST.MF + + """ with zipfile.ZipFile(output_apk, "r") as zf_out: for info in zf_out.infolist(): if is_meta(info.filename): @@ -504,6 +762,22 @@ def extract_v2_sig(apkfile: str, expected: bool = True) -> Optional[Tuple[int, b When successful, returns (sb_offset, sig_block); otherwise raises NoAPKSigningBlock when expected is True, else returns None. + + >>> import apksigcopier as asc + >>> apk = "test/apks/apks/golden-aligned-v1v2v3-out.apk" + >>> sb_offset, sig_block = asc.extract_v2_sig(apk) + >>> sb_offset + 8192 + >>> len(sig_block) + 4096 + + >>> apk = "test/apks/apks/golden-aligned-in.apk" + >>> try: + ... asc.extract_v2_sig(apk) + ... except asc.NoAPKSigningBlock as e: + ... print(e) + No APK Signing Block + """ cd_offset = zip_data(apkfile).cd_offset with open(apkfile, "rb") as fh: @@ -529,9 +803,16 @@ def zip_data(apkfile: str, count: int = 1024) -> ZipData: """ Extract central directory, EOCD, and offsets from ZIP. - Returns - ------- - ZipData + Returns ZipData. + + >>> import apksigcopier + >>> apk = "test/apks/apks/golden-aligned-v1v2v3-out.apk" + >>> data = apksigcopier.zip_data(apk) + >>> data.cd_offset, data.eocd_offset + (12288, 12843) + >>> len(data.cd_and_eocd) + 577 + """ with open(apkfile, "rb") as fh: fh.seek(-count, os.SEEK_END) @@ -550,7 +831,28 @@ def zip_data(apkfile: str, count: int = 1024) -> ZipData: # FIXME: can we determine signed_sb_offset? def patch_v2_sig(extracted_v2_sig: Tuple[int, bytes], output_apk: str) -> None: - """Implant extracted v2/v3 signature into APK.""" + """ + Implant extracted v2/v3 signature into APK. + + >>> import apksigcopier as asc + >>> unsigned_apk = "test/apks/apks/golden-aligned-in.apk" + >>> signed_apk = "test/apks/apks/golden-aligned-v1v2v3-out.apk" + >>> meta = tuple(asc.extract_meta(signed_apk)) + >>> v2_sig = asc.extract_v2_sig(signed_apk) + >>> with tempfile.TemporaryDirectory() as tmpdir: + ... out = os.path.join(tmpdir, "out.apk") + ... date_time = asc.copy_apk(unsigned_apk, out) + ... asc.patch_meta(meta, out, date_time=date_time) + ... asc.extract_v2_sig(out, expected=False) is None + ... asc.patch_v2_sig(v2_sig, out) + ... asc.extract_v2_sig(out) == v2_sig + ... with open(signed_apk, "rb") as a, open(out, "rb") as b: + ... a.read() == b.read() + True + True + True + + """ signed_sb_offset, signed_sb = extracted_v2_sig data_out = zip_data(output_apk) if signed_sb_offset < data_out.cd_offset: @@ -568,18 +870,37 @@ def patch_v2_sig(extracted_v2_sig: Tuple[int, bytes], output_apk: str) -> None: def patch_apk(extracted_meta: ZipInfoDataPairs, extracted_v2_sig: Optional[Tuple[int, bytes]], unsigned_apk: str, output_apk: str, *, - differences: Optional[Dict[str, Any]] = None) -> None: - """Patch extracted_meta + extracted_v2_sig (if not None) onto unsigned_apk and save as output_apk.""" + differences: Optional[Dict[str, Any]] = None, + exclude: Optional[Callable[[str], bool]] = None) -> None: + """ + Patch extracted_meta + extracted_v2_sig (if not None) onto unsigned_apk and + save as output_apk. + """ if differences and "zipflinger_virtual_entry" in differences: zfe_size = differences["zipflinger_virtual_entry"] else: zfe_size = None - date_time = copy_apk(unsigned_apk, output_apk, zfe_size=zfe_size) + date_time = copy_apk(unsigned_apk, output_apk, exclude=exclude, zfe_size=zfe_size) patch_meta(extracted_meta, output_apk, date_time=date_time, differences=differences) if extracted_v2_sig is not None: patch_v2_sig(extracted_v2_sig, output_apk) +def verify_apk(apk: str, min_sdk_version: Optional[int] = None, + verify_cmd: Optional[Tuple[str, ...]] = None) -> None: + """Verifies APK using apksigner.""" + args = tuple(verify_cmd or VERIFY_CMD) + if min_sdk_version is not None: + args += (f"--min-sdk-version={min_sdk_version}",) + args += ("--", apk) + try: + subprocess.run(args, check=True, stdout=subprocess.PIPE) + except subprocess.CalledProcessError: + raise APKSigCopierError(f"failed to verify {apk}") # pylint: disable=W0707 + except FileNotFoundError: + raise APKSigCopierError(f"{args[0]} command not found") # pylint: disable=W0707 + + # FIXME: support multiple signers? def do_extract(signed_apk: str, output_dir: str, v1_only: NoAutoYesBoolNone = NO, *, ignore_differences: bool = False) -> None: @@ -625,7 +946,9 @@ def do_extract(signed_apk: str, output_dir: str, v1_only: NoAutoYesBoolNone = NO # FIXME: support multiple signers? def do_patch(metadata_dir: str, unsigned_apk: str, output_apk: str, - v1_only: NoAutoYesBoolNone = NO, *, ignore_differences: bool = False) -> None: + v1_only: NoAutoYesBoolNone = NO, *, + exclude: Optional[Callable[[str], bool]] = None, + ignore_differences: bool = False) -> None: """ Patch signatures from metadata_dir onto unsigned_apk and save as output_apk. @@ -674,11 +997,13 @@ def do_patch(metadata_dir: str, unsigned_apk: str, output_apk: str, if not extracted_meta and extracted_v2_sig is None: raise APKSigCopierError("Expected v1 and/or v2/v3 signature, found neither") patch_apk(extracted_meta, extracted_v2_sig, unsigned_apk, output_apk, - differences=differences) + differences=differences, exclude=exclude) def do_copy(signed_apk: str, unsigned_apk: str, output_apk: str, - v1_only: NoAutoYesBoolNone = NO, *, ignore_differences: bool = False) -> None: + v1_only: NoAutoYesBoolNone = NO, *, + exclude: Optional[Callable[[str], bool]] = None, + ignore_differences: bool = False) -> None: """ Copy signatures from signed_apk onto unsigned_apk and save as output_apk. @@ -698,6 +1023,111 @@ def do_copy(signed_apk: str, unsigned_apk: str, output_apk: str, if extracted_v2_sig is not None and not ignore_differences: differences = extract_differences(signed_apk, extracted_meta) patch_apk(extracted_meta, extracted_v2_sig, unsigned_apk, output_apk, - differences=differences) + differences=differences, exclude=exclude) + + +def do_compare(first_apk: str, second_apk: str, unsigned: bool = False, + min_sdk_version: Optional[int] = None, *, + ignore_differences: bool = False, + verify_cmd: Optional[Tuple[str, ...]] = None) -> None: + """ + Compare first_apk to second_apk by: + * using apksigner to check if the first APK verifies + * checking if the second APK also verifies (unless unsigned is True) + * copying the signature from first_apk to a copy of second_apk + * checking if the resulting APK verifies + """ + verify_apk(first_apk, min_sdk_version=min_sdk_version, verify_cmd=verify_cmd) + if not unsigned: + verify_apk(second_apk, min_sdk_version=min_sdk_version, verify_cmd=verify_cmd) + with tempfile.TemporaryDirectory() as tmpdir: + output_apk = os.path.join(tmpdir, "output.apk") # FIXME + exclude = exclude_default if unsigned else exclude_meta + do_copy(first_apk, second_apk, output_apk, AUTO, exclude=exclude, + ignore_differences=ignore_differences) + verify_apk(output_apk, min_sdk_version=min_sdk_version, verify_cmd=verify_cmd) + + +def main() -> None: + """CLI; requires click.""" + + global exclude_all_meta, copy_extra_bytes, skip_realignment + exclude_all_meta = os.environ.get("APKSIGCOPIER_EXCLUDE_ALL_META") in ("1", "yes", "true") + copy_extra_bytes = os.environ.get("APKSIGCOPIER_COPY_EXTRA_BYTES") in ("1", "yes", "true") + skip_realignment = os.environ.get("APKSIGCOPIER_SKIP_REALIGNMENT") in ("1", "yes", "true") + + import click + + NAY = click.Choice(NOAUTOYES) + + @click.group(help=""" + apksigcopier - copy/extract/patch android apk signatures & compare apks + """) + @click.version_option(__version__) + def cli() -> None: + pass + + @cli.command(help=""" + Extract APK signatures from signed APK. + """) + @click.option("--v1-only", type=NAY, default=NO, show_default=True, + envvar="APKSIGCOPIER_V1_ONLY", help="Expect only a v1 signature.") + @click.option("--ignore-differences", is_flag=True, help="Don't write differences.json.") + @click.argument("signed_apk", type=click.Path(exists=True, dir_okay=False)) + @click.argument("output_dir", type=click.Path(exists=True, file_okay=False)) + def extract(*args: Any, **kwargs: Any) -> None: + do_extract(*args, **kwargs) + + @cli.command(help=""" + Patch extracted APK signatures onto unsigned APK. + """) + @click.option("--v1-only", type=NAY, default=NO, show_default=True, + envvar="APKSIGCOPIER_V1_ONLY", help="Expect only a v1 signature.") + @click.option("--ignore-differences", is_flag=True, help="Don't read differences.json.") + @click.argument("metadata_dir", type=click.Path(exists=True, file_okay=False)) + @click.argument("unsigned_apk", type=click.Path(exists=True, dir_okay=False)) + @click.argument("output_apk", type=click.Path(dir_okay=False)) + def patch(*args: Any, **kwargs: Any) -> None: + do_patch(*args, **kwargs) + + @cli.command(help=""" + Copy (extract & patch) signatures from signed to unsigned APK. + """) + @click.option("--v1-only", type=NAY, default=NO, show_default=True, + envvar="APKSIGCOPIER_V1_ONLY", help="Expect only a v1 signature.") + @click.option("--ignore-differences", is_flag=True, help="Don't copy metadata differences.") + @click.argument("signed_apk", type=click.Path(exists=True, dir_okay=False)) + @click.argument("unsigned_apk", type=click.Path(exists=True, dir_okay=False)) + @click.argument("output_apk", type=click.Path(dir_okay=False)) + def copy(*args: Any, **kwargs: Any) -> None: + do_copy(*args, **kwargs) + + @cli.command(help=""" + Compare two APKs by copying the signature from the first to a copy of + the second and checking if the resulting APK verifies. + + This command requires apksigner. + """) + @click.option("--unsigned", is_flag=True, help="Accept unsigned SECOND_APK.") + @click.option("--min-sdk-version", type=click.INT, help="Passed to apksigner.") + @click.option("--ignore-differences", is_flag=True, help="Don't copy metadata differences.") + @click.option("--verify-cmd", metavar="COMMAND", help="Command (with arguments) used to " + f"verify APKs. [default: {' '.join(VERIFY_CMD)!r}]") + @click.argument("first_apk", type=click.Path(exists=True, dir_okay=False)) + @click.argument("second_apk", type=click.Path(exists=True, dir_okay=False)) + def compare(*args: Any, **kwargs: Any) -> None: + if kwargs["verify_cmd"] is not None: + kwargs["verify_cmd"] = tuple(kwargs["verify_cmd"].split()) + do_compare(*args, **kwargs) + + try: + cli(prog_name=NAME) + except (APKSigCopierError, zipfile.BadZipFile) as e: + click.echo(f"Error: {e}.", err=True) + sys.exit(1) + + +if __name__ == "__main__": + main() # vim: set tw=80 sw=4 sts=4 et fdm=marker : From 2e080c8170a686a6c1994e4ff860ebc6ca60d0f8 Mon Sep 17 00:00:00 2001 From: FC Stegerman Date: Thu, 16 Feb 2023 21:33:31 +0100 Subject: [PATCH 1019/2116] make F-Droid-specific changes to apksigcopier.py --- fdroidserver/apksigcopier.py | 141 +++-------------------------------- fdroidserver/common.py | 6 +- 2 files changed, 13 insertions(+), 134 deletions(-) diff --git a/fdroidserver/apksigcopier.py b/fdroidserver/apksigcopier.py index b6a89ad5..2ab0b8c4 100644 --- a/fdroidserver/apksigcopier.py +++ b/fdroidserver/apksigcopier.py @@ -16,7 +16,7 @@ # -- ; }}}1 """ -copy/extract/patch android apk signatures & compare apks +Copy/extract/patch android apk signatures & compare apks. apksigcopier is a tool for copying android APK signatures from a signed APK to an unsigned one (in order to verify reproducible builds). @@ -65,9 +65,7 @@ import json import os import re import struct -import subprocess import sys -import tempfile import zipfile import zlib @@ -94,7 +92,6 @@ APK_META = re.compile(r"^META-INF/([0-9A-Za-z_-]+\.(SF|RSA|DSA|EC)|MANIFEST\.MF) META_EXT: Tuple[str, ...] = ("SF", "RSA|DSA|EC", "MF") COPY_EXCLUDE: Tuple[str, ...] = ("META-INF/MANIFEST.MF",) DATETIMEZERO: DateTime = (1980, 0, 0, 0, 0, 0) -VERIFY_CMD: Tuple[str, ...] = ("apksigner", "verify") ################################################################################ # @@ -189,7 +186,7 @@ class APKZipInfo(ReproducibleZipInfo): def noautoyes(value: NoAutoYesBoolNone) -> NoAutoYes: """ - Turns False into NO, None into AUTO, and True into YES. + Turn False into NO, None into AUTO, and True into YES. >>> from apksigcopier import noautoyes, NO, AUTO, YES >>> noautoyes(False) == NO == noautoyes(NO) @@ -212,6 +209,8 @@ def noautoyes(value: NoAutoYesBoolNone) -> NoAutoYes: def is_meta(filename: str) -> bool: """ + Check whether filename is a JAR metadata file. + Returns whether filename is a v1 (JAR) signature file (.SF), signature block file (.RSA, .DSA, or .EC), or manifest (MANIFEST.MF). @@ -235,7 +234,7 @@ def is_meta(filename: str) -> bool: def exclude_from_copying(filename: str) -> bool: """ - Returns whether to exclude a file during copy_apk(). + Check whether to exclude a file during copy_apk(). Excludes filenames in COPY_EXCLUDE (i.e. MANIFEST.MF) by default; when exclude_all_meta is set to True instead, excludes all metadata files as @@ -276,8 +275,9 @@ def exclude_from_copying(filename: str) -> bool: def exclude_default(filename: str) -> bool: """ - Like exclude_from_copying(); excludes directories and filenames in - COPY_EXCLUDE (i.e. MANIFEST.MF). + Like exclude_from_copying(). + + Excludes directories and filenames in COPY_EXCLUDE (i.e. MANIFEST.MF). """ return is_directory(filename) or filename in COPY_EXCLUDE @@ -872,10 +872,7 @@ def patch_apk(extracted_meta: ZipInfoDataPairs, extracted_v2_sig: Optional[Tuple unsigned_apk: str, output_apk: str, *, differences: Optional[Dict[str, Any]] = None, exclude: Optional[Callable[[str], bool]] = None) -> None: - """ - Patch extracted_meta + extracted_v2_sig (if not None) onto unsigned_apk and - save as output_apk. - """ + """Patch extracted_meta + extracted_v2_sig (if not None) onto unsigned_apk and save as output_apk.""" if differences and "zipflinger_virtual_entry" in differences: zfe_size = differences["zipflinger_virtual_entry"] else: @@ -886,21 +883,6 @@ def patch_apk(extracted_meta: ZipInfoDataPairs, extracted_v2_sig: Optional[Tuple patch_v2_sig(extracted_v2_sig, output_apk) -def verify_apk(apk: str, min_sdk_version: Optional[int] = None, - verify_cmd: Optional[Tuple[str, ...]] = None) -> None: - """Verifies APK using apksigner.""" - args = tuple(verify_cmd or VERIFY_CMD) - if min_sdk_version is not None: - args += (f"--min-sdk-version={min_sdk_version}",) - args += ("--", apk) - try: - subprocess.run(args, check=True, stdout=subprocess.PIPE) - except subprocess.CalledProcessError: - raise APKSigCopierError(f"failed to verify {apk}") # pylint: disable=W0707 - except FileNotFoundError: - raise APKSigCopierError(f"{args[0]} command not found") # pylint: disable=W0707 - - # FIXME: support multiple signers? def do_extract(signed_apk: str, output_dir: str, v1_only: NoAutoYesBoolNone = NO, *, ignore_differences: bool = False) -> None: @@ -1025,109 +1007,4 @@ def do_copy(signed_apk: str, unsigned_apk: str, output_apk: str, patch_apk(extracted_meta, extracted_v2_sig, unsigned_apk, output_apk, differences=differences, exclude=exclude) - -def do_compare(first_apk: str, second_apk: str, unsigned: bool = False, - min_sdk_version: Optional[int] = None, *, - ignore_differences: bool = False, - verify_cmd: Optional[Tuple[str, ...]] = None) -> None: - """ - Compare first_apk to second_apk by: - * using apksigner to check if the first APK verifies - * checking if the second APK also verifies (unless unsigned is True) - * copying the signature from first_apk to a copy of second_apk - * checking if the resulting APK verifies - """ - verify_apk(first_apk, min_sdk_version=min_sdk_version, verify_cmd=verify_cmd) - if not unsigned: - verify_apk(second_apk, min_sdk_version=min_sdk_version, verify_cmd=verify_cmd) - with tempfile.TemporaryDirectory() as tmpdir: - output_apk = os.path.join(tmpdir, "output.apk") # FIXME - exclude = exclude_default if unsigned else exclude_meta - do_copy(first_apk, second_apk, output_apk, AUTO, exclude=exclude, - ignore_differences=ignore_differences) - verify_apk(output_apk, min_sdk_version=min_sdk_version, verify_cmd=verify_cmd) - - -def main() -> None: - """CLI; requires click.""" - - global exclude_all_meta, copy_extra_bytes, skip_realignment - exclude_all_meta = os.environ.get("APKSIGCOPIER_EXCLUDE_ALL_META") in ("1", "yes", "true") - copy_extra_bytes = os.environ.get("APKSIGCOPIER_COPY_EXTRA_BYTES") in ("1", "yes", "true") - skip_realignment = os.environ.get("APKSIGCOPIER_SKIP_REALIGNMENT") in ("1", "yes", "true") - - import click - - NAY = click.Choice(NOAUTOYES) - - @click.group(help=""" - apksigcopier - copy/extract/patch android apk signatures & compare apks - """) - @click.version_option(__version__) - def cli() -> None: - pass - - @cli.command(help=""" - Extract APK signatures from signed APK. - """) - @click.option("--v1-only", type=NAY, default=NO, show_default=True, - envvar="APKSIGCOPIER_V1_ONLY", help="Expect only a v1 signature.") - @click.option("--ignore-differences", is_flag=True, help="Don't write differences.json.") - @click.argument("signed_apk", type=click.Path(exists=True, dir_okay=False)) - @click.argument("output_dir", type=click.Path(exists=True, file_okay=False)) - def extract(*args: Any, **kwargs: Any) -> None: - do_extract(*args, **kwargs) - - @cli.command(help=""" - Patch extracted APK signatures onto unsigned APK. - """) - @click.option("--v1-only", type=NAY, default=NO, show_default=True, - envvar="APKSIGCOPIER_V1_ONLY", help="Expect only a v1 signature.") - @click.option("--ignore-differences", is_flag=True, help="Don't read differences.json.") - @click.argument("metadata_dir", type=click.Path(exists=True, file_okay=False)) - @click.argument("unsigned_apk", type=click.Path(exists=True, dir_okay=False)) - @click.argument("output_apk", type=click.Path(dir_okay=False)) - def patch(*args: Any, **kwargs: Any) -> None: - do_patch(*args, **kwargs) - - @cli.command(help=""" - Copy (extract & patch) signatures from signed to unsigned APK. - """) - @click.option("--v1-only", type=NAY, default=NO, show_default=True, - envvar="APKSIGCOPIER_V1_ONLY", help="Expect only a v1 signature.") - @click.option("--ignore-differences", is_flag=True, help="Don't copy metadata differences.") - @click.argument("signed_apk", type=click.Path(exists=True, dir_okay=False)) - @click.argument("unsigned_apk", type=click.Path(exists=True, dir_okay=False)) - @click.argument("output_apk", type=click.Path(dir_okay=False)) - def copy(*args: Any, **kwargs: Any) -> None: - do_copy(*args, **kwargs) - - @cli.command(help=""" - Compare two APKs by copying the signature from the first to a copy of - the second and checking if the resulting APK verifies. - - This command requires apksigner. - """) - @click.option("--unsigned", is_flag=True, help="Accept unsigned SECOND_APK.") - @click.option("--min-sdk-version", type=click.INT, help="Passed to apksigner.") - @click.option("--ignore-differences", is_flag=True, help="Don't copy metadata differences.") - @click.option("--verify-cmd", metavar="COMMAND", help="Command (with arguments) used to " - f"verify APKs. [default: {' '.join(VERIFY_CMD)!r}]") - @click.argument("first_apk", type=click.Path(exists=True, dir_okay=False)) - @click.argument("second_apk", type=click.Path(exists=True, dir_okay=False)) - def compare(*args: Any, **kwargs: Any) -> None: - if kwargs["verify_cmd"] is not None: - kwargs["verify_cmd"] = tuple(kwargs["verify_cmd"].split()) - do_compare(*args, **kwargs) - - try: - cli(prog_name=NAME) - except (APKSigCopierError, zipfile.BadZipFile) as e: - click.echo(f"Error: {e}.", err=True) - sys.exit(1) - - -if __name__ == "__main__": - main() - # vim: set tw=80 sw=4 sts=4 et fdm=marker : diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 19f5f9e5..1354fd1f 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3258,7 +3258,8 @@ def apk_implant_signatures(apkpath, outpath, manifest): """ sigdir = os.path.dirname(manifest) # FIXME - apksigcopier.do_patch(sigdir, apkpath, outpath, v1_only=None) + apksigcopier.do_patch(sigdir, apkpath, outpath, v1_only=None, + exclude=apksigcopier.exclude_meta) def apk_extract_signatures(apkpath, outdir): @@ -3388,7 +3389,8 @@ def verify_apks(signed_apk, unsigned_apk, tmp_dir, v1_only=None): tmp_apk = os.path.join(tmp_dir, 'sigcp_' + os.path.basename(unsigned_apk)) try: - apksigcopier.do_copy(signed_apk, unsigned_apk, tmp_apk, v1_only=v1_only) + apksigcopier.do_copy(signed_apk, unsigned_apk, tmp_apk, v1_only=v1_only, + exclude=apksigcopier.exclude_meta) except apksigcopier.APKSigCopierError as e: logging.info('...NOT verified - {0}'.format(tmp_apk)) error = 'signature copying failed: {}'.format(str(e)) From 0c9f62a5fe8a8bec43a24c91ea1c142aa109e37d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 17 Feb 2023 12:39:15 +0100 Subject: [PATCH 1020/2116] signindex: add JSON check for entry.json Ran this to generate/refresh the test index files: `cd tests; ../fdroid update --nosign --pretty` * converts config.py description to a single line, since the values are no longer stripped, so this give the same output. closes #835 --- .gitignore | 11 +- MANIFEST.in | 2 + fdroidserver/signindex.py | 48 +- tests/config.py | 11 +- tests/repo/entry.json | 11 + tests/repo/index-v1.json | 4 +- tests/repo/index-v2.json | 920 +++++++++++++++++++++++++++++++++++++ tests/repo/index.xml | 2 +- tests/run-tests | 4 +- tests/signindex.TestCase | 64 ++- tests/stats/known_apks.txt | 2 + 11 files changed, 1048 insertions(+), 31 deletions(-) create mode 100644 tests/repo/entry.json create mode 100644 tests/repo/index-v2.json diff --git a/.gitignore b/.gitignore index 84ee6344..c8785a33 100644 --- a/.gitignore +++ b/.gitignore @@ -42,16 +42,21 @@ makebuildserver.config.py /tests/OBBMainPatchCurrent.apk /tests/OBBMainTwoVersions.apk /tests/archive/categories.txt +/tests/archive/diff/[1-9]*.json +/tests/archive/entry.jar +/tests/archive/entry.json /tests/archive/icons* +/tests/archive/index-v1.jar +/tests/archive/index-v1.json +/tests/archive/index-v2.json /tests/archive/index.css /tests/archive/index.html /tests/archive/index.jar /tests/archive/index.png -/tests/archive/index_unsigned.jar /tests/archive/index.xml -/tests/archive/index-v1.jar -/tests/archive/index-v1.json +/tests/archive/index_unsigned.jar /tests/metadata/org.videolan.vlc/en-US/icon*.png +/tests/repo/diff/[1-9]*.json /tests/repo/index.css /tests/repo/index.html /tests/repo/index.jar diff --git a/MANIFEST.in b/MANIFEST.in index 87af42b9..98889a35 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -642,8 +642,10 @@ include tests/repo/com.politedroid_4.apk include tests/repo/com.politedroid_5.apk include tests/repo/com.politedroid_6.apk include tests/repo/duplicate.permisssions_9999999.apk +include tests/repo/entry.json include tests/repo/fake.ota.update_1234.zip include tests/repo/index-v1.json +include tests/repo/index-v2.json include tests/repo/index.xml include tests/repo/info.zwanenburg.caffeinetile_4.apk include tests/repo/main.1101613.obb.main.twoversions.obb diff --git a/fdroidserver/signindex.py b/fdroidserver/signindex.py index 852ed958..8610f654 100644 --- a/fdroidserver/signindex.py +++ b/fdroidserver/signindex.py @@ -121,27 +121,43 @@ def sign_jar(jar, use_old_algs=False): def sign_index(repodir, json_name): - """Sign index-v1.json to make index-v1.jar. + """Sign data file like entry.json to make a signed JAR like entry.jar. + + The data file like index-v1.json means that there is unsigned + data. That file is then stuck into a jar and signed by the + signing process. This is a bit different than sign_jar, which is + used for index.jar: that creates index.xml then puts that in a + index_unsigned.jar, then that file is signed. + + This also checks to make sure that the JSON files are intact + before signing them. Broken JSON files should never be signed, so + taking some extra time and failing hard is the preferred + option. This signing process can happen on an entirely separate + machine and file tree, so this ensures that nothing got broken + during transfer. - This is a bit different than index.jar: instead of their being index.xml - and index_unsigned.jar, the presence of index-v1.json means that there is - unsigned data. That file is then stuck into a jar and signed by the - signing process. index-v1.json is never published to the repo. It is - included in the binary transparency log, if that is enabled. """ + json_file = os.path.join(repodir, json_name) + with open(json_file, encoding="utf-8") as fp: + data = json.load(fp) + if json_name == 'entry.json': + index_file = os.path.join(repodir, data['index']['name'].lstrip('/')) + sha256 = common.sha256sum(index_file) + if sha256 != data['index']['sha256']: + raise FDroidException( + _('%s has bad SHA-256: %s') % (index_file, sha256) + ) + with open(index_file) as fp: + index = json.load(fp) + if not isinstance(index, dict): + raise FDroidException(_('%s did not produce a dict!') % index_file) + elif json_name == 'index-v1.json': + [metadata.App(app) for app in data["apps"]] + name, ext = common.get_extension(json_name) - index_file = os.path.join(repodir, json_name) - - # Test if index is valid - with open(index_file, encoding="utf-8") as fp: - index = json.load(fp) - # TODO: add test for index-v2 - if "apps" in index: - [metadata.App(app) for app in index["apps"]] - jar_file = os.path.join(repodir, name + '.jar') with zipfile.ZipFile(jar_file, 'w', zipfile.ZIP_DEFLATED) as jar: - jar.write(index_file, json_name) + jar.write(json_file, json_name) if json_name in ('index.xml', 'index-v1.json'): sign_jar(jar_file, use_old_algs=True) diff --git a/tests/config.py b/tests/config.py index fde7e973..899ee68c 100644 --- a/tests/config.py +++ b/tests/config.py @@ -1,12 +1,9 @@ +# TODO convert to config.yml! + repo_url = "https://MyFirstFDroidRepo.org/fdroid/repo" repo_name = "My First F-Droid Repo Demo" -repo_description = """ -This is a repository of apps to be used with F-Droid. Applications in this -repository are either official binaries built by the original application -developers, or are binaries built from source by the admin of f-droid.org -using the tools on https://gitlab.com/u/fdroid. -""" +repo_description = """This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid.""" archive_older = 3 archive_url = "https://f-droid.org/archive" @@ -32,3 +29,5 @@ update_stats = True install_list = 'org.adaway' uninstall_list = ('com.android.vending', 'com.facebook.orca', ) + +repo_key_sha256 = "f49af3f11efddf20dffd70f5e3117b9976674167adca280e6b1932a0601b26f6" diff --git a/tests/repo/entry.json b/tests/repo/entry.json new file mode 100644 index 00000000..f7c1420b --- /dev/null +++ b/tests/repo/entry.json @@ -0,0 +1,11 @@ +{ + "timestamp": 1676634233000, + "version": 20002, + "index": { + "name": "/index-v2.json", + "sha256": "da1d651eb7bbc27d2334819c591baa5afb70b01397849de515dade624a96de6d", + "size": 32946, + "numPackages": 10 + }, + "diffs": {} +} \ No newline at end of file diff --git a/tests/repo/index-v1.json b/tests/repo/index-v1.json index b103ba8d..74d9cae6 100644 --- a/tests/repo/index-v1.json +++ b/tests/repo/index-v1.json @@ -1,6 +1,6 @@ { "repo": { - "timestamp": 1502845383782, + "timestamp": 1676634233000, "version": 20002, "name": "My First F-Droid Repo Demo", "icon": "icon.png", @@ -698,4 +698,4 @@ } ] } -} +} \ No newline at end of file diff --git a/tests/repo/index-v2.json b/tests/repo/index-v2.json new file mode 100644 index 00000000..536abd6f --- /dev/null +++ b/tests/repo/index-v2.json @@ -0,0 +1,920 @@ +{ + "repo": { + "name": { + "en-US": "My First F-Droid Repo Demo" + }, + "description": { + "en-US": "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." + }, + "icon": { + "en-US": { + "name": "/icons/icon.png", + "sha256": "b1f27fa87f8cabca50cdcd462a0f500d79d883b965a498d0e49eea560b39be1f", + "size": 715 + } + }, + "address": "https://MyFirstFDroidRepo.org/fdroid/repo", + "mirrors": [ + { + "url": "https://MyFirstFDroidRepo.org/fdroid/repo", + "isPrimary": true + }, + { + "url": "http://foobarfoobarfoobar.onion/fdroid/repo" + }, + { + "url": "https://foo.bar/fdroid/repo" + } + ], + "timestamp": 1676634233000, + "requests": { + "install": [ + "org.adaway" + ], + "uninstall": [ + "com.android.vending", + "com.facebook.orca" + ] + } + }, + "packages": { + "com.politedroid": { + "metadata": { + "added": 1498176000000, + "categories": [ + "Time" + ], + "issueTracker": "https://github.com/miguelvps/PoliteDroid/issues", + "lastUpdated": 1498176000000, + "license": "GPL-3.0-only", + "sourceCode": "https://github.com/miguelvps/PoliteDroid", + "name": { + "en-US": "Polite Droid" + }, + "summary": { + "en-US": "Calendar tool" + }, + "description": { + "en-US": "Activates silent mode during calendar events." + }, + "icon": { + "en-US": { + "name": "/icons/com.politedroid.6.png", + "sha256": "edf8d30b97a06821337e267168b131a6a16d81df9e7007e017778f9781f5c8f3", + "size": 559 + } + }, + "preferredSigner": "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" + }, + "versions": { + "70c2f776a2bac38a58a7d521f96ee0414c6f0fb1de973c3ca8b10862a009247d": { + "added": 1498176000000, + "file": { + "name": "/com.politedroid_6.apk", + "sha256": "70c2f776a2bac38a58a7d521f96ee0414c6f0fb1de973c3ca8b10862a009247d", + "size": 16578, + "ipfsCIDv1": "bafybeidvgxrq77qr7yqkcnykdfvszsxjqc5kzt6ya5k7r666wriadrylt4" + }, + "manifest": { + "versionName": "1.5", + "versionCode": 6, + "usesSdk": { + "minSdkVersion": 14, + "targetSdkVersion": 21 + }, + "signer": { + "sha256": [ + "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" + ] + }, + "usesPermission": [ + { + "name": "android.permission.READ_CALENDAR" + }, + { + "name": "android.permission.RECEIVE_BOOT_COMPLETED" + } + ] + }, + "antiFeatures": { + "NoSourceSince": {} + } + }, + "5bdbfa071cca4b8d05ced41d6b28763595d6e8096cca5bbf0f9253c9a2622e5d": { + "added": 1498176000000, + "file": { + "name": "/com.politedroid_5.apk", + "sha256": "5bdbfa071cca4b8d05ced41d6b28763595d6e8096cca5bbf0f9253c9a2622e5d", + "size": 18817, + "ipfsCIDv1": "bafybeifbrio5rumqvgfd5sihs7yihux2yktfvd5i7jimlgrwchzcvi6ldu" + }, + "manifest": { + "versionName": "1.4", + "versionCode": 5, + "usesSdk": { + "minSdkVersion": 3, + "targetSdkVersion": 10 + }, + "signer": { + "sha256": [ + "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" + ] + }, + "usesPermission": [ + { + "name": "android.permission.READ_CALENDAR" + }, + { + "name": "android.permission.RECEIVE_BOOT_COMPLETED" + } + ] + }, + "antiFeatures": { + "NoSourceSince": {} + } + }, + "c809bdff83715fbf919f3840ee09869b038e209378b906e135ee40d3f0e1f075": { + "added": 1498176000000, + "file": { + "name": "/com.politedroid_4.apk", + "sha256": "c809bdff83715fbf919f3840ee09869b038e209378b906e135ee40d3f0e1f075", + "size": 18489, + "ipfsCIDv1": "bafybeicridbev22c2rt3lwbfsrkafcf3yepak7kpvk6zgbayrxls2mmwim" + }, + "manifest": { + "versionName": "1.3", + "versionCode": 4, + "usesSdk": { + "minSdkVersion": 3, + "targetSdkVersion": 3 + }, + "signer": { + "sha256": [ + "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" + ] + }, + "usesPermission": [ + { + "name": "android.permission.READ_CALENDAR" + }, + { + "name": "android.permission.RECEIVE_BOOT_COMPLETED" + }, + { + "name": "android.permission.WRITE_EXTERNAL_STORAGE" + }, + { + "name": "android.permission.READ_PHONE_STATE" + }, + { + "name": "android.permission.READ_EXTERNAL_STORAGE" + } + ] + }, + "antiFeatures": { + "NoSourceSince": {} + } + }, + "665d03d61ebc642289fda697f71a59305b0202b16cafc5ffdae91cbe91f0b25d": { + "added": 1498176000000, + "file": { + "name": "/com.politedroid_3.apk", + "sha256": "665d03d61ebc642289fda697f71a59305b0202b16cafc5ffdae91cbe91f0b25d", + "size": 17552, + "ipfsCIDv1": "bafybeib7arokhivttalcnq5ieu5fx5pzn7vo5qpmdiozqodzhb4ba53nd4" + }, + "manifest": { + "versionName": "1.2", + "versionCode": 3, + "usesSdk": { + "minSdkVersion": 3, + "targetSdkVersion": 3 + }, + "signer": { + "sha256": [ + "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" + ] + }, + "usesPermission": [ + { + "name": "android.permission.READ_CALENDAR" + }, + { + "name": "android.permission.RECEIVE_BOOT_COMPLETED" + }, + { + "name": "android.permission.WRITE_EXTERNAL_STORAGE" + }, + { + "name": "android.permission.READ_PHONE_STATE" + }, + { + "name": "android.permission.READ_EXTERNAL_STORAGE" + } + ] + }, + "antiFeatures": { + "NoSourceSince": {} + } + } + } + }, + "duplicate.permisssions": { + "metadata": { + "added": 1513900800000, + "categories": [ + "tests" + ], + "lastUpdated": 1513900800000, + "name": { + "en-US": "Duplicate Permisssions" + }, + "summary": { + "en-US": "Test app for all possible " + }, + "icon": { + "en-US": { + "name": "/icons/duplicate.permisssions.9999999.png", + "sha256": "fb0f3bb45312b53e349a762b67af4f48d010a38a245f75c3a0b152097d7b067f", + "size": 1301 + } + }, + "preferredSigner": "659e1fd284549f70d13fb02c620100e27eeea3420558cce62b0f5d4cf2b77d84" + }, + "versions": { + "8367857fe75f85321ce2c344b34804d0bc193707f6ba03710d025d9030803434": { + "added": 1513900800000, + "file": { + "name": "/duplicate.permisssions_9999999.apk", + "sha256": "8367857fe75f85321ce2c344b34804d0bc193707f6ba03710d025d9030803434", + "size": 27446, + "ipfsCIDv1": "bafybeicucr4lk7fynyde4fpxubudpl6m6wqnuq2j6vjroutjyryw24en3u" + }, + "manifest": { + "versionName": "", + "versionCode": 9999999, + "usesSdk": { + "minSdkVersion": 18, + "targetSdkVersion": 27 + }, + "signer": { + "sha256": [ + "659e1fd284549f70d13fb02c620100e27eeea3420558cce62b0f5d4cf2b77d84" + ] + }, + "usesPermission": [ + { + "name": "android.permission.INTERNET" + }, + { + "name": "android.permission.ACCESS_NETWORK_STATE" + }, + { + "name": "android.permission.ACCESS_WIFI_STATE" + }, + { + "name": "android.permission.CHANGE_WIFI_MULTICAST_STATE" + }, + { + "name": "android.permission.INTERNET" + }, + { + "name": "android.permission.WRITE_EXTERNAL_STORAGE", + "maxSdkVersion": 18 + }, + { + "name": "android.permission.READ_EXTERNAL_STORAGE", + "maxSdkVersion": 18 + } + ], + "usesPermissionSdk23": [ + { + "name": "android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS", + "maxSdkVersion": 27 + }, + { + "name": "android.permission.REQUEST_INSTALL_PACKAGES" + } + ] + } + } + } + }, + "fake.ota.update": { + "metadata": { + "added": 1457568000000, + "categories": [ + "System" + ], + "issueTracker": "https://gitlab.com/fdroid/privileged-extension/issues", + "lastUpdated": 1457568000000, + "license": "Apache-2.0", + "sourceCode": "https://gitlab.com/fdroid/privileged-extension", + "webSite": "https://f-droid.org", + "name": { + "en-US": "fake.ota.update_1234" + }, + "summary": { + "en-US": "Tests whether OTA ZIP files are being include" + }, + "description": { + "en-US": "F-Droid can make use of system privileges or permissions to\ninstall, update and remove applications on its own. The only way to obtain those\nprivileges is to become a system app.\n\nThis is where the Privileged Extension comes in - being a separate app and much\nsmaller, it can be installed as a system app and communicate with the main app\nvia AIDL IPC.\n\nThis has several advantages:\n\n* Reduced disk usage in the system partition\n* System updates don't remove F-Droid\n* The process of installing into system via root is safer\n\nThis is packaged as an OTA (Over-The-Air) update ZIP file. It must be installed\nusing TWRP or other Android recovery that can flash updates to the system from\nthe /data/data/org.fdroid.fdroid folder on the /data partition. The standalone\nAPK is called F-Droid Privileged Extension." + }, + "donate": [ + "https://f-droid.org/about" + ] + }, + "versions": { + "897a92a4ccff4f415f6ba275b2af16d4ecaee60a983b215bddcb9f8964e7a24c": { + "added": 1457568000000, + "file": { + "name": "/fake.ota.update_1234.zip", + "sha256": "897a92a4ccff4f415f6ba275b2af16d4ecaee60a983b215bddcb9f8964e7a24c", + "size": 233 + }, + "manifest": { + "versionName": "897a92a", + "versionCode": 1234 + } + } + } + }, + "info.guardianproject.urzip": { + "metadata": { + "added": 1466640000000, + "categories": [ + "Development", + "GuardianProject", + "1", + "2.0" + ], + "issueTracker": "https://dev.guardianproject.info/projects/urzip/issues", + "lastUpdated": 1466640000000, + "license": "GPL-3.0-only", + "sourceCode": "https://github.com/guardianproject/urzip", + "webSite": "https://dev.guardianproject.info/projects/urzip", + "featureGraphic": { + "en-US": { + "name": "/info.guardianproject.urzip/en-US/featureGraphic_GFRT5BovZsENGpJq1HqPODGWBRPWQsx25B95Ol5w_wU=.png", + "sha256": "185453e41a2f66c10d1a926ad47a8f3831960513d642cc76e41f793a5e70ff05", + "size": 36027 + } + }, + "authorWebSite": "https://guardianproject.info", + "bitcoin": "1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk", + "openCollective": "f-droid-just-testing", + "name": { + "en-US": "title" + }, + "summary": { + "en-US": "一个实用工具,获取已安装在您的设备上的应用的有关信息" + }, + "description": { + "en-US": "It’s Urzip 是一个获得已安装 APK 相关信息的实用工具。它从您的设备上已安装的所有应用开始,一键触摸即可显示 APK 的指纹,并且提供到达 virustotal.com 和 androidobservatory.org 的快捷链接,让您方便地了解特定 APK 的档案。它还可以让您导出签名证书和生成 ApkSignaturePin Pin 文件供 TrustedIntents 库使用。\n\n★ Urzip 支持下列语言: Deutsch, English, español, suomi, 日本語, 한국어, Norsk, português (Portugal), Русский, Slovenščina, Türkçe\n没看到您的语言?帮忙翻译本应用吧:\nhttps://www.transifex.com/projects/p/urzip\n\n★ 致用户:我们还缺少你喜欢的功能?发现了一个 bug?请告诉我们!我们乐于听取您的意见。请发送电子邮件至: support@guardianproject.info 或者加入我们的聊天室 https://guardianproject.info/contact\n" + }, + "video": { + "en-US": "video" + }, + "icon": { + "en-US": { + "name": "/info.guardianproject.urzip/en-US/icon_NJXNzMcyf-v9i5a1ElJi0j9X1LvllibCa48xXYPlOqQ=.png", + "sha256": "3495cdccc7327febfd8b96b5125262d23f57d4bbe59626c26b8f315d83e53aa4", + "size": 1413 + } + }, + "preferredSigner": "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" + }, + "versions": { + "15c0ec72c74a3791f42cdb43c57df0fb11a4dbb656851bbb8cf05b26a8372789": { + "added": 1466640000000, + "file": { + "name": "/urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk", + "sha256": "15c0ec72c74a3791f42cdb43c57df0fb11a4dbb656851bbb8cf05b26a8372789", + "size": 11471, + "ipfsCIDv1": "bafybeig77jwqx243si3gh55iqx4gkcxhltkt6pjimzgigfsk3kshsi6qem" + }, + "manifest": { + "versionName": "0.1", + "versionCode": 100, + "usesSdk": { + "minSdkVersion": 4, + "targetSdkVersion": 18 + }, + "signer": { + "sha256": [ + "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" + ] + } + } + } + } + }, + "info.zwanenburg.caffeinetile": { + "metadata": { + "added": 1539129600000, + "categories": [ + "Development" + ], + "lastUpdated": 1539129600000, + "name": { + "en-US": "Caffeine Tile" + }, + "summary": { + "en-US": "Test app for extracting icons when an XML one is default" + }, + "preferredSigner": "51cfa5c8a743833ad89acf81cb755936876a5c8b8eca54d1ffdcec0cdca25d0e" + }, + "versions": { + "dbbdd7deadb038862f426b71efe4a64df8c3edf25d669e935f349510e16f65db": { + "added": 1539129600000, + "file": { + "name": "/info.zwanenburg.caffeinetile_4.apk", + "sha256": "dbbdd7deadb038862f426b71efe4a64df8c3edf25d669e935f349510e16f65db", + "size": 11740, + "ipfsCIDv1": "bafybeigormhkorw3mk6pkkfk63kkmxpvwylthgj67geulvskc5acr65sym" + }, + "manifest": { + "versionName": "1.3", + "versionCode": 4, + "usesSdk": { + "minSdkVersion": 24, + "targetSdkVersion": 25 + }, + "signer": { + "sha256": [ + "51cfa5c8a743833ad89acf81cb755936876a5c8b8eca54d1ffdcec0cdca25d0e" + ] + }, + "usesPermission": [ + { + "name": "android.permission.WAKE_LOCK" + } + ] + } + } + } + }, + "no.min.target.sdk": { + "metadata": { + "added": 1539129600000, + "categories": [ + "Development" + ], + "lastUpdated": 1539129600000, + "name": { + "en-US": "No minSdkVersion or targetSdkVersion" + }, + "summary": { + "en-US": "An APK without any block in AndroidManifest.xml" + }, + "icon": { + "en-US": { + "name": "/icons/no.min.target.sdk.987.png", + "sha256": "fb0f3bb45312b53e349a762b67af4f48d010a38a245f75c3a0b152097d7b067f", + "size": 1301 + } + }, + "preferredSigner": "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" + }, + "versions": { + "e2e1dc1d550df2b5bc383860139207258645b5540abeccd305ed8b2cb6459d2c": { + "added": 1539129600000, + "file": { + "name": "/no.min.target.sdk_987.apk", + "sha256": "e2e1dc1d550df2b5bc383860139207258645b5540abeccd305ed8b2cb6459d2c", + "size": 14102, + "ipfsCIDv1": "bafybeidwxseoagnew3gtlasttqovl7ciuwxaud5a5p4a5pzpbrfcfj2gaa" + }, + "manifest": { + "versionName": "1.2-fake", + "versionCode": 987, + "usesSdk": { + "minSdkVersion": 3, + "targetSdkVersion": 3 + }, + "signer": { + "sha256": [ + "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" + ] + }, + "usesPermission": [ + { + "name": "android.permission.WRITE_EXTERNAL_STORAGE" + }, + { + "name": "android.permission.READ_PHONE_STATE" + }, + { + "name": "android.permission.READ_EXTERNAL_STORAGE" + } + ] + } + } + } + }, + "obb.main.oldversion": { + "metadata": { + "added": 1388448000000, + "categories": [ + "Development" + ], + "lastUpdated": 1388448000000, + "license": "GPL-3.0-only", + "sourceCode": "https://github.com/eighthave/urzip", + "bitcoin": "1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk", + "liberapay": "12334", + "name": { + "en-US": "OBB Main Old Version" + }, + "icon": { + "en-US": { + "name": "/icons/obb.main.oldversion.1444412523.png", + "sha256": "fb0f3bb45312b53e349a762b67af4f48d010a38a245f75c3a0b152097d7b067f", + "size": 1301 + } + }, + "preferredSigner": "818e469465f96b704e27be2fee4c63ab9f83ddf30e7a34c7371a4728d83b0bc1" + }, + "versions": { + "c5f149e526f89c05c62923bdb7bb1e2be5673c46ec85143f41e514340631449c": { + "added": 1388448000000, + "file": { + "name": "/obb.main.oldversion_1444412523.apk", + "sha256": "c5f149e526f89c05c62923bdb7bb1e2be5673c46ec85143f41e514340631449c", + "size": 14323, + "ipfsCIDv1": "bafybeicnwnpiyfke3tbk3nve62meig65vved34i6kesjkksdciff6242ui" + }, + "obbMainFile": { + "name": "/main.1434483388.obb.main.oldversion.obb", + "sha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", + "size": 6 + }, + "manifest": { + "versionName": "0.1", + "versionCode": 1444412523, + "usesSdk": { + "minSdkVersion": 4, + "targetSdkVersion": 18 + }, + "signer": { + "sha256": [ + "818e469465f96b704e27be2fee4c63ab9f83ddf30e7a34c7371a4728d83b0bc1" + ] + }, + "usesPermission": [ + { + "name": "android.permission.INTERNET" + }, + { + "name": "android.permission.ACCESS_NETWORK_STATE", + "maxSdkVersion": 22 + }, + { + "name": "android.permission.ACCESS_WIFI_STATE" + }, + { + "name": "android.permission.CHANGE_WIFI_MULTICAST_STATE" + }, + { + "name": "android.permission.CHANGE_NETWORK_STATE" + }, + { + "name": "android.permission.CHANGE_WIFI_STATE" + }, + { + "name": "android.permission.BLUETOOTH" + }, + { + "name": "android.permission.BLUETOOTH_ADMIN", + "maxSdkVersion": 18 + }, + { + "name": "android.permission.RECEIVE_BOOT_COMPLETED" + }, + { + "name": "android.permission.NFC" + } + ], + "usesPermissionSdk23": [ + { + "name": "android.permission.WRITE_EXTERNAL_STORAGE" + }, + { + "name": "android.permission.WRITE_SETTINGS", + "maxSdkVersion": 25 + } + ] + }, + "releaseChannels": [ + "Beta" + ] + } + } + }, + "obb.main.twoversions": { + "metadata": { + "added": 1444608000000, + "categories": [ + "Development" + ], + "lastUpdated": 1466380800000, + "license": "GPL-3.0-only", + "sourceCode": "https://github.com/eighthave/urzip", + "bitcoin": "1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk", + "name": { + "en-US": "OBB Main Two Versions" + }, + "icon": { + "en-US": { + "name": "/icons/obb.main.twoversions.1101617.png", + "sha256": "d27c9866adeda6dd466628e43c62ccac95a0e9480c4bb095ac7e0b1c2b58a77d", + "size": 1413 + } + }, + "preferredSigner": "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" + }, + "versions": { + "9bc74566f089ef030ac33e7fbd99d92f1a38f363fb499fed138d9e7b774e821c": { + "added": 1466380800000, + "file": { + "name": "/obb.main.twoversions_1101617.apk", + "sha256": "9bc74566f089ef030ac33e7fbd99d92f1a38f363fb499fed138d9e7b774e821c", + "size": 11481, + "ipfsCIDv1": "bafybeiblpfmwololxgsrum337rbbbsqg2gk6hytvt6szf4njubosju3bme" + }, + "src": { + "name": "/obb.main.twoversions_1101617_src.tar.gz", + "sha256": "3115241ed53aa047191f64db2c14e609a7dc0a803211f56a9b17e2d027763f9d", + "size": 150 + }, + "obbMainFile": { + "name": "/main.1101615.obb.main.twoversions.obb", + "sha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", + "size": 6 + }, + "manifest": { + "versionName": "0.1", + "versionCode": 1101617, + "usesSdk": { + "minSdkVersion": 4, + "targetSdkVersion": 18 + }, + "signer": { + "sha256": [ + "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" + ] + } + } + }, + "7b0b7b9ba248e15751a16e3a0e01e1e24cbb673686c38422030cb75d5c33f0bb": { + "added": 1451606400000, + "file": { + "name": "/obb.main.twoversions_1101615.apk", + "sha256": "7b0b7b9ba248e15751a16e3a0e01e1e24cbb673686c38422030cb75d5c33f0bb", + "size": 11480, + "ipfsCIDv1": "bafybeigglr3iefb3es4lp2sgfacppk3w2qqtuykjgf4actebpalyizef3q" + }, + "obbMainFile": { + "name": "/main.1101615.obb.main.twoversions.obb", + "sha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", + "size": 6 + }, + "manifest": { + "versionName": "0.1", + "versionCode": 1101615, + "usesSdk": { + "minSdkVersion": 4, + "targetSdkVersion": 18 + }, + "signer": { + "sha256": [ + "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" + ] + } + } + }, + "cce97a52ff18d843185be7f22ecb1a557c36b7a9f8ba07a8be94e328e00b35dc": { + "added": 1444608000000, + "file": { + "name": "/obb.main.twoversions_1101613.apk", + "sha256": "cce97a52ff18d843185be7f22ecb1a557c36b7a9f8ba07a8be94e328e00b35dc", + "size": 11477, + "ipfsCIDv1": "bafybeicocjo4khzp2rkui2ltvrhbksrm373lr3pb43ut7hqgbllfjpv6ti" + }, + "obbMainFile": { + "name": "/main.1101613.obb.main.twoversions.obb", + "sha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", + "size": 6 + }, + "manifest": { + "versionName": "0.1", + "versionCode": 1101613, + "usesSdk": { + "minSdkVersion": 4, + "targetSdkVersion": 18 + }, + "signer": { + "sha256": [ + "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" + ] + } + } + } + } + }, + "obb.mainpatch.current": { + "metadata": { + "added": 1461369600000, + "categories": [ + "Development" + ], + "lastUpdated": 1496275200000, + "license": "GPL-3.0-only", + "sourceCode": "https://github.com/eighthave/urzip", + "featureGraphic": { + "en-US": { + "name": "/obb.mainpatch.current/en-US/featureGraphic_ffhLaojxbGAfu9ROe1MJgK5ux8d0OVc6b65nmvOBaTk=.png", + "sha256": "7df84b6a88f16c601fbbd44e7b530980ae6ec7c77439573a6fae679af3816939", + "size": 24336 + } + }, + "screenshots": { + "phone": { + "en-US": [ + { + "name": "/obb.mainpatch.current/en-US/phoneScreenshots/screenshot-main.png", + "sha256": "719f95f0811e6e6e03e6dbd47553eafe9d8d96b14107e26f2dee3ccdabbdc6bf", + "size": 44990 + } + ] + }, + "sevenInch": { + "en-US": [ + { + "name": "/obb.mainpatch.current/en-US/sevenInchScreenshots/screenshot-tablet-main.png", + "sha256": "460c6ce2e5e3987ae6688f398c9093a07802991e7cdee559a578f201189c6630", + "size": 56049 + } + ] + } + }, + "bitcoin": "1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk", + "name": { + "en-US": "OBB Main/Patch Current" + }, + "icon": { + "en-US": { + "name": "/obb.mainpatch.current/en-US/icon_WI0pkO3LsklrsTAnRr-OQSxkkoMY41lYe2-fAvXLiLg=.png", + "sha256": "588d2990edcbb2496bb1302746bf8e412c64928318e359587b6f9f02f5cb88b8", + "size": 260113 + } + }, + "preferredSigner": "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" + }, + "versions": { + "eda5fc3ecfdac3252717e36bdbc9820865baeef162264af9ba5db7364f0e7a0c": { + "added": 1461369600000, + "file": { + "name": "/obb.mainpatch.current_1619.apk", + "sha256": "eda5fc3ecfdac3252717e36bdbc9820865baeef162264af9ba5db7364f0e7a0c", + "size": 11479, + "ipfsCIDv1": "bafybeievo4e234mllujityvtjgeltauyfbriszoqddzygmimcm4mo3zyqu" + }, + "obbMainFile": { + "name": "/main.1619.obb.mainpatch.current.obb", + "sha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", + "size": 6 + }, + "obbPatchFile": { + "name": "/patch.1619.obb.mainpatch.current.obb", + "sha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", + "size": 6 + }, + "manifest": { + "versionName": "0.1", + "versionCode": 1619, + "usesSdk": { + "minSdkVersion": 4, + "targetSdkVersion": 18 + }, + "signer": { + "sha256": [ + "32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6" + ] + } + } + }, + "42e7d6d2f8254aaf9fe95ba6ecc233ee8c3cd543a3e4f3f9ebe1b638221122fa": { + "added": 1496275200000, + "file": { + "name": "/obb.mainpatch.current_1619_another-release-key.apk", + "sha256": "42e7d6d2f8254aaf9fe95ba6ecc233ee8c3cd543a3e4f3f9ebe1b638221122fa", + "size": 10541, + "ipfsCIDv1": "bafybeiatdbzlxairqzvdowevwuy7nk24rknc55jpip2wb2sq4c3f7mtngm" + }, + "obbMainFile": { + "name": "/main.1619.obb.mainpatch.current.obb", + "sha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", + "size": 6 + }, + "obbPatchFile": { + "name": "/patch.1619.obb.mainpatch.current.obb", + "sha256": "d3eb539a556352f3f47881d71fb0e5777b2f3e9a4251d283c18c67ce996774b7", + "size": 6 + }, + "manifest": { + "versionName": "0.1", + "versionCode": 1619, + "usesSdk": { + "minSdkVersion": 4, + "targetSdkVersion": 18 + }, + "signer": { + "sha256": [ + "ce9e200667f02d96d49891a2e08a3c178870e91853d61bdd33ef5f0b54701aa5" + ] + } + } + } + } + }, + "souch.smsbypass": { + "metadata": { + "added": 1524700800000, + "categories": [ + "Phone & SMS" + ], + "issueTracker": "https://gitlab.com/souch/SMSbypass/issues", + "lastUpdated": 1524700800000, + "license": "GPL-3.0-only", + "sourceCode": "https://gitlab.com/souch/SMSbypass/tree/HEAD", + "webSite": "https://gitlab.com/souch/SMSbypass", + "flattrID": "cad90e036b975ed129a3ce80a0750466", + "name": { + "en-US": "Battery level" + }, + "summary": { + "en-US": "Filter SMS and show them in a fake app" + }, + "description": { + "en-US": "In order to keep away curious eyes, SMS-bypass filters incoming SMS messages\nbefore they reach your inbox. Based on bughunter2.smsfilter.\n\nFeatures:\n\n* Discrete fake app \"Battery level\": Long tap on Battery percentage will show SMS.\n* Filter incoming SMS specified address: redirect the SMS to SMS-bypass messages list; remove SMS arrival sound or vibration; show a discreet notification icon (battery level); vibrate if checked in settings\n* Add contact from contact list\n* Export messages to a text file" + }, + "donate": [ + "http://rodolphe.souchaud.free.fr/donate" + ], + "icon": { + "en-US": { + "name": "/icons/souch.smsbypass.9.png", + "sha256": "8fee034537477fcd40fd33887868786b70258fcf7b9acffaff7436bca8748c8a", + "size": 1558 + } + }, + "preferredSigner": "d3aec784b1fd71549fc22c999789122e3639895db6bd585da5835fbe3db6985c" + }, + "versions": { + "80b0ae68a1189baa3ee6717092e3dbf1a4210165f7f7e5f2f9616bd63a2ec01d": { + "added": 1524700800000, + "file": { + "name": "/souch.smsbypass_9.apk", + "sha256": "80b0ae68a1189baa3ee6717092e3dbf1a4210165f7f7e5f2f9616bd63a2ec01d", + "size": 81295, + "ipfsCIDv1": "bafybeihaccfnt32q2iwfulh2m7jvdivuunlw6t72wa7jfi7igxvqxjqszy" + }, + "manifest": { + "versionName": "0.9", + "versionCode": 9, + "usesSdk": { + "minSdkVersion": 8, + "targetSdkVersion": 18 + }, + "signer": { + "sha256": [ + "d3aec784b1fd71549fc22c999789122e3639895db6bd585da5835fbe3db6985c" + ] + }, + "usesPermission": [ + { + "name": "android.permission.RECEIVE_SMS" + }, + { + "name": "android.permission.SEND_SMS" + }, + { + "name": "android.permission.READ_CONTACTS" + }, + { + "name": "android.permission.WRITE_EXTERNAL_STORAGE" + }, + { + "name": "android.permission.VIBRATE" + }, + { + "name": "android.permission.READ_EXTERNAL_STORAGE" + } + ] + } + } + } + } + } +} \ No newline at end of file diff --git a/tests/repo/index.xml b/tests/repo/index.xml index 31578bb0..85dffe5d 100644 --- a/tests/repo/index.xml +++ b/tests/repo/index.xml @@ -1,6 +1,6 @@ - + This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid. http://foobarfoobarfoobar.onion/fdroid/repo https://foo.bar/fdroid/repo diff --git a/tests/run-tests b/tests/run-tests index 7556f149..810342e2 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -300,9 +300,9 @@ v1timestamp=`$sed -n -e 's,.*"timestamp": \([0-9][0-9][0-9][0-9][0-9][0-9][0-9][ test $v0timestamp -eq $v1timestamp # we can't easily reproduce the timestamps for things, so just hardcode them -$sed -i.tmp -e 's,timestamp="[0-9]*",timestamp="1480431575",' repo/index.xml +$sed -i.tmp -e 's,timestamp="[0-9]*",timestamp="1676634233",' repo/index.xml diff -uw $WORKSPACE/tests/repo/index.xml repo/index.xml -sed -i --expression='s,"timestamp": [0-9]*,"timestamp": 1502845383782,' repo/index-v1.json +sed -i --expression='s,"timestamp": [0-9]*,"timestamp": 1676634233000,' repo/index-v1.json diff -uw $WORKSPACE/tests/repo/index-v1.json repo/index-v1.json diff --git a/tests/signindex.TestCase b/tests/signindex.TestCase index 6e2165cc..1961d0e1 100755 --- a/tests/signindex.TestCase +++ b/tests/signindex.TestCase @@ -18,7 +18,7 @@ print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) -from fdroidserver import apksigcopier, common, signindex, update +from fdroidserver import apksigcopier, common, exception, signindex, update from pathlib import Path from unittest.mock import patch @@ -69,6 +69,68 @@ class SignindexTest(unittest.TestCase): with self.assertRaises(json.decoder.JSONDecodeError, msg='error on bad JSON'): signindex.sign_index(str(self.repodir), 'index-v1.json') + def test_sign_entry(self): + entry = 'repo/entry.json' + v2 = 'repo/index-v2.json' + shutil.copy(self.basedir / entry, entry) + shutil.copy(self.basedir / v2, v2) + signindex.sign_index(self.repodir, 'entry.json') + self.assertTrue((self.repodir / 'entry.jar').exists()) + + def test_sign_entry_corrupt(self): + """sign_index should exit with error if entry.json is bad JSON""" + entry = 'repo/entry.json' + with open(entry, 'w') as fp: + fp.write('{') + with self.assertRaises(json.decoder.JSONDecodeError, msg='error on bad JSON'): + signindex.sign_index(self.repodir, 'entry.json') + self.assertFalse((self.repodir / 'entry.jar').exists()) + + def test_sign_entry_corrupt_leave_entry_jar(self): + """sign_index should not touch existing entry.jar if entry.json is corrupt""" + existing = 'repo/entry.jar' + testvalue = "Don't touch!" + with open(existing, 'w') as fp: + fp.write(testvalue) + with open('repo/entry.json', 'w') as fp: + fp.write('{') + with self.assertRaises(json.decoder.JSONDecodeError, msg='error on bad JSON'): + signindex.sign_index(self.repodir, 'entry.json') + with open(existing) as fp: + self.assertEqual(testvalue, fp.read()) + + def test_sign_corrupt_index_v2_json(self): + """sign_index should exit with error if index-v2.json JSON is corrupt""" + with open('repo/index-v2.json', 'w') as fp: + fp.write('{"key": "not really an index"') + good_entry = { + "timestamp": 1676583021000, + "version": 20002, + "index": { + "name": "/index-v2.json", + "sha256": common.sha256sum('repo/index-v2.json'), + "size": os.path.getsize('repo/index-v2.json'), + "numPackages": 0, + }, + } + with open('repo/entry.json', 'w') as fp: + json.dump(good_entry, fp) + with self.assertRaises(json.decoder.JSONDecodeError, msg='error on bad JSON'): + signindex.sign_index(self.repodir, 'entry.json') + self.assertFalse((self.repodir / 'entry.jar').exists()) + + def test_sign_index_v2_corrupt_sha256(self): + """sign_index should exit with error if SHA-256 of file in entry is wrong""" + entry = 'repo/entry.json' + v2 = 'repo/index-v2.json' + shutil.copy(self.basedir / entry, entry) + shutil.copy(self.basedir / v2, v2) + with open(v2, 'a') as fp: + fp.write(' ') + with self.assertRaises(exception.FDroidException, msg='error on bad SHA-256'): + signindex.sign_index(self.repodir, 'entry.json') + self.assertFalse((self.repodir / 'entry.jar').exists()) + def test_signindex(self): if common.find_apksigner({}) is None: # TODO remove me for buildserver-bullseye self.skipTest('SKIPPING test_signindex, apksigner not installed!') diff --git a/tests/stats/known_apks.txt b/tests/stats/known_apks.txt index d25073a0..ee162b10 100644 --- a/tests/stats/known_apks.txt +++ b/tests/stats/known_apks.txt @@ -1,3 +1,4 @@ +com.example.test.helloworld_1.apk com.example.test.helloworld 2023-02-17 com.politedroid_3.apk com.politedroid 2017-06-23 com.politedroid_4.apk com.politedroid 2017-06-23 com.politedroid_5.apk com.politedroid 2017-06-23 @@ -14,3 +15,4 @@ obb.mainpatch.current_1619.apk obb.mainpatch.current 2016-04-23 obb.mainpatch.current_1619_another-release-key.apk obb.mainpatch.current 2017-06-01 souch.smsbypass_9.apk souch.smsbypass 2018-04-26 urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk info.guardianproject.urzip 2016-06-23 +v1.v2.sig_1020.apk v1.v2.sig 2023-02-17 From f468270aa85f983c6e60fca7e08125a374746788 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 17 Feb 2023 15:02:40 +0100 Subject: [PATCH 1021/2116] support Java 20, which is already in Debian/unstable, closes #1070 --- fdroidserver/common.py | 35 ++++++++++++++++++----------------- tests/common.TestCase | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 1354fd1f..65b19db4 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -197,18 +197,18 @@ def _add_java_paths_to_config(pathlist, thisconfig): j = os.path.basename(d) # the last one found will be the canonical one, so order appropriately for regex in [ - r'^1\.([16-9][0-9]?)\.0\.jdk$', # OSX - r'^jdk1\.([16-9][0-9]?)\.0_[0-9]+.jdk$', # OSX and Oracle tarball - r'^jdk1\.([16-9][0-9]?)\.0_[0-9]+$', # Oracle Windows - r'^jdk([16-9][0-9]?)-openjdk$', # Arch - r'^java-([16-9][0-9]?)-openjdk$', # Arch - r'^java-([16-9][0-9]?)-jdk$', # Arch (oracle) - r'^java-1\.([16-9][0-9]?)\.0-.*$', # RedHat - r'^java-([16-9][0-9]?)-oracle$', # Debian WebUpd8 - r'^jdk-([16-9][0-9]?)-oracle-.*$', # Debian make-jpkg - r'^java-([16-9][0-9]?)-openjdk-[^c][^o][^m].*$', # Debian - r'^oracle-jdk-bin-1\.([17-9][0-9]?).*$', # Gentoo (oracle) - r'^icedtea-bin-([17-9][0-9]?).*$', # Gentoo (openjdk) + r'^1\.([126-9][0-9]?)\.0\.jdk$', # OSX + r'^jdk1\.([126-9][0-9]?)\.0_[0-9]+.jdk$', # OSX and Oracle tarball + r'^jdk1\.([126-9][0-9]?)\.0_[0-9]+$', # Oracle Windows + r'^jdk([126-9][0-9]?)-openjdk$', # Arch + r'^java-([126-9][0-9]?)-openjdk$', # Arch + r'^java-([126-9][0-9]?)-jdk$', # Arch (oracle) + r'^java-1\.([126-9][0-9]?)\.0-.*$', # RedHat + r'^java-([126-9][0-9]?)-oracle$', # Debian WebUpd8 + r'^jdk-([126-9][0-9]?)-oracle-.*$', # Debian make-jpkg + r'^java-([126-9][0-9]?)-openjdk-[^c][^o][^m].*$', # Debian + r'^oracle-jdk-bin-1\.([126-9][0-9]?).*$', # Gentoo (oracle) + r'^icedtea-bin-([126-9][0-9]?).*$', # Gentoo (openjdk) ]: m = re.match(regex, j) if not m: @@ -256,19 +256,20 @@ def fill_config_defaults(thisconfig): if thisconfig['java_paths'] is None: thisconfig['java_paths'] = dict() pathlist = [] - pathlist += glob.glob('/usr/lib/jvm/j*[16-9]*') - pathlist += glob.glob('/usr/java/jdk1.[16-9]*') - pathlist += glob.glob('/System/Library/Java/JavaVirtualMachines/1.[16-9][0-9]?.0.jdk') + pathlist += glob.glob('/usr/lib/jvm/j*[126-9]*') + pathlist += glob.glob('/usr/java/jdk1.[126-9]*') + pathlist += glob.glob('/System/Library/Java/JavaVirtualMachines/1.[126-9][0-9]?.0.jdk') pathlist += glob.glob('/Library/Java/JavaVirtualMachines/*jdk*[0-9]*') pathlist += glob.glob('/opt/oracle-jdk-*1.[0-9]*') pathlist += glob.glob('/opt/icedtea-*[0-9]*') if os.getenv('JAVA_HOME') is not None: pathlist.append(os.getenv('JAVA_HOME')) if os.getenv('PROGRAMFILES') is not None: - pathlist += glob.glob(os.path.join(os.getenv('PROGRAMFILES'), 'Java', 'jdk1.[16-9][0-9]?.*')) + pathlist += glob.glob(os.path.join(os.getenv('PROGRAMFILES'), 'Java', 'jdk1.[126-9][0-9]?.*')) _add_java_paths_to_config(pathlist, thisconfig) - for java_version in ('14', '13', '12', '11', '10', '9', '8', '7'): + for java_version in range(29, 6, -1): + java_version = str(java_version) if java_version not in thisconfig['java_paths']: continue java_home = thisconfig['java_paths'][java_version] diff --git a/tests/common.TestCase b/tests/common.TestCase index 9db6a56f..d2e9adb9 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -2262,6 +2262,24 @@ class CommonTest(unittest.TestCase): {'r10e': r10e, 'r17c': ndk_bundle, 'r21e': r21e}, config['ndk_paths'] ) + @unittest.skipIf(not os.path.isdir('/usr/lib/jvm/default-java'), 'uses Debian path') + def test_fill_config_defaults_java(self): + """Test the auto-detection of Java installed in standard paths""" + config = {'sdk_path': self.tmpdir} + fdroidserver.common.fill_config_defaults(config) + java_paths = [] + # use presence of javac to make sure its JDK not just JRE + for f in glob.glob('/usr/lib/jvm/java-*-openjdk-amd64/bin/javac'): + jdk = os.path.dirname(os.path.dirname(f)) + if not os.path.islink(jdk): + java_paths.append(jdk) + self.assertEqual( + len(java_paths), + len(config['java_paths']) + ) + for f in config['java_paths'].values(): + self.assertTrue(f in java_paths) + def test_vcs_git_latesttags(self): tags = [ "1.1.1", From e243983ff87086d294b111bf552907b704022554 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 15 Feb 2023 16:12:12 +0100 Subject: [PATCH 1022/2116] Cleanup upon failing sign_apk (Closes: #1085) --- fdroidserver/common.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 65b19db4..3d5224ff 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3349,6 +3349,8 @@ def sign_apk(unsigned_path, signed_path, keyalias): 'FDROID_KEY_STORE_PASS': config['keystorepass'], 'FDROID_KEY_PASS': config.get('keypass', "")}) if p.returncode != 0: + if os.path.exists(signed_path): + os.remove(signed_path) raise BuildException(_("Failed to sign application"), p.output) os.remove(unsigned_path) From 58cfce106b6d68dc8ebde7842cf01225f5adfd1b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 17 Feb 2023 16:30:16 +0100 Subject: [PATCH 1023/2116] add test_sign_apk_fail and test_sign_apk_corrupt --- tests/common.TestCase | 46 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/tests/common.TestCase b/tests/common.TestCase index d2e9adb9..485c0b70 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -856,6 +856,52 @@ class CommonTest(unittest.TestCase): self.assertFalse(os.path.isfile(unsigned)) self.assertTrue(fdroidserver.common.verify_apk_signature(signed)) + @unittest.skipIf(os.getuid() == 0, 'This is meaningless when run as root') + def test_sign_apk_fail(self): + config = fdroidserver.common.read_config(fdroidserver.common.options) + if 'apksigner' not in config: + self.skipTest('SKIPPING test_sign_apk_fail, apksigner not installed!') + + config['keyalias'] = 'sova' + config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' + config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' + config['keystore'] = os.path.join(self.basedir, 'keystore.jks') + fdroidserver.common.config = config + fdroidserver.signindex.config = config + + unsigned = os.path.join(self.testdir, 'urzip-release-unsigned.apk') + signed = os.path.join(self.testdir, 'urzip-release.apk') + shutil.copy(os.path.join(self.basedir, 'urzip-release-unsigned.apk'), self.testdir) + + os.chmod(unsigned, 0o000) + with self.assertRaises(fdroidserver.exception.BuildException): + fdroidserver.common.sign_apk(unsigned, signed, config['keyalias']) + os.chmod(unsigned, 0o777) + self.assertTrue(os.path.isfile(unsigned)) + self.assertFalse(os.path.isfile(signed)) + + def test_sign_apk_corrupt(self): + config = fdroidserver.common.read_config(fdroidserver.common.options) + if 'apksigner' not in config: + self.skipTest('SKIPPING test_sign_apk_corrupt, apksigner not installed!') + + config['keyalias'] = 'sova' + config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' + config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' + config['keystore'] = os.path.join(self.basedir, 'keystore.jks') + fdroidserver.common.config = config + fdroidserver.signindex.config = config + + unsigned = os.path.join(self.testdir, 'urzip-release-unsigned.apk') + signed = os.path.join(self.testdir, 'urzip-release.apk') + with open(unsigned, 'w') as fp: + fp.write('this is a corrupt APK') + + with self.assertRaises(fdroidserver.exception.BuildException): + fdroidserver.common.sign_apk(unsigned, signed, config['keyalias']) + self.assertTrue(os.path.isfile(unsigned)) + self.assertFalse(os.path.isfile(signed)) + @unittest.skipUnless( os.path.exists('tests/SystemWebView-repack.apk'), "file too big for sdist" ) From f1f1a873adbdcd77dfca6126220461a3e137c4e8 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sun, 19 Feb 2023 15:48:16 +0100 Subject: [PATCH 1024/2116] gitlab-ci: bump RELEASE_COMMIT_ID to 2.2 beta This avoid having to write a complicated regex for postbuild: --- .gitlab-ci.yml | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 96b9b59b..e20f7ddd 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -41,7 +41,7 @@ metadata_v0: image: registry.gitlab.com/fdroid/fdroidserver:buildserver variables: GIT_DEPTH: 1000 - RELEASE_COMMIT_ID: b987a4af5c770472f7db8958b304b28b1e6624fd # 2.1.1 + RELEASE_COMMIT_ID: 58cfce106b6d68dc8ebde7842cf01225f5adfd1b # 2.2b script: - git fetch https://gitlab.com/fdroid/fdroidserver.git $RELEASE_COMMIT_ID - cd tests @@ -56,16 +56,6 @@ metadata_v0: - git checkout $GITCOMMIT - cd fdroiddata - ../tests/dump_internal_metadata_format.py - - sed -i - -e "s/CurrentVersionCode:.'\([0-9]*\)'/CurrentVersionCode:\1/" - -e "s/ versionCode:.'\([0-9]*\)'/ versionCode:\1/" - -e "s/ timeout:.'\([0-9]*\)'/ timeout:\1/" - -e "/VercodeOperation/s/null/[]/" - -e 's/VercodeOperation:.\([^[]\+\)/VercodeOperation:\n- \1/' - -e '/LiberapayID/d' - -e '/postbuild/d' - -e '/binary:/d' - metadata/dump_*/*.yaml - diff -uw metadata/dump_* .apt-template: &apt-template From 04dc297982c33f17187d4a74927ec906c5015216 Mon Sep 17 00:00:00 2001 From: Izzy Date: Sun, 19 Feb 2023 19:27:50 +0100 Subject: [PATCH 1025/2116] downgrade missing ipfs_cid WARNING to DEBUG --- fdroidserver/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 3d5224ff..ea3f219f 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -292,7 +292,7 @@ def fill_config_defaults(thisconfig): if 'ipfs_cid' not in thisconfig and shutil.which('ipfs_cid'): thisconfig['ipfs_cid'] = shutil.which('ipfs_cid') if not thisconfig.get('ipfs_cid'): - logging.warning(_("ipfs_cid not found, skipping CIDv1 generation")) + logging.debug(_("ipfs_cid not found, skipping CIDv1 generation")) for k in ['ndk_paths', 'java_paths']: d = thisconfig[k] From dad004a7e46e3496684fe2def20934854072109a Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Sun, 19 Feb 2023 20:57:44 +0000 Subject: [PATCH 1026/2116] gradle v8.0.1 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index a0cb3aa6..67cd07f7 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -183,6 +183,7 @@ get_sha() { '7.5.1') echo 'f6b8596b10cce501591e92f229816aa4046424f3b24d771751b06779d58c8ec4' ;; '7.6') echo '7ba68c54029790ab444b39d7e293d3236b2632631fb5f2e012bb28b4ff669e4b' ;; '8.0') echo '4159b938ec734a8388ce03f52aa8f3c7ed0d31f5438622545de4f83a89b79788' ;; + '8.0.1') echo '1b6b558be93f29438d3df94b7dfee02e794b94d9aca4611a92cdb79b6b88e909' ;; *) exit 1 esac } @@ -203,7 +204,7 @@ d_plugin_k=(8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2. d_plugin_v=(8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.0 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.0.1 8.0 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From d67e3d441a07b8b6bb6076e96652afe123fb8958 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Sun, 19 Feb 2023 21:57:23 +0100 Subject: [PATCH 1027/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Turki?= =?UTF-8?q?sh=20(tr)=20by=20O=C4=9Fuz=20Ersen=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (623 of 623 strings) Co-authored-by: Oğuz Ersen Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/tr/ Translation: F-Droid/F-Droid Server --- locale/tr/LC_MESSAGES/fdroidserver.po | 37 +++++++++++++-------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index dd9f7f78..de93d230 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -2,20 +2,21 @@ # Copyright (C) YEAR Free Software Foundation, Inc. # Oğuz Ersen , 2020, 2021, 2022. # Orhan , 2021. +# Oğuz Ersen , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-02-15 22:36+0000\n" -"Last-Translator: Oğuz Ersen \n" +"PO-Revision-Date: 2022-09-08 14:15+0000\n" +"Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -731,9 +732,9 @@ msgid "ERROR: unsupported CI type, patches welcome!" msgstr "HATA: desteklenmeyen CI türü, yama gönderebilirsiniz!" #: ../fdroidserver/nightly.py -#, fuzzy, python-format +#, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "HATA: desteklenmeyen CI türü, yama gönderebilirsiniz!" +msgstr "HATA: desteklenmeyen git ana makinesi \"%s\", yama gönderebilirsiniz!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -772,7 +773,7 @@ msgstr "Depo adresi alınırken hata" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "" +msgstr "Bir kaynak depodan uygulama üst verilerini ayıkla" #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" @@ -1260,7 +1261,7 @@ msgstr "Bozuk serverwebroot satırı:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "" +msgstr "ZIP dosyasında azami özyineleme derinliğine ulaşıldı: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1277,7 +1278,7 @@ msgstr "Ad '%s' yalnızca kendiliğinden bir ad - kaldırın" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" +msgstr "config.yml dosyasında ne \"repo_pubkey\" ne de \"keystorepass\" ayarlandı" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." @@ -1513,7 +1514,7 @@ msgstr "Kolay kopyala yapıştır için gizli değişkeni terminale yaz" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" -msgstr "" +msgstr "ZIP dosyası ile ilgili sorun: %s, hata %s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1685,9 +1686,9 @@ msgid "Scan the source code of a package" msgstr "Bir paketin kaynak kodunu tara" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Scanner found {count} problems in {apk}:" -msgstr "Tarayıcı {appid} içinde {count} sorun buldu:" +msgstr "Tarayıcı {apk} içinde {count} sorun buldu:" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1710,9 +1711,8 @@ msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Bilinen özgür olmayan sınıflar için apkanalyzer ile APK taranıyor." #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with dexdump for known non-free classes." -msgstr "Bilinen özgür olmayan sınıflar için apkanalyzer ile APK taranıyor." +msgstr "Bilinen özgür olmayan sınıflar için dexdump ile APK taranıyor." #: ../fdroidserver/common.py #, python-brace-format @@ -2296,7 +2296,7 @@ msgstr "APPID[:VERCODE] biçiminde applicationId, isteğe bağlı versionCode il #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" -msgstr "" +msgstr "archive_url'nin /archive ile bitmesi gerekiyor" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2317,9 +2317,9 @@ msgid "can not parse scrlib spec (not a string): '{}'" msgstr "scrlib belirtimi ayrıştırılamıyor (bir dizge değil): '{}'" #: /usr/lib/python3.9/argparse.py -#, fuzzy, python-format +#, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "'%s' açılamıyor: %s" +msgstr "'%(filename)s' açılamıyor: %(error)s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2494,9 +2494,8 @@ msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 bir imzaya sahip olmalı, oluşturmak için `fdroid signindex` kullanın!" #: ../fdroidserver/index.py -#, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v1 bir imzaya sahip olmalı, oluşturmak için `fdroid signindex` kullanın!" +msgstr "index-v2 bir imzaya sahip olmalı, oluşturmak için `fdroid signindex` kullanın!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2689,7 +2688,7 @@ msgstr "repo_icon %s yok, yer tutucu oluşturuyor." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" -msgstr "" +msgstr "repo_url'nin /repo ile bitmesi gerekiyor" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." From b769cf787d5f3aad0bc77e6dd74336b4cb006f54 Mon Sep 17 00:00:00 2001 From: Licaon Kter Date: Sun, 19 Feb 2023 21:57:23 +0100 Subject: [PATCH 1028/2116] Translated using Weblate: Romanian (ro) by Licaon Kter Currently translated at 100.0% (623 of 623 strings) Co-authored-by: Licaon Kter Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ro/ Translation: F-Droid/F-Droid Server --- locale/ro/LC_MESSAGES/fdroidserver.po | 38 +++++++++++++-------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index d9966a9e..ef0acac5 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -3,21 +3,21 @@ # Daniel Șerbănescu , 2021. # Christian Eichert , 2021. # Simona Iacob , 2021, 2022. -# Licaon Kter , 2021. +# Licaon Kter , 2021, 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-03-03 02:51+0000\n" -"Last-Translator: Simona Iacob \n" +"PO-Revision-Date: 2022-09-08 14:15+0000\n" +"Last-Translator: Licaon Kter \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n" -"X-Generator: Weblate 4.11.1-dev\n" +"X-Generator: Weblate 4.14.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -735,9 +735,9 @@ msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERROR: tip CI neacceptat, patch-uri binevenite!" #: ../fdroidserver/nightly.py -#, fuzzy, python-format +#, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "ERROR: tip CI neacceptat, patch-uri binevenite!" +msgstr "EROARE: gazdă git neacceptată „%s”, corecții binevenite!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -776,7 +776,7 @@ msgstr "Eroare la obținerea adresei repo" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "" +msgstr "Extrageți metadatele aplicației dintr-un depozit sursă" #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" @@ -1264,7 +1264,7 @@ msgstr "Linie de root a serverului web deformată:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "" +msgstr "A fost atinsă adâncimea maximă de recursivitate în fișierul ZIP: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1281,7 +1281,7 @@ msgstr "Numele \"%s\" este doar un nume auto - eliminați-l" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" +msgstr "Nici \"repo_pubkey\" și nici \"keystorepass\" nu sunt setate în config.yml" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." @@ -1517,7 +1517,7 @@ msgstr "Tipărește variabila secretă în terminal pentru un ușor copy/paste" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" -msgstr "" +msgstr "Problema cu fișierul ZIP: %s, eroare %s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1689,9 +1689,9 @@ msgid "Scan the source code of a package" msgstr "Scanarea codului sursă al unui pachet" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Scanner found {count} problems in {apk}:" -msgstr "Scanerul a găsit {count} probleme în {appid}:" +msgstr "Scannerul a găsit {count} probleme în {apk}:" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1715,9 +1715,8 @@ msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Scanarea APK cu apkanalyzer pentru clasele non-libere cunoscute." #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with dexdump for known non-free classes." -msgstr "Scanarea APK cu apkanalyzer pentru clasele non-libere cunoscute." +msgstr "Scanarea APK cu dexdump pentru clasele cunoscute ca fiind non-libere." #: ../fdroidserver/common.py #, python-brace-format @@ -2301,7 +2300,7 @@ msgstr "applicationId cu versionCode opțional sub forma APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" -msgstr "" +msgstr "archive_url trebuie să se termine cu /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2322,9 +2321,9 @@ msgid "can not parse scrlib spec (not a string): '{}'" msgstr "nu poate analiza specificația scrlib (not a string): '{}'" #: /usr/lib/python3.9/argparse.py -#, fuzzy, python-format +#, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "nu se poate deschide '%s': %s" +msgstr "nu se poate deschide '%(filename)s': %(error)s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2501,9 +2500,8 @@ msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 trebuie să aibă o semnătură, folosiți `fdroid signindex` pentru a o crea!" #: ../fdroidserver/index.py -#, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v1 trebuie să aibă o semnătură, folosiți `fdroid signindex` pentru a o crea!" +msgstr "index-v2 trebuie să aibă o semnătură, folosiți `fdroid signindex` pentru a o crea!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2696,7 +2694,7 @@ msgstr "repo_icon %s nu există, se generează un spațiu rezervat." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" -msgstr "" +msgstr "repo_url trebuie să se termine cu /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." From 09f631a2b780f85bfb1fa6ee6fa235ef8d275c8d Mon Sep 17 00:00:00 2001 From: ssantos Date: Sun, 19 Feb 2023 21:57:25 +0100 Subject: [PATCH 1029/2116] Translated using Weblate: Portuguese (pt) by ssantos Currently translated at 100.0% (623 of 623 strings) Translated using Weblate: Portuguese (Portugal) (pt_PT) by ssantos Currently translated at 100.0% (623 of 623 strings) Translated using Weblate: Portuguese (Portugal) (pt_PT) by ssantos Currently translated at 99.8% (622 of 623 strings) Translated using Weblate: Portuguese (pt) by ssantos Currently translated at 100.0% (623 of 623 strings) Translated using Weblate: Portuguese (Portugal) (pt_PT) by ssantos Currently translated at 99.8% (622 of 623 strings) Translated using Weblate: Portuguese (Portugal) (pt_PT) by ssantos Currently translated at 99.5% (620 of 623 strings) Translated using Weblate: Portuguese (pt) by ssantos Currently translated at 100.0% (623 of 623 strings) Translated using Weblate: Portuguese (Portugal) (pt_PT) by ssantos Currently translated at 93.5% (583 of 623 strings) Translated using Weblate: Portuguese (pt) by ssantos Currently translated at 99.8% (622 of 623 strings) Co-authored-by: ssantos Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_PT/ Translation: F-Droid/F-Droid Server --- locale/pt/LC_MESSAGES/fdroidserver.po | 42 ++++---- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 129 +++++++++++------------ 2 files changed, 84 insertions(+), 87 deletions(-) diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index fcf60bd9..4c14615a 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -1,6 +1,6 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# ssantos , 2020, 2021, 2022. +# ssantos , 2020, 2021, 2022, 2023. # Peter J. Mello , 2021. # Eduardo Rodrigues , 2021. # SC , 2022. @@ -9,15 +9,15 @@ msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-05-24 20:28+0000\n" -"Last-Translator: SC \n" +"PO-Revision-Date: 2023-02-19 20:57+0000\n" +"Last-Translator: ssantos \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.16-dev\n" #: ../fdroidserver/common.py msgid "" @@ -733,9 +733,9 @@ msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERRO: tipo de CI sem suporte, patches são bem-vindos!" #: ../fdroidserver/nightly.py -#, fuzzy, python-format +#, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "ERRO: tipo de CI sem suporte, patches são bem-vindos!" +msgstr "ERRO: host de git \"%s\" não suportado, patches são bem-vindos!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -774,7 +774,7 @@ msgstr "Erro ao obter o endereço do repo" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "" +msgstr "Extrair metadados de aplicações de um repositório de origem" #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" @@ -959,7 +959,7 @@ msgstr "Git fetch falhou" #: ../fdroidserver/common.py msgid "Git prune failed" -msgstr "Falha na remoção do Git" +msgstr "Git prune falhou" #: ../fdroidserver/common.py msgid "Git remote set-head failed" @@ -1262,7 +1262,7 @@ msgstr "Linha de serverwebroot malformada:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "" +msgstr "Profundidade máxima de recursão no ficheiro ZIP atingida: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1279,7 +1279,7 @@ msgstr "O nome '%s' é apenas o nome automático - remover" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" +msgstr "Nem \"repo_pubkey\" nem \"keystorepass\" definidos em config.yml" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." @@ -1515,7 +1515,7 @@ msgstr "Imprimir a variável secreta para o terminal para copiar/colar fácilmen #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" -msgstr "" +msgstr "Problema com o ficheiro ZIP: %s, erro %s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1687,9 +1687,9 @@ msgid "Scan the source code of a package" msgstr "Analisar o código fonte de um pacote" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Scanner found {count} problems in {apk}:" -msgstr "O scanner encontrou {count} problemas em {appid}:" +msgstr "O scanner encontrou {count} problemas em {apk}:" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1712,9 +1712,8 @@ msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Varrer os APK com apkanalyzer para classes não-livres." #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with dexdump for known non-free classes." -msgstr "Varrer os APK com apkanalyzer para classes não-livres." +msgstr "A verificar o APK com dexdump por classes não-livres conhecidas." #: ../fdroidserver/common.py #, python-brace-format @@ -2298,7 +2297,7 @@ msgstr "applicationId com versionCode opcional na forma APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" -msgstr "" +msgstr "archive_url precisa de terminar com /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2319,15 +2318,15 @@ msgid "can not parse scrlib spec (not a string): '{}'" msgstr "não é possível analisar as especificações do scrlib (não é uma cadeia): '{}'" #: /usr/lib/python3.9/argparse.py -#, fuzzy, python-format +#, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "não dá pra abrir '%s': %s" +msgstr "não é possível abrir '%(filename)s': %(error)s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py #, python-format msgid "can't open '%s': %s" -msgstr "não dá pra abrir '%s': %s" +msgstr "não é possível abrir '%s': %s" #: ../fdroidserver/build.py #, python-brace-format @@ -2496,9 +2495,8 @@ msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 deve ter uma assinatura, use ' fdroid signindex ' para criá-lo!" #: ../fdroidserver/index.py -#, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v1 deve ter uma assinatura, use ' fdroid signindex ' para criá-lo!" +msgstr "index-v2 deve ter uma assinatura, use droid signindex` para o criar!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2691,7 +2689,7 @@ msgstr "repo_icon %s não existe, a gerar um espaço reservado." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" -msgstr "" +msgstr "repo_url precisa de terminar com /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index ef2ebf00..ec67fbc4 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -2,7 +2,7 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Manuela Silva , 2020. -# ssantos , 2020, 2021. +# ssantos , 2020, 2021, 2022, 2023. # Hans-Christoph Steiner , 2020, 2022. # Peter J. Mello , 2021. msgid "" @@ -10,15 +10,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-09-06 14:30+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2023-02-05 17:10+0000\n" +"Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" "Language: pt_PT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" #: ../fdroidserver/common.py msgid "" @@ -67,9 +67,9 @@ msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" não tem ficheiro de metadados correspondente!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "O diretório raiz para local_copy_dir \"{path}\" não existe!" +msgstr "O diretório raiz para \"local_copy_dir\" {path} não existe!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" @@ -108,7 +108,7 @@ msgstr "\"{path}\" não é um formato aceito, converter para: {formats}" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "" +msgstr "\"{path}\" é assinado por uma chave que não é permitida:" #: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format @@ -333,9 +333,9 @@ msgid "Android SDK tool {cmd} found!" msgstr "Ferramenta {cmd} do Android SDK foi encontrada!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "Ferramenta {cmd} do Android SDK foi encontrada!" +msgstr "A ferramenta SDK do Android {cmd} não foi encontrada!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -415,7 +415,7 @@ msgstr "Repo construído baseado em \"%s\" com esta configuração:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "Não é possível atualizar a app automaticamente sem CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -531,9 +531,8 @@ msgid "Couldn't find Application ID" msgstr "Não foi possível encontrar o ID da aplicação" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "Couldn't find any version information" -msgstr "Não foi possível encontrar o nome da versão mais recente" +msgstr "Não foi encontrada qualquer informação da versão" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py @@ -693,7 +692,7 @@ msgstr "Descarregar os registos que nós não temos" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "A descarregar %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." @@ -735,9 +734,9 @@ msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERRO: tipo de CI sem suporte, patches são bem-vindos!" #: ../fdroidserver/nightly.py -#, fuzzy, python-format +#, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "ERRO: tipo de CI sem suporte, patches são bem-vindos!" +msgstr "ERRO: host de git \"%s\" não suportado, patches são bem-vindos!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -776,7 +775,7 @@ msgstr "Erro ao obter o endereço do repo" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "" +msgstr "Extrair metadados de aplicações de um repositório de origem" #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" @@ -826,9 +825,8 @@ msgid "Failed to get APK manifest information" msgstr "Falha ao obter informações de manifesto do APK" #: ../fdroidserver/update.py -#, fuzzy msgid "Failed to get APK signing key fingerprint" -msgstr "Falha ao obter informações de manifesto do APK" +msgstr "Falha ao obter a impressão digital da chave de assinatura do APK" #: ../fdroidserver/install.py #, python-brace-format @@ -961,9 +959,8 @@ msgid "Git fetch failed" msgstr "Git fetch falhou" #: ../fdroidserver/common.py -#, fuzzy msgid "Git prune failed" -msgstr "Git reset falhou" +msgstr "Git prune falhou" #: ../fdroidserver/common.py msgid "Git remote set-head failed" @@ -1042,12 +1039,12 @@ msgstr "Incluir os tarballs de fontes no espelho" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" -msgstr "" +msgstr "Incluindo metadados de %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" -msgstr "" +msgstr "Incluindo metadados de {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1092,12 +1089,12 @@ msgstr "APK inválido" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "AutoUpdateMode inválido: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "" +msgstr "UpdateCheckMode inválido: {mode}" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format @@ -1154,7 +1151,7 @@ msgstr "Nome inválido para o ficheiro publicado: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "Ndk inválido: entrada na compilação: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format @@ -1218,9 +1215,9 @@ msgid "Javascript in HTML src attributes" msgstr "JavaScript em atributos HTML src" #: ../fdroidserver/build.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "A leitura de minSdkVersion falhou: \"{apkfilename}\"" +msgstr "Mantendo a compilação com falha \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" @@ -1244,9 +1241,8 @@ msgid "List files that would be reformatted" msgstr "Listar ficheiros que devem ser reformatados" #: ../fdroidserver/rewritemeta.py -#, fuzzy msgid "List files that would be reformatted (dry run)" -msgstr "Listar ficheiros que devem ser reformatados" +msgstr "Listar ficheiros que devem ser reformatados (execução a seco)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" @@ -1267,7 +1263,7 @@ msgstr "Linha de serverwebroot malformada:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "" +msgstr "Profundidade máxima de recursão no ficheiro ZIP atingida: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1284,16 +1280,16 @@ msgstr "O nome '%s' é apenas o nome automático - remover" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" +msgstr "Nem \"repo_pubkey\" nem \"keystorepass\" definidos em config.yml" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "'config.yml' não encontrado, utilizando as predefinições." #: ../fdroidserver/verify.py -#, fuzzy, python-format +#, python-format msgid "No APK for package: %s" -msgstr "Nenhum pacote desses: %s" +msgstr "Nenhum APK para o pacote: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1335,12 +1331,12 @@ msgstr "Nenhuma informação encontrada." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" -msgstr "" +msgstr "Não foram encontradas marcações correspondentes" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "" +msgstr "Nenhuma versão mínima do SDK encontrada em {0}, a usar a predefinição (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1384,9 +1380,8 @@ msgid "No such versionCode {versionCode} for app {appid}" msgstr "Nenhum versionCode {versionCode} para o app {appid}" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No tags found" -msgstr "Nenhum aparelho anexado encontrado" +msgstr "Nenhuma etiqueta encontrada" #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" @@ -1521,7 +1516,7 @@ msgstr "Imprimir a variável secreta para o terminal para copiar/colar fácilmen #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" -msgstr "" +msgstr "Problema com o ficheiro ZIP: %s, erro %s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1618,7 +1613,7 @@ msgstr "Apagando ficheiros especificados" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "A remover {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -1626,7 +1621,7 @@ msgstr "Renomear todos os ficheiros APKs que não correspondem com package.name_ #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "O modo de atualização repoTrunk só faz sentido em repositórios de git-svn" #: ../fdroidserver/update.py msgid "Report on build data status" @@ -1693,9 +1688,9 @@ msgid "Scan the source code of a package" msgstr "Analisar o código fonte de um pacote" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Scanner found {count} problems in {apk}:" -msgstr "O scanner encontrou {count} problemas em {appid}:" +msgstr "O scanner encontrou {count} problemas em {apk}:" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1714,19 +1709,17 @@ msgstr[0] "Scanner encontrou {} problema" msgstr[1] "Scanner encontrou {} problemas" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with apkanalyzer for known non-free classes." -msgstr "Procure no(s) APK(s) resultante(s) por classes conhecidas não livres." +msgstr "Varrer os APK com apkanalyzer para classes não-livres." #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with dexdump for known non-free classes." -msgstr "Procure no(s) APK(s) resultante(s) por classes conhecidas não livres." +msgstr "A verificar o APK com dexdump por classes não-livres conhecidas." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "" +msgstr "Definir NDK {release} ({version}) para cima" #: ../fdroidserver/common.py msgid "Set clock to that time using:" @@ -1774,7 +1767,7 @@ msgstr "Ignorando '{apkfilename}' com uma assinatura inválida!" #: ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "A ignorar o espelho do GitLab Pages pelo repositório ser muito grande (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format @@ -1843,11 +1836,11 @@ msgstr "O relógio do sistema é mais antigo que a data em {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" +msgstr "O modo de atualização de marcações só funciona atualmente para repositórios git, hg, bzr e git-svn" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" +msgstr "Modo de atualização de marcações usado no git-svn, mas a repo não foi configurada com marcações" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." @@ -1916,6 +1909,13 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" +"Para completar a configuração, adicione os seus APKs ao \"%s\",\n" +"depois execute \"fdroid update -c; fdroid update\". Também pode editar\n" +"\"config.yml\" para definir a URL, nome do repo, e muito mais. Também deve configurar\n" +"uma chave de assinatura (uma chave temporária pode ter sido gerada automaticamente).\n" +"\n" +"Para mais informações: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"e https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -1949,7 +1949,7 @@ msgstr "Etiqueta de licença \"{}\" inesperada! Use somente as etiquetas de lice #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" +msgstr "Alvo symlink inesperado: {link} -> {target}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2077,7 +2077,7 @@ msgstr "O caminho de scanignore não é usado: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "A descompactar para %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -2264,7 +2264,7 @@ msgstr "opção ambígua: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "" +msgstr "apksigner não encontrado! Não é possível assinar ou verificar APKs modernos" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2298,7 +2298,7 @@ msgstr "applicationId com versionCode opcional na forma APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" -msgstr "" +msgstr "archive_url precisa de terminar com /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2319,9 +2319,9 @@ msgid "can not parse scrlib spec (not a string): '{}'" msgstr "não é possível analisar as especificações do scrlib (não é uma cadeia): '{}'" #: /usr/lib/python3.9/argparse.py -#, fuzzy, python-format +#, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "não dá pra abrir '%s': %s" +msgstr "não é possível abrir '%(filename)s': %(error)s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2401,7 +2401,7 @@ msgstr "{path} criado" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "a versão atual é mais nova: velho vercódigo={old}, novo vercódigo={new}" #: ../fdroidserver/update.py #, python-brace-format @@ -2496,9 +2496,8 @@ msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 deve ter uma assinatura, use ' fdroid signindex ' para criá-lo!" #: ../fdroidserver/index.py -#, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v1 deve ter uma assinatura, use ' fdroid signindex ' para criá-lo!" +msgstr "index-v2 deve ter uma assinatura, use droid signindex` para o criar!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2532,7 +2531,7 @@ msgstr "Opção cadeia %(option)r inválida: deve começar com o caractere %(pre #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "a última receita de construção é mais recente: velho vercódigo={old}, novo vercódigo={new}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2691,7 +2690,7 @@ msgstr "repo_icon %s não existe, a gerar um espaço reservado." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" -msgstr "" +msgstr "repo_url precisa de terminar com /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." @@ -2705,7 +2704,7 @@ msgstr "s3cmd sincroniza índices {path} para {url} e exclui" #: ../fdroidserver/scanner.py #, python-format msgid "scanner not cleanly run apkanalyzer: %s" -msgstr "" +msgstr "o scanner não executa corretamente o apkanalyzer: %s" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2855,7 +2854,7 @@ msgstr "{appid} do {path} não é um Nome de Pacote Java válido!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid} tem APKs e ficheiros: {files}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2939,9 +2938,9 @@ msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} mais de 200MB, enviar manualmente: {url}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path}: {error}" -msgstr "Falha ao copiar {path}: {error}" +msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format From 95f1e2957af1938c8f823b8ce3ac2d1e47b43228 Mon Sep 17 00:00:00 2001 From: KissPandur Date: Sun, 19 Feb 2023 21:57:26 +0100 Subject: [PATCH 1030/2116] Translated using Weblate: Hungarian (hu) by KissPandur Currently translated at 62.4% (389 of 623 strings) Co-authored-by: KissPandur Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/hu/ Translation: F-Droid/F-Droid Server --- locale/hu/LC_MESSAGES/fdroidserver.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index 399ae74b..e4160b7f 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -2,20 +2,21 @@ # This file is put in the public domain. # Balázs Meskó , 2020, 2021. # Hans-Christoph Steiner , 2020, 2021, 2022. +# KissPandur , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-09-06 14:30+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2022-10-05 06:16+0000\n" +"Last-Translator: KissPandur \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 4.14.1\n" #: ../fdroidserver/common.py msgid "" @@ -66,7 +67,7 @@ msgstr "A(z) „%s/” nem rendelkezik megfelelő metaadatfájllal." #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "" +msgstr "\"local_copy_dir\" {path} nem létezik!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" @@ -105,7 +106,7 @@ msgstr "A(z) „{path}” nem egy elfogadott formátum, alakítsa át erre: {for #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "" +msgstr "\"{path}\" kulccsal aláírt és így nem engedélyezett:" #: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format From 130cf94940f04af0af4d8f44e9a1554a52046172 Mon Sep 17 00:00:00 2001 From: TopFox Date: Sun, 19 Feb 2023 21:57:26 +0100 Subject: [PATCH 1031/2116] Translated using Weblate: French (fr) by TopFox Currently translated at 98.2% (612 of 623 strings) Co-authored-by: TopFox Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 1480e36a..f505668c 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -32,20 +32,21 @@ # Julien Maulny , 2022. # Translator , 2022. # Ldm Public , 2022. +# TopFox , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-06-26 18:15+0000\n" -"Last-Translator: Ldm Public \n" +"PO-Revision-Date: 2022-10-17 09:54+0000\n" +"Last-Translator: TopFox \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: ../fdroidserver/common.py msgid "" @@ -585,7 +586,7 @@ msgstr "Créer une clé de signature de dépôt dans un gestionnaire de clés" #: ../fdroidserver/update.py msgid "Create skeleton metadata files that are missing" -msgstr "Créer les métadonnées de base manquantes" +msgstr "Créer les fichiers squelettes des métadonnées manquants" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format From bde26db340c0d8ee4ac6df2627249cbdc67281aa Mon Sep 17 00:00:00 2001 From: John Donne Date: Sun, 19 Feb 2023 21:57:26 +0100 Subject: [PATCH 1032/2116] Translated using Weblate: French (fr) by John Donne Currently translated at 97.7% (609 of 623 strings) Translated using Weblate: French (fr) by John Donne Currently translated at 98.0% (611 of 623 strings) Co-authored-by: John Donne Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 644 +++++++++++++++++++------- 1 file changed, 464 insertions(+), 180 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index f505668c..c7f651df 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -33,35 +33,43 @@ # Translator , 2022. # Ldm Public , 2022. # TopFox , 2022. +# John Donne , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-10-17 09:54+0000\n" -"Last-Translator: TopFox \n" -"Language-Team: French \n" +"PO-Revision-Date: 2022-11-01 17:07+0000\n" +"Last-Translator: John Donne \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 4.14.2-dev\n" #: ../fdroidserver/common.py msgid "" "\n" -" This is a repository of apps to be used with FDroid. Applications in this\n" -" repository are either official binaries built by the original application\n" -" developers, or are binaries built from source by f-droid.org using the\n" +" This is a repository of apps to be used with FDroid. Applications in " +"this\n" +" repository are either official binaries built by the original " +"application\n" +" developers, or are binaries built from source by f-droid.org using " +"the\n" " tools on https://gitlab.com/fdroid.\n" " " msgstr "" "\n" -" Ceci est un dépôt d’applications à utiliser avec FDroid. Les applications publiées\n" +" Ceci est un dépôt d’applications à utiliser avec FDroid. Les " +"applications publiées\n" " dans ce dépôt sont soit celles compilées par les développeurs\n" -" de ces applications, soit celles compilées par f-droid.org à partir des\n" -" sources en utilisant les outils disponibles sur https://gitlab.com/fdroid.\n" +" de ces applications, soit celles compilées par f-droid.org à partir " +"des\n" +" sources en utilisant les outils disponibles sur https://gitlab.com/" +"fdroid.\n" " " #: ../fdroidserver/nightly.py @@ -101,7 +109,9 @@ msgstr "Le dossier racine pour « local_copy_dir » {path} n’existe pas !" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "\"repo_pubkey\" doit être présent dans config.yml lors de l'utilisation de --nosign!" +msgstr "" +"\"repo_pubkey\" doit être présent dans config.yml lors de l'utilisation de --" +"nosign!" #: ../fdroidserver/install.py #, python-brace-format @@ -126,7 +136,8 @@ msgstr "\"{path}\" existe mais s3cmd n'est pas installé !" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "Le format du ficher \"{path}\" n'est pas supporté (utiliser : metadata/*.yml)" +msgstr "" +"Le format du ficher \"{path}\" n'est pas supporté (utiliser : metadata/*.yml)" #: ../fdroidserver/metadata.py #, python-brace-format @@ -134,9 +145,9 @@ msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" n'est pas un format accepté, convertir en : {formats}" #: ../fdroidserver/update.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "\"{path}\" est signé avec une clé non autorisée :" +msgstr "\"{path}\" est signé par une clé qui n'est pas autorisée :" #: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format @@ -243,12 +254,18 @@ msgstr "'{apkfilename}' est déjà installé sur '{dev}'." #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{field}' in {linedesc} is obsolete, see docs for current fields:" -msgstr "'{field}' dans {linedesc} est obselète, regarder la documentation pour ces champs :" +msgstr "" +"'{field}' dans {linedesc} est obselète, regarder la documentation pour ces " +"champs :" #: ../fdroidserver/common.py #, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' sera ordonné aléatoirement ! Utilisez des parenthèses () ou des crochets [] si l'ordre est important !" +msgid "" +"'{field}' will be in random order! Use () or [] brackets if order is " +"important!" +msgstr "" +"'{field}' sera ordonné aléatoirement ! Utilisez des parenthèses () ou des " +"crochets [] si l'ordre est important !" #: ../fdroidserver/common.py #, python-brace-format @@ -258,7 +275,9 @@ msgstr "'{path}' n'a pas pu être exécuté !" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" -msgstr "'{value}' n'est pas un(e) {field} valide dans {appid}. Motif regex : {pattern}" +msgstr "" +"'{value}' n'est pas un(e) {field} valide dans {appid}. Motif regex : " +"{pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -272,7 +291,8 @@ msgstr ".__call__() n'est pas défini" #: ../fdroidserver/metadata.py msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." -msgstr ".fdroid.txt n'est pas supporté ! Convertissez en .fdroid.yml ou .fdroid.json." +msgstr "" +".fdroid.txt n'est pas supporté ! Convertissez en .fdroid.yml ou .fdroid.json." #: ../fdroidserver/lint.py msgid "/issues is missing" @@ -296,7 +316,9 @@ msgstr "Ajout d'une clé de signature de dépôt à un dépôt non signé" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" -msgstr "Créer les métadonnées de base manquantes pour les APKs qui n'en sont pas pourvus" +msgstr "" +"Créer les métadonnées de base manquantes pour les APKs qui n'en sont pas " +"pourvus" #: ../fdroidserver/update.py #, python-brace-format @@ -308,8 +330,12 @@ msgid "Alias of the repo signing key in the keystore" msgstr "Alias de la clé de signature du dépôt dans le trousseau" #: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py -msgid "Allows a different revision (or git branch) to be specified for the initial import" -msgstr "Autoriser une version différente (ou branche git) a être spécifiée pour l'import initial" +msgid "" +"Allows a different revision (or git branch) to be specified for the initial " +"import" +msgstr "" +"Autoriser une version différente (ou branche git) a être spécifiée pour " +"l'import initial" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" @@ -317,7 +343,8 @@ msgstr "Faire aussi un miroir de la section d'archive complète" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" -msgstr "Alerter aussi à propos des problèmes de formatage, comme rewritemeta -l" +msgstr "" +"Alerter aussi à propos des problèmes de formatage, comme rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" @@ -392,19 +419,25 @@ msgid "Archiving {apkfilename} with invalid signature!" msgstr "Archivage de {apkfilename} avec une signature invalide !" #: ../fdroidserver/mirror.py -msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" -msgstr "URL de base à mirorer, peut inclure la clef de signature d'index à l'aide de la chaîne de requête : ?fingerprint=" +msgid "" +"Base URL to mirror, can include the index signing key using the query " +"string: ?fingerprint=" +msgstr "" +"URL de base à mirorer, peut inclure la clef de signature d'index à l'aide de " +"la chaîne de requête : ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "Branche « {branch} » utilisée comme commit dans le build « {versionName} »" +msgstr "" +"Branche « {branch} » utilisée comme commit dans le build « {versionName} »" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" -msgstr "La branche « {branch} » est utilisée comme commit dans srclib « {srclib} »" +msgstr "" +"La branche « {branch} » est utilisée comme commit dans srclib « {srclib} »" #: ../fdroidserver/update.py #, python-brace-format @@ -421,11 +454,14 @@ msgstr "Compiler toutes les applications disponibles" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" -msgstr "Build généré par `fdroid import` — supprimer la ligne désactivée une fois prêt" +msgstr "" +"Build généré par `fdroid import` — supprimer la ligne désactivée une fois " +"prêt" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" -msgstr "Le dépôt git des métadonnées de build a des changements non sauvegardés !" +msgstr "" +"Le dépôt git des métadonnées de build a des changements non sauvegardés !" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" @@ -433,8 +469,12 @@ msgstr "Compiler uniquement la dernière version de chaque paquet" #: ../fdroidserver/metadata.py #, python-brace-format -msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" -msgstr "Le build devrait avoir un versionName et un versionCode séparés par des virgules, et non pas \"{value}\", dans {linedesc}" +msgid "" +"Build should have comma-separated versionName and versionCode, not " +"\"{value}\", in {linedesc}" +msgstr "" +"Le build devrait avoir un versionName et un versionCode séparés par des " +"virgules, et non pas \"{value}\", dans {linedesc}" #: ../fdroidserver/init.py #, python-format @@ -443,7 +483,9 @@ msgstr "Dépôt du build basé sur \"%s\" avec cette config :" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "Impossible de mettre à jour l'application automatiquement sans \"CurrentVersionCode\"" +msgstr "" +"Impossible de mettre à jour l'application automatiquement sans " +"\"CurrentVersionCode\"" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -474,7 +516,9 @@ msgstr "Impossible d'utiliser --list et --to en même temps" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" -msgstr "Impossible d'écrire \"{path}\", le format n'est pas accepté. Merci d'utiliser : {formats}" +msgstr "" +"Impossible d'écrire dans \"{path}\", ce n'est pas un format autorisé, " +"utiliser : {formats}" #: ../fdroidserver/lint.py #, python-format @@ -491,17 +535,26 @@ msgstr "Vérifier les mises à jour pour les applications" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Vérification de l'archivage pour {appid} - APKs : {integer}, keepversions : {keep}, archapks : {arch}" +msgid "" +"Checking archiving for {appid} - APKs:{integer}, keepversions:{keep}, " +"archapks:{arch}" +msgstr "" +"Vérification de l'archivage pour {appid} - APKs : {integer}, keepversions : " +"{keep}, archapks : {arch}" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Vérification de l'archivage pour {appid} - APKs : {integer}, keepversions : {keep}, archapks : {arch}" +msgid "" +"Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, " +"archapks:{arch}" +msgstr "" +"Vérification de l'archivage pour {appid} - apks : {integer}, keepversions : " +"{keep}, archapks : {arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" -msgstr "Mise à jour propre - n'utilise pas les caches, traite à nouveau tous les APKs" +msgstr "" +"Mise à jour propre - n'utilise pas les caches, traite à nouveau tous les APKs" #: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." @@ -517,13 +570,19 @@ msgid "Commit changes" msgstr "Sauvegarder les changements (commit)" #: ../fdroidserver/__main__.py -msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." -msgstr "Conflit d'arguments : '--verbose' et '--quiet' ne peuvent être choisis en même temps." +msgid "" +"Conflicting arguments: '--verbose' and '--quiet' can not be specified at the " +"same time." +msgstr "" +"Conflit d'arguments : '--verbose' et '--quiet' ne peuvent être choisis en " +"même temps." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Conflit de fichiers de configuration ! Utilisation de {newfile}, ignorant {oldfile} !" +msgstr "" +"Conflit de fichiers de configuration ! Utilisation de {newfile}, ignorant " +"{oldfile} !" #: ../fdroidserver/common.py #, python-brace-format @@ -578,7 +637,8 @@ msgstr "Impossible de trouver l'ID du paquet" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" -msgstr "Je refuse de remplacer la configuration existante des clés de signature !" +msgstr "" +"Je refuse de remplacer la configuration existante des clés de signature !" #: ../fdroidserver/update.py msgid "Create a repo signing key in a keystore" @@ -627,7 +687,9 @@ msgstr "Création d'un index non signé pour préparer la signature" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "Le code de la version actuel {cv} est moins récent que la dernier build {versionCode}" +msgstr "" +"Le code de la version actuel {cv} est moins récent que la dernier build " +"{versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" @@ -640,12 +702,16 @@ msgstr "Supprimer les APK et/ou OBB sans métadonnées dans le dépôt" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "Suppression de l'archive en cours, le dépôt occupe trop de place ({size} max {limit})" +msgstr "" +"Suppression de l'archive en cours, le dépôt occupe trop de place ({size} max " +"{limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "Suppression de l'historique de git-mirror, car le dépôt occupe trop de place ({size} max {limit})" +msgstr "" +"Suppression de l'historique de git-mirror, car le dépôt occupe trop de place " +"({size} max {limit})" #: ../fdroidserver/update.py #, python-brace-format @@ -664,12 +730,16 @@ msgstr "Ligne dupliquée dans la description" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "La description contient une liste (%s) mais ce n'est ni une liste à puces (*) ni une liste numérotée (#)" +msgstr "" +"La description contient une liste (%s) mais ce n'est ni une liste à puces " +"(*) ni une liste numérotée (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" -msgstr "La longueur de la description {length} dépasser la limite du nombre de caractères autorisés {limit}" +msgstr "" +"La longueur de la description {length} dépasser la limite du nombre de " +"caractères autorisés {limit}" #: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" @@ -701,8 +771,12 @@ msgid "Don't do anything logs-related" msgstr "Ne pas toucher aux journaux d'applications (logs)" #: ../fdroidserver/build.py -msgid "Don't refresh the repository, useful when testing a build with no internet connection" -msgstr "Ne pas rafraîchir le dépôt, utile pour tester un build sans connexion internet" +msgid "" +"Don't refresh the repository, useful when testing a build with no internet " +"connection" +msgstr "" +"Ne pas rafraîchir le dépôt, utile pour tester un build sans connexion " +"internet" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py #: ../fdroidserver/upload.py @@ -724,7 +798,8 @@ msgstr "Téléchargement de %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." -msgstr "Le téléchargement du référentiel a déjà échoué une fois, ne pas réessayer." +msgstr "" +"Le téléchargement du référentiel a déjà échoué une fois, ne pas réessayer." #: ../fdroidserver/verify.py #, python-brace-format @@ -733,8 +808,10 @@ msgstr "Échec lors du téléchargement de {url}. {error}" #: ../fdroidserver/metadata.py #, python-brace-format -msgid "Duplicate build recipe found for versionCode {versionCode} in {linedesc}" -msgstr "Instruction de build dupliquée pour versionCode {versionCode} dans {linedesc}" +msgid "" +"Duplicate build recipe found for versionCode {versionCode} in {linedesc}" +msgstr "" +"Instruction de build dupliquée pour versionCode {versionCode} dans {linedesc}" #: ../fdroidserver/lint.py #, python-brace-format @@ -747,14 +824,16 @@ msgstr "Analyser dynamiquement les APKs après compilation" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "ERREUR : La sous-commande \"server\" a été supprimée, utilisez \"deploy\" !" +msgstr "" +"ERREUR : La sous-commande \"server\" a été supprimée, utilisez \"deploy\" !" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" -"ERREUR : cette commande ne devrait jamais être utilisée pour copier f-droid.org !\n" +"ERREUR : cette commande ne devrait jamais être utilisée pour copier f-droid." +"org !\n" "Une copie de f-droid.org occupe plus de 200GB." #: ../fdroidserver/nightly.py @@ -764,7 +843,8 @@ msgstr "ERREUR : type de CI non supporté, les corrections sont bienvenues !" #: ../fdroidserver/nightly.py #, fuzzy, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "ERREUR : type de CI non supporté, les corrections sont bienvenues !" +msgstr "" +"ERREUR : type de CI \"%s\" non supporté, les corrections sont bienvenues !" #: ../fdroidserver/metadata.py #, python-brace-format @@ -773,8 +853,12 @@ msgstr "Drapeau de construction vide à {linedesc}" #: ../fdroidserver/__main__.py #, python-brace-format -msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "L'encodage est mis sur '{enc}', FDroid peut rencontrer des problèmes d'encodage. Merci de le mettre sur 'UTF-8' pour de meilleurs résultats." +msgid "" +"Encoding is set to '{enc}' fdroid might run into encoding issues. Please set " +"it to 'UTF-8' for best results." +msgstr "" +"L'encodage est mis sur '{enc}', FDroid peut rencontrer des problèmes " +"d'encodage. Merci de le mettre sur 'UTF-8' pour de meilleurs résultats." #: ../fdroidserver/init.py #, python-format @@ -802,8 +886,9 @@ msgid "Error while getting repo address" msgstr "Erreur lors de l'obtention de l'adresse du dépôt" #: ../fdroidserver/__main__.py +#, fuzzy msgid "Extract application metadata from a source repository" -msgstr "" +msgstr "Extraire les métadonnées de l'application depuis un dépôt source" #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" @@ -817,7 +902,8 @@ msgstr "Erreur durant la copie de {path} : {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" -msgstr "Erreur lors de l'extraction des signatures pour '{apkfilename}' : {error}" +msgstr "" +"Erreur lors de l'extraction des signatures pour '{apkfilename}' : {error}" #: ../fdroidserver/update.py #, python-brace-format @@ -846,7 +932,8 @@ msgstr "Impossible d'obtenir les informations de l'APK, suppression {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" -msgstr "Échoument lors de la récupération des informations de l'APK, saut de {path}" +msgstr "" +"Échoument lors de la récupération des informations de l'APK, saut de {path}" #: ../fdroidserver/common.py msgid "Failed to get APK manifest information" @@ -872,7 +959,9 @@ msgstr "Impossible d'optimiser avec zipalign cette application" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" -msgstr "Récupération de l'ID du serveur de construction depuis la VM : {buildserverid}" +msgstr "" +"Récupération de l'ID du serveur de construction depuis la VM : " +"{buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format @@ -897,20 +986,27 @@ msgstr "La méthode de donnation Flattr reviens au flag FlatttrID" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Les informations de dons via Flattr doivent être renseignées dans le champ FlattrID:" +msgstr "" +"Les informations de dons via Flattr doivent être renseignées dans le champ " +"FlattrID:" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Balises HTML interdites" #: ../fdroidserver/build.py -msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." -msgstr "Forcer la construction des application désactiver, et opérateur indépendament au scan des problèmes. Seulement autoriser en mode de test." +msgid "" +"Force build of disabled apps, and carries on regardless of scan problems. " +"Only allowed in test mode." +msgstr "" +"Forcer la construction des application désactiver, et opérateur " +"indépendament au scan des problèmes. Seulement autoriser en mode de test." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" -msgstr "Arrêt forcer de la construction après {0} secondes de délai d'attente !" +msgstr "" +"Arrêt forcer de la construction après {0} secondes de délai d'attente !" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." @@ -919,7 +1015,8 @@ msgstr "Forcer le scan d'applications et versions désactivées." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" -msgstr "« {path} » graphique trouvée sans métadonnées pour l'application « {name} » !" +msgstr "" +"« {path} » graphique trouvée sans métadonnées pour l'application « {name} » !" #: ../fdroidserver/update.py #, python-brace-format @@ -947,7 +1044,8 @@ msgstr "De multiples fichiers de métadonnées ont été trouvés pour {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." -msgstr "Plusieurs certificats de signature ont étés trouvés pour le référentiel." +msgstr "" +"Plusieurs certificats de signature ont étés trouvés pour le référentiel." #: ../fdroidserver/update.py #, python-brace-format @@ -1017,17 +1115,20 @@ msgstr "HTTPS doit être utilisé avec les URL de Subversion !" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "Si un miroir git prend trop de place, permet à l'archive d'être supprimé" +msgstr "" +"Si un miroir git prend trop de place, permet à l'archive d'être supprimé" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "Si ce téléversement échoue, tente de le téléverser manuellement vers {url}" +msgstr "" +"Si ce téléversement échoue, tente de le téléverser manuellement vers {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "Ignore '{field}' dans les métadonnées '{metapath}' parce que c'est déprécié." +msgstr "" +"Ignore '{field}' dans les métadonnées '{metapath}' parce que c'est déprécié." #: ../fdroidserver/update.py #, python-format @@ -1155,12 +1256,16 @@ msgstr "Liste à puces non valide" #: ../fdroidserver/lint.py #, python-format -msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" -msgstr "Balise de licence non valide \"%s\" ! Utilisez uniquement des balises de https ://spdx.org/license-list" +msgid "" +"Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" +msgstr "" +"Balise de licence non valide \"%s\" ! Utilisez uniquement des balises de " +"https ://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "Lien non valide - utilisez [http://foo.bar Link title] ou [http://foo.bar]" +msgstr "" +"Lien non valide - utilisez [http://foo.bar Link title] ou [http://foo.bar]" #: ../fdroidserver/metadata.py #, python-format @@ -1204,7 +1309,8 @@ msgstr "Métadonnée de scrlib invalide : '{file}' ne peut être analysé" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "Métadonnée de scrlib invalide : la clé '{key}' est inconnue dans '{file}'" +msgstr "" +"Métadonnée de scrlib invalide : la clé '{key}' est inconnue dans '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1228,15 +1334,20 @@ msgstr "Fichier Java JAR" #: ../fdroidserver/publish.py ../fdroidserver/update.py #: ../fdroidserver/mirror.py msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "Java JDK introuvable ! Installez dans un emplacement standard ou définissez java_paths !" +msgstr "" +"Java JDK introuvable ! Installez dans un emplacement standard ou définissez " +"java_paths !" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Classe Java compilée" #: ../fdroidserver/signindex.py -msgid "Java jarsigner not found! Install in standard location or set java_paths!" -msgstr "Java jarsigner introuvable ! Installez dans un emplacement standard ou définissez java_paths !" +msgid "" +"Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "" +"Java jarsigner introuvable ! Installez dans un emplacement standard ou " +"définissez java_paths !" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" @@ -1253,8 +1364,11 @@ msgstr "Stockage des clés signée :\t" #: ../fdroidserver/lint.py #, python-brace-format -msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "Le dernier commit utilisé '{commit}' ressemble a une balise, mais le UpdateCheckMode est '{ucm}'" +msgid "" +"Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" +"Le dernier commit utilisé '{commit}' ressemble a une balise, mais le " +"UpdateCheckMode est '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" @@ -1289,9 +1403,9 @@ msgid "Malformed serverwebroot line:" msgstr "serverwebroot malformer en ligne :" #: ../fdroidserver/scanner.py -#, python-format +#, fuzzy, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "" +msgstr "Profondeur maximale de récursivité dans le fichier ZIP atteinte : %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1307,8 +1421,10 @@ msgid "Name '%s' is just the auto name - remove it" msgstr "Le nom '%s' est just un nom générer - retirer le" #: ../fdroidserver/index.py +#, fuzzy msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" +"Ni \"repo_pubkey\", ni \"keystorepass\" ne sont définis dans config.yml" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." @@ -1325,7 +1441,8 @@ msgstr "Aucun SDK Android trouvée !" #: ../fdroidserver/import.py msgid "No android or kivy project could be found. Specify --subdir?" -msgstr "Aucun projet android ou kivy n'a pu être trouver. Spécifiier --subdir ?" +msgstr "" +"Aucun projet android ou kivy n'a pu être trouver. Spécifiier --subdir ?" #: ../fdroidserver/install.py msgid "No attached devices found" @@ -1364,7 +1481,9 @@ msgstr "Aucune étiquette correspondante n’a été trouvée" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "Aucune version minimale du SDK trouvée dans {0}, utilisation de la valeur par défaut (3)." +msgstr "" +"Aucune version minimale du SDK trouvée dans {0}, utilisation de la valeur " +"par défaut (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1376,7 +1495,9 @@ msgstr "Pas besoin de spécifier que l'application est pour Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" -msgstr "Aucune option configurée ! Éditez votre config.yml pour définir au moins l'une d'entre elles :" +msgstr "" +"Aucune option configurée ! Éditez votre config.yml pour définir au moins " +"l'une d'entre elles :" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1436,7 +1557,9 @@ msgstr "Maintenant, définissez-les dans config.yml :" #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" -msgstr "Le fichier OBB a un code de version plus récent ({integer}) que n'importe quel APK :" +msgstr "" +"Le fichier OBB a un code de version plus récent ({integer}) que n'importe " +"quel APK :" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" @@ -1444,11 +1567,14 @@ msgstr "Le nom de fichier OBB doit commencer par «principal». ou \"patch\" : #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" -msgstr "Le nom de paquet d'OBB ne correspond pas à un fichier APK pris en charge :" +msgstr "" +"Le nom de paquet d'OBB ne correspond pas à un fichier APK pris en charge :" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "Machine hors-ligne, la génération du miroir git est sautée jusqu'à `fdroid deploy`" +msgstr "" +"Machine hors-ligne, la génération du miroir git est sautée jusqu'à `fdroid " +"deploy`" #: ../fdroidserver/common.py #, python-brace-format @@ -1462,7 +1588,9 @@ msgstr "Ancien nom obsolète pour fdroid deploy" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" -msgstr "Seuls les formats PNG et JPEG sont pris en charge pour les graphiques, trouvés : {path}" +msgstr "" +"Seuls les formats PNG et JPEG sont pris en charge pour les graphiques, " +"trouvés : {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" @@ -1470,11 +1598,13 @@ msgstr "Afficher uniquement les différences avec le Play Store" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" -msgstr "Traiter uniquement les applications ayant des mises à jour automatiques" +msgstr "" +"Traiter uniquement les applications ayant des mises à jour automatiques" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "Les méthodes de donation OpenCollective vont dans le champ OpenCollective:" +msgstr "" +"Les méthodes de donation OpenCollective vont dans le champ OpenCollective:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -1502,7 +1632,9 @@ msgstr "Licence globale du projet." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "Substitution du nom de version vide dans {apkfilename} des métadonnées : {version}" +msgstr "" +"Substitution du nom de version vide dans {apkfilename} des métadonnées : " +"{version}" #: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format @@ -1520,10 +1652,14 @@ msgstr "Mot de passe requis avec le nom d'utilisateur" #: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." -msgstr "Chemin d'accès au sous-répertoire principal du projet Android, si ce n'est pas dans le répertoire racine." +msgstr "" +"Chemin d'accès au sous-répertoire principal du projet Android, si ce n'est " +"pas dans le répertoire racine." msgid "Path to main android project subdirectory, if not in root." -msgstr "Chemin d'accès au sous-répertoire principal du projet Android, si ce n'est pas dans le répertoire racine." +msgstr "" +"Chemin d'accès au sous-répertoire principal du projet Android, si ce n'est " +"pas dans le répertoire racine." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" @@ -1539,12 +1675,13 @@ msgstr "Chemin vers le keystore pour la clé de signature du dépôt" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" -msgstr "Afficher la variable secrète dans le terminal pour un copier/coller facilité" +msgstr "" +"Afficher la variable secrète dans le terminal pour un copier/coller facilité" #: ../fdroidserver/scanner.py -#, python-format +#, fuzzy, python-format msgid "Problem with ZIP file: %s, error %s" -msgstr "" +msgstr "Problème avec le fichier ZIP : %s, erreur %s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1622,8 +1759,12 @@ msgstr "La lecture de minSdkVersion a échoué : \"{apkfilename}\"" #. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/common.py #, python-brace-format -msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" -msgstr "La lecture de packageName/versionCode/versionName a échoué, APK invalide : '{apkfilename}'" +msgid "" +"Reading packageName/versionCode/versionName failed, APK invalid: " +"'{apkfilename}'" +msgstr "" +"La lecture de packageName/versionCode/versionName a échoué, APK invalide : " +"'{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format @@ -1631,8 +1772,12 @@ msgid "Reading {apkfilename} from cache" msgstr "Lecture de {apkfilename} à partir du cache" #: ../fdroidserver/stats.py -msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." -msgstr "Recalculer les statistiques agrégées - à utiliser quand les modifications faites peuvent invalider les anciennes données en cache." +msgid "" +"Recalculate aggregate stats - use when changes have been made that would " +"invalidate old cached data." +msgstr "" +"Recalculer les statistiques agrégées - à utiliser quand les modifications " +"faites peuvent invalider les anciennes données en cache." #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1645,19 +1790,25 @@ msgstr "Suppression de {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" -msgstr "Renomme les fichiers APK dont le nom ne ressemble pas à nom.paquet_123.apk" +msgstr "" +"Renomme les fichiers APK dont le nom ne ressemble pas à nom.paquet_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "Le mode de mise à jour de RepoTrunk n'a de sens que pour les dépôts git-svn" +msgstr "" +"Le mode de mise à jour de RepoTrunk n'a de sens que pour les dépôts git-svn" #: ../fdroidserver/update.py msgid "Report on build data status" msgstr "Rapport sur l'état des données de construction" #: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Réinitialiser et créer un tout nouveau serveur de construction, même si le serveur existant semble correct." +msgid "" +"Reset and create a brand new build server, even if the existing one appears " +"to be ok." +msgstr "" +"Réinitialiser et créer un tout nouveau serveur de construction, même si le " +"serveur existant semble correct." #: ../fdroidserver/nightly.py #, python-brace-format @@ -1666,7 +1817,9 @@ msgstr "Re-signature de {apkfilename} avec le debug.keystore fournit" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" -msgstr "Redimensionner toutes les icônes excédant la taille maximale en pixels et quitter" +msgstr "" +"Redimensionner toutes les icônes excédant la taille maximale en pixels et " +"quitter" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" @@ -1718,7 +1871,7 @@ msgstr "Scanner le code source d'un paquet" #: ../fdroidserver/scanner.py #, fuzzy, python-brace-format msgid "Scanner found {count} problems in {apk}:" -msgstr "Le scan a détecté {count} problèmes dans {appid} :" +msgstr "Le scan a détecté {count} problèmes dans {apk} :" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1756,7 +1909,9 @@ msgstr "Réglez l'horloge à cette heure à l'aide de :" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "Régler le maximum de versions dans le dépôt avant que les plus anciennes soient archivées" +msgstr "" +"Régler le maximum de versions dans le dépôt avant que les plus anciennes " +"soient archivées" #: ../fdroidserver/build.py #, python-brace-format @@ -1765,7 +1920,9 @@ msgstr "Définition de la limite de fichiers ouverts à {integer}" #: ../fdroid ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" -msgstr "Programmer une compilation de l'application pour le dépôt des versions de test" +msgstr "" +"Programmer une compilation de l'application pour le dépôt des versions de " +"test" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " @@ -1786,7 +1943,9 @@ msgstr "Signer les indexes créés avec update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" -msgstr "Sauter le scan du code source pour des fichiers binaires et d'autres problèmes" +msgstr "" +"Sauter le scan du code source pour des fichiers binaires et d'autres " +"problèmes" #: ../fdroidserver/update.py #, python-brace-format @@ -1796,7 +1955,8 @@ msgstr "Omission de '{apkfilename}' qui a une signature non valide !" #: ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "Ignorer le miroir GitLab Pages car le dépôt est trop volumineux (>%.2fGB) !" +msgstr "" +"Ignorer le miroir GitLab Pages car le dépôt est trop volumineux (>%.2fGB) !" #: ../fdroidserver/update.py #, python-brace-format @@ -1856,7 +2016,8 @@ msgstr "Le résumé '%s' est juste le nom de l'application" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" -msgstr "Le résumé de taille {length} est au-dessus de la limite de {limit} caractères" +msgstr "" +"Le résumé de taille {length} est au-dessus de la limite de {limit} caractères" #: ../fdroidserver/common.py #, python-brace-format @@ -1864,16 +2025,26 @@ msgid "System clock is older than date in {path}!" msgstr "L'horloge système est plus âgée que la date dans {path} !" #: ../fdroidserver/checkupdates.py -msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "Le mode de mise à jour par étiquettes fonctionne seulement pour les dépôts git, hg, bzr et git-svn pour le moment" +msgid "" +"Tags update mode only works for git, hg, bzr and git-svn repositories " +"currently" +msgstr "" +"Le mode de mise à jour par étiquettes fonctionne seulement pour les dépôts " +"git, hg, bzr et git-svn pour le moment" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "Le mode de mise à jour par étiquettes est utilisé dans git-svn, mais le dépôt n'était pas paramétré avec des étiquettes" +msgstr "" +"Le mode de mise à jour par étiquettes est utilisé dans git-svn, mais le " +"dépôt n'était pas paramétré avec des étiquettes" #: ../fdroidserver/build.py -msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." -msgstr "Mode test – mettre la sortie dans le dossier tmp uniquement et toujours compiler, même si la sortie existe déjà." +msgid "" +"Test mode - put output in the tmp directory only, and always build, even if " +"the output already exists." +msgstr "" +"Mode test – mettre la sortie dans le dossier tmp uniquement et toujours " +"compiler, même si la sortie existe déjà." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1916,11 +2087,21 @@ msgstr "Il y a une collision de keyalias - publication interrompue" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." -msgstr "Voici les applications qui ont été archivées à partir du dépôt principal." +msgstr "" +"Voici les applications qui ont été archivées à partir du dépôt principal." #: ../fdroidserver/common.py -msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "Ceci est un dépôt d’applications à utiliser avec FDroid. Les applications publiées dans ce dépôt sont soit les binaires officiels compilés par les développeurs de ces applications, soit celles compilées par f-droid.org à partir des sources en utilisant les outils disponibles sur https://gitlab.com/fdroid." +msgid "" +"This is a repository of apps to be used with F-Droid. Applications in this " +"repository are either official binaries built by the original application " +"developers, or are binaries built from source by the admin of f-droid.org " +"using the tools on https://gitlab.com/fdroid." +msgstr "" +"Ceci est un dépôt d’applications à utiliser avec FDroid. Les applications " +"publiées dans ce dépôt sont soit les binaires officiels compilés par les " +"développeurs de ces applications, soit celles compilées par f-droid.org à " +"partir des sources en utilisant les outils disponibles sur https://gitlab." +"com/fdroid." #: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-format @@ -1945,12 +2126,17 @@ msgstr "" "Vous devriez aussi paramétrer une clé de signature\n" "(une clé temporaire peut avoir été générée automatiquement).\n" "\n" -"Plus d'informations sur : https://f-droid.org/fr/docs/Setup_an_F-Droid_App_Repo\n" +"Plus d'informations sur : https://f-droid.org/fr/docs/Setup_an_F-" +"Droid_App_Repo\n" "et https://f-droid.org/fr/docs/Signing_Process." #: ../fdroidserver/deploy.py ../fdroidserver/upload.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Pour utiliser awsbucket, awssecretkey et awsaccesskeyid doivent aussi être configurées dans config.yml !" +msgid "" +"To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config." +"yml!" +msgstr "" +"Pour utiliser awsbucket, awssecretkey et awsaccesskeyid doivent aussi être " +"configurées dans config.yml !" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1970,12 +2156,20 @@ msgid "URL {url} in Description: {error}" msgstr "URL {url} en Description : {error}" #: ../fdroidserver/lint.py -msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "Balise de licence non valide \"{}\" ! Utilisez uniquement des balises approuvées par la FSF ou l'OSI de https://spdx.org/license-list" +msgid "" +"Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from " +"https://spdx.org/license-list" +msgstr "" +"Balise de licence non valide \"{}\" ! Utilisez uniquement des balises " +"approuvées par la FSF ou l'OSI de https://spdx.org/license-list" #: ../fdroidserver/lint.py -msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "Balise de licence non valide \"{}\" ! Utilisez uniquement des balises de licence configurées dans votre fichier de configuration" +msgid "" +"Unexpected license tag \"{}\"! Only use license tags configured in your " +"config file" +msgstr "" +"Balise de licence non valide \"{}\" ! Utilisez uniquement des balises de " +"licence configurées dans votre fichier de configuration" #: ../fdroidserver/common.py #, python-brace-format @@ -2023,7 +2217,8 @@ msgstr "Version inconnue de aapt, peut causer des problèmes : " #: ../fdroidserver/lint.py msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "Lien non lié — utiliser [http://foo.bar Titre du lien] ou [http://foo.bar]" +msgstr "" +"Lien non lié — utiliser [http://foo.bar Titre du lien] ou [http://foo.bar]" #: ../fdroidserver/lint.py msgid "Unnecessary leading space" @@ -2055,7 +2250,8 @@ msgstr "Champ non reconnu '{field}' dans {linedesc}" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" -msgstr "Type de fichier non pris en charge \"{extension}\" pour graphique de dépôt" +msgstr "" +"Type de fichier non pris en charge \"{extension}\" pour graphique de dépôt" #: ../fdroidserver/update.py #, python-brace-format @@ -2116,7 +2312,8 @@ msgstr "Mettre à jour les données des dépôts pour les nouveaux paquets" #: ../fdroid ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" -msgstr "Mettre à jour le rapport de transparence des fichiers binaires pour une URL" +msgstr "" +"Mettre à jour le rapport de transparence des fichiers binaires pour une URL" #: ../fdroid ../fdroidserver/__main__.py msgid "Update the stats of the repo" @@ -2142,17 +2339,24 @@ msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData URL non valide : {url}" #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" -msgstr "UpdateCheckMode est configuré mais on dirait que checkupdates n'a pas encore été lancé" +msgid "" +"UpdateCheckMode is set but it looks like checkupdates hasn't been run yet" +msgstr "" +"UpdateCheckMode est configuré mais on dirait que checkupdates n'a pas encore " +"été lancé" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID - it can be removed" -msgstr "UpdateCheckName est défini sur l'ID d’application connu - il peut être supprimé" +msgstr "" +"UpdateCheckName est défini sur l'ID d’application connu - il peut être " +"supprimé" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "UpdateCheckName est défini sur l’ID d’application connu, il peut être supprimé" +msgstr "" +"UpdateCheckName est défini sur l’ID d’application connu, il peut être " +"supprimé" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2177,7 +2381,9 @@ msgstr "Usage : %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Utiliser /HEAD plutôt que /master pour pointer un fichier dans la branche par défaut" +msgstr "" +"Utiliser /HEAD plutôt que /master pour pointer un fichier dans la branche " +"par défaut" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." @@ -2189,7 +2395,9 @@ msgstr "Utiliser le serveur de build" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" -msgstr "Utiliser la date de l'APK plutôt que la date courante pour les APKs nouvellement ajoutés" +msgstr "" +"Utiliser la date de l'APK plutôt que la date courante pour les APKs " +"nouvellement ajoutés" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -2205,8 +2413,11 @@ msgid "Using APK Signature v3" msgstr "Utilisation de la signature d'APK v3" #: ../fdroidserver/common.py -msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" -msgstr "L'utilisation de l'utilitaire jarsigner de Java n'est pas recommandé pour vérifier les APKs ! Utiliser apksigner" +msgid "" +"Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "" +"L'utilisation de l'utilitaire jarsigner de Java n'est pas recommandé pour " +"vérifier les APKs ! Utiliser apksigner" #: ../fdroidserver/common.py #, python-brace-format @@ -2241,20 +2452,32 @@ msgstr "Vérification de la signature d'index :" #: ../fdroidserver/deploy.py #, python-brace-format -msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "L’API de VirusTotal ne permet pas d’envoyer des fichiers plus grands que 32Mo, utilisez {url} pour envoyer {path}." +msgid "" +"VirusTotal API key cannot upload files larger than 32MB, use {url} to upload " +"{path}." +msgstr "" +"L’API de VirusTotal ne permet pas d’envoyer des fichiers plus grands que " +"32Mo, utilisez {url} pour envoyer {path}." #: ../fdroid ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Avertir de possibles erreurs dans les métadonnées" #: ../fdroidserver/update.py -msgid "When configured for signed indexes, create only unsigned indexes at this stage" -msgstr "Lorsqu'il est configuré pour les index signés, ne créez que des index non signés à ce stade" +msgid "" +"When configured for signed indexes, create only unsigned indexes at this " +"stage" +msgstr "" +"Lorsqu'il est configuré pour les index signés, ne créez que des index non " +"signés à ce stade" #: ../fdroidserver/lint.py -msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "Lors du linting, tout le dépôt yamllint est désactivé par défaut. Cette option force yamllint malgré tout." +msgid "" +"When linting the entire repository yamllint is disabled by default. This " +"option forces yamllint regardless." +msgstr "" +"Lors du linting, tout le dépôt yamllint est désactivé par défaut. Cette " +"option force yamllint malgré tout." msgid "X.509 'Distiguished Name' used when generating keys" msgstr "X.509 'Nom distingué' utilisé lors de la génération des clés" @@ -2265,7 +2488,8 @@ msgstr "X.509 'Nom distingué' utilisé lors de la génération des clés" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" -msgstr "Vous pouvez utiliser ANDROID_HOME pour définir le chemin de votre SDK, ex. :" +msgstr "" +"Vous pouvez utiliser ANDROID_HOME pour définir le chemin de votre SDK, ex. :" #: ../fdroidserver/scanner.py msgid "ZIP file archive" @@ -2295,7 +2519,8 @@ msgstr "option ambiguë : %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "apksigner introuvable ! Impossible de signer ou de vérifier les APK modernes" +msgstr "" +"apksigner introuvable ! Impossible de signer ou de vérifier les APK modernes" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2310,7 +2535,8 @@ msgstr "ID d'application du fichier sur lequel agir" #: ../fdroidserver/build.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" -msgstr "ID d'application avec le versionCode optionnel sous la forme APPID[:VERCODE]" +msgstr "" +"ID d'application avec le versionCode optionnel sous la forme APPID[:VERCODE]" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py msgid "applicationId in the form APPID" @@ -2325,11 +2551,13 @@ msgstr "applicationId pour vérifier les mises à jour" #: ../fdroidserver/build.py ../fdroidserver/scanner.py #: ../fdroidserver/install.py msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" -msgstr "applicationId avec le versionCode optionnel sous la forme APPID[:VERCODE]" +msgstr "" +"applicationId avec le versionCode optionnel sous la forme APPID[:VERCODE]" #: ../fdroidserver/common.py +#, fuzzy msgid "archive_url needs to end with /archive" -msgstr "" +msgstr "archive_url doit se terminer par /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2347,12 +2575,14 @@ msgstr "tentative de connexion ssh simple pour tester la clé de déploiement :" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" -msgstr "Impossible de parcourir la spécification de srclib (pas une chaîne de caractères) : '{}'" +msgstr "" +"Impossible de parcourir la spécification de srclib (pas une chaîne de " +"caractères) : '{}'" #: /usr/lib/python3.9/argparse.py #, fuzzy, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "Impossible d'ouvrir %s : %s" +msgstr "Impossible d'ouvrir '%(filename)s' : %(error)s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2378,7 +2608,9 @@ msgstr "impossible de fusionner les actions - deux groupes sont nommés %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" -msgstr "impossible de publier la mise à jour, avez-vous affecté la clé de déploiement ?" +msgstr "" +"impossible de publier la mise à jour, avez-vous affecté la clé de " +"déploiement ?" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2418,11 +2650,14 @@ msgstr "impossible de lire '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "impossible d'analyser la spécification srclib (pas de référence spécifiée) : '{}'" +msgstr "" +"impossible d'analyser la spécification srclib (pas de référence spécifiée) : " +"'{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "impossible d'analyser la spécification srclib (trop de caractères '@') : '{}'" +msgstr "" +"impossible d'analyser la spécification srclib (trop de caractères '@') : '{}'" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2432,7 +2667,9 @@ msgstr "{path} a été créé" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "la version actuelle est plus récente : ancien vercode={old}, nouveau vercode={new}" +msgstr "" +"la version actuelle est plus récente : ancien vercode={old}, nouveau " +"vercode={new}" #: ../fdroidserver/update.py #, python-brace-format @@ -2506,7 +2743,9 @@ msgstr "forcer les erreurs en avertissement, ou les ignorer" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." -msgstr "forcer les erreurs (par défaut) sur les métadonnées à être des avertissements, ou les ignorer." +msgstr "" +"forcer les erreurs (par défaut) sur les métadonnées à être des " +"avertissements, ou les ignorer." #: ../fdroidserver/common.py msgid "git svn clone failed" @@ -2524,12 +2763,16 @@ msgstr "argument explicite %r ignoré" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v1 doit avoir une signature, utilisez `fdroid signindex` pour la créer !" +msgstr "" +"index-v1 doit avoir une signature, utilisez `fdroid signindex` pour la " +"créer !" #: ../fdroidserver/index.py #, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v1 doit avoir une signature, utilisez `fdroid signindex` pour la créer !" +msgstr "" +"index-v1 doit avoir une signature, utilisez `fdroid signindex` pour la " +"créer !" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2557,18 +2800,27 @@ msgstr "valeur de conflict_resolution invalide : %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format -msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" -msgstr "chaîne d’option non valide %(option)r : doit commencer par un caractère %(prefix_chars)r" +msgid "" +"invalid option string %(option)r: must start with a character " +"%(prefix_chars)r" +msgstr "" +"chaîne d’option non valide %(option)r : doit commencer par un caractère " +"%(prefix_chars)r" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "la recette de la dernière version est plus récente : ancien vercode={old}, nouveau vercode={new}" +msgstr "" +"la recette de la dernière version est plus récente : ancien vercode={old}, " +"nouveau vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format -msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" -msgstr "local_copy_dir ne semble pas se terminer avec \"fdroid\", peut être voulez-vous dire : \"{path}\"" +msgid "" +"local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "" +"local_copy_dir ne semble pas se terminer avec \"fdroid\", peut être voulez-" +"vous dire : \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" @@ -2630,7 +2882,9 @@ msgstr "accepte uniquement les chaînes de caractères, listes et tuples" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "option %s : Si vous voulez vraiment installer toutes les applications signées, utilisez --all" +msgstr "" +"option %s : Si vous voulez vraiment installer toutes les applications " +"signées, utilisez --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2702,18 +2956,28 @@ msgstr "le déploiement du journal du processus {path} vers {dest} a echoué !" #: ../fdroidserver/signatures.py #, python-brace-format -msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "refuser le téléchargement via une connexion HTTP non sécurisée (utilisez HTTPS ou précisez --no-https-check) : {apkfilename}" +msgid "" +"refuse downloading via insecure HTTP connection (use HTTPS or specify --no-" +"https-check): {apkfilename}" +msgstr "" +"refuser le téléchargement via une connexion HTTP non sécurisée (utilisez " +"HTTPS ou précisez --no-https-check) : {apkfilename}" #: ../fdroidserver/signatures.py #, python-brace-format -msgid "refuse downloading via insecure http connection (use https or specify --no-https-check): {apkfilename}" -msgstr "refuser de télécharger via une connexion http non sécurisée (utiliser https ou préciser --no-https-check) : {apkfilename}" +msgid "" +"refuse downloading via insecure http connection (use https or specify --no-" +"https-check): {apkfilename}" +msgstr "" +"refuser de télécharger via une connexion http non sécurisée (utiliser https " +"ou préciser --no-https-check) : {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "repo_icon \"repo/icons/%s\" n'existe pas, génération d'une icône de substitution." +msgstr "" +"repo_icon \"repo/icons/%s\" n'existe pas, génération d'une icône de " +"substitution." #: ../fdroidserver/index.py #, python-format @@ -2721,8 +2985,9 @@ msgid "repo_icon %s does not exist, generating placeholder." msgstr "Le repo_icon %s n'existe pas, génération d'une icône de remplacement." #: ../fdroidserver/common.py +#, fuzzy msgid "repo_url needs to end with /repo" -msgstr "" +msgstr "repo_url doit se terminer par /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." @@ -2760,11 +3025,15 @@ msgstr "APK signé, soit un chemin de fichier ou une URL HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "passer le déploiement des journaux de compilation complets : le contenu du journal est vide" +msgstr "" +"passer le déploiement des journaux de compilation complets : le contenu du " +"journal est vide" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" -msgstr "passer le déploiement des journaux de compilation complets : non activé dans la configuration" +msgstr "" +"passer le déploiement des journaux de compilation complets : non activé dans " +"la configuration" #: ../fdroidserver/update.py #, python-brace-format @@ -2782,7 +3051,9 @@ msgstr "bibliothèque statique" #: ../fdroidserver/common.py #, python-brace-format msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" -msgstr "valeur d'horodatage donnée '{timestamp}' n'est pas un horodatage au format Unix" +msgstr "" +"valeur d'horodatage donnée '{timestamp}' n'est pas un horodatage au format " +"Unix" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2830,11 +3101,13 @@ msgstr "utilisation de Apache libcloud pour syncronizer avec {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "virustotal.com limite le nombre de requêtes, en attente avant de réessayer..." +msgstr "" +"virustotal.com limite le nombre de requêtes, en attente avant de réessayer..." #: ../fdroidserver/update.py msgid "wiki support is deprecated and will be removed in the next release!" -msgstr "l'assistance wiki est obsolète et sera enlevée dans la prochaine version !" +msgstr "" +"l'assistance wiki est obsolète et sera enlevée dans la prochaine version !" #: ../fdroidserver/publish.py #, python-brace-format @@ -2851,12 +3124,16 @@ msgstr "{apkfilename} ({appid}) ne contient pas de métadonnées !" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} a plusieurs fichiers {name}, on dirait que c'est une faille ou exploitation de la clé maître (Master Key) !" +msgstr "" +"{apkfilename} a plusieurs fichiers {name}, on dirait que c'est une faille ou " +"exploitation de la clé maître (Master Key) !" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " -msgstr "Le fichier AndroidManifest.xml de {apkfilename} possède une date incorrecte : " +msgstr "" +"Le fichier AndroidManifest.xml de {apkfilename} possède une date " +"incorrecte : " #: ../fdroidserver/update.py #, python-brace-format @@ -2897,12 +3174,16 @@ msgstr "{appid} n'a pas de {name}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" -msgstr "{appid} : Bibliothèque externe (extlib) {path} inconnue dans la version '{versionName}'" +msgstr "" +"{appid} : Bibliothèque externe (extlib) {path} inconnue dans la version " +"'{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" -msgstr "{appid} : pas de versions spécifiées, s'exécute à partir de l'état présent du code source" +msgstr "" +"{appid} : pas de versions spécifiées, s'exécute à partir de l'état présent " +"du code source" #: ../fdroidserver/lint.py #, python-brace-format @@ -2937,7 +3218,8 @@ msgstr "{name} \"{path}\" n'existe pas ! Corrigez le dans config.yml." #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "{name} \"{section}/icons/{path}\" n'existe pas ! Vérifiez \"config.yml\"." +msgstr "" +"{name} \"{section}/icons/{path}\" n'existe pas ! Vérifiez \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format @@ -2957,7 +3239,9 @@ msgstr "{path} n’existe pas ! Créez-le en exécutant :" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "{path} a une mauvaise signature de fichier \"{pattern}\", possibilité d'une faille Janus !" +msgstr "" +"{path} a une mauvaise signature de fichier \"{pattern}\", possibilité d'une " +"faille Janus !" #: ../fdroidserver/update.py #, python-brace-format From c64a5c98965be191a3b77f8cd467a17b83212056 Mon Sep 17 00:00:00 2001 From: gwenderer Date: Sun, 19 Feb 2023 21:57:27 +0100 Subject: [PATCH 1033/2116] Translated using Weblate: French (fr) by gwenderer Currently translated at 98.0% (611 of 623 strings) Co-authored-by: gwenderer Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index c7f651df..13e4268b 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -436,8 +436,7 @@ msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" -msgstr "" -"La branche « {branch} » est utilisée comme commit dans srclib « {srclib} »" +msgstr "Branche '{branch}' utilisée comme commit dans srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format From acb6758adb3235b21e56ba1d92ebbe77809035c2 Mon Sep 17 00:00:00 2001 From: Translator Date: Sun, 19 Feb 2023 21:57:27 +0100 Subject: [PATCH 1034/2116] Translated using Weblate: French (fr) by Translator Currently translated at 100.0% (623 of 623 strings) Co-authored-by: Translator Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 71 ++++++++++----------------- 1 file changed, 26 insertions(+), 45 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 13e4268b..f124b31f 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -39,16 +39,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-11-01 17:07+0000\n" -"Last-Translator: John Donne \n" -"Language-Team: French \n" +"PO-Revision-Date: 2022-11-09 21:42+0000\n" +"Last-Translator: Translator \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: ../fdroidserver/common.py msgid "" @@ -145,9 +144,9 @@ msgid "\"{path}\" is not an accepted format, convert to: {formats}" msgstr "\"{path}\" n'est pas un format accepté, convertir en : {formats}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "\"{path}\" est signé par une clé qui n'est pas autorisée :" +msgstr "\"{path}\" est signé par une clé qui n'est pas autorisée :" #: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format @@ -522,7 +521,7 @@ msgstr "" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" -msgstr "Catégorie « %s » invalide" +msgstr "Catégories « %s » invalides" #: ../fdroidserver/lint.py msgid "Categories are not set" @@ -546,14 +545,11 @@ msgstr "" msgid "" "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, " "archapks:{arch}" -msgstr "" -"Vérification de l'archivage pour {appid} - apks : {integer}, keepversions : " -"{keep}, archapks : {arch}" +msgstr "Vérification de l'archivage pour {appid} — apks : {integer}, keepversions : {keep}, archapks : {arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" -msgstr "" -"Mise à jour propre - n'utilise pas les caches, traite à nouveau tous les APKs" +msgstr "Mise à jour propre — n'utilise pas les caches, traite à nouveau tous les APKs" #: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." @@ -840,10 +836,9 @@ msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERREUR : type de CI non supporté, les corrections sont bienvenues !" #: ../fdroidserver/nightly.py -#, fuzzy, python-format +#, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "" -"ERREUR : type de CI \"%s\" non supporté, les corrections sont bienvenues !" +msgstr "ERREUR : hébergeur git « %s » non supporté, les corrections sont les bienvenues !" #: ../fdroidserver/metadata.py #, python-brace-format @@ -885,7 +880,6 @@ msgid "Error while getting repo address" msgstr "Erreur lors de l'obtention de l'adresse du dépôt" #: ../fdroidserver/__main__.py -#, fuzzy msgid "Extract application metadata from a source repository" msgstr "Extraire les métadonnées de l'application depuis un dépôt source" @@ -1263,8 +1257,7 @@ msgstr "" #: ../fdroidserver/lint.py msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "" -"Lien non valide - utilisez [http://foo.bar Link title] ou [http://foo.bar]" +msgstr "Lien non valide — utilisez [http://foo.bar Link title] ou [http://foo.bar]" #: ../fdroidserver/metadata.py #, python-format @@ -1402,7 +1395,7 @@ msgid "Malformed serverwebroot line:" msgstr "serverwebroot malformer en ligne :" #: ../fdroidserver/scanner.py -#, fuzzy, python-format +#, python-format msgid "Max recursion depth in ZIP file reached: %s" msgstr "Profondeur maximale de récursivité dans le fichier ZIP atteinte : %s" @@ -1417,13 +1410,11 @@ msgstr "Répertoire de destination manquant" #: ../fdroidserver/lint.py #, python-format msgid "Name '%s' is just the auto name - remove it" -msgstr "Le nom '%s' est just un nom générer - retirer le" +msgstr "Le nom '%s' est juste un nom généré — supprimez-le" #: ../fdroidserver/index.py -#, fuzzy msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" -"Ni \"repo_pubkey\", ni \"keystorepass\" ne sont définis dans config.yml" +msgstr "Ni « repo_pubkey », ni « keystorepass » ne sont définis dans config.yml" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." @@ -1678,7 +1669,7 @@ msgstr "" "Afficher la variable secrète dans le terminal pour un copier/coller facilité" #: ../fdroidserver/scanner.py -#, fuzzy, python-format +#, python-format msgid "Problem with ZIP file: %s, error %s" msgstr "Problème avec le fichier ZIP : %s, erreur %s" @@ -1774,9 +1765,7 @@ msgstr "Lecture de {apkfilename} à partir du cache" msgid "" "Recalculate aggregate stats - use when changes have been made that would " "invalidate old cached data." -msgstr "" -"Recalculer les statistiques agrégées - à utiliser quand les modifications " -"faites peuvent invalider les anciennes données en cache." +msgstr "Recalculer les statistiques agrégées — à utiliser quand les modifications faites peuvent invalider les anciennes données en cache." #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1861,14 +1850,14 @@ msgstr "Exécution de wget dans {path}" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "Scanne le(s) APK(s) résultants pour des classes non-libres connues." +msgstr "Analyse le(s) APK(s) généré(s) afin de trouver les classes connues comme non libres." #: ../fdroid ../fdroidserver/__main__.py msgid "Scan the source code of a package" msgstr "Scanner le code source d'un paquet" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Scanner found {count} problems in {apk}:" msgstr "Le scan a détecté {count} problèmes dans {apk} :" @@ -1893,9 +1882,8 @@ msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Analyse de l’APK avec apkanalyzer pour les classes non libres connues." #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with dexdump for known non-free classes." -msgstr "Analyse de l’APK avec apkanalyzer pour les classes non libres connues." +msgstr "Analyse de l’APK avec dexdump pour les classes non libres connues." #: ../fdroidserver/common.py #, python-brace-format @@ -2041,9 +2029,7 @@ msgstr "" msgid "" "Test mode - put output in the tmp directory only, and always build, even if " "the output already exists." -msgstr "" -"Mode test – mettre la sortie dans le dossier tmp uniquement et toujours " -"compiler, même si la sortie existe déjà." +msgstr "Mode test — mettre la sortie dans le dossier tmp uniquement et toujours compiler, même si la sortie existe déjà." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -2082,7 +2068,7 @@ msgstr "Le dossier racine pour local_copy_dir \"{path}\" n'existe pas !" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" -msgstr "Il y a une collision de keyalias - publication interrompue" +msgstr "Il y a une collision de keyalias — publication interrompue" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." @@ -2554,7 +2540,6 @@ msgstr "" "applicationId avec le versionCode optionnel sous la forme APPID[:VERCODE]" #: ../fdroidserver/common.py -#, fuzzy msgid "archive_url needs to end with /archive" msgstr "archive_url doit se terminer par /archive" @@ -2579,9 +2564,9 @@ msgstr "" "caractères) : '{}'" #: /usr/lib/python3.9/argparse.py -#, fuzzy, python-format +#, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "Impossible d'ouvrir '%(filename)s' : %(error)s" +msgstr "impossible d'ouvrir « %(filename)s » : %(error)s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2603,7 +2588,7 @@ msgstr "Impossible d'avoir plusieurs arguments du sous-parseur" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" -msgstr "impossible de fusionner les actions - deux groupes sont nommés %r" +msgstr "impossible de fusionner les actions — deux groupes sont nommés %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" @@ -2767,11 +2752,8 @@ msgstr "" "créer !" #: ../fdroidserver/index.py -#, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "" -"index-v1 doit avoir une signature, utilisez `fdroid signindex` pour la " -"créer !" +msgstr "index-v2 doit avoir une signature, utilisez `fdroid signindex` pour la créer !" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2984,7 +2966,6 @@ msgid "repo_icon %s does not exist, generating placeholder." msgstr "Le repo_icon %s n'existe pas, génération d'une icône de remplacement." #: ../fdroidserver/common.py -#, fuzzy msgid "repo_url needs to end with /repo" msgstr "repo_url doit se terminer par /repo" From 386a6190112593ea60d2e0e92b23fb599d68b6d3 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Sun, 19 Feb 2023 21:57:29 +0100 Subject: [PATCH 1035/2116] Translated using Weblate: Albanian (sq) by Besnik Bleta Currently translated at 97.4% (607 of 623 strings) Co-authored-by: Besnik Bleta Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/ Translation: F-Droid/F-Droid Server --- locale/sq/LC_MESSAGES/fdroidserver.po | 229 +++++++++++++------------- 1 file changed, 113 insertions(+), 116 deletions(-) diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index b309cdf2..c9510fa1 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -1,13 +1,13 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# Besnik Bleta , 2020, 2021. +# Besnik Bleta , 2020, 2021, 2022. # Hans-Christoph Steiner , 2020, 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2021-03-22 16:55+0000\n" +"PO-Revision-Date: 2022-12-25 10:51+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" "Language: sq\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.5.2-dev\n" +"X-Generator: Weblate 4.15.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -61,16 +61,16 @@ msgstr "" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" -msgstr "\"%s/\" s’ka kartelë tejtëdhënash me përputhje!" +msgstr "“%s/”\" s’ka kartelë tejtëdhënash me përputhje!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "Drejtoria rrënjë për local_copy_dir \"{path}\" s’ekziston!" +msgstr "“local_copy_dir” {path} s’ekziston!" #: ../fdroidserver/index.py msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -msgstr "\"repo_pubkey\" duhet të jetë i pranishëm te config.yml, kur përdoret --nosign!" +msgstr "“repo_pubkey” duhet të jetë i pranishëm te config.yml, kur përdoret --nosign!" #: ../fdroidserver/install.py #, python-brace-format @@ -80,37 +80,37 @@ msgstr "'{apkfilename}' është tashmë e instaluar në {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" përmban {name} të vjetruar ({version})" +msgstr "“{path}” përmban {name} të vjetruar ({version})" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" -msgstr "\"{path}\" përmban {name} të freskët ({version})" +msgstr "“{path}” përmban {name} të freskët ({version})" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" -msgstr "\"{path}\" ekziston, por s3cmd s’është e instaluar!" +msgstr "“{path}” ekziston, por s3cmd s’është e instaluar!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "\"{path}\" s’është format kartelash i mbuluar (përdorni: metadata/*.yml)" +msgstr "“{path}” s’është format kartelash i mbuluar (përdorni: metadata/*.yml)" #: ../fdroidserver/metadata.py #, python-brace-format msgid "\"{path}\" is not an accepted format, convert to: {formats}" -msgstr "\"{path}\" s’është në një format të pranuar, shndërrojeni në: {formats}" +msgstr "“{path}” s’është në një format të pranuar, shndërrojeni në: {formats}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "\"{path}\" ekziston, por s3cmd s’është e instaluar!" +msgstr "“{path}” është nënshkruar me një kyç që nuk lejohet:" #: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" -msgstr "\"{url}\" s’është URL e vlefshme!" +msgstr "“{url}” s’është URL e vlefshme!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -330,9 +330,9 @@ msgid "Android SDK tool {cmd} found!" msgstr "U gjet {cmd} mjeti SDK-je Android!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "U gjet {cmd} mjeti SDK-je Android!" +msgstr "S’u gjet {cmd} mjeti SDK-je Android!" #. Translators: "build-tools" is the file name of a package from #. Google, it is part of the Android SDK. So it probably shouldn't be @@ -403,16 +403,16 @@ msgstr "Monto vetëm versionin më të ri të çdo pakete" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Build should have comma-separated versionName and versionCode, not \"{value}\", in {linedesc}" -msgstr "Montimi duhet të ketë versionName dhe versionCode ndarë me presje, jo \"{value}\", te {linedesc}" +msgstr "Montimi duhet të ketë versionName dhe versionCode ndarë me presje, jo “{value}”, te {linedesc}" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" -msgstr "Depo montimesh e bazua në \"%s\" me këtë formësim:" +msgstr "Depo montimesh e bazua në “%s” me këtë formësim:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "S’kryhet dot “auto-update app” pa CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -423,7 +423,7 @@ msgstr[1] "S’montohet dot, për shkak të {} gabimeve teksa skanohej" #: ../fdroidserver/vmtools.py #, python-brace-format msgid "Cannot read \"{path}\"!" -msgstr "S’lexohet dot \"${path}\"!" +msgstr "S’lexohet dot “${path}”!" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/metadata.py @@ -434,7 +434,7 @@ msgstr "S’ftillohet dot ID aplikacioni {appid}" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" -msgstr "S’rishkruhet dot \"{path}\"" +msgstr "S’rishkruhet dot “{path}”" #: ../fdroidserver/rewritemeta.py msgid "Cannot use --list and --to at the same time" @@ -443,7 +443,7 @@ msgstr "S’mund të përdoret --list dhe --to në të njëjtën kohë" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" -msgstr "S’shkruhet dot \"{path}\", s’është format i pranuar, përdorni: {formats}" +msgstr "S’shkruhet dot “{path}”, s’është format i pranuar, përdorni: {formats}" #: ../fdroidserver/lint.py #, python-format @@ -520,7 +520,7 @@ msgstr "S’u hap dot kartela APK {path} për analizim : " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" -msgstr "S’u përtyp dot madhësia \"{size}\", lloj i gabuar \"{type}\"" +msgstr "S’u përtyp dot madhësia “{size}”, lloj i gabuar “{type}”" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py @@ -528,9 +528,8 @@ msgid "Couldn't find Application ID" msgstr "S’u gjet dot ID Aplikacione" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "Couldn't find any version information" -msgstr "S’ u gjet dot emër versioni më të ri" +msgstr "S’ u gjet dot ndonjë hollësi versioni" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import.py @@ -561,12 +560,12 @@ msgstr "Krijoni kartela tejtëdhënash skeleton që mungojnë" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Created new container \"{name}\"" -msgstr "U krijua kontejner i ri \"{name}\"" +msgstr "U krijua kontejner i ri “{name}”" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." -msgstr "Po krijohet \"{path}\" për formësim të s3cmd." +msgstr "Po krijohet “{path}” për formësim të s3cmd." #: ../fdroidserver/publish.py msgid "Creating log directory" @@ -652,7 +651,7 @@ msgstr "Mos i vendos kartelat e reja te depoja" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" -msgstr "Mos përfshi \"{path}\" në URL!" +msgstr "Mos përfshi “{path}” në URL!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" @@ -690,7 +689,7 @@ msgstr "Shkarkoni regjistra që s’i kemi" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "Po shkarkohet %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." @@ -717,7 +716,7 @@ msgstr "Skano dinamikisht APK-ra pas montimi" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "GABIM: Nënurdhri \"server\" është hequr, përdorni \"deploy\"!" +msgstr "GABIM: Nënurdhri “server” është hequr, përdorni “deploy”!" #: ../fdroidserver/mirror.py msgid "" @@ -732,9 +731,9 @@ msgid "ERROR: unsupported CI type, patches welcome!" msgstr "GABIM: lloj CI i pambuluar, arnimet janë të mirëpritura!" #: ../fdroidserver/nightly.py -#, fuzzy, python-format +#, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "GABIM: lloj CI i pambuluar, arnimet janë të mirëpritura!" +msgstr "GABIM: strehë git “%s” që nuk mbulohet, arnimet janë të mirëpritura!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -773,7 +772,7 @@ msgstr "Gabim teksa merrej adresë depoje" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "" +msgstr "Përftoji tejtëdhënat e aplikacionit prej një depoje burim" #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" @@ -823,9 +822,8 @@ msgid "Failed to get APK manifest information" msgstr "S’u arrit të merren të dhëna manifesti APK-je" #: ../fdroidserver/update.py -#, fuzzy msgid "Failed to get APK signing key fingerprint" -msgstr "S’u arrit të merren të dhëna manifesti APK-je" +msgstr "S’u arrit të merren shenja gishtash kyçi nënshkrimi APK-je" #: ../fdroidserver/install.py #, python-brace-format @@ -890,12 +888,12 @@ msgstr "Detyro skanim aplikacionesh dhe montimesh të çaktivizuara." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" -msgstr "U gjet grafik \"{path}\" pa tejtëdhëna për aplikacionin \"{name}\"!" +msgstr "U gjet grafik “{path}” pa tejtëdhëna për aplikacionin “{name}”!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" -msgstr "" +msgstr "U gjet kartelë e dëmtuar themeli “{path}” për “{name}”:" #: ../fdroidserver/common.py ../fdroidserver/metadata.py msgid "Found invalid appids in arguments" @@ -958,9 +956,8 @@ msgid "Git fetch failed" msgstr "Veprimi “git fetch” dështoi" #: ../fdroidserver/common.py -#, fuzzy msgid "Git prune failed" -msgstr "Veprimi “git reset” dështoi" +msgstr "Veprimi “git prune” dështoi" #: ../fdroidserver/common.py msgid "Git remote set-head failed" @@ -969,7 +966,7 @@ msgstr "Veprimi “git remote set-head” dështoi" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" -msgstr "Veprimi “git remote set-head” dështoi: \"%s\"" +msgstr "Veprimi “git remote set-head” dështoi: “%s”" #: ../fdroidserver/common.py msgid "Git reset failed" @@ -1039,12 +1036,12 @@ msgstr "Përfshi te pasqyra paketa tarball" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" -msgstr "" +msgstr "Me përfshirje tejtëdhënash nga %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" -msgstr "" +msgstr "Me përfshirje tejtëdhënash nga {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1089,12 +1086,12 @@ msgstr "APK e pavlefshme" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "AutoUpdateMode e Pavlefshme: {mode}" #: ../fdroidserver/checkupdates.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "Emër i pavlefshëm pakete {0}" +msgstr "UpdateCheckMode i pavlefshëm: {mode}" #: ../fdroidserver/lint.py ../fdroidserver/checkupdates.py #, python-brace-format @@ -1128,7 +1125,7 @@ msgstr "Listë me toptha e pavlefshme" #: ../fdroidserver/lint.py #, python-format msgid "Invalid license tag \"%s\"! Use only tags from https://spdx.org/license-list" -msgstr "Etiketë e pavlefshme licence \"%s\"! Përdorni vetëm etiketa nga https://spdx.org/license-list" +msgstr "Etiketë e pavlefshme licence “%s”! Përdorni vetëm etiketa nga https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" @@ -1151,7 +1148,7 @@ msgstr "Emër i pavlefshëm për kartelë të botuar: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "Zë ndk: i pavlefshëm në montim: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format @@ -1181,7 +1178,7 @@ msgstr "Tejtëdhëna srclib të pavlefshme: kyçi panjohur '{key}' te kartela '{ #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid versionCode: \"{versionCode}\" is not an integer!" -msgstr "versionCode i pavlefshëm: \"{versionCode}\" s’është numër i plotë!" +msgstr "versionCode i pavlefshëm: “{versionCode}” s’është numër i plotë!" #: ../fdroidserver/common.py #, python-brace-format @@ -1215,9 +1212,9 @@ msgid "Javascript in HTML src attributes" msgstr "Javascript në atribute src HTML" #: ../fdroidserver/build.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "Leximi i minSdkVersion dështoi: \"{apkfilename}\"" +msgstr "" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" @@ -1241,9 +1238,8 @@ msgid "List files that would be reformatted" msgstr "Paraqit kartela që do të riformatoheshin" #: ../fdroidserver/rewritemeta.py -#, fuzzy msgid "List files that would be reformatted (dry run)" -msgstr "Paraqit kartela që do të riformatoheshin" +msgstr "Paraqit kartela që do të duhej të riformatoheshin (dry run)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" @@ -1281,16 +1277,16 @@ msgstr "Emri '%s' është thjesht emër i automatizuar - hiqeni" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" +msgstr "Te config.yml s’është ujdisur as “repo_pubkey”, as “keystorepass”" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." msgstr "S’u gjet 'config.yml', po përdoren parazgjedhjet." #: ../fdroidserver/verify.py -#, fuzzy, python-format +#, python-format msgid "No APK for package: %s" -msgstr "S’ka paketë të tillë: %s" +msgstr "S’ka APK për paketën: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" @@ -1331,14 +1327,13 @@ msgid "No information found." msgstr "S’u gjetën të dhëna." #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No matching tags found" -msgstr "S’u gjetën të dhëna." +msgstr "S’u gjetën etiketa me përputhje" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "S’u gjet config.yml, po përdoren parazgjedhjet." +msgstr "Te {0} s’u gjet version minimum SDK-je, po përdoret parazgjedhja (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1382,9 +1377,8 @@ msgid "No such versionCode {versionCode} for app {appid}" msgstr "S’ka versionCode {versionCode} për aplikacionin {appid}" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "No tags found" -msgstr "S’u gjetën pajisje të bashkëngjitura" +msgstr "S’u gjetën etiketa" #: ../fdroidserver/verify.py ../fdroidserver/publish.py msgid "No unsigned directory - nothing to do" @@ -1392,7 +1386,7 @@ msgstr "S’ka drejtori të panënshkruar - s’ka ç’bëhet" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" -msgstr "Përkufizim jo i vlefshëm për madhësinë: \"{}\"" +msgstr "Përkufizim jo i vlefshëm për madhësinë: “{}”" #: ../fdroidserver/signindex.py msgid "Nothing to do" @@ -1415,7 +1409,7 @@ msgstr "Kartela OBB ka versionCode({integer}) më të ri se sa cilado APK:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" -msgstr "Emri i kartelës OBB duhet të fillojë me \"main.\" ose \"patch.\":" +msgstr "Emri i kartelës OBB duhet të fillojë me “main.” ose “patch.”:" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" @@ -1482,7 +1476,7 @@ msgstr "Po anashkalohet versionName i zbrazët te {apkfilename} prej tejtëdhën #: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" -msgstr "Paketa \"{appid}\" ekziston tashmë" +msgstr "Paketa “{appid}” ekziston tashmë" #: ../fdroidserver/common.py #, python-brace-format @@ -1519,7 +1513,7 @@ msgstr "Shtype ndryshoren e fshehtë te terminali, për kopjim/ngjitje të kolla #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" -msgstr "" +msgstr "Problem me kartelën ZIP: %s, gabim %s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1591,7 +1585,7 @@ msgstr "Po lexohet '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading minSdkVersion failed: \"{apkfilename}\"" -msgstr "Leximi i minSdkVersion dështoi: \"{apkfilename}\"" +msgstr "Leximi i minSdkVersion dështoi: “{apkfilename}”" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #. https://developer.android.com/guide/topics/manifest/manifest-element.html#vname @@ -1616,7 +1610,7 @@ msgstr "Po hiqen kartelat e treguara" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "Po hiqet {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -1624,7 +1618,7 @@ msgstr "Riemërtoni kartelat APK që nuk përputhen me package.name_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "Mënyra “RepoTrunk” ka kuptim vetën në depo git-svn" #: ../fdroidserver/update.py msgid "Report on build data status" @@ -1691,14 +1685,14 @@ msgid "Scan the source code of a package" msgstr "Skanoni kodin burim të një pakete" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Scanner found {count} problems in {apk}:" -msgstr "Skaneri gjeti {count} probleme te {appid}:" +msgstr "Kontrolli gjeti {count} probleme te {apk}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" -msgstr "Skaneri gjeti {count} probleme te {appid}:" +msgstr "Kontrolli gjeti {count} probleme te {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1708,18 +1702,16 @@ msgstr "Kontrolli gjeti {count} probleme te {appid}:{versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" -msgstr[0] "Skaneri gjeti {} problem" -msgstr[1] "Skaneri gjeti {} probleme" +msgstr[0] "Kontrolli gjeti {} problem" +msgstr[1] "Kontrolli gjeti {} probleme" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with apkanalyzer for known non-free classes." -msgstr "Kontrollo për klasa jo të lira të ditura APK-në(të) e prodhuara." +msgstr "Po kontrollohet APK-ja me apkanalyzer për klasa të ditura jo të lira." #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with dexdump for known non-free classes." -msgstr "Kontrollo për klasa jo të lira të ditura APK-në(të) e prodhuara." +msgstr "Po kontrollohet APK me “dexdump” për klasa të ditura jo të lira." #: ../fdroidserver/common.py #, python-brace-format @@ -1772,7 +1764,7 @@ msgstr "Po anashkalohet '{apkfilename}' me nënshkrim i pavlefshëm!" #: ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "Po anashkalohet pasqyrë GitLab Pages, ngaqë depoja është shumë e madhe (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format @@ -1841,11 +1833,11 @@ msgstr "Ora e sistemit është më herët se sa data në {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" +msgstr "Aktualisht, mënyra “tags update” funksionon vetëm për depo git, hg, bzr dhe git-svn" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" +msgstr "U përdor mënyra “tags update” në git-svn, por depoja s’qe ujdisur me etiketa" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." @@ -1855,7 +1847,7 @@ msgstr "Mënyra testim - hidhe output-in vetëm te drejtoria tmp, dhe monto për #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" -msgstr "Kodi për versionin OBB duhet të vijë pas \"{name}.\":" +msgstr "Kodi për versionin OBB duhet të vijë pas “{name}.”:" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" @@ -1884,7 +1876,7 @@ msgstr "Treguesi i depos s’u verifikua dot." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" -msgstr "Drejtoria rrënjë për local_copy_dir \"{path}\" s’ekziston!" +msgstr "Drejtoria rrënjë për local_copy_dir “{path}” s’ekziston!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" @@ -1914,6 +1906,14 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" +"Që të plotësoni ujdisjen, shtojini APK-të tuaja te “%s”,\n" +"mandej kryeni “fdroid update -c; fdroid update”. Mund të doni edhe\n" +"të përpunoni “config.yml”, për të caktuar URL-në, emrin e depos, etj.\n" +"Duhet të ujdisni edhe një kyç nënshkrimesh (një i tillë i përkohshëm\n" +"mund të jetë prodhuar automatikisht).\n" +"\n" +"Për më tepër hollësi: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"dhe https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -1938,16 +1938,16 @@ msgstr "URL {url} te Përshkrim: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "Etiketë licence \"{}\" e papritur! Përdorni vetëm etiketa të miratuara nga FSF ose OSI, prej https://spdx.org/license-list" +msgstr "Etiketë licence “{}” e papritur! Përdorni vetëm etiketa të miratuara nga FSF ose OSI, prej https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "Etiketë e papritur licence \"{}\"! Përdorni vetëm etiketa licencash të formësuara te kartela e formësimit tuaj" +msgstr "Etiketë e papritur licence “{}”! Përdorni vetëm etiketa licencash të formësuara te kartela e formësimit tuaj" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" +msgstr "Vendmbërritje e papritur lidhjeje simbolike: {link} -> {target}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2022,7 +2022,7 @@ msgstr "Fushë jo e pranuar '{field}' te {linedesc}" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" -msgstr "Lloj i pambuluar kartele \"{extension}\" për grafik depoje" +msgstr "Lloj i pambuluar kartele “{extension}” për grafik depoje" #: ../fdroidserver/update.py #, python-brace-format @@ -2075,7 +2075,7 @@ msgstr "Shteg scanignore i papërdorur: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "Po përftohet te %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -2161,7 +2161,7 @@ msgstr "Për APK-ra të shtuara rishtazi, përdor datë prej APK-je, në vend se #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." -msgstr "Po përdoret \"{path}\" për formësim të s3cmd." +msgstr "Po përdoret “{path}” për formësim të s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -2178,12 +2178,12 @@ msgstr "Po përdoret jarsigner Java, nuk rekomandohet për verifikim APK-sh! Pë #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" -msgstr "Po përdoret androguard prej \"{path}\"" +msgstr "Po përdoret androguard prej “{path}”" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" -msgstr "Po përdoret depo ekzistuese kyçesh \"{path}\"" +msgstr "Po përdoret depo ekzistuese kyçesh “{path}”" #: ../fdroidserver/deploy.py ../fdroidserver/upload.py #, python-brace-format @@ -2261,9 +2261,8 @@ msgid "ambiguous option: %s (%s?)" msgstr "mundësi e dykuptimtë: %s (%s?)" #: ../fdroidserver/common.py -#, fuzzy msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "S’u gjet apksigner, është i domosdoshëm për nënshkrim!" +msgstr "S’u gjet apksigner! S’nënshkruhen ose verifikohen dot APK-ra moderne" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2297,13 +2296,13 @@ msgstr "applicationId me versionCode opsional në formën APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" -msgstr "" +msgstr "archive_url lypset të përfundojë me /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #, python-format msgid "argument \"-\" with mode %r" -msgstr "argument \"-\" me mënyrën %r" +msgstr "argument “-” me mënyrën %r" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" @@ -2318,9 +2317,9 @@ msgid "can not parse scrlib spec (not a string): '{}'" msgstr "s’përtyp dot specifikim scrlib (s’është një varg): '{}'" #: /usr/lib/python3.9/argparse.py -#, fuzzy, python-format +#, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "s’hapet dot '%s': %s" +msgstr "s’hapet dot '%(filename)s': %(error)s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2331,7 +2330,7 @@ msgstr "s’hapet dot '%s': %s" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" -msgstr "s’gjenden dot srclibs të domosdoshme: \"{path}\"" +msgstr "s’gjenden dot srclibs të domosdoshme: “{path}”" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2400,7 +2399,7 @@ msgstr "u krijua {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "versioni i tanishëm është më i ri: kod versioni të vjetër={old}, kod versioni të ri={new}" #: ../fdroidserver/update.py #, python-brace-format @@ -2495,9 +2494,8 @@ msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 duhet të ketë një nënshkrim, përdorni `fdroid signindex` për ta krijuar!" #: ../fdroidserver/index.py -#, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v1 duhet të ketë një nënshkrim, përdorni `fdroid signindex` për ta krijuar!" +msgstr "index-v2 duhet të ketë një nënshkrim, përdorni `fdroid signindex` për ta krijuar!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2531,12 +2529,12 @@ msgstr "varg i pavlefshëm mundësie %(option)r: duhet të fillojë me një shen #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "udhëzimet e fundit për montimin janë më të reja: kod versioni të vjetër={old}, kod versioni të ri={new}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" -msgstr "local_copy_dir does s’mbaron me \"fdroid\", ndoshta kishit në mendje: \"{path}\"" +msgstr "local_copy_dir does s’mbaron me “fdroid”, ndoshta kishit në mendje: “{path}”" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" @@ -2559,7 +2557,7 @@ msgstr "argumentet që përjashtojnë njëri-tjetrin duhet të jenë opsionalë" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" -msgstr "s’ka \"icon\" te {appid}" +msgstr "s’ka “icon” te {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" @@ -2576,9 +2574,8 @@ msgid "no version info found!" msgstr "s’u gjetën të dhëna versioni!" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "no version information found" -msgstr "s’u gjetën të dhëna versioni!" +msgstr "s’u gjetën hollësi versioni" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2682,7 +2679,7 @@ msgstr "mos pranon shkarkim përmes lidhjeje http të pasigurt (përdorni https #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "repo_icon \"repo/icons/%s\" s’ekziston, po prodhohet vendmbajtëse." +msgstr "repo_icon “repo/icons/%s” s’ekziston, po prodhohet vendmbajtëse." #: ../fdroidserver/index.py #, python-format @@ -2691,7 +2688,7 @@ msgstr "repo_icon %s s’ekziston, po prodhohet vendmbajtëse." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" -msgstr "" +msgstr "repo_url lypset të përfundojë me /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." @@ -2855,7 +2852,7 @@ msgstr "{appid} prej {path} s;është Emër i vlefshëm Pakete Java!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid} ka nga të dyja, APK-ra dhe kartela: {files}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2901,12 +2898,12 @@ msgstr "{file} është e zbrazët ose e dëmtuar!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{path}\" does not exist! Correct it in config.yml." -msgstr "{name} \"{path}\" s’ekziston! Ndreqeni te config.yml." +msgstr "{name} “{path}” s’ekziston! Ndreqeni te config.yml." #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "{name} \"{section}/icons/{path}\" s’ekziston! Kontrolloni \"config.yml\"." +msgstr "{name} “{section}/icons/{path}” s’ekziston! Kontrolloni “config.yml”." #: ../fdroidserver/common.py #, python-brace-format @@ -2926,7 +2923,7 @@ msgstr "{path} s’ekziston! Krijojeni duke xhiruar:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "{path} ka \"{pattern}\" të gabuar nënshkrimi kartele, ka gjasa të jetë rreng Janus!" +msgstr "{path} ka “{pattern}” të gabuar nënshkrimi kartele, ka gjasa të jetë rreng Janus!" #: ../fdroidserver/update.py #, python-brace-format @@ -2939,19 +2936,19 @@ msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} më tepër se 200MB, ngarkojeni dorazi: {url}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path}: {error}" -msgstr "S’u arrit të kopjohej {path}: {error}" +msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" -msgstr "{url} s’përfundon me \"fdroid\", kontrolloni shtegun e URL-së!" +msgstr "{url} s’përfundon me “fdroid”, kontrolloni shtegun e URL-së!" #: ../fdroidserver/common.py ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" -msgstr "{url} nuk fillon me \"http\"!" +msgstr "{url} nuk fillon me “http”!" #: ../fdroidserver/build.py msgid "{} build failed" From 7b95ddc8ff06900008cf0b2dfae6c94143891997 Mon Sep 17 00:00:00 2001 From: Deleted User Date: Sun, 19 Feb 2023 21:57:30 +0100 Subject: [PATCH 1036/2116] Translated using Weblate: French (fr) by Deleted User Currently translated at 100.0% (623 of 623 strings) Co-authored-by: Deleted User Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index f124b31f..2e48815c 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -34,20 +34,21 @@ # Ldm Public , 2022. # TopFox , 2022. # John Donne , 2022. +# Deleted User , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-11-09 21:42+0000\n" -"Last-Translator: Translator \n" +"PO-Revision-Date: 2023-01-02 10:50+0000\n" +"Last-Translator: Deleted User \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 4.15.1-dev\n" #: ../fdroidserver/common.py msgid "" @@ -906,7 +907,7 @@ msgstr "Erreur de lecture {path} : {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" -msgstr "Échec au redimensionement de {path} : {error}" +msgstr "Impossible de redimensionner {path} : {error}" #: ../fdroidserver/publish.py msgid "Failed to align application" From 1b8063117ebdf098881d0c741c00c45df1e8a025 Mon Sep 17 00:00:00 2001 From: Ldm Public Date: Sun, 19 Feb 2023 21:57:31 +0100 Subject: [PATCH 1037/2116] Translated using Weblate: French (fr) by Ldm Public Currently translated at 100.0% (623 of 623 strings) Co-authored-by: Ldm Public Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 33 ++++++++++++--------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 2e48815c..dfec3fa5 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -31,7 +31,7 @@ # translator , 2022. # Julien Maulny , 2022. # Translator , 2022. -# Ldm Public , 2022. +# Ldm Public , 2022, 2023. # TopFox , 2022. # John Donne , 2022. # Deleted User , 2023. @@ -41,7 +41,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2023-01-02 10:50+0000\n" -"Last-Translator: Deleted User \n" +"Last-Translator: Ldm Public \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -501,7 +501,7 @@ msgstr "Impossible de lire \"{path}\" !" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Cannot resolve application ID {appid}" -msgstr "Impossible de résoudre l'identifiant de l'application {appid}" +msgstr "Impossible de trouver l'identifiant de l'application {appid}" #: ../fdroidserver/rewritemeta.py #, python-brace-format @@ -820,8 +820,7 @@ msgstr "Analyser dynamiquement les APKs après compilation" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" -"ERREUR : La sous-commande \"server\" a été supprimée, utilisez \"deploy\" !" +msgstr "ERREUR : La sous-commande \"server\" a été supprimée, utilisez plutôt \"deploy\" !" #: ../fdroidserver/mirror.py msgid "" @@ -2208,11 +2207,11 @@ msgstr "" #: ../fdroidserver/lint.py msgid "Unnecessary leading space" -msgstr "Espace non nécessaire au début" +msgstr "Espace inutile au début" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" -msgstr "Espace non-nécessaire à la fin" +msgstr "Espace inutile à la fin" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2334,9 +2333,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID - it can be removed" -msgstr "" -"UpdateCheckName est défini sur l'ID d’application connu - il peut être " -"supprimé" +msgstr "UpdateCheckName a pour valeur l'ID d’application - il peut être supprimé" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -2515,7 +2512,7 @@ msgstr "apksigner est introuvable, il est requis pour la signature !" #: ../fdroidserver/lint.py ../fdroidserver/rewritemeta.py #: ../fdroidserver/checkupdates.py msgid "application ID of file to operate on" -msgstr "ID d'application du fichier sur lequel agir" +msgstr "applicationId du fichier à traiter" #: ../fdroidserver/verify.py ../fdroidserver/publish.py #: ../fdroidserver/build.py ../fdroidserver/scanner.py @@ -2560,9 +2557,7 @@ msgstr "tentative de connexion ssh simple pour tester la clé de déploiement :" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" -msgstr "" -"Impossible de parcourir la spécification de srclib (pas une chaîne de " -"caractères) : '{}'" +msgstr "impossible d'analyser la spécification de scrlib (not a string) : '{}'" #: /usr/lib/python3.9/argparse.py #, python-format @@ -2686,8 +2681,8 @@ msgstr "binaire exécutable, possiblement du code" #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" -msgstr[0] "argument %s requis" -msgstr[1] "arguments %s requis" +msgstr[0] "%s argument attendu" +msgstr[1] "%s arguments attendus" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2810,7 +2805,7 @@ msgstr "local_copy_dir doir être un chemin absolut !" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" -msgstr "local_copy_dir doit être absolument un dossier, pas un fichier !" +msgstr "local_copy_dir doit être un dossier et non un fichier !" #: ../fdroidserver/index.py #, python-format @@ -2839,7 +2834,7 @@ msgstr "option inexistante : %s" #: ../fdroid ../fdroidserver/__main__.py msgid "no version info found!" -msgstr "aucun information de version n'a été trouvée !" +msgstr "aucune information de version n'a été trouvée !" #: ../fdroidserver/checkupdates.py msgid "no version information found" @@ -2924,7 +2919,7 @@ msgstr "arguments optionnels" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" -msgstr "en train d'écraser l'existant {path}" +msgstr "écrasement de {path} en cours" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py From 454790003f6ce57588c262bd8959d062954d5d73 Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Sun, 19 Feb 2023 21:57:31 +0100 Subject: [PATCH 1038/2116] Translated using Weblate: French (fr) by ButterflyOfFire Currently translated at 100.0% (623 of 623 strings) Co-authored-by: ButterflyOfFire Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index dfec3fa5..ee95c2d3 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -21,7 +21,7 @@ # Madeorsk , 2021. # Adrien le Maire , 2021. # gub , 2021. -# ButterflyOfFire , 2021, 2022. +# ButterflyOfFire , 2021, 2022, 2023. # Vincent Finance , 2021. # Gavy , 2021. # lilim , 2021. @@ -41,7 +41,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2023-01-02 10:50+0000\n" -"Last-Translator: Ldm Public \n" +"Last-Translator: ButterflyOfFire \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2289,7 +2289,7 @@ msgstr "Chemin scanignore inutilisé : %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "Décompression vers %s" +msgstr "Extraction vers %s" #: ../fdroid ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -3022,7 +3022,7 @@ msgstr "les srclibs manquent un nom ou un @" #: ../fdroidserver/scanner.py msgid "static library" -msgstr "bibliothèque statique" +msgstr "librairie statique" #: ../fdroidserver/common.py #, python-brace-format From d0f998bac39787a19d21f82642589d435a7d0d48 Mon Sep 17 00:00:00 2001 From: gub Date: Sun, 19 Feb 2023 21:57:32 +0100 Subject: [PATCH 1039/2116] Translated using Weblate: French (fr) by gub Currently translated at 100.0% (623 of 623 strings) Translated using Weblate: French (fr) by gub Currently translated at 100.0% (623 of 623 strings) Co-authored-by: gub Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 53 ++++++++++++++++++--------- 1 file changed, 36 insertions(+), 17 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index ee95c2d3..d646a619 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -20,7 +20,7 @@ # hilariousperson , 2021. # Madeorsk , 2021. # Adrien le Maire , 2021. -# gub , 2021. +# gub , 2021, 2023. # ButterflyOfFire , 2021, 2022, 2023. # Vincent Finance , 2021. # Gavy , 2021. @@ -41,8 +41,9 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" "PO-Revision-Date: 2023-01-02 10:50+0000\n" -"Last-Translator: ButterflyOfFire \n" -"Language-Team: French \n" +"Last-Translator: gub \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -546,11 +547,14 @@ msgstr "" msgid "" "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, " "archapks:{arch}" -msgstr "Vérification de l'archivage pour {appid} — apks : {integer}, keepversions : {keep}, archapks : {arch}" +msgstr "" +"Vérification de l'archivage pour {appid} — apks : {integer}, keepversions : " +"{keep}, archapks : {arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" -msgstr "Mise à jour propre — n'utilise pas les caches, traite à nouveau tous les APKs" +msgstr "" +"Mise à jour propre — n'utilise pas les caches, traite à nouveau tous les APKs" #: ../fdroidserver/import.py ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." @@ -820,7 +824,9 @@ msgstr "Analyser dynamiquement les APKs après compilation" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "ERREUR : La sous-commande \"server\" a été supprimée, utilisez plutôt \"deploy\" !" +msgstr "" +"ERREUR : La sous-commande \"server\" a été supprimée, utilisez plutôt " +"\"deploy\" !" #: ../fdroidserver/mirror.py msgid "" @@ -838,7 +844,9 @@ msgstr "ERREUR : type de CI non supporté, les corrections sont bienvenues !" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "ERREUR : hébergeur git « %s » non supporté, les corrections sont les bienvenues !" +msgstr "" +"ERREUR : hébergeur git « %s » non supporté, les corrections sont les " +"bienvenues !" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1257,7 +1265,8 @@ msgstr "" #: ../fdroidserver/lint.py msgid "Invalid link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "Lien non valide — utilisez [http://foo.bar Link title] ou [http://foo.bar]" +msgstr "" +"Lien non valide — utilisez [http://foo.bar Link title] ou [http://foo.bar]" #: ../fdroidserver/metadata.py #, python-format @@ -1414,7 +1423,8 @@ msgstr "Le nom '%s' est juste un nom généré — supprimez-le" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "Ni « repo_pubkey », ni « keystorepass » ne sont définis dans config.yml" +msgstr "" +"Ni « repo_pubkey », ni « keystorepass » ne sont définis dans config.yml" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." @@ -1765,7 +1775,9 @@ msgstr "Lecture de {apkfilename} à partir du cache" msgid "" "Recalculate aggregate stats - use when changes have been made that would " "invalidate old cached data." -msgstr "Recalculer les statistiques agrégées — à utiliser quand les modifications faites peuvent invalider les anciennes données en cache." +msgstr "" +"Recalculer les statistiques agrégées — à utiliser quand les modifications " +"faites peuvent invalider les anciennes données en cache." #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1850,7 +1862,9 @@ msgstr "Exécution de wget dans {path}" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "Analyse le(s) APK(s) généré(s) afin de trouver les classes connues comme non libres." +msgstr "" +"Analyse le(s) APK(s) généré(s) afin de trouver les classes connues comme non " +"libres." #: ../fdroid ../fdroidserver/__main__.py msgid "Scan the source code of a package" @@ -2029,7 +2043,9 @@ msgstr "" msgid "" "Test mode - put output in the tmp directory only, and always build, even if " "the output already exists." -msgstr "Mode test — mettre la sortie dans le dossier tmp uniquement et toujours compiler, même si la sortie existe déjà." +msgstr "" +"Mode test — mettre la sortie dans le dossier tmp uniquement et toujours " +"compiler, même si la sortie existe déjà." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -2333,7 +2349,8 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID - it can be removed" -msgstr "UpdateCheckName a pour valeur l'ID d’application - il peut être supprimé" +msgstr "" +"UpdateCheckName a pour valeur l'ID d’application - il peut être supprimé" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -2664,7 +2681,7 @@ msgstr "déploiement des journaux de compilation sur « {path} »" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" -msgstr "log du processus {path} déployé vers {dest}" +msgstr "journal du processus déployé {path} à {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2745,11 +2762,13 @@ msgstr "argument explicite %r ignoré" msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "" "index-v1 doit avoir une signature, utilisez `fdroid signindex` pour la " -"créer !" +"créer !" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v2 doit avoir une signature, utilisez `fdroid signindex` pour la créer !" +msgstr "" +"index-v2 doit avoir une signature, utilisez `fdroid signindex` pour la " +"créer !" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2801,7 +2820,7 @@ msgstr "" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" -msgstr "local_copy_dir doir être un chemin absolut !" +msgstr "local_copy_dir doit être un chemin absolu !" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" From 5f22f65e7b6165671224b91099065e15468ab63f Mon Sep 17 00:00:00 2001 From: lilim Date: Sun, 19 Feb 2023 21:57:32 +0100 Subject: [PATCH 1040/2116] Translated using Weblate: French (fr) by lilim Currently translated at 100.0% (623 of 623 strings) Co-authored-by: lilim Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index d646a619..d7e2fbd9 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -2632,8 +2632,8 @@ msgstr "complexe" #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" -msgstr[0] "chaîne d'options en conflit : %s" -msgstr[1] "chaînes d'options en conflit : %s" +msgstr[0] "option en conflit: %s" +msgstr[1] "options en conflit: %s" #: ../fdroidserver/nightly.py #, python-brace-format From 995ce3a152153ce549ef071286599068c7f62ba7 Mon Sep 17 00:00:00 2001 From: Ldm Public Date: Sun, 19 Feb 2023 21:57:33 +0100 Subject: [PATCH 1041/2116] Translated using Weblate: French (fr) by Ldm Public Currently translated at 100.0% (623 of 623 strings) Translated using Weblate: French (fr) by Ldm Public Currently translated at 100.0% (623 of 623 strings) Co-authored-by: Ldm Public Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index d7e2fbd9..51d80108 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -40,10 +40,9 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2023-01-02 10:50+0000\n" -"Last-Translator: gub \n" -"Language-Team: French \n" +"PO-Revision-Date: 2023-01-05 18:23+0000\n" +"Last-Translator: Ldm Public \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -2632,8 +2631,8 @@ msgstr "complexe" #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" -msgstr[0] "option en conflit: %s" -msgstr[1] "options en conflit: %s" +msgstr[0] "option en conflit : %s" +msgstr[1] "options en conflit : %s" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2681,7 +2680,7 @@ msgstr "déploiement des journaux de compilation sur « {path} »" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" -msgstr "journal du processus déployé {path} à {dest}" +msgstr "journal du processus déployé de {path} vers {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -3169,9 +3168,7 @@ msgstr "{appid} n'a pas de {name}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" -msgstr "" -"{appid} : Bibliothèque externe (extlib) {path} inconnue dans la version " -"'{versionName}'" +msgstr "{appid} : Bibliothèque externe (extlib) {path} inconnue dans la version '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format From d2827e3ed704dee11138e0e2df82d84f078c1249 Mon Sep 17 00:00:00 2001 From: The Cats Date: Sun, 19 Feb 2023 21:57:34 +0100 Subject: [PATCH 1042/2116] Translated using Weblate: Portuguese (Brazil) (pt_BR) by The Cats Currently translated at 100.0% (623 of 623 strings) Translated using Weblate: Portuguese (Brazil) (pt_BR) by The Cats Currently translated at 98.3% (613 of 623 strings) Co-authored-by: The Cats Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/ Translation: F-Droid/F-Droid Server --- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 37 ++++++++++++------------ 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 05458c80..5c8e4c14 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -8,20 +8,21 @@ # The Cats , 2020. # Eduardo Rodrigues , 2021. # Flavio F. M. , 2022. +# The Cats , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2022-05-10 03:07+0000\n" -"Last-Translator: Flavio F. M. \n" +"PO-Revision-Date: 2023-02-01 00:47+0000\n" +"Last-Translator: The Cats \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.12.1\n" +"X-Generator: Weblate 4.16-dev\n" #: ../fdroidserver/common.py msgid "" @@ -738,9 +739,9 @@ msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERRO: tipo de IC não suportado, correções bem-vindas!" #: ../fdroidserver/nightly.py -#, fuzzy, python-format +#, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "ERRO: tipo de IC não suportado, correções bem-vindas!" +msgstr "ERRO: host de git \"%s\" não suportado, patches são bem-vindos!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -779,7 +780,7 @@ msgstr "Erro ao obter o endereço do repositório" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "" +msgstr "Extrair metadados de aplicativos de um repositório de origem" #: ../fdroid ../fdroidserver/__main__.py msgid "Extract signatures from APKs" @@ -1267,7 +1268,7 @@ msgstr "Linha mal-formada do 'serverwebroot':" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "" +msgstr "Profundidade máxima de recursão no arquivo ZIP atingida: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1284,7 +1285,7 @@ msgstr "O nome '%s' é apenas o nome automático - remova-o" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" +msgstr "Nem \"repo_pubkey\" nem \"keystorepass\" definidos em config.yml" #: ../fdroidserver/common.py msgid "No 'config.yml' found, using defaults." @@ -1520,7 +1521,7 @@ msgstr "Imprima a variável secreta no terminal para facilitar a cópia/colagem" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" -msgstr "" +msgstr "Problema com o arquivo ZIP: %s, erro %s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1692,9 +1693,9 @@ msgid "Scan the source code of a package" msgstr "Percorre o código-fonte de um pacote" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Scanner found {count} problems in {apk}:" -msgstr "O scanner encontrou {count} problemas em {appid}:" +msgstr "O scanner encontrou {count} problemas em {apk}:" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1717,9 +1718,8 @@ msgid "Scanning APK with apkanalyzer for known non-free classes." msgstr "Verifique os APKs resultantes na busca das classes não-livres já conhecidas." #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK with dexdump for known non-free classes." -msgstr "Verifique os APKs resultantes na busca das classes não-livres já conhecidas." +msgstr "Verificando o APK com dexdump por classes não-livres conhecidas." #: ../fdroidserver/common.py #, python-brace-format @@ -2303,7 +2303,7 @@ msgstr "applicationId com versionCode opcional na forma APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" -msgstr "" +msgstr "archive_url precisa terminar com /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2324,9 +2324,9 @@ msgid "can not parse scrlib spec (not a string): '{}'" msgstr "não é possível analisar a especificação scrlib (não uma string): '{}'" #: /usr/lib/python3.9/argparse.py -#, fuzzy, python-format +#, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "não foi possível abrir \"%s\": %s" +msgstr "não é possível abrir '%(filename)s': %(error)s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py @@ -2501,9 +2501,8 @@ msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 deve ter uma assinatura, use ' fdroid signindex ' para criá-lo!" #: ../fdroidserver/index.py -#, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v1 deve ter uma assinatura, use ' fdroid signindex ' para criá-lo!" +msgstr "index-v2 deve ter uma assinatura, use droid signindex` para criá-la!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2696,7 +2695,7 @@ msgstr "repo_icon %s não existe, gerando um espaço reservado." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" -msgstr "" +msgstr "repo_url precisa terminar com /repo" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." From 551bf543ad46dd37a76197a2e370d4d9f913caa7 Mon Sep 17 00:00:00 2001 From: Xiang Heng Wei Date: Sun, 19 Feb 2023 21:57:35 +0100 Subject: [PATCH 1043/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Xiang Heng Wei Currently translated at 80.0% (499 of 623 strings) Translated using Weblate: Chinese (Simplified) (zh_Hans) by Xiang Heng Wei Currently translated at 79.2% (494 of 623 strings) Co-authored-by: Xiang Heng Wei Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index cb66744f..8e167a30 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -22,15 +22,15 @@ # Yang Yulin , 2022. # Eric , 2022. # Xu ZhuoHan , 2022. -# Xiang Heng Wei , 2022. +# Xiang Heng Wei , 2022, 2023. # RainSlide , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2022-09-06 22:24+0200\n" -"PO-Revision-Date: 2023-01-30 21:55+0000\n" -"Last-Translator: RainSlide \n" +"PO-Revision-Date: 2023-02-14 00:18+0000\n" +"Last-Translator: Xiang Heng Wei \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" @@ -2067,11 +2067,11 @@ msgstr "未知元数据格式:{path} (使用:*.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " -msgstr "" +msgstr "未知版本的 aapt,可能会导致问题: " #: ../fdroidserver/lint.py msgid "Unlinkified link - use [http://foo.bar Link title] or [http://foo.bar]" -msgstr "" +msgstr "无链接的链接 - 使用[http://foo.bar 链接标题]或[http://foo.bar]" #: ../fdroidserver/lint.py msgid "Unnecessary leading space" @@ -2103,30 +2103,30 @@ msgstr "{linedesc} 中有无法识别的栏目 '{field}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" -msgstr "" +msgstr "存储库图形不支持的文件类型“{extension}”" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" -msgstr "" +msgstr "发现不支持的图形文件:{path}" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Unsupported metadata format, use: --to [{supported}]" -msgstr "" +msgstr "不支持的元数据格式,请使用:--to [{supported}]" #: ../fdroidserver/metadata.py msgid "Unterminated ]" -msgstr "" +msgstr "未终止 ]" #: ../fdroidserver/metadata.py msgid "Unterminated ]]" -msgstr "" +msgstr "未终止 ]]" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unterminated build in {name}" -msgstr "" +msgstr "{name} 中未终止的构建" #: ../fdroidserver/metadata.py #, python-brace-format From b8f59097f747494bf72d2528f3e89b08d23aeeb5 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sun, 19 Feb 2023 22:23:04 +0100 Subject: [PATCH 1044/2116] purge all vestiges of the unused `fdroid stats`, closes #839 * for f in locale/*/LC_MESSAGES/fdroidserver.po; do msgattrib --set-obsolete --no-wrap --ignore-file=locale/fdroidserver.pot -o $f $f; done * sed -i 's, \.\./fdroidserver/stats\.py,,' locale/*/LC_MESSAGES/fdroidserver.po --- completion/bash-completion | 7 - examples/config.yml | 22 +- fdroidserver/__main__.py | 1 - fdroidserver/common.py | 4 - fdroidserver/stats.py | 306 --------------------- locale/bn/LC_MESSAGES/fdroidserver.po | 18 +- locale/bo/LC_MESSAGES/fdroidserver.po | 18 +- locale/cs/LC_MESSAGES/fdroidserver.po | 18 +- locale/cy/LC_MESSAGES/fdroidserver.po | 18 +- locale/de/LC_MESSAGES/fdroidserver.po | 18 +- locale/el/LC_MESSAGES/fdroidserver.po | 18 +- locale/es/LC_MESSAGES/fdroidserver.po | 18 +- locale/es_AR/LC_MESSAGES/fdroidserver.po | 18 +- locale/es_MX/LC_MESSAGES/fdroidserver.po | 18 +- locale/eu/LC_MESSAGES/fdroidserver.po | 18 +- locale/fa/LC_MESSAGES/fdroidserver.po | 18 +- locale/fdroidserver.pot | 18 +- locale/fi/LC_MESSAGES/fdroidserver.po | 18 +- locale/fr/LC_MESSAGES/fdroidserver.po | 22 +- locale/fy/LC_MESSAGES/fdroidserver.po | 18 +- locale/hi/LC_MESSAGES/fdroidserver.po | 18 +- locale/hu/LC_MESSAGES/fdroidserver.po | 18 +- locale/id/LC_MESSAGES/fdroidserver.po | 18 +- locale/it/LC_MESSAGES/fdroidserver.po | 18 +- locale/ja/LC_MESSAGES/fdroidserver.po | 18 +- locale/kab/LC_MESSAGES/fdroidserver.po | 18 +- locale/ko/LC_MESSAGES/fdroidserver.po | 18 +- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 21 +- locale/nl/LC_MESSAGES/fdroidserver.po | 18 +- locale/pl/LC_MESSAGES/fdroidserver.po | 18 +- locale/pt/LC_MESSAGES/fdroidserver.po | 18 +- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 18 +- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 18 +- locale/ro/LC_MESSAGES/fdroidserver.po | 18 +- locale/ru/LC_MESSAGES/fdroidserver.po | 18 +- locale/sk/LC_MESSAGES/fdroidserver.po | 18 +- locale/sq/LC_MESSAGES/fdroidserver.po | 18 +- locale/sv/LC_MESSAGES/fdroidserver.po | 18 +- locale/tr/LC_MESSAGES/fdroidserver.po | 18 +- locale/tzm/LC_MESSAGES/fdroidserver.po | 18 +- locale/ug/LC_MESSAGES/fdroidserver.po | 18 +- locale/uk/LC_MESSAGES/fdroidserver.po | 18 +- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 20 +- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 18 +- tests/common.TestCase | 4 +- tests/main.TestCase | 1 - 46 files changed, 44 insertions(+), 1012 deletions(-) delete mode 100644 fdroidserver/stats.py diff --git a/completion/bash-completion b/completion/bash-completion index dd32b30f..0f9c66d6 100644 --- a/completion/bash-completion +++ b/completion/bash-completion @@ -261,12 +261,6 @@ __complete_nightly() { __complete_options } -__complete_stats() { - opts="-v -q -d" - lopts="--verbose --quiet --download" - __complete_options -} - __complete_deploy() { opts="-i -v -q" lopts="--identity-file --local-copy-dir --sync-from-local-copy-dir @@ -317,7 +311,6 @@ rewritemeta \ scanner \ signatures \ signindex \ -stats \ update \ verify \ " diff --git a/examples/config.yml b/examples/config.yml index a0943a8c..30e45270 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -289,27 +289,11 @@ # configured to allow push access (e.g. ssh key, username/password, etc) # binary_transparency_remote: git@gitlab.com:fdroid/binary-transparency-log.git -# Only set this to true when running a repository where you want to generate -# stats, and only then on the master build servers, not a development -# machine. If you want to keep the "added" and "last updated" dates for each -# app and APK in your repo, then you should enable this. +# If you want to keep the "added" and "last updated" dates for each +# app and APK in your repo, enable this. The name comes from an old +# system for tracking statistics that is no longer included. # update_stats: true -# When used with stats, this is a list of IP addresses that are ignored for -# calculation purposes. -# stats_ignore: [] - -# Server stats logs are retrieved from. Required when update_stats is True. -# stats_server: example.com - -# User stats logs are retrieved from. Required when update_stats is True. -# stats_user: bob - -# Use the following to push stats to a Carbon instance: -# stats_to_carbon: false -# carbon_host: 0.0.0.0 -# carbon_port: 2003 - # Set this to true to always use a build server. This saves specifying the # --server option on dedicated secure build server hosts. # build_server_always: true diff --git a/fdroidserver/__main__.py b/fdroidserver/__main__.py index 216e00c4..2c863d27 100755 --- a/fdroidserver/__main__.py +++ b/fdroidserver/__main__.py @@ -46,7 +46,6 @@ COMMANDS = OrderedDict([ ("rewritemeta", _("Rewrite all the metadata files")), ("lint", _("Warn about possible metadata errors")), ("scanner", _("Scan the source code of a package")), - ("stats", _("Update the stats of the repo")), ("signindex", _("Sign indexes created using update --nosign")), ("btlog", _("Update the binary transparency log for a URL")), ("signatures", _("Extract signatures from APKs")), diff --git a/fdroidserver/common.py b/fdroidserver/common.py index ea3f219f..4595ebab 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -137,10 +137,6 @@ default_config = { 'current_version_name_source': 'Name', 'deploy_process_logs': False, 'update_stats': False, - 'stats_ignore': [], - 'stats_server': None, - 'stats_user': None, - 'stats_to_carbon': False, 'repo_maxage': 0, 'build_server_always': False, 'keystore': 'keystore.p12', diff --git a/fdroidserver/stats.py b/fdroidserver/stats.py deleted file mode 100644 index a065ce18..00000000 --- a/fdroidserver/stats.py +++ /dev/null @@ -1,306 +0,0 @@ -#!/usr/bin/env python3 -# -# stats.py - part of the FDroid server tools -# Copyright (C) 2010-13, Ciaran Gultnieks, ciaran@ciarang.com -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero 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 Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . - -import sys -import os -import re -import time -import traceback -import glob -import json -from argparse import ArgumentParser -import paramiko -import socket -import logging -import subprocess -from collections import Counter - -from . import _ -from . import common -from . import metadata - - -def carbon_send(key, value): - s = socket.socket() - s.connect((config['carbon_host'], config['carbon_port'])) - msg = '%s %d %d\n' % (key, value, int(time.time())) - s.sendall(msg) - s.close() - - -options = None -config = None - - -def most_common_stable(counts): - pairs = [] - for s in counts: - pairs.append((s, counts[s])) - return sorted(pairs, key=lambda t: (-t[1], t[0])) - - -def main(): - - global options, config - - # Parse command line... - parser = ArgumentParser() - common.setup_global_opts(parser) - parser.add_argument("-d", "--download", action="store_true", default=False, - help=_("Download logs we don't have")) - parser.add_argument("--recalc", action="store_true", default=False, - help=_("Recalculate aggregate stats - use when changes " - "have been made that would invalidate old cached data.")) - parser.add_argument("--nologs", action="store_true", default=False, - help=_("Don't do anything logs-related")) - metadata.add_metadata_arguments(parser) - options = parser.parse_args() - metadata.warnings_action = options.W - - config = common.read_config(options) - - if not config['update_stats']: - logging.info("Stats are disabled - set \"update_stats = True\" in your config.yml") - sys.exit(1) - - # Get all metadata-defined apps... - allmetaapps = [app for app in metadata.read_metadata().values()] - metaapps = [app for app in allmetaapps if not app.Disabled] - - statsdir = 'stats' - logsdir = os.path.join(statsdir, 'logs') - datadir = os.path.join(statsdir, 'data') - if not os.path.exists(statsdir): - os.mkdir(statsdir) - if not os.path.exists(logsdir): - os.mkdir(logsdir) - if not os.path.exists(datadir): - os.mkdir(datadir) - - if options.download: - # Get any access logs we don't have... - ssh = None - ftp = None - try: - logging.info('Retrieving logs') - ssh = paramiko.SSHClient() - ssh.load_system_host_keys() - ssh.connect(config['stats_server'], username=config['stats_user'], - timeout=10, key_filename=config['webserver_keyfile']) - ftp = ssh.open_sftp() - ftp.get_channel().settimeout(60) - logging.info("...connected") - - ftp.chdir('logs') - files = ftp.listdir() - for f in files: - if f.startswith('access-') and f.endswith('.log.gz'): - - destpath = os.path.join(logsdir, f) - destsize = ftp.stat(f).st_size - if not os.path.exists(destpath) \ - or os.path.getsize(destpath) != destsize: - logging.debug("...retrieving " + f) - ftp.get(f, destpath) - except Exception: - traceback.print_exc() - sys.exit(1) - finally: - # Disconnect - if ftp is not None: - ftp.close() - if ssh is not None: - ssh.close() - - knownapks = common.KnownApks() - unknownapks = [] - - if not options.nologs: - # Process logs - logging.info('Processing logs...') - appscount = Counter() - appsvercount = Counter() - logexpr = r'(?P[.:0-9a-fA-F]+) - - \[(?P
    --- -## What is F-Droid? - -F-Droid is an installable catalogue of FOSS (Free and Open Source Software) -applications for the Android platform. The client makes it easy to browse, -install, and keep track of updates on your device. - - ## What is F-Droid Server? -The F-Droid server tools provide various scripts and tools that are -used to maintain the main -[F-Droid application repository](https://f-droid.org/packages). You -can use these same tools to create your own additional or alternative -repository for publishing, or to assist in creating, testing and -submitting metadata to the main repository. +_fdroidserver_ is a suite of tools to publish and work with collections of +Android apps (APK files) and other kinds of packages. It is used to maintain +the [f-droid.org application repository](https://f-droid.org/packages). These +same tools can be used to create additional or alternative repositories for +publishing, or to assist in creating, testing and submitting metadata to the +f-droid.org repository, also known as +[_fdroiddata_](https://gitlab.com/fdroid/fdroiddata). -For documentation, please see , or you can -find the source for the documentation in -[fdroid/fdroid-website](https://gitlab.com/fdroid/fdroid-website). +For documentation, please see . + +In the beginning, _fdroidserver_ was the complete server-side setup that ran +f-droid.org. Since then, the website and other parts have been split out into +their own projects. The name for this suite of tooling has stayed +_fdroidserver_ even though it no longer contains any proper server component. ## Installing -There are many ways to install _fdroidserver_, they are documented on -the website: +There are many ways to install _fdroidserver_, including using a range of +package managers. All of the options are documented on the website: https://f-droid.org/docs/Installing_the_Server_and_Repo_Tools -All sorts of other documentation lives there as well. - ## Tests -There are many components to all the tests for the components in -this git repository. The most commonly used parts of well tested, while -some parts still lack tests. This test suite has built over time a -bit haphazardly, so it is not as clean, organized, or complete as it -could be. We welcome contributions. Before rearchitecting any parts -of it, be sure to [contact us](https://f-droid.org/about) to discuss -the changes beforehand. +To run the full test suite: -### `fdroid` commands + tests/run-tests -The test suite for all of the `fdroid` commands is in the _tests/_ -subdir. _.gitlab-ci.yml_ and _.travis.yml_ run this test suite on -various configurations. +To run the tests for individual Python modules, see the _.TestCase_ files, e.g.: + + tests/metadata.TestCase + +It is also possible to run individual tests: + + tests/metadata.TestCase MetadataTest.test_rewrite_yaml_special_build_params + +There is a growing test suite that has good coverage on a number of key parts of +this code base. It does not yet cover all the code, and there are some parts +where the technical debt makes it difficult to write unit tests. New tests +should be standard Python _unittest_ test cases. Whenever possible, the old +tests written in _bash_ in _tests/run-tests_ should be ported to Python. + +This test suite has built over time a bit haphazardly, so it is not as clean, +organized, or complete as it could be. We welcome contributions. The goal is +to move towards standard Python testing patterns and to expand the unit test +coverage. Before rearchitecting any parts of it, be sure to [contact +us](https://f-droid.org/about) to discuss the changes beforehand. -- _tests/run-tests_ runs the whole test suite -- _tests/*.TestCase_ are individual unit tests for all of the `fdroid` - commands, which can be run separately, e.g. `./update.TestCase`. -- run one test: `tests/common.TestCase CommonTest.test_get_apk_id` ### Additional tests for different linux distributions -These tests are also run on various distributions through GitLab CI. This is +These tests are also run on various configurations through GitLab CI. This is only enabled for `master@fdroid/fdroidserver` because it takes longer to complete than the regular CI tests. Most of the time you won't need to worry about them, but sometimes it might make sense to also run them for your merge -request. In that case you need to remove [these lines from -.gitlab-ci.yml](https://gitlab.com/fdroid/fdroidserver/blob/master/.gitlab-ci.yml#L34-35) +request. In that case you need to remove [these lines from .gitlab-ci.yml](https://gitlab.com/fdroid/fdroidserver/-/blob/0124b9dde99f9cab19c034cbc7d8cc6005a99b48/.gitlab-ci.yml#L90-91) and push this to a new branch of your fork. Alternatively [run them locally](https://docs.gitlab.com/runner/commands/README.html#gitlab-runner-exec) like this: `gitlab-runner exec docker ubuntu_lts` + ### Buildserver The tests for the whole build server setup are entirely separate because they require at least 200 GB of disk space, and 8 GB of RAM. These test scripts are in the root of the project, all starting -with _jenkins-_ since they are run on https://jenkins.debian.net. +with _jenkins-_ since they used to be run on https://jenkins.debian.net. ## Documentation From a08d4a74e878c1bfe4d83473d57d8e173c5534ca Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 10 May 2023 17:54:58 +0200 Subject: [PATCH 1200/2116] update CONTRIBUTING.md --- CONTRIBUTING.md | 65 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..46deed5d --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,65 @@ +There are many ways to contribute, you can find out all the ways on our +[Contribute](https://f-droid.org/contribute/) page. Find out how to get +involved, including as a translator, data analyst, tester, helping others, and +much more! + +## Contributing Code + +We want more contributors and want different points of view represented. Some +parts of the code make contributing quick and easy. Other parts make it +difficult and slow, so we ask that contributors have patience. + +To submit a patch, please open a merge request on GitLab. If you are thinking of +making a large contribution, open an issue or merge request before starting +work, to get comments from the community. Someone may be already working on the +same thing, or there may be reasons why that feature isn't implemented. Once +there is agreement, then the work might need to proceed asynchronously with the +core team towards the solution. + +To make it easier to review and accept your merge request, please follow these +guidelines: + +* When at all possible, include tests. These can either be added to an existing + test, or completely new. Practicing test-driven development will make it + easiest to get merged. That usually means starting your work by writing tests. + +* See [help-wanted](https://gitlab.com/fdroid/fdroidserver/-/issues/?sort=updated_desc&state=opened&label_name%5B%5D=help-wanted) + tags for things that maintainers have marked as things they want to see + merged. + +* The amount of technical debt varies widely in this code base. There are some + parts where the code is nicely isolated with good test coverage. There are + other parts that are tangled and complicated, full of technical debt, and + difficult to test. + +* The general approach is to treat the tangled and complicated parts as an + external API (albeit a bad one). That means it needs to stay unchanged as much + as possible. Changes to those parts of the code will trigger a migration, + which can require a lot of time and coordination. When there is time for large + development efforts, we refactor the code to get rid of those areas of + technical debt. + +* We use [_black_](https://black.readthedocs.io/) code format, run `black .` to + format the code. Whenever editing code in any file, the new code should be + formatted as _black_. Some files are not yet fully in _black_ format (see + _pyproject.toml_), our goal is to opportunistically convert the code whenever + possible. As of the time of this writing, forcing the code format on all files + would be too disruptive. + +* Many of the tests run very fast and can be run interactively in isolation. + Some of the essential test cases run slowly because they do things like + signing files and generating signing keys. + +* Some parts of the code are difficult to test, and currently require a + relatively complete production setup in order to effectively test them. That + is mostly the code around building packages, managing the disposable VM, and + scheduling build jobs to run. + +* For user visible changes (API changes, behaviour changes, etc.), consider + adding a note in _CHANGELOG.md_. This could be a summarizing description of + the change, and could explain the grander details. Have a look through + existing entries for inspiration. Please note that this is NOT simply a copy + of git-log one-liners. Also note that security fixes get an entry in + _CHANGELOG.md_. This file helps users get more in-depth information of what + comes with a specific release without having to sift through the higher noise + ratio in git-log. From 9af2efda2ebe53c2ecd8410b364b176430f9d21d Mon Sep 17 00:00:00 2001 From: Georg krause Date: Mon, 17 Apr 2023 14:13:22 +0200 Subject: [PATCH 1201/2116] feat(scanner): Allow non-zero-exit code if problems were found --- fdroidserver/scanner.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 0dda8ddf..daab6155 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -32,6 +32,7 @@ from tempfile import TemporaryDirectory from pathlib import Path from datetime import datetime, timedelta from dataclasses import dataclass, field, fields +from enum import IntEnum from . import _ from . import common @@ -56,6 +57,10 @@ MAVEN_URL_REGEX = re.compile(r"""\smaven\s*(?:{.*?(?:setUrl|url)|\((?:url)?)\s*= SCANNER_CACHE_VERSION = 1 +class ExitCode(IntEnum): + NONFREE_CODE = 1 + + def get_gradle_compile_commands(build): compileCommands = ['compile', 'provided', @@ -781,6 +786,8 @@ def main(): help=_("Output JSON to stdout.")) parser.add_argument("--refresh", "-r", action="store_true", default=False, help=_("fetch the latest version of signatures from the web")) + parser.add_argument("--exit-code", "-e", action="store_true", default=False, + help=_("Exit with a non-zero code if problems were found")) metadata.add_metadata_arguments(parser) options = parser.parse_args() metadata.warnings_action = options.W @@ -815,6 +822,8 @@ def main(): appids.append(apk) if not appids: + if options.exit_code and probcount > 0: + sys.exit(ExitCode.NONFREE_CODE) return # Read all app and srclib metadata From 061ca38afdc054e3a7a66c4821a197d8f0e71819 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 21 Apr 2023 10:00:40 +0200 Subject: [PATCH 1202/2116] define "string map" type for new Anti-Features explanations closes #683 --- MANIFEST.in | 7 + fdroidserver/index.py | 43 +- fdroidserver/lint.py | 11 + fdroidserver/metadata.py | 195 ++++++++- fdroidserver/rewritemeta.py | 5 +- fdroidserver/scanner.py | 2 +- fdroidserver/update.py | 40 +- .../app.with.special.build.params.yml | 5 +- tests/metadata.TestCase | 391 +++++++++++++++++- .../apk/info.guardianproject.urzip.yaml | 2 +- tests/metadata/apk/org.dyndns.fules.ck.yaml | 2 +- .../app.with.special.build.params.yml | 2 + .../en-US/antifeatures/50_Ads.txt | 1 + .../en-US/antifeatures/50_Tracking.txt | 1 + .../en-US/antifeatures/Ads.txt | 1 + .../en-US/antifeatures/NoSourceSince.txt | 1 + .../zh-CN/antifeatures/49_Tracking.txt | 1 + .../zh-CN/antifeatures/50_Ads.txt | 1 + .../dump/app.with.special.build.params.yaml | 373 +++++++++++++++++ tests/metadata/dump/com.politedroid.yaml | 16 +- tests/metadata/dump/org.adaway.yaml | 58 +-- .../dump/org.smssecure.smssecure.yaml | 18 +- tests/metadata/dump/org.videolan.vlc.yaml | 134 +++--- tests/repo/entry.json | 4 +- tests/repo/index-v2.json | 18 +- tests/rewritemeta.TestCase | 46 ++- tests/update.TestCase | 4 +- 27 files changed, 1188 insertions(+), 194 deletions(-) create mode 100644 tests/metadata/app.with.special.build.params/en-US/antifeatures/50_Ads.txt create mode 100644 tests/metadata/app.with.special.build.params/en-US/antifeatures/50_Tracking.txt create mode 100644 tests/metadata/app.with.special.build.params/en-US/antifeatures/Ads.txt create mode 100644 tests/metadata/app.with.special.build.params/en-US/antifeatures/NoSourceSince.txt create mode 100644 tests/metadata/app.with.special.build.params/zh-CN/antifeatures/49_Tracking.txt create mode 100644 tests/metadata/app.with.special.build.params/zh-CN/antifeatures/50_Ads.txt create mode 100644 tests/metadata/dump/app.with.special.build.params.yaml diff --git a/MANIFEST.in b/MANIFEST.in index e534b0da..e301d8a8 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -597,7 +597,14 @@ include tests/main.TestCase include tests/metadata/apk/info.guardianproject.urzip.yaml include tests/metadata/apk/org.dyndns.fules.ck.yaml include tests/metadata/app.with.special.build.params.yml +include tests/metadata/app.with.special.build.params/en-US/antifeatures/50_Ads.txt +include tests/metadata/app.with.special.build.params/en-US/antifeatures/50_Tracking.txt +include tests/metadata/app.with.special.build.params/en-US/antifeatures/Ads.txt +include tests/metadata/app.with.special.build.params/en-US/antifeatures/NoSourceSince.txt +include tests/metadata/app.with.special.build.params/zh-CN/antifeatures/49_Tracking.txt +include tests/metadata/app.with.special.build.params/zh-CN/antifeatures/50_Ads.txt include tests/metadata/com.politedroid.yml +include tests/metadata/dump/app.with.special.build.params.yaml include tests/metadata/dump/com.politedroid.yaml include tests/metadata/dump/org.adaway.yaml include tests/metadata/dump/org.smssecure.smssecure.yaml diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 48b51ffe..eb05fde6 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -546,6 +546,13 @@ def package_metadata(app, repodir): def convert_version(version, app, repodir): + """Convert the internal representation of Builds: into index-v2 versions. + + The diff algorithm of index-v2 uses null/None to mean a field to + be removed, so this function handles any Nones that are in the + metadata file. + + """ ver = {} if "added" in version: ver["added"] = convert_datetime(version["added"]) @@ -555,7 +562,7 @@ def convert_version(version, app, repodir): ver["file"] = { "name": "/{}".format(version["apkName"]), version["hashType"]: version["hash"], - "size": version["size"] + "size": version["size"], } ipfsCIDv1 = version.get("ipfsCIDv1") @@ -619,24 +626,14 @@ def convert_version(version, app, repodir): else: manifest[en].append({"name": perm[0]}) - antiFeatures = dict() - if "AntiFeatures" in app and app["AntiFeatures"]: - for antif in app["AntiFeatures"]: - # TODO: get reasons from fdroiddata - # ver["antiFeatures"][antif] = {"en-US": "reason"} - antiFeatures[antif] = dict() - - if "antiFeatures" in version and version["antiFeatures"]: - for antif in version["antiFeatures"]: - # TODO: get reasons from fdroiddata - # ver["antiFeatures"][antif] = {"en-US": "reason"} - antiFeatures[antif] = dict() - - if app.get("NoSourceSince"): - antiFeatures["NoSourceSince"] = dict() - + # index-v2 has only per-version antifeatures, not per package. + antiFeatures = app.get('AntiFeatures', {}) + for name, descdict in version.get('antiFeatures', dict()).items(): + antiFeatures[name] = descdict if antiFeatures: - ver["antiFeatures"] = dict(sorted(antiFeatures.items())) + ver['antiFeatures'] = { + k: dict(sorted(antiFeatures[k].items())) for k in sorted(antiFeatures) + } if "versionCode" in version: if version["versionCode"] > app["CurrentVersionCode"]: @@ -881,9 +878,8 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ for ikey, iname in sorted(lvalue.items()): lordered[lkey][ikey] = iname app_dict['localized'] = lordered - antiFeatures = app_dict.get('antiFeatures', []) - if apps[app_dict["packageName"]].get("NoSourceSince"): - antiFeatures.append("NoSourceSince") + # v1 uses a list of keys for Anti-Features + antiFeatures = app_dict.get('antiFeatures', dict()).keys() if antiFeatures: app_dict['antiFeatures'] = sorted(set(antiFeatures)) @@ -915,6 +911,9 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ continue if k in ('icon', 'icons', 'icons_src', 'ipfsCIDv1', 'name'): continue + if k == 'antiFeatures': + d[k] = sorted(v.keys()) + continue d[k] = v json_name = 'index-v1.json' @@ -1160,8 +1159,6 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing antiFeatures = list(app.AntiFeatures) if 'antiFeatures' in apklist[0]: antiFeatures.extend(apklist[0]['antiFeatures']) - if app.get("NoSourceSince"): - antiFeatures.append("NoSourceSince") if antiFeatures: afout = sorted(set(antiFeatures)) addElementNonEmpty('antifeatures', ','.join(afout), doc, apel) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 1283409b..ba21295c 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -624,6 +624,17 @@ def check_app_field_types(app): fieldtype=v.__class__.__name__, ) ) + elif t == metadata.TYPE_STRINGMAP and not isinstance(v, dict): + yield ( + _( + "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" + ).format( + appid=app.id, + field=field, + type='dict', + fieldtype=v.__class__.__name__, + ) + ) def check_antiFeatures(app): diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 787de9a0..0e79ade9 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -114,7 +114,7 @@ class App(dict): super().__init__() self.Disabled = None - self.AntiFeatures = [] + self.AntiFeatures = dict() self.Provides = None self.Categories = [] self.License = 'Unknown' @@ -182,12 +182,13 @@ TYPE_SCRIPT = 5 TYPE_MULTILINE = 6 TYPE_BUILD = 7 TYPE_INT = 8 +TYPE_STRINGMAP = 9 fieldtypes = { 'Description': TYPE_MULTILINE, 'MaintainerNotes': TYPE_MULTILINE, 'Categories': TYPE_LIST, - 'AntiFeatures': TYPE_LIST, + 'AntiFeatures': TYPE_STRINGMAP, 'AllowedAPKSigningKeys': TYPE_LIST, 'Builds': TYPE_BUILD, 'VercodeOperation': TYPE_LIST, @@ -277,7 +278,7 @@ class Build(dict): self.antcommands = [] self.postbuild = '' self.novcheck = False - self.antifeatures = [] + self.antifeatures = dict() if copydict: super().__init__(copydict) return @@ -358,7 +359,7 @@ flagtypes = { 'forceversion': TYPE_BOOL, 'forcevercode': TYPE_BOOL, 'novcheck': TYPE_BOOL, - 'antifeatures': TYPE_LIST, + 'antifeatures': TYPE_STRINGMAP, 'timeout': TYPE_INT, } @@ -649,8 +650,6 @@ def parse_metadata(metadatapath): metadatapath = Path(metadatapath) app = App() app.metadatapath = metadatapath.as_posix() - if metadatapath.stem != '.fdroid': - app.id = metadatapath.stem if metadatapath.suffix == '.yml': with metadatapath.open('r', encoding='utf-8') as mf: app.update(parse_yaml_metadata(mf)) @@ -659,6 +658,10 @@ def parse_metadata(metadatapath): _('Unknown metadata format: {path} (use: *.yml)').format(path=metadatapath) ) + if metadatapath.stem != '.fdroid': + app.id = metadatapath.stem + parse_localized_antifeatures(app) + if metadatapath.name != '.fdroid.yml' and app.Repo: build_dir = common.get_build_dir(app) metadata_in_repo = build_dir / '.fdroid.yml' @@ -770,6 +773,116 @@ def parse_yaml_metadata(mf): return yamldata +def parse_localized_antifeatures(app): + """Read in localized Anti-Features files from the filesystem. + + To support easy integration with Weblate and other translation + systems, there is a special type of metadata that can be + maintained in a Fastlane-style directory layout, where each field + is represented by a text file on directories that specified which + app it belongs to, which locale, etc. This function reads those + in and puts them into the internal dict, to be merged with any + related data that came from the metadata.yml file. + + This needs to be run after parse_yaml_metadata() since that + normalizes the data structure. Also, these values are lower + priority than what comes from the metadata file. So this should + not overwrite anything parse_yaml_metadata() puts into the App + instance. + + metadata///antifeatures/_.txt + metadata///antifeatures/.txt + + └── metadata/ + └── / + ├── en-US/ + │ └── antifeatures/ + │ ├── 123_Ads.txt -> "includes ad lib" + │ ├── 123_Tracking.txt -> "standard suspects" + │ └── NoSourceSince.txt -> "it vanished" + │ + └── zh-CN/ + └── antifeatures/ + └── 123_Ads.txt -> "包括广告图书馆" + + Gets parsed into the metadata data structure: + + AntiFeatures: + NoSourceSince: + en-US: it vanished + Builds: + - versionCode: 123 + antifeatures: + Ads: + en-US: includes ad lib + zh-CN: 包括广告图书馆 + Tracking: + en-US: standard suspects + + """ + app_dir = Path('metadata', app['id']) + if not app_dir.is_dir(): + return + af_dup_msg = _('Duplicate Anti-Feature declaration at {path} was ignored!') + + if app.get('AntiFeatures'): + app_has_AntiFeatures = True + else: + app_has_AntiFeatures = False + + has_versionCode = re.compile(r'^-?[0-9]+_.*') + has_antifeatures_from_app = set() + for build in app.get('Builds', []): + antifeatures = build.get('antifeatures') + if antifeatures: + has_antifeatures_from_app.add(build['versionCode']) + + for f in sorted(app_dir.glob('*/antifeatures/*.txt')): + path = f.as_posix() + left = path.index('/', 9) # 9 is length of "metadata/" + right = path.index('/', left + 1) + locale = path[left + 1 : right] + description = f.read_text() + if has_versionCode.match(f.stem): + i = f.stem.index('_') + versionCode = int(f.stem[:i]) + antifeature = f.stem[i + 1 :] + if versionCode in has_antifeatures_from_app: + logging.error(af_dup_msg.format(path=f)) + continue + if 'Builds' not in app: + app['Builds'] = [] + found = False + for build in app['Builds']: + # loop though builds again, there might be duplicate versionCodes + if versionCode == build['versionCode']: + found = True + if 'antifeatures' not in build: + build['antifeatures'] = dict() + if antifeature not in build['antifeatures']: + build['antifeatures'][antifeature] = dict() + build['antifeatures'][antifeature][locale] = description + if not found: + app['Builds'].append( + { + 'versionCode': versionCode, + 'antifeatures': { + antifeature: {locale: description}, + }, + } + ) + elif app_has_AntiFeatures: + logging.error(af_dup_msg.format(path=f)) + continue + else: + if 'AntiFeatures' not in app: + app['AntiFeatures'] = dict() + if f.stem not in app['AntiFeatures']: + app['AntiFeatures'][f.stem] = dict() + with f.open() as fp: + app['AntiFeatures'][f.stem][locale] = fp.read() + + def _normalize_type_string(v): """Normalize any data to TYPE_STRING. @@ -787,6 +900,61 @@ def _normalize_type_string(v): return str(v) +def _normalize_type_stringmap(k, v): + """Normalize any data to TYPE_STRINGMAP. + + The internal representation of this format is a dict of dicts, + where the outer dict's keys are things like tag names of + Anti-Features, the inner dict's keys are locales, and the ultimate + values are human readable text. + + Metadata entries like AntiFeatures: can be written in many + forms, including a simple one-entry string, a list of strings, + a dict with keys and descriptions as values, or a dict with + localization. + + Returns + ------- + A dictionary with string keys, where each value is either a string + message or a dict with locale keys and string message values. + + """ + if v is None: + return dict() + if isinstance(v, str) or isinstance(v, int) or isinstance(v, float): + return {_normalize_type_string(v): dict()} + if isinstance(v, list) or isinstance(v, tuple) or isinstance(v, set): + retdict = dict() + for i in v: + if isinstance(i, dict): + # transitional format + if len(i) != 1: + _warn_or_exception( + _( + "'{value}' is not a valid {field}, should be {pattern}" + ).format(field=k, value=v, pattern='key: value') + ) + afname = _normalize_type_string(next(iter(i))) + desc = _normalize_type_string(next(iter(i.values()))) + retdict[afname] = {common.DEFAULT_LOCALE: desc} + else: + retdict[_normalize_type_string(i)] = {} + return retdict + + retdict = dict() + for af, afdict in v.items(): + key = _normalize_type_string(af) + if afdict: + if isinstance(afdict, dict): + retdict[key] = afdict + else: + retdict[key] = {common.DEFAULT_LOCALE: _normalize_type_string(afdict)} + else: + retdict[key] = dict() + + return retdict + + def post_parse_yaml_metadata(yamldata): """Convert human-readable metadata data structures into consistent data structures. @@ -808,6 +976,9 @@ def post_parse_yaml_metadata(yamldata): elif _fieldtype == TYPE_STRING: if v or v == 0: yamldata[k] = _normalize_type_string(v) + elif _fieldtype == TYPE_STRINGMAP: + if v or v == 0: # TODO probably want just `if v:` + yamldata[k] = _normalize_type_stringmap(k, v) else: if type(v) in (float, int): yamldata[k] = str(v) @@ -843,12 +1014,24 @@ def post_parse_yaml_metadata(yamldata): build_flag=k, value=v ) ) + elif _flagtype == TYPE_STRINGMAP: + if v or v == 0: + build[k] = _normalize_type_stringmap(k, v) builds.append(build) if builds: yamldata['Builds'] = sorted(builds, key=lambda build: build['versionCode']) + no_source_since = yamldata.get("NoSourceSince") + # do not overwrite the description if it is there + if no_source_since and not yamldata.get('AntiFeatures', {}).get('NoSourceSince'): + if 'AntiFeatures' not in yamldata: + yamldata['AntiFeatures'] = dict() + yamldata['AntiFeatures']['NoSourceSince'] = { + common.DEFAULT_LOCALE: no_source_since + } + def write_yaml(mf, app): """Write metadata in yaml format. diff --git a/fdroidserver/rewritemeta.py b/fdroidserver/rewritemeta.py index 7413b029..b1932502 100644 --- a/fdroidserver/rewritemeta.py +++ b/fdroidserver/rewritemeta.py @@ -52,8 +52,9 @@ def remove_blank_flags_from_builds(builds): for build in builds: new = dict() for k in metadata.build_flags: - v = build[k] - if v is None or v is False or v == [] or v == '': + v = build.get(k) + # 0 is valid value, it should not be stripped + if v is None or v is False or v == '' or v == dict() or v == list(): continue new[k] = v newbuilds.append(new) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index daab6155..7db619d7 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -294,7 +294,7 @@ class ExodusSignatureDataController(SignatureDataController): "warn_code_signatures": [tracker["code_signature"]], # exodus also provides network signatures, unused atm. # "network_signatures": [tracker["network_signature"]], - "AntiFeatures": ["Tracking"], + "AntiFeatures": ["Tracking"], # TODO "license": "NonFree" # We assume all trackers in exodus # are non-free, although free # trackers like piwik, acra, diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 45d66d33..398932b4 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -158,7 +158,7 @@ def status_update_json(apps, apks): for appid in apps: app = apps[appid] - for af in app.get('AntiFeatures', []): + for af in app.get('AntiFeatures', dict()): antiFeatures = output['antiFeatures'] # JSON camelCase if af not in antiFeatures: antiFeatures[af] = dict() @@ -351,7 +351,8 @@ def get_cache(): if not isinstance(v, dict): continue if 'antiFeatures' in v: - v['antiFeatures'] = set(v['antiFeatures']) + if not isinstance(v['antiFeatures'], dict): + v['antiFeatures'] = {k: {} for k in sorted(v['antiFeatures'])} if 'added' in v: v['added'] = datetime.fromtimestamp(v['added']) @@ -400,7 +401,7 @@ def has_known_vulnerability(filename): Janus is similar to Master Key but is perhaps easier to scan for. https://www.guardsquare.com/en/blog/new-android-vulnerability-allows-attackers-modify-apps-without-affecting-their-signatures """ - found_vuln = False + found_vuln = '' # statically load this pattern if not hasattr(has_known_vulnerability, "pattern"): @@ -431,15 +432,23 @@ def has_known_vulnerability(filename): logging.debug(_('"{path}" contains recent {name} ({version})') .format(path=filename, name=name, version=version)) else: - logging.warning(_('"{path}" contains outdated {name} ({version})') - .format(path=filename, name=name, version=version)) - found_vuln = True + msg = '"{path}" contains outdated {name} ({version})' + logging.warning( + _(msg).format(path=filename, name=name, version=version) + ) + found_vuln += msg.format( + path=filename, name=name, version=version + ) + found_vuln += '\n' break elif name == 'AndroidManifest.xml' or name == 'classes.dex' or name.endswith('.so'): if name in files_in_apk: - logging.warning(_('{apkfilename} has multiple {name} files, looks like Master Key exploit!') - .format(apkfilename=filename, name=name)) - found_vuln = True + msg = '{apkfilename} has multiple {name} files, looks like Master Key exploit!' + logging.warning( + _(msg).format(apkfilename=filename, name=name) + ) + found_vuln += msg.format(apkfilename=filename, name=name) + found_vuln += '\n' files_in_apk.add(name) return found_vuln @@ -545,7 +554,7 @@ def translate_per_build_anti_features(apps, apks): if d: afl = d.get(apk['versionCode']) if afl: - apk['antiFeatures'].update(afl) + apk['antiFeatures'].update(afl) # TODO def _get_localized_dict(app, locale): @@ -1228,7 +1237,7 @@ def scan_apk(apk_file, require_signature=True): 'features': [], 'icons_src': {}, 'icons': {}, - 'antiFeatures': set(), + 'antiFeatures': {}, } ipfsCIDv1 = common.calculate_IPFS_cid(apk_file) if ipfsCIDv1: @@ -1263,8 +1272,9 @@ def scan_apk(apk_file, require_signature=True): apk['minSdkVersion'] = 3 # aapt defaults to 3 as the min # Check for known vulnerabilities - if has_known_vulnerability(apk_file): - apk['antiFeatures'].add('KnownVuln') + hkv = has_known_vulnerability(apk_file) + if hkv: + apk['antiFeatures']['KnownVuln'] = {DEFAULT_LOCALE: hkv} return apk @@ -1545,7 +1555,7 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal if repodir == 'archive' or allow_disabled_algorithms: try: common.verify_deprecated_jar_signature(apkfile) - apk['antiFeatures'].update(['KnownVuln', 'DisabledAlgorithm']) + apk['antiFeatures'].update(['KnownVuln', 'DisabledAlgorithm']) # TODO except VerificationException: skipapk = True else: @@ -1885,7 +1895,7 @@ def archive_old_apks(apps, apks, archapks, repodir, archivedir, defaultkeepversi for apk in all_app_apks: if len(keep) == keepversions: break - if 'antiFeatures' not in apk: + if 'antiFeatures' not in apk: # TODO keep.append(apk) elif 'DisabledAlgorithm' not in apk['antiFeatures'] or disabled_algorithms_allowed(): keep.append(apk) diff --git a/tests/metadata-rewrite-yml/app.with.special.build.params.yml b/tests/metadata-rewrite-yml/app.with.special.build.params.yml index d268d049..a31604ae 100644 --- a/tests/metadata-rewrite-yml/app.with.special.build.params.yml +++ b/tests/metadata-rewrite-yml/app.with.special.build.params.yml @@ -1,5 +1,5 @@ AntiFeatures: - - UpstreamNonFree + UpstreamNonFree: {} Categories: - System License: GPL-3.0-only @@ -77,6 +77,9 @@ Builds: maven: yes@.. srclibs: - FacebookSDK@sdk-version-3.0.2 + antifeatures: + Tracking: + en-US: Uses the Facebook SDK. - versionName: 2.1.1-c versionCode: 50 diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index b90abf9f..3a2879a6 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -26,6 +26,7 @@ if localmodule not in sys.path: import fdroidserver from fdroidserver import metadata from fdroidserver.exception import MetaDataException +from fdroidserver.common import DEFAULT_LOCALE def _get_mock_mf(s): @@ -216,6 +217,7 @@ class MetadataTest(unittest.TestCase): yaml = ruamel.yaml.YAML(typ='safe') apps = fdroidserver.metadata.read_metadata() for appid in ( + 'app.with.special.build.params', 'org.smssecure.smssecure', 'org.adaway', 'org.videolan.vlc', @@ -300,24 +302,24 @@ class MetadataTest(unittest.TestCase): @mock.patch('git.Repo') def test_rewrite_yaml_special_build_params(self, git_Repo): - with tempfile.TemporaryDirectory() as testdir: - testdir = Path(testdir) + """Test rewriting a plain YAML metadata file without localized files.""" + os.chdir(self.testdir) + os.mkdir('metadata') + appid = 'app.with.special.build.params' + file_name = Path('metadata/%s.yml' % appid) + shutil.copy(self.basedir / file_name, file_name) - # rewrite metadata - allapps = fdroidserver.metadata.read_metadata() - for appid, app in allapps.items(): - if appid == 'app.with.special.build.params': - fdroidserver.metadata.write_metadata( - testdir / (appid + '.yml'), app - ) + # rewrite metadata + allapps = fdroidserver.metadata.read_metadata({appid: -1}) + for appid, app in allapps.items(): + metadata.write_metadata(file_name, app) - # assert rewrite result - self.maxDiff = None - file_name = 'app.with.special.build.params.yml' - self.assertEqual( - (testdir / file_name).read_text(encoding='utf-8'), - (Path('metadata-rewrite-yml') / file_name).read_text(encoding='utf-8'), - ) + # assert rewrite result + self.maxDiff = None + self.assertEqual( + file_name.read_text(), + (self.basedir / 'metadata-rewrite-yml' / file_name.name).read_text(), + ) def test_normalize_type_string(self): """TYPE_STRING currently has some quirky behavior.""" @@ -331,6 +333,18 @@ class MetadataTest(unittest.TestCase): self.assertEqual('false', metadata._normalize_type_string(False)) self.assertEqual('true', metadata._normalize_type_string(True)) + def test_normalize_type_stringmap_none(self): + self.assertEqual(dict(), metadata._normalize_type_stringmap('key', None)) + + def test_normalize_type_stringmap_empty_list(self): + self.assertEqual(dict(), metadata._normalize_type_stringmap('AntiFeatures', [])) + + def test_normalize_type_stringmap_simple_list_format(self): + self.assertEqual( + {'Ads': {}, 'Tracking': {}}, + metadata._normalize_type_stringmap('AntiFeatures', ['Ads', 'Tracking']), + ) + def test_post_parse_yaml_metadata(self): yamldata = dict() metadata.post_parse_yaml_metadata(yamldata) @@ -507,6 +521,96 @@ class MetadataTest(unittest.TestCase): _warning.assert_called_once() _error.assert_called_once() + def test_parse_localized_antifeatures(self): + """Unit test based on reading files included in the test repo.""" + app = dict() + app['id'] = 'app.with.special.build.params' + metadata.parse_localized_antifeatures(app) + self.maxDiff = None + self.assertEqual( + app, + { + 'AntiFeatures': { + 'Ads': {'en-US': 'please no'}, + 'NoSourceSince': {'en-US': 'no activity\n'}, + }, + 'Builds': [ + { + 'versionCode': 50, + 'antifeatures': { + 'Ads': { + 'en-US': 'includes ad lib\n', + 'zh-CN': '包括广告图书馆\n', + }, + 'Tracking': {'en-US': 'standard suspects\n'}, + }, + }, + { + 'versionCode': 49, + 'antifeatures': { + 'Tracking': {'zh-CN': 'Text from zh-CN/49_Tracking.txt'}, + }, + }, + ], + 'id': app['id'], + }, + ) + + def test_parse_localized_antifeatures_passthrough(self): + """Test app values are cleanly passed through if no localized files.""" + before = { + 'id': 'placeholder', + 'AntiFeatures': {'NonFreeDep': {}}, + 'Builds': [{'versionCode': 999, 'antifeatures': {'zero': {}, 'one': {}}}], + } + after = copy.deepcopy(before) + with tempfile.TemporaryDirectory() as testdir: + os.chdir(testdir) + os.mkdir('metadata') + os.mkdir(os.path.join('metadata', after['id'])) + metadata.parse_localized_antifeatures(after) + self.assertEqual(before, after) + + def test_parse_metadata_antifeatures_NoSourceSince(self): + """Test that NoSourceSince gets added as an Anti-Feature.""" + os.chdir(self.testdir) + yml = Path('metadata/test.yml') + yml.parent.mkdir() + with yml.open('w') as fp: + fp.write('AntiFeatures: Ads\nNoSourceSince: gone\n') + app = metadata.parse_metadata(yml) + self.assertEqual( + app['AntiFeatures'], {'Ads': {}, 'NoSourceSince': {DEFAULT_LOCALE: 'gone'}} + ) + + @mock.patch('logging.error') + def test_yml_overrides_localized_antifeatures(self, logging_error): + """Definitions in .yml files should override the localized versions.""" + app = metadata.parse_metadata('metadata/app.with.special.build.params.yml') + + self.assertEqual(app['AntiFeatures'], {'UpstreamNonFree': {}}) + + self.assertEqual(49, app['Builds'][-3]['versionCode']) + self.assertEqual( + app['Builds'][-3]['antifeatures'], + {'Tracking': {DEFAULT_LOCALE: 'Uses the Facebook SDK.'}}, + ) + + self.assertEqual(50, app['Builds'][-2]['versionCode']) + self.assertEqual( + app['Builds'][-2]['antifeatures'], + { + 'Ads': { + 'en-US': 'includes ad lib\n', + 'zh-CN': '包括广告图书馆\n', + }, + 'Tracking': {'en-US': 'standard suspects\n'}, + }, + ) + # errors are printed when .yml overrides localized + logging_error.assert_called() + self.assertEqual(3, len(logging_error.call_args_list)) + def test_parse_yaml_srclib_corrupt_file(self): with tempfile.TemporaryDirectory() as testdir: testdir = Path(testdir) @@ -741,6 +845,257 @@ class MetadataTest(unittest.TestCase): self.assertNotIn('Provides', result) self.assertNotIn('provides', result) + def test_parse_yaml_app_antifeatures_dict(self): + nonfreenet = 'free it!' + tracking = 'so many' + mf = io.StringIO( + textwrap.dedent( + f""" + AntiFeatures: + Tracking: {tracking} + NonFreeNet: {nonfreenet} + """ + ) + ) + self.assertEqual( + metadata.parse_yaml_metadata(mf), + { + 'AntiFeatures': { + 'NonFreeNet': {DEFAULT_LOCALE: nonfreenet}, + 'Tracking': {DEFAULT_LOCALE: tracking}, + } + }, + ) + + def test_parse_yaml_metadata_build_antifeatures_old_style(self): + mf = _get_mock_mf( + textwrap.dedent( + """ + AntiFeatures: + - Ads + Builds: + - versionCode: 123 + antifeatures: + - KnownVuln + - UpstreamNonFree + - NonFreeAssets + """ + ) + ) + self.assertEqual( + metadata.parse_yaml_metadata(mf), + { + 'AntiFeatures': {'Ads': {}}, + 'Builds': [ + { + 'antifeatures': { + 'KnownVuln': {}, + 'NonFreeAssets': {}, + 'UpstreamNonFree': {}, + }, + 'versionCode': 123, + } + ], + }, + ) + + def test_parse_yaml_metadata_antifeatures_sort(self): + """All data should end up sorted, to minimize diffs in the index files.""" + self.assertEqual( + metadata.parse_yaml_metadata( + _get_mock_mf( + textwrap.dedent( + """ + Builds: + - versionCode: 123 + antifeatures: + KnownVuln: + es: 2nd + az: zero + en-US: first + UpstreamNonFree: + NonFreeAssets: + AntiFeatures: + NonFreeDep: + Ads: + sw: 2nd + zh-CN: 3rd + de: 1st + """ + ) + ) + ), + { + 'AntiFeatures': { + 'Ads': {'de': '1st', 'sw': '2nd', 'zh-CN': '3rd'}, + 'NonFreeDep': {}, + }, + 'Builds': [ + { + 'antifeatures': { + 'KnownVuln': {'az': 'zero', 'en-US': 'first', 'es': '2nd'}, + 'NonFreeAssets': {}, + 'UpstreamNonFree': {}, + }, + 'versionCode': 123, + } + ], + }, + ) + + def test_parse_yaml_app_antifeatures_str(self): + self.assertEqual( + metadata.parse_yaml_metadata(io.StringIO('AntiFeatures: Tracking')), + {'AntiFeatures': {'Tracking': {}}}, + ) + + def test_parse_yaml_app_antifeatures_bool(self): + self.assertEqual( + metadata.parse_yaml_metadata(io.StringIO('AntiFeatures: true')), + {'AntiFeatures': {'true': {}}}, + ) + + def test_parse_yaml_app_antifeatures_int(self): + self.assertEqual( + metadata.parse_yaml_metadata(io.StringIO('AntiFeatures: 1')), + {'AntiFeatures': {'1': {}}}, + ) + + def test_parse_yaml_app_antifeatures_float(self): + self.assertEqual( + metadata.parse_yaml_metadata(io.StringIO('AntiFeatures: 1.0')), + {'AntiFeatures': {'1.0': {}}}, + ) + + def test_parse_yaml_app_antifeatures_list_float(self): + self.assertEqual( + metadata.parse_yaml_metadata(io.StringIO('AntiFeatures:\n - 1.0\n')), + {'AntiFeatures': {'1.0': {}}}, + ) + + def test_parse_yaml_app_antifeatures_dict_float(self): + mf = io.StringIO('AntiFeatures:\n 0.0: too early\n') + self.assertEqual( + metadata.parse_yaml_metadata(mf), + {'AntiFeatures': {'0.0': {'en-US': 'too early'}}}, + ) + + def test_parse_yaml_app_antifeatures_dict_float_fail_value(self): + mf = io.StringIO('AntiFeatures:\n NoSourceSince: 1.0\n') + self.assertEqual( + metadata.parse_yaml_metadata(mf), + {'AntiFeatures': {'NoSourceSince': {'en-US': '1.0'}}}, + ) + + def test_parse_yaml_metadata_type_stringmap_old_list(self): + mf = _get_mock_mf( + textwrap.dedent( + """ + AntiFeatures: + - Ads + - Tracking + """ + ) + ) + self.assertEqual( + {'AntiFeatures': {'Ads': {}, 'Tracking': {}}}, + metadata.parse_yaml_metadata(mf), + ) + + def test_parse_yaml_app_antifeatures_dict_no_value(self): + mf = io.StringIO( + textwrap.dedent( + """\ + AntiFeatures: + Tracking: + NonFreeNet: + """ + ) + ) + self.assertEqual( + metadata.parse_yaml_metadata(mf), + {'AntiFeatures': {'NonFreeNet': {}, 'Tracking': {}}}, + ) + + def test_parse_yaml_metadata_type_stringmap_transitional(self): + """Support a transitional format, where users just append a text""" + ads = 'Has ad lib in it.' + tracking = 'opt-out reports with ACRA' + mf = _get_mock_mf( + textwrap.dedent( + f""" + AntiFeatures: + - Ads: {ads} + - Tracking: {tracking} + """ + ) + ) + self.assertEqual( + metadata.parse_yaml_metadata(mf), + { + 'AntiFeatures': { + 'Ads': {DEFAULT_LOCALE: ads}, + 'Tracking': {DEFAULT_LOCALE: tracking}, + } + }, + ) + + def test_parse_yaml_app_antifeatures_dict_mixed_values(self): + ads = 'true' + tracking = 'many' + nonfreenet = '1' + mf = io.StringIO( + textwrap.dedent( + f""" + AntiFeatures: + Ads: {ads} + Tracking: {tracking} + NonFreeNet: {nonfreenet} + """ + ) + ) + self.assertEqual( + metadata.parse_yaml_metadata(mf), + { + 'AntiFeatures': { + 'Ads': {DEFAULT_LOCALE: ads}, + 'NonFreeNet': {DEFAULT_LOCALE: nonfreenet}, + 'Tracking': {DEFAULT_LOCALE: tracking}, + } + }, + ) + + def test_parse_yaml_app_antifeatures_stringmap_full(self): + ads = 'watching' + tracking = 'many' + nonfreenet = 'pipes' + nonfreenet_zh = '非免费网络' + self.maxDiff = None + mf = io.StringIO( + textwrap.dedent( + f""" + AntiFeatures: + Ads: + {DEFAULT_LOCALE}: {ads} + Tracking: + {DEFAULT_LOCALE}: {tracking} + NonFreeNet: + {DEFAULT_LOCALE}: {nonfreenet} + zh-CN: {nonfreenet_zh} + """ + ) + ) + self.assertEqual( + metadata.parse_yaml_metadata(mf), + { + 'AntiFeatures': { + 'Ads': {DEFAULT_LOCALE: ads}, + 'NonFreeNet': {DEFAULT_LOCALE: nonfreenet, 'zh-CN': nonfreenet_zh}, + 'Tracking': {DEFAULT_LOCALE: tracking}, + } + }, + ) + def test_write_yaml_1_line_scripts_as_string(self): mf = io.StringIO() app = fdroidserver.metadata.App() @@ -1263,9 +1618,9 @@ class PostMetadataParseTest(unittest.TestCase): fdroidserver.metadata.warnings_action = 'error' def _post_metadata_parse_app_list(self, from_yaml, expected): - app = {'AntiFeatures': from_yaml} + app = {'AllowedAPKSigningKeys': from_yaml} metadata.post_parse_yaml_metadata(app) - return {'AntiFeatures': expected}, app + return {'AllowedAPKSigningKeys': expected}, app def _post_metadata_parse_app_string(self, from_yaml, expected): app = {'Repo': from_yaml} diff --git a/tests/metadata/apk/info.guardianproject.urzip.yaml b/tests/metadata/apk/info.guardianproject.urzip.yaml index a3e75d87..ffe17471 100644 --- a/tests/metadata/apk/info.guardianproject.urzip.yaml +++ b/tests/metadata/apk/info.guardianproject.urzip.yaml @@ -1,4 +1,4 @@ -antiFeatures: !!set {} +antiFeatures: {} features: [] hash: abfb3adb7496611749e7abfb014c5c789e3a02489e48a5c3665110d1b1acd931 hashType: sha256 diff --git a/tests/metadata/apk/org.dyndns.fules.ck.yaml b/tests/metadata/apk/org.dyndns.fules.ck.yaml index b4e16511..876a9c6a 100644 --- a/tests/metadata/apk/org.dyndns.fules.ck.yaml +++ b/tests/metadata/apk/org.dyndns.fules.ck.yaml @@ -1,4 +1,4 @@ -antiFeatures: !!set {} +antiFeatures: {} features: [] hash: 897486e1f857c6c0ee32ccbad0e1b8cd82f6d0e65a44a23f13f852d2b63a18c8 hashType: sha256 diff --git a/tests/metadata/app.with.special.build.params.yml b/tests/metadata/app.with.special.build.params.yml index d268d049..b2daee52 100644 --- a/tests/metadata/app.with.special.build.params.yml +++ b/tests/metadata/app.with.special.build.params.yml @@ -77,6 +77,8 @@ Builds: maven: yes@.. srclibs: - FacebookSDK@sdk-version-3.0.2 + antifeatures: + Tracking: Uses the Facebook SDK. - versionName: 2.1.1-c versionCode: 50 diff --git a/tests/metadata/app.with.special.build.params/en-US/antifeatures/50_Ads.txt b/tests/metadata/app.with.special.build.params/en-US/antifeatures/50_Ads.txt new file mode 100644 index 00000000..982512f0 --- /dev/null +++ b/tests/metadata/app.with.special.build.params/en-US/antifeatures/50_Ads.txt @@ -0,0 +1 @@ +includes ad lib diff --git a/tests/metadata/app.with.special.build.params/en-US/antifeatures/50_Tracking.txt b/tests/metadata/app.with.special.build.params/en-US/antifeatures/50_Tracking.txt new file mode 100644 index 00000000..bc711b96 --- /dev/null +++ b/tests/metadata/app.with.special.build.params/en-US/antifeatures/50_Tracking.txt @@ -0,0 +1 @@ +standard suspects diff --git a/tests/metadata/app.with.special.build.params/en-US/antifeatures/Ads.txt b/tests/metadata/app.with.special.build.params/en-US/antifeatures/Ads.txt new file mode 100644 index 00000000..d7531e59 --- /dev/null +++ b/tests/metadata/app.with.special.build.params/en-US/antifeatures/Ads.txt @@ -0,0 +1 @@ +please no \ No newline at end of file diff --git a/tests/metadata/app.with.special.build.params/en-US/antifeatures/NoSourceSince.txt b/tests/metadata/app.with.special.build.params/en-US/antifeatures/NoSourceSince.txt new file mode 100644 index 00000000..067eb2c4 --- /dev/null +++ b/tests/metadata/app.with.special.build.params/en-US/antifeatures/NoSourceSince.txt @@ -0,0 +1 @@ +no activity diff --git a/tests/metadata/app.with.special.build.params/zh-CN/antifeatures/49_Tracking.txt b/tests/metadata/app.with.special.build.params/zh-CN/antifeatures/49_Tracking.txt new file mode 100644 index 00000000..fea9557e --- /dev/null +++ b/tests/metadata/app.with.special.build.params/zh-CN/antifeatures/49_Tracking.txt @@ -0,0 +1 @@ +Text from zh-CN/49_Tracking.txt \ No newline at end of file diff --git a/tests/metadata/app.with.special.build.params/zh-CN/antifeatures/50_Ads.txt b/tests/metadata/app.with.special.build.params/zh-CN/antifeatures/50_Ads.txt new file mode 100644 index 00000000..f0bc2f11 --- /dev/null +++ b/tests/metadata/app.with.special.build.params/zh-CN/antifeatures/50_Ads.txt @@ -0,0 +1 @@ +包括广告图书馆 diff --git a/tests/metadata/dump/app.with.special.build.params.yaml b/tests/metadata/dump/app.with.special.build.params.yaml new file mode 100644 index 00000000..f53ce361 --- /dev/null +++ b/tests/metadata/dump/app.with.special.build.params.yaml @@ -0,0 +1,373 @@ +AllowedAPKSigningKeys: [] +AntiFeatures: + UpstreamNonFree: {} +ArchivePolicy: 0 versions +AuthorEmail: null +AuthorName: null +AuthorWebSite: null +AutoName: UberSync for Facebook +AutoUpdateMode: None +Binaries: null +Bitcoin: null +Builds: +- androidupdate: [] + antcommands: [] + antifeatures: {} + binary: null + build: '' + buildjni: [] + commit: b3879c973e7cac3a3319 + disable: '' + encoding: null + extlibs: [] + forcevercode: false + forceversion: false + gradle: [] + gradleprops: [] + init: '' + maven: null + ndk: null + novcheck: false + oldsdkloc: false + output: null + patch: [] + postbuild: '' + preassemble: [] + prebuild: '' + rm: [] + scandelete: [] + scanignore: [] + srclibs: [] + subdir: null + submodules: false + sudo: '' + target: null + timeout: null + versionCode: 32 + versionName: 1.0.0 +- androidupdate: [] + antcommands: [] + antifeatures: {} + binary: null + build: '' + buildjni: [] + commit: 252c8dd4c9 + disable: '' + encoding: null + extlibs: [] + forcevercode: false + forceversion: false + gradle: [] + gradleprops: [] + init: '' + maven: null + ndk: null + novcheck: false + oldsdkloc: false + output: null + patch: [] + postbuild: '' + preassemble: [] + prebuild: '' + rm: [] + scandelete: [] + scanignore: [] + srclibs: [] + subdir: null + submodules: false + sudo: '' + target: null + timeout: null + versionCode: 33 + versionName: 1.0.1 +- androidupdate: [] + antcommands: [] + antifeatures: {} + binary: null + build: '' + buildjni: [] + commit: v1.2.0 + disable: '' + encoding: null + extlibs: [] + forcevercode: false + forceversion: false + gradle: [] + gradleprops: [] + init: '' + maven: null + ndk: null + novcheck: false + oldsdkloc: false + output: null + patch: + - appbrain.patch + postbuild: '' + preassemble: [] + prebuild: + - sed -i 's@\(reference.1=\).*@\1$$FacebookSDK$$@' project.properties + - sed -i 's/Class\[\]/Class\\[\]/g' $$FacebookSDK$$/src/com/facebook/model/GraphObject.java + rm: + - libs/appbrain-sdk-android.jar + scandelete: [] + scanignore: [] + srclibs: + - FacebookSDK@sdk-version-3.0.1 + subdir: null + submodules: false + sudo: '' + target: null + timeout: null + versionCode: 39 + versionName: 1.2.0 +- androidupdate: [] + antcommands: [] + antifeatures: {} + binary: null + build: '' + buildjni: [] + commit: v1.2.2 + disable: '' + encoding: null + extlibs: + - android/android-support-v4.jar + forcevercode: false + forceversion: false + gradle: [] + gradleprops: [] + init: '' + maven: null + ndk: null + novcheck: false + oldsdkloc: false + output: null + patch: + - appbrain.patch + postbuild: '' + preassemble: [] + prebuild: + - mv libs/android-support-v4.jar $$FacebookSDK$$/libs/ + - sed -i 's@\(reference.1=\).*@\1$$FacebookSDK$$@' project.properties + - sed -i 's/Class\[\]/Class\\[\]/g' $$FacebookSDK$$/src/com/facebook/model/GraphObject.java + rm: + - libs/appbrain-sdk-android.jar + scandelete: [] + scanignore: [] + srclibs: + - FacebookSDK@sdk-version-3.0.2 + subdir: null + submodules: false + sudo: '' + target: null + timeout: null + versionCode: 42 + versionName: 1.2.2 +- androidupdate: [] + antcommands: [] + antifeatures: {} + binary: null + build: '' + buildjni: [] + commit: 2.1.1 + disable: '' + encoding: null + extlibs: [] + forcevercode: false + forceversion: false + gradle: [] + gradleprops: [] + init: '' + maven: yes + ndk: null + novcheck: false + oldsdkloc: false + output: null + patch: + - manifest-ads.patch + - mobilecore.patch + postbuild: '' + preassemble: [] + prebuild: '' + rm: [] + scandelete: [] + scanignore: [] + srclibs: + - FacebookSDK@sdk-version-3.0.2 + subdir: null + submodules: false + sudo: '' + target: null + timeout: null + versionCode: 48 + versionName: 2.1.1 +- androidupdate: [] + antcommands: [] + antifeatures: + Tracking: + en-US: Uses the Facebook SDK. + binary: null + build: '' + buildjni: [] + commit: 2.1.1 + disable: '' + encoding: null + extlibs: [] + forcevercode: false + forceversion: false + gradle: [] + gradleprops: [] + init: '' + maven: yes@.. + ndk: null + novcheck: false + oldsdkloc: false + output: null + patch: + - manifest-ads.patch + - mobilecore.patch + postbuild: '' + preassemble: [] + prebuild: '' + rm: [] + scandelete: [] + scanignore: [] + srclibs: + - FacebookSDK@sdk-version-3.0.2 + subdir: null + submodules: false + sudo: '' + target: null + timeout: null + versionCode: 49 + versionName: 2.1.1-b +- androidupdate: [] + antcommands: [] + antifeatures: + Ads: + en-US: 'includes ad lib + + ' + zh-CN: '包括广告图书馆 + + ' + Tracking: + en-US: 'standard suspects + + ' + binary: null + build: '' + buildjni: [] + commit: 2.1.1 + disable: '' + encoding: null + extlibs: [] + forcevercode: false + forceversion: false + gradle: [] + gradleprops: [] + init: '' + maven: '2' + ndk: null + novcheck: false + oldsdkloc: false + output: null + patch: + - manifest-ads.patch + - mobilecore.patch + postbuild: '' + preassemble: [] + prebuild: '' + rm: [] + scandelete: [] + scanignore: [] + srclibs: + - FacebookSDK@sdk-version-3.0.2 + subdir: null + submodules: false + sudo: '' + target: null + timeout: null + versionCode: 50 + versionName: 2.1.1-c +- androidupdate: [] + antcommands: [] + antifeatures: {} + binary: null + build: '' + buildjni: [] + commit: null + disable: Labelled as pre-release, so skipped + encoding: null + extlibs: [] + forcevercode: false + forceversion: false + gradle: [] + gradleprops: [] + init: '' + maven: null + ndk: null + novcheck: false + oldsdkloc: false + output: null + patch: [] + postbuild: '' + preassemble: [] + prebuild: '' + rm: [] + scandelete: [] + scanignore: [] + srclibs: [] + subdir: null + submodules: false + sudo: '' + target: null + timeout: null + versionCode: 51 + versionName: 2.1.2 +Categories: +- System +Changelog: '' +CurrentVersion: 2.1.2 +CurrentVersionCode: 49 +Description: 'To configure, go to "Settings => Accounts & Sync => Add Account". Depending + on + + how many friends you have, the first import might take a while, so be patient. + + + * Facebook does not allow to export phone numbers or emails: only names, pictures + and statuses are synced. + + * Facebook users have the option to block one or all apps: if they opt for that, + they will be EXCLUDED from your friends list. + + + Appbrain SDK was removed before building.' +Disabled: null +Donate: null +FlattrID: null +IssueTracker: https://github.com/loadrunner/Facebook-Contact-Sync/issues +Liberapay: null +License: GPL-3.0-only +Litecoin: null +MaintainerNotes: '' +Name: null +NoSourceSince: '' +OpenCollective: null +Provides: null +Repo: https://github.com/loadrunner/Facebook-Contact-Sync.git +RepoType: git +RequiresRoot: false +SourceCode: https://github.com/loadrunner/Facebook-Contact-Sync +Summary: Sync your Facebook Contacts +Translation: '' +UpdateCheckData: null +UpdateCheckIgnore: null +UpdateCheckMode: None +UpdateCheckName: null +VercodeOperation: [] +WebSite: '' +added: null +id: app.with.special.build.params +lastUpdated: null +metadatapath: metadata/app.with.special.build.params.yml diff --git a/tests/metadata/dump/com.politedroid.yaml b/tests/metadata/dump/com.politedroid.yaml index 783308b7..e4f24356 100644 --- a/tests/metadata/dump/com.politedroid.yaml +++ b/tests/metadata/dump/com.politedroid.yaml @@ -1,6 +1,8 @@ AllowedAPKSigningKeys: [] AntiFeatures: -- NonFreeNet + NoSourceSince: + en-US: '1.5' + NonFreeNet: {} ArchivePolicy: 4 versions AuthorEmail: null AuthorName: null @@ -13,9 +15,9 @@ Builds: - androidupdate: [] antcommands: [] antifeatures: - - KnownVuln - - UpstreamNonFree - - NonFreeAssets + KnownVuln: {} + NonFreeAssets: {} + UpstreamNonFree: {} binary: null build: '' buildjni: [] @@ -50,7 +52,7 @@ Builds: versionName: '1.2' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: [] @@ -85,7 +87,7 @@ Builds: versionName: '1.3' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: [] @@ -120,7 +122,7 @@ Builds: versionName: '1.4' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: [] diff --git a/tests/metadata/dump/org.adaway.yaml b/tests/metadata/dump/org.adaway.yaml index d9b26cb9..cf448af3 100644 --- a/tests/metadata/dump/org.adaway.yaml +++ b/tests/metadata/dump/org.adaway.yaml @@ -1,5 +1,5 @@ AllowedAPKSigningKeys: [] -AntiFeatures: [] +AntiFeatures: {} ArchivePolicy: null AuthorEmail: null AuthorName: null @@ -11,7 +11,7 @@ Bitcoin: null Builds: - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: @@ -47,7 +47,7 @@ Builds: versionName: '1.12' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: @@ -84,7 +84,7 @@ Builds: versionName: '1.15' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: @@ -121,7 +121,7 @@ Builds: versionName: '1.18' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: @@ -158,7 +158,7 @@ Builds: versionName: '1.19' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: @@ -195,7 +195,7 @@ Builds: versionName: '1.20' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: @@ -232,7 +232,7 @@ Builds: versionName: '1.21' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: [] @@ -267,7 +267,7 @@ Builds: versionName: '1.23' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: @@ -304,7 +304,7 @@ Builds: versionName: '1.24' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: @@ -341,7 +341,7 @@ Builds: versionName: '1.25' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: @@ -378,7 +378,7 @@ Builds: versionName: '1.26' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: @@ -415,7 +415,7 @@ Builds: versionName: '1.27' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: @@ -453,7 +453,7 @@ Builds: versionName: '1.29' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: [] @@ -491,7 +491,7 @@ Builds: versionName: '1.32' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: [] @@ -528,7 +528,7 @@ Builds: versionName: '1.33' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: [] @@ -566,7 +566,7 @@ Builds: versionName: '1.34' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: [] @@ -604,7 +604,7 @@ Builds: versionName: '1.35' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: [] @@ -642,7 +642,7 @@ Builds: versionName: '1.36' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: [] @@ -684,7 +684,7 @@ Builds: - android-libs/ActionBarSherlock - android-libs/HtmlSpanner/htmlspanner antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: @@ -734,7 +734,7 @@ Builds: - android-libs/ActionBarSherlock - android-libs/HtmlSpanner/htmlspanner antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: @@ -780,7 +780,7 @@ Builds: versionName: '2.3' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: @@ -818,7 +818,7 @@ Builds: versionName: '2.6' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: @@ -856,7 +856,7 @@ Builds: versionName: '2.7' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: @@ -894,7 +894,7 @@ Builds: versionName: '2.8' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: @@ -932,7 +932,7 @@ Builds: versionName: 2.8.1 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: @@ -970,7 +970,7 @@ Builds: versionName: '2.9' - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: @@ -1008,7 +1008,7 @@ Builds: versionName: 2.9.1 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: @@ -1046,7 +1046,7 @@ Builds: versionName: 2.9.2 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: diff --git a/tests/metadata/dump/org.smssecure.smssecure.yaml b/tests/metadata/dump/org.smssecure.smssecure.yaml index af864923..b363b736 100644 --- a/tests/metadata/dump/org.smssecure.smssecure.yaml +++ b/tests/metadata/dump/org.smssecure.smssecure.yaml @@ -1,5 +1,5 @@ AllowedAPKSigningKeys: [] -AntiFeatures: [] +AntiFeatures: {} ArchivePolicy: null AuthorEmail: null AuthorName: null @@ -11,7 +11,7 @@ Bitcoin: null Builds: - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: [] @@ -72,7 +72,7 @@ Builds: versionName: 0.3.3 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: [] @@ -115,7 +115,7 @@ Builds: versionName: 0.3.3 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: [] @@ -156,7 +156,7 @@ Builds: versionName: 0.4.2 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: [] @@ -197,7 +197,7 @@ Builds: versionName: 0.5.1 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: [] @@ -237,7 +237,7 @@ Builds: versionName: 0.5.2 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: [] @@ -277,7 +277,7 @@ Builds: versionName: 0.5.3 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: [] @@ -317,7 +317,7 @@ Builds: versionName: 0.5.4 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: '' buildjni: [] diff --git a/tests/metadata/dump/org.videolan.vlc.yaml b/tests/metadata/dump/org.videolan.vlc.yaml index b1679ab9..f91dfb65 100644 --- a/tests/metadata/dump/org.videolan.vlc.yaml +++ b/tests/metadata/dump/org.videolan.vlc.yaml @@ -1,5 +1,5 @@ AllowedAPKSigningKeys: [] -AntiFeatures: [] +AntiFeatures: {} ArchivePolicy: 9 versions AuthorEmail: null AuthorName: null @@ -14,7 +14,7 @@ Builds: - ../java-libs/SlidingMenu - ../java-libs/ActionBarSherlock antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release @@ -54,7 +54,7 @@ Builds: - ../java-libs/SlidingMenu - ../java-libs/ActionBarSherlock antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi ./compile.sh release @@ -94,7 +94,7 @@ Builds: - ../java-libs/SlidingMenu - ../java-libs/ActionBarSherlock antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release @@ -134,7 +134,7 @@ Builds: - ../java-libs/SlidingMenu - ../java-libs/ActionBarSherlock antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=mips ./compile.sh release @@ -171,7 +171,7 @@ Builds: versionName: 0.0.11-mips - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=mips ./compile.sh release @@ -210,7 +210,7 @@ Builds: versionName: 0.1.3-MIPS - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release @@ -249,7 +249,7 @@ Builds: versionName: 0.1.3-x86 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi ./compile.sh release @@ -288,7 +288,7 @@ Builds: versionName: 0.1.3-ARM - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release @@ -327,7 +327,7 @@ Builds: versionName: 0.1.3-ARMv7 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release @@ -365,7 +365,7 @@ Builds: versionName: 0.9.0 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release @@ -403,7 +403,7 @@ Builds: versionName: 0.9.0 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release @@ -441,7 +441,7 @@ Builds: versionName: 0.9.1 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release @@ -479,7 +479,7 @@ Builds: versionName: 0.9.1 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release @@ -517,7 +517,7 @@ Builds: versionName: 0.9.5 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release @@ -555,7 +555,7 @@ Builds: versionName: 0.9.5 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release @@ -593,7 +593,7 @@ Builds: versionName: 0.9.6 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release @@ -631,7 +631,7 @@ Builds: versionName: 0.9.6 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release @@ -669,7 +669,7 @@ Builds: versionName: 0.9.7 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release @@ -707,7 +707,7 @@ Builds: versionName: 0.9.7 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=mips ./compile.sh release @@ -745,7 +745,7 @@ Builds: versionName: 0.9.7.1 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release @@ -783,7 +783,7 @@ Builds: versionName: 0.9.7.1 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release @@ -821,7 +821,7 @@ Builds: versionName: 0.9.7.1 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release @@ -859,7 +859,7 @@ Builds: versionName: 0.9.8 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi ./compile.sh release @@ -897,7 +897,7 @@ Builds: versionName: 0.9.8 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release @@ -935,7 +935,7 @@ Builds: versionName: 0.9.8 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release @@ -973,7 +973,7 @@ Builds: versionName: 0.9.9 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi ./compile.sh release @@ -1011,7 +1011,7 @@ Builds: versionName: 0.9.9 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release @@ -1049,7 +1049,7 @@ Builds: versionName: 0.9.9 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release @@ -1087,7 +1087,7 @@ Builds: versionName: 0.9.10 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi ./compile.sh release @@ -1125,7 +1125,7 @@ Builds: versionName: 0.9.10 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release @@ -1163,7 +1163,7 @@ Builds: versionName: 0.9.10 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release @@ -1201,7 +1201,7 @@ Builds: versionName: 1.0.0 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi ./compile.sh release @@ -1239,7 +1239,7 @@ Builds: versionName: 1.0.0 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release @@ -1277,7 +1277,7 @@ Builds: versionName: 1.0.0 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=x86 ./compile.sh release @@ -1315,7 +1315,7 @@ Builds: versionName: 1.0.1 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi ./compile.sh release @@ -1353,7 +1353,7 @@ Builds: versionName: 1.0.1 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release @@ -1391,7 +1391,7 @@ Builds: versionName: 1.0.1 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release @@ -1431,7 +1431,7 @@ Builds: versionName: 1.1.3 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release @@ -1471,7 +1471,7 @@ Builds: versionName: 1.1.3 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "x86" --release @@ -1511,7 +1511,7 @@ Builds: versionName: 1.1.3 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release @@ -1551,7 +1551,7 @@ Builds: versionName: 1.1.5 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release @@ -1591,7 +1591,7 @@ Builds: versionName: 1.1.5 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "x86" --release @@ -1631,7 +1631,7 @@ Builds: versionName: 1.1.5 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release @@ -1671,7 +1671,7 @@ Builds: versionName: 1.1.6 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release @@ -1711,7 +1711,7 @@ Builds: versionName: 1.1.6 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "x86" --release @@ -1751,7 +1751,7 @@ Builds: versionName: 1.1.6 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release @@ -1791,7 +1791,7 @@ Builds: versionName: 1.2.0 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release @@ -1831,7 +1831,7 @@ Builds: versionName: 1.2.0 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "x86" --release @@ -1871,7 +1871,7 @@ Builds: versionName: 1.2.0 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release @@ -1911,7 +1911,7 @@ Builds: versionName: 1.2.1 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release @@ -1951,7 +1951,7 @@ Builds: versionName: 1.2.1 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "x86" --release @@ -1991,7 +1991,7 @@ Builds: versionName: 1.2.1 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release @@ -2031,7 +2031,7 @@ Builds: versionName: 1.2.2 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release @@ -2071,7 +2071,7 @@ Builds: versionName: 1.2.2 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "x86" --release @@ -2111,7 +2111,7 @@ Builds: versionName: 1.2.2 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release @@ -2151,7 +2151,7 @@ Builds: versionName: 1.2.3 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release @@ -2191,7 +2191,7 @@ Builds: versionName: 1.2.3 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "x86" --release @@ -2231,7 +2231,7 @@ Builds: versionName: 1.2.3 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release @@ -2271,7 +2271,7 @@ Builds: versionName: 1.2.4 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release @@ -2311,7 +2311,7 @@ Builds: versionName: 1.2.4 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "x86" --release @@ -2351,7 +2351,7 @@ Builds: versionName: 1.2.4 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release @@ -2391,7 +2391,7 @@ Builds: versionName: 1.2.5 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release @@ -2431,7 +2431,7 @@ Builds: versionName: 1.2.5 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "x86" --release @@ -2471,7 +2471,7 @@ Builds: versionName: 1.2.5 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi" --release @@ -2511,7 +2511,7 @@ Builds: versionName: 1.2.6 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "armeabi-v7a" --release @@ -2551,7 +2551,7 @@ Builds: versionName: 1.2.6 - androidupdate: [] antcommands: [] - antifeatures: [] + antifeatures: {} binary: null build: - cd ../ && ./compile.sh -a "x86" --release diff --git a/tests/repo/entry.json b/tests/repo/entry.json index f13e622b..13514cc5 100644 --- a/tests/repo/entry.json +++ b/tests/repo/entry.json @@ -3,8 +3,8 @@ "version": 20002, "index": { "name": "/index-v2.json", - "sha256": "a3c7e88a522a7228937e5c3d760fc239e3578e292035d88478d32fec9ff5eb54", - "size": 52314, + "sha256": "f4979b9db840cb51a99e80c20da676ba42b13133dbaa4819673bc43ed2ffc3f3", + "size": 52481, "numPackages": 10 }, "diffs": {} diff --git a/tests/repo/index-v2.json b/tests/repo/index-v2.json index b59f17bf..fed40fb9 100644 --- a/tests/repo/index-v2.json +++ b/tests/repo/index-v2.json @@ -568,7 +568,9 @@ ] }, "antiFeatures": { - "NoSourceSince": {}, + "NoSourceSince": { + "en-US": "1.5" + }, "NonFreeNet": {} } }, @@ -602,7 +604,9 @@ ] }, "antiFeatures": { - "NoSourceSince": {}, + "NoSourceSince": { + "en-US": "1.5" + }, "NonFreeNet": {} } }, @@ -645,7 +649,9 @@ ] }, "antiFeatures": { - "NoSourceSince": {}, + "NoSourceSince": { + "en-US": "1.5" + }, "NonFreeNet": {} } }, @@ -689,7 +695,9 @@ }, "antiFeatures": { "KnownVuln": {}, - "NoSourceSince": {}, + "NoSourceSince": { + "en-US": "1.5" + }, "NonFreeAssets": {}, "NonFreeNet": {}, "UpstreamNonFree": {} @@ -1395,4 +1403,4 @@ } } } -} +} \ No newline at end of file diff --git a/tests/rewritemeta.TestCase b/tests/rewritemeta.TestCase index 0bcc704e..5e6cda33 100755 --- a/tests/rewritemeta.TestCase +++ b/tests/rewritemeta.TestCase @@ -45,11 +45,11 @@ class RewriteMetaTest(unittest.TestCase): 'versionCode': 3, 'commit': '6a548e4b19', 'target': 'android-10', - 'antifeatures': [ - 'KnownVuln', - 'UpstreamNonFree', - 'NonFreeAssets', - ], + 'antifeatures': { + 'KnownVuln': {}, + 'UpstreamNonFree': {}, + 'NonFreeAssets': {}, + }, }, ) @@ -68,6 +68,24 @@ class RewriteMetaTest(unittest.TestCase): }, ) + def test_remove_blank_flags_from_builds_org_adaway_52(self): + """Unset fields in Builds: entries should be removed.""" + appid = 'org.adaway' + app = metadata.read_metadata({appid: -1})[appid] + builds = rewritemeta.remove_blank_flags_from_builds(app.get('Builds')) + self.assertEqual( + builds[-1], + { + 'buildjni': ['yes'], + 'commit': 'v3.0', + 'gradle': ['yes'], + 'preassemble': ['renameExecutables'], + 'subdir': 'AdAway', + 'versionCode': 52, + 'versionName': '3.0', + }, + ) + def test_remove_blank_flags_from_builds_no_builds(self): """Unset fields in Builds: entries should be removed.""" self.assertEqual( @@ -78,6 +96,24 @@ class RewriteMetaTest(unittest.TestCase): rewritemeta.remove_blank_flags_from_builds(dict()), list(), ) + self.assertEqual( + rewritemeta.remove_blank_flags_from_builds(list()), + list(), + ) + self.assertEqual( + rewritemeta.remove_blank_flags_from_builds(set()), + list(), + ) + self.assertEqual( + rewritemeta.remove_blank_flags_from_builds(tuple()), + list(), + ) + + def test_remove_blank_flags_from_builds_0_is_a_value(self): + self.assertEqual( + rewritemeta.remove_blank_flags_from_builds([{'versionCode': 0}]), + [{'versionCode': 0}], + ) def test_rewrite_no_builds(self): os.chdir(self.testdir) diff --git a/tests/update.TestCase b/tests/update.TestCase index b3234711..24cb4a3c 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -768,7 +768,7 @@ class UpdateTest(unittest.TestCase): '-1': 'res/drawable-mdpi-v4/icon_launcher.png'}) self.assertEqual(apk_info['icons'], {}) self.assertEqual(apk_info['features'], []) - self.assertEqual(apk_info['antiFeatures'], set()) + self.assertEqual(apk_info['antiFeatures'], dict()) self.assertEqual(apk_info['versionName'], 'v1.6pre2') self.assertEqual(apk_info['hash'], '897486e1f857c6c0ee32ccbad0e1b8cd82f6d0e65a44a23f13f852d2b63a18c8') @@ -819,7 +819,7 @@ class UpdateTest(unittest.TestCase): 'hashType': 'sha256', 'packageName': 'no.min.target.sdk', 'features': [], - 'antiFeatures': set(), + 'antiFeatures': dict(), 'size': 14102, 'sig': 'b4964fd759edaa54e65bb476d0276880', 'versionName': '1.2-fake', From b2fc59ef9a52f73d9b8e6eef936219b0c75e41ec Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 12 May 2023 14:28:26 +0200 Subject: [PATCH 1203/2116] gitlab-ci: bump version to compare in metadata_v0 job The previous commit changes the internal representation of antiFeatures from a list to dict. https://gitlab.com/eighthave/fdroidserver/-/jobs/4260622978 --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f26a093a..79fd1143 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -41,7 +41,7 @@ metadata_v0: image: registry.gitlab.com/fdroid/fdroidserver:buildserver variables: GIT_DEPTH: 1000 - RELEASE_COMMIT_ID: 0124b9dde99f9cab19c034cbc7d8cc6005a99b48 # 2.3a0 + RELEASE_COMMIT_ID: 1c2187a53bfb7a92cb9837435ae3717aacf5920d # 2.3a0 script: - git fetch https://gitlab.com/fdroid/fdroidserver.git $RELEASE_COMMIT_ID - cd tests From 7c1d7fb4b313359311af4d8be1c773e635dd2661 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 3 May 2023 21:42:03 +0200 Subject: [PATCH 1204/2116] metadata: check error messages are printed for more cases --- tests/metadata.TestCase | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 3a2879a6..f04d62a8 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -204,7 +204,8 @@ class MetadataTest(unittest.TestCase): ) @mock.patch('git.Repo') - def test_read_metadata(self, git_repo): + @mock.patch('logging.error') + def test_read_metadata(self, logging_error, git_repo): """Read specified metadata files included in tests/, compare to stored output""" self.maxDiff = None @@ -236,6 +237,10 @@ class MetadataTest(unittest.TestCase): # yaml.register_class(metadata.Build) # yaml.dump(frommeta, fp) + # errors are printed when .yml overrides localized + logging_error.assert_called() + self.assertEqual(3, len(logging_error.call_args_list)) + @mock.patch('git.Repo') def test_metadata_overrides_dot_fdroid_yml(self, git_Repo): """Fields in metadata files should override anything in .fdroid.yml.""" @@ -256,7 +261,8 @@ class MetadataTest(unittest.TestCase): metadata.parse_metadata(yml) # should not throw an exception @mock.patch('git.Repo') - def test_rewrite_yaml_fakeotaupdate(self, git_Repo): + @mock.patch('logging.error') + def test_rewrite_yaml_fakeotaupdate(self, logging_error, git_Repo): with tempfile.TemporaryDirectory() as testdir: testdir = Path(testdir) fdroidserver.common.config = {'accepted_formats': ['yml']} @@ -278,6 +284,10 @@ class MetadataTest(unittest.TestCase): (Path('metadata-rewrite-yml') / file_name).read_text(encoding='utf-8'), ) + # errors are printed when .yml overrides localized + logging_error.assert_called() + self.assertEqual(3, len(logging_error.call_args_list)) + @mock.patch('git.Repo') def test_rewrite_yaml_fdroidclient(self, git_Repo): with tempfile.TemporaryDirectory() as testdir: From 784bebfee9eeadb383d4130fb4eed6d1fae46429 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 4 May 2023 17:13:19 +0200 Subject: [PATCH 1205/2116] metadata: keep manually added NoSourceSince in AntiFeatures If the metadata file contains NoSourceSince:, it is added to the collection of Anti-Features. When rewriting the .yml file, NoSourceSince should only be written into the AntiFeatures: collection if there are manual changes, e.g. the user had provided translations. --- fdroidserver/metadata.py | 12 +++++++ tests/metadata.TestCase | 71 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 0e79ade9..b86dd004 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -1033,6 +1033,17 @@ def post_parse_yaml_metadata(yamldata): } +def _del_duplicated_NoSourceSince(app): + # noqa: D403 NoSourceSince is the word. + """NoSourceSince gets auto-added to AntiFeatures, but can also be manually added.""" + key = 'NoSourceSince' + if key in app: + no_source_since = app.get(key) + af_no_source_since = app.get('AntiFeatures', dict()).get(key) + if af_no_source_since == {common.DEFAULT_LOCALE: no_source_since}: + del app['AntiFeatures'][key] + + def write_yaml(mf, app): """Write metadata in yaml format. @@ -1123,6 +1134,7 @@ def write_yaml(mf, app): return builds + _del_duplicated_NoSourceSince(app) yaml_app = _app_to_yaml(app) yaml = ruamel.yaml.YAML() yaml.indent(mapping=4, sequence=4, offset=2) diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index f04d62a8..a687714f 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -1613,6 +1613,77 @@ class MetadataTest(unittest.TestCase): with self.assertRaises(TypeError): build.ndk_path() + def test_del_duplicated_NoSourceSince(self): + app = { + 'AntiFeatures': {'Ads': {}, 'NoSourceSince': {DEFAULT_LOCALE: '1.0'}}, + 'NoSourceSince': '1.0', + } + metadata._del_duplicated_NoSourceSince(app) + self.assertEqual(app, {'AntiFeatures': {'Ads': {}}, 'NoSourceSince': '1.0'}) + + def test_check_manually_extended_NoSourceSince(self): + app = { + 'AntiFeatures': {'NoSourceSince': {DEFAULT_LOCALE: '1.0', 'de': '1,0'}}, + 'NoSourceSince': '1.0', + } + metadata._del_duplicated_NoSourceSince(app) + self.assertEqual( + app, + { + 'AntiFeatures': {'NoSourceSince': {DEFAULT_LOCALE: '1.0', 'de': '1,0'}}, + 'NoSourceSince': '1.0', + }, + ) + + def test_make_sure_nosourcesince_does_not_get_written(self): + appid = 'com.politedroid' + app = metadata.read_metadata({appid: -1})[appid] + builds = app['Builds'] + app['Builds'] = [copy.deepcopy(builds[0])] + mf = io.StringIO() + metadata.write_yaml(mf, app) + mf.seek(0) + self.maxDiff = None + self.assertEqual( + mf.read(), + textwrap.dedent( + """\ + AntiFeatures: + NonFreeNet: {} + Categories: + - Time + License: GPL-3.0-only + SourceCode: https://github.com/miguelvps/PoliteDroid + IssueTracker: https://github.com/miguelvps/PoliteDroid/issues + + AutoName: Polite Droid + Summary: Calendar tool + Description: Activates silent mode during calendar events. + + RepoType: git + Repo: https://github.com/miguelvps/PoliteDroid.git + + Builds: + - versionName: '1.2' + versionCode: 3 + commit: 6a548e4b19 + target: android-10 + antifeatures: + KnownVuln: {} + UpstreamNonFree: {} + NonFreeAssets: {} + + ArchivePolicy: 4 versions + AutoUpdateMode: Version v%v + UpdateCheckMode: Tags + CurrentVersion: '1.5' + CurrentVersionCode: 6 + + NoSourceSince: '1.5' + """ + ), + ) + class PostMetadataParseTest(unittest.TestCase): """Test the functions that post process the YAML input. From 2cb12f959446b6164bf31e67cc15f07365916faa Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 9 May 2023 18:15:10 +0200 Subject: [PATCH 1206/2116] metadata: break out write_yaml to standalone function and add unit tests --- fdroidserver/metadata.py | 164 ++++++++++++++++++++------------------- tests/metadata.TestCase | 43 ++++++++++ 2 files changed, 127 insertions(+), 80 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index b86dd004..6a25a5cc 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -1044,6 +1044,89 @@ def _del_duplicated_NoSourceSince(app): del app['AntiFeatures'][key] +def _field_to_yaml(typ, value): + """Convert data to YAML 1.2 format that keeps the right TYPE_*.""" + if typ == TYPE_STRING: + return str(value) + elif typ == TYPE_INT: + return int(value) + elif typ == TYPE_MULTILINE: + if '\n' in value: + return ruamel.yaml.scalarstring.preserve_literal(str(value)) + else: + return str(value) + elif typ == TYPE_SCRIPT: + if type(value) == list: + if len(value) == 1: + return value[0] + else: + return value + else: + return value + + +def _builds_to_yaml(app): + builds = ruamel.yaml.comments.CommentedSeq() + for build in app.get('Builds', []): + if not isinstance(build, Build): + build = Build(build) + b = ruamel.yaml.comments.CommentedMap() + for field in build_flags: + if hasattr(build, field): + value = getattr(build, field) + if field == 'gradle' and value == ['off']: + value = [ + ruamel.yaml.scalarstring.SingleQuotedScalarString('off') + ] + typ = flagtype(field) + # don't check value == True for TYPE_INT as it could be 0 + if value is not None and (typ == TYPE_INT or value): + b.update({field: _field_to_yaml(typ, value)}) + builds.append(b) + + # insert extra empty lines between build entries + for i in range(1, len(builds)): + builds.yaml_set_comment_before_after_key(i, 'bogus') + builds.ca.items[i][1][-1].value = '\n' + + return builds + + +def _app_to_yaml(app): + cm = ruamel.yaml.comments.CommentedMap() + insert_newline = False + for field in yaml_app_field_order: + if field == '\n': + # next iteration will need to insert a newline + insert_newline = True + else: + if app.get(field) or field == 'Builds': + if field == 'Builds': + if app.get('Builds'): + cm.update({field: _builds_to_yaml(app)}) + elif field == 'CurrentVersionCode': + cm.update({field: _field_to_yaml(TYPE_INT, getattr(app, field))}) + elif field == 'AllowedAPKSigningKeys': + value = getattr(app, field) + if value: + value = [str(i).lower() for i in value] + if len(value) == 1: + cm.update({field: _field_to_yaml(TYPE_STRING, value[0])}) + else: + cm.update({field: _field_to_yaml(TYPE_LIST, value)}) + else: + cm.update({field: _field_to_yaml(fieldtype(field), getattr(app, field))}) + + if insert_newline: + # we need to prepend a newline in front of this field + insert_newline = False + # inserting empty lines is not supported so we add a + # bogus comment and over-write its value + cm.yaml_set_comment_before_after_key(field, 'bogus') + cm.ca.items[field][1][-1].value = '\n' + return cm + + def write_yaml(mf, app): """Write metadata in yaml format. @@ -1053,87 +1136,8 @@ def write_yaml(mf, app): active file discriptor for writing app app metadata to written to the yaml file + """ - def _field_to_yaml(typ, value): - """Convert data to YAML 1.2 format that keeps the right TYPE_*.""" - if typ == TYPE_STRING: - return str(value) - elif typ == TYPE_INT: - return int(value) - elif typ == TYPE_MULTILINE: - if '\n' in value: - return ruamel.yaml.scalarstring.preserve_literal(str(value)) - else: - return str(value) - elif typ == TYPE_SCRIPT: - if type(value) == list: - if len(value) == 1: - return value[0] - else: - return value - else: - return value - - def _app_to_yaml(app): - cm = ruamel.yaml.comments.CommentedMap() - insert_newline = False - for field in yaml_app_field_order: - if field == '\n': - # next iteration will need to insert a newline - insert_newline = True - else: - if app.get(field) or field == 'Builds': - if field == 'Builds': - if app.get('Builds'): - cm.update({field: _builds_to_yaml(app)}) - elif field == 'CurrentVersionCode': - cm.update({field: _field_to_yaml(TYPE_INT, getattr(app, field))}) - elif field == 'AllowedAPKSigningKeys': - value = getattr(app, field) - if value: - value = [str(i).lower() for i in value] - if len(value) == 1: - cm.update({field: _field_to_yaml(TYPE_STRING, value[0])}) - else: - cm.update({field: _field_to_yaml(TYPE_LIST, value)}) - else: - cm.update({field: _field_to_yaml(fieldtype(field), getattr(app, field))}) - - if insert_newline: - # we need to prepend a newline in front of this field - insert_newline = False - # inserting empty lines is not supported so we add a - # bogus comment and over-write its value - cm.yaml_set_comment_before_after_key(field, 'bogus') - cm.ca.items[field][1][-1].value = '\n' - return cm - - def _builds_to_yaml(app): - builds = ruamel.yaml.comments.CommentedSeq() - for build in app.get('Builds', []): - if not isinstance(build, Build): - build = Build(build) - b = ruamel.yaml.comments.CommentedMap() - for field in build_flags: - if hasattr(build, field): - value = getattr(build, field) - if field == 'gradle' and value == ['off']: - value = [ - ruamel.yaml.scalarstring.SingleQuotedScalarString('off') - ] - typ = flagtype(field) - # don't check value == True for TYPE_INT as it could be 0 - if value is not None and (typ == TYPE_INT or value): - b.update({field: _field_to_yaml(typ, value)}) - builds.append(b) - - # insert extra empty lines between build entries - for i in range(1, len(builds)): - builds.yaml_set_comment_before_after_key(i, 'bogus') - builds.ca.items[i][1][-1].value = '\n' - - return builds - _del_duplicated_NoSourceSince(app) yaml_app = _app_to_yaml(app) yaml = ruamel.yaml.YAML() diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index a687714f..bfad7d28 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -1684,6 +1684,49 @@ class MetadataTest(unittest.TestCase): ), ) + def test_app_to_yaml_smokecheck(self): + self.assertTrue( + isinstance(metadata._app_to_yaml(dict()), ruamel.yaml.comments.CommentedMap) + ) + + def test_app_to_yaml_build_list_empty(self): + app = metadata.App({'Builds': [metadata.Build({'rm': []})]}) + self.assertEqual(dict(), metadata._app_to_yaml(app)['Builds'][0]) + + def test_app_to_yaml_build_list_string(self): + app = metadata.App({'Builds': [metadata.Build({'rm': 'one'})]}) + self.assertEqual({'rm': 'one'}, metadata._app_to_yaml(app)['Builds'][0]) + + def test_app_to_yaml_build_list_one(self): + app = metadata.App({'Builds': [metadata.Build({'rm': ['one']})]}) + self.assertEqual({'rm': ['one']}, metadata._app_to_yaml(app)['Builds'][0]) + + def test_app_to_yaml_build_list(self): + app = metadata.App({'Builds': [metadata.Build({'rm': ['b2', 'NO1']})]}) + self.assertEqual({'rm': ['b2', 'NO1']}, metadata._app_to_yaml(app)['Builds'][0]) + + def test_app_to_yaml_AllowedAPKSigningKeys_two(self): + cm = metadata._app_to_yaml(metadata.App({'AllowedAPKSigningKeys': ['b', 'A']})) + self.assertEqual(['b', 'a'], cm['AllowedAPKSigningKeys']) + + def test_app_to_yaml_AllowedAPKSigningKeys_one(self): + cm = metadata._app_to_yaml(metadata.App({'AllowedAPKSigningKeys': ['One']})) + self.assertEqual('one', cm['AllowedAPKSigningKeys']) + + def test_app_to_yaml_int_hex(self): + cm = metadata._app_to_yaml(metadata.App({'CurrentVersionCode': 0xFF})) + self.assertEqual(255, cm['CurrentVersionCode']) + + def test_app_to_yaml_int_underscore(self): + cm = metadata._app_to_yaml(metadata.App({'CurrentVersionCode': 1_2_3})) + self.assertEqual(123, cm['CurrentVersionCode']) + + def test_app_to_yaml_int_0(self): + """Document that 0 values fail to make it through.""" + # TODO it should be possible to use `CurrentVersionCode: 0` + cm = metadata._app_to_yaml(metadata.App({'CurrentVersionCode': 0})) + self.assertFalse('CurrentVersionCode' in cm) + class PostMetadataParseTest(unittest.TestCase): """Test the functions that post process the YAML input. From e8ab84b583c37b2793bef39c25625a7cd434ed41 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 8 May 2023 14:44:01 +0200 Subject: [PATCH 1207/2116] metadata: simplify _app_to_yaml() There are some redundant checks and odd construct: * cm.update({a: b}) --> cm[a] = b * getattr(app, field) --> app.get(field) --- fdroidserver/metadata.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 6a25a5cc..4a818554 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -1100,22 +1100,21 @@ def _app_to_yaml(app): # next iteration will need to insert a newline insert_newline = True else: - if app.get(field) or field == 'Builds': + value = app.get(field) + if value or field == 'Builds': if field == 'Builds': if app.get('Builds'): cm.update({field: _builds_to_yaml(app)}) elif field == 'CurrentVersionCode': - cm.update({field: _field_to_yaml(TYPE_INT, getattr(app, field))}) + cm[field] = _field_to_yaml(TYPE_INT, value) elif field == 'AllowedAPKSigningKeys': - value = getattr(app, field) - if value: - value = [str(i).lower() for i in value] - if len(value) == 1: - cm.update({field: _field_to_yaml(TYPE_STRING, value[0])}) - else: - cm.update({field: _field_to_yaml(TYPE_LIST, value)}) + value = [str(i).lower() for i in value] + if len(value) == 1: + cm[field] = _field_to_yaml(TYPE_STRING, value[0]) + else: + cm[field] = _field_to_yaml(TYPE_LIST, value) else: - cm.update({field: _field_to_yaml(fieldtype(field), getattr(app, field))}) + cm[field] = _field_to_yaml(fieldtype(field), value) if insert_newline: # we need to prepend a newline in front of this field From 0393e46af94e1817f1737cb29ba5fc0861c9326e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 8 May 2023 22:03:25 +0200 Subject: [PATCH 1208/2116] metadata: handle TYPE_STRINGMAP when writing out YAML --- fdroidserver/metadata.py | 58 +++++++- fdroidserver/rewritemeta.py | 1 + .../app.with.special.build.params.yml | 2 +- tests/metadata.TestCase | 139 +++++++++++++++++- tests/rewritemeta.TestCase | 24 +++ 5 files changed, 218 insertions(+), 6 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 4a818554..11549865 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -1033,6 +1033,53 @@ def post_parse_yaml_metadata(yamldata): } +def _format_stringmap(appid, field, stringmap, versionCode=None): + """Format TYPE_STRINGMAP taking into account localized files in the metadata dir. + + If there are any localized versions on the filesystem already, + then move them all there. Otherwise, keep them in the .yml file. + + The directory for the localized files that is named after the + field is all lower case, following the convention set by Fastlane + metadata, and used by fdroidserver. + + """ + app_dir = Path('metadata', appid) + try: + next(app_dir.glob('*/%s/*.txt' % field.lower())) + files = [] + for name, descdict in stringmap.items(): + for locale, desc in descdict.items(): + outdir = app_dir / locale / field.lower() + if versionCode: + filename = '%d_%s.txt' % (versionCode, name) + else: + filename = '%s.txt' % name + outfile = outdir / filename + files.append(str(outfile)) + with outfile.open('w') as fp: + fp.write(desc) + logging.warning( + _('Moving Anti-Features declarations to localized files:') + + '\n' + + '\n'.join(sorted(files)) + ) + return + except StopIteration: + pass + make_list = True + outlist = [] + for name in sorted(stringmap): + outlist.append(name) + descdict = stringmap.get(name) + if descdict and any(descdict.values()): + make_list = False + break + if make_list: + return outlist + return stringmap + + def _del_duplicated_NoSourceSince(app): # noqa: D403 NoSourceSince is the word. """NoSourceSince gets auto-added to AntiFeatures, but can also be manually added.""" @@ -1080,8 +1127,13 @@ def _builds_to_yaml(app): ] typ = flagtype(field) # don't check value == True for TYPE_INT as it could be 0 - if value is not None and (typ == TYPE_INT or value): + if value and typ == TYPE_STRINGMAP: + v = _format_stringmap(app['id'], field, value, build['versionCode']) + if v: + b[field] = v + elif value is not None and (typ == TYPE_INT or value): b.update({field: _field_to_yaml(typ, value)}) + builds.append(b) # insert extra empty lines between build entries @@ -1107,6 +1159,10 @@ def _app_to_yaml(app): cm.update({field: _builds_to_yaml(app)}) elif field == 'CurrentVersionCode': cm[field] = _field_to_yaml(TYPE_INT, value) + elif field == 'AntiFeatures': + v = _format_stringmap(app['id'], field, value) + if v: + cm[field] = v elif field == 'AllowedAPKSigningKeys': value = [str(i).lower() for i in value] if len(value) == 1: diff --git a/fdroidserver/rewritemeta.py b/fdroidserver/rewritemeta.py index b1932502..5a1a6ea0 100644 --- a/fdroidserver/rewritemeta.py +++ b/fdroidserver/rewritemeta.py @@ -99,6 +99,7 @@ def main(): print(path) continue + # TODO these should be moved to metadata.write_yaml() builds = remove_blank_flags_from_builds(app.get('Builds')) if builds: app['Builds'] = builds diff --git a/tests/metadata-rewrite-yml/app.with.special.build.params.yml b/tests/metadata-rewrite-yml/app.with.special.build.params.yml index a31604ae..eeb174b7 100644 --- a/tests/metadata-rewrite-yml/app.with.special.build.params.yml +++ b/tests/metadata-rewrite-yml/app.with.special.build.params.yml @@ -1,5 +1,5 @@ AntiFeatures: - UpstreamNonFree: {} + - UpstreamNonFree Categories: - System License: GPL-3.0-only diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index bfad7d28..fb17c6df 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -1296,6 +1296,87 @@ class MetadataTest(unittest.TestCase): ), ) + def test_write_yaml_build_antifeatures(self): + mf = io.StringIO() + app = metadata.App( + { + 'License': 'Apache-2.0', + 'Builds': [ + metadata.Build( + { + 'versionCode': 102030, + 'versionName': 'v1.2.3', + 'gradle': ['yes'], + 'antifeatures': { + 'a': {}, + 'b': {'de': 'Probe', 'en-US': 'test'}, + }, + } + ), + ], + 'id': 'placeholder', + } + ) + metadata.write_yaml(mf, app) + mf.seek(0) + self.assertEqual( + mf.read(), + textwrap.dedent( + """\ + License: Apache-2.0 + + Builds: + - versionName: v1.2.3 + versionCode: 102030 + gradle: + - yes + antifeatures: + a: {} + b: + de: Probe + en-US: test + """ + ), + ) + + def test_write_yaml_build_antifeatures_old_style(self): + mf = io.StringIO() + app = metadata.App( + { + 'License': 'Apache-2.0', + 'Builds': [ + metadata.Build( + { + 'versionCode': 102030, + 'versionName': 'v1.2.3', + 'gradle': ['yes'], + 'antifeatures': {'b': {}, 'a': {}}, + } + ), + ], + 'id': 'placeholder', + } + ) + metadata.write_yaml(mf, app) + mf.seek(0) + self.assertEqual( + mf.read(), + textwrap.dedent( + """\ + License: Apache-2.0 + + Builds: + - versionName: v1.2.3 + versionCode: 102030 + gradle: + - yes + antifeatures: + - a + - b + """ + ), + ) + def test_write_yaml_make_sure_provides_does_not_get_written(self): mf = io.StringIO() app = fdroidserver.metadata.App() @@ -1649,7 +1730,7 @@ class MetadataTest(unittest.TestCase): textwrap.dedent( """\ AntiFeatures: - NonFreeNet: {} + - NonFreeNet Categories: - Time License: GPL-3.0-only @@ -1669,9 +1750,9 @@ class MetadataTest(unittest.TestCase): commit: 6a548e4b19 target: android-10 antifeatures: - KnownVuln: {} - UpstreamNonFree: {} - NonFreeAssets: {} + - KnownVuln + - NonFreeAssets + - UpstreamNonFree ArchivePolicy: 4 versions AutoUpdateMode: Version v%v @@ -1727,6 +1808,56 @@ class MetadataTest(unittest.TestCase): cm = metadata._app_to_yaml(metadata.App({'CurrentVersionCode': 0})) self.assertFalse('CurrentVersionCode' in cm) + def test_format_stringmap_empty(self): + self.assertEqual( + metadata._format_stringmap('🔥', 'test', dict()), + list(), + ) + + def test_format_stringmap_one_list(self): + self.assertEqual( + metadata._format_stringmap('🔥', 'test', {'Tracking': {}, 'Ads': {}}), + ['Ads', 'Tracking'], + ) + + def test_format_stringmap_one_list_empty_desc(self): + self.assertEqual( + metadata._format_stringmap('🔥', 'test', {'NonFree': {}, 'Ads': {'en': ''}}), + ['Ads', 'NonFree'], + ) + + def test_format_stringmap_three_list(self): + self.assertEqual( + metadata._format_stringmap('🔥', 'test', {'B': {}, 'A': {}, 'C': {}}), + ['A', 'B', 'C'], + ) + + def test_format_stringmap_two_dict(self): + self.assertEqual( + metadata._format_stringmap('🔥', 'test', {'1': {'uz': 'a'}, '2': {}}), + {'1': {'uz': 'a'}, '2': {}}, + ) + + def test_format_stringmap_three_locales(self): + self.assertEqual( + metadata._format_stringmap( + '🔥', 'test', {'AF': {'uz': 'a', 'ko': 'b', 'zh': 'c'}} + ), + {'AF': {'ko': 'b', 'uz': 'a', 'zh': 'c'}}, + ) + + def test_format_stringmap_move_build_antifeatures_to_filesystem(self): + os.chdir(self.testdir) + appid = 'a' + yml = Path('metadata/a.yml') + yml.parent.mkdir() + self.assertEqual( + metadata._format_stringmap( + appid, 'antifeatures', {'AF': {'uz': 'a', 'ko': 'b', 'zh': 'c'}} + ), + {'AF': {'ko': 'b', 'uz': 'a', 'zh': 'c'}}, + ) + class PostMetadataParseTest(unittest.TestCase): """Test the functions that post process the YAML input. diff --git a/tests/rewritemeta.TestCase b/tests/rewritemeta.TestCase index 5e6cda33..244ad9a0 100755 --- a/tests/rewritemeta.TestCase +++ b/tests/rewritemeta.TestCase @@ -180,6 +180,30 @@ class RewriteMetaTest(unittest.TestCase): }, ) + def test_remove_blank_flags_from_builds_app_with_special_build_params_af(self): + """Unset fields in Builds: entries should be removed.""" + appid = 'app.with.special.build.params' + app = metadata.read_metadata({appid: -1})[appid] + builds = rewritemeta.remove_blank_flags_from_builds(app.get('Builds')) + self.assertEqual( + builds[-2], + { + 'antifeatures': { + 'Ads': {'en-US': 'includes ad lib\n', 'zh-CN': '包括广告图书馆\n'}, + 'Tracking': {'en-US': 'standard suspects\n'}, + }, + 'commit': '2.1.1', + 'maven': '2', + 'patch': [ + 'manifest-ads.patch', + 'mobilecore.patch', + ], + 'srclibs': ['FacebookSDK@sdk-version-3.0.2'], + 'versionCode': 50, + 'versionName': '2.1.1-c', + }, + ) + def test_rewrite_scenario_trivial(self): sys.argv = ['rewritemeta', 'a', 'b'] From b0c05842d8c081cf5503b31e8ecc797dc95ed900 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 9 May 2023 13:43:33 +0200 Subject: [PATCH 1209/2116] metadata: RequiresRoot is boolean, according to docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "Set this optional field to ‘True’ if the application requires root privileges to be usable." https://f-droid.org/docs/Build_Metadata_Reference/#RequiresRoot --- fdroidserver/metadata.py | 1 + tests/update.TestCase | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 11549865..4b62878e 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -189,6 +189,7 @@ fieldtypes = { 'MaintainerNotes': TYPE_MULTILINE, 'Categories': TYPE_LIST, 'AntiFeatures': TYPE_STRINGMAP, + 'RequiresRoot': TYPE_BOOL, 'AllowedAPKSigningKeys': TYPE_LIST, 'Builds': TYPE_BUILD, 'VercodeOperation': TYPE_LIST, diff --git a/tests/update.TestCase b/tests/update.TestCase index 24cb4a3c..7c4e4518 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1433,7 +1433,7 @@ class UpdateTest(unittest.TestCase): 'NoSourceSince': '', 'Repo': '', 'RepoType': '', - 'RequiresRoot': '', + 'RequiresRoot': None, 'SourceCode': '', 'Summary': 'rocks.janicerand', 'Translation': '', From 895e0553a0e80c5470558b1f949cf819700bcc6d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 10 May 2023 16:07:05 +0200 Subject: [PATCH 1210/2116] error if a YAML Anti-Feature conflicts with a localized file https://gitlab.com/fdroid/fdroidserver/-/issues/683#note_1383597734 --- fdroidserver/metadata.py | 18 +++++++++++++-- tests/metadata.TestCase | 49 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 4b62878e..869253c7 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -1049,6 +1049,7 @@ def _format_stringmap(appid, field, stringmap, versionCode=None): try: next(app_dir.glob('*/%s/*.txt' % field.lower())) files = [] + overwrites = [] for name, descdict in stringmap.items(): for locale, desc in descdict.items(): outdir = app_dir / locale / field.lower() @@ -1058,8 +1059,21 @@ def _format_stringmap(appid, field, stringmap, versionCode=None): filename = '%s.txt' % name outfile = outdir / filename files.append(str(outfile)) - with outfile.open('w') as fp: - fp.write(desc) + if outfile.exists(): + if desc != outfile.read_text(): + overwrites.append(str(outfile)) + else: + if not outfile.parent.exists(): + outfile.parent.mkdir(parents=True) + outfile.write_text(desc) + if overwrites: + _warn_or_exception( + _( + 'Conflicting "{field}" definitions between .yml and localized files:' + ).format(field=field) + + '\n' + + '\n'.join(sorted(overwrites)) + ) logging.warning( _('Moving Anti-Features declarations to localized files:') + '\n' diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index fb17c6df..59c2bafe 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -1858,6 +1858,55 @@ class MetadataTest(unittest.TestCase): {'AF': {'ko': 'b', 'uz': 'a', 'zh': 'c'}}, ) + def test_format_stringmap_app_antifeatures_conflict(self): + """Raise an error if a YAML Anti-Feature conflicts with a localized file.""" + os.chdir(self.testdir) + appid = 'a' + field = 'AntiFeatures' + locale = 'ko' + yml = Path('metadata/a.yml') + antifeatures_ko = yml.parent / appid / locale / field.lower() + antifeatures_ko.mkdir(parents=True) + afname = 'Anti-🔥' + (antifeatures_ko / (afname + '.txt')).write_text('SOMETHING ELSE') + with self.assertRaises(MetaDataException): + metadata._format_stringmap( + appid, field, {afname: {'uz': 'a', locale: 'b', 'zh': 'c'}} + ) + + def test_format_stringmap_app_antifeatures_conflict_same_contents(self): + """Raise an error if a YAML Anti-Feature conflicts with a localized file.""" + os.chdir(self.testdir) + appid = 'a' + field = 'AntiFeatures' + locale = 'ko' + yml = Path('metadata/a.yml') + antifeatures_ko = yml.parent / appid / locale / field.lower() + antifeatures_ko.mkdir(parents=True) + afname = 'Anti-🔥' + (antifeatures_ko / (afname + '.txt')).write_text('b') + metadata._format_stringmap( + appid, field, {afname: {'uz': 'a', locale: 'b', 'zh': 'c'}} + ) + + def test_format_stringmap_build_antifeatures_conflict(self): + """Raise an error if a YAML Anti-Feature conflicts with a localized file.""" + os.chdir(self.testdir) + appid = 'a' + field = 'antifeatures' + locale = 'ko' + versionCode = 123 + yml = Path('metadata/a.yml') + antifeatures_ko = yml.parent / appid / locale / field.lower() + antifeatures_ko.mkdir(parents=True) + afname = 'Anti-🔥' + with (antifeatures_ko / ('%d_%s.txt' % (versionCode, afname))).open('w') as fp: + fp.write('SOMETHING ELSE') + with self.assertRaises(MetaDataException): + metadata._format_stringmap( + appid, field, {afname: {'uz': 'a', locale: 'b', 'zh': 'c'}}, versionCode + ) + class PostMetadataParseTest(unittest.TestCase): """Test the functions that post process the YAML input. From f68b77a93359948f47920bc96f78934f5384239d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 23 May 2023 11:46:50 +0200 Subject: [PATCH 1211/2116] use pathlib's read_text() to avoid confusin intended blocks --- fdroidserver/metadata.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 869253c7..abef3e7a 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -880,8 +880,7 @@ def parse_localized_antifeatures(app): app['AntiFeatures'] = dict() if f.stem not in app['AntiFeatures']: app['AntiFeatures'][f.stem] = dict() - with f.open() as fp: - app['AntiFeatures'][f.stem][locale] = fp.read() + app['AntiFeatures'][f.stem][locale] = f.read_text() def _normalize_type_string(v): From dbf163e03fd57641057a0c145af93f97ba21c01e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 23 May 2023 12:07:56 +0200 Subject: [PATCH 1212/2116] test to check that the right Builds flag values get removed --- tests/rewritemeta.TestCase | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/rewritemeta.TestCase b/tests/rewritemeta.TestCase index 244ad9a0..9d20550f 100755 --- a/tests/rewritemeta.TestCase +++ b/tests/rewritemeta.TestCase @@ -115,6 +115,25 @@ class RewriteMetaTest(unittest.TestCase): [{'versionCode': 0}], ) + def test_remove_blank_flags_from_builds_values_to_purge(self): + self.assertEqual( + rewritemeta.remove_blank_flags_from_builds( + [ + { + 'antifeatures': dict(), + 'forceversion': False, + 'init': None, + 'rm': '', + 'scandelete': list(), + 'versionCode': 0, + }, + {'antifeatures': list(), 'versionCode': 1}, + {'antifeatures': '', 'versionCode': 2}, + ] + ), + [{'versionCode': 0}, {'versionCode': 1}, {'versionCode': 2}], + ) + def test_rewrite_no_builds(self): os.chdir(self.testdir) Path('metadata').mkdir() From fc9afc83b88c0d8fcf26e29685f3a0f7d86dbf98 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 24 May 2023 22:35:14 +0200 Subject: [PATCH 1213/2116] gitlab-ci: update metadata_v0 job for RequiresRoot: as TYPE_BOOL b0c05842d8c081cf5503b31e8ecc797dc95ed900 !1350 --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 79fd1143..0978622d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -41,7 +41,7 @@ metadata_v0: image: registry.gitlab.com/fdroid/fdroidserver:buildserver variables: GIT_DEPTH: 1000 - RELEASE_COMMIT_ID: 1c2187a53bfb7a92cb9837435ae3717aacf5920d # 2.3a0 + RELEASE_COMMIT_ID: b0c05842d8c081cf5503b31e8ecc797dc95ed900 # 2.3a0 script: - git fetch https://gitlab.com/fdroid/fdroidserver.git $RELEASE_COMMIT_ID - cd tests From c5ef3d19cdfbfed61727bbbc9a344b79e2ddd69d Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Thu, 9 Mar 2023 13:54:54 +0100 Subject: [PATCH 1214/2116] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ Translation: F-Droid/F-Droid Server --- locale/el/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/es_AR/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/id/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/sv/LC_MESSAGES/fdroidserver.po | 7 ++++++- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index 04369d10..2e60d742 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-02-21 14:38+0100\n" +"POT-Creation-Date: 2023-03-09 13:11+0100\n" "PO-Revision-Date: 2021-02-18 17:50+0000\n" "Last-Translator: Michalis \n" "Language-Team: Greek \n" @@ -1388,6 +1388,11 @@ msgstr "" msgid "Running wget in {path}" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "SHA-256 of {url} does not match entry!" +msgstr "" + #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index 85bf97c2..89d13767 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-02-21 14:38+0100\n" +"POT-Creation-Date: 2023-03-09 13:11+0100\n" "PO-Revision-Date: 2021-04-10 21:26+0000\n" "Last-Translator: Germe the fur star \n" "Language-Team: Spanish (Argentina) \n" @@ -1398,6 +1398,11 @@ msgstr "" msgid "Running wget in {path}" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "SHA-256 of {url} does not match entry!" +msgstr "" + #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index c2af94c8..1f55e1e3 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-02-21 14:38+0100\n" +"POT-Creation-Date: 2023-03-09 13:11+0100\n" "PO-Revision-Date: 2021-06-23 23:32+0000\n" "Last-Translator: whenwesober \n" "Language-Team: Indonesian \n" @@ -1386,6 +1386,11 @@ msgstr "" msgid "Running wget in {path}" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "SHA-256 of {url} does not match entry!" +msgstr "" + #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index 02a85bfe..cfa52c2b 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-02-21 14:38+0100\n" +"POT-Creation-Date: 2023-03-09 13:11+0100\n" "PO-Revision-Date: 2021-10-16 13:25+0000\n" "Last-Translator: Kristoffer Grundström \n" "Language-Team: Swedish \n" @@ -1385,6 +1385,11 @@ msgstr "" msgid "Running wget in {path}" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "SHA-256 of {url} does not match entry!" +msgstr "" + #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." msgstr "" From 544fa1bb4df655e17e7c2c7125a6faa5fd2c546e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 24 May 2023 22:19:39 +0200 Subject: [PATCH 1215/2116] make -C locale update --- locale/ar/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/bg/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/bn/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/bo/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/ca/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/cs/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/cy/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/de/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/el/LC_MESSAGES/fdroidserver.po | 146 ++++++++------- locale/es/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/es_AR/LC_MESSAGES/fdroidserver.po | 204 ++++++++------------- locale/es_MX/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/eu/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/fa/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/fdroidserver.pot | 78 +++++++- locale/fi/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/fr/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/fy/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/he/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/hi/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/hu/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/id/LC_MESSAGES/fdroidserver.po | 149 +++++++-------- locale/it/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/ja/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/kab/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/ko/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/ml/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/nl/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/pl/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/pt/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/ro/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/ru/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/sk/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/sq/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/sr/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/sv/LC_MESSAGES/fdroidserver.po | 124 ++++++++----- locale/ta/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/tr/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/tzm/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/ug/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/uk/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 76 +++++++- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 76 +++++++- 46 files changed, 3451 insertions(+), 366 deletions(-) diff --git a/locale/ar/LC_MESSAGES/fdroidserver.po b/locale/ar/LC_MESSAGES/fdroidserver.po index 0d4983c6..d47e62c6 100644 --- a/locale/ar/LC_MESSAGES/fdroidserver.po +++ b/locale/ar/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2023-01-16 23:52+0000\n" "Last-Translator: Ahmad0a \n" "Language-Team: Arabic \n" @@ -177,9 +177,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -220,6 +230,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -264,6 +278,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -273,6 +291,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -286,6 +308,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -381,6 +408,11 @@ msgstr "اﻷمر '%s' لم يتم التعرف عليه.\n" msgid "Commit changes" msgstr "التزم بالتغييرات" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -567,6 +599,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -612,6 +654,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -829,6 +875,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1040,6 +1091,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1802,6 +1857,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2309,6 +2369,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2380,6 +2444,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2501,6 +2570,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/bg/LC_MESSAGES/fdroidserver.po b/locale/bg/LC_MESSAGES/fdroidserver.po index 7fa15b82..07b80592 100644 --- a/locale/bg/LC_MESSAGES/fdroidserver.po +++ b/locale/bg/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -176,9 +176,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -219,6 +229,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -263,6 +277,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -272,6 +290,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -285,6 +307,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -380,6 +407,11 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -566,6 +598,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -611,6 +653,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -828,6 +874,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1039,6 +1090,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1801,6 +1856,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2306,6 +2366,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2377,6 +2441,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2498,6 +2567,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index 4b88aff5..08bda543 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2021-02-12 09:48+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali \n" @@ -177,9 +177,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -220,6 +230,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -264,6 +278,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -273,6 +291,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -286,6 +308,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -381,6 +408,11 @@ msgstr "'%s' কমান্ড চিনা যায়নি।\n" msgid "Commit changes" msgstr "পরিবর্তন জমা দাও" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -567,6 +599,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -612,6 +654,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -829,6 +875,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1040,6 +1091,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1802,6 +1857,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2308,6 +2368,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2379,6 +2443,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2500,6 +2569,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index a2567af2..f8ceac42 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tibetan \n" @@ -182,9 +182,19 @@ msgstr "'{path}1' ལག་བསྟར་ཐུབ་མ་སོང་།!" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' ཁུངས་ལྡན་རེད་མིན་འདུག{field} འདི་ནང་ {appid}. Regex འགྲོ་ལུགས་: {pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "'{value}' ཁུངས་ལྡན་རེད་མིན་འདུག{field} འདི་ནང་ {appid}. Regex འགྲོ་ལུགས་: {pattern}" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -225,6 +235,10 @@ msgstr "{name}ཁོ་ནའི་ཆེད་དུ་རེ་པོ་གས msgid "Alias of the repo signing key in the keystore" msgstr "ལྡེ་མིག་གསོག་ཉར་ཁང་ནང་རེ་པོ་མིང་རྟགས་ལྡེ་མིག་བཀོད་པའི་གསང་མིང་།" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "ཐོག་མའི་ནང་འདྲེན་བྱེད་པའི་སྐབས་གསལ་པོའི་ཐོག་ནས་སྐྱར་སྦྱོང་(ཡང་ན་གིཊ་ཡན་ལག་)མི་འདྲ་བ་རྣམས་ལ་ཆོག་མཆན་སྤྲོད།" @@ -269,6 +283,10 @@ msgstr "ཨེན་ཀྲོཌSDKཐབས་ལམ་ '{path}1' ཡིག་ msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -278,6 +296,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "མཉེན་ཆས་འདི་'{repo}1ནང་འདུག འོན་ཀྱང་སྦྲེལ་མཐུད་དེ་ {url}2ཡོད།" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Appending .git ངེས་པར་དགོས་ཀྱི་མེད།" @@ -291,6 +313,11 @@ msgstr "མཛོད་ཁང་{apkfilename} ལ་ཁུངས་ལྡན་ msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -385,6 +412,11 @@ msgstr "བཀའ་ཁྱབ་ '%s 1'ངོས་འཛིན་ཐུབ་ msgid "Commit changes" msgstr "བསྒྱུར་བ་གཏོང་བར་མོས་མཐུན་ཡོད།" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -575,6 +607,16 @@ msgstr "མཛོད་ཁང་ཕབ་ལེན་ཐེངས་གཅིག msgid "Downloading {url} failed. {error}" msgstr "{url} ཕབ་ལེན་ཐུབ་མ་སོང་།{error}" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -622,6 +664,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "རེ་པོ་ཁ་བྱང་ལེན་སྐབས་ནོར་སྐྱོན།" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -842,6 +888,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "རྒྱབ་ལྗོངས་ཡིག་ཆ་མེད་པའི་ཐུམ་སྒྲིལ་ཡ་ལན་མ་བྱས། " @@ -1055,6 +1106,10 @@ msgstr "" msgid "Missing output directory" msgstr "ཕྱོགས་དེབ་ཐོན་སྐྱེད་བོར་བརླག" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1822,6 +1877,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "སྐྱར་བྲིས་ཡོད་།{path}" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, fuzzy, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2335,6 +2395,10 @@ msgstr "གནས་སྟངས་ལ་གཞིགས་པའི་རྩོ msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2406,6 +2470,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2526,6 +2595,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index 9c9337a8..a5206737 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -176,9 +176,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -219,6 +229,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -263,6 +277,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -272,6 +290,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -285,6 +307,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -380,6 +407,11 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -566,6 +598,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -611,6 +653,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -828,6 +874,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1039,6 +1090,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1801,6 +1856,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2306,6 +2366,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2377,6 +2441,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2498,6 +2567,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 78e9f778..e4e8b532 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2023-02-26 16:37+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" @@ -186,9 +186,19 @@ msgstr "'{path}' nepodařilo se provést!" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' není platný {field} v {appid}. Vzor regulárního výrazu: {pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "'{value}' není platný {field} v {appid}. Vzor regulárního výrazu: {pattern}" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -229,6 +239,10 @@ msgstr "Přidání nového repozitáře pouze pro {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias podepisovacího klíče repozitáře v keystore" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Umožňuje zadat jinou revizi (nebo větev gitu) pro počáteční import" @@ -273,6 +287,10 @@ msgstr "Cesta Android SDK '{path}' není adresář!" msgid "Android SDK tool {cmd} not found!" msgstr "Nástroj Android SDK {cmd} nenalezen!" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Aplikace má NoSourceSince nebo ArchivePolicy \"0 versions\", ale AutoUpdateMode nebo UpdateCheckMode nejsou None" @@ -282,6 +300,10 @@ msgstr "Aplikace má NoSourceSince nebo ArchivePolicy \"0 versions\", ale AutoUp msgid "App is in '{repo}' but has a link to {url}" msgstr "Aplikace je v repozitáři '{repo}' ale má odkaz na {url}" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Přidání .git není nutné" @@ -295,6 +317,11 @@ msgstr "Archivování {apkfilename} s neplatným podpisem!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode s UpdateCheckMode: HTTP musí mít vzor." +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Základní adresa URL pro zrcadlení, může obsahovat klíč pro podepisování indexu pomocí řetězce dotazu: ?fingerprint=" @@ -391,6 +418,11 @@ msgstr "Příkaz '%s' nebyl rozpoznán.\n" msgid "Commit changes" msgstr "Odeslat změny" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Konfliktní argumenty: '--verbose' a '--quiet' nelze zadat současně." @@ -577,6 +609,16 @@ msgstr "Stahování repozitáře již jednou selhalo, nezkouším to znovu." msgid "Downloading {url} failed. {error}" msgstr "Stahování {url} selhalo. {error}" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -626,6 +668,10 @@ msgstr "Proměnná prostředí {var} z {configname} není nastavena!" msgid "Error while getting repo address" msgstr "Chyba při získávání adresy repozitáře" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Extrahovat metadata aplikace ze zdrojového repozitáře" @@ -843,6 +889,11 @@ msgstr "Ignorování pole ‚{field}‘ v metadatech ‚{metapath}‘, protože msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Ignorování vstupu FUNDING.yml delšího než 2048: %s" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorování balíčku bez metadat: " @@ -1054,6 +1105,10 @@ msgstr "Zrcadlení celého repozitáře a archivu, všechny typy souborů." msgid "Missing output directory" msgstr "Chybějící výstupní adresář" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "V souboru config.yml není nastaven \"repo_pubkey\" ani \"keystorepass\"" @@ -1824,6 +1879,11 @@ msgstr "Používám jarsigner Javy, není doporučeno pro ověřování APK! Pou msgid "Using androguard from \"{path}\"" msgstr "Používám androguard z „{path}“" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2331,6 +2391,10 @@ msgstr "poziční argumenty" msgid "process log deploy {path} to {dest} failed!" msgstr "proces nasazení protokolu {path} do {dest} selhal!" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2402,6 +2466,11 @@ msgstr "scribls chybí název a/nebo @" msgid "static library" msgstr "statická knihovna" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2524,6 +2593,11 @@ msgstr "{appid}: {field} musí být '{type}', ale je '{fieldtype}'!" msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} musí být celé číslo, nalezeno: {value}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "{build_flag} musí být celé číslo, nalezeno: {value}" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/cy/LC_MESSAGES/fdroidserver.po b/locale/cy/LC_MESSAGES/fdroidserver.po index 3dba74ee..6b73df22 100644 --- a/locale/cy/LC_MESSAGES/fdroidserver.po +++ b/locale/cy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2021-01-16 21:23+0000\n" "Last-Translator: Aled Powell \n" "Language-Team: Welsh \n" @@ -181,9 +181,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -224,6 +234,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -268,6 +282,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -277,6 +295,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -290,6 +312,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -389,6 +416,11 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -575,6 +607,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -620,6 +662,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -837,6 +883,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1048,6 +1099,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1821,6 +1876,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2335,6 +2395,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2406,6 +2470,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2531,6 +2600,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 327cef6e..8cad2b1e 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -23,7 +23,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2023-02-26 16:37+0000\n" "Last-Translator: VfBFan \n" "Language-Team: German \n" @@ -199,9 +199,19 @@ msgstr "„{path}” konnte nicht ausgeführt werden!" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "„{value}” ist kein gültiges {field} in {appid}. Regex-Muster: {pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "„{value}” ist kein gültiges {field} in {appid}. Regex-Muster: {pattern}" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -242,6 +252,10 @@ msgstr "Nur für {name} eine neue Repro hinzufügen" msgid "Alias of the repo signing key in the keystore" msgstr "Pseudonym des Repository-Signierchlüssels im Schlüsselspeicher" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Ermöglicht die Bestimmung unterschiedlicher Überarbeitungen (oder Git-Zweige) für den Erstimport" @@ -286,6 +300,10 @@ msgstr "Android-SDK-Pfad »{path}« ist kein Verzeichnis!" msgid "Android SDK tool {cmd} not found!" msgstr "Android-SDK-Tool {cmd} nicht gefunden!" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "App hat NoSourceSince oder ArchivePolicy \"0 Versionen\", aber AutoUpdateMode oder UpdateCheckMode sind nicht None" @@ -295,6 +313,10 @@ msgstr "App hat NoSourceSince oder ArchivePolicy \"0 Versionen\", aber AutoUpdat msgid "App is in '{repo}' but has a link to {url}" msgstr "App befindet sich in „{repo}”, enthält aber einen Verweis auf {url}" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Das Anhängen von .git ist nicht notwendig" @@ -308,6 +330,11 @@ msgstr "Archivierung von {apkfilename} mit ungültiger Signatur!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode mit UpdateCheckMode: HTTP muss ein Muster haben." +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Basis-URL zum Spiegeln, kann den Index-Signierungsschlüssel mit Hilfe des Abfrage-Strings enthalten: ?fingerprint=" @@ -403,6 +430,11 @@ msgstr "Befehl '%s' nicht erkannt.\n" msgid "Commit changes" msgstr "Änderungen übergeben" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Widersprüchliche Argumente: '--verbose' und '--quiet' können nicht gleichzeitig angegeben werden." @@ -589,6 +621,16 @@ msgstr "Herunterladen des Repositorys bereits einmal fehlgeschlagen, versuche es msgid "Downloading {url} failed. {error}" msgstr "Herunterladen von {url} fehlgeschlagen. {error}" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -638,6 +680,10 @@ msgstr "Umgebungsvariable {var} von {configname} ist nicht gesetzt!" msgid "Error while getting repo address" msgstr "Fehler bei der Ermittlung der Repro-Adresse" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Extrahieren von Anwendungsmetadaten aus einem Quell-Repository" @@ -855,6 +901,11 @@ msgstr "'{field}' in '{metapath}' Metadaten wird ignoriert, da es veraltet ist." msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Ignoriere FUNDING.yml Einträge länger als 2048: %s" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignoriere Paket ohne Metadaten: " @@ -1066,6 +1117,10 @@ msgstr "Spiegeln Sie die komplette Paketquelle und das Archiv, inklusive aller D msgid "Missing output directory" msgstr "Fehlendes Ausgabeverzeichnis" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Weder \"repo_pubkey\" noch \"keystorepass\" in config.yml gesetzt" @@ -1835,6 +1890,11 @@ msgstr "Von Java jarsigner zur Verifikation von APKs wird abgeraten! Verwenden S msgid "Using androguard from \"{path}\"" msgstr "Verwende Androguard von \"{path}\"" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2340,6 +2400,10 @@ msgstr "Positionsparameter" msgid "process log deploy {path} to {dest} failed!" msgstr "Bereitstellen des Process Log {path} auf {dest} ist fehlgeschlagen!" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2411,6 +2475,11 @@ msgstr "Srclibs-Name fehlt und/oder @" msgid "static library" msgstr "statische Bibliothek" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2532,6 +2601,11 @@ msgstr "{appid}: {field} muss ein '{type}' sein, ist aber ein '{fieldtype}'!" msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} muss ein Integer sein, gefunden: {value}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "{build_flag} muss ein Integer sein, gefunden: {value}" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index 2e60d742..6596813b 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2021-02-18 17:50+0000\n" "Last-Translator: Michalis \n" "Language-Team: Greek \n" @@ -183,9 +183,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -226,6 +236,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -270,6 +284,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -279,6 +297,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -292,6 +314,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -387,6 +414,11 @@ msgstr "Η εντολή «%s» δεν αναγνωρίζεται.\n" msgid "Commit changes" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -573,6 +605,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -618,6 +660,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -835,6 +881,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1046,6 +1097,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1808,6 +1863,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2295,7 +2355,6 @@ msgstr "προεραιτικά επιχειρήματα" #: /usr/lib/python3.11/argparse.py #, fuzzy -#| msgid "Options" msgid "options" msgstr "Επιλογές" @@ -2315,6 +2374,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2386,6 +2449,11 @@ msgstr "" msgid "static library" msgstr "στατική βιβλιοθήκη" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2507,6 +2575,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" @@ -2573,72 +2646,3 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "" msgstr[1] "" - -#~ msgid "" -#~ "\n" -#~ " This is a repository of apps to be used with FDroid. Applications in this\n" -#~ " repository are either official binaries built by the original application\n" -#~ " developers, or are binaries built from source by f-droid.org using the\n" -#~ " tools on https://gitlab.com/fdroid.\n" -#~ " " -#~ msgstr "" -#~ "\n" -#~ " Αυτό είναι ένα αποθετήριο εφαρμογών που θα χρησιμοποιηθεί με το FDroid. Οι εφαρμογές\n" -#~ " σε αυτό το αποθετήριο είναι είτε επίσημα δυαδικά αρχεία που δημιουργήθηκαν από τους\n" -#~ " προγραμματιστές της εφαρμογής ή είναι δυαδικά αρχεία που έχουν δημιουργηθεί από \n" -#~ " την πηγή με το f-droid.org χρησιμοποιώντας τα εργαλεία στο https://gitlab.com/fdroid.\n" -#~ " " - -#~ msgid "" -#~ "\n" -#~ "SSH Public Key to be used as Deploy Key:" -#~ msgstr "" -#~ "\n" -#~ "Δημόσιο κλειδί SSH που θα χρησιμοποιηθεί ως κλειδί ανάπτυξης:" - -#~ msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -#~ msgstr "Το \"repo_pubkey\" πρέπει να υπάρχει στο config.yml όταν χρησιμοποιείτε το --nosign!" - -#, python-brace-format -#~ msgid "\"{path}\" is not an accepted format, convert to: {formats}" -#~ msgstr "Το \"{path}\" δεν είναι αποδεκτή μορφή, μετατροπή σε: {formats}" - -#, python-format -#~ msgid "%(prog)s [options] url" -#~ msgstr "%(prog)s [επιλογές] url" - -#~ msgid "Add a new application from its source code" -#~ msgstr "Προσθήκη μίας νέας εφαρμογής από τον πηγαίο κώδικα" - -#~ msgid "Dynamically scan APKs post build" -#~ msgstr "Δυναμική σάρωση APK μετά τη δημιουργία" - -#~ msgid "Produce human-readable index.xml" -#~ msgstr "Δημιούργησε index.xml αναγνώσιμο από τον άνθρωπο" - -#, python-brace-format -#~ msgid "Unrecognised field '{field}' in {linedesc}" -#~ msgstr "Μη αναγνωρίσιμος τομέας«{field}» σε {linedesc}" - -#, python-brace-format -#~ msgid "Unsupported metadata format, use: --to [{supported}]" -#~ msgstr "Μη υποστηριζόμενη μορφή μεταδεδομένων, χρησιμοποίησε: --to [{supported}]" - -#~ msgid "Unterminated ]" -#~ msgstr "Ημιτελής ]" - -#~ msgid "Unterminated ]]" -#~ msgstr "Ημιτελής ]]" - -#, python-format -#~ msgid "can't open '%s': %s" -#~ msgstr "δεν είναι δυνατό το άνοιγμα του '%s': %s" - -#~ msgid "force errors to be warnings, or ignore" -#~ msgstr "Επιβάλετε τα σφάλματα ως προειδοποιήσεις ή αγνοήστε τα" - -#~ msgid "usage: fdroid [-h|--help|--version] []" -#~ msgstr "χρήση: fdroid [-h|--help|--version] []" - -#~ msgid "Update the stats of the repo" -#~ msgstr "Ενημέρωση των στατιστικών του αποθετηρίου" diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index d5a6a0d3..3ca3aa30 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2022-12-09 13:49+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" @@ -193,9 +193,19 @@ msgstr "¡Falló la ejecución de '{path}'!" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' no es un {field} válido en {appid}. Patrón de expresión regular: {pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "'{value}' no es un {field} válido en {appid}. Patrón de expresión regular: {pattern}" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -236,6 +246,10 @@ msgstr "Agregando nuevo repo solamente para {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias de la clave de firma de repositorio en el depósitio de claves" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Permite especificar una revisión diferente (o git sector) para la importación inicial" @@ -280,6 +294,10 @@ msgstr "¡La ruta al SDK de Android '{path}' no es un directorio!" msgid "Android SDK tool {cmd} not found!" msgstr "¡No se encontró la herramienta {cmd} del SDK de Android!" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -289,6 +307,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "La aplicación está en '{repo}' pero tiene un enlace a {url}" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "No es necesario agregar .git" @@ -302,6 +324,11 @@ msgstr "¡Archivando {apkfilename} con una firma inválida!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL base para replicar, puede incluir la clave de firma del índice usando la cadena de consulta: ?fingerprint=" @@ -397,6 +424,11 @@ msgstr "No se reconoció la orden «%s».\n" msgid "Commit changes" msgstr "Aplicar cambios" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumentos incompatibles: No se puede especificar \"--verbose\" y \"--quiet\" a la vez." @@ -583,6 +615,16 @@ msgstr "La descarga del repositorio ya falló una vez, no se intentará de nuevo msgid "Downloading {url} failed. {error}" msgstr "La descarga de {url} falló. {error}" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -632,6 +674,10 @@ msgstr "¡La variable de entorno {var} de {configname} no tiene valor asignado!" msgid "Error while getting repo address" msgstr "Error al obtener la dirección del repositorio" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Extraer los metadatos de la aplicación de un repositorio de origen" @@ -849,6 +895,11 @@ msgstr "Ignorando '{field}' en medatos '{metapath}' por obsoleto." msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Ignorando entrada en FUNDING.yml mayor de 2048: %s" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorando paquete sin metadatos: " @@ -1060,6 +1111,10 @@ msgstr "Crea un espejo completo del repositorio y del archivo, todos los tipos d msgid "Missing output directory" msgstr "Falta el directorio de salida" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Ni \"repo_pubkey\" ni \"keystorepass\" establecidos en config.yml" @@ -1829,6 +1884,11 @@ msgstr "¡Usando jarsigner de Java. No recomendado para verificar APKs! Use apks msgid "Using androguard from \"{path}\"" msgstr "Usando androguard de \"{path}\"" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2337,6 +2397,10 @@ msgstr "argumentos posicionales" msgid "process log deploy {path} to {dest} failed!" msgstr "¡Falló el despliegue del registro de proceso {path} en {dest}!" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2408,6 +2472,11 @@ msgstr "a scrlibs le falta el nombre y/o @" msgid "static library" msgstr "biblioteca estática" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2529,6 +2598,11 @@ msgstr "¡{appid}: {field} tiene que ser un '{type}' pero es un '{fieldtype}'!" msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} tiene que ser un entero pero se ha encontrado: {value}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "{build_flag} tiene que ser un entero pero se ha encontrado: {value}" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index 89d13767..051973b3 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2021-04-10 21:26+0000\n" "Last-Translator: Germe the fur star \n" "Language-Team: Spanish (Argentina) \n" @@ -182,9 +182,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -228,6 +238,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "Alias de la llave de firmado del repositorio en el almacén de llaves" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Permitir que una revision diferente (o rama de git) sea especificada en la importación inicial" @@ -272,6 +286,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "No se encontró Android SDK!" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -281,6 +299,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "La aplicación está en '{repo}' pero no tiene enlace a {url}" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -294,6 +316,11 @@ msgstr "Archivando {apkfilename} con una firma invalida!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -389,6 +416,11 @@ msgstr "No se reconoce el comando \"%s\".\n" msgid "Commit changes" msgstr "Cometer cambios" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -579,6 +611,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -624,6 +666,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -841,6 +887,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1054,6 +1105,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1818,6 +1873,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2312,7 +2372,6 @@ msgstr "argumentos opcionales" #: /usr/lib/python3.11/argparse.py #, fuzzy -#| msgid "Options" msgid "options" msgstr "Opciones" @@ -2332,6 +2391,10 @@ msgstr "argumentos posicionales" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2403,6 +2466,11 @@ msgstr "" msgid "static library" msgstr "librería estática" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2524,6 +2592,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" @@ -2590,130 +2663,3 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "" msgstr[1] "" - -#~ msgid "" -#~ "\n" -#~ " This is a repository of apps to be used with FDroid. Applications in this\n" -#~ " repository are either official binaries built by the original application\n" -#~ " developers, or are binaries built from source by f-droid.org using the\n" -#~ " tools on https://gitlab.com/fdroid.\n" -#~ " " -#~ msgstr "" -#~ "\n" -#~ " Este es un repositorio de apps para ser usado con FDroid. Las aplicaciones\n" -#~ " en este repositorio son tanto binarios oficiales construidos por el autor original\n" -#~ " de la aplicacion, o son binarios construidos desde la fuente por f-droid.org usando\n" -#~ " herramientas en https://gitlab.com/fdroid.\n" -#~ " " - -#~ msgid "Add a new application from its source code" -#~ msgstr "Agregar una aplicación nueva desde su código fuente" - -#~ msgid "Android SDK not found!" -#~ msgstr "No se encontró Android SDK!" - -#~ msgid "AndroidManifest.xml has no date" -#~ msgstr "AndroidManifest.xml no tiene fecha" - -#, python-brace-format -#~ msgid "Cannot read \"{path}\"!" -#~ msgstr "No se encuentra \"{path}\"!" - -#, python-brace-format -#~ msgid "Cannot resolve application ID {appid}" -#~ msgstr "No se puede resolver el ID de la aplicación {appid}" - -#~ msgid "Cannot use --list and --to at the same time" -#~ msgstr "No se puede usar --list y --to al mismo tiempo" - -#, python-brace-format -#~ msgid "Cannot write \"{path}\", not an accepted format, use: {formats}" -#~ msgstr "No se puede escribir \"{path}\", no es un formato aceptado, use: {formats}" - -#, fuzzy -#~ msgid "Create a repo signing key in a keystore" -#~ msgstr "Crear una llave de firmado en un almacén de llaves para el repositorio" - -#~ msgid "Create skeleton metadata files that are missing" -#~ msgstr "Crear plantilla de metadatos de los archivos faltantes" - -#~ msgid "Dynamically scan APKs post build" -#~ msgstr "Escanear dinámicamente APKs después de compilar" - -#, fuzzy -#~ msgid "Failed to align application" -#~ msgstr "Construir todas las aplicaciones disponibles" - -#, fuzzy -#~ msgid "Failed to zipalign application" -#~ msgstr "Construir todas las aplicaciones disponibles" - -#~ msgid "List files that would be reformatted" -#~ msgstr "Listar archivos que serán reformateados" - -#~ msgid "Path to main android project subdirectory, if not in root." -#~ msgstr "Ruta al subdirectorio del proyecto principal de android, si no es la raíz." - -#~ msgid "Produce human-readable index.xml" -#~ msgstr "Producir index.xml legible" - -#~ msgid "Report on build data status" -#~ msgstr "Reportar el estado de la construcción" - -#~ msgid "Rewrite to a specific format: " -#~ msgstr "Rescribir a un formato especifico: " - -#, fuzzy -#~ msgid "The only commands currently supported are 'init' and 'update'" -#~ msgstr "comando a ejecutar, ya sea 'iniciar' o 'actualizar'" - -#~ msgid "Update the wiki" -#~ msgstr "Actualizar la wiki" - -#~ msgid "X.509 'Distiguished Name' used when generating keys" -#~ msgstr "X.509 'Nombre Distinguido' usado cuando se generaron las llaves" - -#, fuzzy -#~ msgid "applicationId in the form APPID" -#~ msgstr "app-id en el formato APPID" - -#, fuzzy -#~ msgid "applicationId to check for updates" -#~ msgstr "app-id para verificar actualizaciones" - -#, fuzzy -#~ msgid "applicationId with optional versionCode in the form APPID[:VERCODE]" -#~ msgstr "app-id con VersionCode opcional con el formato APPID[:VERCODE]" - -#, python-format -#~ msgid "can't open '%s': %s" -#~ msgstr "no se puede abrir '%s': %s" - -#~ msgid "command to execute, either 'init' or 'update'" -#~ msgstr "comando a ejecutar, ya sea 'iniciar' o 'actualizar'" - -#, fuzzy -#~ msgid "fdroid [-h|--help|--version] []" -#~ msgstr "uso: fdroid [-h|--help|--version] []" - -#~ msgid "force errors to be warnings, or ignore" -#~ msgstr "forzar errores al ser advertencias, o ignorar" - -#, python-brace-format -#~ msgid "supplied timestamp value '{timestamp}' is not a unix timestamp" -#~ msgstr "valor marca de tiempo suministrado'{timestamp}' no es un marca de tiempo de unix" - -#~ msgid "usage: fdroid [-h|--help|--version] []" -#~ msgstr "usar: fdroid [-h|--help|--version] []" - -#~ msgid "Don't do anything logs-related" -#~ msgstr "No hacer nada que refiera a los registros relacionados" - -#~ msgid "Download logs we don't have" -#~ msgstr "Descargar los registros que no faltan" - -#~ msgid "Recalculate aggregate stats - use when changes have been made that would invalidate old cached data." -#~ msgstr "Recalcular agregación de estados - usar cuando se hacen cambios que invalidarían los datos antiguos cacheados." - -#~ msgid "Update the stats of the repo" -#~ msgstr "Actualizar las estadísticas del repositorio" diff --git a/locale/es_MX/LC_MESSAGES/fdroidserver.po b/locale/es_MX/LC_MESSAGES/fdroidserver.po index 6ab8fb81..4e6cf473 100644 --- a/locale/es_MX/LC_MESSAGES/fdroidserver.po +++ b/locale/es_MX/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2020-04-29 12:49+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Spanish (Mexico) \n" @@ -178,9 +178,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -221,6 +231,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -265,6 +279,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -274,6 +292,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -287,6 +309,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -382,6 +409,11 @@ msgstr "El comando '%s' no fue reconocido\n" msgid "Commit changes" msgstr "Hacer Cambios" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -572,6 +604,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -617,6 +659,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -834,6 +880,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1045,6 +1096,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1807,6 +1862,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2313,6 +2373,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2384,6 +2448,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2505,6 +2574,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/eu/LC_MESSAGES/fdroidserver.po b/locale/eu/LC_MESSAGES/fdroidserver.po index 065bc56f..4c5bb86f 100644 --- a/locale/eu/LC_MESSAGES/fdroidserver.po +++ b/locale/eu/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -176,9 +176,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -219,6 +229,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -263,6 +277,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -272,6 +290,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -285,6 +307,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -380,6 +407,11 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -566,6 +598,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -611,6 +653,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -828,6 +874,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1039,6 +1090,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1801,6 +1856,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2306,6 +2366,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2377,6 +2441,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2498,6 +2567,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index ec55a97a..ef8e4bbc 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2021-07-27 15:49+0000\n" "Last-Translator: Danial Behzadi \n" "Language-Team: Persian \n" @@ -179,9 +179,19 @@ msgstr "'{path}' اجرا نشد!" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -222,6 +232,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -266,6 +280,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -275,6 +293,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -288,6 +310,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -383,6 +410,11 @@ msgstr "فرمان «%s» شناسایی نشد.\n" msgid "Commit changes" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -569,6 +601,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -614,6 +656,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -831,6 +877,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1042,6 +1093,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1804,6 +1859,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2311,6 +2371,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2382,6 +2446,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2503,6 +2572,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/fdroidserver.pot b/locale/fdroidserver.pot index 64fd621d..354c4ea9 100644 --- a/locale/fdroidserver.pot +++ b/locale/fdroidserver.pot @@ -5,9 +5,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: fdroidserver 2.2.0-61-g9259963d\n" +"Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -178,9 +178,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -221,6 +231,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -265,6 +279,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -274,6 +292,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -287,6 +309,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -382,6 +409,11 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -568,6 +600,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -613,6 +655,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -830,6 +876,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1041,6 +1092,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1803,6 +1858,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2308,6 +2368,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2379,6 +2443,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2500,6 +2569,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index 613ae81d..3eef9708 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2021-08-23 01:29+0000\n" "Last-Translator: Kaantaja \n" "Language-Team: Finnish \n" @@ -178,9 +178,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -221,6 +231,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -265,6 +279,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -274,6 +292,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -287,6 +309,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -382,6 +409,11 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -568,6 +600,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -613,6 +655,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -830,6 +876,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1041,6 +1092,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1803,6 +1858,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2308,6 +2368,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2379,6 +2443,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2500,6 +2569,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 1adce036..2c570a10 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -39,7 +39,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2023-02-23 18:22+0000\n" "Last-Translator: Translator \n" "Language-Team: French \n" @@ -215,9 +215,19 @@ msgstr "'{path}' n'a pas pu être exécuté !" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' n'est pas un(e) {field} valide dans {appid}. Motif regex : {pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "'{value}' n'est pas un(e) {field} valide dans {appid}. Motif regex : {pattern}" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -258,6 +268,10 @@ msgstr "Ajout d'un nouveau dépôt pour seulement {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias de la clé de signature du dépôt dans le trousseau" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Autoriser une version différente (ou branche git) a être spécifiée pour l'import initial" @@ -302,6 +316,10 @@ msgstr "Le chemin du SDK Android '{path}' n'est pas un dossier !" msgid "Android SDK tool {cmd} not found!" msgstr "L'outil SDK Android {cmd} n'a pas été trouvé !" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "L'application a NoSourceSince ou ArchivePolicy « 0 version » mais AutoUpdateMode ou UpdateCheckMode ne valent pas None" @@ -311,6 +329,10 @@ msgstr "L'application a NoSourceSince ou ArchivePolicy « 0 version » mais Au msgid "App is in '{repo}' but has a link to {url}" msgstr "L'application est dans '{repo}' mais a un lien vers {url}" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Il n'est pas nécessaire d'ajouter .git" @@ -324,6 +346,11 @@ msgstr "Archivage de {apkfilename} avec une signature invalide !" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode avec UpdateCheckMode : HTTP doit avoir un modèle." +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL de base à mirorer, peut inclure la clef de signature d'index à l'aide de la chaîne de requête : ?fingerprint=" @@ -419,6 +446,11 @@ msgstr "La commande '%s' n'est pas reconnue.\n" msgid "Commit changes" msgstr "Sauvegarder les changements (commit)" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Conflit d'arguments : '--verbose' et '--quiet' ne peuvent être choisis en même temps." @@ -605,6 +637,16 @@ msgstr "Le téléchargement du référentiel a déjà échoué une fois, ne pas msgid "Downloading {url} failed. {error}" msgstr "Échec lors du téléchargement de {url}. {error}" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -654,6 +696,10 @@ msgstr "La variable d'environnent {var} de {configname} n'est pas configurée !" msgid "Error while getting repo address" msgstr "Erreur lors de l'obtention de l'adresse du dépôt" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Extraire les métadonnées de l'application depuis un dépôt source" @@ -871,6 +917,11 @@ msgstr "Ignore '{field}' dans les métadonnées '{metapath}' parce que c'est dé msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Ignorer l'entrée FUNDING.yml supérieure à 2048 : %s" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Paquet sans métadonnées ignoré : " @@ -1082,6 +1133,10 @@ msgstr "Cloner entièrement le repo et les archives, tous les fichiers." msgid "Missing output directory" msgstr "Répertoire de destination manquant" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Ni « repo_pubkey », ni « keystorepass » ne sont définis dans config.yml" @@ -1853,6 +1908,11 @@ msgstr "L'utilisation de l'utilitaire jarsigner de Java n'est pas recommandé po msgid "Using androguard from \"{path}\"" msgstr "Utiliser d’androguard à partir de \"{path}\"" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2358,6 +2418,10 @@ msgstr "arguments de position" msgid "process log deploy {path} to {dest} failed!" msgstr "le déploiement du journal du processus {path} vers {dest} a echoué !" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2429,6 +2493,11 @@ msgstr "les srclibs manquent un nom ou un @" msgid "static library" msgstr "librairie statique" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2550,6 +2619,11 @@ msgstr "{appid} : {field} doit être un '{type}', mais est un '{fieldtype}' !" msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} doit être un entier, valeur trouvée : {value}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "{build_flag} doit être un entier, valeur trouvée : {value}" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/fy/LC_MESSAGES/fdroidserver.po b/locale/fy/LC_MESSAGES/fdroidserver.po index d209e398..f2eaa98c 100644 --- a/locale/fy/LC_MESSAGES/fdroidserver.po +++ b/locale/fy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2021-07-01 15:29+0000\n" "Last-Translator: Vancha March \n" "Language-Team: Frisian \n" @@ -177,9 +177,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -220,6 +230,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -264,6 +278,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -273,6 +291,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -286,6 +308,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -381,6 +408,11 @@ msgstr "Kommando '%s' net werkend.\n" msgid "Commit changes" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -567,6 +599,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -612,6 +654,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -829,6 +875,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1040,6 +1091,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1802,6 +1857,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2308,6 +2368,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2379,6 +2443,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2500,6 +2569,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/he/LC_MESSAGES/fdroidserver.po b/locale/he/LC_MESSAGES/fdroidserver.po index 82435156..0e42e85a 100644 --- a/locale/he/LC_MESSAGES/fdroidserver.po +++ b/locale/he/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2023-01-24 13:51+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" @@ -178,9 +178,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -221,6 +231,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -265,6 +279,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -274,6 +292,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -287,6 +309,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -382,6 +409,11 @@ msgstr "הפקודה ‚%s’ אינה מוכרת.\n" msgid "Commit changes" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -568,6 +600,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -613,6 +655,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -830,6 +876,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1041,6 +1092,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1803,6 +1858,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2309,6 +2369,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2380,6 +2444,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2501,6 +2570,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/hi/LC_MESSAGES/fdroidserver.po b/locale/hi/LC_MESSAGES/fdroidserver.po index bf1600ca..fb10baf7 100644 --- a/locale/hi/LC_MESSAGES/fdroidserver.po +++ b/locale/hi/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2023-02-22 11:24+0000\n" "Last-Translator: Saurmandal \n" "Language-Team: Hindi \n" @@ -178,9 +178,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -221,6 +231,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -265,6 +279,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -274,6 +292,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -287,6 +309,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -382,6 +409,11 @@ msgstr "कमांड '%s' पहचाना नहीं।\n" msgid "Commit changes" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -568,6 +600,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -613,6 +655,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -830,6 +876,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1041,6 +1092,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1803,6 +1858,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2309,6 +2369,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2380,6 +2444,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2501,6 +2570,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index 6dd49e0a..4815167b 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2022-10-05 06:16+0000\n" "Last-Translator: KissPandur \n" "Language-Team: Hungarian \n" @@ -183,9 +183,19 @@ msgstr "A(z) „{path}” végrehajtása sikertelen." #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "A(z) „{value}” nem érvényes {field} érték itt: {appid}. Regex minta: {pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "A(z) „{value}” nem érvényes {field} érték itt: {appid}. Regex minta: {pattern}" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -226,6 +236,10 @@ msgstr "Új tároló hozzáadása csak a következő miatt: {name}" msgid "Alias of the repo signing key in the keystore" msgstr "A tároló aláírókulcsának álneve a kulcstárolóban" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Lehetővé teszi, hogy különböző verziót (vagy git ágat) adjon meg a kezdeti importáláshoz" @@ -270,6 +284,10 @@ msgstr "A(z) „{path}” Android SDK elérési út nem könyvtár!" msgid "Android SDK tool {cmd} not found!" msgstr "A(z) „{cmd}” Android SDK eszköz megtalálva!" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -279,6 +297,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "Az alkalmazás a(z) „{repo}” tárolóban található, de erre hivatkozik: {url}" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "A .git hozzáfűzése nem szükséges" @@ -292,6 +314,11 @@ msgstr "Az érvénytelen aláírású {apkfilename} archiválása!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "A tükrözendő alap URL, tartalmazhatja az index aláírókulcsát a lekérdezésben: ?fingerprint=" @@ -387,6 +414,11 @@ msgstr "A(z) „%s” nem ismerhető fel.\n" msgid "Commit changes" msgstr "Változások véglegesítése" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Ütköző argumentumok: a „--verbose” és a „--quite” kapcsolók együtt nem adhatók meg." @@ -574,6 +606,16 @@ msgstr "A tároló letöltése már egyszer sikertelen volt, nem próbálja meg msgid "Downloading {url} failed. {error}" msgstr "A(z) {url} letöltése sikertelen. {error}" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -623,6 +665,10 @@ msgstr "A(z) {configname} konfigurációból származó {var} környezeti válto msgid "Error while getting repo address" msgstr "Hiba történt a tároló címének lekérésekor" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -842,6 +888,11 @@ msgstr "A(z) „{field}” mellőzése a(z) „{metapath}” metaadatokban, mert msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "A 2048-nál hosszabb FUNDING.yml bejegyzés figyelmen kívül hagyása: %s" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "A metaadatok nélküli csomag figyelmen kívül hagyása: " @@ -1054,6 +1105,10 @@ msgstr "A teljes tároló és archívum tükrözés, minden fájltípussal." msgid "Missing output directory" msgstr "Hiányzó kimeneti könyvtár" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1818,6 +1873,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2325,6 +2385,10 @@ msgstr "pozicionális argumentumok" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2396,6 +2460,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2517,6 +2586,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index 1f55e1e3..41fd7251 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2021-06-23 23:32+0000\n" "Last-Translator: whenwesober \n" "Language-Team: Indonesian \n" @@ -182,9 +182,19 @@ msgstr "'{path}' gagal dieksekusi!" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' tidak valid pada {field} dalam {appid}. Pakem regex: {pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "'{value}' tidak valid pada {field} dalam {appid}. Pakem regex: {pattern}" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -225,6 +235,10 @@ msgstr "Menambahkan repo baru hanya untuk {name}" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -269,6 +283,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -278,6 +296,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -291,6 +313,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -385,6 +412,11 @@ msgstr "Perintah '%s' tidak dikenal.\n" msgid "Commit changes" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -571,6 +603,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -616,6 +658,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -833,6 +879,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1044,6 +1095,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1805,6 +1860,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2290,7 +2350,6 @@ msgstr "argumen opsional" #: /usr/lib/python3.11/argparse.py #, fuzzy -#| msgid "Options" msgid "options" msgstr "Opsi" @@ -2310,6 +2369,10 @@ msgstr "argumen posisi" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2381,6 +2444,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2501,6 +2569,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" @@ -2565,75 +2638,3 @@ msgstr[0] "" msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "" - -#~ msgid "" -#~ "\n" -#~ " This is a repository of apps to be used with FDroid. Applications in this\n" -#~ " repository are either official binaries built by the original application\n" -#~ " developers, or are binaries built from source by f-droid.org using the\n" -#~ " tools on https://gitlab.com/fdroid.\n" -#~ " " -#~ msgstr "" -#~ "\n" -#~ " Ini adalah repositori aplikasi yang digunakan oleh FDroid. Aplikasi di\n" -#~ " repositori ini antara binari resmi yang dibuat oleh pengembang aplikasi\n" -#~ " atau binari yang dibuat dari sumbernya oleh f-droid.org menggunakan\n" -#~ " alat-alat di https://gitlab.com/fdroid.\n" -#~ " " - -#~ msgid "" -#~ "\n" -#~ "SSH Public Key to be used as Deploy Key:" -#~ msgstr "" -#~ "\n" -#~ "Kunci Publik SSH yang akan digunakan sebagai Kunci Deploy:" - -#~ msgid "\"repo_pubkey\" must be present in config.yml when using --nosign!" -#~ msgstr "\"repo_pubkey\" harus ada di config.yml ketika menggunakan --nosign!" - -#, python-brace-format -#~ msgid "\"{path}\" is not an accepted format, convert to: {formats}" -#~ msgstr "\"{path}\" bukan format yang diterima, dikonversi ke: {formats}" - -#, python-format -#~ msgid "%(prog)s [options] url" -#~ msgstr "%(prog)s [opsi] url" - -#~ msgid "'sdk_path' not set in 'config.yml'!" -#~ msgstr "'sdk_path' belum diatur di 'config.yml'!" - -#, python-brace-format -#~ msgid "'{aapt}' is too old, fdroid requires build-tools-23.0.0 or newer!" -#~ msgstr "'{aapt}' terlalu usang, fdroid memerlukan build-tools-23.0.0 atau yang lebih baru!" - -#, python-brace-format -#~ msgid "'{apkfilename}' is already installed on {dev}." -#~ msgstr "'{apkfilename}' sudah terpasang di {dev}." - -#~ msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." -#~ msgstr ".fdroid.txt tudak didukung! Konfersi ke .fdroid.yml atau .fdroid.json." - -#~ msgid "Add a new application from its source code" -#~ msgstr "Tambah aplikasi baru dari kode sumbernya" - -#~ msgid "Create skeleton metadata files that are missing" -#~ msgstr "Membuat kerangka berkas metadata yang hilang" - -#~ msgid "Dynamically scan APKs post build" -#~ msgstr "Pindai APK secara dinamis pasca build" - -#~ msgid "Produce human-readable index.xml" -#~ msgstr "Buat index.xml yang bisa dibaca manusia" - -#, python-format -#~ msgid "can't open '%s': %s" -#~ msgstr "tidak bisa dibuka '%s': %s" - -#~ msgid "force errors to be warnings, or ignore" -#~ msgstr "paksa untuk mengingatkan adanya error, atau hiraukan" - -#~ msgid "usage: fdroid [-h|--help|--version] []" -#~ msgstr "penggunaan: fdroid [-h|--help|--version] []" - -#~ msgid "Update the stats of the repo" -#~ msgstr "Perbarui status repo" diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index fccbc5f2..73e6c3ae 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2023-01-29 13:57+0000\n" "Last-Translator: Pixel-Tux \n" "Language-Team: Italian \n" @@ -193,9 +193,19 @@ msgstr "Esecuzione di \"{path}\" fallita!" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "\"{value}\" non è un {field} valido in {appid}. Espressione regolare: {pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "\"{value}\" non è un {field} valido in {appid}. Espressione regolare: {pattern}" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -236,6 +246,10 @@ msgstr "Aggiungendo un repository solo per {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias della chiave di firma del repository nel keystore" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Permetti di specificare una revisione (o branch git) diversa per l'importazione iniziale" @@ -280,6 +294,10 @@ msgstr "Il path di Android SDK \"{path}\" non è una directory!" msgid "Android SDK tool {cmd} not found!" msgstr "Strumento Android SDK {cmd} non trovato!" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -289,6 +307,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "L'app è in \"{repo}\" ma ha un collegamento a {url}" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Non è necessario aggiungere \".git\"" @@ -302,6 +324,11 @@ msgstr "Archiviando {apkfilename} con una firma invalida!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Indirizzo URL base per il mirror, può includere la chiave di firma dell'indice utilizzando la query string: ?fingerprint=" @@ -397,6 +424,11 @@ msgstr "Comando \"%s\" non riconosciuto.\n" msgid "Commit changes" msgstr "Cambiamenti del commit" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argomenti in conflitto: '--verbose' e '--quiet' non possono essere specificati contemporaneamente." @@ -583,6 +615,16 @@ msgstr "Lo scaricamento del repository è gia fallito una volta, non verrà ripr msgid "Downloading {url} failed. {error}" msgstr "Scaricamento di {url} fallito. {error}" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -632,6 +674,10 @@ msgstr "La variabile d'ambiente {var} da {configname} non è impostata!" msgid "Error while getting repo address" msgstr "Errore nell'ottenere l'indirizzo del repo" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Estrarre i metadati dell'applicazione da una repository di origine" @@ -849,6 +895,11 @@ msgstr "Ignorando i metadati '{field}' in '{metapath}' perché obsoleti." msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Ignorando la voce FUNDING.yml più lunga di 2048: %s" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorare il pacchetto senza metadati: " @@ -1060,6 +1111,10 @@ msgstr "Rispecchiare il repository completo e l'archivio, tutti i tipi di file." msgid "Missing output directory" msgstr "Directory di output mancante" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Né \"repo_pubkey\" o \"keystorepass\" sono stati impostati in config.yml" @@ -1822,6 +1877,11 @@ msgstr "Utilizzando jarsigner di Java, non raccomandato per verificare APK! Util msgid "Using androguard from \"{path}\"" msgstr "Usando androguard da \"{path}\"" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2331,6 +2391,10 @@ msgstr "argomenti posizionali" msgid "process log deploy {path} to {dest} failed!" msgstr "processo log deploy {path} a {dest} fallito!" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2402,6 +2466,11 @@ msgstr "srclibs manca il nome e/o @" msgid "static library" msgstr "biblioteca statica" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2523,6 +2592,11 @@ msgstr "{appid}: {field} deve essere un '{type}', ma è un '{fieldtype}'!" msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} deve essere un intero, trovato: {value}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "{build_flag} deve essere un intero, trovato: {value}" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index a797ba70..1c0ad633 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2020-09-02 16:10+0000\n" "Last-Translator: Hinaloe \n" "Language-Team: Japanese \n" @@ -176,9 +176,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -219,6 +229,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -263,6 +277,10 @@ msgstr "Android SDK パス '{path}' はディレクトリではありません msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -272,6 +290,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -285,6 +307,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -379,6 +406,11 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -565,6 +597,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -610,6 +652,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -827,6 +873,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1038,6 +1089,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1799,6 +1854,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2302,6 +2362,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2373,6 +2437,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2493,6 +2562,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index 0151d6b1..d99be2f1 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2021-01-15 13:25+0000\n" "Last-Translator: R_SACI \n" "Language-Team: Kabyle \n" @@ -179,9 +179,19 @@ msgstr "'{path}' ur izmir ara ad yettwaselkem!" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -222,6 +232,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -266,6 +280,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -275,6 +293,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -288,6 +310,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -383,6 +410,11 @@ msgstr "Taladna '%s' ur tettwassen ara.\n" msgid "Commit changes" msgstr "Azen ibeddilen" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -570,6 +602,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -615,6 +657,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -833,6 +879,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1044,6 +1095,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1806,6 +1861,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2312,6 +2372,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2383,6 +2447,11 @@ msgstr "" msgid "static library" msgstr "tamkerḍit n tdaddanin" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2504,6 +2573,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index a938c16c..fef138e2 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Korean \n" @@ -181,9 +181,19 @@ msgstr "'{path}'를 실행하는 데 실패했습니다!" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}'는 {appid}에서 올바른 {field}가 아닙니다. 정규식 패턴: {pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "'{value}'는 {appid}에서 올바른 {field}가 아닙니다. 정규식 패턴: {pattern}" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -224,6 +234,10 @@ msgstr "{name}를 위해서만 새 저장소를 추가하기" msgid "Alias of the repo signing key in the keystore" msgstr "키스토어에서 저장소 서명 키의 별칭" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -268,6 +282,10 @@ msgstr "Android SDK 경로 '{path}'는 디렉터리가 아닙니다!" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -277,6 +295,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "앱은 '{repo}'에 있지만 {url}로의 연결이 있습니다" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr ".git 추가가 필요하지 않습니다" @@ -290,6 +312,11 @@ msgstr "올바르지 않은 서명으로 {apkfilename}를 보존 중입니다!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -384,6 +411,11 @@ msgstr "명령 '%s'은 인식되지 않습니다.\n" msgid "Commit changes" msgstr "번경사항 커밋" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -570,6 +602,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -615,6 +657,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -833,6 +879,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1044,6 +1095,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1805,6 +1860,11 @@ msgstr "Java의 jarsigner를 사용하여, APK를 검증하는 것은 권장되 msgid "Using androguard from \"{path}\"" msgstr "\"{path}\"에서 androguard를 사용 중" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2310,6 +2370,10 @@ msgstr "고정적 인수" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2381,6 +2445,11 @@ msgstr "srclibs 없는 이름 및/또는 @" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2501,6 +2570,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/ml/LC_MESSAGES/fdroidserver.po b/locale/ml/LC_MESSAGES/fdroidserver.po index 0f7ee733..ddbcf04b 100644 --- a/locale/ml/LC_MESSAGES/fdroidserver.po +++ b/locale/ml/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2022-11-22 19:37+0000\n" "Last-Translator: Abhiram \n" "Language-Team: Malayalam \n" @@ -181,9 +181,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -224,6 +234,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -268,6 +282,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -277,6 +295,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -290,6 +312,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -385,6 +412,11 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -571,6 +603,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -616,6 +658,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -833,6 +879,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1044,6 +1095,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1809,6 +1864,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2314,6 +2374,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2385,6 +2449,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2506,6 +2575,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index 19d7892c..0040a44c 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Norwegian Bokmål \n" @@ -186,9 +186,19 @@ msgstr "\"{path}\" klarte ikke å kjøre." #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "\"{value}\" er ikke et gyldig {field} i {appid}. Mønster for regulært uttrykk: {pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "\"{value}\" er ikke et gyldig {field} i {appid}. Mønster for regulært uttrykk: {pattern}" + #: ../fdroidserver/checkupdates.py #, fuzzy, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -230,6 +240,10 @@ msgstr "Legger til ny pakkebrønn kun for {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias for pakkebrønnssigneringsnøkkel i nøkkellageret" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Tillater en annen revisjon (eller git-avgreining) å angis for igangsettende import" @@ -275,6 +289,10 @@ msgstr "Android SDK-stien '{path}' er ikke ei mappe." msgid "Android SDK tool {cmd} not found!" msgstr "Fant ikke Android-SDK-verktøyet {cmd}!" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -284,6 +302,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "Program finnes i '{repo}', men har en lenke til {url}" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Å legge til .git er ikke nødvendig" @@ -297,6 +319,11 @@ msgstr "Pakker {apkfilename} med ugyldig signatur." msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Grunnettadresse å speile, kan inkludere indekssigneringsnøkkelen ved bruk av spørreingsstrengen: ?fingerpring=" @@ -394,6 +421,11 @@ msgstr "Kommandoen \"%s\" gjenkjennes ikke.\n" msgid "Commit changes" msgstr "Send inn endringer" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumenter i konflikt: '--verbose' og '--quiet' kan ikke angis samtidig." @@ -589,6 +621,16 @@ msgstr "Nedlasting av pakkebrønn mislyktes én gang, prøver ikke igjen." msgid "Downloading {url} failed. {error}" msgstr "Nedlasting av {url} mislyktes. {error}" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -642,6 +684,10 @@ msgstr "Miljøvariabelen {var} fra {configname} er ikke satt!" msgid "Error while getting repo address" msgstr "Kunne ikke hente pakkebrønnsadresse" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -866,6 +912,11 @@ msgstr "Ser bort fra «{field}» i «{metapath}» fordi det er er foreldet." msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Ser bort fra FUNDING.yml-oppføring som er lengre enn 2048: %s" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorerte pakke uten metadata: " @@ -1088,6 +1139,10 @@ msgstr "Avspeil hele pakkebrønnen og arkivet, alle filtyper." msgid "Missing output directory" msgstr "Manglende utdatamappe" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1878,6 +1933,11 @@ msgstr "Bruker Java sin jarsigner, ikke anbefalt for bekreftelse av APK-er. Bruk msgid "Using androguard from \"{path}\"" msgstr "Bruker Androguard fra \"{path}\"" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, fuzzy, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2402,6 +2462,10 @@ msgstr "Posisjonelle argumenter" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, fuzzy, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2477,6 +2541,11 @@ msgstr "srclibs mangler navn og/eller @" msgid "static library" msgstr "statisk bibliotek" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2598,6 +2667,11 @@ msgstr "{appid}: {field} må være en '{type}', men er ikke et '{fieldtype}'!" msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} må være et heltall, fant: {value}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "{build_flag} må være et heltall, fant: {value}" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index 80af3f64..1e783ca0 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2021-07-16 15:35+0000\n" "Last-Translator: privacysimp \n" "Language-Team: Dutch \n" @@ -178,9 +178,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -221,6 +231,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -265,6 +279,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -274,6 +292,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -287,6 +309,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -383,6 +410,11 @@ msgstr "Opdracht '%s' wordt niet herkend.\n" msgid "Commit changes" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -569,6 +601,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -614,6 +656,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -831,6 +877,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1042,6 +1093,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1804,6 +1859,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2310,6 +2370,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2381,6 +2445,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2502,6 +2571,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index c8215230..f29f5377 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2023-02-23 18:22+0000\n" "Last-Translator: Agnieszka C \n" "Language-Team: Polish \n" @@ -186,9 +186,19 @@ msgstr "'{path}' nie udało się wykonać!" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' nie jest prawidłowy {field} w {appid}. Wzór Regex: {pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "'{value}' nie jest prawidłowy {field} w {appid}. Wzór Regex: {pattern}" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -229,6 +239,10 @@ msgstr "Dodaje tylko nowe repozytorium {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias klucza podpisu repozytorium w magazynie kluczy" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Umożliwia określenie innej wersji (lub gałęzi git) dla początkowego importu" @@ -273,6 +287,10 @@ msgstr "Android SDK ścieżka '{path}' nie jest katalogiem!" msgid "Android SDK tool {cmd} not found!" msgstr "Nie znaleziono narzędzia Android SDK {cmd}!" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Aplikacja ma NoSourceSince lub ArchivePolicy „0 versions”, ale AutoUpdateMode lub UpdateCheckMode nie są None" @@ -282,6 +300,10 @@ msgstr "Aplikacja ma NoSourceSince lub ArchivePolicy „0 versions”, ale AutoU msgid "App is in '{repo}' but has a link to {url}" msgstr "Aplikacja jest w '{repo}' ale ma link do {url}" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Dołączanie .git nie jest konieczne" @@ -295,6 +317,11 @@ msgstr "Archiwizacja {apkfilename} z nieprawidłowym podpisem!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode z UpdateCheckMode: HTTP musi mieć wzorzec." +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Bazowy adres URL do serwera lustrzanego, może zawierać klucz do podpisywania indeksu za pomocą łańcucha zapytania: ?fingerprint=" @@ -391,6 +418,11 @@ msgstr "Polecenie '%s' nie rozpoznane.\n" msgid "Commit changes" msgstr "Scommituj zmiany" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Sprzeczne argumenty: '--verbose' i '--quiet' nie mogą być podane w tym samym czasie." @@ -577,6 +609,16 @@ msgstr "Pobieranie repozytorium już raz się nie powiodło, nie próbuje ponown msgid "Downloading {url} failed. {error}" msgstr "Pobieranie {url} nie powiodło się. {error}" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -626,6 +668,10 @@ msgstr "Zmienna środowiskowa {var} z {configname} nie jest ustawiona!" msgid "Error while getting repo address" msgstr "Błąd podczas uzyskiwania adresu repo" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Wyodrębnij metadane aplikacji z repozytorium źródłowego" @@ -843,6 +889,11 @@ msgstr "Ignorowanie metadanych '{field}' w '{metapath}' ponieważ są one przest msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Ignorowanie wpisu FUNDING.yml dłuższego niż 2048: %s" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorowanie pakietu bez metadanych: " @@ -1054,6 +1105,10 @@ msgstr "Mirror pełnego repo i archiwum, wszystkie typy plików." msgid "Missing output directory" msgstr "Brakujący katalog wyjściowy" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Ani „repo_pubkey”, ani „keystorepass” nie są ustawione w config.yml" @@ -1824,6 +1879,11 @@ msgstr "Korzystanie z jarsignera Java nie jest zalecane do weryfikacji plików A msgid "Using androguard from \"{path}\"" msgstr "Korzystanie z androguard od \"{path}\"" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2331,6 +2391,10 @@ msgstr "argumenty pozycyjne" msgid "process log deploy {path} to {dest} failed!" msgstr "proces wdrażania dziennika {path} do {dest} nie powiódł się!" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2402,6 +2466,11 @@ msgstr "brak nazwy srclibs i/lub @" msgid "static library" msgstr "biblioteka statyczna" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2524,6 +2593,11 @@ msgstr "{appid}: {field} musi być '{type}', ale to jest '{fieldtype}'!" msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} musi być liczbą całkowitą, znaleziono: {value}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "{build_flag} musi być liczbą całkowitą, znaleziono: {value}" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index c3330f31..1cef679c 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2023-02-25 12:43+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" @@ -184,9 +184,19 @@ msgstr "'{path}' falhou ao executar!" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' não é um {field} válido em {appid}. Modelo regex: {pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "'{value}' não é um {field} válido em {appid}. Modelo regex: {pattern}" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -227,6 +237,10 @@ msgstr "Adicionando novo repositório para apenas {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias (apelido) da chave de assinatura do repositório na keystore" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Permite que uma revisão diferente (ou árvore do git) seja especificada para a importação inicial" @@ -271,6 +285,10 @@ msgstr "O caminho do SDK Android '{path}' não é um diretório!" msgid "Android SDK tool {cmd} not found!" msgstr "A ferramenta SDK do Android {cmd} não foi encontrada!" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "A app tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateMode ou UpdateCheckMode não são Nenhum" @@ -280,6 +298,10 @@ msgstr "A app tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateM msgid "App is in '{repo}' but has a link to {url}" msgstr "A App está em '{repo}' mas tem uma hiperligação para {url}" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Acrescentar .git não é necessário" @@ -293,6 +315,11 @@ msgstr "Arquivamento {apkfilename} com assinatura inválida!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode com UpdateCheckMode: HTTP deve ter um modelo." +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL base para espelhar, pode incluir a chave de assinatura de índice usando a cadeia de consulta: ?fingerprint =" @@ -388,6 +415,11 @@ msgstr "Comando '%s' não reconhecido.\n" msgid "Commit changes" msgstr "Enviar mudanças" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumentos conflitantes: \"--verbose\" e \"--quiet\" não podem ser especificados ao mesmo tempo." @@ -574,6 +606,16 @@ msgstr "O descarregamento do repositório já falhou uma vez, não tento novamen msgid "Downloading {url} failed. {error}" msgstr "Descarregar {url} falhou. {error}" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -623,6 +665,10 @@ msgstr "A variável de ambiente {var} de {configname} não está definida!" msgid "Error while getting repo address" msgstr "Erro ao obter o endereço do repo" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Extrair metadados de aplicações de um repositório de origem" @@ -840,6 +886,11 @@ msgstr "A ignorar '{field}' em metadados '{metapath}' porque é depreciado." msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "A ignorar a entrada FUNDING.yml por mais de 2048: %s" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorando o pacote sem metadados: " @@ -1051,6 +1102,10 @@ msgstr "Espelha todo o repositório e pacotes, todos os tipos de ficheiros." msgid "Missing output directory" msgstr "Falta diretório de saída" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Nem \"repo_pubkey\" nem \"keystorepass\" definidos em config.yml" @@ -1820,6 +1875,11 @@ msgstr "Usando o jarsigner de Java, não recomendado para verificar APKs! Use ap msgid "Using androguard from \"{path}\"" msgstr "Usando androguard de \"{path}\"" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2325,6 +2385,10 @@ msgstr "argumentos posicionais" msgid "process log deploy {path} to {dest} failed!" msgstr "a implementação do registo de processo {path} a {dest} falhou!" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2396,6 +2460,11 @@ msgstr "Nome 'srclibs' ausente e/ou '@'" msgid "static library" msgstr "biblioteca estática" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2517,6 +2586,11 @@ msgstr "{appid}: {field} deve ser um '{type}', mas é um '{fieldtype}'!" msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} deve ser um inteiro, encontrado: {value}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "{build_flag} deve ser um inteiro, encontrado: {value}" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 16c95485..f4d4106e 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2023-02-01 00:47+0000\n" "Last-Translator: The Cats \n" "Language-Team: Portuguese (Brazil) \n" @@ -189,9 +189,19 @@ msgstr "'{path}' falhou ao executar!" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' não é um{field} válido em {appid}. Regex padrão: {pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "'{value}' não é um{field} válido em {appid}. Regex padrão: {pattern}" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -232,6 +242,10 @@ msgstr "Adicionando novo repositório para apenas {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias (apelido) da chave de assinatura do repositório na keystore" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Permite que uma revisão diferente (ou árvore do git) seja especificada para a importação inicial" @@ -276,6 +290,10 @@ msgstr "O caminho do SDK Android '{path}' não é um diretório!" msgid "Android SDK tool {cmd} not found!" msgstr "A ferramenta SDK do Android {cmd} não foi encontrada!" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -285,6 +303,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "O App está em '{repo}' mas tem um link para {url}" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Acrescentar .git não é necessário" @@ -298,6 +320,11 @@ msgstr "Arquivamento {apkfilename} com assinatura inválida!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL base para espelhar, pode incluir a chave de assinatura de índice usando a string de consulta:? Fingerprint =" @@ -393,6 +420,11 @@ msgstr "Comando \"%s\" não reconhecido.\n" msgid "Commit changes" msgstr "Enviar mudanças" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumentos conflitantes: \"--verbose\" e \"--quiet\" não podem ser especificados ao mesmo tempo." @@ -579,6 +611,16 @@ msgstr "O download do repositório já falhou uma vez, não tente novamente." msgid "Downloading {url} failed. {error}" msgstr "Falha ao baixar '{url}'. {error}" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -628,6 +670,10 @@ msgstr "A variável de ambiente {var} de {configname} não está definida!" msgid "Error while getting repo address" msgstr "Erro ao obter o endereço do repositório" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Extrair metadados de aplicativos de um repositório de origem" @@ -845,6 +891,11 @@ msgstr "Ignorando \"{field}\" em metadados \"{metapath}\" porque foi descontinua msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Ignorando entrada de FUNDING.yml maior que 2048: %s" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorando o pacote sem metadados: " @@ -1056,6 +1107,10 @@ msgstr "Espelha todo o repositório e pacotes, todos os tipos de arquivos." msgid "Missing output directory" msgstr "Diretório de saída ausente" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Nem \"repo_pubkey\" nem \"keystorepass\" definidos em config.yml" @@ -1825,6 +1880,11 @@ msgstr "Usando o jarsigner de Java, não recomendado para verificar APKs! Use ap msgid "Using androguard from \"{path}\"" msgstr "Usando androguard de \"{path}\"" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2333,6 +2393,10 @@ msgstr "argumentos posicionais" msgid "process log deploy {path} to {dest} failed!" msgstr "houve uma falha no registro de processo implantação {path} para {dest}!" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2404,6 +2468,11 @@ msgstr "Nome 'srclibs' ausente e/ou '@'" msgid "static library" msgstr "biblioteca estática" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2525,6 +2594,11 @@ msgstr "O {appid}: {field} deve ser um '{type}', porém é um '{fieldtype}'!" msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} deve ser um número inteiro, encontrado: {value}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "{build_flag} deve ser um número inteiro, encontrado: {value}" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 29e2eb69..28d2215b 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2023-02-25 12:43+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" @@ -185,9 +185,19 @@ msgstr "'{path}' falhou ao executar!" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' não é um {field} válido em {appid}. Modelo regex: {pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "'{value}' não é um {field} válido em {appid}. Modelo regex: {pattern}" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -228,6 +238,10 @@ msgstr "Adicionando novo repositório para apenas {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias (apelido) da chave de assinatura do repositório na keystore" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Permite que uma revisão diferente (ou árvore do git) seja especificada para a importação inicial" @@ -272,6 +286,10 @@ msgstr "O caminho do SDK Android '{path}' não é um diretório!" msgid "Android SDK tool {cmd} not found!" msgstr "A ferramenta SDK do Android {cmd} não foi encontrada!" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "A app tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateMode ou UpdateCheckMode não são Nenhum" @@ -281,6 +299,10 @@ msgstr "A app tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateM msgid "App is in '{repo}' but has a link to {url}" msgstr "A App está em '{repo}' mas tem uma hiperligação para {url}" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Acrescentar .git não é necessário" @@ -294,6 +316,11 @@ msgstr "Arquivamento {apkfilename} com assinatura inválida!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode com UpdateCheckMode: HTTP deve ter um modelo." +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL base para espelhar, pode incluir a chave de assinatura de índice usando a string de consulta:? Fingerprint =" @@ -389,6 +416,11 @@ msgstr "Comando '%s' não reconhecido.\n" msgid "Commit changes" msgstr "Enviar mudanças" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumentos conflitantes: \"--verbose\" e \"--quiet\" não podem ser especificados ao mesmo tempo." @@ -575,6 +607,16 @@ msgstr "O descarregamento do repositório já falhou uma vez, não tento novamen msgid "Downloading {url} failed. {error}" msgstr "Descarregar {url} falhou. {error}" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -624,6 +666,10 @@ msgstr "A variável de ambiente {var} de {configname} não está definida!" msgid "Error while getting repo address" msgstr "Erro ao obter o endereço do repo" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Extrair metadados de aplicações de um repositório de origem" @@ -841,6 +887,11 @@ msgstr "A ignorar '{field}' em metadados '{metapath}' porque é depreciado." msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "A ignorar a entrada FUNDING.yml por mais de 2048: %s" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorando o pacote sem metadados: " @@ -1052,6 +1103,10 @@ msgstr "Espelha todo o repositório e pacotes, todos os tipos de ficheiros." msgid "Missing output directory" msgstr "Falta diretório de saída" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Nem \"repo_pubkey\" nem \"keystorepass\" definidos em config.yml" @@ -1821,6 +1876,11 @@ msgstr "Usando o jarsigner de Java, não recomendado para verificar APKs! Use ap msgid "Using androguard from \"{path}\"" msgstr "Usando androguard de \"{path}\"" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2326,6 +2386,10 @@ msgstr "argumentos posicionais" msgid "process log deploy {path} to {dest} failed!" msgstr "a implementação do registo de processo {path} a {dest} falhou!" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2397,6 +2461,11 @@ msgstr "Nome 'srclibs' ausente e/ou '@'" msgid "static library" msgstr "biblioteca estática" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2518,6 +2587,11 @@ msgstr "{appid}: {field} deve ser um '{type}', mas é um '{fieldtype}'!" msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} deve ser um inteiro, encontrado: {value}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "{build_flag} deve ser um inteiro, encontrado: {value}" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 5aded3cd..5b808e68 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2022-09-08 14:15+0000\n" "Last-Translator: Licaon Kter \n" "Language-Team: Romanian \n" @@ -185,9 +185,19 @@ msgstr "'{path}' nu a reușit să se execute!" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' nu este valid {field} în {appid}. Regex model: {pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "'{value}' nu este valid {field} în {appid}. Regex model: {pattern}" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -228,6 +238,10 @@ msgstr "Adăugarea unui nou depozit doar pentru {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias al cheii de semnare repo din magazinul de chei" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Permite specificarea unei revizuiri diferite (sau a unei ramuri git) pentru importul inițial" @@ -272,6 +286,10 @@ msgstr "Calea Android SDK '{path}' nu este un director!" msgid "Android SDK tool {cmd} not found!" msgstr "Instrumentul Android SDK {cmd} nu a fost găsit!" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -281,6 +299,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "Aplicația se află în '{repo}', dar are un link către {url}" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Adăugarea .git nu este necesară" @@ -294,6 +316,11 @@ msgstr "Arhivare {apkfilename} cu semnătură invalidă!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL de bază pentru oglindire, poate include cheia de semnare a indexului folosind șirul de interogare: ?fingerprint=" @@ -390,6 +417,11 @@ msgstr "Comanda '%s' nerecunoscută.\n" msgid "Commit changes" msgstr "Efectuați modificări" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumente contradictorii: '--verbose' și '--quiet' nu pot fi specificate în același timp." @@ -576,6 +608,16 @@ msgstr "Descărcarea depozitului a eșuat deja o dată, nu mai încerc din nou." msgid "Downloading {url} failed. {error}" msgstr "Descărcarea {url} a eșuat. {error}" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -625,6 +667,10 @@ msgstr "Variabila de mediu {var} din {configname} nu este setată!" msgid "Error while getting repo address" msgstr "Eroare la obținerea adresei repo" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Extrageți metadatele aplicației dintr-un depozit sursă" @@ -842,6 +888,11 @@ msgstr "Ignorarea lui '{field}' în metadatele '{metapath}', deoarece este depă msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Ignorarea intrării FUNDING.yml mai lungă de 2048: %s" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorarea pachetului fără metadate: " @@ -1053,6 +1104,10 @@ msgstr "Oglindește întregul repo și arhiva, toate tipurile de fișiere." msgid "Missing output directory" msgstr "Lipsește directorul de ieșire" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Nici \"repo_pubkey\" și nici \"keystorepass\" nu sunt setate în config.yml" @@ -1823,6 +1878,11 @@ msgstr "Folosind jarsigner de la Java, nu este recomandat pentru verificarea APK msgid "Using androguard from \"{path}\"" msgstr "Folosind androguard din \"{path}\"" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2333,6 +2393,10 @@ msgstr "argumente poziționale" msgid "process log deploy {path} to {dest} failed!" msgstr "jurnalul procesului deploy {path} la {dest} a eșuat!" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2404,6 +2468,11 @@ msgstr "srclibs lipsește numele și/sau @" msgid "static library" msgstr "bibliotecă statică" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2526,6 +2595,11 @@ msgstr "{appid}: {field} trebuie să fie un '{type}', dar este un '{fieldtype}'! msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} trebuie să fie un număr întreg, găsit: {value}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "{build_flag} trebuie să fie un număr întreg, găsit: {value}" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index e6893509..6c2645ba 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2023-02-23 18:22+0000\n" "Last-Translator: Andrey \n" "Language-Team: Russian \n" @@ -192,9 +192,19 @@ msgstr "{path} не удалось исполнить!" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' не подходит в качестве {field} в {appid}. Образец регулярного выражения: {pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "'{value}' не подходит в качестве {field} в {appid}. Образец регулярного выражения: {pattern}" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -235,6 +245,10 @@ msgstr "Добавление нового репозитория только д msgid "Alias of the repo signing key in the keystore" msgstr "Алиас для ключа для подписи репозитория в хранилище ключей" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Позволяет выбрать разные ревизии или ветки для первичного импорта" @@ -279,6 +293,10 @@ msgstr "Путь Android SDK '{path}' указывает не на директ msgid "Android SDK tool {cmd} not found!" msgstr "Инструмент Android SDK {cmd} не найден!" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Приложение имеет NoSourceSince или ArchivePolicy \"0 версий\", но AutoUpdateMode или UpdateCheckMode не равны None" @@ -288,6 +306,10 @@ msgstr "Приложение имеет NoSourceSince или ArchivePolicy \"0 msgid "App is in '{repo}' but has a link to {url}" msgstr "Приложение находится в репозитории '{repo}', но ссылка указывает на {url}" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Добавлять .git необязательно" @@ -301,6 +323,11 @@ msgstr "Вы пытаетесь поместить в архив {apkfilename} msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode с UpdateCheckMode: HTTP должен иметь шаблон." +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Основной URL-адрес зеркала может содержать ключ для подписывания индекса (добавьте запрос \"?fingerprint=\")" @@ -397,6 +424,11 @@ msgstr "Команда '%s' не распознана.\n" msgid "Commit changes" msgstr "Сохранить изменения (commit)" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Несовместимые аргументы: '--verbose' и '--quiet' нельзя указывать одновременно." @@ -583,6 +615,16 @@ msgstr "Репозиторий не удалось склонировать с msgid "Downloading {url} failed. {error}" msgstr "Загрузить {url} не получилось. {error}" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -632,6 +674,10 @@ msgstr "Переменная среды {var} из {configname} не устан msgid "Error while getting repo address" msgstr "Ошибка при получении адреса репозитория" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Извлекать метаданные приложения из исходного репозитория" @@ -849,6 +895,11 @@ msgstr "Проигнорировано: поле '{field}' в метаданны msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Проигнорировано: запись в FUNDING.yml длиннее 2048 символов: %s" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Проигнорировано, пакеты без метаданных: " @@ -1060,6 +1111,10 @@ msgstr "Создать зеркало всего репозитория и ар msgid "Missing output directory" msgstr "Директории для хранения выводных данных не существует" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Ни «repo_pubkey», ни «keystorepass» не указаны в config.yml" @@ -1830,6 +1885,11 @@ msgstr "Проверка APK с помощью Java jarsigner. Так делат msgid "Using androguard from \"{path}\"" msgstr "Запуск androguard из \"{path}\"" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2337,6 +2397,10 @@ msgstr "позиционные аргументы" msgid "process log deploy {path} to {dest} failed!" msgstr "Не удалось загрузить лог {path} на {dest}!" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2408,6 +2472,11 @@ msgstr "библиотеки srclib: имя отсутствует или не msgid "static library" msgstr "статическая библиотека" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2530,6 +2599,11 @@ msgstr "{appid}: {field} должно быть '{type}', а не '{fieldtype}'!" msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} должен быть целым числом, но найдено значение: {value}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "{build_flag} должен быть целым числом, но найдено значение: {value}" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/sk/LC_MESSAGES/fdroidserver.po b/locale/sk/LC_MESSAGES/fdroidserver.po index 4219ee27..d5022bbd 100644 --- a/locale/sk/LC_MESSAGES/fdroidserver.po +++ b/locale/sk/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -177,9 +177,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -220,6 +230,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -264,6 +278,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -273,6 +291,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -286,6 +308,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -382,6 +409,11 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -568,6 +600,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -613,6 +655,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -830,6 +876,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1041,6 +1092,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1804,6 +1859,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2311,6 +2371,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2382,6 +2446,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2504,6 +2573,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index 49299353..0952318d 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2023-02-25 12:43+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" @@ -182,9 +182,19 @@ msgstr "S’u arrit të përmbushet '{path}'!" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' s’është një {field} e vlefshme te {appid}. Rregullsi shprehjeje të rregullt: {pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "'{value}' s’është një {field} e vlefshme te {appid}. Rregullsi shprehjeje të rregullt: {pattern}" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -225,6 +235,10 @@ msgstr "Po shtohet depo e re për vetëm {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Alias i kyçit të nënshkrimeve të depos te depo kyçesh" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Lejon të specifikohet një rishikim tjetër (ose kryeni “git branch”) për importimin fillestar" @@ -269,6 +283,10 @@ msgstr "Shtegu Android SDK '{path}' s’është drejtori!" msgid "Android SDK tool {cmd} not found!" msgstr "S’u gjet {cmd} mjeti SDK-je Android!" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Aplikacioni ka NoSourceSince ose ArchivePolicy “0 versione”, por AutoUpdateMode ose UpdateCheckMode janë vënë si “Asnjë”" @@ -278,6 +296,10 @@ msgstr "Aplikacioni ka NoSourceSince ose ArchivePolicy “0 versione”, por Aut msgid "App is in '{repo}' but has a link to {url}" msgstr "Aplikacioni gjendet në '{repo}' por ka një lidhje te {url}" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "S’është i nevojshëm shtimi i .git nga pas" @@ -291,6 +313,11 @@ msgstr "Po arkivohet {apkfilename} me nënshkrim të pavlefshëm!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode me UpdateCheckMode: HTTP duhet të ketë një rregullsi." +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL bazë për t’u pasqyruar, mund të përfshijë kyçin e nënshkrimit të treguesit që përdor vargun e kërkimi: ?fingerprint=" @@ -386,6 +413,11 @@ msgstr "Urdhër '%s' jo i pranuar.\n" msgid "Commit changes" msgstr "Depozito ndryshimet" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumente që përplasen: '--verbose' dhe '--quiet' s’mund të përdoren në të njëjtën kohë." @@ -572,6 +604,16 @@ msgstr "Shkarkimi i depos dështoi një herë, s’po riprovohet." msgid "Downloading {url} failed. {error}" msgstr "Shkarkimi i {url} dështoi. {error}" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -621,6 +663,10 @@ msgstr "S’është ujdisur ndryshore {var} nga {configname}!" msgid "Error while getting repo address" msgstr "Gabim teksa merrej adresë depoje" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Përftoji tejtëdhënat e aplikacionit prej një depoje burim" @@ -838,6 +884,11 @@ msgstr "Po shpërfillet '{field}' te tejtëdhëna '{metapath}', ngaqë është n msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Po shpërfillen zëra FUNDING.yml më të gjatë se 2048: %s" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Po shpërfillet paketë pa tejtëdhëna: " @@ -1049,6 +1100,10 @@ msgstr "Pasqyro depon e plotë dhe arkivin, krejt llojet e kartelave." msgid "Missing output directory" msgstr "Mungon drejtori përfundimesh" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Te config.yml s’është ujdisur as “repo_pubkey”, as “keystorepass”" @@ -1819,6 +1874,11 @@ msgstr "Po përdoret jarsigner Java, s’rekomandohet për verifikim APK-sh! Pë msgid "Using androguard from \"{path}\"" msgstr "Po përdoret androguard prej “{path}”" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2324,6 +2384,10 @@ msgstr "argumente pozicionalë" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2395,6 +2459,11 @@ msgstr "srclibs-it i mungon emër dhe/ose @" msgid "static library" msgstr "librari statike" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2516,6 +2585,11 @@ msgstr "{appid}: {field} duhet të jetë një '{type}', por është një '{field msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} duhet të jetë numër i plotë, u gjet: {value}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "{build_flag} duhet të jetë numër i plotë, u gjet: {value}" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index 0b6b6b63..84710f6e 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2022-11-28 13:20+0000\n" "Last-Translator: Đorđe Vasiljević \n" "Language-Team: Serbian \n" @@ -178,9 +178,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -221,6 +231,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -265,6 +279,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -274,6 +292,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -287,6 +309,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -382,6 +409,11 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -568,6 +600,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -613,6 +655,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -830,6 +876,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1041,6 +1092,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1803,6 +1858,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2308,6 +2368,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2379,6 +2443,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2500,6 +2569,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index cfa52c2b..eff52123 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2021-10-16 13:25+0000\n" "Last-Translator: Kristoffer Grundström \n" "Language-Team: Swedish \n" @@ -180,9 +180,19 @@ msgstr "Misslyckades med att köra '{path}'!" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' är inte ett giltigt {field} i {appid}. Regex-mönster: {pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "'{value}' är inte ett giltigt {field} i {appid}. Regex-mönster: {pattern}" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -223,6 +233,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -267,6 +281,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -276,6 +294,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -289,6 +311,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -384,6 +411,11 @@ msgstr "Kommandot '%s' känns inte igen.\n" msgid "Commit changes" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -570,6 +602,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -615,6 +657,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -832,6 +878,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1043,6 +1094,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1805,6 +1860,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2292,7 +2352,6 @@ msgstr "alternativa argument" #: /usr/lib/python3.11/argparse.py #, fuzzy -#| msgid "Options" msgid "options" msgstr "Alternativ" @@ -2312,6 +2371,10 @@ msgstr "positionella argument" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2383,6 +2446,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2504,6 +2572,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" @@ -2570,50 +2643,3 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "" msgstr[1] "" - -#, python-brace-format -#~ msgid "\"{path}\" is not an accepted format, convert to: {formats}" -#~ msgstr "\"{path}\" är inte ett accepterat format, konvertera till: {formats}" - -#, python-format -#~ msgid "%(prog)s [options] url" -#~ msgstr "%(prog)s [alternativ] url" - -#~ msgid "'sdk_path' not set in 'config.yml'!" -#~ msgstr "'sdk_path' är inte inställt i 'config.yml'!" - -#, python-brace-format -#~ msgid "'{aapt}' is too old, fdroid requires build-tools-23.0.0 or newer!" -#~ msgstr "{aapt} är för gammal, fdroid kräver build-tools-23.0.0 eller nyare!" - -#, python-brace-format -#~ msgid "'{apkfilename}' is already installed on {dev}." -#~ msgstr "'{apkfilename}' är redan installerad på {dev}." - -#~ msgid ".fdroid.txt is not supported! Convert to .fdroid.yml or .fdroid.json." -#~ msgstr ".fdroid.txt stöds inte! Konvertera till .fdroid.yml eller .fdroid.json." - -#~ msgid "Add a new application from its source code" -#~ msgstr "Lägg till en ny applikation från dess källkod" - -#~ msgid "Create skeleton metadata files that are missing" -#~ msgstr "Skapa skelettmetadatafiler som saknas" - -#~ msgid "Dynamically scan APKs post build" -#~ msgstr "Genomsök APK-filer dynamiskt efter byggandet" - -#~ msgid "Produce human-readable index.xml" -#~ msgstr "Producera mänskligt läsbar index.xml" - -#, python-format -#~ msgid "can't open '%s': %s" -#~ msgstr "kan inte öppna '%s': %s" - -#~ msgid "force errors to be warnings, or ignore" -#~ msgstr "tvinga fel att bli varningar, eller ignorera" - -#~ msgid "usage: fdroid [-h|--help|--version] []" -#~ msgstr "användning: fdroid [-h|--help|--version] []" - -#~ msgid "Update the stats of the repo" -#~ msgstr "Uppdatera repostatistik" diff --git a/locale/ta/LC_MESSAGES/fdroidserver.po b/locale/ta/LC_MESSAGES/fdroidserver.po index bc17bb10..d087dc7e 100644 --- a/locale/ta/LC_MESSAGES/fdroidserver.po +++ b/locale/ta/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2022-10-02 15:36+0000\n" "Last-Translator: K.B.Dharun Krishna \n" "Language-Team: Tamil \n" @@ -177,9 +177,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -220,6 +230,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -264,6 +278,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -273,6 +291,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -286,6 +308,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -381,6 +408,11 @@ msgstr "'%s' கட்டளை அங்கீகரிக்கப்படவ msgid "Commit changes" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -567,6 +599,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -612,6 +654,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -829,6 +875,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1040,6 +1091,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1802,6 +1857,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2308,6 +2368,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2379,6 +2443,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2500,6 +2569,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index 064935a7..52abeba5 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2023-02-26 21:02+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" @@ -183,9 +183,19 @@ msgstr "'{path}' yürütülemedi!" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' {appid} içinde geçerli {field} değil. Regex ifadesi: {pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "'{value}' {appid} içinde geçerli {field} değil. Regex ifadesi: {pattern}" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -226,6 +236,10 @@ msgstr "Yalnızca {name} için yeni depo ekleniyor" msgid "Alias of the repo signing key in the keystore" msgstr "Depo imzalama anahtarının anahtar deposundaki takma adı" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "İlk içe aktarım için farklı bir revizyonun (veya git dalının) belirtilmesine izin verir" @@ -270,6 +284,10 @@ msgstr "Android SDK yolu '{path}' bir dizin değil!" msgid "Android SDK tool {cmd} not found!" msgstr "Android SDK aracı {cmd} bulunamadı!" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Uygulamanın NoSourceSince veya ArchivePolicy \"0 sürümü\" var ancak AutoUpdateMode veya UpdateCheckMode Yok değil" @@ -279,6 +297,10 @@ msgstr "Uygulamanın NoSourceSince veya ArchivePolicy \"0 sürümü\" var ancak msgid "App is in '{repo}' but has a link to {url}" msgstr "Uygulama '{repo}' içinde ancak {url} adresine bir bağlantısı var" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Ekleme .gıt gerekli değildir" @@ -292,6 +314,11 @@ msgstr "Geçersiz imza ile {apkfilename} arşivleme!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "UpdateCheckMode ile AutoUpdateMode: HTTP bir desene sahip olmalıdır." +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Yansının temel URL'si, 'şu sorgu dizgisini kullanarak indeks imzalama anahtarını içerebilir: ?fingerprint=" @@ -387,6 +414,11 @@ msgstr "'%s' komutu tanınmıyor.\n" msgid "Commit changes" msgstr "Değişiklikleri işle" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Çakışan argümanlar: '--verbose' ve '--quiet' aynı anda belirtilemez." @@ -573,6 +605,16 @@ msgstr "Depoyu indirmek zaten bir kez başarısız oldu, tekrar denenmiyor." msgid "Downloading {url} failed. {error}" msgstr "{url} indirme başarısız. {error}" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -622,6 +664,10 @@ msgstr "{configname} içinden {var} ortam değişkeni ayarlı değil!" msgid "Error while getting repo address" msgstr "Depo adresi alınırken hata" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Bir kaynak depodan uygulama üst verilerini ayıkla" @@ -839,6 +885,11 @@ msgstr "Kullanımdan kaldırıldığı için '{metapath}' üst verilerindeki '{f msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "2048'den uzun FUNDING.yml girdisi yok sayılıyor: %s" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Üst verisiz paket yok sayılıyor: " @@ -1050,6 +1101,10 @@ msgstr "Tüm dosya türlerini, tam depoyu ve arşivi yansıla." msgid "Missing output directory" msgstr "Eksik çıktı dizini" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "config.yml dosyasında ne \"repo_pubkey\" ne de \"keystorepass\" ayarlandı" @@ -1819,6 +1874,11 @@ msgstr "Java'nın jarsigner'ı kullanılıyor, APK'ları doğrulamak için öner msgid "Using androguard from \"{path}\"" msgstr "\"{path}\" adresinden androguard'ı kullanıyor" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2324,6 +2384,10 @@ msgstr "konumsal argümanlar" msgid "process log deploy {path} to {dest} failed!" msgstr "{path} işlem günlüğünü {dest}'e dağıtma başarısız oldu!" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2395,6 +2459,11 @@ msgstr "srclibs'de ad ve/veya @ eksik" msgid "static library" msgstr "statik kütüphane" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2516,6 +2585,11 @@ msgstr "{appid}: {field} bir '{type}' olmalı, fakat o bir '{fieldtype}'!" msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} bir tam sayı olmalıdır, bulunan: {value}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "{build_flag} bir tam sayı olmalıdır, bulunan: {value}" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/tzm/LC_MESSAGES/fdroidserver.po b/locale/tzm/LC_MESSAGES/fdroidserver.po index 08375be7..4969b452 100644 --- a/locale/tzm/LC_MESSAGES/fdroidserver.po +++ b/locale/tzm/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-681-gc19e8952\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2020-10-29 08:32+0000\n" "Last-Translator: Hakim Oubouali \n" "Language-Team: Central Atlas Tamazight \n" @@ -177,9 +177,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -220,6 +230,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -264,6 +278,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -273,6 +291,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -286,6 +308,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -381,6 +408,11 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -567,6 +599,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -612,6 +654,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -829,6 +875,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1040,6 +1091,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1802,6 +1857,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2308,6 +2368,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2379,6 +2443,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2500,6 +2569,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/ug/LC_MESSAGES/fdroidserver.po b/locale/ug/LC_MESSAGES/fdroidserver.po index fe74f4f1..921c56df 100644 --- a/locale/ug/LC_MESSAGES/fdroidserver.po +++ b/locale/ug/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2018-06-08 03:44+0000\n" "Last-Translator: ۋولقان \n" "Language-Team: Uyghur \n" @@ -178,9 +178,19 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -221,6 +231,10 @@ msgstr "" msgid "Alias of the repo signing key in the keystore" msgstr "" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" @@ -265,6 +279,10 @@ msgstr "" msgid "Android SDK tool {cmd} not found!" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -274,6 +292,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "" @@ -287,6 +309,11 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" @@ -382,6 +409,11 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" @@ -568,6 +600,16 @@ msgstr "" msgid "Downloading {url} failed. {error}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -613,6 +655,10 @@ msgstr "" msgid "Error while getting repo address" msgstr "" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -830,6 +876,11 @@ msgstr "" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1041,6 +1092,10 @@ msgstr "" msgid "Missing output directory" msgstr "" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1803,6 +1858,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2309,6 +2369,10 @@ msgstr "" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2380,6 +2444,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2501,6 +2570,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index a0e86ffd..05cc13aa 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2023-02-23 18:22+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" @@ -188,9 +188,19 @@ msgstr "'{path}' не вдалося виконати!" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' не є правильним {field} у {appid}. Правильний приклад: {pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "'{value}' не є правильним {field} у {appid}. Правильний приклад: {pattern}" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -231,6 +241,10 @@ msgstr "Додати новий репозиторій лише для {name}" msgid "Alias of the repo signing key in the keystore" msgstr "Псевдонім підписного ключа репозиторію у сховищі ключів" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "Дозволяє вказати іншу версію (або git гілку) для початкового імпорту" @@ -275,6 +289,10 @@ msgstr "Android SDK шлях '{path}' це не каталог!" msgid "Android SDK tool {cmd} not found!" msgstr "Інструмент Android SDK {cmd} не знайдено!" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Застосунок має NoSourceSince або ArchivePolicy «0 версій», але AutoUpdateMode або UpdateCheckMode не дорівнюють None" @@ -284,6 +302,10 @@ msgstr "Застосунок має NoSourceSince або ArchivePolicy «0 ве msgid "App is in '{repo}' but has a link to {url}" msgstr "Застосунок '{repo}' але має ланку до {url}" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "Додавання .git не потрібно" @@ -297,6 +319,11 @@ msgstr "Архівую {apkfilename} з неправильним підписо msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode з UpdateCheckMode: HTTP повинен мати шаблон." +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Базова URL-адреса для дзеркала може містити ключ підпису індексу за допомогою рядка запиту: ?fingerprint=" @@ -393,6 +420,11 @@ msgstr "Команда '%s' не визнана.\n" msgid "Commit changes" msgstr "Прийняти зміни" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Конфліктні аргументи: \"---verbose\" і \"--quiet\" не можна вказати одночасно." @@ -579,6 +611,16 @@ msgstr "Завантаження репозиторію вже не вдалос msgid "Downloading {url} failed. {error}" msgstr "Завантаження {url} не вдалося. {error}" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -628,6 +670,10 @@ msgstr "Змінну середовища {var} від {configname} не нал msgid "Error while getting repo address" msgstr "Помилка отримання адреси репозиторію" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "Витяг метаданих застосунку з вихідного репозиторію" @@ -845,6 +891,11 @@ msgstr "Нехтування метаданими '{field}' у метадани msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Нехтування записом FUNDING.yml з датою після 2048 року: %s" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Нехтування пакунком без метаданих: " @@ -1056,6 +1107,10 @@ msgstr "Дзеркало всього репозиторію та архіву msgid "Missing output directory" msgstr "Відсутній вихідний шлях" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "Ні \"repo_pubkey\", ні \"keystorepass\" не встановлені в config.yml" @@ -1826,6 +1881,11 @@ msgstr "Не варто перевіряти APK за допомогою jarsign msgid "Using androguard from \"{path}\"" msgstr "Використання androguard від \"{path}\"" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2333,6 +2393,10 @@ msgstr "позиційні аргументи" msgid "process log deploy {path} to {dest} failed!" msgstr "не вдалося розгорнути журнал процесів {path} до {dest}!" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2404,6 +2468,11 @@ msgstr "srclibs відсутнє ім’я та/чи @" msgid "static library" msgstr "статична бібліотека" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2526,6 +2595,11 @@ msgstr "{appid}: {field} повинно бути '{type}', а не '{fieldtype}' msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} має бути цілим числом, знайдено: {value}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "{build_flag} має бути цілим числом, знайдено: {value}" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index d19a2b6c..931ff0a3 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -30,7 +30,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2023-03-09 02:44+0000\n" "Last-Translator: Max Xie \n" "Language-Team: Chinese (Simplified) \n" @@ -205,9 +205,19 @@ msgstr "'{path}' 执行失败!" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' 不是 {appid} 之有效 {field}. 正则表达式: {pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "'{value}' 不是 {appid} 之有效 {field}. 正则表达式: {pattern}" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -248,6 +258,10 @@ msgstr "仅为 {name} 添加新存储库" msgid "Alias of the repo signing key in the keystore" msgstr "密钥库中存储库签名密钥的别名" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "可让运行初始导入时指定不同修订 ( 或 git 分支 )" @@ -292,6 +306,10 @@ msgstr "Android SDK 路径 '{path}' 不是目录!" msgid "Android SDK tool {cmd} not found!" msgstr "没找到 Android SDK 工具 {cmd}!" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "应用的 NoSourceSince 或 ArchivePolicy 为 “0 versions” 但 AutoUpdateMode 或 UpdateCheckMode 不是 None" @@ -301,6 +319,10 @@ msgstr "应用的 NoSourceSince 或 ArchivePolicy 为 “0 versions” 但 AutoU msgid "App is in '{repo}' but has a link to {url}" msgstr "应用 在 '{repo}' 中, 但有一个链接到 {url}" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "不需要附加 .git" @@ -314,6 +336,11 @@ msgstr "正使用无效签名归档 {apkfilename}!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "镜像的基本链接可以使用此请求参数包含索引签名键: ?fingerprint=" @@ -408,6 +435,11 @@ msgstr "无法识别命令 '%s'。\n" msgid "Commit changes" msgstr "提交更改" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "冲突的参数: '--verbose' 和 '--quiet' 不能被同时使用." @@ -594,6 +626,16 @@ msgstr "下载仓库已经失败了一次,不再尝试。" msgid "Downloading {url} failed. {error}" msgstr "{url} 下载失败。{error}" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -643,6 +685,10 @@ msgstr "没有设置 {configname} 中的环境变量 {var}!" msgid "Error while getting repo address" msgstr "获取存储库地址时出错" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "从源存储库中提取应用程序元数据" @@ -860,6 +906,11 @@ msgstr "忽略“{metapath}”元数据中的“{field}”,因为它已被弃 msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "忽略超过 2048 的 FUNDING.yml 条目:%s" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "忽略没有元数据的包: " @@ -1071,6 +1122,10 @@ msgstr "镜像完整存储库和存档,所有文件类型。" msgid "Missing output directory" msgstr "缺少输出目录" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "config.yml 中既没有设置“repo_pubkey”也没有设置“keystorepass”" @@ -1839,6 +1894,11 @@ msgstr "" msgid "Using androguard from \"{path}\"" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2342,6 +2402,10 @@ msgstr "位置参数" msgid "process log deploy {path} to {dest} failed!" msgstr "" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2413,6 +2477,11 @@ msgstr "" msgid "static library" msgstr "" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2533,6 +2602,11 @@ msgstr "" msgid "{build_flag} must be an integer, found: {value}" msgstr "" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 95c1461c..6eefcc0a 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-03-09 13:11+0100\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Chinese (Traditional) \n" @@ -186,9 +186,19 @@ msgstr "'{path}' 無法執行!" #: ../fdroidserver/metadata.py #, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "{appid} 的 {value}' 為無效 {field}。正規表遠格式:{pattern}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "{appid} 的 {value}' 為無效 {field}。正規表遠格式:{pattern}" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -229,6 +239,10 @@ msgstr "只為 {name} 新增軟體庫" msgid "Alias of the repo signing key in the keystore" msgstr "在金鑰庫裡軟體庫簽署金鑰的別名" +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "允許為初始匯入指定不同的校訂(或 git 分支)" @@ -276,6 +290,10 @@ msgstr "Android SDK 路徑 '{path}' 不是目錄資料夾!" msgid "Android SDK tool {cmd} not found!" msgstr "找到 Android SDK 工具 {cmd} 了!" +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -285,6 +303,10 @@ msgstr "" msgid "App is in '{repo}' but has a link to {url}" msgstr "應用軟體在 '{repo}' 倉庫,但有一個 {url} 連結" +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" msgstr "不必附加上 .git" @@ -298,6 +320,11 @@ msgstr "以無效的簽名歸檔 {apkfilename}!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "基本的 URL 到鏡像,可以包含索引簽署金鑰使用查詢字串:?fingerprint=" @@ -392,6 +419,11 @@ msgstr "無法識別指令 '%s' 。\n" msgid "Commit changes" msgstr "提交變更" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + #: ../fdroidserver/__main__.py #, fuzzy msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." @@ -584,6 +616,16 @@ msgstr "下載軟體庫已失敗過一次,尚未重試。" msgid "Downloading {url} failed. {error}" msgstr "{url} 下載失敗,錯誤訊息 {error}" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" @@ -634,6 +676,10 @@ msgstr "配置文件 {configname} 中的 環境變量 {var} 還沒有設置 !" msgid "Error while getting repo address" msgstr "在接取軟體庫的地址時出錯" +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" msgstr "" @@ -856,6 +902,11 @@ msgstr "忽略 '{metapath}' 中的 '{field}' , 因為它已經過時了。" msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "忽略文檔 FUNDING.yml , 文檔大小超過 2048: %s 。" +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "忽略無中介資料的套件包: " @@ -1075,6 +1126,10 @@ msgstr "保存整個軟體庫和檔案的副本, 所有的檔案格式 。" msgid "Missing output directory" msgstr "輸出目錄消失" +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" msgstr "" @@ -1856,6 +1911,11 @@ msgstr "使用 Java 的 jarsigner,這並不建議用於驗證 APK!使用 apk msgid "Using androguard from \"{path}\"" msgstr "使用從「{path}」而來的 androguard" +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" @@ -2376,6 +2436,10 @@ msgstr "位置參數" msgid "process log deploy {path} to {dest} failed!" msgstr "將進程日誌 {path} 部署到 {dest} 但失敗了!" +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" @@ -2450,6 +2514,11 @@ msgstr "srclibs 缺失名稱或 @" msgid "static library" msgstr "靜態庫 (static library)" +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2571,6 +2640,11 @@ msgstr "{appid}:{field} 必須是一個 '{type}',但它是一個 '{fieldtype msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} 必須是整數, 找到: {value}" +#: ../fdroidserver/metadata.py +#, fuzzy, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "{build_flag} 必須是整數, 找到: {value}" + #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "{file} is blank or corrupt!" From fde880d7803e85fc86ea3b2b88a6d9be0cb5c1b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20D=C3=BCster?= Date: Thu, 25 May 2023 12:33:39 +0200 Subject: [PATCH 1216/2116] scanner: Print all short options before long options This is the default throughout the code base. --- fdroidserver/scanner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 7db619d7..2a943557 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -784,9 +784,9 @@ def main(): help=_("Force scan of disabled apps and builds.")) parser.add_argument("--json", action="store_true", default=False, help=_("Output JSON to stdout.")) - parser.add_argument("--refresh", "-r", action="store_true", default=False, + parser.add_argument("-r", "--refresh", action="store_true", default=False, help=_("fetch the latest version of signatures from the web")) - parser.add_argument("--exit-code", "-e", action="store_true", default=False, + parser.add_argument("-e", "--exit-code", action="store_true", default=False, help=_("Exit with a non-zero code if problems were found")) metadata.add_metadata_arguments(parser) options = parser.parse_args() From df7c9098847c536ff0cefb02aa33815a7d36f85b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 24 May 2023 14:13:17 +0200 Subject: [PATCH 1217/2116] build: add test to ensure Prepare: is only run in VM --- tests/build.TestCase | 134 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) diff --git a/tests/build.TestCase b/tests/build.TestCase index 128b3f4c..4a4c0001 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -918,6 +918,140 @@ class BuildTest(unittest.TestCase): test_flag = ('--skip-scan', True) fdroidserver.build.build_server(app, build, vcs, '', '', '', False) + @mock.patch('fdroidserver.vmtools.get_build_vm') + @mock.patch('fdroidserver.vmtools.get_clean_builder') + @mock.patch('paramiko.SSHClient') + @mock.patch('subprocess.check_output') + @mock.patch('fdroidserver.common.getsrclib') + @mock.patch('fdroidserver.common.prepare_source') + @mock.patch('fdroidserver.build.build_local') + @mock.patch('fdroidserver.common.get_android_tools_version_log', lambda: 'versions') + @mock.patch('fdroidserver.common.deploy_build_log_with_rsync', lambda a, b, c: None) + def test_build_server_no_local_prepare( + self, + build_build_local, + common_prepare_source, + common_getsrclib, + subprocess_check_output, + paramiko_SSHClient, + fdroidserver_vmtools_get_clean_builder, + fdroidserver_vmtools_get_build_vm, + ): + """srclibs Prepare: should only be executed in the buildserver""" + + def _exec_command(args): + print('chan.exec_command', args) + + def _getsrclib( + spec, + srclib_dir, + basepath=False, + raw=False, + prepare=True, + preponly=False, + refresh=True, + build=None, + ): + name, ref = spec.split('@') + libdir = os.path.join(srclib_dir, name) + os.mkdir(libdir) + self.assertFalse(prepare, 'Prepare: scripts should never run on host') + return name, None, libdir # TODO + + os.chdir(self.testdir) + + chan = mock.MagicMock() + chan.exec_command = _exec_command + chan.recv_exit_status = lambda: 0 + transport = mock.MagicMock() + transport.open_session = mock.Mock(return_value=chan) + sshs = mock.MagicMock() + sshs.get_transport = mock.Mock(return_value=transport) + paramiko_SSHClient.return_value = sshs + subprocess_check_output.return_value = ( + b'0123456789abcdef0123456789abcdefcafebabe' + ) + fdroidserver_vmtools_get_clean_builder.side_effect = lambda s: { + 'hostname': 'example.com', + 'idfile': '/path/to/id/file', + 'port': 123, + 'user': 'fake', + } + + fdroidserver.metadata.srclibs = { + 'flutter': { + 'RepoType': 'git', + 'Repo': 'https://github.com/flutter/flutter', + } + } + os.mkdir('srclibs') + with open('srclibs/flutter.yml', 'w') as fp: + yaml.dump(fdroidserver.metadata.srclibs, fp) + common_getsrclib.side_effect = _getsrclib + + options = mock.MagicMock() + options.force = False + options.notarball = True + options.onserver = False + options.refresh = False + options.scan_binary = False + options.server = True + options.skipscan = True + options.test = False + options.verbose = True + fdroidserver.build.options = options + fdroidserver.build.config = {'sdk_path': '/fake/android/sdk/path'} + + vcs = mock.Mock() + vcs.getsrclib = mock.Mock(return_value=None) + app = fdroidserver.metadata.App() + app['metadatapath'] = 'metadata/fake.id.yml' + app['id'] = 'fake.id' + app['RepoType'] = 'git' + spec = 'flutter@v1.7.8' + build = fdroidserver.metadata.Build( + { + 'versionCode': 123, + 'versionName': '1.2.3', + 'commit': '1.2.3', + 'disable': False, + 'srclibs': [spec], + } + ) + app['Builds'] = [build] + + build_dir = 'build' + srclib_dir = os.path.join(build_dir, 'srclib') + extlib_dir = os.path.join(build_dir, 'extlib') + os.mkdir('tmp') + os.mkdir(build_dir) + os.mkdir(srclib_dir) + + fdroidserver.build.trybuild( + app, + build, + build_dir, + 'unsigned', + 'logs', + None, + srclib_dir, + extlib_dir, + 'tmp', + 'repo', + vcs, + options.test, + options.server, + options.force, + options.onserver, + options.refresh, + ) + + common_getsrclib.assert_called_once_with( + spec, srclib_dir, basepath=True, prepare=False + ) + common_prepare_source.assert_not_called() + build_build_local.assert_not_called() + def test_keep_when_not_allowed_default(self): self.assertFalse(fdroidserver.build.keep_when_not_allowed()) From 982ecb45ab456899bdfc8ae625a757c4424ae076 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Thu, 25 May 2023 12:09:13 +0000 Subject: [PATCH 1218/2116] Fix Chinese example in doc string --- fdroidserver/metadata.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index abef3e7a..68826d85 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -804,7 +804,7 @@ def parse_localized_antifeatures(app): │ └── zh-CN/ └── antifeatures/ - └── 123_Ads.txt -> "包括广告图书馆" + └── 123_Ads.txt -> "包括广告库" Gets parsed into the metadata data structure: @@ -816,7 +816,7 @@ def parse_localized_antifeatures(app): antifeatures: Ads: en-US: includes ad lib - zh-CN: 包括广告图书馆 + zh-CN: 包括广告库 Tracking: en-US: standard suspects From aa98d67c86f8429c18842a48e8a338746b197d45 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 24 May 2023 11:54:27 +0200 Subject: [PATCH 1219/2116] metadata: test None in post_metadata_parse --- tests/metadata.TestCase | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 59c2bafe..8f232f4b 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -1999,6 +1999,16 @@ class PostMetadataParseTest(unittest.TestCase): app['Builds'][0][tested_key] = expected return app, post + def test_post_metadata_parse_none(self): + """Run None aka YAML null or blank through the various field and flag types.""" + self.assertEqual(*self._post_metadata_parse_app_list(None, None)) + self.assertEqual(*self._post_metadata_parse_app_string(None, None)) + self.assertEqual(*self._post_metadata_parse_build_bool(None, None)) + self.assertEqual(*self._post_metadata_parse_build_int(None, None)) + self.assertEqual(*self._post_metadata_parse_build_list(None, None)) + self.assertEqual(*self._post_metadata_parse_build_script(None, None)) + self.assertEqual(*self._post_metadata_parse_build_string(None, None)) + def test_post_metadata_parse_int(self): """Run the int 123456 through the various field and flag types.""" with self.assertRaises(TypeError): From 8374842faa9100fcffbf68583f6cdd627b9f99b5 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 24 May 2023 09:03:23 +0200 Subject: [PATCH 1220/2116] metadata: normalize TYPE_BOOL to YAML 1.2 booleans This makes the internal representation always be a boolean, and that also means that YAML 1.2 booleans will be written out, e.g. rewritemeta. --- .gitlab-ci.yml | 1 + fdroidserver/metadata.py | 4 ++++ tests/metadata.TestCase | 20 ++++++++++---------- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0978622d..7a9dd403 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -57,6 +57,7 @@ metadata_v0: - cd fdroiddata - ../tests/dump_internal_metadata_format.py - sed -i + -e '/RequiresRoot:/d' -e "/buildozer/d" -e '/^comments\W /d' -e 's,maven\(\W\) false,maven\1 null,' diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 68826d85..c4b332d0 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -979,6 +979,8 @@ def post_parse_yaml_metadata(yamldata): elif _fieldtype == TYPE_STRINGMAP: if v or v == 0: # TODO probably want just `if v:` yamldata[k] = _normalize_type_stringmap(k, v) + elif _fieldtype == TYPE_BOOL: + yamldata[k] = bool(v) else: if type(v) in (float, int): yamldata[k] = str(v) @@ -1017,6 +1019,8 @@ def post_parse_yaml_metadata(yamldata): elif _flagtype == TYPE_STRINGMAP: if v or v == 0: build[k] = _normalize_type_stringmap(k, v) + elif _flagtype == TYPE_BOOL: + build[k] = bool(v) builds.append(build) diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 8f232f4b..89ce3e8b 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -2014,7 +2014,7 @@ class PostMetadataParseTest(unittest.TestCase): with self.assertRaises(TypeError): self._post_metadata_parse_app_list(123456, TypeError) self.assertEqual(*self._post_metadata_parse_app_string(123456, '123456')) - self.assertEqual(*self._post_metadata_parse_build_bool(123456, 123456)) + self.assertEqual(*self._post_metadata_parse_build_bool(123456, True)) self.assertEqual(*self._post_metadata_parse_build_int(123456, 123456)) self.assertEqual(*self._post_metadata_parse_build_list(123456, ['123456'])) self.assertEqual(*self._post_metadata_parse_build_script(123456, ['123456'])) @@ -2024,7 +2024,7 @@ class PostMetadataParseTest(unittest.TestCase): """Run the int 0 through the various field and flag types.""" self.assertEqual(*self._post_metadata_parse_app_list(0, 0)) self.assertEqual(*self._post_metadata_parse_app_string(0, '0')) - self.assertEqual(*self._post_metadata_parse_build_bool(0, 0)) + self.assertEqual(*self._post_metadata_parse_build_bool(0, False)) self.assertEqual(*self._post_metadata_parse_build_int(0, 0)) self.assertEqual(*self._post_metadata_parse_build_list(0, ['0'])) self.assertEqual(*self._post_metadata_parse_build_script(0, ['0'])) @@ -2034,7 +2034,7 @@ class PostMetadataParseTest(unittest.TestCase): """Run the float 0.0 through the various field and flag types.""" self.assertEqual(*self._post_metadata_parse_app_list(0.0, 0.0)) self.assertEqual(*self._post_metadata_parse_app_string(0.0, '0.0')) - self.assertEqual(*self._post_metadata_parse_build_bool(0.0, 0.0)) + self.assertEqual(*self._post_metadata_parse_build_bool(0.0, False)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int(0.0, MetaDataException) self.assertEqual(*self._post_metadata_parse_build_list(0.0, 0.0)) @@ -2046,7 +2046,7 @@ class PostMetadataParseTest(unittest.TestCase): with self.assertRaises(TypeError): self._post_metadata_parse_app_list(0.1, TypeError) self.assertEqual(*self._post_metadata_parse_app_string(0.1, '0.1')) - self.assertEqual(*self._post_metadata_parse_build_bool(0.1, 0.1)) + self.assertEqual(*self._post_metadata_parse_build_bool(0.1, True)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int(0.1, MetaDataException) self.assertEqual(*self._post_metadata_parse_build_list(0.1, 0.1)) @@ -2058,7 +2058,7 @@ class PostMetadataParseTest(unittest.TestCase): with self.assertRaises(TypeError): self._post_metadata_parse_app_list(1.0, TypeError) self.assertEqual(*self._post_metadata_parse_app_string(1.0, '1.0')) - self.assertEqual(*self._post_metadata_parse_build_bool(1.0, 1.0)) + self.assertEqual(*self._post_metadata_parse_build_bool(1.0, True)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int(1.0, MetaDataException) self.assertEqual(*self._post_metadata_parse_build_list(1.0, 1.0)) @@ -2068,7 +2068,7 @@ class PostMetadataParseTest(unittest.TestCase): def test_post_metadata_parse_empty_list(self): self.assertEqual(*self._post_metadata_parse_app_list(list(), list())) self.assertEqual(*self._post_metadata_parse_app_string(list(), list())) - self.assertEqual(*self._post_metadata_parse_build_bool(list(), list())) + self.assertEqual(*self._post_metadata_parse_build_bool(list(), False)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int(list(), MetaDataException) self.assertEqual(*self._post_metadata_parse_build_list(list(), list())) @@ -2078,7 +2078,7 @@ class PostMetadataParseTest(unittest.TestCase): def test_post_metadata_parse_set_of_1(self): self.assertEqual(*self._post_metadata_parse_app_list({1}, ['1'])) self.assertEqual(*self._post_metadata_parse_app_string({1}, '{1}')) - self.assertEqual(*self._post_metadata_parse_build_bool({1}, {1})) + self.assertEqual(*self._post_metadata_parse_build_bool({1}, True)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int({1}, MetaDataException) self.assertEqual(*self._post_metadata_parse_build_list({1}, {1})) @@ -2088,7 +2088,7 @@ class PostMetadataParseTest(unittest.TestCase): def test_post_metadata_parse_empty_dict(self): self.assertEqual(*self._post_metadata_parse_app_list(dict(), dict())) self.assertEqual(*self._post_metadata_parse_app_string(dict(), dict())) - self.assertEqual(*self._post_metadata_parse_build_bool(dict(), dict())) + self.assertEqual(*self._post_metadata_parse_build_bool(dict(), False)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int(dict(), MetaDataException) self.assertEqual(*self._post_metadata_parse_build_list(dict(), dict())) @@ -2098,7 +2098,7 @@ class PostMetadataParseTest(unittest.TestCase): def test_post_metadata_parse_list_int_string(self): self.assertEqual(*self._post_metadata_parse_app_list([1, 'a'], ['1', 'a'])) self.assertEqual(*self._post_metadata_parse_app_string([1, 'a'], "[1, 'a']")) - self.assertEqual(*self._post_metadata_parse_build_bool([1, 'a'], [1, 'a'])) + self.assertEqual(*self._post_metadata_parse_build_bool([1, 'a'], True)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int([1, 'a'], MetaDataException) self.assertEqual(*self._post_metadata_parse_build_list([1, 'a'], [1, 'a'])) @@ -2108,7 +2108,7 @@ class PostMetadataParseTest(unittest.TestCase): def test_post_metadata_parse_dict_int_string(self): self.assertEqual(*self._post_metadata_parse_app_list({'k': 1}, ['k'])) self.assertEqual(*self._post_metadata_parse_app_string({'k': 1}, "{'k': 1}")) - self.assertEqual(*self._post_metadata_parse_build_bool({'k': 1}, {'k': 1})) + self.assertEqual(*self._post_metadata_parse_build_bool({'k': 1}, True)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int({'k': 1}, MetaDataException) self.assertEqual(*self._post_metadata_parse_build_list({'k': 1}, {'k': 1})) From 9f606d0fbb16a11536ff7b1256c163d8bfd2824f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 4 May 2023 18:34:50 +0200 Subject: [PATCH 1221/2116] metadata: auto-convert YAML special float values: .nan .inf -.inf Even for people who know what the special floats not-a-number, infinity, and negative infinity, they don't necessarily know the YAML 1.2 syntax for these. I didn't. And I've spent some quality time fighting things with those values. They are also easy to reliably convert to string values. --- fdroidserver/metadata.py | 9 +++++++++ tests/metadata.TestCase | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index c4b332d0..7f406e7d 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -20,6 +20,7 @@ import git from pathlib import Path +import math import platform import os import re @@ -897,6 +898,14 @@ def _normalize_type_string(v): if v: return 'true' return 'false' + if isinstance(v, float): + # YAML 1.2 values for NaN, Inf, and -Inf + if math.isnan(v): + return '.nan' + if math.isinf(v): + if v > 0: + return '.inf' + return '-.inf' return str(v) diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 89ce3e8b..2da4b16c 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -965,6 +965,24 @@ class MetadataTest(unittest.TestCase): {'AntiFeatures': {'true': {}}}, ) + def test_parse_yaml_app_antifeatures_float_nan(self): + self.assertEqual( + metadata.parse_yaml_metadata(io.StringIO('AntiFeatures: .nan')), + {'AntiFeatures': {'.nan': {}}}, + ) + + def test_parse_yaml_app_antifeatures_float_inf(self): + self.assertEqual( + metadata.parse_yaml_metadata(io.StringIO('AntiFeatures: .inf')), + {'AntiFeatures': {'.inf': {}}}, + ) + + def test_parse_yaml_app_antifeatures_float_negative_inf(self): + self.assertEqual( + metadata.parse_yaml_metadata(io.StringIO('AntiFeatures: -.inf')), + {'AntiFeatures': {'-.inf': {}}}, + ) + def test_parse_yaml_app_antifeatures_int(self): self.assertEqual( metadata.parse_yaml_metadata(io.StringIO('AntiFeatures: 1')), From 4711b632b8a78e8b0273609b29ece3b6c7c81549 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 24 Apr 2023 23:15:18 +0200 Subject: [PATCH 1222/2116] metadata: _normalize_type_int to handle exceptions --- fdroidserver/metadata.py | 31 +++++++++++++++------- tests/metadata.TestCase | 57 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 75 insertions(+), 13 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 7f406e7d..6d105816 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -884,6 +884,21 @@ def parse_localized_antifeatures(app): app['AntiFeatures'][f.stem][locale] = f.read_text() +def _normalize_type_int(k, v): + """Normalize anything that can be reliably converted to an integer.""" + if isinstance(v, int) and not isinstance(v, bool): + return v + if v is None: + return None + if isinstance(v, str): + try: + return int(v) + except ValueError: + pass + msg = _('{build_flag} must be an integer, found: {value}') + _warn_or_exception(msg.format(build_flag=k, value=v)) + + def _normalize_type_string(v): """Normalize any data to TYPE_STRING. @@ -980,8 +995,9 @@ def post_parse_yaml_metadata(yamldata): elif v: yamldata[k] = [str(i) for i in v] elif _fieldtype == TYPE_INT: - if v: - yamldata[k] = int(v) + v = _normalize_type_int(k, v) + if v or v == 0: + yamldata[k] = v elif _fieldtype == TYPE_STRING: if v or v == 0: yamldata[k] = _normalize_type_string(v) @@ -1005,14 +1021,9 @@ def post_parse_yaml_metadata(yamldata): if v or v == 0: build[k] = _normalize_type_string(v) elif _flagtype == TYPE_INT: - build[k] = v - # versionCode must be int - if not isinstance(v, int): - _warn_or_exception( - _('{build_flag} must be an integer, found: {value}').format( - build_flag=k, value=v - ) - ) + v = _normalize_type_int(k, v) + if v or v == 0: + build[k] = v elif _flagtype in (TYPE_LIST, TYPE_SCRIPT): if isinstance(v, str) or isinstance(v, int): build[k] = [_normalize_type_string(v)] diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 2da4b16c..bb41a3a2 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -355,6 +355,27 @@ class MetadataTest(unittest.TestCase): metadata._normalize_type_stringmap('AntiFeatures', ['Ads', 'Tracking']), ) + def test_normalize_type_int(self): + """TYPE_INT should be an int whenever possible.""" + self.assertEqual(0, metadata._normalize_type_int('key', 0)) + self.assertEqual(1, metadata._normalize_type_int('key', 1)) + self.assertEqual(-5, metadata._normalize_type_int('key', -5)) + self.assertEqual(0, metadata._normalize_type_int('key', '0')) + self.assertEqual(1, metadata._normalize_type_int('key', '1')) + self.assertEqual(-5, metadata._normalize_type_int('key', '-5')) + self.assertEqual( + 12345678901234567890, + metadata._normalize_type_int('key', 12345678901234567890), + ) + + def test_normalize_type_int_fails(self): + with self.assertRaises(MetaDataException): + metadata._normalize_type_int('key', '1a') + with self.assertRaises(MetaDataException): + metadata._normalize_type_int('key', 1.1) + with self.assertRaises(MetaDataException): + metadata._normalize_type_int('key', True) + def test_post_parse_yaml_metadata(self): yamldata = dict() metadata.post_parse_yaml_metadata(yamldata) @@ -383,7 +404,7 @@ class MetadataTest(unittest.TestCase): yamldata, ) - build['versionCode'] = '1' + build['versionCode'] = '1a' self.assertRaises( fdroidserver.exception.MetaDataException, fdroidserver.metadata.post_parse_yaml_metadata, @@ -1124,6 +1145,34 @@ class MetadataTest(unittest.TestCase): }, ) + def test_parse_yaml_build_type_int_fail(self): + mf = io.StringIO('Builds: [{versionCode: 1a}]') + with self.assertRaises(MetaDataException): + fdroidserver.metadata.parse_yaml_metadata(mf) + + def test_parse_yaml_int_strict_typing_fails(self): + """Things that cannot be preserved when parsing as YAML.""" + mf = io.StringIO('Builds: [{versionCode: 1, rm: 0xf}]') + self.assertEqual( + {'Builds': [{'rm': ['15'], 'versionCode': 1}]}, # 15 != 0xf + fdroidserver.metadata.parse_yaml_metadata(mf), + ) + mf = io.StringIO('Builds: [{versionCode: 1, rm: 0x010}]') + self.assertEqual( + {'Builds': [{'rm': ['16'], 'versionCode': 1}]}, # 16 != 0x010 + fdroidserver.metadata.parse_yaml_metadata(mf), + ) + mf = io.StringIO('Builds: [{versionCode: 1, rm: 0o015}]') + self.assertEqual( + {'Builds': [{'rm': ['13'], 'versionCode': 1}]}, # 13 != 0o015 + fdroidserver.metadata.parse_yaml_metadata(mf), + ) + mf = io.StringIO('Builds: [{versionCode: 1, rm: 10_000}]') + self.assertEqual( + {'Builds': [{'rm': ['10000'], 'versionCode': 1}]}, # 10000 != 10_000 + fdroidserver.metadata.parse_yaml_metadata(mf), + ) + def test_write_yaml_1_line_scripts_as_string(self): mf = io.StringIO() app = fdroidserver.metadata.App() @@ -2137,7 +2186,8 @@ class PostMetadataParseTest(unittest.TestCase): self.assertEqual(*self._post_metadata_parse_app_list(False, False)) self.assertEqual(*self._post_metadata_parse_app_string(False, 'false')) self.assertEqual(*self._post_metadata_parse_build_bool(False, False)) - self.assertEqual(*self._post_metadata_parse_build_int(False, False)) + with self.assertRaises(MetaDataException): + self._post_metadata_parse_build_int(False, MetaDataException) self.assertEqual(*self._post_metadata_parse_build_list(False, ['false'])) self.assertEqual(*self._post_metadata_parse_build_script(False, ['false'])) self.assertEqual(*self._post_metadata_parse_build_string(False, 'false')) @@ -2147,7 +2197,8 @@ class PostMetadataParseTest(unittest.TestCase): self._post_metadata_parse_app_list(True, TypeError) self.assertEqual(*self._post_metadata_parse_app_string(True, 'true')) self.assertEqual(*self._post_metadata_parse_build_bool(True, True)) - self.assertEqual(*self._post_metadata_parse_build_int(True, True)) + with self.assertRaises(MetaDataException): + self._post_metadata_parse_build_int(True, MetaDataException) self.assertEqual(*self._post_metadata_parse_build_list(True, ['true'])) self.assertEqual(*self._post_metadata_parse_build_script(True, ['true'])) self.assertEqual(*self._post_metadata_parse_build_string(True, 'true')) From 642e444cfa6107b233943cd89b17828b124a8302 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 25 Apr 2023 12:07:02 +0200 Subject: [PATCH 1223/2116] metadata: _normalize_type_list for TYPE_LIST quirks and errors This should reduce surprises when dealing with filenames in things like `rm:`. So any float/int/bool value can be used directly, without quoting. * A plain str/int/float value is interpreted as a list of one string. * Dictionaries as values throws error. * A set is treated like a list. --- fdroidserver/metadata.py | 35 ++++++----- tests/metadata.TestCase | 123 +++++++++++++++++++++++++++++---------- 2 files changed, 111 insertions(+), 47 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 6d105816..4cd6b04d 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -979,21 +979,35 @@ def _normalize_type_stringmap(k, v): return retdict +def _normalize_type_list(k, v): + """Normalize any data to TYPE_LIST, which is always a list of strings.""" + if isinstance(v, dict): + msg = _('{build_flag} must be list or string, found: {value}') + _warn_or_exception(msg.format(build_flag=k, value=v)) + elif type(v) not in (list, tuple, set): + v = [v] + return [_normalize_type_string(i) for i in v] + + def post_parse_yaml_metadata(yamldata): """Convert human-readable metadata data structures into consistent data structures. + "Be conservative in what is written out, be liberal in what is parsed." + https://en.wikipedia.org/wiki/Robustness_principle + This also handles conversions that make metadata YAML behave something like StrictYAML. Specifically, a field should have a fixed value type, regardless of YAML 1.2's type auto-detection. + TODO: None values should probably be treated as the string 'null', + since YAML 1.2 uses that for nulls + """ for k, v in yamldata.items(): _fieldtype = fieldtype(k) if _fieldtype == TYPE_LIST: - if isinstance(v, str): - yamldata[k] = [v] - elif v: - yamldata[k] = [str(i) for i in v] + if v or v == 0: + yamldata[k] = _normalize_type_list(k, v) elif _fieldtype == TYPE_INT: v = _normalize_type_int(k, v) if v or v == 0: @@ -1025,17 +1039,8 @@ def post_parse_yaml_metadata(yamldata): if v or v == 0: build[k] = v elif _flagtype in (TYPE_LIST, TYPE_SCRIPT): - if isinstance(v, str) or isinstance(v, int): - build[k] = [_normalize_type_string(v)] - else: - build[k] = v - # float and dict are here only to keep things compatible - if type(build[k]) not in (list, tuple, set, float, dict): - _warn_or_exception( - _('{build_flag} must be list or string, found: {value}').format( - build_flag=k, value=v - ) - ) + if v or v == 0: + build[k] = _normalize_type_list(k, v) elif _flagtype == TYPE_STRINGMAP: if v or v == 0: build[k] = _normalize_type_stringmap(k, v) diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index bb41a3a2..deaf51e9 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -376,6 +376,36 @@ class MetadataTest(unittest.TestCase): with self.assertRaises(MetaDataException): metadata._normalize_type_int('key', True) + def test_normalize_type_list(self): + """TYPE_LIST is always a list of strings, no matter what YAML thinks.""" + k = 'placeholder' + yaml = ruamel.yaml.YAML(typ='safe') + self.assertEqual(['1.0'], metadata._normalize_type_list(k, 1.0)) + self.assertEqual(['1234567890'], metadata._normalize_type_list(k, 1234567890)) + self.assertEqual(['false'], metadata._normalize_type_list(k, False)) + self.assertEqual(['true'], metadata._normalize_type_list(k, True)) + self.assertEqual(['foo'], metadata._normalize_type_list(k, 'foo')) + self.assertEqual([], metadata._normalize_type_list(k, list())) + self.assertEqual([], metadata._normalize_type_list(k, tuple())) + self.assertEqual([], metadata._normalize_type_list(k, set())) + self.assertEqual(['0', '1', '2'], metadata._normalize_type_list(k, {0, 1, 2})) + self.assertEqual( + ['a', 'b', 'c', '0', '0.0'], + metadata._normalize_type_list(k, yaml.load('[a, b, c, 0, 0.0]')), + ) + self.assertEqual( + ['1', '1.0', 's', 'true', '{}'], + metadata._normalize_type_list(k, yaml.load('[1, 1.0, s, true, {}]')), + ) + self.assertEqual( + ['1', '1.0', 's', 'true', '{}'], + metadata._normalize_type_list(k, (1, 1.0, 's', True, dict())), + ) + + def test_normalize_type_list_fails(self): + with self.assertRaises(MetaDataException): + metadata._normalize_type_list('placeholder', dict()) + def test_post_parse_yaml_metadata(self): yamldata = dict() metadata.post_parse_yaml_metadata(yamldata) @@ -386,10 +416,18 @@ class MetadataTest(unittest.TestCase): metadata.post_parse_yaml_metadata(yamldata) def test_post_parse_yaml_metadata_fails(self): - yamldata = {'AllowedAPKSigningKeys': True} - with self.assertRaises(TypeError): + yamldata = {'AllowedAPKSigningKeys': {'bad': 'dict-placement'}} + with self.assertRaises(MetaDataException): metadata.post_parse_yaml_metadata(yamldata) + def test_post_parse_yaml_metadata_0padding_fails(self): + """Special case: ideally 0 padding would be kept in string, but it is not.""" + v = '0027293472934293872934729834729834729834729834792837487293847926' + yaml = ruamel.yaml.YAML(typ='safe') + yamldata = yaml.load('AllowedAPKSigningKeys: ' + v) + metadata.post_parse_yaml_metadata(yamldata) + self.assertNotEqual(yamldata['AllowedAPKSigningKeys'], v) + def test_post_parse_yaml_metadata_builds(self): yamldata = OrderedDict() builds = [] @@ -496,14 +534,36 @@ class MetadataTest(unittest.TestCase): ) def test_parse_yaml_metadata_app_type_list_fails(self): - mf = _get_mock_mf('AllowedAPKSigningKeys: true') - with self.assertRaises(TypeError): - metadata.parse_yaml_metadata(mf) - mf = _get_mock_mf('AllowedAPKSigningKeys: 1') - with self.assertRaises(TypeError): + mf = _get_mock_mf('AllowedAPKSigningKeys: {t: f}') + with self.assertRaises(MetaDataException): metadata.parse_yaml_metadata(mf) - self.assertEqual(fdroidserver.metadata.parse_yaml_metadata(mf), dict()) + def test_parse_yaml_metadata_build_type_list_fails(self): + mf = _get_mock_mf('Builds: [{versionCode: 1, rm: {bad: dict-placement}}]') + with self.assertRaises(MetaDataException): + metadata.parse_yaml_metadata(mf) + + def test_parse_yaml_metadata_0padding_fails(self): + """Special case: ideally this would keep 0 padding in string, but it does not. + + It seems the only option is to quote values like that, or add + quirks to the YAML parsing. + + """ + v = '0027293472934293872934729834729834729834729834792837487293847926' + mf = io.StringIO('AllowedAPKSigningKeys: %s' % v) + mf.name = 'mock_filename.yaml' + self.assertNotEqual( + v, + metadata.parse_yaml_metadata(mf)['AllowedAPKSigningKeys'][0], + ) + + mf = io.StringIO('AllowedAPKSigningKeys: "%s"' % v) + mf.name = 'mock_filename.yaml' + self.assertEqual( + v, + metadata.parse_yaml_metadata(mf)['AllowedAPKSigningKeys'][0], + ) def test_parse_yaml_metadata_unknown_app_field(self): mf = io.StringIO( @@ -2078,8 +2138,7 @@ class PostMetadataParseTest(unittest.TestCase): def test_post_metadata_parse_int(self): """Run the int 123456 through the various field and flag types.""" - with self.assertRaises(TypeError): - self._post_metadata_parse_app_list(123456, TypeError) + self.assertEqual(*self._post_metadata_parse_app_list(123456, ['123456'])) self.assertEqual(*self._post_metadata_parse_app_string(123456, '123456')) self.assertEqual(*self._post_metadata_parse_build_bool(123456, True)) self.assertEqual(*self._post_metadata_parse_build_int(123456, 123456)) @@ -2089,7 +2148,7 @@ class PostMetadataParseTest(unittest.TestCase): def test_post_metadata_parse_int_0(self): """Run the int 0 through the various field and flag types.""" - self.assertEqual(*self._post_metadata_parse_app_list(0, 0)) + self.assertEqual(*self._post_metadata_parse_app_list(0, ['0'])) self.assertEqual(*self._post_metadata_parse_app_string(0, '0')) self.assertEqual(*self._post_metadata_parse_build_bool(0, False)) self.assertEqual(*self._post_metadata_parse_build_int(0, 0)) @@ -2099,37 +2158,35 @@ class PostMetadataParseTest(unittest.TestCase): def test_post_metadata_parse_float_0_0(self): """Run the float 0.0 through the various field and flag types.""" - self.assertEqual(*self._post_metadata_parse_app_list(0.0, 0.0)) + self.assertEqual(*self._post_metadata_parse_app_list(0.0, ['0.0'])) self.assertEqual(*self._post_metadata_parse_app_string(0.0, '0.0')) self.assertEqual(*self._post_metadata_parse_build_bool(0.0, False)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int(0.0, MetaDataException) - self.assertEqual(*self._post_metadata_parse_build_list(0.0, 0.0)) - self.assertEqual(*self._post_metadata_parse_build_script(0.0, 0.0)) + self.assertEqual(*self._post_metadata_parse_build_list(0.0, ['0.0'])) + self.assertEqual(*self._post_metadata_parse_build_script(0.0, ['0.0'])) self.assertEqual(*self._post_metadata_parse_build_string(0.0, '0.0')) def test_post_metadata_parse_float_0_1(self): """Run the float 0.1 through the various field and flag types.""" - with self.assertRaises(TypeError): - self._post_metadata_parse_app_list(0.1, TypeError) + self.assertEqual(*self._post_metadata_parse_app_list(0.1, ['0.1'])) self.assertEqual(*self._post_metadata_parse_app_string(0.1, '0.1')) self.assertEqual(*self._post_metadata_parse_build_bool(0.1, True)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int(0.1, MetaDataException) - self.assertEqual(*self._post_metadata_parse_build_list(0.1, 0.1)) - self.assertEqual(*self._post_metadata_parse_build_script(0.1, 0.1)) + self.assertEqual(*self._post_metadata_parse_build_list(0.1, ['0.1'])) + self.assertEqual(*self._post_metadata_parse_build_script(0.1, ['0.1'])) self.assertEqual(*self._post_metadata_parse_build_string(0.1, '0.1')) def test_post_metadata_parse_float_1_0(self): """Run the float 1.0 through the various field and flag types.""" - with self.assertRaises(TypeError): - self._post_metadata_parse_app_list(1.0, TypeError) + self.assertEqual(*self._post_metadata_parse_app_list(1.0, ['1.0'])) self.assertEqual(*self._post_metadata_parse_app_string(1.0, '1.0')) self.assertEqual(*self._post_metadata_parse_build_bool(1.0, True)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int(1.0, MetaDataException) - self.assertEqual(*self._post_metadata_parse_build_list(1.0, 1.0)) - self.assertEqual(*self._post_metadata_parse_build_script(1.0, 1.0)) + self.assertEqual(*self._post_metadata_parse_build_list(1.0, ['1.0'])) + self.assertEqual(*self._post_metadata_parse_build_script(1.0, ['1.0'])) self.assertEqual(*self._post_metadata_parse_build_string(1.0, '1.0')) def test_post_metadata_parse_empty_list(self): @@ -2148,8 +2205,8 @@ class PostMetadataParseTest(unittest.TestCase): self.assertEqual(*self._post_metadata_parse_build_bool({1}, True)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int({1}, MetaDataException) - self.assertEqual(*self._post_metadata_parse_build_list({1}, {1})) - self.assertEqual(*self._post_metadata_parse_build_script({1}, {1})) + self.assertEqual(*self._post_metadata_parse_build_list({1}, ['1'])) + self.assertEqual(*self._post_metadata_parse_build_script({1}, ['1'])) self.assertEqual(*self._post_metadata_parse_build_string({1}, '{1}')) def test_post_metadata_parse_empty_dict(self): @@ -2168,22 +2225,25 @@ class PostMetadataParseTest(unittest.TestCase): self.assertEqual(*self._post_metadata_parse_build_bool([1, 'a'], True)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int([1, 'a'], MetaDataException) - self.assertEqual(*self._post_metadata_parse_build_list([1, 'a'], [1, 'a'])) - self.assertEqual(*self._post_metadata_parse_build_script([1, 'a'], [1, 'a'])) + self.assertEqual(*self._post_metadata_parse_build_list([1, 'a'], ['1', 'a'])) + self.assertEqual(*self._post_metadata_parse_build_script([1, 'a'], ['1', 'a'])) self.assertEqual(*self._post_metadata_parse_build_string([1, 'a'], "[1, 'a']")) def test_post_metadata_parse_dict_int_string(self): - self.assertEqual(*self._post_metadata_parse_app_list({'k': 1}, ['k'])) + with self.assertRaises(MetaDataException): + self._post_metadata_parse_app_list({'k': 1}, MetaDataException) self.assertEqual(*self._post_metadata_parse_app_string({'k': 1}, "{'k': 1}")) self.assertEqual(*self._post_metadata_parse_build_bool({'k': 1}, True)) with self.assertRaises(MetaDataException): self._post_metadata_parse_build_int({'k': 1}, MetaDataException) - self.assertEqual(*self._post_metadata_parse_build_list({'k': 1}, {'k': 1})) - self.assertEqual(*self._post_metadata_parse_build_script({'k': 1}, {'k': 1})) + with self.assertRaises(MetaDataException): + self._post_metadata_parse_build_list({'k': 1}, MetaDataException) + with self.assertRaises(MetaDataException): + self._post_metadata_parse_build_script({'k': 1}, MetaDataException) self.assertEqual(*self._post_metadata_parse_build_string({'k': 1}, "{'k': 1}")) def test_post_metadata_parse_false(self): - self.assertEqual(*self._post_metadata_parse_app_list(False, False)) + self.assertEqual(*self._post_metadata_parse_app_list(False, ['false'])) self.assertEqual(*self._post_metadata_parse_app_string(False, 'false')) self.assertEqual(*self._post_metadata_parse_build_bool(False, False)) with self.assertRaises(MetaDataException): @@ -2193,8 +2253,7 @@ class PostMetadataParseTest(unittest.TestCase): self.assertEqual(*self._post_metadata_parse_build_string(False, 'false')) def test_post_metadata_parse_true(self): - with self.assertRaises(TypeError): - self._post_metadata_parse_app_list(True, TypeError) + self.assertEqual(*self._post_metadata_parse_app_list(True, ['true'])) self.assertEqual(*self._post_metadata_parse_app_string(True, 'true')) self.assertEqual(*self._post_metadata_parse_build_bool(True, True)) with self.assertRaises(MetaDataException): From 2aa0403208348e0d1ff4b1845a71b5be6521a1d1 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 4 May 2023 22:06:42 +0200 Subject: [PATCH 1224/2116] metadata: handle SHA-256 values that parse as decimal ints https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1350#note_1370665635 --- fdroidserver/metadata.py | 8 ++++++ tests/metadata.TestCase | 53 +++++++++++++++++++++------------------- 2 files changed, 36 insertions(+), 25 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 4cd6b04d..a4203b08 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -908,6 +908,11 @@ def _normalize_type_string(v): numbers. Like "versionName: 1.0" would be a YAML float, but should be a string. + SHA-256 values are string values, but YAML 1.2 can interpret some + unquoted values as decimal ints. This converts those to a string + if they are over 50 digits. In the wild, the longest 0 padding on + a SHA-256 key fingerprint I found was 8 zeros. + """ if isinstance(v, bool): if v: @@ -921,6 +926,9 @@ def _normalize_type_string(v): if v > 0: return '.inf' return '-.inf' + if v and isinstance(v, int): + if math.log10(v) > 50: # only if the int has this many digits + return '%064d' % v return str(v) diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index deaf51e9..777002bc 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -343,6 +343,13 @@ class MetadataTest(unittest.TestCase): self.assertEqual('false', metadata._normalize_type_string(False)) self.assertEqual('true', metadata._normalize_type_string(True)) + def test_normalize_type_string_sha256(self): + """SHA-256 values are TYPE_STRING, which YAML can parse as decimal ints.""" + yaml = ruamel.yaml.YAML(typ='safe') + for v in range(1, 1000): + s = '%064d' % (v * (10**51)) + self.assertEqual(s, metadata._normalize_type_string(yaml.load(s))) + def test_normalize_type_stringmap_none(self): self.assertEqual(dict(), metadata._normalize_type_stringmap('key', None)) @@ -420,13 +427,13 @@ class MetadataTest(unittest.TestCase): with self.assertRaises(MetaDataException): metadata.post_parse_yaml_metadata(yamldata) - def test_post_parse_yaml_metadata_0padding_fails(self): - """Special case: ideally 0 padding would be kept in string, but it is not.""" + def test_post_parse_yaml_metadata_0padding_sha256(self): + """SHA-256 values are strings, but YAML 1.2 will read some as decimal ints.""" v = '0027293472934293872934729834729834729834729834792837487293847926' yaml = ruamel.yaml.YAML(typ='safe') yamldata = yaml.load('AllowedAPKSigningKeys: ' + v) metadata.post_parse_yaml_metadata(yamldata) - self.assertNotEqual(yamldata['AllowedAPKSigningKeys'], v) + self.assertEqual(yamldata['AllowedAPKSigningKeys'], [v]) def test_post_parse_yaml_metadata_builds(self): yamldata = OrderedDict() @@ -543,28 +550,6 @@ class MetadataTest(unittest.TestCase): with self.assertRaises(MetaDataException): metadata.parse_yaml_metadata(mf) - def test_parse_yaml_metadata_0padding_fails(self): - """Special case: ideally this would keep 0 padding in string, but it does not. - - It seems the only option is to quote values like that, or add - quirks to the YAML parsing. - - """ - v = '0027293472934293872934729834729834729834729834792837487293847926' - mf = io.StringIO('AllowedAPKSigningKeys: %s' % v) - mf.name = 'mock_filename.yaml' - self.assertNotEqual( - v, - metadata.parse_yaml_metadata(mf)['AllowedAPKSigningKeys'][0], - ) - - mf = io.StringIO('AllowedAPKSigningKeys: "%s"' % v) - mf.name = 'mock_filename.yaml' - self.assertEqual( - v, - metadata.parse_yaml_metadata(mf)['AllowedAPKSigningKeys'][0], - ) - def test_parse_yaml_metadata_unknown_app_field(self): mf = io.StringIO( textwrap.dedent( @@ -2146,6 +2131,24 @@ class PostMetadataParseTest(unittest.TestCase): self.assertEqual(*self._post_metadata_parse_build_script(123456, ['123456'])) self.assertEqual(*self._post_metadata_parse_build_string(123456, '123456')) + def test_post_metadata_parse_sha256(self): + """Run a SHA-256 that YAML calls an int through the various types. + + The current f-droid.org signer set has SHA-256 values with a + maximum of two leading zeros, but this will handle more. + + """ + yaml = ruamel.yaml.YAML(typ='safe', pure=True) + str_sha256 = '0000000000000498456908409534729834729834729834792837487293847926' + sha256 = yaml.load('a: ' + str_sha256)['a'] + self.assertEqual(*self._post_metadata_parse_app_list(sha256, [str_sha256])) + self.assertEqual(*self._post_metadata_parse_app_string(sha256, str_sha256)) + self.assertEqual(*self._post_metadata_parse_build_bool(sha256, True)) + self.assertEqual(*self._post_metadata_parse_build_int(sha256, sha256)) + self.assertEqual(*self._post_metadata_parse_build_list(sha256, [str_sha256])) + self.assertEqual(*self._post_metadata_parse_build_script(sha256, [str_sha256])) + self.assertEqual(*self._post_metadata_parse_build_string(sha256, str_sha256)) + def test_post_metadata_parse_int_0(self): """Run the int 0 through the various field and flag types.""" self.assertEqual(*self._post_metadata_parse_app_list(0, ['0'])) From 2efc9437ab6dac668607af9d43f84208c1e27cb6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 25 May 2023 16:52:14 +0200 Subject: [PATCH 1225/2116] gitlab-ci: purge stale removals from metadata_v0 job. --- .gitlab-ci.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7a9dd403..6193e6ff 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -58,9 +58,6 @@ metadata_v0: - ../tests/dump_internal_metadata_format.py - sed -i -e '/RequiresRoot:/d' - -e "/buildozer/d" - -e '/^comments\W /d' - -e 's,maven\(\W\) false,maven\1 null,' metadata/dump_*/*.yaml - diff -uw metadata/dump_* From d3521d7374d92b804fbdc06bd495e259412738eb Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 24 May 2023 14:57:32 +0200 Subject: [PATCH 1226/2116] metadata: case-insensitive sort for AntiFeatures Categories --- fdroidserver/metadata.py | 4 +++- tests/metadata.TestCase | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index a4203b08..484b9b51 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -1127,7 +1127,7 @@ def _format_stringmap(appid, field, stringmap, versionCode=None): make_list = False break if make_list: - return outlist + return sorted(outlist, key=str.lower) return stringmap @@ -1208,6 +1208,8 @@ def _app_to_yaml(app): if field == 'Builds': if app.get('Builds'): cm.update({field: _builds_to_yaml(app)}) + elif field == 'Categories': + cm[field] = sorted(value, key=str.lower) elif field == 'CurrentVersionCode': cm[field] = _field_to_yaml(TYPE_INT, value) elif field == 'AntiFeatures': diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 777002bc..631f0d9f 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -2019,6 +2019,20 @@ class MetadataTest(unittest.TestCase): appid, field, {afname: {'uz': 'a', locale: 'b', 'zh': 'c'}}, versionCode ) + def test_app_to_yaml_one_category(self): + """Categories does not get simplified to string when outputting YAML.""" + self.assertEqual( + metadata._app_to_yaml({'Categories': ['one']}), + {'Categories': ['one']}, + ) + + def test_app_to_yaml_categories(self): + """Sort case-insensitive before outputting YAML.""" + self.assertEqual( + metadata._app_to_yaml({'Categories': ['c', 'a', 'B']}), + {'Categories': ['a', 'B', 'c']}, + ) + class PostMetadataParseTest(unittest.TestCase): """Test the functions that post process the YAML input. From 26b2cffdcc5d6bd768755fc0f93eea804d2f8b1f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 24 May 2023 16:44:34 +0200 Subject: [PATCH 1227/2116] metadata: tests for converting Builds: entries for writing out * The metadata.Builds() class initializes all possible flags, then the flags with init values are filtered out when writing out YAML. * TYPE_SCRIPT flags with one entry will be converted to a string. --- tests/metadata.TestCase | 61 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 631f0d9f..fd15c5e7 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -1894,6 +1894,10 @@ class MetadataTest(unittest.TestCase): app = metadata.App({'Builds': [metadata.Build({'rm': ['one']})]}) self.assertEqual({'rm': ['one']}, metadata._app_to_yaml(app)['Builds'][0]) + def test_app_to_yaml_build_list_two(self): + app = metadata.App({'Builds': [metadata.Build({'rm': ['1', '2']})]}) + self.assertEqual({'rm': ['1', '2']}, metadata._app_to_yaml(app)['Builds'][0]) + def test_app_to_yaml_build_list(self): app = metadata.App({'Builds': [metadata.Build({'rm': ['b2', 'NO1']})]}) self.assertEqual({'rm': ['b2', 'NO1']}, metadata._app_to_yaml(app)['Builds'][0]) @@ -2033,6 +2037,63 @@ class MetadataTest(unittest.TestCase): {'Categories': ['a', 'B', 'c']}, ) + def test_builds_to_yaml_gradle_yes(self): + app = {'Builds': [{'versionCode': 0, 'gradle': ['yes']}]} + self.assertEqual( + metadata._builds_to_yaml(app), [{'versionCode': 0, 'gradle': ['yes']}] + ) + + def test_builds_to_yaml_gradle_off(self): + app = {'Builds': [{'versionCode': 0, 'gradle': ['off']}]} + self.assertEqual( + metadata._builds_to_yaml(app), [{'versionCode': 0, 'gradle': ['off']}] + ) + + def test_builds_to_yaml_gradle_true(self): + app = {'Builds': [{'versionCode': 0, 'gradle': ['true']}]} + self.assertEqual( + metadata._builds_to_yaml(app), [{'versionCode': 0, 'gradle': ['true']}] + ) + + def test_builds_to_yaml_gradle_false(self): + app = {'Builds': [{'versionCode': 0, 'gradle': ['false']}]} + self.assertEqual( + metadata._builds_to_yaml(app), [{'versionCode': 0, 'gradle': ['false']}] + ) + + def test_builds_to_yaml(self): + """Include one of each flag type with a valid value.""" + app = { + 'Builds': [ + metadata.Build( + { + 'versionCode': 0, + 'gradle': ['free'], + 'rm': ['0', '2'], + 'submodules': True, + 'timeout': 0, + 'init': ['false', 'two'], + } + ) + ] + } + # check that metadata.Build() inited flag values + self.assertEqual(app['Builds'][0]['scanignore'], list()) + # then unchanged values should be removed by _builds_to_yaml + self.assertEqual( + metadata._builds_to_yaml(app), + [ + { + 'versionCode': 0, + 'gradle': ['free'], + 'rm': ['0', '2'], + 'submodules': True, + 'timeout': 0, + 'init': ['false', 'two'], + } + ], + ) + class PostMetadataParseTest(unittest.TestCase): """Test the functions that post process the YAML input. From e64f121c0c4011bf98ecd05e4209b0bf0be08120 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 24 May 2023 21:44:36 +0200 Subject: [PATCH 1228/2116] metadata: type conversion happens at parsing, not at writing These test cases were writing assuming they had to transform the data format. That is no longer the case. Going forward, the parsing process converts everything to a standardized format. That will hopefully be enforceable by the JSON Schema in the future. --- tests/metadata.TestCase | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index fd15c5e7..343d2b1c 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -720,7 +720,7 @@ class MetadataTest(unittest.TestCase): build.versionCode = '0' # taken from fdroidserver/import.py build.disable = 'Generated by import.py ...' build.commit = 'Unknown' - build.gradle = [True] + build.gradle = ['yes'] app['Builds'] = [build] fdroidserver.metadata.write_yaml(mf, app) @@ -745,7 +745,7 @@ class MetadataTest(unittest.TestCase): disable: Generated by import.py ... commit: Unknown gradle: - - true + - yes AutoUpdateMode: None UpdateCheckMode: Tags @@ -1886,10 +1886,6 @@ class MetadataTest(unittest.TestCase): app = metadata.App({'Builds': [metadata.Build({'rm': []})]}) self.assertEqual(dict(), metadata._app_to_yaml(app)['Builds'][0]) - def test_app_to_yaml_build_list_string(self): - app = metadata.App({'Builds': [metadata.Build({'rm': 'one'})]}) - self.assertEqual({'rm': 'one'}, metadata._app_to_yaml(app)['Builds'][0]) - def test_app_to_yaml_build_list_one(self): app = metadata.App({'Builds': [metadata.Build({'rm': ['one']})]}) self.assertEqual({'rm': ['one']}, metadata._app_to_yaml(app)['Builds'][0]) From 070dae14316dac858069b1299b609317bb3f1be6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 24 May 2023 16:18:24 +0200 Subject: [PATCH 1229/2116] versionCode is an int everywhere since !1176 fixed #332 --- tests/metadata.TestCase | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 343d2b1c..52f1bf6e 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -717,7 +717,7 @@ class MetadataTest(unittest.TestCase): app.UpdateCheckMode = 'Tags' build = fdroidserver.metadata.Build() build.versionName = 'Unknown' # taken from fdroidserver/import.py - build.versionCode = '0' # taken from fdroidserver/import.py + build.versionCode = 0 # taken from fdroidserver/import.py build.disable = 'Generated by import.py ...' build.commit = 'Unknown' build.gradle = ['yes'] From 1bc9b41a2be80502ced56dac0443e5c965ec59a4 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 24 May 2023 16:46:41 +0200 Subject: [PATCH 1230/2116] metadata: YAML 1.2 handles `gradle: off` now, "off" isn't a boolean Before switching to YAML 1.2, there needed to be special handling of values that YAML parsed as booleans. --- fdroidserver/metadata.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 484b9b51..9688ea6c 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -1172,10 +1172,6 @@ def _builds_to_yaml(app): for field in build_flags: if hasattr(build, field): value = getattr(build, field) - if field == 'gradle' and value == ['off']: - value = [ - ruamel.yaml.scalarstring.SingleQuotedScalarString('off') - ] typ = flagtype(field) # don't check value == True for TYPE_INT as it could be 0 if value and typ == TYPE_STRINGMAP: From b055559df70be140162ac299208111e31c2d4889 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 24 May 2023 15:28:25 +0200 Subject: [PATCH 1231/2116] metadata: remove STRING/INT conversion on output The type conversion should all happen in post_parse_yaml_metadata whenever possible. Also, when `if` blocks end in `return`, it is clearer if no `elif` or `else` is used. --- fdroidserver/metadata.py | 55 ++++++++++++++++++++-------------------- tests/metadata.TestCase | 29 +++++++++++++++++++++ 2 files changed, 57 insertions(+), 27 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 9688ea6c..29ac8b96 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -1070,6 +1070,20 @@ def post_parse_yaml_metadata(yamldata): } +def _format_multiline(value): + """TYPE_MULTILINE with newlines in them are saved as YAML literal strings.""" + if '\n' in value: + return ruamel.yaml.scalarstring.preserve_literal(str(value)) + return str(value) + + +def _format_script(value): + """TYPE_SCRIPT with one value are converted to YAML string values.""" + if len(value) == 1: + return value[0] + return value + + def _format_stringmap(appid, field, stringmap, versionCode=None): """Format TYPE_STRINGMAP taking into account localized files in the metadata dir. @@ -1142,27 +1156,6 @@ def _del_duplicated_NoSourceSince(app): del app['AntiFeatures'][key] -def _field_to_yaml(typ, value): - """Convert data to YAML 1.2 format that keeps the right TYPE_*.""" - if typ == TYPE_STRING: - return str(value) - elif typ == TYPE_INT: - return int(value) - elif typ == TYPE_MULTILINE: - if '\n' in value: - return ruamel.yaml.scalarstring.preserve_literal(str(value)) - else: - return str(value) - elif typ == TYPE_SCRIPT: - if type(value) == list: - if len(value) == 1: - return value[0] - else: - return value - else: - return value - - def _builds_to_yaml(app): builds = ruamel.yaml.comments.CommentedSeq() for build in app.get('Builds', []): @@ -1179,7 +1172,7 @@ def _builds_to_yaml(app): if v: b[field] = v elif value is not None and (typ == TYPE_INT or value): - b.update({field: _field_to_yaml(typ, value)}) + b[field] = value builds.append(b) @@ -1201,13 +1194,12 @@ def _app_to_yaml(app): else: value = app.get(field) if value or field == 'Builds': + _fieldtype = fieldtype(field) if field == 'Builds': if app.get('Builds'): cm.update({field: _builds_to_yaml(app)}) elif field == 'Categories': cm[field] = sorted(value, key=str.lower) - elif field == 'CurrentVersionCode': - cm[field] = _field_to_yaml(TYPE_INT, value) elif field == 'AntiFeatures': v = _format_stringmap(app['id'], field, value) if v: @@ -1215,11 +1207,20 @@ def _app_to_yaml(app): elif field == 'AllowedAPKSigningKeys': value = [str(i).lower() for i in value] if len(value) == 1: - cm[field] = _field_to_yaml(TYPE_STRING, value[0]) + cm[field] = value[0] else: - cm[field] = _field_to_yaml(TYPE_LIST, value) + cm[field] = value + elif _fieldtype == TYPE_MULTILINE: + v = _format_multiline(value) + if v: + cm[field] = v + elif _fieldtype == TYPE_SCRIPT: + v = _format_script(value) + if v: + cm[field] = v else: - cm[field] = _field_to_yaml(fieldtype(field), value) + if value: + cm[field] = value if insert_newline: # we need to prepend a newline in front of this field diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 52f1bf6e..f430fede 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -1920,6 +1920,35 @@ class MetadataTest(unittest.TestCase): cm = metadata._app_to_yaml(metadata.App({'CurrentVersionCode': 0})) self.assertFalse('CurrentVersionCode' in cm) + def test_format_multiline(self): + self.assertEqual(metadata._format_multiline('description'), 'description') + + def test_format_multiline_empty(self): + self.assertEqual(metadata._format_multiline(''), '') + + def test_format_multiline_newline_char(self): + self.assertEqual(metadata._format_multiline('one\\ntwo'), 'one\\ntwo') + + def test_format_multiline_newlines(self): + self.assertEqual( + metadata._format_multiline( + textwrap.dedent( + """ + one + two + three + """ + ) + ), + '\none\ntwo\nthree\n', + ) + + def test_format_script_newline(self): + self.assertEqual(metadata._format_script(['one\ntwo']), 'one\ntwo') + + def test_format_script_newline_char(self): + self.assertEqual(metadata._format_script(['one\\ntwo']), 'one\\ntwo') + def test_format_stringmap_empty(self): self.assertEqual( metadata._format_stringmap('🔥', 'test', dict()), From 689786eea43bfdea46cc29b1acf63fb93e44f323 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 24 May 2023 18:43:48 +0200 Subject: [PATCH 1232/2116] metadata: refactor _builds_to_yaml to use dicts and _format functions _builds_to_yaml does not use any features of the metadata.Build class, so it can operate on plain dicts as well. It also does not need to output Build instances because those are converted to plain dicts when writing out to YAML. --- fdroidserver/metadata.py | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 29ac8b96..3692e7cb 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -1157,22 +1157,31 @@ def _del_duplicated_NoSourceSince(app): def _builds_to_yaml(app): + """Reformat Builds: flags for output to YAML 1.2. + + This will strip any flag/value that is not set or is empty. + TYPE_BOOL fields are removed when they are false. 0 is valid + value, it should not be stripped, so there are special cases to + handle that. + + """ builds = ruamel.yaml.comments.CommentedSeq() for build in app.get('Builds', []): - if not isinstance(build, Build): - build = Build(build) b = ruamel.yaml.comments.CommentedMap() for field in build_flags: - if hasattr(build, field): - value = getattr(build, field) - typ = flagtype(field) - # don't check value == True for TYPE_INT as it could be 0 - if value and typ == TYPE_STRINGMAP: - v = _format_stringmap(app['id'], field, value, build['versionCode']) - if v: - b[field] = v - elif value is not None and (typ == TYPE_INT or value): - b[field] = value + v = build.get(field) + if v is None or v is False or v == '' or v == dict() or v == list(): + continue + _flagtype = flagtype(field) + if _flagtype == TYPE_MULTILINE: + v = _format_multiline(v) + elif _flagtype == TYPE_SCRIPT: + v = _format_script(v) + elif _flagtype == TYPE_STRINGMAP: + v = _format_stringmap(app['id'], field, v, build['versionCode']) + + if v or v == 0: + b[field] = v builds.append(b) From fac7ceffe387279a1e19965afcd282939dc3a464 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 24 May 2023 21:54:29 +0200 Subject: [PATCH 1233/2116] metadata: remove non-values from Builds: entries --- fdroidserver/metadata.py | 8 ++++++++ tests/metadata.TestCase | 30 ++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 3692e7cb..d41b8fd9 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -1077,8 +1077,14 @@ def _format_multiline(value): return str(value) +def _format_list(value): + """TYPE_LIST should not contain null values.""" + return [v for v in value if v] + + def _format_script(value): """TYPE_SCRIPT with one value are converted to YAML string values.""" + value = [v for v in value if v] if len(value) == 1: return value[0] return value @@ -1175,6 +1181,8 @@ def _builds_to_yaml(app): _flagtype = flagtype(field) if _flagtype == TYPE_MULTILINE: v = _format_multiline(v) + elif _flagtype == TYPE_LIST: + v = _format_list(v) elif _flagtype == TYPE_SCRIPT: v = _format_script(v) elif _flagtype == TYPE_STRINGMAP: diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index f430fede..064c9ce8 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -1943,6 +1943,24 @@ class MetadataTest(unittest.TestCase): '\none\ntwo\nthree\n', ) + def test_format_list_empty(self): + self.assertEqual(metadata._format_list(['', None]), list()) + + def test_format_list_one_empty(self): + self.assertEqual(metadata._format_list(['foo', None]), ['foo']) + + def test_format_list_two(self): + self.assertEqual(metadata._format_list(['2', '1']), ['2', '1']) + + def test_format_list_newline(self): + self.assertEqual(metadata._format_list(['one\ntwo']), ['one\ntwo']) + + def test_format_list_newline_char(self): + self.assertEqual(metadata._format_list(['one\\ntwo']), ['one\\ntwo']) + + def test_format_script_empty(self): + self.assertEqual(metadata._format_script(['', None]), list()) + def test_format_script_newline(self): self.assertEqual(metadata._format_script(['one\ntwo']), 'one\ntwo') @@ -2086,6 +2104,18 @@ class MetadataTest(unittest.TestCase): metadata._builds_to_yaml(app), [{'versionCode': 0, 'gradle': ['false']}] ) + def test_builds_to_yaml_stripped(self): + self.assertEqual( + metadata._builds_to_yaml( + { + 'Builds': [ + metadata.Build({'versionCode': 0, 'rm': [None], 'init': ['']}) + ] + } + ), + [{'versionCode': 0}], + ) + def test_builds_to_yaml(self): """Include one of each flag type with a valid value.""" app = { From 337974cbedf673a528cc6df8b17e0550906b3115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20D=C3=BCster?= Date: Thu, 25 May 2023 19:05:57 +0200 Subject: [PATCH 1234/2116] metadata: Make ArchivePolicy an interger internally --- .gitlab-ci.yml | 1 + fdroidserver/lint.py | 20 +++++++++++++------ fdroidserver/metadata.py | 14 ++++++++----- fdroidserver/update.py | 4 ++-- .../app.with.special.build.params.yml | 2 +- .../org.fdroid.fdroid.yml | 2 +- tests/metadata.TestCase | 2 +- .../app.with.special.build.params.yml | 2 +- .../dump/app.with.special.build.params.yaml | 2 +- tests/metadata/dump/com.politedroid.yaml | 2 +- tests/metadata/dump/org.videolan.vlc.yaml | 2 +- tests/update.TestCase | 2 +- 12 files changed, 34 insertions(+), 21 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6193e6ff..636de406 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -57,6 +57,7 @@ metadata_v0: - cd fdroiddata - ../tests/dump_internal_metadata_format.py - sed -i + -e '/ArchivePolicy:/d' -e '/RequiresRoot:/d' metadata/dump_*/*.yaml - diff -uw metadata/dump_* diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index ba21295c..0fc4aa5e 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -635,6 +635,17 @@ def check_app_field_types(app): fieldtype=v.__class__.__name__, ) ) + elif t == metadata.TYPE_INT and not isinstance(v, int): + yield ( + _( + "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" + ).format( + appid=app.id, + field=field, + type='int', + fieldtype=v.__class__.__name__, + ) + ) def check_antiFeatures(app): @@ -693,8 +704,7 @@ def check_for_unsupported_metadata_files(basedir=""): def check_current_version_code(app): """Check that the CurrentVersionCode is currently available.""" - archive_policy = app.get('ArchivePolicy') - if archive_policy and archive_policy.split()[0] == "0": + if app.get('ArchivePolicy') == 0: return cv = app.get('CurrentVersionCode') if cv is not None and cv == 0: @@ -724,13 +734,11 @@ def check_current_version_code(app): def check_updates_expected(app): """Check if update checking makes sense.""" - if ( - app.get('NoSourceSince') or app.get('ArchivePolicy') == '0 versions' - ) and not all( + if (app.get('NoSourceSince') or app.get('ArchivePolicy') == 0) and not all( app.get(key, 'None') == 'None' for key in ('AutoUpdateMode', 'UpdateCheckMode') ): yield _( - 'App has NoSourceSince or ArchivePolicy "0 versions" but AutoUpdateMode or UpdateCheckMode are not None' + 'App has NoSourceSince or ArchivePolicy "0 versions" or 0 but AutoUpdateMode or UpdateCheckMode are not None' ) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index d41b8fd9..132d2f8c 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -195,6 +195,7 @@ fieldtypes = { 'Builds': TYPE_BUILD, 'VercodeOperation': TYPE_LIST, 'CurrentVersionCode': TYPE_INT, + 'ArchivePolicy': TYPE_INT, } @@ -447,10 +448,6 @@ valuetypes = { r'^[a-fA-F0-9]{64}$', ["AllowedAPKSigningKeys"]), - FieldValidator("Archive Policy", - r'^[0-9]+ versions$', - ["ArchivePolicy"]), - FieldValidator("Auto Update Mode", r"^(Version.*|None)$", ["AutoUpdateMode"]), @@ -1017,6 +1014,9 @@ def post_parse_yaml_metadata(yamldata): if v or v == 0: yamldata[k] = _normalize_type_list(k, v) elif _fieldtype == TYPE_INT: + # ArchivePolicy used to require " versions" in the value. + if k == 'ArchivePolicy' and isinstance(v, str): + v = v.split(' ', maxsplit=1)[0] v = _normalize_type_int(k, v) if v or v == 0: yamldata[k] = v @@ -1210,7 +1210,7 @@ def _app_to_yaml(app): insert_newline = True else: value = app.get(field) - if value or field == 'Builds': + if value or field in ('Builds', 'ArchivePolicy'): _fieldtype = fieldtype(field) if field == 'Builds': if app.get('Builds'): @@ -1226,6 +1226,10 @@ def _app_to_yaml(app): if len(value) == 1: cm[field] = value[0] else: + elif field == 'ArchivePolicy': + if value is None: + continue + cm[field] = _field_to_yaml(fieldtype(field), value) cm[field] = value elif _fieldtype == TYPE_MULTILINE: v = _format_multiline(value) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 398932b4..1fb020ea 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -176,7 +176,7 @@ def status_update_json(apps, apks): validapks = 0 if app.get('Disabled'): output['disabled'].append(appid) - elif app.get("ArchivePolicy") and int(app["ArchivePolicy"][:-9]) == 0: + elif app["ArchivePolicy"] == 0: output['archivePolicy0'].append(appid) else: for build in app.get('Builds', []): @@ -1877,7 +1877,7 @@ def archive_old_apks(apps, apks, archapks, repodir, archivedir, defaultkeepversi for appid, app in apps.items(): if app.get('ArchivePolicy'): - keepversions = int(app['ArchivePolicy'][:-9]) + keepversions = app['ArchivePolicy'] else: keepversions = defaultkeepversions if app.get('VercodeOperation'): diff --git a/tests/metadata-rewrite-yml/app.with.special.build.params.yml b/tests/metadata-rewrite-yml/app.with.special.build.params.yml index eeb174b7..1a286a13 100644 --- a/tests/metadata-rewrite-yml/app.with.special.build.params.yml +++ b/tests/metadata-rewrite-yml/app.with.special.build.params.yml @@ -95,7 +95,7 @@ Builds: versionCode: 51 disable: Labelled as pre-release, so skipped -ArchivePolicy: 0 versions +ArchivePolicy: 0 AutoUpdateMode: None UpdateCheckMode: None CurrentVersion: 2.1.2 diff --git a/tests/metadata-rewrite-yml/org.fdroid.fdroid.yml b/tests/metadata-rewrite-yml/org.fdroid.fdroid.yml index 9471f9a6..4edb97b7 100644 --- a/tests/metadata-rewrite-yml/org.fdroid.fdroid.yml +++ b/tests/metadata-rewrite-yml/org.fdroid.fdroid.yml @@ -944,7 +944,7 @@ Builds: gradle: - yes -ArchivePolicy: 12 versions +ArchivePolicy: 12 AutoUpdateMode: None UpdateCheckMode: Static CurrentVersion: 0.102.3 diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 064c9ce8..3b1bde45 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -1866,7 +1866,7 @@ class MetadataTest(unittest.TestCase): - NonFreeAssets - UpstreamNonFree - ArchivePolicy: 4 versions + ArchivePolicy: 4 AutoUpdateMode: Version v%v UpdateCheckMode: Tags CurrentVersion: '1.5' diff --git a/tests/metadata/app.with.special.build.params.yml b/tests/metadata/app.with.special.build.params.yml index b2daee52..e07efc2d 100644 --- a/tests/metadata/app.with.special.build.params.yml +++ b/tests/metadata/app.with.special.build.params.yml @@ -94,7 +94,7 @@ Builds: versionCode: 51 disable: Labelled as pre-release, so skipped -ArchivePolicy: 0 versions +ArchivePolicy: 0 AutoUpdateMode: None UpdateCheckMode: None CurrentVersion: 2.1.2 diff --git a/tests/metadata/dump/app.with.special.build.params.yaml b/tests/metadata/dump/app.with.special.build.params.yaml index f53ce361..9698b639 100644 --- a/tests/metadata/dump/app.with.special.build.params.yaml +++ b/tests/metadata/dump/app.with.special.build.params.yaml @@ -1,7 +1,7 @@ AllowedAPKSigningKeys: [] AntiFeatures: UpstreamNonFree: {} -ArchivePolicy: 0 versions +ArchivePolicy: 0 AuthorEmail: null AuthorName: null AuthorWebSite: null diff --git a/tests/metadata/dump/com.politedroid.yaml b/tests/metadata/dump/com.politedroid.yaml index e4f24356..7a970436 100644 --- a/tests/metadata/dump/com.politedroid.yaml +++ b/tests/metadata/dump/com.politedroid.yaml @@ -3,7 +3,7 @@ AntiFeatures: NoSourceSince: en-US: '1.5' NonFreeNet: {} -ArchivePolicy: 4 versions +ArchivePolicy: 4 AuthorEmail: null AuthorName: null AuthorWebSite: null diff --git a/tests/metadata/dump/org.videolan.vlc.yaml b/tests/metadata/dump/org.videolan.vlc.yaml index f91dfb65..7bcb7dc4 100644 --- a/tests/metadata/dump/org.videolan.vlc.yaml +++ b/tests/metadata/dump/org.videolan.vlc.yaml @@ -1,6 +1,6 @@ AllowedAPKSigningKeys: [] AntiFeatures: {} -ArchivePolicy: 9 versions +ArchivePolicy: 9 AuthorEmail: null AuthorName: null AuthorWebSite: null diff --git a/tests/update.TestCase b/tests/update.TestCase index 7c4e4518..56ad81a7 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1411,7 +1411,7 @@ class UpdateTest(unittest.TestCase): self.assertDictEqual( metadata_content, { - 'ArchivePolicy': '', + 'ArchivePolicy': None, 'AuthorEmail': '', 'AuthorName': '', 'AuthorWebSite': '', From 9ef2088aced51774c7b2675d4c8ab656ace73f14 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 25 May 2023 19:23:01 +0200 Subject: [PATCH 1235/2116] add unit tests --- tests/metadata.TestCase | 48 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 3b1bde45..8c606b2c 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -422,6 +422,25 @@ class MetadataTest(unittest.TestCase): ] = 'c03dac71394d6c26766f1b04d3e31cfcac5d03b55d8aa40cc9b9fa6b74354c66' metadata.post_parse_yaml_metadata(yamldata) + def test_post_parse_yaml_metadata_ArchivePolicy_int(self): + for i in range(20): + yamldata = {'ArchivePolicy': i} + metadata.post_parse_yaml_metadata(yamldata) + self.assertEqual(i, yamldata['ArchivePolicy']) + + def test_post_parse_yaml_metadata_ArchivePolicy_string(self): + for i in range(20): + yamldata = {'ArchivePolicy': '%d' % i} + metadata.post_parse_yaml_metadata(yamldata) + self.assertEqual(i, yamldata['ArchivePolicy']) + + def test_post_parse_yaml_metadata_ArchivePolicy_versions(self): + """Test that the old format still works.""" + for i in range(20): + yamldata = {'ArchivePolicy': '%d versions' % i} + metadata.post_parse_yaml_metadata(yamldata) + self.assertEqual(i, yamldata['ArchivePolicy']) + def test_post_parse_yaml_metadata_fails(self): yamldata = {'AllowedAPKSigningKeys': {'bad': 'dict-placement'}} with self.assertRaises(MetaDataException): @@ -2163,6 +2182,11 @@ class PostMetadataParseTest(unittest.TestCase): def setUp(self): fdroidserver.metadata.warnings_action = 'error' + def _post_metadata_parse_app_int(self, from_yaml, expected): + app = {'ArchivePolicy': from_yaml} + metadata.post_parse_yaml_metadata(app) + return {'ArchivePolicy': expected}, app + def _post_metadata_parse_app_list(self, from_yaml, expected): app = {'AllowedAPKSigningKeys': from_yaml} metadata.post_parse_yaml_metadata(app) @@ -2243,6 +2267,7 @@ class PostMetadataParseTest(unittest.TestCase): def test_post_metadata_parse_none(self): """Run None aka YAML null or blank through the various field and flag types.""" + self.assertEqual(*self._post_metadata_parse_app_int(None, None)) self.assertEqual(*self._post_metadata_parse_app_list(None, None)) self.assertEqual(*self._post_metadata_parse_app_string(None, None)) self.assertEqual(*self._post_metadata_parse_build_bool(None, None)) @@ -2253,6 +2278,7 @@ class PostMetadataParseTest(unittest.TestCase): def test_post_metadata_parse_int(self): """Run the int 123456 through the various field and flag types.""" + self.assertEqual(*self._post_metadata_parse_app_int(123456, 123456)) self.assertEqual(*self._post_metadata_parse_app_list(123456, ['123456'])) self.assertEqual(*self._post_metadata_parse_app_string(123456, '123456')) self.assertEqual(*self._post_metadata_parse_build_bool(123456, True)) @@ -2271,6 +2297,7 @@ class PostMetadataParseTest(unittest.TestCase): yaml = ruamel.yaml.YAML(typ='safe', pure=True) str_sha256 = '0000000000000498456908409534729834729834729834792837487293847926' sha256 = yaml.load('a: ' + str_sha256)['a'] + self.assertEqual(*self._post_metadata_parse_app_int(sha256, int(str_sha256))) self.assertEqual(*self._post_metadata_parse_app_list(sha256, [str_sha256])) self.assertEqual(*self._post_metadata_parse_app_string(sha256, str_sha256)) self.assertEqual(*self._post_metadata_parse_build_bool(sha256, True)) @@ -2281,6 +2308,7 @@ class PostMetadataParseTest(unittest.TestCase): def test_post_metadata_parse_int_0(self): """Run the int 0 through the various field and flag types.""" + self.assertEqual(*self._post_metadata_parse_app_int(0, 0)) self.assertEqual(*self._post_metadata_parse_app_list(0, ['0'])) self.assertEqual(*self._post_metadata_parse_app_string(0, '0')) self.assertEqual(*self._post_metadata_parse_build_bool(0, False)) @@ -2291,6 +2319,8 @@ class PostMetadataParseTest(unittest.TestCase): def test_post_metadata_parse_float_0_0(self): """Run the float 0.0 through the various field and flag types.""" + with self.assertRaises(MetaDataException): + self._post_metadata_parse_app_int(0.0, MetaDataException) self.assertEqual(*self._post_metadata_parse_app_list(0.0, ['0.0'])) self.assertEqual(*self._post_metadata_parse_app_string(0.0, '0.0')) self.assertEqual(*self._post_metadata_parse_build_bool(0.0, False)) @@ -2302,6 +2332,8 @@ class PostMetadataParseTest(unittest.TestCase): def test_post_metadata_parse_float_0_1(self): """Run the float 0.1 through the various field and flag types.""" + with self.assertRaises(MetaDataException): + self._post_metadata_parse_app_int(0.1, MetaDataException) self.assertEqual(*self._post_metadata_parse_app_list(0.1, ['0.1'])) self.assertEqual(*self._post_metadata_parse_app_string(0.1, '0.1')) self.assertEqual(*self._post_metadata_parse_build_bool(0.1, True)) @@ -2313,6 +2345,8 @@ class PostMetadataParseTest(unittest.TestCase): def test_post_metadata_parse_float_1_0(self): """Run the float 1.0 through the various field and flag types.""" + with self.assertRaises(MetaDataException): + self._post_metadata_parse_app_int(1.0, MetaDataException) self.assertEqual(*self._post_metadata_parse_app_list(1.0, ['1.0'])) self.assertEqual(*self._post_metadata_parse_app_string(1.0, '1.0')) self.assertEqual(*self._post_metadata_parse_build_bool(1.0, True)) @@ -2323,6 +2357,8 @@ class PostMetadataParseTest(unittest.TestCase): self.assertEqual(*self._post_metadata_parse_build_string(1.0, '1.0')) def test_post_metadata_parse_empty_list(self): + with self.assertRaises(MetaDataException): + self._post_metadata_parse_app_int(list(), MetaDataException) self.assertEqual(*self._post_metadata_parse_app_list(list(), list())) self.assertEqual(*self._post_metadata_parse_app_string(list(), list())) self.assertEqual(*self._post_metadata_parse_build_bool(list(), False)) @@ -2333,6 +2369,8 @@ class PostMetadataParseTest(unittest.TestCase): self.assertEqual(*self._post_metadata_parse_build_string(list(), list())) def test_post_metadata_parse_set_of_1(self): + with self.assertRaises(MetaDataException): + self._post_metadata_parse_app_int({1}, MetaDataException) self.assertEqual(*self._post_metadata_parse_app_list({1}, ['1'])) self.assertEqual(*self._post_metadata_parse_app_string({1}, '{1}')) self.assertEqual(*self._post_metadata_parse_build_bool({1}, True)) @@ -2343,6 +2381,8 @@ class PostMetadataParseTest(unittest.TestCase): self.assertEqual(*self._post_metadata_parse_build_string({1}, '{1}')) def test_post_metadata_parse_empty_dict(self): + with self.assertRaises(MetaDataException): + self._post_metadata_parse_app_int(dict(), MetaDataException) self.assertEqual(*self._post_metadata_parse_app_list(dict(), dict())) self.assertEqual(*self._post_metadata_parse_app_string(dict(), dict())) self.assertEqual(*self._post_metadata_parse_build_bool(dict(), False)) @@ -2353,6 +2393,8 @@ class PostMetadataParseTest(unittest.TestCase): self.assertEqual(*self._post_metadata_parse_build_string(dict(), dict())) def test_post_metadata_parse_list_int_string(self): + with self.assertRaises(MetaDataException): + self._post_metadata_parse_app_int([1, 'a'], MetaDataException) self.assertEqual(*self._post_metadata_parse_app_list([1, 'a'], ['1', 'a'])) self.assertEqual(*self._post_metadata_parse_app_string([1, 'a'], "[1, 'a']")) self.assertEqual(*self._post_metadata_parse_build_bool([1, 'a'], True)) @@ -2363,6 +2405,8 @@ class PostMetadataParseTest(unittest.TestCase): self.assertEqual(*self._post_metadata_parse_build_string([1, 'a'], "[1, 'a']")) def test_post_metadata_parse_dict_int_string(self): + with self.assertRaises(MetaDataException): + self._post_metadata_parse_app_int({'k': 1}, MetaDataException) with self.assertRaises(MetaDataException): self._post_metadata_parse_app_list({'k': 1}, MetaDataException) self.assertEqual(*self._post_metadata_parse_app_string({'k': 1}, "{'k': 1}")) @@ -2376,6 +2420,8 @@ class PostMetadataParseTest(unittest.TestCase): self.assertEqual(*self._post_metadata_parse_build_string({'k': 1}, "{'k': 1}")) def test_post_metadata_parse_false(self): + with self.assertRaises(MetaDataException): + self._post_metadata_parse_app_int(False, MetaDataException) self.assertEqual(*self._post_metadata_parse_app_list(False, ['false'])) self.assertEqual(*self._post_metadata_parse_app_string(False, 'false')) self.assertEqual(*self._post_metadata_parse_build_bool(False, False)) @@ -2386,6 +2432,8 @@ class PostMetadataParseTest(unittest.TestCase): self.assertEqual(*self._post_metadata_parse_build_string(False, 'false')) def test_post_metadata_parse_true(self): + with self.assertRaises(MetaDataException): + self._post_metadata_parse_app_int(True, MetaDataException) self.assertEqual(*self._post_metadata_parse_app_list(True, ['true'])) self.assertEqual(*self._post_metadata_parse_app_string(True, 'true')) self.assertEqual(*self._post_metadata_parse_build_bool(True, True)) From 31791b44f3dec27df8813a38533ab169735200cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20D=C3=BCster?= Date: Tue, 30 May 2023 23:05:59 +0200 Subject: [PATCH 1236/2116] fixup! metadata: Make ArchivePolicy an interger internally --- fdroidserver/metadata.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 132d2f8c..ca46bd17 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -1226,11 +1226,11 @@ def _app_to_yaml(app): if len(value) == 1: cm[field] = value[0] else: + cm[field] = value elif field == 'ArchivePolicy': if value is None: continue - cm[field] = _field_to_yaml(fieldtype(field), value) - cm[field] = value + cm[field] = value elif _fieldtype == TYPE_MULTILINE: v = _format_multiline(value) if v: From 2a60f6c195dfd24149617ceb1df1731fb3bf50c8 Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Thu, 1 Jun 2023 07:43:42 +0000 Subject: [PATCH 1237/2116] scanner - tgz is gzip --- fdroidserver/scanner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 2a943557..c2807e27 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -680,7 +680,7 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): count += handleproblem( _('Android DEX code'), path_in_build_dir, filepath, json_per_build ) - elif curfile.endswith('.gz'): + elif curfile.endswith('.gz') or curfile.endswith('.tgz'): count += handleproblem( _('gzip file archive'), path_in_build_dir, filepath, json_per_build ) From 2ee3cccb60bebc26d348ed594511eca5653ea436 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 1 Jun 2023 17:38:49 +0200 Subject: [PATCH 1238/2116] Don't modify app dict when generating v2 antifeatures Regression of: 061ca38a Closes: #1103 --- fdroidserver/index.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index eb05fde6..f0b12406 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -627,7 +627,7 @@ def convert_version(version, app, repodir): manifest[en].append({"name": perm[0]}) # index-v2 has only per-version antifeatures, not per package. - antiFeatures = app.get('AntiFeatures', {}) + antiFeatures = app.get('AntiFeatures', {}).copy() for name, descdict in version.get('antiFeatures', dict()).items(): antiFeatures[name] = descdict if antiFeatures: From 9ac7dfe452d6ccffbe49e9df53977d62dcb98934 Mon Sep 17 00:00:00 2001 From: FC Stegerman Date: Thu, 1 Jun 2023 20:23:00 +0200 Subject: [PATCH 1239/2116] update: fix regression for ArchivePolicy: 0 * https://gitlab.com/fdroid/fdroidserver/-/merge_requests/920#note_1413338920 * https://gitlab.com/fdroid/fdroidserver/-/merge_requests/920#note_1413344025 --- fdroidserver/update.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 1fb020ea..86070c67 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -176,7 +176,7 @@ def status_update_json(apps, apks): validapks = 0 if app.get('Disabled'): output['disabled'].append(appid) - elif app["ArchivePolicy"] == 0: + elif app.get("ArchivePolicy") == 0: output['archivePolicy0'].append(appid) else: for build in app.get('Builds', []): @@ -1876,7 +1876,7 @@ def archive_old_apks(apps, apks, archapks, repodir, archivedir, defaultkeepversi for appid, app in apps.items(): - if app.get('ArchivePolicy'): + if app.get('ArchivePolicy') is not None: keepversions = app['ArchivePolicy'] else: keepversions = defaultkeepversions From d96de4d8c282a1ac29ee07d63bda61b6f5064634 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 1 Jun 2023 20:26:42 +0200 Subject: [PATCH 1240/2116] update: test archive_old_apks() with ArchivePolicy: 0 --- tests/update.TestCase | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/update.TestCase b/tests/update.TestCase index 56ad81a7..2552ce0b 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1757,6 +1757,17 @@ class UpdateTest(unittest.TestCase): apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False, apps) self.assertEqual([], apks) + def test_archive_old_apks_ArchivePolicy_0(self): + app = fdroidserver.metadata.App() + app.id = 'test' + app.ArchivePolicy = 0 + apps = {app.id: app} + with self.assertLogs(level='DEBUG') as cm: + fdroidserver.update.archive_old_apks(apps, [], [], '', '', 3) + self.assertEqual(cm.output, [ + "DEBUG:root:Checking archiving for test - apks:0, keepversions:0, archapks:0" + ]) + def test_archive_old_apks(self): app = fdroidserver.metadata.App() app.id = 'test' From 27ea66743865290007121717a5f2c75b9249b176 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 2 Jun 2023 10:06:47 +0200 Subject: [PATCH 1241/2116] Add test for !1370 The bug fixed in !1370 was due to a reuse of the per app anti features dictionary in the per version one and adding the per version anti features into it. This was not caught by the test suite as the app versions are processed from newest to oldest and the test data had only anti features in the oldest version. This patch adds an anti feature to a newest version so only those in between should not have it. --- tests/metadata/com.politedroid.yml | 4 ++++ tests/metadata/dump/com.politedroid.yaml | 5 ++++- tests/repo/entry.json | 2 +- tests/repo/index-v1.json | 7 ++++++- tests/repo/index-v2.json | 7 +++++-- tests/repo/index.xml | 2 +- 6 files changed, 21 insertions(+), 6 deletions(-) diff --git a/tests/metadata/com.politedroid.yml b/tests/metadata/com.politedroid.yml index a1ddc8bf..669520a6 100644 --- a/tests/metadata/com.politedroid.yml +++ b/tests/metadata/com.politedroid.yml @@ -39,6 +39,10 @@ Builds: sudo: echo 'this is just a test' gradle: - yes + antifeatures: + - KnownVuln + - UpstreamNonFree + - NonFreeAssets ArchivePolicy: 4 versions AutoUpdateMode: Version v%v diff --git a/tests/metadata/dump/com.politedroid.yaml b/tests/metadata/dump/com.politedroid.yaml index 7a970436..17e6a8f3 100644 --- a/tests/metadata/dump/com.politedroid.yaml +++ b/tests/metadata/dump/com.politedroid.yaml @@ -122,7 +122,10 @@ Builds: versionName: '1.4' - androidupdate: [] antcommands: [] - antifeatures: {} + antifeatures: + KnownVuln: {} + NonFreeAssets: {} + UpstreamNonFree: {} binary: null build: '' buildjni: [] diff --git a/tests/repo/entry.json b/tests/repo/entry.json index 13514cc5..2f98dbab 100644 --- a/tests/repo/entry.json +++ b/tests/repo/entry.json @@ -3,7 +3,7 @@ "version": 20002, "index": { "name": "/index-v2.json", - "sha256": "f4979b9db840cb51a99e80c20da676ba42b13133dbaa4819673bc43ed2ffc3f3", + "sha256": "ba000a3f5e1935d338f374c50cae529b8ce6d988ab3ed67c7a8cf437502f81ad", "size": 52481, "numPackages": 10 }, diff --git a/tests/repo/index-v1.json b/tests/repo/index-v1.json index bf2f53ae..4b845994 100644 --- a/tests/repo/index-v1.json +++ b/tests/repo/index-v1.json @@ -231,6 +231,11 @@ "com.politedroid": [ { "added": 1498176000000, + "antiFeatures": [ + "KnownVuln", + "NonFreeAssets", + "UpstreamNonFree" + ], "apkName": "com.politedroid_6.apk", "hash": "70c2f776a2bac38a58a7d521f96ee0414c6f0fb1de973c3ca8b10862a009247d", "hashType": "sha256", @@ -689,4 +694,4 @@ } ] } -} +} \ No newline at end of file diff --git a/tests/repo/index-v2.json b/tests/repo/index-v2.json index fed40fb9..5a8deb1e 100644 --- a/tests/repo/index-v2.json +++ b/tests/repo/index-v2.json @@ -568,10 +568,13 @@ ] }, "antiFeatures": { + "KnownVuln": {}, "NoSourceSince": { "en-US": "1.5" }, - "NonFreeNet": {} + "NonFreeAssets": {}, + "NonFreeNet": {}, + "UpstreamNonFree": {} } }, "5bdbfa071cca4b8d05ced41d6b28763595d6e8096cca5bbf0f9253c9a2622e5d": { @@ -1403,4 +1406,4 @@ } } } -} \ No newline at end of file +} diff --git a/tests/repo/index.xml b/tests/repo/index.xml index dfdb76b6..6935f675 100644 --- a/tests/repo/index.xml +++ b/tests/repo/index.xml @@ -318,7 +318,7 @@ APK is called F-Droid Privileged Extension. https://github.com/miguelvps/PoliteDroid/issues 1.5 6 - NoSourceSince,NonFreeNet + KnownVuln,NoSourceSince,NonFreeAssets,NonFreeNet,UpstreamNonFree 1.5 6 From 7af95fc66085772413e7b938a3c05f8f457aed77 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 2 Jun 2023 10:38:16 +0200 Subject: [PATCH 1242/2116] gitlab-ci: bump version to compare in metadata_v0 job --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 636de406..f9878be9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -41,7 +41,7 @@ metadata_v0: image: registry.gitlab.com/fdroid/fdroidserver:buildserver variables: GIT_DEPTH: 1000 - RELEASE_COMMIT_ID: b0c05842d8c081cf5503b31e8ecc797dc95ed900 # 2.3a0 + RELEASE_COMMIT_ID: a1c4f803de8d4dc92ebd6b571a493183d14a00bf # after ArchivePolicy: 0 script: - git fetch https://gitlab.com/fdroid/fdroidserver.git $RELEASE_COMMIT_ID - cd tests From 1c3a87e002341ee74782e9cdd4031ade5178cd15 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 30 May 2023 19:19:27 +0200 Subject: [PATCH 1243/2116] lint: get Categories from config --- fdroidserver/lint.py | 40 +++++++++++++------------------- tests/lint.TestCase | 55 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 24 deletions(-) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 0fc4aa5e..b8c85f6d 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -222,6 +222,7 @@ versioncode_check_pattern = re.compile(r"(\\d|\[(0-9|\\d)_?(a-fA-F)?])[+]") ANTIFEATURES_KEYS = None ANTIFEATURES_PATTERN = None +CATEGORIES_KEYS = list() def load_antiFeatures_config(): @@ -234,6 +235,18 @@ def load_antiFeatures_config(): ANTIFEATURES_PATTERN = ','.join(ANTIFEATURES_KEYS) +def load_categories_config(): + """Lazy loading, since it might read a lot of files.""" + global CATEGORIES_KEYS + k = 'categories' + if not CATEGORIES_KEYS: + if config and k in config: + CATEGORIES_KEYS = config[k] + else: + config[k] = common.load_localized_config(k, 'repo') + CATEGORIES_KEYS = list(config[k].keys()) + + def check_regexes(app): for f, checks in regex_checks.items(): for m, r in checks: @@ -371,32 +384,10 @@ def check_empty_fields(app): yield _("Categories are not set") -all_categories = set( - [ - "Connectivity", - "Development", - "Games", - "Graphics", - "Internet", - "Money", - "Multimedia", - "Navigation", - "Phone & SMS", - "Reading", - "Science & Education", - "Security", - "Sports & Health", - "System", - "Theming", - "Time", - "Writing", - ] -) - - def check_categories(app): + """App uses 'Categories' key and parsed config uses 'categories' key.""" for categ in app.Categories: - if categ not in all_categories: + if categ not in CATEGORIES_KEYS: yield _("Categories '%s' is not valid" % categ) @@ -798,6 +789,7 @@ def main(): config = common.read_config(options) load_antiFeatures_config() + load_categories_config() # Get all apps... allapps = metadata.read_metadata(options.appid) diff --git a/tests/lint.TestCase b/tests/lint.TestCase index 544b18c8..af4fe8f1 100755 --- a/tests/lint.TestCase +++ b/tests/lint.TestCase @@ -10,6 +10,7 @@ import sys import tempfile import unittest from pathlib import Path +from testcommon import mkdtemp localmodule = Path(__file__).resolve().parent.parent print('localmodule: ' + str(localmodule)) @@ -30,6 +31,14 @@ class LintTest(unittest.TestCase): self.tmpdir = localmodule / '.testfiles' self.tmpdir.mkdir(exist_ok=True) os.chdir(self.basedir) + fdroidserver.common.config = None + fdroidserver.lint.config = None + fdroidserver.lint.CATEGORIES_KEYS = None + self._td = mkdtemp() + self.testdir = self._td.name + + def tearDown(self): + self._td.cleanup() def test_check_for_unsupported_metadata_files(self): self.assertTrue(fdroidserver.lint.check_for_unsupported_metadata_files()) @@ -313,12 +322,58 @@ class LintTest(unittest.TestCase): logging.debug(warn) self.assertFalse(anywarns) + def test_check_categories_in_config(self): + fdroidserver.lint.config = {'categories': ['InConfig']} + fdroidserver.lint.load_categories_config() + app = fdroidserver.metadata.App({'Categories': ['InConfig']}) + self.assertEqual(0, len(list(fdroidserver.lint.check_categories(app)))) + + def test_check_categories_not_in_config(self): + fdroidserver.lint.config = dict() + fdroidserver.lint.load_categories_config() + app = fdroidserver.metadata.App({'Categories': ['NotInConfig']}) + self.assertEqual(1, len(list(fdroidserver.lint.check_categories(app)))) + + def test_check_categories_empty_is_error(self): + fdroidserver.lint.config = {'categories': []} + fdroidserver.lint.load_categories_config() + app = fdroidserver.metadata.App({'Categories': ['something']}) + self.assertEqual(1, len(list(fdroidserver.lint.check_categories(app)))) + + def test_check_categories_old_hardcoded_not_defined(self): + fdroidserver.lint.config = {'categories': ['foo', 'bar']} + fdroidserver.lint.load_categories_config() + app = fdroidserver.metadata.App({'Categories': ['Writing']}) + self.assertEqual(1, len(list(fdroidserver.lint.check_categories(app)))) + + def test_check_categories_from_config_yml(self): + """In config.yml, categories is a list.""" + os.chdir(self.testdir) + Path('config.yml').write_text('categories: [foo, bar]') + fdroidserver.lint.config = fdroidserver.common.read_config() + fdroidserver.lint.load_categories_config() + self.assertEqual(fdroidserver.lint.CATEGORIES_KEYS, ['foo', 'bar']) + app = fdroidserver.metadata.App({'Categories': ['bar']}) + self.assertEqual(0, len(list(fdroidserver.lint.check_categories(app)))) + + def test_check_categories_from_config_categories_yml(self): + """In config/categories.yml, categories is a localized STRINGMAP dict.""" + os.chdir(self.testdir) + os.mkdir('config') + Path('config/categories.yml').write_text('{foo: {name: foo}, bar: {name: bar}}') + fdroidserver.lint.config = fdroidserver.common.read_config() + fdroidserver.lint.load_categories_config() + self.assertEqual(fdroidserver.lint.CATEGORIES_KEYS, ['foo', 'bar']) + app = fdroidserver.metadata.App({'Categories': ['bar']}) + self.assertEqual(0, len(list(fdroidserver.lint.check_categories(app)))) + class LintAntiFeaturesTest(unittest.TestCase): def setUp(self): self.basedir = localmodule / 'tests' os.chdir(self.basedir) fdroidserver.common.config = dict() + fdroidserver.lint.ANTIFEATURES_KEYS = None fdroidserver.lint.load_antiFeatures_config() def test_check_antiFeatures_empty(self): From bc589593159d3f3e014e0deaa4956ac0cdaaee3d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 30 May 2023 22:42:22 +0200 Subject: [PATCH 1244/2116] purge remnants of repo/categories.txt, which is long unused --- MANIFEST.in | 1 - fdroidserver/common.py | 1 - fdroidserver/update.py | 15 --------------- tests/common.TestCase | 7 +------ tests/repo/categories.txt | 10 ---------- tests/update.TestCase | 15 +++++++++++++++ 6 files changed, 16 insertions(+), 33 deletions(-) delete mode 100644 tests/repo/categories.txt diff --git a/MANIFEST.in b/MANIFEST.in index e301d8a8..ea144609 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -662,7 +662,6 @@ include tests/org.bitbucket.tickytacky.mirrormirror_4.apk include tests/org.dyndns.fules.ck_20.apk include tests/org.sajeg.fallingblocks_3.apk include tests/publish.TestCase -include tests/repo/categories.txt include tests/repo/com.example.test.helloworld_1.apk include tests/repo/com.politedroid_3.apk include tests/repo/com.politedroid_4.apk diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 1af0fc82..73f25365 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4042,7 +4042,6 @@ def is_repo_file(filename, for_gpg_signing=False): if isinstance(filename, str): filename = filename.encode('utf-8', errors="surrogateescape") ignore_files = [ - b'categories.txt', b'entry.jar', b'index-v1.jar', b'index.css', diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 86070c67..44e95c28 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1846,15 +1846,6 @@ def apply_info_from_latest_apk(apps, apks): app['CurrentVersionCode'] = bestver -def make_categories_txt(repodir, categories): - """Write a category list in the repo to allow quick access.""" - catdata = '' - for cat in sorted(categories): - catdata += cat + '\n' - with open(os.path.join(repodir, 'categories.txt'), 'w') as f: - f.write(catdata) - - def archive_old_apks(apps, apks, archapks, repodir, archivedir, defaultkeepversions): def filter_apk_list_sorted(apk_list): apkList = [] @@ -2246,11 +2237,6 @@ def main(): # Get all apps... apps = metadata.read_metadata() - # Generate a list of categories... - categories = set() - for app in apps.values(): - categories.update(app.Categories) - # Read known apks data (will be updated and written back when we've finished) knownapks = common.KnownApks() @@ -2363,7 +2349,6 @@ def main(): # Make the index for the main repo... index.make(repoapps, apks, repodirs[0], False) - make_categories_txt(repodirs[0], categories) git_remote = config.get('binary_transparency_remote') if git_remote or os.path.isdir(os.path.join('binary_transparency', '.git')): diff --git a/tests/common.TestCase b/tests/common.TestCase index 8820004d..56625598 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -2509,8 +2509,7 @@ class CommonTest(unittest.TestCase): 'repo/index.png', 'repo/index.xml', ] - non_repo_files = ['repo/categories.txt'] - for f in repo_files + index_files + non_repo_files: + for f in repo_files + index_files: open(f, 'w').close() repo_dirs = [ @@ -2543,10 +2542,6 @@ class CommonTest(unittest.TestCase): self.assertTrue(os.path.exists(d), d + ' was created') self.assertFalse(is_repo_file(d), d + ' not repo file') - for f in non_repo_files: - self.assertTrue(os.path.exists(f), f + ' was created') - self.assertFalse(is_repo_file(f), f + ' not repo file') - def test_get_apksigner_smartcardoptions(self): os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: diff --git a/tests/repo/categories.txt b/tests/repo/categories.txt deleted file mode 100644 index 9af231f5..00000000 --- a/tests/repo/categories.txt +++ /dev/null @@ -1,10 +0,0 @@ -1 -2.0 -Development -GuardianProject -Multimedia -Phone & SMS -Security -System -Time -tests diff --git a/tests/update.TestCase b/tests/update.TestCase index 2552ce0b..391dec93 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -22,6 +22,7 @@ import zipfile import textwrap from datetime import datetime from distutils.version import LooseVersion +from pathlib import Path from testcommon import TmpCwd, mkdtemp from unittest import mock @@ -1789,6 +1790,20 @@ class UpdateTest(unittest.TestCase): "DEBUG:root:Checking archiving for org.smssecure.smssecure - apks:0, keepversions:6, archapks:0" ]) + def test_categories_txt_is_removed_by_delete_unknown(self): + """categories.txt used to be a part of this system, now its nothing.""" + os.chdir(self.testdir) + Path('config.yml').write_text('repo_pubkey: ffffffffffffffffffffffffffffffffffffffff') + + categories_txt = Path('repo/categories.txt') + categories_txt.parent.mkdir() + categories_txt.write_text('placeholder') + + self.assertTrue(categories_txt.exists()) + with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']): + fdroidserver.update.main() + self.assertFalse(categories_txt.exists()) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 6b827100394ef6df4a85d138151e6741655d9663 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 30 May 2023 22:43:21 +0200 Subject: [PATCH 1245/2116] test load_localized_config() with categories --- MANIFEST.in | 1 + tests/common.TestCase | 17 +++++++++++++++++ tests/config/categories.yml | 14 ++++++++++++++ tests/repo/entry.json | 4 ++-- tests/repo/index-v2.json | 37 +++++++++++++++++++++++++++++++++++++ tests/run-tests | 6 +++++- 6 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 tests/config/categories.yml diff --git a/MANIFEST.in b/MANIFEST.in index ea144609..1aed9975 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -546,6 +546,7 @@ include tests/checkupdates.TestCase include tests/common.TestCase include tests/config.py include tests/config/antiFeatures.yml +include tests/config/categories.yml include tests/config/de/antiFeatures.yml include tests/config/fa/antiFeatures.yml include tests/config/ic_antifeature_ads.xml diff --git a/tests/common.TestCase b/tests/common.TestCase index 56625598..9bda9820 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -2694,6 +2694,23 @@ class CommonTest(unittest.TestCase): p = Path(os.path.dirname(__file__) + '/repo' + v['icon']['en-US']['name']) self.assertTrue(p.exists()) + def test_load_localized_config_categories(self): + """It should load""" + categories = fdroidserver.common.load_localized_config('categories', 'repo') + self.assertEqual( + [ + 'Time', + 'Development', + 'GuardianProject', + 'Multimedia', + 'Phone & SMS', + 'Security', + 'System', + ], + list(categories.keys()), + ) + self.assertEqual(['en-US'], list(categories['GuardianProject']['name'].keys())) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) diff --git a/tests/config/categories.yml b/tests/config/categories.yml new file mode 100644 index 00000000..e294ced6 --- /dev/null +++ b/tests/config/categories.yml @@ -0,0 +1,14 @@ +Time: + name: Time +Development: + name: Development +GuardianProject: + name: Guardian Project +Multimedia: + name: Multimedia +Phone & SMS: + name: Phone & SMS +Security: + name: Security +System: + name: System diff --git a/tests/repo/entry.json b/tests/repo/entry.json index 2f98dbab..5c0ca528 100644 --- a/tests/repo/entry.json +++ b/tests/repo/entry.json @@ -3,8 +3,8 @@ "version": 20002, "index": { "name": "/index-v2.json", - "sha256": "ba000a3f5e1935d338f374c50cae529b8ce6d988ab3ed67c7a8cf437502f81ad", - "size": 52481, + "sha256": "7117ee6ff4ff2dd71ec3f3d3ad2ef7e9fd4afead9b1f2d39d0b224a1812e78b5", + "size": 53233, "numPackages": 10 }, "diffs": {} diff --git a/tests/repo/index-v2.json b/tests/repo/index-v2.json index 5a8deb1e..6ea92407 100644 --- a/tests/repo/index-v2.json +++ b/tests/repo/index-v2.json @@ -498,6 +498,43 @@ } } }, + "categories": { + "Time": { + "name": { + "en-US": "Time" + } + }, + "Development": { + "name": { + "en-US": "Development" + } + }, + "GuardianProject": { + "name": { + "en-US": "Guardian Project" + } + }, + "Multimedia": { + "name": { + "en-US": "Multimedia" + } + }, + "Phone & SMS": { + "name": { + "en-US": "Phone & SMS" + } + }, + "Security": { + "name": { + "en-US": "Security" + } + }, + "System": { + "name": { + "en-US": "System" + } + } + }, "requests": { "install": [ "org.adaway" diff --git a/tests/run-tests b/tests/run-tests index 49acb5aa..8acb1889 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -702,7 +702,11 @@ echo "Description: |" >> metadata/fake.yml echo " this is fake" >> metadata/fake.yml # fake that no JDKs are available -echo 'java_paths: {}' > config.yml +cat > config.yml < Date: Mon, 3 Jul 2023 16:17:08 +0200 Subject: [PATCH 1246/2116] gitlab-ci: switch archlinux job to virtualenv MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://gitlab.com/fdroid/fdroidserver/-/jobs/4466370098 $ pip install -e .[test] error: externally-managed-environment × This environment is externally managed ╰─> To install Python packages system-wide, try 'pacman -S python-xyz', where xyz is the package you are trying to install. If you wish to install a non-Arch-packaged Python package, create a virtual environment using 'python -m venv path/to/venv'. Then use path/to/venv/bin/python and path/to/venv/bin/pip. If you wish to install a non-Arch packaged Python application, it may be easiest to use 'pipx install xyz', which will manage a virtual environment for you. Make sure you have python-pipx installed via pacman. note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages. --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f9878be9..c641e748 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -170,6 +170,8 @@ arch_pip_install: - master@fdroid/fdroidserver script: - pacman --sync --sysupgrade --refresh --noconfirm gcc git grep python-pip python-virtualenv python-wheel tar + - python -m venv venv + - source venv/bin/activate - pip install -e .[test] - fdroid - fdroid readmeta From 132e953c8c9f7d709586442aee6ff474cfa8fa18 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 3 Jul 2023 17:44:47 +0200 Subject: [PATCH 1247/2116] update: use proper name for PIL image filter ANTIALIAS -> LANCZOS ANTIALIAS was made an alias of LANCZOS in 2.7.0: https://pillow.readthedocs.io/en/stable/releasenotes/2.7.0.html#antialias-renamed-to-lanczos The ANTIALIAS alias was removed in Pillow 10.0.0: https://pillow.readthedocs.io/en/stable/deprecations.html --- fdroidserver/update.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 44e95c28..a1d4dbc4 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -252,7 +252,7 @@ def resize_icon(iconpath, density): if any(length > size for length in im.size): oldsize = im.size - im.thumbnail((size, size), Image.ANTIALIAS) + im.thumbnail((size, size), Image.LANCZOS) logging.debug("%s was too large at %s - new size is %s" % ( iconpath, oldsize, im.size)) im.save(iconpath, "PNG", optimize=True, @@ -1778,7 +1778,7 @@ def fill_missing_icon_densities(empty_densities, icon_filename, apk, repo_dir): size = dpi_to_px(density) - im.thumbnail((size, size), Image.ANTIALIAS) + im.thumbnail((size, size), Image.LANCZOS) im.save(icon_path, "PNG", optimize=True, pnginfo=BLANK_PNG_INFO, icc_profile=None) empty_densities.remove(density) From f9d9abf98d48a6d89f38cff2795dfc48ff505d9e Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Mon, 3 Jul 2023 06:37:48 +0000 Subject: [PATCH 1248/2116] Gradle 8.2 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 883c62f5..4d0095d5 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -189,6 +189,7 @@ get_sha() { '8.0.2') echo 'ff7bf6a86f09b9b2c40bb8f48b25fc19cf2b2664fd1d220cd7ab833ec758d0d7' ;; '8.1') echo 'a62c5f99585dd9e1f95dab7b9415a0e698fa9dd1e6c38537faa81ac078f4d23e' ;; '8.1.1') echo 'e111cb9948407e26351227dabce49822fb88c37ee72f1d1582a69c68af2e702f' ;; + '8.2') echo '38f66cd6eef217b4c35855bb11ea4e9fbc53594ccccb5fb82dfd317ef8c2c5a3' ;; *) exit 1 esac } @@ -209,7 +210,7 @@ d_plugin_k=(8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2. d_plugin_v=(8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From fda149821a7615f5ad90e83c29fa1d27aaee5f85 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Tue, 4 Jul 2023 08:19:00 +0000 Subject: [PATCH 1249/2116] gradle v8.2 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 4d0095d5..12e63f18 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -184,6 +184,7 @@ get_sha() { '7.5.1') echo 'f6b8596b10cce501591e92f229816aa4046424f3b24d771751b06779d58c8ec4' ;; '7.6') echo '7ba68c54029790ab444b39d7e293d3236b2632631fb5f2e012bb28b4ff669e4b' ;; '7.6.1') echo '6147605a23b4eff6c334927a86ff3508cb5d6722cd624c97ded4c2e8640f1f87' ;; + '7.6.2') echo 'a01b6587e15fe7ed120a0ee299c25982a1eee045abd6a9dd5e216b2f628ef9ac' ;; '8.0') echo '4159b938ec734a8388ce03f52aa8f3c7ed0d31f5438622545de4f83a89b79788' ;; '8.0.1') echo '1b6b558be93f29438d3df94b7dfee02e794b94d9aca4611a92cdb79b6b88e909' ;; '8.0.2') echo 'ff7bf6a86f09b9b2c40bb8f48b25fc19cf2b2664fd1d220cd7ab833ec758d0d7' ;; @@ -210,7 +211,7 @@ d_plugin_k=(8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2. d_plugin_v=(8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 5660e7089df8733952ab3e4c2245903777c4f764 Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Sat, 8 Jul 2023 16:24:00 +0000 Subject: [PATCH 1250/2116] Don't specify a release candidate in version constraint for androguard dependency This causes pip to include pre-releases for all dependencies, which is unfortunate in many cases. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 72c592b2..25e7412f 100755 --- a/setup.py +++ b/setup.py @@ -91,7 +91,7 @@ setup( 'babel', ], install_requires=[ - 'androguard >= 3.1.0rc2, != 3.3.0, != 3.3.1, != 3.3.2', + 'androguard >= 3.1.0, != 3.3.0, != 3.3.1, != 3.3.2', 'clint', 'defusedxml', 'GitPython', From d040fc518ac54401aed79300d0fb2c5fab112927 Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Wed, 12 Jul 2023 10:13:50 +0000 Subject: [PATCH 1251/2116] Gradle 8.2.1 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 12e63f18..08c6f24c 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -191,6 +191,7 @@ get_sha() { '8.1') echo 'a62c5f99585dd9e1f95dab7b9415a0e698fa9dd1e6c38537faa81ac078f4d23e' ;; '8.1.1') echo 'e111cb9948407e26351227dabce49822fb88c37ee72f1d1582a69c68af2e702f' ;; '8.2') echo '38f66cd6eef217b4c35855bb11ea4e9fbc53594ccccb5fb82dfd317ef8c2c5a3' ;; + '8.2.1') echo '03ec176d388f2aa99defcadc3ac6adf8dd2bce5145a129659537c0874dea5ad1' ;; *) exit 1 esac } @@ -211,7 +212,7 @@ d_plugin_k=(8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2. d_plugin_v=(8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From a756ce0b1a6c8a48395cf33f6aad4c52911ebe73 Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Wed, 12 Jul 2023 13:45:10 +0000 Subject: [PATCH 1252/2116] Import - add more template content --- fdroidserver/import_subcommand.py | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/fdroidserver/import_subcommand.py b/fdroidserver/import_subcommand.py index 03c36539..16c00f5b 100644 --- a/fdroidserver/import_subcommand.py +++ b/fdroidserver/import_subcommand.py @@ -239,7 +239,7 @@ def main(): git_repo = git.Repo(tmp_importer_dir) if not options.omit_disable: - build.disable = 'Generated by import.py - check/set version fields and commit id' + build.disable = 'Generated by `fdroid import` - check version fields and commitid' write_local_file = False else: raise FDroidException("Specify project url.") @@ -290,8 +290,14 @@ def main(): package_json = tmp_importer_dir / 'package.json' # react-native pubspec_yaml = tmp_importer_dir / 'pubspec.yaml' # flutter if package_json.exists(): - build.sudo = ['apt-get update || apt-get update', 'apt-get install npm', 'npm install -g react-native-cli'] - build.init = ['npm install'] + build.sudo = [ + 'sysctl fs.inotify.max_user_watches=524288 || true', + 'curl -Lo node.tar.gz https://nodejs.org/download/release/v19.3.0/node-v19.3.0-linux-x64.tar.gz', + 'echo "b525028ae5bb71b5b32cb7fce903ccce261dbfef4c7dd0f3e0ffc27cd6fc0b3f node.tar.gz" | sha256sum -c -', + 'tar xzf node.tar.gz --strip-components=1 -C /usr/local/', + 'npm -g install yarn', + ] + build.init = ['npm install --build-from-source'] with package_json.open() as fp: data = json.load(fp) app.AutoName = data.get('name', app.AutoName) @@ -299,6 +305,8 @@ def main(): app.Description = data.get('description', app.Description) app.WebSite = data.get('homepage', app.WebSite) app_json = tmp_importer_dir / 'app.json' + build.scanignore = ['android/build.gradle'] + build.scandelete = ['node_modules'] if app_json.exists(): with app_json.open() as fp: data = json.load(fp) @@ -309,13 +317,21 @@ def main(): app.AutoName = data.get('name', app.AutoName) app.License = data.get('license', app.License) app.Description = data.get('description', app.Description) + app.UpdateCheckData = 'pubspec.yaml|version:\\s.+\\+(\\d+)|.|version:\\s(.+)\\+' build.srclibs = ['flutter@stable'] - build.output = 'build/app/outputs/apk/release/app-release-unsigned.apk' + build.output = 'build/app/outputs/flutter-apk/app-release.apk' build.subdir = None build.gradle = None - build.build = [ + build.prebuild = [ + 'export PUB_CACHE=$(pwd)/.pub-cache', '$$flutter$$/bin/flutter config --no-analytics', '$$flutter$$/bin/flutter packages pub get', + ] + build.scandelete = [ + '.pub-cache', + ] + build.build = [ + 'export PUB_CACHE=$(pwd)/.pub-cache', '$$flutter$$/bin/flutter build apk', ] From ce77a332281e312010b8ea8af11e0a3bb12063b8 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 25 Jul 2023 13:54:59 +0200 Subject: [PATCH 1253/2116] mirror-to-mirror.sh: set 1h timeout for rsync runs This script is run every 10 minutes or so to push new files to the primary mirrors. It sets a lock to prevent multiple copies from running in parallel. Yesterday, one rsync process got stuck and never exited, thereby preventing this script from running. Adding a 1h timeout seems like a safe way to deal with this kind of problem. This would not deal with rsync getting so stuck that it fails to heed the timeout, hopefully that's not an issue. --- examples/mirror-to-mirror.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/mirror-to-mirror.sh b/examples/mirror-to-mirror.sh index 71b66f11..9c0e937b 100644 --- a/examples/mirror-to-mirror.sh +++ b/examples/mirror-to-mirror.sh @@ -19,6 +19,7 @@ for section in repo archive; do set -x # be super careful with the trailing slashes here! if one is wrong, it'll delete the entire section! rsync --archive --delay-updates --progress --delete \ + --timeout=3600 \ /home/fdroid/public_html/${section} \ ${host}:/srv/fdroid-mirror.at.or.at/htdocs/fdroid/ & set +x From 190a95ab1765ef8ae0c3a738185cb5144d5940da Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 31 May 2023 22:48:30 +0200 Subject: [PATCH 1254/2116] use consistent name for releaseChannels config file --- fdroidserver/index.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index f0b12406..8a6bd77b 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -678,9 +678,9 @@ def v2_repo(repodict, repodir, archive): if categories: repo["categories"] = categories - channels = common.load_localized_config("channels", repodir) - if channels: - repo["releaseChannels"] = channels + releaseChannels = common.load_localized_config("releaseChannels", repodir) + if releaseChannels: + repo["releaseChannels"] = releaseChannels return repo From 4e28fad55a952c1b64dad77437b9d70aa43c71e1 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 31 May 2023 23:08:07 +0200 Subject: [PATCH 1255/2116] use constants for names used in the config dict Hopefully this helps with the Anti-Features case confusion: * antifeatures * antiFeatures * AntiFeatures --- fdroidserver/common.py | 12 ++++++++++++ fdroidserver/index.py | 18 +++++++++--------- fdroidserver/lint.py | 4 ++-- tests/common.TestCase | 9 +++++++-- tests/lint.TestCase | 7 ++++--- 5 files changed, 34 insertions(+), 16 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 73f25365..d2bfce90 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -112,6 +112,18 @@ XMLNS_ANDROID = '{http://schemas.android.com/apk/res/android}' # https://docs.gitlab.com/ee/user/gitlab_com/#gitlab-pages GITLAB_COM_PAGES_MAX_SIZE = 1000000000 +# the names used for things that are configured per-repo +ANTIFEATURES_CONFIG_NAME = 'antiFeatures' +CATEGORIES_CONFIG_NAME = 'categories' +CONFIG_CONFIG_NAME = 'config' +RELEASECHANNELS_CONFIG_NAME = "releaseChannels" +CONFIG_NAMES = ( + ANTIFEATURES_CONFIG_NAME, + CATEGORIES_CONFIG_NAME, + CONFIG_CONFIG_NAME, + RELEASECHANNELS_CONFIG_NAME, +) + config = None options = None diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 8a6bd77b..ddb51546 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -42,7 +42,7 @@ from . import common from . import metadata from . import net from . import signindex -from fdroidserver.common import DEFAULT_LOCALE, FDroidPopen, FDroidPopenBytes, load_stats_fdroid_signing_key_fingerprints +from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME, CONFIG_CONFIG_NAME, RELEASECHANNELS_CONFIG_NAME, DEFAULT_LOCALE, FDroidPopen, FDroidPopenBytes, load_stats_fdroid_signing_key_fingerprints from fdroidserver.exception import FDroidException, VerificationException @@ -637,7 +637,7 @@ def convert_version(version, app, repodir): if "versionCode" in version: if version["versionCode"] > app["CurrentVersionCode"]: - ver["releaseChannels"] = ["Beta"] + ver[RELEASECHANNELS_CONFIG_NAME] = ["Beta"] for build in app.get('Builds', []): if build['versionCode'] == version['versionCode'] and "whatsNew" in build: @@ -656,7 +656,7 @@ def v2_repo(repodict, repodir, archive): DEFAULT_LOCALE: common.file_entry("%s/icons/%s" % (repodir, repodict["icon"])) } - config = common.load_localized_config("config", repodir) + config = common.load_localized_config(CONFIG_CONFIG_NAME, repodir) if config: repo["name"] = config["archive" if archive else "repo"]["name"] repo["description"] = config["archive" if archive else "repo"]["description"] @@ -670,17 +670,17 @@ def v2_repo(repodict, repodir, archive): repo["timestamp"] = repodict["timestamp"] - antiFeatures = common.load_localized_config("antiFeatures", repodir) + antiFeatures = common.load_localized_config(ANTIFEATURES_CONFIG_NAME, repodir) if antiFeatures: - repo["antiFeatures"] = antiFeatures + repo[ANTIFEATURES_CONFIG_NAME] = antiFeatures - categories = common.load_localized_config("categories", repodir) + categories = common.load_localized_config(CATEGORIES_CONFIG_NAME, repodir) if categories: - repo["categories"] = categories + repo[CATEGORIES_CONFIG_NAME] = categories - releaseChannels = common.load_localized_config("releaseChannels", repodir) + releaseChannels = common.load_localized_config(RELEASECHANNELS_CONFIG_NAME, repodir) if releaseChannels: - repo["releaseChannels"] = releaseChannels + repo[RELEASECHANNELS_CONFIG_NAME] = releaseChannels return repo diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index b8c85f6d..7a042a70 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -228,7 +228,7 @@ CATEGORIES_KEYS = list() def load_antiFeatures_config(): """Lazy loading, since it might read a lot of files.""" global ANTIFEATURES_KEYS, ANTIFEATURES_PATTERN - k = 'antiFeatures' # internal dict uses camelCase key name + k = common.ANTIFEATURES_CONFIG_NAME if not ANTIFEATURES_KEYS or k not in common.config: common.config[k] = common.load_localized_config(k, 'repo') ANTIFEATURES_KEYS = sorted(common.config[k].keys()) @@ -238,7 +238,7 @@ def load_antiFeatures_config(): def load_categories_config(): """Lazy loading, since it might read a lot of files.""" global CATEGORIES_KEYS - k = 'categories' + k = common.CATEGORIES_CONFIG_NAME if not CATEGORIES_KEYS: if config and k in config: CATEGORIES_KEYS = config[k] diff --git a/tests/common.TestCase b/tests/common.TestCase index 9bda9820..66c5f184 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -39,6 +39,7 @@ import fdroidserver.signindex import fdroidserver.common import fdroidserver.metadata from testcommon import TmpCwd, mkdtemp +from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME from fdroidserver.exception import FDroidException, VCSException,\ MetaDataException, VerificationException @@ -2664,7 +2665,9 @@ class CommonTest(unittest.TestCase): def test_load_localized_config(self): """It should load""" - antiFeatures = fdroidserver.common.load_localized_config('antiFeatures', 'repo') + antiFeatures = fdroidserver.common.load_localized_config( + ANTIFEATURES_CONFIG_NAME, 'repo' + ) self.assertEqual( [ 'Ads', @@ -2696,7 +2699,9 @@ class CommonTest(unittest.TestCase): def test_load_localized_config_categories(self): """It should load""" - categories = fdroidserver.common.load_localized_config('categories', 'repo') + categories = fdroidserver.common.load_localized_config( + CATEGORIES_CONFIG_NAME, 'repo' + ) self.assertEqual( [ 'Time', diff --git a/tests/lint.TestCase b/tests/lint.TestCase index af4fe8f1..d69382f0 100755 --- a/tests/lint.TestCase +++ b/tests/lint.TestCase @@ -20,6 +20,7 @@ if localmodule not in sys.path: import fdroidserver.common import fdroidserver.lint import fdroidserver.metadata +from fdroidserver.common import CATEGORIES_CONFIG_NAME class LintTest(unittest.TestCase): @@ -323,7 +324,7 @@ class LintTest(unittest.TestCase): self.assertFalse(anywarns) def test_check_categories_in_config(self): - fdroidserver.lint.config = {'categories': ['InConfig']} + fdroidserver.lint.config = {CATEGORIES_CONFIG_NAME: ['InConfig']} fdroidserver.lint.load_categories_config() app = fdroidserver.metadata.App({'Categories': ['InConfig']}) self.assertEqual(0, len(list(fdroidserver.lint.check_categories(app)))) @@ -335,13 +336,13 @@ class LintTest(unittest.TestCase): self.assertEqual(1, len(list(fdroidserver.lint.check_categories(app)))) def test_check_categories_empty_is_error(self): - fdroidserver.lint.config = {'categories': []} + fdroidserver.lint.config = {CATEGORIES_CONFIG_NAME: []} fdroidserver.lint.load_categories_config() app = fdroidserver.metadata.App({'Categories': ['something']}) self.assertEqual(1, len(list(fdroidserver.lint.check_categories(app)))) def test_check_categories_old_hardcoded_not_defined(self): - fdroidserver.lint.config = {'categories': ['foo', 'bar']} + fdroidserver.lint.config = {CATEGORIES_CONFIG_NAME: ['foo', 'bar']} fdroidserver.lint.load_categories_config() app = fdroidserver.metadata.App({'Categories': ['Writing']}) self.assertEqual(1, len(list(fdroidserver.lint.check_categories(app)))) From 9df8caca07d1795433d85ea0cb0d3c03ed1d700e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 31 May 2023 23:08:40 +0200 Subject: [PATCH 1256/2116] log error if config file name is not known The case of Anti-Features keys and filenames is quite confusing. I was confused to find out that config/antiFeatures.yml is correct, while config/antifeatures.yml is nothing. This throws an error message to make that clear. --- fdroidserver/common.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index d2bfce90..b2d1ae85 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -28,6 +28,7 @@ # common.py is imported by all modules, so do not import third-party # libraries here as they will become a requirement for all commands. +import difflib import git import glob import io @@ -519,7 +520,9 @@ def load_localized_config(name, repodir): """ ret = dict() + found_config_file = False for f in Path().glob("config/**/{name}.yml".format(name=name)): + found_config_file = True locale = f.parts[1] if len(f.parts) == 2: locale = DEFAULT_LOCALE @@ -542,6 +545,16 @@ def load_localized_config(name, repodir): else: ret[afname][key][locale] = value + if not found_config_file: + for f in Path().glob("config/*.yml"): + if f.stem not in CONFIG_NAMES: + msg = _('{path} is not a standard config file!').format(path=f) + m = difflib.get_close_matches(f.stem, CONFIG_NAMES, 1) + if m: + msg += ' ' + msg += _('Did you mean config/{name}.yml?').format(name=m[0]) + logging.error(msg) + for elem in ret.values(): for afname in elem: elem[afname] = {locale: v for locale, v in sorted(elem[afname].items())} From f0aa3bae663905d9b38fad638e147d272f2caff9 Mon Sep 17 00:00:00 2001 From: cvzi Date: Fri, 18 Aug 2023 22:11:06 +0000 Subject: [PATCH 1257/2116] Gradle 8.3 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 08c6f24c..ca56b563 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -192,6 +192,7 @@ get_sha() { '8.1.1') echo 'e111cb9948407e26351227dabce49822fb88c37ee72f1d1582a69c68af2e702f' ;; '8.2') echo '38f66cd6eef217b4c35855bb11ea4e9fbc53594ccccb5fb82dfd317ef8c2c5a3' ;; '8.2.1') echo '03ec176d388f2aa99defcadc3ac6adf8dd2bce5145a129659537c0874dea5ad1' ;; + '8.3') echo '591855b517fc635b9e04de1d05d5e76ada3f89f5fc76f87978d1b245b4f69225' ;; *) exit 1 esac } @@ -212,7 +213,7 @@ d_plugin_k=(8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2. d_plugin_v=(8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 8188bb6bfaebd2794ca2916bd76d88ebfdbf9ccc Mon Sep 17 00:00:00 2001 From: linsui Date: Fri, 4 Aug 2023 19:51:06 +0800 Subject: [PATCH 1258/2116] metadata: set mapping indentation to 2 --- fdroidserver/metadata.py | 2 +- .../app.with.special.build.params.yml | 14 +++++----- .../metadata-rewrite-yml/fake.ota.update.yml | 28 +++++++++---------- .../org.fdroid.fdroid.yml | 20 ++++++------- tests/metadata.TestCase | 8 +++--- .../app.with.special.build.params.yml | 10 +++---- 6 files changed, 41 insertions(+), 41 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index ca46bd17..dffcc45c 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -1267,7 +1267,7 @@ def write_yaml(mf, app): _del_duplicated_NoSourceSince(app) yaml_app = _app_to_yaml(app) yaml = ruamel.yaml.YAML() - yaml.indent(mapping=4, sequence=4, offset=2) + yaml.indent(mapping=2, sequence=4, offset=2) yaml.dump(yaml_app, stream=mf) diff --git a/tests/metadata-rewrite-yml/app.with.special.build.params.yml b/tests/metadata-rewrite-yml/app.with.special.build.params.yml index 1a286a13..0fc97b65 100644 --- a/tests/metadata-rewrite-yml/app.with.special.build.params.yml +++ b/tests/metadata-rewrite-yml/app.with.special.build.params.yml @@ -9,13 +9,13 @@ IssueTracker: https://github.com/loadrunner/Facebook-Contact-Sync/issues AutoName: UberSync for Facebook Summary: Sync your Facebook Contacts Description: |- - To configure, go to "Settings => Accounts & Sync => Add Account". Depending on - how many friends you have, the first import might take a while, so be patient. + To configure, go to "Settings => Accounts & Sync => Add Account". Depending on + how many friends you have, the first import might take a while, so be patient. - * Facebook does not allow to export phone numbers or emails: only names, pictures and statuses are synced. - * Facebook users have the option to block one or all apps: if they opt for that, they will be EXCLUDED from your friends list. + * Facebook does not allow to export phone numbers or emails: only names, pictures and statuses are synced. + * Facebook users have the option to block one or all apps: if they opt for that, they will be EXCLUDED from your friends list. - Appbrain SDK was removed before building. + Appbrain SDK was removed before building. RepoType: git Repo: https://github.com/loadrunner/Facebook-Contact-Sync.git @@ -78,8 +78,8 @@ Builds: srclibs: - FacebookSDK@sdk-version-3.0.2 antifeatures: - Tracking: - en-US: Uses the Facebook SDK. + Tracking: + en-US: Uses the Facebook SDK. - versionName: 2.1.1-c versionCode: 50 diff --git a/tests/metadata-rewrite-yml/fake.ota.update.yml b/tests/metadata-rewrite-yml/fake.ota.update.yml index dc8b6b9c..cde65618 100644 --- a/tests/metadata-rewrite-yml/fake.ota.update.yml +++ b/tests/metadata-rewrite-yml/fake.ota.update.yml @@ -9,24 +9,24 @@ Donate: https://f-droid.org/about AutoName: Fake OTA Update Summary: Tests whether OTA ZIP files are being include Description: |- - F-Droid can make use of system privileges or permissions to - install, update and remove applications on its own. The only way to obtain those - privileges is to become a system app. + F-Droid can make use of system privileges or permissions to + install, update and remove applications on its own. The only way to obtain those + privileges is to become a system app. - This is where the Privileged Extension comes in - being a separate app and much - smaller, it can be installed as a system app and communicate with the main app - via AIDL IPC. + This is where the Privileged Extension comes in - being a separate app and much + smaller, it can be installed as a system app and communicate with the main app + via AIDL IPC. - This has several advantages: + This has several advantages: - * Reduced disk usage in the system partition - * System updates don't remove F-Droid - * The process of installing into system via root is safer + * Reduced disk usage in the system partition + * System updates don't remove F-Droid + * The process of installing into system via root is safer - This is packaged as an OTA (Over-The-Air) update ZIP file. It must be installed - using TWRP or other Android recovery that can flash updates to the system from - the /data/data/org.fdroid.fdroid folder on the /data partition. The standalone - APK is called F-Droid Privileged Extension. + This is packaged as an OTA (Over-The-Air) update ZIP file. It must be installed + using TWRP or other Android recovery that can flash updates to the system from + the /data/data/org.fdroid.fdroid folder on the /data partition. The standalone + APK is called F-Droid Privileged Extension. RepoType: git Repo: https://gitlab.com/fdroid/privileged-extension.git diff --git a/tests/metadata-rewrite-yml/org.fdroid.fdroid.yml b/tests/metadata-rewrite-yml/org.fdroid.fdroid.yml index 4edb97b7..ed59f61b 100644 --- a/tests/metadata-rewrite-yml/org.fdroid.fdroid.yml +++ b/tests/metadata-rewrite-yml/org.fdroid.fdroid.yml @@ -13,18 +13,18 @@ Bitcoin: 15u8aAPK4jJ5N8wpWJ5gutAyyeHtKX5i18 AutoName: F-Droid Summary: Application manager Description: |- - Connects to F-Droid compatible repositories. The default repo is hosted at - f-droid.org, which contains only bona fide FOSS. + Connects to F-Droid compatible repositories. The default repo is hosted at + f-droid.org, which contains only bona fide FOSS. - Android is open in the sense that you are free to install apks from anywhere you - wish, but there are many good reasons for using a client/repository setup: + Android is open in the sense that you are free to install apks from anywhere you + wish, but there are many good reasons for using a client/repository setup: - * Be notified when updates are available - * Keep track of older and beta versions - * Filter apps that aren't compatible with the device - * Find apps via categories and searchable descriptions - * Access associated urls for donations, source code etc. - * Stay safe by checking repo index signatures and apk hashes + * Be notified when updates are available + * Keep track of older and beta versions + * Filter apps that aren't compatible with the device + * Find apps via categories and searchable descriptions + * Access associated urls for donations, source code etc. + * Stay safe by checking repo index signatures and apk hashes RepoType: srclib Repo: fdroidclient diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 8c606b2c..15e2eddd 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -1462,10 +1462,10 @@ class MetadataTest(unittest.TestCase): gradle: - yes antifeatures: - a: {} - b: - de: Probe - en-US: test + a: {} + b: + de: Probe + en-US: test """ ), ) diff --git a/tests/metadata/app.with.special.build.params.yml b/tests/metadata/app.with.special.build.params.yml index e07efc2d..d12c713c 100644 --- a/tests/metadata/app.with.special.build.params.yml +++ b/tests/metadata/app.with.special.build.params.yml @@ -9,13 +9,13 @@ IssueTracker: https://github.com/loadrunner/Facebook-Contact-Sync/issues AutoName: UberSync for Facebook Summary: Sync your Facebook Contacts Description: |- - To configure, go to "Settings => Accounts & Sync => Add Account". Depending on - how many friends you have, the first import might take a while, so be patient. + To configure, go to "Settings => Accounts & Sync => Add Account". Depending on + how many friends you have, the first import might take a while, so be patient. - * Facebook does not allow to export phone numbers or emails: only names, pictures and statuses are synced. - * Facebook users have the option to block one or all apps: if they opt for that, they will be EXCLUDED from your friends list. + * Facebook does not allow to export phone numbers or emails: only names, pictures and statuses are synced. + * Facebook users have the option to block one or all apps: if they opt for that, they will be EXCLUDED from your friends list. - Appbrain SDK was removed before building. + Appbrain SDK was removed before building. RepoType: git Repo: https://github.com/loadrunner/Facebook-Contact-Sync.git From 207859f1606a88311897f865fac632dcdd05c561 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 4 Aug 2023 16:30:56 +0200 Subject: [PATCH 1259/2116] gradlew-fdroid: add key/values for Gradle Android Plugin 8.3/8.2/8.1 --- gradlew-fdroid | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index ca56b563..9211c8ee 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -209,8 +209,8 @@ contains() { # (key) should accept. plugin versions are actually prefixes and catch sub- # versions as well. Pairs are taken from: # https://developer.android.com/studio/releases/gradle-plugin#updating-gradle -d_plugin_k=(8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 1.3 1.2 1.1 1.0 0.14 0.13 0.12 0.11 0.10 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2) -d_plugin_v=(8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) +d_gradle_plugin_ver_k=(8.3 8.2 8.1 8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 1.3 1.2 1.1 1.0 0.14 0.13 0.12 0.11 0.10 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2) +d_plugin_min_gradle_v=(8.3 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about plugin_v=(8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) @@ -261,9 +261,9 @@ fi if [[ -n $plugin_pver ]]; then i=0 match=false - for k in ${d_plugin_k[@]}; do + for k in ${d_gradle_plugin_ver_k[@]}; do if [[ $plugin_pver == ${k}* ]]; then - plugin_ver=${d_plugin_v[$i]} + plugin_ver=${d_plugin_min_gradle_v[$i]} match=true break fi From 00aa595f37ca648d4e3592f2a4b6ece7740739de Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 1 Jun 2023 20:23:00 +0200 Subject: [PATCH 1260/2116] deploy: give useful error if rsync is not installed --- fdroidserver/deploy.py | 6 ++++++ tests/deploy.TestCase | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 54496f78..7cc709d6 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -277,6 +277,12 @@ def update_serverwebroot(serverwebroot, repo_section): has a low resolution timestamp """ + try: + subprocess.run(['rsync', '--version'], capture_output=True, check=True) + except Exception as e: + raise FDroidException( + _('rsync is missing or broken: {error}').format(error=e) + ) from e rsyncargs = ['rsync', '--archive', '--delete-after', '--safe-links'] if not options.no_checksum: rsyncargs.append('--checksum') diff --git a/tests/deploy.TestCase b/tests/deploy.TestCase index d35200be..5539af4c 100755 --- a/tests/deploy.TestCase +++ b/tests/deploy.TestCase @@ -18,6 +18,7 @@ if localmodule not in sys.path: import fdroidserver.common import fdroidserver.deploy +from fdroidserver.exception import FDroidException from testcommon import TmpCwd, mkdtemp @@ -56,6 +57,13 @@ class DeployTest(unittest.TestCase): fdroidserver.deploy.update_serverwebroot(str(serverwebroot), 'repo') self.assertTrue(dest_apk.is_file()) + @mock.patch.dict(os.environ, clear=True) + def test_update_serverwebroot_no_rsync_error(self): + os.environ['PATH'] = self.testdir + os.chdir(self.testdir) + with self.assertRaises(FDroidException): + fdroidserver.deploy.update_serverwebroot('serverwebroot', 'repo') + def test_update_serverwebroot_make_cur_version_link(self): # setup parameters for this test run fdroidserver.deploy.options.no_checksum = True From 64b8ee772c494fa84d3e14387842ee4a7b6a11d7 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 7 Jun 2023 11:03:14 +0200 Subject: [PATCH 1261/2116] throw useful error if a config YAML file is not a dict --- fdroidserver/common.py | 8 ++++++++ tests/common.TestCase | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index b2d1ae85..a0940154 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -399,6 +399,11 @@ def read_config(opts=None): config = yaml.safe_load(fp) if not config: config = {} + if not isinstance(config, dict): + msg = _('{path} is not "key: value" dict, but a {datatype}!') + raise TypeError( + msg.format(path=config_file, datatype=type(config).__name__) + ) elif os.path.exists(old_config_file): logging.warning(_("""{oldfile} is deprecated, use {newfile}""") .format(oldfile=old_config_file, newfile=config_file)) @@ -528,6 +533,9 @@ def load_localized_config(name, repodir): locale = DEFAULT_LOCALE with open(f, encoding="utf-8") as fp: elem = yaml.safe_load(fp) + if not isinstance(elem, dict): + msg = _('{path} is not "key: value" dict, but a {datatype}!') + raise TypeError(msg.format(path=f, datatype=type(elem).__name__)) for afname, field_dict in elem.items(): if afname not in ret: ret[afname] = dict() diff --git a/tests/common.TestCase b/tests/common.TestCase index 66c5f184..d98ed24b 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1919,6 +1919,18 @@ class CommonTest(unittest.TestCase): config = fdroidserver.common.read_config(fdroidserver.common.options) self.assertEqual(os.getenv('SECRET', 'fail'), config.get('keypass')) + def test_with_config_yml_is_dict(self): + os.chdir(self.tmpdir) + Path('config.yml').write_text('apksigner = /placeholder/path') + with self.assertRaises(TypeError): + fdroidserver.common.read_config(fdroidserver.common.options) + + def test_with_config_yml_is_not_mixed_type(self): + os.chdir(self.tmpdir) + Path('config.yml').write_text('k: v\napksigner = /placeholder/path') + with self.assertRaises(yaml.scanner.ScannerError): + fdroidserver.common.read_config(fdroidserver.common.options) + def test_with_config_py(self): """Make sure it is still possible to use config.py alone.""" os.chdir(self.tmpdir) @@ -2716,6 +2728,27 @@ class CommonTest(unittest.TestCase): ) self.assertEqual(['en-US'], list(categories['GuardianProject']['name'].keys())) + def test_load_localized_config_0_file(self): + os.chdir(self.testdir) + os.mkdir('config') + Path('config/categories.yml').write_text('') + with self.assertRaises(TypeError): + fdroidserver.common.load_localized_config(CATEGORIES_CONFIG_NAME, 'repo') + + def test_load_localized_config_string(self): + os.chdir(self.testdir) + os.mkdir('config') + Path('config/categories.yml').write_text('this is a string') + with self.assertRaises(TypeError): + fdroidserver.common.load_localized_config(CATEGORIES_CONFIG_NAME, 'repo') + + def test_load_localized_config_list(self): + os.chdir(self.testdir) + os.mkdir('config') + Path('config/categories.yml').write_text('- System') + with self.assertRaises(TypeError): + fdroidserver.common.load_localized_config(CATEGORIES_CONFIG_NAME, 'repo') + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 2c566cf68f40e91ee62ec20d72d5a9777a79d8ec Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 7 Jun 2023 13:36:02 +0200 Subject: [PATCH 1262/2116] update: add all categories in metadata files to repo definitions !1366 makes it so categories are now defined by the repo. Categories can be defined in the config so that lint has a list of categories to enforce. This also provides a place for localization and icons for the categories. The old way of defining categories was just listing them in app metadata files. This restores that way of functioning when using index-v2. closes #1137 --- fdroidserver/index.py | 11 ++++- tests/repo/entry.json | 4 +- tests/repo/index-v2.json | 7 ++- tests/update.TestCase | 94 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 111 insertions(+), 5 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index ddb51546..d05d159e 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -711,6 +711,7 @@ def make_v2(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ output_packages = collections.OrderedDict() output['packages'] = output_packages + categories_used_by_apps = set() for package in packages: packageName = package['packageName'] if packageName not in apps: @@ -730,7 +731,9 @@ def make_v2(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ else: packagelist = {} output_packages[packageName] = packagelist - packagelist["metadata"] = package_metadata(apps[packageName], repodir) + app = apps[packageName] + categories_used_by_apps.update(app.get('Categories', [])) + packagelist["metadata"] = package_metadata(app, repodir) if "signer" in package: packagelist["metadata"]["preferredSigner"] = package["signer"] @@ -738,6 +741,12 @@ def make_v2(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ packagelist["versions"][package["hash"]] = convert_version(package, apps[packageName], repodir) + if categories_used_by_apps and not output['repo'].get(CATEGORIES_CONFIG_NAME): + output['repo'][CATEGORIES_CONFIG_NAME] = dict() + for category in sorted(categories_used_by_apps): + if category not in output['repo'][CATEGORIES_CONFIG_NAME]: + output['repo'][CATEGORIES_CONFIG_NAME][category] = dict() + entry = {} entry["timestamp"] = repodict["timestamp"] diff --git a/tests/repo/entry.json b/tests/repo/entry.json index 5c0ca528..0e8828e0 100644 --- a/tests/repo/entry.json +++ b/tests/repo/entry.json @@ -3,8 +3,8 @@ "version": 20002, "index": { "name": "/index-v2.json", - "sha256": "7117ee6ff4ff2dd71ec3f3d3ad2ef7e9fd4afead9b1f2d39d0b224a1812e78b5", - "size": 53233, + "sha256": "b613858aa7a2ec476fcef5c841a5b8ff4b3b0f67f07678da981e2843f49c71ba", + "size": 53283, "numPackages": 10 }, "diffs": {} diff --git a/tests/repo/index-v2.json b/tests/repo/index-v2.json index 6ea92407..f45c1514 100644 --- a/tests/repo/index-v2.json +++ b/tests/repo/index-v2.json @@ -533,7 +533,10 @@ "name": { "en-US": "System" } - } + }, + "1": {}, + "2.0": {}, + "tests": {} }, "requests": { "install": [ @@ -1443,4 +1446,4 @@ } } } -} +} \ No newline at end of file diff --git a/tests/update.TestCase b/tests/update.TestCase index 391dec93..e859e04f 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -53,6 +53,7 @@ import fdroidserver.common import fdroidserver.exception import fdroidserver.metadata import fdroidserver.update +from fdroidserver.common import CATEGORIES_CONFIG_NAME DONATION_FIELDS = ('Donate', 'Liberapay', 'OpenCollective') @@ -1804,6 +1805,99 @@ class UpdateTest(unittest.TestCase): fdroidserver.update.main() self.assertFalse(categories_txt.exists()) + def test_no_blank_auto_defined_categories(self): + """When no app has Categories, there should be no definitions in the repo.""" + os.chdir(self.testdir) + os.mkdir('metadata') + os.mkdir('repo') + Path('config.yml').write_text( + 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff' + ) + + testapk = os.path.join('repo', 'com.politedroid_6.apk') + shutil.copy(os.path.join(self.basedir, testapk), testapk) + Path('metadata/com.politedroid.yml').write_text('Name: Polite') + + with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']): + fdroidserver.update.main() + with open('repo/index-v2.json') as fp: + index = json.load(fp) + self.assertFalse(CATEGORIES_CONFIG_NAME in index['repo']) + + def test_auto_defined_categories(self): + """Repos that don't define categories in config/ should use auto-generated.""" + os.chdir(self.testdir) + os.mkdir('metadata') + os.mkdir('repo') + Path('config.yml').write_text( + 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff' + ) + + testapk = os.path.join('repo', 'com.politedroid_6.apk') + shutil.copy(os.path.join(self.basedir, testapk), testapk) + Path('metadata/com.politedroid.yml').write_text('Categories: [Time]') + + with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']): + fdroidserver.update.main() + with open('repo/index-v2.json') as fp: + index = json.load(fp) + self.assertEqual( + {'Time': dict()}, + index['repo'][CATEGORIES_CONFIG_NAME], + ) + + def test_auto_defined_categories_two_apps(self): + """Repos that don't define categories in config/ should use auto-generated.""" + os.chdir(self.testdir) + os.mkdir('metadata') + os.mkdir('repo') + Path('config.yml').write_text( + 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff' + ) + + testapk = os.path.join('repo', 'com.politedroid_6.apk') + shutil.copy(os.path.join(self.basedir, testapk), testapk) + Path('metadata/com.politedroid.yml').write_text('Categories: [bar]') + testapk = os.path.join('repo', 'souch.smsbypass_9.apk') + shutil.copy(os.path.join(self.basedir, testapk), testapk) + Path('metadata/souch.smsbypass.yml').write_text('Categories: [foo, bar]') + + with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']): + fdroidserver.update.main() + with open('repo/index-v2.json') as fp: + index = json.load(fp) + self.assertEqual( + {'bar': dict(), 'foo': dict()}, + index['repo'][CATEGORIES_CONFIG_NAME], + ) + + def test_auto_defined_categories_mix_into_config_categories(self): + """Repos that don't define all categories in config/ also use auto-generated.""" + os.chdir(self.testdir) + os.mkdir('config') + Path('config/categories.yml').write_text('System: {name: System Apps}') + os.mkdir('metadata') + os.mkdir('repo') + Path('config.yml').write_text( + 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff' + ) + + testapk = os.path.join('repo', 'com.politedroid_6.apk') + shutil.copy(os.path.join(self.basedir, testapk), testapk) + Path('metadata/com.politedroid.yml').write_text('Categories: [Time]') + testapk = os.path.join('repo', 'souch.smsbypass_9.apk') + shutil.copy(os.path.join(self.basedir, testapk), testapk) + Path('metadata/souch.smsbypass.yml').write_text('Categories: [System, Time]') + + with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']): + fdroidserver.update.main() + with open('repo/index-v2.json') as fp: + index = json.load(fp) + self.assertEqual( + {'System': {'name': {'en-US': 'System Apps'}}, 'Time': dict()}, + index['repo'][CATEGORIES_CONFIG_NAME], + ) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 48559ecec5a1c402f4d4bf0dc6c8b1c09c555b1a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 7 Jun 2023 15:57:58 +0200 Subject: [PATCH 1263/2116] category with no apps should be ignored, even if defined in config https://gitlab.com/fdroid/fdroidclient/-/issues/2619#note_1421280589 The test needed to change because the test index files contained category definitions that were not ever used in the "copy tests/repo, generate java/gpg keys, update, and gpgsign" test in tests/run-tests. --- fdroidserver/index.py | 7 +++++++ tests/metadata.TestCase | 2 ++ tests/metadata/com.politedroid.yml | 2 ++ tests/metadata/dump/com.politedroid.yaml | 2 ++ tests/repo/entry.json | 2 +- tests/repo/index-v1.json | 2 ++ tests/repo/index-v2.json | 2 ++ tests/repo/index.xml | 4 ++-- tests/update.TestCase | 24 ++++++++++++++++++++++++ 9 files changed, 44 insertions(+), 3 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index d05d159e..bef83ff6 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -743,9 +743,16 @@ def make_v2(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ if categories_used_by_apps and not output['repo'].get(CATEGORIES_CONFIG_NAME): output['repo'][CATEGORIES_CONFIG_NAME] = dict() + # include definitions for "auto-defined" categories, e.g. just used in app metadata for category in sorted(categories_used_by_apps): if category not in output['repo'][CATEGORIES_CONFIG_NAME]: output['repo'][CATEGORIES_CONFIG_NAME][category] = dict() + # do not include defined categories if no apps use them + for category in list(output['repo'].get(CATEGORIES_CONFIG_NAME, list())): + if category not in categories_used_by_apps: + del output['repo'][CATEGORIES_CONFIG_NAME][category] + msg = _('Category "{category}" defined but not used for any apps!') + logging.warning(msg.format(category=category)) entry = {} entry["timestamp"] = repodict["timestamp"] diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 15e2eddd..c46d5bbf 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -1863,6 +1863,8 @@ class MetadataTest(unittest.TestCase): AntiFeatures: - NonFreeNet Categories: + - Multimedia + - Security - Time License: GPL-3.0-only SourceCode: https://github.com/miguelvps/PoliteDroid diff --git a/tests/metadata/com.politedroid.yml b/tests/metadata/com.politedroid.yml index 669520a6..cd474d6c 100644 --- a/tests/metadata/com.politedroid.yml +++ b/tests/metadata/com.politedroid.yml @@ -1,6 +1,8 @@ AntiFeatures: - NonFreeNet Categories: + - Multimedia + - Security - Time License: GPL-3.0-only SourceCode: https://github.com/miguelvps/PoliteDroid diff --git a/tests/metadata/dump/com.politedroid.yaml b/tests/metadata/dump/com.politedroid.yaml index 17e6a8f3..57cce841 100644 --- a/tests/metadata/dump/com.politedroid.yaml +++ b/tests/metadata/dump/com.politedroid.yaml @@ -161,6 +161,8 @@ Builds: versionCode: 6 versionName: '1.5' Categories: +- Multimedia +- Security - Time Changelog: '' CurrentVersion: '1.5' diff --git a/tests/repo/entry.json b/tests/repo/entry.json index 0e8828e0..56249552 100644 --- a/tests/repo/entry.json +++ b/tests/repo/entry.json @@ -3,7 +3,7 @@ "version": 20002, "index": { "name": "/index-v2.json", - "sha256": "b613858aa7a2ec476fcef5c841a5b8ff4b3b0f67f07678da981e2843f49c71ba", + "sha256": "5e3c0eaafd99d3518da2bb2bc7565b2ebcb17775a2f4ccc33b7336901ec71a6f", "size": 53283, "numPackages": 10 }, diff --git a/tests/repo/index-v1.json b/tests/repo/index-v1.json index 4b845994..33d0f9ce 100644 --- a/tests/repo/index-v1.json +++ b/tests/repo/index-v1.json @@ -174,6 +174,8 @@ "NonFreeNet" ], "categories": [ + "Multimedia", + "Security", "Time" ], "suggestedVersionName": "1.5", diff --git a/tests/repo/index-v2.json b/tests/repo/index-v2.json index f45c1514..d41b95b5 100644 --- a/tests/repo/index-v2.json +++ b/tests/repo/index-v2.json @@ -553,6 +553,8 @@ "metadata": { "added": 1498176000000, "categories": [ + "Multimedia", + "Security", "Time" ], "issueTracker": "https://github.com/miguelvps/PoliteDroid/issues", diff --git a/tests/repo/index.xml b/tests/repo/index.xml index 6935f675..24ebea24 100644 --- a/tests/repo/index.xml +++ b/tests/repo/index.xml @@ -311,8 +311,8 @@ APK is called F-Droid Privileged Extension. com.politedroid.6.png Activates silent mode during calendar events. GPL-3.0-only - Time - Time + Multimedia,Security,Time + Multimedia https://github.com/miguelvps/PoliteDroid https://github.com/miguelvps/PoliteDroid/issues diff --git a/tests/update.TestCase b/tests/update.TestCase index e859e04f..ac9a6f5e 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1898,6 +1898,30 @@ class UpdateTest(unittest.TestCase): index['repo'][CATEGORIES_CONFIG_NAME], ) + def test_empty_categories_not_in_index(self): + """A category with no apps should be ignored, even if defined in config.""" + os.chdir(self.testdir) + os.mkdir('config') + Path('config/categories.yml').write_text('System: {name: S}\nTime: {name: T}\n') + os.mkdir('metadata') + os.mkdir('repo') + Path('config.yml').write_text( + 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff' + ) + + testapk = os.path.join('repo', 'com.politedroid_6.apk') + shutil.copy(os.path.join(self.basedir, testapk), testapk) + Path('metadata/com.politedroid.yml').write_text('Categories: [Time]') + + with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']): + fdroidserver.update.main() + with open('repo/index-v2.json') as fp: + index = json.load(fp) + self.assertEqual( + {'Time': {'name': {'en-US': 'T'}}}, + index['repo'][CATEGORIES_CONFIG_NAME], + ) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 3757add164864b66674edc8d48e46a7c339a2e64 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 15 Apr 2021 09:02:53 +0200 Subject: [PATCH 1264/2116] test_sdk_exists to be based on apksigner, that's the requirement Before, lots of pieces of the Android SDK were required for fdroidserver to operate, like aapt, zipalign, etc. Now, apksigner is the only requirement. %"support APK Signature v2+" !889 --- fdroidserver/common.py | 20 +++++++----- tests/common.TestCase | 69 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 7 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index a0940154..3111d1bb 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -728,13 +728,16 @@ def test_aapt_version(aapt): def test_sdk_exists(thisconfig): if 'sdk_path' not in thisconfig: - # TODO convert this to apksigner once it is required - if 'aapt' in thisconfig and os.path.isfile(thisconfig['aapt']): - test_aapt_version(thisconfig['aapt']) - return True - else: - logging.error(_("'sdk_path' not set in config.yml!")) - return False + # check the 'apksigner' value in the config to see if its new enough + f = thisconfig.get('apksigner', '') + if os.path.isfile(f): + sdk_path = os.path.dirname(os.path.dirname(os.path.dirname(f))) + tmpconfig = {'sdk_path': sdk_path} + find_apksigner(tmpconfig) + if os.path.exists(tmpconfig.get('apksigner', '')): + return True + logging.error(_("'sdk_path' not set in config.yml!")) + return False if thisconfig['sdk_path'] == default_config['sdk_path']: logging.error(_('No Android SDK found!')) logging.error(_('You can use ANDROID_HOME to set the path to your SDK, i.e.:')) @@ -748,6 +751,9 @@ def test_sdk_exists(thisconfig): logging.critical(_("Android SDK path '{path}' is not a directory!") .format(path=thisconfig['sdk_path'])) return False + find_apksigner(thisconfig) + if not os.path.exists(thisconfig.get('apksigner', '')): + return False return True diff --git a/tests/common.TestCase b/tests/common.TestCase index d98ed24b..26cd979c 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -2051,6 +2051,75 @@ class CommonTest(unittest.TestCase): config = fdroidserver.common.read_config(fdroidserver.common.options) self.assertEqual('/usr/lib/jvm/java-8-openjdk', config.get('java_paths', {}).get('8')) + @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) + def test_test_sdk_exists_fails_on_bad_sdk_path(self): + config = {'sdk_path': 'nothinghere'} + self.assertFalse(fdroidserver.common.test_sdk_exists(config)) + + @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) + def test_test_sdk_exists_fails_on_empty(self): + self.assertFalse(fdroidserver.common.test_sdk_exists(dict())) + + @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) + def test_test_sdk_exists_fails_on_non_existent(self): + config = {'sdk_path': os.path.join(self.testdir, 'non_existent')} + self.assertFalse(fdroidserver.common.test_sdk_exists(config)) + + @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) + def test_test_sdk_exists_fails_on_file(self): + f = os.path.join(self.testdir, 'testfile') + open(f, 'w').close() + config = {'sdk_path': f} + self.assertFalse(fdroidserver.common.test_sdk_exists(config)) + + @mock.patch.dict(os.environ, {'PATH': '/nonexistent'}, clear=True) + def test_test_sdk_exists_valid_apksigner_in_config(self): + apksigner = os.path.join( + self.testdir, + 'build-tools', + fdroidserver.common.MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION, + 'apksigner', + ) + os.makedirs(os.path.dirname(apksigner)) + with open(apksigner, 'w') as fp: + fp.write('#!/bin/sh\ndate\n') + os.chmod(apksigner, 0o0755) + config = {'apksigner': apksigner} + self.assertTrue(fdroidserver.common.test_sdk_exists(config)) + + @mock.patch.dict(os.environ, {'PATH': '/nonexistent'}, clear=True) + def test_test_sdk_exists_old_apksigner_in_config(self): + apksigner = os.path.join(self.testdir, 'build-tools', '28.0.0', 'apksigner') + os.makedirs(os.path.dirname(apksigner)) + with open(apksigner, 'w') as fp: + fp.write('#!/bin/sh\ndate\n') + os.chmod(apksigner, 0o0755) + config = {'apksigner': apksigner} + self.assertFalse(fdroidserver.common.test_sdk_exists(config)) + + @mock.patch.dict(os.environ, {'PATH': '/nonexistent'}, clear=True) + def test_test_sdk_exists_with_valid_apksigner(self): + apksigner = ( + Path(self.testdir) + / 'build-tools' + / fdroidserver.common.MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION + / 'apksigner' + ) + apksigner.parent.mkdir(parents=True) + apksigner.write_text('#!/bin/sh\ndate\n') + apksigner.chmod(0o0755) + config = {'sdk_path': self.testdir} + self.assertTrue(fdroidserver.common.test_sdk_exists(config)) + + @mock.patch.dict(os.environ, {'PATH': '/nonexistent'}, clear=True) + def test_test_sdk_exists_with_old_apksigner(self): + apksigner = Path(self.testdir) / 'build-tools' / '17.0.0' / 'apksigner' + apksigner.parent.mkdir(parents=True) + apksigner.write_text('#!/bin/sh\ndate\n') + apksigner.chmod(0o0755) + config = {'sdk_path': self.testdir} + self.assertFalse(fdroidserver.common.test_sdk_exists(config)) + def test_loading_config_buildserver_yml(self): """Smoke check to make sure this file is properly parsed""" os.chdir(self.tmpdir) From 17cb026d974a0ec9af141f43f744ede1b4c495ac Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 20 Sep 2023 10:10:15 +0200 Subject: [PATCH 1265/2116] safety: ignore 60350, it is being handled in Debian * https://security-tracker.debian.org/tracker/CVE-2023-40267 --- .safety-policy.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.safety-policy.yml b/.safety-policy.yml index 7415406d..0f8398bf 100644 --- a/.safety-policy.yml +++ b/.safety-policy.yml @@ -5,3 +5,6 @@ security: 52495: reason: setuptools comes from Debian expires: '2025-01-31' + 60350: + reason: GitPython comes from Debian https://security-tracker.debian.org/tracker/CVE-2023-40267 + expires: '2025-01-31' From 4a9b69a7208f0ffab0a0491d02655a4fbbad232a Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Wed, 20 Sep 2023 14:46:23 +0000 Subject: [PATCH 1266/2116] Lint 'main' too --- fdroidserver/lint.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 7a042a70..9e009160 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -139,9 +139,9 @@ http_checks = ( ), ( re.compile( - r'^https://[^/]*(github|gitlab|bitbucket|rawgit|githubusercontent)\.[a-zA-Z]+/([^/]+/){2,3}master/' + r'^https://[^/]*(github|gitlab|bitbucket|rawgit|githubusercontent)\.[a-zA-Z]+/([^/]+/){2,3}(master|main)/' ), - _("Use /HEAD instead of /master to point at a file in the default branch"), + _("Use /HEAD instead of /master or /main to point at a file in the default branch"), ), ] ) @@ -464,7 +464,7 @@ def check_builds(app): "Build generated by `fdroid import` - remove disable line once ready" ) continue - for s in ['master', 'origin', 'HEAD', 'default', 'trunk']: + for s in ['master', 'main', 'origin', 'HEAD', 'default', 'trunk']: if build.commit and build.commit.startswith(s): yield _( "Branch '{branch}' used as commit in build '{versionName}'" From 4d0117d54c113f5ce0c266df7d248f73e987d026 Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Thu, 21 Sep 2023 07:31:54 +0000 Subject: [PATCH 1267/2116] fix lint --- fdroidserver/lint.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 9e009160..951c74fd 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -141,7 +141,9 @@ http_checks = ( re.compile( r'^https://[^/]*(github|gitlab|bitbucket|rawgit|githubusercontent)\.[a-zA-Z]+/([^/]+/){2,3}(master|main)/' ), - _("Use /HEAD instead of /master or /main to point at a file in the default branch"), + _( + "Use /HEAD instead of /master or /main to point at a file in the default branch" + ), ), ] ) From 521ff4fe1789472024ac11bdd308b7134311489e Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sun, 10 Sep 2023 10:05:15 +0200 Subject: [PATCH 1268/2116] Add default locale for generated categories The client expects at least a name to be set. Regression of 2c566cf6. --- fdroidserver/index.py | 2 +- tests/repo/entry.json | 2 +- tests/repo/index-v2.json | 18 +++++++++++++++--- tests/update.TestCase | 6 +++--- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index bef83ff6..2f5bd50f 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -746,7 +746,7 @@ def make_v2(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ # include definitions for "auto-defined" categories, e.g. just used in app metadata for category in sorted(categories_used_by_apps): if category not in output['repo'][CATEGORIES_CONFIG_NAME]: - output['repo'][CATEGORIES_CONFIG_NAME][category] = dict() + output['repo'][CATEGORIES_CONFIG_NAME][category] = {"name": {DEFAULT_LOCALE: category}} # do not include defined categories if no apps use them for category in list(output['repo'].get(CATEGORIES_CONFIG_NAME, list())): if category not in categories_used_by_apps: diff --git a/tests/repo/entry.json b/tests/repo/entry.json index 56249552..ae645055 100644 --- a/tests/repo/entry.json +++ b/tests/repo/entry.json @@ -3,7 +3,7 @@ "version": 20002, "index": { "name": "/index-v2.json", - "sha256": "5e3c0eaafd99d3518da2bb2bc7565b2ebcb17775a2f4ccc33b7336901ec71a6f", + "sha256": "72146bc3bbbfd49c4e23435ca8ba13d58673a83fa4634f7ce2ea465616860293", "size": 53283, "numPackages": 10 }, diff --git a/tests/repo/index-v2.json b/tests/repo/index-v2.json index d41b95b5..3bc7fcaa 100644 --- a/tests/repo/index-v2.json +++ b/tests/repo/index-v2.json @@ -534,9 +534,21 @@ "en-US": "System" } }, - "1": {}, - "2.0": {}, - "tests": {} + "1": { + "name": { + "en-US": "1" + } + }, + "2.0": { + "name": { + "en-US": "2.0" + } + }, + "tests": { + "name": { + "en-US": "tests" + } + } }, "requests": { "install": [ diff --git a/tests/update.TestCase b/tests/update.TestCase index ac9a6f5e..7b9d6720 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1842,7 +1842,7 @@ class UpdateTest(unittest.TestCase): with open('repo/index-v2.json') as fp: index = json.load(fp) self.assertEqual( - {'Time': dict()}, + {'Time': {'name': {'en-US': 'Time'}}}, index['repo'][CATEGORIES_CONFIG_NAME], ) @@ -1867,7 +1867,7 @@ class UpdateTest(unittest.TestCase): with open('repo/index-v2.json') as fp: index = json.load(fp) self.assertEqual( - {'bar': dict(), 'foo': dict()}, + {'bar': {'name': {'en-US': 'bar'}}, 'foo': {'name': {'en-US': 'foo'}}}, index['repo'][CATEGORIES_CONFIG_NAME], ) @@ -1894,7 +1894,7 @@ class UpdateTest(unittest.TestCase): with open('repo/index-v2.json') as fp: index = json.load(fp) self.assertEqual( - {'System': {'name': {'en-US': 'System Apps'}}, 'Time': dict()}, + {'System': {'name': {'en-US': 'System Apps'}}, 'Time': {'name': {'en-US': 'Time'}}}, index['repo'][CATEGORIES_CONFIG_NAME], ) From 35fedfb37f7e38570a090705d4dfe77c58e3e5ed Mon Sep 17 00:00:00 2001 From: Mehrab Poladov Date: Sat, 29 Jul 2023 03:12:05 +0200 Subject: [PATCH 1269/2116] Translated using Weblate: Azerbaijani (az) by Mehrab Poladov Currently translated at 0.1% (1 of 552 strings) Added translation using Weblate: Azerbaijani (az) by Mehrab Poladov Co-authored-by: Mehrab Poladov Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/az/ Translation: F-Droid/F-Droid Server --- locale/az/LC_MESSAGES/fdroidserver.po | 2641 +++++++++++++++++++++++++ 1 file changed, 2641 insertions(+) create mode 100644 locale/az/LC_MESSAGES/fdroidserver.po diff --git a/locale/az/LC_MESSAGES/fdroidserver.po b/locale/az/LC_MESSAGES/fdroidserver.po new file mode 100644 index 00000000..7a0cc9ed --- /dev/null +++ b/locale/az/LC_MESSAGES/fdroidserver.po @@ -0,0 +1,2641 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# Mehrab Poladov , 2023. +msgid "" +msgstr "" +"Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" +"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"PO-Revision-Date: 2023-05-26 19:39+0000\n" +"Last-Translator: Mehrab Poladov \n" +"Language-Team: Azerbaijani \n" +"Language: az\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.18-dev\n" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH public key to be used as deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "" +"\n" +"{path} encoded for the DEBUG_KEYSTORE secret variable:" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "\"%s/\" has no matching metadata file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "\"{apkfilename}\" is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains outdated {name} ({version})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains recent {name} ({version})" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "\"{path}\" exists but s3cmd is not installed!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "\"{url}\" is not a valid URL!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "%(option)s option requires %(number)d argument" +msgid_plural "%(option)s option requires %(number)d arguments" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "%(prog)s: error: %(message)s\n" +msgstr "%(prog)s: xəta: %(message)s\n" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "%d problems found" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "%prog [options]" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "%r is not callable" +msgstr "" + +#: ../fdroidserver/signindex.py +#, python-format +msgid "%s did not produce a dict!" +msgstr "" + +#: ../fdroidserver/signindex.py +#, python-format +msgid "%s has bad SHA-256: %s" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "%s is not an accepted build field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "%s option does not take a value" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' is NONE and 'smartcardoptions' is blank!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "'required' is an invalid argument for positionals" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{path}' failed to execute!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format +msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "...checkupdate failed for {appid} : {error}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid ".__call__() not defined" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "/issues is missing" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "A URL is required as an argument!" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Add PGP signatures using GnuPG for packages in repo" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add a repo signing key to an unsigned repo" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add skeleton metadata files for APKs that are missing them" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Adding new repo for only {name}" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Alias of the repo signing key in the keystore" +msgstr "" + +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Also mirror the full archive section" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Also warn about formatting issues, like rewritemeta -l" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android AAR library" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android APK file" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android DEX code" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' is not a directory!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "App is in '{repo}' but has a link to {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Appending .git is not necessary" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Archiving {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in srclib '{srclib}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Broken symlink: {path}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Build a package from source" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build all applications available" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Build generated by `fdroid import` - remove disable line once ready" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Build metadata git repo has uncommited changes!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build only the latest version of each package" +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "Built repo based in \"%s\" with this config:" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Can't build due to {} error while scanning" +msgid_plural "Can't build due to {} errors while scanning" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Cannot rewrite \"{path}\"" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Categories '%s' is not valid" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Categories are not set" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Check for updates to applications" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Clean update - don't uses caches, reprocess all APKs" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Comma separated list of categories." +msgstr "" + +#: ../fdroidserver/__main__.py +#, python-format +msgid "Command '%s' not recognised.\n" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Commit changes" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not find '{command}' on your system" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Could not find latest version code" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Could not find latest version name" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not find {path} to remove it" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not parse size \"{size}\", wrong type \"{type}\"" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Couldn't find Application ID" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find package ID" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Cowardily refusing to overwrite existing signing key setup!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Created new container \"{name}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Creating \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating log directory" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Creating new S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating output directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating signed index with this key (SHA256):" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/verify.py +msgid "Creating temporary directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating unsigned index in preparation for signing" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "DEBUG_KEYSTORE is not set or the value is incomplete" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Delete APKs and/or OBBs without metadata from the repo" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting archive, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Deleting unknown file: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description '%s' is just the app's summary" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Description has a duplicate line" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Description of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Do not add 'disable:' to the generated build entries" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not deploy the new files to the repo" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Do not include \"{path}\" in URL!" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Do not prompt for Android SDK path, just fail" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not remove the private keys generated from the keystore" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't create a source tarball, useful when testing a build" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/nightly.py +msgid "Don't use rsync checksums" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Download complete mirrors of small repos" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Downloading the repository already failed once, not trying again." +msgstr "" + +#: ../fdroidserver/verify.py +#, python-brace-format +msgid "Downloading {url} failed. {error}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Duplicate link in '{field}': {url}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "" +"ERROR: this command should never be used to mirror f-droid.org!\n" +"A full mirror of f-droid.org requires more than 200GB." +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "ERROR: unsupported CI type, patches welcome!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "" + +#: ../fdroidserver/__main__.py +#, python-brace-format +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"Enter the path to the Android SDK (%s) here:\n" +"> " +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Error while getting repo address" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Extract signatures from APKs" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed copying {path}: {error}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Failed fetching signatures for '{apkfilename}': {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed reading {path}: {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed resizing {path}: {error}" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Failed to create S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get APK information, deleting {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get APK information, skipping {path}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Failed to install '{apkfilename}' on {dev}: {error}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to sign application" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Fetched buildserverid from VM: {buildserverid}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "File disappeared while processing it: {path}" +msgstr "" + +#: ../fdroidserver/build.py ../fdroidserver/install.py +#: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py +#: ../fdroidserver/update.py +msgid "Finished" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Forbidden HTML tags" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Force halting build after {0} sec timeout!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Force scan of disabled apps and builds." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found bad funding file \"{path}\" for \"{name}\":" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Found invalid appids in arguments" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +msgid "Found invalid versionCodes for some apps" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Found multiple JAR Signature Block Files in {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Found multiple metadata files for {appid}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found multiple signing certificates for repository." +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found no signing certificates for repository." +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Found non-file at %s" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Found {apkfilename} at {url}" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Found {count} problems in {filename}" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Found {count} warnings in {filename}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Generated skeleton metadata for {appid}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git checkout of '%s' failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git clean failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git fetch failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git remote set-head failed: \"%s\"" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git reset failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule sync failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule update failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "HTTPS must be used with Subversion URLs!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "If a git mirror gets to big, allow the archive to be deleted" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "If this upload fails, try manually uploading to {url}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." +msgstr "" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring FUNDING.yml entry longer than 2048: %s" +msgstr "" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Ignoring package without metadata: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Ignoring stale cache data for {apkfilename}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Include APKs that are signed with disabled algorithms like MD5" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the PGP signature .asc files in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the build logs in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the source tarballs in the mirror" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Initialising submodules" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Install all signed applications available" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Install built packages on devices" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}..." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Interact with the repo HTTP server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Invalid APK" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid VercodeOperation: {field}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Invalid VercodeOperation: {invalid_ops}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid application ID {appid}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid boolean '%s'" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid bulleted list" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Invalid name for published file: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid redirect to non-HTTPS: {before} -> {after} " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid scrlib metadata: '{file}' does not exist" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: could not parse '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature failed to verify: {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature verified: {path}" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java JAR file" +msgstr "" + +#: ../fdroidserver/mirror.py ../fdroidserver/publish.py +#: ../fdroidserver/update.py +msgid "Java JDK not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java compiled class" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Javascript in HTML src attributes" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Keystore for signing key:\t" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the Liberapay: field" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Locale included in f-droid.org URL" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Make the build stop on exceptions" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Malformed repository mirrors." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Malformed serverwebroot line:" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Mirror the full repo and archive, all file types." +msgstr "" + +#: ../fdroidserver/gpgsign.py +msgid "Missing output directory" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No Android SDK found!" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No attached devices found" +msgstr "" + +#: ../fdroidserver/index.py +msgid "No fingerprint in URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No git submodules available" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "No gradle project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "No information found." +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is Free Software" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is for Android" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No packages specified" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "No signed APK available for %s" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No signed output directory - nothing to do" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No signing certificates found in {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "No such package: %s" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No such versionCode {versionCode} for app {appid}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/verify.py +msgid "No unsigned directory - nothing to do" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Not a valid size definition: \"{}\"" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Nothing to do" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Nothing to do for {appid}." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "OBB file has newer versionCode({integer}) than any APK:" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB filename must start with \"main.\" or \"patch.\":" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB's packagename does not match a supported APK:" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Only PNG and JPEG are supported for graphics, found: {path}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only print differences with the Play Store" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only process apps with auto-updates" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "OpenCollective donation methods belong in the OpenCollective: field" +msgstr "" + +#: /usr/lib/python3.11/optparse.py +msgid "Options" +msgstr "" + +#: ../fdroidserver/verify.py +msgid "Output JSON report to file named after APK." +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Output JSON to stdout." +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py +#: ../fdroidserver/publish.py ../fdroidserver/signindex.py +#: ../fdroidserver/update.py +msgid "Outputting JSON" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Overall license of the project." +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "Package \"{appid}\" already exists" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Parsing manifest at '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Password required with username" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Path to main Android project subdirectory, if not in root." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Path to the git repo to use as the log" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the keystore for the repo signing key" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Print the secret variable to the terminal for easy copy/paste" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Problem with xml at '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Process auto-updates" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#, python-brace-format +msgid "Processing {apkfilename}" +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#, python-brace-format +msgid "Processing {appid}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable XML/JSON for index files" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Project URL to import from." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Punctuation should be avoided" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Push the log to this git remote repository" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Pushing binary transparency log to {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Pushing to {url}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Quickly start a new repository" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Read all the metadata files and exit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading '{config_file}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Reading {apkfilename} from cache" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Removing specified files" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Rename APK files that do not match package.name_123.apk" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Resigning {apkfilename} with provided debug.keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Resize all the icons exceeding the max pixel size and exit" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Restrict output to warnings and errors" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Rewrite all the metadata files" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Run on git repo that has uncommitted changes" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Run rewritemeta to fix formatting" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Running first pass with MD5 checking disabled" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Running wget in {path}" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "SHA-256 of {url} does not match entry!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scan the resulting APK(s) for known non-free classes." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Scan the source code of a package" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {apk}" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:{versionCode}:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scanner found {} problem" +msgid_plural "Scanner found {} problems" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Set clock to that time using:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Set maximum releases in repo before older ones are archived" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Set open file limit to {integer}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Set up an app build for a nightly build repo" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setting open file limit failed: " +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Setting {0} sec timeout for this build" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Sign and place packages in the repo" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Sign indexes created using update --nosign" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Skip scanning the source code for binaries and other problems" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping '{apkfilename}' with invalid signature!" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping index generation for {appid}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: disabled" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Specify a local folder to sync the repo to" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Specify an identity file to provide to SSH for rsyncing" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Specify which debug keystore file to use." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Spew out even more information than normal" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Stripping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Summary '%s' is just the app's name" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Summary of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "System clock is older than date in {path}!" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "The OBB version code must come after \"{name}.\":" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "The base URL for the repo to log (default: https://f-droid.org)" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "The directory to write the mirror to" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "The file to be included in the repo (path or glob)" +msgstr "" + +#: ../fdroidserver/index.py +msgid "The repository's fingerprint does not match." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "The root dir for local_copy_dir \"{path}\" does not exist!" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "There is a keyalias collision - publishing halted" +msgstr "" + +#: ../fdroidserver/common.py +msgid "These are the apps that have been archived from the main repo." +msgstr "" + +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-format +msgid "This repo already has local metadata: %s" +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL must start with https:// or http://" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL shorteners should not be used" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "URL {url} in Description: {error}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Unknown exception found!" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Unknown file '{filename}' in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Unknown metadata format: %s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path} (use: *.yml)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Unknown version of aapt, might cause problems: " +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary leading space" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary trailing space" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised app field '{fieldname}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised build flag '{build_flag}' in '{path}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported file type \"{extension}\" for repo graphic" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported graphics file found: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused extlib at %s" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused file at %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scandelete path: %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scanignore path: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Update repo information for new packages" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Update the binary transparency log for a URL" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "UpdateCheckData has invalid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must use HTTPS URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData not a valid URL: {url}" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID, it can be removed" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to androidobservatory.org" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to virustotal" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "Usage" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "Usage: %s\n" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master to point at a file in the default branch" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use `fdroid update -c` to create it." +msgstr "" + +#: ../fdroidserver/build.py +msgid "Use build server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v2" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v3" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Using androguard from \"{path}\"" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Using existing keystore \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using s3cmd to sync with: {url}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Valid commands are:" +msgstr "" + +#: ../fdroidserver/verify.py +msgid "Verify against locally cached copy rather than redownloading." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Verify the integrity of downloaded packages" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Verifying index signature:" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Warn about possible metadata errors" +msgstr "" + +#: ../fdroidserver/update.py +msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgstr "" + +#: ../fdroidserver/init.py +msgid "X.509 'Distinguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/common.py +msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "ZIP file archive" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "adding IdentityFile to {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "adding to {name}: {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "ambiguous option: %s (%s?)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + +#: ../fdroidserver/common.py +msgid "apksigner not found, it's required for signing!" +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py +#: ../fdroidserver/rewritemeta.py +msgid "application ID of file to operate on" +msgstr "" + +#: ../fdroidserver/build.py ../fdroidserver/install.py +#: ../fdroidserver/publish.py ../fdroidserver/scanner.py +#: ../fdroidserver/verify.py +msgid "application ID with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "argument \"-\" with mode %r" +msgstr "" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "argument %(argument_name)s: %(message)s" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare SSH connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "can not parse scrlib spec (not a string): '{}'" +msgstr "" + +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "can't open non-https url: '{};" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "cannot find required srclibs: \"{path}\"" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "cannot have multiple subparser arguments" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "cannot merge actions - two groups are named %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "cannot publish update, did you set the deploy key?" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "cloning {url}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "commands from plugin modules:" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "complex" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting option string: %s" +msgid_plural "conflicting option strings: %s" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting subparser alias: %s" +msgstr "" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting subparser: %s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "could not parse '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no ref specified): '{}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (too many '@' signs): '{}'" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "created {path}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "deleting: repo/{apkfilename}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed process log {path} to {dest}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "dest= is required for options like %r" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "downloading '{}'" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "downloading scanner signatures from '{}' failed" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "executable binary, possibly code" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "expected %s argument" +msgid_plural "expected %s arguments" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "expected at least one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "expected at most one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "expected one argument" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "fdroid [] [-h|--help|--version|]" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "fetch the latest version of signatures from the web" +msgstr "" + +#: /usr/lib/python3.11/optparse.py +msgid "floating-point" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force metadata errors (default) to be warnings, or to be ignored." +msgstr "" + +#: ../fdroidserver/common.py +msgid "git svn clone failed" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "gzip file archive" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "ignored explicit argument %r" +msgstr "" + +#: ../fdroidserver/index.py +msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + +#: ../fdroidserver/index.py +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "integer" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid %(type)s value: %(value)r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid choice: %(value)r (choose from %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid conflict_resolution value: %r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgstr "" + +#: ../fdroidserver/common.py +msgid "ipfs_cid not found, skipping CIDv1 generation" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be an absolute path!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be directory, not a file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "mirror '%s' does not end with 'fdroid'!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "mutually exclusive arguments must be optional" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "next {name} cache update due in {time}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "no \"icon\" in {appid}" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "no APK supplied" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "no such option: %s" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "no version info found!" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "not allowed with argument %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "one of the arguments %s is required" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/index.py +msgid "only accepts strings, lists, and tuples" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "option %s: If you really want to install all the signed apps, use --all" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "option %s: invalid %s value: %r" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "option %s: invalid choice: %r (choose from %s)" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option -%s not recognized" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option -%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s must not have an argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s not a unique prefix" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s not recognized" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +msgid "optional arguments" +msgstr "" + +#: /usr/lib/python3.11/argparse.py +msgid "options" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "overwriting existing {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "positional arguments" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "process log deploy {path} to {dest} failed!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "ruamel.yaml not installed, can not write metadata." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd sync indexes {path} to {url} and delete" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "scanner cache is malformed! You can clear it with: '{clear}'" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "shared library" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "show program's version number and exit" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py +#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +msgid "show this help message and exit" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "signed APK, either a file-path or HTTPS URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: log content is empty" +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: not enabled in config" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "skipping source tarball: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "srclibs missing name and/or @" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "static library" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "the following arguments are required: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unexpected option string: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unrecognized arguments: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "unsafe permissions on '{config_file}' (should be 0600)!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid +#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +msgid "usage: " +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "using Apache libcloud to sync with {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "virustotal.com is rate limiting, waiting to retry..." +msgstr "" + +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "{0} app, {1} key aliases" +msgid_plural "{0} apps, {1} key aliases" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} ({appid}) has no metadata!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using application ID instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android application ID!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Java Package Name!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{appid} is missing {name}" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: Unknown extlib {path} in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "{appid}: no builds specified, running on current source state" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be an integer, found: {value}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{file} is blank or corrupt!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "{path} already exists, ignoring import results!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "{path} does not exist! Create it by running:" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} is zero size!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} more than 200MB, manually upload: {url}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{url} does not end with \"fdroid\", check the URL path!" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "{url} does not start with \"http\"!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "{} build failed" +msgid_plural "{} builds failed" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/build.py +msgid "{} build succeeded" +msgid_plural "{} builds succeeded" +msgstr[0] "" +msgstr[1] "" From 6a137f5e6a77459b03a74d3962c076cb1799cdf4 Mon Sep 17 00:00:00 2001 From: Eric Date: Sat, 29 Jul 2023 03:12:05 +0200 Subject: [PATCH 1270/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Eric Currently translated at 75.7% (418 of 552 strings) Co-authored-by: Eric Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 931ff0a3..3cde8dc5 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -31,15 +31,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-03-09 02:44+0000\n" -"Last-Translator: Max Xie \n" +"PO-Revision-Date: 2023-05-26 19:39+0000\n" +"Last-Translator: Eric \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.16.2-dev\n" +"X-Generator: Weblate 4.18-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -214,9 +214,9 @@ msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' 不是 {appid} 之有效 {field}. 正则表达式: {pattern}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "'{value}' 不是 {appid} 之有效 {field}. 正则表达式: {pattern}" +msgstr "'{value}' 不是有效 {field},应为 {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format From 65f4f489a850276dc759204b7a89e12554a4fa97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D0=B0=D1=80=20=D0=A0=D0=B0=D0=B7=D0=B8?= =?UTF-8?q?=D0=BD?= Date: Sat, 29 Jul 2023 03:12:06 +0200 Subject: [PATCH 1271/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Belar?= =?UTF-8?q?usian=20(be)=20by=20=D0=9C=D0=B0=D0=BA=D0=B0=D1=80=20=D0=A0?= =?UTF-8?q?=D0=B0=D0=B7=D0=B8=D0=BD=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 7.6% (42 of 552 strings) Added translation using Weblate: Belarusian (be) by Макар Разин Translated using Weblate: Russian (ru) by Макар Разин Currently translated at 100.0% (552 of 552 strings) Translated using Weblate: Ukrainian (uk) by Макар Разин Currently translated at 99.8% (551 of 552 strings) Co-authored-by: Макар Разин Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/be/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/be/LC_MESSAGES/fdroidserver.po | 2641 +++++++++++++++++++++++++ locale/ru/LC_MESSAGES/fdroidserver.po | 45 +- locale/uk/LC_MESSAGES/fdroidserver.po | 41 +- 3 files changed, 2685 insertions(+), 42 deletions(-) create mode 100644 locale/be/LC_MESSAGES/fdroidserver.po diff --git a/locale/be/LC_MESSAGES/fdroidserver.po b/locale/be/LC_MESSAGES/fdroidserver.po new file mode 100644 index 00000000..41845221 --- /dev/null +++ b/locale/be/LC_MESSAGES/fdroidserver.po @@ -0,0 +1,2641 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# Макар Разин , 2023. +msgid "" +msgstr "" +"Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" +"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"PO-Revision-Date: 2023-06-09 18:48+0000\n" +"Last-Translator: Макар Разин \n" +"Language-Team: Belarusian \n" +"Language: be\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.18-dev\n" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH public key to be used as deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "" +"\n" +"{path} encoded for the DEBUG_KEYSTORE secret variable:" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "\"%s/\" has no matching metadata file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "\"{apkfilename}\" is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains outdated {name} ({version})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains recent {name} ({version})" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "\"{path}\" exists but s3cmd is not installed!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "\"{url}\" is not a valid URL!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "%(option)s option requires %(number)d argument" +msgid_plural "%(option)s option requires %(number)d arguments" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "%(prog)s: error: %(message)s\n" +msgstr "%(prog)s: памылка: %(message)s\n" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "%d problems found" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "%prog [options]" +msgstr "%prog [параметры]" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "%r is not callable" +msgstr "%r нельга выклікаць" + +#: ../fdroidserver/signindex.py +#, python-format +msgid "%s did not produce a dict!" +msgstr "" + +#: ../fdroidserver/signindex.py +#, python-format +msgid "%s has bad SHA-256: %s" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "%s is not an accepted build field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "%s option does not take a value" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' is NONE and 'smartcardoptions' is blank!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "'required' is an invalid argument for positionals" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{path}' failed to execute!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format +msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "...checkupdate failed for {appid} : {error}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid ".__call__() not defined" +msgstr ".__call__() не вызначана" + +#: ../fdroidserver/lint.py +msgid "/issues is missing" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "A URL is required as an argument!" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Add PGP signatures using GnuPG for packages in repo" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add a repo signing key to an unsigned repo" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add skeleton metadata files for APKs that are missing them" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Adding new repo for only {name}" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Alias of the repo signing key in the keystore" +msgstr "" + +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Also mirror the full archive section" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Also warn about formatting issues, like rewritemeta -l" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android AAR library" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android APK file" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android DEX code" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' is not a directory!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "App is in '{repo}' but has a link to {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Appending .git is not necessary" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Archiving {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in srclib '{srclib}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Broken symlink: {path}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Build a package from source" +msgstr "Сабраць пакет з зыходнага кода" + +#: ../fdroidserver/build.py +msgid "Build all applications available" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Build generated by `fdroid import` - remove disable line once ready" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Build metadata git repo has uncommited changes!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build only the latest version of each package" +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "Built repo based in \"%s\" with this config:" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Can't build due to {} error while scanning" +msgid_plural "Can't build due to {} errors while scanning" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Cannot rewrite \"{path}\"" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Categories '%s' is not valid" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Categories are not set" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Check for updates to applications" +msgstr "Праверце наяўнасць абнаўленняў праграм" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Clean update - don't uses caches, reprocess all APKs" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Comma separated list of categories." +msgstr "" + +#: ../fdroidserver/__main__.py +#, python-format +msgid "Command '%s' not recognised.\n" +msgstr "Каманда '%s' не распазнана.\n" + +#: ../fdroidserver/checkupdates.py +msgid "Commit changes" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not find '{command}' on your system" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Could not find latest version code" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Could not find latest version name" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not find {path} to remove it" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not parse size \"{size}\", wrong type \"{type}\"" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Couldn't find Application ID" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find package ID" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Cowardily refusing to overwrite existing signing key setup!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Created new container \"{name}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Creating \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating log directory" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Creating new S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating output directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating signed index with this key (SHA256):" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/verify.py +msgid "Creating temporary directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating unsigned index in preparation for signing" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "DEBUG_KEYSTORE is not set or the value is incomplete" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Delete APKs and/or OBBs without metadata from the repo" +msgstr "Выдаліце APK і/або OBB без метададзеных з рэпазітара" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting archive, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Deleting unknown file: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description '%s' is just the app's summary" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Description has a duplicate line" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Description of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Do not add 'disable:' to the generated build entries" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not deploy the new files to the repo" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Do not include \"{path}\" in URL!" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Do not prompt for Android SDK path, just fail" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not remove the private keys generated from the keystore" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't create a source tarball, useful when testing a build" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/nightly.py +msgid "Don't use rsync checksums" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Download complete mirrors of small repos" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Downloading the repository already failed once, not trying again." +msgstr "" + +#: ../fdroidserver/verify.py +#, python-brace-format +msgid "Downloading {url} failed. {error}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Duplicate link in '{field}': {url}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "" +"ERROR: this command should never be used to mirror f-droid.org!\n" +"A full mirror of f-droid.org requires more than 200GB." +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "ERROR: unsupported CI type, patches welcome!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "" + +#: ../fdroidserver/__main__.py +#, python-brace-format +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"Enter the path to the Android SDK (%s) here:\n" +"> " +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Error while getting repo address" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Extract signatures from APKs" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed copying {path}: {error}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Failed fetching signatures for '{apkfilename}': {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed reading {path}: {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed resizing {path}: {error}" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Failed to create S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get APK information, deleting {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get APK information, skipping {path}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Failed to install '{apkfilename}' on {dev}: {error}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to sign application" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Fetched buildserverid from VM: {buildserverid}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "File disappeared while processing it: {path}" +msgstr "" + +#: ../fdroidserver/build.py ../fdroidserver/install.py +#: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py +#: ../fdroidserver/update.py +msgid "Finished" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Forbidden HTML tags" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Force halting build after {0} sec timeout!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Force scan of disabled apps and builds." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found bad funding file \"{path}\" for \"{name}\":" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Found invalid appids in arguments" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +msgid "Found invalid versionCodes for some apps" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Found multiple JAR Signature Block Files in {path}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Found multiple metadata files for {appid}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found multiple signing certificates for repository." +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found no signing certificates for repository." +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Found non-file at %s" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Found {apkfilename} at {url}" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Found {count} problems in {filename}" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Found {count} warnings in {filename}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Generated skeleton metadata for {appid}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git checkout of '%s' failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git clean failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git fetch failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git remote set-head failed: \"%s\"" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git reset failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule sync failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule update failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "HTTPS must be used with Subversion URLs!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "If a git mirror gets to big, allow the archive to be deleted" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "If this upload fails, try manually uploading to {url}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." +msgstr "" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring FUNDING.yml entry longer than 2048: %s" +msgstr "" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Ignoring package without metadata: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Ignoring stale cache data for {apkfilename}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Include APKs that are signed with disabled algorithms like MD5" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the PGP signature .asc files in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the build logs in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the source tarballs in the mirror" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Initialising submodules" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Install all signed applications available" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Install built packages on devices" +msgstr "Усталюйце ўбудаваныя пакеты на прылады" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}..." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Interact with the repo HTTP server" +msgstr "Узаемадзейнічайце з HTTP-серверам рэпазітара" + +#: ../fdroidserver/update.py +msgid "Invalid APK" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid VercodeOperation: {field}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Invalid VercodeOperation: {invalid_ops}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid application ID {appid}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid boolean '%s'" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid bulleted list" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Invalid name for published file: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid redirect to non-HTTPS: {before} -> {after} " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid scrlib metadata: '{file}' does not exist" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: could not parse '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature failed to verify: {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature verified: {path}" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java JAR file" +msgstr "" + +#: ../fdroidserver/mirror.py ../fdroidserver/publish.py +#: ../fdroidserver/update.py +msgid "Java JDK not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java compiled class" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Javascript in HTML src attributes" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Keystore for signing key:\t" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the Liberapay: field" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Locale included in f-droid.org URL" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Make the build stop on exceptions" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Malformed repository mirrors." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Malformed serverwebroot line:" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Mirror the full repo and archive, all file types." +msgstr "" + +#: ../fdroidserver/gpgsign.py +msgid "Missing output directory" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No Android SDK found!" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No attached devices found" +msgstr "" + +#: ../fdroidserver/index.py +msgid "No fingerprint in URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No git submodules available" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "No gradle project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "No information found." +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is Free Software" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is for Android" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No packages specified" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "No signed APK available for %s" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No signed output directory - nothing to do" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No signing certificates found in {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "No such package: %s" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No such versionCode {versionCode} for app {appid}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/verify.py +msgid "No unsigned directory - nothing to do" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Not a valid size definition: \"{}\"" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Nothing to do" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Nothing to do for {appid}." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "OBB file has newer versionCode({integer}) than any APK:" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB filename must start with \"main.\" or \"patch.\":" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB's packagename does not match a supported APK:" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Only PNG and JPEG are supported for graphics, found: {path}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only print differences with the Play Store" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only process apps with auto-updates" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "OpenCollective donation methods belong in the OpenCollective: field" +msgstr "" + +#: /usr/lib/python3.11/optparse.py +msgid "Options" +msgstr "Параметры" + +#: ../fdroidserver/verify.py +msgid "Output JSON report to file named after APK." +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Output JSON to stdout." +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py +#: ../fdroidserver/publish.py ../fdroidserver/signindex.py +#: ../fdroidserver/update.py +msgid "Outputting JSON" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Overall license of the project." +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "Package \"{appid}\" already exists" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Parsing manifest at '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Password required with username" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Path to main Android project subdirectory, if not in root." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Path to the git repo to use as the log" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the keystore for the repo signing key" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Print the secret variable to the terminal for easy copy/paste" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Problem with xml at '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Process auto-updates" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#, python-brace-format +msgid "Processing {apkfilename}" +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#, python-brace-format +msgid "Processing {appid}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable XML/JSON for index files" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Project URL to import from." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Punctuation should be avoided" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Push the log to this git remote repository" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Pushing binary transparency log to {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Pushing to {url}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Quickly start a new repository" +msgstr "Хутка запусціце новы рэпазітар" + +#: ../fdroidserver/__main__.py +msgid "Read all the metadata files and exit" +msgstr "Прачытайце ўсе файлы метададзеных і выйдзіце" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading '{config_file}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Reading {apkfilename} from cache" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Removing specified files" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Rename APK files that do not match package.name_123.apk" +msgstr "Перайменуйце файлы APK, якія не адпавядаюць package.name_123.apk" + +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Resigning {apkfilename} with provided debug.keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Resize all the icons exceeding the max pixel size and exit" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Restrict output to warnings and errors" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Rewrite all the metadata files" +msgstr "Перапішыце ўсе файлы метададзеных" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Run on git repo that has uncommitted changes" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Run rewritemeta to fix formatting" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Running first pass with MD5 checking disabled" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Running wget in {path}" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "SHA-256 of {url} does not match entry!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scan the resulting APK(s) for known non-free classes." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Scan the source code of a package" +msgstr "Сканіруйце зыходны код пакета" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {apk}" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:{versionCode}:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scanner found {} problem" +msgid_plural "Scanner found {} problems" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Set clock to that time using:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Set maximum releases in repo before older ones are archived" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Set open file limit to {integer}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Set up an app build for a nightly build repo" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setting open file limit failed: " +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Setting {0} sec timeout for this build" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Sign and place packages in the repo" +msgstr "Падпішыце і зафіксуйце пакеты ў рэпазітары" + +#: ../fdroidserver/__main__.py +msgid "Sign indexes created using update --nosign" +msgstr "Падпісвайце індэксы, створаныя з дапамогай update --nosign" + +#: ../fdroidserver/build.py +msgid "Skip scanning the source code for binaries and other problems" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping '{apkfilename}' with invalid signature!" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping index generation for {appid}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: disabled" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Specify a local folder to sync the repo to" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Specify an identity file to provide to SSH for rsyncing" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Specify which debug keystore file to use." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Spew out even more information than normal" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Stripping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Summary '%s' is just the app's name" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Summary of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "System clock is older than date in {path}!" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "The OBB version code must come after \"{name}.\":" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "The base URL for the repo to log (default: https://f-droid.org)" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "The directory to write the mirror to" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "The file to be included in the repo (path or glob)" +msgstr "" + +#: ../fdroidserver/index.py +msgid "The repository's fingerprint does not match." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "The root dir for local_copy_dir \"{path}\" does not exist!" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "There is a keyalias collision - publishing halted" +msgstr "" + +#: ../fdroidserver/common.py +msgid "These are the apps that have been archived from the main repo." +msgstr "" + +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-format +msgid "This repo already has local metadata: %s" +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL must start with https:// or http://" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL shorteners should not be used" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "URL {url} in Description: {error}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Unknown exception found!" +msgstr "Знойдзена невядомае выключэнне!" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Unknown file '{filename}' in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Unknown metadata format: %s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path} (use: *.yml)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Unknown version of aapt, might cause problems: " +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary leading space" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary trailing space" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised app field '{fieldname}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised build flag '{build_flag}' in '{path}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported file type \"{extension}\" for repo graphic" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported graphics file found: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused extlib at %s" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused file at %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scandelete path: %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scanignore path: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Update repo information for new packages" +msgstr "Абнаўленне інфармацыі рэпазітара для новых пакетаў" + +#: ../fdroidserver/__main__.py +msgid "Update the binary transparency log for a URL" +msgstr "Абнавіць бінарны журнал празрыстасці для URL" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "UpdateCheckData has invalid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must use HTTPS URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData not a valid URL: {url}" +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID, it can be removed" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to androidobservatory.org" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to virustotal" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "Usage" +msgstr "Выкарыстанне" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "Usage: %s\n" +msgstr "Выкарыстанне: %s\n" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master to point at a file in the default branch" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use `fdroid update -c` to create it." +msgstr "" + +#: ../fdroidserver/build.py +msgid "Use build server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v2" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v3" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Using androguard from \"{path}\"" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Using existing keystore \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using s3cmd to sync with: {url}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Valid commands are:" +msgstr "Дапушчальныя каманды:" + +#: ../fdroidserver/verify.py +msgid "Verify against locally cached copy rather than redownloading." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Verify the integrity of downloaded packages" +msgstr "Праверце цэласнасць спампаваных пакетаў" + +#: ../fdroidserver/index.py +msgid "Verifying index signature:" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Warn about possible metadata errors" +msgstr "Папярэджваць аб магчымых памылках метададзеных" + +#: ../fdroidserver/update.py +msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgstr "" + +#: ../fdroidserver/init.py +msgid "X.509 'Distinguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/common.py +msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "ZIP file archive" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "adding IdentityFile to {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "adding to {name}: {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "неадназначны варыянт: %(option)s можа адпавядаць %(matches)s" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "ambiguous option: %s (%s?)" +msgstr "неадназначны варыянт: %s (%s?)" + +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + +#: ../fdroidserver/common.py +msgid "apksigner not found, it's required for signing!" +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py +#: ../fdroidserver/rewritemeta.py +msgid "application ID of file to operate on" +msgstr "" + +#: ../fdroidserver/build.py ../fdroidserver/install.py +#: ../fdroidserver/publish.py ../fdroidserver/scanner.py +#: ../fdroidserver/verify.py +msgid "application ID with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "argument \"-\" with mode %r" +msgstr "" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "argument %(argument_name)s: %(message)s" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare SSH connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "can not parse scrlib spec (not a string): '{}'" +msgstr "" + +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "can't open non-https url: '{};" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "cannot find required srclibs: \"{path}\"" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "cannot have multiple subparser arguments" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "cannot merge actions - two groups are named %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "cannot publish update, did you set the deploy key?" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "cloning {url}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "commands from plugin modules:" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "complex" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting option string: %s" +msgid_plural "conflicting option strings: %s" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting subparser alias: %s" +msgstr "" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting subparser: %s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "could not parse '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no ref specified): '{}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (too many '@' signs): '{}'" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "created {path}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "deleting: repo/{apkfilename}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed process log {path} to {dest}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "dest= is required for options like %r" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "downloading '{}'" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "downloading scanner signatures from '{}' failed" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "executable binary, possibly code" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "expected %s argument" +msgid_plural "expected %s arguments" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "expected at least one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "expected at most one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "expected one argument" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "fdroid [] [-h|--help|--version|]" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "fetch the latest version of signatures from the web" +msgstr "" + +#: /usr/lib/python3.11/optparse.py +msgid "floating-point" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force metadata errors (default) to be warnings, or to be ignored." +msgstr "" + +#: ../fdroidserver/common.py +msgid "git svn clone failed" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "gzip file archive" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "ignored explicit argument %r" +msgstr "" + +#: ../fdroidserver/index.py +msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + +#: ../fdroidserver/index.py +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "integer" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid %(type)s value: %(value)r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid choice: %(value)r (choose from %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid conflict_resolution value: %r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgstr "" + +#: ../fdroidserver/common.py +msgid "ipfs_cid not found, skipping CIDv1 generation" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be an absolute path!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be directory, not a file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "mirror '%s' does not end with 'fdroid'!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "mutually exclusive arguments must be optional" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "next {name} cache update due in {time}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "no \"icon\" in {appid}" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "no APK supplied" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "no such option: %s" +msgstr "такой опцыі няма: %s" + +#: ../fdroidserver/__main__.py +msgid "no version info found!" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "not allowed with argument %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "one of the arguments %s is required" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/index.py +msgid "only accepts strings, lists, and tuples" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "option %s: If you really want to install all the signed apps, use --all" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "option %s: invalid %s value: %r" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "option %s: invalid choice: %r (choose from %s)" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option -%s not recognized" +msgstr "варыянт -%s не распазнаны" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option -%s requires argument" +msgstr "варыянт -%s патрабуе аргумента" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s must not have an argument" +msgstr "параметр --%s не павінен мець аргумент" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s not a unique prefix" +msgstr "параметр --%s не з'яўляецца унікальным прэфіксам" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s not recognized" +msgstr "варыянт --%s не распазнаны" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s requires argument" +msgstr "параметр --%s патрабуе аргументу" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +msgid "optional arguments" +msgstr "неабавязковыя аргументы" + +#: /usr/lib/python3.11/argparse.py +msgid "options" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "overwriting existing {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "positional arguments" +msgstr "пазіцыйныя аргументы" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "process log deploy {path} to {dest} failed!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "ruamel.yaml not installed, can not write metadata." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd sync indexes {path} to {url} and delete" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "scanner cache is malformed! You can clear it with: '{clear}'" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "shared library" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "show program's version number and exit" +msgstr "паказаць нумар версіі праграмы і выйсці" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py +#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +msgid "show this help message and exit" +msgstr "паказаць гэта паведамленне дапамогі і выйсці" + +#: ../fdroidserver/signatures.py +msgid "signed APK, either a file-path or HTTPS URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: log content is empty" +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: not enabled in config" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "skipping source tarball: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "srclibs missing name and/or @" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "static library" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "the following arguments are required: %s" +msgstr "патрабуюцца наступныя аргументы: %s" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unexpected option string: %s" +msgstr "нечаканы параметр: %s" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unrecognized arguments: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "unsafe permissions on '{config_file}' (should be 0600)!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid +#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +msgid "usage: " +msgstr "выкарыстанне: " + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "using Apache libcloud to sync with {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "virustotal.com is rate limiting, waiting to retry..." +msgstr "" + +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "{0} app, {1} key aliases" +msgid_plural "{0} apps, {1} key aliases" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} ({appid}) has no metadata!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using application ID instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android application ID!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Java Package Name!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{appid} is missing {name}" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: Unknown extlib {path} in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "{appid}: no builds specified, running on current source state" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be an integer, found: {value}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{file} is blank or corrupt!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "{path} already exists, ignoring import results!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "{path} does not exist! Create it by running:" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} is zero size!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} more than 200MB, manually upload: {url}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{url} does not end with \"fdroid\", check the URL path!" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "{url} does not start with \"http\"!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "{} build failed" +msgid_plural "{} builds failed" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/build.py +msgid "{} build succeeded" +msgid_plural "{} builds succeeded" +msgstr[0] "" +msgstr[1] "" diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 6c2645ba..a2c0b153 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -11,20 +11,21 @@ # S3aBreeze , 2021. # Чтабс , 2021. # Andrei Stepanov , 2022. +# Макар Разин , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-02-23 18:22+0000\n" -"Last-Translator: Andrey \n" +"PO-Revision-Date: 2023-05-26 19:39+0000\n" +"Last-Translator: Макар Разин \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.16-dev\n" +"X-Generator: Weblate 4.18-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -193,7 +194,7 @@ msgstr "{path} не удалось исполнить!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "'{path}' имеет недопустимый формат, это должен быть словарь!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format @@ -201,9 +202,9 @@ msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' не подходит в качестве {field} в {appid}. Образец регулярного выражения: {pattern}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "'{value}' не подходит в качестве {field} в {appid}. Образец регулярного выражения: {pattern}" +msgstr "'{value}' не является допустимым {field}, должно быть {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -247,7 +248,7 @@ msgstr "Алиас для ключа для подписи репозитори #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "AllowedAPKSigningKeys отсутствует, но предоставлен эталонный двоичный файл" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" @@ -295,7 +296,7 @@ msgstr "Инструмент Android SDK {cmd} не найден!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "Приложение имеет двоичные файлы, но не имеет соответствующего сертификата AllowedAPKSigningKeys для закрепления." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" @@ -308,7 +309,7 @@ msgstr "Приложение находится в репозитории '{repo #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "Версия приложения имеет двоичный код, но не имеет соответствующего сертификата AllowedAPKSigningKeys для закрепления." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -326,7 +327,7 @@ msgstr "AutoUpdateMode с UpdateCheckMode: HTTP должен иметь шабл #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "Неверный тип записи \"{mirrortype}\" в конфигурации зеркал: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -427,7 +428,7 @@ msgstr "Сохранить изменения (commit)" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" +msgstr "Конфликтующие определения \"{field}\" между .yml и локализованными файлами:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." @@ -618,12 +619,12 @@ msgstr "Загрузить {url} не получилось. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "" +msgstr "Повторяющееся объявление Anti-Feature в {path} было проигнорировано!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "" +msgstr "Дублирующаяся запись \"%s\" в конфигурации зеркал!" #: ../fdroidserver/lint.py #, python-brace-format @@ -676,7 +677,7 @@ msgstr "Ошибка при получении адреса репозитори #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" +msgstr "Выход с ненулевым кодом, если обнаружены проблемы" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" @@ -898,7 +899,7 @@ msgstr "Проигнорировано: запись в FUNDING.yml длинне #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "" +msgstr "Игнорирование плохого элемента в манифесте: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1113,7 +1114,7 @@ msgstr "Директории для хранения выводных данны #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" +msgstr "Перемещение объявлений Anti-Features в локализованные файлы:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" @@ -1460,7 +1461,7 @@ msgstr "Выполняется wget в {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "" +msgstr "SHA-256 {url} не соответствует записи!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." @@ -1888,7 +1889,7 @@ msgstr "Запуск androguard из \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" -msgstr "" +msgstr "Использование пустого словаря вместо содержимого {path}!" #: ../fdroidserver/init.py #, python-brace-format @@ -2399,7 +2400,7 @@ msgstr "Не удалось загрузить лог {path} на {dest}!" #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "" +msgstr "эталонный двоичный файл с отсутствующей подписью" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2475,7 +2476,7 @@ msgstr "статическая библиотека" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "" +msgstr "предоставленный эталонный двоичный файл разрешил подписанту {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2600,9 +2601,9 @@ msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} должен быть целым числом, но найдено значение: {value}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{build_flag} must be list or string, found: {value}" -msgstr "{build_flag} должен быть целым числом, но найдено значение: {value}" +msgstr "{build_flag} должен быть списком или строкой, найдено: {value}" #: ../fdroidserver/metadata.py #, python-brace-format diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 05cc13aa..5d61cb84 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -7,20 +7,21 @@ # DankXylese , 2021. # Dan , 2022. # Sergii Horichenko , 2023. +# Макар Разин , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-02-23 18:22+0000\n" -"Last-Translator: Ihor Hordiichuk \n" +"PO-Revision-Date: 2023-05-26 19:39+0000\n" +"Last-Translator: Макар Разин \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.16-dev\n" +"X-Generator: Weblate 4.18-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -189,7 +190,7 @@ msgstr "'{path}' не вдалося виконати!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "'{path}' має недійсний формат, це має бути словник!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format @@ -197,9 +198,9 @@ msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' не є правильним {field} у {appid}. Правильний приклад: {pattern}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "'{value}' не є правильним {field} у {appid}. Правильний приклад: {pattern}" +msgstr "'{value}' не є дійсним {field}, має бути {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -243,7 +244,7 @@ msgstr "Псевдонім підписного ключа репозиторі #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "AllowedAPKSigningKeys відсутні, але надається посилання на двійковий файл" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" @@ -291,7 +292,7 @@ msgstr "Інструмент Android SDK {cmd} не знайдено!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "Програма має двійкові файли, але не має відповідних AllowedAPKSigningKeys для закріплення сертифіката." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" @@ -304,7 +305,7 @@ msgstr "Застосунок '{repo}' але має ланку до {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "Версія програми має двійковий код, але не має відповідних AllowedAPKSigningKeys для закріплення сертифіката." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -322,7 +323,7 @@ msgstr "AutoUpdateMode з UpdateCheckMode: HTTP повинен мати шабл #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "Неправильний тип запису \"{mirrortype}\" у конфігурації дзеркал: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -423,7 +424,7 @@ msgstr "Прийняти зміни" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" +msgstr "Конфлікт визначень \"{field}\" між .yml і локалізованими файлами:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." @@ -614,12 +615,12 @@ msgstr "Завантаження {url} не вдалося. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "" +msgstr "Дубльована декларація Anti-Feature на {path} була проігнорована!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "" +msgstr "Дубльований запис \"%s\" у конфігурації дзеркал!" #: ../fdroidserver/lint.py #, python-brace-format @@ -672,7 +673,7 @@ msgstr "Помилка отримання адреси репозиторію" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" +msgstr "Вихід із ненульовим кодом, якщо виявлено проблеми" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" @@ -894,7 +895,7 @@ msgstr "Нехтування записом FUNDING.yml з датою після #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "" +msgstr "Ігнорування поганого елемента в маніфесті: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1109,7 +1110,7 @@ msgstr "Відсутній вихідний шлях" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" +msgstr "Переміщення декларацій Anti-Features до локалізованих файлів:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" @@ -1456,7 +1457,7 @@ msgstr "Запуск wget у {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "" +msgstr "SHA-256 {url} не відповідає запису!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." @@ -1884,7 +1885,7 @@ msgstr "Використання androguard від \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" -msgstr "" +msgstr "Використання порожнього словника замість вмісту {path}!" #: ../fdroidserver/init.py #, python-brace-format @@ -2395,7 +2396,7 @@ msgstr "не вдалося розгорнути журнал процесів { #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "" +msgstr "посилання бінарний відсутній підпис" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2471,7 +2472,7 @@ msgstr "статична бібліотека" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "" +msgstr "наданий бінарний файл посилання дозволив підписувачу {підписувач}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py From 36195e14e67b666d4cbc03fce3a0b8d6d1f735b4 Mon Sep 17 00:00:00 2001 From: Agnieszka C Date: Sat, 29 Jul 2023 03:12:06 +0200 Subject: [PATCH 1272/2116] Translated using Weblate: Polish (pl) by Agnieszka C Currently translated at 100.0% (552 of 552 strings) Co-authored-by: Agnieszka C Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ Translation: F-Droid/F-Droid Server --- locale/pl/LC_MESSAGES/fdroidserver.po | 42 +++++++++++++-------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index f29f5377..4d399d85 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-02-23 18:22+0000\n" +"PO-Revision-Date: 2023-05-26 19:39+0000\n" "Last-Translator: Agnieszka C \n" "Language-Team: Polish \n" "Language: pl\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.16-dev\n" +"X-Generator: Weblate 4.18-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -187,7 +187,7 @@ msgstr "'{path}' nie udało się wykonać!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "'{path}' ma nieprawidłowy format, powinien być słownikiem!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format @@ -195,9 +195,9 @@ msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' nie jest prawidłowy {field} w {appid}. Wzór Regex: {pattern}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "'{value}' nie jest prawidłowy {field} w {appid}. Wzór Regex: {pattern}" +msgstr "'{value}' nie jest prawidłowym {field}, powinno być {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -241,7 +241,7 @@ msgstr "Alias klucza podpisu repozytorium w magazynie kluczy" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "Brak AllowedAPKSigningKeys, ale dostarczono referencyjny plik binarny" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" @@ -289,7 +289,7 @@ msgstr "Nie znaleziono narzędzia Android SDK {cmd}!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "Aplikacja ma Binaries, ale nie ma odpowiednich kluczy AllowedAPKSingKeys do przypięcia certyfikatu." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" @@ -302,7 +302,7 @@ msgstr "Aplikacja jest w '{repo}' ale ma link do {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "Wersja aplikacji ma plik binarny, ale nie ma odpowiednich kluczy AllowedAPKSigningKeys do przypięcia certyfikatu." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -320,7 +320,7 @@ msgstr "AutoUpdateMode z UpdateCheckMode: HTTP musi mieć wzorzec." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "Błędny typ wpisu „{mirrortype}” w konfiguracji serwerów lustrzanych: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -421,7 +421,7 @@ msgstr "Scommituj zmiany" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" +msgstr "Sprzeczne definicje „{field}” między plikami .yml a przetłumaczonymi:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." @@ -612,12 +612,12 @@ msgstr "Pobieranie {url} nie powiodło się. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "" +msgstr "Zduplikowana deklaracja niepożądanej funkcji w {path} została zignorowana!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "" +msgstr "Zduplikowany wpis „%s” w konfiguracji serwerów lustrzanych!" #: ../fdroidserver/lint.py #, python-brace-format @@ -670,7 +670,7 @@ msgstr "Błąd podczas uzyskiwania adresu repo" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" +msgstr "Zakończ z niezerowym kodem, jeśli znaleziono problemy" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" @@ -892,7 +892,7 @@ msgstr "Ignorowanie wpisu FUNDING.yml dłuższego niż 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "" +msgstr "Ignorowanie błędnego elementu w manifeście: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1107,7 +1107,7 @@ msgstr "Brakujący katalog wyjściowy" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" +msgstr "Przenoszenie deklaracji niepożądanych funkcji do przetłumaczonych plików:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" @@ -1454,7 +1454,7 @@ msgstr "Uruchomienie wget w {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "" +msgstr "SHA-256 z {url} nie pasuje do wpisu!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." @@ -1882,7 +1882,7 @@ msgstr "Korzystanie z androguard od \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" -msgstr "" +msgstr "Używanie pustego słownika zamiast zawartości {path}!" #: ../fdroidserver/init.py #, python-brace-format @@ -2393,7 +2393,7 @@ msgstr "proces wdrażania dziennika {path} do {dest} nie powiódł się!" #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "" +msgstr "brakujący podpis binarnego pliku odniesienia" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2469,7 +2469,7 @@ msgstr "biblioteka statyczna" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "" +msgstr "dostarczony referencyjny plik binarny umożliwił podpis {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2594,9 +2594,9 @@ msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} musi być liczbą całkowitą, znaleziono: {value}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{build_flag} must be list or string, found: {value}" -msgstr "{build_flag} musi być liczbą całkowitą, znaleziono: {value}" +msgstr "{build_flag} musi być listą lub ciągiem, znaleziono: {value}" #: ../fdroidserver/metadata.py #, python-brace-format From 18246057305c47b8e377df4c2ee9c6ceaf0ab20d Mon Sep 17 00:00:00 2001 From: Fjuro Date: Sat, 29 Jul 2023 03:12:06 +0200 Subject: [PATCH 1273/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 100.0% (552 of 552 strings) Co-authored-by: Fjuro Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ Translation: F-Droid/F-Droid Server --- locale/cs/LC_MESSAGES/fdroidserver.po | 42 +++++++++++++-------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index e4e8b532..d1b65fb0 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-02-26 16:37+0000\n" +"PO-Revision-Date: 2023-05-26 19:39+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.16-dev\n" +"X-Generator: Weblate 4.18-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -187,7 +187,7 @@ msgstr "'{path}' nepodařilo se provést!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "'{path}' má neplatný formát, měl by to být slovník!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format @@ -195,9 +195,9 @@ msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' není platný {field} v {appid}. Vzor regulárního výrazu: {pattern}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "'{value}' není platný {field} v {appid}. Vzor regulárního výrazu: {pattern}" +msgstr "'{value}' není platný {field}, měl by to být {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -241,7 +241,7 @@ msgstr "Alias podepisovacího klíče repozitáře v keystore" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "Chybí AllowedAPKSigningKeys, ale byl dodán referenční binární soubor" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" @@ -289,7 +289,7 @@ msgstr "Nástroj Android SDK {cmd} nenalezen!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "Aplikace má binární soubory, ale nemá odpovídající AllowedAPKSigningKeys pro připnutí certifikátu." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" @@ -302,7 +302,7 @@ msgstr "Aplikace je v repozitáři '{repo}' ale má odkaz na {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "Verze aplikace má binární soubor, ale nemá odpovídající AllowedAPKSigningKeys pro připnutí certifikátu." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -320,7 +320,7 @@ msgstr "AutoUpdateMode s UpdateCheckMode: HTTP musí mít vzor." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "Nesprávný typ záznamu \"{mirrortype}\" v konfiguraci zrcadel: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -421,7 +421,7 @@ msgstr "Odeslat změny" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" +msgstr "Konfliktní definice \"{field}\" mezi soubory .yml a lokalizovanými soubory:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." @@ -612,12 +612,12 @@ msgstr "Stahování {url} selhalo. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "" +msgstr "Duplicitní prohlášení Anti-Vlastností na adrese {path} bylo ignorováno!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "" +msgstr "Duplicitní záznam \"%s\" v konfiguraci zrcadel!" #: ../fdroidserver/lint.py #, python-brace-format @@ -670,7 +670,7 @@ msgstr "Chyba při získávání adresy repozitáře" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" +msgstr "Ukončit s nenulovým kódem při nalezení problémů" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" @@ -892,7 +892,7 @@ msgstr "Ignorování vstupu FUNDING.yml delšího než 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "" +msgstr "Ignorování nesprávného prvku v manifestu: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1107,7 +1107,7 @@ msgstr "Chybějící výstupní adresář" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" +msgstr "Přesun deklarací Anti-Features do lokalizovaných souborů:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" @@ -1454,7 +1454,7 @@ msgstr "Spouštění wget v {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "" +msgstr "SHA-256 z {url} neodpovídá zadání!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." @@ -1882,7 +1882,7 @@ msgstr "Používám androguard z „{path}“" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" -msgstr "" +msgstr "Použití prázdného slovníku místo obsahu {path}!" #: ../fdroidserver/init.py #, python-brace-format @@ -2393,7 +2393,7 @@ msgstr "proces nasazení protokolu {path} do {dest} selhal!" #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "" +msgstr "chybějící podpis v referenčním binárním souboru" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2469,7 +2469,7 @@ msgstr "statická knihovna" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "" +msgstr "dodaný referenční binární soubor umožnil podepisujícího {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2594,9 +2594,9 @@ msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} musí být celé číslo, nalezeno: {value}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{build_flag} must be list or string, found: {value}" -msgstr "{build_flag} musí být celé číslo, nalezeno: {value}" +msgstr "{build_flag} musí být seznam nebo řetězec, nalezeno: {value}" #: ../fdroidserver/metadata.py #, python-brace-format From 7c0a2e3508968420fe09a2513acc349a7dc5d1d4 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Sat, 29 Jul 2023 03:12:07 +0200 Subject: [PATCH 1274/2116] Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk Currently translated at 100.0% (552 of 552 strings) Co-authored-by: Ihor Hordiichuk Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 5d61cb84..c3ff404c 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -13,8 +13,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-05-26 19:39+0000\n" -"Last-Translator: Макар Разин \n" +"PO-Revision-Date: 2023-05-28 07:54+0000\n" +"Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" @@ -615,7 +615,7 @@ msgstr "Завантаження {url} не вдалося. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "Дубльована декларація Anti-Feature на {path} була проігнорована!" +msgstr "Дубльована декларація небажаних функцій у {path} була проігнорована!" #: ../fdroidserver/index.py #, python-format @@ -1110,7 +1110,7 @@ msgstr "Відсутній вихідний шлях" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "Переміщення декларацій Anti-Features до локалізованих файлів:" +msgstr "Переміщення декларацій небажаних функцій до локалізованих файлів:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" @@ -2396,7 +2396,7 @@ msgstr "не вдалося розгорнути журнал процесів { #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "посилання бінарний відсутній підпис" +msgstr "еталонний двійковий файл з відсутнім підписом" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2472,7 +2472,7 @@ msgstr "статична бібліотека" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "наданий бінарний файл посилання дозволив підписувачу {підписувач}" +msgstr "наданий еталонний двійковий файл дозволив підписувачу {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2597,9 +2597,9 @@ msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} має бути цілим числом, знайдено: {value}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{build_flag} must be list or string, found: {value}" -msgstr "{build_flag} має бути цілим числом, знайдено: {value}" +msgstr "{build_flag} має бути списком або рядком, знайдено: {value}" #: ../fdroidserver/metadata.py #, python-brace-format From fe44aa2a2146141f53da725df576c1cb079ba02e Mon Sep 17 00:00:00 2001 From: Andrey Date: Sat, 29 Jul 2023 03:12:07 +0200 Subject: [PATCH 1275/2116] Translated using Weblate: Russian (ru) by Andrey Currently translated at 100.0% (552 of 552 strings) Co-authored-by: Andrey Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translation: F-Droid/F-Droid Server --- locale/ru/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index a2c0b153..436339c1 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -17,8 +17,8 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-05-26 19:39+0000\n" -"Last-Translator: Макар Разин \n" +"PO-Revision-Date: 2023-05-28 07:54+0000\n" +"Last-Translator: Andrey \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" @@ -2016,7 +2016,7 @@ msgstr "не удалось разобрать спецификацию scrlib ( #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "не удаётся открыть «%(filename)s»: %(error)s" +msgstr "не удается открыть '%(filename)s': %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" From eb11af9226b5e5f97273a7e83820d32971fe1169 Mon Sep 17 00:00:00 2001 From: random r Date: Sat, 29 Jul 2023 03:12:08 +0200 Subject: [PATCH 1276/2116] Translated using Weblate: Italian (it) by random r Currently translated at 92.7% (512 of 552 strings) Co-authored-by: random r Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ Translation: F-Droid/F-Droid Server --- locale/it/LC_MESSAGES/fdroidserver.po | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 73e6c3ae..f2ffe393 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# random r , 2020, 2022. +# random r , 2020, 2022, 2023. # Luca Zambarda , 2020. # IvanDan , 2020, 2021. # Massimiliano Caniparoli , 2020. @@ -18,15 +18,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-01-29 13:57+0000\n" -"Last-Translator: Pixel-Tux \n" +"PO-Revision-Date: 2023-05-31 09:50+0000\n" +"Last-Translator: random r \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.16-dev\n" +"X-Generator: Weblate 4.18-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -202,9 +202,9 @@ msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "\"{value}\" non è un {field} valido in {appid}. Espressione regolare: {pattern}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "\"{value}\" non è un {field} valido in {appid}. Espressione regolare: {pattern}" +msgstr "\"{value}\" non è un {field} valido, dovrebbe essere {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -824,9 +824,9 @@ msgid "Found {apkfilename} at {url}" msgstr "Trovato {apkfilename} in {url}" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Found {count} problems in {filename}" -msgstr "Scanner trovato {count} problemi in {appid}:" +msgstr "Trovati {count} problemi in {filename}" #: ../fdroidserver/scanner.py #, python-brace-format @@ -981,9 +981,9 @@ msgid "Invalid VercodeOperation: {field}" msgstr "VercodeOperation non valido: {field}" #: ../fdroidserver/lint.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" -msgstr "VercodeOperation non valido: {field}" +msgstr "VercodeOperation non valido: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format @@ -1471,9 +1471,9 @@ msgid "Scan the source code of a package" msgstr "Scansiona il codice sorgente di un pacchetto" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Scanner found {count} problems in {apk}" -msgstr "Scanner trovato {count} problemi in {appid}:" +msgstr "Lo scanner ha trovato {count} problemi in {apk}" #: ../fdroidserver/scanner.py #, python-brace-format From ed6da709d40d28b346b1677e978ea066525cb263 Mon Sep 17 00:00:00 2001 From: Translator Date: Sat, 29 Jul 2023 03:12:08 +0200 Subject: [PATCH 1277/2116] Translated using Weblate: French (fr) by Translator Currently translated at 97.8% (540 of 552 strings) Co-authored-by: Translator Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 2c570a10..ea512f32 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -40,7 +40,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-02-23 18:22+0000\n" +"PO-Revision-Date: 2023-06-09 18:48+0000\n" "Last-Translator: Translator \n" "Language-Team: French \n" "Language: fr\n" @@ -48,7 +48,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.16-dev\n" +"X-Generator: Weblate 4.18-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -216,7 +216,7 @@ msgstr "'{path}' n'a pas pu être exécuté !" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "Le format de '{path}' est incorrect, il devrait s'agir d’un dictionnaire !" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format @@ -224,9 +224,9 @@ msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' n'est pas un(e) {field} valide dans {appid}. Motif regex : {pattern}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "'{value}' n'est pas un(e) {field} valide dans {appid}. Motif regex : {pattern}" +msgstr "'{value}' n'est pas un(e) {field} valide et devrait être {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -270,7 +270,7 @@ msgstr "Alias de la clé de signature du dépôt dans le trousseau" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "AllowedAPKSigningKeys est manquante mais des références binaires sont indiquées" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" @@ -318,7 +318,7 @@ msgstr "L'outil SDK Android {cmd} n'a pas été trouvé !" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "L’application possède des fichiers binaires mais n'a pas les AllowedAPKSigningKeys correspondantes pour épingler le certificat." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" @@ -331,7 +331,7 @@ msgstr "L'application est dans '{repo}' mais a un lien vers {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "Des versions de l’application possède des fichiers binaires mais n'ont pas les AllowedAPKSigningKeys correspondantes pour épingler le certificat." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" From 0fe7c5ef1f9438aed10f186fc705892e1769aadd Mon Sep 17 00:00:00 2001 From: Rex_sa Date: Sat, 29 Jul 2023 03:12:08 +0200 Subject: [PATCH 1278/2116] Translated using Weblate: Arabic (ar) by Rex_sa Currently translated at 3.2% (18 of 552 strings) Translated using Weblate: Arabic (ar) by Rex_sa Currently translated at 2.7% (15 of 552 strings) Co-authored-by: Rex_sa Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ar/ Translation: F-Droid/F-Droid Server --- locale/ar/LC_MESSAGES/fdroidserver.po | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/locale/ar/LC_MESSAGES/fdroidserver.po b/locale/ar/LC_MESSAGES/fdroidserver.po index d47e62c6..0fe9b4a8 100644 --- a/locale/ar/LC_MESSAGES/fdroidserver.po +++ b/locale/ar/LC_MESSAGES/fdroidserver.po @@ -1,20 +1,21 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # Ahmad0a , 2023. +# Rex_sa , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-01-16 23:52+0000\n" -"Last-Translator: Ahmad0a \n" +"PO-Revision-Date: 2023-07-04 06:54+0000\n" +"Last-Translator: Rex_sa \n" "Language-Team: Arabic \n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 4.15.1-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -1817,7 +1818,7 @@ msgstr "استخدام" #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" -msgstr "" +msgstr "الاستخدام: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" @@ -1874,7 +1875,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Valid commands are:" -msgstr "" +msgstr "الأوامر الصالحة هي:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." @@ -2306,14 +2307,14 @@ msgstr "" #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" -msgstr "" +msgstr "لم يتم التعرف على الإختيار -%s" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" -msgstr "" +msgstr "الخيار - %s يتطلب وسيطة" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py @@ -2346,7 +2347,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" -msgstr "" +msgstr "مناقشات اختيارية" #: /usr/lib/python3.11/argparse.py #, fuzzy @@ -2409,7 +2410,7 @@ msgstr "" #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" -msgstr "" +msgstr "اظهار رقم واصدار نسخة البرنامج والخروج" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py @@ -2417,7 +2418,7 @@ msgstr "" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" -msgstr "" +msgstr "اظهر رسالة المساعدة واخرج" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." From 2029b5a107609b9c4c8bd6894db9f9c76e2e7185 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Sat, 29 Jul 2023 03:12:09 +0200 Subject: [PATCH 1279/2116] Translated using Weblate: Spanish (es) by gallegonovato Currently translated at 95.1% (525 of 552 strings) Co-authored-by: gallegonovato Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ Translation: F-Droid/F-Droid Server --- locale/es/LC_MESSAGES/fdroidserver.po | 32 +++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 3ca3aa30..1be30540 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -12,13 +12,13 @@ # Iago , 2022. # Iago , 2022. # Jaime Marquínez Ferrándiz , 2022. -# gallegonovato , 2022. +# gallegonovato , 2022, 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2022-12-09 13:49+0000\n" +"PO-Revision-Date: 2023-06-20 20:50+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" "Language: es\n" @@ -26,7 +26,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 4.18.1\n" #: ../fdroidserver/nightly.py msgid "" @@ -127,12 +127,12 @@ msgstr "no se puede llamar a %r" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" -msgstr "" +msgstr "¡%s no ha producido un dict!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" -msgstr "" +msgstr "%s tienes mal un SHA-256: %s" #: ../fdroidserver/lint.py #, python-format @@ -194,7 +194,7 @@ msgstr "¡Falló la ejecución de '{path}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "'{path}' tiene un formato inválido, ¡debería ser un diccionario!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format @@ -202,9 +202,9 @@ msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' no es un {field} válido en {appid}. Patrón de expresión regular: {pattern}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "'{value}' no es un {field} válido en {appid}. Patrón de expresión regular: {pattern}" +msgstr "'{value}' no es un {field} válido, debería ser {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -248,7 +248,7 @@ msgstr "Alias de la clave de firma de repositorio en el depósitio de claves" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "Falta la AllowedAPKSigningKeys, pero se proporcionó un binario de referencia" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" @@ -296,11 +296,11 @@ msgstr "¡No se encontró la herramienta {cmd} del SDK de Android!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "La aplicación tiene archivos binarios, pero no las AllowedAPKSigningKeys correspondientes para fijat el certificado." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" +msgstr "La aplicación tiene NoSourceSince o ArchivePolicy \"0 versiones\", pero AutoUpdateMode o UpdateCheckMode no es Ninguno" #: ../fdroidserver/lint.py #, python-brace-format @@ -309,7 +309,7 @@ msgstr "La aplicación está en '{repo}' pero tiene un enlace a {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "La versión de la aplicación es binaria pero no tiene las correspondientes AllowedAPKSigningKeys para fijar el certificado." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -322,12 +322,12 @@ msgstr "¡Archivando {apkfilename} con una firma inválida!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." -msgstr "" +msgstr "AutoUpdateMode con UpdateCheckMode: el HTTP debe tener un patrón." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "Tipo de entrada incorrecto \"{mirrortype}\" en la configuración de los espejos: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -427,7 +427,7 @@ msgstr "Aplicar cambios" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" +msgstr "Definiciones \"{field}\" contradictorias entre los archivos .yml y los archivos localizados:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." @@ -618,7 +618,7 @@ msgstr "La descarga de {url} falló. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "" +msgstr "¡Se ignoró la declaración duplicada de Anti-Feature en la {path}!" #: ../fdroidserver/index.py #, python-format From b167f6b3eee68bff9c1922211e0ec18f2d9a13bb Mon Sep 17 00:00:00 2001 From: Davide Neri Date: Sat, 29 Jul 2023 03:12:09 +0200 Subject: [PATCH 1280/2116] Translated using Weblate: Italian (it) by Davide Neri Currently translated at 96.1% (531 of 552 strings) Translated using Weblate: Italian (it) by Davide Neri Currently translated at 96.0% (530 of 552 strings) Co-authored-by: Davide Neri Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ Translation: F-Droid/F-Droid Server --- locale/it/LC_MESSAGES/fdroidserver.po | 52 +++++++++++++-------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index f2ffe393..423f1878 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -13,20 +13,21 @@ # Frankie McEyes , 2022. # Antonello Pirina , 2022. # Pixel-Tux , 2023. +# Davide Neri , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-05-31 09:50+0000\n" -"Last-Translator: random r \n" +"PO-Revision-Date: 2023-06-26 20:58+0000\n" +"Last-Translator: Davide Neri \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.18-dev\n" +"X-Generator: Weblate 4.18.1\n" #: ../fdroidserver/nightly.py msgid "" @@ -127,12 +128,12 @@ msgstr "%r non è richiamabile" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" -msgstr "" +msgstr "%s non ha prodotto un dict!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" -msgstr "" +msgstr "%s ha un SHA-256 errato: %s" #: ../fdroidserver/lint.py #, python-format @@ -194,7 +195,7 @@ msgstr "Esecuzione di \"{path}\" fallita!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "'{path}' ha un formato non valido, dovrebbe essere un dizionario!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format @@ -327,7 +328,7 @@ msgstr "" #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "Tipo di voce \"{mirrortype}\" errato nella configurazione dei mirror: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -427,7 +428,7 @@ msgstr "Cambiamenti del commit" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" +msgstr "Definizioni \"{field}\" in conflitto tra .yml e file localizzati:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." @@ -618,12 +619,12 @@ msgstr "Scaricamento di {url} fallito. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "" +msgstr "La dichiarazione di Anti-Feature duplicata in {path} è stata ignorata!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "" +msgstr "Voce \"%s\" duplicata nella configurazione dei mirror!" #: ../fdroidserver/lint.py #, python-brace-format @@ -676,7 +677,7 @@ msgstr "Errore nell'ottenere l'indirizzo del repo" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" +msgstr "Esci con un codice diverso da zero se sono stati rilevati problemi" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" @@ -831,7 +832,7 @@ msgstr "Trovati {count} problemi in {filename}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" -msgstr "" +msgstr "Trovati {count} avvisi in {filename}" #: ../fdroidserver/update.py #, python-brace-format @@ -1113,7 +1114,7 @@ msgstr "Directory di output mancante" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" +msgstr "Spostamento delle dichiarazioni di Anti-Features nei file localizzati:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" @@ -1388,9 +1389,9 @@ msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfil msgstr "Lettura di packageName/versionCode/ ersionName non riuscita, APK non valido: '{apkfilename}'" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" -msgstr "Lettura di packageName/versionCode/ ersionName non riuscita, APK non valido: '{apkfilename}'" +msgstr "Lettura di packageName/versionCode/versionName non riuscita, APK non valido: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format @@ -1695,7 +1696,7 @@ msgstr "Tag di licenza inaspettato \"{}\"! Usa solo i tag di licenza configurati #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" +msgstr "Destinazione collegamento simbolico inattesa: {link} -> {target}" #: ../fdroidserver/common.py #, python-brace-format @@ -2110,9 +2111,8 @@ msgid "dest= is required for options like %r" msgstr "dest= è richiesto per opzioni come %r" #: ../fdroidserver/scanner.py -#, fuzzy msgid "downloading '{}'" -msgstr "Scaricando %s" +msgstr "scaricando '{}'" #: ../fdroidserver/scanner.py #, fuzzy @@ -2156,7 +2156,7 @@ msgstr "fdroid [] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" -msgstr "" +msgstr "recupera l'ultima versione delle firme dal web" #: /usr/lib/python3.11/optparse.py msgid "floating-point" @@ -2186,9 +2186,8 @@ msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 deve avere una firma, usa `fdroid signindex` per crearla!" #: ../fdroidserver/index.py -#, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v2 deve avere una firma, usare `fdroid signindex` per crearla!" +msgstr "index-v2 deve avere una firma, usa `fdroid signindex` per crearla!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2260,7 +2259,7 @@ msgstr "gli argomenti che si escludono a vicenda devono essere opzionali" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" -msgstr "" +msgstr "prossimo aggiornamento cache {name} tra {time}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2371,9 +2370,8 @@ msgid "optional arguments" msgstr "argomenti facoltativi" #: /usr/lib/python3.11/argparse.py -#, fuzzy msgid "options" -msgstr "Opzioni" +msgstr "opzioni" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2593,9 +2591,9 @@ msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} deve essere un intero, trovato: {value}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{build_flag} must be list or string, found: {value}" -msgstr "{build_flag} deve essere un intero, trovato: {value}" +msgstr "{build_flag} deve essere una lista o una stringa, trovato: {value}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2638,7 +2636,7 @@ msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} più di 200MB, caricare manualmente: {url}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path}: {error}" msgstr "{path}: {error}" From f6cdeadb1f7666a5faa5356e4da6aef1a99f5451 Mon Sep 17 00:00:00 2001 From: The Cats Date: Sat, 29 Jul 2023 03:12:10 +0200 Subject: [PATCH 1281/2116] Translated using Weblate: Portuguese (Brazil) (pt_BR) by The Cats Currently translated at 96.7% (534 of 552 strings) Translated using Weblate: Portuguese (Brazil) (pt_BR) by The Cats Currently translated at 95.8% (529 of 552 strings) Translated using Weblate: Portuguese (Brazil) (pt_BR) by The Cats Currently translated at 95.1% (525 of 552 strings) Co-authored-by: The Cats Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/ Translation: F-Droid/F-Droid Server --- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++------------ 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index f4d4106e..65832b09 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -14,7 +14,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-02-01 00:47+0000\n" +"PO-Revision-Date: 2023-07-09 13:51+0000\n" "Last-Translator: The Cats \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" @@ -22,7 +22,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.16-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -123,12 +123,12 @@ msgstr "%r não é chamável" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" -msgstr "" +msgstr "%s não produziu um dict!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" -msgstr "" +msgstr "%s tem SHA-256 ruim: %s" #: ../fdroidserver/lint.py #, python-format @@ -190,7 +190,7 @@ msgstr "'{path}' falhou ao executar!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "'{path}' tem um formato inválido, deveria ser um dicionário!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format @@ -198,9 +198,9 @@ msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' não é um{field} válido em {appid}. Regex padrão: {pattern}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "'{value}' não é um{field} válido em {appid}. Regex padrão: {pattern}" +msgstr "'{value}' não é um {field} válido, deveria ser {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -244,7 +244,7 @@ msgstr "Alias (apelido) da chave de assinatura do repositório na keystore" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "AllowedAPKSigningKeys ausente, mas binário de referência fornecido" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" @@ -292,11 +292,11 @@ msgstr "A ferramenta SDK do Android {cmd} não foi encontrada!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "O aplicativo tem binários, mas não tem AllowedAPKSigningKeys correspondentes para fixar o certificado." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" +msgstr "O aplicativo tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateMode ou UpdateCheckMode não são None" #: ../fdroidserver/lint.py #, python-brace-format @@ -305,7 +305,7 @@ msgstr "O App está em '{repo}' mas tem um link para {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "A versão do aplicativo tem binário, mas não tem as correspondentes AllowedAPKSigningKeys para fixar o certificado." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -318,12 +318,12 @@ msgstr "Arquivamento {apkfilename} com assinatura inválida!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." -msgstr "" +msgstr "AutoUpdateMode com atualização CheckMode: HTTP deve ter um padrão." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "Tipo de entrada incorreto \"{mirrortype}\" na configuração de espelhos: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -423,7 +423,7 @@ msgstr "Enviar mudanças" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" +msgstr "Definições conflitantes de \"{field}\" entre arquivos .yml e localizados:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." @@ -614,12 +614,12 @@ msgstr "Falha ao baixar '{url}'. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "" +msgstr "A declaração duplicada do Anti-Recurso em {path} foi ignorada!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "" +msgstr "Entrada \"%s\" duplicada na configuração de espelhos!" #: ../fdroidserver/lint.py #, python-brace-format @@ -672,7 +672,7 @@ msgstr "Erro ao obter o endereço do repositório" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" +msgstr "Sair com um código diferente de zero se problemas forem encontrados" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" @@ -820,14 +820,14 @@ msgid "Found {apkfilename} at {url}" msgstr "Encontrado {apkfilename} em {url}" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Found {count} problems in {filename}" -msgstr "O scanner encontrou {count} problemas em {appid}:" +msgstr "{count} problemas encontrados em {filename}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" -msgstr "" +msgstr "{count} advertências encontradas em {filename}" #: ../fdroidserver/update.py #, python-brace-format @@ -977,9 +977,9 @@ msgid "Invalid VercodeOperation: {field}" msgstr "Versão de Operação de Código inválido: {field}" #: ../fdroidserver/lint.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" -msgstr "Versão de Operação de Código inválido: {field}" +msgstr "Versão de Operação de Código inválido: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format @@ -1109,7 +1109,7 @@ msgstr "Diretório de saída ausente" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" +msgstr "Movendo declarações de Anti-Recursos para arquivos localizados:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" @@ -1384,9 +1384,9 @@ msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfil msgstr "A leitura de packageName/versionCode/versionName falhou, o APK inválido: '{apkfilename}'" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" -msgstr "A leitura de packageName/versionCode/versionName falhou, o APK inválido: '{apkfilename}'" +msgstr "Falha ao ler packageName/versionCode/versionName, APK inválido: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format @@ -1456,7 +1456,7 @@ msgstr "Executando o 'wget' em {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "" +msgstr "O SHA-256 de {url} não corresponde à entrada!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." @@ -1467,9 +1467,9 @@ msgid "Scan the source code of a package" msgstr "Percorre o código-fonte de um pacote" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Scanner found {count} problems in {apk}" -msgstr "O scanner encontrou {count} problemas em {appid}:" +msgstr "O scanner encontrou {count} problemas em {apk}" #: ../fdroidserver/scanner.py #, python-brace-format From 318010649f48e013373eeb433735463244ae7411 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=2E=20R=C3=BCdinger?= Date: Sat, 29 Jul 2023 03:12:10 +0200 Subject: [PATCH 1282/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Germa?= =?UTF-8?q?n=20(de)=20by=20"C.=20R=C3=BCdinger"=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (552 of 552 strings) Co-authored-by: C. Rüdinger Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 49 ++++++++++++++------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 8cad2b1e..61b93b6f 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -19,20 +19,21 @@ # Roman Leo , 2021. # Follpvosten , 2021. # ssantos , 2022, 2023. +# "C. Rüdinger" , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-02-26 16:37+0000\n" -"Last-Translator: VfBFan \n" +"PO-Revision-Date: 2023-06-23 14:52+0000\n" +"Last-Translator: \"C. Rüdinger\" \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.16-dev\n" +"X-Generator: Weblate 4.18.1\n" #: ../fdroidserver/nightly.py msgid "" @@ -200,7 +201,7 @@ msgstr "„{path}” konnte nicht ausgeführt werden!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "'{path}' in ungültigem Format, sollte ein Wörterbuch sein!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format @@ -208,9 +209,9 @@ msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "„{value}” ist kein gültiges {field} in {appid}. Regex-Muster: {pattern}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "„{value}” ist kein gültiges {field} in {appid}. Regex-Muster: {pattern}" +msgstr "„{value}” ist kein gültiges {field}, sollte {pattern} sein" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -254,7 +255,7 @@ msgstr "Pseudonym des Repository-Signierchlüssels im Schlüsselspeicher" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "AllowedAPKSigningKeys fehlen aber Referenz-Binärdatei geliefert" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" @@ -302,7 +303,7 @@ msgstr "Android-SDK-Tool {cmd} nicht gefunden!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "App besitzt Binärdateien aber keine entsprechenden AllowedAPKSigningKeys, um Zertifikat zu verankern." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" @@ -315,7 +316,7 @@ msgstr "App befindet sich in „{repo}”, enthält aber einen Verweis auf {url} #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "App-Version besitzt Binärdateien aber keine entsprechenden AllowedAPKSigningKeys, um Zertifikat zu verankern." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -333,7 +334,7 @@ msgstr "AutoUpdateMode mit UpdateCheckMode: HTTP muss ein Muster haben." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "Falscher Typeneintrag „{mirrortype}“ in Spiegelserver-Konfiguration von: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -433,7 +434,7 @@ msgstr "Änderungen übergeben" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" +msgstr "Widersprüchliche „{field}“-Definitionen in .yml- bzw. übersetzten Dateien:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." @@ -624,12 +625,12 @@ msgstr "Herunterladen von {url} fehlgeschlagen. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "" +msgstr "Doppelte Anti-Feature-Deklaration in {path} wurde ignoriert!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "" +msgstr "Doppelter „%s“-Eintrag in Spiegelserver-Konfiguration!" #: ../fdroidserver/lint.py #, python-brace-format @@ -682,7 +683,7 @@ msgstr "Fehler bei der Ermittlung der Repro-Adresse" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" +msgstr "Mit einem von Null verschiedenen Code beenden, falls Probleme auftreten" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" @@ -904,7 +905,7 @@ msgstr "Ignoriere FUNDING.yml Einträge länger als 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "" +msgstr "Ignoriere schlechtes Element im Manifest: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1119,7 +1120,7 @@ msgstr "Fehlendes Ausgabeverzeichnis" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" +msgstr "Verschiebe Anti-Feature-Deklarationen in lokalisierte Dateien:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" @@ -1132,7 +1133,7 @@ msgstr "Keine APK für das Paket: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" -msgstr "Keine Android SDK gefunden!" +msgstr "Kein Android SDK gefunden!" #: ../fdroidserver/install.py msgid "No attached devices found" @@ -1466,7 +1467,7 @@ msgstr "Ausführen von wget in {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "" +msgstr "SHA-256 von {url} stimmt nicht mit Eintrag überein!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." @@ -1893,7 +1894,7 @@ msgstr "Verwende Androguard von \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" -msgstr "" +msgstr "Verwende leeres Verzeichnis statt der Inhalte von {path}!" #: ../fdroidserver/init.py #, python-brace-format @@ -2402,7 +2403,7 @@ msgstr "Bereitstellen des Process Log {path} auf {dest} ist fehlgeschlagen!" #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "" +msgstr "Referenz-Binärdatei fehlt Signatur" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2478,14 +2479,14 @@ msgstr "statische Bibliothek" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "" +msgstr "Angewandte Referenz-Binary erlaubt Signer {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" -msgstr "die Folgenden Argumente sind erforderlich: %s" +msgstr "die folgenden Argumente sind erforderlich: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2602,9 +2603,9 @@ msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} muss ein Integer sein, gefunden: {value}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{build_flag} must be list or string, found: {value}" -msgstr "{build_flag} muss ein Integer sein, gefunden: {value}" +msgstr "{build_flag} muss eine Liste oder Zeichenkette sein, gefunden: {value}" #: ../fdroidserver/metadata.py #, python-brace-format From 218db99769dd141d813afaec55e67a8c9e815d8e Mon Sep 17 00:00:00 2001 From: abe1242 Date: Sat, 29 Jul 2023 03:12:10 +0200 Subject: [PATCH 1283/2116] Translated using Weblate: Malayalam (ml) by abe1242 Currently translated at 1.0% (6 of 552 strings) Co-authored-by: abe1242 Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ml/ Translation: F-Droid/F-Droid Server --- locale/ml/LC_MESSAGES/fdroidserver.po | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/locale/ml/LC_MESSAGES/fdroidserver.po b/locale/ml/LC_MESSAGES/fdroidserver.po index ddbcf04b..45da2845 100644 --- a/locale/ml/LC_MESSAGES/fdroidserver.po +++ b/locale/ml/LC_MESSAGES/fdroidserver.po @@ -2,20 +2,21 @@ # This file is put in the public domain. # Coding Otaku , 2021. # Abhiram , 2022. +# abe1242 , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2022-11-22 19:37+0000\n" -"Last-Translator: Abhiram \n" +"PO-Revision-Date: 2023-06-23 14:52+0000\n" +"Last-Translator: abe1242 \n" "Language-Team: Malayalam \n" "Language: ml\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 4.18.1\n" #: ../fdroidserver/nightly.py #, fuzzy @@ -97,7 +98,7 @@ msgstr "" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" -msgstr "" +msgstr "%d പ്രശ്നങ്ങൾ കണ്ടുപിടിച്ചു" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -144,11 +145,11 @@ msgstr "" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" -msgstr "" +msgstr "config.yml ൽ 'keystore' കാണപ്പെടുന്നില്ല!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" -msgstr "" +msgstr "config.yml ൽ 'keystorepass' കാണപ്പെടുന്നില്ല!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" From 7396c774743256bc1ac2e4dbc4ddbf3ffb1e170a Mon Sep 17 00:00:00 2001 From: ssantos Date: Sat, 29 Jul 2023 03:12:11 +0200 Subject: [PATCH 1284/2116] Translated using Weblate: Portuguese (pt) by ssantos Currently translated at 100.0% (552 of 552 strings) Translated using Weblate: Portuguese (Portugal) (pt_PT) by ssantos Currently translated at 100.0% (552 of 552 strings) Co-authored-by: ssantos Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_PT/ Translation: F-Droid/F-Droid Server --- locale/pt/LC_MESSAGES/fdroidserver.po | 42 ++++++++++++------------ locale/pt_PT/LC_MESSAGES/fdroidserver.po | 42 ++++++++++++------------ 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 1cef679c..ceaef64f 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-02-25 12:43+0000\n" +"PO-Revision-Date: 2023-07-02 15:51+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" "Language: pt\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.16-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -185,7 +185,7 @@ msgstr "'{path}' falhou ao executar!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "'{path}' tem um formato inválido, deveria ser um dicionário!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format @@ -193,9 +193,9 @@ msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' não é um {field} válido em {appid}. Modelo regex: {pattern}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "'{value}' não é um {field} válido em {appid}. Modelo regex: {pattern}" +msgstr "'{value}' não é um {field} válido, deve ser {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -239,7 +239,7 @@ msgstr "Alias (apelido) da chave de assinatura do repositório na keystore" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "AllowedAPKSigningKeys está ausente, mas o binário de referência foi fornecido" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" @@ -287,7 +287,7 @@ msgstr "A ferramenta SDK do Android {cmd} não foi encontrada!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "A app tem binários, mas não tem AllowedAPKSigningKeys correspondentes para fixar o certificado." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" @@ -300,7 +300,7 @@ msgstr "A App está em '{repo}' mas tem uma hiperligação para {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "A versão da app tem um binário, mas não tem as AllowedAPKSigningKeys correspondentes para fixar o certificado." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -318,7 +318,7 @@ msgstr "AutoUpdateMode com UpdateCheckMode: HTTP deve ter um modelo." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "Tipo de entrada \"{mirrortype}\" incorreto na configuração de espelhos: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -418,7 +418,7 @@ msgstr "Enviar mudanças" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" +msgstr "Definições contraditórias de \"{field}\" entre ficheiros .yml e ficheiros localizados:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." @@ -609,12 +609,12 @@ msgstr "Descarregar {url} falhou. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "" +msgstr "A declaração duplicada da característica indesejada em {path} foi ignorada!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "" +msgstr "Entrada \"%s\" duplicada na configuração de espelhos!" #: ../fdroidserver/lint.py #, python-brace-format @@ -667,7 +667,7 @@ msgstr "Erro ao obter o endereço do repo" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" +msgstr "Sair com um código diferente de zero se problemas forem encontrados" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" @@ -889,7 +889,7 @@ msgstr "A ignorar a entrada FUNDING.yml por mais de 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "" +msgstr "A ignorar o elemento mau no manifesto: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1104,7 +1104,7 @@ msgstr "Falta diretório de saída" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" +msgstr "A mover as declarações de características indesejadas para ficheiros localizados:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" @@ -1451,7 +1451,7 @@ msgstr "Executando o wget em {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "" +msgstr "O SHA-256 de {url} não corresponde à entrada!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." @@ -1878,7 +1878,7 @@ msgstr "Usando androguard de \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" -msgstr "" +msgstr "A utilizar um dicionário em branco em vez do conteúdo de {path}!" #: ../fdroidserver/init.py #, python-brace-format @@ -2387,7 +2387,7 @@ msgstr "a implementação do registo de processo {path} a {dest} falhou!" #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "" +msgstr "binária de referência sem assinatura" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2463,7 +2463,7 @@ msgstr "biblioteca estática" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "" +msgstr "o binário de referência fornecido tem o assinante permitido {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2587,9 +2587,9 @@ msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} deve ser um inteiro, encontrado: {value}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{build_flag} must be list or string, found: {value}" -msgstr "{build_flag} deve ser um inteiro, encontrado: {value}" +msgstr "{build_flag} deve ser uma lista ou uma cadeia de caracteres, encontrado: {value}" #: ../fdroidserver/metadata.py #, python-brace-format diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 28d2215b..796d1dbe 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-02-25 12:43+0000\n" +"PO-Revision-Date: 2023-07-02 15:51+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" "Language: pt_PT\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.16-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -186,7 +186,7 @@ msgstr "'{path}' falhou ao executar!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "'{path}' tem um formato inválido, deve ser um dicionário!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format @@ -194,9 +194,9 @@ msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' não é um {field} válido em {appid}. Modelo regex: {pattern}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "'{value}' não é um {field} válido em {appid}. Modelo regex: {pattern}" +msgstr "'{value}' não é um {field} válido, deve ser {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -240,7 +240,7 @@ msgstr "Alias (apelido) da chave de assinatura do repositório na keystore" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "AllowedAPKSigningKeys está ausente, mas o binário de referência foi fornecido" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" @@ -288,7 +288,7 @@ msgstr "A ferramenta SDK do Android {cmd} não foi encontrada!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "A app tem binários, mas não tem AllowedAPKSigningKeys correspondentes para fixar o certificado." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" @@ -301,7 +301,7 @@ msgstr "A App está em '{repo}' mas tem uma hiperligação para {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "A versão da app tem um binário, mas não tem as AllowedAPKSigningKeys correspondentes para fixar o certificado." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -319,7 +319,7 @@ msgstr "AutoUpdateMode com UpdateCheckMode: HTTP deve ter um modelo." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "Tipo de entrada \"{mirrortype}\" incorreto na configuração de espelhos: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -419,7 +419,7 @@ msgstr "Enviar mudanças" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" +msgstr "Definições conflitantes de \"{field}\" entre arquivos .yml e localizados:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." @@ -610,12 +610,12 @@ msgstr "Descarregar {url} falhou. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "" +msgstr "A declaração duplicada da característica indesejada em {path} foi ignorada!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "" +msgstr "Entrada \"%s\" duplicada na configuração de espelhos!" #: ../fdroidserver/lint.py #, python-brace-format @@ -668,7 +668,7 @@ msgstr "Erro ao obter o endereço do repo" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" +msgstr "Sair com um código diferente de zero se problemas forem encontrados" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" @@ -890,7 +890,7 @@ msgstr "A ignorar a entrada FUNDING.yml por mais de 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "" +msgstr "A ignorar o elemento mau no manifesto: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1105,7 +1105,7 @@ msgstr "Falta diretório de saída" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" +msgstr "A mover as declarações de características indesejadas para ficheiros localizados:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" @@ -1452,7 +1452,7 @@ msgstr "Executando o wget em {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "" +msgstr "O SHA-256 de {url} não corresponde à entrada!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." @@ -1879,7 +1879,7 @@ msgstr "Usando androguard de \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" -msgstr "" +msgstr "A utilizar um dicionário em branco em vez do conteúdo de {path}!" #: ../fdroidserver/init.py #, python-brace-format @@ -2388,7 +2388,7 @@ msgstr "a implementação do registo de processo {path} a {dest} falhou!" #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "" +msgstr "binária de referência sem assinatura" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2464,7 +2464,7 @@ msgstr "biblioteca estática" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "" +msgstr "o binário de referência fornecido tem o assinante permitido {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2588,9 +2588,9 @@ msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} deve ser um inteiro, encontrado: {value}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{build_flag} must be list or string, found: {value}" -msgstr "{build_flag} deve ser um inteiro, encontrado: {value}" +msgstr "{build_flag} deve ser uma lista ou uma cadeia de caracteres, encontrado: {value}" #: ../fdroidserver/metadata.py #, python-brace-format From 8ee10c949990226ed1a06318f5ada6b6a9601361 Mon Sep 17 00:00:00 2001 From: Kingo Bingo Date: Sat, 29 Jul 2023 03:12:11 +0200 Subject: [PATCH 1285/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Kingo Bingo Currently translated at 75.9% (419 of 552 strings) Co-authored-by: Kingo Bingo Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 3cde8dc5..1b17107f 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -26,20 +26,21 @@ # RainSlide , 2023. # Eric , 2023. # Max Xie , 2023. +# Kingo Bingo , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-05-26 19:39+0000\n" -"Last-Translator: Eric \n" +"PO-Revision-Date: 2023-07-24 09:51+0000\n" +"Last-Translator: Kingo Bingo \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.18-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -206,7 +207,7 @@ msgstr "'{path}' 执行失败!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "'{path}' 是无效格式, 它应该是字典!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format From 8acc82a11cb1de0fccdc1188952fcfc25063f82a Mon Sep 17 00:00:00 2001 From: Mirko Di Date: Sat, 29 Jul 2023 03:12:12 +0200 Subject: [PATCH 1286/2116] Translated using Weblate: Italian (it) by Mirko Di Currently translated at 96.3% (532 of 552 strings) Co-authored-by: Mirko Di Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ Translation: F-Droid/F-Droid Server --- locale/it/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 423f1878..5b5fcb1b 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -14,20 +14,21 @@ # Antonello Pirina , 2022. # Pixel-Tux , 2023. # Davide Neri , 2023. +# Mirko Di , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-06-26 20:58+0000\n" -"Last-Translator: Davide Neri \n" +"PO-Revision-Date: 2023-07-24 09:51+0000\n" +"Last-Translator: Mirko Di \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.18.1\n" +"X-Generator: Weblate 5.0-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -249,7 +250,7 @@ msgstr "Alias della chiave di firma del repository nel keystore" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "AllowedAPKSigningKeys mancante ma il riferimento binario è stato fornito" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" From 5f1740ebc82c6192779b0f7fcd88d73ef3a75791 Mon Sep 17 00:00:00 2001 From: Stephan Paternotte Date: Sat, 29 Jul 2023 03:12:12 +0200 Subject: [PATCH 1287/2116] Translated using Weblate: Dutch (nl) by Stephan Paternotte Currently translated at 3.6% (20 of 552 strings) Co-authored-by: Stephan Paternotte Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/nl/ Translation: F-Droid/F-Droid Server --- locale/nl/LC_MESSAGES/fdroidserver.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index 1e783ca0..1f369c82 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -2,20 +2,21 @@ # This file is put in the public domain. # Bart Groeneveld , 2020. # privacysimp , 2021. +# Stephan Paternotte , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2021-07-16 15:35+0000\n" -"Last-Translator: privacysimp \n" +"PO-Revision-Date: 2023-07-24 18:05+0000\n" +"Last-Translator: Stephan Paternotte \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7.2-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -335,9 +336,8 @@ msgid "Broken symlink: {path}" msgstr "" #: ../fdroidserver/__main__.py -#, fuzzy msgid "Build a package from source" -msgstr "Bouw een pakket vanaf de bron" +msgstr "Pakket van broncode bouwen" #: ../fdroidserver/build.py msgid "Build all applications available" @@ -386,7 +386,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" -msgstr "" +msgstr "Controleren op updates voor applicaties" #: ../fdroidserver/update.py #, python-brace-format From 348b4ac19b4eac6d5dfa8c7e3609660616c1fdc5 Mon Sep 17 00:00:00 2001 From: zhiqi Date: Sat, 29 Jul 2023 03:12:12 +0200 Subject: [PATCH 1288/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by zhiqi Currently translated at 76.4% (422 of 552 strings) Co-authored-by: zhiqi Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 1b17107f..d47bf86f 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -27,13 +27,14 @@ # Eric , 2023. # Max Xie , 2023. # Kingo Bingo , 2023. +# zhiqi , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-07-24 09:51+0000\n" -"Last-Translator: Kingo Bingo \n" +"PO-Revision-Date: 2023-07-27 17:07+0000\n" +"Last-Translator: zhiqi \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" @@ -261,7 +262,7 @@ msgstr "密钥库中存储库签名密钥的别名" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "缺少 AllowedAPKSigningKeys,但提供了参考二进制文件" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" @@ -309,7 +310,7 @@ msgstr "没找到 Android SDK 工具 {cmd}!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "应用程序具有二进制文件,但没有相应的AllowedAPKSigningKeys 来固定证书。" #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" @@ -322,7 +323,7 @@ msgstr "应用 在 '{repo}' 中, 但有一个链接到 {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "应用程序版本具有二进制文件,但没有相应的 AllowedAPKSigningKeys 来固定证书。" #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" From 8164f3d13fb168f1b27a392886d66c39f1dfb0e0 Mon Sep 17 00:00:00 2001 From: John Donne Date: Sat, 29 Jul 2023 03:12:13 +0200 Subject: [PATCH 1289/2116] Translated using Weblate: French (fr) by John Donne Currently translated at 99.0% (547 of 552 strings) Co-authored-by: John Donne Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index ea512f32..9127402f 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -33,22 +33,22 @@ # Translator , 2022, 2023. # Ldm Public , 2022, 2023. # TopFox , 2022. -# John Donne , 2022. +# John Donne , 2022, 2023. # Deleted User , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-06-09 18:48+0000\n" -"Last-Translator: Translator \n" +"PO-Revision-Date: 2023-07-29 01:12+0000\n" +"Last-Translator: John Donne \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.18-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -349,7 +349,7 @@ msgstr "AutoUpdateMode avec UpdateCheckMode : HTTP doit avoir un modèle." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "Mauvais type d'entrée \"{mirrortype}\" dans le paramétrage des miroirs : {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -640,12 +640,12 @@ msgstr "Échec lors du téléchargement de {url}. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "" +msgstr "La double déclaration d'une antifonction dans {path} a été ignorée !" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "" +msgstr "Entrée doublon \"%s\" dans le paramétrage des miroirs !" #: ../fdroidserver/lint.py #, python-brace-format @@ -698,7 +698,7 @@ msgstr "Erreur lors de l'obtention de l'adresse du dépôt" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" +msgstr "Quitter avec un code différent de zéro si des problèmes ont été détectés" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" @@ -1482,7 +1482,7 @@ msgstr "Exécution de wget dans {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "" +msgstr "Le SHA-256 de {url} ne correspond pas à l'entrée !" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." @@ -1911,7 +1911,7 @@ msgstr "Utiliser d’androguard à partir de \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" -msgstr "" +msgstr "Utilisation d'un dictionnaire vide plutôt que du contenu de {path} !" #: ../fdroidserver/init.py #, python-brace-format @@ -2620,9 +2620,9 @@ msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} doit être un entier, valeur trouvée : {value}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{build_flag} must be list or string, found: {value}" -msgstr "{build_flag} doit être un entier, valeur trouvée : {value}" +msgstr "{build_flag} doit être une liste ou une chaîne de caractères, valeur trouvée : {value}" #: ../fdroidserver/metadata.py #, python-brace-format From 1603f00ab4b96420eb919367cca74cd9b903177e Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Sun, 30 Jul 2023 19:18:38 +0000 Subject: [PATCH 1290/2116] Translated using Weblate: Spanish (es) by gallegonovato Currently translated at 97.8% (540 of 552 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ --- locale/es/LC_MESSAGES/fdroidserver.po | 44 +++++++++++++-------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 1be30540..d66c85c2 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -18,7 +18,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-06-20 20:50+0000\n" +"PO-Revision-Date: 2023-07-31 20:06+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" "Language: es\n" @@ -26,7 +26,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.18.1\n" +"X-Generator: Weblate 5.0-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -623,7 +623,7 @@ msgstr "¡Se ignoró la declaración duplicada de Anti-Feature en la {path}!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "" +msgstr "¡Entrada duplicada \"%s\"en la configuración de los espejos!" #: ../fdroidserver/lint.py #, python-brace-format @@ -824,14 +824,14 @@ msgid "Found {apkfilename} at {url}" msgstr "Se encontró {apkfilename} en {url}" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Found {count} problems in {filename}" -msgstr "El escáner encontró {count} problemas en {appid}:" +msgstr "Encontró {count} problemas en {filename}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" -msgstr "" +msgstr "Se encontraron {count} advertencias en {filename}" #: ../fdroidserver/update.py #, python-brace-format @@ -898,7 +898,7 @@ msgstr "Ignorando entrada en FUNDING.yml mayor de 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "" +msgstr "Ignorar el elemento incorrecto en el manifiesto: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -981,9 +981,9 @@ msgid "Invalid VercodeOperation: {field}" msgstr "VercodeOperation no válida: {field}" #: ../fdroidserver/lint.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" -msgstr "VercodeOperation no válida: {field}" +msgstr "VercodeOperation no válido: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format @@ -1113,7 +1113,7 @@ msgstr "Falta el directorio de salida" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" +msgstr "Moviendo las declaraciones de Anti-Features a los archivos localizados:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" @@ -1388,9 +1388,9 @@ msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfil msgstr "Falló lectura de packageName/versionCode/versionName, APK inválida: '{apkfilename}'" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" -msgstr "Falló lectura de packageName/versionCode/versionName, APK inválida: '{apkfilename}'" +msgstr "Error al leer packageName/versionCode/versionName,APK inválido: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format @@ -1460,7 +1460,7 @@ msgstr "Ejecutando wget en {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "" +msgstr "¡El SHA-256 de {url} no coincide con la entrada!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." @@ -1471,9 +1471,9 @@ msgid "Scan the source code of a package" msgstr "Escanear el código fuente de un paquete" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Scanner found {count} problems in {apk}" -msgstr "El escáner encontró {count} problemas en {appid}:" +msgstr "El escáner encontró {count} problemas en {apk}" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1802,7 +1802,7 @@ msgstr "UpdateCheckData tiene una URL no válida: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" -msgstr "" +msgstr "UpdateCheckData debe coincidir con el código de la versión como entero (\\d o [0-9]): {codeex}" #: ../fdroidserver/lint.py #, python-brace-format @@ -1817,7 +1817,7 @@ msgstr "UpdateCheckData tiene una URL no válida: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" +msgstr "UpdateCheckMode está configurado pero parece que checkupdates aún no se ha ejecutado" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -1887,7 +1887,7 @@ msgstr "Usando androguard de \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" -msgstr "" +msgstr "¡Usando un diccionario en blanco en lugar del contenido de la {path}!" #: ../fdroidserver/init.py #, python-brace-format @@ -2001,7 +2001,7 @@ msgstr "argumento \"-\" con modo %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" -msgstr "" +msgstr "argumento %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" @@ -2018,7 +2018,7 @@ msgstr "no se puede abrir '%(filename)s': %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" -msgstr "" +msgstr "no se puede abrir una url que no sea https: '{};" #: ../fdroidserver/build.py #, python-brace-format @@ -2067,9 +2067,9 @@ msgstr[0] "cadena de opción conflictiva: %s" msgstr[1] "cadenas de opción conflictivas: %s" #: /usr/lib/python3.11/argparse.py -#, fuzzy, python-format +#, python-format msgid "conflicting subparser alias: %s" -msgstr "cadena de opción conflictiva: %s" +msgstr "Alias de los subanalizadores en el conflicto:%s" #: /usr/lib/python3.11/argparse.py #, fuzzy, python-format From 3a5374be9dea07223a334de369abb56fb27de137 Mon Sep 17 00:00:00 2001 From: Translator Date: Sun, 30 Jul 2023 16:04:39 +0000 Subject: [PATCH 1291/2116] Translated using Weblate: French (fr) by Translator Currently translated at 100.0% (552 of 552 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ --- locale/fr/LC_MESSAGES/fdroidserver.po | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 9127402f..3cb250d7 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -40,8 +40,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-07-29 01:12+0000\n" -"Last-Translator: John Donne \n" +"PO-Revision-Date: 2023-07-31 20:06+0000\n" +"Last-Translator: Translator \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -449,7 +449,7 @@ msgstr "Sauvegarder les changements (commit)" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" +msgstr "Conflit des définitions « {field} » entre les fichiers .yml et ceux traduits :" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." @@ -920,7 +920,7 @@ msgstr "Ignorer l'entrée FUNDING.yml supérieure à 2048 : %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "" +msgstr "Un mauvais élément du manifest est ignoré : %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1135,7 +1135,7 @@ msgstr "Répertoire de destination manquant" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" +msgstr "Déplacement des déclarations des antifonctions vers les fichiers de traduction :" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" @@ -2420,7 +2420,7 @@ msgstr "le déploiement du journal du processus {path} vers {dest} a echoué !" #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "" +msgstr "signature manquante du fichier binaire de référence" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2496,7 +2496,7 @@ msgstr "librairie statique" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "" +msgstr "le fichier binaire de référence fourni a autorisé le signataire {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py From 1fe77bb34fb824f25f6ffe5ff84b68e50a90e6ea Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Mon, 31 Jul 2023 20:44:22 +0000 Subject: [PATCH 1292/2116] Translated using Weblate: Spanish (es) by gallegonovato Currently translated at 100.0% (552 of 552 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ --- locale/es/LC_MESSAGES/fdroidserver.po | 33 ++++++++++++--------------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index d66c85c2..fdd4f76b 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -18,7 +18,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-07-31 20:06+0000\n" +"PO-Revision-Date: 2023-08-01 21:07+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" "Language: es\n" @@ -676,7 +676,7 @@ msgstr "Error al obtener la dirección del repositorio" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" +msgstr "Salir con un código distinto de cero si se encontraron problemas" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" @@ -2072,9 +2072,9 @@ msgid "conflicting subparser alias: %s" msgstr "Alias de los subanalizadores en el conflicto:%s" #: /usr/lib/python3.11/argparse.py -#, fuzzy, python-format +#, python-format msgid "conflicting subparser: %s" -msgstr "cadena de opción conflictiva: %s" +msgstr "subanalizador del conflictivo:%s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2117,14 +2117,12 @@ msgid "dest= is required for options like %r" msgstr "las opciones como %r requieren dest =" #: ../fdroidserver/scanner.py -#, fuzzy msgid "downloading '{}'" -msgstr "Descargando %s" +msgstr "Descargando '{}'" #: ../fdroidserver/scanner.py -#, fuzzy msgid "downloading scanner signatures from '{}' failed" -msgstr "Quitando firma misteriosa de {apkfilename}" +msgstr "la descarga del escaneo de la firma para '{}' falló" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" @@ -2163,7 +2161,7 @@ msgstr "fdroid [] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" -msgstr "" +msgstr "obtener la última versión de las firmas de la web" #: /usr/lib/python3.11/optparse.py msgid "floating-point" @@ -2232,7 +2230,7 @@ msgstr "cadena de opciones %(option)r no válida: tiene que comenzar por un car #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" -msgstr "" +msgstr "ipfs_cid no encontrado, omitiendo la generación de CIDv1" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -2266,7 +2264,7 @@ msgstr "los argumentos mutuamente exclusivos tienen que ser opcionales" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" -msgstr "" +msgstr "la próxima actualización de la caché de {name} tendrá lugar después de {time}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2377,9 +2375,8 @@ msgid "optional arguments" msgstr "argumentos opcionales" #: /usr/lib/python3.11/argparse.py -#, fuzzy msgid "options" -msgstr "Opciones" +msgstr "opciones" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2399,7 +2396,7 @@ msgstr "¡Falló el despliegue del registro de proceso {path} en {dest}!" #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "" +msgstr "falta la firma del archivo binario de referencia" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2427,7 +2424,7 @@ msgstr "s3cmd sync indexa {path} a {url} y elimina" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" -msgstr "" +msgstr "¡El escaner de la cache está mal realizado! Puedes borrarlo con: '{clear}'" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2475,7 +2472,7 @@ msgstr "biblioteca estática" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "" +msgstr "el archivo binario de referencia ha proporcionado autorización al firmante {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2599,9 +2596,9 @@ msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} tiene que ser un entero pero se ha encontrado: {value}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{build_flag} must be list or string, found: {value}" -msgstr "{build_flag} tiene que ser un entero pero se ha encontrado: {value}" +msgstr "{build_flag} debe ser una lista o una cadena, encontrada: {value}" #: ../fdroidserver/metadata.py #, python-brace-format From 84839b591406be09a571e533efbc3849b1a1bb12 Mon Sep 17 00:00:00 2001 From: coronabond Date: Thu, 3 Aug 2023 15:59:29 +0000 Subject: [PATCH 1293/2116] Translated using Weblate: Italian (it) by coronabond Currently translated at 96.3% (532 of 552 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ --- locale/it/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 5b5fcb1b..ec9cf27c 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -15,13 +15,14 @@ # Pixel-Tux , 2023. # Davide Neri , 2023. # Mirko Di , 2023. +# coronabond , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-07-24 09:51+0000\n" -"Last-Translator: Mirko Di \n" +"PO-Revision-Date: 2023-08-03 16:33+0000\n" +"Last-Translator: coronabond \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" @@ -2424,7 +2425,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "shared library" -msgstr "biblioteca condivisa" +msgstr "libreria condivisa" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2463,7 +2464,7 @@ msgstr "srclibs manca il nome e/o @" #: ../fdroidserver/scanner.py msgid "static library" -msgstr "biblioteca statica" +msgstr "libreria statica" #: ../fdroidserver/build.py #, python-brace-format From fb36179919492c76ee594f07afeaeff2ab52f9d2 Mon Sep 17 00:00:00 2001 From: The Cats Date: Sun, 6 Aug 2023 17:20:30 +0000 Subject: [PATCH 1294/2116] Translated using Weblate: Portuguese (Brazil) (pt_BR) by The Cats Currently translated at 96.9% (535 of 552 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/ --- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 65832b09..9053a45b 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -14,7 +14,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-07-09 13:51+0000\n" +"PO-Revision-Date: 2023-08-07 17:51+0000\n" "Last-Translator: The Cats \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" @@ -894,7 +894,7 @@ msgstr "Ignorando entrada de FUNDING.yml maior que 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "" +msgstr "Ignorando o elemento mau no manifesto: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " From c26f0d0da85bb2aacebe95ce6751fc6ad7741e57 Mon Sep 17 00:00:00 2001 From: HM Date: Mon, 7 Aug 2023 22:40:06 +0000 Subject: [PATCH 1295/2116] Translated using Weblate: Persian (fa) by HM Currently translated at 7.7% (43 of 552 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fa/ --- locale/fa/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index ef8e4bbc..b407093e 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -3,20 +3,21 @@ # This file is distributed under the same license as the PACKAGE package. # Mostafa Ahangarha , 2020. # Danial Behzadi , 2021. +# HM , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2021-07-27 15:49+0000\n" -"Last-Translator: Danial Behzadi \n" +"PO-Revision-Date: 2023-08-08 22:56+0000\n" +"Last-Translator: HM \n" "Language-Team: Persian \n" "Language: fa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.7.2-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -927,7 +928,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" -msgstr "" +msgstr "نصب بسته های ساخته شده روی دستگاه ها" #: ../fdroidserver/install.py #, python-format From 3761e3368ce880b8deaf955c0e64be77694a9cf7 Mon Sep 17 00:00:00 2001 From: Simona Iacob Date: Wed, 9 Aug 2023 17:13:33 +0000 Subject: [PATCH 1296/2116] Translated using Weblate: Romanian (ro) by Simona Iacob Currently translated at 95.1% (525 of 552 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ro/ --- locale/ro/LC_MESSAGES/fdroidserver.po | 36 +++++++++++++-------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 5b808e68..b60e12d4 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -2,22 +2,22 @@ # This file is put in the public domain. # Daniel Șerbănescu , 2021. # Christian Eichert , 2021. -# Simona Iacob , 2021, 2022. +# Simona Iacob , 2021, 2022, 2023. # Licaon Kter , 2021, 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2022-09-08 14:15+0000\n" -"Last-Translator: Licaon Kter \n" +"PO-Revision-Date: 2023-08-10 18:46+0000\n" +"Last-Translator: Simona Iacob \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 5.0-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -119,12 +119,12 @@ msgstr "%r nu este apelabil" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" -msgstr "" +msgstr "%s nu a produs un text!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" -msgstr "" +msgstr "%s are un SHA-256 greșit: %s" #: ../fdroidserver/lint.py #, python-format @@ -186,7 +186,7 @@ msgstr "'{path}' nu a reușit să se execute!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "'{path}' are un format invalid, ar trebui să fie un dicționar!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format @@ -194,9 +194,9 @@ msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' nu este valid {field} în {appid}. Regex model: {pattern}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "'{value}' nu este valid {field} în {appid}. Regex model: {pattern}" +msgstr "'{valoare}' nu este un {câmp} valid, ar trebui să fie {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -240,7 +240,7 @@ msgstr "Alias al cheii de semnare repo din magazinul de chei" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "AllowedAPKSigningKeys lipsește, dar este furnizat un binar de referință" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" @@ -288,11 +288,11 @@ msgstr "Instrumentul Android SDK {cmd} nu a fost găsit!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "Aplicația are binare, dar nu are AllowedAPKSigningKeys corespunzătoare pentru a fixa certificatul." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" +msgstr "App are NoSourceSince sau ArchivePolicy \"0 versions\" dar AutoUpdateMode sau UpdateCheckMode nu sunt None" #: ../fdroidserver/lint.py #, python-brace-format @@ -301,7 +301,7 @@ msgstr "Aplicația se află în '{repo}', dar are un link către {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "Versiunea aplicației are o versiune binară, dar nu are AllowedAPKSigningKeys corespunzătoare pentru a fixa certificatul." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -824,7 +824,7 @@ msgstr "Scanerul a găsit {count} probleme în {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" -msgstr "" +msgstr "Am găsit {count} avertismente în {filename}" #: ../fdroidserver/update.py #, python-brace-format @@ -891,7 +891,7 @@ msgstr "Ignorarea intrării FUNDING.yml mai lungă de 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "" +msgstr "Ignorarea elementului greșit din manifest: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -974,9 +974,9 @@ msgid "Invalid VercodeOperation: {field}" msgstr "VercodeOperation invalid: {field}" #: ../fdroidserver/lint.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" -msgstr "VercodeOperation invalid: {field}" +msgstr "VercodeOperation invalidă: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format @@ -1106,7 +1106,7 @@ msgstr "Lipsește directorul de ieșire" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" +msgstr "Mutarea declarațiilor Anti-Features în fișierele localizate:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" From 95e85c2a8656cf9256ddc5c3051540690be850a7 Mon Sep 17 00:00:00 2001 From: The Cats Date: Thu, 17 Aug 2023 15:00:29 +0000 Subject: [PATCH 1297/2116] Translated using Weblate: Portuguese (Brazil) (pt_BR) by The Cats Currently translated at 100.0% (552 of 552 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/ --- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 45 +++++++++++------------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 9053a45b..7362ddc1 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -14,7 +14,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-08-07 17:51+0000\n" +"PO-Revision-Date: 2023-08-18 15:51+0000\n" "Last-Translator: The Cats \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" @@ -1798,7 +1798,7 @@ msgstr "UpdateCheckData tem URL inválido: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" -msgstr "" +msgstr "UpdateCheckData deve corresponder ao código da versão como número inteiro (\\d ou [0-9]): {codeex}" #: ../fdroidserver/lint.py #, python-brace-format @@ -1813,7 +1813,7 @@ msgstr "UpdateCheckData não é uma URL válida: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" +msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -1883,7 +1883,7 @@ msgstr "Usando androguard de \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" -msgstr "" +msgstr "Usando um dicionário em branco em vez do conteúdo de {path}!" #: ../fdroidserver/init.py #, python-brace-format @@ -1997,7 +1997,7 @@ msgstr "argumento \"-\" com o modo %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" -msgstr "" +msgstr "argumento %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" @@ -2014,7 +2014,7 @@ msgstr "não é possível abrir '%(filename)s': %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" -msgstr "" +msgstr "não é possível abrir a url não-https: '{};" #: ../fdroidserver/build.py #, python-brace-format @@ -2063,14 +2063,14 @@ msgstr[0] "opção conflitante na string: %s" msgstr[1] "opções conflitantes nas strings: %s" #: /usr/lib/python3.11/argparse.py -#, fuzzy, python-format +#, python-format msgid "conflicting subparser alias: %s" -msgstr "opção conflitante na string: %s" +msgstr "alias de subanalizador conflitante: %s" #: /usr/lib/python3.11/argparse.py -#, fuzzy, python-format +#, python-format msgid "conflicting subparser: %s" -msgstr "opção conflitante na string: %s" +msgstr "subanalizador conflitante: %s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2113,14 +2113,12 @@ msgid "dest= is required for options like %r" msgstr "dest = é necessário para opções como %r" #: ../fdroidserver/scanner.py -#, fuzzy msgid "downloading '{}'" -msgstr "Baixando %s" +msgstr "baixando '{}'" #: ../fdroidserver/scanner.py -#, fuzzy msgid "downloading scanner signatures from '{}' failed" -msgstr "Descarnar a assinatura misteriosa a partir do {apkfilename}" +msgstr "o download de assinaturas de scanner de '{}' falhou" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" @@ -2159,7 +2157,7 @@ msgstr "fdroid [] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" -msgstr "" +msgstr "obter a versão de assinaturas mais recente da Web" #: /usr/lib/python3.11/optparse.py msgid "floating-point" @@ -2228,7 +2226,7 @@ msgstr "Opção cadeia %(option)r inválida: deve começar com o caractere %(pre #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" -msgstr "" +msgstr "ipfs_cid não encontrado, omitindo a geração de CIDv1" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -2262,7 +2260,7 @@ msgstr "argumentos mutuamente exclusivos devem ser opcional" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" -msgstr "" +msgstr "próxima atualização do cache {name} prevista para {time}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2373,9 +2371,8 @@ msgid "optional arguments" msgstr "argumentos opcionais" #: /usr/lib/python3.11/argparse.py -#, fuzzy msgid "options" -msgstr "Opções" +msgstr "opções" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2395,7 +2392,7 @@ msgstr "houve uma falha no registro de processo implantação {path} para {dest} #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "" +msgstr "falta assinatura no binário de referência" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2423,7 +2420,7 @@ msgstr "s3cmd sincroniza índices {path} para {url} e exclui" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" -msgstr "" +msgstr "o cache do scanner está malformado! Você pode limpá-lo com: '{clear}'" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2471,7 +2468,7 @@ msgstr "biblioteca estática" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "" +msgstr "o binário de referência fornecido autorizou o signatário {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2595,9 +2592,9 @@ msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} deve ser um número inteiro, encontrado: {value}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{build_flag} must be list or string, found: {value}" -msgstr "{build_flag} deve ser um número inteiro, encontrado: {value}" +msgstr "{build_flag} deve ser uma lista ou uma cadeia de caracteres, encontrado: {value}" #: ../fdroidserver/metadata.py #, python-brace-format From 36cadf0103c078f478ace603f878800d246b97fd Mon Sep 17 00:00:00 2001 From: Random Date: Sun, 3 Sep 2023 09:10:16 +0000 Subject: [PATCH 1298/2116] Translated using Weblate: Italian (it) by Random Currently translated at 96.5% (533 of 552 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ --- locale/it/LC_MESSAGES/fdroidserver.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index ec9cf27c..d8a9e609 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -16,20 +16,21 @@ # Davide Neri , 2023. # Mirko Di , 2023. # coronabond , 2023. +# Random , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-08-03 16:33+0000\n" -"Last-Translator: coronabond \n" +"PO-Revision-Date: 2023-09-04 09:55+0000\n" +"Last-Translator: Random \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.0-dev\n" +"X-Generator: Weblate 5.0.1-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -299,7 +300,7 @@ msgstr "Strumento Android SDK {cmd} non trovato!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "L'app ha Binaries ma non ha AllowedAPKSigningKeys corrispondente per fissare il certificato." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" @@ -350,7 +351,7 @@ msgstr "Branch \"{branch}\" usata come commit in srclib \"{srclib}\"" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" -msgstr "Collegamento simbolico interrotto: {path}" +msgstr "Collegamento simbolico orfano: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" From e2ba75aa51714f3c7db20a42ac83eb93df1f8ba6 Mon Sep 17 00:00:00 2001 From: Random Date: Wed, 6 Sep 2023 08:59:55 +0000 Subject: [PATCH 1299/2116] Translated using Weblate: Italian (it) by Random Currently translated at 96.7% (534 of 552 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ --- locale/it/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index d8a9e609..08987c19 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -22,7 +22,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-09-04 09:55+0000\n" +"PO-Revision-Date: 2023-09-06 09:00+0000\n" "Last-Translator: Random \n" "Language-Team: Italian \n" "Language: it\n" @@ -902,7 +902,7 @@ msgstr "Ignorando la voce FUNDING.yml più lunga di 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "" +msgstr "Ignorato elemento errato nel manifest: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " From 376209dcca2474f7e0c9c0949f16d0b84ca1a640 Mon Sep 17 00:00:00 2001 From: Random Date: Wed, 6 Sep 2023 09:13:55 +0000 Subject: [PATCH 1300/2116] Translated using Weblate: Italian (it) by Random Currently translated at 100.0% (552 of 552 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ --- locale/it/LC_MESSAGES/fdroidserver.po | 50 +++++++++++++++------------ 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 08987c19..24218448 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -22,7 +22,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-09-06 09:00+0000\n" +"PO-Revision-Date: 2023-09-06 17:31+0000\n" "Last-Translator: Random \n" "Language-Team: Italian \n" "Language: it\n" @@ -304,7 +304,7 @@ msgstr "L'app ha Binaries ma non ha AllowedAPKSigningKeys corrispondente per fis #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" +msgstr "L'app ha NoSourceSince o ArchivePolicy \"0 versioni\" ma AutoUpdateMode o UpdateCheckMode non sono None" #: ../fdroidserver/lint.py #, python-brace-format @@ -313,7 +313,7 @@ msgstr "L'app è in \"{repo}\" ma ha un collegamento a {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "La versione dell'app ha il file binario ma non ha un AllowedAPKSigningKeys corrispondente per fissare il certificato." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -326,7 +326,7 @@ msgstr "Archiviando {apkfilename} con una firma invalida!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." -msgstr "" +msgstr "AutoUpdateMode con UpdateCheckMode: HTTP deve avere uno schema." #: ../fdroidserver/index.py #, python-brace-format @@ -1464,7 +1464,7 @@ msgstr "Esecuzione di wget in {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "" +msgstr "Lo SHA-256 di {url} non corrisponde alla voce!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." @@ -1670,6 +1670,13 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" +"Per completare la configurazione, aggiungi i tuoi APKs a \"%s\",\n" +"poi esegui \"fdroid update -c; fdroid update\". Puoi anche modificare\n" +"\"config.yml\" per impostare URL, nome del repo e altro. Dovresti anche creare\n" +"una chiave di firma (ne può essere stata generata una temporanea in automatico).\n" +"\n" +"Per altre info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"e https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -1799,7 +1806,7 @@ msgstr "UpdateCheckData ha un URL non valido: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" -msgstr "" +msgstr "UpdateCheckData deve corrispondere al codice di versione come intero (\\d o [0-9]): {codeex}" #: ../fdroidserver/lint.py #, python-brace-format @@ -1814,7 +1821,7 @@ msgstr "UpdateCheckData non è un URL valido: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" +msgstr "UpdateCheckMode impostato ma sembra che checkupdates non sia ancora stato eseguito" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -1884,7 +1891,7 @@ msgstr "Usando androguard da \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" -msgstr "" +msgstr "Utilizzo di un dizionario vuoto al posto del contenuto di {path}!" #: ../fdroidserver/init.py #, python-brace-format @@ -1998,7 +2005,7 @@ msgstr "argomento \" -\" con la modalità %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" -msgstr "" +msgstr "argomento %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" @@ -2015,7 +2022,7 @@ msgstr "impossibile aprire '%(filename)s': %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" -msgstr "" +msgstr "impossibile aprire l'url non-https: '{};" #: ../fdroidserver/build.py #, python-brace-format @@ -2064,14 +2071,14 @@ msgstr[0] "stringa di opzioni in conflitto: %s" msgstr[1] "stringhe di opzioni in conflitto: %s" #: /usr/lib/python3.11/argparse.py -#, fuzzy, python-format +#, python-format msgid "conflicting subparser alias: %s" -msgstr "stringa di opzioni in conflitto: %s" +msgstr "alias subparser in conflitto: %s" #: /usr/lib/python3.11/argparse.py -#, fuzzy, python-format +#, python-format msgid "conflicting subparser: %s" -msgstr "stringa di opzioni in conflitto: %s" +msgstr "subparser in conflitto: %s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2118,9 +2125,8 @@ msgid "downloading '{}'" msgstr "scaricando '{}'" #: ../fdroidserver/scanner.py -#, fuzzy msgid "downloading scanner signatures from '{}' failed" -msgstr "Riduzione della firma misteriosa da {apkfilename}" +msgstr "scaricamento delle firme dello scanner da '{}' fallito" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" @@ -2228,12 +2234,12 @@ msgstr "stringa di opzioni non valida %(option)r: deve iniziare con un carattere #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" -msgstr "" +msgstr "ipfs_cid non trovato, salto la generazione di CIDv1" #: ../fdroidserver/checkupdates.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "ultima ricetta di costruzione è più recente: vecchio vercode={old}, nuovo vercode={new}" +msgstr "l'ultima ricetta di compilazione è più recente: vecchio vercode={old}, nuovo vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2394,7 +2400,7 @@ msgstr "processo log deploy {path} a {dest} fallito!" #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "" +msgstr "binario di riferimento senza firma" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2422,7 +2428,7 @@ msgstr "s3cmd sincronizza gli indici {path} con {url} e cancella" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" -msgstr "" +msgstr "la cache dello scanner è malformata! Puoi svuotarla con: '{clear}'" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2470,7 +2476,7 @@ msgstr "libreria statica" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "" +msgstr "il binario di riferimento fornito ha il firmatario autorizzato {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py From edfe52a5ebff3fe5b77863fbaaa8bfcea89ad0ec Mon Sep 17 00:00:00 2001 From: Bai Date: Fri, 8 Sep 2023 10:03:37 +0000 Subject: [PATCH 1301/2116] Translated using Weblate: Turkish (tr) by Bai Currently translated at 100.0% (552 of 552 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/tr/ --- locale/tr/LC_MESSAGES/fdroidserver.po | 45 ++++++++++++++------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index 52abeba5..4f65d21e 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -3,20 +3,21 @@ # Oğuz Ersen , 2020, 2021, 2022. # Orhan , 2021. # Oğuz Ersen , 2022, 2023. +# Bai , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-02-26 21:02+0000\n" -"Last-Translator: Oğuz Ersen \n" +"PO-Revision-Date: 2023-09-09 10:53+0000\n" +"Last-Translator: Bai \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.16-dev\n" +"X-Generator: Weblate 5.0.1-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -184,7 +185,7 @@ msgstr "'{path}' yürütülemedi!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "'{path}' geçersiz biçime sahip, bir sözlük olmalı!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format @@ -192,9 +193,9 @@ msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' {appid} içinde geçerli {field} değil. Regex ifadesi: {pattern}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "'{value}' {appid} içinde geçerli {field} değil. Regex ifadesi: {pattern}" +msgstr "'{value}' geçerli bir {field} değil, {pattern} olmalı" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -238,7 +239,7 @@ msgstr "Depo imzalama anahtarının anahtar deposundaki takma adı" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "AllowedAPKSigningKeys eksik ancak referans ikili dosyası sağlandı" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" @@ -286,7 +287,7 @@ msgstr "Android SDK aracı {cmd} bulunamadı!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "Uygulama İkili Dosyalara sahip ancak sertifikayı sabitlemek için karşılık gelen AllowedAPKSigningKeys'e sahip değil." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" @@ -299,7 +300,7 @@ msgstr "Uygulama '{repo}' içinde ancak {url} adresine bir bağlantısı var" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "Uygulama sürümü ikili dosyaya sahip ancak sertifikayı sabitlemek için karşılık gelen AllowedAPKSigningKeys'e sahip değil." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -317,7 +318,7 @@ msgstr "UpdateCheckMode ile AutoUpdateMode: HTTP bir desene sahip olmalıdır." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "Aynalar yapılandırmasında hatalı giriş türü \"{mirrortype}\": {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -417,7 +418,7 @@ msgstr "Değişiklikleri işle" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" +msgstr ".yml ve yerelleştirilmiş dosyalar arasında çakışan \"{field}\" tanımları:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." @@ -608,12 +609,12 @@ msgstr "{url} indirme başarısız. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "" +msgstr "{path} adresindeki yinelenen Anti-Özellik bildirimi göz ardı edildi!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "" +msgstr "Aynalar yapılandırmasında yinelenen \"%s\" girişi!" #: ../fdroidserver/lint.py #, python-brace-format @@ -666,7 +667,7 @@ msgstr "Depo adresi alınırken hata" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" +msgstr "Sorun bulunursa sıfır olmayan bir kodla çıkın" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" @@ -888,7 +889,7 @@ msgstr "2048'den uzun FUNDING.yml girdisi yok sayılıyor: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "" +msgstr "Manifestteki hatalı öğe yok sayılıyor: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1103,7 +1104,7 @@ msgstr "Eksik çıktı dizini" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" +msgstr "Anti-Özellik bildirimlerinin yerelleştirilmiş dosyalara taşınıyor:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" @@ -1450,7 +1451,7 @@ msgstr "{path} konumunda wget çalıştırılıyor" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "" +msgstr "{url}'nin SHA-256'sı girişle eşleşmiyor!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." @@ -1877,7 +1878,7 @@ msgstr "\"{path}\" adresinden androguard'ı kullanıyor" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" -msgstr "" +msgstr "{path} içeriği yerine boş sözlük kullanılıyor!" #: ../fdroidserver/init.py #, python-brace-format @@ -2386,7 +2387,7 @@ msgstr "{path} işlem günlüğünü {dest}'e dağıtma başarısız oldu!" #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "" +msgstr "referans ikili eksik imza" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2462,7 +2463,7 @@ msgstr "statik kütüphane" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "" +msgstr "sağlanan referans ikilisi {signer} imzalayana izin verdi" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2586,9 +2587,9 @@ msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} bir tam sayı olmalıdır, bulunan: {value}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{build_flag} must be list or string, found: {value}" -msgstr "{build_flag} bir tam sayı olmalıdır, bulunan: {value}" +msgstr "{build_flag} liste veya dize olmalıdır, bulunan: {value}" #: ../fdroidserver/metadata.py #, python-brace-format From 5dd325941c282443e590683f8cae5539bc7e8951 Mon Sep 17 00:00:00 2001 From: Xiang Heng Wei Date: Mon, 11 Sep 2023 14:12:14 +0000 Subject: [PATCH 1302/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Xiang Heng Wei Currently translated at 79.5% (439 of 552 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 40 +++++++++++----------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index d47bf86f..70892748 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -33,15 +33,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-07-27 17:07+0000\n" -"Last-Translator: zhiqi \n" +"PO-Revision-Date: 2023-09-11 17:39+0000\n" +"Last-Translator: Xiang Heng Wei \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.0-dev\n" +"X-Generator: Weblate 5.0.1-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -336,12 +336,12 @@ msgstr "正使用无效签名归档 {apkfilename}!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." -msgstr "" +msgstr "AutoUpdateMode 和 UpdateCheckMode:HTTP 必须有一个模式。" #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "镜像配置中的错误条目类型“{mirrortype}”:{mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -440,7 +440,7 @@ msgstr "提交更改" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" +msgstr ".yml 和本地化文件之间的“{field}”定义冲突:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." @@ -631,12 +631,12 @@ msgstr "{url} 下载失败。{error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "" +msgstr "{path} 处的重复负面特征声明被忽略!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "" +msgstr "镜像配置中的重复条目“%s”!" #: ../fdroidserver/lint.py #, python-brace-format @@ -689,7 +689,7 @@ msgstr "获取存储库地址时出错" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" +msgstr "如果发现问题,则以非零代码退出" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" @@ -911,7 +911,7 @@ msgstr "忽略超过 2048 的 FUNDING.yml 条目:%s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "" +msgstr "忽略清单中的错误元素: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1126,7 +1126,7 @@ msgstr "缺少输出目录" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" +msgstr "将负面特征声明移动到本地化文件:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" @@ -1473,7 +1473,7 @@ msgstr "在 {path} 中运行 wget" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "" +msgstr "{url} 的 SHA-256 与条目不匹配!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." @@ -1776,27 +1776,27 @@ msgstr "发现不支持的图形文件:{path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" -msgstr "" +msgstr "%s 处未使用的扩展库" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" -msgstr "" +msgstr "%s 处未使用的文件" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" -msgstr "" +msgstr "未使用的扫描删除路径: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" -msgstr "" +msgstr "未使用的扫描忽略路径: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "解压缩到 %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -1809,12 +1809,12 @@ msgstr "更新 URL 的二进制透明度日志" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" -msgstr "" +msgstr "UpdateCheckData 具有无效的 URL:{url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" -msgstr "" +msgstr "UpdateCheckData 必须以整数(\\d 或 [0-9])的形式匹配版本代码:{codeex}" #: ../fdroidserver/lint.py #, python-brace-format @@ -1824,7 +1824,7 @@ msgstr "UpdateCheckData必须使用HTTPS URL:{url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" -msgstr "" +msgstr "UpdateCheckData 不是有效的网址:{url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py From a2f9ca4bf47267866b78844450132c69ec6c46ca Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Wed, 20 Sep 2023 07:15:10 +0000 Subject: [PATCH 1303/2116] Translated using Weblate: Hebrew (he) by Yaron Shahrabani Currently translated at 4.5% (25 of 552 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/he/ --- locale/he/LC_MESSAGES/fdroidserver.po | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/locale/he/LC_MESSAGES/fdroidserver.po b/locale/he/LC_MESSAGES/fdroidserver.po index 0e42e85a..dd56a66d 100644 --- a/locale/he/LC_MESSAGES/fdroidserver.po +++ b/locale/he/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-01-24 13:51+0000\n" +"PO-Revision-Date: 2023-09-21 08:05+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" "Language: he\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 4.16-dev\n" +"X-Generator: Weblate 5.1-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -107,7 +107,7 @@ msgstr "%prog [אפשרויות]" #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" -msgstr "" +msgstr "אי אפשר לקרוא ל־%r" #: ../fdroidserver/signindex.py #, python-format @@ -200,7 +200,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" -msgstr "" +msgstr "‎.__call__()‎ לא מוגדר" #: ../fdroidserver/lint.py msgid "/issues is missing" @@ -336,7 +336,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Build a package from source" -msgstr "" +msgstr "בניית חבילה מקוד מקור" #: ../fdroidserver/build.py msgid "Build all applications available" @@ -385,7 +385,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" -msgstr "" +msgstr "איתור עדכונים ליישומונים" #: ../fdroidserver/update.py #, python-brace-format @@ -513,7 +513,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "" +msgstr "מחיקת קובצי APK ו/או OBB ללא נתוני העל מהמאגר" #: ../fdroidserver/deploy.py #, python-brace-format @@ -926,7 +926,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" -msgstr "" +msgstr "התקנת חבילות שנבנו על מכשירים" #: ../fdroidserver/install.py #, python-format @@ -940,7 +940,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" -msgstr "" +msgstr "תפעול שרת ה־HTTP של המאגר" #: ../fdroidserver/update.py msgid "Invalid APK" @@ -1352,11 +1352,11 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" -msgstr "" +msgstr "פתיחת מאגר חדש במהירות" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" -msgstr "" +msgstr "לקרוא את כל קובצי נתוני העל ולצאת" #: ../fdroidserver/common.py #, python-brace-format @@ -2349,7 +2349,6 @@ msgid "optional arguments" msgstr "משתני רשות" #: /usr/lib/python3.11/argparse.py -#, fuzzy msgid "options" msgstr "אפשרויות" @@ -2409,7 +2408,7 @@ msgstr "" #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" -msgstr "" +msgstr "להציג את מספר הגרסה של התוכנית ולצאת" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py From d6187679b6afbdb5cf746b4f5ec50e1fbe8121e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20D=C3=BCster?= Date: Fri, 22 Sep 2023 09:37:33 +0200 Subject: [PATCH 1304/2116] locale/ro: Fix template string --- locale/ro/LC_MESSAGES/fdroidserver.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index b60e12d4..82a77e36 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -196,7 +196,7 @@ msgstr "'{value}' nu este valid {field} în {appid}. Regex model: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "'{valoare}' nu este un {câmp} valid, ar trebui să fie {pattern}" +msgstr "'{value}' nu este un {field} valid, ar trebui să fie {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format From 49c415424d97fe13b42710b93686efa716123a04 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 22 Sep 2023 12:50:05 +0200 Subject: [PATCH 1305/2116] Ignore encoding errors in logs Found while compiling io.privatestorage.privatestoragemobile_9: Traceback (most recent call last): File "/home/fdroid/fdroidserver/fdroidserver/build.py", line 1053, in main if trybuild(app, build, build_dir, output_dir, log_dir, File "/home/fdroid/fdroidserver/fdroidserver/build.py", line 813, in trybuild build_server(app, build, vcs, build_dir, output_dir, log_dir, force) File "/home/fdroid/fdroidserver/fdroidserver/build.py", line 253, in build_server logging.debug("buildserver > " + str(line, 'utf-8').rstrip()) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfa in position 8: invalid start byte --- fdroidserver/build.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 71fd20bc..b30ea509 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -250,13 +250,13 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): line = cmd_stdout.readline() if line: if options.verbose: - logging.debug("buildserver > " + str(line, 'utf-8').rstrip()) + logging.debug("buildserver > " + str(line, 'utf-8', 'replace').rstrip()) output += line else: time.sleep(0.05) for line in cmd_stdout.readlines(): if options.verbose: - logging.debug("buildserver > " + str(line, 'utf-8').rstrip()) + logging.debug("buildserver > " + str(line, 'utf-8', 'replace').rstrip()) output += line finally: cmd_stdout.close() @@ -270,7 +270,7 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): else: message = "Build.py failed on server for {0}:{1}" raise BuildException(message.format(app.id, build.versionName), - str(output, 'utf-8')) + str(output, 'utf-8', 'replace')) # Retreive logs... toolsversion_log = common.get_toolsversion_logname(app, build) @@ -296,7 +296,7 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): except Exception as exc: raise BuildException( "Build failed for {0}:{1} - missing output files".format( - app.id, build.versionName), str(output, 'utf-8')) from exc + app.id, build.versionName), str(output, 'utf-8', 'replace')) from exc ftp.close() finally: From 2a33567577f1d17868240159a52ce8537f60dc40 Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Mon, 9 Oct 2023 11:42:39 +0000 Subject: [PATCH 1306/2116] Gradle 8.4 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 9211c8ee..438a5778 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -193,6 +193,7 @@ get_sha() { '8.2') echo '38f66cd6eef217b4c35855bb11ea4e9fbc53594ccccb5fb82dfd317ef8c2c5a3' ;; '8.2.1') echo '03ec176d388f2aa99defcadc3ac6adf8dd2bce5145a129659537c0874dea5ad1' ;; '8.3') echo '591855b517fc635b9e04de1d05d5e76ada3f89f5fc76f87978d1b245b4f69225' ;; + '8.4') echo '3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae' ;; *) exit 1 esac } @@ -213,7 +214,7 @@ d_gradle_plugin_ver_k=(8.3 8.2 8.1 8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3 d_plugin_min_gradle_v=(8.3 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 1ddc448f1562ac88026fac8a159884369b6c5439 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Tue, 10 Oct 2023 07:19:29 +0000 Subject: [PATCH 1307/2116] gradle v8.4 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 438a5778..aeaedf26 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -185,6 +185,7 @@ get_sha() { '7.6') echo '7ba68c54029790ab444b39d7e293d3236b2632631fb5f2e012bb28b4ff669e4b' ;; '7.6.1') echo '6147605a23b4eff6c334927a86ff3508cb5d6722cd624c97ded4c2e8640f1f87' ;; '7.6.2') echo 'a01b6587e15fe7ed120a0ee299c25982a1eee045abd6a9dd5e216b2f628ef9ac' ;; + '7.6.3') echo '740c2e472ee4326c33bf75a5c9f5cd1e69ecf3f9b580f6e236c86d1f3d98cfac' ;; '8.0') echo '4159b938ec734a8388ce03f52aa8f3c7ed0d31f5438622545de4f83a89b79788' ;; '8.0.1') echo '1b6b558be93f29438d3df94b7dfee02e794b94d9aca4611a92cdb79b6b88e909' ;; '8.0.2') echo 'ff7bf6a86f09b9b2c40bb8f48b25fc19cf2b2664fd1d220cd7ab833ec758d0d7' ;; @@ -214,7 +215,7 @@ d_gradle_plugin_ver_k=(8.3 8.2 8.1 8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3 d_plugin_min_gradle_v=(8.3 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 667567abb8eb730fcdc970c7a01a548cb3a8ded7 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 10 Oct 2023 09:33:51 +0200 Subject: [PATCH 1308/2116] safety: ignore CVEs patched in Debian --- .safety-policy.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.safety-policy.yml b/.safety-policy.yml index 0f8398bf..afc0b83e 100644 --- a/.safety-policy.yml +++ b/.safety-policy.yml @@ -8,3 +8,9 @@ security: 60350: reason: GitPython comes from Debian https://security-tracker.debian.org/tracker/CVE-2023-40267 expires: '2025-01-31' + 60789: + reason: GitPython comes from Debian https://security-tracker.debian.org/tracker/CVE-2023-40590 + expires: '2025-01-31' + 60841: + reason: GitPython comes from Debian https://security-tracker.debian.org/tracker/CVE-2023-41040 + expires: '2025-01-31' From af1c5d4e5d4184fda7aaf6c742cfae7129103ed1 Mon Sep 17 00:00:00 2001 From: cvzi Date: Tue, 10 Oct 2023 12:14:20 +0000 Subject: [PATCH 1309/2116] Fix typo in build.py encoutered -> encountered --- fdroidserver/build.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index b30ea509..00019e36 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -1161,7 +1161,7 @@ def main(): logging.error("VCS error while building app %s: %s" % ( appid, reason)) if options.stop: - logging.debug("Error encoutered, stopping by user request.") + logging.debug("Error encountered, stopping by user request.") common.force_exit(1) failed_builds.append((appid, build.versionCode)) common.deploy_build_log_with_rsync( @@ -1182,7 +1182,7 @@ def main(): f.write(str(e)) logging.error("Could not build app %s: %s" % (appid, e)) if options.stop: - logging.debug("Error encoutered, stopping by user request.") + logging.debug("Error encountered, stopping by user request.") common.force_exit(1) failed_builds.append((appid, build.versionCode)) common.deploy_build_log_with_rsync( @@ -1195,7 +1195,7 @@ def main(): logging.error("Could not build app %s due to unknown error: %s" % ( appid, traceback.format_exc())) if options.stop: - logging.debug("Error encoutered, stopping by user request.") + logging.debug("Error encountered, stopping by user request.") common.force_exit(1) failed_builds.append((appid, build.versionCode)) common.deploy_build_log_with_rsync( From 5503a05ef66f16d4d6e20ff48c83d707fcc02044 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20D=C3=BCster?= Date: Fri, 29 Sep 2023 21:43:51 +0200 Subject: [PATCH 1310/2116] [checkupdates] Add more docstrings --- fdroidserver/checkupdates.py | 170 +++++++++++++++++++++++++++++++++-- 1 file changed, 161 insertions(+), 9 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index d5a136ad..02e629f8 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -40,11 +40,32 @@ from . import net from .exception import VCSException, NoSubmodulesException, FDroidException, MetaDataException -# Check for a new version by looking at a document retrieved via HTTP. -# The app's Update Check Data field is used to provide the information -# required. def check_http(app): + """Check for a new version by looking at a document retrieved via HTTP. + The app's UpdateCheckData field is used to provide the information + required. + + Parameters + ---------- + app : metadata.App + The App instance to check for updates for. + + Returns + ------- + version : str or None + The found versionName or None if the versionName should be ignored + according to UpdateCheckIgnore. + vercode : int or None + The found versionCode or None if the versionCode should be ignored + according to UpdateCheckIgnore. + + Raises + ------ + FDroidException + If UpdateCheckData is missing or is an invalid URL or if there is no + match for the provided versionName or versionCode regex. + """ if not app.UpdateCheckData: raise FDroidException('Missing Update Check Data') @@ -91,6 +112,31 @@ def check_tags(app, pattern): Whether this can be used reliably or not depends on the development procedures used by the project's developers. Use it with caution, because it's inappropriate for many projects. + + Parameters + ---------- + app : metadata.App + The App instance to check for updates for. + pattern : str + The pattern a tag needs to match to be considered. + + Returns + ------- + versionName : str + The highest found versionName. + versionCode : int + The highest found versionCode. + ref : str + The Git reference, commit hash or tag name, of the highest found + versionName, versionCode. + + Raises + ------ + MetaDataException + If this function is not suitable for the RepoType of the app or + information is missing to perform this type of check. + FDroidException + If no matching tags or no information whatsoever could be found. """ if app.RepoType == 'srclib': build_dir = Path('build/srclib') / app.Repo @@ -230,6 +276,25 @@ def check_repomanifest(app, branch=None): Whether this can be used reliably or not depends on the development procedures used by the project's developers. Use it with caution, because it's inappropriate for many projects. + + Parameters + ---------- + app : metadata.App + The App instance to check for updates for. + branch : str + The VCS branch where to search for versionCode, versionName. + + Returns + ------- + versionName : str + The highest found versionName. + versionCode : int + The highest found versionCode. + + Raises + ------ + FDroidException + If no package id or no version information could be found. """ if app.RepoType == 'srclib': build_dir = Path('build/srclib') / app.Repo @@ -328,7 +393,7 @@ def check_gplay(app): def try_init_submodules(app, last_build, vcs): - """Try to init submodules if the last build entry used them. + """Try to init submodules if the last build entry uses them. They might have been removed from the app's repo in the meantime, so if we can't find any submodules we continue with the updates check. @@ -343,19 +408,44 @@ def try_init_submodules(app, last_build, vcs): logging.info("submodule broken for {}".format(_getappname(app))) -# Return all directories under startdir that contain any of the manifest -# files, and thus are probably an Android project. def dirs_with_manifest(startdir): + """Find directories containing a manifest file. + + Yield all directories under startdir that contain any of the manifest + files, and thus are probably an Android project. + + Parameters + ---------- + startdir : str + Directory to be walked down for search + + Yields + ------ + path : pathlib.Path or None + A directory that contains a manifest file of an Android project, None if + no directory could be found + """ for root, _dirs, files in os.walk(startdir): if any(m in files for m in [ 'AndroidManifest.xml', 'pom.xml', 'build.gradle', 'build.gradle.kts']): yield Path(root) -# Tries to find a new subdir starting from the root build_dir. Returns said -# subdir relative to the build dir if found, None otherwise. def possible_subdirs(app): + """Try to find a new subdir starting from the root build_dir. + Yields said subdir relative to the build dir if found, None otherwise. + + Parameters + ---------- + app : metadata.App + The app to check for subdirs + + Yields + ------ + subdir : pathlib.Path or None + A possible subdir, None if no subdir could be found + """ if app.RepoType == 'srclib': build_dir = Path('build/srclib') / app.Repo else: @@ -381,6 +471,24 @@ def _getcvname(app): def fetch_autoname(app, tag): + """Fetch AutoName. + + Get the to be displayed name of an app from the source code and adjust the + App instance in case it is different name has been found. + + Parameters + ---------- + app : metadata.App + The App instance to get the AutoName for. + tag : str + Tag to fetch AutoName at. + + Returns + ------- + commitmsg : str or None + Commit message about the name change. None in case checking for the + name is disabled, a VCSException occured or no name could be found. + """ if not app.RepoType or app.UpdateCheckMode in ('None', 'Static') \ or app.UpdateCheckName == "Ignore": return None @@ -419,6 +527,25 @@ def fetch_autoname(app, tag): def operate_vercode(operation, vercode): + """Calculate a new versionCode from a mathematical operation. + + Parameters + ---------- + operation : str + The operation to execute to get the new versionCode. + vercode : int + The versionCode for replacing "%c" in the operation. + + Returns + ------- + vercode : int + The new versionCode obtained by executing the operation. + + Raises + ------ + MetaDataException + If the operation is invalid. + """ if not common.VERCODE_OPERATION_RE.match(operation): raise MetaDataException(_('Invalid VercodeOperation: {field}') .format(field=operation)) @@ -430,8 +557,27 @@ def operate_vercode(operation, vercode): def checkupdates_app(app): + """Check for new versions and updated name of a single app. + + Also write back changes to the metadata file and create a Git commit if + requested. + + Parameters + ---------- + app : metadata.App + The app to check for updates for. + + Raises + ------ + MetaDataException + If the app has an invalid UpdateCheckMode or AutoUpdateMode. + FDroidException + If no version information could be found, the current version is newer + than the found version, auto-update was requested but an app has no + CurrentVersionCode or (Git) commiting the changes failed. + """ # If a change is made, commitmsg should be set to a description of it. - # Only if this is set will changes be written back to the metadata. + # Only if this is set, changes will be written back to the metadata. commitmsg = None tag = None @@ -577,6 +723,7 @@ def checkupdates_app(app): def get_last_build_from_app(app): + """Get the last build entry of an app.""" if app.get('Builds'): return app['Builds'][-1] else: @@ -600,6 +747,11 @@ start_timestamp = time.gmtime() def main(): + """Check for updates for one or more apps. + + The behaviour of this function is influenced by the configuration file as + well as command line parameters. + """ global config, options # Parse command line... From 7b715bb2c9b726b34d8e119ae4cd666623487c0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20D=C3=BCster?= Date: Sun, 22 Oct 2023 20:43:52 +0200 Subject: [PATCH 1311/2116] [docs] Enable intersphinx --- docs/source/conf.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index a6091df9..382d8feb 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -30,6 +30,7 @@ extensions = [ 'numpydoc', 'sphinx.ext.autodoc', 'sphinx.ext.autosummary', + "sphinx.ext.intersphinx", ] # Add any paths that contain templates here, relative to this directory. @@ -71,5 +72,6 @@ html_sidebars = { html_split_index = True #numpydoc_validation_checks = {"all"} - - +intersphinx_mapping = { + "python": ("https://docs.python.org/3/", None), +} From f23847085546c88e67202f2e1d85df167ec4cd8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20D=C3=BCster?= Date: Sun, 22 Oct 2023 21:01:27 +0200 Subject: [PATCH 1312/2116] [docs] Put type annotations in type hints instead of docstring --- fdroidserver/checkupdates.py | 69 ++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 02e629f8..a0ebe177 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -32,6 +32,7 @@ import logging import copy import urllib.parse from pathlib import Path +from typing import Optional, Union from . import _ from . import common @@ -40,7 +41,7 @@ from . import net from .exception import VCSException, NoSubmodulesException, FDroidException, MetaDataException -def check_http(app): +def check_http(app: metadata.App) -> tuple[Union[str, None], Union[int, None]]: """Check for a new version by looking at a document retrieved via HTTP. The app's UpdateCheckData field is used to provide the information @@ -48,15 +49,15 @@ def check_http(app): Parameters ---------- - app : metadata.App + app The App instance to check for updates for. Returns ------- - version : str or None + version The found versionName or None if the versionName should be ignored according to UpdateCheckIgnore. - vercode : int or None + vercode The found versionCode or None if the versionCode should be ignored according to UpdateCheckIgnore. @@ -106,7 +107,7 @@ def check_http(app): return (version, vercode) -def check_tags(app, pattern): +def check_tags(app: metadata.App, pattern: str) -> tuple[str, int, str]: """Check for a new version by looking at the tags in the source repo. Whether this can be used reliably or not depends on @@ -115,18 +116,18 @@ def check_tags(app, pattern): Parameters ---------- - app : metadata.App + app The App instance to check for updates for. - pattern : str + pattern The pattern a tag needs to match to be considered. Returns ------- - versionName : str + versionName The highest found versionName. - versionCode : int + versionCode The highest found versionCode. - ref : str + ref The Git reference, commit hash or tag name, of the highest found versionName, versionCode. @@ -270,7 +271,7 @@ def check_tags(app, pattern): raise FDroidException(_("Couldn't find any version information")) -def check_repomanifest(app, branch=None): +def check_repomanifest(app: metadata.App, branch: Optional[str] = None) -> tuple[str, int]: """Check for a new version by looking at the AndroidManifest.xml at the HEAD of the source repo. Whether this can be used reliably or not depends on @@ -279,16 +280,16 @@ def check_repomanifest(app, branch=None): Parameters ---------- - app : metadata.App + app The App instance to check for updates for. - branch : str + branch The VCS branch where to search for versionCode, versionName. Returns ------- - versionName : str + versionName The highest found versionName. - versionCode : int + versionCode The highest found versionCode. Raises @@ -392,7 +393,7 @@ def check_gplay(app): return (version.strip(), None) -def try_init_submodules(app, last_build, vcs): +def try_init_submodules(app: metadata.App, last_build: metadata.Build, vcs: common.vcs): """Try to init submodules if the last build entry uses them. They might have been removed from the app's repo in the meantime, @@ -408,7 +409,7 @@ def try_init_submodules(app, last_build, vcs): logging.info("submodule broken for {}".format(_getappname(app))) -def dirs_with_manifest(startdir): +def dirs_with_manifest(startdir: str): """Find directories containing a manifest file. Yield all directories under startdir that contain any of the manifest @@ -416,7 +417,7 @@ def dirs_with_manifest(startdir): Parameters ---------- - startdir : str + startdir Directory to be walked down for search Yields @@ -431,14 +432,14 @@ def dirs_with_manifest(startdir): yield Path(root) -def possible_subdirs(app): +def possible_subdirs(app: metadata.App): """Try to find a new subdir starting from the root build_dir. Yields said subdir relative to the build dir if found, None otherwise. Parameters ---------- - app : metadata.App + app The app to check for subdirs Yields @@ -462,15 +463,15 @@ def possible_subdirs(app): yield subdir -def _getappname(app): +def _getappname(app: metadata.App) -> str: return common.get_app_display_name(app) -def _getcvname(app): +def _getcvname(app: metadata.App) -> str: return '%s (%s)' % (app.CurrentVersion, app.CurrentVersionCode) -def fetch_autoname(app, tag): +def fetch_autoname(app: metadata.App, tag: str) -> Optional[str]: """Fetch AutoName. Get the to be displayed name of an app from the source code and adjust the @@ -478,14 +479,14 @@ def fetch_autoname(app, tag): Parameters ---------- - app : metadata.App + app The App instance to get the AutoName for. - tag : str + tag Tag to fetch AutoName at. Returns ------- - commitmsg : str or None + commitmsg Commit message about the name change. None in case checking for the name is disabled, a VCSException occured or no name could be found. """ @@ -526,19 +527,19 @@ def fetch_autoname(app, tag): return commitmsg -def operate_vercode(operation, vercode): +def operate_vercode(operation: str, vercode: int) -> int: """Calculate a new versionCode from a mathematical operation. Parameters ---------- - operation : str + operation The operation to execute to get the new versionCode. - vercode : int + vercode The versionCode for replacing "%c" in the operation. Returns ------- - vercode : int + vercode The new versionCode obtained by executing the operation. Raises @@ -556,7 +557,7 @@ def operate_vercode(operation, vercode): return vercode -def checkupdates_app(app): +def checkupdates_app(app: metadata.App) -> None: """Check for new versions and updated name of a single app. Also write back changes to the metadata file and create a Git commit if @@ -564,7 +565,7 @@ def checkupdates_app(app): Parameters ---------- - app : metadata.App + app The app to check for updates for. Raises @@ -722,7 +723,7 @@ def checkupdates_app(app): raise FDroidException("Git commit failed") -def get_last_build_from_app(app): +def get_last_build_from_app(app: metadata.App) -> metadata.Build: """Get the last build entry of an app.""" if app.get('Builds'): return app['Builds'][-1] @@ -730,7 +731,7 @@ def get_last_build_from_app(app): return metadata.Build() -def status_update_json(processed, failed): +def status_update_json(processed: list, failed: dict) -> None: """Output a JSON file with metadata about this run.""" logging.debug(_('Outputting JSON')) output = common.setup_status_output(start_timestamp) From 02b855da5eb49260d3867fdf38bf2e1225592c0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20D=C3=BCster?= Date: Sun, 22 Oct 2023 21:27:08 +0200 Subject: [PATCH 1313/2116] [docs] Start utilising intersphinx --- fdroidserver/checkupdates.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index a0ebe177..a67a4463 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -63,7 +63,7 @@ def check_http(app: metadata.App) -> tuple[Union[str, None], Union[int, None]]: Raises ------ - FDroidException + :exc:`~fdroidserver.exception.FDroidException` If UpdateCheckData is missing or is an invalid URL or if there is no match for the provided versionName or versionCode regex. """ @@ -133,10 +133,10 @@ def check_tags(app: metadata.App, pattern: str) -> tuple[str, int, str]: Raises ------ - MetaDataException + :exc:`~fdroidserver.exception.MetaDataException` If this function is not suitable for the RepoType of the app or information is missing to perform this type of check. - FDroidException + :exc:`~fdroidserver.exception.FDroidException` If no matching tags or no information whatsoever could be found. """ if app.RepoType == 'srclib': @@ -294,7 +294,7 @@ def check_repomanifest(app: metadata.App, branch: Optional[str] = None) -> tuple Raises ------ - FDroidException + :exc:`~fdroidserver.exception.FDroidException` If no package id or no version information could be found. """ if app.RepoType == 'srclib': @@ -422,7 +422,7 @@ def dirs_with_manifest(startdir: str): Yields ------ - path : pathlib.Path or None + path : :class:`pathlib.Path` or None A directory that contains a manifest file of an Android project, None if no directory could be found """ @@ -444,7 +444,7 @@ def possible_subdirs(app: metadata.App): Yields ------ - subdir : pathlib.Path or None + subdir : :class:`pathlib.Path` or None A possible subdir, None if no subdir could be found """ if app.RepoType == 'srclib': @@ -544,7 +544,7 @@ def operate_vercode(operation: str, vercode: int) -> int: Raises ------ - MetaDataException + :exc:`~fdroidserver.exception.MetaDataException` If the operation is invalid. """ if not common.VERCODE_OPERATION_RE.match(operation): @@ -570,9 +570,9 @@ def checkupdates_app(app: metadata.App) -> None: Raises ------ - MetaDataException + :exc:`~fdroidserver.exception.MetaDataException` If the app has an invalid UpdateCheckMode or AutoUpdateMode. - FDroidException + :exc:`~fdroidserver.exception.FDroidException` If no version information could be found, the current version is newer than the found version, auto-update was requested but an app has no CurrentVersionCode or (Git) commiting the changes failed. From 81fea255092c85ff24be14392509a2bd1af19c82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20D=C3=BCster?= Date: Thu, 26 Oct 2023 09:17:43 +0200 Subject: [PATCH 1314/2116] [docs] Remove unnecessary use of Union --- fdroidserver/checkupdates.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index a67a4463..1c07acc9 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -32,7 +32,7 @@ import logging import copy import urllib.parse from pathlib import Path -from typing import Optional, Union +from typing import Optional from . import _ from . import common @@ -41,7 +41,7 @@ from . import net from .exception import VCSException, NoSubmodulesException, FDroidException, MetaDataException -def check_http(app: metadata.App) -> tuple[Union[str, None], Union[int, None]]: +def check_http(app: metadata.App) -> tuple[Optional[str], Optional[int]]: """Check for a new version by looking at a document retrieved via HTTP. The app's UpdateCheckData field is used to provide the information From 24ea1f685210c37e6c8f131fe2e6919f9cfafa81 Mon Sep 17 00:00:00 2001 From: sim Date: Wed, 26 Jul 2023 00:02:24 +0200 Subject: [PATCH 1315/2116] Clone without blobs to save space --- fdroidserver/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 3111d1bb..06284898 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1256,7 +1256,7 @@ class vcs_git(vcs): def gotorevisionx(self, rev): if not os.path.exists(self.local): # Brand new checkout - p = self.git(['clone', '--', self.remote, str(self.local)]) + p = self.git(['clone', '--filter=blob:none', '--', self.remote, str(self.local)]) if p.returncode != 0: self.clone_failed = True raise VCSException("Git clone failed", p.output) From 8aad2dd0c39310637888c193d340c54943318f6d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 11 Oct 2023 14:16:02 +0200 Subject: [PATCH 1316/2116] allow gradle/sdkmanager to install extras;android;m2repository closes #1169 --- buildserver/provision-android-sdk | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/buildserver/provision-android-sdk b/buildserver/provision-android-sdk index 4bf66389..19002a47 100644 --- a/buildserver/provision-android-sdk +++ b/buildserver/provision-android-sdk @@ -160,3 +160,8 @@ chmod g+w $ANDROID_HOME/{build-tools,platforms} test -d $ANDROID_HOME/extras/m2repository || mkdir -p $ANDROID_HOME/extras/m2repository find $ANDROID_HOME/extras/m2repository -type d | xargs chgrp vagrant find $ANDROID_HOME/extras/m2repository -type d | xargs chmod g+w + +# allow gradle/sdkmanager to install extras;android;m2repository +test -d $ANDROID_HOME/extras/android || mkdir -p $ANDROID_HOME/extras/android +find $ANDROID_HOME/extras/android -type d | xargs chgrp vagrant +find $ANDROID_HOME/extras/android -type d | xargs chmod g+w From f99f430e9ef860e19e35abce90ce7a5a86ebc76b Mon Sep 17 00:00:00 2001 From: linsui Date: Mon, 13 Nov 2023 23:31:56 +0800 Subject: [PATCH 1317/2116] deinit git submodule --- fdroidserver/common.py | 12 ++++++++++++ tests/build.TestCase | 3 +++ tests/common.TestCase | 6 ++++++ 3 files changed, 21 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 06284898..087dd431 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1174,6 +1174,10 @@ class vcs: def initsubmodules(self): raise VCSException('Submodules not supported for this vcs type') + # Deinitialise and update submodules + def deinitsubmodules(self): + pass + # Get a list of all known tags def gettags(self): if not self._gettags: @@ -1338,6 +1342,12 @@ class vcs_git(vcs): if p.returncode != 0: raise VCSException(_("Git submodule update failed"), p.output) + def deinitsubmodules(self): + self.checkrepo() + p = FDroidPopen(['git', 'submodule', 'deinit', '--all'], cwd=self.local, output=False) + if p.returncode != 0: + raise VCSException(_("Git submodule deinit failed"), p.output) + def _gettags(self): self.checkrepo() p = FDroidPopen(['git', 'tag'], cwd=self.local, output=False) @@ -2188,6 +2198,8 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver= if build.submodules: logging.info(_("Initialising submodules")) vcs.initsubmodules() + else: + vcs.deinitsubmodules() # Check that a subdir (if we're using one) exists. This has to happen # after the checkout, since it might not exist elsewhere diff --git a/tests/build.TestCase b/tests/build.TestCase index 4a4c0001..cce6a424 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -586,6 +586,9 @@ class BuildTest(unittest.TestCase): def getsrclib(self): return None + def deinitsubmodules(self): + pass + # Test we trigger a scanner error without extlibs build.extlibs = [] os.makedirs('build/libs') diff --git a/tests/common.TestCase b/tests/common.TestCase index 26cd979c..0fc8c41f 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -315,6 +315,9 @@ class CommonTest(unittest.TestCase): def getsrclib(self): return None + def deinitsubmodules(self): + pass + fdroidserver.common.prepare_source(FakeVcs(), app, build, fdroidclient_testdir, fdroidclient_testdir, fdroidclient_testdir) @@ -385,6 +388,9 @@ class CommonTest(unittest.TestCase): def getsrclib(self): return None + def deinitsubmodules(self): + pass + fdroidserver.common.prepare_source(FakeVcs(), app, build, app_build_dir, srclib_testdir, app_build_dir, onserver=True, refresh=False) # do not clone in this test From f4f1de941c8b0b3bca3267cf06ca825d02d3653c Mon Sep 17 00:00:00 2001 From: Andrew Gunnerson Date: Wed, 15 Nov 2023 18:43:58 -0500 Subject: [PATCH 1318/2116] buildserver: Add python3-packaging dependency Signed-off-by: Andrew Gunnerson --- buildserver/provision-apt-get-install | 1 + 1 file changed, 1 insertion(+) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index e0c44963..ef61234c 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -112,6 +112,7 @@ packages=" gnupg mercurial patch + python3-packaging rsync sdkmanager sudo From 5ae15532f0a1b0b453009b7b8ce4fbd58782bf93 Mon Sep 17 00:00:00 2001 From: linsui Date: Thu, 16 Nov 2023 14:58:55 +0800 Subject: [PATCH 1319/2116] fetch_srclib: fetch source code --- .gitlab-ci.yml | 2 +- examples/fdroid_fetchsrclibs.py | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c641e748..c801539f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -438,7 +438,7 @@ plugin_fetchsrclibs: - curl https://gitlab.com/fdroid/fdroiddata/-/archive/${commitid}/fdroiddata-${commitid}.tar.gz | tar -xz --directory=fdroiddata --strip-components=1 - cd fdroiddata - - fdroid fetchsrclibs freemap.opentrail:9 --verbose + - fdroid fetchsrclibs freemap.opentrail:4 --verbose - test -d build/freemap.opentrail/.git - test -d build/srclib/andromaps/.git - test -d build/srclib/freemaplib/.git diff --git a/examples/fdroid_fetchsrclibs.py b/examples/fdroid_fetchsrclibs.py index 76e8bc8e..978baacf 100644 --- a/examples/fdroid_fetchsrclibs.py +++ b/examples/fdroid_fetchsrclibs.py @@ -29,8 +29,12 @@ def main(): srclibpaths = [] for appid, app in apps.items(): vcs, _ignored = common.setup_vcs(app) - vcs.gotorevision('HEAD', refresh=False) for build in app.get('Builds', []): + vcs.gotorevision(build.commit, refresh=False) + if build.submodules: + vcs.initsubmodules() + else: + vcs.deinitsubmodules() for lib in build.srclibs: srclibpaths.append(common.getsrclib(lib, srclib_dir, prepare=False, build=build)) print('Set up srclibs:') From 3e9f27612eefd66e2b07630eac8a55e1ff6aa655 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 20 Nov 2023 10:01:21 +0100 Subject: [PATCH 1320/2116] Revert "Clone without blobs to save space" !1382 This seems to make git ignore the _fsck skipList_ files. This reverts commit 24ea1f685210c37e6c8f131fe2e6919f9cfafa81. closes #1177 fdroid-bootstrap-buildserver!34 !1408 --- fdroidserver/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 087dd431..e62c3116 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1260,7 +1260,7 @@ class vcs_git(vcs): def gotorevisionx(self, rev): if not os.path.exists(self.local): # Brand new checkout - p = self.git(['clone', '--filter=blob:none', '--', self.remote, str(self.local)]) + p = self.git(['clone', '--', self.remote, str(self.local)]) if p.returncode != 0: self.clone_failed = True raise VCSException("Git clone failed", p.output) From 81fdba452a372a06881dd83e5a611f1de6440f6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20D=C3=BCster?= Date: Fri, 27 Oct 2023 23:41:32 +0200 Subject: [PATCH 1321/2116] [checkupdates] Remove --gplay option It's unclear whether this still works and we're not planning to maintain it. --- completion/bash-completion | 2 +- fdroidserver/checkupdates.py | 59 ------------------------------------ 2 files changed, 1 insertion(+), 60 deletions(-) diff --git a/completion/bash-completion b/completion/bash-completion index 0f9c66d6..940b188b 100644 --- a/completion/bash-completion +++ b/completion/bash-completion @@ -155,7 +155,7 @@ __complete_publish() { __complete_checkupdates() { opts="-v -q" - lopts="--verbose --quiet --auto --autoonly --commit --gplay --allow-dirty" + lopts="--verbose --quiet --auto --autoonly --commit --allow-dirty" case "${cur}" in -*) __complete_options diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 1c07acc9..a7788d9d 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -26,8 +26,6 @@ import subprocess import sys from argparse import ArgumentParser import traceback -import html -from distutils.version import LooseVersion import logging import copy import urllib.parse @@ -363,36 +361,6 @@ def check_repotrunk(app): return (ref, ref) -# Check for a new version by looking at the Google Play Store. -# Returns (None, "a message") if this didn't work, or (version, None) for -# the details of the current version. -def check_gplay(app): - time.sleep(15) - url = 'https://play.google.com/store/apps/details?id=' + app.id - headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux i686; rv:18.0) Gecko/20100101 Firefox/18.0'} - req = urllib.request.Request(url, None, headers) - try: - resp = urllib.request.urlopen(req, None, 20) # nosec B310 URL base is hardcoded above - page = resp.read().decode() - except urllib.error.HTTPError as e: - return (None, str(e.code)) - except Exception as e: - return (None, 'Failed:' + str(e)) - - version = None - - m = re.search('itemprop="softwareVersion">[ ]*([^<]+)[ ]*', page) - if m: - version = html.unescape(m.group(1)) - - if version == 'Varies with device': - return (None, 'Device-variable version, cannot use this method') - - if not version: - return (None, "Couldn't find version") - return (version.strip(), None) - - def try_init_submodules(app: metadata.App, last_build: metadata.Build, vcs: common.vcs): """Try to init submodules if the last build entry uses them. @@ -767,8 +735,6 @@ def main(): help=_("Commit changes")) parser.add_argument("--allow-dirty", action="store_true", default=False, help=_("Run on git repo that has uncommitted changes")) - parser.add_argument("--gplay", action="store_true", default=False, - help=_("Only print differences with the Play Store")) metadata.add_metadata_arguments(parser) options = parser.parse_args() metadata.warnings_action = options.W @@ -786,31 +752,6 @@ def main(): apps = common.read_app_args(options.appid, allapps, False) - if options.gplay: - for appid, app in apps.items(): - version, reason = check_gplay(app) - if version is None: - if reason == '404': - logging.info("{0} is not in the Play Store".format(_getappname(app))) - else: - logging.info("{0} encountered a problem: {1}".format(_getappname(app), reason)) - if version is not None: - stored = app.CurrentVersion - if not stored: - logging.info("{0} has no Current Version but has version {1} on the Play Store" - .format(_getappname(app), version)) - elif LooseVersion(stored) < LooseVersion(version): - logging.info("{0} has version {1} on the Play Store, which is bigger than {2}" - .format(_getappname(app), version, stored)) - else: - if stored != version: - logging.info("{0} has version {1} on the Play Store, which differs from {2}" - .format(_getappname(app), version, stored)) - else: - logging.info("{0} has the same version {1} on the Play Store" - .format(_getappname(app), version)) - return - processed = [] failed = dict() exit_code = 0 From b5424d40f15080f4c7ea8f657de9f6e5e9f63b44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20D=C3=BCster?= Date: Fri, 27 Oct 2023 23:45:05 +0200 Subject: [PATCH 1322/2116] [checkupdates] Remove UpdateCheckMode "RepoTrunk" It's unclear whether this still works and we're not planning to maintain it. --- fdroidserver/checkupdates.py | 22 ---------------------- fdroidserver/metadata.py | 2 +- 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index a7788d9d..6aaaf117 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -341,26 +341,6 @@ def check_repomanifest(app: metadata.App, branch: Optional[str] = None) -> tuple raise FDroidException(_("Couldn't find any version information")) -def check_repotrunk(app): - if app.RepoType == 'srclib': - build_dir = Path('build/srclib') / app.Repo - repotype = common.getsrclibvcs(app.Repo) - else: - build_dir = Path('build') / app.id - repotype = app.RepoType - - if repotype not in ('git-svn', ): - raise MetaDataException(_('RepoTrunk update mode only makes sense in git-svn repositories')) - - # Set up vcs interface and make sure we have the latest code... - vcs = common.getvcs(app.RepoType, app.Repo, build_dir) - - vcs.gotorevision(None) - - ref = vcs.getref() - return (ref, ref) - - def try_init_submodules(app: metadata.App, last_build: metadata.Build, vcs: common.vcs): """Try to init submodules if the last build entry uses them. @@ -559,8 +539,6 @@ def checkupdates_app(app: metadata.App) -> None: elif mode.startswith('RepoManifest/'): tag = mode[13:] (version, vercode) = check_repomanifest(app, tag) - elif mode == 'RepoTrunk': - (version, vercode) = check_repotrunk(app) elif mode == 'HTTP': (version, vercode) = check_http(app) elif mode in ('None', 'Static'): diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index dffcc45c..240b82ba 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -453,7 +453,7 @@ valuetypes = { ["AutoUpdateMode"]), FieldValidator("Update Check Mode", - r"^(Tags|Tags .+|RepoManifest|RepoManifest/.+|RepoTrunk|HTTP|Static|None)$", + r"^(Tags|Tags .+|RepoManifest|RepoManifest/.+|HTTP|Static|None)$", ["UpdateCheckMode"]) } From 6a7a6e310bd9dde55a4a2ce68ebd17e407776302 Mon Sep 17 00:00:00 2001 From: linsui Date: Sat, 9 Sep 2023 14:48:13 +0800 Subject: [PATCH 1323/2116] set ruamel.yaml version to older than 1.17.22 Newer version changed the behavior --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 25e7412f..f89ddf94 100755 --- a/setup.py +++ b/setup.py @@ -103,7 +103,7 @@ setup( 'python-vagrant', 'PyYAML', 'qrcode', - 'ruamel.yaml >= 0.15', + 'ruamel.yaml >= 0.15, < 0.17.22', 'requests >= 2.5.2, != 2.11.0, != 2.12.2, != 2.18.0', 'sdkmanager >= 0.6.4', 'yamllint', From f13d9235cede79a6ce8fbe1f17765850b2d39469 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 20 Nov 2023 18:04:59 +0100 Subject: [PATCH 1324/2116] remove jq dependency in the tests, port to GNU sed This avoids spreading the jq dependency to more places, like: https://gitlab.com/eighthave/ansible-role-install-fdroidserver-dependencies/-/jobs/5559798360 And is helpful when porting to non-Debian platforms. --- .gitlab-ci.yml | 8 +++----- tests/run-tests | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c801539f..7c7344d8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -19,7 +19,7 @@ buildserver run-tests: image: registry.gitlab.com/fdroid/fdroidserver:buildserver script: - apt-get update - - apt-get install gnupg-agent jq python3-babel python3-clint + - apt-get install gnupg-agent python3-babel python3-clint - ./tests/run-tests # make sure that translations do not cause stacktraces - cd $CI_PROJECT_DIR/locale @@ -98,7 +98,6 @@ debian_testing: git gnupg ipfs-cid - jq python3-defusedxml python3-setuptools sdkmanager @@ -123,7 +122,7 @@ ubuntu_lts_ppa: - echo "deb http://ppa.launchpad.net/fdroid/fdroidserver/ubuntu $RELEASE main" >> /etc/apt/sources.list - apt-get update - apt-get dist-upgrade - - apt-get install --install-recommends dexdump fdroidserver git jq python3-setuptools sdkmanager + - apt-get install --install-recommends dexdump fdroidserver git python3-setuptools sdkmanager # Test things work with a default branch other than 'master' - git config --global init.defaultBranch thisisnotmasterormain @@ -139,7 +138,7 @@ ubuntu_jammy_pip: image: ubuntu:jammy <<: *apt-template script: - - apt-get install git default-jdk-headless jq python3-pip python3-venv rsync + - apt-get install git default-jdk-headless python3-pip python3-venv rsync # setup venv to act as release build machine - python3 -m venv sdist-env @@ -279,7 +278,6 @@ fedora_latest: git gnupg java-17-openjdk-devel - jq openssl python3 python3-babel diff --git a/tests/run-tests b/tests/run-tests index 8acb1889..61d3d7bb 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -301,8 +301,8 @@ $sed -i.tmp -e 's,timestamp="[0-9]*",timestamp="1676634233",' repo/index.xml diff -uw $WORKSPACE/tests/repo/index.xml repo/index.xml sed -i --expression='s,"timestamp": [0-9]*,"timestamp": 1676634233000,' repo/index-v1.json diff -uw $WORKSPACE/tests/repo/index-v1.json repo/index-v1.json -jq "del(.packages[]|.versions[]|.file.ipfsCIDv1)" $WORKSPACE/tests/repo/index-v2.json > repo/index-v2.org.json -jq "del(.packages[]|.versions[]|.file.ipfsCIDv1)" repo/index-v2.json > repo/index-v2.mod.json +sed -z 's/,\s*"ipfsCIDv1": *"[a-z0-9]*"//g' $WORKSPACE/tests/repo/index-v2.json > repo/index-v2.org.json +sed -z 's/,\s*"ipfsCIDv1": *"[a-z0-9]*"//g' repo/index-v2.json > repo/index-v2.mod.json sed -i --expression='s,"timestamp": [0-9]*,"timestamp": 1676634233000,' repo/index-v2.mod.json diff -uw repo/index-v2.org.json repo/index-v2.mod.json From e2e7782ef38b7098a865e4ba0adb6bf8d37553fa Mon Sep 17 00:00:00 2001 From: linsui Date: Sat, 25 Nov 2023 22:11:19 +0800 Subject: [PATCH 1325/2116] add --force to git deinit --- fdroidserver/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index e62c3116..852c00cf 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1344,7 +1344,7 @@ class vcs_git(vcs): def deinitsubmodules(self): self.checkrepo() - p = FDroidPopen(['git', 'submodule', 'deinit', '--all'], cwd=self.local, output=False) + p = FDroidPopen(['git', 'submodule', 'deinit', '--all', '--force'], cwd=self.local, output=False) if p.returncode != 0: raise VCSException(_("Git submodule deinit failed"), p.output) From ac2a3896aa30c7358a3df567d0078c429ce006c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 30 Nov 2023 17:49:55 +0100 Subject: [PATCH 1326/2116] =?UTF-8?q?=F0=9F=A9=B9=20fix=20bandit=20warning?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit F-Droid server doesn't fetch pip dependencies directly from mercurial/hg repositories. So https://data.safetycli.com/v/62044/f17/ is not affecting us. Hence we can ingore it. --- .safety-policy.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.safety-policy.yml b/.safety-policy.yml index afc0b83e..7d9ec149 100644 --- a/.safety-policy.yml +++ b/.safety-policy.yml @@ -14,3 +14,6 @@ security: 60841: reason: GitPython comes from Debian https://security-tracker.debian.org/tracker/CVE-2023-41040 expires: '2025-01-31' + 62044: + reason: "F-Droid doesn't fetch pip dependencies directly from hg/mercurial repositories: https://data.safetycli.com/v/62044/f17/" + expires: '2025-01-31' From 685983bfabe7e035bb781057e50c6e97fea9f3fe Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Thu, 30 Nov 2023 19:13:01 +0000 Subject: [PATCH 1327/2116] gradle v8.5 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index aeaedf26..112fbd71 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -195,6 +195,7 @@ get_sha() { '8.2.1') echo '03ec176d388f2aa99defcadc3ac6adf8dd2bce5145a129659537c0874dea5ad1' ;; '8.3') echo '591855b517fc635b9e04de1d05d5e76ada3f89f5fc76f87978d1b245b4f69225' ;; '8.4') echo '3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae' ;; + '8.5') echo '9d926787066a081739e8200858338b4a69e837c3a821a33aca9db09dd4a41026' ;; *) exit 1 esac } @@ -215,7 +216,7 @@ d_gradle_plugin_ver_k=(8.3 8.2 8.1 8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3 d_plugin_min_gradle_v=(8.3 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 2081a9f2d29a6522d504dd3bb7071bbfa2402e09 Mon Sep 17 00:00:00 2001 From: linsui Date: Wed, 6 Dec 2023 23:35:55 +0800 Subject: [PATCH 1328/2116] lint: remove check_bulletes_lists --- fdroidserver/lint.py | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 951c74fd..c0df0135 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -435,27 +435,6 @@ def check_mediawiki_links(app): yield _("URL {url} in Description: {error}").format(url=url, error=r) -def check_bulleted_lists(app): - validchars = ['*', '#'] - lchar = '' - lcount = 0 - for line in app.Description.splitlines(): - if len(line) < 1: - lcount = 0 - continue - - if line[0] == lchar and line[1] == ' ': - lcount += 1 - if lcount > 2 and lchar not in validchars: - yield _( - "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" - ) % lchar - break - else: - lchar = line[0] - lcount = 1 - - def check_builds(app): supported_flags = set(metadata.build_flags) # needed for YAML and JSON @@ -862,7 +841,6 @@ def main(): check_categories, check_duplicates, check_mediawiki_links, - check_bulleted_lists, check_builds, check_files_dir, check_format, From 825f96965261cd15803aceb89321763ac1595fca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20L=C3=B3pez?= Date: Tue, 28 Nov 2023 10:37:51 +0000 Subject: [PATCH 1329/2116] Support `Uri.create()` syntax for maven repositories --- fdroidserver/scanner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index c2807e27..e1e5ff3f 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -50,7 +50,7 @@ class MessageStore: errors: list = field(default_factory=list) -MAVEN_URL_REGEX = re.compile(r"""\smaven\s*(?:{.*?(?:setUrl|url)|\((?:url)?)\s*=?\s*(?:uri)?\(?\s*["']?([^\s"']+)["']?[^})]*[)}]""", +MAVEN_URL_REGEX = re.compile(r"""\smaven\s*(?:{.*?(?:setUrl|url)|\((?:url)?)\s*=?\s*(?:uri|Uri\.create\()?\(?\s*["']?([^\s"']+)["']?[^})]*[)}]""", re.DOTALL) From 6d541e3ef6f6ac9517472cc9f7800de842010ffe Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 6 Dec 2023 16:04:43 +0100 Subject: [PATCH 1330/2116] establish config/mirrors.yml as a way to set up mirrors The mirrors: entry in config.yml is great for quick access and shorter mirror lists. Now that we are adding a lot more metadata to the mirrors, including potentially the full text of the privacy policy, having this in its own file should make these cases easier to manage. --- examples/config.yml | 3 +++ fdroidserver/common.py | 2 ++ fdroidserver/index.py | 14 +++++++++++++- tests/index.TestCase | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/examples/config.yml b/examples/config.yml index ce3d3b2e..12f7d138 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -228,6 +228,9 @@ # countryCode: BA # - url: http://foobarfoobarfoobar.onion/fdroid # +# The list of mirrors can also be maintained in config/mirrors.yml, a +# standalone YAML file in the optional configuration directory. In +# that case, mirrors: should be removed from this file (config.yml). # optionally specify which identity file to use when using rsync or git over SSH diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 852c00cf..253d2460 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -117,11 +117,13 @@ GITLAB_COM_PAGES_MAX_SIZE = 1000000000 ANTIFEATURES_CONFIG_NAME = 'antiFeatures' CATEGORIES_CONFIG_NAME = 'categories' CONFIG_CONFIG_NAME = 'config' +MIRRORS_CONFIG_NAME = 'mirrors' RELEASECHANNELS_CONFIG_NAME = "releaseChannels" CONFIG_NAMES = ( ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME, CONFIG_CONFIG_NAME, + MIRRORS_CONFIG_NAME, RELEASECHANNELS_CONFIG_NAME, ) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 2f5bd50f..b80c66c7 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -29,6 +29,7 @@ import re import shutil import tempfile import urllib.parse +import yaml import zipfile import calendar import qrcode @@ -42,7 +43,7 @@ from . import common from . import metadata from . import net from . import signindex -from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME, CONFIG_CONFIG_NAME, RELEASECHANNELS_CONFIG_NAME, DEFAULT_LOCALE, FDroidPopen, FDroidPopenBytes, load_stats_fdroid_signing_key_fingerprints +from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME, CONFIG_CONFIG_NAME, MIRRORS_CONFIG_NAME, RELEASECHANNELS_CONFIG_NAME, DEFAULT_LOCALE, FDroidPopen, FDroidPopenBytes, load_stats_fdroid_signing_key_fingerprints from fdroidserver.exception import FDroidException, VerificationException @@ -1399,6 +1400,17 @@ def add_mirrors_to_repodict(repo_section, repodict): if type(mirrors_config) not in (list, tuple): mirrors_config = [mirrors_config] + mirrors_yml = Path(f'config/{MIRRORS_CONFIG_NAME}.yml') + if mirrors_yml.exists(): + if mirrors_config: + raise FDroidException( + _('mirrors set twice, in config.yml and {path}!').format( + path=mirrors_yml + ) + ) + with mirrors_yml.open() as fp: + mirrors_config = yaml.safe_load(fp) + mirrorcheckfailed = False mirrors = [] urls = set() diff --git a/tests/index.TestCase b/tests/index.TestCase index c115cdfe..00c8474b 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -791,6 +791,43 @@ class IndexTest(unittest.TestCase): with self.assertRaises(fdroidserver.exception.FDroidException): index.add_mirrors_to_repodict('repo', repodict) + def test_load_mirrors_config_from_file(self): + # empty the dict for *.config, see setUp() + for k in sorted(common.config.keys()): + del common.config[k] + + os.chdir(self.testdir) + os.mkdir('config') + primary = 'https://primary.com/fdroid/repo' + mirror = 'https://mirror.com/fdroid' + with open('config/mirrors.yml', 'w') as fp: + yaml.dump([{'url': mirror}], fp) + repodict = {'address': primary} + index.add_mirrors_to_repodict('repo', repodict) + self.assertEqual( + repodict['mirrors'], + [ + {'isPrimary': True, 'url': primary}, + {'url': mirror + '/repo'}, + ], + ) + + def test_error_when_load_mirrors_from_config_and_file(self): + # empty the dict for *.config, see setUp() + for k in sorted(common.config.keys()): + del common.config[k] + + os.chdir(self.testdir) + os.mkdir('config') + with open('config/mirrors.yml', 'w') as fp: + yaml.dump([{'url': 'https://foo.com'}], fp) + repodict = { + 'address': 'https://foo.com', + 'mirrors': {'url': 'http://two/fdroid/repo'}, + } + with self.assertRaises(fdroidserver.exception.FDroidException): + index.add_mirrors_to_repodict('repo', repodict) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 4536b130df23b64a131c5a715d2549b512eb3e74 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 7 Dec 2023 13:47:27 +0100 Subject: [PATCH 1331/2116] index: add datatype checking to mirrors: and config/mirrors.yml --- fdroidserver/index.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index b80c66c7..509790bb 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -1410,6 +1410,15 @@ def add_mirrors_to_repodict(repo_section, repodict): ) with mirrors_yml.open() as fp: mirrors_config = yaml.safe_load(fp) + if not isinstance(mirrors_config, list): + msg = _('{path} is not list, but a {datatype}!') + raise TypeError( + msg.format(path=mirrors_yml, datatype=type(mirrors_config).__name__) + ) + + if type(mirrors_config) not in (list, tuple, set): + msg = 'In config.yml, mirrors: is not list, but a {datatype}!' + raise TypeError(msg.format(datatype=type(mirrors_config).__name__)) mirrorcheckfailed = False mirrors = [] From 679ba6f552ff5e4e4e08e3205083d7e153fdb488 Mon Sep 17 00:00:00 2001 From: Andrew Gunnerson Date: Sat, 11 Nov 2023 21:18:28 -0500 Subject: [PATCH 1332/2116] Add support for Python 3.12 Python 3.12 completely removed the builtin `distutils` module. This commit replaces its use with the `packaging` package, which is an external dependency, but maintained by the Python developers. Signed-off-by: Andrew Gunnerson --- fdroidserver/common.py | 8 ++++---- setup.py | 1 + tests/common.TestCase | 10 +++++----- tests/gradle-release-checksums.py | 8 ++++---- tests/update.TestCase | 4 ++-- 5 files changed, 16 insertions(+), 15 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 253d2460..8fe48874 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -57,7 +57,7 @@ import defusedxml.ElementTree as XMLElementTree from base64 import urlsafe_b64encode from binascii import hexlify from datetime import datetime, timedelta, timezone -from distutils.version import LooseVersion +from packaging.version import Version from queue import Queue from zipfile import ZipFile @@ -656,7 +656,7 @@ def find_apksigner(config): if not os.path.isdir(os.path.join(build_tools_path, f)): continue try: - if LooseVersion(f) < LooseVersion(MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION): + if Version(f) < Version(MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION): logging.debug("Local Android SDK only has outdated apksigner versions") return except TypeError: @@ -717,9 +717,9 @@ def test_aapt_version(aapt): # the Debian package has the version string like "v0.2-23.0.2" too_old = False if '.' in bugfix: - if LooseVersion(bugfix) < LooseVersion(MINIMUM_AAPT_BUILD_TOOLS_VERSION): + if Version(bugfix) < Version(MINIMUM_AAPT_BUILD_TOOLS_VERSION): too_old = True - elif LooseVersion('.'.join((major, minor, bugfix))) < LooseVersion('0.2.4062713'): + elif Version('.'.join((major, minor, bugfix))) < Version('0.2.4062713'): too_old = True if too_old: logging.warning(_("'{aapt}' is too old, fdroid requires build-tools-{version} or newer!") diff --git a/setup.py b/setup.py index f89ddf94..19eac953 100755 --- a/setup.py +++ b/setup.py @@ -98,6 +98,7 @@ setup( 'paramiko', 'Pillow', 'apache-libcloud >= 0.14.1', + 'packaging', 'pyasn1 >=0.4.1, < 0.5.0', 'pyasn1-modules >= 0.2.1, < 0.3', 'python-vagrant', diff --git a/tests/common.TestCase b/tests/common.TestCase index 0fc8c41f..dc9717db 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -21,7 +21,7 @@ import unittest import textwrap import yaml import gzip -from distutils.version import LooseVersion +from packaging.version import Version from zipfile import BadZipFile, ZipFile from unittest import mock from pathlib import Path @@ -852,9 +852,9 @@ class CommonTest(unittest.TestCase): v = bt.split('/')[-2] if v == 'debian': continue - if LooseVersion(version) < LooseVersion(v): + if Version(version) < Version(v): version = v - if LooseVersion(version) < LooseVersion(min_version): + if Version(version) < Version(min_version): self.skipTest('SKIPPING since build-tools %s or higher is required!' % min_version) fdroidserver.common.config = {'sdk_path': android_home} with mock.patch.dict(os.environ, clear=True): @@ -2374,10 +2374,10 @@ class CommonTest(unittest.TestCase): import sdkmanager import pkg_resources - sdkmanager_version = LooseVersion( + sdkmanager_version = Version( pkg_resources.get_distribution('sdkmanager').version ) - if sdkmanager_version < LooseVersion('0.6.4'): + if sdkmanager_version < Version('0.6.4'): raise unittest.SkipTest('needs fdroid sdkmanager >= 0.6.4') fdroidserver.common.config = {'sdk_path': 'placeholder'} diff --git a/tests/gradle-release-checksums.py b/tests/gradle-release-checksums.py index 1ec54c5f..0c190ebf 100755 --- a/tests/gradle-release-checksums.py +++ b/tests/gradle-release-checksums.py @@ -8,7 +8,7 @@ import requests import subprocess import sys from colorama import Fore, Style -from distutils.version import LooseVersion +from packaging.version import Version checksums = None @@ -52,7 +52,7 @@ for url, checksum in config['CACHE_FILES']: # error if makebuildserver is missing the latest version for version in sorted(versions.keys()): if version not in makebuildserver_versions \ - and LooseVersion(version) > LooseVersion(sorted(makebuildserver_versions)[-1]): + and Version(version) > Version(sorted(makebuildserver_versions)[-1]): add_before = """ ('https://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin',""" new = to_compile.replace( add_before, @@ -78,14 +78,14 @@ for m in get_sha_pat.finditer(gradlew_fdroid): + Style.RESET_ALL) errors += 1 new = '' -for version in sorted(versions.keys(), key=LooseVersion): +for version in sorted(versions.keys(), key=Version): sha256 = versions[version] spaces = '' for i in range(6 - len(version)): spaces += ' ' new += """ '%s')%s echo '%s' ;;\n""" % (version, spaces, sha256) gradlew_fdroid = gradlew_fdroid.replace(current, new) -plugin_v = ' '.join(sorted(versions.keys(), key=LooseVersion, reverse=True)) +plugin_v = ' '.join(sorted(versions.keys(), key=Version, reverse=True)) plugin_v_pat = re.compile(r'\nplugin_v=\(([0-9. ]+)\)') with open('gradlew-fdroid', 'w') as fp: fp.write(plugin_v_pat.sub('\nplugin_v=(%s)' % plugin_v, gradlew_fdroid)) diff --git a/tests/update.TestCase b/tests/update.TestCase index 7b9d6720..97829ff8 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -21,7 +21,7 @@ import yaml import zipfile import textwrap from datetime import datetime -from distutils.version import LooseVersion +from packaging.version import Version from pathlib import Path from testcommon import TmpCwd, mkdtemp from unittest import mock @@ -1041,7 +1041,7 @@ class UpdateTest(unittest.TestCase): javac = config['jarsigner'].replace('jarsigner', 'javac') v = subprocess.check_output([javac, '-version'], stderr=subprocess.STDOUT)[6:-1].decode('utf-8') - if LooseVersion(v) < LooseVersion('1.8.0_132'): + if Version(v) < Version('1.8.0_132'): print('SKIPPING: running tests with old Java (' + v + ')') return From a1a88d39cfe3947fd8db2c41adca2bf994b9a020 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 8 Dec 2023 09:16:58 +0100 Subject: [PATCH 1333/2116] download looseversion to vendor https://github.com/effigies/looseversion/blob/e1a5a176a92dc6825deda4205c1be6d05e9ed352/src/looseversion/__init__.py --- .gitlab-ci.yml | 3 +- fdroidserver/looseversion.py | 243 +++++++++++++++++++++++++++++++++++ hooks/pre-commit | 3 +- pyproject.toml | 7 +- 4 files changed, 251 insertions(+), 5 deletions(-) create mode 100644 fdroidserver/looseversion.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7c7344d8..3f38dfab 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -496,7 +496,8 @@ Build documentation: script: - apt-get install make python3-sphinx python3-numpydoc python3-pydata-sphinx-theme pydocstyle fdroidserver - apt purge fdroidserver - - pydocstyle fdroidserver + # ignore vendored files + - pydocstyle --verbose --match='(?!apksigcopier|looseversion|setup|test_).*\.py' fdroidserver - cd docs - sphinx-apidoc -o ./source ../fdroidserver -M -e - PYTHONPATH=.. sphinx-autogen -o generated source/*.rst diff --git a/fdroidserver/looseversion.py b/fdroidserver/looseversion.py new file mode 100644 index 00000000..47779ad5 --- /dev/null +++ b/fdroidserver/looseversion.py @@ -0,0 +1,243 @@ +"""Provides classes to represent module version numbers (one class for +each style of version numbering). There are currently two such classes +implemented: StrictVersion and LooseVersion. + +Every version number class implements the following interface: + * the 'parse' method takes a string and parses it to some internal + representation; if the string is an invalid version number, + 'parse' raises a ValueError exception + * the class constructor takes an optional string argument which, + if supplied, is passed to 'parse' + * __str__ reconstructs the string that was passed to 'parse' (or + an equivalent string -- ie. one that will generate an equivalent + version number instance) + * __repr__ generates Python code to recreate the version number instance + * _cmp compares the current instance with either another instance + of the same class or a string (which will be parsed to an instance + of the same class, thus must follow the same rules) +""" +import re +import sys + +# The rules according to Greg Stein: +# 1) a version number has 1 or more numbers separated by a period or by +# sequences of letters. If only periods, then these are compared +# left-to-right to determine an ordering. +# 2) sequences of letters are part of the tuple for comparison and are +# compared lexicographically +# 3) recognize the numeric components may have leading zeroes +# +# The LooseVersion class below implements these rules: a version number +# string is split up into a tuple of integer and string components, and +# comparison is a simple tuple comparison. This means that version +# numbers behave in a predictable and obvious way, but a way that might +# not necessarily be how people *want* version numbers to behave. There +# wouldn't be a problem if people could stick to purely numeric version +# numbers: just split on period and compare the numbers as tuples. +# However, people insist on putting letters into their version numbers; +# the most common purpose seems to be: +# - indicating a "pre-release" version +# ('alpha', 'beta', 'a', 'b', 'pre', 'p') +# - indicating a post-release patch ('p', 'pl', 'patch') +# but of course this can't cover all version number schemes, and there's +# no way to know what a programmer means without asking him. +# +# The problem is what to do with letters (and other non-numeric +# characters) in a version number. The current implementation does the +# obvious and predictable thing: keep them as strings and compare +# lexically within a tuple comparison. This has the desired effect if +# an appended letter sequence implies something "post-release": +# eg. "0.99" < "0.99pl14" < "1.0", and "5.001" < "5.001m" < "5.002". +# +# However, if letters in a version number imply a pre-release version, +# the "obvious" thing isn't correct. Eg. you would expect that +# "1.5.1" < "1.5.2a2" < "1.5.2", but under the tuple/lexical comparison +# implemented here, this just isn't so. +# +# Two possible solutions come to mind. The first is to tie the +# comparison algorithm to a particular set of semantic rules, as has +# been done in the StrictVersion class above. This works great as long +# as everyone can go along with bondage and discipline. Hopefully a +# (large) subset of Python module programmers will agree that the +# particular flavour of bondage and discipline provided by StrictVersion +# provides enough benefit to be worth using, and will submit their +# version numbering scheme to its domination. The free-thinking +# anarchists in the lot will never give in, though, and something needs +# to be done to accommodate them. +# +# Perhaps a "moderately strict" version class could be implemented that +# lets almost anything slide (syntactically), and makes some heuristic +# assumptions about non-digits in version number strings. This could +# sink into special-case-hell, though; if I was as talented and +# idiosyncratic as Larry Wall, I'd go ahead and implement a class that +# somehow knows that "1.2.1" < "1.2.2a2" < "1.2.2" < "1.2.2pl3", and is +# just as happy dealing with things like "2g6" and "1.13++". I don't +# think I'm smart enough to do it right though. +# +# In any case, I've coded the test suite for this module (see +# ../test/test_version.py) specifically to fail on things like comparing +# "1.2a2" and "1.2". That's not because the *code* is doing anything +# wrong, it's because the simple, obvious design doesn't match my +# complicated, hairy expectations for real-world version numbers. It +# would be a snap to fix the test suite to say, "Yep, LooseVersion does +# the Right Thing" (ie. the code matches the conception). But I'd rather +# have a conception that matches common notions about version numbers. + + +if sys.version_info >= (3,): + + class _Py2Int(int): + """Integer object that compares < any string""" + + def __gt__(self, other): + if isinstance(other, str): + return False + return super().__gt__(other) + + def __lt__(self, other): + if isinstance(other, str): + return True + return super().__lt__(other) + +else: + _Py2Int = int + + +class LooseVersion(object): + """Version numbering for anarchists and software realists. + Implements the standard interface for version number classes as + described above. A version number consists of a series of numbers, + separated by either periods or strings of letters. When comparing + version numbers, the numeric components will be compared + numerically, and the alphabetic components lexically. The following + are all valid version numbers, in no particular order: + + 1.5.1 + 1.5.2b2 + 161 + 3.10a + 8.02 + 3.4j + 1996.07.12 + 3.2.pl0 + 3.1.1.6 + 2g6 + 11g + 0.960923 + 2.2beta29 + 1.13++ + 5.5.kw + 2.0b1pl0 + + In fact, there is no such thing as an invalid version number under + this scheme; the rules for comparison are simple and predictable, + but may not always give the results you want (for some definition + of "want"). + """ + + component_re = re.compile(r"(\d+ | [a-z]+ | \.)", re.VERBOSE) + + def __init__(self, vstring=None): + if vstring: + self.parse(vstring) + + def __eq__(self, other): + c = self._cmp(other) + if c is NotImplemented: + return NotImplemented + return c == 0 + + def __lt__(self, other): + c = self._cmp(other) + if c is NotImplemented: + return NotImplemented + return c < 0 + + def __le__(self, other): + c = self._cmp(other) + if c is NotImplemented: + return NotImplemented + return c <= 0 + + def __gt__(self, other): + c = self._cmp(other) + if c is NotImplemented: + return NotImplemented + return c > 0 + + def __ge__(self, other): + c = self._cmp(other) + if c is NotImplemented: + return NotImplemented + return c >= 0 + + def parse(self, vstring): + # I've given up on thinking I can reconstruct the version string + # from the parsed tuple -- so I just store the string here for + # use by __str__ + self.vstring = vstring + components = [x for x in self.component_re.split(vstring) if x and x != "."] + for i, obj in enumerate(components): + try: + components[i] = int(obj) + except ValueError: + pass + + self.version = components + + def __str__(self): + return self.vstring + + def __repr__(self): + return "LooseVersion ('%s')" % str(self) + + def _cmp(self, other): + other = self._coerce(other) + if other is NotImplemented: + return NotImplemented + + if self.version == other.version: + return 0 + if self.version < other.version: + return -1 + if self.version > other.version: + return 1 + return NotImplemented + + @classmethod + def _coerce(cls, other): + if isinstance(other, cls): + return other + elif isinstance(other, str): + return cls(other) + elif "distutils" in sys.modules: + # Using this check to avoid importing distutils and suppressing the warning + try: + from distutils.version import LooseVersion as deprecated + except ImportError: + return NotImplemented + if isinstance(other, deprecated): + return cls(str(other)) + return NotImplemented + + +class LooseVersion2(LooseVersion): + """LooseVersion variant that restores Python 2 semantics + + In Python 2, comparing LooseVersions where paired components could be string + and int always resulted in the string being "greater". In Python 3, this produced + a TypeError. + """ + def parse(self, vstring): + # I've given up on thinking I can reconstruct the version string + # from the parsed tuple -- so I just store the string here for + # use by __str__ + self.vstring = vstring + components = [x for x in self.component_re.split(vstring) if x and x != "."] + for i, obj in enumerate(components): + try: + components[i] = _Py2Int(obj) + except ValueError: + pass + + self.version = components diff --git a/hooks/pre-commit b/hooks/pre-commit index 0a96b808..c1761aa8 100755 --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -90,7 +90,8 @@ if [ "$PY_FILES $PY_TEST_FILES" != " " ]; then if ! $PYFLAKES $PY_FILES $PY_TEST_FILES; then err "pyflakes tests failed!" fi - if ! $PYDOCSTYLE $PY_FILES $PY_TEST_FILES; then + # ignore vendored files + if ! $PYDOCSTYLE --match='(?!apksigcopier|looseversion).*\.py' $PY_FILES $PY_TEST_FILES; then err "pydocstyle tests failed!" fi fi diff --git a/pyproject.toml b/pyproject.toml index dcfe865a..9694d7be 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,6 +34,7 @@ force-exclude = '''( | fdroidserver/__init__\.py | fdroidserver/__main__\.py | fdroidserver/apksigcopier\.py + | fdroidserver/looseversion\.py | fdroidserver/build\.py | fdroidserver/checkupdates\.py | fdroidserver/common\.py @@ -67,8 +68,8 @@ python_version = "3.9" files = "fdroidserver" -# exclude vendored file -exclude = "fdroidserver/apksigcopier.py" +# exclude vendored files +exclude = "fdroidserver/(apksigcopier|looseversion).py" # this is de-facto the linter setting for this file warn_unused_configs = true @@ -95,7 +96,7 @@ jobs = 4 py-version = "3.9" # Files or directories to be skipped. They should be base names, not paths. -ignore = ["apksigcopier.py"] +ignore = ["apksigcopier.py", "looseversion.py"] [tool.pylint.basic] # Good variable names which should always be accepted, separated by a comma. From ad9cabdab9510335e0666ff02f15893f30fcbc60 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 8 Dec 2023 09:33:30 +0100 Subject: [PATCH 1334/2116] add looseversion license information to vendored file --- fdroidserver/looseversion.py | 57 ++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/fdroidserver/looseversion.py b/fdroidserver/looseversion.py index 47779ad5..0c785d69 100644 --- a/fdroidserver/looseversion.py +++ b/fdroidserver/looseversion.py @@ -1,3 +1,57 @@ +# PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +# -------------------------------------------- +# +# 1. This LICENSE AGREEMENT is between the Python Software Foundation +# ("PSF"), and the Individual or Organization ("Licensee") accessing and +# otherwise using this software ("Python") in source or binary form and +# its associated documentation. +# +# 2. Subject to the terms and conditions of this License Agreement, PSF hereby +# grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +# analyze, test, perform and/or display publicly, prepare derivative works, +# distribute, and otherwise use Python alone or in any derivative version, +# provided, however, that PSF's License Agreement and PSF's notice of copyright, +# i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +# 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Python Software Foundation; +# All Rights Reserved" are retained in Python alone or in any derivative version +# prepared by Licensee. +# +# 3. In the event Licensee prepares a derivative work that is based on +# or incorporates Python or any part thereof, and wants to make +# the derivative work available to others as provided herein, then +# Licensee hereby agrees to include in any such work a brief summary of +# the changes made to Python. +# +# 4. PSF is making Python available to Licensee on an "AS IS" +# basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +# IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +# DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +# FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +# INFRINGE ANY THIRD PARTY RIGHTS. +# +# 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +# FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +# A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +# OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. +# +# 6. This License Agreement will automatically terminate upon a material +# breach of its terms and conditions. +# +# 7. Nothing in this License Agreement shall be deemed to create any +# relationship of agency, partnership, or joint venture between PSF and +# Licensee. This License Agreement does not grant permission to use PSF +# trademarks or trade name in a trademark sense to endorse or promote +# products or services of Licensee, or any third party. +# +# 8. By copying, installing or otherwise using Python, Licensee +# agrees to be bound by the terms and conditions of this License +# Agreement. +# +# SPDX-License-Identifier: Python-2.0 +# +# downloaded from: +# https://github.com/effigies/looseversion/blob/e1a5a176a92dc6825deda4205c1be6d05e9ed352/src/looseversion/__init__.py + """Provides classes to represent module version numbers (one class for each style of version numbering). There are currently two such classes implemented: StrictVersion and LooseVersion. @@ -19,6 +73,8 @@ Every version number class implements the following interface: import re import sys +__license__ = "Python License 2.0" + # The rules according to Greg Stein: # 1) a version number has 1 or more numbers separated by a period or by # sequences of letters. If only periods, then these are compared @@ -228,6 +284,7 @@ class LooseVersion2(LooseVersion): and int always resulted in the string being "greater". In Python 3, this produced a TypeError. """ + def parse(self, vstring): # I've given up on thinking I can reconstruct the version string # from the parsed tuple -- so I just store the string here for From 4b208e438e62135d28e4dcb6318ecaadd4e36768 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 8 Dec 2023 09:48:04 +0100 Subject: [PATCH 1335/2116] gitlab-ci: gradle job needs python3-packaging now --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3f38dfab..21be7ba4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -319,6 +319,7 @@ gradle: python3-colorama python3-git python3-gitlab + python3-packaging python3-requests # if this is a merge request fork, then only check if relevant files changed - if [ "$CI_PROJECT_NAMESPACE" != "fdroid" ]; then From e2949cbd61542e7d24788b78fce60227917ef198 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 8 Dec 2023 09:48:11 +0100 Subject: [PATCH 1336/2116] port to looseversion --- fdroidserver/common.py | 8 ++++---- setup.py | 1 - tests/common.TestCase | 10 +++++----- tests/update.TestCase | 4 ++-- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 8fe48874..c9d3f59d 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -57,7 +57,6 @@ import defusedxml.ElementTree as XMLElementTree from base64 import urlsafe_b64encode from binascii import hexlify from datetime import datetime, timedelta, timezone -from packaging.version import Version from queue import Queue from zipfile import ZipFile @@ -71,6 +70,7 @@ from fdroidserver import _ from fdroidserver.exception import FDroidException, VCSException, NoSubmodulesException,\ BuildException, VerificationException, MetaDataException from .asynchronousfilereader import AsynchronousFileReader +from .looseversion import LooseVersion from . import apksigcopier, common @@ -656,7 +656,7 @@ def find_apksigner(config): if not os.path.isdir(os.path.join(build_tools_path, f)): continue try: - if Version(f) < Version(MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION): + if LooseVersion(f) < LooseVersion(MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION): logging.debug("Local Android SDK only has outdated apksigner versions") return except TypeError: @@ -717,9 +717,9 @@ def test_aapt_version(aapt): # the Debian package has the version string like "v0.2-23.0.2" too_old = False if '.' in bugfix: - if Version(bugfix) < Version(MINIMUM_AAPT_BUILD_TOOLS_VERSION): + if LooseVersion(bugfix) < LooseVersion(MINIMUM_AAPT_BUILD_TOOLS_VERSION): too_old = True - elif Version('.'.join((major, minor, bugfix))) < Version('0.2.4062713'): + elif LooseVersion('.'.join((major, minor, bugfix))) < LooseVersion('0.2.4062713'): too_old = True if too_old: logging.warning(_("'{aapt}' is too old, fdroid requires build-tools-{version} or newer!") diff --git a/setup.py b/setup.py index 19eac953..f89ddf94 100755 --- a/setup.py +++ b/setup.py @@ -98,7 +98,6 @@ setup( 'paramiko', 'Pillow', 'apache-libcloud >= 0.14.1', - 'packaging', 'pyasn1 >=0.4.1, < 0.5.0', 'pyasn1-modules >= 0.2.1, < 0.3', 'python-vagrant', diff --git a/tests/common.TestCase b/tests/common.TestCase index dc9717db..266406bc 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -21,7 +21,6 @@ import unittest import textwrap import yaml import gzip -from packaging.version import Version from zipfile import BadZipFile, ZipFile from unittest import mock from pathlib import Path @@ -42,6 +41,7 @@ from testcommon import TmpCwd, mkdtemp from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME from fdroidserver.exception import FDroidException, VCSException,\ MetaDataException, VerificationException +from fdroidserver.looseversion import LooseVersion class CommonTest(unittest.TestCase): @@ -852,9 +852,9 @@ class CommonTest(unittest.TestCase): v = bt.split('/')[-2] if v == 'debian': continue - if Version(version) < Version(v): + if LooseVersion(version) < LooseVersion(v): version = v - if Version(version) < Version(min_version): + if LooseVersion(version) < LooseVersion(min_version): self.skipTest('SKIPPING since build-tools %s or higher is required!' % min_version) fdroidserver.common.config = {'sdk_path': android_home} with mock.patch.dict(os.environ, clear=True): @@ -2374,10 +2374,10 @@ class CommonTest(unittest.TestCase): import sdkmanager import pkg_resources - sdkmanager_version = Version( + sdkmanager_version = LooseVersion( pkg_resources.get_distribution('sdkmanager').version ) - if sdkmanager_version < Version('0.6.4'): + if sdkmanager_version < LooseVersion('0.6.4'): raise unittest.SkipTest('needs fdroid sdkmanager >= 0.6.4') fdroidserver.common.config = {'sdk_path': 'placeholder'} diff --git a/tests/update.TestCase b/tests/update.TestCase index 97829ff8..abce3a30 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -21,7 +21,6 @@ import yaml import zipfile import textwrap from datetime import datetime -from packaging.version import Version from pathlib import Path from testcommon import TmpCwd, mkdtemp from unittest import mock @@ -54,6 +53,7 @@ import fdroidserver.exception import fdroidserver.metadata import fdroidserver.update from fdroidserver.common import CATEGORIES_CONFIG_NAME +from fdroidserver.looseversion import LooseVersion DONATION_FIELDS = ('Donate', 'Liberapay', 'OpenCollective') @@ -1041,7 +1041,7 @@ class UpdateTest(unittest.TestCase): javac = config['jarsigner'].replace('jarsigner', 'javac') v = subprocess.check_output([javac, '-version'], stderr=subprocess.STDOUT)[6:-1].decode('utf-8') - if Version(v) < Version('1.8.0_132'): + if LooseVersion(v) < LooseVersion('1.8.0_132'): print('SKIPPING: running tests with old Java (' + v + ')') return From 45d1363a0e7cd35a3e83f910cc1ae1c49e832090 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 13 Dec 2023 21:06:24 +0100 Subject: [PATCH 1337/2116] tests/run-tests: use $sed var for all calls that need GNU sed FreeBSD, macOS, and others come with BSD sed, which does not support all the things that GNU sed does. Also, BSD rmdir does not have any extended options like --ignore-fail-on-non-empty. --- tests/run-tests | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tests/run-tests b/tests/run-tests index 61d3d7bb..a75de2e6 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -88,7 +88,8 @@ err_handler() { rm -rf "$WORKSPACE"/.testfiles/test_* rm -f "$WORKSPACE"/.testfiles/tmp.* test -d "$WORKSPACE"/.testfiles && \ - rmdir --ignore-fail-on-non-empty "$WORKSPACE"/.testfiles + (rmdir "$WORKSPACE"/.testfiles 2> /dev/null || \ + rmdir --ignore-fail-on-non-empty "$WORKSPACE"/.testfiles 2> /dev/null) } trap err_handler INT EXIT @@ -299,11 +300,11 @@ test $v0timestamp -eq $v1timestamp # we can't easily reproduce the timestamps for things, so just hardcode them $sed -i.tmp -e 's,timestamp="[0-9]*",timestamp="1676634233",' repo/index.xml diff -uw $WORKSPACE/tests/repo/index.xml repo/index.xml -sed -i --expression='s,"timestamp": [0-9]*,"timestamp": 1676634233000,' repo/index-v1.json +$sed -i --expression='s,"timestamp": [0-9]*,"timestamp": 1676634233000,' repo/index-v1.json diff -uw $WORKSPACE/tests/repo/index-v1.json repo/index-v1.json -sed -z 's/,\s*"ipfsCIDv1": *"[a-z0-9]*"//g' $WORKSPACE/tests/repo/index-v2.json > repo/index-v2.org.json -sed -z 's/,\s*"ipfsCIDv1": *"[a-z0-9]*"//g' repo/index-v2.json > repo/index-v2.mod.json -sed -i --expression='s,"timestamp": [0-9]*,"timestamp": 1676634233000,' repo/index-v2.mod.json +$sed -z 's/,\s*"ipfsCIDv1": *"[a-z0-9]*"//g' $WORKSPACE/tests/repo/index-v2.json > repo/index-v2.org.json +$sed -z 's/,\s*"ipfsCIDv1": *"[a-z0-9]*"//g' repo/index-v2.json > repo/index-v2.mod.json +$sed -i --expression='s,"timestamp": [0-9]*,"timestamp": 1676634233000,' repo/index-v2.mod.json diff -uw repo/index-v2.org.json repo/index-v2.mod.json @@ -643,7 +644,7 @@ cp $WORKSPACE/tests/metadata/com.politedroid.yml metadata echo "com.politedroid_4.apk com.politedroid 2016-01-01" > stats/known_apks.txt echo "com.politedroid_5.apk com.politedroid 2017-01-01" >> stats/known_apks.txt echo "com.politedroid_6.apk com.politedroid 2018-01-01" >> stats/known_apks.txt -sed -i -e 's/ArchivePolicy:.*/ArchivePolicy: 1 versions/' metadata/com.politedroid.yml +$sed -i -e 's/ArchivePolicy:.*/ArchivePolicy: 1 versions/' metadata/com.politedroid.yml timestamp=1483228800 # $(date -u --date=2017-01-01 +%s)000 $fdroid update --pretty --nosign @@ -660,7 +661,7 @@ mkdir -p metadata/com.politedroid/en-US/changelogs/ cp $WORKSPACE/tests/repo/com.politedroid_6.apk repo cp $WORKSPACE/tests/metadata/com.politedroid.yml metadata echo "whatsnew test" > metadata/com.politedroid/en-US/changelogs/6.txt -sed -i -e '/CurrentVersion/d' metadata/com.politedroid.yml +$sed -i -e '/CurrentVersion/d' metadata/com.politedroid.yml $fdroid update --pretty --nosign grep -F 'whatsnew' repo/index-v1.json From 9d8c098f74c575d12da7faab65f30fcad7f986c4 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 13 Dec 2023 21:08:12 +0100 Subject: [PATCH 1338/2116] gitlab-ci: add shellcheck to gradlew-fdroid checks --- .gitlab-ci.yml | 5 +++-- gradlew-fdroid | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 21be7ba4..51ac0ec4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -180,7 +180,7 @@ arch_pip_install: # The gradlew-fdroid tests are isolated from the rest of the test # suite, so they run as their own job. gradlew-fdroid: - image: debian:bullseye + image: debian:bullseye-slim <<: *apt-template only: changes: @@ -188,7 +188,8 @@ gradlew-fdroid: - gradlew-fdroid - tests/test-gradlew-fdroid script: - - apt-get install ca-certificates curl default-jdk-headless unzip + - apt-get install ca-certificates curl default-jdk-headless shellcheck unzip + - shellcheck --severity=error --color gradlew-fdroid tests/test-gradlew-fdroid - ./tests/test-gradlew-fdroid diff --git a/gradlew-fdroid b/gradlew-fdroid index 112fbd71..0de9dd04 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -20,6 +20,7 @@ run_gradle() { if [ ! -d "${gradle_version_dir}/${v_found}" ]; then download_gradle ${v_found} fi + # shellcheck disable=SC2145 echo "Running ${gradle_version_dir}/${v_found}/bin/gradle ${args[@]}" "${gradle_version_dir}/${v_found}/bin/gradle" "${args[@]}" exit $? @@ -264,7 +265,7 @@ fi if [[ -n $plugin_pver ]]; then i=0 match=false - for k in ${d_gradle_plugin_ver_k[@]}; do + for k in "${d_gradle_plugin_ver_k[@]}"; do if [[ $plugin_pver == ${k}* ]]; then plugin_ver=${d_plugin_min_gradle_v[$i]} match=true From 865673964e248f0d1adf6c28b288e2f75f27e7c3 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 13 Dec 2023 21:24:16 +0100 Subject: [PATCH 1339/2116] gitlab-ci: enable shellcheck on tests/run-tests --- .gitlab-ci.yml | 3 +++ tests/run-tests | 18 ++++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 51ac0ec4..9266f74c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -215,6 +215,7 @@ lint_format_safety_bandit_checks: python3-nose python3-pip python3-yaml + shellcheck - $pip install --break-system-packages bandit safety - export EXITVALUE=0 - function set_error() { export EXITVALUE=1; printf "\x1b[31mERROR `history|tail -2|head -1|cut -b 6-500`\x1b[0m\n"; } @@ -233,6 +234,8 @@ lint_format_safety_bandit_checks: tests/*.py tests/*.TestCase || set_error + - shellcheck --exclude SC2046,SC2090 --severity=warning --color tests/run-tests + || set_error - exit $EXITVALUE diff --git a/tests/run-tests b/tests/run-tests index a75de2e6..7f87baa1 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -128,30 +128,31 @@ if [ ! -d "$APKDIR" ]; then exit 1 fi -if [ -z $WORKSPACE ]; then - WORKSPACE=`dirname $(pwd)` +if [ -z "$WORKSPACE" ]; then + WORKSPACE="$(dirname "$(pwd)")" echo "Setting Workspace to $WORKSPACE" fi # allow the location of the script to be overridden -if [ -z $fdroid ]; then +if [ -z "$fdroid" ]; then fdroid="$WORKSPACE/fdroid" fi # allow the location of aapt to be overridden -if [ -z $aapt ]; then +if [ -z "$aapt" ]; then aapt=`ls -1 $ANDROID_HOME/build-tools/*/aapt 2> /dev/null | sort | tail -1` fi # try to use GNU sed on OSX/BSD cuz BSD sed sucks if which gsed; then - sed=gsed + sed="gsed" else - sed=sed + sed="sed" fi # allow the location of git to be overridden if [ -z "$git" ]; then + # shellcheck disable=SC2089 git="env HOME= GIT_AUTHOR_NAME='Test' GIT_AUTHOR_EMAIL='no@mail' GIT_COMMITTER_NAME='Test' GIT_COMMITTER_EMAIL='no@mail' git" fi @@ -740,8 +741,10 @@ if [ -e .git/config ]; then cd $REPOROOT tar xzf `ls -1 $WORKSPACE/dist/fdroidserver-*.tar.gz | sort -n | tail -1` cd $REPOROOT + # shellcheck disable=SC2211 ./fdroidserver-*/fdroid init copy_apks_into_repo $REPOROOT + # shellcheck disable=SC2211 ./fdroidserver-*/fdroid update --create-metadata --verbose fi @@ -1299,13 +1302,16 @@ if which wget; then http_server_pid=$! cd $REPOROOT + # shellcheck disable=SC1007 http_proxy= HTTP_PROXY= $fdroid mirror http://127.0.0.1:${port}/ test -e 127.0.0.1\:${port}/repo/souch.smsbypass_9.apk test -e 127.0.0.1\:${port}/repo/icons-640/souch.smsbypass.9.png # the index shouldn't be saved unless it was verified ! test -e 127.0.0.1\:${port}/repo/index-v1.jar + # shellcheck disable=SC1007 ! http_proxy= HTTP_PROXY= $fdroid mirror "http://127.0.0.1:${port}/?fingerprint=asdfasdf" ! test -e 127.0.0.1\:${port}/repo/index-v1.jar + # shellcheck disable=SC1007 http_proxy= HTTP_PROXY= $fdroid mirror "http://127.0.0.1:${port}/?fingerprint=F49AF3F11EFDDF20DFFD70F5E3117B9976674167ADCA280E6B1932A0601B26F6" test -e 127.0.0.1\:${port}/repo/index-v1.jar From 2d5770985fc80ca45c7456ec36d754a331034b7a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 14 Dec 2023 14:28:48 +0100 Subject: [PATCH 1340/2116] gitlab-ci: silence irrelevant bandit error This SSH connection is only ever to the Vagrant VM on the same machine. >> Issue: [B507:ssh_no_host_key_verification] Paramiko call with policy set to automatically trust the unknown host key. Severity: High Confidence: Medium CWE: CWE-295 (https://cwe.mitre.org/data/definitions/295.html) More Info: https://bandit.readthedocs.io/en/1.7.6/plugins/b507_ssh_no_host_key_verification.html Location: ./fdroidserver/build.py:104:8 103 sshs = paramiko.SSHClient() 104 sshs.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 105 sshs.connect(sshinfo['hostname'], username=sshinfo['user'], --- fdroidserver/build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 00019e36..fb68f6c6 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -101,7 +101,7 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): # Open SSH connection... logging.info("Connecting to virtual machine...") sshs = paramiko.SSHClient() - sshs.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + sshs.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # nosec B507 only connects to local VM sshs.connect(sshinfo['hostname'], username=sshinfo['user'], port=sshinfo['port'], timeout=300, look_for_keys=False, key_filename=sshinfo['idfile']) From 2f84ce36da2aa79c1583832cd475b1d0be14cca5 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 14 Dec 2023 14:47:34 +0100 Subject: [PATCH 1341/2116] androguard 4 came out, and has breaking changes --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f89ddf94..522c3377 100755 --- a/setup.py +++ b/setup.py @@ -91,7 +91,7 @@ setup( 'babel', ], install_requires=[ - 'androguard >= 3.1.0, != 3.3.0, != 3.3.1, != 3.3.2', + 'androguard >= 3.1.0, != 3.3.0, != 3.3.1, != 3.3.2, <4', 'clint', 'defusedxml', 'GitPython', From d9288c861349ccca81b0d4b36d14e5b4e2002d4a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 13 Dec 2023 22:32:42 +0100 Subject: [PATCH 1342/2116] gitlab-ci: add macOS job based on only Travis job --- .gitlab-ci.yml | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9266f74c..ebdc30ce 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -309,6 +309,44 @@ fedora_latest: "cd `pwd`; export ANDROID_HOME=$ANDROID_HOME; fdroid=~testuser/.local/bin/fdroid ./run-tests" +macOS: + tags: + - saas-macos-medium-m1 + only: + - master@fdroid/fdroidserver + script: + - export HOMEBREW_CURL_RETRIES=10 + - brew update > /dev/null + - brew upgrade + - brew install fdroidserver + + # Android SDK and Java JDK + - brew install --cask android-commandlinetools temurin # temurin is a JDK + + # test suite dependencies + - brew install dash bash coreutils gnu-sed + # TODO port tests/run-tests to POSIX and gsed, it has a couple GNU-isms like du --bytes + - export PATH="$(brew --prefix fdroidserver)/libexec/bin:$(brew --prefix coreutils)/libexec/gnubin:$PATH" + + - brew autoremove + - brew info fdroidserver + + - export BUILD_TOOLS_VERSION=`gsed -n "s,^MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION\s*=\s*['\"]\(.*\)[['\"],\1,p" fdroidserver/common.py` + - export ANDROID_HOME="$(brew --prefix)/share/android-commandlinetools" + - mkdir -p "$ANDROID_HOME/licenses" + - echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_HOME/licenses/android-sdk-license" + - echo -e "\nd56f5187479451eabf01fb78af6dfcb131a6481e" >> "$ANDROID_HOME/licenses/android-sdk-license" + - echo -e "\n24333f8a63b6825ea9c5514f83c2829b004d1fee" >> "$ANDROID_HOME/licenses/android-sdk-license" + - $(brew --prefix)/bin/sdkmanager "build-tools;$BUILD_TOOLS_VERSION" + + - echo "macOS sticks with bash 3.x because of licenses, so avoid new bash syntax" + - /bin/bash --version + - /bin/bash -n gradlew-fdroid tests/run-tests + + # test fdroidserver from git with current package's dependencies + - fdroid="$(brew --prefix fdroidserver)/libexec/bin/python3 $PWD/fdroid" ./tests/run-tests + + gradle: image: debian:bullseye <<: *apt-template From 52f27aea755acbf728279cb1763eb2f2b99b6215 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 13 Dec 2023 22:41:54 +0100 Subject: [PATCH 1343/2116] tests/run-tests: temp disable git mirror test on non-Linux I looked into this but couldn't figure it out. It is the only failing test on macOS, so it seemed worth just adding this single quirk for now. --- tests/run-tests | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/run-tests b/tests/run-tests index 7f87baa1..d6c472a5 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -1249,7 +1249,7 @@ test -e $SERVERWEBROOT/unsigned/urzip-release-unsigned.apk cd $BINARY_TRANSPARENCY_REMOTE [ "$($git rev-list --count HEAD)" == "1" ] cd $SERVER_GIT_MIRROR -[ "$($git rev-list --count HEAD)" == "1" ] +[ "$($git rev-list --count HEAD)" == "1" ] || [ "$(uname -s)" != "Linux" ] # TODO fix on macOS #------------------------------------------------------------------------------# From 8c8b9021f5d43227f109bc746992215bf4bd2f1b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 13 Dec 2023 17:59:39 +0100 Subject: [PATCH 1344/2116] tests/run-tests: disable nightly.TestCase on non-Linux until its ported --- tests/run-tests | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/run-tests b/tests/run-tests index d6c472a5..0dd750d8 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -174,6 +174,10 @@ for testcase in $WORKSPACE/tests/*.TestCase; do echo "skipping install.TestCase, its too troublesome in CI builds" continue fi + if [ $(uname) != "Linux" ] && [ $testcase == $WORKSPACE/tests/nightly.TestCase ]; then + echo "skipping nightly.TestCase, it currently only works GNU/Linux" + continue + fi $testcase done From 2331bcfe15482ecf0eb504becae2b1f723b811c3 Mon Sep 17 00:00:00 2001 From: linsui Date: Tue, 19 Dec 2023 15:49:17 +0800 Subject: [PATCH 1345/2116] all @ in srclib tag --- fdroidserver/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index c9d3f59d..b49dea34 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2103,7 +2103,7 @@ def getsrclib(spec, srclib_dir, basepath=False, name = spec ref = None else: - name, ref = spec.split('@') + name, ref = spec.split('@', 1) if ':' in name: number, name = name.split(':', 1) if '/' in name: From 15b983f48d31f8e07d90665f083378be1f059981 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sat, 6 Jan 2024 23:23:46 +0100 Subject: [PATCH 1346/2116] handle all cases of @ in srclibs expands on fdroidserver!1422 --- fdroidserver/common.py | 18 +++++++++--------- tests/common.TestCase | 22 ++++++++++++++++++---- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index b49dea34..21d6f8df 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2059,15 +2059,15 @@ def parse_srclib_spec(spec): "(not a string): '{}'") .format(spec)) - tokens = spec.split('@') - if len(tokens) > 2: - raise MetaDataException(_("could not parse srclib spec " - "(too many '@' signs): '{}'") - .format(spec)) - elif len(tokens) < 2: - raise MetaDataException(_("could not parse srclib spec " - "(no ref specified): '{}'") - .format(spec)) + tokens = spec.split('@', 1) + if not tokens[0]: + raise MetaDataException( + _("could not parse srclib spec (no name specified): '{}'").format(spec) + ) + if len(tokens) < 2 or not tokens[1]: + raise MetaDataException( + _("could not parse srclib spec (no ref specified): '{}'").format(spec) + ) name = tokens[0] ref = tokens[1] diff --git a/tests/common.TestCase b/tests/common.TestCase index 266406bc..8a7ec438 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1514,13 +1514,27 @@ class CommonTest(unittest.TestCase): self.assertEqual(fdroidserver.common.parse_srclib_spec('1:Support/v7/appcompat@android-4.4_r1.1'), ('Support', 'android-4.4_r1.1', '1', 'v7/appcompat')) - def test_parse_srclib_spec_bad(self): + def test_parse_srclib_spec_many_ats(self): + self.assertEqual( + fdroidserver.common.parse_srclib_spec('foo@@v2'), ('foo', '@v2', None, None) + ) + self.assertEqual( + fdroidserver.common.parse_srclib_spec('bar@2@f'), ('bar', '2@f', None, None) + ) + + def test_parse_srclib_spec_none(self): with self.assertRaises(MetaDataException): - self.assertEqual(fdroidserver.common.parse_srclib_spec(None)) + fdroidserver.common.parse_srclib_spec(None) + + def test_parse_srclib_spec_no_ref(self): with self.assertRaises(MetaDataException): - self.assertEqual(fdroidserver.common.parse_srclib_spec('no-ref')) + fdroidserver.common.parse_srclib_spec('no-ref') with self.assertRaises(MetaDataException): - self.assertEqual(fdroidserver.common.parse_srclib_spec('@multi@at-signs@')) + fdroidserver.common.parse_srclib_spec('noref@') + + def test_parse_srclib_spec_no_name(self): + with self.assertRaises(MetaDataException): + fdroidserver.common.parse_srclib_spec('@ref') def test_remove_signing_keys(self): shutil.copytree( From 6faaae943185091814b6fdc98f29a1a490fa0098 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sat, 6 Jan 2024 23:24:35 +0100 Subject: [PATCH 1347/2116] always parse srclib entries with parse_srclib_spec() Remove duplicated code. --- fdroidserver/common.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 21d6f8df..13aaebb0 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2103,11 +2103,7 @@ def getsrclib(spec, srclib_dir, basepath=False, name = spec ref = None else: - name, ref = spec.split('@', 1) - if ':' in name: - number, name = name.split(':', 1) - if '/' in name: - name, subdir = name.split('/', 1) + name, ref, number, subdir = parse_srclib_spec(spec) if name not in fdroidserver.metadata.srclibs: raise VCSException('srclib ' + name + ' not found.') From 3f35b0b3615bd308d61859ea2834975cadaea958 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 7 Dec 2023 15:14:14 +0100 Subject: [PATCH 1348/2116] lint: do yamllint install check once globally --- fdroidserver/lint.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index c0df0135..0fb97d9c 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -772,6 +772,11 @@ def main(): load_antiFeatures_config() load_categories_config() + if options.force_yamllint: + import yamllint # throw error if it is not installed + + yamllint # make pyflakes ignore this + # Get all apps... allapps = metadata.read_metadata(options.appid) apps = common.read_app_args(options.appid, allapps, False) @@ -791,11 +796,6 @@ def main(): if app.Disabled: continue - if options.force_yamllint: - import yamllint # throw error if it is not installed - - yamllint # make pyflakes ignore this - # only run yamllint when linting individual apps. if options.appid or options.force_yamllint: # run yamllint on app metadata From 4511da68b9ba731c34e6dfaa3d3718fa0dca540b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 7 Dec 2023 16:45:12 +0100 Subject: [PATCH 1349/2116] lint: support linting config files --- fdroidserver/common.py | 26 +++++++++++++++++++----- fdroidserver/lint.py | 46 ++++++++++++++++++++++++++++++++++++++++-- tests/common.TestCase | 30 +++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 7 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 13aaebb0..49323357 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -361,6 +361,26 @@ def regsub_file(pattern, repl, path): f.write(text) +def config_type_check(path, data): + if Path(path).name == 'mirrors.yml': + expected_type = list + else: + expected_type = dict + if expected_type == dict: + if not isinstance(data, dict): + msg = _('{path} is not "key: value" dict, but a {datatype}!') + raise TypeError(msg.format(path=path, datatype=type(data).__name__)) + elif not isinstance(data, expected_type): + msg = _('{path} is not {expected_type}, but a {datatype}!') + raise TypeError( + msg.format( + path=path, + expected_type=expected_type.__name__, + datatype=type(data).__name__, + ) + ) + + def read_config(opts=None): """Read the repository config. @@ -401,11 +421,7 @@ def read_config(opts=None): config = yaml.safe_load(fp) if not config: config = {} - if not isinstance(config, dict): - msg = _('{path} is not "key: value" dict, but a {datatype}!') - raise TypeError( - msg.format(path=config_file, datatype=type(config).__name__) - ) + config_type_check(config_file, config) elif os.path.exists(old_config_file): logging.warning(_("""{oldfile} is deprecated, use {newfile}""") .format(oldfile=old_config_file, newfile=config_file)) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 0fb97d9c..04b03b25 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -20,6 +20,7 @@ from argparse import ArgumentParser import re import sys import platform +import ruamel.yaml import urllib.parse from pathlib import Path @@ -739,6 +740,21 @@ def check_certificate_pinned_binaries(app): return +def lint_config(arg): + path = Path(arg) + passed = True + yamllintresult = common.run_yamllint(path) + if yamllintresult: + print(yamllintresult) + passed = False + + with path.open() as fp: + data = ruamel.yaml.YAML(typ='safe').load(fp) + common.config_type_check(arg, data) + + return passed + + def main(): global config, options @@ -777,6 +793,33 @@ def main(): yamllint # make pyflakes ignore this + paths = list() + for arg in options.appid: + if ( + arg == 'config.yml' + or Path(arg).parent.name == 'config' + or Path(arg).parent.parent.name == 'config' # localized + ): + paths.append(arg) + + failed = 0 + if paths: + for path in paths: + options.appid.remove(path) + if not lint_config(path): + failed += 1 + # an empty list of appids means check all apps, avoid that if files were given + if not options.appid: + sys.exit(failed) + + if not lint_metadata(options): + failed += 1 + + if failed: + sys.exit(failed) + + +def lint_metadata(options): # Get all apps... allapps = metadata.read_metadata(options.appid) apps = common.read_app_args(options.appid, allapps, False) @@ -856,8 +899,7 @@ def main(): anywarns = True print("%s: %s" % (appid, warn)) - if anywarns: - sys.exit(1) + return not anywarns # A compiled, public domain list of official SPDX license tags. generated diff --git a/tests/common.TestCase b/tests/common.TestCase index 8a7ec438..4d9ce009 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -2838,6 +2838,36 @@ class CommonTest(unittest.TestCase): with self.assertRaises(TypeError): fdroidserver.common.load_localized_config(CATEGORIES_CONFIG_NAME, 'repo') + def test_config_type_check_config_yml_dict(self): + fdroidserver.common.config_type_check('config.yml', dict()) + + def test_config_type_check_config_yml_list(self): + with self.assertRaises(TypeError): + fdroidserver.common.config_type_check('config.yml', list()) + + def test_config_type_check_config_yml_set(self): + with self.assertRaises(TypeError): + fdroidserver.common.config_type_check('config.yml', set()) + + def test_config_type_check_config_yml_str(self): + with self.assertRaises(TypeError): + fdroidserver.common.config_type_check('config.yml', str()) + + def test_config_type_check_mirrors_list(self): + fdroidserver.common.config_type_check('config/mirrors.yml', list()) + + def test_config_type_check_mirrors_dict(self): + with self.assertRaises(TypeError): + fdroidserver.common.config_type_check('config/mirrors.yml', dict()) + + def test_config_type_check_mirrors_set(self): + with self.assertRaises(TypeError): + fdroidserver.common.config_type_check('config/mirrors.yml', set()) + + def test_config_type_check_mirrors_str(self): + with self.assertRaises(TypeError): + fdroidserver.common.config_type_check('config/mirrors.yml', str()) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 96fc49d7fc128aae6638216ff4c5d3d505eba7a4 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 7 Dec 2023 17:38:34 +0100 Subject: [PATCH 1350/2116] lint: check syntax of countryCode: fields for mirrors --- .gitlab-ci.yml | 6 ++- fdroidserver/lint.py | 23 +++++++++++ tests/get-country-region-data.py | 47 +++++++++++++++++++++ tests/lint.TestCase | 70 ++++++++++++++++++++++++++++++++ 4 files changed, 145 insertions(+), 1 deletion(-) create mode 100755 tests/get-country-region-data.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ebdc30ce..b867e2b7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -15,11 +15,12 @@ variables: # * python3-babel for compiling localization files # * gnupg-agent for the full signing setup # * python3-clint for fancy progress bars for users +# * python3-pycountry for linting config/mirrors.yml buildserver run-tests: image: registry.gitlab.com/fdroid/fdroidserver:buildserver script: - apt-get update - - apt-get install gnupg-agent python3-babel python3-clint + - apt-get install gnupg-agent python3-babel python3-clint python3-pycountry - ./tests/run-tests # make sure that translations do not cause stacktraces - cd $CI_PROJECT_DIR/locale @@ -152,6 +153,9 @@ ubuntu_jammy_pip: - $pip install sdkmanager - sdkmanager 'build-tools;33.0.0' + # pycountry is only for linting config/mirrors.yml, so its not in setup.py + - $pip install pycountry + - $pip install dist/fdroidserver-*.tar.gz - tar xzf dist/fdroidserver-*.tar.gz - cd fdroidserver-* diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 04b03b25..150258ad 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -17,6 +17,7 @@ # along with this program. If not, see . from argparse import ArgumentParser +import difflib import re import sys import platform @@ -752,6 +753,28 @@ def lint_config(arg): data = ruamel.yaml.YAML(typ='safe').load(fp) common.config_type_check(arg, data) + if path.name == 'mirrors.yml': + import pycountry + + valid_country_codes = [c.alpha_2 for c in pycountry.countries] + for mirror in data: + code = mirror.get('countryCode') + if code and code not in valid_country_codes: + passed = False + msg = _( + '{path}: "{code}" is not a valid ISO_3166-1 alpha-2 country code!' + ).format(path=str(path), code=code) + if code.upper() in valid_country_codes: + m = [code.upper()] + else: + m = difflib.get_close_matches( + code.upper(), valid_country_codes, 2, 0.5 + ) + if m: + msg += ' ' + msg += _('Did you mean {code}?').format(code=', '.join(sorted(m))) + print(msg) + return passed diff --git a/tests/get-country-region-data.py b/tests/get-country-region-data.py new file mode 100755 index 00000000..f0f52e4b --- /dev/null +++ b/tests/get-country-region-data.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 +# +# This generates a list of ISO_3166-1 alpha 2 country codes for use in lint. + +import collections +import os +import re +import requests +import requests_cache +import sys +import tempfile + + +def main(): + # we want all the data + url = 'https://api.worldbank.org/v2/country?format=json&per_page=500' + r = requests.get(url, timeout=30) + data = r.json() + if data[0]['pages'] != 1: + print( + 'ERROR: %d pages in data, this script only reads one page!' + % data[0]['pages'] + ) + sys.exit(1) + + iso2Codes = set() + ISO3166_1_alpha_2_codes = set() + names = dict() + regions = collections.defaultdict(set) + for country in data[1]: + iso2Code = country['iso2Code'] + iso2Codes.add(iso2Code) + if country['region']['value'] == 'Aggregates': + continue + if re.match(r'[A-Z][A-Z]', iso2Code): + ISO3166_1_alpha_2_codes.add(iso2Code) + names[iso2Code] = country['name'] + regions[country['region']['value']].add(country['name']) + for code in sorted(ISO3166_1_alpha_2_codes): + print(f" '{code}', # " + names[code]) + + +if __name__ == "__main__": + requests_cache.install_cache( + os.path.join(tempfile.gettempdir(), os.path.basename(__file__) + '.cache') + ) + main() diff --git a/tests/lint.TestCase b/tests/lint.TestCase index d69382f0..55c314b0 100755 --- a/tests/lint.TestCase +++ b/tests/lint.TestCase @@ -5,6 +5,7 @@ import logging import optparse import os +import ruamel.yaml import shutil import sys import tempfile @@ -368,6 +369,75 @@ class LintTest(unittest.TestCase): app = fdroidserver.metadata.App({'Categories': ['bar']}) self.assertEqual(0, len(list(fdroidserver.lint.check_categories(app)))) + def test_lint_config_basic_mirrors_yml(self): + os.chdir(self.testdir) + yaml = ruamel.yaml.YAML(typ='safe') + with Path('mirrors.yml').open('w') as fp: + yaml.dump([{'url': 'https://example.com/fdroid/repo'}], fp) + self.assertTrue(fdroidserver.lint.lint_config('mirrors.yml')) + + def test_lint_config_mirrors_yml_kenya_countryCode(self): + os.chdir(self.testdir) + yaml = ruamel.yaml.YAML(typ='safe') + with Path('mirrors.yml').open('w') as fp: + yaml.dump([{'url': 'https://foo.com/fdroid/repo', 'countryCode': 'KE'}], fp) + self.assertTrue(fdroidserver.lint.lint_config('mirrors.yml')) + + def test_lint_config_mirrors_yml_invalid_countryCode(self): + """WV is "indeterminately reserved" so it should never be used.""" + os.chdir(self.testdir) + yaml = ruamel.yaml.YAML(typ='safe') + with Path('mirrors.yml').open('w') as fp: + yaml.dump([{'url': 'https://foo.com/fdroid/repo', 'countryCode': 'WV'}], fp) + self.assertFalse(fdroidserver.lint.lint_config('mirrors.yml')) + + def test_lint_config_mirrors_yml_alpha3_countryCode(self): + """Only ISO 3166-1 alpha 2 are supported""" + os.chdir(self.testdir) + yaml = ruamel.yaml.YAML(typ='safe') + with Path('mirrors.yml').open('w') as fp: + yaml.dump([{'url': 'https://de.com/fdroid/repo', 'countryCode': 'DEU'}], fp) + self.assertFalse(fdroidserver.lint.lint_config('mirrors.yml')) + + def test_lint_config_mirrors_yml_one_invalid_countryCode(self): + """WV is "indeterminately reserved" so it should never be used.""" + os.chdir(self.testdir) + yaml = ruamel.yaml.YAML(typ='safe') + with Path('mirrors.yml').open('w') as fp: + yaml.dump( + [ + {'url': 'https://bar.com/fdroid/repo', 'countryCode': 'BA'}, + {'url': 'https://foo.com/fdroid/repo', 'countryCode': 'FO'}, + {'url': 'https://wv.com/fdroid/repo', 'countryCode': 'WV'}, + ], + fp, + ) + self.assertFalse(fdroidserver.lint.lint_config('mirrors.yml')) + + def test_lint_config_bad_mirrors_yml_dict(self): + os.chdir(self.testdir) + Path('mirrors.yml').write_text('baz: [foo, bar]\n') + with self.assertRaises(TypeError): + fdroidserver.lint.lint_config('mirrors.yml') + + def test_lint_config_bad_mirrors_yml_float(self): + os.chdir(self.testdir) + Path('mirrors.yml').write_text('1.0\n') + with self.assertRaises(TypeError): + fdroidserver.lint.lint_config('mirrors.yml') + + def test_lint_config_bad_mirrors_yml_int(self): + os.chdir(self.testdir) + Path('mirrors.yml').write_text('1\n') + with self.assertRaises(TypeError): + fdroidserver.lint.lint_config('mirrors.yml') + + def test_lint_config_bad_mirrors_yml_str(self): + os.chdir(self.testdir) + Path('mirrors.yml').write_text('foo\n') + with self.assertRaises(TypeError): + fdroidserver.lint.lint_config('mirrors.yml') + class LintAntiFeaturesTest(unittest.TestCase): def setUp(self): From a1d9d9d885ad88285833c8b645973b9987821996 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 7 Dec 2023 18:19:28 +0100 Subject: [PATCH 1351/2116] switch to loading mirrors.yml with ruamel to get YAML 1.2 support --- fdroidserver/index.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 509790bb..9a631eb8 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -26,10 +26,10 @@ import json import logging import os import re +import ruamel.yaml import shutil import tempfile import urllib.parse -import yaml import zipfile import calendar import qrcode @@ -1409,7 +1409,7 @@ def add_mirrors_to_repodict(repo_section, repodict): ) ) with mirrors_yml.open() as fp: - mirrors_config = yaml.safe_load(fp) + mirrors_config = ruamel.yaml.YAML(typ='safe').load(fp) if not isinstance(mirrors_config, list): msg = _('{path} is not list, but a {datatype}!') raise TypeError( From d7a673523d87fd409776cb2289ac0a234b31569e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 7 Dec 2023 21:36:44 +0100 Subject: [PATCH 1352/2116] "field will be in random order" only applies to config.py YAML only has lists, no sets or tuples, so this warning can only ever make any sense when config.py is the active config file. --- fdroidserver/common.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 49323357..e97cedf5 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -429,12 +429,12 @@ def read_config(opts=None): code = compile(fp.read(), old_config_file, 'exec') exec(code, None, config) # nosec TODO automatically migrate - for k in ('mirrors', 'install_list', 'uninstall_list', 'serverwebroot', 'servergitroot'): - if k in config: - if not type(config[k]) in (str, list, tuple): - logging.warning( - _("'{field}' will be in random order! Use () or [] brackets if order is important!") - .format(field=k)) + for k in ('mirrors', 'install_list', 'uninstall_list', 'serverwebroot', 'servergitroot'): + if k in config: + if not type(config[k]) in (str, list, tuple): + logging.warning( + _("'{field}' will be in random order! Use () or [] brackets if order is important!") + .format(field=k)) # smartcardoptions must be a list since its command line args for Popen smartcardoptions = config.get('smartcardoptions') From d3abb74c888720a1d55e084308212a43c6bc6788 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 9 Jan 2024 13:15:23 +0100 Subject: [PATCH 1353/2116] Use git rev-parse instead of describe We only want the hash. --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b867e2b7..cc32f148 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -46,7 +46,7 @@ metadata_v0: script: - git fetch https://gitlab.com/fdroid/fdroidserver.git $RELEASE_COMMIT_ID - cd tests - - export GITCOMMIT=`git describe` + - export GITCOMMIT=$(git rev-parse HEAD) - git checkout $RELEASE_COMMIT_ID - cd .. - git clone --depth 1 https://gitlab.com/fdroid/fdroiddata.git From 0849e664e7033d291be27742decb3a78355b334e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 9 Jan 2024 14:54:38 +0100 Subject: [PATCH 1354/2116] metadata_v0: use `git rev-parse` instead of `git describe` --- tests/dump_internal_metadata_format.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dump_internal_metadata_format.py b/tests/dump_internal_metadata_format.py index 5dade52b..24b7e911 100755 --- a/tests/dump_internal_metadata_format.py +++ b/tests/dump_internal_metadata_format.py @@ -65,7 +65,7 @@ if not os.path.isdir('metadata'): sys.exit(1) repo = git.Repo(localmodule) -savedir = os.path.join('metadata', 'dump_' + repo.git.describe()) +savedir = os.path.join('metadata', 'dump_' + repo.git.rev_parse('HEAD')) if not os.path.isdir(savedir): os.mkdir(savedir) From 69ccce06447916aa9245b68824953fcba0f7ee5c Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 9 Jan 2024 16:52:58 +0100 Subject: [PATCH 1355/2116] gitlab-ci: include pycountry in all master-only jobs follow up from !1418 --- .gitlab-ci.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cc32f148..17425b8a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -100,6 +100,7 @@ debian_testing: gnupg ipfs-cid python3-defusedxml + python3-pycountry python3-setuptools sdkmanager - python3 -c 'import fdroidserver' @@ -123,7 +124,7 @@ ubuntu_lts_ppa: - echo "deb http://ppa.launchpad.net/fdroid/fdroidserver/ubuntu $RELEASE main" >> /etc/apt/sources.list - apt-get update - apt-get dist-upgrade - - apt-get install --install-recommends dexdump fdroidserver git python3-setuptools sdkmanager + - apt-get install --install-recommends dexdump fdroidserver git python3-pycountry python3-setuptools sdkmanager # Test things work with a default branch other than 'master' - git config --global init.defaultBranch thisisnotmasterormain @@ -291,6 +292,7 @@ fedora_latest: python3-babel python3-matplotlib python3-pip + python3-pycountry rsync which - $pip install sdkmanager @@ -347,6 +349,9 @@ macOS: - /bin/bash --version - /bin/bash -n gradlew-fdroid tests/run-tests + # TODO remove the packages below once they are included in the Homebrew package + - $(brew --prefix fdroidserver)/libexec/bin/python3 -m pip install pycountry + # test fdroidserver from git with current package's dependencies - fdroid="$(brew --prefix fdroidserver)/libexec/bin/python3 $PWD/fdroid" ./tests/run-tests From 11d21d6b181d252a83635f7c2adfbadb9a9308a8 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 11 Jan 2024 11:32:39 +0100 Subject: [PATCH 1356/2116] gitlab-ci: bump base commit in metadata_v0 job to get rev-parse fix !1427 --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 17425b8a..188a2b90 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -42,7 +42,7 @@ metadata_v0: image: registry.gitlab.com/fdroid/fdroidserver:buildserver variables: GIT_DEPTH: 1000 - RELEASE_COMMIT_ID: a1c4f803de8d4dc92ebd6b571a493183d14a00bf # after ArchivePolicy: 0 + RELEASE_COMMIT_ID: 50aa35772b058e76b950c01e16019c072c191b73 # after switching to `git rev-parse` script: - git fetch https://gitlab.com/fdroid/fdroidserver.git $RELEASE_COMMIT_ID - cd tests From 77daf6feb686a93acaca0e6216faaa7c4cde1787 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 5 Dec 2022 14:58:08 +0100 Subject: [PATCH 1357/2116] Add Apple ipa support (Closes: #1067) --- fdroidserver/common.py | 2 ++ fdroidserver/update.py | 46 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index e97cedf5..cfe60150 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -102,6 +102,7 @@ STRICT_APPLICATION_ID_REGEX = re.compile(r'''(?:^[a-zA-Z]+(?:\d*[a-zA-Z_]*)*)(?: VALID_APPLICATION_ID_REGEX = re.compile(r'''(?:^[a-z_]+(?:\d*[a-zA-Z_]*)*)(?:\.[a-z_]+(?:\d*[a-zA-Z_]*)*)*$''', re.IGNORECASE) ANDROID_PLUGIN_REGEX = re.compile(r'''\s*(:?apply plugin:|id)\(?\s*['"](android|com\.android\.application)['"]\s*\)?''') +APPLE_BUNDLEiDENTIFIER_REGEX = re.compile(r'''^[a-zA-Z-.]*''') SETTINGS_GRADLE_REGEX = re.compile(r'settings\.gradle(?:\.kts)?') GRADLE_SUBPROJECT_REGEX = re.compile(r'''['"]:?([^'"]+)['"]''') @@ -2015,6 +2016,7 @@ def is_valid_package_name(name): """ return VALID_APPLICATION_ID_REGEX.match(name) is not None \ + or APPLE_BUNDLEiDENTIFIER_REGEX.match(name) is not None \ or FDROID_PACKAGE_NAME_REGEX.match(name) is not None diff --git a/fdroidserver/update.py b/fdroidserver/update.py index a1d4dbc4..8aad6af3 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -46,6 +46,7 @@ except ImportError: import collections from binascii import hexlify +from biplist import readPlist from . import _ from . import common @@ -524,6 +525,48 @@ def insert_obbs(repodir, apps, apks): break +def process_ipa(repodir, apks): + """Scan the .ipa files in a given repo directory + + Parameters + ---------- + repodir + repo directory to scan + apps + list of current, valid apps + apks + current information on all APKs + """ + def ipaWarnDelete(f, msg): + logging.warning(msg + ' ' + f) + if options.delete_unknown: + logging.error(_("Deleting unknown file: {path}").format(path=f)) + os.remove(f) + + for f in glob.glob(os.path.join(repodir, '*.ipa')): + ipa = {} + apks.append(ipa) + + ipa["apkName"] = os.path.basename(f) + ipa["hash"] = common.sha256sum(f) + ipa["hashType"] = "sha256" + ipa["size"] = os.path.getsize(f) + + with zipfile.ZipFile(f) as ipa_zip: + for info in ipa_zip.infolist(): + if re.match("Payload/[^/]*.app/Info.plist", info.filename): + with ipa_zip.open(info) as plist_file: + plist = readPlist(plist_file) + # https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleversion + version = plist["CFBundleVersion"].split('.') + major = int(version.pop(0)) + minor = int(version.pop(0)) if version else 0 + patch = int(version.pop(0)) if version else 0 + ipa["packageName"] = plist["CFBundleIdentifier"] + ipa["versionCode"] = major * 10**12 + minor * 10**6 + patch + ipa["versionName"] = plist["CFBundleShortVersionString"] + + def translate_per_build_anti_features(apps, apks): """Grab the anti-features list from the build metadata. @@ -1139,7 +1182,7 @@ def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False): repodir = repodir.encode() for name in os.listdir(repodir): file_extension = common.get_file_extension(name) - if file_extension in ('apk', 'obb'): + if file_extension in ('apk', 'obb', 'ipa'): continue filename = os.path.join(repodir, name) name_utf8 = name.decode() @@ -2128,6 +2171,7 @@ def prepare_apps(apps, apks, repodir): ------- the relevant subset of apps (as a deepcopy) """ + process_ipa(repodir, apks) apps_with_packages = get_apps_with_packages(apps, apks) apply_info_from_latest_apk(apps_with_packages, apks) insert_funding_yml_donation_links(apps) From a987341c377707a91e2703f1dc00399c56cd436b Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 9 Dec 2022 11:47:06 +0100 Subject: [PATCH 1358/2116] ipa: add Usage permissions --- fdroidserver/update.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 8aad6af3..d8c04619 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -565,6 +565,7 @@ def process_ipa(repodir, apks): ipa["packageName"] = plist["CFBundleIdentifier"] ipa["versionCode"] = major * 10**12 + minor * 10**6 + patch ipa["versionName"] = plist["CFBundleShortVersionString"] + ipa["usage"] = {k: v for k, v in plist.items() if 'Usage' in k} def translate_per_build_anti_features(apps, apks): From dfbb2df8397ec22f7cb5da18780a0be7a74dce72 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 9 Dec 2022 16:04:51 +0100 Subject: [PATCH 1359/2116] Use CFBundleShortVersionString for version code --- fdroidserver/update.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index d8c04619..38b11b2c 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -557,8 +557,8 @@ def process_ipa(repodir, apks): if re.match("Payload/[^/]*.app/Info.plist", info.filename): with ipa_zip.open(info) as plist_file: plist = readPlist(plist_file) - # https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleversion - version = plist["CFBundleVersion"].split('.') + # https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring + version = plist["CFBundleShortVersionString"].split('.') major = int(version.pop(0)) minor = int(version.pop(0)) if version else 0 patch = int(version.pop(0)) if version else 0 From 7d066085314bc5b37006cc44d0412bac52bd5a62 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 13 Jan 2023 16:00:19 +0100 Subject: [PATCH 1360/2116] Move version_string_to_int into separate function --- fdroidserver/update.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 38b11b2c..30f2f5ea 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -525,8 +525,20 @@ def insert_obbs(repodir, apps, apks): break +def version_string_to_int(version): + """Approximately convert a [Major].[Minor].[Patch] version string + consisting of numeric characters (0-9) and periods to a number. The + exponents are chosen such that it still fits in the 64bit index.yaml range. + """ + version = version.split('.') + major = int(version.pop(0)) if version else 0 + minor = int(version.pop(0)) if version else 0 + patch = int(version.pop(0)) if version else 0 + return major * 10**12 + minor * 10**6 + patch + + def process_ipa(repodir, apks): - """Scan the .ipa files in a given repo directory + """Scan the .ipa files in a given repo directory. Parameters ---------- @@ -557,13 +569,9 @@ def process_ipa(repodir, apks): if re.match("Payload/[^/]*.app/Info.plist", info.filename): with ipa_zip.open(info) as plist_file: plist = readPlist(plist_file) - # https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring - version = plist["CFBundleShortVersionString"].split('.') - major = int(version.pop(0)) - minor = int(version.pop(0)) if version else 0 - patch = int(version.pop(0)) if version else 0 ipa["packageName"] = plist["CFBundleIdentifier"] - ipa["versionCode"] = major * 10**12 + minor * 10**6 + patch + # https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring + ipa["versionCode"] = version_string_to_int(plist["CFBundleShortVersionString"]) ipa["versionName"] = plist["CFBundleShortVersionString"] ipa["usage"] = {k: v for k, v in plist.items() if 'Usage' in k} From e3d319f30b8f53549c1d1449572d7f44e8bb216b Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 13 Jan 2023 18:00:29 +0100 Subject: [PATCH 1361/2116] Update with suggestions --- fdroidserver/common.py | 4 ++-- fdroidserver/update.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index cfe60150..d52e61fd 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -102,7 +102,7 @@ STRICT_APPLICATION_ID_REGEX = re.compile(r'''(?:^[a-zA-Z]+(?:\d*[a-zA-Z_]*)*)(?: VALID_APPLICATION_ID_REGEX = re.compile(r'''(?:^[a-z_]+(?:\d*[a-zA-Z_]*)*)(?:\.[a-z_]+(?:\d*[a-zA-Z_]*)*)*$''', re.IGNORECASE) ANDROID_PLUGIN_REGEX = re.compile(r'''\s*(:?apply plugin:|id)\(?\s*['"](android|com\.android\.application)['"]\s*\)?''') -APPLE_BUNDLEiDENTIFIER_REGEX = re.compile(r'''^[a-zA-Z-.]*''') +APPLE_BUNDLEIDENTIFIER_REGEX = re.compile(r'''^[a-zA-Z-.]*''') SETTINGS_GRADLE_REGEX = re.compile(r'settings\.gradle(?:\.kts)?') GRADLE_SUBPROJECT_REGEX = re.compile(r'''['"]:?([^'"]+)['"]''') @@ -2016,7 +2016,7 @@ def is_valid_package_name(name): """ return VALID_APPLICATION_ID_REGEX.match(name) is not None \ - or APPLE_BUNDLEiDENTIFIER_REGEX.match(name) is not None \ + or APPLE_BUNDLEIDENTIFIER_REGEX.match(name) is not None \ or FDROID_PACKAGE_NAME_REGEX.match(name) is not None diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 30f2f5ea..307fd5ec 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -528,7 +528,7 @@ def insert_obbs(repodir, apps, apks): def version_string_to_int(version): """Approximately convert a [Major].[Minor].[Patch] version string consisting of numeric characters (0-9) and periods to a number. The - exponents are chosen such that it still fits in the 64bit index.yaml range. + exponents are chosen such that it still fits in the 64bit JSON/Android range. """ version = version.split('.') major = int(version.pop(0)) if version else 0 From 60371093e243c0d6a6606e5a5d6168d95ee5b1d1 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Fri, 13 Jan 2023 18:11:34 +0100 Subject: [PATCH 1362/2116] Make python3-biplist optional --- fdroidserver/update.py | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 307fd5ec..9dadfd2a 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -46,7 +46,6 @@ except ImportError: import collections from binascii import hexlify -from biplist import readPlist from . import _ from . import common @@ -555,25 +554,28 @@ def process_ipa(repodir, apks): logging.error(_("Deleting unknown file: {path}").format(path=f)) os.remove(f) - for f in glob.glob(os.path.join(repodir, '*.ipa')): - ipa = {} - apks.append(ipa) + ipas = glob.glob(os.path.join(repodir, '*.ipa')) + if ipas: + from biplist import readPlist + for f in ipas: + ipa = {} + apks.append(ipa) - ipa["apkName"] = os.path.basename(f) - ipa["hash"] = common.sha256sum(f) - ipa["hashType"] = "sha256" - ipa["size"] = os.path.getsize(f) + ipa["apkName"] = os.path.basename(f) + ipa["hash"] = common.sha256sum(f) + ipa["hashType"] = "sha256" + ipa["size"] = os.path.getsize(f) - with zipfile.ZipFile(f) as ipa_zip: - for info in ipa_zip.infolist(): - if re.match("Payload/[^/]*.app/Info.plist", info.filename): - with ipa_zip.open(info) as plist_file: - plist = readPlist(plist_file) - ipa["packageName"] = plist["CFBundleIdentifier"] - # https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring - ipa["versionCode"] = version_string_to_int(plist["CFBundleShortVersionString"]) - ipa["versionName"] = plist["CFBundleShortVersionString"] - ipa["usage"] = {k: v for k, v in plist.items() if 'Usage' in k} + with zipfile.ZipFile(f) as ipa_zip: + for info in ipa_zip.infolist(): + if re.match("Payload/[^/]*.app/Info.plist", info.filename): + with ipa_zip.open(info) as plist_file: + plist = readPlist(plist_file) + ipa["packageName"] = plist["CFBundleIdentifier"] + # https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring + ipa["versionCode"] = version_string_to_int(plist["CFBundleShortVersionString"]) + ipa["versionName"] = plist["CFBundleShortVersionString"] + ipa["usage"] = {k: v for k, v in plist.items() if 'Usage' in k} def translate_per_build_anti_features(apps, apks): From ea9374ecf633cebbe7faf6694b9d33050111ce85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 30 Nov 2023 16:27:09 +0100 Subject: [PATCH 1363/2116] =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8F=20=20update.py:?= =?UTF-8?q?=20finish=20minimal=20IPA=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This add a few missing pieces to get IPA support working. (added and lastUpdated dates + caching for ipa files) --- fdroidserver/update.py | 113 ++++++++++++++++++++++++++++------------- 1 file changed, 79 insertions(+), 34 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 9dadfd2a..0304507c 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -525,7 +525,10 @@ def insert_obbs(repodir, apps, apks): def version_string_to_int(version): - """Approximately convert a [Major].[Minor].[Patch] version string + """ + Convert sermver version designation to version code. + + Approximately convert a [Major].[Minor].[Patch] version string consisting of numeric characters (0-9) and periods to a number. The exponents are chosen such that it still fits in the 64bit JSON/Android range. """ @@ -536,46 +539,73 @@ def version_string_to_int(version): return major * 10**12 + minor * 10**6 + patch -def process_ipa(repodir, apks): - """Scan the .ipa files in a given repo directory. +def parse_ipa(ipa_path, file_size, sha256): + from biplist import readPlist + + ipa = { + "apkName": os.path.basename(ipa_path), + "hash": sha256, + "hashType": "sha256", + "size": file_size, + } + + with zipfile.ZipFile(ipa_path) as ipa_zip: + for info in ipa_zip.infolist(): + if re.match("Payload/[^/]*.app/Info.plist", info.filename): + with ipa_zip.open(info) as plist_file: + plist = readPlist(plist_file) + ipa["packageName"] = plist["CFBundleIdentifier"] + # https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring + ipa["versionCode"] = version_string_to_int(plist["CFBundleShortVersionString"]) + ipa["versionName"] = plist["CFBundleShortVersionString"] + ipa["usage"] = {k: v for k, v in plist.items() if 'Usage' in k} + return ipa + + +def scan_repo_for_ipas(apkcache, repodir, knownapks): + """Scan for IPA files in a given repo directory. Parameters ---------- + apkcache + cache dictionary containting cached file infos from previous runs repodir repo directory to scan - apps - list of current, valid apps - apks - current information on all APKs + knownapks + list of all known files, as per metadata.read_metadata + + Returns + ------- + ipas + list of file infos for ipa files in ./repo folder + cachechanged + ture if new ipa files were found and added to `apkcache` """ - def ipaWarnDelete(f, msg): - logging.warning(msg + ' ' + f) - if options.delete_unknown: - logging.error(_("Deleting unknown file: {path}").format(path=f)) - os.remove(f) + cachechanged = False + ipas = [] + for ipa_path in glob.glob(os.path.join(repodir, '*.ipa')): + ipa_name = os.path.basename(ipa_path) - ipas = glob.glob(os.path.join(repodir, '*.ipa')) - if ipas: - from biplist import readPlist - for f in ipas: - ipa = {} - apks.append(ipa) + file_size = os.stat(ipa_path).st_size + if file_size == 0: + raise FDroidException(_('{path} is zero size!') + .format(path=ipa_path)) - ipa["apkName"] = os.path.basename(f) - ipa["hash"] = common.sha256sum(f) - ipa["hashType"] = "sha256" - ipa["size"] = os.path.getsize(f) + sha256 = common.sha256sum(ipa_path) + ipa = apkcache.get(ipa_name, {}) - with zipfile.ZipFile(f) as ipa_zip: - for info in ipa_zip.infolist(): - if re.match("Payload/[^/]*.app/Info.plist", info.filename): - with ipa_zip.open(info) as plist_file: - plist = readPlist(plist_file) - ipa["packageName"] = plist["CFBundleIdentifier"] - # https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring - ipa["versionCode"] = version_string_to_int(plist["CFBundleShortVersionString"]) - ipa["versionName"] = plist["CFBundleShortVersionString"] - ipa["usage"] = {k: v for k, v in plist.items() if 'Usage' in k} + if ipa.get('hash') != sha256: + ipa = parse_ipa(ipa_path, file_size, sha256) + apkcache[ipa_name] = ipa + cachechanged = True + + added = knownapks.recordapk(ipa_name, ipa['packageName']) + if added: + ipa['added'] = added + + ipas.append(ipa) + + return ipas, cachechanged def translate_per_build_anti_features(apps, apks): @@ -1175,7 +1205,10 @@ def insert_localized_app_metadata(apps): def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False): - """Scan a repo for all files with an extension except APK/OBB. + """Scan a repo for all files with an extension except APK/OBB/IPA. + + This allows putting all kinds of files into repostories. E.g. Media Files, + Zip archives, ... Parameters ---------- @@ -1192,22 +1225,29 @@ def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False): repo_files = [] repodir = repodir.encode() for name in os.listdir(repodir): + # skip files based on file extensions, that are handled elsewhere file_extension = common.get_file_extension(name) if file_extension in ('apk', 'obb', 'ipa'): continue + + # skip source tarballs generated by fdroidserver filename = os.path.join(repodir, name) name_utf8 = name.decode() if filename.endswith(b'_src.tar.gz'): logging.debug(_('skipping source tarball: {path}') .format(path=filename.decode())) continue + + # skip all other files generated by fdroidserver if not common.is_repo_file(filename): continue + stat = os.stat(filename) if stat.st_size == 0: raise FDroidException(_('{path} is zero size!') .format(path=filename)) + # load file infos from cache if not stale shasum = common.sha256sum(filename) usecache = False if name_utf8 in apkcache: @@ -1220,6 +1260,7 @@ def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False): logging.debug(_("Ignoring stale cache data for {apkfilename}") .format(apkfilename=name_utf8)) + # scan file if info wasn't in cache if not usecache: logging.debug(_("Processing {apkfilename}").format(apkfilename=name_utf8)) repo_file = collections.OrderedDict() @@ -2182,7 +2223,6 @@ def prepare_apps(apps, apks, repodir): ------- the relevant subset of apps (as a deepcopy) """ - process_ipa(repodir, apks) apps_with_packages = get_apps_with_packages(apps, apks) apply_info_from_latest_apk(apps_with_packages, apks) insert_funding_yml_donation_links(apps) @@ -2309,6 +2349,11 @@ def main(): options.use_date_from_apk) cachechanged = cachechanged or fcachechanged apks += files + + ipas, icachechanged = scan_repo_for_ipas(apkcache, repodirs[0], knownapks) + cachechanged = cachechanged or icachechanged + apks += ipas + appid_has_apks = set() appid_has_repo_files = set() remove_apks = [] From 3ee91d17775a70eae68db0bfeff53fea03a7d28c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 30 Nov 2023 17:28:22 +0100 Subject: [PATCH 1364/2116] =?UTF-8?q?=F0=9F=A7=B4=20force=20android=20pack?= =?UTF-8?q?age=20names=20for=20IPAs=20for=20now?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fdroidserver/common.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index d52e61fd..e97cedf5 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -102,7 +102,6 @@ STRICT_APPLICATION_ID_REGEX = re.compile(r'''(?:^[a-zA-Z]+(?:\d*[a-zA-Z_]*)*)(?: VALID_APPLICATION_ID_REGEX = re.compile(r'''(?:^[a-z_]+(?:\d*[a-zA-Z_]*)*)(?:\.[a-z_]+(?:\d*[a-zA-Z_]*)*)*$''', re.IGNORECASE) ANDROID_PLUGIN_REGEX = re.compile(r'''\s*(:?apply plugin:|id)\(?\s*['"](android|com\.android\.application)['"]\s*\)?''') -APPLE_BUNDLEIDENTIFIER_REGEX = re.compile(r'''^[a-zA-Z-.]*''') SETTINGS_GRADLE_REGEX = re.compile(r'settings\.gradle(?:\.kts)?') GRADLE_SUBPROJECT_REGEX = re.compile(r'''['"]:?([^'"]+)['"]''') @@ -2016,7 +2015,6 @@ def is_valid_package_name(name): """ return VALID_APPLICATION_ID_REGEX.match(name) is not None \ - or APPLE_BUNDLEIDENTIFIER_REGEX.match(name) is not None \ or FDROID_PACKAGE_NAME_REGEX.match(name) is not None From c288317530971f036c7170941f359040579441a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Mon, 18 Dec 2023 12:58:37 +0100 Subject: [PATCH 1365/2116] =?UTF-8?q?=F0=9F=AA=A8=20version=20string=20con?= =?UTF-8?q?version:=20error=20handling+tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fdroidserver/update.py | 13 +++++++++---- tests/update.TestCase | 23 +++++++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 0304507c..7934ffa8 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -524,6 +524,9 @@ def insert_obbs(repodir, apps, apks): break +VERSION_STRING_RE = re.compile(r'^([0-9]+)\.([0-9]+)\.([0-9]+)$') + + def version_string_to_int(version): """ Convert sermver version designation to version code. @@ -532,10 +535,12 @@ def version_string_to_int(version): consisting of numeric characters (0-9) and periods to a number. The exponents are chosen such that it still fits in the 64bit JSON/Android range. """ - version = version.split('.') - major = int(version.pop(0)) if version else 0 - minor = int(version.pop(0)) if version else 0 - patch = int(version.pop(0)) if version else 0 + m = VERSION_STRING_RE.match(version) + if not m: + raise ValueError(f"invalid version string '{version}'") + major = int(m.group(1)) + minor = int(m.group(2)) + patch = int(m.group(3)) return major * 10**12 + minor * 10**6 + patch diff --git a/tests/update.TestCase b/tests/update.TestCase index abce3a30..0bc78462 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1923,6 +1923,28 @@ class UpdateTest(unittest.TestCase): ) +class TestUpdateVersionStringToInt(unittest.TestCase): + + def test_version_string_to_int(self): + self.assertEqual(fdroidserver.update.version_string_to_int("1.2.3"), 1000002000003) + self.assertEqual(fdroidserver.update.version_string_to_int("0.0.0003"), 3) + self.assertEqual(fdroidserver.update.version_string_to_int("0.0.0"), 0) + self.assertEqual(fdroidserver.update.version_string_to_int("4321.321.21"), 4321000321000021) + self.assertEqual(fdroidserver.update.version_string_to_int("18446744.073709.551615"), 18446744073709551615) + + def test_version_string_to_int_value_errors(self): + with self.assertRaises(ValueError): + fdroidserver.update.version_string_to_int("1.2.3a") + with self.assertRaises(ValueError): + fdroidserver.update.version_string_to_int("asdfasdf") + with self.assertRaises(ValueError): + fdroidserver.update.version_string_to_int("1.2.-3") + with self.assertRaises(ValueError): + fdroidserver.update.version_string_to_int("-1.2.-3") + with self.assertRaises(ValueError): + fdroidserver.update.version_string_to_int("0.0.0x3") + + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) @@ -1938,4 +1960,5 @@ if __name__ == "__main__": newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(UpdateTest)) + newSuite.addTest(unittest.makeSuite(TestUpdateVersionStringToInt)) unittest.main(failfast=False) From 995118bcd20a55fda6545fb087a181b48a3d98ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Mon, 18 Dec 2023 13:35:06 +0100 Subject: [PATCH 1366/2116] =?UTF-8?q?=F0=9F=A5=94=20add=20strapped=20IPA?= =?UTF-8?q?=20file=20and=20test=20for=20parse=5Fipa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fdroidserver/update.py | 1 - tests/com.fake.IpaApp_1000000000001.ipa | Bin 0 -> 1722 bytes tests/update.TestCase | 13 +++++++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 tests/com.fake.IpaApp_1000000000001.ipa diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 7934ffa8..b5b956a2 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -563,7 +563,6 @@ def parse_ipa(ipa_path, file_size, sha256): # https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring ipa["versionCode"] = version_string_to_int(plist["CFBundleShortVersionString"]) ipa["versionName"] = plist["CFBundleShortVersionString"] - ipa["usage"] = {k: v for k, v in plist.items() if 'Usage' in k} return ipa diff --git a/tests/com.fake.IpaApp_1000000000001.ipa b/tests/com.fake.IpaApp_1000000000001.ipa new file mode 100644 index 0000000000000000000000000000000000000000..d392cb940a8585307deb50d6f791ebc18fbd7a37 GIT binary patch literal 1722 zcma)+c{J2(9L9fRY{wq5gvl}ySuVO)lCjJ%7ulN8SQ29i2{X2i%C#gSVT|QoGKiUs zFry@K#buCPOlWLlzho&YijJF3sy}qjec$uG@Av(l_j#W8uaBJ-n3E6K9lVL@XTKC* zH(o#lu){`N3c`A6IXDUcZVzByyXzfD9I*SW5(n?668qfTQ(54!CODiX7KhW?6YzeC zLFZBDmpB0c&IB@58B};Ov)7%$t%tY z*yzN7dp0iFzNeFUrtNp4{imKYa#iXV+h?a*e3`eDb7~kRl6f()H5Q^IC zVH!&xs7#c1t-QHsy6h_P-x1nQbjg(rP;?4QvU3Tb&8rJ5AD454hlCDQfk1&U5}0WHjF!=0b;9^^<2rg=&b|cbDNFAPguv> z{13u>;}iZ?#5>B3yjvG4ZiAC7RTAtqaYv*}+tY^C+{M%Q;F4ELz2zz$d_ngLDc#Ij zC+>pq@IsOUYG|$pHLr`3V&(T`NeT1Odq1wN0?qGmg0s);xi5C)!}%Mj5h67u(TnPn z%pF7~zGwl{?-Vvk3J@}255&EHl#4v|G)PUxN`eDo$g0qCge#>Neu`8fH%%3m@V=U7QrTUBbAo7|e-Nr4f~TRcRT&O`95<{Oob}%N z6TPjKdos&UT%?HSTc?1Ha0Kk#GB^>+`1o-&hE!AdyJHLnQ$Md}q`RL*p bpZ!C=)BXR&adGed3H*6VfB+zcYxnjahOgOe literal 0 HcmV?d00001 diff --git a/tests/update.TestCase b/tests/update.TestCase index 0bc78462..9d1dea23 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1922,6 +1922,19 @@ class UpdateTest(unittest.TestCase): index['repo'][CATEGORIES_CONFIG_NAME], ) + def test_parse_ipa(self): + result = fdroidserver.update.parse_ipa('./com.fake.IpaApp_1000000000001.ipa', 'fake_size', 'fake_sha') + self.maxDiff = None + self.assertDictEqual(result, { + 'apkName': 'com.fake.IpaApp_1000000000001.ipa', + 'hash': 'fake_sha', + 'hashType': 'sha256', + 'packageName': 'org.onionshare.OnionShare', + 'size': 'fake_size', + 'versionCode': 1000000000001, + 'versionName': '1.0.1', + }) + class TestUpdateVersionStringToInt(unittest.TestCase): From 7211e9f9b43433154231ce25ef7f724ed9933fc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Wed, 20 Dec 2023 04:11:05 +0100 Subject: [PATCH 1367/2116] =?UTF-8?q?=F0=9F=8D=B2=20add=20unit=20test=20fo?= =?UTF-8?q?r=20update.scan=5Frepo=5Ffor=5Fipas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fdroidserver/update.py | 10 ++++----- tests/update.TestCase | 49 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index b5b956a2..26e248d5 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -49,10 +49,10 @@ from binascii import hexlify from . import _ from . import common -from . import index from . import metadata from .common import DEFAULT_LOCALE from .exception import BuildException, FDroidException, VerificationException +import fdroidserver.index from PIL import Image, PngImagePlugin @@ -599,7 +599,7 @@ def scan_repo_for_ipas(apkcache, repodir, knownapks): ipa = apkcache.get(ipa_name, {}) if ipa.get('hash') != sha256: - ipa = parse_ipa(ipa_path, file_size, sha256) + ipa = fdroidserver.update.parse_ipa(ipa_path, file_size, sha256) apkcache[ipa_name] = ipa cachechanged = True @@ -2433,7 +2433,7 @@ def main(): if len(repodirs) > 1: archive_old_apks(apps, apks, archapks, repodirs[0], repodirs[1], config['archive_older']) archived_apps = prepare_apps(apps, archapks, repodirs[1]) - index.make(archived_apps, archapks, repodirs[1], True) + fdroidserver.index.make(archived_apps, archapks, repodirs[1], True) repoapps = prepare_apps(apps, apks, repodirs[0]) @@ -2446,13 +2446,13 @@ def main(): app_dict = dict() app_dict[appid] = app if os.path.isdir(repodir): - index.make(app_dict, apks, repodir, False) + fdroidserver.index.make(app_dict, apks, repodir, False) else: logging.info(_('Skipping index generation for {appid}').format(appid=appid)) return # Make the index for the main repo... - index.make(repoapps, apks, repodirs[0], False) + fdroidserver.index.make(repoapps, apks, repodirs[0], False) git_remote = config.get('binary_transparency_remote') if git_remote or os.path.isdir(os.path.join('binary_transparency', '.git')): diff --git a/tests/update.TestCase b/tests/update.TestCase index 9d1dea23..d8f278b6 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1958,6 +1958,54 @@ class TestUpdateVersionStringToInt(unittest.TestCase): fdroidserver.update.version_string_to_int("0.0.0x3") +class TestScanRepoForIpas(unittest.TestCase): + + def setUp(self): + self.maxDiff = None + + def test_scan_repo_for_ipas_no_cache(self): + self.maxDiff = None + with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): + os.mkdir("repo") + with open('repo/abc.Def_123.ipa', 'w') as f: + f.write('abc') + with open('repo/xyz.XXX_123.ipa', 'w') as f: + f.write('xyz') + + apkcache = mock.MagicMock() + # apkcache['a'] = 1 + repodir = "repo" + knownapks = mock.MagicMock() + + def mocked_parse(p, s, c): + return { + 'packageName': 'abc' if 'abc' in p else 'xyz' + } + + with mock.patch('fdroidserver.update.parse_ipa', mocked_parse): + ipas, checkchanged = fdroidserver.update.scan_repo_for_ipas(apkcache, repodir, knownapks) + + self.assertEqual(checkchanged, True) + self.assertEqual(len(ipas), 2) + self.assertEqual(ipas[0]['packageName'], 'xyz') + self.assertEqual(ipas[1]['packageName'], 'abc') + + self.assertEqual(apkcache.__setitem__.mock_calls[0].args[1]['packageName'], 'xyz') + self.assertEqual(apkcache.__setitem__.mock_calls[1].args[1]['packageName'], 'abc') + self.assertEqual(apkcache.__setitem__.call_count, 2) + + knownapks.recordapk.call_count = 2 + self.assertEqual( + knownapks.recordapk.mock_calls[0], + unittest.mock.call('xyz.XXX_123.ipa', 'xyz'), + ) + # skipping one call here, because accessing `if added:` shows up in mock_calls + self.assertEqual( + knownapks.recordapk.mock_calls[2], + unittest.mock.call('abc.Def_123.ipa', 'abc'), + ) + + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) @@ -1974,4 +2022,5 @@ if __name__ == "__main__": newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(UpdateTest)) newSuite.addTest(unittest.makeSuite(TestUpdateVersionStringToInt)) + newSuite.addTest(unittest.makeSuite(TestScanRepoForIpas)) unittest.main(failfast=False) From 881943a0db430db07c4ad33f8bad73b00f5ab121 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Sat, 30 Dec 2023 00:06:16 +0100 Subject: [PATCH 1368/2116] =?UTF-8?q?=F0=9F=A5=94=20install=20biplist=20fo?= =?UTF-8?q?r=20ci=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit biplist is an optional python dependency required for processing iOS apps. (.ipa files) --- .gitlab-ci.yml | 6 +++--- setup.py | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 188a2b90..00fd097c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -20,7 +20,7 @@ buildserver run-tests: image: registry.gitlab.com/fdroid/fdroidserver:buildserver script: - apt-get update - - apt-get install gnupg-agent python3-babel python3-clint python3-pycountry + - apt-get install gnupg-agent python3-babel python3-biplist python3-clint python3-pycountry - ./tests/run-tests # make sure that translations do not cause stacktraces - cd $CI_PROJECT_DIR/locale @@ -154,8 +154,8 @@ ubuntu_jammy_pip: - $pip install sdkmanager - sdkmanager 'build-tools;33.0.0' - # pycountry is only for linting config/mirrors.yml, so its not in setup.py - - $pip install pycountry + # Install extras_require.optional from setup.py + - $pip install biplist pycountry - $pip install dist/fdroidserver-*.tar.gz - tar xzf dist/fdroidserver-*.tar.gz diff --git a/setup.py b/setup.py index 522c3377..afff96b4 100755 --- a/setup.py +++ b/setup.py @@ -108,7 +108,11 @@ setup( 'sdkmanager >= 0.6.4', 'yamllint', ], + # Some requires are only needed for very limited cases: + # * biplist is only used for parsing Apple .ipa files + # * pycountry is only for linting config/mirrors.yml extras_require={ + 'optional': ['biplist', 'pycountry'], 'test': ['pyjks', 'html5print'], 'docs': [ 'sphinx', From 8b5a61bb257fefeeadcc4d30141881294e656f6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Sat, 30 Dec 2023 13:51:37 +0100 Subject: [PATCH 1369/2116] =?UTF-8?q?=E2=9B=B0=EF=B8=8F=20=20make=20ipa=20?= =?UTF-8?q?related=20test=20cases=20more=20robust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MANIFEST.in | 1 + tests/update.TestCase | 25 +++++++++++-------------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index 1aed9975..05a022b2 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -543,6 +543,7 @@ include tests/build-tools/28.0.3/aapt-output-souch.smsbypass_9.txt include tests/build-tools/generate.sh include tests/check-fdroid-apk include tests/checkupdates.TestCase +include tests/com.fake.IpaApp_1000000000001.ipa include tests/common.TestCase include tests/config.py include tests/config/antiFeatures.yml diff --git a/tests/update.TestCase b/tests/update.TestCase index d8f278b6..f1c07fd9 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1923,7 +1923,8 @@ class UpdateTest(unittest.TestCase): ) def test_parse_ipa(self): - result = fdroidserver.update.parse_ipa('./com.fake.IpaApp_1000000000001.ipa', 'fake_size', 'fake_sha') + ipa_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'com.fake.IpaApp_1000000000001.ipa') + result = fdroidserver.update.parse_ipa(ipa_path, 'fake_size', 'fake_sha') self.maxDiff = None self.assertDictEqual(result, { 'apkName': 'com.fake.IpaApp_1000000000001.ipa', @@ -1978,6 +1979,7 @@ class TestScanRepoForIpas(unittest.TestCase): knownapks = mock.MagicMock() def mocked_parse(p, s, c): + # pylint: disable=unused-argument return { 'packageName': 'abc' if 'abc' in p else 'xyz' } @@ -1987,23 +1989,18 @@ class TestScanRepoForIpas(unittest.TestCase): self.assertEqual(checkchanged, True) self.assertEqual(len(ipas), 2) - self.assertEqual(ipas[0]['packageName'], 'xyz') - self.assertEqual(ipas[1]['packageName'], 'abc') + package_names_in_ipas = [x['packageName'] for x in ipas] + self.assertTrue('abc' in package_names_in_ipas) + self.assertTrue('xyz' in package_names_in_ipas) - self.assertEqual(apkcache.__setitem__.mock_calls[0].args[1]['packageName'], 'xyz') - self.assertEqual(apkcache.__setitem__.mock_calls[1].args[1]['packageName'], 'abc') + apkcache_setter_package_name = [x.args[1]['packageName'] for x in apkcache.__setitem__.mock_calls] + self.assertTrue('abc' in apkcache_setter_package_name) + self.assertTrue('xyz' in apkcache_setter_package_name) self.assertEqual(apkcache.__setitem__.call_count, 2) knownapks.recordapk.call_count = 2 - self.assertEqual( - knownapks.recordapk.mock_calls[0], - unittest.mock.call('xyz.XXX_123.ipa', 'xyz'), - ) - # skipping one call here, because accessing `if added:` shows up in mock_calls - self.assertEqual( - knownapks.recordapk.mock_calls[2], - unittest.mock.call('abc.Def_123.ipa', 'abc'), - ) + self.assertTrue(unittest.mock.call('abc.Def_123.ipa', 'abc') in knownapks.recordapk.mock_calls) + self.assertTrue(unittest.mock.call('xyz.XXX_123.ipa', 'xyz') in knownapks.recordapk.mock_calls) if __name__ == "__main__": From 6eee83db478b99892c13535054b7971dcf7b55cc Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 11 Jan 2024 15:45:54 +0100 Subject: [PATCH 1370/2116] run black on new .ipa test cases --- tests/update.TestCase | 89 +++++++++++++++++++++++++++++-------------- 1 file changed, 60 insertions(+), 29 deletions(-) diff --git a/tests/update.TestCase b/tests/update.TestCase index f1c07fd9..cf8a222a 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -167,12 +167,21 @@ class UpdateTest(unittest.TestCase): fdroidserver.update.insert_localized_app_metadata(apps) appdir = os.path.join('repo', 'info.guardianproject.urzip', 'en-US') - self.assertTrue(os.path.isfile(os.path.join( - appdir, - 'icon_NJXNzMcyf-v9i5a1ElJi0j9X1LvllibCa48xXYPlOqQ=.png'))) - self.assertTrue(os.path.isfile(os.path.join( - appdir, - 'featureGraphic_GFRT5BovZsENGpJq1HqPODGWBRPWQsx25B95Ol5w_wU=.png'))) + self.assertTrue( + os.path.isfile( + os.path.join( + appdir, 'icon_NJXNzMcyf-v9i5a1ElJi0j9X1LvllibCa48xXYPlOqQ=.png' + ) + ) + ) + self.assertTrue( + os.path.isfile( + os.path.join( + appdir, + 'featureGraphic_GFRT5BovZsENGpJq1HqPODGWBRPWQsx25B95Ol5w_wU=.png', + ) + ) + ) self.assertEqual(6, len(apps)) for packageName, app in apps.items(): @@ -1894,7 +1903,10 @@ class UpdateTest(unittest.TestCase): with open('repo/index-v2.json') as fp: index = json.load(fp) self.assertEqual( - {'System': {'name': {'en-US': 'System Apps'}}, 'Time': {'name': {'en-US': 'Time'}}}, + { + 'System': {'name': {'en-US': 'System Apps'}}, + 'Time': {'name': {'en-US': 'Time'}}, + }, index['repo'][CATEGORIES_CONFIG_NAME], ) @@ -1923,28 +1935,40 @@ class UpdateTest(unittest.TestCase): ) def test_parse_ipa(self): - ipa_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'com.fake.IpaApp_1000000000001.ipa') + ipa_path = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + 'com.fake.IpaApp_1000000000001.ipa', + ) result = fdroidserver.update.parse_ipa(ipa_path, 'fake_size', 'fake_sha') self.maxDiff = None - self.assertDictEqual(result, { - 'apkName': 'com.fake.IpaApp_1000000000001.ipa', - 'hash': 'fake_sha', - 'hashType': 'sha256', - 'packageName': 'org.onionshare.OnionShare', - 'size': 'fake_size', - 'versionCode': 1000000000001, - 'versionName': '1.0.1', - }) + self.assertDictEqual( + result, + { + 'apkName': 'com.fake.IpaApp_1000000000001.ipa', + 'hash': 'fake_sha', + 'hashType': 'sha256', + 'packageName': 'org.onionshare.OnionShare', + 'size': 'fake_size', + 'versionCode': 1000000000001, + 'versionName': '1.0.1', + }, + ) class TestUpdateVersionStringToInt(unittest.TestCase): - def test_version_string_to_int(self): - self.assertEqual(fdroidserver.update.version_string_to_int("1.2.3"), 1000002000003) + self.assertEqual( + fdroidserver.update.version_string_to_int("1.2.3"), 1000002000003 + ) self.assertEqual(fdroidserver.update.version_string_to_int("0.0.0003"), 3) self.assertEqual(fdroidserver.update.version_string_to_int("0.0.0"), 0) - self.assertEqual(fdroidserver.update.version_string_to_int("4321.321.21"), 4321000321000021) - self.assertEqual(fdroidserver.update.version_string_to_int("18446744.073709.551615"), 18446744073709551615) + self.assertEqual( + fdroidserver.update.version_string_to_int("4321.321.21"), 4321000321000021 + ) + self.assertEqual( + fdroidserver.update.version_string_to_int("18446744.073709.551615"), + 18446744073709551615, + ) def test_version_string_to_int_value_errors(self): with self.assertRaises(ValueError): @@ -1960,7 +1984,6 @@ class TestUpdateVersionStringToInt(unittest.TestCase): class TestScanRepoForIpas(unittest.TestCase): - def setUp(self): self.maxDiff = None @@ -1980,12 +2003,12 @@ class TestScanRepoForIpas(unittest.TestCase): def mocked_parse(p, s, c): # pylint: disable=unused-argument - return { - 'packageName': 'abc' if 'abc' in p else 'xyz' - } + return {'packageName': 'abc' if 'abc' in p else 'xyz'} with mock.patch('fdroidserver.update.parse_ipa', mocked_parse): - ipas, checkchanged = fdroidserver.update.scan_repo_for_ipas(apkcache, repodir, knownapks) + ipas, checkchanged = fdroidserver.update.scan_repo_for_ipas( + apkcache, repodir, knownapks + ) self.assertEqual(checkchanged, True) self.assertEqual(len(ipas), 2) @@ -1993,14 +2016,22 @@ class TestScanRepoForIpas(unittest.TestCase): self.assertTrue('abc' in package_names_in_ipas) self.assertTrue('xyz' in package_names_in_ipas) - apkcache_setter_package_name = [x.args[1]['packageName'] for x in apkcache.__setitem__.mock_calls] + apkcache_setter_package_name = [ + x.args[1]['packageName'] for x in apkcache.__setitem__.mock_calls + ] self.assertTrue('abc' in apkcache_setter_package_name) self.assertTrue('xyz' in apkcache_setter_package_name) self.assertEqual(apkcache.__setitem__.call_count, 2) knownapks.recordapk.call_count = 2 - self.assertTrue(unittest.mock.call('abc.Def_123.ipa', 'abc') in knownapks.recordapk.mock_calls) - self.assertTrue(unittest.mock.call('xyz.XXX_123.ipa', 'xyz') in knownapks.recordapk.mock_calls) + self.assertTrue( + unittest.mock.call('abc.Def_123.ipa', 'abc') + in knownapks.recordapk.mock_calls + ) + self.assertTrue( + unittest.mock.call('xyz.XXX_123.ipa', 'xyz') + in knownapks.recordapk.mock_calls + ) if __name__ == "__main__": From dc7170e709b5ed1cfbb7051864ff8719e4f02afb Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 11 Jan 2024 15:56:42 +0100 Subject: [PATCH 1371/2116] gitlab-ci: install biplist if available, otherwise skip test_parse_ipa Fedora does not have a biplist package. --- .gitlab-ci.yml | 12 ++++++++++-- tests/update.TestCase | 6 ++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 00fd097c..866a2ec8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -99,6 +99,7 @@ debian_testing: git gnupg ipfs-cid + python3-biplist python3-defusedxml python3-pycountry python3-setuptools @@ -124,7 +125,14 @@ ubuntu_lts_ppa: - echo "deb http://ppa.launchpad.net/fdroid/fdroidserver/ubuntu $RELEASE main" >> /etc/apt/sources.list - apt-get update - apt-get dist-upgrade - - apt-get install --install-recommends dexdump fdroidserver git python3-pycountry python3-setuptools sdkmanager + - apt-get install --install-recommends + dexdump + fdroidserver + git + python3-biplist + python3-pycountry + python3-setuptools + sdkmanager # Test things work with a default branch other than 'master' - git config --global init.defaultBranch thisisnotmasterormain @@ -350,7 +358,7 @@ macOS: - /bin/bash -n gradlew-fdroid tests/run-tests # TODO remove the packages below once they are included in the Homebrew package - - $(brew --prefix fdroidserver)/libexec/bin/python3 -m pip install pycountry + - $(brew --prefix fdroidserver)/libexec/bin/python3 -m pip install biplist pycountry # test fdroidserver from git with current package's dependencies - fdroid="$(brew --prefix fdroidserver)/libexec/bin/python3 $PWD/fdroid" ./tests/run-tests diff --git a/tests/update.TestCase b/tests/update.TestCase index cf8a222a..bebab3f0 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1935,6 +1935,12 @@ class UpdateTest(unittest.TestCase): ) def test_parse_ipa(self): + try: + import biplist # Fedora does not have a biplist package + + biplist # silence the linters + except ImportError as e: + self.skipTest(str(e)) ipa_path = os.path.join( os.path.dirname(os.path.abspath(__file__)), 'com.fake.IpaApp_1000000000001.ipa', From 3f50372d8d21cbce2eee0d75af301fc82976c877 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 22 Jan 2024 21:46:56 +0100 Subject: [PATCH 1372/2116] config: test cases for serverwebroot: with string and list --- tests/common.TestCase | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/common.TestCase b/tests/common.TestCase index 4d9ce009..68ceee55 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -2868,6 +2868,22 @@ class CommonTest(unittest.TestCase): with self.assertRaises(TypeError): fdroidserver.common.config_type_check('config/mirrors.yml', str()) + def test_config_serverwebroot_str(self): + os.chdir(self.testdir) + Path('config.yml').write_text("""serverwebroot: 'foo@example.com:/var/www'""") + self.assertEqual( + ['foo@example.com:/var/www/'], + fdroidserver.common.read_config()['serverwebroot'], + ) + + def test_config_serverwebroot_list(self): + os.chdir(self.testdir) + Path('config.yml').write_text("""serverwebroot:\n - foo@example.com:/var/www""") + self.assertEqual( + ['foo@example.com:/var/www/'], + fdroidserver.common.read_config()['serverwebroot'], + ) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 7a656d45e3d26bb1888f7018a33847b04b967163 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 22 Jan 2024 21:58:12 +0100 Subject: [PATCH 1373/2116] config: convert serverwebroot: to list-of-dicts format This allows for more metadata about the server and deploy mode. --- examples/config.yml | 6 ++++++ fdroidserver/common.py | 13 +++++++++---- fdroidserver/deploy.py | 9 +++++---- tests/common.TestCase | 18 +++++++++++++----- tests/deploy.TestCase | 22 +++++++++++----------- 5 files changed, 44 insertions(+), 24 deletions(-) diff --git a/examples/config.yml b/examples/config.yml index 12f7d138..59453376 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -178,6 +178,12 @@ # serverwebroot: # - foo.com:/usr/share/nginx/www/fdroid # - bar.info:/var/www/fdroid +# +# There is a special mode to only deploy the index file: +# +# serverwebroot: +# - url: 'me@b.az:/srv/fdroid' +# indexOnly: true # When running fdroid processes on a remote server, it is possible to diff --git a/fdroidserver/common.py b/fdroidserver/common.py index e97cedf5..3da0a193 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -462,18 +462,22 @@ def read_config(opts=None): if 'serverwebroot' in config: if isinstance(config['serverwebroot'], str): - roots = [config['serverwebroot']] + roots = [{'url': config['serverwebroot']}] elif all(isinstance(item, str) for item in config['serverwebroot']): + roots = [{'url': i} for i in config['serverwebroot']] + elif all(isinstance(item, dict) for item in config['serverwebroot']): roots = config['serverwebroot'] else: raise TypeError(_('only accepts strings, lists, and tuples')) rootlist = [] - for rootstr in roots: + for d in roots: # since this is used with rsync, where trailing slashes have # meaning, ensure there is always a trailing slash + rootstr = d['url'] if rootstr[-1] != '/': rootstr += '/' - rootlist.append(rootstr.replace('//', '/')) + d['url'] = rootstr.replace('//', '/') + rootlist.append(d) config['serverwebroot'] = rootlist if 'servergitmirrors' in config: @@ -4052,7 +4056,8 @@ def rsync_status_file_to_repo(path, repo_subdir=None): logging.debug(_('skip deploying full build logs: not enabled in config')) return - for webroot in config.get('serverwebroot', []): + for d in config.get('serverwebroot', []): + webroot = d['url'] cmd = ['rsync', '--archive', '--delete-after', diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 7cc709d6..aef9205b 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -294,11 +294,12 @@ def update_serverwebroot(serverwebroot, repo_section): rsyncargs += ['-e', 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + options.identity_file] elif 'identity_file' in config: rsyncargs += ['-e', 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + config['identity_file']] - logging.info('rsyncing ' + repo_section + ' to ' + serverwebroot) + url = serverwebroot['url'] + logging.info('rsyncing ' + repo_section + ' to ' + url) excludes = _get_index_excludes(repo_section) - if subprocess.call(rsyncargs + excludes + [repo_section, serverwebroot]) != 0: + if subprocess.call(rsyncargs + excludes + [repo_section, url]) != 0: raise FDroidException() - if subprocess.call(rsyncargs + [repo_section, serverwebroot]) != 0: + if subprocess.call(rsyncargs + [repo_section, url]) != 0: raise FDroidException() # upload "current version" symlinks if requested if config['make_current_version_link'] and repo_section == 'repo': @@ -308,7 +309,7 @@ def update_serverwebroot(serverwebroot, repo_section): if os.path.islink(f): links_to_upload.append(f) if len(links_to_upload) > 0: - if subprocess.call(rsyncargs + links_to_upload + [serverwebroot]) != 0: + if subprocess.call(rsyncargs + links_to_upload + [url]) != 0: raise FDroidException() diff --git a/tests/common.TestCase b/tests/common.TestCase index 68ceee55..55202dcc 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1655,8 +1655,8 @@ class CommonTest(unittest.TestCase): fdroidserver.common.options.quiet = False fdroidserver.common.config = {} fdroidserver.common.config['serverwebroot'] = [ - 'example.com:/var/www/fdroid/', - 'example.com:/var/www/fbot/', + {'url': 'example.com:/var/www/fdroid/'}, + {'url': 'example.com:/var/www/fbot/'}, ] fdroidserver.common.config['deploy_process_logs'] = True fdroidserver.common.config['identity_file'] = 'ssh/id_rsa' @@ -1718,7 +1718,7 @@ class CommonTest(unittest.TestCase): fdroidserver.common.options = mock.Mock() fdroidserver.common.config = {} - fdroidserver.common.config['serverwebroot'] = [fakeserver] + fdroidserver.common.config['serverwebroot'] = [{'url': fakeserver}] fdroidserver.common.config['identity_file'] = 'ssh/id_rsa' def assert_subprocess_call(cmd): @@ -2872,7 +2872,7 @@ class CommonTest(unittest.TestCase): os.chdir(self.testdir) Path('config.yml').write_text("""serverwebroot: 'foo@example.com:/var/www'""") self.assertEqual( - ['foo@example.com:/var/www/'], + [{'url': 'foo@example.com:/var/www/'}], fdroidserver.common.read_config()['serverwebroot'], ) @@ -2880,7 +2880,15 @@ class CommonTest(unittest.TestCase): os.chdir(self.testdir) Path('config.yml').write_text("""serverwebroot:\n - foo@example.com:/var/www""") self.assertEqual( - ['foo@example.com:/var/www/'], + [{'url': 'foo@example.com:/var/www/'}], + fdroidserver.common.read_config()['serverwebroot'], + ) + + def test_config_serverwebroot_dict(self): + os.chdir(self.testdir) + Path('config.yml').write_text("""serverwebroot:\n - url: 'foo@example.com:/var/www'""") + self.assertEqual( + [{'url': 'foo@example.com:/var/www/'}], fdroidserver.common.read_config()['serverwebroot'], ) diff --git a/tests/deploy.TestCase b/tests/deploy.TestCase index 5539af4c..b1f1f103 100755 --- a/tests/deploy.TestCase +++ b/tests/deploy.TestCase @@ -45,16 +45,16 @@ class DeployTest(unittest.TestCase): fake_apk = repo / 'fake.apk' with fake_apk.open('w') as fp: fp.write('not an APK, but has the right filename') - serverwebroot = Path('serverwebroot') - serverwebroot.mkdir() + url = Path('url') + url.mkdir() # setup parameters for this test run fdroidserver.deploy.options.identity_file = None fdroidserver.deploy.config['make_current_version_link'] = False - dest_apk = Path(serverwebroot) / fake_apk + dest_apk = url / fake_apk self.assertFalse(dest_apk.is_file()) - fdroidserver.deploy.update_serverwebroot(str(serverwebroot), 'repo') + fdroidserver.deploy.update_serverwebroot({'url': str(url)}, 'repo') self.assertTrue(dest_apk.is_file()) @mock.patch.dict(os.environ, clear=True) @@ -72,7 +72,7 @@ class DeployTest(unittest.TestCase): fdroidserver.deploy.options.quiet = True fdroidserver.deploy.options.identity_file = None fdroidserver.deploy.config['make_current_version_link'] = True - serverwebroot = "example.com:/var/www/fdroid" + url = "example.com:/var/www/fdroid" repo_section = 'repo' # setup function for asserting subprocess.call invocations @@ -123,7 +123,7 @@ class DeployTest(unittest.TestCase): '--safe-links', '--quiet', 'repo', - serverwebroot, + url, ], ) elif call_iteration == 2: @@ -152,7 +152,7 @@ class DeployTest(unittest.TestCase): os.symlink('repo/com.example.sym.apk.asc', 'Sym.apk.asc') os.symlink('repo/com.example.sym.apk.sig', 'Sym.apk.sig') with mock.patch('subprocess.call', side_effect=update_server_webroot_call): - fdroidserver.deploy.update_serverwebroot(serverwebroot, repo_section) + fdroidserver.deploy.update_serverwebroot({'url': url}, repo_section) self.assertEqual(call_iteration, 3, 'expected 3 invocations of subprocess.call') def test_update_serverwebroot_with_id_file(self): @@ -163,7 +163,7 @@ class DeployTest(unittest.TestCase): fdroidserver.deploy.options.identity_file = None fdroidserver.deploy.config['identity_file'] = './id_rsa' fdroidserver.deploy.config['make_current_version_link'] = False - serverwebroot = "example.com:/var/www/fdroid" + url = "example.com:/var/www/fdroid" repo_section = 'archive' # setup function for asserting subprocess.call invocations @@ -204,7 +204,7 @@ class DeployTest(unittest.TestCase): '--exclude', 'archive/index.xml', 'archive', - serverwebroot, + url, ], ) elif call_iteration == 1: @@ -220,7 +220,7 @@ class DeployTest(unittest.TestCase): 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + fdroidserver.deploy.config['identity_file'], 'archive', - serverwebroot, + url, ], ) else: @@ -229,7 +229,7 @@ class DeployTest(unittest.TestCase): return 0 with mock.patch('subprocess.call', side_effect=update_server_webroot_call): - fdroidserver.deploy.update_serverwebroot(serverwebroot, repo_section) + fdroidserver.deploy.update_serverwebroot({'url': url}, repo_section) self.assertEqual(call_iteration, 2, 'expected 2 invocations of subprocess.call') @unittest.skipIf( From fbf097d39083928e74ab043b1d8c00db079ad0d3 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 23 Jan 2024 14:39:57 +0100 Subject: [PATCH 1374/2116] deploy: update_serverwebroot() works w/o options/config Since update_serverwebroot() is part of the public API, this function should work without setting `fdroidserver.deploy.options` or `fdroidserver.deploy.config`. --- fdroidserver/deploy.py | 12 ++++++------ tests/deploy.TestCase | 19 +++++++------------ 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index aef9205b..1cea0227 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -284,15 +284,15 @@ def update_serverwebroot(serverwebroot, repo_section): _('rsync is missing or broken: {error}').format(error=e) ) from e rsyncargs = ['rsync', '--archive', '--delete-after', '--safe-links'] - if not options.no_checksum: + if not options or not options.no_checksum: rsyncargs.append('--checksum') - if options.verbose: + if options and options.verbose: rsyncargs += ['--verbose'] - if options.quiet: + if options and options.quiet: rsyncargs += ['--quiet'] - if options.identity_file is not None: + if options and options.identity_file: rsyncargs += ['-e', 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + options.identity_file] - elif 'identity_file' in config: + elif config and config.get('identity_file'): rsyncargs += ['-e', 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + config['identity_file']] url = serverwebroot['url'] logging.info('rsyncing ' + repo_section + ' to ' + url) @@ -302,7 +302,7 @@ def update_serverwebroot(serverwebroot, repo_section): if subprocess.call(rsyncargs + [repo_section, url]) != 0: raise FDroidException() # upload "current version" symlinks if requested - if config['make_current_version_link'] and repo_section == 'repo': + if config and config.get('make_current_version_link') and repo_section == 'repo': links_to_upload = [] for f in glob.glob('*.apk') \ + glob.glob('*.apk.asc') + glob.glob('*.apk.sig'): diff --git a/tests/deploy.TestCase b/tests/deploy.TestCase index b1f1f103..7e6a9857 100755 --- a/tests/deploy.TestCase +++ b/tests/deploy.TestCase @@ -32,13 +32,11 @@ class DeployTest(unittest.TestCase): self._td = mkdtemp() self.testdir = self._td.name - fdroidserver.deploy.options = mock.Mock() - fdroidserver.deploy.config = {} - def tearDown(self): self._td.cleanup() def test_update_serverwebroot(self): + """rsync works with file paths, so this test uses paths for the URLs""" os.chdir(self.testdir) repo = Path('repo') repo.mkdir(parents=True) @@ -48,10 +46,6 @@ class DeployTest(unittest.TestCase): url = Path('url') url.mkdir() - # setup parameters for this test run - fdroidserver.deploy.options.identity_file = None - fdroidserver.deploy.config['make_current_version_link'] = False - dest_apk = url / fake_apk self.assertFalse(dest_apk.is_file()) fdroidserver.deploy.update_serverwebroot({'url': str(url)}, 'repo') @@ -66,12 +60,12 @@ class DeployTest(unittest.TestCase): def test_update_serverwebroot_make_cur_version_link(self): # setup parameters for this test run + fdroidserver.deploy.options = mock.Mock() fdroidserver.deploy.options.no_checksum = True fdroidserver.deploy.options.identity_file = None fdroidserver.deploy.options.verbose = False fdroidserver.deploy.options.quiet = True - fdroidserver.deploy.options.identity_file = None - fdroidserver.deploy.config['make_current_version_link'] = True + fdroidserver.deploy.config = {'make_current_version_link': True} url = "example.com:/var/www/fdroid" repo_section = 'repo' @@ -157,12 +151,13 @@ class DeployTest(unittest.TestCase): def test_update_serverwebroot_with_id_file(self): # setup parameters for this test run - fdroidserver.deploy.options.no_chcksum = False + fdroidserver.deploy.options = mock.Mock() + fdroidserver.deploy.options.identity_file = None + fdroidserver.deploy.options.no_checksum = True fdroidserver.deploy.options.verbose = True fdroidserver.deploy.options.quiet = False fdroidserver.deploy.options.identity_file = None - fdroidserver.deploy.config['identity_file'] = './id_rsa' - fdroidserver.deploy.config['make_current_version_link'] = False + fdroidserver.deploy.config = {'identity_file': './id_rsa'} url = "example.com:/var/www/fdroid" repo_section = 'archive' From 810387a009ddf0ad3f86fcb041b3487e52ef96bc Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 23 Jan 2024 18:47:17 +0100 Subject: [PATCH 1375/2116] deploy: update_serverwebroots() for testable logic This moves all of the serverwebroot: logic into a function, and adds tests. I did this because I ran into issues in the logic in main(): Traceback (most recent call last): File "/builds/eighthave/fdroidserver/fdroid", line 22, in fdroidserver.__main__.main() File "/builds/eighthave/fdroidserver/fdroidserver/__main__.py", line 230, in main raise e File "/builds/eighthave/fdroidserver/fdroidserver/__main__.py", line 211, in main mod.main() File "/builds/eighthave/fdroidserver/fdroidserver/deploy.py", line 753, in main s = serverwebroot.rstrip('/').split(':') AttributeError: 'dict' object has no attribute 'rstrip' --- fdroidserver/__init__.py | 2 ++ fdroidserver/deploy.py | 52 ++++++++++++++++++++++++--------------- tests/deploy.TestCase | 53 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 20 deletions(-) diff --git a/fdroidserver/__init__.py b/fdroidserver/__init__.py index ab9ab1bc..9e4c197f 100644 --- a/fdroidserver/__init__.py +++ b/fdroidserver/__init__.py @@ -55,7 +55,9 @@ scan_apk # NOQA: B101 scan_repo_files # NOQA: B101 from fdroidserver.deploy import (update_awsbucket, update_servergitmirrors, + update_serverwebroots, update_serverwebroot) # NOQA: E402 update_awsbucket # NOQA: B101 update_servergitmirrors # NOQA: B101 +update_serverwebroots # NOQA: B101 update_serverwebroot # NOQA: B101 diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 1cea0227..92287f1b 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -313,6 +313,34 @@ def update_serverwebroot(serverwebroot, repo_section): raise FDroidException() +def update_serverwebroots(serverwebroots, repo_section, standardwebroot=True): + for d in serverwebroots: + # this supports both an ssh host:path and just a path + serverwebroot = d['url'] + s = serverwebroot.rstrip('/').split(':') + if len(s) == 1: + fdroiddir = s[0] + elif len(s) == 2: + host, fdroiddir = s + else: + logging.error(_('Malformed serverwebroot line:') + ' ' + serverwebroot) + sys.exit(1) + repobase = os.path.basename(fdroiddir) + if standardwebroot and repobase != 'fdroid': + logging.error( + _( + 'serverwebroot: path does not end with "fdroid", perhaps you meant one of these:' + ) + + '\n\t' + + serverwebroot.rstrip('/') + + '/fdroid\n\t' + + serverwebroot.rstrip('/').rstrip(repobase) + + 'fdroid' + ) + sys.exit(1) + update_serverwebroot(d, repo_section) + + def sync_from_localcopy(repo_section, local_copy_dir): """Sync the repo from "local copy dir" filesystem to this box. @@ -748,24 +776,6 @@ def main(): else: standardwebroot = True - for serverwebroot in config.get('serverwebroot', []): - # this supports both an ssh host:path and just a path - s = serverwebroot.rstrip('/').split(':') - if len(s) == 1: - fdroiddir = s[0] - elif len(s) == 2: - host, fdroiddir = s - else: - logging.error(_('Malformed serverwebroot line:') + ' ' + serverwebroot) - sys.exit(1) - repobase = os.path.basename(fdroiddir) - if standardwebroot and repobase != 'fdroid': - logging.error('serverwebroot path does not end with "fdroid", ' - + 'perhaps you meant one of these:\n\t' - + serverwebroot.rstrip('/') + '/fdroid\n\t' - + serverwebroot.rstrip('/').rstrip(repobase) + 'fdroid') - sys.exit(1) - if options.local_copy_dir is not None: local_copy_dir = options.local_copy_dir elif config.get('local_copy_dir'): @@ -826,8 +836,10 @@ def main(): sync_from_localcopy(repo_section, local_copy_dir) else: update_localcopy(repo_section, local_copy_dir) - for serverwebroot in config.get('serverwebroot', []): - update_serverwebroot(serverwebroot, repo_section) + if config.get('serverwebroot'): + update_serverwebroots( + config['serverwebroot'], repo_section, standardwebroot + ) if config.get('servergitmirrors', []): # update_servergitmirrors will take care of multiple mirrors so don't need a foreach servergitmirrors = config.get('servergitmirrors', []) diff --git a/tests/deploy.TestCase b/tests/deploy.TestCase index 7e6a9857..e4334725 100755 --- a/tests/deploy.TestCase +++ b/tests/deploy.TestCase @@ -35,6 +35,59 @@ class DeployTest(unittest.TestCase): def tearDown(self): self._td.cleanup() + def test_update_serverwebroots_bad_None(self): + with self.assertRaises(TypeError): + fdroidserver.deploy.update_serverwebroots(None, 'repo') + + def test_update_serverwebroots_bad_int(self): + with self.assertRaises(TypeError): + fdroidserver.deploy.update_serverwebroots(9, 'repo') + + def test_update_serverwebroots_bad_float(self): + with self.assertRaises(TypeError): + fdroidserver.deploy.update_serverwebroots(1.0, 'repo') + + def test_update_serverwebroots(self): + """rsync works with file paths, so this test uses paths for the URLs""" + os.chdir(self.testdir) + repo = Path('repo') + repo.mkdir() + fake_apk = repo / 'fake.apk' + with fake_apk.open('w') as fp: + fp.write('not an APK, but has the right filename') + url0 = Path('url0/fdroid') + url0.mkdir(parents=True) + url1 = Path('url1/fdroid') + url1.mkdir(parents=True) + + dest_apk0 = url0 / fake_apk + dest_apk1 = url1 / fake_apk + self.assertFalse(dest_apk0.is_file()) + self.assertFalse(dest_apk1.is_file()) + fdroidserver.deploy.update_serverwebroots( + [ + {'url': str(url0)}, + {'url': str(url1)}, + ], + str(repo), + ) + self.assertTrue(dest_apk0.is_file()) + self.assertTrue(dest_apk1.is_file()) + + def test_update_serverwebroots_url_does_not_end_with_fdroid(self): + with self.assertRaises(SystemExit): + fdroidserver.deploy.update_serverwebroots([{'url': 'url'}], 'repo') + + def test_update_serverwebroots_bad_ssh_url(self): + with self.assertRaises(SystemExit): + fdroidserver.deploy.update_serverwebroots( + [{'url': 'f@b.ar::/path/to/fdroid'}], 'repo' + ) + + def test_update_serverwebroots_unsupported_ssh_url(self): + with self.assertRaises(SystemExit): + fdroidserver.deploy.update_serverwebroots([{'url': 'ssh://nope'}], 'repo') + def test_update_serverwebroot(self): """rsync works with file paths, so this test uses paths for the URLs""" os.chdir(self.testdir) From ac6a08e10f278c3e335f8eec324667210f264c50 Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Wed, 24 Jan 2024 10:36:34 +0200 Subject: [PATCH 1376/2116] Update default suss --- fdroidserver/scanner.py | 388 +++++++++++++++++++++++----------------- 1 file changed, 224 insertions(+), 164 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index e1e5ff3f..3e20f4cf 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -923,98 +923,100 @@ if __name__ == "__main__": main() -SUSS_DEFAULT = '''{ +SUSS_DEFAULT = r'''{ "cache_duration": 86400, "signatures": { - "admob": { - "gradle_signatures": [ - "admob.*sdk.*android" - ], - "license": "NonFree" - }, - "androidx": { - "gradle_signatures": [ - "androidx.navigation:navigation-dynamic-features", - "androidx.work:work-gcm" - ], - "license": "NonFree" - }, - "appcenter-push": { - "gradle_signatures": [ - "appcenter-push" - ], - "license": "NonFree" - }, - "bugsense": { - "gradle_signatures": [ - "bugsense" - ], - "license": "NonFree" - }, - "cloudrail": { - "gradle_signatures": [ - "cloudrail" - ], - "license": "NonFree" - }, - "com.android.billing": { - "code_signatures": [ - "com/android/billing" - ], - "license": "NonFree" - }, "com.android.billingclient": { + "code_signatures": [ + "com/android/billingclient" + ], "gradle_signatures": [ - "com.android.billingclient" + "com.android.billingclient", + "com.google.androidbrowserhelper:billing", + "com.anjlab.android.iab.v3:library", + "com.github.penn5:donations", + "me.proton.core:payment-iap" ], "license": "NonFree" }, - "com.anjlab.android.iab.v3": { + "com.bugsense": { + "code_signatures": [ + "com/bugsense" + ], "gradle_signatures": [ - "com.anjlab.android.iab.v3:library" + "com.bugsense" ], "license": "NonFree" }, - "com.cloudinary": { + "com.cloudrail": { + "code_signature": [ + "com/cloudrail" + ], "gradle_signatures": [ - "com.cloudinary:cloudinary-android" + "com.cloudrail" ], "license": "NonFree" }, - "com.evernote": { + "com.crashlytics.sdk.android": { + "code_signatures": [ + "com/crashlytics" + ], "gradle_signatures": [ - "com.evernote:android-job" + "crashlytics" ], "license": "NonFree" }, - "com.facebook": { + "com.crittercism": { + "code_signatures": [ + "com/crittercism" + ], "gradle_signatures": [ - "[\\"']com.facebook.android['\\":]" + "com.crittercism" + ], + "license": "NonFree" + }, + "com.facebook.android": { + "code_signatures": [ + "com/facebook" + ], + "gradle_signatures": [ + "com.facebook.android" + ], + "license": "NonFree" + }, + "com.flurry.android": { + "code_signature": [ + "com/flurry" + ], + "gradle_signatures": [ + "com.flurry.android" ], "license": "NonFree" }, "com.github.junrar": { + "code_signatures": [ + "com/github/junrar" + ], "gradle_signatures": [ "com.github.junrar:junrar" ], "license": "NonFree" }, - "com.github.penn5": { + "com.github.omicronapps.7-Zip-JBinding-4Android": { "gradle_signatures": [ - "com.github.penn5:donations" + "com.github.omicronapps:7-Zip-JBinding-4Android" ], - "license": "NonFree" + "license": "NonFree", + "name": "7-Zip-JBinding-4Android" }, - "com.google.analytics": { + "com.google.ads": { "code_signatures": [ - "com/google/analytics" + "com/google/ads" ], - "license": "NonFree" - }, - "com.google.android.exoplayer": { "gradle_signatures": [ - "com.google.android.exoplayer:extension-cast", - "com.google.android.exoplayer:extension-cronet" + "com.google.ads", + "com.google.android.exoplayer:extension-ima", + "androidx.media3:media3-exoplayer-ima" ], "license": "NonFree" }, @@ -1022,198 +1024,256 @@ SUSS_DEFAULT = '''{ "code_signatures": [ "com/google/android/gms" ], + "gradle_signatures": [ + "com.google.android.gms", + "androidx.core:core-google-shortcuts", + "androidx.media3:media3-cast", + "androidx.media3:media3-datasource-cronet", + "androidx.work:work-gcm", + "com.google.android.exoplayer:extension-cast", + "com.google.android.exoplayer:extension-cronet", + "com.evernote:android-job", + "com.cloudinary:cloudinary-android.*:2\\.[12]\\.", + "com.pierfrancescosoffritti.androidyoutubeplayer:chromecast-sender", + "com.yayandroid:locationmanager", + "play-services", + "xyz.belvi.mobilevision:barcodescanner" + ], "license": "NonFree" }, - "com.google.android.libraries.places": { + "com.google.android.libraries": { + "code_signatures": [ + "com/google/android/libraries" + ], "gradle_signatures": [ - "com.google.android.libraries.places:places" + "com.google.android.libraries" ], "license": "NonFree" }, "com.google.android.play": { - "gradle_signatures": [ - "com.google.android.play:app-update", - "com.google.android.play:core.*" + "anti_features": [ + "NonFreeDep", + "NonFreeNet" ], - "license": "NonFree" - }, - "com.google.android.play.core": { "code_signatures": [ "com/google/android/play/core" ], - "license": "NonFree" - }, - "com.google.firebase": { - "code_signatures": [ - "com/google/firebase" + "documentation": [ + "https://developer.android.com/guide/playcore" ], - "license": "NonFree" + "gradle_signatures": [ + "com.google.android.play:app-update", + "com.google.android.play:asset-delivery", + "com.google.android.play:core.*", + "com.google.android.play:feature-delivery", + "com.google.android.play:review", + "androidx.navigation:navigation-dynamic-features", + "com.github.SanojPunchihewa:InAppUpdater" + ], + "license": "NonFree", + "name": "Google Play Core" }, "com.google.mlkit": { + "code_signatures": [ + "com/google/mlkit" + ], "gradle_signatures": [ "com.google.mlkit" ], "license": "NonFree" }, - "com.google.tagmanager": { + "com.heyzap": { "code_signatures": [ - "com/google/tagmanager" + "com/heyzap" ], "license": "NonFree" }, "com.hypertrack": { + "code_signatures": [ + "com/hypertrack/(?!:hyperlog)" + ], "gradle_signatures": [ - "com\\\\.hypertrack(?!:hyperlog)" + "com.hypertrack(?!:hyperlog)" + ], + "gradle_signatures_negative_examples": [ + "com.hypertrack:hyperlog" ], "license": "NonFree" }, "com.mapbox": { - "MaintainerNotes": "com.mapbox.mapboxsdk:mapbox-sdk-services seems to be fully under this license:\\nhttps://github.com/mapbox/mapbox-java/blob/main/LICENSE\\n", + "MaintainerNotes": "It seems that all libs in https://github.com/mapbox/mapbox-java is fully FOSS\nsince 3.0.0.\n", "gradle_signatures": [ - "com\\\\.mapbox(?!\\\\.mapboxsdk:mapbox-sdk-services)" + "com\\.mapbox(?!\\.mapboxsdk:mapbox-sdk-(services|geojson|turf):([3-5]))" + ], + "gradle_signatures_negative_examples": [ + "com.mapbox.mapboxsdk:mapbox-sdk-services:5.0.0", + "com.github.johan12345:mapbox-events-android:a21c324501", + "implementation(\"com.github.johan12345.AnyMaps:anymaps-mapbox:$anyMapsVersion\")" + ], + "gradle_signatures_positive_examples": [ + "com.mapbox.mapboxsdk:mapbox-android-plugin-annotation-v7:0.6.0", + "com.mapbox.mapboxsdk:mapbox-android-plugin-annotation-v8:0.7.0", + "com.mapbox.mapboxsdk:mapbox-android-plugin-localization-v7:0.7.0", + "com.mapbox.mapboxsdk:mapbox-android-plugin-locationlayer:0.4.0", + "com.mapbox.mapboxsdk:mapbox-android-plugin-markerview-v8:0.3.0", + "com.mapbox.mapboxsdk:mapbox-android-plugin-places-v8:0.9.0", + "com.mapbox.mapboxsdk:mapbox-android-plugin-scalebar-v8:0.2.0", + "com.mapbox.mapboxsdk:mapbox-android-sdk:7.3.0" ], "license": "NonFree" }, "com.onesignal": { + "code_signatures": [ + "com/onesignal" + ], "gradle_signatures": [ "com.onesignal:OneSignal" ], "license": "NonFree" }, + "com.paypal.sdk": { + "code_signatures": [ + "com/paypal" + ], + "gradle_signatures": [ + "com.paypal.sdk" + ], + "license": "NonFree" + }, "com.tencent.bugly": { + "code_signatures": [ + "com/tencent/bugly" + ], "gradle_signatures": [ "com.tencent.bugly" ], "license": "NonFree" }, "com.umeng.umsdk": { + "code_signatures": [ + "com/umeng/umsdk" + ], "gradle_signatures": [ "com.umeng.umsdk" ], "license": "NonFree" }, "com.yandex.android": { - "gradle_signatures": [ - "com\\\\.yandex\\\\.android(?!:authsdk)" + "code_signatures": [ + "com/yandex/android/(?!:authsdk)" ], - "license": "NonFree" - }, - "com.yayandroid": { "gradle_signatures": [ - "com.yayandroid:LocationManager" + "com\\.yandex\\.android(?!:authsdk)" ], - "license": "NonFree" - }, - "crashlytics": { - "gradle_signatures": [ - "crashlytics" - ], - "license": "NonFree" - }, - "crittercism": { - "gradle_signatures": [ - "crittercism" + "gradle_signatures_negative_examples": [ + "com.yandex.android:authsdk" ], "license": "NonFree" }, "firebase": { - "gradle_signatures": [ - "com(\\\\.google)?\\\\.firebase[.:](?!firebase-jobdispatcher|geofire-java)" + "code_signatures": [ + "com/google/firebase" ], - "license": "NonFree" + "documentation": [ + "https://www.firebase.com" + ], + "gradle_signatures": [ + "com(\\.google)?\\.firebase[.:](?!firebase-jobdispatcher|geofire-java)", + "com.microsoft.appcenter:appcenter-push" + ], + "gradle_signatures_negative_examples": [ + " compile 'com.firebase:firebase-jobdispatcher:0.8.4'", + "implementation 'com.firebase:geofire-java:3.0.0'", + " compile 'com.firebaseui:firebase-ui-auth:3.1.3'", + "com.firebaseui:firebase-ui-database", + "com.firebaseui:firebase-ui-storage", + "com.github.axet:android-firebase-fake", + "com.github.b3er.rxfirebase:firebase-database", + "com.github.b3er.rxfirebase:firebase-database-kotlin", + "com.segment.analytics.android.integrations:firebase" + ], + "gradle_signatures_positive_examples": [ + "\tcompile 'com.google.firebase:firebase-crash:11.0.8'", + "\tcompile 'com.google.firebase:firebase-core:11.0.8'", + "com.firebase:firebase-client-android:2.5.2", + "com.google.firebase.crashlytics", + "com.google.firebase.firebase-perf", + "com.google.firebase:firebase-ads", + "com.google.firebase:firebase-analytics", + "com.google.firebase:firebase-appindexing", + "com.google.firebase:firebase-auth", + "com.google.firebase:firebase-config", + "com.google.firebase:firebase-core", + "com.google.firebase:firebase-crash", + "com.google.firebase:firebase-crashlytics", + "com.google.firebase:firebase-database", + "com.google.firebase:firebase-dynamic-links", + "com.google.firebase:firebase-firestore", + "com.google.firebase:firebase-inappmessaging", + "com.google.firebase:firebase-inappmessaging-display", + "com.google.firebase:firebase-messaging", + "com.google.firebase:firebase-ml-natural-language", + "com.google.firebase:firebase-ml-natural-language-smart-reply-model", + "com.google.firebase:firebase-ml-vision", + "com.google.firebase:firebase-perf", + "com.google.firebase:firebase-plugins", + "com.google.firebase:firebase-storage" + ], + "license": "NonFree", + "name": "Firebase" }, - "flurryagent": { - "gradle_signatures": [ - "flurryagent" + "google-maps": { + "anti_features": [ + "NonFreeDep", + "NonFreeNet" ], - "license": "NonFree" - }, - "google-ad": { - "gradle_signatures": [ - "google.*ad.*view" + "api_key_ids": [ + "com\\.google\\.android\\.geo\\.API_KEY", + "com\\.google\\.android\\.maps\\.v2\\.API_KEY" ], - "license": "NonFree" - }, - "google.admob": { - "gradle_signatures": [ - "google.*admob" - ], - "license": "NonFree" - }, - "google.play.services": { - "gradle_signatures": [ - "google.*play.*services" - ], - "license": "NonFree" - }, - "heyzap": { - "gradle_signatures": [ - "heyzap" - ], - "license": "NonFree" + "license": "NonFree", + "name": "Google Maps" }, "io.github.sinaweibosdk": { + "code_signatures": [ + "com/sina" + ], "gradle_signatures": [ "io.github.sinaweibosdk" ], "license": "NonFree" }, "io.objectbox": { + "Name": "ObjectBox Database", + "code_signatures": [ + "io/objectbox" + ], "gradle_signatures": [ "io.objectbox:objectbox-gradle-plugin" ], "license": "NonFree" }, - "jpct": { - "gradle_signatures": [ - "jpct.*ae" - ], - "license": "NonFree" - }, - "libspen23": { - "gradle_signatures": [ - "libspen23" - ], - "license": "NonFree" - }, "me.pushy": { + "code_signatures": [ + "me/pushy" + ], "gradle_signatures": [ - "me.pushy:sdk" + "me.pushy" ], "license": "NonFree" }, - "org.jetbrains.kotlinx": { - "gradle_signatures": [ - "org.jetbrains.kotlinx:kotlinx-coroutines-play-services" + "org.mariuszgromada.math": { + "documentation": [ + "https://mathparser.org" ], - "license": "NonFree" - }, - "ouya": { "gradle_signatures": [ - "ouya.*sdk" + "org.mariuszgromada.math:MathParser.org-mXparser" ], - "license": "NonFree" - }, - "paypal": { - "gradle_signatures": [ - "paypal.*mpl" - ], - "license": "NonFree" - }, - "xyz.belvi.mobilevision": { - "gradle_signatures": [ - "xyz.belvi.mobilevision:barcodescanner" - ], - "license": "NonFree" - }, - "youtube": { - "gradle_signatures": [ - "youtube.*android.*player.*api" - ], - "license": "NonFree" + "license": "NonFree", + "name": "mXparser" } }, - "timestamp": 1664480104.875586, + "timestamp": 1706002241.887412, "version": 1, - "last_updated": 1664480104.875586 + "last_updated": 1706171656.496258 }''' From 681392d8c2879eb5dab3acbf79f630c22dc1a328 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 25 Jan 2024 10:02:21 +0100 Subject: [PATCH 1377/2116] scanner: script to update default rules from SUSS --- tests/refresh-SUSS_DEFAULT.py | 37 +++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100755 tests/refresh-SUSS_DEFAULT.py diff --git a/tests/refresh-SUSS_DEFAULT.py b/tests/refresh-SUSS_DEFAULT.py new file mode 100755 index 00000000..11f1cf84 --- /dev/null +++ b/tests/refresh-SUSS_DEFAULT.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 +# +# This will update the caches suss.json from the network, then +# overwrite fdroidserver/scanner.py to add the contents of suss.json +# to the SUSS_DEFAULT variable. + +import inspect +import os +import re +import sys +from pathlib import Path + +localmodule = os.path.realpath( + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) +print('localmodule: ' + localmodule) +if localmodule not in sys.path: + sys.path.insert(0, localmodule) +from fdroidserver import scanner + +scanner._get_tool().refresh() +scanner_py = Path(localmodule) / 'fdroidserver/scanner.py' +contents = scanner_py.read_text() +scanner_py.write_text( + re.sub( + r"""SUSS_DEFAULT *= *r?'''.*""", + """SUSS_DEFAULT = r'''""", + contents, + flags=re.DOTALL, + ) +) +os.system( # nosec bandit B605 start_process_with_a_shell, don't judge me ;-) + """cat %s >> %s""" + % (str(scanner._scanner_cachedir() / 'suss.json'), str(scanner_py)) +) +with scanner_py.open('a') as fp: + fp.write("'''\n") From 1d9ec427580cbf4ac0d0c689c782c55fd171398f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 25 Jan 2024 12:31:05 +0100 Subject: [PATCH 1378/2116] scanner: update test counts based on new default rules The new rules announce more things. --- tests/scanner.TestCase | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 3bee217d..a500774c 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -54,11 +54,11 @@ class ScannerTest(unittest.TestCase): 'OtakuWorld': 2, 'Zillode': 1, 'cn.wildfirechat.chat': 4, - 'com.github.shadowsocks': 6, - 'com.integreight.onesheeld': 11, - 'com.jens.automation2': 2, + 'com.github.shadowsocks': 7, + 'com.integreight.onesheeld': 16, + 'com.jens.automation2': 3, 'firebase-suspect': 1, - 'org.mozilla.rocket': 1, + 'org.mozilla.rocket': 2, 'org.tasks': 2, 'realm': 1, 'se.manyver': 2, From b9c7e8f63aa876ed4e5705701d3a3f32db384bc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20D=C3=BCster?= Date: Tue, 23 Jan 2024 17:54:45 +0100 Subject: [PATCH 1379/2116] Fix "fdroid --version" Fixes https://gitlab.com/fdroid/fdroidserver/-/issues/1164 . Helpful resource: https://packaging.python.org/en/latest/guides/single-sourcing-package-version/ --- fdroidserver/__main__.py | 42 ++++++++++++++++------------------------ 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/fdroidserver/__main__.py b/fdroidserver/__main__.py index 9a088516..00c19e35 100755 --- a/fdroidserver/__main__.py +++ b/fdroidserver/__main__.py @@ -23,7 +23,9 @@ import sys import os import pkgutil import logging +import importlib.metadata +import git import fdroidserver.common import fdroidserver.metadata from fdroidserver import _ @@ -142,31 +144,21 @@ def main(): print(_("""ERROR: The "server" subcommand has been removed, use "deploy"!""")) sys.exit(1) elif command == '--version': - output = _('no version info found!') - cmddir = os.path.realpath(os.path.dirname(os.path.dirname(__file__))) - moduledir = os.path.realpath(os.path.dirname(fdroidserver.common.__file__) + '/..') - if cmddir == moduledir: - # running from git - os.chdir(cmddir) - if os.path.isdir('.git'): - import subprocess - try: - output = subprocess.check_output(['git', 'describe'], - stderr=subprocess.STDOUT, - universal_newlines=True) - except subprocess.CalledProcessError: - output = 'git commit ' + subprocess.check_output(['git', 'rev-parse', 'HEAD'], - universal_newlines=True) - elif os.path.exists('setup.py'): - m = re.search(r'''.*[\s,\(]+version\s*=\s*["']([0-9a-z.]+)["'].*''', - open('setup.py').read(), flags=re.MULTILINE) - if m: - output = m.group(1) + '\n' - else: - from pkg_resources import get_distribution - output = get_distribution('fdroidserver').version + '\n' - print(output) - sys.exit(0) + try: + print(importlib.metadata.version("fdroidserver")) + sys.exit(0) + except importlib.metadata.PackageNotFoundError: + pass + try: + print( + git.repo.Repo( + os.path.dirname(os.path.dirname(__file__)) + ).git.describe(always=True, tags=True) + ) + sys.exit(0) + except git.exc.InvalidGitRepositoryError: + print(_('No version information could be found.')) + sys.exit(1) else: print(_("Command '%s' not recognised.\n" % command)) print_help(available_plugins=available_plugins) From fe7e4f8226f85370cd71900514681b870ba2e95c Mon Sep 17 00:00:00 2001 From: linsui Date: Thu, 25 Jan 2024 19:04:18 +0800 Subject: [PATCH 1380/2116] scanner: refresh data before loading data --- fdroidserver/scanner.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 3e20f4cf..51497bcd 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -332,6 +332,10 @@ class ScannerTool(): # definitions from config.yml here self.scanner_data_lookup() + + if options and options.refresh_scanner: + self.refresh() + self.load() self.compile_regexes() @@ -802,9 +806,6 @@ def main(): # initialize/load configuration values common.get_config(opts=options) - if options.refresh: - scanner._get_tool().refresh() - probcount = 0 appids = [] From 6fb2e07ddaeda5b5019a7e294e38f1618fdec94f Mon Sep 17 00:00:00 2001 From: linsui Date: Thu, 25 Jan 2024 19:15:02 +0800 Subject: [PATCH 1381/2116] fdroid build: add --refresh-scanner option Apply 1 suggestion(s) to 1 file(s) --- fdroidserver/build.py | 2 ++ fdroidserver/scanner.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index fb68f6c6..5f94312b 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -868,6 +868,8 @@ def parse_commandline(): help=_("Don't create a source tarball, useful when testing a build")) parser.add_argument("--no-refresh", dest="refresh", action="store_false", default=True, help=_("Don't refresh the repository, useful when testing a build with no internet connection")) + parser.add_argument("-r", "--refresh-scanner", dest="refresh_scanner", action="store_true", default=False, + help=_("Refresh and cache scanner rules and signatures from the network")) parser.add_argument("-f", "--force", action="store_true", default=False, help=_("Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode.")) parser.add_argument("-a", "--all", action="store_true", default=False, diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 51497bcd..d96f2f6c 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -788,7 +788,7 @@ def main(): help=_("Force scan of disabled apps and builds.")) parser.add_argument("--json", action="store_true", default=False, help=_("Output JSON to stdout.")) - parser.add_argument("-r", "--refresh", action="store_true", default=False, + parser.add_argument("-r", "--refresh", dest="refresh_scanner", action="store_true", default=False, help=_("fetch the latest version of signatures from the web")) parser.add_argument("-e", "--exit-code", action="store_true", default=False, help=_("Exit with a non-zero code if problems were found")) From d6aa3caacae0f741c7e62ebac5d9885dd556d750 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 25 Jan 2024 14:02:54 +0100 Subject: [PATCH 1382/2116] scanner: test of --refresh controls triggering a refresh --- tests/scanner.TestCase | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index a500774c..d9181506 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -711,6 +711,25 @@ class Test_ScannerTool(unittest.TestCase): st.sdcs[0].load.assert_called_once_with() st.sdcs[1].load.assert_called_once_with() + def test_refresh_default(self): + with mock.patch('fdroidserver.scanner.ScannerTool.refresh') as refresh: + fdroidserver.scanner.ScannerTool() + refresh.assert_not_called() + + def test_refresh_true(self): + fdroidserver.scanner.options = mock.Mock() + fdroidserver.scanner.options.refresh_scanner = True + with mock.patch('fdroidserver.scanner.ScannerTool.refresh') as refresh: + fdroidserver.scanner.ScannerTool() + refresh.assert_called_once() + + def test_refresh_false(self): + fdroidserver.scanner.options = mock.Mock() + fdroidserver.scanner.options.refresh_scanner = False + with mock.patch('fdroidserver.scanner.ScannerTool.refresh') as refresh: + fdroidserver.scanner.ScannerTool() + refresh.assert_not_called() + class Test_main(unittest.TestCase): def setUp(self): From 031a13039592750172e45ad1360c2f83374e6e74 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 25 Jan 2024 15:37:46 +0100 Subject: [PATCH 1383/2116] scanner: add refresh_config config item for buildserver Includes some cosmetic changes from black. --- examples/config.yml | 6 ++++++ fdroidserver/scanner.py | 6 +++--- tests/scanner.TestCase | 33 ++++++++++++++++++++++++++++++++- 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/examples/config.yml b/examples/config.yml index 59453376..b094a032 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -373,3 +373,9 @@ # - suss # - exodus # - https://example.com/signatures.json + +# The scanner can use signature sources from the internet. These are +# cached locally. To force them to be refreshed from the network on +# every run, set this to true: +# +# refresh_scanner: true diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index d96f2f6c..478191c2 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -325,15 +325,15 @@ class SUSSDataController(SignatureDataController): self.set_data(json.loads(SUSS_DEFAULT)) -class ScannerTool(): +class ScannerTool: def __init__(self): - # we could add support for loading additional signature source # definitions from config.yml here self.scanner_data_lookup() - if options and options.refresh_scanner: + config = common.get_config() + if (options and options.refresh_scanner) or config.get('refresh_scanner'): self.refresh() self.load() diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index d9181506..aba95323 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -704,6 +704,20 @@ class Test_SignatureDataController(unittest.TestCase): class Test_ScannerTool(unittest.TestCase): + def setUp(self): + fdroidserver.common.options = None + fdroidserver.common.config = None + self.basedir = os.path.join(localmodule, 'tests') + os.chdir(self.basedir) + self._td = mkdtemp() + self.testdir = self._td.name + + def tearDown(self): + fdroidserver.common.options = None + fdroidserver.common.config = None + os.chdir(self.basedir) + self._td.cleanup() + def test_load(self): st = mock.Mock() st.sdcs = [mock.Mock(), mock.Mock()] @@ -711,7 +725,8 @@ class Test_ScannerTool(unittest.TestCase): st.sdcs[0].load.assert_called_once_with() st.sdcs[1].load.assert_called_once_with() - def test_refresh_default(self): + def test_refresh_no_options_or_config(self): + """This simulates what happens when running something like scan_source()""" with mock.patch('fdroidserver.scanner.ScannerTool.refresh') as refresh: fdroidserver.scanner.ScannerTool() refresh.assert_not_called() @@ -730,6 +745,22 @@ class Test_ScannerTool(unittest.TestCase): fdroidserver.scanner.ScannerTool() refresh.assert_not_called() + def test_refresh_from_config(self): + os.chdir(self.testdir) + pathlib.Path('config.yml').write_text('refresh_scanner: true') + with mock.patch('fdroidserver.scanner.ScannerTool.refresh') as refresh: + fdroidserver.scanner.ScannerTool() + refresh.assert_called_once() + + def test_refresh_options_overrides_config(self): + fdroidserver.scanner.options = mock.Mock() + fdroidserver.scanner.options.refresh_scanner = True + os.chdir(self.testdir) + pathlib.Path('config.yml').write_text('refresh_scanner: false') + with mock.patch('fdroidserver.scanner.ScannerTool.refresh') as refresh: + fdroidserver.scanner.ScannerTool() + refresh.assert_called_once() + class Test_main(unittest.TestCase): def setUp(self): From 2f313a0bd6fb7a131134e1ab59f08b140f53d89d Mon Sep 17 00:00:00 2001 From: linsui Date: Mon, 29 Jan 2024 23:13:13 +0800 Subject: [PATCH 1384/2116] scanner: refresh data without scaning --- fdroidserver/scanner.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 478191c2..c875b4ea 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -825,6 +825,8 @@ def main(): if not appids: if options.exit_code and probcount > 0: sys.exit(ExitCode.NONFREE_CODE) + if options.refresh_scanner: + _get_tool() return # Read all app and srclib metadata From ac71bb07b828a0f6c74e6ddc4f1ea30b6c03f1f3 Mon Sep 17 00:00:00 2001 From: linsui Date: Sun, 4 Feb 2024 20:42:43 +0800 Subject: [PATCH 1385/2116] add gradle 8.6 --- gradlew-fdroid | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 0de9dd04..328156ce 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -197,6 +197,7 @@ get_sha() { '8.3') echo '591855b517fc635b9e04de1d05d5e76ada3f89f5fc76f87978d1b245b4f69225' ;; '8.4') echo '3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae' ;; '8.5') echo '9d926787066a081739e8200858338b4a69e837c3a821a33aca9db09dd4a41026' ;; + '8.6') echo '9631d53cf3e74bfa726893aee1f8994fee4e060c401335946dba2156f440f24c' ;; *) exit 1 esac } @@ -213,11 +214,11 @@ contains() { # (key) should accept. plugin versions are actually prefixes and catch sub- # versions as well. Pairs are taken from: # https://developer.android.com/studio/releases/gradle-plugin#updating-gradle -d_gradle_plugin_ver_k=(8.3 8.2 8.1 8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 1.3 1.2 1.1 1.0 0.14 0.13 0.12 0.11 0.10 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2) -d_plugin_min_gradle_v=(8.3 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) +d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 1.3 1.2 1.1 1.0 0.14 0.13 0.12 0.11 0.10 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2) +d_plugin_min_gradle_v=(8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From b36153b06cafa2bc2992c4f64a29b44d63ffa00f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 14 Feb 2024 17:46:09 +0100 Subject: [PATCH 1386/2116] safety: ignore CVE-2024-22190 it only affects Windows https://security-tracker.debian.org/tracker/CVE-2024-22190 --- .safety-policy.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.safety-policy.yml b/.safety-policy.yml index 7d9ec149..39e601d2 100644 --- a/.safety-policy.yml +++ b/.safety-policy.yml @@ -17,3 +17,6 @@ security: 62044: reason: "F-Droid doesn't fetch pip dependencies directly from hg/mercurial repositories: https://data.safetycli.com/v/62044/f17/" expires: '2025-01-31' + 63687: + reason: Only affects Windows https://security-tracker.debian.org/tracker/CVE-2024-22190 + expires: '2026-01-31' From 947217549afeb0bee8b34c927bc86e9372ed72df Mon Sep 17 00:00:00 2001 From: proletarius101 Date: Wed, 14 Feb 2024 16:50:39 +0000 Subject: [PATCH 1387/2116] feat: add servergitmirrors as a dict support --- .gitlab-ci.yml | 2 +- examples/config.yml | 8 ++--- fdroidserver/common.py | 6 ++-- fdroidserver/deploy.py | 21 ++++++++--- fdroidserver/index.py | 3 +- fdroidserver/nightly.py | 2 +- tests/deploy.TestCase | 80 +++++++++++++++++++++++++++++++++++++++++ tests/index.TestCase | 10 +++--- tests/nightly.TestCase | 6 ++-- tests/run-tests | 2 +- 10 files changed, 118 insertions(+), 22 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 866a2ec8..7e7f0b25 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -542,7 +542,7 @@ servergitmirrors: - cp tests/repo/com.politedroid_6.apk /tmp/fdroid/repo/ - cd /tmp/fdroid - touch fdroid-icon.png - - printf "\nservergitmirrors = 'git@gitlab.com:fdroid/ci-test-servergitmirrors-repo.git'\n" >> config.py + - printf "servergitmirrors:\n-\ url:\ $SERVER_GIT_MIRROR\n" >> config.yml - $PYTHONPATH/fdroid update --verbose --create-metadata - $PYTHONPATH/fdroid deploy --verbose - export DLURL=`grep -Eo 'https://gitlab.com/fdroid/ci-test-servergitmirrors-repo[^"]+' repo/index-v1.json` diff --git a/examples/config.yml b/examples/config.yml index b094a032..79f020a6 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -198,14 +198,14 @@ # deploy_process_logs: true # The full URL to a git remote repository. You can include -# multiple servers to mirror to by wrapping the whole thing in {} or [], and -# including the servergitmirrors strings in a comma-separated list. +# multiple servers to mirror to by adding strings to a YAML list or map. # Servers listed here will also be automatically inserted in the mirrors list. # # servergitmirrors: https://github.com/user/repo # servergitmirrors: -# - https://github.com/user/repo -# - https://gitlab.com/user/repo +# - url: https://github.com/user/repo +# - url: https://gitlab.com/user/repo +# indexOnly: true # Most git hosting services have hard size limits for each git repo. # `fdroid deploy` will delete the git history when the git mirror repo diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 3da0a193..e8774ef5 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -67,7 +67,7 @@ from pyasn1.error import PyAsn1Error import fdroidserver.metadata import fdroidserver.lint from fdroidserver import _ -from fdroidserver.exception import FDroidException, VCSException, NoSubmodulesException,\ +from fdroidserver.exception import FDroidException, VCSException, NoSubmodulesException, \ BuildException, VerificationException, MetaDataException from .asynchronousfilereader import AsynchronousFileReader from .looseversion import LooseVersion @@ -482,8 +482,10 @@ def read_config(opts=None): if 'servergitmirrors' in config: if isinstance(config['servergitmirrors'], str): - roots = [config['servergitmirrors']] + roots = [{"url": config['servergitmirrors']}] elif all(isinstance(item, str) for item in config['servergitmirrors']): + roots = [{'url': i} for i in config['servergitmirrors']] + elif all(isinstance(item, dict) for item in config['servergitmirrors']): roots = config['servergitmirrors'] else: raise TypeError(_('only accepts strings, lists, and tuples')) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 92287f1b..2f8c4569 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -47,6 +47,19 @@ AUTO_S3CFG = '.fdroid-deploy-s3cfg' USER_S3CFG = 's3cfg' REMOTE_HOSTNAME_REGEX = re.compile(r'\W*\w+\W+(\w+).*') +INDEX_FILES = [ + "entry.jar", + "entry.json", + "entry.json.asc", + "index-v1.jar", + "index-v1.json", + "index-v1.json.asc", + "index-v2.json", + "index-v2.json.asc", + "index.jar", + "index.xml", +] + def _get_index_excludes(repo_section): """Return the list of files to be synced last, since they finalize the deploy. @@ -447,7 +460,8 @@ def update_servergitmirrors(servergitmirrors, repo_section): repo = git.Repo.init(git_mirror_path, initial_branch=GIT_BRANCH) enabled_remotes = [] - for remote_url in servergitmirrors: + for d in servergitmirrors: + remote_url = d['url'] name = REMOTE_HOSTNAME_REGEX.sub(r'\1', remote_url) enabled_remotes.append(name) r = git.remote.Remote(repo, name) @@ -840,10 +854,9 @@ def main(): update_serverwebroots( config['serverwebroot'], repo_section, standardwebroot ) - if config.get('servergitmirrors', []): + if config.get('servergitmirrors'): # update_servergitmirrors will take care of multiple mirrors so don't need a foreach - servergitmirrors = config.get('servergitmirrors', []) - update_servergitmirrors(servergitmirrors, repo_section) + update_servergitmirrors(config['servergitmirrors'], repo_section) if config.get('awsbucket'): update_awsbucket(repo_section) if config.get('androidobservatory'): diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 9a631eb8..f64b8806 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -1478,7 +1478,7 @@ def add_mirrors_to_repodict(repo_section, repodict): repodict['mirrors'].insert(0, {'isPrimary': True, 'url': repodict['address']}) -def get_mirror_service_urls(url): +def get_mirror_service_urls(mirror): """Get direct URLs from git service for use by fdroidclient. Via 'servergitmirrors', fdroidserver can create and push a mirror @@ -1496,6 +1496,7 @@ def get_mirror_service_urls(url): information about the repo available to end user. """ + url = mirror['url'] if url.startswith('git@'): url = re.sub(r'^git@([^:]+):(.+)', r'https://\1/\2', url) diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 2d1c1ead..2d0b2325 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -358,7 +358,7 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, 'archive_url': repo_base + '/archive', 'archive_description': 'Old nightly builds that have been archived.', 'archive_older': options.archive_older, - 'servergitmirrors': servergitmirror, + 'servergitmirrors': [{"url": servergitmirror}], 'keystore': KEYSTORE_FILE, 'repo_keyalias': KEY_ALIAS, 'keystorepass': PASSWORD, diff --git a/tests/deploy.TestCase b/tests/deploy.TestCase index e4334725..bbb0e929 100755 --- a/tests/deploy.TestCase +++ b/tests/deploy.TestCase @@ -300,6 +300,86 @@ class DeployTest(unittest.TestCase): name, fdroidserver.deploy.REMOTE_HOSTNAME_REGEX.sub(r'\1', remote_url) ) + def test_update_servergitmirrors(self): + # setup parameters for this test run + fdroidserver.deploy.options = mock.Mock() + fdroidserver.deploy.options.identity_file = None + fdroidserver.deploy.options.no_keep_git_mirror_archive = False + fdroidserver.deploy.options.verbose = False + fdroidserver.deploy.options.quiet = True + fdroidserver.deploy.options.index_only = False + + config = {} + fdroidserver.common.fill_config_defaults(config) + fdroidserver.deploy.config = config + fdroidserver.deploy.config["servergitmirrors"] = [] + + repo_section = 'repo' + + # setup function for asserting subprocess.call invocations + update_servergitmirrors_call_iteration = 0 + remote_push_call_iteration = 0 + + os.chdir(self.testdir) + repo = Path('repo') + repo.mkdir(parents=True) + fake_apk = repo / 'Sym.apk' + with fake_apk.open('w') as fp: + fp.write('not an APK, but has the right filename') + fake_index = repo / fdroidserver.deploy.INDEX_FILES[0] + with fake_index.open('w') as fp: + fp.write('not an index, but has the right filename') + + def update_servergitmirrors_call(cmd): + nonlocal update_servergitmirrors_call_iteration + if update_servergitmirrors_call_iteration == 0: + self.assertListEqual( + cmd, + [ + 'rsync', + '--recursive', + '--safe-links', + '--times', + '--perms', + '--one-file-system', + '--delete', + '--chmod=Da+rx,Fa-x,a+r,u+w', + '--quiet', + 'repo/', + "git-mirror/fdroid/repo/", + ], + ) + else: + self.fail('unexpected subprocess.call invocation') + update_servergitmirrors_call_iteration += 1 + return 0 + + def remote_push_call(ref, force=False, set_upstream=False, **_args): + nonlocal remote_push_call_iteration + if remote_push_call_iteration == 0: + self.assertEqual([ref, force, set_upstream], ['master', True, True]) + else: + self.fail('unexpected git.Remote.push invocation') + remote_push_call_iteration += 1 + return [] + + with mock.patch('subprocess.call', side_effect=update_servergitmirrors_call): + with mock.patch( + 'git.Remote.push', side_effect=remote_push_call + ) as mock_remote_push: + mock_remote_push.return_value = [] + fdroidserver.deploy.update_servergitmirrors( + [{'url': 'https://github.com/user/repo'}], repo_section + ) + self.assertEqual( + update_servergitmirrors_call_iteration, + 1, + 'expected 1 invocations of subprocess.call', + ) + self.assertEqual( + remote_push_call_iteration, 1, 'expected 1 invocations of git.Remote.push' + ) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) diff --git a/tests/index.TestCase b/tests/index.TestCase index 00c8474b..8eccec76 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -575,7 +575,7 @@ class IndexTest(unittest.TestCase): ]: self.assertEqual( ['https://raw.githubusercontent.com/foo/bar/master/fdroid'], - index.get_mirror_service_urls(url), + index.get_mirror_service_urls({"url": url}), ) @patch.dict(os.environ, clear=True) @@ -603,13 +603,13 @@ class IndexTest(unittest.TestCase): ] self.assertEqual( expected, - index.get_mirror_service_urls(url), + index.get_mirror_service_urls({"url": url}), ) with patch.dict(os.environ, clear=True): os.environ['CI_JOB_ID'] = ci_job_id self.assertEqual( expected + [artifacts_url], - index.get_mirror_service_urls(url), + index.get_mirror_service_urls({"url": url}), ) with patch('fdroidserver.common.GITLAB_COM_PAGES_MAX_SIZE', 10): expected = [ @@ -617,13 +617,13 @@ class IndexTest(unittest.TestCase): ] self.assertEqual( expected, - index.get_mirror_service_urls(url), + index.get_mirror_service_urls({"url": url}), ) with patch.dict(os.environ, clear=True): os.environ['CI_JOB_ID'] = ci_job_id self.assertEqual( expected + [artifacts_url], - index.get_mirror_service_urls(url), + index.get_mirror_service_urls({"url": url}), ) def test_make_website(self): diff --git a/tests/nightly.TestCase b/tests/nightly.TestCase index 9c861fcb..b6d47447 100755 --- a/tests/nightly.TestCase +++ b/tests/nightly.TestCase @@ -256,7 +256,7 @@ class NightlyTest(unittest.TestCase): self.assertEqual(called, [['ssh', '-Tvi'], ['fdroid', 'deploy']]) self.assertFalse(os.path.exists('config.py')) git_url = 'git@github.com:f-droid/test-nightly' - mirror_url = index.get_mirror_service_urls(git_url)[0] + mirror_url = index.get_mirror_service_urls({"url": git_url})[0] expected = { 'archive_description': 'Old nightly builds that have been archived.', 'archive_name': 'f-droid/test-nightly archive', @@ -271,7 +271,7 @@ class NightlyTest(unittest.TestCase): 'repo_keyalias': 'androiddebugkey', 'repo_name': 'f-droid/test-nightly', 'repo_url': mirror_url + '/repo', - 'servergitmirrors': git_url, + 'servergitmirrors': [{"url": git_url}], 'update_stats': True, } with open('config.yml') as fp: @@ -344,7 +344,7 @@ class NightlyTest(unittest.TestCase): 'repo_keyalias': 'androiddebugkey', 'repo_name': 'fdroid/test-nightly', 'repo_url': 'https://gitlab.com/fdroid/test-nightly/-/raw/master/fdroid/repo', - 'servergitmirrors': 'git@gitlab.com:fdroid/test-nightly', + 'servergitmirrors': [{"url": 'git@gitlab.com:fdroid/test-nightly'}], 'update_stats': True, } with open('config.yml') as fp: diff --git a/tests/run-tests b/tests/run-tests index 0dd750d8..ca9aa951 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -1154,7 +1154,7 @@ GIT_MIRROR=$REPOROOT/git-mirror cd $REPOROOT fdroid_init_with_prebuilt_keystore printf '\narchive_older: 3\n' >> config.yml -echo "servergitmirrors: $SERVER_GIT_MIRROR" >> config.yml +printf "servergitmirrors: $SERVER_GIT_MIRROR\n" >> config.yml cp $WORKSPACE/tests/repo/com.politedroid_[345].apk repo/ $fdroid update --create-metadata From 4e0c721b045c3381fe2e4234b7d40c29ce1d17a6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 14 Feb 2024 17:58:05 +0100 Subject: [PATCH 1388/2116] fixups from "feat: add servergitmirrors as a dict support" These slipped by in reviewing fdroidserver!1438 https://gitlab.com/fdroid/fdroidserver/-/jobs/6173435409 --- .gitlab-ci.yml | 2 +- examples/config.yml | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7e7f0b25..5c5ad6f4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -542,7 +542,7 @@ servergitmirrors: - cp tests/repo/com.politedroid_6.apk /tmp/fdroid/repo/ - cd /tmp/fdroid - touch fdroid-icon.png - - printf "servergitmirrors:\n-\ url:\ $SERVER_GIT_MIRROR\n" >> config.yml + - printf "\nservergitmirrors\x3a 'git@gitlab.com:fdroid/ci-test-servergitmirrors-repo.git'\n" >> config.yml - $PYTHONPATH/fdroid update --verbose --create-metadata - $PYTHONPATH/fdroid deploy --verbose - export DLURL=`grep -Eo 'https://gitlab.com/fdroid/ci-test-servergitmirrors-repo[^"]+' repo/index-v1.json` diff --git a/examples/config.yml b/examples/config.yml index 79f020a6..0a0a54f0 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -203,6 +203,10 @@ # # servergitmirrors: https://github.com/user/repo # servergitmirrors: +# - https://github.com/user/repo +# - https://gitlab.com/user/repo +# +# servergitmirrors: # - url: https://github.com/user/repo # - url: https://gitlab.com/user/repo # indexOnly: true From 3c77ac66b162c1ddfdf4647f507e09fbd44d1e9a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 14 Feb 2024 18:31:09 +0100 Subject: [PATCH 1389/2116] gitlab-ci: revert to old config.py for servergitmirrors: job --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5c5ad6f4..866a2ec8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -542,7 +542,7 @@ servergitmirrors: - cp tests/repo/com.politedroid_6.apk /tmp/fdroid/repo/ - cd /tmp/fdroid - touch fdroid-icon.png - - printf "\nservergitmirrors\x3a 'git@gitlab.com:fdroid/ci-test-servergitmirrors-repo.git'\n" >> config.yml + - printf "\nservergitmirrors = 'git@gitlab.com:fdroid/ci-test-servergitmirrors-repo.git'\n" >> config.py - $PYTHONPATH/fdroid update --verbose --create-metadata - $PYTHONPATH/fdroid deploy --verbose - export DLURL=`grep -Eo 'https://gitlab.com/fdroid/ci-test-servergitmirrors-repo[^"]+' repo/index-v1.json` From ec88cc627fa3d45cd0f9ab30339d252eb4c08778 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Wed, 14 Feb 2024 17:32:15 +0000 Subject: [PATCH 1390/2116] gradle v8.6 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 328156ce..65b50eb3 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -187,6 +187,7 @@ get_sha() { '7.6.1') echo '6147605a23b4eff6c334927a86ff3508cb5d6722cd624c97ded4c2e8640f1f87' ;; '7.6.2') echo 'a01b6587e15fe7ed120a0ee299c25982a1eee045abd6a9dd5e216b2f628ef9ac' ;; '7.6.3') echo '740c2e472ee4326c33bf75a5c9f5cd1e69ecf3f9b580f6e236c86d1f3d98cfac' ;; + '7.6.4') echo 'bed1da33cca0f557ab13691c77f38bb67388119e4794d113e051039b80af9bb1' ;; '8.0') echo '4159b938ec734a8388ce03f52aa8f3c7ed0d31f5438622545de4f83a89b79788' ;; '8.0.1') echo '1b6b558be93f29438d3df94b7dfee02e794b94d9aca4611a92cdb79b6b88e909' ;; '8.0.2') echo 'ff7bf6a86f09b9b2c40bb8f48b25fc19cf2b2664fd1d220cd7ab833ec758d0d7' ;; @@ -218,7 +219,7 @@ d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 d_plugin_min_gradle_v=(8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 04cedd1808453f86e9f30695128fba5ec138cf78 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 16 Feb 2024 11:43:13 +0100 Subject: [PATCH 1391/2116] build: pass --refresh-scanner thru to buildserver VM --- fdroidserver/build.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 5f94312b..63479af1 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -232,6 +232,8 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): cmdline += ' --force --test' if options.verbose: cmdline += ' --verbose' + if options.refresh_scanner or config.get('refresh_scanner'): + cmdline += ' --refresh-scanner' if options.skipscan: cmdline += ' --skip-scan' if options.notarball: From 8931e038d6fa9edd7e709b69e9c9bf1bdb2735ef Mon Sep 17 00:00:00 2001 From: Nitai Sasson Date: Wed, 21 Feb 2024 12:50:41 +0000 Subject: [PATCH 1392/2116] add 'non-changeable' to NonFreeNet description --- tests/config/antiFeatures.yml | 2 +- tests/repo/entry.json | 6 +++--- tests/repo/index-v2.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/config/antiFeatures.yml b/tests/config/antiFeatures.yml index e4c1a107..06d794a1 100644 --- a/tests/config/antiFeatures.yml +++ b/tests/config/antiFeatures.yml @@ -32,7 +32,7 @@ NonFreeDep: icon: ic_antifeature_nonfreedep.xml name: Non-Free Dependencies NonFreeNet: - description: This app promotes or depends entirely on a non-free network service + description: This app promotes or depends entirely on a non-changeable or non-free network service icon: ic_antifeature_nonfreenet.xml name: Non-Free Network Services Tracking: diff --git a/tests/repo/entry.json b/tests/repo/entry.json index ae645055..bf6a2e76 100644 --- a/tests/repo/entry.json +++ b/tests/repo/entry.json @@ -3,9 +3,9 @@ "version": 20002, "index": { "name": "/index-v2.json", - "sha256": "72146bc3bbbfd49c4e23435ca8ba13d58673a83fa4634f7ce2ea465616860293", - "size": 53283, + "sha256": "4a36d8cdb5b7a9e59d8c2e9e2a81b968db975901ff7dac12ca15449acf07cf35", + "size": 53527, "numPackages": 10 }, "diffs": {} -} +} \ No newline at end of file diff --git a/tests/repo/index-v2.json b/tests/repo/index-v2.json index 3bc7fcaa..3f55f038 100644 --- a/tests/repo/index-v2.json +++ b/tests/repo/index-v2.json @@ -371,7 +371,7 @@ "NonFreeNet": { "description": { "de": "Diese App bewirbt nicht-quelloffene Netzwerkdienste", - "en-US": "This app promotes or depends entirely on a non-free network service", + "en-US": "This app promotes or depends entirely on a non-changeable or non-free network service", "fa": "این کاره، خدمات شبکه‌های ناآزاد را ترویج می‌کند", "ro": "Aplicația promovează servicii de rețea ce nu sunt accesibile la liber", "zh-rCN": "此应用推广非自由的网络服务" From 7913df25ba719abb542852d55df167f63777a324 Mon Sep 17 00:00:00 2001 From: linsui Date: Sun, 4 Feb 2024 20:44:00 +0800 Subject: [PATCH 1393/2116] fix litecoin address regex --- fdroidserver/metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 240b82ba..ce7e5ee8 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -433,7 +433,7 @@ valuetypes = { ["Bitcoin"]), FieldValidator("Litecoin address", - r'^([LM3][a-km-zA-HJ-NP-Z1-9]{26,33}|ltc1[a-km-z0-9]{39})$', + r'^([LM3][a-km-zA-HJ-NP-Z1-9]{26,33}|ltc1[a-z0-9]{39})$', ["Litecoin"]), FieldValidator("Repo Type", From 76d9eddb3a61f76000852580517181a569b6784a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 27 Feb 2024 16:39:53 +0100 Subject: [PATCH 1394/2116] method to globally set logging to output nicely to the console This will make all of the direct calls to logging level functions output in a format that looks appropriate for the console. Previously, the default output looked like it should be written to a log file. --- fdroidserver/common.py | 25 +++++++++++++++++++++++++ fdroidserver/init.py | 9 ++++++++- fdroidserver/install.py | 2 ++ fdroidserver/mirror.py | 8 +++++--- fdroidserver/signatures.py | 2 ++ 5 files changed, 42 insertions(+), 4 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index e8774ef5..38922cde 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -192,6 +192,31 @@ def setup_global_opts(parser): help=_("Restrict output to warnings and errors")) +def set_console_logging(verbose=False): + """Globally set logging to output nicely to the console.""" + + class _StdOutFilter(logging.Filter): + def filter(self, record): + return record.levelno < logging.ERROR + + if verbose: + level = logging.DEBUG + else: + level = logging.ERROR + + stdout_handler = logging.StreamHandler(sys.stdout) + stdout_handler.addFilter(_StdOutFilter()) + stdout_handler.setFormatter(logging.Formatter('%(message)s')) + + stderr_handler = logging.StreamHandler(sys.stderr) + stderr_handler.setLevel(logging.ERROR) + stderr_handler.setFormatter(logging.Formatter(_('ERROR: %(message)s'))) + + logging.basicConfig( + force=True, level=level, handlers=[stdout_handler, stderr_handler] + ) + + def _add_java_paths_to_config(pathlist, thisconfig): def path_version_key(s): versionlist = [] diff --git a/fdroidserver/init.py b/fdroidserver/init.py index 35092fcd..d3195288 100644 --- a/fdroidserver/init.py +++ b/fdroidserver/init.py @@ -83,6 +83,8 @@ def main(): ) options = parser.parse_args() + common.set_console_logging(options.verbose) + fdroiddir = os.getcwd() test_config = dict() examplesdir = common.get_examples_dir() @@ -290,4 +292,9 @@ and https://f-droid.org/docs/Signing_Process''' ) % os.path.join(fdroiddir, 'repo') ) - logging.info(msg) + if not options.quiet: + # normally, INFO is only shown with --verbose, but show this unless --quiet + logger = logging.getLogger() + logger.setLevel(logging.INFO) + logger.info(msg) + logging.shutdown() diff --git a/fdroidserver/install.py b/fdroidserver/install.py index 37631519..79b0a924 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -54,6 +54,8 @@ def main(): help=_("Install all signed applications available")) options = parser.parse_args() + common.set_console_logging(options.verbose) + if not options.appid and not options.all: parser.error(_("option %s: If you really want to install all the signed apps, use --all") % "all") diff --git a/fdroidserver/mirror.py b/fdroidserver/mirror.py index 27603a85..224fcc5a 100644 --- a/fdroidserver/mirror.py +++ b/fdroidserver/mirror.py @@ -95,6 +95,8 @@ def main(): ) options = parser.parse_args() + common.set_console_logging(options.verbose) + if options.all: options.archive = True options.build_logs = True @@ -152,10 +154,10 @@ def main(): if hostname == 'f-droid.org' or ( ip is not None and hostname in socket.gethostbyname_ex('f-droid.org')[2] ): - print( + logging.error( _( - 'ERROR: this command should never be used to mirror f-droid.org!\n' - 'A full mirror of f-droid.org requires more than 200GB.' + 'This command should never be used to mirror f-droid.org! ' + 'A full copy requires more than 600GB.' ) ) sys.exit(1) diff --git a/fdroidserver/signatures.py b/fdroidserver/signatures.py index 4961f8bf..b19bed8b 100644 --- a/fdroidserver/signatures.py +++ b/fdroidserver/signatures.py @@ -105,6 +105,8 @@ def main(): parser.add_argument("--no-check-https", action="store_true", default=False) options = parser.parse_args() + common.set_console_logging(options.verbose) + # Read config.py... common.read_config(options) From 617a9e75c77aff9ca937e553cc03bac44bec8f24 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 15 Feb 2024 08:49:35 +0100 Subject: [PATCH 1395/2116] convert install.py to black code format --- fdroidserver/install.py | 55 +++++++++++++++++++++++++++++------------ pyproject.toml | 1 - 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/fdroidserver/install.py b/fdroidserver/install.py index 79b0a924..9ef82da0 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -47,17 +47,31 @@ def main(): global options, config # Parse command line... - parser = ArgumentParser(usage="%(prog)s [options] [APPID[:VERCODE] [APPID[:VERCODE] ...]]") + parser = ArgumentParser( + usage="%(prog)s [options] [APPID[:VERCODE] [APPID[:VERCODE] ...]]" + ) common.setup_global_opts(parser) - parser.add_argument("appid", nargs='*', help=_("application ID with optional versionCode in the form APPID[:VERCODE]")) - parser.add_argument("-a", "--all", action="store_true", default=False, - help=_("Install all signed applications available")) + parser.add_argument( + "appid", + nargs='*', + help=_("application ID with optional versionCode in the form APPID[:VERCODE]"), + ) + parser.add_argument( + "-a", + "--all", + action="store_true", + default=False, + help=_("Install all signed applications available"), + ) options = parser.parse_args() common.set_console_logging(options.verbose) if not options.appid and not options.all: - parser.error(_("option %s: If you really want to install all the signed apps, use --all") % "all") + parser.error( + _("option %s: If you really want to install all the signed apps, use --all") + % "all" + ) config = common.read_config(options) @@ -67,14 +81,12 @@ def main(): sys.exit(0) if options.appid: - vercodes = common.read_pkg_args(options.appid, True) - common.get_metadata_files(vercodes) # only check appids + common.get_metadata_files(vercodes) # only check appids apks = {appid: None for appid in vercodes} # Get the signed APK with the highest vercode for apkfile in sorted(glob.glob(os.path.join(output_dir, '*.apk'))): - try: appid, vercode = common.publishednameinfo(apkfile) except FDroidException: @@ -90,9 +102,10 @@ def main(): raise FDroidException(_("No signed APK available for %s") % appid) else: - - apks = {common.publishednameinfo(apkfile)[0]: apkfile for apkfile in - sorted(glob.glob(os.path.join(output_dir, '*.apk')))} + apks = { + common.publishednameinfo(apkfile)[0]: apkfile + for apkfile in sorted(glob.glob(os.path.join(output_dir, '*.apk'))) + } for appid, apk in apks.items(): # Get device list each time to avoid device not found errors @@ -101,7 +114,11 @@ def main(): raise FDroidException(_("No attached devices found")) logging.info(_("Installing %s...") % apk) for dev in devs: - logging.info(_("Installing '{apkfilename}' on {dev}...").format(apkfilename=apk, dev=dev)) + logging.info( + _("Installing '{apkfilename}' on {dev}...").format( + apkfilename=apk, dev=dev + ) + ) p = SdkToolsPopen(['adb', "-s", dev, "install", apk]) fail = "" for line in p.output.splitlines(): @@ -111,11 +128,17 @@ def main(): continue if fail == "INSTALL_FAILED_ALREADY_EXISTS": - logging.warning(_('"{apkfilename}" is already installed on {dev}.') - .format(apkfilename=apk, dev=dev)) + logging.warning( + _('"{apkfilename}" is already installed on {dev}.').format( + apkfilename=apk, dev=dev + ) + ) else: - raise FDroidException(_("Failed to install '{apkfilename}' on {dev}: {error}") - .format(apkfilename=apk, dev=dev, error=fail)) + raise FDroidException( + _("Failed to install '{apkfilename}' on {dev}: {error}").format( + apkfilename=apk, dev=dev, error=fail + ) + ) logging.info('\n' + _('Finished')) diff --git a/pyproject.toml b/pyproject.toml index 9694d7be..e00ea8ba 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,7 +41,6 @@ force-exclude = '''( | fdroidserver/deploy\.py | fdroidserver/import_subcommand\.py | fdroidserver/index\.py - | fdroidserver/install\.py | fdroidserver/metadata\.py | fdroidserver/nightly\.py | fdroidserver/publish\.py From 261be201093246ccccfc567de5facf1ad9e8a528 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 4 Mar 2024 17:09:11 +0100 Subject: [PATCH 1396/2116] convert tests/testcommon.py to black code format --- pyproject.toml | 1 - tests/testcommon.py | 22 ++++++++-------------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e00ea8ba..a4b7ddbe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -52,7 +52,6 @@ force-exclude = '''( | tests/extra/manual-vmtools-test\.py | tests/gradle-release-checksums\.py | tests/openssl-version-check-test\.py - | tests/testcommon\.py | tests/valid-package-names/test\.py | tests/checkupdates\.TestCase | tests/common\.TestCase diff --git a/tests/testcommon.py b/tests/testcommon.py index 61c1a904..fe3728ba 100644 --- a/tests/testcommon.py +++ b/tests/testcommon.py @@ -20,10 +20,8 @@ import sys import tempfile -class TmpCwd(): - """Context-manager for temporarily changing the current working - directory. - """ +class TmpCwd: + """Context-manager for temporarily changing the current working directory.""" def __init__(self, new_cwd): self.new_cwd = new_cwd @@ -36,9 +34,8 @@ class TmpCwd(): os.chdir(self.orig_cwd) -class TmpPyPath(): - """Context-manager for temporarily adding a direcory to python path - """ +class TmpPyPath: + """Context-manager for temporarily adding a directory to Python path.""" def __init__(self, additional_path): self.additional_path = additional_path @@ -51,14 +48,11 @@ class TmpPyPath(): def mock_open_to_str(mock): - """ - helper function for accessing all data written into a - unittest.mock.mock_open() instance as a string. - """ + """For accessing all data written into a unittest.mock.mock_open() instance as a string.""" - return "".join([ - x.args[0] for x in mock.mock_calls if str(x).startswith("call().write(") - ]) + return "".join( + [x.args[0] for x in mock.mock_calls if str(x).startswith("call().write(")] + ) def mkdtemp(): From 074dda4b61abcdc781b9185bc746e1c6b257e608 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 26 Feb 2024 11:18:08 +0100 Subject: [PATCH 1397/2116] use tiny entry.jar rather than large index-v1.jar for net test case --- tests/net.TestCase | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/net.TestCase b/tests/net.TestCase index a53446bc..48844a40 100755 --- a/tests/net.TestCase +++ b/tests/net.TestCase @@ -39,10 +39,10 @@ class NetTest(unittest.TestCase): return MagicMock() requests_get.side_effect = _get - f = net.download_file('https://f-droid.org/repo/index-v1.jar', retries=0) + f = net.download_file('https://f-droid.org/repo/entry.jar', retries=0) self.assertTrue(requests_get.called) self.assertTrue(os.path.exists(f)) - self.assertEqual('tmp/index-v1.jar', f) + self.assertEqual('tmp/entry.jar', f) f = net.download_file( 'https://d-05.example.com/custom/com.downloader.aegis-3175421.apk?_fn=QVBLUHVyZV92My4xNy41NF9hcGtwdXJlLmNvbS5hcGs&_p=Y29tLmFwa3B1cmUuYWVnb24&am=6avvTpfJ1dMl9-K6JYKzQw&arg=downloader%3A%2F%2Fcampaign%2F%3Futm_medium%3Ddownloader%26utm_source%3Daegis&at=1652080635&k=1f6e58465df3a441665e585719ab0b13627a117f&r=https%3A%2F%2Fdownloader.com%2Fdownloader-app.html%3Ficn%3Daegis%26ici%3Dimage_qr&uu=http%3A%2F%2F172.16.82.1%2Fcustom%2Fcom.downloader.aegis-3175421.apk%3Fk%3D3fb9c4ae0be578206f6a1c330736fac1627a117f', From 7904f12d0578628b59420fea2543c0dbc1a57849 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 26 Feb 2024 11:46:08 +0100 Subject: [PATCH 1398/2116] net: add test of automatic retries in download_file() The existing logic from d1ddd525c in !1225 is confusing because it adds its own retry loop on top of the retry mechanism that is built into requests. So this test confirms that setting `download_file(retries=3)` actually results in more than three retries. --- fdroidserver/net.py | 14 +++++++-- tests/net.TestCase | 70 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 3 deletions(-) diff --git a/fdroidserver/net.py b/fdroidserver/net.py index cf01395a..49d67f2c 100644 --- a/fdroidserver/net.py +++ b/fdroidserver/net.py @@ -29,12 +29,20 @@ HEADERS = {'User-Agent': 'F-Droid'} def download_file(url, local_filename=None, dldir='tmp', retries=3, backoff_factor=0.1): + """Try hard to download the file, including retrying on failures. + + This has two retry cycles, one inside of the requests session, the + other provided by this function. The requests retry logic applies + to failed DNS lookups, socket connections and connection timeouts, + never to requests where data has made it to the server. This + handles ChunkedEncodingError during transfer in its own retry + loop. This can result in more retries than are specified in the + retries parameter. + + """ filename = urllib.parse.urlparse(url).path.split('/')[-1] if local_filename is None: local_filename = os.path.join(dldir, filename) - # Retry applies to failed DNS lookups, socket connections and connection - # timeouts, never to requests where data has made it to the server; so we - # handle ChunkedEncodingError during transfer ourselves. for i in range(retries + 1): if retries: max_retries = Retry(total=retries - i, backoff_factor=backoff_factor) diff --git a/tests/net.TestCase b/tests/net.TestCase index 48844a40..68c1c935 100755 --- a/tests/net.TestCase +++ b/tests/net.TestCase @@ -4,8 +4,13 @@ import inspect import logging import optparse import os +import random +import requests +import socket import sys import tempfile +import threading +import time import unittest from unittest.mock import MagicMock, patch @@ -20,6 +25,57 @@ from fdroidserver import common, net from pathlib import Path +class RetryServer: + """A stupid simple HTTP server that can fail to connect""" + + def __init__(self, port=None, failures=3): + self.port = port + if self.port is None: + self.port = random.randint(1024, 65535) + self.failures = failures + self.stop_event = threading.Event() + threading.Thread(target=self.run_fake_server).start() + + def stop(self): + self.stop_event.set() + + def run_fake_server(self): + server_sock = socket.socket() + server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + server_sock.bind(('127.0.0.1', self.port)) + server_sock.listen(5) + server_sock.settimeout(5) + time.sleep(0.001) # wait for it to start + + while not self.stop_event.is_set(): + self.failures -= 1 + conn = None + try: + conn, address = server_sock.accept() + conn.settimeout(5) + except TimeoutError: + break + if self.failures > 0: + conn.close() + continue + conn.recv(8192) # request ignored + self.reply = b"""HTTP/1.1 200 OK + Date: Mon, 26 Feb 2024 09:00:14 GMT + Connection: close + Content-Type: text/html + + Hello World! + """ + self.reply = self.reply.replace(b' ', b'') # dedent + conn.sendall(self.reply) + conn.shutdown(socket.SHUT_RDWR) + conn.close() + + self.stop_event.wait(timeout=1) + server_sock.shutdown(socket.SHUT_RDWR) + server_sock.close() + + class NetTest(unittest.TestCase): basedir = Path(__file__).resolve().parent @@ -52,6 +108,20 @@ class NetTest(unittest.TestCase): self.assertTrue(os.path.exists(f)) self.assertEqual('tmp/com.downloader.aegis-3175421.apk', f) + def test_download_file_retries(self): + server = RetryServer() + f = net.download_file('http://localhost:%d/f.txt' % server.port) + # strip the HTTP headers and compare the reply + self.assertEqual(server.reply.split(b'\n\n')[1], Path(f).read_bytes()) + server.stop() + + def test_download_file_retries_not_forever(self): + """The retry logic should eventually exit with an error.""" + server = RetryServer(failures=5) + with self.assertRaises(requests.exceptions.ConnectionError): + net.download_file('http://localhost:%d/f.txt' % server.port) + server.stop() + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 9749282b44709ab05928512306ac18ca390db374 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 27 Feb 2024 16:35:56 +0100 Subject: [PATCH 1399/2116] net: fix test_download_file_url_parsing self.assertTrue(requests_get.called) will always be true because .called will contain a MagicMock instance. --- tests/net.TestCase | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/net.TestCase b/tests/net.TestCase index 68c1c935..94b8ce84 100755 --- a/tests/net.TestCase +++ b/tests/net.TestCase @@ -96,7 +96,7 @@ class NetTest(unittest.TestCase): requests_get.side_effect = _get f = net.download_file('https://f-droid.org/repo/entry.jar', retries=0) - self.assertTrue(requests_get.called) + requests_get.assert_called() self.assertTrue(os.path.exists(f)) self.assertEqual('tmp/entry.jar', f) From cff3364fdf73a4858475a72f05a7d9536ee504cc Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 26 Feb 2024 18:45:05 +0100 Subject: [PATCH 1400/2116] split out mirrors data structure into standalone, tested function --- fdroidserver/common.py | 31 ++++++++++++++----------------- tests/common.TestCase | 22 ++++++++++++++++++++++ 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 38922cde..da5e72b0 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -486,14 +486,7 @@ def read_config(opts=None): fill_config_defaults(config) if 'serverwebroot' in config: - if isinstance(config['serverwebroot'], str): - roots = [{'url': config['serverwebroot']}] - elif all(isinstance(item, str) for item in config['serverwebroot']): - roots = [{'url': i} for i in config['serverwebroot']] - elif all(isinstance(item, dict) for item in config['serverwebroot']): - roots = config['serverwebroot'] - else: - raise TypeError(_('only accepts strings, lists, and tuples')) + roots = parse_mirrors_config(config['serverwebroot']) rootlist = [] for d in roots: # since this is used with rsync, where trailing slashes have @@ -506,15 +499,7 @@ def read_config(opts=None): config['serverwebroot'] = rootlist if 'servergitmirrors' in config: - if isinstance(config['servergitmirrors'], str): - roots = [{"url": config['servergitmirrors']}] - elif all(isinstance(item, str) for item in config['servergitmirrors']): - roots = [{'url': i} for i in config['servergitmirrors']] - elif all(isinstance(item, dict) for item in config['servergitmirrors']): - roots = config['servergitmirrors'] - else: - raise TypeError(_('only accepts strings, lists, and tuples')) - config['servergitmirrors'] = roots + config['servergitmirrors'] = parse_mirrors_config(config['servergitmirrors']) limit = config['git_mirror_size_limit'] config['git_mirror_size_limit'] = parse_human_readable_size(limit) @@ -557,6 +542,18 @@ def read_config(opts=None): return config +def parse_mirrors_config(mirrors): + """Mirrors can be specified as a string, list of strings, or dictionary map.""" + if isinstance(mirrors, str): + return [{"url": mirrors}] + elif all(isinstance(item, str) for item in mirrors): + return [{'url': i} for i in mirrors] + elif all(isinstance(item, dict) for item in mirrors): + return mirrors + else: + raise TypeError(_('only accepts strings, lists, and tuples')) + + def file_entry(filename, hash_value=None): meta = {} meta["name"] = "/" + filename.split("/", 1)[1] diff --git a/tests/common.TestCase b/tests/common.TestCase index 55202dcc..a92dc92a 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -12,6 +12,7 @@ import logging import optparse import os import re +import ruamel.yaml import shutil import subprocess import sys @@ -2892,6 +2893,27 @@ class CommonTest(unittest.TestCase): fdroidserver.common.read_config()['serverwebroot'], ) + def test_parse_mirrors_config_str(self): + s = 'foo@example.com:/var/www' + mirrors = ruamel.yaml.YAML(typ='safe').load("""'%s'""" % s) + self.assertEqual( + [{'url': s}], fdroidserver.common.parse_mirrors_config(mirrors) + ) + + def test_parse_mirrors_config_list(self): + s = 'foo@example.com:/var/www' + mirrors = ruamel.yaml.YAML(typ='safe').load("""- '%s'""" % s) + self.assertEqual( + [{'url': s}], fdroidserver.common.parse_mirrors_config(mirrors) + ) + + def test_parse_mirrors_config_dict(self): + s = 'foo@example.com:/var/www' + mirrors = ruamel.yaml.YAML(typ='safe').load("""- url: '%s'""" % s) + self.assertEqual( + [{'url': s}], fdroidserver.common.parse_mirrors_config(mirrors) + ) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 7b45ea78984bb13db9131910fe71f44296334b72 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 27 Feb 2024 20:27:32 +0100 Subject: [PATCH 1401/2116] gitlab-ci: always use HTTPS for apt repos This has been in place in a number of other places and has proven stable, so I'm introducing it here, since the "docker" job actually publishes docker images that are publicly used. So little painless security fixes are worthwhile. --- .gitlab-ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 866a2ec8..bcf2ac28 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -76,7 +76,13 @@ metadata_v0: 'Dpkg::Use-Pty "0";' 'quiet "1";' >> /etc/apt/apt.conf.d/99gitlab + # Ubuntu and other distros often lack https:// support + - grep Debian /etc/issue.net + && { find /etc/apt/sources.list* -type f | xargs sed -i s,http:,https:, ; } + - echo 'Acquire::https::Verify-Peer "false";' > /etc/apt/apt.conf.d/99nocacertificates - apt-get update + - apt-get install ca-certificates + - rm /etc/apt/apt.conf.d/99nocacertificates - apt-get dist-upgrade From 3560a2522a0eb6937bd8b3cb0b1a48714cc12c60 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 6 Mar 2024 14:50:24 +0100 Subject: [PATCH 1402/2116] gitlab-ci: docker:git has become stable, so switch to stable tag When this job was implemented, it needed the "git" tag. Now that it works, still with the stable tag. --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bcf2ac28..a72ad3dd 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -647,7 +647,7 @@ docker: - buildserver/* variables: - $CI_COMMIT_BRANCH == "master" || $CI_PROJECT_NAMESPACE != "fdroid" - image: docker:git + image: docker:dind services: - docker:dind variables: From a002e46997b30649d151be73d55df8714b376510 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Tue, 12 Mar 2024 07:57:11 +0000 Subject: [PATCH 1403/2116] scanner: update maven repo regex --- fdroidserver/scanner.py | 2 +- tests/gradle-maven-blocks.yaml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index c875b4ea..8c0a5d06 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -50,7 +50,7 @@ class MessageStore: errors: list = field(default_factory=list) -MAVEN_URL_REGEX = re.compile(r"""\smaven\s*(?:{.*?(?:setUrl|url)|\((?:url)?)\s*=?\s*(?:uri|Uri\.create\()?\(?\s*["']?([^\s"']+)["']?[^})]*[)}]""", +MAVEN_URL_REGEX = re.compile(r"""\smaven\s*(?:{.*?(?:setUrl|url)|\(\s*(?:url)?)\s*=?\s*(?:uri|URI|Uri\.create)?\(?\s*["']?([^\s"']+)["']?[^})]*[)}]""", re.DOTALL) diff --git a/tests/gradle-maven-blocks.yaml b/tests/gradle-maven-blocks.yaml index 886bb667..6db683f9 100644 --- a/tests/gradle-maven-blocks.yaml +++ b/tests/gradle-maven-blocks.yaml @@ -759,6 +759,7 @@ - ' maven { url ''libs'' }' - ' maven { url = uri("https://jitpack.io") }' - ' maven { url = uri("https://maven.fabric.io/public") }' +- ' maven { url = URI("https://jitpack.io") }' - ' maven { url MAVEN_REPO_CACHE }' - ' maven { url(''http://releases.marmeladburk.fidesmo.com/'') }' - ' maven {url "http://dl.bintray.com/tbruyelle/tbruyelle" }' @@ -778,3 +779,5 @@ - ' maven{url "https://plugins.gradle.org/m2/"}' - ' maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")' - ' maven(url = "https://maven.pkg.jetbrains.space/public/p/kotlinx-html/maven")' +- ' maven ( url = "https://jitpack.io")' +- ' maven( url = "https://oss.sonatype.org/content/repositories/snapshots/" )' From edb2d76e25a6f93457665694bd9cb46f201ef646 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 12 Mar 2024 21:47:38 +0100 Subject: [PATCH 1404/2116] Add unversioned whatsNew to index-v2 (Closes: #1202) copy_triple_t_store_metadata() can read the whatsNew from an unversioned release-notes.txt. For v2 copy this to the latest build. --- fdroidserver/index.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index f64b8806..72a11a5d 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -640,7 +640,15 @@ def convert_version(version, app, repodir): if version["versionCode"] > app["CurrentVersionCode"]: ver[RELEASECHANNELS_CONFIG_NAME] = ["Beta"] - for build in app.get('Builds', []): + builds = app.get("Builds", []) + + if len(builds) > 0 and version["versionCode"] == builds[-1]["versionCode"]: + if "localized" in app: + localized = {k: v["whatsNew"] for k, v in app["localized"].items() if "whatsNew" in v} + if localized: + ver["whatsNew"] = localized + + for build in builds: if build['versionCode'] == version['versionCode'] and "whatsNew" in build: ver["whatsNew"] = build["whatsNew"] break From 6d71690946aa1b236643e0ccc0220c8a6258db61 Mon Sep 17 00:00:00 2001 From: Sergey Zolotarev Date: Sat, 9 Mar 2024 00:51:31 +0600 Subject: [PATCH 1405/2116] Fix path splitting error on Windows --- fdroidserver/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index da5e72b0..093b56be 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -556,7 +556,7 @@ def parse_mirrors_config(mirrors): def file_entry(filename, hash_value=None): meta = {} - meta["name"] = "/" + filename.split("/", 1)[1] + meta["name"] = "/" + Path(filename).as_posix().split("/", 1)[1] meta["sha256"] = hash_value or common.sha256sum(filename) meta["size"] = os.stat(filename).st_size return meta From f30dcf50694862176fdb907175a3c1b8125ed08c Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Thu, 27 Jul 2023 10:39:11 +0300 Subject: [PATCH 1406/2116] Upgrade Buildserver VM to latest Debian (Bookworm) --- .gitlab-ci.yml | 12 ++++++------ buildserver/Dockerfile | 2 +- buildserver/Vagrantfile | 10 +++++++++- fdroidserver/checkupdates.py | 12 +++++------- 4 files changed, 21 insertions(+), 15 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a72ad3dd..53fde7bf 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -199,7 +199,7 @@ arch_pip_install: # The gradlew-fdroid tests are isolated from the rest of the test # suite, so they run as their own job. gradlew-fdroid: - image: debian:bullseye-slim + image: debian:bookworm-slim <<: *apt-template only: changes: @@ -371,7 +371,7 @@ macOS: gradle: - image: debian:bullseye + image: debian:bookworm-slim <<: *apt-template variables: GIT_DEPTH: 1000 @@ -469,7 +469,7 @@ fdroid build: # fdroiddata because that one is known to work, and this is a CI job, # so it should be isolated from the normal churn of fdroiddata. plugin_fetchsrclibs: - image: debian:bullseye + image: debian:bookworm-slim <<: *apt-template only: changes: @@ -513,7 +513,7 @@ plugin_fetchsrclibs: # test a full update and deploy cycle to gitlab.com servergitmirrors: - image: debian:bullseye-backports + image: debian:bookworm-slim <<: *apt-template only: - master@fdroid/fdroidserver @@ -534,7 +534,7 @@ servergitmirrors: python3-venv rsync wget - - apt-get install -t bullseye-backports apksigner + - apt-get install apksigner - python3 -m venv --system-site-packages env - . env/bin/activate - export PYTHONPATH=`pwd` @@ -557,7 +557,7 @@ servergitmirrors: - diff repo/index-v1.jar index-v1.jar Build documentation: - image: debian:bookworm + image: debian:bookworm-slim <<: *apt-template script: - apt-get install make python3-sphinx python3-numpydoc python3-pydata-sphinx-theme pydocstyle fdroidserver diff --git a/buildserver/Dockerfile b/buildserver/Dockerfile index 2da6d8a3..72693ae0 100644 --- a/buildserver/Dockerfile +++ b/buildserver/Dockerfile @@ -1,5 +1,5 @@ -FROM debian:bullseye +FROM debian:bookworm-slim ENV LANG=C.UTF-8 \ DEBIAN_FRONTEND=noninteractive diff --git a/buildserver/Vagrantfile b/buildserver/Vagrantfile index 3ba5f2b7..682c364c 100644 --- a/buildserver/Vagrantfile +++ b/buildserver/Vagrantfile @@ -35,7 +35,7 @@ Vagrant.configure("2") do |config| config.cache.enable :chef end - config.vm.box = "fdroid/bullseye64" + config.vm.box = "debian/bookworm64" if not configfile.has_key? "vm_provider" or configfile["vm_provider"] == "virtualbox" # default to VirtualBox if not set @@ -53,6 +53,8 @@ Vagrant.configure("2") do |config| libvirt.uri = "qemu:///system" libvirt.cpus = configfile["cpus"] libvirt.memory = configfile["memory"] + # Debian Vagrant image is only 20G, so allocate more + libvirt.machine_virtual_size = 1024 if configfile.has_key? "libvirt_disk_bus" libvirt.disk_bus = configfile["libvirt_disk_bus"] end @@ -86,6 +88,12 @@ Vagrant.configure("2") do |config| # necessary with 9p synced folders Dir.mkdir('cache') unless File.exists?('cache') + # Root partition needs to be resized to the new allocated space + config.vm.provision "shell", inline: <<-SHELL + growpart -v -u auto /dev/vda 1 + resize2fs /dev/vda1 + SHELL + config.vm.provision "shell", name: "setup-env-vars", path: "setup-env-vars", args: ["/opt/android-sdk"] config.vm.provision "shell", name: "apt-get-install", path: "provision-apt-get-install", diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 6aaaf117..f62c81fe 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -617,19 +617,17 @@ def checkupdates_app(app: metadata.App) -> None: if not gotcur: newbuilds = copy.deepcopy(builds[-len(vercodes):]) - bullseye_blocklist = [ - 'apt-get install -y openjdk-11-jdk', - 'apt-get install openjdk-11-jdk-headless', - 'apt-get install -y openjdk-11-jdk-headless', - 'apt-get install -t stretch-backports openjdk-11-jdk-headless openjdk-11-jre-headless', - 'apt-get install -y -t stretch-backports openjdk-11-jdk-headless openjdk-11-jre-headless', + bookworm_blocklist = [ + 'apt-get install -y openjdk-17-jdk', + 'apt-get install openjdk-17-jdk-headless', + 'apt-get install -y openjdk-17-jdk-headless', 'update-alternatives --auto java', ] for build in newbuilds: if "sudo" in build: if any("openjdk-11" in line for line in build["sudo"]): - build["sudo"] = [line for line in build["sudo"] if line not in bullseye_blocklist] + build["sudo"] = [line for line in build["sudo"] if line not in bookworm_blocklist] if build["sudo"] == ['apt-get update']: build["sudo"] = '' From d31856b6c7dd3f4eb6c68558ae428f8110cfd226 Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Thu, 27 Jul 2023 10:43:08 +0300 Subject: [PATCH 1407/2116] Upgrade Buildserver VM to latest Debian (Bookworm) --- buildserver/provision-apt-get-install | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index ef61234c..0d1128f5 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -39,28 +39,29 @@ if echo $debian_mirror | grep '^https' 2>&1 > /dev/null; then fi cat << EOF > /etc/apt/sources.list -deb ${debian_mirror} bullseye main -deb https://security.debian.org/debian-security bullseye-security main -deb ${debian_mirror} bullseye-updates main +deb ${debian_mirror} bookworm main +deb https://security.debian.org/debian-security bookworm-security main +deb ${debian_mirror} bookworm-updates main EOF -echo "deb ${debian_mirror} bullseye-backports main" > /etc/apt/sources.list.d/backports.list +echo "deb ${debian_mirror} bookworm-backports main" > /etc/apt/sources.list.d/backports.list apt-get update || apt-get update # purge things that might come from the base box, but we don't want # https://salsa.debian.org/cloud-team/debian-vagrant-images/-/tree/master/config_space/package_config # cat config_space/package_config/* | sort -u | grep -v '[A-Z#]' + purge=" apt-listchanges apt-utils bash-completion bind9-* bsdextrautils - build-essential bzip2 chrony cloud-utils cron + cron-daemon-common dbus debconf-i18n debian-faq @@ -69,6 +70,7 @@ purge=" fdisk file groff-base + inetutils-telnet krb5-locales less locales @@ -82,14 +84,13 @@ purge=" reportbug rsyslog tasksel - telnet traceroute unattended-upgrades + usr-is-merged vim-* wamerican wget whiptail - xxd xz-utils " # clean up files packages to be purged, then purge the packages @@ -106,6 +107,7 @@ packages=" apksigner default-jdk-headless default-jre-headless + curl dexdump fdroidserver git-svn @@ -116,6 +118,7 @@ packages=" rsync sdkmanager sudo + unzip " apt-get install $packages --download-only From 27206162d482a0d7d6cd22b1e84090ce358aa866 Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Thu, 27 Jul 2023 11:29:53 +0300 Subject: [PATCH 1408/2116] Upgrade Buildserver VM to latest Debian (Bookworm) --- buildserver/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildserver/Dockerfile b/buildserver/Dockerfile index 72693ae0..c9d27745 100644 --- a/buildserver/Dockerfile +++ b/buildserver/Dockerfile @@ -41,7 +41,7 @@ RUN printf "path-exclude=/usr/share/locale/*\npath-exclude=/usr/share/man/*\npat && mkdir -p /usr/share/man/man1 \ && apt-get update \ && apt-get install ca-certificates \ - && sed -i 's,http:,https:,' /etc/apt/sources.list \ + && sed -i 's,http:,https:,' /etc/apt/sources.list.d/debian.sources \ && apt-get upgrade \ && apt-get dist-upgrade \ && apt-get install openssh-client iproute2 python3 openssh-server sudo \ From 5733545972cb7909e55b6a8bcd64b9db30a26c7c Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Thu, 27 Jul 2023 14:01:02 +0300 Subject: [PATCH 1409/2116] fine tune purge --- buildserver/provision-apt-get-install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index 0d1128f5..89c6e2de 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -86,7 +86,7 @@ purge=" tasksel traceroute unattended-upgrades - usr-is-merged + usrmerge vim-* wamerican wget From 5dc327e86797910440bd0f5d5444cd4fc1ed85ce Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Mon, 31 Jul 2023 17:44:00 +0300 Subject: [PATCH 1410/2116] add missed file --- makebuildserver | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/makebuildserver b/makebuildserver index 39cbba06..24a6c6e8 100755 --- a/makebuildserver +++ b/makebuildserver @@ -47,35 +47,22 @@ logging.basicConfig(format=logformat, level=loglevel) tail = None -BASEBOX_DEFAULT = 'fdroid/bullseye64' -BASEBOX_VERSION_DEFAULT = "11.20221010.1" +BASEBOX_DEFAULT = 'debian/bookworm64' +BASEBOX_VERSION_DEFAULT = "12.20230723.1" BASEBOX_CHECKSUMS = { - "11.20221010.1": { + "12.20230723.1": { "libvirt": { - "box.img": "c2114aa276c176fa65b8072f5dcd1e8a6ab9f7d15fd5da791727a0164fd43254", + "box.img": "4a573e59ba75d03b65d1f907dc08f46cb258e8a6ba6adb32623db5bac53a19d9", "Vagrantfile": "f9c6fcbb47a4d0d33eb066859c8e87efd642287a638bd7da69a9e7a6f25fec47", - "metadata.json": "42b96a01106c25f3a222ddad0baead0b811cc64926f924fb836bbfa43580e646", + "metadata.json": "9d717678c19bb81d077e4e7eeb3602c168b6568cc38fee8fd3aa9d8f3cfe639b", }, "virtualbox": { - "box.ovf": "5e4de5f1f4b481b2c1917c0b2f6e6334f4741cc18c5b278e3bafb094535ff2cb", - "box.vmdk": "737053bc886037ae76bb38a1776eba2a5579d49423de990e93ef4a3f0cab4f1c", + "box.ovf": "f8fb68b3e188503595f15f0a61d77182aca23a463e6fdb2c3c5b89a84217fe76", + "box.vmdk": "5f593566116bd5da6ec3235069f8674ae34ecee7edf381557846ba7ce35d62c2", "Vagrantfile": "0bbc2ae97668d8da27ab97b766752dcd0bf9e41900e21057de15a58ee7fae47d", "metadata.json": "ffdaa989f2f6932cd8042e1102371f405cc7ad38e324210a1326192e4689e83a", } }, - '11.20220317.1': { - 'libvirt': { - 'box.img': 'fbde152a2f61d191983be9d1dbeae2591af32cca1ec27daa342485d97187515e', - 'metadata.json': '42b96a01106c25f3a222ddad0baead0b811cc64926f924fb836bbfa43580e646', - 'Vagrantfile': 'f9c6fcbb47a4d0d33eb066859c8e87efd642287a638bd7da69a9e7a6f25fec47', - }, - 'virtualbox': { - 'box.ovf': 'becd5cea2666d42e12def13a91766aa0d4b0e8e6f53102486c2a6cdb4e401b08', - 'box.vmdk': '49c96a58a3ee99681d348075864a290c60a8d334fddd21be453c825fcee75eda', - 'metadata.json': 'ffdaa989f2f6932cd8042e1102371f405cc7ad38e324210a1326192e4689e83a', - 'Vagrantfile': '0bbc2ae97668d8da27ab97b766752dcd0bf9e41900e21057de15a58ee7fae47d', - } - }, } configfile = 'buildserver/Vagrantfile.yaml' From 2fc9564ebed305d16494ac95f619df9f61b7bcf5 Mon Sep 17 00:00:00 2001 From: proletarius101 Date: Wed, 31 Jan 2024 22:29:17 +0800 Subject: [PATCH 1411/2116] use full base docker image --- buildserver/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildserver/Dockerfile b/buildserver/Dockerfile index c9d27745..3e863df5 100644 --- a/buildserver/Dockerfile +++ b/buildserver/Dockerfile @@ -1,5 +1,5 @@ -FROM debian:bookworm-slim +FROM debian:bookworm ENV LANG=C.UTF-8 \ DEBIAN_FRONTEND=noninteractive From cf74ca5f5605d1e9ced52ab1c4f3fdb9bf2e9ada Mon Sep 17 00:00:00 2001 From: proletarius101 Date: Wed, 31 Jan 2024 22:36:22 +0800 Subject: [PATCH 1412/2116] update docker image tag --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 53fde7bf..79eb1d45 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -658,7 +658,7 @@ docker: - cd buildserver - docker build -t $TEST_IMAGE --build-arg GIT_REV_PARSE_HEAD=$(git rev-parse HEAD) . - docker tag $TEST_IMAGE $RELEASE_IMAGE - - docker tag $TEST_IMAGE ${RELEASE_IMAGE}-bullseye + - docker tag $TEST_IMAGE ${RELEASE_IMAGE}-bookworm - echo $CI_JOB_TOKEN | docker login -u gitlab-ci-token --password-stdin registry.gitlab.com # This avoids filling up gitlab.com free tier accounts with unused docker images. - if test -z "$FDROID_PUSH_DOCKER_IMAGE"; then @@ -668,4 +668,4 @@ docker: exit 0; fi - docker push $RELEASE_IMAGE - - docker push $RELEASE_IMAGE-bullseye + - docker push $RELEASE_IMAGE-bookworm From a0a766cc8eeb423a87aaed03561fa513853a5aac Mon Sep 17 00:00:00 2001 From: proletarius101 Date: Wed, 31 Jan 2024 23:08:04 +0800 Subject: [PATCH 1413/2116] drop gradle support before 2.0 debian bullseye supports only Java 8+, which is compatible with gradle 2.0+: https://docs.gradle.org/current/userguide/compatibility.html --- gradlew-fdroid | 2 +- tests/test-gradlew-fdroid | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 65b50eb3..12319fb1 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -215,7 +215,7 @@ contains() { # (key) should accept. plugin versions are actually prefixes and catch sub- # versions as well. Pairs are taken from: # https://developer.android.com/studio/releases/gradle-plugin#updating-gradle -d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0 1.5 1.3 1.2 1.1 1.0 0.14 0.13 0.12 0.11 0.10 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2) +d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0) d_plugin_min_gradle_v=(8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about diff --git a/tests/test-gradlew-fdroid b/tests/test-gradlew-fdroid index 3d6d6016..b8c65360 100755 --- a/tests/test-gradlew-fdroid +++ b/tests/test-gradlew-fdroid @@ -56,7 +56,7 @@ run_test osmandapp/osmand 2.2.1 cd $tmpdir mkdir -p download_cache_test/gradle/wrapper cd download_cache_test -echo 'distributionUrl=https\://services.gradle.org/distributions/gradle-0.7-bin.zip' \ +echo 'distributionUrl=https\://services.gradle.org/distributions/gradle-2.0-bin.zip' \ > gradle/wrapper/gradle-wrapper.properties printf "task helloWorld {\n\tdoLast {\n\t\tprintln '$TEST_VALUE'\n\t}\n}" > build.gradle @@ -65,11 +65,11 @@ mkdir -p $GRADLE_VERSION_DIR unset https_proxy printf "download, unpack, and run: " -download_cache_test 0.7 +download_cache_test 2.0 printf "unpack and run: " -rm -rf $GRADLE_VERSION_DIR/0.7/ -download_cache_test 0.7 +rm -rf $GRADLE_VERSION_DIR/2.0/ +download_cache_test 2.0 printf "just run: " -download_cache_test 0.7 +download_cache_test 2.0 exit $exit_value From 0a3f785254f353a4de10f2629a59177ea0569f13 Mon Sep 17 00:00:00 2001 From: proletarius101 Date: Wed, 31 Jan 2024 23:32:34 +0800 Subject: [PATCH 1414/2116] drop gradle support before 7.3 debian bookworm supports only Java 17+, which is compatible with gradle 7.3+: https://docs.gradle.org/current/userguide/compatibility.html --- tests/test-gradlew-fdroid | 10 +++++----- .../com.anysoftkeyboard.languagepack.dutch.yml | 2 +- .../metadata/com.menny.android.anysoftkeyboard.yml | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/test-gradlew-fdroid b/tests/test-gradlew-fdroid index b8c65360..25ec5b0f 100755 --- a/tests/test-gradlew-fdroid +++ b/tests/test-gradlew-fdroid @@ -56,7 +56,7 @@ run_test osmandapp/osmand 2.2.1 cd $tmpdir mkdir -p download_cache_test/gradle/wrapper cd download_cache_test -echo 'distributionUrl=https\://services.gradle.org/distributions/gradle-2.0-bin.zip' \ +echo 'distributionUrl=https\://services.gradle.org/distributions/gradle-5.0-bin.zip' \ > gradle/wrapper/gradle-wrapper.properties printf "task helloWorld {\n\tdoLast {\n\t\tprintln '$TEST_VALUE'\n\t}\n}" > build.gradle @@ -65,11 +65,11 @@ mkdir -p $GRADLE_VERSION_DIR unset https_proxy printf "download, unpack, and run: " -download_cache_test 2.0 +download_cache_test 5.0 printf "unpack and run: " -rm -rf $GRADLE_VERSION_DIR/2.0/ -download_cache_test 2.0 +rm -rf $GRADLE_VERSION_DIR/5.0/ +download_cache_test 5.0 printf "just run: " -download_cache_test 2.0 +download_cache_test 5.0 exit $exit_value diff --git a/tests/triple-t-anysoftkeyboard/metadata/com.anysoftkeyboard.languagepack.dutch.yml b/tests/triple-t-anysoftkeyboard/metadata/com.anysoftkeyboard.languagepack.dutch.yml index 346f83c2..a61cf183 100644 --- a/tests/triple-t-anysoftkeyboard/metadata/com.anysoftkeyboard.languagepack.dutch.yml +++ b/tests/triple-t-anysoftkeyboard/metadata/com.anysoftkeyboard.languagepack.dutch.yml @@ -53,7 +53,7 @@ Builds: subdir: addons/languages/dutch sudo: - apt-get update || apt-get update - - apt-get install -t stretch-backports openjdk-11-jdk-headless openjdk-11-jre-headless + - apt-get install -t sid-backports openjdk-11-jdk-headless openjdk-11-jre-headless - update-alternatives --auto java gradle: - yes diff --git a/tests/triple-t-anysoftkeyboard/metadata/com.menny.android.anysoftkeyboard.yml b/tests/triple-t-anysoftkeyboard/metadata/com.menny.android.anysoftkeyboard.yml index 70a00573..765b65f1 100644 --- a/tests/triple-t-anysoftkeyboard/metadata/com.menny.android.anysoftkeyboard.yml +++ b/tests/triple-t-anysoftkeyboard/metadata/com.menny.android.anysoftkeyboard.yml @@ -499,7 +499,7 @@ Builds: subdir: ime/app sudo: - apt-get update || apt-get update - - apt-get install -t stretch-backports openjdk-11-jdk-headless openjdk-11-jre-headless + - apt-get install -t sid-backports openjdk-11-jdk-headless openjdk-11-jre-headless - update-alternatives --auto java gradle: - yes From 1bd35fc37f6953e231a00aa77e38d50aa4e3f700 Mon Sep 17 00:00:00 2001 From: proletarius101 Date: Wed, 31 Jan 2024 23:39:19 +0800 Subject: [PATCH 1415/2116] upgrade basebox to 12.20231211.1 --- makebuildserver | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/makebuildserver b/makebuildserver index 24a6c6e8..bdeca683 100755 --- a/makebuildserver +++ b/makebuildserver @@ -48,17 +48,17 @@ logging.basicConfig(format=logformat, level=loglevel) tail = None BASEBOX_DEFAULT = 'debian/bookworm64' -BASEBOX_VERSION_DEFAULT = "12.20230723.1" +BASEBOX_VERSION_DEFAULT = "12.20231211.1" BASEBOX_CHECKSUMS = { - "12.20230723.1": { + "12.20231211.1": { "libvirt": { - "box.img": "4a573e59ba75d03b65d1f907dc08f46cb258e8a6ba6adb32623db5bac53a19d9", + "box.img": "80b048312c423b7fbbbac934c348f9a29bdf2f98fae96dd13b3af70ddfe7f12a", "Vagrantfile": "f9c6fcbb47a4d0d33eb066859c8e87efd642287a638bd7da69a9e7a6f25fec47", "metadata.json": "9d717678c19bb81d077e4e7eeb3602c168b6568cc38fee8fd3aa9d8f3cfe639b", }, "virtualbox": { - "box.ovf": "f8fb68b3e188503595f15f0a61d77182aca23a463e6fdb2c3c5b89a84217fe76", - "box.vmdk": "5f593566116bd5da6ec3235069f8674ae34ecee7edf381557846ba7ce35d62c2", + "box.ovf": "8ad49ba600fbd1027e35c8fd41d37383c04bad30fdbafa860a29911d207a3e7b", + "box.vmdk": "57602a776860805e82bd3f61cdca9711f39781011db0f8f1dee9b2a614b2c889", "Vagrantfile": "0bbc2ae97668d8da27ab97b766752dcd0bf9e41900e21057de15a58ee7fae47d", "metadata.json": "ffdaa989f2f6932cd8042e1102371f405cc7ad38e324210a1326192e4689e83a", } From f2bdf5214a1ba3ef2995cb854898c9b49af0279f Mon Sep 17 00:00:00 2001 From: proletarius101 Date: Thu, 1 Feb 2024 11:41:27 +0800 Subject: [PATCH 1416/2116] install openjdk 11 from bullseye repo instead in the test cases --- .../metadata/com.anysoftkeyboard.languagepack.dutch.yml | 2 +- .../metadata/com.menny.android.anysoftkeyboard.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/triple-t-anysoftkeyboard/metadata/com.anysoftkeyboard.languagepack.dutch.yml b/tests/triple-t-anysoftkeyboard/metadata/com.anysoftkeyboard.languagepack.dutch.yml index a61cf183..707bb096 100644 --- a/tests/triple-t-anysoftkeyboard/metadata/com.anysoftkeyboard.languagepack.dutch.yml +++ b/tests/triple-t-anysoftkeyboard/metadata/com.anysoftkeyboard.languagepack.dutch.yml @@ -53,7 +53,7 @@ Builds: subdir: addons/languages/dutch sudo: - apt-get update || apt-get update - - apt-get install -t sid-backports openjdk-11-jdk-headless openjdk-11-jre-headless + - apt-get install -t bullseye openjdk-11-jdk-headless openjdk-11-jre-headless - update-alternatives --auto java gradle: - yes diff --git a/tests/triple-t-anysoftkeyboard/metadata/com.menny.android.anysoftkeyboard.yml b/tests/triple-t-anysoftkeyboard/metadata/com.menny.android.anysoftkeyboard.yml index 765b65f1..4dc8d7ac 100644 --- a/tests/triple-t-anysoftkeyboard/metadata/com.menny.android.anysoftkeyboard.yml +++ b/tests/triple-t-anysoftkeyboard/metadata/com.menny.android.anysoftkeyboard.yml @@ -499,7 +499,7 @@ Builds: subdir: ime/app sudo: - apt-get update || apt-get update - - apt-get install -t sid-backports openjdk-11-jdk-headless openjdk-11-jre-headless + - apt-get install -t bullseye openjdk-11-jdk-headless openjdk-11-jre-headless - update-alternatives --auto java gradle: - yes From b20a14af097b777b2a72c8154996709c5cf0936d Mon Sep 17 00:00:00 2001 From: proletarius101 Date: Thu, 1 Feb 2024 12:24:26 +0800 Subject: [PATCH 1417/2116] fix unnecessary or invalid openjdk installation scripts --- fdroidserver/checkupdates.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index f62c81fe..c7af23b3 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -617,7 +617,13 @@ def checkupdates_app(app: metadata.App) -> None: if not gotcur: newbuilds = copy.deepcopy(builds[-len(vercodes):]) + # These are either built-in or invalid in newer system versions bookworm_blocklist = [ + 'apt-get install -y openjdk-11-jdk', + 'apt-get install openjdk-11-jdk-headless', + 'apt-get install -y openjdk-11-jdk-headless', + 'apt-get install -t stretch-backports openjdk-11-jdk-headless openjdk-11-jre-headless', + 'apt-get install -y -t stretch-backports openjdk-11-jdk-headless openjdk-11-jre-headless', 'apt-get install -y openjdk-17-jdk', 'apt-get install openjdk-17-jdk-headless', 'apt-get install -y openjdk-17-jdk-headless', @@ -626,7 +632,7 @@ def checkupdates_app(app: metadata.App) -> None: for build in newbuilds: if "sudo" in build: - if any("openjdk-11" in line for line in build["sudo"]): + if any("openjdk-11" in line for line in build["sudo"]) or any("openjdk-17" in line for line in build["sudo"]): build["sudo"] = [line for line in build["sudo"] if line not in bookworm_blocklist] if build["sudo"] == ['apt-get update']: build["sudo"] = '' From ac4694fcd30cb300337fece2b7c80e844d51d9cc Mon Sep 17 00:00:00 2001 From: proletarius101 Date: Thu, 1 Feb 2024 12:33:22 +0800 Subject: [PATCH 1418/2116] fix `Could not initialize class org.codehaus.groovy.runtime.InvokerHelper` https://gitlab.com/proletarius101/fdroidserver/-/jobs/6068794117#L547 --- tests/test-gradlew-fdroid | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test-gradlew-fdroid b/tests/test-gradlew-fdroid index 25ec5b0f..26d9bf5b 100755 --- a/tests/test-gradlew-fdroid +++ b/tests/test-gradlew-fdroid @@ -56,7 +56,7 @@ run_test osmandapp/osmand 2.2.1 cd $tmpdir mkdir -p download_cache_test/gradle/wrapper cd download_cache_test -echo 'distributionUrl=https\://services.gradle.org/distributions/gradle-5.0-bin.zip' \ +echo 'distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip' \ > gradle/wrapper/gradle-wrapper.properties printf "task helloWorld {\n\tdoLast {\n\t\tprintln '$TEST_VALUE'\n\t}\n}" > build.gradle @@ -65,11 +65,11 @@ mkdir -p $GRADLE_VERSION_DIR unset https_proxy printf "download, unpack, and run: " -download_cache_test 5.0 +download_cache_test 7.3 printf "unpack and run: " -rm -rf $GRADLE_VERSION_DIR/5.0/ -download_cache_test 5.0 +rm -rf $GRADLE_VERSION_DIR/7.3/ +download_cache_test 7.3 printf "just run: " -download_cache_test 5.0 +download_cache_test 7.3 exit $exit_value From 6781525ddd4932357c9f834538f13c0738895064 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 13 Mar 2024 21:05:04 +0100 Subject: [PATCH 1419/2116] use appdirs to get easy cross-platform standard directories This is more important to get right now, with `fdroid install`, which should work easily on all platforms. --- fdroidserver/common.py | 18 +++++++++++++++++- setup.py | 1 + 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 093b56be..87010370 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -134,11 +134,27 @@ env = None orig_path = None +def get_default_cachedir(): + """Get a cachedir, using appdirs for cross-platform, but works without. + + Once appdirs is installed everywhere, this function can be + removed. + + """ + appname = __name__.split('.')[0] + try: + import appdirs + + return appdirs.user_cache_dir(appname, 'F-Droid') + except ImportError: + return str(Path.home() / '.cache' / appname) + + # All paths in the config must be strings, never pathlib.Path instances default_config = { 'sdk_path': "$ANDROID_HOME", 'ndk_paths': {}, - 'cachedir': str(Path.home() / '.cache/fdroidserver'), + 'cachedir': get_default_cachedir(), 'java_paths': None, 'scan_binary': False, 'ant': "ant", diff --git a/setup.py b/setup.py index afff96b4..01d0d66a 100755 --- a/setup.py +++ b/setup.py @@ -91,6 +91,7 @@ setup( 'babel', ], install_requires=[ + 'appdirs', 'androguard >= 3.1.0, != 3.3.0, != 3.3.1, != 3.3.2, <4', 'clint', 'defusedxml', From 082df1d9b6bbded28266e2158da4d95e3887d224 Mon Sep 17 00:00:00 2001 From: linsui Date: Thu, 14 Mar 2024 21:44:32 +0800 Subject: [PATCH 1420/2116] checkupdates: add a bookworm blocklist item --- fdroidserver/checkupdates.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index c7af23b3..aa41e5b7 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -628,6 +628,7 @@ def checkupdates_app(app: metadata.App) -> None: 'apt-get install openjdk-17-jdk-headless', 'apt-get install -y openjdk-17-jdk-headless', 'update-alternatives --auto java', + 'update-java-alternatives -a', ] for build in newbuilds: From 1f28fce1ea8c26041663a0174f9d2c92a57e8ada Mon Sep 17 00:00:00 2001 From: linsui Date: Sun, 24 Mar 2024 20:03:49 +0800 Subject: [PATCH 1421/2116] gradle 8.7 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 12319fb1..ec078431 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -199,6 +199,7 @@ get_sha() { '8.4') echo '3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae' ;; '8.5') echo '9d926787066a081739e8200858338b4a69e837c3a821a33aca9db09dd4a41026' ;; '8.6') echo '9631d53cf3e74bfa726893aee1f8994fee4e060c401335946dba2156f440f24c' ;; + '8.7') echo '544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d' ;; *) exit 1 esac } @@ -219,7 +220,7 @@ d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 d_plugin_min_gradle_v=(8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From e269e41b122feab2d20c45f2599e89dc4d5f1e39 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 12 Mar 2024 08:42:42 +0100 Subject: [PATCH 1422/2116] publish: --error-on-failed to exit when signing/verifying fails Since we have limited visibility into @CiaranG's signing server, it is hard to make changes to the publishing process, especially ones that might break @CiaranG's automation. So `fdroid publish` mostly reports success by moving an APK from unsigned/ to repo/. In some cases, we want immediate failure, like in CI. So this adds `--error-on-failed` for that purpose. --- fdroidserver/publish.py | 26 +++++++++++++ tests/publish.TestCase | 85 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+) diff --git a/fdroidserver/publish.py b/fdroidserver/publish.py index 07b9c7b7..b87578ad 100644 --- a/fdroidserver/publish.py +++ b/fdroidserver/publish.py @@ -18,6 +18,16 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +"""Sign APKs using keys or via reproducible builds signature copying. + +This command takes unsigned APKs and signs them. It looks for +unsigned APKs in the unsigned/ directory and puts successfully signed +APKs into the repo/ directory. The default is to run in a kind of +batch mode, where it will only quit on certain kinds of errors. It +mostly reports success by moving an APK from unsigned/ to repo/ + +""" + import sys import os import re @@ -266,6 +276,13 @@ def main(): usage="%(prog)s [options] " "[APPID[:VERCODE] [APPID[:VERCODE] ...]]" ) common.setup_global_opts(parser) + parser.add_argument( + "-e", + "--error-on-failed", + action="store_true", + default=False, + help=_("When signing or verifying fails, exit with an error code."), + ) parser.add_argument( "appid", nargs='*', @@ -322,6 +339,7 @@ def main(): ).format(len(allapps), len(allaliases)) ) + failed = 0 # Process any APKs or ZIPs that are waiting to be signed... for apkfile in sorted( glob.glob(os.path.join(unsigned_dir, '*.apk')) @@ -364,12 +382,14 @@ def main(): if not os.path.isfile(srcapk): logging.error("...reference binary missing - publish skipped: " "'{refpath}'".format(refpath=srcapk)) + failed += 1 else: # Compare our unsigned one with the downloaded one... compare_result = common.verify_apks(srcapk, apkfile, tmp_dir) if compare_result: logging.error("...verification failed - publish skipped : " "{result}".format(result=compare_result)) + failed += 1 else: # Success! So move the downloaded file to the repo, and remove # our built version. @@ -415,6 +435,7 @@ def main(): os.remove(devsignedtmp) logging.error('...verification failed - skipping: %s', devsigned) skipsigning = True + failed += 1 # Now we sign with the F-Droid key. if not skipsigning: @@ -444,6 +465,11 @@ def main(): status_update_json(generated_keys, signed_apks) logging.info('published list signing-key fingerprints') + if failed: + logging.error(_('%d APKs failed to be signed or verified!') % failed) + if options.error_on_failed: + sys.exit(failed) + if __name__ == "__main__": main() diff --git a/tests/publish.TestCase b/tests/publish.TestCase index 7542c5f7..80556744 100755 --- a/tests/publish.TestCase +++ b/tests/publish.TestCase @@ -324,6 +324,91 @@ class PublishTest(unittest.TestCase): self.assertFalse(os.path.exists(unsigned)) self.assertTrue(os.path.exists(signed)) + def test_exit_on_error(self): + """Exits properly on errors, with and without --error-on-failed. + + `fdroid publish` runs on the signing server and does large + batches. In that case, it shouldn't exit after a single + failure since it should try to complete the whole batch. For + CI and other use cases, there is --error-on-failed to force it + to exit after a failure. + + """ + + class Options: + error_on_failed = True + verbose = False + + os.chdir(self.testdir) + + config = common.read_config(Options) + if 'apksigner' not in config: + self.skipTest('SKIPPING test_error_on_failed, apksigner not installed!') + config['repo_keyalias'] = 'sova' + config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' + config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' + shutil.copy(os.path.join(self.basedir, 'keystore.jks'), self.testdir) + config['keystore'] = 'keystore.jks' + config[ + 'keydname' + ] = 'CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US' + publish.config = config + common.config = config + + app = metadata.App() + app.id = 'org.fdroid.ci' + versionCode = 1 + build = metadata.Build( + { + 'versionCode': versionCode, + 'versionName': '1.0', + } + ) + app.Builds = [build] + os.mkdir('metadata') + metadata.write_metadata(os.path.join('metadata', '%s.yml' % app.id), app) + + os.mkdir('unsigned') + testapk = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') + unsigned = os.path.join('unsigned', common.get_release_filename(app, build)) + signed = os.path.join('repo', common.get_release_filename(app, build)) + shutil.copy(testapk, unsigned) + + # sign the unsigned APK + self.assertTrue(os.path.exists(unsigned)) + self.assertFalse(os.path.exists(signed)) + with mock.patch( + 'sys.argv', ['fdroid publish', '%s:%d' % (app.id, versionCode)] + ): + publish.main() + self.assertFalse(os.path.exists(unsigned)) + self.assertTrue(os.path.exists(signed)) + + with mock.patch('sys.argv', ['fdroid signatures', signed]): + signatures.main() + mf = os.path.join('metadata', 'org.fdroid.ci', 'signatures', '1', 'MANIFEST.MF') + self.assertTrue(os.path.exists(mf)) + os.remove(signed) + + with open(mf, 'a') as fp: + fp.write('appended to break signature') + + # implant the signature into the unsigned APK + shutil.copy(testapk, unsigned) + self.assertTrue(os.path.exists(unsigned)) + self.assertFalse(os.path.exists(signed)) + apk_id = '%s:%d' % (app.id, versionCode) + + # by default, it should complete without exiting + with mock.patch('sys.argv', ['fdroid publish', apk_id]): + publish.main() + + # --error-on-failed should make it exit + with mock.patch('sys.argv', ['fdroid publish', '--error-on-failed', apk_id]): + with self.assertRaises(SystemExit) as e: + publish.main() + self.assertEqual(e.exception.code, 1) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 9c65bed4a57614db4511ffe8276671a5789c84d4 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 1 Apr 2024 12:40:14 +0200 Subject: [PATCH 1423/2116] check for This adds a check for "testOnly" to the existing "debuggable" check, since they are very similar. We should really be refactoring all the checks into a more reasonable setup. Since "debuggable" and "testOnly" are both set in the same place (`` in _AndroidManifest.xml_) and are both set by the same process (running debug builds), I thought it would be OK to include both in the same place. Plus it was a one-line change. --- fdroidserver/build.py | 6 ++++-- fdroidserver/common.py | 11 +++++++---- fdroidserver/update.py | 6 ++++-- tests/build.TestCase | 10 ++++++---- tests/common.TestCase | 6 +++--- tests/scanner.TestCase | 3 ++- 6 files changed, 26 insertions(+), 16 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 63479af1..84f19ed5 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -720,8 +720,10 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext f"{app.id}:{build.versionName}", p.output) # Make sure it's not debuggable... - if common.is_apk_and_debuggable(src): - raise BuildException("APK is debuggable") + if common.is_debuggable_or_testOnly(src): + raise BuildException( + "%s: debuggable or testOnly set in AndroidManifest.xml" % src + ) # By way of a sanity check, make sure the version and version # code in our new APK match what we expect... diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 87010370..66dd106e 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2677,10 +2677,13 @@ def ensure_final_value(packageName, arsc, value): return '' -def is_apk_and_debuggable(apkfile): - """Return True if the given file is an APK and is debuggable. +def is_debuggable_or_testOnly(apkfile): + """Return True if the given file is an APK and is debuggable or testOnly. - Parse only from the APK. + These two settings should never be enabled in release builds. This + parses + from the APK and nothing else to run fast, since it is run on + every APK as part of update. Parameters ---------- @@ -2699,7 +2702,7 @@ def is_apk_and_debuggable(apkfile): if _type == START_TAG and axml.getName() == 'application': for i in range(0, axml.getAttributeCount()): name = axml.getAttributeName(i) - if name == 'debuggable': + if name in ('debuggable', 'testOnly'): _type = axml.getAttributeValueType(i) _data = axml.getAttributeValueData(i) value = format_value(_type, _data, lambda _: axml.getAttributeValue(i)) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 26e248d5..eaf1bb8b 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1616,8 +1616,10 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal return True, None, False # Check for debuggable apks... - if common.is_apk_and_debuggable(apkfile): - logging.warning('{0} is set to android:debuggable="true"'.format(apkfile)) + if common.is_debuggable_or_testOnly(apkfile): + logging.warning( + "%s: debuggable or testOnly set in AndroidManifest.xml" % apkfile + ) if options.rename_apks: n = apk['packageName'] + '_' + str(apk['versionCode']) + '.apk' diff --git a/tests/build.TestCase b/tests/build.TestCase index cce6a424..6a4ddb02 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -221,7 +221,7 @@ class BuildTest(unittest.TestCase): @mock.patch('fdroidserver.common.get_apk_id') @mock.patch('fdroidserver.build.FDroidPopen') - @mock.patch('fdroidserver.common.is_apk_and_debuggable', lambda f: False) + @mock.patch('fdroidserver.common.is_debuggable_or_testOnly', lambda f: False) @mock.patch('fdroidserver.common.get_native_code', lambda f: 'x86') def test_build_local_maven(self, fake_FDroidPopen, fake_get_apk_id): """Test build_local() with a maven project""" @@ -342,7 +342,8 @@ class BuildTest(unittest.TestCase): 'fdroidserver.common.sha256sum', return_value='ad7ce5467e18d40050dc51b8e7affc3e635c85bd8c59be62de32352328ed467e', ) as _ignored, mock.patch( - 'fdroidserver.common.is_apk_and_debuggable', return_value=False + 'fdroidserver.common.is_debuggable_or_testOnly', + return_value=False, ) as _ignored, mock.patch( 'fdroidserver.build.FDroidPopen', FakeProcess ) as _ignored, mock.patch( @@ -394,7 +395,7 @@ class BuildTest(unittest.TestCase): @mock.patch('sdkmanager.build_package_list', lambda use_net: None) @mock.patch('fdroidserver.build.FDroidPopen', FakeProcess) @mock.patch('fdroidserver.common.get_native_code', lambda _ignored: 'x86') - @mock.patch('fdroidserver.common.is_apk_and_debuggable', lambda _ignored: False) + @mock.patch('fdroidserver.common.is_debuggable_or_testOnly', lambda _ignored: False) @mock.patch( 'fdroidserver.common.sha256sum', lambda f: 'ad7ce5467e18d40050dc51b8e7affc3e635c85bd8c59be62de32352328ed467e', @@ -531,7 +532,8 @@ class BuildTest(unittest.TestCase): return_value=(app.id, build.versionCode, build.versionName), ): with mock.patch( - 'fdroidserver.common.is_apk_and_debuggable', return_value=False + 'fdroidserver.common.is_debuggable_or_testOnly', + return_value=False, ): fdroidserver.build.build_local( app, diff --git a/tests/common.TestCase b/tests/common.TestCase index a92dc92a..543e8eb6 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -185,7 +185,7 @@ class CommonTest(unittest.TestCase): fdroidserver.common._add_java_paths_to_config(pathlist, config) self.assertEqual(config['java_paths']['8'], choice[1:]) - def test_is_apk_and_debuggable(self): + def test_is_debuggable_or_testOnly(self): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config @@ -197,7 +197,7 @@ class CommonTest(unittest.TestCase): testfiles.append(os.path.join(self.basedir, 'urzip-badcert.apk')) for apkfile in testfiles: self.assertTrue( - fdroidserver.common.is_apk_and_debuggable(apkfile), + fdroidserver.common.is_debuggable_or_testOnly(apkfile), "debuggable APK state was not properly parsed!", ) @@ -208,7 +208,7 @@ class CommonTest(unittest.TestCase): testfiles.append(os.path.join(self.basedir, 'v2.only.sig_2.apk')) for apkfile in testfiles: self.assertFalse( - fdroidserver.common.is_apk_and_debuggable(apkfile), + fdroidserver.common.is_debuggable_or_testOnly(apkfile), "debuggable APK state was not properly parsed!", ) diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index aba95323..83ce75b7 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -276,7 +276,8 @@ class ScannerTest(unittest.TestCase): return_value=(app.id, build.versionCode, build.versionName), ): with mock.patch( - 'fdroidserver.common.is_apk_and_debuggable', return_value=False + 'fdroidserver.common.is_debuggable_or_testOnly', + return_value=False, ): fdroidserver.build.build_local( app, From be673c56cfa213aec74cb7eb7dd02dfdad7ad2d3 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 19 Mar 2024 09:57:16 -0300 Subject: [PATCH 1424/2116] Use fdroid.link for nightly README --- fdroidserver/nightly.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 2d0b2325..400ad0ba 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -306,7 +306,10 @@ def main(): readme = ''' # {repo_git_base} -[![{repo_url}]({repo_url}/icons/icon.png)]({repo_url}) +This is an app repository for nightly versions. +You can use it with the [F-Droid](https://f-droid.org/) Android app. + +[![{repo_url}]({repo_url}/icons/icon.png)](https://fdroid.link/#{repo_url}) Last updated: {date}'''.format(repo_git_base=repo_git_base, repo_url=repo_url, From faf109021413e2d34eed083a119a01fd381fe067 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 19 Mar 2024 10:00:35 -0300 Subject: [PATCH 1425/2116] Use fdroid.link for repo index page --- fdroidserver/index.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 72a11a5d..69237149 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -195,10 +195,10 @@ def make_website(apps, repodir, repodict): {number_of_apps} - apps. To add it to your F-Droid client, scan the QR code (click it to enlarge) or use this URL: + apps. To add it to your F-Droid app, scan the QR code (click it to enlarge) or use this link:

    - + {link} From c1500e4ca1d98d2139d04370f53f42248202093a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Tue, 9 Jan 2024 09:21:19 +0100 Subject: [PATCH 1426/2116] =?UTF-8?q?=F0=9F=97=A8=20iOS=20text=20metadata?= =?UTF-8?q?=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change adds basic i18n support for parsing iOS fastlane metadata. Currently supported: * name * subtitle (summary) * description --- fdroidserver/update.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index eaf1bb8b..1d204090 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -34,6 +34,7 @@ import json import time import yaml import copy +import pathlib import defusedxml.ElementTree as ElementTree from datetime import datetime, timezone from argparse import ArgumentParser @@ -1208,6 +1209,36 @@ def insert_localized_app_metadata(apps): logging.warning(_('Unsupported graphics file found: {path}').format(path=f)) +LANG_CODE = re.compile(r'^[a-z]{2}([-_][A-Z][a-zA-Z]{1,3})?$') + + +FASTLANE_IOS_MAP = { + "name.txt": 'name', + "subtitle.txt": 'summary', + "description.txt": 'description', +} + + +def insert_localized_ios_app_metadata(apps_with_packages): + + for package_name, app in apps_with_packages.items(): + if not any(pathlib.Path('repo').glob(f'{package_name}*.ipa')): + # couldn't find any IPA files for this package_name + # so we don't have to look for fastlane data + continue + + fastlane_dir = pathlib.Path('build', package_name, 'fastlane') + + for lang_dir in (fastlane_dir / 'metadata').iterdir(): + lang_code = lang_dir.name + m = LANG_CODE.match(lang_code) + if m: + for metadata_file in (lang_dir).iterdir(): + key = FASTLANE_IOS_MAP.get(metadata_file.name) + if key: + _set_localized_text_entry(app, lang_code, key, metadata_file) + + def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False): """Scan a repo for all files with an extension except APK/OBB/IPA. @@ -2240,6 +2271,7 @@ def prepare_apps(apps, apks, repodir): translate_per_build_anti_features(apps_with_packages, apks) if repodir == 'repo': insert_localized_app_metadata(apps_with_packages) + insert_localized_ios_app_metadata(apps_with_packages) insert_missing_app_names_from_apks(apps_with_packages, apks) return apps_with_packages From c166a8a2b7deea20e85137c8065d166a5041add2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Fri, 2 Feb 2024 14:08:27 +0100 Subject: [PATCH 1427/2116] =?UTF-8?q?=F0=9F=AA=84=20split=20screenshot=20i?= =?UTF-8?q?ngestion=20into=20separate=20function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fdroidserver/update.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 1d204090..ab94f62e 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1149,6 +1149,8 @@ def insert_localized_app_metadata(apps): os.makedirs(screenshotdestdir, mode=0o755, exist_ok=True) _strip_and_copy_image(f, screenshotdestdir) + +def ingest_screenshots_from_repo_dir(apps): repodirs = sorted(glob.glob(os.path.join('repo', '[A-Za-z]*', '[a-z][a-z]*'))) for d in repodirs: if not os.path.isdir(d): @@ -2272,6 +2274,7 @@ def prepare_apps(apps, apks, repodir): if repodir == 'repo': insert_localized_app_metadata(apps_with_packages) insert_localized_ios_app_metadata(apps_with_packages) + ingest_screenshots_from_repo_dir(apps_with_packages) insert_missing_app_names_from_apks(apps_with_packages, apks) return apps_with_packages From 293caf5ff93f9480346e4c93c5e74df324e718af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Mon, 12 Feb 2024 00:55:16 +0100 Subject: [PATCH 1428/2116] =?UTF-8?q?=F0=9F=AA=AA=20iOS=20fastlane=20scree?= =?UTF-8?q?nshot=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fdroidserver/update.py | 53 ++++++++++++++++++++++++++++++++++++++++++ tests/update.TestCase | 2 ++ 2 files changed, 55 insertions(+) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index ab94f62e..8839c531 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1137,6 +1137,9 @@ def insert_localized_app_metadata(apps): if base not in apps[packageName] or not isinstance(apps[packageName][base], collections.OrderedDict): apps[packageName][base] = collections.OrderedDict() apps[packageName][base][locale] = common.file_entry(dst) + + # copy screenshots from local source code checkout into wellknown + # location in repo directory for d in dirs: if d in SCREENSHOT_DIRS: if locale == 'images': @@ -1221,8 +1224,33 @@ FASTLANE_IOS_MAP = { } +def parse_ios_screenshot_name(path): + """ + Infer type info from screenshot file name. + + Device type/name is part of the file name of iOS fastlane screenshots. + Here are some example: + * 'iPhone 8+ @ iOS 16-1.png' + * 'iPad Pro 12.9" 2gen @ iOS 16-1.png' + * '1_ipadPro129_1.1.png' + * '1_iphone6Plus_1.1.png' + """ + s = path.stem.split('@') + if len(s) >= 2: + if "iphone" in s[0].lower(): + return ("phoneScreenshots", '@'.join(s[1:])) + elif "ipad" in s[0].lower(): + return ("tenInchScreenshots", "@".join(s[1:])) + else: + return ('phoneScreenshots', s[0]) + + def insert_localized_ios_app_metadata(apps_with_packages): + if not any(pathlib.Path('repo').glob('*.ipa')): + # no IPA files present in repo, nothing to do here, exiting early + return + for package_name, app in apps_with_packages.items(): if not any(pathlib.Path('repo').glob(f'{package_name}*.ipa')): # couldn't find any IPA files for this package_name @@ -1240,6 +1268,31 @@ def insert_localized_ios_app_metadata(apps_with_packages): if key: _set_localized_text_entry(app, lang_code, key, metadata_file) + # discover available screenshots and put findings in a dict + screenshots = {} + for lang_sdir in (fastlane_dir / 'screenshots').iterdir(): + lang_code = lang_sdir.name + m = LANG_CODE.match(lang_code) + if m: + screenshots[lang_code] = {} + for screenshot in (lang_sdir).iterdir(): + if screenshot.suffix[1:] in ALLOWED_EXTENSIONS: + # asdf #TODO + device_name, screenshot_name = parse_ios_screenshot_name(screenshot) + + if not screenshots[lang_code].get(device_name): + screenshots[lang_code][device_name] = {} + screenshots[lang_code][device_name][screenshot_name] = screenshot + + # copy screenshots to repo dir + for lang_code in screenshots.keys(): + for device in screenshots[lang_code].keys(): + dest_dir = pathlib.Path('repo') / package_name / lang_code / device + dest_dir.mkdir(mode=0o755, parents=True, exist_ok=True) + for name, path in screenshots[lang_code][device].items(): + dest = dest_dir / (name.replace(" ", "_").replace("\t", "_") + path.suffix) + _strip_and_copy_image(str(path), str(dest)) + def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False): """Scan a repo for all files with an extension except APK/OBB/IPA. diff --git a/tests/update.TestCase b/tests/update.TestCase index bebab3f0..37e4be9b 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -165,6 +165,7 @@ class UpdateTest(unittest.TestCase): apps['eu.siacs.conversations']['Builds'] = [build_conversations] fdroidserver.update.insert_localized_app_metadata(apps) + fdroidserver.update.ingest_screenshots_from_repo_dir(apps) appdir = os.path.join('repo', 'info.guardianproject.urzip', 'en-US') self.assertTrue( @@ -278,6 +279,7 @@ class UpdateTest(unittest.TestCase): knownapks = fdroidserver.common.KnownApks() apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False) fdroidserver.update.insert_localized_app_metadata(apps) + fdroidserver.update.ingest_screenshots_from_repo_dir(apps) fdroidserver.update.apply_info_from_latest_apk(apps, apks) app = apps['info.guardianproject.urzip'] self.assertIsNone(app.Name) From 53185ea2e76848707fd902539a2dd21dfa98e534 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 14 Mar 2024 13:51:11 +0100 Subject: [PATCH 1429/2116] =?UTF-8?q?=F0=9F=AB=8F=20appeace=20linter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fdroidserver/update.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 8839c531..421b6aff 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1285,11 +1285,11 @@ def insert_localized_ios_app_metadata(apps_with_packages): screenshots[lang_code][device_name][screenshot_name] = screenshot # copy screenshots to repo dir - for lang_code in screenshots.keys(): - for device in screenshots[lang_code].keys(): + for lang_code, translated_screenshots in screenshots.items(): + for device, translated_device_screenthos in translated_screenshots.items(): dest_dir = pathlib.Path('repo') / package_name / lang_code / device dest_dir.mkdir(mode=0o755, parents=True, exist_ok=True) - for name, path in screenshots[lang_code][device].items(): + for name, path in translated_device_screenshots.items(): dest = dest_dir / (name.replace(" ", "_").replace("\t", "_") + path.suffix) _strip_and_copy_image(str(path), str(dest)) From 806a07b7190c612b5191ddacb395d971318494fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 14 Mar 2024 15:07:44 +0100 Subject: [PATCH 1430/2116] =?UTF-8?q?=F0=9F=AB=8F=20better=20variable=20na?= =?UTF-8?q?me?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fdroidserver/update.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 421b6aff..0f005f37 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1260,34 +1260,34 @@ def insert_localized_ios_app_metadata(apps_with_packages): fastlane_dir = pathlib.Path('build', package_name, 'fastlane') for lang_dir in (fastlane_dir / 'metadata').iterdir(): - lang_code = lang_dir.name - m = LANG_CODE.match(lang_code) + locale = lang_dir.name + m = LANG_CODE.match(locale) if m: for metadata_file in (lang_dir).iterdir(): key = FASTLANE_IOS_MAP.get(metadata_file.name) if key: - _set_localized_text_entry(app, lang_code, key, metadata_file) + _set_localized_text_entry(app, locale, key, metadata_file) # discover available screenshots and put findings in a dict screenshots = {} for lang_sdir in (fastlane_dir / 'screenshots').iterdir(): - lang_code = lang_sdir.name - m = LANG_CODE.match(lang_code) + locale = lang_sdir.name + m = LANG_CODE.match(locale) if m: - screenshots[lang_code] = {} + screenshots[locale] = {} for screenshot in (lang_sdir).iterdir(): if screenshot.suffix[1:] in ALLOWED_EXTENSIONS: # asdf #TODO device_name, screenshot_name = parse_ios_screenshot_name(screenshot) - if not screenshots[lang_code].get(device_name): - screenshots[lang_code][device_name] = {} - screenshots[lang_code][device_name][screenshot_name] = screenshot + if not screenshots[locale].get(device_name): + screenshots[locale][device_name] = {} + screenshots[locale][device_name][screenshot_name] = screenshot # copy screenshots to repo dir - for lang_code, translated_screenshots in screenshots.items(): + for locale, translated_screenshots in screenshots.items(): for device, translated_device_screenthos in translated_screenshots.items(): - dest_dir = pathlib.Path('repo') / package_name / lang_code / device + dest_dir = pathlib.Path('repo') / package_name / locale / device dest_dir.mkdir(mode=0o755, parents=True, exist_ok=True) for name, path in translated_device_screenshots.items(): dest = dest_dir / (name.replace(" ", "_").replace("\t", "_") + path.suffix) From bbf17ee59c4490ac11af3d3c70ea599023f4dab8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Mon, 18 Mar 2024 14:01:36 +0100 Subject: [PATCH 1431/2116] =?UTF-8?q?=F0=9F=A7=86=20improve=20and=20test?= =?UTF-8?q?=20parse=5Fios=5Fscreenshot=5Fname?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fdroidserver/update.py | 49 ++++++++++++++++++++++++++++-------------- tests/update.TestCase | 29 +++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 16 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 0f005f37..d9a812cb 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1226,23 +1226,34 @@ FASTLANE_IOS_MAP = { def parse_ios_screenshot_name(path): """ - Infer type info from screenshot file name. + Infer type and categorization info from screenshot file name. - Device type/name is part of the file name of iOS fastlane screenshots. - Here are some example: - * 'iPhone 8+ @ iOS 16-1.png' - * 'iPad Pro 12.9" 2gen @ iOS 16-1.png' - * '1_ipadPro129_1.1.png' - * '1_iphone6Plus_1.1.png' + This is not really an exact algorithm, it's based on filenames observed in + the wild. """ s = path.stem.split('@') if len(s) >= 2: if "iphone" in s[0].lower(): - return ("phoneScreenshots", '@'.join(s[1:])) + return ("phoneScreenshots", s[0].strip(), ('@'.join(s[1:])).split('-')[0].strip()) elif "ipad" in s[0].lower(): - return ("tenInchScreenshots", "@".join(s[1:])) + return ("tenInchScreenshots", s[0].strip(), ('@'.join(s[1:])).split('-')[0].strip()) else: - return ('phoneScreenshots', s[0]) + fragments = path.stem.lower().split("_") + device = "unknown" + os = "unknown" + screenshot_type = "phoneScreenshots" + for f in fragments: + if "iphone" in f: + device = f + continue + if "ipad" in f: + screenshot_type = "tenInchScreenshots" + device = f + if "ios" in f: + os = f + return (screenshot_type, device, os) + + return ("phoneScreenshots", 'unknown', 'unknown') def insert_localized_ios_app_metadata(apps_with_packages): @@ -1275,18 +1286,24 @@ def insert_localized_ios_app_metadata(apps_with_packages): m = LANG_CODE.match(locale) if m: screenshots[locale] = {} + fcfs_idevice = None + fcfs_ios = None for screenshot in (lang_sdir).iterdir(): if screenshot.suffix[1:] in ALLOWED_EXTENSIONS: - # asdf #TODO - device_name, screenshot_name = parse_ios_screenshot_name(screenshot) + screenshot_type, idevice_name, ios_name = parse_ios_screenshot_name(screenshot) - if not screenshots[locale].get(device_name): - screenshots[locale][device_name] = {} - screenshots[locale][device_name][screenshot_name] = screenshot + if not fcfs_idevice: + fcfs_idevice = idevice_name + fcfs_ios = ios_name + + if fcfs_idevice == idevice_name and fcfs_ios == ios_name: + if not screenshots[locale].get(screenshot_type): + screenshots[locale][screenshot_type] = {} + screenshots[locale][screenshot_type][screenshot] = screenshot # copy screenshots to repo dir for locale, translated_screenshots in screenshots.items(): - for device, translated_device_screenthos in translated_screenshots.items(): + for device, translated_device_screenshots in translated_screenshots.items(): dest_dir = pathlib.Path('repo') / package_name / locale / device dest_dir.mkdir(mode=0o755, parents=True, exist_ok=True) for name, path in translated_device_screenshots.items(): diff --git a/tests/update.TestCase b/tests/update.TestCase index 37e4be9b..277a2270 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -2042,6 +2042,35 @@ class TestScanRepoForIpas(unittest.TestCase): ) +class TestParseIosScreenShotName(unittest.TestCase): + def setUp(self): + self.maxDiff = None + + def test_parse_ios_screenshot_name_atforamt_iphone8(self): + self.assertEqual( + fdroidserver.update.parse_ios_screenshot_name(Path("iPhone 8+ @ iOS 16-1.png")), + ("phoneScreenshots", "iPhone 8+", "iOS 16",), + ) + + def test_parse_ios_screenshot_name_atforamt_ipad13(self): + self.assertEqual( + fdroidserver.update.parse_ios_screenshot_name(Path("iPad Pro 12.9\" 2gen @ iOS 16-1.png")), + ("tenInchScreenshots", "iPad Pro 12.9\" 2gen", "iOS 16",), + ) + + def test_parse_ios_screenshot_name_underscoreforamt_ipad(self): + self.assertEqual( + fdroidserver.update.parse_ios_screenshot_name(Path("1_ipadPro129_1.1.png")), + ("tenInchScreenshots", "ipadpro129", "unknown",), + ) + + def test_parse_ios_screenshot_name_underscoreforamt_iphone(self): + self.assertEqual( + fdroidserver.update.parse_ios_screenshot_name(Path("1_iphone6Plus_1.1.png")), + ("phoneScreenshots", "iphone6plus", "unknown",), + ) + + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 6152abee08b82f203cc95d0db0a39736e3dc491d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Tue, 19 Mar 2024 23:30:45 +0100 Subject: [PATCH 1432/2116] =?UTF-8?q?=F0=9F=AA=80=20tests=20for=20insert?= =?UTF-8?q?=5Flocalized=5Fios=5Fapp=5Fmetadata?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Split some functions from insert_localized_ios_app_metadata into sub-functions and implemented separate tests for each. --- fdroidserver/update.py | 100 +++++++++++++++++++------------ tests/update.TestCase | 133 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 195 insertions(+), 38 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index d9a812cb..cc97c094 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1256,6 +1256,56 @@ def parse_ios_screenshot_name(path): return ("phoneScreenshots", 'unknown', 'unknown') +def discover_ios_screenshots(fastlane_dir): + """Traverse git checkouts in build dir, search for fastlane-screenshots and put findings into a dict.""" + fastlane_screenshot_dir = fastlane_dir / 'screenshots' + screenshots = {} + if fastlane_screenshot_dir.is_dir(): + for lang_sdir in fastlane_screenshot_dir.iterdir(): + locale = lang_sdir.name + m = LANG_CODE.match(locale) + if m: + screenshots[locale] = {} + fifo_idevice = {} + fifo_ios = {} + for screenshot in lang_sdir.iterdir(): + if screenshot.suffix[1:] in ALLOWED_EXTENSIONS: + screenshot_type, idevice_name, ios_name = parse_ios_screenshot_name(screenshot) + + # since there is no easy mapping here, we're just + # resorting to fifo here, so ieg. if there's 2 + # screenshots categorized for more than one + # iPhone/iOS combinations we just remember the + # first combination, use them as screenshots in + # F-Droid and ignore all other screenshots, for + # this screenshot type + if not fifo_idevice.get(screenshot_type): + fifo_idevice[screenshot_type] = idevice_name + fifo_ios[screenshot_type] = ios_name + + if fifo_idevice[screenshot_type] == idevice_name and fifo_ios[screenshot_type] == ios_name: + if screenshot_type not in screenshots[locale]: + screenshots[locale][screenshot_type] = [] + screenshots[locale][screenshot_type].append(screenshot) + + # sort all found screenshots alphanumerically + for locale, translated_screenshots in screenshots.items(): + for device in translated_screenshots.keys(): + translated_screenshots[device].sort() + + return screenshots + + +def copy_ios_screenshots_to_repo(screenshots, package_name): + for locale, translated_screenshots in screenshots.items(): + for device, translated_device_screenshots in translated_screenshots.items(): + dest_dir = pathlib.Path('repo') / package_name / locale / device + dest_dir.mkdir(mode=0o755, parents=True, exist_ok=True) + for path in translated_device_screenshots: + dest = dest_dir / (path.name.replace(" ", "_").replace("\t", "_")) + fdroidserver.update._strip_and_copy_image(str(path), str(dest)) + + def insert_localized_ios_app_metadata(apps_with_packages): if not any(pathlib.Path('repo').glob('*.ipa')): @@ -1269,46 +1319,20 @@ def insert_localized_ios_app_metadata(apps_with_packages): continue fastlane_dir = pathlib.Path('build', package_name, 'fastlane') + fastlane_meta_dir = (fastlane_dir / "metadata") - for lang_dir in (fastlane_dir / 'metadata').iterdir(): - locale = lang_dir.name - m = LANG_CODE.match(locale) - if m: - for metadata_file in (lang_dir).iterdir(): - key = FASTLANE_IOS_MAP.get(metadata_file.name) - if key: - _set_localized_text_entry(app, locale, key, metadata_file) + if fastlane_meta_dir.is_dir(): + for lang_dir in fastlane_meta_dir.iterdir(): + locale = lang_dir.name + m = LANG_CODE.match(locale) + if m: + for metadata_file in (lang_dir).iterdir(): + key = FASTLANE_IOS_MAP.get(metadata_file.name) + if key: + fdroidserver.update._set_localized_text_entry(app, locale, key, metadata_file) - # discover available screenshots and put findings in a dict - screenshots = {} - for lang_sdir in (fastlane_dir / 'screenshots').iterdir(): - locale = lang_sdir.name - m = LANG_CODE.match(locale) - if m: - screenshots[locale] = {} - fcfs_idevice = None - fcfs_ios = None - for screenshot in (lang_sdir).iterdir(): - if screenshot.suffix[1:] in ALLOWED_EXTENSIONS: - screenshot_type, idevice_name, ios_name = parse_ios_screenshot_name(screenshot) - - if not fcfs_idevice: - fcfs_idevice = idevice_name - fcfs_ios = ios_name - - if fcfs_idevice == idevice_name and fcfs_ios == ios_name: - if not screenshots[locale].get(screenshot_type): - screenshots[locale][screenshot_type] = {} - screenshots[locale][screenshot_type][screenshot] = screenshot - - # copy screenshots to repo dir - for locale, translated_screenshots in screenshots.items(): - for device, translated_device_screenshots in translated_screenshots.items(): - dest_dir = pathlib.Path('repo') / package_name / locale / device - dest_dir.mkdir(mode=0o755, parents=True, exist_ok=True) - for name, path in translated_device_screenshots.items(): - dest = dest_dir / (name.replace(" ", "_").replace("\t", "_") + path.suffix) - _strip_and_copy_image(str(path), str(dest)) + screenshots = fdroidserver.update.discover_ios_screenshots(fastlane_dir) + fdroidserver.update.copy_ios_screenshots_to_repo(screenshots, package_name) def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False): diff --git a/tests/update.TestCase b/tests/update.TestCase index 277a2270..81036cd6 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -2071,6 +2071,136 @@ class TestParseIosScreenShotName(unittest.TestCase): ) +class TestInsertLocalizedIosAppMetadata(unittest.TestCase): + + def test_insert_localized_ios_app_metadata(self): + self.maxDiff = None + + self.apps_with_packages = { + "org.fake": {} + } + + def _mock_discover(fastlane_dir): + self.assertEqual( + fastlane_dir, + Path('build/org.fake/fastlane'), + ) + return {"fake screenshots": "fake"} + + def _mock_copy(screenshots, package_name): + self.assertEqual(screenshots, {"fake screenshots": "fake"}) + self.assertEqual(package_name, "org.fake") + + with mock.patch('fdroidserver.update.discover_ios_screenshots', _mock_discover): + self.set_localized_mock = mock.Mock() + with mock.patch('fdroidserver.update.copy_ios_screenshots_to_repo', _mock_copy): + with mock.patch("fdroidserver.update._set_localized_text_entry", self.set_localized_mock): + return fdroidserver.update.insert_localized_ios_app_metadata( + self.apps_with_packages + ) + + self.assertListEqual( + self.set_localized_mock.call_args_list, + [ + mock.call({}, 'en-US', 'name', Path('build/org.fake/fastlane/metadata/en-US/name.txt')), + mock.call({}, 'en-US', 'summary', Path('build/org.fake/fastlane/metadata/en-US/subtitle.txt')), + mock.call({}, 'en-US', 'description', Path('build/org.fake/fastlane/metadata/en-US/description.txt')), + mock.call({}, 'de-DE', 'name', Path('build/org.fake/fastlane/metadata/de-DE/name.txt')), + mock.call({}, 'de-DE', 'summary', Path('build/org.fake/fastlane/metadata/de-DE/subtitle.txt')), + mock.call({}, 'de-DE', 'description', Path('build/org.fake/fastlane/metadata/de-DE/description.txt')), + ], + ) + + +class TestDiscoverIosScreenshots(unittest.TestCase): + def test_discover_ios_screenshots(self): + self.maxDiff = None + + with tempfile.TemporaryDirectory() as fastlane_dir: + fastlane_dir = Path(fastlane_dir) + (fastlane_dir / "screenshots/en-US").mkdir(parents=True) + with open(fastlane_dir / "screenshots/en-US/iPhone 8+ @ iOS 16-1.png", 'w') as f: + f.write("1") + with open(fastlane_dir / "screenshots/en-US/iPad Pro 12.9\" 2gen @ iOS 16-1.png", "w") as f: + f.write("2") + with open(fastlane_dir / "screenshots/en-US/iPad Pro 12.9\" 2gen @ iOS 16-2.png", "w") as f: + f.write("3") + (fastlane_dir / "screenshots/de-DE").mkdir(parents=True) + with open(fastlane_dir / "screenshots/de-DE/1_ipadPro129_1.1.png", "w") as f: + f.write("4") + + screenshots = fdroidserver.update.discover_ios_screenshots(fastlane_dir) + + self.assertDictEqual( + screenshots, + { + "en-US": { + "phoneScreenshots": [ + fastlane_dir / "screenshots/en-US/iPhone 8+ @ iOS 16-1.png", + ], + "tenInchScreenshots": [ + fastlane_dir / "screenshots/en-US/iPad Pro 12.9\" 2gen @ iOS 16-1.png", + fastlane_dir / "screenshots/en-US/iPad Pro 12.9\" 2gen @ iOS 16-2.png", + ], + }, + "de-DE": { + "tenInchScreenshots": [ + fastlane_dir / "screenshots/de-DE/1_ipadPro129_1.1.png", + ], + }, + }, + ) + + +class TestCopyIosScreenshotsToRepo(unittest.TestCase): + def test_copy_ios_screenshots_to_repo(self): + self.maxDiff = None + + screenshot_dir_en = Path("build/org.fake/fastlane/screenshots/en-US") + s1 = screenshot_dir_en / "iPhone 8+ @ iOS 16-1.png" + s2 = screenshot_dir_en / "iPad Pro 12.9\" 2gen @ iOS 16-1.png" + s3 = screenshot_dir_en / "iPad Pro 12.9\" 2gen @ iOS 16-2.png" + screenshot_dir_de = Path("build/org.fake/fastlane/screenshots/de-DE") + s4 = screenshot_dir_de / "1_ipadPro129_1.1.png" + + cmock = mock.Mock() + with mock.patch("fdroidserver.update._strip_and_copy_image", cmock): + fdroidserver.update.copy_ios_screenshots_to_repo( + { + "en-US": { + "phoneScreenshots": [s1], + "tenInchScreenshots": [s2, s3], + }, + "de-DE": { + "tenInchScreenshots": [s4], + }, + }, + "org.fake", + ) + + self.assertListEqual( + cmock.call_args_list, + [ + mock.call( + 'build/org.fake/fastlane/screenshots/en-US/iPhone 8+ @ iOS 16-1.png', + 'repo/org.fake/en-US/phoneScreenshots/iPhone_8+_@_iOS_16-1.png', + ), + mock.call( + 'build/org.fake/fastlane/screenshots/en-US/iPad Pro 12.9" 2gen @ iOS 16-1.png', + 'repo/org.fake/en-US/tenInchScreenshots/iPad_Pro_12.9"_2gen_@_iOS_16-1.png', + ), + mock.call( + 'build/org.fake/fastlane/screenshots/en-US/iPad Pro 12.9" 2gen @ iOS 16-2.png', + 'repo/org.fake/en-US/tenInchScreenshots/iPad_Pro_12.9"_2gen_@_iOS_16-2.png', + ), + mock.call( + 'build/org.fake/fastlane/screenshots/de-DE/1_ipadPro129_1.1.png', + 'repo/org.fake/de-DE/tenInchScreenshots/1_ipadPro129_1.1.png', + ), + ], + ) + + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) @@ -2088,4 +2218,7 @@ if __name__ == "__main__": newSuite.addTest(unittest.makeSuite(UpdateTest)) newSuite.addTest(unittest.makeSuite(TestUpdateVersionStringToInt)) newSuite.addTest(unittest.makeSuite(TestScanRepoForIpas)) + newSuite.addTest(unittest.makeSuite(TestParseIosScreenShotName)) + newSuite.addTest(unittest.makeSuite(TestInsertLocalizedIosAppMetadata)) + newSuite.addTest(unittest.makeSuite(TestDiscoverIosScreenshots)) unittest.main(failfast=False) From b6482f19a65c62f33e41789b8cfa629405ba1a8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Wed, 3 Apr 2024 16:48:50 +0200 Subject: [PATCH 1433/2116] =?UTF-8?q?=F0=9F=9B=A3=EF=B8=8F=20update:=20fix?= =?UTF-8?q?=20pathlib=20import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fdroidserver/update.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index cc97c094..5ce3f89d 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -34,7 +34,6 @@ import json import time import yaml import copy -import pathlib import defusedxml.ElementTree as ElementTree from datetime import datetime, timezone from argparse import ArgumentParser @@ -1299,7 +1298,7 @@ def discover_ios_screenshots(fastlane_dir): def copy_ios_screenshots_to_repo(screenshots, package_name): for locale, translated_screenshots in screenshots.items(): for device, translated_device_screenshots in translated_screenshots.items(): - dest_dir = pathlib.Path('repo') / package_name / locale / device + dest_dir = Path('repo') / package_name / locale / device dest_dir.mkdir(mode=0o755, parents=True, exist_ok=True) for path in translated_device_screenshots: dest = dest_dir / (path.name.replace(" ", "_").replace("\t", "_")) @@ -1308,17 +1307,17 @@ def copy_ios_screenshots_to_repo(screenshots, package_name): def insert_localized_ios_app_metadata(apps_with_packages): - if not any(pathlib.Path('repo').glob('*.ipa')): + if not any(Path('repo').glob('*.ipa')): # no IPA files present in repo, nothing to do here, exiting early return for package_name, app in apps_with_packages.items(): - if not any(pathlib.Path('repo').glob(f'{package_name}*.ipa')): + if not any(Path('repo').glob(f'{package_name}*.ipa')): # couldn't find any IPA files for this package_name # so we don't have to look for fastlane data continue - fastlane_dir = pathlib.Path('build', package_name, 'fastlane') + fastlane_dir = Path('build', package_name, 'fastlane') fastlane_meta_dir = (fastlane_dir / "metadata") if fastlane_meta_dir.is_dir(): From d9f59536cf185208e70b37e633f4fb8215274a71 Mon Sep 17 00:00:00 2001 From: linsui Date: Wed, 10 Apr 2024 15:01:27 +0800 Subject: [PATCH 1434/2116] insert_funding_yml_donation_links: support buymeacoffee --- fdroidserver/update.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 5ce3f89d..36b395e3 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -855,7 +855,15 @@ def insert_funding_yml_donation_links(apps): if 'open_collective' in data: del data['open_collective'] # this tuple provides a preference ordering - for k in ('custom', 'github', 'patreon', 'community_bridge', 'ko_fi', 'issuehunt'): + for k in ( + 'custom', + 'github', + 'patreon', + 'community_bridge', + 'ko_fi', + 'issuehunt', + 'buy_me_a_coffee' + ): v = data.get(k) if not v: continue @@ -889,6 +897,11 @@ def insert_funding_yml_donation_links(apps): if s: app['Donate'] = 'https://patreon.com/' + s break + elif k == 'buy_me_a_coffee': + s = sanitize_funding_yml_name(v) + if s: + app['Donate'] = 'https://www.buymeacoffee.com/' + s + break def copy_triple_t_store_metadata(apps): From 43891685889d07663a4eeca9d36aa2191be2bd09 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 9 Apr 2024 14:45:01 +0200 Subject: [PATCH 1435/2116] Drop version locking on pyasn1 I did not find any reason for this. --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 01d0d66a..49548f78 100755 --- a/setup.py +++ b/setup.py @@ -99,8 +99,8 @@ setup( 'paramiko', 'Pillow', 'apache-libcloud >= 0.14.1', - 'pyasn1 >=0.4.1, < 0.5.0', - 'pyasn1-modules >= 0.2.1, < 0.3', + 'pyasn1 >=0.4.1', + 'pyasn1-modules >= 0.2.1', 'python-vagrant', 'PyYAML', 'qrcode', From c23af7984c899e8d4b1b1f9e94bd4e64a5c74852 Mon Sep 17 00:00:00 2001 From: linsui Date: Wed, 10 Apr 2024 18:57:56 +0800 Subject: [PATCH 1436/2116] insert_funding_yml_donation_links: update lfx link community_bridge is lfx_crowdfunding now --- fdroidserver/update.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 36b395e3..e87976df 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -872,10 +872,10 @@ def insert_funding_yml_donation_links(apps): if s: app['Donate'] = s break - elif k == 'community_bridge': + elif k in ('community_bridge', 'lfx_crowdfunding'): s = sanitize_funding_yml_name(v) if s: - app['Donate'] = 'https://funding.communitybridge.org/projects/' + s + app['Donate'] = 'https://crowdfunding.lfx.linuxfoundation.org/projects/' + s break elif k == 'github': s = sanitize_funding_yml_name(v) From d62b8cc2ed15224a39aa84a77e75189c0f5a2876 Mon Sep 17 00:00:00 2001 From: linsui Date: Wed, 10 Apr 2024 18:58:16 +0800 Subject: [PATCH 1437/2116] insert_funding_yml_donation_links: support polar --- fdroidserver/update.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index e87976df..dd3bba50 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -902,6 +902,11 @@ def insert_funding_yml_donation_links(apps): if s: app['Donate'] = 'https://www.buymeacoffee.com/' + s break + elif k == 'polar': + s = sanitize_funding_yml_name(v) + if s: + app['Donate'] = 'https://polar.sh/' + s + break def copy_triple_t_store_metadata(apps): From 6ba048d660807b975d23e62cc51e26abefd4a9e6 Mon Sep 17 00:00:00 2001 From: Daniel Hejduk Date: Sun, 5 Nov 2023 09:04:06 +0100 Subject: [PATCH 1438/2116] Translated using Weblate: Czech (cs) by Daniel Hejduk Currently translated at 100.0% (552 of 552 strings) Co-authored-by: Daniel Hejduk Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ Translation: F-Droid/F-Droid Server --- locale/cs/LC_MESSAGES/fdroidserver.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index d1b65fb0..5e2a6180 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -5,20 +5,21 @@ # Fjuro , 2022. # Filip Klopec , 2022. # Fjuro , 2022, 2023. +# Daniel Hejduk , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-05-26 19:39+0000\n" -"Last-Translator: Fjuro \n" +"PO-Revision-Date: 2023-10-20 14:22+0000\n" +"Last-Translator: Daniel Hejduk \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.18-dev\n" +"X-Generator: Weblate 5.1\n" #: ../fdroidserver/nightly.py msgid "" @@ -1070,7 +1071,7 @@ msgstr "Poslední použitá revize ‚{commit}‘ vypadá jako značka, ale Upda #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" -msgstr "Darovací metody Liberapay patří do pole Liberapay:" +msgstr "Darovací metody Liberapay patří do pole Liberapay: pole" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" @@ -1250,7 +1251,7 @@ msgstr "Zpracovat pouze aplikace s automatickými aktualizacemi" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "Darovací metody OpenCollective patří do pole OpenCollective:" +msgstr "Darovací metody OpenCollective patří do pole OpenCollective: pole" #: /usr/lib/python3.11/optparse.py msgid "Options" From 98d880fe1c63e18b0f5dfa18fb8146623d1d612d Mon Sep 17 00:00:00 2001 From: David Jiang Date: Wed, 10 Apr 2024 15:33:07 +0200 Subject: [PATCH 1439/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by David Jiang Currently translated at 80.4% (444 of 552 strings) Translated using Weblate: Chinese (Simplified) (zh_Hans) by David Jiang Currently translated at 80.2% (443 of 552 strings) Translated using Weblate: Chinese (Simplified) (zh_Hans) by David Jiang Currently translated at 80.0% (442 of 552 strings) Translated using Weblate: Chinese (Simplified) (zh_Hans) by David Jiang Currently translated at 79.8% (441 of 552 strings) Translated using Weblate: Chinese (Simplified) (zh_Hans) by David Jiang Currently translated at 79.7% (440 of 552 strings) Co-authored-by: David Jiang Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 180 +++++++++++++++------ 1 file changed, 129 insertions(+), 51 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 70892748..fea370c4 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -28,20 +28,22 @@ # Max Xie , 2023. # Kingo Bingo , 2023. # zhiqi , 2023. +# David Jiang , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-09-11 17:39+0000\n" -"Last-Translator: Xiang Heng Wei \n" -"Language-Team: Chinese (Simplified) \n" +"PO-Revision-Date: 2023-11-05 08:05+0000\n" +"Last-Translator: David Jiang \n" +"Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.0.1-dev\n" +"X-Generator: Weblate 5.2-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -197,7 +199,9 @@ msgstr "'{aapt}' 太旧, F-Droid 需要 build-tools-{version} 或更新的版本 #: ../fdroidserver/common.py #, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgid "" +"'{field}' will be in random order! Use () or [] brackets if order is " +"important!" msgstr "{field} 将随机排列! 如果顺序很重要, 请使用 () 或 [] 括号!" #: ../fdroidserver/common.py @@ -233,7 +237,8 @@ msgstr ".__call__() 未定义" #: ../fdroidserver/lint.py msgid "/issues is missing" -msgstr "路径缺少 /issues ( 译者注: 此处仅支持 github 或 gitlab 之 issues 链接 )" +msgstr "" +"路径缺少 /issues ( 译者注: 此处仅支持 github 或 gitlab 之 issues 链接 )" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" @@ -265,7 +270,9 @@ msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "缺少 AllowedAPKSigningKeys,但提供了参考二进制文件" #: ../fdroidserver/import_subcommand.py -msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgid "" +"Allows a different revision (or git branch) to be specified for the initial " +"import" msgstr "可让运行初始导入时指定不同修订 ( 或 git 分支 )" #: ../fdroidserver/mirror.py @@ -309,12 +316,18 @@ msgid "Android SDK tool {cmd} not found!" msgstr "没找到 Android SDK 工具 {cmd}!" #: ../fdroidserver/lint.py -msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgid "" +"App has Binaries but does not have corresponding AllowedAPKSigningKeys to " +"pin certificate." msgstr "应用程序具有二进制文件,但没有相应的AllowedAPKSigningKeys 来固定证书。" #: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "应用的 NoSourceSince 或 ArchivePolicy 为 “0 versions” 但 AutoUpdateMode 或 UpdateCheckMode 不是 None" +msgid "" +"App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or " +"UpdateCheckMode are not None" +msgstr "" +"应用的 NoSourceSince 或 ArchivePolicy 为 “0 versions” 但 AutoUpdateMode 或 " +"UpdateCheckMode 不是 None" #: ../fdroidserver/lint.py #, python-brace-format @@ -322,8 +335,11 @@ msgid "App is in '{repo}' but has a link to {url}" msgstr "应用 在 '{repo}' 中, 但有一个链接到 {url}" #: ../fdroidserver/lint.py -msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "应用程序版本具有二进制文件,但没有相应的 AllowedAPKSigningKeys 来固定证书。" +msgid "" +"App version has binary but does not have corresponding AllowedAPKSigningKeys " +"to pin certificate." +msgstr "" +"应用程序版本具有二进制文件,但没有相应的 AllowedAPKSigningKeys 来固定证书。" #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -344,7 +360,9 @@ msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "镜像配置中的错误条目类型“{mirrortype}”:{mirror}" #: ../fdroidserver/mirror.py -msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgid "" +"Base URL to mirror, can include the index signing key using the query " +"string: ?fingerprint=" msgstr "镜像的基本链接可以使用此请求参数包含索引签名键: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname @@ -417,8 +435,12 @@ msgstr "检查应用的更新" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "正为 {appid} 检查存档: 安装包: {integer}, 保留版本数: {keep}, 架构安装包: {arch}" +msgid "" +"Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, " +"archapks:{arch}" +msgstr "" +"正为 {appid} 检查存档: 安装包: {integer}, 保留版本数: {keep}, 架构安装包: " +"{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -443,7 +465,9 @@ msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr ".yml 和本地化文件之间的“{field}”定义冲突:" #: ../fdroidserver/__main__.py -msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgid "" +"Conflicting arguments: '--verbose' and '--quiet' can not be specified at the " +"same time." msgstr "冲突的参数: '--verbose' 和 '--quiet' 不能被同时使用." #: ../fdroidserver/common.py @@ -603,7 +627,9 @@ msgid "Don't create a source tarball, useful when testing a build" msgstr "不创建源码 tarball 文件,便于内部版本测试" #: ../fdroidserver/build.py -msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgid "" +"Don't refresh the repository, useful when testing a build with no internet " +"connection" msgstr "不刷新资源库,便于没有互联网时的内部版本测试" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py @@ -666,8 +692,12 @@ msgstr "错误:不支持的 git 主机类型 \"%s\",欢迎提交补丁添加 #: ../fdroidserver/__main__.py #, python-brace-format -msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "编码被设置为“{enc}”,可能会导致 fdroid 出现编码问题。为了最佳效果,请将其更改为“UTF-8”。" +msgid "" +"Encoding is set to '{enc}' fdroid might run into encoding issues. Please set " +"it to 'UTF-8' for best results." +msgstr "" +"编码被设置为“{enc}”,可能会导致 fdroid 出现编码问题。为了最佳效果,请将其更改" +"为“UTF-8”。" #: ../fdroidserver/init.py #, python-format @@ -777,7 +807,9 @@ msgid "Forbidden HTML tags" msgstr "禁止的HTML标签" #: ../fdroidserver/build.py -msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgid "" +"Force build of disabled apps, and carries on regardless of scan problems. " +"Only allowed in test mode." msgstr "强制编译已禁用应用,忽略扫描出错。仅用于测试模式。" #: ../fdroidserver/build.py @@ -1066,7 +1098,8 @@ msgid "Java compiled class" msgstr "Java 编译类" #: ../fdroidserver/signindex.py -msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgid "" +"Java jarsigner not found! Install in standard location or set java_paths!" msgstr "未找到 Java jarsigner!安装在标准位置或设置java_paths!" #: ../fdroidserver/lint.py @@ -1084,8 +1117,10 @@ msgstr "签名密钥的密钥库:\t" #: ../fdroidserver/lint.py #, python-brace-format -msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "最后使用的提交 '{commit}' 看起来像一个标签,但 UpdateCheckMode 是 '{ucm}'" +msgid "" +"Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" +"最后使用的提交 '{commit}' 看起来像一个标签,但 UpdateCheckMode 是 '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" @@ -1397,13 +1432,19 @@ msgstr "读取 '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format -msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" -msgstr "读取 packageName/versionCode/versionName 失败,APK 无效:'{apkfilename}'" +msgid "" +"Reading packageName/versionCode/versionName failed, APK invalid: " +"'{apkfilename}'" +msgstr "" +"读取 packageName/versionCode/versionName 失败,APK 无效:'{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format -msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" -msgstr "读取 packageName/versionCode/versionName 失败,APK 无效:'{apkfilename}'" +msgid "" +"Reading packageName/versionCode/versionName failed,APK invalid: " +"'{apkfilename}'" +msgstr "" +"读取 packageName/versionCode/versionName 失败,APK 无效:'{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format @@ -1428,7 +1469,9 @@ msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "RepoTrunk 更新模式仅对 git-svn 存储库有意义" #: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgid "" +"Reset and create a brand new build server, even if the existing one appears " +"to be ok." msgstr "即使已有服务器看起来运行正常,请重置并创建一个全新的编译服务器。" #: ../fdroidserver/nightly.py @@ -1612,7 +1655,9 @@ msgid "System clock is older than date in {path}!" msgstr "系统时钟早于 {path} 中的日期!" #: ../fdroidserver/checkupdates.py -msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgid "" +"Tags update mode only works for git, hg, bzr and git-svn repositories " +"currently" msgstr "标签更新模式目前仅适用于 git、hg、bzr 和 git-svn 存储库" #: ../fdroidserver/checkupdates.py @@ -1620,7 +1665,9 @@ msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "git-svn 中使用的标记更新模式,但未使用标记设置存储库" #: ../fdroidserver/build.py -msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgid "" +"Test mode - put output in the tmp directory only, and always build, even if " +"the output already exists." msgstr "测试模式:仅将输出保存至 tmp 目录,即使输出已存在,仍然编译。" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode @@ -1659,8 +1706,15 @@ msgid "These are the apps that have been archived from the main repo." msgstr "这些是已从主存储库存档的应用。" #: ../fdroidserver/common.py -msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "这是一个与F-Droid一起使用的应用的存储库。这个存储库中的应用要么是原应用开发者构建的官方二进制文件,要么是 f-droid.org 的管理员使用 https://gitlab.com/fdroid 上的工具从源代码构建而来的二进制文件。" +msgid "" +"This is a repository of apps to be used with F-Droid. Applications in this " +"repository are either official binaries built by the original application " +"developers, or are binaries built from source by the admin of f-droid.org " +"using the tools on https://gitlab.com/fdroid." +msgstr "" +"这是一个与F-Droid一起使用的应用的存储库。这个存储库中的应用要么是原应用开发者" +"构建的官方二进制文件,要么是 f-droid.org 的管理员使用 https://gitlab.com/" +"fdroid 上的工具从源代码构建而来的二进制文件。" #: ../fdroidserver/import_subcommand.py #, python-format @@ -1687,8 +1741,11 @@ msgstr "" "和 https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "要使用 awsbucket,还必须在 config.yml 中设置 awssecretkey 和 awsaccesskeyid!" +msgid "" +"To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config." +"yml!" +msgstr "" +"要使用 awsbucket,还必须在 config.yml 中设置 awssecretkey 和 awsaccesskeyid!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1704,11 +1761,17 @@ msgid "URL {url} in Description: {error}" msgstr "描述中的网址 {url}:{error}" #: ../fdroidserver/lint.py -msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "意外的许可证标签“{}”!仅使用来自 https://spdx.org/license-list 的 FSF 或 OSI 批准的标签" +msgid "" +"Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from " +"https://spdx.org/license-list" +msgstr "" +"意外的许可证标签“{}”!仅使用来自 https://spdx.org/license-list 的 FSF 或 OSI " +"批准的标签" #: ../fdroidserver/lint.py -msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgid "" +"Unexpected license tag \"{}\"! Only use license tags configured in your " +"config file" msgstr "意外的许可证标签“{}”!仅使用配置文件中配置的许可证标记" #: ../fdroidserver/common.py @@ -1813,7 +1876,9 @@ msgstr "UpdateCheckData 具有无效的 URL:{url}" #: ../fdroidserver/lint.py #, python-brace-format -msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" +msgid "" +"UpdateCheckData must match the version code as integer (\\d or [0-9]): " +"{codeex}" msgstr "UpdateCheckData 必须以整数(\\d 或 [0-9])的形式匹配版本代码:{codeex}" #: ../fdroidserver/lint.py @@ -1828,7 +1893,8 @@ msgstr "UpdateCheckData 不是有效的网址:{url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "" +"UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" msgstr "" #: ../fdroidserver/lint.py @@ -1838,12 +1904,12 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" -msgstr "" +msgstr "上传{apkfilename}到androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" -msgstr "" +msgstr "上传{apkfilename}到virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -1881,20 +1947,21 @@ msgstr "" #: ../fdroidserver/common.py msgid "Using APK Signature v2" -msgstr "" +msgstr "使用APK签名 v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" -msgstr "" +msgstr "使用APK签名 v3" #: ../fdroidserver/common.py -msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgid "" +"Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" -msgstr "" +msgstr "使用androguard从{path}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1929,7 +1996,9 @@ msgstr "验证目录签名中:" #: ../fdroidserver/deploy.py #, python-brace-format -msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgid "" +"VirusTotal API key cannot upload files larger than 32MB, use {url} to upload " +"{path}." msgstr "" #: ../fdroidserver/__main__.py @@ -1937,11 +2006,15 @@ msgid "Warn about possible metadata errors" msgstr "警告元数据中可能存在的错误" #: ../fdroidserver/update.py -msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgid "" +"When configured for signed indexes, create only unsigned indexes at this " +"stage" msgstr "如果已配置为使用签名索引,该阶段仅创建未签名索引" #: ../fdroidserver/lint.py -msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgid "" +"When linting the entire repository yamllint is disabled by default. This " +"option forces yamllint regardless." msgstr "" #: ../fdroidserver/init.py @@ -2235,7 +2308,9 @@ msgstr "" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format -msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgid "" +"invalid option string %(option)r: must start with a character " +"%(prefix_chars)r" msgstr "" #: ../fdroidserver/common.py @@ -2249,7 +2324,8 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format -msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgid "" +"local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir未以“ fdroid”结尾,也许你指的是:“ {path}”" #: ../fdroidserver/deploy.py @@ -2410,7 +2486,9 @@ msgstr "" #: ../fdroidserver/signatures.py #, python-brace-format -msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgid "" +"refuse downloading via insecure HTTP connection (use HTTPS or specify --no-" +"https-check): {apkfilename}" msgstr "" #: ../fdroidserver/index.py From 44f4317ff87e3e28e8b26a7a78cf5af7ee9fb3cf Mon Sep 17 00:00:00 2001 From: linsui Date: Wed, 10 Apr 2024 15:33:09 +0200 Subject: [PATCH 1440/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by linsui Currently translated at 80.4% (444 of 552 strings) Translated using Weblate: Chinese (Simplified) (zh_Hans) by linsui Currently translated at 80.4% (444 of 552 strings) Translated using Weblate: Chinese (Simplified) (zh_Hans) by linsui Currently translated at 80.2% (443 of 552 strings) Translated using Weblate: Chinese (Simplified) (zh_Hans) by linsui Currently translated at 80.0% (442 of 552 strings) Translated using Weblate: Chinese (Simplified) (zh_Hans) by linsui Currently translated at 79.8% (441 of 552 strings) Co-authored-by: linsui Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index fea370c4..d0bb0290 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -1904,12 +1904,12 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" -msgstr "上传{apkfilename}到androidobservatory.org" +msgstr "上传 {apkfilename} 到 androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" -msgstr "上传{apkfilename}到virustotal" +msgstr "上传 {apkfilename} 到 virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -1947,11 +1947,11 @@ msgstr "" #: ../fdroidserver/common.py msgid "Using APK Signature v2" -msgstr "使用APK签名 v2" +msgstr "使用 APK 签名 v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" -msgstr "使用APK签名 v3" +msgstr "使用 APK 签名 v3" #: ../fdroidserver/common.py msgid "" @@ -1961,7 +1961,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" -msgstr "使用androguard从{path}" +msgstr "使用 {path} 中的 androguard" #: ../fdroidserver/metadata.py #, python-brace-format From b08ae687062fd2d8bb468dd58f0bab4ccd4669aa Mon Sep 17 00:00:00 2001 From: Licaon Kter Date: Wed, 10 Apr 2024 15:33:09 +0200 Subject: [PATCH 1441/2116] Translated using Weblate: Romanian (ro) by Licaon Kter Currently translated at 96.7% (534 of 552 strings) Co-authored-by: Licaon Kter Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ro/ Translation: F-Droid/F-Droid Server --- locale/ro/LC_MESSAGES/fdroidserver.po | 33 ++++++++++++--------------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 82a77e36..41b0ec0e 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -3,21 +3,21 @@ # Daniel Șerbănescu , 2021. # Christian Eichert , 2021. # Simona Iacob , 2021, 2022, 2023. -# Licaon Kter , 2021, 2022. +# Licaon Kter , 2021, 2022, 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-08-10 18:46+0000\n" -"Last-Translator: Simona Iacob \n" +"PO-Revision-Date: 2023-11-15 10:05+0000\n" +"Last-Translator: Licaon Kter \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n" -"X-Generator: Weblate 5.0-dev\n" +"X-Generator: Weblate 5.2-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -314,7 +314,7 @@ msgstr "Arhivare {apkfilename} cu semnătură invalidă!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." -msgstr "" +msgstr "AutoUpdateMode cu UpdateCheckMode: HTTP trebuie să aivă un format." #: ../fdroidserver/index.py #, python-brace-format @@ -1381,7 +1381,7 @@ msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfil msgstr "Citirea packageName/versionCode/versionName a eșuat, APK invalid: '{apkfilename}'" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" msgstr "Citirea packageName/versionCode/versionName a eșuat, APK invalid: '{apkfilename}'" @@ -1464,9 +1464,9 @@ msgid "Scan the source code of a package" msgstr "Scanarea codului sursă al unui pachet" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Scanner found {count} problems in {apk}" -msgstr "Scanerul a găsit {count} probleme în {appid}:" +msgstr "Scanerul a găsit {count} probleme în {apk}" #: ../fdroidserver/scanner.py #, python-brace-format @@ -2062,12 +2062,12 @@ msgstr[1] "șiruri de opțiuni conflictuale: %s" msgstr[2] "șiruri de opțiuni conflictuale: %s" #: /usr/lib/python3.11/argparse.py -#, fuzzy, python-format +#, python-format msgid "conflicting subparser alias: %s" -msgstr "șir de opțiuni conflictuale: %s" +msgstr "șir de alias conflictual: %s" #: /usr/lib/python3.11/argparse.py -#, fuzzy, python-format +#, python-format msgid "conflicting subparser: %s" msgstr "șir de opțiuni conflictuale: %s" @@ -2112,14 +2112,12 @@ msgid "dest= is required for options like %r" msgstr "dest= este necesar pentru opțiuni precum %r" #: ../fdroidserver/scanner.py -#, fuzzy msgid "downloading '{}'" -msgstr "Descărcare %s" +msgstr "descărcare '{}'" #: ../fdroidserver/scanner.py -#, fuzzy msgid "downloading scanner signatures from '{}' failed" -msgstr "Eliminarea semnăturii misterioase din {apkfilename}" +msgstr "descărcarea semnăturilor de scaner de la '{}' a eșuat" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" @@ -2373,9 +2371,8 @@ msgid "optional arguments" msgstr "argumente opționale" #: /usr/lib/python3.11/argparse.py -#, fuzzy msgid "options" -msgstr "Opțiuni" +msgstr "opțiuni" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2596,7 +2593,7 @@ msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} trebuie să fie un număr întreg, găsit: {value}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{build_flag} must be list or string, found: {value}" msgstr "{build_flag} trebuie să fie un număr întreg, găsit: {value}" From 0d12b5ffbaa95c4f36e5853f596101ebe442d08c Mon Sep 17 00:00:00 2001 From: Simona Iacob Date: Wed, 10 Apr 2024 15:33:10 +0200 Subject: [PATCH 1442/2116] Translated using Weblate: Romanian (ro) by Simona Iacob Currently translated at 100.0% (552 of 552 strings) Translated using Weblate: Romanian (ro) by Simona Iacob Currently translated at 99.6% (550 of 552 strings) Translated using Weblate: Romanian (ro) by Simona Iacob Currently translated at 99.0% (547 of 552 strings) Translated using Weblate: Romanian (ro) by Simona Iacob Currently translated at 98.5% (544 of 552 strings) Translated using Weblate: Romanian (ro) by Simona Iacob Currently translated at 98.3% (543 of 552 strings) Translated using Weblate: Romanian (ro) by Simona Iacob Currently translated at 97.2% (537 of 552 strings) Co-authored-by: Simona Iacob Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ro/ Translation: F-Droid/F-Droid Server --- locale/ro/LC_MESSAGES/fdroidserver.po | 46 +++++++++++++-------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 41b0ec0e..b676424d 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -2,22 +2,22 @@ # This file is put in the public domain. # Daniel Șerbănescu , 2021. # Christian Eichert , 2021. -# Simona Iacob , 2021, 2022, 2023. +# Simona Iacob , 2021, 2022, 2023, 2024. # Licaon Kter , 2021, 2022, 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-11-15 10:05+0000\n" -"Last-Translator: Licaon Kter \n" +"PO-Revision-Date: 2024-02-07 22:51+0000\n" +"Last-Translator: Simona Iacob \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n" -"X-Generator: Weblate 5.2-dev\n" +"X-Generator: Weblate 5.4-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -319,7 +319,7 @@ msgstr "AutoUpdateMode cu UpdateCheckMode: HTTP trebuie să aivă un format." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "Intrare de tip \"{mirrortype}\" greșită în configurația oglinzilor: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -420,7 +420,7 @@ msgstr "Efectuați modificări" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" +msgstr "Definiții \"{field}\" contradictorii între fișierele .yml și cele localizate:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." @@ -611,12 +611,12 @@ msgstr "Descărcarea {url} a eșuat. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "" +msgstr "Declarația duplicată Anti-Feature la {path} a fost ignorată!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "" +msgstr "Intrare duplicată \"%s\" în oglinzile config!" #: ../fdroidserver/lint.py #, python-brace-format @@ -669,7 +669,7 @@ msgstr "Eroare la obținerea adresei repo" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" +msgstr "Ieșiți cu un cod diferit de zero dacă au fost găsite probleme" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" @@ -817,9 +817,9 @@ msgid "Found {apkfilename} at {url}" msgstr "Am găsit {apkfilename} la {url}" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Found {count} problems in {filename}" -msgstr "Scanerul a găsit {count} probleme în {appid}:" +msgstr "Am găsit {count} probleme în {filename}" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1453,7 +1453,7 @@ msgstr "Rularea wget în {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "" +msgstr "SHA-256 din {url} nu se potrivește cu intrarea!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." @@ -1796,7 +1796,7 @@ msgstr "UpdateCheckData are un URL invalid: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" -msgstr "" +msgstr "UpdateCheckData trebuie să corespundă codului versiunii ca număr întreg (\\d sau [0-9]): {codeex}" #: ../fdroidserver/lint.py #, python-brace-format @@ -1811,7 +1811,7 @@ msgstr "UpdateCheckData nu este un URL valid: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" +msgstr "UpdateCheckMode este setat, dar se pare că CheckUpdates nu a fost încă rulat." #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -1881,7 +1881,7 @@ msgstr "Folosind androguard din \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" -msgstr "" +msgstr "Utilizarea dicționarului gol în loc de conținutul lui {path}!" #: ../fdroidserver/init.py #, python-brace-format @@ -1995,7 +1995,7 @@ msgstr "argumentul \"-\" cu modul %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" -msgstr "" +msgstr "argument %(nume_argument)s: %(mesaj)e" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" @@ -2012,7 +2012,7 @@ msgstr "nu se poate deschide '%(filename)s': %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" -msgstr "" +msgstr "nu se poate deschide un URL non-https: '{};" #: ../fdroidserver/build.py #, python-brace-format @@ -2157,7 +2157,7 @@ msgstr "fdroid [] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" -msgstr "" +msgstr "extrage cea mai recentă versiune de semnături de pe web" #: /usr/lib/python3.11/optparse.py msgid "floating-point" @@ -2226,7 +2226,7 @@ msgstr "șir de opțiuni invalid %(option)r: trebuie să înceapă cu un caracte #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" -msgstr "" +msgstr "ipfs_cid nu a fost găsit, sărind peste generarea CIDv1" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -2260,7 +2260,7 @@ msgstr "argumentele care se exclud reciproc trebuie să fie opționale" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" -msgstr "" +msgstr "următoarea actualizare a memoriei cache {name} va fi efectuată în {time}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2392,7 +2392,7 @@ msgstr "jurnalul procesului deploy {path} la {dest} a eșuat!" #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "" +msgstr "referință binară semnătură lipsă" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2420,7 +2420,7 @@ msgstr "s3cmd sincronizează indexurile {path} cu {url} și șterge" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" -msgstr "" +msgstr "cache-ul scanerului este deformat! Puteți să o ștergeți cu: '{clear}'" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2468,7 +2468,7 @@ msgstr "bibliotecă statică" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "" +msgstr "binare de referință furnizate au permis semnatarului {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py From e8a980ea9cce2a8a4382b18e0440d86775ee01eb Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Tue, 20 Feb 2024 16:50:27 +0000 Subject: [PATCH 1443/2116] Translated using Weblate: Albanian (sq) by Besnik Bleta Currently translated at 94.5% (522 of 552 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/ --- locale/sq/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index 0952318d..d086a5ab 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -1,13 +1,13 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# Besnik Bleta , 2020, 2021, 2022, 2023. +# Besnik Bleta , 2020, 2021, 2022, 2023, 2024. # Hans-Christoph Steiner , 2020, 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-02-25 12:43+0000\n" +"PO-Revision-Date: 2024-02-20 16:54+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" "Language: sq\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.16-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -2045,7 +2045,7 @@ msgstr "urdhra prej modulesh shtojce:" #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" -msgstr "kompleksë" +msgstr "kompleks" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py From a90191949db23b5283f17a775a196e49c2be72fe Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Tue, 20 Feb 2024 17:54:18 +0000 Subject: [PATCH 1444/2116] Translated using Weblate: Albanian (sq) by Besnik Bleta Currently translated at 97.1% (536 of 552 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/ --- locale/sq/LC_MESSAGES/fdroidserver.po | 42 +++++++++++++-------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index d086a5ab..c03ac57a 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2024-02-20 16:54+0000\n" +"PO-Revision-Date: 2024-02-20 18:58+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" "Language: sq\n" @@ -116,7 +116,7 @@ msgstr "%r s’mund të thirret" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" -msgstr "" +msgstr "%s s’prodhoi një “dict”!" #: ../fdroidserver/signindex.py #, python-format @@ -183,7 +183,7 @@ msgstr "S’u arrit të përmbushet '{path}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "'{path}' ka format të pavlefshëm, duhet të jetë një fjalor!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format @@ -191,9 +191,9 @@ msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' s’është një {field} e vlefshme te {appid}. Rregullsi shprehjeje të rregullt: {pattern}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "'{value}' s’është një {field} e vlefshme te {appid}. Rregullsi shprehjeje të rregullt: {pattern}" +msgstr "'{value}' s’është një {field} e vlefshme, duhet të jetë {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -285,7 +285,7 @@ msgstr "S’u gjet {cmd} mjeti SDK-je Android!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "Aplikacioni ka Dyorë, por s’ka AllowedAPKSigningKeys përkatës për të fiksuar dëshmi." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" @@ -298,7 +298,7 @@ msgstr "Aplikacioni gjendet në '{repo}' por ka një lidhje te {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "Aplikacioni ka dyor, por s’ka AllowedAPKSigningKeys përkatës për të fiksuar dëshmi." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -316,7 +316,7 @@ msgstr "AutoUpdateMode me UpdateCheckMode: HTTP duhet të ketë një rregullsi." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "Lloj i gabuar zëri “{mirrortype}” në formësim pasqyrash: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -416,7 +416,7 @@ msgstr "Depozito ndryshimet" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" +msgstr "Përkufizime “{field}” me përplasje, mes kartelash .yml dhe të përkthyerash:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." @@ -612,7 +612,7 @@ msgstr "" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "" +msgstr "Zë i përsëdytur “%s” në formësim pasqyrash!" #: ../fdroidserver/lint.py #, python-brace-format @@ -665,7 +665,7 @@ msgstr "Gabim teksa merrej adresë depoje" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" +msgstr "Dil me një kod jozero, nëse gjenden probleme" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" @@ -887,7 +887,7 @@ msgstr "Po shpërfillen zëra FUNDING.yml më të gjatë se 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "" +msgstr "Po shpërfillet element i gabuar në manifest: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1090,7 +1090,7 @@ msgstr "Rresht serverwebroot i keqformuar:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "" +msgstr "U mbërrit në thellësi maksimum rekursive te kartelë ZIP: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1102,7 +1102,7 @@ msgstr "Mungon drejtori përfundimesh" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" +msgstr "Po kalohen pohime Anti-Features te kartela të përkthyera:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" @@ -1877,7 +1877,7 @@ msgstr "Po përdoret androguard prej “{path}”" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" -msgstr "" +msgstr "Po përdoret fjalor i zbrazët, në vend se lënda e {path}!" #: ../fdroidserver/init.py #, python-brace-format @@ -2057,14 +2057,14 @@ msgstr[0] "varg mundësie me përplasje: %s" msgstr[1] "vargje mundësish me përplasje: %s" #: /usr/lib/python3.11/argparse.py -#, fuzzy, python-format +#, python-format msgid "conflicting subparser alias: %s" -msgstr "varg mundësie me përplasje: %s" +msgstr "" #: /usr/lib/python3.11/argparse.py -#, fuzzy, python-format +#, python-format msgid "conflicting subparser: %s" -msgstr "varg mundësie me përplasje: %s" +msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2586,9 +2586,9 @@ msgid "{build_flag} must be an integer, found: {value}" msgstr "{build_flag} duhet të jetë numër i plotë, u gjet: {value}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{build_flag} must be list or string, found: {value}" -msgstr "{build_flag} duhet të jetë numër i plotë, u gjet: {value}" +msgstr "{build_flag} duhet të jetë listë, ose varg, u gjet: {value}" #: ../fdroidserver/metadata.py #, python-brace-format From 4e491830ccd42d33c1560e9fbf13bb0014b2c263 Mon Sep 17 00:00:00 2001 From: Alexander Ivanov Date: Fri, 23 Feb 2024 12:09:39 +0000 Subject: [PATCH 1445/2116] Translated using Weblate: Russian (ru) by Alexander Ivanov Currently translated at 100.0% (552 of 552 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ --- locale/ru/LC_MESSAGES/fdroidserver.po | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 436339c1..9964ba19 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -12,20 +12,21 @@ # Чтабс , 2021. # Andrei Stepanov , 2022. # Макар Разин , 2023. +# Alexander Ivanov , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-05-28 07:54+0000\n" -"Last-Translator: Andrey \n" +"PO-Revision-Date: 2024-02-23 12:59+0000\n" +"Last-Translator: Alexander Ivanov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.18-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -42,7 +43,7 @@ msgid "" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" "\n" -"зашифрованный путь {path}, который будет присвоен скрытой переменной DEBUG_KEYSTORE:" +"{path} закодирован в скрытую переменную DEBUG_KEYSTORE:" #: ../fdroidserver/lint.py #, python-format @@ -109,7 +110,7 @@ msgstr "%(prog)s: ошибка: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" -msgstr "найдено %d ошибок" +msgstr "%d ошибок найдено" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -156,15 +157,15 @@ msgstr "Значение 'keystore` — NONE, но 'smartcardoptions' не за #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" -msgstr "В config.yml нет переменной 'keystore'!" +msgstr "'keystore' не найден в config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" -msgstr "В config.yml нет переменной 'keystorepass'!" +msgstr "'keystorepass' не найден в config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" -msgstr "В config.yml нет переменной 'repo_ keyalias'!" +msgstr "'repo_keyalias' не найден в config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -529,7 +530,7 @@ msgstr "Переменная DEBUG_KEYSTORE пустая или заполнен #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "Удалить из репозитория APK и/или OBB файлы без метаданных" +msgstr "Удалить APK и/или OBB без метаданных из репозитория" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1372,7 +1373,7 @@ msgstr "Публикация в {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" -msgstr "Создать новый репозиторий (укороченная процедура)" +msgstr "Быстро создать новый репозиторий" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" @@ -1534,7 +1535,7 @@ msgstr "Подписать пакеты и поместить в репозит #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" -msgstr "Подписать индексы, созданные с флагом \"update --nosign\"" +msgstr "Подписать индексы созданные с \"update --nosign\"" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" @@ -1911,7 +1912,7 @@ msgstr "Сверяться с закешированной копией вмес #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" -msgstr "Проверить загруженные пакеты на повреждения" +msgstr "Проверить целостность загруженных пакетов" #: ../fdroidserver/index.py msgid "Verifying index signature:" From 954c136506a35b836e31af4626a8223199e43fa8 Mon Sep 17 00:00:00 2001 From: VfBFan Date: Tue, 12 Mar 2024 12:00:26 +0000 Subject: [PATCH 1446/2116] Translated using Weblate: German (de) by VfBFan Currently translated at 100.0% (552 of 552 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ --- locale/de/LC_MESSAGES/fdroidserver.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 61b93b6f..7da5980e 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -20,20 +20,21 @@ # Follpvosten , 2021. # ssantos , 2022, 2023. # "C. Rüdinger" , 2023. +# VfBFan , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-06-23 14:52+0000\n" -"Last-Translator: \"C. Rüdinger\" \n" +"PO-Revision-Date: 2024-03-12 12:37+0000\n" +"Last-Translator: VfBFan \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.18.1\n" +"X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -918,7 +919,7 @@ msgstr "Ignoriere veraltete Cachedaten für {apkfilename}" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "APKs einschließen, die mit deaktivierten Algorithmen wie MD5 signiert sind" +msgstr "APKs einschließen, die mit untauglichen Algorithmen wie MD5 signiert sind" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" @@ -1166,7 +1167,7 @@ msgstr "Keine Mindest-SDK-Version in {0} gefunden, Standard (3) verwendet." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" -msgstr "Sie müssen nicht angeben, dass die App freie Software ist" +msgstr "Sie müssen nicht angeben, dass die App Freie Software ist" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" From 443973c6f1f4a5dc3f200f67fe305d2e5fca6b03 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 10 Apr 2024 15:33:10 +0200 Subject: [PATCH 1447/2116] Translated using Weblate: Romanian (ro) by Hans-Christoph Steiner Currently translated at 100.0% (552 of 552 strings) Translated using Weblate: Hungarian (hu) by Hans-Christoph Steiner Currently translated at 57.6% (318 of 552 strings) Translated using Weblate: Korean (ko) by Hans-Christoph Steiner Currently translated at 32.7% (181 of 552 strings) Translated using Weblate: French (fr) by Hans-Christoph Steiner Currently translated at 100.0% (552 of 552 strings) Translated using Weblate: Tibetan (bo) by Hans-Christoph Steiner Currently translated at 53.4% (295 of 552 strings) Translated using Weblate: Chinese (Traditional) (zh_Hant) by Hans-Christoph Steiner Currently translated at 66.8% (369 of 552 strings) Co-authored-by: Hans-Christoph Steiner Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/bo/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/hu/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ko/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ro/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hant/ Translation: F-Droid/F-Droid Server --- locale/bo/LC_MESSAGES/fdroidserver.po | 20 +++---- locale/fr/LC_MESSAGES/fdroidserver.po | 12 ++-- locale/hu/LC_MESSAGES/fdroidserver.po | 18 +++--- locale/ko/LC_MESSAGES/fdroidserver.po | 10 ++-- locale/ro/LC_MESSAGES/fdroidserver.po | 11 ++-- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 64 +++++++++++----------- 6 files changed, 68 insertions(+), 67 deletions(-) diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index f8ceac42..ba7c2b0c 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -1,12 +1,12 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. -# Hans-Christoph Steiner , 2020, 2021, 2022. +# Hans-Christoph Steiner , 2020, 2021, 2022, 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2022-09-06 14:30+0000\n" +"PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tibetan \n" "Language: bo\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py #, fuzzy @@ -191,9 +191,9 @@ msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' ཁུངས་ལྡན་རེད་མིན་འདུག{field} འདི་ནང་ {appid}. Regex འགྲོ་ལུགས་: {pattern}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "'{value}' ཁུངས་ལྡན་རེད་མིན་འདུག{field} འདི་ནང་ {appid}. Regex འགྲོ་ལུགས་: {pattern}" +msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -1147,7 +1147,7 @@ msgstr "གནས་ཚུལ་རྙེད་མ་སོང་།." #: ../fdroidserver/checkupdates.py #, fuzzy msgid "No matching tags found" -msgstr "གནས་ཚུལ་རྙེད་མ་སོང་།." +msgstr "གནས་ཚུལ་རྙེད་མ་སོང་།" #: ../fdroidserver/update.py #, python-brace-format @@ -1470,9 +1470,9 @@ msgid "Scan the source code of a package" msgstr "ཐུམ་སྒྲིལ་བྱས་པའི་འབྱུང་ཁུངས་ཨང་རྟགས་འཚག་རྒྱབ" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Scanner found {count} problems in {apk}" -msgstr "འཚག་རྒྱབ་ལ་སྐྱོན་རྙེད་པ།" +msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format @@ -2166,7 +2166,7 @@ msgstr "གཡེང་ཚེག" #: ../fdroidserver/metadata.py #, fuzzy msgid "force metadata errors (default) to be warnings, or to be ignored." -msgstr "སྐྱོན་ཤོར་བ་ལ་ཉེན་བརྡ་ངེས་པར་དུ་གཏོང་དགོས་པ་དང་། ཡང་ན་ཡ་མ་བྱེད།" +msgstr "སྐྱོན་ཤོར་བ་ལ་ཉེན་བརྡ་ངེས་པར་དུ་གཏོང་དགོས་པ་དང་། ཡང་ན་ཡ་མ་བྱེད།." #: ../fdroidserver/common.py #, fuzzy @@ -2288,7 +2288,7 @@ msgstr "ཆ་རྒྱུས་མེད་པའི་དམིགས་བས #: ../fdroidserver/checkupdates.py #, fuzzy msgid "no version information found" -msgstr "ཆ་རྒྱུས་མེད་པའི་དམིགས་བསལ་ཞིག་རྙེད་སོང་།!" +msgstr "ཆ་རྒྱུས་མེད་པའི་དམིགས་བསལ་ཞིག་རྙེད་སོང་།" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 3cb250d7..2734e9fc 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -2,7 +2,7 @@ # Copyright (C) YEAR Free Software Foundation, Inc. # Julien Gontier , 2020. # anonymous , 2020. -# Hans-Christoph Steiner , 2020, 2021. +# Hans-Christoph Steiner , 2020, 2021, 2024. # Jeannette L , 2020. # Nathan , 2020. # Virgile L. , 2020. @@ -40,15 +40,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-07-31 20:06+0000\n" -"Last-Translator: Translator \n" +"PO-Revision-Date: 2024-04-10 13:33+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.0-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -1054,7 +1054,7 @@ msgstr "Métadonnée de scrlib invalide : la clé '{key}' est inconnue dans '{fi #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" -msgstr "La signature JAR n'a pas pu vérifier:{path}" +msgstr "La signature JAR n'a pas pu vérifier :{path}" #: ../fdroidserver/common.py #, python-brace-format @@ -1990,7 +1990,7 @@ msgstr "option ambiguë : %(option)s peut correspondre à %(matches)s" #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" -msgstr "option ambiguë : %s (%s?)" +msgstr "option ambiguë : %s (%s ?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index 4815167b..b2956f07 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -1,22 +1,22 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # Balázs Meskó , 2020, 2021. -# Hans-Christoph Steiner , 2020, 2021, 2022. +# Hans-Christoph Steiner , 2020, 2021, 2022, 2024. # KissPandur , 2022. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2022-10-05 06:16+0000\n" -"Last-Translator: KissPandur \n" +"PO-Revision-Date: 2024-04-10 13:33+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -194,7 +194,7 @@ msgstr "A(z) „{value}” nem érvényes {field} érték itt: {appid}. Regex mi #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "A(z) „{value}” nem érvényes {field} érték itt: {appid}. Regex minta: {pattern}" +msgstr "A(z) „{value}” nem érvényes {field} érték itt: minta: {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -818,7 +818,7 @@ msgstr "{apkfilename} található itt: {url}" #: ../fdroidserver/scanner.py #, fuzzy, python-brace-format msgid "Found {count} problems in {filename}" -msgstr "Az átvizsgáló {count} problémát talált a(z) „{appid}” alkalmazásban:" +msgstr "Az átvizsgáló {count} problémát talált a(z) „{filename}” alkalmazásban" #: ../fdroidserver/scanner.py #, python-brace-format @@ -976,7 +976,7 @@ msgstr "Érvénytelen VercodeOperation: {field}" #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" -msgstr "Érvénytelen VercodeOperation: {field}" +msgstr "Érvénytelen VercodeOperation: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format @@ -1468,7 +1468,7 @@ msgstr "A csomag forráskódjának átvizsgálása" #: ../fdroidserver/scanner.py #, fuzzy, python-brace-format msgid "Scanner found {count} problems in {apk}" -msgstr "Az átvizsgáló {count} problémát talált a(z) „{appid}” alkalmazásban:" +msgstr "Az átvizsgáló {count} problémát talált a(z) „{apk}” alkalmazásban" #: ../fdroidserver/scanner.py #, python-brace-format @@ -2182,7 +2182,7 @@ msgstr "az index-v1-nek kell legyen aláírása, használja az „fdroid signind #: ../fdroidserver/index.py #, fuzzy msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "az index-v1-nek kell legyen aláírása, használja az „fdroid signindex” parancsot a létrehozásához." +msgstr "az index-v1-nek kell legyen aláírása, használja az `fdroid signindex` parancsot a létrehozásához!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index fef138e2..50f509a4 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -1,13 +1,13 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# Hans-Christoph Steiner , 2020, 2021, 2022. +# Hans-Christoph Steiner , 2020, 2021, 2022, 2024. # Myeongjin Lee , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2022-09-06 14:30+0000\n" +"PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Korean \n" "Language: ko\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -192,7 +192,7 @@ msgstr "'{value}'는 {appid}에서 올바른 {field}가 아닙니다. 정규식 #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "'{value}'는 {appid}에서 올바른 {field}가 아닙니다. 정규식 패턴: {pattern}" +msgstr "'{value}'에서 올바른 {field}가 아닙니다. 정규식 패턴: {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -967,7 +967,7 @@ msgstr "잘못된 Vercode연산: {field}" #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" -msgstr "잘못된 Vercode연산: {field}" +msgstr "잘못된 VercodeOperation연산: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index b676424d..9de6149d 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -4,20 +4,21 @@ # Christian Eichert , 2021. # Simona Iacob , 2021, 2022, 2023, 2024. # Licaon Kter , 2021, 2022, 2023. +# Hans-Christoph Steiner , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2024-02-07 22:51+0000\n" -"Last-Translator: Simona Iacob \n" +"PO-Revision-Date: 2024-04-10 13:33+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -74,7 +75,7 @@ msgstr "\"{path}\" nu este un format de fișier acceptat (utilizați: metadata/* #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "\"{path}\" \"{path}\" este semnat de o cheie care nu este permisă:" +msgstr "\"{path}\" este semnat de o cheie care nu este permisă:" #: ../fdroidserver/import_subcommand.py #, python-brace-format @@ -1995,7 +1996,7 @@ msgstr "argumentul \"-\" cu modul %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" -msgstr "argument %(nume_argument)s: %(mesaj)e" +msgstr "argument %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 6eefcc0a..779085d2 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # Jeff Huang , 2020. -# Hans-Christoph Steiner , 2020, 2021, 2022. +# Hans-Christoph Steiner , 2020, 2021, 2022, 2024. # NightFeather , 2020. # ifurther , 2021. # Stiffen , 2021. @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2022-09-06 14:30+0000\n" +"PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Chinese (Traditional) \n" "Language: zh_Hant\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -73,9 +73,9 @@ msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "\"{path}\" 不是可接受的格式,轉換成: metadata/*.yml" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "有 \"{path}\" 存在,但是沒有安裝 s3cmd!" +msgstr "" #: ../fdroidserver/import_subcommand.py #, python-brace-format @@ -195,9 +195,9 @@ msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "{appid} 的 {value}' 為無效 {field}。正規表遠格式:{pattern}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "{appid} 的 {value}' 為無效 {field}。正規表遠格式:{pattern}" +msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -750,7 +750,7 @@ msgstr "抓取 '{apkfilename}' 的簽署資料 -> '{sigdir}'" #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "File disappeared while processing it: {path}" -msgstr "檔案 「路徑: {path}」在處理過程中消失了!" +msgstr "檔案 「{path}」在處理過程中消失了" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py @@ -824,14 +824,14 @@ msgid "Found non-file at %s" msgstr "%s 中找到 non-file" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Found {apkfilename} at {url}" -msgstr "在鏈接 {url} 找到了Android軟體程式包 {apkfilename} 。" +msgstr "" #: ../fdroidserver/scanner.py #, fuzzy, python-brace-format msgid "Found {count} problems in {filename}" -msgstr "掃瞄器在 {appid} 發現{count} 個問題:" +msgstr "在 {filename} 發現{count} 個問題" #: ../fdroidserver/scanner.py #, python-brace-format @@ -885,12 +885,12 @@ msgstr "HTTPS 必須與 Subversion 網址一起使用!" #: ../fdroidserver/deploy.py #, fuzzy msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "如果一個 git mirror 變得太大, 允許刪除該 git mirror 的檔案。" +msgstr "如果一個 git mirror 變得太大, 允許刪除該 git mirror 的檔案" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "如果本次上傳失敗, 嘗試手動上傳至 {url} 。" +msgstr "如果本次上傳失敗, 嘗試手動上傳至 {url}" #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format @@ -898,9 +898,9 @@ msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." msgstr "忽略 '{metapath}' 中的 '{field}' , 因為它已經過時了。" #: ../fdroidserver/update.py -#, fuzzy, python-format +#, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" -msgstr "忽略文檔 FUNDING.yml , 文檔大小超過 2048: %s 。" +msgstr "忽略文檔 FUNDING.yml , 文檔大小超過 2048: %s" #: ../fdroidserver/update.py #, python-format @@ -923,17 +923,17 @@ msgstr "包含 APKs 其簽名為有弱點的演算法,如 MD5" #: ../fdroidserver/mirror.py #, fuzzy msgid "Include the PGP signature .asc files in the mirror" -msgstr "在鏡像中加入 PGP 簽名和 .asc 文檔。" +msgstr "在鏡像中加入 PGP 簽名和 .asc 文檔" #: ../fdroidserver/mirror.py #, fuzzy msgid "Include the build logs in the mirror" -msgstr "在鏡像中加入編譯紀錄。" +msgstr "在鏡像中加入編譯紀錄" #: ../fdroidserver/mirror.py #, fuzzy msgid "Include the source tarballs in the mirror" -msgstr "在鏡像中加入軟體的源代碼包。" +msgstr "在鏡像中加入軟體的源代碼包" #: ../fdroidserver/metadata.py #, python-format @@ -993,12 +993,12 @@ msgstr "無效的 VercodeOperation:{field}" #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" -msgstr "無效的 VercodeOperation:{field}" +msgstr "無效的 VercodeOperation:{invalid_ops}" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Invalid application ID {appid}" -msgstr "無效的 application ID {appid} 。" +msgstr "無效的 application ID {appid}" #: ../fdroidserver/metadata.py #, python-format @@ -1027,17 +1027,17 @@ msgstr "無效的重新導向到非 HTTPS:{before}->{after}。 " #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" -msgstr "無效的 scrlib metadata: 檔案 '{file}' 不存在。" +msgstr "無效的 scrlib metadata: 檔案 '{file}' 不存在" #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" -msgstr "無效的 scrlib metadata: 無法解析檔案 '{file}' 。" +msgstr "無效的 scrlib metadata: 無法解析檔案 '{file}'" #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "無效的 scrlib metadata: 檔案 '{file}' 裡有未知的密鑰 '{key}'。" +msgstr "無效的 scrlib metadata: 檔案 '{file}' 裡有未知的密鑰 '{key}'" #: ../fdroidserver/common.py #, python-brace-format @@ -1167,7 +1167,7 @@ msgstr "查無資訊。" #: ../fdroidserver/checkupdates.py #, fuzzy msgid "No matching tags found" -msgstr "查無資訊。" +msgstr "查無資訊" #: ../fdroidserver/update.py #, python-brace-format @@ -1298,7 +1298,7 @@ msgstr "輸出 JSON 到 stdout 。" #: ../fdroidserver/update.py #, fuzzy msgid "Outputting JSON" -msgstr "正在導出 JSON 中 ..." +msgstr "正在導出 JSON 中" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." @@ -1498,7 +1498,7 @@ msgstr "掃描套件包的原始碼" #: ../fdroidserver/scanner.py #, fuzzy, python-brace-format msgid "Scanner found {count} problems in {apk}" -msgstr "掃瞄器在 {appid} 發現{count} 個問題:" +msgstr "掃瞄器在 {apk} 發現{count} 個問題" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1532,7 +1532,7 @@ msgstr "設定時鐘到那時使用:" #: ../fdroidserver/nightly.py #, fuzzy msgid "Set maximum releases in repo before older ones are archived" -msgstr "先設置軟體庫的軟體最大釋出數, 再將舊軟體歸檔。" +msgstr "先設置軟體庫的軟體最大釋出數, 再將舊軟體歸檔" #: ../fdroidserver/build.py #, python-brace-format @@ -1721,7 +1721,7 @@ msgstr "這個許可證標籤不符合預期 \"{}\"! 只能使用 https://spdx #: ../fdroidserver/lint.py #, fuzzy msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "這個許可證標籤不符合預期 \"{}\"! 只能使用你的配置文檔裡面配置好的許可證標籤啦。" +msgstr "這個許可證標籤不符合預期 \"{}\"! 只能使用你的配置文檔裡面配置好的許可證標籤啦" #: ../fdroidserver/common.py #, python-brace-format @@ -1851,12 +1851,12 @@ msgstr "UpdateCheckName 已經被設定成已知的 application id - 它可以 #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" -msgstr "正在將軟體檔案 {apkfilename} 上傳到 androidobservatory.org 。" +msgstr "正在將軟體檔案 {apkfilename} 上傳到 androidobservatory.org" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "Uploading {apkfilename} to virustotal" -msgstr "正在將軟體檔案 {apkfilename} 上傳到 virustotal 。" +msgstr "正在將軟體檔案 {apkfilename} 上傳到 virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2329,7 +2329,7 @@ msgstr "未發現版本資訊!" #: ../fdroidserver/checkupdates.py #, fuzzy msgid "no version information found" -msgstr "未發現版本資訊!" +msgstr "未發現版本資訊" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2658,7 +2658,7 @@ msgstr "{name} \"{section}/icons/{path}\" 不存在! 請檢查 \"config.yml\"." #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "檔案 {oldfile} 已經過時了, 請使用檔案 {newfile} 。" +msgstr "檔案 {oldfile} 已經過時了, 請使用檔案 {newfile}" #: ../fdroidserver/import_subcommand.py #, fuzzy, python-brace-format From 6ab1fd9945a4b89abef822a37e46f64639a36721 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 10 Apr 2024 15:35:59 +0200 Subject: [PATCH 1448/2116] fix UpdateCheckMode string in lint sed -i "s/UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet/UpdateCheckMode is set but it looks like checkupdates hasn't been run yet./g" locale/*/LC_MESSAGES/fdroidserver.po --- fdroidserver/lint.py | 3 +-- locale/ar/LC_MESSAGES/fdroidserver.po | 2 +- locale/az/LC_MESSAGES/fdroidserver.po | 2 +- locale/be/LC_MESSAGES/fdroidserver.po | 2 +- locale/bg/LC_MESSAGES/fdroidserver.po | 2 +- locale/bn/LC_MESSAGES/fdroidserver.po | 2 +- locale/bo/LC_MESSAGES/fdroidserver.po | 2 +- locale/ca/LC_MESSAGES/fdroidserver.po | 2 +- locale/cs/LC_MESSAGES/fdroidserver.po | 2 +- locale/cy/LC_MESSAGES/fdroidserver.po | 2 +- locale/de/LC_MESSAGES/fdroidserver.po | 2 +- locale/el/LC_MESSAGES/fdroidserver.po | 2 +- locale/es/LC_MESSAGES/fdroidserver.po | 2 +- locale/es_AR/LC_MESSAGES/fdroidserver.po | 2 +- locale/es_MX/LC_MESSAGES/fdroidserver.po | 2 +- locale/eu/LC_MESSAGES/fdroidserver.po | 2 +- locale/fa/LC_MESSAGES/fdroidserver.po | 2 +- locale/fi/LC_MESSAGES/fdroidserver.po | 2 +- locale/fr/LC_MESSAGES/fdroidserver.po | 2 +- locale/fy/LC_MESSAGES/fdroidserver.po | 2 +- locale/he/LC_MESSAGES/fdroidserver.po | 2 +- locale/hi/LC_MESSAGES/fdroidserver.po | 2 +- locale/hu/LC_MESSAGES/fdroidserver.po | 2 +- locale/id/LC_MESSAGES/fdroidserver.po | 2 +- locale/it/LC_MESSAGES/fdroidserver.po | 2 +- locale/ja/LC_MESSAGES/fdroidserver.po | 2 +- locale/kab/LC_MESSAGES/fdroidserver.po | 2 +- locale/ko/LC_MESSAGES/fdroidserver.po | 2 +- locale/ml/LC_MESSAGES/fdroidserver.po | 2 +- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 2 +- locale/nl/LC_MESSAGES/fdroidserver.po | 2 +- locale/pl/LC_MESSAGES/fdroidserver.po | 2 +- locale/pt/LC_MESSAGES/fdroidserver.po | 2 +- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 2 +- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 2 +- locale/ro/LC_MESSAGES/fdroidserver.po | 2 +- locale/ru/LC_MESSAGES/fdroidserver.po | 2 +- locale/sk/LC_MESSAGES/fdroidserver.po | 2 +- locale/sq/LC_MESSAGES/fdroidserver.po | 2 +- locale/sr/LC_MESSAGES/fdroidserver.po | 2 +- locale/sv/LC_MESSAGES/fdroidserver.po | 2 +- locale/ta/LC_MESSAGES/fdroidserver.po | 2 +- locale/tr/LC_MESSAGES/fdroidserver.po | 2 +- locale/tzm/LC_MESSAGES/fdroidserver.po | 2 +- locale/ug/LC_MESSAGES/fdroidserver.po | 2 +- locale/uk/LC_MESSAGES/fdroidserver.po | 2 +- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 2 +- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 2 +- 48 files changed, 48 insertions(+), 49 deletions(-) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 150258ad..fd3d99d8 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -378,8 +378,7 @@ def check_checkupdates_ran(app): if filling_ucms.match(app.UpdateCheckMode): if not app.AutoName and not app.CurrentVersion and app.CurrentVersionCode == 0: yield _( - "UpdateCheckMode is set but it looks like" - "checkupdates hasn't been run yet" + "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." ) diff --git a/locale/ar/LC_MESSAGES/fdroidserver.po b/locale/ar/LC_MESSAGES/fdroidserver.po index 0fe9b4a8..7d1392f3 100644 --- a/locale/ar/LC_MESSAGES/fdroidserver.po +++ b/locale/ar/LC_MESSAGES/fdroidserver.po @@ -1790,7 +1790,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/az/LC_MESSAGES/fdroidserver.po b/locale/az/LC_MESSAGES/fdroidserver.po index 7a0cc9ed..83093455 100644 --- a/locale/az/LC_MESSAGES/fdroidserver.po +++ b/locale/az/LC_MESSAGES/fdroidserver.po @@ -1789,7 +1789,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/be/LC_MESSAGES/fdroidserver.po b/locale/be/LC_MESSAGES/fdroidserver.po index 41845221..b77cb05b 100644 --- a/locale/be/LC_MESSAGES/fdroidserver.po +++ b/locale/be/LC_MESSAGES/fdroidserver.po @@ -1789,7 +1789,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/bg/LC_MESSAGES/fdroidserver.po b/locale/bg/LC_MESSAGES/fdroidserver.po index 07b80592..8fd1e130 100644 --- a/locale/bg/LC_MESSAGES/fdroidserver.po +++ b/locale/bg/LC_MESSAGES/fdroidserver.po @@ -1788,7 +1788,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index 08bda543..2edae028 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -1789,7 +1789,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index ba7c2b0c..6b38f446 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -1808,7 +1808,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index a5206737..75ef7307 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -1788,7 +1788,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 5e2a6180..325fd385 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -1812,7 +1812,7 @@ msgstr "UpdateCheckData není platná URL: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode je nastaven, ale vypadá to, že checkupdates ještě nebylo spuštěno" #: ../fdroidserver/lint.py diff --git a/locale/cy/LC_MESSAGES/fdroidserver.po b/locale/cy/LC_MESSAGES/fdroidserver.po index 6b73df22..acb0f7a7 100644 --- a/locale/cy/LC_MESSAGES/fdroidserver.po +++ b/locale/cy/LC_MESSAGES/fdroidserver.po @@ -1808,7 +1808,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 7da5980e..82065e48 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -1824,7 +1824,7 @@ msgstr "UpdateCheckData hat eine ungültige URL: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode ist gesetzt, aber likecheckupdates wurde vermutlich noch nicht ausgeführt" #: ../fdroidserver/lint.py diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index 6596813b..78c086ad 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -1795,7 +1795,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index fdd4f76b..ee4537c8 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -1816,7 +1816,7 @@ msgstr "UpdateCheckData tiene una URL no válida: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode está configurado pero parece que checkupdates aún no se ha ejecutado" #: ../fdroidserver/lint.py diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index 051973b3..26418f0b 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -1805,7 +1805,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/es_MX/LC_MESSAGES/fdroidserver.po b/locale/es_MX/LC_MESSAGES/fdroidserver.po index 4e6cf473..b0c6123e 100644 --- a/locale/es_MX/LC_MESSAGES/fdroidserver.po +++ b/locale/es_MX/LC_MESSAGES/fdroidserver.po @@ -1794,7 +1794,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/eu/LC_MESSAGES/fdroidserver.po b/locale/eu/LC_MESSAGES/fdroidserver.po index 4c5bb86f..25abf06a 100644 --- a/locale/eu/LC_MESSAGES/fdroidserver.po +++ b/locale/eu/LC_MESSAGES/fdroidserver.po @@ -1788,7 +1788,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index b407093e..91ef57e3 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -1792,7 +1792,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index 3eef9708..d6752c20 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -1790,7 +1790,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 2734e9fc..c4c088c7 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -1840,7 +1840,7 @@ msgstr "UpdateCheckData URL non valide : {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode est configuré mais on dirait que checkupdates n'a pas encore été lancé" #: ../fdroidserver/lint.py diff --git a/locale/fy/LC_MESSAGES/fdroidserver.po b/locale/fy/LC_MESSAGES/fdroidserver.po index f2eaa98c..24e158fd 100644 --- a/locale/fy/LC_MESSAGES/fdroidserver.po +++ b/locale/fy/LC_MESSAGES/fdroidserver.po @@ -1789,7 +1789,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/he/LC_MESSAGES/fdroidserver.po b/locale/he/LC_MESSAGES/fdroidserver.po index dd56a66d..56a3b6a9 100644 --- a/locale/he/LC_MESSAGES/fdroidserver.po +++ b/locale/he/LC_MESSAGES/fdroidserver.po @@ -1790,7 +1790,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/hi/LC_MESSAGES/fdroidserver.po b/locale/hi/LC_MESSAGES/fdroidserver.po index fb10baf7..c22eb7f6 100644 --- a/locale/hi/LC_MESSAGES/fdroidserver.po +++ b/locale/hi/LC_MESSAGES/fdroidserver.po @@ -1790,7 +1790,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index b2956f07..6d8924ed 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -1805,7 +1805,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index 41fd7251..9d535001 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -1792,7 +1792,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 24218448..36ddf947 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -1820,7 +1820,7 @@ msgstr "UpdateCheckData non è un URL valido: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode impostato ma sembra che checkupdates non sia ancora stato eseguito" #: ../fdroidserver/lint.py diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 1c0ad633..ecda9fad 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -1786,7 +1786,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index d99be2f1..fc8bfd8b 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -1793,7 +1793,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index 50f509a4..a0692cd8 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -1792,7 +1792,7 @@ msgstr "UpdateCheckData는 올바른 URL이 아닙니다: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/ml/LC_MESSAGES/fdroidserver.po b/locale/ml/LC_MESSAGES/fdroidserver.po index 45da2845..d1c63023 100644 --- a/locale/ml/LC_MESSAGES/fdroidserver.po +++ b/locale/ml/LC_MESSAGES/fdroidserver.po @@ -1797,7 +1797,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index 0040a44c..6a6f3adf 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -1861,7 +1861,7 @@ msgstr "UpdateCheckData er ikke en gyldig nettadresse: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index 1f369c82..3b0270d4 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -1791,7 +1791,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 4d399d85..fc6581a4 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -1811,7 +1811,7 @@ msgstr "UpdateCheckData nie jest prawidłowym adresem URL: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode jest ustawiony, ale wygląda na to, że checkupdates nie został jeszcze uruchomiony" #: ../fdroidserver/lint.py diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index ceaef64f..443f0202 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -1807,7 +1807,7 @@ msgstr "UpdateCheckData não é uma URL válida: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado" #: ../fdroidserver/lint.py diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 7362ddc1..17a65a74 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -1812,7 +1812,7 @@ msgstr "UpdateCheckData não é uma URL válida: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado" #: ../fdroidserver/lint.py diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 796d1dbe..2367e84f 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -1808,7 +1808,7 @@ msgstr "UpdateCheckData não é uma URL válida: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado" #: ../fdroidserver/lint.py diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 9de6149d..2a67a471 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -1811,7 +1811,7 @@ msgstr "UpdateCheckData nu este un URL valid: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode este setat, dar se pare că CheckUpdates nu a fost încă rulat." #: ../fdroidserver/lint.py diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 9964ba19..326884af 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -1819,7 +1819,7 @@ msgstr "UpdateCheckData содержит некорректный URL-адрес #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode настроен, но похоже, что команда checkupdates еще не была запущена" #: ../fdroidserver/lint.py diff --git a/locale/sk/LC_MESSAGES/fdroidserver.po b/locale/sk/LC_MESSAGES/fdroidserver.po index d5022bbd..3c07e0fc 100644 --- a/locale/sk/LC_MESSAGES/fdroidserver.po +++ b/locale/sk/LC_MESSAGES/fdroidserver.po @@ -1791,7 +1791,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index c03ac57a..f04a0fe2 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -1806,7 +1806,7 @@ msgstr "UpdateCheckData s’është URL e vlefshme: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode është ujdisur, por duket sikur checkupdates s’është xhiruar ende" #: ../fdroidserver/lint.py diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index 84710f6e..e691818f 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -1790,7 +1790,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index eff52123..45816768 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -1792,7 +1792,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/ta/LC_MESSAGES/fdroidserver.po b/locale/ta/LC_MESSAGES/fdroidserver.po index d087dc7e..db024df0 100644 --- a/locale/ta/LC_MESSAGES/fdroidserver.po +++ b/locale/ta/LC_MESSAGES/fdroidserver.po @@ -1789,7 +1789,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index 4f65d21e..b1cfbf21 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -1807,7 +1807,7 @@ msgstr "UpdateCheckData geçerli bir URL değil: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode ayarlı ancak checkupdates henüz çalıştırılmamış gibi görünüyor" #: ../fdroidserver/lint.py diff --git a/locale/tzm/LC_MESSAGES/fdroidserver.po b/locale/tzm/LC_MESSAGES/fdroidserver.po index 4969b452..17a0edbf 100644 --- a/locale/tzm/LC_MESSAGES/fdroidserver.po +++ b/locale/tzm/LC_MESSAGES/fdroidserver.po @@ -1789,7 +1789,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/ug/LC_MESSAGES/fdroidserver.po b/locale/ug/LC_MESSAGES/fdroidserver.po index 921c56df..307f1d0c 100644 --- a/locale/ug/LC_MESSAGES/fdroidserver.po +++ b/locale/ug/LC_MESSAGES/fdroidserver.po @@ -1790,7 +1790,7 @@ msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index c3ff404c..a98dea68 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -1814,7 +1814,7 @@ msgstr "UpdateCheckData не є дійсною URL-адресою: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode налаштовано, але схоже, що команду checkupdates ще не було запущено" #: ../fdroidserver/lint.py diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index d0bb0290..76c0cc14 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -1894,7 +1894,7 @@ msgstr "UpdateCheckData 不是有效的网址:{url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "" -"UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +"UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 779085d2..594047c2 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -1840,7 +1840,7 @@ msgstr "UpdateCheckData 不是有效的 URL:{url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py From 1fa376a9dce8acaefe9ffd5bc3b861c08abe78de Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 10 Apr 2024 15:37:15 +0200 Subject: [PATCH 1449/2116] CheckUpdates should be called checkupdates "checkupdates" is an fdroid subcommand, e.g. `fdroid checkupdates`, and it is always spelled all lower case. sed -i 's,CheckUpdates,checkupdates,g' fdroidserver/*.py locale/*/LC_MESSAGES/fdroidserver.po --- locale/ro/LC_MESSAGES/fdroidserver.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 2a67a471..7de8f22c 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -1812,7 +1812,7 @@ msgstr "UpdateCheckData nu este un URL valid: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "UpdateCheckMode este setat, dar se pare că CheckUpdates nu a fost încă rulat." +msgstr "UpdateCheckMode este setat, dar se pare că checkupdates nu a fost încă rulat." #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" From fb33ae58e2c16cf5ccc32f4cbbdc209d7e0bd5f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Mon, 29 Jan 2024 16:10:34 +0100 Subject: [PATCH 1450/2116] =?UTF-8?q?=F0=9F=90=91=20naive=20alt-store=20su?= =?UTF-8?q?pport?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Naive shot at implementing alt store support. Might still be missing important bits and pices I'm not aware of. --- fdroidserver/common.py | 1 + fdroidserver/deploy.py | 1 + fdroidserver/update.py | 50 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 66dd106e..9e1a5340 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4155,6 +4155,7 @@ def is_repo_file(filename, for_gpg_signing=False): if isinstance(filename, str): filename = filename.encode('utf-8', errors="surrogateescape") ignore_files = [ + b'altstore-index.json', b'entry.jar', b'index-v1.jar', b'index.css', diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 2f8c4569..a2c60165 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -71,6 +71,7 @@ def _get_index_excludes(repo_section): """ indexes = [ + os.path.join(repo_section, 'altstore-index.json'), os.path.join(repo_section, 'entry.jar'), os.path.join(repo_section, 'entry.json'), os.path.join(repo_section, 'entry.json.asc'), diff --git a/fdroidserver/update.py b/fdroidserver/update.py index dd3bba50..abbcdb67 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -2390,6 +2390,48 @@ def prepare_apps(apps, apks, repodir): return apps_with_packages +def altstore_index(apps, apks, config, repodir, indent=None): + """build altstore index for iOS (.ipa) apps + + builds index files based on: + https://faq.altstore.io/distribute-your-apps/updating-apps + """ + + for lang in ['en']: + idx = { + 'name': config['repo_name'], + 'description': config['repo_description'], + 'apps': [], + } + + for packageName, app in apps.items(): + # print(app.keys()) + print( app['Name'],'.', app['AutoName']) + versions = [] + for apk in apks: + if apk['packageName'] == packageName and apk.get('apkName', '').lower().endswith('.ipa'): + v = { + "version": apk["versionName"], + # "buildVersion": "1", + "date": apk["added"].strftime("%Y-%m-%d"), + "localizedDescription": "", + "downloadURL": f"{config['repo_url']}/{apk['apkName']}", + "size": apk['size'], + "minOSVersion": "1.0", + "maxOSVersion": "18.0", + } + versions.append(v) + if len(versions) > 0: + idx['apps'].append({ + "name": app.get("Name") or app.get("AutoName"), + 'bundleIdentifier': packageName, + 'versions': versions, + }) + + with open(os.path.join(repodir, f'altstore-index.json'), "w", encoding="utf-8") as f: + json.dump(idx, f, indent=indent) + + config = None options = None start_timestamp = time.gmtime() @@ -2601,6 +2643,14 @@ def main(): # Make the index for the main repo... fdroidserver.index.make(repoapps, apks, repodirs[0], False) + print(repoapps) + altstore_index( + repoapps, + apks, + config, + repodirs[0], + indent=2 if options.pretty else None + ) git_remote = config.get('binary_transparency_remote') if git_remote or os.path.isdir(os.path.join('binary_transparency', '.git')): From 93e7cc9092399a852cc199c5eaf0a4cbec774ae3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Sun, 11 Feb 2024 18:48:25 +0100 Subject: [PATCH 1451/2116] =?UTF-8?q?=F0=9F=93=91=20better=20alt-store=20i?= =?UTF-8?q?ndex?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fdroidserver/update.py | 202 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 182 insertions(+), 20 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index abbcdb67..7f27ae7e 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -544,6 +544,60 @@ def version_string_to_int(version): return major * 10**12 + minor * 10**6 + patch +# iOS app permissions, source: +# https://developer.apple.com/documentation/bundleresources/information_property_list/protected_resources +IPA_PERMISSIONS = [ + "NSBluetoothAlwaysUsageDescription", + "NSBluetoothPeripheralUsageDescription", + "NSCalendarsFullAccessUsageDescription", + "NSCalendarsWriteOnlyAccessUsageDescription", + "NSRemindersFullAccessUsageDescription", + "NSCameraUsageDescription", + "NSMicrophoneUsageDescription", + "NSContactsUsageDescription", + "NSFaceIDUsageDescription", + "NSDesktopFolderUsageDescription", + "NSDocumentsFolderUsageDescription", + "NSDownloadsFolderUsageDescription", + "NSNetworkVolumesUsageDescription", + "NSNetworkVolumesUsageDescription", + "NSRemovableVolumesUsageDescription", + "NSRemovableVolumesUsageDescription", + "NSFileProviderDomainUsageDescription", + "NSGKFriendListUsageDescription", + "NSHealthClinicalHealthRecordsShareUsageDescription", + "NSHealthShareUsageDescription", + "NSHealthUpdateUsageDescription", + "NSHomeKitUsageDescription", + "NSLocationAlwaysAndWhenInUseUsageDescription", + "NSLocationUsageDescription", + "NSLocationWhenInUseUsageDescription", + "NSLocationAlwaysUsageDescription", + "NSAppleMusicUsageDescription", + "NSMotionUsageDescription", + "NSFallDetectionUsageDescription", + "NSLocalNetworkUsageDescription", + "NSNearbyInteractionUsageDescription", + "NSNearbyInteractionAllowOnceUsageDescription", + "NFCReaderUsageDescription", + "NSPhotoLibraryAddUsageDescription", + "NSPhotoLibraryUsageDescription", + "NSAppDataUsageDescription", + "NSUserTrackingUsageDescription", + "NSAppleEventsUsageDescription", + "NSSystemAdministrationUsageDescription", + "NSSensorKitUsageDescription", + "NSSiriUsageDescription", + "NSSpeechRecognitionUsageDescription", + "NSVideoSubscriberAccountUsageDescription", + "NSWorldSensingUsageDescription", + "NSHandsTrackingUsageDescription", + "NSIdentityUsageDescription", + "NSCalendarsUsageDescription", + "NSRemindersUsageDescription", +] + + def parse_ipa(ipa_path, file_size, sha256): from biplist import readPlist @@ -559,10 +613,17 @@ def parse_ipa(ipa_path, file_size, sha256): if re.match("Payload/[^/]*.app/Info.plist", info.filename): with ipa_zip.open(info) as plist_file: plist = readPlist(plist_file) + ipa["name"] = plist['CFBundleName'] ipa["packageName"] = plist["CFBundleIdentifier"] # https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring ipa["versionCode"] = version_string_to_int(plist["CFBundleShortVersionString"]) ipa["versionName"] = plist["CFBundleShortVersionString"] + ipa["ipa_MinimumOSVersion"] = plist['MinimumOSVersion'] + ipa["ipa_DTPlatformVersion"] = plist['DTPlatformVersion'] + ipa["ipa_permissions"] = {} + for ipap in IPA_PERMISSIONS: + if ipap in plist: + ipa["ipa_permissions"][ipap] = str(plist[ipap]) return ipa @@ -1351,6 +1412,21 @@ def insert_localized_ios_app_metadata(apps_with_packages): screenshots = fdroidserver.update.discover_ios_screenshots(fastlane_dir) fdroidserver.update.copy_ios_screenshots_to_repo(screenshots, package_name) + # lookup icons, copy them and put them into app + icon_path = _get_ipa_icon(pathlib.Path('build') / package_name) + icon_dest = pathlib.Path('repo') / package_name / f'icon.png' # for now just assume png + icon_stat = os.stat(icon_path) + app['iconv2'] = { + DEFAULT_LOCALE: { + 'name': str(icon_dest).lstrip('repo'), + 'sha256': common.sha256sum(icon_dest), + 'size': icon_stat.st_size, + } + } + if not icon_dest.exists(): + icon_dest.parent.mkdir(parents=True, exist_ok=True) + shutil.copy(icon_path, icon_dest) + def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False): """Scan a repo for all files with an extension except APK/OBB/IPA. @@ -1548,6 +1624,55 @@ def _get_apk_icons_src(apkfile, icon_name): return icons_src +def _get_ipa_icon(src_dir): + """Searches source directory of an IPA project and tires to find an app icon.""" + # parse app icon name from project config file + src_dir = pathlib.Path(src_dir) + prj = next(src_dir.glob("**/project.pbxproj"), None) + if not prj or not prj.exists(): + return + + icon_name = _parse_from_pbxproj(prj, 'ASSETCATALOG_COMPILER_APPICON_NAME') + if not icon_name: + return + + icon_dir = next(src_dir.glob(f'**/{icon_name}.appiconset'), None) + if not icon_dir: + return + + with open(icon_dir / "Contents.json") as f: + cntnt = json.load(f) + + fname = None + fsize = 0 + for image in cntnt['images']: + s = float(image.get("size", "0x0").split("x")[0]) + if image.get('scale') == "1x" and s > fsize and s <= 128: + fname = image['filename'] + fsize = s + + return str(icon_dir / fname) + + +def _parse_from_pbxproj(pbxproj_path, key): + """Parse values from apple project files. + + e.g. when looking for key 'ASSETCATALOG_COMPILER_APPICON_NAME' + This function will extract 'MyIcon' from if the provided file + contains this line: + + ASSETCATALOG_COMPILER_APPICON_NAME = MyIcon; + + returns None if parsing for that value didn't yield anything + """ + r = re.compile(f"\\s*{key}\\s*=\\s*(?P[a-zA-Z0-9-_]+)\\s*;\\s*") + with open(pbxproj_path, 'r', encoding='utf-8') as f: + for line in f.readlines(): + m = r.match(line) + if m: + return m.group("value") + return None + def _sanitize_sdk_version(value): """Sanitize the raw values from androguard to handle bad values. @@ -2394,42 +2519,80 @@ def altstore_index(apps, apks, config, repodir, indent=None): """build altstore index for iOS (.ipa) apps builds index files based on: + https://faq.altstore.io/distribute-your-apps/make-a-source https://faq.altstore.io/distribute-your-apps/updating-apps """ + # for now we only support english for alt-store for lang in ['en']: + + # prepare minimal altstore index idx = { 'name': config['repo_name'], - 'description': config['repo_description'], - 'apps': [], + "apps": [], + "news": [], } + # add optional values if available + # idx["subtitle"] F-Droid doesn't have a corresponding value + if config.get("repo_description"): + idx['description'] = config['repo_description'] + if (pathlib.Path(repodir) / 'icons' / config['repo_icon']).exists(): + idx['iconURL'] = f"{config['repo_url']}/icons/{config['repo_icon']}" + # idx["headerURL"] F-Droid doesn't have a corresponding value + # idx["website"] F-Droid doesn't have a corresponding value + # idx["patreonURL"] F-Droid doesn't have a corresponding value + # idx["tintColor"] F-Droid doesn't have a corresponding value + # idx["featuredApps"] = [] maybe mappable to F-Droids what's new? + + # assemble "apps" for packageName, app in apps.items(): - # print(app.keys()) - print( app['Name'],'.', app['AutoName']) - versions = [] + app_name = app.get("Name") or app.get("AutoName") + a = { + "name": app_name, + 'bundleIdentifier': packageName, + 'developerName': app.get("AuthorName") or f"{app_name} team", + 'iconURL': app.get('iconv2', {}).get(DEFAULT_LOCALE, {}).get('name', ''), + "localizedDescription": "", + 'appPermissions': { + "entitlements": [], + "privacy": {}, + }, + 'versions': [], + } + + if app.get('summary'): + a['subtitle'] = app['summary'] + # a["tintColor"] F-Droid doesn't have a corresponding value + # a["category"] F-Droid doesn't have a corresponding value + # a['patreon'] F-Droid doesn't have a corresponding value + # a["screenshots"] TODO + + # populate 'versions' for apk in apks: if apk['packageName'] == packageName and apk.get('apkName', '').lower().endswith('.ipa'): v = { "version": apk["versionName"], - # "buildVersion": "1", - "date": apk["added"].strftime("%Y-%m-%d"), - "localizedDescription": "", + "date": apk["added"].isoformat(), "downloadURL": f"{config['repo_url']}/{apk['apkName']}", "size": apk['size'], - "minOSVersion": "1.0", - "maxOSVersion": "18.0", } - versions.append(v) - if len(versions) > 0: - idx['apps'].append({ - "name": app.get("Name") or app.get("AutoName"), - 'bundleIdentifier': packageName, - 'versions': versions, - }) - with open(os.path.join(repodir, f'altstore-index.json'), "w", encoding="utf-8") as f: - json.dump(idx, f, indent=indent) + # v['localizedDescription'] maybe what's new text? + v["minOSVersion"] = apk["ipa_MinimumOSVersion"] + v["maxOSVersion"] = apk["ipa_DTPlatformVersion"] + + # writing this spot here has the effect that always the + # permissions of the latest processed permissions list used + a['appPermissions']['privacy'] = apk['ipa_permissions'] + + a['versions'].append(v) + + if len(a['versions']) > 0: + idx['apps'].append(a) + + with open(os.path.join(repodir, f'altstore-index.json'), "w", encoding="utf-8") as f: + json.dump(idx, f, indent=indent) config = None @@ -2643,7 +2806,6 @@ def main(): # Make the index for the main repo... fdroidserver.index.make(repoapps, apks, repodirs[0], False) - print(repoapps) altstore_index( repoapps, apks, From 519c3c1fcfd69cdc6d44a514b397adee3aa16f39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Mon, 12 Feb 2024 19:16:40 +0100 Subject: [PATCH 1452/2116] =?UTF-8?q?=F0=9F=91=91=20altstore=20index:=20ad?= =?UTF-8?q?d=20entitlement=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fdroidserver/update.py | 168 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 160 insertions(+), 8 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 7f27ae7e..75cee8b7 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -598,6 +598,147 @@ IPA_PERMISSIONS = [ ] +# known iOS app entitlements, source: +# https://developer.apple.com/documentation/bundleresources/entitlements +IPA_ENTITLEMENTS = [ + b"aps-environment", + b"com.apple.developer.ClassKit-environment", + b"com.apple.developer.applesignin", + b"com.apple.developer.aps-environment", + b"com.apple.developer.associated-appclip-app-identifiers", + b"com.apple.developer.associated-domains", + b"com.apple.developer.associated-domains.applinks.read-write", + b"com.apple.developer.authentication-services.autofill-credential-provider", + b"com.apple.developer.automated-device-enrollment.add-devices", + b"com.apple.developer.automatic-assessment-configuration", + b"com.apple.developer.avfoundation.multitasking-camera-access", + b"com.apple.developer.browser.app-installation", + b"com.apple.developer.carplay-audio", + b"com.apple.developer.carplay-charging", + b"com.apple.developer.carplay-communication", + b"com.apple.developer.carplay-maps", + b"com.apple.developer.carplay-messaging", + b"com.apple.developer.carplay-parking", + b"com.apple.developer.carplay-quick-ordering", + b"com.apple.developer.contacts.notes", + b"com.apple.developer.default-data-protection", + b"com.apple.developer.device-information.user-assigned-device-name", + b"com.apple.developer.devicecheck.appattest-environment", + b"com.apple.developer.driverkit", + b"com.apple.developer.driverkit.allow-any-userclient-access", + b"com.apple.developer.driverkit.allow-third-party-userclients", + b"com.apple.developer.driverkit.communicates-with-drivers", + b"com.apple.developer.driverkit.family.audio", + b"com.apple.developer.driverkit.family.block-storage-device", + b"com.apple.developer.driverkit.family.hid.device", + b"com.apple.developer.driverkit.family.hid.eventservice", + b"com.apple.developer.driverkit.family.networking", + b"com.apple.developer.driverkit.family.scsicontroller", + b"com.apple.developer.driverkit.family.serial", + b"com.apple.developer.driverkit.transport.hid", + b"com.apple.developer.driverkit.transport.pci", + b"com.apple.developer.driverkit.transport.usb", + b"com.apple.developer.driverkit.userclient-access", + b"com.apple.developer.endpoint-security.client", + b"com.apple.developer.endpoint-security.client", + b"com.apple.developer.exposure-notification", + b"com.apple.developer.family-controls", + b"com.apple.developer.fileprovider.testing-mode", + b"com.apple.developer.game-center", + b"com.apple.developer.group-session", + b"com.apple.developer.healthkit", + b"com.apple.developer.healthkit.access", + b"com.apple.developer.healthkit.background-delivery", + b"com.apple.developer.healthkit.recalibrate-estimates", + b"com.apple.developer.hid.virtual.device", + b"com.apple.developer.homekit", + b"com.apple.developer.icloud-container-development-container-identifiers", + b"com.apple.developer.icloud-container-environment", + b"com.apple.developer.icloud-container-identifiers", + b"com.apple.developer.icloud-services", + b"com.apple.developer.in-app-identity-presentment", + b"com.apple.developer.in-app-identity-presentment.merchant-identifiers", + b"com.apple.developer.in-app-payments", + b"com.apple.developer.journal.allow", + b"com.apple.developer.kernel.extended-virtual-addressing", + b"com.apple.developer.kernel.increased-memory-limit", + b"com.apple.developer.location.push", + b"com.apple.developer.mail-client", + b"com.apple.developer.managed-app-distribution.install-ui", + b"com.apple.developer.maps", + b"com.apple.developer.marketplace.app-installation", + b"com.apple.developer.matter.allow-setup-payload", + b"com.apple.developer.media-device-discovery-extension", + b"com.apple.developer.networking.HotspotConfiguration", + b"com.apple.developer.networking.custom-protocol", + b"com.apple.developer.networking.manage-thread-network-credentials", + b"com.apple.developer.networking.multicast", + b"com.apple.developer.networking.multipath", + b"com.apple.developer.networking.networkextension", + b"com.apple.developer.networking.networkextension", + b"com.apple.developer.networking.slicing.appcategory", + b"com.apple.developer.networking.slicing.trafficcategory", + b"com.apple.developer.networking.vmnet", + b"com.apple.developer.networking.vpn.api", + b"com.apple.developer.networking.wifi-info", + b"com.apple.developer.nfc.hce", + b"com.apple.developer.nfc.hce.default-contactless-app", + b"com.apple.developer.nfc.hce.iso7816.select-identifier-prefixes", + b"com.apple.developer.nfc.readersession.formats", + b"com.apple.developer.on-demand-install-capable", + b"com.apple.developer.parent-application-identifiers", + b"com.apple.developer.pass-type-identifiers", + b"com.apple.developer.playable-content", + b"com.apple.developer.proximity-reader.identity.display", + b"com.apple.developer.proximity-reader.identity.read", + b"com.apple.developer.push-to-talk", + b"com.apple.developer.sensitivecontentanalysis.client", + b"com.apple.developer.sensorkit.reader.allow", + b"com.apple.developer.severe-vehicular-crash-event", + b"com.apple.developer.siri", + b"com.apple.developer.storekit.external-link.account", + b"com.apple.developer.storekit.external-purchase", + b"com.apple.developer.storekit.external-purchase-link", + b"com.apple.developer.sustained-execution", + b"com.apple.developer.system-extension.install", + b"com.apple.developer.system-extension.redistributable", + b"com.apple.developer.team-identifier", + b"com.apple.developer.ubiquity-kvstore-identifier", + b"com.apple.developer.upi-device-validation", + b"com.apple.developer.user-management", + b"com.apple.developer.usernotifications.filtering", + b"com.apple.developer.video-subscriber-single-sign-on", + b"com.apple.developer.weatherkit", + b"com.apple.developer.web-browser", + b"com.apple.developer.web-browser.public-key-credential", + b"com.apple.external-accessory.wireless-configuration", + b"com.apple.security.app-sandbox", + b"com.apple.security.application-groups", + b"com.apple.security.automation.apple-events", + b"com.apple.security.cs.allow-dyld-environment-variables", + b"com.apple.security.cs.allow-jit", + b"com.apple.security.cs.allow-unsigned-executable-memory", + b"com.apple.security.cs.debugger", + b"com.apple.security.cs.disable-executable-page-protection", + b"com.apple.security.cs.disable-library-validation", + b"com.apple.security.device.audio-input", + b"com.apple.security.device.camera", + b"com.apple.security.hypervisor", + b"com.apple.security.personal-information.addressbook", + b"com.apple.security.personal-information.calendars", + b"com.apple.security.personal-information.location", + b"com.apple.security.personal-information.photos-library", + b"com.apple.security.smartcard", + b"com.apple.security.virtualization", + b"com.apple.smoot.subscriptionservice", + b"com.apple.vm.device-access", + b"com.apple.vm.hypervisor", + b"com.apple.vm.networking", + b"inter-app-audio", + b"keychain-access-groups", +] + + def parse_ipa(ipa_path, file_size, sha256): from biplist import readPlist @@ -606,6 +747,8 @@ def parse_ipa(ipa_path, file_size, sha256): "hash": sha256, "hashType": "sha256", "size": file_size, + "ipa_entitlements": set(), + "ipa_permissions": {}, } with zipfile.ZipFile(ipa_path) as ipa_zip: @@ -620,10 +763,17 @@ def parse_ipa(ipa_path, file_size, sha256): ipa["versionName"] = plist["CFBundleShortVersionString"] ipa["ipa_MinimumOSVersion"] = plist['MinimumOSVersion'] ipa["ipa_DTPlatformVersion"] = plist['DTPlatformVersion'] - ipa["ipa_permissions"] = {} for ipap in IPA_PERMISSIONS: if ipap in plist: ipa["ipa_permissions"][ipap] = str(plist[ipap]) + if info.filename.endswith("/embedded.mobileprovision"): + print("parsing", info.filename) + with ipa_zip.open(info) as mopro: + for line in mopro.readlines(): + for entitlement in IPA_ENTITLEMENTS: + if entitlement in line: + ipa['ipa_entitlements'].add(str(entitlement, encoding="utf-8")) + return ipa @@ -1414,7 +1564,7 @@ def insert_localized_ios_app_metadata(apps_with_packages): # lookup icons, copy them and put them into app icon_path = _get_ipa_icon(pathlib.Path('build') / package_name) - icon_dest = pathlib.Path('repo') / package_name / f'icon.png' # for now just assume png + icon_dest = pathlib.Path('repo') / package_name / 'icon.png' # for now just assume png icon_stat = os.stat(icon_path) app['iconv2'] = { DEFAULT_LOCALE: { @@ -1625,7 +1775,7 @@ def _get_apk_icons_src(apkfile, icon_name): def _get_ipa_icon(src_dir): - """Searches source directory of an IPA project and tires to find an app icon.""" + """Search source directory of an IPA project for the app icon.""" # parse app icon name from project config file src_dir = pathlib.Path(src_dir) prj = next(src_dir.glob("**/project.pbxproj"), None) @@ -1673,6 +1823,7 @@ def _parse_from_pbxproj(pbxproj_path, key): return m.group("value") return None + def _sanitize_sdk_version(value): """Sanitize the raw values from androguard to handle bad values. @@ -2516,14 +2667,14 @@ def prepare_apps(apps, apks, repodir): def altstore_index(apps, apks, config, repodir, indent=None): - """build altstore index for iOS (.ipa) apps + """ + Assemble altstore-index.json for iOS (.ipa) apps. builds index files based on: https://faq.altstore.io/distribute-your-apps/make-a-source https://faq.altstore.io/distribute-your-apps/updating-apps """ - - # for now we only support english for alt-store + # for now alt-store support is english only for lang in ['en']: # prepare minimal altstore index @@ -2555,7 +2706,7 @@ def altstore_index(apps, apks, config, repodir, indent=None): 'iconURL': app.get('iconv2', {}).get(DEFAULT_LOCALE, {}).get('name', ''), "localizedDescription": "", 'appPermissions': { - "entitlements": [], + "entitlements": set(), "privacy": {}, }, 'versions': [], @@ -2585,13 +2736,14 @@ def altstore_index(apps, apks, config, repodir, indent=None): # writing this spot here has the effect that always the # permissions of the latest processed permissions list used a['appPermissions']['privacy'] = apk['ipa_permissions'] + a['appPermissions']['entitlements'] = list(apk['ipa_entitlements']) a['versions'].append(v) if len(a['versions']) > 0: idx['apps'].append(a) - with open(os.path.join(repodir, f'altstore-index.json'), "w", encoding="utf-8") as f: + with open(os.path.join(repodir, 'altstore-index.json'), "w", encoding="utf-8") as f: json.dump(idx, f, indent=indent) From 2658c229339c08d8acad0e7190ca9584f28f6fd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Sun, 10 Mar 2024 10:33:51 +0100 Subject: [PATCH 1453/2116] =?UTF-8?q?=F0=9F=96=BC=EF=B8=8F=20altstore=20in?= =?UTF-8?q?dex=20screenshots=20and=20icons?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fdroidserver/update.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 75cee8b7..54fb324c 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -2699,11 +2699,22 @@ def altstore_index(apps, apks, config, repodir, indent=None): # assemble "apps" for packageName, app in apps.items(): app_name = app.get("Name") or app.get("AutoName") + icon_url = "{}{}".format( + config['repo_url'], + app.get('iconv2', {}).get(DEFAULT_LOCALE, {}).get('name', ''), + ) + screenshot_urls = [ + "{}{}".format(config["repo_url"], s["name"]) + for s in app.get("screenshots", {}) + .get("phone", {}) + .get(DEFAULT_LOCALE, {}) + ] + a = { "name": app_name, 'bundleIdentifier': packageName, 'developerName': app.get("AuthorName") or f"{app_name} team", - 'iconURL': app.get('iconv2', {}).get(DEFAULT_LOCALE, {}).get('name', ''), + 'iconURL': icon_url, "localizedDescription": "", 'appPermissions': { "entitlements": set(), @@ -2717,7 +2728,7 @@ def altstore_index(apps, apks, config, repodir, indent=None): # a["tintColor"] F-Droid doesn't have a corresponding value # a["category"] F-Droid doesn't have a corresponding value # a['patreon'] F-Droid doesn't have a corresponding value - # a["screenshots"] TODO + a["screenshots"] = screenshot_urls # populate 'versions' for apk in apks: From 301f0c82737f004caeb8e6278c2248808a3c88b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Mon, 11 Mar 2024 03:11:53 +0100 Subject: [PATCH 1454/2116] =?UTF-8?q?=F0=9F=8D=8E=20altstore:=20implement?= =?UTF-8?q?=20ipa=20entitlement=20parser?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This adds a parser for reading entitlement values from .ipa files. Entitlement values are stored in files called '.../embedded.mobileprovision' packed into .ipa files. These are CMS signed plist files. https://en.wikipedia.org/wiki/Cryptographic_Message_Syntax This also ignores the 2 non-optional entitlements, as mentioned in altstore docs: https://faq.altstore.io/distribute-your-apps/make-a-source#entitlements-array-of-strings --- fdroidserver/update.py | 169 ++++------------------------------------- 1 file changed, 16 insertions(+), 153 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 54fb324c..cbf68d76 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -34,6 +34,7 @@ import json import time import yaml import copy +import asn1crypto.cms import defusedxml.ElementTree as ElementTree from datetime import datetime, timezone from argparse import ArgumentParser @@ -598,149 +599,8 @@ IPA_PERMISSIONS = [ ] -# known iOS app entitlements, source: -# https://developer.apple.com/documentation/bundleresources/entitlements -IPA_ENTITLEMENTS = [ - b"aps-environment", - b"com.apple.developer.ClassKit-environment", - b"com.apple.developer.applesignin", - b"com.apple.developer.aps-environment", - b"com.apple.developer.associated-appclip-app-identifiers", - b"com.apple.developer.associated-domains", - b"com.apple.developer.associated-domains.applinks.read-write", - b"com.apple.developer.authentication-services.autofill-credential-provider", - b"com.apple.developer.automated-device-enrollment.add-devices", - b"com.apple.developer.automatic-assessment-configuration", - b"com.apple.developer.avfoundation.multitasking-camera-access", - b"com.apple.developer.browser.app-installation", - b"com.apple.developer.carplay-audio", - b"com.apple.developer.carplay-charging", - b"com.apple.developer.carplay-communication", - b"com.apple.developer.carplay-maps", - b"com.apple.developer.carplay-messaging", - b"com.apple.developer.carplay-parking", - b"com.apple.developer.carplay-quick-ordering", - b"com.apple.developer.contacts.notes", - b"com.apple.developer.default-data-protection", - b"com.apple.developer.device-information.user-assigned-device-name", - b"com.apple.developer.devicecheck.appattest-environment", - b"com.apple.developer.driverkit", - b"com.apple.developer.driverkit.allow-any-userclient-access", - b"com.apple.developer.driverkit.allow-third-party-userclients", - b"com.apple.developer.driverkit.communicates-with-drivers", - b"com.apple.developer.driverkit.family.audio", - b"com.apple.developer.driverkit.family.block-storage-device", - b"com.apple.developer.driverkit.family.hid.device", - b"com.apple.developer.driverkit.family.hid.eventservice", - b"com.apple.developer.driverkit.family.networking", - b"com.apple.developer.driverkit.family.scsicontroller", - b"com.apple.developer.driverkit.family.serial", - b"com.apple.developer.driverkit.transport.hid", - b"com.apple.developer.driverkit.transport.pci", - b"com.apple.developer.driverkit.transport.usb", - b"com.apple.developer.driverkit.userclient-access", - b"com.apple.developer.endpoint-security.client", - b"com.apple.developer.endpoint-security.client", - b"com.apple.developer.exposure-notification", - b"com.apple.developer.family-controls", - b"com.apple.developer.fileprovider.testing-mode", - b"com.apple.developer.game-center", - b"com.apple.developer.group-session", - b"com.apple.developer.healthkit", - b"com.apple.developer.healthkit.access", - b"com.apple.developer.healthkit.background-delivery", - b"com.apple.developer.healthkit.recalibrate-estimates", - b"com.apple.developer.hid.virtual.device", - b"com.apple.developer.homekit", - b"com.apple.developer.icloud-container-development-container-identifiers", - b"com.apple.developer.icloud-container-environment", - b"com.apple.developer.icloud-container-identifiers", - b"com.apple.developer.icloud-services", - b"com.apple.developer.in-app-identity-presentment", - b"com.apple.developer.in-app-identity-presentment.merchant-identifiers", - b"com.apple.developer.in-app-payments", - b"com.apple.developer.journal.allow", - b"com.apple.developer.kernel.extended-virtual-addressing", - b"com.apple.developer.kernel.increased-memory-limit", - b"com.apple.developer.location.push", - b"com.apple.developer.mail-client", - b"com.apple.developer.managed-app-distribution.install-ui", - b"com.apple.developer.maps", - b"com.apple.developer.marketplace.app-installation", - b"com.apple.developer.matter.allow-setup-payload", - b"com.apple.developer.media-device-discovery-extension", - b"com.apple.developer.networking.HotspotConfiguration", - b"com.apple.developer.networking.custom-protocol", - b"com.apple.developer.networking.manage-thread-network-credentials", - b"com.apple.developer.networking.multicast", - b"com.apple.developer.networking.multipath", - b"com.apple.developer.networking.networkextension", - b"com.apple.developer.networking.networkextension", - b"com.apple.developer.networking.slicing.appcategory", - b"com.apple.developer.networking.slicing.trafficcategory", - b"com.apple.developer.networking.vmnet", - b"com.apple.developer.networking.vpn.api", - b"com.apple.developer.networking.wifi-info", - b"com.apple.developer.nfc.hce", - b"com.apple.developer.nfc.hce.default-contactless-app", - b"com.apple.developer.nfc.hce.iso7816.select-identifier-prefixes", - b"com.apple.developer.nfc.readersession.formats", - b"com.apple.developer.on-demand-install-capable", - b"com.apple.developer.parent-application-identifiers", - b"com.apple.developer.pass-type-identifiers", - b"com.apple.developer.playable-content", - b"com.apple.developer.proximity-reader.identity.display", - b"com.apple.developer.proximity-reader.identity.read", - b"com.apple.developer.push-to-talk", - b"com.apple.developer.sensitivecontentanalysis.client", - b"com.apple.developer.sensorkit.reader.allow", - b"com.apple.developer.severe-vehicular-crash-event", - b"com.apple.developer.siri", - b"com.apple.developer.storekit.external-link.account", - b"com.apple.developer.storekit.external-purchase", - b"com.apple.developer.storekit.external-purchase-link", - b"com.apple.developer.sustained-execution", - b"com.apple.developer.system-extension.install", - b"com.apple.developer.system-extension.redistributable", - b"com.apple.developer.team-identifier", - b"com.apple.developer.ubiquity-kvstore-identifier", - b"com.apple.developer.upi-device-validation", - b"com.apple.developer.user-management", - b"com.apple.developer.usernotifications.filtering", - b"com.apple.developer.video-subscriber-single-sign-on", - b"com.apple.developer.weatherkit", - b"com.apple.developer.web-browser", - b"com.apple.developer.web-browser.public-key-credential", - b"com.apple.external-accessory.wireless-configuration", - b"com.apple.security.app-sandbox", - b"com.apple.security.application-groups", - b"com.apple.security.automation.apple-events", - b"com.apple.security.cs.allow-dyld-environment-variables", - b"com.apple.security.cs.allow-jit", - b"com.apple.security.cs.allow-unsigned-executable-memory", - b"com.apple.security.cs.debugger", - b"com.apple.security.cs.disable-executable-page-protection", - b"com.apple.security.cs.disable-library-validation", - b"com.apple.security.device.audio-input", - b"com.apple.security.device.camera", - b"com.apple.security.hypervisor", - b"com.apple.security.personal-information.addressbook", - b"com.apple.security.personal-information.calendars", - b"com.apple.security.personal-information.location", - b"com.apple.security.personal-information.photos-library", - b"com.apple.security.smartcard", - b"com.apple.security.virtualization", - b"com.apple.smoot.subscriptionservice", - b"com.apple.vm.device-access", - b"com.apple.vm.hypervisor", - b"com.apple.vm.networking", - b"inter-app-audio", - b"keychain-access-groups", -] - - def parse_ipa(ipa_path, file_size, sha256): - from biplist import readPlist + import biplist ipa = { "apkName": os.path.basename(ipa_path), @@ -755,7 +615,7 @@ def parse_ipa(ipa_path, file_size, sha256): for info in ipa_zip.infolist(): if re.match("Payload/[^/]*.app/Info.plist", info.filename): with ipa_zip.open(info) as plist_file: - plist = readPlist(plist_file) + plist = biplist.readPlist(plist_file) ipa["name"] = plist['CFBundleName'] ipa["packageName"] = plist["CFBundleIdentifier"] # https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring @@ -768,12 +628,15 @@ def parse_ipa(ipa_path, file_size, sha256): ipa["ipa_permissions"][ipap] = str(plist[ipap]) if info.filename.endswith("/embedded.mobileprovision"): print("parsing", info.filename) - with ipa_zip.open(info) as mopro: - for line in mopro.readlines(): - for entitlement in IPA_ENTITLEMENTS: - if entitlement in line: - ipa['ipa_entitlements'].add(str(entitlement, encoding="utf-8")) - + with ipa_zip.open(info) as mopro_file: + mopro_content_info = cms.ContentInfo.load(mopro_file.read()) + mopro_payload_info = mopro_content_info['content'] + mopro_payload = mopro_payload_info['encap_content_info']['content'].native + mopro = biplist.readPlistFromString(mopro_payload) + # https://faq.altstore.io/distribute-your-apps/make-a-source#entitlements-array-of-strings + for entitlement in mopro.get('Entitlements', {}).keys(): + if entitlement not in ["com.app.developer.team-identifier", 'application-identifier']: + ipa["ipa_entitlements"].add(entitlement) return ipa @@ -1563,8 +1426,8 @@ def insert_localized_ios_app_metadata(apps_with_packages): fdroidserver.update.copy_ios_screenshots_to_repo(screenshots, package_name) # lookup icons, copy them and put them into app - icon_path = _get_ipa_icon(pathlib.Path('build') / package_name) - icon_dest = pathlib.Path('repo') / package_name / 'icon.png' # for now just assume png + icon_path = _get_ipa_icon(Path('build') / package_name) + icon_dest = Path('repo') / package_name / 'icon.png' # for now just assume png icon_stat = os.stat(icon_path) app['iconv2'] = { DEFAULT_LOCALE: { @@ -1777,7 +1640,7 @@ def _get_apk_icons_src(apkfile, icon_name): def _get_ipa_icon(src_dir): """Search source directory of an IPA project for the app icon.""" # parse app icon name from project config file - src_dir = pathlib.Path(src_dir) + src_dir = Path(src_dir) prj = next(src_dir.glob("**/project.pbxproj"), None) if not prj or not prj.exists(): return @@ -2688,7 +2551,7 @@ def altstore_index(apps, apks, config, repodir, indent=None): # idx["subtitle"] F-Droid doesn't have a corresponding value if config.get("repo_description"): idx['description'] = config['repo_description'] - if (pathlib.Path(repodir) / 'icons' / config['repo_icon']).exists(): + if (Path(repodir) / 'icons' / config['repo_icon']).exists(): idx['iconURL'] = f"{config['repo_url']}/icons/{config['repo_icon']}" # idx["headerURL"] F-Droid doesn't have a corresponding value # idx["website"] F-Droid doesn't have a corresponding value From a21ed3911700a1dbfc559570a328867a3a66bc77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 4 Apr 2024 11:16:18 +0200 Subject: [PATCH 1455/2116] =?UTF-8?q?=F0=9F=9B=BB=20move=20alstore=20index?= =?UTF-8?q?=20function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move function for generating altstore index from update.py to index.py --- fdroidserver/index.py | 99 ++++++++++++++++++++++++++++++++++++++++++ fdroidserver/update.py | 99 ------------------------------------------ 2 files changed, 99 insertions(+), 99 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 69237149..fb8a573f 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -125,6 +125,13 @@ def make(apps, apks, repodir, archive): make_v2(sortedapps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fingerprints, archive) make_website(sortedapps, repodir, repodict) + make_altstore( + sortedapps, + apks, + common.config, + repodir, + indent=2 if common.options.pretty else None + ) def _should_file_be_generated(path, magic_string): @@ -1750,3 +1757,95 @@ def get_public_key_from_jar(jar): public_key_fingerprint = common.get_cert_fingerprint(public_key).replace(' ', '') return public_key, public_key_fingerprint + + +def make_altstore(apps, apks, config, repodir, indent=None): + """ + Assemble altstore-index.json for iOS (.ipa) apps. + + builds index files based on: + https://faq.altstore.io/distribute-your-apps/make-a-source + https://faq.altstore.io/distribute-your-apps/updating-apps + """ + # for now alt-store support is english only + for lang in ['en']: + + # prepare minimal altstore index + idx = { + 'name': config['repo_name'], + "apps": [], + "news": [], + } + + # add optional values if available + # idx["subtitle"] F-Droid doesn't have a corresponding value + if config.get("repo_description"): + idx['description'] = config['repo_description'] + if (Path(repodir) / 'icons' / config['repo_icon']).exists(): + idx['iconURL'] = f"{config['repo_url']}/icons/{config['repo_icon']}" + # idx["headerURL"] F-Droid doesn't have a corresponding value + # idx["website"] F-Droid doesn't have a corresponding value + # idx["patreonURL"] F-Droid doesn't have a corresponding value + # idx["tintColor"] F-Droid doesn't have a corresponding value + # idx["featuredApps"] = [] maybe mappable to F-Droids what's new? + + # assemble "apps" + for packageName, app in apps.items(): + app_name = app.get("Name") or app.get("AutoName") + icon_url = "{}{}".format( + config['repo_url'], + app.get('iconv2', {}).get(DEFAULT_LOCALE, {}).get('name', ''), + ) + screenshot_urls = [ + "{}{}".format(config["repo_url"], s["name"]) + for s in app.get("screenshots", {}) + .get("phone", {}) + .get(DEFAULT_LOCALE, {}) + ] + + a = { + "name": app_name, + 'bundleIdentifier': packageName, + 'developerName': app.get("AuthorName") or f"{app_name} team", + 'iconURL': icon_url, + "localizedDescription": "", + 'appPermissions': { + "entitlements": set(), + "privacy": {}, + }, + 'versions': [], + } + + if app.get('summary'): + a['subtitle'] = app['summary'] + # a["tintColor"] F-Droid doesn't have a corresponding value + # a["category"] F-Droid doesn't have a corresponding value + # a['patreon'] F-Droid doesn't have a corresponding value + a["screenshots"] = screenshot_urls + + # populate 'versions' + for apk in apks: + if apk['packageName'] == packageName and apk.get('apkName', '').lower().endswith('.ipa'): + v = { + "version": apk["versionName"], + "date": apk["added"].isoformat(), + "downloadURL": f"{config['repo_url']}/{apk['apkName']}", + "size": apk['size'], + } + + # v['localizedDescription'] maybe what's new text? + v["minOSVersion"] = apk["ipa_MinimumOSVersion"] + v["maxOSVersion"] = apk["ipa_DTPlatformVersion"] + + # writing this spot here has the effect that always the + # permissions of the latest processed permissions list used + a['appPermissions']['privacy'] = apk['ipa_permissions'] + a['appPermissions']['entitlements'] = list(apk['ipa_entitlements']) + + a['versions'].append(v) + + if len(a['versions']) > 0: + idx['apps'].append(a) + + with open(os.path.join(repodir, 'altstore-index.json'), "w", encoding="utf-8") as f: + json.dump(idx, f, indent=indent) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index cbf68d76..5414c33e 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -2529,98 +2529,6 @@ def prepare_apps(apps, apks, repodir): return apps_with_packages -def altstore_index(apps, apks, config, repodir, indent=None): - """ - Assemble altstore-index.json for iOS (.ipa) apps. - - builds index files based on: - https://faq.altstore.io/distribute-your-apps/make-a-source - https://faq.altstore.io/distribute-your-apps/updating-apps - """ - # for now alt-store support is english only - for lang in ['en']: - - # prepare minimal altstore index - idx = { - 'name': config['repo_name'], - "apps": [], - "news": [], - } - - # add optional values if available - # idx["subtitle"] F-Droid doesn't have a corresponding value - if config.get("repo_description"): - idx['description'] = config['repo_description'] - if (Path(repodir) / 'icons' / config['repo_icon']).exists(): - idx['iconURL'] = f"{config['repo_url']}/icons/{config['repo_icon']}" - # idx["headerURL"] F-Droid doesn't have a corresponding value - # idx["website"] F-Droid doesn't have a corresponding value - # idx["patreonURL"] F-Droid doesn't have a corresponding value - # idx["tintColor"] F-Droid doesn't have a corresponding value - # idx["featuredApps"] = [] maybe mappable to F-Droids what's new? - - # assemble "apps" - for packageName, app in apps.items(): - app_name = app.get("Name") or app.get("AutoName") - icon_url = "{}{}".format( - config['repo_url'], - app.get('iconv2', {}).get(DEFAULT_LOCALE, {}).get('name', ''), - ) - screenshot_urls = [ - "{}{}".format(config["repo_url"], s["name"]) - for s in app.get("screenshots", {}) - .get("phone", {}) - .get(DEFAULT_LOCALE, {}) - ] - - a = { - "name": app_name, - 'bundleIdentifier': packageName, - 'developerName': app.get("AuthorName") or f"{app_name} team", - 'iconURL': icon_url, - "localizedDescription": "", - 'appPermissions': { - "entitlements": set(), - "privacy": {}, - }, - 'versions': [], - } - - if app.get('summary'): - a['subtitle'] = app['summary'] - # a["tintColor"] F-Droid doesn't have a corresponding value - # a["category"] F-Droid doesn't have a corresponding value - # a['patreon'] F-Droid doesn't have a corresponding value - a["screenshots"] = screenshot_urls - - # populate 'versions' - for apk in apks: - if apk['packageName'] == packageName and apk.get('apkName', '').lower().endswith('.ipa'): - v = { - "version": apk["versionName"], - "date": apk["added"].isoformat(), - "downloadURL": f"{config['repo_url']}/{apk['apkName']}", - "size": apk['size'], - } - - # v['localizedDescription'] maybe what's new text? - v["minOSVersion"] = apk["ipa_MinimumOSVersion"] - v["maxOSVersion"] = apk["ipa_DTPlatformVersion"] - - # writing this spot here has the effect that always the - # permissions of the latest processed permissions list used - a['appPermissions']['privacy'] = apk['ipa_permissions'] - a['appPermissions']['entitlements'] = list(apk['ipa_entitlements']) - - a['versions'].append(v) - - if len(a['versions']) > 0: - idx['apps'].append(a) - - with open(os.path.join(repodir, 'altstore-index.json'), "w", encoding="utf-8") as f: - json.dump(idx, f, indent=indent) - - config = None options = None start_timestamp = time.gmtime() @@ -2832,13 +2740,6 @@ def main(): # Make the index for the main repo... fdroidserver.index.make(repoapps, apks, repodirs[0], False) - altstore_index( - repoapps, - apks, - config, - repodirs[0], - indent=2 if options.pretty else None - ) git_remote = config.get('binary_transparency_remote') if git_remote or os.path.isdir(os.path.join('binary_transparency', '.git')): From 450765490b8f21cb8d0050052539741aa87c3575 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 4 Apr 2024 13:04:55 +0200 Subject: [PATCH 1456/2116] =?UTF-8?q?=F0=9F=97=BA=EF=B8=8F=20=20add=20test?= =?UTF-8?q?=20for=20=5Fget=5Fipa=5Fico?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/update.TestCase | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tests/update.TestCase b/tests/update.TestCase index 81036cd6..0ce7a85c 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -2201,6 +2201,33 @@ class TestCopyIosScreenshotsToRepo(unittest.TestCase): ) +class TestGetIpaIcon(unittest.TestCase): + def test_get_ipa_icon(self): + self.maxDiff = None + + with tempfile.TemporaryDirectory() as tmpdir: + tmpdir = Path(tmpdir) + (tmpdir / 'OnionBrowser.xcodeproj').mkdir() + with open(tmpdir / 'OnionBrowser.xcodeproj/project.pbxproj', "w") as f: + f.write("") + icondir = tmpdir / "fake_icon.appiconset" + icondir.mkdir() + with open(icondir / "Contents.json", "w", encoding="utf-8") as f: + f.write(""" + {"images": [ + {"scale": "2x", "size": "128x128", "filename": "nope"}, + {"scale": "1x", "size": "512x512", "filename": "nope"}, + {"scale": "1x", "size": "16x16", "filename": "nope"}, + {"scale": "1x", "size": "32x32", "filename": "yep"} + ]} + """) + + pfp = mock.Mock(return_value="fake_icon") + with(mock.patch("fdroidserver.update._parse_from_pbxproj", pfp)): + p = fdroidserver.update._get_ipa_icon(tmpdir) + self.assertEqual(str(icondir / "yep"), p) + + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) @@ -2221,4 +2248,5 @@ if __name__ == "__main__": newSuite.addTest(unittest.makeSuite(TestParseIosScreenShotName)) newSuite.addTest(unittest.makeSuite(TestInsertLocalizedIosAppMetadata)) newSuite.addTest(unittest.makeSuite(TestDiscoverIosScreenshots)) + newSuite.addTest(unittest.makeSuite(TestGetIpaIcon)) unittest.main(failfast=False) From f742799a9d485de535afc7e67bfb9497bbb52577 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 4 Apr 2024 13:53:02 +0200 Subject: [PATCH 1457/2116] =?UTF-8?q?=F0=9F=8F=9F=EF=B8=8F=20add=20test=20?= =?UTF-8?q?for=20=5Fparse=5Ffrom=5Fpbxproj?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also fix lint issues --- fdroidserver/index.py | 4 ++-- fdroidserver/update.py | 6 +++++- tests/update.TestCase | 20 +++++++++++++++++++- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index fb8a573f..a25c2926 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -1762,14 +1762,14 @@ def get_public_key_from_jar(jar): def make_altstore(apps, apks, config, repodir, indent=None): """ Assemble altstore-index.json for iOS (.ipa) apps. - + builds index files based on: https://faq.altstore.io/distribute-your-apps/make-a-source https://faq.altstore.io/distribute-your-apps/updating-apps """ # for now alt-store support is english only for lang in ['en']: - + # prepare minimal altstore index idx = { 'name': config['repo_name'], diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 5414c33e..6cd661a1 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -629,7 +629,7 @@ def parse_ipa(ipa_path, file_size, sha256): if info.filename.endswith("/embedded.mobileprovision"): print("parsing", info.filename) with ipa_zip.open(info) as mopro_file: - mopro_content_info = cms.ContentInfo.load(mopro_file.read()) + mopro_content_info = asn1crypto.cms.ContentInfo.load(mopro_file.read()) mopro_payload_info = mopro_content_info['content'] mopro_payload = mopro_payload_info['encap_content_info']['content'].native mopro = biplist.readPlistFromString(mopro_payload) @@ -1670,6 +1670,10 @@ def _get_ipa_icon(src_dir): def _parse_from_pbxproj(pbxproj_path, key): """Parse values from apple project files. + This is a naive regex based parser. Should this proofe to unreliable we + might want to consider using a dedicated pbxproj parser: + https://pypi.org/project/pbxproj/ + e.g. when looking for key 'ASSETCATALOG_COMPILER_APPICON_NAME' This function will extract 'MyIcon' from if the provided file contains this line: diff --git a/tests/update.TestCase b/tests/update.TestCase index 0ce7a85c..6f0b8654 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -2223,11 +2223,29 @@ class TestGetIpaIcon(unittest.TestCase): """) pfp = mock.Mock(return_value="fake_icon") - with(mock.patch("fdroidserver.update._parse_from_pbxproj", pfp)): + with mock.patch("fdroidserver.update._parse_from_pbxproj", pfp): p = fdroidserver.update._get_ipa_icon(tmpdir) self.assertEqual(str(icondir / "yep"), p) +class TestParseFromPbxproj(unittest.TestCase): + def test_parse_from_pbxproj(self): + self.maxDiff = None + + with tempfile.TemporaryDirectory() as tmpdir: + with open(Path(tmpdir) / "asdf.pbxproj", 'w', encoding="utf-8") as f: + f.write(""" + 230jfaod=flc' + ASSETCATALOG_COMPILER_APPICON_NAME = MyIcon; + cm opa1c p[m + """) + v = fdroidserver.update._parse_from_pbxproj( + Path(tmpdir) / "asdf.pbxproj", + "ASSETCATALOG_COMPILER_APPICON_NAME" + ) + self.assertEqual(v, "MyIcon") + + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 86db8c93cc1bb30b1cbc0d39680bd953fec98ed0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 4 Apr 2024 14:14:58 +0200 Subject: [PATCH 1458/2116] =?UTF-8?q?=F0=9F=A9=B9=20fix=20parse=5Fipa=20te?= =?UTF-8?q?sts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/update.TestCase | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/update.TestCase b/tests/update.TestCase index 6f0b8654..2ab19a3a 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1936,7 +1936,10 @@ class UpdateTest(unittest.TestCase): index['repo'][CATEGORIES_CONFIG_NAME], ) + +class TestParseIpa(unittest.TestCase): def test_parse_ipa(self): + self.maxDiff = None try: import biplist # Fedora does not have a biplist package @@ -1959,6 +1962,27 @@ class UpdateTest(unittest.TestCase): 'size': 'fake_size', 'versionCode': 1000000000001, 'versionName': '1.0.1', + 'ipa_DTPlatformVersion': '16.4', + 'ipa_MinimumOSVersion': '15.0', + 'ipa_entitlements': set(), + 'ipa_permissions': { + 'NSCameraUsageDescription': + 'Please allow access to your ' + 'camera, if you want to ' + 'create photos or videos for ' + 'direct sharing.', + 'NSMicrophoneUsageDescription': + 'Please allow access to ' + 'your microphone, if you ' + 'want to create videos ' + 'for direct sharing.', + 'NSPhotoLibraryUsageDescription': + 'Please allow access to ' + 'your photo library, if ' + 'you want to share ' + 'photos.', + }, + 'name': 'OnionShare', }, ) From 45efb88f852146f9f5d88748450620af2378a268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 4 Apr 2024 16:43:56 +0200 Subject: [PATCH 1459/2116] =?UTF-8?q?=F0=9F=95=B4=EF=B8=8F=20add=20test=20?= =?UTF-8?q?for=20make=5Faltstore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fdroidserver/index.py | 2 +- tests/index.TestCase | 91 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 1 deletion(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index a25c2926..601cd9ce 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -1847,5 +1847,5 @@ def make_altstore(apps, apks, config, repodir, indent=None): if len(a['versions']) > 0: idx['apps'].append(a) - with open(os.path.join(repodir, 'altstore-index.json'), "w", encoding="utf-8") as f: + with open(Path(repodir) / 'altstore-index.json', "w", encoding="utf-8") as f: json.dump(idx, f, indent=indent) diff --git a/tests/index.TestCase b/tests/index.TestCase index 8eccec76..04a35c4b 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -829,6 +829,96 @@ class IndexTest(unittest.TestCase): index.add_mirrors_to_repodict('repo', repodict) +class AltstoreIndexTest(unittest.TestCase): + def test_make_altstore(self): + self.maxDiff = None + + apps = { + "app.fake": { + "AutoName": "Fake App", + "AuthorName": "Fake Author", + "iconv2": {"en_US": "fake_icon.png"}, + } + } + apks = [ + { + "packageName": "app.fake", + "apkName": "app.fake_123.ipa", + "versionName": "v123", + "added": datetime.datetime(2000, 2, 2, 2, 2, 2), + "size": 123, + "ipa_MinimumOSVersion": "10.0", + "ipa_DTPlatformVersion": "12.0", + "ipa_permissions": [ + "NSCameraUsageDescription", + "NSDocumentsFolderUsageDescription", + ], + "ipa_entitlements": [ + "com.apple.developer.team-identifier", + "com.apple.developer.web-browser", + "keychain-access-groups", + ], + }, + ] + config = { + "repo_icon": "fake_repo_icon.png", + "repo_name": "fake_repo", + "repo_url": "gopher://fake-repo.com/fdroid/repo" + } + + with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): + repodir = Path(tmpdir) / 'repo' + repodir.mkdir() + + fdroidserver.index.make_altstore( + apps, + apks, + config, + repodir, + 2, + ) + + with open(repodir / "altstore-index.json", 'r') as f: + self.assertDictEqual( + { + "apps": [ + { + "appPermissions": { + "entitlements": [ + 'com.apple.developer.team-identifier', + 'com.apple.developer.web-browser', + 'keychain-access-groups', + ], + 'privacy': [ + 'NSCameraUsageDescription', + 'NSDocumentsFolderUsageDescription', + ], + }, + 'bundleIdentifier': 'app.fake', + 'developerName': 'Fake Author', + 'iconURL': 'gopher://fake-repo.com/fdroid/repo', + 'localizedDescription': '', + 'name': 'Fake App', + 'screenshots': [], + 'versions': [ + { + 'date': '2000-02-02T02:02:02', + 'downloadURL': 'gopher://fake-repo.com/fdroid/repo/app.fake_123.ipa', + 'maxOSVersion': '12.0', + 'minOSVersion': '10.0', + 'size': 123, + 'version': 'v123', + } + ], + }, + ], + 'name': 'fake_repo', + 'news': [], + }, + json.load(f) + ) + + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) @@ -845,4 +935,5 @@ if __name__ == "__main__": newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(IndexTest)) + newSuite.addTest(unittest.makeSuite(AltstoreIndexTest)) unittest.main(failfast=False) From f2118b35a32a3a2ebb99c90dc4390c795deb7e04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Tue, 9 Apr 2024 14:53:00 +0200 Subject: [PATCH 1460/2116] =?UTF-8?q?=F0=9F=8F=9F=EF=B8=8F=20fix=20ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/deploy.TestCase | 6 ++++++ tests/index.TestCase | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/deploy.TestCase b/tests/deploy.TestCase index bbb0e929..fd17d062 100755 --- a/tests/deploy.TestCase +++ b/tests/deploy.TestCase @@ -112,6 +112,8 @@ class DeployTest(unittest.TestCase): fdroidserver.deploy.update_serverwebroot('serverwebroot', 'repo') def test_update_serverwebroot_make_cur_version_link(self): + self.maxDiff = None + # setup parameters for this test run fdroidserver.deploy.options = mock.Mock() fdroidserver.deploy.options.no_checksum = True @@ -137,6 +139,8 @@ class DeployTest(unittest.TestCase): '--safe-links', '--quiet', '--exclude', + 'repo/altstore-index.json', + '--exclude', 'repo/entry.jar', '--exclude', 'repo/entry.json', @@ -232,6 +236,8 @@ class DeployTest(unittest.TestCase): 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + fdroidserver.deploy.config['identity_file'], '--exclude', + 'archive/altstore-index.json', + '--exclude', 'archive/entry.jar', '--exclude', 'archive/entry.json', diff --git a/tests/index.TestCase b/tests/index.TestCase index 04a35c4b..49fda126 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -863,7 +863,7 @@ class AltstoreIndexTest(unittest.TestCase): config = { "repo_icon": "fake_repo_icon.png", "repo_name": "fake_repo", - "repo_url": "gopher://fake-repo.com/fdroid/repo" + "repo_url": "gopher://fake-repo.com/fdroid/repo", } with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): @@ -915,7 +915,7 @@ class AltstoreIndexTest(unittest.TestCase): 'name': 'fake_repo', 'news': [], }, - json.load(f) + json.load(f), ) From d00a87ed6c7be8b03a5d8bf688472e9309c2ac09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Tue, 23 Apr 2024 17:28:30 +0200 Subject: [PATCH 1461/2116] =?UTF-8?q?=F0=9F=8F=8F=20alt-store=20index:=20i?= =?UTF-8?q?ncorporate=20review=20feedback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fdroidserver/common.py | 8 ++++++-- fdroidserver/index.py | 12 +++++++----- fdroidserver/update.py | 20 ++++++++++++++------ tests/index.TestCase | 2 +- 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 9e1a5340..c7c4c5c2 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4155,7 +4155,6 @@ def is_repo_file(filename, for_gpg_signing=False): if isinstance(filename, str): filename = filename.encode('utf-8', errors="surrogateescape") ignore_files = [ - b'altstore-index.json', b'entry.jar', b'index-v1.jar', b'index.css', @@ -4166,7 +4165,12 @@ def is_repo_file(filename, for_gpg_signing=False): b'index_unsigned.jar', ] if not for_gpg_signing: - ignore_files += [b'entry.json', b'index-v1.json', b'index-v2.json'] + ignore_files += [ + b'altstore-index.json', + b'entry.json', + b'index-v1.json', + b'index-v2.json', + ] return ( os.path.isfile(filename) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 601cd9ce..778c4e75 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -130,7 +130,7 @@ def make(apps, apks, repodir, archive): apks, common.config, repodir, - indent=2 if common.options.pretty else None + pretty=common.options.pretty, ) @@ -1759,14 +1759,14 @@ def get_public_key_from_jar(jar): return public_key, public_key_fingerprint -def make_altstore(apps, apks, config, repodir, indent=None): - """ - Assemble altstore-index.json for iOS (.ipa) apps. +def make_altstore(apps, apks, config, repodir, pretty=False): + """Assemble altstore-index.json for iOS (.ipa) apps. builds index files based on: https://faq.altstore.io/distribute-your-apps/make-a-source https://faq.altstore.io/distribute-your-apps/updating-apps """ + indent = 2 if pretty else None # for now alt-store support is english only for lang in ['en']: @@ -1825,7 +1825,9 @@ def make_altstore(apps, apks, config, repodir, indent=None): # populate 'versions' for apk in apks: - if apk['packageName'] == packageName and apk.get('apkName', '').lower().endswith('.ipa'): + if apk['packageName'] == packageName and apk.get( + 'apkName', '' + ).lower().endswith('.ipa'): v = { "version": apk["versionName"], "date": apk["added"].isoformat(), diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 6cd661a1..23e3d604 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -629,13 +629,20 @@ def parse_ipa(ipa_path, file_size, sha256): if info.filename.endswith("/embedded.mobileprovision"): print("parsing", info.filename) with ipa_zip.open(info) as mopro_file: - mopro_content_info = asn1crypto.cms.ContentInfo.load(mopro_file.read()) + mopro_content_info = asn1crypto.cms.ContentInfo.load( + mopro_file.read() + ) mopro_payload_info = mopro_content_info['content'] - mopro_payload = mopro_payload_info['encap_content_info']['content'].native + mopro_payload = mopro_payload_info['encap_content_info'][ + 'content' + ].native mopro = biplist.readPlistFromString(mopro_payload) # https://faq.altstore.io/distribute-your-apps/make-a-source#entitlements-array-of-strings for entitlement in mopro.get('Entitlements', {}).keys(): - if entitlement not in ["com.app.developer.team-identifier", 'application-identifier']: + if entitlement not in [ + "com.app.developer.team-identifier", + 'application-identifier' + ]: ipa["ipa_entitlements"].add(entitlement) return ipa @@ -666,8 +673,7 @@ def scan_repo_for_ipas(apkcache, repodir, knownapks): file_size = os.stat(ipa_path).st_size if file_size == 0: - raise FDroidException(_('{path} is zero size!') - .format(path=ipa_path)) + raise FDroidException(_('{path} is zero size!').format(path=ipa_path)) sha256 = common.sha256sum(ipa_path) ipa = apkcache.get(ipa_name, {}) @@ -1420,7 +1426,9 @@ def insert_localized_ios_app_metadata(apps_with_packages): for metadata_file in (lang_dir).iterdir(): key = FASTLANE_IOS_MAP.get(metadata_file.name) if key: - fdroidserver.update._set_localized_text_entry(app, locale, key, metadata_file) + fdroidserver.update._set_localized_text_entry( + app, locale, key, metadata_file + ) screenshots = fdroidserver.update.discover_ios_screenshots(fastlane_dir) fdroidserver.update.copy_ios_screenshots_to_repo(screenshots, package_name) diff --git a/tests/index.TestCase b/tests/index.TestCase index 49fda126..6e8ec89b 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -875,7 +875,7 @@ class AltstoreIndexTest(unittest.TestCase): apks, config, repodir, - 2, + True, ) with open(repodir / "altstore-index.json", 'r') as f: From 9716b5e1ab19967cf9071d7512fb5a73a46c3843 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 24 Apr 2024 10:29:50 +0200 Subject: [PATCH 1462/2116] index: manual black format --- fdroidserver/index.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 778c4e75..5a179487 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -1825,9 +1825,8 @@ def make_altstore(apps, apks, config, repodir, pretty=False): # populate 'versions' for apk in apks: - if apk['packageName'] == packageName and apk.get( - 'apkName', '' - ).lower().endswith('.ipa'): + last4 = apk.get('apkName', '').lower()[-4:] + if apk['packageName'] == packageName and last4 == '.ipa': v = { "version": apk["versionName"], "date": apk["added"].isoformat(), From cb04d801d82b27f2f9c5a8ef0c349778ccfb6c86 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 23 Apr 2024 18:40:17 +0200 Subject: [PATCH 1463/2116] deploy: manually move hard cases to black code format --- fdroidserver/deploy.py | 57 ++++++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 19 deletions(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index a2c60165..54652c5f 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -98,8 +98,9 @@ def update_awsbucket(repo_section): Requires AWS credentials set in config.yml: awsaccesskeyid, awssecretkey """ - logging.debug('Syncing "' + repo_section + '" to Amazon S3 bucket "' - + config['awsbucket'] + '"') + logging.debug( + f'''Syncing "{repo_section}" to Amazon S3 bucket "{config['awsbucket']}"''' + ) if common.set_command_in_config('s3cmd'): update_awsbucket_s3cmd(repo_section) @@ -256,8 +257,8 @@ def update_awsbucket_libcloud(repo_section): extra['content_type'] = 'application/pgp-signature' elif file_to_upload.endswith('.asc'): extra['content_type'] = 'application/pgp-signature' - logging.info(' uploading ' + os.path.relpath(file_to_upload) - + ' to s3://' + awsbucket + '/' + object_name) + path = os.path.relpath(file_to_upload) + logging.info(f' uploading {path} to s3://{awsbucket}/{object_name}') with open(file_to_upload, 'rb') as iterator: obj = driver.upload_object_via_stream(iterator=iterator, container=container, @@ -544,8 +545,13 @@ def update_servergitmirrors(servergitmirrors, repo_section): for line in progress.other_lines: if line.startswith('remote:'): logging.debug(line) - raise FDroidException(remote.url + ' push failed: ' + str(pushinfo.flags) - + ' ' + pushinfo.summary) + raise FDroidException( + '{url} push failed: {flags} {summary}'.format( + url=remote.url, + flags=pushinfo.flags, + summary=pushinfo.summary, + ) + ) else: logging.debug(remote.url + ': ' + pushinfo.summary) @@ -621,7 +627,8 @@ def upload_to_virustotal(repo_section, virustotal_apikey): with open(os.path.join(repo_section, 'index-v1.json')) as fp: data = json.load(fp) else: - data, _ignored, _ignored = index.get_index_from_jar(os.path.join(repo_section, 'index-v1.jar')) + local_jar = os.path.join(repo_section, 'index-v1.jar') + data, _ignored, _ignored = index.get_index_from_jar(local_jar) for packageName, packages in data['packages'].items(): for package in packages: @@ -651,14 +658,17 @@ def upload_apk_to_virustotal(virustotal_apikey, packageName, apkName, hash, for k, v in kwargs['headers'].items(): headers[k] = v - data = { + apikey = { 'apikey': virustotal_apikey, 'resource': hash, } needs_file_upload = False while True: - r = requests.get('https://www.virustotal.com/vtapi/v2/file/report?' - + urllib.parse.urlencode(data), headers=headers, timeout=300) + report_url = ( + 'https://www.virustotal.com/vtapi/v2/file/report?' + + urllib.parse.urlencode(apikey) + ) + r = requests.get(report_url, headers=headers, timeout=300) if r.status_code == 200: response = r.json() if response['response_code'] == 0: @@ -673,9 +683,12 @@ def upload_apk_to_virustotal(virustotal_apikey, packageName, apkName, hash, json.dump(response, fp, indent=2, sort_keys=True) if response.get('positives', 0) > 0: - logging.warning(repofilename + ' has been flagged by virustotal ' - + str(response['positives']) + ' times:' - + '\n\t' + response['permalink']) + logging.warning( + _('{path} has been flagged by virustotal {count} times:').format( + path=repofilename, count=response['positives'] + ), + +'\n\t' + response['permalink'], + ) break if r.status_code == 204: logging.warning(_('virustotal.com is rate limiting, waiting to retry...')) @@ -691,8 +704,11 @@ def upload_apk_to_virustotal(virustotal_apikey, packageName, apkName, hash, .format(path=repofilename, url=manual_url)) elif size > 32000000: # VirusTotal API requires fetching a URL to upload bigger files - r = requests.get('https://www.virustotal.com/vtapi/v2/file/scan/upload_url?' - + urllib.parse.urlencode(data), headers=headers, timeout=300) + query_url = ( + 'https://www.virustotal.com/vtapi/v2/file/scan/upload_url?' + + urllib.parse.urlencode(apikey) + ) + r = requests.get(query_url, headers=headers, timeout=300) if r.status_code == 200: upload_url = r.json().get('upload_url') elif r.status_code == 403: @@ -707,10 +723,13 @@ def upload_apk_to_virustotal(virustotal_apikey, packageName, apkName, hash, if upload_url: logging.info(_('Uploading {apkfilename} to virustotal') .format(apkfilename=repofilename)) - files = { - 'file': (apkName, open(repofilename, 'rb')) - } - r = requests.post(upload_url, data=data, headers=headers, files=files, timeout=300) + r = requests.post( + upload_url, + data=apikey, + headers=headers, + files={'file': (apkName, open(repofilename, 'rb'))}, + timeout=300, + ) logging.debug(_('If this upload fails, try manually uploading to {url}') .format(url=manual_url)) r.raise_for_status() From 79f148167ab4ef6f965a538050fd547730670257 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 23 Apr 2024 18:41:08 +0200 Subject: [PATCH 1464/2116] deploy: automatically convert to black format --- fdroidserver/deploy.py | 275 ++++++++++++++++++++++++++--------------- pyproject.toml | 1 - 2 files changed, 176 insertions(+), 100 deletions(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 54652c5f..6daa7068 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -119,17 +119,20 @@ def update_awsbucket_s3cmd(repo_section): files are deleted from the server. The last pass is the only pass to use a full MD5 checksum of all files to detect changes. """ - logging.debug(_('Using s3cmd to sync with: {url}') - .format(url=config['awsbucket'])) + logging.debug(_('Using s3cmd to sync with: {url}').format(url=config['awsbucket'])) if os.path.exists(USER_S3CFG): logging.info(_('Using "{path}" for configuring s3cmd.').format(path=USER_S3CFG)) configfilename = USER_S3CFG else: fd = os.open(AUTO_S3CFG, os.O_CREAT | os.O_TRUNC | os.O_WRONLY, 0o600) - logging.debug(_('Creating "{path}" for configuring s3cmd.').format(path=AUTO_S3CFG)) + logging.debug( + _('Creating "{path}" for configuring s3cmd.').format(path=AUTO_S3CFG) + ) os.write(fd, '[default]\n'.encode('utf-8')) - os.write(fd, ('access_key = ' + config['awsaccesskeyid'] + '\n').encode('utf-8')) + os.write( + fd, ('access_key = ' + config['awsaccesskeyid'] + '\n').encode('utf-8') + ) os.write(fd, ('secret_key = ' + config['awssecretkey'] + '\n').encode('utf-8')) os.close(fd) configfilename = AUTO_S3CFG @@ -137,11 +140,11 @@ def update_awsbucket_s3cmd(repo_section): s3bucketurl = 's3://' + config['awsbucket'] s3cmd = [config['s3cmd'], '--config=' + configfilename] if subprocess.call(s3cmd + ['info', s3bucketurl]) != 0: - logging.warning(_('Creating new S3 bucket: {url}') - .format(url=s3bucketurl)) + logging.warning(_('Creating new S3 bucket: {url}').format(url=s3bucketurl)) if subprocess.call(s3cmd + ['mb', s3bucketurl]) != 0: - logging.error(_('Failed to create S3 bucket: {url}') - .format(url=s3bucketurl)) + logging.error( + _('Failed to create S3 bucket: {url}').format(url=s3bucketurl) + ) raise FDroidException() s3cmd_sync = s3cmd + ['sync', '--acl-public'] @@ -168,8 +171,11 @@ def update_awsbucket_s3cmd(repo_section): if returncode != 0: raise FDroidException() - logging.debug(_('s3cmd sync indexes {path} to {url} and delete') - .format(path=repo_section, url=s3url)) + logging.debug( + _('s3cmd sync indexes {path} to {url} and delete').format( + path=repo_section, url=s3url + ) + ) s3cmd_sync.append('--delete-removed') s3cmd_sync.append('--delete-after') if options.no_checksum: @@ -191,22 +197,28 @@ def update_awsbucket_libcloud(repo_section): Requires AWS credentials set in config.yml: awsaccesskeyid, awssecretkey """ - logging.debug(_('using Apache libcloud to sync with {url}') - .format(url=config['awsbucket'])) + logging.debug( + _('using Apache libcloud to sync with {url}').format(url=config['awsbucket']) + ) import libcloud.security + libcloud.security.VERIFY_SSL_CERT = True from libcloud.storage.types import Provider, ContainerDoesNotExistError from libcloud.storage.providers import get_driver if not config.get('awsaccesskeyid') or not config.get('awssecretkey'): raise FDroidException( - _('To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!')) + _( + 'To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!' + ) + ) awsbucket = config['awsbucket'] if os.path.exists(USER_S3CFG): - raise FDroidException(_('"{path}" exists but s3cmd is not installed!') - .format(path=USER_S3CFG)) + raise FDroidException( + _('"{path}" exists but s3cmd is not installed!').format(path=USER_S3CFG) + ) cls = get_driver(Provider.S3) driver = cls(config['awsaccesskeyid'], config['awssecretkey']) @@ -214,8 +226,7 @@ def update_awsbucket_libcloud(repo_section): container = driver.get_container(container_name=awsbucket) except ContainerDoesNotExistError: container = driver.create_container(container_name=awsbucket) - logging.info(_('Created new container "{name}"') - .format(name=container.name)) + logging.info(_('Created new container "{name}"').format(name=container.name)) upload_dir = 'fdroid/' + repo_section objs = dict() @@ -260,10 +271,12 @@ def update_awsbucket_libcloud(repo_section): path = os.path.relpath(file_to_upload) logging.info(f' uploading {path} to s3://{awsbucket}/{object_name}') with open(file_to_upload, 'rb') as iterator: - obj = driver.upload_object_via_stream(iterator=iterator, - container=container, - object_name=object_name, - extra=extra) + obj = driver.upload_object_via_stream( + iterator=iterator, + container=container, + object_name=object_name, + extra=extra, + ) # delete the remnants in the bucket, they do not exist locally while objs: object_name, obj = objs.popitem() @@ -306,9 +319,15 @@ def update_serverwebroot(serverwebroot, repo_section): if options and options.quiet: rsyncargs += ['--quiet'] if options and options.identity_file: - rsyncargs += ['-e', 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + options.identity_file] + rsyncargs += [ + '-e', + 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + options.identity_file, + ] elif config and config.get('identity_file'): - rsyncargs += ['-e', 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + config['identity_file']] + rsyncargs += [ + '-e', + 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + config['identity_file'], + ] url = serverwebroot['url'] logging.info('rsyncing ' + repo_section + ' to ' + url) excludes = _get_index_excludes(repo_section) @@ -319,8 +338,7 @@ def update_serverwebroot(serverwebroot, repo_section): # upload "current version" symlinks if requested if config and config.get('make_current_version_link') and repo_section == 'repo': links_to_upload = [] - for f in glob.glob('*.apk') \ - + glob.glob('*.apk.asc') + glob.glob('*.apk.sig'): + for f in glob.glob('*.apk') + glob.glob('*.apk.asc') + glob.glob('*.apk.sig'): if os.path.islink(f): links_to_upload.append(f) if len(links_to_upload) > 0: @@ -368,9 +386,11 @@ def sync_from_localcopy(repo_section, local_copy_dir): logging.info('Syncing from local_copy_dir to this repo.') # trailing slashes have a meaning in rsync which is not needed here, so # make sure both paths have exactly one trailing slash - common.local_rsync(options, - os.path.join(local_copy_dir, repo_section).rstrip('/') + '/', - repo_section.rstrip('/') + '/') + common.local_rsync( + options, + os.path.join(local_copy_dir, repo_section).rstrip('/') + '/', + repo_section.rstrip('/') + '/', + ) offline_copy = os.path.join(local_copy_dir, BINARY_TRANSPARENCY_DIR) if os.path.exists(os.path.join(offline_copy, '.git')): @@ -419,9 +439,11 @@ def update_servergitmirrors(servergitmirrors, repo_section): """ import git from clint.textui import progress - if config.get('local_copy_dir') \ - and not config.get('sync_from_local_copy_dir'): - logging.debug(_('Offline machine, skipping git mirror generation until `fdroid deploy`')) + + if config.get('local_copy_dir') and not config.get('sync_from_local_copy_dir'): + logging.debug( + _('Offline machine, skipping git mirror generation until `fdroid deploy`') + ) return # right now we support only 'repo' git-mirroring @@ -438,19 +460,25 @@ def update_servergitmirrors(servergitmirrors, repo_section): dotgit_size = _get_size(dotgit) dotgit_over_limit = dotgit_size > config['git_mirror_size_limit'] if os.path.isdir(dotgit) and dotgit_over_limit: - logging.warning(_('Deleting git-mirror history, repo is too big ({size} max {limit})') - .format(size=dotgit_size, limit=config['git_mirror_size_limit'])) + logging.warning( + _( + 'Deleting git-mirror history, repo is too big ({size} max {limit})' + ).format(size=dotgit_size, limit=config['git_mirror_size_limit']) + ) shutil.rmtree(dotgit) if options.no_keep_git_mirror_archive and dotgit_over_limit: - logging.warning(_('Deleting archive, repo is too big ({size} max {limit})') - .format(size=dotgit_size, limit=config['git_mirror_size_limit'])) + logging.warning( + _('Deleting archive, repo is too big ({size} max {limit})').format( + size=dotgit_size, limit=config['git_mirror_size_limit'] + ) + ) archive_path = os.path.join(git_mirror_path, 'fdroid', 'archive') shutil.rmtree(archive_path, ignore_errors=True) # rsync is very particular about trailing slashes - common.local_rsync(options, - repo_section.rstrip('/') + '/', - git_repodir.rstrip('/') + '/') + common.local_rsync( + options, repo_section.rstrip('/') + '/', git_repodir.rstrip('/') + '/' + ) # use custom SSH command if identity_file specified ssh_cmd = 'ssh -oBatchMode=yes' @@ -488,6 +516,7 @@ def update_servergitmirrors(servergitmirrors, repo_section): def update(self, op_code, current, maximum=None, message=None): if isinstance(maximum, float): progressbar.show(current, maximum) + progress = MyProgressPrinter() else: progress = None @@ -537,10 +566,12 @@ def update_servergitmirrors(servergitmirrors, repo_section): GIT_BRANCH, force=True, set_upstream=True, progress=progress ) for pushinfo in pushinfos: - if pushinfo.flags & (git.remote.PushInfo.ERROR - | git.remote.PushInfo.REJECTED - | git.remote.PushInfo.REMOTE_FAILURE - | git.remote.PushInfo.REMOTE_REJECTED): + if pushinfo.flags & ( + git.remote.PushInfo.ERROR + | git.remote.PushInfo.REJECTED + | git.remote.PushInfo.REMOTE_FAILURE + | git.remote.PushInfo.REMOTE_REJECTED + ): # Show potentially useful messages from git remote for line in progress.other_lines: if line.startswith('remote:'): @@ -561,6 +592,7 @@ def update_servergitmirrors(servergitmirrors, repo_section): def upload_to_android_observatory(repo_section): import requests + requests # stop unused import warning if options.verbose: @@ -582,9 +614,12 @@ def upload_apk_to_android_observatory(path): from lxml.html import fromstring apkfilename = os.path.basename(path) - r = requests.post('https://androidobservatory.org/', - data={'q': common.sha256sum(path), 'searchby': 'hash'}, - headers=net.HEADERS, timeout=300) + r = requests.post( + 'https://androidobservatory.org/', + data={'q': common.sha256sum(path), 'searchby': 'hash'}, + headers=net.HEADERS, + timeout=300, + ) if r.status_code == 200: # from now on XPath will be used to retrieve the message in the HTML # androidobservatory doesn't have a nice API to talk with @@ -601,22 +636,30 @@ def upload_apk_to_android_observatory(path): page = 'https://androidobservatory.org' if href: - message = (_('Found {apkfilename} at {url}') - .format(apkfilename=apkfilename, url=(page + href))) + message = _('Found {apkfilename} at {url}').format( + apkfilename=apkfilename, url=(page + href) + ) logging.debug(message) return # upload the file with a post request - logging.info(_('Uploading {apkfilename} to androidobservatory.org') - .format(apkfilename=apkfilename)) - r = requests.post('https://androidobservatory.org/upload', - files={'apk': (apkfilename, open(path, 'rb'))}, - headers=net.HEADERS, - allow_redirects=False, timeout=300) + logging.info( + _('Uploading {apkfilename} to androidobservatory.org').format( + apkfilename=apkfilename + ) + ) + r = requests.post( + 'https://androidobservatory.org/upload', + files={'apk': (apkfilename, open(path, 'rb'))}, + headers=net.HEADERS, + allow_redirects=False, + timeout=300, + ) def upload_to_virustotal(repo_section, virustotal_apikey): import requests + requests # stop unused import warning if repo_section == 'repo': @@ -635,25 +678,24 @@ def upload_to_virustotal(repo_section, virustotal_apikey): upload_apk_to_virustotal(virustotal_apikey, **package) -def upload_apk_to_virustotal(virustotal_apikey, packageName, apkName, hash, - versionCode, **kwargs): +def upload_apk_to_virustotal( + virustotal_apikey, packageName, apkName, hash, versionCode, **kwargs +): import requests logging.getLogger("urllib3").setLevel(logging.WARNING) logging.getLogger("requests").setLevel(logging.WARNING) - outputfilename = os.path.join('virustotal', - packageName + '_' + str(versionCode) - + '_' + hash + '.json') + outputfilename = os.path.join( + 'virustotal', packageName + '_' + str(versionCode) + '_' + hash + '.json' + ) if os.path.exists(outputfilename): logging.debug(apkName + ' results are in ' + outputfilename) return outputfilename repofilename = os.path.join('repo', apkName) logging.info('Checking if ' + repofilename + ' is on virustotal') - headers = { - "User-Agent": "F-Droid" - } + headers = {"User-Agent": "F-Droid"} if 'headers' in kwargs: for k, v in kwargs['headers'].items(): headers[k] = v @@ -700,8 +742,11 @@ def upload_apk_to_virustotal(virustotal_apikey, packageName, apkName, hash, size = os.path.getsize(repofilename) if size > 200000000: # VirusTotal API 200MB hard limit - logging.error(_('{path} more than 200MB, manually upload: {url}') - .format(path=repofilename, url=manual_url)) + logging.error( + _('{path} more than 200MB, manually upload: {url}').format( + path=repofilename, url=manual_url + ) + ) elif size > 32000000: # VirusTotal API requires fetching a URL to upload bigger files query_url = ( @@ -712,17 +757,21 @@ def upload_apk_to_virustotal(virustotal_apikey, packageName, apkName, hash, if r.status_code == 200: upload_url = r.json().get('upload_url') elif r.status_code == 403: - logging.error(_('VirusTotal API key cannot upload files larger than 32MB, ' - + 'use {url} to upload {path}.') - .format(path=repofilename, url=manual_url)) + logging.error( + _( + 'VirusTotal API key cannot upload files larger than 32MB, ' + + 'use {url} to upload {path}.' + ).format(path=repofilename, url=manual_url) + ) else: r.raise_for_status() else: upload_url = 'https://www.virustotal.com/vtapi/v2/file/scan' if upload_url: - logging.info(_('Uploading {apkfilename} to virustotal') - .format(apkfilename=repofilename)) + logging.info( + _('Uploading {apkfilename} to virustotal').format(apkfilename=repofilename) + ) r = requests.post( upload_url, data=apikey, @@ -730,8 +779,11 @@ def upload_apk_to_virustotal(virustotal_apikey, packageName, apkName, hash, files={'file': (apkName, open(repofilename, 'rb'))}, timeout=300, ) - logging.debug(_('If this upload fails, try manually uploading to {url}') - .format(url=manual_url)) + logging.debug( + _('If this upload fails, try manually uploading to {url}').format( + url=manual_url + ) + ) r.raise_for_status() response = r.json() logging.info(response['verbose_msg'] + " " + response['permalink']) @@ -756,8 +808,7 @@ def push_binary_transparency(git_repo_path, git_remote): """ import git - logging.info(_('Pushing binary transparency log to {url}') - .format(url=git_remote)) + logging.info(_('Pushing binary transparency log to {url}').format(url=git_remote)) if os.path.isdir(os.path.dirname(git_remote)): # from offline machine to thumbdrive @@ -794,14 +845,29 @@ def main(): parser = ArgumentParser() common.setup_global_opts(parser) - parser.add_argument("-i", "--identity-file", default=None, - help=_("Specify an identity file to provide to SSH for rsyncing")) - parser.add_argument("--local-copy-dir", default=None, - help=_("Specify a local folder to sync the repo to")) - parser.add_argument("--no-checksum", action="store_true", default=False, - help=_("Don't use rsync checksums")) - parser.add_argument("--no-keep-git-mirror-archive", action="store_true", default=False, - help=_("If a git mirror gets to big, allow the archive to be deleted")) + parser.add_argument( + "-i", + "--identity-file", + default=None, + help=_("Specify an identity file to provide to SSH for rsyncing"), + ) + parser.add_argument( + "--local-copy-dir", + default=None, + help=_("Specify a local folder to sync the repo to"), + ) + parser.add_argument( + "--no-checksum", + action="store_true", + default=False, + help=_("Don't use rsync checksums"), + ) + parser.add_argument( + "--no-keep-git-mirror-archive", + action="store_true", + default=False, + help=_("If a git mirror gets to big, allow the archive to be deleted"), + ) options = parser.parse_args() config = common.read_config(options) @@ -822,17 +888,23 @@ def main(): logging.error(_('local_copy_dir must be directory, not a file!')) sys.exit(1) if not os.path.exists(os.path.dirname(fdroiddir)): - logging.error(_('The root dir for local_copy_dir "{path}" does not exist!') - .format(path=os.path.dirname(fdroiddir))) + logging.error( + _('The root dir for local_copy_dir "{path}" does not exist!').format( + path=os.path.dirname(fdroiddir) + ) + ) sys.exit(1) if not os.path.isabs(fdroiddir): logging.error(_('local_copy_dir must be an absolute path!')) sys.exit(1) repobase = os.path.basename(fdroiddir) if standardwebroot and repobase != 'fdroid': - logging.error(_('local_copy_dir does not end with "fdroid", ' - + 'perhaps you meant: "{path}"') - .format(path=fdroiddir + '/fdroid')) + logging.error( + _( + 'local_copy_dir does not end with "fdroid", ' + + 'perhaps you meant: "{path}"' + ).format(path=fdroiddir + '/fdroid') + ) sys.exit(1) if local_copy_dir[-1] != '/': local_copy_dir += '/' @@ -840,16 +912,20 @@ def main(): if not os.path.exists(fdroiddir): os.mkdir(fdroiddir) - if not config.get('awsbucket') \ - and not config.get('serverwebroot') \ - and not config.get('servergitmirrors') \ - and not config.get('androidobservatory') \ - and not config.get('binary_transparency_remote') \ - and not config.get('virustotal_apikey') \ - and local_copy_dir is None: - logging.warning(_('No option set! Edit your config.yml to set at least one of these:') - + '\nserverwebroot, servergitmirrors, local_copy_dir, awsbucket, ' - + 'virustotal_apikey, androidobservatory, or binary_transparency_remote') + if ( + not config.get('awsbucket') + and not config.get('serverwebroot') + and not config.get('servergitmirrors') + and not config.get('androidobservatory') + and not config.get('binary_transparency_remote') + and not config.get('virustotal_apikey') + and local_copy_dir is None + ): + logging.warning( + _('No option set! Edit your config.yml to set at least one of these:') + + '\nserverwebroot, servergitmirrors, local_copy_dir, awsbucket, ' + + 'virustotal_apikey, androidobservatory, or binary_transparency_remote' + ) sys.exit(1) repo_sections = ['repo'] @@ -860,8 +936,10 @@ def main(): if config['per_app_repos']: repo_sections += common.get_per_app_repos() - if os.path.isdir('unsigned') or (local_copy_dir is not None - and os.path.isdir(os.path.join(local_copy_dir, 'unsigned'))): + if os.path.isdir('unsigned') or ( + local_copy_dir is not None + and os.path.isdir(os.path.join(local_copy_dir, 'unsigned')) + ): repo_sections.append('unsigned') for repo_section in repo_sections: @@ -886,8 +964,7 @@ def main(): binary_transparency_remote = config.get('binary_transparency_remote') if binary_transparency_remote: - push_binary_transparency(BINARY_TRANSPARENCY_DIR, - binary_transparency_remote) + push_binary_transparency(BINARY_TRANSPARENCY_DIR, binary_transparency_remote) common.write_status_json(common.setup_status_output(start_timestamp)) sys.exit(0) diff --git a/pyproject.toml b/pyproject.toml index a4b7ddbe..92f5b8f3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,7 +38,6 @@ force-exclude = '''( | fdroidserver/build\.py | fdroidserver/checkupdates\.py | fdroidserver/common\.py - | fdroidserver/deploy\.py | fdroidserver/import_subcommand\.py | fdroidserver/index\.py | fdroidserver/metadata\.py From bd6afa436513dd8b564eb1d70b9d0ebd15877704 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Wed, 24 Apr 2024 12:45:29 +0200 Subject: [PATCH 1465/2116] =?UTF-8?q?=F0=9F=90=9B=20index=20fix:=20skip=20?= =?UTF-8?q?altstore=20when=20no=20IPAs=20present?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fdroidserver/index.py | 4 ++++ tests/index.TestCase | 2 ++ 2 files changed, 6 insertions(+) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 5a179487..ec99c8ae 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -1766,6 +1766,10 @@ def make_altstore(apps, apks, config, repodir, pretty=False): https://faq.altstore.io/distribute-your-apps/make-a-source https://faq.altstore.io/distribute-your-apps/updating-apps """ + if not any(Path('repo').glob('*.ipa')): + # no IPA files present in repo, nothing to do here, exiting early + return + indent = 2 if pretty else None # for now alt-store support is english only for lang in ['en']: diff --git a/tests/index.TestCase b/tests/index.TestCase index 6e8ec89b..2f137608 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -869,6 +869,8 @@ class AltstoreIndexTest(unittest.TestCase): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): repodir = Path(tmpdir) / 'repo' repodir.mkdir() + with open(repodir / "fake.ipa", "w") as f: + f.write("") fdroidserver.index.make_altstore( apps, From 005a33732c599a466e1955d0316b230a9b863eef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Wed, 24 Apr 2024 11:56:07 +0000 Subject: [PATCH 1466/2116] apply review suggestions --- fdroidserver/index.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index ec99c8ae..fc1b663c 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -1766,7 +1766,7 @@ def make_altstore(apps, apks, config, repodir, pretty=False): https://faq.altstore.io/distribute-your-apps/make-a-source https://faq.altstore.io/distribute-your-apps/updating-apps """ - if not any(Path('repo').glob('*.ipa')): + if not any(Path(repodir).glob('*.ipa')): # no IPA files present in repo, nothing to do here, exiting early return From a742df3758d032ee826068d176302b9f25f03aa8 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 24 Apr 2024 16:13:21 +0200 Subject: [PATCH 1467/2116] add CHANGELOG entry for v2.2.2 --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8caa5483..5e65afe3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) * The `maven:` field is now always a string, with `yes` as a legacy special value. It is no longer treated like a boolean in any case. +## [2.2.2] - 2024-04-24 + +### Added + +* Include sdkmanager as dep in setup.py for Homebrew package. + https://github.com/Homebrew/homebrew-core/pull/164510 + ## [2.2.1] - 2023-03-09 ### Added From cdc7c98707d7b3fba8f25e9a7e10e88c035cc98e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 1 Apr 2024 11:42:23 +0200 Subject: [PATCH 1468/2116] common.get_androguard_APK() is no longer private to the module --- fdroidserver/common.py | 6 +++--- tests/common.TestCase | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index c7c4c5c2..3c7d7dc0 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2647,7 +2647,7 @@ def use_androguard(): use_androguard.show_path = True # type: ignore -def _get_androguard_APK(apkfile): +def get_androguard_APK(apkfile): try: from androguard.core.bytecodes.apk import APK except ImportError as exc: @@ -2793,7 +2793,7 @@ def get_apk_id_androguard(apkfile): .format(path=apkfile)) if not versionName or versionName[0] == '@': - a = _get_androguard_APK(apkfile) + a = get_androguard_APK(apkfile) versionName = ensure_final_value(a.package, a.get_android_resources(), a.get_androidversion_name()) if not versionName: versionName = '' # versionName is expected to always be a str @@ -3160,7 +3160,7 @@ def get_first_signer_certificate(apkpath): cert_encoded = get_certificate(apk.read(cert_files[0])) if not cert_encoded and use_androguard(): - apkobject = _get_androguard_APK(apkpath) + apkobject = get_androguard_APK(apkpath) certs = apkobject.get_certificates_der_v2() if len(certs) > 0: logging.debug(_('Using APK Signature v2')) diff --git a/tests/common.TestCase b/tests/common.TestCase index 543e8eb6..925d61e0 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -902,7 +902,7 @@ class CommonTest(unittest.TestCase): self.assertTrue(os.path.isfile(signed)) self.assertFalse(os.path.isfile(unsigned)) self.assertTrue(fdroidserver.common.verify_apk_signature(signed)) - self.assertEqual('18', fdroidserver.common._get_androguard_APK(signed).get_min_sdk_version()) + self.assertEqual('18', fdroidserver.common.get_androguard_APK(signed).get_min_sdk_version()) shutil.copy(os.path.join(self.basedir, 'minimal_targetsdk_30_unsigned.apk'), self.testdir) unsigned = os.path.join(self.testdir, 'minimal_targetsdk_30_unsigned.apk') @@ -915,7 +915,7 @@ class CommonTest(unittest.TestCase): self.assertFalse(os.path.isfile(unsigned)) self.assertTrue(fdroidserver.common.verify_apk_signature(signed)) # verify it has a v2 signature - self.assertTrue(fdroidserver.common._get_androguard_APK(signed).is_signed_v2()) + self.assertTrue(fdroidserver.common.get_androguard_APK(signed).is_signed_v2()) shutil.copy(os.path.join(self.basedir, 'no_targetsdk_minsdk30_unsigned.apk'), self.testdir) unsigned = os.path.join(self.testdir, 'no_targetsdk_minsdk30_unsigned.apk') @@ -923,7 +923,7 @@ class CommonTest(unittest.TestCase): fdroidserver.common.sign_apk(unsigned, signed, config['keyalias']) self.assertTrue(fdroidserver.common.verify_apk_signature(signed)) - self.assertTrue(fdroidserver.common._get_androguard_APK(signed).is_signed_v2()) + self.assertTrue(fdroidserver.common.get_androguard_APK(signed).is_signed_v2()) shutil.copy(os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk'), self.testdir) unsigned = os.path.join(self.testdir, 'no_targetsdk_minsdk1_unsigned.apk') @@ -1146,11 +1146,11 @@ class CommonTest(unittest.TestCase): """This is a sanity test that androguard isn't broken""" def get_minSdkVersion(apkfile): - apk = fdroidserver.common._get_androguard_APK(apkfile) + apk = fdroidserver.common.get_androguard_APK(apkfile) return fdroidserver.common.get_min_sdk_version(apk) def get_targetSdkVersion(apkfile): - apk = fdroidserver.common._get_androguard_APK(apkfile) + apk = fdroidserver.common.get_androguard_APK(apkfile) return apk.get_effective_target_sdk_version() self.assertEqual(4, get_minSdkVersion('bad-unicode-πÇÇ现代通用字-български-عربي1.apk')) From 7a144a47626b9d2426ee01adb5f3a827fe9330b7 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 1 Apr 2024 11:42:23 +0200 Subject: [PATCH 1469/2116] port to androguard >= 4 and drop support for older than 3.3.3 This also makes androguard a hard requirement, which has been true for a while anyway. So the code that handles androguard as an optional requirement is removed. androguard from Debian/buster is new enough, so this does not seem like it will cause any problems. --- fdroidserver/common.py | 40 +++++++++++++++++----------------------- fdroidserver/update.py | 4 +--- setup.py | 2 +- tests/run-tests | 4 +++- tests/update.TestCase | 15 ++++++++------- 5 files changed, 30 insertions(+), 35 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 3c7d7dc0..f4da28a4 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2629,29 +2629,12 @@ def get_file_extension(filename): return os.path.splitext(filename)[1].lower()[1:] -def use_androguard(): - """Report if androguard is available, and config its debug logging.""" - try: - import androguard - if use_androguard.show_path: - logging.debug(_('Using androguard from "{path}"').format(path=androguard.__file__)) - use_androguard.show_path = False - if options and options.verbose: - logging.getLogger("androguard.axml").setLevel(logging.INFO) - logging.getLogger("androguard.core.api_specific_resources").setLevel(logging.ERROR) - return True - except ImportError: - return False - - -use_androguard.show_path = True # type: ignore - - def get_androguard_APK(apkfile): try: + # these were moved in androguard 4.0 + from androguard.core.apk import APK + except ImportError: from androguard.core.bytecodes.apk import APK - except ImportError as exc: - raise FDroidException("androguard library is not installed") from exc return APK(apkfile) @@ -2693,7 +2676,11 @@ def is_debuggable_or_testOnly(apkfile): """ if get_file_extension(apkfile) != 'apk': return False - from androguard.core.bytecodes.axml import AXMLParser, format_value, START_TAG + try: + # these were moved in androguard 4.0 + from androguard.core.axml import AXMLParser, format_value, START_TAG + except ImportError: + from androguard.core.bytecodes.axml import AXMLParser, format_value, START_TAG with ZipFile(apkfile) as apk: with apk.open('AndroidManifest.xml') as manifest: axml = AXMLParser(manifest.read()) @@ -2753,12 +2740,19 @@ def get_apk_id_androguard(apkfile): versionName is set to a Android String Resource (e.g. an integer hex value that starts with @). + This function is part of androguard as get_apkid(), so this + vendored and modified to return versionCode as an integer. + """ if not os.path.exists(apkfile): raise FDroidException(_("Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'") .format(apkfilename=apkfile)) - from androguard.core.bytecodes.axml import AXMLParser, format_value, START_TAG, END_TAG, TEXT, END_DOCUMENT + try: + # these were moved in androguard 4.0 + from androguard.core.axml import AXMLParser, format_value, START_TAG, END_TAG, TEXT, END_DOCUMENT + except ImportError: + from androguard.core.bytecodes.axml import AXMLParser, format_value, START_TAG, END_TAG, TEXT, END_DOCUMENT appid = None versionCode = None @@ -3159,7 +3153,7 @@ def get_first_signer_certificate(apkpath): elif len(cert_files) == 1: cert_encoded = get_certificate(apk.read(cert_files[0])) - if not cert_encoded and use_androguard(): + if not cert_encoded: apkobject = get_androguard_APK(apkpath) certs = apkobject.get_certificates_der_v2() if len(certs) > 0: diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 23e3d604..be3824bd 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1722,8 +1722,7 @@ def _sanitize_sdk_version(value): def scan_apk_androguard(apk, apkfile): try: - from androguard.core.bytecodes.apk import APK - apkobject = APK(apkfile) + apkobject = common.get_androguard_APK(apkfile) if apkobject.is_valid_APK(): arsc = apkobject.get_android_resources() else: @@ -2581,7 +2580,6 @@ def main(): config = common.read_config(options) common.setup_status_output(start_timestamp) - common.use_androguard() if not (('jarsigner' in config or 'apksigner' in config) and 'keytool' in config): raise FDroidException(_('Java JDK not found! Install in standard location or set java_paths!')) diff --git a/setup.py b/setup.py index 49548f78..94e43e98 100755 --- a/setup.py +++ b/setup.py @@ -92,7 +92,7 @@ setup( ], install_requires=[ 'appdirs', - 'androguard >= 3.1.0, != 3.3.0, != 3.3.1, != 3.3.2, <4', + 'androguard >= 3.3.3', 'clint', 'defusedxml', 'GitPython', diff --git a/tests/run-tests b/tests/run-tests index ca9aa951..31cb4939 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -8,7 +8,9 @@ echo_header() { get_fdroid_apk_filename() { if [ -z $aapt ]; then - python3 -c "from androguard.core.bytecodes.apk import APK; a=APK('$1'); print(a.package+'_'+a.get_androidversion_code()+'.apk')" + appid=$(androguard apkid "$1" | sed -En 's/ +"([a-z][^"]+)",$/\1/ip') + versionCode=$(androguard apkid "$1" | sed -En 's/ +"([0-9]+)",$/\1/p') + echo "${appid}_${versionCode}.apk" else $aapt dump badging "$1" | sed -n "s,^package: name='\(.*\)' versionCode='\([0-9][0-9]*\)' .*,\1_\2.apk,p" fi diff --git a/tests/update.TestCase b/tests/update.TestCase index 2ab19a3a..232537ca 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -5,6 +5,7 @@ import copy import git import glob +import hashlib import inspect import json import logging @@ -20,11 +21,18 @@ import unittest import yaml import zipfile import textwrap +from binascii import hexlify from datetime import datetime from pathlib import Path from testcommon import TmpCwd, mkdtemp from unittest import mock +try: + # these were moved in androguard 4.0 + from androguard.core.apk import APK +except ImportError: + from androguard.core.bytecodes.apk import APK + try: from yaml import CSafeLoader as SafeLoader except ImportError: @@ -581,13 +589,6 @@ class UpdateTest(unittest.TestCase): self.assertEqual(good_fingerprint, sig, 'python sig was: ' + str(sig)) # check that v1 and v2 have the same certificate - try: - import hashlib - from binascii import hexlify - from androguard.core.bytecodes.apk import APK - except ImportError: - print('WARNING: skipping rest of test since androguard is missing!') - return apkobject = APK(apkpath) cert_encoded = apkobject.get_certificates_der_v2()[0] self.assertEqual(good_fingerprint, sig, From 5b7abc04235418ef6d721fe3e4b408e9e49ebe0c Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 24 Apr 2024 11:14:14 +0200 Subject: [PATCH 1470/2116] single function to tame androguard's verbose default output # Conflicts: # fdroidserver/common.py --- fdroidserver/common.py | 30 ++++++++++++++++++++++++++++++ tests/build.TestCase | 2 -- tests/update.TestCase | 3 --- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index f4da28a4..5f01f9a9 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2629,12 +2629,39 @@ def get_file_extension(filename): return os.path.splitext(filename)[1].lower()[1:] +def _androguard_logging_level(level=logging.ERROR): + """Tames androguard's default debug output. + + There should be no debug output when the functions are being used + via the API. Otherwise, the output is controlled by the --verbose + flag. + + To get coverage across the full range of androguard >= 3.3.5, this + includes all known logger names that are relevant. So some of + these names might not be present in the version of androguard + currently in use. + + """ + if options and options.verbose: + level = logging.WARNING + + for name in ( + 'androguard.apk', + 'androguard.axml', + 'androguard.core.api_specific_resources', + 'androguard.core.apk', + 'androguard.core.axml', + ): + logging.getLogger(name).setLevel(level) + + def get_androguard_APK(apkfile): try: # these were moved in androguard 4.0 from androguard.core.apk import APK except ImportError: from androguard.core.bytecodes.apk import APK + _androguard_logging_level() return APK(apkfile) @@ -2681,6 +2708,8 @@ def is_debuggable_or_testOnly(apkfile): from androguard.core.axml import AXMLParser, format_value, START_TAG except ImportError: from androguard.core.bytecodes.axml import AXMLParser, format_value, START_TAG + _androguard_logging_level() + with ZipFile(apkfile) as apk: with apk.open('AndroidManifest.xml') as manifest: axml = AXMLParser(manifest.read()) @@ -2753,6 +2782,7 @@ def get_apk_id_androguard(apkfile): from androguard.core.axml import AXMLParser, format_value, START_TAG, END_TAG, TEXT, END_DOCUMENT except ImportError: from androguard.core.bytecodes.axml import AXMLParser, format_value, START_TAG, END_TAG, TEXT, END_DOCUMENT + _androguard_logging_level() appid = None versionCode = None diff --git a/tests/build.TestCase b/tests/build.TestCase index 6a4ddb02..3ad4cdd0 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -49,8 +49,6 @@ class BuildTest(unittest.TestCase): def setUp(self): logging.basicConfig(level=logging.DEBUG) - logger = logging.getLogger('androguard.axml') - logger.setLevel(logging.INFO) # tame the axml debug messages self.basedir = os.path.join(localmodule, 'tests') os.chdir(self.basedir) fdroidserver.common.config = None diff --git a/tests/update.TestCase b/tests/update.TestCase index 232537ca..0c692aa8 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -82,9 +82,6 @@ class UpdateTest(unittest.TestCase): def setUp(self): logging.basicConfig(level=logging.INFO) - logging.getLogger('androguard.apk').setLevel(logging.WARNING) - logging.getLogger('androguard.axml').setLevel(logging.INFO) - logging.getLogger('androguard.core.api_specific_resources').setLevel(logging.INFO) from PIL import PngImagePlugin logging.getLogger(PngImagePlugin.__name__).setLevel(logging.INFO) From 1c84f63247cff50b08ed15dec59b1c6b4a81c9d0 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 10 Apr 2024 16:51:24 +0200 Subject: [PATCH 1471/2116] replace deprecated get_element() which was removed in 4.x /usr/lib/python3/dist-packages/androguard/core/bytecodes/apk.py:884: DeprecationWarning: This method is deprecated since 3.3.5. It was added in 3.3.5. Debian/bullseye and Ubuntu/20.04/focal both include new enough versions. Debian/buster's is too old (3.3.3). --- fdroidserver/update.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index be3824bd..1c38ff90 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1778,7 +1778,7 @@ def scan_apk_androguard(apk, apkfile): if maxSdkVersion is not None: apk['maxSdkVersion'] = maxSdkVersion - icon_id_str = apkobject.get_element("application", "icon") + icon_id_str = apkobject.get_attribute_value("application", "icon") if icon_id_str: try: icon_id = int(icon_id_str.replace("@", "0x"), 16) diff --git a/setup.py b/setup.py index 94e43e98..8e4e2452 100755 --- a/setup.py +++ b/setup.py @@ -92,7 +92,7 @@ setup( ], install_requires=[ 'appdirs', - 'androguard >= 3.3.3', + 'androguard >= 3.3.5', 'clint', 'defusedxml', 'GitPython', From ef4ec74882e1086643c802e1082b514fe8a2a31b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 24 Apr 2024 15:45:15 +0200 Subject: [PATCH 1472/2116] some parts of androguard 4.x use loguru instead of logging --- fdroidserver/common.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 5f01f9a9..c90db883 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2654,6 +2654,13 @@ def _androguard_logging_level(level=logging.ERROR): ): logging.getLogger(name).setLevel(level) + # some parts of androguard 4.x use loguru instead of logging + try: + from loguru import logger + logger.remove() + except ImportError: + pass + def get_androguard_APK(apkfile): try: From be59b38ac18275e44ab1de52a501426066b08c77 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 25 Apr 2024 12:59:00 +0200 Subject: [PATCH 1473/2116] update: handle ValueError from apkInspector in androguard 4.1 androguard 4.1 uses a new lib called apkInspector instead of zipfile.ZipFile so that it can handle usable but invalid ZIP files. It will also throw ValueError on some things, for example: Traceback (most recent call last): File "/builds/eighthave/fdroidserver/fdroidserver-2.3a0/tests/update.TestCase", line 878, in test_scan_apk_bad_zip fdroidserver.update.scan_apk(apkfile) File "/builds/eighthave/fdroidserver/fdroidserver-2.3a0/fdroidserver/update.py", line 1586, in scan_apk scan_apk_androguard(apk, apk_file) File "/builds/eighthave/fdroidserver/fdroidserver-2.3a0/fdroidserver/update.py", line 1725, in scan_apk_androguard apkobject = common.get_androguard_APK(apkfile) File "/builds/eighthave/fdroidserver/fdroidserver-2.3a0/fdroidserver/common.py", line 2673, in get_androguard_APK return APK(apkfile) File "/usr/local/lib/python3.10/dist-packages/androguard/core/apk/__init__.py", line 273, in __init__ self.zip = ZipEntry.parse(filename, False) File "/usr/local/lib/python3.10/dist-packages/apkInspector/headers.py", line 410, in parse eocd = EndOfCentralDirectoryRecord.parse(apk_file) File "/usr/local/lib/python3.10/dist-packages/apkInspector/headers.py", line 59, in parse raise ValueError("End of central directory record (EOCD) signature not found") ValueError: End of central directory record (EOCD) signature not found --- fdroidserver/update.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 1c38ff90..2ce07fa5 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1738,7 +1738,7 @@ def scan_apk_androguard(apk, apkfile): logging.error(_("Failed to get APK information, skipping {path}") .format(path=apkfile)) raise BuildException(_("Invalid APK")) - except (FileNotFoundError, zipfile.BadZipFile) as e: + except (FileNotFoundError, ValueError, zipfile.BadZipFile) as e: logging.error(_("Could not open APK {path} for analysis: ").format(path=apkfile) + str(e)) raise BuildException(_("Invalid APK")) from e From 6f07538cdc2c1fe373ba11490eb0851a147e428e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 22 Apr 2024 11:49:06 +0200 Subject: [PATCH 1474/2116] mirror: apparently the 'icons' dir does not always exist https://apt.izzysoft.de/fdroid/archive/com.futsch1.medtimer_28.apk: 2024-04-21 18:55:20 ERROR 404: Not Found. https://apt.izzysoft.de/fdroid/archive/com.hardbacknutter.nevertoomanybooks_75.apk: 2024-04-21 18:55:20 ERROR 404: Not Found. https://apt.izzysoft.de/fdroid/archive/com.jovial.jrpn15_20.apk: 2024-04-21 18:55:20 ERROR 404: Not Found. https://apt.izzysoft.de/fdroid/archive/com.jovial.jrpn2_20.apk: 2024-04-21 18:55:20 ERROR 404: Not Found. https://apt.izzysoft.de/fdroid/archive/com.logger.app_8.apk: 2024-04-21 18:55:21 ERROR 404: Not Found. https://apt.izzysoft.de/fdroid/archive/com.lorenzovainigli.foodexpirationdates.foss_22.apk: 2024-04-21 18:55:21 ERROR 404: Not Found. https://apt.izzysoft.de/fdroid/archive/com.openathena_36.apk: 2024-04-21 18:55:21 ERROR 404: Not Found. https://apt.izzysoft.de/fdroid/archive/com.oppzippy.openscq30_21.apk: 2024-04-21 18:55:21 ERROR 404: Not Found. https://apt.izzysoft.de/fdroid/archive/com.sanmer.mrepo_713.apk: 2024-04-21 18:55:21 ERROR 404: Not Found. https://apt.izzysoft.de/fdroid/archive/com.starry.myne_325.apk: 2024-04-21 18:55:21 ERROR 404: Not Found. https://apt.izzysoft.de/fdroid/archive/dev.imranr.obtainium_22602.apk: 2024-04-21 18:55:22 ERROR 404: Not Found. https://apt.izzysoft.de/fdroid/archive/dev.sanmer.pi_137.apk: 2024-04-21 18:55:22 ERROR 404: Not Found. https://apt.izzysoft.de/fdroid/archive/org.breezyweather_50108.apk: 2024-04-21 18:55:22 ERROR 404: Not Found. 2024-04-21 18:55:22,448 ERROR: no "icon" in org.breezyweather 2024-04-21 18:55:22,449 ERROR: no "icon" in com.lorenzovainigli.foodexpirationdates.foss 2024-04-21 18:55:22,449 ERROR: no "icon" in com.jovial.jrpn15 2024-04-21 18:55:22,450 ERROR: no "icon" in com.jovial.jrpn2 2024-04-21 18:55:22,450 ERROR: no "icon" in com.logger.app 2024-04-21 18:55:22,450 ERROR: no "icon" in com.futsch1.medtimer 2024-04-21 18:55:22,451 ERROR: no "icon" in com.sanmer.mrepo 2024-04-21 18:55:22,451 ERROR: no "icon" in com.starry.myne 2024-04-21 18:55:22,451 ERROR: no "icon" in com.hardbacknutter.nevertoomanybooks 2024-04-21 18:55:22,452 ERROR: no "icon" in dev.imranr.obtainium 2024-04-21 18:55:22,452 ERROR: no "icon" in com.openathena 2024-04-21 18:55:22,453 ERROR: no "icon" in com.oppzippy.openscq30 2024-04-21 18:55:22,453 ERROR: no "icon" in dev.sanmer.pi 2024-04-21 18:55:22,454 CRITICAL: Unknown exception found! Traceback (most recent call last): File "/home/fdroid/code/fdroid/fdroidserver/fdroid", line 22, in fdroidserver.__main__.main() File "/home/fdroid/code/fdroid/fdroidserver/fdroidserver/__main__.py", line 230, in main raise e File "/home/fdroid/code/fdroid/fdroidserver/fdroidserver/__main__.py", line 211, in main mod.main() File "/home/fdroid/code/fdroid/fdroidserver/fdroidserver/mirror.py", line 269, in main _run_wget(os.path.join(basedir, section, icondir), urls[icondir]) KeyError: 'icons' --- fdroidserver/mirror.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fdroidserver/mirror.py b/fdroidserver/mirror.py index 224fcc5a..89e5ed66 100644 --- a/fdroidserver/mirror.py +++ b/fdroidserver/mirror.py @@ -268,7 +268,8 @@ def main(): urls[icondir].append(url) for icondir in icondirs: - _run_wget(os.path.join(basedir, section, icondir), urls[icondir]) + if icondir in urls: + _run_wget(os.path.join(basedir, section, icondir), urls[icondir]) if __name__ == "__main__": From f82d648cb147c42032549fb59bdeecfaa3c52ee4 Mon Sep 17 00:00:00 2001 From: linsui Date: Sun, 5 May 2024 17:20:41 +0800 Subject: [PATCH 1475/2116] deploy: retry when git push fails --- fdroidserver/deploy.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 6daa7068..1e28961d 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -837,7 +837,15 @@ def push_binary_transparency(git_repo_path, git_remote): origin.set_url(git_remote) else: origin = gitrepo.create_remote('origin', git_remote) - origin.push(GIT_BRANCH) + for _i in range(3): + try: + origin.push(GIT_BRANCH) + except git.GitCommandError as e: + logging.error(e) + continue + break + else: + raise FDroidException(_("Pushing to remote server failed!")) def main(): From d243cbd030f5112bfcfee65daed38c444aeb3da9 Mon Sep 17 00:00:00 2001 From: linsui Date: Fri, 3 May 2024 20:00:14 +0800 Subject: [PATCH 1476/2116] lint: blocklist known AOSP debug keys in AASK --- fdroidserver/lint.py | 8 +++++++- tests/lint.TestCase | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index fd3d99d8..351667ba 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -722,7 +722,13 @@ def check_updates_ucm_http_aum_pattern(app): # noqa: D403 def check_certificate_pinned_binaries(app): - if len(app.get('AllowedAPKSigningKeys')) > 0: + keys = app.get('AllowedAPKSigningKeys') + known_keys = common.config.get('apk_signing_key_block_list', []) + if keys: + if known_keys: + for key in keys: + if key in known_keys: + yield _('Known debug key is used in AllowedAPKSigningKeys: ') + key return if app.get('Binaries') is not None: yield _( diff --git a/tests/lint.TestCase b/tests/lint.TestCase index 55c314b0..e8e1efba 100755 --- a/tests/lint.TestCase +++ b/tests/lint.TestCase @@ -438,6 +438,25 @@ class LintTest(unittest.TestCase): with self.assertRaises(TypeError): fdroidserver.lint.lint_config('mirrors.yml') + def test_lint_known_debug_keys(self): + config = dict() + fdroidserver.common.fill_config_defaults(config) + config['apk_signing_key_block_list'] = [ + 'a40da80a59d170caa950cf15c18c454d47a39b26989d8b640ecd745ba71bf5dc' + ] + fdroidserver.common.config = config + fdroidserver.lint.config = config + + app = fdroidserver.metadata.App() + app.AllowedAPKSigningKeys = [ + 'a40da80a59d170caa950cf15c18c454d47a39b26989d8b640ecd745ba71bf5dc' + ] + + for warn in fdroidserver.lint.check_certificate_pinned_binaries(app): + anywarns = True + logging.debug(warn) + self.assertTrue(anywarns) + class LintAntiFeaturesTest(unittest.TestCase): def setUp(self): From 14c86479099a4510d650f7392f569f70baab7a91 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 7 May 2024 10:57:55 +0200 Subject: [PATCH 1477/2116] add additional tests --- tests/lint.TestCase | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/lint.TestCase b/tests/lint.TestCase index e8e1efba..e5a0bd75 100755 --- a/tests/lint.TestCase +++ b/tests/lint.TestCase @@ -438,6 +438,32 @@ class LintTest(unittest.TestCase): with self.assertRaises(TypeError): fdroidserver.lint.lint_config('mirrors.yml') + def test_check_certificate_pinned_binaries_empty(self): + fdroidserver.common.config = {} + app = fdroidserver.metadata.App() + app.AllowedAPKSigningKeys = [ + 'a40da80a59d170caa950cf15c18c454d47a39b26989d8b640ecd745ba71bf5dc' + ] + self.assertEqual( + [], + list(fdroidserver.lint.check_certificate_pinned_binaries(app)), + "when the config is empty, any signing key should be allowed", + ) + + def test_lint_known_debug_keys_no_match(self): + fdroidserver.common.config = { + "apk_signing_key_block_list": "a40da80a59d170caa950cf15c18c454d47a39b26989d8b640ecd745ba71bf5dc" + } + app = fdroidserver.metadata.App() + app.AllowedAPKSigningKeys = [ + '2fd4fd5f54babba4bcb21237809bb653361d0d2583c80964ec89b28a26e9539e' + ] + self.assertEqual( + [], + list(fdroidserver.lint.check_certificate_pinned_binaries(app)), + "A signing key that does not match one in the config should be allowed", + ) + def test_lint_known_debug_keys(self): config = dict() fdroidserver.common.fill_config_defaults(config) From 9a9b5beeaa35335192acad446c895f85b7d7e3a6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 7 May 2024 13:19:57 +0200 Subject: [PATCH 1478/2116] simplify test setup I'm in the midst of working towards getting rid of the "config" instances that are in the subcommand module, e.g. `fdroidserver.lint.config` --- tests/lint.TestCase | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/tests/lint.TestCase b/tests/lint.TestCase index e5a0bd75..5dd94d4b 100755 --- a/tests/lint.TestCase +++ b/tests/lint.TestCase @@ -465,19 +465,13 @@ class LintTest(unittest.TestCase): ) def test_lint_known_debug_keys(self): - config = dict() - fdroidserver.common.fill_config_defaults(config) - config['apk_signing_key_block_list'] = [ - 'a40da80a59d170caa950cf15c18c454d47a39b26989d8b640ecd745ba71bf5dc' - ] - fdroidserver.common.config = config - fdroidserver.lint.config = config - + fdroidserver.common.config = { + 'apk_signing_key_block_list': 'a40da80a59d170caa950cf15c18c454d47a39b26989d8b640ecd745ba71bf5dc' + } app = fdroidserver.metadata.App() app.AllowedAPKSigningKeys = [ 'a40da80a59d170caa950cf15c18c454d47a39b26989d8b640ecd745ba71bf5dc' ] - for warn in fdroidserver.lint.check_certificate_pinned_binaries(app): anywarns = True logging.debug(warn) From 299e3e5f4cc55dae7123e610dc068806f2b9002b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 24 Apr 2024 14:53:30 +0200 Subject: [PATCH 1479/2116] index: handle image processing diffs across various Python versions Apparently, the newest Python thingies strip the PNGs a tiny bit smaller, so a fixed file size will lead to the test failing: https://gitlab.com/fdroid/fdroidserver/-/jobs/6703386074 ``` Traceback (most recent call last): File "/builds/fdroid/fdroidserver/tests/index.TestCase", line 704, in test_package_metadata self.assertEqual(36027, metadata['featureGraphic']['en-US']['size']) AssertionError: 36027 != 35619 ``` --- tests/index.TestCase | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/index.TestCase b/tests/index.TestCase index 2f137608..633c0e5f 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -701,8 +701,14 @@ class IndexTest(unittest.TestCase): app = apps[appid] metadata = index.package_metadata(app, 'repo') # files - self.assertEqual(36027, metadata['featureGraphic']['en-US']['size']) - self.assertEqual(1413, metadata['icon']['en-US']['size']) + self.assertEqual( + os.path.getsize(f'repo/{appid}/en-US/featureGraphic.png'), + metadata['featureGraphic']['en-US']['size'], + ) + self.assertEqual( + os.path.getsize(f'repo/{appid}/en-US/icon.png'), + metadata['icon']['en-US']['size'], + ) # localized strings self.assertEqual({'en-US': 'title'}, metadata['name']) self.assertEqual({'en-US': 'video'}, metadata['video']) From 1b65e3383503fa44bf2e38b6c81691d506ed6ba2 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 25 Apr 2024 16:10:59 +0200 Subject: [PATCH 1480/2116] make it easy to keep test artifacts from jobs When troubleshooting things that are difficult to reproduce locally, like different behaviors in the fedora_latest job, these changes make it easy to keep the test files around after the tests run. For example, if PNGs are processed differently by newer Python versions. --- tests/nightly.TestCase | 5 ++++- tests/testcommon.py | 12 ++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/tests/nightly.TestCase b/tests/nightly.TestCase index b6d47447..9e505c7f 100755 --- a/tests/nightly.TestCase +++ b/tests/nightly.TestCase @@ -70,7 +70,10 @@ class NightlyTest(unittest.TestCase): def tearDown(self): self.tempdir.cleanup() - os.rmdir(self.testroot) + try: + os.rmdir(self.testroot) + except OSError: # other test modules might have left stuff around + pass def _copy_test_debug_keystore(self): self.dot_android.mkdir() diff --git a/tests/testcommon.py b/tests/testcommon.py index fe3728ba..069ac42e 100644 --- a/tests/testcommon.py +++ b/tests/testcommon.py @@ -18,6 +18,9 @@ import os import sys import tempfile +import unittest + +from pathlib import Path class TmpCwd: @@ -60,3 +63,12 @@ def mkdtemp(): return tempfile.TemporaryDirectory() else: return tempfile.TemporaryDirectory(ignore_cleanup_errors=True) + + +def mkdir_testfiles(localmodule, test): + """Keep the test files in a labeled test dir for easy reference""" + testroot = Path(localmodule) / '.testfiles' + testroot.mkdir(exist_ok=True) + testdir = testroot / unittest.TestCase.id(test) + testdir.mkdir(exist_ok=True) + return tempfile.mkdtemp(dir=testdir) From 5df3d27126e58797f492a691ce1d412b262285da Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 30 Apr 2024 19:23:52 +0200 Subject: [PATCH 1481/2116] gitlab-ci: stay on Fedora 39 until it is no longer supported We can rely on the debian:testing job to test the bleeding edge, and it is a lot easier to troubleshoot. The Fedora job is a lot harder to troubleshoot than the Debian-based jobs, and they are often quite bleeding edge. Currently, there is a change to either Python or an image processing lib (Pillow?) that now compresses PNGs differently than all previous releases. That breaks the tests based on processing images and checking the SHA-256 matches. 70e7e720b9c2f3cbcf3ae44105abf613fd96767d fdroidserver!669 --- .gitlab-ci.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 79eb1d45..2b0ab577 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -285,9 +285,7 @@ black: - black --check --diff --color $CI_PROJECT_DIR fedora_latest: - image: fedora:latest - only: - - master@fdroid/fdroidserver + image: fedora:39 # support ends on 2024-11-12 script: # tricks to hopefully make runs more reliable - echo "timeout=600" >> /etc/dnf/dnf.conf From 710441129683213c1d4d55c234488e8cb944216d Mon Sep 17 00:00:00 2001 From: linsui Date: Sat, 4 May 2024 19:15:33 +0800 Subject: [PATCH 1482/2116] throw error if gradle build method is used but no build.gradle file is found --- fdroidserver/common.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index c90db883..b1a1827b 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2354,6 +2354,8 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver= gradlefile = build_gradle elif os.path.exists(build_gradle_kts): gradlefile = build_gradle_kts + else: + raise BuildException("No gradle file found") regsub_file(r'compileSdkVersion[ =]+[0-9]+', r'compileSdkVersion %s' % n, gradlefile) From 93f361c6237cefec637a4e558e4d70c7cacfa577 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 29 Apr 2024 12:31:06 +0200 Subject: [PATCH 1483/2116] replace decade old pyasn1 crypto impl with working asn1crypto For some APKs, get_certificate() was returning a different result than apksigner and keytool. So I just took the algorithm from androguard, which uses asn1crypto instead of pyasn1. So that removes a dependency as well. asn1crypto is already required by androguard. The original get_certificate() came from 6e2d0a9e1 --- fdroidserver/common.py | 19 +++---------------- setup.py | 3 +-- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index b1a1827b..5205dc7f 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -54,16 +54,13 @@ from pathlib import Path import defusedxml.ElementTree as XMLElementTree +from asn1crypto import cms from base64 import urlsafe_b64encode from binascii import hexlify from datetime import datetime, timedelta, timezone from queue import Queue from zipfile import ZipFile -from pyasn1.codec.der import decoder, encoder -from pyasn1_modules import rfc2315 -from pyasn1.error import PyAsn1Error - import fdroidserver.metadata import fdroidserver.lint from fdroidserver import _ @@ -3908,18 +3905,8 @@ def get_certificate(signature_block_file): or None in case of error """ - content = decoder.decode(signature_block_file, asn1Spec=rfc2315.ContentInfo())[0] - if content.getComponentByName('contentType') != rfc2315.signedData: - return None - content = decoder.decode(content.getComponentByName('content'), - asn1Spec=rfc2315.SignedData())[0] - try: - certificates = content.getComponentByName('certificates') - cert = certificates[0].getComponentByName('certificate') - except PyAsn1Error: - logging.error("Certificates not found.") - return None - return encoder.encode(cert) + pkcs7obj = cms.ContentInfo.load(signature_block_file) + return pkcs7obj['content']['certificates'][0].chosen.dump() def load_stats_fdroid_signing_key_fingerprints(): diff --git a/setup.py b/setup.py index 8e4e2452..7e8d1912 100755 --- a/setup.py +++ b/setup.py @@ -93,14 +93,13 @@ setup( install_requires=[ 'appdirs', 'androguard >= 3.3.5', + 'asn1crypto', 'clint', 'defusedxml', 'GitPython', 'paramiko', 'Pillow', 'apache-libcloud >= 0.14.1', - 'pyasn1 >=0.4.1', - 'pyasn1-modules >= 0.2.1', 'python-vagrant', 'PyYAML', 'qrcode', From 2fea71a6c7eb43d5c64ab1cf7a4f31015ac07a53 Mon Sep 17 00:00:00 2001 From: linsui Date: Mon, 8 Apr 2024 14:57:28 +0800 Subject: [PATCH 1484/2116] get_first_signer_certificate: check all v1 v2 and v3 certs --- fdroidserver/common.py | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 5205dc7f..7fb0ab8d 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3179,31 +3179,39 @@ def signer_fingerprint(cert_encoded): def get_first_signer_certificate(apkpath): """Get the first signing certificate from the APK, DER-encoded.""" - certs = None - cert_encoded = None + cert_encoded_v1 = None + cert_encoded_v2 = None + cert_encoded_v3 = None with zipfile.ZipFile(apkpath, 'r') as apk: - cert_files = [n for n in apk.namelist() if SIGNATURE_BLOCK_FILE_REGEX.match(n)] - if len(cert_files) > 1: + certs_v1 = [n for n in apk.namelist() if SIGNATURE_BLOCK_FILE_REGEX.match(n)] + if len(certs_v1) > 1: logging.error(_("Found multiple JAR Signature Block Files in {path}").format(path=apkpath)) return None - elif len(cert_files) == 1: - cert_encoded = get_certificate(apk.read(cert_files[0])) + elif len(certs_v1) == 1: + cert_encoded_v1 = get_certificate(apk.read(certs_v1[0])) - if not cert_encoded: + if True apkobject = get_androguard_APK(apkpath) - certs = apkobject.get_certificates_der_v2() - if len(certs) > 0: + certs_v2 = apkobject.get_certificates_der_v2() + if len(certs_v2) > 0: logging.debug(_('Using APK Signature v2')) - cert_encoded = certs[0] - if not cert_encoded: - certs = apkobject.get_certificates_der_v3() - if len(certs) > 0: - logging.debug(_('Using APK Signature v3')) - cert_encoded = certs[0] + cert_encoded_v2 = certs_v2[0] + certs_v3 = apkobject.get_certificates_der_v3() + if len(certs_v3) > 0: + logging.debug(_('Using APK Signature v3')) + cert_encoded_v3 = certs_v3[0] + + cert_encoded = cert_encoded_v3 or cert_encoded_v2 or cert_encoded_v1 if not cert_encoded: logging.error(_("No signing certificates found in {path}").format(path=apkpath)) return None + if ( + (cert_encoded_v2 and cert_encoded_v2 != cert_encoded) + or (cert_encoded_v1 and cert_encoded_v1 != cert_encoded) + ): + logging.error(_("Different certificates found in {path}").format(path=apkpath)) + return None return cert_encoded From 312f822764f1fb603f86a50cfcb9003fbe4037ad Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 29 Apr 2024 12:58:50 +0200 Subject: [PATCH 1485/2116] androguard is required, stop using use_androguard() --- fdroidserver/common.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 7fb0ab8d..d6b85843 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3190,17 +3190,16 @@ def get_first_signer_certificate(apkpath): elif len(certs_v1) == 1: cert_encoded_v1 = get_certificate(apk.read(certs_v1[0])) - if True - apkobject = get_androguard_APK(apkpath) - certs_v2 = apkobject.get_certificates_der_v2() - if len(certs_v2) > 0: - logging.debug(_('Using APK Signature v2')) - cert_encoded_v2 = certs_v2[0] + apkobject = get_androguard_APK(apkpath) + certs_v2 = apkobject.get_certificates_der_v2() + if len(certs_v2) > 0: + logging.debug(_('Using APK Signature v2')) + cert_encoded_v2 = certs_v2[0] - certs_v3 = apkobject.get_certificates_der_v3() - if len(certs_v3) > 0: - logging.debug(_('Using APK Signature v3')) - cert_encoded_v3 = certs_v3[0] + certs_v3 = apkobject.get_certificates_der_v3() + if len(certs_v3) > 0: + logging.debug(_('Using APK Signature v3')) + cert_encoded_v3 = certs_v3[0] cert_encoded = cert_encoded_v3 or cert_encoded_v2 or cert_encoded_v1 if not cert_encoded: From 6f5fd2b132f73995740c0255602ba3dab5791039 Mon Sep 17 00:00:00 2001 From: "FC (Fay) Stegerman" Date: Tue, 9 Apr 2024 11:19:21 +0200 Subject: [PATCH 1486/2116] PoC + writeup + patch https://github.com/obfusk/fdroid-fakesigner-poc/blob/6c6dc25112a8b28a3802b6cba2921d7b91dac59e/fdroidserver.patch#L28 https://github.com/androguard/androguard/issues/1030 refs #1128 (this is an excerpt of the original patch) --- fdroidserver/common.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index d6b85843..e9c7ad92 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3179,6 +3179,12 @@ def signer_fingerprint(cert_encoded): def get_first_signer_certificate(apkpath): """Get the first signing certificate from the APK, DER-encoded.""" + + class NoOverwriteDict(dict): + def __setitem__(self, k, v): + if k not in self: + super().__setitem__(k, v) + cert_encoded_v1 = None cert_encoded_v2 = None cert_encoded_v3 = None @@ -3191,6 +3197,7 @@ def get_first_signer_certificate(apkpath): cert_encoded_v1 = get_certificate(apk.read(certs_v1[0])) apkobject = get_androguard_APK(apkpath) + apkobject._v2_blocks = NoOverwriteDict() certs_v2 = apkobject.get_certificates_der_v2() if len(certs_v2) > 0: logging.debug(_('Using APK Signature v2')) From a8fd360a8866bbebc10a8564e3420e587e655d9b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 19 Apr 2024 23:16:59 +0200 Subject: [PATCH 1487/2116] skip AndroidManifest.xml and resources when fetching v2+ certs --- fdroidserver/common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index e9c7ad92..792100b1 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2661,7 +2661,7 @@ def _androguard_logging_level(level=logging.ERROR): pass -def get_androguard_APK(apkfile): +def get_androguard_APK(apkfile, skip_analysis=False): try: # these were moved in androguard 4.0 from androguard.core.apk import APK @@ -2669,7 +2669,7 @@ def get_androguard_APK(apkfile): from androguard.core.bytecodes.apk import APK _androguard_logging_level() - return APK(apkfile) + return APK(apkfile, skip_analysis=skip_analysis) def ensure_final_value(packageName, arsc, value): From 9a327b5097b2dd221a1e8462c51ac6fe0b616d07 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 25 Apr 2024 18:45:00 +0200 Subject: [PATCH 1488/2116] reliable implementation of get_first_signer_certificate() This keeps key pieces of @linsui's algorithm, specifically the check that all certificates are the same. apksigner also does this check. closes #1128 --- fdroidserver/common.py | 285 +++++++++++++++++++++++++++++++++-------- setup.py | 1 + tests/common.TestCase | 234 +++++++++++++++++++++++++++++++++ tests/index.TestCase | 12 ++ 4 files changed, 482 insertions(+), 50 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 792100b1..b3e41c81 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3161,10 +3161,7 @@ def signer_fingerprint_short(cert_encoded): def signer_fingerprint(cert_encoded): - """Obtain sha256 signing-key fingerprint for pkcs7 DER certificate. - - Extracts hexadecimal sha256 signing-key fingerprint string - for a given pkcs7 signature. + """Return SHA-256 signer fingerprint for PKCS#7 DER-encoded signature. Parameters ---------- @@ -3172,60 +3169,113 @@ def signer_fingerprint(cert_encoded): Returns ------- - shortened signature fingerprint. + Standard SHA-256 signer fingerprint. + """ return hashlib.sha256(cert_encoded).hexdigest() def get_first_signer_certificate(apkpath): - """Get the first signing certificate from the APK, DER-encoded.""" + """Get the first signing certificate from the APK, DER-encoded. + + JAR and APK Signatures allow for multiple signers, though it is + rarely used, and this is poorly documented. So this method only + fetches the first certificate, and errors out if there are more. + + Starting with targetSdkVersion 30, APK v2 Signatures are required. + https://developer.android.com/about/versions/11/behavior-changes-11#minimum-signature-scheme + + When a APK v2+ signature is present, the JAR signature is not + verified. The verifier parses the signers from the v2+ signature + and does not seem to look at the JAR signature. + https://source.android.com/docs/security/features/apksigning/v2#apk-signature-scheme-v2-block + https://android.googlesource.com/platform/tools/apksig/+/refs/tags/android-13.0.0_r3/src/main/java/com/android/apksig/ApkVerifier.java#270 + + apksigner checks that the signers from all the APK signatures match: + https://android.googlesource.com/platform/tools/apksig/+/refs/tags/android-13.0.0_r3/src/main/java/com/android/apksig/ApkVerifier.java#383 + + apksigner verifies each signer's signature block file + .(RSA|DSA|EC) against the corresponding signature file .SF + https://android.googlesource.com/platform/tools/apksig/+/refs/tags/android-13.0.0_r3/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeVerifier.java#280 + + NoOverwriteDict is a workaround for: + https://github.com/androguard/androguard/issues/1030 + + Lots more discusion here: + https://gitlab.com/fdroid/fdroidserver/-/issues/1128 + + """ class NoOverwriteDict(dict): def __setitem__(self, k, v): if k not in self: super().__setitem__(k, v) - cert_encoded_v1 = None - cert_encoded_v2 = None - cert_encoded_v3 = None - with zipfile.ZipFile(apkpath, 'r') as apk: - certs_v1 = [n for n in apk.namelist() if SIGNATURE_BLOCK_FILE_REGEX.match(n)] - if len(certs_v1) > 1: - logging.error(_("Found multiple JAR Signature Block Files in {path}").format(path=apkpath)) - return None - elif len(certs_v1) == 1: - cert_encoded_v1 = get_certificate(apk.read(certs_v1[0])) - + cert_encoded = None + found_certs = [] apkobject = get_androguard_APK(apkpath) apkobject._v2_blocks = NoOverwriteDict() - certs_v2 = apkobject.get_certificates_der_v2() - if len(certs_v2) > 0: - logging.debug(_('Using APK Signature v2')) - cert_encoded_v2 = certs_v2[0] - certs_v3 = apkobject.get_certificates_der_v3() - if len(certs_v3) > 0: - logging.debug(_('Using APK Signature v3')) - cert_encoded_v3 = certs_v3[0] + if certs_v3: + cert_v3 = certs_v3[0] + found_certs.append(cert_v3) + if not cert_encoded: + logging.debug(_('Using APK Signature v3')) + cert_encoded = cert_v3 + + certs_v2 = apkobject.get_certificates_der_v2() + if certs_v2: + cert_v2 = certs_v2[0] + found_certs.append(cert_v2) + if not cert_encoded: + logging.debug(_('Using APK Signature v2')) + cert_encoded = cert_v2 + + if get_min_sdk_version(apkobject) < 24 or ( + not (certs_v3 or certs_v2) and get_effective_target_sdk_version(apkobject) < 30 + ): + with zipfile.ZipFile(apkpath, 'r') as apk: + cert_files = [ + n for n in apk.namelist() if SIGNATURE_BLOCK_FILE_REGEX.match(n) + ] + if len(cert_files) > 1: + logging.error( + _("Found multiple JAR Signature Block Files in {path}").format( + path=apkpath + ) + ) + return + elif len(cert_files) == 1: + signature_block_file = cert_files[0] + signature_file = ( + cert_files[0][: signature_block_file.rindex('.')] + '.SF' + ) + cert_v1 = get_certificate( + apk.read(signature_block_file), + apk.read(signature_file), + ) + found_certs.append(cert_v1) + if not cert_encoded: + logging.debug(_('Using JAR Signature')) + cert_encoded = cert_v1 - cert_encoded = cert_encoded_v3 or cert_encoded_v2 or cert_encoded_v1 if not cert_encoded: logging.error(_("No signing certificates found in {path}").format(path=apkpath)) - return None - if ( - (cert_encoded_v2 and cert_encoded_v2 != cert_encoded) - or (cert_encoded_v1 and cert_encoded_v1 != cert_encoded) - ): - logging.error(_("Different certificates found in {path}").format(path=apkpath)) - return None + return + + if not all(cert == found_certs[0] for cert in found_certs): + logging.error( + _("APK signatures have different certificates in {path}:").format( + path=apkpath + ) + ) + return + return cert_encoded def apk_signer_fingerprint(apk_path): - """Obtain sha256 signing-key fingerprint for APK. - - Extracts hexadecimal sha256 signing-key fingerprint string - for a given APK. + """Get SHA-256 fingerprint string for the first signer from given APK. Parameters ---------- @@ -3234,7 +3284,8 @@ def apk_signer_fingerprint(apk_path): Returns ------- - signature fingerprint + Standard SHA-256 signer fingerprint + """ cert_encoded = get_first_signer_certificate(apk_path) if not cert_encoded: @@ -3243,10 +3294,7 @@ def apk_signer_fingerprint(apk_path): def apk_signer_fingerprint_short(apk_path): - """Obtain shortened sha256 signing-key fingerprint for APK. - - Extracts the first 7 hexadecimal digits of sha256 signing-key fingerprint - for a given pkcs7 APK. + """Get 7 hex digit SHA-256 fingerprint string for the first signer from given APK. Parameters ---------- @@ -3255,7 +3303,8 @@ def apk_signer_fingerprint_short(apk_path): Returns ------- - shortened signing-key fingerprint + first 7 chars of the standard SHA-256 signer fingerprint + """ return apk_signer_fingerprint(apk_path)[:7] @@ -3474,7 +3523,7 @@ def apk_extract_signatures(apkpath, outdir): def get_min_sdk_version(apk): - """Wrap the androguard function to always return and int. + """Wrap the androguard function to always return an integer. Fall back to 1 if we can't get a valid minsdk version. @@ -3485,7 +3534,7 @@ def get_min_sdk_version(apk): Returns ------- - minsdk: int + minSdkVersion: int """ try: return int(apk.get_min_sdk_version()) @@ -3493,6 +3542,24 @@ def get_min_sdk_version(apk): return 1 +def get_effective_target_sdk_version(apk): + """Wrap the androguard function to always return an integer. + + Parameters + ---------- + apk + androguard APK object + + Returns + ------- + targetSdkVersion: int + """ + try: + return int(apk.get_effective_target_sdk_version()) + except TypeError: + return get_min_sdk_version(apk) + + def get_apksigner_smartcardoptions(smartcardoptions): if '-providerName' in smartcardoptions.copy(): pos = smartcardoptions.index('-providerName') @@ -3904,14 +3971,33 @@ def get_cert_fingerprint(pubkey): return " ".join(ret) -def get_certificate(signature_block_file): - """Extract a DER certificate from JAR Signature's "Signature Block File". +def get_certificate(signature_block_file, signature_file=None): + """Extract a single DER certificate from JAR Signature's "Signature Block File". + + If there is more than one signer certificate, this exits with an + error, unless the signature_file is provided. If that is set, it + will return the certificate that matches the Signature File, for + example, if there is a certificate chain, like TLS does. In the + fdroidserver use cases, there should always be a single signer. + But rarely, some APKs include certificate chains. + + This could be replaced by androguard's APK.get_certificate_der() + provided the cert chain fix was merged there. Maybe in 4.1.2? + https://github.com/androguard/androguard/pull/1038 + + https://docs.oracle.com/en/java/javase/21/docs/specs/man/jarsigner.html#the-signed-jar-file Parameters ---------- signature_block_file - file bytes (as string) representing the - certificate, as read directly out of the APK/ZIP + Bytes representing the PKCS#7 signer certificate and + signature, as read directly out of the JAR/APK, e.g. CERT.RSA. + + signature_file + Bytes representing the manifest signed by the Signature Block + File, e.g. CERT.SF. If this is not given, the assumption is + there will be only a single certificate in + signature_block_file, otherwise it is an error. Returns ------- @@ -3920,7 +4006,106 @@ def get_certificate(signature_block_file): """ pkcs7obj = cms.ContentInfo.load(signature_block_file) - return pkcs7obj['content']['certificates'][0].chosen.dump() + certificates = pkcs7obj['content']['certificates'] + if len(certificates) == 1: + return certificates[0].chosen.dump() + elif not signature_file: + logging.error(_('Found multiple Signer Certificates!')) + return + certificate = get_jar_signer_certificate(pkcs7obj, signature_file) + if certificate: + return certificate.chosen.dump() + + +def _find_matching_certificate(signer_info, certificate): + """Find the certificates that matches signer_info using issuer and serial number. + + https://android.googlesource.com/platform/tools/apksig/+/refs/tags/android-13.0.0_r3/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeVerifier.java#590 + https://android.googlesource.com/platform/tools/apksig/+/refs/tags/android-13.0.0_r3/src/main/java/com/android/apksig/internal/x509/Certificate.java#55 + + """ + certificate_serial = certificate.chosen['tbs_certificate']['serial_number'] + expected_issuer_serial = signer_info['sid'].chosen + return ( + expected_issuer_serial['issuer'] == certificate.chosen.issuer + and expected_issuer_serial['serial_number'] == certificate_serial + ) + + +def get_jar_signer_certificate(pkcs7obj: cms.ContentInfo, signature_file: bytes): + """Return the one certificate in a chain that actually signed the manifest. + + PKCS#7-signed data can include certificate chains for use cases + where an Certificate Authority (CA) is used. Android does not + validate the certificate chain on APK signatures, so neither does + this. + https://android.googlesource.com/platform/tools/apksig/+/refs/tags/android-13.0.0_r3/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeVerifier.java#512 + + Some useful fodder for understanding all this: + https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html + https://technotes.shemyak.com/posts/jar-signature-block-file-format/ + https://docs.oracle.com/en/java/javase/21/docs/specs/man/jarsigner.html#the-signed-jar-file + https://qistoph.blogspot.com/2012/01/manual-verify-pkcs7-signed-data-with.html + + """ + import oscrypto.asymmetric + import oscrypto.errors + + # Android attempts to verify all SignerInfos and then picks the first verified SignerInfo. + first_verified_signer_info = None + first_verified_signer_info_signing_certificate = None + for signer_info in pkcs7obj['content']['signer_infos']: + signature = signer_info['signature'].contents + digest_algorithm = signer_info["digest_algorithm"]["algorithm"].native + public_key = None + for certificate in pkcs7obj['content']['certificates']: + if _find_matching_certificate(signer_info, certificate): + public_key = oscrypto.asymmetric.load_public_key(certificate.chosen.public_key) + break + if public_key is None: + logging.info('No certificate found that matches signer info!') + continue + + signature_algo = signer_info['signature_algorithm'].signature_algo + if signature_algo == 'rsassa_pkcs1v15': + # ASN.1 - 1.2.840.113549.1.1.1 + verify_func = oscrypto.asymmetric.rsa_pkcs1v15_verify + elif signature_algo == 'rsassa_pss': + # ASN.1 - 1.2.840.113549.1.1.10 + verify_func = oscrypto.asymmetric.rsa_pss_verify + elif signature_algo == 'dsa': + # ASN.1 - 1.2.840.10040.4.1 + verify_func = oscrypto.asymmetric.dsa_verify + elif signature_algo == 'ecdsa': + # ASN.1 - 1.2.840.10045.4 + verify_func = oscrypto.asymmetric.ecdsa_verify + else: + logging.error( + 'Unknown signature algorithm %s:\n %s\n %s' + % ( + signature_algo, + hexlify(certificate.chosen.sha256).decode(), + certificate.chosen.subject.human_friendly, + ), + ) + return + + try: + verify_func(public_key, signature, signature_file, digest_algorithm) + if not first_verified_signer_info: + first_verified_signer_info = signer_info + first_verified_signer_info_signing_certificate = certificate + + except oscrypto.errors.SignatureError as e: + logging.error( + '"%s", skipping:\n %s\n %s' % ( + e, + hexlify(certificate.chosen.sha256).decode(), + certificate.chosen.subject.human_friendly), + ) + + if first_verified_signer_info_signing_certificate: + return first_verified_signer_info_signing_certificate def load_stats_fdroid_signing_key_fingerprints(): diff --git a/setup.py b/setup.py index 7e8d1912..0b437735 100755 --- a/setup.py +++ b/setup.py @@ -97,6 +97,7 @@ setup( 'clint', 'defusedxml', 'GitPython', + 'oscrypto', 'paramiko', 'Pillow', 'apache-libcloud >= 0.14.1', diff --git a/tests/common.TestCase b/tests/common.TestCase index 925d61e0..52522b14 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -2915,6 +2915,240 @@ class CommonTest(unittest.TestCase): ) +APKS_WITH_JAR_SIGNATURES = ( + ( + 'SpeedoMeterApp.main_1.apk', + '2e6b3126fb7e0db6a9d4c2a06df690620655454d6e152cf244cc9efe9787a77d', + ), + ( + 'apk.embedded_1.apk', + '764f0eaac0cdcde35023658eea865c4383ab580f9827c62fdd3daf9e654199ee', + ), + ( + 'bad-unicode-πÇÇ现代通用字-български-عربي1.apk', + '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', + ), + ( + 'janus.apk', + 'ebb0fedf1942a099b287c3db00ff732162152481abb2b6c7cbcdb2ba5894a768', + ), + ( + 'org.bitbucket.tickytacky.mirrormirror_1.apk', + 'feaa63df35b4635cf091513dfcd6d11209632555efdfc47e33b70d4e4eb5ba28', + ), + ( + 'org.bitbucket.tickytacky.mirrormirror_2.apk', + 'feaa63df35b4635cf091513dfcd6d11209632555efdfc47e33b70d4e4eb5ba28', + ), + ( + 'org.bitbucket.tickytacky.mirrormirror_3.apk', + 'feaa63df35b4635cf091513dfcd6d11209632555efdfc47e33b70d4e4eb5ba28', + ), + ( + 'org.bitbucket.tickytacky.mirrormirror_4.apk', + 'feaa63df35b4635cf091513dfcd6d11209632555efdfc47e33b70d4e4eb5ba28', + ), + ( + 'org.dyndns.fules.ck_20.apk', + '9326a2cc1a2f148202bc7837a0af3b81200bd37fd359c9e13a2296a71d342056', + ), + ( + 'org.sajeg.fallingblocks_3.apk', + '033389681f4288fdb3e72a28058c8506233ca50de75452ab6c9c76ea1ca2d70f', + ), + ( + 'repo/com.example.test.helloworld_1.apk', + 'c3a5ca5465a7585a1bda30218ae4017083605e3576867aa897d724208d99696c', + ), + ( + 'repo/com.politedroid_3.apk', + '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', + ), + ( + 'repo/com.politedroid_4.apk', + '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', + ), + ( + 'repo/com.politedroid_5.apk', + '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', + ), + ( + 'repo/com.politedroid_6.apk', + '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', + ), + ( + 'repo/duplicate.permisssions_9999999.apk', + '659e1fd284549f70d13fb02c620100e27eeea3420558cce62b0f5d4cf2b77d84', + ), + ( + 'repo/info.zwanenburg.caffeinetile_4.apk', + '51cfa5c8a743833ad89acf81cb755936876a5c8b8eca54d1ffdcec0cdca25d0e', + ), + ( + 'repo/no.min.target.sdk_987.apk', + '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', + ), + ( + 'repo/obb.main.oldversion_1444412523.apk', + '818e469465f96b704e27be2fee4c63ab9f83ddf30e7a34c7371a4728d83b0bc1', + ), + ( + 'repo/obb.main.twoversions_1101613.apk', + '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', + ), + ( + 'repo/obb.main.twoversions_1101615.apk', + '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', + ), + ( + 'repo/obb.main.twoversions_1101617.apk', + '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', + ), + ( + 'repo/obb.mainpatch.current_1619.apk', + '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', + ), + ( + 'repo/obb.mainpatch.current_1619_another-release-key.apk', + 'ce9e200667f02d96d49891a2e08a3c178870e91853d61bdd33ef5f0b54701aa5', + ), + ( + 'repo/souch.smsbypass_9.apk', + 'd3aec784b1fd71549fc22c999789122e3639895db6bd585da5835fbe3db6985c', + ), + ( + 'repo/urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk', + '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', + ), + ( + 'repo/v1.v2.sig_1020.apk', + '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', + ), + ( + 'urzip-release.apk', + '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', + ), + ( + 'urzip.apk', + '7eabd8c15de883d1e82b5df2fd4f7f769e498078e9ad6dc901f0e96db77ceac3', + ), +) + + +class SignerExtractionTest(unittest.TestCase): + """Test extraction of the signer certificate from JARs and APKs + + These fingerprints can be confirmed with: + apksigner verify --print-certs foo.apk | grep SHA-256 + keytool -printcert -file ____.RSA + """ + + def setUp(self): + os.chdir(os.path.join(localmodule, 'tests')) + self._td = mkdtemp() + self.testdir = self._td.name + + self.apksigner = shutil.which('apksigner') + self.keytool = shutil.which('keytool') + + def tearDown(self): + self._td.cleanup() + + def test_get_first_signer_certificate_with_jars(self): + for jar in ( + 'signindex/guardianproject-v1.jar', + 'signindex/guardianproject.jar', + 'signindex/testy.jar', + ): + outdir = os.path.join(self.testdir, jar[:-4].replace('/', '_')) + os.mkdir(outdir) + fdroidserver.common.apk_extract_signatures(jar, outdir) + certs = glob.glob(os.path.join(outdir, '*.RSA')) + with open(certs[0], 'rb') as fp: + self.assertEqual( + fdroidserver.common.get_certificate(fp.read()), + fdroidserver.common.get_first_signer_certificate(jar), + ) + + @unittest.skip("slow and only needed when adding to APKS_WITH_JAR_SIGNATURES") + def test_vs_keytool(self): + unittest.skipUnless(self.keytool, 'requires keytool to run') + pat = re.compile(r'[0-9A-F:]{95}') + cmd = [self.keytool, '-printcert', '-jarfile'] + for apk, fingerprint in APKS_WITH_JAR_SIGNATURES: + o = subprocess.check_output(cmd + [apk], text=True) + try: + self.assertEqual( + fingerprint, + pat.search(o).group().replace(':', '').lower(), + ) + except AttributeError as e: + print(e, o) + + @unittest.skip("slow and only needed when adding to APKS_WITH_JAR_SIGNATURES") + def test_vs_apksigner(self): + unittest.skipUnless(self.apksigner, 'requires apksigner to run') + pat = re.compile(r'\s[0-9a-f]{64}\s') + cmd = [self.apksigner, 'verify', '--print-certs'] + for apk, fingerprint in APKS_WITH_JAR_SIGNATURES: + output = subprocess.check_output(cmd + [apk], text=True) + self.assertEqual( + fingerprint, + pat.search(output).group().strip(), + apk + " should have matching signer fingerprints", + ) + + def test_apk_signer_fingerprint_with_v1_apks(self): + for apk, fingerprint in APKS_WITH_JAR_SIGNATURES: + self.assertEqual( + fingerprint, + fdroidserver.common.apk_signer_fingerprint(apk), + f'apk_signer_fingerprint should match stored fingerprint for {apk}', + ) + + def test_get_first_signer_certificate_with_unsigned_jar(self): + self.assertIsNone( + fdroidserver.common.get_first_signer_certificate('signindex/unsigned.jar') + ) + + def test_apk_extract_fingerprint(self): + """Test extraction of JAR signatures (does not cover APK v2+ extraction).""" + for apk, fingerprint in APKS_WITH_JAR_SIGNATURES: + outdir = os.path.join(self.testdir, apk[:-4].replace('/', '_')) + os.mkdir(outdir) + try: + fdroidserver.common.apk_extract_signatures(apk, outdir) + except fdroidserver.apksigcopier.APKSigCopierError: + # nothing to test here when this error is thrown + continue + v1_certs = [str(cert) for cert in Path(outdir).glob('*.[DR]SA')] + cert = fdroidserver.common.get_certificate( + signature_block_file=Path(v1_certs[0]).read_bytes(), + signature_file=Path(v1_certs[0][:-4] + '.SF').read_bytes(), + ) + self.assertEqual( + fingerprint, + fdroidserver.common.signer_fingerprint(cert), + ) + apkobject = fdroidserver.common.get_androguard_APK(apk, skip_analysis=True) + v2_certs = apkobject.get_certificates_der_v2() + if v2_certs: + if v1_certs: + self.assertEqual(len(v1_certs), len(v2_certs)) + self.assertEqual( + fingerprint, + fdroidserver.common.signer_fingerprint(v2_certs[0]), + ) + v3_certs = apkobject.get_certificates_der_v3() + if v3_certs: + if v2_certs: + self.assertEqual(len(v2_certs), len(v3_certs)) + self.assertEqual( + fingerprint, + fdroidserver.common.signer_fingerprint(v3_certs[0]), + ) + + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) diff --git a/tests/index.TestCase b/tests/index.TestCase index 633c0e5f..3fb4a034 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -2,6 +2,7 @@ import copy import datetime +import glob import inspect import logging import optparse @@ -418,6 +419,17 @@ class IndexTest(unittest.TestCase): self.maxDiff = None self.assertEqual(json.dumps(i, indent=2), json.dumps(o, indent=2)) + # and test it still works with get_first_signer_certificate + outdir = os.path.join(self.testdir, 'publishsigkeys') + os.mkdir(outdir) + common.apk_extract_signatures(jarfile, outdir) + certs = glob.glob(os.path.join(outdir, '*.RSA')) + with open(certs[0], 'rb') as fp: + self.assertEqual( + common.get_certificate(fp.read()), + common.get_first_signer_certificate(jarfile), + ) + def test_make_v0_repo_only(self): os.chdir(self.testdir) os.mkdir('repo') From accdd65f91e2850cc071b45258ddbed483618e09 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 19 Apr 2024 23:22:51 +0200 Subject: [PATCH 1489/2116] also handle APKs entirely without JAR/v1 signatures future-proofing! --- MANIFEST.in | 1 + tests/common.TestCase | 23 ++++++++++++++++++++++- tests/issue-1128-min-sdk-30-poc.apk | Bin 0 -> 10728 bytes 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 tests/issue-1128-min-sdk-30-poc.apk diff --git a/MANIFEST.in b/MANIFEST.in index 05a022b2..ee15b587 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -591,6 +591,7 @@ include tests/index.TestCase include tests/init.TestCase include tests/install.TestCase include tests/IsMD5Disabled.java +include tests/issue-1128-min-sdk-30-poc.apk include tests/janus.apk include tests/keystore.jks include tests/key-tricks.py diff --git a/tests/common.TestCase b/tests/common.TestCase index 52522b14..4739ddab 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1039,6 +1039,7 @@ class CommonTest(unittest.TestCase): ('org.bitbucket.tickytacky.mirrormirror_3.apk', 'org.bitbucket.tickytacky.mirrormirror', 3, '1.0.2'), ('org.bitbucket.tickytacky.mirrormirror_4.apk', 'org.bitbucket.tickytacky.mirrormirror', 4, '1.0.3'), ('org.dyndns.fules.ck_20.apk', 'org.dyndns.fules.ck', 20, 'v1.6pre2'), + ('issue-1128-min-sdk-30-poc.apk', 'org.fdroid.ci', 1, '1.0'), ('urzip.apk', 'info.guardianproject.urzip', 100, '0.1'), ('urzip-badcert.apk', 'info.guardianproject.urzip', 100, '0.1'), ('urzip-badsig.apk', 'info.guardianproject.urzip', 100, '0.1'), @@ -1154,6 +1155,7 @@ class CommonTest(unittest.TestCase): return apk.get_effective_target_sdk_version() self.assertEqual(4, get_minSdkVersion('bad-unicode-πÇÇ现代通用字-български-عربي1.apk')) + self.assertEqual(30, get_minSdkVersion('issue-1128-min-sdk-30-poc.apk')) self.assertEqual(14, get_minSdkVersion('org.bitbucket.tickytacky.mirrormirror_1.apk')) self.assertEqual(14, get_minSdkVersion('org.bitbucket.tickytacky.mirrormirror_2.apk')) self.assertEqual(14, get_minSdkVersion('org.bitbucket.tickytacky.mirrormirror_3.apk')) @@ -1164,6 +1166,7 @@ class CommonTest(unittest.TestCase): self.assertEqual(4, get_minSdkVersion('urzip-badsig.apk')) self.assertEqual(4, get_minSdkVersion('urzip-release.apk')) self.assertEqual(4, get_minSdkVersion('urzip-release-unsigned.apk')) + self.assertEqual(27, get_minSdkVersion('v2.only.sig_2.apk')) self.assertEqual(3, get_minSdkVersion('repo/com.politedroid_3.apk')) self.assertEqual(3, get_minSdkVersion('repo/com.politedroid_4.apk')) self.assertEqual(3, get_minSdkVersion('repo/com.politedroid_5.apk')) @@ -3033,6 +3036,16 @@ APKS_WITH_JAR_SIGNATURES = ( '7eabd8c15de883d1e82b5df2fd4f7f769e498078e9ad6dc901f0e96db77ceac3', ), ) +APKS_WITHOUT_JAR_SIGNATURES = ( + ( + 'issue-1128-min-sdk-30-poc.apk', # APK v3 Signature only + '09350d5f3460a8a0ea5cf6b68ccd296a58754f7e683ba6aa08c19be8353504f3', + ), + ( + 'v2.only.sig_2.apk', + '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', + ), +) class SignerExtractionTest(unittest.TestCase): @@ -3090,7 +3103,7 @@ class SignerExtractionTest(unittest.TestCase): unittest.skipUnless(self.apksigner, 'requires apksigner to run') pat = re.compile(r'\s[0-9a-f]{64}\s') cmd = [self.apksigner, 'verify', '--print-certs'] - for apk, fingerprint in APKS_WITH_JAR_SIGNATURES: + for apk, fingerprint in APKS_WITH_JAR_SIGNATURES + APKS_WITHOUT_JAR_SIGNATURES: output = subprocess.check_output(cmd + [apk], text=True) self.assertEqual( fingerprint, @@ -3106,6 +3119,14 @@ class SignerExtractionTest(unittest.TestCase): f'apk_signer_fingerprint should match stored fingerprint for {apk}', ) + def test_apk_signer_fingerprint_without_v1_apks(self): + for apk, fingerprint in APKS_WITHOUT_JAR_SIGNATURES: + self.assertEqual( + fingerprint, + fdroidserver.common.apk_signer_fingerprint(apk), + f'apk_signer_fingerprint should match stored fingerprint for {apk}', + ) + def test_get_first_signer_certificate_with_unsigned_jar(self): self.assertIsNone( fdroidserver.common.get_first_signer_certificate('signindex/unsigned.jar') diff --git a/tests/issue-1128-min-sdk-30-poc.apk b/tests/issue-1128-min-sdk-30-poc.apk new file mode 100644 index 0000000000000000000000000000000000000000..bef0297f49ef90014471bb39874b2de93af98884 GIT binary patch literal 10728 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 literal 0 HcmV?d00001 From fc4a9c96a5b347843eb01074b38f6394bd657b2a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 19 Apr 2024 12:49:02 +0200 Subject: [PATCH 1490/2116] test APK signatures with a cert chain are parsed like apksigner Microsoft and SanDisk sign APKs with a X.509 certificate chain of trust, so there are actually three certificates included. apksigner only cares about one certificate and ignores the other certificates in the chain. The correct values come from: apksigner verify --print-certs 883cbdae7aeb2e4b122e8ee8d89966c7062d0d49107a130235fa220a5b994a79.apk X.509 certificates are machine generated and just data, so are not copyrightable. So I included SANAPPSI.* directly. --- MANIFEST.in | 2 + tests/SANAPPSI.RSA | Bin 0 -> 4060 bytes tests/SANAPPSI.SF | 2044 +++++++++++++++++++++++++++++++++++++++++ tests/common.TestCase | 21 + 4 files changed, 2067 insertions(+) create mode 100644 tests/SANAPPSI.RSA create mode 100644 tests/SANAPPSI.SF diff --git a/MANIFEST.in b/MANIFEST.in index ee15b587..1d7bd768 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -724,6 +724,8 @@ include tests/repo/urzip-*.apk include tests/repo/v1.v2.sig_1020.apk include tests/rewritemeta.TestCase include tests/run-tests +include tests/SANAPPSI.RSA +include tests/SANAPPSI.SF include tests/scanner.TestCase include tests/signatures.TestCase include tests/signindex.TestCase diff --git a/tests/SANAPPSI.RSA b/tests/SANAPPSI.RSA new file mode 100644 index 0000000000000000000000000000000000000000..f727aa8bbfd457009064955c9d6aa017d7bc8672 GIT binary patch literal 4060 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 literal 0 HcmV?d00001 diff --git a/tests/SANAPPSI.SF b/tests/SANAPPSI.SF new file mode 100644 index 00000000..6b32aa9f --- /dev/null +++ b/tests/SANAPPSI.SF @@ -0,0 +1,2044 @@ +Signature-Version: 1.0 +SHA1-Digest-Manifest-Main-Attributes: j30fXwMuyUNMD8CkhJNLiV/4i5U= +Created-By: 1.6.0_26 (Sun Microsystems Inc.) +SHA1-Digest-Manifest: Xrxc4Hzyp+Hy2ZoUSqnJMMLl5rw= + +Name: res/drawable/listselector_black_other.xml +SHA1-Digest: MWLw2UtkVO3XvB4pHy6n040Gf34= + +Name: res/drawable-xhdpi/abs__spinner_ab_pressed_holo_light.9.png +SHA1-Digest: FzjmKCcidOTQaeqKDaRoIPDLRFs= + +Name: res/drawable-ldpi/plus.png +SHA1-Digest: r3DiYpO4vOYO47rZrShRO0BFZhQ= + +Name: res/drawable-mdpi/abs__spinner_48_inner_holo.png +SHA1-Digest: 2lkUs3xv5PleZLwoEPtjpQImnpc= + +Name: res/drawable-xhdpi/network_wifi4_s.png +SHA1-Digest: c2Hm5mmx/ro6D0bz9joCoeKIY+U= + +Name: res/drawable-hdpi/abs__spinner_48_inner_holo.png +SHA1-Digest: CJL2ghapGa7P/c4HGmlTyHSDmUc= + +Name: res/drawable/a02.png +SHA1-Digest: dU9vOCVfKmxTs0qMgCGwiEr5VfQ= + +Name: assets/it/03started_IT.png +SHA1-Digest: mEvR38lU22QT9wFqTmNXGf/nAbc= + +Name: res/drawable/listselector_other.xml +SHA1-Digest: FBWpUfganAevEl3BAaG2T2jd5OI= + +Name: res/layout-v14/sherlock_spinner_item.xml +SHA1-Digest: ql55eok+PCzt8roriI/o6DIfF9s= + +Name: res/drawable-mdpi/settings_dark.png +SHA1-Digest: PlVxcR6DvmNgPigkGtKccKW7hoM= + +Name: res/drawable-xhdpi/abs__ab_bottom_solid_dark_holo.9.png +SHA1-Digest: eFqrKbPnt4coIZuXeRDmTQ2udcQ= + +Name: res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_light.9.png +SHA1-Digest: JpDU0Y1y6F6Ao4HGBg4ANZRivB0= + +Name: assets/es/03started_SP.png +SHA1-Digest: mK6LEVFjuqE64ggWQDhm5GVWLqc= + +Name: res/layout/file_grid_adapter_content.xml +SHA1-Digest: JZ/eJGUIMqzhHUrOderuOCeg2Ro= + +Name: res/drawable-xhdpi/download_dark_green.png +SHA1-Digest: 3tcdWbWCqGwItudsipwUQYQQKXE= + +Name: res/drawable-hdpi/abs__progress_secondary_holo_light.9.png +SHA1-Digest: NclG74rMN1B0DgLYETLDBkWMcNc= + +Name: res/drawable/abs__textfield_searchview_right_holo_light.xml +SHA1-Digest: DKiINexDf/h7yiK0i8DZ++4MCCc= + +Name: res/drawable-mdpi/abs__ic_go.png +SHA1-Digest: gCn3z+l3jF6XzbJ1zu/I/cfOhic= + +Name: res/drawable-xhdpi/abs__cab_background_top_holo_dark.9.png +SHA1-Digest: 0ea3duNXY0J43pi4kHjogRXDHVY= + +Name: res/drawable-hdpi/pause_notify.png +SHA1-Digest: Qhmqe239fUV8+Q2i6vx/0MwbNw8= + +Name: res/drawable/abs__btn_cab_done_holo_dark.xml +SHA1-Digest: LsfiS6IfaXG1BgUZ+g5yuauD4cA= + +Name: res/drawable-hdpi/abs__ab_stacked_transparent_light_holo.9.png +SHA1-Digest: GAKCrxmGsKhItkNy1MAIS2q9vRA= + +Name: res/drawable-mdpi/abs__spinner_ab_default_holo_dark.9.png +SHA1-Digest: LYrwN+jVXg8t1E/QWje1z3utYhE= + +Name: res/drawable-ldpi/download_dark_green.png +SHA1-Digest: 2JmQLIwmNDTuthzVm8qusj0QAzQ= + +Name: res/drawable-mdpi/abs__dialog_full_holo_dark.9.png +SHA1-Digest: 5kMok0yjau7mHw4vozq79vClj1g= + +Name: res/drawable-xhdpi/abs__spinner_ab_pressed_holo_dark.9.png +SHA1-Digest: jZXAbmZiHofjvOsnjGZzKEalq7w= + +Name: res/drawable-xhdpi/abs__ab_stacked_transparent_dark_holo.9.png +SHA1-Digest: Kpd0zjAsuYHF93rPn7rxNL79DQw= + +Name: res/drawable-xhdpi/abs__list_activated_holo.9.png +SHA1-Digest: IfHC/OnL+3bB/ZxOyFCoy5EeBi8= + +Name: res/drawable-xhdpi/settings_downloads.png +SHA1-Digest: SyHeNwSG7iddevDcS21xJZyhEqE= + +Name: assets/fr/03started_FR.png +SHA1-Digest: 7QWErJW9xFOqIlNeRQdur7clgvs= + +Name: res/drawable-xhdpi/abs__ic_search_api_holo_light.png +SHA1-Digest: zzViuA42kPy4ztuyd5jmb69h3UE= + +Name: res/drawable-mdpi/abs__cab_background_top_holo_dark.9.png +SHA1-Digest: AD+zezNsMMkAj2PtUAJjMMu5iDY= + +Name: assets/de/05content_GR.png +SHA1-Digest: 3RuvSnNJFASIQHTF9TYFtdsFCjQ= + +Name: res/drawable-hdpi/abs__list_focused_holo.9.png +SHA1-Digest: cmzK05siG5gg/JMEX6gwLI8okTo= + +Name: res/drawable-mdpi/create_folder_dark.png +SHA1-Digest: yKOjRyT+4K/ay5Zw/gHFGoi+K4o= + +Name: res/drawable-mdpi/abs__list_divider_holo_light.9.png +SHA1-Digest: LYwCyBqiEztiFAeA4HH7i29QWHs= + +Name: assets/ru/04wifi_RUS.png +SHA1-Digest: JPR+kz0ylNKA/oy4LgWuwP5ufxc= + +Name: res/drawable-mdpi/abs__ic_menu_moreoverflow_normal_holo_light.pn + g +SHA1-Digest: tsTtsbOvqALy3nQvq2fpTwpbKF4= + +Name: res/drawable-mdpi/upload2.png +SHA1-Digest: Pb2KTktgUwbKIMnmJ8LFChJdQQc= + +Name: assets/ru/03started_RUS.png +SHA1-Digest: sQ460pKsDXWNKbpYEPYuT7p93cc= + +Name: res/drawable-mdpi/delete_dark.png +SHA1-Digest: lef06JOChh6NdiaUG66+16QSCbs= + +Name: res/drawable/dotted_line.png +SHA1-Digest: 7tyBAkuG9ktS8DcJYsmC+/ADSf8= + +Name: res/drawable-xhdpi/wifi0_s.png +SHA1-Digest: UTmCAMH3PBQG+QiuJPyMcK1tYD4= + +Name: res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png +SHA1-Digest: PSYxMX7M0Pyv7qDHlCHIX8N0vBM= + +Name: res/drawable-xhdpi/abs__dialog_full_holo_light.9.png +SHA1-Digest: 9j/eomOMGL6s6MALfx6BoUqHpTE= + +Name: res/drawable-large-mdpi/icon.png +SHA1-Digest: YujYD3yhWG67AgXqFkEaEcVKc60= + +Name: res/drawable-xhdpi/abs__ic_menu_share_holo_light.png +SHA1-Digest: PkuNwXm1UGjUrzPA6Gd3SDdpl0M= + +Name: assets/zh_CN/04wifi_CHS.png +SHA1-Digest: 31sTREsQW3QhXWsbeUXs+mDu4vc= + +Name: res/layout/file_picker_row.xml +SHA1-Digest: 54eaz24HfzWyNXQ93Z45UaxSCh0= + +Name: res/drawable/abs__spinner_ab_holo_light.xml +SHA1-Digest: fKUkdnpNhn2zLqG/TQcyrcRiBz0= + +Name: res/drawable-mdpi/abs__spinner_ab_pressed_holo_light.9.png +SHA1-Digest: MXzCST6BJQJccxQfpI1YKs9soMA= + +Name: res/drawable-mdpi/abs__ab_solid_shadow_holo.9.png +SHA1-Digest: hGrkC3VbA03lIpo5eAWAIKxUACA= + +Name: assets/it/02qsg_IT.png +SHA1-Digest: nw6+ZqnhIDwdaMxlcQiUvYtMWbU= + +Name: res/drawable-ldpi/upload2_dark.png +SHA1-Digest: O6MiwNx0hNWwhmLzI31w2i1pnbA= + +Name: res/drawable-xhdpi/abs__spinner_ab_default_holo_light.9.png +SHA1-Digest: rN3ozv1THFWfASSLprLsIUefo8A= + +Name: assets/es/05content_SP.png +SHA1-Digest: rCIAUYe9WpDtWEq+UVmOxd4Ty2w= + +Name: assets/ja/02qsg_JAP.png +SHA1-Digest: lIymJ/HfciDGnsSJKzmBjko2YFU= + +Name: res/drawable-mdpi/list.png +SHA1-Digest: xTtboHSYByS0OdKOg4C8LDx+xfE= + +Name: res/drawable-xhdpi/abs__textfield_search_default_holo_light.9.pn + g +SHA1-Digest: WtQajziBu+760kiReahU5rVLMqc= + +Name: res/drawable-ldpi/notify_a02.png +SHA1-Digest: oRz9qSdhdyjiJD97U1n80cA6T+Y= + +Name: res/drawable/prompter_later_icon.png +SHA1-Digest: xKAMzyWVvSUonv9TVwtit0FWBaI= + +Name: res/drawable-hdpi/abs__list_pressed_holo_dark.9.png +SHA1-Digest: tyQ5tBsIsMFbB2+EYlw1QOfshGo= + +Name: res/drawable/abs__search_dropdown_light.xml +SHA1-Digest: R3EDawEdTrc8ZZYB1Zq4EjdM+c4= + +Name: res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png +SHA1-Digest: lUZ07f/+UGDoTLjAZkTwyDWPzS8= + +Name: res/drawable-hdpi/abs__dialog_full_holo_dark.9.png +SHA1-Digest: NZL7OMl0qyFZYaVxYtgttwuB4EM= + +Name: res/drawable-xhdpi/abs__progress_primary_holo_light.9.png +SHA1-Digest: gbM/209feahCWBSz/iSqM+5CQEs= + +Name: res/drawable-xhdpi/abs__ab_solid_light_holo.9.png +SHA1-Digest: oEjEqrCMWcAZlrRm5r9CGgkfbhQ= + +Name: assets/it/04wifi_IT.png +SHA1-Digest: 5jbrfUmBX17mcLNliKGbdePTuuM= + +Name: res/drawable/abs__activated_background_holo_dark.xml +SHA1-Digest: zn1e13WcJRCRd6uIui2lRD/14ps= + +Name: res/drawable/a02_grey.png +SHA1-Digest: aiVy0aSwrCmfwZTzviJwIi0joyc= + +Name: res/drawable/abs__list_selector_background_transition_holo_dark. + xml +SHA1-Digest: nkzZ+Yg/x4857LCaM82WB/8Bv5c= + +Name: res/drawable-hdpi/abs__ab_stacked_solid_light_holo.9.png +SHA1-Digest: VYF3ilhVt0j4XUKE7/i+chELTwU= + +Name: res/layout/abs__action_bar_tab.xml +SHA1-Digest: nGCpM62b21vr2fx48qzseI0Kh2I= + +Name: res/xml/settings_network.xml +SHA1-Digest: Hm4f9jRc32zWhWt7e9ETUSndfqE= + +Name: res/drawable-hdpi/abs__cab_background_bottom_holo_dark.9.png +SHA1-Digest: aXnONgY9LnlqGryUeUqgo7LOSQk= + +Name: res/xml/settings_preferred_networks.xml +SHA1-Digest: aEPm2opo6kZzLtz/SJNIl/ArB7Y= + +Name: res/drawable-ldpi/upload_green_dark.png +SHA1-Digest: qLBaMbh29jvLm4ew5T00JYe86nQ= + +Name: res/drawable-mdpi/abs__tab_selected_holo.9.png +SHA1-Digest: L5T/evq3/QxvwsaGEbem7TflNV4= + +Name: assets/fr/02qsg_FR.png +SHA1-Digest: Q+MQoQYdSNYOvrK67srWZxwyU0E= + +Name: res/drawable-xhdpi/device_grey.png +SHA1-Digest: gJas9+8qpam8yBn92fLMZBfYV8U= + +Name: assets/de/02qsg_GR.png +SHA1-Digest: I+lxqFyScw80Z4jZC3XllZI9tAA= + +Name: res/drawable-xhdpi/sidelink_s.png +SHA1-Digest: YSdNBBj3Twhfakw5mUeob6xmqc8= + +Name: res/drawable-hdpi/abs__ic_ab_back_holo_light.png +SHA1-Digest: CixL+v/te56l/tUQbDjX61YPV00= + +Name: res/drawable/abs__search_dropdown_dark.xml +SHA1-Digest: NXhpyrdvsxnjMhZNexYVfesmAB8= + +Name: res/drawable-xhdpi/abs__spinner_ab_disabled_holo_light.9.png +SHA1-Digest: pdDmHBXa98nEr/3He9uEXSLFC1o= + +Name: res/drawable/android_device.png +SHA1-Digest: W27uCkolI+M1GLnyktdkl8krYXI= + +Name: res/drawable-hdpi/abs__textfield_search_selected_holo_dark.9.png +SHA1-Digest: WBB4+CBudWVmh0lMMVXiNP0JDrU= + +Name: res/drawable-hdpi/create_folder_dark.png +SHA1-Digest: xfti53azeNFBEjWPm6XrcR9T0F0= + +Name: res/drawable-hdpi/notify_a02s.png +SHA1-Digest: oDMYbBNRJAL+bOpfej8MmSlfZHo= + +Name: res/drawable-xhdpi/network_wifi1_s.png +SHA1-Digest: FG1rrohcnefatqyEAdRju68isFw= + +Name: res/layout/prompter.xml +SHA1-Digest: Rd2/j3GAhWBT+9Oyfz+kFG9KZhE= + +Name: res/drawable-mdpi/notify_a02s.png +SHA1-Digest: PYKLvezZQEZhduKHT29nBU36EJg= + +Name: res/drawable/action_bar_background.png +SHA1-Digest: 2kRUSGiW40hppQWVem7dxmBZT9Q= + +Name: res/drawable-hdpi/list_dark.png +SHA1-Digest: 0P1SngBpjnVfhE5k77fqPx+X4lQ= + +Name: res/drawable-hdpi/abs__btn_cab_done_pressed_holo_light.9.png +SHA1-Digest: v8ypJ5NNRgssVGwciTAxLfTJimk= + +Name: res/drawable-mdpi/abs__textfield_search_selected_holo_dark.9.png +SHA1-Digest: HCwKLtZvThjkFwM4ec23apOHRKY= + +Name: res/drawable/listselector_black.xml +SHA1-Digest: Lu3YXjbTs+qeozbdQ6UFpHDFId4= + +Name: res/drawable-hdpi/abs__textfield_search_right_default_holo_dark. + 9.png +SHA1-Digest: 7QBkvHTf6LXBGN5pEiHf8O/eals= + +Name: res/layout/abs__activity_chooser_view_list_item.xml +SHA1-Digest: 8DrPL6nrJch1r5jnnAUGfjufqPI= + +Name: res/drawable-hdpi/abs__ab_bottom_transparent_dark_holo.9.png +SHA1-Digest: u1TLIRZlHuDUKJg9Zfw4ABuD/9E= + +Name: res/drawable-xhdpi/abs__ic_voice_search.png +SHA1-Digest: +GD8FPK5NCAls40MvKX9/6/LJfQ= + +Name: res/drawable-hdpi/abs__textfield_search_right_selected_holo_dark + .9.png +SHA1-Digest: 2IeB+m0vaMbHMFjnOJGzaqY/h2w= + +Name: res/drawable-mdpi/settings.png +SHA1-Digest: YqFHEtD+aqGYihfsfTGKo4Gg4s0= + +Name: res/drawable-xhdpi/abs__ab_transparent_dark_holo.9.png +SHA1-Digest: vSauuGeIKSecU5a1hWJ2RNsNJzQ= + +Name: res/drawable-mdpi/notify_a01.png +SHA1-Digest: qa8aM+G/X1hYqkwGexHSTACFGHc= + +Name: res/drawable-mdpi/abs__ic_search.png +SHA1-Digest: BI0nScADeYpWWpMjIMAT2QY2Umw= + +Name: res/drawable-mdpi/abs__ic_clear_search_api_disabled_holo_light.p + ng +SHA1-Digest: NMg/ydr6pzg1YALEzBCxmkb7kxk= + +Name: res/drawable-xhdpi/wifi1_s.png +SHA1-Digest: +PLjVt6M4emDQvfdVVLjRJeRjvQ= + +Name: res/drawable/file_xls.png +SHA1-Digest: Pf4ayhW4F6PoGLfDrD0bylDULkI= + +Name: res/drawable/folder.png +SHA1-Digest: azkcOt4V16v3sXfFKe0edzAI++o= + +Name: res/drawable-mdpi/download_dark.png +SHA1-Digest: aWHXoyGEKbpj1DTEpRBkpMH6PmI= + +Name: res/drawable-mdpi/abs__ic_menu_share_holo_light.png +SHA1-Digest: magQUaooCQ+JXt60vJsEvewVzkw= + +Name: res/drawable-hdpi/abs__list_divider_holo_light.9.png +SHA1-Digest: dLGGprCGkct4687KEh113PTpG9c= + +Name: res/drawable/checked.png +SHA1-Digest: YGmEtu098UIXrwUi+qILHOocWWk= + +Name: res/drawable-xhdpi/notify_a01.png +SHA1-Digest: fZMn3IkFBOLUwLPbjCQAUj6fSv0= + +Name: assets/es/qsg.html +SHA1-Digest: bZsWIJ91bpeFJSQ93S7g9re+sGU= + +Name: res/drawable/popup_shape.xml +SHA1-Digest: i8MySzOa2xukP/5Wgjw1+BK5qi0= + +Name: res/drawable-hdpi/abs__btn_cab_done_focused_holo_light.9.png +SHA1-Digest: IAoWDEN7FVuyVXzrbwlUiMvTm4A= + +Name: res/drawable/abs__item_background_holo_dark.xml +SHA1-Digest: kvabXA9nk27AJ7fo9ZiEKSYhJUE= + +Name: res/layout/aircruzer_picker.xml +SHA1-Digest: mUa4WrIKIRyAgLqYJ8iAu4NmHK8= + +Name: res/drawable-hdpi/abs__spinner_48_outer_holo.png +SHA1-Digest: UkxSolG4Lj/7rurZhEafioc4GO0= + +Name: res/layout-large/music_land.xml +SHA1-Digest: KlS9PoIMpn+lJLrPIhM73628RfU= + +Name: res/drawable-hdpi/abs__spinner_ab_default_holo_light.9.png +SHA1-Digest: xkdHqtecCptSNAenCziCM6Dx9ug= + +Name: res/layout/gallery_picker.xml +SHA1-Digest: 2iJUVwcyAZVxznNSVnTfV1LlsVc= + +Name: res/drawable-mdpi/abs__menu_dropdown_panel_holo_dark.9.png +SHA1-Digest: xJpDBeVVHEAseQkRi1XAIGMriyA= + +Name: res/drawable-xhdpi/abs__spinner_ab_focused_holo_dark.9.png +SHA1-Digest: 7mQl9j8Z+4d8toEFSV4DWOebffU= + +Name: res/drawable-xhdpi/abs__btn_cab_done_focused_holo_dark.9.png +SHA1-Digest: fxJ1IQV5ASthEhtf9SO0AEDjv24= + +Name: res/layout/file_picker.xml +SHA1-Digest: 7kw3j8NCvK5W62giTMuOIvC8T2E= + +Name: res/drawable-mdpi/abs__ic_ab_back_holo_dark.png +SHA1-Digest: oLfC1AXlyDlkSM5ygmQMDvnKn+k= + +Name: res/drawable-ldpi/upload_green.png +SHA1-Digest: PwNRr2W1ld44CJo390pLw13p4YI= + +Name: assets/fr/04wifi_FR.png +SHA1-Digest: v3KvaQFnOnqzTYAXzp8amgwgRnQ= + +Name: res/drawable-xhdpi/abs__spinner_ab_disabled_holo_dark.9.png +SHA1-Digest: wK6pwNPNoO+a3FlkoF9etbrUgak= + +Name: res/drawable-ldpi/download.png +SHA1-Digest: 1f8VPGCHjHmxVYpgEn2PLCWoHBA= + +Name: res/layout/sherlock_spinner_dropdown_item.xml +SHA1-Digest: 1cUUR7HCn106iA3nxGAf4gLC+Zs= + +Name: res/drawable/prompter_now_icon.png +SHA1-Digest: Xl6Skkfd/1hmJ9pWgKx6fcJ5wV0= + +Name: res/drawable-xhdpi/abs__list_divider_holo_dark.9.png +SHA1-Digest: 7MWXoXdFBtj0xevridg2MwrPea8= + +Name: res/drawable/sandisk_logo.png +SHA1-Digest: qGLW0i4OsY8+etWOKh6/GSu/sbg= + +Name: res/drawable-mdpi/abs__ic_menu_share_holo_dark.png +SHA1-Digest: KUK59sOtpbaNtfvXHu/d4jfjiLc= + +Name: res/drawable-xhdpi/abs__list_longpressed_holo.9.png +SHA1-Digest: +gyZSFuut8L02SGSZyG5FJp9E+Q= + +Name: res/drawable-mdpi/refresh.png +SHA1-Digest: CSig0drvev6druFbHw26duEWnFo= + +Name: res/drawable-v11/abs__progress_medium_holo.xml +SHA1-Digest: LurSPK+0Yc5jfqHJsXs8SvPKWOM= + +Name: res/drawable/a02c_grey.png +SHA1-Digest: 8n2IpMfIu7vjfIyAZTVWll9g8W8= + +Name: res/drawable-mdpi/notify_a02c.png +SHA1-Digest: TBUp+3CWqRFDqdyemYTZvGngOEE= + +Name: assets/es/04wifi_SP.png +SHA1-Digest: xt39BDWJq+w7ApRN9ETYkhDbWqE= + +Name: res/layout/abs__screen_action_bar.xml +SHA1-Digest: UbWFvLTcPmF0fX/XOJ8qhqFOeuE= + +Name: res/drawable-mdpi/abs__dialog_full_holo_light.9.png +SHA1-Digest: 30Fq6J0OLML2NvEWQAhQxTVZd5Y= + +Name: res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_dark.9.png +SHA1-Digest: xAFz3vWGpge38sxmXPLI27vEPuo= + +Name: res/drawable-hdpi/abs__ic_search.png +SHA1-Digest: mmxhF1hpNdi0wm72NijW0w20Wxc= + +Name: res/layout/wep_password_alert.xml +SHA1-Digest: Kaiw5ruYgDSd0vym8pT0gbSW2Ps= + +Name: res/drawable/abs__list_selector_holo_dark.xml +SHA1-Digest: g79M/u/cZDt/7dZ55Jt1qvM6Suc= + +Name: res/drawable/listselector_focused.xml +SHA1-Digest: h8p7/nYjxNaiu6hlXih1FQAk/0c= + +Name: res/layout-v14/sherlock_spinner_dropdown_item.xml +SHA1-Digest: j2ApyFQZMBt+76GszojrnEGCZN8= + +Name: res/drawable/next_enabled.png +SHA1-Digest: 9ICEJCjzSjugC9UrHVT9QZt9jWE= + +Name: res/drawable-xhdpi/network_wifi2.png +SHA1-Digest: tTt97KZdQ1B3XABarNLU6AyigkQ= + +Name: res/drawable-hdpi/abs__textfield_search_selected_holo_light.9.pn + g +SHA1-Digest: LLpilWiHrYuALiQ/5iUQR5OPXf0= + +Name: res/layout/wifi_settings_warning.xml +SHA1-Digest: kvnbz3CLSaBQAordW6dqNayZQM8= + +Name: assets/zh_CN/05content_CHS.png +SHA1-Digest: Dlw67oaNJg6zEs7ffBGDMhHSfaE= + +Name: res/drawable-mdpi/abs__progress_secondary_holo_dark.9.png +SHA1-Digest: /SAgp/k2IQYLgj++eNO4dKNGq5s= + +Name: res/drawable-mdpi/plus.png +SHA1-Digest: lTvzNUMQaZsgu0mE9JTY2Qfx9Tg= + +Name: res/drawable-mdpi/abs__progress_secondary_holo_light.9.png +SHA1-Digest: jFGNeShp/bv741EZVHK7OcedTqc= + +Name: res/drawable-hdpi/abs__menu_dropdown_panel_holo_dark.9.png +SHA1-Digest: zrm68udX1iJ5dagtmsfWz7HTFXo= + +Name: res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_dark.pn + g +SHA1-Digest: 1sb6CD9Si8eb/l514oNT+ScOJrQ= + +Name: res/drawable-hdpi/abs__ab_bottom_solid_dark_holo.9.png +SHA1-Digest: UNxoaN6XzupxEBNdFCWbravjlHI= + +Name: res/drawable-hdpi/abs__ic_clear_normal.png +SHA1-Digest: +TgrkKGRoFESWLJbCtYv3ujChX0= + +Name: assets/de/qsg.html +SHA1-Digest: nHFEaNWoeHgEplG52NGG7RSRf4U= + +Name: assets/fr/qsg.html +SHA1-Digest: CirZ/0A1w1cIHY5asuFquvSVut0= + +Name: res/drawable-xhdpi/abs__list_selector_disabled_holo_dark.9.png +SHA1-Digest: /DYDUk9WKWg/XaPZlHYTRwCZQ78= + +Name: assets/ru/05content_RUS.png +SHA1-Digest: s4Us4TagsG8KKT+RPj8WuF4r6So= + +Name: res/layout/aircruzer_adapter_content_favourite.xml +SHA1-Digest: CWF6fC18Cnm53EfApkidk//Rel8= + +Name: res/drawable-mdpi/abs__list_pressed_holo_dark.9.png +SHA1-Digest: MVZcqs4uf/1z86YrgdchuFApXFM= + +Name: res/drawable/high_white.png +SHA1-Digest: T6mvyxxAO5uOQq8ea7Pc+L7Wvw4= + +Name: res/drawable-hdpi/icon.png +SHA1-Digest: Xsnl13yqIhN0Yhcvt6sFGxiirOo= + +Name: res/drawable-hdpi/grid.png +SHA1-Digest: mngmQBkqDkTgX8qlKQVqmMUeKDE= + +Name: res/drawable-mdpi/abs__ab_stacked_solid_light_holo.9.png +SHA1-Digest: 0JeD4BWiJde5QSs8vsJGbSSRo9w= + +Name: res/drawable-ldpi/refresh.png +SHA1-Digest: /tKyif+HMcLguuOSmjrHG/epHwM= + +Name: res/drawable-hdpi/select.png +SHA1-Digest: VO6hSFGY0YHXhiTM6M/A3PGGpP8= + +Name: assets/it/01logo.png +SHA1-Digest: RNSf8yo0o5QQ3BW+JNLGjlmkYXM= + +Name: res/drawable-hdpi/abs__cab_background_top_holo_dark.9.png +SHA1-Digest: rf/kCJZARmuzLhNTzuiyPaOEskQ= + +Name: assets/en/05content.png +SHA1-Digest: Li5BBPpeE7/LCDZt8u5kNtqYOwg= + +Name: res/drawable-hdpi/notify_a02c.png +SHA1-Digest: Dh52ybGFrkCfij/0fI7PjnvaOc4= + +Name: res/drawable-xhdpi/abs__list_divider_holo_light.9.png +SHA1-Digest: x9+PP/XbxupQBFw9ABGcxRaJgk8= + +Name: res/drawable-mdpi/abs__ab_stacked_solid_dark_holo.9.png +SHA1-Digest: lI9GC0V2P8dv41uhoIPkw4Y6mZo= + +Name: res/drawable-mdpi/abs__ab_stacked_transparent_dark_holo.9.png +SHA1-Digest: Kc817gaU1Y6yov4eCjYPnOidbls= + +Name: res/drawable-mdpi/abs__ic_voice_search_api_holo_light.png +SHA1-Digest: 49Mq99v4olptPThmPP6j0nawT5w= + +Name: assets/en/01logo.png +SHA1-Digest: P2VlOLMuEir8Gdy0m4iyp5dmmhg= + +Name: res/drawable-xhdpi/abs__dialog_full_holo_dark.9.png +SHA1-Digest: 4nyi+mJAOsENtuCTXd465Y7Uq34= + +Name: assets/it/05content_IT.png +SHA1-Digest: VScV9vj7O+YBpuD/KLtHeaDYgM8= + +Name: res/drawable-hdpi/abs__progress_primary_holo_dark.9.png +SHA1-Digest: xXc1hIjT3vO67xsQT889wFhGrKs= + +Name: res/drawable-xhdpi/abs__ic_cab_done_holo_dark.png +SHA1-Digest: 9ghTrZlcnowNCN7lR28T+hDGtx8= + +Name: res/drawable-hdpi/abs__ic_go.png +SHA1-Digest: CWye9x3DUeO8YvBEl1yhf4hqaCE= + +Name: res/drawable-xhdpi/abs__ic_ab_back_holo_light.png +SHA1-Digest: z0ke+ia8F5RJjuMHQV9UdRAL3P4= + +Name: res/drawable-xhdpi/abs__textfield_search_right_selected_holo_lig + ht.9.png +SHA1-Digest: tSHxYUUEcy8RD4s5TEbOlAEJfh0= + +Name: res/drawable/file_doc.png +SHA1-Digest: 3hfZjdvB8ZWf5avOTl+z8c/Vkgc= + +Name: assets/ja/01logo.png +SHA1-Digest: /kWuYVhfsI65oSZy3VdTB6LrflA= + +Name: res/drawable-mdpi/upload_green_dark.png +SHA1-Digest: V1zUuj6ac7912Xmlzxeia6XbmJM= + +Name: assets/fr/01logo.png +SHA1-Digest: tmDNQx2XK65qimY3EhcVQfGlMFQ= + +Name: assets/zh_TW/04wifi_CHT.png +SHA1-Digest: L9fvKVAB54jMZtIe6oRsZGZRVxc= + +Name: res/drawable-xhdpi/abs__cab_background_bottom_holo_dark.9.png +SHA1-Digest: AJF3Ifc4kOwddl5NuxnGmPnK7OU= + +Name: res/drawable-mdpi/abs__ab_transparent_light_holo.9.png +SHA1-Digest: +sJdheZQoN+Dh1tRbjQLO8UssyE= + +Name: res/drawable-xhdpi/abs__btn_cab_done_focused_holo_light.9.png +SHA1-Digest: j2PXHb9r4hT0LWIRTKUHxChl30c= + +Name: res/drawable-xhdpi/upload_green_dark.png +SHA1-Digest: IbTADVnQwWLiu1l43ExAngRW8Dc= + +Name: res/drawable/movie_overlay.png +SHA1-Digest: z2TC/ukywxRi53YxsD0tgyoK4us= + +Name: res/drawable-xhdpi/network_wifi1.png +SHA1-Digest: 7PAxMoYaxPIPNGuREZCEEnRjRYc= + +Name: res/drawable-hdpi/abs__ab_solid_light_holo.9.png +SHA1-Digest: 7J9Q5byq8vS6biNpHOPV7jomAk8= + +Name: assets/ru/02qsg_RUS.png +SHA1-Digest: Kl1hRbcezp9vKUlIqxtzio5Ft58= + +Name: res/drawable-xhdpi/plus.png +SHA1-Digest: rxqIzUjL1DFneMGTIZ0fuqCUUN4= + +Name: res/drawable-xhdpi/network_wifi2_s.png +SHA1-Digest: J3h3K/KDENlGE3agp94SGGgVnWM= + +Name: res/drawable-hdpi/abs__spinner_ab_focused_holo_light.9.png +SHA1-Digest: AQXKZr6CJIMys4qb8nRR6AwGmeI= + +Name: res/drawable-xhdpi/abs__progress_bg_holo_dark.9.png +SHA1-Digest: mkjM/2bQaaMvKLY2Mu+dvCM66IQ= + +Name: res/drawable-xhdpi/list.png +SHA1-Digest: zfCy6xQnp3SG6VbxFb07FLfVbcM= + +Name: res/drawable/a02s.png +SHA1-Digest: GSeeNT/Is+ISxESrkcR/BkEIIhg= + +Name: res/drawable/a01_grey.png +SHA1-Digest: o4x4egouND9Eg5F/V7gYepH8BN8= + +Name: res/layout/wifi_enable_alert.xml +SHA1-Digest: FgLGchDLnLd7+qzxlJ2+7keKbRY= + +Name: res/drawable-hdpi/upload_green.png +SHA1-Digest: XP257A4Y2Y6FUjE62C860jDOLY4= + +Name: res/drawable-xhdpi/abs__list_selector_disabled_holo_light.9.png +SHA1-Digest: sJGoCoseoFVk5x28K8JfgpfauJU= + +Name: res/raw/wfd1080.df2 +SHA1-Digest: Ze7bkm1Xf+wAM3smectt968klJU= + +Name: res/layout/abs__search_dropdown_item_icons_2line.xml +SHA1-Digest: 4yM8M6LQlEPx2E+FHxwod7YcekM= + +Name: res/layout/aircruzer_adapter_content.xml +SHA1-Digest: 3qvJQmem0vvS/7ZR6cmu41EFTiY= + +Name: res/drawable/file_transfer_progress.xml +SHA1-Digest: zB1xmdjVW6s5lICKEF8R1CvjR5U= + +Name: res/drawable-xhdpi/abs__tab_unselected_pressed_holo.9.png +SHA1-Digest: 93qSifuDk+T5snBLIpvN4wO1K7U= + +Name: res/drawable-mdpi/abs__ab_bottom_transparent_light_holo.9.png +SHA1-Digest: vubKHcANJCKtDTtxkgYFicJ4SNY= + +Name: res/drawable-mdpi/abs__ab_bottom_solid_inverse_holo.9.png +SHA1-Digest: lkth7LAKOZYfoGCArce+VxCnMkE= + +Name: AndroidManifest.xml +SHA1-Digest: 1Q6sDBqzh5rE3qugFvZGPvLd1XU= + +Name: res/drawable/listselector.xml +SHA1-Digest: 3hAl/K8dWhvmmpXiOVOgNsm+r3c= + +Name: res/drawable-xhdpi/grid.png +SHA1-Digest: v+u9B3UCpBYlFWM8jLqBkH+bYBc= + +Name: res/drawable-xhdpi/wifi3_s.png +SHA1-Digest: RxU+HxB9gVfKWrvwmqxWnxyw2x8= + +Name: assets/ko/04wifi_KOR.png +SHA1-Digest: GdSrIVVUgjwMHjdlzuj4wo6+I7I= + +Name: res/layout/network_adapter_content.xml +SHA1-Digest: kZG1xqaJa5j9h4oUCh2HivuxkD4= + +Name: res/drawable-mdpi/grid_dark.png +SHA1-Digest: H0+9LNUPoy819qukjO/zCq812yI= + +Name: res/drawable/close.png +SHA1-Digest: CyX8gjcx2fMTrzKkUSeloiLvntA= + +Name: res/drawable-hdpi/abs__ab_transparent_light_holo.9.png +SHA1-Digest: 4kTcWnz88o9/SYFJwj/yXDU8yEE= + +Name: res/layout/abs__list_menu_item_radio.xml +SHA1-Digest: w+7s4YfCDkdrD+3Kd2/8Upoj5IA= + +Name: res/drawable-mdpi/abs__progress_bg_holo_light.9.png +SHA1-Digest: xVHcWEktmp97Mv3RfXsYYUYbTZE= + +Name: classes.dex +SHA1-Digest: 3km0wVfqQhtB471ajuKsk/KN6ik= + +Name: res/drawable/file_generic.png +SHA1-Digest: g2sd8B1VVAF2jZIDPuREiP1OrfM= + +Name: res/drawable-hdpi/abs__ab_stacked_solid_dark_holo.9.png +SHA1-Digest: UN6hqgMRSJHlLtONWT/5Dj1jldI= + +Name: res/drawable-xhdpi/pause_notify +SHA1-Digest: QqGYzYpLgbJ/DYEo97b5qkriSss= + +Name: res/drawable-xhdpi/abs__ab_solid_dark_holo.9.png +SHA1-Digest: jFrVTtT+2Gung7B7LdaO7zrVRCs= + +Name: res/drawable-xhdpi/settings_about.png +SHA1-Digest: 1FNVYaUf6Q/xrQoIeUD72aYQOuE= + +Name: res/drawable-hdpi/settings.png +SHA1-Digest: 6GK/sbX5QyQgjDZZ4r1w6UzrybU= + +Name: res/drawable-hdpi/abs__list_activated_holo.9.png +SHA1-Digest: I5QuxwxZ7oH/jjm7tnyYPs5kGh4= + +Name: assets/zh_TW/qsg.html +SHA1-Digest: pg0DYaTbVF+LvhneZsCK/Ucz0pY= + +Name: res/drawable-hdpi/abs__list_selector_disabled_holo_light.9.png +SHA1-Digest: aHGtLDCWy+vhaDj0NTpqi86fqY8= + +Name: res/drawable-hdpi/upload2_dark.png +SHA1-Digest: X9LMedqsA/ZvVUdh3Qu7hvBYGE0= + +Name: res/drawable-mdpi/abs__ab_solid_dark_holo.9.png +SHA1-Digest: JA/enCGf3vLcIhBUD+ZyXReZbdA= + +Name: res/drawable/file_txt.png +SHA1-Digest: 4emL5HYvYse7i3yqh7ckcaKlDJQ= + +Name: assets/ko/01logo.png +SHA1-Digest: KITx/kNaTnhYUbCm08v6jANm6b4= + +Name: res/layout/abs__list_menu_item_icon.xml +SHA1-Digest: A7MIR0vPrtL5J9AnNtIEnrB2h58= + +Name: res/color/abs__primary_text_disable_only_holo_dark.xml +SHA1-Digest: N3cOSy8QRTwjEm+T8Vyr7f7m5vM= + +Name: res/drawable-xhdpi/abs__btn_cab_done_default_holo_dark.9.png +SHA1-Digest: kSrvB3EWls1z+/3U+R3NgEiJtIQ= + +Name: res/drawable/phone_memory.png +SHA1-Digest: Lzo4e5YM8LSI0J6AD9/Wm3flT3c= + +Name: res/drawable-ldpi/movie.png +SHA1-Digest: 9QUv1g/c1L/X+774grvlhsRYFyw= + +Name: assets/it/qsg.html +SHA1-Digest: M/tpiMIqBAHpWB6Xs+fYzvCPv24= + +Name: assets/ko/03started_KOR.png +SHA1-Digest: /7pcS0DbudzUokivNnHhQpyn9vo= + +Name: res/drawable-hdpi/abs__cab_background_top_holo_light.9.png +SHA1-Digest: xTKcdW1X3evtBeWUTRtQHGUmvPg= + +Name: res/drawable-ldpi/upload2.png +SHA1-Digest: DMzgDh+wLox+OTp+CIL+ft2RONY= + +Name: res/drawable-mdpi/abs__ic_cab_done_holo_light.png +SHA1-Digest: gEkAYxPguS0vwjdi5GNBkBtKy/c= + +Name: res/drawable-mdpi/abs__progress_primary_holo_light.9.png +SHA1-Digest: dnKu/UA+XXZ6wxpF4RwPVuFfv1o= + +Name: res/drawable-mdpi/download_green.png +SHA1-Digest: 7anCwJPhKan3u7r2hUfxECEa8Bg= + +Name: res/drawable-mdpi/abs__progress_primary_holo_dark.9.png +SHA1-Digest: kzQLW28P8eWguDdlc8z7TZJH1NI= + +Name: res/drawable-ldpi/icon.png +SHA1-Digest: Y2eY1QCqoql+tnKq3j92CqrYq+I= + +Name: res/drawable-xhdpi/abs__spinner_48_outer_holo.png +SHA1-Digest: z8eDjuVkpuobA0RIVrS16o9J5Bk= + +Name: assets/ko/02qsg_KOR.png +SHA1-Digest: KBeJT96DDIcncWn+3jlNnpTVhnQ= + +Name: assets/zh_TW/05content_CHT.png +SHA1-Digest: d79KVFIyEH6iyDUsTSkxmXIi4FM= + +Name: res/drawable-xhdpi/sidelink.png +SHA1-Digest: QpuIs015XEkg+CQyNlzlYVjwfJA= + +Name: res/drawable/charging_2.png +SHA1-Digest: tRCy1BdHmg1HW46UxkPAHTywUFw= + +Name: res/drawable-xhdpi/abs__textfield_search_right_default_holo_ligh + t.9.png +SHA1-Digest: ZlENnTiHiVJnaXNDZziSFqGsy04= + +Name: res/drawable-mdpi/abs__progress_bg_holo_dark.9.png +SHA1-Digest: sa9YmWZKkkpUQ2bim/IvHhRtTVc= + +Name: res/drawable-mdpi/abs__ab_bottom_transparent_dark_holo.9.png +SHA1-Digest: TkJkUaylN89agUsoukHpqVXP8DQ= + +Name: res/drawable-xhdpi/abs__menu_dropdown_panel_holo_dark.9.png +SHA1-Digest: ts+1yVv8L3pBUMna7Ynj/ql914g= + +Name: res/drawable-hdpi/abs__tab_selected_holo.9.png +SHA1-Digest: kEcZGvbxtC+bZbKatmju03RhNRY= + +Name: res/layout-large/abs__action_mode_close_item.xml +SHA1-Digest: Fpvreh8RqsZaupAX541M3lS2nJc= + +Name: res/drawable-mdpi/abs__spinner_ab_disabled_holo_light.9.png +SHA1-Digest: B33L83GqHqw+54XJNHCEERj1J+4= + +Name: res/drawable-hdpi/abs__spinner_ab_pressed_holo_dark.9.png +SHA1-Digest: GRtPmHKBT0GPZ09Wsdm3QBp8sf8= + +Name: res/drawable-hdpi/notify_a02.png +SHA1-Digest: ZMmQ+l3zl+VAlPgNT6VPZpQyP2k= + +Name: res/layout/abs__dialog_title_holo.xml +SHA1-Digest: fvAYG2/jNVDTJyw0zh2uuqEirgI= + +Name: res/drawable/abs__list_selector_background_transition_holo_light + .xml +SHA1-Digest: 5RlvHkuer3Si6PKrDVOiblzLKBg= + +Name: res/drawable/unchecked.png +SHA1-Digest: 6kie/fO5imSzHMh8BvJHhzM6Mgo= + +Name: res/layout/settings_quick_start.xml +SHA1-Digest: jcU39268CLX4fsu1zy9cE/Hjb5s= + +Name: res/drawable-mdpi/abs__ic_clear_normal.png +SHA1-Digest: RYYQ9ky5+LbX58GkSGnq9am+1YQ= + +Name: res/xml/settings.xml +SHA1-Digest: 5OP8tootKpWlqnA7SikzWuyknno= + +Name: res/drawable-hdpi/abs__ab_solid_dark_holo.9.png +SHA1-Digest: LQeQB4SfeOCgaQHq+K6yaooPJA4= + +Name: res/drawable-xhdpi/abs__textfield_search_right_default_holo_dark + .9.png +SHA1-Digest: CUR20AnfKGpE6ZXBnCAmkld8mdU= + +Name: res/drawable-hdpi/abs__textfield_search_default_holo_light.9.png +SHA1-Digest: 2e1Mor2JS0wSl3OmphZG535kkvE= + +Name: res/drawable-xhdpi/abs__ab_stacked_solid_dark_holo.9.png +SHA1-Digest: T7wOXmWiHfzmkjzz0TfzB4wPVl8= + +Name: res/drawable-xhdpi/abs__ic_clear_search_api_holo_light.png +SHA1-Digest: ALPTzi3RYWU+XkKuUFTrF2Yu+Qo= + +Name: res/drawable-mdpi/notify_a02.png +SHA1-Digest: ch0TDRJtGTuqhLuIgoSPc/ogzQg= + +Name: res/drawable-xhdpi/settings_add_sidelink.png +SHA1-Digest: rlkNafw0Cdbd9oevb3szbVs7xfU= + +Name: res/drawable-ldpi/delete.png +SHA1-Digest: NT/6wAnfi2V3ythODSAy+EXKRwM= + +Name: res/drawable-xhdpi/refresh.png +SHA1-Digest: bJzPCd5afynpWcACYMWvWPBEISE= + +Name: res/drawable-mdpi/download.png +SHA1-Digest: ovU6EIzUCsuQKCYtcHOHLgY1NOc= + +Name: res/drawable-ldpi/settings_dark.png +SHA1-Digest: dIU0DmABk6uuWPzLbIjUMemi1jg= + +Name: res/drawable-hdpi/abs__progress_primary_holo_light.9.png +SHA1-Digest: gGaVM0Vmse4mOSdADodc6mtJFZg= + +Name: res/drawable/file_image.png +SHA1-Digest: Ory2TMW7mANQ+kQBpXEkEmiATWs= + +Name: res/drawable-hdpi/abs__list_pressed_holo_light.9.png +SHA1-Digest: lrdJqITpjN42AK/wk4XF5TW2F3o= + +Name: res/drawable/prev_disabled.png +SHA1-Digest: RQdm581WhsrZBwC8HdzGWQQm1G4= + +Name: res/drawable/plus.png +SHA1-Digest: pMpXmy+CndNOxwrr+B5J4w4iphw= + +Name: assets/zh_CN/qsg.html +SHA1-Digest: oEkFXywdARdww0f2EOlovUG7jwg= + +Name: res/drawable-xhdpi/upload_green.png +SHA1-Digest: krb7Ir2CQGe8ULAckNfpm6ViHeE= + +Name: res/layout/dont_show_again_alert.xml +SHA1-Digest: 33C+BkPykj1hw1CHXjqpWdNCeTM= + +Name: res/drawable-hdpi/abs__ic_voice_search.png +SHA1-Digest: xJSe4BJ4nYKbd+WcV1T2xS5C7Ow= + +Name: res/drawable-mdpi/upload_green.png +SHA1-Digest: 0wmicv11B9J7nFOyGqz9buxoXHU= + +Name: assets/zh_TW/03started_CHT.png +SHA1-Digest: 4thCG4SOiqQ/c7hXIFhi8lzR4ec= + +Name: res/drawable/abs__ic_clear.xml +SHA1-Digest: AnjKtWthsqQULZk99/sIGJSnzAg= + +Name: res/drawable-xhdpi/done.png +SHA1-Digest: qNLm+BKA2mTo5sucg1P47+sJCtY= + +Name: res/drawable-mdpi/abs__cab_background_top_holo_light.9.png +SHA1-Digest: vpL96k3QycLONseeKSz3oaWx9eY= + +Name: res/drawable-hdpi/abs__ab_solid_shadow_holo.9.png +SHA1-Digest: 6OZJVooibrgAG4so7MyBqyoZ1Rw= + +Name: res/layout/network_picker.xml +SHA1-Digest: 8ucReCx0LTuK9A7tz2U98tkNo+k= + +Name: res/drawable-mdpi/abs__tab_selected_focused_holo.9.png +SHA1-Digest: RjbehNC+s+86XH6BAkRT8tX87/s= + +Name: res/drawable-hdpi/grid_dark.png +SHA1-Digest: bv/l0oNM/6xojmTDPG7Gsh7AwCE= + +Name: res/drawable-mdpi/abs__btn_cab_done_default_holo_dark.9.png +SHA1-Digest: Ozw4TlLeSWs8hngXydrlW9kpIRg= + +Name: res/drawable-ldpi/list_dark.png +SHA1-Digest: p8KD1grmc28ukpM5sEz6caaq5LA= + +Name: res/drawable-xhdpi/icon.png +SHA1-Digest: aTowbLou/uvqaOWA3OeF8IkoVlA= + +Name: res/drawable-mdpi/abs__menu_dropdown_panel_holo_light.9.png +SHA1-Digest: T50IgNiJErJZ5L3zMlptrDfcYkA= + +Name: res/drawable-mdpi/abs__btn_cab_done_default_holo_light.9.png +SHA1-Digest: evd0EU/YZFFZwbRyq7iIZV65NZE= + +Name: res/drawable/abs__activated_background_holo_light.xml +SHA1-Digest: FBWGpnGlMqY8RPrk+hRcFMf8KbI= + +Name: res/layout/file_adapter_content.xml +SHA1-Digest: Gt3T5t94Q+r2QSrMG8iKqW0lLdo= + +Name: res/drawable-mdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png +SHA1-Digest: 0Aj78jP3sBP8PkkWsGNC1z2lOQE= + +Name: res/drawable-hdpi/refresh.png +SHA1-Digest: S55rUzlaDEVRMYYFSX8zSshqW0A= + +Name: res/drawable-xhdpi/abs__btn_cab_done_default_holo_light.9.png +SHA1-Digest: UrSk0ksmUU7GG5QwHZgVRtcqKN8= + +Name: res/drawable-xhdpi/download_dark.png +SHA1-Digest: eETLMRWn4DkJ//FSRV0ex4z/7jY= + +Name: res/drawable-xhdpi/movie.png +SHA1-Digest: UotaDgVtsouiUozS8pUwU5ljj/o= + +Name: res/drawable-xhdpi/network_wifi0.png +SHA1-Digest: dHYVoH/BCSO1q3vLBeYsrdGMZiY= + +Name: res/drawable-xhdpi/abs__textfield_search_right_selected_holo_dar + k.9.png +SHA1-Digest: UZN37FsBXN6zAqAGuA/27ev7Abw= + +Name: res/drawable-xhdpi/music.png +SHA1-Digest: AAXWmTvJGXynO8WP1WkGXZ/x4ko= + +Name: res/drawable-xhdpi/delete.png +SHA1-Digest: Vl6ScT2fsW+vHHjFv3PVJQzQCDk= + +Name: res/drawable-hdpi/abs__ab_transparent_dark_holo.9.png +SHA1-Digest: m5QFx1gdJhv0MAkVCkXC3cRnNfo= + +Name: res/drawable-hdpi/abs__cab_background_bottom_holo_light.9.png +SHA1-Digest: fTxB+O/i4iEBg9WIU38rF2dXunA= + +Name: res/drawable-hdpi/abs__spinner_ab_default_holo_dark.9.png +SHA1-Digest: 2rYQimeQPm5hvMbPTxBaNcQkQA8= + +Name: res/drawable-hdpi/abs__tab_selected_focused_holo.9.png +SHA1-Digest: dSOC1a8cXwFnX0u71qyzWpi2+Zw= + +Name: res/drawable-xhdpi/list_dark.png +SHA1-Digest: R/4Aglc02iaYKOMACASzxYmNSlY= + +Name: res/drawable-mdpi/abs__ic_clear_disabled.png +SHA1-Digest: Ki2UTczwfwNOkUEnyx/NMm7GyGA= + +Name: res/layout/abs__action_mode_bar.xml +SHA1-Digest: tlL9SCmRn+5lq0o5Z0a0+DhwpkU= + +Name: res/drawable-xhdpi/abs__list_pressed_holo_dark.9.png +SHA1-Digest: U1NKbASgVgLDtGy9HhgJxUn2c4w= + +Name: res/drawable-xhdpi/abs__ic_go_search_api_holo_light.png +SHA1-Digest: wzA+8Ljcy2akPbprGw4w32gdrOw= + +Name: res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_light.p + ng +SHA1-Digest: H/D//hjVU/DU3NJd13C1gaei/M8= + +Name: res/layout/analytics.xml +SHA1-Digest: dEyAiP1QhfHgDSpsT+hQgQSuOP4= + +Name: res/drawable-ldpi/notify_a02s.png +SHA1-Digest: niCCuVt1iLzN0EJHqdNI8IIXig8= + +Name: res/drawable-hdpi/abs__ic_menu_share_holo_light.png +SHA1-Digest: qvb0r6mGk80Hbb6FtXQyv/Sv5Uk= + +Name: res/layout/download_picker.xml +SHA1-Digest: j8uGKAJBmGRmHupZJKakBCRzHoA= + +Name: res/layout/abs__activity_chooser_view.xml +SHA1-Digest: b5/Pamx650HKd5U3sy4iCzf13dc= + +Name: res/drawable-ldpi/notify_a01.png +SHA1-Digest: 0Jp6QN+2+5FQeG+U4PPtCZcfYpM= + +Name: res/drawable-xhdpi/abs__ic_voice_search_api_holo_light.png +SHA1-Digest: YCTrsgeKIr16tx32cC2YhAOND+o= + +Name: res/drawable-xhdpi/abs__ab_share_pack_holo_dark.9.png +SHA1-Digest: LWefLX40khiUm1NZGd3ArFBTvMw= + +Name: res/drawable-hdpi/abs__ic_clear_search_api_disabled_holo_light.p + ng +SHA1-Digest: EAwIyhomIP1ZkBoIYaX+LHCgXhI= + +Name: assets/ja/qsg.html +SHA1-Digest: j2EJucBH5tk0BCbo75FTA1ePfFg= + +Name: assets/ko/05content_KOR.png +SHA1-Digest: lhhRj1QrQodjajI3J2tMG8CKLxY= + +Name: assets/en/qsg.html +SHA1-Digest: L4WyriSUCsuotT5sy/joXliau0s= + +Name: com/localytics/android/android_2.16.0.version +SHA1-Digest: 8vmXA1CdlgR4L6RtCP55DSyi/6o= + +Name: res/drawable-mdpi/abs__list_activated_holo.9.png +SHA1-Digest: k0KH726CtUSh87GvbE2iA7vlVBY= + +Name: res/layout/settings_about_eula.xml +SHA1-Digest: alefGbVB6CyA22WkTaLFwNP72hk= + +Name: res/drawable-ldpi/grid_dark.png +SHA1-Digest: XefQGtsfgQzsYdUwcCa4sCySJxQ= + +Name: res/drawable-mdpi/done.png +SHA1-Digest: dRrB78Y6EuXJ33qlfvc8O3T58t8= + +Name: assets/ru/01logo.png +SHA1-Digest: 9LYc9U94Zhdq0aSTWpN/gzvkJOE= + +Name: res/drawable-hdpi/abs__ic_clear_search_api_holo_light.png +SHA1-Digest: vTnHJ3zZ/fr/BUGO7lumSG7aPN4= + +Name: assets/de/03started_GR.png +SHA1-Digest: LoAnMO/v3ThsKZ35mOfAbgdwwvE= + +Name: res/layout/start.xml +SHA1-Digest: 4Z6i8+u5RqhPBKgF7vLB9EHSG5A= + +Name: res/drawable-hdpi/abs__ic_clear_disabled.png +SHA1-Digest: mCEgFmgmOmgpYrPjaKjE6mco9vA= + +Name: res/drawable/local_folder.png +SHA1-Digest: 87+WOFlWO6AAwFEyFazCXftx/sU= + +Name: res/layout/settings_sidelink_help.xml +SHA1-Digest: U6PICtVEJVadftRGi/mMeHvItKU= + +Name: assets/en/04wifi.png +SHA1-Digest: i2oWpZvGaoh8D6oJOMSdY7XQm54= + +Name: assets/ja/05content_JAP.png +SHA1-Digest: XhL+hEKCNQkd+aCd+kh+kyCQato= + +Name: res/drawable/abs__textfield_searchview_holo_dark.xml +SHA1-Digest: lZ9XgP4ybfr9V8R6nQAyLqYJTSk= + +Name: res/drawable-hdpi/abs__spinner_ab_disabled_holo_dark.9.png +SHA1-Digest: 291iL0AV8tlaZg9RNR0sVcA0Xz4= + +Name: assets/ja/03started_JAP.png +SHA1-Digest: Iw2lUovNgd7BGpxpjXRMShkEqa4= + +Name: res/drawable-hdpi/download.png +SHA1-Digest: 0tynPz2gqW7l1z6GZs+ZAsiZXQw= + +Name: res/drawable-mdpi/abs__cab_background_bottom_holo_dark.9.png +SHA1-Digest: n3dtdQ9T0vK71LFyTnyarQ7fxZE= + +Name: res/layout/abs__popup_menu_item_layout.xml +SHA1-Digest: v3o5lftz9eb9C7gT6rsrrJh9PWg= + +Name: res/layout/aircruzer_picker_help_dialog.xml +SHA1-Digest: bQMriOAAryoYSY4CYQdJy7QTSR4= + +Name: res/drawable-ldpi/device_grey.png +SHA1-Digest: EVLUj1xJ5UA9InvK9CjaCfXoWmQ= + +Name: res/drawable-hdpi/plus.png +SHA1-Digest: kgWTdfQphEdmYLgU0sWg3SkQ1oA= + +Name: res/drawable/arrow.png +SHA1-Digest: js2zkZOr1jN1onpDnHIRaCtRsas= + +Name: assets/de/01logo.png +SHA1-Digest: qW7tfDCGqc4stdVQY6xKLJf+pHA= + +Name: res/drawable-xhdpi/wifi4_s.png +SHA1-Digest: BMEFX0MtE3HXC/GuoyUbI2y9fAE= + +Name: res/drawable-hdpi/abs__progress_secondary_holo_dark.9.png +SHA1-Digest: AMuJ/WfMGopnmJb+32Vz3m5Am1g= + +Name: res/drawable/no_internet.png +SHA1-Digest: 6kFc/LiVNvdTd378J+EAjW73uas= + +Name: res/drawable-mdpi/abs__cab_background_bottom_holo_light.9.png +SHA1-Digest: YAD+7uhwn3C0CEVGoxT7j8bucVQ= + +Name: res/drawable-hdpi/abs__ab_share_pack_holo_dark.9.png +SHA1-Digest: buvtfh9lLA0kHo+UdZy9EgSy8oI= + +Name: res/drawable-xhdpi/abs__ic_search.png +SHA1-Digest: kpW6HlG/LB21Na4Li7xUvCDGZgw= + +Name: res/drawable/listselector_selected.xml +SHA1-Digest: HGReVF2qF/QDPhO7G7tzo21C+Dg= + +Name: res/layout/gallery_grid_adapter_content.xml +SHA1-Digest: 5PeytUOBjqp3OmJp421OWJLTv/Q= + +Name: res/drawable-hdpi/list.png +SHA1-Digest: TU1siR5UoHv45/k1KjVXqB+Cizo= + +Name: res/drawable-xhdpi/select.png +SHA1-Digest: kWgP2Ind7BdBPAO4JA9P1i0IAqY= + +Name: res/drawable/charging_0.png +SHA1-Digest: MdboS4toC08CAxgPCPbrln3YfhI= + +Name: res/drawable-xhdpi/upload2.png +SHA1-Digest: AcbXC1MP2a2Zxgu+ykFuhML0Zrc= + +Name: res/drawable-xhdpi/abs__ab_bottom_solid_inverse_holo.9.png +SHA1-Digest: 24/SkEr0uzW3efbr12bid3TOmc4= + +Name: res/drawable-hdpi/download_dark.png +SHA1-Digest: qH6C5nIuc60QOU2tU6v4CZUtO/o= + +Name: res/layout-xlarge/abs__screen_action_bar.xml +SHA1-Digest: tInI78ruYKzZFPwxS79mfk9uyfg= + +Name: res/drawable-xhdpi/abs__progress_bg_holo_light.9.png +SHA1-Digest: 9YJMbOWf99gghxun1lt4eR+M5/0= + +Name: res/layout/aircruzer_adapter_content_section.xml +SHA1-Digest: vOFOzGyr6DS5ZyG/4q9ZvwA2/CQ= + +Name: res/drawable/black.png +SHA1-Digest: YnQOafsw9lxQswFN9ROfmopfVHI= + +Name: res/drawable-mdpi/abs__textfield_search_right_selected_holo_dark + .9.png +SHA1-Digest: z30TT9I43uVknBQFcYGozxadtKg= + +Name: res/drawable-hdpi/delete_dark.png +SHA1-Digest: 5KT758/nYY+QwfbaHRwLsgb6RiM= + +Name: res/drawable-mdpi/abs__textfield_search_right_selected_holo_ligh + t.9.png +SHA1-Digest: 6SqUSlc7AzrADiM8+4UhC0SoNoI= + +Name: res/drawable-hdpi/abs__list_divider_holo_dark.9.png +SHA1-Digest: YCNfTwWWU/kOX50OLTka+djt2a0= + +Name: res/drawable-xhdpi/upload2_dark.png +SHA1-Digest: my824UVeH87Ig9Mjb22p+LmusVI= + +Name: res/layout/abs__action_bar_tab_bar_view.xml +SHA1-Digest: qIFOunmTDNPoxbaXf5Ke+e1Z7/A= + +Name: res/drawable-xhdpi/abs__spinner_ab_focused_holo_light.9.png +SHA1-Digest: EElqPd2sfc94OIfGfM2c6PFhdG0= + +Name: res/drawable/low_white.png +SHA1-Digest: 1K7p7Su15oKaGUrSTjRCMjhkYhU= + +Name: res/layout/direct_connect_warning.xml +SHA1-Digest: fA+3RHqNB1pnJ8jzWxre5c5Mkls= + +Name: res/layout/abs__screen_action_bar_overlay.xml +SHA1-Digest: 3+QVbD58gDSSTchlepS0gA2xUIo= + +Name: res/drawable/play.png +SHA1-Digest: rqy/bcqzDfq8czyEAPHFcrlQthA= + +Name: res/drawable-mdpi/abs__spinner_ab_focused_holo_light.9.png +SHA1-Digest: RlKXmBRG932A/8TUkCqDEp/Oec8= + +Name: res/drawable/grey.png +SHA1-Digest: IaZHlnMauSqa/dH4jDo4FCrK/LA= + +Name: res/drawable-mdpi/abs__ab_share_pack_holo_light.9.png +SHA1-Digest: 5hykmbRZCNgaYVriQNRE6mXKEVw= + +Name: res/drawable-xhdpi/settings_dark.png +SHA1-Digest: WDtudlc+u2w59KmlX6Xx4rGBli4= + +Name: res/drawable-mdpi/movie.png +SHA1-Digest: OparaqzckIJwKZoZbSbh9m6azho= + +Name: res/drawable-xhdpi/abs__spinner_48_inner_holo.png +SHA1-Digest: aZIHa9Czmu4cWLFew7pcXD4rkGc= + +Name: res/drawable/folder_up.png +SHA1-Digest: zGiS10bWvYuuZkpL9DTRTlHDLvA= + +Name: res/drawable/pause.png +SHA1-Digest: p/LZKuBdGLW7xRqzKTYjhcAaQx0= + +Name: res/drawable/a02c.png +SHA1-Digest: txEZZCyYUl2zG05dSRtMgxehdYs= + +Name: res/drawable-ldpi/settings.png +SHA1-Digest: 2u2hCuuJwOjloaeoY/GWcArWkEQ= + +Name: res/drawable-mdpi/abs__textfield_search_right_default_holo_light + .9.png +SHA1-Digest: SJw/VaVPuHa0U3ypOixHPXRhT6s= + +Name: res/drawable-xhdpi/settings_sidelink_grey.png +SHA1-Digest: bvszkCqcT6b08gl54gBxZe9s9Xc= + +Name: res/drawable-xhdpi/settings_timer_grey.png +SHA1-Digest: 8GV4CJNEGoP0aBcnmrB/GiMGSMw= + +Name: res/drawable-xhdpi/wifi1.png +SHA1-Digest: V0mwPuqE+FwkmKAtWqI+COlgnOY= + +Name: res/drawable-mdpi/abs__btn_cab_done_pressed_holo_light.9.png +SHA1-Digest: vLrFK/b+U1ubMj5LsccQrZPqhPI= + +Name: res/drawable-mdpi/upload2_dark.png +SHA1-Digest: hO6TyHKEn/0pJY/QeUxOb3uHtFs= + +Name: res/drawable-mdpi/abs__ab_transparent_dark_holo.9.png +SHA1-Digest: fFPUiwdMkRL8REn+TBfT9FX9St4= + +Name: res/drawable-hdpi/abs__spinner_ab_pressed_holo_light.9.png +SHA1-Digest: GIl5naK+PDdSFWeTucie7Fi+y4g= + +Name: res/drawable/abs__textfield_searchview_holo_light.xml +SHA1-Digest: VD8f3CF3zy2PqjZIXCkVHdU/AN0= + +Name: res/drawable-hdpi/abs__ic_ab_back_holo_dark.png +SHA1-Digest: VDbZBKRiIQomKwJ0F40Cm1Sj5uY= + +Name: res/raw/wfd1080e.df2 +SHA1-Digest: sHEo1rEX5Mqidlpdt9sD+seOla4= + +Name: res/layout/music.xml +SHA1-Digest: 2OopLHtVH5gXjrASxOl9UjK1LCQ= + +Name: res/raw/tf.properties +SHA1-Digest: 6BRhUHhf+UzjzmmTNS1S4cucWWs= + +Name: res/drawable/abs__textfield_searchview_right_holo_dark.xml +SHA1-Digest: oipbNanAw9eMKi1Qw+sRRlUUi3k= + +Name: res/drawable-mdpi/abs__ab_bottom_solid_dark_holo.9.png +SHA1-Digest: p6tVNDTsfPGyFyOWCgiBaoFubkw= + +Name: res/drawable-xhdpi/delete_dark.png +SHA1-Digest: ceF15u3WmpNaJ05eNU1WQ4Dv01E= + +Name: res/drawable/abs__progress_medium_holo.xml +SHA1-Digest: trNhx12sy3B5XvcizljpAUZBHIk= + +Name: res/drawable-mdpi/abs__ab_solid_light_holo.9.png +SHA1-Digest: cc9HP9JERZ4SEB2R/uVFpxvb0wc= + +Name: res/layout/abs__search_view.xml +SHA1-Digest: Ndlm3XZmkd7Db9ZKJbWeJjSGt+A= + +Name: res/drawable-mdpi/icon.png +SHA1-Digest: 7AsZxVhBGvf4wPHtlmnWNGqIYVM= + +Name: res/drawable-ldpi/list.png +SHA1-Digest: /sqKL1CnKMdqxCPHVjUJmKsRDo4= + +Name: assets/zh_CN/02qsg_CHS.png +SHA1-Digest: uTDpSJvBQ15kSO1snJHPQaJFpdw= + +Name: res/drawable-xhdpi/settings_network.png +SHA1-Digest: KTUQfCPhDyIOe2Ppj1eDmaMrXFg= + +Name: res/drawable-xhdpi/settings_timer.png +SHA1-Digest: pHrM3ucxoitKzGY4w2E6Hkjyvks= + +Name: assets/de/04wifi_GR.png +SHA1-Digest: QXgViToZCxXJYiGeAt0jHJSbFnk= + +Name: res/drawable-ldpi/download_dark.png +SHA1-Digest: 2B3FtazIkI9m4lpPTtnCOS+Uqm0= + +Name: res/layout/abs__action_menu_item_layout.xml +SHA1-Digest: 93CV9NDXHj63/bMPoP4TODrHiNo= + +Name: res/drawable-mdpi/abs__list_focused_holo.9.png +SHA1-Digest: 1b4m7iHvagnqjBF0Gnh86BXoTCk= + +Name: res/drawable-xhdpi/splash.png +SHA1-Digest: LzyJobE3wHBtXSbxJxBg34YIRUo= + +Name: res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_light.pn + g +SHA1-Digest: 3HHEb108EIEBDzuTgU746xkNAyc= + +Name: res/drawable-xhdpi/network_wifi3.png +SHA1-Digest: FJnZsm9LSNIMpxAKW/BuXJonAy8= + +Name: assets/en/02qsg.png +SHA1-Digest: sEG/wup+akbOSY58s0hX7F6sG4U= + +Name: res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png +SHA1-Digest: MmgEts7b+pXpZo60FkneU4V9Ikk= + +Name: res/drawable/abs__tab_indicator_ab_holo.xml +SHA1-Digest: b7UIuAS0Dejggi+d5oSd15fiAvo= + +Name: res/drawable/listselector_pressed.xml +SHA1-Digest: x1zv0qC+0wa+TN4MwSANxttsZCY= + +Name: res/drawable-hdpi/abs__ab_share_pack_holo_light.9.png +SHA1-Digest: +OAYzol7cPv79GCck1P8FViGZ6I= + +Name: res/drawable/file_png.png +SHA1-Digest: Xl0BUMo9fGAOXIPgPCV6v9tNihw= + +Name: res/drawable/file_audio.png +SHA1-Digest: lqiwfnPeLfN+K+IK9smgw9LdI6Y= + +Name: res/drawable-xhdpi/abs__ic_cab_done_holo_light.png +SHA1-Digest: K2TYdGXesGTqgwQKZZjUuYN+FKo= + +Name: res/drawable-xhdpi/notify_a02.png +SHA1-Digest: BDWoK0m9ZN//ZSTax3IjAhGF1Qs= + +Name: res/layout/wifi_password_alert.xml +SHA1-Digest: fzM4SEwg2trrkgPTwe9KnnY94wo= + +Name: res/drawable-hdpi/abs__menu_dropdown_panel_holo_light.9.png +SHA1-Digest: JtAGOrkjcRDhvzDp+tDWF0PB8Kg= + +Name: res/drawable-ldpi/create_folder.png +SHA1-Digest: 4EnTKjDSCifHHQLfIQuBjlPUCfo= + +Name: res/layout/directory_adapter_content.xml +SHA1-Digest: TUtHiiXlqbu950RmL1KxbLGcXOc= + +Name: res/drawable-xhdpi/abs__ic_ab_back_holo_dark.png +SHA1-Digest: lSv/xuS4TTivmon6OOoCf+LZ674= + +Name: res/drawable-hdpi/abs__progress_bg_holo_light.9.png +SHA1-Digest: CNd/vAB/oYwEmcSpXU/aAnYGokI= + +Name: res/drawable-hdpi/abs__progress_bg_holo_dark.9.png +SHA1-Digest: Iw89Sp82/2Wj0jf2QyfcdVW4ePg= + +Name: res/drawable-mdpi/abs__ic_voice_search.png +SHA1-Digest: 2cQ6aixRzb6Ul8O9p1mVDwf4ScA= + +Name: res/drawable-hdpi/abs__spinner_ab_focused_holo_dark.9.png +SHA1-Digest: 9Qy3cVDSKr4octE+oPpmMxc3WbE= + +Name: res/drawable-hdpi/abs__list_longpressed_holo.9.png +SHA1-Digest: ptbz3lQejuYwZajfM9QuW+tPTNo= + +Name: res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png +SHA1-Digest: jmiYAK3bhvluugEnQppgwzIaO1I= + +Name: res/drawable/medium_white.png +SHA1-Digest: O6bHBZhzTcLAtuTeFI5y+gm79Jg= + +Name: res/drawable/abs__item_background_holo_light.xml +SHA1-Digest: WA7mgT2GElk7GkfzrytZKY+AKoY= + +Name: res/drawable-xhdpi/play_notify +SHA1-Digest: owCE1vx8jJW2TwuANPXyPvF+3ec= + +Name: res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png +SHA1-Digest: 8GgxToDPNPXEylKDthpLy4Ick+4= + +Name: res/drawable-hdpi/done.png +SHA1-Digest: d6dkBw8alNn6Id9nKA5gcknRaJI= + +Name: res/drawable-xhdpi/settings_security.png +SHA1-Digest: HvbKAuHdGu4756CjvqJiSdO5+iA= + +Name: res/drawable/abs__btn_cab_done_holo_light.xml +SHA1-Digest: b+Cr90laDoTc5pshyXL4QO1vuWE= + +Name: res/drawable-xhdpi/abs__ic_clear_disabled.png +SHA1-Digest: ON7Cgoqj1QbPTbGfYNzqsOG+Yc4= + +Name: res/drawable-hdpi/download_dark_green.png +SHA1-Digest: ZpkxcjGxOA8REafMEKrzIKaBS8I= + +Name: res/drawable-hdpi/abs__ab_bottom_solid_inverse_holo.9.png +SHA1-Digest: i/uYhSEBxB7ovRwrIQwhBn7UXxE= + +Name: res/drawable-hdpi/abs__tab_selected_pressed_holo.9.png +SHA1-Digest: Mf5vFOmXvP3L4a4yavvUzcmRIt8= + +Name: res/drawable-hdpi/abs__btn_cab_done_pressed_holo_dark.9.png +SHA1-Digest: TZEzVRjCGPdf7ndrvVIwkRdTh3c= + +Name: res/drawable-xhdpi/connected.png +SHA1-Digest: HREB+S4CHtoRyQ1u2/Jzp0H68yA= + +Name: res/drawable-ldpi/create_folder_dark.png +SHA1-Digest: LvKzNGKfgbfeARVTfJjhnuUgqZ8= + +Name: res/drawable-xhdpi/abs__ic_clear_search_api_disabled_holo_light. + png +SHA1-Digest: 4dxIw+kLWuioJNO5uLBGXvWElrE= + +Name: res/drawable/popup_shape2.xml +SHA1-Digest: U+KLl3TPDVOTOj/JnlH8HceMvrs= + +Name: res/drawable-mdpi/abs__textfield_search_right_default_holo_dark. + 9.png +SHA1-Digest: 8VagCEC6/bxS8EIG7vXlA3zIyLo= + +Name: res/drawable/blue.png +SHA1-Digest: gs/siuek95dKch+pAv8rphP+rho= + +Name: res/layout/music_land.xml +SHA1-Digest: EnbsCyHIpqnw/cpaYwzQWCIkFJM= + +Name: com/localytics/android/LICENSE +SHA1-Digest: 4BcmJZv12VBnnPvyPDfhtrzWRzQ= + +Name: res/drawable-hdpi/abs__ab_stacked_transparent_dark_holo.9.png +SHA1-Digest: GtmhIZtPpidOUSNn6lLVxhCaCCo= + +Name: res/layout/abs__list_menu_item_layout.xml +SHA1-Digest: D/6MKz0WdxdHUY3mQrOf25dDegU= + +Name: res/drawable-ldpi/download_green.png +SHA1-Digest: hJfnTiPcJw/DvBrbfuoH1jLmkf8= + +Name: res/drawable-xhdpi/abs__ab_stacked_solid_light_holo.9.png +SHA1-Digest: 42971/d6vUeJwpIgA/Gna2Xuny8= + +Name: res/layout/abs__list_menu_item_checkbox.xml +SHA1-Digest: 9geAr2WyoUVyLj8BV2Yu+r/k0LE= + +Name: res/drawable-mdpi/abs__spinner_ab_focused_holo_dark.9.png +SHA1-Digest: zgXeuD+vtHQLeG2Fx0Z+o3WNMdQ= + +Name: res/drawable-mdpi/splash.png +SHA1-Digest: lPdgz8+upRrYKwTC2CvqhbZHi0M= + +Name: res/drawable-hdpi/abs__textfield_search_right_default_holo_light + .9.png +SHA1-Digest: ULSjXVIfOXQcnuwbICfFh+SOOhw= + +Name: res/drawable-mdpi/abs__textfield_search_selected_holo_light.9.pn + g +SHA1-Digest: KGb4v13B/xvVShXDLo3AjuomrkY= + +Name: res/drawable/music_thumb.png +SHA1-Digest: cgE5iK2JXMxiWDvXz0Ki67YaOXg= + +Name: res/drawable-xhdpi/network_wifi3_s.png +SHA1-Digest: RWgn1emiga8Uhu7w1rUGse/iSnY= + +Name: res/drawable-ldpi/select_dark.png +SHA1-Digest: KPP11g/89Ew0LoUPxCDJwVRVDXM= + +Name: res/drawable-hdpi/play_notify.png +SHA1-Digest: YHAMAjbWFXrv1Eh1x2FxlPnFfk8= + +Name: res/drawable-xhdpi/abs__tab_selected_pressed_holo.9.png +SHA1-Digest: qE6ZWVBFFV5unAqK1PvQv1Ern7Q= + +Name: res/drawable-hdpi/abs__textfield_search_right_selected_holo_ligh + t.9.png +SHA1-Digest: ebcbPkpiwha21xEUChjWbqxLHS0= + +Name: res/drawable/abs__list_selector_holo_light.xml +SHA1-Digest: tB/l4CCgS0Wh5RIhmVPIYbk7RCA= + +Name: res/drawable-xhdpi/network_wifi4.png +SHA1-Digest: tuGik8Wx6scGg9Ii0eRQj+8vEtM= + +Name: res/drawable/a02s_grey.png +SHA1-Digest: 4FZw1xNuME04KC3S9kuIhbCXyEQ= + +Name: res/drawable-xlarge-hdpi/icon.png +SHA1-Digest: vAYOXfhLgLKl72MHOqpn4/Kfn+M= + +Name: res/drawable-xhdpi/wifi3.png +SHA1-Digest: bM1a2TY4H7myCHsfb8JsWFbk5gw= + +Name: res/drawable-hdpi/abs__dialog_full_holo_light.9.png +SHA1-Digest: ZCSC9S6+GRAUiRe/f4jJy7XdSL8= + +Name: res/layout/aircruzer_adapter_content_local.xml +SHA1-Digest: dkxhvXDAfYv+5/BiQLVbwQI2VSo= + +Name: res/drawable/charging_1.png +SHA1-Digest: 83AW2LewcgO5yl1cBbLFTn4R+fM= + +Name: res/drawable-xhdpi/settings.png +SHA1-Digest: bZkzyG0mdGDnG9zFWPR5dnQ6UM0= + +Name: res/drawable-ldpi/splash.png +SHA1-Digest: LlkmGY/uHgyRIExv+JK6VWn/jGQ= + +Name: res/drawable-xhdpi/abs__list_focused_holo.9.png +SHA1-Digest: 0mOu8ySPTJmpXlpXy7GxY1V24q4= + +Name: res/drawable-xhdpi/abs__list_pressed_holo_light.9.png +SHA1-Digest: PX78/hIq2CPfClViMSNz77lrsyQ= + +Name: res/drawable-xhdpi/abs__progress_secondary_holo_light.9.png +SHA1-Digest: cPjnoGeC0yi3ZMj8J8epbvvsY9I= + +Name: res/layout/abs__screen_simple_overlay_action_mode.xml +SHA1-Digest: JDBEQ53itxIur9vO2Atn+8yJ7c8= + +Name: res/drawable-mdpi/abs__btn_cab_done_pressed_holo_dark.9.png +SHA1-Digest: tNiemBq98Ef/8/SbxysQ0tq6SK4= + +Name: res/drawable-mdpi/create_folder.png +SHA1-Digest: O21GsKo5pCcYVBU6psPUHbPovbo= + +Name: res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml +SHA1-Digest: yytAWQRt22+riAvgs/KwyMqUvQ4= + +Name: res/drawable-ldpi/grid.png +SHA1-Digest: iNXgBO748cIsUiLwbRftq2SXRds= + +Name: res/drawable-mdpi/device_grey.png +SHA1-Digest: RHXuHZm/A6qkIbhh92Nj1kpfyY0= + +Name: res/drawable-mdpi/play_notify.png +SHA1-Digest: 0NqdGg8tJvp/Yhr52YdXbLor7t8= + +Name: res/drawable-hdpi/abs__textfield_search_default_holo_dark.9.png +SHA1-Digest: LP7ewvwEXSoRqeZjIh4nOeaAtK8= + +Name: res/drawable-xhdpi/abs__tab_selected_focused_holo.9.png +SHA1-Digest: kRe4KL9tEOxTt3bkKH9ClWLAUCE= + +Name: res/drawable-ldpi/select.png +SHA1-Digest: 5RbbNoA818p1wtemKnXiPyU4qCg= + +Name: res/drawable-hdpi/delete.png +SHA1-Digest: 5Bq2Ic1TDFy9EDte4VlaQ9rn4XU= + +Name: res/drawable/battery_grey.png +SHA1-Digest: tsn4J4NlgqXxVjIp2W1wl0kXnIg= + +Name: res/xml/settings_about.xml +SHA1-Digest: oMSFlToKbNQlcNx9b7XqE1vFQ+c= + +Name: res/drawable-hdpi/abs__ic_go_search_api_holo_light.png +SHA1-Digest: 3vHQpcaPDNb6NwjQQWZxhxNJ+qc= + +Name: res/layout/aircruzer_adapter_content_none.xml +SHA1-Digest: g0S8lGEdmybe9pLERtYIr+QCaY4= + +Name: res/drawable-mdpi/abs__list_longpressed_holo.9.png +SHA1-Digest: ofVU9an1TNZwFC7R06NqpuPJPdQ= + +Name: res/drawable/abs__ic_clear_holo_light.xml +SHA1-Digest: sAhzgH2jM2Kc7Y2iY5oBJmCG5GE= + +Name: res/drawable-ldpi/notify_a02c.png +SHA1-Digest: SiX8FML4Qmck0hsqKpoXnJ7M/Sw= + +Name: res/drawable/check.png +SHA1-Digest: KSW+XCCpV+qwJVdjGhwKsFSwbS8= + +Name: res/layout/abs__action_menu_layout.xml +SHA1-Digest: mJKypCro6tPIH9JEh3UY3bEZGEI= + +Name: res/drawable/file_zip.png +SHA1-Digest: NUpT9WWHpc2+ynz12nSVJjwKd0w= + +Name: res/drawable-xhdpi/abs__ab_bottom_solid_light_holo.9.png +SHA1-Digest: Rk+UnlSVvdbnqPvNBdXZj8dcQQ0= + +Name: assets/es/01logo.png +SHA1-Digest: 6lO2tdvGxHwanoenLLbvEsh80mc= + +Name: res/drawable-xhdpi/abs__progress_secondary_holo_dark.9.png +SHA1-Digest: e5a8M4qM7fMxfi8+e2DXwULdfk0= + +Name: res/layout/sherlock_spinner_item.xml +SHA1-Digest: xi/7SS4dFtpNDXRM2jsbqgXEltM= + +Name: res/layout/hidden_network.xml +SHA1-Digest: hykpxnGRp26LCmYMH7WfD1+5ERw= + +Name: res/drawable-xhdpi/abs__ic_go.png +SHA1-Digest: tINOgi0AQI11mwL/d1BPQRmhUdY= + +Name: res/drawable-ldpi/pause_notify +SHA1-Digest: XiwedbO3Yy4d/iewdOxeAizPGII= + +Name: res/layout/splash.xml +SHA1-Digest: /WB8Z6fSj+6dJTUbNNjBMJ9fT3E= + +Name: res/drawable-xhdpi/download.png +SHA1-Digest: 3alYi8wYqlI5vcgPkrdg9IZElnY= + +Name: res/drawable-mdpi/abs__list_divider_holo_dark.9.png +SHA1-Digest: Gd+qeBN+Z3tgHThuwqx4TQqImNs= + +Name: res/drawable-xhdpi/settings_reset.png +SHA1-Digest: rLtEo4LohNmqxIh6jx9cRfbsvPQ= + +Name: res/drawable-mdpi/abs__tab_unselected_pressed_holo.9.png +SHA1-Digest: kPvBAWN9SqQ9WZ8eBXVYJN/XHP8= + +Name: res/drawable/next_disabled.png +SHA1-Digest: 4SrIAQ8IqbikAc/lXvPTTFA2sE0= + +Name: res/layout/abs__screen_simple.xml +SHA1-Digest: YdjPW96dc/dh7hiPo0SqCP+C/XQ= + +Name: res/drawable-xhdpi/abs__ab_bottom_transparent_dark_holo.9.png +SHA1-Digest: HaZOB2hoLzJiT9qTW+qyRWWKe88= + +Name: res/drawable-xhdpi/abs__ab_transparent_light_holo.9.png +SHA1-Digest: WImLTFqzDvKO744H1EGNHKmlvLU= + +Name: res/xml/settings_feedback.xml +SHA1-Digest: joazs6DwTqCGpix20gFyrqmfSmE= + +Name: res/drawable-xhdpi/abs__progress_primary_holo_dark.9.png +SHA1-Digest: HLr/+AacVzhb/bgm8wqo5lkMmdQ= + +Name: res/drawable-mdpi/abs__ic_clear_search_api_holo_light.png +SHA1-Digest: DKBAKHuPA9O+9U3MbN+9PMTd9xQ= + +Name: res/color/abs__primary_text_holo_light.xml +SHA1-Digest: TMBEJ/Z81lGmX1DQM1OFwc0XHPM= + +Name: res/drawable/charging_3.png +SHA1-Digest: xMFafkBI64FCG7RCF15slUvMvf4= + +Name: res/drawable-mdpi/abs__btn_cab_done_focused_holo_dark.9.png +SHA1-Digest: qbSomUVZ3g5AkIAMKg2tBPBu5vs= + +Name: res/drawable-hdpi/abs__ab_bottom_solid_light_holo.9.png +SHA1-Digest: FijKux+wp7sVe29uZWpywpBFs74= + +Name: res/drawable-xhdpi/settings_network_grey.png +SHA1-Digest: OTJeILm9xSIiD1ZZeDnzmx7uAPo= + +Name: res/drawable-mdpi/abs__ic_search_api_holo_light.png +SHA1-Digest: CsoOtUAuNL2i3uSajkq7Fj1fHQI= + +Name: res/drawable/file_video.png +SHA1-Digest: ZKhuBm15KrQQmnCDgYH9pXvxs+A= + +Name: res/drawable/prev_enabled.png +SHA1-Digest: 5GklvDtWPEtnzayUBXxC49h/igE= + +Name: res/layout/abs__action_bar_home.xml +SHA1-Digest: KIYReYcyBICFmvLPVImAr7hKrQc= + +Name: res/layout/pictures.xml +SHA1-Digest: Y+aGuOCtcygPgODqtlRDaLJ7rbM= + +Name: res/drawable/device_help.png +SHA1-Digest: 7oy7tO6OC6/alEjvkRoaRe7CNDQ= + +Name: res/layout/file_transfer.xml +SHA1-Digest: 5oSyGatb2Q33JeE/6jkaAYTIUa8= + +Name: res/layout-xlarge/abs__screen_action_bar_overlay.xml +SHA1-Digest: L4rSLNSmnZnrmxkMEDyoFZ7hTz8= + +Name: resources.arsc +SHA1-Digest: AOdcjOejlDj15vX8jZuEvNKoj0Y= + +Name: assets/ja/04wifi_JAP.png +SHA1-Digest: Gkr2IGTYf5L5HbWPl/4qpHBxv0s= + +Name: res/drawable-mdpi/list_dark.png +SHA1-Digest: HAgDWDwW1fCnKBvddNgdXRSrFFo= + +Name: res/drawable-xhdpi/abs__ab_bottom_transparent_light_holo.9.png +SHA1-Digest: dsRruh5Id/KSS3uk7sx/eDAJ6D8= + +Name: assets/fr/05content_FR.png +SHA1-Digest: WK6x6XeWxlkinLgf4mVFR2uYq9A= + +Name: res/drawable-xhdpi/select_dark.png +SHA1-Digest: D4teduTfSRTar2n/cFBMdzxMdQ0= + +Name: res/drawable-mdpi/abs__list_pressed_holo_light.9.png +SHA1-Digest: EhSQaJxdK46gwcaPHBdrPDX32g0= + +Name: res/drawable-hdpi/upload_green_dark.png +SHA1-Digest: Gp22qIgeqXjcrw0W5lfX+v4iCJE= + +Name: res/drawable-hdpi/notify_a01.png +SHA1-Digest: /9FXEmJVN4GfZwk4YF3uoIlEbS4= + +Name: res/drawable-xhdpi/wifi2.png +SHA1-Digest: 95pF+tdEjBmdjL1gviqVJw6lDlM= + +Name: res/drawable-mdpi/abs__spinner_ab_disabled_holo_dark.9.png +SHA1-Digest: pft58stbqE33Gn17frV/Ljb/Kzw= + +Name: assets/zh_TW/02qsg_CHT.png +SHA1-Digest: sz4F8DYtnO3Lj4KgCvCo2JoPTjY= + +Name: res/drawable/abs__progress_horizontal_holo_dark.xml +SHA1-Digest: /iEzfNZEugl/G6N8Qh681QQNPSc= + +Name: res/drawable-mdpi/abs__textfield_search_default_holo_light.9.png +SHA1-Digest: CQ6w/WUKC9TGwDG4iBNIfwygOEY= + +Name: res/drawable-xhdpi/abs__spinner_ab_default_holo_dark.9.png +SHA1-Digest: 4DLHmynxKoSzQ5KMSUXuBamO9Pk= + +Name: res/drawable/cancel_button.png +SHA1-Digest: 2N+HXAEPUZlZFnYjEcWfYHtFD94= + +Name: res/drawable-xhdpi/settings_security_grey.png +SHA1-Digest: N72L8sShlZ5DxtZwOqPAYxs9SbY= + +Name: res/drawable-mdpi/pause_notify.png +SHA1-Digest: RU//matac19t0QA3+vQ+N63x9wM= + +Name: res/layout/abs__action_mode_close_item.xml +SHA1-Digest: hwhqd7uq6RH+ijxf4Ab+Qk+IYXg= + +Name: res/drawable-ldpi/delete_dark.png +SHA1-Digest: JgGw77odr4HQh8vs/uP2/afN+hc= + +Name: res/drawable-xhdpi/abs__menu_dropdown_panel_holo_light.9.png +SHA1-Digest: pMm8lMp8FURZNb9srHCre3oiwJI= + +Name: res/drawable-hdpi/select_dark.png +SHA1-Digest: WaA/n5tW3BNOTC1MxTx+6TohJnQ= + +Name: res/drawable-hdpi/abs__ic_search_api_holo_light.png +SHA1-Digest: 15tQ2OsywNpdQGDL4yWxR3xWDMI= + +Name: res/drawable-mdpi/abs__spinner_48_outer_holo.png +SHA1-Digest: E8JKf9W+nZlbdfhR4O6pmB6q14c= + +Name: assets/zh_TW/01logo.png +SHA1-Digest: 0W1bsYYaXn4jKG5GA/iApSQvxGM= + +Name: res/drawable-xhdpi/abs__textfield_search_default_holo_dark.9.png +SHA1-Digest: pUJrNEalrEwaKjtoYc52KMFxCMI= + +Name: res/drawable-xhdpi/notify_a02s.png +SHA1-Digest: eQ47U1UQ29rnBMb/69rI2l3i+4I= + +Name: res/drawable-mdpi/abs__ic_ab_back_holo_light.png +SHA1-Digest: 10yFmnAzVd9nqe/1O6tP08Wez+8= + +Name: res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png +SHA1-Digest: Vpdsk41m+u+Wbl3upUMCWRcaeoY= + +Name: res/drawable-hdpi/abs__btn_cab_done_default_holo_dark.9.png +SHA1-Digest: 9GJ7L2ZtqG84hy6LHRjFWwcdE/k= + +Name: res/drawable-hdpi/splash.png +SHA1-Digest: 1Q50V2CQqHo3e85aCgLHO4grec8= + +Name: res/drawable-hdpi/abs__ic_menu_share_holo_dark.png +SHA1-Digest: zAKWgUZl3wPFGrOGVpY70sUWvy8= + +Name: res/drawable-xhdpi/wifi2_s.png +SHA1-Digest: 6q5ezoORs2l9OP8gvI08Uk13DBs= + +Name: res/drawable-hdpi/movie.png +SHA1-Digest: 9+CtEKfcIiye8Sdj37EYQiTkaac= + +Name: res/drawable-hdpi/abs__ic_cab_done_holo_dark.png +SHA1-Digest: Ero5pbYBER8pLL3KDqfMLnpZrB0= + +Name: res/drawable-xhdpi/create_folder.png +SHA1-Digest: 6PHv1VvAF8whY89yk+r21vi1YeY= + +Name: assets/en/03started.png +SHA1-Digest: YepkV8EGsV8FRDC1iK4W/5YTx24= + +Name: res/drawable-xhdpi/abs__ab_solid_shadow_holo.9.png +SHA1-Digest: FJZmzxRSPFoBpogPOl83SIHWqpA= + +Name: res/drawable-mdpi/abs__ab_bottom_solid_light_holo.9.png +SHA1-Digest: fOTKaFY42kIg155GSxafkHby9Ew= + +Name: res/drawable-xhdpi/abs__textfield_search_selected_holo_dark.9.pn + g +SHA1-Digest: A8dGiqWEuPdhlm8kq0ijFWmFcRE= + +Name: res/drawable-hdpi/abs__ab_bottom_transparent_light_holo.9.png +SHA1-Digest: 4WNj5DtsCo/3Ywz8axx5PibIeR4= + +Name: res/drawable-hdpi/upload2.png +SHA1-Digest: bZ7pi7b/pyEb0wVhSQapIn7OHXU= + +Name: res/drawable-hdpi/abs__spinner_ab_disabled_holo_light.9.png +SHA1-Digest: t0M0ZoitoGmS8/fuC3/iZHwUQjA= + +Name: res/xml/settings_debug.xml +SHA1-Digest: KIGMtGcGh0FMtnAm/36elR8mD+c= + +Name: res/drawable-xhdpi/abs__tab_selected_holo.9.png +SHA1-Digest: sCAniYVYx5jXdqQhumf4Kn8uoHk= + +Name: res/drawable-hdpi/abs__btn_cab_done_focused_holo_dark.9.png +SHA1-Digest: 4iHqV7E+BRvqEi6eouyDhUKu0/0= + +Name: res/drawable/abs__spinner_ab_holo_dark.xml +SHA1-Digest: urMnXXwa6vOhuZDQh0y2OXC/IGM= + +Name: res/drawable-mdpi/abs__spinner_ab_default_holo_light.9.png +SHA1-Digest: UMvtqC6hnVlluJzlyGv4xoHdabo= + +Name: assets/zh_CN/03started_CHS.png +SHA1-Digest: 24aEpnmdCqGUtLPJLQQVtlXjgUI= + +Name: res/drawable/file_pdf.png +SHA1-Digest: aX7qIO2ozG08Mnfv+Cltizw8al0= + +Name: res/drawable-hdpi/device_grey.png +SHA1-Digest: ooCJs95RM1AyB+zYQ2p6l4Cqq0U= + +Name: assets/ko/qsg.html +SHA1-Digest: e+SkNz6Jz3RFUYNR1viwovEWG/M= + +Name: res/drawable-large-hdpi/icon.png +SHA1-Digest: DHU4AKxG4eEU6+qYyaGR19OUEDY= + +Name: res/drawable/abs__progress_horizontal_holo_light.xml +SHA1-Digest: /L8kPO0mRknMvMwfLlIrUAaTTt8= + +Name: assets/ru/qsg.html +SHA1-Digest: GBsPynPcCrrCo3Poo15DMu5tJUE= + +Name: res/drawable-mdpi/abs__ab_stacked_transparent_light_holo.9.png +SHA1-Digest: EB0i/t/645Q1BJg7chPIn9oYscA= + +Name: res/drawable-xhdpi/abs__cab_background_bottom_holo_light.9.png +SHA1-Digest: 8WG4say21Rxg04ifomofY/O/rTM= + +Name: res/drawable-xhdpi/abs__ab_share_pack_holo_light.9.png +SHA1-Digest: umYg99YgbHOqlsvLBKv314XbJd4= + +Name: res/drawable-hdpi/settings_dark.png +SHA1-Digest: 25yJZ+6TAJwiV+CoZLER9RHyVqI= + +Name: res/drawable-hdpi/abs__ic_cab_done_holo_light.png +SHA1-Digest: zKfmdx+Pi5Y3QzyfnABhh0Y9JaM= + +Name: res/drawable/a01.png +SHA1-Digest: qswVdcK/Mkcz7n7sMxsN/APEWnw= + +Name: res/drawable-hdpi/create_folder.png +SHA1-Digest: UI9PaD3b04YPFzhQ8Y2J/e9hSK8= + +Name: res/layout/main.xml +SHA1-Digest: kYzSlOcQwsIusv6X48t2TMsLx5s= + +Name: res/drawable-xhdpi/abs__cab_background_top_holo_light.9.png +SHA1-Digest: 7wvjARiCpNkOl2QCtebZs8NrjLc= + +Name: res/drawable-ldpi/play_notify.png +SHA1-Digest: SpG2XuOdBqgWwz/e7th+Yvz/kV4= + +Name: res/color/abs__primary_text_holo_dark.xml +SHA1-Digest: HVRO2FBI+gYE9X5wemcGtM1oyaY= + +Name: res/drawable-xhdpi/grid_dark.png +SHA1-Digest: ikU16xRrTT//SbcSEqF2Alz7SII= + +Name: res/drawable-mdpi/select.png +SHA1-Digest: m8lLugXjSty3fTMFw/j1Pd0U808= + +Name: res/drawable-xhdpi/wifi0.png +SHA1-Digest: vE1dCQihcOwp1E0FLLXAP5OrU2s= + +Name: res/drawable-xhdpi/download_green.png +SHA1-Digest: /0uzvlJcozYhy15dMGyO2BTKn+o= + +Name: res/drawable/critical.png +SHA1-Digest: GDnLJjl5ZEsh/grYG2qqucxq03s= + +Name: res/drawable-xhdpi/settings_sidelink.png +SHA1-Digest: +4O2kFI+9KwZ/yWhZq8vZZC6s24= + +Name: res/drawable-mdpi/abs__textfield_search_default_holo_dark.9.png +SHA1-Digest: JgbWimYZh49npVxJzioTzJx4xwA= + +Name: res/drawable-xhdpi/abs__ab_stacked_transparent_light_holo.9.png +SHA1-Digest: 8H5fbl+EvKr+AasaFM+1NLJ2/8A= + +Name: res/color/abs__primary_text_disable_only_holo_light.xml +SHA1-Digest: 0heuKJ50dGM08+pzBXy7qx+4hLE= + +Name: res/drawable-mdpi/download_dark_green.png +SHA1-Digest: eKXyoxe0gMWi169cnUx4wLM6BAk= + +Name: res/drawable-xhdpi/abs__ic_menu_share_holo_dark.png +SHA1-Digest: SbXpQTQd3txNn3aJ9x68LoTCQ88= + +Name: res/drawable-ldpi/done.png +SHA1-Digest: sxs8KwhcexovGfsJ2H60BvZA8pw= + +Name: res/drawable-xhdpi/create_folder_dark.png +SHA1-Digest: o4GIGaz/KT/UdmdB+ZIg/Vx7N8s= + +Name: res/drawable-xhdpi/network_wifi0_s.png +SHA1-Digest: HLlFLOGbkebGqZ2sgSQNlyWAsjQ= + +Name: res/drawable-mdpi/abs__ic_cab_done_holo_dark.png +SHA1-Digest: EI7CPUaZ64UwAcjU3VG8arft8MA= + +Name: res/layout/picture_loading.xml +SHA1-Digest: iIrsj2N4XYlqAeaHNhUZPbTBLxk= + +Name: res/drawable/gallery.png +SHA1-Digest: GIU7SukIY04mEdoD86nS30nWrbQ= + +Name: res/drawable-xhdpi/settings_guide.png +SHA1-Digest: oCqrB34SPX9UDH1a6vOf0WGRTO0= + +Name: res/drawable-xhdpi/wifi4.png +SHA1-Digest: tgswmOaliCmfGroGHukJCElVUqI= + +Name: res/drawable-hdpi/abs__btn_cab_done_default_holo_light.9.png +SHA1-Digest: C3CVfhWItXYX5VuhOv3Tr987jDw= + +Name: res/drawable-hdpi/download_green.png +SHA1-Digest: QwU5fEV+RKZj4KW8Gkv/Gg1U7G8= + +Name: res/drawable-mdpi/abs__btn_cab_done_focused_holo_light.9.png +SHA1-Digest: Iv9+d8iSlqYeG85x2ip3PC+TXqI= + +Name: res/drawable-mdpi/abs__spinner_ab_pressed_holo_dark.9.png +SHA1-Digest: RpjH9X9l7RTj4O0/ZHPnjRGjhAs= + +Name: res/layout/settings_about_legal.xml +SHA1-Digest: bFk49aLNUT02gmUe7JByPrZ7fRg= + +Name: res/drawable/abs__ic_menu_moreoverflow_holo_light.xml +SHA1-Digest: Ja+gNbfydTTC7nwqz11DWUjWIB4= + +Name: res/drawable-mdpi/delete.png +SHA1-Digest: qU9mBiJ0EuVTFysrqEfWKMswSNU= + +Name: res/drawable-mdpi/grid.png +SHA1-Digest: 0vdcIGnE4OzuZY+a+LApbhbdF7g= + +Name: res/drawable-mdpi/abs__ab_share_pack_holo_dark.9.png +SHA1-Digest: 7bovMMzOcBf6/I9KeGe/Y4JP3PI= + +Name: res/drawable-mdpi/select_dark.png +SHA1-Digest: sDraxyImpg7m/4NY9t3shPh/Vo8= + +Name: res/layout/wifi_disable_alert.xml +SHA1-Digest: z24WubI/oVgvl3cuq4IrIElRQQ0= + +Name: res/layout/abs__simple_dropdown_hint.xml +SHA1-Digest: kp6SNocIx2R9JCEDdpWBBqwH8Wo= + +Name: res/drawable-mdpi/abs__ic_go_search_api_holo_light.png +SHA1-Digest: HZ81jf3SqGSNkfV8se4PJ1F8P+s= + +Name: res/drawable-hdpi/abs__ic_voice_search_api_holo_light.png +SHA1-Digest: URoLFR3cGwtdIWQqefx4S2slI0A= + +Name: res/xml/settings_security.xml +SHA1-Digest: VB8Ce9FvCDK7WIW86chUEw01LL8= + +Name: assets/zh_CN/01logo.png +SHA1-Digest: nR5HoS3HmNUT/kIzIpsnRFfSee0= + +Name: res/drawable-xhdpi/notify_a02c.png +SHA1-Digest: 0y+6sN1IBS2FJLTLeIx2rt7HVgw= + +Name: res/drawable-xhdpi/abs__textfield_search_selected_holo_light.9.p + ng +SHA1-Digest: /MUgBH/bN2XqWF5dFDTtW4fzSME= + +Name: res/layout-large/music.xml +SHA1-Digest: D40k3DT5SqOIMlGEqsO8Sq8yRSM= + +Name: res/layout/abs__action_bar_title_item.xml +SHA1-Digest: TsyxUMOCIBf9iqn7roo9cLWBpo4= + +Name: assets/es/02qsg_SP.png +SHA1-Digest: DkZwBnDajGj5zCec27LuZV+C9MM= + diff --git a/tests/common.TestCase b/tests/common.TestCase index 4739ddab..2285b67b 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -615,6 +615,27 @@ class CommonTest(unittest.TestCase): self.assertFalse(fdroidserver.common.verify_apk_signature(twosigapk)) self.assertIsNone(fdroidserver.common.verify_apks(sourceapk, twosigapk, self.tmpdir)) + def test_get_certificate_with_chain_sandisk(self): + """Test that APK signatures with a cert chain are parsed like apksigner. + + SanDisk signs their APKs with a X.509 certificate chain of + trust, so there are actually three certificates + included. apksigner only cares about the certificate in the + chain that actually signs the manifest. + + The correct value comes from: + apksigner verify --print-certs 883cbdae7aeb2e4b122e8ee8d89966c7062d0d49107a130235fa220a5b994a79.apk + + """ + cert = fdroidserver.common.get_certificate( + signature_block_file=Path('SANAPPSI.RSA').read_bytes(), + signature_file=Path('SANAPPSI.SF').read_bytes(), + ) + self.assertEqual( + 'ea0abbf2a142e4b167405d516b2cc408c4af4b29cd50ba281aa4470d4aab3e53', + fdroidserver.common.signer_fingerprint(cert), + ) + def test_write_to_config(self): with tempfile.TemporaryDirectory() as tmpPath: cfgPath = os.path.join(tmpPath, 'config.py') From ad9f0a90229850ecc407387272fb7a5799556b60 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 23 Apr 2024 18:03:24 +0200 Subject: [PATCH 1491/2116] include @obfusk's proof-of-concept APKs in test suite https://github.com/obfusk/fdroid-fakesigner-poc/releases/tag/poc-apks --- MANIFEST.in | 4 ++++ tests/common.TestCase | 24 ++++++++++++++++++++++++ tests/issue-1128-poc1.apk | Bin 0 -> 6896 bytes tests/issue-1128-poc2.apk | Bin 0 -> 9781 bytes tests/issue-1128-poc3a.apk | Bin 0 -> 8822 bytes tests/issue-1128-poc3b.apk | Bin 0 -> 8821 bytes 6 files changed, 28 insertions(+) create mode 100644 tests/issue-1128-poc1.apk create mode 100644 tests/issue-1128-poc2.apk create mode 100644 tests/issue-1128-poc3a.apk create mode 100644 tests/issue-1128-poc3b.apk diff --git a/MANIFEST.in b/MANIFEST.in index 1d7bd768..8d24dbf2 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -592,6 +592,10 @@ include tests/init.TestCase include tests/install.TestCase include tests/IsMD5Disabled.java include tests/issue-1128-min-sdk-30-poc.apk +include tests/issue-1128-poc1.apk +include tests/issue-1128-poc2.apk +include tests/issue-1128-poc3a.apk +include tests/issue-1128-poc3b.apk include tests/janus.apk include tests/keystore.jks include tests/key-tricks.py diff --git a/tests/common.TestCase b/tests/common.TestCase index 2285b67b..24132297 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1061,6 +1061,10 @@ class CommonTest(unittest.TestCase): ('org.bitbucket.tickytacky.mirrormirror_4.apk', 'org.bitbucket.tickytacky.mirrormirror', 4, '1.0.3'), ('org.dyndns.fules.ck_20.apk', 'org.dyndns.fules.ck', 20, 'v1.6pre2'), ('issue-1128-min-sdk-30-poc.apk', 'org.fdroid.ci', 1, '1.0'), + ('issue-1128-poc1.apk', 'android.appsecurity.cts.tinyapp', 10, '1.0'), + ('issue-1128-poc2.apk', 'android.appsecurity.cts.tinyapp', 10, '1.0'), + ('issue-1128-poc3a.apk', 'android.appsecurity.cts.tinyapp', 10, '1.0'), + ('issue-1128-poc3b.apk', 'android.appsecurity.cts.tinyapp', 10, '1.0'), ('urzip.apk', 'info.guardianproject.urzip', 100, '0.1'), ('urzip-badcert.apk', 'info.guardianproject.urzip', 100, '0.1'), ('urzip-badsig.apk', 'info.guardianproject.urzip', 100, '0.1'), @@ -1177,6 +1181,10 @@ class CommonTest(unittest.TestCase): self.assertEqual(4, get_minSdkVersion('bad-unicode-πÇÇ现代通用字-български-عربي1.apk')) self.assertEqual(30, get_minSdkVersion('issue-1128-min-sdk-30-poc.apk')) + self.assertEqual(29, get_minSdkVersion('issue-1128-poc1.apk')) + self.assertEqual(29, get_minSdkVersion('issue-1128-poc2.apk')) + self.assertEqual(23, get_minSdkVersion('issue-1128-poc3a.apk')) + self.assertEqual(23, get_minSdkVersion('issue-1128-poc3b.apk')) self.assertEqual(14, get_minSdkVersion('org.bitbucket.tickytacky.mirrormirror_1.apk')) self.assertEqual(14, get_minSdkVersion('org.bitbucket.tickytacky.mirrormirror_2.apk')) self.assertEqual(14, get_minSdkVersion('org.bitbucket.tickytacky.mirrormirror_3.apk')) @@ -2952,6 +2960,14 @@ APKS_WITH_JAR_SIGNATURES = ( 'bad-unicode-πÇÇ现代通用字-български-عربي1.apk', '32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6', ), + ( + 'issue-1128-poc3a.apk', + '1dbb8be012293e988a0820f7d455b07abd267d2c0b500fc793fcfd80141cb5ce', + ), + ( + 'issue-1128-poc3b.apk', + '1dbb8be012293e988a0820f7d455b07abd267d2c0b500fc793fcfd80141cb5ce', + ), ( 'janus.apk', 'ebb0fedf1942a099b287c3db00ff732162152481abb2b6c7cbcdb2ba5894a768', @@ -3058,6 +3074,14 @@ APKS_WITH_JAR_SIGNATURES = ( ), ) APKS_WITHOUT_JAR_SIGNATURES = ( + ( + 'issue-1128-poc1.apk', # APK v3 Signature only + '1dbb8be012293e988a0820f7d455b07abd267d2c0b500fc793fcfd80141cb5ce', + ), + ( + 'issue-1128-poc2.apk', # APK v3 Signature only + '1dbb8be012293e988a0820f7d455b07abd267d2c0b500fc793fcfd80141cb5ce', + ), ( 'issue-1128-min-sdk-30-poc.apk', # APK v3 Signature only '09350d5f3460a8a0ea5cf6b68ccd296a58754f7e683ba6aa08c19be8353504f3', diff --git a/tests/issue-1128-poc1.apk b/tests/issue-1128-poc1.apk new file mode 100644 index 0000000000000000000000000000000000000000..ba643f3d5262a087fba08af14910217c49bb6c60 GIT binary patch literal 6896 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 Pe;9xR*c5!E#z_AF7Z0Hn literal 0 HcmV?d00001 diff --git a/tests/issue-1128-poc2.apk b/tests/issue-1128-poc2.apk new file mode 100644 index 0000000000000000000000000000000000000000..b9947df8781d730d0c043325fbb526faee148261 GIT binary patch literal 9781 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 BOg{hs literal 0 HcmV?d00001 diff --git a/tests/issue-1128-poc3b.apk b/tests/issue-1128-poc3b.apk new file mode 100644 index 0000000000000000000000000000000000000000..91f536e35326d5dad5674f5e7f77cf24b559ff22 GIT binary patch literal 8821 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 BPjmnP literal 0 HcmV?d00001 From 9f62445f386a41bc8c9da367aad27866b9fdec9a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 7 May 2024 18:54:44 +0200 Subject: [PATCH 1492/2116] gitlab-ci: fix ubuntu_lts_ppa job to work with Ubuntu/noble --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2b0ab577..8de00bec 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -127,7 +127,7 @@ ubuntu_lts_ppa: - export ANDROID_HOME=/usr/lib/android-sdk - apt-get install gnupg - while ! apt-key adv --keyserver keyserver.ubuntu.com --recv-key 9AAC253193B65D4DF1D0A13EEC4632C79C5E0151; do sleep 15; done - - export RELEASE=`sed -n 's,^deb [^ ][^ ]* \([a-z]*\).*,\1,p' /etc/apt/sources.list | head -1` + - export RELEASE=$(sed -n 's,^Suites\x3a \([a-z]*\).*,\1,p' /etc/apt/sources.list.d/*.sources | head -1) - echo "deb http://ppa.launchpad.net/fdroid/fdroidserver/ubuntu $RELEASE main" >> /etc/apt/sources.list - apt-get update - apt-get dist-upgrade From 6c27fec94b560d5ea9bf3b7dd87c9be422e4c912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20D=C3=BCster?= Date: Sat, 28 Oct 2023 08:32:26 +0200 Subject: [PATCH 1493/2116] [import] Add more docstrings --- fdroidserver/import_subcommand.py | 60 +++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/fdroidserver/import_subcommand.py b/fdroidserver/import_subcommand.py index 16c00f5b..d1105914 100644 --- a/fdroidserver/import_subcommand.py +++ b/fdroidserver/import_subcommand.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +"""Extract application metadata from a source repository.""" # # import_subcommand.py - part of the FDroid server tools # Copyright (C) 2010-13, Ciaran Gultnieks, ciaran@ciarang.com @@ -30,6 +31,7 @@ import yaml from argparse import ArgumentParser import logging from pathlib import Path +from typing import Optional try: from yaml import CSafeLoader as SafeLoader @@ -53,7 +55,19 @@ def handle_retree_error_on_windows(function, path, excinfo): function(path) -def clone_to_tmp_dir(app): +def clone_to_tmp_dir(app: metadata.App) -> Path: + """Clone the source repository of an app to a temporary directory for further processing. + + Parameters + ---------- + app + The App instance to clone the source of. + + Returns + ------- + tmp_dir + The (temporary) directory the apps source has been cloned into. + """ tmp_dir = Path('tmp') tmp_dir.mkdir(exist_ok=True) @@ -67,7 +81,7 @@ def clone_to_tmp_dir(app): return tmp_dir -def getrepofrompage(url): +def getrepofrompage(url: str) -> tuple[Optional[str], str]: """Get the repo type and address from the given web page. The page is scanned in a rather naive manner for 'git clone xxxx', @@ -75,6 +89,17 @@ def getrepofrompage(url): that's the information we want. Returns repotype, address, or None, reason + Parameters + ---------- + url + The url to look for repository information at. + + Returns + ------- + repotype_or_none + The found repository type or None if an error occured. + address_or_reason + The address to the found repository or the reason if an error occured. """ if not url.startswith('http'): return (None, _('{url} does not start with "http"!'.format(url=url))) @@ -120,13 +145,29 @@ def getrepofrompage(url): return (None, _("No information found.") + page) -def get_app_from_url(url): +def get_app_from_url(url: str) -> metadata.App: """Guess basic app metadata from the URL. The URL must include a network hostname, unless it is an lp:, file:, or git/ssh URL. This throws ValueError on bad URLs to match urlparse(). + Parameters + ---------- + url + The URL to look to look for app metadata at. + + Returns + ------- + app + App instance with the found metadata. + + Raises + ------ + :exc:`~fdroidserver.exception.FDroidException` + If the VCS type could not be determined. + :exc:`ValueError` + If the URL is invalid. """ parsed = urllib.parse.urlparse(url) invalid_url = False @@ -183,6 +224,19 @@ def get_app_from_url(url): def main(): + """Extract app metadata and write it to a file. + + The behaviour of this function is influenced by the configuration file as + well as command line parameters. + + Raises + ------ + :exc:`~fdroidserver.exception.FDroidException` + If the repository already has local metadata, no URL is specified and + the current directory is not a Git repository, no application ID could + be found, no Gradle project could be found or there is already metadata + for the found application ID. + """ global config, options # Parse command line... From 97346a2cba788b20ffbfb98ab8c301fa25968e14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20D=C3=BCster?= Date: Sun, 29 Oct 2023 14:10:30 +0100 Subject: [PATCH 1494/2116] [nightly] Add more docstrings --- fdroidserver/nightly.py | 61 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 400ad0ba..9471a26e 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +"""Set up an app build for a nightly build repo.""" # # nightly.py - part of the FDroid server tools # Copyright (C) 2017 Hans-Christoph Steiner @@ -32,6 +33,7 @@ import tempfile import yaml from urllib.parse import urlparse from argparse import ArgumentParser +from typing import Optional from . import _ from . import common @@ -48,12 +50,38 @@ DISTINGUISHED_NAME = 'CN=Android Debug,O=Android,C=US' NIGHTLY = '-nightly' -def _get_keystore_secret_var(keystore): +def _get_keystore_secret_var(keystore: str) -> str: + """Get keystore secret as base64. + + Parameters + ---------- + keystore + The path of the keystore. + + Returns + ------- + base64_secret + The keystore secret as base64 string. + """ with open(keystore, 'rb') as fp: return base64.standard_b64encode(fp.read()).decode('ascii') -def _ssh_key_from_debug_keystore(keystore=None): +def _ssh_key_from_debug_keystore(keystore: Optional[str] = None) -> str: + """Convert a debug keystore to an SSH private key. + + This leaves the original keystore file in place. + + Parameters + ---------- + keystore + The keystore to convert to a SSH private key. + + Returns + ------- + key_path + The SSH private key file path in the temporary directory. + """ if keystore is None: # set this here so it can be overridden in the tests # TODO convert this to a class to get rid of this nonsense @@ -148,7 +176,23 @@ def _ssh_key_from_debug_keystore(keystore=None): return ssh_private_key_file -def get_repo_base_url(clone_url, repo_git_base, force_type=None): +def get_repo_base_url(clone_url: str, repo_git_base: str, force_type: Optional[str] = None) -> str: + """Generate the base URL for the F-Droid repository. + + Parameters + ---------- + clone_url + The URL to clone the Git repository. + repo_git_base + The project path of the Git repository at the Git forge. + force_type + The Git forge of the project. + + Returns + ------- + repo_base_url + The base URL of the F-Droid repository. + """ if force_type is None: force_type = urlparse(clone_url).netloc if force_type == 'gitlab.com': @@ -160,6 +204,17 @@ def get_repo_base_url(clone_url, repo_git_base, force_type=None): def main(): + """Deploy to F-Droid repository or generate SSH private key from keystore. + + The behaviour of this function is influenced by the configuration file as + well as command line parameters. + + Raises + ------ + :exc:`~fdroidserver.exception.VCSException` + If the nightly Git repository could not be cloned during an attempt to + deploy. + """ parser = ArgumentParser() common.setup_global_opts(parser) parser.add_argument( From 4109e8fb035064953a718d35cc2f0b990a668cf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20D=C3=BCster?= Date: Sun, 29 Oct 2023 15:15:29 +0100 Subject: [PATCH 1495/2116] [checkupdates] Add module docstring --- fdroidserver/checkupdates.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index aa41e5b7..07a4d668 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +"""Check for updates to applications.""" # # checkupdates.py - part of the FDroid server tools # Copyright (C) 2010-2015, Ciaran Gultnieks, ciaran@ciarang.com From 1c707589409a32bc1725244917138db06e9ac458 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20D=C3=BCster?= Date: Mon, 30 Oct 2023 08:57:21 +0100 Subject: [PATCH 1496/2116] [btlog] Add more docstrings --- fdroidserver/btlog.py | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/fdroidserver/btlog.py b/fdroidserver/btlog.py index ea79bc8a..fc49ac9a 100755 --- a/fdroidserver/btlog.py +++ b/fdroidserver/btlog.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +"""Update the binary transparency log for a URL.""" # # btlog.py - part of the FDroid server tools # Copyright (C) 2017, Hans-Christoph Steiner @@ -39,6 +40,7 @@ import shutil import tempfile import zipfile from argparse import ArgumentParser +from typing import Optional from . import _ from . import common @@ -50,14 +52,30 @@ options = None def make_binary_transparency_log( - repodirs, btrepo='binary_transparency', url=None, commit_title='fdroid update' + repodirs: collections.abc.Iterable, + btrepo: str = 'binary_transparency', + url: Optional[str] = None, + commit_title: str = 'fdroid update', ): """Log the indexes in a standalone git repo to serve as a "binary transparency" log. - References + Parameters ---------- - https://www.eff.org/deeplinks/2014/02/open-letter-to-tech-companies + repodirs + The directories of the F-Droid repository to generate the binary + transparency log for. + btrepo + The path to the Git repository of the binary transparency log. + url + The URL of the F-Droid repository to generate the binary transparency + log for. + commit_title + The commit title for commits in the binary transparency log Git + repository. + Notes + ----- + Also see https://www.eff.org/deeplinks/2014/02/open-letter-to-tech-companies . """ logging.info('Committing indexes to ' + btrepo) if os.path.exists(os.path.join(btrepo, '.git')): @@ -149,6 +167,16 @@ For more info on this idea: def main(): + """Generate or update a binary transparency log for a F-Droid repository. + + The behaviour of this function is influenced by the configuration file as + well as command line parameters. + + Raises + ------ + :exc:`~fdroidserver.exception.FDroidException` + If the specified or default Git repository does not exist. + """ global options parser = ArgumentParser() From df27405d8b87be5c38ef0853fbba2eb1bed7e49c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20D=C3=BCster?= Date: Wed, 24 Jan 2024 13:08:01 +0100 Subject: [PATCH 1497/2116] [build] Add more docstrings --- fdroidserver/build.py | 181 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 164 insertions(+), 17 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 84f19ed5..02e52315 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +"""Build a package from source.""" # # build.py - part of the FDroid server tools # Copyright (C) 2010-2014, Ciaran Gultnieks, ciaran@ciarang.com @@ -59,15 +60,30 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): Parameters ---------- app - app metadata dict + The metadata of the app to build. build + The build of the app to build. vcs - version control system controller object + The version control system controller object of the app. build_dir - local source-code checkout of app + The local source-code checkout directory of the app. output_dir - target folder for the build result + The target folder for the build result. + log_dir + The directory in the VM where the build logs are getting stored. force + Don't refresh the already cloned repository and make the build stop on + exceptions. + + Raises + ------ + :exc:`~fdroidserver.exception.BuildException` + If Paramiko is not installed, a srclib directory or srclib metadata + file is unexpectedly missing, the build process in the VM failed or + output files of the build process are missing. + :exc:`~fdroidserver.exception.FDroidException` + If the Buildserver ID could not be obtained or copying a directory to + the server failed. """ global buildserverid, ssh_channel @@ -115,8 +131,8 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): # Put all the necessary files in place... ftp.chdir(homedir) - # Helper to copy the contents of a directory to the server... def send_dir(path): + """Copy the contents of a directory to the server.""" logging.debug("rsyncing %s to %s" % (path, ftp.getcwd())) # TODO this should move to `vagrant rsync` from >= v1.5 try: @@ -316,6 +332,15 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): def force_gradle_build_tools(build_dir, build_tools): + """Manipulate build tools version used in top level gradle file. + + Parameters + ---------- + build_dir + The directory to start looking for gradle files. + build_tools + The build tools version that should be forced to use. + """ for root, dirs, files in os.walk(build_dir): for filename in files: if not filename.endswith('.gradle'): @@ -342,6 +367,31 @@ def get_metadata_from_apk(app, build, apkfile): """Get the required metadata from the built APK. VersionName is allowed to be a blank string, i.e. '' + + Parameters + ---------- + app + The app metadata used to build the APK. + build + The build that resulted in the APK. + apkfile + The path of the APK file. + + Returns + ------- + versionCode + The versionCode from the APK or from the metadata is build.novcheck is + set. + versionName + The versionName from the APK or from the metadata is build.novcheck is + set. + + Raises + ------ + :exc:`~fdroidserver.exception.BuildException` + If native code should have been built but was not packaged, no version + information or no package ID could be found or there is a mismatch + between the package ID in the metadata and the one found in the APK. """ appid, versionCode, versionName = common.get_apk_id(apkfile) native_code = common.get_native_code(apkfile) @@ -362,7 +412,56 @@ def get_metadata_from_apk(app, build, apkfile): def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, extlib_dir, tmp_dir, force, onserver, refresh): - """Do a build locally.""" + """Do a build locally. + + Parameters + ---------- + app + The metadata of the app to build. + build + The build of the app to build. + vcs + The version control system controller object of the app. + build_dir + The local source-code checkout directory of the app. + output_dir + The target folder for the build result. + log_dir + The directory in the VM where the build logs are getting stored. + srclib_dir + The path to the srclibs directory, usually 'build/srclib'. + extlib_dir + The path to the extlibs directory, usually 'build/extlib'. + tmp_dir + The temporary directory for building the source tarball. + force + Don't refresh the already cloned repository and make the build stop on + exceptions. + onserver + Assume the build is happening inside the VM. + refresh + Enable fetching the latest refs from the VCS remote. + + Raises + ------ + :exc:`~fdroidserver.exception.BuildException` + If running a `sudo` command failed, locking the root account failed, + `sudo` couldn't be removed, cleaning the build environment failed, + skipping the scanning has been requested but `scandelete` is present, + errors occurred during scanning, running the `build` commands from the + metadata failed, building native code failed, building with the + specified build method failed, no output could be found with build + method `maven`, more or less than one APK were found with build method + `gradle`, less or more than one APKs match the `output` glob specified + in the metadata, running a `postbuild` command specified in the + metadata failed, the built APK is debuggable, the unsigned APK is not + at the expected location, the APK does not contain the expected + `versionName` and `versionCode` or undesired package names have been + found in the APK. + :exc:`~fdroidserver.exception.FDroidException` + If no Android NDK version could be found and the build isn't run in a + builder VM, the selected Android NDK is not a directory. + """ ndk_path = build.ndk_path() if build.ndk or (build.buildjni and build.buildjni != ['no']): if not ndk_path: @@ -766,23 +865,47 @@ def trybuild(app, build, build_dir, output_dir, log_dir, also_check_dir, Parameters ---------- + app + The metadata of the app to build. + build + The build of the app to build. + build_dir + The local source-code checkout directory of the app. output_dir - The directory where the build output will go. - Usually this is the 'unsigned' directory. + The directory where the build output will go. Usually this is the + 'unsigned' directory. + log_dir + The directory in the VM where the build logs are getting stored. + also_check_dir + An additional location for checking if the build is necessary (usually + the archive repo). + srclib_dir + The path to the srclibs directory, usually 'build/srclib'. + extlib_dir + The path to the extlibs directory, usually 'build/extlib'. + tmp_dir + The temporary directory for building the source tarball of the app to + build. repo_dir The repo directory - used for checking if the build is necessary. - also_check_dir - An additional location for checking if the build - is necessary (usually the archive repo) + vcs + The version control system controller object of the app to build. test - True if building in test mode, in which case the build will - always happen, even if the output already exists. In test mode, the - output directory should be a temporary location, not any of the real - ones. + True if building in test mode, in which case the build will always + happen, even if the output already exists. In test mode, the output + directory should be a temporary location, not any of the real ones. + server + Use buildserver VM for building. + force + Build app regardless of disabled state or scanner errors. + onserver + Assume the build is happening inside the VM. + refresh + Enable fetching the latest refs from the VCS remote. Returns ------- - Boolean + status True if the build was done, False if it wasn't necessary. """ dest_file = common.get_release_filename(app, build) @@ -821,7 +944,13 @@ def trybuild(app, build, build_dir, output_dir, log_dir, also_check_dir, def force_halt_build(timeout): - """Halt the currently running Vagrant VM, to be called from a Timer.""" + """Halt the currently running Vagrant VM, to be called from a Timer. + + Parameters + ---------- + timeout + The timeout in seconds. + """ logging.error(_('Force halting build after {0} sec timeout!').format(timeout)) timeout_event.set() if ssh_channel: @@ -845,7 +974,9 @@ def parse_commandline(): Returns ------- options + The resulting options parsed from the command line arguments. parser + The argument parser. """ parser = argparse.ArgumentParser(usage="%(prog)s [options] [APPID[:VERCODE] [APPID[:VERCODE] ...]]") common.setup_global_opts(parser) @@ -905,6 +1036,22 @@ timeout_event = threading.Event() def main(): + """Build a package from source. + + The behaviour of this function is influenced by the configuration file as + well as command line parameters. + + Raises + ------ + :exc:`~fdroidserver.exception.FDroidException` + If more than one local metadata file has been found, no app metadata + has been found, there are no apps to process, downloading binaries for + checking the reproducibility of a built binary failed, the built binary + is different from supplied reference binary, the reference binary is + signed with a different signing key than expected, a VCS error occured + while building an app or a different error occured while building an + app. + """ global options, config, buildserverid, fdroidserverid options, parser = parse_commandline() From dbdefe200c8ce8d6474f7ae97be1005f06c32ff4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gregor=20D=C3=BCster?= Date: Fri, 26 Jan 2024 08:08:37 +0100 Subject: [PATCH 1498/2116] Format files with ruff --- fdroidserver/btlog.py | 1 - fdroidserver/init.py | 4 ++-- fdroidserver/lint.py | 11 +++++++---- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/fdroidserver/btlog.py b/fdroidserver/btlog.py index fc49ac9a..3154b3de 100755 --- a/fdroidserver/btlog.py +++ b/fdroidserver/btlog.py @@ -27,7 +27,6 @@ # client app so its not easy for the server to distinguish this from # the F-Droid client. - import collections import defusedxml.minidom import git diff --git a/fdroidserver/init.py b/fdroidserver/init.py index d3195288..ab5a3e48 100644 --- a/fdroidserver/init.py +++ b/fdroidserver/init.py @@ -282,13 +282,13 @@ def main(): msg += '\n\n' msg += ( _( - '''To complete the setup, add your APKs to "%s" + """To complete the setup, add your APKs to "%s" then run "fdroid update -c; fdroid update". You might also want to edit "config.yml" to set the URL, repo name, and more. You should also set up a signing key (a temporary one might have been automatically generated). For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo -and https://f-droid.org/docs/Signing_Process''' +and https://f-droid.org/docs/Signing_Process""" ) % os.path.join(fdroiddir, 'repo') ) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 351667ba..d7a9783d 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -214,7 +214,7 @@ regex_checks = { _("Forbidden HTML tags"), ), ( - re.compile(r'''.*\s+src=["']javascript:.*'''), + re.compile(r""".*\s+src=["']javascript:.*"""), _("Javascript in HTML src attributes"), ), ], @@ -459,9 +459,12 @@ def check_builds(app): "Branch '{branch}' used as commit in srclib '{srclib}'" ).format(branch=s, srclib=srclib) else: - yield _( - 'srclibs missing name and/or @' - ) + ' (srclibs: ' + srclib + ')' + yield ( + _('srclibs missing name and/or @') + + ' (srclibs: ' + + srclib + + ')' + ) for key in build.keys(): if key not in supported_flags: yield _('%s is not an accepted build field') % key From 820884146013abaee1a53378f32690239858b148 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 2 May 2024 12:10:19 +0200 Subject: [PATCH 1499/2116] common: make explicit which test cases need mocked options --- tests/common.TestCase | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/tests/common.TestCase b/tests/common.TestCase index 24132297..11ec5d7b 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -45,6 +45,12 @@ from fdroidserver.exception import FDroidException, VCSException,\ from fdroidserver.looseversion import LooseVersion +def _mock_common_module_options_instance(): + """Helper method to deal with difficult visibility of the module-level options.""" + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.verbose = False + + class CommonTest(unittest.TestCase): '''fdroidserver/common.py''' @@ -57,14 +63,18 @@ class CommonTest(unittest.TestCase): if not os.path.exists(self.tmpdir): os.makedirs(self.tmpdir) os.chdir(self.basedir) + + # these are declared as None at the top of the module file fdroidserver.common.config = None - fdroidserver.common.options = mock.Mock() - fdroidserver.common.options.verbose = False + fdroidserver.common.options = None fdroidserver.metadata.srclibs = None + self._td = mkdtemp() self.testdir = self._td.name def tearDown(self): + fdroidserver.common.config = None + fdroidserver.common.options = None os.chdir(self.basedir) self._td.cleanup() shutil.rmtree(self.tmpdir) @@ -356,6 +366,7 @@ class CommonTest(unittest.TestCase): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config + _mock_common_module_options_instance() srclibname = 'FakeSrcLib' srclib_testdir = os.path.join(self.testdir, 'build', 'srclib') @@ -397,6 +408,7 @@ class CommonTest(unittest.TestCase): onserver=True, refresh=False) # do not clone in this test def test_prepare_sources_refresh(self): + _mock_common_module_options_instance() packageName = 'org.fdroid.ci.test.app' os.chdir(self.tmpdir) os.mkdir('build') @@ -467,6 +479,7 @@ class CommonTest(unittest.TestCase): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config + _mock_common_module_options_instance() commands = ['sh', '-c', 'echo stdout message && echo stderr message 1>&2'] @@ -477,6 +490,7 @@ class CommonTest(unittest.TestCase): self.assertEqual(p.output, 'stdout message\n') def test_signjar(self): + _mock_common_module_options_instance() config = fdroidserver.common.read_config(fdroidserver.common.options) config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') fdroidserver.common.config = config @@ -497,6 +511,7 @@ class CommonTest(unittest.TestCase): ) def test_verify_apk_signature(self): + _mock_common_module_options_instance() config = fdroidserver.common.read_config(fdroidserver.common.options) fdroidserver.common.config = config @@ -519,6 +534,7 @@ class CommonTest(unittest.TestCase): self.assertFalse(fdroidserver.common.verify_apk_signature('urzip-release-unsigned.apk')) def test_verify_old_apk_signature(self): + _mock_common_module_options_instance() config = fdroidserver.common.read_config(fdroidserver.common.options) config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') fdroidserver.common.config = config @@ -583,6 +599,7 @@ class CommonTest(unittest.TestCase): def test_verify_apks(self): config = fdroidserver.common.read_config(fdroidserver.common.options) fdroidserver.common.config = config + _mock_common_module_options_instance() sourceapk = os.path.join(self.basedir, 'urzip.apk') @@ -889,6 +906,7 @@ class CommonTest(unittest.TestCase): ) def test_sign_apk(self): + _mock_common_module_options_instance() config = fdroidserver.common.read_config(fdroidserver.common.options) if 'apksigner' not in config: self.skipTest('SKIPPING test_sign_apk, apksigner not installed!') @@ -959,6 +977,7 @@ class CommonTest(unittest.TestCase): @unittest.skipIf(os.getuid() == 0, 'This is meaningless when run as root') def test_sign_apk_fail(self): + _mock_common_module_options_instance() config = fdroidserver.common.read_config(fdroidserver.common.options) if 'apksigner' not in config: self.skipTest('SKIPPING test_sign_apk_fail, apksigner not installed!') @@ -982,6 +1001,7 @@ class CommonTest(unittest.TestCase): self.assertFalse(os.path.isfile(signed)) def test_sign_apk_corrupt(self): + _mock_common_module_options_instance() config = fdroidserver.common.read_config(fdroidserver.common.options) if 'apksigner' not in config: self.skipTest('SKIPPING test_sign_apk_corrupt, apksigner not installed!') @@ -1008,6 +1028,7 @@ class CommonTest(unittest.TestCase): ) def test_resign_apk(self): """When using apksigner, it should resign signed APKs""" + _mock_common_module_options_instance() config = fdroidserver.common.read_config(fdroidserver.common.options) if 'apksigner' not in config: self.skipTest('SKIPPING test_resign_apk, apksigner not installed!') @@ -2532,6 +2553,7 @@ class CommonTest(unittest.TestCase): @mock.patch.dict(os.environ, clear=True) def test_FDroidPopen_envs_paths_can_be_pathlib(self): + _mock_common_module_options_instance() os.environ['PATH'] = '/usr/bin:/usr/sbin' envs = {'PATHLIB': Path('/pathlib/path'), 'STRING': '/string/path'} p = fdroidserver.common.FDroidPopen(['/bin/sh', '-c', 'export'], envs=envs) From 1eaba25021197b4f0dea81bc1106bd5b584a9079 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 2 May 2024 12:11:33 +0200 Subject: [PATCH 1500/2116] common: do not use module reference for local functions This just makes things more confusing. --- fdroidserver/common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index b3e41c81..22af3e00 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -380,7 +380,7 @@ def get_config(opts=None): if config is not None: return config - common.read_config(opts=opts) + read_config(opts=opts) # make sure these values are available in common.py even if they didn't # declare global in a scope @@ -570,7 +570,7 @@ def parse_mirrors_config(mirrors): def file_entry(filename, hash_value=None): meta = {} meta["name"] = "/" + Path(filename).as_posix().split("/", 1)[1] - meta["sha256"] = hash_value or common.sha256sum(filename) + meta["sha256"] = hash_value or sha256sum(filename) meta["size"] = os.stat(filename).st_size return meta From 92a3f4b19103767b4f56c364ac947e4d4b776309 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 2 May 2024 12:19:02 +0200 Subject: [PATCH 1501/2116] rename local variable to stop overwriting global options This fixes a bug where if smartcardoptions is set as a str in config.yml will overwrite all command line options. a4d069862 fdroidserver!1106 --- fdroidserver/common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 22af3e00..1f51fd21 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -477,8 +477,8 @@ def read_config(opts=None): # smartcardoptions must be a list since its command line args for Popen smartcardoptions = config.get('smartcardoptions') if isinstance(smartcardoptions, str): - options = re.sub(r'\s+', r' ', config['smartcardoptions']).split(' ') - config['smartcardoptions'] = [i.strip() for i in options if i] + sco_items = re.sub(r'\s+', r' ', config['smartcardoptions']).split(' ') + config['smartcardoptions'] = [i.strip() for i in sco_items if i] elif not smartcardoptions and 'keystore' in config and config['keystore'] == 'NONE': # keystore='NONE' means use smartcard, these are required defaults config['smartcardoptions'] = ['-storetype', 'PKCS11', '-providerName', From 717df09be020e3a3ac613a0f5e5625263c7f08b1 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 2 May 2024 14:05:56 +0200 Subject: [PATCH 1502/2116] clarify that config/options can be global or module-level variable --- fdroidserver/common.py | 22 ++++++++++++++++- tests/common.TestCase | 54 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 1f51fd21..4074d2aa 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -374,7 +374,27 @@ def fill_config_defaults(thisconfig): def get_config(opts=None): - """Get config instace. This function takes care of initializing config data before returning it.""" + """Get the initalized, singleton config instance. + + config and options are intertwined in read_config(), so they have + to be here too. In the current ugly state of things, there are + multiple potential instances of config and options in use: + + * global + * module-level in the subcommand module (e.g. fdroidserver/build.py) + * module-level in fdroidserver.common + + There are some insane parts of the code that are probably + referring to multiple instances of these at different points. + This can be super confusing and maddening. + + The current intermediate refactoring step is to move all + subcommands to always get/set config and options via this function + so that there is no longer a distinction between the global and + module-level instances. Then there can be only one module-level + instance in fdroidserver.common. + + """ global config, options if config is not None: diff --git a/tests/common.TestCase b/tests/common.TestCase index 11ec5d7b..a162826e 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -3237,6 +3237,60 @@ class SignerExtractionTest(unittest.TestCase): ) +class ConfigOptionsScopeTest(unittest.TestCase): + """Test assumptions about variable scope for "config" and "options". + + The ancient architecture of config and options in fdroidserver has + weird issues around unexpected scope, like there are cases where + the global config is not the same as the module-level config, and + more. + + This is about describing what is happening, it is not about + documenting behaviors that are good design. The config and options + handling should really be refactored into a well-known, workable + Pythonic pattern. + + """ + + def setUp(self): + # these are declared as None at the top of the module file + fdroidserver.common.config = None + fdroidserver.common.options = None + + def tearDown(self): + fdroidserver.common.config = None + fdroidserver.common.options = None + if 'config' in globals(): + global config + del config + if 'options' in globals(): + global options + del options + + def test_get_config(self): + """Show how the module-level variables are initialized.""" + self.assertTrue('config' not in vars() and 'config' not in globals()) + self.assertIsNone(fdroidserver.common.config) + config = fdroidserver.common.get_config() + self.assertIsNotNone(fdroidserver.common.config) + self.assertEqual(dict, type(config)) + self.assertEqual(config, fdroidserver.common.config) + + def test_get_config_global(self): + """Test assumptions about variable scope using global keyword.""" + global config + self.assertTrue('config' not in vars() and 'config' not in globals()) + self.assertIsNone(fdroidserver.common.config) + c = fdroidserver.common.get_config() + self.assertIsNotNone(fdroidserver.common.config) + self.assertEqual(dict, type(c)) + self.assertEqual(c, fdroidserver.common.config) + self.assertTrue( + 'config' not in vars() and 'config' not in globals(), + "The config should not be set in the global context, only module-level.", + ) + + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 1e5699e90ce031fb62fc269ee6da262a3865ce2d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 2 May 2024 14:08:28 +0200 Subject: [PATCH 1503/2116] remove all references to optparse (deprecated since Python 3.2) --- fdroidserver/__main__.py | 2 +- tests/build.TestCase | 9 +++++---- tests/checkupdates.TestCase | 9 +++++---- tests/common.TestCase | 8 ++++---- tests/deploy.TestCase | 9 +++++---- tests/exception.TestCase | 9 +++++---- tests/gpgsign.TestCase | 9 +++++---- tests/import_subcommand.TestCase | 9 +++++---- tests/index.TestCase | 9 +++++---- tests/init.TestCase | 9 +++++---- tests/install.TestCase | 9 +++++---- tests/lint.TestCase | 9 +++++---- tests/main.TestCase | 9 +++++---- tests/metadata.TestCase | 9 +++++---- tests/net.TestCase | 9 +++++---- tests/nightly.TestCase | 9 +++++---- tests/publish.TestCase | 9 +++++---- tests/rewritemeta.TestCase | 9 +++++---- tests/scanner.TestCase | 9 +++++---- tests/signatures.TestCase | 9 +++++---- tests/signindex.TestCase | 9 +++++---- tests/update.TestCase | 9 +++++---- tests/vcs.TestCase | 9 +++++---- tests/verify.TestCase | 9 +++++---- 24 files changed, 115 insertions(+), 93 deletions(-) diff --git a/fdroidserver/__main__.py b/fdroidserver/__main__.py index 00c19e35..14813fa1 100755 --- a/fdroidserver/__main__.py +++ b/fdroidserver/__main__.py @@ -182,7 +182,7 @@ def main(): "can not be specified at the same time.")) sys.exit(1) - # Trick optparse into displaying the right usage when --help is used. + # Trick argparse into displaying the right usage when --help is used. sys.argv[0] += ' ' + command del sys.argv[1] diff --git a/tests/build.TestCase b/tests/build.TestCase index 3ad4cdd0..0228bf35 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -4,7 +4,6 @@ import inspect import logging -import optparse import os import shutil import sys @@ -1104,15 +1103,17 @@ class BuildTest(unittest.TestCase): if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) + fdroidserver.common.options = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(BuildTest)) diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index 972f1eef..0ae895de 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -3,7 +3,6 @@ # http://www.drdobbs.com/testing/unit-testing-with-python/240165163 import logging -import optparse import os import sys import unittest @@ -336,15 +335,17 @@ class CheckupdatesTest(unittest.TestCase): if __name__ == "__main__": - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) + fdroidserver.common.options = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(CheckupdatesTest)) diff --git a/tests/common.TestCase b/tests/common.TestCase index a162826e..b3e32100 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -9,7 +9,6 @@ import importlib import inspect import json import logging -import optparse import os import re import ruamel.yaml @@ -22,6 +21,7 @@ import unittest import textwrap import yaml import gzip +from argparse import ArgumentParser from zipfile import BadZipFile, ZipFile from unittest import mock from pathlib import Path @@ -3294,15 +3294,15 @@ class ConfigOptionsScopeTest(unittest.TestCase): if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) - parser = optparse.OptionParser() - parser.add_option( + parser = ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) + fdroidserver.common.options = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(CommonTest)) diff --git a/tests/deploy.TestCase b/tests/deploy.TestCase index fd17d062..f2082dd3 100755 --- a/tests/deploy.TestCase +++ b/tests/deploy.TestCase @@ -2,7 +2,6 @@ import inspect import logging -import optparse import os import sys import tempfile @@ -390,15 +389,17 @@ class DeployTest(unittest.TestCase): if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) + fdroidserver.common.options = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(DeployTest)) diff --git a/tests/exception.TestCase b/tests/exception.TestCase index a1d8a992..bfa44f57 100755 --- a/tests/exception.TestCase +++ b/tests/exception.TestCase @@ -3,7 +3,6 @@ # http://www.drdobbs.com/testing/unit-testing-with-python/240165163 import inspect -import optparse import os import sys import unittest @@ -57,15 +56,17 @@ class ExceptionTest(unittest.TestCase): if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (fdroidserver.exception.options, args) = parser.parse_args(['--verbose']) + fdroidserver.exception.options = parser.parse_args(['--verbose']) fdroidserver.common.options = fdroidserver.exception.options newSuite = unittest.TestSuite() diff --git a/tests/gpgsign.TestCase b/tests/gpgsign.TestCase index ef5ea007..27feb79e 100755 --- a/tests/gpgsign.TestCase +++ b/tests/gpgsign.TestCase @@ -3,7 +3,6 @@ import inspect import json import logging -import optparse import os import shutil import sys @@ -75,15 +74,17 @@ class GpgsignTest(unittest.TestCase): if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (common.options, args) = parser.parse_args(['--verbose']) + common.options = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(GpgsignTest)) diff --git a/tests/import_subcommand.TestCase b/tests/import_subcommand.TestCase index eb41ae20..79222eab 100755 --- a/tests/import_subcommand.TestCase +++ b/tests/import_subcommand.TestCase @@ -4,7 +4,6 @@ import git import logging -import optparse import os import shutil import sys @@ -161,15 +160,17 @@ class ImportTest(unittest.TestCase): if __name__ == "__main__": - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) + fdroidserver.common.options = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(ImportTest)) diff --git a/tests/index.TestCase b/tests/index.TestCase index 3fb4a034..3e70acb1 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -5,7 +5,6 @@ import datetime import glob import inspect import logging -import optparse import os import sys import unittest @@ -942,15 +941,17 @@ class AltstoreIndexTest(unittest.TestCase): if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (options, args) = parser.parse_args(["--verbose"]) + options = parser.parse_args(["--verbose"]) Options.verbose = options.verbose newSuite = unittest.TestSuite() diff --git a/tests/init.TestCase b/tests/init.TestCase index 8e1042c3..9266fa7c 100755 --- a/tests/init.TestCase +++ b/tests/init.TestCase @@ -5,7 +5,6 @@ import inspect import logging import os -import optparse import shutil import sys import unittest @@ -75,15 +74,17 @@ class InitTest(unittest.TestCase): if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (fdroidserver.init.options, args) = parser.parse_args(['--verbose']) + fdroidserver.init.options = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(InitTest)) diff --git a/tests/install.TestCase b/tests/install.TestCase index c2fad222..2f4569ea 100755 --- a/tests/install.TestCase +++ b/tests/install.TestCase @@ -3,7 +3,6 @@ # http://www.drdobbs.com/testing/unit-testing-with-python/240165163 import inspect -import optparse import os import sys import unittest @@ -38,15 +37,17 @@ class InstallTest(unittest.TestCase): if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (fdroidserver.install.options, args) = parser.parse_args(['--verbose']) + fdroidserver.install.options = parser.parse_args(['--verbose']) fdroidserver.common.options = fdroidserver.install.options newSuite = unittest.TestSuite() diff --git a/tests/lint.TestCase b/tests/lint.TestCase index 5dd94d4b..5430eb7b 100755 --- a/tests/lint.TestCase +++ b/tests/lint.TestCase @@ -3,7 +3,6 @@ # http://www.drdobbs.com/testing/unit-testing-with-python/240165163 import logging -import optparse import os import ruamel.yaml import shutil @@ -527,15 +526,17 @@ class LintAntiFeaturesTest(unittest.TestCase): if __name__ == "__main__": - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (fdroidserver.lint.options, args) = parser.parse_args(['--verbose']) + fdroidserver.lint.options = parser.parse_args(['--verbose']) fdroidserver.common.options = fdroidserver.lint.options newSuite = unittest.TestSuite() diff --git a/tests/main.TestCase b/tests/main.TestCase index 3809fe17..deaf9dff 100755 --- a/tests/main.TestCase +++ b/tests/main.TestCase @@ -1,7 +1,6 @@ #!/usr/bin/env python3 import inspect -import optparse import os import sys import pkgutil @@ -265,15 +264,17 @@ class MainTest(unittest.TestCase): if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (common.options, args) = parser.parse_args(['--verbose']) + common.options = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(MainTest)) diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index c46d5bbf..c4c58882 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -3,7 +3,6 @@ import copy import io import logging -import optparse import os import random import ruamel.yaml @@ -2447,15 +2446,17 @@ class PostMetadataParseTest(unittest.TestCase): if __name__ == "__main__": - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) + fdroidserver.common.options = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(MetadataTest)) diff --git a/tests/net.TestCase b/tests/net.TestCase index 94b8ce84..59b299b8 100755 --- a/tests/net.TestCase +++ b/tests/net.TestCase @@ -2,7 +2,6 @@ import inspect import logging -import optparse import os import random import requests @@ -126,15 +125,17 @@ class NetTest(unittest.TestCase): if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (common.options, args) = parser.parse_args(['--verbose']) + common.options = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(NetTest)) diff --git a/tests/nightly.TestCase b/tests/nightly.TestCase index 9e505c7f..7cb1712d 100755 --- a/tests/nightly.TestCase +++ b/tests/nightly.TestCase @@ -2,7 +2,6 @@ import inspect import logging -import optparse import os import requests import shutil @@ -364,15 +363,17 @@ class NightlyTest(unittest.TestCase): if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (common.options, args) = parser.parse_args(['--verbose']) + common.options = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(NightlyTest)) diff --git a/tests/publish.TestCase b/tests/publish.TestCase index 80556744..00bbec0e 100755 --- a/tests/publish.TestCase +++ b/tests/publish.TestCase @@ -13,7 +13,6 @@ import inspect import json import logging -import optparse import os import shutil import sys @@ -413,15 +412,17 @@ class PublishTest(unittest.TestCase): if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (common.options, args) = parser.parse_args(['--verbose']) + common.options = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(PublishTest)) diff --git a/tests/rewritemeta.TestCase b/tests/rewritemeta.TestCase index 9d20550f..00e4f354 100755 --- a/tests/rewritemeta.TestCase +++ b/tests/rewritemeta.TestCase @@ -1,7 +1,6 @@ #!/usr/bin/env python3 import logging -import optparse import os import sys import unittest @@ -265,15 +264,17 @@ class RewriteMetaTest(unittest.TestCase): if __name__ == "__main__": - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (common.options, args) = parser.parse_args(['--verbose']) + common.options = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(RewriteMetaTest)) diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 83ce75b7..9069164e 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -3,7 +3,6 @@ import glob import inspect import logging -import optparse import os import re import shutil @@ -815,15 +814,17 @@ class Test_main(unittest.TestCase): if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) + fdroidserver.common.options = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() newSuite.addTests( diff --git a/tests/signatures.TestCase b/tests/signatures.TestCase index 4744613b..5d043a9f 100755 --- a/tests/signatures.TestCase +++ b/tests/signatures.TestCase @@ -1,7 +1,6 @@ #!/usr/bin/env python3 import inspect -import optparse import os import sys import unittest @@ -59,15 +58,17 @@ class SignaturesTest(unittest.TestCase): if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (common.options, args) = parser.parse_args(['--verbose']) + common.options = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(SignaturesTest)) diff --git a/tests/signindex.TestCase b/tests/signindex.TestCase index 28afa689..7931fbdc 100755 --- a/tests/signindex.TestCase +++ b/tests/signindex.TestCase @@ -3,7 +3,6 @@ import inspect import json import logging -import optparse import os import shutil import subprocess @@ -193,15 +192,17 @@ class SignindexTest(unittest.TestCase): if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (common.options, args) = parser.parse_args(['--verbose']) + common.options = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(SignindexTest)) diff --git a/tests/update.TestCase b/tests/update.TestCase index 0c692aa8..6af32bb2 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -9,7 +9,6 @@ import hashlib import inspect import json import logging -import optparse import os import random import shutil @@ -2271,15 +2270,17 @@ class TestParseFromPbxproj(unittest.TestCase): if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) + fdroidserver.common.options = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(UpdateTest)) diff --git a/tests/vcs.TestCase b/tests/vcs.TestCase index 2e46f926..99af14cc 100755 --- a/tests/vcs.TestCase +++ b/tests/vcs.TestCase @@ -4,7 +4,6 @@ import inspect import logging -import optparse import os import sys import unittest @@ -88,15 +87,17 @@ class VCSTest(unittest.TestCase): if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (fdroidserver.common.options, args) = parser.parse_args(['--verbose']) + fdroidserver.common.options = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(VCSTest)) diff --git a/tests/verify.TestCase b/tests/verify.TestCase index 774e24fa..cd8fbb6e 100755 --- a/tests/verify.TestCase +++ b/tests/verify.TestCase @@ -3,7 +3,6 @@ import inspect import json import logging -import optparse import os import shutil import sys @@ -94,15 +93,17 @@ class VerifyTest(unittest.TestCase): if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) - parser = optparse.OptionParser() - parser.add_option( + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Spew out even more information than normal", ) - (common.options, args) = parser.parse_args(['--verbose']) + common.options = parser.parse_args(['--verbose']) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(VerifyTest)) From 685efa23d43aedbc8b2d1dc7630abdc4f709e2e6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 6 May 2024 11:13:13 +0200 Subject: [PATCH 1504/2116] import: always load testcommon from localmodule Having this import before sys.path.insert() made it load testcommon from the Debian package. --- tests/import_subcommand.TestCase | 2 +- tests/lint.TestCase | 2 +- tests/main.TestCase | 2 +- tests/metadata.TestCase | 3 +-- tests/rewritemeta.TestCase | 3 +-- tests/update.TestCase | 2 +- 6 files changed, 6 insertions(+), 8 deletions(-) diff --git a/tests/import_subcommand.TestCase b/tests/import_subcommand.TestCase index 79222eab..1b3347ad 100755 --- a/tests/import_subcommand.TestCase +++ b/tests/import_subcommand.TestCase @@ -14,7 +14,6 @@ from unittest import mock from pathlib import Path import requests -from testcommon import TmpCwd, mkdtemp localmodule = Path(__file__).resolve().parent.parent print('localmodule: ' + str(localmodule)) @@ -25,6 +24,7 @@ import fdroidserver.common import fdroidserver.import_subcommand import fdroidserver.metadata from fdroidserver.exception import FDroidException +from testcommon import TmpCwd, mkdtemp class ImportTest(unittest.TestCase): diff --git a/tests/lint.TestCase b/tests/lint.TestCase index 5430eb7b..d9ac8de2 100755 --- a/tests/lint.TestCase +++ b/tests/lint.TestCase @@ -10,7 +10,6 @@ import sys import tempfile import unittest from pathlib import Path -from testcommon import mkdtemp localmodule = Path(__file__).resolve().parent.parent print('localmodule: ' + str(localmodule)) @@ -21,6 +20,7 @@ import fdroidserver.common import fdroidserver.lint import fdroidserver.metadata from fdroidserver.common import CATEGORIES_CONFIG_NAME +from testcommon import mkdtemp class LintTest(unittest.TestCase): diff --git a/tests/main.TestCase b/tests/main.TestCase index deaf9dff..9ce25a2b 100755 --- a/tests/main.TestCase +++ b/tests/main.TestCase @@ -8,7 +8,6 @@ import textwrap import unittest import tempfile from unittest import mock -from testcommon import TmpCwd, TmpPyPath localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') @@ -19,6 +18,7 @@ if localmodule not in sys.path: from fdroidserver import common import fdroidserver.__main__ +from testcommon import TmpCwd, TmpPyPath class MainTest(unittest.TestCase): diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index c4c58882..1a0a1bdc 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -15,8 +15,6 @@ from collections import OrderedDict from pathlib import Path from unittest import mock -from testcommon import TmpCwd, mkdtemp - localmodule = Path(__file__).resolve().parent.parent print('localmodule: ' + str(localmodule)) if localmodule not in sys.path: @@ -26,6 +24,7 @@ import fdroidserver from fdroidserver import metadata from fdroidserver.exception import MetaDataException from fdroidserver.common import DEFAULT_LOCALE +from testcommon import TmpCwd, mkdtemp def _get_mock_mf(s): diff --git a/tests/rewritemeta.TestCase b/tests/rewritemeta.TestCase index 00e4f354..f8388f88 100755 --- a/tests/rewritemeta.TestCase +++ b/tests/rewritemeta.TestCase @@ -8,14 +8,13 @@ import tempfile import textwrap from pathlib import Path -from testcommon import TmpCwd, mkdtemp - localmodule = Path(__file__).resolve().parent.parent print('localmodule: ' + str(localmodule)) if localmodule not in sys.path: sys.path.insert(0, str(localmodule)) from fdroidserver import common, metadata, rewritemeta +from testcommon import TmpCwd, mkdtemp class RewriteMetaTest(unittest.TestCase): diff --git a/tests/update.TestCase b/tests/update.TestCase index 6af32bb2..bc52981f 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -23,7 +23,6 @@ import textwrap from binascii import hexlify from datetime import datetime from pathlib import Path -from testcommon import TmpCwd, mkdtemp from unittest import mock try: @@ -61,6 +60,7 @@ import fdroidserver.metadata import fdroidserver.update from fdroidserver.common import CATEGORIES_CONFIG_NAME from fdroidserver.looseversion import LooseVersion +from testcommon import TmpCwd, mkdtemp DONATION_FIELDS = ('Donate', 'Liberapay', 'OpenCollective') From 18f3acc32e7d9d732d6186827ce3acb3d7b734cd Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 8 May 2024 16:26:46 +0200 Subject: [PATCH 1505/2116] split out options from read_config() There is no longer any reason for these to be intertwined. This deliberately avoids touching some files as much as possible because they are super tangled and due to be replaced. Those files are: * fdroidserver/build.py * fdroidserver/update.py # Conflicts: # tests/testcommon.py # Conflicts: # fdroidserver/btlog.py # fdroidserver/import_subcommand.py --- examples/fdroid_clean_repos.py | 5 +- .../fdroid_export_keystore_to_nitrokey.py | 4 +- examples/fdroid_exportkeystore.py | 4 +- examples/fdroid_extract_repo_pubkey.py | 4 +- examples/fdroid_fetchsrclibs.py | 5 +- examples/fdroid_nitrokeyimport.py | 4 +- fdroidserver/btlog.py | 8 +- fdroidserver/build.py | 4 +- fdroidserver/checkupdates.py | 15 ++- fdroidserver/common.py | 42 ++++++-- fdroidserver/deploy.py | 21 ++-- fdroidserver/gpgsign.py | 7 +- fdroidserver/import_subcommand.py | 15 +-- fdroidserver/init.py | 7 +- fdroidserver/install.py | 7 +- fdroidserver/lint.py | 9 +- fdroidserver/mirror.py | 28 +++--- fdroidserver/nightly.py | 5 +- fdroidserver/publish.py | 7 +- fdroidserver/readmeta.py | 4 +- fdroidserver/rewritemeta.py | 7 +- fdroidserver/scanner.py | 15 ++- fdroidserver/signatures.py | 7 +- fdroidserver/signindex.py | 7 +- fdroidserver/update.py | 4 +- fdroidserver/verify.py | 7 +- tests/build.TestCase | 6 +- tests/checkupdates.TestCase | 35 ++----- tests/common.TestCase | 98 ++++++++++++------- tests/deploy.TestCase | 40 ++++---- tests/dump_internal_metadata_format.py | 4 +- tests/exception.TestCase | 4 +- tests/gpgsign.TestCase | 4 +- tests/import_subcommand.TestCase | 10 +- tests/index.TestCase | 9 +- tests/init.TestCase | 8 +- tests/install.TestCase | 4 +- tests/key-tricks.py | 2 +- tests/lint.TestCase | 5 +- tests/main.TestCase | 2 +- tests/metadata.TestCase | 4 +- tests/net.TestCase | 2 +- tests/nightly.TestCase | 2 +- tests/parse-fdroiddata-mirror-config.py | 13 +++ tests/publish.TestCase | 10 +- tests/rewritemeta.TestCase | 2 +- tests/scanner.TestCase | 32 +++--- tests/signatures.TestCase | 4 +- tests/signindex.TestCase | 4 +- tests/testcommon.py | 14 +++ tests/update.TestCase | 6 +- tests/vcs.TestCase | 4 +- tests/verify.TestCase | 2 +- 53 files changed, 317 insertions(+), 265 deletions(-) create mode 100644 tests/parse-fdroiddata-mirror-config.py diff --git a/examples/fdroid_clean_repos.py b/examples/fdroid_clean_repos.py index aa535fc4..aaedf98a 100644 --- a/examples/fdroid_clean_repos.py +++ b/examples/fdroid_clean_repos.py @@ -23,12 +23,11 @@ def main(): help=_("applicationId with optional versionCode in the form APPID[:VERCODE]"), ) metadata.add_metadata_arguments(parser) - options = parser.parse_args() - common.options = options + options = common.parse_args(parser) pkgs = common.read_pkg_args(options.appid, True) allapps = metadata.read_metadata(pkgs) apps = common.read_app_args(options.appid, allapps, True) - common.read_config(options) + common.read_config() for appid, app in apps.items(): if "Builds" in app and len(app["Builds"]) > 0: diff --git a/examples/fdroid_export_keystore_to_nitrokey.py b/examples/fdroid_export_keystore_to_nitrokey.py index 92de2b30..8fa81ffe 100644 --- a/examples/fdroid_export_keystore_to_nitrokey.py +++ b/examples/fdroid_export_keystore_to_nitrokey.py @@ -25,8 +25,8 @@ def main(): global config parser = ArgumentParser() common.setup_global_opts(parser) - options = parser.parse_args() - config = common.read_config(options) + common.parse_args(parser) + config = common.read_config() destkeystore = config['keystore'].replace('.jks', '.p12').replace('/', '_') exportkeystore = config['keystore'].replace('.jks', '.pem').replace('/', '_') if os.path.exists(destkeystore) or os.path.exists(exportkeystore): diff --git a/examples/fdroid_exportkeystore.py b/examples/fdroid_exportkeystore.py index 9e54e397..435874a5 100644 --- a/examples/fdroid_exportkeystore.py +++ b/examples/fdroid_exportkeystore.py @@ -14,8 +14,8 @@ fdroid_summary = 'export the keystore in standard PEM format' def main(): parser = ArgumentParser() common.setup_global_opts(parser) - options = parser.parse_args() - config = common.read_config(options) + common.parse_args(parser) + config = common.read_config() env_vars = {'LC_ALL': 'C.UTF-8', 'FDROID_KEY_STORE_PASS': config['keystorepass'], 'FDROID_KEY_PASS': config['keypass']} diff --git a/examples/fdroid_extract_repo_pubkey.py b/examples/fdroid_extract_repo_pubkey.py index de13d267..f3c51767 100644 --- a/examples/fdroid_extract_repo_pubkey.py +++ b/examples/fdroid_extract_repo_pubkey.py @@ -12,8 +12,8 @@ fdroid_summary = 'export the keystore in standard PEM format' def main(): parser = ArgumentParser() common.setup_global_opts(parser) - options = parser.parse_args() - common.config = common.read_config(options) + common.parse_args(parser) + common.read_config() pubkey, repo_pubkey_fingerprint = index.extract_pubkey() print('repo_pubkey = "%s"' % pubkey.decode()) diff --git a/examples/fdroid_fetchsrclibs.py b/examples/fdroid_fetchsrclibs.py index 978baacf..299e802b 100644 --- a/examples/fdroid_fetchsrclibs.py +++ b/examples/fdroid_fetchsrclibs.py @@ -18,12 +18,11 @@ def main(): common.setup_global_opts(parser) parser.add_argument("appid", nargs='*', help=_("applicationId with optional versionCode in the form APPID[:VERCODE]")) metadata.add_metadata_arguments(parser) - options = parser.parse_args() - common.options = options + options = common.parse_args(parser) pkgs = common.read_pkg_args(options.appid, True) allapps = metadata.read_metadata(pkgs) apps = common.read_app_args(options.appid, allapps, True) - common.read_config(options) + common.read_config() srclib_dir = os.path.join('build', 'srclib') os.makedirs(srclib_dir, exist_ok=True) srclibpaths = [] diff --git a/examples/fdroid_nitrokeyimport.py b/examples/fdroid_nitrokeyimport.py index 44ec299c..9b458103 100644 --- a/examples/fdroid_nitrokeyimport.py +++ b/examples/fdroid_nitrokeyimport.py @@ -11,8 +11,8 @@ fdroid_summary = 'import the local keystore into a SmartCard HSM' def main(): parser = ArgumentParser() common.setup_global_opts(parser) - options = parser.parse_args() - config = common.read_config(options) + common.parse_args(parser) + config = common.read_config() env_vars = { 'LC_ALL': 'C.UTF-8', 'FDROID_KEY_STORE_PASS': config['keystorepass'], diff --git a/fdroidserver/btlog.py b/fdroidserver/btlog.py index 3154b3de..df889396 100755 --- a/fdroidserver/btlog.py +++ b/fdroidserver/btlog.py @@ -47,9 +47,6 @@ from . import deploy from .exception import FDroidException -options = None - - def make_binary_transparency_log( repodirs: collections.abc.Iterable, btrepo: str = 'binary_transparency', @@ -175,9 +172,8 @@ def main(): ------ :exc:`~fdroidserver.exception.FDroidException` If the specified or default Git repository does not exist. - """ - global options + """ parser = ArgumentParser() common.setup_global_opts(parser) parser.add_argument( @@ -196,7 +192,7 @@ def main(): default=None, help=_("Push the log to this git remote repository"), ) - options = parser.parse_args() + options = common.parse_args(parser) if options.verbose: logging.getLogger("requests").setLevel(logging.INFO) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 02e52315..a1fc2ff3 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -1014,7 +1014,7 @@ def parse_commandline(): parser.add_argument("-w", "--wiki", default=False, action="store_true", help=argparse.SUPPRESS) metadata.add_metadata_arguments(parser) - options = parser.parse_args() + options = common.parse_args(parser) metadata.warnings_action = options.W # Force --stop with --on-server to get correct exit code @@ -1076,7 +1076,7 @@ def main(): if not options.appid and not options.all: parser.error("option %s: If you really want to build all the apps, use --all" % "all") - config = common.read_config(opts=options) + config = common.read_config() if config['build_server_always']: options.server = True diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 07a4d668..358a6e70 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -506,7 +506,7 @@ def operate_vercode(operation: str, vercode: int) -> int: return vercode -def checkupdates_app(app: metadata.App) -> None: +def checkupdates_app(app: metadata.App, auto: bool, commit: bool = False) -> None: """Check for new versions and updated name of a single app. Also write back changes to the metadata file and create a Git commit if @@ -582,7 +582,7 @@ def checkupdates_app(app: metadata.App) -> None: logging.info('...updating to version %s' % ver) commitmsg = 'Update CurrentVersion of %s to %s' % (name, ver) - if options.auto: + if auto: mode = app.AutoUpdateMode if not app.CurrentVersionCode: raise MetaDataException( @@ -665,7 +665,7 @@ def checkupdates_app(app: metadata.App) -> None: if commitmsg: metadata.write_metadata(app.metadatapath, app) - if options.commit: + if commit: logging.info("Commiting update for " + app.metadatapath) gitcmd = ["git", "commit", "-m", commitmsg] if 'auto_author' in config: @@ -695,7 +695,6 @@ def status_update_json(processed: list, failed: dict) -> None: config = None -options = None start_timestamp = time.gmtime() @@ -705,7 +704,7 @@ def main(): The behaviour of this function is influenced by the configuration file as well as command line parameters. """ - global config, options + global config # Parse command line... parser = ArgumentParser() @@ -720,10 +719,10 @@ def main(): parser.add_argument("--allow-dirty", action="store_true", default=False, help=_("Run on git repo that has uncommitted changes")) metadata.add_metadata_arguments(parser) - options = parser.parse_args() + options = common.parse_args(parser) metadata.warnings_action = options.W - config = common.read_config(options) + config = common.read_config() if not options.allow_dirty: status = subprocess.check_output(['git', 'status', '--porcelain']) @@ -749,7 +748,7 @@ def main(): logging.info(msg) try: - checkupdates_app(app) + checkupdates_app(app, options.auto, options.commit) processed.append(appid) except Exception as e: msg = _("...checkupdate failed for {appid} : {error}").format(appid=appid, error=e) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 4074d2aa..5a546386 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -191,6 +191,34 @@ default_config = { } +def get_options(): + """Return options as set up by parse_args(). + + This provides an easy way to get the global instance without + having to think about very confusing import and submodule + visibility. The code should be probably refactored so it does not + need this. If each individual option value was always passed to + functions as args, for example. + + https://docs.python.org/3/reference/import.html#submodules + + """ + return fdroidserver.common.options + + +def parse_args(parser): + """Call parser.parse_args(), store result in module-level variable and return it. + + This is needed to set up the copy of the options instance in the + fdroidserver.common module. A subcommand only needs to call this + if it uses functions from fdroidserver.common that expect the + "options" variable to be initialized. + + """ + fdroidserver.common.options = parser.parse_args() + return fdroidserver.common.options + + def setup_global_opts(parser): try: # the buildserver VM might not have PIL installed from PIL import PngImagePlugin @@ -373,7 +401,7 @@ def fill_config_defaults(thisconfig): thisconfig['gradle_version_dir'] = str(Path(thisconfig['cachedir']) / 'gradle') -def get_config(opts=None): +def get_config(): """Get the initalized, singleton config instance. config and options are intertwined in read_config(), so they have @@ -395,18 +423,16 @@ def get_config(opts=None): instance in fdroidserver.common. """ - global config, options + global config if config is not None: return config - read_config(opts=opts) + read_config() # make sure these values are available in common.py even if they didn't # declare global in a scope common.config = config - if opts is not None: - common.options = opts return config @@ -439,7 +465,7 @@ def config_type_check(path, data): ) -def read_config(opts=None): +def read_config(): """Read the repository config. The config is read from config_file, which is in the current @@ -458,13 +484,11 @@ def read_config(opts=None): in git, it makes sense to use a globally standard encoding. """ - global config, options + global config if config is not None: return config - options = opts - config = {} config_file = 'config.yml' old_config_file = 'config.py' diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 1e28961d..b4b4cd95 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -36,7 +36,6 @@ from . import index from .exception import FDroidException config = None -options = None start_timestamp = time.gmtime() GIT_BRANCH = 'master' @@ -148,9 +147,10 @@ def update_awsbucket_s3cmd(repo_section): raise FDroidException() s3cmd_sync = s3cmd + ['sync', '--acl-public'] - if options.verbose: + options = common.get_options() + if options and options.verbose: s3cmd_sync += ['--verbose'] - if options.quiet: + if options and options.quiet: s3cmd_sync += ['--quiet'] s3url = s3bucketurl + '/fdroid/' @@ -312,6 +312,7 @@ def update_serverwebroot(serverwebroot, repo_section): _('rsync is missing or broken: {error}').format(error=e) ) from e rsyncargs = ['rsync', '--archive', '--delete-after', '--safe-links'] + options = common.get_options() if not options or not options.no_checksum: rsyncargs.append('--checksum') if options and options.verbose: @@ -387,7 +388,7 @@ def sync_from_localcopy(repo_section, local_copy_dir): # trailing slashes have a meaning in rsync which is not needed here, so # make sure both paths have exactly one trailing slash common.local_rsync( - options, + common.get_options(), os.path.join(local_copy_dir, repo_section).rstrip('/') + '/', repo_section.rstrip('/') + '/', ) @@ -407,7 +408,7 @@ def update_localcopy(repo_section, local_copy_dir): """ # local_copy_dir is guaranteed to have a trailing slash in main() below - common.local_rsync(options, repo_section, local_copy_dir) + common.local_rsync(common.get_options(), repo_section, local_copy_dir) offline_copy = os.path.join(os.getcwd(), BINARY_TRANSPARENCY_DIR) if os.path.isdir(os.path.join(offline_copy, '.git')): @@ -446,6 +447,8 @@ def update_servergitmirrors(servergitmirrors, repo_section): ) return + options = common.get_options() + # right now we support only 'repo' git-mirroring if repo_section == 'repo': git_mirror_path = 'git-mirror' @@ -595,7 +598,7 @@ def upload_to_android_observatory(repo_section): requests # stop unused import warning - if options.verbose: + if common.get_options().verbose: logging.getLogger("requests").setLevel(logging.INFO) logging.getLogger("urllib3").setLevel(logging.INFO) else: @@ -849,7 +852,7 @@ def push_binary_transparency(git_repo_path, git_remote): def main(): - global config, options + global config parser = ArgumentParser() common.setup_global_opts(parser) @@ -876,8 +879,8 @@ def main(): default=False, help=_("If a git mirror gets to big, allow the archive to be deleted"), ) - options = parser.parse_args() - config = common.read_config(options) + options = common.parse_args(parser) + config = common.read_config() if config.get('nonstandardwebroot') is True: standardwebroot = False diff --git a/fdroidserver/gpgsign.py b/fdroidserver/gpgsign.py index da845d4f..4ba6ebd5 100644 --- a/fdroidserver/gpgsign.py +++ b/fdroidserver/gpgsign.py @@ -28,7 +28,6 @@ from .common import FDroidPopen from .exception import FDroidException config = None -options = None start_timestamp = time.gmtime() @@ -42,14 +41,14 @@ def status_update_json(signed): def main(): - global config, options + global config # Parse command line... parser = ArgumentParser() common.setup_global_opts(parser) - options = parser.parse_args() + common.parse_args(parser) - config = common.read_config(options) + config = common.read_config() repodirs = ['repo'] if config['archive_older'] != 0: diff --git a/fdroidserver/import_subcommand.py b/fdroidserver/import_subcommand.py index d1105914..3902250e 100644 --- a/fdroidserver/import_subcommand.py +++ b/fdroidserver/import_subcommand.py @@ -45,7 +45,6 @@ from .exception import FDroidException config = None -options = None def handle_retree_error_on_windows(function, path, excinfo): @@ -55,7 +54,7 @@ def handle_retree_error_on_windows(function, path, excinfo): function(path) -def clone_to_tmp_dir(app: metadata.App) -> Path: +def clone_to_tmp_dir(app: metadata.App, rev=None) -> Path: """Clone the source repository of an app to a temporary directory for further processing. Parameters @@ -67,6 +66,7 @@ def clone_to_tmp_dir(app: metadata.App) -> Path: ------- tmp_dir The (temporary) directory the apps source has been cloned into. + """ tmp_dir = Path('tmp') tmp_dir.mkdir(exist_ok=True) @@ -76,7 +76,7 @@ def clone_to_tmp_dir(app: metadata.App) -> Path: if tmp_dir.exists(): shutil.rmtree(str(tmp_dir), onerror=handle_retree_error_on_windows) vcs = common.getvcs(app.RepoType, app.Repo, tmp_dir) - vcs.gotorevision(options.rev) + vcs.gotorevision(rev) return tmp_dir @@ -236,8 +236,9 @@ def main(): the current directory is not a Git repository, no application ID could be found, no Gradle project could be found or there is already metadata for the found application ID. + """ - global config, options + global config # Parse command line... parser = ArgumentParser() @@ -255,10 +256,10 @@ def main(): parser.add_argument("--rev", default=None, help=_("Allows a different revision (or git branch) to be specified for the initial import")) metadata.add_metadata_arguments(parser) - options = parser.parse_args() + options = common.parse_args(parser) metadata.warnings_action = options.W - config = common.read_config(options) + config = common.read_config() apps = metadata.read_metadata() app = None @@ -289,7 +290,7 @@ def main(): write_local_file = True elif options.url: app = get_app_from_url(options.url) - tmp_importer_dir = clone_to_tmp_dir(app) + tmp_importer_dir = clone_to_tmp_dir(app, options.rev) git_repo = git.Repo(tmp_importer_dir) if not options.omit_disable: diff --git a/fdroidserver/init.py b/fdroidserver/init.py index ab5a3e48..e27a7092 100644 --- a/fdroidserver/init.py +++ b/fdroidserver/init.py @@ -32,7 +32,6 @@ from . import common from .exception import FDroidException config = {} -options = None def disable_in_config(key, value): @@ -49,7 +48,7 @@ def disable_in_config(key, value): def main(): - global options, config + global config # Parse command line... parser = ArgumentParser() @@ -81,7 +80,7 @@ def main(): default=False, help=_("Do not prompt for Android SDK path, just fail"), ) - options = parser.parse_args() + options = common.parse_args(parser) common.set_console_logging(options.verbose) @@ -171,7 +170,7 @@ def main(): raise FDroidException('Repository already exists.') # now that we have a local config.yml, read configuration... - config = common.read_config(options) + config = common.read_config() # the NDK is optional and there may be multiple versions of it, so it's # left for the user to configure diff --git a/fdroidserver/install.py b/fdroidserver/install.py index 9ef82da0..b9370ee5 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -28,7 +28,6 @@ from . import common from .common import SdkToolsPopen from .exception import FDroidException -options = None config = None @@ -44,7 +43,7 @@ def devices(): def main(): - global options, config + global config # Parse command line... parser = ArgumentParser( @@ -63,7 +62,7 @@ def main(): default=False, help=_("Install all signed applications available"), ) - options = parser.parse_args() + options = common.parse_args(parser) common.set_console_logging(options.verbose) @@ -73,7 +72,7 @@ def main(): % "all" ) - config = common.read_config(options) + config = common.read_config() output_dir = 'repo' if not os.path.isdir(output_dir): diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index d7a9783d..1ae42852 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -31,7 +31,6 @@ from . import metadata from . import rewritemeta config = None -options = None def enforce_https(domain): @@ -503,7 +502,7 @@ def check_files_dir(app): def check_format(app): - if options.format and not rewritemeta.proper_format(app): + if common.options.format and not rewritemeta.proper_format(app): yield _("Run rewritemeta to fix formatting") @@ -787,7 +786,7 @@ def lint_config(arg): def main(): - global config, options + global config # Parse command line... parser = ArgumentParser() @@ -812,10 +811,10 @@ def main(): "appid", nargs='*', help=_("application ID of file to operate on") ) metadata.add_metadata_arguments(parser) - options = parser.parse_args() + options = common.parse_args(parser) metadata.warnings_action = options.W - config = common.read_config(options) + config = common.read_config() load_antiFeatures_config() load_categories_config() diff --git a/fdroidserver/mirror.py b/fdroidserver/mirror.py index 89e5ed66..1483ddf1 100644 --- a/fdroidserver/mirror.py +++ b/fdroidserver/mirror.py @@ -15,11 +15,9 @@ from . import common from . import index from . import update -options = None - -def _run_wget(path, urls): - if options.verbose: +def _run_wget(path, urls, verbose=False): + if verbose: verbose = '--verbose' else: verbose = '--no-verbose' @@ -48,8 +46,6 @@ def _run_wget(path, urls): def main(): - global options - parser = ArgumentParser() common.setup_global_opts(parser) parser.add_argument( @@ -93,7 +89,7 @@ def main(): parser.add_argument( "--output-dir", default=None, help=_("The directory to write the mirror to") ) - options = parser.parse_args() + options = common.parse_args(parser) common.set_console_logging(options.verbose) @@ -119,7 +115,7 @@ def main(): ) if fingerprint: - config = common.read_config(options) + config = common.read_config() if not ('jarsigner' in config or 'apksigner' in config): logging.error( _('Java JDK not found! Install in standard location or set java_paths!') @@ -229,7 +225,7 @@ def main(): _append_to_url_path(section, f[:-4] + '.log.gz') ) - _run_wget(sectiondir, urls) + _run_wget(sectiondir, urls, options.verbose) for app in data['apps']: localized = app.get('localized') @@ -242,7 +238,7 @@ def main(): if f: filepath_tuple = components + (f,) urls.append(_append_to_url_path(*filepath_tuple)) - _run_wget(os.path.join(basedir, *components), urls) + _run_wget(os.path.join(basedir, *components), urls, options.verbose) for k in update.SCREENSHOT_DIRS: urls = [] filelist = d.get(k) @@ -251,7 +247,11 @@ def main(): for f in filelist: filepath_tuple = components + (f,) urls.append(_append_to_url_path(*filepath_tuple)) - _run_wget(os.path.join(basedir, *components), urls) + _run_wget( + os.path.join(basedir, *components), + urls, + options.verbose, + ) urls = dict() for app in data['apps']: @@ -269,7 +269,11 @@ def main(): for icondir in icondirs: if icondir in urls: - _run_wget(os.path.join(basedir, section, icondir), urls[icondir]) + _run_wget( + os.path.join(basedir, section, icondir), + urls[icondir], + options.verbose, + ) if __name__ == "__main__": diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 9471a26e..074a9eee 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -259,8 +259,7 @@ def main(): help=_("Set maximum releases in repo before older ones are archived"), ) # TODO add --with-btlog - options = parser.parse_args() - common.options = options + options = common.parse_args(parser) # force a tighter umask since this writes private key material umask = os.umask(0o077) @@ -428,7 +427,7 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, with open('config.yml', 'w') as fp: yaml.dump(config, fp, default_flow_style=False) os.chmod('config.yml', 0o600) - config = common.read_config(options) + config = common.read_config() common.assert_config_keystore(config) for root, dirs, files in os.walk(cibase): diff --git a/fdroidserver/publish.py b/fdroidserver/publish.py index b87578ad..0b499717 100644 --- a/fdroidserver/publish.py +++ b/fdroidserver/publish.py @@ -49,7 +49,6 @@ from .common import FDroidPopen from .exception import BuildException, FDroidException config = None -options = None start_timestamp = time.gmtime() @@ -269,7 +268,7 @@ def create_key_if_not_existing(keyalias): def main(): - global config, options + global config # Parse command line... parser = ArgumentParser( @@ -289,10 +288,10 @@ def main(): help=_("application ID with optional versionCode in the form APPID[:VERCODE]"), ) metadata.add_metadata_arguments(parser) - options = parser.parse_args() + options = common.parse_args(parser) metadata.warnings_action = options.W - config = common.read_config(options) + config = common.read_config() if not ('jarsigner' in config and 'keytool' in config): logging.critical( diff --git a/fdroidserver/readmeta.py b/fdroidserver/readmeta.py index e129f0c8..b8049a9f 100644 --- a/fdroidserver/readmeta.py +++ b/fdroidserver/readmeta.py @@ -20,8 +20,6 @@ from argparse import ArgumentParser from . import common from . import metadata -options = None - def main(): parser = ArgumentParser() @@ -29,7 +27,7 @@ def main(): metadata.add_metadata_arguments(parser) options = parser.parse_args() metadata.warnings_action = options.W - common.read_config(None) + common.read_config() metadata.read_metadata() diff --git a/fdroidserver/rewritemeta.py b/fdroidserver/rewritemeta.py index 5a1a6ea0..7f003ac3 100644 --- a/fdroidserver/rewritemeta.py +++ b/fdroidserver/rewritemeta.py @@ -29,7 +29,6 @@ from . import common from . import metadata config = None -options = None def proper_format(app): @@ -62,7 +61,7 @@ def remove_blank_flags_from_builds(builds): def main(): - global config, options + global config parser = ArgumentParser() common.setup_global_opts(parser) @@ -77,10 +76,10 @@ def main(): "appid", nargs='*', help=_("application ID of file to operate on") ) metadata.add_metadata_arguments(parser) - options = parser.parse_args() + options = common.parse_args(parser) metadata.warnings_action = options.W - config = common.read_config(options) + config = common.read_config() # Get all apps... allapps = metadata.read_metadata(options.appid) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 8c0a5d06..c17e7c29 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -40,8 +40,6 @@ from . import metadata from .exception import BuildException, VCSException, ConfigurationException from . import scanner -options = None - @dataclass class MessageStore: @@ -332,8 +330,9 @@ class ScannerTool: self.scanner_data_lookup() - config = common.get_config() - if (options and options.refresh_scanner) or config.get('refresh_scanner'): + options = common.get_options() + options_refresh_scanner = options and options.refresh_scanner + if options_refresh_scanner or common.get_config().get('refresh_scanner'): self.refresh() self.load() @@ -589,6 +588,7 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): ------- 0 if the problem was ignored/deleted/is only a warning, 1 otherwise """ + options = common.get_options() if toignore(path_in_build_dir): return ignoreproblem(what, path_in_build_dir, json_per_build) if todelete(path_in_build_dir): @@ -776,9 +776,6 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): def main(): - global options - - # Parse command line... parser = ArgumentParser( usage="%(prog)s [options] [(APPID[:VERCODE] | path/to.apk) ...]" ) @@ -793,7 +790,7 @@ def main(): parser.add_argument("-e", "--exit-code", action="store_true", default=False, help=_("Exit with a non-zero code if problems were found")) metadata.add_metadata_arguments(parser) - options = parser.parse_args() + options = common.parse_args(parser) metadata.warnings_action = options.W json_output = dict() @@ -804,7 +801,7 @@ def main(): logging.getLogger().setLevel(logging.ERROR) # initialize/load configuration values - common.get_config(opts=options) + common.get_config() probcount = 0 diff --git a/fdroidserver/signatures.py b/fdroidserver/signatures.py index b19bed8b..4f683344 100644 --- a/fdroidserver/signatures.py +++ b/fdroidserver/signatures.py @@ -103,11 +103,8 @@ def main(): "APK", nargs='*', help=_("signed APK, either a file-path or HTTPS URL.") ) parser.add_argument("--no-check-https", action="store_true", default=False) - options = parser.parse_args() - + options = common.parse_args(parser) common.set_console_logging(options.verbose) - - # Read config.py... - common.read_config(options) + common.read_config() extract(options) diff --git a/fdroidserver/signindex.py b/fdroidserver/signindex.py index ea34fd6c..4ca2d569 100644 --- a/fdroidserver/signindex.py +++ b/fdroidserver/signindex.py @@ -29,7 +29,6 @@ from . import metadata from .exception import FDroidException config = None -options = None start_timestamp = time.gmtime() @@ -175,13 +174,13 @@ def status_update_json(signed): def main(): - global config, options + global config parser = ArgumentParser() common.setup_global_opts(parser) - options = parser.parse_args() + common.parse_args(parser) - config = common.read_config(options) + config = common.read_config() if 'jarsigner' not in config: raise FDroidException( diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 2ce07fa5..dac7b038 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -2574,10 +2574,10 @@ def main(): parser.add_argument("--allow-disabled-algorithms", action="store_true", default=False, help=_("Include APKs that are signed with disabled algorithms like MD5")) metadata.add_metadata_arguments(parser) - options = parser.parse_args() + options = common.parse_args(parser) metadata.warnings_action = options.W - config = common.read_config(options) + config = common.read_config() common.setup_status_output(start_timestamp) if not (('jarsigner' in config or 'apksigner' in config) diff --git a/fdroidserver/verify.py b/fdroidserver/verify.py index 765f23c9..41b46ada 100644 --- a/fdroidserver/verify.py +++ b/fdroidserver/verify.py @@ -30,7 +30,6 @@ from . import common from . import net from .exception import FDroidException -options = None config = None @@ -146,7 +145,7 @@ def write_json_report(url, remote_apk, unsigned_apk, compare_result): def main(): - global options, config + global config # Parse command line... parser = ArgumentParser( @@ -170,9 +169,9 @@ def main(): default=False, help=_("Output JSON report to file named after APK."), ) - options = parser.parse_args() + options = common.parse_args(parser) - config = common.read_config(options) + config = common.read_config() tmp_dir = 'tmp' if not os.path.isdir(tmp_dir): diff --git a/tests/build.TestCase b/tests/build.TestCase index 0228bf35..f6607634 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -28,7 +28,7 @@ import fdroidserver.common import fdroidserver.metadata import fdroidserver.scanner import fdroidserver.vmtools -from testcommon import mkdtemp +from testcommon import mkdtemp, parse_args_for_test class FakeProcess: @@ -561,7 +561,7 @@ class BuildTest(unittest.TestCase): os.chdir(self.testdir) os.mkdir("build") - config = fdroidserver.common.get_config() + config = fdroidserver.common.read_config() config['sdk_path'] = os.getenv('ANDROID_HOME') config['ndk_paths'] = {'r10d': os.getenv('ANDROID_NDK_HOME')} fdroidserver.common.config = config @@ -1113,7 +1113,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - fdroidserver.common.options = parser.parse_args(['--verbose']) + parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(BuildTest)) diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index 0ae895de..9ff7eb98 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -29,8 +29,6 @@ class CheckupdatesTest(unittest.TestCase): os.chdir(self.basedir) def test_autoupdatemode_no_suffix(self): - fdroidserver.checkupdates.options = mock.Mock() - fdroidserver.checkupdates.options.auto = 'bleh' fdroidserver.checkupdates.config = {} app = fdroidserver.metadata.App() @@ -51,7 +49,7 @@ class CheckupdatesTest(unittest.TestCase): ): with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): with mock.patch('subprocess.call', lambda cmd: 0): - fdroidserver.checkupdates.checkupdates_app(app) + fdroidserver.checkupdates.checkupdates_app(app, auto=True) build = app['Builds'][-1] self.assertEqual(build.versionName, '1.1.9') @@ -63,15 +61,13 @@ class CheckupdatesTest(unittest.TestCase): with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): with mock.patch('subprocess.call', lambda cmd: 0): with self.assertRaises(FDroidException): - fdroidserver.checkupdates.checkupdates_app(app) + fdroidserver.checkupdates.checkupdates_app(app, auto=True) build = app['Builds'][-1] self.assertEqual(build.versionName, '1.1.9') self.assertEqual(build.commit, '1.1.9') def test_autoupdatemode_suffix(self): - fdroidserver.checkupdates.options = mock.Mock() - fdroidserver.checkupdates.options.auto = 'bleh' fdroidserver.checkupdates.config = {} app = fdroidserver.metadata.App() @@ -92,15 +88,13 @@ class CheckupdatesTest(unittest.TestCase): ): with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): with mock.patch('subprocess.call', lambda cmd: 0): - fdroidserver.checkupdates.checkupdates_app(app) + fdroidserver.checkupdates.checkupdates_app(app, auto=True) build = app['Builds'][-1] self.assertEqual(build.versionName, '1.1.9.10109-fdroid') self.assertEqual(build.commit, 'v1.1.9_10109') def test_autoupdate_multi_variants(self): - fdroidserver.checkupdates.options = mock.Mock() - fdroidserver.checkupdates.options.auto = 'bleh' fdroidserver.checkupdates.config = {} app = fdroidserver.metadata.App() @@ -133,7 +127,7 @@ class CheckupdatesTest(unittest.TestCase): ): with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): with mock.patch('subprocess.call', lambda cmd: 0): - fdroidserver.checkupdates.checkupdates_app(app) + fdroidserver.checkupdates.checkupdates_app(app, auto=True) build = app['Builds'][-2] self.assertEqual(build.versionName, '1.1.9') @@ -149,8 +143,6 @@ class CheckupdatesTest(unittest.TestCase): self.assertEqual(app.CurrentVersionCode, 101093) def test_checkupdates_app_http(self): - fdroidserver.checkupdates.options = mock.Mock() - fdroidserver.checkupdates.options.auto = 'bleh' fdroidserver.checkupdates.config = {} app = fdroidserver.metadata.App() @@ -164,7 +156,7 @@ class CheckupdatesTest(unittest.TestCase): 'fdroidserver.checkupdates.check_http', lambda app: (None, 'bla') ): with self.assertRaises(FDroidException): - fdroidserver.checkupdates.checkupdates_app(app) + fdroidserver.checkupdates.checkupdates_app(app, auto=True) with mock.patch( 'fdroidserver.checkupdates.check_http', lambda app: ('1.1.9', 10109) @@ -173,12 +165,10 @@ class CheckupdatesTest(unittest.TestCase): 'fdroidserver.metadata.write_metadata', mock.Mock() ) as wrmock: with mock.patch('subprocess.call', lambda cmd: 0): - fdroidserver.checkupdates.checkupdates_app(app) + fdroidserver.checkupdates.checkupdates_app(app, auto=True) wrmock.assert_called_with(app.metadatapath, app) def test_checkupdates_app_tags(self): - fdroidserver.checkupdates.options = mock.Mock() - fdroidserver.checkupdates.options.auto = 'bleh' fdroidserver.checkupdates.config = {} app = fdroidserver.metadata.App() @@ -199,7 +189,7 @@ class CheckupdatesTest(unittest.TestCase): lambda app, pattern: (None, 'bla', None), ): with self.assertRaises(FDroidException): - fdroidserver.checkupdates.checkupdates_app(app) + fdroidserver.checkupdates.checkupdates_app(app, auto=True) with mock.patch( 'fdroidserver.checkupdates.check_tags', @@ -207,15 +197,13 @@ class CheckupdatesTest(unittest.TestCase): ): with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): with mock.patch('subprocess.call', lambda cmd: 0): - fdroidserver.checkupdates.checkupdates_app(app) + fdroidserver.checkupdates.checkupdates_app(app, auto=True) build = app['Builds'][-1] self.assertEqual(build.versionName, '1.1.9') self.assertEqual(build.commit, 'v1.1.9') def test_check_http(self): - fdroidserver.checkupdates.options = mock.Mock() - app = fdroidserver.metadata.App() app.id = 'loop.starts.shooting' app.metadatapath = 'metadata/' + app.id + '.yml' @@ -242,8 +230,6 @@ class CheckupdatesTest(unittest.TestCase): fdroidserver.checkupdates.check_http(app) def test_check_http_ignore(self): - fdroidserver.checkupdates.options = mock.Mock() - app = fdroidserver.metadata.App() app.id = 'loop.starts.shooting' app.metadatapath = 'metadata/' + app.id + '.yml' @@ -259,8 +245,6 @@ class CheckupdatesTest(unittest.TestCase): self.assertEqual(vername, None) def test_check_tags_data(self): - fdroidserver.checkupdates.options = mock.Mock() - app = fdroidserver.metadata.App() app.id = 'loop.starts.shooting' app.metadatapath = 'metadata/' + app.id + '.yml' @@ -336,6 +320,7 @@ class CheckupdatesTest(unittest.TestCase): if __name__ == "__main__": import argparse + from testcommon import parse_args_for_test parser = argparse.ArgumentParser() parser.add_argument( @@ -345,7 +330,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - fdroidserver.common.options = parser.parse_args(['--verbose']) + parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(CheckupdatesTest)) diff --git a/tests/common.TestCase b/tests/common.TestCase index b3e32100..5d3b5cdb 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -38,7 +38,7 @@ import fdroidserver.index import fdroidserver.signindex import fdroidserver.common import fdroidserver.metadata -from testcommon import TmpCwd, mkdtemp +from testcommon import TmpCwd, mkdtemp, parse_args_for_test from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME from fdroidserver.exception import FDroidException, VCSException,\ MetaDataException, VerificationException @@ -491,7 +491,7 @@ class CommonTest(unittest.TestCase): def test_signjar(self): _mock_common_module_options_instance() - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') fdroidserver.common.config = config fdroidserver.signindex.config = config @@ -512,7 +512,7 @@ class CommonTest(unittest.TestCase): def test_verify_apk_signature(self): _mock_common_module_options_instance() - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() fdroidserver.common.config = config self.assertTrue(fdroidserver.common.verify_apk_signature('bad-unicode-πÇÇ现代通用字-български-عربي1.apk')) @@ -535,7 +535,7 @@ class CommonTest(unittest.TestCase): def test_verify_old_apk_signature(self): _mock_common_module_options_instance() - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') fdroidserver.common.config = config @@ -556,7 +556,7 @@ class CommonTest(unittest.TestCase): def test_verify_jar_signature(self): """Sign entry.jar and make sure it validates""" - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') config['keystore'] = os.path.join(self.basedir, 'keystore.jks') config['repo_keyalias'] = 'sova' @@ -574,7 +574,7 @@ class CommonTest(unittest.TestCase): def test_verify_jar_signature_fails(self): """Test verify_jar_signature fails on unsigned and deprecated algorithms""" - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') fdroidserver.common.config = config source_dir = os.path.join(self.basedir, 'signindex') @@ -584,7 +584,7 @@ class CommonTest(unittest.TestCase): fdroidserver.common.verify_jar_signature(testfile) def test_verify_deprecated_jar_signature(self): - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') fdroidserver.common.config = config source_dir = os.path.join(self.basedir, 'signindex') @@ -597,7 +597,7 @@ class CommonTest(unittest.TestCase): fdroidserver.common.verify_deprecated_jar_signature(testfile) def test_verify_apks(self): - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() fdroidserver.common.config = config _mock_common_module_options_instance() @@ -907,7 +907,7 @@ class CommonTest(unittest.TestCase): def test_sign_apk(self): _mock_common_module_options_instance() - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() if 'apksigner' not in config: self.skipTest('SKIPPING test_sign_apk, apksigner not installed!') @@ -978,7 +978,7 @@ class CommonTest(unittest.TestCase): @unittest.skipIf(os.getuid() == 0, 'This is meaningless when run as root') def test_sign_apk_fail(self): _mock_common_module_options_instance() - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() if 'apksigner' not in config: self.skipTest('SKIPPING test_sign_apk_fail, apksigner not installed!') @@ -1002,7 +1002,7 @@ class CommonTest(unittest.TestCase): def test_sign_apk_corrupt(self): _mock_common_module_options_instance() - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() if 'apksigner' not in config: self.skipTest('SKIPPING test_sign_apk_corrupt, apksigner not installed!') @@ -1029,7 +1029,7 @@ class CommonTest(unittest.TestCase): def test_resign_apk(self): """When using apksigner, it should resign signed APKs""" _mock_common_module_options_instance() - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() if 'apksigner' not in config: self.skipTest('SKIPPING test_resign_apk, apksigner not installed!') @@ -1935,7 +1935,7 @@ class CommonTest(unittest.TestCase): os.chdir(self.tmpdir) self.assertFalse(os.path.exists('config.yml')) self.assertFalse(os.path.exists('config.py')) - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() self.assertFalse(config.get('update_stats')) self.assertIsNotNone(config.get('char_limits')) @@ -1945,7 +1945,7 @@ class CommonTest(unittest.TestCase): open('config.yml', 'w').close() self.assertTrue(os.path.exists('config.yml')) self.assertFalse(os.path.exists('config.py')) - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() self.assertFalse(config.get('update_stats')) self.assertIsNotNone(config.get('char_limits')) @@ -1956,7 +1956,7 @@ class CommonTest(unittest.TestCase): fp.write('apksigner: yml') self.assertTrue(os.path.exists('config.yml')) self.assertFalse(os.path.exists('config.py')) - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() self.assertEqual('yml', config.get('apksigner')) def test_with_config_yml_utf8(self): @@ -1967,7 +1967,7 @@ class CommonTest(unittest.TestCase): fp.write('apksigner: ' + teststr) self.assertTrue(os.path.exists('config.yml')) self.assertFalse(os.path.exists('config.py')) - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() self.assertEqual(teststr, config.get('apksigner')) def test_with_config_yml_utf8_as_ascii(self): @@ -1978,7 +1978,7 @@ class CommonTest(unittest.TestCase): yaml.dump({'apksigner': teststr}, fp) self.assertTrue(os.path.exists('config.yml')) self.assertFalse(os.path.exists('config.py')) - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() self.assertEqual(teststr, config.get('apksigner')) def test_with_config_yml_with_env_var(self): @@ -1990,20 +1990,20 @@ class CommonTest(unittest.TestCase): fp.write("""keypass: {'env': 'SECRET'}""") self.assertTrue(os.path.exists('config.yml')) self.assertFalse(os.path.exists('config.py')) - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() self.assertEqual(os.getenv('SECRET', 'fail'), config.get('keypass')) def test_with_config_yml_is_dict(self): os.chdir(self.tmpdir) Path('config.yml').write_text('apksigner = /placeholder/path') with self.assertRaises(TypeError): - fdroidserver.common.read_config(fdroidserver.common.options) + fdroidserver.common.read_config() def test_with_config_yml_is_not_mixed_type(self): os.chdir(self.tmpdir) Path('config.yml').write_text('k: v\napksigner = /placeholder/path') with self.assertRaises(yaml.scanner.ScannerError): - fdroidserver.common.read_config(fdroidserver.common.options) + fdroidserver.common.read_config() def test_with_config_py(self): """Make sure it is still possible to use config.py alone.""" @@ -2012,7 +2012,7 @@ class CommonTest(unittest.TestCase): fp.write('apksigner = "py"') self.assertFalse(os.path.exists('config.yml')) self.assertTrue(os.path.exists('config.py')) - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() self.assertEqual("py", config.get('apksigner')) def test_config_perm_warning(self): @@ -2022,7 +2022,7 @@ class CommonTest(unittest.TestCase): fp.write('keystore: foo.jks') self.assertTrue(os.path.exists(fp.name)) os.chmod(fp.name, 0o666) - fdroidserver.common.read_config(fdroidserver.common.options) + fdroidserver.common.read_config() os.remove(fp.name) fdroidserver.common.config = None @@ -2030,7 +2030,7 @@ class CommonTest(unittest.TestCase): fp.write('keystore = "foo.jks"') self.assertTrue(os.path.exists(fp.name)) os.chmod(fp.name, 0o666) - fdroidserver.common.read_config(fdroidserver.common.options) + fdroidserver.common.read_config() def test_with_both_config_yml_py(self): """If config.yml and config.py are present, config.py should be ignored.""" @@ -2041,7 +2041,7 @@ class CommonTest(unittest.TestCase): fp.write('apksigner = "py"') self.assertTrue(os.path.exists('config.yml')) self.assertTrue(os.path.exists('config.py')) - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() self.assertEqual('yml', config.get('apksigner')) def test_config_repo_url(self): @@ -2092,14 +2092,14 @@ class CommonTest(unittest.TestCase): fp.write('apksigner: yml') self.assertTrue(os.path.exists(fp.name)) self.assertFalse(os.path.exists('config.py')) - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() self.assertFalse('keypass' in config) self.assertEqual('yml', config.get('apksigner')) fdroidserver.common.write_to_config(config, 'keypass', 'mysecretpassword') with open(fp.name) as fp: print(fp.read()) fdroidserver.common.config = None - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() self.assertEqual('mysecretpassword', config['keypass']) def test_write_to_config_py(self): @@ -2108,12 +2108,12 @@ class CommonTest(unittest.TestCase): fp.write('apksigner = "py"') self.assertTrue(os.path.exists(fp.name)) self.assertFalse(os.path.exists('config.yml')) - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() self.assertFalse('keypass' in config) self.assertEqual('py', config.get('apksigner')) fdroidserver.common.write_to_config(config, 'keypass', 'mysecretpassword') fdroidserver.common.config = None - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() self.assertEqual('mysecretpassword', config['keypass']) def test_config_dict_with_int_keys(self): @@ -2122,7 +2122,7 @@ class CommonTest(unittest.TestCase): fp.write('java_paths:\n 8: /usr/lib/jvm/java-8-openjdk\n') self.assertTrue(os.path.exists(fp.name)) self.assertFalse(os.path.exists('config.py')) - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() self.assertEqual('/usr/lib/jvm/java-8-openjdk', config.get('java_paths', {}).get('8')) @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) @@ -2200,7 +2200,7 @@ class CommonTest(unittest.TestCase): shutil.copy(os.path.join(self.basedir, '..', 'buildserver', 'config.buildserver.yml'), 'config.yml') self.assertFalse(os.path.exists('config.py')) - fdroidserver.common.read_config(fdroidserver.common.options) + fdroidserver.common.read_config() def test_setup_status_output(self): os.chdir(self.tmpdir) @@ -3267,11 +3267,43 @@ class ConfigOptionsScopeTest(unittest.TestCase): global options del options + def test_parse_args(self): + """Test that options is properly set up at the module-level and not global.""" + self.assertFalse('options' in globals()) + self.assertIsNone(fdroidserver.common.options) + parser = ArgumentParser() + fdroidserver.common.setup_global_opts(parser) + with mock.patch('sys.argv', ['$0']): + o = fdroidserver.common.parse_args(parser) + self.assertEqual(o, fdroidserver.common.options) + + # No function should set options as a global, and the global + # keyword does not create the variable. + global options + with self.assertRaises(NameError): + options + self.assertFalse('options' in globals()) + + def test_parse_args_without_args(self): + """Test that the parsing function works fine when there are no args.""" + parser = ArgumentParser() + fdroidserver.common.setup_global_opts(parser) + with mock.patch('sys.argv', ['$0']): + o = fdroidserver.common.parse_args(parser) + self.assertFalse(o.verbose) + + def test_parse_args_with_args(self): + parser = ArgumentParser() + fdroidserver.common.setup_global_opts(parser) + with mock.patch('sys.argv', ['$0', '-v']): + o = fdroidserver.common.parse_args(parser) + self.assertTrue(o.verbose) + def test_get_config(self): """Show how the module-level variables are initialized.""" self.assertTrue('config' not in vars() and 'config' not in globals()) self.assertIsNone(fdroidserver.common.config) - config = fdroidserver.common.get_config() + config = fdroidserver.common.read_config() self.assertIsNotNone(fdroidserver.common.config) self.assertEqual(dict, type(config)) self.assertEqual(config, fdroidserver.common.config) @@ -3281,7 +3313,7 @@ class ConfigOptionsScopeTest(unittest.TestCase): global config self.assertTrue('config' not in vars() and 'config' not in globals()) self.assertIsNone(fdroidserver.common.config) - c = fdroidserver.common.get_config() + c = fdroidserver.common.read_config() self.assertIsNotNone(fdroidserver.common.config) self.assertEqual(dict, type(c)) self.assertEqual(c, fdroidserver.common.config) @@ -3302,7 +3334,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - fdroidserver.common.options = parser.parse_args(['--verbose']) + parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(CommonTest)) diff --git a/tests/deploy.TestCase b/tests/deploy.TestCase index f2082dd3..4a2365c9 100755 --- a/tests/deploy.TestCase +++ b/tests/deploy.TestCase @@ -18,7 +18,7 @@ if localmodule not in sys.path: import fdroidserver.common import fdroidserver.deploy from fdroidserver.exception import FDroidException -from testcommon import TmpCwd, mkdtemp +from testcommon import TmpCwd, mkdtemp, parse_args_for_test class DeployTest(unittest.TestCase): @@ -114,11 +114,11 @@ class DeployTest(unittest.TestCase): self.maxDiff = None # setup parameters for this test run - fdroidserver.deploy.options = mock.Mock() - fdroidserver.deploy.options.no_checksum = True - fdroidserver.deploy.options.identity_file = None - fdroidserver.deploy.options.verbose = False - fdroidserver.deploy.options.quiet = True + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.no_checksum = True + fdroidserver.common.options.identity_file = None + fdroidserver.common.options.verbose = False + fdroidserver.common.options.quiet = True fdroidserver.deploy.config = {'make_current_version_link': True} url = "example.com:/var/www/fdroid" repo_section = 'repo' @@ -207,12 +207,12 @@ class DeployTest(unittest.TestCase): def test_update_serverwebroot_with_id_file(self): # setup parameters for this test run - fdroidserver.deploy.options = mock.Mock() - fdroidserver.deploy.options.identity_file = None - fdroidserver.deploy.options.no_checksum = True - fdroidserver.deploy.options.verbose = True - fdroidserver.deploy.options.quiet = False - fdroidserver.deploy.options.identity_file = None + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.identity_file = None + fdroidserver.common.options.no_checksum = True + fdroidserver.common.options.verbose = True + fdroidserver.common.options.quiet = False + fdroidserver.common.options.identity_file = None fdroidserver.deploy.config = {'identity_file': './id_rsa'} url = "example.com:/var/www/fdroid" repo_section = 'archive' @@ -289,7 +289,7 @@ class DeployTest(unittest.TestCase): not os.getenv('VIRUSTOTAL_API_KEY'), 'VIRUSTOTAL_API_KEY is not set' ) def test_upload_to_virustotal(self): - fdroidserver.deploy.options.verbose = True + fdroidserver.common.options.verbose = True virustotal_apikey = os.getenv('VIRUSTOTAL_API_KEY') fdroidserver.deploy.upload_to_virustotal('repo', virustotal_apikey) @@ -307,12 +307,12 @@ class DeployTest(unittest.TestCase): def test_update_servergitmirrors(self): # setup parameters for this test run - fdroidserver.deploy.options = mock.Mock() - fdroidserver.deploy.options.identity_file = None - fdroidserver.deploy.options.no_keep_git_mirror_archive = False - fdroidserver.deploy.options.verbose = False - fdroidserver.deploy.options.quiet = True - fdroidserver.deploy.options.index_only = False + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.identity_file = None + fdroidserver.common.options.no_keep_git_mirror_archive = False + fdroidserver.common.options.verbose = False + fdroidserver.common.options.quiet = True + fdroidserver.common.options.index_only = False config = {} fdroidserver.common.fill_config_defaults(config) @@ -399,7 +399,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - fdroidserver.common.options = parser.parse_args(['--verbose']) + parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(DeployTest)) diff --git a/tests/dump_internal_metadata_format.py b/tests/dump_internal_metadata_format.py index 24b7e911..f9763ebc 100755 --- a/tests/dump_internal_metadata_format.py +++ b/tests/dump_internal_metadata_format.py @@ -56,9 +56,9 @@ def _build_yaml_representer(dumper, data): parser = ArgumentParser() fdroidserver.common.setup_global_opts(parser) fdroidserver.metadata.add_metadata_arguments(parser) -options = parser.parse_args() +options = fdroidserver.common.parse_args(parser) fdroidserver.metadata.warnings_action = options.W -fdroidserver.common.read_config(None) +fdroidserver.common.read_config() if not os.path.isdir('metadata'): print("This script must be run in an F-Droid data folder with a 'metadata' subdir!") diff --git a/tests/exception.TestCase b/tests/exception.TestCase index bfa44f57..f3e69e69 100755 --- a/tests/exception.TestCase +++ b/tests/exception.TestCase @@ -57,6 +57,7 @@ if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) import argparse + from testcommon import parse_args_for_test parser = argparse.ArgumentParser() parser.add_argument( @@ -66,8 +67,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - fdroidserver.exception.options = parser.parse_args(['--verbose']) - fdroidserver.common.options = fdroidserver.exception.options + parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(ExceptionTest)) diff --git a/tests/gpgsign.TestCase b/tests/gpgsign.TestCase index 27feb79e..1c013c1b 100755 --- a/tests/gpgsign.TestCase +++ b/tests/gpgsign.TestCase @@ -32,7 +32,7 @@ class GpgsignTest(unittest.TestCase): self.repodir.mkdir() gpgsign.config = None - config = common.read_config(common.options) + config = common.read_config() config['verbose'] = True config['gpghome'] = str((self.basedir / 'gnupghome').resolve()) config['gpgkey'] = '1DBA2E89' @@ -84,7 +84,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - common.options = parser.parse_args(['--verbose']) + common.parse_args(parser) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(GpgsignTest)) diff --git a/tests/import_subcommand.TestCase b/tests/import_subcommand.TestCase index 1b3347ad..b37c2f37 100755 --- a/tests/import_subcommand.TestCase +++ b/tests/import_subcommand.TestCase @@ -24,7 +24,7 @@ import fdroidserver.common import fdroidserver.import_subcommand import fdroidserver.metadata from fdroidserver.exception import FDroidException -from testcommon import TmpCwd, mkdtemp +from testcommon import TmpCwd, mkdtemp, parse_args_for_test class ImportTest(unittest.TestCase): @@ -33,8 +33,6 @@ class ImportTest(unittest.TestCase): def setUp(self): logging.basicConfig(level=logging.DEBUG) self.basedir = localmodule / 'tests' - fdroidserver.import_subcommand.options = mock.Mock() - fdroidserver.import_subcommand.options.rev = None os.chdir(self.basedir) self._td = mkdtemp() self.testdir = self._td.name @@ -145,7 +143,9 @@ class ImportTest(unittest.TestCase): fdroidserver.import_subcommand.main() @mock.patch('sys.argv', ['fdroid import', '-u', 'https://fake/git/url.git']) - @mock.patch('fdroidserver.import_subcommand.clone_to_tmp_dir', lambda a: Path('td')) + @mock.patch( + 'fdroidserver.import_subcommand.clone_to_tmp_dir', lambda a, r: Path('td') + ) def test_main_local_git(self): os.chdir(self.testdir) git.Repo.init('td') @@ -170,7 +170,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - fdroidserver.common.options = parser.parse_args(['--verbose']) + parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(ImportTest)) diff --git a/tests/index.TestCase b/tests/index.TestCase index 3e70acb1..0e23c71b 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -25,7 +25,7 @@ if localmodule not in sys.path: import fdroidserver from fdroidserver import common, index, publish, signindex, update -from testcommon import TmpCwd, mkdtemp +from testcommon import TmpCwd, mkdtemp, parse_args_for_test from pathlib import Path @@ -55,7 +55,7 @@ class IndexTest(unittest.TestCase): common.config = None common.options = Options - config = common.read_config(common.options) + config = common.read_config() config['jarsigner'] = common.find_sdk_tools_cmd('jarsigner') common.config = config signindex.config = config @@ -751,7 +751,7 @@ class IndexTest(unittest.TestCase): yaml.dump(c, fp) os.system('cat config.yml') common.config = None - common.read_config(Options) + common.read_config() repodict = {'address': common.config['repo_url']} index.add_mirrors_to_repodict('repo', repodict) self.assertEqual( @@ -951,8 +951,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - options = parser.parse_args(["--verbose"]) - Options.verbose = options.verbose + parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(IndexTest)) diff --git a/tests/init.TestCase b/tests/init.TestCase index 9266fa7c..7e674cb5 100755 --- a/tests/init.TestCase +++ b/tests/init.TestCase @@ -18,7 +18,7 @@ if localmodule not in sys.path: sys.path.insert(0, localmodule) import fdroidserver.init -from testcommon import mkdtemp +from testcommon import mkdtemp, parse_args_for_test class InitTest(unittest.TestCase): @@ -42,14 +42,14 @@ class InitTest(unittest.TestCase): fp.write('keystore: NONE\n') fp.write('keypass: mysupersecrets\n') os.chmod('config.yml', 0o600) - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() self.assertEqual('NONE', config['keystore']) self.assertEqual('mysupersecrets', config['keypass']) fdroidserver.init.disable_in_config('keypass', 'comment') with open(fp.name) as fp: self.assertTrue('#keypass:' in fp.read()) fdroidserver.common.config = None - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() self.assertIsNone(config.get('keypass')) @unittest.skipIf(os.name == 'nt', "calling main() like this hangs on Windows") @@ -84,7 +84,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - fdroidserver.init.options = parser.parse_args(['--verbose']) + fdroidserver.init.options = parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(InitTest)) diff --git a/tests/install.TestCase b/tests/install.TestCase index 2f4569ea..cef5c022 100755 --- a/tests/install.TestCase +++ b/tests/install.TestCase @@ -38,6 +38,7 @@ if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) import argparse + from testcommon import parse_args_for_test parser = argparse.ArgumentParser() parser.add_argument( @@ -47,8 +48,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - fdroidserver.install.options = parser.parse_args(['--verbose']) - fdroidserver.common.options = fdroidserver.install.options + fdroidserver.install.options = parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(InstallTest)) diff --git a/tests/key-tricks.py b/tests/key-tricks.py index b634803f..7fc0f3ea 100755 --- a/tests/key-tricks.py +++ b/tests/key-tricks.py @@ -11,7 +11,7 @@ if os.getenv('CI') is None: sys.exit(1) os.chdir(os.path.dirname(__file__)) -config = fdroidserver.common.read_config(common.options) +config = fdroidserver.common.read_config() nightly.PASSWORD = config['keystorepass'] nightly.KEY_ALIAS = config['repo_keyalias'] diff --git a/tests/lint.TestCase b/tests/lint.TestCase index d9ac8de2..5937aadf 100755 --- a/tests/lint.TestCase +++ b/tests/lint.TestCase @@ -20,7 +20,7 @@ import fdroidserver.common import fdroidserver.lint import fdroidserver.metadata from fdroidserver.common import CATEGORIES_CONFIG_NAME -from testcommon import mkdtemp +from testcommon import mkdtemp, parse_args_for_test class LintTest(unittest.TestCase): @@ -536,8 +536,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - fdroidserver.lint.options = parser.parse_args(['--verbose']) - fdroidserver.common.options = fdroidserver.lint.options + fdroidserver.lint.options = parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(LintTest)) diff --git a/tests/main.TestCase b/tests/main.TestCase index 9ce25a2b..691a0aca 100755 --- a/tests/main.TestCase +++ b/tests/main.TestCase @@ -274,7 +274,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - common.options = parser.parse_args(['--verbose']) + common.options = common.parse_args(parser) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(MainTest)) diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 1a0a1bdc..75dc3b91 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -24,7 +24,7 @@ import fdroidserver from fdroidserver import metadata from fdroidserver.exception import MetaDataException from fdroidserver.common import DEFAULT_LOCALE -from testcommon import TmpCwd, mkdtemp +from testcommon import TmpCwd, mkdtemp, parse_args_for_test def _get_mock_mf(s): @@ -2455,7 +2455,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - fdroidserver.common.options = parser.parse_args(['--verbose']) + parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(MetadataTest)) diff --git a/tests/net.TestCase b/tests/net.TestCase index 59b299b8..a50f5925 100755 --- a/tests/net.TestCase +++ b/tests/net.TestCase @@ -135,7 +135,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - common.options = parser.parse_args(['--verbose']) + common.options = common.parse_args(parser) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(NetTest)) diff --git a/tests/nightly.TestCase b/tests/nightly.TestCase index 7cb1712d..44e85f04 100755 --- a/tests/nightly.TestCase +++ b/tests/nightly.TestCase @@ -373,7 +373,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - common.options = parser.parse_args(['--verbose']) + common.options = common.parse_args(parser) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(NightlyTest)) diff --git a/tests/parse-fdroiddata-mirror-config.py b/tests/parse-fdroiddata-mirror-config.py new file mode 100644 index 00000000..f909e910 --- /dev/null +++ b/tests/parse-fdroiddata-mirror-config.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 + +import ruamel.yaml + +from pathlib import Path + +mirrors_yml = Path('/home/hans/code/fdroid/fdroiddata/config/mirrors.yml') +with mirrors_yml.open() as fp: + mirrors_config = ruamel.yaml.YAML(typ='safe').load(fp) + +for d in mirrors_config: + d['url'] += '/repo' + print(d, end=',\n') diff --git a/tests/publish.TestCase b/tests/publish.TestCase index 00bbec0e..5ae1fd5f 100755 --- a/tests/publish.TestCase +++ b/tests/publish.TestCase @@ -33,7 +33,7 @@ from fdroidserver import common from fdroidserver import metadata from fdroidserver import signatures from fdroidserver.exception import FDroidException -from testcommon import mkdtemp +from testcommon import mkdtemp, parse_args_for_test class PublishTest(unittest.TestCase): @@ -266,7 +266,8 @@ class PublishTest(unittest.TestCase): os.chdir(self.testdir) - config = common.read_config(Options) + common.options = Options + config = common.read_config() if 'apksigner' not in config: self.skipTest('SKIPPING test_sign_then_implant_signature, apksigner not installed!') config['repo_keyalias'] = 'sova' @@ -340,7 +341,8 @@ class PublishTest(unittest.TestCase): os.chdir(self.testdir) - config = common.read_config(Options) + common.options = Options + config = common.read_config() if 'apksigner' not in config: self.skipTest('SKIPPING test_error_on_failed, apksigner not installed!') config['repo_keyalias'] = 'sova' @@ -422,7 +424,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - common.options = parser.parse_args(['--verbose']) + parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(PublishTest)) diff --git a/tests/rewritemeta.TestCase b/tests/rewritemeta.TestCase index f8388f88..e212ec84 100755 --- a/tests/rewritemeta.TestCase +++ b/tests/rewritemeta.TestCase @@ -273,7 +273,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - common.options = parser.parse_args(['--verbose']) + common.options = common.parse_args(parser) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(RewriteMetaTest)) diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 9069164e..6a85b7f3 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -30,7 +30,7 @@ import fdroidserver.build import fdroidserver.common import fdroidserver.metadata import fdroidserver.scanner -from testcommon import TmpCwd, mkdtemp, mock_open_to_str +from testcommon import TmpCwd, mkdtemp, mock_open_to_str, parse_args_for_test class ScannerTest(unittest.TestCase): @@ -46,8 +46,8 @@ class ScannerTest(unittest.TestCase): self._td.cleanup() def test_scan_source_files(self): - fdroidserver.scanner.options = mock.Mock() - fdroidserver.scanner.options.json = False + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.json = False source_files = os.path.join(self.basedir, 'source-files') projects = { 'OtakuWorld': 2, @@ -102,8 +102,8 @@ class ScannerTest(unittest.TestCase): """Check for sneaking in banned maven repos""" os.chdir(self.testdir) fdroidserver.scanner.config = None - fdroidserver.scanner.options = mock.Mock() - fdroidserver.scanner.options.json = True + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.json = True with open('build.gradle', 'w', encoding='utf-8') as fp: fp.write( textwrap.dedent( @@ -135,8 +135,8 @@ class ScannerTest(unittest.TestCase): os.chdir(abs_build_dir) fdroidserver.scanner.config = None - fdroidserver.scanner.options = mock.Mock() - fdroidserver.scanner.options.json = True + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.json = True keep = [ 'arg.jar', @@ -235,7 +235,7 @@ class ScannerTest(unittest.TestCase): fdroidserver.build.options.scan_binary = False fdroidserver.build.options.notarball = True fdroidserver.build.options.skipscan = False - fdroidserver.scanner.options = fdroidserver.build.options + fdroidserver.common.options = fdroidserver.build.options app = fdroidserver.metadata.App() app.id = 'mocked.app.id' @@ -314,7 +314,7 @@ class ScannerTest(unittest.TestCase): """Check that the scanner can handle scandelete with gradle files with multiple problems""" os.chdir(self.testdir) fdroidserver.scanner.config = None - fdroidserver.scanner.options = mock.Mock() + fdroidserver.common.options = mock.Mock() build = fdroidserver.metadata.Build() build.scandelete = ['build.gradle'] with open('build.gradle', 'w', encoding='utf-8') as fp: @@ -732,15 +732,15 @@ class Test_ScannerTool(unittest.TestCase): refresh.assert_not_called() def test_refresh_true(self): - fdroidserver.scanner.options = mock.Mock() - fdroidserver.scanner.options.refresh_scanner = True + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.refresh_scanner = True with mock.patch('fdroidserver.scanner.ScannerTool.refresh') as refresh: fdroidserver.scanner.ScannerTool() refresh.assert_called_once() def test_refresh_false(self): - fdroidserver.scanner.options = mock.Mock() - fdroidserver.scanner.options.refresh_scanner = False + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.refresh_scanner = False with mock.patch('fdroidserver.scanner.ScannerTool.refresh') as refresh: fdroidserver.scanner.ScannerTool() refresh.assert_not_called() @@ -753,8 +753,8 @@ class Test_ScannerTool(unittest.TestCase): refresh.assert_called_once() def test_refresh_options_overrides_config(self): - fdroidserver.scanner.options = mock.Mock() - fdroidserver.scanner.options.refresh_scanner = True + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.refresh_scanner = True os.chdir(self.testdir) pathlib.Path('config.yml').write_text('refresh_scanner: false') with mock.patch('fdroidserver.scanner.ScannerTool.refresh') as refresh: @@ -824,7 +824,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - fdroidserver.common.options = parser.parse_args(['--verbose']) + parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTests( diff --git a/tests/signatures.TestCase b/tests/signatures.TestCase index 5d043a9f..de01c5b9 100755 --- a/tests/signatures.TestCase +++ b/tests/signatures.TestCase @@ -23,7 +23,7 @@ class SignaturesTest(unittest.TestCase): def setUp(self): logging.basicConfig(level=logging.DEBUG) common.config = None - config = common.read_config(common.options) + config = common.read_config() config['jarsigner'] = common.find_sdk_tools_cmd('jarsigner') config['verbose'] = True common.config = config @@ -68,7 +68,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - common.options = parser.parse_args(['--verbose']) + common.options = common.parse_args(parser) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(SignaturesTest)) diff --git a/tests/signindex.TestCase b/tests/signindex.TestCase index 7931fbdc..f66e9c18 100755 --- a/tests/signindex.TestCase +++ b/tests/signindex.TestCase @@ -37,7 +37,7 @@ class SignindexTest(unittest.TestCase): def setUp(self): signindex.config = None - config = common.read_config(common.options) + config = common.read_config() config['jarsigner'] = common.find_sdk_tools_cmd('jarsigner') config['verbose'] = True config['keystore'] = str(self.basedir / 'keystore.jks') @@ -202,7 +202,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - common.options = parser.parse_args(['--verbose']) + common.options = common.parse_args(parser) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(SignindexTest)) diff --git a/tests/testcommon.py b/tests/testcommon.py index 069ac42e..2ce9f393 100644 --- a/tests/testcommon.py +++ b/tests/testcommon.py @@ -21,6 +21,7 @@ import tempfile import unittest from pathlib import Path +from unittest import mock class TmpCwd: @@ -72,3 +73,16 @@ def mkdir_testfiles(localmodule, test): testdir = testroot / unittest.TestCase.id(test) testdir.mkdir(exist_ok=True) return tempfile.mkdtemp(dir=testdir) + + +def parse_args_for_test(parser, args): + """Only send --flags to the ArgumentParser, not test classes, etc.""" + + from fdroidserver.common import parse_args + + flags = [] + for arg in args: + if arg[0] == '-': + flags.append(flags) + with mock.patch('sys.argv', flags): + parse_args(parser) diff --git a/tests/update.TestCase b/tests/update.TestCase index bc52981f..dbabcdd0 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -60,7 +60,7 @@ import fdroidserver.metadata import fdroidserver.update from fdroidserver.common import CATEGORIES_CONFIG_NAME from fdroidserver.looseversion import LooseVersion -from testcommon import TmpCwd, mkdtemp +from testcommon import TmpCwd, mkdtemp, parse_args_for_test DONATION_FIELDS = ('Donate', 'Liberapay', 'OpenCollective') @@ -1207,7 +1207,7 @@ class UpdateTest(unittest.TestCase): # Set up options fdroidserver.common.options = Options - config = fdroidserver.common.read_config(fdroidserver.common.options) + config = fdroidserver.common.read_config() if 'apksigner' not in config: # TODO remove me for buildserver-bullseye self.skipTest('SKIPPING test_update_with_AllowedAPKSigningKeys, apksigner not installed!') config['repo_keyalias'] = 'sova' @@ -2280,7 +2280,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - fdroidserver.common.options = parser.parse_args(['--verbose']) + parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(UpdateTest)) diff --git a/tests/vcs.TestCase b/tests/vcs.TestCase index 99af14cc..86f67ae1 100755 --- a/tests/vcs.TestCase +++ b/tests/vcs.TestCase @@ -21,7 +21,7 @@ import fdroidserver.build import fdroidserver.common import fdroidserver.metadata import fdroidserver.scanner -from testcommon import mkdtemp +from testcommon import mkdtemp, parse_args_for_test class VCSTest(unittest.TestCase): @@ -97,7 +97,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - fdroidserver.common.options = parser.parse_args(['--verbose']) + parse_args_for_test(parser, sys.argv) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(VCSTest)) diff --git a/tests/verify.TestCase b/tests/verify.TestCase index cd8fbb6e..eee8e9e8 100755 --- a/tests/verify.TestCase +++ b/tests/verify.TestCase @@ -103,7 +103,7 @@ if __name__ == "__main__": default=False, help="Spew out even more information than normal", ) - common.options = parser.parse_args(['--verbose']) + common.options = common.parse_args(parser) newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(VerifyTest)) From 5745ed4753ac1ec55006b30dc8052a210f98284e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 7 May 2024 17:14:18 +0200 Subject: [PATCH 1506/2116] common: only try to delete .testfiles dir if it exists Otherwise, some tests fail with an error. --- tests/common.TestCase | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/common.TestCase b/tests/common.TestCase index 5d3b5cdb..48e668fc 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -77,7 +77,8 @@ class CommonTest(unittest.TestCase): fdroidserver.common.options = None os.chdir(self.basedir) self._td.cleanup() - shutil.rmtree(self.tmpdir) + if os.path.exists(self.tmpdir): + shutil.rmtree(self.tmpdir) def test_parse_human_readable_size(self): for k, v in ( From 64c9154fffbe9274b22bda4f54c23eee25061ec6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 8 May 2024 16:36:21 +0200 Subject: [PATCH 1507/2116] gitlab-ci: fix macOS job after !1466 --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8de00bec..b5d9a246 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -362,7 +362,7 @@ macOS: - /bin/bash -n gradlew-fdroid tests/run-tests # TODO remove the packages below once they are included in the Homebrew package - - $(brew --prefix fdroidserver)/libexec/bin/python3 -m pip install biplist pycountry + - $(brew --prefix fdroidserver)/libexec/bin/python3 -m pip install biplist oscrypto pycountry # test fdroidserver from git with current package's dependencies - fdroid="$(brew --prefix fdroidserver)/libexec/bin/python3 $PWD/fdroid" ./tests/run-tests From 25278801de99df8057430ef4b67a6d78eab437c2 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Fri, 10 May 2024 15:24:34 +0200 Subject: [PATCH 1508/2116] Translated using Weblate: Spanish (es) by gallegonovato Currently translated at 100.0% (552 of 552 strings) Co-authored-by: gallegonovato Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ Translation: F-Droid/F-Droid Server --- locale/es/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index ee4537c8..c31a3ad5 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -12,13 +12,13 @@ # Iago , 2022. # Iago , 2022. # Jaime Marquínez Ferrándiz , 2022. -# gallegonovato , 2022, 2023. +# gallegonovato , 2022, 2023, 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-08-01 21:07+0000\n" +"PO-Revision-Date: 2024-04-10 18:44+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" "Language: es\n" @@ -26,7 +26,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.0-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -1817,11 +1817,11 @@ msgstr "UpdateCheckData tiene una URL no válida: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "UpdateCheckMode está configurado pero parece que checkupdates aún no se ha ejecutado" +msgstr "UpdateCheckMode está configurado pero parece que aún no se han ejecutado las actualizaciones." #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "El nombre de verificación de actualización (UpdateCheckName) es el identificador (ID) conocido de la aplicación. Se puede borrar" +msgstr "UpdateCheckName está configurado con el ID de la aplicación conocida, se puede eliminar" #: ../fdroidserver/deploy.py #, python-brace-format From c7f1bdd14c335c92c2d7a08cc32c122ce2769615 Mon Sep 17 00:00:00 2001 From: Agnieszka C Date: Fri, 10 May 2024 15:24:36 +0200 Subject: [PATCH 1509/2116] Translated using Weblate: Polish (pl) by Agnieszka C Currently translated at 100.0% (552 of 552 strings) Co-authored-by: Agnieszka C Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ Translation: F-Droid/F-Droid Server --- locale/pl/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index fc6581a4..afdbd49c 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -4,21 +4,21 @@ # Michal L , 2020, 2021. # mondstern , 2021. # Hans-Christoph Steiner , 2021. -# Agnieszka C , 2021, 2022, 2023. +# Agnieszka C , 2021, 2022, 2023, 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-05-26 19:39+0000\n" +"PO-Revision-Date: 2024-04-10 18:44+0000\n" "Last-Translator: Agnieszka C \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.18-dev\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" From 99841bf7c51612c78250af867b18617a7cf3c6e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Fri, 10 May 2024 15:24:37 +0200 Subject: [PATCH 1510/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Turki?= =?UTF-8?q?sh=20(tr)=20by=20O=C4=9Fuz=20Ersen=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (552 of 552 strings) Co-authored-by: Oğuz Ersen Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/tr/ Translation: F-Droid/F-Droid Server --- locale/tr/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index b1cfbf21..aee14242 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -2,22 +2,22 @@ # Copyright (C) YEAR Free Software Foundation, Inc. # Oğuz Ersen , 2020, 2021, 2022. # Orhan , 2021. -# Oğuz Ersen , 2022, 2023. +# Oğuz Ersen , 2022, 2023, 2024. # Bai , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-09-09 10:53+0000\n" -"Last-Translator: Bai \n" +"PO-Revision-Date: 2024-04-11 20:02+0000\n" +"Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.0.1-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -1808,7 +1808,7 @@ msgstr "UpdateCheckData geçerli bir URL değil: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "UpdateCheckMode ayarlı ancak checkupdates henüz çalıştırılmamış gibi görünüyor" +msgstr "UpdateCheckMode ayarlı ancak checkupdates henüz çalıştırılmamış gibi görünüyor." #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" From f6235831aeb42d0a6d1c54b1240ad55652970b1c Mon Sep 17 00:00:00 2001 From: ALoLo_527 Date: Fri, 10 May 2024 15:24:38 +0200 Subject: [PATCH 1511/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by ALoLo_527 Currently translated at 82.0% (453 of 552 strings) Co-authored-by: ALoLo_527 Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 28 +++++++++++----------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 76c0cc14..2ec6f3af 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -29,21 +29,21 @@ # Kingo Bingo , 2023. # zhiqi , 2023. # David Jiang , 2023. +# ALoLo_527 , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-11-05 08:05+0000\n" -"Last-Translator: David Jiang \n" -"Language-Team: Chinese (Simplified) \n" +"PO-Revision-Date: 2024-04-13 17:01+0000\n" +"Last-Translator: ALoLo_527 \n" +"Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.2-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -2639,12 +2639,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" -msgstr "" +msgstr "{appid}来自{path}不是一个有效的Android应用ID!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" -msgstr "" +msgstr "{appid}来自{path}不是一个有效的Java安装包名称!" #: ../fdroidserver/update.py #, python-brace-format @@ -2654,7 +2654,7 @@ msgstr "" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" -msgstr "" +msgstr "{appid}缺失了{name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py @@ -2670,12 +2670,12 @@ msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "" +msgstr "{appid}:{field}必须为‘{type}’,但它是‘{fieldtype}!’" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" -msgstr "" +msgstr "{appid}:{field}必须为‘{type}’,但它是‘{fieldtype}’!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2720,12 +2720,12 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" -msgstr "" +msgstr "{path}的大小为零!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" -msgstr "" +msgstr "{path}的大小超过200MB,请手动上传:{url}" #: ../fdroidserver/update.py #, python-brace-format @@ -2735,12 +2735,12 @@ msgstr "{path}:{error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" -msgstr "" +msgstr "{url}不是以“fdroid”结尾的,请检查链接路径!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" -msgstr "" +msgstr "{url}不是以“http”为开头!" #: ../fdroidserver/build.py msgid "{} build failed" From 34dd9a75e486a9460c3e775619bf11e672da684c Mon Sep 17 00:00:00 2001 From: Random Date: Fri, 10 May 2024 15:24:39 +0200 Subject: [PATCH 1512/2116] Translated using Weblate: Italian (it) by Random Currently translated at 100.0% (552 of 552 strings) Co-authored-by: Random Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ Translation: F-Droid/F-Droid Server --- locale/it/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 36ddf947..02e9243c 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -16,13 +16,13 @@ # Davide Neri , 2023. # Mirko Di , 2023. # coronabond , 2023. -# Random , 2023. +# Random , 2023, 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-09-06 17:31+0000\n" +"PO-Revision-Date: 2024-04-13 17:01+0000\n" "Last-Translator: Random \n" "Language-Team: Italian \n" "Language: it\n" @@ -30,7 +30,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.0.1-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -1821,7 +1821,7 @@ msgstr "UpdateCheckData non è un URL valido: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "UpdateCheckMode impostato ma sembra che checkupdates non sia ancora stato eseguito" +msgstr "UpdateCheckMode impostato ma sembra che checkupdates non sia ancora stato eseguito." #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" From 7e1b2e07884d2b91b41ba3e6bc50347769bb6650 Mon Sep 17 00:00:00 2001 From: Fjuro Date: Fri, 10 May 2024 15:24:40 +0200 Subject: [PATCH 1513/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 100.0% (552 of 552 strings) Co-authored-by: Fjuro Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ Translation: F-Droid/F-Droid Server --- locale/cs/LC_MESSAGES/fdroidserver.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 325fd385..1e9898b1 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -6,20 +6,21 @@ # Filip Klopec , 2022. # Fjuro , 2022, 2023. # Daniel Hejduk , 2023. +# Fjuro , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-10-20 14:22+0000\n" -"Last-Translator: Daniel Hejduk \n" +"PO-Revision-Date: 2024-04-23 10:07+0000\n" +"Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 5.1\n" +"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" +"X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -1813,7 +1814,7 @@ msgstr "UpdateCheckData není platná URL: {url}" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "UpdateCheckMode je nastaven, ale vypadá to, že checkupdates ještě nebylo spuštěno" +msgstr "UpdateCheckMode je nastaven, ale vypadá to, že akce checkupdates ještě nebyla spuštěna." #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" From 6bebd8b1603d7e5f0f7b88b85d95a2e7eaeb4233 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 13 May 2024 10:33:33 +0200 Subject: [PATCH 1514/2116] safety: ignore CVE-2018-20225, should never affect fdroidserver https://data.safetycli.com/v/67599/97c --- .safety-policy.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.safety-policy.yml b/.safety-policy.yml index 39e601d2..2b95cf4d 100644 --- a/.safety-policy.yml +++ b/.safety-policy.yml @@ -20,3 +20,6 @@ security: 63687: reason: Only affects Windows https://security-tracker.debian.org/tracker/CVE-2024-22190 expires: '2026-01-31' + 67599: + reason: Only affects pip when using --extra-index-url, which is never the case in fdroidserver CI. + expires: '2026-05-31' From b45b31b927b559fd279dced73b207947f10e6627 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 13 May 2024 10:36:56 +0200 Subject: [PATCH 1515/2116] version 2.3 alpha 1 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 0b437735..64b59ecf 100755 --- a/setup.py +++ b/setup.py @@ -71,7 +71,7 @@ with open("README.md", "r") as fh: setup( name='fdroidserver', - version='2.3a0', + version='2.3a1', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From c37a26bcd238d7058238fb8eb6c64fcae62f90a8 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 13 May 2024 13:51:47 +0200 Subject: [PATCH 1516/2116] make -C locale update --- locale/az/LC_MESSAGES/fdroidserver.po | 130 ++++++++- locale/bg/LC_MESSAGES/fdroidserver.po | 130 ++++++++- locale/bn/LC_MESSAGES/fdroidserver.po | 130 ++++++++- locale/bo/LC_MESSAGES/fdroidserver.po | 135 +++++++++- locale/cs/LC_MESSAGES/fdroidserver.po | 144 +++++++++- locale/cy/LC_MESSAGES/fdroidserver.po | 130 ++++++++- locale/de/LC_MESSAGES/fdroidserver.po | 144 +++++++++- locale/es/LC_MESSAGES/fdroidserver.po | 144 +++++++++- locale/es_AR/LC_MESSAGES/fdroidserver.po | 132 ++++++++- locale/es_MX/LC_MESSAGES/fdroidserver.po | 130 ++++++++- locale/eu/LC_MESSAGES/fdroidserver.po | 130 ++++++++- locale/fa/LC_MESSAGES/fdroidserver.po | 130 ++++++++- locale/fdroidserver.pot | 130 ++++++++- locale/fi/LC_MESSAGES/fdroidserver.po | 130 ++++++++- locale/fr/LC_MESSAGES/fdroidserver.po | 144 +++++++++- locale/fy/LC_MESSAGES/fdroidserver.po | 130 ++++++++- locale/he/LC_MESSAGES/fdroidserver.po | 130 ++++++++- locale/hi/LC_MESSAGES/fdroidserver.po | 130 ++++++++- locale/hu/LC_MESSAGES/fdroidserver.po | 137 +++++++++- locale/id/LC_MESSAGES/fdroidserver.po | 130 ++++++++- locale/it/LC_MESSAGES/fdroidserver.po | 144 +++++++++- locale/kab/LC_MESSAGES/fdroidserver.po | 131 ++++++++- locale/ko/LC_MESSAGES/fdroidserver.po | 132 ++++++++- locale/ml/LC_MESSAGES/fdroidserver.po | 130 ++++++++- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 140 +++++++++- locale/pl/LC_MESSAGES/fdroidserver.po | 144 +++++++++- locale/pt/LC_MESSAGES/fdroidserver.po | 144 +++++++++- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 144 +++++++++- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 144 +++++++++- locale/ro/LC_MESSAGES/fdroidserver.po | 144 +++++++++- locale/ru/LC_MESSAGES/fdroidserver.po | 144 +++++++++- locale/sk/LC_MESSAGES/fdroidserver.po | 130 ++++++++- locale/sq/LC_MESSAGES/fdroidserver.po | 144 +++++++++- locale/sr/LC_MESSAGES/fdroidserver.po | 130 ++++++++- locale/tr/LC_MESSAGES/fdroidserver.po | 144 +++++++++- locale/tzm/LC_MESSAGES/fdroidserver.po | 130 ++++++++- locale/ug/LC_MESSAGES/fdroidserver.po | 131 ++++++++- locale/uk/LC_MESSAGES/fdroidserver.po | 144 +++++++++- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 298 +++++++++++++-------- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 141 +++++++++- 40 files changed, 5406 insertions(+), 197 deletions(-) diff --git a/locale/az/LC_MESSAGES/fdroidserver.po b/locale/az/LC_MESSAGES/fdroidserver.po index 83093455..a1bc9f88 100644 --- a/locale/az/LC_MESSAGES/fdroidserver.po +++ b/locale/az/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2023-05-26 19:39+0000\n" "Last-Translator: Mehrab Poladov \n" "Language-Team: Azerbaijani \n" @@ -90,6 +90,11 @@ msgstr[1] "" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: xəta: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -209,6 +214,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -286,6 +296,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -382,6 +396,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "" @@ -548,6 +567,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -614,6 +643,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -780,6 +814,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -844,6 +882,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1049,6 +1091,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1186,6 +1232,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1344,6 +1394,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1377,6 +1431,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1626,6 +1684,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1787,11 +1849,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1819,6 +1885,10 @@ msgstr "" msgid "Usage: %s\n" msgstr "" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1848,6 +1918,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1905,6 +1979,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2054,6 +2132,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2228,6 +2310,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2385,6 +2472,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2399,6 +2491,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2603,6 +2699,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2613,6 +2734,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/bg/LC_MESSAGES/fdroidserver.po b/locale/bg/LC_MESSAGES/fdroidserver.po index 8fd1e130..da2dc127 100644 --- a/locale/bg/LC_MESSAGES/fdroidserver.po +++ b/locale/bg/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -89,6 +89,11 @@ msgstr[1] "" msgid "%(prog)s: error: %(message)s\n" msgstr "" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -208,6 +213,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -285,6 +295,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -381,6 +395,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "" @@ -547,6 +566,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -613,6 +642,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -779,6 +813,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -843,6 +881,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1048,6 +1090,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1185,6 +1231,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1343,6 +1393,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1376,6 +1430,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1625,6 +1683,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1786,11 +1848,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1818,6 +1884,10 @@ msgstr "" msgid "Usage: %s\n" msgstr "" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1847,6 +1917,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1904,6 +1978,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2053,6 +2131,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2227,6 +2309,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2384,6 +2471,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2398,6 +2490,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2602,6 +2698,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2612,6 +2733,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index 2edae028..4bb5e5e0 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2021-02-12 09:48+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali \n" @@ -90,6 +90,11 @@ msgstr[1] "" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: ত্রুটি: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -209,6 +214,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -286,6 +296,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -382,6 +396,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "" @@ -548,6 +567,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -614,6 +643,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -780,6 +814,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -844,6 +882,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1049,6 +1091,10 @@ msgstr "{apkfilename} প্রক্রিয়ারত" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1186,6 +1232,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1344,6 +1394,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1377,6 +1431,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1626,6 +1684,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1787,11 +1849,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1819,6 +1885,10 @@ msgstr "ব্যবহার" msgid "Usage: %s\n" msgstr "ব্যবহার: %s\n" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1848,6 +1918,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1905,6 +1979,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2054,6 +2132,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2228,6 +2310,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2386,6 +2473,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2400,6 +2492,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2604,6 +2700,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2614,6 +2735,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index 6b38f446..3e7d1e19 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tibetan \n" @@ -94,6 +94,11 @@ msgstr[0] "%(option)s གདམ་ཀ་དགོས་ %(number)d རྩོད msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: ནོར་སྐྱོན: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -214,6 +219,11 @@ msgstr "/གནས་དོན་བོར་བརླག་སོང་འད msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "{path}མིང་རྟགས་བཀོད་པའི་ཆོག་མཆན་ལག་ཁྱེར་འདིའི་ནང་རྙེད་མ་སོང་།" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "PGP གྱི་མིང་རྟགས་དེ་རེ་པོ་ཐུམ་སྒྲིལ་ནང་GnuPG ཁ་སྣོན་བྱས་ནས་རེ་པོ་ནང་ལ་བཅུག" @@ -291,6 +301,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -386,6 +400,11 @@ msgstr "སྡེ་ཚན་'%s' ཁུངས་ལྡན་མ་རེད།" msgid "Categories are not set" msgstr "སྡེ་ཚན་རྣམས་སྒྲིག་མེད།" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "མཉེན་ཆས་རྣམས་གསར་བསྒྱུར་བྱས་མིན་གཟིགས་ཞིབ་གནང་དང་།" @@ -556,6 +575,16 @@ msgstr "འགྲེལ་བཤད་འདི་ལ་ཐོ་གཞུང་ msgid "Description of length {length} is over the {limit} char limit" msgstr "རིང་ཐུང་གི་འགྲེལ་བཤད་ {length} {limit} ལས་བརྒལ་འདུག char limit" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -622,6 +651,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "'{field}'ནང་གི་ངོ་བཤུས་སྦྲེལ་མཐུད།: {url}" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -792,6 +826,11 @@ msgstr "མཉེན་ཆས་ཁ་ཤས་ཀྱི་ཁུངས་ལྡ msgid "Found multiple JAR Signature Block Files in {path}" msgstr "{path}ནང་ལ་སྣ་མང་མིང་རྟགས་ཆོག་མཆན་ལག་ཁྱེར་རྙེད་སོང་།" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Found multiple Signer Certificates!" +msgstr "མཛོད་ཁང་ཆེད་དུ་་མིང་རྟགས་བཀོད་པའི་ལག་ཁྱེར་མང་པོ་རྙེད་འདུག." + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -857,6 +896,11 @@ msgstr "" msgid "Git reset failed" msgstr "གིཊ་སྐྱར་སྒྲིག་ཐུབ་མ་སོང་།" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git submodule deinit failed" +msgstr "གིཊ་ཡན་ལག་རྒྱ་ཁྱོན་གསར་བསྒྱུར་ཐུབ་མ་སོང་།" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "གིཊ་རྒྱ་ཁྱོན་མཉམ་བསྲེ་ཐུབ་མ་སོང་།" @@ -1062,6 +1106,10 @@ msgstr "ཐུམ་སྒྲིལ་གྱི་མིང་ཀློག་བ msgid "Keystore for signing key:\t" msgstr "མིང་རྟགས་བཀོད་པའི་ལྡེ་མིག་ཆེད་དུ་སྟོན་པའི་ལྡེ་མིག་གསོག་ཉར་ཁང་གི་ལམ།\t" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1204,6 +1252,11 @@ msgstr "ཟུར་སྣོན་ཡོ་བྱད་རྙེད་མ་ས msgid "No unsigned directory - nothing to do" msgstr "མིང་རྟགས་མ་བཀོད་པའི་ཕྱོགས་དེབ་མིན་འདུག-བྱ་རྒྱུ་གང་ཡང་མེད།" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "ཆ་རྒྱུས་མེད་པའི་དམིགས་བསལ་ཞིག་རྙེད་སོང་།" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1363,6 +1416,10 @@ msgstr "ཐོ་གཞུད་འདི་གིཊ་ཐག་རིང་ག msgid "Pushing binary transparency log to {url}" msgstr "{url}ཆེད་དུ་ཨང་གྲངས་ཀྱི་ཐོ་གཞུང་གསར་བསྒྱུར།" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1396,6 +1453,10 @@ msgstr "ཐུམ་སྒྲིལ་གྱི་མིང་ཀློག་བ msgid "Reading {apkfilename} from cache" msgstr "སྦས་ཁུང་ནས་ {apkfilename}ཀློག་བཞིན་པ།" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "དམིགས་སྟོན་བྱས་པའི་ཡིག་ཆ་རྣམས་མེད་པ་བཟོ་བཞིན་པ།" @@ -1644,6 +1705,10 @@ msgstr "ལྡེ་མིག་གཞན་ལ་སྐྱོན་ཆ་འད msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1806,11 +1871,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py #, fuzzy msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -1839,6 +1908,11 @@ msgstr "བེད་སྤྱོད།" msgid "Usage: %s\n" msgstr "བེད་སྤྱོད།:%s 1\n" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "བེད་སྤྱོད།/HEAD གྱི་ཚབ་ཏུ།/ སོར་བཞག་ཡན་ལག་ནང་དུ་ཡོད་པའི་དོན་ཚན་ཨ་མ།" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "བེད་སྤྱོད།/HEAD གྱི་ཚབ་ཏུ།/ སོར་བཞག་ཡན་ལག་ནང་དུ་ཡོད་པའི་དོན་ཚན་ཨ་མ།" @@ -1868,6 +1942,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1925,6 +2003,10 @@ msgstr "བརྡ་སྟོན་པའི་མིང་རྟགས་དེ msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'ཁྱད་པར་ཅན་གྱི་མིང་' ལྡེ་མིག་བཟོས་པའི་སྐབས་ལ་བེད་སྤྱོད་བྱེད།" @@ -2076,6 +2158,10 @@ msgstr "ཚིག་སྒྲུབ་ཀྱི་གདམ་ཀའི་རྙ msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2254,6 +2340,11 @@ msgstr "local_copy_dir ངེས་པར་ཕྱོགས་དེབ་ཡི msgid "mirror '%s' does not end with 'fdroid'!" msgstr "མེ་ལོང་། '%s 1' 'fdroid'དང་མཉམ་དུ་མཇུག་སྐྱོང་མི་ཐུབ།!" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2413,6 +2504,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2427,6 +2523,11 @@ msgstr "s3cmd sync ཕྱོགས་སྟོན།{path}1 དེ་ནས {url msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "local_copy_dir \"fdroid\"གིས་མཇུག་སྐྱོང་མིན་འདུག་ : \"{path}1\"" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2630,6 +2731,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "'sdk_path' འདི་ 'config.yml' ནང་སྒྲིག་ཐུབ་མ་སོང་།!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2640,6 +2766,11 @@ msgstr "{path} ལ་ཆེ་ཆུང་མེད།!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{path}: {error}" diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 1e9898b1..bb10f256 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-04-23 10:07+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" @@ -101,6 +101,11 @@ msgstr[2] "možnost %(option)s vyžaduje %(number)d argumentů" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: chyba: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -220,6 +225,11 @@ msgstr "/issues chybí" msgid "A URL is required as an argument!" msgstr "Jako argument je vyžadována adresa URL!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "Nenalezeny žádné podpisové certifikáty v {path}" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Přidejte podpisy PGP pomocí GnuPG pro balíčky v repo" @@ -297,6 +307,11 @@ msgstr "Aplikace má binární soubory, ale nemá odpovídající AllowedAPKSign msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Aplikace má NoSourceSince nebo ArchivePolicy \"0 versions\", ale AutoUpdateMode nebo UpdateCheckMode nejsou None" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "Aplikace má NoSourceSince nebo ArchivePolicy \"0 versions\", ale AutoUpdateMode nebo UpdateCheckMode nejsou None" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -394,6 +409,11 @@ msgstr "Kategorie „%s“ není platná" msgid "Categories are not set" msgstr "Kategorie nejsou nastavené" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Zkontrolujte aktualizace aplikací" @@ -560,6 +580,16 @@ msgstr "Popis má seznam (%s) ale není opatřen odrážkami (*) ani očíslová msgid "Description of length {length} is over the {limit} char limit" msgstr "Popis délky {length} přesahuje limit {limit} znaků" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Nepřidávat ‚disable:‘ k vygenerovaným položkám sestavení" @@ -626,6 +656,11 @@ msgstr "Duplicitní záznam \"%s\" v konfiguraci zrcadel!" msgid "Duplicate link in '{field}': {url}" msgstr "Duplicitní odkaz v '{field}': {url}" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "CHYBA: Podpříkaz „server“ byl odebrán, použijte „deploy“!" @@ -796,6 +831,11 @@ msgstr "U některých aplikací nalezeny neplatné versionCodes" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "V {path} nalezeno několik podpisových bloků JAR" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Found multiple Signer Certificates!" +msgstr "Nalezeno více podpisových certifikátů pro repozitář." + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -860,6 +900,11 @@ msgstr "Git remote set-head se nezdařil: „%s“" msgid "Git reset failed" msgstr "Git reset se nezdařil" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git submodule deinit failed" +msgstr "Git submodule update se nezdařil" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Git submodule sync se nezdařil" @@ -1065,6 +1110,10 @@ msgstr "Uchovávání neúspěšného sestavení „{apkfilename}“" msgid "Keystore for signing key:\t" msgstr "Úložiště klíčů pro podpisový klíč:\t" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1202,6 +1251,11 @@ msgstr "Nebyly nalezeny žádné značky" msgid "No unsigned directory - nothing to do" msgstr "Žádný nepodepsaný adresář - není co dělat" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "nenalezeny informace o verzi" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Neplatná definice velikosti: \"{}\"" @@ -1360,6 +1414,11 @@ msgstr "Odeslat protokol do tohoto vzdáleného git repozitáře" msgid "Pushing binary transparency log to {url}" msgstr "Odeslání protokolu binární průhlednosti do {url}" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "Pushing to remote server failed!" +msgstr "Git remote set-head se nezdařil: „%s“" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1393,6 +1452,11 @@ msgstr "Čtení packageName/versionCode/versionName se nezdařilo, APK nepatné: msgid "Reading {apkfilename} from cache" msgstr "Čtení {apkfilename} z mezipaměti" +#: ../fdroidserver/build.py +#, fuzzy +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "stáhnout nejnovější verzi podpisů z webu" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Odebírání určených souborů" @@ -1643,6 +1707,13 @@ msgstr "Došlo ke kolizi keyalias – publikování zastaveno" msgid "These are the apps that have been archived from the main repo." msgstr "Aplikace, které byly archivovány z hlavního repozitáře." +#: ../fdroidserver/mirror.py +#, fuzzy +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" +"CHYBA: tento příkaz by nikdy neměl být použit k zrcadlení f-droid.org!\n" +"Celý mirror f-droid.org vyžaduje více než 200GB." + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Toto je repozitář aplikací, který lze používat s aplikací F-Droid. Aplikace v tomto repozitáři jsou buď oficiální binární soubory sestavené původními vývojáři aplikací, nebo binární soubory sestavené ze zdrojových kódů správcem f-droid.org pomocí nástrojů na adrese https://gitlab.com/fdroid." @@ -1811,11 +1882,16 @@ msgstr "UpdateCheckData musí používat HTTPS URL: {url}" msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData není platná URL: {url}" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode je nastaven, ale vypadá to, že akce checkupdates ještě nebyla spuštěna." +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +#, fuzzy +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "UpdateCheckMode je nastaven, ale vypadá to, že akce checkupdates ještě nebyla spuštěna." + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName je nastaveno na známé ID aplikace, lze jej odstranit" @@ -1843,6 +1919,11 @@ msgstr "Použití" msgid "Usage: %s\n" msgstr "Použití: %s\n" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "Použijte /HEAD místo /master k ukázání na soubor ve výchozí větvi" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Použijte /HEAD místo /master k ukázání na soubor ve výchozí větvi" @@ -1872,6 +1953,11 @@ msgstr "Používám APK Signature v2" msgid "Using APK Signature v3" msgstr "Používám APK Signature v3" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Using JAR Signature" +msgstr "Používám APK Signature v2" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Používám jarsigner Javy, není doporučeno pro ověřování APK! Použijte apksigner" @@ -1929,6 +2015,10 @@ msgstr "Pokud jsou nakonfigurovány podepsané indexy, vytvořit v této fázi p msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Při lintingu celého úložiště je yamllint ve výchozím nastavení zakázán. Tato volba vynucuje yamllint bez ohledu na to." +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distinguished Name' používané při generování klíčů" @@ -2079,6 +2169,11 @@ msgstr "konfliktní subparser: %s" msgid "could not parse '{path}'" msgstr "nepodařilo se parsovat '{path}'" +#: ../fdroidserver/common.py +#, fuzzy +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "nepodařilo se parsovat srclib spec (není určen ref): '{}'" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "nepodařilo se parsovat srclib spec (není určen ref): '{}'" @@ -2254,6 +2349,11 @@ msgstr "local_copy_dir musí být adresář, ne soubor!" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "mirror '%s' nekončí s 'fdroid'!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "Nyní nastavte následující v config.yml:" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2411,6 +2511,11 @@ msgstr "repo_icon \"repo/icons/%s\" neexistuje, generování placeholderu." msgid "repo_url needs to end with /repo" msgstr "repo_url musí končit na /repo" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml není nainstalován, nelze zapisovat metadata." @@ -2425,6 +2530,11 @@ msgstr "s3cmd sync indexes {path} do {url} a odstranit" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "mezipaměť skeneru je poškozena! Můžete ji vymazat pomocí: ‚{clear}‘" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "local_copy_dir nekončí s \"fdroid\", možná jste měli na mysli: \"{path}\"" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "sdílená knihovna" @@ -2630,6 +2740,31 @@ msgstr "{path} neexistuje! Vytvořte ji spuštěním:" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} má nesprávný podpis balíčku \"{pattern}\", možný exploit Janus!" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "'sdk_path' není nastaven v souboru config.yml!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2640,6 +2775,11 @@ msgstr "{path} má nulovou velikost!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} více než 200 MB, ruční nahrání: {url}" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/cy/LC_MESSAGES/fdroidserver.po b/locale/cy/LC_MESSAGES/fdroidserver.po index acb0f7a7..8c10a9b0 100644 --- a/locale/cy/LC_MESSAGES/fdroidserver.po +++ b/locale/cy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2021-01-16 21:23+0000\n" "Last-Translator: Aled Powell \n" "Language-Team: Welsh \n" @@ -94,6 +94,11 @@ msgstr[5] "" msgid "%(prog)s: error: %(message)s\n" msgstr "" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -213,6 +218,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -290,6 +300,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -390,6 +404,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Gwirio am ddiweddariadau i apiau" @@ -556,6 +575,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -622,6 +651,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -788,6 +822,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -852,6 +890,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1057,6 +1099,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1194,6 +1240,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1352,6 +1402,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1385,6 +1439,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1638,6 +1696,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py #, fuzzy msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." @@ -1806,11 +1868,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1838,6 +1904,10 @@ msgstr "" msgid "Usage: %s\n" msgstr "Defndd: %s\n" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1867,6 +1937,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1924,6 +1998,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2077,6 +2155,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2255,6 +2337,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2413,6 +2500,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2427,6 +2519,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2635,6 +2731,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2645,6 +2766,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 82065e48..cbab8823 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -25,7 +25,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-03-12 12:37+0000\n" "Last-Translator: VfBFan \n" "Language-Team: German \n" @@ -114,6 +114,11 @@ msgstr[1] "Option %(option)s benötigt %(number)d Argumente" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: Fehler: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -233,6 +238,11 @@ msgstr "/issues fehlt" msgid "A URL is required as an argument!" msgstr "Als Argument wird eine URL benötigt!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "Keine Signaturzertifikate in {path} gefunden" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "GnuPG PGP-Signaturen für Programmpakete in der Paketquelle hinzufügen" @@ -310,6 +320,11 @@ msgstr "App besitzt Binärdateien aber keine entsprechenden AllowedAPKSigningKey msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "App hat NoSourceSince oder ArchivePolicy \"0 Versionen\", aber AutoUpdateMode oder UpdateCheckMode sind nicht None" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "App hat NoSourceSince oder ArchivePolicy \"0 Versionen\", aber AutoUpdateMode oder UpdateCheckMode sind nicht None" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -406,6 +421,11 @@ msgstr "Kategorie »%s« ist nicht gültig" msgid "Categories are not set" msgstr "Kategorien sind nicht festgelegt" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Auf Aktualisierungen für Anwendungen prüfen" @@ -572,6 +592,16 @@ msgstr "Beschreibung enthält eine Liste (%s), ist aber weder aufgezählt (*) no msgid "Description of length {length} is over the {limit} char limit" msgstr "Länge der Beschreibung {length} übersteigt die zulässige Zeichenzahl {limit}" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Nicht 'disable:' zu den erzeugten Erstellungseinträgen hinzufügen" @@ -638,6 +668,11 @@ msgstr "Doppelter „%s“-Eintrag in Spiegelserver-Konfiguration!" msgid "Duplicate link in '{field}': {url}" msgstr "Link in „{field}” duplizieren: {url}" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "FEHLER: Der \"server\"-Unterbefehl wurde entfernt, verwende \"deploy\"!" @@ -808,6 +843,11 @@ msgstr "Ungültige versionCodes für einige Apps gefunden" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Mehrere JAR-Signaturzertifikate in {path} gefunden" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Found multiple Signer Certificates!" +msgstr "Mehrere Signaturzertifikate für das Repository gefunden." + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -872,6 +912,11 @@ msgstr "Git remote set-head fehlgeschlagen: \"%s\"" msgid "Git reset failed" msgstr "Git reset fehlgeschlagen" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git submodule deinit failed" +msgstr "Git submodule update fehlgeschlagen" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Git submodule sync fehlgeschlagen" @@ -1077,6 +1122,10 @@ msgstr "Fehlgeschlagener Build \"{apkfilename}\" behalten" msgid "Keystore for signing key:\t" msgstr "Schlüsselspeicher für den Signierschlüssel:\t" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1214,6 +1263,11 @@ msgstr "Keine Tags gefunden" msgid "No unsigned directory - nothing to do" msgstr "Kein unsigniertes Verzeichnis - nichts zu tun" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "keine Versionsinformation gefunden" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Keine gültige Größendefinition: \"{}\"" @@ -1372,6 +1426,11 @@ msgstr "Anmeldung an diesem Git-Repository durchführen" msgid "Pushing binary transparency log to {url}" msgstr "Binäres Transparenz-Log nach {url} pushen" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "Pushing to remote server failed!" +msgstr "Git remote set-head fehlgeschlagen: \"%s\"" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1405,6 +1464,11 @@ msgstr "Lesen von packageName/versionCode/versionName fehlgeschlagen,APK ungült msgid "Reading {apkfilename} from cache" msgstr "Lese {apkfilename} aus dem Cache" +#: ../fdroidserver/build.py +#, fuzzy +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "Abrufen der neuesten Version von Signaturen aus dem Web" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Entferne angegebene Dateien" @@ -1654,6 +1718,13 @@ msgstr "Es gibt eine Keyalias-Kollision - Veröffentlichung gestoppt" msgid "These are the apps that have been archived from the main repo." msgstr "Dies sind die Apps, die aus dem Hauptrepository archiviert wurden." +#: ../fdroidserver/mirror.py +#, fuzzy +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" +"FEHLER: Dieser Befehl sollte niemals verwendet werden, um f-droid.org zu spiegeln!\n" +"Ein vollständiger Spiegel von f-droid.org erfordert mehr als 200 GB." + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Dies ist eine Paketquelle für Anwendungen, die für die Benutzung zusammen mit F-Droid gedacht ist. Die darin enthaltenen Anwendungen sind entweder offizielle von den Entwicklern erstellte Binärdateien oder werden von f-droid.org mithilfe des Werkzeugs auf https://gitlab.com/fdroid aus dem Quellcode erstellt." @@ -1822,11 +1893,16 @@ msgstr "UpdateCheckData muss HTTPS-URL verwenden: {url}" msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData hat eine ungültige URL: {url}" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode ist gesetzt, aber likecheckupdates wurde vermutlich noch nicht ausgeführt" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +#, fuzzy +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "UpdateCheckMode ist gesetzt, aber likecheckupdates wurde vermutlich noch nicht ausgeführt" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName ist auf eine bekannte App-ID gesetzt, sie kann entfernt werden" @@ -1854,6 +1930,11 @@ msgstr "Syntax" msgid "Usage: %s\n" msgstr "Syntax: %s\n" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "Verwenden Sie /HEAD anstelle von /master, um auf eine Datei im Hauptzweig zu verweisen" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Verwenden Sie /HEAD anstelle von /master, um auf eine Datei im Hauptzweig zu verweisen" @@ -1883,6 +1964,11 @@ msgstr "Verwende APK-Signatur v2" msgid "Using APK Signature v3" msgstr "Verwende APK-Signatur v3" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Using JAR Signature" +msgstr "Verwende APK-Signatur v2" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Von Java jarsigner zur Verifikation von APKs wird abgeraten! Verwenden Sie apksigner" @@ -1940,6 +2026,10 @@ msgstr "Bei einer Konfiguration mit signierten Indizes, in dieser Phase nur unsi msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Beim Linting des gesamten Repositoriums wird yamllint standardmäßig deaktiviert. Diese Option erzwingt yamllint ungeachtet dessen." +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distinguished Name' zum Erzeugen von Schlüsseln" @@ -2089,6 +2179,11 @@ msgstr "widersprüchlicher Subparser: %s" msgid "could not parse '{path}'" msgstr "konnte '{path}' nicht parsen" +#: ../fdroidserver/common.py +#, fuzzy +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "konnte srclib-Spezifikation nicht parsen (keine ref angegeben): '{}'" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "konnte srclib-Spezifikation nicht parsen (keine ref angegeben): '{}'" @@ -2263,6 +2358,11 @@ msgstr "local_copy_dir muß ein Verzeichnis sein, keine Datei!" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "Spiegelserver '%s' ended nicht mit 'fdroid'!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "Legen Sie diese nun in der config.yml fest:" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2420,6 +2520,11 @@ msgstr "repo_icon \"repo/icons/%s\" existiert nicht, erzeuge Platzhalter." msgid "repo_url needs to end with /repo" msgstr "repo_url muss mit /repo enden" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml ist nicht installiert, kann Metadaten nicht schreiben." @@ -2434,6 +2539,11 @@ msgstr "s3cmd-Sync {path} indizieren auf {url} und dann löschen" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "Der Scanner-Cache ist fehlerhaft! Sie können ihn löschen mit: '{clear}'" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "local_copy_dir endet nicht auf \"fdroid\", meinten Sie stattdessen: \"{path}\"" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "dynamische Bibliothek" @@ -2638,6 +2748,31 @@ msgstr "{path} existiert nicht! Erstellen Sie es durch Ausführen von:" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} hat die schlechte Dateisignatur \"{pattern}\", möglicher Janus-Exploit!" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "Kein 'sdk_path' in 'config.yml' festgelegt!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2648,6 +2783,11 @@ msgstr "{path} hat Dateigröße Null!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} ist größer als 200MB und muss manuell auf {url} hochgeladen werden" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index c31a3ad5..544a7a63 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-04-10 18:44+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" @@ -106,6 +106,11 @@ msgstr[1] "la opción %(option)s requiere %(number)d argumentos" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: error: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -225,6 +230,11 @@ msgstr "no se encuentra /issues" msgid "A URL is required as an argument!" msgstr "¡Se requiere una URL como argumento!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "No se ha encontrado ningún certificado de firma en {path}" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Añadir las firmas PGP para los paquetes en el repositorio usando GnuPG" @@ -302,6 +312,11 @@ msgstr "La aplicación tiene archivos binarios, pero no las AllowedAPKSigningKey msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "La aplicación tiene NoSourceSince o ArchivePolicy \"0 versiones\", pero AutoUpdateMode o UpdateCheckMode no es Ninguno" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "La aplicación tiene NoSourceSince o ArchivePolicy \"0 versiones\", pero AutoUpdateMode o UpdateCheckMode no es Ninguno" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -398,6 +413,11 @@ msgstr "La categoría '%s' no es válida" msgid "Categories are not set" msgstr "No se han establecido categorías" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Buscar actualizaciones de aplicaciones" @@ -564,6 +584,16 @@ msgstr "La descripción tiene una lista (%s) pero no está estructurada (*) ni n msgid "Description of length {length} is over the {limit} char limit" msgstr "La descripción de longitud {length} supera el límite de caracteres, {limit}" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "No agregar 'disable:' a las entradas de compilaciones generadas" @@ -630,6 +660,11 @@ msgstr "¡Entrada duplicada \"%s\"en la configuración de los espejos!" msgid "Duplicate link in '{field}': {url}" msgstr "Enlace duplicado en '{field}': {url}" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERROR: ¡El subcomando \"server\" se ha eliminado. Use \"deploy\"!" @@ -800,6 +835,11 @@ msgstr "Se encontraron códigos de versión (versionCodes) inválidos para algun msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Encontrados varios ficheros de bloque de firma JAR en {path}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Found multiple Signer Certificates!" +msgstr "Encontrados varios certificados de firma para el repositorio." + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -864,6 +904,11 @@ msgstr "Git remote set-head falló: \"%s\"" msgid "Git reset failed" msgstr "Git reset falló" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git submodule deinit failed" +msgstr "La actualización del submodulo de Git falló" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "La sincronización del submodulo de Git falló" @@ -1069,6 +1114,10 @@ msgstr "Mantener la compilación fallida \"{apkfilename}\"" msgid "Keystore for signing key:\t" msgstr "Depósito de claves para la clave de firma de repositorio:\t" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1206,6 +1255,11 @@ msgstr "No se encontró ninguna etiqueta" msgid "No unsigned directory - nothing to do" msgstr "No hay directorio sin firma - nada que hacer" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "no se encontró información de la versión" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "No es una definición válida del tamaño: \"{}\"" @@ -1364,6 +1418,11 @@ msgstr "Pulse el registro a este repositorio remoto Git" msgid "Pushing binary transparency log to {url}" msgstr "Publicar el registro de transparencia binario en {url}" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "Pushing to remote server failed!" +msgstr "Git remote set-head falló: \"%s\"" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1397,6 +1456,11 @@ msgstr "Error al leer packageName/versionCode/versionName,APK inválido: '{apkfi msgid "Reading {apkfilename} from cache" msgstr "Leyendo {apkfilename} desde caché" +#: ../fdroidserver/build.py +#, fuzzy +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "obtener la última versión de las firmas de la web" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Removiendo archivos especificados" @@ -1646,6 +1710,13 @@ msgstr "Hay una colisión de keyalias - publicación detenida" msgid "These are the apps that have been archived from the main repo." msgstr "Estas son aplicaciones del repositorio principal que se han archivado." +#: ../fdroidserver/mirror.py +#, fuzzy +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" +"ERROR: ¡esta orden no se debería usar nunca para replicar f-droid.org!\n" +"Una réplica completa de f-droid.org requiere más de 200GB." + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Este es un repositorio de aplicaciones para usar con F-Droid. Las aplicaciones en este repositorio son binarios oficiales construidos por los desarrolladores originales de la aplicación, o son binarios creados a partir de su código fuente por f-droid.org utilizando las herramientas de https://gitlab.com/fdroid." @@ -1814,11 +1885,16 @@ msgstr "UpdateCheckData tiene que usar una URL HTTPS: {url}" msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData tiene una URL no válida: {url}" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode está configurado pero parece que aún no se han ejecutado las actualizaciones." +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +#, fuzzy +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "UpdateCheckMode está configurado pero parece que aún no se han ejecutado las actualizaciones." + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName está configurado con el ID de la aplicación conocida, se puede eliminar" @@ -1846,6 +1922,11 @@ msgstr "Utilización" msgid "Usage: %s\n" msgstr "Uso: %s\n" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "Use /HEAD en vez de /master para apuntar a un fichero en la rama por omisión" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Use /HEAD en vez de /master para apuntar a un fichero en la rama por omisión" @@ -1875,6 +1956,11 @@ msgstr "Utilizando Firma APK v2" msgid "Using APK Signature v3" msgstr "Utilizando firma APK v3" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Using JAR Signature" +msgstr "Utilizando Firma APK v2" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "¡Usando jarsigner de Java. No recomendado para verificar APKs! Use apksigner" @@ -1932,6 +2018,10 @@ msgstr "Cuando está configurado para índices firmados, crear solo índices sin msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Cuando se limpia el repositorio completo yamllint está deshabilitado por defecto. Esta opción fuerza yamllint a pesar de todo." +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Nombre Distintivo' (DN) usado al generar claves" @@ -2081,6 +2171,11 @@ msgstr "subanalizador del conflictivo:%s" msgid "could not parse '{path}'" msgstr "no se pudo procesar '{path}'" +#: ../fdroidserver/common.py +#, fuzzy +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "no se pudo procesar especificación srclib (sin especificar ref): '{}'" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "no se pudo procesar especificación srclib (sin especificar ref): '{}'" @@ -2255,6 +2350,11 @@ msgstr "¡local_copy_dir tiene que ser un directorio, no un fichero!" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "¡el espejo '%s' no termina en 'fdroid'!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "Ahora establezca lo siguiente en config.yml:" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2412,6 +2512,11 @@ msgstr "repo_icon \"repo/icons/%s\" no existe, generando placeholder." msgid "repo_url needs to end with /repo" msgstr "repo_url debe terminar con /repo" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml no instalado. No se pueden escribir metadatos." @@ -2426,6 +2531,11 @@ msgstr "s3cmd sync indexa {path} a {url} y elimina" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "¡El escaner de la cache está mal realizado! Puedes borrarlo con: '{clear}'" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "local_copy_dir no termina en \"fdroid\", tal vez quisiste decir: \"{path}\"" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "biblioteca compartida" @@ -2630,6 +2740,31 @@ msgstr "¡{path} no existe! Créela ejecutando:" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "¡{path} tiene una firma de fichero \"{pattern}\" mala, posible exploit Janus!" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "¡'sdk_path' no establecido en 'config.yml'!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2640,6 +2775,11 @@ msgstr "¡{path} está vacío!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} mayor de 200MB, subir manualmente: {url}" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index 26418f0b..66858ede 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2021-04-10 21:26+0000\n" "Last-Translator: Germe the fur star \n" "Language-Team: Spanish (Argentina) \n" @@ -95,6 +95,11 @@ msgstr[1] "" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: error: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -214,6 +219,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py #, fuzzy msgid "Add PGP signatures using GnuPG for packages in repo" @@ -294,6 +304,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -390,6 +404,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Buscar actualizaciones de las aplicaciones" @@ -560,6 +579,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -626,6 +655,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -792,6 +826,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -856,6 +894,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1062,6 +1104,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "Ruta al almacén de claves para la llave de firmado del repositorio" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1200,6 +1246,11 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "¡Se encontró una excepción desconocida!" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1360,6 +1411,10 @@ msgstr "Subir el registro al repositorio remoto de git" msgid "Pushing binary transparency log to {url}" msgstr "Actualizar el registro de transparencia binario de {url}" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1393,6 +1448,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1642,6 +1701,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1803,11 +1866,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1835,6 +1902,10 @@ msgstr "Uso" msgid "Usage: %s\n" msgstr "Uso: %s\n" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1864,6 +1935,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1921,6 +1996,10 @@ msgstr "Si está configurado para índices firmados, crear sólo índices sin fi msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py #, fuzzy msgid "X.509 'Distinguished Name' used when generating keys" @@ -2073,6 +2152,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2249,6 +2332,11 @@ msgstr "directorio_copia_local tiene que ser un directorio, ¡no un archivo!" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2409,6 +2497,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2423,6 +2516,11 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "local_copy_dir no termina en \"fdroid\", quizá quiso escribir: \"{path}\"" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "librería compartida" @@ -2627,6 +2725,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2637,6 +2760,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/es_MX/LC_MESSAGES/fdroidserver.po b/locale/es_MX/LC_MESSAGES/fdroidserver.po index b0c6123e..03f0a510 100644 --- a/locale/es_MX/LC_MESSAGES/fdroidserver.po +++ b/locale/es_MX/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2020-04-29 12:49+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Spanish (Mexico) \n" @@ -91,6 +91,11 @@ msgstr[1] "" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: error: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -210,6 +215,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -287,6 +297,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -383,6 +397,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "" @@ -553,6 +572,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -619,6 +648,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -785,6 +819,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -849,6 +887,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1054,6 +1096,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1191,6 +1237,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1349,6 +1399,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1382,6 +1436,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1631,6 +1689,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1792,11 +1854,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1824,6 +1890,10 @@ msgstr "" msgid "Usage: %s\n" msgstr "" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1853,6 +1923,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1910,6 +1984,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2059,6 +2137,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2233,6 +2315,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2391,6 +2478,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2405,6 +2497,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2609,6 +2705,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2619,6 +2740,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/eu/LC_MESSAGES/fdroidserver.po b/locale/eu/LC_MESSAGES/fdroidserver.po index 25abf06a..c76db7fb 100644 --- a/locale/eu/LC_MESSAGES/fdroidserver.po +++ b/locale/eu/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -89,6 +89,11 @@ msgstr[1] "" msgid "%(prog)s: error: %(message)s\n" msgstr "" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -208,6 +213,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -285,6 +295,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -381,6 +395,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "" @@ -547,6 +566,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -613,6 +642,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -779,6 +813,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -843,6 +881,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1048,6 +1090,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1185,6 +1231,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1343,6 +1393,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1376,6 +1430,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1625,6 +1683,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1786,11 +1848,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1818,6 +1884,10 @@ msgstr "" msgid "Usage: %s\n" msgstr "" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1847,6 +1917,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1904,6 +1978,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2053,6 +2131,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2227,6 +2309,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2384,6 +2471,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2398,6 +2490,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2602,6 +2698,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2612,6 +2733,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index 91ef57e3..56d5ea98 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2023-08-08 22:56+0000\n" "Last-Translator: HM \n" "Language-Team: Persian \n" @@ -93,6 +93,11 @@ msgstr[1] "گزینه %(option)s نیاز به آرگومان‌های %(number) msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: خطا: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -212,6 +217,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -289,6 +299,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -385,6 +399,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "به‌روزرسانی‌ها برای برنامه‌ها را بررسی می‌کند" @@ -551,6 +570,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -617,6 +646,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -783,6 +817,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -847,6 +885,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1052,6 +1094,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1189,6 +1235,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1347,6 +1397,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1380,6 +1434,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1629,6 +1687,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1790,11 +1852,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1822,6 +1888,10 @@ msgstr "استفاده" msgid "Usage: %s\n" msgstr "مصرف: %s\n" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1851,6 +1921,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1908,6 +1982,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2057,6 +2135,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2232,6 +2314,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2390,6 +2477,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2404,6 +2496,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2608,6 +2704,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "'sdk_path' تنظیم نشده است در config.yml!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2618,6 +2739,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/fdroidserver.pot b/locale/fdroidserver.pot index 354c4ea9..3829af39 100644 --- a/locale/fdroidserver.pot +++ b/locale/fdroidserver.pot @@ -5,9 +5,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" +"Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -91,6 +91,11 @@ msgstr[1] "" msgid "%(prog)s: error: %(message)s\n" msgstr "" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -210,6 +215,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -287,6 +297,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -383,6 +397,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "" @@ -549,6 +568,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -615,6 +644,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -781,6 +815,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -845,6 +883,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1050,6 +1092,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1187,6 +1233,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1345,6 +1395,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1378,6 +1432,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1627,6 +1685,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1788,6 +1850,10 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." +msgstr "" + #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" @@ -1820,6 +1886,10 @@ msgstr "" msgid "Usage: %s\n" msgstr "" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1849,6 +1919,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1906,6 +1980,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2055,6 +2133,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2229,6 +2311,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2386,6 +2473,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2400,6 +2492,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2604,6 +2700,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2614,6 +2735,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index d6752c20..d65eb248 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2021-08-23 01:29+0000\n" "Last-Translator: Kaantaja \n" "Language-Team: Finnish \n" @@ -91,6 +91,11 @@ msgstr[1] "" msgid "%(prog)s: error: %(message)s\n" msgstr "" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -210,6 +215,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -287,6 +297,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -383,6 +397,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "" @@ -549,6 +568,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -615,6 +644,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -781,6 +815,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -845,6 +883,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1050,6 +1092,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1187,6 +1233,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1345,6 +1395,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1378,6 +1432,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1627,6 +1685,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1788,11 +1850,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1820,6 +1886,10 @@ msgstr "" msgid "Usage: %s\n" msgstr "" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1849,6 +1919,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1906,6 +1980,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2055,6 +2133,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2229,6 +2311,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2386,6 +2473,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2400,6 +2492,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2604,6 +2700,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2614,6 +2735,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index c4c088c7..81d9a653 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -39,7 +39,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: French \n" @@ -128,6 +128,11 @@ msgstr[1] "L'option %(option)s requiert %(number)d arguments" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s : erreur : %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -247,6 +252,11 @@ msgstr "/issues est manquant" msgid "A URL is required as an argument!" msgstr "Une URL est requise en argument !" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "Aucun certificat signé trouvé dans {path}" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Ajouter des signatures PGP avec GnuPG pour les paquets dans le dépôt" @@ -324,6 +334,11 @@ msgstr "L’application possède des fichiers binaires mais n'a pas les AllowedA msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "L'application a NoSourceSince ou ArchivePolicy « 0 version » mais AutoUpdateMode ou UpdateCheckMode ne valent pas None" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "L'application a NoSourceSince ou ArchivePolicy « 0 version » mais AutoUpdateMode ou UpdateCheckMode ne valent pas None" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -420,6 +435,11 @@ msgstr "Catégories « %s » invalides" msgid "Categories are not set" msgstr "Catégories non définies" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Vérifier les mises à jour pour les applications" @@ -586,6 +606,16 @@ msgstr "La description contient une liste (%s) mais ce n'est ni une liste à puc msgid "Description of length {length} is over the {limit} char limit" msgstr "La longueur de la description {length} dépasser la limite du nombre de caractères autorisés {limit}" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Ne pas ajouter \"disable:\" aux entrées générées" @@ -652,6 +682,11 @@ msgstr "Entrée doublon \"%s\" dans le paramétrage des miroirs !" msgid "Duplicate link in '{field}': {url}" msgstr "Lien dupliqué dans « {field} » : {url}" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERREUR : La sous-commande \"server\" a été supprimée, utilisez plutôt \"deploy\" !" @@ -822,6 +857,11 @@ msgstr "Code de version invalide trouvée pour certaines application" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Plusieurs fichiers de bloc de signature JAR trouvé à {path}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Found multiple Signer Certificates!" +msgstr "Plusieurs certificats de signature ont étés trouvés pour le référentiel." + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -886,6 +926,11 @@ msgstr "Impossible de définir la branche par défaut du Git distant : \"%s\"" msgid "Git reset failed" msgstr "Reset de Git échouée" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git submodule deinit failed" +msgstr "Échec de la mise à jour du sous-module Git" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Synchronisation du submodule Git échoué" @@ -1091,6 +1136,10 @@ msgstr "Conserver la version ayant échoué « {apkfilename} »" msgid "Keystore for signing key:\t" msgstr "Stockage des clés signée :\t" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1228,6 +1277,11 @@ msgstr "Aucune étiquette trouvée" msgid "No unsigned directory - nothing to do" msgstr "Aucun dossier non signé — il n'y a rien à faire" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "aucune information sur la version n’a été trouvée" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Définition de la taille invalide : \"{}\"" @@ -1386,6 +1440,11 @@ msgstr "Envoyer les logs dans ce dépôt git distant" msgid "Pushing binary transparency log to {url}" msgstr "Envoyer les logs de transparence de la compilation vers {url}" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "Pushing to remote server failed!" +msgstr "Impossible de définir la branche par défaut du Git distant : \"%s\"" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1419,6 +1478,11 @@ msgstr "La lecture de packageName/versionCode/versionName a échoué, APK invali msgid "Reading {apkfilename} from cache" msgstr "Lecture de {apkfilename} à partir du cache" +#: ../fdroidserver/build.py +#, fuzzy +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "recupération de la dernière version des signatures depuis le web" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Suppression des fichiers spécifiés" @@ -1668,6 +1732,13 @@ msgstr "Il y a une collision de keyalias — publication interrompue" msgid "These are the apps that have been archived from the main repo." msgstr "Voici les applications qui ont été archivées à partir du dépôt principal." +#: ../fdroidserver/mirror.py +#, fuzzy +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" +"ERREUR : cette commande ne devrait jamais être utilisée pour copier f-droid.org !\n" +"Une copie de f-droid.org occupe plus de 200GB." + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Ceci est un dépôt d’applications à utiliser avec FDroid. Les applications publiées dans ce dépôt sont soit les binaires officiels compilés par les développeurs de ces applications, soit celles compilées par f-droid.org à partir des sources en utilisant les outils disponibles sur https://gitlab.com/fdroid." @@ -1838,11 +1909,16 @@ msgstr "UpdateCheckData doit utiliser une URL HTTPS : {url}" msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData URL non valide : {url}" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode est configuré mais on dirait que checkupdates n'a pas encore été lancé" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +#, fuzzy +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "UpdateCheckMode est configuré mais on dirait que checkupdates n'a pas encore été lancé" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName est défini sur l’ID d’application connu, il peut être supprimé" @@ -1870,6 +1946,11 @@ msgstr "Usage" msgid "Usage: %s\n" msgstr "Usage : %s\n" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "Utiliser /HEAD plutôt que /master pour pointer un fichier dans la branche par défaut" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Utiliser /HEAD plutôt que /master pour pointer un fichier dans la branche par défaut" @@ -1899,6 +1980,11 @@ msgstr "Utilisation de la signature d'APK v2" msgid "Using APK Signature v3" msgstr "Utilisation de la signature d'APK v3" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Using JAR Signature" +msgstr "Utilisation de la signature d'APK v2" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "L'utilisation de l'utilitaire jarsigner de Java n'est pas recommandé pour vérifier les APKs ! Utiliser apksigner" @@ -1956,6 +2042,10 @@ msgstr "Lorsqu'il est configuré pour les index signés, ne créez que des index msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Lors du linting, tout le dépôt yamllint est désactivé par défaut. Cette option force yamllint malgré tout." +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Nom distingué' utilisé lors de la génération des clés" @@ -2105,6 +2195,11 @@ msgstr "conflit de subparser : %s" msgid "could not parse '{path}'" msgstr "impossible de lire '{path}'" +#: ../fdroidserver/common.py +#, fuzzy +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "impossible d'analyser la spécification srclib (pas de référence spécifiée) : '{}'" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "impossible d'analyser la spécification srclib (pas de référence spécifiée) : '{}'" @@ -2279,6 +2374,11 @@ msgstr "local_copy_dir doit être un dossier et non un fichier !" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "le miroir «%s» ne se termine pas par «fdroid» !" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "Maintenant, définissez-les dans config.yml :" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2436,6 +2536,11 @@ msgstr "repo_icon \"repo/icons/%s\" n'existe pas, génération d'une icône de s msgid "repo_url needs to end with /repo" msgstr "repo_url doit se terminer par /repo" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml n’est pas installé, impossible d’écrire les métadonnées." @@ -2450,6 +2555,11 @@ msgstr "s3cmd synchroniser les index de {path} vers {url} et les supprimer" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "l'analyse du cache est mal formée ! Vous pouvez le nettoyer avec : '{clear}'" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "local_copy_dir ne semble pas se terminer avec \"fdroid\", peut être voulez-vous dire : \"{path}\"" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "bibliothèque partagée" @@ -2654,6 +2764,31 @@ msgstr "{path} n’existe pas ! Créez-le en exécutant :" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} a une mauvaise signature de fichier \"{pattern}\", possibilité d'une faille Janus !" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "'sdk_path' n'est pas configuré dans 'config.yml' !" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2664,6 +2799,11 @@ msgstr "{path} a une taille nulle !" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} supérieur à 200MB, envoi manuel : {url}" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/fy/LC_MESSAGES/fdroidserver.po b/locale/fy/LC_MESSAGES/fdroidserver.po index 24e158fd..ddf37f55 100644 --- a/locale/fy/LC_MESSAGES/fdroidserver.po +++ b/locale/fy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2021-07-01 15:29+0000\n" "Last-Translator: Vancha March \n" "Language-Team: Frisian \n" @@ -90,6 +90,11 @@ msgstr[1] "" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: flater: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -209,6 +214,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -286,6 +296,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -382,6 +396,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Kontrolearje op fernijingen fan applikaasjes" @@ -548,6 +567,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -614,6 +643,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -780,6 +814,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -844,6 +882,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1049,6 +1091,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1186,6 +1232,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1344,6 +1394,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1377,6 +1431,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1626,6 +1684,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1787,11 +1849,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1819,6 +1885,10 @@ msgstr "Gebrûk" msgid "Usage: %s\n" msgstr "Gebrûk: %s\n" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1848,6 +1918,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1905,6 +1979,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2054,6 +2132,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2228,6 +2310,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2386,6 +2473,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2400,6 +2492,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2604,6 +2700,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2614,6 +2735,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/he/LC_MESSAGES/fdroidserver.po b/locale/he/LC_MESSAGES/fdroidserver.po index 56a3b6a9..72a5e312 100644 --- a/locale/he/LC_MESSAGES/fdroidserver.po +++ b/locale/he/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2023-09-21 08:05+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" @@ -91,6 +91,11 @@ msgstr[1] "" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: שגיאה: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -210,6 +215,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -287,6 +297,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -383,6 +397,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "איתור עדכונים ליישומונים" @@ -549,6 +568,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -615,6 +644,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -781,6 +815,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -845,6 +883,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1050,6 +1092,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1187,6 +1233,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1345,6 +1395,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1378,6 +1432,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1627,6 +1685,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1788,11 +1850,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1820,6 +1886,10 @@ msgstr "שימוש" msgid "Usage: %s\n" msgstr "שימוש: %s\n" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1849,6 +1919,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1906,6 +1980,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2055,6 +2133,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2229,6 +2311,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2386,6 +2473,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2400,6 +2492,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2604,6 +2700,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2614,6 +2735,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/hi/LC_MESSAGES/fdroidserver.po b/locale/hi/LC_MESSAGES/fdroidserver.po index c22eb7f6..48764286 100644 --- a/locale/hi/LC_MESSAGES/fdroidserver.po +++ b/locale/hi/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2023-02-22 11:24+0000\n" "Last-Translator: Saurmandal \n" "Language-Team: Hindi \n" @@ -91,6 +91,11 @@ msgstr[1] "" msgid "%(prog)s: error: %(message)s\n" msgstr "" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -210,6 +215,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -287,6 +297,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -383,6 +397,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "अनुप्रयोगों के अपडेट के लिए जाँच करें" @@ -549,6 +568,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -615,6 +644,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -781,6 +815,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -845,6 +883,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1050,6 +1092,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1187,6 +1233,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1345,6 +1395,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1378,6 +1432,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1627,6 +1685,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1788,11 +1850,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1820,6 +1886,10 @@ msgstr "प्रयोग" msgid "Usage: %s\n" msgstr "प्रयोग: %s\n" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1849,6 +1919,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1906,6 +1980,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2055,6 +2133,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2229,6 +2311,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2387,6 +2474,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2401,6 +2493,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2605,6 +2701,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2615,6 +2736,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index 6d8924ed..e5b334ae 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Hungarian \n" @@ -96,6 +96,11 @@ msgstr[1] "A(z) %(option)s kapcsoló %(number)d argumentumot igényel" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: hiba: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -215,6 +220,11 @@ msgstr "a /issues hiányzik" msgid "A URL is required as an argument!" msgstr "Az URL argumentumként megadása szükséges." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "Nem található aláíró-tanúsítvány itt: {path}" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "PGP aláírások hozzáadása GnuPG segítségével a tároló csomagjaihoz" @@ -292,6 +302,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -388,6 +402,11 @@ msgstr "A(z) „%s” kategória érvénytelen" msgid "Categories are not set" msgstr "A kategóriák nincsenek megadva" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Alkalmazásfrissítések keresése" @@ -555,6 +574,16 @@ msgstr "A leírás listát (%s) tartalmaz, de nem pontozott (*) vagy számozott msgid "Description of length {length} is over the {limit} char limit" msgstr "A leírás {length} karakteres hossza több, mint a {limit} karakteres korlát" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Ne adja a hozzá a „disable:” szöveget az előállított összeállítási elemekhez" @@ -621,6 +650,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "Ismételt hivatkozás a(z) „{field}” mezőben: {url}" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "HIBA: A „server” alparancs eltávolításra került, használja ezt: „deploy”!" @@ -792,6 +826,11 @@ msgstr "Egyes alkalmazásoknál érvénytelen versionCode paraméterek találhat msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Több JAR aláírásblokkfájl található itt: {path}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Found multiple Signer Certificates!" +msgstr "Több aláíró-tanúsítvány található a tárolóhoz." + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -857,6 +896,11 @@ msgstr "A git távoli fej beállítás sikertelen: „%s”" msgid "Git reset failed" msgstr "A git helyreállítás sikertelen" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git submodule deinit failed" +msgstr "A git almodul frissítése sikertelen" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "A git almodul szinkronizációs sikertelen" @@ -1062,6 +1106,10 @@ msgstr "A minSdkVersion olvasása sikertelen: „{apkfilename}”" msgid "Keystore for signing key:\t" msgstr "Kulcstároló az aláírókulcshoz:\t" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1201,6 +1249,11 @@ msgstr "Nem található csatolt eszköz" msgid "No unsigned directory - nothing to do" msgstr "Nincs aláíratlan könyvtár – nincs teendő" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "Nem található információ." + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Nem érvényes méretmegadás: „{}”" @@ -1359,6 +1412,11 @@ msgstr "A napló beküldése ebbe a távoli git tárolóba" msgid "Pushing binary transparency log to {url}" msgstr "A bináris átláthatósági napló beküldése ide: {url}" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "Pushing to remote server failed!" +msgstr "A git távoli fej beállítás sikertelen: „%s”" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1392,6 +1450,10 @@ msgstr "A packageName/versionCode/versionName olvasása sikertelen, az APK érv msgid "Reading {apkfilename} from cache" msgstr "A(z) {apkfilename} olvasása gyorsítótárból" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Megadott fájlok eltávolítása" @@ -1642,6 +1704,13 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +#, fuzzy +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" +"HIBA: a parancsot sose használja az f-droid.org tükrözéséhez.\n" +"Az f-droid.org teljes tükrözéséhez több mint 200 GB tárhely szükséges." + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1803,11 +1872,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1835,6 +1908,10 @@ msgstr "Használat" msgid "Usage: %s\n" msgstr "Használat: %s\n" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1864,6 +1941,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1921,6 +2002,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2070,6 +2155,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2245,6 +2334,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "Most adja meg ezeket a config.yml fájlban:" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2403,6 +2497,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2417,6 +2516,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2621,6 +2724,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "Az „sdk_path” nincs megadva a „config.yml” fájlban." + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2631,6 +2759,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{path}: {error}" diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index 9d535001..8c277b3a 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2021-06-23 23:32+0000\n" "Last-Translator: whenwesober \n" "Language-Team: Indonesian \n" @@ -95,6 +95,11 @@ msgstr[0] "opsi %(option)s memerlukan argumen sebanyak %(number)d" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: galat: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -214,6 +219,11 @@ msgstr "/issues tidak ada" msgid "A URL is required as an argument!" msgstr "URL diperlukan sebagai argumen!" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Tambah tanda tangan PGP menggunakan GnuPG untuk paket di repo" @@ -291,6 +301,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -386,6 +400,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Periksa pembaruan pada aplikasi" @@ -552,6 +571,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -618,6 +647,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -784,6 +818,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -848,6 +886,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1053,6 +1095,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1190,6 +1236,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1348,6 +1398,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1381,6 +1435,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1629,6 +1687,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1790,11 +1852,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1822,6 +1888,10 @@ msgstr "Penggunaan" msgid "Usage: %s\n" msgstr "Penggunaan: %s\n" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1851,6 +1921,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1908,6 +1982,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2056,6 +2134,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2229,6 +2311,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2387,6 +2474,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2401,6 +2493,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2604,6 +2700,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "'sdk_path' belum diatur di config.yml!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2614,6 +2735,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 02e9243c..ef898753 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-04-13 17:01+0000\n" "Last-Translator: Random \n" "Language-Team: Italian \n" @@ -110,6 +110,11 @@ msgstr[1] "l'opzione %(option)s richiede gli argomenti %(number)d" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: errore: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -229,6 +234,11 @@ msgstr "/issues è mancante" msgid "A URL is required as an argument!" msgstr "È richiesto un URL come argomento!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "Nessun certificato di firma trovato in {path}" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Aggiungi firme PGP con GnuPG per i pacchetti in un repository" @@ -306,6 +316,11 @@ msgstr "L'app ha Binaries ma non ha AllowedAPKSigningKeys corrispondente per fis msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "L'app ha NoSourceSince o ArchivePolicy \"0 versioni\" ma AutoUpdateMode o UpdateCheckMode non sono None" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "L'app ha NoSourceSince o ArchivePolicy \"0 versioni\" ma AutoUpdateMode o UpdateCheckMode non sono None" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -402,6 +417,11 @@ msgstr "La categoria \"%s\" non è valida" msgid "Categories are not set" msgstr "Le categorie non sono impostate" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Cerca gli aggiornamenti delle applicazioni" @@ -568,6 +588,16 @@ msgstr "La descrizione ha un elenco (%s) ma non è puntato (*) né numerato (#)" msgid "Description of length {length} is over the {limit} char limit" msgstr "La descrizione di lunghezza {length} supera il limite di {limit} caratteri" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Non aggiungere 'disable:' alle voci di compilazione generate" @@ -634,6 +664,11 @@ msgstr "Voce \"%s\" duplicata nella configurazione dei mirror!" msgid "Duplicate link in '{field}': {url}" msgstr "Link duplicato in '{field}': {url}" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERRORE: il sottocomando \"server\" è stato rimosso, usa \"deploy\"!" @@ -804,6 +839,11 @@ msgstr "Trovati codici di versione non validi per alcune app" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Trovati più file di blocco della firma JAR in {path}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Found multiple Signer Certificates!" +msgstr "Trovati più certificati di firma per il repository." + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -868,6 +908,11 @@ msgstr "Set-head remoto Git non riuscito: \"%s\"" msgid "Git reset failed" msgstr "Ripristino Git non riuscito" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git submodule deinit failed" +msgstr "Aggiornamento del sottomodulo Git non riuscito" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Sincronizzazione del sottomodulo Git non riuscita" @@ -1073,6 +1118,10 @@ msgstr "Mantenimento della build fallita \"{apkfilename}\"" msgid "Keystore for signing key:\t" msgstr "Keystore per la firma della chiave:\t" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1210,6 +1259,11 @@ msgstr "Nessuna etichetta trovata" msgid "No unsigned directory - nothing to do" msgstr "Nessuna directory non firmata - niente da fare" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "nessuna informazione sulla versione trovata" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Definizione di dimensione non valida: \"{}\"" @@ -1368,6 +1422,11 @@ msgstr "Esegui il push del log in questo repository git remoto" msgid "Pushing binary transparency log to {url}" msgstr "Invio del log di trasparenza binaria su {url}" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "Pushing to remote server failed!" +msgstr "Set-head remoto Git non riuscito: \"%s\"" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1401,6 +1460,11 @@ msgstr "Lettura di packageName/versionCode/versionName non riuscita, APK non val msgid "Reading {apkfilename} from cache" msgstr "Lettura di {apkfilename} dalla cache" +#: ../fdroidserver/build.py +#, fuzzy +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "recupera l'ultima versione delle firme dal web" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Rimozione dei file specificati" @@ -1650,6 +1714,13 @@ msgstr "C'è una collisione keyalias - pubblicazione interrotta" msgid "These are the apps that have been archived from the main repo." msgstr "Queste sono le applicazioni che sono state archiviate dal repo principale." +#: ../fdroidserver/mirror.py +#, fuzzy +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" +"ERRORE: questo comando non deve mai essere utilizzato per il mirror f-droid.org!\n" +"L’intero mirror di f-droid.org richiede più di 200GB." + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Questo è un repository di applicazioni da utilizzare con F-Droid. Le applicazioni in questo repository sono o binari ufficiali compilati dagli sviluppatori dell'applicazione originale, o sono binari compilati dai sorgenti dall'amministratore di f-droid.org usando gli strumenti su https://gitlab.com/fdroid." @@ -1818,11 +1889,16 @@ msgstr "UpdateCheckData deve usare l'URL HTTPS: {url}" msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData non è un URL valido: {url}" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode impostato ma sembra che checkupdates non sia ancora stato eseguito." +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +#, fuzzy +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "UpdateCheckMode impostato ma sembra che checkupdates non sia ancora stato eseguito." + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName è impostato sull'ID dell'applicazione nota, può essere rimosso" @@ -1850,6 +1926,11 @@ msgstr "Uso" msgid "Usage: %s\n" msgstr "Utilizzo: %s\n" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "Usare /HEAD invece di /master per puntare a un file nel ramo predefinito" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Usare /HEAD invece di /master per puntare a un file nel ramo predefinito" @@ -1879,6 +1960,11 @@ msgstr "Usare la firma APK v2" msgid "Using APK Signature v3" msgstr "Usare la firma APK v3" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Using JAR Signature" +msgstr "Usare la firma APK v2" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Utilizzando jarsigner di Java, non raccomandato per verificare APK! Utilizzare apksigner" @@ -1936,6 +2022,10 @@ msgstr "Se configurato per indici firmati, crea solo indici senza segno in quest msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Quando linting l'intero repository yamllint è disabilitato per impostazione predefinita. Questa opzione costringe yamllint a prescindere." +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distinguished Name' usato quando si generano le chiavi" @@ -2085,6 +2175,11 @@ msgstr "subparser in conflitto: %s" msgid "could not parse '{path}'" msgstr "non ha potuto analizzare '{path}'" +#: ../fdroidserver/common.py +#, fuzzy +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "non ha potuto analizzare la specifica srclib (nessun riferimento specificato): '{}'" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "non ha potuto analizzare la specifica srclib (nessun riferimento specificato): '{}'" @@ -2259,6 +2354,11 @@ msgstr "local_copy_dir deve essere una cartella, non un file!" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "il mirror '%s' non finisce con 'fdroid'!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "Ora imposta i seguenti campi in config.yml:" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2416,6 +2516,11 @@ msgstr "repo_icon \"repo/icons/%s\" non esiste, genera un segnaposto." msgid "repo_url needs to end with /repo" msgstr "Il repo_url deve terminare con /repo" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml non installato, non può scrivere metadati." @@ -2430,6 +2535,11 @@ msgstr "s3cmd sincronizza gli indici {path} con {url} e cancella" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "la cache dello scanner è malformata! Puoi svuotarla con: '{clear}'" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "local_copy_dir not finisce con \"fdroid\", forse intendevi: \"{path}\"" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "libreria condivisa" @@ -2634,6 +2744,31 @@ msgstr "{path} non esiste! Crealo eseguendo:" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} ha una cattiva firma di file \"{pattern}\", possibile exploit di Janus!" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "\"sdk_path\" non impostato in config.yml!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2644,6 +2779,11 @@ msgstr "{path} è di dimensioni zero!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} più di 200MB, caricare manualmente: {url}" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index fc8bfd8b..b814270a 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2021-01-15 13:25+0000\n" "Last-Translator: R_SACI \n" "Language-Team: Kabyle \n" @@ -92,6 +92,11 @@ msgstr[1] "" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: tuccḍa: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -211,6 +216,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -288,6 +298,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -384,6 +398,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "" @@ -551,6 +570,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -617,6 +646,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -783,6 +817,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -848,6 +886,11 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git submodule deinit failed" +msgstr "Asfaḍ Git yecceḍ" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1053,6 +1096,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1190,6 +1237,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1348,6 +1399,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1381,6 +1436,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1630,6 +1689,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1791,11 +1854,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1823,6 +1890,10 @@ msgstr "Aseqdec" msgid "Usage: %s\n" msgstr "Aseqdec: %s\n" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1852,6 +1923,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1909,6 +1984,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2058,6 +2137,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2232,6 +2315,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2390,6 +2478,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2404,6 +2497,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2608,6 +2705,31 @@ msgstr "{path} ur yelli ara! Rnu-t s uselkem:" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "'sdk_path' ur yettwasbadu ara 'config.yml'!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2618,6 +2740,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index a0692cd8..167fd824 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Korean \n" @@ -94,6 +94,11 @@ msgstr[0] "%(option)s 옵션은 %(number)d 인자가 필요합니다" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: 오류: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -213,6 +218,11 @@ msgstr "/이슈가 없습니다" msgid "A URL is required as an argument!" msgstr "URL은 인수로서 필요합니다!" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "저장소의 패키지를 위해 GnuPG를 사용하여 PGP 서명을 추가합니다" @@ -290,6 +300,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -385,6 +399,11 @@ msgstr "카테고리 '%s'는 올바르지 않습니다" msgid "Categories are not set" msgstr "카테고리가 설정되어 있지 않습니다" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "애플리케이션으로의 업데이트를 확인합니다" @@ -551,6 +570,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -617,6 +646,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -783,6 +817,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -848,6 +886,11 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git submodule deinit failed" +msgstr "git svn 복제에 실패됨" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1053,6 +1096,10 @@ msgstr "삭제 중: repo/{apkfilename}" msgid "Keystore for signing key:\t" msgstr "서명 키를 위한 키저장소:\t" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1190,6 +1237,11 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "버전 정보를 찾지 못했습니다" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1348,6 +1400,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1381,6 +1437,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1629,6 +1689,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1790,11 +1854,15 @@ msgstr "UpdateCheckData는 HTTPS URL을 사용해야 합니다: {url}" msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData는 올바른 URL이 아닙니다: {url}" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1822,6 +1890,10 @@ msgstr "사용법" msgid "Usage: %s\n" msgstr "사용법: %s\n" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1851,6 +1923,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Java의 jarsigner를 사용하여, APK를 검증하는 것은 권장되지 않습니다! apksigner를 사용하세요" @@ -1908,6 +1984,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2056,6 +2136,10 @@ msgstr "충돌하는 옵션 문자열: %s" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2230,6 +2314,11 @@ msgstr "local_copy_dir는 파일이 아니라, 디렉터리여야 합니다!" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "미러 '%s'는 'fdroid'로 끝나지 않습니다!" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2388,6 +2477,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2402,6 +2496,10 @@ msgstr "s3cmd 동기화는 {url}로 {path}를 색인하고 삭제합나다" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2605,6 +2703,31 @@ msgstr "{path}는 존재하지 않습니다! 실행하여 그것을 만드세 msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "'sdk_path'가 config.yml에서 설정되어 있지 않습니다!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2615,6 +2738,11 @@ msgstr "{path}는 영 크기입니다!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/ml/LC_MESSAGES/fdroidserver.po b/locale/ml/LC_MESSAGES/fdroidserver.po index d1c63023..bb66da35 100644 --- a/locale/ml/LC_MESSAGES/fdroidserver.po +++ b/locale/ml/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2023-06-23 14:52+0000\n" "Last-Translator: abe1242 \n" "Language-Team: Malayalam \n" @@ -95,6 +95,11 @@ msgstr[1] "" msgid "%(prog)s: error: %(message)s\n" msgstr "" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -214,6 +219,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -291,6 +301,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -387,6 +401,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "" @@ -553,6 +572,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -619,6 +648,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -785,6 +819,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -849,6 +887,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1054,6 +1096,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1191,6 +1237,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1349,6 +1399,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1382,6 +1436,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1631,6 +1689,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1795,11 +1857,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1827,6 +1893,10 @@ msgstr "" msgid "Usage: %s\n" msgstr "" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1856,6 +1926,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1913,6 +1987,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2062,6 +2140,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2236,6 +2318,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2393,6 +2480,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2407,6 +2499,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2611,6 +2707,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2621,6 +2742,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index 6a6f3adf..2108b5d6 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Norwegian Bokmål \n" @@ -97,6 +97,11 @@ msgstr[1] "%(option)s-valget krever %(number)d argumenter" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: feil: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -219,6 +224,11 @@ msgstr "/issues mangler" msgid "A URL is required as an argument!" msgstr "valg -%s krever et argument" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "Ingen signeringssertifikater funnet i {path}" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Legg til PGP-signaturer for pakker i pakkebrønnen ved bruk av GnuPG" @@ -297,6 +307,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -395,6 +409,11 @@ msgstr "Kategorien '%s' er ikke gyldig" msgid "Categories are not set" msgstr "Kategoreier ikke satt" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Se etter programoppdateringer" @@ -568,6 +587,16 @@ msgstr "Beskrivelsen har en liste (%s), men er ikke punktvis (*) eller nummerert msgid "Description of length {length} is over the {limit} char limit" msgstr "Beskrivelse av lengde {length} overstiger {limit} tegngrensen" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Ikke legg til «deaktivert:» blant genererte bygg" @@ -636,6 +665,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "Dobbeltlenke i \"{field}\": {url}" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py #, fuzzy msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -814,6 +848,11 @@ msgstr "Noen programmer ble funnet å ha ugldige versionCodes" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Fant flere signeringssertifikater i {path}." +#: ../fdroidserver/common.py +#, fuzzy +msgid "Found multiple Signer Certificates!" +msgstr "Fant flere signeringssertifikater for pakkebrønn." + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -880,6 +919,11 @@ msgstr "Git set-head annensteds hen mislyktes: «%s»" msgid "Git reset failed" msgstr "Git-tilbakestilling mislyktes" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git submodule deinit failed" +msgstr "Git-oppdatering av undermodul mislyktes" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Git-synkronisering av undermodul mislyktes" @@ -1093,6 +1137,10 @@ msgstr "Kunne ikke lese minSdkVersion: \"{apkfilename}\"" msgid "Keystore for signing key:\t" msgstr "Nøkkellager for signeringsnøkkel:\t" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1238,6 +1286,11 @@ msgstr "Fant ingen tilknyttede enheter" msgid "No unsigned directory - nothing to do" msgstr "Ingen usignert mappe - ingenting å gjøre" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "ingen versjonsinfo funnet!" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Ikke en gyldig størrelsesdefinisjon: «{}»" @@ -1404,6 +1457,11 @@ msgstr "Dytt loggen til denne Git-pakkebrønnen annensteds hen" msgid "Pushing binary transparency log to {url}" msgstr "Dytter binærgjennomsiktighetslogg til {url}." +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "Pushing to remote server failed!" +msgstr "Git set-head annensteds hen mislyktes: «%s»" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1437,6 +1495,10 @@ msgstr "Kunne ikke lese packageName/versionCode/versionName, APK ugyldig: \"{apk msgid "Reading {apkfilename} from cache" msgstr "Behandler {apkfilename}" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Fjerner angitte filer" @@ -1694,6 +1756,13 @@ msgstr "Nøkkelaliaskollisjon - offentliggjøring stanset" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +#, fuzzy +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" +"Feil: Denne kommandoen bør aldri brukes til å speile f-droid.org.\n" +"Et helt speil av f-droid.org krever mer enn 200GB." + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1859,11 +1928,15 @@ msgstr "UpdateCheckData må bruke HTTPS-nettadresse: {url}" msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData er ikke en gyldig nettadresse: {url}" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py #, fuzzy msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -1892,6 +1965,11 @@ msgstr "Bruk" msgid "Usage: %s\n" msgstr "Bruk: %s\n" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "Bruk /HEAD istedenfor /master for å peke til en fil i forvalgt forgrening" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Bruk /HEAD istedenfor /master for å peke til en fil i forvalgt forgrening" @@ -1923,6 +2001,11 @@ msgstr "Bruker APK Signature v2" msgid "Using APK Signature v3" msgstr "Bruker APK Signature v3" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Using JAR Signature" +msgstr "Bruker APK Signature v2" + #: ../fdroidserver/common.py #, fuzzy msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -1982,6 +2065,10 @@ msgstr "Når oppsatt for signerte indekser, vil kun usignerte indekser bli oppre msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 \"Entydig navn\" (DN) brukt ved generering av nøkler." @@ -2138,6 +2225,10 @@ msgstr "konflikterende valgstreng: %s" msgid "could not parse '{path}'" msgstr "kunne ikke tolke'{path}'" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2320,6 +2411,11 @@ msgstr "local_copy_dir må være ei mappe, ikke ei fil!" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "speilet \"%s\" slutter ikke med \"fdroid\"." +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "Nå må du sette disse i config.yml:" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2480,6 +2576,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py #, fuzzy msgid "ruamel.yaml not installed, can not write metadata." @@ -2495,6 +2596,11 @@ msgstr "s3cmd synkroniserer indekser {path} til {url} og sletter" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "local_copy_dir slutter ikke med \"fdroid\", kanskje du mente: \"{path}\"" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "delt bibliotek" @@ -2702,6 +2808,31 @@ msgstr "{path} finnes ikke. Opprett den ved å kjøre:" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} har feilaktig filsignatur \"{pattern}\", mulig Janus-utnyttelse." +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "'sdk_path' ble ikke funnet i config.yml!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2712,6 +2843,11 @@ msgstr "{path} er null størrelse." msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} er mer enn 200MB, last opp manuelt: {url}" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{path}: {error}" diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index afdbd49c..99abb33d 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-04-10 18:44+0000\n" "Last-Translator: Agnieszka C \n" "Language-Team: Polish \n" @@ -99,6 +99,11 @@ msgstr[2] "%(option)s opcje wymagają %(number)d argumentów" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: błąd: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -218,6 +223,11 @@ msgstr "/nie ma problemów" msgid "A URL is required as an argument!" msgstr "Adres URL jest wymagany jako argument!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "Nie znaleziono certyfikatów do podpisu w {path}" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Dodaj podpisy PGP za pomocą GnuPG dla pakietów w repozytorium" @@ -295,6 +305,11 @@ msgstr "Aplikacja ma Binaries, ale nie ma odpowiednich kluczy AllowedAPKSingKeys msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Aplikacja ma NoSourceSince lub ArchivePolicy „0 versions”, ale AutoUpdateMode lub UpdateCheckMode nie są None" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "Aplikacja ma NoSourceSince lub ArchivePolicy „0 versions”, ale AutoUpdateMode lub UpdateCheckMode nie są None" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -392,6 +407,11 @@ msgstr "Kategorie '%s' są nieprawidłowe" msgid "Categories are not set" msgstr "Kategorie nie są ustawione" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Sprawdź aktualizacje aplikacji" @@ -558,6 +578,16 @@ msgstr "Opis ma listę (%s), ale nie jest wypunktowana (*) ani ponumerowana (#)" msgid "Description of length {length} is over the {limit} char limit" msgstr "Opis długości {length} przekracza limit {limit} char" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Nie dodawaj „wyłącz:” do wygenerowanych wpisów kompilacji" @@ -624,6 +654,11 @@ msgstr "Zduplikowany wpis „%s” w konfiguracji serwerów lustrzanych!" msgid "Duplicate link in '{field}': {url}" msgstr "Zduplikowany link w '{field}': {url}" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "BŁĄD: podkomenda „serwer” została usunięta, użyj polecenia „deploy”!" @@ -794,6 +829,11 @@ msgstr "Znaleziono nieprawidłowe kody wersji dla niektórych aplikacji" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Znaleziono wiele plików bloków podpisów JAR w {path}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Found multiple Signer Certificates!" +msgstr "Znaleziono wiele certyfikatów do podpisywania dla repozytorium." + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -858,6 +898,11 @@ msgstr "Błąd zdalnego ustawiania Git: \"%s\"" msgid "Git reset failed" msgstr "Resetowanie Git nie powiodło się" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git submodule deinit failed" +msgstr "Aktualizacja submodułu Git nie powiodła się" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Nie udało się zsynchronizować modułu submodule Git" @@ -1063,6 +1108,10 @@ msgstr "Utrzymywanie nieudanej kompilacji „{apkfilename}”" msgid "Keystore for signing key:\t" msgstr "Magazyn kluczy do podpisywania klucza:\t" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1200,6 +1249,11 @@ msgstr "Nie znaleziono tagów" msgid "No unsigned directory - nothing to do" msgstr "Brak katalogu bez podpisu - nic nie można zrobić" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "nie znaleziono informacji o wersji" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Nieprawidłowa definicja rozmiaru: \"{}\"" @@ -1358,6 +1412,11 @@ msgstr "Przepchnij dziennik do tego zdalnego repozytorium git" msgid "Pushing binary transparency log to {url}" msgstr "Przesyłanie dziennika przejrzystości plików binarnych do {url}" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "Pushing to remote server failed!" +msgstr "Błąd zdalnego ustawiania Git: \"%s\"" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1391,6 +1450,11 @@ msgstr "Nie udało się odczytać packageName/versionCode/versionName, nieprawid msgid "Reading {apkfilename} from cache" msgstr "Czytanie {apkfilename} z pamięci podręcznej" +#: ../fdroidserver/build.py +#, fuzzy +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "pobierz najnowszą wersję sygnatur z sieci" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Usuwanie określonych plików" @@ -1641,6 +1705,13 @@ msgstr "Istnieje kolizja keyalias - wstrzymano publikowanie" msgid "These are the apps that have been archived from the main repo." msgstr "To są aplikacje, które zostały zarchiwizowane w głównym repozytorium." +#: ../fdroidserver/mirror.py +#, fuzzy +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" +"BŁĄD: tego polecenia nigdy nie należy używać do zwierciadlania f-droid.org!\n" +"Pełne lustro f-droid.org wymaga ponad 200 GB." + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "To jest repozytorium aplikacji używanych z F-Droid. Aplikacje w tym repozytorium są albo oficjalnymi plikami binarnymi utworzonymi przez oryginalnych programistów aplikacji, albo plikami binarnymi utworzonymi ze źródła przez administratora f-droid.org przy użyciu narzędzi na https://gitlab.com/fdroid." @@ -1809,11 +1880,16 @@ msgstr "UpdateCheckData musi używać adresu URL HTTPS: {url}" msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData nie jest prawidłowym adresem URL: {url}" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode jest ustawiony, ale wygląda na to, że checkupdates nie został jeszcze uruchomiony" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +#, fuzzy +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "UpdateCheckMode jest ustawiony, ale wygląda na to, że checkupdates nie został jeszcze uruchomiony" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName jest ustawiony na znany identyfikator aplikacji, można go usunąć" @@ -1841,6 +1917,11 @@ msgstr "Zastosowanie" msgid "Usage: %s\n" msgstr "Użycie: %s\n" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "Użyj /HEAD zamiast/ master, aby wskazać plik w domyślnej gałęzi" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Użyj /HEAD zamiast/ master, aby wskazać plik w domyślnej gałęzi" @@ -1870,6 +1951,11 @@ msgstr "Używając APK Signature v2" msgid "Using APK Signature v3" msgstr "Używając APK Signature v3" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Using JAR Signature" +msgstr "Używając APK Signature v2" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Korzystanie z jarsignera Java nie jest zalecane do weryfikacji plików APK! Użyj apksigner" @@ -1927,6 +2013,10 @@ msgstr "Po skonfigurowaniu dla indeksów podpisanych utwórz na tym etapie tylko msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Podczas linkowania całego repozytorium yamllint jest domyślnie wyłączony. Ta opcja wymusza yamllint niezależnie od tego." +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distinguished Name' używana podczas generowania kluczy" @@ -2077,6 +2167,11 @@ msgstr "kolidujący subparser: %s" msgid "could not parse '{path}'" msgstr "nie można przeanalizować '{path}'" +#: ../fdroidserver/common.py +#, fuzzy +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "could not parse srclib spec (no ref specified):' {}'" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "could not parse srclib spec (no ref specified):' {}'" @@ -2252,6 +2347,11 @@ msgstr "local_copy_dir musi być katalogiem, a nie plikiem!" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "mirror '%s'nie kończy się na 'fdroid'!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "Teraz ustaw je w config.yml:" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2409,6 +2509,11 @@ msgstr "repo_icon \"repo / icons / %s\" nie istnieje, generuje symbol zastępczy msgid "repo_url needs to end with /repo" msgstr "repo_url musi kończyć się na /repo" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "nie zainstalowano ruamel.yaml, nie można zapisać metadanych." @@ -2423,6 +2528,11 @@ msgstr "s3cmd zsynchronizuj indeksy {path} do {url} i usuń" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "pamięć podręczna skanera jest zniszczona! Możesz to wyczyścić poleceniem: „{clear}”" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "local_copy_dir nie kończy się na \"fdroid\", może masz na myśli: \"{path}\"" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "biblioteka współdzielona" @@ -2628,6 +2738,31 @@ msgstr "{path} nie istnieje! Utwórz go, uruchamiając:" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} ma zły podpis pliku \"{pattern}\", możliwe wykorzystanie Janusa!" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "'sdk_path' nie jest ustawiony w config.yml!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2638,6 +2773,11 @@ msgstr "{path} ma zerowy rozmiar!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} więcej niż 200MB, przesłane ręcznie: {url}" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 443f0202..ff488ea1 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2023-07-02 15:51+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" @@ -97,6 +97,11 @@ msgstr[1] "A opção %(option)s requer os argumentos %(number)d" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: erro: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -216,6 +221,11 @@ msgstr "está faltando o /issues" msgid "A URL is required as an argument!" msgstr "Uma URL é necessária como um argumento!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "Nenhum certificado de assinatura encontrado em {path}" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Adicione assinaturas PGP usando GnuPG para os pacotes no repositório" @@ -293,6 +303,11 @@ msgstr "A app tem binários, mas não tem AllowedAPKSigningKeys correspondentes msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "A app tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateMode ou UpdateCheckMode não são Nenhum" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "A app tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateMode ou UpdateCheckMode não são Nenhum" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -389,6 +404,11 @@ msgstr "As categorias '%s' não são válidas" msgid "Categories are not set" msgstr "As categorias não são definidas" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Verificação de actualizações das aplicações" @@ -555,6 +575,16 @@ msgstr "A descrição tem a lista (%s), mas não tem marcadores (*), nem é nume msgid "Description of length {length} is over the {limit} char limit" msgstr "A descrição de comprimento {length} é sobre o limite de char {limit}" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Não adicionar 'disable:' às entradas de compilação geradas" @@ -621,6 +651,11 @@ msgstr "Entrada \"%s\" duplicada na configuração de espelhos!" msgid "Duplicate link in '{field}': {url}" msgstr "Ligação duplicada em '{field}': {url}" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERRO: o subcomando \"server\" foi removido, use \"deploy\"!" @@ -791,6 +826,11 @@ msgstr "versionCodes inválidos encontrados para algumas apps" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Vários ficheiros de blocos de assinaturas JAR foram encontrados em {path}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Found multiple Signer Certificates!" +msgstr "Vários certificados de assinatura encontrados para o repositório." + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -855,6 +895,11 @@ msgstr "Git remote set-head falhou: \"%s\"" msgid "Git reset failed" msgstr "Git reset falhou" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git submodule deinit failed" +msgstr "Git submodule update falhou" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Git submodule sync falhou" @@ -1060,6 +1105,10 @@ msgstr "Mantendo a compilação com falha \"{apkfilename}\"" msgid "Keystore for signing key:\t" msgstr "Armazenamento de chaves de assinatura:\t" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1197,6 +1246,11 @@ msgstr "Nenhuma etiqueta encontrada" msgid "No unsigned directory - nothing to do" msgstr "Nenhum diretório não assinado - nada a fazer" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "nenhuma informação de versão encontrada" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Não é uma definição de tamanho válida: \"{}\"" @@ -1355,6 +1409,11 @@ msgstr "Submeter o registo de eventos para este repositório git remoto" msgid "Pushing binary transparency log to {url}" msgstr "A submeter o registo de transparência de binário para {url}" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "Pushing to remote server failed!" +msgstr "Git remote set-head falhou: \"%s\"" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1388,6 +1447,11 @@ msgstr "Falha ao ler packageName/versionCode/versionName, APK inválido: '{apkfi msgid "Reading {apkfilename} from cache" msgstr "Lendo {apkfilename} do cache" +#: ../fdroidserver/build.py +#, fuzzy +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "buscar a versão de assinaturas mais recente da Web" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Apagando ficheiros especificados" @@ -1637,6 +1701,13 @@ msgstr "Há uma colisão do keyalias - publicação parada" msgid "These are the apps that have been archived from the main repo." msgstr "Estas são as aplicações que foram arquivadas do repositório principal." +#: ../fdroidserver/mirror.py +#, fuzzy +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" +"ERRO: este comando nunca deve ser usado para espelhar f-Droid.org!\n" +"Um espelho completo de f-Droid.org requer mais de 200GB." + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Este é um repositório de apps a serem usados com o F-Droid. Aplicações neste repositório são binários oficiais compilados pelos programadores da aplicação original ou são binários compilados da fonte por f-droid.org a usar as ferramentas em https://gitlab.com/fdroid." @@ -1805,11 +1876,16 @@ msgstr "UpdateCheckData deve usar um URL HTTPS: {url}" msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData não é uma URL válida: {url}" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +#, fuzzy +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName (o nome da verificação de atualização) é definido como o ID comun da aplicação - pode ser removido" @@ -1837,6 +1913,11 @@ msgstr "Utilização" msgid "Usage: %s\n" msgstr "Utilização: %s\n" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "Use /HEAD em vez de /master para apontar num ficheiro na ramificação predefinida" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Use /HEAD em vez de /master para apontar num ficheiro na ramificação predefinida" @@ -1866,6 +1947,11 @@ msgstr "A usar a assinatura APK v2" msgid "Using APK Signature v3" msgstr "A usar a assinatura APK v3" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Using JAR Signature" +msgstr "A usar a assinatura APK v2" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Usando o jarsigner de Java, não recomendado para verificar APKs! Use apksigner" @@ -1923,6 +2009,10 @@ msgstr "Quando configurado para índices assinados, crie apenas índices não as msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Ao cotar todo o repositório o yamllint é desativado por predefinição. Esta opção força o yamllint independentemente." +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distiguished Name' usado na geração de chaves" @@ -2072,6 +2162,11 @@ msgstr "subanalisador conflitante: %s" msgid "could not parse '{path}'" msgstr "não foi possível analisar '{path}'" +#: ../fdroidserver/common.py +#, fuzzy +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "não foi possível analisar a especificação srclib (referência não especificada): '{}'" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "não foi possível analisar a especificação srclib (referência não especificada): '{}'" @@ -2246,6 +2341,11 @@ msgstr "local_copy_dir deve ser directory, não um ficheiro!" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "espelho '%s' não termina com 'fdroid'!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "Agora configure estes em config.yml:" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2403,6 +2503,11 @@ msgstr "repo_icon \"repo/icons/%s\" não existe, a gerar um espaço reservado." msgid "repo_url needs to end with /repo" msgstr "repo_url precisa de terminar com /repo" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "o ruamel.yaml não está instalado, não é possível escrever metadados." @@ -2417,6 +2522,11 @@ msgstr "s3cmd sincroniza índices {path} para {url} e apaga" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "o cache do scanner está malformado! Pode limpá-lo com: '{clear}'" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "local_copy_dir não termina com \"fdroid\", talvez quis: \"{path}\"" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "biblioteca compartilhada" @@ -2621,6 +2731,31 @@ msgstr "{path} não existe! Crie-o executando:" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} tem uma má assinatura de ficheiro \"{pattern}\", um exploração Janus é possível!" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "'sdk_path' não definido em 'config.yml'!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2631,6 +2766,11 @@ msgstr "{path} tem um tamanho de zero!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} mais de 200MB, enviar manualmente: {url}" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 17a65a74..7dd26d68 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2023-08-18 15:51+0000\n" "Last-Translator: The Cats \n" "Language-Team: Portuguese (Brazil) \n" @@ -102,6 +102,11 @@ msgstr[1] "opção %(option)s necessita %(number)d argumentos" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: erro: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -221,6 +226,11 @@ msgstr "está faltando o /issues" msgid "A URL is required as an argument!" msgstr "Uma URL é necessária como um argumento!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "Nenhum certificado de assinatura encontrado em {path}" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Adicione assinaturas PGP usando GnuPG para os pacotes no repositório" @@ -298,6 +308,11 @@ msgstr "O aplicativo tem binários, mas não tem AllowedAPKSigningKeys correspon msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "O aplicativo tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateMode ou UpdateCheckMode não são None" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "O aplicativo tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateMode ou UpdateCheckMode não são None" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -394,6 +409,11 @@ msgstr "Categorias '%s' não são válidas" msgid "Categories are not set" msgstr "As categorias não estão definidas" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Verifica se existem atualizações para os aplicativos" @@ -560,6 +580,16 @@ msgstr "Descrição tem uma lista (%s), mas não é com marcadores (*) nem numer msgid "Description of length {length} is over the {limit} char limit" msgstr "A descrição de tamanho {length} está acima do limite de {limit} caracteres" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Não adicione \"disable:\" para as entradas de compilação geradas" @@ -626,6 +656,11 @@ msgstr "Entrada \"%s\" duplicada na configuração de espelhos!" msgid "Duplicate link in '{field}': {url}" msgstr "Link duplicado em '{field}': {url}" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERRO: o subcomando \"server\" foi removido, use \"deploy\"!" @@ -796,6 +831,11 @@ msgstr "Encontrado versões de códigos inválidas para alguns aplicativos" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Encontrados vários arquivos de bloqueio de assinatura JAR em {path}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Found multiple Signer Certificates!" +msgstr "Encontrado vários certificados de assinatura para o repositório." + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -860,6 +900,11 @@ msgstr "Git remote set-head falhou: \"%s\"" msgid "Git reset failed" msgstr "Falha no 'reset' do Git" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git submodule deinit failed" +msgstr "Falha na atualização do submódulo Git" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Falha na sincronização do submódulo Git" @@ -1065,6 +1110,10 @@ msgstr "Mantendo a compilação com falha \"{apkfilename}\"" msgid "Keystore for signing key:\t" msgstr "Armazenamento de chaves de assinatura:\t" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1202,6 +1251,11 @@ msgstr "Nenhuma etiqueta encontrada" msgid "No unsigned directory - nothing to do" msgstr "Nenhum diretório não assinado - nada a fazer" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "nenhuma informação de versão encontrada" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Não é uma definição de tamanho válida: \"{}\"" @@ -1360,6 +1414,11 @@ msgstr "Mandar o registro de mudanças para este repositório git remoto" msgid "Pushing binary transparency log to {url}" msgstr "Atualizar o log de transparência de um binário para {url}" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "Pushing to remote server failed!" +msgstr "Git remote set-head falhou: \"%s\"" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1393,6 +1452,11 @@ msgstr "Falha ao ler packageName/versionCode/versionName, APK inválido: '{apkfi msgid "Reading {apkfilename} from cache" msgstr "Lendo {apkfilename} do cache" +#: ../fdroidserver/build.py +#, fuzzy +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "obter a versão de assinaturas mais recente da Web" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Removendo arquivos especificados" @@ -1642,6 +1706,13 @@ msgstr "Há uma colisão do keyalias - publicação parada" msgid "These are the apps that have been archived from the main repo." msgstr "Estas são as aplicações que foram arquivadas a partir do repositório principal." +#: ../fdroidserver/mirror.py +#, fuzzy +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" +"ERRO: este comando nunca deve ser usado para espelhar o f-droid.org!\n" +"Um espelho completo de f-droid.org requer mais de 200 GB." + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Este é um repositório de aplicativos a serem usados com o F-Droid. Os aplicativos neste repositório são binários oficiais compilados pelos desenvolvedores do aplicativo original ou são binários compilados a partir da fonte por f-droid.org usando as ferramentas em https://gitlab.com/fdroid." @@ -1810,11 +1881,16 @@ msgstr "UpdateCheckData deve usar um URL HTTPS: {url}" msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData não é uma URL válida: {url}" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +#, fuzzy +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName (atualização da verificação do nome) é definido como o ID comun do app - pode ser removido" @@ -1842,6 +1918,11 @@ msgstr "Uso" msgid "Usage: %s\n" msgstr "Uso: %s\n" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "Use /HEAD em vez de /master para apontar em um arquivo na ramificação predefinida" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Use /HEAD em vez de /master para apontar em um arquivo na ramificação predefinida" @@ -1871,6 +1952,11 @@ msgstr "Usando a Assinatura APK v2" msgid "Using APK Signature v3" msgstr "Usando a Assinatura APK v3" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Using JAR Signature" +msgstr "Usando a Assinatura APK v2" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Usando o jarsigner de Java, não recomendado para verificar APKs! Use apksigner" @@ -1928,6 +2014,10 @@ msgstr "Quando configurado para índices assinados, crie apenas índices não as msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Ao cotar todo o repositório, o yamllint é desativado por padrão. Independente de qualquer coisa esta opção impõem o uso do yamllint." +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distiguished Name' usado na geração de chaves" @@ -2077,6 +2167,11 @@ msgstr "subanalizador conflitante: %s" msgid "could not parse '{path}'" msgstr "não foi possível analisar '{path}'" +#: ../fdroidserver/common.py +#, fuzzy +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "não foi possível analisar a especificação srclib (referência sem especificação): '{}'" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "não foi possível analisar a especificação srclib (referência sem especificação): '{}'" @@ -2251,6 +2346,11 @@ msgstr "local_copy_dir deve ser um diretório, não um arquivo!" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "espelho '%s' não termina com 'fdroid'!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "Agora defina estes em config.yml:" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2408,6 +2508,11 @@ msgstr "repo_icon \"repo/icons/%s\" não existe, gerando um espaço reservado." msgid "repo_url needs to end with /repo" msgstr "repo_url precisa terminar com /repo" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "o ruamel.yaml não está instalado, não é possível escrever os metadados." @@ -2422,6 +2527,11 @@ msgstr "s3cmd sincroniza índices {path} para {url} e exclui" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "o cache do scanner está malformado! Você pode limpá-lo com: '{clear}'" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "local_copy_dir não termina com \"fdroid\", talvez você quis: \"{path}\"" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "biblioteca compartilhada" @@ -2626,6 +2736,31 @@ msgstr "{path} não existe! Crie-o executando:" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} tem uma má assinatura de arquivo \"{pattern}\", um exploração Janus é possível!" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "\"sdk_path\" não definido em config.yml!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2636,6 +2771,11 @@ msgstr "{path} tem um tamanho de zero!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "o {path} tem mais de 200MB, upload manual: {url}" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 2367e84f..98868df0 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2023-07-02 15:51+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" @@ -98,6 +98,11 @@ msgstr[1] "A opção %(option)s requer os argumentos %(number)d" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: erro: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -217,6 +222,11 @@ msgstr "está faltando o /issues" msgid "A URL is required as an argument!" msgstr "Uma URL é necessária como um argumento!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "Nenhum certificado de assinatura encontrado em {path}" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Adicione assinaturas PGP usando GnuPG para os pacotes no repositório" @@ -294,6 +304,11 @@ msgstr "A app tem binários, mas não tem AllowedAPKSigningKeys correspondentes msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "A app tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateMode ou UpdateCheckMode não são Nenhum" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "A app tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateMode ou UpdateCheckMode não são Nenhum" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -390,6 +405,11 @@ msgstr "As categorias '%s' não são válidas" msgid "Categories are not set" msgstr "As categorias não são definidas" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Verificação de actualizações das aplicações" @@ -556,6 +576,16 @@ msgstr "A descrição tem a lista (%s), mas não tem marcadores (*), nem é nume msgid "Description of length {length} is over the {limit} char limit" msgstr "A descrição de comprimento {length} é sobre o limite de char {limit}" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Não adicionar 'disable:' às entradas de compilação geradas" @@ -622,6 +652,11 @@ msgstr "Entrada \"%s\" duplicada na configuração de espelhos!" msgid "Duplicate link in '{field}': {url}" msgstr "Ligação duplicada em '{field}': {url}" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERRO: o subcomando \"server\" foi removido, use \"deploy\"!" @@ -792,6 +827,11 @@ msgstr "versionCodes inválidos encontrados para algumas apps" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Vários ficheiros de blocos de assinaturas JAR foram encontrados em {path}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Found multiple Signer Certificates!" +msgstr "Vários certificados de assinatura encontrados para o repositório." + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -856,6 +896,11 @@ msgstr "Git remote set-head falhou: \"%s\"" msgid "Git reset failed" msgstr "Git reset falhou" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git submodule deinit failed" +msgstr "Git submodule update falhou" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Git submodule sync falhou" @@ -1061,6 +1106,10 @@ msgstr "Mantendo a compilação com falha \"{apkfilename}\"" msgid "Keystore for signing key:\t" msgstr "Armazenamento de chaves de assinatura:\t" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1198,6 +1247,11 @@ msgstr "Nenhuma etiqueta encontrada" msgid "No unsigned directory - nothing to do" msgstr "Nenhum diretório não assinado - nada a fazer" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "não há informações de versão encontrada" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Não é uma definição de tamanho válida: \"{}\"" @@ -1356,6 +1410,11 @@ msgstr "Submeter o registo de eventos para este repositório git remoto" msgid "Pushing binary transparency log to {url}" msgstr "A submeter o registo de transparência de binário para {url}" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "Pushing to remote server failed!" +msgstr "Git remote set-head falhou: \"%s\"" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1389,6 +1448,11 @@ msgstr "Falha ao ler packageName/versionCode/versionName, APK inválido: '{apkfi msgid "Reading {apkfilename} from cache" msgstr "Lendo {apkfilename} do cache" +#: ../fdroidserver/build.py +#, fuzzy +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "buscar a versão de assinaturas mais recente da Web" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Apagando ficheiros especificados" @@ -1638,6 +1702,13 @@ msgstr "Há uma colisão do keyalias - publicação parada" msgid "These are the apps that have been archived from the main repo." msgstr "Estas são as aplicações que foram arquivadas do repositório principal." +#: ../fdroidserver/mirror.py +#, fuzzy +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" +"ERRO: este comando nunca deve ser usado para espelhar f-Droid.org!\n" +"Um espelho completo de f-Droid.org requer mais de 200GB." + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Este é um repositório de apps a serem usados com o F-Droid. Aplicações neste repositório são binários oficiais compilados pelos programadores da aplicação original ou são binários compilados da fonte por f-droid.org a usar as ferramentas em https://gitlab.com/fdroid." @@ -1806,11 +1877,16 @@ msgstr "UpdateCheckData deve usar um URL HTTPS: {url}" msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData não é uma URL válida: {url}" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +#, fuzzy +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName (o nome da verificação de atualização) é definido como o ID comun da aplicação - pode ser removido" @@ -1838,6 +1914,11 @@ msgstr "Utilização" msgid "Usage: %s\n" msgstr "Utilização: %s\n" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "Use /HEAD em vez de /master para apontar num ficheiro na ramificação predefinida" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Use /HEAD em vez de /master para apontar num ficheiro na ramificação predefinida" @@ -1867,6 +1948,11 @@ msgstr "A usar a assinatura APK v2" msgid "Using APK Signature v3" msgstr "A usar a assinatura APK v3" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Using JAR Signature" +msgstr "A usar a assinatura APK v2" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Usando o jarsigner de Java, não recomendado para verificar APKs! Use apksigner" @@ -1924,6 +2010,10 @@ msgstr "Quando configurado para índices assinados, crie apenas índices não as msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Ao cotar todo o repositório o yamllint é desativado por predefinição. Esta opção força o yamllint independentemente." +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distiguished Name' usado na geração de chaves" @@ -2073,6 +2163,11 @@ msgstr "subanalisador conflitante: %s" msgid "could not parse '{path}'" msgstr "não foi possível analisar '{path}'" +#: ../fdroidserver/common.py +#, fuzzy +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "não foi possível analisar a especificação srclib (referência não especificada): '{}'" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "não foi possível analisar a especificação srclib (referência não especificada): '{}'" @@ -2247,6 +2342,11 @@ msgstr "local_copy_dir deve ser directory, não um ficheiro!" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "espelho '%s' não termina com 'fdroid'!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "Agora configure estes em config.yml:" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2404,6 +2504,11 @@ msgstr "repo_icon \"repo/icons/%s\" não existe, a gerar um espaço reservado." msgid "repo_url needs to end with /repo" msgstr "repo_url precisa de terminar com /repo" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "o ruamel.yaml não está instalado, não é possível escrever metadados." @@ -2418,6 +2523,11 @@ msgstr "s3cmd sincroniza índices {path} para {url} e exclui" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "o cache do scanner está malformado! Pode limpá-lo com: '{clear}'" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "local_copy_dir não termina com \"fdroid\", talvez quis: \"{path}\"" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "biblioteca compartilhada" @@ -2622,6 +2732,31 @@ msgstr "{path} não existe! Crie-o executando:" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} tem uma má assinatura de ficheiro \"{pattern}\", um exploração Janus é possível!" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "'sdk_path' não definido em 'config.yml'!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2632,6 +2767,11 @@ msgstr "{path} tem um tamanho de zero!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} mais de 200MB, enviar manualmente: {url}" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 7de8f22c..4a96a07c 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Romanian \n" @@ -99,6 +99,11 @@ msgstr[2] "Opțiunea %(option)s necesită %(number)d argumente" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: eroare: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -218,6 +223,11 @@ msgstr "/problemele lipsesc" msgid "A URL is required as an argument!" msgstr "Un URL este necesar ca argument!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "Nu s-au găsit certificate de semnare în {path}" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Adăugați semnături PGP folosind GnuPG pentru pachetele din depozit" @@ -295,6 +305,11 @@ msgstr "Aplicația are binare, dar nu are AllowedAPKSigningKeys corespunzătoare msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "App are NoSourceSince sau ArchivePolicy \"0 versions\" dar AutoUpdateMode sau UpdateCheckMode nu sunt None" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "App are NoSourceSince sau ArchivePolicy \"0 versions\" dar AutoUpdateMode sau UpdateCheckMode nu sunt None" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -392,6 +407,11 @@ msgstr "Categoriile \"%s\" nu sunt valabile" msgid "Categories are not set" msgstr "Categoriile nu sunt setate" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Verificați dacă există actualizări ale aplicațiilor" @@ -558,6 +578,16 @@ msgstr "Descrierea are o listă (%s), dar nu este punctată (*) și nici numerot msgid "Description of length {length} is over the {limit} char limit" msgstr "Descrierea lungimii {length} este peste limita {limit} limitei de caractere" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Nu adăugați \"disable:\" la intrările de construcție generate" @@ -624,6 +654,11 @@ msgstr "Intrare duplicată \"%s\" în oglinzile config!" msgid "Duplicate link in '{field}': {url}" msgstr "Legătură duplicată în \"{field}\": {url}" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERROR: Subcomanda \"server\" a fost eliminată, utilizați \"deploy\"!" @@ -794,6 +829,11 @@ msgstr "Am găsit coduri de versiune invalide pentru unele aplicații" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Am găsit mai multe fișiere JAR Signature Block în {path}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Found multiple Signer Certificates!" +msgstr "S-au găsit mai multe certificate de semnare pentru depozit." + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -858,6 +898,11 @@ msgstr "Git remote set-head a eșuat: \"%s\"" msgid "Git reset failed" msgstr "Resetarea Git a eșuat" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git submodule deinit failed" +msgstr "Actualizarea submodulelor Git a eșuat" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Sincronizarea submodulelor Git a eșuat" @@ -1063,6 +1108,10 @@ msgstr "Nu a reușit să construiască \"{apkfilename}\"" msgid "Keystore for signing key:\t" msgstr "Keystore pentru cheia de semnare:\t" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1200,6 +1249,11 @@ msgstr "Nu s-au găsit etichete" msgid "No unsigned directory - nothing to do" msgstr "Niciun director nesemnat - nimic de făcut" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "nu s-au găsit informații despre versiune" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Nu este o definiție valabilă a dimensiunii: \"{}\"" @@ -1358,6 +1412,11 @@ msgstr "Împingeți jurnalul în acest depozit de la distanță git" msgid "Pushing binary transparency log to {url}" msgstr "Trimiterea jurnalului de transparență binară la {url}" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "Pushing to remote server failed!" +msgstr "Git remote set-head a eșuat: \"%s\"" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1391,6 +1450,11 @@ msgstr "Citirea packageName/versionCode/versionName a eșuat, APK invalid: '{apk msgid "Reading {apkfilename} from cache" msgstr "Citirea {apkfilename} din memoria cache" +#: ../fdroidserver/build.py +#, fuzzy +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "extrage cea mai recentă versiune de semnături de pe web" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Eliminarea fișierelor specificate" @@ -1641,6 +1705,13 @@ msgstr "Există o coliziune keyalias - publicarea a fost oprită" msgid "These are the apps that have been archived from the main repo." msgstr "Acestea sunt aplicațiile care au fost arhivate din depozitul principal." +#: ../fdroidserver/mirror.py +#, fuzzy +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" +"ERROR: această comandă nu ar trebui să fie folosită niciodată pentru a oglindi f-droid.org!\n" +"O oglindă completă a f-droid.org necesită mai mult de 200GB." + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Acesta este un depozit de aplicații care pot fi utilizate cu F-Droid. Aplicațiile din acest depozit sunt fie binare oficiale construite de către dezvoltatorii aplicațiilor originale, fie binare construite din sursă de către administratorul f-droid.org folosind instrumentele de pe https://gitlab.com/fdroid." @@ -1809,11 +1880,16 @@ msgstr "UpdateCheckData trebuie să utilizeze un URL HTTPS: {url}" msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData nu este un URL valid: {url}" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode este setat, dar se pare că checkupdates nu a fost încă rulat." +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +#, fuzzy +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "UpdateCheckMode este setat, dar se pare că checkupdates nu a fost încă rulat." + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName este setat la ID-ul cunoscut al aplicației, acesta poate fi eliminat" @@ -1841,6 +1917,11 @@ msgstr "Utilizare" msgid "Usage: %s\n" msgstr "Utilizare: %s\n" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "Folosiți /HEAD în loc de /master pentru a indica un fișier din ramura implicită" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Folosiți /HEAD în loc de /master pentru a indica un fișier din ramura implicită" @@ -1870,6 +1951,11 @@ msgstr "Folosind APK Signature v2" msgid "Using APK Signature v3" msgstr "Folosind APK Signature v3" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Using JAR Signature" +msgstr "Folosind APK Signature v2" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Folosind jarsigner de la Java, nu este recomandat pentru verificarea APK-urilor! Utilizați apksigner" @@ -1927,6 +2013,10 @@ msgstr "Atunci când este configurat pentru indici cu semnătură, creați numai msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Atunci când se face linting pentru întregul depozit, yamllint este dezactivat în mod implicit. Această opțiune forțează yamllint indiferent de aceasta." +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 \"Distinguished Name\" utilizat la generarea cheilor" @@ -2077,6 +2167,11 @@ msgstr "șir de opțiuni conflictuale: %s" msgid "could not parse '{path}'" msgstr "nu s-a putut analiza '{path}'" +#: ../fdroidserver/common.py +#, fuzzy +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "nu a putut analiza specificația srclib (nu a fost specificat niciun ref): '{}'" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "nu a putut analiza specificația srclib (nu a fost specificat niciun ref): '{}'" @@ -2252,6 +2347,11 @@ msgstr "local_copy_dir trebuie să fie un director, nu un fișier!" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "oglinda '%s' nu se termină cu 'fdroid'!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "Acum setați-le în config.yml:" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2409,6 +2509,11 @@ msgstr "repo_icon \"repo/icons/%s\" nu există, se generează un înlocuitor." msgid "repo_url needs to end with /repo" msgstr "repo_url trebuie să se termine cu /repo" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml nu este instalat, nu poate scrie metadatele." @@ -2423,6 +2528,11 @@ msgstr "s3cmd sincronizează indexurile {path} cu {url} și șterge" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "cache-ul scanerului este deformat! Puteți să o ștergeți cu: '{clear}'" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "local_copy_dir nu se termină cu \"fdroid\", poate ai vrut să spui: \"{path}\"" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "bibliotecă partajată" @@ -2628,6 +2738,31 @@ msgstr "{path} nu există! Creați-l prin rularea:" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} are o semnătură proastă a fișierului \"{pattern}\", posibil exploit Janus!" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "'sdk_path' nu este setat în 'config.yml'!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2638,6 +2773,11 @@ msgstr "{path} este de dimensiune zero!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} mai mult de 200MB, încărcați manual: {url}" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 326884af..2ee2f228 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-02-23 12:59+0000\n" "Last-Translator: Alexander Ivanov \n" "Language-Team: Russian \n" @@ -107,6 +107,11 @@ msgstr[2] "Параметр %(option)s требует %(number)d аргумен msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: ошибка: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -226,6 +231,11 @@ msgstr "Не хватает /issues" msgid "A URL is required as an argument!" msgstr "В качестве аргумента нужен URL-адрес!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "В {path} не обнаружены сертификаты для подписывания" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Добавить PGP подписи для пакетов в репозитории с помощью GnuPG" @@ -303,6 +313,11 @@ msgstr "Приложение имеет двоичные файлы, но не msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Приложение имеет NoSourceSince или ArchivePolicy \"0 версий\", но AutoUpdateMode или UpdateCheckMode не равны None" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "Приложение имеет NoSourceSince или ArchivePolicy \"0 версий\", но AutoUpdateMode или UpdateCheckMode не равны None" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -400,6 +415,11 @@ msgstr "Неправильные категории: '%s'" msgid "Categories are not set" msgstr "Категории не выбраны" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Проверить обновления для приложений" @@ -566,6 +586,16 @@ msgstr "В описании есть неразмеченный список (%s msgid "Description of length {length} is over the {limit} char limit" msgstr "Описание {length} превышает лимит по количеству знаков {limit}" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Не добавлять 'disable:' к сгенерированным данным сборки" @@ -632,6 +662,11 @@ msgstr "Дублирующаяся запись \"%s\" в конфигураци msgid "Duplicate link in '{field}': {url}" msgstr "Точная копия ссылки в '{field}': {url}" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ОШИБКА: подкоманда \"server\" была удалена, используйте \"deploy\"!" @@ -802,6 +837,11 @@ msgstr "Для некоторых приложений обнаружены не msgid "Found multiple JAR Signature Block Files in {path}" msgstr "В {path} обнаружено несколько сертификатов (JAR Signature Block File)" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Found multiple Signer Certificates!" +msgstr "Для этого репозитория обнаружено несколько ключей для подписывания." + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -866,6 +906,11 @@ msgstr "Не удалось настроить HEAD для удаленного msgid "Git reset failed" msgstr "Не удалось отменить изменения (git reset)" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git submodule deinit failed" +msgstr "Не удалось обновить модули Git (git submodules update)" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Не удалось синхронизировать модули Git (git submodules sync)" @@ -1071,6 +1116,10 @@ msgstr "Сохранение неудачной сборки \"{apkfilename}\"" msgid "Keystore for signing key:\t" msgstr "Хранилище ключа для подписывания:→\t" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1208,6 +1257,11 @@ msgstr "Теги не найдены" msgid "No unsigned directory - nothing to do" msgstr "Директории с неподписанными данными не существует. До новых встреч" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "информация о версии не найдена" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Неверное определение размера: \"{}\"" @@ -1366,6 +1420,11 @@ msgstr "Отправить лог в удаленный репозиторий g msgid "Pushing binary transparency log to {url}" msgstr "Публикация лога прозрачности кода в {url}" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "Pushing to remote server failed!" +msgstr "Не удалось настроить HEAD для удаленного репозитория (git remote set-head): \"%s\"" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1399,6 +1458,11 @@ msgstr "Не удалось прочитать packageName/versionCode/versionNa msgid "Reading {apkfilename} from cache" msgstr "Чтение {apkfilename} из кеша" +#: ../fdroidserver/build.py +#, fuzzy +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "получить последнюю версию подписей из интернета" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Удаление выбранных файлов" @@ -1649,6 +1713,13 @@ msgstr "Есть расхождения в алиасах ключей для п msgid "These are the apps that have been archived from the main repo." msgstr "Это те приложения, которые были заархивированы из основного репозитория." +#: ../fdroidserver/mirror.py +#, fuzzy +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" +"ОШИБКА: эту команду ни в коем случае нельзя использовать для создания зеркала f-droid.org!\n" +"Оно занимает больше 200 Гб." + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Это репозиторий приложений, предназначенных для использования в FDroid. Приложения в этом репозитории являются либо официальными бинарными файлами, созданными разработчиками оригинального приложения, либо бинарными файлами, созданными f-droid.org из исходного кода с помощью инструментов на https://gitlab.com/fdroid." @@ -1817,11 +1888,16 @@ msgstr "URL-адрес в UpdateCheckData должен начинаться с H msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData содержит некорректный URL-адрес: {url}" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode настроен, но похоже, что команда checkupdates еще не была запущена" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +#, fuzzy +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "UpdateCheckMode настроен, но похоже, что команда checkupdates еще не была запущена" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "Имя приложения для проверки обновлений (UpdateCheckName) соответствует ID приложения — это поле можно удалить" @@ -1849,6 +1925,11 @@ msgstr "Использование" msgid "Usage: %s\n" msgstr "Использование: %s\n" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "Указывайте /HEAD, а не /master, ссылаясь на файл в ветке по умолчанию" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Указывайте /HEAD, а не /master, ссылаясь на файл в ветке по умолчанию" @@ -1878,6 +1959,11 @@ msgstr "Используется схема подписи APK v2" msgid "Using APK Signature v3" msgstr "Используется схема подписи APK v3" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Using JAR Signature" +msgstr "Используется схема подписи APK v2" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Проверка APK с помощью Java jarsigner. Так делать не следует! Пользуйтесь для этого apksigner" @@ -1935,6 +2021,10 @@ msgstr "Даже если в конфигурации сборки задано msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "При проверке целого репозитория, yamllint по умолчанию отключен. Этот параметр принудительно включает yamllint." +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "При генерации ключей использовалось различимое имя (Distinguished Name) стандарта X.509" @@ -2085,6 +2175,11 @@ msgstr "конфликтный субпарсер:%s" msgid "could not parse '{path}'" msgstr "не удалось разобрать '{path}'" +#: ../fdroidserver/common.py +#, fuzzy +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "не удалось разобрать спецификацию scrlib (не задана ссылка): '{}'" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "не удалось разобрать спецификацию scrlib (не задана ссылка): '{}'" @@ -2260,6 +2355,11 @@ msgstr "local_copy_dir должна быть директорией, а не ф msgid "mirror '%s' does not end with 'fdroid'!" msgstr "адрес зеркала '%s' должен заканчиваться 'fdroid'!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "Определите эти переменные в config.yml:" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2417,6 +2517,11 @@ msgstr "значок репозитория (repo_icon) 'repo/icons/%s' не с msgid "repo_url needs to end with /repo" msgstr "repo_url должен оканчиваться «/repo»" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml не установлен, не получается записать метаданные." @@ -2431,6 +2536,11 @@ msgstr "s3cmd синхронизировать индексы из {path} в {ur msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "кэш сканера поврежден! Вы можете очистить его с помощью: '{clear}'" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "local_copy_dir должна заканчиваться на \"fdroid\". Возможно, имелось в виду \"{path}\"" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "разделяемая библиотека" @@ -2636,6 +2746,31 @@ msgstr "{path} не существует! Создайте, выполнив к msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path}: неверная подпись \"{pattern}\". Выглядит подозрительно и похоже на попытку нарушения безопасности (Janus exploit)!" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "'sdk_path' не найден в config.yml!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2646,6 +2781,11 @@ msgstr "размер {path} равен нулю!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "Размер {path} больше 200MB, загрузите его вручную на {url}" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/sk/LC_MESSAGES/fdroidserver.po b/locale/sk/LC_MESSAGES/fdroidserver.po index 3c07e0fc..c56e39c1 100644 --- a/locale/sk/LC_MESSAGES/fdroidserver.po +++ b/locale/sk/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -90,6 +90,11 @@ msgstr[2] "" msgid "%(prog)s: error: %(message)s\n" msgstr "" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -209,6 +214,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -286,6 +296,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -383,6 +397,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "" @@ -549,6 +568,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -615,6 +644,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -781,6 +815,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -845,6 +883,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1050,6 +1092,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1187,6 +1233,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1345,6 +1395,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1378,6 +1432,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1628,6 +1686,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1789,11 +1851,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1821,6 +1887,10 @@ msgstr "" msgid "Usage: %s\n" msgstr "" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1850,6 +1920,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1907,6 +1981,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2057,6 +2135,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2232,6 +2314,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2389,6 +2476,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2403,6 +2495,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2608,6 +2704,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2618,6 +2739,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index f04a0fe2..cf79cb9e 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-02-20 18:58+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" @@ -95,6 +95,11 @@ msgstr[1] "Mundësi %(option)s lyp %(number)d argumente" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: gabim: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -214,6 +219,11 @@ msgstr "/issues mungon" msgid "A URL is required as an argument!" msgstr "Lypset një URL si argument!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "S’u gjetën dëshmi nënshkrimi te {path}" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Shtoni për paketa në depo nënshkrime PGP duke përdorur GnuPG-në" @@ -291,6 +301,11 @@ msgstr "Aplikacioni ka Dyorë, por s’ka AllowedAPKSigningKeys përkatës për msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Aplikacioni ka NoSourceSince ose ArchivePolicy “0 versione”, por AutoUpdateMode ose UpdateCheckMode janë vënë si “Asnjë”" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "Aplikacioni ka NoSourceSince ose ArchivePolicy “0 versione”, por AutoUpdateMode ose UpdateCheckMode janë vënë si “Asnjë”" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -387,6 +402,11 @@ msgstr "Kategoritë '%s' s’janë të vlefshme" msgid "Categories are not set" msgstr "S’janë ujdisur kategori" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Kontrollo për përditësime aplikacionesh" @@ -553,6 +573,16 @@ msgstr "Përshkrimi ka një listë (%s), por kjo s’është as me toptha (*), a msgid "Description of length {length} is over the {limit} char limit" msgstr "Përshkrimi me gjatësi {length} është mbi kufirin prej {limit} shenjash" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Mos shtoni 'disable:' te zëra të prodhuar të montimit" @@ -619,6 +649,11 @@ msgstr "Zë i përsëdytur “%s” në formësim pasqyrash!" msgid "Duplicate link in '{field}': {url}" msgstr "Lidhje e përsëdytur te '{field}': {url}" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "GABIM: Nënurdhri “server” është hequr, përdorni “deploy”!" @@ -789,6 +824,11 @@ msgstr "U gjetën versionCodes të pavlefshëm për disa aplikacione" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Te {path} u gjetën Kartela të shumta JAR Blloqesh Nënshkrimi" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Found multiple Signer Certificates!" +msgstr "U gjetën dëshmi të shumta nënshkrimi për depon." + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -853,6 +893,11 @@ msgstr "Veprimi “git remote set-head” dështoi: “%s”" msgid "Git reset failed" msgstr "Veprimi “git reset” dështoi" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git submodule deinit failed" +msgstr "Veprimi “git submodule update” dështoi" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Veprimi “git submodule sync” dështoi" @@ -1058,6 +1103,10 @@ msgstr "Po mbahet montim i dështuar “{apkfilename}”" msgid "Keystore for signing key:\t" msgstr "Depo kyçesh për kyç nënshkrimi:\t" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1195,6 +1244,11 @@ msgstr "S’u gjetën etiketa" msgid "No unsigned directory - nothing to do" msgstr "S’ka drejtori të panënshkruar - s’ka ç’bëhet" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "s’u gjetën hollësi versioni" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Përkufizim jo i vlefshëm për madhësinë: “{}”" @@ -1353,6 +1407,11 @@ msgstr "Kryej push të regjistrit te kjo depo e largët git" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "Pushing to remote server failed!" +msgstr "Veprimi “git remote set-head” dështoi: “%s”" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1386,6 +1445,11 @@ msgstr "Leximi i packageName/versionCode/versionName dështoi, APK e pavlefshme: msgid "Reading {apkfilename} from cache" msgstr "Po lexohet {apkfilename} prej fshehtine" +#: ../fdroidserver/build.py +#, fuzzy +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "sill nga interneti versionin më të ri të nënshkrimeve" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Po hiqen kartelat e treguara" @@ -1635,6 +1699,13 @@ msgstr "Ka një përplasje keyalias-i - botimi u ndal" msgid "These are the apps that have been archived from the main repo." msgstr "Këto janë aplikacionet që janë arkivuar nga depoja kryesore." +#: ../fdroidserver/mirror.py +#, fuzzy +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" +"GABIM: ky urdhër s’duhet përdorur kurrë për krijimin e një pasqyre të f-droid.org!\n" +"Një pasqyrë e plotë e f-droid.org lyp më tepër se 200GB." + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Kjo është një depo aplikacionesh për t’u përdorur me F-Droid. Aplikacionet në këtë depo ose janë dyorë zyrtarë të montuar nga zhvilluesit e aplikacionit origjinal, ose janë dyorë të montuar nga burimi prej f-droid.org duke përdorur mjetet në https://gitlab.com/fdroid." @@ -1804,11 +1875,16 @@ msgstr "UpdateCheckData duhet të përdorë URL HTTPS: {url}" msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData s’është URL e vlefshme: {url}" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode është ujdisur, por duket sikur checkupdates s’është xhiruar ende" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +#, fuzzy +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "UpdateCheckMode është ujdisur, por duket sikur checkupdates s’është xhiruar ende" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "Si UpdateCheckName është caktuar ID aplikacioni të njohur - s’mund të hiqet" @@ -1836,6 +1912,11 @@ msgstr "Përdorim" msgid "Usage: %s\n" msgstr "Përdorim: %s\n" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "Për të treguar një kartelë te dega parazgjedhje, përdorni /HEAD, në vend se /master" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Për të treguar një kartelë te dega parazgjedhje, përdorni /HEAD, në vend se /master" @@ -1865,6 +1946,11 @@ msgstr "Po përdoret Nënshkrimi APK-je v2" msgid "Using APK Signature v3" msgstr "Po përdoret Nënshkrimi APK-je v3" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Using JAR Signature" +msgstr "Po përdoret Nënshkrimi APK-je v2" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Po përdoret jarsigner Java, s’rekomandohet për verifikim APK-sh! Përdorni apksigner" @@ -1922,6 +2008,10 @@ msgstr "Kur është formësuar për tregues të nënshkruar, në këtë fazë kr msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distinguished Name' i përdorur teksa prodhoheshin kyçe" @@ -2071,6 +2161,11 @@ msgstr "" msgid "could not parse '{path}'" msgstr "s’u përtyp dot '{path}'" +#: ../fdroidserver/common.py +#, fuzzy +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "s’u përtyp dot specifikim scrlib (s’u dha referencë): '{}'" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "s’u përtyp dot specifikim scrlib (s’u dha referencë): '{}'" @@ -2245,6 +2340,11 @@ msgstr "local_copy_dir duhet të jetë një drejtori, jo një kartelë!" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "pasqyra '%s' s’përfundon me 'fdroid'!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "Tani, ujdisini këto te config.yml:" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2402,6 +2502,11 @@ msgstr "repo_icon “repo/icons/%s” s’ekziston, po prodhohet vendmbajtëse." msgid "repo_url needs to end with /repo" msgstr "repo_url lypset të përfundojë me /repo" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml s’është i instaluar, s’mund të shkruhen tejtëdhëna." @@ -2416,6 +2521,11 @@ msgstr "s3cmd sync indexes {path} to {url} and delete" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "fshehtina e kontrollorit është e keqformuar! Mund ta spastroni me: “{clear}”" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "local_copy_dir does s’mbaron me “fdroid”, ndoshta kishit në mendje: “{path}”" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "librari e përbashkët" @@ -2620,6 +2730,31 @@ msgstr "{path} s’ekziston! Krijojeni duke xhiruar:" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} ka “{pattern}” të gabuar nënshkrimi kartele, ka gjasa të jetë rreng Janus!" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "'sdk_path' te 'config.yml' s’është ujdisur!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2630,6 +2765,11 @@ msgstr "{path} është me madhësi zero!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} më tepër se 200MB, ngarkojeni dorazi: {url}" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index e691818f..2ec52cfe 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2022-11-28 13:20+0000\n" "Last-Translator: Đorđe Vasiljević \n" "Language-Team: Serbian \n" @@ -91,6 +91,11 @@ msgstr[1] "" msgid "%(prog)s: error: %(message)s\n" msgstr "" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -210,6 +215,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -287,6 +297,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -383,6 +397,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "" @@ -549,6 +568,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -615,6 +644,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -781,6 +815,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -845,6 +883,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1050,6 +1092,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1187,6 +1233,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1345,6 +1395,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1378,6 +1432,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1627,6 +1685,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1788,11 +1850,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1820,6 +1886,10 @@ msgstr "" msgid "Usage: %s\n" msgstr "" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1849,6 +1919,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1906,6 +1980,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2055,6 +2133,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2229,6 +2311,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2386,6 +2473,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2400,6 +2492,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2604,6 +2700,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2614,6 +2735,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index aee14242..17c34f60 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-04-11 20:02+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" @@ -97,6 +97,11 @@ msgstr[1] "%(option)s seçeneği %(number)d argüman gerektirir" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: hata: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -216,6 +221,11 @@ msgstr "/issues eksik" msgid "A URL is required as an argument!" msgstr "Bir URL, argüman olarak gereklidir!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "{path} içinde imzalama sertifikaları bulunamadı" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Depodaki paketler için GnuPG ile PGP imzaları ekle" @@ -293,6 +303,11 @@ msgstr "Uygulama İkili Dosyalara sahip ancak sertifikayı sabitlemek için kar msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Uygulamanın NoSourceSince veya ArchivePolicy \"0 sürümü\" var ancak AutoUpdateMode veya UpdateCheckMode Yok değil" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "Uygulamanın NoSourceSince veya ArchivePolicy \"0 sürümü\" var ancak AutoUpdateMode veya UpdateCheckMode Yok değil" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -389,6 +404,11 @@ msgstr "'%s' kategorileri geçersiz" msgid "Categories are not set" msgstr "Kategoriler ayarlı değil" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Uygulama güncellemelerini denetle" @@ -555,6 +575,16 @@ msgstr "Açıklamanın bir listesi (%s) var fakat madde imli (*) veya numaralı( msgid "Description of length {length} is over the {limit} char limit" msgstr "{length} uzunluğundaki açıklama, {limit} karakter sınırının üstünde" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Oluşturulan derleme girdilerine 'disable:' ekleme" @@ -621,6 +651,11 @@ msgstr "Aynalar yapılandırmasında yinelenen \"%s\" girişi!" msgid "Duplicate link in '{field}': {url}" msgstr "'{field}' içinde yinelenen bağlantı: {url}" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "HATA: \"server\" alt komutu kaldırıldı, \"deploy\" kullanın!" @@ -791,6 +826,11 @@ msgstr "Bazı uygulamalar için geçersiz versionCodes bulundu" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "{path} içinde birden fazla JAR İmza Blok Dosyası bulundu" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Found multiple Signer Certificates!" +msgstr "Depo için birden çok imzalama sertifikası bulundu." + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -855,6 +895,11 @@ msgstr "Git remote set-head başarısız: \"%s\"" msgid "Git reset failed" msgstr "Git reset başarısız" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git submodule deinit failed" +msgstr "Git alt modülü güncellemesi başarısız oldu" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Git alt modülü eşzamanlaması başarısız oldu" @@ -1060,6 +1105,10 @@ msgstr "Başarısız yapı \"{apkfilename}\" tutuluyor" msgid "Keystore for signing key:\t" msgstr "İmzalama için anahtar deposu:\t" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1197,6 +1246,11 @@ msgstr "Etiket bulunamadı" msgid "No unsigned directory - nothing to do" msgstr "İmzalanmamış dizin yok - yapılacak işlem yok" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "sürüm bilgisi bulunamadı" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Geçerli bir boyut tanımı değil: \"{}\"" @@ -1355,6 +1409,11 @@ msgstr "Günlüğü bu git uzak deposuna it" msgid "Pushing binary transparency log to {url}" msgstr "İkili şeffaflık günlüğü {url} konumuna gönderiliyor" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "Pushing to remote server failed!" +msgstr "Git remote set-head başarısız: \"%s\"" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1388,6 +1447,11 @@ msgstr "packageName/versionCode/versionName okuma başarısız, APK geçersiz: ' msgid "Reading {apkfilename} from cache" msgstr "{apkfilename} önbellekten okunuyor" +#: ../fdroidserver/build.py +#, fuzzy +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "imzaların en son sürümünü internetten al" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Belirtilen dosyalar kaldırılıyor" @@ -1637,6 +1701,13 @@ msgstr "Bir keyalias çakışması var - yayımlama durdu" msgid "These are the apps that have been archived from the main repo." msgstr "Bunlar ana depodan arşivlenmiş uygulamalardır." +#: ../fdroidserver/mirror.py +#, fuzzy +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" +"HATA: bu komut asla f-droid.org'u yansıtmak için kullanılmamalıdır!\n" +"f-droid.org'un tam bir yansıması 200GB'tan çok yer gerektirir." + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Bu, F-Droid ile kullanılacak uygulamaların bir deposudur. Bu depodaki uygulamalar ya gerçek uygulama geliştiricileri tarafından oluşturulan resmi ikili dosyalardır ya da https://gitlab.com/fdroid adresindeki araçlar kullanılarak f-droid.org yöneticisi tarafından kaynaktan oluşturulan ikili dosyalardır." @@ -1805,11 +1876,16 @@ msgstr "UpdateCheckData, HTTPS URL'sini kullanmalıdır: {url}" msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData geçerli bir URL değil: {url}" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode ayarlı ancak checkupdates henüz çalıştırılmamış gibi görünüyor." +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +#, fuzzy +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "UpdateCheckMode ayarlı ancak checkupdates henüz çalıştırılmamış gibi görünüyor." + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName bilinen uygulama kimliğine ayarlı - kaldırılabilir" @@ -1837,6 +1913,11 @@ msgstr "Kullanım" msgid "Usage: %s\n" msgstr "Kullanım: %s\n" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "Öntanımlı daldaki bir dosyaya işaret etmek için /master yerine /HEAD kullanın" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Öntanımlı daldaki bir dosyaya işaret etmek için /master yerine /HEAD kullanın" @@ -1866,6 +1947,11 @@ msgstr "APK İmza v2 kullanılıyor" msgid "Using APK Signature v3" msgstr "APK İmza v3 kullanılıyor" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Using JAR Signature" +msgstr "APK İmza v2 kullanılıyor" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Java'nın jarsigner'ı kullanılıyor, APK'ları doğrulamak için önerilmez! apksigner'ı kullanın" @@ -1923,6 +2009,10 @@ msgstr "İmzalı indeksler için yapılandırıldığında, bu aşamada sadece i msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Tüm depo denetlenirken yamllint öntanımlı olarak devre dışı bırakılır. Bu seçenek, yamllint kullanımını ne olursa olsun zorlar." +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "Anahtarlar üretilirken X.509 'Distinguished Name' kullanılır" @@ -2072,6 +2162,11 @@ msgstr "çakışan alt ayrıştırıcı: %s" msgid "could not parse '{path}'" msgstr "'{path}' ayrıştırılamadı" +#: ../fdroidserver/common.py +#, fuzzy +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "srclib belirtimi ayrıştırılamadı (referans belirtilmedi): '{}'" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "srclib belirtimi ayrıştırılamadı (referans belirtilmedi): '{}'" @@ -2246,6 +2341,11 @@ msgstr "local_copy_dir bir dizin olmalı, dosya değil!" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "Yansıma '%s' 'fdroid' ile bitmiyor!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "Şimdi bunları config.yml içinde ayarlayın:" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2403,6 +2503,11 @@ msgstr "repo_icon \"repo/icons/%s\" yok, yer tutucu oluşturuyor." msgid "repo_url needs to end with /repo" msgstr "repo_url'nin /repo ile bitmesi gerekiyor" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml kurulu değil, üst veriler yazılamıyor." @@ -2417,6 +2522,11 @@ msgstr "s3cmd sync {path} konumunu {url} adresine indeksler ve siler" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "tarayıcı önbelleği bozuk! Şu şekilde temizleyebilirsiniz: '{clear}'" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "local_copy_dir \"fdroid\" ile sonlanmıyor, belki de \"{path}\" demek istediniz" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "paylaşımlı kütüphane" @@ -2621,6 +2731,31 @@ msgstr "{path} yok! Şunu çalıştırarak oluşturun:" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} konumunun bozuk imzası \"{pattern}\" var, olası Janus istismarı!" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "'sdk_path' config.yml içinde ayarlı değil!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2631,6 +2766,11 @@ msgstr "{path} boyutu sıfır!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} 200MB'den fazla, elle yükleyin: {url}" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/tzm/LC_MESSAGES/fdroidserver.po b/locale/tzm/LC_MESSAGES/fdroidserver.po index 17a0edbf..8654ee12 100644 --- a/locale/tzm/LC_MESSAGES/fdroidserver.po +++ b/locale/tzm/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-681-gc19e8952\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2020-10-29 08:32+0000\n" "Last-Translator: Hakim Oubouali \n" "Language-Team: Central Atlas Tamazight \n" @@ -90,6 +90,11 @@ msgstr[1] "" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: tazgalt: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -209,6 +214,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -286,6 +296,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -382,6 +396,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "" @@ -548,6 +567,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -614,6 +643,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -780,6 +814,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -844,6 +882,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1049,6 +1091,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1186,6 +1232,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1344,6 +1394,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1377,6 +1431,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1626,6 +1684,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1787,11 +1849,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1819,6 +1885,10 @@ msgstr "" msgid "Usage: %s\n" msgstr "" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1848,6 +1918,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1905,6 +1979,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2054,6 +2132,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2228,6 +2310,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2386,6 +2473,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2400,6 +2492,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2604,6 +2700,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2614,6 +2735,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/ug/LC_MESSAGES/fdroidserver.po b/locale/ug/LC_MESSAGES/fdroidserver.po index 307f1d0c..4d96c43c 100644 --- a/locale/ug/LC_MESSAGES/fdroidserver.po +++ b/locale/ug/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2018-06-08 03:44+0000\n" "Last-Translator: ۋولقان \n" "Language-Team: Uyghur \n" @@ -91,6 +91,11 @@ msgstr[1] "" msgid "%(prog)s: error: %(message)s\n" msgstr "" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -210,6 +215,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -287,6 +297,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -383,6 +397,11 @@ msgstr "تۈرلەر قۇرۇلمىغان '%s'" msgid "Categories are not set" msgstr "تۈرلەر قۇرۇلمىغان" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "" @@ -549,6 +568,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -615,6 +644,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -781,6 +815,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -845,6 +883,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1050,6 +1092,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1187,6 +1233,11 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "نەشىر ئۇچۇرى تېپىلمىدى!" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1345,6 +1396,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1378,6 +1433,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1627,6 +1686,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1788,11 +1851,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1820,6 +1887,10 @@ msgstr "" msgid "Usage: %s\n" msgstr "" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1849,6 +1920,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1906,6 +1981,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2055,6 +2134,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2229,6 +2312,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2387,6 +2475,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2401,6 +2494,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2605,6 +2702,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2615,6 +2737,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index a98dea68..f762522e 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2023-05-28 07:54+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" @@ -102,6 +102,11 @@ msgstr[2] "%(option)s параметр вимагає %(number)d аргумен msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: помилка: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -221,6 +226,11 @@ msgstr "/issues відсутній" msgid "A URL is required as an argument!" msgstr "URL потребується як аргумент!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "У {path} не знайдено сертифікатів для підписання" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "Додати підписи GnuPG для пакунків у репозиторії" @@ -298,6 +308,11 @@ msgstr "Програма має двійкові файли, але не має msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Застосунок має NoSourceSince або ArchivePolicy «0 версій», але AutoUpdateMode або UpdateCheckMode не дорівнюють None" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "Застосунок має NoSourceSince або ArchivePolicy «0 версій», але AutoUpdateMode або UpdateCheckMode не дорівнюють None" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -395,6 +410,11 @@ msgstr "Категорія '%s' неприпустима" msgid "Categories are not set" msgstr "Категорії не встановлено" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Перевірте наявність оновлень для застосунків" @@ -561,6 +581,16 @@ msgstr "Опис містить список (%s) але не маркірова msgid "Description of length {length} is over the {limit} char limit" msgstr "Довжина опису {length} перевищує ліміт {limit}" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "Не додавайте 'disable:' до створених записів збірки" @@ -627,6 +657,11 @@ msgstr "Дубльований запис \"%s\" у конфігурації д msgid "Duplicate link in '{field}': {url}" msgstr "Дублікат посилання в '{field}': {url}" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ПОМИЛКА: Підкоманду \"server\" вилучено, використовуйте \"deploy\"!" @@ -797,6 +832,11 @@ msgstr "Знайдено недійсні версії коду для деяк msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Знайдено кілька файлів блоку підписів JAR у {path}" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Found multiple Signer Certificates!" +msgstr "Знайдено кілька сертифікатів підписування для репозиторію." + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -861,6 +901,11 @@ msgstr "Помилка налаштування remote set-head для Git: «%s msgid "Git reset failed" msgstr "Скидання Git не вдалося" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git submodule deinit failed" +msgstr "Не вдалося оновити підмодуль Git" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Не вдалося синхронізувати підмодуль Git" @@ -1066,6 +1111,10 @@ msgstr "Зберігання невдалої збірки \"{apkfilename}\"" msgid "Keystore for signing key:\t" msgstr "Шлях до сховища ключів для ключа підпису сховища\t" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1203,6 +1252,11 @@ msgstr "Теги не знайдено" msgid "No unsigned directory - nothing to do" msgstr "Немає непідписаної теки — нічого виконувати" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "не знайдено відомостей про версію" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "Недійсне визначення розміру: \"{}\"" @@ -1361,6 +1415,11 @@ msgstr "Надіслати журнал цього віддаленого реп msgid "Pushing binary transparency log to {url}" msgstr "Оновити двійковий журнал прозорості для {url}" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "Pushing to remote server failed!" +msgstr "Помилка налаштування remote set-head для Git: «%s»" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1394,6 +1453,11 @@ msgstr "Не вдалося прочитати packageName/versionCode/versionNa msgid "Reading {apkfilename} from cache" msgstr "Читання {apkfilename} з кешу" +#: ../fdroidserver/build.py +#, fuzzy +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "отримати останню версію підписів з інтернету" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Вилучення вказаних файлів" @@ -1644,6 +1708,13 @@ msgstr "Відбулося зіткнення keyalias ключів - припи msgid "These are the apps that have been archived from the main repo." msgstr "Ці застосунки, заархівовано з основного репозиторію." +#: ../fdroidserver/mirror.py +#, fuzzy +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" +"ПОМИЛКА: ця команда ніколи не повинна використовуватися для створення дзеркала f-droid.org!\n" +"Повне дзеркало f-droid.org вимагає понад 200GB." + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "Цей репозиторій застосунків для використання з FDroid. Застосунки в цьому репозиторії — це або офіційні двійкові файли, побудовані розробниками оригінального застосунку, або двійкові файли, побудовані з джерела f-droid.org за допомогою інструментів з https://gitlab.com/fdroid." @@ -1812,11 +1883,16 @@ msgstr "UpdateCheckData має використовувати URL-адресу H msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData не є дійсною URL-адресою: {url}" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode налаштовано, але схоже, що команду checkupdates ще не було запущено" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +#, fuzzy +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "UpdateCheckMode налаштовано, але схоже, що команду checkupdates ще не було запущено" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "Назву застосунку для перевірки оновлень встановлено на відомий ID застосунку — його можна буде вилучити" @@ -1844,6 +1920,11 @@ msgstr "Використання" msgid "Usage: %s\n" msgstr "Використання: %s\n" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "Використовуйте /HEAD замість /master для вказання на файл типовій гілці" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "Використовуйте /HEAD замість /master для вказання на файл типовій гілці" @@ -1873,6 +1954,11 @@ msgstr "Використання підпису APK v2" msgid "Using APK Signature v3" msgstr "Використання підпису APK v3" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Using JAR Signature" +msgstr "Використання підпису APK v2" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Не варто перевіряти APK за допомогою jarsigner Java! Користуйтеся apksigner" @@ -1930,6 +2016,10 @@ msgstr "Коли налаштовано для підписаних індекс msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "Під час перевірки всього репозиторію, yamllint типово вимкнено. Цей параметр змушує нехтувати yamllint." +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distiguished Name' використовується під час створення ключів" @@ -2080,6 +2170,11 @@ msgstr "конфліктний субпарсер: %s" msgid "could not parse '{path}'" msgstr "не вдалося проаналізувати '{path}'" +#: ../fdroidserver/common.py +#, fuzzy +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "не вдалося проаналізувати специфікацію srclib (посилання не вказано): '{}'" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "не вдалося проаналізувати специфікацію srclib (посилання не вказано): '{}'" @@ -2255,6 +2350,11 @@ msgstr "local_copy_dir мусить бути текою, не файлом!" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "дзеркало '%s' не закінчується на 'fdroid'!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "Тепер встановіть їх у config.yml:" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2412,6 +2512,11 @@ msgstr "repo_icon \"repo/icons/%s\" не існує, створення запо msgid "repo_url needs to end with /repo" msgstr "repo_url повинен закінчуватися на /repo" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "ruamel.yaml не встановлено, не вдається записати метадані." @@ -2426,6 +2531,11 @@ msgstr "s3cmd синхронізувати індекси з {path} до {url} msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "кеш сканера пошкоджено! Ви можете очистити його за допомогою: '{clear}'" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "local_copy_dir мусить закінчуватися на \"fdroid\", ймовірно, малося на увазі: \"{path}\"" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "спільна бібліотека" @@ -2631,6 +2741,31 @@ msgstr "{path} не існує! Створіть його, запустивши: msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path}: недійсний підпис \"{pattern}\". Виглядає підозріло і схоже на спробу порушення безпеки Janus exploit!" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "'sdk_path' не встановлено в config.yml!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2641,6 +2776,11 @@ msgstr "{path} не має розміру!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path} понад 200 МБ, вивантажити власноруч: {url}" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 2ec6f3af..0f78fc1a 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -34,7 +34,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-04-13 17:01+0000\n" "Last-Translator: ALoLo_527 \n" "Language-Team: Chinese (Simplified) \n" @@ -122,6 +122,11 @@ msgstr[0] "%(option)s 选项需要 %(number)d 个参数" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s:错误:%(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -199,9 +204,7 @@ msgstr "'{aapt}' 太旧, F-Droid 需要 build-tools-{version} 或更新的版本 #: ../fdroidserver/common.py #, python-brace-format -msgid "" -"'{field}' will be in random order! Use () or [] brackets if order is " -"important!" +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "{field} 将随机排列! 如果顺序很重要, 请使用 () 或 [] 括号!" #: ../fdroidserver/common.py @@ -237,13 +240,17 @@ msgstr ".__call__() 未定义" #: ../fdroidserver/lint.py msgid "/issues is missing" -msgstr "" -"路径缺少 /issues ( 译者注: 此处仅支持 github 或 gitlab 之 issues 链接 )" +msgstr "路径缺少 /issues ( 译者注: 此处仅支持 github 或 gitlab 之 issues 链接 )" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" msgstr "需要有一个链接作为参数!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "在 {path} 中找不到签名证书" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "使用 GnuPG 为存储库之软件包添加 PGP 签名" @@ -270,9 +277,7 @@ msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "缺少 AllowedAPKSigningKeys,但提供了参考二进制文件" #: ../fdroidserver/import_subcommand.py -msgid "" -"Allows a different revision (or git branch) to be specified for the initial " -"import" +msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "可让运行初始导入时指定不同修订 ( 或 git 分支 )" #: ../fdroidserver/mirror.py @@ -316,18 +321,17 @@ msgid "Android SDK tool {cmd} not found!" msgstr "没找到 Android SDK 工具 {cmd}!" #: ../fdroidserver/lint.py -msgid "" -"App has Binaries but does not have corresponding AllowedAPKSigningKeys to " -"pin certificate." +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "应用程序具有二进制文件,但没有相应的AllowedAPKSigningKeys 来固定证书。" #: ../fdroidserver/lint.py -msgid "" -"App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or " -"UpdateCheckMode are not None" -msgstr "" -"应用的 NoSourceSince 或 ArchivePolicy 为 “0 versions” 但 AutoUpdateMode 或 " -"UpdateCheckMode 不是 None" +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "应用的 NoSourceSince 或 ArchivePolicy 为 “0 versions” 但 AutoUpdateMode 或 UpdateCheckMode 不是 None" + +#: ../fdroidserver/lint.py +#, fuzzy +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "应用的 NoSourceSince 或 ArchivePolicy 为 “0 versions” 但 AutoUpdateMode 或 UpdateCheckMode 不是 None" #: ../fdroidserver/lint.py #, python-brace-format @@ -335,11 +339,8 @@ msgid "App is in '{repo}' but has a link to {url}" msgstr "应用 在 '{repo}' 中, 但有一个链接到 {url}" #: ../fdroidserver/lint.py -msgid "" -"App version has binary but does not have corresponding AllowedAPKSigningKeys " -"to pin certificate." -msgstr "" -"应用程序版本具有二进制文件,但没有相应的 AllowedAPKSigningKeys 来固定证书。" +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "应用程序版本具有二进制文件,但没有相应的 AllowedAPKSigningKeys 来固定证书。" #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -360,9 +361,7 @@ msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "镜像配置中的错误条目类型“{mirrortype}”:{mirror}" #: ../fdroidserver/mirror.py -msgid "" -"Base URL to mirror, can include the index signing key using the query " -"string: ?fingerprint=" +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "镜像的基本链接可以使用此请求参数包含索引签名键: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname @@ -429,18 +428,19 @@ msgstr "类别 '%s' 无效" msgid "Categories are not set" msgstr "没有设置类别" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "检查应用的更新" #: ../fdroidserver/update.py #, python-brace-format -msgid "" -"Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, " -"archapks:{arch}" -msgstr "" -"正为 {appid} 检查存档: 安装包: {integer}, 保留版本数: {keep}, 架构安装包: " -"{arch}" +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "正为 {appid} 检查存档: 安装包: {integer}, 保留版本数: {keep}, 架构安装包: {arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -465,9 +465,7 @@ msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr ".yml 和本地化文件之间的“{field}”定义冲突:" #: ../fdroidserver/__main__.py -msgid "" -"Conflicting arguments: '--verbose' and '--quiet' can not be specified at the " -"same time." +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "冲突的参数: '--verbose' 和 '--quiet' 不能被同时使用." #: ../fdroidserver/common.py @@ -601,6 +599,16 @@ msgstr "简介中带有列表(%s),但它既不是子弹(*)形列表也 msgid "Description of length {length} is over the {limit} char limit" msgstr "简介长度 {length} 超过 {limit} 字限制" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "不要给生成的构建项添加 'disable:'" @@ -627,9 +635,7 @@ msgid "Don't create a source tarball, useful when testing a build" msgstr "不创建源码 tarball 文件,便于内部版本测试" #: ../fdroidserver/build.py -msgid "" -"Don't refresh the repository, useful when testing a build with no internet " -"connection" +msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "不刷新资源库,便于没有互联网时的内部版本测试" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py @@ -669,6 +675,11 @@ msgstr "镜像配置中的重复条目“%s”!" msgid "Duplicate link in '{field}': {url}" msgstr "“{field}”中有重复的链接:{url}" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "错误:\"server\" 子命令已被删除,请使用 \"deploy\"!" @@ -692,12 +703,8 @@ msgstr "错误:不支持的 git 主机类型 \"%s\",欢迎提交补丁添加 #: ../fdroidserver/__main__.py #, python-brace-format -msgid "" -"Encoding is set to '{enc}' fdroid might run into encoding issues. Please set " -"it to 'UTF-8' for best results." -msgstr "" -"编码被设置为“{enc}”,可能会导致 fdroid 出现编码问题。为了最佳效果,请将其更改" -"为“UTF-8”。" +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "编码被设置为“{enc}”,可能会导致 fdroid 出现编码问题。为了最佳效果,请将其更改为“UTF-8”。" #: ../fdroidserver/init.py #, python-format @@ -807,9 +814,7 @@ msgid "Forbidden HTML tags" msgstr "禁止的HTML标签" #: ../fdroidserver/build.py -msgid "" -"Force build of disabled apps, and carries on regardless of scan problems. " -"Only allowed in test mode." +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "强制编译已禁用应用,忽略扫描出错。仅用于测试模式。" #: ../fdroidserver/build.py @@ -845,6 +850,11 @@ msgstr "发现某些应用的版本代码无效" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "在{path}中发现多个JAR签名块文件" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Found multiple Signer Certificates!" +msgstr "发现存储库的多个签名证书。" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -909,6 +919,11 @@ msgstr "Git remote set-head 失败:\"%s\"" msgid "Git reset failed" msgstr "Git reset 失败" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git submodule deinit failed" +msgstr "Git 子模块更新失败" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Git 子模块同步失败" @@ -1098,8 +1113,7 @@ msgid "Java compiled class" msgstr "Java 编译类" #: ../fdroidserver/signindex.py -msgid "" -"Java jarsigner not found! Install in standard location or set java_paths!" +msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "未找到 Java jarsigner!安装在标准位置或设置java_paths!" #: ../fdroidserver/lint.py @@ -1116,11 +1130,13 @@ msgid "Keystore for signing key:\t" msgstr "签名密钥的密钥库:\t" #: ../fdroidserver/lint.py -#, python-brace-format -msgid "" -"Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgid "Known debug key is used in AllowedAPKSigningKeys: " msgstr "" -"最后使用的提交 '{commit}' 看起来像一个标签,但 UpdateCheckMode 是 '{ucm}'" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "最后使用的提交 '{commit}' 看起来像一个标签,但 UpdateCheckMode 是 '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" @@ -1254,6 +1270,11 @@ msgstr "未找到标签" msgid "No unsigned directory - nothing to do" msgstr "没有未签名的目录 - 无操作" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "没有找到版本信息" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "不是有效的大小定义:“{}”" @@ -1412,6 +1433,11 @@ msgstr "拖送日志至 git 远程资源库" msgid "Pushing binary transparency log to {url}" msgstr "正推送二进制文件透明日志到{url}" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "Pushing to remote server failed!" +msgstr "Git remote set-head 失败:\"%s\"" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1432,25 +1458,23 @@ msgstr "读取 '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format -msgid "" -"Reading packageName/versionCode/versionName failed, APK invalid: " -"'{apkfilename}'" -msgstr "" -"读取 packageName/versionCode/versionName 失败,APK 无效:'{apkfilename}'" +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "读取 packageName/versionCode/versionName 失败,APK 无效:'{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format -msgid "" -"Reading packageName/versionCode/versionName failed,APK invalid: " -"'{apkfilename}'" -msgstr "" -"读取 packageName/versionCode/versionName 失败,APK 无效:'{apkfilename}'" +msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" +msgstr "读取 packageName/versionCode/versionName 失败,APK 无效:'{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" msgstr "从缓存读取 {apkfilename}" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "删除指定文件" @@ -1469,9 +1493,7 @@ msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "RepoTrunk 更新模式仅对 git-svn 存储库有意义" #: ../fdroidserver/build.py -msgid "" -"Reset and create a brand new build server, even if the existing one appears " -"to be ok." +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "即使已有服务器看起来运行正常,请重置并创建一个全新的编译服务器。" #: ../fdroidserver/nightly.py @@ -1655,9 +1677,7 @@ msgid "System clock is older than date in {path}!" msgstr "系统时钟早于 {path} 中的日期!" #: ../fdroidserver/checkupdates.py -msgid "" -"Tags update mode only works for git, hg, bzr and git-svn repositories " -"currently" +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "标签更新模式目前仅适用于 git、hg、bzr 和 git-svn 存储库" #: ../fdroidserver/checkupdates.py @@ -1665,9 +1685,7 @@ msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "git-svn 中使用的标记更新模式,但未使用标记设置存储库" #: ../fdroidserver/build.py -msgid "" -"Test mode - put output in the tmp directory only, and always build, even if " -"the output already exists." +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "测试模式:仅将输出保存至 tmp 目录,即使输出已存在,仍然编译。" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode @@ -1705,16 +1723,16 @@ msgstr "存在密钥别名冲突 - 发布已停止" msgid "These are the apps that have been archived from the main repo." msgstr "这些是已从主存储库存档的应用。" -#: ../fdroidserver/common.py -msgid "" -"This is a repository of apps to be used with F-Droid. Applications in this " -"repository are either official binaries built by the original application " -"developers, or are binaries built from source by the admin of f-droid.org " -"using the tools on https://gitlab.com/fdroid." +#: ../fdroidserver/mirror.py +#, fuzzy +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." msgstr "" -"这是一个与F-Droid一起使用的应用的存储库。这个存储库中的应用要么是原应用开发者" -"构建的官方二进制文件,要么是 f-droid.org 的管理员使用 https://gitlab.com/" -"fdroid 上的工具从源代码构建而来的二进制文件。" +"错误:请不要使用此命令来镜像 f-droid.org!\n" +"对 f-droid.org 进行完整镜像至少需要超过 200GB 的储存空间。" + +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "这是一个与F-Droid一起使用的应用的存储库。这个存储库中的应用要么是原应用开发者构建的官方二进制文件,要么是 f-droid.org 的管理员使用 https://gitlab.com/fdroid 上的工具从源代码构建而来的二进制文件。" #: ../fdroidserver/import_subcommand.py #, python-format @@ -1741,11 +1759,8 @@ msgstr "" "和 https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py -msgid "" -"To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config." -"yml!" -msgstr "" -"要使用 awsbucket,还必须在 config.yml 中设置 awssecretkey 和 awsaccesskeyid!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "要使用 awsbucket,还必须在 config.yml 中设置 awssecretkey 和 awsaccesskeyid!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1761,17 +1776,11 @@ msgid "URL {url} in Description: {error}" msgstr "描述中的网址 {url}:{error}" #: ../fdroidserver/lint.py -msgid "" -"Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from " -"https://spdx.org/license-list" -msgstr "" -"意外的许可证标签“{}”!仅使用来自 https://spdx.org/license-list 的 FSF 或 OSI " -"批准的标签" +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "意外的许可证标签“{}”!仅使用来自 https://spdx.org/license-list 的 FSF 或 OSI 批准的标签" #: ../fdroidserver/lint.py -msgid "" -"Unexpected license tag \"{}\"! Only use license tags configured in your " -"config file" +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "意外的许可证标签“{}”!仅使用配置文件中配置的许可证标记" #: ../fdroidserver/common.py @@ -1876,9 +1885,7 @@ msgstr "UpdateCheckData 具有无效的 URL:{url}" #: ../fdroidserver/lint.py #, python-brace-format -msgid "" -"UpdateCheckData must match the version code as integer (\\d or [0-9]): " -"{codeex}" +msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "UpdateCheckData 必须以整数(\\d 或 [0-9])的形式匹配版本代码:{codeex}" #: ../fdroidserver/lint.py @@ -1891,10 +1898,13 @@ msgstr "UpdateCheckData必须使用HTTPS URL:{url}" msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData 不是有效的网址:{url}" +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." +msgstr "" + #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "" -"UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" msgstr "" #: ../fdroidserver/lint.py @@ -1924,6 +1934,10 @@ msgstr "使用" msgid "Usage: %s\n" msgstr "用法:%s\n" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1954,8 +1968,12 @@ msgid "Using APK Signature v3" msgstr "使用 APK 签名 v3" #: ../fdroidserver/common.py -msgid "" -"Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +#, fuzzy +msgid "Using JAR Signature" +msgstr "使用 APK 签名 v2" + +#: ../fdroidserver/common.py +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" #: ../fdroidserver/common.py @@ -1996,9 +2014,7 @@ msgstr "验证目录签名中:" #: ../fdroidserver/deploy.py #, python-brace-format -msgid "" -"VirusTotal API key cannot upload files larger than 32MB, use {url} to upload " -"{path}." +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" #: ../fdroidserver/__main__.py @@ -2006,15 +2022,15 @@ msgid "Warn about possible metadata errors" msgstr "警告元数据中可能存在的错误" #: ../fdroidserver/update.py -msgid "" -"When configured for signed indexes, create only unsigned indexes at this " -"stage" +msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "如果已配置为使用签名索引,该阶段仅创建未签名索引" #: ../fdroidserver/lint.py -msgid "" -"When linting the entire repository yamllint is disabled by default. This " -"option forces yamllint regardless." +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgstr "" + +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." msgstr "" #: ../fdroidserver/init.py @@ -2165,6 +2181,10 @@ msgstr "有冲突的子解析器:%s" msgid "could not parse '{path}'" msgstr "无法解析 '{path}'" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2308,9 +2328,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format -msgid "" -"invalid option string %(option)r: must start with a character " -"%(prefix_chars)r" +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" #: ../fdroidserver/common.py @@ -2324,8 +2342,7 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format -msgid "" -"local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir未以“ fdroid”结尾,也许你指的是:“ {path}”" #: ../fdroidserver/deploy.py @@ -2341,6 +2358,11 @@ msgstr "local_copy_dir必须是目录,不能是文件!" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "现在在 config.yml 中设置这些:" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2486,9 +2508,7 @@ msgstr "" #: ../fdroidserver/signatures.py #, python-brace-format -msgid "" -"refuse downloading via insecure HTTP connection (use HTTPS or specify --no-" -"https-check): {apkfilename}" +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" msgstr "" #: ../fdroidserver/index.py @@ -2500,6 +2520,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2514,6 +2539,11 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "local_copy_dir未以“ fdroid”结尾,也许你指的是:“ {path}”" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2717,6 +2747,31 @@ msgstr "{path} 不存在!通过运行以下命令创建它:" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "未在 config.yml 中设置 'sdk_path'!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2727,6 +2782,11 @@ msgstr "{path}的大小为零!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "{path}的大小超过200MB,请手动上传:{url}" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 594047c2..ce20cfa5 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Chinese (Traditional) \n" @@ -97,6 +97,11 @@ msgstr[0] "%(option)s 的選項需要 %(number)d 參數" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: 錯誤: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -218,6 +223,11 @@ msgstr "/issues 有遺漏" msgid "A URL is required as an argument!" msgstr "需要 URL 作為參數!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "{path} 找不到簽署證書" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "在軟體庫中加入使用 GnuPG 套件包的 gpg 簽署" @@ -298,6 +308,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -393,6 +407,11 @@ msgstr "'%s' 類別無效" msgid "Categories are not set" msgstr "類別未設定" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "檢查應用程式更新" @@ -564,6 +583,16 @@ msgstr "描述中有一個列表 (%s) 但它並未被編排 (*) 或作編號 (#) msgid "Description of length {length} is over the {limit} char limit" msgstr "描述的長度 {length} 已超過 {limit} 個字符限制" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Do not add 'disable:' to the generated build entries" @@ -631,6 +660,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "'{field}' 有重複的連結:{url}" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py #, fuzzy msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -805,6 +839,11 @@ msgstr "有些應用的版本代號無效" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "{path} 找到多筆簽名證書" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Found multiple Signer Certificates!" +msgstr "軟體庫找到多份簽署證書。" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -870,6 +909,11 @@ msgstr "Git 遠端 set-head 失敗: \"%s\"" msgid "Git reset failed" msgstr "Git 重置失敗" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Git submodule deinit failed" +msgstr "Git 子模組更新失敗" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "Git 子模組同步失敗" @@ -1081,6 +1125,10 @@ msgstr "讀取 minSdkVersion 失敗:\"{apkfilename}\"" msgid "Keystore for signing key:\t" msgstr "金鑰庫的簽署金鑰:\t" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1224,6 +1272,11 @@ msgstr "查無附加的設備" msgid "No unsigned directory - nothing to do" msgstr "無未簽署目錄 - 無須採取行動" +#: ../fdroidserver/__main__.py +#, fuzzy +msgid "No version information could be found." +msgstr "未發現版本資訊" + #: ../fdroidserver/common.py #, fuzzy msgid "Not a valid size definition: \"{}\"" @@ -1388,6 +1441,11 @@ msgstr "將日誌推送到 git 遠端軟體庫" msgid "Pushing binary transparency log to {url}" msgstr "推二進制的透明日誌到{url}" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "Pushing to remote server failed!" +msgstr "Git 遠端 set-head 失敗: \"%s\"" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1421,6 +1479,10 @@ msgstr "讀取套件名稱/版本代碼/版本名稱 失敗,APK 無效:'{apk msgid "Reading {apkfilename} from cache" msgstr "從緩存讀取 {apkfilename}" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "移除指定檔案" @@ -1673,6 +1735,13 @@ msgstr "發生主要別名衝突 - 發佈中止" msgid "These are the apps that have been archived from the main repo." msgstr "這些是從主軟體庫中歸檔的軟體。" +#: ../fdroidserver/mirror.py +#, fuzzy +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" +"錯誤:此命令絕不該用於鏡像 f-droid.org!\n" +"完整的 f-droid.org 鏡像需要超過 200GB。" + #: ../fdroidserver/common.py #, fuzzy msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." @@ -1838,11 +1907,15 @@ msgstr "UpdateCheckData 必須使用 HTTPS URL:{url}" msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData 不是有效的 URL:{url}" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py #, fuzzy msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -1871,6 +1944,11 @@ msgstr "使用方法" msgid "Usage: %s\n" msgstr "使用方法:%s\n" +#: ../fdroidserver/lint.py +#, fuzzy +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "使用 /HEAD 取代 /master 來指向默認分支的一個檔案" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "使用 /HEAD 取代 /master 來指向默認分支的一個檔案" @@ -1902,6 +1980,11 @@ msgstr "使用 APK Signature v2" msgid "Using APK Signature v3" msgstr "使用 APK Signature v3" +#: ../fdroidserver/common.py +#, fuzzy +msgid "Using JAR Signature" +msgstr "使用 APK Signature v2" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "使用 Java 的 jarsigner,這並不建議用於驗證 APK!使用 apksigner" @@ -1960,6 +2043,10 @@ msgstr "當已組態為簽名的索引時,只能在此階段建立無簽名的 msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "在默認情況下, 檢查整個軟體庫中的可疑代碼時不會檢查 yaml 檔案 (yamllint) 。 使用本選項將會忽略默認選項,在檢查整個軟體庫中的可疑代碼時強制檢查 yaml 檔案 (yamllint) 。" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "產生金鑰時使用 X.509 的'專有名稱'" @@ -2116,6 +2203,11 @@ msgstr "相衝突的選項字串:%s" msgid "could not parse '{path}'" msgstr "無法解析 '{path}'" +#: ../fdroidserver/common.py +#, fuzzy +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "無法解析 scrlib spec (沒有指定參考文獻): '{}'" + #: ../fdroidserver/common.py #, fuzzy msgid "could not parse srclib spec (no ref specified): '{}'" @@ -2295,6 +2387,11 @@ msgstr "local_copy_dir 為目錄,不是檔案!" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "鏡像 '%s' 並不是以 'fdroid' 作結尾!" +#: ../fdroidserver/index.py +#, fuzzy, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "現在設定這些在 config.yml 中:" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2454,6 +2551,11 @@ msgstr "軟體庫圖標 (repo_icon)\"repo/icons/%s\" 不存在, 正在生 msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py #, fuzzy msgid "ruamel.yaml not installed, can not write metadata." @@ -2469,6 +2571,11 @@ msgstr "s3cmd 同步索引 {path} 到 {url} 並刪除" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "local_copy_dir 未以 \"fdroid\"結尾,也許你指示的是: \"{path}\"" + #: ../fdroidserver/scanner.py #, fuzzy msgid "shared library" @@ -2675,6 +2782,31 @@ msgstr "\"{path}\" 不存在!經由執行建立它:" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} 有不正確的檔案簽章「{pattern}」,可能是 Janus 漏洞!" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "'config.yml' 未設定 'sdk_path'!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2685,6 +2817,11 @@ msgstr "{path} 為零尺寸!" msgid "{path} more than 200MB, manually upload: {url}" msgstr "檔案 {path} 大於 200MB , 手動上傳: {url}" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{path}: {error}" From 25b1a774248252eb5616641812a6bf90d4bbd6e1 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 14 May 2024 12:21:35 +0200 Subject: [PATCH 1517/2116] fix merge conflict with https://hosted.weblate.org/projects/f-droid/fdroidserver/ --- locale/fa/LC_MESSAGES/fdroidserver.po | 130 +------------------------- 1 file changed, 2 insertions(+), 128 deletions(-) diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index 56d5ea98..91ef57e3 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2023-05-24 22:18+0200\n" "PO-Revision-Date: 2023-08-08 22:56+0000\n" "Last-Translator: HM \n" "Language-Team: Persian \n" @@ -93,11 +93,6 @@ msgstr[1] "گزینه %(option)s نیاز به آرگومان‌های %(number) msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: خطا: %(message)s\n" -#: ../fdroidserver/publish.py -#, python-format -msgid "%d APKs failed to be signed or verified!" -msgstr "" - #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -217,11 +212,6 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "APK signatures have different certificates in {path}:" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -299,10 +289,6 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -399,11 +385,6 @@ msgstr "" msgid "Categories are not set" msgstr "" -#: ../fdroidserver/index.py -#, python-brace-format -msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "به‌روزرسانی‌ها برای برنامه‌ها را بررسی می‌کند" @@ -570,16 +551,6 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Did you mean config/{name}.yml?" -msgstr "" - -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "Did you mean {code}?" -msgstr "" - #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -646,11 +617,6 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "ERROR: %(message)s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -817,10 +783,6 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" -#: ../fdroidserver/common.py -msgid "Found multiple Signer Certificates!" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -885,10 +847,6 @@ msgstr "" msgid "Git reset failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git submodule deinit failed" -msgstr "" - #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1094,10 +1052,6 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" -#: ../fdroidserver/lint.py -msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1235,10 +1189,6 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" -#: ../fdroidserver/__main__.py -msgid "No version information could be found." -msgstr "" - #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1397,10 +1347,6 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" -#: ../fdroidserver/deploy.py -msgid "Pushing to remote server failed!" -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1434,10 +1380,6 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" -#: ../fdroidserver/build.py -msgid "Refresh and cache scanner rules and signatures from the network" -msgstr "" - #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1687,10 +1629,6 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" -#: ../fdroidserver/mirror.py -msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "" - #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1852,13 +1790,9 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "" - #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #: ../fdroidserver/lint.py @@ -1888,10 +1822,6 @@ msgstr "استفاده" msgid "Usage: %s\n" msgstr "مصرف: %s\n" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1921,10 +1851,6 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" -#: ../fdroidserver/common.py -msgid "Using JAR Signature" -msgstr "" - #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1982,10 +1908,6 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" -#: ../fdroidserver/publish.py -msgid "When signing or verifying fails, exit with an error code." -msgstr "" - #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2135,10 +2057,6 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "" - #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2314,11 +2232,6 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" -#: ../fdroidserver/index.py -#, python-brace-format -msgid "mirrors set twice, in config.yml and {path}!" -msgstr "" - #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2477,11 +2390,6 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "rsync is missing or broken: {error}" -msgstr "" - #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2496,10 +2404,6 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" -#: ../fdroidserver/deploy.py -msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "" - #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2704,31 +2608,6 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" -#: ../fdroidserver/deploy.py -#, python-brace-format -msgid "{path} has been flagged by virustotal {count} times:" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" - -#: ../fdroidserver/common.py -#, fuzzy, python-brace-format -msgid "{path} is not a standard config file!" -msgstr "'sdk_path' تنظیم نشده است در config.yml!" - -#: ../fdroidserver/index.py -#, python-brace-format -msgid "{path} is not list, but a {datatype}!" -msgstr "" - -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2739,11 +2618,6 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" -#: ../fdroidserver/lint.py -#, python-brace-format -msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" From afb9b7570ebb1c247be634526f1da32991505422 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 2 May 2024 17:47:50 +0200 Subject: [PATCH 1518/2116] buildserver: use sdkmanager from backports --- buildserver/provision-apt-get-install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index 89c6e2de..cbb5a350 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -116,7 +116,7 @@ packages=" patch python3-packaging rsync - sdkmanager + sdkmanager/bookworm-backports sudo unzip " From df97ebe05298b6c0261d2dfbc1c2dd05687cfc7c Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Fri, 17 May 2024 18:30:08 +0300 Subject: [PATCH 1519/2116] scanner - pickup by id, sort list --- fdroidserver/scanner.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index c17e7c29..fc9ef13a 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -60,13 +60,14 @@ class ExitCode(IntEnum): def get_gradle_compile_commands(build): - compileCommands = ['compile', - 'provided', + compileCommands = ['api', 'apk', - 'implementation', 'classpath', - 'api', + 'compile', 'compileOnly', + 'id', + 'implementation', + 'provided', 'runtimeOnly'] buildTypes = ['', 'release'] flavors = [''] From 98f935493e493680725ae1534d7c0b6e96de22f0 Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Tue, 21 May 2024 15:07:51 +0000 Subject: [PATCH 1520/2116] fix test cases --- tests/scanner.TestCase | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 6a85b7f3..76cece25 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -53,7 +53,7 @@ class ScannerTest(unittest.TestCase): 'OtakuWorld': 2, 'Zillode': 1, 'cn.wildfirechat.chat': 4, - 'com.github.shadowsocks': 7, + 'com.github.shadowsocks': 10, 'com.integreight.onesheeld': 16, 'com.jens.automation2': 3, 'firebase-suspect': 1, @@ -76,7 +76,7 @@ class ScannerTest(unittest.TestCase): ('source-files/com.nextcloud.client/build.gradle', 'generic', 28), ('source-files/com.kunzisoft.testcase/build.gradle', 'libre', 4), ('source-files/cn.wildfirechat.chat/chat/build.gradle', 'yes', 33), - ('source-files/org.tasks/app/build.gradle.kts', 'generic', 39), + ('source-files/org.tasks/app/build.gradle.kts', 'generic', 43), ('source-files/at.bitfire.davdroid/build.gradle', 'standard', 16), ('source-files/se.manyver/android/app/build.gradle', 'indie', 29), ('source-files/osmandapp/osmand/build.gradle', 'free', 5), From feafe2812d34abaf513e015843be82b320163488 Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Wed, 22 May 2024 13:40:27 +0000 Subject: [PATCH 1521/2116] Fix more tests after !1487 --- tests/scanner.TestCase | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 76cece25..c412b32e 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -53,7 +53,7 @@ class ScannerTest(unittest.TestCase): 'OtakuWorld': 2, 'Zillode': 1, 'cn.wildfirechat.chat': 4, - 'com.github.shadowsocks': 10, + 'com.github.shadowsocks': 9, 'com.integreight.onesheeld': 16, 'com.jens.automation2': 3, 'firebase-suspect': 1, @@ -82,7 +82,7 @@ class ScannerTest(unittest.TestCase): ('source-files/osmandapp/osmand/build.gradle', 'free', 5), ('source-files/eu.siacs.conversations/build.gradle', 'free', 24), ('source-files/org.mozilla.rocket/app/build.gradle', 'focus', 42), - ('source-files/com.jens.automation2/app/build.gradle', 'fdroidFlavor', 8), + ('source-files/com.jens.automation2/app/build.gradle', 'fdroidFlavor', 9), ] for f, flavor, count in test_files: From 7aabfbcbf001289c14af8e0b903a51c9ea3d9733 Mon Sep 17 00:00:00 2001 From: paul mayero Date: Wed, 29 May 2024 14:08:07 +0000 Subject: [PATCH 1522/2116] Adding rclone as an option to fdroid deploy --- examples/config.yml | 59 ++++++++++++++-- fdroidserver/deploy.py | 152 ++++++++++++++++++++++++++++++++++++++++- tests/deploy.TestCase | 51 ++++++++++++++ 3 files changed, 255 insertions(+), 7 deletions(-) diff --git a/examples/config.yml b/examples/config.yml index 0a0a54f0..646726bb 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -267,10 +267,20 @@ # sync_from_local_copy_dir: true -# To upload the repo to an Amazon S3 bucket using `fdroid server -# update`. Warning, this deletes and recreates the whole fdroid/ -# directory each time. This prefers s3cmd, but can also use -# apache-libcloud. To customize how s3cmd interacts with the cloud +# To upload the repo to an Amazon S3 bucket using `fdroid deploy' +# . rclone, s3cmd and apache libcloud are the available options. +# If rclone and s3cmd are not installed, apache libcloud is used. +# To use apache libcloud, add the following options to this file +# (config.yml) +# +# awsbucket: myawsfdroid +# awsaccesskeyid: SEE0CHAITHEIMAUR2USA +# awssecretkey: {env: awssecretkey} +# +# In case s3cmd is installed and rclone is not installed, +# s3cmd will be the preferred sync option. +# It will delete and recreate the whole fdroid directory each time. +# To customize how s3cmd interacts with the cloud # provider, create a 's3cfg' file next to this file (config.yml), and # those settings will be used instead of any 'aws' variable below. # Secrets can be fetched from environment variables to ensure that @@ -279,6 +289,47 @@ # awsbucket: myawsfdroid # awsaccesskeyid: SEE0CHAITHEIMAUR2USA # awssecretkey: {env: awssecretkey} +# +# In case rclone is installed and s3cmd is not installed, +# rclone will be the preferred sync option. +# It will sync the local folders with remote folders without +# deleting anything in one go. +# To ensure success, install rclone as per +# the instructions at https://rclone.org/install/ and also configure for +# object storage services as detailed at https://rclone.org/s3/#configuration +# By default rclone uses the configuration file at ~/.config/rclone/rclone.conf +# To specify a custom configuration file, please add the full path to the +# configuration file as below +# +# path_to_custom_rclone_config: /home/mycomputer/somedir/example.conf +# +# This setting will ignore the default rclone config found at +# ~/.config/rclone/rclone.conf +# +# Please note that rclone_config can be assigned a string or list +# +# awsbucket: myawsfdroid +# rclone_config: aws-sample-config +# +# or +# +# awsbucket: myawsfdroid +# rclone_config: [aws-sample-config, rclone-supported-service-config] +# +# In case both rclone and s3cmd are installed, the preferred sync +# tool can be specified in this file (config.yml) +# if s3cmd is preferred, set it as below +# +# s3cmd: true +# +# if rclone is preferred, set it as below +# +# rclone: true +# +# Please note that only one can be set to true at any time +# Also, in the event that both s3cmd and rclone are installed +# and both are missing from the config.yml file, the preferred +# tool will be s3cmd. # If you want to force 'fdroid server' to use a non-standard serverwebroot. diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index b4b4cd95..b120999f 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -28,6 +28,7 @@ import urllib import yaml from argparse import ArgumentParser import logging +from shlex import split import shutil from . import _ @@ -44,6 +45,7 @@ BINARY_TRANSPARENCY_DIR = 'binary_transparency' AUTO_S3CFG = '.fdroid-deploy-s3cfg' USER_S3CFG = 's3cfg' +USER_RCLONE_CONF = None REMOTE_HOSTNAME_REGEX = re.compile(r'\W*\w+\W+(\w+).*') INDEX_FILES = [ @@ -89,7 +91,7 @@ def _get_index_excludes(repo_section): return index_excludes -def update_awsbucket(repo_section): +def update_awsbucket(repo_section, verbose=False, quiet=False): """Upload the contents of the directory `repo_section` (including subdirectories) to the AWS S3 "bucket". The contents of that subdir of the @@ -101,8 +103,29 @@ def update_awsbucket(repo_section): f'''Syncing "{repo_section}" to Amazon S3 bucket "{config['awsbucket']}"''' ) - if common.set_command_in_config('s3cmd'): + if common.set_command_in_config('s3cmd') and common.set_command_in_config('rclone'): + logging.info( + 'Both rclone and s3cmd are installed. Checking config.yml for preference.' + ) + if config['s3cmd'] is not True and config['rclone'] is not True: + logging.warning( + 'No syncing tool set in config.yml!. Defaulting to using s3cmd' + ) + update_awsbucket_s3cmd(repo_section) + if config['s3cmd'] is True and config['rclone'] is True: + logging.warning( + 'Both syncing tools set in config.yml!. Defaulting to using s3cmd' + ) + update_awsbucket_s3cmd(repo_section) + if config['s3cmd'] is True and config['rclone'] is not True: + update_awsbucket_s3cmd(repo_section) + if config['rclone'] is True and config['s3cmd'] is not True: + update_remote_storage_with_rclone(repo_section, verbose, quiet) + + elif common.set_command_in_config('s3cmd'): update_awsbucket_s3cmd(repo_section) + elif common.set_command_in_config('rclone'): + update_remote_storage_with_rclone(repo_section, verbose, quiet) else: update_awsbucket_libcloud(repo_section) @@ -186,6 +209,129 @@ def update_awsbucket_s3cmd(repo_section): raise FDroidException() +def update_remote_storage_with_rclone(repo_section, verbose=False, quiet=False): + """ + Upload fdroid repo folder to remote storage using rclone sync. + + Rclone sync can send the files to any supported remote storage + service once without numerous polling. + If remote storage is s3 e.g aws s3, wasabi, filebase then path will be + bucket_name/fdroid/repo where bucket_name will be an s3 bucket + If remote storage is storage drive/sftp e.g google drive, rsync.net + the new path will be bucket_name/fdroid/repo where bucket_name + will be a folder + + Better than the s3cmd command as it does the syncing in one command + Check https://rclone.org/docs/#config-config-file (optional config file) + """ + logging.debug(_('Using rclone to sync with: {url}').format(url=config['awsbucket'])) + + if config.get('path_to_custom_rclone_config') is not None: + USER_RCLONE_CONF = config['path_to_custom_rclone_config'] + if os.path.exists(USER_RCLONE_CONF): + logging.info("'path_to_custom_rclone_config' found in config.yml") + logging.info( + _('Using "{path}" for syncing with remote storage.').format( + path=USER_RCLONE_CONF + ) + ) + configfilename = USER_RCLONE_CONF + else: + logging.info('Custom configuration not found.') + logging.info( + 'Using default configuration at {}'.format( + subprocess.check_output('rclone config file') + ) + ) + configfilename = None + else: + logging.warning("'path_to_custom_rclone_config' not found in config.yml") + logging.info('Custom configuration not found.') + logging.info( + 'Using default configuration at {}'.format( + subprocess.check_output('rclone config file') + ) + ) + configfilename = None + + upload_dir = 'fdroid/' + repo_section + + if not config.get('rclone_config') or not config.get('awsbucket'): + raise FDroidException( + _('To use rclone, rclone_config and awsbucket must be set in config.yml!') + ) + + if isinstance(config['rclone_config'], str): + rclone_sync_command = ( + 'rclone sync ' + + repo_section + + ' ' + + config['rclone_config'] + + ':' + + config['awsbucket'] + + '/' + + upload_dir + ) + + rclone_sync_command = split(rclone_sync_command) + + if verbose: + rclone_sync_command += ['--verbose'] + elif quiet: + rclone_sync_command += ['--quiet'] + + if configfilename: + rclone_sync_command += split('--config=' + configfilename) + + complete_remote_path = ( + config['rclone_config'] + ':' + config['awsbucket'] + '/' + upload_dir + ) + + logging.debug( + "rclone sync all files in " + repo_section + ' to ' + complete_remote_path + ) + + if subprocess.call(rclone_sync_command) != 0: + raise FDroidException() + + if isinstance(config['rclone_config'], list): + for remote_config in config['rclone_config']: + rclone_sync_command = ( + 'rclone sync ' + + repo_section + + ' ' + + remote_config + + ':' + + config['awsbucket'] + + '/' + + upload_dir + ) + + rclone_sync_command = split(rclone_sync_command) + + if verbose: + rclone_sync_command += ['--verbose'] + elif quiet: + rclone_sync_command += ['--quiet'] + + if configfilename: + rclone_sync_command += split('--config=' + configfilename) + + complete_remote_path = ( + remote_config + ':' + config['awsbucket'] + '/' + upload_dir + ) + + logging.debug( + "rclone sync all files in " + + repo_section + + ' to ' + + complete_remote_path + ) + + if subprocess.call(rclone_sync_command) != 0: + raise FDroidException() + + def update_awsbucket_libcloud(repo_section): """No summary. @@ -967,7 +1113,7 @@ def main(): # update_servergitmirrors will take care of multiple mirrors so don't need a foreach update_servergitmirrors(config['servergitmirrors'], repo_section) if config.get('awsbucket'): - update_awsbucket(repo_section) + update_awsbucket(repo_section, options.verbose, options.quiet) if config.get('androidobservatory'): upload_to_android_observatory(repo_section) if config.get('virustotal_apikey'): diff --git a/tests/deploy.TestCase b/tests/deploy.TestCase index 4a2365c9..7e5b123b 100755 --- a/tests/deploy.TestCase +++ b/tests/deploy.TestCase @@ -1,8 +1,10 @@ #!/usr/bin/env python3 +import configparser import inspect import logging import os +import shutil import sys import tempfile import unittest @@ -21,6 +23,11 @@ from fdroidserver.exception import FDroidException from testcommon import TmpCwd, mkdtemp, parse_args_for_test +class Options: + quiet = False + verbose = False + + class DeployTest(unittest.TestCase): '''fdroidserver/deploy.py''' @@ -31,6 +38,10 @@ class DeployTest(unittest.TestCase): self._td = mkdtemp() self.testdir = self._td.name + fdroidserver.deploy.options = mock.Mock() + fdroidserver.deploy.config = {} + fdroidserver.deploy.USER_RCLONE_CONF = False + def tearDown(self): self._td.cleanup() @@ -87,6 +98,44 @@ class DeployTest(unittest.TestCase): with self.assertRaises(SystemExit): fdroidserver.deploy.update_serverwebroots([{'url': 'ssh://nope'}], 'repo') + @unittest.skipUnless(shutil.which('rclone'), '/usr/bin/rclone') + def test_update_remote_storage_with_rclone(self): + os.chdir(self.testdir) + repo = Path('repo') + repo.mkdir(parents=True, exist_ok=True) + + fake_apk = repo / 'another_fake.apk' + with fake_apk.open('w') as fp: + fp.write('not an APK, but has the right filename') + + # write out rclone config for test use + rclone_config = configparser.ConfigParser() + rclone_config.add_section("test-local-config") + rclone_config.set("test-local-config", "type", "local") + + rclone_config_path = Path('rclone_config_path') + rclone_config_path.mkdir(parents=True, exist_ok=True) + rclone_file = rclone_config_path / 'rclone.conf' + with open(rclone_file, 'w') as configfile: + rclone_config.write(configfile) + + # setup parameters for this test run + fdroidserver.deploy.config['awsbucket'] = 'test_bucket_folder' + fdroidserver.deploy.config['rclone'] = True + fdroidserver.deploy.config['rclone_config'] = 'test-local-config' + fdroidserver.deploy.config['path_to_custom_rclone_config'] = str(rclone_file) + fdroidserver.deploy.options = Options + + # write out destination path + destination = Path('some_bucket_folder/fdroid') + destination.mkdir(parents=True, exist_ok=True) + dest_path = Path(destination) / fake_apk + self.assertFalse(dest_path.is_file()) + repo_section = str(repo) + # fdroidserver.deploy.USER_RCLONE_CONF = str(rclone_file) + fdroidserver.deploy.update_remote_storage_with_rclone(repo_section) + self.assertFalse(dest_path.is_file()) + def test_update_serverwebroot(self): """rsync works with file paths, so this test uses paths for the URLs""" os.chdir(self.testdir) @@ -100,6 +149,8 @@ class DeployTest(unittest.TestCase): dest_apk = url / fake_apk self.assertFalse(dest_apk.is_file()) + fdroidserver.deploy.options = mock.Mock() + fdroidserver.deploy.options.identity_file = None fdroidserver.deploy.update_serverwebroot({'url': str(url)}, 'repo') self.assertTrue(dest_apk.is_file()) From 41e90e5ee734532bb2764f193f0e3cdfc8e1b5eb Mon Sep 17 00:00:00 2001 From: linsui Date: Sat, 1 Jun 2024 16:19:19 +0800 Subject: [PATCH 1523/2116] gradle 8.8 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index ec078431..77ff805c 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -200,6 +200,7 @@ get_sha() { '8.5') echo '9d926787066a081739e8200858338b4a69e837c3a821a33aca9db09dd4a41026' ;; '8.6') echo '9631d53cf3e74bfa726893aee1f8994fee4e060c401335946dba2156f440f24c' ;; '8.7') echo '544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d' ;; + '8.8') echo 'a4b4158601f8636cdeeab09bd76afb640030bb5b144aafe261a5e8af027dc612' ;; *) exit 1 esac } @@ -220,7 +221,7 @@ d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 d_plugin_min_gradle_v=(8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 6e489b78b3bccc50d7e8194dbdaf87222fbb34a7 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 7 Jun 2024 12:04:07 +0200 Subject: [PATCH 1524/2116] safety: ignore false positive jinja2 is not used by fdroidserver, nor any dependencies I could find via debtree and pipdeptree. --- .safety-policy.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.safety-policy.yml b/.safety-policy.yml index 2b95cf4d..73283975 100644 --- a/.safety-policy.yml +++ b/.safety-policy.yml @@ -23,3 +23,6 @@ security: 67599: reason: Only affects pip when using --extra-index-url, which is never the case in fdroidserver CI. expires: '2026-05-31' + 70612: + reason: jinja2 is not used by fdroidserver, nor any dependencies I could find via debtree and pipdeptree. + expires: '2026-05-31' From 845ed3ef47d847b746b41c0c53497992cbbe8265 Mon Sep 17 00:00:00 2001 From: proletarius101 Date: Tue, 11 Jun 2024 17:45:59 +0000 Subject: [PATCH 1525/2116] Add index only deployment mode --- examples/config.yml | 4 +- fdroidserver/common.py | 51 ++- fdroidserver/deploy.py | 622 +++++++++++++++++----------- fdroidserver/nightly.py | 10 +- tests/deploy.TestCase | 895 +++++++++++++++++++++++++++++++++++++--- 5 files changed, 1243 insertions(+), 339 deletions(-) diff --git a/examples/config.yml b/examples/config.yml index 646726bb..0337e6f0 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -183,7 +183,7 @@ # # serverwebroot: # - url: 'me@b.az:/srv/fdroid' -# indexOnly: true +# index_only: true # When running fdroid processes on a remote server, it is possible to @@ -209,7 +209,7 @@ # servergitmirrors: # - url: https://github.com/user/repo # - url: https://gitlab.com/user/repo -# indexOnly: true +# index_only: true # Most git hosting services have hard size limits for each git repo. # `fdroid deploy` will delete the git history when the git mirror repo diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 5a546386..252ecdfb 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -29,6 +29,7 @@ # libraries here as they will become a requirement for all commands. import difflib +from typing import List import git import glob import io @@ -4300,7 +4301,7 @@ def get_app_display_name(app): return app.get('AutoName') or app['id'] -def local_rsync(options, fromdir, todir): +def local_rsync(options, from_paths: List[str], todir: str): """Rsync method for local to local copying of things. This is an rsync wrapper with all the settings for safe use within @@ -4317,8 +4318,8 @@ def local_rsync(options, fromdir, todir): rsyncargs += ['--verbose'] if options.quiet: rsyncargs += ['--quiet'] - logging.debug(' '.join(rsyncargs + [fromdir, todir])) - if subprocess.call(rsyncargs + [fromdir, todir]) != 0: + logging.debug(' '.join(rsyncargs + from_paths + [todir])) + if subprocess.call(rsyncargs + from_paths + [todir]) != 0: raise FDroidException() @@ -4413,27 +4414,39 @@ def get_per_app_repos(): return repos +# list of index files that are never gpg-signed +NO_GPG_INDEX_FILES = [ + "entry.jar", + "index-v1.jar", + "index.css", + "index.html", + "index.jar", + "index.png", + "index.xml", +] + +# list of index files that are signed by gpgsign.py to make a .asc file +GPG_INDEX_FILES = [ + "altstore-index.json", + "entry.json", + "index-v1.json", + "index-v2.json", +] + + +INDEX_FILES = sorted( + NO_GPG_INDEX_FILES + GPG_INDEX_FILES + [i + '.asc' for i in GPG_INDEX_FILES] +) + + def is_repo_file(filename, for_gpg_signing=False): """Whether the file in a repo is a build product to be delivered to users.""" if isinstance(filename, str): filename = filename.encode('utf-8', errors="surrogateescape") - ignore_files = [ - b'entry.jar', - b'index-v1.jar', - b'index.css', - b'index.html', - b'index.jar', - b'index.png', - b'index.xml', - b'index_unsigned.jar', - ] + ignore_files = [i.encode() for i in NO_GPG_INDEX_FILES] + ignore_files.append(b'index_unsigned.jar') if not for_gpg_signing: - ignore_files += [ - b'altstore-index.json', - b'entry.json', - b'index-v1.json', - b'index-v2.json', - ] + ignore_files += [i.encode() for i in GPG_INDEX_FILES] return ( os.path.isfile(filename) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index b120999f..7dde38b5 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -25,11 +25,15 @@ import re import subprocess import time import urllib +from typing import Dict, List +from git import Repo import yaml from argparse import ArgumentParser import logging from shlex import split import shutil +import git +from pathlib import Path from . import _ from . import common @@ -48,42 +52,20 @@ USER_S3CFG = 's3cfg' USER_RCLONE_CONF = None REMOTE_HOSTNAME_REGEX = re.compile(r'\W*\w+\W+(\w+).*') -INDEX_FILES = [ - "entry.jar", - "entry.json", - "entry.json.asc", - "index-v1.jar", - "index-v1.json", - "index-v1.json.asc", - "index-v2.json", - "index-v2.json.asc", - "index.jar", - "index.xml", -] - -def _get_index_excludes(repo_section): +def _get_index_file_paths(base_dir): """Return the list of files to be synced last, since they finalize the deploy. The process of pushing all the new packages to the various services can take a while. So the index files should be updated last. That ensures that the package files are available when the client learns about them from the new index files. - """ - indexes = [ - os.path.join(repo_section, 'altstore-index.json'), - os.path.join(repo_section, 'entry.jar'), - os.path.join(repo_section, 'entry.json'), - os.path.join(repo_section, 'entry.json.asc'), - os.path.join(repo_section, 'index-v1.jar'), - os.path.join(repo_section, 'index-v1.json'), - os.path.join(repo_section, 'index-v1.json.asc'), - os.path.join(repo_section, 'index-v2.json'), - os.path.join(repo_section, 'index-v2.json.asc'), - os.path.join(repo_section, 'index.jar'), - os.path.join(repo_section, 'index.xml'), - ] + return [os.path.join(base_dir, filename) for filename in common.INDEX_FILES] + + +def _get_index_excludes(base_dir): + indexes = _get_index_file_paths(base_dir) index_excludes = [] for f in indexes: index_excludes.append('--exclude') @@ -91,7 +73,25 @@ def _get_index_excludes(repo_section): return index_excludes -def update_awsbucket(repo_section, verbose=False, quiet=False): +def _get_index_includes(base_dir): + indexes = _get_index_file_paths(base_dir) + index_includes = [] + for f in indexes: + index_includes.append('--include') + index_includes.append(f) + return index_includes + + +def _remove_missing_files(files: List[str]) -> List[str]: + """Remove files that are missing from the file system.""" + existing = [] + for f in files: + if os.path.exists(f): + existing.append(f) + return existing + + +def update_awsbucket(repo_section, is_index_only=False, verbose=False, quiet=False): """Upload the contents of the directory `repo_section` (including subdirectories) to the AWS S3 "bucket". The contents of that subdir of the @@ -111,26 +111,28 @@ def update_awsbucket(repo_section, verbose=False, quiet=False): logging.warning( 'No syncing tool set in config.yml!. Defaulting to using s3cmd' ) - update_awsbucket_s3cmd(repo_section) + update_awsbucket_s3cmd(repo_section, is_index_only) if config['s3cmd'] is True and config['rclone'] is True: logging.warning( 'Both syncing tools set in config.yml!. Defaulting to using s3cmd' ) - update_awsbucket_s3cmd(repo_section) + update_awsbucket_s3cmd(repo_section, is_index_only) if config['s3cmd'] is True and config['rclone'] is not True: - update_awsbucket_s3cmd(repo_section) + update_awsbucket_s3cmd(repo_section, is_index_only) if config['rclone'] is True and config['s3cmd'] is not True: - update_remote_storage_with_rclone(repo_section, verbose, quiet) + update_remote_storage_with_rclone( + repo_section, is_index_only, verbose, quiet + ) elif common.set_command_in_config('s3cmd'): - update_awsbucket_s3cmd(repo_section) + update_awsbucket_s3cmd(repo_section, is_index_only) elif common.set_command_in_config('rclone'): - update_remote_storage_with_rclone(repo_section, verbose, quiet) + update_remote_storage_with_rclone(repo_section, is_index_only, verbose, quiet) else: - update_awsbucket_libcloud(repo_section) + update_awsbucket_libcloud(repo_section, is_index_only) -def update_awsbucket_s3cmd(repo_section): +def update_awsbucket_s3cmd(repo_section, is_index_only=False): """Upload using the CLI tool s3cmd, which provides rsync-like sync. The upload is done in multiple passes to reduce the chance of @@ -177,39 +179,68 @@ def update_awsbucket_s3cmd(repo_section): s3cmd_sync += ['--quiet'] s3url = s3bucketurl + '/fdroid/' - logging.debug('s3cmd sync new files in ' + repo_section + ' to ' + s3url) - logging.debug(_('Running first pass with MD5 checking disabled')) - excludes = _get_index_excludes(repo_section) - returncode = subprocess.call( - s3cmd_sync - + excludes - + ['--no-check-md5', '--skip-existing', repo_section, s3url] - ) - if returncode != 0: - raise FDroidException() - logging.debug('s3cmd sync all files in ' + repo_section + ' to ' + s3url) - returncode = subprocess.call( - s3cmd_sync + excludes + ['--no-check-md5', repo_section, s3url] - ) - if returncode != 0: - raise FDroidException() logging.debug( _('s3cmd sync indexes {path} to {url} and delete').format( path=repo_section, url=s3url ) ) - s3cmd_sync.append('--delete-removed') - s3cmd_sync.append('--delete-after') - if options.no_checksum: - s3cmd_sync.append('--no-check-md5') + + if is_index_only: + logging.debug( + _('s3cmd syncs indexes from {path} to {url} and deletes removed').format( + path=repo_section, url=s3url + ) + ) + sync_indexes_flags = [] + sync_indexes_flags.extend(_get_index_includes(repo_section)) + sync_indexes_flags.append('--delete-removed') + sync_indexes_flags.append('--delete-after') + if options.no_checksum: + sync_indexes_flags.append('--no-check-md5') + else: + sync_indexes_flags.append('--check-md5') + returncode = subprocess.call( + s3cmd_sync + sync_indexes_flags + [repo_section, s3url] + ) + if returncode != 0: + raise FDroidException() else: - s3cmd_sync.append('--check-md5') - if subprocess.call(s3cmd_sync + [repo_section, s3url]) != 0: - raise FDroidException() + logging.debug('s3cmd sync new files in ' + repo_section + ' to ' + s3url) + logging.debug(_('Running first pass with MD5 checking disabled')) + excludes = _get_index_excludes(repo_section) + returncode = subprocess.call( + s3cmd_sync + + excludes + + ['--no-check-md5', '--skip-existing', repo_section, s3url] + ) + if returncode != 0: + raise FDroidException() + logging.debug('s3cmd sync all files in ' + repo_section + ' to ' + s3url) + returncode = subprocess.call( + s3cmd_sync + excludes + ['--no-check-md5', repo_section, s3url] + ) + if returncode != 0: + raise FDroidException() + + logging.debug( + _('s3cmd sync indexes {path} to {url} and delete').format( + path=repo_section, url=s3url + ) + ) + s3cmd_sync.append('--delete-removed') + s3cmd_sync.append('--delete-after') + if options.no_checksum: + s3cmd_sync.append('--no-check-md5') + else: + s3cmd_sync.append('--check-md5') + if subprocess.call(s3cmd_sync + [repo_section, s3url]) != 0: + raise FDroidException() -def update_remote_storage_with_rclone(repo_section, verbose=False, quiet=False): +def update_remote_storage_with_rclone( + repo_section, is_index_only=False, verbose=False, quiet=False +): """ Upload fdroid repo folder to remote storage using rclone sync. @@ -261,46 +292,19 @@ def update_remote_storage_with_rclone(repo_section, verbose=False, quiet=False): _('To use rclone, rclone_config and awsbucket must be set in config.yml!') ) - if isinstance(config['rclone_config'], str): - rclone_sync_command = ( - 'rclone sync ' - + repo_section - + ' ' - + config['rclone_config'] - + ':' - + config['awsbucket'] - + '/' - + upload_dir - ) + if is_index_only: + sources = _get_index_file_paths(repo_section) + sources = _remove_missing_files(sources) + else: + sources = [repo_section] - rclone_sync_command = split(rclone_sync_command) - - if verbose: - rclone_sync_command += ['--verbose'] - elif quiet: - rclone_sync_command += ['--quiet'] - - if configfilename: - rclone_sync_command += split('--config=' + configfilename) - - complete_remote_path = ( - config['rclone_config'] + ':' + config['awsbucket'] + '/' + upload_dir - ) - - logging.debug( - "rclone sync all files in " + repo_section + ' to ' + complete_remote_path - ) - - if subprocess.call(rclone_sync_command) != 0: - raise FDroidException() - - if isinstance(config['rclone_config'], list): - for remote_config in config['rclone_config']: + for source in sources: + if isinstance(config['rclone_config'], str): rclone_sync_command = ( 'rclone sync ' - + repo_section + + source + ' ' - + remote_config + + config['rclone_config'] + ':' + config['awsbucket'] + '/' @@ -318,21 +322,52 @@ def update_remote_storage_with_rclone(repo_section, verbose=False, quiet=False): rclone_sync_command += split('--config=' + configfilename) complete_remote_path = ( - remote_config + ':' + config['awsbucket'] + '/' + upload_dir + config['rclone_config'] + ':' + config['awsbucket'] + '/' + upload_dir ) logging.debug( - "rclone sync all files in " - + repo_section - + ' to ' - + complete_remote_path + "rclone sync all files in " + source + ' to ' + complete_remote_path ) if subprocess.call(rclone_sync_command) != 0: raise FDroidException() + if isinstance(config['rclone_config'], list): + for remote_config in config['rclone_config']: + rclone_sync_command = ( + 'rclone sync ' + + source + + ' ' + + remote_config + + ':' + + config['awsbucket'] + + '/' + + upload_dir + ) -def update_awsbucket_libcloud(repo_section): + rclone_sync_command = split(rclone_sync_command) + + if verbose: + rclone_sync_command += ['--verbose'] + elif quiet: + rclone_sync_command += ['--quiet'] + + if configfilename: + rclone_sync_command += split('--config=' + configfilename) + + complete_remote_path = ( + remote_config + ':' + config['awsbucket'] + '/' + upload_dir + ) + + logging.debug( + "rclone sync all files in " + source + ' to ' + complete_remote_path + ) + + if subprocess.call(rclone_sync_command) != 0: + raise FDroidException() + + +def update_awsbucket_libcloud(repo_section, is_index_only=False): """No summary. Upload the contents of the directory `repo_section` (including @@ -380,49 +415,66 @@ def update_awsbucket_libcloud(repo_section): if obj.name.startswith(upload_dir + '/'): objs[obj.name] = obj - for root, dirs, files in os.walk(os.path.join(os.getcwd(), repo_section)): - for name in files: - upload = False - file_to_upload = os.path.join(root, name) - object_name = 'fdroid/' + os.path.relpath(file_to_upload, os.getcwd()) - if object_name not in objs: + if is_index_only: + index_files = [ + f"{os.getcwd()}/{name}" for name in _get_index_file_paths(repo_section) + ] + files_to_upload = [ + os.path.join(root, name) + for root, dirs, files in os.walk(os.path.join(os.getcwd(), repo_section)) + for name in files + ] + files_to_upload = list(set(files_to_upload) & set(index_files)) + files_to_upload = _remove_missing_files(files_to_upload) + + else: + files_to_upload = [ + os.path.join(root, name) + for root, dirs, files in os.walk(os.path.join(os.getcwd(), repo_section)) + for name in files + ] + + for file_to_upload in files_to_upload: + upload = False + object_name = 'fdroid/' + os.path.relpath(file_to_upload, os.getcwd()) + if object_name not in objs: + upload = True + else: + obj = objs.pop(object_name) + if obj.size != os.path.getsize(file_to_upload): upload = True else: - obj = objs.pop(object_name) - if obj.size != os.path.getsize(file_to_upload): + # if the sizes match, then compare by MD5 + md5 = hashlib.md5() # nosec AWS uses MD5 + with open(file_to_upload, 'rb') as f: + while True: + data = f.read(8192) + if not data: + break + md5.update(data) + if obj.hash != md5.hexdigest(): + s3url = 's3://' + awsbucket + '/' + obj.name + logging.info(' deleting ' + s3url) + if not driver.delete_object(obj): + logging.warning('Could not delete ' + s3url) upload = True - else: - # if the sizes match, then compare by MD5 - md5 = hashlib.md5() # nosec AWS uses MD5 - with open(file_to_upload, 'rb') as f: - while True: - data = f.read(8192) - if not data: - break - md5.update(data) - if obj.hash != md5.hexdigest(): - s3url = 's3://' + awsbucket + '/' + obj.name - logging.info(' deleting ' + s3url) - if not driver.delete_object(obj): - logging.warning('Could not delete ' + s3url) - upload = True - if upload: - logging.debug(' uploading "' + file_to_upload + '"...') - extra = {'acl': 'public-read'} - if file_to_upload.endswith('.sig'): - extra['content_type'] = 'application/pgp-signature' - elif file_to_upload.endswith('.asc'): - extra['content_type'] = 'application/pgp-signature' - path = os.path.relpath(file_to_upload) - logging.info(f' uploading {path} to s3://{awsbucket}/{object_name}') - with open(file_to_upload, 'rb') as iterator: - obj = driver.upload_object_via_stream( - iterator=iterator, - container=container, - object_name=object_name, - extra=extra, - ) + if upload: + logging.debug(' uploading "' + file_to_upload + '"...') + extra = {'acl': 'public-read'} + if file_to_upload.endswith('.sig'): + extra['content_type'] = 'application/pgp-signature' + elif file_to_upload.endswith('.asc'): + extra['content_type'] = 'application/pgp-signature' + path = os.path.relpath(file_to_upload) + logging.info(f' uploading {path} to s3://{awsbucket}/{object_name}') + with open(file_to_upload, 'rb') as iterator: + obj = driver.upload_object_via_stream( + iterator=iterator, + container=container, + object_name=object_name, + extra=extra, + ) # delete the remnants in the bucket, they do not exist locally while objs: object_name, obj = objs.popitem() @@ -476,21 +528,38 @@ def update_serverwebroot(serverwebroot, repo_section): 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + config['identity_file'], ] url = serverwebroot['url'] + is_index_only = serverwebroot.get('index_only', False) logging.info('rsyncing ' + repo_section + ' to ' + url) - excludes = _get_index_excludes(repo_section) - if subprocess.call(rsyncargs + excludes + [repo_section, url]) != 0: - raise FDroidException() - if subprocess.call(rsyncargs + [repo_section, url]) != 0: - raise FDroidException() - # upload "current version" symlinks if requested - if config and config.get('make_current_version_link') and repo_section == 'repo': - links_to_upload = [] - for f in glob.glob('*.apk') + glob.glob('*.apk.asc') + glob.glob('*.apk.sig'): - if os.path.islink(f): - links_to_upload.append(f) - if len(links_to_upload) > 0: - if subprocess.call(rsyncargs + links_to_upload + [url]) != 0: - raise FDroidException() + if is_index_only: + files_to_upload = _get_index_file_paths(repo_section) + files_to_upload = _remove_missing_files(files_to_upload) + + rsyncargs += files_to_upload + rsyncargs += [f'{url}/{repo_section}/'] + logging.info(rsyncargs) + if subprocess.call(rsyncargs) != 0: + raise FDroidException() + else: + excludes = _get_index_excludes(repo_section) + if subprocess.call(rsyncargs + excludes + [repo_section, url]) != 0: + raise FDroidException() + if subprocess.call(rsyncargs + [repo_section, url]) != 0: + raise FDroidException() + # upload "current version" symlinks if requested + if ( + config + and config.get('make_current_version_link') + and repo_section == 'repo' + ): + links_to_upload = [] + for f in ( + glob.glob('*.apk') + glob.glob('*.apk.asc') + glob.glob('*.apk.sig') + ): + if os.path.islink(f): + links_to_upload.append(f) + if len(links_to_upload) > 0: + if subprocess.call(rsyncargs + links_to_upload + [url]) != 0: + raise FDroidException() def update_serverwebroots(serverwebroots, repo_section, standardwebroot=True): @@ -531,11 +600,12 @@ def sync_from_localcopy(repo_section, local_copy_dir): """ logging.info('Syncing from local_copy_dir to this repo.') + # trailing slashes have a meaning in rsync which is not needed here, so # make sure both paths have exactly one trailing slash common.local_rsync( common.get_options(), - os.path.join(local_copy_dir, repo_section).rstrip('/') + '/', + [os.path.join(local_copy_dir, repo_section).rstrip('/') + '/'], repo_section.rstrip('/') + '/', ) @@ -554,7 +624,7 @@ def update_localcopy(repo_section, local_copy_dir): """ # local_copy_dir is guaranteed to have a trailing slash in main() below - common.local_rsync(common.get_options(), repo_section, local_copy_dir) + common.local_rsync(common.get_options(), [repo_section], local_copy_dir) offline_copy = os.path.join(os.getcwd(), BINARY_TRANSPARENCY_DIR) if os.path.isdir(os.path.join(offline_copy, '.git')): @@ -584,7 +654,6 @@ def update_servergitmirrors(servergitmirrors, repo_section): transparency log. """ - import git from clint.textui import progress if config.get('local_copy_dir') and not config.get('sync_from_local_copy_dir'): @@ -594,10 +663,11 @@ def update_servergitmirrors(servergitmirrors, repo_section): return options = common.get_options() + workspace_dir = Path(os.getcwd()) # right now we support only 'repo' git-mirroring if repo_section == 'repo': - git_mirror_path = 'git-mirror' + git_mirror_path = workspace_dir / 'git-mirror' dotgit = os.path.join(git_mirror_path, '.git') git_fdroiddir = os.path.join(git_mirror_path, 'fdroid') git_repodir = os.path.join(git_fdroiddir, repo_section) @@ -624,11 +694,6 @@ def update_servergitmirrors(servergitmirrors, repo_section): archive_path = os.path.join(git_mirror_path, 'fdroid', 'archive') shutil.rmtree(archive_path, ignore_errors=True) - # rsync is very particular about trailing slashes - common.local_rsync( - options, repo_section.rstrip('/') + '/', git_repodir.rstrip('/') + '/' - ) - # use custom SSH command if identity_file specified ssh_cmd = 'ssh -oBatchMode=yes' if options.identity_file is not None: @@ -636,28 +701,6 @@ def update_servergitmirrors(servergitmirrors, repo_section): elif 'identity_file' in config: ssh_cmd += ' -oIdentitiesOnly=yes -i "%s"' % config['identity_file'] - repo = git.Repo.init(git_mirror_path, initial_branch=GIT_BRANCH) - - enabled_remotes = [] - for d in servergitmirrors: - remote_url = d['url'] - name = REMOTE_HOSTNAME_REGEX.sub(r'\1', remote_url) - enabled_remotes.append(name) - r = git.remote.Remote(repo, name) - if r in repo.remotes: - r = repo.remote(name) - if 'set_url' in dir(r): # force remote URL if using GitPython 2.x - r.set_url(remote_url) - else: - repo.create_remote(name, remote_url) - logging.info('Mirroring to: ' + remote_url) - - # sadly index.add don't allow the --all parameter - logging.debug('Adding all files to git mirror') - repo.git.add(all=True) - logging.debug('Committing all files into git mirror') - repo.index.commit("fdroidserver git-mirror") - if options.verbose: progressbar = progress.Bar() @@ -670,75 +713,152 @@ def update_servergitmirrors(servergitmirrors, repo_section): else: progress = None - # only deploy to GitLab Artifacts if too big for GitLab Pages - if common.get_dir_size(git_fdroiddir) <= common.GITLAB_COM_PAGES_MAX_SIZE: - gitlab_ci_job_name = 'pages' - else: - gitlab_ci_job_name = 'GitLab Artifacts' - logging.warning( - _( - 'Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!' - ) - % (common.GITLAB_COM_PAGES_MAX_SIZE / 1000000000) + repo = git.Repo.init(git_mirror_path, initial_branch=GIT_BRANCH) + + enabled_remotes = [] + for d in servergitmirrors: + is_index_only = d.get('index_only', False) + + # Use a separate branch for the index only mode as it needs a different set of files to commit + if is_index_only: + local_branch_name = 'index_only' + else: + local_branch_name = 'full' + if local_branch_name in repo.heads: + repo.git.switch(local_branch_name) + else: + repo.git.switch('--orphan', local_branch_name) + + # trailing slashes have a meaning in rsync which is not needed here, so + # make sure both paths have exactly one trailing slash + if is_index_only: + files_to_sync = _get_index_file_paths(str(workspace_dir / repo_section)) + files_to_sync = _remove_missing_files(files_to_sync) + else: + files_to_sync = [str(workspace_dir / repo_section).rstrip('/') + '/'] + common.local_rsync( + common.get_options(), files_to_sync, git_repodir.rstrip('/') + '/' ) - # push for every remote. This will overwrite the git history - for remote in repo.remotes: - if remote.name not in enabled_remotes: - repo.delete_remote(remote) - continue - if remote.name == 'gitlab': - logging.debug('Writing .gitlab-ci.yml to deploy to GitLab Pages') - with open(os.path.join(git_mirror_path, ".gitlab-ci.yml"), "wt") as fp: - yaml.dump( - { - gitlab_ci_job_name: { - 'script': [ - 'mkdir .public', - 'cp -r * .public/', - 'mv .public public', - ], - 'artifacts': {'paths': ['public']}, - 'variables': {'GIT_DEPTH': 1}, - } - }, - fp, - default_flow_style=False, - ) - - repo.git.add(all=True) - repo.index.commit("fdroidserver git-mirror: Deploy to GitLab Pages") - - logging.debug(_('Pushing to {url}').format(url=remote.url)) - with repo.git.custom_environment(GIT_SSH_COMMAND=ssh_cmd): - pushinfos = remote.push( - GIT_BRANCH, force=True, set_upstream=True, progress=progress - ) - for pushinfo in pushinfos: - if pushinfo.flags & ( - git.remote.PushInfo.ERROR - | git.remote.PushInfo.REJECTED - | git.remote.PushInfo.REMOTE_FAILURE - | git.remote.PushInfo.REMOTE_REJECTED - ): - # Show potentially useful messages from git remote - for line in progress.other_lines: - if line.startswith('remote:'): - logging.debug(line) - raise FDroidException( - '{url} push failed: {flags} {summary}'.format( - url=remote.url, - flags=pushinfo.flags, - summary=pushinfo.summary, - ) - ) - else: - logging.debug(remote.url + ': ' + pushinfo.summary) - + upload_to_servergitmirror( + mirror_config=d, + local_repo=repo, + enabled_remotes=enabled_remotes, + repo_section=repo_section, + is_index_only=is_index_only, + fdroid_dir=git_fdroiddir, + git_mirror_path=str(git_mirror_path), + ssh_cmd=ssh_cmd, + progress=progress, + ) if progress: progressbar.done() +def upload_to_servergitmirror( + mirror_config: Dict[str, str], + local_repo: Repo, + enabled_remotes: List[str], + repo_section: str, + is_index_only: bool, + fdroid_dir: str, + git_mirror_path: str, + ssh_cmd: str, + progress: git.RemoteProgress, +) -> None: + remote_branch_name = GIT_BRANCH + local_branch_name = local_repo.active_branch.name + + remote_url = mirror_config['url'] + name = REMOTE_HOSTNAME_REGEX.sub(r'\1', remote_url) + enabled_remotes.append(name) + r = git.remote.Remote(local_repo, name) + if r in local_repo.remotes: + r = local_repo.remote(name) + if 'set_url' in dir(r): # force remote URL if using GitPython 2.x + r.set_url(remote_url) + else: + local_repo.create_remote(name, remote_url) + logging.info('Mirroring to: ' + remote_url) + + if is_index_only: + files_to_upload = _get_index_file_paths( + os.path.join(local_repo.working_tree_dir, 'fdroid', repo_section) + ) + files_to_upload = _remove_missing_files(files_to_upload) + local_repo.index.add(files_to_upload) + else: + # sadly index.add don't allow the --all parameter + logging.debug('Adding all files to git mirror') + local_repo.git.add(all=True) + + logging.debug('Committing files into git mirror') + local_repo.index.commit("fdroidserver git-mirror") + + # only deploy to GitLab Artifacts if too big for GitLab Pages + if common.get_dir_size(fdroid_dir) <= common.GITLAB_COM_PAGES_MAX_SIZE: + gitlab_ci_job_name = 'pages' + else: + gitlab_ci_job_name = 'GitLab Artifacts' + logging.warning( + _('Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!') + % (common.GITLAB_COM_PAGES_MAX_SIZE / 1000000000) + ) + + # push. This will overwrite the git history + remote = local_repo.remote(name) + if remote.name == 'gitlab': + logging.debug('Writing .gitlab-ci.yml to deploy to GitLab Pages') + with open(os.path.join(git_mirror_path, ".gitlab-ci.yml"), "wt") as fp: + yaml.dump( + { + gitlab_ci_job_name: { + 'script': [ + 'mkdir .public', + 'cp -r * .public/', + 'mv .public public', + ], + 'artifacts': {'paths': ['public']}, + 'variables': {'GIT_DEPTH': 1}, + } + }, + fp, + default_flow_style=False, + ) + + local_repo.index.add(['.gitlab-ci.yml']) + local_repo.index.commit("fdroidserver git-mirror: Deploy to GitLab Pages") + + logging.debug(_('Pushing to {url}').format(url=remote.url)) + with local_repo.git.custom_environment(GIT_SSH_COMMAND=ssh_cmd): + pushinfos = remote.push( + f"{local_branch_name}:{remote_branch_name}", + force=True, + set_upstream=True, + progress=progress, + ) + for pushinfo in pushinfos: + if pushinfo.flags & ( + git.remote.PushInfo.ERROR + | git.remote.PushInfo.REJECTED + | git.remote.PushInfo.REMOTE_FAILURE + | git.remote.PushInfo.REMOTE_REJECTED + ): + # Show potentially useful messages from git remote + for line in progress.other_lines: + if line.startswith('remote:'): + logging.debug(line) + raise FDroidException( + remote.url + + ' push failed: ' + + str(pushinfo.flags) + + ' ' + + pushinfo.summary + ) + else: + logging.debug(remote.url + ': ' + pushinfo.summary) + + def upload_to_android_observatory(repo_section): import requests @@ -955,8 +1075,6 @@ def push_binary_transparency(git_repo_path, git_remote): drive. """ - import git - logging.info(_('Pushing binary transparency log to {url}').format(url=git_remote)) if os.path.isdir(os.path.dirname(git_remote)): diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 074a9eee..9c2c7175 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -378,11 +378,11 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, os.chdir(repo_basedir) if os.path.isdir(git_mirror_repodir): - common.local_rsync(options, git_mirror_repodir + '/', 'repo/') + common.local_rsync(options, [git_mirror_repodir + '/'], 'repo/') if os.path.isdir(git_mirror_metadatadir): - common.local_rsync(options, git_mirror_metadatadir + '/', 'metadata/') + common.local_rsync(options, [git_mirror_metadatadir + '/'], 'metadata/') if os.path.isdir(git_mirror_statsdir): - common.local_rsync(options, git_mirror_statsdir + '/', 'stats/') + common.local_rsync(options, [git_mirror_statsdir + '/'], 'stats/') ssh_private_key_file = _ssh_key_from_debug_keystore() # this is needed for GitPython to find the SSH key @@ -484,9 +484,9 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, cwd=repo_basedir, ) common.local_rsync( - options, repo_basedir + '/metadata/', git_mirror_metadatadir + '/' + options, [repo_basedir + '/metadata/'], git_mirror_metadatadir + '/' ) - common.local_rsync(options, repo_basedir + '/stats/', git_mirror_statsdir + '/') + common.local_rsync(options, [repo_basedir + '/stats/'], git_mirror_statsdir + '/') mirror_git_repo.git.add(all=True) mirror_git_repo.index.commit("update app metadata") diff --git a/tests/deploy.TestCase b/tests/deploy.TestCase index 7e5b123b..fa87f7b6 100755 --- a/tests/deploy.TestCase +++ b/tests/deploy.TestCase @@ -11,6 +11,8 @@ import unittest from pathlib import Path from unittest import mock +import git + localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') ) @@ -38,7 +40,7 @@ class DeployTest(unittest.TestCase): self._td = mkdtemp() self.testdir = self._td.name - fdroidserver.deploy.options = mock.Mock() + fdroidserver.common.options = mock.Mock() fdroidserver.deploy.config = {} fdroidserver.deploy.USER_RCLONE_CONF = False @@ -70,6 +72,10 @@ class DeployTest(unittest.TestCase): url1 = Path('url1/fdroid') url1.mkdir(parents=True) + # setup parameters for this test run + fdroidserver.common.options.identity_file = None + fdroidserver.deploy.config['make_current_version_link'] = False + dest_apk0 = url0 / fake_apk dest_apk1 = url1 / fake_apk self.assertFalse(dest_apk0.is_file()) @@ -107,6 +113,9 @@ class DeployTest(unittest.TestCase): fake_apk = repo / 'another_fake.apk' with fake_apk.open('w') as fp: fp.write('not an APK, but has the right filename') + fake_index = repo / fdroidserver.common.INDEX_FILES[0] + with fake_index.open('w') as fp: + fp.write('not an index, but has the right filename') # write out rclone config for test use rclone_config = configparser.ConfigParser() @@ -124,17 +133,66 @@ class DeployTest(unittest.TestCase): fdroidserver.deploy.config['rclone'] = True fdroidserver.deploy.config['rclone_config'] = 'test-local-config' fdroidserver.deploy.config['path_to_custom_rclone_config'] = str(rclone_file) - fdroidserver.deploy.options = Options + fdroidserver.common.options = Options # write out destination path - destination = Path('some_bucket_folder/fdroid') + destination = Path('test_bucket_folder/fdroid') destination.mkdir(parents=True, exist_ok=True) - dest_path = Path(destination) / fake_apk - self.assertFalse(dest_path.is_file()) + dest_apk = Path(destination) / fake_apk + dest_index = Path(destination) / fake_index + self.assertFalse(dest_apk.is_file()) + self.assertFalse(dest_index.is_file()) repo_section = str(repo) # fdroidserver.deploy.USER_RCLONE_CONF = str(rclone_file) fdroidserver.deploy.update_remote_storage_with_rclone(repo_section) - self.assertFalse(dest_path.is_file()) + self.assertTrue(dest_apk.is_file()) + self.assertTrue(dest_index.is_file()) + + @unittest.skipUnless(shutil.which('rclone'), '/usr/bin/rclone') + def test_update_remote_storage_with_rclone_in_index_only_mode(self): + os.chdir(self.testdir) + repo = Path('repo') + repo.mkdir(parents=True, exist_ok=True) + + fake_apk = repo / 'another_fake.apk' + with fake_apk.open('w') as fp: + fp.write('not an APK, but has the right filename') + fake_index = repo / fdroidserver.common.INDEX_FILES[0] + with fake_index.open('w') as fp: + fp.write('not an index, but has the right filename') + + # write out rclone config for test use + rclone_config = configparser.ConfigParser() + rclone_config.add_section("test-local-config") + rclone_config.set("test-local-config", "type", "local") + + rclone_config_path = Path('rclone_config_path') + rclone_config_path.mkdir(parents=True, exist_ok=True) + rclone_file = rclone_config_path / 'rclone.conf' + with open(rclone_file, 'w') as configfile: + rclone_config.write(configfile) + + # setup parameters for this test run + fdroidserver.deploy.config['awsbucket'] = 'test_bucket_folder' + fdroidserver.deploy.config['rclone'] = True + fdroidserver.deploy.config['rclone_config'] = 'test-local-config' + fdroidserver.deploy.config['path_to_custom_rclone_config'] = str(rclone_file) + fdroidserver.common.options = Options + + # write out destination path + destination = Path('test_bucket_folder/fdroid') + destination.mkdir(parents=True, exist_ok=True) + dest_apk = Path(destination) / fake_apk + dest_index = Path(destination) / fake_index + self.assertFalse(dest_apk.is_file()) + self.assertFalse(dest_index.is_file()) + repo_section = str(repo) + # fdroidserver.deploy.USER_RCLONE_CONF = str(rclone_file) + fdroidserver.deploy.update_remote_storage_with_rclone( + repo_section, is_index_only=True + ) + self.assertFalse(dest_apk.is_file()) + self.assertTrue(dest_index.is_file()) def test_update_serverwebroot(self): """rsync works with file paths, so this test uses paths for the URLs""" @@ -144,15 +202,55 @@ class DeployTest(unittest.TestCase): fake_apk = repo / 'fake.apk' with fake_apk.open('w') as fp: fp.write('not an APK, but has the right filename') + fake_index = repo / fdroidserver.common.INDEX_FILES[0] + with fake_index.open('w') as fp: + fp.write('not an index, but has the right filename') url = Path('url') url.mkdir() - dest_apk = url / fake_apk + # setup parameters for this test run + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.identity_file = None + fdroidserver.common.options.identity_file = None + fdroidserver.deploy.config['make_current_version_link'] = False + + dest_apk = Path(url) / fake_apk + dest_index = Path(url) / fake_index self.assertFalse(dest_apk.is_file()) - fdroidserver.deploy.options = mock.Mock() - fdroidserver.deploy.options.identity_file = None + self.assertFalse(dest_index.is_file()) + fdroidserver.deploy.update_serverwebroot({'url': str(url)}, 'repo') self.assertTrue(dest_apk.is_file()) + self.assertTrue(dest_index.is_file()) + + def test_update_serverwebroot_in_index_only_mode(self): + os.chdir(self.testdir) + repo = Path('repo') + repo.mkdir() + fake_apk = repo / 'fake.apk' + with fake_apk.open('w') as fp: + fp.write('not an APK, but has the right filename') + fake_index = repo / fdroidserver.common.INDEX_FILES[0] + with fake_index.open('w') as fp: + fp.write('not an index, but has the right filename') + url = Path('url') + url.mkdir() + + # setup parameters for this test run + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.identity_file = None + fdroidserver.deploy.config['make_current_version_link'] = False + + dest_apk = Path(url) / fake_apk + dest_index = Path(url) / fake_index + self.assertFalse(dest_apk.is_file()) + self.assertFalse(dest_index.is_file()) + + fdroidserver.deploy.update_serverwebroot( + {'url': str(url), 'index_only': True}, 'repo' + ) + self.assertFalse(dest_apk.is_file()) + self.assertTrue(dest_index.is_file()) @mock.patch.dict(os.environ, clear=True) def test_update_serverwebroot_no_rsync_error(self): @@ -170,6 +268,7 @@ class DeployTest(unittest.TestCase): fdroidserver.common.options.identity_file = None fdroidserver.common.options.verbose = False fdroidserver.common.options.quiet = True + fdroidserver.common.options.index_only = False fdroidserver.deploy.config = {'make_current_version_link': True} url = "example.com:/var/www/fdroid" repo_section = 'repo' @@ -191,6 +290,8 @@ class DeployTest(unittest.TestCase): '--exclude', 'repo/altstore-index.json', '--exclude', + 'repo/altstore-index.json.asc', + '--exclude', 'repo/entry.jar', '--exclude', 'repo/entry.json', @@ -207,8 +308,14 @@ class DeployTest(unittest.TestCase): '--exclude', 'repo/index-v2.json.asc', '--exclude', + 'repo/index.css', + '--exclude', + 'repo/index.html', + '--exclude', 'repo/index.jar', '--exclude', + 'repo/index.png', + '--exclude', 'repo/index.xml', 'repo', 'example.com:/var/www/fdroid', @@ -256,6 +363,101 @@ class DeployTest(unittest.TestCase): fdroidserver.deploy.update_serverwebroot({'url': url}, repo_section) self.assertEqual(call_iteration, 3, 'expected 3 invocations of subprocess.call') + def test_update_serverwebroot_make_cur_version_link_in_index_only_mode(self): + # setup parameters for this test run + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.no_checksum = True + fdroidserver.common.options.identity_file = None + fdroidserver.common.options.verbose = False + fdroidserver.common.options.quiet = True + fdroidserver.common.options.identity_file = None + fdroidserver.deploy.config['make_current_version_link'] = True + url = "example.com:/var/www/fdroid" + repo_section = 'repo' + + # setup function for asserting subprocess.call invocations + call_iteration = 0 + + def update_server_webroot_call(cmd): + nonlocal call_iteration + if call_iteration == 0: + self.assertListEqual( + cmd, + [ + 'rsync', + '--archive', + '--delete-after', + '--safe-links', + '--quiet', + 'repo/altstore-index.json', + 'repo/altstore-index.json.asc', + 'repo/entry.jar', + 'repo/entry.json', + 'repo/entry.json.asc', + 'repo/index-v1.jar', + 'repo/index-v1.json', + 'repo/index-v1.json.asc', + 'repo/index-v2.json', + 'repo/index-v2.json.asc', + 'repo/index.css', + 'repo/index.html', + 'repo/index.jar', + 'repo/index.png', + 'repo/index.xml', + 'example.com:/var/www/fdroid/repo/', + ], + ) + elif call_iteration == 1: + self.assertListEqual( + cmd, + [ + 'rsync', + '--archive', + '--delete-after', + '--safe-links', + '--quiet', + 'repo', + url, + ], + ) + elif call_iteration == 2: + self.assertListEqual( + cmd, + [ + 'rsync', + '--archive', + '--delete-after', + '--safe-links', + '--quiet', + 'Sym.apk', + 'Sym.apk.asc', + 'Sym.apk.sig', + 'example.com:/var/www/fdroid', + ], + ) + else: + self.fail('unexpected subprocess.call invocation') + call_iteration += 1 + return 0 + + with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): + os.mkdir(repo_section) + os.symlink('repo/com.example.sym.apk', 'Sym.apk') + os.symlink('repo/com.example.sym.apk.asc', 'Sym.apk.asc') + os.symlink('repo/com.example.sym.apk.sig', 'Sym.apk.sig') + + fake_files = fdroidserver.common.INDEX_FILES + for filename in fake_files: + fake_file = Path(repo_section) / filename + with fake_file.open('w') as fp: + fp.write('not a real one, but has the right filename') + + with mock.patch('subprocess.call', side_effect=update_server_webroot_call): + fdroidserver.deploy.update_serverwebroot( + {'url': url, 'index_only': True}, repo_section + ) + self.assertEqual(call_iteration, 1, 'expected 1 invocations of subprocess.call') + def test_update_serverwebroot_with_id_file(self): # setup parameters for this test run fdroidserver.common.options = mock.Mock() @@ -264,6 +466,7 @@ class DeployTest(unittest.TestCase): fdroidserver.common.options.verbose = True fdroidserver.common.options.quiet = False fdroidserver.common.options.identity_file = None + fdroidserver.common.options.index_only = False fdroidserver.deploy.config = {'identity_file': './id_rsa'} url = "example.com:/var/www/fdroid" repo_section = 'archive' @@ -288,6 +491,8 @@ class DeployTest(unittest.TestCase): '--exclude', 'archive/altstore-index.json', '--exclude', + 'archive/altstore-index.json.asc', + '--exclude', 'archive/entry.jar', '--exclude', 'archive/entry.json', @@ -304,8 +509,14 @@ class DeployTest(unittest.TestCase): '--exclude', 'archive/index-v2.json.asc', '--exclude', + 'archive/index.css', + '--exclude', + 'archive/index.html', + '--exclude', 'archive/index.jar', '--exclude', + 'archive/index.png', + '--exclude', 'archive/index.xml', 'archive', url, @@ -336,10 +547,92 @@ class DeployTest(unittest.TestCase): fdroidserver.deploy.update_serverwebroot({'url': url}, repo_section) self.assertEqual(call_iteration, 2, 'expected 2 invocations of subprocess.call') + def test_update_serverwebroot_with_id_file_in_index_only_mode(self): + # setup parameters for this test run + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.no_chcksum = False + fdroidserver.common.options.verbose = True + fdroidserver.common.options.quiet = False + fdroidserver.common.options.identity_file = None + fdroidserver.deploy.config['identity_file'] = './id_rsa' + fdroidserver.deploy.config['make_current_version_link'] = False + url = "example.com:/var/www/fdroid" + repo_section = 'archive' + + # setup function for asserting subprocess.call invocations + call_iteration = 0 + + def update_server_webroot_call(cmd): + nonlocal call_iteration + if call_iteration == 0: + self.assertListEqual( + cmd, + [ + 'rsync', + '--archive', + '--delete-after', + '--safe-links', + '--verbose', + '-e', + 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + + fdroidserver.deploy.config['identity_file'], + 'archive/altstore-index.json', + 'archive/altstore-index.json.asc', + 'archive/entry.jar', + 'archive/entry.json', + 'archive/entry.json.asc', + 'archive/index-v1.jar', + 'archive/index-v1.json', + 'archive/index-v1.json.asc', + 'archive/index-v2.json', + 'archive/index-v2.json.asc', + 'archive/index.css', + 'archive/index.html', + 'archive/index.jar', + 'archive/index.png', + 'archive/index.xml', + "example.com:/var/www/fdroid/archive/", + ], + ) + elif call_iteration == 1: + self.assertListEqual( + cmd, + [ + 'rsync', + '--archive', + '--delete-after', + '--safe-links', + '--verbose', + '-e', + 'ssh -oBatchMode=yes -oIdentitiesOnly=yes -i ' + + fdroidserver.deploy.config['identity_file'], + "example.com:/var/www/fdroid/archive/", + ], + ) + else: + self.fail('unexpected subprocess.call invocation') + call_iteration += 1 + return 0 + + with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): + with mock.patch('subprocess.call', side_effect=update_server_webroot_call): + os.mkdir(repo_section) + fake_files = fdroidserver.common.INDEX_FILES + for filename in fake_files: + fake_file = Path(repo_section) / filename + with fake_file.open('w') as fp: + fp.write('not a real one, but has the right filename') + + fdroidserver.deploy.update_serverwebroot( + {'url': url, 'index_only': True}, repo_section + ) + self.assertEqual(call_iteration, 1, 'expected 1 invocations of subprocess.call') + @unittest.skipIf( not os.getenv('VIRUSTOTAL_API_KEY'), 'VIRUSTOTAL_API_KEY is not set' ) def test_upload_to_virustotal(self): + fdroidserver.common.options = mock.Mock() fdroidserver.common.options.verbose = True virustotal_apikey = os.getenv('VIRUSTOTAL_API_KEY') fdroidserver.deploy.upload_to_virustotal('repo', virustotal_apikey) @@ -356,25 +649,269 @@ class DeployTest(unittest.TestCase): name, fdroidserver.deploy.REMOTE_HOSTNAME_REGEX.sub(r'\1', remote_url) ) - def test_update_servergitmirrors(self): + def test_update_awsbucket_s3cmd(self): # setup parameters for this test run fdroidserver.common.options = mock.Mock() - fdroidserver.common.options.identity_file = None - fdroidserver.common.options.no_keep_git_mirror_archive = False + fdroidserver.common.options.no_checksum = True fdroidserver.common.options.verbose = False fdroidserver.common.options.quiet = True - fdroidserver.common.options.index_only = False config = {} fdroidserver.common.fill_config_defaults(config) fdroidserver.deploy.config = config - fdroidserver.deploy.config["servergitmirrors"] = [] + fdroidserver.deploy.config["awsbucket"] = "bucket" + fdroidserver.deploy.config["awsaccesskeyid"] = "accesskeyid" + fdroidserver.deploy.config["awssecretkey"] = "secretkey" + fdroidserver.deploy.config["s3cmd"] = "s3cmd" repo_section = 'repo' # setup function for asserting subprocess.call invocations - update_servergitmirrors_call_iteration = 0 - remote_push_call_iteration = 0 + call_iteration = 0 + + def update_awsbucket_s3cmd_call(cmd): + nonlocal call_iteration + if call_iteration == 0: + self.assertListEqual( + cmd, + [ + 's3cmd', + f"--config={fdroidserver.deploy.AUTO_S3CFG}", + 'info', + f"s3://{fdroidserver.deploy.config['awsbucket']}", + ], + ) + elif call_iteration == 1: + self.assertListEqual( + cmd, + [ + 's3cmd', + f"--config={fdroidserver.deploy.AUTO_S3CFG}", + 'sync', + '--acl-public', + '--quiet', + '--exclude', + 'repo/altstore-index.json', + '--exclude', + 'repo/altstore-index.json.asc', + '--exclude', + 'repo/entry.jar', + '--exclude', + 'repo/entry.json', + '--exclude', + 'repo/entry.json.asc', + '--exclude', + 'repo/index-v1.jar', + '--exclude', + 'repo/index-v1.json', + '--exclude', + 'repo/index-v1.json.asc', + '--exclude', + 'repo/index-v2.json', + '--exclude', + 'repo/index-v2.json.asc', + '--exclude', + 'repo/index.css', + '--exclude', + 'repo/index.html', + '--exclude', + 'repo/index.jar', + '--exclude', + 'repo/index.png', + '--exclude', + 'repo/index.xml', + '--no-check-md5', + '--skip-existing', + repo_section, + f"s3://{fdroidserver.deploy.config['awsbucket']}/fdroid/", + ], + ) + elif call_iteration == 2: + self.assertListEqual( + cmd, + [ + 's3cmd', + f"--config={fdroidserver.deploy.AUTO_S3CFG}", + 'sync', + '--acl-public', + '--quiet', + '--exclude', + 'repo/altstore-index.json', + '--exclude', + 'repo/altstore-index.json.asc', + '--exclude', + 'repo/entry.jar', + '--exclude', + 'repo/entry.json', + '--exclude', + 'repo/entry.json.asc', + '--exclude', + 'repo/index-v1.jar', + '--exclude', + 'repo/index-v1.json', + '--exclude', + 'repo/index-v1.json.asc', + '--exclude', + 'repo/index-v2.json', + '--exclude', + 'repo/index-v2.json.asc', + '--exclude', + 'repo/index.css', + '--exclude', + 'repo/index.html', + '--exclude', + 'repo/index.jar', + '--exclude', + 'repo/index.png', + '--exclude', + 'repo/index.xml', + '--no-check-md5', + repo_section, + f"s3://{fdroidserver.deploy.config['awsbucket']}/fdroid/", + ], + ) + elif call_iteration == 3: + self.assertListEqual( + cmd, + [ + 's3cmd', + f"--config={fdroidserver.deploy.AUTO_S3CFG}", + 'sync', + '--acl-public', + '--quiet', + '--delete-removed', + '--delete-after', + '--no-check-md5', + repo_section, + f"s3://{fdroidserver.deploy.config['awsbucket']}/fdroid/", + ], + ) + else: + self.fail('unexpected subprocess.call invocation') + call_iteration += 1 + return 0 + + with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): + os.mkdir('repo') + os.symlink('repo/com.example.sym.apk', 'Sym.apk') + os.symlink('repo/com.example.sym.apk.asc', 'Sym.apk.asc') + os.symlink('repo/com.example.sym.apk.sig', 'Sym.apk.sig') + with mock.patch('subprocess.call', side_effect=update_awsbucket_s3cmd_call): + fdroidserver.deploy.update_awsbucket_s3cmd(repo_section) + self.assertEqual(call_iteration, 4, 'expected 4 invocations of subprocess.call') + + def test_update_awsbucket_s3cmd_in_index_only_mode(self): + # setup parameters for this test run + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.no_checksum = True + fdroidserver.common.options.verbose = False + fdroidserver.common.options.quiet = True + + config = {} + fdroidserver.common.fill_config_defaults(config) + fdroidserver.deploy.config = config + fdroidserver.deploy.config["awsbucket"] = "bucket" + fdroidserver.deploy.config["awsaccesskeyid"] = "accesskeyid" + fdroidserver.deploy.config["awssecretkey"] = "secretkey" + fdroidserver.deploy.config["s3cmd"] = "s3cmd" + + repo_section = 'repo' + + # setup function for asserting subprocess.call invocations + call_iteration = 0 + + def update_awsbucket_s3cmd_call(cmd): + nonlocal call_iteration + if call_iteration == 0: + self.assertListEqual( + cmd, + [ + 's3cmd', + f"--config={fdroidserver.deploy.AUTO_S3CFG}", + 'info', + f"s3://{fdroidserver.deploy.config['awsbucket']}", + ], + ) + elif call_iteration == 1: + self.assertListEqual( + cmd, + [ + 's3cmd', + f"--config={fdroidserver.deploy.AUTO_S3CFG}", + 'sync', + '--acl-public', + '--quiet', + '--include', + 'repo/altstore-index.json', + '--include', + 'repo/altstore-index.json.asc', + '--include', + 'repo/entry.jar', + '--include', + 'repo/entry.json', + '--include', + 'repo/entry.json.asc', + '--include', + 'repo/index-v1.jar', + '--include', + 'repo/index-v1.json', + '--include', + 'repo/index-v1.json.asc', + '--include', + 'repo/index-v2.json', + '--include', + 'repo/index-v2.json.asc', + '--include', + 'repo/index.css', + '--include', + 'repo/index.html', + '--include', + 'repo/index.jar', + '--include', + 'repo/index.png', + '--include', + 'repo/index.xml', + '--delete-removed', + '--delete-after', + '--no-check-md5', + repo_section, + f"s3://{fdroidserver.deploy.config['awsbucket']}/fdroid/", + ], + ) + else: + self.fail('unexpected subprocess.call invocation') + call_iteration += 1 + return 0 + + with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): + os.mkdir('repo') + os.symlink('repo/com.example.sym.apk', 'Sym.apk') + os.symlink('repo/com.example.sym.apk.asc', 'Sym.apk.asc') + os.symlink('repo/com.example.sym.apk.sig', 'Sym.apk.sig') + with mock.patch('subprocess.call', side_effect=update_awsbucket_s3cmd_call): + fdroidserver.deploy.update_awsbucket_s3cmd( + repo_section, is_index_only=True + ) + self.assertEqual(call_iteration, 2, 'expected 2 invocations of subprocess.call') + + def test_update_awsbucket_libcloud(self): + from libcloud.storage.base import Container + + # setup parameters for this test run + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.no_checksum = True + fdroidserver.common.options.verbose = False + fdroidserver.common.options.quiet = True + + config = {} + fdroidserver.common.fill_config_defaults(config) + fdroidserver.deploy.config = config + fdroidserver.deploy.config["awsbucket"] = "bucket" + fdroidserver.deploy.config["awsaccesskeyid"] = "accesskeyid" + fdroidserver.deploy.config["awssecretkey"] = "secretkey" + fdroidserver.deploy.config["s3cmd"] = "s3cmd" + + repo_section = 'repo' os.chdir(self.testdir) repo = Path('repo') @@ -382,60 +919,296 @@ class DeployTest(unittest.TestCase): fake_apk = repo / 'Sym.apk' with fake_apk.open('w') as fp: fp.write('not an APK, but has the right filename') - fake_index = repo / fdroidserver.deploy.INDEX_FILES[0] + fake_index = repo / fdroidserver.common.INDEX_FILES[0] with fake_index.open('w') as fp: fp.write('not an index, but has the right filename') - def update_servergitmirrors_call(cmd): - nonlocal update_servergitmirrors_call_iteration - if update_servergitmirrors_call_iteration == 0: - self.assertListEqual( - cmd, - [ - 'rsync', - '--recursive', - '--safe-links', - '--times', - '--perms', - '--one-file-system', - '--delete', - '--chmod=Da+rx,Fa-x,a+r,u+w', - '--quiet', - 'repo/', - "git-mirror/fdroid/repo/", - ], - ) - else: - self.fail('unexpected subprocess.call invocation') - update_servergitmirrors_call_iteration += 1 - return 0 + with mock.patch( + 'libcloud.storage.drivers.s3.S3StorageDriver' + ) as mock_driver_class: + mock_driver = mock_driver_class.return_value + mock_container = mock.MagicMock(spec=Container) + mock_container.list_objects.return_value = [ + mock.MagicMock(name='Sym.apk'), + mock.MagicMock(name=fdroidserver.common.INDEX_FILES[0]), + ] - def remote_push_call(ref, force=False, set_upstream=False, **_args): - nonlocal remote_push_call_iteration - if remote_push_call_iteration == 0: - self.assertEqual([ref, force, set_upstream], ['master', True, True]) - else: - self.fail('unexpected git.Remote.push invocation') - remote_push_call_iteration += 1 - return [] + mock_driver.get_container.return_value = mock_container + mock_driver.upload_object_via_stream.return_value = None - with mock.patch('subprocess.call', side_effect=update_servergitmirrors_call): - with mock.patch( - 'git.Remote.push', side_effect=remote_push_call - ) as mock_remote_push: - mock_remote_push.return_value = [] - fdroidserver.deploy.update_servergitmirrors( - [{'url': 'https://github.com/user/repo'}], repo_section + fdroidserver.deploy.update_awsbucket_libcloud(repo_section) + + mock_driver.get_container.assert_called_once_with( + container_name=fdroidserver.deploy.config["awsbucket"] + ) + mock_container.list_objects.assert_called_once_with() + files_to_upload = [ + 'fdroid/repo/Sym.apk', + f"fdroid/repo/{fdroidserver.common.INDEX_FILES[0]}", + ] + calls = [ + mock.call( + iterator=mock.ANY, + container=mock_container, + object_name=file, + extra={'acl': 'public-read'}, ) - self.assertEqual( - update_servergitmirrors_call_iteration, - 1, - 'expected 1 invocations of subprocess.call', + for file in files_to_upload + ] + mock_driver.upload_object_via_stream.assert_has_calls(calls, any_order=True) + assert mock_driver.upload_object_via_stream.call_count == 2 + + def test_update_awsbucket_libcloud_in_index_only_mode(self): + from libcloud.storage.base import Container + + # setup parameters for this test run + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.no_checksum = True + fdroidserver.common.options.verbose = False + fdroidserver.common.options.quiet = True + + config = {} + fdroidserver.common.fill_config_defaults(config) + fdroidserver.deploy.config = config + fdroidserver.deploy.config["awsbucket"] = "bucket" + fdroidserver.deploy.config["awsaccesskeyid"] = "accesskeyid" + fdroidserver.deploy.config["awssecretkey"] = "secretkey" + fdroidserver.deploy.config["s3cmd"] = "s3cmd" + + repo_section = 'repo' + + os.chdir(self.testdir) + repo = Path('repo') + repo.mkdir(parents=True) + fake_apk = repo / 'Sym.apk' + with fake_apk.open('w') as fp: + fp.write('not an APK, but has the right filename') + fake_index = repo / fdroidserver.common.INDEX_FILES[0] + with fake_index.open('w') as fp: + fp.write('not an index, but has the right filename') + + with mock.patch( + 'libcloud.storage.drivers.s3.S3StorageDriver' + ) as mock_driver_class: + mock_driver = mock_driver_class.return_value + mock_container = mock.MagicMock(spec=Container) + mock_container.list_objects.return_value = [ + mock.MagicMock(name='Sym.apk'), + mock.MagicMock(name=fdroidserver.common.INDEX_FILES[0]), + ] + + mock_driver.get_container.return_value = mock_container + mock_driver.upload_object_via_stream.return_value = None + + fdroidserver.deploy.update_awsbucket_libcloud( + repo_section, is_index_only=True + ) + + mock_driver.get_container.assert_called_once_with( + container_name=fdroidserver.deploy.config["awsbucket"] + ) + mock_container.list_objects.assert_called_once_with() + files_to_upload = [f"fdroid/repo/{fdroidserver.common.INDEX_FILES[0]}"] + calls = [ + mock.call( + iterator=mock.ANY, + container=mock_container, + object_name=file, + extra={'acl': 'public-read'}, + ) + for file in files_to_upload + ] + mock_driver.upload_object_via_stream.assert_has_calls( + calls, + any_order=False, + ) + assert mock_driver.upload_object_via_stream.call_count == 1 + + def test_update_servergitmirrors(self): + # setup parameters for this test run + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.identity_file = None + fdroidserver.common.options.no_keep_git_mirror_archive = False + fdroidserver.common.options.verbose = False + fdroidserver.common.options.quiet = True + + config = {} + fdroidserver.common.fill_config_defaults(config) + fdroidserver.deploy.config = config + + os.chdir(self.testdir) + + repo_section = 'repo' + initial_branch = fdroidserver.deploy.GIT_BRANCH + + remote_repo = Path(self.testdir) / 'remote' + remote_repo.mkdir(parents=True) + remote_git_repo = git.Repo.init( + remote_repo, initial_branch=initial_branch, bare=True ) - self.assertEqual( - remote_push_call_iteration, 1, 'expected 1 invocations of git.Remote.push' + fdroidserver.deploy.config["servergitmirrors"] = [{"url": str(remote_repo)}] + + os.chdir(self.testdir) + repo = Path('repo') + repo.mkdir(parents=True) + fake_apk = 'Sym.apk' + fake_files = fdroidserver.common.INDEX_FILES + [fake_apk] + for filename in fake_files: + fake_file = repo / filename + with fake_file.open('w') as fp: + fp.write('not a real one, but has the right filename') + + fdroidserver.deploy.update_servergitmirrors( + fdroidserver.deploy.config["servergitmirrors"], repo_section ) + verify_repo = remote_git_repo.clone( + Path(self.testdir) / 'verify', + ) + + for filename in fake_files: + remote_file = f"fdroid/{repo_section}/{filename}" + + self.assertIsNotNone(verify_repo.working_tree_dir) + if verify_repo.working_tree_dir is not None: + self.assertTrue( + (Path(verify_repo.working_tree_dir) / remote_file).exists() + ) + + def test_update_servergitmirrors_in_index_only_mode(self): + # setup parameters for this test run + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.identity_file = None + fdroidserver.common.options.no_keep_git_mirror_archive = False + fdroidserver.common.options.verbose = False + fdroidserver.common.options.quiet = True + + config = {} + fdroidserver.common.fill_config_defaults(config) + fdroidserver.deploy.config = config + + os.chdir(self.testdir) + + repo_section = 'repo' + initial_branch = fdroidserver.deploy.GIT_BRANCH + + remote_repo = Path(self.testdir) / 'remote' + remote_repo.mkdir(parents=True) + remote_git_repo = git.Repo.init( + remote_repo, initial_branch=initial_branch, bare=True + ) + fdroidserver.deploy.config["servergitmirrors"] = [ + {"url": str(remote_repo), "index_only": True} + ] + + os.chdir(self.testdir) + repo = Path('repo') + repo.mkdir(parents=True) + fake_apk = 'Sym.apk' + fake_files = fdroidserver.common.INDEX_FILES + [fake_apk] + for filename in fake_files: + fake_file = repo / filename + with fake_file.open('w') as fp: + fp.write('not a real one, but has the right filename') + + fdroidserver.deploy.update_servergitmirrors( + fdroidserver.deploy.config["servergitmirrors"], repo_section + ) + + verify_repo = remote_git_repo.clone( + Path(self.testdir) / 'verify', + ) + + for filename in fdroidserver.common.INDEX_FILES: + remote_file = f"fdroid/{repo_section}/{filename}" + + self.assertIsNotNone(verify_repo.working_tree_dir) + if verify_repo.working_tree_dir is not None: + self.assertTrue( + (Path(verify_repo.working_tree_dir) / remote_file).exists() + ) + + # Should not have the APK file + remote_file = f"fdroid/{repo_section}/{fake_apk}" + if verify_repo.working_tree_dir is not None: + self.assertFalse( + (Path(verify_repo.working_tree_dir) / remote_file).exists() + ) + + def test_upload_to_servergitmirror_in_index_only_mode(self): + # setup parameters for this test run + fdroidserver.common.options = mock.Mock() + fdroidserver.common.options.identity_file = None + fdroidserver.common.options.no_keep_git_mirror_archive = False + fdroidserver.common.options.verbose = False + fdroidserver.common.options.quiet = True + fdroidserver.common.options.identity_file = None + + config = {} + fdroidserver.common.fill_config_defaults(config) + fdroidserver.deploy.config = config + + repo_section = 'repo' + initial_branch = fdroidserver.deploy.GIT_BRANCH + + os.chdir(self.testdir) + + local_git_repo_path = Path(self.testdir) / 'local' + local_git_repo = git.Repo.init( + local_git_repo_path, initial_branch=initial_branch + ) + + fdroid_dir = local_git_repo_path / 'fdroid' + repo_dir = fdroid_dir / repo_section + repo_dir.mkdir(parents=True) + fake_apk = 'Sym.apk' + fake_files = fdroidserver.common.INDEX_FILES + [fake_apk] + for filename in fake_files: + fake_file = repo_dir / filename + with fake_file.open('w') as fp: + fp.write('not a real one, but has the right filename') + + # The remote repo must be a bare repo to allow being pushed to + remote_git_repo_dir = Path(self.testdir) / 'remote' + remote_git_repo = git.Repo.init( + remote_git_repo_dir, initial_branch=initial_branch, bare=True + ) + + mirror_config = {"url": str(remote_git_repo_dir), "index_only": True} + enabled_remotes = [] + ssh_cmd = 'ssh -oBatchMode=yes' + fdroidserver.deploy.upload_to_servergitmirror( + mirror_config=mirror_config, + local_repo=local_git_repo, + enabled_remotes=enabled_remotes, + repo_section=repo_section, + is_index_only=mirror_config['index_only'], + fdroid_dir=str(fdroid_dir), + git_mirror_path=str(local_git_repo_path), + ssh_cmd=ssh_cmd, + progress=git.RemoteProgress(), + ) + + verify_repo = remote_git_repo.clone( + Path(self.testdir) / 'verify', + ) + + for filename in fdroidserver.common.INDEX_FILES: + remote_file = f"fdroid/{repo_section}/{filename}" + + self.assertIsNotNone(verify_repo.working_tree_dir) + if verify_repo.working_tree_dir is not None: + self.assertTrue( + (Path(verify_repo.working_tree_dir) / remote_file).exists() + ) + + # Should not have the APK file + remote_file = f"fdroid/{repo_section}/{fake_apk}" + if verify_repo.working_tree_dir is not None: + self.assertFalse( + (Path(verify_repo.working_tree_dir) / remote_file).exists() + ) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 3f59d0908f5b70228912b335a1a8df2b5a56d7b6 Mon Sep 17 00:00:00 2001 From: pmmayero Date: Wed, 5 Jun 2024 20:37:48 +0300 Subject: [PATCH 1526/2116] fix: subprocess.check_output to produce string and not bytes --- fdroidserver/deploy.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 7dde38b5..1e98f852 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -268,19 +268,21 @@ def update_remote_storage_with_rclone( ) configfilename = USER_RCLONE_CONF else: + rclone_conf_str = split("rclone config file") logging.info('Custom configuration not found.') logging.info( 'Using default configuration at {}'.format( - subprocess.check_output('rclone config file') + subprocess.check_output(rclone_conf_str).decode("utf-8") ) ) configfilename = None else: + rclone_conf_str = split("rclone config file") logging.warning("'path_to_custom_rclone_config' not found in config.yml") logging.info('Custom configuration not found.') logging.info( 'Using default configuration at {}'.format( - subprocess.check_output('rclone config file') + subprocess.check_output(rclone_conf_str).decode("utf-8") ) ) configfilename = None From 8255dec6b8ad0958179a3158d1b13c6d705d7d57 Mon Sep 17 00:00:00 2001 From: pmmayero Date: Tue, 11 Jun 2024 05:31:04 +0300 Subject: [PATCH 1527/2116] fix: jinja 2 CVE --- fdroidserver/deploy.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 1e98f852..e87703c5 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -268,21 +268,19 @@ def update_remote_storage_with_rclone( ) configfilename = USER_RCLONE_CONF else: - rclone_conf_str = split("rclone config file") logging.info('Custom configuration not found.') logging.info( 'Using default configuration at {}'.format( - subprocess.check_output(rclone_conf_str).decode("utf-8") + subprocess.check_output(split("rclone config file")).decode("utf-8") ) ) configfilename = None else: - rclone_conf_str = split("rclone config file") logging.warning("'path_to_custom_rclone_config' not found in config.yml") logging.info('Custom configuration not found.') logging.info( 'Using default configuration at {}'.format( - subprocess.check_output(rclone_conf_str).decode("utf-8") + subprocess.check_output(split("rclone config file")).decode("utf-8") ) ) configfilename = None From 1b19293ab0787cdcf55c0669e20b1245ff84af4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Fri, 5 Apr 2024 17:34:16 +0200 Subject: [PATCH 1528/2116] =?UTF-8?q?=F0=9F=9B=B0=EF=B8=8F=20=20deploy:=20?= =?UTF-8?q?github=20releases?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implemented basic support for using `fdroid delpoy` to upload APKs from the repo to GitHub releases. --- examples/config.yml | 22 ++++++ fdroidserver/deploy.py | 78 +++++++++++++++++++- fdroidserver/github.py | 157 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 255 insertions(+), 2 deletions(-) create mode 100644 fdroidserver/github.py diff --git a/examples/config.yml b/examples/config.yml index 0337e6f0..8efa41ea 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -211,6 +211,28 @@ # - url: https://gitlab.com/user/repo # index_only: true + +# These settings allows using `fdroid deploy` for publishing APK files from +# your repository to GitHub Releases. (You should also run `fdroid update` +# every time before deploying to GitHub releases to update index files.) Here's +# an example for this deployment automation: +# https://github.com/f-droid/fdroidclient/releases/ +# +# It is highly recommended to use a "Fine-grained personal access token", which +# is restriced to the minimum required permissions, which are: +# * Metadata - read +# * Contents - read/write +# Also make sure to limit access only to the GitHub repository you're deploying +# to. (https://github.com/settings/personal-access-tokens/new) +# +# github_releases: +# - repo: f-droid/fdroidclient +# token: {env: GITHUB_TOKEN} +# packages: +# - org.fdroid.basic +# - org.fdroid.fdroid + + # Most git hosting services have hard size limits for each git repo. # `fdroid deploy` will delete the git history when the git mirror repo # approaches this limit to ensure that the repo will still fit when diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index e87703c5..4393d1d7 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -31,9 +31,10 @@ import yaml from argparse import ArgumentParser import logging from shlex import split +import pathlib import shutil import git -from pathlib import Path +import fdroidserver.github from . import _ from . import common @@ -663,7 +664,7 @@ def update_servergitmirrors(servergitmirrors, repo_section): return options = common.get_options() - workspace_dir = Path(os.getcwd()) + workspace_dir = pathlib.Path(os.getcwd()) # right now we support only 'repo' git-mirroring if repo_section == 'repo': @@ -1115,6 +1116,76 @@ def push_binary_transparency(git_repo_path, git_remote): raise FDroidException(_("Pushing to remote server failed!")) +def upload_to_github_releases(repo_section, gh_config): + repo_dir = pathlib.Path(repo_section) + idx_path = repo_dir / 'index-v2.json' + if not idx_path.is_file(): + logging.waring( + _( + "Error deploying 'github_releases', {} not present. (You might " + "need to run `fdroid update` first.)" + ).format(idx_path) + ) + return + + known_packages = {} + with open(idx_path, 'r') as f: + idx = json.load(f) + for repo_conf in gh_config: + for package_name in repo_conf.get('packages', []): + package = idx.get('packages', {}).get(package_name, {}) + for version in package.get('versions', {}).values(): + if package_name not in known_packages: + known_packages[package_name] = {} + ver_name = version['manifest']['versionName'] + apk_path = repo_dir / version['file']['name'][1:] + files = [apk_path] + asc_path = pathlib.Path(str(apk_path) + '.asc') + if asc_path.is_file(): + files.append(asc_path) + idsig_path = pathlib.Path(str(apk_path) + '.idsig') + if idsig_path.is_file(): + files.append(idsig_path) + known_packages[package_name][ver_name] = files + + for repo_conf in gh_config: + upload_to_github_releases_repo(repo_conf, known_packages) + + +def upload_to_github_releases_repo(repo_conf, known_packages): + repo = repo_conf.get('repo') + if not repo: + logging.warning(_("One of the 'github_releases' config items is missing the 'repo' value. skipping ...")) + return + token = repo_conf.get('token') + if not token: + logging.warning(_("One of the 'github_releases' config itmes is missing the 'token' value. skipping ...")) + return + packages = repo_conf.get('packages', []) + if not packages: + logging.warning(_("One of the 'github_releases' config itmes is missing the 'packages' value. skipping ...")) + return + + # lookup all versionNames (git tags) for all packages available in the + # local fdroid repo + all_local_versions = set() + for package_name in repo_conf['packages']: + for version in known_packages.get(package_name, {}).keys(): + all_local_versions.add(version) + + gh = fdroidserver.github.GithubApi(token, repo) + unreleased_tags = gh.list_unreleased_tags() + + for version in all_local_versions: + if version in unreleased_tags: + # collect files associated with this github release + files = [] + for package in packages: + files.extend(known_packages.get(package, {}).get(version, [])) + # create new release on github and upload all associated files + gh.create_release(version, files) + + def main(): global config @@ -1194,6 +1265,7 @@ def main(): and not config.get('androidobservatory') and not config.get('binary_transparency_remote') and not config.get('virustotal_apikey') + and not config.get('github_releases') and local_copy_dir is None ): logging.warning( @@ -1236,6 +1308,8 @@ def main(): upload_to_android_observatory(repo_section) if config.get('virustotal_apikey'): upload_to_virustotal(repo_section, config.get('virustotal_apikey')) + if config.get('github_releases'): + upload_to_github_releases(repo_section, config.get('github_releases')) binary_transparency_remote = config.get('binary_transparency_remote') if binary_transparency_remote: diff --git a/fdroidserver/github.py b/fdroidserver/github.py new file mode 100644 index 00000000..6356c4ae --- /dev/null +++ b/fdroidserver/github.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python3 +# +# github.py - part of the FDroid server tools +# Copyright (C) 2024, Michael Pöhn, michael@poehn.at +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import json +import pathlib +import urllib.request +import urllib.parse + + +class GithubApi: + """ + Warpper for some select calls to GitHub Json/REST API. + + This class wraps some calls to api.github.com. This is not intended to be a + general API wrapper. Instead it's purpose is to return pre-filtered and + transformed data that's playing well with other fdroidserver functions. + """ + + def __init__(self, api_token, repo_path): + self._api_token = api_token + self._repo_path = repo_path + + def _req(self, url, data=None): + h = { + "Accept": "application/vnd.github+json", + "Authorization": f"Bearer {self._api_token}", + "X-GitHub-Api-Version": "2022-11-28", + } + return urllib.request.Request( + url, + headers=h, + data=data, + ) + + def list_released_tags(self): + """List of all tags that are associated with a release for this repo on GitHub.""" + names = [] + req = self._req(f"https://api.github.com/repos/{self._repo_path}/releases") + with urllib.request.urlopen(req) as resp: + releases = json.load(resp) + for release in releases: + names.append(release['tag_name']) + return names + + def list_unreleased_tags(self): + all_tags = self.list_all_tags() + released_tags = self.list_released_tags() + return [x for x in all_tags if x not in released_tags] + + def tag_exists(self, tag): + """ + Check if git tag is present on github. + + https://docs.github.com/en/rest/git/refs?apiVersion=2022-11-28#list-matching-references--fine-grained-access-tokens + """ + req = self._req( + f"https://api.github.com/repos/{self._repo_path}/git/matching-refs/tags/{tag}" + ) + with urllib.request.urlopen(req) as resp: + rd = json.load(resp) + return len(rd) == 1 and rd[0].get("ref", False) == f"refs/tags/{tag}" + return False + + def list_all_tags(self): + """Get list of all tags for this repo on GitHub.""" + tags = [] + req = self._req( + f"https://api.github.com/repos/{self._repo_path}/git/matching-refs/tags/" + ) + with urllib.request.urlopen(req) as resp: + refs = json.load(resp) + for ref in refs: + r = ref['ref'] + if r.startswith('refs/tags/'): + tags.append(r[10:]) + return tags + + def create_release(self, tag, files): + """ + Create a new release on github. + + also see: https://docs.github.com/en/rest/releases/releases?apiVersion=2022-11-28#create-a-release + + :returns: True if release was created, False if release already exists + :raises: urllib exceptions in case of network or api errors, also + raises an exception when the tag doesn't exists. + """ + # Querying github to create a new release for a non-existent tag, will + # also create that tag on github. So we need an additional check to + # prevent this behavior. + if not self.tag_exists(tag): + raise Exception( + f"can't create github release for {self._repo_path} {tag}, tag doesn't exists" + ) + # create the relase on github + req = self._req( + f"https://api.github.com/repos/{self._repo_path}/releases", + data=json.dumps( + { + "tag_name": tag, + } + ).encode("utf-8"), + ) + try: + with urllib.request.urlopen(req) as resp: + release_id = json.load(resp)['id'] + except urllib.error.HTTPError as e: + if e.status == 422: + codes = [x['code'] for x in json.load(e).get('errors', [])] + if "already_exists" in codes: + return False + raise e + + # attach / upload all files for the relase + for file in files: + self._create_release_asset(release_id, file) + + return True + + def _create_release_asset(self, release_id, file): + """ + Attach a file to a release on GitHub. + + This uploads a file to github relases, it will be attached to the supplied release + + also see: https://docs.github.com/en/rest/releases/assets?apiVersion=2022-11-28#upload-a-release-asset + """ + file = pathlib.Path(file) + with open(file, 'rb') as f: + req = urllib.request.Request( + f"https://uploads.github.com/repos/{self._repo_path}/releases/{release_id}/assets?name={file.name}", + headers={ + "Accept": "application/vnd.github+json", + "Authorization": f"Bearer {self._api_token}", + "X-GitHub-Api-Version": "2022-11-28", + "Content-Type": "application/octet-stream", + }, + data=f.read(), + ) + with urllib.request.urlopen(req): + return True + return False From 44b0af933d5dc66e23a6b191bf48b8eb87558c22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Tue, 16 Apr 2024 11:35:54 +0200 Subject: [PATCH 1529/2116] =?UTF-8?q?=F0=9F=8E=A1=20add=20unit=20tests=20f?= =?UTF-8?q?or=20github.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit add unittests for our github api calls --- fdroidserver/github.py | 2 +- tests/github.TestCase | 164 +++++++++++++++++++++++++++++++++++++++++ tests/testcommon.py | 12 ++- 3 files changed, 175 insertions(+), 3 deletions(-) create mode 100755 tests/github.TestCase diff --git a/fdroidserver/github.py b/fdroidserver/github.py index 6356c4ae..b7a8ce2a 100644 --- a/fdroidserver/github.py +++ b/fdroidserver/github.py @@ -85,7 +85,7 @@ class GithubApi: with urllib.request.urlopen(req) as resp: refs = json.load(resp) for ref in refs: - r = ref['ref'] + r = ref.get('ref', '') if r.startswith('refs/tags/'): tags.append(r[10:]) return tags diff --git a/tests/github.TestCase b/tests/github.TestCase new file mode 100755 index 00000000..bc5e04a4 --- /dev/null +++ b/tests/github.TestCase @@ -0,0 +1,164 @@ +#!/usr/bin/env python3 + +import inspect +import optparse +import os +import sys +import unittest.mock +import testcommon + +localmodule = os.path.realpath( + os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') +) +print('localmodule: ' + localmodule) +if localmodule not in sys.path: + sys.path.insert(0, localmodule) + +import fdroidserver.github +import fdroidserver.common + + +class GithubApiTest(unittest.TestCase): + def test__init(self): + api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath') + self.assertEqual(api._api_token, 'faketoken') + self.assertEqual(api._repo_path, 'fakerepopath') + + def test__req(self): + api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath') + r = api._req('https://fakeurl', data='fakedata') + self.assertEqual(r.full_url, 'https://fakeurl') + self.assertEqual(r.data, "fakedata") + self.assertDictEqual( + r.headers, + { + 'Accept': 'application/vnd.github+json', + 'Authorization': 'Bearer faketoken', + 'X-github-api-version': '2022-11-28', + }, + ) + + def test_list_released_tags(self): + api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath') + uomock = testcommon.mock_urlopen( + body='[{"tag_name": "fake"}, {"tag_name": "double_fake"}]' + ) + with unittest.mock.patch("urllib.request.urlopen", uomock): + result = api.list_released_tags() + self.assertListEqual(result, ['fake', 'double_fake']) + + def test_list_unreleased_tags(self): + api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath') + + api.list_all_tags = unittest.mock.Mock(return_value=[1, 2, 3, 4]) + api.list_released_tags = unittest.mock.Mock(return_value=[1, 2]) + + result = api.list_unreleased_tags() + + self.assertListEqual(result, [3, 4]) + + def test_tag_exists(self): + api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath') + uomock = testcommon.mock_urlopen(body='[{"ref": "refs/tags/fake_tag"}]') + with unittest.mock.patch("urllib.request.urlopen", uomock): + result = api.tag_exists('fake_tag') + self.assertTrue(result) + + def test_tag_exists_failure(self): + api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath') + + uomock = testcommon.mock_urlopen(body='[{"error": "failure"}]') + + with unittest.mock.patch("urllib.request.urlopen", uomock): + success = api.tag_exists('fake_tag') + + self.assertFalse(success) + + def test_list_all_tags(self): + api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath') + + uomock = testcommon.mock_urlopen( + body='[{"ref": "refs/tags/fake"}, {"ref": "refs/tags/double_fake"}]' + ) + + with unittest.mock.patch("urllib.request.urlopen", uomock): + result = api.list_all_tags() + + self.assertListEqual(result, ['fake', 'double_fake']) + + def test_create_release(self): + api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath') + + uomock = testcommon.mock_urlopen(body='{"id": "fakeid"}') + api.tag_exists = lambda x: True + api._create_release_asset = unittest.mock.Mock() + + with unittest.mock.patch("urllib.request.urlopen", uomock): + success = api.create_release('faketag', ['file_a', 'file_b']) + self.assertTrue(success) + + req = uomock.call_args_list[0][0][0] + self.assertEqual(1, len(uomock.call_args_list)) + self.assertEqual(2, len(uomock.call_args_list[0])) + self.assertEqual(1, len(uomock.call_args_list[0][0])) + self.assertEqual( + req.full_url, + 'https://api.github.com/repos/fakerepopath/releases', + ) + self.assertEqual(req.data, b'{"tag_name": "faketag"}') + self.assertListEqual( + api._create_release_asset.call_args_list, + [ + unittest.mock.call('fakeid', 'file_a'), + unittest.mock.call('fakeid', 'file_b'), + ], + ) + + def test__create_release_asset(self): + api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath') + uomock = testcommon.mock_urlopen() + + with unittest.mock.patch( + 'fdroidserver.github.open', + unittest.mock.mock_open(read_data=b"fake_content"), + ), unittest.mock.patch("urllib.request.urlopen", uomock): + success = api._create_release_asset('fake_id', 'fake_file') + + self.assertTrue(success) + + req = uomock.call_args_list[0][0][0] + self.assertEqual(1, len(uomock.call_args_list)) + self.assertEqual(2, len(uomock.call_args_list[0])) + self.assertEqual(1, len(uomock.call_args_list[0][0])) + self.assertEqual( + req.full_url, + 'https://uploads.github.com/repos/fakerepopath/releases/fake_id/assets?name=fake_file', + ) + self.assertDictEqual( + req.headers, + { + "Accept": "application/vnd.github+json", + 'Authorization': 'Bearer faketoken', + 'Content-type': 'application/octet-stream', + 'X-github-api-version': '2022-11-28', + }, + ) + self.assertEqual(req.data, b'fake_content') + + +if __name__ == "__main__": + os.chdir(os.path.dirname(__file__)) + + parser = optparse.OptionParser() + parser.add_option( + "-v", + "--verbose", + action="store_true", + default=False, + help="Spew out even more information than normal", + ) + (fdroidserver.common.options, args) = parser.parse_args(["--verbose"]) + + newSuite = unittest.TestSuite() + newSuite.addTest(unittest.makeSuite(GithubApiTest)) + unittest.main(failfast=False) diff --git a/tests/testcommon.py b/tests/testcommon.py index 2ce9f393..f0fd11bd 100644 --- a/tests/testcommon.py +++ b/tests/testcommon.py @@ -19,9 +19,9 @@ import os import sys import tempfile import unittest +import unittest.mock from pathlib import Path -from unittest import mock class TmpCwd: @@ -84,5 +84,13 @@ def parse_args_for_test(parser, args): for arg in args: if arg[0] == '-': flags.append(flags) - with mock.patch('sys.argv', flags): + with unittest.mock.patch('sys.argv', flags): parse_args(parser) + + +def mock_urlopen(status=200, body=None): + resp = unittest.mock.MagicMock() + resp.getcode.return_value = status + resp.read.return_value = body + resp.__enter__.return_value = resp + return unittest.mock.Mock(return_value=resp) From 7a6fa7f81662f37c7dc0f00e324d4e53f0bda508 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Tue, 16 Apr 2024 12:57:22 +0200 Subject: [PATCH 1530/2116] =?UTF-8?q?=F0=9F=9B=84=20deploy:=20separate=20f?= =?UTF-8?q?unction=20for=20release=20file=20lookup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fdroidserver/deploy.py | 73 +++++++++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 26 deletions(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 4393d1d7..7f7fe2ef 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -1116,43 +1116,64 @@ def push_binary_transparency(git_repo_path, git_remote): raise FDroidException(_("Pushing to remote server failed!")) +def find_release_files(index_v2_path, repo_dir, package_names): + """ + Find files for uploading to a release page. + + This function parses index-v2.json for file-paths elegible for deployment + to release pages. (e.g. GitHub releases) It also groups these files by + packageName and versionName. e.g. to get a list of files for all specific + release of fdroid client you may call: + + find_binary_release_files()['org.fdroid.fdroid']['0.19.2'] + + All paths in the returned data-structure are of type pathlib.Path. + """ + release_files = {} + with open(index_v2_path, 'r') as f: + idx = json.load(f) + for package_name in package_names: + package = idx.get('packages', {}).get(package_name, {}) + for version in package.get('versions', {}).values(): + if package_name not in release_files: + release_files[package_name] = {} + ver_name = version['manifest']['versionName'] + apk_path = repo_dir / version['file']['name'][1:] + files = [apk_path] + asc_path = pathlib.Path(str(apk_path) + '.asc') + if asc_path.is_file(): + files.append(asc_path) + idsig_path = pathlib.Path(str(apk_path) + '.idsig') + if idsig_path.is_file(): + files.append(idsig_path) + release_files[package_name][ver_name] = files + return release_files + + def upload_to_github_releases(repo_section, gh_config): repo_dir = pathlib.Path(repo_section) - idx_path = repo_dir / 'index-v2.json' - if not idx_path.is_file(): + index_v2_path = repo_dir / 'index-v2.json' + if not index_v2_path.is_file(): logging.waring( _( "Error deploying 'github_releases', {} not present. (You might " "need to run `fdroid update` first.)" - ).format(idx_path) + ).format(index_v2_path) ) return - known_packages = {} - with open(idx_path, 'r') as f: - idx = json.load(f) - for repo_conf in gh_config: - for package_name in repo_conf.get('packages', []): - package = idx.get('packages', {}).get(package_name, {}) - for version in package.get('versions', {}).values(): - if package_name not in known_packages: - known_packages[package_name] = {} - ver_name = version['manifest']['versionName'] - apk_path = repo_dir / version['file']['name'][1:] - files = [apk_path] - asc_path = pathlib.Path(str(apk_path) + '.asc') - if asc_path.is_file(): - files.append(asc_path) - idsig_path = pathlib.Path(str(apk_path) + '.idsig') - if idsig_path.is_file(): - files.append(idsig_path) - known_packages[package_name][ver_name] = files + package_names = [] + for repo_conf in gh_config: + for package_name in repo_conf.get('packages', []): + package_names.append(package_name) + + release_files = find_release_files(index_v2_path, repo_dir, package_names) for repo_conf in gh_config: - upload_to_github_releases_repo(repo_conf, known_packages) + upload_to_github_releases_repo(repo_conf, release_files) -def upload_to_github_releases_repo(repo_conf, known_packages): +def upload_to_github_releases_repo(repo_conf, release_files): repo = repo_conf.get('repo') if not repo: logging.warning(_("One of the 'github_releases' config items is missing the 'repo' value. skipping ...")) @@ -1170,7 +1191,7 @@ def upload_to_github_releases_repo(repo_conf, known_packages): # local fdroid repo all_local_versions = set() for package_name in repo_conf['packages']: - for version in known_packages.get(package_name, {}).keys(): + for version in release_files.get(package_name, {}).keys(): all_local_versions.add(version) gh = fdroidserver.github.GithubApi(token, repo) @@ -1181,7 +1202,7 @@ def upload_to_github_releases_repo(repo_conf, known_packages): # collect files associated with this github release files = [] for package in packages: - files.extend(known_packages.get(package, {}).get(version, [])) + files.extend(release_files.get(package, {}).get(version, [])) # create new release on github and upload all associated files gh.create_release(version, files) From a079f9d85f084928d025630e08efea2f215b38c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Tue, 16 Apr 2024 13:12:29 +0200 Subject: [PATCH 1531/2116] =?UTF-8?q?=E2=99=9F=EF=B8=8F=20deploy:=20add=20?= =?UTF-8?q?global=20config=20`github=5Ftoken`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/config.yml | 6 +++++- fdroidserver/deploy.py | 10 +++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/examples/config.yml b/examples/config.yml index 8efa41ea..9fa8fa6d 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -225,12 +225,16 @@ # Also make sure to limit access only to the GitHub repository you're deploying # to. (https://github.com/settings/personal-access-tokens/new) # +# github_token: {env: GITHUB_TOKEN} # github_releases: # - repo: f-droid/fdroidclient -# token: {env: GITHUB_TOKEN} # packages: # - org.fdroid.basic # - org.fdroid.fdroid +# - repo: example/app +# token: {env: GITHUB_TOKEN_EXAMPLE} +# packages: +# - com.example.app # Most git hosting services have hard size limits for each git repo. diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 7f7fe2ef..0ed65c7b 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -1150,7 +1150,7 @@ def find_release_files(index_v2_path, repo_dir, package_names): return release_files -def upload_to_github_releases(repo_section, gh_config): +def upload_to_github_releases(repo_section, gh_config, global_gh_token): repo_dir = pathlib.Path(repo_section) index_v2_path = repo_dir / 'index-v2.json' if not index_v2_path.is_file(): @@ -1170,15 +1170,15 @@ def upload_to_github_releases(repo_section, gh_config): release_files = find_release_files(index_v2_path, repo_dir, package_names) for repo_conf in gh_config: - upload_to_github_releases_repo(repo_conf, release_files) + upload_to_github_releases_repo(repo_conf, release_files, global_gh_token) -def upload_to_github_releases_repo(repo_conf, release_files): +def upload_to_github_releases_repo(repo_conf, release_files, global_gh_token): repo = repo_conf.get('repo') if not repo: logging.warning(_("One of the 'github_releases' config items is missing the 'repo' value. skipping ...")) return - token = repo_conf.get('token') + token = repo_conf.get('token') or global_gh_token if not token: logging.warning(_("One of the 'github_releases' config itmes is missing the 'token' value. skipping ...")) return @@ -1330,7 +1330,7 @@ def main(): if config.get('virustotal_apikey'): upload_to_virustotal(repo_section, config.get('virustotal_apikey')) if config.get('github_releases'): - upload_to_github_releases(repo_section, config.get('github_releases')) + upload_to_github_releases(repo_section, config.get('github_releases'), config.get('github_token')) binary_transparency_remote = config.get('binary_transparency_remote') if binary_transparency_remote: From c6598f2835ec31079c57c73c69bd6cc163713b34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Wed, 17 Apr 2024 21:04:45 +0200 Subject: [PATCH 1532/2116] =?UTF-8?q?=E2=98=84=EF=B8=8F=20=20deploy:=20git?= =?UTF-8?q?hub=20releases=20-=20whatsNew=20text=20as=20note?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use whatsNew text (if available) as release notes text when deploying to Github releases. This feature will always use 'en-US' locale texts, since English is the lingua franka on GitHub. Additionally this change also adds a config option to preprend a static text to those release notes. --- examples/config.yml | 11 +++++++---- fdroidserver/deploy.py | 36 ++++++++++++++++++++++-------------- fdroidserver/github.py | 3 ++- tests/github.TestCase | 4 ++-- 4 files changed, 33 insertions(+), 21 deletions(-) diff --git a/examples/config.yml b/examples/config.yml index 9fa8fa6d..2eb50abc 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -218,12 +218,13 @@ # an example for this deployment automation: # https://github.com/f-droid/fdroidclient/releases/ # -# It is highly recommended to use a "Fine-grained personal access token", which -# is restriced to the minimum required permissions, which are: +# In the examble below tokens are read from environment variables. Putting +# tokens directly into the config file is also supported but discouraged. It is +# highly recommended to use a "Fine-grained personal access token", which is +# restriced to the minimum required permissions, which are: # * Metadata - read # * Contents - read/write -# Also make sure to limit access only to the GitHub repository you're deploying -# to. (https://github.com/settings/personal-access-tokens/new) +# (https://github.com/settings/personal-access-tokens/new) # # github_token: {env: GITHUB_TOKEN} # github_releases: @@ -231,6 +232,8 @@ # packages: # - org.fdroid.basic # - org.fdroid.fdroid +# release_notes_prepend: | +# Re-post of official F-Droid App release from https://f-droid.org # - repo: example/app # token: {env: GITHUB_TOKEN_EXAMPLE} # packages: diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 0ed65c7b..85a4b109 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -1116,27 +1116,27 @@ def push_binary_transparency(git_repo_path, git_remote): raise FDroidException(_("Pushing to remote server failed!")) -def find_release_files(index_v2_path, repo_dir, package_names): +def find_release_infos(index_v2_path, repo_dir, package_names): """ - Find files for uploading to a release page. + Find files, texts, etc. for uploading to a release page. This function parses index-v2.json for file-paths elegible for deployment to release pages. (e.g. GitHub releases) It also groups these files by packageName and versionName. e.g. to get a list of files for all specific release of fdroid client you may call: - find_binary_release_files()['org.fdroid.fdroid']['0.19.2'] + find_binary_release_infos()['org.fdroid.fdroid']['0.19.2'] All paths in the returned data-structure are of type pathlib.Path. """ - release_files = {} + release_infos = {} with open(index_v2_path, 'r') as f: idx = json.load(f) for package_name in package_names: package = idx.get('packages', {}).get(package_name, {}) for version in package.get('versions', {}).values(): - if package_name not in release_files: - release_files[package_name] = {} + if package_name not in release_infos: + release_infos[package_name] = {} ver_name = version['manifest']['versionName'] apk_path = repo_dir / version['file']['name'][1:] files = [apk_path] @@ -1146,8 +1146,11 @@ def find_release_files(index_v2_path, repo_dir, package_names): idsig_path = pathlib.Path(str(apk_path) + '.idsig') if idsig_path.is_file(): files.append(idsig_path) - release_files[package_name][ver_name] = files - return release_files + release_infos[package_name][ver_name] = { + 'files': files, + 'whatsNew': version.get('whatsNew', {}).get("en-US"), + } + return release_infos def upload_to_github_releases(repo_section, gh_config, global_gh_token): @@ -1167,13 +1170,13 @@ def upload_to_github_releases(repo_section, gh_config, global_gh_token): for package_name in repo_conf.get('packages', []): package_names.append(package_name) - release_files = find_release_files(index_v2_path, repo_dir, package_names) + release_infos = find_release_infos(index_v2_path, repo_dir, package_names) for repo_conf in gh_config: - upload_to_github_releases_repo(repo_conf, release_files, global_gh_token) + upload_to_github_releases_repo(repo_conf, release_infos, global_gh_token) -def upload_to_github_releases_repo(repo_conf, release_files, global_gh_token): +def upload_to_github_releases_repo(repo_conf, release_infos, global_gh_token): repo = repo_conf.get('repo') if not repo: logging.warning(_("One of the 'github_releases' config items is missing the 'repo' value. skipping ...")) @@ -1191,7 +1194,7 @@ def upload_to_github_releases_repo(repo_conf, release_files, global_gh_token): # local fdroid repo all_local_versions = set() for package_name in repo_conf['packages']: - for version in release_files.get(package_name, {}).keys(): + for version in release_infos.get(package_name, {}).keys(): all_local_versions.add(version) gh = fdroidserver.github.GithubApi(token, repo) @@ -1202,9 +1205,14 @@ def upload_to_github_releases_repo(repo_conf, release_files, global_gh_token): # collect files associated with this github release files = [] for package in packages: - files.extend(release_files.get(package, {}).get(version, [])) + files.extend(release_infos.get(package, {}).get(version, {}).get('files', [])) + # always use the whatsNew text from the first app listed in + # config.qml github_releases.packages + text = release_infos.get(packages[0], {}).get(version, {}).get('whatsNew') or '' + if 'release_notes_prepend' in repo_conf: + text = repo_conf['release_notes_prepend'] + "\n\n" + text # create new release on github and upload all associated files - gh.create_release(version, files) + gh.create_release(version, files, text) def main(): diff --git a/fdroidserver/github.py b/fdroidserver/github.py index b7a8ce2a..68396235 100644 --- a/fdroidserver/github.py +++ b/fdroidserver/github.py @@ -90,7 +90,7 @@ class GithubApi: tags.append(r[10:]) return tags - def create_release(self, tag, files): + def create_release(self, tag, files, body=''): """ Create a new release on github. @@ -113,6 +113,7 @@ class GithubApi: data=json.dumps( { "tag_name": tag, + "body": body, } ).encode("utf-8"), ) diff --git a/tests/github.TestCase b/tests/github.TestCase index bc5e04a4..608d7215 100755 --- a/tests/github.TestCase +++ b/tests/github.TestCase @@ -94,7 +94,7 @@ class GithubApiTest(unittest.TestCase): api._create_release_asset = unittest.mock.Mock() with unittest.mock.patch("urllib.request.urlopen", uomock): - success = api.create_release('faketag', ['file_a', 'file_b']) + success = api.create_release('faketag', ['file_a', 'file_b'], body="bdy") self.assertTrue(success) req = uomock.call_args_list[0][0][0] @@ -105,7 +105,7 @@ class GithubApiTest(unittest.TestCase): req.full_url, 'https://api.github.com/repos/fakerepopath/releases', ) - self.assertEqual(req.data, b'{"tag_name": "faketag"}') + self.assertEqual(req.data, b'{"tag_name": "faketag", "body": "bdy"}') self.assertListEqual( api._create_release_asset.call_args_list, [ From 242490ddc3a99fd3d86a1a8492964a4791331e77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Mon, 22 Apr 2024 19:40:08 +0200 Subject: [PATCH 1533/2116] =?UTF-8?q?=F0=9F=8E=AF=20deploy:=20no=20release?= =?UTF-8?q?Channels=20on=20github=20releases?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Don't deploy versions of to GitHub releases where a `releaseChannels` value is set in index-v2.json. (This usually would mean it's a alpha or beta version.) --- examples/config.yml | 3 +++ fdroidserver/deploy.py | 29 +++++++++++++++++------------ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/examples/config.yml b/examples/config.yml index 2eb50abc..3cfc17c5 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -218,6 +218,9 @@ # an example for this deployment automation: # https://github.com/f-droid/fdroidclient/releases/ # +# Currently versions which are assigned to a release channel (e.g. alpha or +# beta releases) are ignored. +# # In the examble below tokens are read from environment variables. Putting # tokens directly into the config file is also supported but discouraged. It is # highly recommended to use a "Fine-grained personal access token", which is diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 85a4b109..b326cf95 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -1118,7 +1118,7 @@ def push_binary_transparency(git_repo_path, git_remote): def find_release_infos(index_v2_path, repo_dir, package_names): """ - Find files, texts, etc. for uploading to a release page. + Find files, texts, etc. for uploading to a release page in index-v2.json. This function parses index-v2.json for file-paths elegible for deployment to release pages. (e.g. GitHub releases) It also groups these files by @@ -1149,6 +1149,7 @@ def find_release_infos(index_v2_path, repo_dir, package_names): release_infos[package_name][ver_name] = { 'files': files, 'whatsNew': version.get('whatsNew', {}).get("en-US"), + 'hasReleaseChannels': len(version.get('releaseChannels', [])) > 0, } return release_infos @@ -1202,17 +1203,21 @@ def upload_to_github_releases_repo(repo_conf, release_infos, global_gh_token): for version in all_local_versions: if version in unreleased_tags: - # collect files associated with this github release - files = [] - for package in packages: - files.extend(release_infos.get(package, {}).get(version, {}).get('files', [])) - # always use the whatsNew text from the first app listed in - # config.qml github_releases.packages - text = release_infos.get(packages[0], {}).get(version, {}).get('whatsNew') or '' - if 'release_notes_prepend' in repo_conf: - text = repo_conf['release_notes_prepend'] + "\n\n" + text - # create new release on github and upload all associated files - gh.create_release(version, files, text) + # Making sure we're not uploading this version when releaseChannels + # is set. (releaseChannels usually mean it's e.g. an alpha or beta + # version) + if not release_infos.get(packages[0], {}).get(version, {}).get('hasReleaseChannels'): + # collect files associated with this github release + files = [] + for package in packages: + files.extend(release_infos.get(package, {}).get(version, {}).get('files', [])) + # always use the whatsNew text from the first app listed in + # config.qml github_releases.packages + text = release_infos.get(packages[0], {}).get(version, {}).get('whatsNew') or '' + if 'release_notes_prepend' in repo_conf: + text = repo_conf['release_notes_prepend'] + "\n\n" + text + # create new release on github and upload all associated files + gh.create_release(version, files, text) def main(): From a87284cf80768eae14177359cdf6ab7040987d63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Tue, 23 Apr 2024 14:14:05 +0200 Subject: [PATCH 1534/2116] =?UTF-8?q?=F0=9F=9A=A5=20deploy:=20tests=20for?= =?UTF-8?q?=20github=20releases=20deploy=20functions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add test cases for github releases function in deploy.py --- fdroidserver/deploy.py | 9 +- tests/deploy.TestCase | 255 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 261 insertions(+), 3 deletions(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index b326cf95..b8c0d711 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -1138,7 +1138,10 @@ def find_release_infos(index_v2_path, repo_dir, package_names): if package_name not in release_infos: release_infos[package_name] = {} ver_name = version['manifest']['versionName'] - apk_path = repo_dir / version['file']['name'][1:] + apk_path = version['file']['name'] + if apk_path.startswith('/'): + apk_path = apk_path[1:] + apk_path = repo_dir / apk_path files = [apk_path] asc_path = pathlib.Path(str(apk_path) + '.asc') if asc_path.is_file(): @@ -1158,7 +1161,7 @@ def upload_to_github_releases(repo_section, gh_config, global_gh_token): repo_dir = pathlib.Path(repo_section) index_v2_path = repo_dir / 'index-v2.json' if not index_v2_path.is_file(): - logging.waring( + logging.warning( _( "Error deploying 'github_releases', {} not present. (You might " "need to run `fdroid update` first.)" @@ -1171,7 +1174,7 @@ def upload_to_github_releases(repo_section, gh_config, global_gh_token): for package_name in repo_conf.get('packages', []): package_names.append(package_name) - release_infos = find_release_infos(index_v2_path, repo_dir, package_names) + release_infos = fdroidserver.deploy.find_release_infos(index_v2_path, repo_dir, package_names) for repo_conf in gh_config: upload_to_github_releases_repo(repo_conf, release_infos, global_gh_token) diff --git a/tests/deploy.TestCase b/tests/deploy.TestCase index fa87f7b6..041f0eaf 100755 --- a/tests/deploy.TestCase +++ b/tests/deploy.TestCase @@ -1210,6 +1210,259 @@ class DeployTest(unittest.TestCase): ) +class GitHubReleasesTest(unittest.TestCase): + + def test_find_release_infos(self): + self.maxDiff = None + + index_mock = b""" + { + "packages": { + "com.example.app": { + "versions": { + "2e6f263c1927506015bfc98bce0818247836f2e7fe29a04e1af2b33c97848750": { + "file": { + "name": "/com.example.app_123.apk" + }, + "whatsNew": { + "en-US": "fake what's new" + }, + "manifest": { + "versionName": "1.2.3", + "versionCode": "123" + } + }, + "8a6f263c8327506015bfc98bce0815247836f2e7fe29a04e1af2bffa6409998d": { + "file": { + "name": "/com.example.app_100.apk" + }, + "manifest": { + "versionName": "1.0-alpha", + "versionCode": "123" + }, + "releaseChannels": ["alpha"] + } + } + }, + "another.app": { + "versions": { + "30602ffc19a7c0601bbfa93bce00082c78a6f2ddfe29a04e1af253fc9f84eda0": { + "file": { + "name": "/another.app_1.apk" + }, + "manifest": { + "versionName": "1", + "versionCode": "1" + } + } + } + }, + "fildered.app": { + "versions": { + "93ae02fc19a7c0601adfa93bce0443fc78a6f2ddfe3df04e1af093fca9a1ff09": { + "file": { + "name": "/another.app_1.apk" + }, + "manifest": { + "versionName": "1", + "versionCode": "1" + } + } + } + } + } + } + """ + with unittest.mock.patch( + "fdroidserver.deploy.open", unittest.mock.mock_open(read_data=index_mock) + ): + release_infos = fdroidserver.deploy.find_release_infos( + "fake_path", + Path('fake_repo'), + ["com.example.app", "another.app"], + ) + + self.assertDictEqual( + release_infos, + { + "another.app": { + "1": { + "files": [Path('fake_repo') / "another.app_1.apk"], + "hasReleaseChannels": False, + "whatsNew": None, + }, + }, + "com.example.app": { + "1.0-alpha": { + "files": [ + Path("fake_repo") / "com.example.app_100.apk", + ], + "hasReleaseChannels": True, + "whatsNew": None, + }, + "1.2.3": { + "files": [ + Path("fake_repo") / "com.example.app_123.apk", + ], + "hasReleaseChannels": False, + "whatsNew": "fake what's new", + }, + }, + }, + ) + + def test_upload_to_github_releases(self): + gh_config = [ + { + "repo": "example/app", + "packages": ["com.example.app", "another.app"], + }, + { + "repo": "custom/app", + "packages": ["more.custom.app"], + "token": "custom_token", + }, + ] + + fri_mock = unittest.mock.Mock(return_value="fri_result") + urr_mock = unittest.mock.Mock() + with unittest.mock.patch( + "fdroidserver.deploy.find_release_infos", fri_mock + ), unittest.mock.patch( + "fdroidserver.deploy.upload_to_github_releases_repo", urr_mock + ), tempfile.TemporaryDirectory() as tmpdir: + + with open(Path(tmpdir) / "index-v2.json", "w") as f: + f.write("") + + fdroidserver.deploy.upload_to_github_releases( + tmpdir, gh_config, "fake_global_token" + ) + + fri_mock.assert_called_once_with( + Path(tmpdir) / "index-v2.json", + Path(tmpdir), + ["com.example.app", "another.app", "more.custom.app"], + ) + + self.assertListEqual( + urr_mock.call_args_list, + [ + unittest.mock.call( + { + "repo": "example/app", + "packages": ["com.example.app", "another.app"], + }, + "fri_result", + "fake_global_token", + ), + unittest.mock.call( + { + "repo": "custom/app", + "packages": ["more.custom.app"], + "token": "custom_token", + }, + "fri_result", + "fake_global_token", + ), + ], + ) + + +class Test_UploadToGithubReleasesRepo(unittest.TestCase): + + def setUp(self): + self.repo_conf = { + "repo": "example/app", + "packages": ["com.example.app", "com.example.altapp", "another.app"], + } + self.release_infos = { + "com.example.app": { + "1.0.0": { + "files": [ + Path("fake_repo") / "com.example.app_100100.apk", + ], + "hasReleaseChannels": False, + "whatsNew": "what's new com.example.app 1.0.0", + }, + "1.0.0-beta1": { + "files": [ + Path("fake_repo") / "com.example.app_100007.apk", + ], + "hasReleaseChannels": True, + "whatsNew": None, + }, + }, + "com.example.altapp": { + "1.0.0": { + "files": [ + Path("fake_repo") / "com.example.altapp_100100.apk", + Path("fake_repo") / "com.example.altapp_100100.apk.asc", + Path("fake_repo") / "com.example.altapp_100100.apk.idsig", + ], + "whatsNew": "what's new com.example.altapp 1.0.0", + }, + }, + } + + self.api = unittest.mock.Mock() + self.api.list_unreleased_tags = lambda: ["1.0.0", "1.0.0-beta1"] + self.api_constructor = unittest.mock.Mock(return_value=self.api) + + def test_global_token(self): + with unittest.mock.patch("fdroidserver.github.GithubApi", self.api_constructor): + fdroidserver.deploy.upload_to_github_releases_repo( + self.repo_conf, + self.release_infos, + "global_token", + ) + + self.api_constructor.assert_called_once_with("global_token", "example/app") + + self.assertListEqual( + self.api.create_release.call_args_list, + [ + unittest.mock.call( + "1.0.0", + [ + Path("fake_repo/com.example.app_100100.apk"), + Path("fake_repo/com.example.altapp_100100.apk"), + Path("fake_repo/com.example.altapp_100100.apk.asc"), + Path("fake_repo/com.example.altapp_100100.apk.idsig"), + ], + "what's new com.example.app 1.0.0", + ), + ], + ) + + def test_local_token(self): + self.repo_conf["token"] = "local_token" + with unittest.mock.patch("fdroidserver.github.GithubApi", self.api_constructor): + fdroidserver.deploy.upload_to_github_releases_repo( + self.repo_conf, + self.release_infos, + "global_token", + ) + + self.api_constructor.assert_called_once_with("local_token", "example/app") + + self.assertListEqual( + self.api.create_release.call_args_list, + [ + unittest.mock.call( + "1.0.0", + [ + Path("fake_repo/com.example.app_100100.apk"), + Path("fake_repo/com.example.altapp_100100.apk"), + Path("fake_repo/com.example.altapp_100100.apk.asc"), + Path("fake_repo/com.example.altapp_100100.apk.idsig"), + ], + "what's new com.example.app 1.0.0", + ), + ], + ) + + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) @@ -1227,4 +1480,6 @@ if __name__ == "__main__": newSuite = unittest.TestSuite() newSuite.addTest(unittest.makeSuite(DeployTest)) + newSuite.addTest(unittest.makeSuite(GitHubReleasesTest)) + newSuite.addTest(unittest.makeSuite(Test_UploadToGithubReleasesRepo)) unittest.main(failfast=False) From aca98c1355e7bc38601d33d9c20f9d327fa76a7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Wed, 24 Apr 2024 11:51:34 +0200 Subject: [PATCH 1535/2116] =?UTF-8?q?=F0=9F=8F=8F=20incorporate=20review?= =?UTF-8?q?=20feedback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/config.yml | 8 ++--- fdroidserver/deploy.py | 72 ++++++++++++++++++++++++++++-------------- tests/deploy.TestCase | 3 -- 3 files changed, 52 insertions(+), 31 deletions(-) diff --git a/examples/config.yml b/examples/config.yml index 3cfc17c5..45c9a2f7 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -212,19 +212,19 @@ # index_only: true -# These settings allows using `fdroid deploy` for publishing APK files from +# These settings allow using `fdroid deploy` for publishing APK files from # your repository to GitHub Releases. (You should also run `fdroid update` # every time before deploying to GitHub releases to update index files.) Here's # an example for this deployment automation: # https://github.com/f-droid/fdroidclient/releases/ # -# Currently versions which are assigned to a release channel (e.g. alpha or +# Currently, versions which are assigned to a release channel (e.g. alpha or # beta releases) are ignored. # -# In the examble below tokens are read from environment variables. Putting +# In the example below, tokens are read from environment variables. Putting # tokens directly into the config file is also supported but discouraged. It is # highly recommended to use a "Fine-grained personal access token", which is -# restriced to the minimum required permissions, which are: +# restricted to the minimum required permissions, which are: # * Metadata - read # * Contents - read/write # (https://github.com/settings/personal-access-tokens/new) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index b8c0d711..4ca7dca9 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -1117,8 +1117,7 @@ def push_binary_transparency(git_repo_path, git_remote): def find_release_infos(index_v2_path, repo_dir, package_names): - """ - Find files, texts, etc. for uploading to a release page in index-v2.json. + """Find files, texts, etc. for uploading to a release page in index-v2.json. This function parses index-v2.json for file-paths elegible for deployment to release pages. (e.g. GitHub releases) It also groups these files by @@ -1137,19 +1136,16 @@ def find_release_infos(index_v2_path, repo_dir, package_names): for version in package.get('versions', {}).values(): if package_name not in release_infos: release_infos[package_name] = {} - ver_name = version['manifest']['versionName'] - apk_path = version['file']['name'] - if apk_path.startswith('/'): - apk_path = apk_path[1:] - apk_path = repo_dir / apk_path - files = [apk_path] - asc_path = pathlib.Path(str(apk_path) + '.asc') + version_name = version['manifest']['versionName'] + version_path = repo_dir / version['file']['name'].lstrip("/") + files = [version_path] + asc_path = pathlib.Path(str(version_path) + '.asc') if asc_path.is_file(): files.append(asc_path) - idsig_path = pathlib.Path(str(apk_path) + '.idsig') - if idsig_path.is_file(): - files.append(idsig_path) - release_infos[package_name][ver_name] = { + sig_path = pathlib.Path(str(version_path) + '.sig') + if sig_path.is_file(): + files.append(sig_path) + release_infos[package_name][version_name] = { 'files': files, 'whatsNew': version.get('whatsNew', {}).get("en-US"), 'hasReleaseChannels': len(version.get('releaseChannels', [])) > 0, @@ -1174,24 +1170,41 @@ def upload_to_github_releases(repo_section, gh_config, global_gh_token): for package_name in repo_conf.get('packages', []): package_names.append(package_name) - release_infos = fdroidserver.deploy.find_release_infos(index_v2_path, repo_dir, package_names) + release_infos = fdroidserver.deploy.find_release_infos( + index_v2_path, repo_dir, package_names + ) for repo_conf in gh_config: upload_to_github_releases_repo(repo_conf, release_infos, global_gh_token) def upload_to_github_releases_repo(repo_conf, release_infos, global_gh_token): - repo = repo_conf.get('repo') + repo = repo_conf.get("repo") if not repo: - logging.warning(_("One of the 'github_releases' config items is missing the 'repo' value. skipping ...")) + logging.warning( + _( + "One of the 'github_releases' config items is missing the " + "'repo' value. skipping ..." + ) + ) return - token = repo_conf.get('token') or global_gh_token + token = repo_conf.get("token") or global_gh_token if not token: - logging.warning(_("One of the 'github_releases' config itmes is missing the 'token' value. skipping ...")) + logging.warning( + _( + "One of the 'github_releases' config itmes is missing the " + "'token' value. skipping ..." + ) + ) return - packages = repo_conf.get('packages', []) + packages = repo_conf.get("packages", []) if not packages: - logging.warning(_("One of the 'github_releases' config itmes is missing the 'packages' value. skipping ...")) + logging.warning( + _( + "One of the 'github_releases' config itmes is missing the " + "'packages' value. skipping ..." + ) + ) return # lookup all versionNames (git tags) for all packages available in the @@ -1209,14 +1222,23 @@ def upload_to_github_releases_repo(repo_conf, release_infos, global_gh_token): # Making sure we're not uploading this version when releaseChannels # is set. (releaseChannels usually mean it's e.g. an alpha or beta # version) - if not release_infos.get(packages[0], {}).get(version, {}).get('hasReleaseChannels'): + if ( + not release_infos.get(packages[0], {}) + .get(version, {}) + .get('hasReleaseChannels') + ): # collect files associated with this github release files = [] for package in packages: - files.extend(release_infos.get(package, {}).get(version, {}).get('files', [])) + files.extend( + release_infos.get(package, {}).get(version, {}).get('files', []) + ) # always use the whatsNew text from the first app listed in # config.qml github_releases.packages - text = release_infos.get(packages[0], {}).get(version, {}).get('whatsNew') or '' + text = ( + release_infos.get(packages[0], {}).get(version, {}).get('whatsNew') + or '' + ) if 'release_notes_prepend' in repo_conf: text = repo_conf['release_notes_prepend'] + "\n\n" + text # create new release on github and upload all associated files @@ -1346,7 +1368,9 @@ def main(): if config.get('virustotal_apikey'): upload_to_virustotal(repo_section, config.get('virustotal_apikey')) if config.get('github_releases'): - upload_to_github_releases(repo_section, config.get('github_releases'), config.get('github_token')) + upload_to_github_releases( + repo_section, config.get('github_releases'), config.get('github_token') + ) binary_transparency_remote = config.get('binary_transparency_remote') if binary_transparency_remote: diff --git a/tests/deploy.TestCase b/tests/deploy.TestCase index 041f0eaf..2db73a02 100755 --- a/tests/deploy.TestCase +++ b/tests/deploy.TestCase @@ -1211,7 +1211,6 @@ class DeployTest(unittest.TestCase): class GitHubReleasesTest(unittest.TestCase): - def test_find_release_infos(self): self.maxDiff = None @@ -1331,7 +1330,6 @@ class GitHubReleasesTest(unittest.TestCase): ), unittest.mock.patch( "fdroidserver.deploy.upload_to_github_releases_repo", urr_mock ), tempfile.TemporaryDirectory() as tmpdir: - with open(Path(tmpdir) / "index-v2.json", "w") as f: f.write("") @@ -1370,7 +1368,6 @@ class GitHubReleasesTest(unittest.TestCase): class Test_UploadToGithubReleasesRepo(unittest.TestCase): - def setUp(self): self.repo_conf = { "repo": "example/app", From 3cf36852807392fe18c9645f8847b68f7dec959c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Mon, 29 Apr 2024 15:42:28 +0200 Subject: [PATCH 1536/2116] =?UTF-8?q?=F0=9F=90=90=20appeace=20bandint=20se?= =?UTF-8?q?curity=20warnings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In this particular case bandit was complaining about potential path escape exploits on urlopen. However the urls are safe enough, because all template parameters inserted into the url are from: * config.yml - malicious changes to config.yml are possible that's already a lot bigger issue than this than redirecting github api calls. * git tags witch are present in bot the local index-v2.json file (as versionName) and the remote github API. (git tags don't allow the string '..') --- fdroidserver/github.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/fdroidserver/github.py b/fdroidserver/github.py index 68396235..d72e9bb0 100644 --- a/fdroidserver/github.py +++ b/fdroidserver/github.py @@ -51,7 +51,7 @@ class GithubApi: """List of all tags that are associated with a release for this repo on GitHub.""" names = [] req = self._req(f"https://api.github.com/repos/{self._repo_path}/releases") - with urllib.request.urlopen(req) as resp: + with urllib.request.urlopen(req) as resp: # nosec CWE-22 disable bandit warning releases = json.load(resp) for release in releases: names.append(release['tag_name']) @@ -71,7 +71,7 @@ class GithubApi: req = self._req( f"https://api.github.com/repos/{self._repo_path}/git/matching-refs/tags/{tag}" ) - with urllib.request.urlopen(req) as resp: + with urllib.request.urlopen(req) as resp: # nosec CWE-22 disable bandit warning rd = json.load(resp) return len(rd) == 1 and rd[0].get("ref", False) == f"refs/tags/{tag}" return False @@ -82,7 +82,7 @@ class GithubApi: req = self._req( f"https://api.github.com/repos/{self._repo_path}/git/matching-refs/tags/" ) - with urllib.request.urlopen(req) as resp: + with urllib.request.urlopen(req) as resp: # nosec CWE-22 disable bandit warning refs = json.load(resp) for ref in refs: r = ref.get('ref', '') @@ -118,7 +118,9 @@ class GithubApi: ).encode("utf-8"), ) try: - with urllib.request.urlopen(req) as resp: + with urllib.request.urlopen( # nosec CWE-22 disable bandit warning + req + ) as resp: release_id = json.load(resp)['id'] except urllib.error.HTTPError as e: if e.status == 422: @@ -153,6 +155,6 @@ class GithubApi: }, data=f.read(), ) - with urllib.request.urlopen(req): + with urllib.request.urlopen(req): # nosec CWE-22 disable bandit warning return True return False From 0fa88c5c205d083f742d0e800b55ad0ba289c5d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Tue, 11 Jun 2024 12:24:36 +0200 Subject: [PATCH 1537/2116] =?UTF-8?q?=F0=9F=92=87=20implement=20review=20n?= =?UTF-8?q?its?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implement review nits as requested bei @eighthave in https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1471 --- examples/config.yml | 9 ++++----- fdroidserver/deploy.py | 33 +++++++++++++++++++-------------- fdroidserver/github.py | 5 ++++- tests/deploy.TestCase | 29 +++++++++++++++++------------ 4 files changed, 44 insertions(+), 32 deletions(-) diff --git a/examples/config.yml b/examples/config.yml index 45c9a2f7..f15c00da 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -231,16 +231,15 @@ # # github_token: {env: GITHUB_TOKEN} # github_releases: -# - repo: f-droid/fdroidclient -# packages: +# - projectUrl: https://github.com/f-droid/fdroidclient +# packageNames: # - org.fdroid.basic # - org.fdroid.fdroid # release_notes_prepend: | # Re-post of official F-Droid App release from https://f-droid.org -# - repo: example/app +# - projectUrl: https://github.com/example/app +# packageNames: com.example.app # token: {env: GITHUB_TOKEN_EXAMPLE} -# packages: -# - com.example.app # Most git hosting services have hard size limits for each git repo. diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 4ca7dca9..8d2b5dca 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -1167,7 +1167,7 @@ def upload_to_github_releases(repo_section, gh_config, global_gh_token): package_names = [] for repo_conf in gh_config: - for package_name in repo_conf.get('packages', []): + for package_name in repo_conf.get('packageNames', []): package_names.append(package_name) release_infos = fdroidserver.deploy.find_release_infos( @@ -1179,12 +1179,12 @@ def upload_to_github_releases(repo_section, gh_config, global_gh_token): def upload_to_github_releases_repo(repo_conf, release_infos, global_gh_token): - repo = repo_conf.get("repo") - if not repo: + projectUrl = repo_conf.get("projectUrl") + if not projectUrl: logging.warning( _( "One of the 'github_releases' config items is missing the " - "'repo' value. skipping ..." + "'projectUrl' value. skipping ..." ) ) return @@ -1197,12 +1197,14 @@ def upload_to_github_releases_repo(repo_conf, release_infos, global_gh_token): ) ) return - packages = repo_conf.get("packages", []) - if not packages: + conf_package_names = repo_conf.get("packageNames", []) + if type(conf_package_names) == str: + conf_package_names = [conf_package_names] + if not conf_package_names: logging.warning( _( "One of the 'github_releases' config itmes is missing the " - "'packages' value. skipping ..." + "'packageNames' value. skipping ..." ) ) return @@ -1210,11 +1212,11 @@ def upload_to_github_releases_repo(repo_conf, release_infos, global_gh_token): # lookup all versionNames (git tags) for all packages available in the # local fdroid repo all_local_versions = set() - for package_name in repo_conf['packages']: + for package_name in conf_package_names: for version in release_infos.get(package_name, {}).keys(): all_local_versions.add(version) - gh = fdroidserver.github.GithubApi(token, repo) + gh = fdroidserver.github.GithubApi(token, projectUrl) unreleased_tags = gh.list_unreleased_tags() for version in all_local_versions: @@ -1223,20 +1225,22 @@ def upload_to_github_releases_repo(repo_conf, release_infos, global_gh_token): # is set. (releaseChannels usually mean it's e.g. an alpha or beta # version) if ( - not release_infos.get(packages[0], {}) + not release_infos.get(conf_package_names[0], {}) .get(version, {}) .get('hasReleaseChannels') ): # collect files associated with this github release files = [] - for package in packages: + for package in conf_package_names: files.extend( release_infos.get(package, {}).get(version, {}).get('files', []) ) # always use the whatsNew text from the first app listed in - # config.qml github_releases.packages + # config.yml github_releases.packageNames text = ( - release_infos.get(packages[0], {}).get(version, {}).get('whatsNew') + release_infos.get(conf_package_names[0], {}) + .get(version, {}) + .get('whatsNew') or '' ) if 'release_notes_prepend' in repo_conf: @@ -1330,7 +1334,8 @@ def main(): logging.warning( _('No option set! Edit your config.yml to set at least one of these:') + '\nserverwebroot, servergitmirrors, local_copy_dir, awsbucket, ' - + 'virustotal_apikey, androidobservatory, or binary_transparency_remote' + + 'virustotal_apikey, androidobservatory, github_releases ' + + 'or binary_transparency_remote' ) sys.exit(1) diff --git a/fdroidserver/github.py b/fdroidserver/github.py index d72e9bb0..c522f522 100644 --- a/fdroidserver/github.py +++ b/fdroidserver/github.py @@ -33,7 +33,10 @@ class GithubApi: def __init__(self, api_token, repo_path): self._api_token = api_token - self._repo_path = repo_path + if repo_path.startswith("https://github.com/"): + self._repo_path = repo_path[19:] + else: + self._repo_path = repo_path def _req(self, url, data=None): h = { diff --git a/tests/deploy.TestCase b/tests/deploy.TestCase index 2db73a02..3d45625d 100755 --- a/tests/deploy.TestCase +++ b/tests/deploy.TestCase @@ -1313,12 +1313,12 @@ class GitHubReleasesTest(unittest.TestCase): def test_upload_to_github_releases(self): gh_config = [ { - "repo": "example/app", - "packages": ["com.example.app", "another.app"], + "projectUrl": "https://github.com/example/app", + "packageNames": ["com.example.app", "another.app"], }, { - "repo": "custom/app", - "packages": ["more.custom.app"], + "projectUrl": "https://github.com/custom/app", + "packageNames": ["more.custom.app"], "token": "custom_token", }, ] @@ -1343,21 +1343,22 @@ class GitHubReleasesTest(unittest.TestCase): ["com.example.app", "another.app", "more.custom.app"], ) + self.maxDiff = None self.assertListEqual( urr_mock.call_args_list, [ unittest.mock.call( { - "repo": "example/app", - "packages": ["com.example.app", "another.app"], + "projectUrl": "https://github.com/example/app", + "packageNames": ["com.example.app", "another.app"], }, "fri_result", "fake_global_token", ), unittest.mock.call( { - "repo": "custom/app", - "packages": ["more.custom.app"], + "projectUrl": "https://github.com/custom/app", + "packageNames": ["more.custom.app"], "token": "custom_token", }, "fri_result", @@ -1370,8 +1371,8 @@ class GitHubReleasesTest(unittest.TestCase): class Test_UploadToGithubReleasesRepo(unittest.TestCase): def setUp(self): self.repo_conf = { - "repo": "example/app", - "packages": ["com.example.app", "com.example.altapp", "another.app"], + "projectUrl": "https://github.com/example/app", + "packageNames": ["com.example.app", "com.example.altapp", "another.app"], } self.release_infos = { "com.example.app": { @@ -1414,7 +1415,9 @@ class Test_UploadToGithubReleasesRepo(unittest.TestCase): "global_token", ) - self.api_constructor.assert_called_once_with("global_token", "example/app") + self.api_constructor.assert_called_once_with( + "global_token", "https://github.com/example/app" + ) self.assertListEqual( self.api.create_release.call_args_list, @@ -1441,7 +1444,9 @@ class Test_UploadToGithubReleasesRepo(unittest.TestCase): "global_token", ) - self.api_constructor.assert_called_once_with("local_token", "example/app") + self.api_constructor.assert_called_once_with( + "local_token", "https://github.com/example/app" + ) self.assertListEqual( self.api.create_release.call_args_list, From 034e83bfcaf2c489000c38cc77c6644e58c4496d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 11 Jun 2024 20:06:00 +0200 Subject: [PATCH 1538/2116] deploy: complete index-only support for awsbucket: --- fdroidserver/deploy.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 8d2b5dca..97f857df 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -1367,7 +1367,8 @@ def main(): # update_servergitmirrors will take care of multiple mirrors so don't need a foreach update_servergitmirrors(config['servergitmirrors'], repo_section) if config.get('awsbucket'): - update_awsbucket(repo_section, options.verbose, options.quiet) + index_only = config.get('awsbucket_index_only') + update_awsbucket(repo_section, index_only, options.verbose, options.quiet) if config.get('androidobservatory'): upload_to_android_observatory(repo_section) if config.get('virustotal_apikey'): From fbb6772e376c46834a98541fd51343a1e98446f8 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 11 Jun 2024 20:12:46 +0200 Subject: [PATCH 1539/2116] always use GitLab Pages, not Artifacts, with index-only mode If the repo is too large, then it'll hit the GitLab Pages limit. That is basically impossible in index-only mode, so it should always use Pages. --- fdroidserver/deploy.py | 5 ++++- fdroidserver/index.py | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 97f857df..d84b4c77 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -797,7 +797,10 @@ def upload_to_servergitmirror( local_repo.index.commit("fdroidserver git-mirror") # only deploy to GitLab Artifacts if too big for GitLab Pages - if common.get_dir_size(fdroid_dir) <= common.GITLAB_COM_PAGES_MAX_SIZE: + if ( + is_index_only + or common.get_dir_size(fdroid_dir) <= common.GITLAB_COM_PAGES_MAX_SIZE + ): gitlab_ci_job_name = 'pages' else: gitlab_ci_job_name = 'GitLab Artifacts' diff --git a/fdroidserver/index.py b/fdroidserver/index.py index fc1b663c..3fe533bd 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -1534,7 +1534,10 @@ def get_mirror_service_urls(mirror): urls.append('/'.join(segments)) elif hostname == "gitlab.com": git_mirror_path = os.path.join('git-mirror', folder) - if common.get_dir_size(git_mirror_path) <= common.GITLAB_COM_PAGES_MAX_SIZE: + if ( + mirror.get('index_only') + or common.get_dir_size(git_mirror_path) <= common.GITLAB_COM_PAGES_MAX_SIZE + ): # Gitlab-like Pages segments "https://user.gitlab.io/repo/folder" gitlab_pages = ["https:", "", user + ".gitlab.io", repo, folder] urls.append('/'.join(gitlab_pages)) From d1856bea26c9af823a3a0e977e9ec544154012c4 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 10 Jul 2024 14:57:54 +0800 Subject: [PATCH 1540/2116] Prune origin before fetch --- fdroidserver/common.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 252ecdfb..628067ae 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1390,12 +1390,9 @@ class vcs_git(vcs): raise VCSException(_("Git clean failed"), p.output) if not self.refreshed: # Get latest commits and tags from remote - p = self.git(['fetch', 'origin'], cwd=self.local) + p = self.git(['fetch', '--prune', '--prune-tags', '--force', 'origin'], cwd=self.local) if p.returncode != 0: raise VCSException(_("Git fetch failed"), p.output) - p = self.git(['remote', 'prune', 'origin'], output=False, cwd=self.local) - if p.returncode != 0: - raise VCSException(_("Git prune failed"), p.output) p = self.git(['fetch', '--prune', '--tags', '--force', 'origin'], output=False, cwd=self.local) if p.returncode != 0: raise VCSException(_("Git fetch failed"), p.output) From ecd980f36649e4cfdeba5ba9e2d1f1b80e4fcce3 Mon Sep 17 00:00:00 2001 From: StellarSand Date: Thu, 18 Jul 2024 02:23:45 +0000 Subject: [PATCH 1541/2116] gradle 8.9 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 77ff805c..00dcb8aa 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -201,6 +201,7 @@ get_sha() { '8.6') echo '9631d53cf3e74bfa726893aee1f8994fee4e060c401335946dba2156f440f24c' ;; '8.7') echo '544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d' ;; '8.8') echo 'a4b4158601f8636cdeeab09bd76afb640030bb5b144aafe261a5e8af027dc612' ;; + '8.9') echo 'd725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab' ;; *) exit 1 esac } @@ -221,7 +222,7 @@ d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 d_plugin_min_gradle_v=(8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From e1aaa3ce930cf15e7697060e178cd48bece039a4 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Sat, 13 Jul 2024 19:05:57 +0200 Subject: [PATCH 1542/2116] Replace unmaintained appdirs by platformdirs https://github.com/ActiveState/appdirs/commit/8734277956c1df3b85385e6b308e954910533884 --- fdroidserver/common.py | 8 ++++---- setup.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 628067ae..87e26d3e 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -133,17 +133,17 @@ orig_path = None def get_default_cachedir(): - """Get a cachedir, using appdirs for cross-platform, but works without. + """Get a cachedir, using platformdirs for cross-platform, but works without. - Once appdirs is installed everywhere, this function can be + Once platformdirs is installed everywhere, this function can be removed. """ appname = __name__.split('.')[0] try: - import appdirs + import platformdirs - return appdirs.user_cache_dir(appname, 'F-Droid') + return platformdirs.user_cache_dir(appname, 'F-Droid') except ImportError: return str(Path.home() / '.cache' / appname) diff --git a/setup.py b/setup.py index 64b59ecf..e421bd15 100755 --- a/setup.py +++ b/setup.py @@ -91,7 +91,7 @@ setup( 'babel', ], install_requires=[ - 'appdirs', + 'platformdirs', 'androguard >= 3.3.5', 'asn1crypto', 'clint', From 8cf4503a00f6e0ccb93f5a9089cf660f20b0045b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Wed, 15 May 2024 16:52:52 +0200 Subject: [PATCH 1543/2116] =?UTF-8?q?=F0=9F=90=9C=20scanner:=20fix=20Scann?= =?UTF-8?q?erTool=20init=20crash?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When scanner.py::ScannerTool is instatiated but the calling code was started by a call to e.g. `build.py` ScannerTool will crash. This change makes it so that ScannerTool will intializes with a default value instead of crashing when triging to access a non existen cli argument. also see https://gitlab.com/fdroid/fdroidserver/-/issues/1212 --- fdroidserver/scanner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index fc9ef13a..bc6e579d 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -332,7 +332,7 @@ class ScannerTool: self.scanner_data_lookup() options = common.get_options() - options_refresh_scanner = options and options.refresh_scanner + options_refresh_scanner = hasattr(options, "refresh_scanner") and options.refresh_scanner if options_refresh_scanner or common.get_config().get('refresh_scanner'): self.refresh() From 0edc73270501aed0e61413cfabaac515add28338 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 25 Jul 2024 10:45:27 +0200 Subject: [PATCH 1544/2116] Support UpdateCheckName in dirs_with_manifest Closes: #1155 --- fdroidserver/checkupdates.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 358a6e70..7f2293f3 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -406,7 +406,7 @@ def possible_subdirs(app: metadata.App): for d in dirs_with_manifest(build_dir): m_paths = common.manifest_paths(d, last_build.gradle) package = common.parse_androidmanifests(m_paths, app)[2] - if package is not None: + if package is not None or app.UpdateCheckName == "Ignore": subdir = d.relative_to(build_dir) logging.debug("Adding possible subdir %s" % subdir) yield subdir From 19aef075b4c9e50f15cb5a76d5923675751e8be0 Mon Sep 17 00:00:00 2001 From: g0t mi1k Date: Mon, 12 Aug 2024 09:17:00 +0100 Subject: [PATCH 1545/2116] Drop --reset-server --- completion/bash-completion | 2 +- fdroidserver/build.py | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/completion/bash-completion b/completion/bash-completion index 940b188b..810355a0 100644 --- a/completion/bash-completion +++ b/completion/bash-completion @@ -83,7 +83,7 @@ __complete_options() { __complete_build() { opts="-v -q -l -s -t -f -a" - lopts="--verbose --quiet --latest --stop --test --server --reset-server --skip-scan --scan-binary --no-tarball --force --all --no-refresh" + lopts="--verbose --quiet --latest --stop --test --server --skip-scan --scan-binary --no-tarball --force --all --no-refresh" case "${prev}" in :) __vercode diff --git a/fdroidserver/build.py b/fdroidserver/build.py index a1fc2ff3..42a58282 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -989,8 +989,6 @@ def parse_commandline(): help=_("Test mode - put output in the tmp directory only, and always build, even if the output already exists.")) parser.add_argument("--server", action="store_true", default=False, help=_("Use build server")) - parser.add_argument("--reset-server", action="store_true", default=False, - help=_("Reset and create a brand new build server, even if the existing one appears to be ok.")) # this option is internal API for telling fdroid that # it's running inside a buildserver vm. parser.add_argument("--on-server", dest="onserver", action="store_true", default=False, @@ -1080,8 +1078,6 @@ def main(): if config['build_server_always']: options.server = True - if options.reset_server and not options.server: - parser.error("option %s: Using --reset-server without --server makes no sense" % "reset-server") log_dir = 'logs' if not os.path.isdir(log_dir): From 170b6d4648141685031fb70e39ef0a9bede7aef6 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Thu, 15 Aug 2024 15:47:52 +0000 Subject: [PATCH 1546/2116] gradle v8.10 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 00dcb8aa..f2db3d49 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -202,6 +202,7 @@ get_sha() { '8.7') echo '544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d' ;; '8.8') echo 'a4b4158601f8636cdeeab09bd76afb640030bb5b144aafe261a5e8af027dc612' ;; '8.9') echo 'd725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab' ;; + '8.10') echo '5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a' ;; *) exit 1 esac } @@ -222,7 +223,7 @@ d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 d_plugin_min_gradle_v=(8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From d9aab228e2d26ded836c88ae1d3c0a05ce1adb2f Mon Sep 17 00:00:00 2001 From: WrenIX Date: Wed, 28 Aug 2024 23:56:55 +0200 Subject: [PATCH 1547/2116] fix(nightly): workaround for broken os.walk and more logging --- fdroidserver/nightly.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 9c2c7175..04c43cb7 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -430,7 +430,22 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, config = common.read_config() common.assert_config_keystore(config) + logging.debug( + _('Run over {cibase} to find -debug.apk. PS: repo_basedir is {repo_basedir}').format( + cibase=cibase, + repo_basedir=repo_basedir + ) + ) + for root, dirs, files in os.walk(cibase): + if root.startswith(repo_basedir): + logging.error( + _('Broken dirs.remove.d(d): {root} is part of {repo_basedir} and should not be scanned').format( + root=root, + repo_basedir=repo_basedir + ) + ) + continue for d in dirs: if d == '.git' or d == '.gradle' or (d == 'fdroid' and root == cibase): dirs.remove(d) From d1d1eb4c53adb490662925c083bf81feed6e760f Mon Sep 17 00:00:00 2001 From: WrenIX Date: Thu, 29 Aug 2024 09:58:27 +0200 Subject: [PATCH 1548/2116] chore(nightly): improve log messages --- fdroidserver/nightly.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 04c43cb7..0f623580 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -431,7 +431,7 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, common.assert_config_keystore(config) logging.debug( - _('Run over {cibase} to find -debug.apk. PS: repo_basedir is {repo_basedir}').format( + _('Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}').format( cibase=cibase, repo_basedir=repo_basedir ) @@ -440,7 +440,7 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, for root, dirs, files in os.walk(cibase): if root.startswith(repo_basedir): logging.error( - _('Broken dirs.remove.d(d): {root} is part of {repo_basedir} and should not be scanned').format( + _('Broken dirs.remove(d): {root} is part of {repo_basedir} and should not be scanned').format( root=root, repo_basedir=repo_basedir ) From 3782eddc4d5a7ff719f9e8b5bb06ec612bbd5dc2 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 7 Aug 2024 13:00:19 +0800 Subject: [PATCH 1549/2116] Add ruff rule --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 92f5b8f3..805176d2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -141,3 +141,6 @@ max-nested-blocks = 5 [tool.pylint.format] # Maximum number of characters on a single line. max-line-length = 88 + +[tool.ruff.format] +quote-style = "preserve" From c3644464ff92df7fb4491a84a7f6607c87fbd549 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 7 Aug 2024 13:00:26 +0800 Subject: [PATCH 1550/2116] scanner.py: format --- fdroidserver/scanner.py | 334 ++++++++++++++++++++++++++-------------- 1 file changed, 215 insertions(+), 119 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index bc6e579d..ce09499b 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -16,29 +16,26 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import imghdr +import itertools +import json +import logging import os import re import sys -import json -import imghdr -import logging -import zipfile -import itertools import traceback import urllib.parse import urllib.request +import zipfile from argparse import ArgumentParser -from tempfile import TemporaryDirectory -from pathlib import Path -from datetime import datetime, timedelta from dataclasses import dataclass, field, fields +from datetime import datetime, timedelta from enum import IntEnum +from pathlib import Path +from tempfile import TemporaryDirectory -from . import _ -from . import common -from . import metadata -from .exception import BuildException, VCSException, ConfigurationException -from . import scanner +from . import _, common, metadata, scanner +from .exception import BuildException, ConfigurationException, VCSException @dataclass @@ -48,8 +45,10 @@ class MessageStore: errors: list = field(default_factory=list) -MAVEN_URL_REGEX = re.compile(r"""\smaven\s*(?:{.*?(?:setUrl|url)|\(\s*(?:url)?)\s*=?\s*(?:uri|URI|Uri\.create)?\(?\s*["']?([^\s"']+)["']?[^})]*[)}]""", - re.DOTALL) +MAVEN_URL_REGEX = re.compile( + r"""\smaven\s*(?:{.*?(?:setUrl|url)|\(\s*(?:url)?)\s*=?\s*(?:uri|URI|Uri\.create)?\(?\s*["']?([^\s"']+)["']?[^})]*[)}]""", + re.DOTALL, +) SCANNER_CACHE_VERSION = 1 @@ -60,21 +59,25 @@ class ExitCode(IntEnum): def get_gradle_compile_commands(build): - compileCommands = ['api', - 'apk', - 'classpath', - 'compile', - 'compileOnly', - 'id', - 'implementation', - 'provided', - 'runtimeOnly'] + compileCommands = [ + 'api', + 'apk', + 'classpath', + 'compile', + 'compileOnly', + 'id', + 'implementation', + 'provided', + 'runtimeOnly', + ] buildTypes = ['', 'release'] flavors = [''] if build.gradle and build.gradle != ['yes']: flavors += build.gradle - commands = [''.join(c) for c in itertools.product(flavors, buildTypes, compileCommands)] + commands = [ + ''.join(c) for c in itertools.product(flavors, buildTypes, compileCommands) + ] return [re.compile(r'\s*' + c, re.IGNORECASE) for c in commands] @@ -115,7 +118,9 @@ def get_embedded_classes(apkfile, depth=0): ["dexdump", '{}/{}'.format(tmp_dir, info.filename)], output=False, ) - classes = classes.union(set(re.findall(r'[A-Z]+((?:\w+\/)+\w+)', run.output))) + classes = classes.union( + set(re.findall(r'[A-Z]+((?:\w+\/)+\w+)', run.output)) + ) except zipfile.BadZipFile as ex: return {_('Problem with ZIP file: %s, error %s') % (apkfile, ex)} @@ -191,9 +196,11 @@ class SignatureDataController: raise SignatureDataMalformedException() from e delta = (last_updated + self.cache_duration) - scanner._datetime_now() if delta > timedelta(seconds=0): - logging.debug(_('next {name} cache update due in {time}').format( - name=self.filename, time=delta - )) + logging.debug( + _('next {name} cache update due in {time}').format( + name=self.filename, time=delta + ) + ) else: raise SignatureDataOutdatedException() @@ -202,7 +209,9 @@ class SignatureDataController: self.fetch_signatures_from_web() self.write_to_cache() except Exception as e: - raise Exception(_("downloading scanner signatures from '{}' failed").format(self.url)) from e + raise Exception( + _("downloading scanner signatures from '{}' failed").format(self.url) + ) from e def load(self): try: @@ -215,10 +224,17 @@ class SignatureDataController: except (SignatureDataOutdatedException, SignatureDataNoDefaultsException): self.fetch_signatures_from_web() self.write_to_cache() - except (SignatureDataMalformedException, SignatureDataVersionMismatchException) as e: - logging.critical(_("scanner cache is malformed! You can clear it with: '{clear}'").format( - clear='rm -r {}'.format(common.get_config()['cachedir_scanner']) - )) + except ( + SignatureDataMalformedException, + SignatureDataVersionMismatchException, + ) as e: + logging.critical( + _( + "scanner cache is malformed! You can clear it with: '{clear}'" + ).format( + clear='rm -r {}'.format(common.get_config()['cachedir_scanner']) + ) + ) raise e def load_from_defaults(self): @@ -244,7 +260,13 @@ class SignatureDataController: Right now this function does just a basic key sanitation. """ self.check_data_version() - valid_keys = ['timestamp', 'last_updated', 'version', 'signatures', 'cache_duration'] + valid_keys = [ + 'timestamp', + 'last_updated', + 'version', + 'signatures', + 'cache_duration', + ] for k in list(self.data.keys()): if k not in valid_keys: @@ -266,7 +288,11 @@ class SignatureDataController: class ExodusSignatureDataController(SignatureDataController): def __init__(self): - super().__init__('Exodus signatures', 'exodus.json', 'https://reports.exodus-privacy.eu.org/api/trackers') + super().__init__( + 'Exodus signatures', + 'exodus.json', + 'https://reports.exodus-privacy.eu.org/api/trackers', + ) self.cache_duration = timedelta(days=1) # refresh exodus cache after one day self.has_trackers_json_key = True @@ -294,11 +320,11 @@ class ExodusSignatureDataController(SignatureDataController): # exodus also provides network signatures, unused atm. # "network_signatures": [tracker["network_signature"]], "AntiFeatures": ["Tracking"], # TODO - "license": "NonFree" # We assume all trackers in exodus - # are non-free, although free - # trackers like piwik, acra, - # etc. might be listed by exodus - # too. + "license": "NonFree", # We assume all trackers in exodus + # are non-free, although free + # trackers like piwik, acra, + # etc. might be listed by exodus + # too. } self.set_data(data) @@ -315,9 +341,7 @@ class EtipSignatureDataController(ExodusSignatureDataController): class SUSSDataController(SignatureDataController): def __init__(self): super().__init__( - 'SUSS', - 'suss.json', - 'https://fdroid.gitlab.io/fdroid-suss/suss.json' + 'SUSS', 'suss.json', 'https://fdroid.gitlab.io/fdroid-suss/suss.json' ) def load_from_defaults(self): @@ -332,7 +356,9 @@ class ScannerTool: self.scanner_data_lookup() options = common.get_options() - options_refresh_scanner = hasattr(options, "refresh_scanner") and options.refresh_scanner + options_refresh_scanner = ( + hasattr(options, "refresh_scanner") and options.refresh_scanner + ) if options_refresh_scanner or common.get_config().get('refresh_scanner'): self.refresh() @@ -342,8 +368,9 @@ class ScannerTool: def scanner_data_lookup(self): sigsources = common.get_config().get('scanner_signature_sources', []) logging.debug( - "scanner is configured to use signature data from: '{}'" - .format("', '".join(sigsources)) + "scanner is configured to use signature data from: '{}'".format( + "', '".join(sigsources) + ) ) self.sdcs = [] for i, source_url in enumerate(sigsources): @@ -361,11 +388,13 @@ class ScannerTool: "Has to be a valid HTTPS-URL or match a predefined " "constants: 'suss', 'exodus'".format(source_url) ) - self.sdcs.append(SignatureDataController( - source_url, - '{}_{}'.format(i, os.path.basename(u.path)), - source_url, - )) + self.sdcs.append( + SignatureDataController( + source_url, + '{}_{}'.format(i, os.path.basename(u.path)), + source_url, + ) + ) def load(self): for sdc in self.sdcs: @@ -381,13 +410,21 @@ class ScannerTool: for sdc in self.sdcs: for signame, sigdef in sdc.data.get('signatures', {}).items(): for sig in sigdef.get('code_signatures', []): - self.regexs['err_code_signatures'][sig] = re.compile('.*' + sig, re.IGNORECASE) + self.regexs['err_code_signatures'][sig] = re.compile( + '.*' + sig, re.IGNORECASE + ) for sig in sigdef.get('gradle_signatures', []): - self.regexs['err_gradle_signatures'][sig] = re.compile('.*' + sig, re.IGNORECASE) + self.regexs['err_gradle_signatures'][sig] = re.compile( + '.*' + sig, re.IGNORECASE + ) for sig in sigdef.get('warn_code_signatures', []): - self.regexs['warn_code_signatures'][sig] = re.compile('.*' + sig, re.IGNORECASE) + self.regexs['warn_code_signatures'][sig] = re.compile( + '.*' + sig, re.IGNORECASE + ) for sig in sigdef.get('warn_gradle_signatures', []): - self.regexs['warn_gradle_signatures'][sig] = re.compile('.*' + sig, re.IGNORECASE) + self.regexs['warn_gradle_signatures'][sig] = re.compile( + '.*' + sig, re.IGNORECASE + ) def refresh(self): for sdc in self.sdcs: @@ -430,9 +467,17 @@ def scan_binary(apkfile): logging.debug("Problem: found class '%s'" % classname) problems += 1 if warnings: - logging.warning(_("Found {count} warnings in {filename}").format(count=warnings, filename=apkfile)) + logging.warning( + _("Found {count} warnings in {filename}").format( + count=warnings, filename=apkfile + ) + ) if problems: - logging.critical(_("Found {count} problems in {filename}").format(count=problems, filename=apkfile)) + logging.critical( + _("Found {count} problems in {filename}").format( + count=problems, filename=apkfile + ) + ) return problems @@ -453,31 +498,38 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): if r.match(s): yield n - allowed_repos = [re.compile(r'^https://' + re.escape(repo) + r'/*') for repo in [ - 'repo1.maven.org/maven2', # mavenCentral() - 'jcenter.bintray.com', # jcenter() - 'jitpack.io', - 'www.jitpack.io', - 'repo.maven.apache.org/maven2', - 'oss.jfrog.org/artifactory/oss-snapshot-local', - 'oss.sonatype.org/content/repositories/snapshots', - 'oss.sonatype.org/content/repositories/releases', - 'oss.sonatype.org/content/groups/public', - 'oss.sonatype.org/service/local/staging/deploy/maven2', - 's01.oss.sonatype.org/content/repositories/snapshots', - 's01.oss.sonatype.org/content/repositories/releases', - 's01.oss.sonatype.org/content/groups/public', - 's01.oss.sonatype.org/service/local/staging/deploy/maven2', - 'clojars.org/repo', # Clojure free software libs - 'repo.clojars.org', # Clojure free software libs - 's3.amazonaws.com/repo.commonsware.com', # CommonsWare - 'plugins.gradle.org/m2', # Gradle plugin repo - 'maven.google.com', # Google Maven Repo, https://developer.android.com/studio/build/dependencies.html#google-maven + allowed_repos = ( + [ + re.compile(r'^https://' + re.escape(repo) + r'/*') + for repo in [ + 'repo1.maven.org/maven2', # mavenCentral() + 'jcenter.bintray.com', # jcenter() + 'jitpack.io', + 'www.jitpack.io', + 'repo.maven.apache.org/maven2', + 'oss.jfrog.org/artifactory/oss-snapshot-local', + 'oss.sonatype.org/content/repositories/snapshots', + 'oss.sonatype.org/content/repositories/releases', + 'oss.sonatype.org/content/groups/public', + 'oss.sonatype.org/service/local/staging/deploy/maven2', + 's01.oss.sonatype.org/content/repositories/snapshots', + 's01.oss.sonatype.org/content/repositories/releases', + 's01.oss.sonatype.org/content/groups/public', + 's01.oss.sonatype.org/service/local/staging/deploy/maven2', + 'clojars.org/repo', # Clojure free software libs + 'repo.clojars.org', # Clojure free software libs + 's3.amazonaws.com/repo.commonsware.com', # CommonsWare + 'plugins.gradle.org/m2', # Gradle plugin repo + 'maven.google.com', # Google Maven Repo, https://developer.android.com/studio/build/dependencies.html#google-maven + ] ] - ] + [re.compile(r'^file://' + re.escape(repo) + r'/*') for repo in [ - '/usr/share/maven-repo', # local repo on Debian installs + + [ + re.compile(r'^file://' + re.escape(repo) + r'/*') + for repo in [ + '/usr/share/maven-repo', # local repo on Debian installs + ] ] - ] + ) scanignore = common.getpaths_map(build_dir, build.scanignore) scandelete = common.getpaths_map(build_dir, build.scandelete) @@ -515,7 +567,7 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): ------- 0 as we explicitly ignore the file, so don't count an error """ - msg = ('Ignoring %s at %s' % (what, path_in_build_dir)) + msg = 'Ignoring %s at %s' % (what, path_in_build_dir) logging.info(msg) if json_per_build is not None: json_per_build.infos.append([msg, path_in_build_dir]) @@ -537,7 +589,7 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): ------- 0 as we deleted the offending file """ - msg = ('Removing %s at %s' % (what, path_in_build_dir)) + msg = 'Removing %s at %s' % (what, path_in_build_dir) logging.info(msg) if json_per_build is not None: json_per_build.infos.append([msg, path_in_build_dir]) @@ -598,14 +650,16 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): return warnproblem(what, path_in_build_dir, json_per_build) if options and 'json' in vars(options) and options.json: json_per_build.errors.append([what, path_in_build_dir]) - if options and (options.verbose or not ('json' in vars(options) and options.json)): + if options and ( + options.verbose or not ('json' in vars(options) and options.json) + ): logging.error('Found %s at %s' % (what, path_in_build_dir)) return 1 def is_executable(path): return os.path.exists(path) and os.access(path, os.X_OK) - textchars = bytearray({7, 8, 9, 10, 12, 13, 27} | set(range(0x20, 0x100)) - {0x7f}) + textchars = bytearray({7, 8, 9, 10, 12, 13, 27} | set(range(0x20, 0x100)) - {0x7F}) def is_binary(path): d = None @@ -614,9 +668,11 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): return bool(d.translate(None, textchars)) # False positives patterns for files that are binary and executable. - safe_paths = [re.compile(r) for r in [ - r".*/drawable[^/]*/.*\.png$", # png drawables - r".*/mipmap[^/]*/.*\.png$", # png mipmaps + safe_paths = [ + re.compile(r) + for r in [ + r".*/drawable[^/]*/.*\.png$", # png drawables + r".*/mipmap[^/]*/.*\.png$", # png mipmaps ] ] @@ -637,14 +693,12 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): # Iterate through all files in the source code for root, dirs, files in os.walk(build_dir, topdown=True): - # It's topdown, so checking the basename is enough for ignoredir in ('.hg', '.git', '.svn', '.bzr'): if ignoredir in dirs: dirs.remove(ignoredir) for curfile in files: - if curfile in ['.DS_Store']: continue @@ -733,13 +787,17 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): if is_used_by_gradle(line): for name in suspects_found(line): count += handleproblem( - "usual suspect \'%s\'" % (name), + "usual suspect '%s'" % (name), path_in_build_dir, filepath, json_per_build, ) - noncomment_lines = [line for line in lines if not common.gradle_comment.match(line)] - no_comments = re.sub(r'/\*.*?\*/', '', ''.join(noncomment_lines), flags=re.DOTALL) + noncomment_lines = [ + line for line in lines if not common.gradle_comment.match(line) + ] + no_comments = re.sub( + r'/\*.*?\*/', '', ''.join(noncomment_lines), flags=re.DOTALL + ) for url in MAVEN_URL_REGEX.findall(no_comments): if not any(r.match(url) for r in allowed_repos): count += handleproblem( @@ -756,7 +814,9 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): ) elif is_executable(filepath): - if is_binary(filepath) and not (safe_path(path_in_build_dir) or is_image_file(filepath)): + if is_binary(filepath) and not ( + safe_path(path_in_build_dir) or is_image_file(filepath) + ): warnproblem( _('executable binary, possibly code'), path_in_build_dir, @@ -781,15 +841,36 @@ def main(): usage="%(prog)s [options] [(APPID[:VERCODE] | path/to.apk) ...]" ) common.setup_global_opts(parser) - parser.add_argument("appid", nargs='*', help=_("application ID with optional versionCode in the form APPID[:VERCODE]")) - parser.add_argument("-f", "--force", action="store_true", default=False, - help=_("Force scan of disabled apps and builds.")) - parser.add_argument("--json", action="store_true", default=False, - help=_("Output JSON to stdout.")) - parser.add_argument("-r", "--refresh", dest="refresh_scanner", action="store_true", default=False, - help=_("fetch the latest version of signatures from the web")) - parser.add_argument("-e", "--exit-code", action="store_true", default=False, - help=_("Exit with a non-zero code if problems were found")) + parser.add_argument( + "appid", + nargs='*', + help=_("application ID with optional versionCode in the form APPID[:VERCODE]"), + ) + parser.add_argument( + "-f", + "--force", + action="store_true", + default=False, + help=_("Force scan of disabled apps and builds."), + ) + parser.add_argument( + "--json", action="store_true", default=False, help=_("Output JSON to stdout.") + ) + parser.add_argument( + "-r", + "--refresh", + dest="refresh_scanner", + action="store_true", + default=False, + help=_("fetch the latest version of signatures from the web"), + ) + parser.add_argument( + "-e", + "--exit-code", + action="store_true", + default=False, + help=_("Exit with a non-zero code if problems were found"), + ) metadata.add_metadata_arguments(parser) options = common.parse_args(parser) metadata.warnings_action = options.W @@ -840,7 +921,6 @@ def main(): extlib_dir = os.path.join(build_dir, 'extlib') for appid, app in apps.items(): - json_per_appid = dict() if app.Disabled and not options.force: @@ -861,14 +941,20 @@ def main(): # Set up vcs interface and make sure we have the latest code... vcs = common.getvcs(app.RepoType, app.Repo, build_dir) else: - logging.info(_("{appid}: no builds specified, running on current source state") - .format(appid=appid)) + logging.info( + _( + "{appid}: no builds specified, running on current source state" + ).format(appid=appid) + ) json_per_build = MessageStore() json_per_appid['current-source-state'] = json_per_build count = scan_source(build_dir, json_per_build=json_per_build) if count > 0: - logging.warning(_('Scanner found {count} problems in {appid}:') - .format(count=count, appid=appid)) + logging.warning( + _('Scanner found {count} problems in {appid}:').format( + count=count, appid=appid + ) + ) probcount += count app['Builds'] = [] @@ -877,32 +963,42 @@ def main(): json_per_appid[build.versionCode] = json_per_build if build.disable and not options.force: - logging.info("...skipping version %s - %s" % ( - build.versionName, build.get('disable', build.commit[1:]))) + logging.info( + "...skipping version %s - %s" + % (build.versionName, build.get('disable', build.commit[1:])) + ) continue logging.info("...scanning version " + build.versionName) # Prepare the source code... - common.prepare_source(vcs, app, build, - build_dir, srclib_dir, - extlib_dir, False) + common.prepare_source( + vcs, app, build, build_dir, srclib_dir, extlib_dir, False + ) count = scan_source(build_dir, build, json_per_build=json_per_build) if count > 0: - logging.warning(_('Scanner found {count} problems in {appid}:{versionCode}:') - .format(count=count, appid=appid, versionCode=build.versionCode)) + logging.warning( + _( + 'Scanner found {count} problems in {appid}:{versionCode}:' + ).format( + count=count, appid=appid, versionCode=build.versionCode + ) + ) probcount += count except BuildException as be: - logging.warning('Could not scan app %s due to BuildException: %s' % ( - appid, be)) + logging.warning( + 'Could not scan app %s due to BuildException: %s' % (appid, be) + ) probcount += 1 except VCSException as vcse: logging.warning('VCS error while scanning app %s: %s' % (appid, vcse)) probcount += 1 except Exception: - logging.warning('Could not scan app %s due to unknown error: %s' % ( - appid, traceback.format_exc())) + logging.warning( + 'Could not scan app %s due to unknown error: %s' + % (appid, traceback.format_exc()) + ) probcount += 1 for k, v in json_per_appid.items(): From 1d796b734f1cf6a820070348615d8f93b1eb2c10 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 7 Aug 2024 14:37:41 +0800 Subject: [PATCH 1551/2116] scanner: error on dependency files without lock file --- fdroidserver/scanner.py | 17 +++++++++++++++++ tests/scanner.TestCase | 3 ++- tests/source-files/lockfile.test/Cargo.lock | 0 tests/source-files/lockfile.test/Cargo.toml | 0 tests/source-files/lockfile.test/package.json | 0 tests/source-files/lockfile.test/pubspec.yaml | 0 tests/source-files/lockfile.test/yarn.lock | 0 7 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 tests/source-files/lockfile.test/Cargo.lock create mode 100644 tests/source-files/lockfile.test/Cargo.toml create mode 100644 tests/source-files/lockfile.test/package.json create mode 100644 tests/source-files/lockfile.test/pubspec.yaml create mode 100644 tests/source-files/lockfile.test/yarn.lock diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index ce09499b..e881f650 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -50,6 +50,11 @@ MAVEN_URL_REGEX = re.compile( re.DOTALL, ) +DEPFILE = { + "Cargo.toml": ["Cargo.lock"], + "pubspec.yaml": ["pubspec.lock"], + "package.json": ["package.lock", "yarn.lock", "pnpm-lock.yaml"], +} SCANNER_CACHE_VERSION = 1 @@ -813,6 +818,18 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): 'binary', path_in_build_dir, filepath, json_per_build ) + elif curfile in DEPFILE: + for lockfile in DEPFILE[curfile]: + if os.path.isfile(os.path.join(root, lockfile)): + break + else: + count += handleproblem( + _('dependency file without lock'), + path_in_build_dir, + filepath, + json_per_build, + ) + elif is_executable(filepath): if is_binary(filepath) and not ( safe_path(path_in_build_dir) or is_image_file(filepath) diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index c412b32e..89d60402 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -60,7 +60,8 @@ class ScannerTest(unittest.TestCase): 'org.mozilla.rocket': 2, 'org.tasks': 2, 'realm': 1, - 'se.manyver': 2, + 'se.manyver': 3, + 'lockfile.test': 1, } for d in glob.glob(os.path.join(source_files, '*')): build = fdroidserver.metadata.Build() diff --git a/tests/source-files/lockfile.test/Cargo.lock b/tests/source-files/lockfile.test/Cargo.lock new file mode 100644 index 00000000..e69de29b diff --git a/tests/source-files/lockfile.test/Cargo.toml b/tests/source-files/lockfile.test/Cargo.toml new file mode 100644 index 00000000..e69de29b diff --git a/tests/source-files/lockfile.test/package.json b/tests/source-files/lockfile.test/package.json new file mode 100644 index 00000000..e69de29b diff --git a/tests/source-files/lockfile.test/pubspec.yaml b/tests/source-files/lockfile.test/pubspec.yaml new file mode 100644 index 00000000..e69de29b diff --git a/tests/source-files/lockfile.test/yarn.lock b/tests/source-files/lockfile.test/yarn.lock new file mode 100644 index 00000000..e69de29b From 65f768e1cf6346c58885a8628f0f2efd5d8ec16a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 30 Aug 2024 13:47:20 +0200 Subject: [PATCH 1552/2116] black: fdroidserver/scanner.py now complies --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 805176d2..a64bae4e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,7 +43,6 @@ force-exclude = '''( | fdroidserver/metadata\.py | fdroidserver/nightly\.py | fdroidserver/publish\.py - | fdroidserver/scanner\.py | fdroidserver/update\.py | fdroidserver/vmtools\.py | locale/pick-complete-translations\.py From 8884732114d3701a389ab5b70d7c444a771aee45 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sat, 31 Aug 2024 01:47:26 +0800 Subject: [PATCH 1553/2116] scanner.py: skip format on hex literal --- fdroidserver/scanner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index e881f650..79dbf96e 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -664,7 +664,7 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): def is_executable(path): return os.path.exists(path) and os.access(path, os.X_OK) - textchars = bytearray({7, 8, 9, 10, 12, 13, 27} | set(range(0x20, 0x100)) - {0x7F}) + textchars = bytearray({7, 8, 9, 10, 12, 13, 27} | set(range(0x20, 0x100)) - {0x7f}) # fmt: skip def is_binary(path): d = None From 9ccb3b5f0d7a28c695db16c5ced690add0d4e32b Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sat, 31 Aug 2024 02:45:14 +0800 Subject: [PATCH 1554/2116] Remove comment of google mave repo to workground a bug of ruff --- fdroidserver/scanner.py | 57 +++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 79dbf96e..d212d811 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -503,38 +503,35 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): if r.match(s): yield n - allowed_repos = ( - [ - re.compile(r'^https://' + re.escape(repo) + r'/*') - for repo in [ - 'repo1.maven.org/maven2', # mavenCentral() - 'jcenter.bintray.com', # jcenter() - 'jitpack.io', - 'www.jitpack.io', - 'repo.maven.apache.org/maven2', - 'oss.jfrog.org/artifactory/oss-snapshot-local', - 'oss.sonatype.org/content/repositories/snapshots', - 'oss.sonatype.org/content/repositories/releases', - 'oss.sonatype.org/content/groups/public', - 'oss.sonatype.org/service/local/staging/deploy/maven2', - 's01.oss.sonatype.org/content/repositories/snapshots', - 's01.oss.sonatype.org/content/repositories/releases', - 's01.oss.sonatype.org/content/groups/public', - 's01.oss.sonatype.org/service/local/staging/deploy/maven2', - 'clojars.org/repo', # Clojure free software libs - 'repo.clojars.org', # Clojure free software libs - 's3.amazonaws.com/repo.commonsware.com', # CommonsWare - 'plugins.gradle.org/m2', # Gradle plugin repo - 'maven.google.com', # Google Maven Repo, https://developer.android.com/studio/build/dependencies.html#google-maven - ] + allowed_repos = [ + re.compile(r'^https://' + re.escape(repo) + r'/*') + for repo in [ + 'repo1.maven.org/maven2', # mavenCentral() + 'jcenter.bintray.com', # jcenter() + 'jitpack.io', + 'www.jitpack.io', + 'repo.maven.apache.org/maven2', + 'oss.jfrog.org/artifactory/oss-snapshot-local', + 'oss.sonatype.org/content/repositories/snapshots', + 'oss.sonatype.org/content/repositories/releases', + 'oss.sonatype.org/content/groups/public', + 'oss.sonatype.org/service/local/staging/deploy/maven2', + 's01.oss.sonatype.org/content/repositories/snapshots', + 's01.oss.sonatype.org/content/repositories/releases', + 's01.oss.sonatype.org/content/groups/public', + 's01.oss.sonatype.org/service/local/staging/deploy/maven2', + 'clojars.org/repo', # Clojure free software libs + 'repo.clojars.org', # Clojure free software libs + 's3.amazonaws.com/repo.commonsware.com', # CommonsWare + 'plugins.gradle.org/m2', # Gradle plugin repo + 'maven.google.com', # google() ] - + [ - re.compile(r'^file://' + re.escape(repo) + r'/*') - for repo in [ - '/usr/share/maven-repo', # local repo on Debian installs - ] + ] + [ + re.compile(r'^file://' + re.escape(repo) + r'/*') + for repo in [ + '/usr/share/maven-repo', # local repo on Debian installs ] - ) + ] scanignore = common.getpaths_map(build_dir, build.scanignore) scandelete = common.getpaths_map(build_dir, build.scandelete) From ef247bc97a78354be3aa3eb89f1c95c430d3486d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 19 Aug 2024 11:59:43 +0200 Subject: [PATCH 1555/2116] safety: make CVE-2024-5569 just a warning We get these packages from Debian, zipp is not used in production, and its only a DoS. --- .safety-policy.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.safety-policy.yml b/.safety-policy.yml index 73283975..6324a25f 100644 --- a/.safety-policy.yml +++ b/.safety-policy.yml @@ -26,3 +26,6 @@ security: 70612: reason: jinja2 is not used by fdroidserver, nor any dependencies I could find via debtree and pipdeptree. expires: '2026-05-31' + 72132: + reason: We get these packages from Debian, zipp is not used in production, and its only a DoS. + expires: '2026-08-31' From b1084c0b8a66d1279d72ff2094ebee0b42fa8c55 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 29 Aug 2024 14:31:36 +0200 Subject: [PATCH 1556/2116] WIP safety: make CVE-2024-6345 just a warning --- .safety-policy.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.safety-policy.yml b/.safety-policy.yml index 6324a25f..ac6892dd 100644 --- a/.safety-policy.yml +++ b/.safety-policy.yml @@ -29,3 +29,6 @@ security: 72132: reason: We get these packages from Debian, zipp is not used in production, and its only a DoS. expires: '2026-08-31' + 72236: + reason: setuptools comes from Debian + expires: '2026-08-31' From d9e9618c56ee4a359f87a06f7d2b136920d3445d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 30 Aug 2024 12:05:23 +0200 Subject: [PATCH 1557/2116] gitlab-ci: port to Safety 3.x and move to own job https://docs.safetycli.com/safety-docs/installation/gitlab https://docs.safetycli.com/safety-docs/administration/safety-policy-files --- .gitlab-ci.yml | 33 ++++++++++++++++-- .safety-policy.yml | 85 +++++++++++++++++++++++++++++----------------- 2 files changed, 83 insertions(+), 35 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b5d9a246..9f18ce63 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -213,7 +213,7 @@ gradlew-fdroid: # Run all the various linters and static analysis tools. -lint_format_safety_bandit_checks: +lint_format_bandit_checks: image: debian:bookworm-slim variables: LANG: C.UTF-8 @@ -235,7 +235,7 @@ lint_format_safety_bandit_checks: python3-pip python3-yaml shellcheck - - $pip install --break-system-packages bandit safety + - $pip install --break-system-packages bandit - export EXITVALUE=0 - function set_error() { export EXITVALUE=1; printf "\x1b[31mERROR `history|tail -2|head -1|cut -b 6-500`\x1b[0m\n"; } - ./hooks/pre-commit || set_error @@ -244,7 +244,6 @@ lint_format_safety_bandit_checks: -ii --ini .bandit || set_error - - safety check --full-report || set_error - pylint --output-format=colorized --reports=n fdroid makebuildserver @@ -258,6 +257,34 @@ lint_format_safety_bandit_checks: - exit $EXITVALUE +# Check all the dependencies in Debian to mirror production. CVEs are +# generally fixed in the latest versions in pip/pypi.org, so it isn't +# so important to scan that kind of install in CI. +# https://docs.safetycli.com/safety-docs/installation/gitlab +safety: + only: + changes: + - .gitlab-ci.yml + - .safety-policy.yml + - pyproject.toml + - setup.py + image: debian:bookworm-slim + <<: *apt-template + variables: + LANG: C.UTF-8 + script: + - test -n "$SAFETY_API_KEY" || exit 0 + - apt-get install + fdroidserver + python3-biplist + python3-pip + python3-pycountry + - $pip install --break-system-packages . + + - $pip install --break-system-packages safety + - python3 -m safety --key "$SAFETY_API_KEY" --stage cicd scan + + # Run all the various linters and static analysis tools. locales: image: debian:bookworm-slim diff --git a/.safety-policy.yml b/.safety-policy.yml index ac6892dd..cba25ff0 100644 --- a/.safety-policy.yml +++ b/.safety-policy.yml @@ -1,34 +1,55 @@ --- -security: - ignore-vulnerabilities: - 52495: - reason: setuptools comes from Debian - expires: '2025-01-31' - 60350: - reason: GitPython comes from Debian https://security-tracker.debian.org/tracker/CVE-2023-40267 - expires: '2025-01-31' - 60789: - reason: GitPython comes from Debian https://security-tracker.debian.org/tracker/CVE-2023-40590 - expires: '2025-01-31' - 60841: - reason: GitPython comes from Debian https://security-tracker.debian.org/tracker/CVE-2023-41040 - expires: '2025-01-31' - 62044: - reason: "F-Droid doesn't fetch pip dependencies directly from hg/mercurial repositories: https://data.safetycli.com/v/62044/f17/" - expires: '2025-01-31' - 63687: - reason: Only affects Windows https://security-tracker.debian.org/tracker/CVE-2024-22190 - expires: '2026-01-31' - 67599: - reason: Only affects pip when using --extra-index-url, which is never the case in fdroidserver CI. - expires: '2026-05-31' - 70612: - reason: jinja2 is not used by fdroidserver, nor any dependencies I could find via debtree and pipdeptree. - expires: '2026-05-31' - 72132: - reason: We get these packages from Debian, zipp is not used in production, and its only a DoS. - expires: '2026-08-31' - 72236: - reason: setuptools comes from Debian - expires: '2026-08-31' +version: '3.0' + +scanning-settings: + max-depth: 6 + exclude: + +report: + dependency-vulnerabilities: + enabled: true + auto-ignore-in-report: + vulnerabilities: + 52495: + reason: setuptools comes from Debian + expires: '2025-01-31' + 60350: + reason: GitPython comes from Debian https://security-tracker.debian.org/tracker/CVE-2023-40267 + expires: '2025-01-31' + 60789: + reason: GitPython comes from Debian https://security-tracker.debian.org/tracker/CVE-2023-40590 + expires: '2025-01-31' + 60841: + reason: GitPython comes from Debian https://security-tracker.debian.org/tracker/CVE-2023-41040 + expires: '2025-01-31' + 62044: + reason: "F-Droid doesn't fetch pip dependencies directly from hg/mercurial repositories: https://data.safetycli.com/v/62044/f17/" + expires: '2025-01-31' + 63687: + reason: Only affects Windows https://security-tracker.debian.org/tracker/CVE-2024-22190 + expires: '2026-01-31' + 67599: + reason: Only affects pip when using --extra-index-url, which is never the case in fdroidserver CI. + expires: '2026-05-31' + 70612: + reason: jinja2 is not used by fdroidserver, nor any dependencies I could find via debtree and pipdeptree. + expires: '2026-05-31' + 72132: + reason: We get these packages from Debian, zipp is not used in production, and its only a DoS. + expires: '2026-08-31' + 72236: + reason: setuptools comes from Debian + expires: '2026-08-31' + +fail-scan-with-exit-code: + dependency-vulnerabilities: + enabled: true + fail-on-any-of: + cvss-severity: + - critical + - high + - medium + +security-updates: + dependency-vulnerabilities: From 9482ddfbe3641de32f8399c9c5ed1cea11532c49 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sun, 1 Sep 2024 01:27:26 +0800 Subject: [PATCH 1558/2116] scanner: support workspace for lock files --- fdroidserver/scanner.py | 12 +++++++++--- .../.dart_tool/flutter_gen}/pubspec.yaml | 0 .../{Cargo.lock => flutter/pubspec.lock} | 0 .../{Cargo.toml => flutter/pubspec.yaml} | 0 .../lockfile.test/{ => javascript}/package.json | 0 .../lockfile.test/{ => javascript}/yarn.lock | 0 .../lockfile.test/rust/subdir/Cargo.lock | 0 .../lockfile.test/rust/subdir/Cargo.toml | 0 .../rust/subdir/subdir/subdir/Cargo.toml | 0 .../lockfile.test/rust/subdir2/Cargo.toml | 0 10 files changed, 9 insertions(+), 3 deletions(-) rename tests/source-files/lockfile.test/{ => flutter/.dart_tool/flutter_gen}/pubspec.yaml (100%) rename tests/source-files/lockfile.test/{Cargo.lock => flutter/pubspec.lock} (100%) rename tests/source-files/lockfile.test/{Cargo.toml => flutter/pubspec.yaml} (100%) rename tests/source-files/lockfile.test/{ => javascript}/package.json (100%) rename tests/source-files/lockfile.test/{ => javascript}/yarn.lock (100%) create mode 100644 tests/source-files/lockfile.test/rust/subdir/Cargo.lock create mode 100644 tests/source-files/lockfile.test/rust/subdir/Cargo.toml create mode 100644 tests/source-files/lockfile.test/rust/subdir/subdir/subdir/Cargo.toml create mode 100644 tests/source-files/lockfile.test/rust/subdir2/Cargo.toml diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index d212d811..573df30d 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -816,9 +816,15 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): ) elif curfile in DEPFILE: - for lockfile in DEPFILE[curfile]: - if os.path.isfile(os.path.join(root, lockfile)): - break + d = root + while d.startswith(build_dir): + for lockfile in DEPFILE[curfile]: + if os.path.isfile(os.path.join(d, lockfile)): + break + else: + d = os.path.dirname(d) + continue + break else: count += handleproblem( _('dependency file without lock'), diff --git a/tests/source-files/lockfile.test/pubspec.yaml b/tests/source-files/lockfile.test/flutter/.dart_tool/flutter_gen/pubspec.yaml similarity index 100% rename from tests/source-files/lockfile.test/pubspec.yaml rename to tests/source-files/lockfile.test/flutter/.dart_tool/flutter_gen/pubspec.yaml diff --git a/tests/source-files/lockfile.test/Cargo.lock b/tests/source-files/lockfile.test/flutter/pubspec.lock similarity index 100% rename from tests/source-files/lockfile.test/Cargo.lock rename to tests/source-files/lockfile.test/flutter/pubspec.lock diff --git a/tests/source-files/lockfile.test/Cargo.toml b/tests/source-files/lockfile.test/flutter/pubspec.yaml similarity index 100% rename from tests/source-files/lockfile.test/Cargo.toml rename to tests/source-files/lockfile.test/flutter/pubspec.yaml diff --git a/tests/source-files/lockfile.test/package.json b/tests/source-files/lockfile.test/javascript/package.json similarity index 100% rename from tests/source-files/lockfile.test/package.json rename to tests/source-files/lockfile.test/javascript/package.json diff --git a/tests/source-files/lockfile.test/yarn.lock b/tests/source-files/lockfile.test/javascript/yarn.lock similarity index 100% rename from tests/source-files/lockfile.test/yarn.lock rename to tests/source-files/lockfile.test/javascript/yarn.lock diff --git a/tests/source-files/lockfile.test/rust/subdir/Cargo.lock b/tests/source-files/lockfile.test/rust/subdir/Cargo.lock new file mode 100644 index 00000000..e69de29b diff --git a/tests/source-files/lockfile.test/rust/subdir/Cargo.toml b/tests/source-files/lockfile.test/rust/subdir/Cargo.toml new file mode 100644 index 00000000..e69de29b diff --git a/tests/source-files/lockfile.test/rust/subdir/subdir/subdir/Cargo.toml b/tests/source-files/lockfile.test/rust/subdir/subdir/subdir/Cargo.toml new file mode 100644 index 00000000..e69de29b diff --git a/tests/source-files/lockfile.test/rust/subdir2/Cargo.toml b/tests/source-files/lockfile.test/rust/subdir2/Cargo.toml new file mode 100644 index 00000000..e69de29b From 4e829e2f1951380baac35d3c65adc2f05537263a Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Mon, 2 Sep 2024 17:07:53 +0800 Subject: [PATCH 1559/2116] scanner: fix npm lock file name --- fdroidserver/scanner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 573df30d..cf586f45 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -53,7 +53,7 @@ MAVEN_URL_REGEX = re.compile( DEPFILE = { "Cargo.toml": ["Cargo.lock"], "pubspec.yaml": ["pubspec.lock"], - "package.json": ["package.lock", "yarn.lock", "pnpm-lock.yaml"], + "package.json": ["package-lock.json", "yarn.lock", "pnpm-lock.yaml"], } SCANNER_CACHE_VERSION = 1 From 632959ae350c22446c67146ac1fb299d77dd74e1 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Mon, 2 Sep 2024 17:39:42 +0800 Subject: [PATCH 1560/2116] scanner: fix test The suss rule is updated --- tests/scanner.TestCase | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 89d60402..3127f023 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -54,11 +54,11 @@ class ScannerTest(unittest.TestCase): 'Zillode': 1, 'cn.wildfirechat.chat': 4, 'com.github.shadowsocks': 9, - 'com.integreight.onesheeld': 16, + 'com.integreight.onesheeld': 17, 'com.jens.automation2': 3, 'firebase-suspect': 1, 'org.mozilla.rocket': 2, - 'org.tasks': 2, + 'org.tasks': 3, 'realm': 1, 'se.manyver': 3, 'lockfile.test': 1, From 3a4a4190aa3cce8557c6cb35e716ffed296bc94e Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 4 Sep 2024 22:32:38 +0800 Subject: [PATCH 1561/2116] scanner: add test files into MANIFEST.in --- MANIFEST.in | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/MANIFEST.in b/MANIFEST.in index 8d24dbf2..4022d2e8 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -797,6 +797,14 @@ include tests/source-files/firebase-allowlisted/build.gradle include tests/source-files/firebase-suspect/app/build.gradle include tests/source-files/firebase-suspect/build.gradle include tests/source-files/info.guardianproject.ripple/build.gradle +include tests/source-files/lockfile.test/flutter/pubspec.lock +include tests/source-files/lockfile.test/flutter/pubspec.yaml +include tests/source-files/lockfile.test/javascript/package.json +include tests/source-files/lockfile.test/javascript/yarn.lock +include tests/source-files/lockfile.test/rust/subdir2/Cargo.toml +include tests/source-files/lockfile.test/rust/subdir/Cargo.lock +include tests/source-files/lockfile.test/rust/subdir/Cargo.toml +include tests/source-files/lockfile.test/rust/subdir/subdir/subdir/Cargo.toml include tests/source-files/open-keychain/open-keychain/build.gradle include tests/source-files/open-keychain/open-keychain/OpenKeychain/build.gradle include tests/source-files/org.mozilla.rocket/app/build.gradle From 9b633fb8278faa301f4a2040a480129274a12606 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 4 Sep 2024 23:51:28 +0800 Subject: [PATCH 1562/2116] scanner: fix build_dir type --- fdroidserver/scanner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index cf586f45..4a8065d5 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -817,7 +817,7 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): elif curfile in DEPFILE: d = root - while d.startswith(build_dir): + while d.startswith(str(build_dir)): for lockfile in DEPFILE[curfile]: if os.path.isfile(os.path.join(d, lockfile)): break From debac3fd616a8d715a9dc1b95fa4cb8f57e49484 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Thu, 5 Sep 2024 02:09:55 +0800 Subject: [PATCH 1563/2116] lint.py: format --- fdroidserver/lint.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 1ae42852..77fe21f5 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -16,19 +16,17 @@ # You should have received a copy of the GNU Affero General Public Licen # along with this program. If not, see . -from argparse import ArgumentParser import difflib +import platform import re import sys -import platform -import ruamel.yaml import urllib.parse +from argparse import ArgumentParser from pathlib import Path -from . import _ -from . import common -from . import metadata -from . import rewritemeta +import ruamel.yaml + +from . import _, common, metadata, rewritemeta config = None @@ -588,7 +586,7 @@ def check_app_field_types(app): fieldtype=v.__class__.__name__, ) ) - elif t == metadata.TYPE_STRING and not type(v) in (str, bool, dict): + elif t == metadata.TYPE_STRING and type(v) not in (str, bool, dict): yield ( _( "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" From 0ad2820b6f0e0c0a77c3ab9d09e10d82f99a2d98 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Thu, 5 Sep 2024 02:10:08 +0800 Subject: [PATCH 1564/2116] lint: check config keys --- fdroidserver/lint.py | 36 +++++++++++++++++++++++++++++++++++- tests/lint.TestCase | 18 ++++++++++++++++-- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 77fe21f5..c4568dcb 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -749,6 +749,12 @@ def check_certificate_pinned_binaries(app): def lint_config(arg): path = Path(arg) passed = True + + mirrors_name = f'{common.MIRRORS_CONFIG_NAME}.yml' + config_name = f'{common.CONFIG_CONFIG_NAME}.yml' + categories_name = f'{common.CATEGORIES_CONFIG_NAME}.yml' + antifeatures_name = f'{common.ANTIFEATURES_CONFIG_NAME}.yml' + yamllintresult = common.run_yamllint(path) if yamllintresult: print(yamllintresult) @@ -758,7 +764,7 @@ def lint_config(arg): data = ruamel.yaml.YAML(typ='safe').load(fp) common.config_type_check(arg, data) - if path.name == 'mirrors.yml': + if path.name == mirrors_name: import pycountry valid_country_codes = [c.alpha_2 for c in pycountry.countries] @@ -779,6 +785,34 @@ def lint_config(arg): msg += ' ' msg += _('Did you mean {code}?').format(code=', '.join(sorted(m))) print(msg) + elif path.name in (config_name, categories_name, antifeatures_name): + for key in data: + if path.name == config_name and key not in ('archive', 'repo'): + passed = False + print( + _('ERROR: {key} in {path} is not "archive" or "repo"!').format( + key=key, path=path + ) + ) + allowed_keys = ['name'] + if path.name in [config_name, antifeatures_name]: + allowed_keys.append('description') + # only for source strings currently + if path.parent.name == 'config': + allowed_keys.append('icon') + for subkey in data[key]: + if subkey not in allowed_keys: + passed = False + print( + _( + 'ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!' + ).format( + key=key, + subkey=subkey, + path=path, + allowed_keys=', '.join(allowed_keys), + ) + ) return passed diff --git a/tests/lint.TestCase b/tests/lint.TestCase index 5937aadf..409c807c 100755 --- a/tests/lint.TestCase +++ b/tests/lint.TestCase @@ -4,23 +4,25 @@ import logging import os -import ruamel.yaml import shutil import sys import tempfile import unittest from pathlib import Path +import ruamel.yaml + localmodule = Path(__file__).resolve().parent.parent print('localmodule: ' + str(localmodule)) if localmodule not in sys.path: sys.path.insert(0, str(localmodule)) +from testcommon import mkdtemp, parse_args_for_test + import fdroidserver.common import fdroidserver.lint import fdroidserver.metadata from fdroidserver.common import CATEGORIES_CONFIG_NAME -from testcommon import mkdtemp, parse_args_for_test class LintTest(unittest.TestCase): @@ -437,6 +439,18 @@ class LintTest(unittest.TestCase): with self.assertRaises(TypeError): fdroidserver.lint.lint_config('mirrors.yml') + def test_lint_invalid_config_keys(self): + os.chdir(self.testdir) + Path('config').mkdir() + Path('config/config.yml').write_text('repo:\n invalid_key: test') + self.assertFalse(fdroidserver.lint.lint_config('config/config.yml')) + + def test_lint_invalid_localized_config_keys(self): + os.chdir(self.testdir) + Path('config/en').mkdir(parents=True) + Path('config/en/antiFeatures.yml').write_text('NonFreeNet:\n icon: test.png') + self.assertFalse(fdroidserver.lint.lint_config('config/en/antiFeatures.yml')) + def test_check_certificate_pinned_binaries_empty(self): fdroidserver.common.config = {} app = fdroidserver.metadata.App() From 8e89cf511d8d1ecc18476df98b0b29d6a771480e Mon Sep 17 00:00:00 2001 From: SilentGhost Date: Fri, 6 Sep 2024 15:05:36 +0200 Subject: [PATCH 1565/2116] Correct traversing cibase Partly revert d9aab228 and fix bug introduced in 548f73d9: modifying list that is being iterated over --- fdroidserver/nightly.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 0f623580..1b7251ee 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -438,17 +438,12 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, ) for root, dirs, files in os.walk(cibase): - if root.startswith(repo_basedir): - logging.error( - _('Broken dirs.remove(d): {root} is part of {repo_basedir} and should not be scanned').format( - root=root, - repo_basedir=repo_basedir - ) - ) - continue - for d in dirs: - if d == '.git' or d == '.gradle' or (d == 'fdroid' and root == cibase): + for d in ('.git', '.gradle'): + if d in dirs: dirs.remove(d) + if root == cibase and 'fdroid' in dirs: + dirs.remove('fdroid') + for f in files: if f.endswith('-debug.apk'): apkfilename = os.path.join(root, f) From 3c03fef28f2b2a0f1eb44a800d8374b1ad96145c Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 4 Sep 2024 16:18:13 +0200 Subject: [PATCH 1566/2116] safety: clarify reason to ignore CVE --- .safety-policy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.safety-policy.yml b/.safety-policy.yml index cba25ff0..ea44e7e6 100644 --- a/.safety-policy.yml +++ b/.safety-policy.yml @@ -39,7 +39,7 @@ report: reason: We get these packages from Debian, zipp is not used in production, and its only a DoS. expires: '2026-08-31' 72236: - reason: setuptools comes from Debian + reason: setuptools is not used in production to download or install packages, they come from Debian. expires: '2026-08-31' fail-scan-with-exit-code: From b669ce654d102d94dee6da39ff03582b3503e6c6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 4 Sep 2024 16:09:44 +0200 Subject: [PATCH 1567/2116] gitlab-ci: only trigger safety job if API key is present --- .gitlab-ci.yml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9f18ce63..39ec8223 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -262,18 +262,21 @@ lint_format_bandit_checks: # so important to scan that kind of install in CI. # https://docs.safetycli.com/safety-docs/installation/gitlab safety: - only: - changes: - - .gitlab-ci.yml - - .safety-policy.yml - - pyproject.toml - - setup.py image: debian:bookworm-slim + rules: + # once only:/changes: are ported to rules:, this could be removed: + - if: $CI_PIPELINE_SOURCE == "merge_request_event" + when: never + - if: $CI_PIPELINE_SOURCE == "push" && $SAFETY_API_KEY + changes: + - .gitlab-ci.yml + - .safety-policy.yml + - pyproject.toml + - setup.py <<: *apt-template variables: LANG: C.UTF-8 script: - - test -n "$SAFETY_API_KEY" || exit 0 - apt-get install fdroidserver python3-biplist From c6e8dfd4dd60e24a98c3080bdc26426b15346267 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 4 Sep 2024 15:42:55 +0200 Subject: [PATCH 1568/2116] CONTRIBUTING: specify which Black version for format --- CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 46deed5d..226c0854 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -44,7 +44,8 @@ guidelines: formatted as _black_. Some files are not yet fully in _black_ format (see _pyproject.toml_), our goal is to opportunistically convert the code whenever possible. As of the time of this writing, forcing the code format on all files - would be too disruptive. + would be too disruptive. The officially supported _black_ version is the one + in Debian/stable. * Many of the tests run very fast and can be run interactively in isolation. Some of the essential test cases run slowly because they do things like From a386a6132a2b6c0342522520ea9218ae4c93f31d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 6 Sep 2024 11:18:32 +0200 Subject: [PATCH 1569/2116] README: document how releases work --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 8c895745..3af7b8fb 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,19 @@ package managers. All of the options are documented on the website: https://f-droid.org/docs/Installing_the_Server_and_Repo_Tools +## Releases + +The production setup of _fdroidserver_ for f-droid.org is run directly from the +_master_ branch. This is put into production on an schedule (currently weekly). +So development and testing happens in the branches. We track branches using +merge requests. Therefore, there are many WIP and long-lived merge requests. + +There are also stable releases of _fdroidserver_. This is mostly intended for +running custom repositories, where the build process is separate. It can also +be useful as a simple way to get started contributing packages to _fdroiddata_, +since the stable releases are available in package managers. + + ## Tests To run the full test suite: From 22204f4e07455dba7f9eaada7543cf4183aa0cda Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 6 Sep 2024 11:18:47 +0200 Subject: [PATCH 1570/2116] README: remove obsolete section on buildserver tests --- README.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/README.md b/README.md index 3af7b8fb..adc33128 100644 --- a/README.md +++ b/README.md @@ -88,14 +88,6 @@ locally](https://docs.gitlab.com/runner/commands/README.html#gitlab-runner-exec) like this: `gitlab-runner exec docker ubuntu_lts` -### Buildserver - -The tests for the whole build server setup are entirely separate -because they require at least 200 GB of disk space, and 8 GB of -RAM. These test scripts are in the root of the project, all starting -with _jenkins-_ since they used to be run on https://jenkins.debian.net. - - ## Documentation The API documentation based on the docstrings gets automatically From 773f6e40091e43858f64724868b9b42ae2d53f6e Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Mon, 9 Sep 2024 15:57:11 +0000 Subject: [PATCH 1571/2116] gradle v8.10.1 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index f2db3d49..576fcf98 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -203,6 +203,7 @@ get_sha() { '8.8') echo 'a4b4158601f8636cdeeab09bd76afb640030bb5b144aafe261a5e8af027dc612' ;; '8.9') echo 'd725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab' ;; '8.10') echo '5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a' ;; + '8.10.1') echo '1541fa36599e12857140465f3c91a97409b4512501c26f9631fb113e392c5bd1' ;; *) exit 1 esac } @@ -223,7 +224,7 @@ d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 d_plugin_min_gradle_v=(8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From ac4bf4eb1f3d723b5efa5418f59aecff48e1e067 Mon Sep 17 00:00:00 2001 From: "P.O" Date: Wed, 26 Jun 2024 13:09:12 +0200 Subject: [PATCH 1572/2116] Translated using Weblate: Swedish (sv) by "P.O" Currently translated at 12.6% (70 of 552 strings) Co-authored-by: P.O Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sv/ Translation: F-Droid/F-Droid Server --- locale/sv/LC_MESSAGES/fdroidserver.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index 45816768..08bb0c31 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -4,20 +4,21 @@ # Elias Mårtenson , 2021. # Joel A , 2021. # Kristoffer Grundström , 2021. +# "P.O" , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2021-10-16 13:25+0000\n" -"Last-Translator: Kristoffer Grundström \n" +"PO-Revision-Date: 2023-10-16 12:02+0000\n" +"Last-Translator: \"P.O\" \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 5.1-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -40,7 +41,7 @@ msgstr "\"%s/\" har ingen matchande meta-datafil!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "" +msgstr "\"local_copy_dir\" {path} finns inte!" #: ../fdroidserver/install.py #, python-brace-format @@ -255,7 +256,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "Android APK file" -msgstr "" +msgstr "Android APK-fil" #: ../fdroidserver/scanner.py msgid "Android DEX code" From feb4cd48d3fa9e23f9d9bffd62fabe2eb5b562ba Mon Sep 17 00:00:00 2001 From: PD Date: Wed, 26 Jun 2024 13:09:12 +0200 Subject: [PATCH 1573/2116] Translated using Weblate: Arabic (ar) by PD Currently translated at 4.5% (25 of 552 strings) Translated using Weblate: Arabic (ar) by PD Currently translated at 3.4% (19 of 552 strings) Co-authored-by: PD Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ar/ Translation: F-Droid/F-Droid Server --- locale/ar/LC_MESSAGES/fdroidserver.po | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/locale/ar/LC_MESSAGES/fdroidserver.po b/locale/ar/LC_MESSAGES/fdroidserver.po index 7d1392f3..a4b8e115 100644 --- a/locale/ar/LC_MESSAGES/fdroidserver.po +++ b/locale/ar/LC_MESSAGES/fdroidserver.po @@ -2,20 +2,21 @@ # This file is put in the public domain. # Ahmad0a , 2023. # Rex_sa , 2023. +# PD , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-07-04 06:54+0000\n" -"Last-Translator: Rex_sa \n" +"PO-Revision-Date: 2023-12-19 21:08+0000\n" +"Last-Translator: PD \n" "Language-Team: Arabic \n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 5.0-dev\n" +"X-Generator: Weblate 5.3\n" #: ../fdroidserver/nightly.py msgid "" @@ -2244,11 +2245,11 @@ msgstr "" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" -msgstr "" +msgstr "لا يوجد \"أيقونة\" في {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" -msgstr "" +msgstr "لم يتم توفير ملف APK" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2259,29 +2260,29 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "no version info found!" -msgstr "" +msgstr "لم يتم العثور على معلومات الإصدار!" #: ../fdroidserver/checkupdates.py msgid "no version information found" -msgstr "" +msgstr "لم يتم العثور على معلومات النسخة" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" -msgstr "" +msgstr "غير مسموح به مع الوسيط %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" -msgstr "" +msgstr "أحد الوسائط %s مطلوب" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" -msgstr "" +msgstr "يقبل فقط السلاسل والقوائم والأنساق" #: ../fdroidserver/install.py #, python-format From ad4762a1f2c2a34196db4588869a4cf55654a8b0 Mon Sep 17 00:00:00 2001 From: Issa1553 Date: Wed, 26 Jun 2024 13:09:13 +0200 Subject: [PATCH 1574/2116] Translated using Weblate: Dutch (nl) by Issa1553 Currently translated at 18.4% (102 of 552 strings) Co-authored-by: Issa1553 Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/nl/ Translation: F-Droid/F-Droid Server --- locale/nl/LC_MESSAGES/fdroidserver.po | 173 +++++++++++++------------- 1 file changed, 89 insertions(+), 84 deletions(-) diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index 3b0270d4..d9221ab5 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -3,26 +3,29 @@ # Bart Groeneveld , 2020. # privacysimp , 2021. # Stephan Paternotte , 2023. +# Issa1553 , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-07-24 18:05+0000\n" -"Last-Translator: Stephan Paternotte \n" +"PO-Revision-Date: 2024-01-03 09:07+0000\n" +"Last-Translator: Issa1553 \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.0-dev\n" +"X-Generator: Weblate 5.4-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" +"\n" +"SSH openbare sleutel die gebruikt moet worden als inzetsleutel:" #: ../fdroidserver/nightly.py #, python-brace-format @@ -30,51 +33,53 @@ msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" +"\n" +"{path} gecodeerd voor de DEBUG_KEYSTORE geheime variabele:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" -msgstr "" +msgstr "\"%s/\" heeft geen overeenkomend metadatabestand!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "" +msgstr "\"local_copy_dir\" {path} bestaat niet!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "" +msgstr "\"{apkfilename}\" is al geïnstalleerd op {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" +msgstr "\"{path}\" bevat verouderde {name} ({version})" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" -msgstr "" +msgstr "\"{path}\" bevat recente {name} ({version})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" -msgstr "" +msgstr "\"{path}\" bestaat maar s3cmd is niet geïnstalleerd!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "" +msgstr "\"{path}\" is geen ondersteund bestandsformaat (gebruik: metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "" +msgstr "\"{path}\" is ondertekend door een sleutel die niet is toegestaan:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" -msgstr "" +msgstr "\"{url}\" is geen geldige URL!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -82,8 +87,8 @@ msgstr "" #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(option)s optie vereist %(number)d argument" +msgstr[1] "%(option)s optie vereist %(number)d argumenten" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -95,7 +100,7 @@ msgstr "%(prog)s: fout: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" -msgstr "" +msgstr "%d problemen gevonden" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -113,89 +118,89 @@ msgstr "%r kan niet aangeroepen worden" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" -msgstr "" +msgstr "%s heeft geen dictaat opgeleverd!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" -msgstr "" +msgstr "%s heeft slechte SHA-256: %s" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" -msgstr "" +msgstr "%s is geen geaccepteerd build-veld" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" -msgstr "" +msgstr "%s optie heeft geen waarde" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" -msgstr "" +msgstr "'keypass' niet gevonden in config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" +msgstr "'keystore' is GEEN en 'smartcardoptions' is leeg!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" -msgstr "" +msgstr "'keystore' niet gevonden in config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" -msgstr "" +msgstr "'keystorepass' niet gevonden in config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" -msgstr "" +msgstr "'repo_keyalias' niet gevonden in config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" -msgstr "" +msgstr "'required' is een ongeldig argument voor positionelen" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" -msgstr "" +msgstr "'sdk_path' niet ingesteld in config.yml!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" -msgstr "" +msgstr "{aapt}' is te oud, fdroid vereist build-tools-{version} of nieuwer!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" +msgstr "'{field}' zal in willekeurige volgorde staan! Gebruik () of [] haakjes als de volgorde belangrijk is!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" -msgstr "" +msgstr "{path}' is niet uitgevoerd!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "'{path}' heeft ongeldig formaat, het zou een woordenboek moeten zijn!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" -msgstr "" +msgstr "{value}' is geen geldig {field} in {appid}. Regex patroon: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "" +msgstr "{value}' is geen geldig {field}, moet {pattern} zijn" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" -msgstr "" +msgstr "...checkupdate mislukt voor {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -205,115 +210,115 @@ msgstr ".__call__() niet gedefinieerd" #: ../fdroidserver/lint.py msgid "/issues is missing" -msgstr "" +msgstr "/problemen ontbreekt" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" -msgstr "" +msgstr "Een URL is vereist als argument!" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" -msgstr "" +msgstr "PGP-handtekeningen toevoegen met GnuPG voor pakketten in repo" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" -msgstr "" +msgstr "Een repo-sleutel toevoegen aan een ongetekende repo" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" -msgstr "" +msgstr "Skelet-metagegevensbestanden toevoegen voor APK's die deze missen" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" -msgstr "" +msgstr "Nieuwe repo toevoegen voor alleen {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" -msgstr "" +msgstr "Alias van de repo-sleutel in de sleutelbewaarplaats" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "ToegestaneAPKOndertekenSleutels ontbreekt, maar referentiebinary is geleverd" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" -msgstr "" +msgstr "Staat toe dat een andere revisie (of git tak) wordt opgegeven voor de initiële import" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" -msgstr "" +msgstr "Mirror ook het volledige archiefgedeelte" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" -msgstr "" +msgstr "Waarschuw ook voor opmaakproblemen, zoals herschrijfmeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" -msgstr "" +msgstr "Android AAR-bibliotheek" #: ../fdroidserver/scanner.py msgid "Android APK file" -msgstr "" +msgstr "Android APK-bestand" #: ../fdroidserver/scanner.py msgid "Android DEX code" -msgstr "" +msgstr "Android DEX-code" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "" +msgstr "Android SDK niet gevonden op {path}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" -msgstr "" +msgstr "Android SDK-pad '{path}' bestaat niet!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" -msgstr "" +msgstr "Android SDK-pad '{path}' is geen map!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "" +msgstr "Android SDK-tool {cmd} niet gevonden!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "App heeft binaries maar heeft geen overeenkomstige ToegestaneAPKOndertekenSleutels om certificaat te pinnen." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" +msgstr "App heeft GeenBronSinds of Archiefbeleid \"0 versies\" maar AutoUpdateModus of UpdateCheckModus zijn niet Geen" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" -msgstr "" +msgstr "App staat in '{repo}' maar heeft een link naar {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "App-versie heeft een binaire versie maar heeft geen overeenkomstige ToegestaneAPKOndertekenSleutels om een certificaat vast te pinnen." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" -msgstr "" +msgstr "Het toevoegen van .git is niet nodig" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" -msgstr "" +msgstr "Archivering {apkfilename} met ongeldige handtekening!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." -msgstr "" +msgstr "AutoUpdateModus met UpdateCheckModus: HTTP moet een patroon hebben." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "Slecht entry type \"{mirrortype}\" in spiegels configuratie: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -514,7 +519,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "" +msgstr "APK's en/of OBB's zonder metadata uit de repo verwijderen" #: ../fdroidserver/deploy.py #, python-brace-format @@ -927,7 +932,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" -msgstr "" +msgstr "Gebouwde pakketten installeren op apparaten" #: ../fdroidserver/install.py #, python-format @@ -941,7 +946,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" -msgstr "" +msgstr "Communiceren met de repo HTTP-server" #: ../fdroidserver/update.py msgid "Invalid APK" @@ -1353,11 +1358,11 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" -msgstr "" +msgstr "Snel een nieuw databank starten" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" -msgstr "" +msgstr "Lees alle metagegevensbestanden en sluit af" #: ../fdroidserver/common.py #, python-brace-format @@ -1390,7 +1395,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" -msgstr "" +msgstr "Hernoem APK-bestanden die niet overeenkomen met pakket.naam_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" @@ -1415,7 +1420,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" -msgstr "" +msgstr "Herschrijf alle metadatabestanden" #: ../fdroidserver/rewritemeta.py #, python-brace-format @@ -1450,7 +1455,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" -msgstr "" +msgstr "De broncode van een pakket scannen" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1510,11 +1515,11 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" -msgstr "" +msgstr "Pakketten ondertekenen en in de repo plaatsen" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" -msgstr "" +msgstr "Onderteken indexen die zijn aangemaakt met update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" @@ -1763,11 +1768,11 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" -msgstr "" +msgstr "Repo informatie bijwerken voor nieuwe pakketten" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" -msgstr "" +msgstr "Het binaire transparantielogboek bijwerken voor een URL" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -1884,7 +1889,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" -msgstr "" +msgstr "De integriteit van gedownloade pakketten controleren" #: ../fdroidserver/index.py msgid "Verifying index signature:" @@ -1897,7 +1902,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" -msgstr "" +msgstr "Waarschuwen voor mogelijke metadata fouten" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -1934,14 +1939,14 @@ msgstr "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "" +msgstr "dubbelzinnige optie: %(option)s kan overeenkomen met %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" -msgstr "" +msgstr "dubbelzinnige optie: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" @@ -2255,7 +2260,7 @@ msgstr "" #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" -msgstr "" +msgstr "geen dergelijke optie: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" @@ -2321,14 +2326,14 @@ msgstr "optie -%s vereist een argument" #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" -msgstr "" +msgstr "optie --%s mag geen argument hebben" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" -msgstr "" +msgstr "optie --%s geen uniek voorvoegsel" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py @@ -2342,7 +2347,7 @@ msgstr "optie --%s wordt niet herkend" #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" -msgstr "" +msgstr "optie --%s vereist argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2363,7 +2368,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" -msgstr "" +msgstr "positionele argumenten" #: ../fdroidserver/common.py #, python-brace-format @@ -2455,14 +2460,14 @@ msgstr "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" -msgstr "" +msgstr "de volgende argumenten zijn vereist: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" -msgstr "" +msgstr "onverwachte optiestring: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2476,12 +2481,12 @@ msgstr "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" -msgstr "" +msgstr "onherkende argumenten: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" -msgstr "" +msgstr "Onveilige rechten op '{config_file}' (zou 0600 moeten zijn)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py From dae6e4613719962e79d8b4e78b638b1f3479a840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristoffer=20Grundstr=C3=B6m?= Date: Wed, 26 Jun 2024 13:09:13 +0200 Subject: [PATCH 1575/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Swedi?= =?UTF-8?q?sh=20(sv)=20by=20Kristoffer=20Grundstr=C3=B6m=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 13.0% (72 of 552 strings) Translated using Weblate: Swedish (sv) by Kristoffer Grundström Currently translated at 12.8% (71 of 552 strings) Co-authored-by: Kristoffer Grundström Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sv/ Translation: F-Droid/F-Droid Server --- locale/sv/LC_MESSAGES/fdroidserver.po | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index 08bb0c31..3d7d7684 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -3,28 +3,30 @@ # Hans-Christoph Steiner , 2020. # Elias Mårtenson , 2021. # Joel A , 2021. -# Kristoffer Grundström , 2021. +# Kristoffer Grundström , 2021, 2024. # "P.O" , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-10-16 12:02+0000\n" -"Last-Translator: \"P.O\" \n" +"PO-Revision-Date: 2024-04-24 08:39+0000\n" +"Last-Translator: Kristoffer Grundström \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.1-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" +"\n" +"Offentlig SSH-nyckel som ska användas som distributionsnyckel:" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2032,7 +2034,7 @@ msgstr "" #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" -msgstr "" +msgstr "komplex" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py From b55934d69c0f02d3e1f12f505f7f81455ff781de Mon Sep 17 00:00:00 2001 From: Laachir Date: Wed, 26 Jun 2024 13:09:13 +0200 Subject: [PATCH 1576/2116] Translated using Weblate: Arabic (ar) by Laachir Currently translated at 5.6% (31 of 552 strings) Co-authored-by: Laachir Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ar/ Translation: F-Droid/F-Droid Server --- locale/ar/LC_MESSAGES/fdroidserver.po | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/locale/ar/LC_MESSAGES/fdroidserver.po b/locale/ar/LC_MESSAGES/fdroidserver.po index a4b8e115..3d1dad99 100644 --- a/locale/ar/LC_MESSAGES/fdroidserver.po +++ b/locale/ar/LC_MESSAGES/fdroidserver.po @@ -3,20 +3,21 @@ # Ahmad0a , 2023. # Rex_sa , 2023. # PD , 2023. +# Laachir , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-12-19 21:08+0000\n" -"Last-Translator: PD \n" +"PO-Revision-Date: 2024-01-17 16:52+0000\n" +"Last-Translator: Laachir \n" "Language-Team: Arabic \n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 5.3\n" +"X-Generator: Weblate 5.4-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -108,7 +109,7 @@ msgstr "%prog [خيارات]" #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" -msgstr "" +msgstr "%r غير قابل للإستدعاء" #: ../fdroidserver/signindex.py #, python-format @@ -201,7 +202,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" -msgstr "" +msgstr ".__call__() غير محدد" #: ../fdroidserver/lint.py msgid "/issues is missing" @@ -337,7 +338,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Build a package from source" -msgstr "" +msgstr "بناء الحزمة من المصدر" #: ../fdroidserver/build.py msgid "Build all applications available" @@ -386,7 +387,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" -msgstr "" +msgstr "تحقق من وجود تحديثات للتطبيقات" #: ../fdroidserver/update.py #, python-brace-format @@ -2336,7 +2337,7 @@ msgstr "" #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" -msgstr "" +msgstr "الخيار --%s لم يتم التعرف عليه" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py @@ -2488,7 +2489,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " -msgstr "" +msgstr "الإستخدام: " #: ../fdroidserver/deploy.py #, python-brace-format From d02357093e2935f473a03f32b947dcf8800e9593 Mon Sep 17 00:00:00 2001 From: flac Date: Wed, 26 Jun 2024 13:09:13 +0200 Subject: [PATCH 1577/2116] Translated using Weblate: Belarusian (be) by flac Currently translated at 8.5% (47 of 552 strings) Co-authored-by: flac Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/be/ Translation: F-Droid/F-Droid Server --- locale/be/LC_MESSAGES/fdroidserver.po | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/locale/be/LC_MESSAGES/fdroidserver.po b/locale/be/LC_MESSAGES/fdroidserver.po index b77cb05b..884d50a0 100644 --- a/locale/be/LC_MESSAGES/fdroidserver.po +++ b/locale/be/LC_MESSAGES/fdroidserver.po @@ -1,26 +1,29 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # Макар Разин , 2023. +# flac , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-06-09 18:48+0000\n" -"Last-Translator: Макар Разин \n" +"PO-Revision-Date: 2024-01-21 00:08+0000\n" +"Last-Translator: flac \n" "Language-Team: Belarusian \n" "Language: be\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.18-dev\n" +"X-Generator: Weblate 5.4-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" +"\n" +"публічны ключ SSH будзе ключом разгортвання:" #: ../fdroidserver/nightly.py #, python-brace-format @@ -28,11 +31,13 @@ msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" +"\n" +"файл {path} зашыфраваны для сакрэтнай зменнай DEBUG_KEYSTORE:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" -msgstr "" +msgstr "\"%s/\" не супадае з файлам метаданных!" #: ../fdroidserver/index.py #, python-brace-format @@ -2473,12 +2478,12 @@ msgstr "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" -msgstr "" +msgstr "незнаёмыя аргументы: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" -msgstr "" +msgstr "небяспечныя дазволы доступу для '{config_file}' (патрэбна быць 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py From 597b1415b3391c462b1d13a2e48cbc26f4c8039e Mon Sep 17 00:00:00 2001 From: Naveen Date: Wed, 26 Jun 2024 13:09:13 +0200 Subject: [PATCH 1578/2116] Translated using Weblate: Tamil (ta) by Naveen Currently translated at 1.9% (11 of 552 strings) Co-authored-by: Naveen Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ta/ Translation: F-Droid/F-Droid Server --- locale/ta/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/ta/LC_MESSAGES/fdroidserver.po b/locale/ta/LC_MESSAGES/fdroidserver.po index db024df0..f8111201 100644 --- a/locale/ta/LC_MESSAGES/fdroidserver.po +++ b/locale/ta/LC_MESSAGES/fdroidserver.po @@ -1,20 +1,21 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # K.B.Dharun Krishna , 2022. +# Naveen , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2022-10-02 15:36+0000\n" -"Last-Translator: K.B.Dharun Krishna \n" +"PO-Revision-Date: 2024-01-25 11:40+0000\n" +"Last-Translator: Naveen \n" "Language-Team: Tamil \n" "Language: ta\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 5.4-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -2416,7 +2417,7 @@ msgstr "" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" -msgstr "" +msgstr "இந்த உதவி செய்தியை காட்டிவிட்டு வெளியேறு" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." From 3de902787521021185fd6a697e7d0c360069f010 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Wed, 26 Jun 2024 13:09:13 +0200 Subject: [PATCH 1579/2116] Translated using Weblate: Japanese (ja) by Suguru Hirahara Currently translated at 1.4% (8 of 552 strings) Co-authored-by: Suguru Hirahara Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ja/ Translation: F-Droid/F-Droid Server --- locale/ja/LC_MESSAGES/fdroidserver.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index ecda9fad..badd7b48 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -1,20 +1,21 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # Hinaloe , 2020. +# Suguru Hirahara , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2020-09-02 16:10+0000\n" -"Last-Translator: Hinaloe \n" +"PO-Revision-Date: 2024-02-25 05:52+0000\n" +"Last-Translator: Suguru Hirahara \n" "Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.3-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -72,7 +73,7 @@ msgstr "" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" -msgstr "" +msgstr "「{url}」は正しいURLではありません!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -157,7 +158,7 @@ msgstr "" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" -msgstr "" +msgstr "「sdk_path」がconfig.ymlで設定されていません!" #: ../fdroidserver/common.py #, python-brace-format From 3bab86f352f3c0343055b304db9549d8a84cda4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=A3=CE=A4=CE=91=CE=A5=CE=A1=CE=9F=CE=A3=20=CE=94=CE=91?= =?UTF-8?q?=CE=9B=CE=99=CE=91=CE=9A=CE=9F=CE=A0=CE=9F=CE=A5=CE=9B=CE=9F?= =?UTF-8?q?=CE=A3?= Date: Wed, 26 Jun 2024 13:09:13 +0200 Subject: [PATCH 1580/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Greek?= =?UTF-8?q?=20(el)=20by=20=CE=A3=CE=A4=CE=91=CE=A5=CE=A1=CE=9F=CE=A3=20?= =?UTF-8?q?=CE=94=CE=91=CE=9B=CE=99=CE=91=CE=9A=CE=9F=CE=A0=CE=9F=CE=A5?= =?UTF-8?q?=CE=9B=CE=9F=CE=A3=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 11.9% (66 of 552 strings) Translated using Weblate: Greek (el) by ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ Currently translated at 11.7% (65 of 552 strings) Co-authored-by: ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/el/ Translation: F-Droid/F-Droid Server --- locale/el/LC_MESSAGES/fdroidserver.po | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index 78c086ad..b8b47181 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -3,20 +3,21 @@ # THANOS SIOURDAKIS , 2020. # fresh , 2020, 2021. # Michalis , 2021. +# ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2021-02-18 17:50+0000\n" -"Last-Translator: Michalis \n" +"PO-Revision-Date: 2024-05-10 13:24+0000\n" +"Last-Translator: ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ \n" "Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.5\n" +"X-Generator: Weblate 5.5.4\n" #: ../fdroidserver/nightly.py msgid "" @@ -71,9 +72,9 @@ msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" msgstr "Το \"{path}\" δεν είναι υποστηριζόμενη μορφή αρχείου (χρήση: μεταδεδομένα/*.yml)" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "Το \"{path}\" υπάρχει, αλλά το s3cmd δεν έχει εγκατασταθεί!" +msgstr "Το \"{path}\" έχει υπογραφή από ένα κλειδί που δεν επιτρέπεται:" #: ../fdroidserver/import_subcommand.py #, python-brace-format @@ -931,7 +932,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" -msgstr "" +msgstr "Εγκατάσταση έτοιμων πακέτων σε συσκευές" #: ../fdroidserver/install.py #, python-format From 7c26cd31f28763b42eef9c72e9a96d3dc01c53d8 Mon Sep 17 00:00:00 2001 From: pitroig Date: Wed, 26 Jun 2024 13:09:14 +0200 Subject: [PATCH 1581/2116] Translated using Weblate: Catalan (ca) by pitroig Currently translated at 4.5% (25 of 552 strings) Co-authored-by: pitroig Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ca/ Translation: F-Droid/F-Droid Server --- locale/ca/LC_MESSAGES/fdroidserver.po | 58 +++++++++++++++------------ 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index 75ef7307..b396f41d 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -1,25 +1,29 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # Rubén , 2023. +# pitroig , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" +"PO-Revision-Date: 2024-05-05 12:37+0000\n" +"Last-Translator: pitroig \n" +"Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.5.3\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" +"\n" +"Clau pública SSH que s'utilitzarà com a clau de desplegament:" #: ../fdroidserver/nightly.py #, python-brace-format @@ -27,51 +31,53 @@ msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" +"\n" +"{path} codificat per a la variable secreta DEBUG_KEYSTORE:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" -msgstr "" +msgstr "\"%s/\" no té cap fitxer de metadades coincidents!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "" +msgstr "\"local_copy_dir\" {path} no existeix!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "" +msgstr "\"{apkfilename}\" ja està instal·lat {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" +msgstr "\"{path}\" conté {name} ({version}) obsoleta" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" -msgstr "" +msgstr "\"{path}\" conté {name} ({version}) recent" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" -msgstr "" +msgstr "\"{path}\" existeix, però s3cmd no està instalada!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "" +msgstr "\"{path}\" no és un format de fitxer compatible (utilitza: metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "" +msgstr "\"{path}\" està signat per una clau que no està permesa:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" -msgstr "" +msgstr "\"{url}\" no és un URL vàlid!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -87,18 +93,18 @@ msgstr[1] "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" -msgstr "" +msgstr "%(prog)s: errada: %(message)s\n" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" -msgstr "" +msgstr "%d problemes trobats" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" -msgstr "" +msgstr "%prog [options]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -110,54 +116,54 @@ msgstr "" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" -msgstr "" +msgstr "%s no ha produït cap dictat!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" -msgstr "" +msgstr "%s té un SHA-256 dolent: %s" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" -msgstr "" +msgstr "%s no és un camp de compilació acceptat" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" -msgstr "" +msgstr "L'opció %s no pren cap valor" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" -msgstr "" +msgstr "'keypass' no s'ha trobat a config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" +msgstr "'keystore' no és NINGÚ i 'smartcardoptions' està en blanc!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" -msgstr "" +msgstr "'keystore' no s'ha trobat a config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" -msgstr "" +msgstr "'keystorepass' no s'ha trobat a config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" -msgstr "" +msgstr "'repo_keyalias' no s'ha trobat a config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" -msgstr "" +msgstr "\"obligatori\" és un argument no vàlid per a posicionals" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" -msgstr "" +msgstr "'sdk_path' no establert a config.yml!" #: ../fdroidserver/common.py #, python-brace-format From ccbd68c1d4eda2ae946a30da1d24040a6abbf118 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Wed, 26 Jun 2024 13:09:14 +0200 Subject: [PATCH 1582/2116] Translated using Weblate: Persian (fa) by Danial Behzadi Currently translated at 8.3% (46 of 552 strings) Co-authored-by: Danial Behzadi Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fa/ Translation: F-Droid/F-Droid Server --- locale/fa/LC_MESSAGES/fdroidserver.po | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index 91ef57e3..c593adbb 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -2,22 +2,22 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Mostafa Ahangarha , 2020. -# Danial Behzadi , 2021. +# Danial Behzadi , 2021, 2024. # HM , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2023-05-24 22:18+0200\n" -"PO-Revision-Date: 2023-08-08 22:56+0000\n" -"Last-Translator: HM \n" +"PO-Revision-Date: 2024-05-13 12:10+0000\n" +"Last-Translator: Danial Behzadi \n" "Language-Team: Persian \n" "Language: fa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.0-dev\n" +"X-Generator: Weblate 5.5.5-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -1354,7 +1354,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" -msgstr "" +msgstr "آغاز سریع مخزنی جدید" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" @@ -2093,9 +2093,8 @@ msgid "dest= is required for options like %r" msgstr "" #: ../fdroidserver/scanner.py -#, fuzzy msgid "downloading '{}'" -msgstr "در حال بارگیری %s" +msgstr "بار گرفتن «{}»" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" @@ -2352,9 +2351,8 @@ msgid "optional arguments" msgstr "آرگومان‌های اختیاری" #: /usr/lib/python3.11/argparse.py -#, fuzzy msgid "options" -msgstr "انتخاب‌ها" +msgstr "گزینه‌ها" #: ../fdroidserver/nightly.py #, python-brace-format From 9d025dc3a9642be8d9f29f884f84fd2e95b72cb6 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Wed, 26 Jun 2024 13:09:14 +0200 Subject: [PATCH 1583/2116] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ Translation: F-Droid/F-Droid Server --- locale/ar/LC_MESSAGES/fdroidserver.po | 132 ++++++++++++++++++++++++- locale/be/LC_MESSAGES/fdroidserver.po | 130 ++++++++++++++++++++++++- locale/ca/LC_MESSAGES/fdroidserver.po | 131 ++++++++++++++++++++++++- locale/el/LC_MESSAGES/fdroidserver.po | 130 ++++++++++++++++++++++++- locale/fa/LC_MESSAGES/fdroidserver.po | 131 ++++++++++++++++++++++++- locale/ja/LC_MESSAGES/fdroidserver.po | 133 +++++++++++++++++++++++++- locale/nl/LC_MESSAGES/fdroidserver.po | 133 +++++++++++++++++++++++++- locale/sv/LC_MESSAGES/fdroidserver.po | 131 ++++++++++++++++++++++++- locale/ta/LC_MESSAGES/fdroidserver.po | 130 ++++++++++++++++++++++++- 9 files changed, 1163 insertions(+), 18 deletions(-) diff --git a/locale/ar/LC_MESSAGES/fdroidserver.po b/locale/ar/LC_MESSAGES/fdroidserver.po index 3d1dad99..9980ff5a 100644 --- a/locale/ar/LC_MESSAGES/fdroidserver.po +++ b/locale/ar/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-01-17 16:52+0000\n" "Last-Translator: Laachir \n" "Language-Team: Arabic \n" @@ -93,6 +93,11 @@ msgstr[1] "" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: خطأ: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -212,6 +217,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -289,6 +299,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -385,6 +399,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "تحقق من وجود تحديثات للتطبيقات" @@ -551,6 +570,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -617,6 +646,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -783,6 +817,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -847,6 +885,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1052,6 +1094,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1189,6 +1235,12 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +#, fuzzy +#| msgid "no version information found" +msgid "No version information could be found." +msgstr "لم يتم العثور على معلومات النسخة" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1347,6 +1399,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1380,6 +1436,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1629,6 +1689,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1790,11 +1854,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1822,6 +1890,10 @@ msgstr "استخدام" msgid "Usage: %s\n" msgstr "الاستخدام: %s\n" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1851,6 +1923,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1908,6 +1984,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2057,6 +2137,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2232,6 +2316,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2390,6 +2479,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2404,6 +2498,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2608,6 +2706,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2618,6 +2741,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/be/LC_MESSAGES/fdroidserver.po b/locale/be/LC_MESSAGES/fdroidserver.po index 884d50a0..2e61feb4 100644 --- a/locale/be/LC_MESSAGES/fdroidserver.po +++ b/locale/be/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-01-21 00:08+0000\n" "Last-Translator: flac \n" "Language-Team: Belarusian \n" @@ -95,6 +95,11 @@ msgstr[1] "" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: памылка: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -214,6 +219,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -291,6 +301,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -387,6 +401,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Праверце наяўнасць абнаўленняў праграм" @@ -553,6 +572,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -619,6 +648,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -785,6 +819,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -849,6 +887,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1054,6 +1096,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1191,6 +1237,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1349,6 +1399,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1382,6 +1436,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1631,6 +1689,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1792,11 +1854,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1824,6 +1890,10 @@ msgstr "Выкарыстанне" msgid "Usage: %s\n" msgstr "Выкарыстанне: %s\n" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1853,6 +1923,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1910,6 +1984,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2059,6 +2137,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2233,6 +2315,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2390,6 +2477,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2404,6 +2496,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2608,6 +2704,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2618,6 +2739,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index b396f41d..874a5eed 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-05-05 12:37+0000\n" "Last-Translator: pitroig \n" "Language-Team: Catalan \n" @@ -95,6 +95,11 @@ msgstr[1] "" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: errada: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -214,6 +219,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -291,6 +301,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -387,6 +401,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "" @@ -553,6 +572,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -619,6 +648,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -785,6 +819,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -849,6 +887,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1054,6 +1096,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1191,6 +1237,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1349,6 +1399,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1382,6 +1436,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1631,6 +1689,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1792,11 +1854,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1824,6 +1890,10 @@ msgstr "" msgid "Usage: %s\n" msgstr "" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1853,6 +1923,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1910,6 +1984,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2059,6 +2137,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2233,6 +2315,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2390,6 +2477,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2404,6 +2496,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2608,6 +2704,32 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +#| msgid "'sdk_path' not set in config.yml!" +msgid "{path} is not a standard config file!" +msgstr "'sdk_path' no establert a config.yml!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2618,6 +2740,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index b8b47181..d074ccad 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-05-10 13:24+0000\n" "Last-Translator: ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ \n" "Language-Team: Greek \n" @@ -97,6 +97,11 @@ msgstr[1] "Η επιλογή %(option)s απαιτεί %(number)d ορίσματ msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: σφάλμα: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -216,6 +221,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -293,6 +303,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -389,6 +403,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Έλεγχος για ενημερώσεις εφαρμογών" @@ -555,6 +574,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -621,6 +650,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -787,6 +821,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -851,6 +889,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1056,6 +1098,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1193,6 +1239,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1351,6 +1401,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1384,6 +1438,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1633,6 +1691,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1794,11 +1856,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1826,6 +1892,10 @@ msgstr "Χρήση" msgid "Usage: %s\n" msgstr "Χρήση: %s\n" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1855,6 +1925,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1912,6 +1986,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2061,6 +2139,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2235,6 +2317,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2393,6 +2480,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2407,6 +2499,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2611,6 +2707,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2621,6 +2742,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index c593adbb..1630e747 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-05-13 12:10+0000\n" "Last-Translator: Danial Behzadi \n" "Language-Team: Persian \n" @@ -93,6 +93,11 @@ msgstr[1] "گزینه %(option)s نیاز به آرگومان‌های %(number) msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: خطا: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -212,6 +217,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -289,6 +299,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -385,6 +399,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "به‌روزرسانی‌ها برای برنامه‌ها را بررسی می‌کند" @@ -551,6 +570,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -617,6 +646,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -783,6 +817,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -847,6 +885,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1052,6 +1094,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1189,6 +1235,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1347,6 +1397,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1380,6 +1434,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1629,6 +1687,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1790,11 +1852,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1822,6 +1888,10 @@ msgstr "استفاده" msgid "Usage: %s\n" msgstr "مصرف: %s\n" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1851,6 +1921,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1908,6 +1982,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2057,6 +2135,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2231,6 +2313,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2388,6 +2475,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2402,6 +2494,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2606,6 +2702,32 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +#| msgid "'sdk_path' not set in config.yml!" +msgid "{path} is not a standard config file!" +msgstr "'sdk_path' تنظیم نشده است در config.yml!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2616,6 +2738,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index badd7b48..6fd4bf25 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-02-25 05:52+0000\n" "Last-Translator: Suguru Hirahara \n" "Language-Team: Japanese \n" @@ -90,6 +90,11 @@ msgstr[0] "" msgid "%(prog)s: error: %(message)s\n" msgstr "" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -209,6 +214,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -286,6 +296,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -381,6 +395,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "" @@ -547,6 +566,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -613,6 +642,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -779,6 +813,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -843,6 +881,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1048,6 +1090,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1185,6 +1231,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1343,6 +1393,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1376,6 +1430,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1624,6 +1682,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1785,11 +1847,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1817,6 +1883,10 @@ msgstr "" msgid "Usage: %s\n" msgstr "" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1846,6 +1916,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1903,6 +1977,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2051,6 +2129,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2224,6 +2306,11 @@ msgstr "local_copy_dir はファイルではなくディレクトリにする必 msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2381,6 +2468,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2395,6 +2487,12 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +#, fuzzy +#| msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "local_copy_dir は「froid」で終わっていません、もしかして: 「{path}」" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2598,6 +2696,32 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +#| msgid "'sdk_path' not set in config.yml!" +msgid "{path} is not a standard config file!" +msgstr "「sdk_path」がconfig.ymlで設定されていません!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2608,6 +2732,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index d9221ab5..d78f7292 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-01-03 09:07+0000\n" "Last-Translator: Issa1553 \n" "Language-Team: Dutch \n" @@ -97,6 +97,11 @@ msgstr[1] "%(option)s optie vereist %(number)d argumenten" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: fout: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -216,6 +221,11 @@ msgstr "/problemen ontbreekt" msgid "A URL is required as an argument!" msgstr "Een URL is vereist als argument!" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "PGP-handtekeningen toevoegen met GnuPG voor pakketten in repo" @@ -293,6 +303,12 @@ msgstr "App heeft binaries maar heeft geen overeenkomstige ToegestaneAPKOndertek msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "App heeft GeenBronSinds of Archiefbeleid \"0 versies\" maar AutoUpdateModus of UpdateCheckModus zijn niet Geen" +#: ../fdroidserver/lint.py +#, fuzzy +#| msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "App heeft GeenBronSinds of Archiefbeleid \"0 versies\" maar AutoUpdateModus of UpdateCheckModus zijn niet Geen" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -389,6 +405,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Controleren op updates voor applicaties" @@ -555,6 +576,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -621,6 +652,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -787,6 +823,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -851,6 +891,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1056,6 +1100,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1193,6 +1241,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1351,6 +1403,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1384,6 +1440,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1633,6 +1693,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1794,11 +1858,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1826,6 +1894,10 @@ msgstr "Gebruik" msgid "Usage: %s\n" msgstr "Gebruik: %s\n" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1855,6 +1927,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1912,6 +1988,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2061,6 +2141,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2235,6 +2319,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2393,6 +2482,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2407,6 +2501,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2611,6 +2709,32 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +#| msgid "'sdk_path' not set in config.yml!" +msgid "{path} is not a standard config file!" +msgstr "'sdk_path' niet ingesteld in config.yml!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2621,6 +2745,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index 3d7d7684..b32bd3fa 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-04-24 08:39+0000\n" "Last-Translator: Kristoffer Grundström \n" "Language-Team: Swedish \n" @@ -96,6 +96,11 @@ msgstr[1] "" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: fel: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -215,6 +220,11 @@ msgstr "/issues saknas" msgid "A URL is required as an argument!" msgstr "En URL krävs som ett argument!" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -292,6 +302,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -388,6 +402,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "Kontrollera efter uppdateringar av appar" @@ -554,6 +573,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -620,6 +649,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -786,6 +820,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -850,6 +888,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1055,6 +1097,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1192,6 +1238,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1350,6 +1400,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1383,6 +1437,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1632,6 +1690,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1793,11 +1855,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1825,6 +1891,10 @@ msgstr "Användning" msgid "Usage: %s\n" msgstr "Användning: %s\n" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1854,6 +1924,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1911,6 +1985,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2060,6 +2138,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2234,6 +2316,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2392,6 +2479,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2406,6 +2498,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2610,6 +2706,32 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +#| msgid "'sdk_path' not set in config.yml!" +msgid "{path} is not a standard config file!" +msgstr "'sdk_path' är inte inställt i config.yml!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2620,6 +2742,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" diff --git a/locale/ta/LC_MESSAGES/fdroidserver.po b/locale/ta/LC_MESSAGES/fdroidserver.po index f8111201..6f2df53a 100644 --- a/locale/ta/LC_MESSAGES/fdroidserver.po +++ b/locale/ta/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2023-05-24 22:18+0200\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-01-25 11:40+0000\n" "Last-Translator: Naveen \n" "Language-Team: Tamil \n" @@ -91,6 +91,11 @@ msgstr[1] "" msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s: பிழை: %(message)s\n" +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" @@ -210,6 +215,11 @@ msgstr "" msgid "A URL is required as an argument!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" msgstr "" @@ -287,6 +297,10 @@ msgstr "" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" @@ -383,6 +397,11 @@ msgstr "" msgid "Categories are not set" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Check for updates to applications" msgstr "" @@ -549,6 +568,16 @@ msgstr "" msgid "Description of length {length} is over the {limit} char limit" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" msgstr "" @@ -615,6 +644,11 @@ msgstr "" msgid "Duplicate link in '{field}': {url}" msgstr "" +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" @@ -781,6 +815,10 @@ msgstr "" msgid "Found multiple JAR Signature Block Files in {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" @@ -845,6 +883,10 @@ msgstr "" msgid "Git reset failed" msgstr "" +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + #: ../fdroidserver/common.py msgid "Git submodule sync failed" msgstr "" @@ -1050,6 +1092,10 @@ msgstr "" msgid "Keystore for signing key:\t" msgstr "" +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" @@ -1187,6 +1233,10 @@ msgstr "" msgid "No unsigned directory - nothing to do" msgstr "" +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" msgstr "" @@ -1345,6 +1395,10 @@ msgstr "" msgid "Pushing binary transparency log to {url}" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" @@ -1378,6 +1432,10 @@ msgstr "" msgid "Reading {apkfilename} from cache" msgstr "" +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" @@ -1627,6 +1685,10 @@ msgstr "" msgid "These are the apps that have been archived from the main repo." msgstr "" +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" @@ -1788,11 +1850,15 @@ msgstr "" msgid "UpdateCheckData not a valid URL: {url}" msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1820,6 +1886,10 @@ msgstr "பயன்பாடு" msgid "Usage: %s\n" msgstr "பயன்பாடு: %s\n" +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" msgstr "" @@ -1849,6 +1919,10 @@ msgstr "" msgid "Using APK Signature v3" msgstr "" +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" @@ -1906,6 +1980,10 @@ msgstr "" msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2055,6 +2133,10 @@ msgstr "" msgid "could not parse '{path}'" msgstr "" +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" @@ -2229,6 +2311,11 @@ msgstr "" msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2387,6 +2474,11 @@ msgstr "" msgid "repo_url needs to end with /repo" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." msgstr "" @@ -2401,6 +2493,10 @@ msgstr "" msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + #: ../fdroidserver/scanner.py msgid "shared library" msgstr "" @@ -2605,6 +2701,31 @@ msgstr "" msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" @@ -2615,6 +2736,11 @@ msgstr "" msgid "{path} more than 200MB, manually upload: {url}" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" From 55ea03c7692f1b816c80eeaef26432fcc9e5f280 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Wed, 26 Jun 2024 13:09:14 +0200 Subject: [PATCH 1584/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Turki?= =?UTF-8?q?sh=20(tr)=20by=20O=C4=9Fuz=20Ersen=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (580 of 580 strings) Co-authored-by: Oğuz Ersen Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/tr/ Translation: F-Droid/F-Droid Server --- locale/tr/LC_MESSAGES/fdroidserver.po | 80 +++++++++++---------------- 1 file changed, 33 insertions(+), 47 deletions(-) diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index 17c34f60..fb7dc91c 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-04-11 20:02+0000\n" +"PO-Revision-Date: 2024-05-15 04:32+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" "Language: tr\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.6-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -100,7 +100,7 @@ msgstr "%(prog)s: hata: %(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "%d APK imzalanamadı veya doğrulanamadı!" #: ../fdroidserver/scanner.py #, python-format @@ -222,9 +222,9 @@ msgid "A URL is required as an argument!" msgstr "Bir URL, argüman olarak gereklidir!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "{path} içinde imzalama sertifikaları bulunamadı" +msgstr "APK imzalarının {path} içinde farklı sertifikaları var:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -304,9 +304,8 @@ msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode msgstr "Uygulamanın NoSourceSince veya ArchivePolicy \"0 sürümü\" var ancak AutoUpdateMode veya UpdateCheckMode Yok değil" #: ../fdroidserver/lint.py -#, fuzzy msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "Uygulamanın NoSourceSince veya ArchivePolicy \"0 sürümü\" var ancak AutoUpdateMode veya UpdateCheckMode Yok değil" +msgstr "Uygulamanın NoSourceSince veya ArchivePolicy \"0 sürümü\" var ya da 0 var ama AutoUpdateMode veya UpdateCheckMode Yok değil" #: ../fdroidserver/lint.py #, python-brace-format @@ -407,7 +406,7 @@ msgstr "Kategoriler ayarlı değil" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" +msgstr "\"{category}\" kategorisi tanımlanmış ancak herhangi bir uygulama için kullanılmıyor!" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -578,12 +577,12 @@ msgstr "{length} uzunluğundaki açıklama, {limit} karakter sınırının üst #: ../fdroidserver/common.py #, python-brace-format msgid "Did you mean config/{name}.yml?" -msgstr "" +msgstr "config/{name}.yml mı demek istediniz?" #: ../fdroidserver/lint.py #, python-brace-format msgid "Did you mean {code}?" -msgstr "" +msgstr "{code} mi demek istediniz?" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" @@ -654,7 +653,7 @@ msgstr "'{field}' içinde yinelenen bağlantı: {url}" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "HATA: %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -827,9 +826,8 @@ msgid "Found multiple JAR Signature Block Files in {path}" msgstr "{path} içinde birden fazla JAR İmza Blok Dosyası bulundu" #: ../fdroidserver/common.py -#, fuzzy msgid "Found multiple Signer Certificates!" -msgstr "Depo için birden çok imzalama sertifikası bulundu." +msgstr "Birden çok imzalama sertifikası bulundu!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -896,9 +894,8 @@ msgid "Git reset failed" msgstr "Git reset başarısız" #: ../fdroidserver/common.py -#, fuzzy msgid "Git submodule deinit failed" -msgstr "Git alt modülü güncellemesi başarısız oldu" +msgstr "Git alt modülü iptali başarısız oldu" #: ../fdroidserver/common.py msgid "Git submodule sync failed" @@ -1107,7 +1104,7 @@ msgstr "İmzalama için anahtar deposu:\t" #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "" +msgstr "AllowedAPKSigningKeys içinde bilinen hata ayıklama anahtarı kullanılıyor: " #: ../fdroidserver/lint.py #, python-brace-format @@ -1247,9 +1244,8 @@ msgid "No unsigned directory - nothing to do" msgstr "İmzalanmamış dizin yok - yapılacak işlem yok" #: ../fdroidserver/__main__.py -#, fuzzy msgid "No version information could be found." -msgstr "sürüm bilgisi bulunamadı" +msgstr "Sürüm bilgisi bulunamadı." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" @@ -1410,9 +1406,8 @@ msgid "Pushing binary transparency log to {url}" msgstr "İkili şeffaflık günlüğü {url} konumuna gönderiliyor" #: ../fdroidserver/deploy.py -#, fuzzy msgid "Pushing to remote server failed!" -msgstr "Git remote set-head başarısız: \"%s\"" +msgstr "Uzak sunucuya gönderme başarısız oldu!" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1448,9 +1443,8 @@ msgid "Reading {apkfilename} from cache" msgstr "{apkfilename} önbellekten okunuyor" #: ../fdroidserver/build.py -#, fuzzy msgid "Refresh and cache scanner rules and signatures from the network" -msgstr "imzaların en son sürümünü internetten al" +msgstr "Tarayıcı kurallarını ve imzalarını ağdan yenile ve önbelleğe al" #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1702,11 +1696,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Bunlar ana depodan arşivlenmiş uygulamalardır." #: ../fdroidserver/mirror.py -#, fuzzy msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "" -"HATA: bu komut asla f-droid.org'u yansıtmak için kullanılmamalıdır!\n" -"f-droid.org'un tam bir yansıması 200GB'tan çok yer gerektirir." +msgstr "Bu komut asla f-droid.org'u yansıtmak için kullanılmamalıdır! Tam bir kopya 600GB'tan çok yer gerektirir." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." @@ -1882,9 +1873,8 @@ msgstr "UpdateCheckMode ayarlı ancak checkupdates henüz çalıştırılmamış #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -#, fuzzy msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode ayarlı ancak checkupdates henüz çalıştırılmamış gibi görünüyor." +msgstr "UpdateCheckMode ayarlı ancak checkupdates henüz çalıştırılmamış gibi görünüyor" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -1914,9 +1904,8 @@ msgid "Usage: %s\n" msgstr "Kullanım: %s\n" #: ../fdroidserver/lint.py -#, fuzzy msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "Öntanımlı daldaki bir dosyaya işaret etmek için /master yerine /HEAD kullanın" +msgstr "Öntanımlı daldaki bir dosyaya işaret etmek için /master veya /main yerine /HEAD kullanın" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" @@ -1948,9 +1937,8 @@ msgid "Using APK Signature v3" msgstr "APK İmza v3 kullanılıyor" #: ../fdroidserver/common.py -#, fuzzy msgid "Using JAR Signature" -msgstr "APK İmza v2 kullanılıyor" +msgstr "JAR İmza kullanılıyor" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -2011,7 +1999,7 @@ msgstr "Tüm depo denetlenirken yamllint öntanımlı olarak devre dışı bıra #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." -msgstr "" +msgstr "İmzalama veya doğrulama başarısız olduğunda, bir hata koduyla çık." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2163,9 +2151,8 @@ msgid "could not parse '{path}'" msgstr "'{path}' ayrıştırılamadı" #: ../fdroidserver/common.py -#, fuzzy msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "srclib belirtimi ayrıştırılamadı (referans belirtilmedi): '{}'" +msgstr "srclib belirtimi ayrıştırılamadı (ad belirtilmedi): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" @@ -2342,9 +2329,9 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "Yansıma '%s' 'fdroid' ile bitmiyor!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "Şimdi bunları config.yml içinde ayarlayın:" +msgstr "yansı iki defa ayarlandı, config.yml ve {path} içinde!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2506,7 +2493,7 @@ msgstr "repo_url'nin /repo ile bitmesi gerekiyor" #: ../fdroidserver/deploy.py #, python-brace-format msgid "rsync is missing or broken: {error}" -msgstr "" +msgstr "rsync eksik veya bozuk: {error}" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." @@ -2523,9 +2510,8 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "tarayıcı önbelleği bozuk! Şu şekilde temizleyebilirsiniz: '{clear}'" #: ../fdroidserver/deploy.py -#, fuzzy msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "local_copy_dir \"fdroid\" ile sonlanmıyor, belki de \"{path}\" demek istediniz" +msgstr "serverwebroot: yol \"fdroid\" ile sonlanmıyor, belki de bunlardan birini demek istediniz:" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2734,27 +2720,27 @@ msgstr "{path} konumunun bozuk imzası \"{pattern}\" var, olası Janus istismar #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} has been flagged by virustotal {count} times:" -msgstr "" +msgstr "{path} virustotal tarafından {count} defa işaretlendi:" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" +msgstr "{path} \"anahtar: değer\" sözlüğü değil, ancak {datatype}!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} is not a standard config file!" -msgstr "'sdk_path' config.yml içinde ayarlı değil!" +msgstr "{path} standart bir yapılandırma dosyası değil!" #: ../fdroidserver/index.py #, python-brace-format msgid "{path} is not list, but a {datatype}!" -msgstr "" +msgstr "{path} liste değil, ancak {datatype}!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "" +msgstr "{path} {expected_type} değil, ancak {datatype}!" #: ../fdroidserver/update.py #, python-brace-format @@ -2769,7 +2755,7 @@ msgstr "{path} 200MB'den fazla, elle yükleyin: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" +msgstr "{path}: \"{code}\" geçerli bir ISO_3166-1 alpha-2 ülke kodu değil!" #: ../fdroidserver/update.py #, python-brace-format From 7a7657638e492f0aacd2991c0704ca5636dfd9ea Mon Sep 17 00:00:00 2001 From: Fjuro Date: Wed, 26 Jun 2024 13:09:14 +0200 Subject: [PATCH 1585/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 100.0% (580 of 580 strings) Co-authored-by: Fjuro Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ Translation: F-Droid/F-Droid Server --- locale/cs/LC_MESSAGES/fdroidserver.po | 80 +++++++++++---------------- 1 file changed, 33 insertions(+), 47 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index bb10f256..5ec4d664 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -12,7 +12,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-04-23 10:07+0000\n" +"PO-Revision-Date: 2024-05-15 04:32+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" @@ -20,7 +20,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.6-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -104,7 +104,7 @@ msgstr "%(prog)s: chyba: %(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "Nepodařilo se podepsat nebo ověřit %d souborů APK!" #: ../fdroidserver/scanner.py #, python-format @@ -226,9 +226,9 @@ msgid "A URL is required as an argument!" msgstr "Jako argument je vyžadována adresa URL!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "Nenalezeny žádné podpisové certifikáty v {path}" +msgstr "Podpisy souborů APK mají rozdílné certifikáty v {path}:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -308,9 +308,8 @@ msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode msgstr "Aplikace má NoSourceSince nebo ArchivePolicy \"0 versions\", ale AutoUpdateMode nebo UpdateCheckMode nejsou None" #: ../fdroidserver/lint.py -#, fuzzy msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "Aplikace má NoSourceSince nebo ArchivePolicy \"0 versions\", ale AutoUpdateMode nebo UpdateCheckMode nejsou None" +msgstr "Aplikace má NoSourceSince nebo ArchivePolicy \"0 versions\" nebo 0, ale AutoUpdateMode nebo UpdateCheckMode nejsou None" #: ../fdroidserver/lint.py #, python-brace-format @@ -412,7 +411,7 @@ msgstr "Kategorie nejsou nastavené" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" +msgstr "Kategorie „{category}“ je definována, ale není používána u žádných aplikací!" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -583,12 +582,12 @@ msgstr "Popis délky {length} přesahuje limit {limit} znaků" #: ../fdroidserver/common.py #, python-brace-format msgid "Did you mean config/{name}.yml?" -msgstr "" +msgstr "Mysleli jste config/{name}.yml?" #: ../fdroidserver/lint.py #, python-brace-format msgid "Did you mean {code}?" -msgstr "" +msgstr "Mysleli jste {code}?" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" @@ -659,7 +658,7 @@ msgstr "Duplicitní odkaz v '{field}': {url}" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "CHYBA: %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -832,9 +831,8 @@ msgid "Found multiple JAR Signature Block Files in {path}" msgstr "V {path} nalezeno několik podpisových bloků JAR" #: ../fdroidserver/common.py -#, fuzzy msgid "Found multiple Signer Certificates!" -msgstr "Nalezeno více podpisových certifikátů pro repozitář." +msgstr "Nalezeno více podpisových certifikátů!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -901,9 +899,8 @@ msgid "Git reset failed" msgstr "Git reset se nezdařil" #: ../fdroidserver/common.py -#, fuzzy msgid "Git submodule deinit failed" -msgstr "Git submodule update se nezdařil" +msgstr "Git submodule deinit se nezdařil" #: ../fdroidserver/common.py msgid "Git submodule sync failed" @@ -1112,7 +1109,7 @@ msgstr "Úložiště klíčů pro podpisový klíč:\t" #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "" +msgstr "V AllowedAPKSigningKeys je použit známý ladicí klíč: " #: ../fdroidserver/lint.py #, python-brace-format @@ -1252,9 +1249,8 @@ msgid "No unsigned directory - nothing to do" msgstr "Žádný nepodepsaný adresář - není co dělat" #: ../fdroidserver/__main__.py -#, fuzzy msgid "No version information could be found." -msgstr "nenalezeny informace o verzi" +msgstr "Nenalezeny žádné informace o verzi." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" @@ -1415,9 +1411,8 @@ msgid "Pushing binary transparency log to {url}" msgstr "Odeslání protokolu binární průhlednosti do {url}" #: ../fdroidserver/deploy.py -#, fuzzy msgid "Pushing to remote server failed!" -msgstr "Git remote set-head se nezdařil: „%s“" +msgstr "Odeslání na vzdálený server se nezdařilo!" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1453,9 +1448,8 @@ msgid "Reading {apkfilename} from cache" msgstr "Čtení {apkfilename} z mezipaměti" #: ../fdroidserver/build.py -#, fuzzy msgid "Refresh and cache scanner rules and signatures from the network" -msgstr "stáhnout nejnovější verzi podpisů z webu" +msgstr "Obnovit a uložit pravidla a podpisy skeneru ze sítě do mezipaměti" #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1708,11 +1702,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Aplikace, které byly archivovány z hlavního repozitáře." #: ../fdroidserver/mirror.py -#, fuzzy msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "" -"CHYBA: tento příkaz by nikdy neměl být použit k zrcadlení f-droid.org!\n" -"Celý mirror f-droid.org vyžaduje více než 200GB." +msgstr "Tento příkaz by nikdy neměl být použit k zrcadlení f-droid.org! Celá kopie vyžaduje více než 600GB." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." @@ -1888,9 +1879,8 @@ msgstr "UpdateCheckMode je nastaven, ale vypadá to, že akce checkupdates ješt #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -#, fuzzy msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode je nastaven, ale vypadá to, že akce checkupdates ještě nebyla spuštěna." +msgstr "UpdateCheckMode je nastaven, ale vypadá to, že akce checkupdates zatím nebyla spuštěna" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -1920,9 +1910,8 @@ msgid "Usage: %s\n" msgstr "Použití: %s\n" #: ../fdroidserver/lint.py -#, fuzzy msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "Použijte /HEAD místo /master k ukázání na soubor ve výchozí větvi" +msgstr "Použijte /HEAD namísto /master nebo /main k ukázání na soubor ve výchozí větvi" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" @@ -1954,9 +1943,8 @@ msgid "Using APK Signature v3" msgstr "Používám APK Signature v3" #: ../fdroidserver/common.py -#, fuzzy msgid "Using JAR Signature" -msgstr "Používám APK Signature v2" +msgstr "Používám JAR Signature" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -2017,7 +2005,7 @@ msgstr "Při lintingu celého úložiště je yamllint ve výchozím nastavení #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." -msgstr "" +msgstr "Pokud podpis nebo ověření selže, ukončit proces s chybovým kódem." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2170,9 +2158,8 @@ msgid "could not parse '{path}'" msgstr "nepodařilo se parsovat '{path}'" #: ../fdroidserver/common.py -#, fuzzy msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "nepodařilo se parsovat srclib spec (není určen ref): '{}'" +msgstr "nepodařilo se parsovat srclib spec (není určen název): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" @@ -2350,9 +2337,9 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "mirror '%s' nekončí s 'fdroid'!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "Nyní nastavte následující v config.yml:" +msgstr "zrcadla nastavena dvakrát, v config.yml a {path}!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2514,7 +2501,7 @@ msgstr "repo_url musí končit na /repo" #: ../fdroidserver/deploy.py #, python-brace-format msgid "rsync is missing or broken: {error}" -msgstr "" +msgstr "rsync chybí nebo je rozbitý: {error}" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." @@ -2531,9 +2518,8 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "mezipaměť skeneru je poškozena! Můžete ji vymazat pomocí: ‚{clear}‘" #: ../fdroidserver/deploy.py -#, fuzzy msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "local_copy_dir nekončí s \"fdroid\", možná jste měli na mysli: \"{path}\"" +msgstr "serverwebroot: cesta nekončí s „fdroid“, možná jste mysleli jednu z následujících:" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2743,27 +2729,27 @@ msgstr "{path} má nesprávný podpis balíčku \"{pattern}\", možný exploit J #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} has been flagged by virustotal {count} times:" -msgstr "" +msgstr "{path} byl označen službou VirusTotal {count}krát:" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" +msgstr "{path} není „key: value“ dict, ale {datatype}!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} is not a standard config file!" -msgstr "'sdk_path' není nastaven v souboru config.yml!" +msgstr "{path} není standardní konfigurační soubor!" #: ../fdroidserver/index.py #, python-brace-format msgid "{path} is not list, but a {datatype}!" -msgstr "" +msgstr "{path} není list, ale {datatype}!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "" +msgstr "{path} není {expected_type}, ale {datatype}!" #: ../fdroidserver/update.py #, python-brace-format @@ -2778,7 +2764,7 @@ msgstr "{path} více než 200 MB, ruční nahrání: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" +msgstr "{path}: „{code}“ není platný kód země ve formátu ISO_3166-1 alpha-2!" #: ../fdroidserver/update.py #, python-brace-format From f3d301d1def3886c5cb66be94828350386327fe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Wed, 26 Jun 2024 13:09:14 +0200 Subject: [PATCH 1586/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Chine?= =?UTF-8?q?se=20(Simplified)=20(zh=5FHans)=20by=20=E5=A4=A7=E7=8E=8B?= =?UTF-8?q?=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1=E5=B1=B1=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 80.0% (464 of 580 strings) Co-authored-by: 大王叫我来巡山 Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 45 +++++++++------------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 0f78fc1a..8752a891 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -30,20 +30,21 @@ # zhiqi , 2023. # David Jiang , 2023. # ALoLo_527 , 2024. +# 大王叫我来巡山 , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-04-13 17:01+0000\n" -"Last-Translator: ALoLo_527 \n" +"PO-Revision-Date: 2024-05-15 18:13+0000\n" +"Last-Translator: 大王叫我来巡山 \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.6-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -247,9 +248,9 @@ msgid "A URL is required as an argument!" msgstr "需要有一个链接作为参数!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "在 {path} 中找不到签名证书" +msgstr "APK 签名在 {path} 中有不同的证书:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -329,9 +330,8 @@ msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode msgstr "应用的 NoSourceSince 或 ArchivePolicy 为 “0 versions” 但 AutoUpdateMode 或 UpdateCheckMode 不是 None" #: ../fdroidserver/lint.py -#, fuzzy msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "应用的 NoSourceSince 或 ArchivePolicy 为 “0 versions” 但 AutoUpdateMode 或 UpdateCheckMode 不是 None" +msgstr "APK 有 NoSourceSince 或 ArchivePolicy \"0 versions\" 或 0 但 AutoUpdateMode 或 UpdateCheckMode 不是 None" #: ../fdroidserver/lint.py #, python-brace-format @@ -851,9 +851,8 @@ msgid "Found multiple JAR Signature Block Files in {path}" msgstr "在{path}中发现多个JAR签名块文件" #: ../fdroidserver/common.py -#, fuzzy msgid "Found multiple Signer Certificates!" -msgstr "发现存储库的多个签名证书。" +msgstr "找到了多个签署者证书!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -920,9 +919,8 @@ msgid "Git reset failed" msgstr "Git reset 失败" #: ../fdroidserver/common.py -#, fuzzy msgid "Git submodule deinit failed" -msgstr "Git 子模块更新失败" +msgstr "Git 子模块去初始化失败" #: ../fdroidserver/common.py msgid "Git submodule sync failed" @@ -1271,9 +1269,8 @@ msgid "No unsigned directory - nothing to do" msgstr "没有未签名的目录 - 无操作" #: ../fdroidserver/__main__.py -#, fuzzy msgid "No version information could be found." -msgstr "没有找到版本信息" +msgstr "找不到版本信息。" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" @@ -1434,9 +1431,8 @@ msgid "Pushing binary transparency log to {url}" msgstr "正推送二进制文件透明日志到{url}" #: ../fdroidserver/deploy.py -#, fuzzy msgid "Pushing to remote server failed!" -msgstr "Git remote set-head 失败:\"%s\"" +msgstr "推送到远程服务器失败了!" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1724,11 +1720,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "这些是已从主存储库存档的应用。" #: ../fdroidserver/mirror.py -#, fuzzy msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "" -"错误:请不要使用此命令来镜像 f-droid.org!\n" -"对 f-droid.org 进行完整镜像至少需要超过 200GB 的储存空间。" +msgstr "此命令永远不应该被用来镜像 f-droid.org!完整的拷贝需要至少 600GB。" #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." @@ -1968,9 +1961,8 @@ msgid "Using APK Signature v3" msgstr "使用 APK 签名 v3" #: ../fdroidserver/common.py -#, fuzzy msgid "Using JAR Signature" -msgstr "使用 APK 签名 v2" +msgstr "使用 JAR 签名" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -2359,9 +2351,9 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "现在在 config.yml 中设置这些:" +msgstr "设置了两次镜像,分别在 config.xml 和 {path} 中!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2540,9 +2532,8 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" #: ../fdroidserver/deploy.py -#, fuzzy msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "local_copy_dir未以“ fdroid”结尾,也许你指的是:“ {path}”" +msgstr "serverwebroot:路径没有以 \"fdroid\"结尾,可能你想表达的是这些当中的一个:" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2758,9 +2749,9 @@ msgid "{path} is not \"key: value\" dict, but a {datatype}!" msgstr "" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} is not a standard config file!" -msgstr "未在 config.yml 中设置 'sdk_path'!" +msgstr "{path} 不是标准的配置文件!" #: ../fdroidserver/index.py #, python-brace-format From 030dd4d4843c08892aff81d9cad04054daec0c3a Mon Sep 17 00:00:00 2001 From: Agnieszka C Date: Wed, 26 Jun 2024 13:09:14 +0200 Subject: [PATCH 1587/2116] Translated using Weblate: Polish (pl) by Agnieszka C Currently translated at 96.8% (562 of 580 strings) Co-authored-by: Agnieszka C Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ Translation: F-Droid/F-Droid Server --- locale/pl/LC_MESSAGES/fdroidserver.po | 28 ++++++++++++--------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 99abb33d..8632ee46 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-04-10 18:44+0000\n" +"PO-Revision-Date: 2024-05-15 18:13+0000\n" "Last-Translator: Agnieszka C \n" "Language-Team: Polish \n" "Language: pl\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.6-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -102,7 +102,7 @@ msgstr "%(prog)s: błąd: %(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "Nie udało się podpisać lub zweryfikować %d plików APK!" #: ../fdroidserver/scanner.py #, python-format @@ -224,9 +224,9 @@ msgid "A URL is required as an argument!" msgstr "Adres URL jest wymagany jako argument!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "Nie znaleziono certyfikatów do podpisu w {path}" +msgstr "Podpisy plików APK mają różne certyfikaty w {ścieżce}:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -306,7 +306,6 @@ msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode msgstr "Aplikacja ma NoSourceSince lub ArchivePolicy „0 versions”, ale AutoUpdateMode lub UpdateCheckMode nie są None" #: ../fdroidserver/lint.py -#, fuzzy msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Aplikacja ma NoSourceSince lub ArchivePolicy „0 versions”, ale AutoUpdateMode lub UpdateCheckMode nie są None" @@ -410,7 +409,7 @@ msgstr "Kategorie nie są ustawione" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" +msgstr "Kategoria „{category}” zdefiniowana, ale nieużywana dla żadnej aplikacji!" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -581,12 +580,12 @@ msgstr "Opis długości {length} przekracza limit {limit} char" #: ../fdroidserver/common.py #, python-brace-format msgid "Did you mean config/{name}.yml?" -msgstr "" +msgstr "Czy miałeś na myśli config/{name}.yml?" #: ../fdroidserver/lint.py #, python-brace-format msgid "Did you mean {code}?" -msgstr "" +msgstr "Czy miałeś na myśli {code}?" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" @@ -657,7 +656,7 @@ msgstr "Zduplikowany link w '{field}': {url}" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "BŁĄD: %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -830,9 +829,8 @@ msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Znaleziono wiele plików bloków podpisów JAR w {path}" #: ../fdroidserver/common.py -#, fuzzy msgid "Found multiple Signer Certificates!" -msgstr "Znaleziono wiele certyfikatów do podpisywania dla repozytorium." +msgstr "Znaleziono wiele certyfikatów do podpisywania!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1250,9 +1248,8 @@ msgid "No unsigned directory - nothing to do" msgstr "Brak katalogu bez podpisu - nic nie można zrobić" #: ../fdroidserver/__main__.py -#, fuzzy msgid "No version information could be found." -msgstr "nie znaleziono informacji o wersji" +msgstr "Nie udało się znaleźć informacji o wersji." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" @@ -1413,9 +1410,8 @@ msgid "Pushing binary transparency log to {url}" msgstr "Przesyłanie dziennika przejrzystości plików binarnych do {url}" #: ../fdroidserver/deploy.py -#, fuzzy msgid "Pushing to remote server failed!" -msgstr "Błąd zdalnego ustawiania Git: \"%s\"" +msgstr "Przesyłanie na serwer zdalny nie powiodło się!" #: ../fdroidserver/deploy.py #, python-brace-format From 9bd7b421095f3f407ae1408edf167fb773d71314 Mon Sep 17 00:00:00 2001 From: Licaon Kter Date: Wed, 26 Jun 2024 13:09:14 +0200 Subject: [PATCH 1588/2116] Translated using Weblate: Romanian (ro) by Licaon Kter Currently translated at 100.0% (580 of 580 strings) Co-authored-by: Licaon Kter Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ro/ Translation: F-Droid/F-Droid Server --- locale/ro/LC_MESSAGES/fdroidserver.po | 84 +++++++++++---------------- 1 file changed, 35 insertions(+), 49 deletions(-) diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 4a96a07c..0426cf59 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -3,22 +3,22 @@ # Daniel Șerbănescu , 2021. # Christian Eichert , 2021. # Simona Iacob , 2021, 2022, 2023, 2024. -# Licaon Kter , 2021, 2022, 2023. +# Licaon Kter , 2021, 2022, 2023, 2024. # Hans-Christoph Steiner , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-04-10 13:33+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2024-05-17 08:01+0000\n" +"Last-Translator: Licaon Kter \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.6-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -102,7 +102,7 @@ msgstr "%(prog)s: eroare: %(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "%d fișiere APK nu au putut fi semnate sau verificate!" #: ../fdroidserver/scanner.py #, python-format @@ -224,9 +224,9 @@ msgid "A URL is required as an argument!" msgstr "Un URL este necesar ca argument!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "Nu s-au găsit certificate de semnare în {path}" +msgstr "Semnăturile APK au certificate diferite în {path}" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -306,9 +306,8 @@ msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode msgstr "App are NoSourceSince sau ArchivePolicy \"0 versions\" dar AutoUpdateMode sau UpdateCheckMode nu sunt None" #: ../fdroidserver/lint.py -#, fuzzy msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "App are NoSourceSince sau ArchivePolicy \"0 versions\" dar AutoUpdateMode sau UpdateCheckMode nu sunt None" +msgstr "Aplicatia are NoSourceSince sau ArchivePolicy \"0 versions\" dar AutoUpdateMode sau UpdateCheckMode nu sunt None" #: ../fdroidserver/lint.py #, python-brace-format @@ -410,7 +409,7 @@ msgstr "Categoriile nu sunt setate" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" +msgstr "Categoria \"{category}\" este definită dar nu este folosită de nici o aplicație!" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -581,12 +580,12 @@ msgstr "Descrierea lungimii {length} este peste limita {limit} limitei de caract #: ../fdroidserver/common.py #, python-brace-format msgid "Did you mean config/{name}.yml?" -msgstr "" +msgstr "Ați vrut de fapt config/{name}.yml?" #: ../fdroidserver/lint.py #, python-brace-format msgid "Did you mean {code}?" -msgstr "" +msgstr "Ați vrut de fapt {code}?" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" @@ -657,7 +656,7 @@ msgstr "Legătură duplicată în \"{field}\": {url}" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "EROARE: %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -830,9 +829,8 @@ msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Am găsit mai multe fișiere JAR Signature Block în {path}" #: ../fdroidserver/common.py -#, fuzzy msgid "Found multiple Signer Certificates!" -msgstr "S-au găsit mai multe certificate de semnare pentru depozit." +msgstr "S-au găsit mai multe certificate de semnare!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -899,9 +897,8 @@ msgid "Git reset failed" msgstr "Resetarea Git a eșuat" #: ../fdroidserver/common.py -#, fuzzy msgid "Git submodule deinit failed" -msgstr "Actualizarea submodulelor Git a eșuat" +msgstr "Eliminarea submodulelor Git a eșuat" #: ../fdroidserver/common.py msgid "Git submodule sync failed" @@ -1110,7 +1107,7 @@ msgstr "Keystore pentru cheia de semnare:\t" #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "" +msgstr "Cheie de depanare cunoscută este utilizată în AllowedAPKSigningKeys: " #: ../fdroidserver/lint.py #, python-brace-format @@ -1250,9 +1247,8 @@ msgid "No unsigned directory - nothing to do" msgstr "Niciun director nesemnat - nimic de făcut" #: ../fdroidserver/__main__.py -#, fuzzy msgid "No version information could be found." -msgstr "nu s-au găsit informații despre versiune" +msgstr "Nu s-au găsit informații despre versiune." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" @@ -1413,9 +1409,8 @@ msgid "Pushing binary transparency log to {url}" msgstr "Trimiterea jurnalului de transparență binară la {url}" #: ../fdroidserver/deploy.py -#, fuzzy msgid "Pushing to remote server failed!" -msgstr "Git remote set-head a eșuat: \"%s\"" +msgstr "Încărcarea la serverul de la distanță a eșuat!" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1451,9 +1446,8 @@ msgid "Reading {apkfilename} from cache" msgstr "Citirea {apkfilename} din memoria cache" #: ../fdroidserver/build.py -#, fuzzy msgid "Refresh and cache scanner rules and signatures from the network" -msgstr "extrage cea mai recentă versiune de semnături de pe web" +msgstr "Actualizează și stochează în memorie regulile și semnăturilor de scanare din rețea" #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1706,11 +1700,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Acestea sunt aplicațiile care au fost arhivate din depozitul principal." #: ../fdroidserver/mirror.py -#, fuzzy msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "" -"ERROR: această comandă nu ar trebui să fie folosită niciodată pentru a oglindi f-droid.org!\n" -"O oglindă completă a f-droid.org necesită mai mult de 200GB." +msgstr "Această comandă nu trebuie folosită niciodată pentru a seta un server de rezervă f-droid.org! O copie completă necesită mai mult de 600GB." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." @@ -1886,9 +1877,8 @@ msgstr "UpdateCheckMode este setat, dar se pare că checkupdates nu a fost înc #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -#, fuzzy msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode este setat, dar se pare că checkupdates nu a fost încă rulat." +msgstr "UpdateCheckMode este setat, dar se pare că checkupdates nu a fost încă rulat" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -1918,9 +1908,8 @@ msgid "Usage: %s\n" msgstr "Utilizare: %s\n" #: ../fdroidserver/lint.py -#, fuzzy msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "Folosiți /HEAD în loc de /master pentru a indica un fișier din ramura implicită" +msgstr "Folosiți /HEAD în loc de /master sau /main pentru a indica un fișier din ramura implicită" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" @@ -1952,9 +1941,8 @@ msgid "Using APK Signature v3" msgstr "Folosind APK Signature v3" #: ../fdroidserver/common.py -#, fuzzy msgid "Using JAR Signature" -msgstr "Folosind APK Signature v2" +msgstr "Folosind JAR Signature" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -2015,7 +2003,7 @@ msgstr "Atunci când se face linting pentru întregul depozit, yamllint este dez #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." -msgstr "" +msgstr "În cazul în care semnarea sau verificarea eșuează, ieșiți cu un cod de eroare." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2168,9 +2156,8 @@ msgid "could not parse '{path}'" msgstr "nu s-a putut analiza '{path}'" #: ../fdroidserver/common.py -#, fuzzy msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "nu a putut analiza specificația srclib (nu a fost specificat niciun ref): '{}'" +msgstr "nu a putut analiza specificația srclib (nu a fost specificat niciun nume): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" @@ -2348,9 +2335,9 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "oglinda '%s' nu se termină cu 'fdroid'!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "Acum setați-le în config.yml:" +msgstr "servere de rezervă duplicat, în config.yml și {path}!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2512,7 +2499,7 @@ msgstr "repo_url trebuie să se termine cu /repo" #: ../fdroidserver/deploy.py #, python-brace-format msgid "rsync is missing or broken: {error}" -msgstr "" +msgstr "rsync lipsește sau este nefuncțional: {error}" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." @@ -2529,9 +2516,8 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "cache-ul scanerului este deformat! Puteți să o ștergeți cu: '{clear}'" #: ../fdroidserver/deploy.py -#, fuzzy msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "local_copy_dir nu se termină cu \"fdroid\", poate ai vrut să spui: \"{path}\"" +msgstr "serverwebroot: calea nu se termină cu \"fdroid\", poate că v-ați referit la una dintre acestea:" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2741,27 +2727,27 @@ msgstr "{path} are o semnătură proastă a fișierului \"{pattern}\", posibil e #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} has been flagged by virustotal {count} times:" -msgstr "" +msgstr "{path} a fost marcat de virustotal de {count} ori:" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" +msgstr "{path} nu este de tip \"key: value\", ci {datatype}!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} is not a standard config file!" -msgstr "'sdk_path' nu este setat în 'config.yml'!" +msgstr "{path} nu este un fișier de configurare standard!" #: ../fdroidserver/index.py #, python-brace-format msgid "{path} is not list, but a {datatype}!" -msgstr "" +msgstr "{path} nu este o listă, ci {datatype}!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "" +msgstr "{path} nu este {expected_type}, ci {datatype}!" #: ../fdroidserver/update.py #, python-brace-format @@ -2776,7 +2762,7 @@ msgstr "{path} mai mult de 200MB, încărcați manual: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" +msgstr "{path}: \"{code}\" nu este un cod de țară valid conform ISO_3166-1 alpha-2!" #: ../fdroidserver/update.py #, python-brace-format From 991d3c8d350720f12f16cd7c7236fae4c020ead0 Mon Sep 17 00:00:00 2001 From: Test Account Date: Wed, 26 Jun 2024 13:09:14 +0200 Subject: [PATCH 1589/2116] Added translation using Weblate: Swahili (sw) by Test Account Co-authored-by: Test Account --- locale/sw/LC_MESSAGES/fdroidserver.po | 2766 +++++++++++++++++++++++++ 1 file changed, 2766 insertions(+) create mode 100644 locale/sw/LC_MESSAGES/fdroidserver.po diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po new file mode 100644 index 00000000..1590c9b7 --- /dev/null +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -0,0 +1,2766 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# Test Account , 2024. +msgid "" +msgstr "" +"Project-Id-Version: fdroidserver 2.3a1\n" +"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: sw\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH public key to be used as deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "" +"\n" +"{path} encoded for the DEBUG_KEYSTORE secret variable:" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "\"%s/\" has no matching metadata file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "\"{apkfilename}\" is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains outdated {name} ({version})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains recent {name} ({version})" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "\"{path}\" exists but s3cmd is not installed!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "\"{url}\" is not a valid URL!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "%(option)s option requires %(number)d argument" +msgid_plural "%(option)s option requires %(number)d arguments" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "%(prog)s: error: %(message)s\n" +msgstr "" + +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "%d problems found" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "%prog [options]" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "%r is not callable" +msgstr "" + +#: ../fdroidserver/signindex.py +#, python-format +msgid "%s did not produce a dict!" +msgstr "" + +#: ../fdroidserver/signindex.py +#, python-format +msgid "%s has bad SHA-256: %s" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "%s is not an accepted build field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "%s option does not take a value" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' is NONE and 'smartcardoptions' is blank!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "'required' is an invalid argument for positionals" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{path}' failed to execute!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format +msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "...checkupdate failed for {appid} : {error}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid ".__call__() not defined" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "/issues is missing" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "A URL is required as an argument!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Add PGP signatures using GnuPG for packages in repo" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add a repo signing key to an unsigned repo" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add skeleton metadata files for APKs that are missing them" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Adding new repo for only {name}" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Alias of the repo signing key in the keystore" +msgstr "" + +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Also mirror the full archive section" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Also warn about formatting issues, like rewritemeta -l" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android AAR library" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android APK file" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android DEX code" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' is not a directory!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "App is in '{repo}' but has a link to {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Appending .git is not necessary" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Archiving {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in srclib '{srclib}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Broken symlink: {path}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Build a package from source" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build all applications available" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Build generated by `fdroid import` - remove disable line once ready" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Build metadata git repo has uncommited changes!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build only the latest version of each package" +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "Built repo based in \"%s\" with this config:" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Can't build due to {} error while scanning" +msgid_plural "Can't build due to {} errors while scanning" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Cannot rewrite \"{path}\"" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Categories '%s' is not valid" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Categories are not set" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Check for updates to applications" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Clean update - don't uses caches, reprocess all APKs" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Comma separated list of categories." +msgstr "" + +#: ../fdroidserver/__main__.py +#, python-format +msgid "Command '%s' not recognised.\n" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Commit changes" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not find '{command}' on your system" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Could not find latest version code" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Could not find latest version name" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not find {path} to remove it" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not parse size \"{size}\", wrong type \"{type}\"" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Couldn't find Application ID" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find package ID" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Cowardily refusing to overwrite existing signing key setup!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Created new container \"{name}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Creating \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating log directory" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Creating new S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating output directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating signed index with this key (SHA256):" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/verify.py +msgid "Creating temporary directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating unsigned index in preparation for signing" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "DEBUG_KEYSTORE is not set or the value is incomplete" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Delete APKs and/or OBBs without metadata from the repo" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting archive, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Deleting unknown file: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description '%s' is just the app's summary" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Description has a duplicate line" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Description of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Do not add 'disable:' to the generated build entries" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not deploy the new files to the repo" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Do not include \"{path}\" in URL!" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Do not prompt for Android SDK path, just fail" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not remove the private keys generated from the keystore" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't create a source tarball, useful when testing a build" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/nightly.py +msgid "Don't use rsync checksums" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Download complete mirrors of small repos" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Downloading the repository already failed once, not trying again." +msgstr "" + +#: ../fdroidserver/verify.py +#, python-brace-format +msgid "Downloading {url} failed. {error}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Duplicate link in '{field}': {url}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "" +"ERROR: this command should never be used to mirror f-droid.org!\n" +"A full mirror of f-droid.org requires more than 200GB." +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "ERROR: unsupported CI type, patches welcome!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "" + +#: ../fdroidserver/__main__.py +#, python-brace-format +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"Enter the path to the Android SDK (%s) here:\n" +"> " +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Error while getting repo address" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Extract signatures from APKs" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed copying {path}: {error}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Failed fetching signatures for '{apkfilename}': {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed reading {path}: {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed resizing {path}: {error}" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Failed to create S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get APK information, deleting {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get APK information, skipping {path}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Failed to install '{apkfilename}' on {dev}: {error}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to sign application" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Fetched buildserverid from VM: {buildserverid}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "File disappeared while processing it: {path}" +msgstr "" + +#: ../fdroidserver/build.py ../fdroidserver/install.py +#: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py +#: ../fdroidserver/update.py +msgid "Finished" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Forbidden HTML tags" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Force halting build after {0} sec timeout!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Force scan of disabled apps and builds." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found bad funding file \"{path}\" for \"{name}\":" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Found invalid appids in arguments" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +msgid "Found invalid versionCodes for some apps" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Found multiple JAR Signature Block Files in {path}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Found multiple metadata files for {appid}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found multiple signing certificates for repository." +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found no signing certificates for repository." +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Found non-file at %s" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Found {apkfilename} at {url}" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Found {count} problems in {filename}" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Found {count} warnings in {filename}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Generated skeleton metadata for {appid}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git checkout of '%s' failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git clean failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git fetch failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git remote set-head failed: \"%s\"" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git reset failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule sync failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule update failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "HTTPS must be used with Subversion URLs!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "If a git mirror gets to big, allow the archive to be deleted" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "If this upload fails, try manually uploading to {url}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." +msgstr "" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring FUNDING.yml entry longer than 2048: %s" +msgstr "" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Ignoring package without metadata: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Ignoring stale cache data for {apkfilename}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Include APKs that are signed with disabled algorithms like MD5" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the PGP signature .asc files in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the build logs in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the source tarballs in the mirror" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Initialising submodules" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Install all signed applications available" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Install built packages on devices" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}..." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Interact with the repo HTTP server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Invalid APK" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid VercodeOperation: {field}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Invalid VercodeOperation: {invalid_ops}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid application ID {appid}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid boolean '%s'" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid bulleted list" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Invalid name for published file: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid redirect to non-HTTPS: {before} -> {after} " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid scrlib metadata: '{file}' does not exist" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: could not parse '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature failed to verify: {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature verified: {path}" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java JAR file" +msgstr "" + +#: ../fdroidserver/mirror.py ../fdroidserver/publish.py +#: ../fdroidserver/update.py +msgid "Java JDK not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java compiled class" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Javascript in HTML src attributes" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Keystore for signing key:\t" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the Liberapay: field" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Locale included in f-droid.org URL" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Make the build stop on exceptions" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Malformed repository mirrors." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Malformed serverwebroot line:" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Mirror the full repo and archive, all file types." +msgstr "" + +#: ../fdroidserver/gpgsign.py +msgid "Missing output directory" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No Android SDK found!" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No attached devices found" +msgstr "" + +#: ../fdroidserver/index.py +msgid "No fingerprint in URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No git submodules available" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "No gradle project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "No information found." +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is Free Software" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is for Android" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No packages specified" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "No signed APK available for %s" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No signed output directory - nothing to do" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No signing certificates found in {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "No such package: %s" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No such versionCode {versionCode} for app {appid}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/verify.py +msgid "No unsigned directory - nothing to do" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Not a valid size definition: \"{}\"" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Nothing to do" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Nothing to do for {appid}." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "OBB file has newer versionCode({integer}) than any APK:" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB filename must start with \"main.\" or \"patch.\":" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB's packagename does not match a supported APK:" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Only PNG and JPEG are supported for graphics, found: {path}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only print differences with the Play Store" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only process apps with auto-updates" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "OpenCollective donation methods belong in the OpenCollective: field" +msgstr "" + +#: /usr/lib/python3.11/optparse.py +msgid "Options" +msgstr "" + +#: ../fdroidserver/verify.py +msgid "Output JSON report to file named after APK." +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Output JSON to stdout." +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py +#: ../fdroidserver/publish.py ../fdroidserver/signindex.py +#: ../fdroidserver/update.py +msgid "Outputting JSON" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Overall license of the project." +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "Package \"{appid}\" already exists" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Parsing manifest at '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Password required with username" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Path to main Android project subdirectory, if not in root." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Path to the git repo to use as the log" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the keystore for the repo signing key" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Print the secret variable to the terminal for easy copy/paste" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Problem with xml at '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Process auto-updates" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#, python-brace-format +msgid "Processing {apkfilename}" +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#, python-brace-format +msgid "Processing {appid}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable XML/JSON for index files" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Project URL to import from." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Punctuation should be avoided" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Push the log to this git remote repository" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Pushing binary transparency log to {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Pushing to {url}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Quickly start a new repository" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Read all the metadata files and exit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading '{config_file}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Reading {apkfilename} from cache" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Removing specified files" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Rename APK files that do not match package.name_123.apk" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Resigning {apkfilename} with provided debug.keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Resize all the icons exceeding the max pixel size and exit" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Restrict output to warnings and errors" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Rewrite all the metadata files" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Run on git repo that has uncommitted changes" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Run rewritemeta to fix formatting" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Running first pass with MD5 checking disabled" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Running wget in {path}" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "SHA-256 of {url} does not match entry!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scan the resulting APK(s) for known non-free classes." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Scan the source code of a package" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {apk}" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:{versionCode}:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scanner found {} problem" +msgid_plural "Scanner found {} problems" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Set clock to that time using:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Set maximum releases in repo before older ones are archived" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Set open file limit to {integer}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Set up an app build for a nightly build repo" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setting open file limit failed: " +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Setting {0} sec timeout for this build" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Sign and place packages in the repo" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Sign indexes created using update --nosign" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Skip scanning the source code for binaries and other problems" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping '{apkfilename}' with invalid signature!" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping index generation for {appid}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: disabled" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Specify a local folder to sync the repo to" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Specify an identity file to provide to SSH for rsyncing" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Specify which debug keystore file to use." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Spew out even more information than normal" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Stripping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Summary '%s' is just the app's name" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Summary of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "System clock is older than date in {path}!" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "The OBB version code must come after \"{name}.\":" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "The base URL for the repo to log (default: https://f-droid.org)" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "The directory to write the mirror to" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "The file to be included in the repo (path or glob)" +msgstr "" + +#: ../fdroidserver/index.py +msgid "The repository's fingerprint does not match." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "The root dir for local_copy_dir \"{path}\" does not exist!" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "There is a keyalias collision - publishing halted" +msgstr "" + +#: ../fdroidserver/common.py +msgid "These are the apps that have been archived from the main repo." +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-format +msgid "This repo already has local metadata: %s" +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL must start with https:// or http://" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL shorteners should not be used" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "URL {url} in Description: {error}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Unknown exception found!" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Unknown file '{filename}' in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Unknown metadata format: %s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path} (use: *.yml)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Unknown version of aapt, might cause problems: " +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary leading space" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary trailing space" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised app field '{fieldname}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised build flag '{build_flag}' in '{path}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported file type \"{extension}\" for repo graphic" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported graphics file found: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused extlib at %s" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused file at %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scandelete path: %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scanignore path: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Update repo information for new packages" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Update the binary transparency log for a URL" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "UpdateCheckData has invalid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must use HTTPS URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData not a valid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID, it can be removed" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to androidobservatory.org" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to virustotal" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "Usage" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "Usage: %s\n" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master to point at a file in the default branch" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use `fdroid update -c` to create it." +msgstr "" + +#: ../fdroidserver/build.py +msgid "Use build server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v2" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v3" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Using androguard from \"{path}\"" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Using existing keystore \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using s3cmd to sync with: {url}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Valid commands are:" +msgstr "" + +#: ../fdroidserver/verify.py +msgid "Verify against locally cached copy rather than redownloading." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Verify the integrity of downloaded packages" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Verifying index signature:" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Warn about possible metadata errors" +msgstr "" + +#: ../fdroidserver/update.py +msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgstr "" + +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + +#: ../fdroidserver/init.py +msgid "X.509 'Distinguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/common.py +msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "ZIP file archive" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "adding IdentityFile to {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "adding to {name}: {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "ambiguous option: %s (%s?)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + +#: ../fdroidserver/common.py +msgid "apksigner not found, it's required for signing!" +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py +#: ../fdroidserver/rewritemeta.py +msgid "application ID of file to operate on" +msgstr "" + +#: ../fdroidserver/build.py ../fdroidserver/install.py +#: ../fdroidserver/publish.py ../fdroidserver/scanner.py +#: ../fdroidserver/verify.py +msgid "application ID with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "argument \"-\" with mode %r" +msgstr "" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "argument %(argument_name)s: %(message)s" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare SSH connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "can not parse scrlib spec (not a string): '{}'" +msgstr "" + +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "can't open non-https url: '{};" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "cannot find required srclibs: \"{path}\"" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "cannot have multiple subparser arguments" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "cannot merge actions - two groups are named %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "cannot publish update, did you set the deploy key?" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "cloning {url}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "commands from plugin modules:" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "complex" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting option string: %s" +msgid_plural "conflicting option strings: %s" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting subparser alias: %s" +msgstr "" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting subparser: %s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "could not parse '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no ref specified): '{}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (too many '@' signs): '{}'" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "created {path}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "deleting: repo/{apkfilename}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed process log {path} to {dest}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "dest= is required for options like %r" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "downloading '{}'" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "downloading scanner signatures from '{}' failed" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "executable binary, possibly code" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "expected %s argument" +msgid_plural "expected %s arguments" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "expected at least one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "expected at most one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "expected one argument" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "fdroid [] [-h|--help|--version|]" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "fetch the latest version of signatures from the web" +msgstr "" + +#: /usr/lib/python3.11/optparse.py +msgid "floating-point" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force metadata errors (default) to be warnings, or to be ignored." +msgstr "" + +#: ../fdroidserver/common.py +msgid "git svn clone failed" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "gzip file archive" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "ignored explicit argument %r" +msgstr "" + +#: ../fdroidserver/index.py +msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + +#: ../fdroidserver/index.py +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "integer" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid %(type)s value: %(value)r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid choice: %(value)r (choose from %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid conflict_resolution value: %r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgstr "" + +#: ../fdroidserver/common.py +msgid "ipfs_cid not found, skipping CIDv1 generation" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be an absolute path!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be directory, not a file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "mirror '%s' does not end with 'fdroid'!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "mutually exclusive arguments must be optional" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "next {name} cache update due in {time}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "no \"icon\" in {appid}" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "no APK supplied" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "no such option: %s" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "no version info found!" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "not allowed with argument %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "one of the arguments %s is required" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/index.py +msgid "only accepts strings, lists, and tuples" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "option %s: If you really want to install all the signed apps, use --all" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "option %s: invalid %s value: %r" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "option %s: invalid choice: %r (choose from %s)" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option -%s not recognized" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option -%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s must not have an argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s not a unique prefix" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s not recognized" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +msgid "optional arguments" +msgstr "" + +#: /usr/lib/python3.11/argparse.py +msgid "options" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "overwriting existing {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "positional arguments" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "process log deploy {path} to {dest} failed!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "ruamel.yaml not installed, can not write metadata." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd sync indexes {path} to {url} and delete" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "scanner cache is malformed! You can clear it with: '{clear}'" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "shared library" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "show program's version number and exit" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py +#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +msgid "show this help message and exit" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "signed APK, either a file-path or HTTPS URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: log content is empty" +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: not enabled in config" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "skipping source tarball: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "srclibs missing name and/or @" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "static library" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "the following arguments are required: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unexpected option string: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unrecognized arguments: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "unsafe permissions on '{config_file}' (should be 0600)!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid +#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +msgid "usage: " +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "using Apache libcloud to sync with {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "virustotal.com is rate limiting, waiting to retry..." +msgstr "" + +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "{0} app, {1} key aliases" +msgid_plural "{0} apps, {1} key aliases" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} ({appid}) has no metadata!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using application ID instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android application ID!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Java Package Name!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{appid} is missing {name}" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: Unknown extlib {path} in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "{appid}: no builds specified, running on current source state" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be an integer, found: {value}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{file} is blank or corrupt!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "{path} already exists, ignoring import results!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "{path} does not exist! Create it by running:" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} is zero size!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} more than 200MB, manually upload: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{url} does not end with \"fdroid\", check the URL path!" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "{url} does not start with \"http\"!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "{} build failed" +msgid_plural "{} builds failed" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/build.py +msgid "{} build succeeded" +msgid_plural "{} builds succeeded" +msgstr[0] "" +msgstr[1] "" From 8dc0633096237117ba4002edf2047c018d50ac70 Mon Sep 17 00:00:00 2001 From: abelbiwott-dev Date: Wed, 26 Jun 2024 13:09:15 +0200 Subject: [PATCH 1590/2116] Translated using Weblate: Swahili (sw) by abelbiwott-dev Currently translated at 100.0% (580 of 580 strings) Translated using Weblate: Swahili (sw) by abelbiwott-dev Currently translated at 86.2% (500 of 580 strings) Translated using Weblate: Swahili (sw) by abelbiwott-dev Currently translated at 78.6% (456 of 580 strings) Translated using Weblate: Swahili (sw) by abelbiwott-dev Currently translated at 66.7% (387 of 580 strings) Translated using Weblate: Swahili (sw) by abelbiwott-dev Currently translated at 56.3% (327 of 580 strings) Translated using Weblate: Swahili (sw) by abelbiwott-dev Currently translated at 48.1% (279 of 580 strings) Translated using Weblate: Swahili (sw) by abelbiwott-dev Currently translated at 42.2% (245 of 580 strings) Translated using Weblate: Swahili (sw) by abelbiwott-dev Currently translated at 34.3% (199 of 580 strings) Translated using Weblate: Swahili (sw) by abelbiwott-dev Currently translated at 31.2% (181 of 580 strings) Translated using Weblate: Swahili (sw) by abelbiwott-dev Currently translated at 23.9% (139 of 580 strings) Translated using Weblate: Swahili (sw) by abelbiwott-dev Currently translated at 18.7% (109 of 580 strings) Translated using Weblate: Swahili (sw) by abelbiwott-dev Currently translated at 14.3% (83 of 580 strings) Co-authored-by: abelbiwott-dev Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sw/ Translation: F-Droid/F-Droid Server --- locale/sw/LC_MESSAGES/fdroidserver.po | 1189 +++++++++++++------------ 1 file changed, 603 insertions(+), 586 deletions(-) diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index 1590c9b7..88f652ed 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -1,25 +1,29 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # Test Account , 2024. +# abelbiwott-dev , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" +"PO-Revision-Date: 2024-05-27 08:09+0000\n" +"Last-Translator: abelbiwott-dev \n" +"Language-Team: Swahili \n" "Language: sw\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" +"\n" +"Kitufe cha umma cha SSH kitatumika kama ufunguo wa kupeleka:" #: ../fdroidserver/nightly.py #, python-brace-format @@ -27,51 +31,53 @@ msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" +"\n" +"{path} iliyosimbwa kwa utofauti wa siri wa DEBUG_KEYSTORE:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" -msgstr "" +msgstr "\"%s/\" haina faili ya metadata inayolingana!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "" +msgstr "\"local_copy_dir\" {path} haipo!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "" +msgstr "Tayari \"{apkfilename}\" imesakinishwa kwenye {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" +msgstr "\"{path}\" ina {name} ({version}) iliyopitwa na wakati" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" -msgstr "" +msgstr "\"{path}\" ina {name} ({version}) ya hivi majuzi" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" -msgstr "" +msgstr "\"{path}\" ipo lakini s3cmd haijasakinishwa!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "" +msgstr "\"{path}\" si muundo wa faili inayotumika (tumia: metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "" +msgstr "\"{path}\" imetiwa saini na ufunguo ambao hauruhusiwi:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" -msgstr "" +msgstr "\"{url}\" si URL halali!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -79,597 +85,599 @@ msgstr "" #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Chaguo %(option)s linahitaji hoja %(number)d" +msgstr[1] "Chaguo %(option)s linahitaji hoja %(number)d" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" -msgstr "" +msgstr "%(prog)s: kosa: %(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "APK %d hazijatiwa saini au kuthibitishwa!" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" -msgstr "" +msgstr "%d matatizo yamepatikana" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" -msgstr "" +msgstr "%prog [chaguo]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" -msgstr "" +msgstr "%r haiwezi kuitwa" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" -msgstr "" +msgstr "%s haikutoa amri!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" -msgstr "" +msgstr "%s ina SHA-256 mbaya: %s" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" -msgstr "" +msgstr "%s sio sehemu ya ujenzi inayokubalika" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" -msgstr "" +msgstr "chaguo la %s halichukui thamani" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" -msgstr "" +msgstr "'keypass' haipatikani kwenye config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" +msgstr "'keystore' HAKUNA na 'smartcardoptions' ni tupu!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" -msgstr "" +msgstr "'keystore' haipatikani kwenye config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" -msgstr "" +msgstr "'keystorepass' haipatikani kwenye config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" -msgstr "" +msgstr "'repo_keyalias' haipatikani kwenye config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" -msgstr "" +msgstr "\"required\" ni hoja batili kwa vipengee vya nafasi" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" -msgstr "" +msgstr "'sdk_path' haijawekwa kwenye config.yml!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" -msgstr "" +msgstr "'{aapt}' ni ya zamani sana, fdroid inahitaji zana za kujenga-{version} au mpya!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" +msgstr "'{field}' itakuwa katika mpangilio nasibu! Tumia () au [] mabano ikiwa agizo ni muhimu!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" -msgstr "" +msgstr "{path} imeshindwa kutekeleza!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "'{path}' ina umbizo batili, inapaswa kuwa kamusi!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" -msgstr "" +msgstr "'{value}' si {field} halali katika {appid}. Muundo wa regex: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "" +msgstr "'{value}' si {field} halali, inapaswa kuwa {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" -msgstr "" +msgstr "...sasisho la ukaguzi limeshindwa kwa {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" -msgstr "" +msgstr ".__call__() haijafafanuliwa" #: ../fdroidserver/lint.py msgid "/issues is missing" -msgstr "" +msgstr "/issues hayapo" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" -msgstr "" +msgstr "URL inahitajika kama hoja!" #: ../fdroidserver/common.py #, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "" +msgstr "Sahihi za APK zina vyeti tofauti katika {path}:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" -msgstr "" +msgstr "Ongeza saini za PGP kwa kutumia GnuPG kwa vifurushi kwenye ghala" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" -msgstr "" +msgstr "Ongeza kitufe cha kusaini ghala kwenye ghala ambayo haijatiwa saini" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" -msgstr "" +msgstr "Ongeza faili za metadata za kiunzi za APK ambazo hazina" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" -msgstr "" +msgstr "Kuongeza ghala mpya kwa {name} pekee" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" -msgstr "" +msgstr "Lakabu la ufunguo wa kusaini ghala kwenye duka la vitufe" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "AllowedAPKSigningKeys haipo lakini binari ya marejeleo imewasilishwa" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" -msgstr "" +msgstr "Inaruhusu marekebisho tofauti (au tawi la git) litajwe kwa uagizaji wa awali" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" -msgstr "" +msgstr "Pia onyesha sehemu kamili ya kumbukumbu" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" -msgstr "" +msgstr "Pia onya kuhusu masuala ya uumbizaji, kama rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" -msgstr "" +msgstr "Maktaba ya Android AAR" #: ../fdroidserver/scanner.py msgid "Android APK file" -msgstr "" +msgstr "faili ya APK ya Android" #: ../fdroidserver/scanner.py msgid "Android DEX code" -msgstr "" +msgstr "Msimbo wa DEX ya Android" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "" +msgstr "SDK ya Android haipatikani katika {path}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" -msgstr "" +msgstr "Njia ya SDK ya android {path} haipo!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" -msgstr "" +msgstr "Njia ya SDK ya Android {path} sio saraka!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "" +msgstr "Zana ya SDK ya Android {cmd} haijapatikana!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "Apu ina Binari lakini haina AllowedAPKSigningKeys zinazolingana ili kubandika cheti." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" +msgstr "Apu ina NoSourceSince au ArchivePolicy \"0 versions\" lakini AutoUpdateMode au UpdateCheckMode sio None" #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" +msgstr "Apu ina NoSourceSince au ArchivePolicy \"0 versions\" au 0 lakini AutoUpdateMode au UpdateCheckMode sio None" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" -msgstr "" +msgstr "Apu iko katika {repo} lakini ina kiungo cha {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "Toleo la Apu ina binari lakini haina AllowedAPKSigningKeys inayolingana ili kubandika cheti." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" -msgstr "" +msgstr "Kuambata .git sio lazima" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" -msgstr "" +msgstr "Kuhifadhi {apkfilename} yenye sahihi batili!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." -msgstr "" +msgstr "AutoUpdateMode na UpdateCheckMode: HTTP lazima iwe na muundo." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "Aina mbaya ya ingizo \"{mirrortype}\" katika usanidi wa vioo: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" -msgstr "" +msgstr "URL ya msingi ya kioo, inaweza kujumuisha ufunguo wa saini ya index kwa kutumia mfuatano wa uulizi: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "" +msgstr "Tawi '{branch}' limefanyiwa matumizi kama ahadi katika ujenzi wa '{versionName}'" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" -msgstr "" +msgstr "Tawi {branch} limetumiwa kama kufanya katika srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" -msgstr "" +msgstr "symlink iliyovunjika: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" -msgstr "" +msgstr "Unda kifurushi kutoka kwa chanzo" #: ../fdroidserver/build.py msgid "Build all applications available" -msgstr "" +msgstr "Unda apu zote zinazopatikana" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" -msgstr "" +msgstr "Jenga linalotokana na `fdroid import` - ondoa laini ya kulemaza mara tu ikiwa tayari" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" -msgstr "" +msgstr "Ghala ya metadata ya kujenga ina mabadiliko ambayo hayajahifadhiwa!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" -msgstr "" +msgstr "Jenga toleo la karibuni pekee la kila kifurishi" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" -msgstr "" +msgstr "Imejenga ghala yenye msingi katika \"%s\" na usanidi huu:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "Haiwezi kusasisha apu kiotomatiki ikiwa haina CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Haiwezi kujenga kutokana na kosa la {} wakati wa uchanganuzi" +msgstr[1] "Haiwezi kujenga kutokana na makosa ya {} wakati wa uchanganuzi" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" -msgstr "" +msgstr "Haiwezi kuandika upya \"{path}\"" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" -msgstr "" +msgstr "Kategoria ‘%s’ sio halali" #: ../fdroidserver/lint.py msgid "Categories are not set" -msgstr "" +msgstr "Kategoria hazijawekwa" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" +msgstr "Kategoria \"{category}\" imefafanuliwa lakini haitumiki kwa apu yoyote!" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" -msgstr "" +msgstr "Angalia masasisho ya programu" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "" +msgstr "Kucheki uhifadhi kwa {appid} - apks:{integer}, keepversions: {keep}, archapks: {arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" -msgstr "" +msgstr "Sasisho safi - usitumie cache, chakata tena APK zote" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." -msgstr "" +msgstr "Orodha ya kategoria iliyotenganishwa kwa koma." #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" -msgstr "" +msgstr "Amri '%s' haitambuliki.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" -msgstr "" +msgstr "hifadhi mabadiliko" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" +msgstr "Ukinzani kati ya ufafanuzi wa \"{field}\" kati ya .yml na faili zilizojanibishwa:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." -msgstr "" +msgstr "Hoja zinazokinzana: '--verbose' na '--quiet' haiwezi kubainishwa kwa wakati mmoja." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "Faili za usanidi zinazokinzana! Kwa kutumia {newfile}, ukipuuza {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" -msgstr "" +msgstr "Haikuweza kupata '{command}' kwenya mfumo wako" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" -msgstr "" +msgstr "Haikuweza kupata msimbo wa toleo wa hivi karibuni" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" -msgstr "" +msgstr "Haikuweza kupata jina la toleo la hivi karibuni" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" -msgstr "" +msgstr "Haikuweza kupata {path} ili kuiondoa" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "" +msgstr "Haikuweza kufungua APK {path} kwa ajili ya uchambuzi: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" -msgstr "" +msgstr "Haikuweza kuchanganua ukubwa \"{size}\", aina isiyo sahihi \"{type}\"" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" -msgstr "" +msgstr "Haikuweza kupata Kitambulisho cha apu" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" -msgstr "" +msgstr "Haikuweza kupata habari yolote ya toleo" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" -msgstr "" +msgstr "Haikuweza kupata kitambulisho cha kifurushi" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" -msgstr "" +msgstr "Kwa uoga inakataa kuandika upya usanidi wa ufunguo wa saini uliopo!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" -msgstr "" +msgstr "Imeunda kontena jipya \"{name}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." -msgstr "" +msgstr "Kuunda \"{path}\" kwa ajili ya kusanidi s3cmd." #: ../fdroidserver/publish.py msgid "Creating log directory" -msgstr "" +msgstr "Inaunda saraka ya kumbukumbu" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" -msgstr "" +msgstr "Inaunda S3 bucket mpya: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" -msgstr "" +msgstr "Inaunda saraka ya pato" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" -msgstr "" +msgstr "Inaunda kielezo kilichotiwa sahihi na ufunguo huu (SHA256):" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" -msgstr "" +msgstr "Inaunda saraka ya muda mfupi" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" -msgstr "" +msgstr "Inaunda kielezo isiyotiwa sahihi kwa maandalizi ya kutia sahihi" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "" +msgstr "CurrentVersionCode {cv} ni chini kuliko kuingia ya ujenzi wa zamani {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" -msgstr "" +msgstr "DEBUG_KEYSTORE haijawekwa au thamani yake haijakamilika" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "" +msgstr "Futa APK na/au OBB bila metadata kutoka kwa ghala" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "" +msgstr "Kufuta kumbukumbu, ghala ni kubwa mno ({size} upeo {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "" +msgstr "Kufuta historia ya git-mirror, ghala ni kubwa mno ({size} upeo {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" -msgstr "" +msgstr "kufuta faili isiyojulikana: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" -msgstr "" +msgstr "Maelezo %s ni muhtasari tu wa apu" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" -msgstr "" +msgstr "Maelezo ina mstari wa nakala" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" +msgstr "Maelezo ina orodha (%s) lakini sio yenye vitone (*) wala nambari (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" -msgstr "" +msgstr "Maelezo ya urefu {length} iko juu ya {limit} kikomo cha char" #: ../fdroidserver/common.py #, python-brace-format msgid "Did you mean config/{name}.yml?" -msgstr "" +msgstr "Je, ulimaanisha config/{name}.yml?" #: ../fdroidserver/lint.py #, python-brace-format msgid "Did you mean {code}?" -msgstr "" +msgstr "Je, ulimaanisha {code}?" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" -msgstr "" +msgstr "Usiongeze 'disable:' kwa maingizo yaliyotokana nayo" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" -msgstr "" +msgstr "Usipeleke faili mpya kwa ghala" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" -msgstr "" +msgstr "Usijumuishe \"{path}\" katika URL!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" -msgstr "" +msgstr "Usiulize kuhusu njia ya SDK ya Android, feli tu" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" -msgstr "" +msgstr "Usiondoe funguo za kibinafsi zilizotokana na keystore" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" -msgstr "" +msgstr "Usiunde tarball ya chanzo, muhimu wakati wa kujaribu muundo" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" -msgstr "" +msgstr "Usionyeshe upya ghala hio, muhimu wakati wa kujaribu jenga isiyo na muunganisho wa mtandao" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" -msgstr "" +msgstr "Usitumie rsync checksums" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" -msgstr "" +msgstr "Pakua vioo kamili vya ghala ndogo" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "Inapakua %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." -msgstr "" +msgstr "Kupakua ghala hio tayari imefeli mara moja, si kujaribu tena." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" -msgstr "" +msgstr "Kupakua {url} ilifeli. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "" +msgstr "Nakala ingine ya tamko la kipengele kisichopendelewa katika {path} ilipuuzwa!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "" +msgstr "Nakala ingine ya ingizo \"%s\" katika vioo vya usanidi!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" -msgstr "" +msgstr "Nakala ingine ya kiungo katika '{field}': {url}" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "HITILAFU: %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" +msgstr "HITILAFU: Amri ndogo ya \"server\" imetolewa, tumia \"deploy\"!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" +"HITILAFU: amri hii haipaswi kutumika kama kioo kwa f-droid.org!\n" +"Kioo kamili cha f-droid.org kinahitaji zaidi ya 200GB." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" -msgstr "" +msgstr "HITILAFU: aina ya CI isiyoungwa mkono, marekebisho yanakaribishwa!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "" +msgstr "HITILAFU: mwenyeji wa git isiyeungwa mkono \"%s\", marekebisho yanakaribishwa!" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "" +msgstr "Usimbaji umewekwa kwa '{enc}' fdroid yaweza kupata matatizo ya usimbaji. Tafadhali iweke kwenye 'UTF-8' kwa matokeo bora." #: ../fdroidserver/init.py #, python-format @@ -677,1024 +685,1026 @@ msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" +"Ingiza njia ya SDK ya Android (%s) hapa:\n" +"> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "Vigezo vya mazingira {var} kutoka {configname} haijawekwa!" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" -msgstr "" +msgstr "Kuna hitilafu wakati wa kupata anwani ya ghala" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" +msgstr "Ondoka na msimbo usio wa sifuri ikiwa matatizo yalipatikana" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "" +msgstr "Dondoa metadata ya apu kutoka kwa ghala ya chanzo" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" -msgstr "" +msgstr "Dondoa sahihi kutoka kwa APKs" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" -msgstr "" +msgstr "Imeshindwa kunakili {path}:{error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" -msgstr "" +msgstr "Imeshindwa kupakua sahihi kwa '{apkfilename}':{error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" -msgstr "" +msgstr "Imeshindwa kusoma {path}: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" -msgstr "" +msgstr "Imeshindwa kubadilisha ukubwa {path}: {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" -msgstr "" +msgstr "Imeshindwa kuunda ndoo ya S3: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" -msgstr "" +msgstr "Imeshindwa kupata maelezo ya APK, kufuta {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" -msgstr "" +msgstr "Imeshindwa kupata maelezo ya APK. kuruka {path}" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" -msgstr "" +msgstr "Imeshindwa kupata alama ya kidole ya ufunguo wa kusaini APK" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" -msgstr "" +msgstr "Imeshindwa kusakinisha '{apkfilename}' kwenye {dev}: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" -msgstr "" +msgstr "Imeshindwa kusaini apu" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" -msgstr "" +msgstr "buildserverid imepakiwa kutoka kwa VM: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" -msgstr "" +msgstr "Saini zimepakiwa kwa '{apkfilename}' -> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" -msgstr "" +msgstr "Faili ilipotea wakati wa kuichakata: {path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" -msgstr "" +msgstr "Imekamilika" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" +msgstr "Njia za mchango ya Flattr ni za FlattrID: field" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" -msgstr "" +msgstr "tagi za HTML zilizokatazwa" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." -msgstr "" +msgstr "Kulazimisha ujenzi wa apu zilizozimwa, na kuendelea bila kujali matatizo ya skana. Inaruhusiwa tu katika hali ya majaribio." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" -msgstr "" +msgstr "Kulazimisha kusitisha ujenzi baada ya muda wa sekunde {0} kumalizika!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." -msgstr "" +msgstr "Kulazimisha kuscani kwa apu zilizozimwa na kujenga." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" -msgstr "" +msgstr "Imepata mchoro wa \"{path}\" bila metadata kwa apu \"{name}\"!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" -msgstr "" +msgstr "Imepata faili ya fedha mbaya \"{path}\" ya \"{name}\":" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" -msgstr "" +msgstr "Imepatikana appids batili katika hoja" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" -msgstr "" +msgstr "Ilipata versionCodes batili katika baadhi ya apu" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "" +msgstr "Imepatikana faili nyingi za JAR Signature Block katika {path}" #: ../fdroidserver/common.py msgid "Found multiple Signer Certificates!" -msgstr "" +msgstr "Imepata Vyeti vingi vya Signer!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" -msgstr "" +msgstr "Imepata faili nyingi za metadata kwa {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." -msgstr "" +msgstr "Imatapa vyeti vingi vya kusaini kwa ghala." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." -msgstr "" +msgstr "Haikupata vyeti vyovyote vya kusaini kwa ghala." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" -msgstr "" +msgstr "Imepata kitu kisicho faili katika %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" -msgstr "" +msgstr "Imepata {apkfilename} katika {url}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" -msgstr "" +msgstr "Imepata matatizo ya {count} katika {filename}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" -msgstr "" +msgstr "Imepata onyo {count} katika {filename}" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" -msgstr "" +msgstr "Imeunda kiunzi cha metadata kwa {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" -msgstr "" +msgstr "Git checkout ya '%s' ilishindwa" #: ../fdroidserver/common.py msgid "Git clean failed" -msgstr "" +msgstr "Git clean imeshindwa" #: ../fdroidserver/common.py msgid "Git fetch failed" -msgstr "" +msgstr "Git fetch imeshindwa" #: ../fdroidserver/common.py msgid "Git prune failed" -msgstr "" +msgstr "Git prune imeshindwa" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" -msgstr "" +msgstr "Git remote set-head imeshindwa: \"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" -msgstr "" +msgstr "Git reset imeshindwa" #: ../fdroidserver/common.py msgid "Git submodule deinit failed" -msgstr "" +msgstr "Git submodule deinit imefeli" #: ../fdroidserver/common.py msgid "Git submodule sync failed" -msgstr "" +msgstr "Git Submodule sync imefeli" #: ../fdroidserver/common.py msgid "Git submodule update failed" -msgstr "" +msgstr "Git submodule update imefeli" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" -msgstr "" +msgstr "HTTPS lazima zitumike na URL za Subversion!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "" +msgstr "Ikiwa kioo cha git kinakua kikubwa, ruhusu kumbukumbu ifutwe" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "" +msgstr "Ikiwa kupakia hii inafeli, jaribu kupakia mwenyewe kwa {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "" +msgstr "Inapuuza '{field}' katika metadata ya '{metapath}' kwa sababu imepitwa na wakati." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" -msgstr "" +msgstr "Inapuuza ingizo la FUNDING.yml iliyo ndefu kuliko 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "" +msgstr "Inapuuza kipengee kibaya katika manisfest: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " -msgstr "" +msgstr "Inapuuza kifurushi kisicho na metadata: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" -msgstr "" +msgstr "Inapuuza data ya cache isiyo na maana kwa {apkfilename}" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "" +msgstr "Jumuisha APK ambazo zimesainiwa na algoriti zilizozimwa kama MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" -msgstr "" +msgstr "Jumuisha faili za sahihi za PGP .asc kwenye kioo" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" -msgstr "" +msgstr "Jumuisha logi za ujenzi kwenye kioo" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" -msgstr "" +msgstr "Jumuisha tarballs za chanzo kwenye kioo" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" -msgstr "" +msgstr "Inajumuisha metadata kutoka %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" -msgstr "" +msgstr "Inajumuisha metadata kutoka {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" -msgstr "" +msgstr "Kuanzisha submodules" #: ../fdroidserver/install.py msgid "Install all signed applications available" -msgstr "" +msgstr "Sakinisha apu zote zilizosainiwa zinazopatikana" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" -msgstr "" +msgstr "Sakinisha vifurushi vilivyojengwa kwenye vifaa" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." -msgstr "" +msgstr "Inasakinisha %s..." #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." -msgstr "" +msgstr "Inasakinisha '{apkfilename}' kwenye {dev}..." #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" -msgstr "" +msgstr "Wasiliana na seva ya ghala ya HTTP" #: ../fdroidserver/update.py msgid "Invalid APK" -msgstr "" +msgstr "APK iliyo batili" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "AutoUpdateMode iliyo batili: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "" +msgstr "UpdateCheckMode iliyo batili: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" -msgstr "" +msgstr "VercodeOperation iliyo batili: {field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" -msgstr "" +msgstr "VercodeOperation iliyo batili: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" -msgstr "" +msgstr "Kitambulisho batili cha apu {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" -msgstr "" +msgstr "Boolean iliyo batili '%s'" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" -msgstr "" +msgstr "Orodha ya vitone iliyo batili" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" -msgstr "" +msgstr "Jina batili kwa faili zilizochapishwa: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "ndk batili: ingizo la jenga: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " -msgstr "" +msgstr "Elekezo mpya batili kwa non-HTTPS:{before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" -msgstr "" +msgstr "metadata ya scrlib iliyo batili: '{file}' haipo" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" -msgstr "" +msgstr "Metadata ya srclib iliyo batili: haikuweza kuchambua '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "" +msgstr "Metadata batili ya srclib: ufunguo usiojulikana '{key}' katika '{file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" -msgstr "" +msgstr "Uthibitisho wa sahihi wa JAR ulishindwa: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" -msgstr "" +msgstr "Sahihi ya JAR imethibitishwa: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" -msgstr "" +msgstr "Faili ya JAR ya Java" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "" +msgstr "JDK ya Java haijapatikana! Sakinisha katika sehemu ya kiwango au seti java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" -msgstr "" +msgstr "darasa lililoharirirwa la Java" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" -msgstr "" +msgstr "jarsigner ya Java haijapatikana! Sakinisha katika sehemu ya kawaida au seti java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" -msgstr "" +msgstr "Javascript katika sifa za HTML src" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "" +msgstr "Kuweka jenga zilizofeli \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" -msgstr "" +msgstr "Hifadhi ya funguo ya ufunguo wa kusaini:\t" #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "" +msgstr "Ufunguo wa utatuzi unaojulikana inatumika kwa AllowedAPKSigningKeys: " #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "" +msgstr "Mabadiliko ya mwisho yaliyotumika ya '{commit}' yanafanana na tagi, lakini UpdateCheckMode ni '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" -msgstr "" +msgstr "Njia za mchango ya Liberapay inapatikana kwa Liberapay: field" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" -msgstr "" +msgstr "Orodhesha faili ambazo zitarekebishwa muundo (dry run)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" -msgstr "" +msgstr "Eneo limejumuishwa katika URL ya f-droid.org" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" -msgstr "" +msgstr "Fanya ujenzi kusimama kwa hitilafu" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." -msgstr "" +msgstr "vioo vya ghala yenye umbo mbovu." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" -msgstr "" +msgstr "Laini ya serverwebroot yenye umbo bovu:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "" +msgstr "Kina cha juu cha kurudiwa katika faili ya ZIP imefikiwa: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." -msgstr "" +msgstr "Akisi ghala mzima na uhifadhi, aina zote za faili." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" -msgstr "" +msgstr "Inakosa saraka ya pato" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" +msgstr "Inasongesha tamko la Anti-Features kwa faili zilizolocaliziwa:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" +msgstr "Si \"repo_pubkey\" wala \"keystorepass\" iliyowekwa kwenye config.yml" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" -msgstr "" +msgstr "Hakuna APK ya kifurushi: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" -msgstr "" +msgstr "Hakuna SDK ya Android Iliyopatikana!" #: ../fdroidserver/install.py msgid "No attached devices found" -msgstr "" +msgstr "Hakuna vifaa vilivyoambatanishwa vimepatikana" #: ../fdroidserver/index.py msgid "No fingerprint in URL." -msgstr "" +msgstr "Hakuna alama ya kidole kwenye URL." #: ../fdroidserver/common.py msgid "No git submodules available" -msgstr "" +msgstr "Hakuna submodule ya git inayopatikana" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" -msgstr "" +msgstr "Hakuna mradi wa gradle imeweza kupatikana. Bainisha --subdir?" #: ../fdroidserver/import_subcommand.py msgid "No information found." -msgstr "" +msgstr "Hakuna habari imepatikana." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" -msgstr "" +msgstr "Hakuna tagi zinazolingana imepatikana" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "" +msgstr "Hakuna toleo la chini zaidi la SDK limepatikana katika {0}, kutumia chaguo-msingi (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" -msgstr "" +msgstr "Hakuna haja ya kubainisha kuwa apu ni apu Huru" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" -msgstr "" +msgstr "Hiana haja ya kubainisha kuwa apu hio ni ya Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" -msgstr "" +msgstr "Hakuna chaguo lililowekwa! Hariri config.yml iseti angalau moja ya hizi:" #: ../fdroidserver/common.py msgid "No packages specified" -msgstr "" +msgstr "Hakuna vifurishi vilivyobainishwa" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" -msgstr "" +msgstr "Hakuna APK iliyosainiwa inayopatikana ya %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" -msgstr "" +msgstr "Hakuna saraka la pato lililosainiwa - hakuna cha kufanya" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" -msgstr "" +msgstr "Hakuna vyeti vya kusaini vimepatikana katika {path}" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" -msgstr "" +msgstr "Hakuna kifurushi kama vile: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" -msgstr "" +msgstr "Hakuna versionCode kama hio {versionCode} kwa apu {appid}" #: ../fdroidserver/checkupdates.py msgid "No tags found" -msgstr "" +msgstr "Hakuna tagi zilizopatikana" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" -msgstr "" +msgstr "Hakuna saraka isiyotiwa sahihi - hakuna la kufanya" #: ../fdroidserver/__main__.py msgid "No version information could be found." -msgstr "" +msgstr "Hakuna maelezo ya toleo iiliyopatikana." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" -msgstr "" +msgstr "Sio ufafanuzi halali wa ukubwa: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" -msgstr "" +msgstr "Hakuna la kufanya" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." -msgstr "" +msgstr "Hakuna la kufanya kwa {appid}." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" -msgstr "" +msgstr "Sasa seti hizi katika config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" -msgstr "" +msgstr "Faili ya OBB ina versionCode mpya ({integer}) kuliko APK yoyote:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" -msgstr "" +msgstr "Jina la faili ya OBB lazima ianze na \"main.\" au \"patch.\":" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" -msgstr "" +msgstr "Jina la kifurushi cha OBB hailingani na APK inayoungwa mkono:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" +msgstr "Machini iliyo nje ya mtandao, inapuuza uundaji wa kioo cha git mpaka 'fdroid deploy'" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" -msgstr "" +msgstr "PNG na JPEG pekee inakubalika katika mchoro, imepata: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" -msgstr "" +msgstr "Chapisha tofauti pekee na Play Store" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" -msgstr "" +msgstr "Chakata pekee apu zilizo na masasisho ya kiotomatiki" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "" +msgstr "Njia za Mchango wa OpenCollective inapatikana kwenye OpenCollective: uwanja" #: /usr/lib/python3.11/optparse.py msgid "Options" -msgstr "" +msgstr "Chaguo" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." -msgstr "" +msgstr "Toa ripoti ya JSON kwa faili iliyopewa jina la APK." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." -msgstr "" +msgstr "Toa JSON kwa stdout." #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" -msgstr "" +msgstr "Kuzalisha JSON" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." -msgstr "" +msgstr "Leseni ya jumla ya mradi ." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "" +msgstr "Kubatilisha toleo la jina tupu katika {apkfilename} kutoka kwa metadata: {version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" -msgstr "" +msgstr "Kifurushi \"{appid}\" tayari ipo" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" -msgstr "" +msgstr "Kuchambua manifest katika '{path}'" #: ../fdroidserver/common.py msgid "Password required with username" -msgstr "" +msgstr "Nenosiri linahitajika pamoja na jina la mtumiaji" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." -msgstr "" +msgstr "Ielekeze kwenye saraka ndogo ya mradi kuu wa Android, ikiwa haipo kwenye mzizi." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" -msgstr "" +msgstr "Ielekeze kwa SDK ya Android (mara nyingine husetiwa katika ANDROID_HOME)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" -msgstr "" +msgstr "Ielekeze kwa ghala ya git ili kutumia kama logi" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" -msgstr "" +msgstr "Ielekeze kwa keystore kwa ufunguo wa kusaini ghala" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" -msgstr "" +msgstr "Chapisha kigezo hicho cha siri kwa kidirisha cha amri kwa urahisi wa kunakili/kubandika" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" -msgstr "" +msgstr "Tatizo na faili ya ZIP:%s, hitilafu %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" -msgstr "" +msgstr "Tatiza na xml katika '{path}'" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" -msgstr "" +msgstr "Chakata masasisho ya kiotomatiki" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" -msgstr "" +msgstr "Kuchakata {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" -msgstr "" +msgstr "Kuchakata {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" -msgstr "" +msgstr "Chakata XML/JSON inayosomeka na binadamu kwa faili za index" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." -msgstr "" +msgstr "URL ya Mradi wa kuagiza kutoka." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" -msgstr "" +msgstr "Uakifishaji unapaswa kuepukwa" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" -msgstr "" +msgstr "Sukuma logi hio kwa ghala hili la mbali la git" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" -msgstr "" +msgstr "Kusukuma logi ya uwazi ya binari kwa {url}" #: ../fdroidserver/deploy.py msgid "Pushing to remote server failed!" -msgstr "" +msgstr "Kusukuma kwa seva ya mbali imefeli!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" -msgstr "" +msgstr "Kusukuma kwa {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" -msgstr "" +msgstr "Anzisha ghala mpya kwa haraka" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" -msgstr "" +msgstr "Soma faili zote za metadata na uondoke" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" -msgstr "" +msgstr "Kusoma '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" -msgstr "" +msgstr "Kusoma packageName/versionCode/versionName ilifeli, APK batili: '{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" -msgstr "" +msgstr "Kusoma packageName/versionCode/versionName ilifeli,APK batili: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" -msgstr "" +msgstr "Kusoma {apkfilename} kutoka kwa hifadhi ya muda" #: ../fdroidserver/build.py msgid "Refresh and cache scanner rules and signatures from the network" -msgstr "" +msgstr "Onyesha upya na uweke kwenye hifadhi ya muda kanuni za skana na sahihi kutoka kwenye mtandao" #: ../fdroidserver/common.py msgid "Removing specified files" -msgstr "" +msgstr "Kuondoa faili zilizobainishwa" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "Kuondoa {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" -msgstr "" +msgstr "Badilisha jina la faili za APK ambazo hazilingani na package.name_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "Hali ya kisasa ya RepoTrunk ni ya maana tu katika ghala za git-svn" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" +msgstr "Weka upya na uunde seva mpya ya kujenga, hata ikiwa ile iliopo inaonekana kuwa sawa." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" -msgstr "" +msgstr "Saini upya {apkfilename} kwa debug.keystore ulizopewa" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" -msgstr "" +msgstr "Badilisha ukubwa wa ikoni zote zinazopita saizi kubwa ya pixel kisha uondoke" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" -msgstr "" +msgstr "Zuia pato iwe onyo na hitilafu" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" -msgstr "" +msgstr "Andika upya faili zote za metadata" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" -msgstr "" +msgstr "Kuandika upya '{appid}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" -msgstr "" +msgstr "Tekeleza kwenye ghala ya git ambalo lina mabadiliko yasiyohifadhiwa" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" -msgstr "" +msgstr "Tekeleza rewritemeta ili kurekebisha uumbizaji" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" -msgstr "" +msgstr "Kutekeleza pasi ya kwanza na kuangalia kwa MD5 ikiwa imezimwa" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" -msgstr "" +msgstr "Kutekeleza wget katika {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "" +msgstr "SHA-256 ya {url} hailingani ingizo!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "" +msgstr "Skani APK Skani APK zilizotokana na mchakato kwa madarasa yasiyo huru yanayojulikana." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" -msgstr "" +msgstr "Changanua msimbo chanzo cha kifurushi" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" -msgstr "" +msgstr "Skana imepata matatizo {count} katika {apk}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" -msgstr "" +msgstr "Skana imepata matatizo {count} katika {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" -msgstr "" +msgstr "Skana imepata matatizo {count} katika {appid}:{versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Skana imepata tatizo {}" +msgstr[1] "Skana zimepata tatizo {}" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." -msgstr "" +msgstr "Kuchanganua APK kwa kutumia dexdump kwa madarasa yanayojulikana kuwa si huru." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "" +msgstr "Seti {release} ya NDK ( {version}) iwe juu" #: ../fdroidserver/common.py msgid "Set clock to that time using:" -msgstr "" +msgstr "Weka saa kwa wakati huo ukitumia:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "" +msgstr "Weka idadi ya juu ya matoleo katika ghala kabla zile mzee zimehifadhiwa kwenye kumbukumbu" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" -msgstr "" +msgstr "Seti kikomo cha faili iliyo wazi kwa {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" -msgstr "" +msgstr "Sanidha uundaji wa apu kwa ajili ya ghala la uundaji wa kila usiku" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " -msgstr "" +msgstr "Kuseti kikomo cha faili iliyo wazi imefeli: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" -msgstr "" +msgstr "Kuseti muda wa sekunde {0} kwa ajili ya ujenzi huu" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" -msgstr "" +msgstr "Saini na uweke vifurushi kwenye ghala" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" -msgstr "" +msgstr "Saini faharasa zilizoundwa kwa kutumia sasisho --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" -msgstr "" +msgstr "Ruka kuchanganua msimbo wa chanzo kwa binari na tatizo zingine" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" -msgstr "" +msgstr "Kuruka '{apkfilename}' iliyo na sahihi batili!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "Kuruka kioo cha GitLab Pages kwa sababu ghala ni kubwa mno (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" -msgstr "" +msgstr "Inaruka uzalishaji wa index kwa {appid}" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" -msgstr "" +msgstr "Inaruka {apkfilename} yenye sahihi batili!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" -msgstr "" +msgstr "Inaruka {appid}: Imezimwa" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" -msgstr "" +msgstr "Bainisha folda ya ndani ya kusawazisha hio ghala kwa" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" -msgstr "" +msgstr "Bainisha faili ya kutambuliwa ili kutoa kwa SSH kwa ajili ya kusawazisha tena" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." -msgstr "" +msgstr "Bainisha ni faili ya ufunguo wa debug wa kijaribio kutumia." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" -msgstr "" +msgstr "Toa habari hata zaidi ya kawaida" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" -msgstr "" +msgstr "Kuondoa saini ya siri kutoka {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" -msgstr "" +msgstr "Muhtasari '%s' ni jina tu ya apu hio" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" -msgstr "" +msgstr "Muhtasari ya urefu {length} ni juu ya {limit} kikomo cha char" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" -msgstr "" +msgstr "Saa ya mfumo ni mzee kuliko tarehe katika {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" +msgstr "Modi ya sasisho la tagi inafanya kazi tu kwa ghala za git,hg, bzr na git-svn kwa sasa" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" +msgstr "Hali ya usasisho ya tagi imetumika katika git-svn, lakini ghala haikusetiwa kwa kutumia tagi" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." -msgstr "" +msgstr "Hali ya majaribio - weka pato kwenye saraka ya tmp pekee, na uunde kila mara, hata kama pato tayari ipo." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" -msgstr "" +msgstr "Msimbo wa toleo la OBB lazima ije baada ya \"{name}.\":" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" -msgstr "" +msgstr "URL ya msingi kwa ghala hio kuweka kwenye logi (default: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" -msgstr "" +msgstr "Saraka ya kuandika kioo hicho kwa" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" -msgstr "" +msgstr "Faili hio ya kujumuishwa kwenye ghala (path or glob)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." -msgstr "" +msgstr "Alama ya kidole ya ghala hailingani." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" -msgstr "" +msgstr "Saraka ya mzizi ya local_copy_dir \"{path}\" haipo!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" -msgstr "" +msgstr "Kuna mgongano wa keyalias - uchapishaji umesitishwa" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." -msgstr "" +msgstr "Hizi ndizo apu zilizohifadhiwa kwenye kumbukumbu kutoka kwa ghala kuu." #: ../fdroidserver/mirror.py msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "" +msgstr "Amri hii haipaswi kamwe kutumika kuakisa f-droid.org! Nakala mzima inahitaji juu ya 600GB." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" +msgstr "Hii ni ghala ya apu ya kutumika na F-Droid. Apu katika ghala hii ni binaries rasmi zilizojengwa na wasanidi wa asili wa apu, au binaires zilizoundwa kutoka kwa chanzo na admin ya f-droid.org kutumia vifaa kwenye https://gitlab.com/fdroid." #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" -msgstr "" +msgstr "Ghala hii tayari in metadata ya ndani: %s" #: ../fdroidserver/init.py #, python-format @@ -1707,405 +1717,412 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" +"Ili kumaliza unsanidi huo, ongeza APK zako kwa \"%s\"\n" +"kisha kimbiza \"fdroid update -c; fdroid update\". Unawezataka pia kuhariri\n" +"\"config.yml\" ili kuseti URL, jina ya ghala, na zaidi. Unapaswa pia kusanidi\n" +"ufunguo wa kusaini (ya muda unawezakua umezalishwa kiotomatiki).\n" +"\n" +"Kwa maelezo zaidi: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"na https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" +msgstr "Ili kutumia awsbucket, awssecretkey na awsaccesskeiid lazima pia isetiwe katika config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" -msgstr "" +msgstr "URL lazima ianze na https:// or http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" -msgstr "" +msgstr "Vifupishaji vya URL havipaswi kutumika" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" -msgstr "" +msgstr "URL {url} katika Maelezo:{error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "" +msgstr "tagi ya leseni lisilotarajiwa \"{}\"! Tumia pekee tagi zilizoidhinishwa na FSF au OSI kutoka https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "" +msgstr "tagi ya leseni isiyotarajiwa \"{}\"! Tumia pekee tagi za leseni zilizosanidiwa katika faili yako ya usanidi" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" +msgstr "lengo la symlink lisiyotarajiwa:{link} -> {target}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "" +msgstr "ingilio lisilojulikana {key} katika {configname}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" -msgstr "" +msgstr "Kighairi kisichojulikana kimepatikana!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" -msgstr "" +msgstr "Faili isiyojulikana '{filename}' katika jenga '{versionName}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" -msgstr "" +msgstr "Fomati ya metadata isiyojulikana: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" -msgstr "" +msgstr "Fomati ya metadata isiyojulikana: {path} (tumia: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " -msgstr "" +msgstr "Toleo lisilojulikana la aapt, inaweza kuleta matatizo: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" -msgstr "" +msgstr "Nafasi ya mwanzo isiyo ya lazima" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" -msgstr "" +msgstr "Nafasi ya mwisho isiyo ya lazima" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" -msgstr "" +msgstr "nafasi ya apu isiyotambulika '{fieldname}' katika '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" -msgstr "" +msgstr "Bendera ya jenga isiyotambulika '{build_flag}' katika '{path}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" -msgstr "" +msgstr "Aina ya faili isiyoungwa mkono \"{extension}\" kwa ghala ya mchoro" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" -msgstr "" +msgstr "Faili ya michoro usioungwa mkono umepatikana: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" -msgstr "" +msgstr "extlib isiyotumika katika %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" -msgstr "" +msgstr "Faili lisilotumika katika %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" -msgstr "" +msgstr "Njia ya scandelete isiyotumika: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" -msgstr "" +msgstr "Njia ya scanignore isiyotumika: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "Kufungua zipu kwa %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" -msgstr "" +msgstr "Sasisha maelezo ya repo kwa vifurushi vipya" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" -msgstr "" +msgstr "Sasisha logi ya uwazi ya binary kwa URL" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" -msgstr "" +msgstr "UpdateCheckData ina URL batili: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" -msgstr "" +msgstr "UpdateCheckData lazima ilingane na msimbo wa toleo kama nambari (\\d or [0-9]): {codeex}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" -msgstr "" +msgstr "UpdateCheckData lazima itumie URL ya HTTPS: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" -msgstr "" +msgstr "UpdateCheckData si URL iliyo halali: {url}" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "" +msgstr "UpdateCheckMode imewekwa lakini inaonekana kama checkupdates haijatekelezwa bado." #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" +msgstr "UpdateCheckMode imewekwa lakini inaonekana kama likecheckupdates haijatekelezwa bado" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "" +msgstr "UpdateCheckName imesetiwa katika kitambulisho cha apu kinachojulikana. inaweza kutolewa" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" -msgstr "" +msgstr "Kupakia {apkfilename} kwa androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" -msgstr "" +msgstr "Kupakia {apkfilename} kwa virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" -msgstr "" +msgstr "Matumizi" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" -msgstr "" +msgstr "Matumizi: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "" +msgstr "Tumia /HEAD badala ya /master au /main kuashiria faili kwenye tawi la msingi" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" +msgstr "Tumia /HEAD badala ya /master kuashiria kwa fiaili katika tawi la msingi" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." -msgstr "" +msgstr "Tumia `fdroid update -C` kuiunda." #: ../fdroidserver/build.py msgid "Use build server" -msgstr "" +msgstr "Tumia seva ya ujenzi" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" +msgstr "Tumia tarehe kutoka APK badala ya wakati uliopo kwa APK mpya zilizoongezwa" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." -msgstr "" +msgstr "Kutumia \"{path}\" kwa kusanidi s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" -msgstr "" +msgstr "Kutumia Sahihi ya APK toleo la 2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" -msgstr "" +msgstr "Kutumia Sahihi ya APK toleo la 3" #: ../fdroidserver/common.py msgid "Using JAR Signature" -msgstr "" +msgstr "Kutumia sahihi ya JAR" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" -msgstr "" +msgstr "Kutumia jarsigner ya Java, haipendekezwi kwa kuthibitisha APK! Tumia apksigner" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" -msgstr "" +msgstr "Kutumia androguard kutoka \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" -msgstr "" +msgstr "Kutumia kamusi tupu badala ya maudhui ya {path}!" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" -msgstr "" +msgstr "Kutumia keystore iliyopo \"{path}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" -msgstr "" +msgstr "Kutumia s3cmd kusawazisha na: {url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" -msgstr "" +msgstr "Amri halali ni:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." -msgstr "" +msgstr "Thibitisha dhidi ya nakala iliyoakibishwa ndani afadhali kuliko kupakua upya." #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" -msgstr "" +msgstr "Thibitisha uadilifu wa furushi zilizopakuliwa" #: ../fdroidserver/index.py msgid "Verifying index signature:" -msgstr "" +msgstr "Inathibitisha sahihi ya faharasa:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "" +msgstr "ufunguo wa API ya VirusTotal haiwezi kupakia faili zaidi ya 32MB, tumia {url} kupakia {path}." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" -msgstr "" +msgstr "Onya kuhusu hitilafu ya metadata yanayoweza kutokea" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" -msgstr "" +msgstr "Ikiwa imesanidiwa kwa viashiria vilivyosainiwa, unda pekee indexes zisizosainiwa katika hatua hii" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "" +msgstr "Wakati unapochambua msimbo wa ghala mzima yamllint inalemazwa kwa chaguo msingi. Chaguo hili linalazimisha yamllint bila kujali." #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." -msgstr "" +msgstr "Wakati kusaini au kuthibitisha umefeli, toka na msimbo wa hitilafu." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" -msgstr "" +msgstr "X.509 'Distinguished Name' inayotumika wakati wa kuzalisha funguo" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" -msgstr "" +msgstr "Unaweza kutumia ANDROID_HOME kuseti njia ya SDK yako, kwa mfano:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" -msgstr "" +msgstr "kumbukumbu ya faili ya ZIP" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" -msgstr "" +msgstr "Inaongeza IdentityFile kwa {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" -msgstr "" +msgstr "Inaongeza kwa {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "" +msgstr "chaguo lisiloeleweka: %(option)s inaweza kulingana na %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" -msgstr "" +msgstr "chaguo lisiloeleweka: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "" +msgstr "apksigner haijapatikana! Haiwezi kusaini au kutibitisha APK ya kisasa" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" -msgstr "" +msgstr "apksigner haikupatikana, inahitajika kwa ajili ya kusaini!" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" -msgstr "" +msgstr "Kitambulisho cha apu cha faili kufanyia kazi" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" -msgstr "" +msgstr "Kitambulisho cha apu yenye versionCode iliyo ya hiari katika fomu APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" -msgstr "" +msgstr "archive_url ina haja ya kumaliza na with /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" -msgstr "" +msgstr "hoja \"-\" na modi %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" -msgstr "" +msgstr "hoja %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" -msgstr "" +msgstr "inajaribu uhusiano wa SSH ulio tupu ili kujaribu ufunguo wa kupeleka:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" -msgstr "" +msgstr "Haiwezi kuchanganua speci ya scrlib (sio kamba): '{}'" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "" +msgstr "Hiwezi kufungua '%(filename)s':%(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" -msgstr "" +msgstr "Haiwezi kufungua URL isiyo ya https: '{};" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" -msgstr "" +msgstr "Haiwezi kupata srclibs inayohitajika: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" -msgstr "" +msgstr "Haiwezi kuwa na hoja za subparser nyingi" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" -msgstr "" +msgstr "Haiwezi kuunganisha vitendo - vikundi viwili vimepewa jina %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" -msgstr "" +msgstr "Haiwezi kuchapisha sasisho, je, uliseti ufunguo wa kupeleka?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" -msgstr "" +msgstr "kukaririsha {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" -msgstr "" +msgstr "amri kutoka moduli za plugin:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" -msgstr "" +msgstr "changamani" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2113,74 +2130,74 @@ msgstr "" #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "kamba ya chaguo inayokinzana: %s" +msgstr[1] "kamba za chaguo inayokinzana: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser alias: %s" -msgstr "" +msgstr "lakabu la subparser inayokinzana: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser: %s" -msgstr "" +msgstr "subparser inayokinzana: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" -msgstr "" +msgstr "haikuweza kuchanganua '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "" +msgstr "haikuweza kuchanganua specifisheni ya srclib (hakuna jina limebainishwa): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "" +msgstr "haikuweza kuchanganua specifisheni ya srclib (hakuna rejeleo imebainishwa): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" +msgstr "haikuweza kuchanganua specifisheni ya srclib (saini nyingi mno za '@'): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" -msgstr "" +msgstr "iliunda {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "toleo la sasa ni jipya: old vercode={old}, new vercode={new}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" -msgstr "" +msgstr "kufuta: ghala/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" -msgstr "" +msgstr "logi ya mchakato uliosambazwa {path} hadi {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" -msgstr "" +msgstr "dest= inahitajika kwa chaguo kama %r" #: ../fdroidserver/scanner.py msgid "downloading '{}'" -msgstr "" +msgstr "Inapakua '{}'" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" -msgstr "" +msgstr "Inapakua sahihi za skana kutoka '{}' imefeli" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" -msgstr "" +msgstr "binari inayoweza kutekelezwa, ikiwezekana msimbo" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2188,321 +2205,321 @@ msgstr "" #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "ilitaraji hoja %s" +msgstr[1] "zilitaraji hoja %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" -msgstr "" +msgstr "ilitaraji angalau hoja moja" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" -msgstr "" +msgstr "Imetarajiwa isiwe zaidi ya hoja moja" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" -msgstr "" +msgstr "Ilitaraji hoja moja" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" -msgstr "" +msgstr "fdroid [] [-h|--help|--toleo|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" -msgstr "" +msgstr "Pakua toleo jipya zaidi za saini kutoka mtandao" #: /usr/lib/python3.11/optparse.py msgid "floating-point" -msgstr "" +msgstr "hatua ya kuelea" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." -msgstr "" +msgstr "lazimisha hitilafu za metadata (chaguo msingi) iwe maonyo, au iwe wa kupuuzwa." #: ../fdroidserver/common.py msgid "git svn clone failed" -msgstr "" +msgstr "svn clone ya git ilifeli" #: ../fdroidserver/scanner.py msgid "gzip file archive" -msgstr "" +msgstr "kumbukumbu ya faili ya gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" -msgstr "" +msgstr "Ilipuuza hoja ya wazi %r" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" -msgstr "" +msgstr "index-v1 lazima iwe na sahihi, tumia `fdroid signindex` kuiunda!" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "" +msgstr "index-v2 lazima iwe na sahihi, tumia `fdroid signindex` kuiunda!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" -msgstr "" +msgstr "nambari kamili" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" -msgstr "" +msgstr "Thamani batili ya %(type)s: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "" +msgstr "chaguo iliyo batili: %(value)r (chagua kutoka %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" -msgstr "" +msgstr "thamani ya conflict_resolution iliyo batili: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" -msgstr "" +msgstr "kamba ya chaguo iliyo batili %(option)r: lazima ianze na char %(prefix_chars)r" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" -msgstr "" +msgstr "ipfs haikupatikana, inaruka kuzalisha CIDcv1" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "recipe ya jenga ya hivi karibuni ni mpya zaidi: old vercode={old}, new vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" -msgstr "" +msgstr "local_copy_dir haikiwishi na \"fdroid\", labda ulimanisha: {path}" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" -msgstr "" +msgstr "local_copy_dir lazima iwe njia kamilifu!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" -msgstr "" +msgstr "local_copy_dir lazima iwe saraka, si faili!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" -msgstr "" +msgstr "kioo %s haikwishi na 'fdroid'!" #: ../fdroidserver/index.py #, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "" +msgstr "vioo vimesetiwa mara mbili, katika config.yml na {path}!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" -msgstr "" +msgstr "Hoja zisizounganishika lazima iwe ya hiari" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" -msgstr "" +msgstr "sasisho ya cache Ijayo {name} inatakiwa katika {time}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" -msgstr "" +msgstr "hakuna \"icon\" katika {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" -msgstr "" +msgstr "hakuna APK iliyowasilishwa" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" -msgstr "" +msgstr "hakuna chaguo kama hilo: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" -msgstr "" +msgstr "hakuna maelezo ya toleo imepatikana!" #: ../fdroidserver/checkupdates.py msgid "no version information found" -msgstr "" +msgstr "hakuna maelezo ya toleo zimepatikana" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" -msgstr "" +msgstr "haikubaliki na hoja %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" -msgstr "" +msgstr "moja ya hoja %s inahitajika" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" -msgstr "" +msgstr "inakubali pekee kamba, orodha, na jozi" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" +msgstr "chaguo %s: Ikiwa kweli unataka kusakinisha apu zote zilizosainiwa, tumia --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" -msgstr "" +msgstr "chaguo %s: thamani %s iliyo batili: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" +msgstr "chaguo %s: chaguo batili: %r(choose from %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" -msgstr "" +msgstr "chaguo -%s haitambuliki" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" -msgstr "" +msgstr "chaguo -%s inahitaji hoja" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" -msgstr "" +msgstr "chaguo --%s ni lazima isiwe na hoja" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" -msgstr "" +msgstr "chaguo --%s sio kiambishi awali cha kipekee" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" -msgstr "" +msgstr "chaguo --%s haitambuliki" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" -msgstr "" +msgstr "chaguo --%s linahitaji hoja" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" -msgstr "" +msgstr "hoja za hiari" #: /usr/lib/python3.11/argparse.py msgid "options" -msgstr "" +msgstr "chaguzi" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" -msgstr "" +msgstr "inaandika upya {path} inayopo" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" -msgstr "" +msgstr "hoja ya msimamo" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" -msgstr "" +msgstr "Mchakato wa kupeleka kwa logi {path} kwa {dest} imefeli!" #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "" +msgstr "binari ya rejeleo inakosa saini" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "" +msgstr "kataa kupakua kupitia muunganisho wa HTTP isiyo salama (tumia HTTPS au bainisha --no-https-check):{apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "" +msgstr "repo_icon \"repo/icons/%s\" haipo, inazalisha kishika nafasi." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" -msgstr "" +msgstr "repo_url ina haja ya kuisha na /repo" #: ../fdroidserver/deploy.py #, python-brace-format msgid "rsync is missing or broken: {error}" -msgstr "" +msgstr "rsync inakosa au imevunjika: {error}" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" +msgstr "ruamel.yaml haijasakinishwa, haiwezi kuandika metadata." #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" -msgstr "" +msgstr "s3cmd kusawazisha indexes {path} hadi {url} na kufuta" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" -msgstr "" +msgstr "cache ya skana in umbo bovu! Unaweza kufuta kwa: '{clear}'" #: ../fdroidserver/deploy.py msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "" +msgstr "serverwebroot: njia haikamiliki na \"fdroid\", labda ulimaanisha moja kati ya hizi:" #: ../fdroidserver/scanner.py msgid "shared library" -msgstr "" +msgstr "maktaba inayoshirikiwa" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" -msgstr "" +msgstr "onyesha nambari ya toleo la programu kisha uondoke" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py @@ -2510,257 +2527,257 @@ msgstr "" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" -msgstr "" +msgstr "onyesha ujumbe huu wa usaidizi na uondoke" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." -msgstr "" +msgstr "APK iliyosainiwa, aidha file-path au HTTPS URL." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "" +msgstr "ruka kupeleka logi kamili za jenga: mauthui ya logi ni tupu" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" -msgstr "" +msgstr "ruka kupeleka logi kamili za jenga: haijawezeshwa kwa config" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" -msgstr "" +msgstr "inaruka tarball ya chanzo: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" -msgstr "" +msgstr "srclibs inakosa jina na/au @" #: ../fdroidserver/scanner.py msgid "static library" -msgstr "" +msgstr "maktaba tuli" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "" +msgstr "binari ya rejeleo lililowasilishwa imeruhusu signer {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" -msgstr "" +msgstr "hoja zifuatazo zinahitajika: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" -msgstr "" +msgstr "Chaguo lisilotarajiwa: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "" +msgstr "kichanganuzi isiyojulikana %(parser_name)r (chaguo: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" -msgstr "" +msgstr "hoja zisizotambulika: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" -msgstr "" +msgstr "ruhusa zisizo salama kwenye '{config_file}' (inapaswa kuwa 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " -msgstr "" +msgstr "matumizi: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" -msgstr "" +msgstr "kutumia Apache libcloud kulandanisha na {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "" +msgstr "virustotal.com inapunguza kiwango, inangojea kujaribu tena..." #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "apu {0}, lakabu ya funguo {1}" +msgstr[1] "apu {0}, lakabu za funguo {1}" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" -msgstr "" +msgstr "{apkfilename} ({appid}) haina metadata!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" +msgstr "{apkfilename} ina faili nyingi za {name}, inaonekana kama shambulio la Master Key!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " -msgstr "" +msgstr "AndroidManifest.xml ya {apkfilename} ina tarehe mbaya: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." -msgstr "" +msgstr "{appid} hiana jina! Inatumia kitambulisho cha apu badala yake." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" -msgstr "" +msgstr "{appid} kutoka {path} si kitambulisho halali cha apu ya android!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" -msgstr "" +msgstr "{appid} kutoka {path} sio Jina halali la kifurushi cha Java!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid} ina vyote viwili APK pamoja na faili: {files}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" -msgstr "" +msgstr "{appid} inakosa {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" -msgstr "" +msgstr "{appid}: extlib isiyojulikana {path} katika jenga '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" -msgstr "" +msgstr "{appid}: hakuna jenga zilizobainishwa, inakimbia kwa hali ya sasa ya chanzo" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "" +msgstr "{appid}: {field} lazima iwe '{type}', bali ni '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" -msgstr "" +msgstr "{appid}: {field} lazima iwe '{type}', bali ni '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" -msgstr "" +msgstr "{build_flag} lazima iwe nambari kamili, imepatikana: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" -msgstr "" +msgstr "{build_flag} lazima iwe orodha au kamba, imepatikana: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" -msgstr "" +msgstr "{file} ni tupu au fisadi!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "" +msgstr "{name} \"{section}/icons/{path}\" haipo! Angalia \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "{oldfile} imewacha kutumika, tumia {newfile}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" -msgstr "" +msgstr "{path} tayari ipo, inapuuza matokeo ya kuagiza!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" -msgstr "" +msgstr "{path} haipo! Iunde kwa kukimbiza:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "" +msgstr "{path} ina sahihi mbaya ya faili \"{pattern}\", Uwezekano wa kunyonywa la Janus!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} has been flagged by virustotal {count} times:" -msgstr "" +msgstr "{path} imealamishwa na virustotal mara {count}:" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" +msgstr "{path} sio kamusi ya \"key: value\" , lakini ni {datatype}!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not a standard config file!" -msgstr "" +msgstr "{path} sio faili ya usanidi ulio na kiwango!" #: ../fdroidserver/index.py #, python-brace-format msgid "{path} is not list, but a {datatype}!" -msgstr "" +msgstr "{path} sio orodha, lakini ni {datatype}!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "" +msgstr "{path} sio {expected_type}, lakini ni {datatype}!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" -msgstr "" +msgstr "{path} ni saizi ya sefuri!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" -msgstr "" +msgstr "{path} zaidi ya 200MB , pakia kwa mkono: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" +msgstr "{path}: \"{code}\" ni msimbo wa nchi ya ISO_3166-1 alpha-2 batili!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" -msgstr "" +msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" -msgstr "" +msgstr "{url} haimaliziki na \"fdroid\", angalia njia ya URL!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" -msgstr "" +msgstr "{url} haianzi na \"http\"!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{} jenga imefeli" +msgstr[1] "{} jenga zimefeli" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{} jenga imefaulu" +msgstr[1] "{} jenga zimefaulu" From e545f5e24f7b9e95c694d62479113ea2605e6cad Mon Sep 17 00:00:00 2001 From: Maxi Date: Wed, 26 Jun 2024 13:09:15 +0200 Subject: [PATCH 1591/2116] Translated using Weblate: German (de) by Maxi Currently translated at 100.0% (580 of 580 strings) Co-authored-by: Maxi Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 85 ++++++++++++--------------- 1 file changed, 36 insertions(+), 49 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index cbab8823..cc199702 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -21,20 +21,21 @@ # ssantos , 2022, 2023. # "C. Rüdinger" , 2023. # VfBFan , 2024. +# Maxi , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-03-12 12:37+0000\n" -"Last-Translator: VfBFan \n" +"PO-Revision-Date: 2024-05-20 09:01+0000\n" +"Last-Translator: Maxi \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.6-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -117,7 +118,7 @@ msgstr "%(prog)s: Fehler: %(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "%d APKs konnten nicht signiert oder verifiziert werden!" #: ../fdroidserver/scanner.py #, python-format @@ -239,9 +240,9 @@ msgid "A URL is required as an argument!" msgstr "Als Argument wird eine URL benötigt!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "Keine Signaturzertifikate in {path} gefunden" +msgstr "APK-Signaturen haben verschiedene Zertifikate in {path}:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -321,9 +322,8 @@ msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode msgstr "App hat NoSourceSince oder ArchivePolicy \"0 Versionen\", aber AutoUpdateMode oder UpdateCheckMode sind nicht None" #: ../fdroidserver/lint.py -#, fuzzy msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "App hat NoSourceSince oder ArchivePolicy \"0 Versionen\", aber AutoUpdateMode oder UpdateCheckMode sind nicht None" +msgstr "App hat NoSourceSince oder ArchivePolicy \"0 versions\" oder 0, aber AutoUpdateMode oder UpdateCheckMode sind nicht None" #: ../fdroidserver/lint.py #, python-brace-format @@ -424,7 +424,7 @@ msgstr "Kategorien sind nicht festgelegt" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" +msgstr "Kategorie \"{category}\" definiert, aber für keine Apps verwendet!" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -595,12 +595,12 @@ msgstr "Länge der Beschreibung {length} übersteigt die zulässige Zeichenzahl #: ../fdroidserver/common.py #, python-brace-format msgid "Did you mean config/{name}.yml?" -msgstr "" +msgstr "Meinten Sie config/{name}.yml?" #: ../fdroidserver/lint.py #, python-brace-format msgid "Did you mean {code}?" -msgstr "" +msgstr "Meinten Sie {code}?" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" @@ -671,7 +671,7 @@ msgstr "Link in „{field}” duplizieren: {url}" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "FEHLER: %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -844,9 +844,8 @@ msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Mehrere JAR-Signaturzertifikate in {path} gefunden" #: ../fdroidserver/common.py -#, fuzzy msgid "Found multiple Signer Certificates!" -msgstr "Mehrere Signaturzertifikate für das Repository gefunden." +msgstr "Mehrere Signaturzertifikate für das Repository gefunden!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -913,9 +912,8 @@ msgid "Git reset failed" msgstr "Git reset fehlgeschlagen" #: ../fdroidserver/common.py -#, fuzzy msgid "Git submodule deinit failed" -msgstr "Git submodule update fehlgeschlagen" +msgstr "Git-Submodul deinit fehlgeschlagen" #: ../fdroidserver/common.py msgid "Git submodule sync failed" @@ -1124,7 +1122,7 @@ msgstr "Schlüsselspeicher für den Signierschlüssel:\t" #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "" +msgstr "Bekannte Debug-Schlüssel werden in AllowedAPKSigningKeys verwendet: " #: ../fdroidserver/lint.py #, python-brace-format @@ -1264,9 +1262,8 @@ msgid "No unsigned directory - nothing to do" msgstr "Kein unsigniertes Verzeichnis - nichts zu tun" #: ../fdroidserver/__main__.py -#, fuzzy msgid "No version information could be found." -msgstr "keine Versionsinformation gefunden" +msgstr "Es konnten keine Versionsinformation gefunden werden." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" @@ -1427,9 +1424,8 @@ msgid "Pushing binary transparency log to {url}" msgstr "Binäres Transparenz-Log nach {url} pushen" #: ../fdroidserver/deploy.py -#, fuzzy msgid "Pushing to remote server failed!" -msgstr "Git remote set-head fehlgeschlagen: \"%s\"" +msgstr "Schieben zum Remote-Server fehlgeschlagen!" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1465,9 +1461,8 @@ msgid "Reading {apkfilename} from cache" msgstr "Lese {apkfilename} aus dem Cache" #: ../fdroidserver/build.py -#, fuzzy msgid "Refresh and cache scanner rules and signatures from the network" -msgstr "Abrufen der neuesten Version von Signaturen aus dem Web" +msgstr "Aktualisieren und Zwischenspeichern von Scannerregeln und Signaturen aus dem Netzwerk" #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1719,11 +1714,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Dies sind die Apps, die aus dem Hauptrepository archiviert wurden." #: ../fdroidserver/mirror.py -#, fuzzy msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "" -"FEHLER: Dieser Befehl sollte niemals verwendet werden, um f-droid.org zu spiegeln!\n" -"Ein vollständiger Spiegel von f-droid.org erfordert mehr als 200 GB." +msgstr "Dieser Befehl sollte niemals verwendet werden, um f-droid.org zu spiegeln! Eine vollständige Kopie benötigt mehr als 600 GB." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." @@ -1895,13 +1887,12 @@ msgstr "UpdateCheckData hat eine ungültige URL: {url}" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "UpdateCheckMode ist gesetzt, aber likecheckupdates wurde vermutlich noch nicht ausgeführt" +msgstr "UpdateCheckMode ist gesetzt, aber likecheckupdates wurde vermutlich noch nicht ausgeführt." #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -#, fuzzy msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode ist gesetzt, aber likecheckupdates wurde vermutlich noch nicht ausgeführt" +msgstr "UpdateCheckMode ist gesetzt, aber likecheckupdates wurde anscheinend noch nicht ausgeführt" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -1931,9 +1922,8 @@ msgid "Usage: %s\n" msgstr "Syntax: %s\n" #: ../fdroidserver/lint.py -#, fuzzy msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "Verwenden Sie /HEAD anstelle von /master, um auf eine Datei im Hauptzweig zu verweisen" +msgstr "Verwenden Sie /HEAD anstelle von /master oder /main, um auf eine Datei im Hauptzweig zu verweisen" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" @@ -1965,9 +1955,8 @@ msgid "Using APK Signature v3" msgstr "Verwende APK-Signatur v3" #: ../fdroidserver/common.py -#, fuzzy msgid "Using JAR Signature" -msgstr "Verwende APK-Signatur v2" +msgstr "Verwende JAR Signatur" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -2028,7 +2017,7 @@ msgstr "Beim Linting des gesamten Repositoriums wird yamllint standardmäßig de #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." -msgstr "" +msgstr "Wenn das Signieren oder Verifizieren fehlschlägt, wird der Vorgang mit einem Fehlercode beendet." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2180,9 +2169,8 @@ msgid "could not parse '{path}'" msgstr "konnte '{path}' nicht parsen" #: ../fdroidserver/common.py -#, fuzzy msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "konnte srclib-Spezifikation nicht parsen (keine ref angegeben): '{}'" +msgstr "konnte srclib-Spezifikation nicht parsen (kein Name angegeben): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" @@ -2359,9 +2347,9 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "Spiegelserver '%s' ended nicht mit 'fdroid'!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "Legen Sie diese nun in der config.yml fest:" +msgstr "Mirrors zweimal gesetzt, in config.yml und {path}!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2523,7 +2511,7 @@ msgstr "repo_url muss mit /repo enden" #: ../fdroidserver/deploy.py #, python-brace-format msgid "rsync is missing or broken: {error}" -msgstr "" +msgstr "rsync fehlt oder ist kaputt: {error}" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." @@ -2540,9 +2528,8 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "Der Scanner-Cache ist fehlerhaft! Sie können ihn löschen mit: '{clear}'" #: ../fdroidserver/deploy.py -#, fuzzy msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "local_copy_dir endet nicht auf \"fdroid\", meinten Sie stattdessen: \"{path}\"" +msgstr "serverwebroot: Der Pfad endet nicht mit \"fdroid\", vielleicht meinten Sie einen dieser Pfade:" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2751,27 +2738,27 @@ msgstr "{path} hat die schlechte Dateisignatur \"{pattern}\", möglicher Janus-E #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} has been flagged by virustotal {count} times:" -msgstr "" +msgstr "{path} wurde von virustotal {count} Mal markiert:" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" +msgstr "{path} ist kein \"Schlüssel: Wert\"-Diktat, sondern ein {datatype}!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} is not a standard config file!" -msgstr "Kein 'sdk_path' in 'config.yml' festgelegt!" +msgstr "{path} ist keine Standard Config Datei!" #: ../fdroidserver/index.py #, python-brace-format msgid "{path} is not list, but a {datatype}!" -msgstr "" +msgstr "{path} ist keine Liste, sondern ein {datatype}!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "" +msgstr "{path} ist kein {expected_type}, sondern ein {datatype}!" #: ../fdroidserver/update.py #, python-brace-format @@ -2786,7 +2773,7 @@ msgstr "{path} ist größer als 200MB und muss manuell auf {url} hochgeladen wer #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" +msgstr "{path}: \"{code}\" ist kein gültiger ISO_3166-1 alpha-2 country code!" #: ../fdroidserver/update.py #, python-brace-format From d7ad6e9b5413773600024629f2e8776c8cc81f62 Mon Sep 17 00:00:00 2001 From: lucasmz-dev Date: Wed, 26 Jun 2024 13:09:15 +0200 Subject: [PATCH 1592/2116] Translated using Weblate: Portuguese (Brazil) (pt_BR) by lucasmz-dev Currently translated at 95.3% (553 of 580 strings) Co-authored-by: lucasmz-dev Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/ Translation: F-Droid/F-Droid Server --- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 7dd26d68..775715c9 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -9,20 +9,21 @@ # Eduardo Rodrigues , 2021. # Flavio F. M. , 2022. # The Cats , 2023. +# lucasmz-dev , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2023-08-18 15:51+0000\n" -"Last-Translator: The Cats \n" +"PO-Revision-Date: 2024-05-24 20:12+0000\n" +"Last-Translator: lucasmz-dev \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.0-dev\n" +"X-Generator: Weblate 5.6-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -105,7 +106,7 @@ msgstr "%(prog)s: erro: %(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "%d APKs falharam em serem assinados ou verificados!" #: ../fdroidserver/scanner.py #, python-format From c52c368b7596f0dd9653023c1c41e242d1bd5364 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Wed, 26 Jun 2024 13:09:15 +0200 Subject: [PATCH 1593/2116] Translated using Weblate: Spanish (es) by gallegonovato Currently translated at 100.0% (580 of 580 strings) Co-authored-by: gallegonovato Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ Translation: F-Droid/F-Droid Server --- locale/es/LC_MESSAGES/fdroidserver.po | 80 +++++++++++---------------- 1 file changed, 33 insertions(+), 47 deletions(-) diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 544a7a63..0adffae6 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -18,7 +18,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-04-10 18:44+0000\n" +"PO-Revision-Date: 2024-05-26 07:09+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" "Language: es\n" @@ -26,7 +26,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.6-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -109,7 +109,7 @@ msgstr "%(prog)s: error: %(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "¡%d APKs fallaron al ser firmados o verificados!" #: ../fdroidserver/scanner.py #, python-format @@ -231,9 +231,9 @@ msgid "A URL is required as an argument!" msgstr "¡Se requiere una URL como argumento!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "No se ha encontrado ningún certificado de firma en {path}" +msgstr "Las firmas APK tienen diferentes certificados en {path}:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -313,9 +313,8 @@ msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode msgstr "La aplicación tiene NoSourceSince o ArchivePolicy \"0 versiones\", pero AutoUpdateMode o UpdateCheckMode no es Ninguno" #: ../fdroidserver/lint.py -#, fuzzy msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "La aplicación tiene NoSourceSince o ArchivePolicy \"0 versiones\", pero AutoUpdateMode o UpdateCheckMode no es Ninguno" +msgstr "La aplicación tiene NoSourceSince o ArchivePolicy \"versiones 0\" o 0, pero AutoUpdateMode o UpdateCheckMode no son Ninguna" #: ../fdroidserver/lint.py #, python-brace-format @@ -416,7 +415,7 @@ msgstr "No se han establecido categorías" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" +msgstr "¡Categoría \"{category}\" definida pero no utilizada para ninguna aplicación!" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -587,12 +586,12 @@ msgstr "La descripción de longitud {length} supera el límite de caracteres, {l #: ../fdroidserver/common.py #, python-brace-format msgid "Did you mean config/{name}.yml?" -msgstr "" +msgstr "¿Quiere decir config/{name}.yml?" #: ../fdroidserver/lint.py #, python-brace-format msgid "Did you mean {code}?" -msgstr "" +msgstr "¿Querías decir {code}?" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" @@ -663,7 +662,7 @@ msgstr "Enlace duplicado en '{field}': {url}" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "ERROR: %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -836,9 +835,8 @@ msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Encontrados varios ficheros de bloque de firma JAR en {path}" #: ../fdroidserver/common.py -#, fuzzy msgid "Found multiple Signer Certificates!" -msgstr "Encontrados varios certificados de firma para el repositorio." +msgstr "¡Se han encontrado varios certificados de firmante!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -905,9 +903,8 @@ msgid "Git reset failed" msgstr "Git reset falló" #: ../fdroidserver/common.py -#, fuzzy msgid "Git submodule deinit failed" -msgstr "La actualización del submodulo de Git falló" +msgstr "Fallo en la desinstalación del submódulo Git" #: ../fdroidserver/common.py msgid "Git submodule sync failed" @@ -1116,7 +1113,7 @@ msgstr "Depósito de claves para la clave de firma de repositorio:\t" #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "" +msgstr "La clave de depuración conocida se utiliza en AllowedAPKSigningKeys: " #: ../fdroidserver/lint.py #, python-brace-format @@ -1256,9 +1253,8 @@ msgid "No unsigned directory - nothing to do" msgstr "No hay directorio sin firma - nada que hacer" #: ../fdroidserver/__main__.py -#, fuzzy msgid "No version information could be found." -msgstr "no se encontró información de la versión" +msgstr "No se ha podido encontrar información sobre la versión." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" @@ -1419,9 +1415,8 @@ msgid "Pushing binary transparency log to {url}" msgstr "Publicar el registro de transparencia binario en {url}" #: ../fdroidserver/deploy.py -#, fuzzy msgid "Pushing to remote server failed!" -msgstr "Git remote set-head falló: \"%s\"" +msgstr "¡Error al enviar al servidor remoto!" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1457,9 +1452,8 @@ msgid "Reading {apkfilename} from cache" msgstr "Leyendo {apkfilename} desde caché" #: ../fdroidserver/build.py -#, fuzzy msgid "Refresh and cache scanner rules and signatures from the network" -msgstr "obtener la última versión de las firmas de la web" +msgstr "Actualización y almacenamiento en caché de las reglas y firmas del escáner desde la red" #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1711,11 +1705,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Estas son aplicaciones del repositorio principal que se han archivado." #: ../fdroidserver/mirror.py -#, fuzzy msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "" -"ERROR: ¡esta orden no se debería usar nunca para replicar f-droid.org!\n" -"Una réplica completa de f-droid.org requiere más de 200GB." +msgstr "¡Este comando no debe usarse nunca para replicar f-droid.org!. Una copia completa requiere más de 600 GB." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." @@ -1891,9 +1882,8 @@ msgstr "UpdateCheckMode está configurado pero parece que aún no se han ejecuta #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -#, fuzzy msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode está configurado pero parece que aún no se han ejecutado las actualizaciones." +msgstr "UpdateCheckMode está activado pero parece que aún no se ha ejecutado checkupdates" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -1923,9 +1913,8 @@ msgid "Usage: %s\n" msgstr "Uso: %s\n" #: ../fdroidserver/lint.py -#, fuzzy msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "Use /HEAD en vez de /master para apuntar a un fichero en la rama por omisión" +msgstr "Utiliza /HEAD en lugar de /master o /main para apuntar a un archivo de la rama por defecto" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" @@ -1957,9 +1946,8 @@ msgid "Using APK Signature v3" msgstr "Utilizando firma APK v3" #: ../fdroidserver/common.py -#, fuzzy msgid "Using JAR Signature" -msgstr "Utilizando Firma APK v2" +msgstr "Utilizar la firma JAR" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -2020,7 +2008,7 @@ msgstr "Cuando se limpia el repositorio completo yamllint está deshabilitado po #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." -msgstr "" +msgstr "Cuando falla la firma o la verificación, sale con un código de error." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2172,9 +2160,8 @@ msgid "could not parse '{path}'" msgstr "no se pudo procesar '{path}'" #: ../fdroidserver/common.py -#, fuzzy msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "no se pudo procesar especificación srclib (sin especificar ref): '{}'" +msgstr "no se ha podido analizar la especificación srclib (no se ha especificado el nombre): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" @@ -2351,9 +2338,9 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "¡el espejo '%s' no termina en 'fdroid'!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "Ahora establezca lo siguiente en config.yml:" +msgstr "¡espejos establecidos dos veces, en config.yml y {path}!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2515,7 +2502,7 @@ msgstr "repo_url debe terminar con /repo" #: ../fdroidserver/deploy.py #, python-brace-format msgid "rsync is missing or broken: {error}" -msgstr "" +msgstr "rsync no existe o no funciona: {error}" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." @@ -2532,9 +2519,8 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "¡El escaner de la cache está mal realizado! Puedes borrarlo con: '{clear}'" #: ../fdroidserver/deploy.py -#, fuzzy msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "local_copy_dir no termina en \"fdroid\", tal vez quisiste decir: \"{path}\"" +msgstr "serverwebroot: la ruta no termina con \"fdroid\", tal vez se refería a uno de estos:" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2743,27 +2729,27 @@ msgstr "¡{path} tiene una firma de fichero \"{pattern}\" mala, posible exploit #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} has been flagged by virustotal {count} times:" -msgstr "" +msgstr "{path} ha sido marcado por virustotal {count} veces:" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" +msgstr "¡{path} no es un dict \"clave: valor\", sino un {datatype}!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} is not a standard config file!" -msgstr "¡'sdk_path' no establecido en 'config.yml'!" +msgstr "¡{path} no es un archivo de configuración estándar!" #: ../fdroidserver/index.py #, python-brace-format msgid "{path} is not list, but a {datatype}!" -msgstr "" +msgstr "¡{path} no es una lista, sino un {datatype}!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "" +msgstr "¡{path} no es {expected_type}, sino un {datatype}!" #: ../fdroidserver/update.py #, python-brace-format @@ -2778,7 +2764,7 @@ msgstr "{path} mayor de 200MB, subir manualmente: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" +msgstr "¡{path}: \"{code}\" no es un código de país ISO_3166-1 alpha-2 válido!" #: ../fdroidserver/update.py #, python-brace-format From aaf775481f964e88dbace2c64e168b6917adab6a Mon Sep 17 00:00:00 2001 From: gfbdrgng Date: Wed, 26 Jun 2024 13:09:15 +0200 Subject: [PATCH 1594/2116] Translated using Weblate: Russian (ru) by gfbdrgng Currently translated at 99.6% (578 of 580 strings) Co-authored-by: gfbdrgng Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translation: F-Droid/F-Droid Server --- locale/ru/LC_MESSAGES/fdroidserver.po | 85 ++++++++++++--------------- 1 file changed, 37 insertions(+), 48 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 2ee2f228..eb139c0c 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -13,20 +13,21 @@ # Andrei Stepanov , 2022. # Макар Разин , 2023. # Alexander Ivanov , 2024. +# gfbdrgng , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-02-23 12:59+0000\n" -"Last-Translator: Alexander Ivanov \n" +"PO-Revision-Date: 2024-05-26 07:09+0000\n" +"Last-Translator: gfbdrgng \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 5.5-dev\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Weblate 5.6-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -110,7 +111,7 @@ msgstr "%(prog)s: ошибка: %(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "%d APK не удалось подписать или проверить!" #: ../fdroidserver/scanner.py #, python-format @@ -232,9 +233,9 @@ msgid "A URL is required as an argument!" msgstr "В качестве аргумента нужен URL-адрес!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "В {path} не обнаружены сертификаты для подписывания" +msgstr "Подписи APK имеют различные сертификаты в {path}:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -316,7 +317,7 @@ msgstr "Приложение имеет NoSourceSince или ArchivePolicy \"0 #: ../fdroidserver/lint.py #, fuzzy msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "Приложение имеет NoSourceSince или ArchivePolicy \"0 версий\", но AutoUpdateMode или UpdateCheckMode не равны None" +msgstr "Приложение имеет NoSourceSince или ArchivePolicy \"0 версий\" или 0, но AutoUpdateMode или UpdateCheckMode не None" #: ../fdroidserver/lint.py #, python-brace-format @@ -418,7 +419,7 @@ msgstr "Категории не выбраны" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" +msgstr "Категория \"{category}\" определена, но не используется ни для одного приложения!" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -589,12 +590,12 @@ msgstr "Описание {length} превышает лимит по колич #: ../fdroidserver/common.py #, python-brace-format msgid "Did you mean config/{name}.yml?" -msgstr "" +msgstr "Вы имели в виду config/{name}.yml?" #: ../fdroidserver/lint.py #, python-brace-format msgid "Did you mean {code}?" -msgstr "" +msgstr "Вы имели в виду {code}?" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" @@ -665,7 +666,7 @@ msgstr "Точная копия ссылки в '{field}': {url}" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "ОШИБКА: %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -838,9 +839,8 @@ msgid "Found multiple JAR Signature Block Files in {path}" msgstr "В {path} обнаружено несколько сертификатов (JAR Signature Block File)" #: ../fdroidserver/common.py -#, fuzzy msgid "Found multiple Signer Certificates!" -msgstr "Для этого репозитория обнаружено несколько ключей для подписывания." +msgstr "Найдено несколько сертификатов подписи!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -909,7 +909,7 @@ msgstr "Не удалось отменить изменения (git reset)" #: ../fdroidserver/common.py #, fuzzy msgid "Git submodule deinit failed" -msgstr "Не удалось обновить модули Git (git submodules update)" +msgstr "Git-подмодуль deinit не удался" #: ../fdroidserver/common.py msgid "Git submodule sync failed" @@ -1118,7 +1118,7 @@ msgstr "Хранилище ключа для подписывания:→\t" #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "" +msgstr "Известный отладочный ключ используется в AllowedAPKSigningKeys: " #: ../fdroidserver/lint.py #, python-brace-format @@ -1258,9 +1258,8 @@ msgid "No unsigned directory - nothing to do" msgstr "Директории с неподписанными данными не существует. До новых встреч" #: ../fdroidserver/__main__.py -#, fuzzy msgid "No version information could be found." -msgstr "информация о версии не найдена" +msgstr "Информацию о версии найти не удалось." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" @@ -1421,9 +1420,8 @@ msgid "Pushing binary transparency log to {url}" msgstr "Публикация лога прозрачности кода в {url}" #: ../fdroidserver/deploy.py -#, fuzzy msgid "Pushing to remote server failed!" -msgstr "Не удалось настроить HEAD для удаленного репозитория (git remote set-head): \"%s\"" +msgstr "Передача данных на удаленный сервер не удалась!" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1459,9 +1457,8 @@ msgid "Reading {apkfilename} from cache" msgstr "Чтение {apkfilename} из кеша" #: ../fdroidserver/build.py -#, fuzzy msgid "Refresh and cache scanner rules and signatures from the network" -msgstr "получить последнюю версию подписей из интернета" +msgstr "Обновление и кэширование правил и сигнатур сканера из сети" #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1714,11 +1711,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Это те приложения, которые были заархивированы из основного репозитория." #: ../fdroidserver/mirror.py -#, fuzzy msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "" -"ОШИБКА: эту команду ни в коем случае нельзя использовать для создания зеркала f-droid.org!\n" -"Оно занимает больше 200 Гб." +msgstr "Эта команда никогда не должна использоваться для зеркалирования f-droid.org! Полная копия требует более 600 ГБ." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." @@ -1890,13 +1884,12 @@ msgstr "UpdateCheckData содержит некорректный URL-адрес #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "UpdateCheckMode настроен, но похоже, что команда checkupdates еще не была запущена" +msgstr "UpdateCheckMode установлен, но похоже, что checkupdates еще не запущен." #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -#, fuzzy msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode настроен, но похоже, что команда checkupdates еще не была запущена" +msgstr "UpdateCheckMode установлен, но похоже, что функцияheckupdates еще не запущена" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -1926,9 +1919,8 @@ msgid "Usage: %s\n" msgstr "Использование: %s\n" #: ../fdroidserver/lint.py -#, fuzzy msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "Указывайте /HEAD, а не /master, ссылаясь на файл в ветке по умолчанию" +msgstr "Используйте /HEAD вместо /master или /main, чтобы указать на файл в ветке по умолчанию" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" @@ -1960,9 +1952,8 @@ msgid "Using APK Signature v3" msgstr "Используется схема подписи APK v3" #: ../fdroidserver/common.py -#, fuzzy msgid "Using JAR Signature" -msgstr "Используется схема подписи APK v2" +msgstr "Использование подписи JAR" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -2023,7 +2014,7 @@ msgstr "При проверке целого репозитория, yamllint п #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." -msgstr "" +msgstr "При неудачном подписании или проверке выйдите с кодом ошибки." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2176,9 +2167,8 @@ msgid "could not parse '{path}'" msgstr "не удалось разобрать '{path}'" #: ../fdroidserver/common.py -#, fuzzy msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "не удалось разобрать спецификацию scrlib (не задана ссылка): '{}'" +msgstr "не удалось разобрать srclib spec (не указано имя): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" @@ -2356,9 +2346,9 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "адрес зеркала '%s' должен заканчиваться 'fdroid'!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "Определите эти переменные в config.yml:" +msgstr "Зеркала установлены дважды, в config.yml и {path}!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2520,7 +2510,7 @@ msgstr "repo_url должен оканчиваться «/repo»" #: ../fdroidserver/deploy.py #, python-brace-format msgid "rsync is missing or broken: {error}" -msgstr "" +msgstr "rsync отсутствует или сломан: {error}" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." @@ -2537,9 +2527,8 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "кэш сканера поврежден! Вы можете очистить его с помощью: '{clear}'" #: ../fdroidserver/deploy.py -#, fuzzy msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "local_copy_dir должна заканчиваться на \"fdroid\". Возможно, имелось в виду \"{path}\"" +msgstr "serverwebroot: путь не заканчивается на \"fdroid\", возможно, вы имели в виду что-то из этого:" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2749,27 +2738,27 @@ msgstr "{path}: неверная подпись \"{pattern}\". Выглядит #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} has been flagged by virustotal {count} times:" -msgstr "" +msgstr "{path} был отмечен virustotal {count} раз:" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" +msgstr "{path} - это не диктант \"ключ: значение\", а {datatype}!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} is not a standard config file!" -msgstr "'sdk_path' не найден в config.yml!" +msgstr "{path} не является стандартным файлом конфигурации!" #: ../fdroidserver/index.py #, python-brace-format msgid "{path} is not list, but a {datatype}!" -msgstr "" +msgstr "{path} - это не список, а {datatype}!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "" +msgstr "{path} - это не {expected_type}, а {datatype}!" #: ../fdroidserver/update.py #, python-brace-format @@ -2784,7 +2773,7 @@ msgstr "Размер {path} больше 200MB, загрузите его вру #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" +msgstr "{path}: \"{code}\" не является действительным кодом страны ISO_3166-1 alpha-2!" #: ../fdroidserver/update.py #, python-brace-format From fe768cb7347f6de9b59951b952db07d9c20d7a9c Mon Sep 17 00:00:00 2001 From: hugoalh Date: Wed, 26 Jun 2024 13:09:15 +0200 Subject: [PATCH 1595/2116] Translated using Weblate: Chinese (Traditional) (zh_Hant) by hugoalh Currently translated at 73.9% (429 of 580 strings) Translated using Weblate: Chinese (Traditional) (zh_Hant) by hugoalh Currently translated at 73.6% (427 of 580 strings) Co-authored-by: hugoalh Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hant/ Translation: F-Droid/F-Droid Server --- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 172 +++++++++------------ 1 file changed, 77 insertions(+), 95 deletions(-) diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index ce20cfa5..2c6e3bf8 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -5,20 +5,21 @@ # NightFeather , 2020. # ifurther , 2021. # Stiffen , 2021. +# hugoalh , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-04-10 13:33+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2024-05-29 05:09+0000\n" +"Last-Translator: hugoalh \n" "Language-Team: Chinese (Traditional) \n" "Language: zh_Hant\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.6-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -43,9 +44,9 @@ msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s 1/\" 沒有符合的中介資料檔案!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "local_copy_dir \"{path}\" 根目錄不存在!" +msgstr "「local_copy_dir」{path} 不存在!" #: ../fdroidserver/install.py #, python-brace-format @@ -75,7 +76,7 @@ msgstr "\"{path}\" 不是可接受的格式,轉換成: metadata/*.yml" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "" +msgstr "「{path}」由不允許的金鑰簽署:" #: ../fdroidserver/import_subcommand.py #, python-brace-format @@ -93,14 +94,14 @@ msgstr[0] "%(option)s 的選項需要 %(number)d 參數" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py -#, fuzzy, python-format +#, python-format msgid "%(prog)s: error: %(message)s\n" -msgstr "%(prog)s: 錯誤: %(message)s\n" +msgstr "%(prog)s:錯誤:%(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "%d 個 APK 無法簽署或驗證!" #: ../fdroidserver/scanner.py #, python-format @@ -110,7 +111,6 @@ msgstr "發現 %d 個問題" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py -#, fuzzy msgid "%prog [options]" msgstr "%prog [選項]" @@ -124,12 +124,12 @@ msgstr "%r 不可呼叫" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" -msgstr "" +msgstr "%s 沒有產生字典!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" -msgstr "" +msgstr "%s 的 SHA-256 值不正確:%s" #: ../fdroidserver/lint.py #, python-format @@ -170,9 +170,8 @@ msgid "'required' is an invalid argument for positionals" msgstr "這些地方的 '必填' 為無效引數" #: ../fdroidserver/common.py -#, fuzzy msgid "'sdk_path' not set in config.yml!" -msgstr "'config.yml' 未設定 'sdk_path'!" +msgstr "未在 config.yml 中設定「sdk_path」!" #: ../fdroidserver/common.py #, python-brace-format @@ -192,7 +191,7 @@ msgstr "'{path}' 無法執行!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "「{path}」的格式無效,它應該是一個字典!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format @@ -202,7 +201,7 @@ msgstr "{appid} 的 {value}' 為無效 {field}。正規表遠格式:{pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "" +msgstr "「{value}」不是有效的 {field},應該為 {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -224,9 +223,9 @@ msgid "A URL is required as an argument!" msgstr "需要 URL 作為參數!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "{path} 找不到簽署證書" +msgstr "APK 簽章在 {path} 中有不同的憑證:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -251,7 +250,7 @@ msgstr "在金鑰庫裡軟體庫簽署金鑰的別名" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "缺少 AllowedAPKSigningKeys,但是提供了參考二進位文件" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" @@ -266,19 +265,16 @@ msgid "Also warn about formatting issues, like rewritemeta -l" msgstr "還要提醒格式化問題,如 rewritemeta -l" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Android AAR library" -msgstr "Android AAR 庫" +msgstr "Android AAR 程式庫" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Android APK file" -msgstr "Android APK 文件" +msgstr "Android APK 檔案" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Android DEX code" -msgstr "Android DEX 碼" +msgstr "Android DEX 程式碼" #: ../fdroidserver/init.py #, python-brace-format @@ -296,21 +292,21 @@ msgid "Android SDK path '{path}' is not a directory!" msgstr "Android SDK 路徑 '{path}' 不是目錄資料夾!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "找到 Android SDK 工具 {cmd} 了!" +msgstr "找不到 Android SDK 工具 {cmd}!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "應用程式具有二進位文件,但是沒有相應的 AllowedAPKSigningKeys 來固定憑證。" #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" +msgstr "應用程式有 NoSourceSince 或 ArchivePolicy「0 versions」,但是 AutoUpdateMode 或 UpdateCheckMode 不是「None」" #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" +msgstr "應用程式有 NoSourceSince 或 ArchivePolicy「0 versions」或「0」,但是 AutoUpdateMode 或 UpdateCheckMode 不是「None」" #: ../fdroidserver/lint.py #, python-brace-format @@ -319,7 +315,7 @@ msgstr "應用軟體在 '{repo}' 倉庫,但有一個 {url} 連結" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "應用程式版本具有二進位文件,但是沒有相應的 AllowedAPKSigningKeys 來固定憑證。" #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -332,12 +328,12 @@ msgstr "以無效的簽名歸檔 {apkfilename}!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." -msgstr "" +msgstr "AutoUpdateMode 與 UpdateCheckMode:HTTP 必須有一個模式。" #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "鏡像配置中的錯誤條目類型「{mirrortype}」:{mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -355,9 +351,9 @@ msgid "Branch '{branch}' used as commit in srclib '{srclib}'" msgstr "分支 '{branch}' 用於 srclib '{srclib}' 的提交" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Broken symlink: {path}" -msgstr "無效的連結:{path}" +msgstr "損壞的符號連結:{path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" @@ -386,7 +382,7 @@ msgstr "軟體庫的編譯依照 \"%s\" 與此設定:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "無法自動更新沒有 CurrentVersionCode 的應用程式" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -410,7 +406,7 @@ msgstr "類別未設定" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" +msgstr "已定義類別「{category}」,但是未用於任何應用程式!" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -430,9 +426,9 @@ msgid "Comma separated list of categories." msgstr "以逗號分隔類別清單。" #: ../fdroidserver/__main__.py -#, fuzzy, python-format +#, python-format msgid "Command '%s' not recognised.\n" -msgstr "無法識別指令 '%s' 。\n" +msgstr "無法識別指令「%s」。\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" @@ -459,14 +455,12 @@ msgid "Could not find '{command}' on your system" msgstr "在您的系統上找不到 '{command}'" #: ../fdroidserver/import_subcommand.py -#, fuzzy msgid "Could not find latest version code" -msgstr "找不到最新版的代碼" +msgstr "找不到最新版本程式碼" #: ../fdroidserver/import_subcommand.py -#, fuzzy msgid "Could not find latest version name" -msgstr "找不到最新的版本名稱" +msgstr "找不到最新版本名稱" #: ../fdroidserver/update.py #, python-brace-format @@ -479,19 +473,17 @@ msgid "Could not open APK {path} for analysis: " msgstr "無法開啟 APK 檔{path}案作分析 : " #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" -msgstr "無法解析大小 (\"{size}\") , \"{type}\" 是錯的" +msgstr "無法解析大小「{size}」,錯誤類型「{type}」" #: ../fdroidserver/import_subcommand.py -#, fuzzy msgid "Couldn't find Application ID" -msgstr "找不到應用的 ID" +msgstr "找不到應用程式 ID" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "Couldn't find any version information" -msgstr "找不到最新版本名稱" +msgstr "找不到任何版本資訊" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" @@ -550,14 +542,14 @@ msgid "Delete APKs and/or OBBs without metadata from the repo" msgstr "從軟體庫刪除缺少中介資料的 APK 和/或 OBB" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "正在刪除檔案, 軟體庫已經滿了({size} / {limit})" +msgstr "正在刪除存檔,軟體庫太大({size},最大 {limit})" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "正在刪除 git-mirror 的歷史檔案, 軟體庫已經滿了 ({size} / {limit})" +msgstr "正在刪除 git-mirror 歷史記錄,軟體庫太大({size},最大 {limit})" #: ../fdroidserver/update.py #, python-brace-format @@ -586,17 +578,16 @@ msgstr "描述的長度 {length} 已超過 {limit} 個字符限制" #: ../fdroidserver/common.py #, python-brace-format msgid "Did you mean config/{name}.yml?" -msgstr "" +msgstr "你是指 config/{name}.yml 嗎?" #: ../fdroidserver/lint.py #, python-brace-format msgid "Did you mean {code}?" -msgstr "" +msgstr "你是指 {code} 嗎?" #: ../fdroidserver/import_subcommand.py -#, fuzzy msgid "Do not add 'disable:' to the generated build entries" -msgstr "不要在生成的編譯路徑中添加 'disable:'" +msgstr "不要將「disable:」加入到產生的建置條目中" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" @@ -634,7 +625,7 @@ msgstr "下載小型軟體庫完整的鏡像" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "正在下載 %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." @@ -648,12 +639,12 @@ msgstr "{url} 下載失敗,錯誤訊息 {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "" +msgstr "{path} 中的重複反特徵宣告已被忽略!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "" +msgstr "鏡像配置中存在重複條目「%s」!" #: ../fdroidserver/lint.py #, python-brace-format @@ -663,12 +654,11 @@ msgstr "'{field}' 有重複的連結:{url}" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "錯誤:%(message)s" #: ../fdroidserver/__main__.py -#, fuzzy msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "ERROR: 子命令 \"server\" 已經被移除了, 請使用 \"deploy\" !" +msgstr "錯誤:「server」子指令已經刪除,請使用「deploy」!" #: ../fdroidserver/mirror.py msgid "" @@ -685,12 +675,12 @@ msgstr "出錯:未支援 CI 類型,歡迎補強!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "" +msgstr "錯誤:不支援的 git 主機「%s」,歡迎提交修補!" #: ../fdroidserver/__main__.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "編碼已被設置為 '{enc}' fdroid 可能出現了編碼問題。 為了達到較好的效果, 請將編碼設置為 'UTF-8'。" +msgstr "編碼被設定為「{enc}」fdroid 可能會遇到編碼問題。請將其設定為「UTF-8」以獲得最佳結果。" #: ../fdroidserver/init.py #, python-format @@ -712,20 +702,20 @@ msgstr "在接取軟體庫的地址時出錯" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" +msgstr "如果發現問題,則以非零代碼退出" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "" +msgstr "從來源儲存庫中提取應用程式元數據" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" msgstr "自 APKs 捽取出簽名" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Failed copying {path}: {error}" -msgstr "讀取路徑 {path} 失敗:錯誤訊息{error}" +msgstr "無法複製 {path}:{error}" #: ../fdroidserver/signatures.py #, python-brace-format @@ -758,9 +748,8 @@ msgid "Failed to get APK information, skipping {path}" msgstr "無法取得 APK 資訊,略過 {path}" #: ../fdroidserver/update.py -#, fuzzy msgid "Failed to get APK signing key fingerprint" -msgstr "無法取得 APK 單號資訊" +msgstr "無法取得 APK 簽章金鑰指紋" #: ../fdroidserver/install.py #, python-brace-format @@ -782,9 +771,9 @@ msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" msgstr "抓取 '{apkfilename}' 的簽署資料 -> '{sigdir}'" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "File disappeared while processing it: {path}" -msgstr "檔案 「{path}」在處理過程中消失了" +msgstr "檔案在處理時消失:{path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py @@ -793,9 +782,8 @@ msgid "Finished" msgstr "已完成" #: ../fdroidserver/lint.py -#, fuzzy msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Flattr 捐款方式在 FlattrID 標誌下" +msgstr "Flattr 捐贈方法屬於 FlattrID: field" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" @@ -811,9 +799,8 @@ msgid "Force halting build after {0} sec timeout!" msgstr "在 {0} 秒超時後強制停止構建!" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Force scan of disabled apps and builds." -msgstr "強制掃描被禁用的軟體和二進制檔案 。" +msgstr "強制掃描已停用的應用程式和建構。" #: ../fdroidserver/update.py #, python-brace-format @@ -835,14 +822,13 @@ msgid "Found invalid versionCodes for some apps" msgstr "有些應用的版本代號無效" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "{path} 找到多筆簽名證書" +msgstr "在 {path} 中找到多個 JAR 簽署區塊檔案" #: ../fdroidserver/common.py -#, fuzzy msgid "Found multiple Signer Certificates!" -msgstr "軟體庫找到多份簽署證書。" +msgstr "找到多個簽署者憑證!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -865,17 +851,17 @@ msgstr "%s 中找到 non-file" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" -msgstr "" +msgstr "在 {url} 中找到 {apkfilename}" #: ../fdroidserver/scanner.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Found {count} problems in {filename}" -msgstr "在 {filename} 發現{count} 個問題" +msgstr "在 {filename} 中發現 {count} 個問題" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" -msgstr "" +msgstr "在 {filename} 中找到 {count} 個警告" #: ../fdroidserver/update.py #, python-brace-format @@ -896,9 +882,8 @@ msgid "Git fetch failed" msgstr "Git 抓取失敗" #: ../fdroidserver/common.py -#, fuzzy msgid "Git prune failed" -msgstr "Git 重置失敗" +msgstr "Git 修剪失敗" #: ../fdroidserver/common.py #, python-format @@ -910,9 +895,8 @@ msgid "Git reset failed" msgstr "Git 重置失敗" #: ../fdroidserver/common.py -#, fuzzy msgid "Git submodule deinit failed" -msgstr "Git 子模組更新失敗" +msgstr "Git 子模組去初始化失敗" #: ../fdroidserver/common.py msgid "Git submodule sync failed" @@ -1333,7 +1317,6 @@ msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "OpenCollective 的捐款方式在 OpenCollective: 的標誌下面" #: /usr/lib/python3.11/optparse.py -#, fuzzy msgid "Options" msgstr "選項" @@ -2388,9 +2371,9 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "鏡像 '%s' 並不是以 'fdroid' 作結尾!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "現在設定這些在 config.yml 中:" +msgstr "設定了兩次鏡像,分別在 config.xml 和 {path} 中!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2572,9 +2555,8 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" #: ../fdroidserver/deploy.py -#, fuzzy msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "local_copy_dir 未以 \"fdroid\"結尾,也許你指示的是: \"{path}\"" +msgstr "serverwebroot: 路徑沒有以「fdroid」結尾,也許你想表達的是這些之一:" #: ../fdroidserver/scanner.py #, fuzzy From c7af6b439e4c6c8adb56532740afce6cd45a8cde Mon Sep 17 00:00:00 2001 From: pitroig Date: Wed, 26 Jun 2024 13:09:15 +0200 Subject: [PATCH 1596/2116] Translated using Weblate: Catalan (ca) by pitroig Currently translated at 4.4% (26 of 580 strings) Co-authored-by: pitroig Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ca/ Translation: F-Droid/F-Droid Server --- locale/ca/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index 874a5eed..818ad55d 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-05-05 12:37+0000\n" +"PO-Revision-Date: 2024-05-27 18:43+0000\n" "Last-Translator: pitroig \n" "Language-Team: Catalan \n" "Language: ca\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.5.3\n" +"X-Generator: Weblate 5.6-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -2111,7 +2111,7 @@ msgstr "" #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" -msgstr "" +msgstr "complex" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py From 82f0d13f75ea8e60829140500f5386514eaabb55 Mon Sep 17 00:00:00 2001 From: WaldiS Date: Wed, 26 Jun 2024 13:09:15 +0200 Subject: [PATCH 1597/2116] Translated using Weblate: Polish (pl) by WaldiS Currently translated at 98.1% (569 of 580 strings) Translated using Weblate: Polish (pl) by WaldiS Currently translated at 97.5% (566 of 580 strings) Translated using Weblate: Polish (pl) by WaldiS Currently translated at 97.2% (564 of 580 strings) Co-authored-by: WaldiS Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ Translation: F-Droid/F-Droid Server --- locale/pl/LC_MESSAGES/fdroidserver.po | 41 ++++++++++++--------------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 8632ee46..397500a4 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -1,6 +1,6 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# WaldiS , 2020, 2021. +# WaldiS , 2020, 2021, 2024. # Michal L , 2020, 2021. # mondstern , 2021. # Hans-Christoph Steiner , 2021. @@ -10,15 +10,15 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-05-15 18:13+0000\n" -"Last-Translator: Agnieszka C \n" +"PO-Revision-Date: 2024-06-26 11:09+0000\n" +"Last-Translator: WaldiS \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.6-dev\n" +"X-Generator: Weblate 5.6-rc\n" #: ../fdroidserver/nightly.py msgid "" @@ -226,7 +226,7 @@ msgstr "Adres URL jest wymagany jako argument!" #: ../fdroidserver/common.py #, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "Podpisy plików APK mają różne certyfikaty w {ścieżce}:" +msgstr "Podpisy plików APK mają różne certyfikaty w {path}:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -1107,8 +1107,9 @@ msgid "Keystore for signing key:\t" msgstr "Magazyn kluczy do podpisywania klucza:\t" #: ../fdroidserver/lint.py +#, fuzzy msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "" +msgstr "Znany klucz debugowania jest używany w AllowedAPKSigningKeys: " #: ../fdroidserver/lint.py #, python-brace-format @@ -1447,9 +1448,8 @@ msgid "Reading {apkfilename} from cache" msgstr "Czytanie {apkfilename} z pamięci podręcznej" #: ../fdroidserver/build.py -#, fuzzy msgid "Refresh and cache scanner rules and signatures from the network" -msgstr "pobierz najnowszą wersję sygnatur z sieci" +msgstr "Odświeżanie i buforowanie reguł skanera i sygnatur z sieci" #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1702,11 +1702,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "To są aplikacje, które zostały zarchiwizowane w głównym repozytorium." #: ../fdroidserver/mirror.py -#, fuzzy msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "" -"BŁĄD: tego polecenia nigdy nie należy używać do zwierciadlania f-droid.org!\n" -"Pełne lustro f-droid.org wymaga ponad 200 GB." +msgstr "To polecenie nigdy nie powinno być używane do tworzenia kopii lustrzanej f-droid.org! Pełna kopia wymaga więcej niż 600 GB." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." @@ -2011,7 +2008,7 @@ msgstr "Podczas linkowania całego repozytorium yamllint jest domyślnie wyłąc #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." -msgstr "" +msgstr "Jeśli podpisanie lub weryfikacja nie powiedzie się, zakończ z kodem błędu." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2164,9 +2161,8 @@ msgid "could not parse '{path}'" msgstr "nie można przeanalizować '{path}'" #: ../fdroidserver/common.py -#, fuzzy msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "could not parse srclib spec (no ref specified):' {}'" +msgstr "nie można przeanalizować specyfikacji srclib (nie podano nazwy): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" @@ -2346,7 +2342,7 @@ msgstr "mirror '%s'nie kończy się na 'fdroid'!" #: ../fdroidserver/index.py #, fuzzy, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "Teraz ustaw je w config.yml:" +msgstr "lustra ustawione dwukrotnie, w config.yml i {path}!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2508,7 +2504,7 @@ msgstr "repo_url musi kończyć się na /repo" #: ../fdroidserver/deploy.py #, python-brace-format msgid "rsync is missing or broken: {error}" -msgstr "" +msgstr "rsync nie działa lub działa nieprawidłowo: {error}" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." @@ -2525,9 +2521,8 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "pamięć podręczna skanera jest zniszczona! Możesz to wyczyścić poleceniem: „{clear}”" #: ../fdroidserver/deploy.py -#, fuzzy msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "local_copy_dir nie kończy się na \"fdroid\", może masz na myśli: \"{path}\"" +msgstr "serverwebroot: ścieżka nie kończy się na \"fdroid\", być może miałeś na myśli jedno z tych:" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2735,9 +2730,9 @@ msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} ma zły podpis pliku \"{pattern}\", możliwe wykorzystanie Janusa!" #: ../fdroidserver/deploy.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{path} has been flagged by virustotal {count} times:" -msgstr "" +msgstr "{ścieżka} została oznaczona przez virustotal {liczba} razy:" #: ../fdroidserver/common.py #, python-brace-format @@ -2745,9 +2740,9 @@ msgid "{path} is not \"key: value\" dict, but a {datatype}!" msgstr "" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} is not a standard config file!" -msgstr "'sdk_path' nie jest ustawiony w config.yml!" +msgstr "{path} nie jest standardowym plikiem konfiguracyjnym!" #: ../fdroidserver/index.py #, python-brace-format From d36712c4c7e710510b408556ad3c303c8bba8a65 Mon Sep 17 00:00:00 2001 From: neverender Date: Wed, 26 Jun 2024 13:09:15 +0200 Subject: [PATCH 1598/2116] Translated using Weblate: Russian (ru) by neverender Currently translated at 99.8% (579 of 580 strings) Co-authored-by: neverender Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translation: F-Droid/F-Droid Server --- locale/ru/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index eb139c0c..749576fb 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -14,13 +14,14 @@ # Макар Разин , 2023. # Alexander Ivanov , 2024. # gfbdrgng , 2024. +# neverender , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-05-26 07:09+0000\n" -"Last-Translator: gfbdrgng \n" +"PO-Revision-Date: 2024-06-07 10:15+0000\n" +"Last-Translator: neverender \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" @@ -907,9 +908,8 @@ msgid "Git reset failed" msgstr "Не удалось отменить изменения (git reset)" #: ../fdroidserver/common.py -#, fuzzy msgid "Git submodule deinit failed" -msgstr "Git-подмодуль deinit не удался" +msgstr "Деинициализация подмодуля Git не удалась" #: ../fdroidserver/common.py msgid "Git submodule sync failed" From d0054d3f89699ec026c416b9a432b9d6d1b62079 Mon Sep 17 00:00:00 2001 From: Christopher Forzy Date: Wed, 26 Jun 2024 13:09:15 +0200 Subject: [PATCH 1599/2116] Translated using Weblate: French (fr) by Christopher Forzy Currently translated at 95.1% (552 of 580 strings) Co-authored-by: Christopher Forzy Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 81d9a653..ed2a5508 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -35,20 +35,21 @@ # TopFox , 2022. # John Donne , 2022, 2023. # Deleted User , 2023. +# Christopher Forzy , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-04-10 13:33+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2024-06-09 16:09+0000\n" +"Last-Translator: Christopher Forzy \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.6-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -129,9 +130,9 @@ msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s : erreur : %(message)s\n" #: ../fdroidserver/publish.py -#, python-format +#, fuzzy, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "%d APK n'ont pas pu être signés ou vérifiés !" #: ../fdroidserver/scanner.py #, python-format From 109e66260dde4c263c5f8e3d15e2a873576eec1a Mon Sep 17 00:00:00 2001 From: Tymofii Lytvynenko Date: Wed, 26 Jun 2024 13:09:16 +0200 Subject: [PATCH 1600/2116] Translated using Weblate: Ukrainian (uk) by Tymofii Lytvynenko Currently translated at 100.0% (580 of 580 strings) Co-authored-by: Tymofii Lytvynenko Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 83 +++++++++++---------------- 1 file changed, 35 insertions(+), 48 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index f762522e..c6c1fc19 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -8,20 +8,21 @@ # Dan , 2022. # Sergii Horichenko , 2023. # Макар Разин , 2023. +# Tymofii Lytvynenko , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2023-05-28 07:54+0000\n" -"Last-Translator: Ihor Hordiichuk \n" +"PO-Revision-Date: 2024-06-09 16:09+0000\n" +"Last-Translator: Tymofii Lytvynenko \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.18-dev\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Weblate 5.6-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -105,7 +106,7 @@ msgstr "%(prog)s: помилка: %(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "%d APK не вдалося підписати або перевірити!" #: ../fdroidserver/scanner.py #, python-format @@ -227,9 +228,9 @@ msgid "A URL is required as an argument!" msgstr "URL потребується як аргумент!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "У {path} не знайдено сертифікатів для підписання" +msgstr "APK-підписи мають різні сертифікати у {path}:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -309,7 +310,6 @@ msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode msgstr "Застосунок має NoSourceSince або ArchivePolicy «0 версій», але AutoUpdateMode або UpdateCheckMode не дорівнюють None" #: ../fdroidserver/lint.py -#, fuzzy msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Застосунок має NoSourceSince або ArchivePolicy «0 версій», але AutoUpdateMode або UpdateCheckMode не дорівнюють None" @@ -413,7 +413,7 @@ msgstr "Категорії не встановлено" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" +msgstr "Категорія «{category}» визначена, але не використовується для жодного застосунку!" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -584,12 +584,12 @@ msgstr "Довжина опису {length} перевищує ліміт {limit} #: ../fdroidserver/common.py #, python-brace-format msgid "Did you mean config/{name}.yml?" -msgstr "" +msgstr "Ви мали на увазі config/{name}.yml?" #: ../fdroidserver/lint.py #, python-brace-format msgid "Did you mean {code}?" -msgstr "" +msgstr "Ви мали на увазі {code}?" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" @@ -660,7 +660,7 @@ msgstr "Дублікат посилання в '{field}': {url}" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "ПОМИЛКА: %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -833,9 +833,8 @@ msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Знайдено кілька файлів блоку підписів JAR у {path}" #: ../fdroidserver/common.py -#, fuzzy msgid "Found multiple Signer Certificates!" -msgstr "Знайдено кілька сертифікатів підписування для репозиторію." +msgstr "Знайдено декілька сертифікатів підписувача!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -902,9 +901,8 @@ msgid "Git reset failed" msgstr "Скидання Git не вдалося" #: ../fdroidserver/common.py -#, fuzzy msgid "Git submodule deinit failed" -msgstr "Не вдалося оновити підмодуль Git" +msgstr "Деініціалізація підмодуля Git не вдалася" #: ../fdroidserver/common.py msgid "Git submodule sync failed" @@ -1113,7 +1111,7 @@ msgstr "Шлях до сховища ключів для ключа підпис #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "" +msgstr "Відомий налагоджувальний ключ використовується у AllowedAPKSigningKeys: " #: ../fdroidserver/lint.py #, python-brace-format @@ -1253,9 +1251,8 @@ msgid "No unsigned directory - nothing to do" msgstr "Немає непідписаної теки — нічого виконувати" #: ../fdroidserver/__main__.py -#, fuzzy msgid "No version information could be found." -msgstr "не знайдено відомостей про версію" +msgstr "Відомості про версію знайти не вдалося." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" @@ -1416,9 +1413,8 @@ msgid "Pushing binary transparency log to {url}" msgstr "Оновити двійковий журнал прозорості для {url}" #: ../fdroidserver/deploy.py -#, fuzzy msgid "Pushing to remote server failed!" -msgstr "Помилка налаштування remote set-head для Git: «%s»" +msgstr "Пушинг на віддалений сервер не вдався!" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1454,9 +1450,8 @@ msgid "Reading {apkfilename} from cache" msgstr "Читання {apkfilename} з кешу" #: ../fdroidserver/build.py -#, fuzzy msgid "Refresh and cache scanner rules and signatures from the network" -msgstr "отримати останню версію підписів з інтернету" +msgstr "Оновлення та кешування правил і сигнатур сканера з мережі" #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1709,11 +1704,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Ці застосунки, заархівовано з основного репозиторію." #: ../fdroidserver/mirror.py -#, fuzzy msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "" -"ПОМИЛКА: ця команда ніколи не повинна використовуватися для створення дзеркала f-droid.org!\n" -"Повне дзеркало f-droid.org вимагає понад 200GB." +msgstr "Цю команду ніколи не слід використовувати для віддзеркалення f-droid.org! Для повної копії потрібно понад 600 ГБ." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." @@ -1889,9 +1881,8 @@ msgstr "UpdateCheckMode налаштовано, але схоже, що кома #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -#, fuzzy msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode налаштовано, але схоже, що команду checkupdates ще не було запущено" +msgstr "UpdateCheckMode встановлено, але схоже, що команду checkupdates ще не було запущено" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -1921,9 +1912,8 @@ msgid "Usage: %s\n" msgstr "Використання: %s\n" #: ../fdroidserver/lint.py -#, fuzzy msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "Використовуйте /HEAD замість /master для вказання на файл типовій гілці" +msgstr "Використовуйте /HEAD замість /master або /main, щоб вказати на файл у типовій гілці" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" @@ -1955,9 +1945,8 @@ msgid "Using APK Signature v3" msgstr "Використання підпису APK v3" #: ../fdroidserver/common.py -#, fuzzy msgid "Using JAR Signature" -msgstr "Використання підпису APK v2" +msgstr "Використання JAR-підпису" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -2018,7 +2007,7 @@ msgstr "Під час перевірки всього репозиторію, ya #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." -msgstr "" +msgstr "Якщо підписати або перевірити не вдається, виходить з кодом помилки." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2171,9 +2160,8 @@ msgid "could not parse '{path}'" msgstr "не вдалося проаналізувати '{path}'" #: ../fdroidserver/common.py -#, fuzzy msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "не вдалося проаналізувати специфікацію srclib (посилання не вказано): '{}'" +msgstr "не вдалося розібрати специфікацію srclib (не вказано назву): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" @@ -2351,9 +2339,9 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "дзеркало '%s' не закінчується на 'fdroid'!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "Тепер встановіть їх у config.yml:" +msgstr "дзеркала задано двічі, в config.yml та {path}!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2515,7 +2503,7 @@ msgstr "repo_url повинен закінчуватися на /repo" #: ../fdroidserver/deploy.py #, python-brace-format msgid "rsync is missing or broken: {error}" -msgstr "" +msgstr "rsync відсутній або несправний: {error}" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." @@ -2532,9 +2520,8 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "кеш сканера пошкоджено! Ви можете очистити його за допомогою: '{clear}'" #: ../fdroidserver/deploy.py -#, fuzzy msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "local_copy_dir мусить закінчуватися на \"fdroid\", ймовірно, малося на увазі: \"{path}\"" +msgstr "serverwebroot: шлях не закінчується на «fdroid», можливо, ви мали на увазі один з цих:" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2744,27 +2731,27 @@ msgstr "{path}: недійсний підпис \"{pattern}\". Виглядає #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} has been flagged by virustotal {count} times:" -msgstr "" +msgstr "{path} було позначено virustotal {count} разів:" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" +msgstr "{path} - це не словник «ключ: значення», а {datatype}!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} is not a standard config file!" -msgstr "'sdk_path' не встановлено в config.yml!" +msgstr "{path} не є стандартним конфігураційним файлом!" #: ../fdroidserver/index.py #, python-brace-format msgid "{path} is not list, but a {datatype}!" -msgstr "" +msgstr "{path} - це не список, а {datatype}!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "" +msgstr "{path} - це не {expected_type}, а {datatype}!" #: ../fdroidserver/update.py #, python-brace-format @@ -2779,7 +2766,7 @@ msgstr "{path} понад 200 МБ, вивантажити власноруч: { #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" +msgstr "{path}: «{code}» не є дійсним кодом країни за стандартом ISO_3166-1 alpha-2!" #: ../fdroidserver/update.py #, python-brace-format From e7ad71527f6dbca744adabdb0b75accf7914d782 Mon Sep 17 00:00:00 2001 From: Jose Delvani Date: Wed, 26 Jun 2024 13:09:16 +0200 Subject: [PATCH 1601/2116] Translated using Weblate: Portuguese (Brazil) (pt_BR) by Jose Delvani Currently translated at 100.0% (580 of 580 strings) Co-authored-by: Jose Delvani Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/ Translation: F-Droid/F-Droid Server --- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 79 ++++++++++-------------- 1 file changed, 33 insertions(+), 46 deletions(-) diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 775715c9..0d465e7b 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -10,13 +10,14 @@ # Flavio F. M. , 2022. # The Cats , 2023. # lucasmz-dev , 2024. +# Jose Delvani , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-05-24 20:12+0000\n" -"Last-Translator: lucasmz-dev \n" +"PO-Revision-Date: 2024-06-19 04:09+0000\n" +"Last-Translator: Jose Delvani \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" @@ -228,9 +229,9 @@ msgid "A URL is required as an argument!" msgstr "Uma URL é necessária como um argumento!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "Nenhum certificado de assinatura encontrado em {path}" +msgstr "As assinaturas do APK têm certificados diferentes em {path}:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -310,9 +311,8 @@ msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode msgstr "O aplicativo tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateMode ou UpdateCheckMode não são None" #: ../fdroidserver/lint.py -#, fuzzy msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "O aplicativo tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateMode ou UpdateCheckMode não são None" +msgstr "O aplicativo tem NoSourceSince ou ArchivePolicy \"0 versões\" ou 0, mas AutoUpdateMode ou UpdateCheckMode não são None" #: ../fdroidserver/lint.py #, python-brace-format @@ -413,7 +413,7 @@ msgstr "As categorias não estão definidas" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" +msgstr "Categoria \"{category}\" definida, mas não usada para nenhum aplicativo!" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -584,12 +584,12 @@ msgstr "A descrição de tamanho {length} está acima do limite de {limit} carac #: ../fdroidserver/common.py #, python-brace-format msgid "Did you mean config/{name}.yml?" -msgstr "" +msgstr "Você quis dizer config/{name}.yml?" #: ../fdroidserver/lint.py #, python-brace-format msgid "Did you mean {code}?" -msgstr "" +msgstr "Você quis dizer {code}?" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" @@ -660,7 +660,7 @@ msgstr "Link duplicado em '{field}': {url}" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "ERRO: %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -833,9 +833,8 @@ msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Encontrados vários arquivos de bloqueio de assinatura JAR em {path}" #: ../fdroidserver/common.py -#, fuzzy msgid "Found multiple Signer Certificates!" -msgstr "Encontrado vários certificados de assinatura para o repositório." +msgstr "Foram encontrados vários certificados de assinantes!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -902,9 +901,8 @@ msgid "Git reset failed" msgstr "Falha no 'reset' do Git" #: ../fdroidserver/common.py -#, fuzzy msgid "Git submodule deinit failed" -msgstr "Falha na atualização do submódulo Git" +msgstr "Falha no submódulo Git deinit" #: ../fdroidserver/common.py msgid "Git submodule sync failed" @@ -1113,7 +1111,7 @@ msgstr "Armazenamento de chaves de assinatura:\t" #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "" +msgstr "A chave de depuração conhecida é usada em AllowedAPKSigningKeys: " #: ../fdroidserver/lint.py #, python-brace-format @@ -1253,9 +1251,8 @@ msgid "No unsigned directory - nothing to do" msgstr "Nenhum diretório não assinado - nada a fazer" #: ../fdroidserver/__main__.py -#, fuzzy msgid "No version information could be found." -msgstr "nenhuma informação de versão encontrada" +msgstr "Não foi possível encontrar informações sobre a versão." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" @@ -1416,9 +1413,8 @@ msgid "Pushing binary transparency log to {url}" msgstr "Atualizar o log de transparência de um binário para {url}" #: ../fdroidserver/deploy.py -#, fuzzy msgid "Pushing to remote server failed!" -msgstr "Git remote set-head falhou: \"%s\"" +msgstr "Falha ao enviar para o servidor remoto!" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1454,9 +1450,8 @@ msgid "Reading {apkfilename} from cache" msgstr "Lendo {apkfilename} do cache" #: ../fdroidserver/build.py -#, fuzzy msgid "Refresh and cache scanner rules and signatures from the network" -msgstr "obter a versão de assinaturas mais recente da Web" +msgstr "Atualizar e armazenar em cache regras e assinaturas do scanner da rede" #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1708,11 +1703,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Estas são as aplicações que foram arquivadas a partir do repositório principal." #: ../fdroidserver/mirror.py -#, fuzzy msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "" -"ERRO: este comando nunca deve ser usado para espelhar o f-droid.org!\n" -"Um espelho completo de f-droid.org requer mais de 200 GB." +msgstr "Esse comando nunca deve ser usado para espelhar o f-droid.org! Uma cópia completa requer mais de 600 GB." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." @@ -1888,9 +1880,8 @@ msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -#, fuzzy msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado" +msgstr "UpdateCheckMode está definido, mas parece que o updatecheckupdates ainda não foi executado" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -1920,9 +1911,8 @@ msgid "Usage: %s\n" msgstr "Uso: %s\n" #: ../fdroidserver/lint.py -#, fuzzy msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "Use /HEAD em vez de /master para apontar em um arquivo na ramificação predefinida" +msgstr "Use /HEAD em vez de /master ou /main para apontar para um arquivo na ramificação padrão" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" @@ -1954,9 +1944,8 @@ msgid "Using APK Signature v3" msgstr "Usando a Assinatura APK v3" #: ../fdroidserver/common.py -#, fuzzy msgid "Using JAR Signature" -msgstr "Usando a Assinatura APK v2" +msgstr "Usando assinatura JAR" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -2017,7 +2006,7 @@ msgstr "Ao cotar todo o repositório, o yamllint é desativado por padrão. Inde #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." -msgstr "" +msgstr "Ao assinar ou verificar falhar, um código de erro será lançado." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2169,9 +2158,8 @@ msgid "could not parse '{path}'" msgstr "não foi possível analisar '{path}'" #: ../fdroidserver/common.py -#, fuzzy msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "não foi possível analisar a especificação srclib (referência sem especificação): '{}'" +msgstr "não foi possível analisar a especificação srclib (nenhum nome especificado): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" @@ -2348,9 +2336,9 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "espelho '%s' não termina com 'fdroid'!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "Agora defina estes em config.yml:" +msgstr "espelhos (mirrors) definidos duas vezes, em config.yml e {path}!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2512,7 +2500,7 @@ msgstr "repo_url precisa terminar com /repo" #: ../fdroidserver/deploy.py #, python-brace-format msgid "rsync is missing or broken: {error}" -msgstr "" +msgstr "rsync está ausente ou quebrado: {error}" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." @@ -2529,9 +2517,8 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "o cache do scanner está malformado! Você pode limpá-lo com: '{clear}'" #: ../fdroidserver/deploy.py -#, fuzzy msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "local_copy_dir não termina com \"fdroid\", talvez você quis: \"{path}\"" +msgstr "serverwebroot: o caminho não termina com \"fdroid\", talvez você tenha se referido a um destes:" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2740,27 +2727,27 @@ msgstr "{path} tem uma má assinatura de arquivo \"{pattern}\", um exploração #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} has been flagged by virustotal {count} times:" -msgstr "" +msgstr "{path} foi sinalizado pelo virustotal {count} vezes:" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" +msgstr "{path} não é um ditado \"key: value\", mas um {datatype}!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} is not a standard config file!" -msgstr "\"sdk_path\" não definido em config.yml!" +msgstr "{path} não é um arquivo de configuração padrão!" #: ../fdroidserver/index.py #, python-brace-format msgid "{path} is not list, but a {datatype}!" -msgstr "" +msgstr "{path} não é uma lista, mas um {datatype}!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "" +msgstr "{path} não é {expected_type}, mas um {datatype}!" #: ../fdroidserver/update.py #, python-brace-format @@ -2775,7 +2762,7 @@ msgstr "o {path} tem mais de 200MB, upload manual: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" +msgstr "{path}: \"{code}\" não é um código de país ISO_3166-1 alfa-2 válido!" #: ../fdroidserver/update.py #, python-brace-format From 1bf951a91d300db7e255d92a4546136d7d7f347f Mon Sep 17 00:00:00 2001 From: Xiang Heng Wei Date: Wed, 26 Jun 2024 13:09:16 +0200 Subject: [PATCH 1602/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by Xiang Heng Wei Currently translated at 88.9% (516 of 580 strings) Translated using Weblate: Chinese (Simplified) (zh_Hans) by Xiang Heng Wei Currently translated at 81.0% (470 of 580 strings) Co-authored-by: Xiang Heng Wei Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 112 ++++++++++----------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 8752a891..06cfbee1 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -22,7 +22,7 @@ # Yang Yulin , 2022. # Eric , 2022. # Xu ZhuoHan , 2022. -# Xiang Heng Wei , 2022, 2023. +# Xiang Heng Wei , 2022, 2023, 2024. # RainSlide , 2023. # Eric , 2023. # Max Xie , 2023. @@ -36,15 +36,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-05-15 18:13+0000\n" -"Last-Translator: 大王叫我来巡山 \n" +"PO-Revision-Date: 2024-06-26 11:09+0000\n" +"Last-Translator: Xiang Heng Wei \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.6-dev\n" +"X-Generator: Weblate 5.6-rc\n" #: ../fdroidserver/nightly.py msgid "" @@ -126,7 +126,7 @@ msgstr "%(prog)s:错误:%(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "%d 个 APK 无法签名或验证!" #: ../fdroidserver/scanner.py #, python-format @@ -431,7 +431,7 @@ msgstr "没有设置类别" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" +msgstr "类别“{category}”已定义,但未被用于任何应用程序!" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -602,12 +602,12 @@ msgstr "简介长度 {length} 超过 {limit} 字限制" #: ../fdroidserver/common.py #, python-brace-format msgid "Did you mean config/{name}.yml?" -msgstr "" +msgstr "您是指 config/{name}.yml 吗?" #: ../fdroidserver/lint.py #, python-brace-format msgid "Did you mean {code}?" -msgstr "" +msgstr "您是指 {code} 吗?" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" @@ -678,7 +678,7 @@ msgstr "“{field}”中有重复的链接:{url}" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "错误:%(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -1129,7 +1129,7 @@ msgstr "签名密钥的密钥库:\t" #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "" +msgstr "AllowedAPKSigningKeys 中使用的已知调试密钥: " #: ../fdroidserver/lint.py #, python-brace-format @@ -1469,7 +1469,7 @@ msgstr "从缓存读取 {apkfilename}" #: ../fdroidserver/build.py msgid "Refresh and cache scanner rules and signatures from the network" -msgstr "" +msgstr "刷新和缓存来自网络的扫描程序规则和签名" #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1893,16 +1893,16 @@ msgstr "UpdateCheckData 不是有效的网址:{url}" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "" +msgstr "UpdateCheckMode 已设置,但看起来尚未运行检查更新。" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" +msgstr "UpdateCheckMode 已设置,但看起来尚未运行检查更新" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "" +msgstr "UpdateCheckName 已设置为已知的应用 ID,可以将其删除" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1937,7 +1937,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." -msgstr "" +msgstr "使用 `fdroid update -c` 命令以创建它。" #: ../fdroidserver/build.py msgid "Use build server" @@ -1950,7 +1950,7 @@ msgstr "对于新添加的 APK 文件,使用来自 APK 文件的时间,而 #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." -msgstr "" +msgstr "使用“{path}”配置 s3cmd。" #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -1966,7 +1966,7 @@ msgstr "使用 JAR 签名" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" -msgstr "" +msgstr "不建议使用 Java 的 jar 签名器来验证 APK!使用 apk 签名器" #: ../fdroidserver/common.py #, python-brace-format @@ -1976,12 +1976,12 @@ msgstr "使用 {path} 中的 androguard" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" -msgstr "" +msgstr "使用空白字典而不是 {path} 的内容!" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" -msgstr "" +msgstr "使用现有密钥库“{path}”" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2007,7 +2007,7 @@ msgstr "验证目录签名中:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "" +msgstr "VirusTotal 的 API 密钥无法用于上传大于 32MB 的文件,请使用 {url} 上传 {path}。" #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" @@ -2023,7 +2023,7 @@ msgstr "" #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." -msgstr "" +msgstr "签名或验证失败时,退出并显示错误代码。" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2031,21 +2031,21 @@ msgstr "生成密钥时使用了X.509 ‘可识别名’" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" -msgstr "" +msgstr "您可以使用 ANDROID_HOME 设置 SDK 的路径,也就是说:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" -msgstr "" +msgstr "ZIP 压缩包" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" -msgstr "" +msgstr "将 IdentityFile 添加到 {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" -msgstr "" +msgstr "添加到 {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2063,11 +2063,11 @@ msgstr "模糊的选项:%s(%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "" +msgstr "找不到 APK 签名器!无法对新式 APK 进行签名或验证" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" -msgstr "" +msgstr "找不到 APK 签名器,这是签名所必需的!" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py @@ -2082,27 +2082,27 @@ msgstr "带APPID[:VERCODE]格式可选的versionCode的应用 ID" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" -msgstr "" +msgstr "archive_url 需要以 /archive 结尾" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" -msgstr "" +msgstr "参数 “-” 带有模式 %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" -msgstr "" +msgstr "参数 %(argument_name)s:%(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" -msgstr "" +msgstr "尝试使用裸 SSH 连接测试部署密钥:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" -msgstr "" +msgstr "无法解析 scrlib 规范(不是字符串):“{}”" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format @@ -2111,29 +2111,29 @@ msgstr "无法打开 '%(filename)s':%(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" -msgstr "" +msgstr "无法打开非 HTTPS URL: '{};" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" -msgstr "" +msgstr "找不到所需的源库:“{path}”" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" -msgstr "" +msgstr "不能有多个子解析器参数" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" -msgstr "" +msgstr "无法合并操作 - 两个组被命名为 %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" -msgstr "" +msgstr "无法发布更新,是否设置了部署密钥?" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2142,7 +2142,7 @@ msgstr "正在克隆 {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" -msgstr "" +msgstr "来自插件模块的命令:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2188,29 +2188,29 @@ msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" -msgstr "" +msgstr "已创建 {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "当前版本较新:旧的 vercode={old},新的 vercode={new}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" -msgstr "" +msgstr "正在删除:repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" -msgstr "" +msgstr "已部署进程日志 {path} 到 {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" -msgstr "" +msgstr "对于像 %r 这样的选项,dest= 是必需的" #: ../fdroidserver/scanner.py msgid "downloading '{}'" @@ -2222,7 +2222,7 @@ msgstr "从 '{}' 下载扫描仪特征失败了" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" -msgstr "" +msgstr "可执行二进制文件,可能是代码" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2230,25 +2230,25 @@ msgstr "" #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" -msgstr[0] "" +msgstr[0] "预期的 %s 个参数" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" -msgstr "" +msgstr "预期至少有一个参数" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" -msgstr "" +msgstr "预期最多有一个参数" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" -msgstr "" +msgstr "预期的一个参数" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" @@ -2256,11 +2256,11 @@ msgstr "用法:fdroid [-h|--help|--version] []" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" -msgstr "" +msgstr "从网络获取最新版本的签名" #: /usr/lib/python3.11/optparse.py msgid "floating-point" -msgstr "" +msgstr "浮点" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." @@ -2268,32 +2268,32 @@ msgstr "将元数据错误(默认)强制设为警告,或忽略。" #: ../fdroidserver/common.py msgid "git svn clone failed" -msgstr "" +msgstr "git svn 克隆失败" #: ../fdroidserver/scanner.py msgid "gzip file archive" -msgstr "" +msgstr "gzip 压缩包" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" -msgstr "" +msgstr "被忽略的显式参数 %r" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" -msgstr "" +msgstr "index-v1 必须有签名,使用 `fdroid signindex` 命令创建它!" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "" +msgstr "index-v2 必须有签名,使用 `fdroid signindex` 命令创建它!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" -msgstr "" +msgstr "整数" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py From e07c7eb08fb25938f3363dc1f6e00ba7c31f3dc5 Mon Sep 17 00:00:00 2001 From: lucasmz-dev Date: Sat, 6 Jul 2024 09:09:01 +0000 Subject: [PATCH 1603/2116] Translated using Weblate: Portuguese (Brazil) (pt_BR) by lucasmz-dev Currently translated at 100.0% (580 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/ --- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 30 ++++++++++++------------ 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 0d465e7b..4ea2d3cf 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -16,15 +16,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-06-19 04:09+0000\n" -"Last-Translator: Jose Delvani \n" +"PO-Revision-Date: 2024-07-07 07:41+0000\n" +"Last-Translator: lucasmz-dev \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.6-dev\n" +"X-Generator: Weblate 5.7-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -565,7 +565,7 @@ msgstr "Excluindo arquivo desconhecido: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" -msgstr "Descrição '%s' é apenas o resumo do aplicativo" +msgstr "Descrição '%s' é apenas o resumo do app" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" @@ -797,7 +797,7 @@ msgstr "Tags HTML proibidas" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." -msgstr "Forçar a compilação de aplicativos desativados e continuar independentemente de problemas de escaneamento. Apenas permitido no modo de teste." +msgstr "Forçar a compilação de apps desativados e continuar independentemente de problemas de escaneamento. Apenas permitido no modo de teste." #: ../fdroidserver/build.py #, python-brace-format @@ -811,7 +811,7 @@ msgstr "Força varredura de aplicativos e compilações desativadas." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" -msgstr "Foi encontrado o gráfico \"{path}\" sem metadados para o aplicativo \"{name}\"!" +msgstr "Foi encontrado o gráfico \"{path}\" sem metadados para o app \"{name}\"!" #: ../fdroidserver/update.py #, python-brace-format @@ -820,12 +820,12 @@ msgstr "Encontrado arquivo inválido \"{path}\" de financiamento para \"{name}\" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" -msgstr "Encontrou aplicativos inválidos em argumentos" +msgstr "Encontrou apps inválidos em argumentos" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" -msgstr "Encontrado versões de códigos inválidas para alguns aplicativos" +msgstr "Encontrado versões de códigos inválidas para alguns apps" #: ../fdroidserver/common.py #, python-brace-format @@ -1203,11 +1203,11 @@ msgstr "Nenhuma versão mínima do SDK encontrada em {0}, usando o padrão (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" -msgstr "Não há necessidade de especificar que o aplicativo é Software Livre" +msgstr "Não há necessidade de especificar que o app é Software Livre" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" -msgstr "Não há necessidade de especificar que é um aplicativo para Android" +msgstr "Não há necessidade de especificar que é um app para Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" @@ -1240,7 +1240,7 @@ msgstr "Nenhum pacote desse tipo: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" -msgstr "Nenhum tal versionCode {versionCode} para o aplicativo {appid}" +msgstr "Nenhum tal versionCode {versionCode} para o app {appid}" #: ../fdroidserver/checkupdates.py msgid "No tags found" @@ -1300,7 +1300,7 @@ msgstr "Apenas mostrar diferenças com a Play Store" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" -msgstr "Processar apenas aplicativos com atualizações automáticas" +msgstr "Processar apenas apps com atualizações automáticas" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" @@ -1571,7 +1571,7 @@ msgstr "Defina o limite de arquivos abertos para {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" -msgstr "Configurar uma compilação de aplicativo para um repositório de compilação todas-as-noites" +msgstr "Configurar uma compilação de app para um repositório de compilação todas-as-noites" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " @@ -1643,7 +1643,7 @@ msgstr "Descarnar a assinatura misteriosa a partir do {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" -msgstr "Resumo '%s' é apenas o nome do aplicativo" +msgstr "Resumo '%s' é apenas o nome do app" #: ../fdroidserver/lint.py #, python-brace-format @@ -1885,7 +1885,7 @@ msgstr "UpdateCheckMode está definido, mas parece que o updatecheckupdates aind #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "UpdateCheckName (atualização da verificação do nome) é definido como o ID comun do app - pode ser removido" +msgstr "UpdateCheckName (atualização da verificação do nome) é definido como o ID comun do aplicativo - pode ser removido" #: ../fdroidserver/deploy.py #, python-brace-format From ef524f87de3bf7eb64639250b47356ae5460d619 Mon Sep 17 00:00:00 2001 From: Fqwe1 Date: Tue, 16 Jul 2024 12:08:22 +0000 Subject: [PATCH 1604/2116] Translated using Weblate: Ukrainian (uk) by Fqwe1 Currently translated at 100.0% (580 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ --- locale/uk/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index c6c1fc19..726699f7 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -9,20 +9,21 @@ # Sergii Horichenko , 2023. # Макар Разин , 2023. # Tymofii Lytvynenko , 2024. +# Fqwe1 , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-06-09 16:09+0000\n" -"Last-Translator: Tymofii Lytvynenko \n" +"PO-Revision-Date: 2024-07-17 04:04+0000\n" +"Last-Translator: Fqwe1 \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.6-dev\n" +"X-Generator: Weblate 5.7-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -1345,7 +1346,7 @@ msgstr "Читання маніфесту у '{path}'" #: ../fdroidserver/common.py msgid "Password required with username" -msgstr "Потрібен парольіз іменем користувача" +msgstr "Потрібен пароль з іменем користувача" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." From 83691d158050a4379f59c95528bf1fc53f70d595 Mon Sep 17 00:00:00 2001 From: 109247019824 Date: Thu, 18 Jul 2024 19:20:21 +0000 Subject: [PATCH 1605/2116] Translated using Weblate: Bulgarian (bg) by 109247019824 Currently translated at 0.1% (1 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/bg/ --- locale/bg/LC_MESSAGES/fdroidserver.po | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/locale/bg/LC_MESSAGES/fdroidserver.po b/locale/bg/LC_MESSAGES/fdroidserver.po index da2dc127..bdecaf1c 100644 --- a/locale/bg/LC_MESSAGES/fdroidserver.po +++ b/locale/bg/LC_MESSAGES/fdroidserver.po @@ -1,19 +1,21 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # Aleksandar Hadzhivelichkov , 2022. +# 109247019824 , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" +"PO-Revision-Date: 2024-07-19 10:21+0000\n" +"Last-Translator: 109247019824 \n" +"Language-Team: Bulgarian \n" "Language: bg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.7-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -2105,7 +2107,7 @@ msgstr "" #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" -msgstr "" +msgstr "комплекс" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py From 98569b13fbc5f48e925a3e48718b1dcabf1ad50e Mon Sep 17 00:00:00 2001 From: raulmagdalena <4omoald1a@mozmail.com> Date: Sun, 21 Jul 2024 17:53:58 +0000 Subject: [PATCH 1606/2116] Translated using Weblate: Catalan (ca) by raulmagdalena <4omoald1a@mozmail.com> Currently translated at 6.7% (39 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ca/ --- locale/ca/LC_MESSAGES/fdroidserver.po | 33 ++++++++++++++------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index 818ad55d..63f5554d 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -2,20 +2,21 @@ # This file is put in the public domain. # Rubén , 2023. # pitroig , 2024. +# raulmagdalena <4omoald1a@mozmail.com>, 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-05-27 18:43+0000\n" -"Last-Translator: pitroig \n" +"PO-Revision-Date: 2024-07-22 11:28+0000\n" +"Last-Translator: raulmagdalena <4omoald1a@mozmail.com>\n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.6-dev\n" +"X-Generator: Weblate 5.7-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -426,7 +427,7 @@ msgstr "" #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" -msgstr "" +msgstr "Ordre '%s' no reconeguda.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" @@ -1295,7 +1296,7 @@ msgstr "" #: /usr/lib/python3.11/optparse.py msgid "Options" -msgstr "" +msgstr "Opcions" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." @@ -1751,7 +1752,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" -msgstr "" +msgstr "S'ha trobat una excepció desconeguda!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py @@ -1881,14 +1882,14 @@ msgstr "" #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" -msgstr "" +msgstr "Utilització" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" -msgstr "" +msgstr "Utilització: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" @@ -1953,7 +1954,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Valid commands are:" -msgstr "" +msgstr "Les ordres vàlides són:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." @@ -2397,14 +2398,14 @@ msgstr "" #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" -msgstr "" +msgstr "opció -%s no reconeguda" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" -msgstr "" +msgstr "opció -%s demana un argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py @@ -2425,7 +2426,7 @@ msgstr "" #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" -msgstr "" +msgstr "opció --%s not reconeguda" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py @@ -2437,7 +2438,7 @@ msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" -msgstr "" +msgstr "arguments opcionals" #: /usr/lib/python3.11/argparse.py msgid "options" @@ -2508,7 +2509,7 @@ msgstr "" #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" -msgstr "" +msgstr "mostra el número de versió del programa i surt" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py @@ -2516,7 +2517,7 @@ msgstr "" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" -msgstr "" +msgstr "mostra aquest missatge d'ajuda i surt" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." @@ -2585,7 +2586,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " -msgstr "" +msgstr "us: " #: ../fdroidserver/deploy.py #, python-brace-format From dc4eb2dbd199047a272c6897c00f6b372eb21c1a Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Tue, 23 Jul 2024 03:39:49 +0000 Subject: [PATCH 1607/2116] Translated using Weblate: Persian (fa) by Danial Behzadi Currently translated at 8.1% (47 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fa/ --- locale/fa/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index 1630e747..641e53b5 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-05-13 12:10+0000\n" +"PO-Revision-Date: 2024-07-23 04:12+0000\n" "Last-Translator: Danial Behzadi \n" "Language-Team: Persian \n" "Language: fa\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.5.5-dev\n" +"X-Generator: Weblate 5.7-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -984,7 +984,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" -msgstr "" +msgstr "تعامل با کارساز HTTP مخزن" #: ../fdroidserver/update.py msgid "Invalid APK" From a14acc510f23d53a349ef351c5078a66d0d7e9d8 Mon Sep 17 00:00:00 2001 From: chumoer Date: Tue, 23 Jul 2024 04:27:05 +0000 Subject: [PATCH 1608/2116] Translated using Weblate: Chinese (Simplified) (zh_Hans) by chumoer Currently translated at 96.0% (557 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 89 +++++++++++----------- 1 file changed, 45 insertions(+), 44 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 06cfbee1..2af1f8f0 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -31,20 +31,21 @@ # David Jiang , 2023. # ALoLo_527 , 2024. # 大王叫我来巡山 , 2024. +# chumoer , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-06-26 11:09+0000\n" -"Last-Translator: Xiang Heng Wei \n" +"PO-Revision-Date: 2024-07-23 06:25+0000\n" +"Last-Translator: chumoer \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.6-rc\n" +"X-Generator: Weblate 5.7-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -1929,11 +1930,11 @@ msgstr "用法:%s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "" +msgstr "使用 /HEAD 而不是 /master 或 /main 来指向默认分支中的文件" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" +msgstr "使用 /HEAD 而不是 /master 指向默认分支中的文件" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." @@ -2019,7 +2020,7 @@ msgstr "如果已配置为使用签名索引,该阶段仅创建未签名索引 #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "" +msgstr "对整个版本库进行着色时,默认禁用 yamllint。 无论如何,该选项都会强制 yamllint。" #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." @@ -2175,15 +2176,15 @@ msgstr "无法解析 '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "" +msgstr "无法解析 srclib 规范 (未指定名称): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "" +msgstr "无法解析 srclib 规范 (未指定 ref): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" +msgstr "无法解析 srclib 规范 (('@'符号太多): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2300,7 +2301,7 @@ msgstr "整数" #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" -msgstr "" +msgstr "无效 %(type)s 值: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2314,23 +2315,23 @@ msgstr "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" -msgstr "" +msgstr "冲突解决值无效: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" -msgstr "" +msgstr "无效选项字符串 %(option)r: 必须以字符 %(prefix_chars)r 开头" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" -msgstr "" +msgstr "未找到 ipfs_cid,跳过 CIDv1 生成" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "最新的构建配方较新:旧的验证码={old},新的验证码={new}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2348,7 +2349,7 @@ msgstr "local_copy_dir必须是目录,不能是文件!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" -msgstr "" +msgstr "镜像 '%s' 不以 'fdroid'结尾!" #: ../fdroidserver/index.py #, python-brace-format @@ -2359,21 +2360,21 @@ msgstr "设置了两次镜像,分别在 config.xml 和 {path} 中!" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" -msgstr "" +msgstr "相互排斥的参数必须是可选的" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" -msgstr "" +msgstr "下次 {name} 缓存更新将在 {time} 内完成" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" -msgstr "" +msgstr "{appid} 中没有 \"图标\"" #: ../fdroidserver/signatures.py msgid "no APK supplied" -msgstr "" +msgstr "未提供 APK" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2395,37 +2396,37 @@ msgstr "没有找到版本信息" #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" -msgstr "" +msgstr "不允许使用参数 %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" -msgstr "" +msgstr "其中一个参数 %s 是必需的" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" -msgstr "" +msgstr "只接受字符串、列表和元组" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" +msgstr "选项 %s: 如果您真的想安装所有已签名的应用程序,请使用 --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" -msgstr "" +msgstr "选项 %s:无效 %s 值:%r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" +msgstr "选项 %s:无效选择:%r(从 %s 中选择)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py @@ -2492,44 +2493,44 @@ msgstr "位置参数" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" -msgstr "" +msgstr "进程日志将 {path} 部署到 {dest} 失败!" #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "" +msgstr "参考二进制缺少签名" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "" +msgstr "拒绝通过不安全的 HTTP 连接下载(使用 HTTPS 或指定 --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "" +msgstr "repo_icon \"repo/icons/%s\" 不存在,正在生成占位符。" #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" -msgstr "" +msgstr "repo_url 需以 /repo 结尾" #: ../fdroidserver/deploy.py #, python-brace-format msgid "rsync is missing or broken: {error}" -msgstr "" +msgstr "rsync 丢失或损坏: {error}" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" +msgstr "ruamel.yaml 未安装,无法写入元数据。" #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" -msgstr "" +msgstr "s3cmd 同步索引 {path} 至 {url} 并删除" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" -msgstr "" +msgstr "扫描仪缓存畸形! 您可以使用他: '{clear}'" #: ../fdroidserver/deploy.py msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" @@ -2537,7 +2538,7 @@ msgstr "serverwebroot:路径没有以 \"fdroid\"结尾,可能你想表达的 #: ../fdroidserver/scanner.py msgid "shared library" -msgstr "" +msgstr "共享库" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2555,33 +2556,33 @@ msgstr "显示本帮助信息并退出" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." -msgstr "" +msgstr "签名的 APK、文件路径或 HTTPS URL。" #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "" +msgstr "跳过部署完整的构建日志:日志内容为空" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" -msgstr "" +msgstr "跳过部署完整的构建日志:配置中未启用" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" -msgstr "" +msgstr "跳过源代码压缩包:{path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" -msgstr "" +msgstr "srclibs 缺少名称和/或 @" #: ../fdroidserver/scanner.py msgid "static library" -msgstr "" +msgstr "静态图书馆" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "" +msgstr "所提供的参考二进制已允许签名者 {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2602,7 +2603,7 @@ msgstr "未预期的选项字符串:%s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "" +msgstr "未知解析器 %(parser_name)r (选择: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2629,7 +2630,7 @@ msgstr "正在用Apache libcloud同步{url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "" +msgstr "virustotal.com正在限制速率,等待重试..." #: ../fdroidserver/publish.py #, python-brace-format From 5aad779d696ec9a946ec358ac3d3c3a778ef494c Mon Sep 17 00:00:00 2001 From: ssantos Date: Sat, 27 Jul 2024 21:04:42 +0000 Subject: [PATCH 1609/2116] Translated using Weblate: Portuguese (Portugal) (pt_PT) by ssantos Currently translated at 99.4% (577 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_PT/ --- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 106 ++++++++++------------- 1 file changed, 47 insertions(+), 59 deletions(-) diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 98868df0..1659d3c1 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -2,7 +2,7 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Manuela Silva , 2020. -# ssantos , 2020, 2021, 2022, 2023. +# ssantos , 2020, 2021, 2022, 2023, 2024. # Hans-Christoph Steiner , 2020, 2022. # Peter J. Mello , 2021. msgid "" @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2023-07-02 15:51+0000\n" +"PO-Revision-Date: 2024-07-28 01:31+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" "Language: pt_PT\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.0-dev\n" +"X-Generator: Weblate 5.7-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -101,7 +101,7 @@ msgstr "%(prog)s: erro: %(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "%d APKs falharam a serem assinados ou verificados!" #: ../fdroidserver/scanner.py #, python-format @@ -191,7 +191,7 @@ msgstr "'{path}' falhou ao executar!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "'{path}' tem um formato inválido, deve ser um dicionário!" +msgstr "'{path}' tem um formato inválido, deveria ser um dicionário!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format @@ -223,9 +223,9 @@ msgid "A URL is required as an argument!" msgstr "Uma URL é necessária como um argumento!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "Nenhum certificado de assinatura encontrado em {path}" +msgstr "As assinaturas do APK têm certificados diferentes em {path}:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -279,7 +279,7 @@ msgstr "Código DEX do Android" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "O SDK do Android não foi encontrado em {path}!" +msgstr "SDK do Android não foi encontrado em {path}!" #: ../fdroidserver/common.py #, python-brace-format @@ -338,7 +338,7 @@ msgstr "Tipo de entrada \"{mirrortype}\" incorreto na configuração de espelhos #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" -msgstr "URL base para espelhar, pode incluir a chave de assinatura de índice usando a string de consulta:? Fingerprint =" +msgstr "URL base para espelhar, pode incluir a chave de assinatura de índice usando a cadeia de consulta: ?fingerprint =" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py @@ -383,7 +383,7 @@ msgstr "Repo construído baseado em \"%s\" com esta configuração:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "Não é possível atualizar a app automaticamente sem CurrentVersionCode" +msgstr "Não é possível atualizar automaticamente a aplicação sem CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -408,7 +408,7 @@ msgstr "As categorias não são definidas" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" +msgstr "Categoria \"{category}\" definida, mas não usada para nenhuma app!" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -417,7 +417,7 @@ msgstr "Verificação de actualizações das aplicações" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "A verificar o arquivamento para {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Verificando o arquivamento para {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -439,7 +439,7 @@ msgstr "Enviar mudanças" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "Definições conflitantes de \"{field}\" entre arquivos .yml e localizados:" +msgstr "Definições contraditórias de \"{field}\" entre ficheiros .yml e ficheiros localizados:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." @@ -579,12 +579,12 @@ msgstr "A descrição de comprimento {length} é sobre o limite de char {limit}" #: ../fdroidserver/common.py #, python-brace-format msgid "Did you mean config/{name}.yml?" -msgstr "" +msgstr "Quis dizer config/{name}.yml?" #: ../fdroidserver/lint.py #, python-brace-format msgid "Did you mean {code}?" -msgstr "" +msgstr "Quis dizer {code}?" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" @@ -655,7 +655,7 @@ msgstr "Ligação duplicada em '{field}': {url}" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "ERRO: %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -667,7 +667,7 @@ msgid "" "A full mirror of f-droid.org requires more than 200GB." msgstr "" "ERRO: este comando nunca deve ser usado para espelhar f-Droid.org!\n" -"Um espelho completo de f-Droid.org requer mais de 200GB." +"Um espelho completo de f-Droid.org requer mais que 200GB." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" @@ -828,9 +828,8 @@ msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Vários ficheiros de blocos de assinaturas JAR foram encontrados em {path}" #: ../fdroidserver/common.py -#, fuzzy msgid "Found multiple Signer Certificates!" -msgstr "Vários certificados de assinatura encontrados para o repositório." +msgstr "Vários certificados de assinante foram encontrados!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -897,9 +896,8 @@ msgid "Git reset failed" msgstr "Git reset falhou" #: ../fdroidserver/common.py -#, fuzzy msgid "Git submodule deinit failed" -msgstr "Git submodule update falhou" +msgstr "Falha no submódulo deinit do Git" #: ../fdroidserver/common.py msgid "Git submodule sync failed" @@ -930,7 +928,7 @@ msgstr "A ignorar '{field}' em metadados '{metapath}' porque é depreciado." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" -msgstr "A ignorar a entrada FUNDING.yml por mais de 2048: %s" +msgstr "A ignorar a entrada FUNDING.yml por mais que 2048: %s" #: ../fdroidserver/update.py #, python-format @@ -948,7 +946,7 @@ msgstr "Ignorando dados de cache obsoletos para {apkfilename}" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "Incluir APKs assinados com algoritmos desabilitados como MD5" +msgstr "Incluir APKs assinados com algoritmos desativados como MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" @@ -1108,7 +1106,7 @@ msgstr "Armazenamento de chaves de assinatura:\t" #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "" +msgstr "A chave de depuração conhecida é usada em AllowedAPKSigningKeys: " #: ../fdroidserver/lint.py #, python-brace-format @@ -1248,9 +1246,8 @@ msgid "No unsigned directory - nothing to do" msgstr "Nenhum diretório não assinado - nada a fazer" #: ../fdroidserver/__main__.py -#, fuzzy msgid "No version information could be found." -msgstr "não há informações de versão encontrada" +msgstr "Não foi possível encontrar informações de versão." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" @@ -1411,9 +1408,8 @@ msgid "Pushing binary transparency log to {url}" msgstr "A submeter o registo de transparência de binário para {url}" #: ../fdroidserver/deploy.py -#, fuzzy msgid "Pushing to remote server failed!" -msgstr "Git remote set-head falhou: \"%s\"" +msgstr "Falha ao submeter para o servidor remoto!" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1449,9 +1445,8 @@ msgid "Reading {apkfilename} from cache" msgstr "Lendo {apkfilename} do cache" #: ../fdroidserver/build.py -#, fuzzy msgid "Refresh and cache scanner rules and signatures from the network" -msgstr "buscar a versão de assinaturas mais recente da Web" +msgstr "Atualizar e armazenar as regras e assinaturas do scanner da rede no cache" #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1602,7 +1597,7 @@ msgstr "Ignorando '{apkfilename}' com uma assinatura inválida!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "A ignorar o espelho do GitLab Pages pelo repositório ser muito grande (>%.2fGB)!" +msgstr "A ignorar o espelho do GitLab Pages porque o repositório é muito grande (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format @@ -1665,7 +1660,7 @@ msgstr "Modo de atualização de marcações usado no git-svn, mas a repo não f #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." -msgstr "Modo de teste - coloque a saída apenas no diretório tmp e sempre compile, mesmo que a saída já exista." +msgstr "Modo de teste - ponha a saída apenas no diretório tmp e sempre compile, mesmo que a saída já exista." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1675,7 +1670,7 @@ msgstr "O código de versão OBB deve estar após \"{name}.\":" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" -msgstr "O URL base para o registro de mudanças do repositório (predefinição: https://f-droid.org)" +msgstr "O URL base para o registo de mudanças do repositório (predefinição: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" @@ -1703,11 +1698,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Estas são as aplicações que foram arquivadas do repositório principal." #: ../fdroidserver/mirror.py -#, fuzzy msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "" -"ERRO: este comando nunca deve ser usado para espelhar f-Droid.org!\n" -"Um espelho completo de f-Droid.org requer mais de 200GB." +msgstr "Este comando nunca deve ser usado para espelhar o f-droid.org! Uma cópia completa requer mais que 600GB." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." @@ -1883,9 +1875,8 @@ msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -#, fuzzy msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado" +msgstr "UpdateCheckMode está definido, mas parece que o updatecheckupdates ainda não foi executado" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -1915,9 +1906,8 @@ msgid "Usage: %s\n" msgstr "Utilização: %s\n" #: ../fdroidserver/lint.py -#, fuzzy msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "Use /HEAD em vez de /master para apontar num ficheiro na ramificação predefinida" +msgstr "Use /HEAD em vez de /master ou /main para apontar a um ficheiro no ramo predefinido" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" @@ -1949,9 +1939,8 @@ msgid "Using APK Signature v3" msgstr "A usar a assinatura APK v3" #: ../fdroidserver/common.py -#, fuzzy msgid "Using JAR Signature" -msgstr "A usar a assinatura APK v2" +msgstr "A usar a assinatura JAR" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -2012,7 +2001,7 @@ msgstr "Ao cotar todo o repositório o yamllint é desativado por predefinição #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." -msgstr "" +msgstr "Se assinar ou verificar falhar, sair com um código de erro." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2380,7 +2369,7 @@ msgstr "não há informações de versão encontrada!" #: ../fdroidserver/checkupdates.py msgid "no version information found" -msgstr "não há informações de versão encontrada" +msgstr "nenhuma informação de versão encontrada" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2493,7 +2482,7 @@ msgstr "binária de referência sem assinatura" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "Recusado o download via conexão HTTP insegura (use HTTPS ou especifique --no-https-check): {apkfilename}" +msgstr "Recusado a descarrega via conexão HTTP insegura (use HTTPS ou especifique --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format @@ -2507,7 +2496,7 @@ msgstr "repo_url precisa de terminar com /repo" #: ../fdroidserver/deploy.py #, python-brace-format msgid "rsync is missing or broken: {error}" -msgstr "" +msgstr "rsync está ausente ou quebrado: {error}" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." @@ -2516,7 +2505,7 @@ msgstr "o ruamel.yaml não está instalado, não é possível escrever metadados #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" -msgstr "s3cmd sincroniza índices {path} para {url} e exclui" +msgstr "s3cmd sincroniza índices {path} para {url} e apaga" #: ../fdroidserver/scanner.py #, python-brace-format @@ -2524,13 +2513,12 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "o cache do scanner está malformado! Pode limpá-lo com: '{clear}'" #: ../fdroidserver/deploy.py -#, fuzzy msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "local_copy_dir não termina com \"fdroid\", talvez quis: \"{path}\"" +msgstr "serverwebroot: o caminho não termina com \"fdroid\", talvez queria usar um destes:" #: ../fdroidserver/scanner.py msgid "shared library" -msgstr "biblioteca compartilhada" +msgstr "biblioteca partilhada" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2735,27 +2723,27 @@ msgstr "{path} tem uma má assinatura de ficheiro \"{pattern}\", um exploração #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} has been flagged by virustotal {count} times:" -msgstr "" +msgstr "{path} foi marcado por virustotal {count} vezes:" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" +msgstr "{path} não é um dicionário \"key: value\", mas um {datatype}!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} is not a standard config file!" -msgstr "'sdk_path' não definido em 'config.yml'!" +msgstr "{path} não é um ficheiro de configuração padrão!" #: ../fdroidserver/index.py #, python-brace-format msgid "{path} is not list, but a {datatype}!" -msgstr "" +msgstr "{path} não é uma lista, mas um {datatype}!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "" +msgstr "{path} não é um {expected_type}, mas um {datatype}!" #: ../fdroidserver/update.py #, python-brace-format @@ -2765,12 +2753,12 @@ msgstr "{path} tem um tamanho de zero!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" -msgstr "{path} mais de 200MB, enviar manualmente: {url}" +msgstr "{path} mais que 200MB, enviar manualmente: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" +msgstr "{path}: \"{code}\" não é um código de país ISO_3166-1 alfa-2 válido!" #: ../fdroidserver/update.py #, python-brace-format From 828cedfd3016a56cf4e66cfac4d2c94a054326b8 Mon Sep 17 00:00:00 2001 From: ssantos Date: Sat, 27 Jul 2024 20:39:32 +0000 Subject: [PATCH 1610/2116] Translated using Weblate: Portuguese (pt) by ssantos Currently translated at 99.4% (577 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/ --- locale/pt/LC_MESSAGES/fdroidserver.po | 72 +++++++++++---------------- 1 file changed, 30 insertions(+), 42 deletions(-) diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index ff488ea1..36beb789 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -1,6 +1,6 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# ssantos , 2020, 2021, 2022, 2023. +# ssantos , 2020, 2021, 2022, 2023, 2024. # Peter J. Mello , 2021. # Eduardo Rodrigues , 2021. # SC , 2022. @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2023-07-02 15:51+0000\n" +"PO-Revision-Date: 2024-07-28 01:31+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" "Language: pt\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.0-dev\n" +"X-Generator: Weblate 5.7-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -100,7 +100,7 @@ msgstr "%(prog)s: erro: %(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "%d APKs falharam a serem assinados ou verificados!" #: ../fdroidserver/scanner.py #, python-format @@ -222,9 +222,9 @@ msgid "A URL is required as an argument!" msgstr "Uma URL é necessária como um argumento!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "Nenhum certificado de assinatura encontrado em {path}" +msgstr "As assinaturas do APK têm certificados diferentes em {path}:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -407,7 +407,7 @@ msgstr "As categorias não são definidas" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" +msgstr "Categoria \"{category}\" definida, mas não usada para nenhuma app!" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -578,12 +578,12 @@ msgstr "A descrição de comprimento {length} é sobre o limite de char {limit}" #: ../fdroidserver/common.py #, python-brace-format msgid "Did you mean config/{name}.yml?" -msgstr "" +msgstr "Quis dizer config/{name}.yml?" #: ../fdroidserver/lint.py #, python-brace-format msgid "Did you mean {code}?" -msgstr "" +msgstr "Quis dizer {code}?" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" @@ -654,7 +654,7 @@ msgstr "Ligação duplicada em '{field}': {url}" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "ERRO: %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -827,9 +827,8 @@ msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Vários ficheiros de blocos de assinaturas JAR foram encontrados em {path}" #: ../fdroidserver/common.py -#, fuzzy msgid "Found multiple Signer Certificates!" -msgstr "Vários certificados de assinatura encontrados para o repositório." +msgstr "Vários certificados de assinante foram encontrados!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -896,9 +895,8 @@ msgid "Git reset failed" msgstr "Git reset falhou" #: ../fdroidserver/common.py -#, fuzzy msgid "Git submodule deinit failed" -msgstr "Git submodule update falhou" +msgstr "Falha no submódulo deinit do Git" #: ../fdroidserver/common.py msgid "Git submodule sync failed" @@ -1107,7 +1105,7 @@ msgstr "Armazenamento de chaves de assinatura:\t" #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "" +msgstr "A chave de depuração conhecida é usada em AllowedAPKSigningKeys: " #: ../fdroidserver/lint.py #, python-brace-format @@ -1247,9 +1245,8 @@ msgid "No unsigned directory - nothing to do" msgstr "Nenhum diretório não assinado - nada a fazer" #: ../fdroidserver/__main__.py -#, fuzzy msgid "No version information could be found." -msgstr "nenhuma informação de versão encontrada" +msgstr "Não foi possível encontrar informações de versão." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" @@ -1410,9 +1407,8 @@ msgid "Pushing binary transparency log to {url}" msgstr "A submeter o registo de transparência de binário para {url}" #: ../fdroidserver/deploy.py -#, fuzzy msgid "Pushing to remote server failed!" -msgstr "Git remote set-head falhou: \"%s\"" +msgstr "Falha ao submeter para o servidor remoto!" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1448,9 +1444,8 @@ msgid "Reading {apkfilename} from cache" msgstr "Lendo {apkfilename} do cache" #: ../fdroidserver/build.py -#, fuzzy msgid "Refresh and cache scanner rules and signatures from the network" -msgstr "buscar a versão de assinaturas mais recente da Web" +msgstr "Atualizar e armazenar as regras e assinaturas do scanner da rede no cache" #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1702,11 +1697,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Estas são as aplicações que foram arquivadas do repositório principal." #: ../fdroidserver/mirror.py -#, fuzzy msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "" -"ERRO: este comando nunca deve ser usado para espelhar f-Droid.org!\n" -"Um espelho completo de f-Droid.org requer mais de 200GB." +msgstr "Este comando nunca deve ser usado para espelhar o f-droid.org! Uma cópia completa requer mais que 600GB." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." @@ -1882,9 +1874,8 @@ msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -#, fuzzy msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado" +msgstr "UpdateCheckMode está definido, mas parece que o updatecheckupdates ainda não foi executado" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -1914,9 +1905,8 @@ msgid "Usage: %s\n" msgstr "Utilização: %s\n" #: ../fdroidserver/lint.py -#, fuzzy msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "Use /HEAD em vez de /master para apontar num ficheiro na ramificação predefinida" +msgstr "Use /HEAD em vez de /master ou /main para apontar a um ficheiro no ramo predefinido" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" @@ -1948,9 +1938,8 @@ msgid "Using APK Signature v3" msgstr "A usar a assinatura APK v3" #: ../fdroidserver/common.py -#, fuzzy msgid "Using JAR Signature" -msgstr "A usar a assinatura APK v2" +msgstr "A usar a assinatura JAR" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -2011,7 +2000,7 @@ msgstr "Ao cotar todo o repositório o yamllint é desativado por predefinição #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." -msgstr "" +msgstr "Se assinar ou verificar falhar, sair com um código de erro." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2506,7 +2495,7 @@ msgstr "repo_url precisa de terminar com /repo" #: ../fdroidserver/deploy.py #, python-brace-format msgid "rsync is missing or broken: {error}" -msgstr "" +msgstr "rsync está ausente ou quebrado: {error}" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." @@ -2523,9 +2512,8 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "o cache do scanner está malformado! Pode limpá-lo com: '{clear}'" #: ../fdroidserver/deploy.py -#, fuzzy msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "local_copy_dir não termina com \"fdroid\", talvez quis: \"{path}\"" +msgstr "serverwebroot: o caminho não termina com \"fdroid\", talvez queria usar um destes:" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2734,27 +2722,27 @@ msgstr "{path} tem uma má assinatura de ficheiro \"{pattern}\", um exploração #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} has been flagged by virustotal {count} times:" -msgstr "" +msgstr "{path} foi marcado por virustotal {count} vezes:" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" +msgstr "{path} não é um dicionário \"key: value\", mas um {datatype}!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} is not a standard config file!" -msgstr "'sdk_path' não definido em 'config.yml'!" +msgstr "{path} não é um ficheiro de configuração padrão!" #: ../fdroidserver/index.py #, python-brace-format msgid "{path} is not list, but a {datatype}!" -msgstr "" +msgstr "{path} não é uma lista, mas um {datatype}!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "" +msgstr "{path} não é um {expected_type}, mas um {datatype}!" #: ../fdroidserver/update.py #, python-brace-format @@ -2769,7 +2757,7 @@ msgstr "{path} mais de 200MB, enviar manualmente: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" +msgstr "{path}: \"{code}\" não é um código de país ISO_3166-1 alfa-2 válido!" #: ../fdroidserver/update.py #, python-brace-format From 071f7af9f6d38e16a82549bc69497b2ee033891f Mon Sep 17 00:00:00 2001 From: paul mayero Date: Fri, 2 Aug 2024 13:47:23 +0000 Subject: [PATCH 1611/2116] Translated using Weblate: Swahili (sw) by paul mayero Currently translated at 100.0% (580 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sw/ --- locale/sw/LC_MESSAGES/fdroidserver.po | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index 88f652ed..8bf9d549 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -2,20 +2,21 @@ # This file is put in the public domain. # Test Account , 2024. # abelbiwott-dev , 2024. +# paul mayero , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-05-27 08:09+0000\n" -"Last-Translator: abelbiwott-dev \n" +"PO-Revision-Date: 2024-08-02 16:18+0000\n" +"Last-Translator: paul mayero \n" "Language-Team: Swahili \n" "Language: sw\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.6-dev\n" +"X-Generator: Weblate 5.7-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -67,7 +68,7 @@ msgstr "\"{path}\" ipo lakini s3cmd haijasakinishwa!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "\"{path}\" si muundo wa faili inayotumika (tumia: metadata/*.yml)" +msgstr "\"{path}\" si muundo wa faili inayokubalika (tumia: metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format @@ -93,7 +94,7 @@ msgstr[1] "Chaguo %(option)s linahitaji hoja %(number)d" #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" -msgstr "%(prog)s: kosa: %(message)s\n" +msgstr "%(prog)s: kasoro: %(message)s\n" #: ../fdroidserver/publish.py #, python-format @@ -121,7 +122,7 @@ msgstr "%r haiwezi kuitwa" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" -msgstr "%s haikutoa amri!" +msgstr "%s haikutoa \"dict\"!" #: ../fdroidserver/signindex.py #, python-format @@ -213,7 +214,7 @@ msgstr ".__call__() haijafafanuliwa" #: ../fdroidserver/lint.py msgid "/issues is missing" -msgstr "/issues hayapo" +msgstr "/issues haipo" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" @@ -976,7 +977,7 @@ msgstr "Sakinisha apu zote zilizosainiwa zinazopatikana" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" -msgstr "Sakinisha vifurushi vilivyojengwa kwenye vifaa" +msgstr "Sakinisha vifurushi kwenye vifaa" #: ../fdroidserver/install.py #, python-format @@ -2026,7 +2027,7 @@ msgstr "Inaongeza kwa {name}: {path}" #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "chaguo lisiloeleweka: %(option)s inaweza kulingana na %(matches)s" +msgstr "chaguo lisiloeleweka: %(option)s linaweza kulingana na %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2408,14 +2409,14 @@ msgstr "chaguo %s: chaguo batili: %r(choose from %s)" #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" -msgstr "chaguo -%s haitambuliki" +msgstr "chaguo -%s halitambuliki" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" -msgstr "chaguo -%s inahitaji hoja" +msgstr "chaguo -%s linahitaji hoja" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py @@ -2436,7 +2437,7 @@ msgstr "chaguo --%s sio kiambishi awali cha kipekee" #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" -msgstr "chaguo --%s haitambuliki" +msgstr "chaguo --%s halitambuliki" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py From 07c3857491a35a8d8b5a844be7922fb4d74c1c65 Mon Sep 17 00:00:00 2001 From: ssantos Date: Mon, 12 Aug 2024 10:35:59 +0000 Subject: [PATCH 1612/2116] Translated using Weblate: Portuguese (Portugal) (pt_PT) by ssantos Currently translated at 100.0% (580 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_PT/ --- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 1659d3c1..2b050068 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-07-28 01:31+0000\n" +"PO-Revision-Date: 2024-08-12 18:05+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" "Language: pt_PT\n" @@ -305,9 +305,8 @@ msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode msgstr "A app tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateMode ou UpdateCheckMode não são Nenhum" #: ../fdroidserver/lint.py -#, fuzzy msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "A app tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateMode ou UpdateCheckMode não são Nenhum" +msgstr "A app tem NoSourceSince ou ArchivePolicy \"0 versions\" ou 0, mas AutoUpdateMode ou UpdateCheckMode não são None" #: ../fdroidserver/lint.py #, python-brace-format @@ -2153,9 +2152,8 @@ msgid "could not parse '{path}'" msgstr "não foi possível analisar '{path}'" #: ../fdroidserver/common.py -#, fuzzy msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "não foi possível analisar a especificação srclib (referência não especificada): '{}'" +msgstr "não foi possível analisar a especificação srclib (nenhum nome especificado): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" @@ -2332,9 +2330,9 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "espelho '%s' não termina com 'fdroid'!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "Agora configure estes em config.yml:" +msgstr "espelhos (mirrors) definidos duas vezes, em config.yml e em {path}!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py From edf32a6f8a7bab5d05c52dde0349fdc37132391f Mon Sep 17 00:00:00 2001 From: ssantos Date: Mon, 12 Aug 2024 10:37:05 +0000 Subject: [PATCH 1613/2116] Translated using Weblate: Portuguese (pt) by ssantos Currently translated at 100.0% (580 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/ --- locale/pt/LC_MESSAGES/fdroidserver.po | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 36beb789..0c6bd966 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-07-28 01:31+0000\n" +"PO-Revision-Date: 2024-08-12 18:05+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" "Language: pt\n" @@ -304,9 +304,8 @@ msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode msgstr "A app tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateMode ou UpdateCheckMode não são Nenhum" #: ../fdroidserver/lint.py -#, fuzzy msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "A app tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateMode ou UpdateCheckMode não são Nenhum" +msgstr "A app tem NoSourceSince ou ArchivePolicy \"0 versions\" ou 0, mas AutoUpdateMode ou UpdateCheckMode não são None" #: ../fdroidserver/lint.py #, python-brace-format @@ -1870,7 +1869,7 @@ msgstr "UpdateCheckData não é uma URL válida: {url}" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado" +msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado." #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py @@ -2152,9 +2151,8 @@ msgid "could not parse '{path}'" msgstr "não foi possível analisar '{path}'" #: ../fdroidserver/common.py -#, fuzzy msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "não foi possível analisar a especificação srclib (referência não especificada): '{}'" +msgstr "não foi possível analisar a especificação srclib (nenhum nome especificado): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" @@ -2331,9 +2329,9 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "espelho '%s' não termina com 'fdroid'!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "Agora configure estes em config.yml:" +msgstr "espelhos (mirrors) definidos duas vezes, em config.yml e em {path}!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py From 94f02b3e04b2da9d19448fd75864c25fc31c5414 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Wed, 14 Aug 2024 11:23:05 +0000 Subject: [PATCH 1614/2116] Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk Currently translated at 100.0% (580 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ --- locale/uk/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 726699f7..6a30306b 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -2,7 +2,7 @@ # Copyright (C) YEAR Free Software Foundation, Inc. # Hans-Christoph Steiner , 2020. # ihor_ck , 2020. -# Ihor Hordiichuk , 2020, 2021, 2022, 2023. +# Ihor Hordiichuk , 2020, 2021, 2022, 2023, 2024. # Tymofij Lytvynenko , 2021. # DankXylese , 2021. # Dan , 2022. @@ -15,8 +15,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-07-17 04:04+0000\n" -"Last-Translator: Fqwe1 \n" +"PO-Revision-Date: 2024-08-14 17:28+0000\n" +"Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" @@ -1878,7 +1878,7 @@ msgstr "UpdateCheckData не є дійсною URL-адресою: {url}" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "UpdateCheckMode налаштовано, але схоже, що команду checkupdates ще не було запущено" +msgstr "UpdateCheckMode налаштовано, але схоже, що команду checkupdates ще не запущено." #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py From 0796d14161fa76f2c589c463d61b6749717d787f Mon Sep 17 00:00:00 2001 From: "Coool (github.com/Coool)" Date: Wed, 14 Aug 2024 19:28:42 +0200 Subject: [PATCH 1615/2116] Added translation using Weblate: Latvian (lv) by "Coool (github.com/Coool)" --- locale/lv/LC_MESSAGES/fdroidserver.po | 2766 +++++++++++++++++++++++++ 1 file changed, 2766 insertions(+) create mode 100644 locale/lv/LC_MESSAGES/fdroidserver.po diff --git a/locale/lv/LC_MESSAGES/fdroidserver.po b/locale/lv/LC_MESSAGES/fdroidserver.po new file mode 100644 index 00000000..80e00eeb --- /dev/null +++ b/locale/lv/LC_MESSAGES/fdroidserver.po @@ -0,0 +1,2766 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# "Coool (github.com/Coool)" , 2024. +msgid "" +msgstr "" +"Project-Id-Version: fdroidserver 2.3a1\n" +"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" +"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: lv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= 19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH public key to be used as deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "" +"\n" +"{path} encoded for the DEBUG_KEYSTORE secret variable:" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "\"%s/\" has no matching metadata file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "\"{apkfilename}\" is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains outdated {name} ({version})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains recent {name} ({version})" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "\"{path}\" exists but s3cmd is not installed!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "\"{url}\" is not a valid URL!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "%(option)s option requires %(number)d argument" +msgid_plural "%(option)s option requires %(number)d arguments" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "%(prog)s: error: %(message)s\n" +msgstr "" + +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "%d problems found" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "%prog [options]" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "%r is not callable" +msgstr "" + +#: ../fdroidserver/signindex.py +#, python-format +msgid "%s did not produce a dict!" +msgstr "" + +#: ../fdroidserver/signindex.py +#, python-format +msgid "%s has bad SHA-256: %s" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "%s is not an accepted build field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "%s option does not take a value" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' is NONE and 'smartcardoptions' is blank!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "'required' is an invalid argument for positionals" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{path}' failed to execute!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format +msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "...checkupdate failed for {appid} : {error}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid ".__call__() not defined" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "/issues is missing" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "A URL is required as an argument!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Add PGP signatures using GnuPG for packages in repo" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add a repo signing key to an unsigned repo" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add skeleton metadata files for APKs that are missing them" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Adding new repo for only {name}" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Alias of the repo signing key in the keystore" +msgstr "" + +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Also mirror the full archive section" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Also warn about formatting issues, like rewritemeta -l" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android AAR library" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android APK file" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android DEX code" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' is not a directory!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "App is in '{repo}' but has a link to {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Appending .git is not necessary" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Archiving {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in srclib '{srclib}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Broken symlink: {path}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Build a package from source" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build all applications available" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Build generated by `fdroid import` - remove disable line once ready" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Build metadata git repo has uncommited changes!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build only the latest version of each package" +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "Built repo based in \"%s\" with this config:" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Can't build due to {} error while scanning" +msgid_plural "Can't build due to {} errors while scanning" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Cannot rewrite \"{path}\"" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Categories '%s' is not valid" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Categories are not set" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Check for updates to applications" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Clean update - don't uses caches, reprocess all APKs" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Comma separated list of categories." +msgstr "" + +#: ../fdroidserver/__main__.py +#, python-format +msgid "Command '%s' not recognised.\n" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Commit changes" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not find '{command}' on your system" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Could not find latest version code" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Could not find latest version name" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not find {path} to remove it" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not parse size \"{size}\", wrong type \"{type}\"" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Couldn't find Application ID" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find package ID" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Cowardily refusing to overwrite existing signing key setup!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Created new container \"{name}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Creating \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating log directory" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Creating new S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating output directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating signed index with this key (SHA256):" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/verify.py +msgid "Creating temporary directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating unsigned index in preparation for signing" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "DEBUG_KEYSTORE is not set or the value is incomplete" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Delete APKs and/or OBBs without metadata from the repo" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting archive, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Deleting unknown file: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description '%s' is just the app's summary" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Description has a duplicate line" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Description of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Do not add 'disable:' to the generated build entries" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not deploy the new files to the repo" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Do not include \"{path}\" in URL!" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Do not prompt for Android SDK path, just fail" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not remove the private keys generated from the keystore" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't create a source tarball, useful when testing a build" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/nightly.py +msgid "Don't use rsync checksums" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Download complete mirrors of small repos" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Downloading the repository already failed once, not trying again." +msgstr "" + +#: ../fdroidserver/verify.py +#, python-brace-format +msgid "Downloading {url} failed. {error}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Duplicate link in '{field}': {url}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "" +"ERROR: this command should never be used to mirror f-droid.org!\n" +"A full mirror of f-droid.org requires more than 200GB." +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "ERROR: unsupported CI type, patches welcome!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "" + +#: ../fdroidserver/__main__.py +#, python-brace-format +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"Enter the path to the Android SDK (%s) here:\n" +"> " +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Error while getting repo address" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Extract signatures from APKs" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed copying {path}: {error}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Failed fetching signatures for '{apkfilename}': {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed reading {path}: {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed resizing {path}: {error}" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Failed to create S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get APK information, deleting {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get APK information, skipping {path}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Failed to install '{apkfilename}' on {dev}: {error}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to sign application" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Fetched buildserverid from VM: {buildserverid}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "File disappeared while processing it: {path}" +msgstr "" + +#: ../fdroidserver/build.py ../fdroidserver/install.py +#: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py +#: ../fdroidserver/update.py +msgid "Finished" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Forbidden HTML tags" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Force halting build after {0} sec timeout!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Force scan of disabled apps and builds." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found bad funding file \"{path}\" for \"{name}\":" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Found invalid appids in arguments" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +msgid "Found invalid versionCodes for some apps" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Found multiple JAR Signature Block Files in {path}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Found multiple metadata files for {appid}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found multiple signing certificates for repository." +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found no signing certificates for repository." +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Found non-file at %s" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Found {apkfilename} at {url}" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Found {count} problems in {filename}" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Found {count} warnings in {filename}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Generated skeleton metadata for {appid}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git checkout of '%s' failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git clean failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git fetch failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git remote set-head failed: \"%s\"" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git reset failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule sync failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule update failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "HTTPS must be used with Subversion URLs!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "If a git mirror gets to big, allow the archive to be deleted" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "If this upload fails, try manually uploading to {url}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." +msgstr "" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring FUNDING.yml entry longer than 2048: %s" +msgstr "" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Ignoring package without metadata: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Ignoring stale cache data for {apkfilename}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Include APKs that are signed with disabled algorithms like MD5" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the PGP signature .asc files in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the build logs in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the source tarballs in the mirror" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Initialising submodules" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Install all signed applications available" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Install built packages on devices" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}..." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Interact with the repo HTTP server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Invalid APK" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid VercodeOperation: {field}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Invalid VercodeOperation: {invalid_ops}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid application ID {appid}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid boolean '%s'" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid bulleted list" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Invalid name for published file: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid redirect to non-HTTPS: {before} -> {after} " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid scrlib metadata: '{file}' does not exist" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: could not parse '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature failed to verify: {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature verified: {path}" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java JAR file" +msgstr "" + +#: ../fdroidserver/mirror.py ../fdroidserver/publish.py +#: ../fdroidserver/update.py +msgid "Java JDK not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java compiled class" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Javascript in HTML src attributes" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Keystore for signing key:\t" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the Liberapay: field" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Locale included in f-droid.org URL" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Make the build stop on exceptions" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Malformed repository mirrors." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Malformed serverwebroot line:" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Mirror the full repo and archive, all file types." +msgstr "" + +#: ../fdroidserver/gpgsign.py +msgid "Missing output directory" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No Android SDK found!" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No attached devices found" +msgstr "" + +#: ../fdroidserver/index.py +msgid "No fingerprint in URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No git submodules available" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "No gradle project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "No information found." +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is Free Software" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is for Android" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No packages specified" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "No signed APK available for %s" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No signed output directory - nothing to do" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No signing certificates found in {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "No such package: %s" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No such versionCode {versionCode} for app {appid}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/verify.py +msgid "No unsigned directory - nothing to do" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Not a valid size definition: \"{}\"" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Nothing to do" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Nothing to do for {appid}." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "OBB file has newer versionCode({integer}) than any APK:" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB filename must start with \"main.\" or \"patch.\":" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB's packagename does not match a supported APK:" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Only PNG and JPEG are supported for graphics, found: {path}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only print differences with the Play Store" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only process apps with auto-updates" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "OpenCollective donation methods belong in the OpenCollective: field" +msgstr "" + +#: /usr/lib/python3.11/optparse.py +msgid "Options" +msgstr "" + +#: ../fdroidserver/verify.py +msgid "Output JSON report to file named after APK." +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Output JSON to stdout." +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py +#: ../fdroidserver/publish.py ../fdroidserver/signindex.py +#: ../fdroidserver/update.py +msgid "Outputting JSON" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Overall license of the project." +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "Package \"{appid}\" already exists" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Parsing manifest at '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Password required with username" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Path to main Android project subdirectory, if not in root." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Path to the git repo to use as the log" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the keystore for the repo signing key" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Print the secret variable to the terminal for easy copy/paste" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Problem with xml at '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Process auto-updates" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#, python-brace-format +msgid "Processing {apkfilename}" +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#, python-brace-format +msgid "Processing {appid}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable XML/JSON for index files" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Project URL to import from." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Punctuation should be avoided" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Push the log to this git remote repository" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Pushing binary transparency log to {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Pushing to {url}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Quickly start a new repository" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Read all the metadata files and exit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading '{config_file}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Reading {apkfilename} from cache" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Removing specified files" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Rename APK files that do not match package.name_123.apk" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Resigning {apkfilename} with provided debug.keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Resize all the icons exceeding the max pixel size and exit" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Restrict output to warnings and errors" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Rewrite all the metadata files" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Run on git repo that has uncommitted changes" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Run rewritemeta to fix formatting" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Running first pass with MD5 checking disabled" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Running wget in {path}" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "SHA-256 of {url} does not match entry!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scan the resulting APK(s) for known non-free classes." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Scan the source code of a package" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {apk}" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:{versionCode}:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scanner found {} problem" +msgid_plural "Scanner found {} problems" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Set clock to that time using:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Set maximum releases in repo before older ones are archived" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Set open file limit to {integer}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Set up an app build for a nightly build repo" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setting open file limit failed: " +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Setting {0} sec timeout for this build" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Sign and place packages in the repo" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Sign indexes created using update --nosign" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Skip scanning the source code for binaries and other problems" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping '{apkfilename}' with invalid signature!" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping index generation for {appid}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: disabled" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Specify a local folder to sync the repo to" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Specify an identity file to provide to SSH for rsyncing" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Specify which debug keystore file to use." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Spew out even more information than normal" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Stripping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Summary '%s' is just the app's name" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Summary of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "System clock is older than date in {path}!" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "The OBB version code must come after \"{name}.\":" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "The base URL for the repo to log (default: https://f-droid.org)" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "The directory to write the mirror to" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "The file to be included in the repo (path or glob)" +msgstr "" + +#: ../fdroidserver/index.py +msgid "The repository's fingerprint does not match." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "The root dir for local_copy_dir \"{path}\" does not exist!" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "There is a keyalias collision - publishing halted" +msgstr "" + +#: ../fdroidserver/common.py +msgid "These are the apps that have been archived from the main repo." +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-format +msgid "This repo already has local metadata: %s" +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL must start with https:// or http://" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL shorteners should not be used" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "URL {url} in Description: {error}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Unknown exception found!" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Unknown file '{filename}' in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Unknown metadata format: %s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path} (use: *.yml)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Unknown version of aapt, might cause problems: " +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary leading space" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary trailing space" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised app field '{fieldname}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised build flag '{build_flag}' in '{path}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported file type \"{extension}\" for repo graphic" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported graphics file found: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused extlib at %s" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused file at %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scandelete path: %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scanignore path: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Update repo information for new packages" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Update the binary transparency log for a URL" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "UpdateCheckData has invalid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must use HTTPS URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData not a valid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID, it can be removed" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to androidobservatory.org" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to virustotal" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "Usage" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "Usage: %s\n" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master to point at a file in the default branch" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use `fdroid update -c` to create it." +msgstr "" + +#: ../fdroidserver/build.py +msgid "Use build server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v2" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v3" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Using androguard from \"{path}\"" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Using existing keystore \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using s3cmd to sync with: {url}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Valid commands are:" +msgstr "" + +#: ../fdroidserver/verify.py +msgid "Verify against locally cached copy rather than redownloading." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Verify the integrity of downloaded packages" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Verifying index signature:" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Warn about possible metadata errors" +msgstr "" + +#: ../fdroidserver/update.py +msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgstr "" + +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + +#: ../fdroidserver/init.py +msgid "X.509 'Distinguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/common.py +msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "ZIP file archive" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "adding IdentityFile to {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "adding to {name}: {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "ambiguous option: %s (%s?)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + +#: ../fdroidserver/common.py +msgid "apksigner not found, it's required for signing!" +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py +#: ../fdroidserver/rewritemeta.py +msgid "application ID of file to operate on" +msgstr "" + +#: ../fdroidserver/build.py ../fdroidserver/install.py +#: ../fdroidserver/publish.py ../fdroidserver/scanner.py +#: ../fdroidserver/verify.py +msgid "application ID with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "argument \"-\" with mode %r" +msgstr "" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "argument %(argument_name)s: %(message)s" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare SSH connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "can not parse scrlib spec (not a string): '{}'" +msgstr "" + +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "can't open non-https url: '{};" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "cannot find required srclibs: \"{path}\"" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "cannot have multiple subparser arguments" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "cannot merge actions - two groups are named %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "cannot publish update, did you set the deploy key?" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "cloning {url}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "commands from plugin modules:" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "complex" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting option string: %s" +msgid_plural "conflicting option strings: %s" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting subparser alias: %s" +msgstr "" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting subparser: %s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "could not parse '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no ref specified): '{}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (too many '@' signs): '{}'" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "created {path}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "deleting: repo/{apkfilename}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed process log {path} to {dest}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "dest= is required for options like %r" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "downloading '{}'" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "downloading scanner signatures from '{}' failed" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "executable binary, possibly code" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "expected %s argument" +msgid_plural "expected %s arguments" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "expected at least one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "expected at most one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "expected one argument" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "fdroid [] [-h|--help|--version|]" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "fetch the latest version of signatures from the web" +msgstr "" + +#: /usr/lib/python3.11/optparse.py +msgid "floating-point" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force metadata errors (default) to be warnings, or to be ignored." +msgstr "" + +#: ../fdroidserver/common.py +msgid "git svn clone failed" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "gzip file archive" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "ignored explicit argument %r" +msgstr "" + +#: ../fdroidserver/index.py +msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + +#: ../fdroidserver/index.py +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "integer" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid %(type)s value: %(value)r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid choice: %(value)r (choose from %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid conflict_resolution value: %r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgstr "" + +#: ../fdroidserver/common.py +msgid "ipfs_cid not found, skipping CIDv1 generation" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be an absolute path!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be directory, not a file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "mirror '%s' does not end with 'fdroid'!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "mutually exclusive arguments must be optional" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "next {name} cache update due in {time}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "no \"icon\" in {appid}" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "no APK supplied" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "no such option: %s" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "no version info found!" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "not allowed with argument %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "one of the arguments %s is required" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/index.py +msgid "only accepts strings, lists, and tuples" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "option %s: If you really want to install all the signed apps, use --all" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "option %s: invalid %s value: %r" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "option %s: invalid choice: %r (choose from %s)" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option -%s not recognized" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option -%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s must not have an argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s not a unique prefix" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s not recognized" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +msgid "optional arguments" +msgstr "" + +#: /usr/lib/python3.11/argparse.py +msgid "options" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "overwriting existing {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "positional arguments" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "process log deploy {path} to {dest} failed!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "ruamel.yaml not installed, can not write metadata." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd sync indexes {path} to {url} and delete" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "scanner cache is malformed! You can clear it with: '{clear}'" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "shared library" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "show program's version number and exit" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py +#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +msgid "show this help message and exit" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "signed APK, either a file-path or HTTPS URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: log content is empty" +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: not enabled in config" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "skipping source tarball: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "srclibs missing name and/or @" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "static library" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "the following arguments are required: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unexpected option string: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unrecognized arguments: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "unsafe permissions on '{config_file}' (should be 0600)!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid +#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +msgid "usage: " +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "using Apache libcloud to sync with {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "virustotal.com is rate limiting, waiting to retry..." +msgstr "" + +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "{0} app, {1} key aliases" +msgid_plural "{0} apps, {1} key aliases" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} ({appid}) has no metadata!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using application ID instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android application ID!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Java Package Name!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{appid} is missing {name}" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: Unknown extlib {path} in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "{appid}: no builds specified, running on current source state" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be an integer, found: {value}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{file} is blank or corrupt!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "{path} already exists, ignoring import results!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "{path} does not exist! Create it by running:" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} is zero size!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} more than 200MB, manually upload: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{url} does not end with \"fdroid\", check the URL path!" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "{url} does not start with \"http\"!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "{} build failed" +msgid_plural "{} builds failed" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/build.py +msgid "{} build succeeded" +msgid_plural "{} builds succeeded" +msgstr[0] "" +msgstr[1] "" From 4ef611e67e0657787cb1fd0998f34b7fdb72dd5e Mon Sep 17 00:00:00 2001 From: "Coool (github.com/Coool)" Date: Wed, 14 Aug 2024 17:30:51 +0000 Subject: [PATCH 1616/2116] Translated using Weblate: Latvian (lv) by "Coool (github.com/Coool)" Currently translated at 0.3% (2 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/lv/ --- locale/lv/LC_MESSAGES/fdroidserver.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/locale/lv/LC_MESSAGES/fdroidserver.po b/locale/lv/LC_MESSAGES/fdroidserver.po index 80e00eeb..383f1c9f 100644 --- a/locale/lv/LC_MESSAGES/fdroidserver.po +++ b/locale/lv/LC_MESSAGES/fdroidserver.po @@ -6,14 +6,15 @@ msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" +"PO-Revision-Date: 2024-08-14 18:07+0000\n" +"Last-Translator: \"Coool (github.com/Coool)\" \n" +"Language-Team: Latvian \n" "Language: lv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= 19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" +"X-Generator: Weblate 5.7-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -87,7 +88,7 @@ msgstr[1] "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" -msgstr "" +msgstr "%(prog)s: kļūda: %(message)s\n" #: ../fdroidserver/publish.py #, python-format @@ -103,7 +104,7 @@ msgstr "" #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" -msgstr "" +msgstr "%prog [opcijas]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py From 5f63577bc7c81079799d643042c0d2bbd1dcd49b Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Sun, 18 Aug 2024 06:00:08 +0000 Subject: [PATCH 1617/2116] Translated using Weblate: Hebrew (he) by Yaron Shahrabani Currently translated at 4.6% (27 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/he/ --- locale/he/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/he/LC_MESSAGES/fdroidserver.po b/locale/he/LC_MESSAGES/fdroidserver.po index 72a5e312..4a17275c 100644 --- a/locale/he/LC_MESSAGES/fdroidserver.po +++ b/locale/he/LC_MESSAGES/fdroidserver.po @@ -1,13 +1,13 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # bobwww , 2022. -# Yaron Shahrabani , 2022, 2023. +# Yaron Shahrabani , 2022, 2023, 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2023-09-21 08:05+0000\n" +"PO-Revision-Date: 2024-08-18 06:27+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" "Language: he\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 5.1-dev\n" +"X-Generator: Weblate 5.7\n" #: ../fdroidserver/nightly.py msgid "" @@ -1447,7 +1447,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" -msgstr "" +msgstr "לשנות שמות של קובצי APK שאינם בתבנית package.name_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" @@ -1472,7 +1472,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" -msgstr "" +msgstr "לשכתב את כל קובצי נתוני העל" #: ../fdroidserver/rewritemeta.py #, python-brace-format From 639d96da30d5da6ee1c5f06fc432a508b3659929 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Mart=C3=ADn?= Date: Tue, 20 Aug 2024 10:57:59 +0000 Subject: [PATCH 1618/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Catal?= =?UTF-8?q?an=20(ca)=20by=20Adri=C3=A0=20Mart=C3=ADn=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 13.7% (80 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ca/ --- locale/ca/LC_MESSAGES/fdroidserver.po | 91 ++++++++++++++------------- 1 file changed, 46 insertions(+), 45 deletions(-) diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index 63f5554d..ee0d1fcb 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -3,20 +3,21 @@ # Rubén , 2023. # pitroig , 2024. # raulmagdalena <4omoald1a@mozmail.com>, 2024. +# Adrià Martín , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-07-22 11:28+0000\n" -"Last-Translator: raulmagdalena <4omoald1a@mozmail.com>\n" +"PO-Revision-Date: 2024-08-20 15:23+0000\n" +"Last-Translator: Adrià Martín \n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.7-dev\n" +"X-Generator: Weblate 5.7\n" #: ../fdroidserver/nightly.py msgid "" @@ -86,8 +87,8 @@ msgstr "\"{url}\" no és un URL vàlid!" #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "l'opció %(option)s requereix l'argument %(number)d" +msgstr[1] "l'opció %(option)s requereix els arguments %(number)d" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -99,7 +100,7 @@ msgstr "%(prog)s: errada: %(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "%d APK no han pogut ser signats o verificats." #: ../fdroidserver/scanner.py #, python-format @@ -174,32 +175,32 @@ msgstr "'sdk_path' no establert a config.yml!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" -msgstr "" +msgstr "«{aapt}» és massa antic, fdroid requereix build-tools-{version} o superior." #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" +msgstr "«{field}» serà en ordre aleatori. Utilitzeu parèntesis () o [] si l'ordre és important." #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" -msgstr "" +msgstr "Error en l'execució de «{path}»." #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "«{path}» té un format invàlid; hauria de ser un diccionari." #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" -msgstr "" +msgstr "«{value}» no és un {field} vàlid a {appid}. Expressió regular: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "" +msgstr "«{value}» no és un {field} vàlid; hauria de ser {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -218,29 +219,29 @@ msgstr "" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" -msgstr "" +msgstr "Cal que l'argument sigui un URL." #: ../fdroidserver/common.py #, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "" +msgstr "Les signatures APK tenen certificats diferents a {path}:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" -msgstr "" +msgstr "Afegeix signatures PGP mitjançant GnuPG per a paquets en un repositori" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" -msgstr "" +msgstr "Afegeix una clau de firma a un repositori sense signar" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" -msgstr "" +msgstr "Afegeix els fitxers d'esquelet per a APK que no en tinguin" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" -msgstr "" +msgstr "S'està afegint un repositori nou només per a {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" @@ -355,7 +356,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Build a package from source" -msgstr "" +msgstr "Construeix un paquet des de l'origen" #: ../fdroidserver/build.py msgid "Build all applications available" @@ -409,7 +410,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" -msgstr "" +msgstr "Cerca actualitzacions a les aplicacions" #: ../fdroidserver/update.py #, python-brace-format @@ -537,7 +538,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "" +msgstr "Esborra els APK o els OBB sense metadades del repositori" #: ../fdroidserver/deploy.py #, python-brace-format @@ -973,7 +974,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" -msgstr "" +msgstr "Instal·la els paquets integrats en dispositius" #: ../fdroidserver/install.py #, python-format @@ -987,7 +988,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" -msgstr "" +msgstr "Interactua amb el servidor HTTP del repositori" #: ../fdroidserver/update.py msgid "Invalid APK" @@ -1411,11 +1412,11 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" -msgstr "" +msgstr "Crea ràpidament un repositori nou" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" -msgstr "" +msgstr "Llegeix tots els fitxers de metadades i surt" #: ../fdroidserver/common.py #, python-brace-format @@ -1452,7 +1453,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" -msgstr "" +msgstr "Canvia el nom dels fitxers APK que no coincideixin amb package.name_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" @@ -1477,7 +1478,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" -msgstr "" +msgstr "Reescriu tots els fitxers de metadades" #: ../fdroidserver/rewritemeta.py #, python-brace-format @@ -1512,7 +1513,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" -msgstr "" +msgstr "Escaneja el codi font d'un paquet" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1572,11 +1573,11 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" -msgstr "" +msgstr "Signa i publica els paquets al repositori" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" -msgstr "" +msgstr "Signa els índexs creats amb update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" @@ -1829,11 +1830,11 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" -msgstr "" +msgstr "Actualitza la informació del repositori amb paquets nous" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" -msgstr "" +msgstr "Actualitza l'informe de transparència binari amb un nou URL" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -1962,7 +1963,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" -msgstr "" +msgstr "Verifica la integritat dels paquets descarregats" #: ../fdroidserver/index.py msgid "Verifying index signature:" @@ -1975,7 +1976,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" -msgstr "" +msgstr "Avisa de possibles errors a les metadades" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2016,14 +2017,14 @@ msgstr "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "" +msgstr "opció ambigua: %(option)s podria correspondre amb %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" -msgstr "" +msgstr "opció ambigua: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" @@ -2346,7 +2347,7 @@ msgstr "" #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" -msgstr "" +msgstr "opció inexistent: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" @@ -2412,14 +2413,14 @@ msgstr "opció -%s demana un argument" #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" -msgstr "" +msgstr "l'opció --%s no pot tenir arguments" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" -msgstr "" +msgstr "l'opció --%s no té un prefix unívoc" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py @@ -2433,7 +2434,7 @@ msgstr "opció --%s not reconeguda" #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" -msgstr "" +msgstr "l'opció --%s requereix un argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2453,7 +2454,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" -msgstr "" +msgstr "arguments posicionals" #: ../fdroidserver/common.py #, python-brace-format @@ -2554,14 +2555,14 @@ msgstr "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" -msgstr "" +msgstr "els arguments següents són obligatoris: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" -msgstr "" +msgstr "cadena d'opcions inesperada: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2575,12 +2576,12 @@ msgstr "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" -msgstr "" +msgstr "arguments desconeguts: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" -msgstr "" +msgstr "permisos a «{config_file}» insegurs (hauria de ser 0600)." #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py From 5871fb6b44841638b201fde1e397e2af655488fd Mon Sep 17 00:00:00 2001 From: unmes Date: Wed, 21 Aug 2024 13:45:14 +0000 Subject: [PATCH 1619/2116] Translated using Weblate: Catalan (ca) by unmes Currently translated at 14.1% (82 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ca/ --- locale/ca/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index ee0d1fcb..e5c0d37e 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -4,13 +4,14 @@ # pitroig , 2024. # raulmagdalena <4omoald1a@mozmail.com>, 2024. # Adrià Martín , 2024. +# unmes , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-08-20 15:23+0000\n" -"Last-Translator: Adrià Martín \n" +"PO-Revision-Date: 2024-08-21 16:21+0000\n" +"Last-Translator: unmes \n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" @@ -118,7 +119,7 @@ msgstr "%prog [options]" #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" -msgstr "" +msgstr "no es pot cridar a %r" #: ../fdroidserver/signindex.py #, python-format @@ -211,7 +212,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" -msgstr "" +msgstr ".__call__() no definida" #: ../fdroidserver/lint.py msgid "/issues is missing" From d121a398418514452394dec75d9b96284ee8ade1 Mon Sep 17 00:00:00 2001 From: pitroig Date: Wed, 21 Aug 2024 16:19:52 +0000 Subject: [PATCH 1620/2116] Translated using Weblate: Catalan (ca) by pitroig Currently translated at 14.1% (82 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ca/ --- locale/ca/LC_MESSAGES/fdroidserver.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index e5c0d37e..7d4db065 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" "PO-Revision-Date: 2024-08-21 16:21+0000\n" -"Last-Translator: unmes \n" +"Last-Translator: pitroig \n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" From 7513cee223cd6e08c1d7062f2daf9713037c597b Mon Sep 17 00:00:00 2001 From: pitroig Date: Wed, 21 Aug 2024 16:40:27 +0000 Subject: [PATCH 1621/2116] Translated using Weblate: Catalan (ca) by pitroig Currently translated at 14.1% (82 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ca/ --- locale/ca/LC_MESSAGES/fdroidserver.po | 51 +++++++++++++-------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index 7d4db065..e39ecdca 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-08-21 16:21+0000\n" +"PO-Revision-Date: 2024-08-21 17:33+0000\n" "Last-Translator: pitroig \n" "Language-Team: Catalan \n" "Language: ca\n" @@ -50,7 +50,7 @@ msgstr "\"local_copy_dir\" {path} no existeix!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "\"{apkfilename}\" ja està instal·lat {dev}." +msgstr "\"{apkfilename}\" ja està instal·lat en {dev}." #: ../fdroidserver/update.py #, python-brace-format @@ -65,7 +65,7 @@ msgstr "\"{path}\" conté {name} ({version}) recent" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" -msgstr "\"{path}\" existeix, però s3cmd no està instalada!" +msgstr "\"{path}\" existeix, però s3cmd no està instal·lada!" #: ../fdroidserver/lint.py #, python-brace-format @@ -89,7 +89,7 @@ msgstr "\"{url}\" no és un URL vàlid!" msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" msgstr[0] "l'opció %(option)s requereix l'argument %(number)d" -msgstr[1] "l'opció %(option)s requereix els arguments %(number)d" +msgstr[1] "les opcions %(option)s requereixen els arguments %(number)d" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -101,7 +101,7 @@ msgstr "%(prog)s: errada: %(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "%d APK no han pogut ser signats o verificats." +msgstr "%d APKs no han pogut ser signats o verificats." #: ../fdroidserver/scanner.py #, python-format @@ -149,7 +149,7 @@ msgstr "'keypass' no s'ha trobat a config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "'keystore' no és NINGÚ i 'smartcardoptions' està en blanc!" +msgstr "" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" @@ -176,32 +176,32 @@ msgstr "'sdk_path' no establert a config.yml!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" -msgstr "«{aapt}» és massa antic, fdroid requereix build-tools-{version} o superior." +msgstr "'{aapt}' és massa antic, fdroid requereix build-tools-{version} o superior." #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "«{field}» serà en ordre aleatori. Utilitzeu parèntesis () o [] si l'ordre és important." +msgstr "'{field}' serà en ordre aleatori. Utilitzeu parèntesis () o [] si l'ordre és important." #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" -msgstr "Error en l'execució de «{path}»." +msgstr "Error en l'execució de '{path}'." #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "«{path}» té un format invàlid; hauria de ser un diccionari." +msgstr "'{path}' té un format invàlid; hauria de ser un diccionari!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" -msgstr "«{value}» no és un {field} vàlid a {appid}. Expressió regular: {pattern}" +msgstr "'{value}' no és un {field} vàlid a {appid}. Expressió regular: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "«{value}» no és un {field} vàlid; hauria de ser {pattern}" +msgstr "'{value}' no és un {field} vàlid; hauria de ser {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -220,7 +220,7 @@ msgstr "" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" -msgstr "Cal que l'argument sigui un URL." +msgstr "Cal que l'argument sigui un URL!" #: ../fdroidserver/common.py #, python-brace-format @@ -229,20 +229,20 @@ msgstr "Les signatures APK tenen certificats diferents a {path}:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" -msgstr "Afegeix signatures PGP mitjançant GnuPG per a paquets en un repositori" +msgstr "Afegiu signatures PGP mitjançant GnuPG per a paquets en un dipòsit" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" -msgstr "Afegeix una clau de firma a un repositori sense signar" +msgstr "Afegiu una clau de firma a un dipòsit sense signar" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" -msgstr "Afegeix els fitxers d'esquelet per a APK que no en tinguin" +msgstr "Afegiu els fitxers d'esquelet per a APKs que no en tinguin" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" -msgstr "S'està afegint un repositori nou només per a {name}" +msgstr "S'està afegint un dipòsit nou només per a {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" @@ -539,7 +539,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "Esborra els APK o els OBB sense metadades del repositori" +msgstr "Esborra els APK o els OBB sense metadades del dipòsit" #: ../fdroidserver/deploy.py #, python-brace-format @@ -989,7 +989,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" -msgstr "Interactua amb el servidor HTTP del repositori" +msgstr "Interactua amb el servidor HTTP del dipòsit" #: ../fdroidserver/update.py msgid "Invalid APK" @@ -1413,7 +1413,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" -msgstr "Crea ràpidament un repositori nou" +msgstr "Crea ràpidament un dipòsit nou" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" @@ -1574,7 +1574,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" -msgstr "Signa i publica els paquets al repositori" +msgstr "Signa i publica els paquets al dipòsit" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" @@ -1831,7 +1831,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" -msgstr "Actualitza la informació del repositori amb paquets nous" +msgstr "Actualitza la informació del dipòsit amb paquets nous" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" @@ -2582,7 +2582,7 @@ msgstr "arguments desconeguts: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" -msgstr "permisos a «{config_file}» insegurs (hauria de ser 0600)." +msgstr "permisos a «{config_file}» insegurs (hauria de ser 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py @@ -2718,10 +2718,9 @@ msgid "{path} is not \"key: value\" dict, but a {datatype}!" msgstr "" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format -#| msgid "'sdk_path' not set in config.yml!" +#, python-brace-format msgid "{path} is not a standard config file!" -msgstr "'sdk_path' no establert a config.yml!" +msgstr "{path} no és un fitxer de configuració estàndard!" #: ../fdroidserver/index.py #, python-brace-format From fb32fd2c4bf8cc320a36cb7f9b1d126b3cc32783 Mon Sep 17 00:00:00 2001 From: pitroig Date: Wed, 21 Aug 2024 17:36:07 +0000 Subject: [PATCH 1622/2116] Translated using Weblate: Catalan (ca) by pitroig Currently translated at 23.6% (137 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ca/ --- locale/ca/LC_MESSAGES/fdroidserver.po | 114 +++++++++++++------------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index e39ecdca..16feef3f 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-08-21 17:33+0000\n" +"PO-Revision-Date: 2024-08-21 18:33+0000\n" "Last-Translator: pitroig \n" "Language-Team: Catalan \n" "Language: ca\n" @@ -206,7 +206,7 @@ msgstr "'{value}' no és un {field} vàlid; hauria de ser {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" -msgstr "" +msgstr "...ha fallat la comprovació de {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -216,7 +216,7 @@ msgstr ".__call__() no definida" #: ../fdroidserver/lint.py msgid "/issues is missing" -msgstr "" +msgstr "Falta /issues" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" @@ -246,7 +246,7 @@ msgstr "S'està afegint un dipòsit nou només per a {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" -msgstr "" +msgstr "Àlies de la clau de signatura del dipòsit al magatzem de claus" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" @@ -254,106 +254,106 @@ msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" -msgstr "" +msgstr "Permet especificar una revisió diferent (o branca git) per a la importació inicial" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" -msgstr "" +msgstr "Replica també la secció completa de l'arxiu" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" -msgstr "" +msgstr "També avisa sobre els problemes de formatació, com ara rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" -msgstr "" +msgstr "Biblioteca Android AAR" #: ../fdroidserver/scanner.py msgid "Android APK file" -msgstr "" +msgstr "Fitxer APK de l'Android" #: ../fdroidserver/scanner.py msgid "Android DEX code" -msgstr "" +msgstr "Codi DEX Android" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "" +msgstr "No s'ha trobat l'SDK d'Android a {path}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" -msgstr "" +msgstr "El camí SDK d'Android '{path}' no existeix!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" -msgstr "" +msgstr "El camí SDK d'Android '{path}' no és un directori!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "" +msgstr "No s'ha trobat l'eina Android SDK {cmd}!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "L'aplicació té binaris però no té el corresponent certificat AllowedAPKSigningKeys per fixar." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" +msgstr "L'aplicació té NoSourceSince o ArchivePolicy \"0 versions\", però AutoUpdateMode o UpdateCheckMode no són None" #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" +msgstr "L'aplicació té NoSourceSince o ArchivePolicy \"0 versions\" o 0 però AutoUpdateMode o UpdateCheckMode no són None" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" -msgstr "" +msgstr "L'aplicació és a '{repo}', però té un enllaç a {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "La versió de l'aplicació té binari, però no té el corresponent certificat AllowedAPKSigningKeys per fixar." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" -msgstr "" +msgstr "No és necessari afegir .git" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" -msgstr "" +msgstr "S'està arxivant {apkfilename} amb una signatura no vàlida!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." -msgstr "" +msgstr "AutoUpdateMode amb UpdateCheckMode: HTTP ha de tenir un patró." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "Tipus d'entrada incorrecta \"{mirrortype}\" a la configuració de miralls: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" -msgstr "" +msgstr "URL base a la rèplica, podeu incloure la clau de signatura de l'índex utilitzant la cadena de consulta: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "" +msgstr "La branca '{branch}' utilitzada com a publicació en la construcció '{versionName}'" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" -msgstr "" +msgstr "La branca '{branch}' s'utilitza com a entrega al srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" -msgstr "" +msgstr "Enllaç simbòlic trencat: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" @@ -361,53 +361,53 @@ msgstr "Construeix un paquet des de l'origen" #: ../fdroidserver/build.py msgid "Build all applications available" -msgstr "" +msgstr "Construeix totes les aplicacions disponibles" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" -msgstr "" +msgstr "Construcció generada per `fdroid import` -elimina la línia de desactivació una vegada llesta" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" -msgstr "" +msgstr "El dipòsit git de metadades de construcció té canvis sense publicar!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" -msgstr "" +msgstr "Construeix només la versió més recent de cada paquet" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" -msgstr "" +msgstr "S'ha construït el dipòsit basat en \"%s\" amb aquesta configuració:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "No es pot actualitzar automàticament l'aplicació sense el CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "No es pot construir a causa d'un error {} en escanejar" +msgstr[1] "No es pot construir a causa d'errors {} en escanejar" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" -msgstr "" +msgstr "No es pot reescriure \"{path}\"" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" -msgstr "" +msgstr "Les categories '%s' no són vàlides" #: ../fdroidserver/lint.py msgid "Categories are not set" -msgstr "" +msgstr "No s'han definit categories" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" +msgstr "Categoria \"{category}\" definida però no utilitzada per a cap aplicació!" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -416,15 +416,15 @@ msgstr "Cerca actualitzacions a les aplicacions" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "" +msgstr "S'està comprovant l'arxivat per a {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" -msgstr "" +msgstr "Actualització neta - no utilitza la memòria cau, reprocessa tots els APK" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." -msgstr "" +msgstr "Llista de categories separades per comes." #: ../fdroidserver/__main__.py #, python-format @@ -433,70 +433,70 @@ msgstr "Ordre '%s' no reconeguda.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" -msgstr "" +msgstr "Publicar els canvis" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" +msgstr "Definicions conflictives de \"{field}\" entre .yml i fitxers localitzats:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." -msgstr "" +msgstr "Arguments conflictius: no es poden especificar al mateix temps '--verbose' i '--quiet'." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "Fitxers de configuració en conflicte! Utilitzant {newfile}, s'ignorarà {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" -msgstr "" +msgstr "No s'ha pogut trobar '{command}' al vostre sistema" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" -msgstr "" +msgstr "No s'ha pogut trobar el codi de versió més recent" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" -msgstr "" +msgstr "No s'ha pogut trobar el codi de versió més recent" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" -msgstr "" +msgstr "No s'ha pogut trobar {path} per eliminar-lo" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "" +msgstr "No s'ha pogut obrir APK {path} per a l'anàlisi: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" -msgstr "" +msgstr "No s'ha pogut analitzar la mida \"{size}\", tipus incorrecte \"{type}\"" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" -msgstr "" +msgstr "No s'ha pogut trobar l'identificador de l'aplicació" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" -msgstr "" +msgstr "No s'ha pogut trobar cap informació de versió" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" -msgstr "" +msgstr "No s'ha pogut trobar l'identificador del paquet" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" -msgstr "" +msgstr "Rebutjant covardament sobreescriure la configuració de la clau de signatura existent!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" -msgstr "" +msgstr "S'ha creat el contenidor nou \"{name}\"" #: ../fdroidserver/deploy.py #, python-brace-format From f693e121359db695035e4f8fff357ce1a83ea2af Mon Sep 17 00:00:00 2001 From: WaldiS Date: Thu, 22 Aug 2024 19:10:48 +0000 Subject: [PATCH 1623/2116] Translated using Weblate: Polish (pl) by WaldiS Currently translated at 98.2% (570 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ --- locale/pl/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 397500a4..21f9ffee 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-06-26 11:09+0000\n" +"PO-Revision-Date: 2024-08-23 10:34+0000\n" "Last-Translator: WaldiS \n" "Language-Team: Polish \n" "Language: pl\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.6-rc\n" +"X-Generator: Weblate 5.7.1-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -899,7 +899,7 @@ msgstr "Resetowanie Git nie powiodło się" #: ../fdroidserver/common.py #, fuzzy msgid "Git submodule deinit failed" -msgstr "Aktualizacja submodułu Git nie powiodła się" +msgstr "Deinit podmodułu Git nie powiódł się" #: ../fdroidserver/common.py msgid "Git submodule sync failed" @@ -2747,7 +2747,7 @@ msgstr "{path} nie jest standardowym plikiem konfiguracyjnym!" #: ../fdroidserver/index.py #, python-brace-format msgid "{path} is not list, but a {datatype}!" -msgstr "" +msgstr "{path} inie jest listą, lecz {datatype}!" #: ../fdroidserver/common.py #, python-brace-format From 8bd395c35af01298da009a401c75298f1c164886 Mon Sep 17 00:00:00 2001 From: paul mayero Date: Thu, 22 Aug 2024 12:53:51 +0000 Subject: [PATCH 1624/2116] Translated using Weblate: Swahili (sw) by paul mayero Currently translated at 98.4% (571 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sw/ --- locale/sw/LC_MESSAGES/fdroidserver.po | 136 ++++++++++++++------------ 1 file changed, 71 insertions(+), 65 deletions(-) diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index 8bf9d549..9144457b 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-08-02 16:18+0000\n" +"PO-Revision-Date: 2024-08-23 10:34+0000\n" "Last-Translator: paul mayero \n" "Language-Team: Swahili \n" "Language: sw\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.7-dev\n" +"X-Generator: Weblate 5.7.1-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -132,7 +132,7 @@ msgstr "%s ina SHA-256 mbaya: %s" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" -msgstr "%s sio sehemu ya ujenzi inayokubalika" +msgstr "%s sio sehemu ya kujenga inayokubalika" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -179,7 +179,7 @@ msgstr "'{aapt}' ni ya zamani sana, fdroid inahitaji zana za kujenga-{version} a #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' itakuwa katika mpangilio nasibu! Tumia () au [] mabano ikiwa agizo ni muhimu!" +msgstr "'{field}' itakuwa katika mpangilio nasibu! Tumia mabano () au [] ikiwa agizo ni muhimu!" #: ../fdroidserver/common.py #, python-brace-format @@ -189,7 +189,7 @@ msgstr "{path} imeshindwa kutekeleza!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "'{path}' ina umbizo batili, inapaswa kuwa kamusi!" +msgstr "'{path}' ina muundo batili, inapaswa kuwa kamusi!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format @@ -204,7 +204,7 @@ msgstr "'{value}' si {field} halali, inapaswa kuwa {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" -msgstr "...sasisho la ukaguzi limeshindwa kwa {appid} : {error}" +msgstr "...sasisho la ukaguzi limeshindwa la{appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -344,9 +344,9 @@ msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "Tawi '{branch}' limefanyiwa matumizi kama ahadi katika ujenzi wa '{versionName}'" #: ../fdroidserver/lint.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" -msgstr "Tawi {branch} limetumiwa kama kufanya katika srclib '{srclib}'" +msgstr "Tawi {branch} limetumika kama kufanya katika srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format @@ -359,7 +359,7 @@ msgstr "Unda kifurushi kutoka kwa chanzo" #: ../fdroidserver/build.py msgid "Build all applications available" -msgstr "Unda apu zote zinazopatikana" +msgstr "Jenga apu zote zinazopatikana" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" @@ -367,7 +367,7 @@ msgstr "Jenga linalotokana na `fdroid import` - ondoa laini ya kulemaza mara tu #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" -msgstr "Ghala ya metadata ya kujenga ina mabadiliko ambayo hayajahifadhiwa!" +msgstr "Jenga ghala ya metadata ya git ina mabadiliko ambayo hayajahifadhiwa!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" @@ -396,16 +396,16 @@ msgstr "Haiwezi kuandika upya \"{path}\"" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" -msgstr "Kategoria ‘%s’ sio halali" +msgstr "Makundi ‘%s’ sio halali" #: ../fdroidserver/lint.py msgid "Categories are not set" -msgstr "Kategoria hazijawekwa" +msgstr "Makundi hayajawekwa" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "Kategoria \"{category}\" imefafanuliwa lakini haitumiki kwa apu yoyote!" +msgstr "Makundi \"{category}\" yamefafanuliwa lakini haitumiki kwa apu yoyote!" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -414,7 +414,7 @@ msgstr "Angalia masasisho ya programu" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Kucheki uhifadhi kwa {appid} - apks:{integer}, keepversions: {keep}, archapks: {arch}" +msgstr "Kuangalia uhifadhi kwa {appid} - apks:{integer}, keepversions: {keep}, archapks: {arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -422,7 +422,7 @@ msgstr "Sasisho safi - usitumie cache, chakata tena APK zote" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." -msgstr "Orodha ya kategoria iliyotenganishwa kwa koma." +msgstr "Orodha ya makundi iliyotenganishwa kwa koma." #: ../fdroidserver/__main__.py #, python-format @@ -431,7 +431,7 @@ msgstr "Amri '%s' haitambuliki.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" -msgstr "hifadhi mabadiliko" +msgstr "Fanya mabadiliko" #: ../fdroidserver/metadata.py #, python-brace-format @@ -468,7 +468,7 @@ msgstr "Haikuweza kupata {path} ili kuiondoa" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "Haikuweza kufungua APK {path} kwa ajili ya uchambuzi: " +msgstr "Haikuweza kufungua APK {path} kwa uchambuzi: " #: ../fdroidserver/common.py #, python-brace-format @@ -481,7 +481,7 @@ msgstr "Haikuweza kupata Kitambulisho cha apu" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" -msgstr "Haikuweza kupata habari yolote ya toleo" +msgstr "Haikuweza kupata habari yoyote ya toleo" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" @@ -494,7 +494,7 @@ msgstr "Kwa uoga inakataa kuandika upya usanidi wa ufunguo wa saini uliopo!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" -msgstr "Imeunda kontena jipya \"{name}\"" +msgstr "Imeunda kontena mpya \"{name}\"" #: ../fdroidserver/deploy.py #, python-brace-format @@ -511,6 +511,7 @@ msgid "Creating new S3 bucket: {url}" msgstr "Inaunda S3 bucket mpya: {url}" #: ../fdroidserver/publish.py +#, fuzzy msgid "Creating output directory" msgstr "Inaunda saraka ya pato" @@ -524,7 +525,7 @@ msgstr "Inaunda saraka ya muda mfupi" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" -msgstr "Inaunda kielezo isiyotiwa sahihi kwa maandalizi ya kutia sahihi" +msgstr "Inaunda kielezo isiyotiwa sahihi kwa maandalizi ya kutiwa sahihi" #: ../fdroidserver/lint.py #, python-brace-format @@ -552,12 +553,12 @@ msgstr "Kufuta historia ya git-mirror, ghala ni kubwa mno ({size} upeo {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" -msgstr "kufuta faili isiyojulikana: {path}" +msgstr "Kufuta faili isiyojulikana: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" -msgstr "Maelezo %s ni muhtasari tu wa apu" +msgstr "Maelezo %s ni muhtasari ya apu tu" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" @@ -585,11 +586,11 @@ msgstr "Je, ulimaanisha {code}?" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" -msgstr "Usiongeze 'disable:' kwa maingizo yaliyotokana nayo" +msgstr "Usiongeze 'disable:' kwa maingizo ya kujenga yaliyotokana nayo" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" -msgstr "Usipeleke faili mpya kwa ghala" +msgstr "Usipeleke faili mpya kwenye ghala" #: ../fdroidserver/mirror.py #, python-brace-format @@ -606,11 +607,11 @@ msgstr "Usiondoe funguo za kibinafsi zilizotokana na keystore" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" -msgstr "Usiunde tarball ya chanzo, muhimu wakati wa kujaribu muundo" +msgstr "Usiunde tarball ya chanzo, muhimu wakati wa kujaribu jengo" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" -msgstr "Usionyeshe upya ghala hio, muhimu wakati wa kujaribu jenga isiyo na muunganisho wa mtandao" +msgstr "Usionyeshe upya ghala hio, muhimu wakati wa kujaribu jengo isiyo na muunganisho wa mtandao" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" @@ -618,7 +619,7 @@ msgstr "Usitumie rsync checksums" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" -msgstr "Pakua vioo kamili vya ghala ndogo" +msgstr "Pakua vioo kamili vya maghala madogo" #: ../fdroidserver/common.py #, python-format @@ -627,12 +628,12 @@ msgstr "Inapakua %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." -msgstr "Kupakua ghala hio tayari imefeli mara moja, si kujaribu tena." +msgstr "Kupakua ghala hio tayari imefeli mara moja, haijaribu tena." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" -msgstr "Kupakua {url} ilifeli. {error}" +msgstr "Kupakua {url} kulifeli. {error}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -642,7 +643,7 @@ msgstr "Nakala ingine ya tamko la kipengele kisichopendelewa katika {path} ilipu #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "Nakala ingine ya ingizo \"%s\" katika vioo vya usanidi!" +msgstr "Nakala ingine ya kuingia \"%s\" katika vioo vya usanidi!" #: ../fdroidserver/lint.py #, python-brace-format @@ -673,7 +674,7 @@ msgstr "HITILAFU: aina ya CI isiyoungwa mkono, marekebisho yanakaribishwa!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "HITILAFU: mwenyeji wa git isiyeungwa mkono \"%s\", marekebisho yanakaribishwa!" +msgstr "HITILAFU: mwenyeji wa git isiyoungwa mkono \"%s\", marekebisho yanakaribishwa!" #: ../fdroidserver/__main__.py #, python-brace-format @@ -700,15 +701,15 @@ msgstr "Kuna hitilafu wakati wa kupata anwani ya ghala" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "Ondoka na msimbo usio wa sifuri ikiwa matatizo yalipatikana" +msgstr "Ondoka na msimbo usio wa sufuri ikiwa matatizo yalipatikana" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "Dondoa metadata ya apu kutoka kwa ghala ya chanzo" +msgstr "Pata metadata ya apu kutoka kwa ghala ya chanzo" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" -msgstr "Dondoa sahihi kutoka kwa APKs" +msgstr "Pata sahihi kutoka kwa APKs" #: ../fdroidserver/update.py #, python-brace-format @@ -718,7 +719,7 @@ msgstr "Imeshindwa kunakili {path}:{error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" -msgstr "Imeshindwa kupakua sahihi kwa '{apkfilename}':{error}" +msgstr "Imeshindwa kupakua sahihi za '{apkfilename}':{error}" #: ../fdroidserver/update.py #, python-brace-format @@ -743,7 +744,7 @@ msgstr "Imeshindwa kupata maelezo ya APK, kufuta {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" -msgstr "Imeshindwa kupata maelezo ya APK. kuruka {path}" +msgstr "Imeshindwa kupata maelezo ya APK. inaruka {path}" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" @@ -752,7 +753,7 @@ msgstr "Imeshindwa kupata alama ya kidole ya ufunguo wa kusaini APK" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" -msgstr "Imeshindwa kusakinisha '{apkfilename}' kwenye {dev}: {error}" +msgstr "Imeshindwa kusimika '{apkfilename}' kwenye {dev}: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" @@ -781,15 +782,15 @@ msgstr "Imekamilika" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Njia za mchango ya Flattr ni za FlattrID: field" +msgstr "Njia za mchango ya Flattr ni za FlattrID: eneo" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" -msgstr "tagi za HTML zilizokatazwa" +msgstr "Tagi za HTML zilizokatazwa" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." -msgstr "Kulazimisha ujenzi wa apu zilizozimwa, na kuendelea bila kujali matatizo ya skana. Inaruhusiwa tu katika hali ya majaribio." +msgstr "Kulazimisha ujenzi wa apu zilizozimwa, na kuendelea bila kujali matatizo ya uchanganuzi. Inaruhusiwa tu katika hali ya majaribio." #: ../fdroidserver/build.py #, python-brace-format @@ -798,7 +799,7 @@ msgstr "Kulazimisha kusitisha ujenzi baada ya muda wa sekunde {0} kumalizika!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." -msgstr "Kulazimisha kuscani kwa apu zilizozimwa na kujenga." +msgstr "Kulazimisha kuchanganua kwa apu zilizozimwa na kujenga." #: ../fdroidserver/update.py #, python-brace-format @@ -812,7 +813,7 @@ msgstr "Imepata faili ya fedha mbaya \"{path}\" ya \"{name}\":" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" -msgstr "Imepatikana appids batili katika hoja" +msgstr "Imepata appids batili katika hoja" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py @@ -822,7 +823,7 @@ msgstr "Ilipata versionCodes batili katika baadhi ya apu" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "Imepatikana faili nyingi za JAR Signature Block katika {path}" +msgstr "Imepata faili nyingi za JAR Signature Block katika {path}" #: ../fdroidserver/common.py msgid "Found multiple Signer Certificates!" @@ -835,11 +836,11 @@ msgstr "Imepata faili nyingi za metadata kwa {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." -msgstr "Imatapa vyeti vingi vya kusaini kwa ghala." +msgstr "Imepata vyeti vingi vya kusaini ya ghala." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." -msgstr "Haikupata vyeti vyovyote vya kusaini kwa ghala." +msgstr "Haikupata vyeti vyovyote vya kusaini ya ghala." #: ../fdroidserver/lint.py #, python-format @@ -862,7 +863,7 @@ msgid "Found {count} warnings in {filename}" msgstr "Imepata onyo {count} katika {filename}" #: ../fdroidserver/update.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Generated skeleton metadata for {appid}" msgstr "Imeunda kiunzi cha metadata kwa {appid}" @@ -928,7 +929,7 @@ msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Inapuuza ingizo la FUNDING.yml iliyo ndefu kuliko 2048: %s" #: ../fdroidserver/update.py -#, python-format +#, fuzzy, python-format msgid "Ignoring bad element in manifest: %s" msgstr "Inapuuza kipengee kibaya katika manisfest: %s" @@ -973,7 +974,7 @@ msgstr "Kuanzisha submodules" #: ../fdroidserver/install.py msgid "Install all signed applications available" -msgstr "Sakinisha apu zote zilizosainiwa zinazopatikana" +msgstr "Simika apu zote zilizosainiwa zinazopatikana" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" @@ -982,12 +983,12 @@ msgstr "Sakinisha vifurushi kwenye vifaa" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." -msgstr "Inasakinisha %s..." +msgstr "Inasimika %s..." #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." -msgstr "Inasakinisha '{apkfilename}' kwenye {dev}..." +msgstr "Inasimika '{apkfilename}' kwenye {dev}..." #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" @@ -995,27 +996,27 @@ msgstr "Wasiliana na seva ya ghala ya HTTP" #: ../fdroidserver/update.py msgid "Invalid APK" -msgstr "APK iliyo batili" +msgstr "APK batili" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "AutoUpdateMode iliyo batili: {mode}" +msgstr "AutoUpdateMode batili: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "UpdateCheckMode iliyo batili: {mode}" +msgstr "UpdateCheckMode batili: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" -msgstr "VercodeOperation iliyo batili: {field}" +msgstr "VercodeOperation batili: {field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" -msgstr "VercodeOperation iliyo batili: {invalid_ops}" +msgstr "VercodeOperation batili: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format @@ -1025,11 +1026,11 @@ msgstr "Kitambulisho batili cha apu {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" -msgstr "Boolean iliyo batili '%s'" +msgstr "Boolean batili '%s'" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" -msgstr "Orodha ya vitone iliyo batili" +msgstr "Orodha ya vitone batili" #: ../fdroidserver/common.py #, python-format @@ -1049,12 +1050,12 @@ msgstr "Elekezo mpya batili kwa non-HTTPS:{before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" -msgstr "metadata ya scrlib iliyo batili: '{file}' haipo" +msgstr "metadata ya scrlib batili: '{file}' haipo" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" -msgstr "Metadata ya srclib iliyo batili: haikuweza kuchambua '{file}'" +msgstr "Metadata ya srclib batili: haikuweza kuchambua '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1078,15 +1079,16 @@ msgstr "Faili ya JAR ya Java" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "JDK ya Java haijapatikana! Sakinisha katika sehemu ya kiwango au seti java_paths!" +msgstr "JDK ya Java haijapatikana! Simika katika sehemu ya kiwango au seti java_paths!" #: ../fdroidserver/scanner.py +#, fuzzy msgid "Java compiled class" -msgstr "darasa lililoharirirwa la Java" +msgstr "Darasa lililoharirirwa la Java" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" -msgstr "jarsigner ya Java haijapatikana! Sakinisha katika sehemu ya kawaida au seti java_paths!" +msgstr "jarsigner ya Java haijapatikana! Simika katika sehemu ya kawaida au seti java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" @@ -1098,6 +1100,7 @@ msgid "Keeping failed build \"{apkfilename}\"" msgstr "Kuweka jenga zilizofeli \"{apkfilename}\"" #: ../fdroidserver/init.py +#, fuzzy msgid "Keystore for signing key:\t" msgstr "Hifadhi ya funguo ya ufunguo wa kusaini:\t" @@ -1111,6 +1114,7 @@ msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{uc msgstr "Mabadiliko ya mwisho yaliyotumika ya '{commit}' yanafanana na tagi, lakini UpdateCheckMode ni '{ucm}'" #: ../fdroidserver/lint.py +#, fuzzy msgid "Liberapay donation methods belong in the Liberapay: field" msgstr "Njia za mchango ya Liberapay inapatikana kwa Liberapay: field" @@ -1124,11 +1128,11 @@ msgstr "Eneo limejumuishwa katika URL ya f-droid.org" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" -msgstr "Fanya ujenzi kusimama kwa hitilafu" +msgstr "Fanya ujenzi kuacha kwa ubaguzi" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." -msgstr "vioo vya ghala yenye umbo mbovu." +msgstr "Vioo vya ghala yenye umbo mbovu." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" @@ -1137,17 +1141,19 @@ msgstr "Laini ya serverwebroot yenye umbo bovu:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "Kina cha juu cha kurudiwa katika faili ya ZIP imefikiwa: %s" +msgstr "Upeo wa kina cha urejeshaji katika faili ya ZIP umefikiwa: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Akisi ghala mzima na uhifadhi, aina zote za faili." #: ../fdroidserver/gpgsign.py +#, fuzzy msgid "Missing output directory" msgstr "Inakosa saraka ya pato" #: ../fdroidserver/metadata.py +#, fuzzy msgid "Moving Anti-Features declarations to localized files:" msgstr "Inasongesha tamko la Anti-Features kwa faili zilizolocaliziwa:" From b8a83bfac5dbb5c2ee3ddef0c7ba03520b0f11d0 Mon Sep 17 00:00:00 2001 From: paul mayero Date: Fri, 23 Aug 2024 23:13:36 +0000 Subject: [PATCH 1625/2116] Translated using Weblate: Swahili (sw) by paul mayero Currently translated at 98.2% (570 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sw/ --- locale/sw/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index 9144457b..b37a6799 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-08-23 10:34+0000\n" +"PO-Revision-Date: 2024-08-25 00:09+0000\n" "Last-Translator: paul mayero \n" "Language-Team: Swahili \n" "Language: sw\n" @@ -1179,6 +1179,7 @@ msgid "No fingerprint in URL." msgstr "Hakuna alama ya kidole kwenye URL." #: ../fdroidserver/common.py +#, fuzzy msgid "No git submodules available" msgstr "Hakuna submodule ya git inayopatikana" @@ -1188,11 +1189,11 @@ msgstr "Hakuna mradi wa gradle imeweza kupatikana. Bainisha --subdir?" #: ../fdroidserver/import_subcommand.py msgid "No information found." -msgstr "Hakuna habari imepatikana." +msgstr "Hakuna taarifa imepatikana." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" -msgstr "Hakuna tagi zinazolingana imepatikana" +msgstr "Hakuna tagi zimepatikana zinazolingana" #: ../fdroidserver/update.py #, python-brace-format @@ -1209,7 +1210,7 @@ msgstr "Hiana haja ya kubainisha kuwa apu hio ni ya Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" -msgstr "Hakuna chaguo lililowekwa! Hariri config.yml iseti angalau moja ya hizi:" +msgstr "Hakuna chaguo lililowekwa! Hariri config.yml iweke angalau moja ya hizi:" #: ../fdroidserver/common.py msgid "No packages specified" From f3ac6d8038d779d1514a529a5db289ed2c1d44c5 Mon Sep 17 00:00:00 2001 From: pitroig Date: Mon, 26 Aug 2024 14:19:03 +0000 Subject: [PATCH 1626/2116] Translated using Weblate: Catalan (ca) by pitroig Currently translated at 100.0% (580 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ca/ --- locale/ca/LC_MESSAGES/fdroidserver.po | 907 +++++++++++++------------- 1 file changed, 459 insertions(+), 448 deletions(-) diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index 16feef3f..b9848f73 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-08-21 18:33+0000\n" +"PO-Revision-Date: 2024-08-26 17:39+0000\n" "Last-Translator: pitroig \n" "Language-Team: Catalan \n" "Language: ca\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.7\n" +"X-Generator: Weblate 5.7.1-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -149,7 +149,7 @@ msgstr "'keypass' no s'ha trobat a config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" +msgstr "'keystore' és NONE i 'smartcardoptions' està en blanc!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" @@ -250,7 +250,7 @@ msgstr "Àlies de la clau de signatura del dipòsit al magatzem de claus" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "Manca AllowedAPKSigningKeys però s'ha subministrat el binari de referència" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" @@ -501,41 +501,41 @@ msgstr "S'ha creat el contenidor nou \"{name}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." -msgstr "" +msgstr "S'està creant \"{path}\" per configurar s3cmd." #: ../fdroidserver/publish.py msgid "Creating log directory" -msgstr "" +msgstr "S'està creant el directori de registre" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" -msgstr "" +msgstr "S'està creant un contenidor S3 nou: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" -msgstr "" +msgstr "S'està creant el directori de sortida" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" -msgstr "" +msgstr "S'està creant l'índex signat amb aquesta clau (SHA256):" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" -msgstr "" +msgstr "S'està creant el directori temporal" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" -msgstr "" +msgstr "S'està creant un índex sense signar en preparació per a la signatura" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "" +msgstr "CurrentVersionCode {cv} és menys que l'entrada de construcció més antiga {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" -msgstr "" +msgstr "DEBUG theKEYSTORE no està definit o el valor és incomplet" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" @@ -544,141 +544,143 @@ msgstr "Esborra els APK o els OBB sense metadades del dipòsit" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "" +msgstr "S'està suprimint l'arxiu, el dipòsit és massa gran ({size} màxim {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "" +msgstr "S'està suprimint l'historial del mirall de git, el dipòsit és massa gran ({size} màxim {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" -msgstr "" +msgstr "S'està suprimint el fitxer desconegut: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" -msgstr "" +msgstr "La descripció '%s' és només el resum de l'aplicació" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" -msgstr "" +msgstr "La descripció té una línia duplicada" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" +msgstr "La descripció té una llista (%s) però no té pics (*) ni numerats (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" -msgstr "" +msgstr "La descripció de la longitud {length} és superior al límit de {limit} caràcters" #: ../fdroidserver/common.py #, python-brace-format msgid "Did you mean config/{name}.yml?" -msgstr "" +msgstr "Volíeu dir config/{name}.yml?" #: ../fdroidserver/lint.py #, python-brace-format msgid "Did you mean {code}?" -msgstr "" +msgstr "Volíeu dir {code}?" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" -msgstr "" +msgstr "No afegeixis 'disable:' a les entrades generades de construcció" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" -msgstr "" +msgstr "No despleguis els fitxers nous al dipòsit" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" -msgstr "" +msgstr "No incloeu \"{path}\" a l'URL!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" -msgstr "" +msgstr "No preguntis pel camí de l'SDK de l'Android, simplement falla" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" -msgstr "" +msgstr "No eliminis les claus privades generades de l'espai de claus" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" -msgstr "" +msgstr "No crea un arxiu tar d'origen, útil quan es prova una construcció" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" -msgstr "" +msgstr "No actualitzar el dipòsit, útil quan es prova una construcció sense connexió a Internet" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" -msgstr "" +msgstr "No usis les sumes de verificació \"rsync\"" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" -msgstr "" +msgstr "Baixa les rèpliques completes dels petits dipòsits" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "S'està baixant %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." -msgstr "" +msgstr "La baixada del repositori ja ha fallat una vegada, no s'ha tornat a provar." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" -msgstr "" +msgstr "Ha fallat la baixada de {url}. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "" +msgstr "S'ha ignorat la declaració de característiques no adients per duplicada a {path}!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "" +msgstr "Entrada duplicada \"%s\" a la configuració de les rèpliques!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" -msgstr "" +msgstr "Enllaç duplicat a '{field}': {url}" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "ERROR: %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" +msgstr "ERROR: S'ha eliminat la subordre \"servidor\", useu \"deploy\"!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" +"ERROR: aquesta ordre no s'ha d'utilitzar mai per a replicar f-droid.org!\n" +"Una rèplica completa de f-droid.org requereix més de 200 GB." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" -msgstr "" +msgstr "ERROR: tipus CI no suportat, pedaços benvinguts!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "" +msgstr "ERROR: no s'admet l'amfitrió git \"%s\", els pedaços són benvinguts!" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "" +msgstr "La codificació està establerta a '{enc}' fdroid podria tenir problemes de codificació. Si us plau, establiu-lo a 'UTF-8' per obtenir els millors resultats." #: ../fdroidserver/init.py #, python-format @@ -686,292 +688,294 @@ msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" +"Introduïu aquí el camí cap a l'SDK d'Android (%s):\n" +"> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "La variable d'entorn {var} de {configname} no està establerta!" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" -msgstr "" +msgstr "S'ha produït un error en obtenir l'adreça del dipòsit" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" +msgstr "Sortiu amb un codi non-zero si s'han trobat problemes" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "" +msgstr "Extreu les metadades de l'aplicació des d'un dipòsit de codi font" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" -msgstr "" +msgstr "Extreu les signatures dels APKs" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" -msgstr "" +msgstr "No s'ha pogut copiar {path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" -msgstr "" +msgstr "No s'han pogut recuperar les signatures per a '{apkfilename}': {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" -msgstr "" +msgstr "No s'ha pogut llegir {path}: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" -msgstr "" +msgstr "No s'ha pogut canviar la mida de {path}: {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" -msgstr "" +msgstr "No s'ha pogut crear el contenidor S3: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" -msgstr "" +msgstr "No s'ha pogut obtenir la informació APK, s'està suprimint {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" -msgstr "" +msgstr "No s'ha pogut obtenir la informació de l'APK, s'ometrà {path}" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" -msgstr "" +msgstr "No s'ha pogut obtenir l'empremta digital de la clau de signatura APK" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" -msgstr "" +msgstr "No s'ha pogut instal·lar '{apkfilename}' a {dev}: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" -msgstr "" +msgstr "No s'ha pogut signar l'aplicació" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" -msgstr "" +msgstr "S'ha establert buildserverid des de la MV: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" -msgstr "" +msgstr "Signatures fixades per a '{apkfilename}' -> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" -msgstr "" +msgstr "El fitxer ha desaparegut en processar-lo: {path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" -msgstr "" +msgstr "Finalitzat" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" +msgstr "Els mètodes de donació de Flattr pertanyen a FlattrID: camp" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" -msgstr "" +msgstr "Etiquetes HTML prohibida" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." -msgstr "" +msgstr "Força la construcció d'aplicacions desactivades i continua sense tenir en compte els problemes d'escaneig. Només es permet en mode de prova." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" -msgstr "" +msgstr "Força aturar la construcció després de {0} segons de temps d'espera!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." -msgstr "" +msgstr "Força l'escaneig de les aplicacions i construccions desactivades." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" -msgstr "" +msgstr "S'ha trobat el gràfic \"{path}\" sense metadades per a l'aplicació «{name}»!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" -msgstr "" +msgstr "S'ha trobat un fitxer de finançament incorrecte \"{path}\" per a \"{name}\":" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" -msgstr "" +msgstr "S'han trobat aplicacions no vàlides als arguments" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" -msgstr "" +msgstr "S'han trobat versionsCodes no vàlides per a algunes aplicacions" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "" +msgstr "S'han trobat múltiples fitxers de bloc de signatura JAR a {path}" #: ../fdroidserver/common.py msgid "Found multiple Signer Certificates!" -msgstr "" +msgstr "S'han trobat múltiples certificats de signatura!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" -msgstr "" +msgstr "S'han trobat múltiples fitxers de metadades per a {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." -msgstr "" +msgstr "S'han trobat múltiples certificats de signatura per al dipòsit." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." -msgstr "" +msgstr "No s'ha trobat cap certificat de signatura per al dipòsit." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" -msgstr "" +msgstr "S'ha trobat un no-fitxer a %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" -msgstr "" +msgstr "S'ha trobat {apkfilename} al {url}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" -msgstr "" +msgstr "S'han trobat {count} problemes al {filename}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" -msgstr "" +msgstr "S'han trobat {count} avisos al {filename}" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" -msgstr "" +msgstr "S'han generat metadades d'esquelet per a {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" -msgstr "" +msgstr "Ha fallat la comprovació del Git de «%s»" #: ../fdroidserver/common.py msgid "Git clean failed" -msgstr "" +msgstr "Ha fallat la neteja del Git" #: ../fdroidserver/common.py msgid "Git fetch failed" -msgstr "" +msgstr "Ha fallat l'obtenció del Git" #: ../fdroidserver/common.py msgid "Git prune failed" -msgstr "" +msgstr "Ha fallat la poda del Git" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" -msgstr "" +msgstr "Ha fallat el set-head remot del Git: «%s»" #: ../fdroidserver/common.py msgid "Git reset failed" -msgstr "" +msgstr "Ha fallat el restabliment del Git" #: ../fdroidserver/common.py msgid "Git submodule deinit failed" -msgstr "" +msgstr "Ha fallat l'inici del submòdul Git" #: ../fdroidserver/common.py msgid "Git submodule sync failed" -msgstr "" +msgstr "Ha fallat la sincronització del submòdul Git" #: ../fdroidserver/common.py msgid "Git submodule update failed" -msgstr "" +msgstr "Ha fallat l'actualització del submòdul del Git" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" -msgstr "" +msgstr "HTTPS s'ha d'utilitzar amb URL de Subversion!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "" +msgstr "Si una rèplica de git es fa gran, permet que l'arxiu se suprimeixi" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "" +msgstr "Si aquesta pujada falla, proveu de pujar manualment a {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "" +msgstr "S'ignorarà '{field}' a les metadades '{metapath}' perquè està obsolet." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" -msgstr "" +msgstr "S'ignorarà l'entrada FUNDING.yml més llarga de 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "" +msgstr "S'ignorarà l'element incorrecte al manifest: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " -msgstr "" +msgstr "S'ignorarà el paquet sense metadades: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" -msgstr "" +msgstr "S'estan ignorant les dades de la memòria cau obsoleta per a {apkfilename}" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "" +msgstr "Inclou els APK que estan signats amb algorismes desactivats com MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" -msgstr "" +msgstr "Inclou els fitxers .asc de signatura PGP a la rèplica" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" -msgstr "" +msgstr "Inclou els registres de construcció al mirall" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" -msgstr "" +msgstr "Inclou els arxius tar d'origen al mirall" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" -msgstr "" +msgstr "S'inclouen les metadades de %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" -msgstr "" +msgstr "S'inclouen les metadades de {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" -msgstr "" +msgstr "S'estan inicialitzant els submòduls" #: ../fdroidserver/install.py msgid "Install all signed applications available" -msgstr "" +msgstr "Instal·la totes les aplicacions signades disponibles" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" @@ -980,12 +984,12 @@ msgstr "Instal·la els paquets integrats en dispositius" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." -msgstr "" +msgstr "S'està instal·lant %s..." #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." -msgstr "" +msgstr "S'està instal·lant '{apkfilename}' a {dev}..." #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" @@ -993,308 +997,308 @@ msgstr "Interactua amb el servidor HTTP del dipòsit" #: ../fdroidserver/update.py msgid "Invalid APK" -msgstr "" +msgstr "APK no vàlid" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "AutoUpdateMode no vàlid: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "" +msgstr "UpdateCheckMode no vàlid: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" -msgstr "" +msgstr "VercodeOperation no vàlid: {field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" -msgstr "" +msgstr "VercodeOperation no vàlid: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" -msgstr "" +msgstr "ID d'aplicació {appid} invàlid" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" -msgstr "" +msgstr "El booleà '%s' no és vàlid" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" -msgstr "" +msgstr "Llista de pics no vàlida" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" -msgstr "" +msgstr "Nom no vàlid per al fitxer publicat: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "ndk no vàlid: entrada a la construcció: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " -msgstr "" +msgstr "Redireccions no vàlides a no HTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" -msgstr "" +msgstr "Metadades scrlib no vàlides: '{file}' no existeix" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" -msgstr "" +msgstr "Metadades srclib no vàlides: no s'ha pogut analitzar '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "" +msgstr "Metadades srclib no vàlides: clau desconeguda '{key}' a '{file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" -msgstr "" +msgstr "No s'ha pogut verificar la signatura JAR: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" -msgstr "" +msgstr "S'ha verificat la signatura JAR: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" -msgstr "" +msgstr "Fitxer JAR del Java" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "" +msgstr "No s'ha trobat el Java JDK! Instal·leu-lo en una ubicació estàndard o establiu java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" -msgstr "" +msgstr "Classe compilada de Java" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" -msgstr "" +msgstr "No s'ha trobat el jarsigner de Java! Instal·leu-lo en una ubicació estàndard o establiu java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" -msgstr "" +msgstr "Javascript en els atributs HTML src" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "" +msgstr "Ha fallat el manteniment de la construcció \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" -msgstr "" +msgstr "Keystore per a la clau de signatura:\t" #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "" +msgstr "La clau de depuració coneguda s'utilitza a AllowedAPKSigningKeys: " #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "" +msgstr "L'última publicació utilitzada '{commit}' sembla una etiqueta, però UpdateCheckMode és '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" -msgstr "" +msgstr "Els mètodes de donació de Liberapay pertanyen al camp Liberapay: field" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" -msgstr "" +msgstr "Llista els fitxers que es reformatitzaran (execució seca)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" -msgstr "" +msgstr "Configuració regional inclosa a l'URL de f-droid.org" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" -msgstr "" +msgstr "Fes que la construcció s'aturi amb excepcions" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." -msgstr "" +msgstr "Espills de dipòsit mal formats." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" -msgstr "" +msgstr "Línia mal formada de serverwebroot:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "" +msgstr "S'ha arribat a la profunditat màxima de recursivitat en el fitxer ZIP: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." -msgstr "" +msgstr "Reflecteix el dipòsit complet i l'arxiu, tots els tipus de fitxers." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" -msgstr "" +msgstr "Falta el directori de sortida" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" +msgstr "S'estan movent les declaracions de característiques no adients als fitxers localitzats:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" +msgstr "Ni \"repo_pubkey\" ni \"keystorepass\" estan establerts a config.yml" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" -msgstr "" +msgstr "No hi ha APK per al paquet: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" -msgstr "" +msgstr "No s'ha trobat cap SDK d'Android!" #: ../fdroidserver/install.py msgid "No attached devices found" -msgstr "" +msgstr "No s'ha trobat cap dispositiu adjunt" #: ../fdroidserver/index.py msgid "No fingerprint in URL." -msgstr "" +msgstr "No hi ha cap empremta digital a l'URL." #: ../fdroidserver/common.py msgid "No git submodules available" -msgstr "" +msgstr "No hi ha submòduls git disponibles" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" -msgstr "" +msgstr "No s'ha pogut trobar cap projecte de gradle. Voleu especificar --subdir?" #: ../fdroidserver/import_subcommand.py msgid "No information found." -msgstr "" +msgstr "No s'ha trobat informació." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" -msgstr "" +msgstr "No s'ha trobat cap etiqueta coincident" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "" +msgstr "No s'ha trobat cap versió SDK mínima a {0}, s'usarà el valor per defecte (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" -msgstr "" +msgstr "No cal especificar que l'aplicació és programari lliure" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" -msgstr "" +msgstr "No cal especificar que l'aplicació és per a Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" -msgstr "" +msgstr "No s'ha establert cap opció! Editeu el vostre config.yml per establir almenys un d'aquests:" #: ../fdroidserver/common.py msgid "No packages specified" -msgstr "" +msgstr "No s'ha especificat cap paquet" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" -msgstr "" +msgstr "No hi ha disponible APK signat per a %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" -msgstr "" +msgstr "No hi ha cap directori de sortida signat - res a fer" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" -msgstr "" +msgstr "No s'ha trobat cap certificat de signatura a {path}" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" -msgstr "" +msgstr "No existeix el paquet: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" -msgstr "" +msgstr "No existeix el codi de versió {versionCode} per a l'aplicació {appid}" #: ../fdroidserver/checkupdates.py msgid "No tags found" -msgstr "" +msgstr "No s'ha trobat cap etiqueta" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" -msgstr "" +msgstr "No hi ha cap directori sense signar - res a fer" #: ../fdroidserver/__main__.py msgid "No version information could be found." -msgstr "" +msgstr "No s'ha pogut trobar cap informació de versió." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" -msgstr "" +msgstr "Definició de mida no vàlida: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" -msgstr "" +msgstr "No hi ha res a fer" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." -msgstr "" +msgstr "No hi ha res a fer per {appid}." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" -msgstr "" +msgstr "Ara establiu-los a config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" -msgstr "" +msgstr "El fitxer OBB té una versionCode({integer}) més nova que qualsevol APK:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" -msgstr "" +msgstr "El nom de fitxer OBB ha de començar amb \"main.\" o \"patch.\":" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" -msgstr "" +msgstr "El nom del paquet de l'OBB no coincideix amb un APK compatible:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" +msgstr "Màquina fora de línia, s'ometrà la generació del mirall git fins al `fdroid deploy`" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" -msgstr "" +msgstr "Només s'admeten PNG i JPEG per als gràfics, s'ha trobat: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" -msgstr "" +msgstr "Imprimeix només les diferències amb la Play Store" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" -msgstr "" +msgstr "Només processa aplicacions amb actualitzacions automàtiques" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "" +msgstr "Els mètodes de donació OpenCollective pertanyen al camp OpenCollective: field" #: /usr/lib/python3.11/optparse.py msgid "Options" @@ -1302,114 +1306,114 @@ msgstr "Opcions" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." -msgstr "" +msgstr "Informe de sortida JSON a un fitxer anomenat segons l'APK." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." -msgstr "" +msgstr "Sortida JSON a stdout." #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" -msgstr "" +msgstr "JSON de sortida" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." -msgstr "" +msgstr "Llicència general del projecte." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "" +msgstr "S'està reemplaçant el versionName en blanc a {apkfilename} des de les metadades: {version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" -msgstr "" +msgstr "El paquet \"{appid}\" ja existeix" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" -msgstr "" +msgstr "S'està analitzant el manifest a '{path}'" #: ../fdroidserver/common.py msgid "Password required with username" -msgstr "" +msgstr "Cal una contrasenya amb el nom d'usuari" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." -msgstr "" +msgstr "Camí al subdirectori principal del projecte Android, si no és a l'arrel." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" -msgstr "" +msgstr "Camí al SDK d'Android (de vegades establert a ANDROID_HOME)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" -msgstr "" +msgstr "Camí al dipòsit git a usar com a registre" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" -msgstr "" +msgstr "Camí al magatzem de claus per a la clau de signatura del dipòsit" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" -msgstr "" +msgstr "Imprimeix la variable secreta al terminal per a copiar/enganxar fàcilment" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" -msgstr "" +msgstr "Problema amb el fitxer ZIP: %s, error %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" -msgstr "" +msgstr "Problema amb xml a '{path}'" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" -msgstr "" +msgstr "Processa les actualitzacions automàtiques" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" -msgstr "" +msgstr "S'està processant {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" -msgstr "" +msgstr "S'està processant {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" -msgstr "" +msgstr "Produeix XML/JSON llegible per humans per a fitxers d'índex" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." -msgstr "" +msgstr "URL del projecte des del qual importar." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" -msgstr "" +msgstr "S'ha d'evitar la puntuació" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" -msgstr "" +msgstr "Empeny el registre a aquest repositori remot git" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" -msgstr "" +msgstr "S'està enviant el registre de transparència binària a {url}" #: ../fdroidserver/deploy.py msgid "Pushing to remote server failed!" -msgstr "" +msgstr "Ha fallat l'enviament al servidor remot!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" -msgstr "" +msgstr "S'està pujant a {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" @@ -1422,35 +1426,35 @@ msgstr "Llegeix tots els fitxers de metadades i surt" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" -msgstr "" +msgstr "S'està llegint '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" -msgstr "" +msgstr "Ha fallat la lectura del nompaquet/versioCodi/versioNom, l'APK no és vàlid: '{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" -msgstr "" +msgstr "Ha fallat la lectura del nompaquet/versioCodi/versioNom, l'APK no és vàlid: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" -msgstr "" +msgstr "S'està llegint {apkfilename} des de la memòria cau" #: ../fdroidserver/build.py msgid "Refresh and cache scanner rules and signatures from the network" -msgstr "" +msgstr "Actualitza i cau les regles de l'escàner i les signatures de la xarxa" #: ../fdroidserver/common.py msgid "Removing specified files" -msgstr "" +msgstr "S'estan suprimint els fitxers especificats" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "S'està suprimint {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -1458,24 +1462,24 @@ msgstr "Canvia el nom dels fitxers APK que no coincideixin amb package.name_123. #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "El mode d'actualització del RepoTrunk només té sentit en els dipòsits git-svn" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" +msgstr "Restableix i crea un servidor de construcció nou, fins i tot si l'existent sembla estar bé." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" -msgstr "" +msgstr "S'està resignant {apkfilename} amb la depuració proporcionada per debug.keystore" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" -msgstr "" +msgstr "Canvia la mida de totes les icones que excedeixen la mida màxima del píxel i surt" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" -msgstr "" +msgstr "Restringeix la sortida a avisos i errors" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1484,33 +1488,33 @@ msgstr "Reescriu tots els fitxers de metadades" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" -msgstr "" +msgstr "S'està reescrivint '{appid}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" -msgstr "" +msgstr "Executa en el diposit git que té canvis no publicats" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" -msgstr "" +msgstr "Executa rewritemeta per esmenar el format" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" -msgstr "" +msgstr "S'està executant la primera passada amb la comprovació MD5 desactivada" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" -msgstr "" +msgstr "S'està executant wget a {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "" +msgstr "El SHA-256 de {url} no coincideix amb l'entrada!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "" +msgstr "Escaneja els APK(s) resultants per a les classes conegudes no lliures." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" @@ -1519,58 +1523,58 @@ msgstr "Escaneja el codi font d'un paquet" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" -msgstr "" +msgstr "L'escàner ha trobat {count} problemes a {apk}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" -msgstr "" +msgstr "L'escàner ha trobat {count} problemes a {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" -msgstr "" +msgstr "S'han trobat {count} problemes a {appid}:{versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "L'escàner ha trobat {} problema" +msgstr[1] "L'escàner ha trobat {} problemes" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." -msgstr "" +msgstr "S'està escanejant l'APK amb dexdump per a les classes no lliures conegudes." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "" +msgstr "Estableix NDK {release} ({version}) cap amunt" #: ../fdroidserver/common.py msgid "Set clock to that time using:" -msgstr "" +msgstr "Estableix el rellotge a aquest temps utilitzant:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "" +msgstr "Estableix el nombre màxim de llançaments al dipòsit abans que s'arxivin els més antics" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" -msgstr "" +msgstr "Estableix el límit de fitxer obert a {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" -msgstr "" +msgstr "Configura una construcció d'aplicació per a un dipòsit de construcció nocturn" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " -msgstr "" +msgstr "Ha fallat l'establiment del límit de fitxer obert: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" -msgstr "" +msgstr "S'està establint el temps d'espera de {0} segons per a aquesta construcció" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" @@ -1582,128 +1586,128 @@ msgstr "Signa els índexs creats amb update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" -msgstr "" +msgstr "Omet l'escaneig del codi font pels binaris i altres problemes" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" -msgstr "" +msgstr "S'està saltant \"{apkfilename}\" amb una signatura no vàlida!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "S'ometrà la rèplica de les pàgines del GitLab perquè el dipòsit és massa gran (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" -msgstr "" +msgstr "S'està ometent la generació de l'índex per a {appid}" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" -msgstr "" +msgstr "S'està ometent {apkfilename} amb una signatura no vàlida!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" -msgstr "" +msgstr "Omet {appid}: desactivat" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" -msgstr "" +msgstr "Especifiqueu una carpeta local a la qual sincronitzar el dipòsit" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" -msgstr "" +msgstr "Especifiqueu un fitxer d'identitat que s'ha de proporcionar a SSH per a la sincronització" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." -msgstr "" +msgstr "Especifiqueu quin fitxer de depuració del magatzem de claus s'ha d'utilitzar." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" -msgstr "" +msgstr "Escampa encara més informació de la normal" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" -msgstr "" +msgstr "S'està suprimint la signatura de misteri de {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" -msgstr "" +msgstr "El resum '%s' només és el nom de l'aplicació" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" -msgstr "" +msgstr "El resum de la longitud {length} és superior al límit de {limit} caràcters" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" -msgstr "" +msgstr "El rellotge del sistema és més antic que la data a {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" +msgstr "El mode d'actualització de les etiquetes només funciona per als dipòsits git, hg, bzr i git-svn actualment" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" +msgstr "Mode d'actualització de les etiquetes utilitzat a git-svn, però el repositori no s'ha configurat amb etiquetes" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." -msgstr "" +msgstr "Mode de prova: posa la sortida només al directori tmp, i sempre construeix, fins i tot si la sortida ja existeix." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" -msgstr "" +msgstr "El codi de la versió de l'OBB ha de venir després de \"{name}.\":" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" -msgstr "" +msgstr "L'URL base pel registre del dipòsit (predeterminat: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" -msgstr "" +msgstr "El directori on escriure la rèplica" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" -msgstr "" +msgstr "El fitxer que s'inclourà al dipòsit (camí o glob)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." -msgstr "" +msgstr "L'empremta digital del repositori no coincideix." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" -msgstr "" +msgstr "El directori arrel per a local_copy_dir \"{path}\" no existeix!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" -msgstr "" +msgstr "Hi ha una col·lisió de keyalias - s'ha aturat la publicació" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." -msgstr "" +msgstr "Aquestes són les aplicacions que s'han arxivat del dipòsit principal." #: ../fdroidserver/mirror.py msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "" +msgstr "Aquesta ordre no s'ha d'utilitzar mai per a reflectir f-droid.org! Una còpia completa requereix més de 600 GB." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" +msgstr "Aquest és un dipòsit d'aplicacions que s'utilitzaran amb l'F-Droid. Les aplicacions d'aquest dipòsit són o bé binaris oficials construïts pels desenvolupadors originals de l'aplicació, o bé binaris construïts a partir del codi font per l'administrador de f-droid.org utilitzant les eines a https://gitlab.com/fdroid." #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" -msgstr "" +msgstr "Aquest dipòsit ja té metadades locals: %s" #: ../fdroidserver/init.py #, python-format @@ -1716,41 +1720,48 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" +"Per completar la configuració, afegiu els APKs a \"%s\"\n" +"i executeu \"fdroid update -c; fdroid update\". Potser també voleu editar\n" +"\"config.yml\" per a definir l'URL, el nom del dipòsit i més. També hauries de configurar\n" +"una clau de signatura (pot ser que s'hagi generat automàticament una clau temporal).\n" +"\n" +"Per a més informació: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"i https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" +msgstr "Per utilitzar awsbucket, awssecretkey i awsaccesskeyid també s'han d'establir a config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" -msgstr "" +msgstr "L'URL ha de començar per https:// o http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" -msgstr "" +msgstr "No s'han d'utilitzar els escurçadors d'URL" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" -msgstr "" +msgstr "URL {url} a la descripció: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "" +msgstr "Etiqueta de llicència inesperada \"{}\"! Utilitza només les etiquetes aprovades per FSF o OSI de https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "" +msgstr "Etiqueta de llicència inesperada \"{}\"! Utilitza només les etiquetes de llicència configurades al fitxer de configuració" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" +msgstr "Destinació inesperada de l'enllaç simbòlic: {link} -> {target}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "" +msgstr "Entrada desconeguda {key} a {configname}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" @@ -1760,74 +1771,74 @@ msgstr "S'ha trobat una excepció desconeguda!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" -msgstr "" +msgstr "Fitxer desconegut '{filename}' a la construcció '{versionName}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" -msgstr "" +msgstr "Format de metadades desconegut: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" -msgstr "" +msgstr "Format de metadades desconegut: {path} (utilitzeu: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " -msgstr "" +msgstr "Versió desconeguda de l'aapt, pot causar problemes: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" -msgstr "" +msgstr "Espai inicial innecessari" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" -msgstr "" +msgstr "Espai final innecessari" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" -msgstr "" +msgstr "Camp d'aplicació no reconegut '{fieldname}' a '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" -msgstr "" +msgstr "Indicador de construcció no reconegut '{build_flag}' a '{path}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" -msgstr "" +msgstr "Tipus de fitxer \"{extension}\" no admès per al gràfic del dipòsit" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" -msgstr "" +msgstr "S'ha trobat un fitxer de gràfics no admès: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" -msgstr "" +msgstr "Extlib no utilitzada a %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" -msgstr "" +msgstr "Fitxer no utilitzat a %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" -msgstr "" +msgstr "Camí de l'escandelete no utilitzat: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" -msgstr "" +msgstr "Camí de scanignore no utilitzat: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "S'està descomprimint a %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -1840,45 +1851,45 @@ msgstr "Actualitza l'informe de transparència binari amb un nou URL" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" -msgstr "" +msgstr "UpdateCheckData té un URL no vàlid: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" -msgstr "" +msgstr "UpdateCheckData ha de coincidir amb el codi de versió com a enter (\\d o [0-9]): {codeex}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" -msgstr "" +msgstr "UpdateCheckData ha d'utilitzar l'URL HTTPS: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" -msgstr "" +msgstr "UpdateCheckData no és un URL vàlid: {url}" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "" +msgstr "UpdateCheckMode està establert però sembla que encara no s'han executat les revisions." #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" +msgstr "UpdateCheckMode està definit però sembla que encara no s'ha executat checkupdates" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "" +msgstr "UpdateCheckName està establert a l'identificador d'aplicació conegut, es pot eliminar" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" -msgstr "" +msgstr "S'està pujant {apkfilename} a androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" -msgstr "" +msgstr "S'està pujant {apkfilename} a virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -1895,64 +1906,64 @@ msgstr "Utilització: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "" +msgstr "Usa /HEAD en lloc de /master o /main per apuntar a un fitxer a la branca predeterminada" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" +msgstr "Usa /HEAD en lloc de /master per a apuntar a un fitxer a la branca predeterminada" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." -msgstr "" +msgstr "Utilitzeu `fdroid update -c`per a crear-lo." #: ../fdroidserver/build.py msgid "Use build server" -msgstr "" +msgstr "Utilitza el servidor de construcció" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" +msgstr "Usa la data de l'APK en lloc de l'hora actual per als APKs nous afegits" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." -msgstr "" +msgstr "S'està utilitzant \"{path}\" per configurar s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" -msgstr "" +msgstr "Ús de la signatura APK v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" -msgstr "" +msgstr "Ús de la signatura APK v3" #: ../fdroidserver/common.py msgid "Using JAR Signature" -msgstr "" +msgstr "Ús de la signatura JAR" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" -msgstr "" +msgstr "Utilitzant el jarsigner de Java, no es recomana verificar APKs! Useu l'apksigner" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" -msgstr "" +msgstr "Ús d'androguard de \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" -msgstr "" +msgstr "S'està utilitzant un diccionari en blanc en lloc del contingut de {path}!" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" -msgstr "" +msgstr "S'està utilitzant l'espai de claus existent \"{path}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" -msgstr "" +msgstr "S'està utilitzant s3cmd per sincronitzar amb: {url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" @@ -1960,7 +1971,7 @@ msgstr "Les ordres vàlides són:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." -msgstr "" +msgstr "Verifiqueu contra la còpia local a la memòria cau en lloc de tornar a baixar." #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" @@ -1968,12 +1979,12 @@ msgstr "Verifica la integritat dels paquets descarregats" #: ../fdroidserver/index.py msgid "Verifying index signature:" -msgstr "" +msgstr "Verificació de la signatura de l'índex:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "" +msgstr "La clau de l'API VirusTotal no pot pujar fitxers més grans de 32 MB, utilitzeu {url} per pujar {path}." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" @@ -1981,37 +1992,37 @@ msgstr "Avisa de possibles errors a les metadades" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" -msgstr "" +msgstr "Quan es configura per als índexs signats, només es creen els índexs no signats en aquesta fase" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "" +msgstr "Quan es mostra tot el «yamllint» del repositori està desactivat de manera predeterminada. Aquesta opció força la «yamllint» independentment." #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." -msgstr "" +msgstr "Quan signar o verificar falla, sortiu amb un codi d'error." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" -msgstr "" +msgstr "X.509 'Nom distint' utilitzat en generar claus" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" -msgstr "" +msgstr "Podeu utilitzar ANDROID_HOME per establir el camí al vostre SDK, és a dir:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" -msgstr "" +msgstr "arxiu de fitxers ZIP" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" -msgstr "" +msgstr "s'està afegint el fitxer d'identitat a {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" -msgstr "" +msgstr "s'està afegint a {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2029,86 +2040,86 @@ msgstr "opció ambigua: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "" +msgstr "No s'ha trobat l'apksigner! No es poden signar o verificar els APK moderns" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" -msgstr "" +msgstr "No s'ha trobat l'apksigner, és necessari per signar!" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" -msgstr "" +msgstr "ID de l'aplicació del fitxer en què s'ha d'operar" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" -msgstr "" +msgstr "ID de l'aplicació amb versió opcionalCode en el formulari APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" -msgstr "" +msgstr "archive_url necessita acabar amb /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" -msgstr "" +msgstr "argument \"-\" amb mode %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" -msgstr "" +msgstr "argument %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" -msgstr "" +msgstr "s'està provant la connexió SSH per comprovar la clau de desplegament:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" -msgstr "" +msgstr "no es pot analitzar l'especificació de la «scrlib» (no és una cadena): '{}'" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "" +msgstr "no es pot obrir '%(filename)s': %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" -msgstr "" +msgstr "no es pot obrir l'URL no-https: '{};" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" -msgstr "" +msgstr "no s'han pogut trobar els srclibs requerits: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" -msgstr "" +msgstr "no es poden tenir múltiples arguments de subanalitzador" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" -msgstr "" +msgstr "no es poden fusionar les accions - dos grups s'anomenen %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" -msgstr "" +msgstr "no es pot publicar l'actualització. Heu establert la clau de desplegament?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" -msgstr "" +msgstr "s'està clonant {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" -msgstr "" +msgstr "ordres dels mòduls del connector:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2122,74 +2133,74 @@ msgstr "complex" #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "cadena d'opció conflictiva: %s" +msgstr[1] "cadenes d'opció conflictiva: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser alias: %s" -msgstr "" +msgstr "àlies de subanalitzador conflictiu: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser: %s" -msgstr "" +msgstr "subanalitzador conflictiu: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" -msgstr "" +msgstr "no s'ha pogut analitzar '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "" +msgstr "no s'ha pogut analitzar l'especificació «srclib» (no s'ha especificat cap nom): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "" +msgstr "no s'ha pogut analitzar l'especificació «srclib» (no s'ha especificat cap referència): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" +msgstr "no s'ha pogut analitzar l'especificació de l'srclib (massa signes '@'): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" -msgstr "" +msgstr "s'ha creat {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "la versió actual és més nova: antic vercode={old}, nou vercode={new}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" -msgstr "" +msgstr "s'està suprimint: dipòsit/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" -msgstr "" +msgstr "s'ha desplegat el registre de procés {path} a {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" -msgstr "" +msgstr "dest= és obligatori per opcions com %r" #: ../fdroidserver/scanner.py msgid "downloading '{}'" -msgstr "" +msgstr "s'està baixant '{}'" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" -msgstr "" +msgstr "ha fallat la baixada de signatures de l'escàner des de '{}'" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" -msgstr "" +msgstr "binari executable, possiblement codi" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2197,151 +2208,151 @@ msgstr "" #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "s'esperava l'argument %s" +msgstr[1] "s'esperaven els arguments %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" -msgstr "" +msgstr "s'esperava almenys un argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" -msgstr "" +msgstr "s'esperava com a màxim un argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" -msgstr "" +msgstr "s'esperava un argument" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" -msgstr "" +msgstr "fdroid [] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" -msgstr "" +msgstr "recupera l'última versió de les signatures del web" #: /usr/lib/python3.11/optparse.py msgid "floating-point" -msgstr "" +msgstr "coma flotant" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." -msgstr "" +msgstr "força que els errors de metadades (predeterminat) siguin avisos o s'ignorin." #: ../fdroidserver/common.py msgid "git svn clone failed" -msgstr "" +msgstr "Ha fallat el clon de «git svn»" #: ../fdroidserver/scanner.py msgid "gzip file archive" -msgstr "" +msgstr "arxiu de fitxers gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" -msgstr "" +msgstr "s'ha ignorat l'argument explícit %r" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" -msgstr "" +msgstr "index-v1 ha de tenir una signatura, utilitzeu `fdroid signindex` per a crear-la!" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "" +msgstr "index-v2 ha de tenir una signatura, utilitzeu `fdroid signindex`per a crear-la!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" -msgstr "" +msgstr "enter" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" -msgstr "" +msgstr "valor %(type)s no vàlid: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "" +msgstr "elecció no vàlida: %(value)r (trieu de %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" -msgstr "" +msgstr "el valor conflict_resolution no és vàlid: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" -msgstr "" +msgstr "cadena d'opció no vàlida %(option)r: ha de començar amb un caràcter %(prefix_chars)r" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" -msgstr "" +msgstr "no s'ha trobat l'ipfs_cid, s'ometrà la generació CIDv1" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "la darrera recepta de construcció és més nova: antic vercode={old}, nou vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" -msgstr "" +msgstr "local_copy_dir no acaba amb \"fdroid\", potser voldríeu dir: \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" -msgstr "" +msgstr "local_copy_dir ha de ser un camí absolut!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" -msgstr "" +msgstr "local_copy_dir ha de ser directori, no un fitxer!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" -msgstr "" +msgstr "el mirall '%s' no acaba amb 'fdroid'!" #: ../fdroidserver/index.py #, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "" +msgstr "miralls establerts dues vegades, a config.yml i {path}!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" -msgstr "" +msgstr "els arguments mútuament excloents han de ser opcionals" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" -msgstr "" +msgstr "la propera actualització de la memòria cau de {name} vencerà a {time}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" -msgstr "" +msgstr "no hi ha cap \"icona\" a {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" -msgstr "" +msgstr "no s'ha subministrat cap APK" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2352,48 +2363,48 @@ msgstr "opció inexistent: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" -msgstr "" +msgstr "no s'ha trobat cap informació de versió!" #: ../fdroidserver/checkupdates.py msgid "no version information found" -msgstr "" +msgstr "no s'ha trobat cap informació de versió" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" -msgstr "" +msgstr "no està permès amb l'argument %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" -msgstr "" +msgstr "es requereix un dels arguments %s" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" -msgstr "" +msgstr "només accepta cadenes, llistes i tuples" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" +msgstr "opció %s: Si realment voleu instal·lar totes les aplicacions signades, utilitzeu --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" -msgstr "" +msgstr "opció %s: valor %s no vàlid: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" +msgstr "opció %s: elecció no vàlida: %r (trieu de %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py @@ -2444,12 +2455,12 @@ msgstr "arguments opcionals" #: /usr/lib/python3.11/argparse.py msgid "options" -msgstr "" +msgstr "opcions" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" -msgstr "" +msgstr "s'està sobreescrivint {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2460,52 +2471,52 @@ msgstr "arguments posicionals" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" -msgstr "" +msgstr "ha fallat el desplegament del registre de processos {path} a {dest}!" #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "" +msgstr "falta la signatura al binari de referència" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "" +msgstr "rebutja la baixada via connexió HTTP insegura (utilitzeu HTTPS o especifiqueu --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "" +msgstr "repo_icon \"repo/icons/%s\" no existeix, generant marcador de posició." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" -msgstr "" +msgstr "repo_url ha d'acabar amb /repo" #: ../fdroidserver/deploy.py #, python-brace-format msgid "rsync is missing or broken: {error}" -msgstr "" +msgstr "falta el rsync o està trencat: {error}" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" +msgstr "ruamel.yaml no està instal·lat, no es poden escriure metadades." #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" -msgstr "" +msgstr "s3cmd sincronitza els índexs {path} a {url} i suprimeix" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" -msgstr "" +msgstr "la memòria cau de l'escàner està mal formada! Podeu netejar-la amb: '{clear}'" #: ../fdroidserver/deploy.py msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "" +msgstr "serverwebroot: el camí no acaba amb \"fdroid\", potser volíeu dir una d'aquestes:" #: ../fdroidserver/scanner.py msgid "shared library" -msgstr "" +msgstr "biblioteca compartida" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2523,33 +2534,33 @@ msgstr "mostra aquest missatge d'ajuda i surt" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." -msgstr "" +msgstr "APK signat, ja sigui un camí de fitxer o un URL HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "" +msgstr "s'omet el desplegament de registres de construcció complets: el contingut del registre està buit" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" -msgstr "" +msgstr "s'omet el desplegament de registres de construcció complets: no està habilitat a la configuració" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" -msgstr "" +msgstr "s'està ometent l'arxiu tar d'origen: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" -msgstr "" +msgstr "manca el nom i/o @ de srclibs" #: ../fdroidserver/scanner.py msgid "static library" -msgstr "" +msgstr "biblioteca estàtica" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "" +msgstr "el binari de referència proporcionat ha permès el signant {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2570,7 +2581,7 @@ msgstr "cadena d'opcions inesperada: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "" +msgstr "analitzador desconegut %(parser_name)r (opcions: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2593,129 +2604,129 @@ msgstr "us: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" -msgstr "" +msgstr "s'està utilitzant libcloud d'Apache per sincronitzar amb {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "" +msgstr "virustotal.com és limitant de velocitat, esperant tornar-ho a provar..." #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{0} aplicació, {1} àlies de claus" +msgstr[1] "{0} aplicacions, {1} àlies de claus" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" -msgstr "" +msgstr "{apkfilename} ({appid}) no té metadades!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" +msgstr "{apkfilename} té múltiples fitxers {name}, sembla un exploit a la clau mestra!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " -msgstr "" +msgstr "L'AndroidManifest.xml de {apkfilename} té una data incorrecta: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." -msgstr "" +msgstr "{appid} no té nom! S'està utilitzant l'identificador de l'aplicació." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" -msgstr "" +msgstr "{appid} de {path} no és un ID d'aplicació Android vàlid!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" -msgstr "" +msgstr "{appid} de {path} no és un nom de paquet Java vàlid!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid} té tant APK com fitxers: {files}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" -msgstr "" +msgstr "{appid} no té {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" -msgstr "" +msgstr "{appid}: Extlib {path} desconegut a la construcció '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" -msgstr "" +msgstr "{appid}: no s'ha especificat cap construcció, s'està executant en l'estat font actual" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "" +msgstr "{appid}: {field} ha de ser un '{type}', però és un '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" -msgstr "" +msgstr "{appid}: {field} ha de ser un '{type}', però és un '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" -msgstr "" +msgstr "{build_flag} ha de ser un enter, s'ha trobat: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" -msgstr "" +msgstr "{build_flag} ha de ser llista o cadena, s'ha trobat: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" -msgstr "" +msgstr "{file} està en blanc o corromput!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "" +msgstr "{name} \"{section}/icons/{path}\" no existeix! Comproveu \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "{oldfile} és obsolet, utilitzeu {newfile}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" -msgstr "" +msgstr "{path} ja existeix, s'ignoraran els resultats d'importació!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" -msgstr "" +msgstr "{path} no existeix! Crea-ho executant:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "" +msgstr "{path} té una signatura de fitxer incorrecta \"{pattern}\", possible Janus exploit!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} has been flagged by virustotal {count} times:" -msgstr "" +msgstr "{path} ha estat marcat pel virustotal {count} vegades:" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" +msgstr "{path} no és \"clau: valor\" dict, sinó un {datatype}!" #: ../fdroidserver/common.py #, python-brace-format @@ -2725,51 +2736,51 @@ msgstr "{path} no és un fitxer de configuració estàndard!" #: ../fdroidserver/index.py #, python-brace-format msgid "{path} is not list, but a {datatype}!" -msgstr "" +msgstr "{path} no és una llista, sinó {datatype}!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "" +msgstr "{path} no és {expected_type}, sinó {datatype}!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" -msgstr "" +msgstr "{path} és de mida zero!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" -msgstr "" +msgstr "{path} més de 200MB, puja manualment: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" +msgstr "{path}: \"{code}\" no és un codi de país ISO313166-1 alfa-2 vàlid!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" -msgstr "" +msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" -msgstr "" +msgstr "{url} no acaba amb \"fdroid\", comproveu el camí de l'URL!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" -msgstr "" +msgstr "{url} no comença amb «http»!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Ha fallat la construcció {}" +msgstr[1] "Han fallat les construccions {}" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{} construcció correcta" +msgstr[1] "{} construccions correctes" From a4758e7e6163bad06021c0fc4c9877c317e5b37b Mon Sep 17 00:00:00 2001 From: paul mayero Date: Mon, 26 Aug 2024 15:10:39 +0000 Subject: [PATCH 1627/2116] Translated using Weblate: Swahili (sw) by paul mayero Currently translated at 98.2% (570 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sw/ --- locale/sw/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index b37a6799..47a8ec07 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-08-25 00:09+0000\n" +"PO-Revision-Date: 2024-08-26 17:39+0000\n" "Last-Translator: paul mayero \n" "Language-Team: Swahili \n" "Language: sw\n" @@ -2460,12 +2460,12 @@ msgstr "hoja za hiari" #: /usr/lib/python3.11/argparse.py msgid "options" -msgstr "chaguzi" +msgstr "uchaguzi" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" -msgstr "inaandika upya {path} inayopo" +msgstr "inaandika upya {path} iliyopo" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2494,7 +2494,7 @@ msgstr "repo_icon \"repo/icons/%s\" haipo, inazalisha kishika nafasi." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" -msgstr "repo_url ina haja ya kuisha na /repo" +msgstr "repo_url ina haja ya kuisha na /ghala" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2503,7 +2503,7 @@ msgstr "rsync inakosa au imevunjika: {error}" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." -msgstr "ruamel.yaml haijasakinishwa, haiwezi kuandika metadata." +msgstr "ruamel.yaml haijasimikwa, haiwezi kuandika metadata." #: ../fdroidserver/deploy.py #, python-brace-format From 3684a1753ab53ce8f0e4e5d0238b15a9743c6316 Mon Sep 17 00:00:00 2001 From: paul mayero Date: Tue, 27 Aug 2024 09:36:34 +0000 Subject: [PATCH 1628/2116] Translated using Weblate: Swahili (sw) by paul mayero Currently translated at 98.2% (570 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sw/ --- locale/sw/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index 47a8ec07..62942e7d 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-08-26 17:39+0000\n" +"PO-Revision-Date: 2024-08-28 08:09+0000\n" "Last-Translator: paul mayero \n" "Language-Team: Swahili \n" "Language: sw\n" @@ -508,7 +508,7 @@ msgstr "Inaunda saraka ya kumbukumbu" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" -msgstr "Inaunda S3 bucket mpya: {url}" +msgstr "Inaunda ndoo mpya ya S3: {url}" #: ../fdroidserver/publish.py #, fuzzy @@ -2521,7 +2521,7 @@ msgstr "serverwebroot: njia haikamiliki na \"fdroid\", labda ulimaanisha moja ka #: ../fdroidserver/scanner.py msgid "shared library" -msgstr "maktaba inayoshirikiwa" +msgstr "maktaba inayoshirikishwa" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2543,7 +2543,7 @@ msgstr "APK iliyosainiwa, aidha file-path au HTTPS URL." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "ruka kupeleka logi kamili za jenga: mauthui ya logi ni tupu" +msgstr "ruka kupeleka logi kamili za jenga: maudhui ya logi ni tupu" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" From 8d2cf47c6f790bc55cc18396e7f6143d381d47c9 Mon Sep 17 00:00:00 2001 From: paul mayero Date: Wed, 28 Aug 2024 10:39:09 +0000 Subject: [PATCH 1629/2116] Translated using Weblate: Swahili (sw) by paul mayero Currently translated at 98.2% (570 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sw/ --- locale/sw/LC_MESSAGES/fdroidserver.po | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index 62942e7d..f5ed3942 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-08-28 08:09+0000\n" +"PO-Revision-Date: 2024-08-28 11:43+0000\n" "Last-Translator: paul mayero \n" "Language-Team: Swahili \n" "Language: sw\n" @@ -2201,7 +2201,7 @@ msgstr "Inapakua '{}'" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" -msgstr "Inapakua sahihi za skana kutoka '{}' imefeli" +msgstr "Inapakua sahihi za skena kutoka '{}' imefeli" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" @@ -2213,14 +2213,14 @@ msgstr "binari inayoweza kutekelezwa, ikiwezekana msimbo" #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" -msgstr[0] "ilitaraji hoja %s" -msgstr[1] "zilitaraji hoja %s" +msgstr[0] "hoja %s iliyotarajiwa" +msgstr[1] "hoja %s zilizotarajiwa" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" -msgstr "ilitaraji angalau hoja moja" +msgstr "ilitarajia angalau hoja moja" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2232,15 +2232,15 @@ msgstr "Imetarajiwa isiwe zaidi ya hoja moja" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" -msgstr "Ilitaraji hoja moja" +msgstr "Ilitarajia hoja moja" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" -msgstr "fdroid [] [-h|--help|--toleo|]" +msgstr "fdroid [] [-h|--msaada|--toleo|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" -msgstr "Pakua toleo jipya zaidi za saini kutoka mtandao" +msgstr "Pakua toleo jipya zaidi za saini kutoka kwenye mtandao" #: /usr/lib/python3.11/optparse.py msgid "floating-point" From 8f17d754befff8c11048ba26da8357f7ee1b84e4 Mon Sep 17 00:00:00 2001 From: paul mayero Date: Wed, 28 Aug 2024 15:05:50 +0000 Subject: [PATCH 1630/2116] Translated using Weblate: Swahili (sw) by paul mayero Currently translated at 98.2% (570 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sw/ --- locale/sw/LC_MESSAGES/fdroidserver.po | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index f5ed3942..5b0b4685 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-08-28 11:43+0000\n" +"PO-Revision-Date: 2024-08-28 16:06+0000\n" "Last-Translator: paul mayero \n" "Language-Team: Swahili \n" "Language: sw\n" @@ -304,7 +304,7 @@ msgstr "Apu ina NoSourceSince au ArchivePolicy \"0 versions\" lakini AutoUpdateM #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "Apu ina NoSourceSince au ArchivePolicy \"0 versions\" au 0 lakini AutoUpdateMode au UpdateCheckMode sio None" +msgstr "Apu ina NoSourceSince au ArchivePolicy \"matoleo 0\" au 0 lakini AutoUpdateMode au UpdateCheckMode sio Hakuna" #: ../fdroidserver/lint.py #, python-brace-format @@ -322,11 +322,11 @@ msgstr "Kuambata .git sio lazima" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" -msgstr "Kuhifadhi {apkfilename} yenye sahihi batili!" +msgstr "Kuhifadhi {apkfilename} yenye saini batili!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." -msgstr "AutoUpdateMode na UpdateCheckMode: HTTP lazima iwe na muundo." +msgstr "AutoUpdateMode na UpdateCheckMode: HTTP lazima iwe na mpangilio." #: ../fdroidserver/index.py #, python-brace-format @@ -335,13 +335,13 @@ msgstr "Aina mbaya ya ingizo \"{mirrortype}\" katika usanidi wa vioo: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" -msgstr "URL ya msingi ya kioo, inaweza kujumuisha ufunguo wa saini ya index kwa kutumia mfuatano wa uulizi: ?fingerprint=" +msgstr "URL ya msingi ya kioo, inaweza kujumuisha ufunguo wa saini ya faharasa kwa kutumia mfuatano wa saili: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "Tawi '{branch}' limefanyiwa matumizi kama ahadi katika ujenzi wa '{versionName}'" +msgstr "Tawi '{branch}' limetumika kupeleka katika ujenzi wa '{versionName}'" #: ../fdroidserver/lint.py #, fuzzy, python-brace-format @@ -870,7 +870,7 @@ msgstr "Imeunda kiunzi cha metadata kwa {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" -msgstr "Git checkout ya '%s' ilishindwa" +msgstr "Git toa ya '%s' ilishindwa" #: ../fdroidserver/common.py msgid "Git clean failed" @@ -1243,15 +1243,15 @@ msgstr "Hakuna versionCode kama hio {versionCode} kwa apu {appid}" #: ../fdroidserver/checkupdates.py msgid "No tags found" -msgstr "Hakuna tagi zilizopatikana" +msgstr "Hakuna vishikozo vilivyopatikana" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" -msgstr "Hakuna saraka isiyotiwa sahihi - hakuna la kufanya" +msgstr "Hakuna saraka isiyotiwa saini - hakuna la kufanya" #: ../fdroidserver/__main__.py msgid "No version information could be found." -msgstr "Hakuna maelezo ya toleo iiliyopatikana." +msgstr "Hakuna taarifa ya toleo iliyoweza kupatikana." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" @@ -1291,7 +1291,7 @@ msgstr "Machini iliyo nje ya mtandao, inapuuza uundaji wa kioo cha git mpaka 'fd #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" -msgstr "PNG na JPEG pekee inakubalika katika mchoro, imepata: {path}" +msgstr "PNG na JPEG pekee zinakubalika katika mchoro, zimepata: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" @@ -1299,7 +1299,7 @@ msgstr "Chapisha tofauti pekee na Play Store" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" -msgstr "Chakata pekee apu zilizo na masasisho ya kiotomatiki" +msgstr "Chakata apu zilizo na masasisho ya kiotomatiki pekee" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" @@ -1335,7 +1335,7 @@ msgstr "Kubatilisha toleo la jina tupu katika {apkfilename} kutoka kwa metadata: #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" -msgstr "Kifurushi \"{appid}\" tayari ipo" +msgstr "Kifurushi \"{appid}\" tayari kipo" #: ../fdroidserver/common.py #, python-brace-format From dd36b8173a63ae24a2e2eaf662fdfee5b0b5da72 Mon Sep 17 00:00:00 2001 From: paul mayero Date: Thu, 29 Aug 2024 08:10:08 +0000 Subject: [PATCH 1631/2116] Translated using Weblate: Swahili (sw) by paul mayero Currently translated at 98.1% (569 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sw/ --- locale/sw/LC_MESSAGES/fdroidserver.po | 81 ++++++++++++++------------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index 5b0b4685..670dccad 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-08-28 16:06+0000\n" +"PO-Revision-Date: 2024-08-30 09:09+0000\n" "Last-Translator: paul mayero \n" "Language-Team: Swahili \n" "Language: sw\n" @@ -1497,7 +1497,7 @@ msgstr "Kuandika upya '{appid}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" -msgstr "Tekeleza kwenye ghala ya git ambalo lina mabadiliko yasiyohifadhiwa" +msgstr "Endesha kwenye ghala la git ambalo lina mabadiliko yasiyohifadhiwa" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1510,7 +1510,7 @@ msgstr "Kutekeleza pasi ya kwanza na kuangalia kwa MD5 ikiwa imezimwa" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" -msgstr "Kutekeleza wget katika {path}" +msgstr "Kuendesha wget katika {path}" #: ../fdroidserver/index.py #, python-brace-format @@ -1519,7 +1519,7 @@ msgstr "SHA-256 ya {url} hailingani ingizo!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "Skani APK Skani APK zilizotokana na mchakato kwa madarasa yasiyo huru yanayojulikana." +msgstr "Changanua APK zilizotokana na mchakato kwa madarasa yasiyo huru yanayojulikana." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" @@ -1528,23 +1528,23 @@ msgstr "Changanua msimbo chanzo cha kifurushi" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" -msgstr "Skana imepata matatizo {count} katika {apk}" +msgstr "Skena imepata matatizo {count} katika {apk}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" -msgstr "Skana imepata matatizo {count} katika {appid}:" +msgstr "Skena imepata matatizo {count} katika {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" -msgstr "Skana imepata matatizo {count} katika {appid}:{versionCode}:" +msgstr "Skena imepata matatizo {count} katika {appid}:{versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" -msgstr[0] "Skana imepata tatizo {}" -msgstr[1] "Skana zimepata tatizo {}" +msgstr[0] "Skena imepata tatizo {}" +msgstr[1] "Skena zimepata matatizo {}" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." @@ -1566,20 +1566,20 @@ msgstr "Weka idadi ya juu ya matoleo katika ghala kabla zile mzee zimehifadhiwa #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" -msgstr "Seti kikomo cha faili iliyo wazi kwa {integer}" +msgstr "Weka kikomo cha faili iliyo wazi kwa {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" -msgstr "Sanidha uundaji wa apu kwa ajili ya ghala la uundaji wa kila usiku" +msgstr "Sanidisha ujenzi wa apu kwa ajili ya ghala la ujenzi wa usiku" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " -msgstr "Kuseti kikomo cha faili iliyo wazi imefeli: " +msgstr "Weka kikomo cha faili iliyo wazi imefeli: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" -msgstr "Kuseti muda wa sekunde {0} kwa ajili ya ujenzi huu" +msgstr "Kuweka muda wa sekunde {0} kwa ajili ya ujenzi huu" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" @@ -1596,7 +1596,7 @@ msgstr "Ruka kuchanganua msimbo wa chanzo kwa binari na tatizo zingine" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" -msgstr "Kuruka '{apkfilename}' iliyo na sahihi batili!" +msgstr "Kuruka '{apkfilename}' iliyo na saini batili!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format @@ -1606,12 +1606,12 @@ msgstr "Kuruka kioo cha GitLab Pages kwa sababu ghala ni kubwa mno (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" -msgstr "Inaruka uzalishaji wa index kwa {appid}" +msgstr "Inaruka uzalishaji wa faharasa kwa {appid}" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" -msgstr "Inaruka {apkfilename} yenye sahihi batili!" +msgstr "Inaruka {apkfilename} yenye saini batili!" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1647,7 +1647,7 @@ msgstr "Muhtasari '%s' ni jina tu ya apu hio" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" -msgstr "Muhtasari ya urefu {length} ni juu ya {limit} kikomo cha char" +msgstr "Muhtasari wa urefu {length} ni juu ya {limit} kikomo cha char" #: ../fdroidserver/common.py #, python-brace-format @@ -1790,7 +1790,7 @@ msgstr "Fomati ya metadata isiyojulikana: {path} (tumia: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " -msgstr "Toleo lisilojulikana la aapt, inaweza kuleta matatizo: " +msgstr "Toleo lisilojulikana la aapt, linaweza kuleta matatizo: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" @@ -1803,22 +1803,22 @@ msgstr "Nafasi ya mwisho isiyo ya lazima" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" -msgstr "nafasi ya apu isiyotambulika '{fieldname}' katika '{path}'" +msgstr "Nafasi ya apu isiyotambulika '{fieldname}' katika '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" -msgstr "Bendera ya jenga isiyotambulika '{build_flag}' katika '{path}'" +msgstr "Bendera ya kujenga isiyotambulika '{build_flag}' katika '{path}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" -msgstr "Aina ya faili isiyoungwa mkono \"{extension}\" kwa ghala ya mchoro" +msgstr "Aina ya faili isiyoungwa mkono \"{extension}\" kwa ghala la mchoro" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" -msgstr "Faili ya michoro usioungwa mkono umepatikana: {path}" +msgstr "Faili ya michoro isiyoungwa mkono imepatikana: {path}" #: ../fdroidserver/lint.py #, python-format @@ -1997,7 +1997,7 @@ msgstr "Onya kuhusu hitilafu ya metadata yanayoweza kutokea" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" -msgstr "Ikiwa imesanidiwa kwa viashiria vilivyosainiwa, unda pekee indexes zisizosainiwa katika hatua hii" +msgstr "Ikiwa imesanidiwa kwa faharasa zilizosainiwa, unda pekee faharasa zisizosainiwa katika hatua hii" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." @@ -2263,15 +2263,15 @@ msgstr "kumbukumbu ya faili ya gzip" #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" -msgstr "Ilipuuza hoja ya wazi %r" +msgstr "Ilipuuza hoja ya dhahiri %r" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v1 lazima iwe na sahihi, tumia `fdroid signindex` kuiunda!" +msgstr "index-v1 lazima iwe na saini, tumia `fdroid signindex` kuiunda!" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v2 lazima iwe na sahihi, tumia `fdroid signindex` kuiunda!" +msgstr "index-v2 lazima iwe na saini, tumia `fdroid signindex` kuiunda!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2314,7 +2314,7 @@ msgstr "ipfs haikupatikana, inaruka kuzalisha CIDcv1" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "recipe ya jenga ya hivi karibuni ni mpya zaidi: old vercode={old}, new vercode={new}" +msgstr "mbinu ya jenga ya hivi karibuni ni mpya zaidi: old vercode={old}, new vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2323,7 +2323,7 @@ msgstr "local_copy_dir haikiwishi na \"fdroid\", labda ulimanisha: {path}" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" -msgstr "local_copy_dir lazima iwe njia kamilifu!" +msgstr "local_copy_dir lazima iwe njia kamili!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" @@ -2332,7 +2332,7 @@ msgstr "local_copy_dir lazima iwe saraka, si faili!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" -msgstr "kioo %s haikwishi na 'fdroid'!" +msgstr "kioo %s haikwishia na 'fdroid'!" #: ../fdroidserver/index.py #, python-brace-format @@ -2342,6 +2342,7 @@ msgstr "vioo vimesetiwa mara mbili, katika config.yml na {path}!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py +#, fuzzy msgid "mutually exclusive arguments must be optional" msgstr "Hoja zisizounganishika lazima iwe ya hiari" @@ -2619,8 +2620,8 @@ msgstr "virustotal.com inapunguza kiwango, inangojea kujaribu tena..." #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" -msgstr[0] "apu {0}, lakabu ya funguo {1}" -msgstr[1] "apu {0}, lakabu za funguo {1}" +msgstr[0] "apu {0}, lakabu muhimu{1}" +msgstr[1] "apu {0}, lakabu muhimu{1}" #: ../fdroidserver/update.py #, python-brace-format @@ -2640,12 +2641,12 @@ msgstr "AndroidManifest.xml ya {apkfilename} ina tarehe mbaya: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." -msgstr "{appid} hiana jina! Inatumia kitambulisho cha apu badala yake." +msgstr "{appid} haina jina! Inatumia kitambulisho cha apu badala yake." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" -msgstr "{appid} kutoka {path} si kitambulisho halali cha apu ya android!" +msgstr "{appid} kutoka {path} si kitambulisho halali cha apu ya Android!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format @@ -2671,7 +2672,7 @@ msgstr "{appid}: extlib isiyojulikana {path} katika jenga '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" -msgstr "{appid}: hakuna jenga zilizobainishwa, inakimbia kwa hali ya sasa ya chanzo" +msgstr "{appid}: hakuna jenga zilizobainishwa, inaendeshwa kwa hali ya sasa ya chanzo" #: ../fdroidserver/lint.py #, python-brace-format @@ -2711,17 +2712,17 @@ msgstr "{oldfile} imewacha kutumika, tumia {newfile}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" -msgstr "{path} tayari ipo, inapuuza matokeo ya kuagiza!" +msgstr "{path} tayari ipo, inapuuza matokeo ya uingizaji!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" -msgstr "{path} haipo! Iunde kwa kukimbiza:" +msgstr "{path} haipo! Iunde kwa kuendesha:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "{path} ina sahihi mbaya ya faili \"{pattern}\", Uwezekano wa kunyonywa la Janus!" +msgstr "{path} ina saini mbaya ya faili \"{pattern}\", Uwezekano wa kunyonywa la Janus!" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2731,7 +2732,7 @@ msgstr "{path} imealamishwa na virustotal mara {count}:" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "{path} sio kamusi ya \"key: value\" , lakini ni {datatype}!" +msgstr "{path} sio \"key: value\" dict, lakini ni {datatype}!" #: ../fdroidserver/common.py #, python-brace-format @@ -2751,7 +2752,7 @@ msgstr "{path} sio {expected_type}, lakini ni {datatype}!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" -msgstr "{path} ni saizi ya sefuri!" +msgstr "{path} ni saizi ya sifuri!" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2761,7 +2762,7 @@ msgstr "{path} zaidi ya 200MB , pakia kwa mkono: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "{path}: \"{code}\" ni msimbo wa nchi ya ISO_3166-1 alpha-2 batili!" +msgstr "{path}: \"{code}\" msimbo wa nchi ya ISO_3166-1 alpha-2 ni batili!" #: ../fdroidserver/update.py #, python-brace-format From 9d50d4fbc57f2fc806add854c1431315a0d80e48 Mon Sep 17 00:00:00 2001 From: paul mayero Date: Fri, 30 Aug 2024 09:52:29 +0000 Subject: [PATCH 1632/2116] Translated using Weblate: Swahili (sw) by paul mayero Currently translated at 98.1% (569 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sw/ --- locale/sw/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index 670dccad..3d50f775 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-08-30 09:09+0000\n" +"PO-Revision-Date: 2024-08-30 10:23+0000\n" "Last-Translator: paul mayero \n" "Language-Team: Swahili \n" "Language: sw\n" @@ -2064,7 +2064,7 @@ msgstr "Kitambulisho cha apu yenye versionCode iliyo ya hiari katika fomu APPID[ #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" -msgstr "archive_url ina haja ya kumaliza na with /archive" +msgstr "archive_url inahitaji kumalizia na /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py From 3b7cc2625e948a1f87b16b789a6ecce219f1ac98 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Fri, 30 Aug 2024 11:11:10 +0000 Subject: [PATCH 1633/2116] Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk Currently translated at 100.0% (580 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ --- locale/uk/LC_MESSAGES/fdroidserver.po | 28 +++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 6a30306b..d8d41e27 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -15,7 +15,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-08-14 17:28+0000\n" +"PO-Revision-Date: 2024-08-31 11:09+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" "Language: uk\n" @@ -23,7 +23,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.7-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -1112,7 +1112,7 @@ msgstr "Шлях до сховища ключів для ключа підпис #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "Відомий налагоджувальний ключ використовується у AllowedAPKSigningKeys: " +msgstr "Відомий ключ налагодження використовується в AllowedAPKSigningKeys: " #: ../fdroidserver/lint.py #, python-brace-format @@ -1253,7 +1253,7 @@ msgstr "Немає непідписаної теки — нічого викон #: ../fdroidserver/__main__.py msgid "No version information could be found." -msgstr "Відомості про версію знайти не вдалося." +msgstr "Не вдалося знайти відомості про версію." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" @@ -1284,11 +1284,11 @@ msgstr "Назва файлу OBB повинна починатися з \"main. #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" -msgstr "Назва пакунку OBB не відповідає підтримуваному APK:" +msgstr "Назва пакунка OBB не відповідає підтримуваному APK:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "Автономна машина, пропускання генерації дзеркал git до `fdroid deploy`" +msgstr "Автономна машина, пропускання генерування дзеркал git до `fdroid deploy`" #: ../fdroidserver/update.py #, python-brace-format @@ -1297,7 +1297,7 @@ msgstr "Підтримуються лише PNG та JPEG зображення, #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" -msgstr "Друкувати відмінності тільки з Play Store" +msgstr "Показувати лише ті застосунки, версія яких відрізняється від версії з Play Store" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" @@ -1362,7 +1362,7 @@ msgstr "Шлях до git-репозиторію, який використов #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" -msgstr "Шлях до сховища ключів для підписного ключа репозиторія" +msgstr "Шлях до сховища ключів для підписного ключа репозиторію" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" @@ -1415,12 +1415,12 @@ msgstr "Оновити двійковий журнал прозорості дл #: ../fdroidserver/deploy.py msgid "Pushing to remote server failed!" -msgstr "Пушинг на віддалений сервер не вдався!" +msgstr "Не вдалося передати на віддалений сервер!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" -msgstr "Оприлюднення до {url}" +msgstr "Передано до {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" @@ -1473,7 +1473,7 @@ msgstr "Режим оновлення RepoTrunk має сенс лише в ре #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Перезавантажте та створіть новий сервер створення, навіть якщо наявний існує." +msgstr "Скиньте та створіть новий сервер збирання, навіть якщо з наявним усе гаразд." #: ../fdroidserver/nightly.py #, python-brace-format @@ -1482,7 +1482,7 @@ msgstr "Повторне підписання {apkfilename} з наданим de #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" -msgstr "Змінити розмір усіх значків, що перевищують максимальний розмір пікселя та вийти" +msgstr "Змінити розмір усіх піктограм, що перевищують максимальний розмір у пікселях та вийти" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" @@ -1499,11 +1499,11 @@ msgstr "Перезапис '{appid}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" -msgstr "Запустити для git-репозиторію з не подаинми змінами" +msgstr "Запустити для git-репозиторію з неподаними змінами" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" -msgstr "Запустити rewritemeta виправити форматування" +msgstr "Запустити rewritemeta, щоб виправити форматування" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" From a576422ae47271c6ac16f475c0aed25d23e90928 Mon Sep 17 00:00:00 2001 From: paul mayero Date: Sat, 31 Aug 2024 09:46:35 +0000 Subject: [PATCH 1634/2116] Translated using Weblate: Swahili (sw) by paul mayero Currently translated at 97.5% (566 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sw/ --- locale/sw/LC_MESSAGES/fdroidserver.po | 39 ++++++++++++++------------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index 3d50f775..f9d796fa 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-08-30 10:23+0000\n" +"PO-Revision-Date: 2024-08-31 11:09+0000\n" "Last-Translator: paul mayero \n" "Language-Team: Swahili \n" "Language: sw\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.7.1-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -1735,7 +1735,7 @@ msgstr "" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Ili kutumia awsbucket, awssecretkey na awsaccesskeiid lazima pia isetiwe katika config.yml!" +msgstr "Ili kutumia awsbucket, awssecretkey na awsaccesskeiid lazima pia iwekwe katika config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1761,7 +1761,7 @@ msgstr "tagi ya leseni isiyotarajiwa \"{}\"! Tumia pekee tagi za leseni zilizosa #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "lengo la symlink lisiyotarajiwa:{link} -> {target}" +msgstr "Lengo la symlink lisiyotarajiwa:{link} -> {target}" #: ../fdroidserver/common.py #, python-brace-format @@ -1781,12 +1781,12 @@ msgstr "Faili isiyojulikana '{filename}' katika jenga '{versionName}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" -msgstr "Fomati ya metadata isiyojulikana: %s" +msgstr "Muundo wa metadata usiojulikana: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" -msgstr "Fomati ya metadata isiyojulikana: {path} (tumia: *.yml)" +msgstr "Muundo wa metadata usiojulikana: {path} (tumia: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " @@ -1861,7 +1861,7 @@ msgstr "UpdateCheckData ina URL batili: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" -msgstr "UpdateCheckData lazima ilingane na msimbo wa toleo kama nambari (\\d or [0-9]): {codeex}" +msgstr "UpdateCheckData lazima ilingane na msimbo wa toleo kama nambari kamili (\\d or [0-9]): {codeex}" #: ../fdroidserver/lint.py #, python-brace-format @@ -1875,16 +1875,16 @@ msgstr "UpdateCheckData si URL iliyo halali: {url}" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "UpdateCheckMode imewekwa lakini inaonekana kama checkupdates haijatekelezwa bado." +msgstr "UpdateCheckMode imewekwa lakini inaonekana kama checkupdates haijaendeshwa bado." #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode imewekwa lakini inaonekana kama likecheckupdates haijatekelezwa bado" +msgstr "UpdateCheckMode imewekwa lakini inaonekana kama likecheckupdates haijaendeshwa bado" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "UpdateCheckName imesetiwa katika kitambulisho cha apu kinachojulikana. inaweza kutolewa" +msgstr "UpdateCheckName imewekwa katika kitambulisho cha apu kinachojulikana, inaweza kutolewa" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1932,7 +1932,7 @@ msgstr "Tumia tarehe kutoka APK badala ya wakati uliopo kwa APK mpya zilizoongez #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." -msgstr "Kutumia \"{path}\" kwa kusanidi s3cmd." +msgstr "Kutumia \"{path}\" kusanidi s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -1944,7 +1944,7 @@ msgstr "Kutumia Sahihi ya APK toleo la 3" #: ../fdroidserver/common.py msgid "Using JAR Signature" -msgstr "Kutumia sahihi ya JAR" +msgstr "Kutumia saini ya JAR" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -1984,12 +1984,12 @@ msgstr "Thibitisha uadilifu wa furushi zilizopakuliwa" #: ../fdroidserver/index.py msgid "Verifying index signature:" -msgstr "Inathibitisha sahihi ya faharasa:" +msgstr "Kuthibitisha saini ya faharasa:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "ufunguo wa API ya VirusTotal haiwezi kupakia faili zaidi ya 32MB, tumia {url} kupakia {path}." +msgstr "Ufunguo wa API ya VirusTotal haiwezi kupakia faili zaidi ya 32MB, tumia {url} kupakia {path}." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" @@ -2089,7 +2089,7 @@ msgstr "Haiwezi kuchanganua speci ya scrlib (sio kamba): '{}'" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "Hiwezi kufungua '%(filename)s':%(error)s" +msgstr "Haiwezi kufungua '%(filename)s':%(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" @@ -2124,7 +2124,7 @@ msgstr "kukaririsha {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" -msgstr "amri kutoka moduli za plugin:" +msgstr "amri kutoka kwa kiunzi huru cha programu-jalizi:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2139,7 +2139,7 @@ msgstr "changamani" msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" msgstr[0] "kamba ya chaguo inayokinzana: %s" -msgstr[1] "kamba za chaguo inayokinzana: %s" +msgstr[1] "kamba za chaguo zinazokinzana: %s" #: /usr/lib/python3.11/argparse.py #, python-format @@ -2157,14 +2157,17 @@ msgid "could not parse '{path}'" msgstr "haikuweza kuchanganua '{path}'" #: ../fdroidserver/common.py +#, fuzzy msgid "could not parse srclib spec (no name specified): '{}'" msgstr "haikuweza kuchanganua specifisheni ya srclib (hakuna jina limebainishwa): '{}'" #: ../fdroidserver/common.py +#, fuzzy msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "haikuweza kuchanganua specifisheni ya srclib (hakuna rejeleo imebainishwa): '{}'" #: ../fdroidserver/common.py +#, fuzzy msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "haikuweza kuchanganua specifisheni ya srclib (saini nyingi mno za '@'): '{}'" @@ -2248,7 +2251,7 @@ msgstr "hatua ya kuelea" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." -msgstr "lazimisha hitilafu za metadata (chaguo msingi) iwe maonyo, au iwe wa kupuuzwa." +msgstr "lazimisha hitilafu za metadata (chaguo msingi) ziwe maonyo, au ziwe za kupuuzwa." #: ../fdroidserver/common.py msgid "git svn clone failed" From e49674c08bc7652d824dc29d7589158af896c386 Mon Sep 17 00:00:00 2001 From: abelbiwott-dev Date: Mon, 2 Sep 2024 13:48:00 +0000 Subject: [PATCH 1635/2116] Translated using Weblate: Swahili (sw) by abelbiwott-dev Currently translated at 99.6% (578 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sw/ --- locale/sw/LC_MESSAGES/fdroidserver.po | 36 ++++++++++----------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index f9d796fa..990703a0 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-08-31 11:09+0000\n" -"Last-Translator: paul mayero \n" +"PO-Revision-Date: 2024-09-02 14:06+0000\n" +"Last-Translator: abelbiwott-dev \n" "Language-Team: Swahili \n" "Language: sw\n" "MIME-Version: 1.0\n" @@ -511,7 +511,6 @@ msgid "Creating new S3 bucket: {url}" msgstr "Inaunda ndoo mpya ya S3: {url}" #: ../fdroidserver/publish.py -#, fuzzy msgid "Creating output directory" msgstr "Inaunda saraka ya pato" @@ -863,9 +862,9 @@ msgid "Found {count} warnings in {filename}" msgstr "Imepata onyo {count} katika {filename}" #: ../fdroidserver/update.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Generated skeleton metadata for {appid}" -msgstr "Imeunda kiunzi cha metadata kwa {appid}" +msgstr "Imeunda metadata ya kiunzi kwa {appid}" #: ../fdroidserver/common.py #, python-format @@ -929,9 +928,9 @@ msgid "Ignoring FUNDING.yml entry longer than 2048: %s" msgstr "Inapuuza ingizo la FUNDING.yml iliyo ndefu kuliko 2048: %s" #: ../fdroidserver/update.py -#, fuzzy, python-format +#, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "Inapuuza kipengee kibaya katika manisfest: %s" +msgstr "Inapuuza kipengele kibaya katika manifest: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1082,9 +1081,8 @@ msgid "Java JDK not found! Install in standard location or set java_paths!" msgstr "JDK ya Java haijapatikana! Simika katika sehemu ya kiwango au seti java_paths!" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Java compiled class" -msgstr "Darasa lililoharirirwa la Java" +msgstr "Darasa lililokusanywa la Java" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" @@ -1100,9 +1098,8 @@ msgid "Keeping failed build \"{apkfilename}\"" msgstr "Kuweka jenga zilizofeli \"{apkfilename}\"" #: ../fdroidserver/init.py -#, fuzzy msgid "Keystore for signing key:\t" -msgstr "Hifadhi ya funguo ya ufunguo wa kusaini:\t" +msgstr "Hifadhi ya ufunguo ya kusaini ufunguo:\t" #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " @@ -1114,9 +1111,8 @@ msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{uc msgstr "Mabadiliko ya mwisho yaliyotumika ya '{commit}' yanafanana na tagi, lakini UpdateCheckMode ni '{ucm}'" #: ../fdroidserver/lint.py -#, fuzzy msgid "Liberapay donation methods belong in the Liberapay: field" -msgstr "Njia za mchango ya Liberapay inapatikana kwa Liberapay: field" +msgstr "Njia za mchango ya Liberapay ipo ndani ya Liberapay: field" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" @@ -1148,14 +1144,12 @@ msgid "Mirror the full repo and archive, all file types." msgstr "Akisi ghala mzima na uhifadhi, aina zote za faili." #: ../fdroidserver/gpgsign.py -#, fuzzy msgid "Missing output directory" -msgstr "Inakosa saraka ya pato" +msgstr "Saraka ya pato haipo" #: ../fdroidserver/metadata.py -#, fuzzy msgid "Moving Anti-Features declarations to localized files:" -msgstr "Inasongesha tamko la Anti-Features kwa faili zilizolocaliziwa:" +msgstr "Inasongesha tamko la Anti-Features hadi kwa faili zilizolocaliziwa:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" @@ -1179,9 +1173,8 @@ msgid "No fingerprint in URL." msgstr "Hakuna alama ya kidole kwenye URL." #: ../fdroidserver/common.py -#, fuzzy msgid "No git submodules available" -msgstr "Hakuna submodule ya git inayopatikana" +msgstr "Hakuna submodule za git inayopatikana" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" @@ -2157,17 +2150,14 @@ msgid "could not parse '{path}'" msgstr "haikuweza kuchanganua '{path}'" #: ../fdroidserver/common.py -#, fuzzy msgid "could not parse srclib spec (no name specified): '{}'" msgstr "haikuweza kuchanganua specifisheni ya srclib (hakuna jina limebainishwa): '{}'" #: ../fdroidserver/common.py -#, fuzzy msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "haikuweza kuchanganua specifisheni ya srclib (hakuna rejeleo imebainishwa): '{}'" +msgstr "haikuweza kuchanganua specifisheni ya srclib (hakuna rejeleo limebainishwa): '{}'" #: ../fdroidserver/common.py -#, fuzzy msgid "could not parse srclib spec (too many '@' signs): '{}'" msgstr "haikuweza kuchanganua specifisheni ya srclib (saini nyingi mno za '@'): '{}'" From c2b940dfed8f2751365e5403e386b16f696ac6c4 Mon Sep 17 00:00:00 2001 From: Reno Tx Date: Mon, 2 Sep 2024 14:36:13 +0000 Subject: [PATCH 1636/2116] Translated using Weblate: Serbian (sr) by Reno Tx Currently translated at 28.1% (163 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sr/ --- locale/sr/LC_MESSAGES/fdroidserver.po | 336 +++++++++++++------------- 1 file changed, 173 insertions(+), 163 deletions(-) diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index 2ec52cfe..cd733dea 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -2,26 +2,29 @@ # This file is put in the public domain. # Саша Петровић , 2022. # Đorđe Vasiljević , 2022. +# Reno Tx , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2022-11-28 13:20+0000\n" -"Last-Translator: Đorđe Vasiljević \n" +"PO-Revision-Date: 2024-09-02 15:02+0000\n" +"Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.15-dev\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" +"\n" +"SSH јавни кључ који ће се користити као кључ за распоређивање:" #: ../fdroidserver/nightly.py #, python-brace-format @@ -29,51 +32,53 @@ msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" +"\n" +"{path} енкодовано за DEBUG_KEYSTORE тајну променљиву:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" -msgstr "" +msgstr "Датотека метаподатака за „%s/“ не постоји!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "" +msgstr "\"local_copy_dir\" {path} не постоји!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "" +msgstr "\"{apkfilename}\" је већ инсталиран на {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" +msgstr "\"{path}\" садржи застарели {name} ({version})" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" -msgstr "" +msgstr "\"{path}\" садржи недавни {name} ({version})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" -msgstr "" +msgstr "\"{path}\" постоји, али s3cmd није инсталиран!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "" +msgstr "„{path}“ није подржани формат фајла (користи: metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "" +msgstr "„{path}” је потписан кључем који није дозвољен:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" -msgstr "" +msgstr "\"{url}\" није валидан URL!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -81,15 +86,16 @@ msgstr "" #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(option)s опција захтева %(number)d аргумент" +msgstr[1] "%(option)s опција захтева %(number)d аргументa" +msgstr[2] "%(option)s опција захтева %(number)d аргуменaтa" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" -msgstr "" +msgstr "%(prog)s: грешка: %(message)s\n" #: ../fdroidserver/publish.py #, python-format @@ -99,20 +105,20 @@ msgstr "" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" -msgstr "" +msgstr "%d проблема пронађено" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" -msgstr "" +msgstr "%prog [опције]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" -msgstr "" +msgstr "%r није могуће позвати" #: ../fdroidserver/signindex.py #, python-format @@ -127,59 +133,59 @@ msgstr "" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" -msgstr "" +msgstr "%s није прихваћено поље за градњу" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" -msgstr "" +msgstr "Опција %s не прихвата вредност" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" -msgstr "" +msgstr "'keypass' није пронађен у config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" +msgstr "'keystore' је НИШТА и 'smartcardoptions' је празно!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" -msgstr "" +msgstr "'keystore' није пронађен у config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" -msgstr "" +msgstr "'keystorepass' није пронађен у config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" -msgstr "" +msgstr "'repo_keyalias' није пронађен у config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" -msgstr "" +msgstr "'захтевано' је неважећи аргумент за позиционе параметре" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" -msgstr "" +msgstr "'путања_до_сдк' није постављена у config.yml!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" -msgstr "" +msgstr "'{aapt}' је превише стар, fdroid захтева build-tools-{version} или новији!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" +msgstr "'{поље}' ће бити у насумичном редоследу! Користите () или [] заграде ако је редослед важан!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" -msgstr "" +msgstr "'{path}' није успео да се изврши!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -189,7 +195,7 @@ msgstr "" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" -msgstr "" +msgstr "'{value}' није валидан {field} у {appid}. Регекспатерн: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -199,21 +205,21 @@ msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" -msgstr "" +msgstr "...провера ажурирања није успела за {appid} : {грешка}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" -msgstr "" +msgstr ".__call__() није дефинисано" #: ../fdroidserver/lint.py msgid "/issues is missing" -msgstr "" +msgstr "/issues недостаје" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" -msgstr "" +msgstr "Потребан је URL као аргумент!" #: ../fdroidserver/common.py #, python-brace-format @@ -222,24 +228,24 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" -msgstr "" +msgstr "Додај PGP потписе користећи GnuPG за пакете у репоу" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" -msgstr "" +msgstr "Додајте кључ за потписивање репо-а у непотписани репо" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" -msgstr "" +msgstr "Додај метафајлове скелета за APK-ове који их немају" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" -msgstr "" +msgstr "Додавање новог репозиторијума само за {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" -msgstr "" +msgstr "Алијас репо кључа за потписивање у кејстору" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" @@ -247,47 +253,47 @@ msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" -msgstr "" +msgstr "Омогућава да се друга ревизија (или git грана) одреди за почетни увоз" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" -msgstr "" +msgstr "Такође огледало целог архива секције" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" -msgstr "" +msgstr "Такође упозори на проблеме са форматирањем, на пример rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" -msgstr "" +msgstr "Андроид AAR библиотека" #: ../fdroidserver/scanner.py msgid "Android APK file" -msgstr "" +msgstr "Андроид АПК фајл" #: ../fdroidserver/scanner.py msgid "Android DEX code" -msgstr "" +msgstr "Андроид DEX код" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "" +msgstr "Андроид SDK није пронађен на {путањи}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" -msgstr "" +msgstr "Андроид СДК пут '{path}' не постоји!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" -msgstr "" +msgstr "Путања Android SDK-а '{path}' није директоријум!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "" +msgstr "Андроид СДК алат {cmd} није пронађен!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." @@ -304,7 +310,7 @@ msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" -msgstr "" +msgstr "Апликација је у '{repo}' али има линк ка {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." @@ -312,12 +318,12 @@ msgstr "" #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" -msgstr "" +msgstr "Додавање .git није потребно" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" -msgstr "" +msgstr "Архивирање {apkfilename} са неважећим потписом!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." @@ -330,52 +336,52 @@ msgstr "" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" -msgstr "" +msgstr "Основни URL за огледало, може укључивати кључ за потписивање индекса користећи упит низ: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "" +msgstr "Грана '⸮ {branch}⸮' коришћена као commit у изради '⸮ {versionName}⸮'" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" -msgstr "" +msgstr "Грана '{branch}' коришћена као commit у srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" -msgstr "" +msgstr "Прекинута симболичка веза: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" -msgstr "" +msgstr "Изградите пакет из извора" #: ../fdroidserver/build.py msgid "Build all applications available" -msgstr "" +msgstr "Израдите све доступне апликације" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" -msgstr "" +msgstr "Градња генерисана помоћу `fdroid import` - уклоните линију за онемогућавање када буде спремно" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" -msgstr "" +msgstr "Мета подаци грађења git репозиторијума имају непослате промене!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" -msgstr "" +msgstr "Градите само најновију верзију сваког пакета" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" -msgstr "" +msgstr "Изграђен репозиторијум заснован на \"%s\" са овом конфигурацијом:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "Не могу да аутоматски ажурирам апликацију без тренутног кода верзије" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -386,16 +392,16 @@ msgstr[1] "" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" -msgstr "" +msgstr "Не могу да препишем \"{path}\"" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" -msgstr "" +msgstr "Категорије '%s' нису важеће" #: ../fdroidserver/lint.py msgid "Categories are not set" -msgstr "" +msgstr "Категорије нису подешене" #: ../fdroidserver/index.py #, python-brace-format @@ -404,29 +410,29 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" -msgstr "" +msgstr "Проверите да ли постоје ажурирања за апликације" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "" +msgstr "Провера архивирања за {appid} - апк-и:{integer}, чувајверзије:{keep}, архапк-и:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" -msgstr "" +msgstr "Чисто ажурирање – не користите кешеве, поново обрађујте све АПК-ове" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." -msgstr "" +msgstr "Запета раздвојена листа категорија." #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" -msgstr "" +msgstr "Наредба „%s” није препозната.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" -msgstr "" +msgstr "Потврди измене" #: ../fdroidserver/metadata.py #, python-brace-format @@ -435,138 +441,138 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." -msgstr "" +msgstr "Контрадикторни аргументи: '--verbose' и '--quiet' не могу бити наведени у исто време." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "Конфликтни конфигурациони фајлови! Користи се {новифајл}, игнорише се {старифајл}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" -msgstr "" +msgstr "Није могуће пронаћи '{command}' на вашем систему" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" -msgstr "" +msgstr "Није могуће пронаћи најновији верзијски код" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" -msgstr "" +msgstr "Није могуће пронаћи назив најновије верзије" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" -msgstr "" +msgstr "Није могуће пронаћи {path} да би се уклонио" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "" +msgstr "Није могуће отворити APK {путања} за анализу: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" -msgstr "" +msgstr "Није могуће парсовање величине \"{size}\", погрешан тип \"{type}\"" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" -msgstr "" +msgstr "Није пронађен ИД апликације" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" -msgstr "" +msgstr "Није могуће пронаћи информације о верзији" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" -msgstr "" +msgstr "Није могуће пронаћи ID пакета" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" -msgstr "" +msgstr "Кукавички одбија да препише постојећу конфигурацију кључа за потписивање!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" -msgstr "" +msgstr "Креиран нови контејнер \"{name}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." -msgstr "" +msgstr "Креирање \"{path}\" за конфигурацију s3cmd." #: ../fdroidserver/publish.py msgid "Creating log directory" -msgstr "" +msgstr "Креирање директоријума за записе" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" -msgstr "" +msgstr "Прављење новог S3 кофера: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" -msgstr "" +msgstr "Креирање директоријума за излаз" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" -msgstr "" +msgstr "Креирање потписаног индекса са овим кључем (SHA256):" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" -msgstr "" +msgstr "Прављење привременог директоријума" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" -msgstr "" +msgstr "Креирање непотписаног индекса у припреми за потписивање" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "" +msgstr "ТренутниКодВерзије {cv} је мањи од најстарије верзије {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" -msgstr "" +msgstr "DEBUG_KEYSTORE није подешен или је вредност непотпуна" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "" +msgstr "Обришите APKs и/или OBBs без метаподатака из репозиторијума" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "" +msgstr "Брисање архива, репозиторијум је превелик ({size} макс {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "" +msgstr "Брисање историје git-mirror, репозиторијум је превелик ({size} максимално {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" -msgstr "" +msgstr "Брисање непознате датотеке: {путања}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" -msgstr "" +msgstr "Опис '%s' је само сажетак апликације" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" -msgstr "" +msgstr "Опис има дупликатну линију" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" +msgstr "Опис има листу (%s) али није тачкаст (*) нити нумерисан (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" -msgstr "" +msgstr "Опис дужине {length} је преко ограничења од {limit} карактера" #: ../fdroidserver/common.py #, python-brace-format @@ -580,54 +586,54 @@ msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" -msgstr "" +msgstr "Не додавај 'disable:' у генерисане уносе за изградњу" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" -msgstr "" +msgstr "Не постављајте нове фајлове у репозиторијум" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" -msgstr "" +msgstr "Не укључуј \"{path}\" у URL!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" -msgstr "" +msgstr "Не тражите путању за Android SDK, само неуспешно наставите" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" -msgstr "" +msgstr "Не уклањајте приватне кључеве генерисане из кејстора" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" -msgstr "" +msgstr "Не правите изворну tar.gz архиву, корисно када тестирате изградњу" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" -msgstr "" +msgstr "Не освежавајте репозиторијум, корисно када тестирате билд без интернет конекције" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" -msgstr "" +msgstr "Не користите rsync чексуме" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" -msgstr "" +msgstr "Преузмите комплетне огледале малих репоа" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "Преузимање %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." -msgstr "" +msgstr "Преузимање складишта је већ једном неуспело, не покушавам поново." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" -msgstr "" +msgstr "Преузимање {url} није успело. {error}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -642,7 +648,7 @@ msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" -msgstr "" +msgstr "Дуплирани линк у '{field}': {url}" #: ../fdroidserver/common.py #, python-format @@ -651,17 +657,19 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" +msgstr "ГРЕШКА: Подкоманда „server“ је уклоњена, користите „deploy“!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" +"ГРЕШКА: ову команду никада не треба користити за пресликавање f-droid.org!\n" +"Потпуно пресликавање f-droid.org захтева више од 200ГБ." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" -msgstr "" +msgstr "ГРЕШКА: неподржани тип CI, закрпе добродошле!" #: ../fdroidserver/nightly.py #, python-format @@ -671,7 +679,7 @@ msgstr "" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "" +msgstr "Кодирање је подешено на „{enc}“ fdroid може наићи на проблеме са кодирањем. Молимо вас да га подесите на „UTF-8“ за најбоље резултате." #: ../fdroidserver/init.py #, python-format @@ -679,15 +687,17 @@ msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" +"Унесите путању до Android SDK (%s) овде:\n" +"> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "Еколошка променљива {var} из {configname} није подешена!" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" -msgstr "" +msgstr "Грешка при добијању адресе репозиторијума" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" @@ -699,121 +709,121 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" -msgstr "" +msgstr "Извуците потписе из АПК-ова" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" -msgstr "" +msgstr "Неуспело копирање {путања}: {грешка}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" -msgstr "" +msgstr "Неуспешно преузимање потписа за '{apkfilename}': {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" -msgstr "" +msgstr "Није успело читање {path}: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" -msgstr "" +msgstr "Неуспешно мењање величине {путања}: {грешка}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" -msgstr "" +msgstr "Неуспело креирање S3 кофера: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" -msgstr "" +msgstr "Неуспешно добијање информација о APK, брисање {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" -msgstr "" +msgstr "Није успело преузимање информација о APK, прескакање {path}" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" -msgstr "" +msgstr "Није успело добијање отиска кључа за потписивање APK" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" -msgstr "" +msgstr "Инсталација '{apkfilename}' на {dev} није успела: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" -msgstr "" +msgstr "Неуспешно потписивање апликације" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" -msgstr "" +msgstr "Пронађен id сервера за изградњу из VM-а: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" -msgstr "" +msgstr "Преузети потписи за '{apkfilename}' -> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" -msgstr "" +msgstr "Фајл је нестао током обраде: {path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" -msgstr "" +msgstr "Завршено" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" +msgstr "Методе донације путем Flattr-а спадају у поље FlattrID:" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" -msgstr "" +msgstr "Забрањене HTML ознаке" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." -msgstr "" +msgstr "Присилна изградња онемогућених апликација и наставак без обзира на проблеме са скенирањем. Дозвољено само у тест режиму." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" -msgstr "" +msgstr "Прекид изградње након {0} сек временског ограничења!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." -msgstr "" +msgstr "Присилно скенирање онемогућених апликација и градњи." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" -msgstr "" +msgstr "Пронађена је \"{path}\" графика без метаподатака за апликацију \"{name}\"!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" -msgstr "" +msgstr "Пронађена лоша датотека за финансирање \"{path}\" за \"{name}\":" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" -msgstr "" +msgstr "Пронађени неважећи ID-еви апликација у аргументима" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" -msgstr "" +msgstr "Пронађени неважећи верзијски кодови за неке апликације" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "" +msgstr "Пронађено више JAR датотека са блоковима потписа у {path}" #: ../fdroidserver/common.py msgid "Found multiple Signer Certificates!" @@ -822,25 +832,25 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" -msgstr "" +msgstr "Пронађено више метаподатотека за {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." -msgstr "" +msgstr "Пронађено је више сертификата за потписивање за репозиторијум." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." -msgstr "" +msgstr "Нису пронађени сертификати за потписивање за депо." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" -msgstr "" +msgstr "Није пронађена датотека на %s" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" -msgstr "" +msgstr "Пронађен {apkfilename} на {url}" #: ../fdroidserver/scanner.py #, python-brace-format @@ -855,33 +865,33 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" -msgstr "" +msgstr "Генерисани метаподаци скелета за {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" -msgstr "" +msgstr "Провера стања Git-а за '%s' није успела" #: ../fdroidserver/common.py msgid "Git clean failed" -msgstr "" +msgstr "Гит чишћење није успело" #: ../fdroidserver/common.py msgid "Git fetch failed" -msgstr "" +msgstr "Преузимање из Гит-а није успело" #: ../fdroidserver/common.py msgid "Git prune failed" -msgstr "" +msgstr "Git prune није успео" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" -msgstr "" +msgstr "Git remote set-head неуспешан: \"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" -msgstr "" +msgstr "Гит ресет није успео" #: ../fdroidserver/common.py msgid "Git submodule deinit failed" @@ -889,11 +899,11 @@ msgstr "" #: ../fdroidserver/common.py msgid "Git submodule sync failed" -msgstr "" +msgstr "Гит подмодул синхронизовање није успело" #: ../fdroidserver/common.py msgid "Git submodule update failed" -msgstr "" +msgstr "Ажурирање гит подмодула није успело" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" @@ -2400,7 +2410,7 @@ msgstr "" #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" -msgstr "" +msgstr "опција -%s захтева аргумент" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py @@ -2428,7 +2438,7 @@ msgstr "" #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" -msgstr "" +msgstr "опција --%s захтева аргумент" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py From 46c058470a1ea573c21275fd33f54392445f2c26 Mon Sep 17 00:00:00 2001 From: abelbiwott-dev Date: Mon, 2 Sep 2024 14:10:03 +0000 Subject: [PATCH 1637/2116] Translated using Weblate: Swahili (sw) by abelbiwott-dev Currently translated at 99.8% (579 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sw/ --- locale/sw/LC_MESSAGES/fdroidserver.po | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index 990703a0..e888741a 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-09-02 14:06+0000\n" +"PO-Revision-Date: 2024-09-02 15:02+0000\n" "Last-Translator: abelbiwott-dev \n" "Language-Team: Swahili \n" "Language: sw\n" @@ -2335,9 +2335,8 @@ msgstr "vioo vimesetiwa mara mbili, katika config.yml na {path}!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py -#, fuzzy msgid "mutually exclusive arguments must be optional" -msgstr "Hoja zisizounganishika lazima iwe ya hiari" +msgstr "Hoja zinazokinzana lazima ziwe za hiari" #: ../fdroidserver/scanner.py #, python-brace-format From 9437c6a1100948d5b2ac5b93e25c860c1ad65469 Mon Sep 17 00:00:00 2001 From: Reno Tx Date: Mon, 2 Sep 2024 16:09:20 +0000 Subject: [PATCH 1638/2116] Translated using Weblate: Serbian (sr) by Reno Tx Currently translated at 36.5% (212 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sr/ --- locale/sr/LC_MESSAGES/fdroidserver.po | 100 +++++++++++++------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index cd733dea..66cec638 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-09-02 15:02+0000\n" +"PO-Revision-Date: 2024-09-02 16:29+0000\n" "Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" "Language: sr\n" @@ -907,26 +907,26 @@ msgstr "Ажурирање гит подмодула није успело" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" -msgstr "" +msgstr "HTTPS мора да се користи са Subversion URL-овима!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "" +msgstr "Ако git огледало постане превелико, дозволите да архиву обришемо" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "" +msgstr "Ако овај пренос не успе, покушајте ручно да отпремите на {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "" +msgstr "Игнорисање '{field}' у '{metapath}' метаподацима јер је застарело." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" -msgstr "" +msgstr "Игнорисање FUNDING.yml уноса дужег од 2048: %s" #: ../fdroidserver/update.py #, python-format @@ -935,83 +935,83 @@ msgstr "" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " -msgstr "" +msgstr "Игнорисање пакета без метаподатака: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" -msgstr "" +msgstr "Игнорисање застарелих кеш података за {apkfilename}" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "" +msgstr "Укључи АПК-ове који су потписани алгоритмима који су искључени, као што је MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" -msgstr "" +msgstr "Укључите ПГП серификат .асц фајлове у огледало" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" -msgstr "" +msgstr "Укључи логове грађења у огледало" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" -msgstr "" +msgstr "Укључите изворне тарболове у огледало" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" -msgstr "" +msgstr "Укључујући метаподатке из %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" -msgstr "" +msgstr "Укључујући метаподатке из {путанје}" #: ../fdroidserver/common.py msgid "Initialising submodules" -msgstr "" +msgstr "Иницијализација подмодула" #: ../fdroidserver/install.py msgid "Install all signed applications available" -msgstr "" +msgstr "Инсталирајте све доступне потписане апликације" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" -msgstr "" +msgstr "Инсталирајте изграђене пакете на уређајима" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." -msgstr "" +msgstr "Инсталирање %s..." #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." -msgstr "" +msgstr "Инсталирање '{apkfilename}' на {dev}..." #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" -msgstr "" +msgstr "Интеракција са HTTP сервером репозиторијума" #: ../fdroidserver/update.py msgid "Invalid APK" -msgstr "" +msgstr "Неважећи APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "Неважећи AutoUpdateMode: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "" +msgstr "Неважећи UpdateCheckMode: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" -msgstr "" +msgstr "Неважећа VercodeOperation: {field}" #: ../fdroidserver/lint.py #, python-brace-format @@ -1021,86 +1021,86 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" -msgstr "" +msgstr "Неважећи идентификациони број апликације {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" -msgstr "" +msgstr "Неважећи буловски '%s'" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" -msgstr "" +msgstr "Неисправна наменска листа" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" -msgstr "" +msgstr "Неважеће име за објављени фајл: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "Невалидан ndk: унос у изградњи: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " -msgstr "" +msgstr "Неважећи преусмеравање на не-HTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" -msgstr "" +msgstr "Неважећи scrlib метаподаци: '{file}' не постоји" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" -msgstr "" +msgstr "Неправилна srclib мета подаци: није могуће анализирати '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "" +msgstr "Неправилна srclib мета подаци: непознати кључ '{key}' у '{file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" -msgstr "" +msgstr "Потпис JAR-а није успео да се верификује: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" -msgstr "" +msgstr "Потпис JAR-а верификован: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" -msgstr "" +msgstr "Java JAR файл" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "" +msgstr "Java JDK није пронађен! Инсталирајте у стандардној локацији или поставите java_paths!" #: ../fdroidserver/scanner.py msgid "Java compiled class" -msgstr "" +msgstr "Java компилирана класа" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" -msgstr "" +msgstr "Java jarsigner није пронађен! Инсталирајте на стандардној локацији или поставите java_paths!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" -msgstr "" +msgstr "Javascript у HTML src атрибутима" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "" +msgstr "Чување неуспеле градње \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" -msgstr "" +msgstr "Кејстр за потписивање кључа:\t" #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " @@ -1109,31 +1109,31 @@ msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "" +msgstr "Последњи коришћени комит '{commit}' изгледа као ознака, али је UpdateCheckMode '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" -msgstr "" +msgstr "Методе донација на Liberapay спадају у поље: Liberapay" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" -msgstr "" +msgstr "Наведите датотеке које ће бити реформиране (суви тренутак)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" -msgstr "" +msgstr "Локација укључена у f-droid.org УРЛ" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" -msgstr "" +msgstr "Зауставите изградњу на изузетцима" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." -msgstr "" +msgstr "Неправилно обликовани огледи репозиторијума." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" -msgstr "" +msgstr "Неисправна линија серверског корена веба:" #: ../fdroidserver/scanner.py #, python-format @@ -1142,7 +1142,7 @@ msgstr "" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." -msgstr "" +msgstr "Зерклите потпуну репозиторyју и архиву, све типове фајлова." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" From 411304defacf43e16267ec6ac3282c9f4126e842 Mon Sep 17 00:00:00 2001 From: Reno Tx Date: Mon, 2 Sep 2024 16:49:14 +0000 Subject: [PATCH 1639/2116] Translated using Weblate: Serbian (sr) by Reno Tx Currently translated at 53.2% (309 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sr/ --- locale/sr/LC_MESSAGES/fdroidserver.po | 196 +++++++++++++------------- 1 file changed, 98 insertions(+), 98 deletions(-) diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index 66cec638..f620b847 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-09-02 16:29+0000\n" +"PO-Revision-Date: 2024-09-02 18:28+0000\n" "Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" "Language: sr\n" @@ -1146,7 +1146,7 @@ msgstr "Зерклите потпуну репозиторyју и архиву, #: ../fdroidserver/gpgsign.py msgid "Missing output directory" -msgstr "" +msgstr "Недостаје директоријум за излаз" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" @@ -1159,89 +1159,89 @@ msgstr "" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" -msgstr "" +msgstr "Нема APK-а за пакет: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" -msgstr "" +msgstr "Нема пронађеног Android SDK!" #: ../fdroidserver/install.py msgid "No attached devices found" -msgstr "" +msgstr "Није пронађен ниједан прикључени уређај" #: ../fdroidserver/index.py msgid "No fingerprint in URL." -msgstr "" +msgstr "Нема отиска прста у УРЛ-у." #: ../fdroidserver/common.py msgid "No git submodules available" -msgstr "" +msgstr "Нема git подмодула доступних" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" -msgstr "" +msgstr "Није могуће пронаћи gradle пројекат. Укажите --subdir?" #: ../fdroidserver/import_subcommand.py msgid "No information found." -msgstr "" +msgstr "Нема информација." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" -msgstr "" +msgstr "Нема одговарајућих ознака." #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "" +msgstr "Није пронађена минимална верзија SDK у {0}, користи се подразумевана (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" -msgstr "" +msgstr "Нема потребе да се наводи да је апликација Слободан Софтвер" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" -msgstr "" +msgstr "Нема потребе да се наводи да је апликација за Андроид" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" -msgstr "" +msgstr "Нема подешавања! Измените ваш config.yml да поставите барем једну од ових:" #: ../fdroidserver/common.py msgid "No packages specified" -msgstr "" +msgstr "Нема наведених пакета" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" -msgstr "" +msgstr "Нема потписаног APK-а доступног за %s" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" -msgstr "" +msgstr "Нема потписаног излазаног директоријума - ништа за рад" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" -msgstr "" +msgstr "Нема сертификата за потпис у {path}" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" -msgstr "" +msgstr "Нема пакета: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" -msgstr "" +msgstr "Нема таквог versionCode {versionCode} за апликацију {appid}" #: ../fdroidserver/checkupdates.py msgid "No tags found" -msgstr "" +msgstr "Није пронађена ниједна ознака" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" -msgstr "" +msgstr "Нема непотписаног каталога - ништа не треба да се ради" #: ../fdroidserver/__main__.py msgid "No version information could be found." @@ -1249,116 +1249,116 @@ msgstr "" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" -msgstr "" +msgstr "Није важећа дефиниција величине: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" -msgstr "" +msgstr "Ништа за raditi" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." -msgstr "" +msgstr "Ништа за радити за {appid}." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" -msgstr "" +msgstr "Сада поставите ове у config.yml:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" -msgstr "" +msgstr "OBB фајл има новији versionCode({integer}) од било ког APK:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" -msgstr "" +msgstr "ОББ име фајла мора почети са \"main.\" или \"patch.\":" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" -msgstr "" +msgstr "Име пакета OBB не одговара подржаном APK-у:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" +msgstr "Оффлайн машина, прескочено генерисање git огледала до `fdroid deploy`" #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" -msgstr "" +msgstr "Само PNG и JPEG су подржани за графику, нађено: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" -msgstr "" +msgstr "Само штампај разлике са Плеј продавницом" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" -msgstr "" +msgstr "Само процесирај апликације са автоматским ажурирањима" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "" +msgstr "Методе донација OpenCollective припадају OpenCollective: пољу" #: /usr/lib/python3.11/optparse.py msgid "Options" -msgstr "" +msgstr "Опције" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." -msgstr "" +msgstr "Извештај у JSON формату сачувај у датотеку именовану по APK." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." -msgstr "" +msgstr "Излаз JSON на стандардни излаз." #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" -msgstr "" +msgstr "Излаз у JSON" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." -msgstr "" +msgstr "Општа Lizenzа пројекта." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "" +msgstr "Превазилажење пусте верзије име у {apkfilename} из метаподатака: {version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" -msgstr "" +msgstr "Пакет \"{appid}\" већ постоји" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" -msgstr "" +msgstr "Парсирање манифеста на '{path}'" #: ../fdroidserver/common.py msgid "Password required with username" -msgstr "" +msgstr "Потребна лозинка са корисничким именом" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." -msgstr "" +msgstr "Пут до главне подкатегорије Android пројекта, ако није у корену." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" -msgstr "" +msgstr "Пут до Android SDK (понекад подешен у ANDROID_HOME)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" -msgstr "" +msgstr "Пут до git репозиторијума који ће се користити као лог" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" -msgstr "" +msgstr "Путања до хранионице за кључ потписивања репозиторијума" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" -msgstr "" +msgstr "Штампај тајну променљиву на терминал за лако копирање/налепљивање" #: ../fdroidserver/scanner.py #, python-format @@ -1368,42 +1368,42 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" -msgstr "" +msgstr "Проблем са xml на '{path}'" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" -msgstr "" +msgstr "Процес аутоматских ажурирања" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" -msgstr "" +msgstr "Обрада {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" -msgstr "" +msgstr "Обрада {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" -msgstr "" +msgstr "Произвести људски читљив XML/JSON за индексе датотека" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." -msgstr "" +msgstr "Пројектна УРЛ адреса за импортовање." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" -msgstr "" +msgstr "Знакови интерпункције треба да се избегавају" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" -msgstr "" +msgstr "Пошаљи лог у ову гит даљинску репозиторијум" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" -msgstr "" +msgstr "Притискање логова бинарне транспарентности на {url}" #: ../fdroidserver/deploy.py msgid "Pushing to remote server failed!" @@ -1412,25 +1412,25 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" -msgstr "" +msgstr "Турење на {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" -msgstr "" +msgstr "Брзо покрените нови репозиторијум" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" -msgstr "" +msgstr "Прочитајте све метаподаатке и изађите" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" -msgstr "" +msgstr "Читање '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" -msgstr "" +msgstr "Читање packageName/versionCode/versionName није успело, APK неважећи: '{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format @@ -1440,7 +1440,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" -msgstr "" +msgstr "Читање {apkfilename} из кеша→" #: ../fdroidserver/build.py msgid "Refresh and cache scanner rules and signatures from the network" @@ -1448,63 +1448,63 @@ msgstr "" #: ../fdroidserver/common.py msgid "Removing specified files" -msgstr "" +msgstr "Уклањање наведених датотека" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "Уклањање {пут}" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" -msgstr "" +msgstr "Преименујте APK фајлове који не одговарају package.name_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "RepoTrunk режим ажурирања има смисла само у git-svn репозиторјима" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" +msgstr "Ресетујте и креирајте потпуно нови билд сервер, чак и ако се постојећи чини у реду." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" -msgstr "" +msgstr "Резање {apkfilename} са обезбеђеним debug.keystore" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" -msgstr "" +msgstr "Промени величину свих икона које прелазе максималну величину у пикселима и изађи" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" -msgstr "" +msgstr "Ограничите излаз на упозорења и грешке" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" -msgstr "" +msgstr "Преупишите све метаподатке" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" -msgstr "" +msgstr "Преиспитивање '{appid}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" -msgstr "" +msgstr "Покрени на git репозиторијуму који има неконтролисане промене" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" -msgstr "" +msgstr "Покрените rewritemeta да исправите форматирање" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" -msgstr "" +msgstr "Ручно извршавање првог пролаза са MD5 проверама онемогућеним" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" -msgstr "" +msgstr "Покретање wget у {path}" #: ../fdroidserver/index.py #, python-brace-format @@ -1513,11 +1513,11 @@ msgstr "" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "" +msgstr "Скенирајте добијене APK-ове за познате небесплатне класe." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" -msgstr "" +msgstr "Скенирајте изворни код пакета" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1527,12 +1527,12 @@ msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" -msgstr "" +msgstr "Скенер је пронашао {count} проблема у {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" -msgstr "" +msgstr "Скенирање је пронашло {count} проблема у {appid}:{versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" @@ -1547,78 +1547,78 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "" +msgstr "Поставите NDK {издање} ({верзија}) нагоре" #: ../fdroidserver/common.py msgid "Set clock to that time using:" -msgstr "" +msgstr "Поставите сат на то време користећи:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "" +msgstr "Поставите максимални број издања у репозиторијуму пре него што старија буду архивирана" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" -msgstr "" +msgstr "Поставите лимит за отворене фајлове на {целоброј}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" -msgstr "" +msgstr "Подесите апликацију за изградњу за репозиториј ноћних изградњи" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " -msgstr "" +msgstr "Постављање лимита за отворене фајлове је неуспело: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" -msgstr "" +msgstr "Постављање таймаута од {0} секунди за овај билд" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" -msgstr "" +msgstr "Потпишите и положите пакете у репо" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" -msgstr "" +msgstr "Индекс потписа креиран користећи update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" -msgstr "" +msgstr "Прескочи скенирање изворног кода за бинарне датотеке и друге проблеме" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" -msgstr "" +msgstr "Пропуштање '{apkfilename}' са неважећим потписом!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "Прескакање GitLab Pages огледала јер је репозиторијум превелики (>%.2fGB)!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" -msgstr "" +msgstr "Пређите преко генерисања индекса за {appid}" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" -msgstr "" +msgstr "Прескакам {apkfilename} са неважећим потписом!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" -msgstr "" +msgstr "Прескочи {appid}: онемогућено" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" -msgstr "" +msgstr "Одредите локалну фасциклу за синхронизацију репозиторијума" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" -msgstr "" +msgstr "Наведите датотеку идентитета коју ћете употредити за SSH приликом rsync-а" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." From 936a51f4c299e8a3e0185939403135fe697a7ac6 Mon Sep 17 00:00:00 2001 From: Reno Tx Date: Tue, 3 Sep 2024 06:15:00 +0000 Subject: [PATCH 1640/2116] Translated using Weblate: Serbian (sr) by Reno Tx Currently translated at 57.9% (336 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sr/ --- locale/sr/LC_MESSAGES/fdroidserver.po | 61 +++++++++++++++------------ 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index f620b847..61da1e06 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-09-02 18:28+0000\n" +"PO-Revision-Date: 2024-09-03 08:17+0000\n" "Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" "Language: sr\n" @@ -1622,78 +1622,78 @@ msgstr "Наведите датотеку идентитета коју ћете #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." -msgstr "" +msgstr "Наведи који debug keystore фајл да се користи." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" -msgstr "" +msgstr "Испљунути још више информација него обично" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" -msgstr "" +msgstr "Скидање мистериозног потписа са {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" -msgstr "" +msgstr "Сажетак '%s' је само име апликације" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" -msgstr "" +msgstr "Резиме дужине {length} премашује {limit} знакова" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" -msgstr "" +msgstr "Системски сат је старији од датума у {path}!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" +msgstr "Режим ажурирања етикета тренутно ради само за git, hg, bzr и git-svn репозиторијуме" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" +msgstr "Режим ажурирања ознака коришћен у git-svn, али репо није подешен са ознакама" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." -msgstr "" +msgstr "Тест режим - стави излаз у tmp директоријум само, и увек компајлирај, чак и ако излаз већ постоји." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" -msgstr "" +msgstr "Код верзије OBB мора бити након \"{name}.\":" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" -msgstr "" +msgstr "Основни URL за репо за логовање (подразумевано: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" -msgstr "" +msgstr "Директоријум у који ће се написати огледало" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" -msgstr "" +msgstr "Фајл који треба да буде укључен у репо (путања или глоб)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." -msgstr "" +msgstr "Отисак репозиторијума се не поклапа." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" -msgstr "" +msgstr "Коренски директоријум за local_copy_dir \"{path}\" не постоји!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" -msgstr "" +msgstr "Дошло је до колизије кључа - објављивање је обустављено" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." -msgstr "" +msgstr "Ово су апликације које су архивиране из главног репозиторијума." #: ../fdroidserver/mirror.py msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." @@ -1701,12 +1701,12 @@ msgstr "" #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" +msgstr "Ово је репозиторијум апликација које се користе са F-Droid. Апликације у овом репозиторијуму су или званичне бинарне верзије које су развили оригинални програмери апликација, или су бинарне верзије састављене из извора од стране администратора f-droid.org коришћењем алата на https://gitlab.com/fdroid." #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" -msgstr "" +msgstr "Овај репо већ има локалне метаподатке: %s" #: ../fdroidserver/init.py #, python-format @@ -1719,31 +1719,38 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" +"Да бисте завршили подешавање, додајте своје АПК-ове у \"%s\" \n" +"затим покрените \"fdroid update -c; fdroid update\". Такође можете желети да измените \n" +"\"config.yml\" да поставите УРЛ, име репозиторију и још много тога. Такође бисте требали \n" +"наподесити кључ за потписивање (можда је привремени већ аутоматски генерисан). \n" +" \n" +"За више информација: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo \n" +"и https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" +msgstr "Да бисте користили awsbucket, awssecretkey и awsaccesskeyid морају бити подешени у config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" -msgstr "" +msgstr "URL мора почети са https:// или http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" -msgstr "" +msgstr "URL скраћивачи не би требало да се користе" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" -msgstr "" +msgstr "URL {url} у Опису: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "" +msgstr "Неочекивана ознака лиценце \"{}\"! Користите само ознаке одобрене од стране FSF или OSI са https://spdx.org/license-list" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "" +msgstr "Неочекивана ознака лиценце \"{}\"! Користите само ознаке лиценце конфигурисане у вашем конфигурационом фајлу" #: ../fdroidserver/common.py #, python-brace-format @@ -1753,7 +1760,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "" +msgstr "Непознати унос {key} у {configname}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" From 39e8c68425ecc3d79aaa6f623113e78370d93dbb Mon Sep 17 00:00:00 2001 From: linsui Date: Tue, 3 Sep 2024 15:29:05 +0000 Subject: [PATCH 1641/2116] Translated using Weblate: Chinese (Simplified Han script) (zh_Hans) by linsui Currently translated at 96.0% (557 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 30 +++++++++++----------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 2af1f8f0..99253bf7 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -15,7 +15,7 @@ # JY3 , 2021, 2022. # Eric , 2022. # shenzhui007 <12231252@bjtu.edu.cn>, 2022. -# linsui , 2022. +# linsui , 2022, 2024. # YangYulin , 2022. # Yang Yulin , 2022. # yangyangdaji <1504305527@qq.com>, 2022. @@ -37,15 +37,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-07-23 06:25+0000\n" -"Last-Translator: chumoer \n" -"Language-Team: Chinese (Simplified) \n" +"PO-Revision-Date: 2024-09-03 15:47+0000\n" +"Last-Translator: linsui \n" +"Language-Team: Chinese (Simplified Han script) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.7-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -324,7 +324,7 @@ msgstr "没找到 Android SDK 工具 {cmd}!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "应用程序具有二进制文件,但没有相应的AllowedAPKSigningKeys 来固定证书。" +msgstr "应用具有二进制文件,但没有相应的AllowedAPKSigningKeys 来固定证书。" #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" @@ -341,7 +341,7 @@ msgstr "应用 在 '{repo}' 中, 但有一个链接到 {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "应用程序版本具有二进制文件,但没有相应的 AllowedAPKSigningKeys 来固定证书。" +msgstr "应用版本具有二进制文件,但没有相应的 AllowedAPKSigningKeys 来固定证书。" #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -408,7 +408,7 @@ msgstr "使用此配置并基于 \"%s\" 的构建存储库:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "在没有CurrentVersionCode的情况下不能自动更新应用程序" +msgstr "在没有CurrentVersionCode的情况下不能自动更新应用" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -432,7 +432,7 @@ msgstr "没有设置类别" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "类别“{category}”已定义,但未被用于任何应用程序!" +msgstr "类别“{category}”已定义,但未被用于任何应用!" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -731,7 +731,7 @@ msgstr "如果发现问题,则以非零代码退出" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "从源存储库中提取应用程序元数据" +msgstr "从源存储库中提取应用元数据" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" @@ -783,7 +783,7 @@ msgstr "无法在 {dev} 上安装 '{apkfilename}':{error}" #: ../fdroidserver/common.py msgid "Failed to sign application" -msgstr "未能对应用程序进行签名" +msgstr "未能对应用进行签名" #: ../fdroidserver/build.py #, python-brace-format @@ -830,7 +830,7 @@ msgstr "强制扫描已禁用的应用和内部版本。" #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" -msgstr "为应用程序“{name}”找到了没有元数据的“{path}”图形!" +msgstr "为应用“{name}”找到了没有元数据的“{path}”图形!" #: ../fdroidserver/update.py #, python-brace-format @@ -1259,7 +1259,7 @@ msgstr "没有这样的包:%s" #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" -msgstr "应用程序 {appid} 没有此类版本代码 {versionCode}" +msgstr "应用 {appid} 没有此类版本代码 {versionCode}" #: ../fdroidserver/checkupdates.py msgid "No tags found" @@ -1661,7 +1661,7 @@ msgstr "从 {apkfilename} 中剥离神秘签名" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" -msgstr "摘要“%s”只是应用程序的名称" +msgstr "摘要“%s”只是应用的名称" #: ../fdroidserver/lint.py #, python-brace-format @@ -2412,7 +2412,7 @@ msgstr "只接受字符串、列表和元组" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "选项 %s: 如果您真的想安装所有已签名的应用程序,请使用 --all" +msgstr "选项 %s: 如果您真的想安装所有已签名的应用,请使用 --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py From 3612153cf38ae544b81906995d8e466346d2b946 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 3 Sep 2024 22:12:09 +0000 Subject: [PATCH 1642/2116] Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk Currently translated at 100.0% (580 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ --- locale/uk/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index d8d41e27..f559a76e 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -15,7 +15,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-08-31 11:09+0000\n" +"PO-Revision-Date: 2024-09-04 13:39+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" "Language: uk\n" @@ -23,7 +23,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.7.2-rc\n" #: ../fdroidserver/nightly.py msgid "" @@ -903,7 +903,7 @@ msgstr "Скидання Git не вдалося" #: ../fdroidserver/common.py msgid "Git submodule deinit failed" -msgstr "Деініціалізація підмодуля Git не вдалася" +msgstr "Не вдалося деініціалізувати підмодуль Git" #: ../fdroidserver/common.py msgid "Git submodule sync failed" From e7909fd48ae216bd871097fc080d72062e8ff271 Mon Sep 17 00:00:00 2001 From: Reno Tx Date: Tue, 3 Sep 2024 20:18:03 +0000 Subject: [PATCH 1643/2116] Translated using Weblate: Serbian (sr) by Reno Tx Currently translated at 58.6% (340 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sr/ --- locale/sr/LC_MESSAGES/fdroidserver.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index 61da1e06..8e2b6448 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-09-03 08:17+0000\n" +"PO-Revision-Date: 2024-09-04 13:39+0000\n" "Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" "Language: sr\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.7.2-rc\n" #: ../fdroidserver/nightly.py msgid "" @@ -1755,7 +1755,7 @@ msgstr "Неочекивана ознака лиценце \"{}\"! Корист #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" +msgstr "Неочекивани симболички линк циљ: {link} -> {target}" #: ../fdroidserver/common.py #, python-brace-format @@ -1764,18 +1764,18 @@ msgstr "Непознати унос {key} у {configname}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" -msgstr "" +msgstr "Непозната изузетна ситуација пронађена!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" -msgstr "" +msgstr "Непозната датотека '{filename}' у изградњи '{versionName}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" -msgstr "" +msgstr "Непознати формат метаподатака: %s" #: ../fdroidserver/metadata.py #, python-brace-format From c7ad9f8e41d56bc1c0ec0a5cec935b86d76c2043 Mon Sep 17 00:00:00 2001 From: Cxnfl1ct Date: Fri, 6 Sep 2024 07:55:42 +0000 Subject: [PATCH 1644/2116] Translated using Weblate: Korean (ko) by Cxnfl1ct Currently translated at 31.2% (181 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ko/ --- locale/ko/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index 167fd824..b3c82f3e 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -2,20 +2,21 @@ # This file is put in the public domain. # Hans-Christoph Steiner , 2020, 2021, 2022, 2024. # Myeongjin Lee , 2021. +# Cxnfl1ct , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-04-10 13:33+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2024-09-06 14:57+0000\n" +"Last-Translator: Cxnfl1ct \n" "Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -2111,7 +2112,7 @@ msgstr "" #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" -msgstr "복잡" +msgstr "복잡한" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py From ed71e06bc4e7dcf992a12662801dabe2a54a0e9e Mon Sep 17 00:00:00 2001 From: Reno Tx Date: Fri, 6 Sep 2024 10:08:44 +0000 Subject: [PATCH 1645/2116] Translated using Weblate: Serbian (sr) by Reno Tx Currently translated at 75.6% (439 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sr/ --- locale/sr/LC_MESSAGES/fdroidserver.po | 211 +++++++++++++------------- 1 file changed, 107 insertions(+), 104 deletions(-) diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index 8e2b6448..6f2de19c 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-09-04 13:39+0000\n" +"PO-Revision-Date: 2024-09-06 14:57+0000\n" "Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" "Language: sr\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.7.2-rc\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -386,8 +386,9 @@ msgstr "Не могу да аутоматски ажурирам апликац #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Не може се изградити због {} грешке приликом скенирања" +msgstr[1] "Не може се изградити због {} грешке приликом скенирања" +msgstr[2] "Не може се изградити због {} грешака приликом скенирања" #: ../fdroidserver/rewritemeta.py #, python-brace-format @@ -1537,8 +1538,9 @@ msgstr "Скенирање је пронашло {count} проблема у {ap #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Скенирање је пронашло {} проблем" +msgstr[1] "Скенирање је пронашло {} проблема" +msgstr[2] "Скенирање је пронашло {} проблема" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." @@ -1780,77 +1782,77 @@ msgstr "Непознати формат метаподатака: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" -msgstr "" +msgstr "Непознат формат метаподатака: {path} (користи: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " -msgstr "" +msgstr "Непозната верзија aapt, може изазвати проблеме: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" -msgstr "" +msgstr "Непотребан водећи размак" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" -msgstr "" +msgstr "Непотребан завршни размак" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" -msgstr "" +msgstr "Непознато поље апликације '{fieldname}' у '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" -msgstr "" +msgstr "Непозната застава изградње '{build_flag}' у '{path}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" -msgstr "" +msgstr "Неподржани тип датотеке \"{extension}\" за графику репозиторијума" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" -msgstr "" +msgstr "Пронађена неподржана графичка датотека: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" -msgstr "" +msgstr "Некоришћена екстерна библиотека на %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" -msgstr "" +msgstr "Некоришћена датотека на %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" -msgstr "" +msgstr "Некоришћена путања за брисање скенирања: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" -msgstr "" +msgstr "Некоришћена путања за игнорисање скенирања: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "Распакујем у %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" -msgstr "" +msgstr "Ажурирање информација о репозиторијуму за нове пакете" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" -msgstr "" +msgstr "Ажурирање дневника транспарентности бинарних датотека за URL" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" -msgstr "" +msgstr "UpdateCheckData има неважећи URL: {url}" #: ../fdroidserver/lint.py #, python-brace-format @@ -1860,12 +1862,12 @@ msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" -msgstr "" +msgstr "UpdateCheckData мора користити HTTPS URL: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" -msgstr "" +msgstr "UpdateCheckData није важећи URL: {url}" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." @@ -1878,30 +1880,30 @@ msgstr "" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "" +msgstr "UpdateCheckName је постављен на познати ID апликације, може се уклонити" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" -msgstr "" +msgstr "Отпремање {apkfilename} на androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" -msgstr "" +msgstr "Отпремање {apkfilename} на virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" -msgstr "" +msgstr "Употреба" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" -msgstr "" +msgstr "Употреба: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" @@ -1909,32 +1911,32 @@ msgstr "" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" +msgstr "Користи /HEAD уместо /master за указивање на датотеку у подразумеваној грани" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." -msgstr "" +msgstr "Користи `fdroid update -c` да је креираш." #: ../fdroidserver/build.py msgid "Use build server" -msgstr "" +msgstr "Користи сервер за изградњу" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" +msgstr "Користи датум из APK уместо тренутног времена за ново додате APK-ове" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." -msgstr "" +msgstr "Користим \"{path}\" за конфигурисање s3cmd." #: ../fdroidserver/common.py msgid "Using APK Signature v2" -msgstr "" +msgstr "Користим APK Signature v2" #: ../fdroidserver/common.py msgid "Using APK Signature v3" -msgstr "" +msgstr "Користим APK Signature v3" #: ../fdroidserver/common.py msgid "Using JAR Signature" @@ -1942,12 +1944,12 @@ msgstr "" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" -msgstr "" +msgstr "Користим Java's jarsigner, не препоручује се за верификацију APK-ова! Користи apksigner" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" -msgstr "" +msgstr "Користим androguard из \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1957,45 +1959,45 @@ msgstr "" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" -msgstr "" +msgstr "Користим постојећи keystore \"{path}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" -msgstr "" +msgstr "Користим s3cmd за синхронизацију са: {url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" -msgstr "" +msgstr "Важеће команде су:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." -msgstr "" +msgstr "Верификуј против локално кеширане копије уместо поновног преузимања." #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" -msgstr "" +msgstr "Верификуј интегритет преузетих пакета" #: ../fdroidserver/index.py msgid "Verifying index signature:" -msgstr "" +msgstr "Верификација потписа индекса:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "" +msgstr "VirusTotal API кључ не може отпремити датотеке веће од 32MB, користи {url} за отпремање {path}." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" -msgstr "" +msgstr "Упозорење о могућим грешкама у метаподацима" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" -msgstr "" +msgstr "Када је конфигурисано за потписане индексе, креирај само непотписане индексе у овој фази" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "" +msgstr "Када се врши провера целог репозиторијума, yamllint је подразумевано онемогућен. Ова опција приморава yamllint без обзира на то." #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." @@ -2003,58 +2005,58 @@ msgstr "" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" -msgstr "" +msgstr "X.509 'Distinguished Name' коришћен приликом генерисања кључева" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" -msgstr "" +msgstr "Можеш користити ANDROID_HOME да подесиш путању до свог SDK, тј.:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" -msgstr "" +msgstr "ZIP архивска датотека" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" -msgstr "" +msgstr "додавање IdentityFile у {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" -msgstr "" +msgstr "додавање у {name}: {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "" +msgstr "нејасна опција: %(option)s може одговарати %(matches)s" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" -msgstr "" +msgstr "двосмислена опција: %s (%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "" +msgstr "apksigner није пронађен! Не могу да потпишем или проверим модерне APK-ове" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" -msgstr "" +msgstr "apksigner није пронађен, потребан је за потписивање!" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" -msgstr "" +msgstr "ID апликације датотеке за рад" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" -msgstr "" +msgstr "ID апликације са опционим versionCode у облику APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" @@ -2065,7 +2067,7 @@ msgstr "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" -msgstr "" +msgstr "аргумент \"-\" са модом %r" #: /usr/lib/python3.11/argparse.py #, python-format @@ -2074,11 +2076,11 @@ msgstr "" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" -msgstr "" +msgstr "покушавам SSH везу без кључа да тестирам deploy кључ:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" -msgstr "" +msgstr "не могу да парсирам scrlib спецификацију (није стринг): '{}'" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format @@ -2092,33 +2094,33 @@ msgstr "" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" -msgstr "" +msgstr "не могу да пронађем потребне srclibs: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" -msgstr "" +msgstr "не могу имати више аргумената подпарсера" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" -msgstr "" +msgstr "не могу спојити акције - две групе се зову %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" -msgstr "" +msgstr "не могу објавити ажурирање, да ли сте поставили deploy кључ?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" -msgstr "" +msgstr "клонирам {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" -msgstr "" +msgstr "команде из plugin модула:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2148,7 +2150,7 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" -msgstr "" +msgstr "не могу да парсирам '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no name specified): '{}'" @@ -2156,38 +2158,38 @@ msgstr "" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "" +msgstr "не могу да парсирам srclib спецификацију (није наведена референца): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" +msgstr "не могу да парсирам srclib спецификацију (превише '@' знакова): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" -msgstr "" +msgstr "креирано {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "тренутна верзија је новија: стара верзија={old}, нова верзија={new}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" -msgstr "" +msgstr "бришем: repo/{apkfilename}" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" -msgstr "" +msgstr "постављен лог процеса {path} на {dest}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" -msgstr "" +msgstr "dest= је потребан за опције као што је %r" #: ../fdroidserver/scanner.py msgid "downloading '{}'" @@ -2199,7 +2201,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" -msgstr "" +msgstr "извршни бинарни фајл, могуће код" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2207,30 +2209,31 @@ msgstr "" #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "очекиван %s аргумент" +msgstr[1] "очекивана %s аргумента" +msgstr[2] "очекивано %s аргумената" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" -msgstr "" +msgstr "очекиван бар један аргумент" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" -msgstr "" +msgstr "очекиван највише један аргумент" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" -msgstr "" +msgstr "очекиван један аргумент" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" -msgstr "" +msgstr "fdroid [<команда>] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" @@ -2238,30 +2241,30 @@ msgstr "" #: /usr/lib/python3.11/optparse.py msgid "floating-point" -msgstr "" +msgstr "број са покретним зарезом" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." -msgstr "" +msgstr "форсирај грешке метаподатака (подразумевано) да буду упозорења, или да буду игнорисане." #: ../fdroidserver/common.py msgid "git svn clone failed" -msgstr "" +msgstr "git svn clone није успео" #: ../fdroidserver/scanner.py msgid "gzip file archive" -msgstr "" +msgstr "gzip архива датотека" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" -msgstr "" +msgstr "игнорисан експлицитан аргумент %r" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" -msgstr "" +msgstr "index-v1 мора имати потпис, користите `fdroid signindex` да га креирате!" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" @@ -2271,35 +2274,35 @@ msgstr "" #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" -msgstr "" +msgstr "цео број" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" -msgstr "" +msgstr "неважећа %(type)s вредност: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "" +msgstr "неважећи избор: %(value)r (изаберите из %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" -msgstr "" +msgstr "неважећа conflict_resolution вредност: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" -msgstr "" +msgstr "неважећа опција стринг %(option)r: мора почети са карактером %(prefix_chars)r" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" @@ -2308,25 +2311,25 @@ msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "најновији рецепт за изградњу је новији: стара верзија={old}, нова верзија={new}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" -msgstr "" +msgstr "local_copy_dir не завршава се са \"fdroid\", можда сте мислили: \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" -msgstr "" +msgstr "local_copy_dir мора бити апсолутна путања!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" -msgstr "" +msgstr "local_copy_dir мора бити директоријум, а не датотека!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" -msgstr "" +msgstr "огледало '%s' се не завршава са 'fdroid'!" #: ../fdroidserver/index.py #, python-brace-format @@ -2337,7 +2340,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" -msgstr "" +msgstr "међусобно искључиви аргументи морају бити опционални" #: ../fdroidserver/scanner.py #, python-brace-format @@ -2347,22 +2350,22 @@ msgstr "" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" -msgstr "" +msgstr "нема \"иконе\" у {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" -msgstr "" +msgstr "нема достављеног APK-а" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" -msgstr "" +msgstr "нема такве опције: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" -msgstr "" +msgstr "нема пронађених информација о верзији!" #: ../fdroidserver/checkupdates.py msgid "no version information found" From 0f26f66553b5d4320e7bf823e56be44f5e7a0eab Mon Sep 17 00:00:00 2001 From: Reno Tx Date: Fri, 6 Sep 2024 17:41:04 +0000 Subject: [PATCH 1646/2116] Translated using Weblate: Serbian (sr) by Reno Tx Currently translated at 100.0% (580 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sr/ --- locale/sr/LC_MESSAGES/fdroidserver.po | 296 +++++++++++++------------- 1 file changed, 150 insertions(+), 146 deletions(-) diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index 6f2de19c..c1769f38 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-09-06 14:57+0000\n" +"PO-Revision-Date: 2024-09-07 00:41+0000\n" "Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" "Language: sr\n" @@ -100,7 +100,7 @@ msgstr "%(prog)s: грешка: %(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "%d АПК-ова није успело да се потпише или верификује!" #: ../fdroidserver/scanner.py #, python-format @@ -123,12 +123,12 @@ msgstr "%r није могуће позвати" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" -msgstr "" +msgstr "%s није произвео речник!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" -msgstr "" +msgstr "%s има лош SHA-256: %s" #: ../fdroidserver/lint.py #, python-format @@ -190,7 +190,7 @@ msgstr "'{path}' није успео да се изврши!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "'{path}' има неважећи формат, треба да буде речник!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format @@ -200,7 +200,7 @@ msgstr "'{value}' није валидан {field} у {appid}. Регекспат #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "" +msgstr "'{value}' није важећи {field}, треба да буде {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -224,7 +224,7 @@ msgstr "Потребан је URL као аргумент!" #: ../fdroidserver/common.py #, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "" +msgstr "Потписи АПК-ова имају различите сертификате у {path}:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -249,7 +249,7 @@ msgstr "Алијас репо кључа за потписивање у кејс #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "AllowedAPKSigningKeys недостаје али је референтни бинарни фајл обезбеђен" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" @@ -297,15 +297,15 @@ msgstr "Андроид СДК алат {cmd} није пронађен!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "Апликација има бинарне фајлове али нема одговарајуће AllowedAPKSigningKeys за пиновање сертификата." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" +msgstr "Апликација има NoSourceSince или ArchivePolicy \"0 верзија\" али AutoUpdateMode или UpdateCheckMode нису None" #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" +msgstr "Апликација има NoSourceSince или ArchivePolicy \"0 верзија\" или 0, али AutoUpdateMode или UpdateCheckMode нису None" #: ../fdroidserver/lint.py #, python-brace-format @@ -314,7 +314,7 @@ msgstr "Апликација је у '{repo}' али има линк ка {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "Апликација има бинарни фајл, али нема одговарајуће AllowedAPKSigningKeys за пин сертификат." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -327,12 +327,12 @@ msgstr "Архивирање {apkfilename} са неважећим потпис #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." -msgstr "" +msgstr "AutoUpdateMode са UpdateCheckMode: HTTP мора имати образац." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "Лош тип уноса \"{mirrortype}\" у конфигурацији огледала: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -407,7 +407,7 @@ msgstr "Категорије нису подешене" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" +msgstr "Категорија \"{category}\" је дефинисана, али није коришћена за ниједну апликацију!" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -438,7 +438,7 @@ msgstr "Потврди измене" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" +msgstr "Конфликтне дефиниције \"{field}\" између .yml и локализованих фајлова:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." @@ -578,12 +578,12 @@ msgstr "Опис дужине {length} је преко ограничења од #: ../fdroidserver/common.py #, python-brace-format msgid "Did you mean config/{name}.yml?" -msgstr "" +msgstr "Да ли сте мислили config/{name}.yml?" #: ../fdroidserver/lint.py #, python-brace-format msgid "Did you mean {code}?" -msgstr "" +msgstr "Да ли сте мислили {code}?" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" @@ -639,12 +639,12 @@ msgstr "Преузимање {url} није успело. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "" +msgstr "Дуплирана декларација Анти-Функције на {path} је игнорисана!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "" +msgstr "Дуплирани унос \"%s\" у конфигурацији огледала!" #: ../fdroidserver/lint.py #, python-brace-format @@ -654,7 +654,7 @@ msgstr "Дуплирани линк у '{field}': {url}" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "ГРЕШКА: %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -675,7 +675,7 @@ msgstr "ГРЕШКА: неподржани тип CI, закрпе доброд #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "" +msgstr "ГРЕШКА: неподржан git домаћин \"%s\", закрпе су добродошле!" #: ../fdroidserver/__main__.py #, python-brace-format @@ -702,11 +702,11 @@ msgstr "Грешка при добијању адресе репозиториј #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" +msgstr "Излаз са ненултим кодом ако су пронађени проблеми" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "" +msgstr "Извлачење метаподатака апликације из изворног репозиторијума" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" @@ -828,7 +828,7 @@ msgstr "Пронађено више JAR датотека са блоковима #: ../fdroidserver/common.py msgid "Found multiple Signer Certificates!" -msgstr "" +msgstr "Пронађено више потписних сертификата!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -856,12 +856,12 @@ msgstr "Пронађен {apkfilename} на {url}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" -msgstr "" +msgstr "Пронађено {count} проблема у {filename}" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" -msgstr "" +msgstr "Пронађено {count} упозорења у {filename}" #: ../fdroidserver/update.py #, python-brace-format @@ -896,7 +896,7 @@ msgstr "Гит ресет није успео" #: ../fdroidserver/common.py msgid "Git submodule deinit failed" -msgstr "" +msgstr "Git submodule deinit није успео" #: ../fdroidserver/common.py msgid "Git submodule sync failed" @@ -932,7 +932,7 @@ msgstr "Игнорисање FUNDING.yml уноса дужег од 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "" +msgstr "Игнорисање лошег елемента у манифесту: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1017,7 +1017,7 @@ msgstr "Неважећа VercodeOperation: {field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" -msgstr "" +msgstr "Неважећа VercodeOperation: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format @@ -1105,7 +1105,7 @@ msgstr "Кејстр за потписивање кључа:\t" #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "" +msgstr "Познати дебаг кључ се користи у AllowedAPKSigningKeys: " #: ../fdroidserver/lint.py #, python-brace-format @@ -1139,7 +1139,7 @@ msgstr "Неисправна линија серверског корена ве #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "" +msgstr "Достигнута максимална дубина рекурзије у ZIP датотеци: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1151,11 +1151,11 @@ msgstr "Недостаје директоријум за излаз" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" +msgstr "Премештање декларација Анти-Функција у локализоване фајлове:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" +msgstr "Ни \"repo_pubkey\" ни \"keystorepass\" нису постављени у config.yml" #: ../fdroidserver/verify.py #, python-format @@ -1246,7 +1246,7 @@ msgstr "Нема непотписаног каталога - ништа не т #: ../fdroidserver/__main__.py msgid "No version information could be found." -msgstr "" +msgstr "Није пронађена информација о верзији." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" @@ -1364,7 +1364,7 @@ msgstr "Штампај тајну променљиву на терминал з #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" -msgstr "" +msgstr "Проблем са ZIP датотеком: %s, грешка %s" #: ../fdroidserver/common.py #, python-brace-format @@ -1408,7 +1408,7 @@ msgstr "Притискање логова бинарне транспарент #: ../fdroidserver/deploy.py msgid "Pushing to remote server failed!" -msgstr "" +msgstr "Слање на удаљени сервер није успело!" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1436,7 +1436,7 @@ msgstr "Читање packageName/versionCode/versionName није успело, #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" -msgstr "" +msgstr "Читање packageName/versionCode/versionName није успело, APK је неважећи: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format @@ -1445,7 +1445,7 @@ msgstr "Читање {apkfilename} из кеша→" #: ../fdroidserver/build.py msgid "Refresh and cache scanner rules and signatures from the network" -msgstr "" +msgstr "Освежите и кеширајте правила и потписе скенера са мреже" #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1510,7 +1510,7 @@ msgstr "Покретање wget у {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "" +msgstr "SHA-256 од {url} не одговара уносу!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." @@ -1523,7 +1523,7 @@ msgstr "Скенирајте изворни код пакета" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" -msgstr "" +msgstr "Скенирање је пронашло {count} проблема у {apk}" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1544,7 +1544,7 @@ msgstr[2] "Скенирање је пронашло {} проблема" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." -msgstr "" +msgstr "Скенирање APK са dexdump за познате неслободне класе." #: ../fdroidserver/common.py #, python-brace-format @@ -1699,7 +1699,7 @@ msgstr "Ово су апликације које су архивиране из #: ../fdroidserver/mirror.py msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "" +msgstr "Ова команда никада не би требало да се користи за огледало f-droid.org! Пуна копија захтева више од 600GB." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." @@ -1857,7 +1857,7 @@ msgstr "UpdateCheckData има неважећи URL: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" -msgstr "" +msgstr "UpdateCheckData мора одговарати верзионом коду као цео број (\\d или [0-9]): {codeex}" #: ../fdroidserver/lint.py #, python-brace-format @@ -1871,12 +1871,12 @@ msgstr "UpdateCheckData није важећи URL: {url}" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "" +msgstr "UpdateCheckMode је подешен, али изгледа да checkupdates још није покренут." #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" +msgstr "UpdateCheckMode је подешен, али изгледа да checkupdates још није покренут" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -1907,7 +1907,7 @@ msgstr "Употреба: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "" +msgstr "Користите /HEAD уместо /master или /main да покажете на фајл у подразумеваној грани" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" @@ -1940,7 +1940,7 @@ msgstr "Користим APK Signature v3" #: ../fdroidserver/common.py msgid "Using JAR Signature" -msgstr "" +msgstr "Коришћење JAR потписа" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -1954,7 +1954,7 @@ msgstr "Користим androguard из \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" -msgstr "" +msgstr "Коришћење празног речника уместо садржаја {path}!" #: ../fdroidserver/init.py #, python-brace-format @@ -2001,7 +2001,7 @@ msgstr "Када се врши провера целог репозиториј #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." -msgstr "" +msgstr "Када потписивање или верификација не успеју, излазите са кодом грешке." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2060,7 +2060,7 @@ msgstr "ID апликације са опционим versionCode у облик #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" -msgstr "" +msgstr "archive_url мора да се завршава са /archive" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2072,7 +2072,7 @@ msgstr "аргумент \"-\" са модом %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" -msgstr "" +msgstr "аргумент %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" @@ -2085,11 +2085,11 @@ msgstr "не могу да парсирам scrlib спецификацију ( #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "" +msgstr "не могу да отворим '%(filename)s': %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" -msgstr "" +msgstr "не могу да отворим non-https url: '{};" #: ../fdroidserver/build.py #, python-brace-format @@ -2134,18 +2134,19 @@ msgstr "комплекс" #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "конфликтна опција стринг: %s" +msgstr[1] "конфликтна опција стринга: %s" +msgstr[2] "конфликтна опција стрингова: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser alias: %s" -msgstr "" +msgstr "конфликтни алиас подпарсера: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser: %s" -msgstr "" +msgstr "конфликтни подпарсер: %s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2154,7 +2155,7 @@ msgstr "не могу да парсирам '{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "" +msgstr "није могуће парсирати srclib спецификацију (није наведено име): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" @@ -2193,11 +2194,11 @@ msgstr "dest= је потребан за опције као што је %r" #: ../fdroidserver/scanner.py msgid "downloading '{}'" -msgstr "" +msgstr "преузимање '{}'" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" -msgstr "" +msgstr "преузимање потписа скенера са '{}' није успело" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" @@ -2237,7 +2238,7 @@ msgstr "fdroid [<команда>] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" -msgstr "" +msgstr "преузмите најновију верзију потписа са веба" #: /usr/lib/python3.11/optparse.py msgid "floating-point" @@ -2268,7 +2269,7 @@ msgstr "index-v1 мора имати потпис, користите `fdroid si #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "" +msgstr "index-v2 мора имати потпис, користите `fdroid signindex` да га направите!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2306,7 +2307,7 @@ msgstr "неважећа опција стринг %(option)r: мора поче #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" -msgstr "" +msgstr "ipfs_cid није пронађен, прескачем генерисање CIDv1" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -2334,7 +2335,7 @@ msgstr "огледало '%s' се не завршава са 'fdroid'!" #: ../fdroidserver/index.py #, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "" +msgstr "огледала су постављена два пута, у config.yml и {path}!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2345,7 +2346,7 @@ msgstr "међусобно искључиви аргументи морају б #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" -msgstr "" +msgstr "следеће ажурирање кеша {name} је за {time}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2369,51 +2370,51 @@ msgstr "нема пронађених информација о верзији!" #: ../fdroidserver/checkupdates.py msgid "no version information found" -msgstr "" +msgstr "није пронађена информација о верзијама" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" -msgstr "" +msgstr "није дозвољено са аргументом %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" -msgstr "" +msgstr "један од аргумената %s је обавезан" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" -msgstr "" +msgstr "прихвата само стрингове, листе и тапл" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" +msgstr "опција %s: Ако заиста желите да инсталирате све потписане апликације, користите --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" -msgstr "" +msgstr "опција %s: неважећа %s вредност: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" +msgstr "опција %s: неважећи избор: %r (изаберите из %s)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" -msgstr "" +msgstr "опција -%s није препозната" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py @@ -2427,21 +2428,21 @@ msgstr "опција -%s захтева аргумент" #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" -msgstr "" +msgstr "опција --%s не сме имати аргумент" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" -msgstr "" +msgstr "опција --%s није јединствени префикс" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" -msgstr "" +msgstr "опција --%s није препозната" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py @@ -2453,78 +2454,78 @@ msgstr "опција --%s захтева аргумент" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" -msgstr "" +msgstr "опциони аргументи" #: /usr/lib/python3.11/argparse.py msgid "options" -msgstr "" +msgstr "опције" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" -msgstr "" +msgstr "преписивање постојећег {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" -msgstr "" +msgstr "позициони аргументи" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" -msgstr "" +msgstr "процес лог распоређивање {path} у {dest} није успело!" #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "" +msgstr "референтни бинарни фајл недостаје потпис" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "" +msgstr "одбијам преузимање преко несигурне HTTP везе (користите HTTPS или наведите --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "" +msgstr "repo_icon \"repo/icons/%s\" не постоји, генерише се привремена икона." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" -msgstr "" +msgstr "repo_url мора да се завршава са /repo" #: ../fdroidserver/deploy.py #, python-brace-format msgid "rsync is missing or broken: {error}" -msgstr "" +msgstr "rsync недостаје или је покварен: {error}" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" +msgstr "ruamel.yaml није инсталиран, не могу да пишем метаподатке." #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" -msgstr "" +msgstr "s3cmd синхронизује индексе {path} са {url} и брише" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" -msgstr "" +msgstr "кеш скенера је неисправан! Можете га обрисати са: '{clear}'" #: ../fdroidserver/deploy.py msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "" +msgstr "serverwebroot: путања се не завршава са \"fdroid\", можда сте мислили на једну од ових:" #: ../fdroidserver/scanner.py msgid "shared library" -msgstr "" +msgstr "дељена библиотека" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" -msgstr "" +msgstr "прикажи верзију програма и изађи" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py @@ -2532,257 +2533,260 @@ msgstr "" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" -msgstr "" +msgstr "прикажи ову поруку помоћи и изађи" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." -msgstr "" +msgstr "потписан APK, или путања до фајла или HTTPS URL." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "" +msgstr "прескакање распоређивања комплетних логова изградње: садржај лога је празан" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" -msgstr "" +msgstr "прескакање распоређивања комплетних логова изградње: није омогућено у конфигурацији" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" -msgstr "" +msgstr "прескакање изворног тарбала: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" -msgstr "" +msgstr "srclibs недостаје име и/или @" #: ../fdroidserver/scanner.py msgid "static library" -msgstr "" +msgstr "статичка библиотека" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "" +msgstr "достављени референтни бинарни фајл има дозвољеног потписника {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" -msgstr "" +msgstr "следећи аргументи су обавезни: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" -msgstr "" +msgstr "неочекивана опција стринг: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "" +msgstr "непознат парсер %(parser_name)r (избори: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" -msgstr "" +msgstr "непрепознати аргументи: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" -msgstr "" +msgstr "небезбедне дозволе на '{config_file}' (требало би да буду 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " -msgstr "" +msgstr "употреба: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" -msgstr "" +msgstr "користећи Apache libcloud за синхронизацију са {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "" +msgstr "virustotal.com ограничава брзину, чекање на поновни покушај..." #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{0} апликација, {1} кључних алијаса" +msgstr[1] "{0} апликације, {1} кључних алијаса" +msgstr[2] "{0} апликација, {1} кључних алијаса" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" -msgstr "" +msgstr "{apkfilename} ({appid}) нема метаподатке!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" +msgstr "{apkfilename} има више {name} фајлова, изгледа као Master Key експлоат!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " -msgstr "" +msgstr "{apkfilename}'s AndroidManifest.xml има лош датум: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." -msgstr "" +msgstr "{appid} нема име! Користи се ID апликације уместо тога." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" -msgstr "" +msgstr "{appid} из {path} није важећи Android ID апликације!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" -msgstr "" +msgstr "{appid} из {path} није важеће име Java пакета!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid} има и APK-ове и фајлове: {files}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" -msgstr "" +msgstr "{appid} недостаје {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" -msgstr "" +msgstr "{appid}: Непознати extlib {path} у изградњи '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" -msgstr "" +msgstr "{appid}: нису наведене изградње, ради се на тренутном изворном стању" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "" +msgstr "{appid}: {field} мора бити '{type}', али је '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" -msgstr "" +msgstr "{appid}: {field} мора бити '{type}', али је '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" -msgstr "" +msgstr "{build_flag} мора бити цео број, пронађено: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" -msgstr "" +msgstr "{build_flag} мора бити листа или стринг, пронађено: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" -msgstr "" +msgstr "{file} је празан или оштећен!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "" +msgstr "{name} \"{section}/icons/{path}\" не постоји! Проверите \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "{oldfile} је застарео, користите {newfile}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" -msgstr "" +msgstr "{path} већ постоји, игноришем резултате увоза!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" -msgstr "" +msgstr "{path} не постоји! Направите га покретањем:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "" +msgstr "{path} има лош потпис датотеке \"{pattern}\", могући Janus експлоат!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} has been flagged by virustotal {count} times:" -msgstr "" +msgstr "{path} је означен од стране virustotal {count} пута:" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" +msgstr "{path} није \"кључ: вредност\" речник, већ {datatype}!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not a standard config file!" -msgstr "" +msgstr "{path} није стандардни конфигурациони фајл!" #: ../fdroidserver/index.py #, python-brace-format msgid "{path} is not list, but a {datatype}!" -msgstr "" +msgstr "{path} није листа, већ {datatype}!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "" +msgstr "{path} није {expected_type}, већ {datatype}!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" -msgstr "" +msgstr "{path} је нулте величине!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" -msgstr "" +msgstr "{path} је већи од 200MB, ручно отпремите: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" +msgstr "{path}: \"{code}\" није важећи ISO_3166-1 alpha-2 код државе!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" -msgstr "" +msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" -msgstr "" +msgstr "{url} се не завршава са \"fdroid\", проверите URL путању!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" -msgstr "" +msgstr "{url} не почиње са \"http\"!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{} изградња није успела" +msgstr[1] "{} изградње нису успеле" +msgstr[2] "{} изградњи није успело" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{} изградња је успела" +msgstr[1] "{} изградње су успеле" +msgstr[2] "{} изградњи је успело" From f84af4feb0164a0b61a918c23ccff04da5614067 Mon Sep 17 00:00:00 2001 From: abelbiwott-dev Date: Sat, 7 Sep 2024 11:04:21 +0000 Subject: [PATCH 1647/2116] Translated using Weblate: Swahili (sw) by abelbiwott-dev Currently translated at 100.0% (580 of 580 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sw/ --- locale/sw/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index e888741a..2440b131 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-05-13 13:50+0200\n" -"PO-Revision-Date: 2024-09-02 15:02+0000\n" +"PO-Revision-Date: 2024-09-08 11:09+0000\n" "Last-Translator: abelbiwott-dev \n" "Language-Team: Swahili \n" "Language: sw\n" @@ -344,9 +344,9 @@ msgid "Branch '{branch}' used as commit in build '{versionName}'" msgstr "Tawi '{branch}' limetumika kupeleka katika ujenzi wa '{versionName}'" #: ../fdroidserver/lint.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" -msgstr "Tawi {branch} limetumika kama kufanya katika srclib '{srclib}'" +msgstr "Tawi {branch} linalotumika kama commit katika srclib '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format From fef7ae772e94e6c95786afd85c036f0c9e4f4486 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 10 Sep 2024 10:31:58 +0200 Subject: [PATCH 1648/2116] enable new official languages: Catalan Serbian Swahili --- MANIFEST.in | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MANIFEST.in b/MANIFEST.in index 4022d2e8..19f9a743 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -21,6 +21,7 @@ include examples/Vagrantfile.yaml include gradlew-fdroid include LICENSE include locale/bo/LC_MESSAGES/fdroidserver.po +include locale/ca/LC_MESSAGES/fdroidserver.po include locale/cs/LC_MESSAGES/fdroidserver.po include locale/de/LC_MESSAGES/fdroidserver.po include locale/es/LC_MESSAGES/fdroidserver.po @@ -36,6 +37,8 @@ include locale/pt_PT/LC_MESSAGES/fdroidserver.po include locale/ro/LC_MESSAGES/fdroidserver.po include locale/ru/LC_MESSAGES/fdroidserver.po include locale/sq/LC_MESSAGES/fdroidserver.po +include locale/sr/LC_MESSAGES/fdroidserver.po +include locale/sw/LC_MESSAGES/fdroidserver.po include locale/tr/LC_MESSAGES/fdroidserver.po include locale/uk/LC_MESSAGES/fdroidserver.po include locale/zh_Hans/LC_MESSAGES/fdroidserver.po From a8f09043d2252020e16e5b31b0922108fc952c1b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 10 Sep 2024 10:48:38 +0200 Subject: [PATCH 1649/2116] fix format strings --- locale/sr/LC_MESSAGES/fdroidserver.po | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index c1769f38..f40421dc 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -180,7 +180,7 @@ msgstr "'{aapt}' је превише стар, fdroid захтева build-tools #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{поље}' ће бити у насумичном редоследу! Користите () или [] заграде ако је редослед важан!" +msgstr "'{field}' ће бити у насумичном редоследу! Користите () или [] заграде ако је редослед важан!" #: ../fdroidserver/common.py #, python-brace-format @@ -205,7 +205,7 @@ msgstr "'{value}' није важећи {field}, треба да буде {patte #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" -msgstr "...провера ажурирања није успела за {appid} : {грешка}" +msgstr "...провера ажурирања није успела за {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -278,7 +278,7 @@ msgstr "Андроид DEX код" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "Андроид SDK није пронађен на {путањи}!" +msgstr "Андроид SDK није пронађен на {path}!" #: ../fdroidserver/common.py #, python-brace-format @@ -447,7 +447,7 @@ msgstr "Контрадикторни аргументи: '--verbose' и '--quiet #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Конфликтни конфигурациони фајлови! Користи се {новифајл}, игнорише се {старифајл}!" +msgstr "Конфликтни конфигурациони фајлови! Користи се {newfile}, игнорише се {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format @@ -470,7 +470,7 @@ msgstr "Није могуће пронаћи {path} да би се уклони #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "Није могуће отворити APK {путања} за анализу: " +msgstr "Није могуће отворити APK {path} за анализу: " #: ../fdroidserver/common.py #, python-brace-format @@ -554,7 +554,7 @@ msgstr "Брисање историје git-mirror, репозиторијум #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" -msgstr "Брисање непознате датотеке: {путања}" +msgstr "Брисање непознате датотеке: {path}" #: ../fdroidserver/lint.py #, python-format @@ -715,7 +715,7 @@ msgstr "Извуците потписе из АПК-ова" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" -msgstr "Неуспело копирање {путања}: {грешка}" +msgstr "Неуспело копирање {path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format @@ -730,7 +730,7 @@ msgstr "Није успело читање {path}: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" -msgstr "Неуспешно мењање величине {путања}: {грешка}" +msgstr "Неуспешно мењање величине {path}: {error}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -967,7 +967,7 @@ msgstr "Укључујући метаподатке из %s@%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" -msgstr "Укључујући метаподатке из {путанје}" +msgstr "Укључујући метаподатке из {path}" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1454,7 +1454,7 @@ msgstr "Уклањање наведених датотека" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "Уклањање {пут}" +msgstr "Уклањање {path}" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -1549,7 +1549,7 @@ msgstr "Скенирање APK са dexdump за познате неслобод #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "Поставите NDK {издање} ({верзија}) нагоре" +msgstr "Поставите NDK {release} ({version}) нагоре" #: ../fdroidserver/common.py msgid "Set clock to that time using:" @@ -1562,7 +1562,7 @@ msgstr "Поставите максимални број издања у реп #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" -msgstr "Поставите лимит за отворене фајлове на {целоброј}" +msgstr "Поставите лимит за отворене фајлове на {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" From 4579aa079a23da3adb981cbcc53985120380144e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 10 Sep 2024 10:51:32 +0200 Subject: [PATCH 1650/2116] make -C locale compile --- locale/bo/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++++++++- locale/ca/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++++++++- locale/cs/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++++++++- locale/de/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++++++++- locale/es/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++++++++- locale/fdroidserver.pot | 58 +++++++++++++++++++++- locale/fr/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++++++++- locale/hu/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++- locale/it/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++++++++- locale/ko/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++++++++- locale/pl/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++++++++- locale/pt/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++++++++- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++++++++- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++++++++- locale/ro/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++++++++- locale/ru/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++++++++- locale/sq/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++++++++- locale/sr/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++++++++- locale/sw/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++++++++- locale/tr/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++++++++- locale/uk/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++++++++- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++++++++- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++++++++- 24 files changed, 1342 insertions(+), 25 deletions(-) diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index 3e7d1e19..06817ec3 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tibetan \n" @@ -675,6 +675,16 @@ msgstr "ནོར་འཁྲུལ།: རྒྱབ་སྐྱོར་མེ msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -694,6 +704,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "རེ་པོ་ཁ་བྱང་ལེན་སྐབས་ནོར་སྐྱོན།" @@ -1292,6 +1306,18 @@ msgstr "OBB's ཐུམ་སྒྲིལ་མིང་འདིས་APK ར msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1504,6 +1530,11 @@ msgstr "སྐྱར་བྲིས། '{appid}'" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "བཀོད་སྒྲིག་འདི་ག་རང་ལ་སྐྱར་བྲིས་བྱེད།" @@ -1734,6 +1765,11 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "awsbucket, awssecretkey དང་། awsaccesskeyid བེད་སྤྱོད་བྱེད་པའི་ཆེད་དུ་ config.yml ནང་དུ་ངེས་པར་དུ་སྒྲིག་དགོས།!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "awsbucket, awssecretkey དང་། awsaccesskeyid བེད་སྤྱོད་བྱེད་པའི་ཆེད་དུ་ config.yml ནང་དུ་ངེས་པར་དུ་སྒྲིག་དགོས།!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1934,6 +1970,11 @@ msgstr "APK རང་གི་ཚེས་གྲངས་དེ་བེད་ msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1965,6 +2006,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "སྐྱར་བྲིས་ཡོད་།{path}" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "s3cmd བེད་སྤྱོད་བྱས་ནས་: {url}1དང་མཉམ་དུ་sync" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2185,6 +2231,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "སུབ་བཞིན་པ།:རེ་པོ་/{apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2518,6 +2568,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sync ཕྱོགས་སྟོན།{path}1 དེ་ནས {url} དང་སུབས།" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd sync ཕྱོགས་སྟོན།{path}1 དེ་ནས {url} དང་སུབས།" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index b9848f73..aa1ffe63 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-08-26 17:39+0000\n" "Last-Translator: pitroig \n" "Language-Team: Catalan \n" @@ -677,6 +677,16 @@ msgstr "ERROR: tipus CI no suportat, pedaços benvinguts!" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "ERROR: no s'admet l'amfitrió git \"%s\", els pedaços són benvinguts!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -696,6 +706,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "La variable d'entorn {var} de {configname} no està establerta!" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "S'ha produït un error en obtenir l'adreça del dipòsit" @@ -1283,6 +1297,18 @@ msgstr "El nom del paquet de l'OBB no coincideix amb un APK compatible:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Màquina fora de línia, s'ometrà la generació del mirall git fins al `fdroid deploy`" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1494,6 +1520,11 @@ msgstr "S'està reescrivint '{appid}'" msgid "Run on git repo that has uncommitted changes" msgstr "Executa en el diposit git que té canvis no publicats" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Executa rewritemeta per esmenar el format" @@ -1732,6 +1763,11 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Per utilitzar awsbucket, awssecretkey i awsaccesskeyid també s'han d'establir a config.yml!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "Per utilitzar awsbucket, awssecretkey i awsaccesskeyid també s'han d'establir a config.yml!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "L'URL ha de començar per https:// o http://" @@ -1929,6 +1965,11 @@ msgstr "Usa la data de l'APK en lloc de l'hora actual per als APKs nous afegits" msgid "Using \"{path}\" for configuring s3cmd." msgstr "S'està utilitzant \"{path}\" per configurar s3cmd." +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "S'està utilitzant \"{path}\" per configurar s3cmd." + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Ús de la signatura APK v2" @@ -1960,6 +2001,11 @@ msgstr "S'està utilitzant un diccionari en blanc en lloc del contingut de {path msgid "Using existing keystore \"{path}\"" msgstr "S'està utilitzant l'espai de claus existent \"{path}\"" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "S'està utilitzant s3cmd per sincronitzar amb: {url}" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2178,6 +2224,10 @@ msgstr "la versió actual és més nova: antic vercode={old}, nou vercode={new}" msgid "deleting: repo/{apkfilename}" msgstr "s'està suprimint: dipòsit/{apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2505,6 +2555,11 @@ msgstr "ruamel.yaml no està instal·lat, no es poden escriure metadades." msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincronitza els índexs {path} a {url} i suprimeix" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd sincronitza els índexs {path} a {url} i suprimeix" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 5ec4d664..78c22068 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-05-15 04:32+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" @@ -681,6 +681,16 @@ msgstr "CHYBA: nepodporovaný typ CI, opravy vítány!" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "CHYBA: nepodporovaný git host \"%s\", opravy vítány!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -700,6 +710,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "Proměnná prostředí {var} z {configname} není nastavena!" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Chyba při získávání adresy repozitáře" @@ -1287,6 +1301,18 @@ msgstr "Packagename souboru OBB neodpovídá podporovanému souboru APK:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Offline počítač, přeskočení generování mirroru git až do `fdroid deploy`" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1498,6 +1524,11 @@ msgstr "Přepisování ‚{appid}‘" msgid "Run on git repo that has uncommitted changes" msgstr "Spustit v repozitáři git s nezveřejněnými změnami" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Spustit rewritemeta pro opravu formátování" @@ -1737,6 +1768,11 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Chcete-li používat awsbucket, musí být v souboru config.yml nastaven také awssecretkey a awsaccesskeyid!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "Chcete-li používat awsbucket, musí být v souboru config.yml nastaven také awssecretkey a awsaccesskeyid!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL musí začínat s https:// nebo http://" @@ -1934,6 +1970,11 @@ msgstr "Pro nově přidaná APK použít datum z APK místo aktuálního času" msgid "Using \"{path}\" for configuring s3cmd." msgstr "Používám „{path}“ pro konfiguraci s3cmd." +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "Používám „{path}“ pro konfiguraci s3cmd." + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Používám APK Signature v2" @@ -1965,6 +2006,11 @@ msgstr "Použití prázdného slovníku místo obsahu {path}!" msgid "Using existing keystore \"{path}\"" msgstr "Používám existující keystore „{path}“" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "Používám s3cmd pro synchronizaci s: {url}" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2184,6 +2230,10 @@ msgstr "současná verze je novější: starý vercode={old}, nový vercode={new msgid "deleting: repo/{apkfilename}" msgstr "mazání: repo/{apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2512,6 +2562,11 @@ msgstr "ruamel.yaml není nainstalován, nelze zapisovat metadata." msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sync indexes {path} do {url} a odstranit" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd sync indexes {path} do {url} a odstranit" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index cc199702..1996b072 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -26,7 +26,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-05-20 09:01+0000\n" "Last-Translator: Maxi \n" "Language-Team: German \n" @@ -694,6 +694,16 @@ msgstr "FEHLER: nicht unterstützter CI-Typ, Patches willkommen!" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "FEHLER: nicht unterstützter Git-Host \"%s\", Patches willkommen!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -713,6 +723,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "Umgebungsvariable {var} von {configname} ist nicht gesetzt!" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Fehler bei der Ermittlung der Repro-Adresse" @@ -1300,6 +1314,18 @@ msgstr "Der OBB-Packetname stimmt mit keinem unterstützten APK überein:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Maschine offline, überspringe git-Spiegelgeneration bis `fdroid deploy`" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1511,6 +1537,11 @@ msgstr "Schreibe '{appid}' neu" msgid "Run on git repo that has uncommitted changes" msgstr "Auf Git Repo, das nicht committete Änderungen hat, laufen lassen" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Metadaten neu schreiben, um Formatierungen zu korrigieren" @@ -1749,6 +1780,11 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Um awsbucket zu benutzen, müssen awssecretkey und awsaccesskeyid auch in der config.yml gesetzt sein!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "Um awsbucket zu benutzen, müssen awssecretkey und awsaccesskeyid auch in der config.yml gesetzt sein!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL muss mit https:// oder http:// beginnen" @@ -1946,6 +1982,11 @@ msgstr "APK-Datum statt der aktuellen Zeit für neu hinzugefügte APKs verwenden msgid "Using \"{path}\" for configuring s3cmd." msgstr "Verwende {path} zur Konfiguration von s3cmd." +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "Verwende {path} zur Konfiguration von s3cmd." + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Verwende APK-Signatur v2" @@ -1977,6 +2018,11 @@ msgstr "Verwende leeres Verzeichnis statt der Inhalte von {path}!" msgid "Using existing keystore \"{path}\"" msgstr "Verwende vorhandenen Schlüsselspeicher \"{path}\"" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "Verwende s3cmd zum Synchronisieren mit: {url}" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2195,6 +2241,10 @@ msgstr "die aktuelle Version ist neuer: alter vercode={old}, neuer vercode={new} msgid "deleting: repo/{apkfilename}" msgstr "Lösche: repo/{apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2522,6 +2572,11 @@ msgstr "ruamel.yaml ist nicht installiert, kann Metadaten nicht schreiben." msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd-Sync {path} indizieren auf {url} und dann löschen" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd-Sync {path} indizieren auf {url} und dann löschen" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 0adffae6..d625ff0a 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-05-26 07:09+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" @@ -685,6 +685,16 @@ msgstr "ERROR: tipo de CI no soportado, ¡se aceptan parches!" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "ERROR: host git no soportado \"%s\", ¡parches bienvenidos!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -704,6 +714,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "¡La variable de entorno {var} de {configname} no tiene valor asignado!" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Error al obtener la dirección del repositorio" @@ -1291,6 +1305,18 @@ msgstr "El nombre de paquete de OBB no coincide con un APK soportado:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Maquina desconectada. Saltando la generación del repositorio espejo git hasta`fdroid deploy`" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1502,6 +1528,11 @@ msgstr "Reescribiendo '{appid}'" msgid "Run on git repo that has uncommitted changes" msgstr "Ejecutar en repositorio git con cambios pendientes" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Ejecutar rewritemeta para arreglar el formato" @@ -1740,6 +1771,11 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "¡Para usar awsbucket hay que configurar también awssecretkey y awsaccesskeyid en config.yml!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "¡Para usar awsbucket hay que configurar también awssecretkey y awsaccesskeyid en config.yml!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "La URL debe comenzar con https:// o http://" @@ -1937,6 +1973,11 @@ msgstr "Use la fecha del APK en vez de la fecha actual para los nuevos APK añad msgid "Using \"{path}\" for configuring s3cmd." msgstr "Usando \"{path}\" para configurar s3cmd." +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "Usando \"{path}\" para configurar s3cmd." + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Utilizando Firma APK v2" @@ -1968,6 +2009,11 @@ msgstr "¡Usando un diccionario en blanco en lugar del contenido de la {path}!" msgid "Using existing keystore \"{path}\"" msgstr "Usando almacén de claves existente \"{path}\"" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "Usando s3cmd para sincronizar con: {url}" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2186,6 +2232,10 @@ msgstr "la versión actual es más nueva: código de versión viejo={old}, códi msgid "deleting: repo/{apkfilename}" msgstr "eliminando: repo/{apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2513,6 +2563,11 @@ msgstr "ruamel.yaml no instalado. No se pueden escribir metadatos." msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sync indexa {path} a {url} y elimina" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd sync indexa {path} a {url} y elimina" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/fdroidserver.pot b/locale/fdroidserver.pot index 3829af39..27258a85 100644 --- a/locale/fdroidserver.pot +++ b/locale/fdroidserver.pot @@ -5,9 +5,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: fdroidserver 2.3a1\n" +"Project-Id-Version: fdroidserver 2.3a1-162-gfbb3cc59\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -668,6 +668,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -685,6 +695,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1272,6 +1286,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1483,6 +1509,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1714,6 +1745,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1911,6 +1946,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1942,6 +1982,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2160,6 +2205,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2487,6 +2536,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index ed2a5508..6c5bad80 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -40,7 +40,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-06-09 16:09+0000\n" "Last-Translator: Christopher Forzy \n" "Language-Team: French \n" @@ -709,6 +709,16 @@ msgstr "ERREUR : type de CI non supporté, les corrections sont bienvenues !" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "ERREUR : hébergeur git « %s » non supporté, les corrections sont les bienvenues !" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -728,6 +738,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "La variable d'environnent {var} de {configname} n'est pas configurée !" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Erreur lors de l'obtention de l'adresse du dépôt" @@ -1318,6 +1332,18 @@ msgstr "Le nom de paquet d'OBB ne correspond pas à un fichier APK pris en charg msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Machine hors-ligne, la génération du miroir git est sautée jusqu'à `fdroid deploy`" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1531,6 +1557,11 @@ msgstr "Réécriture de « {appid} »" msgid "Run on git repo that has uncommitted changes" msgstr "Exécuter sur le dépôt git qui a des modifications non validées" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Exécuter rewritemeta pour corriger le formatage" @@ -1774,6 +1805,11 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Pour utiliser awsbucket, awssecretkey et awsaccesskeyid doivent aussi être configurées dans config.yml !" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "Pour utiliser awsbucket, awssecretkey et awsaccesskeyid doivent aussi être configurées dans config.yml !" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "L'URL doit commencer par https:// ou http://" @@ -1973,6 +2009,11 @@ msgstr "Utiliser la date de l'APK plutôt que la date courante pour les APKs nou msgid "Using \"{path}\" for configuring s3cmd." msgstr "Utiliser \"{path}\" pour configurer s3cmd." +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "Utiliser \"{path}\" pour configurer s3cmd." + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Utilisation de la signature d'APK v2" @@ -2005,6 +2046,11 @@ msgstr "Utilisation d'un dictionnaire vide plutôt que du contenu de {path} !" msgid "Using existing keystore \"{path}\"" msgstr "Utilise le trousseau existant \"{path}\"" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "Utiliser s3cmd pour synchroniser avec : {url}" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2224,6 +2270,10 @@ msgstr "la version actuelle est plus récente : ancien vercode={old}, nouveau ve msgid "deleting: repo/{apkfilename}" msgstr "suppression : repo/{apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2551,6 +2601,11 @@ msgstr "ruamel.yaml n’est pas installé, impossible d’écrire les métadonn msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd synchroniser les index de {path} vers {url} et les supprimer" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd synchroniser les index de {path} vers {url} et les supprimer" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index e5b334ae..b9f8ee7b 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Hungarian \n" @@ -676,6 +676,16 @@ msgstr "HIBA: nem támogatott CI típus, foltokat szívesen fogadunk!" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -695,6 +705,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "A(z) {configname} konfigurációból származó {var} környezeti változó nincs beállítva!" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Hiba történt a tároló címének lekérésekor" @@ -1289,6 +1303,18 @@ msgstr "Az OBB csomagneve nem egyezik egyik támogatott APK-val sem:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Offline gép, git tükör előállításának kihagyása az „fdroid deploy” kiadásáig" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1501,6 +1527,11 @@ msgstr "„{appid}” újraírása" msgid "Run on git repo that has uncommitted changes" msgstr "Futtatás azon a git tárolón, amelyben nem véglegesített változtatások vannak" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "A rewritemeta futtatása a formázás javításához" @@ -1736,6 +1767,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1933,6 +1968,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1964,6 +2004,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2182,6 +2227,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2511,6 +2560,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index ef898753..75e21d6a 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-04-13 17:01+0000\n" "Last-Translator: Random \n" "Language-Team: Italian \n" @@ -690,6 +690,16 @@ msgstr "ERRORE: tipo di CI non supportato, le patch sono benvenute!" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "ERRORE: host git \"%s\" non supportato, le patch sono benvenute!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -709,6 +719,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "La variabile d'ambiente {var} da {configname} non è impostata!" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Errore nell'ottenere l'indirizzo del repo" @@ -1299,6 +1313,18 @@ msgstr "Il nome del pacchetto di OBB non corrisponde a un APK supportato:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Macchina offline, saltando la generazione del mirror git fino a quando `fdroid deploy`" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1512,6 +1538,11 @@ msgstr "Riscrittura di \"{appid}\"" msgid "Run on git repo that has uncommitted changes" msgstr "Esegui su repository git con modifiche non salvate" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Esegui rewritemeta per correggere la formattazione" @@ -1753,6 +1784,11 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Per usare awsbucket, awssecretkey e awsaccesskeyid devono essere impostati anche in config.yml!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "Per usare awsbucket, awssecretkey e awsaccesskeyid devono essere impostati anche in config.yml!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "L'URL deve iniziare con https:// o http://" @@ -1952,6 +1988,11 @@ msgstr "Usa la data dell'APK invece dell'ora corrente per gli APK aggiunti di re msgid "Using \"{path}\" for configuring s3cmd." msgstr "Usare \"{path}\" per configurare s3cmd." +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "Usare \"{path}\" per configurare s3cmd." + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Usare la firma APK v2" @@ -1984,6 +2025,11 @@ msgstr "Utilizzo di un dizionario vuoto al posto del contenuto di {path}!" msgid "Using existing keystore \"{path}\"" msgstr "Utilizzando il keystore esistente \"{path}\"" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "Utilizzando s3cmd per sincronizzare con: {url}" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2203,6 +2249,10 @@ msgstr "la versione attuale è più recente: old vercode={old}, new vercode={new msgid "deleting: repo/{apkfilename}" msgstr "cancellazione: repo/{apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2530,6 +2580,11 @@ msgstr "ruamel.yaml non installato, non può scrivere metadati." msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincronizza gli indici {path} con {url} e cancella" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd sincronizza gli indici {path} con {url} e cancella" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index b3c82f3e..16b8a1e2 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-09-06 14:57+0000\n" "Last-Translator: Cxnfl1ct \n" "Language-Team: Korean \n" @@ -671,6 +671,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -688,6 +698,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1278,6 +1292,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1489,6 +1515,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1719,6 +1750,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1916,6 +1951,11 @@ msgstr "새로 추가된 APK를 위해 현재 시간 대신에 APK에서의 날 msgid "Using \"{path}\" for configuring s3cmd." msgstr "s3cmd를 구성하기 위해 \"{path}\" 사용." +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "s3cmd를 구성하기 위해 \"{path}\" 사용." + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1947,6 +1987,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "기존 키스토어 \"{path}\"를 사용 중" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "다음과 동기화하는 데 s3cmd 사용: {url}" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2164,6 +2209,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "삭제 중: repo/{apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2492,6 +2541,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd 동기화는 {url}로 {path}를 색인하고 삭제합나다" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd 동기화는 {url}로 {path}를 색인하고 삭제합나다" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index 2108b5d6..5c302b21 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Norwegian Bokmål \n" @@ -694,6 +694,16 @@ msgstr "Feil: Ustøttet CI-type, feilrettinger er velkomne." msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -713,6 +723,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "Miljøvariabelen {var} fra {configname} er ikke satt!" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Error while getting repo address" @@ -1328,6 +1342,18 @@ msgstr "OBB-pakkenavn samsvarer ikke med noen støttet APK:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Frakoblet maskin. Hopper over Git-avspeilingsgenerering til «fdroid deploy»" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1549,6 +1575,11 @@ msgstr "Skriver om \"{appid}\"" msgid "Run on git repo that has uncommitted changes" msgstr "Kjør på Git-pakkebrønn som har uinnsendte endringer" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Kjør rewritemetadata for å fikse formatering" @@ -1789,6 +1820,11 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "For å bruke AWS-spann, må \"awssecretkey\" og \"awsaccesskeyid\" også være satt i config.yml." +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "For å bruke AWS-spann, må \"awssecretkey\" og \"awsaccesskeyid\" også være satt i config.yml." + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "Nettadressen må starte med https:// eller http://" @@ -1991,6 +2027,11 @@ msgstr "Bruk dato fra APK istedenfor nåværende tid for nylig tillagte APK-er" msgid "Using \"{path}\" for configuring s3cmd." msgstr "Bruker \"{path}\" for oppsett av s3cmd." +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "Bruker \"{path}\" for oppsett av s3cmd." + #: ../fdroidserver/common.py #, fuzzy msgid "Using APK Signature v2" @@ -2026,6 +2067,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "Bruker eksisterende nøkkellager \"{path}\"." +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "Bruk s3cmd til å synkronisere med: {url}" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2252,6 +2298,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "Behandler {apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2591,6 +2641,11 @@ msgstr "ruamel.yaml er ikke installert. Kan ikke skrive metadata." msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd synkroniserer indekser {path} til {url} og sletter" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd synkroniserer indekser {path} til {url} og sletter" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 21f9ffee..a87be9ef 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-08-23 10:34+0000\n" "Last-Translator: WaldiS \n" "Language-Team: Polish \n" @@ -679,6 +679,16 @@ msgstr "BŁĄD: nieobsługiwany typ CI, mile widziane poprawki!" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "BŁĄD: nieobsługiwany host git „%s”, łatki mile widziane!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -698,6 +708,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "Zmienna środowiskowa {var} z {configname} nie jest ustawiona!" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Błąd podczas uzyskiwania adresu repo" @@ -1287,6 +1301,18 @@ msgstr "Nazwa pakietu OBB nie jest zgodna z obsługiwanym pakietem APK:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Maszyna Offline, pomijając generowanie git mirror aż do ' fdroid deploy`" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1498,6 +1524,11 @@ msgstr "Przepisywanie '{appid}'" msgid "Run on git repo that has uncommitted changes" msgstr "Uruchom ponownie repozytorium git z niescommitowanymi zmianami" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Uruchom rewritemeta, aby naprawić formatowanie" @@ -1737,6 +1768,11 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Aby użyć awsbucket, awssecretkey i awsaccesskeyid muszą być również ustawione w config.yml!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "Aby użyć awsbucket, awssecretkey i awsaccesskeyid muszą być również ustawione w config.yml!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "Adres URL musi rozpoczynać się od https:// lub http://" @@ -1936,6 +1972,11 @@ msgstr "Użyj daty z pliku APK zamiast aktualnego dla nowo dodanych pakietów AP msgid "Using \"{path}\" for configuring s3cmd." msgstr "Użyj \"{path}\" do konfiguracji s3cmd." +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "Użyj \"{path}\" do konfiguracji s3cmd." + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Używając APK Signature v2" @@ -1968,6 +2009,11 @@ msgstr "Używanie pustego słownika zamiast zawartości {path}!" msgid "Using existing keystore \"{path}\"" msgstr "Korzystanie z istniejącego magazynu kluczy \"{path}\"" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "Użyj s3cmd do synchronizacji z: {url}" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2187,6 +2233,10 @@ msgstr "aktualna wersja jest nowsza: stary vercode={old}, nowy vercode={new}" msgid "deleting: repo/{apkfilename}" msgstr "usuwanie: repo/{apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2515,6 +2565,11 @@ msgstr "nie zainstalowano ruamel.yaml, nie można zapisać metadanych." msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd zsynchronizuj indeksy {path} do {url} i usuń" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd zsynchronizuj indeksy {path} do {url} i usuń" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 0c6bd966..4986e1f8 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-08-12 18:05+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" @@ -676,6 +676,16 @@ msgstr "ERRO: tipo de CI sem suporte, patches são bem-vindos!" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "ERRO: host de git \"%s\" não suportado, patches são bem-vindos!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -695,6 +705,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "A variável de ambiente {var} de {configname} não está definida!" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Erro ao obter o endereço do repo" @@ -1282,6 +1296,18 @@ msgstr "O packagename do OBB não corresponde a um APK suportado:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "A máquina está offline, a saltar a geração de espelhos de git até o `fdroid deploy'" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1493,6 +1519,11 @@ msgstr "Reescrevendo '{appid}'" msgid "Run on git repo that has uncommitted changes" msgstr "Executar no repo git que tem alterações não confirmadas" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Executar rewritemeta para corrigir a formatação" @@ -1731,6 +1762,11 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "A URL deve começar com https:// ou http://" @@ -1928,6 +1964,11 @@ msgstr "Use da data do APK em vez do tempo atual para APKs recém-adicionados" msgid "Using \"{path}\" for configuring s3cmd." msgstr "Usando \"{path}\" para configurar s3cmd." +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "Usando \"{path}\" para configurar s3cmd." + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "A usar a assinatura APK v2" @@ -1959,6 +2000,11 @@ msgstr "A utilizar um dicionário em branco em vez do conteúdo de {path}!" msgid "Using existing keystore \"{path}\"" msgstr "Utilizando armazenamento de chave existente \"{path}\"" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "Usando s3cmd para sincronizar com: {url}" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2177,6 +2223,10 @@ msgstr "a versão atual é mais nova: velho vercódigo={old}, novo vercódigo={n msgid "deleting: repo/{apkfilename}" msgstr "apagando: repo/{apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2504,6 +2554,11 @@ msgstr "o ruamel.yaml não está instalado, não é possível escrever metadados msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincroniza índices {path} para {url} e apaga" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd sincroniza índices {path} para {url} e apaga" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 4ea2d3cf..ce11b7db 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-07-07 07:41+0000\n" "Last-Translator: lucasmz-dev \n" "Language-Team: Portuguese (Brazil) \n" @@ -683,6 +683,16 @@ msgstr "ERRO: tipo de IC não suportado, correções bem-vindas!" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "ERRO: host de git \"%s\" não suportado, patches são bem-vindos!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -702,6 +712,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "A variável de ambiente {var} de {configname} não está definida!" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Erro ao obter o endereço do repositório" @@ -1289,6 +1303,18 @@ msgstr "O nome do pacote do OBB não corresponde a um APK suportado:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "A máquina está desconectada, pulando geração de espelhos de git até o `fdroid deploy'" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1500,6 +1526,11 @@ msgstr "Reescrevendo '{appid}'" msgid "Run on git repo that has uncommitted changes" msgstr "Executar no repositório do Git que tenha alterações não confirmadas" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Executar rewritemeta para corrigir a formatação" @@ -1738,6 +1769,11 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "A URL deve começar com https:// ou http://" @@ -1935,6 +1971,11 @@ msgstr "Usar a data do APK ao invés do horário atual para APKs recentemente ad msgid "Using \"{path}\" for configuring s3cmd." msgstr "Usando \"{path}\" para configurar s3cmd." +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "Usando \"{path}\" para configurar s3cmd." + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Usando a Assinatura APK v2" @@ -1966,6 +2007,11 @@ msgstr "Usando um dicionário em branco em vez do conteúdo de {path}!" msgid "Using existing keystore \"{path}\"" msgstr "Utilizando armazenamento de chave existente \"{path}\"" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "Usando s3cmd para sincronizar com: {url}" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2184,6 +2230,10 @@ msgstr "versão atual é mais recente: old vercode={old}, new vercode={new}" msgid "deleting: repo/{apkfilename}" msgstr "apagando: repo/{apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2511,6 +2561,11 @@ msgstr "o ruamel.yaml não está instalado, não é possível escrever os metada msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincroniza índices {path} para {url} e exclui" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd sincroniza índices {path} para {url} e exclui" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 2b050068..499c48a8 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-08-12 18:05+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" @@ -677,6 +677,16 @@ msgstr "ERRO: tipo de CI sem suporte, patches são bem-vindos!" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "ERRO: host de git \"%s\" não suportado, patches são bem-vindos!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -696,6 +706,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "A variável de ambiente {var} de {configname} não está definida!" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Erro ao obter o endereço do repo" @@ -1283,6 +1297,18 @@ msgstr "O packagename do OBB não corresponde a um APK suportado:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "A máquina está offline, a saltar a geração de espelhos de git até o `fdroid deploy'" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1494,6 +1520,11 @@ msgstr "Reescrevendo '{appid}'" msgid "Run on git repo that has uncommitted changes" msgstr "Executar no repo git que tem alterações não confirmadas" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Executar rewritemeta para corrigir a formatação" @@ -1732,6 +1763,11 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "A URL deve começar com https:// ou http://" @@ -1929,6 +1965,11 @@ msgstr "Use da data do APK em vez do tempo atual para APKs recém-adicionados" msgid "Using \"{path}\" for configuring s3cmd." msgstr "Usando \"{path}\" para configurar s3cmd." +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "Usando \"{path}\" para configurar s3cmd." + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "A usar a assinatura APK v2" @@ -1960,6 +2001,11 @@ msgstr "A utilizar um dicionário em branco em vez do conteúdo de {path}!" msgid "Using existing keystore \"{path}\"" msgstr "Utilizando armazenamento de chave existente \"{path}\"" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "Usando s3cmd para sincronizar com: {url}" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2178,6 +2224,10 @@ msgstr "a versão atual é mais nova: velho vercódigo={old}, novo vercódigo={n msgid "deleting: repo/{apkfilename}" msgstr "apagando: repo/{apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2505,6 +2555,11 @@ msgstr "o ruamel.yaml não está instalado, não é possível escrever metadados msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincroniza índices {path} para {url} e apaga" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd sincroniza índices {path} para {url} e apaga" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 0426cf59..446a39be 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-05-17 08:01+0000\n" "Last-Translator: Licaon Kter \n" "Language-Team: Romanian \n" @@ -679,6 +679,16 @@ msgstr "ERROR: tip CI neacceptat, patch-uri binevenite!" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "EROARE: gazdă git neacceptată „%s”, corecții binevenite!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -698,6 +708,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "Variabila de mediu {var} din {configname} nu este setată!" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Eroare la obținerea adresei repo" @@ -1285,6 +1299,18 @@ msgstr "OBB's packagename nu se potrivește cu un APK acceptat:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Mașină offline, sărind peste generarea oglinzii git până la `fdroid deploy`" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1496,6 +1522,11 @@ msgstr "Rescrierea '{appid}'" msgid "Run on git repo that has uncommitted changes" msgstr "Rulați pe un depozit git care are modificări necomandate" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Rulați rewritemeta pentru a repara formatarea" @@ -1735,6 +1766,11 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Pentru a utiliza awsbucket, awssecretkey și awsaccesskeyid trebuie să fie de asemenea setate în config.yml!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "Pentru a utiliza awsbucket, awssecretkey și awsaccesskeyid trebuie să fie de asemenea setate în config.yml!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL-ul trebuie să înceapă cu https:// sau http://" @@ -1932,6 +1968,11 @@ msgstr "Utilizați data din APK în loc de ora curentă pentru APK-urile nou ad msgid "Using \"{path}\" for configuring s3cmd." msgstr "Utilizarea \"{path}\" pentru configurarea s3cmd." +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "Utilizarea \"{path}\" pentru configurarea s3cmd." + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Folosind APK Signature v2" @@ -1963,6 +2004,11 @@ msgstr "Utilizarea dicționarului gol în loc de conținutul lui {path}!" msgid "Using existing keystore \"{path}\"" msgstr "Utilizarea keystore-ului existent \"{path}\"" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "Folosind s3cmd pentru a sincroniza cu: {url}" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2182,6 +2228,10 @@ msgstr "versiunea curentă este mai nouă: old vercode={old}, new vercode={new}" msgid "deleting: repo/{apkfilename}" msgstr "ștergere: repo/{apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2510,6 +2560,11 @@ msgstr "ruamel.yaml nu este instalat, nu poate scrie metadatele." msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincronizează indexurile {path} cu {url} și șterge" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd sincronizează indexurile {path} cu {url} și șterge" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 749576fb..11f345a0 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -19,7 +19,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-06-07 10:15+0000\n" "Last-Translator: neverender \n" "Language-Team: Russian \n" @@ -690,6 +690,16 @@ msgstr "ОШИБКА: этот тип CI не поддерживается, на msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "ОШИБКА: неподдерживаемый хост git «%s», патчи приветствуются!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -709,6 +719,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "Переменная среды {var} из {configname} не установлена!" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Ошибка при получении адреса репозитория" @@ -1296,6 +1310,18 @@ msgstr "Указанный в OBB файле packagename не соответст msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Автономная система, пропуск генерации git-зеркала до `fdroid deploy`" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1507,6 +1533,11 @@ msgstr "Перезапись '{appid}'" msgid "Run on git repo that has uncommitted changes" msgstr "Запустить для репозитория git с несохраненными изменениями" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Запустить rewritemeta для исправления ошибок форматирования" @@ -1746,6 +1777,11 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Необходимо определить переменные awsbucket, awssecretkey и awsaccesskeyid в config.yml!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "Необходимо определить переменные awsbucket, awssecretkey и awsaccesskeyid в config.yml!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL должна начинаться с https:// или http://" @@ -1943,6 +1979,11 @@ msgstr "Использовать время date из APK вместо теку msgid "Using \"{path}\" for configuring s3cmd." msgstr "Для конфигурации s3cmd используется \"{path}\"." +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "Для конфигурации s3cmd используется \"{path}\"." + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Используется схема подписи APK v2" @@ -1974,6 +2015,11 @@ msgstr "Использование пустого словаря вместо с msgid "Using existing keystore \"{path}\"" msgstr "Используются ключи из \"{path}\"" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "s3cmd синхронизация с: {url}" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2193,6 +2239,10 @@ msgstr "текущая версия новее: old vercode={old}, new vercode={ msgid "deleting: repo/{apkfilename}" msgstr "удаление: repo/{apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2521,6 +2571,11 @@ msgstr "ruamel.yaml не установлен, не получается зап msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd синхронизировать индексы из {path} в {url} и удалить их" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd синхронизировать индексы из {path} в {url} и удалить их" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index cf79cb9e..efee1b91 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-02-20 18:58+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" @@ -675,6 +675,16 @@ msgstr "GABIM: lloj CI i pambuluar, arnimet janë të mirëpritura!" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "GABIM: strehë git “%s” që nuk mbulohet, arnimet janë të mirëpritura!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -694,6 +704,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "S’është ujdisur ndryshore {var} nga {configname}!" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Gabim teksa merrej adresë depoje" @@ -1284,6 +1298,18 @@ msgstr "packagename i OBB-së nuk përputhet me ndonjë APK të mbuluar:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Makinë jo në linjë, po anashkalohet prodhim pasqyre git, deri sa `fdroid deploy`" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1497,6 +1523,11 @@ msgstr "Po rishkruhet '{appid}'" msgid "Run on git repo that has uncommitted changes" msgstr "Xhirojeni në depo git që ka ndryshime të padepozituara te dega vendore" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Që të ndreqet formatimi, xhironi rewritemeta" @@ -1739,6 +1770,11 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Për të përdorur awsbucket, te config.yml duhen ujdisur edhe awssecretkey dhe awsaccesskey!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "Për të përdorur awsbucket, te config.yml duhen ujdisur edhe awssecretkey dhe awsaccesskey!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL-ja duhet të fillojë me https:// ose http://" @@ -1938,6 +1974,11 @@ msgstr "Për APK-ra të shtuara rishtazi, përdor datë prej APK-je, në vend se msgid "Using \"{path}\" for configuring s3cmd." msgstr "Po përdoret “{path}” për formësim të s3cmd." +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "Po përdoret “{path}” për formësim të s3cmd." + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Po përdoret Nënshkrimi APK-je v2" @@ -1970,6 +2011,11 @@ msgstr "Po përdoret fjalor i zbrazët, në vend se lënda e {path}!" msgid "Using existing keystore \"{path}\"" msgstr "Po përdoret depo ekzistuese kyçesh “{path}”" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "Po përdoret s3cmd për njëkohësim me: {url}" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2189,6 +2235,10 @@ msgstr "versioni i tanishëm është më i ri: kod versioni të vjetër={old}, k msgid "deleting: repo/{apkfilename}" msgstr "po fshihet: repo/{apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2516,6 +2566,11 @@ msgstr "ruamel.yaml s’është i instaluar, s’mund të shkruhen tejtëdhëna. msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sync indexes {path} to {url} and delete" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd sync indexes {path} to {url} and delete" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index f40421dc..c45ba575 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-09-07 00:41+0000\n" "Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" @@ -677,6 +677,16 @@ msgstr "ГРЕШКА: неподржани тип CI, закрпе доброд msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "ГРЕШКА: неподржан git домаћин \"%s\", закрпе су добродошле!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -696,6 +706,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "Еколошка променљива {var} из {configname} није подешена!" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Грешка при добијању адресе репозиторијума" @@ -1283,6 +1297,18 @@ msgstr "Име пакета OBB не одговара подржаном APK-у: msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Оффлайн машина, прескочено генерисање git огледала до `fdroid deploy`" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1494,6 +1520,11 @@ msgstr "Преиспитивање '{appid}'" msgid "Run on git repo that has uncommitted changes" msgstr "Покрени на git репозиторијуму који има неконтролисане промене" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Покрените rewritemeta да исправите форматирање" @@ -1733,6 +1764,11 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Да бисте користили awsbucket, awssecretkey и awsaccesskeyid морају бити подешени у config.yml!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "Да бисте користили awsbucket, awssecretkey и awsaccesskeyid морају бити подешени у config.yml!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL мора почети са https:// или http://" @@ -1930,6 +1966,11 @@ msgstr "Користи датум из APK уместо тренутног вр msgid "Using \"{path}\" for configuring s3cmd." msgstr "Користим \"{path}\" за конфигурисање s3cmd." +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "Користим \"{path}\" за конфигурисање s3cmd." + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Користим APK Signature v2" @@ -1961,6 +2002,11 @@ msgstr "Коришћење празног речника уместо садрж msgid "Using existing keystore \"{path}\"" msgstr "Користим постојећи keystore \"{path}\"" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "Користим s3cmd за синхронизацију са: {url}" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2180,6 +2226,10 @@ msgstr "тренутна верзија је новија: стара верзи msgid "deleting: repo/{apkfilename}" msgstr "бришем: repo/{apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2508,6 +2558,11 @@ msgstr "ruamel.yaml није инсталиран, не могу да пишем msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd синхронизује индексе {path} са {url} и брише" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd синхронизује индексе {path} са {url} и брише" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index 2440b131..8713c384 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-09-08 11:09+0000\n" "Last-Translator: abelbiwott-dev \n" "Language-Team: Swahili \n" @@ -675,6 +675,16 @@ msgstr "HITILAFU: aina ya CI isiyoungwa mkono, marekebisho yanakaribishwa!" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "HITILAFU: mwenyeji wa git isiyoungwa mkono \"%s\", marekebisho yanakaribishwa!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -694,6 +704,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "Vigezo vya mazingira {var} kutoka {configname} haijawekwa!" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Kuna hitilafu wakati wa kupata anwani ya ghala" @@ -1281,6 +1295,18 @@ msgstr "Jina la kifurushi cha OBB hailingani na APK inayoungwa mkono:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Machini iliyo nje ya mtandao, inapuuza uundaji wa kioo cha git mpaka 'fdroid deploy'" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1492,6 +1518,11 @@ msgstr "Kuandika upya '{appid}'" msgid "Run on git repo that has uncommitted changes" msgstr "Endesha kwenye ghala la git ambalo lina mabadiliko yasiyohifadhiwa" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Tekeleza rewritemeta ili kurekebisha uumbizaji" @@ -1730,6 +1761,11 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Ili kutumia awsbucket, awssecretkey na awsaccesskeiid lazima pia iwekwe katika config.yml!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "Ili kutumia awsbucket, awssecretkey na awsaccesskeiid lazima pia iwekwe katika config.yml!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL lazima ianze na https:// or http://" @@ -1927,6 +1963,11 @@ msgstr "Tumia tarehe kutoka APK badala ya wakati uliopo kwa APK mpya zilizoongez msgid "Using \"{path}\" for configuring s3cmd." msgstr "Kutumia \"{path}\" kusanidi s3cmd." +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "Kutumia \"{path}\" kusanidi s3cmd." + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Kutumia Sahihi ya APK toleo la 2" @@ -1958,6 +1999,11 @@ msgstr "Kutumia kamusi tupu badala ya maudhui ya {path}!" msgid "Using existing keystore \"{path}\"" msgstr "Kutumia keystore iliyopo \"{path}\"" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "Kutumia s3cmd kusawazisha na: {url}" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2176,6 +2222,10 @@ msgstr "toleo la sasa ni jipya: old vercode={old}, new vercode={new}" msgid "deleting: repo/{apkfilename}" msgstr "kufuta: ghala/{apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2503,6 +2553,11 @@ msgstr "ruamel.yaml haijasimikwa, haiwezi kuandika metadata." msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd kusawazisha indexes {path} hadi {url} na kufuta" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd kusawazisha indexes {path} hadi {url} na kufuta" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index fb7dc91c..bb97dea9 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-05-15 04:32+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" @@ -676,6 +676,16 @@ msgstr "HATA: desteklenmeyen CI türü, yama gönderebilirsiniz!" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "HATA: desteklenmeyen git ana makinesi \"%s\", yama gönderebilirsiniz!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -695,6 +705,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "{configname} içinden {var} ortam değişkeni ayarlı değil!" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Depo adresi alınırken hata" @@ -1282,6 +1296,18 @@ msgstr "OBB'ın packagename değeri desteklenen APK ile eşleşmiyor:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Çevrim dışı makine, `fdroid deploy` komutuna kadar git yansı oluşturma atlanıyor" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1493,6 +1519,11 @@ msgstr "'{appid}' yeniden yazılıyor" msgid "Run on git repo that has uncommitted changes" msgstr "Değişiklikleri olmayan git repo üzerinde çalış" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Biçimlemeyi düzeltmek için rewritemeta çalıştır" @@ -1731,6 +1762,11 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Awsbucket kullanmak için, awssecretkey ve awsaccesskeyid de config.yml içinde ayarlanmalı!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "Awsbucket kullanmak için, awssecretkey ve awsaccesskeyid de config.yml içinde ayarlanmalı!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL https:// veya http:// ile başlamalı" @@ -1928,6 +1964,11 @@ msgstr "Yeni eklenen APKlar için o anki zaman yerine APK'daki tarihi kullan" msgid "Using \"{path}\" for configuring s3cmd." msgstr "s3cmd yapılandırması için \"{path}\" kullanılıyor." +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "s3cmd yapılandırması için \"{path}\" kullanılıyor." + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "APK İmza v2 kullanılıyor" @@ -1959,6 +2000,11 @@ msgstr "{path} içeriği yerine boş sözlük kullanılıyor!" msgid "Using existing keystore \"{path}\"" msgstr "Var olan anahtar deposu \"{path}\" kullanılıyor" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "{url} ile eşitleme için s3cmd kullanılıyor" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2177,6 +2223,10 @@ msgstr "şu anki sürüm daha yeni: eski sürüm kodu={old}, yeni sürüm kodu={ msgid "deleting: repo/{apkfilename}" msgstr "siliniyor: repo/{apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2504,6 +2554,11 @@ msgstr "ruamel.yaml kurulu değil, üst veriler yazılamıyor." msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sync {path} konumunu {url} adresine indeksler ve siler" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd sync {path} konumunu {url} adresine indeksler ve siler" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index f559a76e..3ed4a40a 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-09-04 13:39+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" @@ -684,6 +684,16 @@ msgstr "ПОМИЛКА: непідтримуваний вид CI, виправл msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "ПОМИЛКА: непідтримуваний git-хост «%s», виправлення вітаються!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -703,6 +713,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "Змінну середовища {var} від {configname} не налаштованоно!" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "Помилка отримання адреси репозиторію" @@ -1290,6 +1304,18 @@ msgstr "Назва пакунка OBB не відповідає підтриму msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Автономна машина, пропускання генерування дзеркал git до `fdroid deploy`" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1501,6 +1527,11 @@ msgstr "Перезапис '{appid}'" msgid "Run on git repo that has uncommitted changes" msgstr "Запустити для git-репозиторію з неподаними змінами" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "Запустити rewritemeta, щоб виправити форматування" @@ -1740,6 +1771,11 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "Для використання awsbucket, awssecretkey та awsaccesskeyid також слід налаштувати config.yml!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "Для використання awsbucket, awssecretkey та awsaccesskeyid також слід налаштувати config.yml!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "URL-адреса має починатися з https:// або http://" @@ -1937,6 +1973,11 @@ msgstr "Використовуйте дату з APK замість поточн msgid "Using \"{path}\" for configuring s3cmd." msgstr "Використання \"{path}\" для налаштування s3cmd." +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "Використання \"{path}\" для налаштування s3cmd." + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "Використання підпису APK v2" @@ -1968,6 +2009,11 @@ msgstr "Використання порожнього словника замі msgid "Using existing keystore \"{path}\"" msgstr "Застосування наявного сховища ключів \"{path}\"" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "Використовувати s3cmd для синхронізації з: {url}" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2187,6 +2233,10 @@ msgstr "поточна версія новіша: застаріла vercode={ol msgid "deleting: repo/{apkfilename}" msgstr "видалення: репозиторій/{apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2515,6 +2565,11 @@ msgstr "ruamel.yaml не встановлено, не вдається запи msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd синхронізувати індекси з {path} до {url} та видалити" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd синхронізувати індекси з {path} до {url} та видалити" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 99253bf7..b1858e51 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -36,7 +36,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-09-03 15:47+0000\n" "Last-Translator: linsui \n" "Language-Team: Chinese (Simplified Han script) \n" @@ -702,6 +702,16 @@ msgstr "错误:不支持的 CI 类型,欢迎提交补丁添加支持!" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "错误:不支持的 git 主机类型 \"%s\",欢迎提交补丁添加支持!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -721,6 +731,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "没有设置 {configname} 中的环境变量 {var}!" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "获取存储库地址时出错" @@ -1308,6 +1322,18 @@ msgstr "OBB 的软件包名称与受支持的 APK 不匹配:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "脱机计算机,跳过 git 镜像生成直到 `fdroid deploy`" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1519,6 +1545,11 @@ msgstr "重写 '{appid}'" msgid "Run on git repo that has uncommitted changes" msgstr "在具有未提交更改的 git 存储库上运行" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "运行“重写元数据”(rewritemeta)修复格式" @@ -1756,6 +1787,11 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "要使用 awsbucket,还必须在 config.yml 中设置 awssecretkey 和 awsaccesskeyid!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "要使用 awsbucket,还必须在 config.yml 中设置 awssecretkey 和 awsaccesskeyid!" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "网址必须以 https:// 或 http:// 开头" @@ -1953,6 +1989,11 @@ msgstr "对于新添加的 APK 文件,使用来自 APK 文件的时间,而 msgid "Using \"{path}\" for configuring s3cmd." msgstr "使用“{path}”配置 s3cmd。" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "使用“{path}”配置 s3cmd。" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "使用 APK 签名 v2" @@ -1984,6 +2025,11 @@ msgstr "使用空白字典而不是 {path} 的内容!" msgid "Using existing keystore \"{path}\"" msgstr "使用现有密钥库“{path}”" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "正使用 s3cmd 与 {url} 同步" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2201,6 +2247,10 @@ msgstr "当前版本较新:旧的 vercode={old},新的 vercode={new}" msgid "deleting: repo/{apkfilename}" msgstr "正在删除:repo/{apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2527,6 +2577,11 @@ msgstr "ruamel.yaml 未安装,无法写入元数据。" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd 同步索引 {path} 至 {url} 并删除" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd 同步索引 {path} 至 {url} 并删除" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 2c6e3bf8..12446cd7 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-05-29 05:09+0000\n" "Last-Translator: hugoalh \n" "Language-Team: Chinese (Traditional) \n" @@ -677,6 +677,16 @@ msgstr "出錯:未支援 CI 類型,歡迎補強!" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "錯誤:不支援的 git 主機「%s」,歡迎提交修補!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -696,6 +706,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "配置文件 {configname} 中的 環境變量 {var} 還沒有設置 !" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "在接取軟體庫的地址時出錯" @@ -1298,6 +1312,18 @@ msgstr "OBB 的套件包名稱與支援的 APK 並不相符:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "因為機器是離線的, 跳過 git mirror 的生成直到 `fdroid deploy`" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1513,6 +1539,11 @@ msgstr "重覆寫入 '{appid}'" msgid "Run on git repo that has uncommitted changes" msgstr "在有未遞交變更的 git 倉庫上執行" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "執行 rewritemeta 到固定格式" @@ -1751,6 +1782,11 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "要使用 awsbucket, awssecretkey 與 awsaccesskeyid 必須在 config.yml 進行設定!" +#: ../fdroidserver/deploy.py +#, fuzzy +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "要使用 awsbucket, awssecretkey 與 awsaccesskeyid 必須在 config.yml 進行設定!" + #: ../fdroidserver/lint.py #, fuzzy msgid "URL must start with https:// or http://" @@ -1953,6 +1989,11 @@ msgstr "使用來自 APK 的日期,而不是新增之 APK 目前的時間" msgid "Using \"{path}\" for configuring s3cmd." msgstr "使用 \"{path}\" 對 s3cmd 組態。" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "使用 \"{path}\" 對 s3cmd 組態。" + #: ../fdroidserver/common.py #, fuzzy msgid "Using APK Signature v2" @@ -1987,6 +2028,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "使用現有的金鑰庫 \"{path}\"" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "使用 s3cmd 來同步:{url}" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2216,6 +2262,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "刪除:repo/{apkfilename}" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2549,6 +2599,11 @@ msgstr "因為沒有設置 ruamel.yaml, 無法寫入 metadata 。" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd 同步索引 {path} 到 {url} 並刪除" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd 同步索引 {path} 到 {url} 並刪除" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" From fe1c6b5149f8b014e6105a54396bace9a806db63 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 10 Sep 2024 10:37:29 +0200 Subject: [PATCH 1651/2116] run tests/refresh-SUSS_DEFAULT.py --- fdroidserver/scanner.py | 1335 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 1314 insertions(+), 21 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 4a8065d5..62bf9ff2 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -1043,10 +1043,131 @@ if __name__ == "__main__": SUSS_DEFAULT = r'''{ "cache_duration": 86400, "signatures": { + "com.amazon.device.ads": { + "anti_features": [ + "Ads", + "NonFreeComp" + ], + "code_signatures": [ + "com/amazon/device/ads" + ], + "description": "an interface for views used to retrieve and display Amazon ads.", + "license": "NonFree" + }, + "com.amazon.device.associates": { + "anti_features": [ + "Ads", + "NonFreeComp" + ], + "code_signatures": [ + "com/amazon/device/associates" + ], + "description": "library for Amazon\u2019s affiliate marketing program.", + "license": "NonFree" + }, + "com.amazon.device.iap": { + "anti_features": [ + "NonFreeComp", + "NonFreeNet" + ], + "code_signatures": [ + "com/amazon/device/iap" + ], + "description": "allows an app to present, process, and fulfill purchases of digital content and subscriptions within your app.", + "license": "NonFree" + }, + "com.amazonaws": { + "code_signatures": [ + "com/amazonaws/AbortedException", + "com/amazonaws/AmazonClientException", + "com/amazonaws/AmazonServiceException$ErrorType", + "com/amazonaws/AmazonServiceException", + "com/amazonaws/AmazonWebServiceClient", + "com/amazonaws/AmazonWebServiceRequest", + "com/amazonaws/AmazonWebServiceResponse", + "com/amazonaws/async", + "com/amazonaws/auth", + "com/amazonaws/ClientConfiguration", + "com/amazonaws/cognito", + "com/amazonaws/DefaultRequest", + "com/amazonaws/event", + "com/amazonaws/handlers", + "com/amazonaws/http", + "com/amazonaws/HttpMethod", + "com/amazonaws/internal", + "com/amazonaws/logging", + "com/amazonaws/metrics", + "com/amazonaws/mobile", + "com/amazonaws/mobileconnectors", + "com/amazonaws/Protocol", + "com/amazonaws/regions", + "com/amazonaws/RequestClientOptions$Marker", + "com/amazonaws/RequestClientOptions", + "com/amazonaws/Request", + "com/amazonaws/ResponseMetadata", + "com/amazonaws/Response", + "com/amazonaws/retry", + "com/amazonaws/SDKGlobalConfiguration", + "com/amazonaws/ServiceNameFactory", + "com/amazonaws/services", + "com/amazonaws/transform", + "com/amazonaws/util" + ], + "gradle_signatures": [ + "com.amazonaws:amazon-kinesis-aggregator", + "com.amazonaws:amazon-kinesis-connectors", + "com.amazonaws:amazon-kinesis-deaggregator", + "com.amazonaws:aws-android-sdk-apigateway-core", + "com.amazonaws:aws-android-sdk-auth-core", + "com.amazonaws:aws-android-sdk-auth-facebook", + "com.amazonaws:aws-android-sdk-auth-google", + "com.amazonaws:aws-android-sdk-auth-ui", + "com.amazonaws:aws-android-sdk-auth-userpools", + "com.amazonaws:aws-android-sdk-cognito", + "com.amazonaws:aws-android-sdk-cognitoauth", + "com.amazonaws:aws-android-sdk-cognitoidentityprovider-asf", + "com.amazonaws:aws-android-sdk-comprehend", + "com.amazonaws:aws-android-sdk-core", + "com.amazonaws:aws-android-sdk-ddb", + "com.amazonaws:aws-android-sdk-ddb-document", + "com.amazonaws:aws-android-sdk-iot", + "com.amazonaws:aws-android-sdk-kinesis", + "com.amazonaws:aws-android-sdk-kinesisvideo", + "com.amazonaws:aws-android-sdk-kinesisvideo-archivedmedia", + "com.amazonaws:aws-android-sdk-kms", + "com.amazonaws:aws-android-sdk-lambda", + "com.amazonaws:aws-android-sdk-lex", + "com.amazonaws:aws-android-sdk-location", + "com.amazonaws:aws-android-sdk-logs", + "com.amazonaws:aws-android-sdk-mobileanalytics", + "com.amazonaws:aws-android-sdk-mobile-client", + "com.amazonaws:aws-android-sdk-pinpoint", + "com.amazonaws:aws-android-sdk-polly", + "com.amazonaws:aws-android-sdk-rekognition", + "com.amazonaws:aws-android-sdk-s3", + "com.amazonaws:aws-android-sdk-ses", + "com.amazonaws:aws-android-sdk-sns", + "com.amazonaws:aws-android-sdk-sqs", + "com.amazonaws:aws-android-sdk-textract", + "com.amazonaws:aws-android-sdk-transcribe", + "com.amazonaws:aws-android-sdk-translate", + "com.amazonaws:dynamodb-key-diagnostics-library", + "com.amazonaws:DynamoDBLocal", + "com.amazonaws:dynamodb-lock-client", + "com.amazonaws:ivs-broadcast", + "com.amazonaws:ivs-player", + "com.amazonaws:kinesis-storm-spout" + ], + "license": "NonFree", + "name": "AmazonAWS" + }, "com.android.billingclient": { "code_signatures": [ "com/android/billingclient" ], + "documentation": [ + "https://developer.android.com/google/play/billing/integrate" + ], "gradle_signatures": [ "com.android.billingclient", "com.google.androidbrowserhelper:billing", @@ -1054,72 +1175,736 @@ SUSS_DEFAULT = r'''{ "com.github.penn5:donations", "me.proton.core:payment-iap" ], + "license": "NonFree", + "name": "BillingClient" + }, + "com.android.installreferrer": { + "anti_features": [ + "NonFreeDep", + "NonFreeNet" + ], + "code_signatures": [ + "com/android/installreferrer" + ], + "documentation": [ + "https://developer.android.com/google/play/installreferrer/library" + ], + "gradle_signatures": [ + "com.android.installreferrer" + ], + "license": "NonFree", + "name": "Play Install Referrer Library" + }, + "com.anychart": { + "anti_features": [ + "NonFreeComp" + ], + "code_signatures": [ + "com/anychart" + ], + "description": "a data visualization library for easily creating interactive charts in Android apps.", + "license": "NonFree" + }, + "com.appboy": { + "anti_features": [ + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "com/appboy" + ], + "description": "Targets customers based on personal interests, location, past purchases, and more; profiles users, segments audiences, and utilizes analytics for targeted advertisements.", + "license": "NonFree" + }, + "com.appbrain": { + "anti_features": [ + "Ads", + "NonFreeComp" + ], + "code_signatures": [ + "com/appbrain" + ], + "description": "See Exodus Privacy.", + "license": "NonFree" + }, + "com.applause.android": { + "anti_features": [ + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "com/applause/android" + ], + "description": "crowd-sourced testing. See Crunchbase and Exodus Privacy.", + "license": "NonFree" + }, + "com.applovin": { + "anti_features": [ + "Ads" + ], + "code_signatures": [ + "com/applovin" + ], + "description": "a mobile advertising technology company that enables brands to create mobile marketing campaigns that are fueled by data. Primary targets games.", + "license": "NonFree" + }, + "com.appsflyer": { + "anti_features": [ + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "com/appsflyer" + ], + "description": "a mobile & attribution analytics platform.", + "license": "NonFree" + }, + "com.apptentive": { + "anti_features": [ + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "com/apptentive" + ], + "description": "See Exodus Privacy.", + "license": "NonFree" + }, + "com.apptimize": { + "anti_features": [ + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "com/apptimize" + ], + "description": "See Exodus Privacy and Crunchbase.", + "license": "NonFree" + }, + "com.askingpoint": { + "anti_features": [ + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "com/askingpoint" + ], + "description": "complete mobile user engagement solution (power local, In-application evaluations and audits, input, user support, mobile reviews and informing).", + "license": "NonFree" + }, + "com.baidu.mobstat": { + "code_signatures": [ + "com/baidu/mobstat" + ], + "documentation": [ + "https://mtj.baidu.com/web/sdk/index" + ], + "gradle_signatures": [ + "com.baidu.mobstat" + ], + "license": "NonFree", + "name": "\u767e\u5ea6\u79fb\u52a8\u7edf\u8ba1SDK" + }, + "com.batch": { + "anti_features": [ + "Ads", + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "com/batch" + ], + "description": "mobile engagement platform to execute CRM tactics over iOS, Android & mobile websites.", + "license": "NonFree" + }, + "com.bosch.mtprotocol": { + "anti_features": [ + "NonFreeComp" + ], + "code_signatures": [ + "com/bosch/mtprotocol" + ], + "description": "simplify and manage use of Bosch GLM and PLR laser rangefinders with Bluetooth connectivity.", + "license": "NonFree" + }, + "com.bugsee.library.Bugsee": { + "anti_features": [ + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "com/bugsee/library/Bugsee" + ], + "description": "see video, network and logs that led to bugs and crashes in live apps. No need to reproduce intermittent bugs. With Bugsee, all the crucial data is always there.", "license": "NonFree" }, "com.bugsense": { "code_signatures": [ "com/bugsense" ], + "documentation": [ + "https://github.com/bugsense/docs/blob/master/android.md" + ], "gradle_signatures": [ "com.bugsense" ], + "license": "NonFree", + "name": "BugSense" + }, + "com.chartboost.sdk": { + "anti_features": [ + "Ads", + "NonFreeComp" + ], + "code_signatures": [ + "com/chartboost/sdk" + ], + "description": "create customized interstitial and video ads, promote new games, and swap traffic with one another. For more details, see Wikipedia.", "license": "NonFree" }, "com.cloudrail": { "code_signature": [ "com/cloudrail" ], + "documentation": [ + "https://cloudrail.com/" + ], "gradle_signatures": [ "com.cloudrail" ], + "license": "NonFree", + "name": "CloudRail" + }, + "com.comscore.analytics": { + "anti_features": [ + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "com/comscore" + ], + "description": "See Wikipedia for details.", "license": "NonFree" }, "com.crashlytics.sdk.android": { "code_signatures": [ "com/crashlytics" ], + "documentation": [ + "https://firebase.google.com/docs/crashlytics" + ], "gradle_signatures": [ "crashlytics" ], - "license": "NonFree" + "license": "NonFree", + "name": "Firebase Crashlytics" }, "com.crittercism": { "code_signatures": [ "com/crittercism" ], + "documentation": [ + "https://github.com/crittercism/crittercism-unity-android" + ], "gradle_signatures": [ "com.crittercism" ], + "license": "NonFree", + "name": "Crittercism Plugin for Unity Crash Reporting" + }, + "com.criware": { + "anti_features": [ + "NonFreeComp", + "NonFreeAssets" + ], + "code_signatures": [ + "com/criware" + ], + "description": "audio and video solutions that can be integrated with popular game engines.", + "license": "NonFree" + }, + "com.deezer.sdk": { + "anti_features": [ + "NonFreeComp", + "NonFreeNet" + ], + "code_signatures": [ + "com/deezer/sdk" + ], + "description": "a closed-source API for the Deezer music streaming service.", + "license": "NonFree" + }, + "com.dynamicyield": { + "anti_features": [ + "Ads", + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "com/dynamicyield" + ], + "description": "targeted advertising. Tracks user via location (GPS, WiFi, location data). Collects PII, profiling. See Exodus Privacy for more details.", + "license": "NonFree" + }, + "com.dynatrace.android.app": { + "anti_features": [ + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "com/dynatrace/android/app" + ], + "description": "See Crunchbase and Exodus Privacy.", + "license": "NonFree" + }, + "com.ensighten": { + "anti_features": [ + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "com/ensighten" + ], + "description": "organizations can leverage first-party customer data and profiles to fuel omni-channel action and insight using their existing technology investments. See Crunchbase and Exodus Privacy.", + "license": "NonFree" + }, + "com.epicgames.mobile.eossdk": { + "anti_features": [ + "NonFreeComp", + "NonFreeNet" + ], + "code_signatures": [ + "com/epicgames/mobile/eossdk" + ], + "description": "integrate games with Epic Account Services and Epic Games Store", "license": "NonFree" }, "com.facebook.android": { "code_signatures": [ - "com/facebook" + "com/facebook/AccessToken", + "com/facebook/AccessTokenCache", + "com/facebook/AccessTokenManager", + "com/facebook/AccessTokenSource", + "com/facebook/AccessTokenTracker", + "com/facebook/all/All", + "com/facebook/appevents/aam/MetadataIndexer", + "com/facebook/appevents/aam/MetadataMatcher", + "com/facebook/appevents/aam/MetadataRule", + "com/facebook/appevents/aam/MetadataViewObserver", + "com/facebook/appevents/AccessTokenAppIdPair", + "com/facebook/appevents/AnalyticsUserIDStore", + "com/facebook/appevents/AppEvent", + "com/facebook/appevents/AppEventCollection", + "com/facebook/appevents/AppEventDiskStore", + "com/facebook/appevents/AppEventQueue", + "com/facebook/appevents/AppEventsConstants", + "com/facebook/appevents/AppEventsLogger", + "com/facebook/appevents/AppEventsLoggerImpl", + "com/facebook/appevents/AppEventsManager", + "com/facebook/appevents/AppEventStore", + "com/facebook/appevents/cloudbridge/AppEventsCAPIManager", + "com/facebook/appevents/cloudbridge/AppEventsConversionsAPITransformer", + "com/facebook/appevents/cloudbridge/AppEventsConversionsAPITransformerWebRequests", + "com/facebook/appevents/codeless/CodelessLoggingEventListener", + "com/facebook/appevents/codeless/CodelessManager", + "com/facebook/appevents/codeless/CodelessMatcher", + "com/facebook/appevents/codeless/internal/Constants", + "com/facebook/appevents/codeless/internal/EventBinding", + "com/facebook/appevents/codeless/internal/ParameterComponent", + "com/facebook/appevents/codeless/internal/PathComponent", + "com/facebook/appevents/codeless/internal/SensitiveUserDataUtils", + "com/facebook/appevents/codeless/internal/UnityReflection", + "com/facebook/appevents/codeless/internal/ViewHierarchy", + "com/facebook/appevents/codeless/RCTCodelessLoggingEventListener", + "com/facebook/appevents/codeless/ViewIndexer", + "com/facebook/appevents/codeless/ViewIndexingTrigger", + "com/facebook/appevents/eventdeactivation/EventDeactivationManager", + "com/facebook/appevents/FacebookSDKJSInterface", + "com/facebook/appevents/FlushReason", + "com/facebook/appevents/FlushResult", + "com/facebook/appevents/FlushStatistics", + "com/facebook/appevents/iap/InAppPurchaseActivityLifecycleTracker", + "com/facebook/appevents/iap/InAppPurchaseAutoLogger", + "com/facebook/appevents/iap/InAppPurchaseBillingClientWrapper", + "com/facebook/appevents/iap/InAppPurchaseEventManager", + "com/facebook/appevents/iap/InAppPurchaseLoggerManager", + "com/facebook/appevents/iap/InAppPurchaseManager", + "com/facebook/appevents/iap/InAppPurchaseSkuDetailsWrapper", + "com/facebook/appevents/iap/InAppPurchaseUtils", + "com/facebook/appevents/integrity/BlocklistEventsManager", + "com/facebook/appevents/integrity/IntegrityManager", + "com/facebook/appevents/integrity/MACARuleMatchingManager", + "com/facebook/appevents/integrity/ProtectedModeManager", + "com/facebook/appevents/integrity/RedactedEventsManager", + "com/facebook/appevents/internal/ActivityLifecycleTracker", + "com/facebook/appevents/InternalAppEventsLogger", + "com/facebook/appevents/internal/AppEventsLoggerUtility", + "com/facebook/appevents/internal/AppEventUtility", + "com/facebook/appevents/internal/AutomaticAnalyticsLogger", + "com/facebook/appevents/internal/Constants", + "com/facebook/appevents/internal/FileDownloadTask", + "com/facebook/appevents/internal/HashUtils", + "com/facebook/appevents/internal/SessionInfo", + "com/facebook/appevents/internal/SessionLogger", + "com/facebook/appevents/internal/SourceApplicationInfo", + "com/facebook/appevents/internal/ViewHierarchyConstants", + "com/facebook/appevents/ml/Model", + "com/facebook/appevents/ml/ModelManager", + "com/facebook/appevents/ml/MTensor", + "com/facebook/appevents/ml/Operator", + "com/facebook/appevents/ml/Utils", + "com/facebook/appevents/ondeviceprocessing/OnDeviceProcessingManager", + "com/facebook/appevents/ondeviceprocessing/RemoteServiceParametersHelper", + "com/facebook/appevents/ondeviceprocessing/RemoteServiceWrapper", + "com/facebook/appevents/PersistedEvents", + "com/facebook/appevents/restrictivedatafilter/RestrictiveDataManager", + "com/facebook/appevents/SessionEventsState", + "com/facebook/appevents/suggestedevents/FeatureExtractor", + "com/facebook/appevents/suggestedevents/PredictionHistoryManager", + "com/facebook/appevents/suggestedevents/SuggestedEventsManager", + "com/facebook/appevents/suggestedevents/SuggestedEventViewHierarchy", + "com/facebook/appevents/suggestedevents/ViewObserver", + "com/facebook/appevents/suggestedevents/ViewOnClickListener", + "com/facebook/appevents/UserDataStore", + "com/facebook/applinks/AppLinkData", + "com/facebook/applinks/AppLinks", + "com/facebook/applinks/FacebookAppLinkResolver", + "com/facebook/AuthenticationToken", + "com/facebook/AuthenticationTokenCache", + "com/facebook/AuthenticationTokenClaims", + "com/facebook/AuthenticationTokenHeader", + "com/facebook/AuthenticationTokenManager", + "com/facebook/AuthenticationTokenTracker", + "com/facebook/bolts/AggregateException", + "com/facebook/bolts/AndroidExecutors", + "com/facebook/bolts/AppLink", + "com/facebook/bolts/AppLinkResolver", + "com/facebook/bolts/AppLinks", + "com/facebook/bolts/BoltsExecutors", + "com/facebook/bolts/CancellationToken", + "com/facebook/bolts/CancellationTokenRegistration", + "com/facebook/bolts/CancellationTokenSource", + "com/facebook/bolts/Continuation", + "com/facebook/bolts/ExecutorException", + "com/facebook/bolts/Task", + "com/facebook/bolts/TaskCompletionSource", + "com/facebook/bolts/UnobservedErrorNotifier", + "com/facebook/bolts/UnobservedTaskException", + "com/facebook/CallbackManager", + "com/facebook/common/Common", + "com/facebook/core/Core", + "com/facebook/CurrentAccessTokenExpirationBroadcastReceiver", + "com/facebook/CustomTabActivity", + "com/facebook/CustomTabMainActivity", + "com/facebook/devicerequests/internal/DeviceRequestsHelper", + "com/facebook/FacebookActivity", + "com/facebook/FacebookAuthorizationException", + "com/facebook/FacebookBroadcastReceiver", + "com/facebook/FacebookButtonBase", + "com/facebook/FacebookCallback", + "com/facebook/FacebookContentProvider", + "com/facebook/FacebookDialog", + "com/facebook/FacebookDialogException", + "com/facebook/FacebookException", + "com/facebook/FacebookGraphResponseException", + "com/facebook/FacebookOperationCanceledException", + "com/facebook/FacebookRequestError", + "com/facebook/FacebookSdk", + "com/facebook/FacebookSdkNotInitializedException", + "com/facebook/FacebookSdkVersion", + "com/facebook/FacebookServiceException", + "com/facebook/gamingservices/cloudgaming/AppToUserNotificationSender", + "com/facebook/gamingservices/cloudgaming/CloudGameLoginHandler", + "com/facebook/gamingservices/cloudgaming/DaemonReceiver", + "com/facebook/gamingservices/cloudgaming/DaemonRequest", + "com/facebook/gamingservices/cloudgaming/GameFeaturesLibrary", + "com/facebook/gamingservices/cloudgaming/InAppAdLibrary", + "com/facebook/gamingservices/cloudgaming/InAppPurchaseLibrary", + "com/facebook/gamingservices/cloudgaming/internal/SDKAnalyticsEvents", + "com/facebook/gamingservices/cloudgaming/internal/SDKConstants", + "com/facebook/gamingservices/cloudgaming/internal/SDKLogger", + "com/facebook/gamingservices/cloudgaming/internal/SDKMessageEnum", + "com/facebook/gamingservices/cloudgaming/internal/SDKShareIntentEnum", + "com/facebook/gamingservices/cloudgaming/PlayableAdsLibrary", + "com/facebook/gamingservices/ContextChooseDialog", + "com/facebook/gamingservices/ContextCreateDialog", + "com/facebook/gamingservices/ContextSwitchDialog", + "com/facebook/gamingservices/CustomUpdate", + "com/facebook/gamingservices/FriendFinderDialog", + "com/facebook/gamingservices/GameRequestDialog", + "com/facebook/gamingservices/GamingContext", + "com/facebook/gamingservices/GamingGroupIntegration", + "com/facebook/gamingservices/GamingImageUploader", + "com/facebook/gamingservices/GamingPayload", + "com/facebook/gamingservices/GamingServices", + "com/facebook/gamingservices/GamingVideoUploader", + "com/facebook/gamingservices/internal/DateFormatter", + "com/facebook/gamingservices/internal/GamingMediaUploader", + "com/facebook/gamingservices/internal/TournamentJoinDialogURIBuilder", + "com/facebook/gamingservices/internal/TournamentScoreType", + "com/facebook/gamingservices/internal/TournamentShareDialogURIBuilder", + "com/facebook/gamingservices/internal/TournamentSortOrder", + "com/facebook/gamingservices/model/ContextChooseContent", + "com/facebook/gamingservices/model/ContextCreateContent", + "com/facebook/gamingservices/model/ContextSwitchContent", + "com/facebook/gamingservices/model/CustomUpdateContent", + "com/facebook/gamingservices/OpenGamingMediaDialog", + "com/facebook/gamingservices/Tournament", + "com/facebook/gamingservices/TournamentConfig", + "com/facebook/gamingservices/TournamentFetcher", + "com/facebook/gamingservices/TournamentJoinDialog", + "com/facebook/gamingservices/TournamentShareDialog", + "com/facebook/gamingservices/TournamentUpdater", + "com/facebook/GraphRequest", + "com/facebook/GraphRequestAsyncTask", + "com/facebook/GraphRequestBatch", + "com/facebook/GraphResponse", + "com/facebook/HttpMethod", + "com/facebook/internal/AnalyticsEvents", + "com/facebook/internal/AppCall", + "com/facebook/internal/AttributionIdentifiers", + "com/facebook/internal/BoltsMeasurementEventListener", + "com/facebook/internal/BundleJSONConverter", + "com/facebook/internal/CallbackManagerImpl", + "com/facebook/internal/CollectionMapper", + "com/facebook/internal/CustomTab", + "com/facebook/internal/CustomTabUtils", + "com/facebook/internal/DialogFeature", + "com/facebook/internal/DialogPresenter", + "com/facebook/internal/FacebookDialogBase", + "com/facebook/internal/FacebookDialogFragment", + "com/facebook/internal/FacebookGamingAction", + "com/facebook/internal/FacebookInitProvider", + "com/facebook/internal/FacebookRequestErrorClassification", + "com/facebook/internal/FacebookSignatureValidator", + "com/facebook/internal/FacebookWebFallbackDialog", + "com/facebook/internal/FeatureManager", + "com/facebook/internal/FetchedAppGateKeepersManager", + "com/facebook/internal/FetchedAppSettings", + "com/facebook/internal/FetchedAppSettingsManager", + "com/facebook/internal/FileLruCache", + "com/facebook/internal/FragmentWrapper", + "com/facebook/internal/gatekeeper/GateKeeper", + "com/facebook/internal/gatekeeper/GateKeeperRuntimeCache", + "com/facebook/internal/ImageDownloader", + "com/facebook/internal/ImageRequest", + "com/facebook/internal/ImageResponse", + "com/facebook/internal/ImageResponseCache", + "com/facebook/internal/InstagramCustomTab", + "com/facebook/internal/InstallReferrerUtil", + "com/facebook/internal/instrument/anrreport/ANRDetector", + "com/facebook/internal/instrument/anrreport/ANRHandler", + "com/facebook/internal/instrument/crashreport/CrashHandler", + "com/facebook/internal/instrument/crashshield/AutoHandleExceptions", + "com/facebook/internal/instrument/crashshield/CrashShieldHandler", + "com/facebook/internal/instrument/crashshield/NoAutoExceptionHandling", + "com/facebook/internal/instrument/errorreport/ErrorReportData", + "com/facebook/internal/instrument/errorreport/ErrorReportHandler", + "com/facebook/internal/instrument/ExceptionAnalyzer", + "com/facebook/internal/instrument/InstrumentData", + "com/facebook/internal/instrument/InstrumentManager", + "com/facebook/internal/instrument/InstrumentUtility", + "com/facebook/internal/instrument/threadcheck/ThreadCheckHandler", + "com/facebook/internal/InternalSettings", + "com/facebook/internal/LockOnGetVariable", + "com/facebook/internal/Logger", + "com/facebook/internal/logging/dumpsys/EndToEndDumper", + "com/facebook/internal/Mutable", + "com/facebook/internal/NativeAppCallAttachmentStore", + "com/facebook/internal/NativeProtocol", + "com/facebook/internal/PlatformServiceClient", + "com/facebook/internal/ProfileInformationCache", + "com/facebook/internal/qualityvalidation/Excuse", + "com/facebook/internal/qualityvalidation/ExcusesForDesignViolations", + "com/facebook/internal/security/CertificateUtil", + "com/facebook/internal/security/OidcSecurityUtil", + "com/facebook/internal/ServerProtocol", + "com/facebook/internal/SmartLoginOption", + "com/facebook/internal/UrlRedirectCache", + "com/facebook/internal/Utility", + "com/facebook/internal/Validate", + "com/facebook/internal/WebDialog", + "com/facebook/internal/WorkQueue", + "com/facebook/LegacyTokenHelper", + "com/facebook/LoggingBehavior", + "com/facebook/login/CodeChallengeMethod", + "com/facebook/login/CustomTabLoginMethodHandler", + "com/facebook/login/CustomTabPrefetchHelper", + "com/facebook/login/DefaultAudience", + "com/facebook/login/DeviceAuthDialog", + "com/facebook/login/DeviceAuthMethodHandler", + "com/facebook/login/DeviceLoginManager", + "com/facebook/login/GetTokenClient", + "com/facebook/login/GetTokenLoginMethodHandler", + "com/facebook/login/InstagramAppLoginMethodHandler", + "com/facebook/login/KatanaProxyLoginMethodHandler", + "com/facebook/login/Login", + "com/facebook/login/LoginBehavior", + "com/facebook/login/LoginClient", + "com/facebook/login/LoginConfiguration", + "com/facebook/login/LoginFragment", + "com/facebook/login/LoginLogger", + "com/facebook/login/LoginManager", + "com/facebook/login/LoginMethodHandler", + "com/facebook/login/LoginResult", + "com/facebook/login/LoginStatusClient", + "com/facebook/login/LoginTargetApp", + "com/facebook/login/NativeAppLoginMethodHandler", + "com/facebook/login/NonceUtil", + "com/facebook/login/PKCEUtil", + "com/facebook/login/StartActivityDelegate", + "com/facebook/LoginStatusCallback", + "com/facebook/login/WebLoginMethodHandler", + "com/facebook/login/WebViewLoginMethodHandler", + "com/facebook/login/widget/DeviceLoginButton", + "com/facebook/login/widget/LoginButton", + "com/facebook/login/widget/ProfilePictureView", + "com/facebook/login/widget/ToolTipPopup", + "com/facebook/messenger/Messenger", + "com/facebook/messenger/MessengerThreadParams", + "com/facebook/messenger/MessengerUtils", + "com/facebook/messenger/ShareToMessengerParams", + "com/facebook/messenger/ShareToMessengerParamsBuilder", + "com/facebook/Profile", + "com/facebook/ProfileCache", + "com/facebook/ProfileManager", + "com/facebook/ProfileTracker", + "com/facebook/ProgressNoopOutputStream", + "com/facebook/ProgressOutputStream", + "com/facebook/RequestOutputStream", + "com/facebook/RequestProgress", + "com/facebook/share/internal/CameraEffectFeature", + "com/facebook/share/internal/CameraEffectJSONUtility", + "com/facebook/share/internal/GameRequestValidation", + "com/facebook/share/internal/LegacyNativeDialogParameters", + "com/facebook/share/internal/MessageDialogFeature", + "com/facebook/share/internal/NativeDialogParameters", + "com/facebook/share/internal/ResultProcessor", + "com/facebook/share/internal/ShareConstants", + "com/facebook/share/internal/ShareContentValidation", + "com/facebook/share/internal/ShareDialogFeature", + "com/facebook/share/internal/ShareFeedContent", + "com/facebook/share/internal/ShareInternalUtility", + "com/facebook/share/internal/ShareStoryFeature", + "com/facebook/share/internal/VideoUploader", + "com/facebook/share/internal/WebDialogParameters", + "com/facebook/share/model/AppGroupCreationContent", + "com/facebook/share/model/CameraEffectArguments", + "com/facebook/share/model/CameraEffectTextures", + "com/facebook/share/model/GameRequestContent", + "com/facebook/share/model/ShareCameraEffectContent", + "com/facebook/share/model/ShareContent", + "com/facebook/share/model/ShareHashtag", + "com/facebook/share/model/ShareLinkContent", + "com/facebook/share/model/ShareMedia", + "com/facebook/share/model/ShareMediaContent", + "com/facebook/share/model/ShareMessengerActionButton", + "com/facebook/share/model/ShareMessengerURLActionButton", + "com/facebook/share/model/ShareModel", + "com/facebook/share/model/ShareModelBuilder", + "com/facebook/share/model/SharePhoto", + "com/facebook/share/model/SharePhotoContent", + "com/facebook/share/model/ShareStoryContent", + "com/facebook/share/model/ShareVideo", + "com/facebook/share/model/ShareVideoContent", + "com/facebook/share/Share", + "com/facebook/share/ShareApi", + "com/facebook/share/ShareBuilder", + "com/facebook/share/Sharer", + "com/facebook/share/widget/GameRequestDialog", + "com/facebook/share/widget/MessageDialog", + "com/facebook/share/widget/SendButton", + "com/facebook/share/widget/ShareButton", + "com/facebook/share/widget/ShareButtonBase", + "com/facebook/share/widget/ShareDialog", + "com/facebook/UserSettingsManager", + "com/facebook/WebDialog" + ], + "documentation": [ + "https://developers.facebook.com/docs/android" ], "gradle_signatures": [ "com.facebook.android" ], - "license": "NonFree" + "license": "NonFree", + "name": "Facebook Android SDK" }, "com.flurry.android": { "code_signature": [ "com/flurry" ], + "documentation": [ + "https://www.flurry.com/" + ], "gradle_signatures": [ "com.flurry.android" ], + "license": "NonFree", + "name": "Flurry Android SDK" + }, + "com.garmin.android.connectiq": { + "anti_features": [ + "NonFreeComp" + ], + "code_signatures": [ + "com/garmin/android/apps/connectmobile/connectiq" + ], + "description": "SDK to build unique wearable experiences leveraging Garmin device sensors and features.", "license": "NonFree" }, + "com.garmin.connectiq": { + "code_signatures": [ + "com/garmin/android/connectiq" + ], + "documentation": [ + "https://developer.garmin.com/connect-iq/core-topics/mobile-sdk-for-android/" + ], + "gradle_signatures": [ + "com.garmin.connectiq:ciq-companion-app-sdk" + ], + "license": "NonFree", + "name": "Connect IQ Mobile SDK for Android" + }, + "com.garmin.fit": { + "anti_features": [ + "NonFreeComp" + ], + "code_signatures": [ + "com/garmin/fit" + ], + "description": "SDK to access the Garmin Fit.", + "license": "NonFree" + }, + "com.geetest": { + "code_signatures": [ + "com/geetest" + ], + "documentation": [ + "https://docs.geetest.com/" + ], + "gradle_signatures": [ + "com.geetest" + ], + "license": "NonFree", + "name": "GeeTest" + }, "com.github.junrar": { "code_signatures": [ "com/github/junrar" ], + "documentation": [ + "https://github.com/junrar/junrar" + ], "gradle_signatures": [ "com.github.junrar:junrar" ], - "license": "NonFree" + "license": "NonFree", + "name": "Junrar" }, "com.github.omicronapps.7-Zip-JBinding-4Android": { + "documentation": [ + "https://github.com/omicronapps/7-Zip-JBinding-4Android" + ], "gradle_signatures": [ "com.github.omicronapps:7-Zip-JBinding-4Android" ], @@ -1130,20 +1915,51 @@ SUSS_DEFAULT = r'''{ "code_signatures": [ "com/google/ads" ], + "documentation": [ + "https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side" + ], "gradle_signatures": [ "com.google.ads", "com.google.android.exoplayer:extension-ima", "androidx.media3:media3-exoplayer-ima" ], + "license": "NonFree", + "name": "IMA SDK for Android" + }, + "com.google.android.apps.auto.sdk": { + "anti_features": [ + "NonFreeComp" + ], + "code_signatures": [ + "com/google/android/apps/auto/sdk" + ], + "description": "Framework to develop apps for Android Auto", + "license": "NonFree" + }, + "com.google.android.gcm": { + "anti_features": [ + "NonFreeComp", + "NonFreeNet" + ], + "code_signatures": [ + "com/google/android/gcm" + ], + "description": "Google Cloud Messaging is a mobile notification service developed by Google that enables third-party application developers to send notification data or information from developer-run servers to app.", "license": "NonFree" }, "com.google.android.gms": { "code_signatures": [ "com/google/android/gms" ], + "documentation": [ + "https://www.android.com/gms/" + ], "gradle_signatures": [ - "com.google.android.gms", + "com.google.android.gms(?!.oss-licenses-plugin)", + "com.google.android.ump", "androidx.core:core-google-shortcuts", + "androidx.credentials:credentials", + "androidx.credentials:credentials-play-services-auth", "androidx.media3:media3-cast", "androidx.media3:media3-datasource-cronet", "androidx.work:work-gcm", @@ -1154,8 +1970,21 @@ SUSS_DEFAULT = r'''{ "com.pierfrancescosoffritti.androidyoutubeplayer:chromecast-sender", "com.yayandroid:locationmanager", "play-services", - "xyz.belvi.mobilevision:barcodescanner" + "xyz.belvi.mobilevision:barcodescanner", + "com.google.api-client:google-api-client-android" ], + "license": "NonFree", + "name": "Google Mobile Services" + }, + "com.google.android.gms.analytics": { + "anti_features": [ + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "com/google/android/apps/analytics" + ], + "description": "a web analytics service offered by Google that tracks and reports. 'NoAnalytics' srclib will provide stubs for these classes.", "license": "NonFree" }, "com.google.android.libraries": { @@ -1163,8 +1992,22 @@ SUSS_DEFAULT = r'''{ "com/google/android/libraries" ], "gradle_signatures": [ - "com.google.android.libraries" + "com.google.android.libraries(?!.mapsplatform.secrets-gradle-plugin)" ], + "gradle_signatures_negative_examples": [ + "classpath \"com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.1\"" + ], + "license": "NonFree", + "name": "Google Android Libraries" + }, + "com.google.android.mediahome.video": { + "anti_features": [ + "NonFreeComp" + ], + "code_signatures": [ + "com/google/android/mediahome/video" + ], + "description": "integrate video content with Home channels for mobile apps.", "license": "NonFree" }, "com.google.android.play": { @@ -1185,29 +2028,140 @@ SUSS_DEFAULT = r'''{ "com.google.android.play:feature-delivery", "com.google.android.play:review", "androidx.navigation:navigation-dynamic-features", - "com.github.SanojPunchihewa:InAppUpdater" + "com.github.SanojPunchihewa:InAppUpdater", + "com.suddenh4x.ratingdialog:awesome-app-rating" ], "license": "NonFree", "name": "Google Play Core" }, + "com.google.android.play.appupdate": { + "anti_features": [ + "NonFreeComp" + ], + "code_signatures": [ + "com/google/android/play/appupdate" + ], + "description": "manages operations that allow an app to initiate its own updates.", + "license": "NonFree" + }, + "com.google.android.play.integrity": { + "anti_features": [ + "NonFreeComp", + "NonFreeNet" + ], + "code_signatures": [ + "com/google/android/play/integrity" + ], + "description": "helps you check that interactions and server requests are coming from your genuine app binary running on a genuine Android device.", + "license": "NonFree" + }, + "com.google.android.play.review": { + "anti_features": [ + "NonFreeComp" + ], + "code_signatures": [ + "com/google/android/play/review" + ], + "description": "lets you prompt users to submit Play Store ratings and reviews without the inconvenience of leaving your app or game.", + "license": "NonFree" + }, + "com.google.android.vending": { + "anti_features": [ + "NonFreeComp" + ], + "code_signatures": [ + "com/google/android/vending/(?!licensing|expansion)" + ], + "description": "the Google Play Store app and its libaries, parts are FOSS and get vendored in libs as they are", + "documentation": [ + "https://github.com/google/play-licensing/tree/master/lvl_library/src/main", + "https://github.com/googlearchive/play-apk-expansion/tree/master/zip_file/src/com/google/android/vending/expansion/zipfile", + "https://github.com/googlearchive/play-apk-expansion/tree/master/apkx_library/src/com/google/android/vending/expansion/downloader" + ], + "license": "NonFree" + }, + "com.google.android.wearable": { + "code_signatures": [ + "com/google/android/wearable/(?!compat/WearableActivityController)" + ], + "description": "an API for the Android Wear platform, note that androidx.wear:wear has a stub https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-master-release/wear/wear/src/androidTest/java/com/google/android/wearable/compat/WearableActivityController.java#26", + "gradle_signatures": [ + "com.google.android.support:wearable", + "com.google.android.wearable:wearable" + ], + "license": "NonFree" + }, + "com.google.android.youtube.player": { + "anti_features": [ + "NonFreeComp", + "NonFreeNet" + ], + "code_signatures": [ + "com/google/android/youtube/player" + ], + "description": "enables you to easily play YouTube videos and display thumbnails of YouTube videos in your Android application.", + "license": "NonFree" + }, "com.google.mlkit": { "code_signatures": [ "com/google/mlkit" ], + "documentation": [ + "https://developers.google.com/ml-kit" + ], "gradle_signatures": [ "com.google.mlkit" ], + "license": "NonFree", + "name": "ML Kit" + }, + "com.google.vr": { + "anti_features": [ + "NonFreeComp" + ], + "code_signatures": [ + "com/google/vr" + ], + "description": "enables Daydream and Cardboard app development on Android.", + "license": "NonFree" + }, + "com.heapanalytics": { + "anti_features": [ + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "com/heapanalytics" + ], + "description": "automatically captures every web, mobile, and cloud interaction: clicks, submits, transactions, emails, and more. Retroactively analyze your data without writing code.", "license": "NonFree" }, "com.heyzap": { "code_signatures": [ "com/heyzap" ], + "documentation": [ + "https://www.digitalturbine.com/" + ], + "license": "NonFree", + "name": "Heyzap" + }, + "com.huawei.hms": { + "anti_features": [ + "NonFreeComp" + ], + "code_signatures": [ + "com/huawei/hms" + ], + "description": "Huawei's pendant to GMS (Google Mobile Services)", "license": "NonFree" }, "com.hypertrack": { "code_signatures": [ - "com/hypertrack/(?!:hyperlog)" + "com/hypertrack/(?!hyperlog)" + ], + "documentation": [ + "https://github.com/hypertrack/sdk-android" ], "gradle_signatures": [ "com.hypertrack(?!:hyperlog)" @@ -1215,10 +2169,47 @@ SUSS_DEFAULT = r'''{ "gradle_signatures_negative_examples": [ "com.hypertrack:hyperlog" ], + "license": "NonFree", + "name": "HyperTrack SDK for Android" + }, + "com.instabug": { + "anti_features": [ + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "com/instabug" + ], + "description": "In-App Feedback and Bug Reporting for Mobile Apps.", + "license": "NonFree" + }, + "com.kiddoware.kidsplace.sdk": { + "anti_features": [ + "NonFreeComp" + ], + "code_signatures": [ + "com/kiddoware/kidsplace/sdk" + ], + "description": "parental control", + "license": "NonFree" + }, + "com.kochava.android.tracker": { + "anti_features": [ + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "com/kochava/android/tracker" + ], + "description": "provides holistic, unbiased measurement for precise, real-time visualization of app performance through the funnel. See Crunchbase and Exodus Privacy.", "license": "NonFree" }, "com.mapbox": { "MaintainerNotes": "It seems that all libs in https://github.com/mapbox/mapbox-java is fully FOSS\nsince 3.0.0.\n", + "documentation": [ + "https://docs.mapbox.com/android/java/overview/", + "https://github.com/mapbox/mapbox-java" + ], "gradle_signatures": [ "com\\.mapbox(?!\\.mapboxsdk:mapbox-sdk-(services|geojson|turf):([3-5]))" ], @@ -1237,43 +2228,248 @@ SUSS_DEFAULT = r'''{ "com.mapbox.mapboxsdk:mapbox-android-plugin-scalebar-v8:0.2.0", "com.mapbox.mapboxsdk:mapbox-android-sdk:7.3.0" ], + "license": "NonFree", + "name": "Mapbox Java SDK" + }, + "com.microblink": { + "anti_features": [ + "NonFreeComp", + "NonFreeNet", + "Tracking" + ], + "code_signatures": [ + "com/microblink" + ], + "description": "verify users at scale and automate your document-based workflow with computer vision tech built for a remote world.", + "license": "NonFree" + }, + "com.microsoft.band": { + "anti_features": [ + "NonFreeComp" + ], + "code_signatures": [ + "com/microsoft/band" + ], + "description": "library to access the Microsoft Band smartwatch.", + "license": "NonFree" + }, + "com.mopub.mobileads": { + "anti_features": [ + "Ads", + "NonFreeComp" + ], + "code_signatures": [ + "com/mopub/mobileads" + ], + "description": "ad framework run by Twitter until 1/2022, then sold to AppLovin.", + "license": "NonFree" + }, + "com.newrelic.agent": { + "anti_features": [ + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "com/newrelic/agent" + ], + "description": "delivering full-stack visibility and analytics to enterprises around the world. See Crunchbase and Exodus Privacy.", "license": "NonFree" }, "com.onesignal": { "code_signatures": [ "com/onesignal" ], + "documentation": [ + "https://github.com/OneSignal/OneSignal-Android-SDK" + ], "gradle_signatures": [ "com.onesignal:OneSignal" ], + "license": "NonFree", + "name": "OneSignal Android Push Notification Plugin" + }, + "com.optimizely": { + "anti_features": [ + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "com/optimizely" + ], + "description": "part of the comScore, Inc. market research community, a leading global market research effort that studies and reports on Internet trends and behavior.", "license": "NonFree" }, "com.paypal.sdk": { "code_signatures": [ "com/paypal" ], - "gradle_signatures": [ - "com.paypal.sdk" + "documentation": [ + "https://github.com/paypal/PayPal-Android-SDK", + "https://github.com/paypal/android-checkout-sdk" ], + "gradle_signatures": [ + "com.paypal" + ], + "license": "NonFree", + "name": "PayPal Android SDK" + }, + "com.pushwoosh": { + "anti_features": [ + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "com/pushwoosh" + ], + "description": "mobile analytics under the cover of push messaging.", + "license": "NonFree" + }, + "com.quantcast.measurement.service": { + "anti_features": [ + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "com/quantcast/measurement/service" + ], + "description": "processes real-time data at the intersection of commerce and culture, providing useful, actionable insights for brands and publishers. See Crunchbase and Exodus Privacy.", + "license": "NonFree" + }, + "com.samsung.accessory": { + "anti_features": [ + "NonFreeComp" + ], + "code_signatures": [ + "com/samsung/accessory" + ], + "description": "provides a stable environment in which you can use a variety features by connecting accessories to your mobile device.", + "license": "NonFree" + }, + "com.samsung.android.sdk.look": { + "anti_features": [ + "NonFreeComp" + ], + "code_signatures": [ + "com/samsung/android/sdk/look" + ], + "description": "offers specialized widgets and service components for extended functions of the Samsung Android devices.", + "license": "NonFree" + }, + "com.sendbird.android": { + "anti_features": [ + "NonFreeComp", + "NonFreeNet", + "Tracking" + ], + "code_signatures": [ + "com/sendbird/android" + ], + "description": "an easy-to-use Chat API, native Chat SDKs, and a fully-managed chat platform on the backend means faster time-to-market.", + "license": "NonFree" + }, + "com.smaato.soma": { + "anti_features": [ + "Ads", + "NonFreeComp" + ], + "code_signatures": [ + "com/smaato/soma" + ], + "description": "a mobile ad platform that includes video ads.", + "license": "NonFree" + }, + "com.spotify.sdk": { + "anti_features": [ + "NonFreeComp", + "NonFreeNet" + ], + "code_signatures": [ + "com/spotify/sdk" + ], + "description": "allows your application to interact with the Spotify app service. (Note that while the SDK repo claims Apache license, the code is not available there)", + "license": "NonFree" + }, + "com.startapp.android": { + "anti_features": [ + "Ads", + "Tracking", + "NonFreeComp" + ], + "code_signatures": [ + "com/startapp" + ], + "description": "partly quite intrusive ad network.", + "license": "NonFree" + }, + "com.telerik.android": { + "anti_features": [ + "NonFreeComp" + ], + "code_signatures": [ + "com/telerik/android" + ], + "description": "offers high quality Xamarin Forms UI components and Visual Studio item templates to enable every developer.", "license": "NonFree" }, "com.tencent.bugly": { "code_signatures": [ "com/tencent/bugly" ], + "documentation": [ + "https://bugly.qq.com/" + ], "gradle_signatures": [ "com.tencent.bugly" ], + "license": "NonFree", + "name": "Bugly Android SDK" + }, + "com.tencent.mapsdk": { + "anti_features": [ + "NonFreeNet" + ], + "code_signatures": [ + "com/tencent/tencentmap" + ], + "description": "giving access to Tencent Maps.", + "license": "NonFree" + }, + "com.tenjin.android.TenjinSDK": { + "anti_features": [ + "Tracking" + ], + "code_signatures": [ + "com/tenjin/android/TenjinSDK" + ], + "description": "a marketing platform designed for mobile that features analytics, automated aggregation, and direct data visualization with direct SQL access.", "license": "NonFree" }, "com.umeng.umsdk": { "code_signatures": [ - "com/umeng/umsdk" + "com/umeng" + ], + "documentation": [ + "https://developer.umeng.com/docs/119267/detail/118584" ], "gradle_signatures": [ - "com.umeng.umsdk" + "com.umeng" ], - "license": "NonFree" + "license": "NonFree", + "name": "Umeng SDK" + }, + "com.wei.android.lib": { + "code_signatures": [ + "com/wei/android/lib/fingerprintidentify" + ], + "documentation": [ + "https://github.com/uccmawei/FingerprintIdentify" + ], + "gradle_signatures": [ + "com.wei.android.lib:fingerprintidentify", + "com.github.uccmawei:FingerprintIdentify" + ], + "license": "NonFree", + "name": "FingerprintIdentify" }, "com.yandex.android": { "code_signatures": [ @@ -1285,6 +2481,46 @@ SUSS_DEFAULT = r'''{ "gradle_signatures_negative_examples": [ "com.yandex.android:authsdk" ], + "license": "NonFree", + "name": "Yandex SDK" + }, + "com.yandex.metrica": { + "anti_features": [ + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "com/yandex/metrica" + ], + "description": "a mobile attribution and analytics platform developed by Yandex. It is free, real-time and has no data limits restriction. See Crunchbase and Exodus Privacy.", + "license": "NonFree" + }, + "com.yandex.mobile.ads": { + "anti_features": [ + "Ads", + "NonFreeComp" + ], + "code_signatures": [ + "com/yandex/mobile/ads" + ], + "description": "See Exodus Privacy.", + "license": "NonFree" + }, + "de.epgpaid": { + "anti_features": [ + "NonFreeComp" + ], + "code_signatures": [ + "de/epgpaid" + ], + "description": "access paid EPG (Electronic Program Guide, for TV) data (after payment, of course). Part of TVBrowser.", + "license": "NonFree" + }, + "de.innosystec.unrar": { + "code_signatures": [ + "de/innosystec/unrar" + ], + "description": "java unrar util", "license": "NonFree" }, "firebase": { @@ -1348,49 +2584,106 @@ SUSS_DEFAULT = r'''{ "com\\.google\\.android\\.geo\\.API_KEY", "com\\.google\\.android\\.maps\\.v2\\.API_KEY" ], + "documentation": [ + "https://developers.google.com/maps/documentation/android-sdk/overview" + ], "license": "NonFree", "name": "Google Maps" }, + "io.fabric.sdk.android": { + "anti_features": [ + "NonFreeComp", + "Tracking" + ], + "code_signatures": [ + "io/fabric/sdk/android" + ], + "description": "Framework to integrate services. Provides e.g. crash reports and analytics. Aquired by Google in 2017.", + "license": "NonFree" + }, "io.github.sinaweibosdk": { "code_signatures": [ "com/sina" ], + "documentation": [ + "https://github.com/sinaweibosdk/weibo_android_sdk" + ], "gradle_signatures": [ "io.github.sinaweibosdk" ], + "license": "NonFree", + "name": "SinaWeiboSDK" + }, + "io.intercom": { + "anti_features": [ + "NonFreeComp", + "NonFreeNet" + ], + "code_signatures": [ + "io/intercom" + ], + "description": "engage customers with email, push, and in\u2011app messages and support them with an integrated knowledge base and help desk.", "license": "NonFree" }, "io.objectbox": { - "Name": "ObjectBox Database", "code_signatures": [ "io/objectbox" ], + "documentation": [ + "https://objectbox.io/faq/#license-pricing" + ], "gradle_signatures": [ "io.objectbox:objectbox-gradle-plugin" ], - "license": "NonFree" + "license": "NonFree", + "name": "ObjectBox Database" }, "me.pushy": { "code_signatures": [ "me/pushy" ], + "documentation": [ + "https://pushy.me/" + ], "gradle_signatures": [ "me.pushy" ], - "license": "NonFree" + "license": "NonFree", + "name": "Pushy" }, "org.mariuszgromada.math": { + "code_signatures": [ + "org/mariuszgromada/math/mxparser/parsertokens/SyntaxStringBuilder", + "org/mariuszgromada/math/mxparser/CalcStepRecord", + "org/mariuszgromada/math/mxparser/CalcStepsRegister", + "org/mariuszgromada/math/mxparser/License", + "org/mariuszgromada/math/mxparser/CloneCache", + "org/mariuszgromada/math/mxparser/ElementAtTheEnd", + "org/mariuszgromada/math/mxparser/CompilationDetails", + "org/mariuszgromada/math/mxparser/CompiledElement" + ], "documentation": [ - "https://mathparser.org" + "https://mathparser.org", + "https://mathparser.org/mxparser-license/" ], "gradle_signatures": [ - "org.mariuszgromada.math:MathParser.org-mXparser" + "org.mariuszgromada.math:MathParser.org-mXparser:[5-9]" ], "license": "NonFree", "name": "mXparser" + }, + "tornaco.android.sec": { + "anti_features": [ + "NonFreeComp" + ], + "code_signatures": [ + "tornaco/android/sec" + ], + "description": "proprietary part of the Thanox application", + "license": "NonFree" } }, - "timestamp": 1706002241.887412, + "timestamp": 1725205987.66681, "version": 1, - "last_updated": 1706171656.496258 + "last_updated": 1725950235.569432 }''' From a0c1029fee2e0429019fd0042895021f93014ef4 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 10 Sep 2024 11:26:10 +0200 Subject: [PATCH 1652/2116] version 2.3 alpha 2 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index e421bd15..6b9be802 100755 --- a/setup.py +++ b/setup.py @@ -71,7 +71,7 @@ with open("README.md", "r") as fh: setup( name='fdroidserver', - version='2.3a1', + version='2.3a2', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From d6f5a1760af14f7c1de085b0b019e21d4e4a0741 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Tue, 10 Sep 2024 15:17:38 +0200 Subject: [PATCH 1653/2116] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ Translation: F-Droid/F-Droid Server --- locale/ar/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/az/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/be/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/bg/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/bn/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/cy/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/el/LC_MESSAGES/fdroidserver.po | 57 +++++++++++++++++++++++- locale/es_AR/LC_MESSAGES/fdroidserver.po | 57 +++++++++++++++++++++++- locale/es_MX/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/eu/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/fa/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/fi/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/fy/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/he/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/hi/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/id/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/ja/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/kab/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/lv/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/ml/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/nl/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/sk/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/sv/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/ta/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/tzm/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- locale/ug/LC_MESSAGES/fdroidserver.po | 56 ++++++++++++++++++++++- 26 files changed, 1432 insertions(+), 26 deletions(-) diff --git a/locale/ar/LC_MESSAGES/fdroidserver.po b/locale/ar/LC_MESSAGES/fdroidserver.po index 9980ff5a..f91ecf8f 100644 --- a/locale/ar/LC_MESSAGES/fdroidserver.po +++ b/locale/ar/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-01-17 16:52+0000\n" "Last-Translator: Laachir \n" "Language-Team: Arabic \n" @@ -670,6 +670,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -687,6 +697,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1276,6 +1290,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1487,6 +1513,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1718,6 +1749,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1915,6 +1950,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1946,6 +1986,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2164,6 +2209,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2493,6 +2542,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/az/LC_MESSAGES/fdroidserver.po b/locale/az/LC_MESSAGES/fdroidserver.po index a1bc9f88..c88fe465 100644 --- a/locale/az/LC_MESSAGES/fdroidserver.po +++ b/locale/az/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2023-05-26 19:39+0000\n" "Last-Translator: Mehrab Poladov \n" "Language-Team: Azerbaijani \n" @@ -667,6 +667,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -684,6 +694,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1271,6 +1285,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1482,6 +1508,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1713,6 +1744,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1910,6 +1945,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1941,6 +1981,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2159,6 +2204,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2486,6 +2535,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/be/LC_MESSAGES/fdroidserver.po b/locale/be/LC_MESSAGES/fdroidserver.po index 2e61feb4..ce82fab0 100644 --- a/locale/be/LC_MESSAGES/fdroidserver.po +++ b/locale/be/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-01-21 00:08+0000\n" "Last-Translator: flac \n" "Language-Team: Belarusian \n" @@ -672,6 +672,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -689,6 +699,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1276,6 +1290,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1487,6 +1513,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1718,6 +1749,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1915,6 +1950,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1946,6 +1986,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2164,6 +2209,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2491,6 +2540,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/bg/LC_MESSAGES/fdroidserver.po b/locale/bg/LC_MESSAGES/fdroidserver.po index bdecaf1c..31cd2fab 100644 --- a/locale/bg/LC_MESSAGES/fdroidserver.po +++ b/locale/bg/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-07-19 10:21+0000\n" "Last-Translator: 109247019824 \n" "Language-Team: Bulgarian \n" @@ -668,6 +668,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -685,6 +695,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1272,6 +1286,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1483,6 +1509,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1714,6 +1745,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1911,6 +1946,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1942,6 +1982,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2160,6 +2205,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2487,6 +2536,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index 4bb5e5e0..9b24b2ef 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2021-02-12 09:48+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali \n" @@ -667,6 +667,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -684,6 +694,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1271,6 +1285,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1482,6 +1508,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1713,6 +1744,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1910,6 +1945,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1941,6 +1981,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2159,6 +2204,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2487,6 +2536,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/cy/LC_MESSAGES/fdroidserver.po b/locale/cy/LC_MESSAGES/fdroidserver.po index 8c10a9b0..34758469 100644 --- a/locale/cy/LC_MESSAGES/fdroidserver.po +++ b/locale/cy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2021-01-16 21:23+0000\n" "Last-Translator: Aled Powell \n" "Language-Team: Welsh \n" @@ -675,6 +675,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -692,6 +702,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1279,6 +1293,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1490,6 +1516,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1732,6 +1763,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1929,6 +1964,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1960,6 +2000,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2182,6 +2227,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2514,6 +2563,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index d074ccad..0af82bb9 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-05-10 13:24+0000\n" "Last-Translator: ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ \n" "Language-Team: Greek \n" @@ -674,6 +674,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -691,6 +701,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1278,6 +1292,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1489,6 +1515,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1720,6 +1751,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1917,6 +1952,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1948,6 +1988,12 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +#| msgid "using Apache libcloud to sync with {url}" +msgid "Using rclone to sync with: {url}" +msgstr "χρήση Apache libcloud για συγχρονισμό με {url}" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2166,6 +2212,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2494,6 +2544,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index 66858ede..703a7a2c 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2021-04-10 21:26+0000\n" "Last-Translator: Germe the fur star \n" "Language-Team: Spanish (Argentina) \n" @@ -679,6 +679,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -696,6 +706,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1286,6 +1300,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1499,6 +1525,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1730,6 +1761,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1927,6 +1962,11 @@ msgstr "Utilizar la fecha del APK en vez de la actual para los APKs nuevos que s msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1958,6 +1998,12 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, fuzzy, python-brace-format +#| msgid "using Apache libcloud to sync with {url}" +msgid "Using rclone to sync with: {url}" +msgstr "usando libcloud de Apache para sincronizar con {url}" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2179,6 +2225,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2511,6 +2561,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/es_MX/LC_MESSAGES/fdroidserver.po b/locale/es_MX/LC_MESSAGES/fdroidserver.po index 03f0a510..3e4fbba4 100644 --- a/locale/es_MX/LC_MESSAGES/fdroidserver.po +++ b/locale/es_MX/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2020-04-29 12:49+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Spanish (Mexico) \n" @@ -672,6 +672,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -689,6 +699,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1276,6 +1290,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1487,6 +1513,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1718,6 +1749,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1915,6 +1950,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1946,6 +1986,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2164,6 +2209,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2492,6 +2541,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/eu/LC_MESSAGES/fdroidserver.po b/locale/eu/LC_MESSAGES/fdroidserver.po index c76db7fb..43f15a4c 100644 --- a/locale/eu/LC_MESSAGES/fdroidserver.po +++ b/locale/eu/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -666,6 +666,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -683,6 +693,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1270,6 +1284,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1481,6 +1507,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1712,6 +1743,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1909,6 +1944,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1940,6 +1980,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2158,6 +2203,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2485,6 +2534,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index 641e53b5..ce66a445 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-07-23 04:12+0000\n" "Last-Translator: Danial Behzadi \n" "Language-Team: Persian \n" @@ -670,6 +670,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -687,6 +697,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1274,6 +1288,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1485,6 +1511,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1716,6 +1747,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1913,6 +1948,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1944,6 +1984,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2162,6 +2207,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2489,6 +2538,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index d65eb248..2e2466ac 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2021-08-23 01:29+0000\n" "Last-Translator: Kaantaja \n" "Language-Team: Finnish \n" @@ -668,6 +668,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -685,6 +695,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1272,6 +1286,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1483,6 +1509,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1714,6 +1745,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1911,6 +1946,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1942,6 +1982,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2160,6 +2205,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2487,6 +2536,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/fy/LC_MESSAGES/fdroidserver.po b/locale/fy/LC_MESSAGES/fdroidserver.po index ddf37f55..222247f6 100644 --- a/locale/fy/LC_MESSAGES/fdroidserver.po +++ b/locale/fy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2021-07-01 15:29+0000\n" "Last-Translator: Vancha March \n" "Language-Team: Frisian \n" @@ -667,6 +667,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -684,6 +694,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1271,6 +1285,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1482,6 +1508,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1713,6 +1744,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1910,6 +1945,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1941,6 +1981,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2159,6 +2204,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2487,6 +2536,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/he/LC_MESSAGES/fdroidserver.po b/locale/he/LC_MESSAGES/fdroidserver.po index 4a17275c..dbea96c5 100644 --- a/locale/he/LC_MESSAGES/fdroidserver.po +++ b/locale/he/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-08-18 06:27+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" @@ -668,6 +668,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -685,6 +695,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1272,6 +1286,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1483,6 +1509,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1714,6 +1745,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1911,6 +1946,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1942,6 +1982,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2160,6 +2205,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2487,6 +2536,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/hi/LC_MESSAGES/fdroidserver.po b/locale/hi/LC_MESSAGES/fdroidserver.po index 48764286..b1c93645 100644 --- a/locale/hi/LC_MESSAGES/fdroidserver.po +++ b/locale/hi/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2023-02-22 11:24+0000\n" "Last-Translator: Saurmandal \n" "Language-Team: Hindi \n" @@ -668,6 +668,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -685,6 +695,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1272,6 +1286,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1483,6 +1509,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1714,6 +1745,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1911,6 +1946,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1942,6 +1982,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2160,6 +2205,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2488,6 +2537,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index 8c277b3a..70e087f8 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2021-06-23 23:32+0000\n" "Last-Translator: whenwesober \n" "Language-Team: Indonesian \n" @@ -671,6 +671,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -688,6 +698,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1275,6 +1289,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1486,6 +1512,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1716,6 +1747,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1913,6 +1948,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1944,6 +1984,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2161,6 +2206,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2488,6 +2537,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 6fd4bf25..8440cedd 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-02-25 05:52+0000\n" "Last-Translator: Suguru Hirahara \n" "Language-Team: Japanese \n" @@ -666,6 +666,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -683,6 +693,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1270,6 +1284,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1481,6 +1507,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1711,6 +1742,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1908,6 +1943,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1939,6 +1979,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2156,6 +2201,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2482,6 +2531,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index b814270a..cdda5b0a 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2021-01-15 13:25+0000\n" "Last-Translator: R_SACI \n" "Language-Team: Kabyle \n" @@ -670,6 +670,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -687,6 +697,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1276,6 +1290,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1487,6 +1513,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1718,6 +1749,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1915,6 +1950,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1946,6 +1986,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "Aseqdec n tqeffalt n uḥraz \"{path}\"" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2164,6 +2209,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2492,6 +2541,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/lv/LC_MESSAGES/fdroidserver.po b/locale/lv/LC_MESSAGES/fdroidserver.po index 383f1c9f..20d8713d 100644 --- a/locale/lv/LC_MESSAGES/fdroidserver.po +++ b/locale/lv/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-08-14 18:07+0000\n" "Last-Translator: \"Coool (github.com/Coool)\" \n" "Language-Team: Latvian \n" @@ -667,6 +667,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -684,6 +694,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1271,6 +1285,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1482,6 +1508,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1713,6 +1744,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1910,6 +1945,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1941,6 +1981,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2159,6 +2204,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2486,6 +2535,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/ml/LC_MESSAGES/fdroidserver.po b/locale/ml/LC_MESSAGES/fdroidserver.po index bb66da35..0f35cd13 100644 --- a/locale/ml/LC_MESSAGES/fdroidserver.po +++ b/locale/ml/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2023-06-23 14:52+0000\n" "Last-Translator: abe1242 \n" "Language-Team: Malayalam \n" @@ -672,6 +672,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -689,6 +699,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1276,6 +1290,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1487,6 +1513,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1721,6 +1752,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1918,6 +1953,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1949,6 +1989,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2167,6 +2212,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2494,6 +2543,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index d78f7292..a5f0f6e2 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-01-03 09:07+0000\n" "Last-Translator: Issa1553 \n" "Language-Team: Dutch \n" @@ -676,6 +676,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -693,6 +703,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1280,6 +1294,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1491,6 +1517,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1722,6 +1753,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1919,6 +1954,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1950,6 +1990,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2168,6 +2213,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2496,6 +2545,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/sk/LC_MESSAGES/fdroidserver.po b/locale/sk/LC_MESSAGES/fdroidserver.po index c56e39c1..819fade6 100644 --- a/locale/sk/LC_MESSAGES/fdroidserver.po +++ b/locale/sk/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -668,6 +668,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -685,6 +695,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1272,6 +1286,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1483,6 +1509,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1715,6 +1746,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1912,6 +1947,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1943,6 +1983,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2162,6 +2207,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2490,6 +2539,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index b32bd3fa..83e44806 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-04-24 08:39+0000\n" "Last-Translator: Kristoffer Grundström \n" "Language-Team: Swedish \n" @@ -673,6 +673,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -690,6 +700,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1277,6 +1291,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1488,6 +1514,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1719,6 +1750,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1916,6 +1951,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1947,6 +1987,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2165,6 +2210,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2493,6 +2542,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/ta/LC_MESSAGES/fdroidserver.po b/locale/ta/LC_MESSAGES/fdroidserver.po index 6f2df53a..f76bb61b 100644 --- a/locale/ta/LC_MESSAGES/fdroidserver.po +++ b/locale/ta/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2024-01-25 11:40+0000\n" "Last-Translator: Naveen \n" "Language-Team: Tamil \n" @@ -668,6 +668,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -685,6 +695,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1272,6 +1286,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1483,6 +1509,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1714,6 +1745,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1911,6 +1946,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1942,6 +1982,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2160,6 +2205,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2488,6 +2537,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/tzm/LC_MESSAGES/fdroidserver.po b/locale/tzm/LC_MESSAGES/fdroidserver.po index 8654ee12..22d89df4 100644 --- a/locale/tzm/LC_MESSAGES/fdroidserver.po +++ b/locale/tzm/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-681-gc19e8952\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2020-10-29 08:32+0000\n" "Last-Translator: Hakim Oubouali \n" "Language-Team: Central Atlas Tamazight \n" @@ -667,6 +667,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -684,6 +694,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1271,6 +1285,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1482,6 +1508,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1713,6 +1744,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1910,6 +1945,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1941,6 +1981,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2159,6 +2204,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2487,6 +2536,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" diff --git a/locale/ug/LC_MESSAGES/fdroidserver.po b/locale/ug/LC_MESSAGES/fdroidserver.po index 4d96c43c..05623704 100644 --- a/locale/ug/LC_MESSAGES/fdroidserver.po +++ b/locale/ug/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-05-13 13:50+0200\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" "PO-Revision-Date: 2018-06-08 03:44+0000\n" "Last-Translator: ۋولقان \n" "Language-Team: Uyghur \n" @@ -668,6 +668,16 @@ msgstr "" msgid "ERROR: unsupported git host \"%s\", patches welcome!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." @@ -685,6 +695,10 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" msgstr "" @@ -1273,6 +1287,18 @@ msgstr "" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" @@ -1484,6 +1510,11 @@ msgstr "" msgid "Run on git repo that has uncommitted changes" msgstr "" +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" msgstr "" @@ -1715,6 +1746,10 @@ msgstr "" msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" msgstr "" @@ -1912,6 +1947,11 @@ msgstr "" msgid "Using \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + #: ../fdroidserver/common.py msgid "Using APK Signature v2" msgstr "" @@ -1943,6 +1983,11 @@ msgstr "" msgid "Using existing keystore \"{path}\"" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" @@ -2161,6 +2206,10 @@ msgstr "" msgid "deleting: repo/{apkfilename}" msgstr "" +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" @@ -2489,6 +2538,11 @@ msgstr "" msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "" +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" From f6f962aaf4c5d9681cfd4e12111d872ab5ef58a3 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 10 Sep 2024 15:17:38 +0200 Subject: [PATCH 1654/2116] Translated using Weblate: Serbian (sr) by Hans-Christoph Steiner Currently translated at 97.9% (580 of 592 strings) Translated using Weblate: Romanian (ro) by Hans-Christoph Steiner Currently translated at 97.9% (580 of 592 strings) Translated using Weblate: Albanian (sq) by Hans-Christoph Steiner Currently translated at 90.5% (536 of 592 strings) Translated using Weblate: Polish (pl) by Hans-Christoph Steiner Currently translated at 96.4% (571 of 592 strings) Translated using Weblate: French (fr) by Hans-Christoph Steiner Currently translated at 93.2% (552 of 592 strings) Translated using Weblate: Italian (it) by Hans-Christoph Steiner Currently translated at 93.5% (554 of 592 strings) Translated using Weblate: Portuguese (Portugal) (pt_PT) by Hans-Christoph Steiner Currently translated at 97.9% (580 of 592 strings) Translated using Weblate: Portuguese (Brazil) (pt_BR) by Hans-Christoph Steiner Currently translated at 97.9% (580 of 592 strings) Co-authored-by: Hans-Christoph Steiner Co-authored-by: Hans-Christoph Steiner Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_PT/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ro/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 34 ++++++++++------------ locale/it/LC_MESSAGES/fdroidserver.po | 36 ++++++++++-------------- locale/pl/LC_MESSAGES/fdroidserver.po | 12 ++++---- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 10 +++---- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 10 +++---- locale/ro/LC_MESSAGES/fdroidserver.po | 8 +++--- locale/sq/LC_MESSAGES/fdroidserver.po | 36 +++++++++++------------- locale/sr/LC_MESSAGES/fdroidserver.po | 7 +++-- 8 files changed, 70 insertions(+), 83 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 6c5bad80..64ebf993 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -41,15 +41,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-06-09 16:09+0000\n" -"Last-Translator: Christopher Forzy \n" +"PO-Revision-Date: 2024-09-10 09:27+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.6-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -254,9 +254,9 @@ msgid "A URL is required as an argument!" msgstr "Une URL est requise en argument !" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "Aucun certificat signé trouvé dans {path}" +msgstr "" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -875,7 +875,7 @@ msgstr "Plusieurs fichiers de bloc de signature JAR trouvé à {path}" #: ../fdroidserver/common.py #, fuzzy msgid "Found multiple Signer Certificates!" -msgstr "Plusieurs certificats de signature ont étés trouvés pour le référentiel." +msgstr "Plusieurs certificats de signature ont étés trouvés!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1295,7 +1295,7 @@ msgstr "Aucun dossier non signé — il n'y a rien à faire" #: ../fdroidserver/__main__.py #, fuzzy msgid "No version information could be found." -msgstr "aucune information sur la version n’a été trouvée" +msgstr "Aucune information sur la version n’a été trouvée." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" @@ -1468,9 +1468,8 @@ msgid "Pushing binary transparency log to {url}" msgstr "Envoyer les logs de transparence de la compilation vers {url}" #: ../fdroidserver/deploy.py -#, fuzzy msgid "Pushing to remote server failed!" -msgstr "Impossible de définir la branche par défaut du Git distant : \"%s\"" +msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1767,9 +1766,7 @@ msgstr "Voici les applications qui ont été archivées à partir du dépôt pri #: ../fdroidserver/mirror.py #, fuzzy msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "" -"ERREUR : cette commande ne devrait jamais être utilisée pour copier f-droid.org !\n" -"Une copie de f-droid.org occupe plus de 200GB." +msgstr "Cette commande ne devrait jamais être utilisée pour copier f-droid.org ! Une copie occupe plus de 600GB." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." @@ -1948,7 +1945,7 @@ msgstr "UpdateCheckData URL non valide : {url}" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "UpdateCheckMode est configuré mais on dirait que checkupdates n'a pas encore été lancé" +msgstr "UpdateCheckMode est configuré mais on dirait que checkupdates n'a pas encore été lancé." #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py @@ -2426,9 +2423,9 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "le miroir «%s» ne se termine pas par «fdroid» !" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "Maintenant, définissez-les dans config.yml :" +msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2612,9 +2609,8 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "l'analyse du cache est mal formée ! Vous pouvez le nettoyer avec : '{clear}'" #: ../fdroidserver/deploy.py -#, fuzzy msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "local_copy_dir ne semble pas se terminer avec \"fdroid\", peut être voulez-vous dire : \"{path}\"" +msgstr "" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2831,9 +2827,9 @@ msgid "{path} is not \"key: value\" dict, but a {datatype}!" msgstr "" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} is not a standard config file!" -msgstr "'sdk_path' n'est pas configuré dans 'config.yml' !" +msgstr "" #: ../fdroidserver/index.py #, python-brace-format diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 75e21d6a..69d9b987 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ # IvanDan , 2020, 2021. # Massimiliano Caniparoli , 2020. # x , 2020, 2021. -# Hans-Christoph Steiner , 2020. +# Hans-Christoph Steiner , 2020, 2024. # Francesco Saltori , 2020. # Francesco Esposito , 2021. # mondstern , 2021. @@ -22,15 +22,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-04-13 17:01+0000\n" -"Last-Translator: Random \n" +"PO-Revision-Date: 2024-09-10 09:27+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -235,9 +235,9 @@ msgid "A URL is required as an argument!" msgstr "È richiesto un URL come argomento!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "Nessun certificato di firma trovato in {path}" +msgstr "" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -854,9 +854,8 @@ msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Trovati più file di blocco della firma JAR in {path}" #: ../fdroidserver/common.py -#, fuzzy msgid "Found multiple Signer Certificates!" -msgstr "Trovati più certificati di firma per il repository." +msgstr "Trovati più certificati di firma per il repository!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1274,9 +1273,8 @@ msgid "No unsigned directory - nothing to do" msgstr "Nessuna directory non firmata - niente da fare" #: ../fdroidserver/__main__.py -#, fuzzy msgid "No version information could be found." -msgstr "nessuna informazione sulla versione trovata" +msgstr "Nessuna informazione sulla versione trovata." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" @@ -1449,9 +1447,8 @@ msgid "Pushing binary transparency log to {url}" msgstr "Invio del log di trasparenza binaria su {url}" #: ../fdroidserver/deploy.py -#, fuzzy msgid "Pushing to remote server failed!" -msgstr "Set-head remoto Git non riuscito: \"%s\"" +msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1748,9 +1745,7 @@ msgstr "Queste sono le applicazioni che sono state archiviate dal repo principal #: ../fdroidserver/mirror.py #, fuzzy msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "" -"ERRORE: questo comando non deve mai essere utilizzato per il mirror f-droid.org!\n" -"L’intero mirror di f-droid.org richiede più di 200GB." +msgstr "Questo comando non deve mai essere utilizzato per il mirror f-droid.org! L’intero mirror richiede più di 600GB." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." @@ -2405,9 +2400,9 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "il mirror '%s' non finisce con 'fdroid'!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "Ora imposta i seguenti campi in config.yml:" +msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2591,9 +2586,8 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "la cache dello scanner è malformata! Puoi svuotarla con: '{clear}'" #: ../fdroidserver/deploy.py -#, fuzzy msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "local_copy_dir not finisce con \"fdroid\", forse intendevi: \"{path}\"" +msgstr "" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2810,9 +2804,9 @@ msgid "{path} is not \"key: value\" dict, but a {datatype}!" msgstr "" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} is not a standard config file!" -msgstr "\"sdk_path\" non impostato in config.yml!" +msgstr "" #: ../fdroidserver/index.py #, python-brace-format diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index a87be9ef..e518d6c0 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -3,22 +3,22 @@ # WaldiS , 2020, 2021, 2024. # Michal L , 2020, 2021. # mondstern , 2021. -# Hans-Christoph Steiner , 2021. +# Hans-Christoph Steiner , 2021, 2024. # Agnieszka C , 2021, 2022, 2023, 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-08-23 10:34+0000\n" -"Last-Translator: WaldiS \n" +"PO-Revision-Date: 2024-09-10 09:27+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.7.1-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -2785,9 +2785,9 @@ msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" msgstr "{path} ma zły podpis pliku \"{pattern}\", możliwe wykorzystanie Janusa!" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} has been flagged by virustotal {count} times:" -msgstr "{ścieżka} została oznaczona przez virustotal {liczba} razy:" +msgstr "{path} została oznaczona przez virustotal {count} razy:" #: ../fdroidserver/common.py #, python-brace-format diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index ce11b7db..ba1966a3 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -2,7 +2,7 @@ # Copyright (C) YEAR Free Software Foundation, Inc. # Wellington Terumi Uemura , 2020. # André Marcelo Alvarenga , 2020. -# Hans-Christoph Steiner , 2020. +# Hans-Christoph Steiner , 2020, 2024. # Rafael Fontenelle , 2020, 2021. # ssantos , 2020. # The Cats , 2020. @@ -16,15 +16,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-07-07 07:41+0000\n" -"Last-Translator: lucasmz-dev \n" +"PO-Revision-Date: 2024-09-10 09:27+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.7-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -1912,7 +1912,7 @@ msgstr "UpdateCheckData não é uma URL válida: {url}" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado" +msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado." #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 499c48a8..8abe1d38 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -3,22 +3,22 @@ # This file is distributed under the same license as the PACKAGE package. # Manuela Silva , 2020. # ssantos , 2020, 2021, 2022, 2023, 2024. -# Hans-Christoph Steiner , 2020, 2022. +# Hans-Christoph Steiner , 2020, 2022, 2024. # Peter J. Mello , 2021. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-08-12 18:05+0000\n" -"Last-Translator: ssantos \n" +"PO-Revision-Date: 2024-09-10 09:27+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Portuguese (Portugal) \n" "Language: pt_PT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.7-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -1906,7 +1906,7 @@ msgstr "UpdateCheckData não é uma URL válida: {url}" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado" +msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado." #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 446a39be..0d0e6456 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -10,15 +10,15 @@ msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-05-17 08:01+0000\n" -"Last-Translator: Licaon Kter \n" +"PO-Revision-Date: 2024-09-10 09:27+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n" -"X-Generator: Weblate 5.6-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -226,7 +226,7 @@ msgstr "Un URL este necesar ca argument!" #: ../fdroidserver/common.py #, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "Semnăturile APK au certificate diferite în {path}" +msgstr "Semnăturile APK au certificate diferite în {path}:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index efee1b91..fa3a5139 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -1,21 +1,21 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # Besnik Bleta , 2020, 2021, 2022, 2023, 2024. -# Hans-Christoph Steiner , 2020, 2021. +# Hans-Christoph Steiner , 2020, 2021, 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-02-20 18:58+0000\n" -"Last-Translator: Besnik Bleta \n" +"PO-Revision-Date: 2024-09-10 09:27+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Albanian \n" "Language: sq\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -220,9 +220,9 @@ msgid "A URL is required as an argument!" msgstr "Lypset një URL si argument!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "S’u gjetën dëshmi nënshkrimi te {path}" +msgstr "" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -841,7 +841,7 @@ msgstr "Te {path} u gjetën Kartela të shumta JAR Blloqesh Nënshkrimi" #: ../fdroidserver/common.py #, fuzzy msgid "Found multiple Signer Certificates!" -msgstr "U gjetën dëshmi të shumta nënshkrimi për depon." +msgstr "U gjetën dëshmi të shumta nënshkrimi për depon!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1261,7 +1261,7 @@ msgstr "S’ka drejtori të panënshkruar - s’ka ç’bëhet" #: ../fdroidserver/__main__.py #, fuzzy msgid "No version information could be found." -msgstr "s’u gjetën hollësi versioni" +msgstr "s’u gjetën hollësi versioni." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" @@ -1434,9 +1434,8 @@ msgid "Pushing binary transparency log to {url}" msgstr "" #: ../fdroidserver/deploy.py -#, fuzzy msgid "Pushing to remote server failed!" -msgstr "Veprimi “git remote set-head” dështoi: “%s”" +msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1733,9 +1732,7 @@ msgstr "Këto janë aplikacionet që janë arkivuar nga depoja kryesore." #: ../fdroidserver/mirror.py #, fuzzy msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "" -"GABIM: ky urdhër s’duhet përdorur kurrë për krijimin e një pasqyre të f-droid.org!\n" -"Një pasqyrë e plotë e f-droid.org lyp më tepër se 200GB." +msgstr "Ky urdhër s’duhet përdorur kurrë për krijimin e një pasqyre të f-droid.org! Një pasqyrë e plotë lyp më tepër se 600GB." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." @@ -1913,7 +1910,7 @@ msgstr "UpdateCheckData s’është URL e vlefshme: {url}" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "UpdateCheckMode është ujdisur, por duket sikur checkupdates s’është xhiruar ende" +msgstr "UpdateCheckMode është ujdisur, por duket sikur checkupdates s’është xhiruar ende." #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py @@ -2391,9 +2388,9 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "pasqyra '%s' s’përfundon me 'fdroid'!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "Tani, ujdisini këto te config.yml:" +msgstr "" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2577,9 +2574,8 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "fshehtina e kontrollorit është e keqformuar! Mund ta spastroni me: “{clear}”" #: ../fdroidserver/deploy.py -#, fuzzy msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "local_copy_dir does s’mbaron me “fdroid”, ndoshta kishit në mendje: “{path}”" +msgstr "" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2796,9 +2792,9 @@ msgid "{path} is not \"key: value\" dict, but a {datatype}!" msgstr "" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} is not a standard config file!" -msgstr "'sdk_path' te 'config.yml' s’është ujdisur!" +msgstr "" #: ../fdroidserver/index.py #, python-brace-format diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index c45ba575..0cd559ce 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -3,13 +3,14 @@ # Саша Петровић , 2022. # Đorđe Vasiljević , 2022. # Reno Tx , 2024. +# Hans-Christoph Steiner , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-07 00:41+0000\n" -"Last-Translator: Reno Tx \n" +"PO-Revision-Date: 2024-09-10 09:27+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" @@ -1202,7 +1203,7 @@ msgstr "Нема информација." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" -msgstr "Нема одговарајућих ознака." +msgstr "Нема одговарајућих ознака" #: ../fdroidserver/update.py #, python-brace-format From eb68ae3d8ced4921fa9a88b31a96eaa954641d40 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Tue, 10 Sep 2024 15:17:38 +0200 Subject: [PATCH 1655/2116] Translated using Weblate: Albanian (sq) by Besnik Bleta Currently translated at 93.2% (552 of 592 strings) Co-authored-by: Besnik Bleta Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/ Translation: F-Droid/F-Droid Server --- locale/sq/LC_MESSAGES/fdroidserver.po | 57 +++++++++++---------------- 1 file changed, 23 insertions(+), 34 deletions(-) diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index fa3a5139..aa35d795 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -7,8 +7,8 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-10 09:27+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2024-09-10 10:20+0000\n" +"Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" "Language: sq\n" "MIME-Version: 1.0\n" @@ -222,7 +222,7 @@ msgstr "Lypset një URL si argument!" #: ../fdroidserver/common.py #, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "" +msgstr "Nënshkrimet APK kanë dëshmi të ndryshme te {path}:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -302,9 +302,8 @@ msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode msgstr "Aplikacioni ka NoSourceSince ose ArchivePolicy “0 versione”, por AutoUpdateMode ose UpdateCheckMode janë vënë si “Asnjë”" #: ../fdroidserver/lint.py -#, fuzzy msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "Aplikacioni ka NoSourceSince ose ArchivePolicy “0 versione”, por AutoUpdateMode ose UpdateCheckMode janë vënë si “Asnjë”" +msgstr "Aplikacioni ka NoSourceSince ose ArchivePolicy “0 versione”, ose 0, por AutoUpdateMode ose UpdateCheckMode janë vënë si “Asnjë”" #: ../fdroidserver/lint.py #, python-brace-format @@ -839,9 +838,8 @@ msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Te {path} u gjetën Kartela të shumta JAR Blloqesh Nënshkrimi" #: ../fdroidserver/common.py -#, fuzzy msgid "Found multiple Signer Certificates!" -msgstr "U gjetën dëshmi të shumta nënshkrimi për depon!" +msgstr "U gjetën Dëshmi të shumta Nënshkruesi!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -908,9 +906,8 @@ msgid "Git reset failed" msgstr "Veprimi “git reset” dështoi" #: ../fdroidserver/common.py -#, fuzzy msgid "Git submodule deinit failed" -msgstr "Veprimi “git submodule update” dështoi" +msgstr "Veprimi “git submodule deinit” dështoi" #: ../fdroidserver/common.py msgid "Git submodule sync failed" @@ -1259,9 +1256,8 @@ msgid "No unsigned directory - nothing to do" msgstr "S’ka drejtori të panënshkruar - s’ka ç’bëhet" #: ../fdroidserver/__main__.py -#, fuzzy msgid "No version information could be found." -msgstr "s’u gjetën hollësi versioni." +msgstr "S’u gjetën hollësi versioni." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" @@ -1471,9 +1467,8 @@ msgid "Reading {apkfilename} from cache" msgstr "Po lexohet {apkfilename} prej fshehtine" #: ../fdroidserver/build.py -#, fuzzy msgid "Refresh and cache scanner rules and signatures from the network" -msgstr "sill nga interneti versionin më të ri të nënshkrimeve" +msgstr "Rifresko dhe ruaj në fshehtinë rregulla skaneri nga rrjeti" #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1730,9 +1725,8 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Këto janë aplikacionet që janë arkivuar nga depoja kryesore." #: ../fdroidserver/mirror.py -#, fuzzy msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "Ky urdhër s’duhet përdorur kurrë për krijimin e një pasqyre të f-droid.org! Një pasqyrë e plotë lyp më tepër se 600GB." +msgstr "Ky urdhër s’duhet përdorur kurrë për krijimin e një pasqyre të f-droid.org! Një kopje e plotë lyp më tepër se 600GB." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." @@ -1768,9 +1762,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "Për të përdorur awsbucket, te config.yml duhen ujdisur edhe awssecretkey dhe awsaccesskey!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" -msgstr "Për të përdorur awsbucket, te config.yml duhen ujdisur edhe awssecretkey dhe awsaccesskey!" +msgstr "Që të përdorni rclone, rclone_config dhe awsbucket duhen ujdisur te config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1914,7 +1907,6 @@ msgstr "UpdateCheckMode është ujdisur, por duket sikur checkupdates s’ësht #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -#, fuzzy msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" msgstr "UpdateCheckMode është ujdisur, por duket sikur checkupdates s’është xhiruar ende" @@ -1946,9 +1938,8 @@ msgid "Usage: %s\n" msgstr "Përdorim: %s\n" #: ../fdroidserver/lint.py -#, fuzzy msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "Për të treguar një kartelë te dega parazgjedhje, përdorni /HEAD, në vend se /master" +msgstr "Për të treguar një kartelë te dega parazgjedhje, përdorni /HEAD, në vend se /master apo /main" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" @@ -1972,9 +1963,9 @@ msgid "Using \"{path}\" for configuring s3cmd." msgstr "Po përdoret “{path}” për formësim të s3cmd." #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using \"{path}\" for syncing with remote storage." -msgstr "Po përdoret “{path}” për formësim të s3cmd." +msgstr "Po përdoret “{path}” për njëkohësim me depozitë të largët." #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -1985,9 +1976,8 @@ msgid "Using APK Signature v3" msgstr "Po përdoret Nënshkrimi APK-je v3" #: ../fdroidserver/common.py -#, fuzzy msgid "Using JAR Signature" -msgstr "Po përdoret Nënshkrimi APK-je v2" +msgstr "Po përdoret Nënshkrim JAR" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -2009,9 +1999,9 @@ msgid "Using existing keystore \"{path}\"" msgstr "Po përdoret depo ekzistuese kyçesh “{path}”" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using rclone to sync with: {url}" -msgstr "Po përdoret s3cmd për njëkohësim me: {url}" +msgstr "Po përdoret rclone për njëkohësim me: {url}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2205,9 +2195,8 @@ msgid "could not parse '{path}'" msgstr "s’u përtyp dot '{path}'" #: ../fdroidserver/common.py -#, fuzzy msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "s’u përtyp dot specifikim scrlib (s’u dha referencë): '{}'" +msgstr "s’u përtyp dot specifikim scrlib (s’u dha emër): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" @@ -2561,12 +2550,12 @@ msgstr "ruamel.yaml s’është i instaluar, s’mund të shkruhen tejtëdhëna. #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" -msgstr "s3cmd sync indexes {path} to {url} and delete" +msgstr "" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "s3cmd sync indexes {path} to {url} and delete" +msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format @@ -2794,17 +2783,17 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not a standard config file!" -msgstr "" +msgstr "{path} s’është kartelë standarde formësimi!" #: ../fdroidserver/index.py #, python-brace-format msgid "{path} is not list, but a {datatype}!" -msgstr "" +msgstr "{path} s’është listë, por një {datatype}!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "" +msgstr "{path} s’është {expected_type}, por një {datatype}!" #: ../fdroidserver/update.py #, python-brace-format From c326fc961d61fa5092853d22e97357966e3a9ec6 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Tue, 10 Sep 2024 15:17:38 +0200 Subject: [PATCH 1656/2116] Translated using Weblate: Spanish (es) by gallegonovato Currently translated at 100.0% (592 of 592 strings) Co-authored-by: gallegonovato Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ Translation: F-Droid/F-Droid Server --- locale/es/LC_MESSAGES/fdroidserver.po | 35 +++++++++++++-------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index d625ff0a..cb7cb863 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -18,7 +18,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-05-26 07:09+0000\n" +"PO-Revision-Date: 2024-09-10 13:17+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" "Language: es\n" @@ -26,7 +26,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.6-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -688,12 +688,12 @@ msgstr "ERROR: host git no soportado \"%s\", ¡parches bienvenidos!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" -msgstr "" +msgstr "ERROR: ¡{key} en {path} no es un \"archivo\" o un \"repositorio\"!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" -msgstr "" +msgstr "ERROR: ¡{key}:{subkey} en {path} no está en las claves permitidas: {allowed_keys}!" #: ../fdroidserver/__main__.py #, python-brace-format @@ -716,7 +716,7 @@ msgstr "¡La variable de entorno {var} de {configname} no tiene valor asignado!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "" +msgstr "Error desplegando 'github_releases', {} no está presente. (Puede que necesites ejecutar `fdroid update` primero)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -1307,15 +1307,15 @@ msgstr "Maquina desconectada. Saltando la generación del repositorio espejo git #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "" +msgstr "A uno de los elementos de configuración 'github_releases' le falta el valor 'projectUrl'. omitiendo ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." -msgstr "" +msgstr "A uno de los elementos de configuración de 'github_releases' le falta el valor 'packageNames'. omitiendo ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." -msgstr "" +msgstr "A uno de los elementos de configuración 'github_releases' le falta el valor 'token'. Omitiendo ..." #: ../fdroidserver/update.py #, python-brace-format @@ -1531,7 +1531,7 @@ msgstr "Ejecutar en repositorio git con cambios pendientes" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" -msgstr "" +msgstr "Ejecutar sobre {cibase} para encontrar -debug.apk. y omitir repo_basedir {repo_basedir}" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1772,9 +1772,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "¡Para usar awsbucket hay que configurar también awssecretkey y awsaccesskeyid en config.yml!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" -msgstr "¡Para usar awsbucket hay que configurar también awssecretkey y awsaccesskeyid en config.yml!" +msgstr "¡Para utilizar rclone, rclone_config y awsbucket deben estar configurados en config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1974,9 +1973,9 @@ msgid "Using \"{path}\" for configuring s3cmd." msgstr "Usando \"{path}\" para configurar s3cmd." #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using \"{path}\" for syncing with remote storage." -msgstr "Usando \"{path}\" para configurar s3cmd." +msgstr "Usando \"{path}\" para sincronizar con almacenamiento remoto." #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -2010,9 +2009,9 @@ msgid "Using existing keystore \"{path}\"" msgstr "Usando almacén de claves existente \"{path}\"" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using rclone to sync with: {url}" -msgstr "Usando s3cmd para sincronizar con: {url}" +msgstr "Usando rclone para sincronizar con: {url}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2234,7 +2233,7 @@ msgstr "eliminando: repo/{apkfilename}" #: ../fdroidserver/scanner.py msgid "dependency file without lock" -msgstr "" +msgstr "archivo de dependencia sin bloqueo" #: ../fdroidserver/common.py #, python-brace-format @@ -2564,9 +2563,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sync indexa {path} a {url} y elimina" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "s3cmd sync indexa {path} a {url} y elimina" +msgstr "s3cmd sincroniza los índices de {path} a {url} y borra los eliminados" #: ../fdroidserver/scanner.py #, python-brace-format From 41b9419740e8b3d65fb55c9990991b2e6b48bbd2 Mon Sep 17 00:00:00 2001 From: Jose Delvani Date: Tue, 10 Sep 2024 15:17:38 +0200 Subject: [PATCH 1657/2116] Translated using Weblate: Portuguese (Brazil) (pt_BR) by Jose Delvani Currently translated at 100.0% (592 of 592 strings) Co-authored-by: Jose Delvani Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/ Translation: F-Droid/F-Droid Server --- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 36 ++++++++++++------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index ba1966a3..824a49c2 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -11,13 +11,14 @@ # The Cats , 2023. # lucasmz-dev , 2024. # Jose Delvani , 2024. +# Jose Delvani , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-10 09:27+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2024-09-10 13:17+0000\n" +"Last-Translator: Jose Delvani \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" @@ -686,12 +687,12 @@ msgstr "ERRO: host de git \"%s\" não suportado, patches são bem-vindos!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" -msgstr "" +msgstr "ERRO: {key} em {path} não é um \"arquivamento\" ou \"repositório\"!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" -msgstr "" +msgstr "ERRO: {key}:{subkey} em {path} não está nas chaves permitidas: {allowed_keys}!" #: ../fdroidserver/__main__.py #, python-brace-format @@ -714,7 +715,7 @@ msgstr "A variável de ambiente {var} de {configname} não está definida!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "" +msgstr "Erro ao implementar 'github_releases', {} não está presente. (Talvez seja necessário executar `fdroid update` primeiro)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -1305,15 +1306,15 @@ msgstr "A máquina está desconectada, pulando geração de espelhos de git até #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "" +msgstr "Um dos itens de configuração 'github_releases' está faltando o valor 'projectUrl'. ignorando ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." -msgstr "" +msgstr "Um dos itens de configuração 'github_releases' está faltando o valor 'packageNames'. ignorando ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." -msgstr "" +msgstr "Um dos itens de configuração 'github_releases' está faltando o valor 'token'. ignorando ..." #: ../fdroidserver/update.py #, python-brace-format @@ -1529,7 +1530,7 @@ msgstr "Executar no repositório do Git que tenha alterações não confirmadas" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" -msgstr "" +msgstr "Execute {cibase} para encontrar -debug.apk. e ignore repo_basedir {repo_basedir}" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1770,9 +1771,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" -msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" +msgstr "Para usar rclone, rclone_config e awsbucket devem ser configurados em config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1972,9 +1972,9 @@ msgid "Using \"{path}\" for configuring s3cmd." msgstr "Usando \"{path}\" para configurar s3cmd." #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using \"{path}\" for syncing with remote storage." -msgstr "Usando \"{path}\" para configurar s3cmd." +msgstr "Usando \"{path}\" para sincronização com armazenamento remoto." #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -2008,9 +2008,9 @@ msgid "Using existing keystore \"{path}\"" msgstr "Utilizando armazenamento de chave existente \"{path}\"" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using rclone to sync with: {url}" -msgstr "Usando s3cmd para sincronizar com: {url}" +msgstr "Usando rclone para sincronizar com: {url}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2232,7 +2232,7 @@ msgstr "apagando: repo/{apkfilename}" #: ../fdroidserver/scanner.py msgid "dependency file without lock" -msgstr "" +msgstr "arquivo de dependência sem bloqueio" #: ../fdroidserver/common.py #, python-brace-format @@ -2562,9 +2562,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincroniza índices {path} para {url} e exclui" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "s3cmd sincroniza índices {path} para {url} e exclui" +msgstr "s3cmd sincroniza os índices de {path} para {url} e exclui os índices removidos" #: ../fdroidserver/scanner.py #, python-brace-format From 492d4a56191c92fb032313a657f8d910f47521ed Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 10 Sep 2024 17:00:37 +0200 Subject: [PATCH 1658/2116] fix typo in translatable string: s,itmes,items,g --- fdroidserver/deploy.py | 4 ++-- locale/ar/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/az/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/be/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/bg/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/bn/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/bo/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/ca/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/cs/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/cy/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/de/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/el/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/es/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/es_AR/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/es_MX/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/eu/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/fa/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/fdroidserver.pot | 4 ++-- locale/fi/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/fr/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/fy/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/he/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/hi/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/hu/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/id/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/it/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/ja/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/kab/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/ko/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/lv/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/ml/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/nl/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/pl/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/pt/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/ro/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/ru/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/sk/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/sq/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/sr/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/sv/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/sw/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/ta/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/tr/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/tzm/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/ug/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/uk/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 4 ++-- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 4 ++-- 51 files changed, 102 insertions(+), 102 deletions(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index d84b4c77..b982f816 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -1195,7 +1195,7 @@ def upload_to_github_releases_repo(repo_conf, release_infos, global_gh_token): if not token: logging.warning( _( - "One of the 'github_releases' config itmes is missing the " + "One of the 'github_releases' config items is missing the " "'token' value. skipping ..." ) ) @@ -1206,7 +1206,7 @@ def upload_to_github_releases_repo(repo_conf, release_infos, global_gh_token): if not conf_package_names: logging.warning( _( - "One of the 'github_releases' config itmes is missing the " + "One of the 'github_releases' config items is missing the " "'packageNames' value. skipping ..." ) ) diff --git a/locale/ar/LC_MESSAGES/fdroidserver.po b/locale/ar/LC_MESSAGES/fdroidserver.po index f91ecf8f..3cd48f33 100644 --- a/locale/ar/LC_MESSAGES/fdroidserver.po +++ b/locale/ar/LC_MESSAGES/fdroidserver.po @@ -1295,11 +1295,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/az/LC_MESSAGES/fdroidserver.po b/locale/az/LC_MESSAGES/fdroidserver.po index c88fe465..a42bf704 100644 --- a/locale/az/LC_MESSAGES/fdroidserver.po +++ b/locale/az/LC_MESSAGES/fdroidserver.po @@ -1290,11 +1290,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/be/LC_MESSAGES/fdroidserver.po b/locale/be/LC_MESSAGES/fdroidserver.po index ce82fab0..ab9759d0 100644 --- a/locale/be/LC_MESSAGES/fdroidserver.po +++ b/locale/be/LC_MESSAGES/fdroidserver.po @@ -1295,11 +1295,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/bg/LC_MESSAGES/fdroidserver.po b/locale/bg/LC_MESSAGES/fdroidserver.po index 31cd2fab..af494589 100644 --- a/locale/bg/LC_MESSAGES/fdroidserver.po +++ b/locale/bg/LC_MESSAGES/fdroidserver.po @@ -1291,11 +1291,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index 9b24b2ef..d47d2d73 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -1290,11 +1290,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index 06817ec3..1b32a1b5 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -1311,11 +1311,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index aa1ffe63..d2dd132c 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -1302,11 +1302,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 78c22068..1d3ab9e7 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -1306,11 +1306,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/cy/LC_MESSAGES/fdroidserver.po b/locale/cy/LC_MESSAGES/fdroidserver.po index 34758469..18ca6109 100644 --- a/locale/cy/LC_MESSAGES/fdroidserver.po +++ b/locale/cy/LC_MESSAGES/fdroidserver.po @@ -1298,11 +1298,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 1996b072..5553ce03 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -1319,11 +1319,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index 0af82bb9..29e91fca 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -1297,11 +1297,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index cb7cb863..25ba05be 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -1310,11 +1310,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "A uno de los elementos de configuración 'github_releases' le falta el valor 'projectUrl'. omitiendo ..." #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "A uno de los elementos de configuración de 'github_releases' le falta el valor 'packageNames'. omitiendo ..." #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "A uno de los elementos de configuración 'github_releases' le falta el valor 'token'. Omitiendo ..." #: ../fdroidserver/update.py diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index 703a7a2c..0807d0b9 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -1305,11 +1305,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/es_MX/LC_MESSAGES/fdroidserver.po b/locale/es_MX/LC_MESSAGES/fdroidserver.po index 3e4fbba4..c1b2f6aa 100644 --- a/locale/es_MX/LC_MESSAGES/fdroidserver.po +++ b/locale/es_MX/LC_MESSAGES/fdroidserver.po @@ -1295,11 +1295,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/eu/LC_MESSAGES/fdroidserver.po b/locale/eu/LC_MESSAGES/fdroidserver.po index 43f15a4c..e7d01629 100644 --- a/locale/eu/LC_MESSAGES/fdroidserver.po +++ b/locale/eu/LC_MESSAGES/fdroidserver.po @@ -1289,11 +1289,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index ce66a445..4b6467d1 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -1293,11 +1293,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/fdroidserver.pot b/locale/fdroidserver.pot index 27258a85..4d92f723 100644 --- a/locale/fdroidserver.pot +++ b/locale/fdroidserver.pot @@ -1291,11 +1291,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index 2e2466ac..af922025 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -1291,11 +1291,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 64ebf993..3f1737b8 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -1337,11 +1337,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/fy/LC_MESSAGES/fdroidserver.po b/locale/fy/LC_MESSAGES/fdroidserver.po index 222247f6..9ef4f3ff 100644 --- a/locale/fy/LC_MESSAGES/fdroidserver.po +++ b/locale/fy/LC_MESSAGES/fdroidserver.po @@ -1290,11 +1290,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/he/LC_MESSAGES/fdroidserver.po b/locale/he/LC_MESSAGES/fdroidserver.po index dbea96c5..3b2eada3 100644 --- a/locale/he/LC_MESSAGES/fdroidserver.po +++ b/locale/he/LC_MESSAGES/fdroidserver.po @@ -1291,11 +1291,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/hi/LC_MESSAGES/fdroidserver.po b/locale/hi/LC_MESSAGES/fdroidserver.po index b1c93645..9f1aed1a 100644 --- a/locale/hi/LC_MESSAGES/fdroidserver.po +++ b/locale/hi/LC_MESSAGES/fdroidserver.po @@ -1291,11 +1291,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index b9f8ee7b..10574fc7 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -1308,11 +1308,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index 70e087f8..ad5e0f79 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -1294,11 +1294,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 69d9b987..7cd18bd2 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -1316,11 +1316,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 8440cedd..eb66c43e 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -1289,11 +1289,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index cdda5b0a..4f91c27a 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -1295,11 +1295,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index 16b8a1e2..5ef07d11 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -1297,11 +1297,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/lv/LC_MESSAGES/fdroidserver.po b/locale/lv/LC_MESSAGES/fdroidserver.po index 20d8713d..2c7bdbe9 100644 --- a/locale/lv/LC_MESSAGES/fdroidserver.po +++ b/locale/lv/LC_MESSAGES/fdroidserver.po @@ -1290,11 +1290,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/ml/LC_MESSAGES/fdroidserver.po b/locale/ml/LC_MESSAGES/fdroidserver.po index 0f35cd13..3033eb79 100644 --- a/locale/ml/LC_MESSAGES/fdroidserver.po +++ b/locale/ml/LC_MESSAGES/fdroidserver.po @@ -1295,11 +1295,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index 5c302b21..8cb4f322 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -1347,11 +1347,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index a5f0f6e2..3fdfed3f 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -1299,11 +1299,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index e518d6c0..072de80d 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -1306,11 +1306,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 4986e1f8..1ecec5d7 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -1301,11 +1301,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 824a49c2..8b5bdefc 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -1309,11 +1309,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "Um dos itens de configuração 'github_releases' está faltando o valor 'projectUrl'. ignorando ..." #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "Um dos itens de configuração 'github_releases' está faltando o valor 'packageNames'. ignorando ..." #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "Um dos itens de configuração 'github_releases' está faltando o valor 'token'. ignorando ..." #: ../fdroidserver/update.py diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 8abe1d38..2d0f8fb3 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -1302,11 +1302,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 0d0e6456..b65aee1e 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -1304,11 +1304,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 11f345a0..52de30cb 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -1315,11 +1315,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/sk/LC_MESSAGES/fdroidserver.po b/locale/sk/LC_MESSAGES/fdroidserver.po index 819fade6..93895a06 100644 --- a/locale/sk/LC_MESSAGES/fdroidserver.po +++ b/locale/sk/LC_MESSAGES/fdroidserver.po @@ -1291,11 +1291,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index aa35d795..6baea0c5 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -1299,11 +1299,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index 0cd559ce..5cd00f02 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -1303,11 +1303,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index 83e44806..67b01277 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -1296,11 +1296,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index 8713c384..9c5e17ba 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -1300,11 +1300,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/ta/LC_MESSAGES/fdroidserver.po b/locale/ta/LC_MESSAGES/fdroidserver.po index f76bb61b..7bc91745 100644 --- a/locale/ta/LC_MESSAGES/fdroidserver.po +++ b/locale/ta/LC_MESSAGES/fdroidserver.po @@ -1291,11 +1291,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index bb97dea9..189d20c8 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -1301,11 +1301,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/tzm/LC_MESSAGES/fdroidserver.po b/locale/tzm/LC_MESSAGES/fdroidserver.po index 22d89df4..6787c8ff 100644 --- a/locale/tzm/LC_MESSAGES/fdroidserver.po +++ b/locale/tzm/LC_MESSAGES/fdroidserver.po @@ -1290,11 +1290,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/ug/LC_MESSAGES/fdroidserver.po b/locale/ug/LC_MESSAGES/fdroidserver.po index 05623704..e20af57e 100644 --- a/locale/ug/LC_MESSAGES/fdroidserver.po +++ b/locale/ug/LC_MESSAGES/fdroidserver.po @@ -1292,11 +1292,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 3ed4a40a..f4176a26 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -1309,11 +1309,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index b1858e51..34f2682e 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -1327,11 +1327,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 12446cd7..f73872ba 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -1317,11 +1317,11 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config itmes is missing the 'token' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py From 5da4e670dd363538fab2422660a668ce44b095e7 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Thu, 12 Sep 2024 19:08:25 +0800 Subject: [PATCH 1659/2116] import_subcommand.py: format --- fdroidserver/import_subcommand.py | 81 ++++++++++++++++++++----------- pyproject.toml | 2 - tests/import_subcommand.TestCase | 9 ++-- 3 files changed, 57 insertions(+), 35 deletions(-) diff --git a/fdroidserver/import_subcommand.py b/fdroidserver/import_subcommand.py index 3902250e..badb9ffb 100644 --- a/fdroidserver/import_subcommand.py +++ b/fdroidserver/import_subcommand.py @@ -18,32 +18,29 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import json +import logging import os import re -import stat -import urllib - -import git -import json import shutil +import stat import sys -import yaml +import urllib from argparse import ArgumentParser -import logging from pathlib import Path from typing import Optional +import git +import yaml + try: from yaml import CSafeLoader as SafeLoader except ImportError: from yaml import SafeLoader -from . import _ -from . import common -from . import metadata +from . import _, common, metadata from .exception import FDroidException - config = None @@ -122,7 +119,7 @@ def getrepofrompage(url: str) -> tuple[Optional[str], str]: index = page.find('hg clone') if index != -1: repotype = 'hg' - repo = page[index + 9:] + repo = page[index + 9 :] index = repo.find('<') if index == -1: return (None, _("Error while getting repo address")) @@ -134,7 +131,7 @@ def getrepofrompage(url: str) -> tuple[Optional[str], str]: index = page.find('git clone') if index != -1: repotype = 'git' - repo = page[index + 10:] + repo = page[index + 10 :] index = repo.find('<') if index == -1: return (None, _("Error while getting repo address")) @@ -243,18 +240,37 @@ def main(): # Parse command line... parser = ArgumentParser() common.setup_global_opts(parser) - parser.add_argument("-u", "--url", default=None, - help=_("Project URL to import from.")) - parser.add_argument("-s", "--subdir", default=None, - help=_("Path to main Android project subdirectory, if not in root.")) - parser.add_argument("-c", "--categories", default=None, - help=_("Comma separated list of categories.")) - parser.add_argument("-l", "--license", default=None, - help=_("Overall license of the project.")) - parser.add_argument("--omit-disable", action="store_true", default=False, - help=_("Do not add 'disable:' to the generated build entries")) - parser.add_argument("--rev", default=None, - help=_("Allows a different revision (or git branch) to be specified for the initial import")) + parser.add_argument( + "-u", "--url", default=None, help=_("Project URL to import from.") + ) + parser.add_argument( + "-s", + "--subdir", + default=None, + help=_("Path to main Android project subdirectory, if not in root."), + ) + parser.add_argument( + "-c", + "--categories", + default=None, + help=_("Comma separated list of categories."), + ) + parser.add_argument( + "-l", "--license", default=None, help=_("Overall license of the project.") + ) + parser.add_argument( + "--omit-disable", + action="store_true", + default=False, + help=_("Do not add 'disable:' to the generated build entries"), + ) + parser.add_argument( + "--rev", + default=None, + help=_( + "Allows a different revision (or git branch) to be specified for the initial import" + ), + ) metadata.add_metadata_arguments(parser) options = common.parse_args(parser) metadata.warnings_action = options.W @@ -268,7 +284,9 @@ def main(): local_metadata_files = common.get_local_metadata_files() if local_metadata_files: - raise FDroidException(_("This repo already has local metadata: %s") % local_metadata_files[0]) + raise FDroidException( + _("This repo already has local metadata: %s") % local_metadata_files[0] + ) build = metadata.Build() if options.url is None and Path('.git').is_dir(): @@ -294,7 +312,9 @@ def main(): git_repo = git.Repo(tmp_importer_dir) if not options.omit_disable: - build.disable = 'Generated by `fdroid import` - check version fields and commitid' + build.disable = ( + 'Generated by `fdroid import` - check version fields and commitid' + ) write_local_file = False else: raise FDroidException("Specify project url.") @@ -405,8 +425,11 @@ def main(): Path('build').mkdir(exist_ok=True) build_dir = Path('build') / appid if build_dir.exists(): - logging.warning(_('{path} already exists, ignoring import results!') - .format(path=build_dir)) + logging.warning( + _('{path} already exists, ignoring import results!').format( + path=build_dir + ) + ) sys.exit(1) elif tmp_importer_dir: # For Windows: Close the repo or a git.exe instance holds handles to repo diff --git a/pyproject.toml b/pyproject.toml index a64bae4e..a6262ae2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,4 +1,3 @@ - # We ignore the following PEP8 warnings # * E123: closing bracket does not match indentation of opening bracket's line # - Broken if multiple indentation levels start on a single line @@ -38,7 +37,6 @@ force-exclude = '''( | fdroidserver/build\.py | fdroidserver/checkupdates\.py | fdroidserver/common\.py - | fdroidserver/import_subcommand\.py | fdroidserver/index\.py | fdroidserver/metadata\.py | fdroidserver/nightly\.py diff --git a/tests/import_subcommand.TestCase b/tests/import_subcommand.TestCase index b37c2f37..646ef019 100755 --- a/tests/import_subcommand.TestCase +++ b/tests/import_subcommand.TestCase @@ -2,29 +2,30 @@ # http://www.drdobbs.com/testing/unit-testing-with-python/240165163 -import git import logging import os import shutil import sys import tempfile import unittest -import yaml -from unittest import mock from pathlib import Path +from unittest import mock +import git import requests +import yaml localmodule = Path(__file__).resolve().parent.parent print('localmodule: ' + str(localmodule)) if localmodule not in sys.path: sys.path.insert(0, str(localmodule)) +from testcommon import TmpCwd, mkdtemp, parse_args_for_test + import fdroidserver.common import fdroidserver.import_subcommand import fdroidserver.metadata from fdroidserver.exception import FDroidException -from testcommon import TmpCwd, mkdtemp, parse_args_for_test class ImportTest(unittest.TestCase): From faac9b38c8629cf431cc109c621e7839a5058722 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Thu, 12 Sep 2024 21:47:33 +0800 Subject: [PATCH 1660/2116] import_subcommand.py: move functions from common.py These functions are only used in this file --- fdroidserver/common.py | 34 ---------------------- fdroidserver/import_subcommand.py | 44 +++++++++++++++++++++++++++-- tests/common.TestCase | 39 ------------------------- tests/import_subcommand.TestCase | 47 ++++++++++++++++++++++++++++++- 4 files changed, 88 insertions(+), 76 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 87e26d3e..dcd53b59 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -101,9 +101,6 @@ VALID_APPLICATION_ID_REGEX = re.compile(r'''(?:^[a-z_]+(?:\d*[a-zA-Z_]*)*)(?:\.[ re.IGNORECASE) ANDROID_PLUGIN_REGEX = re.compile(r'''\s*(:?apply plugin:|id)\(?\s*['"](android|com\.android\.application)['"]\s*\)?''') -SETTINGS_GRADLE_REGEX = re.compile(r'settings\.gradle(?:\.kts)?') -GRADLE_SUBPROJECT_REGEX = re.compile(r'''['"]:?([^'"]+)['"]''') - MAX_VERSION_CODE = 0x7fffffff # Java's Integer.MAX_VALUE (2147483647) XMLNS_ANDROID = '{http://schemas.android.com/apk/res/android}' @@ -2120,37 +2117,6 @@ def is_strict_application_id(name): and '.' in name -def get_all_gradle_and_manifests(build_dir): - paths = [] - # TODO: Python3.6: Accepts a path-like object. - for root, dirs, files in os.walk(str(build_dir)): - for f in sorted(files): - if f == 'AndroidManifest.xml' \ - or f.endswith('.gradle') or f.endswith('.gradle.kts'): - full = Path(root) / f - paths.append(full) - return paths - - -def get_gradle_subdir(build_dir, paths): - """Get the subdir where the gradle build is based.""" - first_gradle_dir = None - for path in paths: - if not first_gradle_dir: - first_gradle_dir = path.parent.relative_to(build_dir) - if path.exists() and SETTINGS_GRADLE_REGEX.match(str(path.name)): - for m in GRADLE_SUBPROJECT_REGEX.finditer(path.read_text(encoding='utf-8')): - for f in (path.parent / m.group(1)).glob('build.gradle*'): - with f.open(encoding='utf-8') as fp: - for line in fp.readlines(): - if ANDROID_PLUGIN_REGEX.match(line): - return f.parent.relative_to(build_dir) - if first_gradle_dir and first_gradle_dir != Path('.'): - return first_gradle_dir - - return - - def parse_srclib_spec(spec): if type(spec) != str: diff --git a/fdroidserver/import_subcommand.py b/fdroidserver/import_subcommand.py index badb9ffb..e2d1e290 100644 --- a/fdroidserver/import_subcommand.py +++ b/fdroidserver/import_subcommand.py @@ -43,6 +43,46 @@ from .exception import FDroidException config = None +SETTINGS_GRADLE_REGEX = re.compile(r'settings\.gradle(?:\.kts)?') +GRADLE_SUBPROJECT_REGEX = re.compile(r'''['"]:?([^'"]+)['"]''') +APPLICATION_ID_REGEX = re.compile(r'''\s*applicationId\s=?\s?['"].*['"]''') + + +def get_all_gradle_and_manifests(build_dir): + paths = [] + # TODO: Python3.6: Accepts a path-like object. + for root, dirs, files in os.walk(str(build_dir)): + for f in sorted(files): + if ( + f == 'AndroidManifest.xml' + or f.endswith('.gradle') + or f.endswith('.gradle.kts') + ): + full = Path(root) / f + paths.append(full) + return paths + + +def get_gradle_subdir(build_dir, paths): + """Get the subdir where the gradle build is based.""" + first_gradle_dir = None + for path in paths: + if not first_gradle_dir: + first_gradle_dir = path.parent.relative_to(build_dir) + if path.exists() and SETTINGS_GRADLE_REGEX.match(path.name): + for m in GRADLE_SUBPROJECT_REGEX.finditer(path.read_text(encoding='utf-8')): + for f in (path.parent / m.group(1)).glob('build.gradle*'): + with f.open(encoding='utf-8') as fp: + for line in fp.readlines(): + if common.ANDROID_PLUGIN_REGEX.match( + line + ) or APPLICATION_ID_REGEX.match(line): + return f.parent.relative_to(build_dir) + if first_gradle_dir and first_gradle_dir != Path('.'): + return first_gradle_dir + + return + def handle_retree_error_on_windows(function, path, excinfo): """Python can't remove a readonly file on Windows so chmod first.""" @@ -323,8 +363,8 @@ def main(): build.commit = common.get_head_commit_id(git_repo) # Extract some information... - paths = common.get_all_gradle_and_manifests(tmp_importer_dir) - subdir = common.get_gradle_subdir(tmp_importer_dir, paths) + paths = get_all_gradle_and_manifests(tmp_importer_dir) + gradle_subdir = get_gradle_subdir(tmp_importer_dir, paths) if paths: versionName, versionCode, appid = common.parse_androidmanifests(paths, app) if not appid: diff --git a/tests/common.TestCase b/tests/common.TestCase index 48e668fc..cf961f8d 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1522,45 +1522,6 @@ class CommonTest(unittest.TestCase): self.assertEqual(('2021-06-30', 34, 'de.varengold.activeTAN'), fdroidserver.common.parse_androidmanifests(paths, app)) - def test_get_all_gradle_and_manifests(self): - """Test whether the function works with relative and absolute paths""" - a = fdroidserver.common.get_all_gradle_and_manifests(Path('source-files/cn.wildfirechat.chat')) - paths = [ - 'avenginekit/build.gradle', - 'build.gradle', - 'chat/build.gradle', - 'client/build.gradle', - 'client/src/main/AndroidManifest.xml', - 'emojilibrary/build.gradle', - 'gradle/build_libraries.gradle', - 'imagepicker/build.gradle', - 'mars-core-release/build.gradle', - 'push/build.gradle', - 'settings.gradle', - ] - paths = [Path('source-files/cn.wildfirechat.chat') / path for path in paths] - self.assertEqual(sorted(paths), sorted(a)) - - abspath = Path(self.basedir) / 'source-files/realm' - p = fdroidserver.common.get_all_gradle_and_manifests(abspath) - self.assertEqual(1, len(p)) - self.assertTrue(p[0].is_relative_to(abspath)) - - def test_get_gradle_subdir(self): - subdirs = { - 'cn.wildfirechat.chat': 'chat', - 'com.anpmech.launcher': 'app', - 'org.tasks': 'app', - 'ut.ewh.audiometrytest': 'app', - 'org.noise_planet.noisecapture': 'app', - } - for k, v in subdirs.items(): - build_dir = Path('source-files') / k - paths = fdroidserver.common.get_all_gradle_and_manifests(build_dir) - logging.info(paths) - subdir = fdroidserver.common.get_gradle_subdir(build_dir, paths) - self.assertEqual(v, str(subdir)) - def test_parse_srclib_spec_good(self): self.assertEqual(fdroidserver.common.parse_srclib_spec('osmand-external-skia@android/oreo'), ('osmand-external-skia', 'android/oreo', None, None)) diff --git a/tests/import_subcommand.TestCase b/tests/import_subcommand.TestCase index 646ef019..411f500d 100755 --- a/tests/import_subcommand.TestCase +++ b/tests/import_subcommand.TestCase @@ -42,6 +42,49 @@ class ImportTest(unittest.TestCase): os.chdir(self.basedir) self._td.cleanup() + def test_get_all_gradle_and_manifests(self): + """Test whether the function works with relative and absolute paths""" + a = fdroidserver.import_subcommand.get_all_gradle_and_manifests( + Path('source-files/cn.wildfirechat.chat') + ) + paths = [ + 'avenginekit/build.gradle', + 'build.gradle', + 'chat/build.gradle', + 'client/build.gradle', + 'client/src/main/AndroidManifest.xml', + 'emojilibrary/build.gradle', + 'gradle/build_libraries.gradle', + 'imagepicker/build.gradle', + 'mars-core-release/build.gradle', + 'push/build.gradle', + 'settings.gradle', + ] + paths = [Path('source-files/cn.wildfirechat.chat') / path for path in paths] + self.assertEqual(sorted(paths), sorted(a)) + + abspath = Path(self.basedir) / 'source-files/realm' + p = fdroidserver.import_subcommand.get_all_gradle_and_manifests(abspath) + self.assertEqual(1, len(p)) + self.assertTrue(p[0].is_relative_to(abspath)) + + def test_get_gradle_subdir(self): + subdirs = { + 'cn.wildfirechat.chat': 'chat', + 'com.anpmech.launcher': 'app', + 'org.tasks': 'app', + 'ut.ewh.audiometrytest': 'app', + 'org.noise_planet.noisecapture': 'app', + } + for k, v in subdirs.items(): + build_dir = Path('source-files') / k + paths = fdroidserver.import_subcommand.get_all_gradle_and_manifests( + build_dir + ) + logging.info(paths) + subdir = fdroidserver.import_subcommand.get_gradle_subdir(build_dir, paths) + self.assertEqual(v, str(subdir)) + def test_import_gitlab(self): with tempfile.TemporaryDirectory() as testdir, TmpCwd(testdir): # FDroidPopen needs some config to work @@ -107,7 +150,9 @@ class ImportTest(unittest.TestCase): self.assertEqual(url, app.Repo) self.assertEqual(url, app.SourceCode) logging.info(build_dir) - paths = fdroidserver.common.get_all_gradle_and_manifests(build_dir) + paths = fdroidserver.import_subcommand.get_all_gradle_and_manifests( + build_dir + ) self.assertNotEqual(paths, []) ( versionName, From 8648954f19394f597ea7907f6bf98985249c21b7 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Mon, 16 Sep 2024 19:43:29 +0800 Subject: [PATCH 1661/2116] import_subcommand.py: misc fixes and updates --- fdroidserver/import_subcommand.py | 71 +++++++++++-------------------- 1 file changed, 26 insertions(+), 45 deletions(-) diff --git a/fdroidserver/import_subcommand.py b/fdroidserver/import_subcommand.py index e2d1e290..b9f9a4c4 100644 --- a/fdroidserver/import_subcommand.py +++ b/fdroidserver/import_subcommand.py @@ -50,14 +50,9 @@ APPLICATION_ID_REGEX = re.compile(r'''\s*applicationId\s=?\s?['"].*['"]''') def get_all_gradle_and_manifests(build_dir): paths = [] - # TODO: Python3.6: Accepts a path-like object. - for root, dirs, files in os.walk(str(build_dir)): + for root, dirs, files in os.walk(build_dir): for f in sorted(files): - if ( - f == 'AndroidManifest.xml' - or f.endswith('.gradle') - or f.endswith('.gradle.kts') - ): + if f == 'AndroidManifest.xml' or f.endswith(('.gradle', '.gradle.kts')): full = Path(root) / f paths.append(full) return paths @@ -73,7 +68,7 @@ def get_gradle_subdir(build_dir, paths): for m in GRADLE_SUBPROJECT_REGEX.finditer(path.read_text(encoding='utf-8')): for f in (path.parent / m.group(1)).glob('build.gradle*'): with f.open(encoding='utf-8') as fp: - for line in fp.readlines(): + for line in fp: if common.ANDROID_PLUGIN_REGEX.match( line ) or APPLICATION_ID_REGEX.match(line): @@ -81,8 +76,6 @@ def get_gradle_subdir(build_dir, paths): if first_gradle_dir and first_gradle_dir != Path('.'): return first_gradle_dir - return - def handle_retree_error_on_windows(function, path, excinfo): """Python can't remove a readonly file on Windows so chmod first.""" @@ -137,6 +130,7 @@ def getrepofrompage(url: str) -> tuple[Optional[str], str]: The found repository type or None if an error occured. address_or_reason The address to the found repository or the reason if an error occured. + """ if not url.startswith('http'): return (None, _('{url} does not start with "http"!'.format(url=url))) @@ -205,6 +199,7 @@ def get_app_from_url(url: str) -> metadata.App: If the VCS type could not be determined. :exc:`ValueError` If the URL is invalid. + """ parsed = urllib.parse.urlparse(url) invalid_url = False @@ -280,33 +275,25 @@ def main(): # Parse command line... parser = ArgumentParser() common.setup_global_opts(parser) - parser.add_argument( - "-u", "--url", default=None, help=_("Project URL to import from.") - ) + parser.add_argument("-u", "--url", help=_("Project URL to import from.")) parser.add_argument( "-s", "--subdir", - default=None, help=_("Path to main Android project subdirectory, if not in root."), ) parser.add_argument( "-c", "--categories", - default=None, help=_("Comma separated list of categories."), ) - parser.add_argument( - "-l", "--license", default=None, help=_("Overall license of the project.") - ) + parser.add_argument("-l", "--license", help=_("Overall license of the project.")) parser.add_argument( "--omit-disable", action="store_true", - default=False, help=_("Do not add 'disable:' to the generated build entries"), ) parser.add_argument( "--rev", - default=None, help=_( "Allows a different revision (or git branch) to be specified for the initial import" ), @@ -329,21 +316,15 @@ def main(): ) build = metadata.Build() + app = metadata.App() if options.url is None and Path('.git').is_dir(): - app = metadata.App() - app.AutoName = Path.cwd().name app.RepoType = 'git' - - if Path('build.gradle').exists() or Path('build.gradle.kts').exists(): - build.gradle = ['yes'] - - git_repo = git.Repo(Path.cwd()) + tmp_importer_dir = Path.cwd() + git_repo = git.Repo(tmp_importer_dir) for remote in git.Remote.iter_items(git_repo): if remote.name == 'origin': url = git_repo.remotes.origin.url - if url.startswith('https://git'): # github, gitlab - app.SourceCode = url.rstrip('.git') - app.Repo = url + app = get_app_from_url(url) break write_local_file = True elif options.url: @@ -359,6 +340,7 @@ def main(): else: raise FDroidException("Specify project url.") + app.AutoUpdateMode = 'Version' app.UpdateCheckMode = 'Tags' build.commit = common.get_head_commit_id(git_repo) @@ -382,16 +364,15 @@ def main(): # Create a build line... build.versionName = versionName or 'Unknown' + app.CurrentVersion = build.versionName build.versionCode = versionCode or 0 + app.CurrentVersionCode = build.versionCode if options.subdir: build.subdir = options.subdir - build.gradle = ['yes'] - elif subdir: - build.subdir = subdir.as_posix() - build.gradle = ['yes'] - else: - # subdir might be None - subdir = Path() + elif gradle_subdir: + build.subdir = gradle_subdir.as_posix() + # subdir might be None + subdir = Path(tmp_importer_dir / build.subdir) if build.subdir else tmp_importer_dir if options.license: app.License = options.license @@ -399,23 +380,23 @@ def main(): app.Categories = options.categories.split(',') if (subdir / 'jni').exists(): build.buildjni = ['yes'] - if (subdir / 'build.gradle').exists() or (subdir / 'build.gradle').exists(): + if (subdir / 'build.gradle').exists() or (subdir / 'build.gradle.kts').exists(): build.gradle = ['yes'] + app.AutoName = common.fetch_real_name(subdir, build.gradle) + package_json = tmp_importer_dir / 'package.json' # react-native pubspec_yaml = tmp_importer_dir / 'pubspec.yaml' # flutter if package_json.exists(): build.sudo = [ 'sysctl fs.inotify.max_user_watches=524288 || true', - 'curl -Lo node.tar.gz https://nodejs.org/download/release/v19.3.0/node-v19.3.0-linux-x64.tar.gz', - 'echo "b525028ae5bb71b5b32cb7fce903ccce261dbfef4c7dd0f3e0ffc27cd6fc0b3f node.tar.gz" | sha256sum -c -', - 'tar xzf node.tar.gz --strip-components=1 -C /usr/local/', - 'npm -g install yarn', + 'apt-get update', + 'apt-get install -y npm', ] build.init = ['npm install --build-from-source'] with package_json.open() as fp: data = json.load(fp) - app.AutoName = data.get('name', app.AutoName) + app.AutoName = app.AutoName or data.get('name') app.License = data.get('license', app.License) app.Description = data.get('description', app.Description) app.WebSite = data.get('homepage', app.WebSite) @@ -425,11 +406,11 @@ def main(): if app_json.exists(): with app_json.open() as fp: data = json.load(fp) - app.AutoName = data.get('name', app.AutoName) + app.AutoName = app.AutoName or data.get('name') if pubspec_yaml.exists(): with pubspec_yaml.open() as fp: data = yaml.load(fp, Loader=SafeLoader) - app.AutoName = data.get('name', app.AutoName) + app.AutoName = app.AutoName or data.get('name') app.License = data.get('license', app.License) app.Description = data.get('description', app.Description) app.UpdateCheckData = 'pubspec.yaml|version:\\s.+\\+(\\d+)|.|version:\\s(.+)\\+' From 5126a58af832d55dca48442f96857fafa55bd41f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 Jun 2024 09:36:54 +0200 Subject: [PATCH 1662/2116] deploy: rclone_config always as list to avoid code duplication --- fdroidserver/deploy.py | 41 ++++++----------------------------------- 1 file changed, 6 insertions(+), 35 deletions(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index b982f816..0d466245 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -299,8 +299,13 @@ def update_remote_storage_with_rclone( else: sources = [repo_section] + if isinstance(config['rclone_config'], str): + rclone_config = [config['rclone_config']] + else: + rclone_config = config['rclone_config'] + for source in sources: - if isinstance(config['rclone_config'], str): + for remote_config in rclone_config: rclone_sync_command = ( 'rclone sync ' + source @@ -333,40 +338,6 @@ def update_remote_storage_with_rclone( if subprocess.call(rclone_sync_command) != 0: raise FDroidException() - if isinstance(config['rclone_config'], list): - for remote_config in config['rclone_config']: - rclone_sync_command = ( - 'rclone sync ' - + source - + ' ' - + remote_config - + ':' - + config['awsbucket'] - + '/' - + upload_dir - ) - - rclone_sync_command = split(rclone_sync_command) - - if verbose: - rclone_sync_command += ['--verbose'] - elif quiet: - rclone_sync_command += ['--quiet'] - - if configfilename: - rclone_sync_command += split('--config=' + configfilename) - - complete_remote_path = ( - remote_config + ':' + config['awsbucket'] + '/' + upload_dir - ) - - logging.debug( - "rclone sync all files in " + source + ' to ' + complete_remote_path - ) - - if subprocess.call(rclone_sync_command) != 0: - raise FDroidException() - def update_awsbucket_libcloud(repo_section, is_index_only=False): """No summary. From fe3d929f672f9c8c99bdf28d18325c1ec6cf618d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 Jun 2024 09:38:15 +0200 Subject: [PATCH 1663/2116] deploy: lists for command lines to handle escaping fdroidserver uses lists of strings to handle the escaping command line arguments, this converts the rclone code to that pattern. --- fdroidserver/deploy.py | 25 +++++-------------------- tests/deploy.TestCase | 25 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 0d466245..da0e8d8d 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -30,7 +30,6 @@ from git import Repo import yaml from argparse import ArgumentParser import logging -from shlex import split import pathlib import shutil import git @@ -272,7 +271,7 @@ def update_remote_storage_with_rclone( logging.info('Custom configuration not found.') logging.info( 'Using default configuration at {}'.format( - subprocess.check_output(split("rclone config file")).decode("utf-8") + subprocess.check_output(['rclone', 'config', 'file'], text=True) ) ) configfilename = None @@ -281,7 +280,7 @@ def update_remote_storage_with_rclone( logging.info('Custom configuration not found.') logging.info( 'Using default configuration at {}'.format( - subprocess.check_output(split("rclone config file")).decode("utf-8") + subprocess.check_output(['rclone', 'config', 'file'], text=True) ) ) configfilename = None @@ -306,18 +305,8 @@ def update_remote_storage_with_rclone( for source in sources: for remote_config in rclone_config: - rclone_sync_command = ( - 'rclone sync ' - + source - + ' ' - + config['rclone_config'] - + ':' - + config['awsbucket'] - + '/' - + upload_dir - ) - - rclone_sync_command = split(rclone_sync_command) + complete_remote_path = f'{remote_config}:{config["awsbucket"]}/{upload_dir}' + rclone_sync_command = ['rclone', 'sync', source, complete_remote_path] if verbose: rclone_sync_command += ['--verbose'] @@ -325,11 +314,7 @@ def update_remote_storage_with_rclone( rclone_sync_command += ['--quiet'] if configfilename: - rclone_sync_command += split('--config=' + configfilename) - - complete_remote_path = ( - config['rclone_config'] + ':' + config['awsbucket'] + '/' + upload_dir - ) + rclone_sync_command += ['--config=' + configfilename] logging.debug( "rclone sync all files in " + source + ' to ' + complete_remote_path diff --git a/tests/deploy.TestCase b/tests/deploy.TestCase index 3d45625d..649f8d58 100755 --- a/tests/deploy.TestCase +++ b/tests/deploy.TestCase @@ -194,6 +194,31 @@ class DeployTest(unittest.TestCase): self.assertFalse(dest_apk.is_file()) self.assertTrue(dest_index.is_file()) + @mock.patch('subprocess.call') + @mock.patch('subprocess.check_output', lambda cmd, text: '/path/to/rclone.conf') + def test_update_remote_storage_with_rclone_mock(self, mock_call): + def _mock_subprocess_call(cmd): + self.assertEqual( + cmd, + [ + 'rclone', + 'sync', + 'repo', + 'test_local_config:test_bucket_folder/fdroid/repo', + ], + ) + return 0 + + mock_call.side_effect = _mock_subprocess_call + + fdroidserver.deploy.config = { + 'awsbucket': 'test_bucket_folder', + 'rclone': True, + 'rclone_config': 'test_local_config', + } + fdroidserver.deploy.update_remote_storage_with_rclone('repo') + mock_call.assert_called_once() + def test_update_serverwebroot(self): """rsync works with file paths, so this test uses paths for the URLs""" os.chdir(self.testdir) From 02f005280654e733ffc176b80d6119b5d5f55d50 Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Tue, 17 Sep 2024 11:32:33 +0000 Subject: [PATCH 1664/2116] scanner - jcenter is gone --- fdroidserver/scanner.py | 1 - 1 file changed, 1 deletion(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 62bf9ff2..94eddcc0 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -507,7 +507,6 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): re.compile(r'^https://' + re.escape(repo) + r'/*') for repo in [ 'repo1.maven.org/maven2', # mavenCentral() - 'jcenter.bintray.com', # jcenter() 'jitpack.io', 'www.jitpack.io', 'repo.maven.apache.org/maven2', From feb0fdfad6e78a8a7a658af3984a2f1d4d4a00b5 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 17 Sep 2024 12:50:47 +0200 Subject: [PATCH 1665/2116] add test files missing from MANIFEST.in --- MANIFEST.in | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/MANIFEST.in b/MANIFEST.in index 19f9a743..ff54de79 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -757,6 +757,8 @@ include tests/source-files/com.anpmech.launcher/app/src/main/AndroidManifest.xml include tests/source-files/com.anpmech.launcher/build.gradle include tests/source-files/com.anpmech.launcher/settings.gradle include tests/source-files/com.github.jameshnsears.quoteunquote/build.gradle +include tests/source-files/com.github.shadowsocks/core/build.gradle.kts +include tests/source-files/com.github.shadowsocks/mobile/build.gradle.kts include tests/source-files/com.integreight.onesheeld/build.gradle include tests/source-files/com.integreight.onesheeld/gradle/wrapper/gradle-wrapper.properties include tests/source-files/com.integreight.onesheeld/localeapi/build.gradle @@ -800,6 +802,7 @@ include tests/source-files/firebase-allowlisted/build.gradle include tests/source-files/firebase-suspect/app/build.gradle include tests/source-files/firebase-suspect/build.gradle include tests/source-files/info.guardianproject.ripple/build.gradle +include tests/source-files/lockfile.test/flutter/.dart_tool/flutter_gen/pubspec.yaml include tests/source-files/lockfile.test/flutter/pubspec.lock include tests/source-files/lockfile.test/flutter/pubspec.yaml include tests/source-files/lockfile.test/javascript/package.json @@ -821,6 +824,7 @@ include tests/source-files/org.tasks/buildSrc/build.gradle.kts include tests/source-files/org.tasks/settings.gradle.kts include tests/source-files/osmandapp/osmand/build.gradle include tests/source-files/osmandapp/osmand/gradle/wrapper/gradle-wrapper.properties +include tests/source-files/OtakuWorld/build.gradle include tests/source-files/realm/react-native/android/build.gradle include tests/source-files/se.manyver/android/app/build.gradle include tests/source-files/se.manyver/android/build.gradle From afc31e115e00ac2c00a2586c8e821004857e80e4 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Thu, 19 Sep 2024 19:53:11 +0800 Subject: [PATCH 1666/2116] Show \r when diffing reproducible apk --- fdroidserver/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index dcd53b59..29a5747d 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3854,7 +3854,7 @@ def compare_apks(apk1, apk2, tmp_dir, log_dir=None): if len(lines) != 1 or 'META-INF' not in lines[0]: if set_command_in_config('meld'): p = FDroidPopen([config['meld'], apk1dir, apk2dir], output=False) - return "Unexpected diff output:\n" + p.output + return "Unexpected diff output:\n" + p.output.replace("\r", "^M") # since everything verifies, delete the comparison to keep cruft down shutil.rmtree(apk1dir) From 043492277e3d69e573f618df6ac4b9d8542b7429 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sat, 21 Sep 2024 17:19:02 +0200 Subject: [PATCH 1667/2116] scanner: always use built-in ruleset when running tests The SUSS rule sets are changing all the time, but the test cases are not. So this makes the test cases just use the built-in ruleset so the test cases don't randomly break. --- fdroidserver/scanner.py | 6 +++++- tests/scanner.TestCase | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 94eddcc0..ee26fce4 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -354,6 +354,8 @@ class SUSSDataController(SignatureDataController): class ScannerTool: + refresh_allowed = True + def __init__(self): # we could add support for loading additional signature source # definitions from config.yml here @@ -362,7 +364,9 @@ class ScannerTool: options = common.get_options() options_refresh_scanner = ( - hasattr(options, "refresh_scanner") and options.refresh_scanner + hasattr(options, "refresh_scanner") + and options.refresh_scanner + and ScannerTool.refresh_allowed ) if options_refresh_scanner or common.get_config().get('refresh_scanner'): self.refresh() diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 3127f023..9d0440c0 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -33,6 +33,11 @@ import fdroidserver.scanner from testcommon import TmpCwd, mkdtemp, mock_open_to_str, parse_args_for_test +# Always use built-in default rules so changes in downloaded rules don't break tests. +@mock.patch( + 'fdroidserver.scanner.SUSSDataController.load', + fdroidserver.scanner.SUSSDataController.load_from_defaults, +) class ScannerTest(unittest.TestCase): def setUp(self): logging.basicConfig(level=logging.INFO) @@ -40,6 +45,7 @@ class ScannerTest(unittest.TestCase): os.chdir(self.basedir) self._td = mkdtemp() self.testdir = self._td.name + fdroidserver.scanner.ScannerTool.refresh_allowed = False def tearDown(self): os.chdir(self.basedir) @@ -712,6 +718,7 @@ class Test_ScannerTool(unittest.TestCase): os.chdir(self.basedir) self._td = mkdtemp() self.testdir = self._td.name + fdroidserver.scanner.ScannerTool.refresh_allowed = True def tearDown(self): fdroidserver.common.options = None From 0cee694c43d58bd1f298c0ac110592f00439cd66 Mon Sep 17 00:00:00 2001 From: Leo Heitmann Ruiz Date: Mon, 23 Sep 2024 07:59:08 +0000 Subject: [PATCH 1668/2116] Remove all mentions of Flattr --- .gitlab-ci.yml | 1 + fdroidserver/index.py | 2 -- fdroidserver/lint.py | 4 ---- fdroidserver/metadata.py | 6 ------ tests/funding-usernames.yaml | 1 - tests/metadata-rewrite-yml/org.fdroid.fdroid.yml | 1 - tests/metadata/dump/app.with.special.build.params.yaml | 1 - tests/metadata/dump/com.politedroid.yaml | 1 - tests/metadata/dump/org.adaway.yaml | 1 - tests/metadata/dump/org.smssecure.smssecure.yaml | 1 - tests/metadata/dump/org.videolan.vlc.yaml | 1 - tests/metadata/org.adaway.yml | 1 - tests/metadata/org.fdroid.fdroid.yml | 1 - tests/metadata/souch.smsbypass.yml | 1 - tests/repo/entry.json | 2 +- tests/repo/index-v1.json | 1 - tests/repo/index-v2.json | 1 - tests/repo/index.xml | 1 - tests/update.TestCase | 2 -- 19 files changed, 2 insertions(+), 28 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 39ec8223..90e3672a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -59,6 +59,7 @@ metadata_v0: - ../tests/dump_internal_metadata_format.py - sed -i -e '/ArchivePolicy:/d' + -e '/FlattrID:/d' -e '/RequiresRoot:/d' metadata/dump_*/*.yaml - diff -uw metadata/dump_* diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 3fe533bd..a3bcf9a3 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -509,7 +509,6 @@ def package_metadata(app, repodir): "AuthorPhone", "AuthorWebSite", "Bitcoin", - "FlattrID", "Liberapay", "Litecoin", "OpenCollective", @@ -1169,7 +1168,6 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing addElementNonEmpty('donate', app.Donate, doc, apel) addElementNonEmpty('bitcoin', app.Bitcoin, doc, apel) addElementNonEmpty('litecoin', app.Litecoin, doc, apel) - addElementNonEmpty('flattr', app.FlattrID, doc, apel) addElementNonEmpty('openCollective', app.OpenCollective, doc, apel) # These elements actually refer to the current version (i.e. which diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index c4568dcb..11697371 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -159,10 +159,6 @@ regex_checks = { ], 'Donate': http_checks + [ - ( - re.compile(r'.*flattr\.com'), - _("Flattr donation methods belong in the FlattrID: field"), - ), ( re.compile(r'.*liberapay\.com'), _("Liberapay donation methods belong in the Liberapay: field"), diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index ce7e5ee8..1ebbe731 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -67,7 +67,6 @@ yaml_app_field_order = [ 'Translation', 'Changelog', 'Donate', - 'FlattrID', 'Liberapay', 'OpenCollective', 'Bitcoin', @@ -128,7 +127,6 @@ class App(dict): self.Translation = '' self.Changelog = '' self.Donate = None - self.FlattrID = None self.Liberapay = None self.OpenCollective = None self.Bitcoin = None @@ -408,10 +406,6 @@ class FieldValidator: # Generic value types valuetypes = { - FieldValidator("Flattr ID", - r'^[0-9a-z]+$', - ['FlattrID']), - FieldValidator("Liberapay", VALID_USERNAME_REGEX, ['Liberapay']), diff --git a/tests/funding-usernames.yaml b/tests/funding-usernames.yaml index 04c08a13..ccc8d8a2 100644 --- a/tests/funding-usernames.yaml +++ b/tests/funding-usernames.yaml @@ -17,7 +17,6 @@ custom: - https://email.faircode.eu/donate/ - https://etchdroid.depau.eu/donate/ - https://f-droid.org/about/ - - https://flattr.com/github/bk138 - https://gultsch.de/donate.html - https://jahir.dev/donate - https://kodi.tv/contribute/donate diff --git a/tests/metadata-rewrite-yml/org.fdroid.fdroid.yml b/tests/metadata-rewrite-yml/org.fdroid.fdroid.yml index ed59f61b..fdda453f 100644 --- a/tests/metadata-rewrite-yml/org.fdroid.fdroid.yml +++ b/tests/metadata-rewrite-yml/org.fdroid.fdroid.yml @@ -7,7 +7,6 @@ IssueTracker: https://gitlab.com/fdroid/fdroidclient/issues Translation: https://hosted.weblate.org/projects/f-droid/f-droid Changelog: https://gitlab.com/fdroid/fdroidclient/raw/HEAD/CHANGELOG.md Donate: https://f-droid.org/about -FlattrID: '343053' Bitcoin: 15u8aAPK4jJ5N8wpWJ5gutAyyeHtKX5i18 AutoName: F-Droid diff --git a/tests/metadata/dump/app.with.special.build.params.yaml b/tests/metadata/dump/app.with.special.build.params.yaml index 9698b639..43a311b5 100644 --- a/tests/metadata/dump/app.with.special.build.params.yaml +++ b/tests/metadata/dump/app.with.special.build.params.yaml @@ -345,7 +345,6 @@ Description: 'To configure, go to "Settings => Accounts & Sync => Add Account". Appbrain SDK was removed before building.' Disabled: null Donate: null -FlattrID: null IssueTracker: https://github.com/loadrunner/Facebook-Contact-Sync/issues Liberapay: null License: GPL-3.0-only diff --git a/tests/metadata/dump/com.politedroid.yaml b/tests/metadata/dump/com.politedroid.yaml index 57cce841..bec8edb4 100644 --- a/tests/metadata/dump/com.politedroid.yaml +++ b/tests/metadata/dump/com.politedroid.yaml @@ -170,7 +170,6 @@ CurrentVersionCode: 6 Description: Activates silent mode during calendar events. Disabled: null Donate: null -FlattrID: null IssueTracker: https://github.com/miguelvps/PoliteDroid/issues Liberapay: null License: GPL-3.0-only diff --git a/tests/metadata/dump/org.adaway.yaml b/tests/metadata/dump/org.adaway.yaml index cf448af3..d8755a91 100644 --- a/tests/metadata/dump/org.adaway.yaml +++ b/tests/metadata/dump/org.adaway.yaml @@ -1113,7 +1113,6 @@ Description: 'An ad blocker that uses the hosts file. The hosts file read-only.' Disabled: null Donate: http://sufficientlysecure.org/index.php/adaway -FlattrID: '369138' IssueTracker: https://github.com/dschuermann/ad-away/issues Liberapay: null License: GPL-3.0-only diff --git a/tests/metadata/dump/org.smssecure.smssecure.yaml b/tests/metadata/dump/org.smssecure.smssecure.yaml index b363b736..bf2afdff 100644 --- a/tests/metadata/dump/org.smssecure.smssecure.yaml +++ b/tests/metadata/dump/org.smssecure.smssecure.yaml @@ -383,7 +383,6 @@ Description: 'SMSSecure is an SMS/MMS application that allows you to protect you security by auditing the code.' Disabled: null Donate: null -FlattrID: null IssueTracker: https://github.com/SMSSecure/SMSSecure/issues Liberapay: null License: GPL-3.0-only diff --git a/tests/metadata/dump/org.videolan.vlc.yaml b/tests/metadata/dump/org.videolan.vlc.yaml index 7bcb7dc4..3a8448f7 100644 --- a/tests/metadata/dump/org.videolan.vlc.yaml +++ b/tests/metadata/dump/org.videolan.vlc.yaml @@ -2604,7 +2604,6 @@ Description: 'Video and audio player that supports a wide range of formats, ' Disabled: null Donate: http://www.videolan.org/contribute.html#money -FlattrID: null IssueTracker: http://www.videolan.org/support/index.html#bugs Liberapay: null License: GPL-3.0-only diff --git a/tests/metadata/org.adaway.yml b/tests/metadata/org.adaway.yml index 41bdb083..55afc876 100644 --- a/tests/metadata/org.adaway.yml +++ b/tests/metadata/org.adaway.yml @@ -7,7 +7,6 @@ SourceCode: https://github.com/dschuermann/ad-away IssueTracker: https://github.com/dschuermann/ad-away/issues Translation: https://www.transifex.com/dominikschuermann/adaway Donate: http://sufficientlysecure.org/index.php/adaway -FlattrID: '369138' AutoName: AdAway Summary: Block advertisements diff --git a/tests/metadata/org.fdroid.fdroid.yml b/tests/metadata/org.fdroid.fdroid.yml index 9471f9a6..949c4b0f 100644 --- a/tests/metadata/org.fdroid.fdroid.yml +++ b/tests/metadata/org.fdroid.fdroid.yml @@ -7,7 +7,6 @@ IssueTracker: https://gitlab.com/fdroid/fdroidclient/issues Translation: https://hosted.weblate.org/projects/f-droid/f-droid Changelog: https://gitlab.com/fdroid/fdroidclient/raw/HEAD/CHANGELOG.md Donate: https://f-droid.org/about -FlattrID: '343053' Bitcoin: 15u8aAPK4jJ5N8wpWJ5gutAyyeHtKX5i18 AutoName: F-Droid diff --git a/tests/metadata/souch.smsbypass.yml b/tests/metadata/souch.smsbypass.yml index 5733673a..ddc8edb7 100644 --- a/tests/metadata/souch.smsbypass.yml +++ b/tests/metadata/souch.smsbypass.yml @@ -5,7 +5,6 @@ WebSite: https://gitlab.com/souch/SMSbypass SourceCode: https://gitlab.com/souch/SMSbypass/tree/HEAD IssueTracker: https://gitlab.com/souch/SMSbypass/issues Donate: http://rodolphe.souchaud.free.fr/donate -FlattrID: cad90e036b975ed129a3ce80a0750466 AutoName: Battery level Summary: Filter SMS and show them in a fake app diff --git a/tests/repo/entry.json b/tests/repo/entry.json index bf6a2e76..c52f31ba 100644 --- a/tests/repo/entry.json +++ b/tests/repo/entry.json @@ -3,7 +3,7 @@ "version": 20002, "index": { "name": "/index-v2.json", - "sha256": "4a36d8cdb5b7a9e59d8c2e9e2a81b968db975901ff7dac12ca15449acf07cf35", + "sha256": "bef31251dd4bdfc34f9a9e7b93dbf3e0bc7172e17d1d72a550c10d1bc183c01c", "size": 53527, "numPackages": 10 }, diff --git a/tests/repo/index-v1.json b/tests/repo/index-v1.json index 33d0f9ce..ec2195b4 100644 --- a/tests/repo/index-v1.json +++ b/tests/repo/index-v1.json @@ -29,7 +29,6 @@ "suggestedVersionCode": "9", "description": "In order to keep away curious eyes, SMS-bypass filters incoming SMS messages\nbefore they reach your inbox. Based on bughunter2.smsfilter.\n\nFeatures:\n\n* Discrete fake app \"Battery level\": Long tap on Battery percentage will show SMS.\n* Filter incoming SMS specified address: redirect the SMS to SMS-bypass messages list; remove SMS arrival sound or vibration; show a discreet notification icon (battery level); vibrate if checked in settings\n* Add contact from contact list\n* Export messages to a text file", "donate": "http://rodolphe.souchaud.free.fr/donate", - "flattrID": "cad90e036b975ed129a3ce80a0750466", "issueTracker": "https://gitlab.com/souch/SMSbypass/issues", "license": "GPL-3.0-only", "sourceCode": "https://gitlab.com/souch/SMSbypass/tree/HEAD", diff --git a/tests/repo/index-v2.json b/tests/repo/index-v2.json index 3f55f038..ecb0fdc0 100644 --- a/tests/repo/index-v2.json +++ b/tests/repo/index-v2.json @@ -1392,7 +1392,6 @@ "license": "GPL-3.0-only", "sourceCode": "https://gitlab.com/souch/SMSbypass/tree/HEAD", "webSite": "https://gitlab.com/souch/SMSbypass", - "flattrID": "cad90e036b975ed129a3ce80a0750466", "name": { "en-US": "Battery level" }, diff --git a/tests/repo/index.xml b/tests/repo/index.xml index 24ebea24..4d7e8633 100644 --- a/tests/repo/index.xml +++ b/tests/repo/index.xml @@ -31,7 +31,6 @@ Features: https://gitlab.com/souch/SMSbypass/tree/HEAD https://gitlab.com/souch/SMSbypass/issues http://rodolphe.souchaud.free.fr/donate - cad90e036b975ed129a3ce80a0750466 0.9 9 diff --git a/tests/update.TestCase b/tests/update.TestCase index dbabcdd0..bf5dc7e7 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1390,7 +1390,6 @@ class UpdateTest(unittest.TestCase): Translation: Changelog: Donate: - FlattrID: Bitcoin: Litecoin: Name: @@ -1435,7 +1434,6 @@ class UpdateTest(unittest.TestCase): 'CurrentVersionCode': None, 'Disabled': '', 'Donate': '', - 'FlattrID': '', 'IssueTracker': '', 'License': '', 'Litecoin': '', From 2b9cb9cf3e5cc632ff23d2fb545702b996bab3dc Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 23 Sep 2024 10:11:46 +0200 Subject: [PATCH 1669/2116] gitlab-ci: include libcloud for tests --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 90e3672a..7c59285d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -108,6 +108,7 @@ debian_testing: ipfs-cid python3-biplist python3-defusedxml + python3-libcloud python3-pycountry python3-setuptools sdkmanager From 0d5c7516f2aa3ff40151e095df53b0ae05bd543b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 16 May 2024 11:55:01 +0200 Subject: [PATCH 1670/2116] throw error when CLI appid args end with a : but no Version Code This is already the behavior in read_app_args(), but wasn't implemented in read_pkg_args() yet. --- fdroidserver/common.py | 20 ++++++++++++++------ tests/common.TestCase | 7 +++++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 29a5747d..28ea3736 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -868,13 +868,13 @@ def get_local_metadata_files(): return glob.glob('.fdroid.[a-jl-z]*[a-rt-z]') -def read_pkg_args(appid_versionCode_pairs, allow_vercodes=False): +def read_pkg_args(appid_versionCode_pairs, allow_version_codes=False): """No summary. Parameters ---------- appids - arguments in the form of multiple appid:[vc] strings + arguments in the form of multiple appid:[versionCode] strings Returns ------- @@ -884,13 +884,18 @@ def read_pkg_args(appid_versionCode_pairs, allow_vercodes=False): if not appid_versionCode_pairs: return vercodes + error = False apk_regex = re.compile(r'_(\d+)\.apk$') for p in appid_versionCode_pairs: # Convert the apk name to a appid:versioncode pair p = apk_regex.sub(r':\1', p) - if allow_vercodes and ':' in p: + if allow_version_codes and ':' in p: package, vercode = p.split(':') - vercode = version_code_string_to_int(vercode) + try: + vercode = version_code_string_to_int(vercode) + except ValueError as e: + logging.error('"%s": %s' % (p, str(e))) + error = True else: package, vercode = p, None if package not in vercodes: @@ -899,6 +904,9 @@ def read_pkg_args(appid_versionCode_pairs, allow_vercodes=False): elif vercode and vercode not in vercodes[package]: vercodes[package] += [vercode] if vercode else [] + if error: + raise FDroidException(_("Found invalid versionCodes for some apps")) + return vercodes @@ -930,7 +938,7 @@ def get_metadata_files(vercodes): return metadatafiles -def read_app_args(appid_versionCode_pairs, allapps, allow_vercodes=False): +def read_app_args(appid_versionCode_pairs, allapps, allow_version_codes=False): """Build a list of App instances for processing. On top of what read_pkg_args does, this returns the whole app @@ -940,7 +948,7 @@ def read_app_args(appid_versionCode_pairs, allapps, allow_vercodes=False): returned. """ - vercodes = read_pkg_args(appid_versionCode_pairs, allow_vercodes) + vercodes = read_pkg_args(appid_versionCode_pairs, allow_version_codes) if not vercodes: return allapps diff --git a/tests/common.TestCase b/tests/common.TestCase index cf961f8d..a3a54bb7 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -2321,6 +2321,13 @@ class CommonTest(unittest.TestCase): fdroidserver.common.read_pkg_args(appid_versionCode_pairs, allow_vercodes), ) + def test_read_pkg_args_errors(self): + allow_vercodes = True + with self.assertRaises(FDroidException): + fdroidserver.common.read_pkg_args(['org.fdroid.fdroid:'], allow_vercodes), + with self.assertRaises(FDroidException): + fdroidserver.common.read_pkg_args(['org.fdroid.fdroid:foo'], allow_vercodes), + def test_apk_strip_v1_signatures(self): before = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') after = os.path.join(self.testdir, 'after.apk') From 528760acc89e04fda6c741158de301baf68b6e67 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sat, 14 Sep 2024 22:23:52 +0800 Subject: [PATCH 1671/2116] scanner.TestCase: format --- tests/scanner.TestCase | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 9d0440c0..98bab924 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -1,9 +1,11 @@ #!/usr/bin/env python3 +import collections import glob import inspect import logging import os +import pathlib import re import shutil import sys @@ -11,13 +13,12 @@ import tempfile import textwrap import unittest import uuid -import yaml import zipfile -import collections -import pathlib -from unittest import mock from dataclasses import asdict from datetime import datetime, timedelta +from unittest import mock + +import yaml localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') @@ -26,11 +27,12 @@ print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) +from testcommon import TmpCwd, mkdtemp, mock_open_to_str, parse_args_for_test + import fdroidserver.build import fdroidserver.common import fdroidserver.metadata import fdroidserver.scanner -from testcommon import TmpCwd, mkdtemp, mock_open_to_str, parse_args_for_test # Always use built-in default rules so changes in downloaded rules don't break tests. @@ -783,12 +785,13 @@ class Test_main(unittest.TestCase): (doesn't test how they get processed) """ self.args = ["com.example.app"] - with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir), mock.patch( - "sys.exit", self.exit_func - ), mock.patch("sys.argv", ["fdroid scanner", *self.args]), mock.patch( - "fdroidserver.common.read_app_args", self.read_app_args_func - ), mock.patch( - "fdroidserver.scanner.scan_binary", self.scan_binary_func + with ( + tempfile.TemporaryDirectory() as tmpdir, + TmpCwd(tmpdir), + mock.patch("sys.exit", self.exit_func), + mock.patch("sys.argv", ["fdroid scanner", *self.args]), + mock.patch("fdroidserver.common.read_app_args", self.read_app_args_func), + mock.patch("fdroidserver.scanner.scan_binary", self.scan_binary_func), ): fdroidserver.scanner.main() @@ -804,12 +807,13 @@ class Test_main(unittest.TestCase): (doesn't test how they get processed) """ self.args = ["local.application.apk"] - with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir), mock.patch( - "sys.exit", self.exit_func - ), mock.patch("sys.argv", ["fdroid scanner", *self.args]), mock.patch( - "fdroidserver.common.read_app_args", self.read_app_args_func - ), mock.patch( - "fdroidserver.scanner.scan_binary", self.scan_binary_func + with ( + tempfile.TemporaryDirectory() as tmpdir, + TmpCwd(tmpdir), + mock.patch("sys.exit", self.exit_func), + mock.patch("sys.argv", ["fdroid scanner", *self.args]), + mock.patch("fdroidserver.common.read_app_args", self.read_app_args_func), + mock.patch("fdroidserver.scanner.scan_binary", self.scan_binary_func), ): pathlib.Path(self.args[0]).touch() fdroidserver.scanner.main() From eff0ef48f4340d6fed12ede3d79c884c70e5b03f Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sun, 15 Sep 2024 02:03:26 +0800 Subject: [PATCH 1672/2116] scanner: support libs.versions.toml --- MANIFEST.in | 13 + fdroidserver/scanner.py | 240 ++++++++++++++++-- setup.py | 4 +- tests/scanner.TestCase | 90 +++++-- .../catalog.test/app/build.gradle | 2 + .../catalog.test/build.gradle.kts | 5 + .../catalog.test/gradle/libs.versions.toml | 15 ++ .../catalog.test/libs.versions.toml | 15 ++ .../catalog.test/settings.gradle.kts | 11 + .../com.lolo.io.onelist/app/build.gradle.kts | 118 +++++++++ .../com.lolo.io.onelist/build.gradle.kts | 11 + .../gradle/libs.versions.toml | 58 +++++ .../gradle/wrapper/gradle-wrapper.properties | 5 + .../com.lolo.io.onelist/settings.gradle | 9 + .../org.piepmeyer.gauguin/build.gradle.kts | 47 ++++ .../org.piepmeyer.gauguin/libs.versions.toml | 91 +++++++ .../org.piepmeyer.gauguin/settings.gradle.kts | 24 ++ 17 files changed, 723 insertions(+), 35 deletions(-) create mode 100644 tests/source-files/catalog.test/app/build.gradle create mode 100644 tests/source-files/catalog.test/build.gradle.kts create mode 100644 tests/source-files/catalog.test/gradle/libs.versions.toml create mode 100644 tests/source-files/catalog.test/libs.versions.toml create mode 100644 tests/source-files/catalog.test/settings.gradle.kts create mode 100644 tests/source-files/com.lolo.io.onelist/app/build.gradle.kts create mode 100644 tests/source-files/com.lolo.io.onelist/build.gradle.kts create mode 100644 tests/source-files/com.lolo.io.onelist/gradle/libs.versions.toml create mode 100644 tests/source-files/com.lolo.io.onelist/gradle/wrapper/gradle-wrapper.properties create mode 100644 tests/source-files/com.lolo.io.onelist/settings.gradle create mode 100644 tests/source-files/org.piepmeyer.gauguin/build.gradle.kts create mode 100644 tests/source-files/org.piepmeyer.gauguin/libs.versions.toml create mode 100644 tests/source-files/org.piepmeyer.gauguin/settings.gradle.kts diff --git a/MANIFEST.in b/MANIFEST.in index ff54de79..b9e1d722 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -741,6 +741,11 @@ include tests/signindex/guardianproject-v1.jar include tests/signindex/testy.jar include tests/signindex/unsigned.jar include tests/source-files/at.bitfire.davdroid/build.gradle +include tests/source-files/catalog.test/app/build.gradle +include tests/source-files/catalog.test/build.gradle.kts +include tests/source-files/catalog.test/libs.versions.toml +include tests/source-files/catalog.test/gradle/libs.versions.toml +include tests/source-files/catalog.test/settings.gradle.kts include tests/source-files/cn.wildfirechat.chat/avenginekit/build.gradle include tests/source-files/cn.wildfirechat.chat/build.gradle include tests/source-files/cn.wildfirechat.chat/chat/build.gradle @@ -775,6 +780,11 @@ include tests/source-files/com.integreight.onesheeld/settings.gradle include tests/source-files/com.jens.automation2/build.gradle include tests/source-files/com.jens.automation2/app/build.gradle include tests/source-files/com.kunzisoft.testcase/build.gradle +include tests/source-files/com.lolo.io.onelist/app/build.gradle.kts +include tests/source-files/com.lolo.io.onelist/build.gradle.kts +include tests/source-files/com.lolo.io.onelist/gradle/libs.versions.toml +include tests/source-files/com.lolo.io.onelist/gradle/wrapper/gradle-wrapper.properties +include tests/source-files/com.lolo.io.onelist/settings.gradle include tests/source-files/com.nextcloud.client/build.gradle include tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android/en-US/full_description.txt include tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android/en-US/short_description.txt @@ -817,6 +827,9 @@ include tests/source-files/org.mozilla.rocket/app/build.gradle include tests/source-files/org.noise_planet.noisecapture/app/build.gradle include tests/source-files/org.noise_planet.noisecapture/settings.gradle include tests/source-files/org.noise_planet.noisecapture/sosfilter/build.gradle +include tests/source-files/org.piepmeyer.gauguin/build.gradle.kts +include tests/source-files/org.piepmeyer.gauguin/libs.versions.toml +include tests/source-files/org.piepmeyer.gauguin/settings.gradle.kts include tests/source-files/org.tasks/app/build.gradle.kts include tests/source-files/org.tasks/build.gradle include tests/source-files/org.tasks/build.gradle.kts diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index ee26fce4..0e877f07 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -34,6 +34,11 @@ from enum import IntEnum from pathlib import Path from tempfile import TemporaryDirectory +if sys.version_info >= (3, 11): + import tomllib +else: + import tomli as tomllib + from . import _, common, metadata, scanner from .exception import BuildException, ConfigurationException, VCSException @@ -58,13 +63,177 @@ DEPFILE = { SCANNER_CACHE_VERSION = 1 +DEFAULT_CATALOG_PREFIX_REGEX = re.compile( + r'''defaultLibrariesExtensionName\s*=\s*['"](\w+)['"]''' +) +GRADLE_KTS_CATALOG_FILE_REGEX = re.compile( + r'''create\("(\w+)"\)\s*\{[^}]*from\(files\(['"]([^"]+)['"]\)\)''' +) +GRADLE_CATALOG_FILE_REGEX = re.compile( + r'''(\w+)\s*\{[^}]*from\(files\(['"]([^"]+)['"]\)\)''' +) +VERSION_CATALOG_REGEX = re.compile( + r'dependencyResolutionManagement\s*\{[^}]*versionCatalogs\s*\{' +) + class ExitCode(IntEnum): NONFREE_CODE = 1 +class GradleVersionCatalog: + """Parse catalog from libs.versions.toml. + + https://docs.gradle.org/current/userguide/platforms.html + """ + + def __init__(self, catalog): + self.version = { + alias: self.get_version(version) + for alias, version in catalog.get("versions", {}).items() + } + self.libraries = { + self.alias_to_accessor(alias): self.library_to_coordinate(library) + for alias, library in catalog.get("libraries", {}).items() + } + self.plugins = { + self.alias_to_accessor(alias): self.plugin_to_coordinate(plugin) + for alias, plugin in catalog.get("plugins", {}).items() + } + self.bundles = { + self.alias_to_accessor(alias): self.bundle_to_coordinates(bundle) + for alias, bundle in catalog.get("bundles", {}).items() + } + + @staticmethod + def alias_to_accessor(alias: str) -> str: + """Covert alias to accessor. + + https://docs.gradle.org/current/userguide/platforms.html#sub:mapping-aliases-to-accessors + Alias is used to define a lib in catalog. Accessor is used to access it. + """ + return alias.replace("-", ".").replace("_", ".") + + def get_version(self, version: dict) -> str: + if isinstance(version, str): + return version + ref = version.get("ref") + if ref: + return self.version.get(ref, "") + return ( + version.get("prefer", "") + or version.get("require", "") + or version.get("strictly", "") + ) + + def library_to_coordinate(self, library: dict) -> str: + """Generate the Gradle dependency coordinate from catalog.""" + module = library.get("module") + if not module: + group = library.get("group") + name = library.get("name") + if group and name: + module = f"{group}:{name}" + else: + return "" + + version = library.get("version") + if version: + return f"{module}:{self.get_version(version)}" + else: + return module + + def plugin_to_coordinate(self, plugin: dict) -> str: + """Generate the Gradle plugin coordinate from catalog.""" + id = plugin.get("id") + if not id: + return "" + + version = plugin.get("version") + if version: + return f"{id}:{self.get_version(version)}" + else: + return id + + def bundle_to_coordinates(self, bundle) -> list[str]: + """Generate the Gradle dependency bundle coordinate from catalog.""" + coordinates = [] + for alias in bundle: + library = self.libraries.get(self.alias_to_accessor(alias)) + if library: + coordinates.append(library) + return coordinates + + def get_coordinate(self, accessor: str) -> list[str]: + """Get the Gradle coordinate from the catalog with an accessor.""" + if accessor.startswith("plugins."): + return [self.plugins.get(accessor[8:], "")] + if accessor.startswith("bundles."): + return self.bundles.get(accessor[8:], []) + return [self.libraries.get(accessor, "")] + + +def get_catalogs(root: str) -> dict[str, GradleVersionCatalog]: + """Get all Gradle dependency catalogs from settings.gradle[.kts]. + + Returns a dict with the extension and the corresponding catalog. + The extension is used as the prefix of the accessor to access libs in the catalog. + """ + root = Path(root) + catalogs = {} + default_prefix = "libs" + catalog_files_m = [] + + def find_block_end(s, start): + pat = re.compile("[{}]") + depth = 1 + for m in pat.finditer(s, pos=start): + if m.group() == "{": + depth += 1 + else: + depth -= 1 + if depth == 0: + return m.start() + else: + return -1 + + groovy_file = root / "settings.gradle" + kotlin_file = root / "settings.gradle.kts" + if groovy_file.is_file(): + s = groovy_file.read_text(encoding="utf-8") + version_catalogs_m = VERSION_CATALOG_REGEX.search(s) + if version_catalogs_m: + start = version_catalogs_m.end() + end = find_block_end(s, start) + catalog_files_m = GRADLE_CATALOG_FILE_REGEX.finditer(s, start, end) + elif kotlin_file.is_file(): + s = kotlin_file.read_text(encoding="utf-8") + version_catalogs_m = VERSION_CATALOG_REGEX.search(s) + if version_catalogs_m: + start = version_catalogs_m.end() + end = find_block_end(s, start) + catalog_files_m = GRADLE_KTS_CATALOG_FILE_REGEX.finditer(s, start, end) + else: + return {} + + m_default = DEFAULT_CATALOG_PREFIX_REGEX.search(s) + if m_default: + default_prefix = m_default.group(1) + default_catalog_file = Path(root) / "gradle/libs.versions.toml" + if default_catalog_file.is_file(): + with default_catalog_file.open("rb") as f: + catalogs[default_prefix] = GradleVersionCatalog(tomllib.load(f)) + for m in catalog_files_m: + catalog_file = Path(root) / m.group(2).replace("$rootDir/", "") + if catalog_file.is_file(): + with catalog_file.open("rb") as f: + catalogs[m.group(1)] = GradleVersionCatalog(tomllib.load(f)) + return catalogs + + def get_gradle_compile_commands(build): compileCommands = [ + 'alias', 'api', 'apk', 'classpath', @@ -80,15 +249,25 @@ def get_gradle_compile_commands(build): if build.gradle and build.gradle != ['yes']: flavors += build.gradle - commands = [ - ''.join(c) for c in itertools.product(flavors, buildTypes, compileCommands) + return [''.join(c) for c in itertools.product(flavors, buildTypes, compileCommands)] + + +def get_gradle_compile_commands_without_catalog(build): + return [ + re.compile(rf'''\s*{c}.*\s*\(?['"].*['"]''', re.IGNORECASE) + for c in get_gradle_compile_commands(build) + ] + + +def get_gradle_compile_commands_with_catalog(build, prefix): + return [ + re.compile(rf'\s*{c}.*\s*\(?{prefix}\.([a-z0-9.]+)', re.IGNORECASE) + for c in get_gradle_compile_commands(build) ] - return [re.compile(r'\s*' + c, re.IGNORECASE) for c in commands] def get_embedded_classes(apkfile, depth=0): - """ - Get the list of Java classes embedded into all DEX files. + """Get the list of Java classes embedded into all DEX files. :return: set of Java classes names as string """ @@ -183,8 +362,7 @@ class SignatureDataController: raise SignatureDataVersionMismatchException() def check_last_updated(self): - """ - Check if the last_updated value is ok and raise an exception if expired or inaccessible. + """Check if the last_updated value is ok and raise an exception if expired or inaccessible. :raises SignatureDataMalformedException: when timestamp value is inaccessible or not parse-able @@ -259,8 +437,7 @@ class SignatureDataController: logging.debug("write '{}' to cache".format(self.filename)) def verify_data(self): - """ - Clean and validate `self.data`. + """Clean and validate `self.data`. Right now this function does just a basic key sanitation. """ @@ -451,8 +628,7 @@ _SCANNER_TOOL = None def _get_tool(): - """ - Lazy loading function for getting a ScannerTool instance. + """Lazy loading function for getting a ScannerTool instance. ScannerTool initialization need to access `common.config` values. Those are only available after initialization through `common.read_config()`. So this factory assumes config was called at an erlier point in time. """ @@ -496,6 +672,7 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): Returns ------- the number of fatal problems encountered. + """ count = 0 @@ -571,6 +748,7 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): Returns ------- 0 as we explicitly ignore the file, so don't count an error + """ msg = 'Ignoring %s at %s' % (what, path_in_build_dir) logging.info(msg) @@ -593,6 +771,7 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): Returns ------- 0 as we deleted the offending file + """ msg = 'Removing %s at %s' % (what, path_in_build_dir) logging.info(msg) @@ -620,6 +799,7 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): Returns ------- 0, as warnings don't count as errors + """ if toignore(path_in_build_dir): return 0 @@ -645,6 +825,7 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): Returns ------- 0 if the problem was ignored/deleted/is only a warning, 1 otherwise + """ options = common.get_options() if toignore(path_in_build_dir): @@ -691,11 +872,21 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): return True return False - gradle_compile_commands = get_gradle_compile_commands(build) + def is_used_by_gradle_without_catalog(line): + return any( + command.match(line) + for command in get_gradle_compile_commands_without_catalog(build) + ) - def is_used_by_gradle(line): - return any(command.match(line) for command in gradle_compile_commands) + def is_used_by_gradle_with_catalog(line, prefix): + for m in ( + command.match(line) + for command in get_gradle_compile_commands_with_catalog(build, prefix) + ): + if m: + return m + catalogs = {} # Iterate through all files in the source code for root, dirs, files in os.walk(build_dir, topdown=True): # It's topdown, so checking the basename is enough @@ -703,6 +894,9 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): if ignoredir in dirs: dirs.remove(ignoredir) + if "settings.gradle" in files or "settings.gradle.kts" in files: + catalogs = get_catalogs(root) + for curfile in files: if curfile in ['.DS_Store']: continue @@ -789,14 +983,28 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): with open(filepath, 'r', errors='replace') as f: lines = f.readlines() for i, line in enumerate(lines): - if is_used_by_gradle(line): + if is_used_by_gradle_without_catalog(line): for name in suspects_found(line): count += handleproblem( - "usual suspect '%s'" % (name), + f"usual suspect '{name}'", path_in_build_dir, filepath, json_per_build, ) + for prefix, catalog in catalogs.items(): + m = is_used_by_gradle_with_catalog(line, prefix) + if not m: + continue + accessor = m[1] + coordinates = catalog.get_coordinate(accessor) + for coordinate in coordinates: + for name in suspects_found(coordinate): + count += handleproblem( + f"usual suspect '{prefix}.{accessor}: {name}'", + path_in_build_dir, + filepath, + json_per_build, + ) noncomment_lines = [ line for line in lines if not common.gradle_comment.match(line) ] diff --git a/setup.py b/setup.py index 6b9be802..444a70be 100755 --- a/setup.py +++ b/setup.py @@ -4,8 +4,7 @@ import re import subprocess import sys -from setuptools import Command -from setuptools import setup +from setuptools import Command, setup from setuptools.command.install import install @@ -108,6 +107,7 @@ setup( 'requests >= 2.5.2, != 2.11.0, != 2.12.2, != 2.18.0', 'sdkmanager >= 0.6.4', 'yamllint', + 'tomli >= 1.1.0; python_version < "3.11"', ], # Some requires are only needed for very limited cases: # * biplist is only used for parsing Apple .ipa files diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 98bab924..701c0b2e 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -18,6 +18,10 @@ from dataclasses import asdict from datetime import datetime, timedelta from unittest import mock +if sys.version_info >= (3, 11): + import tomllib +else: + import tomli as tomllib import yaml localmodule = os.path.realpath( @@ -70,6 +74,8 @@ class ScannerTest(unittest.TestCase): 'realm': 1, 'se.manyver': 3, 'lockfile.test': 1, + 'com.lolo.io.onelist': 6, + 'catalog.test': 10, } for d in glob.glob(os.path.join(source_files, '*')): build = fdroidserver.metadata.Build() @@ -79,26 +85,28 @@ class ScannerTest(unittest.TestCase): should, fatal_problems, "%s should have %d errors!" % (d, should) ) - def test_get_gradle_compile_commands(self): + def test_get_gradle_compile_commands_without_catalog(self): test_files = [ - ('source-files/fdroid/fdroidclient/build.gradle', 'yes', 18), - ('source-files/com.nextcloud.client/build.gradle', 'generic', 28), - ('source-files/com.kunzisoft.testcase/build.gradle', 'libre', 4), - ('source-files/cn.wildfirechat.chat/chat/build.gradle', 'yes', 33), - ('source-files/org.tasks/app/build.gradle.kts', 'generic', 43), - ('source-files/at.bitfire.davdroid/build.gradle', 'standard', 16), - ('source-files/se.manyver/android/app/build.gradle', 'indie', 29), - ('source-files/osmandapp/osmand/build.gradle', 'free', 5), - ('source-files/eu.siacs.conversations/build.gradle', 'free', 24), - ('source-files/org.mozilla.rocket/app/build.gradle', 'focus', 42), - ('source-files/com.jens.automation2/app/build.gradle', 'fdroidFlavor', 9), + ('source-files/fdroid/fdroidclient/build.gradle', 'yes', 15), + ('source-files/com.nextcloud.client/build.gradle', 'generic', 24), + ('source-files/com.kunzisoft.testcase/build.gradle', 'libre', 3), + ('source-files/cn.wildfirechat.chat/chat/build.gradle', 'yes', 30), + ('source-files/org.tasks/app/build.gradle.kts', 'generic', 41), + ('source-files/at.bitfire.davdroid/build.gradle', 'standard', 15), + ('source-files/se.manyver/android/app/build.gradle', 'indie', 26), + ('source-files/osmandapp/osmand/build.gradle', 'free', 2), + ('source-files/eu.siacs.conversations/build.gradle', 'free', 21), + ('source-files/org.mozilla.rocket/app/build.gradle', 'focus', 40), + ('source-files/com.jens.automation2/app/build.gradle', 'fdroidFlavor', 5), ] for f, flavor, count in test_files: i = 0 build = fdroidserver.metadata.Build() build.gradle = [flavor] - regexs = fdroidserver.scanner.get_gradle_compile_commands(build) + regexs = fdroidserver.scanner.get_gradle_compile_commands_without_catalog( + build + ) with open(f, encoding='utf-8') as fp: for line in fp.readlines(): for regex in regexs: @@ -107,6 +115,56 @@ class ScannerTest(unittest.TestCase): i += 1 self.assertEqual(count, i) + def test_get_gradle_compile_commands_with_catalog(self): + test_files = [ + ('source-files/com.lolo.io.onelist/build.gradle.kts', 'yes', 5), + ('source-files/com.lolo.io.onelist/app/build.gradle.kts', 'yes', 26), + ('source-files/catalog.test/build.gradle.kts', 'yes', 3), + ('source-files/catalog.test/app/build.gradle', 'yes', 2), + ] + + for f, flavor, count in test_files: + i = 0 + build = fdroidserver.metadata.Build() + build.gradle = [flavor] + regexs = fdroidserver.scanner.get_gradle_compile_commands_with_catalog( + build, "libs" + ) + with open(f, encoding='utf-8') as fp: + for line in fp.readlines(): + for regex in regexs: + m = regex.match(line) + if m: + i += 1 + self.assertEqual(count, i) + + def test_catalog(self): + accessor_coordinate_pairs = { + 'firebase.crash': ['com.google.firebase:firebase-crash:1.1.1'], + 'firebase.core': ['com.google.firebase:firebase-core:2.2.2'], + 'play.service.ads': ['com.google.android.gms:play-services-ads:1.2.1'], + 'plugins.google.services': ['com.google.gms.google-services:1.2.1'], + 'plugins.firebase.crashlytics': ['com.google.firebase.crashlytics:1.1.1'], + 'bundles.firebase': [ + 'com.google.firebase:firebase-crash:1.1.1', + 'com.google.firebase:firebase-core:2.2.2', + ], + } + with open('source-files/catalog.test/gradle/libs.versions.toml', 'rb') as f: + catalog = fdroidserver.scanner.GradleVersionCatalog(tomllib.load(f)) + for accessor, coordinate in accessor_coordinate_pairs.items(): + self.assertEqual(catalog.get_coordinate(accessor), coordinate) + + def test_get_catalogs(self): + test_files = [ + ('source-files/com.lolo.io.onelist/', 1), + ('source-files/catalog.test/', 3), + ('source-files/org.piepmeyer.gauguin/', 1), + ] + + for root, count in test_files: + self.assertEqual(count, len(fdroidserver.scanner.get_catalogs(root))) + def test_scan_source_files_sneaky_maven(self): """Check for sneaking in banned maven repos""" os.chdir(self.testdir) @@ -780,8 +838,7 @@ class Test_main(unittest.TestCase): self.scan_binary_func = mock.Mock(return_value=0) def test_parsing_appid(self): - """ - This test verifies that app id get parsed correctly + """This test verifies that app id get parsed correctly (doesn't test how they get processed) """ self.args = ["com.example.app"] @@ -802,8 +859,7 @@ class Test_main(unittest.TestCase): self.scan_binary_func.assert_not_called() def test_parsing_apkpath(self): - """ - This test verifies that apk paths get parsed correctly + """This test verifies that apk paths get parsed correctly (doesn't test how they get processed) """ self.args = ["local.application.apk"] diff --git a/tests/source-files/catalog.test/app/build.gradle b/tests/source-files/catalog.test/app/build.gradle new file mode 100644 index 00000000..72c9d184 --- /dev/null +++ b/tests/source-files/catalog.test/app/build.gradle @@ -0,0 +1,2 @@ +implementation libs.bundles.firebase +implementation libs.play.service.ads diff --git a/tests/source-files/catalog.test/build.gradle.kts b/tests/source-files/catalog.test/build.gradle.kts new file mode 100644 index 00000000..5572706f --- /dev/null +++ b/tests/source-files/catalog.test/build.gradle.kts @@ -0,0 +1,5 @@ +plugins { + alias(libs.plugins.google.services) + alias(libs.plugins.firebase.crashlytics) + alias(projectLibs.plugins.firebase.crashlytics) +} diff --git a/tests/source-files/catalog.test/gradle/libs.versions.toml b/tests/source-files/catalog.test/gradle/libs.versions.toml new file mode 100644 index 00000000..666a0f7f --- /dev/null +++ b/tests/source-files/catalog.test/gradle/libs.versions.toml @@ -0,0 +1,15 @@ +[versions] +firebase = "1.1.1" +gms = "1.2.1" + +[libraries] +firebase-crash = { module = "com.google.firebase:firebase-crash", version.ref = "firebase" } +firebase_core = { module = "com.google.firebase:firebase-core", version = "2.2.2" } +"play.service.ads" = { module = "com.google.android.gms:play-services-ads", version.ref = "gms"} + +[plugins] +google-services = { id = "com.google.gms.google-services", version.ref = "gms" } +firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebase" } + +[bundles] +firebase = ["firebase-crash", "firebase_core"] diff --git a/tests/source-files/catalog.test/libs.versions.toml b/tests/source-files/catalog.test/libs.versions.toml new file mode 100644 index 00000000..666a0f7f --- /dev/null +++ b/tests/source-files/catalog.test/libs.versions.toml @@ -0,0 +1,15 @@ +[versions] +firebase = "1.1.1" +gms = "1.2.1" + +[libraries] +firebase-crash = { module = "com.google.firebase:firebase-crash", version.ref = "firebase" } +firebase_core = { module = "com.google.firebase:firebase-core", version = "2.2.2" } +"play.service.ads" = { module = "com.google.android.gms:play-services-ads", version.ref = "gms"} + +[plugins] +google-services = { id = "com.google.gms.google-services", version.ref = "gms" } +firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebase" } + +[bundles] +firebase = ["firebase-crash", "firebase_core"] diff --git a/tests/source-files/catalog.test/settings.gradle.kts b/tests/source-files/catalog.test/settings.gradle.kts new file mode 100644 index 00000000..4ea352c8 --- /dev/null +++ b/tests/source-files/catalog.test/settings.gradle.kts @@ -0,0 +1,11 @@ +dependencyResolutionManagement { + defaultLibrariesExtensionName = "projectLibs" + versionCatalogs { + create("libs") { + from(files("./libs.versions.toml")) + } + create("anotherLibs") { + from(files("$rootDir/libs.versions.toml")) + } + } +} diff --git a/tests/source-files/com.lolo.io.onelist/app/build.gradle.kts b/tests/source-files/com.lolo.io.onelist/app/build.gradle.kts new file mode 100644 index 00000000..261cfe2f --- /dev/null +++ b/tests/source-files/com.lolo.io.onelist/app/build.gradle.kts @@ -0,0 +1,118 @@ +import java.io.FileInputStream +import java.util.Properties + +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.google.services) + alias(libs.plugins.firebase.crashlytics) + alias(libs.plugins.ksp) +} +android { + namespace = "com.lolo.io.onelist" + + val versionPropsFile = file("../version.properties") + var versionCodeCI: Int? = null + if (versionPropsFile.canRead()) { + val versionProps = Properties() + versionProps.load(FileInputStream(versionPropsFile)) + val v = versionProps["VERSION_CODE"] + versionCodeCI = (versionProps["VERSION_CODE"] as String).toInt() + } + + + defaultConfig { + multiDexEnabled = true + applicationId = "com.lolo.io.onelist" + compileSdk = 34 + minSdk = 23 + targetSdk = 34 + versionCode = versionCodeCI ?: 19 + versionName = "1.4.2" + vectorDrawables.useSupportLibrary = true + } + + androidResources { + generateLocaleConfig = true + } + + buildFeatures { + viewBinding = true + buildConfig = true + } + + + ksp { + arg("room.schemaLocation", "$projectDir/schemas") + } + + buildTypes { + getByName("debug") { + applicationIdSuffix = ".debug" + versionNameSuffix = "-DEBUG" + resValue("string", "app_name", "1ListDev") + } + getByName("release") { + isMinifyEnabled = true + isShrinkResources = true + + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + resValue("string", "app_name", "1List") + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + +} +repositories { + google() + mavenCentral() + maven { url = uri("https://jitpack.io") } +} + +dependencies { + + // android + implementation(libs.androidx.core.splashscreen) + implementation(libs.androidx.preference.ktx) + implementation(libs.androidx.lifecycle.extensions) + implementation(libs.androidx.legacy.support.v4) + implementation(libs.androidx.appcompat) + + // android - design + implementation(libs.constraint.layout) + implementation(libs.androidx.recyclerview) + implementation(libs.flexbox) + implementation(libs.material) + implementation(libs.androidx.swiperefreshlayout) + + // kotlin + implementation(libs.kotlinx.coroutines.core) + implementation(libs.kotlin.stdlib.jdk7) + + // firebase + implementation(libs.firebase.crashlytics) + + // koin di + implementation(libs.koin.android) + implementation(libs.koin.androidx.navigation) + + // room + implementation(libs.androidx.room.runtime) + implementation(libs.androidx.room.ktx) + ksp(libs.androidx.room.compiler) + + // json + implementation(libs.gson) + + // other libs + implementation(libs.whatsnew) + implementation(libs.storage) + implementation(libs.advrecyclerview) +} diff --git a/tests/source-files/com.lolo.io.onelist/build.gradle.kts b/tests/source-files/com.lolo.io.onelist/build.gradle.kts new file mode 100644 index 00000000..baad9726 --- /dev/null +++ b/tests/source-files/com.lolo.io.onelist/build.gradle.kts @@ -0,0 +1,11 @@ +plugins { + alias(libs.plugins.android.application) apply false + alias(libs.plugins.kotlin.android) apply false + alias(libs.plugins.google.services) apply false + alias(libs.plugins.firebase.crashlytics) apply false + alias(libs.plugins.ksp) apply false +} + +tasks.register("clean", Delete::class) { + delete(rootProject.layout.buildDirectory) +} \ No newline at end of file diff --git a/tests/source-files/com.lolo.io.onelist/gradle/libs.versions.toml b/tests/source-files/com.lolo.io.onelist/gradle/libs.versions.toml new file mode 100644 index 00000000..d6cf9869 --- /dev/null +++ b/tests/source-files/com.lolo.io.onelist/gradle/libs.versions.toml @@ -0,0 +1,58 @@ +[versions] +advrecyclerview = "1.0.0" +appcompat = "1.6.1" +constraint-layout = "2.0.4" +crashlytics = "18.6.2" +firebase-crashlytics-gradle-plugin = "2.9.9" +flexbox = "3.0.0" +gson = "2.5.6" +kotlin = "1.9.20" +kotlin-coroutines = "1.6.4" +legacy-support-v4 = "1.0.0" +lifecycle-extensions = "2.2.0" +material = "1.11.0" +preference-ktx = "1.2.1" +recyclerview = "1.3.2" +splashscreen ="1.0.1" +koin ="3.5.0" +room="2.6.1" +storage = "1.5.5" +swiperefreshlayout = "1.1.0" +whatsnew = "0.1.7" +ksp-plugin="1.9.20-1.0.14" + +# plugins versions +android-application-plugin="8.3.0" +kotlin-android-plugin="1.9.22" +google-services-plugin = "4.4.1" + +[libraries] +advrecyclerview = { module = "com.h6ah4i.android.widget.advrecyclerview:advrecyclerview", version.ref = "advrecyclerview" } +androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" } +androidx-core-splashscreen = { module = "androidx.core:core-splashscreen", version.ref = "splashscreen" } +androidx-legacy-support-v4 = { module = "androidx.legacy:legacy-support-v4", version.ref = "legacy-support-v4" } +androidx-lifecycle-extensions = { module = "androidx.lifecycle:lifecycle-extensions", version.ref = "lifecycle-extensions" } +androidx-preference-ktx = { module = "androidx.preference:preference-ktx", version.ref = "preference-ktx" } +androidx-recyclerview = { module = "androidx.recyclerview:recyclerview", version.ref = "recyclerview" } +androidx-room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "room" } +androidx-room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "room" } +androidx-room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" } +androidx-swiperefreshlayout = { module = "androidx.swiperefreshlayout:swiperefreshlayout", version.ref = "swiperefreshlayout" } +constraint-layout = { module = "com.android.support.constraint:constraint-layout", version.ref = "constraint-layout" } +firebase-crashlytics = { module = "com.google.firebase:firebase-crashlytics", version.ref = "crashlytics" } +flexbox = { module = "com.google.android.flexbox:flexbox", version.ref = "flexbox" } +gson = { module = "org.immutables:gson", version.ref = "gson" } +koin-android = { module = "io.insert-koin:koin-android", version.ref = "koin" } +koin-androidx-navigation = { module = "io.insert-koin:koin-androidx-navigation", version.ref = "koin" } +kotlin-stdlib-jdk7 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk7", version.ref = "kotlin" } +kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlin-coroutines" } +material = { module = "com.google.android.material:material", version.ref = "material" } +storage = { module = "com.anggrayudi:storage", version.ref = "storage" } +whatsnew = { module = "io.github.tonnyl:whatsnew", version.ref = "whatsnew" } + +[plugins] +ksp = { id = "com.google.devtools.ksp", version.ref = "ksp-plugin" } +android-application = { id = "com.android.application", version.ref = "android-application-plugin" } +kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin-android-plugin" } +google-services = { id = "com.google.gms.google-services", version.ref = "google-services-plugin" } +firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebase-crashlytics-gradle-plugin" } \ No newline at end of file diff --git a/tests/source-files/com.lolo.io.onelist/gradle/wrapper/gradle-wrapper.properties b/tests/source-files/com.lolo.io.onelist/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..e411586a --- /dev/null +++ b/tests/source-files/com.lolo.io.onelist/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/tests/source-files/com.lolo.io.onelist/settings.gradle b/tests/source-files/com.lolo.io.onelist/settings.gradle new file mode 100644 index 00000000..533aeeeb --- /dev/null +++ b/tests/source-files/com.lolo.io.onelist/settings.gradle @@ -0,0 +1,9 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +include 'app' diff --git a/tests/source-files/org.piepmeyer.gauguin/build.gradle.kts b/tests/source-files/org.piepmeyer.gauguin/build.gradle.kts new file mode 100644 index 00000000..cb7d1d02 --- /dev/null +++ b/tests/source-files/org.piepmeyer.gauguin/build.gradle.kts @@ -0,0 +1,47 @@ +import java.net.URI + +buildscript { + dependencies { + classpath("com.android.tools.build:gradle:8.6.0") + } +} + +plugins { + alias(libs.plugins.android.application) apply false + alias(libs.plugins.android.library) apply false + alias(libs.plugins.kotlin.android) apply false + alias(libs.plugins.kotlin.jvm) apply false + alias(libs.plugins.sonarqube) + alias(libs.plugins.ktlint) + alias(libs.plugins.ksp) + alias(libs.plugins.roborazzi) apply false + alias(libs.plugins.gms) apply false +} + +sonarqube { + properties { + property("sonar.projectKey", "org.piepmeyer.gauguin") + property("sonar.organization", "meikpiep") + property("sonar.verbose", "true") + property("sonar.host.url", "https://sonarcloud.io") + } +} + +tasks.sonar { + onlyIf("There is no property 'buildserver'") { + project.hasProperty("buildserver") + } + dependsOn(":gauguin-app:lint") +} + +allprojects { + repositories { + mavenCentral() + google() + maven { url = URI("https://jitpack.io") } + } +} + +subprojects { + apply(plugin = "org.jlleitschuh.gradle.ktlint") +} diff --git a/tests/source-files/org.piepmeyer.gauguin/libs.versions.toml b/tests/source-files/org.piepmeyer.gauguin/libs.versions.toml new file mode 100644 index 00000000..7159985c --- /dev/null +++ b/tests/source-files/org.piepmeyer.gauguin/libs.versions.toml @@ -0,0 +1,91 @@ +[versions] + +kotlin = "1.9.23" +koin = "3.5.6" +koin-annotations="1.3.1" +kotest = "5.9.1" +kotest-extensions = "1.3.0" +kotlin-coroutines = "1.8.1" +android-gradle-plugin = "8.6.0" +androidUiTestingUtils = "2.3.3" +roborazzi = "1.26.0" + +[libraries] + +kotlin-coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "kotlin-coroutines" } +kotlin-coroutines-debug = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-debug", version.ref = "kotlin-coroutines" } +kotlin-serialization = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version = "1.6.3" } + +logging-kotlin = { group = "io.github.oshai", name = "kotlin-logging-jvm", version = "6.0.9" } +logging-slf = { group = "org.slf4j", name = "slf4j-api", version = "2.0.13" } +logging-logback-android = { group = "com.github.tony19", name = "logback-android", version = "3.0.0" } +logging-logback-kotlin = { group = "ch.qos.logback", name = "logback-classic", version = "1.5.6" } + +android-material = { group = "com.google.android.material", name = "material", version = "1.12.0" } + +androidx-annotation = { group = "androidx.annotation", name = "annotation", version = "1.8.2" } +androidx-ktx = { group = "androidx.core", name = "core-ktx", version = "1.13.1" } +androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version = "2.1.4" } +androidx-drawerlayout = { group = "androidx.drawerlayout", name = "drawerlayout", version = "1.2.0" } +androidx-fragment = { group = "androidx.fragment", name = "fragment-ktx", version = "1.8.3" } +androidx-gridlayout = { group = "androidx.gridlayout", name = "gridlayout", version = "1.0.0" } +androidx-lifecycle-runtime = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version = "2.8.5" } +androidx-lifecycle-viewmodel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-ktx", version = "2.8.5" } +androidx-preference = { group = "androidx.preference", name = "preference-ktx", version = "1.2.1" } +androidx-recyclerview = { group = "androidx.recyclerview", name = "recyclerview", version = "1.3.2" } +androidx-transition = { group = "androidx.transition", name = "transition", version = "1.5.1" } +androidx-window = { group = "androidx.window", name = "window", version = "1.3.0" } +androidx-window-core = { group = "androidx.window", name = "window-core", version = "1.3.0" } + +androidx-test-junit-ktx = { group = "androidx.test.ext", name = "junit-ktx", version = "1.2.1" } +androidx-test-rules = { group = "androidx.test", name = "rules", version = "1.6.1" } +androidx-test-runner = { group = "androidx.test", name = "runner", version = "1.6.2" } + +koin-core = { group = "io.insert-koin", name = "koin-core", version.ref = "koin" } +koin-annotations = { group = "io.insert-koin", name = "koin-annotations", version.ref = "koin-annotations" } +koin-ksp-compiler = { group = "io.insert-koin", name = "koin-ksp-compiler", version.ref = "koin-annotations" } +koin-test = { group = "io.insert-koin", name = "koin-test", version.ref = "koin" } +koin-android = { group = "io.insert-koin", name = "koin-android", version.ref = "koin" } + +kotest-runner = { group = "io.kotest", name = "kotest-runner-junit5", version.ref = "kotest" } +kotest-assertions = { group = "io.kotest", name = "kotest-assertions-core", version.ref = "kotest" } +kotest-parametrizedtests = { group = "io.kotest", name = "kotest-framework-datatest", version.ref = "kotest" } +kotest-koin = { group = "io.kotest.extensions", name = "kotest-extensions-koin", version.ref = "kotest-extensions" } + +test-mockk = { group = "io.mockk", name = "mockk", version = "1.13.11" } + +androiduitestingutils-utils = { group = "com.github.sergio-sastre.AndroidUiTestingUtils", name = "utils", version.ref = "androidUiTestingUtils" } +androiduitestingutils-robolectric = { group = "com.github.sergio-sastre.AndroidUiTestingUtils", name = "robolectric", version.ref = "androidUiTestingUtils" } +roboelectric = { group = "org.robolectric", name = "robolectric", version = "4.13" } +roborazzi = { group = "io.github.takahirom.roborazzi", name = "roborazzi", version.ref = "roborazzi" } +roborazzi-junit = { group = "io.github.takahirom.roborazzi", name = "roborazzi-junit-rule", version.ref = "roborazzi" } +junit-vintage-engine = { group = "org.junit.vintage", name = "junit-vintage-engine", version = "5.10.3" } + +thirdparty-konfetti = { group = "nl.dionsegijn", name = "konfetti-xml", version = "2.0.4" } +#thirdparty-ferriswheel = { group = "ru.github.igla", name = "ferriswheel", version = "1.2" } +thirdparty-navigationdrawer = { group = "com.mikepenz", name = "materialdrawer", version = "9.0.2" } +thirdparty-balloon = { group = "com.github.skydoves", name = "balloon", version = "1.6.7" } +thirdparty-vico = { group = "com.patrykandpatrick.vico", name = "views", version = "2.0.0-alpha.25" } +thirdparty-androidplot = { group = "com.androidplot", name = "androidplot-core", version = "1.5.11" } +thirdparty-leakcanary = { group = "com.squareup.leakcanary", name = "leakcanary-android", version = "2.14" } + +[plugins] + +android-application = { id = "com.android.application", version.ref = "android-gradle-plugin" } +android-library = { id = "com.android.library", version.ref = "android-gradle-plugin" } +kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } +sonarqube = { id = "org.sonarqube", version = "5.0.0.4638" } +ktlint = { id = "org.jlleitschuh.gradle.ktlint", version = "12.1.1" } +ksp = { id = "com.google.devtools.ksp", version = "1.9.23-1.0.20" } +roborazzi = { id = "io.github.takahirom.roborazzi", version.ref = "roborazzi" } +gms = { id = "com.google.gms.google-services", version = "1" } + +[bundles] + +logging = ["logging-kotlin", "logging-slf"] +kotest = ["kotest-runner", "kotest-assertions", "kotest-parametrizedtests", "kotest-koin"] +koin = ["koin-core", "koin-annotations", "koin-ksp-compiler"] +androidx-test = ["androidx-test-junit-ktx", "androidx-test-rules", "androidx-test-runner"] +screenshotTests = ["androiduitestingutils-utils", "androiduitestingutils-robolectric", "roboelectric", "roborazzi", "roborazzi-junit", "junit-vintage-engine"] + diff --git a/tests/source-files/org.piepmeyer.gauguin/settings.gradle.kts b/tests/source-files/org.piepmeyer.gauguin/settings.gradle.kts new file mode 100644 index 00000000..46f4acda --- /dev/null +++ b/tests/source-files/org.piepmeyer.gauguin/settings.gradle.kts @@ -0,0 +1,24 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +dependencyResolutionManagement { + versionCatalogs { + create("libs") { + from(files("libs.versions.toml")) + } + } +} + +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") version ("0.8.0") +} + +rootProject.name = "gauguin" + +include(":gauguin-app") +include(":gauguin-core") From 17a051329ea9287129566e406c1304a525605f33 Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Mon, 23 Sep 2024 15:43:18 +0000 Subject: [PATCH 1673/2116] Use latest Bookworm images for makebuildserver --- makebuildserver | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/makebuildserver b/makebuildserver index bdeca683..f532cb44 100755 --- a/makebuildserver +++ b/makebuildserver @@ -48,17 +48,17 @@ logging.basicConfig(format=logformat, level=loglevel) tail = None BASEBOX_DEFAULT = 'debian/bookworm64' -BASEBOX_VERSION_DEFAULT = "12.20231211.1" +BASEBOX_VERSION_DEFAULT = "12.20240905.1" BASEBOX_CHECKSUMS = { - "12.20231211.1": { + "12.20240905.1": { "libvirt": { - "box.img": "80b048312c423b7fbbbac934c348f9a29bdf2f98fae96dd13b3af70ddfe7f12a", + "box.img": "a7aa8c7a8c4a214afb597d0ffd20d63cd3cf5464a1fc3791ed6f2674b8783b54", "Vagrantfile": "f9c6fcbb47a4d0d33eb066859c8e87efd642287a638bd7da69a9e7a6f25fec47", - "metadata.json": "9d717678c19bb81d077e4e7eeb3602c168b6568cc38fee8fd3aa9d8f3cfe639b", + "metadata.json": "20dc0268a79410dbf01c7e544ba5138f6f695a298b53c56c87a25f68c5031173", }, "virtualbox": { - "box.ovf": "8ad49ba600fbd1027e35c8fd41d37383c04bad30fdbafa860a29911d207a3e7b", - "box.vmdk": "57602a776860805e82bd3f61cdca9711f39781011db0f8f1dee9b2a614b2c889", + "box.ovf": "9c32ca53a110fa7ff91bc0a5f42e012b9bd5986b029ae6d0f68edd274c8a53e2", + "box.vmdk": "abe945cfb0f60db44b52454046c16c209a3c85fcc72c82124ef525badeff0931", "Vagrantfile": "0bbc2ae97668d8da27ab97b766752dcd0bf9e41900e21057de15a58ee7fae47d", "metadata.json": "ffdaa989f2f6932cd8042e1102371f405cc7ad38e324210a1326192e4689e83a", } From 5f7203ddf204e5750470d775fe991d964bf94f45 Mon Sep 17 00:00:00 2001 From: g0t mi1k Date: Tue, 30 Jul 2024 15:01:15 +0100 Subject: [PATCH 1674/2116] Only check for ipfs_cid when doing fdroid update --- fdroidserver/common.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 28ea3736..2c671cbc 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -366,7 +366,8 @@ def fill_config_defaults(thisconfig): if 'ipfs_cid' not in thisconfig and shutil.which('ipfs_cid'): thisconfig['ipfs_cid'] = shutil.which('ipfs_cid') - if not thisconfig.get('ipfs_cid'): + cmd = sys.argv[1] if len(sys.argv) >= 2 else '' + if cmd == 'update' and not thisconfig.get('ipfs_cid'): logging.debug(_("ipfs_cid not found, skipping CIDv1 generation")) for k in ['ndk_paths', 'java_paths']: From 2a13d6d400e69bea6b1035d38bc7c55cfbab1719 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Wed, 25 Sep 2024 10:58:29 +0000 Subject: [PATCH 1675/2116] gradle v8.10.2 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 576fcf98..60d0f559 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -204,6 +204,7 @@ get_sha() { '8.9') echo 'd725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab' ;; '8.10') echo '5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a' ;; '8.10.1') echo '1541fa36599e12857140465f3c91a97409b4512501c26f9631fb113e392c5bd1' ;; + '8.10.2') echo '31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26' ;; *) exit 1 esac } @@ -224,7 +225,7 @@ d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 d_plugin_min_gradle_v=(8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 2ceec6b9d6a802155fefc1d9d4ad669c61b388f4 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Tue, 24 Sep 2024 18:55:30 +0800 Subject: [PATCH 1676/2116] scanner: catalog: dependency declaration can be declared as a simple string --- fdroidserver/scanner.py | 13 +++++++++---- tests/scanner.TestCase | 1 + .../catalog.test/gradle/libs.versions.toml | 1 + 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 0e877f07..88ce3236 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -33,6 +33,7 @@ from datetime import datetime, timedelta from enum import IntEnum from pathlib import Path from tempfile import TemporaryDirectory +from typing import Union if sys.version_info >= (3, 11): import tomllib @@ -114,7 +115,7 @@ class GradleVersionCatalog: """ return alias.replace("-", ".").replace("_", ".") - def get_version(self, version: dict) -> str: + def get_version(self, version: Union[dict, str]) -> str: if isinstance(version, str): return version ref = version.get("ref") @@ -126,8 +127,10 @@ class GradleVersionCatalog: or version.get("strictly", "") ) - def library_to_coordinate(self, library: dict) -> str: + def library_to_coordinate(self, library: Union[dict, str]) -> str: """Generate the Gradle dependency coordinate from catalog.""" + if isinstance(library, str): + return library module = library.get("module") if not module: group = library.get("group") @@ -143,8 +146,10 @@ class GradleVersionCatalog: else: return module - def plugin_to_coordinate(self, plugin: dict) -> str: + def plugin_to_coordinate(self, plugin: Union[dict, str]) -> str: """Generate the Gradle plugin coordinate from catalog.""" + if isinstance(plugin, str): + return plugin id = plugin.get("id") if not id: return "" @@ -155,7 +160,7 @@ class GradleVersionCatalog: else: return id - def bundle_to_coordinates(self, bundle) -> list[str]: + def bundle_to_coordinates(self, bundle: list[str]) -> list[str]: """Generate the Gradle dependency bundle coordinate from catalog.""" coordinates = [] for alias in bundle: diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 701c0b2e..dbb27fd7 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -143,6 +143,7 @@ class ScannerTest(unittest.TestCase): 'firebase.crash': ['com.google.firebase:firebase-crash:1.1.1'], 'firebase.core': ['com.google.firebase:firebase-core:2.2.2'], 'play.service.ads': ['com.google.android.gms:play-services-ads:1.2.1'], + 'jacoco': ['org.jacoco:org.jacoco.core:0.8.7'], 'plugins.google.services': ['com.google.gms.google-services:1.2.1'], 'plugins.firebase.crashlytics': ['com.google.firebase.crashlytics:1.1.1'], 'bundles.firebase': [ diff --git a/tests/source-files/catalog.test/gradle/libs.versions.toml b/tests/source-files/catalog.test/gradle/libs.versions.toml index 666a0f7f..e5327907 100644 --- a/tests/source-files/catalog.test/gradle/libs.versions.toml +++ b/tests/source-files/catalog.test/gradle/libs.versions.toml @@ -6,6 +6,7 @@ gms = "1.2.1" firebase-crash = { module = "com.google.firebase:firebase-crash", version.ref = "firebase" } firebase_core = { module = "com.google.firebase:firebase-core", version = "2.2.2" } "play.service.ads" = { module = "com.google.android.gms:play-services-ads", version.ref = "gms"} +jacoco = "org.jacoco:org.jacoco.core:0.8.7" [plugins] google-services = { id = "com.google.gms.google-services", version.ref = "gms" } From 8ab1d533180ae5ddebd8e9e501482925644288ec Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 19 Jul 2022 08:48:47 +0200 Subject: [PATCH 1677/2116] Read only metadata of apps given on the command line --- examples/fdroid_clean_repos.py | 6 +++--- examples/fdroid_fetchsrclibs.py | 4 +--- fdroidserver/build.py | 5 +---- fdroidserver/checkupdates.py | 5 +---- fdroidserver/common.py | 3 ++- fdroidserver/lint.py | 4 +--- fdroidserver/rewritemeta.py | 4 +--- fdroidserver/scanner.py | 5 +---- tests/scanner.TestCase | 3 +-- 9 files changed, 12 insertions(+), 27 deletions(-) diff --git a/examples/fdroid_clean_repos.py b/examples/fdroid_clean_repos.py index aaedf98a..cf6259a7 100644 --- a/examples/fdroid_clean_repos.py +++ b/examples/fdroid_clean_repos.py @@ -24,9 +24,9 @@ def main(): ) metadata.add_metadata_arguments(parser) options = common.parse_args(parser) - pkgs = common.read_pkg_args(options.appid, True) - allapps = metadata.read_metadata(pkgs) - apps = common.read_app_args(options.appid, allapps, True) + apps = common.read_app_args( + options.appid, allow_version_codes=True, sort_by_time=True + ) common.read_config() for appid, app in apps.items(): diff --git a/examples/fdroid_fetchsrclibs.py b/examples/fdroid_fetchsrclibs.py index 299e802b..e4a105e2 100644 --- a/examples/fdroid_fetchsrclibs.py +++ b/examples/fdroid_fetchsrclibs.py @@ -19,9 +19,7 @@ def main(): parser.add_argument("appid", nargs='*', help=_("applicationId with optional versionCode in the form APPID[:VERCODE]")) metadata.add_metadata_arguments(parser) options = common.parse_args(parser) - pkgs = common.read_pkg_args(options.appid, True) - allapps = metadata.read_metadata(pkgs) - apps = common.read_app_args(options.appid, allapps, True) + apps = common.read_app_args(options.appid, allow_version_codes=True, sort_by_time=True) common.read_config() srclib_dir = os.path.join('build', 'srclib') os.makedirs(srclib_dir, exist_ok=True) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 42a58282..4cae5d26 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -1117,10 +1117,7 @@ def main(): srclib_dir = os.path.join(build_dir, 'srclib') extlib_dir = os.path.join(build_dir, 'extlib') - # Read all app and srclib metadata - pkgs = common.read_pkg_args(options.appid, True) - allapps = metadata.read_metadata(pkgs, sort_by_time=True) - apps = common.read_app_args(options.appid, allapps, True) + apps = common.read_app_args(options.appid, allow_version_codes=True, sort_by_time=True) for appid, app in list(apps.items()): if (app.get('Disabled') and not options.force) or not app.get('RepoType') or not app.get('Builds', []): diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 7f2293f3..0aa95d68 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -730,10 +730,7 @@ def main(): logging.error(_('Build metadata git repo has uncommited changes!')) sys.exit(1) - # Get all apps... - allapps = metadata.read_metadata() - - apps = common.read_app_args(options.appid, allapps, False) + apps = common.read_app_args(options.appid) processed = [] failed = dict() diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 2c671cbc..fe00e7a9 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -939,7 +939,7 @@ def get_metadata_files(vercodes): return metadatafiles -def read_app_args(appid_versionCode_pairs, allapps, allow_version_codes=False): +def read_app_args(appid_versionCode_pairs, allow_version_codes=False, sort_by_time=False): """Build a list of App instances for processing. On top of what read_pkg_args does, this returns the whole app @@ -950,6 +950,7 @@ def read_app_args(appid_versionCode_pairs, allapps, allow_version_codes=False): """ vercodes = read_pkg_args(appid_versionCode_pairs, allow_version_codes) + allapps = fdroidserver.metadata.read_metadata(appid_versionCode_pairs, sort_by_time) if not vercodes: return allapps diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 11697371..8f1f8d71 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -878,9 +878,7 @@ def main(): def lint_metadata(options): - # Get all apps... - allapps = metadata.read_metadata(options.appid) - apps = common.read_app_args(options.appid, allapps, False) + apps = common.read_app_args(options.appid) anywarns = check_for_unsupported_metadata_files() diff --git a/fdroidserver/rewritemeta.py b/fdroidserver/rewritemeta.py index 7f003ac3..9f3316b4 100644 --- a/fdroidserver/rewritemeta.py +++ b/fdroidserver/rewritemeta.py @@ -81,9 +81,7 @@ def main(): config = common.read_config() - # Get all apps... - allapps = metadata.read_metadata(options.appid) - apps = common.read_app_args(options.appid, allapps, False) + apps = common.read_app_args(options.appid) for appid, app in apps.items(): path = Path(app.metadatapath) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 88ce3236..fc6c823c 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -1144,10 +1144,7 @@ def main(): _get_tool() return - # Read all app and srclib metadata - - allapps = metadata.read_metadata() - apps = common.read_app_args(appids, allapps, True) + apps = common.read_app_args(appids, allow_version_codes=True) build_dir = 'build' if not os.path.isdir(build_dir): diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index dbb27fd7..ce606d35 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -1,6 +1,5 @@ #!/usr/bin/env python3 -import collections import glob import inspect import logging @@ -855,7 +854,7 @@ class Test_main(unittest.TestCase): self.exit_func.assert_not_called() self.read_app_args_func.assert_called_once_with( - ['com.example.app'], collections.OrderedDict(), True + ['com.example.app'], allow_version_codes=True ) self.scan_binary_func.assert_not_called() From 4d0a21f3362238602806b8d93f028b388fc11334 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 19 Jul 2022 13:41:24 +0200 Subject: [PATCH 1678/2116] Use vercodes in read_metadata interface read_metadata is only called in read_app_args with an argument. As vercodes is already there, drop the duplicate call. --- fdroidserver/common.py | 2 +- fdroidserver/metadata.py | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index fe00e7a9..ca89dbed 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -950,7 +950,7 @@ def read_app_args(appid_versionCode_pairs, allow_version_codes=False, sort_by_ti """ vercodes = read_pkg_args(appid_versionCode_pairs, allow_version_codes) - allapps = fdroidserver.metadata.read_metadata(appid_versionCode_pairs, sort_by_time) + allapps = fdroidserver.metadata.read_metadata(vercodes, sort_by_time) if not vercodes: return allapps diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 1ebbe731..93138954 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -545,7 +545,7 @@ def read_srclibs(): srclibs[metadatapath.stem] = parse_yaml_srclib(metadatapath) -def read_metadata(appids={}, sort_by_time=False): +def read_metadata(appid_to_vercode={}, sort_by_time=False): """Return a list of App instances sorted newest first. This reads all of the metadata files in a 'data' repository, then @@ -553,7 +553,7 @@ def read_metadata(appids={}, sort_by_time=False): sorted based on creation time, newest first. Most of the time, the newer files are the most interesting. - appids is a dict with appids a keys and versionCodes as values. + appid_to_vercode is a dict with appids a keys and versionCodes as values. """ # Always read the srclibs before the apps, since they can use a srlib as @@ -565,9 +565,8 @@ def read_metadata(appids={}, sort_by_time=False): for basedir in ('metadata', 'tmp'): Path(basedir).mkdir(exist_ok=True) - if appids: - vercodes = common.read_pkg_args(appids) - metadatafiles = common.get_metadata_files(vercodes) + if appid_to_vercode: + metadatafiles = common.get_metadata_files(appid_to_vercode) else: metadatafiles = list(Path('metadata').glob('*.yml')) + list( Path('.').glob('.fdroid.yml') From 15d3a3612d238e991732ae1449d5e813c406e607 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 19 Jul 2022 13:29:28 +0200 Subject: [PATCH 1679/2116] Drop duplicated code (already done in get_metadata_files) --- fdroidserver/common.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index ca89dbed..6d459c7c 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -960,11 +960,6 @@ def read_app_args(appid_versionCode_pairs, allow_version_codes=False, sort_by_ti if appid in vercodes: apps[appid] = app - if len(apps) != len(vercodes): - for p in vercodes: - if p not in allapps: - logging.critical(_("No such package: %s") % p) - raise FDroidException(_("Found invalid appids in arguments")) if not apps: raise FDroidException(_("No packages specified")) From eadfe415b07766035dc663ecc37b1fa27319ec80 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 9 Oct 2024 00:48:41 +0800 Subject: [PATCH 1680/2116] gradlew: fix plugin version --- gradlew-fdroid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 60d0f559..2386bbdb 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -221,7 +221,7 @@ contains() { # (key) should accept. plugin versions are actually prefixes and catch sub- # versions as well. Pairs are taken from: # https://developer.android.com/studio/releases/gradle-plugin#updating-gradle -d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2.0 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0) +d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0) d_plugin_min_gradle_v=(8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about From deabd7bdc0cc8e073d7dc2a42ef1ed2e1bfa8d45 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Tue, 1 Oct 2024 01:51:19 +0800 Subject: [PATCH 1681/2116] Consider subdir for Flutter app triple-t metadata discover --- fdroidserver/update.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index dac7b038..b5a8f19d 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1029,6 +1029,9 @@ def copy_triple_t_store_metadata(apps): gradle_subdirs.update(glob.glob(os.path.join('build', packageName, builds[-1].subdir, 'src', '*', 'play'))) if not gradle_subdirs: gradle_subdirs.update(glob.glob(os.path.join('build', packageName, builds[-1].subdir, '*', 'src', '*', 'play'))) + if not gradle_subdirs: + # Flutter-style android subdir + gradle_subdirs.update(glob.glob(os.path.join('build', packageName, builds[-1].subdir, 'android', 'app', 'src', '*', 'play'))) if not gradle_subdirs: sg_list = sorted(glob.glob(os.path.join('build', packageName, 'settings.gradle*'))) if sg_list: From 40c6b7d9cfcc7e55f7f0fe0e7556ec9b7753d545 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 10 Oct 2024 14:50:47 +0200 Subject: [PATCH 1682/2116] mv mirror push script to fdroid-bootstrap-buildserver This script is only part of the production _buildserver_, so it should be managed by the Ansible setup for the production _buildserver_. fdroid-bootstrap-buildserver!26 --- examples/mirror-to-mirror.sh | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 examples/mirror-to-mirror.sh diff --git a/examples/mirror-to-mirror.sh b/examples/mirror-to-mirror.sh deleted file mode 100644 index 9c0e937b..00000000 --- a/examples/mirror-to-mirror.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash -# -# This script syncs the entire repo to the primary mirrors. It is -# meant to run in a cronjob quite frequently, as often as there are -# files to send. -# -# This script expects the receiving side to have the following -# preceeding the ssh key entry in ~/.ssh/authorized_keys: -# command="rsync --server -logDtpre.iLsfx --log-format=X --delete --delay-updates . /path/to/htdocs/fdroid/",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty -# -set -e -( -flock -n 200 -set -e -cd /home/fdroid -for section in repo archive; do - echo "Started $section at `date`:" - for host in fdroid@ftp-push.lysator.liu.se fdroid@plug-mirror.rcac.purdue.edu fdroid@ftp.agdsn.de; do - set -x - # be super careful with the trailing slashes here! if one is wrong, it'll delete the entire section! - rsync --archive --delay-updates --progress --delete \ - --timeout=3600 \ - /home/fdroid/public_html/${section} \ - ${host}:/srv/fdroid-mirror.at.or.at/htdocs/fdroid/ & - set +x - done - wait -done -) 200>/var/lock/root_fdroidmirrortomirror From de2f05e4da4965c4c75a835ad8c69d063e383bf0 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 5 Sep 2022 16:02:52 +0200 Subject: [PATCH 1683/2116] Document repo_web_base_url --- examples/config.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/examples/config.yml b/examples/config.yml index f15c00da..1f722244 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -51,6 +51,13 @@ # Canonical URL of the repositoy, needs to end in /repo. Is is used to identity # the repo in the client, as well. # repo_url: https://MyFirstFDroidRepo.org/fdroid/repo +# +# Base URL for per-package pages on the website of this repo, +# i.e. https://f-droid.org/packages// This should be accessible +# with a browser. Setting it to null or not setting this disables the +# feature. +# repo_web_base_url: https://MyFirstFDroidRepo.org/packages/ +# # repo_name: My First F-Droid Repo Demo # repo_description: >- # This is a repository of apps to be used with F-Droid. Applications @@ -62,6 +69,7 @@ # As above, but for the archive repo. # # archive_url: https://f-droid.org/archive +# archive_web_base_url: # archive_name: My First F-Droid Archive Demo # archive_description: >- # The repository of older versions of packages from the main demo repository. From 3544d5195dead6088c0bd31f7a6fd1691790ee7f Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 1 Oct 2024 09:11:21 +0200 Subject: [PATCH 1684/2116] Use mtime and file size for apkcache This reduces the update time significantly as we no longer compute the sha256 for every apk. --- fdroidserver/update.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index b5a8f19d..81bbe8bb 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -316,6 +316,13 @@ def get_cache_file(): return os.path.join('tmp', 'apkcache.json') +def get_cache_mtime(): + apkcachefile = get_cache_file() + if os.path.exists(apkcachefile): + return os.stat(apkcachefile).st_mtime + return 0 + + def get_cache(): """Get the cached dict of the APK index. @@ -1853,7 +1860,7 @@ def scan_apk_androguard(apk, apkfile): def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=False, - allow_disabled_algorithms=False, archive_bad_sig=False, apps=None): + allow_disabled_algorithms=False, archive_bad_sig=False, apps=None, cache_timestamp=0): """Process the apk with the given filename in the given repo directory. This also extracts the icons. @@ -1875,6 +1882,8 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal disabled algorithms in the signature (e.g. MD5) archive_bad_sig move APKs with a bad signature to the archive + cache_timestamp + the timestamp of the cache file Returns ------- @@ -1888,7 +1897,8 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal usecache = False if apkfilename in apkcache: apk = apkcache[apkfilename] - if apk.get('hash') == common.sha256sum(apkfile): + stat = os.stat(apkfile) + if apk.get('size') == stat.st_size and stat.st_mtime < cache_timestamp: logging.debug(_("Reading {apkfilename} from cache") .format(apkfilename=apkfilename)) usecache = True @@ -2007,7 +2017,7 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal return False, apk, cachechanged -def process_apks(apkcache, repodir, knownapks, use_date_from_apk=False, apps=None): +def process_apks(apkcache, repodir, knownapks, use_date_from_apk=False, apps=None, cache_timestamp=0): """Process the apks in the given repo directory. This also extracts the icons. @@ -2022,6 +2032,8 @@ def process_apks(apkcache, repodir, knownapks, use_date_from_apk=False, apps=Non b known apks info use_date_from_apk use date from APK (instead of current date) for newly added APKs + cache_timestamp + the timestamp of the cache file Returns ------- @@ -2043,7 +2055,7 @@ def process_apks(apkcache, repodir, knownapks, use_date_from_apk=False, apps=Non apkfilename = apkfile[len(repodir) + 1:] ada = disabled_algorithms_allowed() (skip, apk, cachethis) = process_apk(apkcache, apkfilename, repodir, knownapks, - use_date_from_apk, ada, True, apps) + use_date_from_apk, ada, True, apps, cache_timestamp) if skip: continue apks.append(apk) @@ -2641,13 +2653,14 @@ def main(): # Get APK cache apkcache = get_cache() + cache_timestamp = get_cache_mtime() # Delete builds for disabled apps delete_disabled_builds(apps, apkcache, repodirs) # Scan all apks in the main repo apks, cachechanged = process_apks(apkcache, repodirs[0], knownapks, - options.use_date_from_apk, apps) + options.use_date_from_apk, apps, cache_timestamp) files, fcachechanged = scan_repo_files(apkcache, repodirs[0], knownapks, options.use_date_from_apk) @@ -2716,7 +2729,7 @@ def main(): # Scan the archive repo for apks as well if len(repodirs) > 1: archapks, cc = process_apks(apkcache, repodirs[1], knownapks, - options.use_date_from_apk, apps) + options.use_date_from_apk, apps, cache_timestamp) if cc: cachechanged = True else: From 4c3dd9c76c459660e17065fcbad97577f74f108f Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sat, 28 Sep 2024 01:31:36 +0800 Subject: [PATCH 1685/2116] scanner: catalog: get catalog from parent dirs When walking through the repo, there may be another settings.gradle in a sub project with a different catalog. In the subdir the catalog of the sub project shuold be used and in other subdir the catalog of the root project should be used. --- MANIFEST.in | 5 +++++ fdroidserver/scanner.py | 11 ++++++++-- tests/scanner.TestCase | 2 +- .../catalog.test/buildSrc/build.gradle.kts | 5 +++++ .../catalog.test/buildSrc/settings.gradle.kts | 22 +++++++++++++++++++ .../catalog.test/buildSrc2/build.gradle.kts | 5 +++++ .../buildSrc2/settings.gradle.kts | 22 +++++++++++++++++++ .../catalog.test/core/build.gradle | 2 ++ 8 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 tests/source-files/catalog.test/buildSrc/build.gradle.kts create mode 100644 tests/source-files/catalog.test/buildSrc/settings.gradle.kts create mode 100644 tests/source-files/catalog.test/buildSrc2/build.gradle.kts create mode 100644 tests/source-files/catalog.test/buildSrc2/settings.gradle.kts create mode 100644 tests/source-files/catalog.test/core/build.gradle diff --git a/MANIFEST.in b/MANIFEST.in index b9e1d722..295d9832 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -742,7 +742,12 @@ include tests/signindex/testy.jar include tests/signindex/unsigned.jar include tests/source-files/at.bitfire.davdroid/build.gradle include tests/source-files/catalog.test/app/build.gradle +include tests/source-files/catalog.test/buildSrc/build.gradle.kts +include tests/source-files/catalog.test/buildSrc/settings.gradle.kts +include tests/source-files/catalog.test/buildSrc2/build.gradle.kts +include tests/source-files/catalog.test/buildSrc2/settings.gradle.kts include tests/source-files/catalog.test/build.gradle.kts +include tests/source-files/catalog.test/core/build.gradle include tests/source-files/catalog.test/libs.versions.toml include tests/source-files/catalog.test/gradle/libs.versions.toml include tests/source-files/catalog.test/settings.gradle.kts diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index fc6c823c..aedede9b 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -891,7 +891,7 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): if m: return m - catalogs = {} + all_catalogs = {} # Iterate through all files in the source code for root, dirs, files in os.walk(build_dir, topdown=True): # It's topdown, so checking the basename is enough @@ -900,7 +900,7 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): dirs.remove(ignoredir) if "settings.gradle" in files or "settings.gradle.kts" in files: - catalogs = get_catalogs(root) + all_catalogs[str(root)] = get_catalogs(root) for curfile in files: if curfile in ['.DS_Store']: @@ -983,6 +983,13 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): break elif curfile.endswith('.gradle') or curfile.endswith('.gradle.kts'): + catalog_path = str(build_dir) + # Find the longest path of dir that the curfile is in + for p in all_catalogs: + if os.path.commonpath([root, p]) == p: + catalog_path = p + catalogs = all_catalogs.get(catalog_path, {}) + if not os.path.isfile(filepath): continue with open(filepath, 'r', errors='replace') as f: diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index ce606d35..83b6e8ff 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -74,7 +74,7 @@ class ScannerTest(unittest.TestCase): 'se.manyver': 3, 'lockfile.test': 1, 'com.lolo.io.onelist': 6, - 'catalog.test': 10, + 'catalog.test': 22, } for d in glob.glob(os.path.join(source_files, '*')): build = fdroidserver.metadata.Build() diff --git a/tests/source-files/catalog.test/buildSrc/build.gradle.kts b/tests/source-files/catalog.test/buildSrc/build.gradle.kts new file mode 100644 index 00000000..5572706f --- /dev/null +++ b/tests/source-files/catalog.test/buildSrc/build.gradle.kts @@ -0,0 +1,5 @@ +plugins { + alias(libs.plugins.google.services) + alias(libs.plugins.firebase.crashlytics) + alias(projectLibs.plugins.firebase.crashlytics) +} diff --git a/tests/source-files/catalog.test/buildSrc/settings.gradle.kts b/tests/source-files/catalog.test/buildSrc/settings.gradle.kts new file mode 100644 index 00000000..98644daf --- /dev/null +++ b/tests/source-files/catalog.test/buildSrc/settings.gradle.kts @@ -0,0 +1,22 @@ +pluginManagement { + repositories { + gradlePluginPortal() + } +} + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } + + versionCatalogs { + create("libs") { + from(files("../gradle/libs.versions.toml")) + } + } +} + +rootProject.name = "buildSrc" +rootProject.buildFileName = "buildSrc.gradle.kts" diff --git a/tests/source-files/catalog.test/buildSrc2/build.gradle.kts b/tests/source-files/catalog.test/buildSrc2/build.gradle.kts new file mode 100644 index 00000000..5572706f --- /dev/null +++ b/tests/source-files/catalog.test/buildSrc2/build.gradle.kts @@ -0,0 +1,5 @@ +plugins { + alias(libs.plugins.google.services) + alias(libs.plugins.firebase.crashlytics) + alias(projectLibs.plugins.firebase.crashlytics) +} diff --git a/tests/source-files/catalog.test/buildSrc2/settings.gradle.kts b/tests/source-files/catalog.test/buildSrc2/settings.gradle.kts new file mode 100644 index 00000000..98644daf --- /dev/null +++ b/tests/source-files/catalog.test/buildSrc2/settings.gradle.kts @@ -0,0 +1,22 @@ +pluginManagement { + repositories { + gradlePluginPortal() + } +} + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } + + versionCatalogs { + create("libs") { + from(files("../gradle/libs.versions.toml")) + } + } +} + +rootProject.name = "buildSrc" +rootProject.buildFileName = "buildSrc.gradle.kts" diff --git a/tests/source-files/catalog.test/core/build.gradle b/tests/source-files/catalog.test/core/build.gradle new file mode 100644 index 00000000..72c9d184 --- /dev/null +++ b/tests/source-files/catalog.test/core/build.gradle @@ -0,0 +1,2 @@ +implementation libs.bundles.firebase +implementation libs.play.service.ads From 24dc3baadf47ce4cb4302bcbbcc53335f2f33106 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sat, 28 Sep 2024 01:53:04 +0800 Subject: [PATCH 1686/2116] scanner: catalog: relax VERSION_CATALOG_REGEX There may be other blocks in dependencyResolutionManagement --- fdroidserver/scanner.py | 4 +--- tests/source-files/catalog.test/settings.gradle.kts | 3 +++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index aedede9b..0e66a5a4 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -73,9 +73,7 @@ GRADLE_KTS_CATALOG_FILE_REGEX = re.compile( GRADLE_CATALOG_FILE_REGEX = re.compile( r'''(\w+)\s*\{[^}]*from\(files\(['"]([^"]+)['"]\)\)''' ) -VERSION_CATALOG_REGEX = re.compile( - r'dependencyResolutionManagement\s*\{[^}]*versionCatalogs\s*\{' -) +VERSION_CATALOG_REGEX = re.compile(r'versionCatalogs\s*\{') class ExitCode(IntEnum): diff --git a/tests/source-files/catalog.test/settings.gradle.kts b/tests/source-files/catalog.test/settings.gradle.kts index 4ea352c8..fd9ba80c 100644 --- a/tests/source-files/catalog.test/settings.gradle.kts +++ b/tests/source-files/catalog.test/settings.gradle.kts @@ -1,4 +1,7 @@ dependencyResolutionManagement { + repositories { + mavenCentral() + } defaultLibrariesExtensionName = "projectLibs" versionCatalogs { create("libs") { From 4c225f02d2f754af45f9a57eaeb8d899ec2878f6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 27 Jun 2022 17:22:03 +0200 Subject: [PATCH 1687/2116] checkupdates: push_commits() to push auto-branch when new commits --- fdroidserver/checkupdates.py | 41 ++++++++++++++++++++++++ tests/checkupdates.TestCase | 60 ++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 0aa95d68..d158e1d6 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -18,6 +18,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import git import os import re import urllib.request @@ -683,6 +684,46 @@ def get_last_build_from_app(app: metadata.App) -> metadata.Build: return metadata.Build() +def push_commits(remote_name='origin'): + """Push commits using either appid or 'checkupdates' as branch name.""" + git_repo = git.Repo.init('.') + files = set() + upstream_main = 'main' if 'main' in git_repo.remotes.upstream.refs else 'master' + local_main = 'main' if 'main' in git_repo.refs else 'master' + for commit in git_repo.iter_commits(f'upstream/{upstream_main}...{local_main}'): + files.update(commit.stats.files.keys()) + + branch_name = 'checkupdates' + files = list(files) + if len(files) == 1: + m = re.match(r'metadata/([^\s]+)\.yml', files[0]) + if m: + branch_name = m.group(1) # appid + if len(files) > 0: + git_repo.create_head(branch_name, force=True) + remote = git_repo.remotes[remote_name] + pushinfos = remote.push( + branch_name, force=True, set_upstream=True, progress=progress + ) + for pushinfo in pushinfos: + if pushinfo.flags & ( + git.remote.PushInfo.ERROR + | git.remote.PushInfo.REJECTED + | git.remote.PushInfo.REMOTE_FAILURE + | git.remote.PushInfo.REMOTE_REJECTED + ): + # Show potentially useful messages from git remote + if progress: + for line in progress.other_lines: + if line.startswith('remote:'): + logging.debug(line) + raise FDroidException( + f'{remote.url} push failed: {pushinfo.flags} {pushinfo.summary}' + ) + else: + logging.debug(remote.url + ': ' + pushinfo.summary) + + def status_update_json(processed: list, failed: dict) -> None: """Output a JSON file with metadata about this run.""" logging.debug(_('Outputting JSON')) diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index 9ff7eb98..8399695d 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -2,9 +2,13 @@ # http://www.drdobbs.com/testing/unit-testing-with-python/240165163 +import git import logging import os +import shutil import sys +import tempfile +import time import unittest from unittest import mock from pathlib import Path @@ -27,6 +31,12 @@ class CheckupdatesTest(unittest.TestCase): logging.basicConfig(level=logging.DEBUG) self.basedir = localmodule / 'tests' os.chdir(self.basedir) + self.testdir = tempfile.TemporaryDirectory( + str(time.time()), self._testMethodName + '_' + ) + + def tearDown(self): + self.testdir.cleanup() def test_autoupdatemode_no_suffix(self): fdroidserver.checkupdates.config = {} @@ -317,6 +327,56 @@ class CheckupdatesTest(unittest.TestCase): self.assertEqual(vername, '2') self.assertEqual(vercode, 2) + def test_push_commits(self): + testdir = self.testdir.name + os.chdir(testdir) + os.mkdir('metadata') + for f in (self.basedir / 'metadata').glob('*.yml'): + shutil.copy(f, 'metadata') + git_repo = git.Repo.init(testdir) + git_repo.git.add(all=True) + git_repo.index.commit("all metadata files") + + git_remote_upstream = os.path.join(testdir, 'git_remote_upstream') + upstream = git.Repo.init(git_remote_upstream, bare=True) + git_repo.create_remote('upstream', 'file://' + git_remote_upstream) + git_remote_origin = os.path.join(testdir, 'git_remote_origin') + origin = git.Repo.init(git_remote_origin, bare=True) + git_repo.create_remote('origin', 'file://' + git_remote_origin) + for remote in git_repo.remotes: + remote.push(git_repo.active_branch) + self.assertEqual(git_repo.head, upstream.head) + self.assertEqual(origin.head, upstream.head) + # pretend that checkupdates ran but didn't create any new commits + fdroidserver.checkupdates.push_commits() + + appid = 'org.adaway' + self.assertNotIn(appid, git_repo.branches) + self.assertNotIn('checkupdates', git_repo.branches) + self.assertNotIn(appid, git_repo.remotes.origin.repo.branches) # TODO fix + + # now make commit + app = fdroidserver.metadata.read_metadata({appid: -1})[appid] + build = fdroidserver.metadata.Build() + build.versionName = 'fake' + build.versionCode = 999999999 + app.Builds.append(build) + metadata_file = 'metadata/%s.yml' % appid + fdroidserver.metadata.write_metadata(metadata_file, app) + git_repo.index.add(metadata_file) + git_repo.index.commit('changed ' + appid) + + # and push the new commit to the dynamic branch + fdroidserver.checkupdates.push_commits() + self.assertIn(appid, git_repo.branches) + self.assertIn(appid, git_repo.remotes.origin.refs) + self.assertNotIn('checkupdates', git_repo.branches) + self.assertNotIn(appid, git_repo.remotes.upstream.refs) + + def test_make_merge_request(self): + testdir = self.testdir.name + os.chdir(testdir) + if __name__ == "__main__": import argparse From e03915e39134f0c86c71bca546326cb69e228050 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 28 Jun 2022 15:32:16 +0200 Subject: [PATCH 1688/2116] deploy: ensure progress is instantiated before trying to use it --- fdroidserver/deploy.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index da0e8d8d..6db6ab54 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -805,9 +805,10 @@ def upload_to_servergitmirror( | git.remote.PushInfo.REMOTE_REJECTED ): # Show potentially useful messages from git remote - for line in progress.other_lines: - if line.startswith('remote:'): - logging.debug(line) + if progress: + for line in progress.other_lines: + if line.startswith('remote:'): + logging.debug(line) raise FDroidException( remote.url + ' push failed: ' From 78b368f88bc61e656686b472ab50b77be91d5872 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 28 Jun 2022 16:10:59 +0200 Subject: [PATCH 1689/2116] enforce black code format for tests/checkupdates.TestCase --- pyproject.toml | 1 - tests/checkupdates.TestCase | 24 ++++++++++++------------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index a6262ae2..876053c5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,6 @@ force-exclude = '''( | tests/gradle-release-checksums\.py | tests/openssl-version-check-test\.py | tests/valid-package-names/test\.py - | tests/checkupdates\.TestCase | tests/common\.TestCase | tests/publish\.TestCase | tests/signatures\.TestCase diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index 8399695d..5451433a 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -267,9 +267,9 @@ class CheckupdatesTest(unittest.TestCase): vcs.latesttags.return_value = ['1.1.9', '1.1.8'] with mock.patch( 'pathlib.Path.read_text', lambda a: 'v1.1.9\nc10109' - ) as _ignored, mock.patch.object( - Path, 'is_file' - ) as mock_path, mock.patch('fdroidserver.common.getvcs', return_value=vcs): + ) as _ignored, mock.patch.object(Path, 'is_file') as mock_path, mock.patch( + 'fdroidserver.common.getvcs', return_value=vcs + ): _ignored # silence the linters mock_path.is_file.return_falue = True vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) @@ -279,9 +279,9 @@ class CheckupdatesTest(unittest.TestCase): app.UpdateCheckData = r'b.txt|c(.*)|.|v(.*)' with mock.patch( 'pathlib.Path.read_text', lambda a: 'v1.1.0\nc10109' - ) as _ignored, mock.patch.object( - Path, 'is_file' - ) as mock_path, mock.patch('fdroidserver.common.getvcs', return_value=vcs): + ) as _ignored, mock.patch.object(Path, 'is_file') as mock_path, mock.patch( + 'fdroidserver.common.getvcs', return_value=vcs + ): _ignored # silence the linters mock_path.is_file.return_falue = True vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) @@ -291,9 +291,9 @@ class CheckupdatesTest(unittest.TestCase): app.UpdateCheckData = r'b.txt|c(.*)||' with mock.patch( 'pathlib.Path.read_text', lambda a: 'v1.1.9\nc10109' - ) as _ignored, mock.patch.object( - Path, 'is_file' - ) as mock_path, mock.patch('fdroidserver.common.getvcs', return_value=vcs): + ) as _ignored, mock.patch.object(Path, 'is_file') as mock_path, mock.patch( + 'fdroidserver.common.getvcs', return_value=vcs + ): _ignored # silence the linters mock_path.is_file.return_falue = True vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) @@ -304,9 +304,9 @@ class CheckupdatesTest(unittest.TestCase): app.UpdateCheckData = r'b.txt|c(.*)||Android-([\d.]+)' with mock.patch( 'pathlib.Path.read_text', lambda a: 'v1.1.9\nc10109' - ) as _ignored, mock.patch.object( - Path, 'is_file' - ) as mock_path, mock.patch('fdroidserver.common.getvcs', return_value=vcs): + ) as _ignored, mock.patch.object(Path, 'is_file') as mock_path, mock.patch( + 'fdroidserver.common.getvcs', return_value=vcs + ): _ignored # silence the linters mock_path.is_file.return_falue = True vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) From 206f07364b2e096b25cd5cc60a5e51beb182e9c6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 28 Jun 2022 17:30:48 +0200 Subject: [PATCH 1690/2116] checkupdates: remove appid branches that have been merged To avoid having thousands of branches on checkupdatess-bot's remote, this cleans up any remote branches that are pointing to commit that has been fully merged. --- fdroidserver/checkupdates.py | 21 ++++++++++++++++++++ tests/checkupdates.TestCase | 37 ++++++++++++++++++++++++++++++------ 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index d158e1d6..f75e96da 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -724,6 +724,27 @@ def push_commits(remote_name='origin'): logging.debug(remote.url + ': ' + pushinfo.summary) +def prune_empty_appid_branches(git_repo=None): + """Remove empty branches from checkupdates-bot git remote.""" + if git_repo is None: + git_repo = git.Repo.init('.') + main_branch = 'main' + if main_branch not in git_repo.remotes.upstream.refs: + main_branch = 'master' + upstream_main = 'upstream/' + main_branch + + remote = git_repo.remotes.origin + remote.update(prune=True) + merged_branches = git_repo.git().branch(remotes=True, merged=upstream_main).split() + for remote_branch in merged_branches: + if not remote_branch or '/' not in remote_branch: + continue + if remote_branch.split('/')[1] not in (main_branch, 'HEAD'): + for ref in git_repo.remotes.origin.refs: + if remote_branch == ref.name: + remote.push(':%s' % ref.remote_head, force=True) # rm remote branch + + def status_update_json(processed: list, failed: dict) -> None: """Output a JSON file with metadata about this run.""" logging.debug(_('Outputting JSON')) diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index 5451433a..402e3bb8 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -327,7 +327,7 @@ class CheckupdatesTest(unittest.TestCase): self.assertEqual(vername, '2') self.assertEqual(vercode, 2) - def test_push_commits(self): + def _get_test_git_repos(self): testdir = self.testdir.name os.chdir(testdir) os.mkdir('metadata') @@ -338,22 +338,28 @@ class CheckupdatesTest(unittest.TestCase): git_repo.index.commit("all metadata files") git_remote_upstream = os.path.join(testdir, 'git_remote_upstream') - upstream = git.Repo.init(git_remote_upstream, bare=True) + upstream_repo = git.Repo.init(git_remote_upstream, bare=True) git_repo.create_remote('upstream', 'file://' + git_remote_upstream) git_remote_origin = os.path.join(testdir, 'git_remote_origin') - origin = git.Repo.init(git_remote_origin, bare=True) + origin_repo = git.Repo.init(git_remote_origin, bare=True) git_repo.create_remote('origin', 'file://' + git_remote_origin) + + return git_repo, origin_repo, upstream_repo + + def test_push_commits(self): + git_repo, origin_repo, upstream_repo = self._get_test_git_repos() for remote in git_repo.remotes: remote.push(git_repo.active_branch) - self.assertEqual(git_repo.head, upstream.head) - self.assertEqual(origin.head, upstream.head) + self.assertEqual(git_repo.head, upstream_repo.head) + self.assertEqual(origin_repo.head, upstream_repo.head) # pretend that checkupdates ran but didn't create any new commits fdroidserver.checkupdates.push_commits() appid = 'org.adaway' self.assertNotIn(appid, git_repo.branches) + self.assertNotIn(appid, origin_repo.branches) + self.assertNotIn(appid, upstream_repo.branches) self.assertNotIn('checkupdates', git_repo.branches) - self.assertNotIn(appid, git_repo.remotes.origin.repo.branches) # TODO fix # now make commit app = fdroidserver.metadata.read_metadata({appid: -1})[appid] @@ -373,6 +379,25 @@ class CheckupdatesTest(unittest.TestCase): self.assertNotIn('checkupdates', git_repo.branches) self.assertNotIn(appid, git_repo.remotes.upstream.refs) + def test_prune_empty_appid_branches(self): + git_repo, origin_repo, upstream_repo = self._get_test_git_repos() + for remote in git_repo.remotes: + remote.push(git_repo.active_branch) + self.assertEqual(git_repo.head, upstream_repo.head) + self.assertEqual(origin_repo.head, upstream_repo.head) + + appid = 'org.adaway' + git_repo.create_head(appid, force=True) + git_repo.remotes.origin.push(appid, force=True) + self.assertIn(appid, git_repo.branches) + self.assertIn(appid, origin_repo.branches) + self.assertIn(appid, git_repo.remotes.origin.refs) + self.assertNotIn(appid, git_repo.remotes.upstream.refs) + fdroidserver.checkupdates.prune_empty_appid_branches() + self.assertNotIn(appid, origin_repo.branches) + self.assertNotIn(appid, git_repo.remotes.origin.refs) + self.assertNotIn(appid, git_repo.remotes.upstream.refs) + def test_make_merge_request(self): testdir = self.testdir.name os.chdir(testdir) From 66a340fe897aa5154b888708c1c447c683a52f57 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 28 Jun 2022 17:31:40 +0200 Subject: [PATCH 1691/2116] checkupdates: add --verbose progress to push_commits() --- fdroidserver/checkupdates.py | 16 +++++++++++++++- tests/checkupdates.TestCase | 27 +++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index f75e96da..bd5f812e 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -684,7 +684,7 @@ def get_last_build_from_app(app: metadata.App) -> metadata.Build: return metadata.Build() -def push_commits(remote_name='origin'): +def push_commits(remote_name='origin', verbose=False): """Push commits using either appid or 'checkupdates' as branch name.""" git_repo = git.Repo.init('.') files = set() @@ -700,6 +700,20 @@ def push_commits(remote_name='origin'): if m: branch_name = m.group(1) # appid if len(files) > 0: + if verbose: + from clint.textui import progress + + bar = progress.Bar() + + class MyProgressPrinter(git.RemoteProgress): + def update(self, op_code, current, maximum=None, message=None): + if isinstance(maximum, float): + bar.show(current, maximum) + + progress = MyProgressPrinter() + else: + progress = None + git_repo.create_head(branch_name, force=True) remote = git_repo.remotes[remote_name] pushinfos = remote.push( diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index 402e3bb8..90da2666 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -379,6 +379,33 @@ class CheckupdatesTest(unittest.TestCase): self.assertNotIn('checkupdates', git_repo.branches) self.assertNotIn(appid, git_repo.remotes.upstream.refs) + def test_push_commits_verbose(self): + class Options: + verbose = True + + fdroidserver.checkupdates.options = Options + repos = self._get_test_git_repos() + git_repo = repos[0] + git_repo.remotes.origin.push(git_repo.active_branch) + git_repo.remotes.upstream.push(git_repo.active_branch) + + # make commit + appid = 'org.adaway' + app = fdroidserver.metadata.read_metadata({appid: -1})[appid] + build = fdroidserver.metadata.Build() + build.versionName = 'fake' + build.versionCode = 999999999 + app.Builds.append(build) + metadata_file = 'metadata/%s.yml' % appid + fdroidserver.metadata.write_metadata(metadata_file, app) + git_repo.index.add(metadata_file) + git_repo.index.commit('changed ' + appid) + + # and push the new commit to the dynamic branch + fdroidserver.checkupdates.push_commits() + self.assertIn(appid, git_repo.branches) + self.assertIn(appid, git_repo.remotes.origin.refs) + def test_prune_empty_appid_branches(self): git_repo, origin_repo, upstream_repo = self._get_test_git_repos() for remote in git_repo.remotes: From 9a34590e951aa1bab31d28571cdb77fddd22d38d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 29 Jun 2022 12:31:28 +0200 Subject: [PATCH 1692/2116] checkupdates: make merge-request per appid on push --- fdroidserver/checkupdates.py | 109 ++++++++++++++++++++++++----------- tests/checkupdates.TestCase | 40 ++++++++++++- 2 files changed, 111 insertions(+), 38 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index bd5f812e..caf07eda 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -685,7 +685,22 @@ def get_last_build_from_app(app: metadata.App) -> metadata.Build: def push_commits(remote_name='origin', verbose=False): - """Push commits using either appid or 'checkupdates' as branch name.""" + """Make git branch then push commits as merge request. + + This uses the appid as the standard branch name so that there is + only ever one open merge request per-app. If multiple apps are + included in the branch, then 'checkupdates' is used as branch + name. This is to support the old way operating, e.g. in batches. + + This uses GitLab "Push Options" to create a merge request. Git + Push Options are config data that can be sent via `git push + --push-option=... origin foo`. + + References + ---------- + * https://docs.gitlab.com/ee/user/project/push_options.html + + """ git_repo = git.Repo.init('.') files = set() upstream_main = 'main' if 'main' in git_repo.remotes.upstream.refs else 'master' @@ -699,43 +714,57 @@ def push_commits(remote_name='origin', verbose=False): m = re.match(r'metadata/([^\s]+)\.yml', files[0]) if m: branch_name = m.group(1) # appid - if len(files) > 0: - if verbose: - from clint.textui import progress + if not files: + return + progress = None + if verbose: + import clint.textui - bar = progress.Bar() + progress_bar = clint.textui.progress.Bar() - class MyProgressPrinter(git.RemoteProgress): - def update(self, op_code, current, maximum=None, message=None): - if isinstance(maximum, float): - bar.show(current, maximum) + class MyProgressPrinter(git.RemoteProgress): + def update(self, op_code, current, maximum=None, message=None): + if isinstance(maximum, float): + progress_bar.show(current, maximum) - progress = MyProgressPrinter() + progress = MyProgressPrinter() + + git_repo.create_head(branch_name, force=True) + remote = git_repo.remotes[remote_name] + pushinfos = remote.push( + branch_name, force=True, set_upstream=True, progress=progress + ) + pushinfos = remote.push( + branch_name, + progress=progress, + force=True, + set_upstream=True, + push_option=[ + 'merge_request.create', + 'merge_request.remove_source_branch', + 'merge_request.title=' + 'bot: checkupdates for ' + branch_name, + 'merge_request.description=' + + 'checkupdates-bot run %s' % os.getenv('CI_JOB_URL'), + ], + ) + + for pushinfo in pushinfos: + if pushinfo.flags & ( + git.remote.PushInfo.ERROR + | git.remote.PushInfo.REJECTED + | git.remote.PushInfo.REMOTE_FAILURE + | git.remote.PushInfo.REMOTE_REJECTED + ): + # Show potentially useful messages from git remote + if progress: + for line in progress.other_lines: + if line.startswith('remote:'): + logging.debug(line) + raise FDroidException( + f'{remote.url} push failed: {pushinfo.flags} {pushinfo.summary}' + ) else: - progress = None - - git_repo.create_head(branch_name, force=True) - remote = git_repo.remotes[remote_name] - pushinfos = remote.push( - branch_name, force=True, set_upstream=True, progress=progress - ) - for pushinfo in pushinfos: - if pushinfo.flags & ( - git.remote.PushInfo.ERROR - | git.remote.PushInfo.REJECTED - | git.remote.PushInfo.REMOTE_FAILURE - | git.remote.PushInfo.REMOTE_REJECTED - ): - # Show potentially useful messages from git remote - if progress: - for line in progress.other_lines: - if line.startswith('remote:'): - logging.debug(line) - raise FDroidException( - f'{remote.url} push failed: {pushinfo.flags} {pushinfo.summary}' - ) - else: - logging.debug(remote.url + ': ' + pushinfo.summary) + logging.debug(remote.url + ': ' + pushinfo.summary) def prune_empty_appid_branches(git_repo=None): @@ -792,6 +821,8 @@ def main(): help=_("Only process apps with auto-updates")) parser.add_argument("--commit", action="store_true", default=False, help=_("Commit changes")) + parser.add_argument("--merge-request", action="store_true", default=False, + help=_("Commit changes, push, then make a merge request")) parser.add_argument("--allow-dirty", action="store_true", default=False, help=_("Run on git repo that has uncommitted changes")) metadata.add_metadata_arguments(parser) @@ -806,6 +837,10 @@ def main(): logging.error(_('Build metadata git repo has uncommited changes!')) sys.exit(1) + if options.merge_request and not (options.appid and len(options.appid) == 1): + logging.error(_('--merge-request only runs on a single appid!')) + sys.exit(1) + apps = common.read_app_args(options.appid) processed = [] @@ -821,7 +856,7 @@ def main(): logging.info(msg) try: - checkupdates_app(app, options.auto, options.commit) + checkupdates_app(app, options.auto, options.commit or options.merge_request) processed.append(appid) except Exception as e: msg = _("...checkupdate failed for {appid} : {error}").format(appid=appid, error=e) @@ -830,6 +865,10 @@ def main(): failed[appid] = str(e) exit_code = 1 + if options.appid and options.merge_request: + push_commits(verbose=options.verbose) + prune_empty_appid_branches() + status_update_json(processed, failed) sys.exit(exit_code) diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index 90da2666..8c8bb03f 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -339,9 +339,14 @@ class CheckupdatesTest(unittest.TestCase): git_remote_upstream = os.path.join(testdir, 'git_remote_upstream') upstream_repo = git.Repo.init(git_remote_upstream, bare=True) + with upstream_repo.config_writer() as cw: + cw.set_value('receive', 'advertisePushOptions', True) git_repo.create_remote('upstream', 'file://' + git_remote_upstream) + git_remote_origin = os.path.join(testdir, 'git_remote_origin') origin_repo = git.Repo.init(git_remote_origin, bare=True) + with origin_repo.config_writer() as cw: + cw.set_value('receive', 'advertisePushOptions', True) git_repo.create_remote('origin', 'file://' + git_remote_origin) return git_repo, origin_repo, upstream_repo @@ -425,9 +430,38 @@ class CheckupdatesTest(unittest.TestCase): self.assertNotIn(appid, git_repo.remotes.origin.refs) self.assertNotIn(appid, git_repo.remotes.upstream.refs) - def test_make_merge_request(self): - testdir = self.testdir.name - os.chdir(testdir) + @mock.patch('sys.exit') + @mock.patch('fdroidserver.metadata.read_metadata') + def test_merge_requests_flag(self, read_metadata, sys_exit): + def _sys_exit(return_code=0): + assert return_code != 0 + raise fdroidserver.exception.FDroidException('sys.exit() ran') + + def _read_metadata(a=None, b=None): + raise StopIteration('read_metadata() ran, test is successful') + + appid = 'com.example' + # read_metadata.return_value = dict() # {appid: dict()} + read_metadata.side_effect = _read_metadata + sys_exit.side_effect = _sys_exit + + # set up clean git repo + os.chdir(self.testdir.name) + git_repo = git.Repo.init() + open('foo', 'w').close() + git_repo.git.add(all=True) + git_repo.index.commit("all files") + + with mock.patch('sys.argv', ['fdroid checkupdates', '--merge-request']): + with self.assertRaises(fdroidserver.exception.FDroidException): + fdroidserver.checkupdates.main() + sys_exit.assert_called() + + sys_exit.reset_mock() + with mock.patch('sys.argv', ['fdroid checkupdates', '--merge-request', appid]): + with self.assertRaises(StopIteration): + fdroidserver.checkupdates.main() + sys_exit.assert_not_called() if __name__ == "__main__": From e3eb5973315a5cf728b90796f10c52c65668bcf1 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 30 Oct 2024 22:55:06 +0800 Subject: [PATCH 1693/2116] scanner: scan frosting blocks in binary scanner --- fdroidserver/scanner.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 0e66a5a4..d8251e23 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -75,6 +75,20 @@ GRADLE_CATALOG_FILE_REGEX = re.compile( ) VERSION_CATALOG_REGEX = re.compile(r'versionCatalogs\s*\{') +FROSTING_BLOCK_TYPES = { + # 0x7109871a: 'SIGNv2', + # 0xf05368c0: 'SIGNv3', + 0x2146444E: 'Google metadata', + # 0x42726577: 'Verity padding', + # 0x6DFF800D: 'Source stamp V2 X509 cert', + # JSON with some metadata, used by Chinese company Meituan + 0x71777777: 'Meituan metadata', + # Dependencies metadata generated by Gradle and encrypted by Google Play. + # '...The data is compressed, encrypted by a Google Play signing key...' + # https://developer.android.com/studio/releases/gradle-plugin#dependency-metadata + 0x504B4453: 'Dependency metadata', +} + class ExitCode(IntEnum): NONFREE_CODE = 1 @@ -654,6 +668,15 @@ def scan_binary(apkfile): if regexp.match(classname): logging.debug("Problem: found class '%s'" % classname) problems += 1 + + logging.info(_('Scanning APK for known frosting blocks.')) + a = common.get_androguard_APK(str(apkfile)) + a.parse_v2_v3_signature() + for b in a._v2_blocks: + if b in FROSTING_BLOCK_TYPES: + logging.debug(f"Problem: found frosting block '{FROSTING_BLOCK_TYPES[b]}'") + problems += 1 + if warnings: logging.warning( _("Found {count} warnings in {filename}").format( From 25779e8b32d76d1566a0592467b8a2b9e39d6d7e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 30 Oct 2024 17:07:31 +0100 Subject: [PATCH 1694/2116] checkupdates: --merge_request commits to branch named after appid --- fdroidserver/checkupdates.py | 32 +++++++++++++++-------- tests/checkupdates.TestCase | 49 ++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 11 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index caf07eda..d812d0b6 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -684,7 +684,15 @@ def get_last_build_from_app(app: metadata.App) -> metadata.Build: return metadata.Build() -def push_commits(remote_name='origin', verbose=False): +def get_git_repo_and_main_branch(): + git_repo = git.Repo.init('.') + main_branch = 'main' + if main_branch not in git_repo.heads: + main_branch = 'master' + return git_repo, main_branch + + +def push_commits(remote_name='origin', branch_name='checkupdates', verbose=False): """Make git branch then push commits as merge request. This uses the appid as the standard branch name so that there is @@ -701,17 +709,16 @@ def push_commits(remote_name='origin', verbose=False): * https://docs.gitlab.com/ee/user/project/push_options.html """ - git_repo = git.Repo.init('.') + git_repo, default = get_git_repo_and_main_branch() files = set() - upstream_main = 'main' if 'main' in git_repo.remotes.upstream.refs else 'master' - local_main = 'main' if 'main' in git_repo.refs else 'master' + upstream_main = default if default in git_repo.remotes.upstream.refs else 'main' + local_main = default if default in git_repo.refs else 'main' for commit in git_repo.iter_commits(f'upstream/{upstream_main}...{local_main}'): files.update(commit.stats.files.keys()) - branch_name = 'checkupdates' files = list(files) if len(files) == 1: - m = re.match(r'metadata/([^\s]+)\.yml', files[0]) + m = re.match(r'metadata/(\S+)\.yml', files[0]) if m: branch_name = m.group(1) # appid if not files: @@ -767,13 +774,10 @@ def push_commits(remote_name='origin', verbose=False): logging.debug(remote.url + ': ' + pushinfo.summary) -def prune_empty_appid_branches(git_repo=None): +def prune_empty_appid_branches(git_repo=None, main_branch='main'): """Remove empty branches from checkupdates-bot git remote.""" if git_repo is None: - git_repo = git.Repo.init('.') - main_branch = 'main' - if main_branch not in git_repo.remotes.upstream.refs: - main_branch = 'master' + git_repo, main_branch = get_git_repo_and_main_branch() upstream_main = 'upstream/' + main_branch remote = git_repo.remotes.origin @@ -856,6 +860,12 @@ def main(): logging.info(msg) try: + if options.merge_request: + logging.info(f'Creating merge request branch for {appid}') + git_repo, main_branch = get_git_repo_and_main_branch() + git_repo.create_head(appid, f"upstream/{main_branch}", force=True) + git_repo.git.checkout(appid) + checkupdates_app(app, options.auto, options.commit or options.merge_request) processed.append(appid) except Exception as e: diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index 8c8bb03f..8006dd2d 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -463,6 +463,55 @@ class CheckupdatesTest(unittest.TestCase): fdroidserver.checkupdates.main() sys_exit.assert_not_called() + def test_get_git_repo_and_main_branch(self): + os.chdir(self.testdir.name) + git_repo = git.Repo.init() + open('foo', 'w').close() + git_repo.git.add(all=True) + git_repo.index.commit("all files") + + repo, branch = fdroidserver.checkupdates.get_git_repo_and_main_branch() + self.assertTrue(branch in ('main', 'master')) + self.assertTrue(branch in repo.heads) + + @mock.patch('sys.exit') + @mock.patch('fdroidserver.common.read_app_args') + @mock.patch('fdroidserver.checkupdates.checkupdates_app') + def test_merge_requests_branch(self, checkupdates_app, read_app_args, sys_exit): + def _sys_exit(return_code=0): + assert return_code == 0 + + def _checkupdates_app(app, auto, commit): # pylint: disable=unused-argument + os.mkdir('metadata') + Path(f'metadata/{app["packageName"]}.yml').write_text('AutoName: Example') + git_repo.git.add(all=True) + git_repo.index.commit("Example") + + def _read_app_args(apps=[]): + appid = apps[0] + return {appid: {'packageName': appid}} + + appid = 'com.example' + read_app_args.side_effect = _read_app_args + checkupdates_app.side_effect = _checkupdates_app + sys_exit.side_effect = _sys_exit + + # set up clean git repo + os.chdir(self.testdir.name) + git_repo = git.Repo.init() + open('foo', 'w').close() + git_repo.git.add(all=True) + git_repo.index.commit("all files") + # --merge-request assumes remotes called 'origin' and 'upstream' + git_repo.create_remote('origin', os.getcwd()).fetch() + git_repo.create_remote('upstream', os.getcwd()).fetch() + + assert appid not in git_repo.heads + with mock.patch('sys.argv', ['fdroid checkupdates', '--merge-request', appid]): + fdroidserver.checkupdates.main() + sys_exit.assert_called_once() + assert appid in git_repo.heads + if __name__ == "__main__": import argparse From 81c0c9d4aa4f6ae61e0dbcde5ac66cf1a6fa9435 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 28 Oct 2024 22:47:39 +0100 Subject: [PATCH 1695/2116] Drop stats/known_apks.txt Use repo/index-v2.json instead. Also fix deprecated datetime.utcnow(). --- MANIFEST.in | 1 - examples/config.yml | 5 --- fdroidserver/common.py | 72 ++++++-------------------------------- fdroidserver/index.py | 2 +- fdroidserver/nightly.py | 7 ++-- fdroidserver/scanner.py | 6 ++-- fdroidserver/update.py | 12 +++---- tests/common.TestCase | 2 -- tests/config.py | 2 -- tests/nightly.TestCase | 2 -- tests/run-tests | 12 +++---- tests/scanner.TestCase | 8 +++-- tests/stats/known_apks.txt | 18 ---------- tests/update.TestCase | 4 --- 14 files changed, 33 insertions(+), 120 deletions(-) delete mode 100644 tests/stats/known_apks.txt diff --git a/MANIFEST.in b/MANIFEST.in index 295d9832..0e24a132 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -860,7 +860,6 @@ include tests/source-files/ut.ewh.audiometrytest/settings.gradle include tests/source-files/yuriykulikov/AlarmClock/gradle/wrapper/gradle-wrapper.properties include tests/source-files/Zillode/syncthing-silk/build.gradle include tests/SpeedoMeterApp.main_1.apk -include tests/stats/known_apks.txt include tests/testcommon.py include tests/test-gradlew-fdroid include tests/triple-t-2/build/org.piwigo.android/app/build.gradle diff --git a/examples/config.yml b/examples/config.yml index 1f722244..cdcbb731 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -401,11 +401,6 @@ # configured to allow push access (e.g. ssh key, username/password, etc) # binary_transparency_remote: git@gitlab.com:fdroid/binary-transparency-log.git -# If you want to keep the "added" and "last updated" dates for each -# app and APK in your repo, enable this. The name comes from an old -# system for tracking statistics that is no longer included. -# update_stats: true - # Set this to true to always use a build server. This saves specifying the # --server option on dedicated secure build server hosts. # build_server_always: true diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 6d459c7c..bc9413c1 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -162,7 +162,6 @@ default_config = { 'make_current_version_link': False, 'current_version_name_source': 'Name', 'deploy_process_logs': False, - 'update_stats': False, 'repo_maxage': 0, 'build_server_always': False, 'keystore': 'keystore.p12', @@ -2555,40 +2554,17 @@ class KnownApks: this is parsed as a list from the end to allow the filename to have any combo of spaces. """ - self.path = os.path.join('stats', 'known_apks.txt') self.apks = {} - if os.path.isfile(self.path): - with open(self.path, 'r', encoding='utf-8') as f: - for line in f: - t = line.rstrip().split(' ') - if len(t) == 2: - self.apks[t[0]] = (t[1], None) - else: - appid = t[-2] - date = datetime.strptime(t[-1], '%Y-%m-%d') - filename = line[0:line.rfind(appid) - 1] - self.apks[filename] = (appid, date) - check_system_clock(date, self.path) - self.changed = False - - def writeifchanged(self): - if not self.changed: - return - - if not os.path.exists('stats'): - os.mkdir('stats') - - lst = [] - for apk, app in self.apks.items(): - appid, added = app - line = apk + ' ' + appid - if added: - line += ' ' + added.strftime('%Y-%m-%d') - lst.append(line) - - with open(self.path, 'w') as f: - for line in sorted(lst, key=natural_key): - f.write(line + '\n') + for part in ('repo', 'archive'): + path = os.path.join(part, 'index-v2.json') + if os.path.isfile(path): + with open(path, 'r', encoding='utf-8') as f: + index = json.load(f) + for appid, data in index["packages"].items(): + for version in data["versions"].values(): + filename = version["file"]["name"][1:] + date = datetime.fromtimestamp(version["added"] // 1000, tz=timezone.utc) + self.apks[filename] = (appid, date) def recordapk(self, apkName, app, default_date=None): """ @@ -2601,38 +2577,12 @@ class KnownApks: """ if apkName not in self.apks: if default_date is None: - default_date = datetime.utcnow() + default_date = datetime.now(timezone.utc) self.apks[apkName] = (app, default_date) self.changed = True _ignored, added = self.apks[apkName] return added - def getapp(self, apkname): - """Look up information - given the 'apkname'. - - Returns (app id, date added/None). - Or returns None for an unknown apk. - """ - if apkname in self.apks: - return self.apks[apkname] - return None - - def getlatest(self, num): - """Get the most recent 'num' apps added to the repo, as a list of package ids with the most recent first.""" - apps = {} - for apk, app in self.apks.items(): - appid, added = app - if added: - if appid in apps: - if apps[appid] > added: - apps[appid] = added - else: - apps[appid] = added - sortedapps = sorted(apps.items(), key=operator.itemgetter(1))[-num:] - lst = [app for app, _ignored in sortedapps] - lst.reverse() - return lst - def get_file_extension(filename): """Get the normalized file extension, can be blank string but never None.""" diff --git a/fdroidserver/index.py b/fdroidserver/index.py index a3bcf9a3..5ca59662 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -77,7 +77,7 @@ def make(apps, apks, repodir, archive): sortedapps[appid] = apps[appid] repodict = collections.OrderedDict() - repodict['timestamp'] = datetime.utcnow().replace(tzinfo=timezone.utc) + repodict['timestamp'] = datetime.now(timezone.utc) repodict['version'] = METADATA_VERSION if common.config['repo_maxage'] != 0: diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 1b7251ee..84c2da2e 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -367,7 +367,7 @@ You can use it with the [F-Droid](https://f-droid.org/) Android app. Last updated: {date}'''.format(repo_git_base=repo_git_base, repo_url=repo_url, - date=datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S UTC')) + date=datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S UTC')) with open(readme_path, 'w') as fp: fp.write(readme) mirror_git_repo.git.add(all=True) @@ -422,7 +422,6 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, 'keypass': PASSWORD, 'keydname': DISTINGUISHED_NAME, 'make_current_version_link': False, - 'update_stats': True, } with open('config.yml', 'w') as fp: yaml.dump(config, fp, default_flow_style=False) @@ -496,7 +495,9 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, common.local_rsync( options, [repo_basedir + '/metadata/'], git_mirror_metadatadir + '/' ) - common.local_rsync(options, [repo_basedir + '/stats/'], git_mirror_statsdir + '/') + stats = repo_basedir + '/stats/' + if os.path.exists(stats): + common.local_rsync(options, [stats], git_mirror_statsdir + '/') mirror_git_repo.git.add(all=True) mirror_git_repo.index.commit("update app metadata") diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index d8251e23..6a392b2b 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -29,7 +29,7 @@ import urllib.request import zipfile from argparse import ArgumentParser from dataclasses import dataclass, field, fields -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from enum import IntEnum from pathlib import Path from tempfile import TemporaryDirectory @@ -330,7 +330,7 @@ def get_embedded_classes(apkfile, depth=0): def _datetime_now(): """Get datetime.now(), using this funciton allows mocking it for testing.""" - return datetime.utcnow() + return datetime.now(timezone.utc) def _scanner_cachedir(): @@ -389,7 +389,7 @@ class SignatureDataController: last_updated = self.data.get("last_updated", None) if last_updated: try: - last_updated = datetime.fromtimestamp(last_updated) + last_updated = datetime.fromtimestamp(last_updated, timezone.utc) except ValueError as e: raise SignatureDataMalformedException() from e except TypeError as e: diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 81bbe8bb..d5c3d922 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -362,7 +362,7 @@ def get_cache(): if not isinstance(v['antiFeatures'], dict): v['antiFeatures'] = {k: {} for k in sorted(v['antiFeatures'])} if 'added' in v: - v['added'] = datetime.fromtimestamp(v['added']) + v['added'] = datetime.fromtimestamp(v['added'], tz=timezone.utc) return apkcache @@ -2001,7 +2001,7 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal fill_missing_icon_densities(empty_densities, iconfilename, apk, repodir) if use_date_from_apk: - default_date_param = datetime.fromtimestamp(os.stat(apkfile).st_mtime) + default_date_param = datetime.fromtimestamp(os.stat(apkfile).st_mtime, tz=timezone.utc) else: default_date_param = None @@ -2420,12 +2420,12 @@ def create_metadata_from_template(apk): def read_added_date_from_all_apks(apps, apks): """No summary. - Added dates come from the stats/known_apks.txt file but are + Added dates come from the repo/index-v2.json file but are read when scanning apks and thus need to be applied form apk level to app level for _all_ apps and not only from non-archived ones - TODO: read the added dates directly from known_apks.txt instead of + TODO: read the added dates directly from index-v2.json instead of going through apks that way it also works for for repos that don't keep an archive of apks. """ @@ -2772,10 +2772,6 @@ def main(): from . import btlog btlog.make_binary_transparency_log(repodirs) - if config['update_stats']: - # Update known apks info... - knownapks.writeifchanged() - status_update_json(apps, apks + archapks) logging.info(_("Finished")) diff --git a/tests/common.TestCase b/tests/common.TestCase index a3a54bb7..385033cf 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1898,7 +1898,6 @@ class CommonTest(unittest.TestCase): self.assertFalse(os.path.exists('config.yml')) self.assertFalse(os.path.exists('config.py')) config = fdroidserver.common.read_config() - self.assertFalse(config.get('update_stats')) self.assertIsNotNone(config.get('char_limits')) def test_with_zero_size_config(self): @@ -1908,7 +1907,6 @@ class CommonTest(unittest.TestCase): self.assertTrue(os.path.exists('config.yml')) self.assertFalse(os.path.exists('config.py')) config = fdroidserver.common.read_config() - self.assertFalse(config.get('update_stats')) self.assertIsNotNone(config.get('char_limits')) def test_with_config_yml(self): diff --git a/tests/config.py b/tests/config.py index 899ee68c..fa118db2 100644 --- a/tests/config.py +++ b/tests/config.py @@ -25,8 +25,6 @@ mirrors = ( 'https://foo.bar/fdroid', ) -update_stats = True - install_list = 'org.adaway' uninstall_list = ('com.android.vending', 'com.facebook.orca', ) diff --git a/tests/nightly.TestCase b/tests/nightly.TestCase index 44e85f04..b1f9a8eb 100755 --- a/tests/nightly.TestCase +++ b/tests/nightly.TestCase @@ -274,7 +274,6 @@ class NightlyTest(unittest.TestCase): 'repo_name': 'f-droid/test-nightly', 'repo_url': mirror_url + '/repo', 'servergitmirrors': [{"url": git_url}], - 'update_stats': True, } with open('config.yml') as fp: config = yaml.safe_load(fp) @@ -347,7 +346,6 @@ class NightlyTest(unittest.TestCase): 'repo_name': 'fdroid/test-nightly', 'repo_url': 'https://gitlab.com/fdroid/test-nightly/-/raw/master/fdroid/repo', 'servergitmirrors': [{"url": 'git@gitlab.com:fdroid/test-nightly'}], - 'update_stats': True, } with open('config.yml') as fp: config = yaml.safe_load(fp) diff --git a/tests/run-tests b/tests/run-tests index 31cb4939..6ba54e03 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -273,7 +273,6 @@ cp -a \ $WORKSPACE/tests/config \ $WORKSPACE/tests/metadata \ $WORKSPACE/tests/repo \ - $WORKSPACE/tests/stats \ $REPOROOT/ cp -a $WORKSPACE/tests/gnupghome $GNUPGHOME chmod 0700 $GNUPGHOME @@ -645,14 +644,13 @@ printf '\narchive_older: 3\n' >> config.yml mkdir -p {repo,archive,metadata,stats} cp $WORKSPACE/tests/repo/com.politedroid_5.apk archive cp $WORKSPACE/tests/repo/com.politedroid_6.apk repo +cp $WORKSPACE/tests/repo/index-v2.json repo cp $WORKSPACE/tests/metadata/com.politedroid.yml metadata #TODO: the timestamp of the oldest apk in the file should be used, even if that # doesn't exist anymore -echo "com.politedroid_4.apk com.politedroid 2016-01-01" > stats/known_apks.txt -echo "com.politedroid_5.apk com.politedroid 2017-01-01" >> stats/known_apks.txt -echo "com.politedroid_6.apk com.politedroid 2018-01-01" >> stats/known_apks.txt $sed -i -e 's/ArchivePolicy:.*/ArchivePolicy: 1 versions/' metadata/com.politedroid.yml -timestamp=1483228800 # $(date -u --date=2017-01-01 +%s)000 +timestamp=1498176000000 # $(date -u --date=2017-01-01 +%s)000 +pwd $fdroid update --pretty --nosign grep -F "\"added\": $timestamp" repo/index-v1.json @@ -1078,7 +1076,7 @@ GIT_REMOTE=`create_test_dir` GNUPGHOME=$REPOROOT/gnupghome cd $REPOROOT fdroid_init_with_prebuilt_keystore -cp -a $WORKSPACE/tests/metadata $WORKSPACE/tests/repo $WORKSPACE/tests/stats $REPOROOT/ +cp -a $WORKSPACE/tests/metadata $WORKSPACE/tests/repo $REPOROOT/ echo "binary_transparency_remote: $GIT_REMOTE" >> config.yml $fdroid update --verbose $fdroid deploy --verbose @@ -1224,7 +1222,7 @@ $git config receive.denyCurrentBranch updateInstead cd $OFFLINE_ROOT fdroid_init_with_prebuilt_keystore printf '\narchive_older: 3\n' >> config.yml -cp -a $WORKSPACE/tests/metadata $WORKSPACE/tests/repo $WORKSPACE/tests/stats $OFFLINE_ROOT/ +cp -a $WORKSPACE/tests/metadata $WORKSPACE/tests/repo $OFFLINE_ROOT/ mkdir $OFFLINE_ROOT/unsigned cp $WORKSPACE/tests/urzip-release-unsigned.apk $OFFLINE_ROOT/unsigned diff --git a/tests/scanner.TestCase b/tests/scanner.TestCase index 83b6e8ff..6c965723 100755 --- a/tests/scanner.TestCase +++ b/tests/scanner.TestCase @@ -14,7 +14,7 @@ import unittest import uuid import zipfile from dataclasses import asdict -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from unittest import mock if sys.version_info >= (3, 11): @@ -592,7 +592,7 @@ class Test_SignatureDataController(unittest.TestCase): sdc = fdroidserver.scanner.SignatureDataController( 'nnn', 'fff.yml', 'https://example.com/test.json' ) - sdc.data['last_updated'] = datetime.utcnow().timestamp() + sdc.data['last_updated'] = datetime.now(timezone.utc).timestamp() sdc.check_last_updated() def test_check_last_updated_exception_cache_outdated(self): @@ -600,7 +600,9 @@ class Test_SignatureDataController(unittest.TestCase): 'nnn', 'fff.yml', 'https://example.com/test.json' ) sdc.cache_duration = timedelta(days=7) - sdc.data['last_updated'] = (datetime.utcnow() - timedelta(days=30)).timestamp() + sdc.data['last_updated'] = ( + datetime.now(timezone.utc) - timedelta(days=30) + ).timestamp() with self.assertRaises(fdroidserver.scanner.SignatureDataOutdatedException): sdc.check_last_updated() diff --git a/tests/stats/known_apks.txt b/tests/stats/known_apks.txt deleted file mode 100644 index ee162b10..00000000 --- a/tests/stats/known_apks.txt +++ /dev/null @@ -1,18 +0,0 @@ -com.example.test.helloworld_1.apk com.example.test.helloworld 2023-02-17 -com.politedroid_3.apk com.politedroid 2017-06-23 -com.politedroid_4.apk com.politedroid 2017-06-23 -com.politedroid_5.apk com.politedroid 2017-06-23 -com.politedroid_6.apk com.politedroid 2017-06-23 -duplicate.permisssions_9999999.apk duplicate.permisssions 2017-12-22 -fake.ota.update_1234.zip fake.ota.update 2016-03-10 -info.zwanenburg.caffeinetile_4.apk info.zwanenburg.caffeinetile 2018-10-10 -no.min.target.sdk_987.apk no.min.target.sdk 2018-10-10 -obb.main.oldversion_1444412523.apk obb.main.oldversion 2013-12-31 -obb.main.twoversions_1101613.apk obb.main.twoversions 2015-10-12 -obb.main.twoversions_1101615.apk obb.main.twoversions 2016-01-01 -obb.main.twoversions_1101617.apk obb.main.twoversions 2016-06-20 -obb.mainpatch.current_1619.apk obb.mainpatch.current 2016-04-23 -obb.mainpatch.current_1619_another-release-key.apk obb.mainpatch.current 2017-06-01 -souch.smsbypass_9.apk souch.smsbypass 2018-04-26 -urzip-; Рахма́, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢·.apk info.guardianproject.urzip 2016-06-23 -v1.v2.sig_1020.apk v1.v2.sig 2023-02-17 diff --git a/tests/update.TestCase b/tests/update.TestCase index bf5dc7e7..ce91339d 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -697,14 +697,10 @@ class UpdateTest(unittest.TestCase): os.chdir(self.testdir) os.mkdir('repo') - os.mkdir('stats') - with open(os.path.join('stats', 'known_apks.txt'), 'w') as fp: - fp.write('se.manyver_30.apk se.manyver 2018-10-10\n') filename = 'Norway_bouvet_europe_2.obf.zip' shutil.copy(os.path.join(self.basedir, filename), 'repo') knownapks = fdroidserver.common.KnownApks() files, fcachechanged = fdroidserver.update.scan_repo_files(dict(), 'repo', knownapks, False) - knownapks.writeifchanged() self.assertTrue(fcachechanged) info = files[0] From 5032207da0adbb5fac16cba89f502884ce059bae Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 30 Oct 2024 14:00:06 +0100 Subject: [PATCH 1696/2116] add basic tests of KnownApks mechanism The tests in tests/run-tests do provide coverage for these cases, but it is not explicit, but just comes from testing that the index file has not changed. These tests make it explicit what is being tested. --- tests/common.TestCase | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tests/common.TestCase b/tests/common.TestCase index 385033cf..e4a144ac 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -22,6 +22,7 @@ import textwrap import yaml import gzip from argparse import ArgumentParser +from datetime import datetime, timezone from zipfile import BadZipFile, ZipFile from unittest import mock from pathlib import Path @@ -2935,6 +2936,37 @@ class CommonTest(unittest.TestCase): [{'url': s}], fdroidserver.common.parse_mirrors_config(mirrors) ) + def test_KnownApks_recordapk(self): + """Test that added dates are being fetched from the index. + + There are more related tests in tests/run-tests. + + """ + now = datetime.now(timezone.utc) + knownapks = fdroidserver.common.KnownApks() + for apkName in knownapks.apks: + knownapks.recordapk(apkName, 'ignored', default_date=now) + for appid, added in knownapks.apks.values(): + self.assertNotEqual(added, now) + + def test_KnownApks_recordapk_new(self): + """Test that new added dates work, and are not replaced later. + + There are more related tests in tests/run-tests. + + """ + now = datetime.now(timezone.utc) + knownapks = fdroidserver.common.KnownApks() + fake_apk = 'fake.apk' + knownapks.recordapk(fake_apk, 'ignored', default_date=now) + for apk, (appid, added) in knownapks.apks.items(): + if apk == fake_apk: + self.assertEqual(added, now) + else: + self.assertNotEqual(added, now) + knownapks.recordapk(fake_apk, 'ignored', default_date=datetime.now(timezone.utc)) + self.assertEqual(knownapks.apks[fake_apk][1], now) + APKS_WITH_JAR_SIGNATURES = ( ( From 173c1d67f41da973151d67c13b14cee508972ad8 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 30 Oct 2024 14:01:54 +0100 Subject: [PATCH 1697/2116] KnownApks: appid is no longer needed at all, remove it. --- fdroidserver/common.py | 9 ++++----- fdroidserver/update.py | 10 +++++----- tests/common.TestCase | 12 ++++++------ tests/update.TestCase | 6 ++---- 4 files changed, 17 insertions(+), 20 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index bc9413c1..2bdd54c5 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2564,9 +2564,9 @@ class KnownApks: for version in data["versions"].values(): filename = version["file"]["name"][1:] date = datetime.fromtimestamp(version["added"] // 1000, tz=timezone.utc) - self.apks[filename] = (appid, date) + self.apks[filename] = date - def recordapk(self, apkName, app, default_date=None): + def recordapk(self, apkName, default_date=None): """ Record an APK (if it's new, otherwise does nothing). @@ -2578,10 +2578,9 @@ class KnownApks: if apkName not in self.apks: if default_date is None: default_date = datetime.now(timezone.utc) - self.apks[apkName] = (app, default_date) + self.apks[apkName] = default_date self.changed = True - _ignored, added = self.apks[apkName] - return added + return self.apks[apkName] def get_file_extension(filename): diff --git a/fdroidserver/update.py b/fdroidserver/update.py index d5c3d922..c561199a 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -690,7 +690,7 @@ def scan_repo_for_ipas(apkcache, repodir, knownapks): apkcache[ipa_name] = ipa cachechanged = True - added = knownapks.recordapk(ipa_name, ipa['packageName']) + added = knownapks.recordapk(ipa_name) if added: ipa['added'] = added @@ -1549,8 +1549,9 @@ def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False): default_date_param = None # Record in knownapks, getting the added date at the same time.. - added = knownapks.recordapk(repo_file['apkName'], repo_file['packageName'], - default_date=default_date_param) + added = knownapks.recordapk( + repo_file['apkName'], default_date=default_date_param + ) if added: repo_file['added'] = added @@ -2006,8 +2007,7 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal default_date_param = None # Record in known apks, getting the added date at the same time.. - added = knownapks.recordapk(apk['apkName'], apk['packageName'], - default_date=default_date_param) + added = knownapks.recordapk(apk['apkName'], default_date=default_date_param) if added: apk['added'] = added diff --git a/tests/common.TestCase b/tests/common.TestCase index e4a144ac..f04df702 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -2945,8 +2945,8 @@ class CommonTest(unittest.TestCase): now = datetime.now(timezone.utc) knownapks = fdroidserver.common.KnownApks() for apkName in knownapks.apks: - knownapks.recordapk(apkName, 'ignored', default_date=now) - for appid, added in knownapks.apks.values(): + knownapks.recordapk(apkName, default_date=now) + for added in knownapks.apks.values(): self.assertNotEqual(added, now) def test_KnownApks_recordapk_new(self): @@ -2958,14 +2958,14 @@ class CommonTest(unittest.TestCase): now = datetime.now(timezone.utc) knownapks = fdroidserver.common.KnownApks() fake_apk = 'fake.apk' - knownapks.recordapk(fake_apk, 'ignored', default_date=now) - for apk, (appid, added) in knownapks.apks.items(): + knownapks.recordapk(fake_apk, default_date=now) + for apk, added in knownapks.apks.items(): if apk == fake_apk: self.assertEqual(added, now) else: self.assertNotEqual(added, now) - knownapks.recordapk(fake_apk, 'ignored', default_date=datetime.now(timezone.utc)) - self.assertEqual(knownapks.apks[fake_apk][1], now) + knownapks.recordapk(fake_apk, default_date=datetime.now(timezone.utc)) + self.assertEqual(knownapks.apks[fake_apk], now) APKS_WITH_JAR_SIGNATURES = ( diff --git a/tests/update.TestCase b/tests/update.TestCase index ce91339d..2489d646 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -2048,12 +2048,10 @@ class TestScanRepoForIpas(unittest.TestCase): knownapks.recordapk.call_count = 2 self.assertTrue( - unittest.mock.call('abc.Def_123.ipa', 'abc') - in knownapks.recordapk.mock_calls + unittest.mock.call('abc.Def_123.ipa') in knownapks.recordapk.mock_calls ) self.assertTrue( - unittest.mock.call('xyz.XXX_123.ipa', 'xyz') - in knownapks.recordapk.mock_calls + unittest.mock.call('xyz.XXX_123.ipa') in knownapks.recordapk.mock_calls ) From ab28c442e2d4bff65471bdfbfbd6073e6ce0cdd8 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 30 Oct 2024 14:03:56 +0100 Subject: [PATCH 1698/2116] KnownApks: remove dead code --- fdroidserver/common.py | 1 - 1 file changed, 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 2bdd54c5..7553f74b 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2579,7 +2579,6 @@ class KnownApks: if default_date is None: default_date = datetime.now(timezone.utc) self.apks[apkName] = default_date - self.changed = True return self.apks[apkName] From 56bed02a29b51152556c80bc8fd31f4557f6a47f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 21 Feb 2024 18:01:56 +0100 Subject: [PATCH 1699/2116] install: download_apk() fetchs APKs by appid based on the index --- fdroidserver/common.py | 93 +++++++++++++++++++++++++++++++++++++++++ fdroidserver/install.py | 45 +++++++++++++++++++- tests/common.TestCase | 16 +++++++ 3 files changed, 152 insertions(+), 2 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 7553f74b..5d54ac09 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -28,6 +28,7 @@ # common.py is imported by all modules, so do not import third-party # libraries here as they will become a requirement for all commands. +import copy import difflib from typing import List import git @@ -60,6 +61,7 @@ from base64 import urlsafe_b64encode from binascii import hexlify from datetime import datetime, timedelta, timezone from queue import Queue +from urllib.parse import urlparse, urlunparse from zipfile import ZipFile import fdroidserver.metadata @@ -435,6 +437,14 @@ def get_config(): return config +def get_cachedir(): + cachedir = config and config.get('cachedir') + if cachedir and os.path.exists(cachedir): + return Path(cachedir) + else: + return Path(tempfile.mkdtemp()) + + def regsub_file(pattern, repl, path): with open(path, 'rb') as f: text = f.read() @@ -609,6 +619,17 @@ def parse_mirrors_config(mirrors): raise TypeError(_('only accepts strings, lists, and tuples')) +def append_filename_to_mirrors(filename, mirrors): + """Append the filename to all "url" entries in the mirrors dict.""" + appended = copy.deepcopy(mirrors) + for mirror in appended: + parsed = urlparse(mirror['url']) + mirror['url'] = urlunparse( + parsed._replace(path=os.path.join(parsed.path, filename)) + ) + return appended + + def file_entry(filename, hash_value=None): meta = {} meta["name"] = "/" + Path(filename).as_posix().split("/", 1)[1] @@ -4620,3 +4641,75 @@ def _install_ndk(ndk): logging.info( _('Set NDK {release} ({version}) up').format(release=ndk, version=version) ) + + +FDROIDORG_MIRRORS = [ + { + 'isPrimary': True, + 'url': 'https://f-droid.org/repo', + 'dnsA': ['65.21.79.229', '136.243.44.143'], + 'dnsAAAA': ['2a01:4f8:212:c98::2', '2a01:4f9:3b:546d::2'], + 'worksWithoutSNI': True, + }, + { + 'url': 'http://fdroidorg6cooksyluodepej4erfctzk7rrjpjbbr6wx24jh3lqyfwyd.onion/fdroid/repo' + }, + { + 'url': 'http://dotsrccccbidkzg7oc7oj4ugxrlfbt64qebyunxbrgqhxiwj3nl6vcad.onion/fdroid/repo' + }, + { + 'url': 'http://ftpfaudev4triw2vxiwzf4334e3mynz7osqgtozhbc77fixncqzbyoyd.onion/fdroid/repo' + }, + { + 'url': 'http://lysator7eknrfl47rlyxvgeamrv7ucefgrrlhk7rouv3sna25asetwid.onion/pub/fdroid/repo' + }, + { + 'url': 'http://mirror.ossplanetnyou5xifr6liw5vhzwc2g2fmmlohza25wwgnnaw65ytfsad.onion/fdroid/repo' + }, + {'url': 'https://fdroid.tetaneutral.net/fdroid/repo', 'countryCode': 'FR'}, + { + 'url': 'https://ftp.agdsn.de/fdroid/repo', + 'countryCode': 'DE', + "dnsA": ["141.30.235.39"], + "dnsAAAA": ["2a13:dd85:b00:12::1"], + "worksWithoutSNI": True, + }, + { + 'url': 'https://ftp.fau.de/fdroid/repo', + 'countryCode': 'DE', + "dnsA": ["131.188.12.211"], + "dnsAAAA": ["2001:638:a000:1021:21::1"], + "worksWithoutSNI": True, + }, + {'url': 'https://ftp.gwdg.de/pub/android/fdroid/repo', 'countryCode': 'DE'}, + { + 'url': 'https://ftp.lysator.liu.se/pub/fdroid/repo', + 'countryCode': 'SE', + "dnsA": ["130.236.254.251", "130.236.254.253"], + "dnsAAAA": ["2001:6b0:17:f0a0::fb", "2001:6b0:17:f0a0::fd"], + "worksWithoutSNI": True, + }, + {'url': 'https://mirror.cyberbits.eu/fdroid/repo', 'countryCode': 'FR'}, + { + 'url': 'https://mirror.fcix.net/fdroid/repo', + 'countryCode': 'US', + "dnsA": ["23.152.160.16"], + "dnsAAAA": ["2620:13b:0:1000::16"], + "worksWithoutSNI": True, + }, + {'url': 'https://mirror.kumi.systems/fdroid/repo', 'countryCode': 'AT'}, + {'url': 'https://mirror.level66.network/fdroid/repo', 'countryCode': 'DE'}, + {'url': 'https://mirror.ossplanet.net/fdroid/repo', 'countryCode': 'TW'}, + {'url': 'https://mirrors.dotsrc.org/fdroid/repo', 'countryCode': 'DK'}, + {'url': 'https://opencolo.mm.fcix.net/fdroid/repo', 'countryCode': 'US'}, + { + 'url': 'https://plug-mirror.rcac.purdue.edu/fdroid/repo', + 'countryCode': 'US', + "dnsA": ["128.211.151.252"], + "dnsAAAA": ["2001:18e8:804:35::1337"], + "worksWithoutSNI": True, + }, +] +FDROIDORG_FINGERPRINT = ( + '43238D512C1E5EB2D6569F4A3AFBF5523418B82E0A3ED1552770ABB9A9C9CCAB' +) diff --git a/fdroidserver/install.py b/fdroidserver/install.py index b9370ee5..362d5aed 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -20,17 +20,58 @@ import sys import os import glob -from argparse import ArgumentParser import logging +from argparse import ArgumentParser +from pathlib import Path +from urllib.parse import urlencode, urlparse, urlunparse + from . import _ -from . import common +from . import common, index, net from .common import SdkToolsPopen from .exception import FDroidException config = None +DEFAULT_IPFS_GATEWAYS = ("https://gateway.ipfs.io/ipfs/",) + + +def download_apk(appid='org.fdroid.fdroid'): + """Download an APK from F-Droid via the first mirror that works.""" + url = urlunparse( + urlparse(common.FDROIDORG_MIRRORS[0]['url'])._replace( + query=urlencode({'fingerprint': common.FDROIDORG_FINGERPRINT}) + ) + ) + + data, _ignored = index.download_repo_index_v2(url) + app = data.get('packages', dict()).get(appid) + preferred_version = None + for version in app['versions'].values(): + if not preferred_version: + # if all else fails, use the first one + preferred_version = version + if not version.get('releaseChannels'): + # prefer APK in default release channel + preferred_version = version + break + print('skipping', version) + + mirrors = common.append_filename_to_mirrors( + preferred_version['file']['name'][1:], common.FDROIDORG_MIRRORS + ) + ipfsCIDv1 = preferred_version['file'].get('ipfsCIDv1') + if ipfsCIDv1: + for gateway in DEFAULT_IPFS_GATEWAYS: + mirrors.append({'url': os.path.join(gateway, ipfsCIDv1)}) + f = net.download_using_mirrors(mirrors) + if f and os.path.exists(f): + versionCode = preferred_version['manifest']['versionCode'] + f = Path(f) + return str(f.rename(f.with_stem(f'{appid}_{versionCode}')).resolve()) + + def devices(): p = SdkToolsPopen(['adb', "devices"]) if p.returncode != 0: diff --git a/tests/common.TestCase b/tests/common.TestCase index f04df702..c4959cb5 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -36,6 +36,7 @@ if localmodule not in sys.path: sys.path.insert(0, localmodule) import fdroidserver.index +import fdroidserver.install import fdroidserver.signindex import fdroidserver.common import fdroidserver.metadata @@ -2967,6 +2968,21 @@ class CommonTest(unittest.TestCase): knownapks.recordapk(fake_apk, default_date=datetime.now(timezone.utc)) self.assertEqual(knownapks.apks[fake_apk], now) + def test_append_filename_to_mirrors(self): + filename = 'test.apk' + url = 'https://example.com/fdroid/repo' + mirrors = [{'url': url}] + self.assertEqual( + [{'url': url + '/' + filename}], + fdroidserver.common.append_filename_to_mirrors(filename, mirrors), + ) + + def test_append_filename_to_mirrors_full(self): + filename = 'test.apk' + mirrors = fdroidserver.common.FDROIDORG_MIRRORS + for mirror in fdroidserver.common.append_filename_to_mirrors(filename, mirrors): + self.assertTrue(mirror['url'].endswith('/' + filename)) + APKS_WITH_JAR_SIGNATURES = ( ( From 49dcc53076f673e04f3f0cf98df1f02d5365a9c8 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 27 Feb 2024 17:07:57 +0100 Subject: [PATCH 1700/2116] install: download_fdroid_apk() to fetch the recommended initial APK --- fdroidserver/install.py | 12 ++++++++++++ tests/install.TestCase | 7 +++++++ 2 files changed, 19 insertions(+) diff --git a/fdroidserver/install.py b/fdroidserver/install.py index 362d5aed..3c9316e9 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -72,6 +72,18 @@ def download_apk(appid='org.fdroid.fdroid'): return str(f.rename(f.with_stem(f'{appid}_{versionCode}')).resolve()) +def download_fdroid_apk(): + """Directly download the current F-Droid APK and verify it. + + This downloads the "download button" link, which is the version + that is best tested for new installs. + + """ + mirror = common.FDROIDORG_MIRRORS[0] + mirror['url'] = urlunparse(urlparse(mirror['url'])._replace(path='F-Droid.apk')) + return net.download_using_mirrors([mirror]) + + def devices(): p = SdkToolsPopen(['adb', "devices"]) if p.returncode != 0: diff --git a/tests/install.TestCase b/tests/install.TestCase index cef5c022..540a2bf0 100755 --- a/tests/install.TestCase +++ b/tests/install.TestCase @@ -7,6 +7,8 @@ import os import sys import unittest +from pathlib import Path + localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') ) @@ -33,6 +35,11 @@ class InstallTest(unittest.TestCase): for device in devices: self.assertIsInstance(device, str) + @unittest.skipUnless(os.getenv('test_download_fdroid_apk'), 'requires net access') + def test_download_fdroid_apk(self): + f = fdroidserver.install.download_fdroid_apk() + self.assertTrue(Path(f).exists()) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 2e3f6d273a608077a599d7a017137a878891a67e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 26 Feb 2024 18:13:53 +0100 Subject: [PATCH 1701/2116] net: download_using_mirrors() to download like fdroidclient does --- fdroidserver/net.py | 87 +++++++++++++++++++++++++++++++++++++++++++-- tests/net.TestCase | 22 ++++++++++++ 2 files changed, 106 insertions(+), 3 deletions(-) diff --git a/fdroidserver/net.py b/fdroidserver/net.py index 49d67f2c..5c6e0144 100644 --- a/fdroidserver/net.py +++ b/fdroidserver/net.py @@ -17,13 +17,20 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import copy import logging import os +import random import requests +import tempfile import time import urllib +import urllib3 from requests.adapters import HTTPAdapter, Retry -from requests.exceptions import ChunkedEncodingError + +from . import _, common + +logger = logging.getLogger(__name__) HEADERS = {'User-Agent': 'F-Droid'} @@ -64,14 +71,88 @@ def download_file(url, local_filename=None, dldir='tmp', retries=3, backoff_fact f.write(chunk) f.flush() return local_filename - except ChunkedEncodingError as err: + except requests.exceptions.ChunkedEncodingError as err: if i == retries: raise err - logging.warning('Download interrupted, retrying...') + logger.warning('Download interrupted, retrying...') time.sleep(backoff_factor * 2**i) raise ValueError("retries must be >= 0") +def download_using_mirrors(mirrors, local_filename=None): + """Try to download the file from any working mirror. + + Download the file that all URLs in the mirrors list point to, + trying all the tricks, starting with the most private methods + first. The list of mirrors is converted into a list of mirror + configurations to try, in order that the should be attempted. + + This builds mirror_configs_to_try using all possible combos to + try. If a mirror is marked with worksWithoutSNI: True, then this + logic will try it twice: first without SNI, then again with SNI. + + """ + mirrors = common.parse_mirrors_config(mirrors) + mirror_configs_to_try = [] + for mirror in mirrors: + mirror_configs_to_try.append(mirror) + if mirror.get('worksWithoutSNI'): + m = copy.deepcopy(mirror) + del m['worksWithoutSNI'] + mirror_configs_to_try.append(m) + + if not local_filename: + for mirror in mirrors: + filename = urllib.parse.urlparse(mirror['url']).path.split('/')[-1] + if filename: + break + if filename: + local_filename = os.path.join(common.get_cachedir(), filename) + else: + local_filename = tempfile.mkstemp(prefix='fdroid-') + + timeouts = (2, 10, 100) + last_exception = None + for timeout in timeouts: + for mirror in mirror_configs_to_try: + last_exception = None + urllib3.util.ssl_.HAS_SNI = not mirror.get('worksWithoutSNI') + try: + # the stream=True parameter keeps memory usage low + r = requests.get( + mirror['url'], + stream=True, + allow_redirects=False, + headers=HEADERS, + # add jitter to the timeout to be less predictable + timeout=timeout + random.randint(0, timeout), # nosec B311 + ) + if r.status_code != 200: + raise requests.exceptions.HTTPError(r.status_code, response=r) + with open(local_filename, 'wb') as f: + for chunk in r.iter_content(chunk_size=1024): + if chunk: # filter out keep-alive new chunks + f.write(chunk) + f.flush() + return local_filename + except ( + ConnectionError, + requests.exceptions.ChunkedEncodingError, + requests.exceptions.ConnectionError, + requests.exceptions.ContentDecodingError, + requests.exceptions.HTTPError, + requests.exceptions.SSLError, + requests.exceptions.StreamConsumedError, + requests.exceptions.Timeout, + requests.exceptions.UnrewindableBodyError, + ) as e: + last_exception = e + logger.debug(_('Retrying failed download: %s') % str(e)) + # if it hasn't succeeded by now, then give up and raise last exception + if last_exception: + raise last_exception + + def http_get(url, etag=None, timeout=600): """Download the content from the given URL by making a GET request. diff --git a/tests/net.TestCase b/tests/net.TestCase index a50f5925..725bbbfd 100755 --- a/tests/net.TestCase +++ b/tests/net.TestCase @@ -121,6 +121,28 @@ class NetTest(unittest.TestCase): net.download_file('http://localhost:%d/f.txt' % server.port) server.stop() + def test_download_using_mirrors_retries(self): + server = RetryServer() + f = net.download_using_mirrors( + [ + 'https://fake.com/f.txt', # 404 or 301 Redirect + 'https://httpbin.org/status/403', + 'https://httpbin.org/status/500', + 'http://localhost:1/f.txt', # ConnectionError + 'http://localhost:%d/' % server.port, + ], + ) + # strip the HTTP headers and compare the reply + self.assertEqual(server.reply.split(b'\n\n')[1], Path(f).read_bytes()) + server.stop() + + def test_download_using_mirrors_retries_not_forever(self): + """The retry logic should eventually exit with an error.""" + server = RetryServer(failures=5) + with self.assertRaises(requests.exceptions.ConnectionError): + net.download_using_mirrors(['http://localhost:%d/' % server.port]) + server.stop() + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 59fcfa5dec7240b0ca7bf21a3a1ed95a53a9cab3 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 4 Mar 2024 12:44:20 +0100 Subject: [PATCH 1702/2116] index: download_repo_index_v2() uses mirrors test_download_repo_index_v2_url_parsing is no longer needed, since all the things it tested are now handled in test_download_repo_index_v2 --- fdroidserver/common.py | 19 ++++++++++- fdroidserver/index.py | 32 +++++++++--------- tests/api.TestCase | 53 ++++++++++++++++++++--------- tests/common.TestCase | 17 ++++++++++ tests/index.TestCase | 76 ++++++++++++++++-------------------------- tests/testcommon.py | 3 ++ 6 files changed, 119 insertions(+), 81 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 5d54ac09..4bc70a2e 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -61,7 +61,7 @@ from base64 import urlsafe_b64encode from binascii import hexlify from datetime import datetime, timedelta, timezone from queue import Queue -from urllib.parse import urlparse, urlunparse +from urllib.parse import urlparse, urlsplit, urlunparse from zipfile import ZipFile import fdroidserver.metadata @@ -619,6 +619,23 @@ def parse_mirrors_config(mirrors): raise TypeError(_('only accepts strings, lists, and tuples')) +def get_mirrors(url, filename=None): + """Get list of dict entries for mirrors, appending filename if provided.""" + # TODO use cached index if it exists + if isinstance(url, str): + url = urlsplit(url) + + if url.netloc == 'f-droid.org': + mirrors = FDROIDORG_MIRRORS + else: + mirrors = parse_mirrors_config(url.geturl()) + + if filename: + return append_filename_to_mirrors(filename, mirrors) + else: + return mirrors + + def append_filename_to_mirrors(filename, mirrors): """Append the filename to all "url" entries in the mirrors dict.""" appended = copy.deepcopy(mirrors) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 5ca59662..d3f9d44e 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -1633,7 +1633,7 @@ def download_repo_index_v1(url_str, etag=None, verify_fingerprint=True, timeout= return index, new_etag -def download_repo_index_v2(url_str, etag=None, verify_fingerprint=True, timeout=600): +def download_repo_index_v2(url_str, etag=None, verify_fingerprint=True, timeout=None): """Download and verifies index v2 file, then returns its data. Downloads the repository index from the given :param url_str and @@ -1652,8 +1652,13 @@ def download_repo_index_v2(url_str, etag=None, verify_fingerprint=True, timeout= - The new eTag as returned by the HTTP request """ + etag # etag is unused but needs to be there to keep the same API as the earlier functions. + url = urllib.parse.urlsplit(url_str) + if timeout is not None: + logging.warning('"timeout" argument of download_repo_index_v2() is deprecated!') + fingerprint = None if verify_fingerprint: query = urllib.parse.parse_qs(url.query) @@ -1665,29 +1670,22 @@ def download_repo_index_v2(url_str, etag=None, verify_fingerprint=True, timeout= path = url.path.rsplit('/', 1)[0] else: path = url.path.rstrip('/') + url = urllib.parse.SplitResult(url.scheme, url.netloc, path, '', '') - url = urllib.parse.SplitResult(url.scheme, url.netloc, path + '/entry.jar', '', '') - download, new_etag = net.http_get(url.geturl(), etag, timeout) + mirrors = common.get_mirrors(url, 'entry.jar') + f = net.download_using_mirrors(mirrors) + entry, public_key, fingerprint = get_index_from_jar(f, fingerprint) - if download is None: - return None, new_etag - - # jarsigner is used to verify the JAR, it requires a file for input - with tempfile.TemporaryDirectory() as dirname: - with (Path(dirname) / 'entry.jar').open('wb') as fp: - fp.write(download) - fp.flush() - entry, public_key, fingerprint = get_index_from_jar(fp.name, fingerprint) - - name = entry['index']['name'] sha256 = entry['index']['sha256'] - url = urllib.parse.SplitResult(url.scheme, url.netloc, path + name, '', '') - index, _ignored = net.http_get(url.geturl(), None, timeout) + mirrors = common.get_mirrors(url, entry['index']['name'][1:]) + f = net.download_using_mirrors(mirrors) + with open(f, 'rb') as fp: + index = fp.read() if sha256 != hashlib.sha256(index).hexdigest(): raise VerificationException( _("SHA-256 of {url} does not match entry!").format(url=url) ) - return json.loads(index), new_etag + return json.loads(index), None def get_index_from_jar(jarfile, fingerprint=None, allow_deprecated=False): diff --git a/tests/api.TestCase b/tests/api.TestCase index 0dbaefd8..e3e66765 100755 --- a/tests/api.TestCase +++ b/tests/api.TestCase @@ -2,6 +2,7 @@ import inspect import os +import shutil import sys import unittest from unittest import mock @@ -14,6 +15,8 @@ if localmodule not in sys.path: sys.path.insert(0, localmodule) import fdroidserver +from fdroidserver import common, signindex +from testcommon import GP_FINGERPRINT, mkdtemp class ApiTest(unittest.TestCase): @@ -29,6 +32,18 @@ class ApiTest(unittest.TestCase): self.basedir = os.path.join(localmodule, 'tests') os.chdir(self.basedir) + self._td = mkdtemp() + self.testdir = self._td.name + + common.config = None + config = common.read_config() + config['jarsigner'] = common.find_sdk_tools_cmd('jarsigner') + common.config = config + signindex.config = config + + def tearDown(self): + self._td.cleanup() + def test_download_repo_index_no_fingerprint(self): with self.assertRaises(fdroidserver.VerificationException): fdroidserver.download_repo_index("http://example.org") @@ -67,23 +82,31 @@ class ApiTest(unittest.TestCase): ) self.assertEqual(index_url, etag_set_to_url) - @mock.patch('fdroidserver.net.http_get') - def test_download_repo_index_v2_url_parsing(self, mock_http_get): - """Test whether it is trying to download the right file - - This passes the URL back via the etag return value just as a - hack to check which URL was actually attempted. - - """ - mock_http_get.side_effect = lambda url, etag, timeout: (None, url) - repo_url = 'https://example.org/fdroid/repo' - entry_url = 'https://example.org/fdroid/repo/entry.jar' - index_url = 'https://example.org/fdroid/repo/index-v2.json' - for url in (repo_url, entry_url, index_url): - _ignored, etag_set_to_url = fdroidserver.download_repo_index_v2( + @mock.patch('fdroidserver.net.download_using_mirrors') + def test_download_repo_index_v2(self, mock_download_using_mirrors): + """Basically a copy of IndexTest.test_download_repo_index_v2""" + mock_download_using_mirrors.side_effect = lambda mirrors: os.path.join( + self.testdir, 'repo', os.path.basename(mirrors[0]['url']) + ) + os.chdir(self.testdir) + signindex.config['keystore'] = os.path.join(self.basedir, 'keystore.jks') + os.mkdir('repo') + shutil.copy(os.path.join(self.basedir, 'repo', 'entry.json'), 'repo') + shutil.copy(os.path.join(self.basedir, 'repo', 'index-v2.json'), 'repo') + signindex.sign_index('repo', 'entry.json') + repo_url = 'https://fake.url/fdroid/repo' + entry_url = 'https://fake.url/fdroid/repo/entry.jar' + index_url = 'https://fake.url/fdroid/repo/index-v2.json' + fingerprint_url = 'https://fake.url/fdroid/repo?fingerprint=' + GP_FINGERPRINT + slash_url = 'https://fake.url/fdroid/repo//?fingerprint=' + GP_FINGERPRINT + for url in (repo_url, entry_url, index_url, fingerprint_url, slash_url): + data, _ignored = fdroidserver.download_repo_index_v2( url, verify_fingerprint=False ) - self.assertEqual(entry_url, etag_set_to_url) + self.assertEqual(['repo', 'packages'], list(data)) + self.assertEqual( + 'My First F-Droid Repo Demo', data['repo']['name']['en-US'] + ) if __name__ == "__main__": diff --git a/tests/common.TestCase b/tests/common.TestCase index c4959cb5..c2e03243 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -2968,6 +2968,23 @@ class CommonTest(unittest.TestCase): knownapks.recordapk(fake_apk, default_date=datetime.now(timezone.utc)) self.assertEqual(knownapks.apks[fake_apk], now) + def test_get_mirrors_fdroidorg(self): + mirrors = fdroidserver.common.get_mirrors( + 'https://f-droid.org/repo', 'entry.jar' + ) + self.assertEqual( + 'https://f-droid.org/repo/entry.jar', + mirrors[0]['url'], + ) + + def test_get_mirrors_other(self): + self.assertEqual( + [{'url': 'https://example.com/fdroid/repo/index-v2.json'}], + fdroidserver.common.get_mirrors( + 'https://example.com/fdroid/repo', 'index-v2.json' + ), + ) + def test_append_filename_to_mirrors(self): filename = 'test.apk' url = 'https://example.com/fdroid/repo' diff --git a/tests/index.TestCase b/tests/index.TestCase index 0e23c71b..facc9e77 100755 --- a/tests/index.TestCase +++ b/tests/index.TestCase @@ -25,13 +25,10 @@ if localmodule not in sys.path: import fdroidserver from fdroidserver import common, index, publish, signindex, update -from testcommon import TmpCwd, mkdtemp, parse_args_for_test +from testcommon import GP_FINGERPRINT, TmpCwd, mkdtemp, parse_args_for_test from pathlib import Path -GP_FINGERPRINT = 'B7C2EEFD8DAC7806AF67DFCD92EB18126BC08312A7F2D6F3862E46013C7A6135' - - class Options: nosign = True pretty = False @@ -183,32 +180,11 @@ class IndexTest(unittest.TestCase): ilist = index.download_repo_index(url, verify_fingerprint=False) self.assertEqual(index_url, ilist[1]) # etag item used to return URL - @patch('fdroidserver.net.http_get') - def test_download_repo_index_v2_url_parsing(self, mock_http_get): - """Test whether it is trying to download the right file - - This passes the URL back via the etag return value just as a - hack to check which URL was actually attempted. - - """ - mock_http_get.side_effect = lambda url, etag, timeout: (None, url) - repo_url = 'https://fake.url/fdroid/repo' - entry_url = 'https://fake.url/fdroid/repo/entry.jar' - index_url = 'https://fake.url/fdroid/repo/index-v2.json' - fingerprint_url = 'https://fake.url/fdroid/repo?fingerprint=' + GP_FINGERPRINT - slash_url = 'https://fake.url/fdroid/repo//?fingerprint=' + GP_FINGERPRINT - for url in (repo_url, entry_url, index_url, fingerprint_url, slash_url): - ilist = index.download_repo_index_v2(url, verify_fingerprint=False) - self.assertEqual(entry_url, ilist[1]) # etag item used to return URL - - @patch('fdroidserver.net.http_get') - def test_download_repo_index_v2(self, mock_http_get): - def http_get_def(url, etag, timeout): # pylint: disable=unused-argument - f = os.path.basename(url) - with open(os.path.join(self.testdir, 'repo', f), 'rb') as fp: - return (fp.read(), 'fakeetag') - - mock_http_get.side_effect = http_get_def + @patch('fdroidserver.net.download_using_mirrors') + def test_download_repo_index_v2(self, mock_download_using_mirrors): + mock_download_using_mirrors.side_effect = lambda mirrors: os.path.join( + self.testdir, 'repo', os.path.basename(mirrors[0]['url']) + ) os.chdir(self.testdir) signindex.config['keystore'] = os.path.join(self.basedir, 'keystore.jks') os.mkdir('repo') @@ -223,15 +199,15 @@ class IndexTest(unittest.TestCase): for url in (repo_url, entry_url, index_url, fingerprint_url, slash_url): data, _ignored = index.download_repo_index_v2(url, verify_fingerprint=False) self.assertEqual(['repo', 'packages'], list(data.keys())) + self.assertEqual( + 'My First F-Droid Repo Demo', data['repo']['name']['en-US'] + ) - @patch('fdroidserver.net.http_get') - def test_download_repo_index_v2_bad_fingerprint(self, mock_http_get): - def http_get_def(url, etag, timeout): # pylint: disable=unused-argument - f = os.path.basename(url) - with open(os.path.join(self.testdir, 'repo', f), 'rb') as fp: - return (fp.read(), 'fakeetag') - - mock_http_get.side_effect = http_get_def + @patch('fdroidserver.net.download_using_mirrors') + def test_download_repo_index_v2_bad_fingerprint(self, mock_download_using_mirrors): + mock_download_using_mirrors.side_effect = lambda mirrors: os.path.join( + self.testdir, 'repo', os.path.basename(mirrors[0]['url']) + ) os.chdir(self.testdir) signindex.config['keystore'] = os.path.join(self.basedir, 'keystore.jks') os.mkdir('repo') @@ -243,22 +219,26 @@ class IndexTest(unittest.TestCase): with self.assertRaises(fdroidserver.exception.VerificationException): data, _ignored = index.download_repo_index_v2(bad_fp_url) - @patch('fdroidserver.net.http_get') - def test_download_repo_index_v2_entry_verify(self, mock_http_get): - def http_get_def(url, etag, timeout): # pylint: disable=unused-argument - return (b'not the entry.jar file contents', 'fakeetag') + @patch('fdroidserver.net.download_using_mirrors') + def test_download_repo_index_v2_entry_verify(self, mock_download_using_mirrors): + def download_using_mirrors_def(mirrors): + f = os.path.join(tempfile.mkdtemp(), os.path.basename(mirrors[0]['url'])) + Path(f).write_text('not the entry.jar file contents') + return f - mock_http_get.side_effect = http_get_def + mock_download_using_mirrors.side_effect = download_using_mirrors_def url = 'https://fake.url/fdroid/repo?fingerprint=' + GP_FINGERPRINT with self.assertRaises(fdroidserver.exception.VerificationException): data, _ignored = index.download_repo_index_v2(url) - @patch('fdroidserver.net.http_get') - def test_download_repo_index_v2_index_verify(self, mock_http_get): - def http_get_def(url, etag, timeout): # pylint: disable=unused-argument - return (b'not the index-v2.json file contents', 'fakeetag') + @patch('fdroidserver.net.download_using_mirrors') + def test_download_repo_index_v2_index_verify(self, mock_download_using_mirrors): + def download_using_mirrors_def(mirrors): + f = os.path.join(tempfile.mkdtemp(), os.path.basename(mirrors[0]['url'])) + Path(f).write_text('not the index-v2.json file contents') + return f - mock_http_get.side_effect = http_get_def + mock_download_using_mirrors.side_effect = download_using_mirrors_def os.chdir(self.testdir) signindex.config['keystore'] = os.path.join(self.basedir, 'keystore.jks') os.mkdir('repo') diff --git a/tests/testcommon.py b/tests/testcommon.py index f0fd11bd..edb54fb0 100644 --- a/tests/testcommon.py +++ b/tests/testcommon.py @@ -24,6 +24,9 @@ import unittest.mock from pathlib import Path +GP_FINGERPRINT = 'B7C2EEFD8DAC7806AF67DFCD92EB18126BC08312A7F2D6F3862E46013C7A6135' + + class TmpCwd: """Context-manager for temporarily changing the current working directory.""" From f1b110942afe7bd61b272db7a0fb3c556b4689aa Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 13 Mar 2024 21:44:49 +0100 Subject: [PATCH 1703/2116] net: let localhost RetryServer tests run with an HTTP proxy active --- tests/net.TestCase | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/net.TestCase b/tests/net.TestCase index 725bbbfd..1c3d5e88 100755 --- a/tests/net.TestCase +++ b/tests/net.TestCase @@ -107,6 +107,7 @@ class NetTest(unittest.TestCase): self.assertTrue(os.path.exists(f)) self.assertEqual('tmp/com.downloader.aegis-3175421.apk', f) + @patch.dict(os.environ, clear=True) def test_download_file_retries(self): server = RetryServer() f = net.download_file('http://localhost:%d/f.txt' % server.port) @@ -114,6 +115,7 @@ class NetTest(unittest.TestCase): self.assertEqual(server.reply.split(b'\n\n')[1], Path(f).read_bytes()) server.stop() + @patch.dict(os.environ, clear=True) def test_download_file_retries_not_forever(self): """The retry logic should eventually exit with an error.""" server = RetryServer(failures=5) From 681d705da06d8497af743939cae49d0bdab9d3ae Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 5 Mar 2024 11:47:58 +0100 Subject: [PATCH 1704/2116] install: reliable algorithm for picking devices from adb output Versions of this algorithm are used elsewhere: * https://github.com/openatx/adbutils/blob/master/adbutils/_adb.py --- fdroidserver/install.py | 91 ++++++++++++++----------- tests/install.TestCase | 144 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 193 insertions(+), 42 deletions(-) diff --git a/fdroidserver/install.py b/fdroidserver/install.py index 3c9316e9..4f65e050 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -28,7 +28,6 @@ from urllib.parse import urlencode, urlparse, urlunparse from . import _ from . import common, index, net -from .common import SdkToolsPopen from .exception import FDroidException config = None @@ -85,14 +84,57 @@ def download_fdroid_apk(): def devices(): - p = SdkToolsPopen(['adb', "devices"]) + """Get the list of device serials for use with adb commands.""" + p = common.SdkToolsPopen(['adb', "devices"]) if p.returncode != 0: raise FDroidException("An error occured when finding devices: %s" % p.output) - lines = [line for line in p.output.splitlines() if not line.startswith('* ')] - if len(lines) < 3: - return [] - lines = lines[1:-1] - return [line.split()[0] for line in lines] + serials = list() + for line in p.output.splitlines(): + columns = line.strip().split("\t", maxsplit=1) + if len(columns) == 2: + serial, status = columns + if status == 'device': + serials.append(serial) + else: + d = {'serial': serial, 'status': status} + logging.warning(_('adb reports {serial} is "{status}"!'.format(**d))) + return serials + + +def install_apks_to_devices(apks): + """Install the list of APKs to all Android devices reported by `adb devices`.""" + for apk in apks: + # Get device list each time to avoid device not found errors + devs = devices() + if not devs: + raise FDroidException(_("No attached devices found")) + logging.info(_("Installing %s...") % apk) + for dev in devs: + logging.info( + _("Installing '{apkfilename}' on {dev}...").format( + apkfilename=apk, dev=dev + ) + ) + p = common.SdkToolsPopen(['adb', "-s", dev, "install", apk]) + fail = "" + for line in p.output.splitlines(): + if line.startswith("Failure"): + fail = line[9:-1] + if not fail: + continue + + if fail == "INSTALL_FAILED_ALREADY_EXISTS": + logging.warning( + _('"{apkfilename}" is already installed on {dev}.').format( + apkfilename=apk, dev=dev + ) + ) + else: + raise FDroidException( + _("Failed to install '{apkfilename}' on {dev}: {error}").format( + apkfilename=apk, dev=dev, error=fail + ) + ) def main(): @@ -152,45 +194,14 @@ def main(): for appid, apk in apks.items(): if not apk: raise FDroidException(_("No signed APK available for %s") % appid) + install_apks_to_devices(apks.values()) else: apks = { common.publishednameinfo(apkfile)[0]: apkfile for apkfile in sorted(glob.glob(os.path.join(output_dir, '*.apk'))) } - - for appid, apk in apks.items(): - # Get device list each time to avoid device not found errors - devs = devices() - if not devs: - raise FDroidException(_("No attached devices found")) - logging.info(_("Installing %s...") % apk) - for dev in devs: - logging.info( - _("Installing '{apkfilename}' on {dev}...").format( - apkfilename=apk, dev=dev - ) - ) - p = SdkToolsPopen(['adb', "-s", dev, "install", apk]) - fail = "" - for line in p.output.splitlines(): - if line.startswith("Failure"): - fail = line[9:-1] - if not fail: - continue - - if fail == "INSTALL_FAILED_ALREADY_EXISTS": - logging.warning( - _('"{apkfilename}" is already installed on {dev}.').format( - apkfilename=apk, dev=dev - ) - ) - else: - raise FDroidException( - _("Failed to install '{apkfilename}' on {dev}: {error}").format( - apkfilename=apk, dev=dev, error=fail - ) - ) + install_apks_to_devices(apks.values()) logging.info('\n' + _('Finished')) diff --git a/tests/install.TestCase b/tests/install.TestCase index 540a2bf0..6e701469 100755 --- a/tests/install.TestCase +++ b/tests/install.TestCase @@ -5,9 +5,11 @@ import inspect import os import sys +import textwrap import unittest from pathlib import Path +from unittest.mock import Mock, patch localmodule = os.path.realpath( os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') @@ -16,13 +18,17 @@ print('localmodule: ' + localmodule) if localmodule not in sys.path: sys.path.insert(0, localmodule) -import fdroidserver.common -import fdroidserver.install +import fdroidserver +from fdroidserver import common, install +from fdroidserver.exception import BuildException, FDroidException class InstallTest(unittest.TestCase): '''fdroidserver/install.py''' + def tearDown(self): + common.config = None + def test_devices(self): config = dict() fdroidserver.common.fill_config_defaults(config) @@ -35,6 +41,140 @@ class InstallTest(unittest.TestCase): for device in devices: self.assertIsInstance(device, str) + def test_devices_fail(self): + common.config = dict() + common.fill_config_defaults(common.config) + common.config['adb'] = '/bin/false' + with self.assertRaises(FDroidException): + fdroidserver.install.devices() + + def test_devices_fail_nonexistent(self): + """This is mostly just to document this strange difference in behavior""" + common.config = dict() + common.fill_config_defaults(common.config) + common.config['adb'] = '/nonexistent' + with self.assertRaises(BuildException): + fdroidserver.install.devices() + + @patch('fdroidserver.common.SdkToolsPopen') + def test_devices_with_mock_none(self, mock_SdkToolsPopen): + p = Mock() + mock_SdkToolsPopen.return_value = p + p.output = 'List of devices attached\n\n' + p.returncode = 0 + common.config = dict() + common.fill_config_defaults(common.config) + self.assertEqual([], fdroidserver.install.devices()) + + @patch('fdroidserver.common.SdkToolsPopen') + def test_devices_with_mock_one(self, mock_SdkToolsPopen): + p = Mock() + mock_SdkToolsPopen.return_value = p + p.output = 'List of devices attached\n05995813\tdevice\n\n' + p.returncode = 0 + common.config = dict() + common.fill_config_defaults(common.config) + self.assertEqual(['05995813'], fdroidserver.install.devices()) + + @patch('fdroidserver.common.SdkToolsPopen') + def test_devices_with_mock_many(self, mock_SdkToolsPopen): + p = Mock() + mock_SdkToolsPopen.return_value = p + p.output = textwrap.dedent( + """* daemon not running; starting now at tcp:5037 + * daemon started successfully + List of devices attached + RZCT809FTQM device + 05995813 device + emulator-5556 device + emulator-5554 unauthorized + 0a388e93 no permissions (missing udev rules? user is in the plugdev group); see [http://developer.android.com/tools/device.html] + 986AY133QL device + 09301JEC215064 device + 015d165c3010200e device + 4DCESKVGUC85VOTO device + + """ + ) + p.returncode = 0 + common.config = dict() + common.fill_config_defaults(common.config) + self.assertEqual( + [ + 'RZCT809FTQM', + '05995813', + 'emulator-5556', + '986AY133QL', + '09301JEC215064', + '015d165c3010200e', + '4DCESKVGUC85VOTO', + ], + fdroidserver.install.devices(), + ) + + @patch('fdroidserver.common.SdkToolsPopen') + def test_devices_with_mock_error(self, mock_SdkToolsPopen): + p = Mock() + mock_SdkToolsPopen.return_value = p + p.output = textwrap.dedent( + """* daemon not running. starting it now on port 5037 * + * daemon started successfully * + ** daemon still not running + error: cannot connect to daemon + """ + ) + p.returncode = 0 + common.config = dict() + common.fill_config_defaults(common.config) + self.assertEqual([], fdroidserver.install.devices()) + + @patch('fdroidserver.common.SdkToolsPopen') + def test_devices_with_mock_no_permissions(self, mock_SdkToolsPopen): + p = Mock() + mock_SdkToolsPopen.return_value = p + p.output = textwrap.dedent( + """List of devices attached + ???????????????? no permissions + """ + ) + p.returncode = 0 + common.config = dict() + common.fill_config_defaults(common.config) + self.assertEqual([], fdroidserver.install.devices()) + + @patch('fdroidserver.common.SdkToolsPopen') + def test_devices_with_mock_unauthorized(self, mock_SdkToolsPopen): + p = Mock() + mock_SdkToolsPopen.return_value = p + p.output = textwrap.dedent( + """List of devices attached + aeef5e4e unauthorized + """ + ) + p.returncode = 0 + common.config = dict() + common.fill_config_defaults(common.config) + self.assertEqual([], fdroidserver.install.devices()) + + @patch('fdroidserver.common.SdkToolsPopen') + def test_devices_with_mock_no_permissions_with_serial(self, mock_SdkToolsPopen): + p = Mock() + mock_SdkToolsPopen.return_value = p + p.output = textwrap.dedent( + """List of devices attached + 4DCESKVGUC85VOTO no permissions (missing udev rules? user is in the plugdev group); see [http://developer.android.com/tools/device.html] + + """ + ) + p.returncode = 0 + common.config = dict() + common.fill_config_defaults(common.config) + self.assertEqual([], fdroidserver.install.devices()) + + @patch('fdroidserver.net.download_using_mirrors', lambda m: 'testvalue') + def test_download_fdroid_apk_smokecheck(self): + self.assertEqual('testvalue', install.download_fdroid_apk()) + @unittest.skipUnless(os.getenv('test_download_fdroid_apk'), 'requires net access') def test_download_fdroid_apk(self): f = fdroidserver.install.download_fdroid_apk() From c7bc8d0fea4874d0093aae21560056a01283ca89 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 27 Feb 2024 20:02:51 +0100 Subject: [PATCH 1705/2116] install: function to fetch, verify and install the F-Droid.apk --- fdroidserver/install.py | 73 ++++++++++++++++++++++++++++++++++++----- tests/install.TestCase | 43 +++++++++++++++++++++++- 2 files changed, 107 insertions(+), 9 deletions(-) diff --git a/fdroidserver/install.py b/fdroidserver/install.py index 4f65e050..2bb8293a 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -20,6 +20,7 @@ import sys import os import glob +import locale import logging from argparse import ArgumentParser @@ -83,6 +84,60 @@ def download_fdroid_apk(): return net.download_using_mirrors([mirror]) +def install_fdroid_apk(privacy_mode=False): + """Download and install F-Droid.apk using all tricks we can muster. + + By default, this first tries to fetch the official install APK + which is offered when someone clicks the "download" button on + https://f-droid.org/. Then it will try all the mirrors and + methods until it gets something successful, or runs out of + options. + + There is privacy_mode which tries to download from mirrors first, + so that this downloads from a mirror that has many different kinds + of files available, thereby breaking the clear link to F-Droid. + + Returns + ------- + None for success or the error message. + + """ + if locale.getlocale()[0].split('_')[-1] in ('CN', 'HK', 'IR', 'TM'): + logging.warning(_('Privacy mode was enabled based on your locale.')) + privacy_mode = True + + if privacy_mode or not (config and config.get('jarsigner')): + download_methods = [download_fdroid_apk] + else: + download_methods = [download_apk, download_fdroid_apk] + for method in download_methods: + try: + f = method() + break + except Exception as e: + logging.info(e) + else: + return _('F-Droid.apk could not be downloaded from any known source!') + + if config and config['apksigner']: + # TODO this should always verify, but that requires APK sig verification in Python #94 + logging.info(_('Verifying package {path} with apksigner.').format(path=f)) + common.verify_apk_signature(f) + fingerprint = common.apk_signer_fingerprint(f) + if fingerprint.upper() != common.FDROIDORG_FINGERPRINT: + return _('{path} has the wrong fingerprint ({fingerprint})!').format( + path=f, fingerprint=fingerprint + ) + + if config and config.get('adb'): + if devices(): + install_apks_to_devices([f]) + os.remove(f) + else: + os.remove(f) + return _('No devices found for `adb install`! Please plug one in.') + + def devices(): """Get the list of device serials for use with adb commands.""" p = common.SdkToolsPopen(['adb', "devices"]) @@ -162,17 +217,16 @@ def main(): common.set_console_logging(options.verbose) if not options.appid and not options.all: - parser.error( - _("option %s: If you really want to install all the signed apps, use --all") - % "all" - ) + # TODO implement me, including a -y/--yes flag + print('TODO prompt the user if they want to download and install F-Droid.apk') config = common.read_config() output_dir = 'repo' - if not os.path.isdir(output_dir): - logging.info(_("No signed output directory - nothing to do")) - sys.exit(0) + if (options.appid or options.all) and not os.path.isdir(output_dir): + logging.error(_("No signed output directory - nothing to do")) + # TODO prompt user if they want to download from f-droid.org + sys.exit(1) if options.appid: vercodes = common.read_pkg_args(options.appid, True) @@ -196,13 +250,16 @@ def main(): raise FDroidException(_("No signed APK available for %s") % appid) install_apks_to_devices(apks.values()) - else: + elif options.all: apks = { common.publishednameinfo(apkfile)[0]: apkfile for apkfile in sorted(glob.glob(os.path.join(output_dir, '*.apk'))) } install_apks_to_devices(apks.values()) + else: + sys.exit(install_fdroid_apk()) + logging.info('\n' + _('Finished')) diff --git a/tests/install.TestCase b/tests/install.TestCase index 6e701469..3124719b 100755 --- a/tests/install.TestCase +++ b/tests/install.TestCase @@ -171,13 +171,54 @@ class InstallTest(unittest.TestCase): common.fill_config_defaults(common.config) self.assertEqual([], fdroidserver.install.devices()) + @staticmethod + def _download_raise(privacy_mode): + raise Exception('fake failed download') + + @patch('fdroidserver.install.download_apk') + @patch('fdroidserver.install.download_fdroid_apk') + def test_install_fdroid_apk_privacy_mode_true( + self, download_fdroid_apk, download_apk + ): + download_apk.side_effect = self._download_raise + download_fdroid_apk.side_effect = self._download_raise + fdroidserver.common.config = {'jarsigner': 'fakepath'} + install.install_fdroid_apk(privacy_mode=True) + download_apk.assert_not_called() + download_fdroid_apk.assert_called_once() + + @patch('fdroidserver.install.download_apk') + @patch('fdroidserver.install.download_fdroid_apk') + def test_install_fdroid_apk_privacy_mode_false( + self, download_fdroid_apk, download_apk + ): + download_apk.side_effect = self._download_raise + download_fdroid_apk.side_effect = self._download_raise + fdroidserver.common.config = {'jarsigner': 'fakepath'} + install.install_fdroid_apk(privacy_mode=False) + download_apk.assert_not_called() + download_fdroid_apk.assert_called_once() + + @patch('fdroidserver.install.download_apk') + @patch('fdroidserver.install.download_fdroid_apk') + @patch('locale.getlocale', lambda: ('zh_CN', 'UTF-8')) + def test_install_fdroid_apk_privacy_mode_locale_auto( + self, download_fdroid_apk, download_apk + ): + download_apk.side_effect = self._download_raise + download_fdroid_apk.side_effect = self._download_raise + fdroidserver.common.config = {'jarsigner': 'fakepath'} + install.install_fdroid_apk(privacy_mode=None) + download_apk.assert_not_called() + download_fdroid_apk.assert_called_once() + @patch('fdroidserver.net.download_using_mirrors', lambda m: 'testvalue') def test_download_fdroid_apk_smokecheck(self): self.assertEqual('testvalue', install.download_fdroid_apk()) @unittest.skipUnless(os.getenv('test_download_fdroid_apk'), 'requires net access') def test_download_fdroid_apk(self): - f = fdroidserver.install.download_fdroid_apk() + f = install.download_fdroid_apk() self.assertTrue(Path(f).exists()) From 3a3417f6f880536c4eb8450a2014245afaa4add2 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 21 Oct 2024 20:04:02 +0200 Subject: [PATCH 1706/2116] install: add --privacy-mode flag --- completion/bash-completion | 4 ++-- fdroidserver/install.py | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/completion/bash-completion b/completion/bash-completion index 810355a0..71f1b447 100644 --- a/completion/bash-completion +++ b/completion/bash-completion @@ -109,8 +109,8 @@ __complete_gpgsign() { } __complete_install() { - opts="-v -q" - lopts="--verbose --quiet --all" + opts="-v -q -a -p" + lopts="--verbose --quiet --all --privacy-mode" case "${cur}" in -*) __complete_options diff --git a/fdroidserver/install.py b/fdroidserver/install.py index 2bb8293a..f9f8dd62 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -37,7 +37,8 @@ config = None DEFAULT_IPFS_GATEWAYS = ("https://gateway.ipfs.io/ipfs/",) -def download_apk(appid='org.fdroid.fdroid'): +# pylint: disable=unused-argument +def download_apk(appid='org.fdroid.fdroid', privacy_mode=False): """Download an APK from F-Droid via the first mirror that works.""" url = urlunparse( urlparse(common.FDROIDORG_MIRRORS[0]['url'])._replace( @@ -72,7 +73,7 @@ def download_apk(appid='org.fdroid.fdroid'): return str(f.rename(f.with_stem(f'{appid}_{versionCode}')).resolve()) -def download_fdroid_apk(): +def download_fdroid_apk(privacy_mode=False): # pylint: disable=unused-argument """Directly download the current F-Droid APK and verify it. This downloads the "download button" link, which is the version @@ -112,7 +113,7 @@ def install_fdroid_apk(privacy_mode=False): download_methods = [download_apk, download_fdroid_apk] for method in download_methods: try: - f = method() + f = method(privacy_mode=privacy_mode) break except Exception as e: logging.info(e) @@ -212,6 +213,13 @@ def main(): default=False, help=_("Install all signed applications available"), ) + parser.add_argument( + "-p", + "--privacy-mode", + action="store_true", + default=False, + help=_("Download F-Droid.apk using mirrors that leak less to the network"), + ) options = common.parse_args(parser) common.set_console_logging(options.verbose) @@ -258,7 +266,7 @@ def main(): install_apks_to_devices(apks.values()) else: - sys.exit(install_fdroid_apk()) + sys.exit(install_fdroid_apk(options.privacy_mode)) logging.info('\n' + _('Finished')) From b77eba824be8f8cb0ec062f4e0209a833b13639b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 28 Oct 2024 22:56:35 +0100 Subject: [PATCH 1707/2116] install: convert to common.get_config() --- fdroidserver/install.py | 13 ++++--------- tests/install.TestCase | 2 +- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/fdroidserver/install.py b/fdroidserver/install.py index f9f8dd62..9606dbe5 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -31,8 +31,6 @@ from . import _ from . import common, index, net from .exception import FDroidException -config = None - DEFAULT_IPFS_GATEWAYS = ("https://gateway.ipfs.io/ipfs/",) @@ -107,7 +105,7 @@ def install_fdroid_apk(privacy_mode=False): logging.warning(_('Privacy mode was enabled based on your locale.')) privacy_mode = True - if privacy_mode or not (config and config.get('jarsigner')): + if privacy_mode or not (common.config and common.config.get('jarsigner')): download_methods = [download_fdroid_apk] else: download_methods = [download_apk, download_fdroid_apk] @@ -120,7 +118,7 @@ def install_fdroid_apk(privacy_mode=False): else: return _('F-Droid.apk could not be downloaded from any known source!') - if config and config['apksigner']: + if common.config and common.config.get('apksigner'): # TODO this should always verify, but that requires APK sig verification in Python #94 logging.info(_('Verifying package {path} with apksigner.').format(path=f)) common.verify_apk_signature(f) @@ -130,7 +128,7 @@ def install_fdroid_apk(privacy_mode=False): path=f, fingerprint=fingerprint ) - if config and config.get('adb'): + if common.config and common.config.get('adb'): if devices(): install_apks_to_devices([f]) os.remove(f) @@ -194,9 +192,6 @@ def install_apks_to_devices(apks): def main(): - global config - - # Parse command line... parser = ArgumentParser( usage="%(prog)s [options] [APPID[:VERCODE] [APPID[:VERCODE] ...]]" ) @@ -228,7 +223,7 @@ def main(): # TODO implement me, including a -y/--yes flag print('TODO prompt the user if they want to download and install F-Droid.apk') - config = common.read_config() + common.get_config() output_dir = 'repo' if (options.appid or options.all) and not os.path.isdir(output_dir): diff --git a/tests/install.TestCase b/tests/install.TestCase index 3124719b..70f58b95 100755 --- a/tests/install.TestCase +++ b/tests/install.TestCase @@ -196,7 +196,7 @@ class InstallTest(unittest.TestCase): download_fdroid_apk.side_effect = self._download_raise fdroidserver.common.config = {'jarsigner': 'fakepath'} install.install_fdroid_apk(privacy_mode=False) - download_apk.assert_not_called() + download_apk.assert_called_once() download_fdroid_apk.assert_called_once() @patch('fdroidserver.install.download_apk') From 3da48e64bcc69ca874ed70021e21b5feab2d30fd Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 31 Oct 2024 23:52:15 +0100 Subject: [PATCH 1708/2116] install: use Maven Central as additional source --- fdroidserver/install.py | 51 +++++++++++++++++++++++++++++++++++++++-- tests/install.TestCase | 24 +++++++++++++++---- 2 files changed, 68 insertions(+), 7 deletions(-) diff --git a/fdroidserver/install.py b/fdroidserver/install.py index 9606dbe5..c3a64ae8 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -23,6 +23,8 @@ import glob import locale import logging +import defusedxml.ElementTree as XMLElementTree + from argparse import ArgumentParser from pathlib import Path from urllib.parse import urlencode, urlparse, urlunparse @@ -33,6 +35,27 @@ from .exception import FDroidException DEFAULT_IPFS_GATEWAYS = ("https://gateway.ipfs.io/ipfs/",) +MAVEN_CENTRAL_MIRRORS = [ + { + "url": "https://repo1.maven.org/maven2/", + "dnsA": ["199.232.16.209"], + "worksWithoutSNI": True, + }, + { + "url": "https://repo.maven.apache.org/maven2/", + "dnsA": ["199.232.16.215"], + "worksWithoutSNI": True, + }, + { + "url": "https://maven-central-asia.storage-download.googleapis.com/maven2/", + }, + { + "url": "https://maven-central-eu.storage-download.googleapis.com/maven2/", + }, + { + "url": "https://maven-central.storage-download.googleapis.com/maven2/", + }, +] # pylint: disable=unused-argument @@ -83,6 +106,24 @@ def download_fdroid_apk(privacy_mode=False): # pylint: disable=unused-argument return net.download_using_mirrors([mirror]) +def download_fdroid_apk_from_maven(privacy_mode=False): + """Download F-Droid.apk from Maven Central and official mirrors.""" + path = 'org/fdroid/fdroid/F-Droid' + if privacy_mode: + mirrors = MAVEN_CENTRAL_MIRRORS[:2] # skip the Google servers + else: + mirrors = MAVEN_CENTRAL_MIRRORS + mirrors = common.append_filename_to_mirrors( + os.path.join(path, 'maven-metadata.xml'), mirrors + ) + metadata = net.download_using_mirrors(mirrors) + version = XMLElementTree.parse(metadata).getroot().findall('*.//latest')[0].text + mirrors = common.append_filename_to_mirrors( + os.path.join(path, version, f'F-Droid-{version}.apk'), mirrors + ) + return net.download_using_mirrors(mirrors) + + def install_fdroid_apk(privacy_mode=False): """Download and install F-Droid.apk using all tricks we can muster. @@ -106,9 +147,15 @@ def install_fdroid_apk(privacy_mode=False): privacy_mode = True if privacy_mode or not (common.config and common.config.get('jarsigner')): - download_methods = [download_fdroid_apk] + download_methods = [ + download_fdroid_apk_from_maven, + ] else: - download_methods = [download_apk, download_fdroid_apk] + download_methods = [ + download_apk, + download_fdroid_apk_from_maven, + download_fdroid_apk, + ] for method in download_methods: try: f = method(privacy_mode=privacy_mode) diff --git a/tests/install.TestCase b/tests/install.TestCase index 70f58b95..c09b05d8 100755 --- a/tests/install.TestCase +++ b/tests/install.TestCase @@ -177,40 +177,49 @@ class InstallTest(unittest.TestCase): @patch('fdroidserver.install.download_apk') @patch('fdroidserver.install.download_fdroid_apk') + @patch('fdroidserver.install.download_fdroid_apk_from_maven') def test_install_fdroid_apk_privacy_mode_true( - self, download_fdroid_apk, download_apk + self, maven, download_fdroid_apk, download_apk ): download_apk.side_effect = self._download_raise download_fdroid_apk.side_effect = self._download_raise + maven.side_effect = self._download_raise fdroidserver.common.config = {'jarsigner': 'fakepath'} install.install_fdroid_apk(privacy_mode=True) download_apk.assert_not_called() - download_fdroid_apk.assert_called_once() + download_fdroid_apk.assert_not_called() + maven.assert_called_once() @patch('fdroidserver.install.download_apk') @patch('fdroidserver.install.download_fdroid_apk') + @patch('fdroidserver.install.download_fdroid_apk_from_maven') def test_install_fdroid_apk_privacy_mode_false( - self, download_fdroid_apk, download_apk + self, maven, download_fdroid_apk, download_apk ): download_apk.side_effect = self._download_raise download_fdroid_apk.side_effect = self._download_raise + maven.side_effect = self._download_raise fdroidserver.common.config = {'jarsigner': 'fakepath'} install.install_fdroid_apk(privacy_mode=False) download_apk.assert_called_once() download_fdroid_apk.assert_called_once() + maven.assert_called_once() @patch('fdroidserver.install.download_apk') @patch('fdroidserver.install.download_fdroid_apk') + @patch('fdroidserver.install.download_fdroid_apk_from_maven') @patch('locale.getlocale', lambda: ('zh_CN', 'UTF-8')) def test_install_fdroid_apk_privacy_mode_locale_auto( - self, download_fdroid_apk, download_apk + self, maven, download_fdroid_apk, download_apk ): download_apk.side_effect = self._download_raise download_fdroid_apk.side_effect = self._download_raise + maven.side_effect = self._download_raise fdroidserver.common.config = {'jarsigner': 'fakepath'} install.install_fdroid_apk(privacy_mode=None) download_apk.assert_not_called() - download_fdroid_apk.assert_called_once() + download_fdroid_apk.assert_not_called() + maven.assert_called_once() @patch('fdroidserver.net.download_using_mirrors', lambda m: 'testvalue') def test_download_fdroid_apk_smokecheck(self): @@ -221,6 +230,11 @@ class InstallTest(unittest.TestCase): f = install.download_fdroid_apk() self.assertTrue(Path(f).exists()) + @unittest.skipUnless(os.getenv('test_download_fdroid_apk'), 'requires net access') + def test_download_fdroid_apk_from_maven(self): + f = install.download_fdroid_apk_from_maven() + self.assertTrue(Path(f).exists()) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 1eb6516f16bd2d63e2118819fd33494c50bf61e7 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 21 Oct 2024 23:20:11 +0200 Subject: [PATCH 1709/2116] install: add IPNS download method --- fdroidserver/install.py | 13 +++++++++++++ tests/install.TestCase | 20 +++++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/fdroidserver/install.py b/fdroidserver/install.py index c3a64ae8..9645f89d 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -106,6 +106,17 @@ def download_fdroid_apk(privacy_mode=False): # pylint: disable=unused-argument return net.download_using_mirrors([mirror]) +def download_fdroid_apk_from_ipns(privacy_mode=False): + """Download the F-Droid APK from an IPNS repo.""" + cid = 'k51qzi5uqu5dl4hbcksbdmplanu9n4hivnqsupqe6vzve1pdbeh418ssptldd3' + mirrors = [ + {"url": f"https://ipfs.io/ipns/{cid}/F-Droid.apk"}, + ] + if not privacy_mode: + mirrors.append({"url": f"https://{cid}.ipns.dweb.link/F-Droid.apk"}) + return net.download_using_mirrors(mirrors) + + def download_fdroid_apk_from_maven(privacy_mode=False): """Download F-Droid.apk from Maven Central and official mirrors.""" path = 'org/fdroid/fdroid/F-Droid' @@ -149,11 +160,13 @@ def install_fdroid_apk(privacy_mode=False): if privacy_mode or not (common.config and common.config.get('jarsigner')): download_methods = [ download_fdroid_apk_from_maven, + download_fdroid_apk_from_ipns, ] else: download_methods = [ download_apk, download_fdroid_apk_from_maven, + download_fdroid_apk_from_ipns, download_fdroid_apk, ] for method in download_methods: diff --git a/tests/install.TestCase b/tests/install.TestCase index c09b05d8..535832d2 100755 --- a/tests/install.TestCase +++ b/tests/install.TestCase @@ -177,48 +177,57 @@ class InstallTest(unittest.TestCase): @patch('fdroidserver.install.download_apk') @patch('fdroidserver.install.download_fdroid_apk') + @patch('fdroidserver.install.download_fdroid_apk_from_ipns') @patch('fdroidserver.install.download_fdroid_apk_from_maven') def test_install_fdroid_apk_privacy_mode_true( - self, maven, download_fdroid_apk, download_apk + self, maven, ipns, download_fdroid_apk, download_apk ): download_apk.side_effect = self._download_raise download_fdroid_apk.side_effect = self._download_raise + ipns.side_effect = self._download_raise maven.side_effect = self._download_raise fdroidserver.common.config = {'jarsigner': 'fakepath'} install.install_fdroid_apk(privacy_mode=True) download_apk.assert_not_called() download_fdroid_apk.assert_not_called() + ipns.assert_called_once() maven.assert_called_once() @patch('fdroidserver.install.download_apk') @patch('fdroidserver.install.download_fdroid_apk') + @patch('fdroidserver.install.download_fdroid_apk_from_ipns') @patch('fdroidserver.install.download_fdroid_apk_from_maven') def test_install_fdroid_apk_privacy_mode_false( - self, maven, download_fdroid_apk, download_apk + self, maven, ipns, download_fdroid_apk, download_apk ): download_apk.side_effect = self._download_raise download_fdroid_apk.side_effect = self._download_raise + ipns.side_effect = self._download_raise maven.side_effect = self._download_raise fdroidserver.common.config = {'jarsigner': 'fakepath'} install.install_fdroid_apk(privacy_mode=False) download_apk.assert_called_once() download_fdroid_apk.assert_called_once() + ipns.assert_called_once() maven.assert_called_once() @patch('fdroidserver.install.download_apk') @patch('fdroidserver.install.download_fdroid_apk') + @patch('fdroidserver.install.download_fdroid_apk_from_ipns') @patch('fdroidserver.install.download_fdroid_apk_from_maven') @patch('locale.getlocale', lambda: ('zh_CN', 'UTF-8')) def test_install_fdroid_apk_privacy_mode_locale_auto( - self, maven, download_fdroid_apk, download_apk + self, maven, ipns, download_fdroid_apk, download_apk ): download_apk.side_effect = self._download_raise download_fdroid_apk.side_effect = self._download_raise + ipns.side_effect = self._download_raise maven.side_effect = self._download_raise fdroidserver.common.config = {'jarsigner': 'fakepath'} install.install_fdroid_apk(privacy_mode=None) download_apk.assert_not_called() download_fdroid_apk.assert_not_called() + ipns.assert_called_once() maven.assert_called_once() @patch('fdroidserver.net.download_using_mirrors', lambda m: 'testvalue') @@ -235,6 +244,11 @@ class InstallTest(unittest.TestCase): f = install.download_fdroid_apk_from_maven() self.assertTrue(Path(f).exists()) + @unittest.skipUnless(os.getenv('test_download_fdroid_apk'), 'requires net access') + def test_download_fdroid_apk_from_ipns(self): + f = install.download_fdroid_apk_from_ipns() + self.assertTrue(Path(f).exists()) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 560472e4e5585bdf53e251219b99658a6383041a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 22 Oct 2024 00:12:43 +0200 Subject: [PATCH 1710/2116] install: download from GitHub Releases --- fdroidserver/github.py | 21 ++++++++++++++++++--- fdroidserver/install.py | 15 ++++++++++++++- tests/install.TestCase | 20 +++++++++++++++++--- 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/fdroidserver/github.py b/fdroidserver/github.py index c522f522..0a6844d9 100644 --- a/fdroidserver/github.py +++ b/fdroidserver/github.py @@ -23,12 +23,15 @@ import urllib.parse class GithubApi: - """ - Warpper for some select calls to GitHub Json/REST API. + """Wrapper for some select calls to GitHub Json/REST API. This class wraps some calls to api.github.com. This is not intended to be a general API wrapper. Instead it's purpose is to return pre-filtered and transformed data that's playing well with other fdroidserver functions. + + With the GitHub API, the token is optional, but it has pretty + severe rate limiting. + """ def __init__(self, api_token, repo_path): @@ -41,9 +44,10 @@ class GithubApi: def _req(self, url, data=None): h = { "Accept": "application/vnd.github+json", - "Authorization": f"Bearer {self._api_token}", "X-GitHub-Api-Version": "2022-11-28", } + if self._api_token: + h["Authorization"] = f"Bearer {self._api_token}" return urllib.request.Request( url, headers=h, @@ -65,6 +69,17 @@ class GithubApi: released_tags = self.list_released_tags() return [x for x in all_tags if x not in released_tags] + def get_latest_apk(self): + req = self._req( + f"https://api.github.com/repos/{self._repo_path}/releases/latest" + ) + with urllib.request.urlopen(req) as resp: # nosec CWE-22 disable bandit warning + assets = json.load(resp)['assets'] + for asset in assets: + url = asset.get('browser_download_url') + if url and url.endswith('.apk'): + return url + def tag_exists(self, tag): """ Check if git tag is present on github. diff --git a/fdroidserver/install.py b/fdroidserver/install.py index 9645f89d..7deb1939 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -30,7 +30,7 @@ from pathlib import Path from urllib.parse import urlencode, urlparse, urlunparse from . import _ -from . import common, index, net +from . import common, github, index, net from .exception import FDroidException @@ -106,6 +106,17 @@ def download_fdroid_apk(privacy_mode=False): # pylint: disable=unused-argument return net.download_using_mirrors([mirror]) +def download_fdroid_apk_from_github(privacy_mode=False): + """Download F-Droid.apk from F-Droid's GitHub Releases.""" + if common.config and not privacy_mode: + token = common.config.get('github_token') + else: + token = None + gh = github.GithubApi(token, 'https://github.com/f-droid/fdroidclient') + latest_apk = gh.get_latest_apk() + return net.download_file(latest_apk) + + def download_fdroid_apk_from_ipns(privacy_mode=False): """Download the F-Droid APK from an IPNS repo.""" cid = 'k51qzi5uqu5dl4hbcksbdmplanu9n4hivnqsupqe6vzve1pdbeh418ssptldd3' @@ -161,11 +172,13 @@ def install_fdroid_apk(privacy_mode=False): download_methods = [ download_fdroid_apk_from_maven, download_fdroid_apk_from_ipns, + download_fdroid_apk_from_github, ] else: download_methods = [ download_apk, download_fdroid_apk_from_maven, + download_fdroid_apk_from_github, download_fdroid_apk_from_ipns, download_fdroid_apk, ] diff --git a/tests/install.TestCase b/tests/install.TestCase index 535832d2..ea53f6a3 100755 --- a/tests/install.TestCase +++ b/tests/install.TestCase @@ -177,56 +177,65 @@ class InstallTest(unittest.TestCase): @patch('fdroidserver.install.download_apk') @patch('fdroidserver.install.download_fdroid_apk') + @patch('fdroidserver.install.download_fdroid_apk_from_github') @patch('fdroidserver.install.download_fdroid_apk_from_ipns') @patch('fdroidserver.install.download_fdroid_apk_from_maven') def test_install_fdroid_apk_privacy_mode_true( - self, maven, ipns, download_fdroid_apk, download_apk + self, maven, ipns, github, download_fdroid_apk, download_apk ): download_apk.side_effect = self._download_raise download_fdroid_apk.side_effect = self._download_raise + github.side_effect = self._download_raise ipns.side_effect = self._download_raise maven.side_effect = self._download_raise fdroidserver.common.config = {'jarsigner': 'fakepath'} install.install_fdroid_apk(privacy_mode=True) download_apk.assert_not_called() download_fdroid_apk.assert_not_called() + github.assert_called_once() ipns.assert_called_once() maven.assert_called_once() @patch('fdroidserver.install.download_apk') @patch('fdroidserver.install.download_fdroid_apk') + @patch('fdroidserver.install.download_fdroid_apk_from_github') @patch('fdroidserver.install.download_fdroid_apk_from_ipns') @patch('fdroidserver.install.download_fdroid_apk_from_maven') def test_install_fdroid_apk_privacy_mode_false( - self, maven, ipns, download_fdroid_apk, download_apk + self, maven, ipns, github, download_fdroid_apk, download_apk ): download_apk.side_effect = self._download_raise download_fdroid_apk.side_effect = self._download_raise + github.side_effect = self._download_raise ipns.side_effect = self._download_raise maven.side_effect = self._download_raise fdroidserver.common.config = {'jarsigner': 'fakepath'} install.install_fdroid_apk(privacy_mode=False) download_apk.assert_called_once() download_fdroid_apk.assert_called_once() + github.assert_called_once() ipns.assert_called_once() maven.assert_called_once() @patch('fdroidserver.install.download_apk') @patch('fdroidserver.install.download_fdroid_apk') + @patch('fdroidserver.install.download_fdroid_apk_from_github') @patch('fdroidserver.install.download_fdroid_apk_from_ipns') @patch('fdroidserver.install.download_fdroid_apk_from_maven') @patch('locale.getlocale', lambda: ('zh_CN', 'UTF-8')) def test_install_fdroid_apk_privacy_mode_locale_auto( - self, maven, ipns, download_fdroid_apk, download_apk + self, maven, ipns, github, download_fdroid_apk, download_apk ): download_apk.side_effect = self._download_raise download_fdroid_apk.side_effect = self._download_raise + github.side_effect = self._download_raise ipns.side_effect = self._download_raise maven.side_effect = self._download_raise fdroidserver.common.config = {'jarsigner': 'fakepath'} install.install_fdroid_apk(privacy_mode=None) download_apk.assert_not_called() download_fdroid_apk.assert_not_called() + github.assert_called_once() ipns.assert_called_once() maven.assert_called_once() @@ -249,6 +258,11 @@ class InstallTest(unittest.TestCase): f = install.download_fdroid_apk_from_ipns() self.assertTrue(Path(f).exists()) + @unittest.skipUnless(os.getenv('test_download_fdroid_apk'), 'requires net access') + def test_download_fdroid_apk_from_github(self): + f = install.download_fdroid_apk_from_github() + self.assertTrue(Path(f).exists()) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 4d22a7f67f6f38199b9d3454569ebce167fa7afd Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 22 Oct 2024 18:58:49 +0200 Subject: [PATCH 1711/2116] install: Y/n prompt, --yes, --no controls downloading F-Droid.apk --- completion/bash-completion | 4 +-- fdroidserver/install.py | 63 +++++++++++++++++++++++++++++++++----- tests/run-tests | 2 +- 3 files changed, 59 insertions(+), 10 deletions(-) diff --git a/completion/bash-completion b/completion/bash-completion index 71f1b447..5f6e6b23 100644 --- a/completion/bash-completion +++ b/completion/bash-completion @@ -109,8 +109,8 @@ __complete_gpgsign() { } __complete_install() { - opts="-v -q -a -p" - lopts="--verbose --quiet --all --privacy-mode" + opts="-v -q -a -p -n -y" + lopts="--verbose --quiet --all --privacy-mode --no --yes" case "${cur}" in -*) __complete_options diff --git a/fdroidserver/install.py b/fdroidserver/install.py index 7deb1939..f814feff 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -22,6 +22,8 @@ import os import glob import locale import logging +import termios +import tty import defusedxml.ElementTree as XMLElementTree @@ -264,6 +266,23 @@ def install_apks_to_devices(apks): ) +def read_char(): + """Read input from the terminal prompt one char at a time.""" + fd = sys.stdin.fileno() + old_settings = termios.tcgetattr(fd) + try: + tty.setraw(fd) + ch = sys.stdin.read(1) + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) + return ch + + +def strtobool(val): + """Convert a localized string representation of truth to True or False.""" + return val.lower() in ('', 'y', 'yes', _('yes'), _('true')) # '' is pressing Enter + + def main(): parser = ArgumentParser( usage="%(prog)s [options] [APPID[:VERCODE] [APPID[:VERCODE] ...]]" @@ -288,16 +307,49 @@ def main(): default=False, help=_("Download F-Droid.apk using mirrors that leak less to the network"), ) + parser.add_argument( + "-y", + "--yes", + action="store_true", + default=None, + help=_("Automatic yes to all prompts."), + ) + parser.add_argument( + "-n", + "--no", + action="store_false", + dest='yes', + help=_("Automatic no to all prompts."), + ) options = common.parse_args(parser) common.set_console_logging(options.verbose) - - if not options.appid and not options.all: - # TODO implement me, including a -y/--yes flag - print('TODO prompt the user if they want to download and install F-Droid.apk') + logging.captureWarnings(True) # for SNIMissingWarning common.get_config() + if not options.appid and not options.all: + run_install = options.yes + if options.yes is None and sys.stdout.isatty(): + print( + _( + 'Would you like to download and install F-Droid.apk via adb? (YES/no)' + ), + flush=True, + ) + answer = '' + while True: + in_char = read_char() + if in_char == '\r': # Enter key + break + if not in_char.isprintable(): + sys.exit(1) + answer += in_char + run_install = strtobool(answer) + if run_install: + sys.exit(install_fdroid_apk(options.privacy_mode)) + sys.exit(1) + output_dir = 'repo' if (options.appid or options.all) and not os.path.isdir(output_dir): logging.error(_("No signed output directory - nothing to do")) @@ -333,9 +385,6 @@ def main(): } install_apks_to_devices(apks.values()) - else: - sys.exit(install_fdroid_apk(options.privacy_mode)) - logging.info('\n' + _('Finished')) diff --git a/tests/run-tests b/tests/run-tests index 6ba54e03..9a0dafbc 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -730,7 +730,7 @@ $fdroid scanner # run these to get their output, but the are not setup, so don't fail $fdroid build || true $fdroid import || true -$fdroid install || true +$fdroid install --no || true #------------------------------------------------------------------------------# From 27e3b5066ac191e44de2324edf2b604bd13d5723 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 22 Oct 2024 19:21:11 +0200 Subject: [PATCH 1712/2116] install: add --no-privacy-mode as an argument --- fdroidserver/install.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/fdroidserver/install.py b/fdroidserver/install.py index f814feff..8103a02e 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -27,7 +27,7 @@ import tty import defusedxml.ElementTree as XMLElementTree -from argparse import ArgumentParser +from argparse import ArgumentParser, BooleanOptionalAction from pathlib import Path from urllib.parse import urlencode, urlparse, urlunparse @@ -166,8 +166,13 @@ def install_fdroid_apk(privacy_mode=False): None for success or the error message. """ - if locale.getlocale()[0].split('_')[-1] in ('CN', 'HK', 'IR', 'TM'): - logging.warning(_('Privacy mode was enabled based on your locale.')) + country_code = locale.getlocale()[0].split('_')[-1] + if privacy_mode is None and country_code in ('CN', 'HK', 'IR', 'TM'): + logging.warning( + _('Privacy mode was enabled based on your locale ({country_code}).').format( + country_code=country_code + ) + ) privacy_mode = True if privacy_mode or not (common.config and common.config.get('jarsigner')): @@ -303,8 +308,8 @@ def main(): parser.add_argument( "-p", "--privacy-mode", - action="store_true", - default=False, + action=BooleanOptionalAction, + default=None, help=_("Download F-Droid.apk using mirrors that leak less to the network"), ) parser.add_argument( From acae5f1ac9afe62808b82992131526ab3f4590ca Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 23 Oct 2024 08:47:46 +0200 Subject: [PATCH 1713/2116] tests/run-tests: stop skipping install.TestCase --- tests/install.TestCase | 5 ++++- tests/run-tests | 4 ---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/install.TestCase b/tests/install.TestCase index ea53f6a3..351cc420 100755 --- a/tests/install.TestCase +++ b/tests/install.TestCase @@ -33,7 +33,10 @@ class InstallTest(unittest.TestCase): config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config - config['adb'] = fdroidserver.common.find_sdk_tools_cmd('adb') + try: + config['adb'] = fdroidserver.common.find_sdk_tools_cmd('adb') + except FDroidException as e: + self.skipTest(f'Skipping test because: {e}') self.assertTrue(os.path.exists(config['adb'])) self.assertTrue(os.path.isfile(config['adb'])) devices = fdroidserver.install.devices() diff --git a/tests/run-tests b/tests/run-tests index 9a0dafbc..303327a5 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -172,10 +172,6 @@ echo_header "run unit tests" cd $WORKSPACE/tests for testcase in $WORKSPACE/tests/*.TestCase; do - if [ $testcase == $WORKSPACE/tests/install.TestCase ]; then - echo "skipping install.TestCase, its too troublesome in CI builds" - continue - fi if [ $(uname) != "Linux" ] && [ $testcase == $WORKSPACE/tests/nightly.TestCase ]; then echo "skipping nightly.TestCase, it currently only works GNU/Linux" continue From 6e70263dcb24bbb9dce1e03944703cf055191368 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Mon, 16 Sep 2024 15:09:18 +0200 Subject: [PATCH 1714/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Turki?= =?UTF-8?q?sh=20(tr)=20by=20O=C4=9Fuz=20Ersen=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (592 of 592 strings) Co-authored-by: Oğuz Ersen Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/tr/ Translation: F-Droid/F-Droid Server --- locale/tr/LC_MESSAGES/fdroidserver.po | 35 +++++++++++++-------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index 189d20c8..b5ba4715 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-05-15 04:32+0000\n" +"PO-Revision-Date: 2024-09-10 23:49+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" "Language: tr\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.6-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -679,12 +679,12 @@ msgstr "HATA: desteklenmeyen git ana makinesi \"%s\", yama gönderebilirsiniz!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" -msgstr "" +msgstr "HATA: {path} içindeki {key} \"archive\" veya \"repo\" değil!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" -msgstr "" +msgstr "HATA: {path} içindeki {key}:{subkey} izin verilen anahtarlar içinde değil: {allowed_keys}!" #: ../fdroidserver/__main__.py #, python-brace-format @@ -707,7 +707,7 @@ msgstr "{configname} içinden {var} ortam değişkeni ayarlı değil!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "" +msgstr "'github_releases' dağıtılırken hata oluştu, {} yok. (Önce `fdroid update` komutunu çalıştırmanız gerekebilir.)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -1298,15 +1298,15 @@ msgstr "Çevrim dışı makine, `fdroid deploy` komutuna kadar git yansı oluşt #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "" +msgstr "'github_releases' yapılandırma ögelerinden birinde 'projectUrl' değeri eksik. atlanıyor..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." -msgstr "" +msgstr "'github_releases' yapılandırma ögelerinden birinde 'packageNames' değeri eksik. atlanıyor..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." -msgstr "" +msgstr "'github_releases' yapılandırma ögelerinden birinde 'token' değeri eksik. atlanıyor..." #: ../fdroidserver/update.py #, python-brace-format @@ -1522,7 +1522,7 @@ msgstr "Değişiklikleri olmayan git repo üzerinde çalış" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" -msgstr "" +msgstr "-debug.apk'yı bulmak için {cibase} üzerinden çalıştırın ve {repo_basedir} repo_basedir'i atlayın" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1763,9 +1763,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "Awsbucket kullanmak için, awssecretkey ve awsaccesskeyid de config.yml içinde ayarlanmalı!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" -msgstr "Awsbucket kullanmak için, awssecretkey ve awsaccesskeyid de config.yml içinde ayarlanmalı!" +msgstr "rclone kullanmak için, rclone_config ve awsbucket config.yml içinde ayarlanmalı!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1965,9 +1964,9 @@ msgid "Using \"{path}\" for configuring s3cmd." msgstr "s3cmd yapılandırması için \"{path}\" kullanılıyor." #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using \"{path}\" for syncing with remote storage." -msgstr "s3cmd yapılandırması için \"{path}\" kullanılıyor." +msgstr "Uzak depolama ile eşitlemek için \"{path}\" kullanılıyor." #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -2001,9 +2000,9 @@ msgid "Using existing keystore \"{path}\"" msgstr "Var olan anahtar deposu \"{path}\" kullanılıyor" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using rclone to sync with: {url}" -msgstr "{url} ile eşitleme için s3cmd kullanılıyor" +msgstr "{url} ile eşitleme için rclone kullanılıyor" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2225,7 +2224,7 @@ msgstr "siliniyor: repo/{apkfilename}" #: ../fdroidserver/scanner.py msgid "dependency file without lock" -msgstr "" +msgstr "kilitsiz bağımlılık dosyası" #: ../fdroidserver/common.py #, python-brace-format @@ -2555,9 +2554,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sync {path} konumunu {url} adresine indeksler ve siler" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "s3cmd sync {path} konumunu {url} adresine indeksler ve siler" +msgstr "s3cmd {path} ile {url} arasındaki dizinleri indeksler ve kaldırılanları siler" #: ../fdroidserver/scanner.py #, python-brace-format From 3f71f87900c7d6d0bc412f49ff06aa3cd3cc8399 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Mon, 16 Sep 2024 15:09:19 +0200 Subject: [PATCH 1715/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Chine?= =?UTF-8?q?se=20(Simplified=20Han=20script)=20(zh=5FHans)=20by=20=E5=A4=A7?= =?UTF-8?q?=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1=E5=B1=B1=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 94.7% (561 of 592 strings) Co-authored-by: 大王叫我来巡山 Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 34f2682e..bc2662f6 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -37,8 +37,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-03 15:47+0000\n" -"Last-Translator: linsui \n" +"PO-Revision-Date: 2024-09-12 00:02+0000\n" +"Last-Translator: 大王叫我来巡山 \n" "Language-Team: Chinese (Simplified Han script) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" @@ -1788,9 +1788,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "要使用 awsbucket,还必须在 config.yml 中设置 awssecretkey 和 awsaccesskeyid!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" -msgstr "要使用 awsbucket,还必须在 config.yml 中设置 awssecretkey 和 awsaccesskeyid!" +msgstr "要使用 rclone,必须在 config.yml 中设置 rclone_config 和 awsbucket!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1990,9 +1989,9 @@ msgid "Using \"{path}\" for configuring s3cmd." msgstr "使用“{path}”配置 s3cmd。" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using \"{path}\" for syncing with remote storage." -msgstr "使用“{path}”配置 s3cmd。" +msgstr "使用 \"{path}\" 用于和远程存储同步。" #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -2026,9 +2025,9 @@ msgid "Using existing keystore \"{path}\"" msgstr "使用现有密钥库“{path}”" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using rclone to sync with: {url}" -msgstr "正使用 s3cmd 与 {url} 同步" +msgstr "使用 rclone 进行同步:{url}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2578,9 +2577,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd 同步索引 {path} 至 {url} 并删除" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "s3cmd 同步索引 {path} 至 {url} 并删除" +msgstr "s3cmd 将索引从 {path} 同步至 {url} 并删除已下架的" #: ../fdroidserver/scanner.py #, python-brace-format From 3d923a07c1575ef3b9f3cc7c731bbda4c0bb7d60 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Mon, 16 Sep 2024 15:09:20 +0200 Subject: [PATCH 1716/2116] Translated using Weblate: Albanian (sq) by Besnik Bleta Currently translated at 97.1% (575 of 592 strings) Co-authored-by: Besnik Bleta Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/ Translation: F-Droid/F-Droid Server --- locale/sq/LC_MESSAGES/fdroidserver.po | 48 +++++++++++++-------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index 6baea0c5..570c1e3f 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-10 10:20+0000\n" +"PO-Revision-Date: 2024-09-12 00:02+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" "Language: sq\n" @@ -98,7 +98,7 @@ msgstr "%(prog)s: gabim: %(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "S’u arrit të nënshkruhen ose verifikohen %d APK!" #: ../fdroidserver/scanner.py #, python-format @@ -404,7 +404,7 @@ msgstr "S’janë ujdisur kategori" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" +msgstr "Kategori “{category}” e përkufizuar, por jo e përdorur për ndonjë aplikacion!" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -575,12 +575,12 @@ msgstr "Përshkrimi me gjatësi {length} është mbi kufirin prej {limit} shenja #: ../fdroidserver/common.py #, python-brace-format msgid "Did you mean config/{name}.yml?" -msgstr "" +msgstr "Mos kishit në mendje config/{name}.yml?" #: ../fdroidserver/lint.py #, python-brace-format msgid "Did you mean {code}?" -msgstr "" +msgstr "Mos kishit në mendje {code}?" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" @@ -636,7 +636,7 @@ msgstr "Shkarkimi i {url} dështoi. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "" +msgstr "U shpërfill deklarim i përsëdytur Anti-Veçorie te {path}!" #: ../fdroidserver/index.py #, python-format @@ -651,7 +651,7 @@ msgstr "Lidhje e përsëdytur te '{field}': {url}" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "GABIM: %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -677,12 +677,12 @@ msgstr "GABIM: strehë git “%s” që nuk mbulohet, arnimet janë të mirëpri #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" -msgstr "" +msgstr "GABIM: {key} te {path} s’është “archive” apo “repo”!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" -msgstr "" +msgstr "GABIM: {key}:{subkey} te {path} s’është te kyçet e lejuar: {allowed_keys}!" #: ../fdroidserver/__main__.py #, python-brace-format @@ -705,7 +705,7 @@ msgstr "S’është ujdisur ndryshore {var} nga {configname}!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "" +msgstr "Gabim në sendërtim të 'github_releases', {} s’është e pranishme. (Mund t’ju duhet të xhironi `fdroid update` së pari.)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -1116,7 +1116,7 @@ msgstr "Depo kyçesh për kyç nënshkrimi:\t" #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "" +msgstr "Te AllowedAPKSigningKeys është përdorur kyç i ditur diagnostikimi: " #: ../fdroidserver/lint.py #, python-brace-format @@ -1296,15 +1296,15 @@ msgstr "Makinë jo në linjë, po anashkalohet prodhim pasqyre git, deri sa `fdr #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "" +msgstr "Njërit prej zërave të formësimit të 'github_releases' i mungon vlera 'projectUrl'. Po anashkalohet…" #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." -msgstr "" +msgstr "Një nga zërat e formësimit të 'github_releases'mungon te vlera 'packageNames' value. Po anashkalohet…" #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." -msgstr "" +msgstr "Një nga zërat e formësimit të 'github_releases' mungon te vlera 'token' value. Po anashkalohet…" #: ../fdroidserver/update.py #, python-brace-format @@ -1431,7 +1431,7 @@ msgstr "" #: ../fdroidserver/deploy.py msgid "Pushing to remote server failed!" -msgstr "" +msgstr "Depozitimi te shërbyesi i largët dështoi!" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1538,7 +1538,7 @@ msgstr "Po xhirohet wget te {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "" +msgstr "SHA-256 e {url} nuk përkon me zërin!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." @@ -2043,7 +2043,7 @@ msgstr "" #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." -msgstr "" +msgstr "Kur nënshkrimi, ose verifikimi dështon, dil me një kod gabimi." #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2223,7 +2223,7 @@ msgstr "po fshihet: repo/{apkfilename}" #: ../fdroidserver/scanner.py msgid "dependency file without lock" -msgstr "" +msgstr "kartelë varësie pa kyç" #: ../fdroidserver/common.py #, python-brace-format @@ -2379,7 +2379,7 @@ msgstr "pasqyra '%s' s’përfundon me 'fdroid'!" #: ../fdroidserver/index.py #, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "" +msgstr "pasqyra të ujdisura dy herë, te config.yml dhe {path}!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2541,7 +2541,7 @@ msgstr "repo_url lypset të përfundojë me /repo" #: ../fdroidserver/deploy.py #, python-brace-format msgid "rsync is missing or broken: {error}" -msgstr "" +msgstr "rsync-u mungon, ose është i dëmtuar: {error}" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." @@ -2564,7 +2564,7 @@ msgstr "fshehtina e kontrollorit është e keqformuar! Mund ta spastroni me: “ #: ../fdroidserver/deploy.py msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "" +msgstr "serverwebroot: shtegu nuk mbaron me “fdroid”, ndoshta kishit në mendje një nga këto:" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2773,12 +2773,12 @@ msgstr "{path} ka “{pattern}” të gabuar nënshkrimi kartele, ka gjasa të j #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} has been flagged by virustotal {count} times:" -msgstr "" +msgstr "për {path} ka {count} herë sinjalizime nga virustotal:" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" +msgstr "{path} s’është “key: value”, por një {datatype}!" #: ../fdroidserver/common.py #, python-brace-format @@ -2808,7 +2808,7 @@ msgstr "{path} më tepër se 200MB, ngarkojeni dorazi: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" +msgstr "{path}: “{code}” s’është kod i vlefshëm vendi ISO_3166-1 alpha-2!" #: ../fdroidserver/update.py #, python-brace-format From 8e0722d49092e8a6637970c0275d7db21155a7c9 Mon Sep 17 00:00:00 2001 From: VfBFan Date: Mon, 16 Sep 2024 15:09:22 +0200 Subject: [PATCH 1717/2116] Translated using Weblate: German (de) by VfBFan Currently translated at 98.4% (583 of 592 strings) Co-authored-by: VfBFan Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 45 +++++++++++++-------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 5553ce03..d60bd235 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -27,15 +27,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-05-20 09:01+0000\n" -"Last-Translator: Maxi \n" +"PO-Revision-Date: 2024-09-12 20:48+0000\n" +"Last-Translator: VfBFan \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.6-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -661,12 +661,12 @@ msgstr "Doppelte Anti-Feature-Deklaration in {path} wurde ignoriert!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "Doppelter „%s“-Eintrag in Spiegelserver-Konfiguration!" +msgstr "Doppelter Eintrag \"%s\" in Spiegelserver-Konfiguration!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" -msgstr "Link in „{field}” duplizieren: {url}" +msgstr "Link in '{field}' duplizieren: {url}" #: ../fdroidserver/common.py #, python-format @@ -697,7 +697,7 @@ msgstr "FEHLER: nicht unterstützter Git-Host \"%s\", Patches willkommen!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" -msgstr "" +msgstr "FEHLER: {key} in {path} ist nicht \"archive\" oder \"repo\"!" #: ../fdroidserver/lint.py #, python-brace-format @@ -751,7 +751,7 @@ msgstr "Kopieren von {path} fehlgeschlagen: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" -msgstr "Abrufen von Signaturen für „{apkfilename}” fehlgeschlagen: {error}" +msgstr "Abrufen von Signaturen für '{apkfilename}' fehlgeschlagen: {error}" #: ../fdroidserver/update.py #, python-brace-format @@ -785,7 +785,7 @@ msgstr "Abrufen des APK-Signierschlüssel-Fingerabdrucks fehlgeschlagen" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" -msgstr "Installation von „{apkfilename}” auf {dev} fehlgeschlagen: {error}" +msgstr "Installation von '{apkfilename}' auf {dev} fehlgeschlagen: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" @@ -799,7 +799,7 @@ msgstr "BuildServerID von VM abgerufen: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" -msgstr "Signaturen für {apkfilename} -> {sigdir} abgerufen" +msgstr "Signaturen für '{apkfilename} '-> '{sigdir}' abgerufen" #: ../fdroidserver/update.py #, python-brace-format @@ -931,11 +931,11 @@ msgstr "Git-Submodul deinit fehlgeschlagen" #: ../fdroidserver/common.py msgid "Git submodule sync failed" -msgstr "Git submodule sync fehlgeschlagen" +msgstr "Git-Submodul sync fehlgeschlagen" #: ../fdroidserver/common.py msgid "Git submodule update failed" -msgstr "Git submodule update fehlgeschlagen" +msgstr "Git-Submodul update fehlgeschlagen" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" @@ -958,7 +958,7 @@ msgstr "'{field}' in '{metapath}' Metadaten wird ignoriert, da es veraltet ist." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" -msgstr "Ignoriere FUNDING.yml Einträge länger als 2048: %s" +msgstr "Ignoriere FUNDING.yml-Einträge länger als 2048: %s" #: ../fdroidserver/update.py #, python-format @@ -1165,7 +1165,7 @@ msgstr "Fehlerhafte Paketquellen-Spiegelserver." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" -msgstr "Fehlerhafte serverwebroot Zeile:" +msgstr "Fehlerhafte serverwebroot-Zeile:" #: ../fdroidserver/scanner.py #, python-format @@ -1191,11 +1191,11 @@ msgstr "Weder \"repo_pubkey\" noch \"keystorepass\" in config.yml gesetzt" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" -msgstr "Keine APK für das Paket: %s" +msgstr "Kein APK für das Paket: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" -msgstr "Kein Android SDK gefunden!" +msgstr "Kein Android-SDK gefunden!" #: ../fdroidserver/install.py msgid "No attached devices found" @@ -1781,9 +1781,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "Um awsbucket zu benutzen, müssen awssecretkey und awsaccesskeyid auch in der config.yml gesetzt sein!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" -msgstr "Um awsbucket zu benutzen, müssen awssecretkey und awsaccesskeyid auch in der config.yml gesetzt sein!" +msgstr "Um rclone zu benutzen, müssen rclone_config und awsbucket auch in der config.yml gesetzt sein!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1824,7 +1823,7 @@ msgstr "Unbekannter Fehler aufgetreten!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" -msgstr "Unbekannte Datei '{filename}' im Build '{versionName}''" +msgstr "Unbekannte Datei '{filename}' im Build '{versionName}'" #: ../fdroidserver/metadata.py #, python-format @@ -1856,7 +1855,7 @@ msgstr "Nicht erkanntes App-Feld '{fieldname}' in '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" -msgstr "NIcht erkannte Build Flag '{build_flag}' in '{path}'" +msgstr "Nicht erkanntes Build-Flag '{build_flag}' in '{path}'" #: ../fdroidserver/update.py #, python-brace-format @@ -1881,12 +1880,12 @@ msgstr "Nicht verwendete Datei bei %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" -msgstr "Nicht verwendeter „scandelete“ Pfad: %s" +msgstr "Nicht verwendeter „scandelete“-Pfad: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" -msgstr "Nicht verwendeter „scanignore“ Pfad: %s" +msgstr "Nicht verwendeter „scanignore“-Pfad: %s" #: ../fdroidserver/common.py #, python-format @@ -2019,9 +2018,9 @@ msgid "Using existing keystore \"{path}\"" msgstr "Verwende vorhandenen Schlüsselspeicher \"{path}\"" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using rclone to sync with: {url}" -msgstr "Verwende s3cmd zum Synchronisieren mit: {url}" +msgstr "Verwende rclone zum Synchronisieren mit: {url}" #: ../fdroidserver/deploy.py #, python-brace-format From 8676ab800f7d101d1b90a3a4c33671545357df90 Mon Sep 17 00:00:00 2001 From: Nazar Date: Mon, 16 Sep 2024 15:09:23 +0200 Subject: [PATCH 1718/2116] Translated using Weblate: Ukrainian (uk) by Nazar Currently translated at 100.0% (592 of 592 strings) Co-authored-by: Nazar Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 38 +++++++++++++-------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index f4176a26..dbf3e659 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -10,20 +10,21 @@ # Макар Разин , 2023. # Tymofii Lytvynenko , 2024. # Fqwe1 , 2024. +# Nazar , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-04 13:39+0000\n" -"Last-Translator: Ihor Hordiichuk \n" +"PO-Revision-Date: 2024-09-13 09:52+0000\n" +"Last-Translator: Nazar \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.7.2-rc\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -687,12 +688,12 @@ msgstr "ПОМИЛКА: непідтримуваний git-хост «%s», ви #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" -msgstr "" +msgstr "Помилка: {key} в {path} це не «архів» чи «репозиторій»!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" -msgstr "" +msgstr "Помилка: {key}:{subkey} в {path} немає серед дозволених ключів: {allowed_keys}!" #: ../fdroidserver/__main__.py #, python-brace-format @@ -715,7 +716,7 @@ msgstr "Змінну середовища {var} від {configname} не нал #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "" +msgstr "Помилка розгортання 'github_releases', {} відсутній. (Можливо вам потрібно спочатку виконати `fdroid update`.)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -1306,15 +1307,15 @@ msgstr "Автономна машина, пропускання генерува #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "" +msgstr "В одному з елементів конфігурації 'github_releases' відсутнє значення 'projectUrl'. пропущено ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." -msgstr "" +msgstr "В одному з елементів конфігурації 'github_releases' відсутнє значення 'packageNames'. пропущено ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." -msgstr "" +msgstr "В одному з елементів конфігурації 'github_releases' відсутнє значення 'token'. пропущено ..." #: ../fdroidserver/update.py #, python-brace-format @@ -1530,7 +1531,7 @@ msgstr "Запустити для git-репозиторію з неподани #: ../fdroidserver/nightly.py #, python-brace-format msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" -msgstr "" +msgstr "Виконайте команду {cibase}, щоб знайти -debug.apk. і пропустіть repo_basedir {repo_basedir}" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1772,9 +1773,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "Для використання awsbucket, awssecretkey та awsaccesskeyid також слід налаштувати config.yml!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" -msgstr "Для використання awsbucket, awssecretkey та awsaccesskeyid також слід налаштувати config.yml!" +msgstr "Для використання rclone у файлі config.yml мають бути встановлені параметри rclone_config та awsbucket!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1974,9 +1974,9 @@ msgid "Using \"{path}\" for configuring s3cmd." msgstr "Використання \"{path}\" для налаштування s3cmd." #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using \"{path}\" for syncing with remote storage." -msgstr "Використання \"{path}\" для налаштування s3cmd." +msgstr "\"{path}\" використовується для синхронізації з віддаленим сховищем." #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -2010,9 +2010,9 @@ msgid "Using existing keystore \"{path}\"" msgstr "Застосування наявного сховища ключів \"{path}\"" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using rclone to sync with: {url}" -msgstr "Використовувати s3cmd для синхронізації з: {url}" +msgstr "Використовується rsync для синхронізації з: {url}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2235,7 +2235,7 @@ msgstr "видалення: репозиторій/{apkfilename}" #: ../fdroidserver/scanner.py msgid "dependency file without lock" -msgstr "" +msgstr "файл залежності без блокування" #: ../fdroidserver/common.py #, python-brace-format @@ -2566,9 +2566,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd синхронізувати індекси з {path} до {url} та видалити" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "s3cmd синхронізувати індекси з {path} до {url} та видалити" +msgstr "s3cmd синхронізує індекси з {path} до {url} і видаляє видалені" #: ../fdroidserver/scanner.py #, python-brace-format From 3e7bce38f84606e665cb31cbff874fc1c225a026 Mon Sep 17 00:00:00 2001 From: Jakub Boukal Date: Mon, 16 Sep 2024 15:09:25 +0200 Subject: [PATCH 1719/2116] Translated using Weblate: Czech (cs) by Jakub Boukal Currently translated at 99.1% (587 of 592 strings) Co-authored-by: Jakub Boukal Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ Translation: F-Droid/F-Droid Server --- locale/cs/LC_MESSAGES/fdroidserver.po | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 1d3ab9e7..48d57e29 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -7,20 +7,21 @@ # Fjuro , 2022, 2023. # Daniel Hejduk , 2023. # Fjuro , 2024. +# Jakub Boukal , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-05-15 04:32+0000\n" -"Last-Translator: Fjuro \n" +"PO-Revision-Date: 2024-09-13 09:52+0000\n" +"Last-Translator: Jakub Boukal \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" -"X-Generator: Weblate 5.6-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -684,12 +685,12 @@ msgstr "CHYBA: nepodporovaný git host \"%s\", opravy vítány!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" -msgstr "" +msgstr "CHYBA: {key} v {path} není \"archive\" nebo \"repo\"!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" -msgstr "" +msgstr "CHYBA: {key}:{subkey} v {path} není v povolených klíčích: {allowed_keys}!" #: ../fdroidserver/__main__.py #, python-brace-format @@ -712,7 +713,7 @@ msgstr "Proměnná prostředí {var} z {configname} není nastavena!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "" +msgstr "Chyba při nasazení 'github_releases', {} není k dispozici. (Možná budete muset nejprve spustit `fdroid update`.)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -1303,15 +1304,15 @@ msgstr "Offline počítač, přeskočení generování mirroru git až do `fdroi #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "" +msgstr "V jedné z položek konfigurace 'github_releases' chybí hodnota 'projectUrl'. přeskakuji ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." -msgstr "" +msgstr "V jedné z položek konfigurace 'github_releases' chybí hodnota 'packageNames'. přeskakuji ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." -msgstr "" +msgstr "V jedné z položek konfigurace 'github_releases' chybí hodnota 'token'. přeskakuji ..." #: ../fdroidserver/update.py #, python-brace-format @@ -2232,7 +2233,7 @@ msgstr "mazání: repo/{apkfilename}" #: ../fdroidserver/scanner.py msgid "dependency file without lock" -msgstr "" +msgstr "soubor závislostí bez zámku" #: ../fdroidserver/common.py #, python-brace-format From 9e092582c2ba08ff0050279f813151840b4ddb41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Mon, 16 Sep 2024 15:09:26 +0200 Subject: [PATCH 1720/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Irish?= =?UTF-8?q?=20(ga)=20by=20Aindri=C3=BA=20Mac=20Giolla=20Eoin=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (592 of 592 strings) Added translation using Weblate: Irish (ga) by Aindriú Mac Giolla Eoin Co-authored-by: Aindriú Mac Giolla Eoin Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ga/ Translation: F-Droid/F-Droid Server --- locale/ga/LC_MESSAGES/fdroidserver.po | 2860 +++++++++++++++++++++++++ 1 file changed, 2860 insertions(+) create mode 100644 locale/ga/LC_MESSAGES/fdroidserver.po diff --git a/locale/ga/LC_MESSAGES/fdroidserver.po b/locale/ga/LC_MESSAGES/fdroidserver.po new file mode 100644 index 00000000..e49da48a --- /dev/null +++ b/locale/ga/LC_MESSAGES/fdroidserver.po @@ -0,0 +1,2860 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# Aindriú Mac Giolla Eoin , 2024. +msgid "" +msgstr "" +"Project-Id-Version: fdroidserver 2.3a1-162-gfbb3cc59\n" +"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" +"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"PO-Revision-Date: 2024-09-13 23:36+0000\n" +"Last-Translator: Aindriú Mac Giolla Eoin \n" +"Language-Team: Irish \n" +"Language: ga\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :(n>6 && n<11) ? 3 : 4;\n" +"X-Generator: Weblate 5.8-dev\n" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH public key to be used as deploy key:" +msgstr "" +"\n" +"Eochair phoiblí SSH le húsáid mar eochair imlonnaithe:" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "" +"\n" +"{path} encoded for the DEBUG_KEYSTORE secret variable:" +msgstr "" +"\n" +"{path} ionchódaithe don athróg rúnda DEBUG_KEYSTORE:" + +#: ../fdroidserver/lint.py +#, python-format +msgid "\"%s/\" has no matching metadata file!" +msgstr "Níl aon chomhad meiteashonraí meaitseála ag \"%s/\"!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "Níl \"local_copy_dir\" {path} ann!" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "\"{apkfilename}\" is already installed on {dev}." +msgstr "Tá \"{apkfilename}\" suiteáilte cheana féin ar {dev}." + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains outdated {name} ({version})" +msgstr "\"{path}\" tá {name} as dáta ({version})" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains recent {name} ({version})" +msgstr "Tá \"{path}\" le déanaí {name} ({version})" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "\"{path}\" exists but s3cmd is not installed!" +msgstr "Tá \"{path}\" ann ach níl s3cmd suiteáilte!" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" +msgstr "Ní formáid comhaid tacaithe é \"{path}\" (úsáid: meiteashonraí/*.yml)" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "Tá \"{path}\" sínithe ag eochair nach bhfuil ceadaithe:" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "\"{url}\" is not a valid URL!" +msgstr "Ní URL bailí é \"{url}\"!" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "%(option)s option requires %(number)d argument" +msgid_plural "%(option)s option requires %(number)d arguments" +msgstr[0] "Tá argóint %(number)d ag teastáil ó rogha %(option)s" +msgstr[1] "Teastaíonn %(number)d argóint le rogha %(option)s" +msgstr[2] "Teastaíonn %(number)d argóint le rogha %(option)s" +msgstr[3] "Teastaíonn %(number)d argóint le rogha %(option)s" +msgstr[4] "Teastaíonn %(number)d argóint le rogha %(option)s" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "%(prog)s: error: %(message)s\n" +msgstr "%(prog)s: earráid: %(message)s\n" + +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "Theip ar %d APKs a shíniú nó a fhíorú!" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "%d problems found" +msgstr "Aimsíodh %d fadhbanna" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "%prog [options]" +msgstr "%prog [roghanna]" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "%r is not callable" +msgstr "Níl %r inghlaoite" + +#: ../fdroidserver/signindex.py +#, python-format +msgid "%s did not produce a dict!" +msgstr "Níor tháirg %s deachtú!" + +#: ../fdroidserver/signindex.py +#, python-format +msgid "%s has bad SHA-256: %s" +msgstr "Tá droch-SHA-256 ag %s: %s" + +#: ../fdroidserver/lint.py +#, python-format +msgid "%s is not an accepted build field" +msgstr "Ní réimse tógála inghlactha é %s" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "%s option does not take a value" +msgstr "Ní ghlacann rogha %s luach" + +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "Níl 'Keypass' le fáil i config.yml!" + +#: ../fdroidserver/common.py +msgid "'keystore' is NONE and 'smartcardoptions' is blank!" +msgstr "Is é 'keystore' NONE agus tá 'smartcardoptions' bán!" + +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "Níl 'keystore' le fáil i config.yml!" + +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "Níl 'keystorepass' le fáil i config.yml!" + +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "Níl 'repo_keyalias' le fáil sa config.yml!" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "'required' is an invalid argument for positionals" +msgstr "Is argóint neamhbhailí é 'riachtanach' do shuíomhanna" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "Níl 'sdk_path' socraithe sa config.yml!" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" +msgstr "Tá '{aapt}' ró-shean, éilíonn fdroid build-tools-{version} nó níos nuaí!" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgstr "Beidh '{field}' in ord randamach! Bain úsáid as lúibíní () nó [] má tá ord tábhachtach!" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{path}' failed to execute!" +msgstr "Theip ar '{path}' a rith!" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "Tá formáid neamhbhailí ag '{path}', ba chóir gur foclóir é!" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format +msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" +msgstr "Ní '{value}' bailí {field} in {appid}. Patrún Regex: {pattern}" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "Ní '{field} bailí é '{value}', ba chóir go mbeadh {pattern}" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "...checkupdate failed for {appid} : {error}" +msgstr "... theip ar checkupdate le haghaidh {appid} : {error}" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid ".__call__() not defined" +msgstr ".__call__() gan sainmhíniú" + +#: ../fdroidserver/lint.py +msgid "/issues is missing" +msgstr "/tá saincheisteanna ar iarraidh" + +#: ../fdroidserver/mirror.py +msgid "A URL is required as an argument!" +msgstr "Tá URL ag teastáil mar argóint!" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "Tá teastais éagsúla ag sínithe APK i {path}:" + +#: ../fdroidserver/__main__.py +msgid "Add PGP signatures using GnuPG for packages in repo" +msgstr "Cuir sínithe PGP leis ag baint úsáide as GnuPG le haghaidh pacáistí i repo" + +#: ../fdroidserver/update.py +msgid "Add a repo signing key to an unsigned repo" +msgstr "Cuir eochair sínithe repo le repo gan síniú" + +#: ../fdroidserver/update.py +msgid "Add skeleton metadata files for APKs that are missing them" +msgstr "Cuir comhaid mheiteashonraí cnámharlaigh le haghaidh APKs atá in easnamh orthu" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Adding new repo for only {name}" +msgstr "Ag cur repo nua le haghaidh {name} amháin" + +#: ../fdroidserver/init.py +msgid "Alias of the repo signing key in the keystore" +msgstr "Ailias an eochair sínithe repo sa siopa eochrach" + +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "AllowedAPKSigningKeys ar iarraidh ach tagairt dénártha soláthraithe" + +#: ../fdroidserver/import_subcommand.py +msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgstr "Ceadaíonn sé seo athbhreithniú difriúil (nó brainse git) a shonrú le haghaidh na hiompórtála tosaigh" + +#: ../fdroidserver/mirror.py +msgid "Also mirror the full archive section" +msgstr "Chomh maith leis sin scáthánaigh rannóg iomlán na cartlainne" + +#: ../fdroidserver/lint.py +msgid "Also warn about formatting issues, like rewritemeta -l" +msgstr "Chomh maith leis sin rabhadh faoi shaincheisteanna formáidithe, cosúil le rewritemeta -l" + +#: ../fdroidserver/scanner.py +msgid "Android AAR library" +msgstr "Leabharlann Android AAR" + +#: ../fdroidserver/scanner.py +msgid "Android APK file" +msgstr "Comhad Android APK" + +#: ../fdroidserver/scanner.py +msgid "Android DEX code" +msgstr "Cód Android DEX" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "Android SDK gan fáil ag {path}!" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' does not exist!" +msgstr "Níl cosán SDK Android '{path}' ann!" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' is not a directory!" +msgstr "Ní eolaire é cosán SDK Android '{path}'!" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "Android SDK uirlis {cmd} gan aimsiú!" + +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "Tá Binaries ag app ach níl AllowedAPKSigningKeys comhfhreagrach aige chun deimhniú a phionnáil." + +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "Tá NoSourceSince nó ArchivePolicy \"leaganacha 0\" ag an bhfeidhmchlár ach níl aon cheann ag AutoUpdateMode nó UpdateCheckMode" + +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "Tá NoSourceSince nó ArchivePolicy \"leaganacha 0\" nó 0 ag an bhfeidhmchlár ach níl aon cheann ag AutoUpdateMode nó UpdateCheckMode" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "App is in '{repo}' but has a link to {url}" +msgstr "Tá an feidhmchlár in '{repo}' ach tá nasc aige le {url}" + +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "Tá dénártha ag leagan app ach níl AllowedAPKSigningKeys comhfhreagrach aige chun deimhniú a phionnáil." + +#: ../fdroidserver/lint.py +msgid "Appending .git is not necessary" +msgstr "Ní gá .git a iarcheangal" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Archiving {apkfilename} with invalid signature!" +msgstr "Cartlannú {apkfilename} le síniú neamhbhailí!" + +#: ../fdroidserver/lint.py +msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." +msgstr "AutoUpdateMode le UpdateCheckMode: Caithfidh patrún a bheith ag HTTP." + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "Drochchineál iontrála \"{mirrortype}\" i gcumraíocht scátháin: {mirror}" + +#: ../fdroidserver/mirror.py +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgstr "Bun-URL le scáthán, is féidir an eochair sínithe innéacs a áireamh ag baint úsáide as teaghrán an iarratais: ?fingerprint=" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in build '{versionName}'" +msgstr "Brainse '{branch}' a úsáidtear mar gheall ar thógáil '{versionName}'" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in srclib '{srclib}'" +msgstr "Brainse '{branch}' a úsáidtear mar chimire sa srclib '{srclib}'" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Broken symlink: {path}" +msgstr "Nasc siombalach briste: {path}" + +#: ../fdroidserver/__main__.py +msgid "Build a package from source" +msgstr "Tóg pacáiste ón bhfoinse" + +#: ../fdroidserver/build.py +msgid "Build all applications available" +msgstr "Tóg gach iarratas atá ar fáil" + +#: ../fdroidserver/lint.py +msgid "Build generated by `fdroid import` - remove disable line once ready" +msgstr "Tóg ginte ag 'iompórtáil fdroid' - bain líne dhíchumasaigh nuair atá sé réidh" + +#: ../fdroidserver/checkupdates.py +msgid "Build metadata git repo has uncommited changes!" +msgstr "Tóg meiteashonraí git repo Tá athruithe neamhchoitianta!" + +#: ../fdroidserver/build.py +msgid "Build only the latest version of each package" +msgstr "Ná tóg ach an leagan is déanaí de gach pacáiste" + +#: ../fdroidserver/init.py +#, python-format +msgid "Built repo based in \"%s\" with this config:" +msgstr "Repo tógtha bunaithe i \"%s\" leis an gcumraíocht seo:" + +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "Ní féidir feidhmchlár a nuashonrú go huathoibríoch gan aon CurrentVersionCode" + +#: ../fdroidserver/build.py +msgid "Can't build due to {} error while scanning" +msgid_plural "Can't build due to {} errors while scanning" +msgstr[0] "Ní féidir tógáil de bharr earráid {} agus scanadh" +msgstr[1] "Ní féidir tógáil de bharr {} earráidí agus an scanadh" +msgstr[2] "Ní féidir tógáil de bharr {} earráidí agus an scanadh" +msgstr[3] "Ní féidir tógáil de bharr {} earráidí agus an scanadh" +msgstr[4] "Ní féidir tógáil de bharr {} earráidí agus an scanadh" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Cannot rewrite \"{path}\"" +msgstr "Ní féidir \"{path}\" a athscríobh" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Categories '%s' is not valid" +msgstr "Níl catagóirí '%s' bailí" + +#: ../fdroidserver/lint.py +msgid "Categories are not set" +msgstr "Níl catagóirí socraithe" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "Catagóir \"{category}\" sainithe ach nach n-úsáidtear le haghaidh aon apps!" + +#: ../fdroidserver/__main__.py +msgid "Check for updates to applications" +msgstr "Seiceáil le haghaidh nuashonruithe ar fheidhmchláir" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Ag seiceáil cartlannú le haghaidh {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" + +#: ../fdroidserver/update.py +msgid "Clean update - don't uses caches, reprocess all APKs" +msgstr "Nuashonrú glan - ná húsáid taisce, athphróiseáil gach APKs" + +#: ../fdroidserver/import_subcommand.py +msgid "Comma separated list of categories." +msgstr "Camóga scartha liosta de chatagóirí." + +#: ../fdroidserver/__main__.py +#, python-format +msgid "Command '%s' not recognised.\n" +msgstr "Níor aithníodh ordú '%s'.\n" + +#: ../fdroidserver/checkupdates.py +msgid "Commit changes" +msgstr "Cuir athruithe i bhfeidhm" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "Sainmhínithe contrártha \"{field}\" idir comhaid .yml agus logánaithe:" + +#: ../fdroidserver/__main__.py +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgstr "Argóintí contrártha: ní féidir '--verbose' agus '--quiet' a shonrú ag an am céanna." + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "Comhaid chumraíochta ag teacht salach ar a chéile! Ag baint úsáide as {newfile}, neamhaird {oldfile}!" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not find '{command}' on your system" +msgstr "Níorbh fhéidir '{command}' a aimsiú ar do chóras" + +#: ../fdroidserver/import_subcommand.py +msgid "Could not find latest version code" +msgstr "Níorbh fhéidir an cód leagain is déanaí a aimsiú" + +#: ../fdroidserver/import_subcommand.py +msgid "Could not find latest version name" +msgstr "Níorbh fhéidir ainm an leagain is déanaí a aimsiú" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not find {path} to remove it" +msgstr "Níorbh fhéidir {path} a aimsiú chun é a bhaint" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "Níorbh fhéidir APK {path} a oscailt le haghaidh anailíse: " + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not parse size \"{size}\", wrong type \"{type}\"" +msgstr "Níorbh fhéidir méid \"{size}\" a pharsáil, cineál mícheart \"{type}\"" + +#: ../fdroidserver/import_subcommand.py +msgid "Couldn't find Application ID" +msgstr "Níorbh fhéidir aitheantas feidhmchláir a aimsiú" + +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "Níorbh fhéidir aon eolas faoin leagan a aimsiú" + +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find package ID" +msgstr "Níorbh fhéidir aitheantas an phacáiste a aimsiú" + +#: ../fdroidserver/update.py +msgid "Cowardily refusing to overwrite existing signing key setup!" +msgstr "Cowardily diúltú a overwrite thus eochair síniú atá ann cheana féin!" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Created new container \"{name}\"" +msgstr "Cruthaíodh coimeádán nua \"{name}\"" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Creating \"{path}\" for configuring s3cmd." +msgstr "Ag cruthú \"{path}\" chun s3cmd a chumrú." + +#: ../fdroidserver/publish.py +msgid "Creating log directory" +msgstr "Comhadlann logála á cruthú" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Creating new S3 bucket: {url}" +msgstr "Buicéad nua S3 á chruthú: {url}" + +#: ../fdroidserver/publish.py +msgid "Creating output directory" +msgstr "Comhadlann aschurtha á cruthú" + +#: ../fdroidserver/index.py +msgid "Creating signed index with this key (SHA256):" +msgstr "Innéacs sínithe a chruthú leis an eochair seo (SHA256):" + +#: ../fdroidserver/publish.py ../fdroidserver/verify.py +msgid "Creating temporary directory" +msgstr "Comhadlann shealadach á cruthú" + +#: ../fdroidserver/index.py +msgid "Creating unsigned index in preparation for signing" +msgstr "Innéacs gan síniú a chruthú mar ullmhúchán do shíniú" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" +msgstr "Tá CurrentVersionCode {cv} níos lú ná an iontráil tógála is sine {versionCode}" + +#: ../fdroidserver/nightly.py +msgid "DEBUG_KEYSTORE is not set or the value is incomplete" +msgstr "nach bhfuil DEBUG_KEYSTORE socraithe nó go bhfuil an luach neamhiomlán" + +#: ../fdroidserver/update.py +msgid "Delete APKs and/or OBBs without metadata from the repo" +msgstr "Scrios APKs agus/nó OBBanna gan meiteashonraí ón repo" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting archive, repo is too big ({size} max {limit})" +msgstr "Cartlann á scriosadh, tá repo rómhór ({size} max {limit})" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" +msgstr "Ag scriosadh stair git-scáthán, tá repo rómhór ({size} max {limit})" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Deleting unknown file: {path}" +msgstr "Comhad anaithnid á scriosadh: {path}" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description '%s' is just the app's summary" +msgstr "Níl sa chur síos ar '%s' ach achoimre an fheidhmchláir" + +#: ../fdroidserver/lint.py +msgid "Description has a duplicate line" +msgstr "Tá líne dhúbailte ag cur síos" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" +msgstr "Tá liosta (%s) sa chur síos ach níl sé urchair (*) ná uimhrithe (#)" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Description of length {length} is over the {limit} char limit" +msgstr "Tá cur síos ar fhad {length} os cionn na teorann char {limit}" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "An raibh cumraíocht/{name}i gceist agat.yml?" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "An raibh {code}i gceist agat?" + +#: ../fdroidserver/import_subcommand.py +msgid "Do not add 'disable:' to the generated build entries" +msgstr "Ná cuir 'díchumasaigh:' leis na hiontrálacha tógála ginte" + +#: ../fdroidserver/nightly.py +msgid "Do not deploy the new files to the repo" +msgstr "Ná húsáid na comhaid nua chuig an repo" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Do not include \"{path}\" in URL!" +msgstr "Ná cuir \"{path}\" san URL!" + +#: ../fdroidserver/init.py +msgid "Do not prompt for Android SDK path, just fail" +msgstr "Ná pras le haghaidh cosán SDK Android, ach teip" + +#: ../fdroidserver/nightly.py +msgid "Do not remove the private keys generated from the keystore" +msgstr "Ná bain na heochracha príobháideacha a ghintear ón siopa eochrach" + +#: ../fdroidserver/build.py +msgid "Don't create a source tarball, useful when testing a build" +msgstr "Ná chruthú tarball foinse, úsáideach nuair a thástáil a thógáil" + +#: ../fdroidserver/build.py +msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgstr "Ná athnuaigh an stór, úsáideach agus tú ag tástáil tógála gan aon nasc idirlín" + +#: ../fdroidserver/deploy.py ../fdroidserver/nightly.py +msgid "Don't use rsync checksums" +msgstr "Ná húsáid seiceálacha rsync" + +#: ../fdroidserver/__main__.py +msgid "Download complete mirrors of small repos" +msgstr "Íoslódáil scátháin iomlána de repos beag" + +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "%s á íosluchtú" + +#: ../fdroidserver/common.py +msgid "Downloading the repository already failed once, not trying again." +msgstr "Theip ar an stór a íoslódáil cheana féin uair amháin, gan iarracht a dhéanamh arís." + +#: ../fdroidserver/verify.py +#, python-brace-format +msgid "Downloading {url} failed. {error}" +msgstr "Níorbh fhéidir {url} a íosluchtú. {error}" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "Rinneadh neamhaird ar dhearbhú Dúblach Frith-Ghné ag {path}!" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "Dúblach iontráil \"%s\" i gcumraíocht scátháin!" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Duplicate link in '{field}': {url}" +msgstr "Nasc dúblach i '{field}': {url}" + +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "EARRÁID: %(message)s" + +#: ../fdroidserver/__main__.py +msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" +msgstr "EARRÁID: Baineadh an fo-ordú \"freastalaí\", bain úsáid as \"imscaradh\"!" + +#: ../fdroidserver/mirror.py +msgid "" +"ERROR: this command should never be used to mirror f-droid.org!\n" +"A full mirror of f-droid.org requires more than 200GB." +msgstr "" +"EARRÁID: níor chóir an t-ordú seo a úsáid riamh chun scáthán a dhéanamh f-droid.org!\n" +"Éilíonn scáthán iomlán f-droid.org níos mó ná 200GB." + +#: ../fdroidserver/nightly.py +msgid "ERROR: unsupported CI type, patches welcome!" +msgstr "EARRÁID: cineál CI gan tacaíocht, fáilte roimh phaistí!" + +#: ../fdroidserver/nightly.py +#, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "EARRÁID: Óstríomhaire git gan tacaíocht \"%s\", fáilte roimh phaistí!" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "EARRÁID: Níl {key} i {path} \"archive\" nó \"repo\"!" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "EARRÁID: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" + +#: ../fdroidserver/__main__.py +#, python-brace-format +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "Tá ionchódú socraithe chun '{enc}' d'fhéadfadh fdroid rith i saincheisteanna ionchódú. Socraigh é chuig 'UTF-8' chun na torthaí is fearr a fháil." + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"Enter the path to the Android SDK (%s) here:\n" +"> " +msgstr "" +"Cuir isteach an chonair go dtí an SDK Android (%s) anseo:\n" +"> " + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "Níl athróg timpeallachta {var} ó {configname} socraithe!" + +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "Earráid agus 'github_releases' á úsáid, {} gan a bheith i láthair. (B'fhéidir go mbeidh ort 'nuashonrú fdroid' a rith ar dtús.)" + +#: ../fdroidserver/import_subcommand.py +msgid "Error while getting repo address" +msgstr "Earráid agus seoladh repo á fháil" + +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "Scoir le cód neamh-nialasach má aimsíodh fadhbanna" + +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "Bain meiteashonraí feidhmchláir as stór foinseach" + +#: ../fdroidserver/__main__.py +msgid "Extract signatures from APKs" +msgstr "Sleachta sínithe ó APKs" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed copying {path}: {error}" +msgstr "Theip ar chóipeáil {path}: {error}" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Failed fetching signatures for '{apkfilename}': {error}" +msgstr "Theip ar shínithe a fháil le haghaidh '{apkfilename}': {error}" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed reading {path}: {error}" +msgstr "Theip ar léamh {path}: {error}" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed resizing {path}: {error}" +msgstr "Theip ar athrú {path}: {error}" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Failed to create S3 bucket: {url}" +msgstr "Theip ar bhuicéad S3 a chruthú: {url}" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get APK information, deleting {path}" +msgstr "Theip ar fhaisnéis APK a fháil, ag scriosadh {path}" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get APK information, skipping {path}" +msgstr "Theip ar fhaisnéis APK a fháil, gan bacadh le {path}" + +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "Níorbh fhéidir méarlorg eochracha sínithe APK a fháil" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Failed to install '{apkfilename}' on {dev}: {error}" +msgstr "Theip ar shuiteáil '{apkfilename}' ar {dev}: {error}" + +#: ../fdroidserver/common.py +msgid "Failed to sign application" +msgstr "Theip ar an bhfeidhmchlár a shíniú" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Fetched buildserverid from VM: {buildserverid}" +msgstr "Fetched buildserverid ó VM: {buildserverid}" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" +msgstr "Sínithe faighte le haghaidh '{apkfilename}' -> '{sigdir}'" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "File disappeared while processing it: {path}" +msgstr "D'imigh an comhad agus é á phróiseáil: {path}" + +#: ../fdroidserver/build.py ../fdroidserver/install.py +#: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py +#: ../fdroidserver/update.py +msgid "Finished" +msgstr "Críochnaithe" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID: field" +msgstr "Baineann modhanna síntiús Flattr sa FlattrID: réimse" + +#: ../fdroidserver/lint.py +msgid "Forbidden HTML tags" +msgstr "Clibeanna HTML toirmiscthe" + +#: ../fdroidserver/build.py +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgstr "Fórsa tógáil apps faoi mhíchumas, agus déanann sé beag beann ar fhadhbanna scanadh. Ní cheadaítear ach amháin i mód tástála." + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Force halting build after {0} sec timeout!" +msgstr "Fórsa stopadh a thógáil tar éis {0} timeout sec!" + +#: ../fdroidserver/scanner.py +msgid "Force scan of disabled apps and builds." +msgstr "Fórsa scanadh apps faoi mhíchumas agus tógann." + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" +msgstr "Aimsíodh grafach \"{path}\" gan meiteashonraí don fheidhmchlár \"{name}\"!" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found bad funding file \"{path}\" for \"{name}\":" +msgstr "Aimsíodh drochchomhad maoinithe \"{path}\" in ionad \"{name}\":" + +#: ../fdroidserver/common.py +msgid "Found invalid appids in arguments" +msgstr "Aimsíodh appids neamhbhailí in argóintí" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +msgid "Found invalid versionCodes for some apps" +msgstr "Aimsíodh leagan neamhbhailíCodes for some apps" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Found multiple JAR Signature Block Files in {path}" +msgstr "Aimsíodh ilchomhaid Bloc Sínithe JAR i {path}" + +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "Aimsíodh il-Theastais Signer!" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Found multiple metadata files for {appid}" +msgstr "Aimsíodh ilchomhaid mheiteashonraí le haghaidh {appid}" + +#: ../fdroidserver/index.py +msgid "Found multiple signing certificates for repository." +msgstr "Aimsíodh ildeimhnithe sínithe don stór." + +#: ../fdroidserver/index.py +msgid "Found no signing certificates for repository." +msgstr "Níor aimsíodh aon deimhnithe sínithe don stór." + +#: ../fdroidserver/lint.py +#, python-format +msgid "Found non-file at %s" +msgstr "Aimsíodh neamhchomhad ag %s" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Found {apkfilename} at {url}" +msgstr "Aimsíodh {apkfilename} ag {url}" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Found {count} problems in {filename}" +msgstr "Aimsíodh fadhbanna {count} i {filename}" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Found {count} warnings in {filename}" +msgstr "Aimsíodh rabhaidh {count} in {filename}" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Generated skeleton metadata for {appid}" +msgstr "Meiteashonraí cnámharlaigh ginte le haghaidh {appid}" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git checkout of '%s' failed" +msgstr "Theip ar sheiceáil Git de '%s'" + +#: ../fdroidserver/common.py +msgid "Git clean failed" +msgstr "Theip ar Git glan" + +#: ../fdroidserver/common.py +msgid "Git fetch failed" +msgstr "Theip ar ghabháil Git" + +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "Theip ar git prune" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git remote set-head failed: \"%s\"" +msgstr "Theip ar cheann socraithe cianda Git: \"%s\"" + +#: ../fdroidserver/common.py +msgid "Git reset failed" +msgstr "Theip ar athshocrú Git" + +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "Theip ar Git submodule deinit" + +#: ../fdroidserver/common.py +msgid "Git submodule sync failed" +msgstr "Theip ar shioncronú submodule Git" + +#: ../fdroidserver/common.py +msgid "Git submodule update failed" +msgstr "Theip ar nuashonrú submodule Git" + +#: ../fdroidserver/common.py +msgid "HTTPS must be used with Subversion URLs!" +msgstr "Ní mór HTTPS a úsáid le URLanna Subversion!" + +#: ../fdroidserver/deploy.py +msgid "If a git mirror gets to big, allow the archive to be deleted" +msgstr "Má éiríonn scáthán git mór, lig don chartlann a scriosadh" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "If this upload fails, try manually uploading to {url}" +msgstr "Má theipeann ar an uaslódáil seo, déan iarracht uaslódáil de láimh chuig {url}" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." +msgstr "Neamhaird a dhéanamh ar mheiteashonraí '{field}' i meiteashonraí '{metapath}' toisc go bhfuil sé dímheasta." + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring FUNDING.yml entry longer than 2048: %s" +msgstr "Gan neamhaird a dhéanamh FUNDING.yml iontráil níos faide ná 2048: %s" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "Neamhaird á déanamh ar dhrocheilimint sa léiriú: %s" + +#: ../fdroidserver/index.py +msgid "Ignoring package without metadata: " +msgstr "Neamhaird a dhéanamh ar phacáiste gan mheiteashonraí: " + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Ignoring stale cache data for {apkfilename}" +msgstr "Neamhaird a dhéanamh ar shonraí taisce stale le haghaidh {apkfilename}" + +#: ../fdroidserver/update.py +msgid "Include APKs that are signed with disabled algorithms like MD5" +msgstr "Cuir APKs san áireamh atá sínithe le halgartaim faoi mhíchumas cosúil le MD5" + +#: ../fdroidserver/mirror.py +msgid "Include the PGP signature .asc files in the mirror" +msgstr "Cuir na comhaid sínithe PGP .asc san áireamh sa scáthán" + +#: ../fdroidserver/mirror.py +msgid "Include the build logs in the mirror" +msgstr "Cuir na logaí tógála sa scáthán san áireamh" + +#: ../fdroidserver/mirror.py +msgid "Include the source tarballs in the mirror" +msgstr "Cuir na tarballs foinse sa scáthán" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "Meiteashonraí ó %s@%s san áireamh" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "Meiteashonraí ó {path} san áireamh" + +#: ../fdroidserver/common.py +msgid "Initialising submodules" +msgstr "Fo-mhodúil a thúsú" + +#: ../fdroidserver/install.py +msgid "Install all signed applications available" +msgstr "Suiteáil gach feidhmchlár sínithe atá ar fáil" + +#: ../fdroidserver/__main__.py +msgid "Install built packages on devices" +msgstr "Suiteáil pacáistí tógtha ar ghléasanna" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s..." +msgstr "%s á shuiteáil..." + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}..." +msgstr "Ag suiteáil '{apkfilename}' ar {dev}..." + +#: ../fdroidserver/__main__.py +msgid "Interact with the repo HTTP server" +msgstr "Idirghníomhú leis an bhfreastalaí repo HTTP" + +#: ../fdroidserver/update.py +msgid "Invalid APK" +msgstr "APK neamhbhailí" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "AutoUpdateMode neamhbhailí: {mode}" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "Nuashonrú NeamhbhailíCheckMode: {mode}" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid VercodeOperation: {field}" +msgstr "VercodeOperation neamhbhailí: {field}" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Invalid VercodeOperation: {invalid_ops}" +msgstr "VercodeOperation neamhbhailí: {invalid_ops}" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid application ID {appid}" +msgstr "Aitheantas neamhbhailí feidhmchláir {appid}" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid boolean '%s'" +msgstr "Boole neamhbhailí '%s'" + +#: ../fdroidserver/lint.py +msgid "Invalid bulleted list" +msgstr "Liosta neamhbhailí le hurchair" + +#: ../fdroidserver/common.py +#, python-format +msgid "Invalid name for published file: %s" +msgstr "Ainm neamhbhailí ar chomhad foilsithe: %s" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "Invalid ndk: iontráil sa tógáil: \"{ndk}\"" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid redirect to non-HTTPS: {before} -> {after} " +msgstr "Atreorú neamhbhailí chuig neamh-HTTPS: {before} -> {after} " + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid scrlib metadata: '{file}' does not exist" +msgstr "Meiteashonraí scrlib neamhbhailí: níl '{file}' ann" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: could not parse '{file}'" +msgstr "Meiteashonraí neamhbhailí srclib: níorbh fhéidir '{file}' a pharsáil" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" +msgstr "Meiteashonraí neamhbhailí srclic: eochair anaithnid '{key}' in '{file}'" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature failed to verify: {path}" +msgstr "Theip ar shíniú JAR a fhíorú: {path}" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature verified: {path}" +msgstr "Síniú JAR fíoraithe: {path}" + +#: ../fdroidserver/scanner.py +msgid "Java JAR file" +msgstr "Comhad Java JAR" + +#: ../fdroidserver/mirror.py ../fdroidserver/publish.py +#: ../fdroidserver/update.py +msgid "Java JDK not found! Install in standard location or set java_paths!" +msgstr "Níor aimsíodh Java JDK! Suiteáil i suíomh caighdeánach nó socraigh java_paths!" + +#: ../fdroidserver/scanner.py +msgid "Java compiled class" +msgstr "Rang tiomsaithe Java" + +#: ../fdroidserver/signindex.py +msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "Níor aimsíodh jarsigner Java! Suiteáil i suíomh caighdeánach nó socraigh java_paths!" + +#: ../fdroidserver/lint.py +msgid "Javascript in HTML src attributes" +msgstr "Javascript i html src tréithe" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "Theip ar an tógáil \"{apkfilename}\" a choinneáil" + +#: ../fdroidserver/init.py +msgid "Keystore for signing key:\t" +msgstr "Keystore le haghaidh eochair sínithe:\t" + +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "Úsáidtear eochair dífhabhtaithe aitheanta i AllowedAPKSigningKeys: " + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "Breathnaíonn an tiomantas is déanaí a úsáidtear '{commit}' cosúil le clib, ach updateCheckMode is '{ucm}'" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the Liberapay: field" +msgstr "Baineann modhanna síntiús Liberapay sa Liberapay: réimse" + +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "Liostaigh comhaid a leasófaí (rith tirim)" + +#: ../fdroidserver/lint.py +msgid "Locale included in f-droid.org URL" +msgstr "Logchaighdeán san áireamh sa URL f-droid.org" + +#: ../fdroidserver/build.py +msgid "Make the build stop on exceptions" +msgstr "Déan an stad tógála ar eisceachtaí" + +#: ../fdroidserver/index.py +msgid "Malformed repository mirrors." +msgstr "Scátháin stór míchumtha." + +#: ../fdroidserver/deploy.py +msgid "Malformed serverwebroot line:" +msgstr "Líne freastalaí míchumthawebroot:" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "Sroicheadh uasdoimhneacht athchúrsaithe sa chomhad ZIP: %s" + +#: ../fdroidserver/mirror.py +msgid "Mirror the full repo and archive, all file types." +msgstr "Scáthánaigh an repo iomlán agus cartlann, gach cineál comhaid." + +#: ../fdroidserver/gpgsign.py +msgid "Missing output directory" +msgstr "Comhadlann aschurtha ar iarraidh" + +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "Dearbhuithe Frith-Gnéithe a bhogadh chuig comhaid logánaithe:" + +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "Níl \"repo_pubkey\" ná \"keystorepass\" leagtha síos i config.yml" + +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "Gan APK don phacáiste: %s" + +#: ../fdroidserver/common.py +msgid "No Android SDK found!" +msgstr "Níor aimsíodh SDK Android!" + +#: ../fdroidserver/install.py +msgid "No attached devices found" +msgstr "Níor aimsíodh aon ghléas ceangailte" + +#: ../fdroidserver/index.py +msgid "No fingerprint in URL." +msgstr "Gan méarlorg in URL." + +#: ../fdroidserver/common.py +msgid "No git submodules available" +msgstr "Níl aon submodules git ar fáil" + +#: ../fdroidserver/import_subcommand.py +msgid "No gradle project could be found. Specify --subdir?" +msgstr "Ní raibh aon tionscadal grádaithe le fáil. Sonraigh --subdir?" + +#: ../fdroidserver/import_subcommand.py +msgid "No information found." +msgstr "Níor aimsíodh aon eolas." + +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "Níor aimsíodh clibeanna meaitseála" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "Níor aimsíodh aon leagan SDK íosta i {0}, ag baint úsáide as réamhshocrú (3)." + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is Free Software" +msgstr "Ní gá a shonrú go bhfuil an app Bogearraí Saor in Aisce" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is for Android" +msgstr "Ní gá a shonrú go bhfuil an aip le haghaidh Android" + +#: ../fdroidserver/deploy.py +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "Níl aon rogha socraithe! Cuir do config.yml in eagar chun ceann amháin díobh seo ar a laghad a shocrú:" + +#: ../fdroidserver/common.py +msgid "No packages specified" +msgstr "Níor sonraíodh aon phacáistí" + +#: ../fdroidserver/install.py +#, python-format +msgid "No signed APK available for %s" +msgstr "Níl APK sínithe ar fáil le haghaidh %s" + +#: ../fdroidserver/install.py +msgid "No signed output directory - nothing to do" +msgstr "Gan chomhadlann aschurtha sínithe - níl aon rud le déanamh" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No signing certificates found in {path}" +msgstr "Níor aimsíodh aon deimhnithe sínithe i {path}" + +#: ../fdroidserver/common.py +#, python-format +msgid "No such package: %s" +msgstr "Gan a leithéid de phacáiste: %s" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No such versionCode {versionCode} for app {appid}" +msgstr "Níl a leithéid de versionCode {versionCode} for app {appid}" + +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "Níor aimsíodh clibeanna ar bith" + +#: ../fdroidserver/publish.py ../fdroidserver/verify.py +msgid "No unsigned directory - nothing to do" +msgstr "Gan chomhadlann gan síniú - níl aon rud le déanamh" + +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "Níorbh fhéidir aon eolas faoin leagan a aimsiú." + +#: ../fdroidserver/common.py +msgid "Not a valid size definition: \"{}\"" +msgstr "Ní sainmhíniú bailí méide é: \"{}\"" + +#: ../fdroidserver/signindex.py +msgid "Nothing to do" +msgstr "Faic le déanamh" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Nothing to do for {appid}." +msgstr "Níl aon rud le déanamh le haghaidh {appid}." + +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "Anois leagtar iad seo i config.yml:" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "OBB file has newer versionCode({integer}) than any APK:" +msgstr "Tá leagan níos nuaíCode({integer}) ag comhad OBB ná aon APK:" + +#: ../fdroidserver/update.py +msgid "OBB filename must start with \"main.\" or \"patch.\":" +msgstr "Ní mór ainm comhaid OBB tosú le \"príomh.\" nó \"paiste.\":" + +#: ../fdroidserver/update.py +msgid "OBB's packagename does not match a supported APK:" +msgstr "Ní mheaitseálann ainm pacáiste OBB APK tacaithe:" + +#: ../fdroidserver/deploy.py +msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" +msgstr "Meaisín as líne, gan bacadh le giniúint scáthán git go dtí 'imscaradh fdroid'" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "Tá luach 'projectUrl' in easnamh ar cheann de na míreanna cumraíochta 'github_releases'. gan bacadh ..." + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgstr "Tá luach 'packageNames' in easnamh ar cheann de na míreanna cumraíochta 'github_releases'. gan bacadh ..." + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." +msgstr "Tá an luach 'comhartha' in easnamh ar cheann de na míreanna cumraíochta 'github_releases'. gan bacadh ..." + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Only PNG and JPEG are supported for graphics, found: {path}" +msgstr "Ní thacaítear ach le PNG agus JPEG le haghaidh grafaicí, le fáil: {path}" + +#: ../fdroidserver/checkupdates.py +msgid "Only print differences with the Play Store" +msgstr "Ná priontáil ach difríochtaí leis an Play Store" + +#: ../fdroidserver/checkupdates.py +msgid "Only process apps with auto-updates" +msgstr "Ná próiseáil ach feidhmchláir le nuashonruithe uathoibríocha" + +#: ../fdroidserver/lint.py +msgid "OpenCollective donation methods belong in the OpenCollective: field" +msgstr "Baineann modhanna síntiús OpenCollective sa OpenCollective: réimse" + +#: /usr/lib/python3.11/optparse.py +msgid "Options" +msgstr "Roghanna" + +#: ../fdroidserver/verify.py +msgid "Output JSON report to file named after APK." +msgstr "Aschuir tuarascáil JSON le comhad ainmnithe i ndiaidh APK." + +#: ../fdroidserver/scanner.py +msgid "Output JSON to stdout." +msgstr "Aschur JSON go dtí an gnáth-roinn." + +#: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py +#: ../fdroidserver/publish.py ../fdroidserver/signindex.py +#: ../fdroidserver/update.py +msgid "Outputting JSON" +msgstr "Aschur JSON" + +#: ../fdroidserver/import_subcommand.py +msgid "Overall license of the project." +msgstr "Ceadúnas foriomlán an tionscadail." + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" +msgstr "Leagan bán sáraitheachName in {apkfilename} ó mheiteashonraí: {version}" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "Package \"{appid}\" already exists" +msgstr "Tá pacáiste \"{appid}\" ann cheana" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Parsing manifest at '{path}'" +msgstr "Léiriú parsála ag '{path}'" + +#: ../fdroidserver/common.py +msgid "Password required with username" +msgstr "Pasfhocal de dhíth le hainm úsáideora" + +#: ../fdroidserver/import_subcommand.py +msgid "Path to main Android project subdirectory, if not in root." +msgstr "Conair chuig príomhchomhadlann tionscadail Android, más rud é nach bhfuil sé i bhfréamh." + +#: ../fdroidserver/init.py +msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" +msgstr "Conair chuig an SDK Android (uaireanta a leagtar i ANDROID_HOME)" + +#: ../fdroidserver/btlog.py +msgid "Path to the git repo to use as the log" +msgstr "Conair chuig an repo git le húsáid mar an logáil isteach" + +#: ../fdroidserver/init.py +msgid "Path to the keystore for the repo signing key" +msgstr "Conair chuig an siopa eochrach don eochair sínithe repo" + +#: ../fdroidserver/nightly.py +msgid "Print the secret variable to the terminal for easy copy/paste" +msgstr "Priontáil an athróg rúnda chuig an teirminéal le haghaidh cóip / greamaigh éasca" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "Fadhb le comhad ZIP: %s, earráid %s" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Problem with xml at '{path}'" +msgstr "Fadhb le xml ag '{path}'" + +#: ../fdroidserver/checkupdates.py +msgid "Process auto-updates" +msgstr "Próiseas uath-nuashonruithe" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#, python-brace-format +msgid "Processing {apkfilename}" +msgstr "Próiseáil {apkfilename}" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#, python-brace-format +msgid "Processing {appid}" +msgstr "Próiseáil {appid}" + +#: ../fdroidserver/update.py +msgid "Produce human-readable XML/JSON for index files" +msgstr "XML / JSON atá inléite ag an duine a tháirgeadh le haghaidh comhaid innéacs" + +#: ../fdroidserver/import_subcommand.py +msgid "Project URL to import from." +msgstr "URL an tionscadail le hiompórtáil uaidh." + +#: ../fdroidserver/lint.py +msgid "Punctuation should be avoided" +msgstr "Ba cheart poncaíocht a sheachaint" + +#: ../fdroidserver/btlog.py +msgid "Push the log to this git remote repository" +msgstr "Brúigh an logáil isteach sa stór cianda git seo" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Pushing binary transparency log to {url}" +msgstr "Ag brú loga trédhearcachta dénártha chuig {url}" + +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "Theip ar bhrú chuig freastalaí cianda!" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Pushing to {url}" +msgstr "Ag brú go {url}" + +#: ../fdroidserver/__main__.py +msgid "Quickly start a new repository" +msgstr "Tosaigh stór nua go tapa" + +#: ../fdroidserver/__main__.py +msgid "Read all the metadata files and exit" +msgstr "Léigh na comhaid mheiteashonraí go léir agus scoir" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading '{config_file}'" +msgstr "Ag léamh '{config_file}'" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "Pacáiste á léamhName/versionCode/versionName failed, APK invalid: '{apkfilename}'" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" +msgstr "Pacáiste á léamhName/versionCode/versionName failed,APK invalid: '{apkfilename}'" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Reading {apkfilename} from cache" +msgstr "{apkfilename} á léamh ón taisce" + +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "Athnuaigh agus cuir rialacha agus sínithe scanóirí taisce ón líonra" + +#: ../fdroidserver/common.py +msgid "Removing specified files" +msgstr "Comhaid shonraithe á mbaint" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "Ag baint {path}\"" + +#: ../fdroidserver/update.py +msgid "Rename APK files that do not match package.name_123.apk" +msgstr "Athainmnigh comhaid APK nach bhfuil comhoiriúnach package.name_123.apk" + +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "Ní dhéanann modh nuashonraithe RepoTrunk ciall ach amháin i stórtha git-svn" + +#: ../fdroidserver/build.py +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgstr "Athshocraigh agus cruthaigh freastalaí tógála branda nua, fiú más cosúil go bhfuil an ceann atá ann cheana ceart go leor." + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Resigning {apkfilename} with provided debug.keystore" +msgstr "Ag éirí as {apkfilename} le debug.keystore ar fáil" + +#: ../fdroidserver/update.py +msgid "Resize all the icons exceeding the max pixel size and exit" +msgstr "Athraigh méid na ndeilbhíní go léir a sháraíonn an t-uasmhéid picteilín agus scoir" + +#: ../fdroidserver/common.py +msgid "Restrict output to warnings and errors" +msgstr "Cuir srian le haschur le rabhaidh agus earráidí" + +#: ../fdroidserver/__main__.py +msgid "Rewrite all the metadata files" +msgstr "Athscríobh na comhaid mheiteashonraí go léir" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}'" +msgstr "Athscríobh '{appid}'" + +#: ../fdroidserver/checkupdates.py +msgid "Run on git repo that has uncommitted changes" +msgstr "Rith ar repo git go bhfuil athruithe uncommitted" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "Rith thar {cibase} chun -debug.apk a aimsiú. agus scipeáil repo_basedir {repo_basedir}" + +#: ../fdroidserver/lint.py +msgid "Run rewritemeta to fix formatting" +msgstr "Rith rewritemeta chun formáidiú a shocrú" + +#: ../fdroidserver/deploy.py +msgid "Running first pass with MD5 checking disabled" +msgstr "Ag rith an chéad phas le MD5 seiceáil faoi mhíchumas" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Running wget in {path}" +msgstr "Ag rith wget in {path}" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "SHA-256 of {url} does not match entry!" +msgstr "Ní mheaitseálann SHA-256 de {url} iontráil!" + +#: ../fdroidserver/build.py +msgid "Scan the resulting APK(s) for known non-free classes." +msgstr "Scan an APK (í) mar thoradh air sin le haghaidh ranganna neamh-saor in aisce ar a dtugtar." + +#: ../fdroidserver/__main__.py +msgid "Scan the source code of a package" +msgstr "Scan cód foinse pacáiste" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {apk}" +msgstr "Fuair scanóir fadhbanna {count} i {apk}" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:" +msgstr "D'aimsigh scanóir fadhbanna {count} i {appid}:" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:{versionCode}:" +msgstr "Fuair scanóir fadhbanna {count} in {appid}:{versionCode}:" + +#: ../fdroidserver/build.py +msgid "Scanner found {} problem" +msgid_plural "Scanner found {} problems" +msgstr[0] "Aimsíodh {} fadhb leis an scanóir" +msgstr[1] "Fuair an scanóir {} fadhbanna" +msgstr[2] "Fuair an scanóir {} fadhbanna" +msgstr[3] "Fuair an scanóir {} fadhbanna" +msgstr[4] "Fuair an scanóir {} fadhbanna" + +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "Scanadh APK le dexdump do ranganna neamh-saor in aisce ar a dtugtar." + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "Socraigh NDK {release} ({version}) suas" + +#: ../fdroidserver/common.py +msgid "Set clock to that time using:" +msgstr "Socraigh clog go dtí an t-am sin ag baint úsáide as:" + +#: ../fdroidserver/nightly.py +msgid "Set maximum releases in repo before older ones are archived" +msgstr "Socraigh na heisiúintí uasta in repo sula gcuirtear na cinn níos sine i gcartlann" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Set open file limit to {integer}" +msgstr "Socraigh teorainn oscailte comhaid go {integer}" + +#: ../fdroidserver/__main__.py +msgid "Set up an app build for a nightly build repo" +msgstr "Socraigh tógáil app le haghaidh repo tógála oíche" + +#: ../fdroidserver/build.py +msgid "Setting open file limit failed: " +msgstr "Níorbh fhéidir teorainn oscailte comhaid a shocrú: " + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Setting {0} sec timeout for this build" +msgstr "Am istigh soic {0} leagan síos don tógáil seo" + +#: ../fdroidserver/__main__.py +msgid "Sign and place packages in the repo" +msgstr "Sínigh agus cuir pacáistí sa repo" + +#: ../fdroidserver/__main__.py +msgid "Sign indexes created using update --nosign" +msgstr "Sínigh innéacsanna a cruthaíodh le nuashonrú --nosign" + +#: ../fdroidserver/build.py +msgid "Skip scanning the source code for binaries and other problems" +msgstr "Scipeáil scanadh an cód foinse do binaries agus fadhbanna eile" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping '{apkfilename}' with invalid signature!" +msgstr "Scipeáil '{apkfilename}' le síniú neamhbhailí!" + +#: ../fdroidserver/deploy.py ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "Scáthán Leathanaigh GitLab á scipeáil toisc go bhfuil an repo ró-mhór (>%.2fGB)!" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping index generation for {appid}" +msgstr "Gan bacadh le giniúint innéacs le haghaidh {appid}" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping {apkfilename} with invalid signature!" +msgstr "Scipeáil {apkfilename} le síniú neamhbhailí!" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: disabled" +msgstr "Scipeáil {appid}: disabled" + +#: ../fdroidserver/deploy.py +msgid "Specify a local folder to sync the repo to" +msgstr "Sonraigh fillteán logánta chun an t-athshealbhú a shioncronú" + +#: ../fdroidserver/deploy.py +msgid "Specify an identity file to provide to SSH for rsyncing" +msgstr "Sonraigh comhad aitheantais le soláthar do SSH le haghaidh rsyncing" + +#: ../fdroidserver/nightly.py +msgid "Specify which debug keystore file to use." +msgstr "Sonraigh an comhad siopa eochrach dífhabhtaithe atá le húsáid." + +#: ../fdroidserver/common.py +msgid "Spew out even more information than normal" +msgstr "Spew amach níos mó eolais ná mar is gnách" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Stripping mystery signature from {apkfilename}" +msgstr "Síniú rúndiamhrach á stialladh ó {apkfilename}" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Summary '%s' is just the app's name" +msgstr "Achoimre níl i '%s' ach ainm an fheidhmchláir" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Summary of length {length} is over the {limit} char limit" +msgstr "Tá achoimre ar fhad {length} os cionn na teorann char {limit}" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "System clock is older than date in {path}!" +msgstr "Tá clog an chórais níos sine ná an dáta i {path}!" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "Ní oibríonn mód nuashonraithe clibeanna ach amháin le haghaidh stórtha git, hg, bzr agus git-svn faoi láthair" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "Clibeanna cothrom le dáta modh a úsáidtear i git-svn, ach ní raibh an repo ar bun le clibeanna" + +#: ../fdroidserver/build.py +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgstr "Modh tástála - aschur a chur san eolaire tmp amháin, agus a thógáil i gcónaí, fiú má tá an t-aschur ann cheana féin." + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "The OBB version code must come after \"{name}.\":" +msgstr "Ní mór don chód leagan OBB teacht i ndiaidh \"{name}.\":" + +#: ../fdroidserver/btlog.py +msgid "The base URL for the repo to log (default: https://f-droid.org)" +msgstr "An URL bonn le haghaidh an repo a logáil (réamhshocrú: https://f-droid.org)" + +#: ../fdroidserver/mirror.py +msgid "The directory to write the mirror to" +msgstr "An chomhadlann chun an scáthán a scríobh chuig" + +#: ../fdroidserver/nightly.py +msgid "The file to be included in the repo (path or glob)" +msgstr "An comhad atá le cur san áireamh sa repo (cosán nó glob)" + +#: ../fdroidserver/index.py +msgid "The repository's fingerprint does not match." +msgstr "Ní mheaitseálann méarlorg an stóir." + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "The root dir for local_copy_dir \"{path}\" does not exist!" +msgstr "Níl an dir fréimhe do local_copy_dir \"{path}\" ann!" + +#: ../fdroidserver/publish.py +msgid "There is a keyalias collision - publishing halted" +msgstr "Tá imbhualadh keyalias ann - cuireadh stop leis an bhfoilsitheoireacht" + +#: ../fdroidserver/common.py +msgid "These are the apps that have been archived from the main repo." +msgstr "Is iad seo na feidhmchláir atá curtha i gcartlann ón bpríomh-repo." + +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "Níor chóir an t-ordú seo a úsáid riamh chun scáthán a dhéanamh ar f-droid.org! Éilíonn cóip iomlán níos mó ná 600GB." + +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "Is stór feidhmchlár é seo atá le húsáid le F-Droid. Tá iarratais sa stór ceachtar binaries oifigiúla tógtha ag na forbróirí iarratas bunaidh, nó tá binaries tógtha ó fhoinse ag an admin f-droid.org ag baint úsáide as na huirlisí ar https://gitlab.com/fdroid." + +#: ../fdroidserver/import_subcommand.py +#, python-format +msgid "This repo already has local metadata: %s" +msgstr "Tá meiteashonraí logánta ag an athiarratas seo cheana: %s" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" +"Chun an socrú a chríochnú, cuir do APKs le \"%s\"\n" +"Ansin rith \"Nuashonrú FDROID -C; nuashonrú fdroid\". B'fhéidir gur mhaith leat eagarthóireacht a dhéanamh freisin\n" +"\"config.yml\" a shocrú ar an URL, ainm repo, agus níos mó. Chomh maith leis sin, ba cheart duit\n" +"eochair shínithe (d'fhéadfadh ceann sealadach a bheith ginte go huathoibríoch).\n" +"\n" +"Tuilleadh eolais: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"agus https://f-droid.org/docs/Signing_Process" + +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Chun awsbucket a úsáid, ní mór awssecretkey agus awsaccesskeyid a shocrú i config.yml freisin!" + +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "Chun rclone a úsáid, ní mór rclone_config agus awsbucket a shocrú i config.yml!" + +#: ../fdroidserver/lint.py +msgid "URL must start with https:// or http://" +msgstr "Ní mór URL tosú le https:// nó http://" + +#: ../fdroidserver/lint.py +msgid "URL shorteners should not be used" +msgstr "Níor chóir giorraithe URL a úsáid" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "URL {url} in Description: {error}" +msgstr "URL {url} in Description: {error}" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "Clib cheadúnais gan choinne \"{}\"! Ná húsáid ach clibeanna faofa FSF nó OSI ó https://spdx.org/license-list" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgstr "Clib cheadúnais gan choinne \"{}\"! Ná húsáid ach clibeanna ceadúnais atá cumraithe i do chomhad cumraíochta" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "Sprioc symlink gan choinne: {link} -> {target}" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "Iontráil anaithnid {key} in {configname}" + +#: ../fdroidserver/__main__.py +msgid "Unknown exception found!" +msgstr "Aimsíodh eisceacht anaithnid!" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Unknown file '{filename}' in build '{versionName}'" +msgstr "Comhad anaithnid '{filename}' in build '{versionName}'" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Unknown metadata format: %s" +msgstr "Formáid anaithnid mheiteashonraí: %s" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path} (use: *.yml)" +msgstr "Formáid mheiteashonraí anaithnid: {path} (úsáid: *.yml)" + +#: ../fdroidserver/common.py +msgid "Unknown version of aapt, might cause problems: " +msgstr "Leagan anaithnid de aapt, d'fhéadfadh fadhbanna a chruthú: " + +#: ../fdroidserver/lint.py +msgid "Unnecessary leading space" +msgstr "Spás tosaigh gan ghá" + +#: ../fdroidserver/lint.py +msgid "Unnecessary trailing space" +msgstr "Spás rianaithe gan ghá" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised app field '{fieldname}' in '{path}'" +msgstr "Réimse app neamhaitheanta '{fieldname}' in '{path}'" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised build flag '{build_flag}' in '{path}'" +msgstr "Bratach tógála neamhaitheanta '{build_flag}' in '{path}'" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported file type \"{extension}\" for repo graphic" +msgstr "Cineál comhaid gan tacaíocht \"{extension}\" le haghaidh grafach repo" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported graphics file found: {path}" +msgstr "Aimsíodh comhad grafaicí gan tacaíocht: {path}" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused extlib at %s" +msgstr "Extlib neamhúsáidte ag %s" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused file at %s" +msgstr "Comhad neamhúsáidte ag %s" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scandelete path: %s" +msgstr "Conair scanta neamhúsáidte: %s" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scanignore path: %s" +msgstr "Conair scanignore neamhúsáidte: %s" + +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "Dízipeáil go %s" + +#: ../fdroidserver/__main__.py +msgid "Update repo information for new packages" +msgstr "Nuashonraigh faisnéis maidir le pacáistí nua" + +#: ../fdroidserver/__main__.py +msgid "Update the binary transparency log for a URL" +msgstr "Nuashonraigh an logchomhad trédhearcachta dénártha le haghaidh URL" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "UpdateCheckData has invalid URL: {url}" +msgstr "Tá URL neamhbhailí ag UpdateCheckData: {url}" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" +msgstr "Ní mór do UpdateCheckData an cód leagain a mheaitseáil mar slánuimhir (\\d nó [0-9]): {codeex}" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must use HTTPS URL: {url}" +msgstr "Ní mór do UpdateCheckData URL HTTPS a úsáid: {url}" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData not a valid URL: {url}" +msgstr "UpdateCheckData ní URL bailí é: {url}" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." +msgstr "Tá UpdateCheckMode socraithe ach tá an chuma air nach bhfuil checkupdates rite fós." + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "UpdateCheckMode socraithe ach tá an chuma air nár ritheadh nuashonruithe go fóill" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID, it can be removed" +msgstr "UpdateCheckName is set to the known application ID, is féidir é a bhaint" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to androidobservatory.org" +msgstr "{apkfilename} á uaslódáil chuig androidobservatory.org" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to virustotal" +msgstr "{apkfilename} á uaslódáil chuig virustotal" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "Usage" +msgstr "Úsáid" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "Usage: %s\n" +msgstr "Úsáid: %s\n" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "Úsáid / HEAD in ionad / máistir nó / príomh go pointe ag comhad sa bhrainse réamhshocraithe" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master to point at a file in the default branch" +msgstr "Úsáid / HEAD in ionad / máistir go pointe ag comhad sa bhrainse réamhshocraithe" + +#: ../fdroidserver/update.py +msgid "Use `fdroid update -c` to create it." +msgstr "Bain úsáid as 'nuashonrú fdroid -c' chun é a chruthú." + +#: ../fdroidserver/build.py +msgid "Use build server" +msgstr "Úsáid freastalaí tógála" + +#: ../fdroidserver/update.py +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "Dáta úsáide ó APK in ionad an ama reatha le haghaidh APKs nua-bhreise" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for configuring s3cmd." +msgstr "Ag baint úsáide as \"{path}\" chun s3cmd a chumrú." + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "Ag baint úsáide as \"{path}\" chun sioncronú le cianstóráil." + +#: ../fdroidserver/common.py +msgid "Using APK Signature v2" +msgstr "Ag baint úsáide as Síniú APK v2" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v3" +msgstr "Ag baint úsáide as Síniú APK v3" + +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "Ag baint úsáide as Síniú JAR" + +#: ../fdroidserver/common.py +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "Ag baint úsáide as jarsigner Java, ní mholtar chun APKs a fhíorú! Úsáid apksigner" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Using androguard from \"{path}\"" +msgstr "Ag baint úsáide as androguard ó \"{path}\"" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "Ag baint úsáide as foclóir bán in ionad ábhar {path}!" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Using existing keystore \"{path}\"" +msgstr "Ag baint úsáide as keystore atá ann cheana \"{path}\"" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "Ag baint úsáide as rclone chun sioncronú le: {url}" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using s3cmd to sync with: {url}" +msgstr "Ag baint úsáide as s3cmd chun sioncronú le: {url}" + +#: ../fdroidserver/__main__.py +msgid "Valid commands are:" +msgstr "Is iad na horduithe bailí ná:" + +#: ../fdroidserver/verify.py +msgid "Verify against locally cached copy rather than redownloading." +msgstr "Fíoraigh i gcoinne cóip atá i dtaisce go háitiúil seachas athluchtú." + +#: ../fdroidserver/__main__.py +msgid "Verify the integrity of downloaded packages" +msgstr "Fíoraigh sláine na bpacáistí íoslódáilte" + +#: ../fdroidserver/index.py +msgid "Verifying index signature:" +msgstr "Síniú an innéacs á fhíorú:" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "Ní féidir le heochair API VirusTotal comhaid níos mó ná 32MB a uaslódáil, úsáid {url} chun {path} a uaslódáil." + +#: ../fdroidserver/__main__.py +msgid "Warn about possible metadata errors" +msgstr "Tabhair rabhadh faoi earráidí meiteashonraí a d'fhéadfadh a bheith ann" + +#: ../fdroidserver/update.py +msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgstr "Nuair atá sé cumraithe le haghaidh innéacsanna sínithe, ná cruthaigh ach innéacsanna gan síniú ag an gcéim seo" + +#: ../fdroidserver/lint.py +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgstr "Nuair a linting an yamllint stór ar fad faoi mhíchumas de réir réamhshocraithe. Cuireann an rogha seo iallach ar yamllint beag beann." + +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "Nuair a theipeann ar shíniú nó ar fhíorú, scoir le cód earráide." + +#: ../fdroidserver/init.py +msgid "X.509 'Distinguished Name' used when generating keys" +msgstr "X.509 'Ainm Oirirce' a úsáidtear agus eochracha á nginiúint" + +#: ../fdroidserver/common.py +msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" +msgstr "Is féidir leat ANDROID_HOME a úsáid chun an cosán a shocrú chuig do SDK, i.e.:" + +#: ../fdroidserver/scanner.py +msgid "ZIP file archive" +msgstr "Cartlann comhad ZIP" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "adding IdentityFile to {path}" +msgstr "IdentityFile á chur le {path}" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "adding to {name}: {path}" +msgstr "ag cur le {name}: {path}" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "Rogha dhébhríoch: D'fhéadfadh %(option)s %(matches)s a mheaitseáil" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "ambiguous option: %s (%s?)" +msgstr "Rogha dhébhríoch: %s (%s?)" + +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "apksigner gan aimsiú! Ní féidir APKs nua-aimseartha a shíniú nó a fhíorú" + +#: ../fdroidserver/common.py +msgid "apksigner not found, it's required for signing!" +msgstr "apksigner gan aimsiú, tá sé ag teastáil le síniú!" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py +#: ../fdroidserver/rewritemeta.py +msgid "application ID of file to operate on" +msgstr "aitheantas feidhmchláir an chomhaid le hoibriú air" + +#: ../fdroidserver/build.py ../fdroidserver/install.py +#: ../fdroidserver/publish.py ../fdroidserver/scanner.py +#: ../fdroidserver/verify.py +msgid "application ID with optional versionCode in the form APPID[:VERCODE]" +msgstr "ID iarratais le leagan roghnachCode san fhoirm APPID[:VERCODE]" + +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "Caithfidh archive_url deireadh a chur le /cartlann" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "argument \"-\" with mode %r" +msgstr "argóint \"-\" le mód %r" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "argument %(argument_name)s: %(message)s" +msgstr "argóint %(argument_name)s: %(message)s" + +#: ../fdroidserver/nightly.py +msgid "attempting bare SSH connection to test deploy key:" +msgstr "ag iarraidh nasc SSH lom chun eochair imscaradh tástála:" + +#: ../fdroidserver/common.py +msgid "can not parse scrlib spec (not a string): '{}'" +msgstr "ní féidir spec scrlib a pharsáil (ní teaghrán): '{}'" + +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "ní féidir '%(filename)s' a oscailt: %(error)s" + +#: ../fdroidserver/scanner.py +msgid "can't open non-https url: '{};" +msgstr "ní féidir url neamh-https a oscailt: '{};" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "cannot find required srclibs: \"{path}\"" +msgstr "ní féidir srclibs riachtanacha a aimsiú: \"{path}\"" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "cannot have multiple subparser arguments" +msgstr "ní féidir argóintí éagsúla subparser a bheith acu" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "cannot merge actions - two groups are named %r" +msgstr "ní féidir gníomhartha a chumasc - ainmnítear %r ar dhá ghrúpa" + +#: ../fdroidserver/nightly.py +msgid "cannot publish update, did you set the deploy key?" +msgstr "Ní féidir nuashonrú a fhoilsiú, ar shocraigh tú an eochair imlonnaithe?" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "cloning {url}" +msgstr "clónáil {url}" + +#: ../fdroidserver/__main__.py +msgid "commands from plugin modules:" +msgstr "orduithe ó mhodúil bhreiseáin:" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "complex" +msgstr "casta" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting option string: %s" +msgid_plural "conflicting option strings: %s" +msgstr[0] "teaghrán rogha contrártha: %s" +msgstr[1] "teaghráin roghanna contrártha: %s" +msgstr[2] "teaghráin roghanna contrártha: %s" +msgstr[3] "teaghráin roghanna contrártha: %s" +msgstr[4] "teaghráin roghanna contrártha: %s" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting subparser alias: %s" +msgstr "ailias fo-pharsála contrártha: %s" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting subparser: %s" +msgstr "fopharsálaí contrártha: %s" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "could not parse '{path}'" +msgstr "níorbh fhéidir '{path}' a pharsáil" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "Níorbh fhéidir srclib spec a pharsáil (níor sonraíodh ainm ar bith): '{}'" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no ref specified): '{}'" +msgstr "Níorbh fhéidir srclib spec a pharsáil (níor sonraíodh tag): '{}'" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (too many '@' signs): '{}'" +msgstr "níorbh fhéidir spec srclib a pharsáil (an iomarca comharthaí '@'): '{}'" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "created {path}" +msgstr "cruthaíodh {path}" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "Tá an leagan reatha níos nuaí: sean-vercode={old}, vercode nua={new}" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "deleting: repo/{apkfilename}" +msgstr "scriosadh: repo/{apkfilename}" + +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "comhad spleáchais gan ghlas" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed process log {path} to {dest}" +msgstr "loga próiseas imlonnaithe {path} go {dest}" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "dest= is required for options like %r" +msgstr "dest= ag teastáil le haghaidh roghanna cosúil le %r" + +#: ../fdroidserver/scanner.py +msgid "downloading '{}'" +msgstr "'{}' á íosluchtú" + +#: ../fdroidserver/scanner.py +msgid "downloading scanner signatures from '{}' failed" +msgstr "Theip ar shínithe scanóirí a íosluchtú ó '{}'" + +#: ../fdroidserver/scanner.py +msgid "executable binary, possibly code" +msgstr "dénártha inrite, cód b'fhéidir" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "expected %s argument" +msgid_plural "expected %s arguments" +msgstr[0] "bhíothas ag súil le argóint %s" +msgstr[1] "bhíothas ag súil le %s argóint" +msgstr[2] "bhíothas ag súil le %s argóint" +msgstr[3] "bhíothas ag súil le %s argóint" +msgstr[4] "bhíothas ag súil le %s argóint" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "expected at least one argument" +msgstr "bhíothas ag súil le hargóint amháin ar a laghad" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "expected at most one argument" +msgstr "bhíothas ag súil le hargóint amháin ar a mhéad" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "expected one argument" +msgstr "bhíothas ag súil le hargóint amháin" + +#: ../fdroidserver/__main__.py +msgid "fdroid [] [-h|--help|--version|]" +msgstr "fdroid [] [-h|--help|--leagan|]" + +#: ../fdroidserver/scanner.py +msgid "fetch the latest version of signatures from the web" +msgstr "Faigh an leagan is déanaí de shínithe ón ngréasán" + +#: /usr/lib/python3.11/optparse.py +msgid "floating-point" +msgstr "snámhphointe" + +#: ../fdroidserver/metadata.py +msgid "force metadata errors (default) to be warnings, or to be ignored." +msgstr "bhfeidhm earráidí meiteashonraí (réamhshocrú) a bheith ina rabhaidh, nó le neamhaird a dhéanamh orthu." + +#: ../fdroidserver/common.py +msgid "git svn clone failed" +msgstr "theip ar chlón git svn" + +#: ../fdroidserver/scanner.py +msgid "gzip file archive" +msgstr "Cartlann Comhad Gzip" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "ignored explicit argument %r" +msgstr "neamhaird ar argóint fhollasach %r" + +#: ../fdroidserver/index.py +msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" +msgstr "Ní mór síniú a bheith ag Innéacs-V1, bain úsáid as 'FDROID Signindex' chun é a chruthú!" + +#: ../fdroidserver/index.py +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "Ní mór síniú a bheith ag Innéacs-V2, bain úsáid as 'FDROID Signindex' chun é a chruthú!" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "integer" +msgstr "slánuimhir" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid %(type)s value: %(value)r" +msgstr "luach neamhbhailí %(type)s: %(value)r" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid choice: %(value)r (choose from %(choices)s)" +msgstr "rogha neamhbhailí: %(value)r (roghnaigh ó %(choices)s)" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid conflict_resolution value: %r" +msgstr "Luach conflict_resolution neamhbhailí:%r" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgstr "teaghrán neamhbhailí roghanna %(option)r: ní mór tosú le carachtar %(prefix_chars)r" + +#: ../fdroidserver/common.py +msgid "ipfs_cid not found, skipping CIDv1 generation" +msgstr "ipfs_cid gan aimsiú, gan bacadh le giniúint CIDv1" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "Tá an t-oideas tógála is déanaí níos nuaí: sean-vercode={old}, vercode nua={new}" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "Ní chríochnaíonn local_copy_dir le \"fdroid\", b'fhéidir gur chiallaigh tú: \"{path}\"" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be an absolute path!" +msgstr "Caithfidh local_copy_dir a bheith ina cosán iomlán!" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be directory, not a file!" +msgstr "Ní mór local_copy_dir a bheith eolaire, ní comhad!" + +#: ../fdroidserver/index.py +#, python-format +msgid "mirror '%s' does not end with 'fdroid'!" +msgstr "ní chríochnaíonn scáthán '%s' le 'fdroid'!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "scátháin leagtha faoi dhó, i config.yml agus {path}!" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "mutually exclusive arguments must be optional" +msgstr "ní mór argóintí comheisiacha a bheith roghnach" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "next {name} cache update due in {time}" +msgstr "an chéad nuashonrú taisce {name} eile dlite i {time}" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "no \"icon\" in {appid}" +msgstr "níl \"icon\" in {appid}" + +#: ../fdroidserver/signatures.py +msgid "no APK supplied" +msgstr "níor soláthraíodh aon APK" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "no such option: %s" +msgstr "Níl a leithéid de rogha ann: %s" + +#: ../fdroidserver/__main__.py +msgid "no version info found!" +msgstr "Níor aimsíodh aon eolas leagain!" + +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "Níor aimsíodh aon eolas leagain" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "not allowed with argument %s" +msgstr "ní cheadaítear le hargóint %s" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "one of the arguments %s is required" +msgstr "tá ceann de na hargóintí %s ag teastáil" + +#: ../fdroidserver/common.py ../fdroidserver/index.py +msgid "only accepts strings, lists, and tuples" +msgstr "ní ghlacann ach teaghráin, liostaí, agus tuples" + +#: ../fdroidserver/install.py +#, python-format +msgid "option %s: If you really want to install all the signed apps, use --all" +msgstr "rogha %s: Más mian leat na feidhmchláir shínithe go léir a shuiteáil, úsáid --all" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "option %s: invalid %s value: %r" +msgstr "Rogha %s: luach neamhbhailí %s:%r" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "option %s: invalid choice: %r (choose from %s)" +msgstr "rogha %s: rogha neamhbhailí:%r (roghnaigh ó %s)" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option -%s not recognized" +msgstr "rogha -%s gan aithint" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option -%s requires argument" +msgstr "rogha -%s éilíonn argóint" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s must not have an argument" +msgstr "rogha --%s ní mór argóint a bheith aige" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s not a unique prefix" +msgstr "rogha --%s ní réimír uathúil é" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s not recognized" +msgstr "rogha --%s gan aithint" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s requires argument" +msgstr "rogha --%s éilíonn argóint" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +msgid "optional arguments" +msgstr "argóintí roghnacha" + +#: /usr/lib/python3.11/argparse.py +msgid "options" +msgstr "roghanna" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "overwriting existing {path}" +msgstr "overwriting atá ann cheana {path}" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "positional arguments" +msgstr "argóintí suímh" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "process log deploy {path} to {dest} failed!" +msgstr "Theip ar logchomhad an phróisis {path} go {dest}!" + +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "tagairt dénártha síniú ar iarraidh" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgstr "diúltú íoslódáil trí nasc HTTP neamhchinnte (úsáid HTTPS nó sonraigh --no-https-check): {apkfilename}" + +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "repo_icon níl \"repo/icons/%s\" ann, rud a ghineann sealbhóir áite." + +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "Caithfidh repo_url deireadh a chur le / repo" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "rsync ar iarraidh nó briste: {error}" + +#: ../fdroidserver/metadata.py +msgid "ruamel.yaml not installed, can not write metadata." +msgstr "ruamel.yaml nach bhfuil suiteáilte, ní féidir meiteashonraí a scríobh." + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd sync indexes {path} to {url} and delete" +msgstr "innéacsanna sioncronaithe s3cmd {path} go {url} agus scrios" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "sioncrónaíonn s3cmd innéacsanna ó {path} go {url} agus scriosann sé bainte" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "scanner cache is malformed! You can clear it with: '{clear}'" +msgstr "tá taisce scanóir míchumtha! Is féidir leat é a ghlanadh le: '{clear}'" + +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "serverwebroot: ní chríochnaíonn cosán le \"fdroid\", b'fhéidir gur chiallaigh tú ceann acu seo:" + +#: ../fdroidserver/scanner.py +msgid "shared library" +msgstr "leabharlann chomhroinnte" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "show program's version number and exit" +msgstr "Taispeáin uimhir leagain agus scoir an ríomhchláir" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py +#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +msgid "show this help message and exit" +msgstr "Taispeáin an teachtaireacht chabhrach seo agus scoir" + +#: ../fdroidserver/signatures.py +msgid "signed APK, either a file-path or HTTPS URL." +msgstr "APK sínithe, cosán comhaid nó URL HTTPS." + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: log content is empty" +msgstr "Ná bac le logaí tógála iomlána a úsáid: tá an t-ábhar logála folamh" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: not enabled in config" +msgstr "Ná bac le logaí iomlána tógála a úsáid: níl sé cumasaithe sa chumraíocht" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "skipping source tarball: {path}" +msgstr "tarball foinse scipeála: {path}" + +#: ../fdroidserver/lint.py +msgid "srclibs missing name and/or @" +msgstr "srclibs ainm ar iarraidh agus / nó @" + +#: ../fdroidserver/scanner.py +msgid "static library" +msgstr "Leabharlann statach" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "tá dénártha tagartha soláthraithe ceadaithe signer {signer}" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "the following arguments are required: %s" +msgstr "Tá na hargóintí seo a leanas ag teastáil: %s" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unexpected option string: %s" +msgstr "teaghrán rogha gan choinne: %s" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +msgstr "parsálaí anaithnid %(parser_name)r (roghanna: %(choices)s)" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unrecognized arguments: %s" +msgstr "argóintí neamhaitheanta: %s" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "unsafe permissions on '{config_file}' (should be 0600)!" +msgstr "ceadanna neamhshábháilte ar '{config_file}' (ba chóir go mbeadh 0600)!" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid +#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +msgid "usage: " +msgstr "úsáid: " + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "using Apache libcloud to sync with {url}" +msgstr "ag baint úsáide as Apache libcloud chun sioncronú le {url}" + +#: ../fdroidserver/deploy.py +msgid "virustotal.com is rate limiting, waiting to retry..." +msgstr "Tá virustotal.com ag teorannú ráta, ag fanacht le triail a bhaint as ..." + +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "{0} app, {1} key aliases" +msgid_plural "{0} apps, {1} key aliases" +msgstr[0] "{0} aip, {1} ailiasanna eochrach" +msgstr[1] "{0} aippeanna, {1} ailiasanna eochrach" +msgstr[2] "{0} aippeanna, {1} ailiasanna eochrach" +msgstr[3] "{0} aippeanna, {1} ailiasanna eochrach" +msgstr[4] "{0} aippeanna, {1} ailiasanna eochrach" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} ({appid}) has no metadata!" +msgstr "{apkfilename} ({appid}) níl aon mheiteashonraí aige!" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" +msgstr "{apkfilename} Tá comhaid {name} iolracha, tá sé cosúil le leas a bhaint as Master Key!" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " +msgstr "Tá drochdháta ag AndroidManifest.xml {apkfilename}: " + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using application ID instead." +msgstr "Níl ainm ar {appid}! Ag baint úsáide as ID iarratais ina ionad." + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android application ID!" +msgstr "Ní ID feidhmchlár Android bailí é {appid} ó {path}!" + +#: ../fdroidserver/metadata.py ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Java Package Name!" +msgstr "Ní Ainm Pacáiste Java bailí é {appid} ó {path}!" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "Tá APKs agus comhaid araon ag {appid}: {files}" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{appid} is missing {name}" +msgstr "Tá {appid} ar iarraidh {name}" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: Unknown extlib {path} in build '{versionName}'" +msgstr "{appid}: Extlib {path} anaithnid i dtógáil '{versionName}'" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "{appid}: no builds specified, running on current source state" +msgstr "{appid}: níl aon tógáil sonraithe, ag rith ar staid na foinse reatha" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" +msgstr "{appid}: Caithfidh {field} a bheith ina '{type}', ach is '{fieldtype}' é!'" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" +msgstr "{appid}: Caithfidh {field} a bheith ina '{type}', ach is '{fieldtype}' é!" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be an integer, found: {value}" +msgstr "Ní mór {build_flag} a bheith ina slánuimhir, le fáil: {value}" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "Ní mór {build_flag} a bheith liosta nó teaghrán, le fáil: {value}" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{file} is blank or corrupt!" +msgstr "Tá {file} bán nó truaillithe!" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "{name} Níl \"{section}/icons/{path}\" ann! Seiceáil \"config.yml\"." + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "Tá {oldfile} imithe i léig, úsáid {newfile}" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "{path} already exists, ignoring import results!" +msgstr "Tá {path} ann cheana féin, gan aird ar thorthaí iompórtála!" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "{path} does not exist! Create it by running:" +msgstr "Níl {path} ann! Cruthaigh é trí rith:" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" +msgstr "{path} Tá síniú comhad dona \"{pattern}\", is féidir Janus leas a bhaint as!" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "{path} curtha faoi bhratach ag virustotal {count} times:" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "Níl {path} \"eochair: luach\" dict, ach {datatype}!" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "Ní comhad cumraíochta caighdeánach é {path}!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "Níl {path} liosta, ach {datatype}!" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "Níl {path} {expected_type}, ach {datatype}!" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} is zero size!" +msgstr "Is é {path} méid nialasach!" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} more than 200MB, manually upload: {url}" +msgstr "{path} níos mó ná 200MB, uaslódáil de láimh: {url}" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "{path}: Ní cód tíre bailí ISO_3166-1 alfa-2 é \"{code}\"!" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "{path}: {error}" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{url} does not end with \"fdroid\", check the URL path!" +msgstr "Ní chríochnaíonn {url} le \"fdroid\", seiceáil an cosán URL!" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "{url} does not start with \"http\"!" +msgstr "Ní thosaíonn {url} le \"http\"!" + +#: ../fdroidserver/build.py +msgid "{} build failed" +msgid_plural "{} builds failed" +msgstr[0] "Theip ar {} tógáil" +msgstr[1] "Theip ar {} tógálacha" +msgstr[2] "Theip ar {} tógálacha" +msgstr[3] "Theip ar {} tógálacha" +msgstr[4] "Theip ar {} tógálacha" + +#: ../fdroidserver/build.py +msgid "{} build succeeded" +msgid_plural "{} builds succeeded" +msgstr[0] "D'éirigh le {} tógáil" +msgstr[1] "D'éirigh le {} tógálacha" +msgstr[2] "D'éirigh le {} tógálacha" +msgstr[3] "D'éirigh le {} tógálacha" +msgstr[4] "D'éirigh le {} tógálacha" From 0babd55762ff4e20d16b6b34d7943eef63b1f871 Mon Sep 17 00:00:00 2001 From: ssantos Date: Mon, 16 Sep 2024 15:09:28 +0200 Subject: [PATCH 1721/2116] Translated using Weblate: German (de) by ssantos Currently translated at 99.6% (590 of 592 strings) Co-authored-by: ssantos Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index d60bd235..618ae3b7 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -18,7 +18,7 @@ # VfBFan , 2021, 2023. # Roman Leo , 2021. # Follpvosten , 2021. -# ssantos , 2022, 2023. +# ssantos , 2022, 2023, 2024. # "C. Rüdinger" , 2023. # VfBFan , 2024. # Maxi , 2024. @@ -27,8 +27,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-12 20:48+0000\n" -"Last-Translator: VfBFan \n" +"PO-Revision-Date: 2024-09-13 23:35+0000\n" +"Last-Translator: ssantos \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -702,7 +702,7 @@ msgstr "FEHLER: {key} in {path} ist nicht \"archive\" oder \"repo\"!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" -msgstr "" +msgstr "ERROR: {key}:{subkey} in {path} ist keiner der erlaubten Schlüssel: {allowed_keys}!" #: ../fdroidserver/__main__.py #, python-brace-format @@ -725,7 +725,7 @@ msgstr "Umgebungsvariable {var} von {configname} ist nicht gesetzt!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "" +msgstr "Fehler bei der Bereitstellung von 'github_releases', {} nicht vorhanden. (Sie müssen zuerst `fdroid update` ausführen.)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -1316,15 +1316,15 @@ msgstr "Maschine offline, überspringe git-Spiegelgeneration bis `fdroid deploy` #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "" +msgstr "Einem der Konfigurationselemente von 'github_releases' fehlt der Wert 'projectUrl'. Überspringe..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." -msgstr "" +msgstr "Einem der Konfigurationselemente von 'github_releases' fehlt der Wert 'packageNames'. Überspringe..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." -msgstr "" +msgstr "Einem der Konfigurationselemente von 'github_releases' fehlt der Wert 'token'. Überspringe..." #: ../fdroidserver/update.py #, python-brace-format @@ -1982,9 +1982,9 @@ msgid "Using \"{path}\" for configuring s3cmd." msgstr "Verwende {path} zur Konfiguration von s3cmd." #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using \"{path}\" for syncing with remote storage." -msgstr "Verwende {path} zur Konfiguration von s3cmd." +msgstr "Verwende \"{path}\" zur Synchronisation mit Remote-Speicher." #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -2242,7 +2242,7 @@ msgstr "Lösche: repo/{apkfilename}" #: ../fdroidserver/scanner.py msgid "dependency file without lock" -msgstr "" +msgstr "Abhängigkeitsdatei ohne Sperre" #: ../fdroidserver/common.py #, python-brace-format From 11a7c8d1ce5d9fbaa4a715a9dbe5b30f7f545b94 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Mon, 16 Sep 2024 15:09:29 +0200 Subject: [PATCH 1722/2116] Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk Currently translated at 100.0% (592 of 592 strings) Co-authored-by: Ihor Hordiichuk Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index dbf3e659..0aa74616 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -16,8 +16,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-13 09:52+0000\n" -"Last-Translator: Nazar \n" +"PO-Revision-Date: 2024-09-13 23:35+0000\n" +"Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" @@ -1782,7 +1782,7 @@ msgstr "URL-адреса має починатися з https:// або http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" -msgstr "Скорочувачі URL-адрес не варто використовувати" +msgstr "Вкорочувачі URL-адрес не варто використовувати" #: ../fdroidserver/lint.py #, python-brace-format @@ -2568,7 +2568,7 @@ msgstr "s3cmd синхронізувати індекси з {path} до {url} #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "s3cmd синхронізує індекси з {path} до {url} і видаляє видалені" +msgstr "s3cmd синхронізує індекси з {path} до {url} і видаляє вилучені" #: ../fdroidserver/scanner.py #, python-brace-format @@ -2599,11 +2599,11 @@ msgstr "показати довідку та вийти" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." -msgstr "підписаний APK файл, шлях до файлу або URL-адреса HTTPS)." +msgstr "підписаний APK файл, шлях до файлу або URL-адреса HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "пропустити розгортання усіх журналів збірки: журнал порожній" +msgstr "пропустити розгортання всіх журналів збірки: журнал порожній" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" From e2ad7396284a3e3e148c61990379e1f527fc1709 Mon Sep 17 00:00:00 2001 From: Fjuro Date: Mon, 16 Sep 2024 15:09:31 +0200 Subject: [PATCH 1723/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 100.0% (592 of 592 strings) Co-authored-by: Fjuro Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ Translation: F-Droid/F-Droid Server --- locale/cs/LC_MESSAGES/fdroidserver.po | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 48d57e29..15e7e2de 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -13,8 +13,8 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-13 09:52+0000\n" -"Last-Translator: Jakub Boukal \n" +"PO-Revision-Date: 2024-09-14 23:47+0000\n" +"Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" @@ -1528,7 +1528,7 @@ msgstr "Spustit v repozitáři git s nezveřejněnými změnami" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" -msgstr "" +msgstr "Spustit přes {cibase} pro nalezení -debug.apk. a přeskočit repo_basedir {repo_basedir}" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1770,9 +1770,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "Chcete-li používat awsbucket, musí být v souboru config.yml nastaven také awssecretkey a awsaccesskeyid!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" -msgstr "Chcete-li používat awsbucket, musí být v souboru config.yml nastaven také awssecretkey a awsaccesskeyid!" +msgstr "Chcete-li používat rclone, musí být v souboru config.yml nastaven rclone_config a awsbucket!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1972,9 +1971,9 @@ msgid "Using \"{path}\" for configuring s3cmd." msgstr "Používám „{path}“ pro konfiguraci s3cmd." #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using \"{path}\" for syncing with remote storage." -msgstr "Používám „{path}“ pro konfiguraci s3cmd." +msgstr "Používám „{path}“ pro synchronizaci se vzdáleným úložištěm." #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -2008,9 +2007,9 @@ msgid "Using existing keystore \"{path}\"" msgstr "Používám existující keystore „{path}“" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using rclone to sync with: {url}" -msgstr "Používám s3cmd pro synchronizaci s: {url}" +msgstr "Používám rclone pro synchronizaci s: {url}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2564,9 +2563,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sync indexes {path} do {url} a odstranit" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "s3cmd sync indexes {path} do {url} a odstranit" +msgstr "s3cmd synchronizuje indexy z {path} do {url} a odstraní smazané" #: ../fdroidserver/scanner.py #, python-brace-format From 97eab1ada9913aca875ea30368a2207693c91266 Mon Sep 17 00:00:00 2001 From: Wang Date: Mon, 16 Sep 2024 15:09:32 +0200 Subject: [PATCH 1724/2116] Translated using Weblate: Chinese (Simplified Han script) (zh_Hans) by Wang Currently translated at 97.9% (580 of 592 strings) Co-authored-by: Wang Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 43 +++++++++++----------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index bc2662f6..9a104003 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -32,13 +32,14 @@ # ALoLo_527 , 2024. # 大王叫我来巡山 , 2024. # chumoer , 2024. +# Wang , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-12 00:02+0000\n" -"Last-Translator: 大王叫我来巡山 \n" +"PO-Revision-Date: 2024-09-16 13:09+0000\n" +"Last-Translator: Wang \n" "Language-Team: Chinese (Simplified Han script) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" @@ -733,7 +734,7 @@ msgstr "没有设置 {configname} 中的环境变量 {var}!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "" +msgstr "部署'github_releases'错误,{}没有出现。(你可能需要先运行`fdroid update`)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -1324,15 +1325,15 @@ msgstr "脱机计算机,跳过 git 镜像生成直到 `fdroid deploy`" #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "" +msgstr "其中一个 'github_releases'配置项缺失'projectUrl'值。跳过..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." -msgstr "" +msgstr "其中一个 'github_releases'配置项缺失'packageNames'值。跳过..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." -msgstr "" +msgstr "其中一个 'github_releases'配置项缺失'token'值。跳过..." #: ../fdroidserver/update.py #, python-brace-format @@ -2357,7 +2358,7 @@ msgstr "无效 %(type)s 值: %(value)r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "" +msgstr "无效选项:%(value)r (选取自 %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2690,27 +2691,27 @@ msgstr "virustotal.com正在限制速率,等待重试..." #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" -msgstr[0] "" +msgstr[0] "{0} 应用, {1} 主要别名" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" -msgstr "" +msgstr "{apkfilename} ({appid})没有元数据!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" +msgstr "{apkfilename} 有多个{name} 文件,看起来可能是主键泄露了!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " -msgstr "" +msgstr "{apkfilename}的 AndroidManifest.xml 有一个无效的日期: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." -msgstr "" +msgstr "{appid} 没有名字! 使用 application ID 代替." #: ../fdroidserver/update.py #, python-brace-format @@ -2741,7 +2742,7 @@ msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" -msgstr "" +msgstr "{appid}: 没有指定构建,在当前源码状态下运行" #: ../fdroidserver/lint.py #, python-brace-format @@ -2766,7 +2767,7 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" -msgstr "" +msgstr "{file} 是空的或已损坏!" #: ../fdroidserver/update.py #, python-brace-format @@ -2776,12 +2777,12 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "{oldfile} 已弃用,请使用 {newfile}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" -msgstr "" +msgstr "{path} 已经存在,忽略导入的结果!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2811,12 +2812,12 @@ msgstr "{path} 不是标准的配置文件!" #: ../fdroidserver/index.py #, python-brace-format msgid "{path} is not list, but a {datatype}!" -msgstr "" +msgstr "{path} 不是list,而是 {datatype}!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "" +msgstr "{path} 不是 {expected_type} 而是 {datatype}!" #: ../fdroidserver/update.py #, python-brace-format @@ -2831,7 +2832,7 @@ msgstr "{path}的大小超过200MB,请手动上传:{url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" +msgstr "{path}: \"{code}\" 不是有效的ISO_3166-1 alpha-2国家代码!" #: ../fdroidserver/update.py #, python-brace-format @@ -2851,9 +2852,9 @@ msgstr "{url}不是以“http”为开头!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" -msgstr[0] "" +msgstr[0] "{} 构建失败" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" -msgstr[0] "" +msgstr[0] "{} 构建成功" From 18d0fad4d1906c7d5f170677d64ffb214714f7dc Mon Sep 17 00:00:00 2001 From: VfBFan Date: Wed, 18 Sep 2024 06:08:30 +0000 Subject: [PATCH 1725/2116] Translated using Weblate: German (de) by VfBFan Currently translated at 100.0% (592 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ --- locale/de/LC_MESSAGES/fdroidserver.po | 86 +++++++++++++-------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 618ae3b7..be5ade62 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -27,8 +27,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-13 23:35+0000\n" -"Last-Translator: ssantos \n" +"PO-Revision-Date: 2024-09-18 23:55+0000\n" +"Last-Translator: VfBFan \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -162,7 +162,7 @@ msgstr "Option %s verfügt über keinen Wert" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" -msgstr "„keypass” nicht in config.yml vorhanden!" +msgstr "'keypass' nicht in config.yml vorhanden!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" @@ -170,21 +170,21 @@ msgstr "'keystore' ist NONE und 'smartcardoptions' ist leer!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" -msgstr "„keystore” nicht in config.yml vorhanden!" +msgstr "'keystore' nicht in config.yml vorhanden!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" -msgstr "„keystorepass” nicht in config.yml vorhanden!" +msgstr "'keystorepass' nicht in config.yml vorhanden!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" -msgstr "„repo_keyalias” nicht in config.yml vorhanden!" +msgstr "'repo_keyalias' nicht in config.yml vorhanden!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" -msgstr "„required” ist ein ungültiges Argument für Positionsangaben" +msgstr "'required' ist ein ungültiges Argument für Positionsangaben" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" @@ -193,17 +193,17 @@ msgstr "Kein 'sdk_path' in 'config.yml' festgelegt!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" -msgstr "„{aapt}” ist veraltet, fdroid benötigt build-tools-{version} oder neuer!" +msgstr "'{aapt}' ist veraltet, fdroid benötigt build-tools-{version} oder neuer!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "Das Feld „{field}” wird in zufälliger Reihenfolge angezeigt! Verwenden Sie runde ( ) oder eckige [ ] Klammern, wenn die Reihenfolge wichtig ist!" +msgstr "Das Feld '{field}' wird in zufälliger Reihenfolge angezeigt! Verwenden Sie runde ( ) oder eckige [ ] Klammern, wenn die Reihenfolge wichtig ist!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" -msgstr "„{path}” konnte nicht ausgeführt werden!" +msgstr "'{path}' konnte nicht ausgeführt werden!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -213,12 +213,12 @@ msgstr "'{path}' in ungültigem Format, sollte ein Wörterbuch sein!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" -msgstr "„{value}” ist kein gültiges {field} in {appid}. Regex-Muster: {pattern}" +msgstr "'{value}' ist kein gültiges {field} in {appid}. Regex-Muster: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "„{value}” ist kein gültiges {field}, sollte {pattern} sein" +msgstr "'{value}' ist kein gültiges {field}, sollte {pattern} sein" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -259,7 +259,7 @@ msgstr "Füge eine Metadaten-Vorlage für APKs hinzu, die keine haben" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" -msgstr "Nur für {name} eine neue Repro hinzufügen" +msgstr "Nur für {name} eine neues Repo hinzufügen" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" @@ -301,12 +301,12 @@ msgstr "Android-SDK nicht unter {path} gefunden!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" -msgstr "Android-SDK-Pfad »{path}« nicht vorhanden!" +msgstr "Android-SDK-Pfad '{path}' nicht vorhanden!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" -msgstr "Android-SDK-Pfad »{path}« ist kein Verzeichnis!" +msgstr "Android-SDK-Pfad '{path}' ist kein Verzeichnis!" #: ../fdroidserver/common.py #, python-brace-format @@ -328,7 +328,7 @@ msgstr "App hat NoSourceSince oder ArchivePolicy \"0 versions\" oder 0, aber Aut #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" -msgstr "App befindet sich in „{repo}”, enthält aber einen Verweis auf {url}" +msgstr "App befindet sich in '{repo}', enthält aber einen Verweis auf {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." @@ -350,7 +350,7 @@ msgstr "AutoUpdateMode mit UpdateCheckMode: HTTP muss ein Muster haben." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "Falscher Typeneintrag „{mirrortype}“ in Spiegelserver-Konfiguration von: {mirror}" +msgstr "Falscher Typeneintrag \"{mirrortype}\" in Spiegelserver-Konfiguration von: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -360,12 +360,12 @@ msgstr "Basis-URL zum Spiegeln, kann den Index-Signierungsschlüssel mit Hilfe d #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "Zweig „{branch}”, der als Bestätigung im Build verwendet wird „{versionName}”" +msgstr "Branch '{branch}', der als Bestätigung im Build verwendet wird '{versionName}'" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" -msgstr "Zweig „{branch}” wird als Bestätigung in srclib verwendet „{srclib}”" +msgstr "Branch '{branch}' wird als Bestätigung in srclib verwendet '{srclib}'" #: ../fdroidserver/update.py #, python-brace-format @@ -395,7 +395,7 @@ msgstr "Nur die neueste Version jedes Programmpakets erstellen" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" -msgstr "Built-Repo basiert in „%s” auf der Konfiguration von:" +msgstr "Built-Repo basiert in \"%s\" auf der Konfiguration von:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" @@ -415,11 +415,11 @@ msgstr "\"{path}\" konnte nicht überschrieben werden" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" -msgstr "Kategorie »%s« ist nicht gültig" +msgstr "Kategorie '%s' ist nicht gültig" #: ../fdroidserver/lint.py msgid "Categories are not set" -msgstr "Kategorien sind nicht festgelegt" +msgstr "Keine Kategorien festgelegt" #: ../fdroidserver/index.py #, python-brace-format @@ -455,7 +455,7 @@ msgstr "Änderungen übergeben" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "Widersprüchliche „{field}“-Definitionen in .yml- bzw. übersetzten Dateien:" +msgstr "Widersprüchliche \"{field}\"-Definitionen in .yml- bzw. übersetzten Dateien:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." @@ -469,7 +469,7 @@ msgstr "Konflikt in der Konfiguration. Verwende {newfile}, ignoriere {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" -msgstr "„{command}” konnte auf Ihrem System nicht gefunden werden" +msgstr "'{command}' konnte auf Ihrem System nicht gefunden werden" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" @@ -513,12 +513,12 @@ msgstr "Es ist ungehörig, bestehende Signaturschlüssel-Einstellungen zu übers #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" -msgstr "Neuer Container „{name}” wurde erstellt" +msgstr "Neuer Container \"{name}\" wurde erstellt" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." -msgstr "„{path}” für die Konfiguration von S3cmd wird erstellt." +msgstr "\"{path}\" für die Konfiguration von S3cmd wird erstellt." #: ../fdroidserver/publish.py msgid "Creating log directory" @@ -613,7 +613,7 @@ msgstr "Verteilen Sie die neuen Dateien nicht in das Repo" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" -msgstr "„{path}” nicht in die URL einfügen!" +msgstr "\"{path}\" nicht in die URL einfügen!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" @@ -702,7 +702,7 @@ msgstr "FEHLER: {key} in {path} ist nicht \"archive\" oder \"repo\"!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" -msgstr "ERROR: {key}:{subkey} in {path} ist keiner der erlaubten Schlüssel: {allowed_keys}!" +msgstr "FEHLER: {key}:{subkey} in {path} ist keiner der erlaubten Schlüssel: {allowed_keys}!" #: ../fdroidserver/__main__.py #, python-brace-format @@ -725,7 +725,7 @@ msgstr "Umgebungsvariable {var} von {configname} ist nicht gesetzt!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "Fehler bei der Bereitstellung von 'github_releases', {} nicht vorhanden. (Sie müssen zuerst `fdroid update` ausführen.)" +msgstr "Fehler beim Bereitstellen von 'github_releases', {} nicht vorhanden. (Sie müssen zuerst `fdroid update` ausführen.)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -1316,15 +1316,15 @@ msgstr "Maschine offline, überspringe git-Spiegelgeneration bis `fdroid deploy` #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "Einem der Konfigurationselemente von 'github_releases' fehlt der Wert 'projectUrl'. Überspringe..." +msgstr "Einem der Konfigurationselemente von 'github_releases' fehlt der Wert 'projectUrl'. Überspringe …" #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." -msgstr "Einem der Konfigurationselemente von 'github_releases' fehlt der Wert 'packageNames'. Überspringe..." +msgstr "Einem der Konfigurationselemente von 'github_releases' fehlt der Wert 'packageNames'. Überspringe …" #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." -msgstr "Einem der Konfigurationselemente von 'github_releases' fehlt der Wert 'token'. Überspringe..." +msgstr "Einem der Konfigurationselemente von 'github_releases' fehlt der Wert 'token'. Überspringe …" #: ../fdroidserver/update.py #, python-brace-format @@ -1540,7 +1540,7 @@ msgstr "Auf Git Repo, das nicht committete Änderungen hat, laufen lassen" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" -msgstr "" +msgstr "{cibase} ausführen, um -debug.apk zu finden. und repo_basedir {repo_basedir} überspringen" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1958,33 +1958,33 @@ msgstr "Syntax: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "Verwenden Sie /HEAD anstelle von /master oder /main, um auf eine Datei im Hauptzweig zu verweisen" +msgstr "Verwende /HEAD anstelle von /master oder /main, um auf eine Datei im Hauptzweig zu verweisen" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Verwenden Sie /HEAD anstelle von /master, um auf eine Datei im Hauptzweig zu verweisen" +msgstr "Verwende /HEAD anstelle von /master, um auf eine Datei im Hauptzweig zu verweisen" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." -msgstr "Verwenden Sie `fdroid update -c´ zum Erstellen." +msgstr "Verwende `fdroid update -c` zum Erstellen." #: ../fdroidserver/build.py msgid "Use build server" -msgstr "Build-Server verwenden" +msgstr "Verwende Build-Server" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" -msgstr "APK-Datum statt der aktuellen Zeit für neu hinzugefügte APKs verwenden" +msgstr "Verwende APK-Datum statt der aktuellen Zeit für neu hinzugefügte APKs" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." -msgstr "Verwende {path} zur Konfiguration von s3cmd." +msgstr "Verwende \"{path}\" zur Konfiguration von s3cmd." #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for syncing with remote storage." -msgstr "Verwende \"{path}\" zur Synchronisation mit Remote-Speicher." +msgstr "Verwende „{path}“ zur Synchronisation mit Remote-Speicher." #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -2569,12 +2569,12 @@ msgstr "ruamel.yaml ist nicht installiert, kann Metadaten nicht schreiben." #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" -msgstr "s3cmd-Sync {path} indizieren auf {url} und dann löschen" +msgstr "s3cmd synchronisiert Indizes von {path} nach {url} und löscht diese" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "s3cmd-Sync {path} indizieren auf {url} und dann löschen" +msgstr "s3cmd synchronisiert Indizes von {path} nach {url} und löscht entfernte" #: ../fdroidserver/scanner.py #, python-brace-format From c5b8d2823d53897e91f4ff0fd497de4dd1b98439 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Wed, 18 Sep 2024 10:35:59 +0000 Subject: [PATCH 1726/2116] Translated using Weblate: Japanese (ja) by Suguru Hirahara Currently translated at 10.4% (62 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ja/ --- locale/ja/LC_MESSAGES/fdroidserver.po | 118 +++++++++++++------------- 1 file changed, 58 insertions(+), 60 deletions(-) diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index eb66c43e..15552e67 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-02-25 05:52+0000\n" +"PO-Revision-Date: 2024-09-18 23:55+0000\n" "Last-Translator: Suguru Hirahara \n" "Language-Team: Japanese \n" "Language: ja\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -33,17 +33,17 @@ msgstr "" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" -msgstr "" +msgstr "「\"%s/」に合致するメタデータのファイルはありません!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "local_copy_dir は絶対パスの必要があります!" +msgstr "\"local_copy_dir\" {path} は存在しません!" #: ../fdroidserver/install.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "'{apkfilename}'はすでに{dev}にインストールされています。" +msgstr "「{apkfilename}」はすでに{dev}にインストールされています。" #: ../fdroidserver/update.py #, python-brace-format @@ -53,7 +53,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" -msgstr "" +msgstr "「{path}」には最近の{name}({version})が含まれています" #: ../fdroidserver/deploy.py #, python-brace-format @@ -88,12 +88,12 @@ msgstr[0] "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" -msgstr "" +msgstr "%(prog)s: エラー: %(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "%d個のAPKが署名されておらず検証できませんでした!" #: ../fdroidserver/scanner.py #, python-format @@ -104,14 +104,14 @@ msgstr "%d個の問題が見つかりました" #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" -msgstr "" +msgstr "%prog [オプション]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" -msgstr "" +msgstr "%rは呼び出せません" #: ../fdroidserver/signindex.py #, python-format @@ -137,7 +137,7 @@ msgstr "" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" -msgstr "" +msgstr "「keypass」がconfig.ymlにありません!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" @@ -145,11 +145,11 @@ msgstr "" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" -msgstr "" +msgstr "「keystore」がconfig.ymlにありません!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" -msgstr "" +msgstr "「keystorepass」がconfig.ymlにありません!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" @@ -204,7 +204,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" -msgstr "" +msgstr ".__call__() は定義されていません" #: ../fdroidserver/lint.py msgid "/issues is missing" @@ -349,7 +349,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Build a package from source" -msgstr "" +msgstr "パッケージをソースコードからビルド" #: ../fdroidserver/build.py msgid "Build all applications available" @@ -402,7 +402,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" -msgstr "" +msgstr "アプリケーションの更新を確認" #: ../fdroidserver/update.py #, python-brace-format @@ -420,7 +420,7 @@ msgstr "" #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" -msgstr "" +msgstr "コマンド '%s' は認識されません。\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" @@ -530,7 +530,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "" +msgstr "メタデータの無いAPKとOBBをリポジトリから削除" #: ../fdroidserver/deploy.py #, python-brace-format @@ -980,7 +980,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" -msgstr "" +msgstr "ビルドしたパッケージを端末にインストール" #: ../fdroidserver/install.py #, python-format @@ -994,7 +994,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" -msgstr "" +msgstr "リポジトリのHTTPサーバーと通信" #: ../fdroidserver/update.py msgid "Invalid APK" @@ -1315,7 +1315,7 @@ msgstr "" #: /usr/lib/python3.11/optparse.py msgid "Options" -msgstr "" +msgstr "オプション" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." @@ -1430,11 +1430,11 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" -msgstr "" +msgstr "新しいリポジトリをすぐに開始" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" -msgstr "" +msgstr "メタデータの全てのファイルを読み込んで終了" #: ../fdroidserver/common.py #, python-brace-format @@ -1471,7 +1471,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" -msgstr "" +msgstr "package.name_123.apkに合致しないAPKファイルの名前を変更" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" @@ -1496,7 +1496,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" -msgstr "" +msgstr "メタデータの全てのファイルを書き換える" #: ../fdroidserver/rewritemeta.py #, python-brace-format @@ -1536,7 +1536,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" -msgstr "" +msgstr "パッケージのソースコードを読み込む" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1595,11 +1595,11 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" -msgstr "" +msgstr "パッケージに署名してリポジトリに設置" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" -msgstr "" +msgstr "「update --nosign」で作成したインデックスに署名" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" @@ -1779,7 +1779,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" -msgstr "" +msgstr "不明な例外が発生しました!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py @@ -1856,11 +1856,11 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" -msgstr "" +msgstr "新しいパッケージに関するリポジトリの情報を更新" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" -msgstr "" +msgstr "URLに関するバイナリーの透明性のログを更新" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -1909,14 +1909,14 @@ msgstr "" #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "Usage" -msgstr "" +msgstr "使い方" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" -msgstr "" +msgstr "使い方: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" @@ -1991,7 +1991,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Valid commands are:" -msgstr "" +msgstr "正しいコマンド:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." @@ -1999,7 +1999,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" -msgstr "" +msgstr "ダウンロードしたパッケージの一貫性を検証" #: ../fdroidserver/index.py msgid "Verifying index signature:" @@ -2012,7 +2012,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" -msgstr "" +msgstr "潜在的なメタデータのエラーに関して警告" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2053,14 +2053,14 @@ msgstr "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "" +msgstr "オプションが曖昧です。%(option)sは%(matches)sに一致しませんでした" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" -msgstr "" +msgstr "オプションが曖昧です:%s(%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" @@ -2385,7 +2385,7 @@ msgstr "" #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" -msgstr "" +msgstr "そうしたオプションはありません:%s" #: ../fdroidserver/__main__.py msgid "no version info found!" @@ -2437,21 +2437,21 @@ msgstr "" #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" -msgstr "" +msgstr "オプション -%s は認識されません" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" -msgstr "" +msgstr "オプション -%s は引数が必要です" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" -msgstr "" +msgstr "オプション --%s に引数は指定できません" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py @@ -2465,19 +2465,19 @@ msgstr "" #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" -msgstr "" +msgstr "オプション --%s は認識されません" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" -msgstr "" +msgstr "オプション --%s には引数が必要です" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" -msgstr "" +msgstr "オプションの引数" #: /usr/lib/python3.11/argparse.py msgid "options" @@ -2542,20 +2542,18 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" #: ../fdroidserver/deploy.py -#, fuzzy -#| msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "local_copy_dir は「froid」で終わっていません、もしかして: 「{path}」" +msgstr "serverwebroot: パスが「fdroid」で終わっていません。もしかして:" #: ../fdroidserver/scanner.py msgid "shared library" -msgstr "" +msgstr "共有ライブラリー" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" -msgstr "" +msgstr "プログラムのバージョン番号を表示して終了" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py @@ -2563,11 +2561,11 @@ msgstr "" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" -msgstr "" +msgstr "このヘルプメッセージを表示して終了" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." -msgstr "" +msgstr "サイン済みのAPK。ファイルのパスかHTTPSのURL。" #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" @@ -2588,7 +2586,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "static library" -msgstr "" +msgstr "静的ライブラリー" #: ../fdroidserver/build.py #, python-brace-format @@ -2600,14 +2598,14 @@ msgstr "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" -msgstr "" +msgstr "次の引数が必要です:%s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" -msgstr "" +msgstr "予期しないオプションの文字列です:%s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2621,18 +2619,18 @@ msgstr "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" -msgstr "" +msgstr "認識されない引数です:%s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" -msgstr "" +msgstr "「{config_file}」のパーミッションが安全ではありません(0600に設定すべきです)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " -msgstr "" +msgstr "使い方: " #: ../fdroidserver/deploy.py #, python-brace-format From 75995b391509797dfb6ffdaaf2d29da43805f5ed Mon Sep 17 00:00:00 2001 From: Reno Tx Date: Fri, 20 Sep 2024 15:51:01 +0000 Subject: [PATCH 1727/2116] Translated using Weblate: Serbian (sr) by Reno Tx Currently translated at 100.0% (592 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sr/ --- locale/sr/LC_MESSAGES/fdroidserver.po | 35 +++++++++++++-------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index 5cd00f02..2f984b25 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -9,8 +9,8 @@ msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-10 09:27+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2024-09-20 19:23+0000\n" +"Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" @@ -681,12 +681,12 @@ msgstr "ГРЕШКА: неподржан git домаћин \"%s\", закрпе #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" -msgstr "" +msgstr "ERROR: {key} у {path} није \"archive\" или \"repo\"!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" -msgstr "" +msgstr "ERROR: {key}:{subkey} у {path} није у дозвољеним кључевима: {allowed_keys}!" #: ../fdroidserver/__main__.py #, python-brace-format @@ -709,7 +709,7 @@ msgstr "Еколошка променљива {var} из {configname} није #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "" +msgstr "Error deploying 'github_releases', {} није присутан. (Можда треба прво да покренете `fdroid update`.)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -1300,15 +1300,15 @@ msgstr "Оффлайн машина, прескочено генерисање g #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "" +msgstr "Једна од 'github_releases' конфигурационих ставки недостаје 'projectUrl' вредност. прескакање ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." -msgstr "" +msgstr "Једна од 'github_releases' конфигурационих ставки нема 'packageNames' вредност. прескакање ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." -msgstr "" +msgstr "Једна од 'github_releases' конфигурационих ставки нема 'token' вредност. прескакање ..." #: ../fdroidserver/update.py #, python-brace-format @@ -1524,7 +1524,7 @@ msgstr "Покрени на git репозиторијуму који има н #: ../fdroidserver/nightly.py #, python-brace-format msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" -msgstr "" +msgstr "Покрените преко {cibase} да пронађете -debug.apk. и прескочите repo_basedir {repo_basedir}" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1766,9 +1766,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "Да бисте користили awsbucket, awssecretkey и awsaccesskeyid морају бити подешени у config.yml!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" -msgstr "Да бисте користили awsbucket, awssecretkey и awsaccesskeyid морају бити подешени у config.yml!" +msgstr "Да бисте користили rclone, rclone_config и awsbucket морају бити подешени у config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1968,9 +1967,9 @@ msgid "Using \"{path}\" for configuring s3cmd." msgstr "Користим \"{path}\" за конфигурисање s3cmd." #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using \"{path}\" for syncing with remote storage." -msgstr "Користим \"{path}\" за конфигурисање s3cmd." +msgstr "Користим \"{path}\" за синхронизацију са удаљеним складиштем." #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -2004,9 +2003,9 @@ msgid "Using existing keystore \"{path}\"" msgstr "Користим постојећи keystore \"{path}\"" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using rclone to sync with: {url}" -msgstr "Користим s3cmd за синхронизацију са: {url}" +msgstr "Користим rclone за синхронизацију са: {url}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2229,7 +2228,7 @@ msgstr "бришем: repo/{apkfilename}" #: ../fdroidserver/scanner.py msgid "dependency file without lock" -msgstr "" +msgstr "фајл зависности без закључавања" #: ../fdroidserver/common.py #, python-brace-format @@ -2560,9 +2559,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd синхронизује индексе {path} са {url} и брише" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "s3cmd синхронизује индексе {path} са {url} и брише" +msgstr "s3cmd синхронизује индексе из {path} у {url} и брише уклоњене" #: ../fdroidserver/scanner.py #, python-brace-format From df496419d4afe0f366960f62544f64cddb60b937 Mon Sep 17 00:00:00 2001 From: Fjuro Date: Sun, 22 Sep 2024 09:29:10 +0000 Subject: [PATCH 1728/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 100.0% (592 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ --- locale/cs/LC_MESSAGES/fdroidserver.po | 142 +++++++++++++------------- 1 file changed, 71 insertions(+), 71 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 15e7e2de..eff8c921 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -13,7 +13,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-14 23:47+0000\n" +"PO-Revision-Date: 2024-09-22 11:02+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" @@ -43,47 +43,47 @@ msgstr "" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" -msgstr "\"%s/\" nemá žádný odpovídající soubor metadat!" +msgstr "„%s/“ nemá žádný odpovídající soubor metadat!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "\"local_copy_dir\" {path} neexistuje!" +msgstr "„local_copy_dir“ {path} neexistuje!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "aplikace \"{apkfilename}\" je již nainstalována na {dev}." +msgstr "aplikace „{apkfilename}“ je již nainstalována na {dev}." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" obsahuje zastaralý název {name} ({version})" +msgstr "„{path}“ obsahuje zastaralý {name} ({version})" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" -msgstr "\"{path}\" obsahuje nedávné {name} ({version})" +msgstr "„{path}“ obsahuje nedávné {name} ({version})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" -msgstr "\"{path}\" existuje, ale s3cmd není nainstalován!" +msgstr "„{path}“ existuje, ale s3cmd není nainstalován!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "\"{path}\" není podporovaný formát souboru (použijte: metadata/*.yml)" +msgstr "„{path}“ není podporovaný formát souboru (použijte: metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "\"{path}\" je podepsáno klíčem, který není povolen:" +msgstr "„{path}“ je podepsáno klíčem, který není povolen:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" -msgstr "\"{url}\" není platná adresa URL!" +msgstr "„{url}“ není platná adresa URL!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -149,68 +149,68 @@ msgstr "možnost %s nepřebírá hodnotu" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" -msgstr "'keypass' nebyl nalezen v souboru config.yml!" +msgstr "„keypass“ nebyl nalezen v souboru config.yml!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "'keystore' je NONE a 'smartcardoptions' je prázdný!" +msgstr "„keystore“ je NONE a „smartcardoptions“ je prázdný!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" -msgstr "'keystore' nebyl nalezen v souboru config.yml!" +msgstr "„keystore“ nebyl nalezen v souboru config.yml!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' nebyl nalezen v souboru config.yml!" +msgstr "„keystorepass“ nebyl nalezen v souboru config.yml!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' nebyl nalezen v config.yml!" +msgstr "„repo_keyalias“ nebyl nalezen v souboru config.yml!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" -msgstr "'povinné' je Neplatný argument pro pozicials" +msgstr "„required je neplatný argument pro positionals" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" -msgstr "'sdk_path' není nastaven v souboru config.yml!" +msgstr "„sdk_path“ není nastavena v souboru config.yml!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" -msgstr "'{aapt}' je příliš starý, fdroid vyžaduje build-tools-{version} nebo novější!" +msgstr "„{aapt}“ je příliš starý, fdroid vyžaduje build-tools-{version} nebo novější!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' bude v náhodném pořadí! Pokud je pořadí důležité, použijte závorky () nebo []!" +msgstr "„{field}“ bude v náhodném pořadí! Pokud je pořadí důležité, použijte závorky () nebo []!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" -msgstr "'{path}' nepodařilo se provést!" +msgstr "„{path}“ se nepodařilo spustit!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "'{path}' má neplatný formát, měl by to být slovník!" +msgstr "„{path}“ má neplatný formát, měl by to být slovník!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" -msgstr "'{value}' není platný {field} v {appid}. Vzor regulárního výrazu: {pattern}" +msgstr "„{value}“ není platný {field} v {appid}. Vzor regex: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "'{value}' není platný {field}, měl by to být {pattern}" +msgstr "„{value}“ není platný {field}, měl by to být {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" -msgstr "...kontrola selhala pro {appid} : {error}" +msgstr "...checkupdate selhal pro {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -233,20 +233,20 @@ msgstr "Podpisy souborů APK mají rozdílné certifikáty v {path}:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" -msgstr "Přidejte podpisy PGP pomocí GnuPG pro balíčky v repo" +msgstr "Přidat podpisy PGP pomocí GnuPG pro balíčky v repozitáři" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" -msgstr "Přidejte podpisový klíč repo k nepodepsanému repo" +msgstr "Přidat podpisový klíč repozitáře k nepodepsanému repozitáři" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" -msgstr "Přidání souborů metadat kostry pro soubory APK, které chybí" +msgstr "Přidat souborů metadat kostry pro soubory APK, u kterých chybí" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" -msgstr "Přidání nového repozitáře pouze pro {name}" +msgstr "Přidávám nový repozitář pouze pro {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" @@ -266,7 +266,7 @@ msgstr "Také zrcadlit celou sekci archivu" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" -msgstr "Také varovat před problémy s formátování, jako rewritemeta -l" +msgstr "Také varovat před problémy s formátováním, jako rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" @@ -288,12 +288,12 @@ msgstr "Android SDK nebylo nalezeno v {path}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" -msgstr "Android SDK s cestou '{path}' neexistuje!" +msgstr "Android SDK s cestou „{path}“ neexistuje!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" -msgstr "Cesta Android SDK '{path}' není adresář!" +msgstr "Cesta Android SDK „{path}“ není adresář!" #: ../fdroidserver/common.py #, python-brace-format @@ -306,16 +306,16 @@ msgstr "Aplikace má binární soubory, ale nemá odpovídající AllowedAPKSign #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "Aplikace má NoSourceSince nebo ArchivePolicy \"0 versions\", ale AutoUpdateMode nebo UpdateCheckMode nejsou None" +msgstr "Aplikace má NoSourceSince nebo ArchivePolicy „0 versions“, ale AutoUpdateMode nebo UpdateCheckMode nejsou None" #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "Aplikace má NoSourceSince nebo ArchivePolicy \"0 versions\" nebo 0, ale AutoUpdateMode nebo UpdateCheckMode nejsou None" +msgstr "Aplikace má NoSourceSince nebo ArchivePolicy „0 versions“ nebo 0, ale AutoUpdateMode nebo UpdateCheckMode nejsou None" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" -msgstr "Aplikace je v repozitáři '{repo}' ale má odkaz na {url}" +msgstr "Aplikace je v repozitáři „{repo}“ ale má odkaz na {url}" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." @@ -328,7 +328,7 @@ msgstr "Přidání .git není nutné" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" -msgstr "Archivování {apkfilename} s neplatným podpisem!" +msgstr "Archivuji {apkfilename} s neplatným podpisem!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." @@ -337,7 +337,7 @@ msgstr "AutoUpdateMode s UpdateCheckMode: HTTP musí mít vzor." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "Nesprávný typ záznamu \"{mirrortype}\" v konfiguraci zrcadel: {mirror}" +msgstr "Nesprávný typ záznamu „{mirrortype}“ v konfiguraci zrcadel: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -347,12 +347,12 @@ msgstr "Základní adresa URL pro zrcadlení, může obsahovat klíč pro podepi #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "Větev '{branch}' použitá jako revize v sestavení '{versionName}'" +msgstr "Větev „{branch}“ použitá jako revize v sestavení „{versionName}“" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" -msgstr "Větev '{branch}' použitá jako revize v srclib '{srclib}'" +msgstr "Větev „{branch}“ použitá jako revize v srclib „{srclib}“" #: ../fdroidserver/update.py #, python-brace-format @@ -369,7 +369,7 @@ msgstr "Sestavit všechny dostupné aplikace" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" -msgstr "Sestavení vygenerováno pomocí `fdroid import` - odeberte řádek se zakázáním po dokončení" +msgstr "Sestavení vygenerováno pomocí `fdroid import` - odeberte řádek se zákazem, jakmile budete připraveni" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" @@ -416,7 +416,7 @@ msgstr "Kategorie „{category}“ je definována, ale není používána u žá #: ../fdroidserver/__main__.py msgid "Check for updates to applications" -msgstr "Zkontrolujte aktualizace aplikací" +msgstr "Zkontrolovat aktualizace aplikací" #: ../fdroidserver/update.py #, python-brace-format @@ -434,7 +434,7 @@ msgstr "Seznam kategorií oddělený čárkami." #: ../fdroidserver/__main__.py #, python-format msgid "Command '%s' not recognised.\n" -msgstr "Příkaz '%s' nebyl rozpoznán.\n" +msgstr "Příkaz „%s“ nebyl rozpoznán.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" @@ -443,11 +443,11 @@ msgstr "Odeslat změny" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "Konfliktní definice \"{field}\" mezi soubory .yml a lokalizovanými soubory:" +msgstr "Konfliktní definice „{field}“ mezi soubory .yml a lokalizovanými soubory:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." -msgstr "Konfliktní argumenty: '--verbose' a '--quiet' nelze zadat současně." +msgstr "Konfliktní argumenty: „--verbose“ a „--quiet“ nelze zadat současně." #: ../fdroidserver/common.py #, python-brace-format @@ -457,7 +457,7 @@ msgstr "Konfliktní konfigurační soubory! Používám {newfile}, ignoruji {old #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" -msgstr "Ve vašem systému se nepodařilo najít příkaz '{command}'" +msgstr "Ve vašem systému se nepodařilo najít příkaz „{command}“" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" @@ -484,7 +484,7 @@ msgstr "Nepodařilo se zpracovat velikost „{size}“, nesprávný typ „{type #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" -msgstr "Nedaří se nalézt ID aplikace" +msgstr "Nepodařilo se nalézt ID aplikace" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" @@ -492,7 +492,7 @@ msgstr "Nepodařilo se najít žádné informace o verzi" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" -msgstr "Nedaří se nalézt identif. balíčku" +msgstr "Nepodařilo se nalézt ID balíčku" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" @@ -544,7 +544,7 @@ msgstr "DEBUG_KEYSTORE není nastaven nebo je hodnota neúplná" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "Odstraňte soubory APK a/nebo OBB bez metadat z úložiště" +msgstr "Odstranit soubory APK a/nebo OBB bez metadat z úložiště" #: ../fdroidserver/deploy.py #, python-brace-format @@ -564,7 +564,7 @@ msgstr "Mazání neznámého souboru: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" -msgstr "Popis ‚%s‘ je pouze souhrn aplikace" +msgstr "Popis „%s“ je pouze souhrn aplikace" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" @@ -573,7 +573,7 @@ msgstr "Popis má duplicitní řádek" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "Popis má seznam (%s) ale není opatřen odrážkami (*) ani očíslován (#)" +msgstr "Popis má seznam (%s), ale není opatřen odrážkami (*) ani očíslován (#)" #: ../fdroidserver/lint.py #, python-brace-format @@ -592,7 +592,7 @@ msgstr "Mysleli jste {code}?" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" -msgstr "Nepřidávat ‚disable:‘ k vygenerovaným položkám sestavení" +msgstr "Nepřidávat „disable:“ k vygenerovaným položkám sestavení" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" @@ -617,7 +617,7 @@ msgstr "Nevytvářet zdrojový tarball, užitečné při testování sestavení" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" -msgstr "Neobnovovat repozitář, užitečné při testování bez připojení k internetu" +msgstr "Neobnovovat repozitář, užitečné při testování sestavení bez připojení k internetu" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" @@ -644,12 +644,12 @@ msgstr "Stahování {url} selhalo. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "Duplicitní prohlášení Anti-Vlastností na adrese {path} bylo ignorováno!" +msgstr "Duplicitní prohlášení anti-funkcí v {path} bylo ignorováno!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "Duplicitní záznam \"%s\" v konfiguraci zrcadel!" +msgstr "Duplicitní záznam „%s“ v konfiguraci zrcadel!" #: ../fdroidserver/lint.py #, python-brace-format @@ -998,7 +998,7 @@ msgstr "Instalace všech dostupných podepsaných aplikací" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" -msgstr "Nainstalujte vestavěné balíčky na zařízení" +msgstr "Nainstalovat vestavěné balíčky na zařízení" #: ../fdroidserver/install.py #, python-format @@ -1012,7 +1012,7 @@ msgstr "Instalace ‚{apkfilename}‘ na {dev}..." #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" -msgstr "Interakce se serverem repo HTTP" +msgstr "Interakce se serverem HTTP repozitáře" #: ../fdroidserver/update.py msgid "Invalid APK" @@ -1448,11 +1448,11 @@ msgstr "Odesílání do {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" -msgstr "Rychle spusťte nové úložiště" +msgstr "Rychle vytvořit nový repozitář" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" -msgstr "Přečtěte si všechny soubory metadat a ukončete" +msgstr "Přečíst všechny soubory metadat a ukončit program" #: ../fdroidserver/common.py #, python-brace-format @@ -1489,7 +1489,7 @@ msgstr "Odebírání {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" -msgstr "Přejmenujte soubory APK, které se neshodují s package.name_123.apk" +msgstr "Přejmenovat soubory APK, které se neshodují s package.name_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" @@ -1554,7 +1554,7 @@ msgstr "Oskenovat výsledná APK, zda neobsahují známé nesvobodné třídy." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" -msgstr "Naskenujte zdrojový kód balíčku" +msgstr "Skenovat zdrojový kód balíčku" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1615,11 +1615,11 @@ msgstr "Nastavení časového limitu {0} sek pro toto sestavení" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" -msgstr "Podepsat a umístit balíčky v repo" +msgstr "Podepsat a umístit balíčky do repozitáře" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" -msgstr "Podepsat indexy vytvořené pomocí aktualizace -- nosign" +msgstr "Podepsat indexy vytvořené pomocí update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" @@ -1883,11 +1883,11 @@ msgstr "Rozbalování do %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" -msgstr "Aktualizujte informace o repo pro nové balíčky" +msgstr "Aktualizovat informace o repozitáři pro nové balíčky" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" -msgstr "Aktualizujte protokol binárního průhlednosti pro adresu URL" +msgstr "Aktualizovat protokol binární transparentnosti pro URL" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -2026,7 +2026,7 @@ msgstr "Ověřit proti lokálně uložené kopii místo opětovného stahování #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" -msgstr "Ověřte integritu stažených balíčků" +msgstr "Ověřit integritu stažených balíčků" #: ../fdroidserver/index.py msgid "Verifying index signature:" @@ -2416,7 +2416,7 @@ msgstr "neposkytnuto APK" #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" -msgstr "žádná taková volba: %s" +msgstr "žádná taková možnost: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" @@ -2468,14 +2468,14 @@ msgstr "možnost %s: neplatná volba: %r (vyberte si z %s)" #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s not recognized" -msgstr "možnost - %s není rozpoznána" +msgstr "možnost -%s není rozpoznána" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option -%s requires argument" -msgstr "možnost - %s vyžaduje argument" +msgstr "možnost -%s vyžaduje argument" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py @@ -2489,14 +2489,14 @@ msgstr "možnost --%s nesmí mít argument" #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" -msgstr "možnost --%s není jedinečná předpona" +msgstr "možnost --%s není jedinečným prefixem" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" -msgstr "možnost -%s není rozpoznána" +msgstr "možnost --%s není rozpoznána" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py @@ -2592,7 +2592,7 @@ msgstr "zobrazit číslo verze programu a ukončit" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" -msgstr "zobrazí tuto nápovědu a skončí" +msgstr "zobrazí tuto nápovědu a ukončí program" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." @@ -2655,7 +2655,7 @@ msgstr "nerozpoznané argumenty: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" -msgstr "nebezpečné oprávnění na '{config_file}' (má být 0600)!" +msgstr "nebezpečné oprávnění u „{config_file}“ (má být 0600)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py From f3303f88cc2927322392a6327b778f2d3cbb897e Mon Sep 17 00:00:00 2001 From: Fjuro Date: Sun, 22 Sep 2024 17:11:24 +0000 Subject: [PATCH 1729/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 100.0% (592 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ --- locale/cs/LC_MESSAGES/fdroidserver.po | 156 +++++++++++++------------- 1 file changed, 78 insertions(+), 78 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index eff8c921..7772e0dc 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -13,7 +13,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-22 11:02+0000\n" +"PO-Revision-Date: 2024-09-22 23:34+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" @@ -480,7 +480,7 @@ msgstr "Nepodařilo se otevřít APK {path} pro analýzu: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" -msgstr "Nepodařilo se zpracovat velikost „{size}“, nesprávný typ „{type}“" +msgstr "Nepodařilo se parsovat velikost „{size}“, nesprávný typ „{type}“" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" @@ -654,7 +654,7 @@ msgstr "Duplicitní záznam „%s“ v konfiguraci zrcadel!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" -msgstr "Duplicitní odkaz v '{field}': {url}" +msgstr "Duplicitní odkaz v „{field}“: {url}" #: ../fdroidserver/common.py #, python-format @@ -680,12 +680,12 @@ msgstr "CHYBA: nepodporovaný typ CI, opravy vítány!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "CHYBA: nepodporovaný git host \"%s\", opravy vítány!" +msgstr "CHYBA: nepodporovaný git host „%s“, opravy vítány!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" -msgstr "CHYBA: {key} v {path} není \"archive\" nebo \"repo\"!" +msgstr "CHYBA: {key} v {path} není „archive“ nebo „repo“!" #: ../fdroidserver/lint.py #, python-brace-format @@ -695,7 +695,7 @@ msgstr "CHYBA: {key}:{subkey} v {path} není v povolených klíčích: {allowed_ #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "Kódování je nastaveno na ‚{enc}‘ fdroid může mít problémy s kódováním. Pro dosažení nejlepších výsledků jej prosím nastavte na ‚UTF-8‘." +msgstr "Kódování je nastaveno na „{enc}“, fdroid může mít problémy s kódováním. Pro dosažení nejlepších výsledků jej prosím nastavte na „UTF-8“." #: ../fdroidserver/init.py #, python-format @@ -713,7 +713,7 @@ msgstr "Proměnná prostředí {var} z {configname} není nastavena!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "Chyba při nasazení 'github_releases', {} není k dispozici. (Možná budete muset nejprve spustit `fdroid update`.)" +msgstr "Chyba při nasazení „github_releases“, {} není k dispozici. (Možná budete muset nejprve spustit `fdroid update`.)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -739,7 +739,7 @@ msgstr "Chyba při kopírování {path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" -msgstr "Chyba při načítání podpisů pro ‚{apkfilename}‘: {error}" +msgstr "Chyba při načítání podpisů pro „{apkfilename}“: {error}" #: ../fdroidserver/update.py #, python-brace-format @@ -754,7 +754,7 @@ msgstr "Chyba při změně velikosti {path}: {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" -msgstr "Nepodařilo se vytvořit bucket S3: {url}" +msgstr "Chyba při vytváření bucketu S3: {url}" #: ../fdroidserver/update.py #, python-brace-format @@ -773,7 +773,7 @@ msgstr "Nepodařilo se získat otisk podpisového klíče APK" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" -msgstr "Nepodařilo se nainstalovat ‚{apkfilename}‘ na {dev}: {error}" +msgstr "Nepodařilo se nainstalovat „{apkfilename}“ na {dev}: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" @@ -787,7 +787,7 @@ msgstr "Načteno buildserverid z VM: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" -msgstr "Načteny podpisy pro ‚{apkfilename}‘ -> ‚{sigdir}‘" +msgstr "Načteny podpisy pro „{apkfilename}“ -> „{sigdir}“" #: ../fdroidserver/update.py #, python-brace-format @@ -843,7 +843,7 @@ msgstr "U některých aplikací nalezeny neplatné versionCodes" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "V {path} nalezeno několik podpisových bloků JAR" +msgstr "V {path} nalezeno několik souborů podpisových bloků JAR" #: ../fdroidserver/common.py msgid "Found multiple Signer Certificates!" @@ -890,7 +890,7 @@ msgstr "Vygenerována kostra metadat pro {appid}" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" -msgstr "Git checkout '%s' se nezdařil" +msgstr "Git checkout „%s“ se nezdařil" #: ../fdroidserver/common.py msgid "Git clean failed" @@ -941,7 +941,7 @@ msgstr "Pokud toto nahrání selže, zkuste manuálně nahrát na {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "Ignorování pole ‚{field}‘ v metadatech ‚{metapath}‘, protože je zastaralé." +msgstr "Ignorování pole „{field}“ v metadatech „{metapath}“, protože je zastaralé." #: ../fdroidserver/update.py #, python-format @@ -964,7 +964,7 @@ msgstr "Ignorování zastaralých dat mezipaměti {apkfilename}" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "Zahrnout soubory APK, které jsou podepsané zakázanými algoritmy jako MD5" +msgstr "Zahrnout soubory APK, které jsou podepsané vypnutými algoritmy jako MD5" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" @@ -1008,7 +1008,7 @@ msgstr "Instalace %s..." #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." -msgstr "Instalace ‚{apkfilename}‘ na {dev}..." +msgstr "Instalace „{apkfilename}“ na {dev}..." #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" @@ -1046,7 +1046,7 @@ msgstr "Neplatné ID aplikace {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" -msgstr "Neplatná logická hodnota ‚%s‘" +msgstr "Neplatná logická hodnota „%s“" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" @@ -1070,17 +1070,17 @@ msgstr "Neplatné přesměrování na jiný než HTTPS: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" -msgstr "Neplatná metadata scrlib: ‚{file}‘ neexistuje" +msgstr "Neplatná metadata scrlib: „{file}“ neexistuje" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" -msgstr "Neplatná srclib metadata: nelze parsovat ‚{file}‘" +msgstr "Neplatná srclib metadata: nelze parsovat „{file}“" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "Neplatná srclib metadata: neznámý klíč ‚{key}‘ v ‚{file}‘" +msgstr "Neplatná srclib metadata: neznámý klíč „{key}“ v „{file}“" #: ../fdroidserver/common.py #, python-brace-format @@ -1129,15 +1129,15 @@ msgstr "V AllowedAPKSigningKeys je použit známý ladicí klíč: " #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "Poslední použitá revize ‚{commit}‘ vypadá jako značka, ale UpdateCheckMode je ‚{ucm}‘" +msgstr "Poslední použitá revize „{commit}“ vypadá jako značka, ale UpdateCheckMode je „{ucm}“" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" -msgstr "Darovací metody Liberapay patří do pole Liberapay: pole" +msgstr "Darovací metody Liberapay patří do pole „Liberapay:“" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" -msgstr "Seznam souborů, které budou přeformátovány (zkušební provoz)" +msgstr "Seznam souborů, které budou přeformátovány (zkušební spuštění)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" @@ -1170,11 +1170,11 @@ msgstr "Chybějící výstupní adresář" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "Přesun deklarací Anti-Features do lokalizovaných souborů:" +msgstr "Přesun deklarací anti-funkcí do lokalizovaných souborů:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "V souboru config.yml není nastaven \"repo_pubkey\" ani \"keystorepass\"" +msgstr "V souboru config.yml není nastaven „repo_pubkey“ ani „keystorepass“" #: ../fdroidserver/verify.py #, python-format @@ -1191,7 +1191,7 @@ msgstr "Nebyla nalezena žádná připojená zařízení" #: ../fdroidserver/index.py msgid "No fingerprint in URL." -msgstr "V adrese URL není otisk prstu." +msgstr "V adrese URL není otisk." #: ../fdroidserver/common.py msgid "No git submodules available" @@ -1228,7 +1228,7 @@ msgstr "Není nastavena žádná možnost! Upravte svůj config.yml a nastavte a #: ../fdroidserver/common.py msgid "No packages specified" -msgstr "Nebyly zadány žádné balíčky" +msgstr "Nebyly upřesněny žádné balíčky" #: ../fdroidserver/install.py #, python-format @@ -1269,7 +1269,7 @@ msgstr "Nenalezeny žádné informace o verzi." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" -msgstr "Neplatná definice velikosti: \"{}\"" +msgstr "Neplatná definice velikosti: „{}“" #: ../fdroidserver/signindex.py msgid "Nothing to do" @@ -1292,7 +1292,7 @@ msgstr "Soubor OBB má novější versionCode({integer}) než jakýkoli APK:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" -msgstr "Název souboru OBB musí začínat s \"main.\" nebo \"patch.\":" +msgstr "Název souboru OBB musí začínat s „main.“ nebo „patch.“:" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" @@ -1300,19 +1300,19 @@ msgstr "Packagename souboru OBB neodpovídá podporovanému souboru APK:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "Offline počítač, přeskočení generování mirroru git až do `fdroid deploy`" +msgstr "Offline počítač, přeskakuji generování mirroru gitu až do `fdroid deploy`" #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "V jedné z položek konfigurace 'github_releases' chybí hodnota 'projectUrl'. přeskakuji ..." +msgstr "Jedné z položek konfigurace „github_releases“ chybí hodnota „projectUrl“. Přeskakuji ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." -msgstr "V jedné z položek konfigurace 'github_releases' chybí hodnota 'packageNames'. přeskakuji ..." +msgstr "Jedné z položek konfigurace „github_releases“ chybí hodnota „packageNames“. Přeskakuji ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." -msgstr "V jedné z položek konfigurace 'github_releases' chybí hodnota 'token'. přeskakuji ..." +msgstr "Jedné z položek konfigurace „github_releases“ chybí hodnota „token“. Přeskakuji ..." #: ../fdroidserver/update.py #, python-brace-format @@ -1329,7 +1329,7 @@ msgstr "Zpracovat pouze aplikace s automatickými aktualizacemi" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "Darovací metody OpenCollective patří do pole OpenCollective: pole" +msgstr "Darovací metody OpenCollective patří do pole „OpenCollective:“" #: /usr/lib/python3.11/optparse.py msgid "Options" @@ -1366,7 +1366,7 @@ msgstr "Balíček „{appid}“ již existuje" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" -msgstr "Parsování manifestu v ‚{path}‘" +msgstr "Parsování manifestu v „{path}“" #: ../fdroidserver/common.py msgid "Password required with username" @@ -1400,21 +1400,21 @@ msgstr "Problém se souborem ZIP: %s, chyba %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" -msgstr "Problém s xml v '{path}'" +msgstr "Problém s xml v „{path}“" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" -msgstr "Zpracovat auto-aktualizace" +msgstr "Zpracovávat auto-aktualizace" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" -msgstr "Zpracování {apkfilename}" +msgstr "Zpracovávání {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" -msgstr "Zpracování {appid}" +msgstr "Zpracovávání {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" @@ -1457,17 +1457,17 @@ msgstr "Přečíst všechny soubory metadat a ukončit program" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" -msgstr "Čtení ‚{config_file}‘" +msgstr "Čtení „{config_file}“" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" -msgstr "Čtení packageName/versionCode/versionName se nezdařilo, APK nepatné: ‚{apkfilename}‘" +msgstr "Čtení packageName/versionCode/versionName se nezdařilo, APK neplatné: „{apkfilename}“" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" -msgstr "Čtení packageName/versionCode/versionName se nezdařilo, APK nepatné: ‚{apkfilename}‘" +msgstr "Čtení packageName/versionCode/versionName se nezdařilo, APK neplatné: „{apkfilename}“" #: ../fdroidserver/update.py #, python-brace-format @@ -1519,7 +1519,7 @@ msgstr "Přepsat všechny soubory metadat" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" -msgstr "Přepisování ‚{appid}‘" +msgstr "Přepisování „{appid}“" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" @@ -1611,7 +1611,7 @@ msgstr "Nastavení limitu otevřených souborů se nezdařilo: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" -msgstr "Nastavení časového limitu {0} sek pro toto sestavení" +msgstr "Nastavení časového limitu {0} sekund pro toto sestavení" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" @@ -1628,7 +1628,7 @@ msgstr "Přeskočení kontroly zdrojového kódu binárních souborů a dalšíc #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" -msgstr "Přeskakování ‚{apkfilename}‘ s neplatným podpisem!" +msgstr "Přeskakování „{apkfilename}“ s neplatným podpisem!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format @@ -1674,7 +1674,7 @@ msgstr "Odstraňování tajemného podpisu z {apkfilename}" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" -msgstr "Shrnutí ‚%s‘ je pouze název aplikace" +msgstr "Shrnutí „%s“ je pouze název aplikace" #: ../fdroidserver/lint.py #, python-brace-format @@ -1718,7 +1718,7 @@ msgstr "Soubor, který má být zahrnut do repozitáře (cesta nebo glob)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." -msgstr "Otisk prstu repozitáře se neshoduje." +msgstr "Otisk repozitáře se neshoduje." #: ../fdroidserver/deploy.py #, python-brace-format @@ -1757,10 +1757,10 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" -"Chcete-li dokončit nastavení, přidejte soubory APK na adresu \"%s\".\n" +"Chcete-li dokončit nastavení, přidejte soubory APK na adresu „%s“.\n" "poté spusťte příkaz „fdroid update -c; fdroid update“. Možná budete chtít také upravit\n" -"„config.yml“, abyste nastavili adresu URL, název repozitáře a další údaje. Měli byste také nastavit\n" -"podpisový klíč (dočasný klíč již mohl být vygenerován automaticky).\n" +"„config.yml“, abyste nastavili adresu URL, název repozitáře a další údaje. Měli byste také\n" +"nastavit podpisový klíč (dočasný klíč již mohl být vygenerován automaticky).\n" "\n" "Další informace: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "a https://f-droid.org/docs/Signing_Process" @@ -1812,7 +1812,7 @@ msgstr "Došlo k neznámé chybě!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" -msgstr "Neznámý soubor ‚{filename}‘ v sestavení ‚{versionName}‘" +msgstr "Neznámý soubor „{filename}“ v sestavení „{versionName}“" #: ../fdroidserver/metadata.py #, python-format @@ -1839,12 +1839,12 @@ msgstr "Zbytečná mezera na konci" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" -msgstr "Nerozpoznané pole aplikace ‚{fieldname}‘ v ‚{path}‘" +msgstr "Nerozpoznané pole aplikace „{fieldname}“ v „{path}“" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" -msgstr "Nerozpoznaný příznak sestavení ‚{build_flag}‘ v ‚{path}‘" +msgstr "Nerozpoznaný příznak sestavení „{build_flag}“ v „{path}“" #: ../fdroidserver/update.py #, python-brace-format @@ -1930,7 +1930,7 @@ msgstr "Nahrávání {apkfilename} na androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" -msgstr "Nahrávání {apkfilename} na virustotal" +msgstr "Nahrávání {apkfilename} na VirusTotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2055,7 +2055,7 @@ msgstr "Pokud podpis nebo ověření selže, ukončit proces s chybovým kódem. #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" -msgstr "X.509 'Distinguished Name' používané při generování klíčů" +msgstr "X.509 „Distinguished Name“ používané při generování klíčů" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" @@ -2117,7 +2117,7 @@ msgstr "archive_url musí končit na /archive" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" -msgstr "argument \"-\" s režimem %r" +msgstr "argument „-“ s režimem %r" #: /usr/lib/python3.11/argparse.py #, python-format @@ -2130,12 +2130,12 @@ msgstr "pokus o holé připojení SSH k testování klíče pro nasazení:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" -msgstr "nelze parsovat specifikaci scrlib (není to řetězec): ‚{}‘" +msgstr "nelze zpracovat specifikaci scrlib (není to řetězec): „{}“" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "nelze otevřít '%(filename)s': %(error)s" +msgstr "nelze otevřít „%(filename)s“: %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" @@ -2201,19 +2201,19 @@ msgstr "konfliktní subparser: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" -msgstr "nepodařilo se parsovat '{path}'" +msgstr "nepodařilo se parsovat „{path}“" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "nepodařilo se parsovat srclib spec (není určen název): '{}'" +msgstr "nepodařilo se parsovat srclib spec (není určen název): „{}“" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "nepodařilo se parsovat srclib spec (není určen ref): '{}'" +msgstr "nepodařilo se parsovat srclib spec (není určen ref): „{}“" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "nepodařilo se parsovat srclib spec (příliš mnoho značek '@'): '{}'" +msgstr "nepodařilo se parsovat srclib spec (příliš mnoho značek „@“): „{}“" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2248,11 +2248,11 @@ msgstr "dest= je vyžadován pro možnosti jako %r" #: ../fdroidserver/scanner.py msgid "downloading '{}'" -msgstr "stahování ‚{}‘" +msgstr "stahování „{}“" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" -msgstr "stahování podpisů skeneru z ‚{}‘ se nezdařilo" +msgstr "stahování podpisů skeneru z „{}“ se nezdařilo" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" @@ -2300,7 +2300,7 @@ msgstr "floating-point" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." -msgstr "vynutit, aby chyby metadat (výchozí) byly varovány nebo vyly ignorovány." +msgstr "vynutit, aby chyby metadat (výchozí) byly varování nebo byly ignorovány." #: ../fdroidserver/common.py msgid "git svn clone failed" @@ -2371,7 +2371,7 @@ msgstr "poslední recept sestavení je novější: starý vercode={old}, nový v #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" -msgstr "local_copy_dir nekončí s \"fdroid\", možná jste měli na mysli: \"{path}\"" +msgstr "local_copy_dir nekončí s „fdroid“, možná jste měli na mysli: „{path}“" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" @@ -2384,7 +2384,7 @@ msgstr "local_copy_dir musí být adresář, ne soubor!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" -msgstr "mirror '%s' nekončí s 'fdroid'!" +msgstr "mirror „%s“ nekončí s „fdroid“!" #: ../fdroidserver/index.py #, python-brace-format @@ -2405,7 +2405,7 @@ msgstr "příští aktualizace mezipaměti {name} proběhne za {time}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" -msgstr "žádná \"icon\" v {appid}" +msgstr "žádná „icon“ v {appid}" #: ../fdroidserver/signatures.py msgid "no APK supplied" @@ -2537,12 +2537,12 @@ msgstr "chybějící podpis v referenčním binárním souboru" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "odmítnout stahování přes nezabezpečené spojení HTTP (použít HTTPS nebo upřesnit --no-https-check): {apkfilename}" +msgstr "odmítnout stahování přes nezabezpečené spojení HTTP (použijte HTTPS nebo upřesněte --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "repo_icon \"repo/icons/%s\" neexistuje, generování placeholderu." +msgstr "repo_icon „repo/icons/%s“ neexistuje, generování placeholderu." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" @@ -2570,7 +2570,7 @@ msgstr "s3cmd synchronizuje indexy z {path} do {url} a odstraní smazané" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" -msgstr "mezipaměť skeneru je poškozena! Můžete ji vymazat pomocí: ‚{clear}‘" +msgstr "mezipaměť skeneru je poškozena! Můžete ji vymazat pomocí: „{clear}“" #: ../fdroidserver/deploy.py msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" @@ -2724,7 +2724,7 @@ msgstr "{appid} chybí {name}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" -msgstr "{appid}: Neznámá extlib {path} v sestavení '{versionName}'" +msgstr "{appid}: Neznámá extlib {path} v sestavení „{versionName}“" #: ../fdroidserver/scanner.py #, python-brace-format @@ -2734,12 +2734,12 @@ msgstr "{appid}: žádná určená sestavení, běžím na současném stavu zdr #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "{appid}: {field} musí být '{type}', ale je '{fieldtype}!'" +msgstr "{appid}: {field} musí být „{type}“, ale je „{fieldtype}!“" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" -msgstr "{appid}: {field} musí být '{type}', ale je '{fieldtype}'!" +msgstr "{appid}: {field} musí být „{type}“, ale je „{fieldtype}“!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2759,7 +2759,7 @@ msgstr "{file} je prázdný nebo poškozený!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "{name} \"{section}/icons/{path}\" neexistuje! Zkontrolujte \"config.yml\"." +msgstr "{name} „{section}/icons/{path}“ neexistuje! Zkontrolujte „config.yml“." #: ../fdroidserver/common.py #, python-brace-format @@ -2779,7 +2779,7 @@ msgstr "{path} neexistuje! Vytvořte ji spuštěním:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "{path} má nesprávný podpis balíčku \"{pattern}\", možný exploit Janus!" +msgstr "{path} má nesprávný podpis balíčku „{pattern}“, možný exploit Janus!" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2829,12 +2829,12 @@ msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" -msgstr "{url} nekončí s \"fdroid\", zkontrolujte cestu URL!" +msgstr "{url} nekončí s „fdroid“, zkontrolujte cestu URL!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" -msgstr "{url} nezačíná s \"http\"!" +msgstr "{url} nezačíná s „http“!" #: ../fdroidserver/build.py msgid "{} build failed" From f9ddddf1c649daa0706d534116d1cef3ab5161b4 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Tue, 24 Sep 2024 09:32:36 +0000 Subject: [PATCH 1730/2116] Translated using Weblate: Japanese (ja) by Suguru Hirahara Currently translated at 11.3% (67 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ja/ --- locale/ja/LC_MESSAGES/fdroidserver.po | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 15552e67..63f2f5e9 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-18 23:55+0000\n" +"PO-Revision-Date: 2024-09-24 10:12+0000\n" "Last-Translator: Suguru Hirahara \n" "Language-Team: Japanese \n" "Language: ja\n" @@ -1852,7 +1852,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "%sに解凍しています" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -1898,12 +1898,12 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" -msgstr "" +msgstr "{apkfilename}をandroidobservatory.orgにアップロードしています" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" -msgstr "" +msgstr "{apkfilename}をvirustotalにアップロードしています" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -1950,7 +1950,7 @@ msgstr "" #: ../fdroidserver/common.py msgid "Using APK Signature v2" -msgstr "" +msgstr "APK署名バージョン2を使用" #: ../fdroidserver/common.py msgid "Using APK Signature v3" @@ -2344,11 +2344,11 @@ msgstr "local_copy_dir は「froid」で終わっていません、もしかし #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" -msgstr "local_copy_dir は絶対パスの必要があります!" +msgstr "local_copy_dir には絶対パスを指定してください!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" -msgstr "local_copy_dir はファイルではなくディレクトリにする必要があります!" +msgstr "local_copy_dir にはファイルではなくディレクトリーを指定してください!" #: ../fdroidserver/index.py #, python-format @@ -2378,7 +2378,7 @@ msgstr "" #: ../fdroidserver/signatures.py msgid "no APK supplied" -msgstr "" +msgstr "APKが指定されていません" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py From ba5ed944942afe1dfe00b591f62d7d2c0eb8730f Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Tue, 24 Sep 2024 12:10:51 +0000 Subject: [PATCH 1731/2116] Translated using Weblate: Japanese (ja) by Suguru Hirahara Currently translated at 18.2% (108 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ja/ --- locale/ja/LC_MESSAGES/fdroidserver.po | 84 +++++++++++++-------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 63f2f5e9..f3fbb1c0 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-24 10:12+0000\n" +"PO-Revision-Date: 2024-09-24 15:48+0000\n" "Last-Translator: Suguru Hirahara \n" "Language-Team: Japanese \n" "Language: ja\n" @@ -1928,15 +1928,15 @@ msgstr "" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." -msgstr "" +msgstr "`fdroid update -c`で作成。" #: ../fdroidserver/build.py msgid "Use build server" -msgstr "" +msgstr "ビルド用サーバーを使用" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" +msgstr "現在の時間の代わりにAPKの時間を、新しく追加されたAPKに使用" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1954,20 +1954,20 @@ msgstr "APK署名バージョン2を使用" #: ../fdroidserver/common.py msgid "Using APK Signature v3" -msgstr "" +msgstr "APK署名バージョン3を使用" #: ../fdroidserver/common.py msgid "Using JAR Signature" -msgstr "" +msgstr "JAR署名を使用" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" -msgstr "" +msgstr "JavaのjarsignerでAPKを検証することは推奨されません!apksignerを使ってください" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" -msgstr "" +msgstr "「{path}」のandroguardを使用" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1977,17 +1977,17 @@ msgstr "" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" -msgstr "" +msgstr "\"{path}\"にある既存のキーストアを使用" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using rclone to sync with: {url}" -msgstr "" +msgstr "Rcloneを使って {url} と同期" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" -msgstr "" +msgstr "s3cmdを使って {url} と同期" #: ../fdroidserver/__main__.py msgid "Valid commands are:" @@ -1995,7 +1995,7 @@ msgstr "正しいコマンド:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." -msgstr "" +msgstr "再ダウンロードする代わりにローカルにキャッシュ済のコピーで検証。" #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" @@ -2003,12 +2003,12 @@ msgstr "ダウンロードしたパッケージの一貫性を検証" #: ../fdroidserver/index.py msgid "Verifying index signature:" -msgstr "" +msgstr "インデックスの署名を検証:" #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "" +msgstr "VirusTotalのAPI鍵は32メガバイトより大きいファイルをアップロードできません。{url}から{path}をアップロードしてください。" #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" @@ -2016,7 +2016,7 @@ msgstr "潜在的なメタデータのエラーに関して警告" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" -msgstr "" +msgstr "署名済のインデックスに関して設定されている場合、この段階では署名されていないインデックスのみを作成します" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." @@ -2036,12 +2036,12 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "ZIP file archive" -msgstr "" +msgstr "ZIPファイルアーカイブ" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" -msgstr "" +msgstr "IdentityFileを{path}に追加" #: ../fdroidserver/update.py #, python-brace-format @@ -2199,11 +2199,11 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" -msgstr "" +msgstr "削除しています:repo/{apkfilename}" #: ../fdroidserver/scanner.py msgid "dependency file without lock" -msgstr "" +msgstr "ロックの存在しない依存ファイル" #: ../fdroidserver/common.py #, python-brace-format @@ -2219,7 +2219,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "downloading '{}'" -msgstr "" +msgstr "'{}'をダウンロードしています" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" @@ -2227,7 +2227,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" -msgstr "" +msgstr "実行可能なバイナリー、おそらくコードです" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2235,29 +2235,29 @@ msgstr "" #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" -msgstr[0] "" +msgstr[0] "%s個の引数が必要" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" -msgstr "" +msgstr "1つ以上の引数が必要です" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" -msgstr "" +msgstr "多くても1つの引数が必要です" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" -msgstr "" +msgstr "1つの引数が必要です" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" -msgstr "" +msgstr "fdroid [] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" @@ -2265,19 +2265,19 @@ msgstr "" #: /usr/lib/python3.11/optparse.py msgid "floating-point" -msgstr "" +msgstr "浮動小数点" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." -msgstr "" +msgstr "メタデータのエラー(既定)を警告として扱うよう強制するか、無視するよう強制。" #: ../fdroidserver/common.py msgid "git svn clone failed" -msgstr "" +msgstr "git svn clone を実行できませんでした" #: ../fdroidserver/scanner.py msgid "gzip file archive" -msgstr "" +msgstr "gzipファイルアーカイブ" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2298,7 +2298,7 @@ msgstr "" #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" -msgstr "" +msgstr "整数" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2330,7 +2330,7 @@ msgstr "" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" -msgstr "" +msgstr "ipfs_cid が見つかりません。CIDv1の生成をスキップします" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -2358,7 +2358,7 @@ msgstr "" #: ../fdroidserver/index.py #, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "" +msgstr "config.ymlと{path}で2回ミラーが設定されています!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2389,11 +2389,11 @@ msgstr "そうしたオプションはありません:%s" #: ../fdroidserver/__main__.py msgid "no version info found!" -msgstr "" +msgstr "バージョンの情報が見つかりません!" #: ../fdroidserver/checkupdates.py msgid "no version information found" -msgstr "" +msgstr "バージョンの情報が見つかりません" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2407,7 +2407,7 @@ msgstr "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" -msgstr "" +msgstr "引数 %s の1つが必要です" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" @@ -2481,7 +2481,7 @@ msgstr "オプションの引数" #: /usr/lib/python3.11/argparse.py msgid "options" -msgstr "" +msgstr "オプション" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2515,16 +2515,16 @@ msgstr "" #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" -msgstr "" +msgstr "repo_urlは/repoで終わる必要があります" #: ../fdroidserver/deploy.py #, python-brace-format msgid "rsync is missing or broken: {error}" -msgstr "" +msgstr "rsyncが無いか壊れています:{error}" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" +msgstr "ruamel.yamlがインストールされていません。メタデータを書き込めません。" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2539,7 +2539,7 @@ msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" -msgstr "" +msgstr "スキャナーのキャッシュの形式が正しくありません!「{clear}」で消去してください" #: ../fdroidserver/deploy.py msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" @@ -2635,7 +2635,7 @@ msgstr "使い方: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" -msgstr "" +msgstr "Apache libcloudを使って{url}と同期" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." From 97bdfcbe7cb93a0b0b819a0e6018870834bf958f Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Tue, 24 Sep 2024 18:14:24 +0000 Subject: [PATCH 1732/2116] Translated using Weblate: Japanese (ja) by Suguru Hirahara Currently translated at 20.4% (121 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ja/ --- locale/ja/LC_MESSAGES/fdroidserver.po | 28 +++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index f3fbb1c0..3be58008 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-24 15:48+0000\n" +"PO-Revision-Date: 2024-09-24 18:20+0000\n" "Last-Translator: Suguru Hirahara \n" "Language-Team: Japanese \n" "Language: ja\n" @@ -63,7 +63,7 @@ msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "" +msgstr "「{path}」はサポートされているファイルフォーマットではありません(metadata/*.ymlを使用してください)" #: ../fdroidserver/update.py #, python-brace-format @@ -121,7 +121,7 @@ msgstr "" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" -msgstr "" +msgstr "%sのSHA-256は誤っています:%s" #: ../fdroidserver/lint.py #, python-format @@ -178,7 +178,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" -msgstr "" +msgstr "「{path}」を実行できませんでした!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -208,11 +208,11 @@ msgstr ".__call__() は定義されていません" #: ../fdroidserver/lint.py msgid "/issues is missing" -msgstr "" +msgstr "/issuesがありません" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" -msgstr "" +msgstr "URLを引数として指定してください!" #: ../fdroidserver/common.py #, python-brace-format @@ -225,7 +225,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" -msgstr "" +msgstr "署名されていないリポジトリに、リポジトリの署名鍵を追加" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" @@ -234,15 +234,15 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" -msgstr "" +msgstr "{name}にのみ新しいリポジトリを追加" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" -msgstr "" +msgstr "キーストアのリポジトリの署名鍵のエイリアス" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "AllowedAPKSigningKeysが指定されていませんが、参照用バイナリーは指定されています" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" @@ -262,11 +262,11 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "Android APK file" -msgstr "" +msgstr "AndroidのAPKファイル" #: ../fdroidserver/scanner.py msgid "Android DEX code" -msgstr "" +msgstr "AndroidのDEXコード" #: ../fdroidserver/init.py #, python-brace-format @@ -2430,7 +2430,7 @@ msgstr "" #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" +msgstr "オプション %s:選択が正しくありません:%r(%sから選択してください)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py @@ -2458,7 +2458,7 @@ msgstr "オプション --%s に引数は指定できません" #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" -msgstr "" +msgstr "オプション --%s は一意のプリフィックスではありません" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py From 12b816421fd55727da3236547a5e5efd0ea8cec3 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Tue, 24 Sep 2024 18:48:57 +0000 Subject: [PATCH 1733/2116] Translated using Weblate: Japanese (ja) by Suguru Hirahara Currently translated at 25.0% (148 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ja/ --- locale/ja/LC_MESSAGES/fdroidserver.po | 56 +++++++++++++-------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 3be58008..644600db 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-24 18:20+0000\n" +"PO-Revision-Date: 2024-09-24 19:31+0000\n" "Last-Translator: Suguru Hirahara \n" "Language-Team: Japanese \n" "Language: ja\n" @@ -250,7 +250,7 @@ msgstr "" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" -msgstr "" +msgstr "完全なアーカイブのセクションもミラーリング" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" @@ -258,7 +258,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "Android AAR library" -msgstr "" +msgstr "AndroidのAARライブラリー" #: ../fdroidserver/scanner.py msgid "Android APK file" @@ -271,7 +271,7 @@ msgstr "AndroidのDEXコード" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "" +msgstr "AndroidのSDKが{path}で見つかりません!" #: ../fdroidserver/common.py #, python-brace-format @@ -345,7 +345,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" -msgstr "" +msgstr "symlinkが壊れています:{path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" @@ -353,7 +353,7 @@ msgstr "パッケージをソースコードからビルド" #: ../fdroidserver/build.py msgid "Build all applications available" -msgstr "" +msgstr "利用できる全てのアプリケーションをビルド" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" @@ -393,12 +393,12 @@ msgstr "" #: ../fdroidserver/lint.py msgid "Categories are not set" -msgstr "" +msgstr "カテゴリーが設定されていません" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" +msgstr "カテゴリーの「{category}」が規定されていますが、どのアプリによっても使用されていません!" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -443,20 +443,20 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" -msgstr "" +msgstr "システム上で「{command}」が見つかりませんでした" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" -msgstr "" +msgstr "最新のバージョンコードが見つかりませんでした" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" -msgstr "" +msgstr "最新のバージョン名が見つかりませんでした" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" -msgstr "" +msgstr "削除するパス {path} が見つかりませんでした" #: ../fdroidserver/update.py #, python-brace-format @@ -487,7 +487,7 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" -msgstr "" +msgstr "新しいコンテナー「{name}」を作成しました" #: ../fdroidserver/deploy.py #, python-brace-format @@ -554,7 +554,7 @@ msgstr "" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" -msgstr "" +msgstr "説明文に重複する行があります" #: ../fdroidserver/lint.py #, python-format @@ -620,17 +620,17 @@ msgstr "" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." -msgstr "" +msgstr "リポジトリのダウンロードは既に一度失敗しているので、再試行は行いません。" #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" -msgstr "" +msgstr "{url}をダウンロードできませんでした。{error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "" +msgstr "{path}での好ましくない機能に関する重複した宣言は無視されました!" #: ../fdroidserver/index.py #, python-format @@ -659,7 +659,7 @@ msgstr "" #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" -msgstr "" +msgstr "エラー:サポートされていない種類のCIです。パッチを歓迎します!" #: ../fdroidserver/nightly.py #, python-format @@ -699,7 +699,7 @@ msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" -msgstr "" +msgstr "リポジトリのアドレスを取得する際にエラーが発生しました" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" @@ -726,7 +726,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" -msgstr "" +msgstr "{path}を読み込めませんでした:{error}" #: ../fdroidserver/update.py #, python-brace-format @@ -741,16 +741,16 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" -msgstr "" +msgstr "APKの情報を取得できませんでした。{path}を削除します" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" -msgstr "" +msgstr "APKの情報を取得できませんでした。{path}をスキップします" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" -msgstr "" +msgstr "APKの署名鍵のフィンガープリントを取得できませんでした" #: ../fdroidserver/install.py #, python-brace-format @@ -780,7 +780,7 @@ msgstr "" #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" -msgstr "" +msgstr "終了" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" @@ -788,7 +788,7 @@ msgstr "" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" -msgstr "" +msgstr "禁止されているHTMLのタグ" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." @@ -820,7 +820,7 @@ msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" -msgstr "" +msgstr "いくつかのアプリのバージョンコードが正しくありません" #: ../fdroidserver/common.py #, python-brace-format @@ -880,11 +880,11 @@ msgstr "" #: ../fdroidserver/common.py msgid "Git fetch failed" -msgstr "" +msgstr "Git fetchを実行できませんでした" #: ../fdroidserver/common.py msgid "Git prune failed" -msgstr "" +msgstr "Git pruneを実行できませんでした" #: ../fdroidserver/common.py #, python-format From 14df3c3ec51bef70eee038bff89b49269dcb1d08 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Tue, 24 Sep 2024 19:31:46 +0000 Subject: [PATCH 1734/2116] Translated using Weblate: Japanese (ja) by Suguru Hirahara Currently translated at 25.1% (149 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ja/ --- locale/ja/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 644600db..cc7c9b8e 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-24 19:31+0000\n" +"PO-Revision-Date: 2024-09-24 19:32+0000\n" "Last-Translator: Suguru Hirahara \n" "Language-Team: Japanese \n" "Language: ja\n" @@ -876,7 +876,7 @@ msgstr "" #: ../fdroidserver/common.py msgid "Git clean failed" -msgstr "" +msgstr "Git cleanを実行できませんでした" #: ../fdroidserver/common.py msgid "Git fetch failed" From f3151bfb3e81bbd52b60dfdc6af210cf9faf1e0b Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Tue, 24 Sep 2024 19:32:03 +0000 Subject: [PATCH 1735/2116] Translated using Weblate: Japanese (ja) by Suguru Hirahara Currently translated at 25.3% (150 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ja/ --- locale/ja/LC_MESSAGES/fdroidserver.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index cc7c9b8e..245cbfdf 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -893,7 +893,7 @@ msgstr "" #: ../fdroidserver/common.py msgid "Git reset failed" -msgstr "" +msgstr "Git resetを実行できませんでした" #: ../fdroidserver/common.py msgid "Git submodule deinit failed" From dd98d45698baf8f3e92b3cc040989ebe7a8768a0 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Tue, 24 Sep 2024 19:32:29 +0000 Subject: [PATCH 1736/2116] Translated using Weblate: Japanese (ja) by Suguru Hirahara Currently translated at 25.6% (152 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ja/ --- locale/ja/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 245cbfdf..7e624d09 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-24 19:32+0000\n" +"PO-Revision-Date: 2024-09-24 19:33+0000\n" "Last-Translator: Suguru Hirahara \n" "Language-Team: Japanese \n" "Language: ja\n" @@ -954,7 +954,7 @@ msgstr "" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" -msgstr "" +msgstr "ミラーのビルド時のログを含める" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" @@ -985,7 +985,7 @@ msgstr "ビルドしたパッケージを端末にインストール" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." -msgstr "" +msgstr "%sをインストールしています…" #: ../fdroidserver/install.py #, python-brace-format From aae4d7f08a91a70b0b9e991b4c8b367068238b2e Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Tue, 24 Sep 2024 19:33:18 +0000 Subject: [PATCH 1737/2116] Translated using Weblate: Japanese (ja) by Suguru Hirahara Currently translated at 25.8% (153 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ja/ --- locale/ja/LC_MESSAGES/fdroidserver.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 7e624d09..02381422 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -990,7 +990,7 @@ msgstr "%sをインストールしています…" #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." -msgstr "" +msgstr "{dev}に「{apkfilename}」をインストールしています…" #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" From 770d31ce3ed9c958cdbb43de1d3af6fdb416be26 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Wed, 25 Sep 2024 09:25:51 +0000 Subject: [PATCH 1738/2116] Translated using Weblate: Japanese (ja) by Suguru Hirahara Currently translated at 48.3% (286 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ja/ --- locale/ja/LC_MESSAGES/fdroidserver.po | 277 +++++++++++++------------- 1 file changed, 140 insertions(+), 137 deletions(-) diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 02381422..b7b9a40e 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-24 19:33+0000\n" +"PO-Revision-Date: 2024-09-25 10:58+0000\n" "Last-Translator: Suguru Hirahara \n" "Language-Team: Japanese \n" "Language: ja\n" @@ -22,6 +22,8 @@ msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" +"\n" +"設定用の鍵として使用されるSSHの公開鍵:" #: ../fdroidserver/nightly.py #, python-brace-format @@ -29,6 +31,8 @@ msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" +"\n" +"DEBUG_KEYSTOREの秘密の変数にエンコードされる{path}:" #: ../fdroidserver/lint.py #, python-format @@ -48,7 +52,7 @@ msgstr "「{apkfilename}」はすでに{dev}にインストールされていま #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" +msgstr "「{path}」は古くなった{name}({version})を含んでいます" #: ../fdroidserver/update.py #, python-brace-format @@ -58,7 +62,7 @@ msgstr "「{path}」には最近の{name}({version})が含まれています #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" -msgstr "" +msgstr "「{path}」は存在しますがs3cmdがインストールされていません!" #: ../fdroidserver/lint.py #, python-brace-format @@ -68,7 +72,7 @@ msgstr "「{path}」はサポートされているファイルフォーマット #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "" +msgstr "「{path}」は許可されていない鍵で署名されています:" #: ../fdroidserver/import_subcommand.py #, python-brace-format @@ -81,7 +85,7 @@ msgstr "「{url}」は正しいURLではありません!" #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" +msgstr[0] "%(option)sのオプションは%(number)d個の引数が必要です" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -116,7 +120,7 @@ msgstr "%rは呼び出せません" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" -msgstr "" +msgstr "%sは辞書を生成しませんでした!" #: ../fdroidserver/signindex.py #, python-format @@ -124,16 +128,16 @@ msgid "%s has bad SHA-256: %s" msgstr "%sのSHA-256は誤っています:%s" #: ../fdroidserver/lint.py -#, python-format +#, fuzzy, python-format msgid "%s is not an accepted build field" -msgstr "" +msgstr "%sは承諾されたビルドの欄ではありません" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" -msgstr "" +msgstr "%sのオプションに値を設定することはできません" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" @@ -141,7 +145,7 @@ msgstr "「keypass」がconfig.ymlにありません!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" +msgstr "「keystore」がありません。また「smartcardoptions」が空です!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" @@ -153,13 +157,13 @@ msgstr "「keystorepass」がconfig.ymlにありません!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" -msgstr "" +msgstr "「repo_keyalias」がconfig.ymlにありません!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" -msgstr "" +msgstr "「required」は位置についての引数としては正しくありません" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" @@ -168,12 +172,12 @@ msgstr "「sdk_path」がconfig.ymlで設定されていません!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" -msgstr "'{aapt}' は古すぎます、froid は build-tools-{version} またはそれ以降が必要です!" +msgstr "「{aapt}」は古すぎます。fdroidはbuild-tools-{version}またはそれ以降が必要です!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" +msgstr "「{field}」の順番はランダムです!順番が重要な場合は () または [] の括弧を使用してください!" #: ../fdroidserver/common.py #, python-brace-format @@ -183,22 +187,22 @@ msgstr "「{path}」を実行できませんでした!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "「{path}」は正しいフォーマットではありません。辞書を指定してください!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" -msgstr "" +msgstr "「{value}」は {appid}の正しい{field}ではありません。正規表現のパターンは {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "" +msgstr "「{value}」は正しい{field}ではありません。{pattern}としてください" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" -msgstr "" +msgstr "…{appid}についてcheckupdateを実行できませんでした:{error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -217,11 +221,11 @@ msgstr "URLを引数として指定してください!" #: ../fdroidserver/common.py #, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "" +msgstr "APKの署名には{path}で異なる証明書があります:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" -msgstr "" +msgstr "リポジトリのパッケージにGnuPGを使用してPGP署名を追加" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" @@ -229,7 +233,7 @@ msgstr "署名されていないリポジトリに、リポジトリの署名鍵 #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" -msgstr "" +msgstr "メタデータが存在しないAPKにテンプレートのメタデータを追加" #: ../fdroidserver/update.py #, python-brace-format @@ -246,7 +250,7 @@ msgstr "AllowedAPKSigningKeysが指定されていませんが、参照用バイ #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" -msgstr "" +msgstr "最初のインポートの際に異なるリビジョン(またはgitのブランチ)を指定することを許可" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" @@ -254,7 +258,7 @@ msgstr "完全なアーカイブのセクションもミラーリング" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" -msgstr "" +msgstr "フォーマット上の問題についてもrewritemeta -lのように警告" #: ../fdroidserver/scanner.py msgid "Android AAR library" @@ -276,7 +280,7 @@ msgstr "AndroidのSDKが{path}で見つかりません!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" -msgstr "" +msgstr "AndroidのSDKのパス「{path}」がありません!" #: ../fdroidserver/common.py #, python-brace-format @@ -286,61 +290,61 @@ msgstr "Android SDK パス '{path}' はディレクトリではありません #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "" +msgstr "AndroidのSDKツール {cmd} が見つかりません!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "アプリにはバイナリーがありますが、それに対応する、証明書の固定用のAllowedAPKSigningKeysがありません。" #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" +msgstr "アプリにNoSourceSinceまたは、\"0 versions\"のArchivePolicyが設定されていますが、AutoUpdateModeまたはUpdateCheckModeはNoneに設定されていません" #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" +msgstr "アプリにNoSourceSinceまたは、\"0 versions\"か0のArchivePolicyが設定されていますが、AutoUpdateModeまたはUpdateCheckModeはNoneに設定されていません" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" -msgstr "" +msgstr "アプリは「{repo}」にありますが{url}へのリンクが指定されています" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "アプリのバージョンにはバイナリーがありますが、それに対応する、証明書の固定用のAllowedAPKSigningKeysがありません。" #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" -msgstr "" +msgstr ".gitを最初に置く必要はありません" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" -msgstr "" +msgstr "{apkfilename}のアーカイブの署名が正しくありません!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." -msgstr "" +msgstr "UpdateCheckModeが有効になっているAutoUpdateMode:HTTPにパターンを設定してください。" #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "正しくないエントリーの種類「{mirrortype}」がミラーの設定ファイルの中にあります:{mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" -msgstr "" +msgstr "ミラーのベースURLにはクエリーの文字列 ?fingerprint= を使ってインデックスの署名鍵を含めることができます。" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "" +msgstr "ブランチ「{branch}」が「{versionName}」のビルドのcommitとして使用されました" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" -msgstr "" +msgstr "ブランチ「{branch}」がsrclib「{srclib}」のcommitとして使用されました" #: ../fdroidserver/update.py #, python-brace-format @@ -357,39 +361,39 @@ msgstr "利用できる全てのアプリケーションをビルド" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" -msgstr "" +msgstr "ビルドが`fdroid import`により生成されました - 準備ができたら無効にする行を削除してください" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" -msgstr "" +msgstr "ビルドのメタデータのgitリポジトリにcommitされていない変更があります!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" -msgstr "" +msgstr "各パッケージの最新バージョンのみをビルド" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" -msgstr "" +msgstr "「%s」に基づきこの設定でリポジトリをビルドしました:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "CurrentVersionCodeが指定されていないアプリを自動更新することはできません" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" -msgstr[0] "" +msgstr[0] "スキャン時に{}個のエラーが発生したためビルドできません" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" -msgstr "" +msgstr "「{path}」を書き換えられません" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" -msgstr "" +msgstr "「%s」のカテゴリーは正しくありません" #: ../fdroidserver/lint.py msgid "Categories are not set" @@ -407,15 +411,15 @@ msgstr "アプリケーションの更新を確認" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "" +msgstr "{appid}のアーカイブをチェックしています - apks:{integer}, keepversions:{keep}, archapks:{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" -msgstr "" +msgstr "クリーンアップデート - キャッシュを使用せず、全てのAPKの再処理を行います" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." -msgstr "" +msgstr "コンマで区切られたカテゴリーの一覧。" #: ../fdroidserver/__main__.py #, python-format @@ -424,21 +428,21 @@ msgstr "コマンド '%s' は認識されません。\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" -msgstr "" +msgstr "変更をcommit" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" +msgstr "「{field}」の定義が.ymlと翻訳済の間で矛盾しています:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." -msgstr "" +msgstr "引数が矛盾しています:「--verbose」と「--quiet」を同時に設定することはできません。" #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "設定ファイルが矛盾しています。{newfile}を使用し、{oldfile}は無視します!" #: ../fdroidserver/common.py #, python-brace-format @@ -461,7 +465,7 @@ msgstr "削除するパス {path} が見つかりませんでした" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "" +msgstr "分析用にAPK {path} を開くことができませんでした: " #: ../fdroidserver/common.py #, python-brace-format @@ -470,15 +474,15 @@ msgstr "" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" -msgstr "" +msgstr "アプリケーションIDが見つかりませんでした" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" -msgstr "" +msgstr "バージョン情報が見つかりませんでした" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" -msgstr "" +msgstr "パッケージIDが見つかりませんでした" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" @@ -492,41 +496,41 @@ msgstr "新しいコンテナー「{name}」を作成しました" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." -msgstr "" +msgstr "s3cmdの設定用に「{path}」を作成します。" #: ../fdroidserver/publish.py msgid "Creating log directory" -msgstr "" +msgstr "ログ用のディレクトリーを作成します" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" -msgstr "" +msgstr "新しいS3のバケットを作成しています:{url}" #: ../fdroidserver/publish.py msgid "Creating output directory" -msgstr "" +msgstr "出力用のディレクトリを作成します" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" -msgstr "" +msgstr "この鍵(SHA256)で署名済のインデックスを作成します:" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" -msgstr "" +msgstr "一時ファイル用ディレクトリーを作成します" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" -msgstr "" +msgstr "署名されていないインデックスを署名用に準備します" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "" +msgstr "CurrentVersionCode {cv} が最も古いビルドのエントリーの{versionCode}よりも小さいです" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" -msgstr "" +msgstr "DEBUG_KEYSTOREが設定されていないか値が不完全です" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" @@ -535,22 +539,22 @@ msgstr "メタデータの無いAPKとOBBをリポジトリから削除" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "" +msgstr "アーカイブを削除しています。リポジトリが大きすぎます({size} 最大{limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "" +msgstr "git-mirrorの履歴を削除しています。リポジトリが大きすぎます({size} 最大{limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" -msgstr "" +msgstr "不明なファイルを削除します:{path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" -msgstr "" +msgstr "説明文「%s」は単にアプリの要約です" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" @@ -559,64 +563,64 @@ msgstr "説明文に重複する行があります" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" +msgstr "説明文に一覧がありますが(%s)、一覧は箇条書き(*)でも番号付き(#)でもありません" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" -msgstr "" +msgstr "説明文の長さは{length}ですが、最大の文字数は{limit}です" #: ../fdroidserver/common.py #, python-brace-format msgid "Did you mean config/{name}.yml?" -msgstr "" +msgstr "config/{name}.ymlではないでしょうか?" #: ../fdroidserver/lint.py #, python-brace-format msgid "Did you mean {code}?" -msgstr "" +msgstr "{code}ではないでしょうか?" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" -msgstr "" +msgstr "生成したビルドのエントリーに「disable:」を追加しない" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" -msgstr "" +msgstr "新しいファイルをリポジトリに設定しない" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" -msgstr "" +msgstr "「{path}」をURLに含めないでください!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" -msgstr "" +msgstr "AndroidのSDKのパスを確認せず、単に終了" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" -msgstr "" +msgstr "キーストアから生成した秘密鍵を削除しない" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" -msgstr "" +msgstr "ソースのtarballを作成しない。ビルドのテスト時に便利です" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" -msgstr "" +msgstr "リポジトリを更新しない。インターネットに接続していないときにビルドをテストする際に便利です" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" -msgstr "" +msgstr "rsyncのチェックサムを使用しない" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" -msgstr "" +msgstr "小さいリポジトリのミラーを完全にダウンロード" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "%sのダウンロード" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." @@ -635,17 +639,17 @@ msgstr "{path}での好ましくない機能に関する重複した宣言は無 #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "" +msgstr "ミラーの設定に重複するエントリー「%s」があります!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" -msgstr "" +msgstr "「{field}」のリンクが重複しています:{url}" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "エラー:%(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -669,12 +673,12 @@ msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" -msgstr "" +msgstr "エラー:{path}の{key}は「archive」でも「repo」でもありません!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" -msgstr "" +msgstr "エラー: {path}の{key}:{subkey}は許可されている鍵 {allowed_keys} の中にありません!" #: ../fdroidserver/__main__.py #, python-brace-format @@ -695,7 +699,7 @@ msgstr "" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "" +msgstr "「github_releases」を設定する際にエラーが発生しました。{}がありません(まず`fdroid update`を実行する必要があるかもしれません)。" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -703,7 +707,7 @@ msgstr "リポジトリのアドレスを取得する際にエラーが発生し #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" +msgstr "問題が発生した場合に0以外のコードを出力して終了" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" @@ -829,7 +833,7 @@ msgstr "" #: ../fdroidserver/common.py msgid "Found multiple Signer Certificates!" -msgstr "" +msgstr "署名者の複数の証明書が見つかりました!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -897,7 +901,7 @@ msgstr "Git resetを実行できませんでした" #: ../fdroidserver/common.py msgid "Git submodule deinit failed" -msgstr "" +msgstr "Git submodule deinitを実行できませんでした" #: ../fdroidserver/common.py msgid "Git submodule sync failed" @@ -933,7 +937,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "" +msgstr "manifestの正しくない要素を無視します:%s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -950,7 +954,7 @@ msgstr "" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" -msgstr "" +msgstr "ミラーのPGP署名の .ascファイルを含める" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" @@ -1106,7 +1110,7 @@ msgstr "" #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "" +msgstr "既知のデバッグ鍵がAllowedAPKSigningKeysで使われています: " #: ../fdroidserver/lint.py #, python-brace-format @@ -1152,7 +1156,7 @@ msgstr "" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" +msgstr "好ましくない機能の宣言を翻訳済のファイルに移動します:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" @@ -1247,7 +1251,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "No version information could be found." -msgstr "" +msgstr "バージョンの情報が見つかりませんでした。" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" @@ -1286,15 +1290,15 @@ msgstr "" #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "" +msgstr "「github_releases」の設定項目の1つに「projectUrl」の値が設定されていません。スキップします…" #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." -msgstr "" +msgstr "「github_releases」の設定項目の1つに「packageNames」の値が設定されていません。スキップします…" #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." -msgstr "" +msgstr "「github_releases」の設定項目の1つに「token」の値が設定されていません。スキップします…" #: ../fdroidserver/update.py #, python-brace-format @@ -1421,7 +1425,7 @@ msgstr "" #: ../fdroidserver/deploy.py msgid "Pushing to remote server failed!" -msgstr "" +msgstr "遠隔サーバーに送信できませんでした!" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1458,7 +1462,7 @@ msgstr "" #: ../fdroidserver/build.py msgid "Refresh and cache scanner rules and signatures from the network" -msgstr "" +msgstr "スキャナーのルールと署名をネットワークから取得して更新し、キャッシュ" #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1510,7 +1514,7 @@ msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" -msgstr "" +msgstr "{cibase}で-debug.apkを検索し、repo_basedir {repo_basedir} をスキップ" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1528,7 +1532,7 @@ msgstr "" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "" +msgstr "{url}のSHA-256がエントリーと合致しません!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." @@ -1541,7 +1545,7 @@ msgstr "パッケージのソースコードを読み込む" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" -msgstr "" +msgstr "スキャナーは{apk}に{count}個の問題を発見しました" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1715,7 +1719,7 @@ msgstr "" #: ../fdroidserver/mirror.py msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "" +msgstr "このコマンドは f-droid.org のミラーでは使用を避けてください!完全なコピーには600GB以上が必要となります。" #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." @@ -1744,7 +1748,7 @@ msgstr "" #: ../fdroidserver/deploy.py msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" -msgstr "" +msgstr "rcloneを使用するには、rclone_configとawsbucketをconfig.ymlに設定する必要があります!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1870,7 +1874,7 @@ msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" -msgstr "" +msgstr "UpdateCheckDataは整数(\\d または [0-9])のバージョンコードに合致する必要があります:{codeex}" #: ../fdroidserver/lint.py #, python-brace-format @@ -1884,12 +1888,12 @@ msgstr "" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "" +msgstr "UpdateCheckModeが設定されていますがcheckupdatesがまだ実行されていないようです。" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" +msgstr "UpdateCheckModeが設定されていますがlikecheckupdatesが実行されていないようです" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -1920,7 +1924,7 @@ msgstr "使い方: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "" +msgstr "既定のブランチでファイルを指定する際に /master または /main の代わりに /HEADを使用" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" @@ -1946,7 +1950,7 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for syncing with remote storage." -msgstr "" +msgstr "「{path}」を遠隔ストレージとの同期に使用。" #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -1972,7 +1976,7 @@ msgstr "「{path}」のandroguardを使用" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" -msgstr "" +msgstr "{path}の内容の代わりに空の辞書を使用します!" #: ../fdroidserver/init.py #, python-brace-format @@ -2024,7 +2028,7 @@ msgstr "" #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." -msgstr "" +msgstr "署名または検証ができなかった場合、エラーコードを出力して終了します。" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2095,7 +2099,7 @@ msgstr "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" -msgstr "" +msgstr "引数 %(argument_name)s:%(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" @@ -2112,7 +2116,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" -msgstr "" +msgstr "HTTPSでないURLは開けません:'{};" #: ../fdroidserver/build.py #, python-brace-format @@ -2162,12 +2166,12 @@ msgstr[0] "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser alias: %s" -msgstr "" +msgstr "矛盾するサブパーサーのエイリアス:%s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser: %s" -msgstr "" +msgstr "サブパーサーが矛盾しています:%s" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2176,7 +2180,7 @@ msgstr "" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "" +msgstr "srclibの規定をパースできませんでした(名前が指定されていません):'{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" @@ -2223,7 +2227,7 @@ msgstr "'{}'をダウンロードしています" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" -msgstr "" +msgstr "スキャナーの署名を'{}'からダウンロードできませんでした" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" @@ -2261,7 +2265,7 @@ msgstr "fdroid [] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" -msgstr "" +msgstr "ウェブから署名の最新のバージョンを取得" #: /usr/lib/python3.11/optparse.py msgid "floating-point" @@ -2369,7 +2373,7 @@ msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" -msgstr "" +msgstr "次の{name}キャッシュの更新まで{time}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2492,7 +2496,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" -msgstr "" +msgstr "位置に関する引数" #: ../fdroidserver/common.py #, python-brace-format @@ -2501,7 +2505,7 @@ msgstr "" #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "" +msgstr "参照バイナリーに署名がありません" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2534,7 +2538,7 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "" +msgstr "s3cmdは{path}から{url}へインデックスを同期し、消去されたインデックスを削除します" #: ../fdroidserver/scanner.py #, python-brace-format @@ -2591,7 +2595,7 @@ msgstr "静的ライブラリー" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "" +msgstr "指定された参照バイナリーには許可された署名者 {signer} がいます" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2716,7 +2720,7 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" -msgstr "" +msgstr "{build_flag}にはリストまたは文字列を指定してください。指定された値:{value}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2751,28 +2755,27 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} has been flagged by virustotal {count} times:" -msgstr "" +msgstr "{path}はvirustotalにより{count}回マークされました。" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" +msgstr "{path}は{datatype}です。「キー:値」の辞書ではありません!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format -#| msgid "'sdk_path' not set in config.yml!" +#, python-brace-format msgid "{path} is not a standard config file!" -msgstr "「sdk_path」がconfig.ymlで設定されていません!" +msgstr "{path}は標準の設定ファイルではありません!" #: ../fdroidserver/index.py #, python-brace-format msgid "{path} is not list, but a {datatype}!" -msgstr "" +msgstr "{path}は{datatype}です。リストではありません!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "" +msgstr "{path}は{datatype}です。{expected_type}ではありません!" #: ../fdroidserver/update.py #, python-brace-format @@ -2787,7 +2790,7 @@ msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" +msgstr "{path}:「{code}」は有効なISO_3166-1 alpha-2の国コードではありません!" #: ../fdroidserver/update.py #, python-brace-format @@ -2807,9 +2810,9 @@ msgstr "" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" -msgstr[0] "" +msgstr[0] "{}個のビルドを行えませんでした" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" -msgstr[0] "" +msgstr[0] "{}個のビルドを行いました" From 5771cfe9f466717a80e5193ec0cbdee78a7a5aff Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Wed, 25 Sep 2024 14:46:47 +0000 Subject: [PATCH 1739/2116] Translated using Weblate: Japanese (ja) by Suguru Hirahara Currently translated at 99.6% (590 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ja/ --- locale/ja/LC_MESSAGES/fdroidserver.po | 625 +++++++++++++------------- 1 file changed, 318 insertions(+), 307 deletions(-) diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index b7b9a40e..333bd8ee 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-25 10:58+0000\n" +"PO-Revision-Date: 2024-09-26 13:16+0000\n" "Last-Translator: Suguru Hirahara \n" "Language-Team: Japanese \n" "Language: ja\n" @@ -470,7 +470,7 @@ msgstr "分析用にAPK {path} を開くことができませんでした: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" -msgstr "" +msgstr "サイズ「{size}」をパースできませんでした。種類「{type}」が正しくありません" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" @@ -486,7 +486,7 @@ msgstr "パッケージIDが見つかりませんでした" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" -msgstr "" +msgstr "既存の署名鍵の設定の上書きは行いません!" #: ../fdroidserver/deploy.py #, python-brace-format @@ -554,7 +554,7 @@ msgstr "不明なファイルを削除します:{path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" -msgstr "説明文「%s」は単にアプリの要約です" +msgstr "説明文「%s」がアプリの要約と同一です" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" @@ -653,13 +653,15 @@ msgstr "エラー:%(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" +msgstr "エラー:「server」のサブコマンドは削除されました。「deploy」を使用してください!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" +"エラー:このコマンドで f-droid.org のミラーリングを行わないでください!\n" +"f-droid.org の完全なミラーリングには200GB以上が必要となります。" #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" @@ -668,7 +670,7 @@ msgstr "エラー:サポートされていない種類のCIです。パッチ #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "" +msgstr "エラー:サポートされていないgitのホスト「%s」です。パッチを歓迎します!" #: ../fdroidserver/lint.py #, python-brace-format @@ -683,7 +685,7 @@ msgstr "エラー: {path}の{key}:{subkey}は許可されている鍵 {allowed_k #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "" +msgstr "エンコーディングは「{enc}」に設定されています。fdroidでエンコードに関する問題が生じる可能性があります。最良の結果のために「UTF-8」に設定してください。" #: ../fdroidserver/init.py #, python-format @@ -691,11 +693,13 @@ msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" +"ここにAndroidのSDK(%s)のパスを入力してください:\n" +"> " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "{configname}の環境変数 {var} が設定されていません!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" @@ -711,21 +715,21 @@ msgstr "問題が発生した場合に0以外のコードを出力して終了" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "" +msgstr "ソースリポジトリからアプリケーションのメタデータを抽出" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" -msgstr "" +msgstr "APKから署名を抽出" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" -msgstr "" +msgstr "{path}をコピーできませんでした:{error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" -msgstr "" +msgstr "「{apkfilename}」の署名を取得できませんでした:{error}" #: ../fdroidserver/update.py #, python-brace-format @@ -735,12 +739,12 @@ msgstr "{path}を読み込めませんでした:{error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" -msgstr "" +msgstr "{path}のサイズを変更できませんでした:{error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" -msgstr "" +msgstr "S3のバケットを作成できませんでした:{url}" #: ../fdroidserver/update.py #, python-brace-format @@ -759,26 +763,26 @@ msgstr "APKの署名鍵のフィンガープリントを取得できませんで #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" -msgstr "" +msgstr "「{apkfilename}」を{dev}にインストールできませんでした:{error}" #: ../fdroidserver/common.py msgid "Failed to sign application" -msgstr "" +msgstr "アプリケーションに署名できませんでした" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" -msgstr "" +msgstr "buildserveridをVMから取得しました:{buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" -msgstr "" +msgstr "「{apkfilename}」→「{sigdir}」の署名鍵を取得しました" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" -msgstr "" +msgstr "ファイルが処理中に消去されました:{path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py @@ -788,7 +792,7 @@ msgstr "終了" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" +msgstr "Flattrによる寄付の方法は、FlattrID: フィールドに属します" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" @@ -796,30 +800,30 @@ msgstr "禁止されているHTMLのタグ" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." -msgstr "" +msgstr "無効に設定されているアプリのビルドを強制し、スキャンの問題にかかわらず実行。テストモードでのみ許可。" #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" -msgstr "" +msgstr "{0}秒のタイムアウトの後でビルドを強制的に停止します!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." -msgstr "" +msgstr "無効に設定されているアプリとビルドを強制的にスキャン。" #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" -msgstr "" +msgstr "アプリ「{name}」のメタデータなしに「{path}\"」のグラフィックを発見しました!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" -msgstr "" +msgstr "「{name}」の不正な調達用ファイル「{path}」が見つかりました:" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" -msgstr "" +msgstr "引数に不正なappidがあります" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py @@ -829,7 +833,7 @@ msgstr "いくつかのアプリのバージョンコードが正しくありま #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "" +msgstr "複数のJAR署名ブロックファイルが{path}で見つかりました" #: ../fdroidserver/common.py msgid "Found multiple Signer Certificates!" @@ -838,45 +842,45 @@ msgstr "署名者の複数の証明書が見つかりました!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" -msgstr "" +msgstr "{appid}に複数のメタデータのファイルが見つかりました" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." -msgstr "" +msgstr "リポジトリの署名用の証明書が複数見つかりました。" #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." -msgstr "" +msgstr "リポジトリの署名用の証明書が見つかりませんでした。" #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" -msgstr "" +msgstr "%sで不正なファイルが見つかりました" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" -msgstr "" +msgstr "{apkfilename}が{url}で見つかりました" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" -msgstr "" +msgstr "{filename}で{count}個の問題が見つかりました" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" -msgstr "" +msgstr "{filename}で{count}個の警告が見つかりました" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" -msgstr "" +msgstr "{appid}用に空のメタデータを生成しました" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" -msgstr "" +msgstr "Gitで「%s」のcheckoutを実行できませんでした" #: ../fdroidserver/common.py msgid "Git clean failed" @@ -893,7 +897,7 @@ msgstr "Git pruneを実行できませんでした" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" -msgstr "" +msgstr "Git remoteでset-headを実行できませんでした:\"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" @@ -905,34 +909,34 @@ msgstr "Git submodule deinitを実行できませんでした" #: ../fdroidserver/common.py msgid "Git submodule sync failed" -msgstr "" +msgstr "Git submodule syncを実行できませんでした" #: ../fdroidserver/common.py msgid "Git submodule update failed" -msgstr "" +msgstr "Git submodule updateを実行できませんでした" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" -msgstr "" +msgstr "SubversionのURLにはHTTPSを使用してください!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "" +msgstr "gitのミラーが大きくなった場合に、アーカイブの削除を許可" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "" +msgstr "このアップロードを行えなかった場合は、手動で{url}にアップロードしてみてください" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "" +msgstr "「{metapath}」の「{field}」のメタデータは非推奨となったため、無視します。" #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" -msgstr "" +msgstr "2024より長いFUNDING.ymlは無視します:%s" #: ../fdroidserver/update.py #, python-format @@ -941,16 +945,16 @@ msgstr "manifestの正しくない要素を無視します:%s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " -msgstr "" +msgstr "メタデータのないパッケージは無視します: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" -msgstr "" +msgstr "{apkfilename}の古いキャッシュデータを無視" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "" +msgstr "MD5などの無効に設定されているアルゴリズムで署名されているAPKを含める" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" @@ -962,25 +966,25 @@ msgstr "ミラーのビルド時のログを含める" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" -msgstr "" +msgstr "ミラーのソースコードのtarballを含める" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" -msgstr "" +msgstr "%s@%sのメタデータを含める" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" -msgstr "" +msgstr "{path}のメタデータを含める" #: ../fdroidserver/common.py msgid "Initialising submodules" -msgstr "" +msgstr "submoduleを初期化しています" #: ../fdroidserver/install.py msgid "Install all signed applications available" -msgstr "" +msgstr "署名済で利用できる全てのアプリケーションをインストール" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" @@ -1002,111 +1006,111 @@ msgstr "リポジトリのHTTPサーバーと通信" #: ../fdroidserver/update.py msgid "Invalid APK" -msgstr "" +msgstr "不正なAPKです" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "不正なAutoUpdateModeです:{mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "" +msgstr "不正なUpdateCheckModeです:{mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" -msgstr "" +msgstr "不正なVercodeOperationです:{field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" -msgstr "" +msgstr "不正なVercodeOperationです:{invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" -msgstr "" +msgstr "不正なアプリケーションIDです {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" -msgstr "" +msgstr "不正なブール値です '%s'" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" -msgstr "" +msgstr "不正な箇条書きリストです" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" -msgstr "" +msgstr "公開済のファイルの不正な名前です:%s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "不正なndkです:ビルドのエントリー:「{ndk}」" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " -msgstr "" +msgstr "非HTTPSへの不正なリダイレクトです:{before} → {after} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" -msgstr "" +msgstr "不正なscrlibのメタデータです:「{file}」はありません" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" -msgstr "" +msgstr "不正なscrlibのメタデータです:「{file}」をパースできませんでした" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "" +msgstr "不正なscrlibのメタデータです:「{file}」の「{key}」は不明な鍵です" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" -msgstr "" +msgstr "JAR署名を検証できませんでした:{path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" -msgstr "" +msgstr "JAR署名を検証しました:{path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" -msgstr "" +msgstr "JavaのJARファイル" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "" +msgstr "JavaのJDKが見つかりませんでした!標準的な場所にインストールするかjava_pathsを指定してください!" #: ../fdroidserver/scanner.py msgid "Java compiled class" -msgstr "" +msgstr "Javaのコンパイル済のクラス" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" -msgstr "" +msgstr "Javaのjarsignerが見つかりませんでした!標準的な場所にインストールするかjava_pathsを指定してください!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" -msgstr "" +msgstr "HTMLのsrc属性におけるJavaScript" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "" +msgstr "「{apkfilename}」の失敗したビルドを保存" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" -msgstr "" +msgstr "署名鍵用のキーストア:\t" #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " @@ -1115,44 +1119,44 @@ msgstr "既知のデバッグ鍵がAllowedAPKSigningKeysで使われています #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "" +msgstr "最後に使用されたcommit「{commit}」はタグのようですが、UpdateCheckModeは「{ucm}」です" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" -msgstr "" +msgstr "Liberapayによる寄付の方法は、Liberapay: フィールドに属します" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" -msgstr "" +msgstr "再フォーマットされるファイルのリスト(テスト)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" -msgstr "" +msgstr "ロケールはf-droid.orgのURLに含まれます" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" -msgstr "" +msgstr "例外発生時にビルドを停止" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." -msgstr "" +msgstr "リポジトリのミラーの形式が不正です。" #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" -msgstr "" +msgstr "serverwebrootの行の形式が不正です:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "" +msgstr "ZIPファイルの最大の再帰階層に到達しました:%s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." -msgstr "" +msgstr "完全なリポジトリとアーカイブ、全てのファイルの種類のミラーリング。" #: ../fdroidserver/gpgsign.py msgid "Missing output directory" -msgstr "" +msgstr "出力用ディレクトリーがありません" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" @@ -1160,94 +1164,94 @@ msgstr "好ましくない機能の宣言を翻訳済のファイルに移動し #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" +msgstr "「repo_pubkey」と「keystorepass」のいずれもconfig.ymlで設定されていません" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" -msgstr "" +msgstr "パッケージのAPKがありません:%s" #: ../fdroidserver/common.py msgid "No Android SDK found!" -msgstr "" +msgstr "AndroidのSDKが見つかりません!" #: ../fdroidserver/install.py msgid "No attached devices found" -msgstr "" +msgstr "接続している端末が見つかりません" #: ../fdroidserver/index.py msgid "No fingerprint in URL." -msgstr "" +msgstr "URLにフィンガープリントがありません。" #: ../fdroidserver/common.py msgid "No git submodules available" -msgstr "" +msgstr "利用できるgitのサブモジュールがありません" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" -msgstr "" +msgstr "gradleプロジェクトが見つかりませんでした。--subdirを指定しますか?" #: ../fdroidserver/import_subcommand.py msgid "No information found." -msgstr "" +msgstr "情報が見つかりません。" #: ../fdroidserver/checkupdates.py msgid "No matching tags found" -msgstr "" +msgstr "一致するタグが見つかりません" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "" +msgstr "SDKの最小バージョンが{0}で見つかりません。既定 (3) を使用します。" #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" -msgstr "" +msgstr "アプリが自由ソフトウェアであることを指定する必要はありません" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" -msgstr "" +msgstr "アプリがAndroid向けであることを指定する必要はありません" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" -msgstr "" +msgstr "オプションが設定されていません!config.ymlを編集して、以下の少なくとも1つを設定してください。" #: ../fdroidserver/common.py msgid "No packages specified" -msgstr "" +msgstr "パッケージが指定されていません" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" -msgstr "" +msgstr "利用できる%sの署名済のAPKがありません" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" -msgstr "" +msgstr "署名済の出力用ディレクトリーがありません - 何も実行しません" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" -msgstr "" +msgstr "{path}で署名用の証明書が見つかりません" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" -msgstr "" +msgstr "そのようなパッケージはありません:%s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" -msgstr "" +msgstr "アプリ {appid} にそのようなバージョンコード {versionCode} はありません" #: ../fdroidserver/checkupdates.py msgid "No tags found" -msgstr "" +msgstr "タグが見つかりません" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" -msgstr "" +msgstr "署名されていないディレクトリーがありません - 何も実行しません" #: ../fdroidserver/__main__.py msgid "No version information could be found." @@ -1255,38 +1259,38 @@ msgstr "バージョンの情報が見つかりませんでした。" #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" -msgstr "" +msgstr "正しいサイズの定義ではありません:「{}」" #: ../fdroidserver/signindex.py msgid "Nothing to do" -msgstr "" +msgstr "何も実行しません" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." -msgstr "" +msgstr "{appid}について実行することは何もありません。" #: ../fdroidserver/init.py msgid "Now set these in config.yml:" -msgstr "" +msgstr "これらをconfig.ymlに設定してください:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" -msgstr "" +msgstr "OBBのファイルはどのAPKよりも新しいバージョンコード({integer})を備えています:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" -msgstr "" +msgstr "OBBのファイル名は「main.」または「patch.」から始まる必要があります:" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" -msgstr "" +msgstr "OBBのパッケージ名はサポートしているAPKと一致しません:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" +msgstr "オフラインのマシンです。`fdroid deploy` を実行するまでgitのミラーの生成はスキップします" #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." @@ -1303,19 +1307,19 @@ msgstr "「github_releases」の設定項目の1つに「token」の値が設定 #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" -msgstr "" +msgstr "画像にはPNGとJPEGのみをサポートします。これが見つかりました:{path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" -msgstr "" +msgstr "Play Storeとの違いのみを出力" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" -msgstr "" +msgstr "自動アップデートのアプリのみを処理" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "" +msgstr "OpenCollectiveの寄付の方法はOpenCollective: フィールドに属します" #: /usr/lib/python3.11/optparse.py msgid "Options" @@ -1323,105 +1327,105 @@ msgstr "オプション" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." -msgstr "" +msgstr "APKに従った名前のファイルでJSONのレポートを出力。" #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." -msgstr "" +msgstr "標準出力にJSONを出力。" #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" -msgstr "" +msgstr "JSONを出力" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." -msgstr "" +msgstr "プロジェクト全体のライセンス。" #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "" +msgstr "{apkfilename}の空のバージョン名をメタデータで指定:{version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" -msgstr "" +msgstr "パッケージ「{appid}」は既に存在します" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" -msgstr "" +msgstr "「{path}」のmanifestをパースしています" #: ../fdroidserver/common.py msgid "Password required with username" -msgstr "" +msgstr "パスワードはユーザー名が必要です" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." -msgstr "" +msgstr "主なAndroidのプロジェクトのサブディレクトリーへのパス(ルートにない場合)。" #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" -msgstr "" +msgstr "AndroidのSDKへのパス(ANDROID_HOMEで設定されている場合があります)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" -msgstr "" +msgstr "ログとして使用するgitのリポジトリへのパス" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" -msgstr "" +msgstr "リポジトリの署名鍵のキーストアへのパス" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" -msgstr "" +msgstr "簡単にコピー、ペーストできるように秘密の変数をターミナルに出力" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" -msgstr "" +msgstr "ZIPファイルに問題が見つかりました:%s、エラー %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" -msgstr "" +msgstr "「{path}」のxmlに問題が見つかりました" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" -msgstr "" +msgstr "自動更新を実行" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" -msgstr "" +msgstr "{apkfilename}を処理" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" -msgstr "" +msgstr "{appid}を処理" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" -msgstr "" +msgstr "インデックスファイルに可読性があるXMLまたはJSONを出力" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." -msgstr "" +msgstr "プロジェクトのインポート元のURL。" #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" -msgstr "" +msgstr "句読点は使うべきではありません" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" -msgstr "" +msgstr "ログをこのgit remoteリポジトリに送信" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" -msgstr "" +msgstr "バイナリーの透明性のログを{url}に送信" #: ../fdroidserver/deploy.py msgid "Pushing to remote server failed!" @@ -1430,7 +1434,7 @@ msgstr "遠隔サーバーに送信できませんでした!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" -msgstr "" +msgstr "{url}に送信" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" @@ -1443,22 +1447,22 @@ msgstr "メタデータの全てのファイルを読み込んで終了" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" -msgstr "" +msgstr "「{config_file}」を読み込みます" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" -msgstr "" +msgstr "packageName/versionCode/versionNameを読み込めませんでした。不正なAPKです:「{apkfilename}」" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" -msgstr "" +msgstr "packageName/versionCode/versionNameを読み込めませんでした。不正なAPKです:「{apkfilename}」" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" -msgstr "" +msgstr "{apkfilename}をキャッシュから読み込みます" #: ../fdroidserver/build.py msgid "Refresh and cache scanner rules and signatures from the network" @@ -1466,12 +1470,12 @@ msgstr "スキャナーのルールと署名をネットワークから取得し #: ../fdroidserver/common.py msgid "Removing specified files" -msgstr "" +msgstr "指定されたファイルを削除" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "{path} を削除" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -1479,24 +1483,24 @@ msgstr "package.name_123.apkに合致しないAPKファイルの名前を変更" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "RepoTrunkのアップデートモードはgit-svnのリポジトリでのみ機能します" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" +msgstr "既存のサーバーに問題がない場合でも、サーバーをリセットして新しいビルド用サーバーを作成。" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" -msgstr "" +msgstr "指定したdebug.keystoreで{apkfilename}を再度署名" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" -msgstr "" +msgstr "最大のピクセルの大きさを超えている全てのアイコンのサイズを変更して終了" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" -msgstr "" +msgstr "警告とエラーのみを出力" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1505,11 +1509,11 @@ msgstr "メタデータの全てのファイルを書き換える" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" -msgstr "" +msgstr "「{appid}」を書き換えています" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" -msgstr "" +msgstr "commitされていない変更があるgitのリポジトリで実行" #: ../fdroidserver/nightly.py #, python-brace-format @@ -1518,16 +1522,16 @@ msgstr "{cibase}で-debug.apkを検索し、repo_basedir {repo_basedir} をス #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" -msgstr "" +msgstr "rewritemetaを実行してフォーマットを修正" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" -msgstr "" +msgstr "MD5のチェックを無効にして最初のチェックを実行しています" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" -msgstr "" +msgstr "{path}でwgetを実行しています" #: ../fdroidserver/index.py #, python-brace-format @@ -1536,7 +1540,7 @@ msgstr "{url}のSHA-256がエントリーと合致しません!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "" +msgstr "既知の不自由なクラスが無いかどうか、残っているAPKをスキャンして確認。" #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" @@ -1550,52 +1554,52 @@ msgstr "スキャナーは{apk}に{count}個の問題を発見しました" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" -msgstr "" +msgstr "スキャナーは{appid}に{count}個の問題を発見しました:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" -msgstr "" +msgstr "スキャナーは{appid}:{versionCode}に{count}個の問題を発見しました:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" -msgstr[0] "" +msgstr[0] "スキャナーは{}個の問題を発見しました" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." -msgstr "" +msgstr "既知の不自由なクラスが無いかどうか、APKをdexdumpでスキャンして確認。" #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "" +msgstr "NDK {release}({version})を設定" #: ../fdroidserver/common.py msgid "Set clock to that time using:" -msgstr "" +msgstr "以下を実行して時計の時間を合わせてください。" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "" +msgstr "アーカイブを開始するまでのリポジトリ内でのリリースの最大数を設定" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" -msgstr "" +msgstr "開くファイルの制限を{integer}に設定" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" -msgstr "" +msgstr "ナイトリービルドのリポジトリ向けにアプリのビルドを設定" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " -msgstr "" +msgstr "開くファイルの制限を設定できませんでした: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" -msgstr "" +msgstr "このビルドがタイムアウトになるまでの時間を{0}秒に設定しています" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" @@ -1607,128 +1611,128 @@ msgstr "「update --nosign」で作成したインデックスに署名" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" -msgstr "" +msgstr "バイナリーやその他の問題が無いかどうかに関するソースコードのスキャンをスキップ" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" -msgstr "" +msgstr "正しくない署名がある「{apkfilename}」をスキップします!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "リポジトリが大きすぎるため(>%.2fGB)GitLab Pagesのミラーリングをスキップします!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" -msgstr "" +msgstr "{appid}のインデックスの作成をスキップします" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" -msgstr "" +msgstr "正しくない署名がある{apkfilename}をスキップします!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" -msgstr "" +msgstr "{appid}をスキップ:無効に設定されています" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" -msgstr "" +msgstr "リポジトリを同期するローカルのフォルダーを指定" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" -msgstr "" +msgstr "rsyncを行う際にSSHに指定するIDファイルを指定" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." -msgstr "" +msgstr "使用するデバッグ用キーストアファイルを指定。" #: ../fdroidserver/common.py msgid "Spew out even more information than normal" -msgstr "" +msgstr "通常より多くの情報を出力" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" -msgstr "" +msgstr "{apkfilename}から不明な署名を削除します" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" -msgstr "" +msgstr "要約文「%s」 がアプリの名前と同一です" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" -msgstr "" +msgstr "要約の長さは{length}ですが、最大の文字数は{limit}です" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" -msgstr "" +msgstr "システムの時刻が{path}の日付よりも古いです!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" +msgstr "現在、タグのアップデートはgit、hg、bzr、git-svnのリポジトリでのみ機能します" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" +msgstr "タグのアップデートモードがgit-svnで使用されましたが、リポジトリはタグを使用するように設定されていませんでした" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." -msgstr "" +msgstr "テストモード - 既に出力が存在する場合でも、一時ディレクトリーに出力し、常にビルドを行います。" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" -msgstr "" +msgstr "OBBのバージョンコードは「{name}」の後に設定してください:" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" -msgstr "" +msgstr "ログを記録するリポジトリのベースとなるURL(既定:https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" -msgstr "" +msgstr "ミラーを書き込むディレクトリー" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" -msgstr "" +msgstr "リポジトリに含めるファイル(パスまたはglob)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." -msgstr "" +msgstr "リポジトリのフィンガープリントが合致しません。" #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" -msgstr "" +msgstr "Local_copy_dir \"{path}\" のルートディレクトリーは存在しません!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" -msgstr "" +msgstr "キーエイリアスが衝突しています - 公開作業は中止しました" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." -msgstr "" +msgstr "これらは、メインリポジトリからアーカイブされたアプリです。" #: ../fdroidserver/mirror.py msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "このコマンドは f-droid.org のミラーでは使用を避けてください!完全なコピーには600GB以上が必要となります。" +msgstr "このコマンドで f-droid.org のミラーリングを行わないでください!完全なコピーには600GB以上が必要となります。" #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" +msgstr "これは、F-Droidで使用できるアプリのリポジトリです。 このリポジトリのアプリケーションは、元のアプリケーション開発者によってビルドされた公式のバイナリーか、またはf-droid.orgの管理者によってソースコードからhttps://gitlab.com/fdroidのツールを使ってビルドされたバイナリーのどちらかです。" #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" -msgstr "" +msgstr "このリポジトリにはローカルのメタデータがあります:%s" #: ../fdroidserver/init.py #, python-format @@ -1741,10 +1745,17 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" +"設定を完了するには、APKを「%s」に追加してから\n" +"「fdroid update -c; fdroid update」を実行してください。その際には、\n" +"「config.yml」を編集して、URL、リポジトリの名前などを設定してください。\n" +"また、署名用の鍵も併せて設定することを推奨します(一時的な署名鍵が自動的に生成されている可能性があります)。\n" +"\n" +"詳細については、https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"または https://f-droid.org/docs/Signing_Process をご覧ください。" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" +msgstr "awsbucketwを使うには、awssecretkeyとawsaccesskeyidをconfig.ymlに設定する必要があります!" #: ../fdroidserver/deploy.py msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" @@ -1752,34 +1763,34 @@ msgstr "rcloneを使用するには、rclone_configとawsbucketをconfig.ymlに #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" -msgstr "" +msgstr "URLは https:// または http:// から始まる必要があります" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" -msgstr "" +msgstr "URL短縮ソフトウェアは使用しないでください" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" -msgstr "" +msgstr "説明文にあるURL {url}:{error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "" +msgstr "予期されていないライセンスタグ「{}」です!https://spdx.org/license-list から、FSFまたはOSIにより認証されたタグのみを使用してください" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "" +msgstr "予期しないライセンスタグ「{}」です!設定ファイルで設定されたライセンスタグのみを使用してください" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" +msgstr "予期していないsymlinkのターゲットです:{link} → {target}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "" +msgstr "{configname}の不明なエントリー {key} です" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" @@ -1789,69 +1800,69 @@ msgstr "不明な例外が発生しました!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" -msgstr "" +msgstr "ビルド「{versionName}」の不明なファイル「{filename}」" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" -msgstr "" +msgstr "メタデータのフォーマットが不明です:%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" -msgstr "" +msgstr "メタデータのフォーマットが不明です:{path}(*.ymlを使ってください)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " -msgstr "" +msgstr "aaptのバージョンが不明です。問題が生じる可能性があります: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" -msgstr "" +msgstr "不要なスペースが先頭にあります" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" -msgstr "" +msgstr "不要なスペースが末尾にあります" #: ../fdroidserver/metadata.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" -msgstr "" +msgstr "認識されないアプリの欄「{fieldname}」が「{path}」にあります" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" -msgstr "" +msgstr "認識されないビルド用のオプション「{build_flag}」が「{path}」にあります" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" -msgstr "" +msgstr "リポジトリの画像にサポートされていないファイルの種類「{extension}」が使用されています" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" -msgstr "" +msgstr "サポートされていない画像ファイルが見つかりました:{path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" -msgstr "" +msgstr "使われていないextlibが%sにあります" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" -msgstr "" +msgstr "使われていないファイルが%sにあります" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" -msgstr "" +msgstr "使われていないscandeleteのパス:%s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" -msgstr "" +msgstr "使われていないscanignoreのパス:%s" #: ../fdroidserver/common.py #, python-format @@ -1869,7 +1880,7 @@ msgstr "URLに関するバイナリーの透明性のログを更新" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" -msgstr "" +msgstr "UpdateCheckDataのURLが正しくありません:{url}" #: ../fdroidserver/lint.py #, python-brace-format @@ -1879,12 +1890,12 @@ msgstr "UpdateCheckDataは整数(\\d または [0-9])のバージョンコ #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" -msgstr "" +msgstr "UpdateCheckDataにはHTTPSのURLを指定してください:{url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" -msgstr "" +msgstr "UpdateCheckDataは正しいURLではありません:{url}" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." @@ -1897,7 +1908,7 @@ msgstr "UpdateCheckModeが設定されていますがlikecheckupdatesが実行 #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "" +msgstr "UpdateCheckNameが既知のアプリケーションIDに設定されています。これは削除できます" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1928,7 +1939,7 @@ msgstr "既定のブランチでファイルを指定する際に /master また #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" +msgstr "既定のブランチでファイルを指定する際に /master の代わりに /HEADを使用" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." @@ -1945,7 +1956,7 @@ msgstr "現在の時間の代わりにAPKの時間を、新しく追加された #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." -msgstr "" +msgstr "「{path}」をs3cmdの設定に使用。" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1995,7 +2006,7 @@ msgstr "s3cmdを使って {url} と同期" #: ../fdroidserver/__main__.py msgid "Valid commands are:" -msgstr "正しいコマンド:" +msgstr "正しいコマンドは以下の通りです。" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." @@ -2024,7 +2035,7 @@ msgstr "署名済のインデックスに関して設定されている場合、 #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "" +msgstr "リポジトリ全体をチェックする際、yamllintは既定で無効に設定されます。このオプションを使うと、yamllintを強制的に実行します。" #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." @@ -2032,11 +2043,11 @@ msgstr "署名または検証ができなかった場合、エラーコードを #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" -msgstr "" +msgstr "鍵の生成時に使用する X.509 'Distinguished Name'" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" -msgstr "" +msgstr "以下のようにANDROID_HOMEでSDKへのパスを設定できます。" #: ../fdroidserver/scanner.py msgid "ZIP file archive" @@ -2050,7 +2061,7 @@ msgstr "IdentityFileを{path}に追加" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" -msgstr "" +msgstr "{name}: {path} に追加" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2068,33 +2079,33 @@ msgstr "オプションが曖昧です:%s(%s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "" +msgstr "apksignerが見つかりません!最近のAPKに署名を行ったり検証したりすることはできません" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" -msgstr "" +msgstr "apksignerが見つかりません。署名を行うには必要です!" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" -msgstr "" +msgstr "実行用のファイルのアプリケーションID" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" -msgstr "" +msgstr "APPID[:VERCODE] 形式でversionCodeを指定した(オプション)アプリケーションID" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" -msgstr "" +msgstr "archive_url は /archive で終了する必要があります" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" -msgstr "" +msgstr "モード %r の引数 \"-\"" #: /usr/lib/python3.11/argparse.py #, python-format @@ -2103,16 +2114,16 @@ msgstr "引数 %(argument_name)s:%(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" -msgstr "" +msgstr "SSH接続でデプロイ用の鍵をテストします。" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" -msgstr "" +msgstr "srclibの規定をパースできません(文字列ではありません):'{}'" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "" +msgstr "「%(filename)s」を開けません:%(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" @@ -2121,39 +2132,39 @@ msgstr "HTTPSでないURLは開けません:'{};" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" -msgstr "" +msgstr "必要なsrclibsが見つかりません:「{path}」" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" -msgstr "" +msgstr "サブパーサーの複数の引数を指定することはできません" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" -msgstr "" +msgstr "アクションをマージできません - 2つのグループが%rと名付けられています" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" -msgstr "" +msgstr "更新を公開できません。デプロイ用の鍵を設定しましたか?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" -msgstr "" +msgstr "{url}のcloneを行います" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" -msgstr "" +msgstr "プラグインモジュールのコマンド:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" -msgstr "" +msgstr "コンプレックス" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2161,7 +2172,7 @@ msgstr "" #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" -msgstr[0] "" +msgstr[0] "オプションの文字列が矛盾しています:%s" #: /usr/lib/python3.11/argparse.py #, python-format @@ -2176,7 +2187,7 @@ msgstr "サブパーサーが矛盾しています:%s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" -msgstr "" +msgstr "「{path}」をパースできませんでした" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no name specified): '{}'" @@ -2184,21 +2195,21 @@ msgstr "srclibの規定をパースできませんでした(名前が指定さ #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "" +msgstr "srclibの規定をパースできませんでした(refが指定されていません):'{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" +msgstr "srclibの規定をパースできませんでした(「@」が多すぎます):'{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" -msgstr "" +msgstr "{path}を作成しました" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "現在のバージョンの方が新しいです:以前のvercode={old}、新しいvercode={new}" #: ../fdroidserver/update.py #, python-brace-format @@ -2212,14 +2223,14 @@ msgstr "ロックの存在しない依存ファイル" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" -msgstr "" +msgstr "{path}の処理ログを{dest}に設定しました" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" -msgstr "" +msgstr "%rなどのオプションにはdest= が必要です" #: ../fdroidserver/scanner.py msgid "downloading '{}'" @@ -2288,15 +2299,15 @@ msgstr "gzipファイルアーカイブ" #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" -msgstr "" +msgstr "明示的な引数 %r を無視しました" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" -msgstr "" +msgstr "index-v1には署名が必要です。`fdroid signindex`で署名を作成してください!" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "" +msgstr "index-v2には署名が必要です。`fdroid signindex`で署名を作成してください!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2309,28 +2320,28 @@ msgstr "整数" #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" -msgstr "" +msgstr "%(type)sの値が不正です:%(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "" +msgstr "不正な選択です:%(value)r(%(choices)sから選択してください)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" -msgstr "" +msgstr "conflict_resolutionの値が不正です:%r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" -msgstr "" +msgstr "%(option)rは不正なオプションの文字列です:%(prefix_chars)rで始まる必要があります" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" @@ -2339,7 +2350,7 @@ msgstr "ipfs_cid が見つかりません。CIDv1の生成をスキップしま #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "直近のビルドの仕様書の方が新しいです:以前のvercode={old}、新しいvercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2357,7 +2368,7 @@ msgstr "local_copy_dir にはファイルではなくディレクトリーを指 #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" -msgstr "" +msgstr "ミラー「%s」は「fdroid」で終わっていません!" #: ../fdroidserver/index.py #, python-brace-format @@ -2368,7 +2379,7 @@ msgstr "config.ymlと{path}で2回ミラーが設定されています!" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" -msgstr "" +msgstr "相互に排他的な引数はオプションとしてください" #: ../fdroidserver/scanner.py #, python-brace-format @@ -2378,7 +2389,7 @@ msgstr "次の{name}キャッシュの更新まで{time}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" -msgstr "" +msgstr "{appid}に「アイコン」がありません" #: ../fdroidserver/signatures.py msgid "no APK supplied" @@ -2404,7 +2415,7 @@ msgstr "バージョンの情報が見つかりません" #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" -msgstr "" +msgstr "引数 %s は許可されていません" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2415,19 +2426,19 @@ msgstr "引数 %s の1つが必要です" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" -msgstr "" +msgstr "文字列、リスト、タプルのみが許可" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" +msgstr "オプション %s:全ての署名済のアプリを本当にインストールしたい場合は、--allを使ってください" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" -msgstr "" +msgstr "オプション %s:不正 %s 値:%r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2490,7 +2501,7 @@ msgstr "オプション" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" -msgstr "" +msgstr "既存の{path}を上書きします" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2501,7 +2512,7 @@ msgstr "位置に関する引数" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" -msgstr "" +msgstr "{path}の処理ログを{dest}に設定できませんでした!" #: ../fdroidserver/build.py msgid "reference binary missing signature" @@ -2510,12 +2521,12 @@ msgstr "参照バイナリーに署名がありません" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "" +msgstr "安全でないHTTP接続によるダウンロードを拒否(HTTPSを使うか--no-https-checkを指定してください):{apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "" +msgstr "repo_icon \"repo/icons/%s\"が存在しません。プレースホルダーを生成します。" #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" @@ -2533,7 +2544,7 @@ msgstr "ruamel.yamlがインストールされていません。メタデータ #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" -msgstr "" +msgstr "s3cmdは{path}のインデックスを{url}に同期して削除" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2573,20 +2584,20 @@ msgstr "サイン済みのAPK。ファイルのパスかHTTPSのURL。" #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "" +msgstr "完全なビルドログの設置をスキップ:ログの中身はありません" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" -msgstr "" +msgstr "完全なビルドログの設置をスキップ:設定で有効にされていません" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" -msgstr "" +msgstr "ソースコードのtarballをスキップします:{path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" -msgstr "" +msgstr "srclibsに名前と「@」がありません" #: ../fdroidserver/scanner.py msgid "static library" @@ -2616,7 +2627,7 @@ msgstr "予期しないオプションの文字列です:%s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "" +msgstr "不明なパーサー %(parser_name)r(選択肢:%(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2643,79 +2654,79 @@ msgstr "Apache libcloudを使って{url}と同期" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "" +msgstr "virustotal.comはレート制限を行っています。再試行を待機しています…" #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" -msgstr[0] "" +msgstr[0] "{0}個のアプリ、{1}個の鍵のエイリアス" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" -msgstr "" +msgstr "{apkfilename}({appid})にメタデータがありません!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" +msgstr "{apkfilename}に複数の{name}のファイルがあります。マスターキーが悪用されているようです!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " -msgstr "" +msgstr "{apkfilename}のAndroidManifest.xmlの日付が正しくありません: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." -msgstr "" +msgstr "{appid}には名前が設定されていません!アプリケーションIDを代わりに使用します。" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" -msgstr "" +msgstr "{path}の{appid}は正しいAndroidのアプリケーションIDではありません!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" -msgstr "" +msgstr "{path}の{appid}は正しいJavaパッケージの名前ではありません!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid}にはAPKとファイルの両方があります:{files}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" -msgstr "" +msgstr "{appid}には{name}がありません" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" -msgstr "" +msgstr "{appid}:ビルド「{versionName}」のextlib {path}は不明です" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" -msgstr "" +msgstr "{appid}:ビルドが指定されていません。現在のソースコードに基づき実行します" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "" +msgstr "{appid}:{field}には「{fieldtype}」ではなく「{type}」を指定してください!" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" -msgstr "" +msgstr "{appid}:{field}には「{fieldtype}」ではなく「{type}」を指定してください!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" -msgstr "" +msgstr "{build_flag}には整数を指定してください。{value}が見つかりました" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2725,32 +2736,32 @@ msgstr "{build_flag}にはリストまたは文字列を指定してください #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" -msgstr "" +msgstr "{file}は空か壊れています!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "" +msgstr "{name}「{section}/icons/{path}」がありません!「config.yml」を確認してください。" #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "{oldfile}は非推奨です。{newfile}を使用してください" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" -msgstr "" +msgstr "{path}は既に存在します。インポートの結果は無視します!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" -msgstr "" +msgstr "{path}がありません!以下を実行して作成してください。" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "" +msgstr "{path}のファイル署名「{pattern}」は正しくありません。Janusの脆弱性による可能性があります!" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2780,12 +2791,12 @@ msgstr "{path}は{datatype}です。{expected_type}ではありません!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" -msgstr "" +msgstr "{path}の大きさは0です!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" -msgstr "" +msgstr "{path}は200MB以上です。手動で{url}にアップロードしてください" #: ../fdroidserver/lint.py #, python-brace-format @@ -2795,17 +2806,17 @@ msgstr "{path}:「{code}」は有効なISO_3166-1 alpha-2の国コードでは #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" -msgstr "" +msgstr "{path}:{error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" -msgstr "" +msgstr "{url}が「fdroid」で終わっていません。URLパスを確認してください!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" -msgstr "" +msgstr "{url}は「http」で始まっていません!" #: ../fdroidserver/build.py msgid "{} build failed" From 4a6bb9e0640411bb54824944e9d671a10dc7c054 Mon Sep 17 00:00:00 2001 From: pitroig Date: Sun, 29 Sep 2024 17:40:09 +0000 Subject: [PATCH 1740/2116] Translated using Weblate: Catalan (ca) by pitroig Currently translated at 100.0% (592 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ca/ --- locale/ca/LC_MESSAGES/fdroidserver.po | 35 +++++++++++++-------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index d2dd132c..73f3be76 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-08-26 17:39+0000\n" +"PO-Revision-Date: 2024-09-30 03:51+0000\n" "Last-Translator: pitroig \n" "Language-Team: Catalan \n" "Language: ca\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.7.1-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -680,12 +680,12 @@ msgstr "ERROR: no s'admet l'amfitrió git \"%s\", els pedaços són benvinguts!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" -msgstr "" +msgstr "ERROR: {key} a {path} no és \"arxiu\" o \"dipòsit\"!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" -msgstr "" +msgstr "ERROR: {key}:{subkey} a {path} no està a les claus permeses: {allowed_keys}!" #: ../fdroidserver/__main__.py #, python-brace-format @@ -708,7 +708,7 @@ msgstr "La variable d'entorn {var} de {configname} no està establerta!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "" +msgstr "S'ha produït un error en desplegar 'github_releases', no hi ha {}. (Pot ser necessari executar `fdroid update` primer.)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -1299,15 +1299,15 @@ msgstr "Màquina fora de línia, s'ometrà la generació del mirall git fins al #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "" +msgstr "Un dels elements de configuració 'github_releases' manca el valor 'projectUrl'. s'està ometent..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." -msgstr "" +msgstr "Un dels elements de configuració 'github_releases' manca el valor 'packageNames'. s'està ometent..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." -msgstr "" +msgstr "Un dels elements de configuració 'github_releases' manca el valor 'token'. s'està ometent..." #: ../fdroidserver/update.py #, python-brace-format @@ -1523,7 +1523,7 @@ msgstr "Executa en el diposit git que té canvis no publicats" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" -msgstr "" +msgstr "Executeu {cibase} per trobar -debug.apk. i omet repo_basedir {repo_basedir}" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1764,9 +1764,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "Per utilitzar awsbucket, awssecretkey i awsaccesskeyid també s'han d'establir a config.yml!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" -msgstr "Per utilitzar awsbucket, awssecretkey i awsaccesskeyid també s'han d'establir a config.yml!" +msgstr "Per utilitzar rclone, rclone_config i awsbucket s'han d'establir a config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1966,9 +1965,9 @@ msgid "Using \"{path}\" for configuring s3cmd." msgstr "S'està utilitzant \"{path}\" per configurar s3cmd." #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using \"{path}\" for syncing with remote storage." -msgstr "S'està utilitzant \"{path}\" per configurar s3cmd." +msgstr "S'està utilitzant \"{path}\" per a sincronitzar amb l'emmagatzematge remot." #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -2002,9 +2001,9 @@ msgid "Using existing keystore \"{path}\"" msgstr "S'està utilitzant l'espai de claus existent \"{path}\"" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using rclone to sync with: {url}" -msgstr "S'està utilitzant s3cmd per sincronitzar amb: {url}" +msgstr "S'està utilitzant el rclone per a sincronitzar-lo: {url}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2226,7 +2225,7 @@ msgstr "s'està suprimint: dipòsit/{apkfilename}" #: ../fdroidserver/scanner.py msgid "dependency file without lock" -msgstr "" +msgstr "fitxer de dependència sense blocatge" #: ../fdroidserver/common.py #, python-brace-format @@ -2556,9 +2555,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincronitza els índexs {path} a {url} i suprimeix" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "s3cmd sincronitza els índexs {path} a {url} i suprimeix" +msgstr "s3cmd sincronitza els índexs de {path} a {url} i esborra els suprimits" #: ../fdroidserver/scanner.py #, python-brace-format From cc2088d7bf8e45f504c2c297673cd11a4024fe9b Mon Sep 17 00:00:00 2001 From: Lily Chou Date: Tue, 1 Oct 2024 14:26:46 +0000 Subject: [PATCH 1741/2116] Translated using Weblate: Chinese (Simplified Han script) (zh_Hans) by Lily Chou Currently translated at 100.0% (592 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 29 +++++++++++----------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 9a104003..f708787b 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -33,13 +33,14 @@ # 大王叫我来巡山 , 2024. # chumoer , 2024. # Wang , 2024. +# Lily Chou , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-16 13:09+0000\n" -"Last-Translator: Wang \n" +"PO-Revision-Date: 2024-10-02 14:16+0000\n" +"Last-Translator: Lily Chou \n" "Language-Team: Chinese (Simplified Han script) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" @@ -706,12 +707,12 @@ msgstr "错误:不支持的 git 主机类型 \"%s\",欢迎提交补丁添加 #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" -msgstr "" +msgstr "错误: {path}中的{key}不是“archive”或“repo”!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" -msgstr "" +msgstr "错误: {path}中的{key}:{subkey}不再被允许的值的范围内: {allowed_keys}!" #: ../fdroidserver/__main__.py #, python-brace-format @@ -1549,7 +1550,7 @@ msgstr "在具有未提交更改的 git 存储库上运行" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" -msgstr "" +msgstr "在{cibase}中挨个寻找 -debug.apk,并跳过了仓库目录{repo_basedir}" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -2249,7 +2250,7 @@ msgstr "正在删除:repo/{apkfilename}" #: ../fdroidserver/scanner.py msgid "dependency file without lock" -msgstr "" +msgstr "没有锁的依赖文件" #: ../fdroidserver/common.py #, python-brace-format @@ -2726,7 +2727,7 @@ msgstr "{appid}来自{path}不是一个有效的Java安装包名称!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid}有两个apk文件:{files}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2737,7 +2738,7 @@ msgstr "{appid}缺失了{name}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" -msgstr "" +msgstr "{appid}:在构建版本‘{versionName}’时在{path}中遇到了未知的extlib" #: ../fdroidserver/scanner.py #, python-brace-format @@ -2757,12 +2758,12 @@ msgstr "{appid}:{field}必须为‘{type}’,但它是‘{fieldtype}’!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" -msgstr "" +msgstr "{build_flag}变量必须为整型,但是找到了{value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" -msgstr "" +msgstr "{build_flag}变量必须为列表或字符串,但是找到了{value}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2772,7 +2773,7 @@ msgstr "{file} 是空的或已损坏!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "" +msgstr "{name}的“{section}/icons/{path}”不存在!请检查配置文件“config.yml”。" #: ../fdroidserver/common.py #, python-brace-format @@ -2792,17 +2793,17 @@ msgstr "{path} 不存在!通过运行以下命令创建它:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "" +msgstr "{path}有损坏的签名“{pattern}”,也许是Janus的漏洞!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} has been flagged by virustotal {count} times:" -msgstr "" +msgstr "{path}被virustotal标记了{count}次:" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" +msgstr "{path}不是“键:值”模式,而是一个{datatype}!" #: ../fdroidserver/common.py #, python-brace-format From f37381e0ff4573960272a87958ae8195dfbfb489 Mon Sep 17 00:00:00 2001 From: Eryk Michalak Date: Sat, 5 Oct 2024 09:32:21 +0000 Subject: [PATCH 1742/2116] Translated using Weblate: Polish (pl) by Eryk Michalak Currently translated at 99.3% (588 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ --- locale/pl/LC_MESSAGES/fdroidserver.po | 49 +++++++++++++-------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 072de80d..1dd11baa 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -5,13 +5,14 @@ # mondstern , 2021. # Hans-Christoph Steiner , 2021, 2024. # Agnieszka C , 2021, 2022, 2023, 2024. +# Eryk Michalak , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-10 09:27+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2024-10-06 07:23+0000\n" +"Last-Translator: Eryk Michalak \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" @@ -682,12 +683,12 @@ msgstr "BŁĄD: nieobsługiwany host git „%s”, łatki mile widziane!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" -msgstr "" +msgstr "BŁĄD: {key} w {path} nie jest \"archive\" lub \"repo\"!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" -msgstr "" +msgstr "BŁĄD: {key}:{subkey} w {path} nie jest jednym z dozwolonych kluczy: {allowed_keys}!" #: ../fdroidserver/__main__.py #, python-brace-format @@ -1121,7 +1122,6 @@ msgid "Keystore for signing key:\t" msgstr "Magazyn kluczy do podpisywania klucza:\t" #: ../fdroidserver/lint.py -#, fuzzy msgid "Known debug key is used in AllowedAPKSigningKeys: " msgstr "Znany klucz debugowania jest używany w AllowedAPKSigningKeys: " @@ -1303,15 +1303,15 @@ msgstr "Maszyna Offline, pomijając generowanie git mirror aż do ' fdroid deplo #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "" +msgstr "Jeden z elementów 'github_releases' nie posiada wartości 'projectUrl'. pomijanie..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." -msgstr "" +msgstr "Jeden z elementów 'github_releases' nie posiada wartości 'packageNames'. pomijanie..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." -msgstr "" +msgstr "Jeden z elementów 'github_releases' nie posiada wartości 'token'. pomijanie..." #: ../fdroidserver/update.py #, python-brace-format @@ -1769,9 +1769,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "Aby użyć awsbucket, awssecretkey i awsaccesskeyid muszą być również ustawione w config.yml!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" -msgstr "Aby użyć awsbucket, awssecretkey i awsaccesskeyid muszą być również ustawione w config.yml!" +msgstr "Aby używać rclone, rclone_config i awsbucket muszą być one również ustawione w config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1947,9 +1946,8 @@ msgid "Usage: %s\n" msgstr "Użycie: %s\n" #: ../fdroidserver/lint.py -#, fuzzy msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "Użyj /HEAD zamiast/ master, aby wskazać plik w domyślnej gałęzi" +msgstr "Użyj /HEAD zamiast /master czy /main, aby wskazać plik w domyślnej gałęzi" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" @@ -1973,9 +1971,9 @@ msgid "Using \"{path}\" for configuring s3cmd." msgstr "Użyj \"{path}\" do konfiguracji s3cmd." #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using \"{path}\" for syncing with remote storage." -msgstr "Użyj \"{path}\" do konfiguracji s3cmd." +msgstr "Używanie \"{path}\" do synchronizacji ze zdalnym dyskiem." #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -1986,9 +1984,8 @@ msgid "Using APK Signature v3" msgstr "Używając APK Signature v3" #: ../fdroidserver/common.py -#, fuzzy msgid "Using JAR Signature" -msgstr "Używając APK Signature v2" +msgstr "Używanie podpisu JAR" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -2010,9 +2007,9 @@ msgid "Using existing keystore \"{path}\"" msgstr "Korzystanie z istniejącego magazynu kluczy \"{path}\"" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using rclone to sync with: {url}" -msgstr "Użyj s3cmd do synchronizacji z: {url}" +msgstr "Używanie rsync do synchronizacji z: {url}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2235,7 +2232,7 @@ msgstr "usuwanie: repo/{apkfilename}" #: ../fdroidserver/scanner.py msgid "dependency file without lock" -msgstr "" +msgstr "plik zależności bez blokady" #: ../fdroidserver/common.py #, python-brace-format @@ -2390,9 +2387,9 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "mirror '%s'nie kończy się na 'fdroid'!" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "lustra ustawione dwukrotnie, w config.yml i {path}!" +msgstr "serwery lustrzane zostały ustawione dwukrotnie w config.yml i {path}!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2566,9 +2563,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd zsynchronizuj indeksy {path} do {url} i usuń" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "s3cmd zsynchronizuj indeksy {path} do {url} i usuń" +msgstr "s3cmd synchronizuje indeksy z {path} do {url} i usuwa usunięte" #: ../fdroidserver/scanner.py #, python-brace-format @@ -2792,7 +2789,7 @@ msgstr "{path} została oznaczona przez virustotal {count} razy:" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" +msgstr "{path} nie jest słownikiem \"klucz: wartość\", lecz {datatype}!" #: ../fdroidserver/common.py #, python-brace-format @@ -2807,7 +2804,7 @@ msgstr "{path} inie jest listą, lecz {datatype}!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "" +msgstr "{path} nie jest {expected_type}, lecz {datatype}!" #: ../fdroidserver/update.py #, python-brace-format @@ -2822,7 +2819,7 @@ msgstr "{path} więcej niż 200MB, przesłane ręcznie: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" +msgstr "{path}: \"{code}\" nie jest prawidłowym kodem ISO_3166-1 alpha-2 country!" #: ../fdroidserver/update.py #, python-brace-format From d6a004da5642c0d79ef4df88dc3c1886a0b11299 Mon Sep 17 00:00:00 2001 From: ssantos Date: Mon, 7 Oct 2024 17:43:36 +0000 Subject: [PATCH 1743/2116] Translated using Weblate: Portuguese (pt) by ssantos Currently translated at 100.0% (592 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/ --- locale/pt/LC_MESSAGES/fdroidserver.po | 35 +++++++++++++-------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 1ecec5d7..1e4dfe3a 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-08-12 18:05+0000\n" +"PO-Revision-Date: 2024-10-07 18:58+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" "Language: pt\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.7-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -679,12 +679,12 @@ msgstr "ERRO: host de git \"%s\" não suportado, patches são bem-vindos!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" -msgstr "" +msgstr "ERRO: {key} em {path} não é um \"arquivamento\" ou \"repositório\"!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" -msgstr "" +msgstr "ERRO: {key}:{subkey} em {path} não está nas chaves permitidas: {allowed_keys}!" #: ../fdroidserver/__main__.py #, python-brace-format @@ -707,7 +707,7 @@ msgstr "A variável de ambiente {var} de {configname} não está definida!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "" +msgstr "Erro ao implementar 'github_releases', {} não está presente. (Talvez seja necessário executar `fdroid update` primeiro)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -1298,15 +1298,15 @@ msgstr "A máquina está offline, a saltar a geração de espelhos de git até o #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "" +msgstr "Um dos elementos de configuração 'github_releases' está faltando o valor 'projectUrl'. ignorando ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." -msgstr "" +msgstr "Um dos elementos de configuração 'github_releases' está faltando o valor 'packageNames'. ignorando ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." -msgstr "" +msgstr "Um dos elementos de configuração 'github_releases' está faltando o valor 'token'. ignorando ..." #: ../fdroidserver/update.py #, python-brace-format @@ -1522,7 +1522,7 @@ msgstr "Executar no repo git que tem alterações não confirmadas" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" -msgstr "" +msgstr "Execute {cibase} para encontrar -debug.apk. e ignore repo_basedir {repo_basedir}" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1763,9 +1763,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" -msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" +msgstr "Para usar rclone, rclone_config e awsbucket devem ser configurados em config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1965,9 +1964,9 @@ msgid "Using \"{path}\" for configuring s3cmd." msgstr "Usando \"{path}\" para configurar s3cmd." #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using \"{path}\" for syncing with remote storage." -msgstr "Usando \"{path}\" para configurar s3cmd." +msgstr "Usando \"{path}\" para a sincronização com armazenamento remoto." #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -2001,9 +2000,9 @@ msgid "Using existing keystore \"{path}\"" msgstr "Utilizando armazenamento de chave existente \"{path}\"" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using rclone to sync with: {url}" -msgstr "Usando s3cmd para sincronizar com: {url}" +msgstr "Usando rclone para sincronizar com: {url}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2225,7 +2224,7 @@ msgstr "apagando: repo/{apkfilename}" #: ../fdroidserver/scanner.py msgid "dependency file without lock" -msgstr "" +msgstr "ficheiro de dependência sem bloqueio" #: ../fdroidserver/common.py #, python-brace-format @@ -2555,9 +2554,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincroniza índices {path} para {url} e apaga" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "s3cmd sincroniza índices {path} para {url} e apaga" +msgstr "s3cmd sincroniza os índices de {path} para {url} e apagar índices removidos" #: ../fdroidserver/scanner.py #, python-brace-format From eec7addc16b2629aabf91d9d67470aaf254c3c60 Mon Sep 17 00:00:00 2001 From: Fat Potato Date: Wed, 9 Oct 2024 23:01:22 +0000 Subject: [PATCH 1744/2116] Translated using Weblate: Portuguese (Portugal) (pt_PT) by Fat Potato Currently translated at 98.3% (582 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_PT/ --- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 2d0f8fb3..f80ea7fa 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -5,13 +5,14 @@ # ssantos , 2020, 2021, 2022, 2023, 2024. # Hans-Christoph Steiner , 2020, 2022, 2024. # Peter J. Mello , 2021. +# Fat Potato , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-10 09:27+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2024-10-10 00:37+0000\n" +"Last-Translator: Fat Potato \n" "Language-Team: Portuguese (Portugal) \n" "Language: pt_PT\n" "MIME-Version: 1.0\n" @@ -680,12 +681,12 @@ msgstr "ERRO: host de git \"%s\" não suportado, patches são bem-vindos!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" -msgstr "" +msgstr "ERRO: {key} em {path} não é \"arquivo\" ou \"repositório\"!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" -msgstr "" +msgstr "ERRO: {key}:{subkey} em {path} não está nas chaves permitidas: {allowed_keys}!" #: ../fdroidserver/__main__.py #, python-brace-format From 7da3357d4793c3901ffbaafaa4348aa124f7c172 Mon Sep 17 00:00:00 2001 From: Golubev Alexander Date: Sat, 26 Oct 2024 07:59:14 +0000 Subject: [PATCH 1745/2116] Translated using Weblate: Russian (ru) by Golubev Alexander Currently translated at 100.0% (592 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ --- locale/ru/LC_MESSAGES/fdroidserver.po | 48 +++++++++++++-------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 52de30cb..8e5f7f0c 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -1,6 +1,6 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# Golubev Alexander , 2020, 2021. +# Golubev Alexander , 2020, 2021, 2024. # Mingun , 2020. # anonymous , 2020. # Andrey , 2020, 2021, 2022, 2023. @@ -20,15 +20,15 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-06-07 10:15+0000\n" -"Last-Translator: neverender \n" +"PO-Revision-Date: 2024-10-27 03:53+0000\n" +"Last-Translator: Golubev Alexander \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.6-dev\n" +"X-Generator: Weblate 5.8.2-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -309,16 +309,15 @@ msgstr "Инструмент Android SDK {cmd} не найден!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "Приложение имеет двоичные файлы, но не имеет соответствующего сертификата AllowedAPKSigningKeys для закрепления." +msgstr "У приложения задано поле Binaries, но не указано AllowedAPKSigningKeys, что необходимо, чтобы ограничить ключи подписи." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "Приложение имеет NoSourceSince или ArchivePolicy \"0 версий\", но AutoUpdateMode или UpdateCheckMode не равны None" +msgstr "У приложения задано поле NoSourceSince, или поле ArchivePolicy равно \"0 versions\", но AutoUpdateMode или UpdateCheckMode не равны None" #: ../fdroidserver/lint.py -#, fuzzy msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "Приложение имеет NoSourceSince или ArchivePolicy \"0 версий\" или 0, но AutoUpdateMode или UpdateCheckMode не None" +msgstr "У приложения задано поле NoSourceSince, или поле ArchivePolicy равно \"0 versions\" или \"0\", но AutoUpdateMode или UpdateCheckMode не равны None" #: ../fdroidserver/lint.py #, python-brace-format @@ -693,12 +692,12 @@ msgstr "ОШИБКА: неподдерживаемый хост git «%s», па #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" -msgstr "" +msgstr "ОШИБКА: {key} в {path} должен быть или \"archive\", или \"repo\"!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" -msgstr "" +msgstr "ОШИБКА: {key}:{subkey} в {path} не входит в список допустимых значений: {allowed_keys}!" #: ../fdroidserver/__main__.py #, python-brace-format @@ -721,7 +720,7 @@ msgstr "Переменная среды {var} из {configname} не устан #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "" +msgstr "Ошибка развёртывания 'github_releases', {} отсутствует. (Возможно, сначала вам нужно запустить `fdroid update`.)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -1312,15 +1311,15 @@ msgstr "Автономная система, пропуск генерации g #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "" +msgstr "В одном из 'github_releases' отсутствует значение 'projectUrl'; пропускаем ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." -msgstr "" +msgstr "В одном из 'github_releases' отсутствует значение 'packageNames'; пропускаем ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." -msgstr "" +msgstr "В одном из 'github_releases' отсутствует значение 'token'; пропускаем ..." #: ../fdroidserver/update.py #, python-brace-format @@ -1536,7 +1535,7 @@ msgstr "Запустить для репозитория git с несохран #: ../fdroidserver/nightly.py #, python-brace-format msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" -msgstr "" +msgstr "Просматриваем {cibase} в поиске -debug.apk (пропуская repo_basedir: {repo_basedir})" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1778,9 +1777,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "Необходимо определить переменные awsbucket, awssecretkey и awsaccesskeyid в config.yml!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" -msgstr "Необходимо определить переменные awsbucket, awssecretkey и awsaccesskeyid в config.yml!" +msgstr "Чтобы использовать rclone, в config.yml должны быть заданы rclone_config и awsbucket!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1980,9 +1978,9 @@ msgid "Using \"{path}\" for configuring s3cmd." msgstr "Для конфигурации s3cmd используется \"{path}\"." #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using \"{path}\" for syncing with remote storage." -msgstr "Для конфигурации s3cmd используется \"{path}\"." +msgstr "Для синхронизации с удалённым хранилищем используется путь \"{path}\"." #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -2016,14 +2014,14 @@ msgid "Using existing keystore \"{path}\"" msgstr "Используются ключи из \"{path}\"" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using rclone to sync with: {url}" -msgstr "s3cmd синхронизация с: {url}" +msgstr "Используется rclone для синхронизации с: {url}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" -msgstr "s3cmd синхронизация с: {url}" +msgstr "Используется s3cmd для синхронизации с: {url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" @@ -2241,7 +2239,7 @@ msgstr "удаление: repo/{apkfilename}" #: ../fdroidserver/scanner.py msgid "dependency file without lock" -msgstr "" +msgstr "файл зависимостей без блокировки" #: ../fdroidserver/common.py #, python-brace-format @@ -2572,9 +2570,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd синхронизировать индексы из {path} в {url} и удалить их" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "s3cmd синхронизировать индексы из {path} в {url} и удалить их" +msgstr "s3cmd синхронизирует индексы из {path} в {url} и удаляет стёртые" #: ../fdroidserver/scanner.py #, python-brace-format From 7ee9882be55a3dabf9734654eb41834e47bfa5ce Mon Sep 17 00:00:00 2001 From: WaldiS Date: Sat, 26 Oct 2024 18:41:27 +0000 Subject: [PATCH 1746/2116] Translated using Weblate: Polish (pl) by WaldiS Currently translated at 99.6% (590 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ --- locale/pl/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 1dd11baa..12fb1bf0 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -11,15 +11,15 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-10-06 07:23+0000\n" -"Last-Translator: Eryk Michalak \n" +"PO-Revision-Date: 2024-10-27 03:53+0000\n" +"Last-Translator: WaldiS \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.8.2-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -711,7 +711,7 @@ msgstr "Zmienna środowiskowa {var} z {configname} nie jest ustawiona!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "" +msgstr "Błąd wdrożenia 'github_releases', {} nie występuje. (Może być konieczne wcześniejsze uruchomienie `fdroid update`)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -1527,7 +1527,7 @@ msgstr "Uruchom ponownie repozytorium git z niescommitowanymi zmianami" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" -msgstr "" +msgstr "Uruchom {cibase}, aby znaleźć -debug.apk. i pomiń repo_basedir {repo_basedir}" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" From 46df7d87aaa058af4f16df45e6b5677fda2f5c1d Mon Sep 17 00:00:00 2001 From: Peter Dave Hello Date: Wed, 30 Oct 2024 15:56:47 +0000 Subject: [PATCH 1747/2116] Translated using Weblate: Chinese (Traditional Han script) (zh_Hant) by Peter Dave Hello Currently translated at 82.0% (486 of 592 strings) Translation: F-Droid/F-Droid Server Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hant/ --- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 128 +++++++++++---------- 1 file changed, 68 insertions(+), 60 deletions(-) diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index f73872ba..8464aedd 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -6,20 +6,21 @@ # ifurther , 2021. # Stiffen , 2021. # hugoalh , 2024. +# Peter Dave Hello , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-05-29 05:09+0000\n" -"Last-Translator: hugoalh \n" -"Language-Team: Chinese (Traditional) \n" +"PO-Revision-Date: 2024-10-30 19:03+0000\n" +"Last-Translator: Peter Dave Hello \n" +"Language-Team: Chinese (Traditional Han script) \n" "Language: zh_Hant\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.6-dev\n" +"X-Generator: Weblate 5.8.2-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -437,7 +438,7 @@ msgstr "提交變更" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" +msgstr ".yml 與本地化檔案之間的「{field}」定義衝突:" #: ../fdroidserver/__main__.py #, fuzzy @@ -680,12 +681,12 @@ msgstr "錯誤:不支援的 git 主機「%s」,歡迎提交修補!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" -msgstr "" +msgstr "錯誤:{path} 中的 {key} 不是「archive」或「repo」!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" -msgstr "" +msgstr "錯誤:{path} 中的 {key}:{subkey} 不在允許的鍵值清單中:{allowed_keys}!" #: ../fdroidserver/__main__.py #, python-brace-format @@ -708,7 +709,7 @@ msgstr "配置文件 {configname} 中的 環境變量 {var} 還沒有設置 !" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "" +msgstr "部署「github_releases」時發生錯誤,找不到 {}。(您可能需要先執行 `fdroid update`。)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -947,7 +948,7 @@ msgstr "忽略文檔 FUNDING.yml , 文檔大小超過 2048: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "" +msgstr "忽略資訊清單中的無效元素:%s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -980,12 +981,12 @@ msgstr "在鏡像中加入軟體的源代碼包" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" -msgstr "" +msgstr "正在匯入來自 %s@%s 的中繼資料" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" -msgstr "" +msgstr "正在匯入來自 {path} 的中繼資料" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1020,12 +1021,12 @@ msgstr "無效的 APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "無效的自動更新模式:{mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "" +msgstr "無效的更新檢查模式:{mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -1059,7 +1060,7 @@ msgstr "無效的已發佈檔案名稱:%s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "建置設定中的 NDK 項目無效:「{ndk}」" #: ../fdroidserver/common.py #, python-brace-format @@ -1125,7 +1126,7 @@ msgstr "金鑰庫的簽署金鑰:\t" #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "" +msgstr "在 AllowedAPKSigningKeys 中使用了已知的除錯金鑰: " #: ../fdroidserver/lint.py #, fuzzy, python-brace-format @@ -1161,7 +1162,7 @@ msgstr "異常的 serverwebroot 行:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "" +msgstr "已達到 ZIP 檔案中的最大遞迴深度:%s" #: ../fdroidserver/mirror.py #, fuzzy @@ -1174,11 +1175,11 @@ msgstr "輸出目錄消失" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" +msgstr "正在將反功能宣告移至本地化檔案:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" +msgstr "在 config.yml 中未設定「repo_pubkey」或「keystorepass」" #: ../fdroidserver/verify.py #, fuzzy, python-format @@ -1218,7 +1219,7 @@ msgstr "查無資訊" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "" +msgstr "在 {0} 中找不到最低 SDK 版本,使用預設值 (3)。" #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1314,15 +1315,15 @@ msgstr "因為機器是離線的, 跳過 git mirror 的生成直到 `fdroid de #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "" +msgstr "其中一個「github_releases」設定項目缺少「projectUrl」值。略過..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." -msgstr "" +msgstr "其中一個「github_releases」設定項目缺少「packageNames」值。略過..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." -msgstr "" +msgstr "其中一個「github_releases」設定項目缺少「token」值。略過..." #: ../fdroidserver/update.py #, python-brace-format @@ -1408,7 +1409,7 @@ msgstr "在終端機顥示祕密變數以便於複製/貼上" #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" -msgstr "" +msgstr "ZIP 檔案出現問題:%s,錯誤 %s" #: ../fdroidserver/common.py #, python-brace-format @@ -1490,7 +1491,7 @@ msgstr "從緩存讀取 {apkfilename}" #: ../fdroidserver/build.py msgid "Refresh and cache scanner rules and signatures from the network" -msgstr "" +msgstr "從網路重新整理並快取掃描器規則與簽章" #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1499,7 +1500,7 @@ msgstr "移除指定檔案" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "正在移除 {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -1507,7 +1508,7 @@ msgstr "為不符合 package.name_123.apk 格式的 APK 檔案更名" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "RepoTrunk 更新模式僅適用於 git-svn 儲存庫" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." @@ -1542,7 +1543,7 @@ msgstr "在有未遞交變更的 git 倉庫上執行" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" -msgstr "" +msgstr "在 {cibase} 中尋找 -debug.apk,並略過 repo_basedir {repo_basedir}" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1560,7 +1561,7 @@ msgstr "在 {path} 裡執行 wget" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "" +msgstr "{url} 的 SHA-256 與項目不符!" #: ../fdroidserver/build.py #, fuzzy @@ -1599,7 +1600,7 @@ msgstr "在生成的 APK 檔案中掃描已知的閉源軟體 。" #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "" +msgstr "正在設定 NDK {release}({version})" #: ../fdroidserver/common.py msgid "Set clock to that time using:" @@ -1648,7 +1649,7 @@ msgstr "略過帶無效簽署的 '{apkfilename}'!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "因儲存庫過大(>%.2fGB),略過 GitLab Pages 鏡像!" #: ../fdroidserver/update.py #, python-brace-format @@ -1703,11 +1704,11 @@ msgstr "在 {path} 中的系統時鐘比日期早!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" +msgstr "標籤更新模式目前僅適用於 git、hg、bzr 與 git-svn 儲存庫" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" +msgstr "在 git-svn 中使用了標籤更新模式,但儲存庫未設定標籤" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." @@ -1777,6 +1778,13 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" +"要完成設定,請將您的 APK 新增至「%s」\n" +"然後執行「fdroid update -c; fdroid update」。您可能也想要編輯\n" +"「config.yml」以設定網址、儲存庫名稱等。您還應該設定\n" +"簽署金鑰(可能已自動產生一個暫時性的金鑰)。\n" +"\n" +"更多資訊請參考:https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"與 https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" @@ -1814,7 +1822,7 @@ msgstr "這個許可證標籤不符合預期 \"{}\"! 只能使用你的配置 #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" +msgstr "未預期的符號連結目標:{link} -> {target}" #: ../fdroidserver/common.py #, fuzzy, python-brace-format @@ -1896,7 +1904,7 @@ msgstr "檔案路徑: %s 被標記為不掃描,但並未出現" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "正在解壓縮到 %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -1914,7 +1922,7 @@ msgstr "UpdateCheckData 有無效的 URL:{url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" -msgstr "" +msgstr "UpdateCheckData 必須符合整數版本代碼(\\d 或 [0-9]):{codeex}" #: ../fdroidserver/lint.py #, python-brace-format @@ -1928,12 +1936,12 @@ msgstr "UpdateCheckData 不是有效的 URL:{url}" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "" +msgstr "已設定 UpdateCheckMode,但似乎尚未執行 checkupdates。" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" +msgstr "已設定 UpdateCheckMode,但似乎尚未執行 checkupdates" #: ../fdroidserver/lint.py #, fuzzy @@ -2021,7 +2029,7 @@ msgstr "使用從「{path}」而來的 androguard" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" -msgstr "" +msgstr "使用空白字典而非 {path} 的內容!" #: ../fdroidserver/init.py #, python-brace-format @@ -2074,7 +2082,7 @@ msgstr "在默認情況下, 檢查整個軟體庫中的可疑代碼時不會 #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." -msgstr "" +msgstr "當簽署或驗證失敗時,以錯誤碼結束。" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2138,7 +2146,7 @@ msgstr "application ID 具有任選的 versionCode 在此的格式為 APPID [:VE #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" -msgstr "" +msgstr "archive_url 必須以 /archive 結尾" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2150,7 +2158,7 @@ msgstr "引數 \"-\" 為帶 %r 模式" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" -msgstr "" +msgstr "引數 %(argument_name)s:%(message)s" #: ../fdroidserver/nightly.py #, fuzzy @@ -2169,7 +2177,7 @@ msgstr "無法打開 '%(filename)s':%(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" -msgstr "" +msgstr "無法開啟非 HTTPS 網址:'{};" #: ../fdroidserver/build.py #, fuzzy, python-brace-format @@ -2255,7 +2263,7 @@ msgstr "已建立 {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "目前版本較新:舊版本代碼={old},新版本代碼={new}" #: ../fdroidserver/update.py #, python-brace-format @@ -2264,7 +2272,7 @@ msgstr "刪除:repo/{apkfilename}" #: ../fdroidserver/scanner.py msgid "dependency file without lock" -msgstr "" +msgstr "依存檔案未上鎖" #: ../fdroidserver/common.py #, fuzzy, python-brace-format @@ -2280,7 +2288,7 @@ msgstr "dest= 如 %r 選項為必須" #: ../fdroidserver/scanner.py msgid "downloading '{}'" -msgstr "" +msgstr "正在下載「{}」" #: ../fdroidserver/scanner.py #, fuzzy @@ -2324,7 +2332,7 @@ msgstr "用法:fdroid [-h|--help|--version] <命令> []" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" -msgstr "" +msgstr "從網路擷取最新版本的簽章" #: /usr/lib/python3.11/optparse.py msgid "floating-point" @@ -2395,12 +2403,12 @@ msgstr "無效的選項字串 %(option)r:必須以字符 %(prefix_chars)r為 #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" -msgstr "" +msgstr "找不到 ipfs_cid,略過 CIDv1 產生" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "最新的建置配方較新:舊版本代碼={old},新版本代碼={new}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2434,7 +2442,7 @@ msgstr "相互獨佔的引數必須為可選的" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" -msgstr "" +msgstr "下次 {name} 快取更新將於 {time} 進行" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2568,7 +2576,7 @@ msgstr "將進程日誌 {path} 部署到 {dest} 但失敗了!" #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "" +msgstr "參考二進位檔缺少簽章" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2582,12 +2590,12 @@ msgstr "軟體庫圖標 (repo_icon)\"repo/icons/%s\" 不存在, 正在生 #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" -msgstr "" +msgstr "repo_url 必須以 /repo 結尾" #: ../fdroidserver/deploy.py #, python-brace-format msgid "rsync is missing or broken: {error}" -msgstr "" +msgstr "rsync 遺失或損壞:{error}" #: ../fdroidserver/metadata.py #, fuzzy @@ -2607,7 +2615,7 @@ msgstr "s3cmd 同步索引 {path} 到 {url} 並刪除" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" -msgstr "" +msgstr "掃描器快取格式錯誤!您可以使用以下指令清除它:'{clear}'" #: ../fdroidserver/deploy.py msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" @@ -2661,7 +2669,7 @@ msgstr "靜態庫 (static library)" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "" +msgstr "提供的參考二進位檔具有允許的簽署者 {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2751,7 +2759,7 @@ msgstr "來自 {path} 的 {appid} 並不是一個有效的 Java 套件名稱!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid} 同時具有 APK 和檔案:{files}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2822,12 +2830,12 @@ msgstr "{path} 有不正確的檔案簽章「{pattern}」,可能是 Janus 漏 #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} has been flagged by virustotal {count} times:" -msgstr "" +msgstr "{path} 已被 VirusTotal 標記 {count} 次:" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" +msgstr "{path} 不是「鍵:值」字典,而是一個 {datatype}!" #: ../fdroidserver/common.py #, fuzzy, python-brace-format @@ -2837,12 +2845,12 @@ msgstr "'config.yml' 未設定 'sdk_path'!" #: ../fdroidserver/index.py #, python-brace-format msgid "{path} is not list, but a {datatype}!" -msgstr "" +msgstr "{path} 不是清單,而是一個 {datatype}!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "" +msgstr "{path} 不是 {expected_type},而是一個 {datatype}!" #: ../fdroidserver/update.py #, python-brace-format @@ -2857,7 +2865,7 @@ msgstr "檔案 {path} 大於 200MB , 手動上傳: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" +msgstr "{path}:「{code}」不是有效的 ISO 3166-1 alpha-2 國家代碼!" #: ../fdroidserver/update.py #, fuzzy, python-brace-format From 69d2c874b6ca3bf412ecaa1d371188438cc4ac91 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 5 Nov 2024 15:20:12 +0100 Subject: [PATCH 1748/2116] enable new languages: Irish (ga) and Japanese (ja) --- MANIFEST.in | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MANIFEST.in b/MANIFEST.in index 0e24a132..54c9bf86 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -26,8 +26,10 @@ include locale/cs/LC_MESSAGES/fdroidserver.po include locale/de/LC_MESSAGES/fdroidserver.po include locale/es/LC_MESSAGES/fdroidserver.po include locale/fr/LC_MESSAGES/fdroidserver.po +include locale/ga/LC_MESSAGES/fdroidserver.po include locale/hu/LC_MESSAGES/fdroidserver.po include locale/it/LC_MESSAGES/fdroidserver.po +include locale/ja/LC_MESSAGES/fdroidserver.po include locale/ko/LC_MESSAGES/fdroidserver.po include locale/nb_NO/LC_MESSAGES/fdroidserver.po include locale/pl/LC_MESSAGES/fdroidserver.po From 96ed60fda30cbc3783f0c9d6594b260a75f0d5a0 Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Fri, 8 Nov 2024 15:09:05 +0000 Subject: [PATCH 1749/2116] Reword extra blocks --- fdroidserver/scanner.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 6a392b2b..08c09918 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -75,14 +75,18 @@ GRADLE_CATALOG_FILE_REGEX = re.compile( ) VERSION_CATALOG_REGEX = re.compile(r'versionCatalogs\s*\{') -FROSTING_BLOCK_TYPES = { - # 0x7109871a: 'SIGNv2', - # 0xf05368c0: 'SIGNv3', - 0x2146444E: 'Google metadata', +APK_SIGNING_BLOCK_IDS = { + # https://source.android.com/docs/security/features/apksigning/v2#apk-signing-block + # 0x7109871a: 'APK signature scheme v2', + # https://source.android.com/docs/security/features/apksigning/v3#apk-signing-block + # 0xf05368c0: 'APK signature scheme v3', + # See "Security metadata in early 2018" + # https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html + 0x2146444E: 'Google Play Signature aka "Frosting"', # 0x42726577: 'Verity padding', # 0x6DFF800D: 'Source stamp V2 X509 cert', # JSON with some metadata, used by Chinese company Meituan - 0x71777777: 'Meituan metadata', + 0x71777777: 'Meituan payload', # Dependencies metadata generated by Gradle and encrypted by Google Play. # '...The data is compressed, encrypted by a Google Play signing key...' # https://developer.android.com/studio/releases/gradle-plugin#dependency-metadata @@ -669,12 +673,14 @@ def scan_binary(apkfile): logging.debug("Problem: found class '%s'" % classname) problems += 1 - logging.info(_('Scanning APK for known frosting blocks.')) + logging.info(_('Scanning APK for extra signing blocks.')) a = common.get_androguard_APK(str(apkfile)) a.parse_v2_v3_signature() for b in a._v2_blocks: - if b in FROSTING_BLOCK_TYPES: - logging.debug(f"Problem: found frosting block '{FROSTING_BLOCK_TYPES[b]}'") + if b in APK_SIGNING_BLOCK_IDS: + logging.debug( + f"Problem: found extra signing block '{APK_SIGNING_BLOCK_IDS[b]}'" + ) problems += 1 if warnings: From b9b4ca9778b42d65b448164c5c8434b3f466c7b2 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 4 Nov 2024 21:42:46 +0100 Subject: [PATCH 1750/2116] install: download any app from f-droid.org --- fdroidserver/install.py | 51 ++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/fdroidserver/install.py b/fdroidserver/install.py index 8103a02e..c3b1f2b5 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -207,7 +207,10 @@ def install_fdroid_apk(privacy_mode=False): return _('{path} has the wrong fingerprint ({fingerprint})!').format( path=f, fingerprint=fingerprint ) + install_apk(f) + +def install_apk(f): if common.config and common.config.get('adb'): if devices(): install_apks_to_devices([f]) @@ -288,6 +291,23 @@ def strtobool(val): return val.lower() in ('', 'y', 'yes', _('yes'), _('true')) # '' is pressing Enter +def prompt_user(yes, msg): + """Prompt user for yes/no, supporting Enter and Esc as accepted answers.""" + run_install = yes + if yes is None and sys.stdout.isatty(): + print(msg, flush=True) + answer = '' + while True: + in_char = read_char() + if in_char == '\r': # Enter key + break + if not in_char.isprintable(): + sys.exit(1) + answer += in_char + run_install = strtobool(answer) + return run_install + + def main(): parser = ArgumentParser( usage="%(prog)s [options] [APPID[:VERCODE] [APPID[:VERCODE] ...]]" @@ -334,23 +354,10 @@ def main(): common.get_config() if not options.appid and not options.all: - run_install = options.yes - if options.yes is None and sys.stdout.isatty(): - print( - _( - 'Would you like to download and install F-Droid.apk via adb? (YES/no)' - ), - flush=True, - ) - answer = '' - while True: - in_char = read_char() - if in_char == '\r': # Enter key - break - if not in_char.isprintable(): - sys.exit(1) - answer += in_char - run_install = strtobool(answer) + run_install = prompt_user( + options.yes, + _('Would you like to download and install F-Droid.apk via adb? (YES/no)'), + ) if run_install: sys.exit(install_fdroid_apk(options.privacy_mode)) sys.exit(1) @@ -358,7 +365,15 @@ def main(): output_dir = 'repo' if (options.appid or options.all) and not os.path.isdir(output_dir): logging.error(_("No signed output directory - nothing to do")) - # TODO prompt user if they want to download from f-droid.org + run_install = prompt_user( + options.yes, + _('Would you like to download the app(s) from f-droid.org? (YES/no)'), + ) + if run_install: + for appid in options.appid: + f = download_apk(appid) + install_apk(f) + sys.exit(install_fdroid_apk(options.privacy_mode)) sys.exit(1) if options.appid: From addb7b9acca2ddff11b6535c4fe17495a34d32e1 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 5 Nov 2024 15:03:28 +0100 Subject: [PATCH 1751/2116] install: echo characters that the user inputs at the prompt --- fdroidserver/install.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fdroidserver/install.py b/fdroidserver/install.py index c3b1f2b5..c6f1085d 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -295,7 +295,7 @@ def prompt_user(yes, msg): """Prompt user for yes/no, supporting Enter and Esc as accepted answers.""" run_install = yes if yes is None and sys.stdout.isatty(): - print(msg, flush=True) + print(msg, end=' ', flush=True) answer = '' while True: in_char = read_char() @@ -303,8 +303,10 @@ def prompt_user(yes, msg): break if not in_char.isprintable(): sys.exit(1) + print(in_char, end='', flush=True) answer += in_char run_install = strtobool(answer) + print() return run_install From 05e091804dcd5ba146f80d9123e52ee80baf60ce Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 5 Nov 2024 15:06:00 +0100 Subject: [PATCH 1752/2116] install: verify sig for all downloaded APKs if apksigner is installed --- fdroidserver/install.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fdroidserver/install.py b/fdroidserver/install.py index c6f1085d..caac556d 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -198,10 +198,6 @@ def install_fdroid_apk(privacy_mode=False): else: return _('F-Droid.apk could not be downloaded from any known source!') - if common.config and common.config.get('apksigner'): - # TODO this should always verify, but that requires APK sig verification in Python #94 - logging.info(_('Verifying package {path} with apksigner.').format(path=f)) - common.verify_apk_signature(f) fingerprint = common.apk_signer_fingerprint(f) if fingerprint.upper() != common.FDROIDORG_FINGERPRINT: return _('{path} has the wrong fingerprint ({fingerprint})!').format( @@ -211,6 +207,10 @@ def install_fdroid_apk(privacy_mode=False): def install_apk(f): + if common.config and common.config.get('apksigner'): + # TODO this should always verify, but that requires APK sig verification in Python #94 + logging.info(_('Verifying package {path} with apksigner.').format(path=f)) + common.verify_apk_signature(f) if common.config and common.config.get('adb'): if devices(): install_apks_to_devices([f]) From 90eeb638095b1c437b3581ed8d32e7d3700e1b8f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 8 Nov 2024 14:05:41 +0200 Subject: [PATCH 1753/2116] net: ignore proxy env vars, tests only use localhost Proxy settings via environment variables can interfere with this test. The requests library will automatically pick up proxy settings from environment variables. Proxy settings can force the local connection over the proxy, which might not support that, then this fails with an error like 405 or others. --- tests/net.TestCase | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tests/net.TestCase b/tests/net.TestCase index 1c3d5e88..42e9e260 100755 --- a/tests/net.TestCase +++ b/tests/net.TestCase @@ -25,7 +25,15 @@ from pathlib import Path class RetryServer: - """A stupid simple HTTP server that can fail to connect""" + """A stupid simple HTTP server that can fail to connect. + + Proxy settings via environment variables can interfere with this + test. The requests library will automatically pick up proxy + settings from environment variables. Proxy settings can force the + local connection over the proxy, which might not support that, + then this fails with an error like 405 or others. + + """ def __init__(self, port=None, failures=3): self.port = port @@ -123,6 +131,7 @@ class NetTest(unittest.TestCase): net.download_file('http://localhost:%d/f.txt' % server.port) server.stop() + @patch.dict(os.environ, clear=True) def test_download_using_mirrors_retries(self): server = RetryServer() f = net.download_using_mirrors( @@ -131,13 +140,14 @@ class NetTest(unittest.TestCase): 'https://httpbin.org/status/403', 'https://httpbin.org/status/500', 'http://localhost:1/f.txt', # ConnectionError - 'http://localhost:%d/' % server.port, + 'http://localhost:%d/should-succeed' % server.port, ], ) # strip the HTTP headers and compare the reply self.assertEqual(server.reply.split(b'\n\n')[1], Path(f).read_bytes()) server.stop() + @patch.dict(os.environ, clear=True) def test_download_using_mirrors_retries_not_forever(self): """The retry logic should eventually exit with an error.""" server = RetryServer(failures=5) From 85e585161fc162a1d2e11bbaa650288e7f344eea Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 8 Nov 2024 16:19:29 +0200 Subject: [PATCH 1754/2116] net: use localhost instead of IP for both sides of test setup --- tests/net.TestCase | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/net.TestCase b/tests/net.TestCase index 42e9e260..6a9e41ab 100755 --- a/tests/net.TestCase +++ b/tests/net.TestCase @@ -49,7 +49,7 @@ class RetryServer: def run_fake_server(self): server_sock = socket.socket() server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - server_sock.bind(('127.0.0.1', self.port)) + server_sock.bind(('localhost', self.port)) server_sock.listen(5) server_sock.settimeout(5) time.sleep(0.001) # wait for it to start From ad66baa26694ee9961ecf58bc8a30ac5eb6bd2fa Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 8 Nov 2024 17:15:16 +0200 Subject: [PATCH 1755/2116] net: skip test in CI that mysteriously fails there I couldn't figure out why it is failing there. --- .gitlab-ci.yml | 2 +- tests/net.TestCase | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7c59285d..ea4ca641 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -356,7 +356,7 @@ fedora_latest: - chown -R testuser . - cd tests - su testuser --login --command - "cd `pwd`; export ANDROID_HOME=$ANDROID_HOME; fdroid=~testuser/.local/bin/fdroid ./run-tests" + "cd `pwd`; export CI=$CI ANDROID_HOME=$ANDROID_HOME; fdroid=~testuser/.local/bin/fdroid ./run-tests" macOS: diff --git a/tests/net.TestCase b/tests/net.TestCase index 6a9e41ab..fa4bec4f 100755 --- a/tests/net.TestCase +++ b/tests/net.TestCase @@ -131,6 +131,7 @@ class NetTest(unittest.TestCase): net.download_file('http://localhost:%d/f.txt' % server.port) server.stop() + @unittest.skipIf(os.getenv('CI'), 'FIXME this fails mysteriously only in GitLab CI') @patch.dict(os.environ, clear=True) def test_download_using_mirrors_retries(self): server = RetryServer() From 1be808c7280363bef79ba57bc22e2d443295b38a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 8 Nov 2024 17:59:06 +0200 Subject: [PATCH 1756/2116] include net.TestCase in dist tarball Now that `fdroid install` is something that is expected to work as part of any package, the test suite should also include the net tests, which `fdroid install` relies on. --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index 54c9bf86..3cf3cfb9 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -662,6 +662,7 @@ include tests/metadata-rewrite-yml/org.fdroid.fdroid.yml include tests/metadata/souch.smsbypass.yml include tests/metadata.TestCase include tests/minimal_targetsdk_30_unsigned.apk +include tests/net.TestCase include tests/nightly.TestCase include tests/Norway_bouvet_europe_2.obf.zip include tests/no_targetsdk_minsdk1_unsigned.apk From dde2947ad25c5e004ac9b239e311d1975598fbb3 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Wed, 13 Nov 2024 06:40:37 +0000 Subject: [PATCH 1757/2116] gradle v8.11 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 2386bbdb..7a168730 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -205,6 +205,7 @@ get_sha() { '8.10') echo '5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a' ;; '8.10.1') echo '1541fa36599e12857140465f3c91a97409b4512501c26f9631fb113e392c5bd1' ;; '8.10.2') echo '31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26' ;; + '8.11') echo '57dafb5c2622c6cc08b993c85b7c06956a2f53536432a30ead46166dbca0f1e9' ;; *) exit 1 esac } @@ -225,7 +226,7 @@ d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2 7.1 7.0 4.2 4.1 4.0 3.6 d_plugin_min_gradle_v=(8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 5b57ced0a6ec1ec0221802378d118a981cadd634 Mon Sep 17 00:00:00 2001 From: relan Date: Fri, 8 Nov 2024 11:19:49 +0300 Subject: [PATCH 1758/2116] Fix warning from "chown" about the syntax MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The warning: chown: warning: '.' should be ':': ‘vagrant.vagrant’ --- buildserver/provision-disable-analytics | 2 +- buildserver/provision-gradle | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/buildserver/provision-disable-analytics b/buildserver/provision-disable-analytics index 5be736a6..e1ec62b7 100644 --- a/buildserver/provision-disable-analytics +++ b/buildserver/provision-disable-analytics @@ -10,6 +10,6 @@ cat < $flutter_conf "enabled": false } EOF -chown -R vagrant.vagrant $flutter_conf +chown -R vagrant:vagrant $flutter_conf chmod -R 0644 $flutter_conf diff --git a/buildserver/provision-gradle b/buildserver/provision-gradle index b724202c..ca48bcf7 100644 --- a/buildserver/provision-gradle +++ b/buildserver/provision-gradle @@ -26,8 +26,8 @@ chmod -R a+rX /opt/gradle test -e /opt/gradle/bin || mkdir -p /opt/gradle/bin ln -fs /home/vagrant/fdroidserver/gradlew-fdroid /opt/gradle/bin/gradle -chown -h vagrant.vagrant /opt/gradle/bin/gradle -chown vagrant.vagrant /opt/gradle/versions +chown -h vagrant:vagrant /opt/gradle/bin/gradle +chown vagrant:vagrant /opt/gradle/versions chmod 0755 /opt/gradle/versions GRADLE_HOME=/home/vagrant/.gradle @@ -44,5 +44,5 @@ systemProp.org.gradle.internal.http.connectionTimeout=600000 systemProp.org.gradle.internal.http.socketTimeout=600000 EOF -chown -R vagrant.vagrant $GRADLE_HOME/ +chown -R vagrant:vagrant $GRADLE_HOME/ chmod -R a+rX $GRADLE_HOME/ From 76615187750bd797ec69ea8fceccb83f658beeea Mon Sep 17 00:00:00 2001 From: relan Date: Sun, 3 Nov 2024 10:39:18 +0300 Subject: [PATCH 1759/2116] Vagrantfile: fix undefined method `exists?' error This method has been deprecated for a long time, now it's gone. --- buildserver/Vagrantfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildserver/Vagrantfile b/buildserver/Vagrantfile index 682c364c..61e3459a 100644 --- a/buildserver/Vagrantfile +++ b/buildserver/Vagrantfile @@ -14,7 +14,7 @@ configfile = { srvpath = Pathname.new(File.dirname(__FILE__)).realpath configpath = File.join(srvpath, "/Vagrantfile.yaml") -if File.exists? configpath +if File.exist? configpath c = YAML.load_file(configpath) if c and not c.empty? c.each do |k,v| @@ -86,7 +86,7 @@ Vagrant.configure("2") do |config| # Make sure dir exists to mount to, since buildserver/ is # automatically mounted as /vagrant in the guest VM. This is more # necessary with 9p synced folders - Dir.mkdir('cache') unless File.exists?('cache') + Dir.mkdir('cache') unless File.exist?('cache') # Root partition needs to be resized to the new allocated space config.vm.provision "shell", inline: <<-SHELL From 87909fae7490efeb1347a51273ba7d04f8938d90 Mon Sep 17 00:00:00 2001 From: relan Date: Thu, 14 Nov 2024 21:53:44 +0300 Subject: [PATCH 1760/2116] Remove ignored files on gotorevisionx for hg Other revisions can change the list of ignored files and if we don't remove them, switching to another revision can fail. --- fdroidserver/common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 4bc70a2e..77ffe10d 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1697,11 +1697,11 @@ class vcs_hg(vcs): self.clone_failed = True raise VCSException("Hg clone failed", p.output) else: - p = FDroidPopen(['hg', 'status', '-uS'], cwd=self.local, output=False) + p = FDroidPopen(['hg', 'status', '-uiS'], cwd=self.local, output=False) if p.returncode != 0: raise VCSException("Hg status failed", p.output) for line in p.output.splitlines(): - if not line.startswith('? '): + if not line.startswith('? ') and not line.startswith('I '): raise VCSException("Unexpected output from hg status -uS: " + line) FDroidPopen(['rm', '-rf', '--', line[2:]], cwd=self.local, output=False) if not self.refreshed: From 118c7fc7833d2fec7af592c968eaa360260301dc Mon Sep 17 00:00:00 2001 From: relan Date: Thu, 14 Nov 2024 21:56:58 +0300 Subject: [PATCH 1761/2116] Remove "hg purge" after "hg update" 1. "hg purge" works only on interactive shell (see #1015). 2. No need to clean anything because we did this before "hg update". --- fdroidserver/common.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 77ffe10d..d311283d 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1716,16 +1716,6 @@ class vcs_hg(vcs): p = FDroidPopen(['hg', 'update', '-C', '--', rev], cwd=self.local, output=False) if p.returncode != 0: raise VCSException("Hg checkout of '%s' failed" % rev, p.output) - p = FDroidPopen(['hg', 'purge', '--all'], cwd=self.local, output=False) - # Also delete untracked files, we have to enable purge extension for that: - if "'purge' is provided by the following extension" in p.output: - with open(os.path.join(self.local, '.hg', 'hgrc'), "a") as myfile: - myfile.write("\n[extensions]\nhgext.purge=\n") - p = FDroidPopen(['hg', 'purge', '--all'], cwd=self.local, output=False) - if p.returncode != 0: - raise VCSException("HG purge failed", p.output) - elif p.returncode != 0: - raise VCSException("HG purge failed", p.output) def _gettags(self): p = FDroidPopen(['hg', 'tags', '-q'], cwd=self.local, output=False) From 7e8e2403cd58679e7a15af88af751f83c1dbff0e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 31 Oct 2024 09:16:42 +0100 Subject: [PATCH 1762/2116] black formatting --- fdroidserver/common.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index d311283d..04e70beb 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -221,15 +221,26 @@ def parse_args(parser): def setup_global_opts(parser): try: # the buildserver VM might not have PIL installed from PIL import PngImagePlugin + logger = logging.getLogger(PngImagePlugin.__name__) logger.setLevel(logging.INFO) # tame the "STREAM" debug messages except ImportError: pass - parser.add_argument("-v", "--verbose", action="store_true", default=False, - help=_("Spew out even more information than normal")) - parser.add_argument("-q", "--quiet", action="store_true", default=False, - help=_("Restrict output to warnings and errors")) + parser.add_argument( + "-v", + "--verbose", + action="store_true", + default=False, + help=_("Spew out even more information than normal"), + ) + parser.add_argument( + "-q", + "--quiet", + action="store_true", + default=False, + help=_("Restrict output to warnings and errors"), + ) def set_console_logging(verbose=False): From 290587f4497febb80144731cf2baf7af12946854 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 5 Nov 2024 14:43:02 +0100 Subject: [PATCH 1763/2116] add ColorFormatter class for optional colorized log output --- completion/bash-completion | 8 +++---- fdroidserver/common.py | 43 +++++++++++++++++++++++++++++++++++--- fdroidserver/init.py | 2 +- fdroidserver/install.py | 2 +- fdroidserver/mirror.py | 2 +- fdroidserver/signatures.py | 2 +- 6 files changed, 48 insertions(+), 11 deletions(-) diff --git a/completion/bash-completion b/completion/bash-completion index 5f6e6b23..57fcfd12 100644 --- a/completion/bash-completion +++ b/completion/bash-completion @@ -110,7 +110,7 @@ __complete_gpgsign() { __complete_install() { opts="-v -q -a -p -n -y" - lopts="--verbose --quiet --all --privacy-mode --no --yes" + lopts="--verbose --quiet --all --color --no-color --privacy-mode --no-privacy-mode --no --yes" case "${cur}" in -*) __complete_options @@ -251,7 +251,7 @@ __complete_btlog() { __complete_mirror() { opts="-v" - lopts="--all --archive --build-logs --pgp-signatures --src-tarballs --output-dir" + lopts="--all --archive --build-logs --color --no-color --pgp-signatures --src-tarballs --output-dir" __complete_options } @@ -270,7 +270,7 @@ __complete_deploy() { __complete_signatures() { opts="-v -q" - lopts="--verbose --no-check-https" + lopts="--verbose --color --no-color --no-check-https" case "${cur}" in -*) __complete_options @@ -289,7 +289,7 @@ __complete_signindex() { __complete_init() { opts="-v -q -d" lopts="--verbose --quiet --distinguished-name --keystore - --repo-keyalias --android-home --no-prompt" + --repo-keyalias --android-home --no-prompt --color --no-color" __complete_options } diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 04e70beb..6a24c74e 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -56,6 +56,7 @@ from pathlib import Path import defusedxml.ElementTree as XMLElementTree +from argparse import BooleanOptionalAction from asn1crypto import cms from base64 import urlsafe_b64encode from binascii import hexlify @@ -241,9 +242,40 @@ def setup_global_opts(parser): default=False, help=_("Restrict output to warnings and errors"), ) + parser.add_argument( + "--color", + action=BooleanOptionalAction, + default=None, + help=_("Color the log output"), + ) -def set_console_logging(verbose=False): +class ColorFormatter(logging.Formatter): + + def __init__(self, msg): + logging.Formatter.__init__(self, msg) + + bright_black = "\x1b[90;20m" + yellow = "\x1b[33;20m" + red = "\x1b[31;20m" + bold_red = "\x1b[31;1m" + reset = "\x1b[0m" + + self.FORMATS = { + logging.DEBUG: bright_black + msg + reset, + logging.INFO: reset + msg + reset, # use default color + logging.WARNING: yellow + msg + reset, + logging.ERROR: red + msg + reset, + logging.CRITICAL: bold_red + msg + reset + } + + def format(self, record): + log_fmt = self.FORMATS.get(record.levelno) + formatter = logging.Formatter(log_fmt) + return formatter.format(record) + + +def set_console_logging(verbose=False, color=False): """Globally set logging to output nicely to the console.""" class _StdOutFilter(logging.Filter): @@ -255,13 +287,18 @@ def set_console_logging(verbose=False): else: level = logging.ERROR + if color or (color is None and sys.stdout.isatty()): + formatter = ColorFormatter + else: + formatter = logging.Formatter + stdout_handler = logging.StreamHandler(sys.stdout) stdout_handler.addFilter(_StdOutFilter()) - stdout_handler.setFormatter(logging.Formatter('%(message)s')) + stdout_handler.setFormatter(formatter('%(message)s')) stderr_handler = logging.StreamHandler(sys.stderr) stderr_handler.setLevel(logging.ERROR) - stderr_handler.setFormatter(logging.Formatter(_('ERROR: %(message)s'))) + stderr_handler.setFormatter(formatter(_('ERROR: %(message)s'))) logging.basicConfig( force=True, level=level, handlers=[stdout_handler, stderr_handler] diff --git a/fdroidserver/init.py b/fdroidserver/init.py index e27a7092..b77fea72 100644 --- a/fdroidserver/init.py +++ b/fdroidserver/init.py @@ -82,7 +82,7 @@ def main(): ) options = common.parse_args(parser) - common.set_console_logging(options.verbose) + common.set_console_logging(options.verbose, options.color) fdroiddir = os.getcwd() test_config = dict() diff --git a/fdroidserver/install.py b/fdroidserver/install.py index caac556d..4832049b 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -350,7 +350,7 @@ def main(): ) options = common.parse_args(parser) - common.set_console_logging(options.verbose) + common.set_console_logging(options.verbose, options.color) logging.captureWarnings(True) # for SNIMissingWarning common.get_config() diff --git a/fdroidserver/mirror.py b/fdroidserver/mirror.py index 1483ddf1..80f8394f 100644 --- a/fdroidserver/mirror.py +++ b/fdroidserver/mirror.py @@ -91,7 +91,7 @@ def main(): ) options = common.parse_args(parser) - common.set_console_logging(options.verbose) + common.set_console_logging(options.verbose, options.color) if options.all: options.archive = True diff --git a/fdroidserver/signatures.py b/fdroidserver/signatures.py index 4f683344..ad83fc74 100644 --- a/fdroidserver/signatures.py +++ b/fdroidserver/signatures.py @@ -104,7 +104,7 @@ def main(): ) parser.add_argument("--no-check-https", action="store_true", default=False) options = common.parse_args(parser) - common.set_console_logging(options.verbose) + common.set_console_logging(options.verbose, options.color) common.read_config() extract(options) From 65119b3193b3ae6e8a1fba3b6fc2b31b5afbff74 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 19 Nov 2024 19:10:15 +0100 Subject: [PATCH 1764/2116] rename to test_gradlew-fdroid to match Python unittest naming --- .gitlab-ci.yml | 6 +++--- MANIFEST.in | 2 +- tests/{test-gradlew-fdroid => test_gradlew-fdroid} | 0 3 files changed, 4 insertions(+), 4 deletions(-) rename tests/{test-gradlew-fdroid => test_gradlew-fdroid} (100%) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ea4ca641..071dffe0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -207,11 +207,11 @@ gradlew-fdroid: changes: - .gitlab-ci.yml - gradlew-fdroid - - tests/test-gradlew-fdroid + - tests/test_gradlew-fdroid script: - apt-get install ca-certificates curl default-jdk-headless shellcheck unzip - - shellcheck --severity=error --color gradlew-fdroid tests/test-gradlew-fdroid - - ./tests/test-gradlew-fdroid + - shellcheck --severity=error --color gradlew-fdroid tests/test_gradlew-fdroid + - ./tests/test_gradlew-fdroid # Run all the various linters and static analysis tools. diff --git a/MANIFEST.in b/MANIFEST.in index 3cf3cfb9..76ddec7d 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -864,7 +864,7 @@ include tests/source-files/yuriykulikov/AlarmClock/gradle/wrapper/gradle-wrapper include tests/source-files/Zillode/syncthing-silk/build.gradle include tests/SpeedoMeterApp.main_1.apk include tests/testcommon.py -include tests/test-gradlew-fdroid +include tests/test_gradlew-fdroid include tests/triple-t-2/build/org.piwigo.android/app/build.gradle include tests/triple-t-2/build/org.piwigo.android/app/.gitignore include tests/triple-t-2/build/org.piwigo.android/app/src/debug/res/values/constants.xml diff --git a/tests/test-gradlew-fdroid b/tests/test_gradlew-fdroid similarity index 100% rename from tests/test-gradlew-fdroid rename to tests/test_gradlew-fdroid From 4d6682bc70a1322db0d545138d60f6d0930d2e47 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 19 Nov 2024 19:27:16 +0100 Subject: [PATCH 1765/2116] update: fix _strip_and_copy_image to work with pathlib --- fdroidserver/update.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index c561199a..7d443747 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -803,7 +803,7 @@ def _strip_and_copy_image(in_file, outpath): Potential source of Python code to strip JPEGs without dependencies: http://www.fetidcascade.com/public/minimal_exif_writer.py """ - logging.debug('copying ' + in_file + ' ' + outpath) + logging.debug('copying %s %s', in_file, outpath) if not os.path.exists(in_file): if os.path.islink(in_file): From 7ff32bc4b0c7bea6d9d073a4b1c1b3a186cbd689 Mon Sep 17 00:00:00 2001 From: SilentGhost Date: Tue, 19 Nov 2024 20:36:41 +0100 Subject: [PATCH 1766/2116] Refactor TestCase files into python modules Convert all TestCase files into standard python modules to be run and discovered by unittest. --- .gitlab-ci.yml | 24 +- MANIFEST.in | 41 ++-- README.md | 6 +- hooks/pre-commit | 8 +- pyproject.toml | 10 +- tests/__init__.py | 0 tests/init.TestCase | 91 -------- tests/run-tests | 10 +- tests/{api.TestCase => test_api.py} | 30 +-- tests/{build.TestCase => test_build.py} | 44 +--- ...kupdates.TestCase => test_checkupdates.py} | 57 ++--- tests/{common.TestCase => test_common.py} | 149 +++++------- tests/{deploy.TestCase => test_deploy.py} | 49 +--- .../{exception.TestCase => test_exception.py} | 37 +-- tests/{github.TestCase => test_github.py} | 47 +--- tests/{gpgsign.TestCase => test_gpgsign.py} | 43 +--- ...and.TestCase => test_import_subcommand.py} | 52 ++--- tests/{index.TestCase => test_index.py} | 82 ++----- tests/test_init.py | 58 +++++ tests/{install.TestCase => test_install.py} | 32 --- tests/{lint.TestCase => test_lint.py} | 54 ++--- tests/{main.TestCase => test_main.py} | 41 +--- tests/{metadata.TestCase => test_metadata.py} | 75 ++---- tests/{net.TestCase => test_net.py} | 37 +-- tests/{nightly.TestCase => test_nightly.py} | 80 +++---- tests/{publish.TestCase => test_publish.py} | 60 ++--- ...writemeta.TestCase => test_rewritemeta.py} | 39 +--- tests/{scanner.TestCase => test_scanner.py} | 78 ++----- ...signatures.TestCase => test_signatures.py} | 47 +--- .../{signindex.TestCase => test_signindex.py} | 31 --- tests/{update.TestCase => test_update.py} | 220 ++++++++---------- tests/{vcs.TestCase => test_vcs.py} | 45 +--- tests/{verify.TestCase => test_verify.py} | 41 +--- tests/testcommon.py | 13 -- 34 files changed, 471 insertions(+), 1260 deletions(-) create mode 100644 tests/__init__.py delete mode 100755 tests/init.TestCase rename tests/{api.TestCase => test_api.py} (82%) rename tests/{build.TestCase => test_build.py} (97%) rename tests/{checkupdates.TestCase => test_checkupdates.py} (93%) rename tests/{common.TestCase => test_common.py} (96%) rename tests/{deploy.TestCase => test_deploy.py} (97%) rename tests/{exception.TestCase => test_exception.py} (55%) rename tests/{github.TestCase => test_github.py} (79%) rename tests/{gpgsign.TestCase => test_gpgsign.py} (60%) rename tests/{import_subcommand.TestCase => test_import_subcommand.py} (83%) rename tests/{index.TestCase => test_index.py} (93%) create mode 100755 tests/test_init.py rename tests/{install.TestCase => test_install.py} (92%) rename tests/{lint.TestCase => test_lint.py} (93%) rename tests/{main.TestCase => test_main.py} (90%) rename tests/{metadata.TestCase => test_metadata.py} (97%) rename tests/{net.TestCase => test_net.py} (85%) rename tests/{nightly.TestCase => test_nightly.py} (89%) rename tests/{publish.TestCase => test_publish.py} (90%) rename tests/{rewritemeta.TestCase => test_rewritemeta.py} (89%) rename tests/{scanner.TestCase => test_scanner.py} (93%) rename tests/{signatures.TestCase => test_signatures.py} (57%) rename tests/{signindex.TestCase => test_signindex.py} (89%) rename tests/{update.TestCase => test_update.py} (93%) rename tests/{vcs.TestCase => test_vcs.py} (66%) rename tests/{verify.TestCase => test_verify.py} (69%) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 071dffe0..48f62c4a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -252,7 +252,6 @@ lint_format_bandit_checks: setup.py fdroidserver/*.py tests/*.py - tests/*.TestCase || set_error - shellcheck --exclude SC2046,SC2090 --severity=warning --color tests/run-tests || set_error @@ -619,10 +618,10 @@ Windows: - python -m pip install --upgrade babel pip setuptools - python -m pip install -e . - - $files = @(Get-ChildItem tests\*.TestCase) + - $files = @(Get-ChildItem tests\test_*.py) - foreach ($f in $files) { write-output $f; - python $f; + python -m unittest $f; if( $LASTEXITCODE -eq 0 ) { write-output "SUCCESS $f"; } else { @@ -631,15 +630,16 @@ Windows: } # these are the tests that must pass - - python tests\checkupdates.TestCase - - python tests\exception.TestCase - - python tests\import_subcommand.TestCase - - python tests\init.TestCase - - python tests\lint.TestCase - - python tests\main.TestCase - - python tests\metadata.TestCase - - python tests\rewritemeta.TestCase - - python tests\vcs.TestCase + - python -m unittest -k + checkupdates + exception + import_subcommand + test_lint + test_metadata + test_rewritemeta + test_vcs + tests.test_init + tests.test_main after_script: - Copy-Item C:\ProgramData\chocolatey\logs\chocolatey.log artifacts: diff --git a/MANIFEST.in b/MANIFEST.in index 76ddec7d..d847e172 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -50,7 +50,6 @@ include README.md include tests/aosp_testkey_debug.keystore include tests/apk.embedded_1.apk include tests/bad-unicode-*.apk -include tests/build.TestCase include tests/build-tools/17.0.0/aapt-output-com.moez.QKSMS_182.txt include tests/build-tools/17.0.0/aapt-output-com.politedroid_3.txt include tests/build-tools/17.0.0/aapt-output-com.politedroid_4.txt @@ -547,9 +546,7 @@ include tests/build-tools/28.0.3/aapt-output-obb.main.twoversions_1101617.txt include tests/build-tools/28.0.3/aapt-output-souch.smsbypass_9.txt include tests/build-tools/generate.sh include tests/check-fdroid-apk -include tests/checkupdates.TestCase include tests/com.fake.IpaApp_1000000000001.ipa -include tests/common.TestCase include tests/config.py include tests/config/antiFeatures.yml include tests/config/categories.yml @@ -569,10 +566,8 @@ include tests/config/ic_antifeature_upstreamnonfree.xml include tests/config/ro/antiFeatures.yml include tests/config/zh-rCN/antiFeatures.yml include tests/corrupt-featureGraphic.png -include tests/deploy.TestCase include tests/dummy-keystore.jks include tests/dump_internal_metadata_format.py -include tests/exception.TestCase include tests/extra/manual-vmtools-test.py include tests/funding-usernames.yaml include tests/get_android_tools_versions/android-ndk-r10e/RELEASE.TXT @@ -591,10 +586,6 @@ include tests/gnupghome/secring.gpg include tests/gnupghome/trustdb.gpg include tests/gradle-maven-blocks.yaml include tests/gradle-release-checksums.py -include tests/import_subcommand.TestCase -include tests/index.TestCase -include tests/init.TestCase -include tests/install.TestCase include tests/IsMD5Disabled.java include tests/issue-1128-min-sdk-30-poc.apk include tests/issue-1128-poc1.apk @@ -604,8 +595,6 @@ include tests/issue-1128-poc3b.apk include tests/janus.apk include tests/keystore.jks include tests/key-tricks.py -include tests/lint.TestCase -include tests/main.TestCase include tests/metadata/apk/info.guardianproject.urzip.yaml include tests/metadata/apk/org.dyndns.fules.ck.yaml include tests/metadata/app.with.special.build.params.yml @@ -660,10 +649,7 @@ include tests/metadata-rewrite-yml/app.with.special.build.params.yml include tests/metadata-rewrite-yml/fake.ota.update.yml include tests/metadata-rewrite-yml/org.fdroid.fdroid.yml include tests/metadata/souch.smsbypass.yml -include tests/metadata.TestCase include tests/minimal_targetsdk_30_unsigned.apk -include tests/net.TestCase -include tests/nightly.TestCase include tests/Norway_bouvet_europe_2.obf.zip include tests/no_targetsdk_minsdk1_unsigned.apk include tests/no_targetsdk_minsdk30_unsigned.apk @@ -674,7 +660,6 @@ include tests/org.bitbucket.tickytacky.mirrormirror_3.apk include tests/org.bitbucket.tickytacky.mirrormirror_4.apk include tests/org.dyndns.fules.ck_20.apk include tests/org.sajeg.fallingblocks_3.apk -include tests/publish.TestCase include tests/repo/com.example.test.helloworld_1.apk include tests/repo/com.politedroid_3.apk include tests/repo/com.politedroid_4.apk @@ -732,13 +717,9 @@ include tests/repo/patch.1619.obb.mainpatch.current.obb include tests/repo/souch.smsbypass_9.apk include tests/repo/urzip-*.apk include tests/repo/v1.v2.sig_1020.apk -include tests/rewritemeta.TestCase include tests/run-tests include tests/SANAPPSI.RSA include tests/SANAPPSI.SF -include tests/scanner.TestCase -include tests/signatures.TestCase -include tests/signindex.TestCase include tests/signindex/guardianproject.jar include tests/signindex/guardianproject-v1.jar include tests/signindex/testy.jar @@ -864,7 +845,27 @@ include tests/source-files/yuriykulikov/AlarmClock/gradle/wrapper/gradle-wrapper include tests/source-files/Zillode/syncthing-silk/build.gradle include tests/SpeedoMeterApp.main_1.apk include tests/testcommon.py +include tests/test_build.py +include tests/test_checkupdates.py +include tests/test_common.py +include tests/test_deploy.py +include tests/test_exception.py include tests/test_gradlew-fdroid +include tests/test_import_subcommand.py +include tests/test_index.py +include tests/test_init.py +include tests/test_install.py +include tests/test_lint.py +include tests/test_main.py +include tests/test_metadata.py +include tests/test_nightly.py +include tests/test_publish.py +include tests/test_rewritemeta.py +include tests/test_scanner.py +include tests/test_signatures.py +include tests/test_signindex.py +include tests/test_update.py +include tests/test_vcs.py include tests/triple-t-2/build/org.piwigo.android/app/build.gradle include tests/triple-t-2/build/org.piwigo.android/app/.gitignore include tests/triple-t-2/build/org.piwigo.android/app/src/debug/res/values/constants.xml @@ -921,7 +922,6 @@ include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verif include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/main/play/listings/en-US/title.txt include tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.verifier.yml include tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.wallet.yml -include tests/update.TestCase include tests/urzip.apk include tests/urzip-badcert.apk include tests/urzip-badsig.apk @@ -931,4 +931,3 @@ include tests/v2.only.sig_2.apk include tests/valid-package-names/random-package-names include tests/valid-package-names/RandomPackageNames.java include tests/valid-package-names/test.py -include tests/vcs.TestCase diff --git a/README.md b/README.md index adc33128..41f725cb 100644 --- a/README.md +++ b/README.md @@ -53,13 +53,13 @@ To run the full test suite: tests/run-tests -To run the tests for individual Python modules, see the _.TestCase_ files, e.g.: +To run the tests for individual Python modules, see the `tests/test_*.py` files, e.g.: - tests/metadata.TestCase + python -m unittest tests/test_metadata.py It is also possible to run individual tests: - tests/metadata.TestCase MetadataTest.test_rewrite_yaml_special_build_params + python -m unittest tests.test_metadata.MetadataTest.test_rewrite_yaml_special_build_params There is a growing test suite that has good coverage on a number of key parts of this code base. It does not yet cover all the code, and there are some parts diff --git a/hooks/pre-commit b/hooks/pre-commit index c1761aa8..784cc9ee 100755 --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -9,7 +9,7 @@ exec 1>&2 files=`git diff-index --cached HEAD 2>&1 | sed 's/^:.* //' | uniq | cut -b100-500` if [ -z "$files" ]; then PY_FILES="fdroid makebuildserver setup.py fdroidserver/*.py examples/*.py tests/*-release-checksums.py" - PY_TEST_FILES="tests/*.TestCase" + PY_TEST_FILES="tests/test_*.py" SH_FILES="hooks/pre-commit" BASH_FILES="gradlew-fdroid jenkins-build-all jenkins-setup-build-environment jenkins-test completion/bash-completion buildserver/provision-*" RB_FILES="buildserver/Vagrantfile" @@ -27,12 +27,12 @@ else for f in $files; do test -e $f || continue case $f in + test_*.py) + PY_TEST_FILES+=" $f" + ;; *.py) PY_FILES+=" $f" ;; - *.TestCase) - PY_TEST_FILES+=" $f" - ;; *.rb) RB_FILES+=" $f" ;; diff --git a/pyproject.toml b/pyproject.toml index 876053c5..a643fa37 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,7 @@ ignore = "E123,E203,E402,E501,W503" [tool.black] skip-string-normalization = true target-version = ["py38"] -include = '(^fdroid|\.pyi?|\.TestCase)$' +include = '(^fdroid|\.pyi?)$' # These files will never be included in black runs. To run black on # one of thes files, remove it from this list. force-exclude = '''( @@ -49,10 +49,10 @@ force-exclude = '''( | tests/gradle-release-checksums\.py | tests/openssl-version-check-test\.py | tests/valid-package-names/test\.py - | tests/common\.TestCase - | tests/publish\.TestCase - | tests/signatures\.TestCase - | tests/update\.TestCase + | tests/test_common\.py + | tests/test_publish\.py + | tests/test_signatures\.py + | tests/test_update\.py )$''' diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/init.TestCase b/tests/init.TestCase deleted file mode 100755 index 7e674cb5..00000000 --- a/tests/init.TestCase +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env python3 - -# http://www.drdobbs.com/testing/unit-testing-with-python/240165163 - -import inspect -import logging -import os -import shutil -import sys -import unittest - - -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) - -import fdroidserver.init -from testcommon import mkdtemp, parse_args_for_test - - -class InitTest(unittest.TestCase): - '''fdroidserver/init.py''' - - def setUp(self): - logging.basicConfig(level=logging.DEBUG) - self.basedir = os.path.join(localmodule, 'tests') - fdroidserver.common.config = None - fdroidserver.init.config = None - self._td = mkdtemp() - self.testdir = self._td.name - - def tearDown(self): - self._td.cleanup() - os.chdir(self.basedir) - - def test_disable_in_config(self): - os.chdir(self.testdir) - with open('config.yml', 'w') as fp: - fp.write('keystore: NONE\n') - fp.write('keypass: mysupersecrets\n') - os.chmod('config.yml', 0o600) - config = fdroidserver.common.read_config() - self.assertEqual('NONE', config['keystore']) - self.assertEqual('mysupersecrets', config['keypass']) - fdroidserver.init.disable_in_config('keypass', 'comment') - with open(fp.name) as fp: - self.assertTrue('#keypass:' in fp.read()) - fdroidserver.common.config = None - config = fdroidserver.common.read_config() - self.assertIsNone(config.get('keypass')) - - @unittest.skipIf(os.name == 'nt', "calling main() like this hangs on Windows") - def test_main_in_empty_dir(self): - """Test that `fdroid init` will find apksigner and add it to the config""" - os.chdir(self.testdir) - - shutil.copy(os.path.join(self.basedir, 'keystore.jks'), self.testdir) - - bindir = os.path.join(os.getcwd(), 'bin') - os.mkdir(bindir) - apksigner = os.path.join(bindir, 'apksigner') - open(apksigner, 'w').close() - os.chmod(apksigner, 0o755) - os.environ['PATH'] = bindir - - sys.argv = ['fdroid init', '--keystore', 'keystore.jks', '--repo-keyalias=sova'] - fdroidserver.init.main() - self.assertEqual(apksigner, fdroidserver.init.config.get('apksigner')) - - -if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - fdroidserver.init.options = parse_args_for_test(parser, sys.argv) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(InitTest)) - unittest.main(failfast=False) diff --git a/tests/run-tests b/tests/run-tests index 303327a5..7e3f0c13 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -170,15 +170,7 @@ test -x ./hooks/pre-commit && ./hooks/pre-commit #------------------------------------------------------------------------------# echo_header "run unit tests" -cd $WORKSPACE/tests -for testcase in $WORKSPACE/tests/*.TestCase; do - if [ $(uname) != "Linux" ] && [ $testcase == $WORKSPACE/tests/nightly.TestCase ]; then - echo "skipping nightly.TestCase, it currently only works GNU/Linux" - continue - fi - $testcase -done - +python3 -m unittest -v #------------------------------------------------------------------------------# echo_header "print fdroid version" diff --git a/tests/api.TestCase b/tests/test_api.py similarity index 82% rename from tests/api.TestCase rename to tests/test_api.py index e3e66765..a2d91926 100755 --- a/tests/api.TestCase +++ b/tests/test_api.py @@ -1,22 +1,17 @@ #!/usr/bin/env python3 -import inspect import os import shutil -import sys import unittest +from pathlib import Path from unittest import mock -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) - import fdroidserver from fdroidserver import common, signindex -from testcommon import GP_FINGERPRINT, mkdtemp +from .testcommon import GP_FINGERPRINT, mkdtemp + + +basedir = Path(__file__).parent class ApiTest(unittest.TestCase): @@ -29,8 +24,7 @@ class ApiTest(unittest.TestCase): """ def setUp(self): - self.basedir = os.path.join(localmodule, 'tests') - os.chdir(self.basedir) + os.chdir(basedir) self._td = mkdtemp() self.testdir = self._td.name @@ -89,10 +83,10 @@ class ApiTest(unittest.TestCase): self.testdir, 'repo', os.path.basename(mirrors[0]['url']) ) os.chdir(self.testdir) - signindex.config['keystore'] = os.path.join(self.basedir, 'keystore.jks') + signindex.config['keystore'] = os.path.join(basedir, 'keystore.jks') os.mkdir('repo') - shutil.copy(os.path.join(self.basedir, 'repo', 'entry.json'), 'repo') - shutil.copy(os.path.join(self.basedir, 'repo', 'index-v2.json'), 'repo') + shutil.copy(basedir / 'repo' / 'entry.json', 'repo') + shutil.copy(basedir / 'repo' / 'index-v2.json', 'repo') signindex.sign_index('repo', 'entry.json') repo_url = 'https://fake.url/fdroid/repo' entry_url = 'https://fake.url/fdroid/repo/entry.jar' @@ -107,9 +101,3 @@ class ApiTest(unittest.TestCase): self.assertEqual( 'My First F-Droid Repo Demo', data['repo']['name']['en-US'] ) - - -if __name__ == "__main__": - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(ApiTest)) - unittest.main(failfast=False) diff --git a/tests/build.TestCase b/tests/test_build.py similarity index 97% rename from tests/build.TestCase rename to tests/test_build.py index f6607634..94596daa 100755 --- a/tests/build.TestCase +++ b/tests/test_build.py @@ -1,12 +1,7 @@ #!/usr/bin/env python3 -# http://www.drdobbs.com/testing/unit-testing-with-python/240165163 - -import inspect -import logging import os import shutil -import sys import tempfile import textwrap import unittest @@ -14,21 +9,10 @@ import yaml from pathlib import Path from unittest import mock -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) - -from testcommon import TmpCwd +from .testcommon import TmpCwd, mkdtemp import fdroidserver.build import fdroidserver.common -import fdroidserver.metadata -import fdroidserver.scanner -import fdroidserver.vmtools -from testcommon import mkdtemp, parse_args_for_test class FakeProcess: @@ -47,8 +31,7 @@ class BuildTest(unittest.TestCase): '''fdroidserver/build.py''' def setUp(self): - logging.basicConfig(level=logging.DEBUG) - self.basedir = os.path.join(localmodule, 'tests') + self.basedir = str(Path(__file__).parent) os.chdir(self.basedir) fdroidserver.common.config = None fdroidserver.build.config = None @@ -937,7 +920,7 @@ class BuildTest(unittest.TestCase): subprocess_check_output, paramiko_SSHClient, fdroidserver_vmtools_get_clean_builder, - fdroidserver_vmtools_get_build_vm, + fdroidserver_vmtools_get_build_vm, # pylint: disable=unused-argument ): """srclibs Prepare: should only be executed in the buildserver""" @@ -954,6 +937,7 @@ class BuildTest(unittest.TestCase): refresh=True, build=None, ): + # pylint: disable=unused-argument name, ref = spec.split('@') libdir = os.path.join(srclib_dir, name) os.mkdir(libdir) @@ -1098,23 +1082,3 @@ class BuildTest(unittest.TestCase): fdroidserver.build.options.keep_when_not_allowed = False fdroidserver.build.config = {'keep_when_not_allowed': False} self.assertFalse(fdroidserver.build.keep_when_not_allowed()) - - -if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - parse_args_for_test(parser, sys.argv) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(BuildTest)) - unittest.main(failfast=False) diff --git a/tests/checkupdates.TestCase b/tests/test_checkupdates.py similarity index 93% rename from tests/checkupdates.TestCase rename to tests/test_checkupdates.py index 8006dd2d..8225cdff 100755 --- a/tests/checkupdates.TestCase +++ b/tests/test_checkupdates.py @@ -1,36 +1,26 @@ #!/usr/bin/env python3 -# http://www.drdobbs.com/testing/unit-testing-with-python/240165163 - import git -import logging import os import shutil -import sys import tempfile import time import unittest from unittest import mock from pathlib import Path - -localmodule = Path(__file__).resolve().parent.parent -print('localmodule: ' + str(localmodule)) -if localmodule not in sys.path: - sys.path.insert(0, str(localmodule)) - +import fdroidserver import fdroidserver.checkupdates -import fdroidserver.metadata -from fdroidserver.exception import FDroidException + + +basedir = Path(__file__).parent class CheckupdatesTest(unittest.TestCase): '''fdroidserver/checkupdates.py''' def setUp(self): - logging.basicConfig(level=logging.DEBUG) - self.basedir = localmodule / 'tests' - os.chdir(self.basedir) + os.chdir(basedir) self.testdir = tempfile.TemporaryDirectory( str(time.time()), self._testMethodName + '_' ) @@ -70,7 +60,7 @@ class CheckupdatesTest(unittest.TestCase): ): with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()): with mock.patch('subprocess.call', lambda cmd: 0): - with self.assertRaises(FDroidException): + with self.assertRaises(fdroidserver.exception.FDroidException): fdroidserver.checkupdates.checkupdates_app(app, auto=True) build = app['Builds'][-1] @@ -165,7 +155,7 @@ class CheckupdatesTest(unittest.TestCase): with mock.patch( 'fdroidserver.checkupdates.check_http', lambda app: (None, 'bla') ): - with self.assertRaises(FDroidException): + with self.assertRaises(fdroidserver.exception.FDroidException): fdroidserver.checkupdates.checkupdates_app(app, auto=True) with mock.patch( @@ -198,7 +188,7 @@ class CheckupdatesTest(unittest.TestCase): 'fdroidserver.checkupdates.check_tags', lambda app, pattern: (None, 'bla', None), ): - with self.assertRaises(FDroidException): + with self.assertRaises(fdroidserver.exception.FDroidException): fdroidserver.checkupdates.checkupdates_app(app, auto=True) with mock.patch( @@ -236,7 +226,7 @@ class CheckupdatesTest(unittest.TestCase): faked = scheme + '://fake.url/for/testing/scheme' app.UpdateCheckData = faked + '|ignored|' + faked + '|ignored' app.metadatapath = 'metadata/' + app.id + '.yml' - with self.assertRaises(FDroidException): + with self.assertRaises(fdroidserver.exception.FDroidException): fdroidserver.checkupdates.check_http(app) def test_check_http_ignore(self): @@ -331,7 +321,7 @@ class CheckupdatesTest(unittest.TestCase): testdir = self.testdir.name os.chdir(testdir) os.mkdir('metadata') - for f in (self.basedir / 'metadata').glob('*.yml'): + for f in (basedir / 'metadata').glob('*.yml'): shutil.copy(f, 'metadata') git_repo = git.Repo.init(testdir) git_repo.git.add(all=True) @@ -434,7 +424,7 @@ class CheckupdatesTest(unittest.TestCase): @mock.patch('fdroidserver.metadata.read_metadata') def test_merge_requests_flag(self, read_metadata, sys_exit): def _sys_exit(return_code=0): - assert return_code != 0 + self.assertNotEqual(return_code, 0) raise fdroidserver.exception.FDroidException('sys.exit() ran') def _read_metadata(a=None, b=None): @@ -479,7 +469,7 @@ class CheckupdatesTest(unittest.TestCase): @mock.patch('fdroidserver.checkupdates.checkupdates_app') def test_merge_requests_branch(self, checkupdates_app, read_app_args, sys_exit): def _sys_exit(return_code=0): - assert return_code == 0 + self.assertEqual(return_code, 0) def _checkupdates_app(app, auto, commit): # pylint: disable=unused-argument os.mkdir('metadata') @@ -506,27 +496,8 @@ class CheckupdatesTest(unittest.TestCase): git_repo.create_remote('origin', os.getcwd()).fetch() git_repo.create_remote('upstream', os.getcwd()).fetch() - assert appid not in git_repo.heads + self.assertNotIn(appid, git_repo.heads) with mock.patch('sys.argv', ['fdroid checkupdates', '--merge-request', appid]): fdroidserver.checkupdates.main() sys_exit.assert_called_once() - assert appid in git_repo.heads - - -if __name__ == "__main__": - import argparse - from testcommon import parse_args_for_test - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - parse_args_for_test(parser, sys.argv) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(CheckupdatesTest)) - unittest.main(failfast=False) + self.assertIn(appid, git_repo.heads) diff --git a/tests/common.TestCase b/tests/test_common.py similarity index 96% rename from tests/common.TestCase rename to tests/test_common.py index c2e03243..5ad5a771 100755 --- a/tests/common.TestCase +++ b/tests/test_common.py @@ -1,7 +1,5 @@ #!/usr/bin/env python3 -# http://www.drdobbs.com/testing/unit-testing-with-python/240165163 - import difflib import git import glob @@ -28,25 +26,20 @@ from unittest import mock from pathlib import Path -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) - -import fdroidserver.index -import fdroidserver.install +import fdroidserver import fdroidserver.signindex import fdroidserver.common import fdroidserver.metadata -from testcommon import TmpCwd, mkdtemp, parse_args_for_test +from .testcommon import TmpCwd, mkdtemp from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME from fdroidserver.exception import FDroidException, VCSException,\ MetaDataException, VerificationException from fdroidserver.looseversion import LooseVersion +basedir = Path(__file__).parent + + def _mock_common_module_options_instance(): """Helper method to deal with difficult visibility of the module-level options.""" fdroidserver.common.options = mock.Mock() @@ -60,11 +53,10 @@ class CommonTest(unittest.TestCase): logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger('androguard.axml') logger.setLevel(logging.INFO) # tame the axml debug messages - self.basedir = os.path.join(localmodule, 'tests') - self.tmpdir = os.path.abspath(os.path.join(self.basedir, '..', '.testfiles')) + self.tmpdir = os.path.abspath(os.path.join(basedir, '..', '.testfiles')) if not os.path.exists(self.tmpdir): os.makedirs(self.tmpdir) - os.chdir(self.basedir) + os.chdir(basedir) # these are declared as None at the top of the module file fdroidserver.common.config = None @@ -77,7 +69,7 @@ class CommonTest(unittest.TestCase): def tearDown(self): fdroidserver.common.config = None fdroidserver.common.options = None - os.chdir(self.basedir) + os.chdir(basedir) self._td.cleanup() if os.path.exists(self.tmpdir): shutil.rmtree(self.tmpdir) @@ -187,11 +179,11 @@ class CommonTest(unittest.TestCase): # create test file used in common._add_java_paths_to_config() for p in pathlist: if p.startswith('/System') or p.startswith('/Library'): - basedir = os.path.join(p, 'Contents', 'Home', 'bin') + _dir = os.path.join(p, 'Contents', 'Home', 'bin') else: - basedir = os.path.join(p, 'bin') - os.makedirs(basedir) - open(os.path.join(basedir, 'javac'), 'w').close() + _dir = os.path.join(p, 'bin') + os.makedirs(_dir) + open(os.path.join(_dir, 'javac'), 'w').close() config = dict() config['java_paths'] = dict() @@ -204,21 +196,14 @@ class CommonTest(unittest.TestCase): fdroidserver.common.config = config # these are set debuggable - testfiles = [] - testfiles.append(os.path.join(self.basedir, 'urzip.apk')) - testfiles.append(os.path.join(self.basedir, 'urzip-badsig.apk')) - testfiles.append(os.path.join(self.basedir, 'urzip-badcert.apk')) - for apkfile in testfiles: + for apkfile in ('urzip.apk', 'urzip-badsig.apk', 'urzip-badcert.apk'): self.assertTrue( - fdroidserver.common.is_debuggable_or_testOnly(apkfile), + fdroidserver.common.is_debuggable_or_testOnly(str(basedir / apkfile)), "debuggable APK state was not properly parsed!", ) # these are set NOT debuggable - testfiles = [] - testfiles.append(os.path.join(self.basedir, 'urzip-release.apk')) - testfiles.append(os.path.join(self.basedir, 'urzip-release-unsigned.apk')) - testfiles.append(os.path.join(self.basedir, 'v2.only.sig_2.apk')) + testfiles = 'urzip-release.apk', 'urzip-release-unsigned.apk', 'v2.only.sig_2.apk' for apkfile in testfiles: self.assertFalse( fdroidserver.common.is_debuggable_or_testOnly(apkfile), @@ -297,7 +282,7 @@ class CommonTest(unittest.TestCase): teststr = 'FAKE_STR_FOR_TESTING' shutil.copytree( - os.path.join(self.basedir, 'source-files'), + os.path.join(basedir, 'source-files'), os.path.join(self.tmpdir, 'source-files'), ) @@ -356,7 +341,7 @@ class CommonTest(unittest.TestCase): def test_prepare_sources_with_prebuild_subdir(self): app_build_dir = os.path.join(self.testdir, 'build', 'com.example') shutil.copytree( - os.path.join(self.basedir, 'source-files', 'fdroid', 'fdroidclient'), + basedir / 'source-files' / 'fdroid' / 'fdroidclient', app_build_dir, ) @@ -418,7 +403,7 @@ class CommonTest(unittest.TestCase): os.mkdir('metadata') # use a local copy if available to avoid hitting the network - tmprepo = os.path.join(self.basedir, 'tmp', 'importer') + tmprepo = os.path.join(basedir, 'tmp', 'importer') if os.path.exists(tmprepo): git_url = tmprepo else: @@ -499,7 +484,7 @@ class CommonTest(unittest.TestCase): fdroidserver.common.config = config fdroidserver.signindex.config = config - sourcedir = os.path.join(self.basedir, 'signindex') + sourcedir = os.path.join(basedir, 'signindex') with tempfile.TemporaryDirectory( prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir ) as testsdir: @@ -561,7 +546,7 @@ class CommonTest(unittest.TestCase): """Sign entry.jar and make sure it validates""" config = fdroidserver.common.read_config() config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') - config['keystore'] = os.path.join(self.basedir, 'keystore.jks') + config['keystore'] = os.path.join(basedir, 'keystore.jks') config['repo_keyalias'] = 'sova' config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' @@ -580,7 +565,7 @@ class CommonTest(unittest.TestCase): config = fdroidserver.common.read_config() config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') fdroidserver.common.config = config - source_dir = os.path.join(self.basedir, 'signindex') + source_dir = os.path.join(basedir, 'signindex') for f in ('unsigned.jar', 'testy.jar', 'guardianproject.jar', 'guardianproject-v1.jar'): testfile = os.path.join(source_dir, f) with self.assertRaises(fdroidserver.index.VerificationException): @@ -590,7 +575,7 @@ class CommonTest(unittest.TestCase): config = fdroidserver.common.read_config() config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner') fdroidserver.common.config = config - source_dir = os.path.join(self.basedir, 'signindex') + source_dir = os.path.join(basedir, 'signindex') for f in ('testy.jar', 'guardianproject.jar'): testfile = os.path.join(source_dir, f) fdroidserver.common.verify_deprecated_jar_signature(testfile) @@ -604,7 +589,7 @@ class CommonTest(unittest.TestCase): fdroidserver.common.config = config _mock_common_module_options_instance() - sourceapk = os.path.join(self.basedir, 'urzip.apk') + sourceapk = os.path.join(basedir, 'urzip.apk') copyapk = os.path.join(self.testdir, 'urzip-copy.apk') shutil.copy(sourceapk, copyapk) @@ -624,7 +609,7 @@ class CommonTest(unittest.TestCase): ) twosigapk = os.path.join(self.testdir, 'urzip-twosig.apk') - otherapk = ZipFile(os.path.join(self.basedir, 'urzip-release.apk'), 'r') + otherapk = ZipFile(os.path.join(basedir, 'urzip-release.apk'), 'r') with ZipFile(sourceapk, 'r') as apk: with ZipFile(twosigapk, 'w') as testapk: for info in apk.infolist(): @@ -825,7 +810,7 @@ class CommonTest(unittest.TestCase): os.makedirs(os.path.dirname(do_not_use)) with open(do_not_use, 'w') as fp: fp.write('#!/bin/sh\ndate\n') - os.chmod(do_not_use, 0o0755) + os.chmod(do_not_use, 0o0755) # nosec B103 apksigner = os.path.join(self.tmpdir, 'apksigner') config = {'apksigner': apksigner} with mock.patch.dict(os.environ, clear=True): @@ -840,14 +825,14 @@ class CommonTest(unittest.TestCase): apksigner = os.path.join(self.tmpdir, 'apksigner') with open(apksigner, 'w') as fp: fp.write('#!/bin/sh\ndate\n') - os.chmod(apksigner, 0o0755) + os.chmod(apksigner, 0o0755) # nosec B103 android_home = os.path.join(self.tmpdir, 'ANDROID_HOME') do_not_use = os.path.join(android_home, 'build-tools', '30.0.3', 'apksigner') os.makedirs(os.path.dirname(do_not_use)) with open(do_not_use, 'w') as fp: fp.write('#!/bin/sh\ndate\n') - os.chmod(do_not_use, 0o0755) + os.chmod(do_not_use, 0o0755) # nosec B103 config = {'sdk_path': android_home} with mock.patch.dict(os.environ, clear=True): @@ -865,13 +850,13 @@ class CommonTest(unittest.TestCase): os.makedirs(os.path.dirname(apksigner)) with open(apksigner, 'w') as fp: fp.write('#!/bin/sh\necho 30.0.3\n') - os.chmod(apksigner, 0o0755) + os.chmod(apksigner, 0o0755) # nosec B103 do_not_use = os.path.join(android_home, 'build-tools', '29.0.3', 'apksigner') os.makedirs(os.path.dirname(do_not_use)) with open(do_not_use, 'w') as fp: fp.write('#!/bin/sh\necho 29.0.3\n') - os.chmod(do_not_use, 0o0755) + os.chmod(do_not_use, 0o0755) # nosec B103 config = {'sdk_path': android_home} with mock.patch.dict(os.environ, clear=True): @@ -917,13 +902,13 @@ class CommonTest(unittest.TestCase): config['keyalias'] = 'sova' config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' - config['keystore'] = os.path.join(self.basedir, 'keystore.jks') + config['keystore'] = os.path.join(basedir, 'keystore.jks') fdroidserver.common.config = config fdroidserver.signindex.config = config unsigned = os.path.join(self.testdir, 'urzip-release-unsigned.apk') signed = os.path.join(self.testdir, 'urzip-release.apk') - shutil.copy(os.path.join(self.basedir, 'urzip-release-unsigned.apk'), self.testdir) + shutil.copy(os.path.join(basedir, 'urzip-release-unsigned.apk'), self.testdir) self.assertFalse(fdroidserver.common.verify_apk_signature(unsigned)) @@ -936,7 +921,7 @@ class CommonTest(unittest.TestCase): unsigned = os.path.join(self.testdir, 'duplicate.permisssions_9999999-unsigned.apk') signed = os.path.join(self.testdir, 'duplicate.permisssions_9999999.apk') shutil.copy( - os.path.join(self.basedir, 'repo', 'duplicate.permisssions_9999999.apk'), + os.path.join(basedir, 'repo', 'duplicate.permisssions_9999999.apk'), os.path.join(unsigned), ) fdroidserver.common.apk_strip_v1_signatures(unsigned, strip_manifest=True) @@ -946,7 +931,7 @@ class CommonTest(unittest.TestCase): self.assertTrue(fdroidserver.common.verify_apk_signature(signed)) self.assertEqual('18', fdroidserver.common.get_androguard_APK(signed).get_min_sdk_version()) - shutil.copy(os.path.join(self.basedir, 'minimal_targetsdk_30_unsigned.apk'), self.testdir) + shutil.copy(os.path.join(basedir, 'minimal_targetsdk_30_unsigned.apk'), self.testdir) unsigned = os.path.join(self.testdir, 'minimal_targetsdk_30_unsigned.apk') signed = os.path.join(self.testdir, 'minimal_targetsdk_30.apk') @@ -959,7 +944,7 @@ class CommonTest(unittest.TestCase): # verify it has a v2 signature self.assertTrue(fdroidserver.common.get_androguard_APK(signed).is_signed_v2()) - shutil.copy(os.path.join(self.basedir, 'no_targetsdk_minsdk30_unsigned.apk'), self.testdir) + shutil.copy(os.path.join(basedir, 'no_targetsdk_minsdk30_unsigned.apk'), self.testdir) unsigned = os.path.join(self.testdir, 'no_targetsdk_minsdk30_unsigned.apk') signed = os.path.join(self.testdir, 'no_targetsdk_minsdk30_signed.apk') @@ -967,7 +952,7 @@ class CommonTest(unittest.TestCase): self.assertTrue(fdroidserver.common.verify_apk_signature(signed)) self.assertTrue(fdroidserver.common.get_androguard_APK(signed).is_signed_v2()) - shutil.copy(os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk'), self.testdir) + shutil.copy(os.path.join(basedir, 'no_targetsdk_minsdk1_unsigned.apk'), self.testdir) unsigned = os.path.join(self.testdir, 'no_targetsdk_minsdk1_unsigned.apk') signed = os.path.join(self.testdir, 'no_targetsdk_minsdk1_signed.apk') @@ -988,18 +973,18 @@ class CommonTest(unittest.TestCase): config['keyalias'] = 'sova' config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' - config['keystore'] = os.path.join(self.basedir, 'keystore.jks') + config['keystore'] = os.path.join(basedir, 'keystore.jks') fdroidserver.common.config = config fdroidserver.signindex.config = config unsigned = os.path.join(self.testdir, 'urzip-release-unsigned.apk') signed = os.path.join(self.testdir, 'urzip-release.apk') - shutil.copy(os.path.join(self.basedir, 'urzip-release-unsigned.apk'), self.testdir) + shutil.copy(os.path.join(basedir, 'urzip-release-unsigned.apk'), self.testdir) os.chmod(unsigned, 0o000) with self.assertRaises(fdroidserver.exception.BuildException): fdroidserver.common.sign_apk(unsigned, signed, config['keyalias']) - os.chmod(unsigned, 0o777) + os.chmod(unsigned, 0o777) # nosec B103 self.assertTrue(os.path.isfile(unsigned)) self.assertFalse(os.path.isfile(signed)) @@ -1012,7 +997,7 @@ class CommonTest(unittest.TestCase): config['keyalias'] = 'sova' config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' - config['keystore'] = os.path.join(self.basedir, 'keystore.jks') + config['keystore'] = os.path.join(basedir, 'keystore.jks') fdroidserver.common.config = config fdroidserver.signindex.config = config @@ -1039,7 +1024,7 @@ class CommonTest(unittest.TestCase): config['keyalias'] = 'sova' config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' - config['keystore'] = os.path.join(self.basedir, 'keystore.jks') + config['keystore'] = os.path.join(basedir, 'keystore.jks') fdroidserver.common.config = config fdroidserver.signindex.config = config @@ -1052,7 +1037,7 @@ class CommonTest(unittest.TestCase): 'v2.only.sig_2.apk', 'SystemWebView-repack.apk', ): - original = os.path.join(self.basedir, apk) + original = os.path.join(basedir, apk) unsigned = os.path.join('unsigned', apk) resign = os.path.join('repo', apk) shutil.copy(original, unsigned) @@ -1149,7 +1134,7 @@ class CommonTest(unittest.TestCase): fdroidserver.common.get_apk_id(badzip) def test_get_apk_id_aapt_regex(self): - files = glob.glob(os.path.join(self.basedir, 'build-tools', '[1-9]*.*', '*.txt')) + files = glob.glob(os.path.join(basedir, 'build-tools', '[1-9]*.*', '*.txt')) self.assertNotEqual(0, len(files)) for f in files: appid, versionCode = os.path.splitext(os.path.basename(f))[0][12:].split('_') @@ -1556,7 +1541,7 @@ class CommonTest(unittest.TestCase): def test_remove_signing_keys(self): shutil.copytree( - os.path.join(self.basedir, 'source-files'), + os.path.join(basedir, 'source-files'), os.path.join(self.tmpdir, 'source-files'), ) os.chdir(self.tmpdir) @@ -1575,7 +1560,7 @@ class CommonTest(unittest.TestCase): if not os.path.isdir(build_dir): continue fdroidserver.common.remove_signing_keys(build_dir) - fromfile = os.path.join(self.basedir, f) + fromfile = os.path.join(basedir, f) with open(f) as fp: content = fp.read() if 'signingConfig' in content: @@ -1605,7 +1590,7 @@ class CommonTest(unittest.TestCase): if not os.path.isdir(build_dir): continue fdroidserver.common.remove_signing_keys(build_dir) - fromfile = os.path.join(self.basedir, f) + fromfile = os.path.join(basedir, f) with open(fromfile) as fp: a = fp.readlines() with open(f) as fp: @@ -1947,7 +1932,7 @@ class CommonTest(unittest.TestCase): """Make sure it is possible to use config.yml alone.""" os.chdir(self.tmpdir) with mock.patch.dict(os.environ): - os.environ['SECRET'] = 'mysecretpassword' + os.environ['SECRET'] = 'mysecretpassword' # nosec B105 with open('config.yml', 'w') as fp: fp.write("""keypass: {'env': 'SECRET'}""") self.assertTrue(os.path.exists('config.yml')) @@ -1983,7 +1968,7 @@ class CommonTest(unittest.TestCase): with open('config.yml', 'w') as fp: fp.write('keystore: foo.jks') self.assertTrue(os.path.exists(fp.name)) - os.chmod(fp.name, 0o666) + os.chmod(fp.name, 0o666) # nosec B103 fdroidserver.common.read_config() os.remove(fp.name) fdroidserver.common.config = None @@ -1991,7 +1976,7 @@ class CommonTest(unittest.TestCase): with open('config.py', 'w') as fp: fp.write('keystore = "foo.jks"') self.assertTrue(os.path.exists(fp.name)) - os.chmod(fp.name, 0o666) + os.chmod(fp.name, 0o666) # nosec B103 fdroidserver.common.read_config() def test_with_both_config_yml_py(self): @@ -2119,7 +2104,7 @@ class CommonTest(unittest.TestCase): os.makedirs(os.path.dirname(apksigner)) with open(apksigner, 'w') as fp: fp.write('#!/bin/sh\ndate\n') - os.chmod(apksigner, 0o0755) + os.chmod(apksigner, 0o0755) # nosec B103 config = {'apksigner': apksigner} self.assertTrue(fdroidserver.common.test_sdk_exists(config)) @@ -2129,7 +2114,7 @@ class CommonTest(unittest.TestCase): os.makedirs(os.path.dirname(apksigner)) with open(apksigner, 'w') as fp: fp.write('#!/bin/sh\ndate\n') - os.chmod(apksigner, 0o0755) + os.chmod(apksigner, 0o0755) # nosec B103 config = {'apksigner': apksigner} self.assertFalse(fdroidserver.common.test_sdk_exists(config)) @@ -2159,7 +2144,7 @@ class CommonTest(unittest.TestCase): def test_loading_config_buildserver_yml(self): """Smoke check to make sure this file is properly parsed""" os.chdir(self.tmpdir) - shutil.copy(os.path.join(self.basedir, '..', 'buildserver', 'config.buildserver.yml'), + shutil.copy(os.path.join(basedir, '..', 'buildserver', 'config.buildserver.yml'), 'config.yml') self.assertFalse(os.path.exists('config.py')) fdroidserver.common.read_config() @@ -2238,7 +2223,7 @@ class CommonTest(unittest.TestCase): @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) def test_get_android_tools_versions(self): - sdk_path = os.path.join(self.basedir, 'get_android_tools_versions/android-sdk') + sdk_path = os.path.join(basedir, 'get_android_tools_versions/android-sdk') config = { 'ndk_paths': {'r10e': os.path.join(sdk_path, '..', 'android-ndk-r10e')}, 'sdk_path': sdk_path, @@ -2264,7 +2249,7 @@ class CommonTest(unittest.TestCase): with tempfile.TemporaryDirectory() as tmpdir: sdk_path = Path(tmpdir) / 'get_android_tools_versions' shutil.copytree( - os.path.join(self.basedir, 'get_android_tools_versions'), sdk_path + os.path.join(basedir, 'get_android_tools_versions'), sdk_path ) shutil.rmtree(sdk_path / 'android-ndk-r10e') shutil.rmtree(sdk_path / 'android-sdk/ndk') @@ -2329,7 +2314,7 @@ class CommonTest(unittest.TestCase): fdroidserver.common.read_pkg_args(['org.fdroid.fdroid:foo'], allow_vercodes), def test_apk_strip_v1_signatures(self): - before = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') + before = os.path.join(basedir, 'no_targetsdk_minsdk1_unsigned.apk') after = os.path.join(self.testdir, 'after.apk') shutil.copy(before, after) fdroidserver.common.apk_strip_v1_signatures(after, strip_manifest=False) @@ -3156,7 +3141,7 @@ class SignerExtractionTest(unittest.TestCase): """ def setUp(self): - os.chdir(os.path.join(localmodule, 'tests')) + os.chdir(basedir) self._td = mkdtemp() self.testdir = self._td.name @@ -3184,7 +3169,8 @@ class SignerExtractionTest(unittest.TestCase): @unittest.skip("slow and only needed when adding to APKS_WITH_JAR_SIGNATURES") def test_vs_keytool(self): - unittest.skipUnless(self.keytool, 'requires keytool to run') + if not self.keytool: + self.skipTest('requires keytool to run') pat = re.compile(r'[0-9A-F:]{95}') cmd = [self.keytool, '-printcert', '-jarfile'] for apk, fingerprint in APKS_WITH_JAR_SIGNATURES: @@ -3199,7 +3185,8 @@ class SignerExtractionTest(unittest.TestCase): @unittest.skip("slow and only needed when adding to APKS_WITH_JAR_SIGNATURES") def test_vs_apksigner(self): - unittest.skipUnless(self.apksigner, 'requires apksigner to run') + if not self.apksigner: + self.skipTest('requires apksigner to run') pat = re.compile(r'\s[0-9a-f]{64}\s') cmd = [self.apksigner, 'verify', '--print-certs'] for apk, fingerprint in APKS_WITH_JAR_SIGNATURES + APKS_WITHOUT_JAR_SIGNATURES: @@ -3353,21 +3340,3 @@ class ConfigOptionsScopeTest(unittest.TestCase): 'config' not in vars() and 'config' not in globals(), "The config should not be set in the global context, only module-level.", ) - - -if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - - parser = ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - parse_args_for_test(parser, sys.argv) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(CommonTest)) - unittest.main(failfast=False) diff --git a/tests/deploy.TestCase b/tests/test_deploy.py similarity index 97% rename from tests/deploy.TestCase rename to tests/test_deploy.py index 649f8d58..d6c32d89 100755 --- a/tests/deploy.TestCase +++ b/tests/test_deploy.py @@ -1,11 +1,8 @@ #!/usr/bin/env python3 import configparser -import inspect -import logging import os import shutil -import sys import tempfile import unittest from pathlib import Path @@ -13,16 +10,10 @@ from unittest import mock import git -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) +import fdroidserver +from .testcommon import TmpCwd, mkdtemp -import fdroidserver.common -import fdroidserver.deploy -from fdroidserver.exception import FDroidException -from testcommon import TmpCwd, mkdtemp, parse_args_for_test +basedir = Path(__file__).parent class Options: @@ -34,9 +25,7 @@ class DeployTest(unittest.TestCase): '''fdroidserver/deploy.py''' def setUp(self): - logging.basicConfig(level=logging.DEBUG) - self.basedir = os.path.join(localmodule, 'tests') - os.chdir(self.basedir) + os.chdir(basedir) self._td = mkdtemp() self.testdir = self._td.name @@ -281,7 +270,7 @@ class DeployTest(unittest.TestCase): def test_update_serverwebroot_no_rsync_error(self): os.environ['PATH'] = self.testdir os.chdir(self.testdir) - with self.assertRaises(FDroidException): + with self.assertRaises(fdroidserver.exception.FDroidException): fdroidserver.deploy.update_serverwebroot('serverwebroot', 'repo') def test_update_serverwebroot_make_cur_version_link(self): @@ -981,7 +970,7 @@ class DeployTest(unittest.TestCase): for file in files_to_upload ] mock_driver.upload_object_via_stream.assert_has_calls(calls, any_order=True) - assert mock_driver.upload_object_via_stream.call_count == 2 + self.assertEqual(mock_driver.upload_object_via_stream.call_count, 2) def test_update_awsbucket_libcloud_in_index_only_mode(self): from libcloud.storage.base import Container @@ -1047,7 +1036,7 @@ class DeployTest(unittest.TestCase): calls, any_order=False, ) - assert mock_driver.upload_object_via_stream.call_count == 1 + self.assertEqual(mock_driver.upload_object_via_stream.call_count, 1) def test_update_servergitmirrors(self): # setup parameters for this test run @@ -1461,7 +1450,7 @@ class Test_UploadToGithubReleasesRepo(unittest.TestCase): ) def test_local_token(self): - self.repo_conf["token"] = "local_token" + self.repo_conf["token"] = "local_token" # nosec B105 with unittest.mock.patch("fdroidserver.github.GithubApi", self.api_constructor): fdroidserver.deploy.upload_to_github_releases_repo( self.repo_conf, @@ -1488,25 +1477,3 @@ class Test_UploadToGithubReleasesRepo(unittest.TestCase): ), ], ) - - -if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - parse_args_for_test(parser, sys.argv) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(DeployTest)) - newSuite.addTest(unittest.makeSuite(GitHubReleasesTest)) - newSuite.addTest(unittest.makeSuite(Test_UploadToGithubReleasesRepo)) - unittest.main(failfast=False) diff --git a/tests/exception.TestCase b/tests/test_exception.py similarity index 55% rename from tests/exception.TestCase rename to tests/test_exception.py index f3e69e69..accc6653 100755 --- a/tests/exception.TestCase +++ b/tests/test_exception.py @@ -1,21 +1,7 @@ #!/usr/bin/env python3 -# http://www.drdobbs.com/testing/unit-testing-with-python/240165163 - -import inspect -import os -import sys import unittest - -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) - -import fdroidserver.common -import fdroidserver.exception +import fdroidserver class ExceptionTest(unittest.TestCase): @@ -51,24 +37,3 @@ class ExceptionTest(unittest.TestCase): raise fdroidserver.exception.FDroidException(('one', 'two', 'three')) except fdroidserver.exception.FDroidException as e: str(e) - - -if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - - import argparse - from testcommon import parse_args_for_test - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - parse_args_for_test(parser, sys.argv) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(ExceptionTest)) - unittest.main(failfast=False) diff --git a/tests/github.TestCase b/tests/test_github.py similarity index 79% rename from tests/github.TestCase rename to tests/test_github.py index 608d7215..e1e9ac3e 100755 --- a/tests/github.TestCase +++ b/tests/test_github.py @@ -1,21 +1,10 @@ #!/usr/bin/env python3 -import inspect -import optparse -import os -import sys +import unittest import unittest.mock -import testcommon -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) - -import fdroidserver.github -import fdroidserver.common +from .testcommon import mock_urlopen +import fdroidserver class GithubApiTest(unittest.TestCase): @@ -40,7 +29,7 @@ class GithubApiTest(unittest.TestCase): def test_list_released_tags(self): api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath') - uomock = testcommon.mock_urlopen( + uomock = mock_urlopen( body='[{"tag_name": "fake"}, {"tag_name": "double_fake"}]' ) with unittest.mock.patch("urllib.request.urlopen", uomock): @@ -59,7 +48,7 @@ class GithubApiTest(unittest.TestCase): def test_tag_exists(self): api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath') - uomock = testcommon.mock_urlopen(body='[{"ref": "refs/tags/fake_tag"}]') + uomock = mock_urlopen(body='[{"ref": "refs/tags/fake_tag"}]') with unittest.mock.patch("urllib.request.urlopen", uomock): result = api.tag_exists('fake_tag') self.assertTrue(result) @@ -67,7 +56,7 @@ class GithubApiTest(unittest.TestCase): def test_tag_exists_failure(self): api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath') - uomock = testcommon.mock_urlopen(body='[{"error": "failure"}]') + uomock = mock_urlopen(body='[{"error": "failure"}]') with unittest.mock.patch("urllib.request.urlopen", uomock): success = api.tag_exists('fake_tag') @@ -77,7 +66,7 @@ class GithubApiTest(unittest.TestCase): def test_list_all_tags(self): api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath') - uomock = testcommon.mock_urlopen( + uomock = mock_urlopen( body='[{"ref": "refs/tags/fake"}, {"ref": "refs/tags/double_fake"}]' ) @@ -89,7 +78,7 @@ class GithubApiTest(unittest.TestCase): def test_create_release(self): api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath') - uomock = testcommon.mock_urlopen(body='{"id": "fakeid"}') + uomock = mock_urlopen(body='{"id": "fakeid"}') api.tag_exists = lambda x: True api._create_release_asset = unittest.mock.Mock() @@ -116,7 +105,7 @@ class GithubApiTest(unittest.TestCase): def test__create_release_asset(self): api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath') - uomock = testcommon.mock_urlopen() + uomock = mock_urlopen() with unittest.mock.patch( 'fdroidserver.github.open', @@ -144,21 +133,3 @@ class GithubApiTest(unittest.TestCase): }, ) self.assertEqual(req.data, b'fake_content') - - -if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - - parser = optparse.OptionParser() - parser.add_option( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - (fdroidserver.common.options, args) = parser.parse_args(["--verbose"]) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(GithubApiTest)) - unittest.main(failfast=False) diff --git a/tests/gpgsign.TestCase b/tests/test_gpgsign.py similarity index 60% rename from tests/gpgsign.TestCase rename to tests/test_gpgsign.py index 1c013c1b..f73b217e 100755 --- a/tests/gpgsign.TestCase +++ b/tests/test_gpgsign.py @@ -1,31 +1,20 @@ #!/usr/bin/env python3 -import inspect import json -import logging import os import shutil -import sys import tempfile import unittest -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) - from fdroidserver import common, gpgsign from pathlib import Path from unittest.mock import MagicMock, patch +basedir = Path(__file__).parent + class GpgsignTest(unittest.TestCase): - basedir = Path(__file__).resolve().parent - def setUp(self): - logging.basicConfig(level=logging.DEBUG) self.tempdir = tempfile.TemporaryDirectory() os.chdir(self.tempdir.name) self.repodir = Path('repo') @@ -34,7 +23,7 @@ class GpgsignTest(unittest.TestCase): gpgsign.config = None config = common.read_config() config['verbose'] = True - config['gpghome'] = str((self.basedir / 'gnupghome').resolve()) + config['gpghome'] = str((basedir / 'gnupghome').resolve()) config['gpgkey'] = '1DBA2E89' gpgsign.config = config @@ -46,8 +35,8 @@ class GpgsignTest(unittest.TestCase): def test_sign_index(self, FDroidPopen): """This skips running gpg because its hard to setup in a test env""" index_v1_json = 'repo/index-v1.json' - shutil.copy(str(self.basedir / index_v1_json), 'repo') - shutil.copy(str(self.basedir / 'SpeedoMeterApp.main_1.apk'), 'repo') + shutil.copy(basedir / index_v1_json, 'repo') + shutil.copy(basedir / 'SpeedoMeterApp.main_1.apk', 'repo') def _side_effect(gpg): f = gpg[-1] @@ -68,24 +57,4 @@ class GpgsignTest(unittest.TestCase): # smoke check status JSON with (self.repodir / 'status/gpgsign.json').open() as fp: data = json.load(fp) - self.assertTrue('index-v1.json' in data['signed']) - - -if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - common.parse_args(parser) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(GpgsignTest)) - unittest.main(failfast=False) + self.assertIn('index-v1.json', data['signed']) diff --git a/tests/import_subcommand.TestCase b/tests/test_import_subcommand.py similarity index 83% rename from tests/import_subcommand.TestCase rename to tests/test_import_subcommand.py index 411f500d..4483841d 100755 --- a/tests/import_subcommand.TestCase +++ b/tests/test_import_subcommand.py @@ -1,7 +1,5 @@ #!/usr/bin/env python3 -# http://www.drdobbs.com/testing/unit-testing-with-python/240165163 - import logging import os import shutil @@ -15,31 +13,25 @@ import git import requests import yaml -localmodule = Path(__file__).resolve().parent.parent -print('localmodule: ' + str(localmodule)) -if localmodule not in sys.path: - sys.path.insert(0, str(localmodule)) +from .testcommon import TmpCwd, mkdtemp -from testcommon import TmpCwd, mkdtemp, parse_args_for_test - -import fdroidserver.common +import fdroidserver import fdroidserver.import_subcommand -import fdroidserver.metadata -from fdroidserver.exception import FDroidException + +basedir = Path(__file__).parent +logging.basicConfig(level=logging.DEBUG) class ImportTest(unittest.TestCase): '''fdroid import''' def setUp(self): - logging.basicConfig(level=logging.DEBUG) - self.basedir = localmodule / 'tests' - os.chdir(self.basedir) + os.chdir(basedir) self._td = mkdtemp() self.testdir = self._td.name def tearDown(self): - os.chdir(self.basedir) + os.chdir(basedir) self._td.cleanup() def test_get_all_gradle_and_manifests(self): @@ -63,7 +55,7 @@ class ImportTest(unittest.TestCase): paths = [Path('source-files/cn.wildfirechat.chat') / path for path in paths] self.assertEqual(sorted(paths), sorted(a)) - abspath = Path(self.basedir) / 'source-files/realm' + abspath = basedir / 'source-files/realm' p = fdroidserver.import_subcommand.get_all_gradle_and_manifests(abspath) self.assertEqual(1, len(p)) self.assertTrue(p[0].is_relative_to(abspath)) @@ -99,6 +91,7 @@ class ImportTest(unittest.TestCase): print('Skipping ImportTest!') return + fdroidserver.common.options = type('Options', (), {'verbose': False}) app = fdroidserver.import_subcommand.get_app_from_url(url) fdroidserver.import_subcommand.clone_to_tmp_dir(app) self.assertEqual(app.RepoType, 'git') @@ -134,7 +127,7 @@ class ImportTest(unittest.TestCase): tmp_importer, onerror=fdroidserver.import_subcommand.handle_retree_error_on_windows, ) - shutil.copytree(self.basedir / 'source-files' / appid, tmp_importer) + shutil.copytree(basedir / 'source-files' / appid, tmp_importer) app = fdroidserver.import_subcommand.get_app_from_url(url) with mock.patch( @@ -185,7 +178,7 @@ class ImportTest(unittest.TestCase): the network, if it gets past the code that throws the error. """ - with self.assertRaises(FDroidException): + with self.assertRaises(fdroidserver.exception.FDroidException): fdroidserver.import_subcommand.main() @mock.patch('sys.argv', ['fdroid import', '-u', 'https://fake/git/url.git']) @@ -195,29 +188,12 @@ class ImportTest(unittest.TestCase): def test_main_local_git(self): os.chdir(self.testdir) git.Repo.init('td') - with Path('td/build.gradle').open('w') as fp: - fp.write('android { defaultConfig { applicationId "com.example" } }') + Path('td/build.gradle').write_text( + 'android { defaultConfig { applicationId "com.example" } }' + ) fdroidserver.import_subcommand.main() with open('metadata/com.example.yml') as fp: data = yaml.safe_load(fp) self.assertEqual(data['Repo'], sys.argv[2]) self.assertEqual(data['RepoType'], 'git') self.assertEqual(1, len(data['Builds'])) - - -if __name__ == "__main__": - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - parse_args_for_test(parser, sys.argv) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(ImportTest)) - unittest.main(failfast=False) diff --git a/tests/index.TestCase b/tests/test_index.py similarity index 93% rename from tests/index.TestCase rename to tests/test_index.py index facc9e77..7e315daa 100755 --- a/tests/index.TestCase +++ b/tests/test_index.py @@ -3,11 +3,9 @@ import copy import datetime import glob -import inspect -import logging import os -import sys import unittest +from pathlib import Path import yaml import zipfile from unittest.mock import patch @@ -16,17 +14,12 @@ import tempfile import json import shutil -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) - import fdroidserver from fdroidserver import common, index, publish, signindex, update -from testcommon import GP_FINGERPRINT, TmpCwd, mkdtemp, parse_args_for_test -from pathlib import Path +from .testcommon import GP_FINGERPRINT, TmpCwd, mkdtemp + + +basedir = Path(__file__).parent class Options: @@ -38,17 +31,15 @@ class Options: class IndexTest(unittest.TestCase): @classmethod def setUpClass(cls): - cls.basedir = os.path.join(localmodule, 'tests') # TODO something should remove cls.index_v1_jar, but it was # causing the tests to be flaky. There seems to be something # that is running the background somehow, maybe sign_index() # exits before jarsigner actually finishes? - cls.index_v1_jar = os.path.join(cls.basedir, 'repo', 'index-v1.jar') + cls.index_v1_jar = basedir / 'repo' / 'index-v1.jar' def setUp(self): - logging.basicConfig(level=logging.ERROR) - os.chmod(os.path.join(self.basedir, 'config.py'), 0o600) - os.chdir(self.basedir) # so read_config() can find config.py + (basedir / 'config.py').chmod(0o600) + os.chdir(basedir) # so read_config() can find config.py common.config = None common.options = Options @@ -65,11 +56,11 @@ class IndexTest(unittest.TestCase): self._td.cleanup() def _sign_test_index_v1_jar(self): - if not os.path.exists(self.index_v1_jar): - signindex.sign_index(os.path.dirname(self.index_v1_jar), 'index-v1.json') + if not self.index_v1_jar.exists(): + signindex.sign_index(self.index_v1_jar.parent, 'index-v1.json') def test_get_public_key_from_jar_succeeds(self): - source_dir = os.path.join(self.basedir, 'signindex') + source_dir = basedir / 'signindex' for f in ('testy.jar', 'guardianproject.jar'): testfile = os.path.join(source_dir, f) jar = zipfile.ZipFile(testfile) @@ -85,7 +76,7 @@ class IndexTest(unittest.TestCase): self.assertTrue(fingerprint == GP_FINGERPRINT) def test_get_public_key_from_jar_fails(self): - source_dir = os.path.join(self.basedir, 'signindex') + source_dir = basedir / 'signindex' testfile = os.path.join(source_dir, 'unsigned.jar') jar = zipfile.ZipFile(testfile) with self.assertRaises(index.VerificationException): @@ -186,10 +177,10 @@ class IndexTest(unittest.TestCase): self.testdir, 'repo', os.path.basename(mirrors[0]['url']) ) os.chdir(self.testdir) - signindex.config['keystore'] = os.path.join(self.basedir, 'keystore.jks') + signindex.config['keystore'] = os.path.join(basedir, 'keystore.jks') os.mkdir('repo') - shutil.copy(os.path.join(self.basedir, 'repo', 'entry.json'), 'repo') - shutil.copy(os.path.join(self.basedir, 'repo', 'index-v2.json'), 'repo') + shutil.copy(basedir / 'repo' / 'entry.json', 'repo') + shutil.copy(basedir / 'repo' / 'index-v2.json', 'repo') signindex.sign_index('repo', 'entry.json') repo_url = 'https://fake.url/fdroid/repo' entry_url = 'https://fake.url/fdroid/repo/entry.jar' @@ -209,10 +200,10 @@ class IndexTest(unittest.TestCase): self.testdir, 'repo', os.path.basename(mirrors[0]['url']) ) os.chdir(self.testdir) - signindex.config['keystore'] = os.path.join(self.basedir, 'keystore.jks') + signindex.config['keystore'] = os.path.join(basedir, 'keystore.jks') os.mkdir('repo') - shutil.copy(os.path.join(self.basedir, 'repo', 'entry.json'), 'repo') - shutil.copy(os.path.join(self.basedir, 'repo', 'index-v2.json'), 'repo') + shutil.copy(basedir / 'repo' / 'entry.json', 'repo') + shutil.copy(basedir / 'repo' / 'index-v2.json', 'repo') signindex.sign_index('repo', 'entry.json') bad_fp = '0123456789001234567890012345678900123456789001234567890012345678' bad_fp_url = 'https://fake.url/fdroid/repo?fingerprint=' + bad_fp @@ -240,10 +231,10 @@ class IndexTest(unittest.TestCase): mock_download_using_mirrors.side_effect = download_using_mirrors_def os.chdir(self.testdir) - signindex.config['keystore'] = os.path.join(self.basedir, 'keystore.jks') + signindex.config['keystore'] = os.path.join(basedir, 'keystore.jks') os.mkdir('repo') - shutil.copy(os.path.join(self.basedir, 'repo', 'entry.json'), 'repo') - shutil.copy(os.path.join(self.basedir, 'repo', 'index-v2.json'), 'repo') + shutil.copy(basedir / 'repo' / 'entry.json', 'repo') + shutil.copy(basedir / 'repo' / 'index-v2.json', 'repo') signindex.sign_index('repo', 'entry.json') url = 'https://fake.url/fdroid/repo?fingerprint=' + GP_FINGERPRINT with self.assertRaises(fdroidserver.exception.VerificationException): @@ -438,7 +429,7 @@ class IndexTest(unittest.TestCase): os.mkdir('metadata') os.mkdir('repo') metadatafile = 'metadata/info.zwanenburg.caffeinetile.yml' - shutil.copy(os.path.join(self.basedir, metadatafile), metadatafile) + shutil.copy(os.path.join(basedir, metadatafile), metadatafile) repo_icons_dir = os.path.join('repo', 'icons') self.assertFalse(os.path.isdir(repo_icons_dir)) repodict = { @@ -648,13 +639,13 @@ class IndexTest(unittest.TestCase): html = f.read() pretty_html = HTMLBeautifier.beautify(html) self.maxDiff = None - self.assertEquals(html, pretty_html) + self.assertEqual(html, pretty_html) with open(os.path.join("repo", "index.css")) as f: css = f.read() pretty_css = CSSBeautifier.beautify(css) self.maxDiff = None - self.assertEquals(css, pretty_css) + self.assertEqual(css, pretty_css) def test_v1_sort_packages_with_invalid(self): i = [ @@ -729,7 +720,6 @@ class IndexTest(unittest.TestCase): c = {'repo_url': repo_url, 'mirrors': ['http://one/fdroid']} with open('config.yml', 'w') as fp: yaml.dump(c, fp) - os.system('cat config.yml') common.config = None common.read_config() repodict = {'address': common.config['repo_url']} @@ -866,8 +856,7 @@ class AltstoreIndexTest(unittest.TestCase): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): repodir = Path(tmpdir) / 'repo' repodir.mkdir() - with open(repodir / "fake.ipa", "w") as f: - f.write("") + (repodir / "fake.ipa").touch() fdroidserver.index.make_altstore( apps, @@ -916,24 +905,3 @@ class AltstoreIndexTest(unittest.TestCase): }, json.load(f), ) - - -if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - parse_args_for_test(parser, sys.argv) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(IndexTest)) - newSuite.addTest(unittest.makeSuite(AltstoreIndexTest)) - unittest.main(failfast=False) diff --git a/tests/test_init.py b/tests/test_init.py new file mode 100755 index 00000000..fcbc83d0 --- /dev/null +++ b/tests/test_init.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 + +import os +import pathlib +import shutil +import sys +import unittest + +import fdroidserver.common +import fdroidserver.init +from . import testcommon + +basedir = pathlib.Path(__file__).parent + + +class InitTest(unittest.TestCase): + '''fdroidserver/init.py''' + + def setUp(self): + fdroidserver.common.config = None + fdroidserver.init.config = None + self._td = testcommon.mkdtemp() + self.testdir = self._td.name + os.chdir(self.testdir) + + def tearDown(self): + os.chdir(basedir) + self._td.cleanup() + + def test_disable_in_config(self): + configfile = pathlib.Path('config.yml') + configfile.write_text('keystore: NONE\nkeypass: mysupersecrets\n') + configfile.chmod(0o600) + config = fdroidserver.common.read_config() + self.assertEqual('NONE', config['keystore']) + self.assertEqual('mysupersecrets', config['keypass']) + fdroidserver.init.disable_in_config('keypass', 'comment') + self.assertIn('#keypass:', configfile.read_text()) + fdroidserver.common.config = None + config = fdroidserver.common.read_config() + self.assertIsNone(config.get('keypass')) + + @unittest.skipIf(os.name == 'nt', "calling main() like this hangs on Windows") + def test_main_in_empty_dir(self): + """Test that `fdroid init` will find apksigner and add it to the config""" + + shutil.copy(basedir / 'keystore.jks', self.testdir) + + bindir = os.path.join(os.getcwd(), 'bin') + os.mkdir(bindir) + apksigner = os.path.join(bindir, 'apksigner') + open(apksigner, 'w').close() + os.chmod(apksigner, 0o755) # nosec B103 + + sys.argv = ['fdroid init', '--keystore', 'keystore.jks', '--repo-keyalias=sova'] + with unittest.mock.patch.dict(os.environ, {'PATH': bindir}): + fdroidserver.init.main() + self.assertEqual(apksigner, fdroidserver.init.config.get('apksigner')) diff --git a/tests/install.TestCase b/tests/test_install.py similarity index 92% rename from tests/install.TestCase rename to tests/test_install.py index 351cc420..1015b4be 100755 --- a/tests/install.TestCase +++ b/tests/test_install.py @@ -1,23 +1,12 @@ #!/usr/bin/env python3 -# http://www.drdobbs.com/testing/unit-testing-with-python/240165163 - -import inspect import os -import sys import textwrap import unittest from pathlib import Path from unittest.mock import Mock, patch -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) - import fdroidserver from fdroidserver import common, install from fdroidserver.exception import BuildException, FDroidException @@ -265,24 +254,3 @@ class InstallTest(unittest.TestCase): def test_download_fdroid_apk_from_github(self): f = install.download_fdroid_apk_from_github() self.assertTrue(Path(f).exists()) - - -if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - - import argparse - from testcommon import parse_args_for_test - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - fdroidserver.install.options = parse_args_for_test(parser, sys.argv) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(InstallTest)) - unittest.main(failfast=False) diff --git a/tests/lint.TestCase b/tests/test_lint.py similarity index 93% rename from tests/lint.TestCase rename to tests/test_lint.py index 409c807c..f70b03b2 100755 --- a/tests/lint.TestCase +++ b/tests/test_lint.py @@ -1,39 +1,28 @@ #!/usr/bin/env python3 -# http://www.drdobbs.com/testing/unit-testing-with-python/240165163 - import logging import os import shutil -import sys import tempfile import unittest from pathlib import Path import ruamel.yaml -localmodule = Path(__file__).resolve().parent.parent -print('localmodule: ' + str(localmodule)) -if localmodule not in sys.path: - sys.path.insert(0, str(localmodule)) - -from testcommon import mkdtemp, parse_args_for_test +from .testcommon import mkdtemp import fdroidserver.common import fdroidserver.lint import fdroidserver.metadata -from fdroidserver.common import CATEGORIES_CONFIG_NAME + +basedir = Path(__file__).parent class LintTest(unittest.TestCase): '''fdroidserver/lint.py''' def setUp(self): - logging.basicConfig(level=logging.DEBUG) - self.basedir = localmodule / 'tests' - self.tmpdir = localmodule / '.testfiles' - self.tmpdir.mkdir(exist_ok=True) - os.chdir(self.basedir) + os.chdir(basedir) fdroidserver.common.config = None fdroidserver.lint.config = None fdroidserver.lint.CATEGORIES_KEYS = None @@ -46,13 +35,13 @@ class LintTest(unittest.TestCase): def test_check_for_unsupported_metadata_files(self): self.assertTrue(fdroidserver.lint.check_for_unsupported_metadata_files()) - with tempfile.TemporaryDirectory(dir=str(self.tmpdir)) as testdir: + with tempfile.TemporaryDirectory() as testdir: testdir = Path(testdir) self.assertFalse( fdroidserver.lint.check_for_unsupported_metadata_files(testdir) ) shutil.copytree( - self.basedir / 'metadata', + basedir / 'metadata', testdir / 'metadata', ignore=shutil.ignore_patterns('apk', 'dump', '*.json'), ) @@ -326,7 +315,9 @@ class LintTest(unittest.TestCase): self.assertFalse(anywarns) def test_check_categories_in_config(self): - fdroidserver.lint.config = {CATEGORIES_CONFIG_NAME: ['InConfig']} + fdroidserver.lint.config = { + fdroidserver.common.CATEGORIES_CONFIG_NAME: ['InConfig'] + } fdroidserver.lint.load_categories_config() app = fdroidserver.metadata.App({'Categories': ['InConfig']}) self.assertEqual(0, len(list(fdroidserver.lint.check_categories(app)))) @@ -338,13 +329,15 @@ class LintTest(unittest.TestCase): self.assertEqual(1, len(list(fdroidserver.lint.check_categories(app)))) def test_check_categories_empty_is_error(self): - fdroidserver.lint.config = {CATEGORIES_CONFIG_NAME: []} + fdroidserver.lint.config = {fdroidserver.common.CATEGORIES_CONFIG_NAME: []} fdroidserver.lint.load_categories_config() app = fdroidserver.metadata.App({'Categories': ['something']}) self.assertEqual(1, len(list(fdroidserver.lint.check_categories(app)))) def test_check_categories_old_hardcoded_not_defined(self): - fdroidserver.lint.config = {CATEGORIES_CONFIG_NAME: ['foo', 'bar']} + fdroidserver.lint.config = { + fdroidserver.common.CATEGORIES_CONFIG_NAME: ['foo', 'bar'] + } fdroidserver.lint.load_categories_config() app = fdroidserver.metadata.App({'Categories': ['Writing']}) self.assertEqual(1, len(list(fdroidserver.lint.check_categories(app)))) @@ -493,8 +486,7 @@ class LintTest(unittest.TestCase): class LintAntiFeaturesTest(unittest.TestCase): def setUp(self): - self.basedir = localmodule / 'tests' - os.chdir(self.basedir) + os.chdir(basedir) fdroidserver.common.config = dict() fdroidserver.lint.ANTIFEATURES_KEYS = None fdroidserver.lint.load_antiFeatures_config() @@ -537,21 +529,3 @@ class LintAntiFeaturesTest(unittest.TestCase): app = fdroidserver.metadata.App() app['Builds'] = [{'antifeatures': ['Ads', 'Tracker']}] self.assertEqual(1, len(list(fdroidserver.lint.check_antiFeatures(app)))) - - -if __name__ == "__main__": - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - fdroidserver.lint.options = parse_args_for_test(parser, sys.argv) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(LintTest)) - unittest.main(failfast=False) diff --git a/tests/main.TestCase b/tests/test_main.py similarity index 90% rename from tests/main.TestCase rename to tests/test_main.py index 691a0aca..25da93fa 100755 --- a/tests/main.TestCase +++ b/tests/test_main.py @@ -1,24 +1,14 @@ #!/usr/bin/env python3 -import inspect import os -import sys import pkgutil import textwrap import unittest import tempfile from unittest import mock -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) - -from fdroidserver import common import fdroidserver.__main__ -from testcommon import TmpCwd, TmpPyPath +from .testcommon import TmpCwd, TmpPyPath class MainTest(unittest.TestCase): @@ -27,7 +17,7 @@ class MainTest(unittest.TestCase): def test_COMMANDS_check(self): """make sure the built in sub-command defs didn't change unintentionally""" self.assertListEqual( - [x for x in fdroidserver.__main__.COMMANDS.keys()], + [x for x in fdroidserver.__main__.COMMANDS], [ 'build', 'init', @@ -206,12 +196,7 @@ class MainTest(unittest.TestCase): def test_preparse_plugin_lookup_summary_missing(self): with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): with open('fdroid_testy6.py', 'w') as f: - f.write( - textwrap.dedent( - """\ - main = lambda: print('all good')""" - ) - ) + f.write("main = lambda: print('all good')") with TmpPyPath(tmpdir): p = [x for x in pkgutil.iter_modules() if x[1].startswith('fdroid_')] module_dir = p[0][0].path @@ -259,23 +244,3 @@ class MainTest(unittest.TestCase): module_name = p[0][1] d = fdroidserver.__main__.preparse_plugin(module_name, module_path) self.assertDictEqual(d, {'name': 'fdroid_testy8', 'summary': 'ttt'}) - - -if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - common.options = common.parse_args(parser) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(MainTest)) - unittest.main(failfast=False) diff --git a/tests/metadata.TestCase b/tests/test_metadata.py similarity index 97% rename from tests/metadata.TestCase rename to tests/test_metadata.py index 75dc3b91..cd4d12a9 100755 --- a/tests/metadata.TestCase +++ b/tests/test_metadata.py @@ -2,12 +2,10 @@ import copy import io -import logging import os import random import ruamel.yaml import shutil -import sys import unittest import tempfile import textwrap @@ -15,16 +13,14 @@ from collections import OrderedDict from pathlib import Path from unittest import mock -localmodule = Path(__file__).resolve().parent.parent -print('localmodule: ' + str(localmodule)) -if localmodule not in sys.path: - sys.path.insert(0, str(localmodule)) - import fdroidserver from fdroidserver import metadata from fdroidserver.exception import MetaDataException from fdroidserver.common import DEFAULT_LOCALE -from testcommon import TmpCwd, mkdtemp, parse_args_for_test +from .testcommon import TmpCwd, mkdtemp + + +basedir = Path(__file__).parent def _get_mock_mf(s): @@ -37,9 +33,7 @@ class MetadataTest(unittest.TestCase): '''fdroidserver/metadata.py''' def setUp(self): - logging.basicConfig(level=logging.DEBUG) - self.basedir = localmodule / 'tests' - os.chdir(self.basedir) + os.chdir(basedir) self._td = mkdtemp() self.testdir = self._td.name fdroidserver.metadata.warnings_action = 'error' @@ -57,12 +51,12 @@ class MetadataTest(unittest.TestCase): pass def test_fieldtypes_key_exist(self): - for k in fdroidserver.metadata.fieldtypes.keys(): - self.assertTrue(k in fdroidserver.metadata.yaml_app_fields) + for k in fdroidserver.metadata.fieldtypes: + self.assertIn(k, fdroidserver.metadata.yaml_app_fields) def test_build_flagtypes_key_exist(self): - for k in fdroidserver.metadata.flagtypes.keys(): - self.assertTrue(k in fdroidserver.metadata.build_flags) + for k in fdroidserver.metadata.flagtypes: + self.assertIn(k, fdroidserver.metadata.build_flags) def test_FieldValidator_BitcoinAddress(self): validator = None @@ -183,7 +177,7 @@ class MetadataTest(unittest.TestCase): def test_valid_funding_yml_regex(self): """Check the regex can find all the cases""" - with (self.basedir / 'funding-usernames.yaml').open() as fp: + with (basedir / 'funding-usernames.yaml').open() as fp: yaml = ruamel.yaml.YAML(typ='safe') data = yaml.load(fp) @@ -201,9 +195,9 @@ class MetadataTest(unittest.TestCase): m, 'this is a valid %s username: {%s}' % (k, entry) ) - @mock.patch('git.Repo') + @mock.patch('git.Repo', mock.Mock()) @mock.patch('logging.error') - def test_read_metadata(self, logging_error, git_repo): + def test_read_metadata(self, logging_error): """Read specified metadata files included in tests/, compare to stored output""" self.maxDiff = None @@ -239,8 +233,8 @@ class MetadataTest(unittest.TestCase): logging_error.assert_called() self.assertEqual(3, len(logging_error.call_args_list)) - @mock.patch('git.Repo') - def test_metadata_overrides_dot_fdroid_yml(self, git_Repo): + @mock.patch('git.Repo', mock.Mock()) + def test_metadata_overrides_dot_fdroid_yml(self): """Fields in metadata files should override anything in .fdroid.yml.""" app = metadata.parse_metadata('metadata/info.guardianproject.urzip.yml') self.assertEqual(app['Summary'], '一个实用工具,获取已安装在您的设备上的应用的有关信息') @@ -258,9 +252,9 @@ class MetadataTest(unittest.TestCase): fp.write('OpenCollective: test') metadata.parse_metadata(yml) # should not throw an exception - @mock.patch('git.Repo') + @mock.patch('git.Repo', mock.Mock()) @mock.patch('logging.error') - def test_rewrite_yaml_fakeotaupdate(self, logging_error, git_Repo): + def test_rewrite_yaml_fakeotaupdate(self, logging_error): with tempfile.TemporaryDirectory() as testdir: testdir = Path(testdir) fdroidserver.common.config = {'accepted_formats': ['yml']} @@ -286,8 +280,8 @@ class MetadataTest(unittest.TestCase): logging_error.assert_called() self.assertEqual(3, len(logging_error.call_args_list)) - @mock.patch('git.Repo') - def test_rewrite_yaml_fdroidclient(self, git_Repo): + @mock.patch('git.Repo', mock.Mock()) + def test_rewrite_yaml_fdroidclient(self): with tempfile.TemporaryDirectory() as testdir: testdir = Path(testdir) fdroidserver.common.config = {'accepted_formats': ['yml']} @@ -308,14 +302,14 @@ class MetadataTest(unittest.TestCase): (Path('metadata-rewrite-yml') / file_name).read_text(encoding='utf-8'), ) - @mock.patch('git.Repo') - def test_rewrite_yaml_special_build_params(self, git_Repo): + @mock.patch('git.Repo', mock.Mock()) + def test_rewrite_yaml_special_build_params(self): """Test rewriting a plain YAML metadata file without localized files.""" os.chdir(self.testdir) os.mkdir('metadata') appid = 'app.with.special.build.params' file_name = Path('metadata/%s.yml' % appid) - shutil.copy(self.basedir / file_name, file_name) + shutil.copy(basedir / file_name, file_name) # rewrite metadata allapps = fdroidserver.metadata.read_metadata({appid: -1}) @@ -326,7 +320,7 @@ class MetadataTest(unittest.TestCase): self.maxDiff = None self.assertEqual( file_name.read_text(), - (self.basedir / 'metadata-rewrite-yml' / file_name.name).read_text(), + (basedir / 'metadata-rewrite-yml' / file_name.name).read_text(), ) def test_normalize_type_string(self): @@ -508,7 +502,7 @@ class MetadataTest(unittest.TestCase): metadatadir.mkdir() randomlist = [] - randomapps = list((self.basedir / 'metadata').glob('*.yml')) + randomapps = list((basedir / 'metadata').glob('*.yml')) random.shuffle(randomapps) i = 1 for f in randomapps: @@ -911,7 +905,7 @@ class MetadataTest(unittest.TestCase): { 'versionCode': 1, 'versionName': 'v0.1.0', - 'prebuild': ["a && b && " "sed -i 's,a,b,'"], + 'prebuild': ["a && b && sed -i 's,a,b,'"], } ], }, @@ -1553,7 +1547,7 @@ class MetadataTest(unittest.TestCase): ) with self.assertRaisesRegex( MetaDataException, - "Invalid srclib metadata: " "unknown key 'Evil' in " "'test.yml'", + "Invalid srclib metadata: unknown key 'Evil' in 'test.yml'", ): fdroidserver.metadata.parse_yaml_srclib(Path('test.yml')) @@ -1788,7 +1782,6 @@ class MetadataTest(unittest.TestCase): ) def test_build_ndk_path(self): - """""" with tempfile.TemporaryDirectory(prefix='android-sdk-') as sdk_path: config = {'ndk_paths': {}, 'sdk_path': sdk_path} fdroidserver.common.config = config @@ -2442,21 +2435,3 @@ class PostMetadataParseTest(unittest.TestCase): self.assertEqual(*self._post_metadata_parse_build_list(True, ['true'])) self.assertEqual(*self._post_metadata_parse_build_script(True, ['true'])) self.assertEqual(*self._post_metadata_parse_build_string(True, 'true')) - - -if __name__ == "__main__": - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - parse_args_for_test(parser, sys.argv) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(MetadataTest)) - unittest.main(failfast=False) diff --git a/tests/net.TestCase b/tests/test_net.py similarity index 85% rename from tests/net.TestCase rename to tests/test_net.py index fa4bec4f..b8c311d3 100755 --- a/tests/net.TestCase +++ b/tests/test_net.py @@ -1,26 +1,16 @@ #!/usr/bin/env python3 -import inspect -import logging import os import random import requests import socket -import sys import tempfile import threading import time import unittest from unittest.mock import MagicMock, patch -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) - -from fdroidserver import common, net +from fdroidserver import net from pathlib import Path @@ -38,7 +28,7 @@ class RetryServer: def __init__(self, port=None, failures=3): self.port = port if self.port is None: - self.port = random.randint(1024, 65535) + self.port = random.randint(1024, 65535) # nosec B311 self.failures = failures self.stop_event = threading.Event() threading.Thread(target=self.run_fake_server).start() @@ -84,10 +74,7 @@ class RetryServer: class NetTest(unittest.TestCase): - basedir = Path(__file__).resolve().parent - def setUp(self): - logging.basicConfig(level=logging.DEBUG) self.tempdir = tempfile.TemporaryDirectory() os.chdir(self.tempdir.name) Path('tmp').mkdir() @@ -155,23 +142,3 @@ class NetTest(unittest.TestCase): with self.assertRaises(requests.exceptions.ConnectionError): net.download_using_mirrors(['http://localhost:%d/' % server.port]) server.stop() - - -if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - common.options = common.parse_args(parser) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(NetTest)) - unittest.main(failfast=False) diff --git a/tests/nightly.TestCase b/tests/test_nightly.py similarity index 89% rename from tests/nightly.TestCase rename to tests/test_nightly.py index b1f9a8eb..09d8fbcf 100755 --- a/tests/nightly.TestCase +++ b/tests/test_nightly.py @@ -1,12 +1,10 @@ #!/usr/bin/env python3 -import inspect -import logging import os +import platform import requests import shutil import subprocess -import sys import tempfile import time import unittest @@ -15,13 +13,6 @@ import yaml from pathlib import Path from unittest.mock import patch -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) - from fdroidserver import common, exception, index, nightly @@ -35,6 +26,9 @@ AOSP_TESTKEY_DEBUG_KEYSTORE_KEY_FILE_NAME = ( 'debug_keystore_k47SVrA85+oMZAexHc62PkgvIgO8TJBYN00U82xSlxc_id_rsa' ) +basedir = Path(__file__).parent +testroot = basedir.with_name('.testfiles') + class Options: allow_disabled_algorithms = False @@ -46,20 +40,20 @@ class Options: verbose = False +@unittest.skipUnless( + platform.system() == 'Linux', + 'skipping test_nightly, it currently only works GNU/Linux', +) class NightlyTest(unittest.TestCase): - basedir = Path(__file__).resolve().parent path = os.environ['PATH'] def setUp(self): common.config = None nightly.config = None - logging.basicConfig(level=logging.WARNING) - self.basedir = Path(localmodule) / 'tests' - self.testroot = Path(localmodule) / '.testfiles' - self.testroot.mkdir(exist_ok=True) - os.chdir(self.basedir) + testroot.mkdir(exist_ok=True) + os.chdir(basedir) self.tempdir = tempfile.TemporaryDirectory( - str(time.time()), self._testMethodName + '_', self.testroot + str(time.time()), self._testMethodName + '_', testroot ) self.testdir = Path(self.tempdir.name) self.home = self.testdir / 'home' @@ -70,21 +64,21 @@ class NightlyTest(unittest.TestCase): def tearDown(self): self.tempdir.cleanup() try: - os.rmdir(self.testroot) + os.rmdir(testroot) except OSError: # other test modules might have left stuff around pass def _copy_test_debug_keystore(self): self.dot_android.mkdir() shutil.copy( - self.basedir / 'aosp_testkey_debug.keystore', + basedir / 'aosp_testkey_debug.keystore', self.dot_android / 'debug.keystore', ) def _copy_debug_apk(self): outputdir = Path('app/build/output/apk/debug') outputdir.mkdir(parents=True) - shutil.copy(self.basedir / 'urzip.apk', outputdir / 'urzip-debug.apk') + shutil.copy(basedir / 'urzip.apk', outputdir / 'urzip-debug.apk') def test_get_repo_base_url(self): for clone_url, repo_git_base, result in [ @@ -108,9 +102,7 @@ class NightlyTest(unittest.TestCase): def test_get_keystore_secret_var(self): self.assertEqual( AOSP_TESTKEY_DEBUG_KEYSTORE, - nightly._get_keystore_secret_var( - self.basedir / 'aosp_testkey_debug.keystore' - ), + nightly._get_keystore_secret_var(basedir / 'aosp_testkey_debug.keystore'), ) @patch.dict(os.environ, clear=True) @@ -118,12 +110,12 @@ class NightlyTest(unittest.TestCase): os.environ['HOME'] = str(self.home) os.environ['PATH'] = self.path ssh_private_key_file = nightly._ssh_key_from_debug_keystore( - self.basedir / 'aosp_testkey_debug.keystore' + basedir / 'aosp_testkey_debug.keystore' ) with open(ssh_private_key_file) as fp: - assert '-----BEGIN RSA PRIVATE KEY-----' in fp.read() + self.assertIn('-----BEGIN RSA PRIVATE KEY-----', fp.read()) with open(ssh_private_key_file + '.pub') as fp: - assert fp.read(8) == 'ssh-rsa ' + self.assertEqual(fp.read(8), 'ssh-rsa ') shutil.rmtree(os.path.dirname(ssh_private_key_file)) @patch.dict(os.environ, clear=True) @@ -149,9 +141,9 @@ class NightlyTest(unittest.TestCase): self._copy_test_debug_keystore() os.environ['HOME'] = str(self.home) os.environ['PATH'] = self.path - assert not dot_ssh.exists() + self.assertFalse(dot_ssh.exists()) nightly.main() - assert not dot_ssh.exists() + self.assertFalse(dot_ssh.exists()) @patch.dict(os.environ, clear=True) @patch('sys.argv', ['fdroid nightly', '--verbose']) @@ -168,8 +160,10 @@ class NightlyTest(unittest.TestCase): os.environ['HOME'] = str(self.home) os.environ['PATH'] = self.path nightly.main() - assert (dot_ssh / AOSP_TESTKEY_DEBUG_KEYSTORE_KEY_FILE_NAME).exists() - assert (dot_ssh / (AOSP_TESTKEY_DEBUG_KEYSTORE_KEY_FILE_NAME + '.pub')).exists() + self.assertTrue((dot_ssh / AOSP_TESTKEY_DEBUG_KEYSTORE_KEY_FILE_NAME).exists()) + self.assertTrue( + (dot_ssh / (AOSP_TESTKEY_DEBUG_KEYSTORE_KEY_FILE_NAME + '.pub')).exists() + ) @patch('fdroidserver.common.vcs_git.git', lambda args, e: common.PopenResult(1)) @patch('sys.argv', ['fdroid nightly', '--verbose']) @@ -200,7 +194,7 @@ class NightlyTest(unittest.TestCase): def _put_fdroid_in_args(self, args): """Find fdroid command that belongs to this source code tree""" - fdroid = os.path.join(localmodule, 'fdroid') + fdroid = os.path.join(basedir.parent, 'fdroid') if not os.path.exists(fdroid): fdroid = os.getenv('fdroid') return [fdroid] + args[1:] @@ -245,7 +239,7 @@ class NightlyTest(unittest.TestCase): }, clear=True, ): - self.assertTrue(self.testroot == Path.home().parent) + self.assertTrue(testroot == Path.home().parent) with patch('subprocess.check_call', _subprocess_check_call): try: nightly.main() @@ -319,7 +313,7 @@ class NightlyTest(unittest.TestCase): }, clear=True, ): - self.assertTrue(self.testroot == Path.home().parent) + self.assertTrue(testroot == Path.home().parent) with patch('subprocess.check_call', _subprocess_check_call): try: nightly.main() @@ -356,23 +350,3 @@ class NightlyTest(unittest.TestCase): ) del config['identity_file'] self.assertEqual(expected, config) - - -if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - common.options = common.parse_args(parser) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(NightlyTest)) - unittest.main(failfast=False) diff --git a/tests/publish.TestCase b/tests/test_publish.py similarity index 90% rename from tests/publish.TestCase rename to tests/test_publish.py index 5ae1fd5f..df7ed72c 100755 --- a/tests/publish.TestCase +++ b/tests/test_publish.py @@ -10,45 +10,36 @@ # -keypass 123456 -dname 'CN=test, OU=F-Droid'; done # -import inspect import json -import logging import os +import pathlib import shutil import sys import unittest import tempfile -import textwrap from unittest import mock -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) - from fdroidserver import publish from fdroidserver import common from fdroidserver import metadata from fdroidserver import signatures from fdroidserver.exception import FDroidException -from testcommon import mkdtemp, parse_args_for_test +from .testcommon import mkdtemp + +basedir = pathlib.Path(__file__).parent class PublishTest(unittest.TestCase): '''fdroidserver/publish.py''' def setUp(self): - logging.basicConfig(level=logging.DEBUG) - self.basedir = os.path.join(localmodule, 'tests') - os.chdir(self.basedir) + os.chdir(basedir) self._td = mkdtemp() self.testdir = self._td.name def tearDown(self): self._td.cleanup() - os.chdir(self.basedir) + os.chdir(basedir) def test_key_alias(self): publish.config = {} @@ -91,7 +82,7 @@ class PublishTest(unittest.TestCase): publish.config = common.config publish.config['keystorepass'] = '123456' publish.config['keypass'] = '123456' - publish.config['keystore'] = os.path.join(self.basedir, 'dummy-keystore.jks') + publish.config['keystore'] = os.path.join(basedir, 'dummy-keystore.jks') publish.config['repo_keyalias'] = 'repokey' appids = [ @@ -127,12 +118,7 @@ class PublishTest(unittest.TestCase): with open('config.py', 'r') as f: self.assertEqual( - textwrap.dedent( - '''\ - - repo_key_sha256 = "c58460800c7b250a619c30c13b07b7359a43e5af71a4352d86c58ae18c9f6d41" - ''' - ), + '\nrepo_key_sha256 = "c58460800c7b250a619c30c13b07b7359a43e5af71a4352d86c58ae18c9f6d41"\n', f.read(), ) @@ -142,7 +128,7 @@ class PublishTest(unittest.TestCase): publish.config = common.config publish.config['keystorepass'] = '123456' publish.config['keypass'] = '123456' - publish.config['keystore'] = os.path.join(self.basedir, 'dummy-keystore.jks') + publish.config['keystore'] = os.path.join(basedir, 'dummy-keystore.jks') publish.config['repo_keyalias'] = 'repokey' publish.config['repo_key_sha256'] = 'bad bad bad bad bad bad bad bad bad bad bad bad' @@ -273,7 +259,7 @@ class PublishTest(unittest.TestCase): config['repo_keyalias'] = 'sova' config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' - shutil.copy(os.path.join(self.basedir, 'keystore.jks'), self.testdir) + shutil.copy(basedir / 'keystore.jks', self.testdir) config['keystore'] = 'keystore.jks' config['keydname'] = 'CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US' publish.config = config @@ -293,7 +279,7 @@ class PublishTest(unittest.TestCase): metadata.write_metadata(os.path.join('metadata', '%s.yml' % app.id), app) os.mkdir('unsigned') - testapk = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') + testapk = basedir / 'no_targetsdk_minsdk1_unsigned.apk' unsigned = os.path.join('unsigned', common.get_release_filename(app, build)) signed = os.path.join('repo', common.get_release_filename(app, build)) shutil.copy(testapk, unsigned) @@ -348,7 +334,7 @@ class PublishTest(unittest.TestCase): config['repo_keyalias'] = 'sova' config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' - shutil.copy(os.path.join(self.basedir, 'keystore.jks'), self.testdir) + shutil.copy(basedir / 'keystore.jks', self.testdir) config['keystore'] = 'keystore.jks' config[ 'keydname' @@ -370,7 +356,7 @@ class PublishTest(unittest.TestCase): metadata.write_metadata(os.path.join('metadata', '%s.yml' % app.id), app) os.mkdir('unsigned') - testapk = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') + testapk = basedir / 'no_targetsdk_minsdk1_unsigned.apk' unsigned = os.path.join('unsigned', common.get_release_filename(app, build)) signed = os.path.join('repo', common.get_release_filename(app, build)) shutil.copy(testapk, unsigned) @@ -409,23 +395,3 @@ class PublishTest(unittest.TestCase): with self.assertRaises(SystemExit) as e: publish.main() self.assertEqual(e.exception.code, 1) - - -if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - parse_args_for_test(parser, sys.argv) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(PublishTest)) - unittest.main(failfast=False) diff --git a/tests/rewritemeta.TestCase b/tests/test_rewritemeta.py similarity index 89% rename from tests/rewritemeta.TestCase rename to tests/test_rewritemeta.py index e212ec84..854553e3 100755 --- a/tests/rewritemeta.TestCase +++ b/tests/test_rewritemeta.py @@ -1,29 +1,23 @@ #!/usr/bin/env python3 -import logging import os -import sys import unittest import tempfile import textwrap from pathlib import Path +from unittest import mock -localmodule = Path(__file__).resolve().parent.parent -print('localmodule: ' + str(localmodule)) -if localmodule not in sys.path: - sys.path.insert(0, str(localmodule)) +from fdroidserver import metadata, rewritemeta +from .testcommon import TmpCwd, mkdtemp -from fdroidserver import common, metadata, rewritemeta -from testcommon import TmpCwd, mkdtemp +basedir = Path(__file__).parent class RewriteMetaTest(unittest.TestCase): '''fdroidserver/publish.py''' def setUp(self): - logging.basicConfig(level=logging.DEBUG) - self.basedir = localmodule / 'tests' - os.chdir(self.basedir) + os.chdir(basedir) metadata.warnings_action = 'error' self._td = mkdtemp() self.testdir = self._td.name @@ -132,6 +126,7 @@ class RewriteMetaTest(unittest.TestCase): [{'versionCode': 0}, {'versionCode': 1}, {'versionCode': 2}], ) + @mock.patch('sys.argv', ['fdroid rewritemeta', 'a']) def test_rewrite_no_builds(self): os.chdir(self.testdir) Path('metadata').mkdir() @@ -152,6 +147,7 @@ class RewriteMetaTest(unittest.TestCase): ), ) + @mock.patch('sys.argv', ['fdroid rewritemeta', 'a']) def test_rewrite_empty_build_field(self): os.chdir(self.testdir) Path('metadata').mkdir() @@ -221,9 +217,8 @@ class RewriteMetaTest(unittest.TestCase): }, ) + @mock.patch('sys.argv', ['fdroid rewritemeta', 'a', 'b']) def test_rewrite_scenario_trivial(self): - sys.argv = ['rewritemeta', 'a', 'b'] - with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): Path('metadata').mkdir() with Path('metadata/a.yml').open('w') as f: @@ -260,21 +255,3 @@ class RewriteMetaTest(unittest.TestCase): ''' ), ) - - -if __name__ == "__main__": - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - common.options = common.parse_args(parser) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(RewriteMetaTest)) - unittest.main(failfast=False) diff --git a/tests/scanner.TestCase b/tests/test_scanner.py similarity index 93% rename from tests/scanner.TestCase rename to tests/test_scanner.py index 6c965723..8935a575 100755 --- a/tests/scanner.TestCase +++ b/tests/test_scanner.py @@ -1,8 +1,5 @@ #!/usr/bin/env python3 -import glob -import inspect -import logging import os import pathlib import re @@ -23,19 +20,13 @@ else: import tomli as tomllib import yaml -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) - -from testcommon import TmpCwd, mkdtemp, mock_open_to_str, parse_args_for_test - import fdroidserver.build import fdroidserver.common import fdroidserver.metadata import fdroidserver.scanner +from .testcommon import TmpCwd, mkdtemp, mock_open_to_str + +basedir = pathlib.Path(__file__).parent # Always use built-in default rules so changes in downloaded rules don't break tests. @@ -45,21 +36,18 @@ import fdroidserver.scanner ) class ScannerTest(unittest.TestCase): def setUp(self): - logging.basicConfig(level=logging.INFO) - self.basedir = os.path.join(localmodule, 'tests') - os.chdir(self.basedir) + os.chdir(basedir) self._td = mkdtemp() self.testdir = self._td.name fdroidserver.scanner.ScannerTool.refresh_allowed = False def tearDown(self): - os.chdir(self.basedir) + os.chdir(basedir) self._td.cleanup() def test_scan_source_files(self): fdroidserver.common.options = mock.Mock() fdroidserver.common.options.json = False - source_files = os.path.join(self.basedir, 'source-files') projects = { 'OtakuWorld': 2, 'Zillode': 1, @@ -76,12 +64,12 @@ class ScannerTest(unittest.TestCase): 'com.lolo.io.onelist': 6, 'catalog.test': 22, } - for d in glob.glob(os.path.join(source_files, '*')): + for d in (basedir / 'source-files').iterdir(): build = fdroidserver.metadata.Build() fatal_problems = fdroidserver.scanner.scan_source(d, build) - should = projects.get(os.path.basename(d), 0) + should = projects.get(d.name, 0) self.assertEqual( - should, fatal_problems, "%s should have %d errors!" % (d, should) + should, fatal_problems, f'{d} should have {should} errors!' ) def test_get_gradle_compile_commands_without_catalog(self): @@ -225,8 +213,7 @@ class ScannerTest(unittest.TestCase): fp.write(b'\x00\x00') fp.write(uuid.uuid4().bytes) shutil.copyfile('binary.out', 'fake.png') - os.chmod('fake.png', 0o755) - os.system('ls -l binary.out') + os.chmod('fake.png', 0o755) # nosec B103 with open('snippet.png', 'wb') as fp: fp.write( b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x000\x00\x00' @@ -234,8 +221,7 @@ class ScannerTest(unittest.TestCase): b'IT\x08\x08\x08\x08|\x08d\x88\x00\x00\x00\tpHYs\x00\x00\n' b'a\x00\x00\na\x01\xfc\xccJ%\x00\x00\x00\x19tEXtSoftware' ) - os.chmod('snippet.png', 0o755) - os.system('ls -l fake.png') + os.chmod('snippet.png', 0o755) # nosec B103 # run scanner as if from `fdroid build` os.chdir(self.testdir) @@ -365,7 +351,7 @@ class ScannerTest(unittest.TestCase): def test_gradle_maven_url_regex(self): """Check the regex can find all the cases""" - with open(os.path.join(self.basedir, 'gradle-maven-blocks.yaml')) as fp: + with open(basedir / 'gradle-maven-blocks.yaml') as fp: data = yaml.safe_load(fp) urls = [] @@ -472,7 +458,7 @@ class ScannerTest(unittest.TestCase): apk = 'urzip.apk' mapzip = 'Norway_bouvet_europe_2.obf.zip' secretfile = os.path.join( - self.basedir, 'org.bitbucket.tickytacky.mirrormirror_1.apk' + basedir, 'org.bitbucket.tickytacky.mirrormirror_1.apk' ) with tempfile.TemporaryDirectory() as tmpdir: shutil.copy(apk, tmpdir) @@ -503,7 +489,6 @@ class ScannerTest(unittest.TestCase): class Test_scan_binary(unittest.TestCase): def setUp(self): - self.basedir = os.path.join(localmodule, 'tests') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config @@ -519,7 +504,7 @@ class Test_scan_binary(unittest.TestCase): fdroidserver.scanner._SCANNER_TOOL.regexs['warn_code_signatures'] = {} def test_code_signature_match(self): - apkfile = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk') + apkfile = os.path.join(basedir, 'no_targetsdk_minsdk1_unsigned.apk') self.assertEqual( 1, fdroidserver.scanner.scan_binary(apkfile), @@ -538,7 +523,7 @@ class Test_scan_binary(unittest.TestCase): "https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1110#note_932026766", ) def test_bottom_level_embedded_apk_code_signature(self): - apkfile = os.path.join(self.basedir, 'apk.embedded_1.apk') + apkfile = os.path.join(basedir, 'apk.embedded_1.apk') fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'] = { "org/bitbucket/tickytacky/mirrormirror/MainActivity": re.compile( r'.*org/bitbucket/tickytacky/mirrormirror/MainActivity', @@ -558,7 +543,7 @@ class Test_scan_binary(unittest.TestCase): ) def test_top_level_signature_embedded_apk_present(self): - apkfile = os.path.join(self.basedir, 'apk.embedded_1.apk') + apkfile = os.path.join(basedir, 'apk.embedded_1.apk') fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'] = { "org/fdroid/ci/BuildConfig": re.compile( r'.*org/fdroid/ci/BuildConfig', re.IGNORECASE | re.UNICODE @@ -577,7 +562,6 @@ class Test_scan_binary(unittest.TestCase): class Test_SignatureDataController(unittest.TestCase): - # __init__ def test_init(self): sdc = fdroidserver.scanner.SignatureDataController( 'nnn', 'fff.yml', 'https://example.com/test.json' @@ -776,8 +760,7 @@ class Test_ScannerTool(unittest.TestCase): def setUp(self): fdroidserver.common.options = None fdroidserver.common.config = None - self.basedir = os.path.join(localmodule, 'tests') - os.chdir(self.basedir) + os.chdir(basedir) self._td = mkdtemp() self.testdir = self._td.name fdroidserver.scanner.ScannerTool.refresh_allowed = True @@ -785,7 +768,7 @@ class Test_ScannerTool(unittest.TestCase): def tearDown(self): fdroidserver.common.options = None fdroidserver.common.config = None - os.chdir(self.basedir) + os.chdir(basedir) self._td.cleanup() def test_load(self): @@ -879,30 +862,3 @@ class Test_main(unittest.TestCase): self.exit_func.assert_not_called() self.read_app_args_func.assert_not_called() self.scan_binary_func.assert_called_once_with('local.application.apk') - - -if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - parse_args_for_test(parser, sys.argv) - - newSuite = unittest.TestSuite() - newSuite.addTests( - [ - unittest.makeSuite(ScannerTest), - unittest.makeSuite(Test_scan_binary), - unittest.makeSuite(Test_SignatureDataController), - unittest.makeSuite(Test_main), - ] - ) - unittest.main(failfast=False) diff --git a/tests/signatures.TestCase b/tests/test_signatures.py similarity index 57% rename from tests/signatures.TestCase rename to tests/test_signatures.py index de01c5b9..5444dc23 100755 --- a/tests/signatures.TestCase +++ b/tests/test_signatures.py @@ -1,27 +1,18 @@ #!/usr/bin/env python3 -import inspect -import os -import sys -import unittest import hashlib -import logging +import os +import unittest from tempfile import TemporaryDirectory -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) - -from testcommon import TmpCwd +from .testcommon import TmpCwd from fdroidserver import common, signatures +basedir = os.path.dirname(__file__) + class SignaturesTest(unittest.TestCase): def setUp(self): - logging.basicConfig(level=logging.DEBUG) common.config = None config = common.read_config() config['jarsigner'] = common.find_sdk_tools_cmd('jarsigner') @@ -30,12 +21,11 @@ class SignaturesTest(unittest.TestCase): def test_main(self): - # option fixture class: class OptionsFixture: - APK = [os.path.abspath(os.path.join('repo', 'com.politedroid_3.apk'))] + APK = [os.path.join(basedir, 'repo', 'com.politedroid_3.apk')] with TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): - signatures.extract(OptionsFixture()) + signatures.extract(OptionsFixture) # check if extracted signatures are where they are supposed to be # also verify weather if extracted file contian what they should @@ -49,27 +39,6 @@ class SignaturesTest(unittest.TestCase): ) for path, checksum in filesAndHashes: self.assertTrue(os.path.isfile(path), - msg="check whether '{path}' was extracted " - "correctly.".format(path=path)) + f'check whether {path!r} was extracted correctly.') with open(path, 'rb') as f: self.assertEqual(hashlib.sha256(f.read()).hexdigest(), checksum) - - -if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - common.options = common.parse_args(parser) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(SignaturesTest)) - unittest.main(failfast=False) diff --git a/tests/signindex.TestCase b/tests/test_signindex.py similarity index 89% rename from tests/signindex.TestCase rename to tests/test_signindex.py index f66e9c18..149afb24 100755 --- a/tests/signindex.TestCase +++ b/tests/test_signindex.py @@ -1,22 +1,12 @@ #!/usr/bin/env python3 -import inspect import json -import logging import os import shutil import subprocess -import sys import tempfile import unittest -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) - from fdroidserver import apksigcopier, common, exception, signindex, update from pathlib import Path from unittest.mock import patch @@ -46,7 +36,6 @@ class SignindexTest(unittest.TestCase): config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' signindex.config = config - logging.basicConfig(level=logging.DEBUG) self.tempdir = tempfile.TemporaryDirectory() os.chdir(self.tempdir.name) self.repodir = Path('repo') @@ -187,23 +176,3 @@ class SignindexTest(unittest.TestCase): ['jarsigner', '-verify', '-verbose', f], stdout=subprocess.PIPE ) self.assertFalse(b'SHA1withRSA' in cp.stdout) - - -if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - common.options = common.parse_args(parser) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(SignindexTest)) - unittest.main(failfast=False) diff --git a/tests/update.TestCase b/tests/test_update.py similarity index 93% rename from tests/update.TestCase rename to tests/test_update.py index 2489d646..1c110343 100755 --- a/tests/update.TestCase +++ b/tests/test_update.py @@ -1,12 +1,9 @@ #!/usr/bin/env python3 -# http://www.drdobbs.com/testing/unit-testing-with-python/240165163 - import copy import git import glob import hashlib -import inspect import json import logging import os @@ -14,8 +11,6 @@ import random import shutil import string import subprocess -import sys -import tempfile import unittest import yaml import zipfile @@ -47,24 +42,21 @@ except ImportError: except ImportError: from yaml import Loader as FullLoader -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) - import fdroidserver.common import fdroidserver.exception import fdroidserver.metadata import fdroidserver.update from fdroidserver.common import CATEGORIES_CONFIG_NAME from fdroidserver.looseversion import LooseVersion -from testcommon import TmpCwd, mkdtemp, parse_args_for_test +from .testcommon import TmpCwd, mkdtemp +from PIL import PngImagePlugin DONATION_FIELDS = ('Donate', 'Liberapay', 'OpenCollective') +logging.getLogger(PngImagePlugin.__name__).setLevel(logging.INFO) +basedir = Path(__file__).parent + class Options: allow_disabled_algorithms = False @@ -80,12 +72,7 @@ class UpdateTest(unittest.TestCase): '''fdroid update''' def setUp(self): - logging.basicConfig(level=logging.INFO) - from PIL import PngImagePlugin - - logging.getLogger(PngImagePlugin.__name__).setLevel(logging.INFO) - self.basedir = os.path.join(localmodule, 'tests') - os.chdir(self.basedir) + os.chdir(basedir) self._td = mkdtemp() self.testdir = self._td.name @@ -93,7 +80,7 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.options = None def tearDown(self): - os.chdir(self.basedir) + os.chdir(basedir) self._td.cleanup() def test_insert_store_metadata(self): @@ -103,24 +90,22 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.fill_config_defaults(config) fdroidserver.update.config = config - repo_dir = os.path.join(self.basedir, 'repo') + repo_dir = basedir / 'repo' os.mkdir('metadata') for packageName in ( 'obb.mainpatch.current', 'org.videolan.vlc', ): shutil.copytree( - os.path.join(repo_dir, packageName), os.path.join('repo', packageName) + repo_dir / packageName, os.path.join('repo', packageName) ) for packageName in ( 'info.guardianproject.checkey', 'info.guardianproject.urzip', 'org.smssecure.smssecure', ): - if not os.path.exists('metadata'): - os.mkdir('metadata') shutil.copytree( - os.path.join(self.basedir, 'metadata', packageName), + basedir / 'metadata' / packageName, os.path.join('metadata', packageName), ) for packageName in ( @@ -129,12 +114,12 @@ class UpdateTest(unittest.TestCase): 'eu.siacs.conversations', ): shutil.copytree( - os.path.join(self.basedir, 'source-files', packageName), + basedir / 'source-files' / packageName, os.path.join(self.testdir, 'build', packageName), ) testfilename = 'icon_yAfSvPRJukZzMMfUzvbYqwaD1XmHXNtiPBtuPVHW-6s=.png' - testfile = os.path.join(repo_dir, 'org.videolan.vlc', 'en-US', 'icon.png') + testfile = repo_dir / 'org.videolan.vlc/en-US/icon.png' cpdir = os.path.join('metadata', 'org.videolan.vlc', 'en-US') cpfile = os.path.join(cpdir, testfilename) os.makedirs(cpdir, exist_ok=True) @@ -171,7 +156,7 @@ class UpdateTest(unittest.TestCase): fdroidserver.update.insert_localized_app_metadata(apps) fdroidserver.update.ingest_screenshots_from_repo_dir(apps) - appdir = os.path.join('repo', 'info.guardianproject.urzip', 'en-US') + appdir = Path('repo/info.guardianproject.urzip/en-US') self.assertTrue( os.path.isfile( os.path.join( @@ -190,8 +175,8 @@ class UpdateTest(unittest.TestCase): self.assertEqual(6, len(apps)) for packageName, app in apps.items(): - self.assertTrue('localized' in app, packageName) - self.assertTrue('en-US' in app['localized']) + self.assertIn('localized', app, packageName) + self.assertIn('en-US', app['localized']) self.assertEqual(1, len(app['localized'])) if packageName == 'info.guardianproject.urzip': self.assertEqual(7, len(app['localized']['en-US'])) @@ -267,7 +252,7 @@ class UpdateTest(unittest.TestCase): def test_name_title_scraping(self): """metadata file --> fdroiddata localized files --> fastlane/triple-t in app source --> APK""" - shutil.copytree(self.basedir, self.testdir, dirs_exist_ok=True) + shutil.copytree(basedir, self.testdir, dirs_exist_ok=True) config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config @@ -356,7 +341,7 @@ class UpdateTest(unittest.TestCase): def test_insert_missing_app_names_from_apks_from_repo(self): os.chdir(self.testdir) - shutil.copytree(self.basedir, self.testdir, dirs_exist_ok=True) + shutil.copytree(basedir, self.testdir, dirs_exist_ok=True) config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config @@ -405,10 +390,10 @@ class UpdateTest(unittest.TestCase): repoapps['info.guardianproject.urzip']['localized']['en-US']['name']) def test_insert_triple_t_metadata(self): - importer = os.path.join(self.basedir, 'tmp', 'importer') + importer = basedir / 'tmp/importer' packageName = 'org.fdroid.ci.test.app' if not os.path.isdir(importer): - logging.warning('skipping test_insert_triple_t_metadata, import.TestCase must run first!') + logging.warning('skipping test_insert_triple_t_metadata, test_import.py must run first!') return packageDir = os.path.join(self.testdir, 'build', packageName) shutil.copytree(importer, packageDir) @@ -435,7 +420,7 @@ class UpdateTest(unittest.TestCase): apps = fdroidserver.metadata.read_metadata() fdroidserver.update.copy_triple_t_store_metadata(apps) - # TODO ideally, this would compare the whole dict like in metadata.TestCase's test_read_metadata() + # TODO ideally, this would compare the whole dict like in test_metadata.test_read_metadata() correctlocales = [ 'ar', 'ast_ES', 'az', 'ca', 'ca_ES', 'cs-CZ', 'cs_CZ', 'da', 'da-DK', 'de', 'de-DE', 'el', 'en-US', 'es', 'es-ES', 'es_ES', 'et', @@ -446,12 +431,12 @@ class UpdateTest(unittest.TestCase): 'ru_RU', 'sv-SE', 'sv_SE', 'te', 'tr', 'tr-TR', 'uk', 'uk_UA', 'vi', 'vi_VN', 'zh-CN', 'zh_CN', 'zh_TW', ] - locales = sorted(list(apps['org.fdroid.ci.test.app']['localized'].keys())) + locales = sorted(apps['org.fdroid.ci.test.app']['localized']) self.assertEqual(correctlocales, locales) def test_insert_triple_t_2_metadata(self): packageName = 'org.piwigo.android' - shutil.copytree(os.path.join(self.basedir, 'triple-t-2'), self.testdir, dirs_exist_ok=True) + shutil.copytree(basedir / 'triple-t-2', self.testdir, dirs_exist_ok=True) os.chdir(self.testdir) config = dict() @@ -489,7 +474,7 @@ class UpdateTest(unittest.TestCase): packages = ('com.anysoftkeyboard.languagepack.dutch', 'com.menny.android.anysoftkeyboard') names = ('Dutch for AnySoftKeyboard', 'AnySoftKeyboard') - shutil.copytree(os.path.join(self.basedir, 'triple-t-anysoftkeyboard'), self.testdir, dirs_exist_ok=True) + shutil.copytree(basedir / 'triple-t-anysoftkeyboard', self.testdir, dirs_exist_ok=True) os.chdir(self.testdir) for packageName, name in zip(packages, names): @@ -510,7 +495,7 @@ class UpdateTest(unittest.TestCase): packages = ('verifier', 'wallet') names = dict(verifier='COVID Certificate Check', wallet='COVID Certificate') - shutil.copytree(os.path.join(self.basedir, 'triple-t-multiple'), self.testdir, dirs_exist_ok=True) + shutil.copytree(basedir / 'triple-t-multiple', self.testdir, dirs_exist_ok=True) os.chdir(self.testdir) for p in packages: @@ -530,7 +515,7 @@ class UpdateTest(unittest.TestCase): def test_insert_triple_t_flutter(self): packageName = 'fr.emersion.goguma' - shutil.copytree(os.path.join(self.basedir, 'triple-t-flutter'), self.testdir, dirs_exist_ok=True) + shutil.copytree(basedir / 'triple-t-flutter', self.testdir, dirs_exist_ok=True) os.chdir(self.testdir) config = dict() @@ -602,8 +587,8 @@ class UpdateTest(unittest.TestCase): def testScanApksAndObbs(self): os.chdir(self.testdir) - shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') - shutil.copytree(os.path.join(self.basedir, 'metadata'), 'metadata') + shutil.copytree(basedir / 'repo', 'repo') + shutil.copytree(basedir / 'metadata', 'metadata') config = dict() fdroidserver.common.fill_config_defaults(config) config['ndk_paths'] = dict() @@ -657,7 +642,7 @@ class UpdateTest(unittest.TestCase): def test_apkcache_json(self): """test the migration from pickle to json""" os.chdir(self.testdir) - shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') + shutil.copytree(basedir / 'repo', 'repo') config = dict() fdroidserver.common.fill_config_defaults(config) config['ndk_paths'] = dict() @@ -698,7 +683,7 @@ class UpdateTest(unittest.TestCase): os.chdir(self.testdir) os.mkdir('repo') filename = 'Norway_bouvet_europe_2.obf.zip' - shutil.copy(os.path.join(self.basedir, filename), 'repo') + shutil.copy(basedir / filename, 'repo') knownapks = fdroidserver.common.KnownApks() files, fcachechanged = fdroidserver.update.scan_repo_files(dict(), 'repo', knownapks, False) self.assertTrue(fcachechanged) @@ -714,7 +699,7 @@ class UpdateTest(unittest.TestCase): def test_read_added_date_from_all_apks(self): os.chdir(self.testdir) - shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') + shutil.copytree(basedir / 'repo', 'repo') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config @@ -727,7 +712,7 @@ class UpdateTest(unittest.TestCase): def test_apply_info_from_latest_apk(self): os.chdir(self.testdir) - shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') + shutil.copytree(basedir / 'repo', 'repo') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config @@ -744,7 +729,7 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config - os.chdir(self.basedir) + os.chdir(basedir) if 'apksigner' in config: apk_info = fdroidserver.update.scan_apk('v2.only.sig_2.apk') @@ -852,7 +837,7 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config - os.chdir(self.basedir) + os.chdir(basedir) if os.path.basename(os.getcwd()) != 'tests': raise Exception('This test must be run in the "tests/" subdir') @@ -900,10 +885,10 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config - with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): + with mkdtemp() as tmpdir, TmpCwd(tmpdir): os.mkdir('repo') apkfile = 'repo/SystemWebView-repack.apk' - shutil.copy(os.path.join(self.basedir, os.path.basename(apkfile)), apkfile) + shutil.copy(basedir / os.path.basename(apkfile), apkfile) fdroidserver.update.scan_apk(apkfile) def test_scan_apk_bad_namespace_in_manifest(self): @@ -923,10 +908,10 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config fdroidserver.update.config = config - with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): + with mkdtemp() as tmpdir, TmpCwd(tmpdir): os.mkdir('repo') apkfile = 'repo/org.sajeg.fallingblocks_3.apk' - shutil.copy(os.path.join(self.basedir, os.path.basename(apkfile)), apkfile) + shutil.copy(basedir / os.path.basename(apkfile), apkfile) fdroidserver.update.scan_apk(apkfile) def test_process_apk(self): @@ -935,7 +920,7 @@ class UpdateTest(unittest.TestCase): return dumper.represent_dict(data) os.chdir(self.testdir) - shutil.copytree(self.basedir, 'tests') + shutil.copytree(basedir, 'tests') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config @@ -989,12 +974,12 @@ class UpdateTest(unittest.TestCase): TestLoader = FullLoader try: testyaml = '- !!python/object/new:fdroidserver.update.UsesPermission\n - test\n - null' - from_yaml = yaml.load(testyaml, Loader=TestLoader) + from_yaml = yaml.load(testyaml, Loader=TestLoader) # nosec B506 except yaml.constructor.ConstructorError: from yaml import UnsafeLoader as TestLoader with open(savepath, 'r') as f: - from_yaml = yaml.load(f, Loader=TestLoader) + from_yaml = yaml.load(f, Loader=TestLoader) # nosec B506 self.maxDiff = None if not config.get('ipfs_cid'): del from_yaml['ipfsCIDv1'] # handle when ipfs_cid is not installed @@ -1017,7 +1002,7 @@ class UpdateTest(unittest.TestCase): knownapks = fdroidserver.common.KnownApks() - with tempfile.TemporaryDirectory() as tmptestsdir, TmpCwd(tmptestsdir): + with mkdtemp() as tmptestsdir, TmpCwd(tmptestsdir): os.mkdir('repo') os.mkdir('archive') # setup the repo, create icons dirs, etc. @@ -1026,7 +1011,7 @@ class UpdateTest(unittest.TestCase): disabledsigs = ['org.bitbucket.tickytacky.mirrormirror_2.apk'] for apkName in disabledsigs: - shutil.copy(os.path.join(self.basedir, apkName), + shutil.copy(basedir / apkName, os.path.join(tmptestsdir, 'repo')) skip, apk, cachechanged = fdroidserver.update.process_apk({}, apkName, 'repo', @@ -1081,7 +1066,7 @@ class UpdateTest(unittest.TestCase): badsigs = ['urzip-badcert.apk', 'urzip-badsig.apk', 'urzip-release-unsigned.apk', ] for apkName in badsigs: - shutil.copy(os.path.join(self.basedir, apkName), + shutil.copy(basedir / apkName, os.path.join(self.testdir, 'repo')) skip, apk, cachechanged = fdroidserver.update.process_apk({}, apkName, 'repo', @@ -1093,7 +1078,7 @@ class UpdateTest(unittest.TestCase): self.assertFalse(cachechanged) def test_process_invalid_apk(self): - os.chdir(self.basedir) + os.chdir(basedir) if os.path.basename(os.getcwd()) != 'tests': raise Exception('This test must be run in the "tests/" subdir') @@ -1117,7 +1102,7 @@ class UpdateTest(unittest.TestCase): def test_get_apks_without_allowed_signatures(self): """Test when no AllowedAPKSigningKeys is specified""" os.chdir(self.testdir) - shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') + shutil.copytree(basedir / 'repo', 'repo') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config @@ -1128,6 +1113,11 @@ class UpdateTest(unittest.TestCase): knownapks = fdroidserver.common.KnownApks() apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks) apkfile = 'v1.v2.sig_1020.apk' + self.assertIn( + apkfile, + os.listdir('repo'), + f'{apkfile} was archived or otherwise removed from "repo"', + ) (skip, apk, cachechanged) = fdroidserver.update.process_apk( {}, apkfile, 'repo', knownapks, False ) @@ -1138,7 +1128,7 @@ class UpdateTest(unittest.TestCase): def test_get_apks_without_allowed_signatures_allowed(self): """Test when the APK matches the specified AllowedAPKSigningKeys""" os.chdir(self.testdir) - shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') + shutil.copytree(basedir / 'repo', 'repo') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config @@ -1163,7 +1153,7 @@ class UpdateTest(unittest.TestCase): def test_get_apks_without_allowed_signatures_blocked(self): """Test when the APK does not match any specified AllowedAPKSigningKeys""" os.chdir(self.testdir) - shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') + shutil.copytree(basedir / 'repo', 'repo') config = dict() fdroidserver.common.fill_config_defaults(config) fdroidserver.common.config = config @@ -1190,12 +1180,12 @@ class UpdateTest(unittest.TestCase): os.chdir(self.testdir) os.mkdir('repo') testapk = os.path.join('repo', 'com.politedroid_6.apk') - shutil.copy(os.path.join(self.basedir, testapk), testapk) + shutil.copy(basedir / testapk, testapk) os.mkdir('metadata') metadatafile = os.path.join('metadata', 'com.politedroid.yml') # Copy and manipulate metadata file - shutil.copy(os.path.join(self.basedir, metadatafile), metadatafile) + shutil.copy(basedir / metadatafile, metadatafile) with open(metadatafile, 'a') as fp: fp.write( '\n\nAllowedAPKSigningKeys: 32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6\n' @@ -1209,7 +1199,7 @@ class UpdateTest(unittest.TestCase): config['repo_keyalias'] = 'sova' config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' - config['keystore'] = os.path.join(self.basedir, 'keystore.jks') + config['keystore'] = os.path.join(basedir, 'keystore.jks') self.assertTrue(os.path.exists(testapk)) @@ -1219,7 +1209,7 @@ class UpdateTest(unittest.TestCase): self.assertTrue(os.path.exists(testapk)) # Copy and manipulate metadata file again - shutil.copy(os.path.join(self.basedir, metadatafile), metadatafile) + shutil.copy(basedir / metadatafile, metadatafile) with open(metadatafile, 'a') as fp: fp.write( '\n\nAllowedAPKSigningKeys: fa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edead\n' @@ -1232,8 +1222,8 @@ class UpdateTest(unittest.TestCase): def test_translate_per_build_anti_features(self): os.chdir(self.testdir) - shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo') - shutil.copytree(os.path.join(self.basedir, 'metadata'), 'metadata') + shutil.copytree(basedir / 'repo', 'repo') + shutil.copytree(basedir / 'metadata', 'metadata') config = dict() fdroidserver.common.fill_config_defaults(config) config['ndk_paths'] = dict() @@ -1263,7 +1253,7 @@ class UpdateTest(unittest.TestCase): os.chdir(self.testdir) os.mkdir('repo') os.mkdir('metadata') - shutil.copy(os.path.join(localmodule, 'tests', 'urzip.apk'), 'repo') + shutil.copy(basedir / 'urzip.apk', 'repo') config = dict() fdroidserver.common.fill_config_defaults(config) @@ -1302,7 +1292,7 @@ class UpdateTest(unittest.TestCase): # test using external template.yml os.remove(testfile) self.assertFalse(os.path.exists(testfile)) - shutil.copy(os.path.join(localmodule, 'examples', 'template.yml'), self.testdir) + shutil.copy(basedir.with_name('examples') / 'template.yml', self.testdir) fdroidserver.update.create_metadata_from_template(apk) self.assertTrue(os.path.exists(testfile)) apps = fdroidserver.metadata.read_metadata() @@ -1354,22 +1344,23 @@ class UpdateTest(unittest.TestCase): # pylint: disable=protected-access icons_src = fdroidserver.update._get_apk_icons_src('urzip-release.apk', None) - assert not icons_src + self.assertFalse(icons_src) def test_strip_and_copy_image(self): - in_file = os.path.join(self.basedir, 'metadata', 'info.guardianproject.urzip', 'en-US', 'images', 'icon.png') + in_file = basedir / 'metadata/info.guardianproject.urzip/en-US/images/icon.png' out_file = os.path.join(self.testdir, 'icon.png') fdroidserver.update._strip_and_copy_image(in_file, out_file) self.assertTrue(os.path.exists(out_file)) - in_file = os.path.join(self.basedir, 'corrupt-featureGraphic.png') + def test_strip_and_copy_image_bad_filename(self): + in_file = basedir / 'corrupt-featureGraphic.png' out_file = os.path.join(self.testdir, 'corrupt-featureGraphic.png') fdroidserver.update._strip_and_copy_image(in_file, out_file) self.assertFalse(os.path.exists(out_file)) def test_create_metadata_from_template_empty_keys(self): apk = {'packageName': 'rocks.janicerand'} - with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): + with mkdtemp() as tmpdir, TmpCwd(tmpdir): os.mkdir('metadata') with open('template.yml', 'w') as f: f.write( @@ -1554,7 +1545,7 @@ class UpdateTest(unittest.TestCase): self.assertIsNone(app.get(field)) def test_sanitize_funding_yml(self): - with open(os.path.join(self.basedir, 'funding-usernames.yaml')) as fp: + with open(basedir / 'funding-usernames.yaml') as fp: data = yaml.load(fp, Loader=SafeLoader) for k, entries in data.items(): for entry in entries: @@ -1568,7 +1559,7 @@ class UpdateTest(unittest.TestCase): self.assertIsNotNone(m) self.assertIsNone(fdroidserver.update.sanitize_funding_yml_entry('foo\nbar')) self.assertIsNone(fdroidserver.update.sanitize_funding_yml_entry( - ''.join(chr(random.randint(65, 90)) for _ in range(2049)))) + ''.join(chr(random.randint(65, 90)) for _ in range(2049)))) # nosec B311 # not recommended but valid entries self.assertIsNotNone(fdroidserver.update.sanitize_funding_yml_entry(12345)) @@ -1593,7 +1584,7 @@ class UpdateTest(unittest.TestCase): for f, key in files.items(): limit = config['char_limits'][key] with open(f, 'w') as fp: - fp.write(''.join(random.choice(string.ascii_letters) for i in range(limit + 100))) + fp.write(''.join(random.choice(string.ascii_letters) for i in range(limit + 100))) # nosec B311 locale = 'ru_US' app = dict() fdroidserver.update._set_localized_text_entry(app, locale, key, f) @@ -1628,7 +1619,7 @@ class UpdateTest(unittest.TestCase): limit = config['char_limits']['author'] for key in ('authorEmail', 'authorPhone', 'authorWebSite'): with open(f, 'w') as fp: - fp.write(''.join(random.choice(string.ascii_letters) for i in range(limit + 100))) + fp.write(''.join(random.choice(string.ascii_letters) for i in range(limit + 100))) # nosec B311 app = dict() fdroidserver.update._set_author_entry(app, key, f) self.assertEqual(limit, len(app[key])) @@ -1643,7 +1634,7 @@ class UpdateTest(unittest.TestCase): fdroidserver.common.config = {} fdroidserver.update.config = {} fdroidserver.update.options = Options - with tempfile.TemporaryDirectory() as tmpdir: + with mkdtemp() as tmpdir: os.chdir(tmpdir) with mock.patch('sys.argv', ['fdroid update', '']): fdroidserver.update.status_update_json([], []) @@ -1737,7 +1728,7 @@ class UpdateTest(unittest.TestCase): os.mkdir('repo') testapk = os.path.join('repo', 'com.politedroid_6.apk') testapk_new = os.path.join('repo', 'Politedroid-1.5.apk') - shutil.copy(os.path.join(self.basedir, testapk), testapk_new) + shutil.copy(basedir / testapk, testapk_new) config = dict() fdroidserver.common.fill_config_defaults(config) @@ -1817,14 +1808,14 @@ class UpdateTest(unittest.TestCase): ) testapk = os.path.join('repo', 'com.politedroid_6.apk') - shutil.copy(os.path.join(self.basedir, testapk), testapk) + shutil.copy(basedir / testapk, testapk) Path('metadata/com.politedroid.yml').write_text('Name: Polite') with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']): fdroidserver.update.main() with open('repo/index-v2.json') as fp: index = json.load(fp) - self.assertFalse(CATEGORIES_CONFIG_NAME in index['repo']) + self.assertNotIn(CATEGORIES_CONFIG_NAME, index['repo']) def test_auto_defined_categories(self): """Repos that don't define categories in config/ should use auto-generated.""" @@ -1836,7 +1827,7 @@ class UpdateTest(unittest.TestCase): ) testapk = os.path.join('repo', 'com.politedroid_6.apk') - shutil.copy(os.path.join(self.basedir, testapk), testapk) + shutil.copy(basedir / testapk, testapk) Path('metadata/com.politedroid.yml').write_text('Categories: [Time]') with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']): @@ -1858,10 +1849,10 @@ class UpdateTest(unittest.TestCase): ) testapk = os.path.join('repo', 'com.politedroid_6.apk') - shutil.copy(os.path.join(self.basedir, testapk), testapk) + shutil.copy(basedir / testapk, testapk) Path('metadata/com.politedroid.yml').write_text('Categories: [bar]') testapk = os.path.join('repo', 'souch.smsbypass_9.apk') - shutil.copy(os.path.join(self.basedir, testapk), testapk) + shutil.copy(basedir / testapk, testapk) Path('metadata/souch.smsbypass.yml').write_text('Categories: [foo, bar]') with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']): @@ -1885,10 +1876,10 @@ class UpdateTest(unittest.TestCase): ) testapk = os.path.join('repo', 'com.politedroid_6.apk') - shutil.copy(os.path.join(self.basedir, testapk), testapk) + shutil.copy(basedir / testapk, testapk) Path('metadata/com.politedroid.yml').write_text('Categories: [Time]') testapk = os.path.join('repo', 'souch.smsbypass_9.apk') - shutil.copy(os.path.join(self.basedir, testapk), testapk) + shutil.copy(basedir / testapk, testapk) Path('metadata/souch.smsbypass.yml').write_text('Categories: [System, Time]') with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']): @@ -1915,7 +1906,7 @@ class UpdateTest(unittest.TestCase): ) testapk = os.path.join('repo', 'com.politedroid_6.apk') - shutil.copy(os.path.join(self.basedir, testapk), testapk) + shutil.copy(basedir / testapk, testapk) Path('metadata/com.politedroid.yml').write_text('Categories: [Time]') with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']): @@ -1937,12 +1928,8 @@ class TestParseIpa(unittest.TestCase): biplist # silence the linters except ImportError as e: self.skipTest(str(e)) - ipa_path = os.path.join( - os.path.dirname(os.path.abspath(__file__)), - 'com.fake.IpaApp_1000000000001.ipa', - ) + ipa_path = os.path.join(basedir, 'com.fake.IpaApp_1000000000001.ipa') result = fdroidserver.update.parse_ipa(ipa_path, 'fake_size', 'fake_sha') - self.maxDiff = None self.assertDictEqual( result, { @@ -2007,12 +1994,10 @@ class TestUpdateVersionStringToInt(unittest.TestCase): class TestScanRepoForIpas(unittest.TestCase): - def setUp(self): - self.maxDiff = None - def test_scan_repo_for_ipas_no_cache(self): self.maxDiff = None - with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): + with mkdtemp() as tmpdir: + os.chdir(tmpdir) os.mkdir("repo") with open('repo/abc.Def_123.ipa', 'w') as f: f.write('abc') @@ -2020,7 +2005,6 @@ class TestScanRepoForIpas(unittest.TestCase): f.write('xyz') apkcache = mock.MagicMock() - # apkcache['a'] = 1 repodir = "repo" knownapks = mock.MagicMock() @@ -2129,7 +2113,7 @@ class TestDiscoverIosScreenshots(unittest.TestCase): def test_discover_ios_screenshots(self): self.maxDiff = None - with tempfile.TemporaryDirectory() as fastlane_dir: + with mkdtemp() as fastlane_dir: fastlane_dir = Path(fastlane_dir) (fastlane_dir / "screenshots/en-US").mkdir(parents=True) with open(fastlane_dir / "screenshots/en-US/iPhone 8+ @ iOS 16-1.png", 'w') as f: @@ -2166,6 +2150,14 @@ class TestDiscoverIosScreenshots(unittest.TestCase): class TestCopyIosScreenshotsToRepo(unittest.TestCase): + def setUp(self): + self._td = mkdtemp() + os.chdir(self._td.name) + + def tearDown(self): + os.chdir(basedir) + self._td.cleanup() + def test_copy_ios_screenshots_to_repo(self): self.maxDiff = None @@ -2218,7 +2210,7 @@ class TestGetIpaIcon(unittest.TestCase): def test_get_ipa_icon(self): self.maxDiff = None - with tempfile.TemporaryDirectory() as tmpdir: + with mkdtemp() as tmpdir: tmpdir = Path(tmpdir) (tmpdir / 'OnionBrowser.xcodeproj').mkdir() with open(tmpdir / 'OnionBrowser.xcodeproj/project.pbxproj', "w") as f: @@ -2245,7 +2237,7 @@ class TestParseFromPbxproj(unittest.TestCase): def test_parse_from_pbxproj(self): self.maxDiff = None - with tempfile.TemporaryDirectory() as tmpdir: + with mkdtemp() as tmpdir: with open(Path(tmpdir) / "asdf.pbxproj", 'w', encoding="utf-8") as f: f.write(""" 230jfaod=flc' @@ -2257,29 +2249,3 @@ class TestParseFromPbxproj(unittest.TestCase): "ASSETCATALOG_COMPILER_APPICON_NAME" ) self.assertEqual(v, "MyIcon") - - -if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - parse_args_for_test(parser, sys.argv) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(UpdateTest)) - newSuite.addTest(unittest.makeSuite(TestUpdateVersionStringToInt)) - newSuite.addTest(unittest.makeSuite(TestScanRepoForIpas)) - newSuite.addTest(unittest.makeSuite(TestParseIosScreenShotName)) - newSuite.addTest(unittest.makeSuite(TestInsertLocalizedIosAppMetadata)) - newSuite.addTest(unittest.makeSuite(TestDiscoverIosScreenshots)) - newSuite.addTest(unittest.makeSuite(TestGetIpaIcon)) - unittest.main(failfast=False) diff --git a/tests/vcs.TestCase b/tests/test_vcs.py similarity index 66% rename from tests/vcs.TestCase rename to tests/test_vcs.py index 86f67ae1..9a210d60 100755 --- a/tests/vcs.TestCase +++ b/tests/test_vcs.py @@ -1,45 +1,26 @@ #!/usr/bin/env python3 -# http://www.drdobbs.com/testing/unit-testing-with-python/240165163 - -import inspect -import logging import os -import sys import unittest from git import Repo -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) - -import fdroidserver.build import fdroidserver.common import fdroidserver.metadata -import fdroidserver.scanner -from testcommon import mkdtemp, parse_args_for_test +from .testcommon import mkdtemp class VCSTest(unittest.TestCase): """For some reason the VCS classes are in fdroidserver/common.py""" def setUp(self): - logging.basicConfig(level=logging.DEBUG) - self.basedir = os.path.join(localmodule, 'tests') - os.chdir(self.basedir) self._td = mkdtemp() - self.testdir = self._td.name + os.chdir(self._td.name) def tearDown(self): self._td.cleanup() - os.chdir(self.basedir) def test_remote_set_head_can_fail(self): - os.chdir(self.testdir) # First create an upstream repo with one commit upstream_repo = Repo.init("upstream_repo") with open(upstream_repo.working_dir + "/file", 'w') as f: @@ -72,6 +53,8 @@ class VCSTest(unittest.TestCase): build.androidupdate = ['no'] vcs, build_dir = fdroidserver.common.setup_vcs(app) # force an init of the repo, the remote head error only occurs on the second gotorevision call + + fdroidserver.common.options = type('Options', (), {'verbose': False}) vcs.gotorevision(build.commit) fdroidserver.common.prepare_source( vcs, @@ -82,23 +65,3 @@ class VCSTest(unittest.TestCase): extlib_dir="ignore", ) self.assertTrue(os.path.isfile("build/com.gpl.rpg.AndorsTrail/file")) - - -if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - parse_args_for_test(parser, sys.argv) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(VCSTest)) - unittest.main(failfast=False) diff --git a/tests/verify.TestCase b/tests/test_verify.py similarity index 69% rename from tests/verify.TestCase rename to tests/test_verify.py index eee8e9e8..041fc82c 100755 --- a/tests/verify.TestCase +++ b/tests/test_verify.py @@ -1,25 +1,15 @@ #!/usr/bin/env python3 -import inspect import json -import logging import os import shutil -import sys import tempfile import unittest from pathlib import Path from unittest.mock import patch -localmodule = os.path.realpath( - os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..') -) -print('localmodule: ' + localmodule) -if localmodule not in sys.path: - sys.path.insert(0, localmodule) - -from fdroidserver import common, verify +from fdroidserver import verify TEST_APP_ENTRY = { @@ -45,12 +35,11 @@ TEST_APP_ENTRY = { } } +basedir = Path(__file__).parent + class VerifyTest(unittest.TestCase): - basedir = Path(__file__).resolve().parent - def setUp(self): - logging.basicConfig(level=logging.DEBUG) self.tempdir = tempfile.TemporaryDirectory() os.chdir(self.tempdir.name) self.repodir = Path('repo') @@ -72,8 +61,8 @@ class VerifyTest(unittest.TestCase): remote_apk = 'tmp/' + apk_name unsigned_apk = 'unsigned/' + apk_name # TODO common.use apk_strip_v1_signatures() on unsigned_apk - shutil.copy(str(self.basedir / 'repo' / apk_name), remote_apk) - shutil.copy(str(self.basedir / 'repo' / apk_name), unsigned_apk) + shutil.copy(basedir / 'repo' / apk_name, remote_apk) + shutil.copy(basedir / 'repo' / apk_name, unsigned_apk) url = TEST_APP_ENTRY['1539780240.3885746']['url'] self.assertFalse(verified_json.exists()) @@ -88,23 +77,3 @@ class VerifyTest(unittest.TestCase): secondpass = json.load(fp) self.assertEqual(firstpass, secondpass) - - -if __name__ == "__main__": - os.chdir(os.path.dirname(__file__)) - - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - help="Spew out even more information than normal", - ) - common.options = common.parse_args(parser) - - newSuite = unittest.TestSuite() - newSuite.addTest(unittest.makeSuite(VerifyTest)) - unittest.main(failfast=False) diff --git a/tests/testcommon.py b/tests/testcommon.py index edb54fb0..e1031da6 100644 --- a/tests/testcommon.py +++ b/tests/testcommon.py @@ -78,19 +78,6 @@ def mkdir_testfiles(localmodule, test): return tempfile.mkdtemp(dir=testdir) -def parse_args_for_test(parser, args): - """Only send --flags to the ArgumentParser, not test classes, etc.""" - - from fdroidserver.common import parse_args - - flags = [] - for arg in args: - if arg[0] == '-': - flags.append(flags) - with unittest.mock.patch('sys.argv', flags): - parse_args(parser) - - def mock_urlopen(status=200, body=None): resp = unittest.mock.MagicMock() resp.getcode.return_value = status From 487269c667de98af61a3d76a3942f34e1026ca47 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 20 Nov 2024 10:46:21 +0100 Subject: [PATCH 1767/2116] tests: standardize on VerboseFalseOptions as mock --- tests/test_deploy.py | 11 +++-------- tests/test_import_subcommand.py | 4 ++-- tests/test_publish.py | 7 ++----- tests/test_vcs.py | 4 ++-- tests/testcommon.py | 4 ++++ 5 files changed, 13 insertions(+), 17 deletions(-) diff --git a/tests/test_deploy.py b/tests/test_deploy.py index d6c32d89..6ca8a40c 100755 --- a/tests/test_deploy.py +++ b/tests/test_deploy.py @@ -11,16 +11,11 @@ from unittest import mock import git import fdroidserver -from .testcommon import TmpCwd, mkdtemp +from .testcommon import TmpCwd, mkdtemp, VerboseFalseOptions basedir = Path(__file__).parent -class Options: - quiet = False - verbose = False - - class DeployTest(unittest.TestCase): '''fdroidserver/deploy.py''' @@ -122,7 +117,7 @@ class DeployTest(unittest.TestCase): fdroidserver.deploy.config['rclone'] = True fdroidserver.deploy.config['rclone_config'] = 'test-local-config' fdroidserver.deploy.config['path_to_custom_rclone_config'] = str(rclone_file) - fdroidserver.common.options = Options + fdroidserver.common.options = VerboseFalseOptions # write out destination path destination = Path('test_bucket_folder/fdroid') @@ -166,7 +161,7 @@ class DeployTest(unittest.TestCase): fdroidserver.deploy.config['rclone'] = True fdroidserver.deploy.config['rclone_config'] = 'test-local-config' fdroidserver.deploy.config['path_to_custom_rclone_config'] = str(rclone_file) - fdroidserver.common.options = Options + fdroidserver.common.options = VerboseFalseOptions # write out destination path destination = Path('test_bucket_folder/fdroid') diff --git a/tests/test_import_subcommand.py b/tests/test_import_subcommand.py index 4483841d..ba2f133a 100755 --- a/tests/test_import_subcommand.py +++ b/tests/test_import_subcommand.py @@ -13,7 +13,7 @@ import git import requests import yaml -from .testcommon import TmpCwd, mkdtemp +from .testcommon import TmpCwd, mkdtemp, VerboseFalseOptions import fdroidserver import fdroidserver.import_subcommand @@ -91,7 +91,7 @@ class ImportTest(unittest.TestCase): print('Skipping ImportTest!') return - fdroidserver.common.options = type('Options', (), {'verbose': False}) + fdroidserver.common.options = VerboseFalseOptions app = fdroidserver.import_subcommand.get_app_from_url(url) fdroidserver.import_subcommand.clone_to_tmp_dir(app) self.assertEqual(app.RepoType, 'git') diff --git a/tests/test_publish.py b/tests/test_publish.py index df7ed72c..6ca3b116 100755 --- a/tests/test_publish.py +++ b/tests/test_publish.py @@ -24,7 +24,7 @@ from fdroidserver import common from fdroidserver import metadata from fdroidserver import signatures from fdroidserver.exception import FDroidException -from .testcommon import mkdtemp +from .testcommon import mkdtemp, VerboseFalseOptions basedir = pathlib.Path(__file__).parent @@ -247,12 +247,9 @@ class PublishTest(unittest.TestCase): self.assertEqual(publish.config['keytool'], data['keytool']) def test_sign_then_implant_signature(self): - class Options: - verbose = False - os.chdir(self.testdir) - common.options = Options + common.options = VerboseFalseOptions config = common.read_config() if 'apksigner' not in config: self.skipTest('SKIPPING test_sign_then_implant_signature, apksigner not installed!') diff --git a/tests/test_vcs.py b/tests/test_vcs.py index 9a210d60..93fcd6a7 100755 --- a/tests/test_vcs.py +++ b/tests/test_vcs.py @@ -7,7 +7,7 @@ from git import Repo import fdroidserver.common import fdroidserver.metadata -from .testcommon import mkdtemp +from .testcommon import mkdtemp, VerboseFalseOptions class VCSTest(unittest.TestCase): @@ -54,7 +54,7 @@ class VCSTest(unittest.TestCase): vcs, build_dir = fdroidserver.common.setup_vcs(app) # force an init of the repo, the remote head error only occurs on the second gotorevision call - fdroidserver.common.options = type('Options', (), {'verbose': False}) + fdroidserver.common.options = VerboseFalseOptions vcs.gotorevision(build.commit) fdroidserver.common.prepare_source( vcs, diff --git a/tests/testcommon.py b/tests/testcommon.py index e1031da6..ec095508 100644 --- a/tests/testcommon.py +++ b/tests/testcommon.py @@ -27,6 +27,10 @@ from pathlib import Path GP_FINGERPRINT = 'B7C2EEFD8DAC7806AF67DFCD92EB18126BC08312A7F2D6F3862E46013C7A6135' +class VerboseFalseOptions: + verbose = False + + class TmpCwd: """Context-manager for temporarily changing the current working directory.""" From 56d5f360edc5a2ae7216f806dc28d70ae162215b Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 20 Nov 2024 19:05:12 +0800 Subject: [PATCH 1768/2116] scanner: disallow wasm file --- fdroidserver/scanner.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 08c09918..ebcc00b5 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -994,6 +994,13 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): count += handleproblem( _('Java JAR file'), path_in_build_dir, filepath, json_per_build ) + elif curfile.endswith('.wasm'): + count += handleproblem( + _('WebAssembly binary file'), + path_in_build_dir, + filepath, + json_per_build, + ) elif curfile.endswith('.java'): if not os.path.isfile(filepath): From fcf4875c76f9116afe49a75345f1db96449d122b Mon Sep 17 00:00:00 2001 From: ygsk10 Date: Tue, 19 Nov 2024 14:04:56 +0100 Subject: [PATCH 1769/2116] Translated using Weblate: Chinese (Simplified Han script) (zh_Hans) by ygsk10 Currently translated at 100.0% (592 of 592 strings) Translated using Weblate: Chinese (Simplified Han script) (zh_Hans) by ygsk10 Currently translated at 100.0% (592 of 592 strings) Co-authored-by: ygsk10 Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 234 +++++++++++++++------ 1 file changed, 170 insertions(+), 64 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index f708787b..bc4125fd 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -34,20 +34,22 @@ # chumoer , 2024. # Wang , 2024. # Lily Chou , 2024. +# ygsk10 , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-10-02 14:16+0000\n" -"Last-Translator: Lily Chou \n" -"Language-Team: Chinese (Simplified Han script) \n" +"PO-Revision-Date: 2024-11-08 15:09+0000\n" +"Last-Translator: ygsk10 \n" +"Language-Team: Chinese (Simplified Han script) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.8.2\n" #: ../fdroidserver/nightly.py msgid "" @@ -208,7 +210,9 @@ msgstr "'{aapt}' 太旧, F-Droid 需要 build-tools-{version} 或更新的版本 #: ../fdroidserver/common.py #, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgid "" +"'{field}' will be in random order! Use () or [] brackets if order is " +"important!" msgstr "{field} 将随机排列! 如果顺序很重要, 请使用 () 或 [] 括号!" #: ../fdroidserver/common.py @@ -244,7 +248,8 @@ msgstr ".__call__() 未定义" #: ../fdroidserver/lint.py msgid "/issues is missing" -msgstr "路径缺少 /issues ( 译者注: 此处仅支持 github 或 gitlab 之 issues 链接 )" +msgstr "" +"路径缺少 /issues ( 译者注: 此处仅支持 github 或 gitlab 之 issues 链接 )" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" @@ -281,7 +286,9 @@ msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "缺少 AllowedAPKSigningKeys,但提供了参考二进制文件" #: ../fdroidserver/import_subcommand.py -msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgid "" +"Allows a different revision (or git branch) to be specified for the initial " +"import" msgstr "可让运行初始导入时指定不同修订 ( 或 git 分支 )" #: ../fdroidserver/mirror.py @@ -325,16 +332,26 @@ msgid "Android SDK tool {cmd} not found!" msgstr "没找到 Android SDK 工具 {cmd}!" #: ../fdroidserver/lint.py -msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgid "" +"App has Binaries but does not have corresponding AllowedAPKSigningKeys to " +"pin certificate." msgstr "应用具有二进制文件,但没有相应的AllowedAPKSigningKeys 来固定证书。" #: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "应用的 NoSourceSince 或 ArchivePolicy 为 “0 versions” 但 AutoUpdateMode 或 UpdateCheckMode 不是 None" +msgid "" +"App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or " +"UpdateCheckMode are not None" +msgstr "" +"应用的 NoSourceSince 或 ArchivePolicy 为 “0 versions” 但 AutoUpdateMode 或 " +"UpdateCheckMode 不是 None" #: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "APK 有 NoSourceSince 或 ArchivePolicy \"0 versions\" 或 0 但 AutoUpdateMode 或 UpdateCheckMode 不是 None" +msgid "" +"App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but " +"AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" +"APK 有 NoSourceSince 或 ArchivePolicy \"0 versions\" 或 0 但 AutoUpdateMode " +"或 UpdateCheckMode 不是 None" #: ../fdroidserver/lint.py #, python-brace-format @@ -342,8 +359,11 @@ msgid "App is in '{repo}' but has a link to {url}" msgstr "应用 在 '{repo}' 中, 但有一个链接到 {url}" #: ../fdroidserver/lint.py -msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "应用版本具有二进制文件,但没有相应的 AllowedAPKSigningKeys 来固定证书。" +msgid "" +"App version has binary but does not have corresponding AllowedAPKSigningKeys " +"to pin certificate." +msgstr "" +"应用版本具有二进制文件,但没有相应的 AllowedAPKSigningKeys 来固定证书。" #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -364,7 +384,9 @@ msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "镜像配置中的错误条目类型“{mirrortype}”:{mirror}" #: ../fdroidserver/mirror.py -msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgid "" +"Base URL to mirror, can include the index signing key using the query " +"string: ?fingerprint=" msgstr "镜像的基本链接可以使用此请求参数包含索引签名键: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname @@ -442,8 +464,12 @@ msgstr "检查应用的更新" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "正为 {appid} 检查存档: 安装包: {integer}, 保留版本数: {keep}, 架构安装包: {arch}" +msgid "" +"Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, " +"archapks:{arch}" +msgstr "" +"正为 {appid} 检查存档: 安装包: {integer}, 保留版本数: {keep}, 架构安装包: " +"{arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -468,7 +494,9 @@ msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr ".yml 和本地化文件之间的“{field}”定义冲突:" #: ../fdroidserver/__main__.py -msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgid "" +"Conflicting arguments: '--verbose' and '--quiet' can not be specified at the " +"same time." msgstr "冲突的参数: '--verbose' 和 '--quiet' 不能被同时使用." #: ../fdroidserver/common.py @@ -638,7 +666,9 @@ msgid "Don't create a source tarball, useful when testing a build" msgstr "不创建源码 tarball 文件,便于内部版本测试" #: ../fdroidserver/build.py -msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgid "" +"Don't refresh the repository, useful when testing a build with no internet " +"connection" msgstr "不刷新资源库,便于没有互联网时的内部版本测试" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py @@ -716,8 +746,12 @@ msgstr "错误: {path}中的{key}:{subkey}不再被允许的值的范围内: {al #: ../fdroidserver/__main__.py #, python-brace-format -msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "编码被设置为“{enc}”,可能会导致 fdroid 出现编码问题。为了最佳效果,请将其更改为“UTF-8”。" +msgid "" +"Encoding is set to '{enc}' fdroid might run into encoding issues. Please set " +"it to 'UTF-8' for best results." +msgstr "" +"编码被设置为“{enc}”,可能会导致 fdroid 出现编码问题。为了最佳效果,请将其更改" +"为“UTF-8”。" #: ../fdroidserver/init.py #, python-format @@ -734,8 +768,11 @@ msgid "Environment variable {var} from {configname} is not set!" msgstr "没有设置 {configname} 中的环境变量 {var}!" #: ../fdroidserver/deploy.py -msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "部署'github_releases'错误,{}没有出现。(你可能需要先运行`fdroid update`)" +msgid "" +"Error deploying 'github_releases', {} not present. (You might need to run " +"`fdroid update` first.)" +msgstr "" +"部署'github_releases'错误,{}没有出现。(你可能需要先运行`fdroid update`)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -831,7 +868,9 @@ msgid "Forbidden HTML tags" msgstr "禁止的HTML标签" #: ../fdroidserver/build.py -msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgid "" +"Force build of disabled apps, and carries on regardless of scan problems. " +"Only allowed in test mode." msgstr "强制编译已禁用应用,忽略扫描出错。仅用于测试模式。" #: ../fdroidserver/build.py @@ -1128,7 +1167,8 @@ msgid "Java compiled class" msgstr "Java 编译类" #: ../fdroidserver/signindex.py -msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgid "" +"Java jarsigner not found! Install in standard location or set java_paths!" msgstr "未找到 Java jarsigner!安装在标准位置或设置java_paths!" #: ../fdroidserver/lint.py @@ -1150,8 +1190,10 @@ msgstr "AllowedAPKSigningKeys 中使用的已知调试密钥: " #: ../fdroidserver/lint.py #, python-brace-format -msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "最后使用的提交 '{commit}' 看起来像一个标签,但 UpdateCheckMode 是 '{ucm}'" +msgid "" +"Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" +"最后使用的提交 '{commit}' 看起来像一个标签,但 UpdateCheckMode 是 '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" @@ -1325,15 +1367,21 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "脱机计算机,跳过 git 镜像生成直到 `fdroid deploy`" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "" +"One of the 'github_releases' config items is missing the 'projectUrl' value. " +"skipping ..." msgstr "其中一个 'github_releases'配置项缺失'projectUrl'值。跳过..." #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "" +"One of the 'github_releases' config items is missing the 'packageNames' " +"value. skipping ..." msgstr "其中一个 'github_releases'配置项缺失'packageNames'值。跳过..." #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." +msgid "" +"One of the 'github_releases' config items is missing the 'token' value. " +"skipping ..." msgstr "其中一个 'github_releases'配置项缺失'token'值。跳过..." #: ../fdroidserver/update.py @@ -1483,13 +1531,19 @@ msgstr "读取 '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format -msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" -msgstr "读取 packageName/versionCode/versionName 失败,APK 无效:'{apkfilename}'" +msgid "" +"Reading packageName/versionCode/versionName failed, APK invalid: " +"'{apkfilename}'" +msgstr "" +"读取 packageName/versionCode/versionName 失败,APK 无效:'{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format -msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" -msgstr "读取 packageName/versionCode/versionName 失败,APK 无效:'{apkfilename}'" +msgid "" +"Reading packageName/versionCode/versionName failed,APK invalid: " +"'{apkfilename}'" +msgstr "" +"读取 packageName/versionCode/versionName 失败,APK 无效:'{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format @@ -1518,7 +1572,9 @@ msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "RepoTrunk 更新模式仅对 git-svn 存储库有意义" #: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgid "" +"Reset and create a brand new build server, even if the existing one appears " +"to be ok." msgstr "即使已有服务器看起来运行正常,请重置并创建一个全新的编译服务器。" #: ../fdroidserver/nightly.py @@ -1549,7 +1605,8 @@ msgstr "在具有未提交更改的 git 存储库上运行" #: ../fdroidserver/nightly.py #, python-brace-format -msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgid "" +"Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" msgstr "在{cibase}中挨个寻找 -debug.apk,并跳过了仓库目录{repo_basedir}" #: ../fdroidserver/lint.py @@ -1707,7 +1764,9 @@ msgid "System clock is older than date in {path}!" msgstr "系统时钟早于 {path} 中的日期!" #: ../fdroidserver/checkupdates.py -msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgid "" +"Tags update mode only works for git, hg, bzr and git-svn repositories " +"currently" msgstr "标签更新模式目前仅适用于 git、hg、bzr 和 git-svn 存储库" #: ../fdroidserver/checkupdates.py @@ -1715,7 +1774,9 @@ msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "git-svn 中使用的标记更新模式,但未使用标记设置存储库" #: ../fdroidserver/build.py -msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgid "" +"Test mode - put output in the tmp directory only, and always build, even if " +"the output already exists." msgstr "测试模式:仅将输出保存至 tmp 目录,即使输出已存在,仍然编译。" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode @@ -1754,12 +1815,21 @@ msgid "These are the apps that have been archived from the main repo." msgstr "这些是已从主存储库存档的应用。" #: ../fdroidserver/mirror.py -msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgid "" +"This command should never be used to mirror f-droid.org! A full copy " +"requires more than 600GB." msgstr "此命令永远不应该被用来镜像 f-droid.org!完整的拷贝需要至少 600GB。" #: ../fdroidserver/common.py -msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "这是一个与F-Droid一起使用的应用的存储库。这个存储库中的应用要么是原应用开发者构建的官方二进制文件,要么是 f-droid.org 的管理员使用 https://gitlab.com/fdroid 上的工具从源代码构建而来的二进制文件。" +msgid "" +"This is a repository of apps to be used with F-Droid. Applications in this " +"repository are either official binaries built by the original application " +"developers, or are binaries built from source by the admin of f-droid.org " +"using the tools on https://gitlab.com/fdroid." +msgstr "" +"这是一个与F-Droid一起使用的应用的存储库。这个存储库中的应用要么是原应用开发者" +"构建的官方二进制文件,要么是 f-droid.org 的管理员使用 https://gitlab.com/" +"fdroid 上的工具从源代码构建而来的二进制文件。" #: ../fdroidserver/import_subcommand.py #, python-format @@ -1786,8 +1856,11 @@ msgstr "" "和 https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "要使用 awsbucket,还必须在 config.yml 中设置 awssecretkey 和 awsaccesskeyid!" +msgid "" +"To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config." +"yml!" +msgstr "" +"要使用 awsbucket,还必须在 config.yml 中设置 awssecretkey 和 awsaccesskeyid!" #: ../fdroidserver/deploy.py msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" @@ -1807,11 +1880,17 @@ msgid "URL {url} in Description: {error}" msgstr "描述中的网址 {url}:{error}" #: ../fdroidserver/lint.py -msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "意外的许可证标签“{}”!仅使用来自 https://spdx.org/license-list 的 FSF 或 OSI 批准的标签" +msgid "" +"Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from " +"https://spdx.org/license-list" +msgstr "" +"意外的许可证标签“{}”!仅使用来自 https://spdx.org/license-list 的 FSF 或 OSI " +"批准的标签" #: ../fdroidserver/lint.py -msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgid "" +"Unexpected license tag \"{}\"! Only use license tags configured in your " +"config file" msgstr "意外的许可证标签“{}”!仅使用配置文件中配置的许可证标记" #: ../fdroidserver/common.py @@ -1916,7 +1995,9 @@ msgstr "UpdateCheckData 具有无效的 URL:{url}" #: ../fdroidserver/lint.py #, python-brace-format -msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" +msgid "" +"UpdateCheckData must match the version code as integer (\\d or [0-9]): " +"{codeex}" msgstr "UpdateCheckData 必须以整数(\\d 或 [0-9])的形式匹配版本代码:{codeex}" #: ../fdroidserver/lint.py @@ -1930,12 +2011,14 @@ msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData 不是有效的网址:{url}" #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." +msgid "" +"UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode 已设置,但看起来尚未运行检查更新。" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "" +"UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" msgstr "UpdateCheckMode 已设置,但看起来尚未运行检查更新" #: ../fdroidserver/lint.py @@ -1966,7 +2049,9 @@ msgid "Usage: %s\n" msgstr "用法:%s\n" #: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgid "" +"Use /HEAD instead of /master or /main to point at a file in the default " +"branch" msgstr "使用 /HEAD 而不是 /master 或 /main 来指向默认分支中的文件" #: ../fdroidserver/lint.py @@ -2008,7 +2093,8 @@ msgid "Using JAR Signature" msgstr "使用 JAR 签名" #: ../fdroidserver/common.py -msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgid "" +"Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "不建议使用 Java 的 jar 签名器来验证 APK!使用 apk 签名器" #: ../fdroidserver/common.py @@ -2054,20 +2140,30 @@ msgstr "验证目录签名中:" #: ../fdroidserver/deploy.py #, python-brace-format -msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "VirusTotal 的 API 密钥无法用于上传大于 32MB 的文件,请使用 {url} 上传 {path}。" +msgid "" +"VirusTotal API key cannot upload files larger than 32MB, use {url} to upload " +"{path}." +msgstr "" +"VirusTotal 的 API 密钥无法用于上传大于 32MB 的文件,请使用 {url} 上传 " +"{path}。" #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "警告元数据中可能存在的错误" #: ../fdroidserver/update.py -msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgid "" +"When configured for signed indexes, create only unsigned indexes at this " +"stage" msgstr "如果已配置为使用签名索引,该阶段仅创建未签名索引" #: ../fdroidserver/lint.py -msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "对整个版本库进行着色时,默认禁用 yamllint。 无论如何,该选项都会强制 yamllint。" +msgid "" +"When linting the entire repository yamllint is disabled by default. This " +"option forces yamllint regardless." +msgstr "" +"对整个版本库进行 lint 时,默认禁用 yamllint。 无论如何,该选项都会强制 " +"yamllint。" #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." @@ -2372,7 +2468,9 @@ msgstr "冲突解决值无效: %r" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format -msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgid "" +"invalid option string %(option)r: must start with a character " +"%(prefix_chars)r" msgstr "无效选项字符串 %(option)r: 必须以字符 %(prefix_chars)r 开头" #: ../fdroidserver/common.py @@ -2386,7 +2484,8 @@ msgstr "最新的构建配方较新:旧的验证码={old},新的验证码={n #: ../fdroidserver/deploy.py #, python-brace-format -msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgid "" +"local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir未以“ fdroid”结尾,也许你指的是:“ {path}”" #: ../fdroidserver/deploy.py @@ -2548,12 +2647,16 @@ msgstr "进程日志将 {path} 部署到 {dest} 失败!" #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "参考二进制缺少签名" +msgstr "引用的二进制文件缺少签名" #: ../fdroidserver/signatures.py #, python-brace-format -msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "拒绝通过不安全的 HTTP 连接下载(使用 HTTPS 或指定 --no-https-check): {apkfilename}" +msgid "" +"refuse downloading via insecure HTTP connection (use HTTPS or specify --no-" +"https-check): {apkfilename}" +msgstr "" +"拒绝通过不安全的 HTTP 连接下载(使用 HTTPS 或指定 --no-https-check): " +"{apkfilename}" #: ../fdroidserver/index.py #, python-format @@ -2589,8 +2692,11 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "扫描仪缓存畸形! 您可以使用他: '{clear}'" #: ../fdroidserver/deploy.py -msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "serverwebroot:路径没有以 \"fdroid\"结尾,可能你想表达的是这些当中的一个:" +msgid "" +"serverwebroot: path does not end with \"fdroid\", perhaps you meant one of " +"these:" +msgstr "" +"serverwebroot:路径没有以 \"fdroid\"结尾,可能你想表达的是这些当中的一个:" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2633,7 +2739,7 @@ msgstr "srclibs 缺少名称和/或 @" #: ../fdroidserver/scanner.py msgid "static library" -msgstr "静态图书馆" +msgstr "静态库" #: ../fdroidserver/build.py #, python-brace-format From a72be3e41510fb83bc3ad4455f93287775f381e1 Mon Sep 17 00:00:00 2001 From: linsui Date: Tue, 19 Nov 2024 14:04:57 +0100 Subject: [PATCH 1770/2116] Translated using Weblate: Chinese (Simplified Han script) (zh_Hans) by linsui Currently translated at 100.0% (592 of 592 strings) Translated using Weblate: Chinese (Simplified Han script) (zh_Hans) by linsui Currently translated at 100.0% (592 of 592 strings) Co-authored-by: linsui Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index bc4125fd..ace0f85f 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -40,10 +40,9 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-11-08 15:09+0000\n" -"Last-Translator: ygsk10 \n" -"Language-Team: Chinese (Simplified Han script) \n" +"PO-Revision-Date: 2024-11-08 17:42+0000\n" +"Last-Translator: linsui \n" +"Language-Team: Chinese (Simplified Han script) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -2161,9 +2160,7 @@ msgstr "如果已配置为使用签名索引,该阶段仅创建未签名索引 msgid "" "When linting the entire repository yamllint is disabled by default. This " "option forces yamllint regardless." -msgstr "" -"对整个版本库进行 lint 时,默认禁用 yamllint。 无论如何,该选项都会强制 " -"yamllint。" +msgstr "对整个版本库进行 lint 时,默认禁用 yamllint。 无论如何,该选项都会强制 yamllint。" #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." @@ -2647,7 +2644,7 @@ msgstr "进程日志将 {path} 部署到 {dest} 失败!" #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "引用的二进制文件缺少签名" +msgstr "参考二进制缺少签名" #: ../fdroidserver/signatures.py #, python-brace-format From 82e47bd392e7a566421ba924ac653a5afca847ab Mon Sep 17 00:00:00 2001 From: Hugo Carvalho Date: Tue, 19 Nov 2024 14:04:59 +0100 Subject: [PATCH 1771/2116] Translated using Weblate: Portuguese (Portugal) (pt_PT) by Hugo Carvalho Currently translated at 100.0% (592 of 592 strings) Co-authored-by: Hugo Carvalho Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_PT/ Translation: F-Droid/F-Droid Server --- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 34 ++++++++++++------------ 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index f80ea7fa..0eb8ef44 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -6,20 +6,21 @@ # Hans-Christoph Steiner , 2020, 2022, 2024. # Peter J. Mello , 2021. # Fat Potato , 2024. +# Hugo Carvalho , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-10-10 00:37+0000\n" -"Last-Translator: Fat Potato \n" +"PO-Revision-Date: 2024-11-08 17:42+0000\n" +"Last-Translator: Hugo Carvalho \n" "Language-Team: Portuguese (Portugal) \n" "Language: pt_PT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.8.2\n" #: ../fdroidserver/nightly.py msgid "" @@ -709,7 +710,7 @@ msgstr "A variável de ambiente {var} de {configname} não está definida!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "" +msgstr "Erro ao implementar 'github_releases', {} não está presente. (Pode ser necessário executar `fdroid update` primeiro.)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -1300,15 +1301,15 @@ msgstr "A máquina está offline, a saltar a geração de espelhos de git até o #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "" +msgstr "Um dos itens de configuração 'github_releases' não tem o valor 'projectUrl'. A ignorar ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." -msgstr "" +msgstr "Um dos itens de configuração 'github_releases' está a faltar o valor 'packageNames'. A ignorar ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." -msgstr "" +msgstr "Um dos itens de configuração 'github_releases' não tem o valor 'token'. A ignorar ..." #: ../fdroidserver/update.py #, python-brace-format @@ -1524,7 +1525,7 @@ msgstr "Executar no repo git que tem alterações não confirmadas" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" -msgstr "" +msgstr "Passar por cima de {cibase} para encontrar -debug.apk. e ignorar repo_basedir {repo_basedir}" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1765,9 +1766,8 @@ msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in con msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" -msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser definidos no config.yml!" +msgstr "Para usar rclone, rclone_config e awsbucket também devem ser definidos no config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1967,9 +1967,9 @@ msgid "Using \"{path}\" for configuring s3cmd." msgstr "Usando \"{path}\" para configurar s3cmd." #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using \"{path}\" for syncing with remote storage." -msgstr "Usando \"{path}\" para configurar s3cmd." +msgstr "A usar \"{path}\" para sincronizar com o armazenamento remoto." #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -2003,9 +2003,9 @@ msgid "Using existing keystore \"{path}\"" msgstr "Utilizando armazenamento de chave existente \"{path}\"" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using rclone to sync with: {url}" -msgstr "Usando s3cmd para sincronizar com: {url}" +msgstr "A usar rclone para sincronizar com: {url}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2227,7 +2227,7 @@ msgstr "apagando: repo/{apkfilename}" #: ../fdroidserver/scanner.py msgid "dependency file without lock" -msgstr "" +msgstr "ficheiro de dependência sem bloqueio" #: ../fdroidserver/common.py #, python-brace-format @@ -2557,9 +2557,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincroniza índices {path} para {url} e apaga" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "s3cmd sincroniza índices {path} para {url} e apaga" +msgstr "s3cmd sincroniza os índices de {path} para {url} e elimina os removidos" #: ../fdroidserver/scanner.py #, python-brace-format From fb880ad14f72a6cb57e24b9c4c04cbf22e2c8941 Mon Sep 17 00:00:00 2001 From: Phantomwise Date: Tue, 19 Nov 2024 14:05:00 +0100 Subject: [PATCH 1772/2116] Translated using Weblate: French (fr) by Phantomwise Currently translated at 94.4% (559 of 592 strings) Co-authored-by: Phantomwise Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 3f1737b8..a45c22b6 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -36,20 +36,21 @@ # John Donne , 2022, 2023. # Deleted User , 2023. # Christopher Forzy , 2024. +# Phantomwise , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-09-10 09:27+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2024-11-19 13:04+0000\n" +"Last-Translator: Phantomwise \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.9-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -439,7 +440,7 @@ msgstr "Catégories non définies" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" +msgstr "La catégorie « {category} » est définie mais n'est utilisée par aucune application !" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -610,12 +611,12 @@ msgstr "La longueur de la description {length} dépasser la limite du nombre de #: ../fdroidserver/common.py #, python-brace-format msgid "Did you mean config/{name}.yml?" -msgstr "" +msgstr "Vouliez-vous dire config/{name}.yml ?" #: ../fdroidserver/lint.py #, python-brace-format msgid "Did you mean {code}?" -msgstr "" +msgstr "Vouliez-vous dire {code} ?" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" @@ -686,7 +687,7 @@ msgstr "Lien dupliqué dans « {field} » : {url}" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "ERREUR : %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -2587,7 +2588,7 @@ msgstr "repo_url doit se terminer par /repo" #: ../fdroidserver/deploy.py #, python-brace-format msgid "rsync is missing or broken: {error}" -msgstr "" +msgstr "rsync n'est pas présent ou ne fonctionne pas : {error}" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." @@ -2839,7 +2840,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "" +msgstr "{path} n'est pas un {expected_type}, mais un {datatype} !" #: ../fdroidserver/update.py #, python-brace-format @@ -2854,7 +2855,7 @@ msgstr "{path} supérieur à 200MB, envoi manuel : {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" +msgstr "{path} : \"{code}\" n'est pas un code de pays ISO_3166-1 alpha-2 valide !" #: ../fdroidserver/update.py #, python-brace-format From 17c480d299799190a0e9b36b63e6c05085fd9525 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 30 Oct 2024 23:29:53 +0100 Subject: [PATCH 1773/2116] checkupdates: make iter_commits only include commits in appid branch iter_commits() follows `git rev-list` (which selects different commits than `git diff`). With ... notation, `git rev-list` will return all the commits that are not shared by the two branches. This needs only the commits in the right side of the comparison (like how `git diff` does it). --- fdroidserver/checkupdates.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index d812d0b6..60b696a9 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -712,8 +712,9 @@ def push_commits(remote_name='origin', branch_name='checkupdates', verbose=False git_repo, default = get_git_repo_and_main_branch() files = set() upstream_main = default if default in git_repo.remotes.upstream.refs else 'main' - local_main = default if default in git_repo.refs else 'main' - for commit in git_repo.iter_commits(f'upstream/{upstream_main}...{local_main}'): + for commit in git_repo.iter_commits( + f'upstream/{upstream_main}...HEAD', right_only=True + ): files.update(commit.stats.files.keys()) files = list(files) From 20ff302e89fa8b1ab5d7bf4d93ebf0f131c96e3d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 30 Oct 2024 23:50:06 +0100 Subject: [PATCH 1774/2116] checkupdates: remove duplicate push in push_commits() --- fdroidserver/checkupdates.py | 3 --- tests/test_checkupdates.py | 6 +++++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 60b696a9..75a59ba1 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -739,9 +739,6 @@ def push_commits(remote_name='origin', branch_name='checkupdates', verbose=False git_repo.create_head(branch_name, force=True) remote = git_repo.remotes[remote_name] - pushinfos = remote.push( - branch_name, force=True, set_upstream=True, progress=progress - ) pushinfos = remote.push( branch_name, progress=progress, diff --git a/tests/test_checkupdates.py b/tests/test_checkupdates.py index 8225cdff..c99d31bf 100755 --- a/tests/test_checkupdates.py +++ b/tests/test_checkupdates.py @@ -464,10 +464,13 @@ class CheckupdatesTest(unittest.TestCase): self.assertTrue(branch in ('main', 'master')) self.assertTrue(branch in repo.heads) + @mock.patch('git.remote.Remote.push') @mock.patch('sys.exit') @mock.patch('fdroidserver.common.read_app_args') @mock.patch('fdroidserver.checkupdates.checkupdates_app') - def test_merge_requests_branch(self, checkupdates_app, read_app_args, sys_exit): + def test_merge_requests_branch( + self, checkupdates_app, read_app_args, sys_exit, push + ): def _sys_exit(return_code=0): self.assertEqual(return_code, 0) @@ -499,5 +502,6 @@ class CheckupdatesTest(unittest.TestCase): self.assertNotIn(appid, git_repo.heads) with mock.patch('sys.argv', ['fdroid checkupdates', '--merge-request', appid]): fdroidserver.checkupdates.main() + push.assert_called_once() sys_exit.assert_called_once() self.assertIn(appid, git_repo.heads) From cd8d4ef88b63f1e3f7225834da58b8b681aac479 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 30 Oct 2024 21:25:10 +0100 Subject: [PATCH 1775/2116] checkupdates: reuse per-app branches when making merge requests https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1551#note_2206085258 --- fdroidserver/checkupdates.py | 55 ++++++++++++++-- tests/test_checkupdates.py | 121 +++++++++++++++++++++++++++++++++++ 2 files changed, 172 insertions(+), 4 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 75a59ba1..0fafaeb9 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -41,6 +41,10 @@ from . import net from .exception import VCSException, NoSubmodulesException, FDroidException, MetaDataException +# https://gitlab.com/fdroid/checkupdates-runner/-/blob/1861899262a62a4ed08fa24e5449c0368dfb7617/.gitlab-ci.yml#L36 +BOT_EMAIL = 'fdroidci@bubu1.eu' + + def check_http(app: metadata.App) -> tuple[Optional[str], Optional[int]]: """Check for a new version by looking at a document retrieved via HTTP. @@ -692,6 +696,45 @@ def get_git_repo_and_main_branch(): return git_repo, main_branch +def checkout_appid_branch(appid): + """Prepare the working branch named after the appid. + + This sets up everything for checkupdates_app() to run and add + commits. If there is an existing branch named after the appid, + and it has commits from users other than the checkupdates-bot, + then this will return False. Otherwise, it returns True. + + The checkupdates-runner must set the committer email address in + the git config. Then any commit with a committer or author that + does not match that will be considered to have human edits. That + email address is currently set in: + https://gitlab.com/fdroid/checkupdates-runner/-/blob/1861899262a62a4ed08fa24e5449c0368dfb7617/.gitlab-ci.yml#L36 + + """ + logging.debug(f'Creating merge request branch for {appid}') + git_repo, main_branch = get_git_repo_and_main_branch() + for remote in git_repo.remotes: + remote.fetch() + try: + git_repo.remotes.origin.fetch(f'{appid}:refs/remotes/origin/{appid}') + except Exception as e: + logging.warning('"%s" branch not found on origin remote:\n\t%s', appid, e) + if appid in git_repo.remotes.origin.refs: + start_point = f"origin/{appid}" + for commit in git_repo.iter_commits( + f'upstream/{main_branch}...{start_point}', right_only=True + ): + if commit.committer.email != BOT_EMAIL or commit.author.email != BOT_EMAIL: + return False + else: + start_point = f"upstream/{main_branch}" + git_repo.git.checkout('-B', appid, start_point) + git_repo.git.rebase( + f'upstream/{main_branch}', strategy_option='ours', kill_after_timeout=120 + ) + return True + + def push_commits(remote_name='origin', branch_name='checkupdates', verbose=False): """Make git branch then push commits as merge request. @@ -859,10 +902,14 @@ def main(): try: if options.merge_request: - logging.info(f'Creating merge request branch for {appid}') - git_repo, main_branch = get_git_repo_and_main_branch() - git_repo.create_head(appid, f"upstream/{main_branch}", force=True) - git_repo.git.checkout(appid) + if not checkout_appid_branch(appid): + msg = _("...checkupdate failed for {appid} : {error}").format( + appid=appid, + error='Open merge request with human edits, skipped.', + ) + logging.warning(msg) + failed[appid] = msg + continue checkupdates_app(app, options.auto, options.commit or options.merge_request) processed.append(appid) diff --git a/tests/test_checkupdates.py b/tests/test_checkupdates.py index c99d31bf..87246b06 100755 --- a/tests/test_checkupdates.py +++ b/tests/test_checkupdates.py @@ -464,6 +464,127 @@ class CheckupdatesTest(unittest.TestCase): self.assertTrue(branch in ('main', 'master')) self.assertTrue(branch in repo.heads) + def test_checkout_appid_branch_does_not_exist(self): + appid = 'com.example' + os.chdir(self.testdir.name) + git_repo, main_branch = fdroidserver.checkupdates.get_git_repo_and_main_branch() + open('foo', 'w').close() + git_repo.git.add(all=True) + git_repo.index.commit("all files") + # --merge-request assumes remotes called 'origin' and 'upstream' + git_repo.create_remote('origin', os.getcwd()).fetch() + git_repo.create_remote('upstream', os.getcwd()).fetch() + self.assertNotIn(appid, git_repo.heads) + fdroidserver.checkupdates.checkout_appid_branch(appid) + self.assertIn(appid, git_repo.heads) + + def test_checkout_appid_branch_exists(self): + appid = 'com.example' + + upstream_dir = os.path.join(self.testdir.name, 'upstream_git') + os.mkdir(upstream_dir) + upstream_repo = git.Repo.init(upstream_dir) + (Path(upstream_dir) / 'README').write_text('README') + upstream_repo.git.add(all=True) + upstream_repo.index.commit("README") + upstream_repo.create_head(appid) + + local_dir = os.path.join(self.testdir.name, 'local_git') + git.Repo.clone_from(upstream_dir, local_dir) + os.chdir(local_dir) + git_repo, main_branch = fdroidserver.checkupdates.get_git_repo_and_main_branch() + # --merge-request assumes remotes called 'origin' and 'upstream' + git_repo.create_remote('upstream', upstream_dir).fetch() + + self.assertNotIn(appid, git_repo.heads) + fdroidserver.checkupdates.checkout_appid_branch(appid) + self.assertIn(appid, git_repo.heads) + + def test_checkout_appid_branch_skip_bot_commit(self): + appid = 'com.example' + + upstream_dir = os.path.join(self.testdir.name, 'upstream_git') + os.mkdir(upstream_dir) + upstream_repo = git.Repo.init(upstream_dir) + (Path(upstream_dir) / 'README').write_text('README') + upstream_repo.git.add(all=True) + upstream_repo.index.commit("README") + upstream_repo.create_head(appid) + + local_dir = os.path.join(self.testdir.name, 'local_git') + git.Repo.clone_from(upstream_dir, local_dir) + os.chdir(local_dir) + git_repo, main_branch = fdroidserver.checkupdates.get_git_repo_and_main_branch() + # --merge-request assumes remotes called 'origin' and 'upstream' + git_repo.create_remote('upstream', upstream_dir).fetch() + + os.mkdir('metadata') + git_repo.create_head(appid, f'origin/{appid}', force=True) + git_repo.git.checkout(appid) + + # fake checkupdates-bot commit + Path(f'metadata/{appid}.yml').write_text('AutoName: Example\n') + with git_repo.config_writer() as cw: + cw.set_value('user', 'email', fdroidserver.checkupdates.BOT_EMAIL) + git_repo.git.add(all=True) + git_repo.index.commit("Example") + + # set up starting from remote branch + git_repo.remotes.origin.push(appid) + git_repo.git.checkout(main_branch) + git_repo.delete_head(appid, force=True) + + self.assertTrue( + fdroidserver.checkupdates.checkout_appid_branch(appid), + 'This should have been true since there are only bot commits.', + ) + + def test_checkout_appid_branch_skip_human_edits(self): + appid = 'com.example' + + upstream_dir = os.path.join(self.testdir.name, 'upstream_git') + os.mkdir(upstream_dir) + upstream_repo = git.Repo.init(upstream_dir) + (Path(upstream_dir) / 'README').write_text('README') + upstream_repo.git.add(all=True) + upstream_repo.index.commit("README") + upstream_repo.create_head(appid) + + local_dir = os.path.join(self.testdir.name, 'local_git') + git.Repo.clone_from(upstream_dir, local_dir) + os.chdir(local_dir) + git_repo, main_branch = fdroidserver.checkupdates.get_git_repo_and_main_branch() + # --merge-request assumes remotes called 'origin' and 'upstream' + git_repo.create_remote('upstream', upstream_dir).fetch() + + os.mkdir('metadata') + git_repo.create_head(appid, f'origin/{appid}', force=True) + git_repo.git.checkout(appid) + + with git_repo.config_writer() as cw: + cw.set_value('user', 'email', fdroidserver.checkupdates.BOT_EMAIL) + + # fake checkupdates-bot commit + Path(f'metadata/{appid}.yml').write_text('AutoName: Example\n') + git_repo.git.add(all=True) + git_repo.index.commit("Example") + + # fake commit added on top by a human + Path(f'metadata/{appid}.yml').write_text('AutoName: Example\nName: Foo\n') + with git_repo.config_writer() as cw: + cw.set_value('user', 'email', 'human@bar.com') + git_repo.git.add(all=True) + git_repo.index.commit("Example") + + # set up starting from remote branch + git_repo.remotes.origin.push(appid) + git_repo.git.reset(main_branch) + + self.assertFalse( + fdroidserver.checkupdates.checkout_appid_branch(appid), + 'This should have been false since there are human edits.', + ) + @mock.patch('git.remote.Remote.push') @mock.patch('sys.exit') @mock.patch('fdroidserver.common.read_app_args') From fbe9152ee5fbf27350ca6ca0da20420472cf69dd Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 12 Nov 2024 19:12:33 +0200 Subject: [PATCH 1776/2116] checkupdates: commit summary is merge request title --- fdroidserver/checkupdates.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 0fafaeb9..0ae3e67f 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -790,9 +790,9 @@ def push_commits(remote_name='origin', branch_name='checkupdates', verbose=False push_option=[ 'merge_request.create', 'merge_request.remove_source_branch', - 'merge_request.title=' + 'bot: checkupdates for ' + branch_name, + 'merge_request.title=bot: ' + git_repo.branches[branch_name].commit.summary, 'merge_request.description=' - + 'checkupdates-bot run %s' % os.getenv('CI_JOB_URL'), + + '~%s checkupdates-bot run %s' % (branch_name, os.getenv('CI_JOB_URL')), ], ) From c97503b5f3312ef435de567570be3599d79ac251 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 18 Nov 2024 12:38:42 +0100 Subject: [PATCH 1777/2116] checkupdates: get default branch from git config --- fdroidserver/checkupdates.py | 5 ++--- tests/test_checkupdates.py | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 0ae3e67f..19a8f853 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -690,9 +690,8 @@ def get_last_build_from_app(app: metadata.App) -> metadata.Build: def get_git_repo_and_main_branch(): git_repo = git.Repo.init('.') - main_branch = 'main' - if main_branch not in git_repo.heads: - main_branch = 'master' + with git_repo.config_reader() as reader: + main_branch = reader.get_value('init', 'defaultBranch') return git_repo, main_branch diff --git a/tests/test_checkupdates.py b/tests/test_checkupdates.py index 87246b06..e9637190 100755 --- a/tests/test_checkupdates.py +++ b/tests/test_checkupdates.py @@ -461,7 +461,6 @@ class CheckupdatesTest(unittest.TestCase): git_repo.index.commit("all files") repo, branch = fdroidserver.checkupdates.get_git_repo_and_main_branch() - self.assertTrue(branch in ('main', 'master')) self.assertTrue(branch in repo.heads) def test_checkout_appid_branch_does_not_exist(self): From fd15ac92765ad98ea80d77e246e02bed38517084 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 18 Nov 2024 13:38:34 +0100 Subject: [PATCH 1778/2116] checkupdates: mark as Draft when only changing Current Version https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1551#note_2190155816 --- fdroidserver/checkupdates.py | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 19a8f853..68bd2cc1 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -766,6 +766,31 @@ def push_commits(remote_name='origin', branch_name='checkupdates', verbose=False branch_name = m.group(1) # appid if not files: return + + git_repo.create_head(branch_name, force=True) + push_options = [ + 'merge_request.create', + 'merge_request.remove_source_branch', + 'merge_request.title=bot: ' + git_repo.branches[branch_name].commit.summary, + 'merge_request.description=' + + '~%s checkupdates-bot run %s' % (branch_name, os.getenv('CI_JOB_URL')), + ] + + # mark as draft if there are only changes to CurrentVersion: + current_version_only = True + for m in re.findall( + r"^[+-].*", + git_repo.git.diff(f"upstream/{upstream_main}...HEAD"), + flags=re.MULTILINE, + ): + if re.match(r"^(\+\+\+|---) ", m): + continue + if not re.match(r"^[-+]CurrentVersion", m): + current_version_only = False + break + if current_version_only: + push_options.append('merge_request.draft') + progress = None if verbose: import clint.textui @@ -779,20 +804,13 @@ def push_commits(remote_name='origin', branch_name='checkupdates', verbose=False progress = MyProgressPrinter() - git_repo.create_head(branch_name, force=True) remote = git_repo.remotes[remote_name] pushinfos = remote.push( branch_name, progress=progress, force=True, set_upstream=True, - push_option=[ - 'merge_request.create', - 'merge_request.remove_source_branch', - 'merge_request.title=bot: ' + git_repo.branches[branch_name].commit.summary, - 'merge_request.description=' - + '~%s checkupdates-bot run %s' % (branch_name, os.getenv('CI_JOB_URL')), - ], + push_option=push_options, ) for pushinfo in pushinfos: From e3f724681a401ff99010c85e42241dc5c8e0717f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 20 Nov 2024 15:21:36 +0100 Subject: [PATCH 1779/2116] checkupdates: parse default branch from upstream remote --- fdroidserver/checkupdates.py | 41 +++++++++++++++++------------- tests/test_checkupdates.py | 49 ++++++++++++++++++++++++++++-------- 2 files changed, 63 insertions(+), 27 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 68bd2cc1..d9ad8048 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -18,6 +18,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import configparser import git import os import re @@ -688,11 +689,17 @@ def get_last_build_from_app(app: metadata.App) -> metadata.Build: return metadata.Build() -def get_git_repo_and_main_branch(): - git_repo = git.Repo.init('.') - with git_repo.config_reader() as reader: - main_branch = reader.get_value('init', 'defaultBranch') - return git_repo, main_branch +def get_upstream_main_branch(git_repo): + if len(git_repo.remotes.upstream.refs) == 1: + return git_repo.remotes.upstream.refs[0].name + for name in ('main', 'master'): + if name in git_repo.remotes.upstream.refs: + return f'upstream/{name}' + try: + with git_repo.config_reader() as reader: + return 'upstream/%s' % reader.get_value('init', 'defaultBranch') + except configparser.NoSectionError: + return 'upstream/main' def checkout_appid_branch(appid): @@ -711,7 +718,8 @@ def checkout_appid_branch(appid): """ logging.debug(f'Creating merge request branch for {appid}') - git_repo, main_branch = get_git_repo_and_main_branch() + git_repo = git.Repo.init('.') + upstream_main = get_upstream_main_branch(git_repo) for remote in git_repo.remotes: remote.fetch() try: @@ -721,16 +729,14 @@ def checkout_appid_branch(appid): if appid in git_repo.remotes.origin.refs: start_point = f"origin/{appid}" for commit in git_repo.iter_commits( - f'upstream/{main_branch}...{start_point}', right_only=True + f'{upstream_main}...{start_point}', right_only=True ): if commit.committer.email != BOT_EMAIL or commit.author.email != BOT_EMAIL: return False else: - start_point = f"upstream/{main_branch}" + start_point = upstream_main git_repo.git.checkout('-B', appid, start_point) - git_repo.git.rebase( - f'upstream/{main_branch}', strategy_option='ours', kill_after_timeout=120 - ) + git_repo.git.rebase(upstream_main, strategy_option='ours', kill_after_timeout=120) return True @@ -751,11 +757,11 @@ def push_commits(remote_name='origin', branch_name='checkupdates', verbose=False * https://docs.gitlab.com/ee/user/project/push_options.html """ - git_repo, default = get_git_repo_and_main_branch() + git_repo = git.Repo.init('.') + upstream_main = get_upstream_main_branch(git_repo) files = set() - upstream_main = default if default in git_repo.remotes.upstream.refs else 'main' for commit in git_repo.iter_commits( - f'upstream/{upstream_main}...HEAD', right_only=True + f'{upstream_main}...HEAD', right_only=True ): files.update(commit.stats.files.keys()) @@ -780,7 +786,7 @@ def push_commits(remote_name='origin', branch_name='checkupdates', verbose=False current_version_only = True for m in re.findall( r"^[+-].*", - git_repo.git.diff(f"upstream/{upstream_main}...HEAD"), + git_repo.git.diff(f"{upstream_main}...HEAD"), flags=re.MULTILINE, ): if re.match(r"^(\+\+\+|---) ", m): @@ -835,8 +841,9 @@ def push_commits(remote_name='origin', branch_name='checkupdates', verbose=False def prune_empty_appid_branches(git_repo=None, main_branch='main'): """Remove empty branches from checkupdates-bot git remote.""" if git_repo is None: - git_repo, main_branch = get_git_repo_and_main_branch() - upstream_main = 'upstream/' + main_branch + git_repo = git.Repo.init('.') + upstream_main = get_upstream_main_branch(git_repo) + main_branch = upstream_main.split('/')[1] remote = git_repo.remotes.origin remote.update(prune=True) diff --git a/tests/test_checkupdates.py b/tests/test_checkupdates.py index e9637190..2e802741 100755 --- a/tests/test_checkupdates.py +++ b/tests/test_checkupdates.py @@ -453,20 +453,47 @@ class CheckupdatesTest(unittest.TestCase): fdroidserver.checkupdates.main() sys_exit.assert_not_called() - def test_get_git_repo_and_main_branch(self): + def test_get_upstream_main_branch(self): os.chdir(self.testdir.name) - git_repo = git.Repo.init() + testvalue = 'foo' + git_repo = git.Repo.init('.', initial_branch=testvalue) + open('foo', 'w').close() git_repo.git.add(all=True) git_repo.index.commit("all files") + git_repo.create_remote('upstream', os.getcwd()).fetch() - repo, branch = fdroidserver.checkupdates.get_git_repo_and_main_branch() - self.assertTrue(branch in repo.heads) + branch = fdroidserver.checkupdates.get_upstream_main_branch(git_repo) + self.assertEqual( + f'upstream/{testvalue}', + branch, + f'The default branch should be called {testvalue}!', + ) + + def test_get_upstream_main_branch_git_config(self): + os.chdir(self.testdir.name) + testvalue = 'foo' + git_repo = git.Repo.init('.', initial_branch=testvalue) + with git_repo.config_writer() as cw: + cw.set_value('init', 'defaultBranch', testvalue) + + open('foo', 'w').close() + git_repo.git.add(all=True) + git_repo.index.commit("all files") + git_repo.git.branch('somethingelse') # make another remote branch + git_repo.create_remote('upstream', os.getcwd()).fetch() + + branch = fdroidserver.checkupdates.get_upstream_main_branch(git_repo) + self.assertEqual( + f'upstream/{testvalue}', + branch, + f'The default branch should be called {testvalue}!', + ) def test_checkout_appid_branch_does_not_exist(self): appid = 'com.example' os.chdir(self.testdir.name) - git_repo, main_branch = fdroidserver.checkupdates.get_git_repo_and_main_branch() + git_repo = git.Repo.init('.') open('foo', 'w').close() git_repo.git.add(all=True) git_repo.index.commit("all files") @@ -491,7 +518,7 @@ class CheckupdatesTest(unittest.TestCase): local_dir = os.path.join(self.testdir.name, 'local_git') git.Repo.clone_from(upstream_dir, local_dir) os.chdir(local_dir) - git_repo, main_branch = fdroidserver.checkupdates.get_git_repo_and_main_branch() + git_repo = git.Repo.init('.') # --merge-request assumes remotes called 'origin' and 'upstream' git_repo.create_remote('upstream', upstream_dir).fetch() @@ -513,7 +540,7 @@ class CheckupdatesTest(unittest.TestCase): local_dir = os.path.join(self.testdir.name, 'local_git') git.Repo.clone_from(upstream_dir, local_dir) os.chdir(local_dir) - git_repo, main_branch = fdroidserver.checkupdates.get_git_repo_and_main_branch() + git_repo = git.Repo.init('.') # --merge-request assumes remotes called 'origin' and 'upstream' git_repo.create_remote('upstream', upstream_dir).fetch() @@ -530,7 +557,8 @@ class CheckupdatesTest(unittest.TestCase): # set up starting from remote branch git_repo.remotes.origin.push(appid) - git_repo.git.checkout(main_branch) + upstream_main = fdroidserver.checkupdates.get_upstream_main_branch(git_repo) + git_repo.git.checkout(upstream_main.split('/')[1]) git_repo.delete_head(appid, force=True) self.assertTrue( @@ -552,7 +580,7 @@ class CheckupdatesTest(unittest.TestCase): local_dir = os.path.join(self.testdir.name, 'local_git') git.Repo.clone_from(upstream_dir, local_dir) os.chdir(local_dir) - git_repo, main_branch = fdroidserver.checkupdates.get_git_repo_and_main_branch() + git_repo = git.Repo.init('.') # --merge-request assumes remotes called 'origin' and 'upstream' git_repo.create_remote('upstream', upstream_dir).fetch() @@ -577,7 +605,8 @@ class CheckupdatesTest(unittest.TestCase): # set up starting from remote branch git_repo.remotes.origin.push(appid) - git_repo.git.reset(main_branch) + upstream_main = fdroidserver.checkupdates.get_upstream_main_branch(git_repo) + git_repo.git.reset(upstream_main.split('/')[1]) self.assertFalse( fdroidserver.checkupdates.checkout_appid_branch(appid), From 0ec9cd6921b504c48a2a7fd84e4c7c8b2ae7081f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 19 Nov 2024 09:49:45 +0100 Subject: [PATCH 1780/2116] checkupdates: only update app branches if metadata file changed --- fdroidserver/checkupdates.py | 33 ++++++++++++++++++++------------ tests/test_checkupdates.py | 37 ++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 12 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index d9ad8048..bd97135d 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -740,9 +740,22 @@ def checkout_appid_branch(appid): return True -def push_commits(remote_name='origin', branch_name='checkupdates', verbose=False): +def get_changes_versus_ref(git_repo, ref, f): + changes = [] + for m in re.findall( + r"^[+-].*", git_repo.git.diff(f"{ref}", '--', f), flags=re.MULTILINE + ): + if not re.match(r"^(\+\+\+|---) ", m): + changes.append(m) + return changes + + +def push_commits(branch_name='checkupdates', verbose=False): """Make git branch then push commits as merge request. + The appid is parsed from the actual file that was changed so that + only the right branch is ever updated. + This uses the appid as the standard branch name so that there is only ever one open merge request per-app. If multiple apps are included in the branch, then 'checkupdates' is used as branch @@ -760,9 +773,7 @@ def push_commits(remote_name='origin', branch_name='checkupdates', verbose=False git_repo = git.Repo.init('.') upstream_main = get_upstream_main_branch(git_repo) files = set() - for commit in git_repo.iter_commits( - f'{upstream_main}...HEAD', right_only=True - ): + for commit in git_repo.iter_commits(f'{upstream_main}...HEAD', right_only=True): files.update(commit.stats.files.keys()) files = list(files) @@ -773,6 +784,11 @@ def push_commits(remote_name='origin', branch_name='checkupdates', verbose=False if not files: return + remote = git_repo.remotes.origin + if branch_name in remote.refs: + if not get_changes_versus_ref(git_repo, f'origin/{branch_name}', files[0]): + return + git_repo.create_head(branch_name, force=True) push_options = [ 'merge_request.create', @@ -784,13 +800,7 @@ def push_commits(remote_name='origin', branch_name='checkupdates', verbose=False # mark as draft if there are only changes to CurrentVersion: current_version_only = True - for m in re.findall( - r"^[+-].*", - git_repo.git.diff(f"{upstream_main}...HEAD"), - flags=re.MULTILINE, - ): - if re.match(r"^(\+\+\+|---) ", m): - continue + for m in get_changes_versus_ref(git_repo, upstream_main, files[0]): if not re.match(r"^[-+]CurrentVersion", m): current_version_only = False break @@ -810,7 +820,6 @@ def push_commits(remote_name='origin', branch_name='checkupdates', verbose=False progress = MyProgressPrinter() - remote = git_repo.remotes[remote_name] pushinfos = remote.push( branch_name, progress=progress, diff --git a/tests/test_checkupdates.py b/tests/test_checkupdates.py index 2e802741..87420d2b 100755 --- a/tests/test_checkupdates.py +++ b/tests/test_checkupdates.py @@ -324,6 +324,9 @@ class CheckupdatesTest(unittest.TestCase): for f in (basedir / 'metadata').glob('*.yml'): shutil.copy(f, 'metadata') git_repo = git.Repo.init(testdir) + with git_repo.config_writer() as cw: + cw.set_value('user', 'name', 'Foo Bar') + cw.set_value('user', 'email', 'foo@bar.com') git_repo.git.add(all=True) git_repo.index.commit("all metadata files") @@ -341,6 +344,40 @@ class CheckupdatesTest(unittest.TestCase): return git_repo, origin_repo, upstream_repo + def test_get_changes_versus_ref(self): + def _make_commit_new_app(git_repo, metadata_file): + app = fdroidserver.metadata.App() + fdroidserver.metadata.write_metadata(metadata_file, app) + git_repo.git.add(metadata_file) + git_repo.git.commit(metadata_file, message=f'changed {metadata_file}') + + git_repo, origin_repo, upstream_repo = self._get_test_git_repos() + for remote in git_repo.remotes: + remote.push(git_repo.active_branch) + appid = 'com.testvalue' + metadata_file = f'metadata/{appid}.yml' + + # set up remote branch with change to app + git_repo.git.checkout('-b', appid) + _make_commit_new_app(git_repo, metadata_file) + git_repo.remotes.origin.push(appid) + + # reset local branch and there should be differences + upstream_main = fdroidserver.checkupdates.get_upstream_main_branch(git_repo) + git_repo.git.reset(upstream_main) + self.assertTrue( + fdroidserver.checkupdates.get_changes_versus_ref( + git_repo, f'origin/{appid}', metadata_file + ) + ) + # make new commit that matches the previous, different commit, no diff + _make_commit_new_app(git_repo, metadata_file) + self.assertFalse( + fdroidserver.checkupdates.get_changes_versus_ref( + git_repo, f'origin/{appid}', metadata_file + ) + ) + def test_push_commits(self): git_repo, origin_repo, upstream_repo = self._get_test_git_repos() for remote in git_repo.remotes: From 50b686b33b09982131695bcc567c8b8385ebcab9 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Thu, 21 Nov 2024 12:26:23 +0000 Subject: [PATCH 1781/2116] gradle v8.11.1 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 7a168730..5163a812 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -206,6 +206,7 @@ get_sha() { '8.10.1') echo '1541fa36599e12857140465f3c91a97409b4512501c26f9631fb113e392c5bd1' ;; '8.10.2') echo '31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26' ;; '8.11') echo '57dafb5c2622c6cc08b993c85b7c06956a2f53536432a30ead46166dbca0f1e9' ;; + '8.11.1') echo 'f397b287023acdba1e9f6fc5ea72d22dd63669d59ed4a289a29b1a76eee151c6' ;; *) exit 1 esac } @@ -226,7 +227,7 @@ d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2 7.1 7.0 4.2 4.1 4.0 3.6 d_plugin_min_gradle_v=(8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 37dc6c121d8864278969d5bc0a7ec94902961ff4 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 21 Nov 2024 15:23:29 +0100 Subject: [PATCH 1782/2116] run tests/refresh-SUSS_DEFAULT.py --- fdroidserver/scanner.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index ebcc00b5..def865c0 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -2209,10 +2209,10 @@ SUSS_DEFAULT = r'''{ "https://www.android.com/gms/" ], "gradle_signatures": [ + "com.google.gms(?!.google-services)", "com.google.android.gms(?!.oss-licenses-plugin)", "com.google.android.ump", "androidx.core:core-google-shortcuts", - "androidx.credentials:credentials", "androidx.credentials:credentials-play-services-auth", "androidx.media3:media3-cast", "androidx.media3:media3-datasource-cronet", @@ -2937,7 +2937,7 @@ SUSS_DEFAULT = r'''{ "license": "NonFree" } }, - "timestamp": 1725205987.66681, + "timestamp": 1728920062.92063, "version": 1, - "last_updated": 1725950235.569432 + "last_updated": 1732198944.559238 }''' From eae5ae3ae8f4edd20d8a2e87679e986997659b56 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 21 Nov 2024 16:49:01 +0100 Subject: [PATCH 1783/2116] version 2.3.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 444a70be..25df9914 100755 --- a/setup.py +++ b/setup.py @@ -70,7 +70,7 @@ with open("README.md", "r") as fh: setup( name='fdroidserver', - version='2.3a2', + version='2.3.0', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From 6ff1c9733c1a5e01c70ff0bff35b8a88cc079ff1 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 21 Nov 2024 21:26:33 +0100 Subject: [PATCH 1784/2116] include tests/__init__.py in dist tarball --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index d847e172..42e1f46e 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -47,6 +47,7 @@ include locale/zh_Hans/LC_MESSAGES/fdroidserver.po include locale/zh_Hant/LC_MESSAGES/fdroidserver.po include makebuildserver include README.md +include tests/__init__.py include tests/aosp_testkey_debug.keystore include tests/apk.embedded_1.apk include tests/bad-unicode-*.apk From 069f75b3d5bc92c414bdf3e5250c464cb3f54b1b Mon Sep 17 00:00:00 2001 From: Cool Man Date: Tue, 19 Nov 2024 14:04:53 +0100 Subject: [PATCH 1785/2116] Translated using Weblate: Arabic (ar) by Cool Man Currently translated at 5.5% (33 of 592 strings) Co-authored-by: Cool Man Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ar/ Translation: F-Droid/F-Droid Server --- locale/ar/LC_MESSAGES/fdroidserver.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/locale/ar/LC_MESSAGES/fdroidserver.po b/locale/ar/LC_MESSAGES/fdroidserver.po index 3cd48f33..c790b394 100644 --- a/locale/ar/LC_MESSAGES/fdroidserver.po +++ b/locale/ar/LC_MESSAGES/fdroidserver.po @@ -4,20 +4,21 @@ # Rex_sa , 2023. # PD , 2023. # Laachir , 2024. +# Cool Man , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2024-01-17 16:52+0000\n" -"Last-Translator: Laachir \n" +"PO-Revision-Date: 2024-09-21 19:31+0000\n" +"Last-Translator: Cool Man \n" "Language-Team: Arabic \n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -984,7 +985,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" -msgstr "" +msgstr "تثبيت الحزم المدمجة على الأجهزة" #: ../fdroidserver/install.py #, python-format @@ -998,7 +999,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" -msgstr "" +msgstr "التفاعل مع خادم HTTP للمستودع" #: ../fdroidserver/update.py msgid "Invalid APK" From 732a945fa3fe300f4f829e5fc3e42d3aece0a4df Mon Sep 17 00:00:00 2001 From: Doctorredits_here Date: Tue, 19 Nov 2024 14:04:54 +0100 Subject: [PATCH 1786/2116] Translated using Weblate: Indonesian (id) by Doctorredits_here Currently translated at 16.8% (100 of 592 strings) Co-authored-by: Doctorredits_here Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/id/ Translation: F-Droid/F-Droid Server --- locale/id/LC_MESSAGES/fdroidserver.po | 57 ++++++++++++++------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index ad5e0f79..a803055b 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -3,20 +3,21 @@ # signz signotorez , 2020, 2021. # Reza Almanda , 2021. # whenwesober , 2021. +# Doctorredits_here , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-09-10 10:50+0200\n" -"PO-Revision-Date: 2021-06-23 23:32+0000\n" -"Last-Translator: whenwesober \n" +"PO-Revision-Date: 2024-10-04 04:26+0000\n" +"Last-Translator: Doctorredits_here \n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.7.1-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -98,7 +99,7 @@ msgstr "%(prog)s: galat: %(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "%d APK gagal ditandatangani atau diverifikasi!" #: ../fdroidserver/scanner.py #, python-format @@ -121,12 +122,12 @@ msgstr "%r tidak bisa dipanggil" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" -msgstr "" +msgstr "%s terdapat sebuah kesalahan!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" -msgstr "" +msgstr "%s checksum yg dihitung untuk file tersebut tidak cocok dengan yang diharapkan %s" #: ../fdroidserver/lint.py #, python-format @@ -164,7 +165,7 @@ msgstr "'repo_keyalias' tidak ditemukan dalam config.yml!" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" -msgstr "" +msgstr "'diperlukan' adalah argumen yang tidak valid untuk posisi" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" @@ -188,7 +189,7 @@ msgstr "'{path}' gagal dieksekusi!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "'{path}' memiliki format yang tidak valid, seharusnya kamus!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format @@ -196,14 +197,14 @@ msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' tidak valid pada {field} dalam {appid}. Pakem regex: {pattern}" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "'{value}' tidak valid pada {field} dalam {appid}. Pakem regex: {pattern}" +msgstr "'{value}' bukan {field} yang valid, seharusnya {pattern}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" -msgstr "" +msgstr "...checkupdate gagal untuk {appid} : {error}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -222,7 +223,7 @@ msgstr "URL diperlukan sebagai argumen!" #: ../fdroidserver/common.py #, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "" +msgstr "Tanda tangan APK memiliki sertifikat berbeda di {path}:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -234,7 +235,7 @@ msgstr "Tambahkan sebuah kunci penandatangan repo ke repo yang tidak ditandatang #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" -msgstr "" +msgstr "Tambahkan file metadata kerangka untuk APK yang tidak memilikinya" #: ../fdroidserver/update.py #, python-brace-format @@ -243,67 +244,67 @@ msgstr "Menambahkan repo baru hanya untuk {name}" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" -msgstr "" +msgstr "Alias kunci penandatanganan repo di keystore" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "AllowedAPKSigningKeys hilang tetapi biner referensi disediakan" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" -msgstr "" +msgstr "Mengizinkan revisi berbeda (atau cabang git) ditentukan untuk impor awal" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" -msgstr "" +msgstr "Juga cerminkan bagian arsip lengkap" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" -msgstr "" +msgstr "Juga peringatkan tentang masalah pemformatan, seperti rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" -msgstr "" +msgstr "Perpustakaan AAR Android" #: ../fdroidserver/scanner.py msgid "Android APK file" -msgstr "" +msgstr "Android APK file" #: ../fdroidserver/scanner.py msgid "Android DEX code" -msgstr "" +msgstr "format file Android DEX" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "" +msgstr "Android SDK tidak ditemukan di {path}!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" -msgstr "" +msgstr "Jalur Android SDK '{path}' tidak ada!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" -msgstr "" +msgstr "Jalur Android SDK '{path}' bukan direktori!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "" +msgstr "Alat Android SDK {cmd} tidak ditemukan!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "Aplikasi memiliki Biner tetapi tidak memiliki AllowedAPKSigningKeys yang sesuai untuk menyematkan sertifikat." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" +msgstr "Aplikasi memiliki NoSource Since atau ArchivePolicy \"0 versi\" tetapi AutoUpdateMode atau UpdateCheckMode bukan Tidak Ada" #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" +msgstr "Aplikasi memiliki NoSource Since atau ArchivePolicy \"0 versi\" atau 0 tetapi AutoUpdateMode atau UpdateCheckMode bukan Tidak Ada" #: ../fdroidserver/lint.py #, python-brace-format From 4d3feb93e3d2c7ed0ec0af80fcac9c3be5b9d87c Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 21 Nov 2024 21:34:40 +0100 Subject: [PATCH 1787/2116] make -C locale update --- locale/ar/LC_MESSAGES/fdroidserver.po | 88 +++++- locale/az/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/be/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/bg/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/bn/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/bo/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/ca/LC_MESSAGES/fdroidserver.po | 91 +++++- locale/cs/LC_MESSAGES/fdroidserver.po | 91 +++++- locale/cy/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/de/LC_MESSAGES/fdroidserver.po | 91 +++++- locale/el/LC_MESSAGES/fdroidserver.po | 88 +++++- locale/es/LC_MESSAGES/fdroidserver.po | 91 +++++- locale/es_AR/LC_MESSAGES/fdroidserver.po | 88 +++++- locale/es_MX/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/eu/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/fa/LC_MESSAGES/fdroidserver.po | 88 +++++- locale/fdroidserver.pot | 89 +++++- locale/fi/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/fr/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/fy/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/ga/LC_MESSAGES/fdroidserver.po | 91 +++++- locale/he/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/hi/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/hu/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/id/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/it/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/ja/LC_MESSAGES/fdroidserver.po | 91 +++++- locale/kab/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/ko/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/lv/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/ml/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/nl/LC_MESSAGES/fdroidserver.po | 89 +++++- locale/pl/LC_MESSAGES/fdroidserver.po | 91 +++++- locale/pt/LC_MESSAGES/fdroidserver.po | 91 +++++- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 91 +++++- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 91 +++++- locale/ro/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/ru/LC_MESSAGES/fdroidserver.po | 91 +++++- locale/sk/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/sq/LC_MESSAGES/fdroidserver.po | 91 +++++- locale/sr/LC_MESSAGES/fdroidserver.po | 91 +++++- locale/sv/LC_MESSAGES/fdroidserver.po | 88 +++++- locale/sw/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/ta/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/tr/LC_MESSAGES/fdroidserver.po | 91 +++++- locale/tzm/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/ug/LC_MESSAGES/fdroidserver.po | 87 +++++- locale/uk/LC_MESSAGES/fdroidserver.po | 91 +++++- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 305 ++++++++++----------- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 91 +++++- 51 files changed, 4375 insertions(+), 353 deletions(-) diff --git a/locale/ar/LC_MESSAGES/fdroidserver.po b/locale/ar/LC_MESSAGES/fdroidserver.po index c790b394..9ac8ad9e 100644 --- a/locale/ar/LC_MESSAGES/fdroidserver.po +++ b/locale/ar/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-09-21 19:31+0000\n" "Last-Translator: Cool Man \n" "Language-Team: Arabic \n" @@ -199,6 +199,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -326,6 +330,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -418,6 +430,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -431,6 +447,10 @@ msgstr "اﻷمر '%s' لم يتم التعرف عليه.\n" msgid "Commit changes" msgstr "التزم بالتغييرات" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -614,6 +634,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -718,6 +742,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1176,6 +1204,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1252,7 +1284,6 @@ msgstr "" #: ../fdroidserver/__main__.py #, fuzzy -#| msgid "no version information found" msgid "No version information could be found." msgstr "لم يتم العثور على معلومات النسخة" @@ -1292,11 +1323,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1381,6 +1412,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1501,6 +1537,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "" @@ -1566,6 +1607,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2013,6 +2058,11 @@ msgstr "" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2022,6 +2072,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2034,6 +2088,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2046,6 +2108,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2612,6 +2679,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2653,6 +2724,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2766,6 +2841,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/az/LC_MESSAGES/fdroidserver.po b/locale/az/LC_MESSAGES/fdroidserver.po index a42bf704..6d11e62c 100644 --- a/locale/az/LC_MESSAGES/fdroidserver.po +++ b/locale/az/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2023-05-26 19:39+0000\n" "Last-Translator: Mehrab Poladov \n" "Language-Team: Azerbaijani \n" @@ -195,6 +195,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -322,6 +326,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -414,6 +426,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -427,6 +443,10 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -610,6 +630,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -714,6 +738,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1172,6 +1200,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1286,11 +1318,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1375,6 +1407,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1495,6 +1532,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "" @@ -1560,6 +1602,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2007,6 +2053,11 @@ msgstr "" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2016,6 +2067,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2028,6 +2083,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2040,6 +2103,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2604,6 +2672,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2645,6 +2717,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2758,6 +2834,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/be/LC_MESSAGES/fdroidserver.po b/locale/be/LC_MESSAGES/fdroidserver.po index ab9759d0..10d9e5d7 100644 --- a/locale/be/LC_MESSAGES/fdroidserver.po +++ b/locale/be/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-01-21 00:08+0000\n" "Last-Translator: flac \n" "Language-Team: Belarusian \n" @@ -200,6 +200,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -327,6 +331,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -419,6 +431,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -432,6 +448,10 @@ msgstr "Каманда '%s' не распазнана.\n" msgid "Commit changes" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -615,6 +635,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -719,6 +743,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1177,6 +1205,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1291,11 +1323,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1380,6 +1412,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1500,6 +1537,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Перапішыце ўсе файлы метададзеных" @@ -1565,6 +1607,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2012,6 +2058,11 @@ msgstr "Праверце цэласнасць спампаваных пакет msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2021,6 +2072,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "Папярэджваць аб магчымых памылках метададзеных" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2033,6 +2088,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2045,6 +2108,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2609,6 +2677,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "патрабуюцца наступныя аргументы: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2650,6 +2722,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2763,6 +2839,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/bg/LC_MESSAGES/fdroidserver.po b/locale/bg/LC_MESSAGES/fdroidserver.po index af494589..abf96ae9 100644 --- a/locale/bg/LC_MESSAGES/fdroidserver.po +++ b/locale/bg/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-07-19 10:21+0000\n" "Last-Translator: 109247019824 \n" "Language-Team: Bulgarian \n" @@ -196,6 +196,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -323,6 +327,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -415,6 +427,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -428,6 +444,10 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -611,6 +631,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -715,6 +739,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1173,6 +1201,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1287,11 +1319,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1376,6 +1408,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1496,6 +1533,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "" @@ -1561,6 +1603,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2008,6 +2054,11 @@ msgstr "" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2017,6 +2068,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2029,6 +2084,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2041,6 +2104,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2605,6 +2673,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2646,6 +2718,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2759,6 +2835,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index d47d2d73..49c8a792 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2021-02-12 09:48+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali \n" @@ -195,6 +195,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -322,6 +326,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -414,6 +426,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -427,6 +443,10 @@ msgstr "'%s' কমান্ড চিনা যায়নি।\n" msgid "Commit changes" msgstr "পরিবর্তন জমা দাও" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -610,6 +630,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -714,6 +738,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1172,6 +1200,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1286,11 +1318,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1375,6 +1407,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1495,6 +1532,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "" @@ -1560,6 +1602,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2007,6 +2053,11 @@ msgstr "" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2016,6 +2067,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2028,6 +2083,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2040,6 +2103,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2605,6 +2673,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2646,6 +2718,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2759,6 +2835,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index 1b32a1b5..0e9ffd5c 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tibetan \n" @@ -200,6 +200,10 @@ msgstr "'{value}' ཁུངས་ལྡན་རེད་མིན་འདུ msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -327,6 +331,14 @@ msgstr "མཛོད་ཁང་{apkfilename} ལ་ཁུངས་ལྡན་ msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -418,6 +430,10 @@ msgstr "མཛོད་ཁང་ཚོད་ལྟའི་ཆེད་དུ། msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "གསར་བསྒྱུར་གཙང་བཟོ།-ཡིག་ཆ་གསོག་ཉར་བེད་སྤྱོ་མ་བྱེད། APKs ཚང་མ་སྐྱར་སྤྱོད་བྱེད།" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "སྡེ་ཚན་སོ་སོའི་ཐོ་གཞུང་ལ་བར་མཚམས་རེ་འཇོག།." @@ -431,6 +447,10 @@ msgstr "བཀའ་ཁྱབ་ '%s 1'ངོས་འཛིན་ཐུབ་ msgid "Commit changes" msgstr "བསྒྱུར་བ་གཏོང་བར་མོས་མཐུན་ཡོད།" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -618,6 +638,10 @@ msgstr "མཛོད་ཁང་སྐྱར་སོས་མ་བྱེད། msgid "Don't use rsync checksums" msgstr "rsync ཡིག་ཚགས་བརྟག་དཔྱད་ཀྱི་གསོག་ཉར་ཁང་འདི་བེད་སྤྱོད་མ་བྱེད།" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -724,6 +748,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "APKs ནས་མིང་རྟགས་ཕྱིར་སྟོན་བྱེད།" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Failed copying {path}: {error}" @@ -1189,6 +1217,10 @@ msgstr "ཨེན་ཀྲོཌ་ SDK རྙེད་མ་སོང་།!" msgid "No attached devices found" msgstr "ཟུར་སྣོན་ཡོ་བྱད་རྙེད་མ་སོང་།" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "URL ནང་ལག་མཐིལ་པར་ཤུས་རྙེད་མ་སོང་།." @@ -1307,11 +1339,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1397,6 +1429,11 @@ msgstr "རེ་པོ་མིང་རྟགས་བཀོད་པའི་ msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "ས་ཚིགས་ཀྱི་གསང་ཁྱབ་ངོ་བཤུས་དང་/སྦྱར་བ་སྟབས་བདེ་ཡོང་བའི་ཆེད་དུ་འདྲ་བཤུས་" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1517,6 +1554,11 @@ msgstr "པར་གྱི་རྒྱུ་ཆེ་ཆུང་ཚད་ལས msgid "Restrict output to warnings and errors" msgstr "ཡིག་ཚགས་ལ་ཉེན་བརྡ་དང་སྐྱོན་ཅན་རྣམས་དམ་བསྒྲགས་བྱེད།" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "ཡིག་ཚགས་ཀྱི་རྒྱབ་ལྗོངས་ལོ་རྒྱུས་ཚང་མ་སྐྱར་ཟིན།" @@ -1581,6 +1623,10 @@ msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "འཚག་རྒྱབ་ལ་སྐྱོན་རྙེད་པ།" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2032,6 +2078,11 @@ msgstr "ཕབ་ལེན་བྱས་པའི་ཐུམ་སྒྲིལ msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2041,6 +2092,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "ཡིག་ཚགས་ཀྱི་རྒྱབ་ལྗོངས་ལོ་རྒྱུས་སྐྱོན་སྲིད་པ་རྣམས་པ་ཉེན་བརྡ་གཏོང་།" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "བརྡ་སྟོན་པའི་མིང་རྟགས་དེ་སྒྲིག་བཀོད་བྱས་ཚར་ན། གནས་སྐབས་མིང་རྟགས་མ་བཀོད་པའི་བརྡ་སྟོན་རྣམས་བཟོས།" @@ -2053,6 +2108,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'ཁྱད་པར་ཅན་གྱི་མིང་' ལྡེ་མིག་བཟོས་པའི་སྐབས་ལ་བེད་སྤྱོད་བྱེད།" @@ -2065,6 +2128,11 @@ msgstr "ཁྱེད་རང་གིས་ཨེན་ཀྲོཌ་མདུ msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2638,6 +2706,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "གཤམ་གྱི་རྩོད་པ་དེ་དག་དགོས།:%s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2679,6 +2751,10 @@ msgstr "Apache libcloud བེད་སྤྱོད་བྱས་པའི་ msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2791,6 +2867,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index 73f3be76..b49c98e6 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-09-30 03:51+0000\n" "Last-Translator: pitroig \n" "Language-Team: Catalan \n" @@ -203,6 +203,10 @@ msgstr "'{value}' no és un {field} vàlid a {appid}. Expressió regular: {patte msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' no és un {field} vàlid; hauria de ser {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -330,6 +334,14 @@ msgstr "S'està arxivant {apkfilename} amb una signatura no vàlida!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode amb UpdateCheckMode: HTTP ha de tenir un patró." +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -422,6 +434,10 @@ msgstr "S'està comprovant l'arxivat per a {appid} - apks:{integer}, keepversion msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Actualització neta - no utilitza la memòria cau, reprocessa tots els APK" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Llista de categories separades per comes." @@ -435,6 +451,10 @@ msgstr "Ordre '%s' no reconeguda.\n" msgid "Commit changes" msgstr "Publicar els canvis" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -618,6 +638,10 @@ msgstr "No actualitzar el dipòsit, útil quan es prova una construcció sense c msgid "Don't use rsync checksums" msgstr "No usis les sumes de verificació \"rsync\"" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Baixa les rèpliques completes dels petits dipòsits" @@ -726,6 +750,10 @@ msgstr "Extreu les metadades de l'aplicació des d'un dipòsit de codi font" msgid "Extract signatures from APKs" msgstr "Extreu les signatures dels APKs" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1184,6 +1212,10 @@ msgstr "No s'ha trobat cap SDK d'Android!" msgid "No attached devices found" msgstr "No s'ha trobat cap dispositiu adjunt" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "No hi ha cap empremta digital a l'URL." @@ -1297,14 +1329,14 @@ msgstr "El nom del paquet de l'OBB no coincideix amb un APK compatible:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Màquina fora de línia, s'ometrà la generació del mirall git fins al `fdroid deploy`" -#: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "Un dels elements de configuració 'github_releases' manca el valor 'projectUrl'. s'està ometent..." - #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "Un dels elements de configuració 'github_releases' manca el valor 'packageNames'. s'està ometent..." +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "Un dels elements de configuració 'github_releases' manca el valor 'projectUrl'. s'està ometent..." + #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "Un dels elements de configuració 'github_releases' manca el valor 'token'. s'està ometent..." @@ -1387,6 +1419,11 @@ msgstr "Camí al magatzem de claus per a la clau de signatura del dipòsit" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Imprimeix la variable secreta al terminal per a copiar/enganxar fàcilment" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1507,6 +1544,11 @@ msgstr "Canvia la mida de totes les icones que excedeixen la mida màxima del p msgid "Restrict output to warnings and errors" msgstr "Restringeix la sortida a avisos i errors" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Reescriu tots els fitxers de metadades" @@ -1572,6 +1614,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "L'escàner ha trobat {} problema" msgstr[1] "L'escàner ha trobat {} problemes" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "S'està escanejant l'APK amb dexdump per a les classes no lliures conegudes." @@ -2026,6 +2072,11 @@ msgstr "Verifica la integritat dels paquets descarregats" msgid "Verifying index signature:" msgstr "Verificació de la signatura de l'índex:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2035,6 +2086,10 @@ msgstr "La clau de l'API VirusTotal no pot pujar fitxers més grans de 32 MB, ut msgid "Warn about possible metadata errors" msgstr "Avisa de possibles errors a les metadades" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Quan es configura per als índexs signats, només es creen els índexs no signats en aquesta fase" @@ -2047,6 +2102,14 @@ msgstr "Quan es mostra tot el «yamllint» del repositori està desactivat de ma msgid "When signing or verifying fails, exit with an error code." msgstr "Quan signar o verificar falla, sortiu amb un codi d'error." +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Nom distint' utilitzat en generar claus" @@ -2059,6 +2122,11 @@ msgstr "Podeu utilitzar ANDROID_HOME per establir el camí al vostre SDK, és a msgid "ZIP file archive" msgstr "arxiu de fitxers ZIP" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2623,6 +2691,10 @@ msgstr "el binari de referència proporcionat ha permès el signant {signer}" msgid "the following arguments are required: %s" msgstr "els arguments següents són obligatoris: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2664,6 +2736,10 @@ msgstr "s'està utilitzant libcloud d'Apache per sincronitzar amb {url}" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com és limitant de velocitat, esperant tornar-ho a provar..." +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2777,6 +2853,11 @@ msgstr "{path} té una signatura de fitxer incorrecta \"{pattern}\", possible Ja msgid "{path} has been flagged by virustotal {count} times:" msgstr "{path} ha estat marcat pel virustotal {count} vegades:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 7772e0dc..758e655c 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-09-22 23:34+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" @@ -207,6 +207,10 @@ msgstr "„{value}“ není platný {field} v {appid}. Vzor regex: {pattern}" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "„{value}“ není platný {field}, měl by to být {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -334,6 +338,14 @@ msgstr "Archivuji {apkfilename} s neplatným podpisem!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode s UpdateCheckMode: HTTP musí mít vzor." +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -427,6 +439,10 @@ msgstr "Kontrola archivace u {appid} - apks:{integer}, keepversions:{keep}, arch msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Čistá aktualizace - nepoužívat mezipaměti, znovu zpracovat všechny soubory APK" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Seznam kategorií oddělený čárkami." @@ -440,6 +456,10 @@ msgstr "Příkaz „%s“ nebyl rozpoznán.\n" msgid "Commit changes" msgstr "Odeslat změny" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -623,6 +643,10 @@ msgstr "Neobnovovat repozitář, užitečné při testování sestavení bez př msgid "Don't use rsync checksums" msgstr "Nepoužívat kontrolní součty rsync" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Stáhnout kompletní mirrory malých repozitářů" @@ -731,6 +755,10 @@ msgstr "Extrahovat metadata aplikace ze zdrojového repozitáře" msgid "Extract signatures from APKs" msgstr "Extrahovat podpisy ze souborů APK" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1189,6 +1217,10 @@ msgstr "Nebylo nalezeno Android SDK!" msgid "No attached devices found" msgstr "Nebyla nalezena žádná připojená zařízení" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "V adrese URL není otisk." @@ -1302,14 +1334,14 @@ msgstr "Packagename souboru OBB neodpovídá podporovanému souboru APK:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Offline počítač, přeskakuji generování mirroru gitu až do `fdroid deploy`" -#: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "Jedné z položek konfigurace „github_releases“ chybí hodnota „projectUrl“. Přeskakuji ..." - #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "Jedné z položek konfigurace „github_releases“ chybí hodnota „packageNames“. Přeskakuji ..." +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "Jedné z položek konfigurace „github_releases“ chybí hodnota „projectUrl“. Přeskakuji ..." + #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "Jedné z položek konfigurace „github_releases“ chybí hodnota „token“. Přeskakuji ..." @@ -1392,6 +1424,11 @@ msgstr "Cesta k úložišti klíčů pro podpisový klíč repozitáře" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Zobrazit tajnou proměnnou v terminálu pro jednoduché kopírování/vložení" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1512,6 +1549,11 @@ msgstr "Změnit velikost všech ikon přesahujících maximální velikost pixel msgid "Restrict output to warnings and errors" msgstr "Omezit výstup na varování a chyby" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Přepsat všechny soubory metadat" @@ -1578,6 +1620,10 @@ msgstr[0] "Skener našel {} problém" msgstr[1] "Skener našel {} problémy" msgstr[2] "Skener našel {} problémů" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Skenování APK pomocí dexdump na známé nesvobodné třídy." @@ -2032,6 +2078,11 @@ msgstr "Ověřit integritu stažených balíčků" msgid "Verifying index signature:" msgstr "Ověřování podpisu indexu:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2041,6 +2092,10 @@ msgstr "Klíč API VirusTotal neumožňuje nahrávání souborů větších než msgid "Warn about possible metadata errors" msgstr "Varovat ohledně možných chyb metadat" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Pokud jsou nakonfigurovány podepsané indexy, vytvořit v této fázi pouze nepodepsané indexy" @@ -2053,6 +2108,14 @@ msgstr "Při lintingu celého úložiště je yamllint ve výchozím nastavení msgid "When signing or verifying fails, exit with an error code." msgstr "Pokud podpis nebo ověření selže, ukončit proces s chybovým kódem." +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 „Distinguished Name“ používané při generování klíčů" @@ -2065,6 +2128,11 @@ msgstr "Pro nastavení cesty k vašemu SDK můžete použít ANDROID_HOME, např msgid "ZIP file archive" msgstr "Archiv souborů ZIP" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2631,6 +2699,10 @@ msgstr "dodaný referenční binární soubor umožnil podepisujícího {signer} msgid "the following arguments are required: %s" msgstr "jsou vyžadovány následující argumenty: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2672,6 +2744,10 @@ msgstr "používám Apache libcloud pro synchronizaci s {url}" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com omezuje rychlost, čekám na opětovný pokus..." +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2786,6 +2862,11 @@ msgstr "{path} má nesprávný podpis balíčku „{pattern}“, možný exploit msgid "{path} has been flagged by virustotal {count} times:" msgstr "{path} byl označen službou VirusTotal {count}krát:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/cy/LC_MESSAGES/fdroidserver.po b/locale/cy/LC_MESSAGES/fdroidserver.po index 18ca6109..4c59a2ad 100644 --- a/locale/cy/LC_MESSAGES/fdroidserver.po +++ b/locale/cy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2021-01-16 21:23+0000\n" "Last-Translator: Aled Powell \n" "Language-Team: Welsh \n" @@ -199,6 +199,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -326,6 +330,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -422,6 +434,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -435,6 +451,10 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -618,6 +638,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -722,6 +746,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1180,6 +1208,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1294,11 +1326,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1383,6 +1415,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1503,6 +1540,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Ailysgrifennu'r holl ffeiliau metaddata" @@ -1572,6 +1614,10 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2026,6 +2072,11 @@ msgstr "Gwirio dilysrwydd pecynnau a lawrlwythir" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2035,6 +2086,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "Rhybuddio am wallau metaddata posib" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2047,6 +2102,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2059,6 +2122,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2632,6 +2700,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2673,6 +2745,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2790,6 +2866,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index be5ade62..fd5a1393 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -26,7 +26,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-09-18 23:55+0000\n" "Last-Translator: VfBFan \n" "Language-Team: German \n" @@ -220,6 +220,10 @@ msgstr "'{value}' ist kein gültiges {field} in {appid}. Regex-Muster: {pattern} msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' ist kein gültiges {field}, sollte {pattern} sein" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -347,6 +351,14 @@ msgstr "Archivierung von {apkfilename} mit ungültiger Signatur!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode mit UpdateCheckMode: HTTP muss ein Muster haben." +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -439,6 +451,10 @@ msgstr "Archivierung auf {appid} überprüfen - apks:{integer}, keepversions:{ke msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Sauber aktualisieren - ohne Verwendung der Zwischenspeicher, alle APKs wiederaufbereiten" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Liste der Kategorien durch Kommata getrennt." @@ -452,6 +468,10 @@ msgstr "Befehl '%s' nicht erkannt.\n" msgid "Commit changes" msgstr "Änderungen übergeben" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -635,6 +655,10 @@ msgstr "Keine Aktualisierung des Repositorys. Nützlich, wenn ein Build ohne Int msgid "Don't use rsync checksums" msgstr "Keine rsync-Prüfsummen verwenden" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Komplette Spiegel von kleinen Paketquellen herunterladen" @@ -743,6 +767,10 @@ msgstr "Extrahieren von Anwendungsmetadaten aus einem Quell-Repository" msgid "Extract signatures from APKs" msgstr "Signaturen aus APKs extrahieren" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1201,6 +1229,10 @@ msgstr "Kein Android-SDK gefunden!" msgid "No attached devices found" msgstr "Keine angeschlossenen Geräte gefunden" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Kein Fingerabdruck in der URL." @@ -1314,14 +1346,14 @@ msgstr "Der OBB-Packetname stimmt mit keinem unterstützten APK überein:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Maschine offline, überspringe git-Spiegelgeneration bis `fdroid deploy`" -#: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "Einem der Konfigurationselemente von 'github_releases' fehlt der Wert 'projectUrl'. Überspringe …" - #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "Einem der Konfigurationselemente von 'github_releases' fehlt der Wert 'packageNames'. Überspringe …" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "Einem der Konfigurationselemente von 'github_releases' fehlt der Wert 'projectUrl'. Überspringe …" + #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "Einem der Konfigurationselemente von 'github_releases' fehlt der Wert 'token'. Überspringe …" @@ -1404,6 +1436,11 @@ msgstr "Pfad zum Schlüsselspeicher für den Repository-Signierschlüssel" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Drucken der geheimen Variable in das Terminal zum einfachen Kopieren/Einfügen" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1524,6 +1561,11 @@ msgstr "Größe aller Symbole ändern, welche die maximale Pixelgröße übersch msgid "Restrict output to warnings and errors" msgstr "Ausgabe auf Warnungen und Fehler beschränken" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Alle Metadaten-Dateien neu schreiben" @@ -1589,6 +1631,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "Scanner fand {count} Problem" msgstr[1] "Scanner fand {count} Probleme" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "APK mit dexdump nach bekannten nicht-quelloffenen Klassen scannen." @@ -2043,6 +2089,11 @@ msgstr "Integrität der heruntergeladenen Programmpakete überprüfen" msgid "Verifying index signature:" msgstr "Überprüfe die Index-Signatur:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2052,6 +2103,10 @@ msgstr "VirusTotal-API-Schlüssel kann nicht Dateien größer 32MB hochladen, ve msgid "Warn about possible metadata errors" msgstr "Vor möglichen Metadaten-Fehlern warnen" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Bei einer Konfiguration mit signierten Indizes, in dieser Phase nur unsignierte Indizes erstellen" @@ -2064,6 +2119,14 @@ msgstr "Beim Linting des gesamten Repositoriums wird yamllint standardmäßig de msgid "When signing or verifying fails, exit with an error code." msgstr "Wenn das Signieren oder Verifizieren fehlschlägt, wird der Vorgang mit einem Fehlercode beendet." +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distinguished Name' zum Erzeugen von Schlüsseln" @@ -2076,6 +2139,11 @@ msgstr "Sie können ANDROID_HOME verwenden, um den Pfad zu Ihrem SDK zu setzen, msgid "ZIP file archive" msgstr "ZIP-Dateiarchiv" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2640,6 +2708,10 @@ msgstr "Angewandte Referenz-Binary erlaubt Signer {signer}" msgid "the following arguments are required: %s" msgstr "die folgenden Argumente sind erforderlich: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2681,6 +2753,10 @@ msgstr "Verwende Apache libcloud zur Synchronisation mit {url}" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com limitiert die Zugriffe, warte auf Wiederholung …" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2794,6 +2870,11 @@ msgstr "{path} hat die schlechte Dateisignatur \"{pattern}\", möglicher Janus-E msgid "{path} has been flagged by virustotal {count} times:" msgstr "{path} wurde von virustotal {count} Mal markiert:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index 29e91fca..49563fe2 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-05-10 13:24+0000\n" "Last-Translator: ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ \n" "Language-Team: Greek \n" @@ -202,6 +202,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -329,6 +333,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -421,6 +433,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -434,6 +450,10 @@ msgstr "Η εντολή «%s» δεν αναγνωρίζεται.\n" msgid "Commit changes" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -617,6 +637,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -721,6 +745,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1179,6 +1207,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1293,11 +1325,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1382,6 +1414,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1502,6 +1539,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Επανεγγραφή όλων των αρχείων μετα-δεδομένων" @@ -1567,6 +1609,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -1990,7 +2036,6 @@ msgstr "" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format -#| msgid "using Apache libcloud to sync with {url}" msgid "Using rclone to sync with: {url}" msgstr "χρήση Apache libcloud για συγχρονισμό με {url}" @@ -2015,6 +2060,11 @@ msgstr "Επαλήθευση της ακεραιότητας των πακέτω msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2024,6 +2074,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "Προειδοποίηση για πιθανά σφάλματα μετα-δεδομένων" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2036,6 +2090,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2048,6 +2110,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2613,6 +2680,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "Απαιτούνται τα ακόλουθα ορίσματα: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2654,6 +2725,10 @@ msgstr "χρήση Apache libcloud για συγχρονισμό με {url}" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2767,6 +2842,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 25ba05be..a9c6e85e 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-09-10 13:17+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" @@ -211,6 +211,10 @@ msgstr "'{value}' no es un {field} válido en {appid}. Patrón de expresión reg msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' no es un {field} válido, debería ser {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -338,6 +342,14 @@ msgstr "¡Archivando {apkfilename} con una firma inválida!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode con UpdateCheckMode: el HTTP debe tener un patrón." +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -430,6 +442,10 @@ msgstr "Comprobando la operación de archivo para {appid} - APKs:{integer}, vers msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Actualización limpia, no usa la caché, procesa todas las APKs" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Lista de categorías separadas por comas." @@ -443,6 +459,10 @@ msgstr "No se reconoció la orden «%s».\n" msgid "Commit changes" msgstr "Aplicar cambios" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -626,6 +646,10 @@ msgstr "No actualizar el repositorio, útil al probar una compilación sin conex msgid "Don't use rsync checksums" msgstr "No use rsync checksums" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Descargar réplicas completas de repositorios pequeños" @@ -734,6 +758,10 @@ msgstr "Extraer los metadatos de la aplicación de un repositorio de origen" msgid "Extract signatures from APKs" msgstr "Extraer firmas de APKs" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1192,6 +1220,10 @@ msgstr "¡No se encontró Android SDK!" msgid "No attached devices found" msgstr "No se han encontrado dispositivos asociados" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "No hay huella digital en la URL." @@ -1305,14 +1337,14 @@ msgstr "El nombre de paquete de OBB no coincide con un APK soportado:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Maquina desconectada. Saltando la generación del repositorio espejo git hasta`fdroid deploy`" -#: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "A uno de los elementos de configuración 'github_releases' le falta el valor 'projectUrl'. omitiendo ..." - #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "A uno de los elementos de configuración de 'github_releases' le falta el valor 'packageNames'. omitiendo ..." +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "A uno de los elementos de configuración 'github_releases' le falta el valor 'projectUrl'. omitiendo ..." + #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "A uno de los elementos de configuración 'github_releases' le falta el valor 'token'. Omitiendo ..." @@ -1395,6 +1427,11 @@ msgstr "Ruta al depósito de claves para la clave de firma de repositorio" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Mostrar la variable secreta en el terminal para copiar/pegar fácilmente" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1515,6 +1552,11 @@ msgstr "Cambiar el tamaño de todos los iconos que exceden el tamaño máximo de msgid "Restrict output to warnings and errors" msgstr "Restringir los resultados a advertencias y errores" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Reescribir todos los archivos de metadatos" @@ -1580,6 +1622,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "El escáner encontró {} problema" msgstr[1] "El escáner encontró {} problemas" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Escaneo del APK con dexdump para clases no gratuitas conocidas." @@ -2034,6 +2080,11 @@ msgstr "Verificar la integridad de los paquetes descargados" msgid "Verifying index signature:" msgstr "Verificar el índice de la firma:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2043,6 +2094,10 @@ msgstr "La clave de API de VirusTotal no puede subir archivos mayores de 32MB. U msgid "Warn about possible metadata errors" msgstr "Alertar sobre posibles errores de metadatos" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Cuando está configurado para índices firmados, crear solo índices sin signo en esta etapa" @@ -2055,6 +2110,14 @@ msgstr "Cuando se limpia el repositorio completo yamllint está deshabilitado po msgid "When signing or verifying fails, exit with an error code." msgstr "Cuando falla la firma o la verificación, sale con un código de error." +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Nombre Distintivo' (DN) usado al generar claves" @@ -2067,6 +2130,11 @@ msgstr "Puede usar ANDROID_HOME para definir la ruta a su SDK, p.ej.:" msgid "ZIP file archive" msgstr "Archivo de ficheros ZIP" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2631,6 +2699,10 @@ msgstr "el archivo binario de referencia ha proporcionado autorización al firma msgid "the following arguments are required: %s" msgstr "se requieren los siguientes argumentos: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2672,6 +2744,10 @@ msgstr "usando Apache libcloud para sincronizar con {url}" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com está limitando el consumo, esperando para reintentar..." +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2785,6 +2861,11 @@ msgstr "¡{path} tiene una firma de fichero \"{pattern}\" mala, posible exploit msgid "{path} has been flagged by virustotal {count} times:" msgstr "{path} ha sido marcado por virustotal {count} veces:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index 0807d0b9..af0caf5d 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2021-04-10 21:26+0000\n" "Last-Translator: Germe the fur star \n" "Language-Team: Spanish (Argentina) \n" @@ -200,6 +200,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -330,6 +334,14 @@ msgstr "Archivando {apkfilename} con una firma invalida!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -422,6 +434,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Limpiar actualización - no utiliza cachés, reprocesa todos los APK's" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Lista de categorías separadas por coma." @@ -435,6 +451,10 @@ msgstr "No se reconoce el comando \"%s\".\n" msgid "Commit changes" msgstr "Cometer cambios" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -622,6 +642,10 @@ msgstr "No refrescar el repositorio, útil cuando se esta probando la construcci msgid "Don't use rsync checksums" msgstr "No usar sumas de validación de rsync" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -726,6 +750,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1186,6 +1214,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1301,11 +1333,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1391,6 +1423,11 @@ msgstr "Ruta al almacén de claves para la llave de firmado del repositorio" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1512,6 +1549,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "Restringir la salida solo para advertencias y errores" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Rescribir todos los archivos de metadatos" @@ -1577,6 +1619,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2000,7 +2046,6 @@ msgstr "" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format -#| msgid "using Apache libcloud to sync with {url}" msgid "Using rclone to sync with: {url}" msgstr "usando libcloud de Apache para sincronizar con {url}" @@ -2025,6 +2070,11 @@ msgstr "Verificar la integridad de los paquetes descargados" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2034,6 +2084,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "Advertir sobre posibles errores en los metadatos" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Si está configurado para índices firmados, crear sólo índices sin firma en este punto" @@ -2046,6 +2100,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py #, fuzzy msgid "X.509 'Distinguished Name' used when generating keys" @@ -2059,6 +2121,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2631,6 +2698,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "se requieren los siguientes argumentos: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2672,6 +2743,10 @@ msgstr "usando libcloud de Apache para sincronizar con {url}" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2785,6 +2860,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/es_MX/LC_MESSAGES/fdroidserver.po b/locale/es_MX/LC_MESSAGES/fdroidserver.po index c1b2f6aa..76367cd9 100644 --- a/locale/es_MX/LC_MESSAGES/fdroidserver.po +++ b/locale/es_MX/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2020-04-29 12:49+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Spanish (Mexico) \n" @@ -196,6 +196,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -323,6 +327,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -415,6 +427,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Actualización limpia: no usar cachés, reprocese todos los APK" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Lista de categorías separadas por comas." @@ -428,6 +444,10 @@ msgstr "El comando '%s' no fue reconocido\n" msgid "Commit changes" msgstr "Hacer Cambios" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -615,6 +635,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -719,6 +743,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1177,6 +1205,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1291,11 +1323,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1380,6 +1412,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1500,6 +1537,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "" @@ -1565,6 +1607,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2012,6 +2058,11 @@ msgstr "" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2021,6 +2072,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2033,6 +2088,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2045,6 +2108,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2610,6 +2678,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2651,6 +2723,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2764,6 +2840,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/eu/LC_MESSAGES/fdroidserver.po b/locale/eu/LC_MESSAGES/fdroidserver.po index e7d01629..9ab49eaa 100644 --- a/locale/eu/LC_MESSAGES/fdroidserver.po +++ b/locale/eu/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -194,6 +194,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -321,6 +325,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -413,6 +425,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -426,6 +442,10 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -609,6 +629,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -713,6 +737,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1171,6 +1199,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1285,11 +1317,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1374,6 +1406,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1494,6 +1531,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "" @@ -1559,6 +1601,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2006,6 +2052,11 @@ msgstr "" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2015,6 +2066,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2027,6 +2082,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2039,6 +2102,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2603,6 +2671,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2644,6 +2716,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2757,6 +2833,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index 4b6467d1..18048032 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-07-23 04:12+0000\n" "Last-Translator: Danial Behzadi \n" "Language-Team: Persian \n" @@ -198,6 +198,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -325,6 +329,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -417,6 +429,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -430,6 +446,10 @@ msgstr "فرمان «%s» شناسایی نشد.\n" msgid "Commit changes" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -613,6 +633,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -717,6 +741,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1175,6 +1203,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1289,11 +1321,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1378,6 +1410,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1498,6 +1535,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "" @@ -1563,6 +1605,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2010,6 +2056,11 @@ msgstr "" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2019,6 +2070,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2031,6 +2086,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2043,6 +2106,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2607,6 +2675,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2648,6 +2720,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2761,6 +2837,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" @@ -2768,7 +2849,6 @@ msgstr "" #: ../fdroidserver/common.py #, fuzzy, python-brace-format -#| msgid "'sdk_path' not set in config.yml!" msgid "{path} is not a standard config file!" msgstr "'sdk_path' تنظیم نشده است در config.yml!" diff --git a/locale/fdroidserver.pot b/locale/fdroidserver.pot index 4d92f723..f0177970 100644 --- a/locale/fdroidserver.pot +++ b/locale/fdroidserver.pot @@ -5,9 +5,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: fdroidserver 2.3a1-162-gfbb3cc59\n" +"Project-Id-Version: fdroidserver 2.3.0-3-g4ba7b5c9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -196,6 +196,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -323,6 +327,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -415,6 +427,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -428,6 +444,10 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -611,6 +631,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -715,6 +739,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1173,6 +1201,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1287,11 +1319,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1376,6 +1408,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1496,6 +1533,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "" @@ -1561,6 +1603,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2008,6 +2054,11 @@ msgstr "" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2017,6 +2068,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2029,6 +2084,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2041,6 +2104,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2605,6 +2673,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2646,6 +2718,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2759,6 +2835,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index af922025..d24e023d 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2021-08-23 01:29+0000\n" "Last-Translator: Kaantaja \n" "Language-Team: Finnish \n" @@ -196,6 +196,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -323,6 +327,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -415,6 +427,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -428,6 +444,10 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -611,6 +631,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -715,6 +739,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1173,6 +1201,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1287,11 +1319,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1376,6 +1408,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1496,6 +1533,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "" @@ -1561,6 +1603,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2008,6 +2054,11 @@ msgstr "" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2017,6 +2068,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2029,6 +2084,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2041,6 +2104,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2605,6 +2673,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2646,6 +2718,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2759,6 +2835,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index a45c22b6..d22b1fa5 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -41,7 +41,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-11-19 13:04+0000\n" "Last-Translator: Phantomwise \n" "Language-Team: French \n" @@ -235,6 +235,10 @@ msgstr "'{value}' n'est pas un(e) {field} valide dans {appid}. Motif regex : {pa msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' n'est pas un(e) {field} valide et devrait être {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -363,6 +367,14 @@ msgstr "Archivage de {apkfilename} avec une signature invalide !" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode avec UpdateCheckMode : HTTP doit avoir un modèle." +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -455,6 +467,10 @@ msgstr "Vérification de l'archivage pour {appid} — apks : {integer}, keepvers msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Mise à jour propre — n'utilise pas les caches, traite à nouveau tous les APKs" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Liste de catégories séparées par des virgules." @@ -468,6 +484,10 @@ msgstr "La commande '%s' n'est pas reconnue.\n" msgid "Commit changes" msgstr "Sauvegarder les changements (commit)" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -651,6 +671,10 @@ msgstr "Ne pas rafraîchir le dépôt, utile pour tester un build sans connexion msgid "Don't use rsync checksums" msgstr "Ne pas utiliser les sommes de contrôle rsync" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Télécharger une image complète des petits dépôts" @@ -759,6 +783,10 @@ msgstr "Extraire les métadonnées de l'application depuis un dépôt source" msgid "Extract signatures from APKs" msgstr "Extraction des signatures à partir des APKs" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1219,6 +1247,10 @@ msgstr "Aucun SDK Android trouvée !" msgid "No attached devices found" msgstr "Aucun périphérique connecté trouvé" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Aucune empreinte dans l'URL." @@ -1334,11 +1366,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Machine hors-ligne, la génération du miroir git est sautée jusqu'à `fdroid deploy`" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1423,6 +1455,11 @@ msgstr "Chemin vers le keystore pour la clé de signature du dépôt" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Afficher la variable secrète dans le terminal pour un copier/coller facilité" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1544,6 +1581,11 @@ msgstr "Redimensionner toutes les icônes excédant la taille maximale en pixels msgid "Restrict output to warnings and errors" msgstr "Limiter la sortie aux avertissements et aux erreurs" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Réécrire toutes les métadonnées" @@ -1609,6 +1651,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "Le scanneur a trouvé {} problème" msgstr[1] "Le scanneur a trouvé {} problèmes" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Analyse de l’APK avec dexdump pour les classes non libres connues." @@ -2070,6 +2116,11 @@ msgstr "Vérifier l'intégrité des paquets téléchargés" msgid "Verifying index signature:" msgstr "Vérification de la signature d'index :" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2079,6 +2130,10 @@ msgstr "L’API de VirusTotal ne permet pas d’envoyer des fichiers plus grands msgid "Warn about possible metadata errors" msgstr "Avertir de possibles erreurs dans les métadonnées" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Lorsqu'il est configuré pour les index signés, ne créez que des index non signés à ce stade" @@ -2091,6 +2146,14 @@ msgstr "Lors du linting, tout le dépôt yamllint est désactivé par défaut. C msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Nom distingué' utilisé lors de la génération des clés" @@ -2103,6 +2166,11 @@ msgstr "Vous pouvez utiliser ANDROID_HOME pour définir le chemin de votre SDK, msgid "ZIP file archive" msgstr "Archive ZIP" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2668,6 +2736,10 @@ msgstr "le fichier binaire de référence fourni a autorisé le signataire {sign msgid "the following arguments are required: %s" msgstr "les arguments suivants sont requis %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2709,6 +2781,10 @@ msgstr "utilisation de Apache libcloud pour syncronizer avec {url}" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com limite le nombre de requêtes, en attente avant de réessayer..." +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2822,6 +2898,11 @@ msgstr "{path} a une mauvaise signature de fichier \"{pattern}\", possibilité d msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/fy/LC_MESSAGES/fdroidserver.po b/locale/fy/LC_MESSAGES/fdroidserver.po index 9ef4f3ff..95450665 100644 --- a/locale/fy/LC_MESSAGES/fdroidserver.po +++ b/locale/fy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2021-07-01 15:29+0000\n" "Last-Translator: Vancha March \n" "Language-Team: Frisian \n" @@ -195,6 +195,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -322,6 +326,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -414,6 +426,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -427,6 +443,10 @@ msgstr "Kommando '%s' net werkend.\n" msgid "Commit changes" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -610,6 +630,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -714,6 +738,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1172,6 +1200,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1286,11 +1318,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1375,6 +1407,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1495,6 +1532,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "" @@ -1560,6 +1602,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2007,6 +2053,11 @@ msgstr "" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2016,6 +2067,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2028,6 +2083,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2040,6 +2103,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2605,6 +2673,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2646,6 +2718,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2759,6 +2835,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/ga/LC_MESSAGES/fdroidserver.po b/locale/ga/LC_MESSAGES/fdroidserver.po index e49da48a..9b9b7f57 100644 --- a/locale/ga/LC_MESSAGES/fdroidserver.po +++ b/locale/ga/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1-162-gfbb3cc59\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-09-13 23:36+0000\n" "Last-Translator: Aindriú Mac Giolla Eoin \n" "Language-Team: Irish \n" @@ -202,6 +202,10 @@ msgstr "Ní '{value}' bailí {field} in {appid}. Patrún Regex: {pattern}" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "Ní '{field} bailí é '{value}', ba chóir go mbeadh {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -329,6 +333,14 @@ msgstr "Cartlannú {apkfilename} le síniú neamhbhailí!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode le UpdateCheckMode: Caithfidh patrún a bheith ag HTTP." +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -424,6 +436,10 @@ msgstr "Ag seiceáil cartlannú le haghaidh {appid} - apks:{integer}, keepversio msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Nuashonrú glan - ná húsáid taisce, athphróiseáil gach APKs" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Camóga scartha liosta de chatagóirí." @@ -437,6 +453,10 @@ msgstr "Níor aithníodh ordú '%s'.\n" msgid "Commit changes" msgstr "Cuir athruithe i bhfeidhm" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -620,6 +640,10 @@ msgstr "Ná athnuaigh an stór, úsáideach agus tú ag tástáil tógála gan a msgid "Don't use rsync checksums" msgstr "Ná húsáid seiceálacha rsync" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Íoslódáil scátháin iomlána de repos beag" @@ -728,6 +752,10 @@ msgstr "Bain meiteashonraí feidhmchláir as stór foinseach" msgid "Extract signatures from APKs" msgstr "Sleachta sínithe ó APKs" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1186,6 +1214,10 @@ msgstr "Níor aimsíodh SDK Android!" msgid "No attached devices found" msgstr "Níor aimsíodh aon ghléas ceangailte" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Gan méarlorg in URL." @@ -1299,14 +1331,14 @@ msgstr "Ní mheaitseálann ainm pacáiste OBB APK tacaithe:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Meaisín as líne, gan bacadh le giniúint scáthán git go dtí 'imscaradh fdroid'" -#: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "Tá luach 'projectUrl' in easnamh ar cheann de na míreanna cumraíochta 'github_releases'. gan bacadh ..." - #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "Tá luach 'packageNames' in easnamh ar cheann de na míreanna cumraíochta 'github_releases'. gan bacadh ..." +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "Tá luach 'projectUrl' in easnamh ar cheann de na míreanna cumraíochta 'github_releases'. gan bacadh ..." + #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "Tá an luach 'comhartha' in easnamh ar cheann de na míreanna cumraíochta 'github_releases'. gan bacadh ..." @@ -1389,6 +1421,11 @@ msgstr "Conair chuig an siopa eochrach don eochair sínithe repo" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Priontáil an athróg rúnda chuig an teirminéal le haghaidh cóip / greamaigh éasca" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1509,6 +1546,11 @@ msgstr "Athraigh méid na ndeilbhíní go léir a sháraíonn an t-uasmhéid pic msgid "Restrict output to warnings and errors" msgstr "Cuir srian le haschur le rabhaidh agus earráidí" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Athscríobh na comhaid mheiteashonraí go léir" @@ -1577,6 +1619,10 @@ msgstr[2] "Fuair an scanóir {} fadhbanna" msgstr[3] "Fuair an scanóir {} fadhbanna" msgstr[4] "Fuair an scanóir {} fadhbanna" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Scanadh APK le dexdump do ranganna neamh-saor in aisce ar a dtugtar." @@ -2031,6 +2077,11 @@ msgstr "Fíoraigh sláine na bpacáistí íoslódáilte" msgid "Verifying index signature:" msgstr "Síniú an innéacs á fhíorú:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2040,6 +2091,10 @@ msgstr "Ní féidir le heochair API VirusTotal comhaid níos mó ná 32MB a uasl msgid "Warn about possible metadata errors" msgstr "Tabhair rabhadh faoi earráidí meiteashonraí a d'fhéadfadh a bheith ann" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Nuair atá sé cumraithe le haghaidh innéacsanna sínithe, ná cruthaigh ach innéacsanna gan síniú ag an gcéim seo" @@ -2052,6 +2107,14 @@ msgstr "Nuair a linting an yamllint stór ar fad faoi mhíchumas de réir réamh msgid "When signing or verifying fails, exit with an error code." msgstr "Nuair a theipeann ar shíniú nó ar fhíorú, scoir le cód earráide." +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Ainm Oirirce' a úsáidtear agus eochracha á nginiúint" @@ -2064,6 +2127,11 @@ msgstr "Is féidir leat ANDROID_HOME a úsáid chun an cosán a shocrú chuig do msgid "ZIP file archive" msgstr "Cartlann comhad ZIP" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2634,6 +2702,10 @@ msgstr "tá dénártha tagartha soláthraithe ceadaithe signer {signer}" msgid "the following arguments are required: %s" msgstr "Tá na hargóintí seo a leanas ag teastáil: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2675,6 +2747,10 @@ msgstr "ag baint úsáide as Apache libcloud chun sioncronú le {url}" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "Tá virustotal.com ag teorannú ráta, ag fanacht le triail a bhaint as ..." +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2791,6 +2867,11 @@ msgstr "{path} Tá síniú comhad dona \"{pattern}\", is féidir Janus leas a bh msgid "{path} has been flagged by virustotal {count} times:" msgstr "{path} curtha faoi bhratach ag virustotal {count} times:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/he/LC_MESSAGES/fdroidserver.po b/locale/he/LC_MESSAGES/fdroidserver.po index 3b2eada3..46e2ffac 100644 --- a/locale/he/LC_MESSAGES/fdroidserver.po +++ b/locale/he/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-08-18 06:27+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" @@ -196,6 +196,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -323,6 +327,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -415,6 +427,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -428,6 +444,10 @@ msgstr "הפקודה ‚%s’ אינה מוכרת.\n" msgid "Commit changes" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -611,6 +631,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -715,6 +739,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1173,6 +1201,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1287,11 +1319,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1376,6 +1408,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1496,6 +1533,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "לשכתב את כל קובצי נתוני העל" @@ -1561,6 +1603,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2008,6 +2054,11 @@ msgstr "" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2017,6 +2068,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2029,6 +2084,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2041,6 +2104,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2605,6 +2673,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2646,6 +2718,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2759,6 +2835,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/hi/LC_MESSAGES/fdroidserver.po b/locale/hi/LC_MESSAGES/fdroidserver.po index 9f1aed1a..480cf456 100644 --- a/locale/hi/LC_MESSAGES/fdroidserver.po +++ b/locale/hi/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2023-02-22 11:24+0000\n" "Last-Translator: Saurmandal \n" "Language-Team: Hindi \n" @@ -196,6 +196,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -323,6 +327,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -415,6 +427,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -428,6 +444,10 @@ msgstr "कमांड '%s' पहचाना नहीं।\n" msgid "Commit changes" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -611,6 +631,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -715,6 +739,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1173,6 +1201,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1287,11 +1319,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1376,6 +1408,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1496,6 +1533,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "" @@ -1561,6 +1603,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2008,6 +2054,11 @@ msgstr "" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2017,6 +2068,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2029,6 +2084,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2041,6 +2104,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2606,6 +2674,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2647,6 +2719,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2760,6 +2836,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index 10574fc7..cee6d503 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Hungarian \n" @@ -201,6 +201,10 @@ msgstr "A(z) „{value}” nem érvényes {field} érték itt: {appid}. Regex mi msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "A(z) „{value}” nem érvényes {field} érték itt: minta: {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -328,6 +332,14 @@ msgstr "Az érvénytelen aláírású {apkfilename} archiválása!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -420,6 +432,10 @@ msgstr "Archiválás ellenőrzése ennél: {appid} – apks:{integer}, keepversi msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Tiszta frissítés – nem használ gyorsítótárat, minden APK-k újra feldolgoz" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Kategóriák vesszőkkel elválasztott listája." @@ -433,6 +449,10 @@ msgstr "A(z) „%s” nem ismerhető fel.\n" msgid "Commit changes" msgstr "Változások véglegesítése" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -617,6 +637,10 @@ msgstr "Ne frissítse a tárolót, hasznos ha internetkapcsolat nélkül tesztel msgid "Don't use rsync checksums" msgstr "Ne használja az rsync ellenőrzőösszegeit" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Kis tárolók teljes tükrének letöltése" @@ -725,6 +749,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "Aláírások kinyerése az APK-kból" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1188,6 +1216,10 @@ msgstr "Nem található Android SDK!" msgid "No attached devices found" msgstr "Nem található csatolt eszköz" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Nincs ujjlenyomat az URL-ben." @@ -1304,11 +1336,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Offline gép, git tükör előállításának kihagyása az „fdroid deploy” kiadásáig" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1393,6 +1425,11 @@ msgstr "A tároló aláírókulcsához használt kulcstároló elérési útja" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "A titkos változó kiírása a terminálba a könnyű másolás és beillesztés érdekében" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1514,6 +1551,11 @@ msgstr "A legnagyobb képpontméretet meghaladó összes ikon átméretezése, msgid "Restrict output to warnings and errors" msgstr "A kimenet figyelmeztetésekre és hibákra korlátozása" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Összes metaadatfájl újraírása" @@ -1579,6 +1621,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "Az átvizsgáló {count} problémát talált" msgstr[1] "Az átvizsgáló {count} problémát talált" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py #, fuzzy msgid "Scanning APK with dexdump for known non-free classes." @@ -2030,6 +2076,11 @@ msgstr "Ellenőrizze a letöltött csomagok érintetlenségét" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2039,6 +2090,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "Figyelmeztetés a lehetséges metaadat-hibákról" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2051,6 +2106,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2063,6 +2126,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2629,6 +2697,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "a következő argumentumok szükségesek: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2670,6 +2742,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2783,6 +2859,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index a803055b..80804049 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-10-04 04:26+0000\n" "Last-Translator: Doctorredits_here \n" "Language-Team: Indonesian \n" @@ -201,6 +201,10 @@ msgstr "'{value}' tidak valid pada {field} dalam {appid}. Pakem regex: {pattern} msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' bukan {field} yang valid, seharusnya {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -328,6 +332,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -419,6 +431,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -432,6 +448,10 @@ msgstr "Perintah '%s' tidak dikenal.\n" msgid "Commit changes" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -615,6 +635,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -719,6 +743,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1177,6 +1205,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1291,11 +1323,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1380,6 +1412,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1500,6 +1537,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Tulis ulang semua berkas metadata" @@ -1564,6 +1606,10 @@ msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2011,6 +2057,11 @@ msgstr "Verifikasi integritas paket yang didownload" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2020,6 +2071,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "Peringatkan mengenai kemungkinan error pada metadata" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2032,6 +2087,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2044,6 +2107,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2607,6 +2675,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "argumen berikut ini diperlukan: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2648,6 +2720,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2760,6 +2836,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 7cd18bd2..89df8baa 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-09-10 09:27+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Italian \n" @@ -215,6 +215,10 @@ msgstr "\"{value}\" non è un {field} valido in {appid}. Espressione regolare: { msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "\"{value}\" non è un {field} valido, dovrebbe essere {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -343,6 +347,14 @@ msgstr "Archiviando {apkfilename} con una firma invalida!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode con UpdateCheckMode: HTTP deve avere uno schema." +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -435,6 +447,10 @@ msgstr "Controllo dell'archiviazione per {appid} - apks:{integer}, keepversions: msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Aggiornamento pulito - non usa cache, riprocessa tutti gli APK" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Lista di categorie separate da una virgola." @@ -448,6 +464,10 @@ msgstr "Comando \"%s\" non riconosciuto.\n" msgid "Commit changes" msgstr "Cambiamenti del commit" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -631,6 +651,10 @@ msgstr "Non aggiornare il repository, utile per testare una build offline" msgid "Don't use rsync checksums" msgstr "Non usare checksum rsync" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Scarica mirror completi di piccoli repository" @@ -739,6 +763,10 @@ msgstr "Estrarre i metadati dell'applicazione da una repository di origine" msgid "Extract signatures from APKs" msgstr "Estrai le firme dagli APK" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1198,6 +1226,10 @@ msgstr "Android SDK non trovato!" msgid "No attached devices found" msgstr "Nessun dispositivo collegato trovato" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Nessuna impronta digitale nell'URL." @@ -1312,11 +1344,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Macchina offline, saltando la generazione del mirror git fino a quando `fdroid deploy`" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1401,6 +1433,11 @@ msgstr "Percorso del keystore per la chiave di firma del repository" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Stampa la variabile segreta sul terminale per un facile copia/incolla" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1522,6 +1559,11 @@ msgstr "Ridimensiona tutte le icone che superano la dimensione massima dei pixel msgid "Restrict output to warnings and errors" msgstr "Limita l'output ad avvisi ed errori" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Riscrivi tutti i file di metadati" @@ -1587,6 +1629,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "Scanner trovato {} problema" msgstr[1] "Scanner trovato {} problemi" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Scansiona gli APK con apkanalyzer per le classi note non libere." @@ -2046,6 +2092,11 @@ msgstr "Verifica l'integrità dei pacchetti scaricati" msgid "Verifying index signature:" msgstr "Verifica della firma dell'indice:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2055,6 +2106,10 @@ msgstr "La chiave API di VirusTotal non può caricare file più grandi di 32MB, msgid "Warn about possible metadata errors" msgstr "Avvisa riguardo possibili errori nei metadati" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Se configurato per indici firmati, crea solo indici senza segno in questa fase" @@ -2067,6 +2122,14 @@ msgstr "Quando linting l'intero repository yamllint è disabilitato per impostaz msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distinguished Name' usato quando si generano le chiavi" @@ -2079,6 +2142,11 @@ msgstr "Potete usare ANDROID_HOME per impostare il percorso del vostro SDK, cio msgid "ZIP file archive" msgstr "Archivio di file ZIP" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2644,6 +2712,10 @@ msgstr "il binario di riferimento fornito ha il firmatario autorizzato {signer}" msgid "the following arguments are required: %s" msgstr "i seguenti argomenti sono obbligatori: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2685,6 +2757,10 @@ msgstr "utilizzando Apache libcloud per sincronizzare con {url}" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com sta limitando il tasso, in attesa di riprovare..." +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2798,6 +2874,11 @@ msgstr "{path} ha una cattiva firma di file \"{pattern}\", possibile exploit di msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 333bd8ee..1d420e33 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-09-26 13:16+0000\n" "Last-Translator: Suguru Hirahara \n" "Language-Team: Japanese \n" @@ -199,6 +199,10 @@ msgstr "「{value}」は {appid}の正しい{field}ではありません。正 msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "「{value}」は正しい{field}ではありません。{pattern}としてください" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -326,6 +330,14 @@ msgstr "{apkfilename}のアーカイブの署名が正しくありません!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "UpdateCheckModeが有効になっているAutoUpdateMode:HTTPにパターンを設定してください。" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -417,6 +429,10 @@ msgstr "{appid}のアーカイブをチェックしています - apks:{integer} msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "クリーンアップデート - キャッシュを使用せず、全てのAPKの再処理を行います" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "コンマで区切られたカテゴリーの一覧。" @@ -430,6 +446,10 @@ msgstr "コマンド '%s' は認識されません。\n" msgid "Commit changes" msgstr "変更をcommit" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -613,6 +633,10 @@ msgstr "リポジトリを更新しない。インターネットに接続して msgid "Don't use rsync checksums" msgstr "rsyncのチェックサムを使用しない" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "小さいリポジトリのミラーを完全にダウンロード" @@ -721,6 +745,10 @@ msgstr "ソースリポジトリからアプリケーションのメタデータ msgid "Extract signatures from APKs" msgstr "APKから署名を抽出" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1179,6 +1207,10 @@ msgstr "AndroidのSDKが見つかりません!" msgid "No attached devices found" msgstr "接続している端末が見つかりません" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "URLにフィンガープリントがありません。" @@ -1292,14 +1324,14 @@ msgstr "OBBのパッケージ名はサポートしているAPKと一致しませ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "オフラインのマシンです。`fdroid deploy` を実行するまでgitのミラーの生成はスキップします" -#: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "「github_releases」の設定項目の1つに「projectUrl」の値が設定されていません。スキップします…" - #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "「github_releases」の設定項目の1つに「packageNames」の値が設定されていません。スキップします…" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "「github_releases」の設定項目の1つに「projectUrl」の値が設定されていません。スキップします…" + #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "「github_releases」の設定項目の1つに「token」の値が設定されていません。スキップします…" @@ -1382,6 +1414,11 @@ msgstr "リポジトリの署名鍵のキーストアへのパス" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "簡単にコピー、ペーストできるように秘密の変数をターミナルに出力" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1502,6 +1539,11 @@ msgstr "最大のピクセルの大きさを超えている全てのアイコン msgid "Restrict output to warnings and errors" msgstr "警告とエラーのみを出力" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "メタデータの全てのファイルを書き換える" @@ -1566,6 +1608,10 @@ msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "スキャナーは{}個の問題を発見しました" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "既知の不自由なクラスが無いかどうか、APKをdexdumpでスキャンして確認。" @@ -2020,6 +2066,11 @@ msgstr "ダウンロードしたパッケージの一貫性を検証" msgid "Verifying index signature:" msgstr "インデックスの署名を検証:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2029,6 +2080,10 @@ msgstr "VirusTotalのAPI鍵は32メガバイトより大きいファイルをア msgid "Warn about possible metadata errors" msgstr "潜在的なメタデータのエラーに関して警告" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "署名済のインデックスに関して設定されている場合、この段階では署名されていないインデックスのみを作成します" @@ -2041,6 +2096,14 @@ msgstr "リポジトリ全体をチェックする際、yamllintは既定で無 msgid "When signing or verifying fails, exit with an error code." msgstr "署名または検証ができなかった場合、エラーコードを出力して終了します。" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "鍵の生成時に使用する X.509 'Distinguished Name'" @@ -2053,6 +2116,11 @@ msgstr "以下のようにANDROID_HOMEでSDKへのパスを設定できます。 msgid "ZIP file archive" msgstr "ZIPファイルアーカイブ" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2615,6 +2683,10 @@ msgstr "指定された参照バイナリーには許可された署名者 {sign msgid "the following arguments are required: %s" msgstr "次の引数が必要です:%s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2656,6 +2728,10 @@ msgstr "Apache libcloudを使って{url}と同期" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.comはレート制限を行っています。再試行を待機しています…" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2768,6 +2844,11 @@ msgstr "{path}のファイル署名「{pattern}」は正しくありません。 msgid "{path} has been flagged by virustotal {count} times:" msgstr "{path}はvirustotalにより{count}回マークされました。" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index 4f91c27a..f9ff3f03 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2021-01-15 13:25+0000\n" "Last-Translator: R_SACI \n" "Language-Team: Kabyle \n" @@ -197,6 +197,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -324,6 +328,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -416,6 +428,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Tabdart n taggayin i yebḍan s ticcert." @@ -429,6 +445,10 @@ msgstr "Taladna '%s' ur tettwassen ara.\n" msgid "Commit changes" msgstr "Azen ibeddilen" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -613,6 +633,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -717,6 +741,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "Izmal-nniḍen sɣur APKs" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1177,6 +1205,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1291,11 +1323,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1380,6 +1412,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1500,6 +1537,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "" @@ -1565,6 +1607,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2012,6 +2058,11 @@ msgstr "Senqed timmad n yikemmusen yettwasadren" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2021,6 +2072,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2033,6 +2088,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2045,6 +2108,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2610,6 +2678,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2651,6 +2723,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2764,6 +2840,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index 5ef07d11..254302fb 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-09-06 14:57+0000\n" "Last-Translator: Cxnfl1ct \n" "Language-Team: Korean \n" @@ -200,6 +200,10 @@ msgstr "'{value}'는 {appid}에서 올바른 {field}가 아닙니다. 정규식 msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}'에서 올바른 {field}가 아닙니다. 정규식 패턴: {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -327,6 +331,14 @@ msgstr "올바르지 않은 서명으로 {apkfilename}를 보존 중입니다!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -418,6 +430,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -431,6 +447,10 @@ msgstr "명령 '%s'은 인식되지 않습니다.\n" msgid "Commit changes" msgstr "번경사항 커밋" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -614,6 +634,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -718,6 +742,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1178,6 +1206,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1293,11 +1325,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1382,6 +1414,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1502,6 +1539,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "모든 메타데이터 파일을 다시 씁니다" @@ -1566,6 +1608,10 @@ msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2013,6 +2059,11 @@ msgstr "다운로드된 패키지의 무결성 확인" msgid "Verifying index signature:" msgstr "색인 서명을 검증 중:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2022,6 +2073,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "가능한 메타데이터 오류에 대해 경고합니다" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2034,6 +2089,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2046,6 +2109,11 @@ msgstr "당신은 당신의 SDK에 경로를 설정하기 위해 ANDROID_HOME을 msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2610,6 +2678,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "다음 인수들이 필요합니다: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2651,6 +2723,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2763,6 +2839,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/lv/LC_MESSAGES/fdroidserver.po b/locale/lv/LC_MESSAGES/fdroidserver.po index 2c7bdbe9..333b9865 100644 --- a/locale/lv/LC_MESSAGES/fdroidserver.po +++ b/locale/lv/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-08-14 18:07+0000\n" "Last-Translator: \"Coool (github.com/Coool)\" \n" "Language-Team: Latvian \n" @@ -195,6 +195,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -322,6 +326,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -414,6 +426,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -427,6 +443,10 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -610,6 +630,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -714,6 +738,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1172,6 +1200,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1286,11 +1318,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1375,6 +1407,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1495,6 +1532,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "" @@ -1560,6 +1602,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2007,6 +2053,11 @@ msgstr "" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2016,6 +2067,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2028,6 +2083,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2040,6 +2103,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2604,6 +2672,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2645,6 +2717,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2758,6 +2834,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/ml/LC_MESSAGES/fdroidserver.po b/locale/ml/LC_MESSAGES/fdroidserver.po index 3033eb79..9aa2f620 100644 --- a/locale/ml/LC_MESSAGES/fdroidserver.po +++ b/locale/ml/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2023-06-23 14:52+0000\n" "Last-Translator: abe1242 \n" "Language-Team: Malayalam \n" @@ -200,6 +200,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -327,6 +331,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -419,6 +431,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -432,6 +448,10 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -615,6 +635,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -719,6 +743,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1177,6 +1205,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1291,11 +1323,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1380,6 +1412,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1500,6 +1537,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "" @@ -1565,6 +1607,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2015,6 +2061,11 @@ msgstr "" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2024,6 +2075,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2036,6 +2091,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2048,6 +2111,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2612,6 +2680,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2653,6 +2725,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2766,6 +2842,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index 8cb4f322..c311ac54 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Norwegian Bokmål \n" @@ -204,6 +204,10 @@ msgstr "\"{value}\" er ikke et gyldig {field} i {appid}. Mønster for regulært msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "\"{value}\" er ikke et gyldig {field} i {appid}. Mønster for regulært uttrykk: {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, fuzzy, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -333,6 +337,14 @@ msgstr "Pakker {apkfilename} med ugyldig signatur." msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -427,6 +439,10 @@ msgstr "Sjekker arkivering for {appid} - APK-er:{integer}, keepversions:{keep}, msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Ren oppdatering, ikke bruk hurtiglager, behandle alle APK-er på ny" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Kommainndelt liste over kategorier." @@ -440,6 +456,10 @@ msgstr "Kommandoen \"%s\" gjenkjennes ikke.\n" msgid "Commit changes" msgstr "Send inn endringer" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -632,6 +652,10 @@ msgstr "Ikke gjenoppfrisk pakkebrønnen, nyttig under testing av et bygg uten å msgid "Don't use rsync checksums" msgstr "Ikke bruk rsync-sjekksummer" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Last ned fullstendige speilinger av små pakkebrønner" @@ -744,6 +768,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "Hent ut signaturer fra APK-er" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "Failed copying {path}: {error}" @@ -1222,6 +1250,10 @@ msgstr "Fant ingen Android-SDK." msgid "No attached devices found" msgstr "Fant ingen tilknyttede enheter" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Inget fingeravtrykk i nettadresse." @@ -1343,11 +1375,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Frakoblet maskin. Hopper over Git-avspeilingsgenerering til «fdroid deploy»" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1438,6 +1470,11 @@ msgstr "Sti til nøkkellager for pakkebrønnssigneringsnøkkel" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Skriv den hemmelige variabelen til terminalen for enkel kopiering/innliming." +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1562,6 +1599,11 @@ msgstr "Endre størrelse på alle ikoner som overstiger maksimal pikselantall og msgid "Restrict output to warnings and errors" msgstr "Begrens utdata til advarsler og feil" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Skriv om alle metadatafilene" @@ -1628,6 +1670,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "Skanner fant {} problem" msgstr[1] "Skanner fant {} problemer" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py #, fuzzy msgid "Scanning APK with dexdump for known non-free classes." @@ -2093,6 +2139,11 @@ msgstr "Bekreft integriteten til nedlastede pakker" msgid "Verifying index signature:" msgstr "Bekrefter indekssignatur:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2102,6 +2153,10 @@ msgstr "VirusTotal API-nøkkel kan ikke laste opp filer større enn 32 MB, bruk msgid "Warn about possible metadata errors" msgstr "Advar om mulige metadata-feil" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py #, fuzzy msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2115,6 +2170,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 \"Entydig navn\" (DN) brukt ved generering av nøkler." @@ -2128,6 +2191,11 @@ msgstr "Du kan bruke ANDROID_HOME til å sette stien til din SDK, f.eks:" msgid "ZIP file archive" msgstr "ZIP-filarkiv" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, fuzzy, python-brace-format msgid "adding IdentityFile to {path}" @@ -2714,6 +2782,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "følgende argumenter kreves: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2755,6 +2827,10 @@ msgstr "bruker Apache-libcloud for å synkronisere med {url}" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2868,6 +2944,11 @@ msgstr "{path} har feilaktig filsignatur \"{pattern}\", mulig Janus-utnyttelse." msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index 3fdfed3f..e2ec82f2 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-01-03 09:07+0000\n" "Last-Translator: Issa1553 \n" "Language-Team: Dutch \n" @@ -202,6 +202,10 @@ msgstr "{value}' is geen geldig {field} in {appid}. Regex patroon: {pattern}" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "{value}' is geen geldig {field}, moet {pattern} zijn" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -305,7 +309,6 @@ msgstr "App heeft GeenBronSinds of Archiefbeleid \"0 versies\" maar AutoUpdateMo #: ../fdroidserver/lint.py #, fuzzy -#| msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "App heeft GeenBronSinds of Archiefbeleid \"0 versies\" maar AutoUpdateModus of UpdateCheckModus zijn niet Geen" @@ -331,6 +334,14 @@ msgstr "Archivering {apkfilename} met ongeldige handtekening!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateModus met UpdateCheckModus: HTTP moet een patroon hebben." +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -423,6 +434,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -436,6 +451,10 @@ msgstr "Opdracht '%s' wordt niet herkend.\n" msgid "Commit changes" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -619,6 +638,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -723,6 +746,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1181,6 +1208,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1295,11 +1326,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1384,6 +1415,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1504,6 +1540,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Herschrijf alle metadatabestanden" @@ -1569,6 +1610,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2016,6 +2061,11 @@ msgstr "De integriteit van gedownloade pakketten controleren" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2025,6 +2075,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "Waarschuwen voor mogelijke metadata fouten" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2037,6 +2091,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2049,6 +2111,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2614,6 +2681,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "de volgende argumenten zijn vereist: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2655,6 +2726,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2768,6 +2843,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" @@ -2775,7 +2855,6 @@ msgstr "" #: ../fdroidserver/common.py #, fuzzy, python-brace-format -#| msgid "'sdk_path' not set in config.yml!" msgid "{path} is not a standard config file!" msgstr "'sdk_path' niet ingesteld in config.yml!" diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 12fb1bf0..e4f6292a 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-10-27 03:53+0000\n" "Last-Translator: WaldiS \n" "Language-Team: Polish \n" @@ -205,6 +205,10 @@ msgstr "'{value}' nie jest prawidłowy {field} w {appid}. Wzór Regex: {pattern} msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' nie jest prawidłowym {field}, powinno być {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -332,6 +336,14 @@ msgstr "Archiwizacja {apkfilename} z nieprawidłowym podpisem!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode z UpdateCheckMode: HTTP musi mieć wzorzec." +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -425,6 +437,10 @@ msgstr "Sprawdzanie archiwizacji dla {appid} - apks: {integer}, keepversions: {k msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Czysta aktualizacja - nie używa pamięci podręcznych, przetwarzaj ponownie wszystkie pakiety APK" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Rozdzielana przecinkami lista kategorii." @@ -438,6 +454,10 @@ msgstr "Polecenie '%s' nie rozpoznane.\n" msgid "Commit changes" msgstr "Scommituj zmiany" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -621,6 +641,10 @@ msgstr "Nie odświeżaj repozytorium, przydatne podczas testowania kompilacji be msgid "Don't use rsync checksums" msgstr "Nie używaj sum kontrolnych rsync" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Pobierz pełne mirrors małych repozytoriów" @@ -729,6 +753,10 @@ msgstr "Wyodrębnij metadane aplikacji z repozytorium źródłowego" msgid "Extract signatures from APKs" msgstr "Wyciągnij podpisy z plików APK" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1188,6 +1216,10 @@ msgstr "Nie znaleziono pakietu SDK Androida!" msgid "No attached devices found" msgstr "Nie znaleziono podłączonych urządzeń" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Brak odcisku palca w adresie URL." @@ -1301,14 +1333,14 @@ msgstr "Nazwa pakietu OBB nie jest zgodna z obsługiwanym pakietem APK:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Maszyna Offline, pomijając generowanie git mirror aż do ' fdroid deploy`" -#: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "Jeden z elementów 'github_releases' nie posiada wartości 'projectUrl'. pomijanie..." - #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "Jeden z elementów 'github_releases' nie posiada wartości 'packageNames'. pomijanie..." +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "Jeden z elementów 'github_releases' nie posiada wartości 'projectUrl'. pomijanie..." + #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "Jeden z elementów 'github_releases' nie posiada wartości 'token'. pomijanie..." @@ -1391,6 +1423,11 @@ msgstr "Ścieżka do magazynu kluczy dla klucza podpisywania repo" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Wydrukuj tajną zmienną do terminala, aby ułatwić kopiowanie/wklejanie" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1511,6 +1548,11 @@ msgstr "Zmień rozmiar wszystkich ikon przekraczających maksymalny rozmiar piks msgid "Restrict output to warnings and errors" msgstr "Ogranicz wyjście do ostrzeżeń i błędów" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Przepisz wszystkie pliki metadanych" @@ -1577,6 +1619,10 @@ msgstr[0] "Skaner znalazł {} problem" msgstr[1] "Skaner znalazł {} problemów" msgstr[2] "Skaner znalazł {} problemy" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Skanowanie pakietu APK za pomocą dexdump w poszukiwaniu znanych niewolnych klas." @@ -2032,6 +2078,11 @@ msgstr "Sprawdź integralność pobranych pakietów" msgid "Verifying index signature:" msgstr "Weryfikowanie podpisu indeksu:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2041,6 +2092,10 @@ msgstr "Klucz VirusTotal API nie może przesyłać plików większych niż 32 MB msgid "Warn about possible metadata errors" msgstr "Ostrzegaj o możliwych błędach metadanych" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Po skonfigurowaniu dla indeksów podpisanych utwórz na tym etapie tylko niepodpisane indeksy" @@ -2053,6 +2108,14 @@ msgstr "Podczas linkowania całego repozytorium yamllint jest domyślnie wyłąc msgid "When signing or verifying fails, exit with an error code." msgstr "Jeśli podpisanie lub weryfikacja nie powiedzie się, zakończ z kodem błędu." +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distinguished Name' używana podczas generowania kluczy" @@ -2065,6 +2128,11 @@ msgstr "Możesz użyć ANDROID_HOME, aby ustawić ścieżkę do SDK, tj .:" msgid "ZIP file archive" msgstr "Plik archiwum ZIP" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2631,6 +2699,10 @@ msgstr "dostarczony referencyjny plik binarny umożliwił podpis {signer}" msgid "the following arguments are required: %s" msgstr "wymagane są następujące argumenty: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2672,6 +2744,10 @@ msgstr "używając Apache libcloud do zsynchronizowania z {url}" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com jest ograniczenie stawki, czeka na ponowną próbę..." +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2786,6 +2862,11 @@ msgstr "{path} ma zły podpis pliku \"{pattern}\", możliwe wykorzystanie Janusa msgid "{path} has been flagged by virustotal {count} times:" msgstr "{path} została oznaczona przez virustotal {count} razy:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 1e4dfe3a..c73220d6 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-10-07 18:58+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" @@ -202,6 +202,10 @@ msgstr "'{value}' não é um {field} válido em {appid}. Modelo regex: {pattern} msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' não é um {field} válido, deve ser {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -329,6 +333,14 @@ msgstr "Arquivamento {apkfilename} com assinatura inválida!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode com UpdateCheckMode: HTTP deve ter um modelo." +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -421,6 +433,10 @@ msgstr "Verificando o arquivamento para {appid} - apks:{integer}, keepversions:{ msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Atualização limpa - não usa cache, reprocessa todos os APKs" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Lista de categorias separadas por vírgula." @@ -434,6 +450,10 @@ msgstr "Comando '%s' não reconhecido.\n" msgid "Commit changes" msgstr "Enviar mudanças" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -617,6 +637,10 @@ msgstr "Não atualizar o repositório; útil quando testando uma compilação se msgid "Don't use rsync checksums" msgstr "Não usar as somas de verificação (checksums) do rsync" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Descarregar espelhos completos de repos pequenos" @@ -725,6 +749,10 @@ msgstr "Extrair metadados de aplicações de um repositório de origem" msgid "Extract signatures from APKs" msgstr "Extrato de assinaturas de APKs" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1183,6 +1211,10 @@ msgstr "Android SDK não encontrado!" msgid "No attached devices found" msgstr "Nenhum aparelho anexado encontrado" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Nenhuma impressão digital no URL." @@ -1296,14 +1328,14 @@ msgstr "O packagename do OBB não corresponde a um APK suportado:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "A máquina está offline, a saltar a geração de espelhos de git até o `fdroid deploy'" -#: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "Um dos elementos de configuração 'github_releases' está faltando o valor 'projectUrl'. ignorando ..." - #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "Um dos elementos de configuração 'github_releases' está faltando o valor 'packageNames'. ignorando ..." +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "Um dos elementos de configuração 'github_releases' está faltando o valor 'projectUrl'. ignorando ..." + #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "Um dos elementos de configuração 'github_releases' está faltando o valor 'token'. ignorando ..." @@ -1386,6 +1418,11 @@ msgstr "Caminho até a keystore para a chave de assinatura do repositório" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Imprimir a variável secreta para o terminal para copiar/colar fácilmente" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1506,6 +1543,11 @@ msgstr "Redimensionar todos os ícones que excedam o tamanho máximo de pixels e msgid "Restrict output to warnings and errors" msgstr "Restringir a saída a erros e avisos" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Regravar todos os ficheiros de metadados" @@ -1571,6 +1613,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "Scanner encontrou {} problema" msgstr[1] "Scanner encontrou {} problemas" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "A verificar o APK com dexdump por classes não-livres conhecidas." @@ -2025,6 +2071,11 @@ msgstr "Verifique a integridade dos pacotes descarregados" msgid "Verifying index signature:" msgstr "Verificar o índice de assinatura:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2034,6 +2085,10 @@ msgstr "A chave VirusTotal API não pode enviar ficheiros maiores que 32MB, use msgid "Warn about possible metadata errors" msgstr "Avisar sobre possíveis erros de metadados" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Quando configurado para índices assinados, crie apenas índices não assinados nesta etapa" @@ -2046,6 +2101,14 @@ msgstr "Ao cotar todo o repositório o yamllint é desativado por predefinição msgid "When signing or verifying fails, exit with an error code." msgstr "Se assinar ou verificar falhar, sair com um código de erro." +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distiguished Name' usado na geração de chaves" @@ -2058,6 +2121,11 @@ msgstr "Pode usar ANDROID_HOME para definir o caminho para o seu SDK, ou seja:" msgid "ZIP file archive" msgstr "Arquivo de ficheiros ZIP" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2622,6 +2690,10 @@ msgstr "o binário de referência fornecido tem o assinante permitido {signer}" msgid "the following arguments are required: %s" msgstr "os seguintes argumentos são necessários: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2663,6 +2735,10 @@ msgstr "usando o Apache libcloud para sincronizar com {url}" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "o virustotal.com está a limitar a taxa, à espera para voltar a tentar..." +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2776,6 +2852,11 @@ msgstr "{path} tem uma má assinatura de ficheiro \"{pattern}\", um exploração msgid "{path} has been flagged by virustotal {count} times:" msgstr "{path} foi marcado por virustotal {count} vezes:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 8b5bdefc..6dadacc0 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -16,7 +16,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-09-10 13:17+0000\n" "Last-Translator: Jose Delvani \n" "Language-Team: Portuguese (Brazil) \n" @@ -210,6 +210,10 @@ msgstr "'{value}' não é um{field} válido em {appid}. Regex padrão: {pattern} msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' não é um {field} válido, deveria ser {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -337,6 +341,14 @@ msgstr "Arquivamento {apkfilename} com assinatura inválida!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode com atualização CheckMode: HTTP deve ter um padrão." +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -429,6 +441,10 @@ msgstr "Verificar o arquivamento de {appid} - apks:{integer}, keepversions:{keep msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Atualização limpa - não utiliza o cache, reprocessa todos os APKs" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Lista de categorias separadas por vírgula." @@ -442,6 +458,10 @@ msgstr "Comando \"%s\" não reconhecido.\n" msgid "Commit changes" msgstr "Enviar mudanças" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -625,6 +645,10 @@ msgstr "Não atualizar o repositório; útil quando testando uma compilação se msgid "Don't use rsync checksums" msgstr "Não usar as somas de verificação (checksums) do rsync" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Faça o download de espelhos completos de pequenos repositórios" @@ -733,6 +757,10 @@ msgstr "Extrair metadados de aplicativos de um repositório de origem" msgid "Extract signatures from APKs" msgstr "Extrair assinaturas de APKs" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1191,6 +1219,10 @@ msgstr "Nenhum 'Android SDK' foi encontrado!" msgid "No attached devices found" msgstr "Nenhum dispositivo conectado encontrado" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Nenhuma impressão digital (fingerprint) no URL." @@ -1304,14 +1336,14 @@ msgstr "O nome do pacote do OBB não corresponde a um APK suportado:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "A máquina está desconectada, pulando geração de espelhos de git até o `fdroid deploy'" -#: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "Um dos itens de configuração 'github_releases' está faltando o valor 'projectUrl'. ignorando ..." - #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "Um dos itens de configuração 'github_releases' está faltando o valor 'packageNames'. ignorando ..." +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "Um dos itens de configuração 'github_releases' está faltando o valor 'projectUrl'. ignorando ..." + #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "Um dos itens de configuração 'github_releases' está faltando o valor 'token'. ignorando ..." @@ -1394,6 +1426,11 @@ msgstr "Caminho até a keystore para a chave de assinatura do repositório" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Imprima a variável secreta no terminal para facilitar a cópia/colagem" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1514,6 +1551,11 @@ msgstr "Redimensionar todos os ícones que excedam o tamanho máximo de pixels e msgid "Restrict output to warnings and errors" msgstr "Restringir a saída a erros e avisos" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Reescreve todos os arquivos de metadados" @@ -1579,6 +1621,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "O Scanner encontrou {} problema" msgstr[1] "O Scanner encontrou {} problemas" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Verificando o APK com dexdump por classes não-livres conhecidas." @@ -2033,6 +2079,11 @@ msgstr "Verifica a integridade dos pacotes baixados" msgid "Verifying index signature:" msgstr "Verificar o índice de assinatura:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2042,6 +2093,10 @@ msgstr "A chave API do VirusTotal não pode carregar arquivos maiores que 32MB, msgid "Warn about possible metadata errors" msgstr "Avisa sobre possíveis erros de metadados" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Quando configurado para índices assinados, crie apenas índices não assinados nesta etapa" @@ -2054,6 +2109,14 @@ msgstr "Ao cotar todo o repositório, o yamllint é desativado por padrão. Inde msgid "When signing or verifying fails, exit with an error code." msgstr "Ao assinar ou verificar falhar, um código de erro será lançado." +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distiguished Name' usado na geração de chaves" @@ -2066,6 +2129,11 @@ msgstr "Você pode usar ANDROID_HOME para definir o caminho para o seu SDK, ou s msgid "ZIP file archive" msgstr "Arquivo ZIP" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2630,6 +2698,10 @@ msgstr "o binário de referência fornecido autorizou o signatário {signer}" msgid "the following arguments are required: %s" msgstr "os seguintes argumentos são necessários: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2671,6 +2743,10 @@ msgstr "usando o Apache libcloud para sincronizar com {url}" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "o virustotal.com está limitando a taxa, esperando para tentar novamente ..." +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2784,6 +2860,11 @@ msgstr "{path} tem uma má assinatura de arquivo \"{pattern}\", um exploração msgid "{path} has been flagged by virustotal {count} times:" msgstr "{path} foi sinalizado pelo virustotal {count} vezes:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 0eb8ef44..7a8f0e92 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-11-08 17:42+0000\n" "Last-Translator: Hugo Carvalho \n" "Language-Team: Portuguese (Portugal) \n" @@ -205,6 +205,10 @@ msgstr "'{value}' não é um {field} válido em {appid}. Modelo regex: {pattern} msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' não é um {field} válido, deve ser {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -332,6 +336,14 @@ msgstr "Arquivamento {apkfilename} com assinatura inválida!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode com UpdateCheckMode: HTTP deve ter um modelo." +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -424,6 +436,10 @@ msgstr "Verificando o arquivamento para {appid} - apks:{integer}, keepversions:{ msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Atualização limpa - não usa cache, reprocessa todos os APKs" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Lista de categorias separadas por vírgula." @@ -437,6 +453,10 @@ msgstr "Comando '%s' não reconhecido.\n" msgid "Commit changes" msgstr "Enviar mudanças" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -620,6 +640,10 @@ msgstr "Não atualizar o repositório; útil quando testando uma compilação se msgid "Don't use rsync checksums" msgstr "Não usar as somas de verificação (checksums) do rsync" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Descarregar espelhos completos de repos pequenos" @@ -728,6 +752,10 @@ msgstr "Extrair metadados de aplicações de um repositório de origem" msgid "Extract signatures from APKs" msgstr "Extrato de assinaturas de APKs" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1186,6 +1214,10 @@ msgstr "Android SDK não encontrado!" msgid "No attached devices found" msgstr "Nenhum aparelho anexado encontrado" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Nenhuma impressão digital no URL." @@ -1299,14 +1331,14 @@ msgstr "O packagename do OBB não corresponde a um APK suportado:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "A máquina está offline, a saltar a geração de espelhos de git até o `fdroid deploy'" -#: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "Um dos itens de configuração 'github_releases' não tem o valor 'projectUrl'. A ignorar ..." - #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "Um dos itens de configuração 'github_releases' está a faltar o valor 'packageNames'. A ignorar ..." +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "Um dos itens de configuração 'github_releases' não tem o valor 'projectUrl'. A ignorar ..." + #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "Um dos itens de configuração 'github_releases' não tem o valor 'token'. A ignorar ..." @@ -1389,6 +1421,11 @@ msgstr "Caminho até a keystore para a chave de assinatura do repositório" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Imprimir a variável secreta para o terminal para copiar/colar fácilmente" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1509,6 +1546,11 @@ msgstr "Redimensionar todos os ícones que excedam o tamanho máximo de pixels e msgid "Restrict output to warnings and errors" msgstr "Restringir a saída a erros e avisos" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Regravar todos os ficheiros de metadados" @@ -1574,6 +1616,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "Scanner encontrou {} problema" msgstr[1] "Scanner encontrou {} problemas" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "A verificar o APK com dexdump por classes não-livres conhecidas." @@ -2028,6 +2074,11 @@ msgstr "Verifique a integridade dos pacotes descarregados" msgid "Verifying index signature:" msgstr "Verificar o índice de assinatura:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2037,6 +2088,10 @@ msgstr "A chave VirusTotal API não pode enviar ficheiros maiores que 32MB, use msgid "Warn about possible metadata errors" msgstr "Avisar sobre possíveis erros de metadados" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Quando configurado para índices assinados, crie apenas índices não assinados nesta etapa" @@ -2049,6 +2104,14 @@ msgstr "Ao cotar todo o repositório o yamllint é desativado por predefinição msgid "When signing or verifying fails, exit with an error code." msgstr "Se assinar ou verificar falhar, sair com um código de erro." +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distiguished Name' usado na geração de chaves" @@ -2061,6 +2124,11 @@ msgstr "Pode usar ANDROID_HOME para definir o caminho para o seu SDK, ou seja:" msgid "ZIP file archive" msgstr "Arquivo de ficheiros ZIP" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2625,6 +2693,10 @@ msgstr "o binário de referência fornecido tem o assinante permitido {signer}" msgid "the following arguments are required: %s" msgstr "os seguintes argumentos são necessários: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2666,6 +2738,10 @@ msgstr "usando o Apache libcloud para sincronizar com {url}" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "o virustotal.com está a limitar a taxa, à espera para voltar a tentar..." +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2779,6 +2855,11 @@ msgstr "{path} tem uma má assinatura de ficheiro \"{pattern}\", um exploração msgid "{path} has been flagged by virustotal {count} times:" msgstr "{path} foi marcado por virustotal {count} vezes:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index b65aee1e..9bf372eb 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-09-10 09:27+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Romanian \n" @@ -204,6 +204,10 @@ msgstr "'{value}' nu este valid {field} în {appid}. Regex model: {pattern}" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' nu este un {field} valid, ar trebui să fie {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -331,6 +335,14 @@ msgstr "Arhivare {apkfilename} cu semnătură invalidă!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode cu UpdateCheckMode: HTTP trebuie să aivă un format." +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -424,6 +436,10 @@ msgstr "Verificarea arhivării pentru {appid} - apks:{integer}, keepversions:{ke msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Actualizare curată - nu folosește memoria cache, reprocesează toate APK-urile" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Lista de categorii separate prin virgulă." @@ -437,6 +453,10 @@ msgstr "Comanda '%s' nerecunoscută.\n" msgid "Commit changes" msgstr "Efectuați modificări" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -620,6 +640,10 @@ msgstr "Nu reîmprospătați depozitul, util atunci când testați o construcți msgid "Don't use rsync checksums" msgstr "Nu folosiți sumele de verificare rsync" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Descărcați oglinzi complete ale depozitelor mici" @@ -728,6 +752,10 @@ msgstr "Extrageți metadatele aplicației dintr-un depozit sursă" msgid "Extract signatures from APKs" msgstr "Extrageți semnăturile din APK-uri" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1186,6 +1214,10 @@ msgstr "Nu s-a găsit niciun SDK Android!" msgid "No attached devices found" msgstr "Nu s-au găsit dispozitive atașate" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Nu există amprente în URL." @@ -1300,11 +1332,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Mașină offline, sărind peste generarea oglinzii git până la `fdroid deploy`" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1389,6 +1421,11 @@ msgstr "Calea către depozitul de chei pentru cheia de semnare a repo-ului" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Tipărește variabila secretă în terminal pentru un ușor copy/paste" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1509,6 +1546,11 @@ msgstr "Redimensionați toate pictogramele care depășesc dimensiunea maximă a msgid "Restrict output to warnings and errors" msgstr "Limitarea ieșirii la avertismente și erori" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Rescrieți toate fișierele de metadate" @@ -1575,6 +1617,10 @@ msgstr[0] "Scannerul a găsit o problemă {}" msgstr[1] "Scannerul a găsit {} probleme" msgstr[2] "Scannerul a găsit {} probleme" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Scanarea APK cu dexdump pentru clasele cunoscute ca fiind non-libere." @@ -2030,6 +2076,11 @@ msgstr "Verificarea integrității pachetelor descărcate" msgid "Verifying index signature:" msgstr "Verificarea semnăturii indexului:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2039,6 +2090,10 @@ msgstr "VirusTotal API key nu poate încărca fișiere mai mari de 32MB, utiliza msgid "Warn about possible metadata errors" msgstr "Avertizează cu privire la posibile erori de metadate" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Atunci când este configurat pentru indici cu semnătură, creați numai indici fără semnătură în această etapă" @@ -2051,6 +2106,14 @@ msgstr "Atunci când se face linting pentru întregul depozit, yamllint este dez msgid "When signing or verifying fails, exit with an error code." msgstr "În cazul în care semnarea sau verificarea eșuează, ieșiți cu un cod de eroare." +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 \"Distinguished Name\" utilizat la generarea cheilor" @@ -2063,6 +2126,11 @@ msgstr "Puteți utiliza ANDROID_HOME pentru a seta calea către SDK-ul dvs., adi msgid "ZIP file archive" msgstr "Arhiva de fișiere ZIP" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2629,6 +2697,10 @@ msgstr "binare de referință furnizate au permis semnatarului {signer}" msgid "the following arguments are required: %s" msgstr "sunt necesare următoarele argumente: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2670,6 +2742,10 @@ msgstr "folosind Apache libcloud pentru a se sincroniza cu {url}" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com limitează rata, așteptând o nouă încercare..." +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2784,6 +2860,11 @@ msgstr "{path} are o semnătură proastă a fișierului \"{pattern}\", posibil e msgid "{path} has been flagged by virustotal {count} times:" msgstr "{path} a fost marcat de virustotal de {count} ori:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 8e5f7f0c..5f96fc0a 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -19,7 +19,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-10-27 03:53+0000\n" "Last-Translator: Golubev Alexander \n" "Language-Team: Russian \n" @@ -214,6 +214,10 @@ msgstr "'{value}' не подходит в качестве {field} в {appid}. msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' не является допустимым {field}, должно быть {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -341,6 +345,14 @@ msgstr "Вы пытаетесь поместить в архив {apkfilename} msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode с UpdateCheckMode: HTTP должен иметь шаблон." +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -434,6 +446,10 @@ msgstr "Проверка перед помещением в архив для {a msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Очистка с обновлением: не использовать кэш, повторно сгенерировать все APK" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Категории перечислены через запятую." @@ -447,6 +463,10 @@ msgstr "Команда '%s' не распознана.\n" msgid "Commit changes" msgstr "Сохранить изменения (commit)" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -630,6 +650,10 @@ msgstr "Не обновлять репозиторий. Упрощает тес msgid "Don't use rsync checksums" msgstr "Не использовать контрольные суммы rsync" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Полностью загружать зеркала для небольших репозиториев" @@ -738,6 +762,10 @@ msgstr "Извлекать метаданные приложения из исх msgid "Extract signatures from APKs" msgstr "Извлечь подписи из APK файлов" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1196,6 +1224,10 @@ msgstr "Android SDK не обнаружена!" msgid "No attached devices found" msgstr "Подключенных устройств не найдено" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "URL-адрес не содержит идентификационной метки (fingerprint)." @@ -1309,14 +1341,14 @@ msgstr "Указанный в OBB файле packagename не соответст msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Автономная система, пропуск генерации git-зеркала до `fdroid deploy`" -#: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "В одном из 'github_releases' отсутствует значение 'projectUrl'; пропускаем ..." - #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "В одном из 'github_releases' отсутствует значение 'packageNames'; пропускаем ..." +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "В одном из 'github_releases' отсутствует значение 'projectUrl'; пропускаем ..." + #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "В одном из 'github_releases' отсутствует значение 'token'; пропускаем ..." @@ -1399,6 +1431,11 @@ msgstr "Путь к хранилищу с ключом для подписыва msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Отобразить секретную переменную в терминале (чтобы ее было легче скопировать и вставить)" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1519,6 +1556,11 @@ msgstr "Изменить размер всех иконок, превышающ msgid "Restrict output to warnings and errors" msgstr "Показывать в выводе только предупреждения и ошибки" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Перезаписать все метаданные" @@ -1585,6 +1627,10 @@ msgstr[0] "Сканирование обнаружило {} ошибку" msgstr[1] "Сканирование обнаружило {} ошибки" msgstr[2] "Сканирование обнаружило {} ошибок" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Сканирование APK с помощью dexdump на наличие известных несвободных классов." @@ -2039,6 +2085,11 @@ msgstr "Проверить целостность загруженных пак msgid "Verifying index signature:" msgstr "Проверка подписи индекса:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2048,6 +2099,10 @@ msgstr "Через API VirusTotal нельзя загрузить файлы б msgid "Warn about possible metadata errors" msgstr "Предупреждать о возможных ошибках в метаданных" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Даже если в конфигурации сборки задано подписывать индексы, то все равно cоздавать неподписанные индексы (только на данном этапе)" @@ -2060,6 +2115,14 @@ msgstr "При проверке целого репозитория, yamllint п msgid "When signing or verifying fails, exit with an error code." msgstr "При неудачном подписании или проверке выйдите с кодом ошибки." +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "При генерации ключей использовалось различимое имя (Distinguished Name) стандарта X.509" @@ -2072,6 +2135,11 @@ msgstr "Путь к SDK можно указать в переменной ANDROI msgid "ZIP file archive" msgstr "Архив ZIP" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2638,6 +2706,10 @@ msgstr "предоставленный эталонный двоичный фа msgid "the following arguments are required: %s" msgstr "требуются аргументы: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2679,6 +2751,10 @@ msgstr "Аpache libcloud: синхронизация с {url}" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com ограничивает траффик, ждем повторной попытки..." +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2793,6 +2869,11 @@ msgstr "{path}: неверная подпись \"{pattern}\". Выглядит msgid "{path} has been flagged by virustotal {count} times:" msgstr "{path} был отмечен virustotal {count} раз:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/sk/LC_MESSAGES/fdroidserver.po b/locale/sk/LC_MESSAGES/fdroidserver.po index 93895a06..bb9c771e 100644 --- a/locale/sk/LC_MESSAGES/fdroidserver.po +++ b/locale/sk/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -195,6 +195,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -322,6 +326,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -415,6 +427,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -428,6 +444,10 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -611,6 +631,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -715,6 +739,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1173,6 +1201,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1287,11 +1319,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1376,6 +1408,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1496,6 +1533,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "" @@ -1562,6 +1604,10 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2009,6 +2055,11 @@ msgstr "" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2018,6 +2069,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2030,6 +2085,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2042,6 +2105,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2608,6 +2676,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2649,6 +2721,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2763,6 +2839,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index 570c1e3f..309b5084 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-09-12 00:02+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" @@ -200,6 +200,10 @@ msgstr "'{value}' s’është një {field} e vlefshme te {appid}. Rregullsi shpr msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' s’është një {field} e vlefshme, duhet të jetë {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -327,6 +331,14 @@ msgstr "Po arkivohet {apkfilename} me nënshkrim të pavlefshëm!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode me UpdateCheckMode: HTTP duhet të ketë një rregullsi." +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -419,6 +431,10 @@ msgstr "Po kontrollohet arkivimi për {appid} - apks:{integer}, keepversions:{ke msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Përditësim nha e para - mos përdor fshehtina, ripërpuno krejt APK-të" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Listë kategorish ndarë me presje." @@ -432,6 +448,10 @@ msgstr "Urdhër '%s' jo i pranuar.\n" msgid "Commit changes" msgstr "Depozito ndryshimet" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -615,6 +635,10 @@ msgstr "Mos rifresko depon, e dobishme kur testohet një montim pa lidhje intern msgid "Don't use rsync checksums" msgstr "Mos përdorni checksum-e rsync-u" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Shkarko pasqyra të plota deposh të vogla" @@ -723,6 +747,10 @@ msgstr "Përftoji tejtëdhënat e aplikacionit prej një depoje burim" msgid "Extract signatures from APKs" msgstr "Përfto nënshkrime prej APK-sh" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1181,6 +1209,10 @@ msgstr "S’u gjet SDK Android!" msgid "No attached devices found" msgstr "S’u gjetën pajisje të bashkëngjitura" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "S’ka shenja gishtash te URL-ja." @@ -1294,14 +1326,14 @@ msgstr "packagename i OBB-së nuk përputhet me ndonjë APK të mbuluar:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Makinë jo në linjë, po anashkalohet prodhim pasqyre git, deri sa `fdroid deploy`" -#: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "Njërit prej zërave të formësimit të 'github_releases' i mungon vlera 'projectUrl'. Po anashkalohet…" - #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "Një nga zërat e formësimit të 'github_releases'mungon te vlera 'packageNames' value. Po anashkalohet…" +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "Njërit prej zërave të formësimit të 'github_releases' i mungon vlera 'projectUrl'. Po anashkalohet…" + #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "Një nga zërat e formësimit të 'github_releases' mungon te vlera 'token' value. Po anashkalohet…" @@ -1384,6 +1416,11 @@ msgstr "Shteg për te depo kyçesh për kyçin e nënshkrimit të depos" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Shtype ndryshoren e fshehtë te terminali, për kopjim/ngjitje të kollajtë" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1504,6 +1541,11 @@ msgstr "Ripërmaso krejt ikonat që tejkalojnë madhësinë maksimum në piksel msgid "Restrict output to warnings and errors" msgstr "Kufizoje output-in në sinjalizime dhe gabime" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Rishkruaj krejt kartelat e tejtëdhënave" @@ -1569,6 +1611,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "Kontrolli gjeti {} problem" msgstr[1] "Kontrolli gjeti {} probleme" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Po kontrollohet APK me “dexdump” për klasa të ditura jo të lira." @@ -2024,6 +2070,11 @@ msgstr "Verifikoni integritetin e paketave të shkarkuara" msgid "Verifying index signature:" msgstr "Po verifikohet nënshkrim treguesi:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2033,6 +2084,10 @@ msgstr "Kyçi API VirusTotal s’mund të ngarkojë kartela më të mëdha se 2M msgid "Warn about possible metadata errors" msgstr "Sinjalizo rreth gabimesh të mundshëm tejtëdhënash" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Kur është formësuar për tregues të nënshkruar, në këtë fazë krijo vetëm tregues të panënshkruar" @@ -2045,6 +2100,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "Kur nënshkrimi, ose verifikimi dështon, dil me një kod gabimi." +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distinguished Name' i përdorur teksa prodhoheshin kyçe" @@ -2057,6 +2120,11 @@ msgstr "Mund të përdorni ANDROID_HOME që të caktoni shtegun për te SDK-ja j msgid "ZIP file archive" msgstr "Arkiv kartelash ZIP" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2621,6 +2689,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "argumentet vijuese janë të domosdoshëm: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2662,6 +2734,10 @@ msgstr "po përdoret Apache libcloud për njëkohësim me {url}" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com i kufizon shpejtësitë, po pritet për riprovim…" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2775,6 +2851,11 @@ msgstr "{path} ka “{pattern}” të gabuar nënshkrimi kartele, ka gjasa të j msgid "{path} has been flagged by virustotal {count} times:" msgstr "për {path} ka {count} herë sinjalizime nga virustotal:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index 2f984b25..2fe17113 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-09-20 19:23+0000\n" "Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" @@ -203,6 +203,10 @@ msgstr "'{value}' није валидан {field} у {appid}. Регекспат msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' није важећи {field}, треба да буде {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -330,6 +334,14 @@ msgstr "Архивирање {apkfilename} са неважећим потпис msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode са UpdateCheckMode: HTTP мора имати образац." +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -423,6 +435,10 @@ msgstr "Провера архивирања за {appid} - апк-и:{integer}, msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Чисто ажурирање – не користите кешеве, поново обрађујте све АПК-ове" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Запета раздвојена листа категорија." @@ -436,6 +452,10 @@ msgstr "Наредба „%s” није препозната.\n" msgid "Commit changes" msgstr "Потврди измене" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -619,6 +639,10 @@ msgstr "Не освежавајте репозиторијум, корисно msgid "Don't use rsync checksums" msgstr "Не користите rsync чексуме" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Преузмите комплетне огледале малих репоа" @@ -727,6 +751,10 @@ msgstr "Извлачење метаподатака апликације из и msgid "Extract signatures from APKs" msgstr "Извуците потписе из АПК-ова" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1185,6 +1213,10 @@ msgstr "Нема пронађеног Android SDK!" msgid "No attached devices found" msgstr "Није пронађен ниједан прикључени уређај" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Нема отиска прста у УРЛ-у." @@ -1298,14 +1330,14 @@ msgstr "Име пакета OBB не одговара подржаном APK-у: msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Оффлайн машина, прескочено генерисање git огледала до `fdroid deploy`" -#: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "Једна од 'github_releases' конфигурационих ставки недостаје 'projectUrl' вредност. прескакање ..." - #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "Једна од 'github_releases' конфигурационих ставки нема 'packageNames' вредност. прескакање ..." +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "Једна од 'github_releases' конфигурационих ставки недостаје 'projectUrl' вредност. прескакање ..." + #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "Једна од 'github_releases' конфигурационих ставки нема 'token' вредност. прескакање ..." @@ -1388,6 +1420,11 @@ msgstr "Путања до хранионице за кључ потписива msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Штампај тајну променљиву на терминал за лако копирање/налепљивање" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1508,6 +1545,11 @@ msgstr "Промени величину свих икона које прела msgid "Restrict output to warnings and errors" msgstr "Ограничите излаз на упозорења и грешке" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Преупишите све метаподатке" @@ -1574,6 +1616,10 @@ msgstr[0] "Скенирање је пронашло {} проблем" msgstr[1] "Скенирање је пронашло {} проблема" msgstr[2] "Скенирање је пронашло {} проблема" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Скенирање APK са dexdump за познате неслободне класе." @@ -2028,6 +2074,11 @@ msgstr "Верификуј интегритет преузетих пакета" msgid "Verifying index signature:" msgstr "Верификација потписа индекса:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2037,6 +2088,10 @@ msgstr "VirusTotal API кључ не може отпремити датотек msgid "Warn about possible metadata errors" msgstr "Упозорење о могућим грешкама у метаподацима" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Када је конфигурисано за потписане индексе, креирај само непотписане индексе у овој фази" @@ -2049,6 +2104,14 @@ msgstr "Када се врши провера целог репозиториј msgid "When signing or verifying fails, exit with an error code." msgstr "Када потписивање или верификација не успеју, излазите са кодом грешке." +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distinguished Name' коришћен приликом генерисања кључева" @@ -2061,6 +2124,11 @@ msgstr "Можеш користити ANDROID_HOME да подесиш пута msgid "ZIP file archive" msgstr "ZIP архивска датотека" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2627,6 +2695,10 @@ msgstr "достављени референтни бинарни фајл има msgid "the following arguments are required: %s" msgstr "следећи аргументи су обавезни: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2668,6 +2740,10 @@ msgstr "користећи Apache libcloud за синхронизацију с msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com ограничава брзину, чекање на поновни покушај..." +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2782,6 +2858,11 @@ msgstr "{path} има лош потпис датотеке \"{pattern}\", мог msgid "{path} has been flagged by virustotal {count} times:" msgstr "{path} је означен од стране virustotal {count} пута:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index 67b01277..3e3bab61 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-04-24 08:39+0000\n" "Last-Translator: Kristoffer Grundström \n" "Language-Team: Swedish \n" @@ -201,6 +201,10 @@ msgstr "'{value}' är inte ett giltigt {field} i {appid}. Regex-mönster: {patte msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' är inte ett giltigt {field} i {appid}. Regex-mönster: {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -328,6 +332,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -420,6 +432,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -433,6 +449,10 @@ msgstr "Kommandot '%s' känns inte igen.\n" msgid "Commit changes" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -616,6 +636,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -720,6 +744,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1178,6 +1206,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1292,11 +1324,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1381,6 +1413,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1501,6 +1538,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Skriv om alla metadatafiler" @@ -1566,6 +1608,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2013,6 +2059,11 @@ msgstr "Verifiera integriteten hos de nedladdade paketen" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2022,6 +2073,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "Visa varningar vid möjliga metadatafel" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2034,6 +2089,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2046,6 +2109,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2611,6 +2679,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "följande argument krävs: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2652,6 +2724,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2765,6 +2841,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" @@ -2772,7 +2853,6 @@ msgstr "" #: ../fdroidserver/common.py #, fuzzy, python-brace-format -#| msgid "'sdk_path' not set in config.yml!" msgid "{path} is not a standard config file!" msgstr "'sdk_path' är inte inställt i config.yml!" diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index 9c5e17ba..37f37e13 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-09-08 11:09+0000\n" "Last-Translator: abelbiwott-dev \n" "Language-Team: Swahili \n" @@ -201,6 +201,10 @@ msgstr "'{value}' si {field} halali katika {appid}. Muundo wa regex: {pattern}" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' si {field} halali, inapaswa kuwa {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -328,6 +332,14 @@ msgstr "Kuhifadhi {apkfilename} yenye saini batili!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode na UpdateCheckMode: HTTP lazima iwe na mpangilio." +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -420,6 +432,10 @@ msgstr "Kuangalia uhifadhi kwa {appid} - apks:{integer}, keepversions: {keep}, a msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Sasisho safi - usitumie cache, chakata tena APK zote" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Orodha ya makundi iliyotenganishwa kwa koma." @@ -433,6 +449,10 @@ msgstr "Amri '%s' haitambuliki.\n" msgid "Commit changes" msgstr "Fanya mabadiliko" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -616,6 +636,10 @@ msgstr "Usionyeshe upya ghala hio, muhimu wakati wa kujaribu jengo isiyo na muun msgid "Don't use rsync checksums" msgstr "Usitumie rsync checksums" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Pakua vioo kamili vya maghala madogo" @@ -724,6 +748,10 @@ msgstr "Pata metadata ya apu kutoka kwa ghala ya chanzo" msgid "Extract signatures from APKs" msgstr "Pata sahihi kutoka kwa APKs" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1182,6 +1210,10 @@ msgstr "Hakuna SDK ya Android Iliyopatikana!" msgid "No attached devices found" msgstr "Hakuna vifaa vilivyoambatanishwa vimepatikana" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Hakuna alama ya kidole kwenye URL." @@ -1296,11 +1328,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Machini iliyo nje ya mtandao, inapuuza uundaji wa kioo cha git mpaka 'fdroid deploy'" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1385,6 +1417,11 @@ msgstr "Ielekeze kwa keystore kwa ufunguo wa kusaini ghala" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Chapisha kigezo hicho cha siri kwa kidirisha cha amri kwa urahisi wa kunakili/kubandika" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1505,6 +1542,11 @@ msgstr "Badilisha ukubwa wa ikoni zote zinazopita saizi kubwa ya pixel kisha uon msgid "Restrict output to warnings and errors" msgstr "Zuia pato iwe onyo na hitilafu" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Andika upya faili zote za metadata" @@ -1570,6 +1612,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "Skena imepata tatizo {}" msgstr[1] "Skena zimepata matatizo {}" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Kuchanganua APK kwa kutumia dexdump kwa madarasa yanayojulikana kuwa si huru." @@ -2025,6 +2071,11 @@ msgstr "Thibitisha uadilifu wa furushi zilizopakuliwa" msgid "Verifying index signature:" msgstr "Kuthibitisha saini ya faharasa:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2034,6 +2085,10 @@ msgstr "Ufunguo wa API ya VirusTotal haiwezi kupakia faili zaidi ya 32MB, tumia msgid "Warn about possible metadata errors" msgstr "Onya kuhusu hitilafu ya metadata yanayoweza kutokea" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Ikiwa imesanidiwa kwa faharasa zilizosainiwa, unda pekee faharasa zisizosainiwa katika hatua hii" @@ -2046,6 +2101,14 @@ msgstr "Wakati unapochambua msimbo wa ghala mzima yamllint inalemazwa kwa chaguo msgid "When signing or verifying fails, exit with an error code." msgstr "Wakati kusaini au kuthibitisha umefeli, toka na msimbo wa hitilafu." +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distinguished Name' inayotumika wakati wa kuzalisha funguo" @@ -2058,6 +2121,11 @@ msgstr "Unaweza kutumia ANDROID_HOME kuseti njia ya SDK yako, kwa mfano:" msgid "ZIP file archive" msgstr "kumbukumbu ya faili ya ZIP" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2622,6 +2690,10 @@ msgstr "binari ya rejeleo lililowasilishwa imeruhusu signer {signer}" msgid "the following arguments are required: %s" msgstr "hoja zifuatazo zinahitajika: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2663,6 +2735,10 @@ msgstr "kutumia Apache libcloud kulandanisha na {url}" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com inapunguza kiwango, inangojea kujaribu tena..." +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2776,6 +2852,11 @@ msgstr "{path} ina saini mbaya ya faili \"{pattern}\", Uwezekano wa kunyonywa la msgid "{path} has been flagged by virustotal {count} times:" msgstr "{path} imealamishwa na virustotal mara {count}:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/ta/LC_MESSAGES/fdroidserver.po b/locale/ta/LC_MESSAGES/fdroidserver.po index 7bc91745..7bd09e49 100644 --- a/locale/ta/LC_MESSAGES/fdroidserver.po +++ b/locale/ta/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-01-25 11:40+0000\n" "Last-Translator: Naveen \n" "Language-Team: Tamil \n" @@ -196,6 +196,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -323,6 +327,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -415,6 +427,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -428,6 +444,10 @@ msgstr "'%s' கட்டளை அங்கீகரிக்கப்படவ msgid "Commit changes" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -611,6 +631,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -715,6 +739,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1173,6 +1201,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1287,11 +1319,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1376,6 +1408,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1496,6 +1533,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "" @@ -1561,6 +1603,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2008,6 +2054,11 @@ msgstr "" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2017,6 +2068,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2029,6 +2084,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2041,6 +2104,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2606,6 +2674,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2647,6 +2719,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2760,6 +2836,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index b5ba4715..e869799c 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-09-10 23:49+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" @@ -202,6 +202,10 @@ msgstr "'{value}' {appid} içinde geçerli {field} değil. Regex ifadesi: {patte msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' geçerli bir {field} değil, {pattern} olmalı" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -329,6 +333,14 @@ msgstr "Geçersiz imza ile {apkfilename} arşivleme!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "UpdateCheckMode ile AutoUpdateMode: HTTP bir desene sahip olmalıdır." +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -421,6 +433,10 @@ msgstr "{appid} için arşivleme denetleniyor - apks:{integer}, keepversions:{ke msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Temiz güncelleme - önbellekleri kullanmaz, tüm APKları yeniden işler" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Kategorilerin virgülle ayrılmış listesi." @@ -434,6 +450,10 @@ msgstr "'%s' komutu tanınmıyor.\n" msgid "Commit changes" msgstr "Değişiklikleri işle" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -617,6 +637,10 @@ msgstr "Depoyu yenileme, bir inşa internet bağlantısı olmadan sınanırken y msgid "Don't use rsync checksums" msgstr "Rsync sağlama toplamlarını kullanma" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Küçük depoların tam yansımasını indir" @@ -725,6 +749,10 @@ msgstr "Bir kaynak depodan uygulama üst verilerini ayıkla" msgid "Extract signatures from APKs" msgstr "APK'lardan imzaları ayıkla" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1183,6 +1211,10 @@ msgstr "Android SDK bulunamadı!" msgid "No attached devices found" msgstr "Bağlı aygıt bulunamadı" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "URL'de parmak izi yok." @@ -1296,14 +1328,14 @@ msgstr "OBB'ın packagename değeri desteklenen APK ile eşleşmiyor:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Çevrim dışı makine, `fdroid deploy` komutuna kadar git yansı oluşturma atlanıyor" -#: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "'github_releases' yapılandırma ögelerinden birinde 'projectUrl' değeri eksik. atlanıyor..." - #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "'github_releases' yapılandırma ögelerinden birinde 'packageNames' değeri eksik. atlanıyor..." +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "'github_releases' yapılandırma ögelerinden birinde 'projectUrl' değeri eksik. atlanıyor..." + #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "'github_releases' yapılandırma ögelerinden birinde 'token' değeri eksik. atlanıyor..." @@ -1386,6 +1418,11 @@ msgstr "Depo imzalama anahtarı için anahtar deposunun konumu" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Kolay kopyala yapıştır için gizli değişkeni terminale yaz" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1506,6 +1543,11 @@ msgstr "Piksel boyut sınırını aşan tüm simgeleri yeniden boyutlandır ve msgid "Restrict output to warnings and errors" msgstr "Çıkışı uyarılara ve hatalara kısıtla" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Tüm üst veri dosyalarını yeniden yaz" @@ -1571,6 +1613,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "Tarayıcı {} sorun buldu" msgstr[1] "Tarayıcı {} sorun buldu" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Bilinen özgür olmayan sınıflar için dexdump ile APK taranıyor." @@ -2025,6 +2071,11 @@ msgstr "İndirilen paketlerin bütünlüğünü doğrula" msgid "Verifying index signature:" msgstr "İndeks imzası doğrulanıyor:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2034,6 +2085,10 @@ msgstr "VirusTotal API anahtarı 32MB'den büyük dosyaları yükleyemiyor, {pat msgid "Warn about possible metadata errors" msgstr "Olası üst veri hataları hakkında uyar" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "İmzalı indeksler için yapılandırıldığında, bu aşamada sadece imzasız indeksleri yarat" @@ -2046,6 +2101,14 @@ msgstr "Tüm depo denetlenirken yamllint öntanımlı olarak devre dışı bıra msgid "When signing or verifying fails, exit with an error code." msgstr "İmzalama veya doğrulama başarısız olduğunda, bir hata koduyla çık." +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "Anahtarlar üretilirken X.509 'Distinguished Name' kullanılır" @@ -2058,6 +2121,11 @@ msgstr "SDK'nızın konumunu ayarlamak için ANDROID_HOME'u kullanabilirsiniz:" msgid "ZIP file archive" msgstr "ZIP dosya arşivi" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2622,6 +2690,10 @@ msgstr "sağlanan referans ikilisi {signer} imzalayana izin verdi" msgid "the following arguments are required: %s" msgstr "şu argümanlar gerekli: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2663,6 +2735,10 @@ msgstr "{url} ile eşitleme için Apache libcloud kullanılıyor" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com hızı sınırlıyor, yeniden deneme bekleniyor..." +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2776,6 +2852,11 @@ msgstr "{path} konumunun bozuk imzası \"{pattern}\" var, olası Janus istismar msgid "{path} has been flagged by virustotal {count} times:" msgstr "{path} virustotal tarafından {count} defa işaretlendi:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/tzm/LC_MESSAGES/fdroidserver.po b/locale/tzm/LC_MESSAGES/fdroidserver.po index 6787c8ff..ef09531f 100644 --- a/locale/tzm/LC_MESSAGES/fdroidserver.po +++ b/locale/tzm/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-681-gc19e8952\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2020-10-29 08:32+0000\n" "Last-Translator: Hakim Oubouali \n" "Language-Team: Central Atlas Tamazight \n" @@ -195,6 +195,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -322,6 +326,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -414,6 +426,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -427,6 +443,10 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -610,6 +630,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -714,6 +738,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1172,6 +1200,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1286,11 +1318,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1375,6 +1407,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1495,6 +1532,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "" @@ -1560,6 +1602,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2007,6 +2053,11 @@ msgstr "" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2016,6 +2067,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2028,6 +2083,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2040,6 +2103,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2605,6 +2673,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2646,6 +2718,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2759,6 +2835,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/ug/LC_MESSAGES/fdroidserver.po b/locale/ug/LC_MESSAGES/fdroidserver.po index e20af57e..e88c85cb 100644 --- a/locale/ug/LC_MESSAGES/fdroidserver.po +++ b/locale/ug/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2018-06-08 03:44+0000\n" "Last-Translator: ۋولقان \n" "Language-Team: Uyghur \n" @@ -196,6 +196,10 @@ msgstr "" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -323,6 +327,14 @@ msgstr "" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -415,6 +427,10 @@ msgstr "" msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "" @@ -428,6 +444,10 @@ msgstr "" msgid "Commit changes" msgstr "" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -611,6 +631,10 @@ msgstr "" msgid "Don't use rsync checksums" msgstr "" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "" @@ -715,6 +739,10 @@ msgstr "" msgid "Extract signatures from APKs" msgstr "" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1173,6 +1201,10 @@ msgstr "" msgid "No attached devices found" msgstr "" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "" @@ -1288,11 +1320,11 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py @@ -1377,6 +1409,11 @@ msgstr "" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1497,6 +1534,11 @@ msgstr "" msgid "Restrict output to warnings and errors" msgstr "" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "" @@ -1562,6 +1604,10 @@ msgid_plural "Scanner found {} problems" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "" @@ -2009,6 +2055,11 @@ msgstr "" msgid "Verifying index signature:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2018,6 +2069,10 @@ msgstr "" msgid "Warn about possible metadata errors" msgstr "" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" @@ -2030,6 +2085,14 @@ msgstr "" msgid "When signing or verifying fails, exit with an error code." msgstr "" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "" @@ -2042,6 +2105,11 @@ msgstr "" msgid "ZIP file archive" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2607,6 +2675,10 @@ msgstr "" msgid "the following arguments are required: %s" msgstr "" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2648,6 +2720,10 @@ msgstr "" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2761,6 +2837,11 @@ msgstr "" msgid "{path} has been flagged by virustotal {count} times:" msgstr "" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 0aa74616..7cc2e8a0 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-09-13 23:35+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" @@ -210,6 +210,10 @@ msgstr "'{value}' не є правильним {field} у {appid}. Правил msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' не є дійсним {field}, має бути {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -337,6 +341,14 @@ msgstr "Архівую {apkfilename} з неправильним підписо msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode з UpdateCheckMode: HTTP повинен мати шаблон." +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -430,6 +442,10 @@ msgstr "Перевірка архівації на {appid} — apks:{integer}, k msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Очистити оновлення - не використовує кеш, повторно обробляє всі APK" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "Список категорій, розділених комами." @@ -443,6 +459,10 @@ msgstr "Команда '%s' не визнана.\n" msgid "Commit changes" msgstr "Прийняти зміни" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -626,6 +646,10 @@ msgstr "Не оновлюйте репозиторій, корисно під ч msgid "Don't use rsync checksums" msgstr "Не використовуйте контрольні суми rsync" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "Завантажувати повноцінні дзеркала невеликих репозиторіїв" @@ -734,6 +758,10 @@ msgstr "Витяг метаданих застосунку з вихідного msgid "Extract signatures from APKs" msgstr "Експортування підписів з APK" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1192,6 +1220,10 @@ msgstr "Не знайдено Android SDK!" msgid "No attached devices found" msgstr "Не знайдено приєднаних пристроїв" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "Немає власного цифрового відбитка в URL-адресі." @@ -1305,14 +1337,14 @@ msgstr "Назва пакунка OBB не відповідає підтриму msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "Автономна машина, пропускання генерування дзеркал git до `fdroid deploy`" -#: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "В одному з елементів конфігурації 'github_releases' відсутнє значення 'projectUrl'. пропущено ..." - #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "В одному з елементів конфігурації 'github_releases' відсутнє значення 'packageNames'. пропущено ..." +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "В одному з елементів конфігурації 'github_releases' відсутнє значення 'projectUrl'. пропущено ..." + #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "В одному з елементів конфігурації 'github_releases' відсутнє значення 'token'. пропущено ..." @@ -1395,6 +1427,11 @@ msgstr "Шлях до сховища ключів для підписного к msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Вивести таємну змінну до термінала для легкого копіювання/вставлення" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1515,6 +1552,11 @@ msgstr "Змінити розмір усіх піктограм, що перев msgid "Restrict output to warnings and errors" msgstr "Обмеження виводу на попередження і помилки" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "Перепишіть усі файли метаданих" @@ -1581,6 +1623,10 @@ msgstr[0] "Знайдено {} проблему" msgstr[1] "Знайдено {} проблеми" msgstr[2] "Знайдено {} проблем" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "Сканування APK за допомогою dexdump на наявність відомих невільних класів." @@ -2035,6 +2081,11 @@ msgstr "Перевірте цілісність завантажених пак msgid "Verifying index signature:" msgstr "Перевірка підпису індексу:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2044,6 +2095,10 @@ msgstr "Ключ API VirusTotal не може завантажити файли, msgid "Warn about possible metadata errors" msgstr "Попереджати про можливі помилки метаданих" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "Коли налаштовано для підписаних індексів, на цьому етапі створюйте лише непідписані індекси" @@ -2056,6 +2111,14 @@ msgstr "Під час перевірки всього репозиторію, ya msgid "When signing or verifying fails, exit with an error code." msgstr "Якщо підписати або перевірити не вдається, виходить з кодом помилки." +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "X.509 'Distiguished Name' використовується під час створення ключів" @@ -2068,6 +2131,11 @@ msgstr "За допомогою ANDROID_HOME можна встановити ш msgid "ZIP file archive" msgstr "ZIP-архів" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2634,6 +2702,10 @@ msgstr "наданий еталонний двійковий файл дозво msgid "the following arguments are required: %s" msgstr "такі аргументи зобов'язані: %s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2675,6 +2747,10 @@ msgstr "Apache libcloud: синхронізація з {url}" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com обмежує швидкість, очікування повторної спроби..." +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2789,6 +2865,11 @@ msgstr "{path}: недійсний підпис \"{pattern}\". Виглядає msgid "{path} has been flagged by virustotal {count} times:" msgstr "{path} було позначено virustotal {count} разів:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index ace0f85f..05bbc3bf 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -39,7 +39,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-11-08 17:42+0000\n" "Last-Translator: linsui \n" "Language-Team: Chinese (Simplified Han script) \n" @@ -209,9 +209,7 @@ msgstr "'{aapt}' 太旧, F-Droid 需要 build-tools-{version} 或更新的版本 #: ../fdroidserver/common.py #, python-brace-format -msgid "" -"'{field}' will be in random order! Use () or [] brackets if order is " -"important!" +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "{field} 将随机排列! 如果顺序很重要, 请使用 () 或 [] 括号!" #: ../fdroidserver/common.py @@ -234,6 +232,10 @@ msgstr "'{value}' 不是 {appid} 之有效 {field}. 正则表达式: {pattern}" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' 不是有效 {field},应为 {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -247,8 +249,7 @@ msgstr ".__call__() 未定义" #: ../fdroidserver/lint.py msgid "/issues is missing" -msgstr "" -"路径缺少 /issues ( 译者注: 此处仅支持 github 或 gitlab 之 issues 链接 )" +msgstr "路径缺少 /issues ( 译者注: 此处仅支持 github 或 gitlab 之 issues 链接 )" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" @@ -285,9 +286,7 @@ msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "缺少 AllowedAPKSigningKeys,但提供了参考二进制文件" #: ../fdroidserver/import_subcommand.py -msgid "" -"Allows a different revision (or git branch) to be specified for the initial " -"import" +msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "可让运行初始导入时指定不同修订 ( 或 git 分支 )" #: ../fdroidserver/mirror.py @@ -331,26 +330,16 @@ msgid "Android SDK tool {cmd} not found!" msgstr "没找到 Android SDK 工具 {cmd}!" #: ../fdroidserver/lint.py -msgid "" -"App has Binaries but does not have corresponding AllowedAPKSigningKeys to " -"pin certificate." +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "应用具有二进制文件,但没有相应的AllowedAPKSigningKeys 来固定证书。" #: ../fdroidserver/lint.py -msgid "" -"App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or " -"UpdateCheckMode are not None" -msgstr "" -"应用的 NoSourceSince 或 ArchivePolicy 为 “0 versions” 但 AutoUpdateMode 或 " -"UpdateCheckMode 不是 None" +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "应用的 NoSourceSince 或 ArchivePolicy 为 “0 versions” 但 AutoUpdateMode 或 UpdateCheckMode 不是 None" #: ../fdroidserver/lint.py -msgid "" -"App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but " -"AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" -"APK 有 NoSourceSince 或 ArchivePolicy \"0 versions\" 或 0 但 AutoUpdateMode " -"或 UpdateCheckMode 不是 None" +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "APK 有 NoSourceSince 或 ArchivePolicy \"0 versions\" 或 0 但 AutoUpdateMode 或 UpdateCheckMode 不是 None" #: ../fdroidserver/lint.py #, python-brace-format @@ -358,11 +347,8 @@ msgid "App is in '{repo}' but has a link to {url}" msgstr "应用 在 '{repo}' 中, 但有一个链接到 {url}" #: ../fdroidserver/lint.py -msgid "" -"App version has binary but does not have corresponding AllowedAPKSigningKeys " -"to pin certificate." -msgstr "" -"应用版本具有二进制文件,但没有相应的 AllowedAPKSigningKeys 来固定证书。" +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "应用版本具有二进制文件,但没有相应的 AllowedAPKSigningKeys 来固定证书。" #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -377,15 +363,21 @@ msgstr "正使用无效签名归档 {apkfilename}!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode 和 UpdateCheckMode:HTTP 必须有一个模式。" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "镜像配置中的错误条目类型“{mirrortype}”:{mirror}" #: ../fdroidserver/mirror.py -msgid "" -"Base URL to mirror, can include the index signing key using the query " -"string: ?fingerprint=" +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "镜像的基本链接可以使用此请求参数包含索引签名键: ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname @@ -463,17 +455,17 @@ msgstr "检查应用的更新" #: ../fdroidserver/update.py #, python-brace-format -msgid "" -"Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, " -"archapks:{arch}" -msgstr "" -"正为 {appid} 检查存档: 安装包: {integer}, 保留版本数: {keep}, 架构安装包: " -"{arch}" +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "正为 {appid} 检查存档: 安装包: {integer}, 保留版本数: {keep}, 架构安装包: {arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "干净的更新 - 不使用缓存,重新处理全部 APK 文件" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "逗号分割的目录列表。" @@ -487,15 +479,17 @@ msgstr "无法识别命令 '%s'。\n" msgid "Commit changes" msgstr "提交更改" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr ".yml 和本地化文件之间的“{field}”定义冲突:" #: ../fdroidserver/__main__.py -msgid "" -"Conflicting arguments: '--verbose' and '--quiet' can not be specified at the " -"same time." +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "冲突的参数: '--verbose' 和 '--quiet' 不能被同时使用." #: ../fdroidserver/common.py @@ -665,15 +659,17 @@ msgid "Don't create a source tarball, useful when testing a build" msgstr "不创建源码 tarball 文件,便于内部版本测试" #: ../fdroidserver/build.py -msgid "" -"Don't refresh the repository, useful when testing a build with no internet " -"connection" +msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "不刷新资源库,便于没有互联网时的内部版本测试" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" msgstr "请勿使用 rsync 校验和" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "下载小型仓库的完整镜像" @@ -745,12 +741,8 @@ msgstr "错误: {path}中的{key}:{subkey}不再被允许的值的范围内: {al #: ../fdroidserver/__main__.py #, python-brace-format -msgid "" -"Encoding is set to '{enc}' fdroid might run into encoding issues. Please set " -"it to 'UTF-8' for best results." -msgstr "" -"编码被设置为“{enc}”,可能会导致 fdroid 出现编码问题。为了最佳效果,请将其更改" -"为“UTF-8”。" +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "编码被设置为“{enc}”,可能会导致 fdroid 出现编码问题。为了最佳效果,请将其更改为“UTF-8”。" #: ../fdroidserver/init.py #, python-format @@ -767,11 +759,8 @@ msgid "Environment variable {var} from {configname} is not set!" msgstr "没有设置 {configname} 中的环境变量 {var}!" #: ../fdroidserver/deploy.py -msgid "" -"Error deploying 'github_releases', {} not present. (You might need to run " -"`fdroid update` first.)" -msgstr "" -"部署'github_releases'错误,{}没有出现。(你可能需要先运行`fdroid update`)" +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "部署'github_releases'错误,{}没有出现。(你可能需要先运行`fdroid update`)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -789,6 +778,10 @@ msgstr "从源存储库中提取应用元数据" msgid "Extract signatures from APKs" msgstr "从 APK 中提取签名" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -867,9 +860,7 @@ msgid "Forbidden HTML tags" msgstr "禁止的HTML标签" #: ../fdroidserver/build.py -msgid "" -"Force build of disabled apps, and carries on regardless of scan problems. " -"Only allowed in test mode." +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "强制编译已禁用应用,忽略扫描出错。仅用于测试模式。" #: ../fdroidserver/build.py @@ -1166,8 +1157,7 @@ msgid "Java compiled class" msgstr "Java 编译类" #: ../fdroidserver/signindex.py -msgid "" -"Java jarsigner not found! Install in standard location or set java_paths!" +msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "未找到 Java jarsigner!安装在标准位置或设置java_paths!" #: ../fdroidserver/lint.py @@ -1189,10 +1179,8 @@ msgstr "AllowedAPKSigningKeys 中使用的已知调试密钥: " #: ../fdroidserver/lint.py #, python-brace-format -msgid "" -"Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "" -"最后使用的提交 '{commit}' 看起来像一个标签,但 UpdateCheckMode 是 '{ucm}'" +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "最后使用的提交 '{commit}' 看起来像一个标签,但 UpdateCheckMode 是 '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" @@ -1252,6 +1240,10 @@ msgstr "未找到 Android SDK!" msgid "No attached devices found" msgstr "未找到连接的设备" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "URL 中没有指纹。" @@ -1366,21 +1358,15 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "脱机计算机,跳过 git 镜像生成直到 `fdroid deploy`" #: ../fdroidserver/deploy.py -msgid "" -"One of the 'github_releases' config items is missing the 'projectUrl' value. " -"skipping ..." -msgstr "其中一个 'github_releases'配置项缺失'projectUrl'值。跳过..." - -#: ../fdroidserver/deploy.py -msgid "" -"One of the 'github_releases' config items is missing the 'packageNames' " -"value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "其中一个 'github_releases'配置项缺失'packageNames'值。跳过..." #: ../fdroidserver/deploy.py -msgid "" -"One of the 'github_releases' config items is missing the 'token' value. " -"skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "其中一个 'github_releases'配置项缺失'projectUrl'值。跳过..." + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "其中一个 'github_releases'配置项缺失'token'值。跳过..." #: ../fdroidserver/update.py @@ -1461,6 +1447,11 @@ msgstr "资源库签名密钥的密钥存储(keystore)路径" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "将秘密变量打印到终端以便于复制/粘贴" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1530,19 +1521,13 @@ msgstr "读取 '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format -msgid "" -"Reading packageName/versionCode/versionName failed, APK invalid: " -"'{apkfilename}'" -msgstr "" -"读取 packageName/versionCode/versionName 失败,APK 无效:'{apkfilename}'" +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "读取 packageName/versionCode/versionName 失败,APK 无效:'{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format -msgid "" -"Reading packageName/versionCode/versionName failed,APK invalid: " -"'{apkfilename}'" -msgstr "" -"读取 packageName/versionCode/versionName 失败,APK 无效:'{apkfilename}'" +msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" +msgstr "读取 packageName/versionCode/versionName 失败,APK 无效:'{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format @@ -1571,9 +1556,7 @@ msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "RepoTrunk 更新模式仅对 git-svn 存储库有意义" #: ../fdroidserver/build.py -msgid "" -"Reset and create a brand new build server, even if the existing one appears " -"to be ok." +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "即使已有服务器看起来运行正常,请重置并创建一个全新的编译服务器。" #: ../fdroidserver/nightly.py @@ -1589,6 +1572,11 @@ msgstr "对超过像素大小上限的全部图标进行尺寸调整,然后退 msgid "Restrict output to warnings and errors" msgstr "仅输出警告和出错信息" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "重写所有元数据文件" @@ -1604,8 +1592,7 @@ msgstr "在具有未提交更改的 git 存储库上运行" #: ../fdroidserver/nightly.py #, python-brace-format -msgid "" -"Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" msgstr "在{cibase}中挨个寻找 -debug.apk,并跳过了仓库目录{repo_basedir}" #: ../fdroidserver/lint.py @@ -1654,6 +1641,10 @@ msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "扫描仪发现 {} 个问题" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." msgstr "使用 dexdump 扫描 APK 以查找已知的非自由类。" @@ -1763,9 +1754,7 @@ msgid "System clock is older than date in {path}!" msgstr "系统时钟早于 {path} 中的日期!" #: ../fdroidserver/checkupdates.py -msgid "" -"Tags update mode only works for git, hg, bzr and git-svn repositories " -"currently" +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "标签更新模式目前仅适用于 git、hg、bzr 和 git-svn 存储库" #: ../fdroidserver/checkupdates.py @@ -1773,9 +1762,7 @@ msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "git-svn 中使用的标记更新模式,但未使用标记设置存储库" #: ../fdroidserver/build.py -msgid "" -"Test mode - put output in the tmp directory only, and always build, even if " -"the output already exists." +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "测试模式:仅将输出保存至 tmp 目录,即使输出已存在,仍然编译。" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode @@ -1814,21 +1801,12 @@ msgid "These are the apps that have been archived from the main repo." msgstr "这些是已从主存储库存档的应用。" #: ../fdroidserver/mirror.py -msgid "" -"This command should never be used to mirror f-droid.org! A full copy " -"requires more than 600GB." +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." msgstr "此命令永远不应该被用来镜像 f-droid.org!完整的拷贝需要至少 600GB。" #: ../fdroidserver/common.py -msgid "" -"This is a repository of apps to be used with F-Droid. Applications in this " -"repository are either official binaries built by the original application " -"developers, or are binaries built from source by the admin of f-droid.org " -"using the tools on https://gitlab.com/fdroid." -msgstr "" -"这是一个与F-Droid一起使用的应用的存储库。这个存储库中的应用要么是原应用开发者" -"构建的官方二进制文件,要么是 f-droid.org 的管理员使用 https://gitlab.com/" -"fdroid 上的工具从源代码构建而来的二进制文件。" +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "这是一个与F-Droid一起使用的应用的存储库。这个存储库中的应用要么是原应用开发者构建的官方二进制文件,要么是 f-droid.org 的管理员使用 https://gitlab.com/fdroid 上的工具从源代码构建而来的二进制文件。" #: ../fdroidserver/import_subcommand.py #, python-format @@ -1855,11 +1833,8 @@ msgstr "" "和 https://f-droid.org/docs/Signing_Process" #: ../fdroidserver/deploy.py -msgid "" -"To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config." -"yml!" -msgstr "" -"要使用 awsbucket,还必须在 config.yml 中设置 awssecretkey 和 awsaccesskeyid!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "要使用 awsbucket,还必须在 config.yml 中设置 awssecretkey 和 awsaccesskeyid!" #: ../fdroidserver/deploy.py msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" @@ -1879,17 +1854,11 @@ msgid "URL {url} in Description: {error}" msgstr "描述中的网址 {url}:{error}" #: ../fdroidserver/lint.py -msgid "" -"Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from " -"https://spdx.org/license-list" -msgstr "" -"意外的许可证标签“{}”!仅使用来自 https://spdx.org/license-list 的 FSF 或 OSI " -"批准的标签" +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "意外的许可证标签“{}”!仅使用来自 https://spdx.org/license-list 的 FSF 或 OSI 批准的标签" #: ../fdroidserver/lint.py -msgid "" -"Unexpected license tag \"{}\"! Only use license tags configured in your " -"config file" +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "意外的许可证标签“{}”!仅使用配置文件中配置的许可证标记" #: ../fdroidserver/common.py @@ -1994,9 +1963,7 @@ msgstr "UpdateCheckData 具有无效的 URL:{url}" #: ../fdroidserver/lint.py #, python-brace-format -msgid "" -"UpdateCheckData must match the version code as integer (\\d or [0-9]): " -"{codeex}" +msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "UpdateCheckData 必须以整数(\\d 或 [0-9])的形式匹配版本代码:{codeex}" #: ../fdroidserver/lint.py @@ -2010,14 +1977,12 @@ msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData 不是有效的网址:{url}" #: ../fdroidserver/lint.py -msgid "" -"UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode 已设置,但看起来尚未运行检查更新。" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "" -"UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" msgstr "UpdateCheckMode 已设置,但看起来尚未运行检查更新" #: ../fdroidserver/lint.py @@ -2048,9 +2013,7 @@ msgid "Usage: %s\n" msgstr "用法:%s\n" #: ../fdroidserver/lint.py -msgid "" -"Use /HEAD instead of /master or /main to point at a file in the default " -"branch" +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "使用 /HEAD 而不是 /master 或 /main 来指向默认分支中的文件" #: ../fdroidserver/lint.py @@ -2092,8 +2055,7 @@ msgid "Using JAR Signature" msgstr "使用 JAR 签名" #: ../fdroidserver/common.py -msgid "" -"Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "不建议使用 Java 的 jar 签名器来验证 APK!使用 apk 签名器" #: ../fdroidserver/common.py @@ -2137,35 +2099,44 @@ msgstr "验证已下载包的完整性" msgid "Verifying index signature:" msgstr "验证目录签名中:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, python-brace-format -msgid "" -"VirusTotal API key cannot upload files larger than 32MB, use {url} to upload " -"{path}." -msgstr "" -"VirusTotal 的 API 密钥无法用于上传大于 32MB 的文件,请使用 {url} 上传 " -"{path}。" +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "VirusTotal 的 API 密钥无法用于上传大于 32MB 的文件,请使用 {url} 上传 {path}。" #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "警告元数据中可能存在的错误" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py -msgid "" -"When configured for signed indexes, create only unsigned indexes at this " -"stage" +msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "如果已配置为使用签名索引,该阶段仅创建未签名索引" #: ../fdroidserver/lint.py -msgid "" -"When linting the entire repository yamllint is disabled by default. This " -"option forces yamllint regardless." +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "对整个版本库进行 lint 时,默认禁用 yamllint。 无论如何,该选项都会强制 yamllint。" #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." msgstr "签名或验证失败时,退出并显示错误代码。" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "生成密钥时使用了X.509 ‘可识别名’" @@ -2178,6 +2149,11 @@ msgstr "您可以使用 ANDROID_HOME 设置 SDK 的路径,也就是说:" msgid "ZIP file archive" msgstr "ZIP 压缩包" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2465,9 +2441,7 @@ msgstr "冲突解决值无效: %r" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format -msgid "" -"invalid option string %(option)r: must start with a character " -"%(prefix_chars)r" +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "无效选项字符串 %(option)r: 必须以字符 %(prefix_chars)r 开头" #: ../fdroidserver/common.py @@ -2481,8 +2455,7 @@ msgstr "最新的构建配方较新:旧的验证码={old},新的验证码={n #: ../fdroidserver/deploy.py #, python-brace-format -msgid "" -"local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "local_copy_dir未以“ fdroid”结尾,也许你指的是:“ {path}”" #: ../fdroidserver/deploy.py @@ -2648,12 +2621,8 @@ msgstr "参考二进制缺少签名" #: ../fdroidserver/signatures.py #, python-brace-format -msgid "" -"refuse downloading via insecure HTTP connection (use HTTPS or specify --no-" -"https-check): {apkfilename}" -msgstr "" -"拒绝通过不安全的 HTTP 连接下载(使用 HTTPS 或指定 --no-https-check): " -"{apkfilename}" +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgstr "拒绝通过不安全的 HTTP 连接下载(使用 HTTPS 或指定 --no-https-check): {apkfilename}" #: ../fdroidserver/index.py #, python-format @@ -2689,11 +2658,8 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "扫描仪缓存畸形! 您可以使用他: '{clear}'" #: ../fdroidserver/deploy.py -msgid "" -"serverwebroot: path does not end with \"fdroid\", perhaps you meant one of " -"these:" -msgstr "" -"serverwebroot:路径没有以 \"fdroid\"结尾,可能你想表达的是这些当中的一个:" +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "serverwebroot:路径没有以 \"fdroid\"结尾,可能你想表达的是这些当中的一个:" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2750,6 +2716,10 @@ msgstr "所提供的参考二进制已允许签名者 {signer}" msgid "the following arguments are required: %s" msgstr "需要此下参数:%s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2791,6 +2761,10 @@ msgstr "正在用Apache libcloud同步{url}" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com正在限制速率,等待重试..." +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2903,6 +2877,11 @@ msgstr "{path}有损坏的签名“{pattern}”,也许是Janus的漏洞!" msgid "{path} has been flagged by virustotal {count} times:" msgstr "{path}被virustotal标记了{count}次:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 8464aedd..5862d6b4 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-09-10 10:50+0200\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" "PO-Revision-Date: 2024-10-30 19:03+0000\n" "Last-Translator: Peter Dave Hello \n" "Language-Team: Chinese (Traditional Han script) \n" @@ -204,6 +204,10 @@ msgstr "{appid} 的 {value}' 為無效 {field}。正規表遠格式:{pattern}" msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "「{value}」不是有效的 {field},應該為 {pattern}" +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" @@ -331,6 +335,14 @@ msgstr "以無效的簽名歸檔 {apkfilename}!" msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode 與 UpdateCheckMode:HTTP 必須有一個模式。" +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" @@ -422,6 +434,10 @@ msgstr "檢查 {appid} 的歸檔 - APKs:{integer},keepversions:{keep},archap msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "清除更新 - 不使用快取,重新處理全部的 APK" +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." msgstr "以逗號分隔類別清單。" @@ -435,6 +451,10 @@ msgstr "無法識別指令「%s」。\n" msgid "Commit changes" msgstr "提交變更" +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" @@ -619,6 +639,10 @@ msgstr "不要更新軟體庫,在沒有網路連線時測試構建很有用" msgid "Don't use rsync checksums" msgstr "不使用 rsync 檢驗和" +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" msgstr "下載小型軟體庫完整的鏡像" @@ -727,6 +751,10 @@ msgstr "從來源儲存庫中提取應用程式元數據" msgid "Extract signatures from APKs" msgstr "自 APKs 捽取出簽名" +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" @@ -1194,6 +1222,10 @@ msgstr "未找到 Android SDK!" msgid "No attached devices found" msgstr "查無附加的設備" +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + #: ../fdroidserver/index.py msgid "No fingerprint in URL." msgstr "在 URL 無指紋。" @@ -1313,14 +1345,14 @@ msgstr "OBB 的套件包名稱與支援的 APK 並不相符:" msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "因為機器是離線的, 跳過 git mirror 的生成直到 `fdroid deploy`" -#: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "其中一個「github_releases」設定項目缺少「projectUrl」值。略過..." - #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "其中一個「github_releases」設定項目缺少「packageNames」值。略過..." +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "其中一個「github_releases」設定項目缺少「projectUrl」值。略過..." + #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "其中一個「github_releases」設定項目缺少「token」值。略過..." @@ -1406,6 +1438,11 @@ msgstr "給軟體庫簽署金鑰的金鑰庫路徑" msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "在終端機顥示祕密變數以便於複製/貼上" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" @@ -1527,6 +1564,11 @@ msgstr "重設超過最大像素的所有圖示之尺寸並且退出" msgid "Restrict output to warnings and errors" msgstr "將輸出限定為警告和錯誤" +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" msgstr "重寫所有的中介資料檔案" @@ -1592,6 +1634,10 @@ msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" msgstr[0] "掃瞄器發現 {} 問題" +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + #: ../fdroidserver/scanner.py #, fuzzy msgid "Scanning APK with dexdump for known non-free classes." @@ -2062,6 +2108,11 @@ msgstr "驗證下載套裝軟體的完整性" msgid "Verifying index signature:" msgstr "正在驗證索引簽名:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." @@ -2071,6 +2122,10 @@ msgstr "VirusTotal API key 無法上傳大於 32MB 的檔案, 選擇使用 {ur msgid "Warn about possible metadata errors" msgstr "關於中介資料可能錯誤的警告" +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "當已組態為簽名的索引時,只能在此階段建立無簽名的索引" @@ -2084,6 +2139,14 @@ msgstr "在默認情況下, 檢查整個軟體庫中的可疑代碼時不會 msgid "When signing or verifying fails, exit with an error code." msgstr "當簽署或驗證失敗時,以錯誤碼結束。" +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" msgstr "產生金鑰時使用 X.509 的'專有名稱'" @@ -2097,6 +2160,11 @@ msgstr "可以使用 ANDROID_HOME 來設定 SDK 的路徑,i.e.:" msgid "ZIP file archive" msgstr "ZIP 壓縮檔案" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" @@ -2678,6 +2746,10 @@ msgstr "提供的參考二進位檔具有允許的簽署者 {signer}" msgid "the following arguments are required: %s" msgstr "需要下列參數:%s" +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py @@ -2720,6 +2792,10 @@ msgstr "使用 Apache libcloud 來同步 {url}" msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "因為 virustotal.com 正在限制收到請求的頻率, 這邊正在等待中, 過一會再試 ..." +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" @@ -2832,6 +2908,11 @@ msgstr "{path} 有不正確的檔案簽章「{pattern}」,可能是 Janus 漏 msgid "{path} has been flagged by virustotal {count} times:" msgstr "{path} 已被 VirusTotal 標記 {count} 次:" +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" From 8a5359ab3f31ac6b39300ac3e4cec7849b452d9f Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 7 Oct 2024 20:50:37 +0200 Subject: [PATCH 1788/2116] scanner: replace deprecated imghdr with libmagic/puremagic libmagic's Python bindings detect more types, puremagic is pure Python. imghdr was dropped in Python 3.13. This reverts commit 3bc246ccad3169fc3662be9a206953de864bb21d. --- fdroidserver/scanner.py | 14 +++++++++++--- setup.py | 1 + 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index def865c0..a3af0260 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import imghdr import itertools import json import logging @@ -35,6 +34,11 @@ from pathlib import Path from tempfile import TemporaryDirectory from typing import Union +try: + import magic +except ImportError: + import puremagic as magic + if sys.version_info >= (3, 11): import tomllib else: @@ -895,8 +899,12 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): ] def is_image_file(path): - if imghdr.what(path) is not None: - return True + try: + mimetype = magic.from_file(path, mime=True) + if mimetype and mimetype.startswith('image/'): + return True + except Exception as e: + logging.info(e) def safe_path(path_in_build_dir): for sp in safe_paths: diff --git a/setup.py b/setup.py index 25df9914..99fbe0fb 100755 --- a/setup.py +++ b/setup.py @@ -100,6 +100,7 @@ setup( 'paramiko', 'Pillow', 'apache-libcloud >= 0.14.1', + 'puremagic', 'python-vagrant', 'PyYAML', 'qrcode', From 1b0fabe8f552eb60a9515367d54bfe7a47e0c476 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 25 Nov 2024 11:57:41 +0100 Subject: [PATCH 1789/2116] install biplist and pycountry by default on macOS * biplist is only used for Apple iOS IPA files. * pycountry is only used for linting countryCodes in mirror configs. Both of these are included via the Debian packaging, where those packages and updates are more vetted. Homebrew for macOS makes it very difficult to include optional dependencies, so this includes the optional dependencies via distutils' method. --- .gitlab-ci.yml | 3 --- setup.py | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 48f62c4a..27455c75 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -392,9 +392,6 @@ macOS: - /bin/bash --version - /bin/bash -n gradlew-fdroid tests/run-tests - # TODO remove the packages below once they are included in the Homebrew package - - $(brew --prefix fdroidserver)/libexec/bin/python3 -m pip install biplist oscrypto pycountry - # test fdroidserver from git with current package's dependencies - fdroid="$(brew --prefix fdroidserver)/libexec/bin/python3 $PWD/fdroid" ./tests/run-tests diff --git a/setup.py b/setup.py index 99fbe0fb..f45d5b81 100755 --- a/setup.py +++ b/setup.py @@ -93,6 +93,8 @@ setup( 'platformdirs', 'androguard >= 3.3.5', 'asn1crypto', + # TODO use biplist on all platforms once IPA support is stable + 'biplist ; sys_platform=="darwin"', 'clint', 'defusedxml', 'GitPython', @@ -101,6 +103,7 @@ setup( 'Pillow', 'apache-libcloud >= 0.14.1', 'puremagic', + 'pycountry ; sys_platform=="darwin"', 'python-vagrant', 'PyYAML', 'qrcode', From bb911bf4f3b3cc178b81ece059fea8bc958c6522 Mon Sep 17 00:00:00 2001 From: Fjuro Date: Mon, 25 Nov 2024 13:57:33 +0000 Subject: [PATCH 1790/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 100.0% (611 of 611 strings) Co-authored-by: Fjuro Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ Translation: F-Droid/F-Droid Server --- locale/cs/LC_MESSAGES/fdroidserver.po | 42 +++++++++++++-------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 758e655c..5e1a6c4b 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -13,7 +13,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-09-22 23:34+0000\n" +"PO-Revision-Date: 2024-11-23 18:58+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" @@ -21,7 +21,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.9-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -209,7 +209,7 @@ msgstr "„{value}“ není platný {field}, měl by to být {pattern}" #: ../fdroidserver/checkupdates.py msgid "--merge-request only runs on a single appid!" -msgstr "" +msgstr "--merge-request beží pouze u jednoho appid!" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -340,11 +340,11 @@ msgstr "AutoUpdateMode s UpdateCheckMode: HTTP musí mít vzor." #: ../fdroidserver/install.py msgid "Automatic no to all prompts." -msgstr "" +msgstr "Automatické ne na všechny výzvy." #: ../fdroidserver/install.py msgid "Automatic yes to all prompts." -msgstr "" +msgstr "Automatické ano na všechny výzvy." #: ../fdroidserver/index.py #, python-brace-format @@ -441,7 +441,7 @@ msgstr "Čistá aktualizace - nepoužívat mezipaměti, znovu zpracovat všechny #: ../fdroidserver/common.py msgid "Color the log output" -msgstr "" +msgstr "Obarvit výstup protokolu" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." @@ -458,7 +458,7 @@ msgstr "Odeslat změny" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "" +msgstr "Commitněte změny, proveďte a push a poté vytvořte žádost o sloučení" #: ../fdroidserver/metadata.py #, python-brace-format @@ -645,7 +645,7 @@ msgstr "Nepoužívat kontrolní součty rsync" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "" +msgstr "Stáhnout F-Droid.apk pomocí zrcadel, která do sítě vypouštějí méně informací" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -757,7 +757,7 @@ msgstr "Extrahovat podpisy ze souborů APK" #: ../fdroidserver/install.py msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "" +msgstr "F-Droid.apk se nepodařilo stáhnout z žádného známého zdroje!" #: ../fdroidserver/update.py #, python-brace-format @@ -1219,7 +1219,7 @@ msgstr "Nebyla nalezena žádná připojená zařízení" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." -msgstr "" +msgstr "Nenalezena žádná zařízení pro `adb install`! Zapojte prosím alespoň jedno." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1427,7 +1427,7 @@ msgstr "Zobrazit tajnou proměnnou v terminálu pro jednoduché kopírování/vl #: ../fdroidserver/install.py #, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "" +msgstr "Režim ochrany osobních údajů byl povolen na základě vaší lokality ({country_code})." #: ../fdroidserver/scanner.py #, python-format @@ -1552,7 +1552,7 @@ msgstr "Omezit výstup na varování a chyby" #: ../fdroidserver/net.py #, python-format msgid "Retrying failed download: %s" -msgstr "" +msgstr "Opakování nezdařeného stahování: %s" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1622,7 +1622,7 @@ msgstr[2] "Skener našel {} problémů" #: ../fdroidserver/scanner.py msgid "Scanning APK for extra signing blocks." -msgstr "" +msgstr "Skenování APK na další podpisové bloky." #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." @@ -2081,7 +2081,7 @@ msgstr "Ověřování podpisu indexu:" #: ../fdroidserver/install.py #, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "" +msgstr "Ověřování balíčku {path} pomocí apksigner." #: ../fdroidserver/deploy.py #, python-brace-format @@ -2094,7 +2094,7 @@ msgstr "Varovat ohledně možných chyb metadat" #: ../fdroidserver/scanner.py msgid "WebAssembly binary file" -msgstr "" +msgstr "Binární soubor WebAssembly" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2110,11 +2110,11 @@ msgstr "Pokud podpis nebo ověření selže, ukončit proces s chybovým kódem. #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "" +msgstr "Chcete stáhnout a nainstalovat F-Droid.apk skrze adb? (ANO/ne)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "" +msgstr "Chcete stáhnout aplikace z f-droid.org? (ANO/ne)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2131,7 +2131,7 @@ msgstr "Archiv souborů ZIP" #: ../fdroidserver/install.py #, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "" +msgstr "adb hlásí, že {serial} je „{status}“!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2701,7 +2701,7 @@ msgstr "jsou vyžadovány následující argumenty: %s" #: ../fdroidserver/install.py msgid "true" -msgstr "" +msgstr "pravda" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2746,7 +2746,7 @@ msgstr "virustotal.com omezuje rychlost, čekám na opětovný pokus..." #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "ano" #: ../fdroidserver/publish.py #, python-brace-format @@ -2865,7 +2865,7 @@ msgstr "{path} byl označen službou VirusTotal {count}krát:" #: ../fdroidserver/install.py #, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "" +msgstr "{path} má nesprávný otisk ({fingerprint})!" #: ../fdroidserver/common.py #, python-brace-format From 696f68a99d45b95490f578631173560b7c42000b Mon Sep 17 00:00:00 2001 From: VfBFan Date: Mon, 25 Nov 2024 13:57:25 +0000 Subject: [PATCH 1791/2116] Translated using Weblate: German (de) by VfBFan Currently translated at 100.0% (611 of 611 strings) Co-authored-by: VfBFan Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 62 +++++++++++++-------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index fd5a1393..7657d5eb 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -27,7 +27,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-09-18 23:55+0000\n" +"PO-Revision-Date: 2024-11-22 21:03+0000\n" "Last-Translator: VfBFan \n" "Language-Team: German \n" "Language: de\n" @@ -35,7 +35,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.9-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -222,7 +222,7 @@ msgstr "'{value}' ist kein gültiges {field}, sollte {pattern} sein" #: ../fdroidserver/checkupdates.py msgid "--merge-request only runs on a single appid!" -msgstr "" +msgstr "--merge-request läuft nur auf einer einzigen App-ID!" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -353,11 +353,11 @@ msgstr "AutoUpdateMode mit UpdateCheckMode: HTTP muss ein Muster haben." #: ../fdroidserver/install.py msgid "Automatic no to all prompts." -msgstr "" +msgstr "Automatisches Nein zu allen Aufforderungen." #: ../fdroidserver/install.py msgid "Automatic yes to all prompts." -msgstr "" +msgstr "Automatisches Ja zu allen Aufforderungen." #: ../fdroidserver/index.py #, python-brace-format @@ -398,7 +398,7 @@ msgstr "Build durch „fdroid import” erstellt - Entfernen Sie die Zeile „De #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" -msgstr "Build Metadaten Git Repo hat nicht committete Änderungen!" +msgstr "Build-Metadaten-Git-Repo hat nicht committete Änderungen!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" @@ -453,7 +453,7 @@ msgstr "Sauber aktualisieren - ohne Verwendung der Zwischenspeicher, alle APKs w #: ../fdroidserver/common.py msgid "Color the log output" -msgstr "" +msgstr "Einfärben der Protokollausgabe" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." @@ -466,11 +466,11 @@ msgstr "Befehl '%s' nicht erkannt.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" -msgstr "Änderungen übergeben" +msgstr "Änderungen committen" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "" +msgstr "Änderungen committen, pushen und dann eine Merge-Anfrage stellen" #: ../fdroidserver/metadata.py #, python-brace-format @@ -657,7 +657,7 @@ msgstr "Keine rsync-Prüfsummen verwenden" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "" +msgstr "F-Droid.apk über Spiegelserver herunterladen, die weniger Datenlecks ins Netzwerk haben" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -769,7 +769,7 @@ msgstr "Signaturen aus APKs extrahieren" #: ../fdroidserver/install.py msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "" +msgstr "F-Droid.apk konnte von keiner bekannten Quelle heruntergeladen werden!" #: ../fdroidserver/update.py #, python-brace-format @@ -873,7 +873,7 @@ msgstr "Schlechte Finanzierungsdatei \"{path}\" für \"{name}\" gefunden:" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" -msgstr "Ungültige Appids in Argumenten gefunden" +msgstr "Ungültige App-IDs in Argumenten gefunden" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py @@ -1231,7 +1231,7 @@ msgstr "Keine angeschlossenen Geräte gefunden" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." -msgstr "" +msgstr "Keine Geräte für `adb install` gefunden! Bitte schließen Sie eines an." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1439,7 +1439,7 @@ msgstr "Drucken der geheimen Variable in das Terminal zum einfachen Kopieren/Ein #: ../fdroidserver/install.py #, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "" +msgstr "Der Datenschutzmodus wurde auf der Grundlage Ihres Gebietsschemas ({country_code}) aktiviert." #: ../fdroidserver/scanner.py #, python-format @@ -1488,7 +1488,7 @@ msgstr "Binäres Transparenz-Log nach {url} pushen" #: ../fdroidserver/deploy.py msgid "Pushing to remote server failed!" -msgstr "Schieben zum Remote-Server fehlgeschlagen!" +msgstr "Pushen zum Remote-Server fehlgeschlagen!" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1564,7 +1564,7 @@ msgstr "Ausgabe auf Warnungen und Fehler beschränken" #: ../fdroidserver/net.py #, python-format msgid "Retrying failed download: %s" -msgstr "" +msgstr "Wiederholung des fehlgeschlagenen Downloads: %s" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1604,7 +1604,7 @@ msgstr "SHA-256 von {url} stimmt nicht mit Eintrag überein!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "Scannen Sie die entstandene(n) APK(s) nach bekannten non-free-Klassen." +msgstr "Die resultierende(n) APK(s) auf bekannte nicht-quelloffene Klassen scannen." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" @@ -1633,11 +1633,11 @@ msgstr[1] "Scanner fand {count} Probleme" #: ../fdroidserver/scanner.py msgid "Scanning APK for extra signing blocks." -msgstr "" +msgstr "APK auf zusätzliche Signierblöcke scannen." #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." -msgstr "APK mit dexdump nach bekannten nicht-quelloffenen Klassen scannen." +msgstr "APK mit dexdump auf bekannte nicht-quelloffene Klassen scannen." #: ../fdroidserver/common.py #, python-brace-format @@ -2079,7 +2079,7 @@ msgstr "Gültige Befehle sind:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." -msgstr "Vergleichen Sie mit lokal zwischengespeicherter Kopie, anstatt erneut herunterzuladen." +msgstr "Lokal zwischengespeicherte Kopie vergleichen, anstatt erneut herunterzuladen." #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" @@ -2087,12 +2087,12 @@ msgstr "Integrität der heruntergeladenen Programmpakete überprüfen" #: ../fdroidserver/index.py msgid "Verifying index signature:" -msgstr "Überprüfe die Index-Signatur:" +msgstr "Überprüfen der Index-Signatur:" #: ../fdroidserver/install.py #, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "" +msgstr "Überprüfen des Pakets {path} mit apksigner." #: ../fdroidserver/deploy.py #, python-brace-format @@ -2105,7 +2105,7 @@ msgstr "Vor möglichen Metadaten-Fehlern warnen" #: ../fdroidserver/scanner.py msgid "WebAssembly binary file" -msgstr "" +msgstr "WebAssembly-Binärdatei" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2121,11 +2121,11 @@ msgstr "Wenn das Signieren oder Verifizieren fehlschlägt, wird der Vorgang mit #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "" +msgstr "Möchten Sie F-Droid.apk über adb herunterladen und installieren? (JA/nein)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "" +msgstr "Möchten Sie die App(s) von f-droid.org herunterladen? (JA/nein)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2142,12 +2142,12 @@ msgstr "ZIP-Dateiarchiv" #: ../fdroidserver/install.py #, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "" +msgstr "adb meldet {serial} ist „{status}“!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" -msgstr "Füge IdentityFile zu {path} hinzu" +msgstr "IdentityFile zu {path} hinzufügen" #: ../fdroidserver/update.py #, python-brace-format @@ -2605,7 +2605,7 @@ msgstr "Positionsparameter" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" -msgstr "Bereitstellen des Process Log {path} auf {dest} ist fehlgeschlagen!" +msgstr "Bereitstellen des Verarbeitungsprotokolls {path} auf {dest} ist fehlgeschlagen!" #: ../fdroidserver/build.py msgid "reference binary missing signature" @@ -2710,7 +2710,7 @@ msgstr "die folgenden Argumente sind erforderlich: %s" #: ../fdroidserver/install.py msgid "true" -msgstr "" +msgstr "wahr" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2755,7 +2755,7 @@ msgstr "virustotal.com limitiert die Zugriffe, warte auf Wiederholung …" #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "ja" #: ../fdroidserver/publish.py #, python-brace-format @@ -2873,7 +2873,7 @@ msgstr "{path} wurde von virustotal {count} Mal markiert:" #: ../fdroidserver/install.py #, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "" +msgstr "{path} hat den falschen Fingerabdruck {fingerprint}!" #: ../fdroidserver/common.py #, python-brace-format From a9c9825727221d236617239a4d735b4035444547 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Mon, 25 Nov 2024 13:57:22 +0000 Subject: [PATCH 1792/2116] Translated using Weblate: Spanish (es) by gallegonovato Currently translated at 100.0% (611 of 611 strings) Co-authored-by: gallegonovato Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ Translation: F-Droid/F-Droid Server --- locale/es/LC_MESSAGES/fdroidserver.po | 42 +++++++++++++-------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index a9c6e85e..050b07e7 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -18,7 +18,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-09-10 13:17+0000\n" +"PO-Revision-Date: 2024-11-21 23:18+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" "Language: es\n" @@ -26,7 +26,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.9-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -213,7 +213,7 @@ msgstr "'{value}' no es un {field} válido, debería ser {pattern}" #: ../fdroidserver/checkupdates.py msgid "--merge-request only runs on a single appid!" -msgstr "" +msgstr "¡--merge-request solo se ejecuta en un único ID de aplicación!" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -344,11 +344,11 @@ msgstr "AutoUpdateMode con UpdateCheckMode: el HTTP debe tener un patrón." #: ../fdroidserver/install.py msgid "Automatic no to all prompts." -msgstr "" +msgstr "No automático a todos las solicitudes." #: ../fdroidserver/install.py msgid "Automatic yes to all prompts." -msgstr "" +msgstr "No automático a todos los avisos." #: ../fdroidserver/index.py #, python-brace-format @@ -444,7 +444,7 @@ msgstr "Actualización limpia, no usa la caché, procesa todas las APKs" #: ../fdroidserver/common.py msgid "Color the log output" -msgstr "" +msgstr "Colorear el registro de salida" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." @@ -461,7 +461,7 @@ msgstr "Aplicar cambios" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "" +msgstr "Confirmar los cambios, empujar, a continuación, hacer una solicitud de fusión" #: ../fdroidserver/metadata.py #, python-brace-format @@ -648,7 +648,7 @@ msgstr "No use rsync checksums" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "" +msgstr "Descarga F-Droid.apk usando espejos que filtren menos a la red" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -760,7 +760,7 @@ msgstr "Extraer firmas de APKs" #: ../fdroidserver/install.py msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "" +msgstr "¡F-Droid.apk no pudo ser descargado de ninguna fuente conocida!" #: ../fdroidserver/update.py #, python-brace-format @@ -1222,7 +1222,7 @@ msgstr "No se han encontrado dispositivos asociados" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." -msgstr "" +msgstr "¡No se han encontrado dispositivos para `adb install`! Por favor, conecte uno." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1430,7 +1430,7 @@ msgstr "Mostrar la variable secreta en el terminal para copiar/pegar fácilmente #: ../fdroidserver/install.py #, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "" +msgstr "Se ha activado el modo de privacidad en función de su configuración regional ({country_code})." #: ../fdroidserver/scanner.py #, python-format @@ -1555,7 +1555,7 @@ msgstr "Restringir los resultados a advertencias y errores" #: ../fdroidserver/net.py #, python-format msgid "Retrying failed download: %s" -msgstr "" +msgstr "Reintentando descarga fallida: %s" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1624,7 +1624,7 @@ msgstr[1] "El escáner encontró {} problemas" #: ../fdroidserver/scanner.py msgid "Scanning APK for extra signing blocks." -msgstr "" +msgstr "Escaneando el APK en busca de bloques de firma adicionales." #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." @@ -2083,7 +2083,7 @@ msgstr "Verificar el índice de la firma:" #: ../fdroidserver/install.py #, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "" +msgstr "Verificando el paquete {path} con apksigner." #: ../fdroidserver/deploy.py #, python-brace-format @@ -2096,7 +2096,7 @@ msgstr "Alertar sobre posibles errores de metadatos" #: ../fdroidserver/scanner.py msgid "WebAssembly binary file" -msgstr "" +msgstr "Archivo binario WebAssembly" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2112,11 +2112,11 @@ msgstr "Cuando falla la firma o la verificación, sale con un código de error." #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "" +msgstr "¿Desea descargar e instalar F-Droid.apk mediante adb? (SÍ/no)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "" +msgstr "¿Desea descargar la(s) aplicación(es) de f-droid.org? (SÍ/no)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2133,7 +2133,7 @@ msgstr "Archivo de ficheros ZIP" #: ../fdroidserver/install.py #, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "" +msgstr "¡adb informa que {serial} es \"{status}\"!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2701,7 +2701,7 @@ msgstr "se requieren los siguientes argumentos: %s" #: ../fdroidserver/install.py msgid "true" -msgstr "" +msgstr "verdadero" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2746,7 +2746,7 @@ msgstr "virustotal.com está limitando el consumo, esperando para reintentar..." #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "sí" #: ../fdroidserver/publish.py #, python-brace-format @@ -2864,7 +2864,7 @@ msgstr "{path} ha sido marcado por virustotal {count} veces:" #: ../fdroidserver/install.py #, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "" +msgstr "¡{path} tiene la huella incorrecta ({fingerprint})!" #: ../fdroidserver/common.py #, python-brace-format From 13db3f70180f2fb1ca7270db16a0b3252b7ad5b5 Mon Sep 17 00:00:00 2001 From: Sylvain Pichon Date: Mon, 25 Nov 2024 13:57:27 +0000 Subject: [PATCH 1793/2116] Translated using Weblate: French (fr) by Sylvain Pichon Currently translated at 92.6% (566 of 611 strings) Translated using Weblate: French (fr) by Sylvain Pichon Currently translated at 92.1% (563 of 611 strings) Co-authored-by: Sylvain Pichon Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index d22b1fa5..e15fc524 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -37,13 +37,14 @@ # Deleted User , 2023. # Christopher Forzy , 2024. # Phantomwise , 2024. +# Sylvain Pichon , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-11-19 13:04+0000\n" -"Last-Translator: Phantomwise \n" +"PO-Revision-Date: 2024-11-23 10:38+0000\n" +"Last-Translator: Sylvain Pichon \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -131,9 +132,9 @@ msgid "%(prog)s: error: %(message)s\n" msgstr "%(prog)s : erreur : %(message)s\n" #: ../fdroidserver/publish.py -#, fuzzy, python-format +#, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "%d APK n'ont pas pu être signés ou vérifiés !" +msgstr "Les APK %d n'ont pas pu être signés ou vérifiés !" #: ../fdroidserver/scanner.py #, python-format @@ -237,7 +238,7 @@ msgstr "'{value}' n'est pas un(e) {field} valide et devrait être {pattern}" #: ../fdroidserver/checkupdates.py msgid "--merge-request only runs on a single appid!" -msgstr "" +msgstr "--merge-request fonctionne seulement sur un unique appid !" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -261,7 +262,7 @@ msgstr "Une URL est requise en argument !" #: ../fdroidserver/common.py #, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "" +msgstr "Les signatures des APK ont des certificats différents dans {path} :" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" @@ -341,9 +342,8 @@ msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode msgstr "L'application a NoSourceSince ou ArchivePolicy « 0 version » mais AutoUpdateMode ou UpdateCheckMode ne valent pas None" #: ../fdroidserver/lint.py -#, fuzzy msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "L'application a NoSourceSince ou ArchivePolicy « 0 version » mais AutoUpdateMode ou UpdateCheckMode ne valent pas None" +msgstr "L'application a NoSourceSince ou ArchivePolicy à « 0 version » mais AutoUpdateMode ou UpdateCheckMode ne valent pas None" #: ../fdroidserver/lint.py #, python-brace-format @@ -369,11 +369,11 @@ msgstr "AutoUpdateMode avec UpdateCheckMode : HTTP doit avoir un modèle." #: ../fdroidserver/install.py msgid "Automatic no to all prompts." -msgstr "" +msgstr "Répondre automatiquement Non à toutes les demandes." #: ../fdroidserver/install.py msgid "Automatic yes to all prompts." -msgstr "" +msgstr "Répondre automatiquement Oui à toutes les demandes." #: ../fdroidserver/index.py #, python-brace-format @@ -486,7 +486,7 @@ msgstr "Sauvegarder les changements (commit)" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "" +msgstr "Sauvegarder les changements, les pousser sur le dépôt et faire une demande d'intégration" #: ../fdroidserver/metadata.py #, python-brace-format From 8ee15b9cac138c52928b1e38a06f5df8e9fd6818 Mon Sep 17 00:00:00 2001 From: Sylvain Pichon Date: Mon, 25 Nov 2024 13:57:35 +0000 Subject: [PATCH 1794/2116] Translated using Weblate: French (fr) by Sylvain Pichon Currently translated at 92.7% (567 of 611 strings) Co-authored-by: Sylvain Pichon Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index e15fc524..6b62162b 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -38,13 +38,14 @@ # Christopher Forzy , 2024. # Phantomwise , 2024. # Sylvain Pichon , 2024. +# Sylvain Pichon , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-11-23 10:38+0000\n" -"Last-Translator: Sylvain Pichon \n" +"PO-Revision-Date: 2024-11-24 18:41+0000\n" +"Last-Translator: Sylvain Pichon \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -469,7 +470,7 @@ msgstr "Mise à jour propre — n'utilise pas les caches, traite à nouveau tous #: ../fdroidserver/common.py msgid "Color the log output" -msgstr "" +msgstr "Colorer l'affichage des journaux" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." From 46dd2227e9745810295f634cf55238c33af54c8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Mon, 25 Nov 2024 13:57:30 +0000 Subject: [PATCH 1795/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Irish?= =?UTF-8?q?=20(ga)=20by=20Aindri=C3=BA=20Mac=20Giolla=20Eoin=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (611 of 611 strings) Co-authored-by: Aindriú Mac Giolla Eoin Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ga/ Translation: F-Droid/F-Droid Server --- locale/ga/LC_MESSAGES/fdroidserver.po | 42 +++++++++++++-------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/locale/ga/LC_MESSAGES/fdroidserver.po b/locale/ga/LC_MESSAGES/fdroidserver.po index 9b9b7f57..af75f5d8 100644 --- a/locale/ga/LC_MESSAGES/fdroidserver.po +++ b/locale/ga/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.3a1-162-gfbb3cc59\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-09-13 23:36+0000\n" +"PO-Revision-Date: 2024-11-22 21:03+0000\n" "Last-Translator: Aindriú Mac Giolla Eoin \n" "Language-Team: Irish \n" "Language: ga\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :(n>6 && n<11) ? 3 : 4;\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.9-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -204,7 +204,7 @@ msgstr "Ní '{field} bailí é '{value}', ba chóir go mbeadh {pattern}" #: ../fdroidserver/checkupdates.py msgid "--merge-request only runs on a single appid!" -msgstr "" +msgstr "Ní ritheann --merge-request ach ar aip amháin!" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -335,11 +335,11 @@ msgstr "AutoUpdateMode le UpdateCheckMode: Caithfidh patrún a bheith ag HTTP." #: ../fdroidserver/install.py msgid "Automatic no to all prompts." -msgstr "" +msgstr "Uimh uathoibríoch do gach leideanna." #: ../fdroidserver/install.py msgid "Automatic yes to all prompts." -msgstr "" +msgstr "Tá go huathoibríoch le gach leideanna." #: ../fdroidserver/index.py #, python-brace-format @@ -438,7 +438,7 @@ msgstr "Nuashonrú glan - ná húsáid taisce, athphróiseáil gach APKs" #: ../fdroidserver/common.py msgid "Color the log output" -msgstr "" +msgstr "Dathaigh an t-aschur loga" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." @@ -455,7 +455,7 @@ msgstr "Cuir athruithe i bhfeidhm" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "" +msgstr "Déan athruithe, brúigh, ansin déan iarratas cumaisc" #: ../fdroidserver/metadata.py #, python-brace-format @@ -642,7 +642,7 @@ msgstr "Ná húsáid seiceálacha rsync" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "" +msgstr "Íoslódáil F-Droid.apk ag baint úsáide as scátháin a sceitheann níos lú don líonra" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -754,7 +754,7 @@ msgstr "Sleachta sínithe ó APKs" #: ../fdroidserver/install.py msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "" +msgstr "Níorbh fhéidir F-Droid.apk a íoslódáil ó fhoinse aitheanta ar bith!" #: ../fdroidserver/update.py #, python-brace-format @@ -1216,7 +1216,7 @@ msgstr "Níor aimsíodh aon ghléas ceangailte" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." -msgstr "" +msgstr "Níor aimsíodh aon ghléas le haghaidh `adb install`! Cuir ceann isteach le do thoil." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1424,7 +1424,7 @@ msgstr "Priontáil an athróg rúnda chuig an teirminéal le haghaidh cóip / gr #: ../fdroidserver/install.py #, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "" +msgstr "Cumasaíodh mód príobháideachta bunaithe ar do logán ({country_code})." #: ../fdroidserver/scanner.py #, python-format @@ -1549,7 +1549,7 @@ msgstr "Cuir srian le haschur le rabhaidh agus earráidí" #: ../fdroidserver/net.py #, python-format msgid "Retrying failed download: %s" -msgstr "" +msgstr "Theip ar íosluchtú arís: %s" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1621,7 +1621,7 @@ msgstr[4] "Fuair an scanóir {} fadhbanna" #: ../fdroidserver/scanner.py msgid "Scanning APK for extra signing blocks." -msgstr "" +msgstr "Scanadh APK le haghaidh bloic sínithe breise." #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." @@ -2080,7 +2080,7 @@ msgstr "Síniú an innéacs á fhíorú:" #: ../fdroidserver/install.py #, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "" +msgstr "Pacáiste {path} á fhíorú le apksigner." #: ../fdroidserver/deploy.py #, python-brace-format @@ -2093,7 +2093,7 @@ msgstr "Tabhair rabhadh faoi earráidí meiteashonraí a d'fhéadfadh a bheith a #: ../fdroidserver/scanner.py msgid "WebAssembly binary file" -msgstr "" +msgstr "Comhad dénártha WebAssembly" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2109,11 +2109,11 @@ msgstr "Nuair a theipeann ar shíniú nó ar fhíorú, scoir le cód earráide." #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "" +msgstr "Ar mhaith leat F-Droid.apk a íoslódáil agus a shuiteáil trí adb? (TÁ/Níl)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "" +msgstr "Ar mhaith leat na haipeanna/na haipeanna a íoslódáil ó f-droid.org? (TÁ/Níl)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2130,7 +2130,7 @@ msgstr "Cartlann comhad ZIP" #: ../fdroidserver/install.py #, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "" +msgstr "tuarascálacha adb {serial} is \"{status}\"!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2704,7 +2704,7 @@ msgstr "Tá na hargóintí seo a leanas ag teastáil: %s" #: ../fdroidserver/install.py msgid "true" -msgstr "" +msgstr "fíor" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2749,7 +2749,7 @@ msgstr "Tá virustotal.com ag teorannú ráta, ag fanacht le triail a bhaint as #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "tá" #: ../fdroidserver/publish.py #, python-brace-format @@ -2870,7 +2870,7 @@ msgstr "{path} curtha faoi bhratach ag virustotal {count} times:" #: ../fdroidserver/install.py #, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "" +msgstr "Tá an méarloirg mícheart ag {path} ({fingerprint})!" #: ../fdroidserver/common.py #, python-brace-format From 04f8058dfc3d1b507f43a7030282712681c29c53 Mon Sep 17 00:00:00 2001 From: LucasMZ Date: Mon, 25 Nov 2024 13:57:32 +0000 Subject: [PATCH 1796/2116] Translated using Weblate: Portuguese (Brazil) (pt_BR) by LucasMZ Currently translated at 97.7% (597 of 611 strings) Co-authored-by: LucasMZ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/ Translation: F-Droid/F-Droid Server --- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 6dadacc0..f34c4ff2 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -12,20 +12,21 @@ # lucasmz-dev , 2024. # Jose Delvani , 2024. # Jose Delvani , 2024. +# LucasMZ , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-09-10 13:17+0000\n" -"Last-Translator: Jose Delvani \n" +"PO-Revision-Date: 2024-11-23 10:38+0000\n" +"Last-Translator: LucasMZ \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.9-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -212,7 +213,7 @@ msgstr "'{value}' não é um {field} válido, deveria ser {pattern}" #: ../fdroidserver/checkupdates.py msgid "--merge-request only runs on a single appid!" -msgstr "" +msgstr "--merge-request roda somente com um único appid!" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -343,11 +344,11 @@ msgstr "AutoUpdateMode com atualização CheckMode: HTTP deve ter um padrão." #: ../fdroidserver/install.py msgid "Automatic no to all prompts." -msgstr "" +msgstr "Não automático à todas as perguntas." #: ../fdroidserver/install.py msgid "Automatic yes to all prompts." -msgstr "" +msgstr "Sim automático à todas as perguntas." #: ../fdroidserver/index.py #, python-brace-format @@ -443,7 +444,7 @@ msgstr "Atualização limpa - não utiliza o cache, reprocessa todos os APKs" #: ../fdroidserver/common.py msgid "Color the log output" -msgstr "" +msgstr "Colorir a saída de registros" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." @@ -460,7 +461,7 @@ msgstr "Enviar mudanças" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "" +msgstr "Fazer commit das mudanças, push, e então faça uma merge request" #: ../fdroidserver/metadata.py #, python-brace-format From 4b53f4b1d3f362d83b1c6b965571ac3ba99cb701 Mon Sep 17 00:00:00 2001 From: dedakir923 Date: Mon, 25 Nov 2024 13:57:37 +0000 Subject: [PATCH 1797/2116] Translated using Weblate: Portuguese (Brazil) (pt_BR) by dedakir923 Currently translated at 100.0% (611 of 611 strings) Co-authored-by: dedakir923 Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/ Translation: F-Droid/F-Droid Server --- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 33 ++++++++++++------------ 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index f34c4ff2..1eddfafe 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -13,13 +13,14 @@ # Jose Delvani , 2024. # Jose Delvani , 2024. # LucasMZ , 2024. +# dedakir923 , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-11-23 10:38+0000\n" -"Last-Translator: LucasMZ \n" +"PO-Revision-Date: 2024-11-25 13:28+0000\n" +"Last-Translator: dedakir923 \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" @@ -648,7 +649,7 @@ msgstr "Não usar as somas de verificação (checksums) do rsync" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "" +msgstr "Faça o download do F-Droid.apk usando mirrors (sites espelhos) que vazam menos privacidade na rede" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -760,7 +761,7 @@ msgstr "Extrair assinaturas de APKs" #: ../fdroidserver/install.py msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "" +msgstr "F-Droid.apk não pode ser baixado de nenhuma fonte conhecida!" #: ../fdroidserver/update.py #, python-brace-format @@ -1222,7 +1223,7 @@ msgstr "Nenhum dispositivo conectado encontrado" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." -msgstr "" +msgstr "Nenhum dispositivo foi encontrado usando o comando `adb install`! Por favor, conecte um." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1430,7 +1431,7 @@ msgstr "Imprima a variável secreta no terminal para facilitar a cópia/colagem" #: ../fdroidserver/install.py #, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "" +msgstr "O modo de privacidade foi ativado com base em sua localidade ({country_code})." #: ../fdroidserver/scanner.py #, python-format @@ -1555,7 +1556,7 @@ msgstr "Restringir a saída a erros e avisos" #: ../fdroidserver/net.py #, python-format msgid "Retrying failed download: %s" -msgstr "" +msgstr "Nova tentativa de download com falha: %s" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1624,7 +1625,7 @@ msgstr[1] "O Scanner encontrou {} problemas" #: ../fdroidserver/scanner.py msgid "Scanning APK for extra signing blocks." -msgstr "" +msgstr "Verificando o APK em busca de blocos de assinatura adicionais." #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." @@ -2083,7 +2084,7 @@ msgstr "Verificar o índice de assinatura:" #: ../fdroidserver/install.py #, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "" +msgstr "Verificando o pacote {path} com apksigner." #: ../fdroidserver/deploy.py #, python-brace-format @@ -2096,7 +2097,7 @@ msgstr "Avisa sobre possíveis erros de metadados" #: ../fdroidserver/scanner.py msgid "WebAssembly binary file" -msgstr "" +msgstr "Arquivo binário WebAssembly" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2112,11 +2113,11 @@ msgstr "Ao assinar ou verificar falhar, um código de erro será lançado." #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "" +msgstr "Gostaria de baixar e instalar F-Droid.apk via adb? (SIM/NÃO)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "" +msgstr "Gostaria de baixar aplicativo(s) de f-droid.org? (SIM/NÃO)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2133,7 +2134,7 @@ msgstr "Arquivo ZIP" #: ../fdroidserver/install.py #, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "" +msgstr "O adb informa que {serial} é \"{status}\"!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2701,7 +2702,7 @@ msgstr "os seguintes argumentos são necessários: %s" #: ../fdroidserver/install.py msgid "true" -msgstr "" +msgstr "verdadeiro" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2746,7 +2747,7 @@ msgstr "o virustotal.com está limitando a taxa, esperando para tentar novamente #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "sim" #: ../fdroidserver/publish.py #, python-brace-format @@ -2864,7 +2865,7 @@ msgstr "{path} foi sinalizado pelo virustotal {count} vezes:" #: ../fdroidserver/install.py #, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "" +msgstr "{path} tem a impressão digital errada ({fingerprint})!" #: ../fdroidserver/common.py #, python-brace-format From e162278143efe09938bf56369c51176998a4dd45 Mon Sep 17 00:00:00 2001 From: gfbdrgng Date: Mon, 25 Nov 2024 13:57:38 +0000 Subject: [PATCH 1798/2116] Translated using Weblate: Russian (ru) by gfbdrgng Currently translated at 98.3% (601 of 611 strings) Co-authored-by: gfbdrgng Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translation: F-Droid/F-Droid Server --- locale/ru/LC_MESSAGES/fdroidserver.po | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 5f96fc0a..68dd0ea1 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -20,15 +20,15 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-10-27 03:53+0000\n" -"Last-Translator: Golubev Alexander \n" +"PO-Revision-Date: 2024-11-25 13:57+0000\n" +"Last-Translator: gfbdrgng \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.8.2-dev\n" +"X-Generator: Weblate 5.9-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -216,7 +216,7 @@ msgstr "'{value}' не является допустимым {field}, должн #: ../fdroidserver/checkupdates.py msgid "--merge-request only runs on a single appid!" -msgstr "" +msgstr "--merge-request работает только с одним appid!" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -347,11 +347,11 @@ msgstr "AutoUpdateMode с UpdateCheckMode: HTTP должен иметь шабл #: ../fdroidserver/install.py msgid "Automatic no to all prompts." -msgstr "" +msgstr "Автоматическое \"нет\" на все запросы." #: ../fdroidserver/install.py msgid "Automatic yes to all prompts." -msgstr "" +msgstr "Автоматическое \"да\" на все запросы." #: ../fdroidserver/index.py #, python-brace-format @@ -448,7 +448,7 @@ msgstr "Очистка с обновлением: не использовать #: ../fdroidserver/common.py msgid "Color the log output" -msgstr "" +msgstr "Раскрасьте вывод журнала" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." @@ -465,7 +465,7 @@ msgstr "Сохранить изменения (commit)" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "" +msgstr "Зафиксируйте изменения, вытолкните, затем сделайте запрос на слияние" #: ../fdroidserver/metadata.py #, python-brace-format @@ -652,7 +652,7 @@ msgstr "Не использовать контрольные суммы rsync" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "" +msgstr "Загрузите F-Droid.apk с помощью зеркал, которые меньше просачиваются в сеть" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -764,7 +764,7 @@ msgstr "Извлечь подписи из APK файлов" #: ../fdroidserver/install.py msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "" +msgstr "F-Droid.apk не может быть загружен ни из одного известного источника!" #: ../fdroidserver/update.py #, python-brace-format @@ -1226,7 +1226,7 @@ msgstr "Подключенных устройств не найдено" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." -msgstr "" +msgstr "Для `adb install` не найдено ни одного устройства! Пожалуйста, подключите одно." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1434,7 +1434,7 @@ msgstr "Отобразить секретную переменную в терм #: ../fdroidserver/install.py #, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "" +msgstr "Режим конфиденциальности был включен в соответствии с вашей локалью ({country_code})." #: ../fdroidserver/scanner.py #, python-format From e61ee39ee4b3743e08f2fe5b8b82ccdf7c7ee8cc Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Mon, 25 Nov 2024 13:57:23 +0000 Subject: [PATCH 1799/2116] Translated using Weblate: Albanian (sq) by Besnik Bleta Currently translated at 97.5% (596 of 611 strings) Co-authored-by: Besnik Bleta Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/ Translation: F-Droid/F-Droid Server --- locale/sq/LC_MESSAGES/fdroidserver.po | 46 +++++++++++++-------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index 309b5084..b3cc3589 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-09-12 00:02+0000\n" +"PO-Revision-Date: 2024-11-22 05:58+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" "Language: sq\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.9-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -202,7 +202,7 @@ msgstr "'{value}' s’është një {field} e vlefshme, duhet të jetë {pattern} #: ../fdroidserver/checkupdates.py msgid "--merge-request only runs on a single appid!" -msgstr "" +msgstr "--merge-request xhiron vetëm me një appid!" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -251,7 +251,7 @@ msgstr "Alias i kyçit të nënshkrimeve të depos te depo kyçesh" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "Mungon AllowedAPKSigningKeys, por u dha dyor reference" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" @@ -333,11 +333,11 @@ msgstr "AutoUpdateMode me UpdateCheckMode: HTTP duhet të ketë një rregullsi." #: ../fdroidserver/install.py msgid "Automatic no to all prompts." -msgstr "" +msgstr "“Jo” e automatizuar për krejt hapat." #: ../fdroidserver/install.py msgid "Automatic yes to all prompts." -msgstr "" +msgstr "“Po” e automatizuar për krejt hapat." #: ../fdroidserver/index.py #, python-brace-format @@ -433,7 +433,7 @@ msgstr "Përditësim nha e para - mos përdor fshehtina, ripërpuno krejt APK-t #: ../fdroidserver/common.py msgid "Color the log output" -msgstr "" +msgstr "Ngjyros ç’jep regjistri" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." @@ -450,7 +450,7 @@ msgstr "Depozito ndryshimet" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "" +msgstr "Parashtro ndryshimet, depozitoji, mandej bëj një kërkesë për përzierje" #: ../fdroidserver/metadata.py #, python-brace-format @@ -637,7 +637,7 @@ msgstr "Mos përdorni checksum-e rsync-u" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "" +msgstr "Shkarkojeni F-Droid.apk duke përdorur pasqyra që kanë më pak rrjedhje te rrjeti" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -749,7 +749,7 @@ msgstr "Përfto nënshkrime prej APK-sh" #: ../fdroidserver/install.py msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "" +msgstr "F-Droid.apk s’u shkarkua dot nga ndonjë burim i njohur!" #: ../fdroidserver/update.py #, python-brace-format @@ -1211,7 +1211,7 @@ msgstr "S’u gjetën pajisje të bashkëngjitura" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." -msgstr "" +msgstr "S’u gjetën pajisje për `adb install`! Ju lutemi, vendosni një të tillë." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1419,7 +1419,7 @@ msgstr "Shtype ndryshoren e fshehtë te terminali, për kopjim/ngjitje të kolla #: ../fdroidserver/install.py #, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "" +msgstr "Mënyra “Privatësi” qe aktivizuar bazuar në vendoren tuaj ({country_code})." #: ../fdroidserver/scanner.py #, python-format @@ -1544,7 +1544,7 @@ msgstr "Kufizoje output-in në sinjalizime dhe gabime" #: ../fdroidserver/net.py #, python-format msgid "Retrying failed download: %s" -msgstr "" +msgstr "Po riprovohet shkarkim i dështuar: %s" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1562,7 +1562,7 @@ msgstr "Xhirojeni në depo git që ka ndryshime të padepozituara te dega vendor #: ../fdroidserver/nightly.py #, python-brace-format msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" -msgstr "" +msgstr "Kalo nëpër {cibase} për të gjetur -debug.apk. dhe anashkalo repo_basedir {repo_basedir}" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1613,7 +1613,7 @@ msgstr[1] "Kontrolli gjeti {} probleme" #: ../fdroidserver/scanner.py msgid "Scanning APK for extra signing blocks." -msgstr "" +msgstr "Po kontrollohet te APK për blloqe ekstra nënshkrimi." #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." @@ -2073,7 +2073,7 @@ msgstr "Po verifikohet nënshkrim treguesi:" #: ../fdroidserver/install.py #, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "" +msgstr "Po verifikohet paketë {path} me apksigner." #: ../fdroidserver/deploy.py #, python-brace-format @@ -2086,7 +2086,7 @@ msgstr "Sinjalizo rreth gabimesh të mundshëm tejtëdhënash" #: ../fdroidserver/scanner.py msgid "WebAssembly binary file" -msgstr "" +msgstr "Kartelë dyore WebAssembly" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2102,11 +2102,11 @@ msgstr "Kur nënshkrimi, ose verifikimi dështon, dil me një kod gabimi." #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "" +msgstr "Doni të shkarkohet dhe instalohet F-Droid.apk përmes adb-je? (PO/jo)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "" +msgstr "Doni të shkarkohet aplikacioni(et) që nga f-droid.org? (PO/jo)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2123,7 +2123,7 @@ msgstr "Arkiv kartelash ZIP" #: ../fdroidserver/install.py #, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "" +msgstr "adb-ja njofton se {serial} është “{status}”!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2590,7 +2590,7 @@ msgstr "" #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "" +msgstr "dyorit të refrencës i mungon nënshkrimi" #: ../fdroidserver/signatures.py #, python-brace-format @@ -2736,7 +2736,7 @@ msgstr "virustotal.com i kufizon shpejtësitë, po pritet për riprovim…" #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "po" #: ../fdroidserver/publish.py #, python-brace-format @@ -2854,7 +2854,7 @@ msgstr "për {path} ka {count} herë sinjalizime nga virustotal:" #: ../fdroidserver/install.py #, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "" +msgstr "{path} ka shenja gishtash të gabuara ({fingerprint})!" #: ../fdroidserver/common.py #, python-brace-format From 865c7a33bb1ad634f246252e9bb2007cac4608d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Mon, 25 Nov 2024 13:57:34 +0000 Subject: [PATCH 1800/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Chine?= =?UTF-8?q?se=20(Simplified=20Han=20script)=20(zh=5FHans)=20by=20=E5=A4=A7?= =?UTF-8?q?=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1=E5=B1=B1=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (611 of 611 strings) Co-authored-by: 大王叫我来巡山 Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 44 +++++++++++----------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 05bbc3bf..2c1b2f59 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -40,15 +40,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-11-08 17:42+0000\n" -"Last-Translator: linsui \n" +"PO-Revision-Date: 2024-11-24 18:41+0000\n" +"Last-Translator: 大王叫我来巡山 \n" "Language-Team: Chinese (Simplified Han script) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.8.2\n" +"X-Generator: Weblate 5.9-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -234,7 +234,7 @@ msgstr "'{value}' 不是有效 {field},应为 {pattern}" #: ../fdroidserver/checkupdates.py msgid "--merge-request only runs on a single appid!" -msgstr "" +msgstr "--merge-request 只运行在单个 appid 上!" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -365,11 +365,11 @@ msgstr "AutoUpdateMode 和 UpdateCheckMode:HTTP 必须有一个模式。" #: ../fdroidserver/install.py msgid "Automatic no to all prompts." -msgstr "" +msgstr "对所有提示自动回复 no。" #: ../fdroidserver/install.py msgid "Automatic yes to all prompts." -msgstr "" +msgstr "对所有提示自动回复 yes。" #: ../fdroidserver/index.py #, python-brace-format @@ -464,7 +464,7 @@ msgstr "干净的更新 - 不使用缓存,重新处理全部 APK 文件" #: ../fdroidserver/common.py msgid "Color the log output" -msgstr "" +msgstr "给日志输出添加颜色" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." @@ -481,7 +481,7 @@ msgstr "提交更改" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "" +msgstr "提交改动、推动,然后提出合并请求" #: ../fdroidserver/metadata.py #, python-brace-format @@ -668,7 +668,7 @@ msgstr "请勿使用 rsync 校验和" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "" +msgstr "使用向网络泄露较少信息的镜像下载 F-Droid apk" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -780,7 +780,7 @@ msgstr "从 APK 中提取签名" #: ../fdroidserver/install.py msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "" +msgstr "无法从任何已知的来源下载 F-Droid apk!" #: ../fdroidserver/update.py #, python-brace-format @@ -1242,7 +1242,7 @@ msgstr "未找到连接的设备" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." -msgstr "" +msgstr "没有找到 `adb install` 设备!请插入一台设备。" #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1450,7 +1450,7 @@ msgstr "将秘密变量打印到终端以便于复制/粘贴" #: ../fdroidserver/install.py #, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "" +msgstr "根据你的语言环境({country_code})启用了隐私模式。" #: ../fdroidserver/scanner.py #, python-format @@ -1575,7 +1575,7 @@ msgstr "仅输出警告和出错信息" #: ../fdroidserver/net.py #, python-format msgid "Retrying failed download: %s" -msgstr "" +msgstr "正在重试失败的下载:%s" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1643,7 +1643,7 @@ msgstr[0] "扫描仪发现 {} 个问题" #: ../fdroidserver/scanner.py msgid "Scanning APK for extra signing blocks." -msgstr "" +msgstr "正在扫描 APK 是否有额外的签名块。" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." @@ -2102,7 +2102,7 @@ msgstr "验证目录签名中:" #: ../fdroidserver/install.py #, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "" +msgstr "使用 apksigner 验证包 {path}。" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2115,7 +2115,7 @@ msgstr "警告元数据中可能存在的错误" #: ../fdroidserver/scanner.py msgid "WebAssembly binary file" -msgstr "" +msgstr "WebAssembly 二进制文件" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2131,11 +2131,11 @@ msgstr "签名或验证失败时,退出并显示错误代码。" #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "" +msgstr "你要通过 adb 下载并安装 F-Droid apk 吗?(YES/no)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "" +msgstr "你要从 f-droid 下载应用吗?(YES/no)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2152,7 +2152,7 @@ msgstr "ZIP 压缩包" #: ../fdroidserver/install.py #, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "" +msgstr "adb 报告 {serial} 为 \"{status}\"状态!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2718,7 +2718,7 @@ msgstr "需要此下参数:%s" #: ../fdroidserver/install.py msgid "true" -msgstr "" +msgstr "true" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2763,7 +2763,7 @@ msgstr "virustotal.com正在限制速率,等待重试..." #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "yes" #: ../fdroidserver/publish.py #, python-brace-format @@ -2880,7 +2880,7 @@ msgstr "{path}被virustotal标记了{count}次:" #: ../fdroidserver/install.py #, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "" +msgstr "{path} 有错误的指纹 ({fingerprint})!" #: ../fdroidserver/common.py #, python-brace-format From a26995e5349716ffd1d900bd1677cdb2a3540b94 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 25 Nov 2024 17:33:41 +0100 Subject: [PATCH 1801/2116] update CHANGELOG.md for 2.3.0 and 2.3.1 --- CHANGELOG.md | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e65afe3..d38f05dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,8 +12,79 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ### Removed +## [2.3.1] - 2024-11-25 + +### Fixed + +* Sync all translations for: cs de es fr ga pt_BR ru sq zh_Hans. +* Drop use of deprecated imghdr library to support Python 3.13. +* Install biplist and pycountry by default on macOS. +* Fixed running test suite out of dist tarball. + +## [2.3.0] - 2024-11-21 + +### Added + +* YAML 1.2 as native format for all _.yml_ files, including metadata and config. +* install: will now fetch _F-Droid.apk_ and install it via `adb`. + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1546 +* scanner: scan APK Signing Block for known block types like Google Play + Signature aka "Frosting". + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1555 +* Support Rclone for deploying to many different cloud services. +* deploy: support deploying to GitHub Releases. + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1471 +* scanner: support libs.versions.toml + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1526 +* Consider subdir for triple-t metadata discovery in Flutter apps. + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1541 +* deploy: added `index_only:` mode for mirroring the index to small hosting + locations. https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1420 +* Support publishing repos in AltStore format. + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1465 +* Support indexing iOS IPA app files. + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1413 +* deploy: _config/mirrors.yml_ file with support for adding per-mirror metadata, + like `countryCode:`. +* Repo's categories are now set in the config files. +* lint: check syntax of config files. +* publish: ``--error-on-failed` to exit when signing/verifying fails. +* scanner: `--refresh` and `refresh_config:` to control triggering a refresh of + the rule sets. +* Terminal output colorization and `--color` argument to control it. +* New languages: Catalan (ca), Irish (ga), Japanese (ja), Serbian (sr), and + Swahili (sw). +* Support donation links from `community_bridge`, `buy_me_a_coffee`. + +### Fixed + +* Use last modified time and file size for caching data about scanned APKs + instead of SHA-256 checksum. + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1542 +* `repo_web_base_url:` config for generating per-app URLs for viewing in + browsers. https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1178 +* `fdroid scanner` flags WebAssembly binary _.wasm_ files. + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1562 +* Test suite as standard Python `unittest` setup (thanks @ghost.adh). +* scanner: error on dependency files without lock file. + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1504 +* nightly: finding APKs in the wrong directory. (thanks @WrenIX) + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1512 +* `AllowedAPKSigningKeys` works with all single-signer APK signatures. + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1466 +* Sync all translations for: cs de it ko pl pt pt_BR pt_PT ro ru sq tr uk + zh_Hans zh_Hant. +* Support Androguard 4.x. +* Support Python 3.12. + +### Removed + +* Drop all uses of _stats/known_apks.txt_ and the `update_stats:` config key. + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1547 * The `maven:` field is now always a string, with `yes` as a legacy special value. It is no longer treated like a boolean in any case. +* scanner: jcenter is no longer an allowed Maven repo. +* build: `--reset-server` removed (thanks @gotmi1k). ## [2.2.2] - 2024-04-24 From fe29f562382e5c4ce38dae36ef608ab7eace57ad Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 25 Nov 2024 17:37:59 +0100 Subject: [PATCH 1802/2116] version 2.3.1 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f45d5b81..26a3ec9e 100755 --- a/setup.py +++ b/setup.py @@ -70,7 +70,7 @@ with open("README.md", "r") as fh: setup( name='fdroidserver', - version='2.3.0', + version='2.3.1', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From 9b2a4a90a7098f20860b4ac90dac7bd7a7d2fe72 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 25 Nov 2024 19:21:07 +0100 Subject: [PATCH 1803/2116] buildserver/provision-apt-get-install: This was forgotten in !1543 ansible-role-install-fdroidserver-dependencies!11 --- buildserver/provision-apt-get-install | 1 + 1 file changed, 1 insertion(+) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index cbb5a350..fed5fa57 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -114,6 +114,7 @@ packages=" gnupg mercurial patch + python3-magic python3-packaging rsync sdkmanager/bookworm-backports From a2d27ba15ef5c4f39f87d00ff483fea0d3abd60d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 26 Nov 2024 11:17:46 +0100 Subject: [PATCH 1804/2116] install: remove forgotten print() --- fdroidserver/install.py | 1 - 1 file changed, 1 deletion(-) diff --git a/fdroidserver/install.py b/fdroidserver/install.py index 4832049b..1fb1e6fb 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -80,7 +80,6 @@ def download_apk(appid='org.fdroid.fdroid', privacy_mode=False): # prefer APK in default release channel preferred_version = version break - print('skipping', version) mirrors = common.append_filename_to_mirrors( preferred_version['file']['name'][1:], common.FDROIDORG_MIRRORS From d2cc0203362cddd151e7d1ff36f260849b8ec792 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 26 Nov 2024 15:12:12 +0100 Subject: [PATCH 1805/2116] install: fix broken URL building logic for Maven Central The append logic was wrong, so it was trying to download URLs like: https://repo.maven.apache.org/maven2/org/fdroid/fdroid/F-Droid/maven-metadata.xml/org/fdroid/fdroid/F-Droid/1.20.0/F-Droid-1.20.0.apk Which should be: https://repo.maven.apache.org/maven2/org/fdroid/fdroid/F-Droid/1.20.0/F-Droid-1.20.0.apk Can be manually tested using: `test_download_fdroid_apk=1 python -m unittest -k test_download_fdroid_apk_from_maven` --- fdroidserver/install.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/fdroidserver/install.py b/fdroidserver/install.py index 1fb1e6fb..529e36dc 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -136,10 +136,11 @@ def download_fdroid_apk_from_maven(privacy_mode=False): mirrors = MAVEN_CENTRAL_MIRRORS[:2] # skip the Google servers else: mirrors = MAVEN_CENTRAL_MIRRORS - mirrors = common.append_filename_to_mirrors( - os.path.join(path, 'maven-metadata.xml'), mirrors + metadata = net.download_using_mirrors( + common.append_filename_to_mirrors( + os.path.join(path, 'maven-metadata.xml'), mirrors + ) ) - metadata = net.download_using_mirrors(mirrors) version = XMLElementTree.parse(metadata).getroot().findall('*.//latest')[0].text mirrors = common.append_filename_to_mirrors( os.path.join(path, version, f'F-Droid-{version}.apk'), mirrors From 8c81033ea32f4804afb3b19d73f4c4f3e9901a8a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 26 Nov 2024 15:20:06 +0100 Subject: [PATCH 1806/2116] FDroidPopenBytes: do not crash if options are not set This makes writing test cases a lot easier. For example: ====================================================================== ERROR: test_devices (tests.test_install.InstallTest.test_devices) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/hans/code/fdroid/server/tests/test_install.py", line 31, in test_devices devices = fdroidserver.install.devices() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/hans/code/fdroid/server/fdroidserver/install.py", line 225, in devices p = common.SdkToolsPopen(['adb', "devices"]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/hans/code/fdroid/server/fdroidserver/common.py", line 2921, in SdkToolsPopen return FDroidPopen([abscmd] + commands[1:], ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/hans/code/fdroid/server/fdroidserver/common.py", line 3024, in FDroidPopen result = FDroidPopenBytes(commands, cwd, envs, output, stderr_to_stdout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/hans/code/fdroid/server/fdroidserver/common.py", line 2987, in FDroidPopenBytes if output and options.verbose: ^^^^^^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'verbose' --- fdroidserver/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 6a24c74e..a6cf2009 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2976,7 +2976,7 @@ def FDroidPopenBytes(commands, cwd=None, envs=None, output=True, stderr_to_stdou while not stdout_reader.eof(): while not stdout_queue.empty(): line = stdout_queue.get() - if output and options.verbose: + if output and options and options.verbose: # Output directly to console sys.stderr.buffer.write(line) sys.stderr.flush() From 8fc340aaca6d7401cda5e71394d682b787fb65a3 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 26 Nov 2024 15:31:47 +0100 Subject: [PATCH 1807/2116] install: fix download dir when fetching from GitHub Releases --- fdroidserver/install.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fdroidserver/install.py b/fdroidserver/install.py index 529e36dc..74754520 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -115,7 +115,8 @@ def download_fdroid_apk_from_github(privacy_mode=False): token = None gh = github.GithubApi(token, 'https://github.com/f-droid/fdroidclient') latest_apk = gh.get_latest_apk() - return net.download_file(latest_apk) + filename = os.path.basename(latest_apk) + return net.download_file(latest_apk, os.path.join(common.get_cachedir(), filename)) def download_fdroid_apk_from_ipns(privacy_mode=False): From 4ea9cdfa935d8fea9938e4d74f219290867deaeb Mon Sep 17 00:00:00 2001 From: Reno Tx Date: Tue, 26 Nov 2024 19:01:59 +0100 Subject: [PATCH 1808/2116] Translated using Weblate: Serbian (sr) by Reno Tx Currently translated at 96.8% (592 of 611 strings) Co-authored-by: Reno Tx Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sr/ Translation: F-Droid/F-Droid Server --- locale/sr/LC_MESSAGES/fdroidserver.po | 66 ++++++++++++++++----------- 1 file changed, 40 insertions(+), 26 deletions(-) diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index 2fe17113..507b485a 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-09-20 19:23+0000\n" +"PO-Revision-Date: 2024-11-22 21:03+0000\n" "Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" "Language: sr\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.9-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -204,8 +204,9 @@ msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' није важећи {field}, треба да буде {pattern}" #: ../fdroidserver/checkupdates.py +#, fuzzy msgid "--merge-request only runs on a single appid!" -msgstr "" +msgstr "--спојити-захтев ради само на једном appid!" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -335,12 +336,14 @@ msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode са UpdateCheckMode: HTTP мора имати образац." #: ../fdroidserver/install.py +#, fuzzy msgid "Automatic no to all prompts." -msgstr "" +msgstr "Аутоматски нема до свих упита." #: ../fdroidserver/install.py +#, fuzzy msgid "Automatic yes to all prompts." -msgstr "" +msgstr "Аутоматски да до свих упита." #: ../fdroidserver/index.py #, python-brace-format @@ -436,8 +439,9 @@ msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Чисто ажурирање – не користите кешеве, поново обрађујте све АПК-ове" #: ../fdroidserver/common.py +#, fuzzy msgid "Color the log output" -msgstr "" +msgstr "Обојите лог излаз." #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." @@ -453,8 +457,9 @@ msgid "Commit changes" msgstr "Потврди измене" #: ../fdroidserver/checkupdates.py +#, fuzzy msgid "Commit changes, push, then make a merge request" -msgstr "" +msgstr "Унесите промене, пошаљите, а затим уверите се да спојите захтев." #: ../fdroidserver/metadata.py #, python-brace-format @@ -640,8 +645,9 @@ msgid "Don't use rsync checksums" msgstr "Не користите rsync чексуме" #: ../fdroidserver/install.py +#, fuzzy msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "" +msgstr "Преузмите F-Droid.apk користећи резервне изворе који мање цуре у мрежу." #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -752,8 +758,9 @@ msgid "Extract signatures from APKs" msgstr "Извуците потписе из АПК-ова" #: ../fdroidserver/install.py +#, fuzzy msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "" +msgstr "F-Droid.apk није могао бити преузет из било ког познатог извора!" #: ../fdroidserver/update.py #, python-brace-format @@ -1214,8 +1221,9 @@ msgid "No attached devices found" msgstr "Није пронађен ниједан прикључени уређај" #: ../fdroidserver/install.py +#, fuzzy msgid "No devices found for `adb install`! Please plug one in." -msgstr "" +msgstr "Нема уређаја пронађених за `adb install`! Молимо вас да укључите један." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1421,9 +1429,9 @@ msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Штампај тајну променљиву на терминал за лако копирање/налепљивање" #: ../fdroidserver/install.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "" +msgstr "Режим приватности је био омогућен на основу ваше локализације ({country_code})." #: ../fdroidserver/scanner.py #, python-format @@ -1546,9 +1554,9 @@ msgid "Restrict output to warnings and errors" msgstr "Ограничите излаз на упозорења и грешке" #: ../fdroidserver/net.py -#, python-format +#, fuzzy, python-format msgid "Retrying failed download: %s" -msgstr "" +msgstr "Поновно покушавање неуспелог преузимања: %s" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1617,8 +1625,9 @@ msgstr[1] "Скенирање је пронашло {} проблема" msgstr[2] "Скенирање је пронашло {} проблема" #: ../fdroidserver/scanner.py +#, fuzzy msgid "Scanning APK for extra signing blocks." -msgstr "" +msgstr "Скенирање APK за додатне блокове потписивања." #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." @@ -2075,9 +2084,9 @@ msgid "Verifying index signature:" msgstr "Верификација потписа индекса:" #: ../fdroidserver/install.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "" +msgstr "Потврђивање пакета {path} са apksigner-ом." #: ../fdroidserver/deploy.py #, python-brace-format @@ -2089,8 +2098,9 @@ msgid "Warn about possible metadata errors" msgstr "Упозорење о могућим грешкама у метаподацима" #: ../fdroidserver/scanner.py +#, fuzzy msgid "WebAssembly binary file" -msgstr "" +msgstr "WebAssembly бинарна датотека." #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2105,12 +2115,14 @@ msgid "When signing or verifying fails, exit with an error code." msgstr "Када потписивање или верификација не успеју, излазите са кодом грешке." #: ../fdroidserver/install.py +#, fuzzy msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "" +msgstr "Да ли желите да преузмете и инсталирате F-Droid.apk преко adb? (ДА/не)" #: ../fdroidserver/install.py +#, fuzzy msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "" +msgstr "Да ли желите да преузмете апликацију(е) са f-droid.org? (ДА/не)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2125,9 +2137,9 @@ msgid "ZIP file archive" msgstr "ZIP архивска датотека" #: ../fdroidserver/install.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "" +msgstr "adb извештава {serial} је \"{status}\"!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2696,8 +2708,9 @@ msgid "the following arguments are required: %s" msgstr "следећи аргументи су обавезни: %s" #: ../fdroidserver/install.py +#, fuzzy msgid "true" -msgstr "" +msgstr "истина" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2741,8 +2754,9 @@ msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com ограничава брзину, чекање на поновни покушај..." #: ../fdroidserver/install.py +#, fuzzy msgid "yes" -msgstr "" +msgstr "да" #: ../fdroidserver/publish.py #, python-brace-format @@ -2859,9 +2873,9 @@ msgid "{path} has been flagged by virustotal {count} times:" msgstr "{path} је означен од стране virustotal {count} пута:" #: ../fdroidserver/install.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "" +msgstr "{path} има погрешан отисак прста ({fingerprint})!" #: ../fdroidserver/common.py #, python-brace-format From 0b40c044227ee6fead50b0a79ff5cb3f8f89612f Mon Sep 17 00:00:00 2001 From: gfbdrgng Date: Tue, 26 Nov 2024 19:02:00 +0100 Subject: [PATCH 1809/2116] Translated using Weblate: Russian (ru) by gfbdrgng Currently translated at 100.0% (611 of 611 strings) Co-authored-by: gfbdrgng Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translation: F-Droid/F-Droid Server --- locale/ru/LC_MESSAGES/fdroidserver.po | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 68dd0ea1..dea60a10 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -20,7 +20,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-11-25 13:57+0000\n" +"PO-Revision-Date: 2024-11-26 10:18+0000\n" "Last-Translator: gfbdrgng \n" "Language-Team: Russian \n" "Language: ru\n" @@ -1559,7 +1559,7 @@ msgstr "Показывать в выводе только предупрежде #: ../fdroidserver/net.py #, python-format msgid "Retrying failed download: %s" -msgstr "" +msgstr "Повторная попытка неудачной загрузки: %s" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1629,7 +1629,7 @@ msgstr[2] "Сканирование обнаружило {} ошибок" #: ../fdroidserver/scanner.py msgid "Scanning APK for extra signing blocks." -msgstr "" +msgstr "Проверка APK на наличие дополнительных блоков подписи." #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." @@ -2088,7 +2088,7 @@ msgstr "Проверка подписи индекса:" #: ../fdroidserver/install.py #, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "" +msgstr "Проверка пакета {path} с помощью apksigner." #: ../fdroidserver/deploy.py #, python-brace-format @@ -2101,7 +2101,7 @@ msgstr "Предупреждать о возможных ошибках в ме #: ../fdroidserver/scanner.py msgid "WebAssembly binary file" -msgstr "" +msgstr "Двоичный файл WebAssembly" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2117,11 +2117,11 @@ msgstr "При неудачном подписании или проверке #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "" +msgstr "Вы хотите скачать и установить F-Droid.apk через adb? (Да/нет)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "" +msgstr "Хотите ли вы загрузить приложение(я) с сайта f-droid.org? (ДА/НЕТ)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2138,7 +2138,7 @@ msgstr "Архив ZIP" #: ../fdroidserver/install.py #, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "" +msgstr "adb сообщает, что {serial} - это \"{status}\"!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2708,7 +2708,7 @@ msgstr "требуются аргументы: %s" #: ../fdroidserver/install.py msgid "true" -msgstr "" +msgstr "истина" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2753,7 +2753,7 @@ msgstr "virustotal.com ограничивает траффик, ждем пов #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "Да" #: ../fdroidserver/publish.py #, python-brace-format @@ -2872,7 +2872,7 @@ msgstr "{path} был отмечен virustotal {count} раз:" #: ../fdroidserver/install.py #, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "" +msgstr "У {path} неправильный отпечаток пальца ({fingerprint})!" #: ../fdroidserver/common.py #, python-brace-format From 9ce877acdbfc2e8b132dc079860dc17275945fd9 Mon Sep 17 00:00:00 2001 From: Hugo Carvalho Date: Tue, 26 Nov 2024 19:02:00 +0100 Subject: [PATCH 1810/2116] Translated using Weblate: Portuguese (pt) by Hugo Carvalho Currently translated at 100.0% (611 of 611 strings) Translated using Weblate: Portuguese (pt) by Hugo Carvalho Currently translated at 97.3% (595 of 611 strings) Translated using Weblate: Portuguese (Portugal) (pt_PT) by Hugo Carvalho Currently translated at 100.0% (611 of 611 strings) Translated using Weblate: Portuguese (Portugal) (pt_PT) by Hugo Carvalho Currently translated at 97.3% (595 of 611 strings) Co-authored-by: Hugo Carvalho Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_PT/ Translation: F-Droid/F-Droid Server --- locale/pt/LC_MESSAGES/fdroidserver.po | 89 ++++++++++++------------ locale/pt_PT/LC_MESSAGES/fdroidserver.po | 54 +++++++------- 2 files changed, 72 insertions(+), 71 deletions(-) diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index c73220d6..3ee09d9f 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -4,20 +4,21 @@ # Peter J. Mello , 2021. # Eduardo Rodrigues , 2021. # SC , 2022. +# Hugo Carvalho , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-10-07 18:58+0000\n" -"Last-Translator: ssantos \n" +"PO-Revision-Date: 2024-11-26 15:16+0000\n" +"Last-Translator: Hugo Carvalho \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.9-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -44,7 +45,7 @@ msgstr "\"%s/\" não tem ficheiro de metadados correspondente!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "O diretório raiz para \"local_copy_dir\" {path} não existe!" +msgstr "\"local_copy_dir\" {path} não existe!" #: ../fdroidserver/install.py #, python-brace-format @@ -74,7 +75,7 @@ msgstr "\"{path}\" não é um formato de ficheiro aceito (use: metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "\"{path}\" é assinado por uma chave que não é permitida:" +msgstr "\"{path}\" está acessado por uma chave que não é permitida:" #: ../fdroidserver/import_subcommand.py #, python-brace-format @@ -204,7 +205,7 @@ msgstr "'{value}' não é um {field} válido, deve ser {pattern}" #: ../fdroidserver/checkupdates.py msgid "--merge-request only runs on a single appid!" -msgstr "" +msgstr "--merge-request só é executado num único appid!" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -219,7 +220,7 @@ msgstr ".__call__() não definida" #: ../fdroidserver/lint.py msgid "/issues is missing" -msgstr "está faltando o /issues" +msgstr "/issues está em falta" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" @@ -297,7 +298,7 @@ msgstr "O caminho do SDK Android '{path}' não é um diretório!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "A ferramenta SDK do Android {cmd} não foi encontrada!" +msgstr "Ferramenta {cmd} do Android SDK não foi encontrada!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." @@ -335,11 +336,11 @@ msgstr "AutoUpdateMode com UpdateCheckMode: HTTP deve ter um modelo." #: ../fdroidserver/install.py msgid "Automatic no to all prompts." -msgstr "" +msgstr "Não automático a todos os avisos." #: ../fdroidserver/install.py msgid "Automatic yes to all prompts." -msgstr "" +msgstr "Sim automático a todos os avisos." #: ../fdroidserver/index.py #, python-brace-format @@ -393,7 +394,7 @@ msgstr "Repo construído baseado em \"%s\" com esta configuração:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "Não é possível atualizar automaticamente a aplicação sem CurrentVersionCode" +msgstr "Aplicação não pode ser auto-atualizada sem CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -435,7 +436,7 @@ msgstr "Atualização limpa - não usa cache, reprocessa todos os APKs" #: ../fdroidserver/common.py msgid "Color the log output" -msgstr "" +msgstr "Colorir o registo de saída" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." @@ -448,11 +449,11 @@ msgstr "Comando '%s' não reconhecido.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" -msgstr "Enviar mudanças" +msgstr "Enviar alterações" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "" +msgstr "Confirme as alterações, envie e faça um pedido de fusão" #: ../fdroidserver/metadata.py #, python-brace-format @@ -639,7 +640,7 @@ msgstr "Não usar as somas de verificação (checksums) do rsync" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "" +msgstr "Descarregue o F-Droid.apk utilizando espelhos que vazam menos para a rede" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -689,7 +690,7 @@ msgid "" "A full mirror of f-droid.org requires more than 200GB." msgstr "" "ERRO: este comando nunca deve ser usado para espelhar f-Droid.org!\n" -"Um espelho completo de f-Droid.org requer mais de 200GB." +"Um espelho completo de f-Droid.org requer mais que 200GB." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" @@ -703,7 +704,7 @@ msgstr "ERRO: host de git \"%s\" não suportado, patches são bem-vindos!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" -msgstr "ERRO: {key} em {path} não é um \"arquivamento\" ou \"repositório\"!" +msgstr "ERRO: {key} em {path} não é \"arquivo\" ou \"repositório\"!" #: ../fdroidserver/lint.py #, python-brace-format @@ -731,7 +732,7 @@ msgstr "A variável de ambiente {var} de {configname} não está definida!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "Erro ao implementar 'github_releases', {} não está presente. (Talvez seja necessário executar `fdroid update` primeiro)" +msgstr "Erro ao implementar 'github_releases', {} não está presente. (Pode ser necessário executar `fdroid update` primeiro.)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -751,7 +752,7 @@ msgstr "Extrato de assinaturas de APKs" #: ../fdroidserver/install.py msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "" +msgstr "Não foi possível descarregar o F-Droid.apk de nenhuma fonte conhecida!" #: ../fdroidserver/update.py #, python-brace-format @@ -968,7 +969,7 @@ msgstr "A ignorar '{field}' em metadados '{metapath}' porque é depreciado." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" -msgstr "A ignorar a entrada FUNDING.yml por mais de 2048: %s" +msgstr "A ignorar a entrada FUNDING.yml por mais que 2048: %s" #: ../fdroidserver/update.py #, python-format @@ -1213,7 +1214,7 @@ msgstr "Nenhum aparelho anexado encontrado" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." -msgstr "" +msgstr "Nenhum dispositivo encontrado para `adb install`! Ligue um." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1330,15 +1331,15 @@ msgstr "A máquina está offline, a saltar a geração de espelhos de git até o #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." -msgstr "Um dos elementos de configuração 'github_releases' está faltando o valor 'packageNames'. ignorando ..." +msgstr "Um dos itens de configuração 'github_releases' está a faltar o valor 'packageNames'. A ignorar ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "Um dos elementos de configuração 'github_releases' está faltando o valor 'projectUrl'. ignorando ..." +msgstr "Um dos itens de configuração 'github_releases' não tem o valor 'projectUrl'. A ignorar ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." -msgstr "Um dos elementos de configuração 'github_releases' está faltando o valor 'token'. ignorando ..." +msgstr "Um dos itens de configuração 'github_releases' não tem o valor 'token'. A ignorar ..." #: ../fdroidserver/update.py #, python-brace-format @@ -1421,7 +1422,7 @@ msgstr "Imprimir a variável secreta para o terminal para copiar/colar fácilmen #: ../fdroidserver/install.py #, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "" +msgstr "O modo de privacidade foi ativado com base na sua localização ({country_code})." #: ../fdroidserver/scanner.py #, python-format @@ -1546,7 +1547,7 @@ msgstr "Restringir a saída a erros e avisos" #: ../fdroidserver/net.py #, python-format msgid "Retrying failed download: %s" -msgstr "" +msgstr "Nova tentativa de descarga com falha: %s" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1564,7 +1565,7 @@ msgstr "Executar no repo git que tem alterações não confirmadas" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" -msgstr "Execute {cibase} para encontrar -debug.apk. e ignore repo_basedir {repo_basedir}" +msgstr "Passar por cima de {cibase} para encontrar -debug.apk. e ignorar repo_basedir {repo_basedir}" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1615,7 +1616,7 @@ msgstr[1] "Scanner encontrou {} problemas" #: ../fdroidserver/scanner.py msgid "Scanning APK for extra signing blocks." -msgstr "" +msgstr "A verificar a APK em busca de blocos de assinatura extra." #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." @@ -1735,7 +1736,7 @@ msgstr "Modo de atualização de marcações usado no git-svn, mas a repo não f #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." -msgstr "Modo de teste - coloque a saída apenas no diretório tmp e sempre compile, mesmo que a saída já exista." +msgstr "Modo de teste - ponha a saída apenas no diretório tmp e sempre compile, mesmo que a saída já exista." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1745,7 +1746,7 @@ msgstr "O código de versão OBB deve estar após \"{name}.\":" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" -msgstr "O URL base para o registro de mudanças do repositório (predefinição: https://f-droid.org)" +msgstr "O URL base para o registo de mudanças do repositório (predefinição: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" @@ -1810,7 +1811,7 @@ msgstr "Para usar awsbucket, os awssecretkey e awsaccesskeyid também devem ser #: ../fdroidserver/deploy.py msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" -msgstr "Para usar rclone, rclone_config e awsbucket devem ser configurados em config.yml!" +msgstr "Para usar rclone, rclone_config e awsbucket também devem ser definidos no config.yml!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -2012,7 +2013,7 @@ msgstr "Usando \"{path}\" para configurar s3cmd." #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for syncing with remote storage." -msgstr "Usando \"{path}\" para a sincronização com armazenamento remoto." +msgstr "A usar \"{path}\" para sincronizar com o armazenamento remoto." #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -2048,7 +2049,7 @@ msgstr "Utilizando armazenamento de chave existente \"{path}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using rclone to sync with: {url}" -msgstr "Usando rclone para sincronizar com: {url}" +msgstr "A usar rclone para sincronizar com: {url}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2074,7 +2075,7 @@ msgstr "Verificar o índice de assinatura:" #: ../fdroidserver/install.py #, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "" +msgstr "A verificar o pacote {path} com apksigner." #: ../fdroidserver/deploy.py #, python-brace-format @@ -2087,7 +2088,7 @@ msgstr "Avisar sobre possíveis erros de metadados" #: ../fdroidserver/scanner.py msgid "WebAssembly binary file" -msgstr "" +msgstr "Ficheiro binário WebAssembly" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2103,11 +2104,11 @@ msgstr "Se assinar ou verificar falhar, sair com um código de erro." #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "" +msgstr "Gostaria de descarregar e instalar o F-Droid.apk via adb? (SIM/não)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "" +msgstr "Gostaria de descarregar a(s) aplicação(ões) do f-droid.org? (SIM/não)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2124,7 +2125,7 @@ msgstr "Arquivo de ficheiros ZIP" #: ../fdroidserver/install.py #, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "" +msgstr "adb reporta {serial} é \"{status}\"!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2624,7 +2625,7 @@ msgstr "s3cmd sincroniza índices {path} para {url} e apaga" #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "s3cmd sincroniza os índices de {path} para {url} e apagar índices removidos" +msgstr "s3cmd sincroniza os índices de {path} para {url} e elimina os removidos" #: ../fdroidserver/scanner.py #, python-brace-format @@ -2637,7 +2638,7 @@ msgstr "serverwebroot: o caminho não termina com \"fdroid\", talvez queria usar #: ../fdroidserver/scanner.py msgid "shared library" -msgstr "biblioteca compartilhada" +msgstr "biblioteca partilhada" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2692,7 +2693,7 @@ msgstr "os seguintes argumentos são necessários: %s" #: ../fdroidserver/install.py msgid "true" -msgstr "" +msgstr "verdadeiro" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2737,7 +2738,7 @@ msgstr "o virustotal.com está a limitar a taxa, à espera para voltar a tentar. #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "sim" #: ../fdroidserver/publish.py #, python-brace-format @@ -2855,7 +2856,7 @@ msgstr "{path} foi marcado por virustotal {count} vezes:" #: ../fdroidserver/install.py #, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "" +msgstr "{path} tem a impressão digital errada ({fingerprint})!" #: ../fdroidserver/common.py #, python-brace-format @@ -2885,7 +2886,7 @@ msgstr "{path} tem um tamanho de zero!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" -msgstr "{path} mais de 200MB, enviar manualmente: {url}" +msgstr "{path} mais que 200MB, enviar manualmente: {url}" #: ../fdroidserver/lint.py #, python-brace-format diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 7a8f0e92..44552b69 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -12,7 +12,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-11-08 17:42+0000\n" +"PO-Revision-Date: 2024-11-26 10:54+0000\n" "Last-Translator: Hugo Carvalho \n" "Language-Team: Portuguese (Portugal) \n" "Language: pt_PT\n" @@ -20,7 +20,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.8.2\n" +"X-Generator: Weblate 5.9-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -47,7 +47,7 @@ msgstr "\"%s/\" não tem ficheiro de metadados correspondente!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "O diretório raiz para \"local_copy_dir\" {path} não existe!" +msgstr "\"local_copy_dir\" {path} não existe!" #: ../fdroidserver/install.py #, python-brace-format @@ -77,7 +77,7 @@ msgstr "\"{path}\" não é um formato de ficheiro aceito (use: metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "\"{path}\" é assinado por uma chave que não é permitida:" +msgstr "\"{path}\" está acessado por uma chave que não é permitida:" #: ../fdroidserver/import_subcommand.py #, python-brace-format @@ -207,7 +207,7 @@ msgstr "'{value}' não é um {field} válido, deve ser {pattern}" #: ../fdroidserver/checkupdates.py msgid "--merge-request only runs on a single appid!" -msgstr "" +msgstr "--merge-request só é executado num único appid!" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -222,7 +222,7 @@ msgstr ".__call__() não definida" #: ../fdroidserver/lint.py msgid "/issues is missing" -msgstr "está faltando o /issues" +msgstr "/issues está em falta" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" @@ -300,7 +300,7 @@ msgstr "O caminho do SDK Android '{path}' não é um diretório!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "A ferramenta SDK do Android {cmd} não foi encontrada!" +msgstr "Ferramenta {cmd} do Android SDK não foi encontrada!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." @@ -338,11 +338,11 @@ msgstr "AutoUpdateMode com UpdateCheckMode: HTTP deve ter um modelo." #: ../fdroidserver/install.py msgid "Automatic no to all prompts." -msgstr "" +msgstr "Não automático a todos os avisos." #: ../fdroidserver/install.py msgid "Automatic yes to all prompts." -msgstr "" +msgstr "Sim automático a todos os avisos." #: ../fdroidserver/index.py #, python-brace-format @@ -396,7 +396,7 @@ msgstr "Repo construído baseado em \"%s\" com esta configuração:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "Não é possível atualizar automaticamente a aplicação sem CurrentVersionCode" +msgstr "Aplicação não pode ser auto-atualizada sem CurrentVersionCode" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -438,7 +438,7 @@ msgstr "Atualização limpa - não usa cache, reprocessa todos os APKs" #: ../fdroidserver/common.py msgid "Color the log output" -msgstr "" +msgstr "Colorir o registo de saída" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." @@ -451,11 +451,11 @@ msgstr "Comando '%s' não reconhecido.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" -msgstr "Enviar mudanças" +msgstr "Enviar alterações" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "" +msgstr "Confirme as alterações, envie e faça um pedido de fusão" #: ../fdroidserver/metadata.py #, python-brace-format @@ -642,7 +642,7 @@ msgstr "Não usar as somas de verificação (checksums) do rsync" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "" +msgstr "Descarregue o F-Droid.apk utilizando espelhos que vazam menos para a rede" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -754,7 +754,7 @@ msgstr "Extrato de assinaturas de APKs" #: ../fdroidserver/install.py msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "" +msgstr "Não foi possível descarregar o F-Droid.apk de nenhuma fonte conhecida!" #: ../fdroidserver/update.py #, python-brace-format @@ -1216,7 +1216,7 @@ msgstr "Nenhum aparelho anexado encontrado" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." -msgstr "" +msgstr "Nenhum dispositivo encontrado para `adb install`! Ligue um." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1424,7 +1424,7 @@ msgstr "Imprimir a variável secreta para o terminal para copiar/colar fácilmen #: ../fdroidserver/install.py #, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "" +msgstr "O modo de privacidade foi ativado com base na sua localização ({country_code})." #: ../fdroidserver/scanner.py #, python-format @@ -1549,7 +1549,7 @@ msgstr "Restringir a saída a erros e avisos" #: ../fdroidserver/net.py #, python-format msgid "Retrying failed download: %s" -msgstr "" +msgstr "Nova tentativa de descarga com falha: %s" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1618,7 +1618,7 @@ msgstr[1] "Scanner encontrou {} problemas" #: ../fdroidserver/scanner.py msgid "Scanning APK for extra signing blocks." -msgstr "" +msgstr "A verificar a APK em busca de blocos de assinatura extra." #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." @@ -2077,7 +2077,7 @@ msgstr "Verificar o índice de assinatura:" #: ../fdroidserver/install.py #, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "" +msgstr "A verificar o pacote {path} com apksigner." #: ../fdroidserver/deploy.py #, python-brace-format @@ -2090,7 +2090,7 @@ msgstr "Avisar sobre possíveis erros de metadados" #: ../fdroidserver/scanner.py msgid "WebAssembly binary file" -msgstr "" +msgstr "Ficheiro binário WebAssembly" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2106,11 +2106,11 @@ msgstr "Se assinar ou verificar falhar, sair com um código de erro." #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "" +msgstr "Gostaria de descarregar e instalar o F-Droid.apk via adb? (SIM/não)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "" +msgstr "Gostaria de descarregar a(s) aplicação(ões) do f-droid.org? (SIM/não)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2127,7 +2127,7 @@ msgstr "Arquivo de ficheiros ZIP" #: ../fdroidserver/install.py #, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "" +msgstr "adb reporta {serial} é \"{status}\"!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2695,7 +2695,7 @@ msgstr "os seguintes argumentos são necessários: %s" #: ../fdroidserver/install.py msgid "true" -msgstr "" +msgstr "verdadeiro" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2740,7 +2740,7 @@ msgstr "o virustotal.com está a limitar a taxa, à espera para voltar a tentar. #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "sim" #: ../fdroidserver/publish.py #, python-brace-format @@ -2858,7 +2858,7 @@ msgstr "{path} foi marcado por virustotal {count} vezes:" #: ../fdroidserver/install.py #, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "" +msgstr "{path} tem a impressão digital errada ({fingerprint})!" #: ../fdroidserver/common.py #, python-brace-format From 19bb2bf1aa57f351128bb05449dc261140efeff3 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Tue, 26 Nov 2024 19:02:00 +0100 Subject: [PATCH 1811/2116] Translated using Weblate: Persian (fa) by Danial Behzadi Currently translated at 18.1% (111 of 611 strings) Translated using Weblate: Persian (fa) by Danial Behzadi Currently translated at 9.9% (61 of 611 strings) Translated using Weblate: Persian (fa) by Danial Behzadi Currently translated at 9.9% (61 of 611 strings) Co-authored-by: Danial Behzadi Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fa/ Translation: F-Droid/F-Droid Server --- locale/fa/LC_MESSAGES/fdroidserver.po | 204 +++++++++++++------------- 1 file changed, 102 insertions(+), 102 deletions(-) diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index 18048032..32be14bf 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-07-23 04:12+0000\n" +"PO-Revision-Date: 2024-11-26 15:16+0000\n" "Last-Translator: Danial Behzadi \n" "Language-Team: Persian \n" "Language: fa\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.7-dev\n" +"X-Generator: Weblate 5.9-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -40,12 +40,12 @@ msgstr "" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "\"local_copy_dir\" {path} وجود ندارد!" +msgstr "{path} ‏local_copy_dir وجود ندارد!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "\"{apkfilename}\" قبلا در {dev} نصب شده است." +msgstr "{apkfilename} از پیش روی {dev} نصب شده." #: ../fdroidserver/update.py #, python-brace-format @@ -60,22 +60,22 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" -msgstr "\"{path}\" وجود دارد اما s3cmd نصب نشده است!" +msgstr "\"{path}\" وجود دارد ولی s3cmd نصب نیست!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "\"{path}\" از فرمتِ پرونده پشتیبانی نمی‌کند (استفاده کنید از: metadata/*.yml)" +msgstr "{path} قالب پروندهٔ پشتیبانی شده‌ای نیست (استفاده: ‪metadata/*.yml‬)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "\"{path}\" توسط کلیدی که مجاز نیست امضاء می‌شود:" +msgstr "{path} به دست کلیدی که مجاز نیست امضا شده:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" -msgstr "\"{url}\" یک نشانی وب معتبر نیست!" +msgstr "{url} نشانی معتبری نیست!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -83,8 +83,8 @@ msgstr "\"{url}\" یک نشانی وب معتبر نیست!" #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "گزینه %(option)s نیاز به آرگومان %(number)d دارد" -msgstr[1] "گزینه %(option)s نیاز به آرگومان‌های %(number)d دارد" +msgstr[0] "گزینهٔ %(option)s نیاز به %(number)d آرگومان دارد" +msgstr[1] "گزینهٔ %(option)s نیاز به %(number)d آرگومان دارد" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -101,20 +101,20 @@ msgstr "" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" -msgstr "" +msgstr "%d مشکل پیدا شد" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" -msgstr "کاوش کردن" +msgstr "%prog [گزینه‌ها]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" -msgstr "‏%r قابل صدا زدن نیست" +msgstr "‏%r قابل فراخوانی نیست" #: ../fdroidserver/signindex.py #, python-format @@ -136,11 +136,11 @@ msgstr "" #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" -msgstr "گزینۀ %s مقداری را نمی‌گیرد" +msgstr "گزینۀ %s مقدار نمی‌گیرد" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" -msgstr "'keypass' وجود ندارد در config.yml!" +msgstr "keypass در config.yml پیدا نشد!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" @@ -148,40 +148,40 @@ msgstr "" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" -msgstr "'keystore' وجود ندارد در config.yml!" +msgstr "keystore در config.yml پیدا نشد!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" -msgstr "'keystorepass' وجود ندارد در config.yml!" +msgstr "keystorepass در config.yml پیدا نشد!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" -msgstr "'repo_keyalias' وجود ندارد در config.yml!" +msgstr "repo_keyalias در config.yml پیدا نشد!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" -msgstr "'required' یک آرگومان نامعتبر برای موقعیت‌ها است" +msgstr "required آرگومانی نامعتبر برای موقعیتی‌هاست" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" -msgstr "'sdk_path' تنظیم نشده است در config.yml!" +msgstr "sdk_path در config.yml تنظیم نشده!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" -msgstr "'{aapt}' خیلی قدیمی است، اف‌دروید بهbuild- tools-{version} یا جدیدتر نیاز دارد!" +msgstr "'{aapt}' بیش از حد قدیمی است. اف‌دروید به build- tools-{version} یا جدیدتر نیاز دارد!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' به ترتیب تصادفی خواهد بود! اگر مهم است از () یا [] کروشه‌ها استفاده کنید!" +msgstr "ترتیب {field} کاتوره‌ای خواهد بود! اگر ترتیب مهم است از () یا [] استفاده کنید!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" -msgstr "'{path}' اجرا نشد!" +msgstr "اجرای {path} شکست خورد!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -211,11 +211,11 @@ msgstr "" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" -msgstr ".__call__() تعریف نشده است" +msgstr "‪.__call__()‬ تعریف نشده است" #: ../fdroidserver/lint.py msgid "/issues is missing" -msgstr "" +msgstr "‪/issues‬ موجود نیست" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" @@ -265,15 +265,15 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "Android AAR library" -msgstr "" +msgstr "کتابخانهٔ AAR اندروید" #: ../fdroidserver/scanner.py msgid "Android APK file" -msgstr "" +msgstr "پروندهٔ APK اندروید" #: ../fdroidserver/scanner.py msgid "Android DEX code" -msgstr "" +msgstr "کد DEX اندروید" #: ../fdroidserver/init.py #, python-brace-format @@ -360,11 +360,11 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" -msgstr "" +msgstr "پیوند نمادین خراب: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" -msgstr "بسته‌ای را از کد منبع می‌سازد" +msgstr "ساخت بسته از کد مبدأ" #: ../fdroidserver/build.py msgid "Build all applications available" @@ -400,7 +400,7 @@ msgstr[1] "" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" -msgstr "" +msgstr "نمی‌توان {path} را بازنویسی کرد" #: ../fdroidserver/lint.py #, python-format @@ -418,7 +418,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" -msgstr "به‌روزرسانی‌ها برای برنامه‌ها را بررسی می‌کند" +msgstr "بررسی برای به‌روز رسانی‌های برنامه‌ها" #: ../fdroidserver/update.py #, python-brace-format @@ -444,7 +444,7 @@ msgstr "فرمان «%s» شناسایی نشد.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" -msgstr "" +msgstr "ثبت دگرگونی‌ها" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" @@ -520,7 +520,7 @@ msgstr "" #: ../fdroidserver/publish.py msgid "Creating log directory" -msgstr "" +msgstr "ایجاد کردن شاخهٔ log" #: ../fdroidserver/deploy.py #, python-brace-format @@ -529,7 +529,7 @@ msgstr "" #: ../fdroidserver/publish.py msgid "Creating output directory" -msgstr "" +msgstr "ایجاد کردن شاخهٔ output" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" @@ -537,7 +537,7 @@ msgstr "" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" -msgstr "" +msgstr "ایجاد کردن شاخهٔ temporary" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" @@ -554,7 +554,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "پرونده‌های APK و یا OBB فاقد فراداده را از مخزن پاک می‌کند" +msgstr "حذف APKها و یا OBBهای بدون فراداده از مخزن" #: ../fdroidserver/deploy.py #, python-brace-format @@ -644,7 +644,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "در حال بارگیری %s" +msgstr "بار گرفتن %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." @@ -673,7 +673,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "خطا: %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -820,7 +820,7 @@ msgstr "" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" -msgstr "" +msgstr "برچسب‌های HTML ممنوعه" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." @@ -908,11 +908,11 @@ msgstr "" #: ../fdroidserver/common.py msgid "Git clean failed" -msgstr "" +msgstr "پاک سازی گیت شکست خورد" #: ../fdroidserver/common.py msgid "Git fetch failed" -msgstr "" +msgstr "واکشی گیت شکست خورد" #: ../fdroidserver/common.py msgid "Git prune failed" @@ -925,7 +925,7 @@ msgstr "" #: ../fdroidserver/common.py msgid "Git reset failed" -msgstr "" +msgstr "بازنشانی گیت شکست خورد" #: ../fdroidserver/common.py msgid "Git submodule deinit failed" @@ -1004,7 +1004,7 @@ msgstr "" #: ../fdroidserver/common.py msgid "Initialising submodules" -msgstr "" +msgstr "مقداردهی نخستین زیرپیمانه‌ها" #: ../fdroidserver/install.py msgid "Install all signed applications available" @@ -1012,12 +1012,12 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" -msgstr "نصب بسته های ساخته شده روی دستگاه ها" +msgstr "نصب بسته های ساخته روی افزاره‌ها" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." -msgstr "" +msgstr "نصب کردن %s…" #: ../fdroidserver/install.py #, python-brace-format @@ -1030,7 +1030,7 @@ msgstr "تعامل با کارساز HTTP مخزن" #: ../fdroidserver/update.py msgid "Invalid APK" -msgstr "" +msgstr "APK نامعتبر" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -1045,7 +1045,7 @@ msgstr "" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" -msgstr "" +msgstr "VercodeOperation نامعتبر: {field}" #: ../fdroidserver/lint.py #, python-brace-format @@ -1060,11 +1060,11 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" -msgstr "" +msgstr "دودویی نامعتبر %s" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" -msgstr "" +msgstr "سیاههٔ گلوله‌ای نامعتبر" #: ../fdroidserver/common.py #, python-format @@ -1108,7 +1108,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "Java JAR file" -msgstr "" +msgstr "پروندهٔ JAR جاوا" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py @@ -1117,7 +1117,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "Java compiled class" -msgstr "" +msgstr "کلاس ترجمه شدهٔ جاوا" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" @@ -1163,11 +1163,11 @@ msgstr "" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." -msgstr "" +msgstr "آینه‌های مخزن بدریخت." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" -msgstr "" +msgstr "خط ریشهٔ وب کارساز بدریخت:" #: ../fdroidserver/scanner.py #, python-format @@ -1180,7 +1180,7 @@ msgstr "" #: ../fdroidserver/gpgsign.py msgid "Missing output directory" -msgstr "" +msgstr "شاخهٔ output نیست" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" @@ -1221,7 +1221,7 @@ msgstr "" #: ../fdroidserver/import_subcommand.py msgid "No information found." -msgstr "" +msgstr "هیچ طّلاعاتی وجود ندارد." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" @@ -1246,7 +1246,7 @@ msgstr "" #: ../fdroidserver/common.py msgid "No packages specified" -msgstr "" +msgstr "هیچ بسته‌ای مشخّص نشده" #: ../fdroidserver/install.py #, python-format @@ -1291,7 +1291,7 @@ msgstr "" #: ../fdroidserver/signindex.py msgid "Nothing to do" -msgstr "" +msgstr "کاری برای انجام نیست" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -1351,7 +1351,7 @@ msgstr "" #: /usr/lib/python3.11/optparse.py msgid "Options" -msgstr "انتخاب‌ها" +msgstr "گزینه‌ها" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." @@ -1365,7 +1365,7 @@ msgstr "" #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" -msgstr "" +msgstr "خروجی دادن JSON" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." @@ -1427,17 +1427,17 @@ msgstr "" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" -msgstr "" +msgstr "پردازش به‌روز رسانی‌های خودکار" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" -msgstr "" +msgstr "پردازش {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" -msgstr "" +msgstr "پردازش {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" @@ -1467,7 +1467,7 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" -msgstr "" +msgstr "فرستادن به {url}" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" @@ -1480,7 +1480,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" -msgstr "" +msgstr "خواندن {config_file}" #: ../fdroidserver/common.py #, python-brace-format @@ -1503,12 +1503,12 @@ msgstr "" #: ../fdroidserver/common.py msgid "Removing specified files" -msgstr "" +msgstr "برداشتن پرونده‌های مشخّص" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "برداشتن {path}" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -1547,7 +1547,7 @@ msgstr "" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" -msgstr "" +msgstr "بازنویسی {appid}" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" @@ -1679,7 +1679,7 @@ msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" -msgstr "" +msgstr "پرش از {appid}: از کار افتاده" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" @@ -1830,7 +1830,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" -msgstr "خطای ناشناخته‌ای یافت شد!" +msgstr "استثنایی ناشناخته پیدا شد!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py @@ -1854,11 +1854,11 @@ msgstr "" #: ../fdroidserver/lint.py msgid "Unnecessary leading space" -msgstr "" +msgstr "فضای پیشین نالازم" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" -msgstr "" +msgstr "فضای پسین نالازم" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1967,7 +1967,7 @@ msgstr "استفاده" #: /usr/lib/python3.11/optparse.py #, python-format msgid "Usage: %s\n" -msgstr "مصرف: %s\n" +msgstr "استفاده: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" @@ -1983,7 +1983,7 @@ msgstr "" #: ../fdroidserver/build.py msgid "Use build server" -msgstr "" +msgstr "استفاده از کارساز ساخت" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" @@ -2054,7 +2054,7 @@ msgstr "" #: ../fdroidserver/index.py msgid "Verifying index signature:" -msgstr "" +msgstr "تأیید کردن امضای نمایه:" #: ../fdroidserver/install.py #, python-brace-format @@ -2104,7 +2104,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "ZIP file archive" -msgstr "" +msgstr "بایگانی پروندهٔ ZIP" #: ../fdroidserver/install.py #, python-brace-format @@ -2212,7 +2212,7 @@ msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" -msgstr "" +msgstr "شبیه‌سازی {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" @@ -2263,7 +2263,7 @@ msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" -msgstr "" +msgstr "{path} را ایجاد کرد" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -2273,7 +2273,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" -msgstr "" +msgstr "حذف کردن: ‪repo/{apkfilename}‬" #: ../fdroidserver/scanner.py msgid "dependency file without lock" @@ -2309,8 +2309,8 @@ msgstr "" #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "انتظار %s آرگومان می‌رفت" +msgstr[1] "انتظار %s آرگومان می‌رفت" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2328,11 +2328,11 @@ msgstr "" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" -msgstr "" +msgstr "انتظار آرگومان می‌رفت" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" -msgstr "" +msgstr "fdroid [] [-h|--help|--version|]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" @@ -2352,7 +2352,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "gzip file archive" -msgstr "" +msgstr "بایگانی پروندهٔ gzip" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2453,7 +2453,7 @@ msgstr "" #: ../fdroidserver/signatures.py msgid "no APK supplied" -msgstr "" +msgstr "هیج APKای داده نشده" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2561,13 +2561,13 @@ msgstr "گزینه‌ها" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" -msgstr "" +msgstr "پایمالی {path} موجود" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" -msgstr "" +msgstr "آرگومان‌های موقعیتی" #: ../fdroidserver/common.py #, python-brace-format @@ -2622,13 +2622,13 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "shared library" -msgstr "" +msgstr "کتابخانهٔ اشتراکی" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" -msgstr "نسخه برنامه را نمایش داده و خارج می‌شود" +msgstr "نمایش نگارش برنامه و خروج" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py @@ -2636,7 +2636,7 @@ msgstr "نسخه برنامه را نمایش داده و خارج می‌شود #: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py msgid "show this help message and exit" -msgstr "این پیام راهنما را نمایش داده و خارج می‌شود" +msgstr "نمایش این پیام راهنما و خروج" #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." @@ -2661,7 +2661,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "static library" -msgstr "" +msgstr "کتابخانهٔ ایستا" #: ../fdroidserver/build.py #, python-brace-format @@ -2677,7 +2677,7 @@ msgstr "" #: ../fdroidserver/install.py msgid "true" -msgstr "" +msgstr "درست" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2698,7 +2698,7 @@ msgstr "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" -msgstr "" +msgstr "آرگومان‌های ناشناخته: %s" #: ../fdroidserver/common.py #, python-brace-format @@ -2709,7 +2709,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " -msgstr "مصرف: " +msgstr "استفاده: " #: ../fdroidserver/deploy.py #, python-brace-format @@ -2722,7 +2722,7 @@ msgstr "" #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "بله" #: ../fdroidserver/publish.py #, python-brace-format @@ -2848,9 +2848,9 @@ msgid "{path} is not \"key: value\" dict, but a {datatype}!" msgstr "" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} is not a standard config file!" -msgstr "'sdk_path' تنظیم نشده است در config.yml!" +msgstr "{path} پروندهٔ پیکربندی استانداردی نیست!" #: ../fdroidserver/index.py #, python-brace-format @@ -2880,7 +2880,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" -msgstr "" +msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2895,11 +2895,11 @@ msgstr "" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{} ساخت شکست خورد" +msgstr[1] "{} ساخت شکست خوردند" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{} ساخت موفّق شد" +msgstr[1] "{} ساخت موفّق شدند" From a8c354a2d017ddd211c2dd6d0ff84d7f1ba6f74d Mon Sep 17 00:00:00 2001 From: Peter Dave Hello Date: Tue, 26 Nov 2024 19:02:00 +0100 Subject: [PATCH 1812/2116] Translated using Weblate: Chinese (Traditional Han script) (zh_Hant) by Peter Dave Hello Currently translated at 81.9% (501 of 611 strings) Co-authored-by: Peter Dave Hello Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hant/ Translation: F-Droid/F-Droid Server --- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 38 +++++++++++----------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 5862d6b4..35ebba4f 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -12,7 +12,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-10-30 19:03+0000\n" +"PO-Revision-Date: 2024-11-26 15:16+0000\n" "Last-Translator: Peter Dave Hello \n" "Language-Team: Chinese (Traditional Han script) \n" "Language: zh_Hant\n" @@ -20,7 +20,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.8.2-dev\n" +"X-Generator: Weblate 5.9-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -337,11 +337,11 @@ msgstr "AutoUpdateMode 與 UpdateCheckMode:HTTP 必須有一個模式。" #: ../fdroidserver/install.py msgid "Automatic no to all prompts." -msgstr "" +msgstr "自動拒絕所有提示。" #: ../fdroidserver/install.py msgid "Automatic yes to all prompts." -msgstr "" +msgstr "自動同意所有提示。" #: ../fdroidserver/index.py #, python-brace-format @@ -466,9 +466,9 @@ msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at msgstr "衝突的參數:無法同時使用 '--verbose' 和 '--quiet' 參數。" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "衝突的配置文件! 使用新文件 {newfile}, 忽略舊文件 {oldfile} !" +msgstr "設定檔衝突!使用 {newfile},忽略 {oldfile}!" #: ../fdroidserver/common.py #, python-brace-format @@ -727,9 +727,9 @@ msgstr "" "> " #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "配置文件 {configname} 中的 環境變量 {var} 還沒有設置 !" +msgstr "設定檔 {configname} 的環境變數 {var} 尚未設定!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" @@ -753,7 +753,7 @@ msgstr "自 APKs 捽取出簽名" #: ../fdroidserver/install.py msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "" +msgstr "無法從任何已知來源下載 F-Droid.apk!" #: ../fdroidserver/update.py #, python-brace-format @@ -1224,7 +1224,7 @@ msgstr "查無附加的設備" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." -msgstr "" +msgstr "未找到可用於執行 `adb install` 的裝置!請連接一台裝置。" #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1441,7 +1441,7 @@ msgstr "在終端機顥示祕密變數以便於複製/貼上" #: ../fdroidserver/install.py #, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "" +msgstr "已根據您的地區({country_code})啟用了隱私模式。" #: ../fdroidserver/scanner.py #, python-format @@ -1636,7 +1636,7 @@ msgstr[0] "掃瞄器發現 {} 問題" #: ../fdroidserver/scanner.py msgid "Scanning APK for extra signing blocks." -msgstr "" +msgstr "正在掃描 APK 以檢查額外的簽章區塊。" #: ../fdroidserver/scanner.py #, fuzzy @@ -2111,7 +2111,7 @@ msgstr "正在驗證索引簽名:" #: ../fdroidserver/install.py #, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "" +msgstr "正在使用 apksigner 驗證套件 {path}。" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format @@ -2124,7 +2124,7 @@ msgstr "關於中介資料可能錯誤的警告" #: ../fdroidserver/scanner.py msgid "WebAssembly binary file" -msgstr "" +msgstr "WebAssembly 二進位檔案" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2141,11 +2141,11 @@ msgstr "當簽署或驗證失敗時,以錯誤碼結束。" #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "" +msgstr "您是否想透過 adb 下載並安裝 F-Droid.apk?(是/否)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "" +msgstr "您是否想從 f-droid.org 下載應用程式?(是/否)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2163,7 +2163,7 @@ msgstr "ZIP 壓縮檔案" #: ../fdroidserver/install.py #, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "" +msgstr "adb 回報 {serial} 為「{status}」!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2794,7 +2794,7 @@ msgstr "因為 virustotal.com 正在限制收到請求的頻率, 這邊正在 #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "是" #: ../fdroidserver/publish.py #, python-brace-format @@ -2911,7 +2911,7 @@ msgstr "{path} 已被 VirusTotal 標記 {count} 次:" #: ../fdroidserver/install.py #, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "" +msgstr "{path} 的指紋({fingerprint})不正確!" #: ../fdroidserver/common.py #, python-brace-format From 222f19d1673945fb581872ac8969b025d060a250 Mon Sep 17 00:00:00 2001 From: Ldm Public Date: Tue, 26 Nov 2024 19:02:00 +0100 Subject: [PATCH 1813/2116] Translated using Weblate: French (fr) by Ldm Public Currently translated at 93.7% (573 of 611 strings) Co-authored-by: Ldm Public Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 6b62162b..e5f7d6fa 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -31,7 +31,7 @@ # translator , 2022. # Julien Maulny , 2022. # Translator , 2022, 2023. -# Ldm Public , 2022, 2023. +# Ldm Public , 2022, 2023, 2024. # TopFox , 2022. # John Donne , 2022, 2023. # Deleted User , 2023. @@ -44,8 +44,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-11-24 18:41+0000\n" -"Last-Translator: Sylvain Pichon \n" +"PO-Revision-Date: 2024-11-26 15:16+0000\n" +"Last-Translator: Ldm Public \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -674,7 +674,7 @@ msgstr "Ne pas utiliser les sommes de contrôle rsync" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "" +msgstr "Téléchager F-Droid.apk en utilisant des miroirs avec moins de fuites réseaux" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -738,12 +738,12 @@ msgstr "ERREUR : hébergeur git « %s » non supporté, les corrections sont #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" -msgstr "" +msgstr "ERREUR : {key} dans {path} n'est pas \"archive\" ou \"repo\"." #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" -msgstr "" +msgstr "ERREUR : {key} :{subkey} dans {path} n'est pas une clé valide parmi : {allowed_keys}." #: ../fdroidserver/__main__.py #, python-brace-format @@ -766,7 +766,7 @@ msgstr "La variable d'environnent {var} de {configname} n'est pas configurée !" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "" +msgstr "Erreur lors du déploiement 'github_releases' : {} est absent (vous devriez peut-être d'abord lancer `fdroid update`)." #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -786,7 +786,7 @@ msgstr "Extraction des signatures à partir des APKs" #: ../fdroidserver/install.py msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "" +msgstr "F-Droid.apk ne peut pas être téléchargé depuis les source connues !" #: ../fdroidserver/update.py #, python-brace-format @@ -905,7 +905,7 @@ msgstr "Plusieurs fichiers de bloc de signature JAR trouvé à {path}" #: ../fdroidserver/common.py #, fuzzy msgid "Found multiple Signer Certificates!" -msgstr "Plusieurs certificats de signature ont étés trouvés!" +msgstr "Plusieurs signataires de certificats ont été trouvés !" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1250,7 +1250,7 @@ msgstr "Aucun périphérique connecté trouvé" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." -msgstr "" +msgstr "Aucun appareil trouvé pour `adb install` ! Veuillez en branchez un." #: ../fdroidserver/index.py msgid "No fingerprint in URL." From dbd6034738a4a0946623a17ad1f988adfd839486 Mon Sep 17 00:00:00 2001 From: Joan Pujolar Date: Tue, 26 Nov 2024 19:02:00 +0100 Subject: [PATCH 1814/2116] Translated using Weblate: Catalan (ca) by Joan Pujolar Currently translated at 100.0% (611 of 611 strings) Co-authored-by: Joan Pujolar Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ca/ Translation: F-Droid/F-Droid Server --- locale/ca/LC_MESSAGES/fdroidserver.po | 45 ++++++++++++++------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index b49c98e6..51fdea40 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -5,20 +5,21 @@ # raulmagdalena <4omoald1a@mozmail.com>, 2024. # Adrià Martín , 2024. # unmes , 2024. +# Joan Pujolar , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-09-30 03:51+0000\n" -"Last-Translator: pitroig \n" +"PO-Revision-Date: 2024-11-26 15:16+0000\n" +"Last-Translator: Joan Pujolar \n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.9-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -205,7 +206,7 @@ msgstr "'{value}' no és un {field} vàlid; hauria de ser {pattern}" #: ../fdroidserver/checkupdates.py msgid "--merge-request only runs on a single appid!" -msgstr "" +msgstr "--merge-request només funciona amb un sol ID d'app!" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -336,11 +337,11 @@ msgstr "AutoUpdateMode amb UpdateCheckMode: HTTP ha de tenir un patró." #: ../fdroidserver/install.py msgid "Automatic no to all prompts." -msgstr "" +msgstr "No automàtic a totes les demandes." #: ../fdroidserver/install.py msgid "Automatic yes to all prompts." -msgstr "" +msgstr "Sí automàtic a totes les demandes." #: ../fdroidserver/index.py #, python-brace-format @@ -436,7 +437,7 @@ msgstr "Actualització neta - no utilitza la memòria cau, reprocessa tots els A #: ../fdroidserver/common.py msgid "Color the log output" -msgstr "" +msgstr "Color de l'egressió del registre" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." @@ -453,7 +454,7 @@ msgstr "Publicar els canvis" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "" +msgstr "Sancioneu els canvis, pitgeu i després feu la, sol·licitud de fusió" #: ../fdroidserver/metadata.py #, python-brace-format @@ -640,7 +641,7 @@ msgstr "No usis les sumes de verificació \"rsync\"" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "" +msgstr "Descarregar F-Droid.apk amb els miralls que presenten menys filtracions a la xarxa" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -752,7 +753,7 @@ msgstr "Extreu les signatures dels APKs" #: ../fdroidserver/install.py msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "" +msgstr "F-Droid.apk no s'ha pogut descarregar de cap font coneguda!" #: ../fdroidserver/update.py #, python-brace-format @@ -1214,7 +1215,7 @@ msgstr "No s'ha trobat cap dispositiu adjunt" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." -msgstr "" +msgstr "No s'han trobat dispositius per a `adb install`! Sisplau, connecteu-ne algun." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1422,7 +1423,7 @@ msgstr "Imprimeix la variable secreta al terminal per a copiar/enganxar fàcilme #: ../fdroidserver/install.py #, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "" +msgstr "El mode privat s'ha habilitat en base al vostre ({country_code})." #: ../fdroidserver/scanner.py #, python-format @@ -1547,7 +1548,7 @@ msgstr "Restringeix la sortida a avisos i errors" #: ../fdroidserver/net.py #, python-format msgid "Retrying failed download: %s" -msgstr "" +msgstr "Reintent fallit de descàrrega de: %s" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1616,7 +1617,7 @@ msgstr[1] "L'escàner ha trobat {} problemes" #: ../fdroidserver/scanner.py msgid "Scanning APK for extra signing blocks." -msgstr "" +msgstr "Pentinant L'APK en busca de blocs signants addicionals." #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." @@ -2075,7 +2076,7 @@ msgstr "Verificació de la signatura de l'índex:" #: ../fdroidserver/install.py #, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "" +msgstr "Verificant la {path} del paquet amb el signador d'apk apksigner." #: ../fdroidserver/deploy.py #, python-brace-format @@ -2088,7 +2089,7 @@ msgstr "Avisa de possibles errors a les metadades" #: ../fdroidserver/scanner.py msgid "WebAssembly binary file" -msgstr "" +msgstr "Document binari d'AssemblatgeWeb" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2104,11 +2105,11 @@ msgstr "Quan signar o verificar falla, sortiu amb un codi d'error." #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "" +msgstr "Us va bé de descarregar i instal·lar F-Droid.apk via adb? (SÍ/no)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "" +msgstr "Us va bé de descarregar la/es app/s des de f-droid.org? (SÍ/no)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2125,7 +2126,7 @@ msgstr "arxiu de fitxers ZIP" #: ../fdroidserver/install.py #, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "" +msgstr "adb informa que {serial} està en \"{status}\"!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2693,7 +2694,7 @@ msgstr "els arguments següents són obligatoris: %s" #: ../fdroidserver/install.py msgid "true" -msgstr "" +msgstr "ver" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2738,7 +2739,7 @@ msgstr "virustotal.com és limitant de velocitat, esperant tornar-ho a provar... #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "sí" #: ../fdroidserver/publish.py #, python-brace-format @@ -2856,7 +2857,7 @@ msgstr "{path} ha estat marcat pel virustotal {count} vegades:" #: ../fdroidserver/install.py #, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "" +msgstr "{path} no té la ditada correcta ({fingerprint})!" #: ../fdroidserver/common.py #, python-brace-format From a45893addfe5707f9b1c38f91a7723b357ff20a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=AE=A4=E0=AE=AE=E0=AE=BF=E0=AE=B4=E0=AF=8D=E0=AE=A8?= =?UTF-8?q?=E0=AF=87=E0=AE=B0=E0=AE=AE=E0=AF=8D?= Date: Tue, 26 Nov 2024 19:02:00 +0100 Subject: [PATCH 1815/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Tamil?= =?UTF-8?q?=20(ta)=20by=20=E0=AE=A4=E0=AE=AE=E0=AE=BF=E0=AE=B4=E0=AF=8D?= =?UTF-8?q?=E0=AE=A8=E0=AF=87=E0=AE=B0=E0=AE=AE=E0=AF=8D=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (611 of 611 strings) Co-authored-by: தமிழ்நேரம் Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ta/ Translation: F-Droid/F-Droid Server --- locale/ta/LC_MESSAGES/fdroidserver.po | 1227 +++++++++++++------------ 1 file changed, 621 insertions(+), 606 deletions(-) diff --git a/locale/ta/LC_MESSAGES/fdroidserver.po b/locale/ta/LC_MESSAGES/fdroidserver.po index 7bd09e49..9f65f3dc 100644 --- a/locale/ta/LC_MESSAGES/fdroidserver.po +++ b/locale/ta/LC_MESSAGES/fdroidserver.po @@ -2,26 +2,29 @@ # This file is put in the public domain. # K.B.Dharun Krishna , 2022. # Naveen , 2024. +# தமிழ்நேரம் , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-01-25 11:40+0000\n" -"Last-Translator: Naveen \n" +"PO-Revision-Date: 2024-11-26 18:01+0000\n" +"Last-Translator: தமிழ்நேரம் \n" "Language-Team: Tamil \n" "Language: ta\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.9-dev\n" #: ../fdroidserver/nightly.py msgid "" "\n" "SSH public key to be used as deploy key:" msgstr "" +"\n" +"பாஓடு பொது விசை வரிசைப்படுத்தல் விசையாகப் பயன்படுத்தப்பட வேண்டும்:" #: ../fdroidserver/nightly.py #, python-brace-format @@ -29,51 +32,53 @@ msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" +"\n" +"{path} பிழைத்திருத்த_கிச்டோர் ரகசிய மாறிக்குக் குறியாக்கம் செய்யப்பட்டுள்ளது:" #: ../fdroidserver/lint.py #, python-format msgid "\"%s/\" has no matching metadata file!" -msgstr "" +msgstr "\"%s/\" க்கு பொருந்தக்கூடிய மேனிலை தரவு கோப்பு இல்லை!" #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" -msgstr "" +msgstr "\"local_copy_dir\" {path} இல்லை!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "" +msgstr "\"{apkfilename}\" ஏற்கனவே {dev} இல் நிறுவப்பட்டுள்ளது." #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" +msgstr "\"{path}\" காலாவதியான {name} ({version}) உள்ளது" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" -msgstr "" +msgstr "\"{path}\" அண்மைக் கால {name} ({version})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "\"{path}\" exists but s3cmd is not installed!" -msgstr "" +msgstr "\"{path}\" உள்ளது, ஆனால் S3CMD நிறுவப்படவில்லை!" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "" +msgstr "\"{path}\" என்பது ஒரு உதவி கோப்பு வடிவம் அல்ல (பயன்பாடு: மெட்டாடேட்டா/*.yml)" #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" is signed by a key that is not allowed:" -msgstr "" +msgstr "\"{path}\" அனுமதிக்கப்படாத ஒரு விசையால் கையொப்பமிடப்பட்டுள்ளது:" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "\"{url}\" is not a valid URL!" -msgstr "" +msgstr "\"{url}\" சரியான முகவரி அல்ல!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -81,8 +86,8 @@ msgstr "" #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(option)s விருப்பத்திற்கு %(number)d உரையாடல் தேவைப்படுகிறது" +msgstr[1] "%(option)s விருப்பத்திற்கு %(number)d வாதங்கள் தேவை" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -94,12 +99,12 @@ msgstr "%(prog)s: பிழை: %(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "%d apks கையொப்பமிடவோ சரிபார்க்கவோ தோல்வியுற்றது!" #: ../fdroidserver/scanner.py #, python-format msgid "%d problems found" -msgstr "" +msgstr "%d சிக்கல்கள் காணப்படுகின்றன" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -112,328 +117,328 @@ msgstr "%prog [விருப்பங்கள்]" #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" -msgstr "" +msgstr "%r அழைக்க முடியாது" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" -msgstr "" +msgstr "%s ஒரு கட்டளையை உருவாக்கவில்லை!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" -msgstr "" +msgstr "%s மோசமான SHA-256: %s" #: ../fdroidserver/lint.py #, python-format msgid "%s is not an accepted build field" -msgstr "" +msgstr "%s ஏற்றுக்கொள்ளப்பட்ட கட்டட புலம் அல்ல" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "%s option does not take a value" -msgstr "" +msgstr "%s விருப்பம் ஒரு மதிப்பை எடுக்காது" #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" -msgstr "" +msgstr "config.yml இல் 'கீபாச்' காணப்படவில்லை!" #: ../fdroidserver/common.py msgid "'keystore' is NONE and 'smartcardoptions' is blank!" -msgstr "" +msgstr "'கீச்டோர்' எதுவுமில்லை, 'அறிவுள்ள கார்டோப்சன்ச்' காலியாக உள்ளது!" #: ../fdroidserver/common.py msgid "'keystore' not found in config.yml!" -msgstr "" +msgstr "'கீச்டோர்' config.yml இல் காணப்படவில்லை!" #: ../fdroidserver/common.py msgid "'keystorepass' not found in config.yml!" -msgstr "" +msgstr "'கீச்டோர்பாச்' config.yml இல் காணப்படவில்லை!" #: ../fdroidserver/common.py msgid "'repo_keyalias' not found in config.yml!" -msgstr "" +msgstr "config.yml இல் 'ரெப்போ_காலியாச்' காணப்படவில்லை!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" -msgstr "" +msgstr "'தேவை' என்பது நிலைப்பாடுகளுக்கு தவறான வாதமாகும்" #: ../fdroidserver/common.py msgid "'sdk_path' not set in config.yml!" -msgstr "" +msgstr "'sdk_path' config.yml இல் அமைக்கப்படவில்லை!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" -msgstr "" +msgstr "'{aapt}' மிகவும் பழையது, fdroid க்கு கட்டிய-கருவிகள்-{version} அல்லது புதியவை தேவை!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" +msgstr "'{field}' சீரற்ற வரிசையில் இருக்கும்! ஆர்டர் முக்கியத்துவம் வாய்ந்ததாக இருந்தால் () அல்லது [] அடைப்புக்குறிகளைப் பயன்படுத்தவும்!" #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" -msgstr "" +msgstr "'{path}' செயல்படுத்தத் தவறிவிட்டது!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" +msgstr "'{path}' தவறான வடிவத்தைக் கொண்டுள்ளது, அது ஒரு அகராதியாக இருக்க வேண்டும்!" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" -msgstr "" +msgstr "'{value}' என்பது {appid} இல் செல்லுபடியாகும் {field} அல்ல. ரீசெக்ச் முறை: {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field}, should be {pattern}" -msgstr "" +msgstr "'{value}' என்பது செல்லுபடியாகும் {field} அல்ல, {pattern} ஆக இருக்க வேண்டும்" #: ../fdroidserver/checkupdates.py msgid "--merge-request only runs on a single appid!" -msgstr "" +msgstr "-மெர்ச்-கோருதல் ஒரு பயன்பாட்டில் மட்டுமே இயங்குகிறது!" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "...checkupdate failed for {appid} : {error}" -msgstr "" +msgstr "... {appid}: {error} க்கு செக்அப்டேட் தோல்வியுற்றது" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" -msgstr "" +msgstr ".__ அழைப்பு __ () வரையறுக்கப்படவில்லை" #: ../fdroidserver/lint.py msgid "/issues is missing" -msgstr "" +msgstr "/சிக்கல்கள் இல்லை" #: ../fdroidserver/mirror.py msgid "A URL is required as an argument!" -msgstr "" +msgstr "ஒரு வாதமாக ஒரு முகவரி தேவை!" #: ../fdroidserver/common.py #, python-brace-format msgid "APK signatures have different certificates in {path}:" -msgstr "" +msgstr "APK கையொப்பங்கள் {path} இல் வெவ்வேறு சான்றிதழ்களைக் கொண்டுள்ளன:" #: ../fdroidserver/__main__.py msgid "Add PGP signatures using GnuPG for packages in repo" -msgstr "" +msgstr "ரெப்போவில் உள்ள தொகுப்புகளுக்கு GNUPG ஐப் பயன்படுத்தி PGP கையொப்பங்களைச் சேர்க்கவும்" #: ../fdroidserver/update.py msgid "Add a repo signing key to an unsigned repo" -msgstr "" +msgstr "கையொப்பமிடாத ரெப்போவுக்கு ரெப்போ கையொப்பமிடும் விசையைச் சேர்க்கவும்" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" -msgstr "" +msgstr "காணாமல் போன APK களுக்கு எலும்புக்கூடு மேனிலை தரவு கோப்புகளைச் சேர்க்கவும்" #: ../fdroidserver/update.py #, python-brace-format msgid "Adding new repo for only {name}" -msgstr "" +msgstr "புதிய ரெப்போவை {name} க்கு மட்டுமே சேர்ப்பது" #: ../fdroidserver/init.py msgid "Alias of the repo signing key in the keystore" -msgstr "" +msgstr "கீச்டோரில் ரெப்போ கையொப்பமிடும் விசையின் மாற்றுப்பெயர்" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" +msgstr "Lentapcigningkeys காணவில்லை, ஆனால் குறிப்பு பைனரி வழங்கப்பட்டது" #: ../fdroidserver/import_subcommand.py msgid "Allows a different revision (or git branch) to be specified for the initial import" -msgstr "" +msgstr "ஆரம்ப இறக்குமதிக்கு வேறு திருத்தம் (அல்லது அறிவிலி கிளை) குறிப்பிட அனுமதிக்கிறது" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" -msgstr "" +msgstr "முழு காப்பக பகுதியையும் பிரதிபலிக்கிறது" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" -msgstr "" +msgstr "மறுபயன்பாடு -எல் போன்ற சிக்கல்களை வடிவமைத்தல் பற்றியும் எச்சரிக்கவும்" #: ../fdroidserver/scanner.py msgid "Android AAR library" -msgstr "" +msgstr "ஆண்ட்ராய்டு AAR நூலகம்" #: ../fdroidserver/scanner.py msgid "Android APK file" -msgstr "" +msgstr "ஆண்ட்ராய்டு APK கோப்பு" #: ../fdroidserver/scanner.py msgid "Android DEX code" -msgstr "" +msgstr "ஆண்ட்ராய்டு DEX குறியீடு" #: ../fdroidserver/init.py #, python-brace-format msgid "Android SDK not found at {path}!" -msgstr "" +msgstr "ஆண்ட்ராய்டு SDK {path} இல் காணப்படவில்லை!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' does not exist!" -msgstr "" +msgstr "ஆண்ட்ராய்டு SDK பாதை '{path}' இல்லை!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK path '{path}' is not a directory!" -msgstr "" +msgstr "ஆண்ட்ராய்டு SDK பாதை '{path}' ஒரு அடைவு அல்ல!" #: ../fdroidserver/common.py #, python-brace-format msgid "Android SDK tool {cmd} not found!" -msgstr "" +msgstr "ஆண்ட்ராய்டு SDK கருவிகள் {cmd} கிடைக்கவில்லை!" #: ../fdroidserver/lint.py msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "பயன்பாட்டில் பைனரிகள் உள்ளன, ஆனால் சான்றிதழுடன் தொடர்புடைய AllowedAPKSigningKeys இல்லை." #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" +msgstr "பயன்பாட்டில் Nosourcencens அல்லது காப்பகப் போலிசி \"0 பதிப்புகள்\" உள்ளன, ஆனால் ஆட்டோப்டேட்மோட் அல்லது புதுப்பிப்பு தொழில்நுட்பம் எதுவும் இல்லை" #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" +msgstr "பயன்பாட்டில் Nosourcencence அல்லது காப்பகப் போலிசி \"0 பதிப்புகள்\" அல்லது 0 உள்ளது, ஆனால் ஆட்டோப்டேட்மோட் அல்லது புதுப்பிப்பு தொழில்நுட்பம் எதுவும் இல்லை" #: ../fdroidserver/lint.py #, python-brace-format msgid "App is in '{repo}' but has a link to {url}" -msgstr "" +msgstr "பயன்பாடு '{repo}' இல் உள்ளது, ஆனால் {url} க்கான இணைப்பைக் கொண்டுள்ளது" #: ../fdroidserver/lint.py msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "" +msgstr "பயன்பாட்டு பதிப்பில் பைனரி உள்ளது, ஆனால் பின் சான்றிதழுடன் தொடர்புடைய AllowedAPKSigningKeys இல்லை." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" -msgstr "" +msgstr "சேர்ப்பது .git தேவையில்லை" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" -msgstr "" +msgstr "தவறான கையொப்பத்துடன் காப்பக {apkfilename}!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." -msgstr "" +msgstr "புதுப்பிப்பு தொழில்நுட்பம் கொண்ட ஆட்டோப்டேட்மோட்: HTTP ஒரு வடிவத்தைக் கொண்டிருக்க வேண்டும்." #: ../fdroidserver/install.py msgid "Automatic no to all prompts." -msgstr "" +msgstr "எல்லா தூண்டுதல்களுக்கும் தானியங்கி இல்லை." #: ../fdroidserver/install.py msgid "Automatic yes to all prompts." -msgstr "" +msgstr "எல்லா தூண்டுதல்களுக்கும் தானியங்கி ஆம்." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" +msgstr "கண்ணாடியில் \"{mirrortype}\" மோசமான நுழைவு வகை: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" -msgstr "" +msgstr "அடிப்படை முகவரி கண்ணாடிக்கு, வினவல் சரம் பயன்படுத்தி குறியீட்டு கையொப்பமிடும் விசையை சேர்க்கலாம்:? கைரேகை =" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "" +msgstr "கிளை '{branch}' '{versionName}'கட்டமைப்பில் உறுதிமொழியாக பயன்படுத்தப்படுகிறது" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" -msgstr "" +msgstr "கிளை '{branch}' '{srclib}'இல் உறுதிமொழியாக பயன்படுத்தப்படுகிறது" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" -msgstr "" +msgstr "உடைந்த சிம்லிங்க்: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" -msgstr "" +msgstr "மூலத்திலிருந்து ஒரு தொகுப்பை உருவாக்குங்கள்" #: ../fdroidserver/build.py msgid "Build all applications available" -msgstr "" +msgstr "கிடைக்கக்கூடிய அனைத்து பயன்பாடுகளையும் உருவாக்குங்கள்" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" -msgstr "" +msgstr "`Fdroid இறக்குமதி` மூலம் உருவாக்கப்பட்ட உருவாக்கு - ஆயத்தம் செய்தவுடன் முடக்கு வரியை அகற்றவும்" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" -msgstr "" +msgstr "மேனிலை தரவு அறிவிலி ரெப்போ உருவாக்கப்படாத மாற்றங்களைக் கொண்டுள்ளது!" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" -msgstr "" +msgstr "ஒவ்வொரு தொகுப்பின் அண்மைக் கால பதிப்பை மட்டுமே உருவாக்குங்கள்" #: ../fdroidserver/init.py #, python-format msgid "Built repo based in \"%s\" with this config:" -msgstr "" +msgstr "இந்த உள்ளமைவுடன் \"%s\" அடிப்படையில் ரெப்போ கட்டப்பட்டது:" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" +msgstr "CurrentVersionCode இல்லாமல் பயன்பாட்டை தானாக புதுப்பிக்க முடியாது" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "ச்கேன் செய்யும் போது {} பிழை காரணமாக உருவாக்க முடியாது" +msgstr[1] "ச்கேன் செய்யும் போது {} பிழைகள் காரணமாக உருவாக்க முடியாது" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" -msgstr "" +msgstr "\"{path}\" ஐ மீண்டும் எழுத முடியாது" #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" -msgstr "" +msgstr "வகைகள் '%s' செல்லுபடியாகாது" #: ../fdroidserver/lint.py msgid "Categories are not set" -msgstr "" +msgstr "வகைகள் அமைக்கப்படவில்லை" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" +msgstr "வகை \"{category}\" வரையறுக்கப்பட்டுள்ளது, ஆனால் எந்த பயன்பாடுகளுக்கும் பயன்படுத்தப்படவில்லை!" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" -msgstr "" +msgstr "பயன்பாடுகளுக்கான புதுப்பிப்புகளைச் சரிபார்க்கவும்" #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "" +msgstr "{appid} க்கான காப்பகத்தை சரிபார்க்கிறது- பயன்பாடுகள்: {Integer}, காப்புபதிப்புகள்: {keep}, காப்பகங்கள்: {arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" -msgstr "" +msgstr "தூய்மையான புதுப்பிப்பு - தற்காலிக சேமிப்பைப் பயன்படுத்த வேண்டாம், அனைத்து APK ஐ மீண்டும் செயலாக்குங்கள்" #: ../fdroidserver/common.py msgid "Color the log output" -msgstr "" +msgstr "பதிவு வெளியீட்டை வண்ணமயமாக்கவும்" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." -msgstr "" +msgstr "கமா பிரிக்கப்பட்ட வகைகளின் பட்டியல்." #: ../fdroidserver/__main__.py #, python-format @@ -442,270 +447,272 @@ msgstr "'%s' கட்டளை அங்கீகரிக்கப்படவ #: ../fdroidserver/checkupdates.py msgid "Commit changes" -msgstr "" +msgstr "மாற்றங்களைச் செய்யுங்கள்" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "" +msgstr "மாற்றங்களைச் செய்யுங்கள், தள்ளுங்கள், பின்னர் ஒன்றிணைக்கும் கோரிக்கையை உருவாக்குங்கள்" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" +msgstr ".Yml மற்றும் உள்ளூர்மயமாக்கப்பட்ட கோப்புகளுக்கு இடையில் முரண்பட்ட \"{field}\" வரையறைகள்:" #: ../fdroidserver/__main__.py msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." -msgstr "" +msgstr "முரண்பட்ட வாதங்கள்: '--verbose' மற்றும் '--quiet' ஒரே நேரத்தில் குறிப்பிட முடியாது." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" +msgstr "முரண்பட்ட கட்டமைப்பு கோப்புகள்! {newfile} ஐப் பயன்படுத்துதல், {oldfile} ஐ புறக்கணித்து!" #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" -msgstr "" +msgstr "உங்கள் கணினியில் '{command}' கண்டுபிடிக்க முடியவில்லை" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" -msgstr "" +msgstr "அண்மைக் கால பதிப்பு குறியீட்டைக் கண்டுபிடிக்க முடியவில்லை" #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" -msgstr "" +msgstr "அண்மைக் கால பதிப்பு பெயரைக் கண்டுபிடிக்க முடியவில்லை" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not find {path} to remove it" -msgstr "" +msgstr "அதை அகற்ற {path} கண்டுபிடிக்க முடியவில்லை" #: ../fdroidserver/update.py #, python-brace-format msgid "Could not open APK {path} for analysis: " -msgstr "" +msgstr "பகுப்பாய்விற்கு பயன்பாடு {path}ஐ திறக்க முடியவில்லை: " #: ../fdroidserver/common.py #, python-brace-format msgid "Could not parse size \"{size}\", wrong type \"{type}\"" -msgstr "" +msgstr "அளவை \"{size}\", தவறான வகை \"{type}\"" #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" -msgstr "" +msgstr "பயன்பாட்டு ஐடியைக் கண்டுபிடிக்க முடியவில்லை" #: ../fdroidserver/checkupdates.py msgid "Couldn't find any version information" -msgstr "" +msgstr "எந்த பதிப்பு தகவலையும் கண்டுபிடிக்க முடியவில்லை" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" -msgstr "" +msgstr "தொகுப்பு ஐடியைக் கண்டுபிடிக்க முடியவில்லை" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" -msgstr "" +msgstr "ஏற்கனவே கையொப்பமிடும் விசை அமைப்பை மேலெழுத மறுக்கிறது!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Created new container \"{name}\"" -msgstr "" +msgstr "புதிய கொள்கலனை உருவாக்கியது \"{name}\"" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating \"{path}\" for configuring s3cmd." -msgstr "" +msgstr "S3CMD ஐ கட்டமைக்க \"{path}\" ஐ உருவாக்குதல்." #: ../fdroidserver/publish.py msgid "Creating log directory" -msgstr "" +msgstr "பதிவு கோப்பகத்தை உருவாக்குதல்" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" -msgstr "" +msgstr "புதிய எச் 3 வாளியை உருவாக்குதல்: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" -msgstr "" +msgstr "வெளியீட்டு கோப்பகத்தை உருவாக்குதல்" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" -msgstr "" +msgstr "இந்த விசையுடன் கையொப்பமிடப்பட்ட குறியீட்டை உருவாக்குதல் (SHA256):" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" -msgstr "" +msgstr "தற்காலிக கோப்பகத்தை உருவாக்குதல்" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" -msgstr "" +msgstr "கையொப்பமிடுவதற்கான தயாரிப்பில் கையொப்பமிடாத குறியீட்டை உருவாக்குதல்" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "" +msgstr "CurrentVersionCode {CV} மிகப் பழமையான உருவாக்க நுழைவு {versionCode} ஐ விட குறைவாக உள்ளது" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" -msgstr "" +msgstr "Debug_keystore அமைக்கப்படவில்லை அல்லது மதிப்பு முழுமையடையாது" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" -msgstr "" +msgstr "ரெப்போவிலிருந்து மேனிலை தரவு இல்லாமல் APKS மற்றும்/அல்லது OBB களை நீக்கு" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "" +msgstr "காப்பகத்தை நீக்குதல், ரெப்போ மிகப் பெரியது ({size} அதிகபட்சம் {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "" +msgstr "கிட்-மிரர் வரலாற்றை நீக்குதல், ரெப்போ மிகப் பெரியது ({size} அதிகபட்சம் {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" -msgstr "" +msgstr "அறியப்படாத கோப்பை நீக்குதல்: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Description '%s' is just the app's summary" -msgstr "" +msgstr "விளக்கம் '%s' என்பது பயன்பாட்டின் சுருக்கம்" #: ../fdroidserver/lint.py msgid "Description has a duplicate line" -msgstr "" +msgstr "விளக்கம் ஒரு நகல் கோடு உள்ளது" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" +msgstr "விளக்கத்தில் ஒரு பட்டியல் (%s) உள்ளது, ஆனால் அது புல்லட் (*) அல்லது எண்ணற்ற (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" -msgstr "" +msgstr "நீளம் {length} இன் விளக்கம் {limit} கரி வரம்புக்கு மேல் உள்ளது" #: ../fdroidserver/common.py #, python-brace-format msgid "Did you mean config/{name}.yml?" -msgstr "" +msgstr "நீங்கள் கட்டமைப்பு/{name}.yml?" #: ../fdroidserver/lint.py #, python-brace-format msgid "Did you mean {code}?" -msgstr "" +msgstr "நீங்கள் {code} என்று சொன்னீர்களா?" #: ../fdroidserver/import_subcommand.py msgid "Do not add 'disable:' to the generated build entries" -msgstr "" +msgstr "உருவாக்கப்பட்ட உருவாக்க உள்ளீடுகளுக்கு 'முடக்கு:' ஐ முடக்க வேண்டாம்" #: ../fdroidserver/nightly.py msgid "Do not deploy the new files to the repo" -msgstr "" +msgstr "புதிய கோப்புகளை ரெப்போவுக்கு பயன்படுத்த வேண்டாம்" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Do not include \"{path}\" in URL!" -msgstr "" +msgstr "முகவரி இல் \"{path}\" சேர்க்க வேண்டாம்!" #: ../fdroidserver/init.py msgid "Do not prompt for Android SDK path, just fail" -msgstr "" +msgstr "ஆண்ட்ராய்டு SDK பாதைக்கு கேட்க வேண்டாம், தோல்வியடைகிறது" #: ../fdroidserver/nightly.py msgid "Do not remove the private keys generated from the keystore" -msgstr "" +msgstr "கீச்டோரிலிருந்து உருவாக்கப்பட்ட தனிப்பட்ட விசைகளை அகற்ற வேண்டாம்" #: ../fdroidserver/build.py msgid "Don't create a source tarball, useful when testing a build" -msgstr "" +msgstr "ஒரு மூலத்தை உருவாக்க வேண்டாம், ஒரு கட்டமைப்பைச் சோதிக்கும்போது பயனுள்ளதாக இருக்கும்" #: ../fdroidserver/build.py msgid "Don't refresh the repository, useful when testing a build with no internet connection" -msgstr "" +msgstr "இணைய இணைப்பு இல்லாத கட்டமைப்பைச் சோதிக்கும்போது பயனுள்ளதாக இருக்கும் களஞ்சியத்தை புதுப்பிக்க வேண்டாம்" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" -msgstr "" +msgstr "RSYNC CHECKSUMS ஐப் பயன்படுத்த வேண்டாம்" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "" +msgstr "நெட்வொர்க்கில் குறைவாக கசியும் கண்ணாடியைப் பயன்படுத்தி f-droid.apk ஐப் பதிவிறக்கவும்" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" -msgstr "" +msgstr "சிறிய களஞ்சியங்களின் முழுமையான கண்ணாடியைப் பதிவிறக்கவும்" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "%s பதிவிறக்குதல்" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." -msgstr "" +msgstr "களஞ்சியத்தை பதிவிறக்குவது ஏற்கனவே ஒரு முறை தோல்வியடைந்தது, மீண்டும் முயற்சிக்கவில்லை." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" -msgstr "" +msgstr "பதிவிறக்கம் {url} தோல்வியுற்றது. {error}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Duplicate Anti-Feature declaration at {path} was ignored!" -msgstr "" +msgstr "{path} இல் நகல்-அம்ச எதிர்ப்பு அறிவிப்பு புறக்கணிக்கப்பட்டது!" #: ../fdroidserver/index.py #, python-format msgid "Duplicate entry \"%s\" in mirrors config!" -msgstr "" +msgstr "கண்ணாடிகள் கட்டமைப்பில் நகல் நுழைவு \"%s\"!" #: ../fdroidserver/lint.py #, python-brace-format msgid "Duplicate link in '{field}': {url}" -msgstr "" +msgstr "'{field}' இல் நகல் இணைப்பு: {url}" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "பிழை: %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" +msgstr "பிழை: \"சேவையகம்\" துணைக்குழு அகற்றப்பட்டது, \"வரிசைப்படுத்தல்\" ஐப் பயன்படுத்தவும்!" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" +"பிழை: F-droid.org ஐ பிரதிபலிக்க இந்த கட்டளை ஒருபோதும் பயன்படுத்தப்படக்கூடாது!\n" +" F-droid.org இன் முழு கண்ணாடிக்கு 200 சிபிக்கு மேல் தேவைப்படுகிறது." #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" -msgstr "" +msgstr "பிழை: ஆதரிக்கப்படாத தொஒ வகை, திட்டுகள் வரவேற்கப்படுகின்றன!" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "" +msgstr "பிழை: ஆதரிக்கப்படாத அறிவிலி புரவலன் \"%s\", திட்டுகள் வரவேற்கப்படுகின்றன!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" -msgstr "" +msgstr "பிழை: {path} இல் {key} என்பது \"காப்பகம்\" அல்லது \"ரெப்போ\" அல்ல!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" -msgstr "" +msgstr "பிழை: {key}: {path} இல் {subkey} அனுமதிக்கப்பட்ட விசைகளில் இல்லை: {allowed_keys}!" #: ../fdroidserver/__main__.py #, python-brace-format msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "" +msgstr "குறியாக்கம் '{enc}' fdroid என அமைக்கப்பட்டுள்ளது. சிறந்த முடிவுகளுக்கு அதை 'UTF-8' என அமைக்கவும்." #: ../fdroidserver/init.py #, python-format @@ -713,639 +720,641 @@ msgid "" "Enter the path to the Android SDK (%s) here:\n" "> " msgstr "" +"ஆண்ட்ராய்டு SDK (%s) க்கு பாதையை இங்கே உள்ளிடவும்:\n" +" > " #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {var} from {configname} is not set!" -msgstr "" +msgstr "{configname} இருந்து இலிருந்து சுற்றுச்சூழல் மாறி {var} அமைக்கப்படவில்லை!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "" +msgstr "'Github_Releases' ஐ வரிசைப்படுத்துவதில் பிழை, {} இல்லை. (நீங்கள் முதலில் `fdroid புதுப்பிப்பை இயக்க வேண்டியிருக்கலாம்.)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" -msgstr "" +msgstr "ரெப்போ முகவரியைப் பெறும்போது பிழை" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" +msgstr "சிக்கல்கள் கண்டுபிடிக்கப்பட்டால் பூச்சியமற்ற குறியீட்டைக் கொண்டு வெளியேறவும்" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" -msgstr "" +msgstr "மூல களஞ்சியத்திலிருந்து பயன்பாட்டு மெட்டாடேட்டாவை பிரித்தெடுக்கவும்" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" -msgstr "" +msgstr "APK இலிருந்து கையொப்பத்தை பிரித்தெடுக்கவும்" #: ../fdroidserver/install.py msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "" +msgstr "அறியப்பட்ட எந்த மூலத்திலிருந்தும் f-droid.apk ஐ பதிவிறக்கம் செய்ய முடியவில்லை!" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed copying {path}: {error}" -msgstr "" +msgstr "தோல்வியுற்ற நகலெடுப்பதில் {path}: {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" -msgstr "" +msgstr "'{Apkfilename}' க்கான கையொப்பங்களைப் பெறுவதில் தோல்வி: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed reading {path}: {error}" -msgstr "" +msgstr "தோல்வியுற்ற வாசிப்பு {path}: {error}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed resizing {path}: {error}" -msgstr "" +msgstr "மறுஅளவு தோல்வியுற்றது {path}: {error}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Failed to create S3 bucket: {url}" -msgstr "" +msgstr "S3 வாளியை உருவாக்குவதில் தோல்வி: {url}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, deleting {path}" -msgstr "" +msgstr "APK தகவல்களைப் பெறுவதில் தோல்வி, {path} நீக்குதல்" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" -msgstr "" +msgstr "APK தகவல்களைப் பெறுவதில் தோல்வி, {path}யைத் தவிர்ப்பது}" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" -msgstr "" +msgstr "முக்கிய கைரேகை கையொப்பமிடுவதில் தோல்வி" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" -msgstr "" +msgstr "{dev} இல் '{apkfilename}' ஐ நிறுவுவதில் தோல்வி: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" -msgstr "" +msgstr "விண்ணப்பத்தில் கையெழுத்திடுவதில் தோல்வி" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" -msgstr "" +msgstr "VM இலிருந்து சேவையக ஐடியை உருவாக்குதல்: {சேவையக ஐடியை உருவாக்குங்கள்}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" -msgstr "" +msgstr "'{Apkfilename}' -> '{sigdir}' க்கான கையொப்பங்களைப் பெற்றது" #: ../fdroidserver/update.py #, python-brace-format msgid "File disappeared while processing it: {path}" -msgstr "" +msgstr "அதை செயலாக்கும்போது கோப்பு மறைந்தது: {path}" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py #: ../fdroidserver/update.py msgid "Finished" -msgstr "" +msgstr "முடிந்தது" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" +msgstr "பிளாட்ட்ரிடில் பிளாட் ட்ரிட்டில் பெல்லாங்: புலம்" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" -msgstr "" +msgstr "தடைசெய்யப்பட்ட உஉகுமொ குறிச்சொற்கள்" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." -msgstr "" +msgstr "ஊனமுற்ற பயன்பாடுகளை கட்டாயப்படுத்துகிறது, மேலும் ச்கேன் சிக்கல்களைப் பொருட்படுத்தாமல். சோதனை பயன்முறையில் மட்டுமே அனுமதிக்கப்படுகிறது." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" -msgstr "" +msgstr "{0} நொடி காலக்கெடுவுக்குப் பிறகு கட்டமைப்பை கட்டாயப்படுத்துதல்!" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." -msgstr "" +msgstr "ஊனமுற்ற பயன்பாடுகள் மற்றும் கட்டமைப்புகளை ச்கேன் செய்யுங்கள்." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" -msgstr "" +msgstr "பயன்பாட்டிற்கான மேனிலை தரவு இல்லாமல் \"{path}\" கிராஃபிக் கிடைத்தது \"{name}\"!" #: ../fdroidserver/update.py #, python-brace-format msgid "Found bad funding file \"{path}\" for \"{name}\":" -msgstr "" +msgstr "\"{name}\" க்கு \"{path}\" மோசமான பொருள் கோப்பு கிடைத்தது:" #: ../fdroidserver/common.py msgid "Found invalid appids in arguments" -msgstr "" +msgstr "வாதங்களில் தவறான பயன்பாடுகளைக் கண்டறிந்தது" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" -msgstr "" +msgstr "சில பயன்பாடுகளுக்கான தவறான பதிப்புக் குறியீடுகளைக் கண்டறிந்தது" #: ../fdroidserver/common.py #, python-brace-format msgid "Found multiple JAR Signature Block Files in {path}" -msgstr "" +msgstr "{path} இல் பல குடுவை கையொப்பம் தொகுதி கோப்புகள் கிடைத்தன" #: ../fdroidserver/common.py msgid "Found multiple Signer Certificates!" -msgstr "" +msgstr "பல கையொப்ப சான்றிதழ்கள் கிடைத்தன!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" -msgstr "" +msgstr "{Appid க்கு க்கான பல மேனிலை தரவு கோப்புகள் கிடைத்தன" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." -msgstr "" +msgstr "களஞ்சியத்திற்கான பல கையொப்பமிடும் சான்றிதழ்கள் கண்டறியப்பட்டன." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." -msgstr "" +msgstr "களஞ்சியத்திற்கான கையொப்பமிடும் சான்றிதழ்கள் எதுவும் கிடைக்கவில்லை." #: ../fdroidserver/lint.py #, python-format msgid "Found non-file at %s" -msgstr "" +msgstr "%s இல் கோப்பு அல்லாதது" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" -msgstr "" +msgstr "{Url} இல் {apkfilename} காணப்பட்டது" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" -msgstr "" +msgstr "{கோப்பு பெயர்} இல் {count} சிக்கல்கள் காணப்பட்டன" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" -msgstr "" +msgstr "{கோப்பு பெயர்} இல் {count} எச்சரிக்கைகள் கிடைத்தன" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" -msgstr "" +msgstr "{Appid க்கு க்காக உருவாக்கப்பட்ட எலும்புக்கூடு மேனிலை தரவு" #: ../fdroidserver/common.py #, python-format msgid "Git checkout of '%s' failed" -msgstr "" +msgstr "'%s' இன் அறிவிலி புதுப்பிப்பு தோல்வியடைந்தது" #: ../fdroidserver/common.py msgid "Git clean failed" -msgstr "" +msgstr "அறிவிலி தூய்மையான தோல்வியுற்றது" #: ../fdroidserver/common.py msgid "Git fetch failed" -msgstr "" +msgstr "Git fetch தோல்வியுற்றது" #: ../fdroidserver/common.py msgid "Git prune failed" -msgstr "" +msgstr "அறிவிலி ப்ரூன் தோல்வியடைந்தது" #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" -msgstr "" +msgstr "அறிவிலி ரிமோட் செட்-எட் தோல்வியடைந்தது: \"%s\"" #: ../fdroidserver/common.py msgid "Git reset failed" -msgstr "" +msgstr "அறிவிலி மீட்டமைப்பு தோல்வியடைந்தது" #: ../fdroidserver/common.py msgid "Git submodule deinit failed" -msgstr "" +msgstr "Git சப்மோடூல் டீனிட் தோல்வியடைந்தது" #: ../fdroidserver/common.py msgid "Git submodule sync failed" -msgstr "" +msgstr "Git சப்மோடூல் ஒத்திசைவு தோல்வியடைந்தது" #: ../fdroidserver/common.py msgid "Git submodule update failed" -msgstr "" +msgstr "Git சப்மோடூல் புதுப்பிப்பு தோல்வியடைந்தது" #: ../fdroidserver/common.py msgid "HTTPS must be used with Subversion URLs!" -msgstr "" +msgstr "HTTP கள் சப்வர்சன் முகவரி களுடன் பயன்படுத்தப்பட வேண்டும்!" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "" +msgstr "ஒரு அறிவிலி கண்ணாடி பெரியதாகிவிட்டால், காப்பகத்தை நீக்க அனுமதிக்கவும்" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "" +msgstr "இந்த பதிவேற்றம் தோல்வியுற்றால், {url பெறுநர் க்கு கைமுறையாக பதிவேற்ற முயற்சிக்கவும்" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "" +msgstr "'{Field}' இல் '{Metapath}' மெட்டாடேட்டாவில் புறக்கணிக்கப்படுவதால் அது நீக்கப்பட்டது." #: ../fdroidserver/update.py #, python-format msgid "Ignoring FUNDING.yml entry longer than 2048: %s" -msgstr "" +msgstr "நிதியுதவியை புறக்கணித்தல். 2048 ஐ விட நீண்ட காலமாக நுழைவு: %s" #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "" +msgstr "வெளிப்படையான மோசமான உறுப்பை புறக்கணித்தல்: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " -msgstr "" +msgstr "மேனிலை தரவு இல்லாமல் தொகுப்பைப் புறக்கணித்தல்: " #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" -msgstr "" +msgstr "{Apkfilename க்கு க்கான பழைய கேச் தரவைப் புறக்கணித்தல்" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" -msgstr "" +msgstr "MD5 போன்ற ஊனமுற்ற வழிமுறைகளுடன் கையொப்பமிடப்பட்ட APK கள் சேர்க்கவும்" #: ../fdroidserver/mirror.py msgid "Include the PGP signature .asc files in the mirror" -msgstr "" +msgstr "கண்ணாடியில் பிசிபி கையொப்பம் .ஆச்க் கோப்புகளைச் சேர்க்கவும்" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" -msgstr "" +msgstr "கண்ணாடியில் உருவாக்க பதிவுகளைச் சேர்க்கவும்" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" -msgstr "" +msgstr "கண்ணாடியில் மூல டார்பால்சைச் சேர்க்கவும்" #: ../fdroidserver/metadata.py #, python-format msgid "Including metadata from %s@%s" -msgstr "" +msgstr "%s@ %s இலிருந்து மேனிலை தரவு உட்பட" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" -msgstr "" +msgstr "{பாதை இருந்து இலிருந்து மேனிலை தரவு உட்பட" #: ../fdroidserver/common.py msgid "Initialising submodules" -msgstr "" +msgstr "துணைமோடல்களைத் தொடங்குதல்" #: ../fdroidserver/install.py msgid "Install all signed applications available" -msgstr "" +msgstr "கிடைக்கக்கூடிய அனைத்து கையொப்பமிடப்பட்ட பயன்பாடுகளையும் நிறுவவும்" #: ../fdroidserver/__main__.py msgid "Install built packages on devices" -msgstr "" +msgstr "சாதனங்களில் கட்டப்பட்ட தொகுப்புகளை நிறுவவும்" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." -msgstr "" +msgstr "%s நிறுவுதல் ..." #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." -msgstr "" +msgstr "{Dev} இல் '{apkfilename}' ஐ நிறுவுதல் ..." #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" -msgstr "" +msgstr "ரெப்போ HTTP சேவையகத்துடன் தொடர்பு கொள்ளுங்கள்" #: ../fdroidserver/update.py msgid "Invalid APK" -msgstr "" +msgstr "தவறான APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "" +msgstr "தவறான AutoupDateMode: {பயன்முறை}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "" +msgstr "தவறான புதுப்பிப்பு சோதனை: {பயன்முறை}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid VercodeOperation: {field}" -msgstr "" +msgstr "தவறான VERCODEOPERATION: {field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" -msgstr "" +msgstr "தவறான VERCODEOPERATION: {INVALID_OPS}" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" -msgstr "" +msgstr "தவறான பயன்பாட்டு ஐடி {appid}" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" -msgstr "" +msgstr "தவறான பூலியன் '%s'" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" -msgstr "" +msgstr "தவறான புல்லட் பட்டியல்" #: ../fdroidserver/common.py #, python-format msgid "Invalid name for published file: %s" -msgstr "" +msgstr "வெளியிடப்பட்ட கோப்பிற்கான தவறான பெயர்: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid ndk: entry in build: \"{ndk}\"" -msgstr "" +msgstr "தவறான NDK: கட்டமைப்பில் நுழைவு: \"{ndk}\"" #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " -msgstr "" +msgstr "Https அல்லாதவர்களுக்கு தவறான திருப்பி விடுங்கள்: {முன்} -> {பிறகு} " #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid scrlib metadata: '{file}' does not exist" -msgstr "" +msgstr "தவறான ச்க்ர்லிப் மெட்டாடேட்டா: '{file}' இல்லை" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: could not parse '{file}'" -msgstr "" +msgstr "தவறான SRCLIB மெட்டாடேட்டா: '{file}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "" +msgstr "தவறான SRCLIB மெட்டாடேட்டா: அறியப்படாத விசை '{key}' இல் '{file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature failed to verify: {path}" -msgstr "" +msgstr "சார் கையொப்பம் சரிபார்க்கத் தவறிவிட்டது: {path}" #: ../fdroidserver/common.py #, python-brace-format msgid "JAR signature verified: {path}" -msgstr "" +msgstr "சார் கையொப்பம் சரிபார்க்கப்பட்டது: {path}" #: ../fdroidserver/scanner.py msgid "Java JAR file" -msgstr "" +msgstr "சாவா குடுவை கோப்பு" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "" +msgstr "சாவா சே.டி.கே கண்டுபிடிக்கப்படவில்லை! நிலையான இடத்தில் நிறுவவும் அல்லது சாவா_பாத்களை அமைக்கவும்!" #: ../fdroidserver/scanner.py msgid "Java compiled class" -msgstr "" +msgstr "சாவா தொகுக்கப்பட்ட வகுப்பு" #: ../fdroidserver/signindex.py msgid "Java jarsigner not found! Install in standard location or set java_paths!" -msgstr "" +msgstr "சாவா சார்சிக்னர் கண்டுபிடிக்கப்படவில்லை! நிலையான இடத்தில் நிறுவவும் அல்லது சாவா_பாத்களை அமைக்கவும்!" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" -msgstr "" +msgstr "உஉகுமொ SRC பண்புகளில் சாவாச்கிரிப்ட்" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "" +msgstr "தோல்வியுற்ற கட்டமைப்பை வைத்திருத்தல் \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" -msgstr "" +msgstr "விசையை கையொப்பமிடுவதற்கான கீச்டோர்:\t" #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "" +msgstr "அறியப்பட்ட பிழைத்திருத்த விசை Lentappasigningkeys இல் பயன்படுத்தப்படுகிறது: " #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "" +msgstr "கடைசியாக பயன்படுத்தப்பட்ட கமிட் '{கமிட்}' ஒரு குறிச்சொல்லாகத் தெரிகிறது, ஆனால் புதுப்பிப்பு தொழில்நுட்பம் '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" -msgstr "" +msgstr "லிபராபே நன்கொடை முறைகள் லைபர்பே: புலம்" #: ../fdroidserver/rewritemeta.py msgid "List files that would be reformatted (dry run)" -msgstr "" +msgstr "மறுவடிவமைக்கப்படும் கோப்புகளை பட்டியலிடுங்கள் (உலர் ரன்)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" -msgstr "" +msgstr "F-droid.org முகவரி இல் சேர்க்கப்பட்டுள்ளது" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" -msgstr "" +msgstr "விதிவிலக்குகளில் கட்டமைப்பை நிறுத்துங்கள்" #: ../fdroidserver/index.py msgid "Malformed repository mirrors." -msgstr "" +msgstr "தவறாக களஞ்சிய கண்ணாடிகள்." #: ../fdroidserver/deploy.py msgid "Malformed serverwebroot line:" -msgstr "" +msgstr "தவறாக சேவையகமானது:" #: ../fdroidserver/scanner.py #, python-format msgid "Max recursion depth in ZIP file reached: %s" -msgstr "" +msgstr "சிப் கோப்பில் அதிகபட்ச மறுசீரமைப்பு ஆழம் எட்டப்பட்டது: %s" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." -msgstr "" +msgstr "முழு ரெப்போ மற்றும் காப்பகத்தை பிரதிபலிக்கவும், அனைத்து கோப்பு வகைகளிலும்." #: ../fdroidserver/gpgsign.py msgid "Missing output directory" -msgstr "" +msgstr "வெளியீட்டு அடைவு இல்லை" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" +msgstr "நற்பொருத்தம் எதிர்ப்பு அறிவிப்புகளை உள்ளூர்மயமாக்கப்பட்ட கோப்புகளுக்கு நகர்த்துவது:" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" +msgstr "Config.yml இல் \"REPO_PUBKEY\" அல்லது \"கீச்டோர்பாச்\" எதுவும் அமைக்கப்படவில்லை" #: ../fdroidserver/verify.py #, python-format msgid "No APK for package: %s" -msgstr "" +msgstr "தொகுப்புக்கு APK இல்லை: %s" #: ../fdroidserver/common.py msgid "No Android SDK found!" -msgstr "" +msgstr "ஆண்ட்ராய்டு SDK எதுவும் கிடைக்கவில்லை!" #: ../fdroidserver/install.py msgid "No attached devices found" -msgstr "" +msgstr "இணைக்கப்பட்ட சாதனங்கள் எதுவும் கிடைக்கவில்லை" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." -msgstr "" +msgstr "`ADB Install` க்காக எந்த சாதனங்களும் கிடைக்கவில்லை! ஒன்றை செருகவும்." #: ../fdroidserver/index.py msgid "No fingerprint in URL." -msgstr "" +msgstr "முகவரி இல் கைரேகை இல்லை." #: ../fdroidserver/common.py msgid "No git submodules available" -msgstr "" +msgstr "அறிவிலி சப்மோடூல்கள் எதுவும் கிடைக்கவில்லை" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" -msgstr "" +msgstr "கிரேடில் திட்டத்தைக் காண முடியவில்லை. -சப்பரைக் குறிப்பிடவா?" #: ../fdroidserver/import_subcommand.py msgid "No information found." -msgstr "" +msgstr "எந்த தகவலும் கிடைக்கவில்லை." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" -msgstr "" +msgstr "பொருந்தக்கூடிய குறிச்சொற்கள் எதுவும் கிடைக்கவில்லை" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "" +msgstr "இயல்புநிலை (3) ஐப் பயன்படுத்தி குறைந்தபட்ச SDK பதிப்பு {0 at இல் காணப்படவில்லை." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" -msgstr "" +msgstr "பயன்பாடு இலவச மென்பொருள் என்பதை குறிப்பிட தேவையில்லை" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" -msgstr "" +msgstr "பயன்பாடு ஆண்ட்ராய்டு க்கானது என்பதை குறிப்பிட தேவையில்லை" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" -msgstr "" +msgstr "விருப்பத்தேர்வு தொகுப்பு இல்லை! இவற்றில் குறைந்தபட்சம் ஒன்றை அமைக்க உங்கள் config.yml ஐத் திருத்தவும்:" #: ../fdroidserver/common.py msgid "No packages specified" -msgstr "" +msgstr "தொகுப்புகள் எதுவும் குறிப்பிடப்படவில்லை" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" -msgstr "" +msgstr "%s க்கு கையொப்பமிடப்பட்ட APK கிடைக்கவில்லை" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" -msgstr "" +msgstr "கையொப்பமிடப்பட்ட வெளியீட்டு அடைவு இல்லை - எதுவும் செய்ய எதுவும் இல்லை" #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" -msgstr "" +msgstr "{path} இல் கையொப்பமிடும் சான்றிதழ்கள் இல்லை}" #: ../fdroidserver/common.py #, python-format msgid "No such package: %s" -msgstr "" +msgstr "அத்தகைய தொகுப்பு இல்லை: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" -msgstr "" +msgstr "பயன்பாட்டிற்கு அத்தகைய பதிப்பு குறியீடு {பதிப்பு குறியீடு {appid}" #: ../fdroidserver/checkupdates.py msgid "No tags found" -msgstr "" +msgstr "குறிச்சொற்கள் எதுவும் கிடைக்கவில்லை" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" -msgstr "" +msgstr "கையொப்பமிடாத அடைவு இல்லை - எதுவும் செய்ய முடியாது" #: ../fdroidserver/__main__.py msgid "No version information could be found." -msgstr "" +msgstr "பதிப்பு தகவல்களைக் காண முடியவில்லை." #: ../fdroidserver/common.py msgid "Not a valid size definition: \"{}\"" -msgstr "" +msgstr "சரியான அளவு வரையறை அல்ல: \"{}\"" #: ../fdroidserver/signindex.py msgid "Nothing to do" -msgstr "" +msgstr "செய்ய எதுவும் இல்லை" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." -msgstr "" +msgstr "{Appid க்கு க்கு எதுவும் செய்ய முடியாது." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" -msgstr "" +msgstr "இப்போது இவற்றை config.yml இல் அமைக்கவும்:" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" -msgstr "" +msgstr "OBB கோப்பில் எந்த APK ஐ விட புதிய பதிப்பு குறியீடு ({முழு எண்) உள்ளது:" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" -msgstr "" +msgstr "OBB கோப்பு பெயர் \"முதன்மையான\" உடன் தொடங்க வேண்டும். அல்லது \"இணைப்பு.\":" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" -msgstr "" +msgstr "OBB இன் பேக்கசெனேம் ஆதரிக்கப்பட்ட APK உடன் பொருந்தவில்லை:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" +msgstr "இணைப்பில்லாத இயந்திரம், அறிவிலி மிரர் தலைமுறையை `fdroid வரிசைப்படுத்தல்` வரை தவிர்க்கவும்" #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." -msgstr "" +msgstr "'Github_releases' கட்டமைப்பு உருப்படிகளில் ஒன்று 'பேக்கசெனேம்ச்' மதிப்பைக் காணவில்லை. ச்கிப்பிங் ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." -msgstr "" +msgstr "'Github_releases' கட்டமைப்பு உருப்படிகளில் ஒன்று 'ProjectURL' மதிப்பைக் காணவில்லை. ச்கிப்பிங் ..." #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." -msgstr "" +msgstr "'Github_releases' கட்டமைப்பு உருப்படிகளில் ஒன்று 'கிள்ளாக்கு' மதிப்பைக் காணவில்லை. ச்கிப்பிங் ..." #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" -msgstr "" +msgstr "கிராபிக்ச் மற்றும் காணப்படும் பி.என்.சி மற்றும் சே.பி.சி மட்டுமே ஆதரிக்கப்படுகின்றன: {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" -msgstr "" +msgstr "பிளே ச்டோருடன் மட்டுமே வேறுபாடுகளை அச்சிடுங்கள்" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" -msgstr "" +msgstr "தானியங்கு புதுப்பிப்புகளுடன் பயன்பாடுகளை மட்டுமே செயலாக்கவும்" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "" +msgstr "OpenCollective நன்கொடை முறைகள் OpenCollective: புலம்" #: /usr/lib/python3.11/optparse.py msgid "Options" @@ -1353,427 +1362,427 @@ msgstr "விருப்பங்கள்" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." -msgstr "" +msgstr "APK இன் பெயரிடப்பட்ட தாக்கல் சாதொபொகு அறிக்கை." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." -msgstr "" +msgstr "சாதொபொகு க்கு சாதொபொகு க்கு வெளியீடு." #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py #: ../fdroidserver/update.py msgid "Outputting JSON" -msgstr "" +msgstr "சாதொபொகு ஐ வெளியிடுகிறது" #: ../fdroidserver/import_subcommand.py msgid "Overall license of the project." -msgstr "" +msgstr "திட்டத்தின் ஒட்டுமொத்த உரிமம்." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "" +msgstr "மெட்டாடேட்டாவிலிருந்து {apkfilename in இல் வெற்று பதிப்பு பெயர்:{version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "Package \"{appid}\" already exists" -msgstr "" +msgstr "தொகுப்பு \"{appid}\" ஏற்கனவே உள்ளது" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" -msgstr "" +msgstr "'{path}' இல் மேனிஃபெச்டை பாகுபடுத்துதல்" #: ../fdroidserver/common.py msgid "Password required with username" -msgstr "" +msgstr "பயனர்பெயருடன் கடவுச்சொல் தேவை" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." -msgstr "" +msgstr "முதன்மையான ஆண்ட்ராய்டு திட்ட துணை அடைவுக்கான பாதை, வேரில் இல்லையென்றால்." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" -msgstr "" +msgstr "ஆண்ட்ராய்டு SDK க்கான பாதை (சில நேரங்களில் Android_home இல் அமைக்கப்படுகிறது)" #: ../fdroidserver/btlog.py msgid "Path to the git repo to use as the log" -msgstr "" +msgstr "பதிவாக பயன்படுத்த அறிவிலி ரெப்போவுக்கான பாதை" #: ../fdroidserver/init.py msgid "Path to the keystore for the repo signing key" -msgstr "" +msgstr "ரெப்போ கையொப்பமிடும் விசைக்கான கீச்டோருக்கு பாதை" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" -msgstr "" +msgstr "எளிதான நகல்/பேச்டுக்காக ரகசிய மாறியை முனையத்திற்கு அச்சிடுக" #: ../fdroidserver/install.py #, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "" +msgstr "உங்கள் இருப்பிடத்தின் அடிப்படையில் தனியுரிமை பயன்முறை இயக்கப்பட்டது ({கன்ட்ரி_கோட்})." #: ../fdroidserver/scanner.py #, python-format msgid "Problem with ZIP file: %s, error %s" -msgstr "" +msgstr "சிப் கோப்பில் சிக்கல்: %s, பிழை %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" -msgstr "" +msgstr "'{path}' இல் எக்ச்எம்எல் சிக்கல்" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" -msgstr "" +msgstr "தானாக புதுப்பிப்புகளை செயலாக்கவும்" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" -msgstr "" +msgstr "செயலாக்கம் {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" -msgstr "" +msgstr "செயலாக்கம் {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" -msgstr "" +msgstr "குறியீட்டு கோப்புகளுக்கு மனிதனால் படிக்கக்கூடிய XML/JSON ஐ உருவாக்குங்கள்" #: ../fdroidserver/import_subcommand.py msgid "Project URL to import from." -msgstr "" +msgstr "இறக்குமதி செய்ய திட்ட முகவரி." #: ../fdroidserver/lint.py msgid "Punctuation should be avoided" -msgstr "" +msgstr "நிறுத்தற்குறி தவிர்க்கப்பட வேண்டும்" #: ../fdroidserver/btlog.py msgid "Push the log to this git remote repository" -msgstr "" +msgstr "இந்த அறிவிலி ரிமோட் களஞ்சியத்திற்கு பதிவை அழுத்தவும்" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" -msgstr "" +msgstr "பைனரி வெளிப்படைத்தன்மை பதிவை {url பெறுநர் க்கு தள்ளுகிறது" #: ../fdroidserver/deploy.py msgid "Pushing to remote server failed!" -msgstr "" +msgstr "தொலை சேவையகத்திற்கு தள்ளுவது தோல்வியடைந்தது!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" -msgstr "" +msgstr "{Url க்கு க்கு தள்ளுதல்" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" -msgstr "" +msgstr "விரைவாக ஒரு புதிய களஞ்சியத்தைத் தொடங்கவும்" #: ../fdroidserver/__main__.py msgid "Read all the metadata files and exit" -msgstr "" +msgstr "அனைத்து மேனிலை தரவு கோப்புகளையும் படித்து வெளியேறவும்" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" -msgstr "" +msgstr "'{Config_file}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" -msgstr "" +msgstr "பேக்கசெனேம்/பதிப்பு குறியீடு/பதிப்பு பெயர் தோல்வியுற்றது, APK தவறானது: '{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" -msgstr "" +msgstr "பேக்கசெனேம்/பதிப்பு குறியீடு/பதிப்பு பெயர் தோல்வியுற்றது, APK தவறானது: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" -msgstr "" +msgstr "தற்காலிக சேமிப்பிலிருந்து {apkfilename} படித்தல்" #: ../fdroidserver/build.py msgid "Refresh and cache scanner rules and signatures from the network" -msgstr "" +msgstr "நெட்வொர்க்கிலிருந்து ச்கேனர் விதிகள் மற்றும் கையொப்பங்களை புதுப்பித்து கேச்" #: ../fdroidserver/common.py msgid "Removing specified files" -msgstr "" +msgstr "குறிப்பிட்ட கோப்புகளை நீக்குதல்" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "{path} \"ஐ நீக்குதல்" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" -msgstr "" +msgstr "தொகுப்புடன் பொருந்தாத APK கோப்புகளை மறுபெயரிடுங்கள். NAME_123.APK" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" +msgstr "Git-svn களஞ்சியங்களில் மட்டுமே ரெபோட்ரங்க் புதுப்பிப்பு முறை அர்த்தமுள்ளதாக இருக்கும்" #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" +msgstr "தற்போதுள்ள ஒன்று சரியாகத் தோன்றினாலும், ஒரு புதிய உருவாக்க சேவையகத்தை மீட்டமைத்து உருவாக்கவும்." #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" -msgstr "" +msgstr "வழங்கப்பட்ட பிழைத்திருத்தத்துடன் {apkfilename இருந்து ராசினாமா" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" -msgstr "" +msgstr "அதிகபட்ச படப்புள்ளி அளவைத் தாண்டி அனைத்து ஐகான்களையும் மறுஅளவிடுங்கள்" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" -msgstr "" +msgstr "எச்சரிக்கைகள் மற்றும் பிழைகளுக்கு வெளியீட்டை கட்டுப்படுத்துங்கள்" #: ../fdroidserver/net.py #, python-format msgid "Retrying failed download: %s" -msgstr "" +msgstr "திரும்பப்பெறுவது தோல்வியுற்ற பதிவிறக்க: %s" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" -msgstr "" +msgstr "அனைத்து மேனிலை தரவு கோப்புகளையும் மீண்டும் எழுதவும்" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" -msgstr "" +msgstr "'{Appid}' ஐ மீண்டும் எழுதுதல்" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" -msgstr "" +msgstr "மாற்றப்படாத மாற்றங்களைக் கொண்ட அறிவிலி ரெப்போவில் இயக்கவும்" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" -msgstr "" +msgstr "-Debug.apk ஐக் கண்டுபிடிக்க {cibase below க்கு மேல் இயக்கவும். மற்றும் Repo_basedir {repo_basedir} ஐத் தவிர்க்கவும்" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" -msgstr "" +msgstr "வடிவமைப்பை சரிசெய்ய மீண்டும் எழுதுங்கள்" #: ../fdroidserver/deploy.py msgid "Running first pass with MD5 checking disabled" -msgstr "" +msgstr "MD5 உடன் முதல் மொழி இயக்குகிறது" #: ../fdroidserver/mirror.py #, python-brace-format msgid "Running wget in {path}" -msgstr "" +msgstr "{path} இல் wget ஐ இயக்குகிறது" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "" +msgstr "{Url of இன் SHA-256 நுழைவு பொருந்தவில்லை!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "" +msgstr "அறியப்படாத இலவச வகுப்புகளுக்கு இதன் விளைவாக வரும் APK (களை) ச்கேன் செய்யுங்கள்." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" -msgstr "" +msgstr "ஒரு தொகுப்பின் மூலக் குறியீட்டை ச்கேன் செய்யுங்கள்" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {apk}" -msgstr "" +msgstr "ச்கேனர் {apk} இல் {count} சிக்கல்கள் காணப்பட்டது" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:" -msgstr "" +msgstr "ச்கேனர் {count} சிக்கல்கள் {appid}:" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Scanner found {count} problems in {appid}:{versionCode}:" -msgstr "" +msgstr "ச்கேனர் {count} சிக்கல்கள் {appid}: {versionCode}:" #: ../fdroidserver/build.py msgid "Scanner found {} problem" msgid_plural "Scanner found {} problems" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "ச்கேனர் கண்டறிந்தது {} சிக்கல்" +msgstr[1] "ச்கேனர் கண்டறிந்தது {} சிக்கல்கள்" #: ../fdroidserver/scanner.py msgid "Scanning APK for extra signing blocks." -msgstr "" +msgstr "கூடுதல் கையொப்பமிடும் தொகுதிகளுக்கு APK ஐ ச்கேன் செய்கிறது." #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." -msgstr "" +msgstr "அறியப்படாத இல்லாத வகுப்புகளுக்கு டெக்ச்டம்புடன் APK ஐ ச்கேன் செய்கிறது." #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "" +msgstr "NDK {வெளியீடு} ({பதிப்பு}) மேலே அமைக்கவும்" #: ../fdroidserver/common.py msgid "Set clock to that time using:" -msgstr "" +msgstr "அந்த நேரத்தில் கடிகாரத்தை அமைக்கவும்:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "" +msgstr "பழையவை காப்பகப்படுத்தப்படுவதற்கு முன்பு ரெப்போவில் அதிகபட்ச வெளியீடுகளை அமைக்கவும்" #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" -msgstr "" +msgstr "திறந்த கோப்பு வரம்பை {முழு எண்} என அமைக்கவும்" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" -msgstr "" +msgstr "ஒரு இரவு உருவாக்க ரெப்போவுக்கு ஒரு பயன்பாட்டு உருவாக்கத்தை அமைக்கவும்" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " -msgstr "" +msgstr "திறந்த கோப்பு வரம்பை அமைப்பது தோல்வியடைந்தது: " #: ../fdroidserver/build.py #, python-brace-format msgid "Setting {0} sec timeout for this build" -msgstr "" +msgstr "இந்த கட்டமைப்பிற்கான {0} நொடி நேரத்தை அமைத்தல்" #: ../fdroidserver/__main__.py msgid "Sign and place packages in the repo" -msgstr "" +msgstr "ரெப்போவில் கையொப்பமிட்டு தொகுப்புகளை வைக்கவும்" #: ../fdroidserver/__main__.py msgid "Sign indexes created using update --nosign" -msgstr "" +msgstr "புதுப்பிப்பு --nosign ஐப் பயன்படுத்தி உருவாக்கப்பட்ட குறியீடுகள்" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" -msgstr "" +msgstr "பைனரிகள் மற்றும் பிற சிக்கல்களுக்கான மூலக் குறியீட்டை ச்கேன் செய்வதைத் தவிர்க்கவும்" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" -msgstr "" +msgstr "தவறான கையொப்பத்துடன் '{apkfilename}' ஐத் தவிர்ப்பது!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" +msgstr "ரெப்போ மிகப் பெரியதாக இருப்பதால் அறிவிலிஆய்வு பக்கங்களைத் தவிர்ப்பது (>%. 2fgb)!" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" -msgstr "" +msgstr "{Appid க்கு க்கான குறியீட்டு தலைமுறையைத் தவிர்க்கிறது" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" -msgstr "" +msgstr "தவறான கையொப்பத்துடன் {apkfilename ஐத் தவிர்ப்பது!" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" -msgstr "" +msgstr "{Appid}: முடக்கப்பட்டது" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" -msgstr "" +msgstr "ரெப்போவை ஒத்திசைக்க உள்ளக கோப்புறையைக் குறிப்பிடவும்" #: ../fdroidserver/deploy.py msgid "Specify an identity file to provide to SSH for rsyncing" -msgstr "" +msgstr "RSyncing க்கு பாஓடு க்கு வழங்க அடையாளக் கோப்பைக் குறிப்பிடவும்" #: ../fdroidserver/nightly.py msgid "Specify which debug keystore file to use." -msgstr "" +msgstr "எந்த பிழைத்திருத்த கீச்டோர் கோப்பைப் பயன்படுத்த வேண்டும் என்பதைக் குறிப்பிடவும்." #: ../fdroidserver/common.py msgid "Spew out even more information than normal" -msgstr "" +msgstr "இயல்பை விட அதிகமான தகவல்களைத் தூண்டவும்" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" -msgstr "" +msgstr "{Apkfilename இருந்து இலிருந்து மர்ம கையொப்பத்தை அகற்றுதல்" #: ../fdroidserver/lint.py #, python-format msgid "Summary '%s' is just the app's name" -msgstr "" +msgstr "சுருக்கம் '%s' என்பது பயன்பாட்டின் பெயர்" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" -msgstr "" +msgstr "நீளத்தின் சுருக்கம் {நீளம்} {limit} எழுத்து வரம்புக்கு மேல் உள்ளது" #: ../fdroidserver/common.py #, python-brace-format msgid "System clock is older than date in {path}!" -msgstr "" +msgstr "கணினி கடிகாரம் {path} இல் தேதியை விட பழையது!" #: ../fdroidserver/checkupdates.py msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "" +msgstr "குறிச்சொற்கள் புதுப்பிப்பு பயன்முறை தற்போது git, Hg, BZR மற்றும் GIT-SVN களஞ்சியங்களுக்கு மட்டுமே வேலை செய்கிறது" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" +msgstr "குறிச்சொற்கள் git-svn இல் பயன்படுத்தப்படும் புதுப்பிப்பு பயன்முறை, ஆனால் ரெப்போ குறிச்சொற்களுடன் அமைக்கப்படவில்லை" #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." -msgstr "" +msgstr "சோதனை பயன்முறை - வெளியீடு ஏற்கனவே இருந்தாலும், வெளியீட்டை மட்டும் வைக்கவும், எப்போதும் உருவாக்குங்கள்." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "The OBB version code must come after \"{name}.\":" -msgstr "" +msgstr "OBB பதிப்பு குறியீடு \"{name}\" க்குப் பிறகு வர வேண்டும்.::::" #: ../fdroidserver/btlog.py msgid "The base URL for the repo to log (default: https://f-droid.org)" -msgstr "" +msgstr "ரெப்போவுக்கான அடிப்படை முகவரி (இயல்புநிலை: https://f-droid.org)" #: ../fdroidserver/mirror.py msgid "The directory to write the mirror to" -msgstr "" +msgstr "கண்ணாடியை எழுதும் அடைவு" #: ../fdroidserver/nightly.py msgid "The file to be included in the repo (path or glob)" -msgstr "" +msgstr "ரெப்போவில் சேர்க்கப்பட வேண்டிய கோப்பு (பாதை அல்லது குளோப்)" #: ../fdroidserver/index.py msgid "The repository's fingerprint does not match." -msgstr "" +msgstr "களஞ்சியத்தின் கைரேகை பொருந்தவில்லை." #: ../fdroidserver/deploy.py #, python-brace-format msgid "The root dir for local_copy_dir \"{path}\" does not exist!" -msgstr "" +msgstr "லோக்கல்_கோபி_டிர் \"{path}\" க்கான ரூட் டிர் இல்லை!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" -msgstr "" +msgstr "ஒரு கீயாலியாச் மோதல் உள்ளது - வெளியீடு நிறுத்தப்பட்டது" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." -msgstr "" +msgstr "முதன்மையான ரெப்போவிலிருந்து காப்பகப்படுத்தப்பட்ட பயன்பாடுகள் இவை." #: ../fdroidserver/mirror.py msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "" +msgstr "F-droid.org ஐ பிரதிபலிக்க இந்த கட்டளை ஒருபோதும் பயன்படுத்தப்படக்கூடாது! ஒரு முழு நகலுக்கு 600 சிபிக்கு மேல் தேவைப்படுகிறது." #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "" +msgstr "இது எஃப்-டிராய்டுடன் பயன்படுத்தப்பட வேண்டிய பயன்பாடுகளின் களஞ்சியமாகும். இந்த களஞ்சியத்தில் உள்ள பயன்பாடுகள் அசல் பயன்பாட்டு உருவாக்குநர்களால் கட்டப்பட்ட உத்தியோகபூர்வ பைனரிகள், அல்லது https://gitlab.com/fdroid இல் உள்ள கருவிகளைப் பயன்படுத்தி f-droid.org இன் நிர்வாகியால் மூலத்திலிருந்து கட்டப்பட்ட பைனரிகள்." #: ../fdroidserver/import_subcommand.py #, python-format msgid "This repo already has local metadata: %s" -msgstr "" +msgstr "இந்த ரெப்போவில் ஏற்கனவே உள்ளக மேனிலை தரவு உள்ளது: %s" #: ../fdroidserver/init.py #, python-format @@ -1786,45 +1795,52 @@ msgid "" "For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" "and https://f-droid.org/docs/Signing_Process" msgstr "" +"அமைப்பை முடிக்க, உங்கள் APKS ஐ \"%s\" இல் சேர்க்கவும்\n" +" பின்னர் \"fdroid புதுப்பிப்பு -c; fdroid Update\" ஐ இயக்கவும். நீங்கள் திருத்தவும் விரும்பலாம்\n" +" முகவரி, களஞ்சி பெயர் மற்றும் பலவற்றை அமைக்க \"config.yml\". நீங்கள் அமைக்க வேண்டும்\n" +" கையொப்பமிடும் விசை (தற்காலிகமானது தானாகவே உருவாக்கப்பட்டிருக்கலாம்).\n" +"\n" +" மேலும் தகவலுக்கு: https://f-droid.org/docs/setup_an_f-droid_app_repo\n" +" மற்றும் https://f-droid.org/docs/signing_process" #: ../fdroidserver/deploy.py msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "" +msgstr "AWSBUCKET, AWSSECRETKEY மற்றும் AWSACCESSKEYID ஐப் பயன்படுத்தவும் config.yml இல் அமைக்கப்பட வேண்டும்!" #: ../fdroidserver/deploy.py msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" -msgstr "" +msgstr "RCLONE ஐப் பயன்படுத்த, RCLONE_CONFIG மற்றும் AWSBUCKET ஆகியவை config.yml இல் அமைக்கப்பட வேண்டும்!" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" -msgstr "" +msgstr "முகவரி https: // அல்லது http: // உடன் தொடங்க வேண்டும்" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" -msgstr "" +msgstr "முகவரி சுருக்கங்கள் பயன்படுத்தப்படக்கூடாது" #: ../fdroidserver/lint.py #, python-brace-format msgid "URL {url} in Description: {error}" -msgstr "" +msgstr "விளக்கத்தில் முகவரி {url}: {error}" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "" +msgstr "எதிர்பாராத உரிமக் குறிச்சொல் \"{}\"! Https://spdx.org/license-list இலிருந்து FSF அல்லது OSI அங்கீகரிக்கப்பட்ட குறிச்சொற்களை மட்டுமே பயன்படுத்தவும்" #: ../fdroidserver/lint.py msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "" +msgstr "எதிர்பாராத உரிமக் குறிச்சொல் \"{}\"! உங்கள் கட்டமைப்பு கோப்பில் கட்டமைக்கப்பட்ட உரிமக் குறிச்சொற்களை மட்டுமே பயன்படுத்தவும்" #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" +msgstr "எதிர்பாராத சிம்லிங்க் இலக்கு: {இணைப்பு} -> {இலக்கு}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "" +msgstr "{Configname} இல் அறியப்படாத நுழைவு {key}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" @@ -1834,125 +1850,125 @@ msgstr "அறியப்படாத விதிவிலக்கு கண #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" -msgstr "" +msgstr "அறியப்படாத கோப்பு '{கோப்பு பெயர்}'" #: ../fdroidserver/metadata.py #, python-format msgid "Unknown metadata format: %s" -msgstr "" +msgstr "அறியப்படாத மேனிலை தரவு வடிவம்: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unknown metadata format: {path} (use: *.yml)" -msgstr "" +msgstr "அறியப்படாத மேனிலை தரவு வடிவம்: {path} (பயன்பாடு: *.yml)" #: ../fdroidserver/common.py msgid "Unknown version of aapt, might cause problems: " -msgstr "" +msgstr "AAPT இன் அறியப்படாத பதிப்பு, சிக்கல்களை ஏற்படுத்தக்கூடும்: " #: ../fdroidserver/lint.py msgid "Unnecessary leading space" -msgstr "" +msgstr "தேவையற்ற முன்னணி இடம்" #: ../fdroidserver/lint.py msgid "Unnecessary trailing space" -msgstr "" +msgstr "தேவையற்ற பின்தங்கிய இடம்" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" -msgstr "" +msgstr "அங்கீகரிக்கப்படாத பயன்பாட்டு புலம் '{fieldName}' '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised build flag '{build_flag}' in '{path}'" -msgstr "" +msgstr "அங்கீகரிக்கப்படாத கட்டமைப்புக் கொடி '{build_flag}' '{path}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" -msgstr "" +msgstr "ரெப்போ கிராஃபிக் நிறுவனத்திற்கு ஆதரிக்கப்படாத கோப்பு வகை \"{நீட்டிப்பு}\"" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported graphics file found: {path}" -msgstr "" +msgstr "ஆதரிக்கப்படாத கிராபிக்ச் கோப்பு காணப்படுகிறது: {path}" #: ../fdroidserver/lint.py #, python-format msgid "Unused extlib at %s" -msgstr "" +msgstr "பயன்படுத்தப்படாத எக்ச்ட்லிப் %s" #: ../fdroidserver/lint.py #, python-format msgid "Unused file at %s" -msgstr "" +msgstr "%s இல் பயன்படுத்தப்படாத கோப்பு" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scandelete path: %s" -msgstr "" +msgstr "பயன்படுத்தப்படாத ச்கேண்டிலெட் பாதை: %s" #: ../fdroidserver/scanner.py #, python-format msgid "Unused scanignore path: %s" -msgstr "" +msgstr "பயன்படுத்தப்படாத ச்கேனிக்னர் பாதை: %s" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "%s க்கு அன்சிங்" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" -msgstr "" +msgstr "புதிய தொகுப்புகளுக்கான ரெப்போ தகவல்களைப் புதுப்பிக்கவும்" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" -msgstr "" +msgstr "முகவரி க்கான பைனரி வெளிப்படைத்தன்மை பதிவைப் புதுப்பிக்கவும்" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "UpdateCheckData has invalid URL: {url}" -msgstr "" +msgstr "UpdateCheckData இல் தவறான முகவரி உள்ளது: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" -msgstr "" +msgstr "UpdateCheckData பதிப்பு குறியீட்டை முழு எண் (\\ டி அல்லது [0-9]) உடன் பொருத்த வேண்டும்: {கோடெக்ச்}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must use HTTPS URL: {url}" -msgstr "" +msgstr "UpdateCheckData https முகவரி ஐப் பயன்படுத்த வேண்டும்: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData not a valid URL: {url}" -msgstr "" +msgstr "புதுப்பிப்பு தொழில்நுட்பம் செல்லுபடியாகும் முகவரி அல்ல: {url}" #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "" +msgstr "UpdateCheckMode அமைக்கப்பட்டுள்ளது, ஆனால் சரிபார்ப்புகள் இன்னும் இயக்கப்படவில்லை என்று தெரிகிறது." #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" +msgstr "UpdateCheckMode அமைக்கப்பட்டுள்ளது, ஆனால் இது சாத்தியம் இன்னும் இயக்கப்படவில்லை" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "" +msgstr "புதுப்பிப்பு சோதனை பெயர் அறியப்பட்ட பயன்பாட்டு ஐடிக்கு அமைக்கப்பட்டுள்ளது, அதை அகற்றலாம்" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" -msgstr "" +msgstr "Uploading {apkfilename} பெறுநர் androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" -msgstr "" +msgstr "Uploading {apkfilename} பெறுநர் virustotal" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -1969,74 +1985,74 @@ msgstr "பயன்பாடு: %s\n" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "" +msgstr "Use /HEAD instead of /master or /main பெறுநர் புள்ளியம் at a கோப்பு in the இயல்புநிலை branch" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" +msgstr "Use /HEAD instead of /master பெறுநர் புள்ளியம் at a கோப்பு in the இயல்புநிலை branch" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." -msgstr "" +msgstr "Use `fdroid புதுப்பிப்பு -c` பெறுநர் create it." #: ../fdroidserver/build.py msgid "Use build server" -msgstr "" +msgstr "Use உருவாக்கு சேவையகம்" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" +msgstr "Use திகதி இருந்து APK instead of மின்னோட்ட்ம், ஓட்டம் time க்கு newly added APKs" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for configuring s3cmd." -msgstr "" +msgstr "Using \"{path}\" க்கு configuring s3cmd." #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for syncing with remote storage." -msgstr "" +msgstr "Using \"{path}\" க்கு syncing with remote storage." #: ../fdroidserver/common.py msgid "Using APK Signature v2" -msgstr "" +msgstr "APK கையொப்பம் V2 ஐப் பயன்படுத்துதல்" #: ../fdroidserver/common.py msgid "Using APK Signature v3" -msgstr "" +msgstr "சாப்பிங் ஏபிசி கையொப்பம்" #: ../fdroidserver/common.py msgid "Using JAR Signature" -msgstr "" +msgstr "குடுவை கையொப்பத்தைப் பயன்படுத்துதல்" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" -msgstr "" +msgstr "Using Java's jarsigner, not recommended க்கு verifying APKs! Use apksigner" #: ../fdroidserver/common.py #, python-brace-format msgid "Using androguard from \"{path}\"" -msgstr "" +msgstr "Using androguard இருந்து \"{path}\"" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" -msgstr "" +msgstr "{பாதை of இன் உள்ளடக்கங்களுக்கு பதிலாக வெற்று அகராதியைப் பயன்படுத்துதல்!" #: ../fdroidserver/init.py #, python-brace-format msgid "Using existing keystore \"{path}\"" -msgstr "" +msgstr "இருக்கும் கீச்டோர் \"{path}\" ஐப் பயன்படுத்துதல்" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using rclone to sync with: {url}" -msgstr "" +msgstr "Using rclone பெறுநர் sync with: {url}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using s3cmd to sync with: {url}" -msgstr "" +msgstr "Using s3cmd பெறுநர் sync with: {url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" @@ -2044,183 +2060,183 @@ msgstr "செல்லுபடியாகும் கட்டளைகள #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." -msgstr "" +msgstr "Verify against locally cached நகலெடு rather than redownloading." #: ../fdroidserver/__main__.py msgid "Verify the integrity of downloaded packages" -msgstr "" +msgstr "பதிவிறக்கம் செய்யப்பட்ட தொகுப்புகளின் ஒருமைப்பாட்டை சரிபார்க்கவும்" #: ../fdroidserver/index.py msgid "Verifying index signature:" -msgstr "" +msgstr "குறியீட்டு கையொப்பத்தை சரிபார்க்கிறது:" #: ../fdroidserver/install.py #, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "" +msgstr "Apksigner உடன் தொகுப்பு {path} ஐ சரிபார்க்கிறது." #: ../fdroidserver/deploy.py #, python-brace-format msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "" +msgstr "வைரச்டோட்டல் பநிஇ விசையை 32MB ஐ விட பெரிய கோப்புகளை பதிவேற்ற முடியாது, {path} பதிவேற்ற {url} ஐப் பயன்படுத்தவும்." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" -msgstr "" +msgstr "சாத்தியமான மேனிலை தரவு பிழைகள் குறித்து எச்சரிக்கவும்" #: ../fdroidserver/scanner.py msgid "WebAssembly binary file" -msgstr "" +msgstr "வெபாசெம்பிளி பைனரி கோப்பு" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" -msgstr "" +msgstr "கையொப்பமிடப்பட்ட குறியீடுகளுக்கு கட்டமைக்கப்படும்போது, இந்த கட்டத்தில் கையொப்பமிடப்படாத குறியீடுகளை மட்டுமே உருவாக்கவும்" #: ../fdroidserver/lint.py msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "" +msgstr "முழு களஞ்சியத்தையும் யம்லின்ட் இயல்புநிலையாக முடக்கும்போது முடக்கப்படுகிறது. இந்த விருப்பம் யம்லின்ட்டைப் பொருட்படுத்தாமல் கட்டாயப்படுத்துகிறது." #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." -msgstr "" +msgstr "கையொப்பமிடும்போது அல்லது சரிபார்க்கும்போது தோல்வியுற்றால், பிழைக் குறியீட்டைக் கொண்டு வெளியேறவும்." #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "" +msgstr "ADB வழியாக f-droid.apk ஐ பதிவிறக்கம் செய்து நிறுவ விரும்புகிறீர்களா? (ஆம்/இல்லை)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "" +msgstr "F-droid.org இலிருந்து பயன்பாட்டை (களை) பதிவிறக்கம் செய்ய விரும்புகிறீர்களா? (ஆம்/இல்லை)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" -msgstr "" +msgstr "X.509 'விசித்திரமான பெயர்' விசைகளை உருவாக்கும் போது பயன்படுத்தப்படுகிறது" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" -msgstr "" +msgstr "உங்கள் SDK க்கான பாதையை அமைக்க நீங்கள் Android_home ஐப் பயன்படுத்தலாம், அதாவது:" #: ../fdroidserver/scanner.py msgid "ZIP file archive" -msgstr "" +msgstr "சிப் கோப்பு காப்பகம்" #: ../fdroidserver/install.py #, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "" +msgstr "ADB அறிக்கைகள் {தொடர்} என்பது \"{நிலை}\"!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" -msgstr "" +msgstr "{பாதை க்கு க்கு அடையாள கோப்பைச் சேர்ப்பது" #: ../fdroidserver/update.py #, python-brace-format msgid "adding to {name}: {path}" -msgstr "" +msgstr "{name}: {path} உடன் சேர்க்கிறது" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" -msgstr "" +msgstr "தெளிவற்ற விருப்பம்: %(option)s %(matches)s உடன் பொருந்தக்கூடும்" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "ambiguous option: %s (%s?)" -msgstr "" +msgstr "தெளிவற்ற விருப்பம்: %s ( %s?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "" +msgstr "apksigner கண்டுபிடிக்கப்படவில்லை! நவீன APK களை கையொப்பமிடவோ சரிபார்க்கவோ முடியாது" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" -msgstr "" +msgstr "apksigner கண்டுபிடிக்கப்படவில்லை, கையெழுத்திட இது தேவை!" #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" -msgstr "" +msgstr "இயக்க வேண்டிய கோப்பின் பயன்பாட்டு ஐடி" #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" -msgstr "" +msgstr "Appid [: VERCODE] படிவத்தில் விருப்ப பதிப்பு குறியீட்டைக் கொண்ட பயன்பாட்டு ஐடி" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" -msgstr "" +msgstr "காப்பகம்_ஆர்ல் /காப்பகத்துடன் முடிவடைய வேண்டும்" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" -msgstr "" +msgstr "உரையாடல் \"-\" பயன்முறையுடன் %r" #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument %(argument_name)s: %(message)s" -msgstr "" +msgstr "உரையாடல் %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" -msgstr "" +msgstr "சோதனை வரிசைப்படுத்துவதற்கு வெற்று பாஓடு இணைப்பை முயற்சிக்கிறது." #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" -msgstr "" +msgstr "ச்க்ர்லிப் ச்பெக்கை அலச முடியாது (ஒரு சரம் அல்ல): '{}'" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "" +msgstr "' %(கோப்பு பெயர்) கள்' ஐ திறக்க முடியாது: %(filename)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" -msgstr "" +msgstr "HTTPS அல்லாத முகவரி ஐ திறக்க முடியாது: '{};" #: ../fdroidserver/build.py #, python-brace-format msgid "cannot find required srclibs: \"{path}\"" -msgstr "" +msgstr "தேவையான SRCLIBS ஐக் கண்டுபிடிக்க முடியவில்லை: \"{path}\"" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" -msgstr "" +msgstr "பல சப் பார்சர் வாதங்கள் இருக்க முடியாது" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" -msgstr "" +msgstr "செயல்களை ஒன்றிணைக்க முடியாது - இரண்டு குழுக்களுக்கு %r என்று பெயரிடப்பட்டுள்ளது" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" -msgstr "" +msgstr "புதுப்பிப்பை வெளியிட முடியாது, நீங்கள் வரிசைப்படுத்தல் விசையை அமைத்தீர்களா?" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" -msgstr "" +msgstr "குளோனிங் {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" -msgstr "" +msgstr "சொருகி தொகுதிகளிலிருந்து கட்டளைகள்:" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "complex" -msgstr "" +msgstr "அணைவு" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2228,78 +2244,78 @@ msgstr "" #, python-format msgid "conflicting option string: %s" msgid_plural "conflicting option strings: %s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "முரண்பட்ட விருப்ப சரம்: %s" +msgstr[1] "முரண்பட்ட விருப்ப சரங்கள்: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser alias: %s" -msgstr "" +msgstr "முரண்பட்ட சப் பார்சர் மாற்றுப்பெயர்: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting subparser: %s" -msgstr "" +msgstr "முரண்பட்ட சப்சர்: %s" #: ../fdroidserver/metadata.py #, python-brace-format msgid "could not parse '{path}'" -msgstr "" +msgstr "'{path}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "" +msgstr "SRCLIB ச்பெக்கை அலச முடியவில்லை (பெயர் குறிப்பிடப்படவில்லை): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "" +msgstr "SRCLIB ச்பெக்கை அலச முடியவில்லை (குறிப்பு எதுவும் குறிப்பிடப்படவில்லை): '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" +msgstr "SRCLIB ச்பெக்கை அலச முடியவில்லை (அதிகமான '@' அறிகுறிகள்): '{}'" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" -msgstr "" +msgstr "உருவாக்கப்பட்டது {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "தற்போதைய பதிப்பு புதியது: பழைய வெர்கோட் = {பழைய}, புதிய வெர்கோட் = {புதிய}" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" -msgstr "" +msgstr "நீக்குதல்: ரெப்போ/{apkfilename}" #: ../fdroidserver/scanner.py msgid "dependency file without lock" -msgstr "" +msgstr "பூட்டு இல்லாமல் சார்பு கோப்பு" #: ../fdroidserver/common.py #, python-brace-format msgid "deployed process log {path} to {dest}" -msgstr "" +msgstr "பயன்படுத்தப்பட்ட செயல்முறை பதிவு {path} முதல் {dest} வரை" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" -msgstr "" +msgstr "%r போன்ற விருப்பங்களுக்கு DEST = தேவை" #: ../fdroidserver/scanner.py msgid "downloading '{}'" -msgstr "" +msgstr "'{}' பதிவிறக்குகிறது" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" -msgstr "" +msgstr "'{}' இலிருந்து ச்கேனர் கையொப்பங்களைப் பதிவிறக்குவது தோல்வியடைந்தது" #: ../fdroidserver/scanner.py msgid "executable binary, possibly code" -msgstr "" +msgstr "இயங்கக்கூடிய பைனரி, ஒருவேளை குறியீடு" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2307,203 +2323,203 @@ msgstr "" #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "எதிர்பார்க்கப்படும் %s உரையாடல்" +msgstr[1] "எதிர்பார்க்கப்படும் %s வாதங்கள்" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" -msgstr "" +msgstr "குறைந்தது ஒரு வாதத்தை எதிர்பார்க்கலாம்" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" -msgstr "" +msgstr "பெரும்பாலான ஒரு வாதத்தில் எதிர்பார்க்கப்படுகிறது" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" -msgstr "" +msgstr "ஒரு வாதத்தை எதிர்பார்க்கலாம்" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" -msgstr "" +msgstr "fdroid [<கட்டளை>] [-h |--help | --version | ]]" #: ../fdroidserver/scanner.py msgid "fetch the latest version of signatures from the web" -msgstr "" +msgstr "வலையிலிருந்து கையொப்பங்களின் அண்மைக் கால பதிப்பைப் பெறுங்கள்" #: /usr/lib/python3.11/optparse.py msgid "floating-point" -msgstr "" +msgstr "மிதக்கும் புள்ளி" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." -msgstr "" +msgstr "மேனிலை தரவு பிழைகள் (இயல்புநிலை) எச்சரிக்கைகள் அல்லது புறக்கணிக்கப்பட வேண்டும்." #: ../fdroidserver/common.py msgid "git svn clone failed" -msgstr "" +msgstr "அறிவிலி எச்.வி.என் நகலி தோல்வியடைந்தது" #: ../fdroidserver/scanner.py msgid "gzip file archive" -msgstr "" +msgstr "GZIP கோப்பு காப்பகம்" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" -msgstr "" +msgstr "புறக்கணிக்கப்பட்ட வெளிப்படையான உரையாடல் %r" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" -msgstr "" +msgstr "Index-V1 ஒரு கையொப்பத்தைக் கொண்டிருக்க வேண்டும், அதை உருவாக்க `fdroid சிக்னின்டெக்ச்` ஐப் பயன்படுத்தவும்!" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "" +msgstr "Index-V2 ஒரு கையொப்பத்தைக் கொண்டிருக்க வேண்டும், அதை உருவாக்க `fdroid சிக்னின்டெக்ச்` ஐப் பயன்படுத்தவும்!" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" -msgstr "" +msgstr "முழு எண்" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" -msgstr "" +msgstr "தவறான %(வகை) மதிப்பு: %(மதிப்பு) r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "" +msgstr "தவறான தேர்வு: %(மதிப்பு) ஆர் ( %(choices)s இலிருந்து தேர்வு செய்யவும்)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" -msgstr "" +msgstr "தவறான மோதல்_ -ரசல் மதிப்பு: %r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" -msgstr "" +msgstr "தவறான விருப்பத்தேர்வு சரம் %(option) ஆர்: ஒரு எழுத்துக்குறி %(முன்னொட்டு_சார்ச்) ஆர் உடன் தொடங்க வேண்டும்" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" -msgstr "" +msgstr "IPFS_CID கண்டுபிடிக்கப்படவில்லை, CIDV1 தலைமுறையைத் தவிர்க்கிறது" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" +msgstr "அண்மைக் கால உருவாக்க செய்முறை ஒருபோதும் இல்லை: பழைய வெராகோட் = {பழைய}, புதிய வெராக்கோட் = {புதிய}" #: ../fdroidserver/deploy.py #, python-brace-format msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" -msgstr "" +msgstr "Local_copy_dir \"fdroid\" உடன் முடிவடையாது, ஒருவேளை நீங்கள் அர்த்தம்: \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" -msgstr "" +msgstr "local_copy_dir ஒரு முழுமையான பாதையாக இருக்க வேண்டும்!" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be directory, not a file!" -msgstr "" +msgstr "local_copy_dir கோப்பகமாக இருக்க வேண்டும், ஒரு கோப்பு அல்ல!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" -msgstr "" +msgstr "கண்ணாடியின் '%s' 'fdroid' உடன் முடிவடையாது!" #: ../fdroidserver/index.py #, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "" +msgstr "கண்ணாடிகள் இரண்டு முறை அமைக்கப்பட்டன, config.yml மற்றும் {path}!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" -msgstr "" +msgstr "பரச்பர வாதங்கள் விருப்பமாக இருக்க வேண்டும்" #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" -msgstr "" +msgstr "அடுத்து {name} கேச் புதுப்பிப்பு {நேரம்}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" -msgstr "" +msgstr "{appid in இல் \"படவுரு\" இல்லை" #: ../fdroidserver/signatures.py msgid "no APK supplied" -msgstr "" +msgstr "APK வழங்கப்படவில்லை" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "no such option: %s" -msgstr "" +msgstr "அத்தகைய விருப்பம் இல்லை: %s" #: ../fdroidserver/__main__.py msgid "no version info found!" -msgstr "" +msgstr "பதிப்பு செய்தி எதுவும் கிடைக்கவில்லை!" #: ../fdroidserver/checkupdates.py msgid "no version information found" -msgstr "" +msgstr "பதிப்பு தகவல்கள் எதுவும் கிடைக்கவில்லை" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" -msgstr "" +msgstr "உரையாடல் %s உடன் அனுமதிக்கப்படவில்லை" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" -msgstr "" +msgstr "%s வாதங்களில் ஒன்று தேவை" #: ../fdroidserver/common.py ../fdroidserver/index.py msgid "only accepts strings, lists, and tuples" -msgstr "" +msgstr "சரங்கள், பட்டியல்கள் மற்றும் டூப்பிள்களை மட்டுமே ஏற்றுக்கொள்கிறது" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" +msgstr "விருப்பம் %s: கையொப்பமிடப்பட்ட அனைத்து பயன்பாடுகளையும் நீங்கள் உண்மையில் நிறுவ விரும்பினால், பயன்படுத்தவும் -அனைவருக்கும்" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid %s value: %r" -msgstr "" +msgstr "விருப்பம் %s: தவறான %s மதிப்பு: %r" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py #, python-format msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" +msgstr "விருப்பம் %s: தவறான தேர்வு: %r ( %s இலிருந்து தேர்வு)" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py @@ -2524,110 +2540,109 @@ msgstr "விருப்பம் -%s க்கு வாதம் தேவ #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s must not have an argument" -msgstr "" +msgstr "விருப்பம் -%s க்கு ஒரு உரையாடல் இருக்கக்கூடாது" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not a unique prefix" -msgstr "" +msgstr "விருப்பம் -%s ஒரு தனித்துவமான முன்னொட்டு அல்ல" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s not recognized" -msgstr "" +msgstr "விருப்பம் --%s அங்கீகரிக்கப்படவில்லை" #: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py #: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py #: /usr/lib/python3.11/getopt.py #, python-format msgid "option --%s requires argument" -msgstr "" +msgstr "விருப்பம் -%s க்கு உரையாடல் தேவை" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py msgid "optional arguments" -msgstr "" +msgstr "விருப்ப வாதங்கள்" #: /usr/lib/python3.11/argparse.py -#, fuzzy msgid "options" msgstr "விருப்பங்கள்" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" -msgstr "" +msgstr "இருக்கும் {path} ஐ மேலெழுதும்" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" -msgstr "" +msgstr "நிலை வாதங்கள்" #: ../fdroidserver/common.py #, python-brace-format msgid "process log deploy {path} to {dest} failed!" -msgstr "" +msgstr "செயல்முறை பதிவு {path} முதல் {dest} தோல்வியுற்றது!" #: ../fdroidserver/build.py msgid "reference binary missing signature" -msgstr "" +msgstr "குறிப்பு பைனரி காணாமல் போன கையொப்பம்" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "" +msgstr "பாதுகாப்பற்ற HTTP இணைப்பு வழியாக பதிவிறக்குவதை மறுக்கவும் (https ஐப் பயன்படுத்தவும் அல்லது-no-https-check ஐக் குறிப்பிடவும்): {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "" +msgstr "ரெப்போ_கான் \"ரெப்போ/ஐகான்கள்/%s\" இல்லை, ஒதுக்கீட்டு ஒதுக்கிடத்தை உருவாக்குகிறது." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" -msgstr "" +msgstr "ரெப்போ_ஆர்ல் /ரெப்போவுடன் முடிவடைய வேண்டும்" #: ../fdroidserver/deploy.py #, python-brace-format msgid "rsync is missing or broken: {error}" -msgstr "" +msgstr "RSYNC காணவில்லை அல்லது உடைந்தது: {error}" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" +msgstr "ருவாமெல்.யம்ல் நிறுவப்படவில்லை, மெட்டாடேட்டாவை எழுத முடியாது." #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" -msgstr "" +msgstr "S3CMD ஒத்திசைவு குறியீடுகள் {path} முதல் {url} மற்றும் நீக்கு" #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "" +msgstr "S3CMD ஒத்திசைவு குறியீடுகளை {path} முதல் {url} வரை ஒத்திசைத்து நீக்கப்பட்டது" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" -msgstr "" +msgstr "ச்கேனர் கேச் தவறாக உள்ளது! நீங்கள் அதை அழிக்கலாம்: '{தெளிவான}'" #: ../fdroidserver/deploy.py msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "" +msgstr "ServerWebroot: பாதை \"fdroid\" உடன் முடிவடையாது, ஒருவேளை நீங்கள் இவற்றில் ஒன்றைக் குறிக்கிறீர்கள்:" #: ../fdroidserver/scanner.py msgid "shared library" -msgstr "" +msgstr "பகிரப்பட்ட நூலகம்" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "show program's version number and exit" -msgstr "" +msgstr "நிரலின் பதிப்பு எண்ணைக் காண்பி வெளியேறவும்" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py #: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py @@ -2639,266 +2654,266 @@ msgstr "இந்த உதவி செய்தியை காட்டிவ #: ../fdroidserver/signatures.py msgid "signed APK, either a file-path or HTTPS URL." -msgstr "" +msgstr "கையொப்பமிடப்பட்ட APK, ஒரு கோப்பு-பாதை அல்லது HTTPS முகவரி." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "" +msgstr "முழு உருவாக்க பதிவுகளை வரிசைப்படுத்துவதைத் தவிர்க்கவும்: பதிவு உள்ளடக்கம் காலியாக உள்ளது" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" -msgstr "" +msgstr "முழு உருவாக்க பதிவுகளை வரிசைப்படுத்துவதைத் தவிர்க்கவும்: கட்டமைப்பில் இயக்கப்படவில்லை" #: ../fdroidserver/update.py #, python-brace-format msgid "skipping source tarball: {path}" -msgstr "" +msgstr "மூல நாடாகாப்பகபந்து தவிர்த்து: {path}" #: ../fdroidserver/lint.py msgid "srclibs missing name and/or @" -msgstr "" +msgstr "Srclibs பெயர் காணவில்லை மற்றும்/அல்லது @" #: ../fdroidserver/scanner.py msgid "static library" -msgstr "" +msgstr "நிலையான நூலகம்" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "" +msgstr "வழங்கப்பட்ட குறிப்பு பைனரி கையொப்பத்தை அனுமதித்துள்ளது {கையொப்பமிட்டவர்}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" -msgstr "" +msgstr "பின்வரும் வாதங்கள் தேவை: %s" #: ../fdroidserver/install.py msgid "true" -msgstr "" +msgstr "உண்மை" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" -msgstr "" +msgstr "எதிர்பாராத விருப்ப சரம்: %s" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "" +msgstr "அறியப்படாத பாகுபடுத்தி %(parser_name) r (தேர்வுகள்: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" -msgstr "" +msgstr "அங்கீகரிக்கப்படாத வாதங்கள்: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "unsafe permissions on '{config_file}' (should be 0600)!" -msgstr "" +msgstr "'{config_file}' இல் பாதுகாப்பற்ற அனுமதிகள் (0600 ஆக இருக்க வேண்டும்)!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid #: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py msgid "usage: " -msgstr "" +msgstr "பயன்பாடு: " #: ../fdroidserver/deploy.py #, python-brace-format msgid "using Apache libcloud to sync with {url}" -msgstr "" +msgstr "{url both உடன் ஒத்திசைக்க அப்பாச்சி லிப்குட்டைப் பயன்படுத்துதல்" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "" +msgstr "wirustotal.com என்பது விகிதத்தைக் கட்டுப்படுத்துகிறது, மீண்டும் முயற்சிக்க காத்திருக்கிறது ..." #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "ஆம்" #: ../fdroidserver/publish.py #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{0} பயன்பாடு, {1} முக்கிய மாற்றுப்பெயர்கள்" +msgstr[1] "{0} பயன்பாடுகள், {1} முக்கிய மாற்றுப்பெயர்கள்" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" -msgstr "" +msgstr "{apkfilename} ({appid}) மேனிலை தரவு இல்லை!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" +msgstr "{apkfilename the பல {name} கோப்புகளைக் கொண்டுள்ளது, முதன்மை விசை சுரண்டல் போல் தெரிகிறது!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " -msgstr "" +msgstr "{apkfilename} இன் androidmanifest.xml க்கு மோசமான தேதி உள்ளது: " #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." -msgstr "" +msgstr "{appid} ஒரு பெயர் இல்லை! அதற்கு பதிலாக பயன்பாட்டு ஐடியைப் பயன்படுத்துதல்." #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" -msgstr "" +msgstr "{path} இல் இருந்து {appid} என்பது செல்லுபடியாகும் ஆண்ட்ராய்டு பயன்பாட்டு ஐடி அல்ல!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" -msgstr "" +msgstr "{path} இல் இருந்து {appid} என்பது செல்லுபடியாகும் சாவா தொகுப்பு பெயர் அல்ல!" #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} has both APKs and files: {files}" -msgstr "" +msgstr "{appid} பயன்பாடுகள் மற்றும் கோப்புகள் இரண்டையும் கொண்டுள்ளது: {files}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{appid} is missing {name}" -msgstr "" +msgstr "{appid} காணவில்லை {name}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" -msgstr "" +msgstr "{appid}: அறியப்படாத எக்ச்ட்லிப் {path} உருவாக்க '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" -msgstr "" +msgstr "{appid}: தற்போதைய மூல நிலையில் இயங்காத கட்டமைப்புகள் எதுவும் குறிப்பிடப்படவில்லை" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "" +msgstr "{appid}: {field} ஒரு '{type}' ஆக இருக்க வேண்டும், ஆனால் அது ஒரு '{fieldType}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" -msgstr "" +msgstr "{appid}: {field} ஒரு '{type}' ஆக இருக்க வேண்டும், ஆனால் அது ஒரு '{fieldType}'!" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be an integer, found: {value}" -msgstr "" +msgstr "{build_flag} ஒரு முழு எண்ணாக இருக்க வேண்டும், காணப்படுகிறது: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" -msgstr "" +msgstr "{build_flag} பட்டியல் அல்லது சரம் இருக்க வேண்டும், காணப்படுகிறது: {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{file} is blank or corrupt!" -msgstr "" +msgstr "{file} வெற்று அல்லது ஊழல் நிறைந்தது!" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "" +msgstr "{name} \"{section}/ஐகான்கள்/{path}\" இல்லை! \"Config.yml\" ஐ சரிபார்க்கவும்." #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" +msgstr "{OldFile} நீக்கப்பட்டது, {newfile} ஐப் பயன்படுத்தவும்" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" -msgstr "" +msgstr "{path} ஏற்கனவே உள்ளது, இறக்குமதி முடிவுகளை புறக்கணிக்கிறது!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "{path} does not exist! Create it by running:" -msgstr "" +msgstr "{path} இல்லை! இயங்குவதன் மூலம் அதை உருவாக்கவும்:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "" +msgstr "{பாதையில்} மோசமான கோப்பு கையொப்பம் \"{pattern}\", சாத்தியமான சானச் சுரண்டல்!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} has been flagged by virustotal {count} times:" -msgstr "" +msgstr "{path} வைரச்டோட்டல் {count} முறை கொடியிடப்பட்டுள்ளது:" #: ../fdroidserver/install.py #, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "" +msgstr "{path} தவறான கைரேகை ({fingerprint}) உள்ளது!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" +msgstr "{path} என்பது \"விசை: மதிப்பு\" கட்டளை அல்ல, ஆனால் ஒரு {datatype}!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not a standard config file!" -msgstr "" +msgstr "{path} என்பது ஒரு நிலையான கட்டமைப்பு கோப்பு அல்ல!" #: ../fdroidserver/index.py #, python-brace-format msgid "{path} is not list, but a {datatype}!" -msgstr "" +msgstr "{path} என்பது பட்டியல் அல்ல, ஆனால் ஒரு {datatype}!" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "" +msgstr "{path} என்பது {எதிர்பார்க்கப்பட்ட_ வகை அல்ல, ஆனால் ஒரு {datatype}!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} is zero size!" -msgstr "" +msgstr "{path} என்பது சுழிய அளவு!" #: ../fdroidserver/deploy.py #, python-brace-format msgid "{path} more than 200MB, manually upload: {url}" -msgstr "" +msgstr "{path} 200MB க்கும் அதிகமான, கைமுறையாக பதிவேற்றுதல்: {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" +msgstr "{path}: \"{code}\" என்பது செல்லுபடியாகும் ஐஎச்ஓ_3166-1 ஆல்பா -2 நாட்டு குறியீடு அல்ல!" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" -msgstr "" +msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format msgid "{url} does not end with \"fdroid\", check the URL path!" -msgstr "" +msgstr "{url} \"fdroid\" உடன் முடிவடையாது, முகவரி பாதையை சரிபார்க்கவும்!" #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{url} does not start with \"http\"!" -msgstr "" +msgstr "{url} \"http\" உடன் தொடங்காது!" #: ../fdroidserver/build.py msgid "{} build failed" msgid_plural "{} builds failed" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{} கட்டிடம் தோல்வியடைந்தது" +msgstr[1] "{} கட்டமைப்புகள் தோல்வியுற்றன" #: ../fdroidserver/build.py msgid "{} build succeeded" msgid_plural "{} builds succeeded" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{} உருவாக்கம் செய் பெற்றது" +msgstr[1] "{} கட்டடங்கள் செய் பெற்றன" From 620e9f9331d689fcd7dfe5a7eb53ea2fed7ad8d1 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 26 Nov 2024 22:08:10 +0100 Subject: [PATCH 1816/2116] update CHANGELOG.md for 2.3.2 --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d38f05dd..2c27a159 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ### Removed +## [2.3.2] - 2024-11-26 + +### Fixed + +* install: fix downloading from GitHub Releases and Maven Central. +* Sync translations for: ca fa fr pt ru sr ta zh_Hant + ## [2.3.1] - 2024-11-25 ### Fixed From 11aee5b325abf5c21fbff9d6deb4a4dbde0207cc Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 26 Nov 2024 22:09:01 +0100 Subject: [PATCH 1817/2116] version 2.3.2 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 26a3ec9e..0631fd6e 100755 --- a/setup.py +++ b/setup.py @@ -70,7 +70,7 @@ with open("README.md", "r") as fh: setup( name='fdroidserver', - version='2.3.1', + version='2.3.2', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From ad9b0c32942f94ca6b5fedd02c38c25ce5898694 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 4 Dec 2024 11:55:07 +0100 Subject: [PATCH 1818/2116] update: only gen index.png when making index.html * https://f-droid.org/repo does not use the index.png at all * Some repos want to set their own index.png rather than the QR code --- fdroidserver/index.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index d3f9d44e..5a174d51 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -155,12 +155,11 @@ def make_website(apps, repodir, repodict): if not os.path.exists(repodir): os.makedirs(repodir) - qrcode.make(link_fingerprinted).save(os.path.join(repodir, "index.png")) - html_name = 'index.html' html_file = os.path.join(repodir, html_name) if _should_file_be_generated(html_file, autogenerate_comment): + qrcode.make(link_fingerprinted).save(os.path.join(repodir, "index.png")) with open(html_file, 'w') as f: name = repodict["name"] description = repodict["description"] From 5fde2f4d037ffc080007d7b98008677dcd2b8da1 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 5 Dec 2024 13:40:33 +0100 Subject: [PATCH 1819/2116] replace deprecated pkg_resources.get_distribution() from setuptools This should fix the CI error for macOS and reduce technical debt. https://gitlab.com/fdroid/fdroidserver/-/jobs/8542884186 --- tests/test_common.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/test_common.py b/tests/test_common.py index 5ad5a771..4ae55c73 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -2394,11 +2394,9 @@ class CommonTest(unittest.TestCase): def test_auto_install_ndk_mock_dl(self): """Test NDK installs by actually calling sdkmanager""" import sdkmanager - import pkg_resources + import importlib.metadata - sdkmanager_version = LooseVersion( - pkg_resources.get_distribution('sdkmanager').version - ) + sdkmanager_version = LooseVersion(importlib.metadata.version('sdkmanager')) if sdkmanager_version < LooseVersion('0.6.4'): raise unittest.SkipTest('needs fdroid sdkmanager >= 0.6.4') From 46dba20ba30c3928acfecb0ccc6cec371c81bd01 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 5 Dec 2024 18:13:04 +0100 Subject: [PATCH 1820/2116] setup.py: update classifiers --- setup.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 0631fd6e..0a87a665 100755 --- a/setup.py +++ b/setup.py @@ -127,7 +127,7 @@ setup( ], }, classifiers=[ - 'Development Status :: 4 - Beta', + 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', 'Intended Audience :: Information Technology', 'Intended Audience :: System Administrators', @@ -136,6 +136,13 @@ setup( 'Operating System :: POSIX', 'Operating System :: MacOS :: MacOS X', 'Operating System :: Unix', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.9', + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + 'Programming Language :: Python :: 3 :: Only', 'Topic :: Utilities', ], ) From 6d40e8fa2770d58045426bcbc27376f1da7f4c05 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 5 Dec 2024 18:13:32 +0100 Subject: [PATCH 1821/2116] extras_require: python-magic is preferred when libmagic is available --- setup.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 0a87a665..422a5962 100755 --- a/setup.py +++ b/setup.py @@ -116,8 +116,13 @@ setup( # Some requires are only needed for very limited cases: # * biplist is only used for parsing Apple .ipa files # * pycountry is only for linting config/mirrors.yml + # * python-magic is preferred when libmagic is available, but its not in pypi.org extras_require={ - 'optional': ['biplist', 'pycountry'], + 'optional': [ + 'biplist', + 'pycountry', + 'python-magic', + ], 'test': ['pyjks', 'html5print'], 'docs': [ 'sphinx', From bc118484e4c12d84e5c31a29caca0a7ac2dc69e1 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 6 Dec 2024 12:23:27 +0100 Subject: [PATCH 1822/2116] index.xml: XML escaping from Python < 3.13 which stopped converting " index.xml is for old clients that are stuck in the past forever. So the format should not change at all. Python 3.13 changed minidom so it no longer converts " to an XML entity. https://github.com/python/cpython/commit/154477be722ae5c4e18d22d0860e284006b09c4f --- fdroidserver/index.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 5a174d51..096ace12 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -28,6 +28,7 @@ import os import re import ruamel.yaml import shutil +import sys import tempfile import urllib.parse import zipfile @@ -1309,6 +1310,29 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing os.remove(siglinkname) os.symlink(sigfile_path, siglinkname) + if sys.version_info.minor >= 13: + # Python 3.13 changed minidom so it no longer converts " to an XML entity. + # https://github.com/python/cpython/commit/154477be722ae5c4e18d22d0860e284006b09c4f + # This just puts back the previous implementation, with black code format. + import inspect + import xml.dom.minidom + + def _write_data(writer, text, attr): # pylint: disable=unused-argument + if text: + text = ( + text.replace('&', '&') + .replace('<', '<') + .replace('"', '"') + .replace('>', '>') + ) + writer.write(text) + + argnames = tuple(inspect.signature(xml.dom.minidom._write_data).parameters) + if argnames == ('writer', 'text', 'attr'): + xml.dom.minidom._write_data = _write_data + else: + logging.warning('Failed to monkey patch minidom for index.xml support!') + if common.options.pretty: output = doc.toprettyxml(encoding='utf-8') else: From e8aff6a7551b8a52fbf69111a2bb6461b933c152 Mon Sep 17 00:00:00 2001 From: Lzebulon Date: Tue, 3 Dec 2024 10:22:34 +0100 Subject: [PATCH 1823/2116] Translated using Weblate: French (fr) by Lzebulon Currently translated at 95.9% (586 of 611 strings) Translated using Weblate: French (fr) by Lzebulon Currently translated at 95.4% (583 of 611 strings) Translated using Weblate: French (fr) by Lzebulon Currently translated at 95.0% (581 of 611 strings) Translated using Weblate: French (fr) by Lzebulon Currently translated at 94.9% (580 of 611 strings) Co-authored-by: Lzebulon Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 747 +++++++++++++++++++------- 1 file changed, 538 insertions(+), 209 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index e5f7d6fa..e40098eb 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -39,14 +39,16 @@ # Phantomwise , 2024. # Sylvain Pichon , 2024. # Sylvain Pichon , 2024. +# Lzebulon , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-11-26 15:16+0000\n" -"Last-Translator: Ldm Public \n" -"Language-Team: French \n" +"PO-Revision-Date: 2024-11-26 23:39+0000\n" +"Last-Translator: Lzebulon \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -104,7 +106,8 @@ msgstr "\"{path}\" existe mais s3cmd n'est pas installé !" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "Le format du ficher \"{path}\" n'est pas supporté (utiliser : metadata/*.yml)" +msgstr "" +"Le format du ficher \"{path}\" n'est pas supporté (utiliser : metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format @@ -214,8 +217,12 @@ msgstr "'{aapt}' est obsolète, fdroid requiert build-tools-{version} ou plus !" #: ../fdroidserver/common.py #, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' sera ordonné aléatoirement ! Utilisez des parenthèses () ou des crochets [] si l'ordre est important !" +msgid "" +"'{field}' will be in random order! Use () or [] brackets if order is " +"important!" +msgstr "" +"'{field}' sera ordonné aléatoirement ! Utilisez des parenthèses () ou des " +"crochets [] si l'ordre est important !" #: ../fdroidserver/common.py #, python-brace-format @@ -225,12 +232,15 @@ msgstr "'{path}' n'a pas pu être exécuté !" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "Le format de '{path}' est incorrect, il devrait s'agir d’un dictionnaire !" +msgstr "" +"Le format de '{path}' est incorrect, il devrait s'agir d’un dictionnaire !" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" -msgstr "'{value}' n'est pas un(e) {field} valide dans {appid}. Motif regex : {pattern}" +msgstr "" +"'{value}' n'est pas un(e) {field} valide dans {appid}. Motif regex : " +"{pattern}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -275,7 +285,9 @@ msgstr "Ajout d'une clé de signature de dépôt à un dépôt non signé" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" -msgstr "Créer les métadonnées de base manquantes pour les APKs qui n'en sont pas pourvus" +msgstr "" +"Créer les métadonnées de base manquantes pour les APKs qui n'en sont pas " +"pourvus" #: ../fdroidserver/update.py #, python-brace-format @@ -288,11 +300,17 @@ msgstr "Alias de la clé de signature du dépôt dans le trousseau" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "AllowedAPKSigningKeys est manquante mais des références binaires sont indiquées" +msgstr "" +"AllowedAPKSigningKeys est manquante mais des références binaires sont " +"indiquées" #: ../fdroidserver/import_subcommand.py -msgid "Allows a different revision (or git branch) to be specified for the initial import" -msgstr "Autoriser une version différente (ou branche git) a être spécifiée pour l'import initial" +msgid "" +"Allows a different revision (or git branch) to be specified for the initial " +"import" +msgstr "" +"Autoriser une version différente (ou branche git) a être spécifiée pour " +"l'import initial" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" @@ -300,7 +318,8 @@ msgstr "Faire aussi un miroir de la section d'archive complète" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" -msgstr "Alerter aussi à propos des problèmes de formatage, comme rewritemeta -l" +msgstr "" +"Alerter aussi à propos des problèmes de formatage, comme rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" @@ -335,16 +354,28 @@ msgid "Android SDK tool {cmd} not found!" msgstr "L'outil SDK Android {cmd} n'a pas été trouvé !" #: ../fdroidserver/lint.py -msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "L’application possède des fichiers binaires mais n'a pas les AllowedAPKSigningKeys correspondantes pour épingler le certificat." +msgid "" +"App has Binaries but does not have corresponding AllowedAPKSigningKeys to " +"pin certificate." +msgstr "" +"L’application possède des fichiers binaires mais n'a pas les " +"AllowedAPKSigningKeys correspondantes pour épingler le certificat." #: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "L'application a NoSourceSince ou ArchivePolicy « 0 version » mais AutoUpdateMode ou UpdateCheckMode ne valent pas None" +msgid "" +"App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or " +"UpdateCheckMode are not None" +msgstr "" +"L'application a NoSourceSince ou ArchivePolicy « 0 version » mais " +"AutoUpdateMode ou UpdateCheckMode ne valent pas None" #: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "L'application a NoSourceSince ou ArchivePolicy à « 0 version » mais AutoUpdateMode ou UpdateCheckMode ne valent pas None" +msgid "" +"App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but " +"AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" +"L'application a NoSourceSince ou ArchivePolicy à « 0 version » mais " +"AutoUpdateMode ou UpdateCheckMode ne valent pas None" #: ../fdroidserver/lint.py #, python-brace-format @@ -352,8 +383,12 @@ msgid "App is in '{repo}' but has a link to {url}" msgstr "L'application est dans '{repo}' mais a un lien vers {url}" #: ../fdroidserver/lint.py -msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." -msgstr "Des versions de l’application possède des fichiers binaires mais n'ont pas les AllowedAPKSigningKeys correspondantes pour épingler le certificat." +msgid "" +"App version has binary but does not have corresponding AllowedAPKSigningKeys " +"to pin certificate." +msgstr "" +"Des versions de l’application possède des fichiers binaires mais n'ont pas " +"les AllowedAPKSigningKeys correspondantes pour épingler le certificat." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -379,17 +414,24 @@ msgstr "Répondre automatiquement Oui à toutes les demandes." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "Mauvais type d'entrée \"{mirrortype}\" dans le paramétrage des miroirs : {mirror}" +msgstr "" +"Mauvais type d'entrée \"{mirrortype}\" dans le paramétrage des miroirs : " +"{mirror}" #: ../fdroidserver/mirror.py -msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" -msgstr "URL de base à mirorer, peut inclure la clef de signature d'index à l'aide de la chaîne de requête : ?fingerprint=" +msgid "" +"Base URL to mirror, can include the index signing key using the query " +"string: ?fingerprint=" +msgstr "" +"URL de base à mirorer, peut inclure la clef de signature d'index à l'aide de " +"la chaîne de requête : ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "Branche « {branch} » utilisée comme commit dans le build « {versionName} »" +msgstr "" +"Branche « {branch} » utilisée comme commit dans le build « {versionName} »" #: ../fdroidserver/lint.py #, python-brace-format @@ -411,11 +453,14 @@ msgstr "Compiler toutes les applications disponibles" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" -msgstr "Build généré par `fdroid import` — supprimer la ligne désactivée une fois prêt" +msgstr "" +"Build généré par `fdroid import` — supprimer la ligne désactivée une fois " +"prêt" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" -msgstr "Le dépôt git des métadonnées de build a des changements non sauvegardés !" +msgstr "" +"Le dépôt git des métadonnées de build a des changements non sauvegardés !" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" @@ -428,7 +473,9 @@ msgstr "Dépôt du build basé sur \"%s\" avec cette config :" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "Impossible de mettre à jour l'application automatiquement sans \"CurrentVersionCode\"" +msgstr "" +"Impossible de mettre à jour l'application automatiquement sans " +"\"CurrentVersionCode\"" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -453,7 +500,9 @@ msgstr "Catégories non définies" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "La catégorie « {category} » est définie mais n'est utilisée par aucune application !" +msgstr "" +"La catégorie « {category} » est définie mais n'est utilisée par aucune " +"application !" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -461,12 +510,17 @@ msgstr "Vérifier les mises à jour pour les applications" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "Vérification de l'archivage pour {appid} — apks : {integer}, keepversions : {keep}, archapks : {arch}" +msgid "" +"Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, " +"archapks:{arch}" +msgstr "" +"Vérification de l'archivage pour {appid} — apks : {integer}, keepversions : " +"{keep}, archapks : {arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" -msgstr "Mise à jour propre — n'utilise pas les caches, traite à nouveau tous les APKs" +msgstr "" +"Mise à jour propre — n'utilise pas les caches, traite à nouveau tous les APKs" #: ../fdroidserver/common.py msgid "Color the log output" @@ -487,21 +541,31 @@ msgstr "Sauvegarder les changements (commit)" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "Sauvegarder les changements, les pousser sur le dépôt et faire une demande d'intégration" +msgstr "" +"Sauvegarder les changements, les pousser sur le dépôt et faire une demande " +"d'intégration" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "Conflit des définitions « {field} » entre les fichiers .yml et ceux traduits :" +msgstr "" +"Conflit des définitions « {field} » entre les fichiers .yml et ceux " +"traduits :" #: ../fdroidserver/__main__.py -msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." -msgstr "Conflit d'arguments : '--verbose' et '--quiet' ne peuvent être choisis en même temps." +msgid "" +"Conflicting arguments: '--verbose' and '--quiet' can not be specified at the " +"same time." +msgstr "" +"Conflit d'arguments : '--verbose' et '--quiet' ne peuvent être choisis en " +"même temps." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Conflit de fichiers de configuration ! Utilisation de {newfile}, ignorant {oldfile} !" +msgstr "" +"Conflit de fichiers de configuration ! Utilisation de {newfile}, ignorant " +"{oldfile} !" #: ../fdroidserver/common.py #, python-brace-format @@ -545,7 +609,8 @@ msgstr "Impossible de trouver l'ID du paquet" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" -msgstr "Je refuse de remplacer la configuration existante des clés de signature !" +msgstr "" +"Je refuse de remplacer la configuration existante des clés de signature !" #: ../fdroidserver/deploy.py #, python-brace-format @@ -585,7 +650,9 @@ msgstr "Création d'un index non signé pour préparer la signature" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "Le code de la version actuel {cv} est moins récent que la dernier build {versionCode}" +msgstr "" +"Le code de la version actuel {cv} est moins récent que la dernier build " +"{versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" @@ -598,12 +665,16 @@ msgstr "Supprimer les APK et/ou OBB sans métadonnées dans le dépôt" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "Suppression de l'archive en cours, le dépôt occupe trop de place ({size} max {limit})" +msgstr "" +"Suppression de l'archive en cours, le dépôt occupe trop de place ({size} max " +"{limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "Suppression de l'historique de git-mirror, car le dépôt occupe trop de place ({size} max {limit})" +msgstr "" +"Suppression de l'historique de git-mirror, car le dépôt occupe trop de place " +"({size} max {limit})" #: ../fdroidserver/update.py #, python-brace-format @@ -622,12 +693,16 @@ msgstr "Ligne dupliquée dans la description" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "La description contient une liste (%s) mais ce n'est ni une liste à puces (*) ni une liste numérotée (#)" +msgstr "" +"La description contient une liste (%s) mais ce n'est ni une liste à puces " +"(*) ni une liste numérotée (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" -msgstr "La longueur de la description {length} dépasser la limite du nombre de caractères autorisés {limit}" +msgstr "" +"La longueur de la description {length} dépasser la limite du nombre de " +"caractères autorisés {limit}" #: ../fdroidserver/common.py #, python-brace-format @@ -665,8 +740,12 @@ msgid "Don't create a source tarball, useful when testing a build" msgstr "Ne pas créer un tarball avec les sources, utile pour tester un build" #: ../fdroidserver/build.py -msgid "Don't refresh the repository, useful when testing a build with no internet connection" -msgstr "Ne pas rafraîchir le dépôt, utile pour tester un build sans connexion internet" +msgid "" +"Don't refresh the repository, useful when testing a build with no internet " +"connection" +msgstr "" +"Ne pas rafraîchir le dépôt, utile pour tester un build sans connexion " +"internet" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" @@ -674,7 +753,8 @@ msgstr "Ne pas utiliser les sommes de contrôle rsync" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "Téléchager F-Droid.apk en utilisant des miroirs avec moins de fuites réseaux" +msgstr "" +"Téléchager F-Droid.apk en utilisant des miroirs avec moins de fuites réseaux" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -687,7 +767,8 @@ msgstr "Téléchargement de %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." -msgstr "Le téléchargement du référentiel a déjà échoué une fois, ne pas réessayer." +msgstr "" +"Le téléchargement du référentiel a déjà échoué une fois, ne pas réessayer." #: ../fdroidserver/verify.py #, python-brace-format @@ -716,14 +797,17 @@ msgstr "ERREUR : %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "ERREUR : La sous-commande \"server\" a été supprimée, utilisez plutôt \"deploy\" !" +msgstr "" +"ERREUR : La sous-commande \"server\" a été supprimée, utilisez plutôt " +"\"deploy\" !" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" -"ERREUR : cette commande ne devrait jamais être utilisée pour copier f-droid.org !\n" +"ERREUR : cette commande ne devrait jamais être utilisée pour copier f-droid." +"org !\n" "Une copie de f-droid.org occupe plus de 200GB." #: ../fdroidserver/nightly.py @@ -733,7 +817,9 @@ msgstr "ERREUR : type de CI non supporté, les corrections sont bienvenues !" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "ERREUR : hébergeur git « %s » non supporté, les corrections sont les bienvenues !" +msgstr "" +"ERREUR : hébergeur git « %s » non supporté, les corrections sont les " +"bienvenues !" #: ../fdroidserver/lint.py #, python-brace-format @@ -743,12 +829,18 @@ msgstr "ERREUR : {key} dans {path} n'est pas \"archive\" ou \"repo\"." #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" -msgstr "ERREUR : {key} :{subkey} dans {path} n'est pas une clé valide parmi : {allowed_keys}." +msgstr "" +"ERREUR : {key} :{subkey} dans {path} n'est pas une clé valide parmi : " +"{allowed_keys}." #: ../fdroidserver/__main__.py #, python-brace-format -msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." -msgstr "L'encodage est mis sur '{enc}', FDroid peut rencontrer des problèmes d'encodage. Merci de le mettre sur 'UTF-8' pour de meilleurs résultats." +msgid "" +"Encoding is set to '{enc}' fdroid might run into encoding issues. Please set " +"it to 'UTF-8' for best results." +msgstr "" +"L'encodage est mis sur '{enc}', FDroid peut rencontrer des problèmes " +"d'encodage. Merci de le mettre sur 'UTF-8' pour de meilleurs résultats." #: ../fdroidserver/init.py #, python-format @@ -765,8 +857,12 @@ msgid "Environment variable {var} from {configname} is not set!" msgstr "La variable d'environnent {var} de {configname} n'est pas configurée !" #: ../fdroidserver/deploy.py -msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "Erreur lors du déploiement 'github_releases' : {} est absent (vous devriez peut-être d'abord lancer `fdroid update`)." +msgid "" +"Error deploying 'github_releases', {} not present. (You might need to run " +"`fdroid update` first.)" +msgstr "" +"Erreur lors du déploiement 'github_releases' : {} est absent (vous devriez " +"peut-être d'abord lancer `fdroid update`)." #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -774,7 +870,8 @@ msgstr "Erreur lors de l'obtention de l'adresse du dépôt" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "Quitter avec un code différent de zéro si des problèmes ont été détectés" +msgstr "" +"Quitter avec un code différent de zéro si des problèmes ont été détectés" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" @@ -796,7 +893,8 @@ msgstr "Erreur durant la copie de {path} : {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" -msgstr "Erreur lors de l'extraction des signatures pour '{apkfilename}' : {error}" +msgstr "" +"Erreur lors de l'extraction des signatures pour '{apkfilename}' : {error}" #: ../fdroidserver/update.py #, python-brace-format @@ -821,7 +919,8 @@ msgstr "Impossible d'obtenir les informations de l'APK, suppression {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" -msgstr "Échoument lors de la récupération des informations de l'APK, saut de {path}" +msgstr "" +"Échoument lors de la récupération des informations de l'APK, saut de {path}" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" @@ -839,7 +938,9 @@ msgstr "Erreur lors de la signature de l'application" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" -msgstr "Récupération de l'ID du serveur de construction depuis la VM : {buildserverid}" +msgstr "" +"Récupération de l'ID du serveur de construction depuis la VM : " +"{buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format @@ -859,20 +960,27 @@ msgstr "Terminé" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Les informations de dons via Flattr doivent être renseignées dans le champ FlattrID:" +msgstr "" +"Les informations de dons via Flattr doivent être renseignées dans le champ " +"FlattrID:" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Balises HTML interdites" #: ../fdroidserver/build.py -msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." -msgstr "Forcer la construction des application désactiver, et opérateur indépendament au scan des problèmes. Seulement autoriser en mode de test." +msgid "" +"Force build of disabled apps, and carries on regardless of scan problems. " +"Only allowed in test mode." +msgstr "" +"Forcer la construction des application désactiver, et opérateur " +"indépendament au scan des problèmes. Seulement autoriser en mode de test." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" -msgstr "Arrêt forcer de la construction après {0} secondes de délai d'attente !" +msgstr "" +"Arrêt forcer de la construction après {0} secondes de délai d'attente !" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." @@ -881,7 +989,8 @@ msgstr "Forcer le scan d'applications et versions désactivées." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" -msgstr "« {path} » graphique trouvée sans métadonnées pour l'application « {name} » !" +msgstr "" +"« {path} » graphique trouvée sans métadonnées pour l'application « {name} » !" #: ../fdroidserver/update.py #, python-brace-format @@ -914,7 +1023,8 @@ msgstr "De multiples fichiers de métadonnées ont été trouvés pour {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." -msgstr "Plusieurs certificats de signature ont étés trouvés pour le référentiel." +msgstr "" +"Plusieurs certificats de signature ont étés trouvés pour le référentiel." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." @@ -990,17 +1100,20 @@ msgstr "HTTPS doit être utilisé avec les URL de Subversion !" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "Si un miroir git prend trop de place, permet à l'archive d'être supprimé" +msgstr "" +"Si un miroir git prend trop de place, permet à l'archive d'être supprimé" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "Si ce téléversement échoue, tente de le téléverser manuellement vers {url}" +msgstr "" +"Si ce téléversement échoue, tente de le téléverser manuellement vers {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "Ignore '{field}' dans les métadonnées '{metapath}' parce que c'est déprécié." +msgstr "" +"Ignore '{field}' dans les métadonnées '{metapath}' parce que c'est déprécié." #: ../fdroidserver/update.py #, python-format @@ -1139,7 +1252,8 @@ msgstr "Métadonnée de scrlib invalide : '{file}' ne peut être analysé" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "Métadonnée de scrlib invalide : la clé '{key}' est inconnue dans '{file}'" +msgstr "" +"Métadonnée de scrlib invalide : la clé '{key}' est inconnue dans '{file}'" #: ../fdroidserver/common.py #, python-brace-format @@ -1158,15 +1272,20 @@ msgstr "Fichier Java JAR" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "Java JDK introuvable ! Installez dans un emplacement standard ou définissez java_paths !" +msgstr "" +"Java JDK introuvable ! Installez dans un emplacement standard ou définissez " +"java_paths !" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Classe Java compilée" #: ../fdroidserver/signindex.py -msgid "Java jarsigner not found! Install in standard location or set java_paths!" -msgstr "Java jarsigner introuvable ! Installez dans un emplacement standard ou définissez java_paths !" +msgid "" +"Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "" +"Java jarsigner introuvable ! Installez dans un emplacement standard ou " +"définissez java_paths !" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" @@ -1183,12 +1302,15 @@ msgstr "Stockage des clés signée :\t" #: ../fdroidserver/lint.py msgid "Known debug key is used in AllowedAPKSigningKeys: " -msgstr "" +msgstr "La clé de débogage connue est utilisé dans AllowedAPKSigningKeys : " #: ../fdroidserver/lint.py #, python-brace-format -msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "Le dernier commit utilisé '{commit}' ressemble a une balise, mais le UpdateCheckMode est '{ucm}'" +msgid "" +"Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" +"Le dernier commit utilisé '{commit}' ressemble a une balise, mais le " +"UpdateCheckMode est '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" @@ -1229,11 +1351,14 @@ msgstr "Répertoire de destination manquant" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "Déplacement des déclarations des antifonctions vers les fichiers de traduction :" +msgstr "" +"Déplacement des déclarations des antifonctions vers les fichiers de " +"traduction :" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "Ni « repo_pubkey », ni « keystorepass » ne sont définis dans config.yml" +msgstr "" +"Ni « repo_pubkey », ni « keystorepass » ne sont définis dans config.yml" #: ../fdroidserver/verify.py #, python-format @@ -1275,7 +1400,9 @@ msgstr "Aucune étiquette correspondante n’a été trouvée" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "Aucune version minimale du SDK trouvée dans {0}, utilisation de la valeur par défaut (3)." +msgstr "" +"Aucune version minimale du SDK trouvée dans {0}, utilisation de la valeur " +"par défaut (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1287,7 +1414,9 @@ msgstr "Pas besoin de spécifier que l'application est pour Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" -msgstr "Aucune option configurée ! Éditez votre config.yml pour définir au moins l'une d'entre elles :" +msgstr "" +"Aucune option configurée ! Éditez votre config.yml pour définir au moins " +"l'une d'entre elles :" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1352,7 +1481,9 @@ msgstr "Maintenant, définissez-les dans config.yml :" #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" -msgstr "Le fichier OBB a un code de version plus récent ({integer}) que n'importe quel APK :" +msgstr "" +"Le fichier OBB a un code de version plus récent ({integer}) que n'importe " +"quel APK :" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" @@ -1360,28 +1491,46 @@ msgstr "Le nom de fichier OBB doit commencer par «principal». ou \"patch\" : #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" -msgstr "Le nom de paquet d'OBB ne correspond pas à un fichier APK pris en charge :" +msgstr "" +"Le nom de paquet d'OBB ne correspond pas à un fichier APK pris en charge :" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "Machine hors-ligne, la génération du miroir git est sautée jusqu'à `fdroid deploy`" +msgstr "" +"Machine hors-ligne, la génération du miroir git est sautée jusqu'à `fdroid " +"deploy`" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "" +"One of the 'github_releases' config items is missing the 'packageNames' " +"value. skipping ..." msgstr "" +"L'un des éléments de configuration 'github_releases' ne contient pas la " +"valeur 'packageNames'. ignoré..." #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "" +"One of the 'github_releases' config items is missing the 'projectUrl' value. " +"skipping ..." msgstr "" +"L'un des éléments de configuration 'github_releases' ne contient pas la " +"valeur 'projectUrl'. ignoré..." #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." +#, fuzzy +msgid "" +"One of the 'github_releases' config items is missing the 'token' value. " +"skipping ..." msgstr "" +"L'un des éléments de configuration 'github_releases' ne contient pas la " +"valeur 'token'. ignoré..." #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" -msgstr "Seuls les formats PNG et JPEG sont pris en charge pour les graphiques, trouvés : {path}" +msgstr "" +"Seuls les formats PNG et JPEG sont pris en charge pour les graphiques, " +"trouvés : {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" @@ -1389,11 +1538,13 @@ msgstr "Afficher uniquement les différences avec le Play Store" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" -msgstr "Traiter uniquement les applications ayant des mises à jour automatiques" +msgstr "" +"Traiter uniquement les applications ayant des mises à jour automatiques" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "Les méthodes de donation OpenCollective vont dans le champ OpenCollective:" +msgstr "" +"Les méthodes de donation OpenCollective vont dans le champ OpenCollective:" #: /usr/lib/python3.11/optparse.py msgid "Options" @@ -1420,7 +1571,9 @@ msgstr "Licence globale du projet." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "Substitution du nom de version vide dans {apkfilename} des métadonnées : {version}" +msgstr "" +"Substitution du nom de version vide dans {apkfilename} des métadonnées : " +"{version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format @@ -1438,7 +1591,9 @@ msgstr "Mot de passe requis avec le nom d'utilisateur" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." -msgstr "Chemin d'accès au sous-répertoire principal du projet Android, si ce n'est pas dans le répertoire racine." +msgstr "" +"Chemin d'accès au sous-répertoire principal du projet Android, si ce n'est " +"pas dans le répertoire racine." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" @@ -1454,12 +1609,15 @@ msgstr "Chemin vers le keystore pour la clé de signature du dépôt" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" -msgstr "Afficher la variable secrète dans le terminal pour un copier/coller facilité" +msgstr "" +"Afficher la variable secrète dans le terminal pour un copier/coller facilité" #: ../fdroidserver/install.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." msgstr "" +"Le mode de confidentialité a été activé, dû à votre position " +"({country_code})." #: ../fdroidserver/scanner.py #, python-format @@ -1508,7 +1666,7 @@ msgstr "Envoyer les logs de transparence de la compilation vers {url}" #: ../fdroidserver/deploy.py msgid "Pushing to remote server failed!" -msgstr "" +msgstr "L'envoie au serveur distant a échoué !" #: ../fdroidserver/deploy.py #, python-brace-format @@ -1530,13 +1688,21 @@ msgstr "Lecture de '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format -msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" -msgstr "La lecture de packageName/versionCode/versionName a échoué, APK invalide : '{apkfilename}'" +msgid "" +"Reading packageName/versionCode/versionName failed, APK invalid: " +"'{apkfilename}'" +msgstr "" +"La lecture de packageName/versionCode/versionName a échoué, APK invalide : " +"'{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format -msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" -msgstr "La lecture de packageName/versionCode/versionName a échoué, APK invalide : '{apkfilename}'" +msgid "" +"Reading packageName/versionCode/versionName failed,APK invalid: " +"'{apkfilename}'" +msgstr "" +"La lecture de packageName/versionCode/versionName a échoué, APK invalide : " +"'{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format @@ -1546,7 +1712,8 @@ msgstr "Lecture de {apkfilename} à partir du cache" #: ../fdroidserver/build.py #, fuzzy msgid "Refresh and cache scanner rules and signatures from the network" -msgstr "recupération de la dernière version des signatures depuis le web" +msgstr "" +"Actualisation et mise en cache des règles et signature à partir du réseau." #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1559,15 +1726,21 @@ msgstr "Suppression de {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" -msgstr "Renomme les fichiers APK dont le nom ne ressemble pas à nom.paquet_123.apk" +msgstr "" +"Renomme les fichiers APK dont le nom ne ressemble pas à nom.paquet_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "Le mode de mise à jour de RepoTrunk n'a de sens que pour les dépôts git-svn" +msgstr "" +"Le mode de mise à jour de RepoTrunk n'a de sens que pour les dépôts git-svn" #: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Réinitialiser et créer un tout nouveau serveur de construction, même si le serveur existant semble correct." +msgid "" +"Reset and create a brand new build server, even if the existing one appears " +"to be ok." +msgstr "" +"Réinitialiser et créer un tout nouveau serveur de construction, même si le " +"serveur existant semble correct." #: ../fdroidserver/nightly.py #, python-brace-format @@ -1576,16 +1749,18 @@ msgstr "Re-signature de {apkfilename} avec le debug.keystore fournit" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" -msgstr "Redimensionner toutes les icônes excédant la taille maximale en pixels et quitter" +msgstr "" +"Redimensionner toutes les icônes excédant la taille maximale en pixels et " +"quitter" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" msgstr "Limiter la sortie aux avertissements et aux erreurs" #: ../fdroidserver/net.py -#, python-format +#, fuzzy, python-format msgid "Retrying failed download: %s" -msgstr "" +msgstr "Réessaie de téléchargement échoué : %s" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1601,9 +1776,12 @@ msgid "Run on git repo that has uncommitted changes" msgstr "Exécuter sur le dépôt git qui a des modifications non validées" #: ../fdroidserver/nightly.py -#, python-brace-format -msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +#, fuzzy, python-brace-format +msgid "" +"Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" msgstr "" +"Lancer sur {cibase} pour trouver -debug.apk et passer repo_basedir " +"{repo_basedir}" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1625,7 +1803,9 @@ msgstr "Le SHA-256 de {url} ne correspond pas à l'entrée !" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "Analyse le(s) APK(s) généré(s) afin de trouver les classes connues comme non libres." +msgstr "" +"Analyse le(s) APK(s) généré(s) afin de trouver les classes connues comme non " +"libres." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" @@ -1654,7 +1834,7 @@ msgstr[1] "Le scanneur a trouvé {} problèmes" #: ../fdroidserver/scanner.py msgid "Scanning APK for extra signing blocks." -msgstr "" +msgstr "Analyse de l'APK à la recherche de signature de blocs supplémentaires." #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." @@ -1671,7 +1851,9 @@ msgstr "Réglez l'horloge à cette heure à l'aide de :" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "Régler le maximum de versions dans le dépôt avant que les plus anciennes soient archivées" +msgstr "" +"Régler le maximum de versions dans le dépôt avant que les plus anciennes " +"soient archivées" #: ../fdroidserver/build.py #, python-brace-format @@ -1680,7 +1862,9 @@ msgstr "Définition de la limite de fichiers ouverts à {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" -msgstr "Programmer une compilation de l'application pour le dépôt des versions de test" +msgstr "" +"Programmer une compilation de l'application pour le dépôt des versions de " +"test" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " @@ -1701,7 +1885,9 @@ msgstr "Signer les indexes créés avec update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" -msgstr "Sauter le scan du code source pour des fichiers binaires et d'autres problèmes" +msgstr "" +"Sauter le scan du code source pour des fichiers binaires et d'autres " +"problèmes" #: ../fdroidserver/update.py #, python-brace-format @@ -1711,7 +1897,8 @@ msgstr "Omission de '{apkfilename}' qui a une signature non valide !" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "Ignorer le miroir GitLab Pages car le dépôt est trop volumineux (>%.2fGB) !" +msgstr "" +"Ignorer le miroir GitLab Pages car le dépôt est trop volumineux (>%.2fGB) !" #: ../fdroidserver/update.py #, python-brace-format @@ -1757,7 +1944,8 @@ msgstr "Le résumé '%s' est juste le nom de l'application" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" -msgstr "Le résumé de taille {length} est au-dessus de la limite de {limit} caractères" +msgstr "" +"Le résumé de taille {length} est au-dessus de la limite de {limit} caractères" #: ../fdroidserver/common.py #, python-brace-format @@ -1765,16 +1953,26 @@ msgid "System clock is older than date in {path}!" msgstr "L'horloge système est plus âgée que la date dans {path} !" #: ../fdroidserver/checkupdates.py -msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" -msgstr "Le mode de mise à jour par étiquettes fonctionne seulement pour les dépôts git, hg, bzr et git-svn pour le moment" +msgid "" +"Tags update mode only works for git, hg, bzr and git-svn repositories " +"currently" +msgstr "" +"Le mode de mise à jour par étiquettes fonctionne seulement pour les dépôts " +"git, hg, bzr et git-svn pour le moment" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "Le mode de mise à jour par étiquettes est utilisé dans git-svn, mais le dépôt n'était pas paramétré avec des étiquettes" +msgstr "" +"Le mode de mise à jour par étiquettes est utilisé dans git-svn, mais le " +"dépôt n'était pas paramétré avec des étiquettes" #: ../fdroidserver/build.py -msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." -msgstr "Mode test — mettre la sortie dans le dossier tmp uniquement et toujours compiler, même si la sortie existe déjà." +msgid "" +"Test mode - put output in the tmp directory only, and always build, even if " +"the output already exists." +msgstr "" +"Mode test — mettre la sortie dans le dossier tmp uniquement et toujours " +"compiler, même si la sortie existe déjà." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1809,16 +2007,30 @@ msgstr "Il y a une collision de keyalias — publication interrompue" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." -msgstr "Voici les applications qui ont été archivées à partir du dépôt principal." +msgstr "" +"Voici les applications qui ont été archivées à partir du dépôt principal." #: ../fdroidserver/mirror.py #, fuzzy -msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." -msgstr "Cette commande ne devrait jamais être utilisée pour copier f-droid.org ! Une copie occupe plus de 600GB." +msgid "" +"This command should never be used to mirror f-droid.org! A full copy " +"requires more than 600GB." +msgstr "" +"Cette commande ne devrait jamais être utilisée pour copier f-droid.org ! Une " +"copie occupe plus de 600GB." #: ../fdroidserver/common.py -msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "Ceci est un dépôt d’applications à utiliser avec FDroid. Les applications publiées dans ce dépôt sont soit les binaires officiels compilés par les développeurs de ces applications, soit celles compilées par f-droid.org à partir des sources en utilisant les outils disponibles sur https://gitlab.com/fdroid." +msgid "" +"This is a repository of apps to be used with F-Droid. Applications in this " +"repository are either official binaries built by the original application " +"developers, or are binaries built from source by the admin of f-droid.org " +"using the tools on https://gitlab.com/fdroid." +msgstr "" +"Ceci est un dépôt d’applications à utiliser avec FDroid. Les applications " +"publiées dans ce dépôt sont soit les binaires officiels compilés par les " +"développeurs de ces applications, soit celles compilées par f-droid.org à " +"partir des sources en utilisant les outils disponibles sur https://gitlab." +"com/fdroid." #: ../fdroidserver/import_subcommand.py #, python-format @@ -1843,17 +2055,23 @@ msgstr "" "Vous devriez aussi paramétrer une clé de signature\n" "(une clé temporaire peut avoir été générée automatiquement).\n" "\n" -"Plus d'informations sur : https://f-droid.org/fr/docs/Setup_an_F-Droid_App_Repo\n" +"Plus d'informations sur : https://f-droid.org/fr/docs/Setup_an_F-" +"Droid_App_Repo\n" "et https://f-droid.org/fr/docs/Signing_Process." #: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" -msgstr "Pour utiliser awsbucket, awssecretkey et awsaccesskeyid doivent aussi être configurées dans config.yml !" +msgid "" +"To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config." +"yml!" +msgstr "" +"Pour utiliser awsbucket, awssecretkey et awsaccesskeyid doivent aussi être " +"configurées dans config.yml !" #: ../fdroidserver/deploy.py -#, fuzzy msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" -msgstr "Pour utiliser awsbucket, awssecretkey et awsaccesskeyid doivent aussi être configurées dans config.yml !" +msgstr "" +"Pour utiliser rclone, rclone_config et awsbucket doivent être configurées " +"dans config.yml !" #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -1869,12 +2087,20 @@ msgid "URL {url} in Description: {error}" msgstr "URL {url} en Description : {error}" #: ../fdroidserver/lint.py -msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" -msgstr "Balise de licence non valide \"{}\" ! Utilisez uniquement des balises approuvées par la FSF ou l'OSI de https://spdx.org/license-list" +msgid "" +"Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from " +"https://spdx.org/license-list" +msgstr "" +"Balise de licence non valide \"{}\" ! Utilisez uniquement des balises " +"approuvées par la FSF ou l'OSI de https://spdx.org/license-list" #: ../fdroidserver/lint.py -msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" -msgstr "Balise de licence non valide \"{}\" ! Utilisez uniquement des balises de licence configurées dans votre fichier de configuration" +msgid "" +"Unexpected license tag \"{}\"! Only use license tags configured in your " +"config file" +msgstr "" +"Balise de licence non valide \"{}\" ! Utilisez uniquement des balises de " +"licence configurées dans votre fichier de configuration" #: ../fdroidserver/common.py #, python-brace-format @@ -1931,7 +2157,8 @@ msgstr "Option de compilation '{build_flag}' non reconnue dans '{path}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" -msgstr "Type de fichier non pris en charge \"{extension}\" pour graphique de dépôt" +msgstr "" +"Type de fichier non pris en charge \"{extension}\" pour graphique de dépôt" #: ../fdroidserver/update.py #, python-brace-format @@ -1969,7 +2196,8 @@ msgstr "Mettre à jour les données des dépôts pour les nouveaux paquets" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" -msgstr "Mettre à jour le rapport de transparence des fichiers binaires pour une URL" +msgstr "" +"Mettre à jour le rapport de transparence des fichiers binaires pour une URL" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -1978,8 +2206,12 @@ msgstr "UpdateCheckData a une URL invalide : {url}" #: ../fdroidserver/lint.py #, python-brace-format -msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" -msgstr "UpdateCheckData doit correspondre au code de la version en nombre entier (\\d ou [0-9]) : {codeex}" +msgid "" +"UpdateCheckData must match the version code as integer (\\d or [0-9]): " +"{codeex}" +msgstr "" +"UpdateCheckData doit correspondre au code de la version en nombre entier " +"(\\d ou [0-9]) : {codeex}" #: ../fdroidserver/lint.py #, python-brace-format @@ -1992,18 +2224,26 @@ msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData URL non valide : {url}" #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "UpdateCheckMode est configuré mais on dirait que checkupdates n'a pas encore été lancé." +msgid "" +"UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." +msgstr "" +"UpdateCheckMode est configuré mais on dirait que checkupdates n'a pas encore " +"été lancé." #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py #, fuzzy -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode est configuré mais on dirait que checkupdates n'a pas encore été lancé" +msgid "" +"UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" +"UpdateCheckMode est configuré mais on dirait que checkupdates n'a pas encore " +"été lancé" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "UpdateCheckName est défini sur l’ID d’application connu, il peut être supprimé" +msgstr "" +"UpdateCheckName est défini sur l’ID d’application connu, il peut être " +"supprimé" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2030,12 +2270,18 @@ msgstr "Usage : %s\n" #: ../fdroidserver/lint.py #, fuzzy -msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "Utiliser /HEAD plutôt que /master pour pointer un fichier dans la branche par défaut" +msgid "" +"Use /HEAD instead of /master or /main to point at a file in the default " +"branch" +msgstr "" +"Utiliser /HEAD plutôt que /master pour pointer un fichier dans la branche " +"par défaut" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Utiliser /HEAD plutôt que /master pour pointer un fichier dans la branche par défaut" +msgstr "" +"Utiliser /HEAD plutôt que /master pour pointer un fichier dans la branche " +"par défaut" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." @@ -2047,7 +2293,9 @@ msgstr "Utiliser le serveur de build" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" -msgstr "Utiliser la date de l'APK plutôt que la date courante pour les APKs nouvellement ajoutés" +msgstr "" +"Utiliser la date de l'APK plutôt que la date courante pour les APKs " +"nouvellement ajoutés" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2057,7 +2305,7 @@ msgstr "Utiliser \"{path}\" pour configurer s3cmd." #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "Using \"{path}\" for syncing with remote storage." -msgstr "Utiliser \"{path}\" pour configurer s3cmd." +msgstr "Utiliser \"{path}\" pour configurer un stockage distant." #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -2068,13 +2316,15 @@ msgid "Using APK Signature v3" msgstr "Utilisation de la signature d'APK v3" #: ../fdroidserver/common.py -#, fuzzy msgid "Using JAR Signature" -msgstr "Utilisation de la signature d'APK v2" +msgstr "Utilisation de la signature JAR" #: ../fdroidserver/common.py -msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" -msgstr "L'utilisation de l'utilitaire jarsigner de Java n'est pas recommandé pour vérifier les APKs ! Utiliser apksigner" +msgid "" +"Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "" +"L'utilisation de l'utilitaire jarsigner de Java n'est pas recommandé pour " +"vérifier les APKs ! Utiliser apksigner" #: ../fdroidserver/common.py #, python-brace-format @@ -2094,7 +2344,7 @@ msgstr "Utilise le trousseau existant \"{path}\"" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "Using rclone to sync with: {url}" -msgstr "Utiliser s3cmd pour synchroniser avec : {url}" +msgstr "Utiliser rclone pour synchroniser avec : {url}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2118,30 +2368,43 @@ msgid "Verifying index signature:" msgstr "Vérification de la signature d'index :" #: ../fdroidserver/install.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "" +msgstr "Vérifier le paquet {path} avec apksigner." #: ../fdroidserver/deploy.py #, python-brace-format -msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." -msgstr "L’API de VirusTotal ne permet pas d’envoyer des fichiers plus grands que 32Mo, utilisez {url} pour envoyer {path}." +msgid "" +"VirusTotal API key cannot upload files larger than 32MB, use {url} to upload " +"{path}." +msgstr "" +"L’API de VirusTotal ne permet pas d’envoyer des fichiers plus grands que " +"32Mo, utilisez {url} pour envoyer {path}." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Avertir de possibles erreurs dans les métadonnées" #: ../fdroidserver/scanner.py +#, fuzzy msgid "WebAssembly binary file" -msgstr "" +msgstr "Fichier binaire WebAssembly" #: ../fdroidserver/update.py -msgid "When configured for signed indexes, create only unsigned indexes at this stage" -msgstr "Lorsqu'il est configuré pour les index signés, ne créez que des index non signés à ce stade" +msgid "" +"When configured for signed indexes, create only unsigned indexes at this " +"stage" +msgstr "" +"Lorsqu'il est configuré pour les index signés, ne créez que des index non " +"signés à ce stade" #: ../fdroidserver/lint.py -msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." -msgstr "Lors du linting, tout le dépôt yamllint est désactivé par défaut. Cette option force yamllint malgré tout." +msgid "" +"When linting the entire repository yamllint is disabled by default. This " +"option forces yamllint regardless." +msgstr "" +"Lors du linting, tout le dépôt yamllint est désactivé par défaut. Cette " +"option force yamllint malgré tout." #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." @@ -2150,10 +2413,13 @@ msgstr "" #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" msgstr "" +"Souhaitez-vous télécharger et installer F-Droid.apk via adb ? (OUI/non)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" msgstr "" +"Souhaitez-vous télécharger le(s) application(s) depuis f-droid.org ? (OUI/" +"non)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2161,16 +2427,17 @@ msgstr "X.509 'Nom distingué' utilisé lors de la génération des clés" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" -msgstr "Vous pouvez utiliser ANDROID_HOME pour définir le chemin de votre SDK, ex. :" +msgstr "" +"Vous pouvez utiliser ANDROID_HOME pour définir le chemin de votre SDK, ex. :" #: ../fdroidserver/scanner.py msgid "ZIP file archive" msgstr "Archive ZIP" #: ../fdroidserver/install.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "" +msgstr "adb reporte que {serial} est \"{status}\" !" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2198,7 +2465,8 @@ msgstr "option ambiguë : %s (%s ?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "apksigner introuvable ! Impossible de signer ou de vérifier les APK modernes" +msgstr "" +"apksigner introuvable ! Impossible de signer ou de vérifier les APK modernes" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2213,7 +2481,8 @@ msgstr "applicationId du fichier à traiter" #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" -msgstr "ID d'application avec le versionCode optionnel sous la forme APPID[:VERCODE]" +msgstr "" +"ID d'application avec le versionCode optionnel sous la forme APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" @@ -2268,7 +2537,9 @@ msgstr "impossible de fusionner les actions — deux groupes sont nommés %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" -msgstr "impossible de publier la mise à jour, avez-vous affecté la clé de déploiement ?" +msgstr "" +"impossible de publier la mise à jour, avez-vous affecté la clé de " +"déploiement ?" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2312,15 +2583,20 @@ msgstr "impossible de lire '{path}'" #: ../fdroidserver/common.py #, fuzzy msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "impossible d'analyser la spécification srclib (pas de référence spécifiée) : '{}'" +msgstr "" +"impossible d'analyser la spécification srclib (pas de référence spécifiée) : " +"'{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "impossible d'analyser la spécification srclib (pas de référence spécifiée) : '{}'" +msgstr "" +"impossible d'analyser la spécification srclib (pas de référence spécifiée) : " +"'{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "impossible d'analyser la spécification srclib (trop de caractères '@') : '{}'" +msgstr "" +"impossible d'analyser la spécification srclib (trop de caractères '@') : '{}'" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2330,7 +2606,9 @@ msgstr "{path} a été créé" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "la version actuelle est plus récente : ancien vercode={old}, nouveau vercode={new}" +msgstr "" +"la version actuelle est plus récente : ancien vercode={old}, nouveau " +"vercode={new}" #: ../fdroidserver/update.py #, python-brace-format @@ -2339,7 +2617,7 @@ msgstr "suppression : repo/{apkfilename}" #: ../fdroidserver/scanner.py msgid "dependency file without lock" -msgstr "" +msgstr "ficher de dépendance sans fichier lock" #: ../fdroidserver/common.py #, python-brace-format @@ -2406,7 +2684,9 @@ msgstr "virgule flottante" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." -msgstr "forcer les erreurs (par défaut) sur les métadonnées à être des avertissements, ou les ignorer." +msgstr "" +"forcer les erreurs (par défaut) sur les métadonnées à être des " +"avertissements, ou les ignorer." #: ../fdroidserver/common.py msgid "git svn clone failed" @@ -2425,11 +2705,15 @@ msgstr "argument explicite %r ignoré" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v1 doit avoir une signature, utilisez `fdroid signindex` pour la créer !" +msgstr "" +"index-v1 doit avoir une signature, utilisez `fdroid signindex` pour la " +"créer !" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "index-v2 doit avoir une signature, utilisez `fdroid signindex` pour la créer !" +msgstr "" +"index-v2 doit avoir une signature, utilisez `fdroid signindex` pour la " +"créer !" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2462,8 +2746,12 @@ msgstr "valeur de conflict_resolution invalide : %r" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format -msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" -msgstr "chaîne d’option non valide %(option)r : doit commencer par un caractère %(prefix_chars)r" +msgid "" +"invalid option string %(option)r: must start with a character " +"%(prefix_chars)r" +msgstr "" +"chaîne d’option non valide %(option)r : doit commencer par un caractère " +"%(prefix_chars)r" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" @@ -2472,12 +2760,17 @@ msgstr "ipfs_cid introuvable, omission de la génération de CIDv1" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "la recette de la dernière version est plus récente : ancien vercode={old}, nouveau vercode={new}" +msgstr "" +"la recette de la dernière version est plus récente : ancien vercode={old}, " +"nouveau vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format -msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" -msgstr "local_copy_dir ne semble pas se terminer avec \"fdroid\", peut être voulez-vous dire : \"{path}\"" +msgid "" +"local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "" +"local_copy_dir ne semble pas se terminer avec \"fdroid\", peut être voulez-" +"vous dire : \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" @@ -2493,9 +2786,9 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "le miroir «%s» ne se termine pas par «fdroid» !" #: ../fdroidserver/index.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "" +msgstr "miroir configuré deux fois, dans config.yml et {path} !" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2553,7 +2846,9 @@ msgstr "accepte uniquement les chaînes de caractères, listes et tuples" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "option %s : Si vous voulez vraiment installer toutes les applications signées, utilisez --all" +msgstr "" +"option %s : Si vous voulez vraiment installer toutes les applications " +"signées, utilisez --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2642,13 +2937,19 @@ msgstr "signature manquante du fichier binaire de référence" #: ../fdroidserver/signatures.py #, python-brace-format -msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "refuser le téléchargement via une connexion HTTP non sécurisée (utilisez HTTPS ou précisez --no-https-check) : {apkfilename}" +msgid "" +"refuse downloading via insecure HTTP connection (use HTTPS or specify --no-" +"https-check): {apkfilename}" +msgstr "" +"refuser le téléchargement via une connexion HTTP non sécurisée (utilisez " +"HTTPS ou précisez --no-https-check) : {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "repo_icon \"repo/icons/%s\" n'existe pas, génération d'une icône de substitution." +msgstr "" +"repo_icon \"repo/icons/%s\" n'existe pas, génération d'une icône de " +"substitution." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" @@ -2676,11 +2977,17 @@ msgstr "s3cmd synchroniser les index de {path} vers {url} et les supprimer" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" -msgstr "l'analyse du cache est mal formée ! Vous pouvez le nettoyer avec : '{clear}'" +msgstr "" +"l'analyse du cache est mal formée ! Vous pouvez le nettoyer avec : '{clear}'" #: ../fdroidserver/deploy.py -msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +#, fuzzy +msgid "" +"serverwebroot: path does not end with \"fdroid\", perhaps you meant one of " +"these:" msgstr "" +"serverwebroot: le chemin ne se terminer pas avec \"fdroid\", peut être " +"voulez-vous dire :" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2706,11 +3013,15 @@ msgstr "APK signé, soit un chemin de fichier ou une URL HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "passer le déploiement des journaux de compilation complets : le contenu du journal est vide" +msgstr "" +"passer le déploiement des journaux de compilation complets : le contenu du " +"journal est vide" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" -msgstr "passer le déploiement des journaux de compilation complets : non activé dans la configuration" +msgstr "" +"passer le déploiement des journaux de compilation complets : non activé dans " +"la configuration" #: ../fdroidserver/update.py #, python-brace-format @@ -2728,7 +3039,8 @@ msgstr "librairie statique" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "le fichier binaire de référence fourni a autorisé le signataire {signer}" +msgstr "" +"le fichier binaire de référence fourni a autorisé le signataire {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2738,8 +3050,9 @@ msgid "the following arguments are required: %s" msgstr "les arguments suivants sont requis %s" #: ../fdroidserver/install.py +#, fuzzy msgid "true" -msgstr "" +msgstr "vrai" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2780,11 +3093,13 @@ msgstr "utilisation de Apache libcloud pour syncronizer avec {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "virustotal.com limite le nombre de requêtes, en attente avant de réessayer..." +msgstr "" +"virustotal.com limite le nombre de requêtes, en attente avant de réessayer..." #: ../fdroidserver/install.py +#, fuzzy msgid "yes" -msgstr "" +msgstr "oui" #: ../fdroidserver/publish.py #, python-brace-format @@ -2801,12 +3116,16 @@ msgstr "{apkfilename} ({appid}) ne contient pas de métadonnées !" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} a plusieurs fichiers {name}, on dirait que c'est une faille ou exploitation de la clé maître (Master Key) !" +msgstr "" +"{apkfilename} a plusieurs fichiers {name}, on dirait que c'est une faille ou " +"exploitation de la clé maître (Master Key) !" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " -msgstr "Le fichier AndroidManifest.xml de {apkfilename} possède une date incorrecte : " +msgstr "" +"Le fichier AndroidManifest.xml de {apkfilename} possède une date " +"incorrecte : " #: ../fdroidserver/update.py #, python-brace-format @@ -2837,12 +3156,16 @@ msgstr "{appid} n'a pas de {name}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" -msgstr "{appid} : Bibliothèque externe (extlib) {path} inconnue dans la version '{versionName}'" +msgstr "" +"{appid} : Bibliothèque externe (extlib) {path} inconnue dans la version " +"'{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" -msgstr "{appid} : pas de versions spécifiées, s'exécute à partir de l'état présent du code source" +msgstr "" +"{appid} : pas de versions spécifiées, s'exécute à partir de l'état présent " +"du code source" #: ../fdroidserver/lint.py #, python-brace-format @@ -2862,7 +3185,9 @@ msgstr "{build_flag} doit être un entier, valeur trouvée : {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" -msgstr "{build_flag} doit être une liste ou une chaîne de caractères, valeur trouvée : {value}" +msgstr "" +"{build_flag} doit être une liste ou une chaîne de caractères, valeur " +"trouvée : {value}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2872,7 +3197,8 @@ msgstr "{file} est vide ou corrompu !" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "{name} \"{section}/icons/{path}\" n'existe pas ! Vérifiez \"config.yml\"." +msgstr "" +"{name} \"{section}/icons/{path}\" n'existe pas ! Vérifiez \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format @@ -2892,32 +3218,34 @@ msgstr "{path} n’existe pas ! Créez-le en exécutant :" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "{path} a une mauvaise signature de fichier \"{pattern}\", possibilité d'une faille Janus !" +msgstr "" +"{path} a une mauvaise signature de fichier \"{pattern}\", possibilité d'une " +"faille Janus !" #: ../fdroidserver/deploy.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{path} has been flagged by virustotal {count} times:" -msgstr "" +msgstr "{path} a été signalé par virustotal {count} fois :" #: ../fdroidserver/install.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "" +msgstr "{path} a la mauvaise empreinte ({fingerprint}) !" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" +msgstr "{path} n'est pas un dictionnaire \"key: value\", mais un {datatype} !" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not a standard config file!" -msgstr "" +msgstr "{path} n'est pas un fichier de configuration standard !" #: ../fdroidserver/index.py #, python-brace-format msgid "{path} is not list, but a {datatype}!" -msgstr "" +msgstr "{path} n'est pas une liste, mais un {datatype} !" #: ../fdroidserver/common.py #, python-brace-format @@ -2937,7 +3265,8 @@ msgstr "{path} supérieur à 200MB, envoi manuel : {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "{path} : \"{code}\" n'est pas un code de pays ISO_3166-1 alpha-2 valide !" +msgstr "" +"{path} : \"{code}\" n'est pas un code de pays ISO_3166-1 alpha-2 valide !" #: ../fdroidserver/update.py #, python-brace-format From 6671720d68dc8a5cb6e7af5b4d404e6ec1e459ac Mon Sep 17 00:00:00 2001 From: Ldm Public Date: Tue, 3 Dec 2024 10:22:34 +0100 Subject: [PATCH 1824/2116] Translated using Weblate: French (fr) by Ldm Public Currently translated at 95.9% (586 of 611 strings) Translated using Weblate: French (fr) by Ldm Public Currently translated at 95.9% (586 of 611 strings) Translated using Weblate: French (fr) by Ldm Public Currently translated at 95.4% (583 of 611 strings) Translated using Weblate: French (fr) by Ldm Public Currently translated at 95.0% (581 of 611 strings) Co-authored-by: Ldm Public Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index e40098eb..05dbb4f4 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -45,10 +45,9 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-11-26 23:39+0000\n" -"Last-Translator: Lzebulon \n" -"Language-Team: French \n" +"PO-Revision-Date: 2024-11-27 13:22+0000\n" +"Last-Translator: Ldm Public \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -2069,9 +2068,7 @@ msgstr "" #: ../fdroidserver/deploy.py msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" -msgstr "" -"Pour utiliser rclone, rclone_config et awsbucket doivent être configurées " -"dans config.yml !" +msgstr "Pour utiliser rclone, rclone_config et awsbucket doivent être configurés dans config.yml." #: ../fdroidserver/lint.py msgid "URL must start with https:// or http://" @@ -2079,7 +2076,7 @@ msgstr "L'URL doit commencer par https:// ou http://" #: ../fdroidserver/lint.py msgid "URL shorteners should not be used" -msgstr "Les raccourcisseurs d'URL ne devraient pas être utilisés" +msgstr "Les raccourcisseurs d'URL ne doivent pas être utilisés" #: ../fdroidserver/lint.py #, python-brace-format @@ -2617,7 +2614,7 @@ msgstr "suppression : repo/{apkfilename}" #: ../fdroidserver/scanner.py msgid "dependency file without lock" -msgstr "ficher de dépendance sans fichier lock" +msgstr "ficher de dépendance sans verrouillage" #: ../fdroidserver/common.py #, python-brace-format @@ -3235,7 +3232,7 @@ msgstr "{path} a la mauvaise empreinte ({fingerprint}) !" #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "{path} n'est pas un dictionnaire \"key: value\", mais un {datatype} !" +msgstr "{path} n'est pas un dictionnaire \"key: value\" mais un {datatype}." #: ../fdroidserver/common.py #, python-brace-format @@ -3245,7 +3242,7 @@ msgstr "{path} n'est pas un fichier de configuration standard !" #: ../fdroidserver/index.py #, python-brace-format msgid "{path} is not list, but a {datatype}!" -msgstr "{path} n'est pas une liste, mais un {datatype} !" +msgstr "{path} n'est pas une liste mais un {datatype}." #: ../fdroidserver/common.py #, python-brace-format From 067a216f00bbb13a26b8acb2b3b0135b759f46a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=AE=A4=E0=AE=AE=E0=AE=BF=E0=AE=B4=E0=AF=8D=E0=AE=A8?= =?UTF-8?q?=E0=AF=87=E0=AE=B0=E0=AE=AE=E0=AF=8D?= Date: Tue, 3 Dec 2024 10:22:34 +0100 Subject: [PATCH 1825/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Tamil?= =?UTF-8?q?=20(ta)=20by=20=E0=AE=A4=E0=AE=AE=E0=AE=BF=E0=AE=B4=E0=AF=8D?= =?UTF-8?q?=E0=AE=A8=E0=AF=87=E0=AE=B0=E0=AE=AE=E0=AF=8D=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (611 of 611 strings) Translated using Weblate: Tamil (ta) by தமிழ்நேரம் Currently translated at 100.0% (611 of 611 strings) Co-authored-by: தமிழ்நேரம் Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ta/ Translation: F-Droid/F-Droid Server --- locale/ta/LC_MESSAGES/fdroidserver.po | 110 +++++++++++++------------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/locale/ta/LC_MESSAGES/fdroidserver.po b/locale/ta/LC_MESSAGES/fdroidserver.po index 9f65f3dc..4fecbbd8 100644 --- a/locale/ta/LC_MESSAGES/fdroidserver.po +++ b/locale/ta/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-11-26 18:01+0000\n" +"PO-Revision-Date: 2024-12-02 17:00+0000\n" "Last-Translator: தமிழ்நேரம் \n" "Language-Team: Tamil \n" "Language: ta\n" @@ -426,7 +426,7 @@ msgstr "பயன்பாடுகளுக்கான புதுப்ப #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "{appid} க்கான காப்பகத்தை சரிபார்க்கிறது- பயன்பாடுகள்: {Integer}, காப்புபதிப்புகள்: {keep}, காப்பகங்கள்: {arch}" +msgstr "{appid} க்கான காப்பகத்தை சரிபார்க்கிறது- பயன்பாடுகள்: {integer}, காப்புபதிப்புகள்: {keep}, காப்பகங்கள்: {arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -549,7 +549,7 @@ msgstr "கையொப்பமிடுவதற்கான தயாரி #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "CurrentVersionCode {CV} மிகப் பழமையான உருவாக்க நுழைவு {versionCode} ஐ விட குறைவாக உள்ளது" +msgstr "CurrentVersionCode {cv} மிகப் பழமையான உருவாக்க நுழைவு {versionCode} ஐ விட குறைவாக உள்ளது" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" @@ -760,7 +760,7 @@ msgstr "தோல்வியுற்ற நகலெடுப்பதில #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" -msgstr "'{Apkfilename}' க்கான கையொப்பங்களைப் பெறுவதில் தோல்வி: {error}" +msgstr "'{apkfilename}' க்கான கையொப்பங்களைப் பெறுவதில் தோல்வி: {error}" #: ../fdroidserver/update.py #, python-brace-format @@ -803,12 +803,12 @@ msgstr "விண்ணப்பத்தில் கையெழுத்த #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" -msgstr "VM இலிருந்து சேவையக ஐடியை உருவாக்குதல்: {சேவையக ஐடியை உருவாக்குங்கள்}" +msgstr "VM இலிருந்து சேவையக ஐடியை உருவாக்குதல்: {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" -msgstr "'{Apkfilename}' -> '{sigdir}' க்கான கையொப்பங்களைப் பெற்றது" +msgstr "'{apkfilename}' -> '{sigdir}' க்கான கையொப்பங்களைப் பெற்றது" #: ../fdroidserver/update.py #, python-brace-format @@ -873,7 +873,7 @@ msgstr "பல கையொப்ப சான்றிதழ்கள் கி #: ../fdroidserver/metadata.py #, python-brace-format msgid "Found multiple metadata files for {appid}" -msgstr "{Appid க்கு க்கான பல மேனிலை தரவு கோப்புகள் கிடைத்தன" +msgstr "{appid} க்கான பல மேனிலை தரவு கோப்புகள் கிடைத்தன" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." @@ -891,22 +891,22 @@ msgstr "%s இல் கோப்பு அல்லாதது" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" -msgstr "{Url} இல் {apkfilename} காணப்பட்டது" +msgstr "{url} இல் {apkfilename} காணப்பட்டது" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" -msgstr "{கோப்பு பெயர்} இல் {count} சிக்கல்கள் காணப்பட்டன" +msgstr "{filename} இல் {count} சிக்கல்கள் காணப்பட்டன" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" -msgstr "{கோப்பு பெயர்} இல் {count} எச்சரிக்கைகள் கிடைத்தன" +msgstr "{filename} இல் {count} எச்சரிக்கைகள் கிடைத்தன" #: ../fdroidserver/update.py #, python-brace-format msgid "Generated skeleton metadata for {appid}" -msgstr "{Appid க்கு க்காக உருவாக்கப்பட்ட எலும்புக்கூடு மேனிலை தரவு" +msgstr "{appid} க்காக உருவாக்கப்பட்ட எலும்புக்கூடு மேனிலை தரவு" #: ../fdroidserver/common.py #, python-format @@ -957,12 +957,12 @@ msgstr "ஒரு அறிவிலி கண்ணாடி பெரியத #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "இந்த பதிவேற்றம் தோல்வியுற்றால், {url பெறுநர் க்கு கைமுறையாக பதிவேற்ற முயற்சிக்கவும்" +msgstr "இந்த பதிவேற்றம் தோல்வியுற்றால், {url} பெறுநர் க்கு கைமுறையாக பதிவேற்ற முயற்சிக்கவும்" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "'{Field}' இல் '{Metapath}' மெட்டாடேட்டாவில் புறக்கணிக்கப்படுவதால் அது நீக்கப்பட்டது." +msgstr "'{field}' இல் '{metapath}' மெட்டாடேட்டாவில் புறக்கணிக்கப்படுவதால் அது நீக்கப்பட்டது." #: ../fdroidserver/update.py #, python-format @@ -981,7 +981,7 @@ msgstr "மேனிலை தரவு இல்லாமல் தொகுப #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" -msgstr "{Apkfilename க்கு க்கான பழைய கேச் தரவைப் புறக்கணித்தல்" +msgstr "{apkfilename}க்கான பழைய கேச் தரவைப் புறக்கணித்தல்" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" @@ -1029,7 +1029,7 @@ msgstr "%s நிறுவுதல் ..." #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." -msgstr "{Dev} இல் '{apkfilename}' ஐ நிறுவுதல் ..." +msgstr "{dev} இல் '{apkfilename}' ஐ நிறுவுதல் ..." #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" @@ -1042,12 +1042,12 @@ msgstr "தவறான APK" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid AutoUpdateMode: {mode}" -msgstr "தவறான AutoupDateMode: {பயன்முறை}" +msgstr "தவறான AutoupDateMode: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Invalid UpdateCheckMode: {mode}" -msgstr "தவறான புதுப்பிப்பு சோதனை: {பயன்முறை}" +msgstr "தவறான புதுப்பிப்பு சோதனை: {mode}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -1057,7 +1057,7 @@ msgstr "தவறான VERCODEOPERATION: {field}" #: ../fdroidserver/lint.py #, python-brace-format msgid "Invalid VercodeOperation: {invalid_ops}" -msgstr "தவறான VERCODEOPERATION: {INVALID_OPS}" +msgstr "தவறான VERCODEOPERATION: {invalid_ops}" #: ../fdroidserver/common.py #, python-brace-format @@ -1086,7 +1086,7 @@ msgstr "தவறான NDK: கட்டமைப்பில் நுழை #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid redirect to non-HTTPS: {before} -> {after} " -msgstr "Https அல்லாதவர்களுக்கு தவறான திருப்பி விடுங்கள்: {முன்} -> {பிறகு} " +msgstr "Https அல்லாதவர்களுக்கு தவறான திருப்பி விடுங்கள்: {before} -> {after} " #: ../fdroidserver/metadata.py #, python-brace-format @@ -1150,7 +1150,7 @@ msgstr "அறியப்பட்ட பிழைத்திருத்த #: ../fdroidserver/lint.py #, python-brace-format msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "கடைசியாக பயன்படுத்தப்பட்ட கமிட் '{கமிட்}' ஒரு குறிச்சொல்லாகத் தெரிகிறது, ஆனால் புதுப்பிப்பு தொழில்நுட்பம் '{ucm}'" +msgstr "கடைசியாக பயன்படுத்தப்பட்ட கமிட் '{commit}' ஒரு குறிச்சொல்லாகத் தெரிகிறது, ஆனால் புதுப்பிப்பு தொழில்நுட்பம் '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" @@ -1278,7 +1278,7 @@ msgstr "அத்தகைய தொகுப்பு இல்லை: %s" #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" -msgstr "பயன்பாட்டிற்கு அத்தகைய பதிப்பு குறியீடு {பதிப்பு குறியீடு {appid}" +msgstr "பயன்பாட்டிற்கு அத்தகைய பதிப்பு குறியீடு {பதிப்பு குறியீடு {versionCode}" #: ../fdroidserver/checkupdates.py msgid "No tags found" @@ -1303,7 +1303,7 @@ msgstr "செய்ய எதுவும் இல்லை" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "Nothing to do for {appid}." -msgstr "{Appid க்கு க்கு எதுவும் செய்ய முடியாது." +msgstr "{appid}க்கு எதுவும் செய்ய முடியாது." #: ../fdroidserver/init.py msgid "Now set these in config.yml:" @@ -1366,7 +1366,7 @@ msgstr "APK இன் பெயரிடப்பட்ட தாக்கல் #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." -msgstr "சாதொபொகு க்கு சாதொபொகு க்கு வெளியீடு." +msgstr "சாதொபொகு க்கு நிலைவெளிக்கு வெளியீடு." #: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py #: ../fdroidserver/publish.py ../fdroidserver/signindex.py @@ -1381,7 +1381,7 @@ msgstr "திட்டத்தின் ஒட்டுமொத்த உர #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "மெட்டாடேட்டாவிலிருந்து {apkfilename in இல் வெற்று பதிப்பு பெயர்:{version}" +msgstr "மெட்டாடேட்டாவிலிருந்து {apkfilename in இல் வெற்று பதிப்பு பெயர்:{apkfilename}" #: ../fdroidserver/import_subcommand.py #, python-brace-format @@ -1420,7 +1420,7 @@ msgstr "எளிதான நகல்/பேச்டுக்காக ரக #: ../fdroidserver/install.py #, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "உங்கள் இருப்பிடத்தின் அடிப்படையில் தனியுரிமை பயன்முறை இயக்கப்பட்டது ({கன்ட்ரி_கோட்})." +msgstr "உங்கள் இருப்பிடத்தின் அடிப்படையில் தனியுரிமை பயன்முறை இயக்கப்பட்டது ({country_code})." #: ../fdroidserver/scanner.py #, python-format @@ -1465,7 +1465,7 @@ msgstr "இந்த அறிவிலி ரிமோட் களஞ்சி #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing binary transparency log to {url}" -msgstr "பைனரி வெளிப்படைத்தன்மை பதிவை {url பெறுநர் க்கு தள்ளுகிறது" +msgstr "பைனரி வெளிப்படைத்தன்மை பதிவை {url}க்கு தள்ளுகிறது" #: ../fdroidserver/deploy.py msgid "Pushing to remote server failed!" @@ -1474,7 +1474,7 @@ msgstr "தொலை சேவையகத்திற்கு தள்ளு #: ../fdroidserver/deploy.py #, python-brace-format msgid "Pushing to {url}" -msgstr "{Url க்கு க்கு தள்ளுதல்" +msgstr "{url}க்கு தள்ளுதல்" #: ../fdroidserver/__main__.py msgid "Quickly start a new repository" @@ -1487,7 +1487,7 @@ msgstr "அனைத்து மேனிலை தரவு கோப்பு #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" -msgstr "'{Config_file}'" +msgstr "'{config_file}'" #: ../fdroidserver/common.py #, python-brace-format @@ -1554,7 +1554,7 @@ msgstr "அனைத்து மேனிலை தரவு கோப்பு #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" -msgstr "'{Appid}' ஐ மீண்டும் எழுதுதல்" +msgstr "'{appid}' ஐ மீண்டும் எழுதுதல்" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" @@ -1563,7 +1563,7 @@ msgstr "மாற்றப்படாத மாற்றங்களைக் #: ../fdroidserver/nightly.py #, python-brace-format msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" -msgstr "-Debug.apk ஐக் கண்டுபிடிக்க {cibase below க்கு மேல் இயக்கவும். மற்றும் Repo_basedir {repo_basedir} ஐத் தவிர்க்கவும்" +msgstr "-Debug.apk ஐக் கண்டுபிடிக்க {cibase}க்கு மேல் இயக்கவும். மற்றும் Repo_basedir {repo_basedir} ஐத் தவிர்" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1623,7 +1623,7 @@ msgstr "அறியப்படாத இல்லாத வகுப்பு #: ../fdroidserver/common.py #, python-brace-format msgid "Set NDK {release} ({version}) up" -msgstr "NDK {வெளியீடு} ({பதிப்பு}) மேலே அமைக்கவும்" +msgstr "NDK {release} ({version}) மேலே அமைக்கவும்" #: ../fdroidserver/common.py msgid "Set clock to that time using:" @@ -1636,7 +1636,7 @@ msgstr "பழையவை காப்பகப்படுத்தப்ப #: ../fdroidserver/build.py #, python-brace-format msgid "Set open file limit to {integer}" -msgstr "திறந்த கோப்பு வரம்பை {முழு எண்} என அமைக்கவும்" +msgstr "திறந்த கோப்பு வரம்பை {integer} என அமைக்கவும்" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" @@ -1676,7 +1676,7 @@ msgstr "ரெப்போ மிகப் பெரியதாக இருப #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping index generation for {appid}" -msgstr "{Appid க்கு க்கான குறியீட்டு தலைமுறையைத் தவிர்க்கிறது" +msgstr "{appid}க்கான குறியீட்டு தலைமுறையைத் தவிர்க்கிறது" #: ../fdroidserver/update.py #, python-brace-format @@ -1686,7 +1686,7 @@ msgstr "தவறான கையொப்பத்துடன் {apkfilename #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" -msgstr "{Appid}: முடக்கப்பட்டது" +msgstr "{appid}: முடக்கப்பட்டது" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" @@ -1717,7 +1717,7 @@ msgstr "சுருக்கம் '%s' என்பது பயன்பா #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" -msgstr "நீளத்தின் சுருக்கம் {நீளம்} {limit} எழுத்து வரம்புக்கு மேல் உள்ளது" +msgstr "நீளத்தின் சுருக்கம் {length} {limit} எழுத்து வரம்புக்கு மேல் உள்ளது" #: ../fdroidserver/common.py #, python-brace-format @@ -1835,12 +1835,12 @@ msgstr "எதிர்பாராத உரிமக் குறிச்ச #: ../fdroidserver/common.py #, python-brace-format msgid "Unexpected symlink target: {link} -> {target}" -msgstr "எதிர்பாராத சிம்லிங்க் இலக்கு: {இணைப்பு} -> {இலக்கு}" +msgstr "எதிர்பாராத சிம்லிங்க் இலக்கு: {link} -> {target}" #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" -msgstr "{Configname} இல் அறியப்படாத நுழைவு {key}" +msgstr "{configname} இல் அறியப்படாத நுழைவு {key}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" @@ -1850,7 +1850,7 @@ msgstr "அறியப்படாத விதிவிலக்கு கண #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" -msgstr "அறியப்படாத கோப்பு '{கோப்பு பெயர்}'" +msgstr "அறியப்படாத கோப்பு '{filename}'" #: ../fdroidserver/metadata.py #, python-format @@ -1877,7 +1877,7 @@ msgstr "தேவையற்ற பின்தங்கிய இடம்" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" -msgstr "அங்கீகரிக்கப்படாத பயன்பாட்டு புலம் '{fieldName}' '{path}'" +msgstr "அங்கீகரிக்கப்படாத பயன்பாட்டு புலம் '{fieldname}' '{path}'" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1887,7 +1887,7 @@ msgstr "அங்கீகரிக்கப்படாத கட்டமை #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" -msgstr "ரெப்போ கிராஃபிக் நிறுவனத்திற்கு ஆதரிக்கப்படாத கோப்பு வகை \"{நீட்டிப்பு}\"" +msgstr "ரெப்போ கிராஃபிக் நிறுவனத்திற்கு ஆதரிக்கப்படாத கோப்பு வகை \"{extension}\"" #: ../fdroidserver/update.py #, python-brace-format @@ -1935,7 +1935,7 @@ msgstr "UpdateCheckData இல் தவறான முகவரி உள் #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" -msgstr "UpdateCheckData பதிப்பு குறியீட்டை முழு எண் (\\ டி அல்லது [0-9]) உடன் பொருத்த வேண்டும்: {கோடெக்ச்}" +msgstr "UpdateCheckData பதிப்பு குறியீட்டை முழு எண் (\\ டி அல்லது [0-9]) உடன் பொருத்த வேண்டும்: {codeex}" #: ../fdroidserver/lint.py #, python-brace-format @@ -2027,7 +2027,7 @@ msgstr "குடுவை கையொப்பத்தைப் பயன் #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" -msgstr "Using Java's jarsigner, not recommended க்கு verifying APKs! Use apksigner" +msgstr "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" #: ../fdroidserver/common.py #, python-brace-format @@ -2123,12 +2123,12 @@ msgstr "சிப் கோப்பு காப்பகம்" #: ../fdroidserver/install.py #, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "ADB அறிக்கைகள் {தொடர்} என்பது \"{நிலை}\"!" +msgstr "ADB அறிக்கைகள் {serial} என்பது \"{status}\"!" #: ../fdroidserver/nightly.py #, python-brace-format msgid "adding IdentityFile to {path}" -msgstr "{பாதை க்கு க்கு அடையாள கோப்பைச் சேர்ப்பது" +msgstr "{path} க்கு அடையாள கோப்பைச் சேர்ப்பது" #: ../fdroidserver/update.py #, python-brace-format @@ -2282,7 +2282,7 @@ msgstr "உருவாக்கப்பட்டது {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "தற்போதைய பதிப்பு புதியது: பழைய வெர்கோட் = {பழைய}, புதிய வெர்கோட் = {புதிய}" +msgstr "தற்போதைய பதிப்பு புதியது: பழைய வெர்கோட் = {old}, புதிய வெர்கோட் = {new}" #: ../fdroidserver/update.py #, python-brace-format @@ -2424,7 +2424,7 @@ msgstr "IPFS_CID கண்டுபிடிக்கப்படவில்ல #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "அண்மைக் கால உருவாக்க செய்முறை ஒருபோதும் இல்லை: பழைய வெராகோட் = {பழைய}, புதிய வெராக்கோட் = {புதிய}" +msgstr "அண்மைக் கால உருவாக்க செய்முறை ஒருபோதும் இல்லை: பழைய வெராகோட் = {old}, புதிய வெராக்கோட் = {new}" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2458,7 +2458,7 @@ msgstr "பரச்பர வாதங்கள் விருப்பமா #: ../fdroidserver/scanner.py #, python-brace-format msgid "next {name} cache update due in {time}" -msgstr "அடுத்து {name} கேச் புதுப்பிப்பு {நேரம்}" +msgstr "அடுத்து {name} கேச் புதுப்பிப்பு {time}" #: ../fdroidserver/mirror.py #, python-brace-format @@ -2628,7 +2628,7 @@ msgstr "S3CMD ஒத்திசைவு குறியீடுகளை {pat #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" -msgstr "ச்கேனர் கேச் தவறாக உள்ளது! நீங்கள் அதை அழிக்கலாம்: '{தெளிவான}'" +msgstr "ச்கேனர் கேச் தவறாக உள்ளது! நீங்கள் அதை அழிக்கலாம்: '{clear}'" #: ../fdroidserver/deploy.py msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" @@ -2680,7 +2680,7 @@ msgstr "நிலையான நூலகம்" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "வழங்கப்பட்ட குறிப்பு பைனரி கையொப்பத்தை அனுமதித்துள்ளது {கையொப்பமிட்டவர்}" +msgstr "வழங்கப்பட்ட குறிப்பு பைனரி கையொப்பத்தை அனுமதித்துள்ளது {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2753,7 +2753,7 @@ msgstr "{apkfilename} ({appid}) மேனிலை தரவு இல்லை! #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename the பல {name} கோப்புகளைக் கொண்டுள்ளது, முதன்மை விசை சுரண்டல் போல் தெரிகிறது!" +msgstr "{apkfilename the பல {apkfilename} கோப்புகளைக் கொண்டுள்ளது, முதன்மை விசை சுரண்டல் போல் தெரிகிறது!" #: ../fdroidserver/update.py #, python-brace-format @@ -2799,12 +2799,12 @@ msgstr "{appid}: தற்போதைய மூல நிலையில் இ #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" -msgstr "{appid}: {field} ஒரு '{type}' ஆக இருக்க வேண்டும், ஆனால் அது ஒரு '{fieldType}!'" +msgstr "{appid}: {field} ஒரு '{type}' ஆக இருக்க வேண்டும், ஆனால் அது ஒரு '{fieldtype}!'" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" -msgstr "{appid}: {field} ஒரு '{type}' ஆக இருக்க வேண்டும், ஆனால் அது ஒரு '{fieldType}'!" +msgstr "{appid}: {field} ஒரு '{type}' ஆக இருக்க வேண்டும், ஆனால் அது ஒரு '{fieldtype}'!" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2829,7 +2829,7 @@ msgstr "{name} \"{section}/ஐகான்கள்/{path}\" இல்லை! \" #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{OldFile} நீக்கப்பட்டது, {newfile} ஐப் பயன்படுத்தவும்" +msgstr "{oldfile} நீக்கப்பட்டது, {newfile} ஐப் பயன்படுத்தவும்" #: ../fdroidserver/import_subcommand.py #, python-brace-format @@ -2844,7 +2844,7 @@ msgstr "{path} இல்லை! இயங்குவதன் மூலம் #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "{பாதையில்} மோசமான கோப்பு கையொப்பம் \"{pattern}\", சாத்தியமான சானச் சுரண்டல்!" +msgstr "{path} மோசமான கோப்பு கையொப்பம் \"{pattern}\", சாத்தியமான சானச் சுரண்டல்!" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2874,7 +2874,7 @@ msgstr "{path} என்பது பட்டியல் அல்ல, ஆன #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "{path} என்பது {எதிர்பார்க்கப்பட்ட_ வகை அல்ல, ஆனால் ஒரு {datatype}!" +msgstr "{path} என்பது {எதிர்பார்க்கப்பட்ட_ வகை அல்ல, ஆனால் ஒரு {expected_type}!" #: ../fdroidserver/update.py #, python-brace-format From 8658f21282941003e663f56e1954b0effb8a4c00 Mon Sep 17 00:00:00 2001 From: Ecron Date: Tue, 3 Dec 2024 10:22:34 +0100 Subject: [PATCH 1826/2116] Translated using Weblate: Catalan (ca) by Ecron Currently translated at 100.0% (611 of 611 strings) Co-authored-by: Ecron Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ca/ Translation: F-Droid/F-Droid Server --- locale/ca/LC_MESSAGES/fdroidserver.po | 35 ++++++++++++++------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index 51fdea40..29626ee4 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -6,13 +6,14 @@ # Adrià Martín , 2024. # unmes , 2024. # Joan Pujolar , 2024. +# Ecron , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-11-26 15:16+0000\n" -"Last-Translator: Joan Pujolar \n" +"PO-Revision-Date: 2024-11-27 18:26+0000\n" +"Last-Translator: Ecron \n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" @@ -206,7 +207,7 @@ msgstr "'{value}' no és un {field} vàlid; hauria de ser {pattern}" #: ../fdroidserver/checkupdates.py msgid "--merge-request only runs on a single appid!" -msgstr "--merge-request només funciona amb un sol ID d'app!" +msgstr "--merge-request només funciona amb un sol ID d'aplicació!" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -454,7 +455,7 @@ msgstr "Publicar els canvis" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "Sancioneu els canvis, pitgeu i després feu la, sol·licitud de fusió" +msgstr "Sancioneu els canvis, publiqueu-los i després feu una sol·licitud de fusió" #: ../fdroidserver/metadata.py #, python-brace-format @@ -641,7 +642,7 @@ msgstr "No usis les sumes de verificació \"rsync\"" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "Descarregar F-Droid.apk amb els miralls que presenten menys filtracions a la xarxa" +msgstr "Baixeu l'F-Droid.apk amb els miralls que filtren menys dades a la xarxa" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -753,7 +754,7 @@ msgstr "Extreu les signatures dels APKs" #: ../fdroidserver/install.py msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "F-Droid.apk no s'ha pogut descarregar de cap font coneguda!" +msgstr "No s'ha pogut baixar l'F-Droid.apk des de cap font coneguda!" #: ../fdroidserver/update.py #, python-brace-format @@ -1215,7 +1216,7 @@ msgstr "No s'ha trobat cap dispositiu adjunt" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." -msgstr "No s'han trobat dispositius per a `adb install`! Sisplau, connecteu-ne algun." +msgstr "No s'han trobat dispositius per a `adb install`! Connecteu-ne algun." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1423,7 +1424,7 @@ msgstr "Imprimeix la variable secreta al terminal per a copiar/enganxar fàcilme #: ../fdroidserver/install.py #, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "El mode privat s'ha habilitat en base al vostre ({country_code})." +msgstr "El mode privat s'ha habilitat d'acord amb el vostre codi regional ({country_code})." #: ../fdroidserver/scanner.py #, python-format @@ -1548,7 +1549,7 @@ msgstr "Restringeix la sortida a avisos i errors" #: ../fdroidserver/net.py #, python-format msgid "Retrying failed download: %s" -msgstr "Reintent fallit de descàrrega de: %s" +msgstr "S'està tornant a baixar: %s" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1617,7 +1618,7 @@ msgstr[1] "L'escàner ha trobat {} problemes" #: ../fdroidserver/scanner.py msgid "Scanning APK for extra signing blocks." -msgstr "Pentinant L'APK en busca de blocs signants addicionals." +msgstr "S'està escanejant l'APK en cerca de blocs signants addicionals." #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." @@ -2076,7 +2077,7 @@ msgstr "Verificació de la signatura de l'índex:" #: ../fdroidserver/install.py #, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "Verificant la {path} del paquet amb el signador d'apk apksigner." +msgstr "S'està verificant el paquet {path} l'apksigner." #: ../fdroidserver/deploy.py #, python-brace-format @@ -2089,7 +2090,7 @@ msgstr "Avisa de possibles errors a les metadades" #: ../fdroidserver/scanner.py msgid "WebAssembly binary file" -msgstr "Document binari d'AssemblatgeWeb" +msgstr "Fitxer binari WebAssembly" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2105,11 +2106,11 @@ msgstr "Quan signar o verificar falla, sortiu amb un codi d'error." #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "Us va bé de descarregar i instal·lar F-Droid.apk via adb? (SÍ/no)" +msgstr "Voleu baixar i instal·lar l'F-Droid.apk mitjançant adb? (SÍ/no)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "Us va bé de descarregar la/es app/s des de f-droid.org? (SÍ/no)" +msgstr "Voleu baixar les aplicacions des de f-droid.org? (SÍ/no)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2126,7 +2127,7 @@ msgstr "arxiu de fitxers ZIP" #: ../fdroidserver/install.py #, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "adb informa que {serial} està en \"{status}\"!" +msgstr "adb informa que {serial} és: «{status}»!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2694,7 +2695,7 @@ msgstr "els arguments següents són obligatoris: %s" #: ../fdroidserver/install.py msgid "true" -msgstr "ver" +msgstr "vertader" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2857,7 +2858,7 @@ msgstr "{path} ha estat marcat pel virustotal {count} vegades:" #: ../fdroidserver/install.py #, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "{path} no té la ditada correcta ({fingerprint})!" +msgstr "{path} no té l'emprempta correcta ({fingerprint})!" #: ../fdroidserver/common.py #, python-brace-format From 07b83ed101defb69202c0d8901a521d9645113ee Mon Sep 17 00:00:00 2001 From: "Shuuji TAKAHASHI (shuuji3)" Date: Tue, 3 Dec 2024 10:22:34 +0100 Subject: [PATCH 1827/2116] Translated using Weblate: Japanese (ja) by "Shuuji TAKAHASHI (shuuji3)" Currently translated at 100.0% (611 of 611 strings) Co-authored-by: Shuuji TAKAHASHI (shuuji3) Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ja/ Translation: F-Droid/F-Droid Server --- locale/ja/LC_MESSAGES/fdroidserver.po | 53 ++++++++++++++------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 1d420e33..06b20d2f 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -2,20 +2,21 @@ # This file is put in the public domain. # Hinaloe , 2020. # Suguru Hirahara , 2024. +# "Shuuji TAKAHASHI (shuuji3)" , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-09-26 13:16+0000\n" -"Last-Translator: Suguru Hirahara \n" +"PO-Revision-Date: 2024-11-28 08:34+0000\n" +"Last-Translator: \"Shuuji TAKAHASHI (shuuji3)\" \n" "Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.9-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -128,9 +129,9 @@ msgid "%s has bad SHA-256: %s" msgstr "%sのSHA-256は誤っています:%s" #: ../fdroidserver/lint.py -#, fuzzy, python-format +#, python-format msgid "%s is not an accepted build field" -msgstr "%sは承諾されたビルドの欄ではありません" +msgstr "%sは承認されたビルドフィールドではありません" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -201,7 +202,7 @@ msgstr "「{value}」は正しい{field}ではありません。{pattern}とし #: ../fdroidserver/checkupdates.py msgid "--merge-request only runs on a single appid!" -msgstr "" +msgstr "--merge-requestは単一のappidでのみ実行されます!" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -332,11 +333,11 @@ msgstr "UpdateCheckModeが有効になっているAutoUpdateMode:HTTPにパタ #: ../fdroidserver/install.py msgid "Automatic no to all prompts." -msgstr "" +msgstr "すべてのプロンプトに対して自動的にnoを選択します。" #: ../fdroidserver/install.py msgid "Automatic yes to all prompts." -msgstr "" +msgstr "すべてのプロンプトに対して自動的にyesを選択します。" #: ../fdroidserver/index.py #, python-brace-format @@ -431,7 +432,7 @@ msgstr "クリーンアップデート - キャッシュを使用せず、全て #: ../fdroidserver/common.py msgid "Color the log output" -msgstr "" +msgstr "ログ出力に色を付ける" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." @@ -448,7 +449,7 @@ msgstr "変更をcommit" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "" +msgstr "変更をコミット、プッシュしてから、マージリクエストを作成してください" #: ../fdroidserver/metadata.py #, python-brace-format @@ -635,7 +636,7 @@ msgstr "rsyncのチェックサムを使用しない" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "" +msgstr "ネットワークへの情報漏洩が少ないミラーを使用してF-Droid.apkをダウンロードする" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -747,7 +748,7 @@ msgstr "APKから署名を抽出" #: ../fdroidserver/install.py msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "" +msgstr "既知のソースからF-Droid.apkをダウンロードできませんでした!" #: ../fdroidserver/update.py #, python-brace-format @@ -1209,7 +1210,7 @@ msgstr "接続している端末が見つかりません" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." -msgstr "" +msgstr "`adb install`を実行するデバイスが見つかりません!デバイスを接続してください。" #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1417,7 +1418,7 @@ msgstr "簡単にコピー、ペーストできるように秘密の変数をタ #: ../fdroidserver/install.py #, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "" +msgstr "ロケール({country_code})に基づいてプライバシー モードが有効になりました。" #: ../fdroidserver/scanner.py #, python-format @@ -1542,7 +1543,7 @@ msgstr "警告とエラーのみを出力" #: ../fdroidserver/net.py #, python-format msgid "Retrying failed download: %s" -msgstr "" +msgstr "失敗したダウンロードを再試行しています: %s" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1610,7 +1611,7 @@ msgstr[0] "スキャナーは{}個の問題を発見しました" #: ../fdroidserver/scanner.py msgid "Scanning APK for extra signing blocks." -msgstr "" +msgstr "追加の署名ブロックがないかAPKをスキャンしています。" #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." @@ -1871,9 +1872,9 @@ msgid "Unnecessary trailing space" msgstr "不要なスペースが末尾にあります" #: ../fdroidserver/metadata.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Unrecognised app field '{fieldname}' in '{path}'" -msgstr "認識されないアプリの欄「{fieldname}」が「{path}」にあります" +msgstr "「{path}」に未認識のアプリのフィールド「{fieldname}」があります" #: ../fdroidserver/metadata.py #, python-brace-format @@ -2069,7 +2070,7 @@ msgstr "インデックスの署名を検証:" #: ../fdroidserver/install.py #, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "" +msgstr "apksignerを使用してパッケージ{path}を検証しています。" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2082,7 +2083,7 @@ msgstr "潜在的なメタデータのエラーに関して警告" #: ../fdroidserver/scanner.py msgid "WebAssembly binary file" -msgstr "" +msgstr "WebAssemblyバイナリ ファイル" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2098,11 +2099,11 @@ msgstr "署名または検証ができなかった場合、エラーコードを #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "" +msgstr "adb経由でF-Droid.apkをダウンロードしてインストールしますか?(YES/no)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "" +msgstr "f-droid.orgからアプリをダウンロードしますか?(YES/no)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2119,7 +2120,7 @@ msgstr "ZIPファイルアーカイブ" #: ../fdroidserver/install.py #, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "" +msgstr "adbは、{serial}が「{status}」であると報告しています!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2685,7 +2686,7 @@ msgstr "次の引数が必要です:%s" #: ../fdroidserver/install.py msgid "true" -msgstr "" +msgstr "true" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2730,7 +2731,7 @@ msgstr "virustotal.comはレート制限を行っています。再試行を待 #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "yes" #: ../fdroidserver/publish.py #, python-brace-format @@ -2847,7 +2848,7 @@ msgstr "{path}はvirustotalにより{count}回マークされました。" #: ../fdroidserver/install.py #, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "" +msgstr "{path}のフィンガープリント({fingerprint})が間違っています!" #: ../fdroidserver/common.py #, python-brace-format From 4a5d2c44222c2af4aee9200c4e95e68e3c2ac914 Mon Sep 17 00:00:00 2001 From: Eryk Michalak Date: Tue, 3 Dec 2024 10:22:34 +0100 Subject: [PATCH 1828/2116] Translated using Weblate: Polish (pl) by Eryk Michalak Currently translated at 97.3% (595 of 611 strings) Co-authored-by: Eryk Michalak Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ Translation: F-Droid/F-Droid Server --- locale/pl/LC_MESSAGES/fdroidserver.po | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index e4f6292a..cdc28ebc 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -11,15 +11,15 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-10-27 03:53+0000\n" -"Last-Translator: WaldiS \n" +"PO-Revision-Date: 2024-11-28 08:34+0000\n" +"Last-Translator: Eryk Michalak \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.8.2-dev\n" +"X-Generator: Weblate 5.9-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -439,7 +439,7 @@ msgstr "Czysta aktualizacja - nie używa pamięci podręcznych, przetwarzaj pono #: ../fdroidserver/common.py msgid "Color the log output" -msgstr "" +msgstr "Koloruj wpisy w dzienniku zdarzeń" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." @@ -1960,7 +1960,6 @@ msgstr "UpdateCheckMode jest ustawiony, ale wygląda na to, że checkupdates nie #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -#, fuzzy msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" msgstr "UpdateCheckMode jest ustawiony, ale wygląda na to, że checkupdates nie został jeszcze uruchomiony" @@ -2094,7 +2093,7 @@ msgstr "Ostrzegaj o możliwych błędach metadanych" #: ../fdroidserver/scanner.py msgid "WebAssembly binary file" -msgstr "" +msgstr "Plik binarny WebAssembly" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2701,7 +2700,7 @@ msgstr "wymagane są następujące argumenty: %s" #: ../fdroidserver/install.py msgid "true" -msgstr "" +msgstr "prawda" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2746,7 +2745,7 @@ msgstr "virustotal.com jest ograniczenie stawki, czeka na ponowną próbę..." #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "tak" #: ../fdroidserver/publish.py #, python-brace-format From cd25bd6ce724f9e897780189458cd7500a70ce1e Mon Sep 17 00:00:00 2001 From: Reno Tx Date: Tue, 3 Dec 2024 10:22:34 +0100 Subject: [PATCH 1829/2116] Translated using Weblate: Serbian (sr) by Reno Tx Currently translated at 100.0% (611 of 611 strings) Co-authored-by: Reno Tx Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sr/ Translation: F-Droid/F-Droid Server --- locale/sr/LC_MESSAGES/fdroidserver.po | 52 ++++++++++----------------- 1 file changed, 19 insertions(+), 33 deletions(-) diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index 507b485a..483ea9e0 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-11-22 21:03+0000\n" +"PO-Revision-Date: 2024-11-29 10:00+0000\n" "Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" "Language: sr\n" @@ -204,9 +204,8 @@ msgid "'{value}' is not a valid {field}, should be {pattern}" msgstr "'{value}' није важећи {field}, треба да буде {pattern}" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "--merge-request only runs on a single appid!" -msgstr "--спојити-захтев ради само на једном appid!" +msgstr "--merge-request се извршава само на једној апликацији!" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -336,14 +335,12 @@ msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." msgstr "AutoUpdateMode са UpdateCheckMode: HTTP мора имати образац." #: ../fdroidserver/install.py -#, fuzzy msgid "Automatic no to all prompts." -msgstr "Аутоматски нема до свих упита." +msgstr "Аутоматски одговори \"не\" на све упите." #: ../fdroidserver/install.py -#, fuzzy msgid "Automatic yes to all prompts." -msgstr "Аутоматски да до свих упита." +msgstr "Аутоматски одговори \"да\" на све упите." #: ../fdroidserver/index.py #, python-brace-format @@ -439,9 +436,8 @@ msgid "Clean update - don't uses caches, reprocess all APKs" msgstr "Чисто ажурирање – не користите кешеве, поново обрађујте све АПК-ове" #: ../fdroidserver/common.py -#, fuzzy msgid "Color the log output" -msgstr "Обојите лог излаз." +msgstr "Бојење излазних логова" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." @@ -457,9 +453,8 @@ msgid "Commit changes" msgstr "Потврди измене" #: ../fdroidserver/checkupdates.py -#, fuzzy msgid "Commit changes, push, then make a merge request" -msgstr "Унесите промене, пошаљите, а затим уверите се да спојите захтев." +msgstr "Уређивање промена, пуш, затим направите захтев за спајање" #: ../fdroidserver/metadata.py #, python-brace-format @@ -645,9 +640,8 @@ msgid "Don't use rsync checksums" msgstr "Не користите rsync чексуме" #: ../fdroidserver/install.py -#, fuzzy msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "Преузмите F-Droid.apk користећи резервне изворе који мање цуре у мрежу." +msgstr "Преузмите F-Droid.apk користећи огледала која мање цуре у мрежу" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -758,9 +752,8 @@ msgid "Extract signatures from APKs" msgstr "Извуците потписе из АПК-ова" #: ../fdroidserver/install.py -#, fuzzy msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "F-Droid.apk није могао бити преузет из било ког познатог извора!" +msgstr "F-Droid.apk није могао да се преузме са било ког познатог извора!" #: ../fdroidserver/update.py #, python-brace-format @@ -1221,9 +1214,8 @@ msgid "No attached devices found" msgstr "Није пронађен ниједан прикључени уређај" #: ../fdroidserver/install.py -#, fuzzy msgid "No devices found for `adb install`! Please plug one in." -msgstr "Нема уређаја пронађених за `adb install`! Молимо вас да укључите један." +msgstr "Нема пронађених уређаја за `adb install`! Молимо вас, уметните један." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1429,9 +1421,9 @@ msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Штампај тајну променљиву на терминал за лако копирање/налепљивање" #: ../fdroidserver/install.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "Режим приватности је био омогућен на основу ваше локализације ({country_code})." +msgstr "Режим приватности је омогућен на основу ваше локације ({country_code})." #: ../fdroidserver/scanner.py #, python-format @@ -1554,7 +1546,7 @@ msgid "Restrict output to warnings and errors" msgstr "Ограничите излаз на упозорења и грешке" #: ../fdroidserver/net.py -#, fuzzy, python-format +#, python-format msgid "Retrying failed download: %s" msgstr "Поновно покушавање неуспелог преузимања: %s" @@ -1625,9 +1617,8 @@ msgstr[1] "Скенирање је пронашло {} проблема" msgstr[2] "Скенирање је пронашло {} проблема" #: ../fdroidserver/scanner.py -#, fuzzy msgid "Scanning APK for extra signing blocks." -msgstr "Скенирање APK за додатне блокове потписивања." +msgstr "Сkeniranje АПК-а за додатне блокове потписивања." #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." @@ -2084,9 +2075,9 @@ msgid "Verifying index signature:" msgstr "Верификација потписа индекса:" #: ../fdroidserver/install.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "Потврђивање пакета {path} са apksigner-ом." +msgstr "Провера пакета {path} са apksigner." #: ../fdroidserver/deploy.py #, python-brace-format @@ -2098,9 +2089,8 @@ msgid "Warn about possible metadata errors" msgstr "Упозорење о могућим грешкама у метаподацима" #: ../fdroidserver/scanner.py -#, fuzzy msgid "WebAssembly binary file" -msgstr "WebAssembly бинарна датотека." +msgstr "ВебАсембли бинарни фајл" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2115,12 +2105,10 @@ msgid "When signing or verifying fails, exit with an error code." msgstr "Када потписивање или верификација не успеју, излазите са кодом грешке." #: ../fdroidserver/install.py -#, fuzzy msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" msgstr "Да ли желите да преузмете и инсталирате F-Droid.apk преко adb? (ДА/не)" #: ../fdroidserver/install.py -#, fuzzy msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" msgstr "Да ли желите да преузмете апликацију(е) са f-droid.org? (ДА/не)" @@ -2137,9 +2125,9 @@ msgid "ZIP file archive" msgstr "ZIP архивска датотека" #: ../fdroidserver/install.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "adb извештава {serial} је \"{status}\"!" +msgstr "adb пријављује {serial} је \"{status}\"!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2708,7 +2696,6 @@ msgid "the following arguments are required: %s" msgstr "следећи аргументи су обавезни: %s" #: ../fdroidserver/install.py -#, fuzzy msgid "true" msgstr "истина" @@ -2754,7 +2741,6 @@ msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com ограничава брзину, чекање на поновни покушај..." #: ../fdroidserver/install.py -#, fuzzy msgid "yes" msgstr "да" @@ -2873,7 +2859,7 @@ msgid "{path} has been flagged by virustotal {count} times:" msgstr "{path} је означен од стране virustotal {count} пута:" #: ../fdroidserver/install.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" msgstr "{path} има погрешан отисак прста ({fingerprint})!" From 25daaea989123ae8a9a1e44aa4b405fdc274fa14 Mon Sep 17 00:00:00 2001 From: WaldiS Date: Tue, 3 Dec 2024 10:22:34 +0100 Subject: [PATCH 1830/2116] Translated using Weblate: Polish (pl) by WaldiS Currently translated at 99.3% (607 of 611 strings) Co-authored-by: WaldiS Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ Translation: F-Droid/F-Droid Server --- locale/pl/LC_MESSAGES/fdroidserver.po | 28 +++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index cdc28ebc..d19763a6 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -11,8 +11,8 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-11-28 08:34+0000\n" -"Last-Translator: Eryk Michalak \n" +"PO-Revision-Date: 2024-11-30 20:00+0000\n" +"Last-Translator: WaldiS \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" @@ -207,7 +207,7 @@ msgstr "'{value}' nie jest prawidłowym {field}, powinno być {pattern}" #: ../fdroidserver/checkupdates.py msgid "--merge-request only runs on a single appid!" -msgstr "" +msgstr "--merge-request działa tylko na pojedynczym appid!" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -456,7 +456,7 @@ msgstr "Scommituj zmiany" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "" +msgstr "Zatwierdź zmiany, wypchnij, a następnie utwórz żądanie scalenia" #: ../fdroidserver/metadata.py #, python-brace-format @@ -643,7 +643,7 @@ msgstr "Nie używaj sum kontrolnych rsync" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "" +msgstr "Pobierz F-Droid.apk za pomocą serwerów lustrzanych, które wyciekają mniej do sieci" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -755,7 +755,7 @@ msgstr "Wyciągnij podpisy z plików APK" #: ../fdroidserver/install.py msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "" +msgstr "F-Droid.apk nie może być pobrany z żadnego znanego źródła!" #: ../fdroidserver/update.py #, python-brace-format @@ -1218,7 +1218,7 @@ msgstr "Nie znaleziono podłączonych urządzeń" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." -msgstr "" +msgstr "Nie znaleziono urządzeń dla `adb install`! Podłącz jedno urządzenie." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1426,7 +1426,7 @@ msgstr "Wydrukuj tajną zmienną do terminala, aby ułatwić kopiowanie/wklejani #: ../fdroidserver/install.py #, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "" +msgstr "Tryb prywatności został włączony w oparciu o ustawienia regionalne ({country_code})." #: ../fdroidserver/scanner.py #, python-format @@ -1551,7 +1551,7 @@ msgstr "Ogranicz wyjście do ostrzeżeń i błędów" #: ../fdroidserver/net.py #, python-format msgid "Retrying failed download: %s" -msgstr "" +msgstr "Ponowna próba pobrania nie powiodła się: %s" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1621,7 +1621,7 @@ msgstr[2] "Skaner znalazł {} problemy" #: ../fdroidserver/scanner.py msgid "Scanning APK for extra signing blocks." -msgstr "" +msgstr "Skanowanie APK w poszukiwaniu dodatkowych bloków podpisywania." #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." @@ -2080,7 +2080,7 @@ msgstr "Weryfikowanie podpisu indeksu:" #: ../fdroidserver/install.py #, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "" +msgstr "Weryfikacja pakietu {path} za pomocą apksigner." #: ../fdroidserver/deploy.py #, python-brace-format @@ -2109,11 +2109,11 @@ msgstr "Jeśli podpisanie lub weryfikacja nie powiedzie się, zakończ z kodem b #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "" +msgstr "Czy chcesz pobrać i zainstalować F-Droid.apk przez adb? (TAK/NIE)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "" +msgstr "Czy chcesz pobrać aplikacje ze strony f-droid.org? (TAK/NIE)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2864,7 +2864,7 @@ msgstr "{path} została oznaczona przez virustotal {count} razy:" #: ../fdroidserver/install.py #, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "" +msgstr "{path} ma niewłaściwy odcisk palca {fingerprint}!" #: ../fdroidserver/common.py #, python-brace-format From 2d12f8c7313df9bd11a278c8a4cbab1893422c2a Mon Sep 17 00:00:00 2001 From: Golubev Alexander Date: Tue, 3 Dec 2024 10:22:35 +0100 Subject: [PATCH 1831/2116] Translated using Weblate: Russian (ru) by Golubev Alexander Currently translated at 100.0% (611 of 611 strings) Co-authored-by: Golubev Alexander Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translation: F-Droid/F-Droid Server --- locale/ru/LC_MESSAGES/fdroidserver.po | 28 +++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index dea60a10..fb3bc702 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -20,8 +20,8 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-11-26 10:18+0000\n" -"Last-Translator: gfbdrgng \n" +"PO-Revision-Date: 2024-12-02 17:00+0000\n" +"Last-Translator: Golubev Alexander \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" @@ -347,11 +347,11 @@ msgstr "AutoUpdateMode с UpdateCheckMode: HTTP должен иметь шабл #: ../fdroidserver/install.py msgid "Automatic no to all prompts." -msgstr "Автоматическое \"нет\" на все запросы." +msgstr "Автоматически отвечать \"нет\" на все запросы." #: ../fdroidserver/install.py msgid "Automatic yes to all prompts." -msgstr "Автоматическое \"да\" на все запросы." +msgstr "Автоматически отвечать \"да\" на все запросы." #: ../fdroidserver/index.py #, python-brace-format @@ -448,7 +448,7 @@ msgstr "Очистка с обновлением: не использовать #: ../fdroidserver/common.py msgid "Color the log output" -msgstr "Раскрасьте вывод журнала" +msgstr "Раскрашивать сообщения журнала при выводе" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." @@ -461,11 +461,11 @@ msgstr "Команда '%s' не распознана.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" -msgstr "Сохранить изменения (commit)" +msgstr "Зафиксировать изменения (commit)" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "Зафиксируйте изменения, вытолкните, затем сделайте запрос на слияние" +msgstr "Зафиксировать изменения (commit), отправить (push) их в удалённый репозиторий, и затем создать запрос на слияние" #: ../fdroidserver/metadata.py #, python-brace-format @@ -652,7 +652,7 @@ msgstr "Не использовать контрольные суммы rsync" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "Загрузите F-Droid.apk с помощью зеркал, которые меньше просачиваются в сеть" +msgstr "Загружать F-Droid.apk с помощью тех зеркал, из которые в сеть утекает меньше данных" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -1226,7 +1226,7 @@ msgstr "Подключенных устройств не найдено" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." -msgstr "Для `adb install` не найдено ни одного устройства! Пожалуйста, подключите одно." +msgstr "Для `adb install` не найдено ни одного устройства! Пожалуйста, подключите какое-нибудь." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -2117,11 +2117,11 @@ msgstr "При неудачном подписании или проверке #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "Вы хотите скачать и установить F-Droid.apk через adb? (Да/нет)" +msgstr "Вы хотите скачать и установить F-Droid.apk через adb? (ДА/нет)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "Хотите ли вы загрузить приложение(я) с сайта f-droid.org? (ДА/НЕТ)" +msgstr "Хотите ли вы загрузить приложение(я) с сайта f-droid.org? (ДА/нет)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2138,7 +2138,7 @@ msgstr "Архив ZIP" #: ../fdroidserver/install.py #, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "adb сообщает, что {serial} - это \"{status}\"!" +msgstr "adb сообщает, что устройство «{serial}» находится в состоянии «{status}»!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2753,7 +2753,7 @@ msgstr "virustotal.com ограничивает траффик, ждем пов #: ../fdroidserver/install.py msgid "yes" -msgstr "Да" +msgstr "да" #: ../fdroidserver/publish.py #, python-brace-format @@ -2872,7 +2872,7 @@ msgstr "{path} был отмечен virustotal {count} раз:" #: ../fdroidserver/install.py #, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "У {path} неправильный отпечаток пальца ({fingerprint})!" +msgstr "У {path} неправильный отпечаток ({fingerprint})!" #: ../fdroidserver/common.py #, python-brace-format From 66704e1a4c666ec481f5268079458986033ae3a9 Mon Sep 17 00:00:00 2001 From: Licaon Kter Date: Tue, 3 Dec 2024 10:22:35 +0100 Subject: [PATCH 1832/2116] Translated using Weblate: Romanian (ro) by Licaon Kter Currently translated at 95.4% (583 of 611 strings) Co-authored-by: Licaon Kter Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ro/ Translation: F-Droid/F-Droid Server --- locale/ro/LC_MESSAGES/fdroidserver.po | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 9bf372eb..b2df8f67 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -10,15 +10,15 @@ msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-09-10 09:27+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2024-12-02 17:00+0000\n" +"Last-Translator: Licaon Kter \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.9-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -2629,9 +2629,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd sincronizează indexurile {path} cu {url} și șterge" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "s3cmd sincronizează indexurile {path} cu {url} și șterge" +msgstr "s3cmd sincronizează indexurile {path} cu {url} și le șterge pe cele eliminate" #: ../fdroidserver/scanner.py #, python-brace-format @@ -2699,7 +2699,7 @@ msgstr "sunt necesare următoarele argumente: %s" #: ../fdroidserver/install.py msgid "true" -msgstr "" +msgstr "adevărat" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2744,7 +2744,7 @@ msgstr "virustotal.com limitează rata, așteptând o nouă încercare..." #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "da" #: ../fdroidserver/publish.py #, python-brace-format From ba0069aaa268770a5f623ee8eca6b2ffbaa3832a Mon Sep 17 00:00:00 2001 From: VfBFan Date: Tue, 3 Dec 2024 10:22:35 +0100 Subject: [PATCH 1833/2116] Translated using Weblate: German (de) by VfBFan Currently translated at 100.0% (611 of 611 strings) Co-authored-by: VfBFan Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 7657d5eb..14662bc2 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -27,7 +27,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-11-22 21:03+0000\n" +"PO-Revision-Date: 2024-12-03 09:22+0000\n" "Last-Translator: VfBFan \n" "Language-Team: German \n" "Language: de\n" @@ -1546,7 +1546,7 @@ msgstr "Der RepoTrunk-Aktualisierungsmodus ist nur bei git-svn-Paketquellen sinn #: ../fdroidserver/build.py msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Zurücksetzen und ganz neuen Build-Server einrichten, auch wenn der bestehende in Ordnung zu sein scheint." +msgstr "Zurücksetzen und ganz neuen Buildserver einrichten, auch wenn der bestehende in Ordnung zu sein scheint." #: ../fdroidserver/nightly.py #, python-brace-format @@ -2016,7 +2016,7 @@ msgstr "Verwende `fdroid update -c` zum Erstellen." #: ../fdroidserver/build.py msgid "Use build server" -msgstr "Verwende Build-Server" +msgstr "Verwende Buildserver" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" From 56814824ee48f1a694c66d7f2b323ef01e366f9e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 3 Dec 2024 13:58:09 +0100 Subject: [PATCH 1834/2116] new function get_src_tarball_name; deprecates getsrcname Some places in the code that need this, like verify.py, do not have app and build instances, but do have appid and versionCode. And fdroidserver/build.py is going away. --- fdroidserver/build.py | 4 ++-- fdroidserver/common.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 4cae5d26..41df2c1c 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -306,7 +306,7 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): else: ftp.chdir(posixpath.join(homedir, 'unsigned')) apkfile = common.get_release_filename(app, build) - tarball = common.getsrcname(app, build) + tarball = common.get_src_tarball_name(app.id, build.versionCode) try: ftp.get(apkfile, os.path.join(output_dir, apkfile)) if not options.notarball: @@ -619,7 +619,7 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext if not options.notarball: # Build the source tarball right before we build the release... logging.info("Creating source tarball...") - tarname = common.getsrcname(app, build) + tarname = common.get_src_tarball_name(app.id, build.versionCode) tarball = tarfile.open(os.path.join(tmp_dir, tarname), "w:gz") def tarexc(t): diff --git a/fdroidserver/common.py b/fdroidserver/common.py index a6cf2009..0f692111 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1130,8 +1130,8 @@ def get_toolsversion_logname(app, build): return "%s_%s_toolsversion.log" % (app.id, build.versionCode) -def getsrcname(app, build): - return "%s_%s_src.tar.gz" % (app.id, build.versionCode) +def get_src_tarball_name(appid, versionCode): + return f"{appid}_{versionCode}_src.tar.gz" def get_build_dir(app): From 5deb936e86621789ab53eabedb51685fc84dae12 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 3 Dec 2024 14:16:06 +0100 Subject: [PATCH 1835/2116] verify: --clean-up-verified to rm all files except the JSON report --- fdroidserver/common.py | 9 ++++++++- fdroidserver/verify.py | 22 +++++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 0f692111..f600d0d2 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3649,7 +3649,9 @@ def sign_apk(unsigned_path, signed_path, keyalias): os.remove(unsigned_path) -def verify_apks(signed_apk, unsigned_apk, tmp_dir, v1_only=None): +def verify_apks( + signed_apk, unsigned_apk, tmp_dir, v1_only=None, clean_up_verified=False +): """Verify that two apks are the same. One of the inputs is signed, the other is unsigned. The signature metadata @@ -3669,6 +3671,8 @@ def verify_apks(signed_apk, unsigned_apk, tmp_dir, v1_only=None): v1_only True for v1-only signatures, False for v1 and v2 signatures, or None for autodetection + clean_up_verified + Remove any files created here if the verification succeeded. Returns ------- @@ -3705,6 +3709,9 @@ def verify_apks(signed_apk, unsigned_apk, tmp_dir, v1_only=None): if result is not None: error += '\nComparing reference APK to APK with copied signature...\n' + result return error + if clean_up_verified and os.path.exists(tmp_apk): + logging.info(f"...cleaned up {tmp_apk} after successful verification") + os.remove(tmp_apk) logging.info('...successfully verified') return None diff --git a/fdroidserver/verify.py b/fdroidserver/verify.py index 41b46ada..9ed46407 100644 --- a/fdroidserver/verify.py +++ b/fdroidserver/verify.py @@ -157,6 +157,12 @@ def main(): nargs='*', help=_("application ID with optional versionCode in the form APPID[:VERCODE]"), ) + parser.add_argument( + "--clean-up-verified", + action="store_true", + default=False, + help=_("Remove source tarball and any APKs if successfully verified."), + ) parser.add_argument( "--reuse-remote-apk", action="store_true", @@ -224,12 +230,26 @@ def main(): ) from e unsigned_apk = os.path.join(unsigned_dir, apkfilename) - compare_result = common.verify_apks(remote_apk, unsigned_apk, tmp_dir) + compare_result = common.verify_apks( + remote_apk, + unsigned_apk, + tmp_dir, + clean_up_verified=options.clean_up_verified, + ) if options.output_json: write_json_report(url, remote_apk, unsigned_apk, compare_result) if compare_result: raise FDroidException(compare_result) + if options.clean_up_verified: + src_tarball = os.path.join( + unsigned_dir, common.get_src_tarball_name(appid, vercode) + ) + for f in (remote_apk, unsigned_apk, src_tarball): + if os.path.exists(f): + logging.info(f"...cleaned up {f} after successful verification") + os.remove(f) + logging.info("...successfully verified") verified += 1 From b408d56c2baca49cd4e8603d450d06718c08fba7 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 11 Dec 2024 12:51:03 +0100 Subject: [PATCH 1836/2116] update CHANGELOG.md for 2.3.3 --- CHANGELOG.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c27a159..b8bb4c15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ### Removed +## [2.3.3] - 2024-12-11 + +### Added + +* verify: `--clean-up-verified` to delete files used when verifying an APK if + the verification was successful. + +### Fixed + +* Support Python 3.13 in the full test suite. +* Sync translations for: ca de fr ja pl ro ru sr ta +* update: only generate _index.png_ when making _index.html_, allowing the repo + operator to set a different repo icon, e.g. not the QR Code. + ## [2.3.2] - 2024-11-26 ### Fixed @@ -55,7 +69,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) like `countryCode:`. * Repo's categories are now set in the config files. * lint: check syntax of config files. -* publish: ``--error-on-failed` to exit when signing/verifying fails. +* publish: `--error-on-failed` to exit when signing/verifying fails. * scanner: `--refresh` and `refresh_config:` to control triggering a refresh of the rule sets. * Terminal output colorization and `--color` argument to control it. From c631ca714217d03e8455128ada0fd96273aa870f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 11 Dec 2024 12:51:34 +0100 Subject: [PATCH 1837/2116] version 2.3.3 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 422a5962..fd1a8148 100755 --- a/setup.py +++ b/setup.py @@ -70,7 +70,7 @@ with open("README.md", "r") as fh: setup( name='fdroidserver', - version='2.3.2', + version='2.3.3', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From 173e45f248cd6f2a30da8080079d41b36a8c9fb0 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 11 Dec 2024 14:39:22 +0100 Subject: [PATCH 1838/2116] make -C locale update --- locale/ar/LC_MESSAGES/fdroidserver.po | 6 +- locale/az/LC_MESSAGES/fdroidserver.po | 6 +- locale/be/LC_MESSAGES/fdroidserver.po | 6 +- locale/bg/LC_MESSAGES/fdroidserver.po | 6 +- locale/bn/LC_MESSAGES/fdroidserver.po | 6 +- locale/bo/LC_MESSAGES/fdroidserver.po | 6 +- locale/ca/LC_MESSAGES/fdroidserver.po | 6 +- locale/cs/LC_MESSAGES/fdroidserver.po | 6 +- locale/cy/LC_MESSAGES/fdroidserver.po | 6 +- locale/de/LC_MESSAGES/fdroidserver.po | 6 +- locale/el/LC_MESSAGES/fdroidserver.po | 6 +- locale/es/LC_MESSAGES/fdroidserver.po | 6 +- locale/es_AR/LC_MESSAGES/fdroidserver.po | 6 +- locale/es_MX/LC_MESSAGES/fdroidserver.po | 6 +- locale/eu/LC_MESSAGES/fdroidserver.po | 6 +- locale/fa/LC_MESSAGES/fdroidserver.po | 6 +- locale/fdroidserver.pot | 8 +- locale/fi/LC_MESSAGES/fdroidserver.po | 6 +- locale/fr/LC_MESSAGES/fdroidserver.po | 694 ++++++--------------- locale/fy/LC_MESSAGES/fdroidserver.po | 6 +- locale/ga/LC_MESSAGES/fdroidserver.po | 6 +- locale/he/LC_MESSAGES/fdroidserver.po | 6 +- locale/hi/LC_MESSAGES/fdroidserver.po | 6 +- locale/hu/LC_MESSAGES/fdroidserver.po | 6 +- locale/id/LC_MESSAGES/fdroidserver.po | 6 +- locale/it/LC_MESSAGES/fdroidserver.po | 6 +- locale/ja/LC_MESSAGES/fdroidserver.po | 6 +- locale/kab/LC_MESSAGES/fdroidserver.po | 6 +- locale/ko/LC_MESSAGES/fdroidserver.po | 6 +- locale/ml/LC_MESSAGES/fdroidserver.po | 6 +- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 6 +- locale/nl/LC_MESSAGES/fdroidserver.po | 6 +- locale/pl/LC_MESSAGES/fdroidserver.po | 6 +- locale/pt/LC_MESSAGES/fdroidserver.po | 6 +- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 6 +- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 6 +- locale/ro/LC_MESSAGES/fdroidserver.po | 6 +- locale/ru/LC_MESSAGES/fdroidserver.po | 6 +- locale/sk/LC_MESSAGES/fdroidserver.po | 6 +- locale/sq/LC_MESSAGES/fdroidserver.po | 6 +- locale/sr/LC_MESSAGES/fdroidserver.po | 6 +- locale/sv/LC_MESSAGES/fdroidserver.po | 6 +- locale/sw/LC_MESSAGES/fdroidserver.po | 6 +- locale/ta/LC_MESSAGES/fdroidserver.po | 6 +- locale/tr/LC_MESSAGES/fdroidserver.po | 6 +- locale/tzm/LC_MESSAGES/fdroidserver.po | 6 +- locale/ug/LC_MESSAGES/fdroidserver.po | 6 +- locale/uk/LC_MESSAGES/fdroidserver.po | 6 +- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 6 +- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 6 +- 50 files changed, 434 insertions(+), 556 deletions(-) diff --git a/locale/ar/LC_MESSAGES/fdroidserver.po b/locale/ar/LC_MESSAGES/fdroidserver.po index 9ac8ad9e..656a503b 100644 --- a/locale/ar/LC_MESSAGES/fdroidserver.po +++ b/locale/ar/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-09-21 19:31+0000\n" "Last-Translator: Cool Man \n" "Language-Team: Arabic \n" @@ -1503,6 +1503,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/az/LC_MESSAGES/fdroidserver.po b/locale/az/LC_MESSAGES/fdroidserver.po index 6d11e62c..7b85e1a0 100644 --- a/locale/az/LC_MESSAGES/fdroidserver.po +++ b/locale/az/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2023-05-26 19:39+0000\n" "Last-Translator: Mehrab Poladov \n" "Language-Team: Azerbaijani \n" @@ -1498,6 +1498,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/be/LC_MESSAGES/fdroidserver.po b/locale/be/LC_MESSAGES/fdroidserver.po index 10d9e5d7..836a31ba 100644 --- a/locale/be/LC_MESSAGES/fdroidserver.po +++ b/locale/be/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-01-21 00:08+0000\n" "Last-Translator: flac \n" "Language-Team: Belarusian \n" @@ -1503,6 +1503,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/bg/LC_MESSAGES/fdroidserver.po b/locale/bg/LC_MESSAGES/fdroidserver.po index abf96ae9..4643a91f 100644 --- a/locale/bg/LC_MESSAGES/fdroidserver.po +++ b/locale/bg/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-07-19 10:21+0000\n" "Last-Translator: 109247019824 \n" "Language-Team: Bulgarian \n" @@ -1499,6 +1499,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index 49c8a792..75aa2ea1 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2021-02-12 09:48+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali \n" @@ -1498,6 +1498,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index 0e9ffd5c..83a4fc0e 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tibetan \n" @@ -1520,6 +1520,10 @@ msgstr "སྦས་ཁུང་ནས་ {apkfilename}ཀློག་བཞི msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "དམིགས་སྟོན་བྱས་པའི་ཡིག་ཆ་རྣམས་མེད་པ་བཟོ་བཞིན་པ།" diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index 29626ee4..7b8a4347 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-11-27 18:26+0000\n" "Last-Translator: Ecron \n" "Language-Team: Catalan \n" @@ -1512,6 +1512,10 @@ msgstr "S'està llegint {apkfilename} des de la memòria cau" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Actualitza i cau les regles de l'escàner i les signatures de la xarxa" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "S'estan suprimint els fitxers especificats" diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 5e1a6c4b..58346934 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-11-23 18:58+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" @@ -1515,6 +1515,10 @@ msgstr "Čtení {apkfilename} z mezipaměti" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Obnovit a uložit pravidla a podpisy skeneru ze sítě do mezipaměti" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Odebírání určených souborů" diff --git a/locale/cy/LC_MESSAGES/fdroidserver.po b/locale/cy/LC_MESSAGES/fdroidserver.po index 4c59a2ad..b2517cf0 100644 --- a/locale/cy/LC_MESSAGES/fdroidserver.po +++ b/locale/cy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2021-01-16 21:23+0000\n" "Last-Translator: Aled Powell \n" "Language-Team: Welsh \n" @@ -1506,6 +1506,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 14662bc2..3d2228bb 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -26,7 +26,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-12-03 09:22+0000\n" "Last-Translator: VfBFan \n" "Language-Team: German \n" @@ -1527,6 +1527,10 @@ msgstr "Lese {apkfilename} aus dem Cache" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Aktualisieren und Zwischenspeichern von Scannerregeln und Signaturen aus dem Netzwerk" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Entferne angegebene Dateien" diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index 49563fe2..2da2ac11 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-05-10 13:24+0000\n" "Last-Translator: ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ \n" "Language-Team: Greek \n" @@ -1505,6 +1505,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 050b07e7..139f6dc3 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-11-21 23:18+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" @@ -1518,6 +1518,10 @@ msgstr "Leyendo {apkfilename} desde caché" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Actualización y almacenamiento en caché de las reglas y firmas del escáner desde la red" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Removiendo archivos especificados" diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index af0caf5d..24ba7106 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2021-04-10 21:26+0000\n" "Last-Translator: Germe the fur star \n" "Language-Team: Spanish (Argentina) \n" @@ -1515,6 +1515,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/es_MX/LC_MESSAGES/fdroidserver.po b/locale/es_MX/LC_MESSAGES/fdroidserver.po index 76367cd9..948b0415 100644 --- a/locale/es_MX/LC_MESSAGES/fdroidserver.po +++ b/locale/es_MX/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2020-04-29 12:49+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Spanish (Mexico) \n" @@ -1503,6 +1503,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/eu/LC_MESSAGES/fdroidserver.po b/locale/eu/LC_MESSAGES/fdroidserver.po index 9ab49eaa..5652184b 100644 --- a/locale/eu/LC_MESSAGES/fdroidserver.po +++ b/locale/eu/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -1497,6 +1497,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index 32be14bf..c78ccec1 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-11-26 15:16+0000\n" "Last-Translator: Danial Behzadi \n" "Language-Team: Persian \n" @@ -1501,6 +1501,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "برداشتن پرونده‌های مشخّص" diff --git a/locale/fdroidserver.pot b/locale/fdroidserver.pot index f0177970..745ad5cb 100644 --- a/locale/fdroidserver.pot +++ b/locale/fdroidserver.pot @@ -5,9 +5,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: fdroidserver 2.3.0-3-g4ba7b5c9\n" +"Project-Id-Version: fdroidserver 2.3.3\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1499,6 +1499,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index d24e023d..a8ac6ddf 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2021-08-23 01:29+0000\n" "Last-Translator: Kaantaja \n" "Language-Team: Finnish \n" @@ -1499,6 +1499,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 05dbb4f4..34f3b19a 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -44,7 +44,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-11-27 13:22+0000\n" "Last-Translator: Ldm Public \n" "Language-Team: French \n" @@ -105,8 +105,7 @@ msgstr "\"{path}\" existe mais s3cmd n'est pas installé !" #: ../fdroidserver/lint.py #, python-brace-format msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" -msgstr "" -"Le format du ficher \"{path}\" n'est pas supporté (utiliser : metadata/*.yml)" +msgstr "Le format du ficher \"{path}\" n'est pas supporté (utiliser : metadata/*.yml)" #: ../fdroidserver/update.py #, python-brace-format @@ -216,12 +215,8 @@ msgstr "'{aapt}' est obsolète, fdroid requiert build-tools-{version} ou plus !" #: ../fdroidserver/common.py #, python-brace-format -msgid "" -"'{field}' will be in random order! Use () or [] brackets if order is " -"important!" -msgstr "" -"'{field}' sera ordonné aléatoirement ! Utilisez des parenthèses () ou des " -"crochets [] si l'ordre est important !" +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgstr "'{field}' sera ordonné aléatoirement ! Utilisez des parenthèses () ou des crochets [] si l'ordre est important !" #: ../fdroidserver/common.py #, python-brace-format @@ -231,15 +226,12 @@ msgstr "'{path}' n'a pas pu être exécuté !" #: ../fdroidserver/metadata.py #, python-brace-format msgid "'{path}' has invalid format, it should be a dictionary!" -msgstr "" -"Le format de '{path}' est incorrect, il devrait s'agir d’un dictionnaire !" +msgstr "Le format de '{path}' est incorrect, il devrait s'agir d’un dictionnaire !" #: ../fdroidserver/metadata.py ../fdroidserver/lint.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" -msgstr "" -"'{value}' n'est pas un(e) {field} valide dans {appid}. Motif regex : " -"{pattern}" +msgstr "'{value}' n'est pas un(e) {field} valide dans {appid}. Motif regex : {pattern}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -284,9 +276,7 @@ msgstr "Ajout d'une clé de signature de dépôt à un dépôt non signé" #: ../fdroidserver/update.py msgid "Add skeleton metadata files for APKs that are missing them" -msgstr "" -"Créer les métadonnées de base manquantes pour les APKs qui n'en sont pas " -"pourvus" +msgstr "Créer les métadonnées de base manquantes pour les APKs qui n'en sont pas pourvus" #: ../fdroidserver/update.py #, python-brace-format @@ -299,17 +289,11 @@ msgstr "Alias de la clé de signature du dépôt dans le trousseau" #: ../fdroidserver/build.py msgid "AllowedAPKSigningKeys missing but reference binary supplied" -msgstr "" -"AllowedAPKSigningKeys est manquante mais des références binaires sont " -"indiquées" +msgstr "AllowedAPKSigningKeys est manquante mais des références binaires sont indiquées" #: ../fdroidserver/import_subcommand.py -msgid "" -"Allows a different revision (or git branch) to be specified for the initial " -"import" -msgstr "" -"Autoriser une version différente (ou branche git) a être spécifiée pour " -"l'import initial" +msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgstr "Autoriser une version différente (ou branche git) a être spécifiée pour l'import initial" #: ../fdroidserver/mirror.py msgid "Also mirror the full archive section" @@ -317,8 +301,7 @@ msgstr "Faire aussi un miroir de la section d'archive complète" #: ../fdroidserver/lint.py msgid "Also warn about formatting issues, like rewritemeta -l" -msgstr "" -"Alerter aussi à propos des problèmes de formatage, comme rewritemeta -l" +msgstr "Alerter aussi à propos des problèmes de formatage, comme rewritemeta -l" #: ../fdroidserver/scanner.py msgid "Android AAR library" @@ -353,28 +336,16 @@ msgid "Android SDK tool {cmd} not found!" msgstr "L'outil SDK Android {cmd} n'a pas été trouvé !" #: ../fdroidserver/lint.py -msgid "" -"App has Binaries but does not have corresponding AllowedAPKSigningKeys to " -"pin certificate." -msgstr "" -"L’application possède des fichiers binaires mais n'a pas les " -"AllowedAPKSigningKeys correspondantes pour épingler le certificat." +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "L’application possède des fichiers binaires mais n'a pas les AllowedAPKSigningKeys correspondantes pour épingler le certificat." #: ../fdroidserver/lint.py -msgid "" -"App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or " -"UpdateCheckMode are not None" -msgstr "" -"L'application a NoSourceSince ou ArchivePolicy « 0 version » mais " -"AutoUpdateMode ou UpdateCheckMode ne valent pas None" +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "L'application a NoSourceSince ou ArchivePolicy « 0 version » mais AutoUpdateMode ou UpdateCheckMode ne valent pas None" #: ../fdroidserver/lint.py -msgid "" -"App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but " -"AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" -"L'application a NoSourceSince ou ArchivePolicy à « 0 version » mais " -"AutoUpdateMode ou UpdateCheckMode ne valent pas None" +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "L'application a NoSourceSince ou ArchivePolicy à « 0 version » mais AutoUpdateMode ou UpdateCheckMode ne valent pas None" #: ../fdroidserver/lint.py #, python-brace-format @@ -382,12 +353,8 @@ msgid "App is in '{repo}' but has a link to {url}" msgstr "L'application est dans '{repo}' mais a un lien vers {url}" #: ../fdroidserver/lint.py -msgid "" -"App version has binary but does not have corresponding AllowedAPKSigningKeys " -"to pin certificate." -msgstr "" -"Des versions de l’application possède des fichiers binaires mais n'ont pas " -"les AllowedAPKSigningKeys correspondantes pour épingler le certificat." +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "Des versions de l’application possède des fichiers binaires mais n'ont pas les AllowedAPKSigningKeys correspondantes pour épingler le certificat." #: ../fdroidserver/lint.py msgid "Appending .git is not necessary" @@ -413,24 +380,17 @@ msgstr "Répondre automatiquement Oui à toutes les demandes." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "" -"Mauvais type d'entrée \"{mirrortype}\" dans le paramétrage des miroirs : " -"{mirror}" +msgstr "Mauvais type d'entrée \"{mirrortype}\" dans le paramétrage des miroirs : {mirror}" #: ../fdroidserver/mirror.py -msgid "" -"Base URL to mirror, can include the index signing key using the query " -"string: ?fingerprint=" -msgstr "" -"URL de base à mirorer, peut inclure la clef de signature d'index à l'aide de " -"la chaîne de requête : ?fingerprint=" +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgstr "URL de base à mirorer, peut inclure la clef de signature d'index à l'aide de la chaîne de requête : ?fingerprint=" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "" -"Branche « {branch} » utilisée comme commit dans le build « {versionName} »" +msgstr "Branche « {branch} » utilisée comme commit dans le build « {versionName} »" #: ../fdroidserver/lint.py #, python-brace-format @@ -452,14 +412,11 @@ msgstr "Compiler toutes les applications disponibles" #: ../fdroidserver/lint.py msgid "Build generated by `fdroid import` - remove disable line once ready" -msgstr "" -"Build généré par `fdroid import` — supprimer la ligne désactivée une fois " -"prêt" +msgstr "Build généré par `fdroid import` — supprimer la ligne désactivée une fois prêt" #: ../fdroidserver/checkupdates.py msgid "Build metadata git repo has uncommited changes!" -msgstr "" -"Le dépôt git des métadonnées de build a des changements non sauvegardés !" +msgstr "Le dépôt git des métadonnées de build a des changements non sauvegardés !" #: ../fdroidserver/build.py msgid "Build only the latest version of each package" @@ -472,9 +429,7 @@ msgstr "Dépôt du build basé sur \"%s\" avec cette config :" #: ../fdroidserver/checkupdates.py msgid "Can't auto-update app with no CurrentVersionCode" -msgstr "" -"Impossible de mettre à jour l'application automatiquement sans " -"\"CurrentVersionCode\"" +msgstr "Impossible de mettre à jour l'application automatiquement sans \"CurrentVersionCode\"" #: ../fdroidserver/build.py msgid "Can't build due to {} error while scanning" @@ -499,9 +454,7 @@ msgstr "Catégories non définies" #: ../fdroidserver/index.py #, python-brace-format msgid "Category \"{category}\" defined but not used for any apps!" -msgstr "" -"La catégorie « {category} » est définie mais n'est utilisée par aucune " -"application !" +msgstr "La catégorie « {category} » est définie mais n'est utilisée par aucune application !" #: ../fdroidserver/__main__.py msgid "Check for updates to applications" @@ -509,17 +462,12 @@ msgstr "Vérifier les mises à jour pour les applications" #: ../fdroidserver/update.py #, python-brace-format -msgid "" -"Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, " -"archapks:{arch}" -msgstr "" -"Vérification de l'archivage pour {appid} — apks : {integer}, keepversions : " -"{keep}, archapks : {arch}" +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "Vérification de l'archivage pour {appid} — apks : {integer}, keepversions : {keep}, archapks : {arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" -msgstr "" -"Mise à jour propre — n'utilise pas les caches, traite à nouveau tous les APKs" +msgstr "Mise à jour propre — n'utilise pas les caches, traite à nouveau tous les APKs" #: ../fdroidserver/common.py msgid "Color the log output" @@ -540,31 +488,21 @@ msgstr "Sauvegarder les changements (commit)" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "" -"Sauvegarder les changements, les pousser sur le dépôt et faire une demande " -"d'intégration" +msgstr "Sauvegarder les changements, les pousser sur le dépôt et faire une demande d'intégration" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Conflicting \"{field}\" definitions between .yml and localized files:" -msgstr "" -"Conflit des définitions « {field} » entre les fichiers .yml et ceux " -"traduits :" +msgstr "Conflit des définitions « {field} » entre les fichiers .yml et ceux traduits :" #: ../fdroidserver/__main__.py -msgid "" -"Conflicting arguments: '--verbose' and '--quiet' can not be specified at the " -"same time." -msgstr "" -"Conflit d'arguments : '--verbose' et '--quiet' ne peuvent être choisis en " -"même temps." +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgstr "Conflit d'arguments : '--verbose' et '--quiet' ne peuvent être choisis en même temps." #: ../fdroidserver/common.py #, python-brace-format msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" -"Conflit de fichiers de configuration ! Utilisation de {newfile}, ignorant " -"{oldfile} !" +msgstr "Conflit de fichiers de configuration ! Utilisation de {newfile}, ignorant {oldfile} !" #: ../fdroidserver/common.py #, python-brace-format @@ -608,8 +546,7 @@ msgstr "Impossible de trouver l'ID du paquet" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" -msgstr "" -"Je refuse de remplacer la configuration existante des clés de signature !" +msgstr "Je refuse de remplacer la configuration existante des clés de signature !" #: ../fdroidserver/deploy.py #, python-brace-format @@ -649,9 +586,7 @@ msgstr "Création d'un index non signé pour préparer la signature" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "" -"Le code de la version actuel {cv} est moins récent que la dernier build " -"{versionCode}" +msgstr "Le code de la version actuel {cv} est moins récent que la dernier build {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" @@ -664,16 +599,12 @@ msgstr "Supprimer les APK et/ou OBB sans métadonnées dans le dépôt" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "" -"Suppression de l'archive en cours, le dépôt occupe trop de place ({size} max " -"{limit})" +msgstr "Suppression de l'archive en cours, le dépôt occupe trop de place ({size} max {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "" -"Suppression de l'historique de git-mirror, car le dépôt occupe trop de place " -"({size} max {limit})" +msgstr "Suppression de l'historique de git-mirror, car le dépôt occupe trop de place ({size} max {limit})" #: ../fdroidserver/update.py #, python-brace-format @@ -692,16 +623,12 @@ msgstr "Ligne dupliquée dans la description" #: ../fdroidserver/lint.py #, python-format msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" -"La description contient une liste (%s) mais ce n'est ni une liste à puces " -"(*) ni une liste numérotée (#)" +msgstr "La description contient une liste (%s) mais ce n'est ni une liste à puces (*) ni une liste numérotée (#)" #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" -msgstr "" -"La longueur de la description {length} dépasser la limite du nombre de " -"caractères autorisés {limit}" +msgstr "La longueur de la description {length} dépasser la limite du nombre de caractères autorisés {limit}" #: ../fdroidserver/common.py #, python-brace-format @@ -739,12 +666,8 @@ msgid "Don't create a source tarball, useful when testing a build" msgstr "Ne pas créer un tarball avec les sources, utile pour tester un build" #: ../fdroidserver/build.py -msgid "" -"Don't refresh the repository, useful when testing a build with no internet " -"connection" -msgstr "" -"Ne pas rafraîchir le dépôt, utile pour tester un build sans connexion " -"internet" +msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgstr "Ne pas rafraîchir le dépôt, utile pour tester un build sans connexion internet" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py msgid "Don't use rsync checksums" @@ -752,8 +675,7 @@ msgstr "Ne pas utiliser les sommes de contrôle rsync" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "" -"Téléchager F-Droid.apk en utilisant des miroirs avec moins de fuites réseaux" +msgstr "Téléchager F-Droid.apk en utilisant des miroirs avec moins de fuites réseaux" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -766,8 +688,7 @@ msgstr "Téléchargement de %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." -msgstr "" -"Le téléchargement du référentiel a déjà échoué une fois, ne pas réessayer." +msgstr "Le téléchargement du référentiel a déjà échoué une fois, ne pas réessayer." #: ../fdroidserver/verify.py #, python-brace-format @@ -796,17 +717,14 @@ msgstr "ERREUR : %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" -msgstr "" -"ERREUR : La sous-commande \"server\" a été supprimée, utilisez plutôt " -"\"deploy\" !" +msgstr "ERREUR : La sous-commande \"server\" a été supprimée, utilisez plutôt \"deploy\" !" #: ../fdroidserver/mirror.py msgid "" "ERROR: this command should never be used to mirror f-droid.org!\n" "A full mirror of f-droid.org requires more than 200GB." msgstr "" -"ERREUR : cette commande ne devrait jamais être utilisée pour copier f-droid." -"org !\n" +"ERREUR : cette commande ne devrait jamais être utilisée pour copier f-droid.org !\n" "Une copie de f-droid.org occupe plus de 200GB." #: ../fdroidserver/nightly.py @@ -816,9 +734,7 @@ msgstr "ERREUR : type de CI non supporté, les corrections sont bienvenues !" #: ../fdroidserver/nightly.py #, python-format msgid "ERROR: unsupported git host \"%s\", patches welcome!" -msgstr "" -"ERREUR : hébergeur git « %s » non supporté, les corrections sont les " -"bienvenues !" +msgstr "ERREUR : hébergeur git « %s » non supporté, les corrections sont les bienvenues !" #: ../fdroidserver/lint.py #, python-brace-format @@ -828,18 +744,12 @@ msgstr "ERREUR : {key} dans {path} n'est pas \"archive\" ou \"repo\"." #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" -msgstr "" -"ERREUR : {key} :{subkey} dans {path} n'est pas une clé valide parmi : " -"{allowed_keys}." +msgstr "ERREUR : {key} :{subkey} dans {path} n'est pas une clé valide parmi : {allowed_keys}." #: ../fdroidserver/__main__.py #, python-brace-format -msgid "" -"Encoding is set to '{enc}' fdroid might run into encoding issues. Please set " -"it to 'UTF-8' for best results." -msgstr "" -"L'encodage est mis sur '{enc}', FDroid peut rencontrer des problèmes " -"d'encodage. Merci de le mettre sur 'UTF-8' pour de meilleurs résultats." +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "L'encodage est mis sur '{enc}', FDroid peut rencontrer des problèmes d'encodage. Merci de le mettre sur 'UTF-8' pour de meilleurs résultats." #: ../fdroidserver/init.py #, python-format @@ -856,12 +766,8 @@ msgid "Environment variable {var} from {configname} is not set!" msgstr "La variable d'environnent {var} de {configname} n'est pas configurée !" #: ../fdroidserver/deploy.py -msgid "" -"Error deploying 'github_releases', {} not present. (You might need to run " -"`fdroid update` first.)" -msgstr "" -"Erreur lors du déploiement 'github_releases' : {} est absent (vous devriez " -"peut-être d'abord lancer `fdroid update`)." +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "Erreur lors du déploiement 'github_releases' : {} est absent (vous devriez peut-être d'abord lancer `fdroid update`)." #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -869,8 +775,7 @@ msgstr "Erreur lors de l'obtention de l'adresse du dépôt" #: ../fdroidserver/scanner.py msgid "Exit with a non-zero code if problems were found" -msgstr "" -"Quitter avec un code différent de zéro si des problèmes ont été détectés" +msgstr "Quitter avec un code différent de zéro si des problèmes ont été détectés" #: ../fdroidserver/__main__.py msgid "Extract application metadata from a source repository" @@ -892,8 +797,7 @@ msgstr "Erreur durant la copie de {path} : {error}" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" -msgstr "" -"Erreur lors de l'extraction des signatures pour '{apkfilename}' : {error}" +msgstr "Erreur lors de l'extraction des signatures pour '{apkfilename}' : {error}" #: ../fdroidserver/update.py #, python-brace-format @@ -918,8 +822,7 @@ msgstr "Impossible d'obtenir les informations de l'APK, suppression {path}" #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" -msgstr "" -"Échoument lors de la récupération des informations de l'APK, saut de {path}" +msgstr "Échoument lors de la récupération des informations de l'APK, saut de {path}" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" @@ -937,9 +840,7 @@ msgstr "Erreur lors de la signature de l'application" #: ../fdroidserver/build.py #, python-brace-format msgid "Fetched buildserverid from VM: {buildserverid}" -msgstr "" -"Récupération de l'ID du serveur de construction depuis la VM : " -"{buildserverid}" +msgstr "Récupération de l'ID du serveur de construction depuis la VM : {buildserverid}" #: ../fdroidserver/signatures.py #, python-brace-format @@ -959,27 +860,20 @@ msgstr "Terminé" #: ../fdroidserver/lint.py msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" -"Les informations de dons via Flattr doivent être renseignées dans le champ " -"FlattrID:" +msgstr "Les informations de dons via Flattr doivent être renseignées dans le champ FlattrID:" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Balises HTML interdites" #: ../fdroidserver/build.py -msgid "" -"Force build of disabled apps, and carries on regardless of scan problems. " -"Only allowed in test mode." -msgstr "" -"Forcer la construction des application désactiver, et opérateur " -"indépendament au scan des problèmes. Seulement autoriser en mode de test." +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgstr "Forcer la construction des application désactiver, et opérateur indépendament au scan des problèmes. Seulement autoriser en mode de test." #: ../fdroidserver/build.py #, python-brace-format msgid "Force halting build after {0} sec timeout!" -msgstr "" -"Arrêt forcer de la construction après {0} secondes de délai d'attente !" +msgstr "Arrêt forcer de la construction après {0} secondes de délai d'attente !" #: ../fdroidserver/scanner.py msgid "Force scan of disabled apps and builds." @@ -988,8 +882,7 @@ msgstr "Forcer le scan d'applications et versions désactivées." #: ../fdroidserver/update.py #, python-brace-format msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" -msgstr "" -"« {path} » graphique trouvée sans métadonnées pour l'application « {name} » !" +msgstr "« {path} » graphique trouvée sans métadonnées pour l'application « {name} » !" #: ../fdroidserver/update.py #, python-brace-format @@ -1022,8 +915,7 @@ msgstr "De multiples fichiers de métadonnées ont été trouvés pour {appid}" #: ../fdroidserver/index.py msgid "Found multiple signing certificates for repository." -msgstr "" -"Plusieurs certificats de signature ont étés trouvés pour le référentiel." +msgstr "Plusieurs certificats de signature ont étés trouvés pour le référentiel." #: ../fdroidserver/index.py msgid "Found no signing certificates for repository." @@ -1099,20 +991,17 @@ msgstr "HTTPS doit être utilisé avec les URL de Subversion !" #: ../fdroidserver/deploy.py msgid "If a git mirror gets to big, allow the archive to be deleted" -msgstr "" -"Si un miroir git prend trop de place, permet à l'archive d'être supprimé" +msgstr "Si un miroir git prend trop de place, permet à l'archive d'être supprimé" #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "" -"Si ce téléversement échoue, tente de le téléverser manuellement vers {url}" +msgstr "Si ce téléversement échoue, tente de le téléverser manuellement vers {url}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." -msgstr "" -"Ignore '{field}' dans les métadonnées '{metapath}' parce que c'est déprécié." +msgstr "Ignore '{field}' dans les métadonnées '{metapath}' parce que c'est déprécié." #: ../fdroidserver/update.py #, python-format @@ -1251,8 +1140,7 @@ msgstr "Métadonnée de scrlib invalide : '{file}' ne peut être analysé" #: ../fdroidserver/metadata.py #, python-brace-format msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" -msgstr "" -"Métadonnée de scrlib invalide : la clé '{key}' est inconnue dans '{file}'" +msgstr "Métadonnée de scrlib invalide : la clé '{key}' est inconnue dans '{file}'" #: ../fdroidserver/common.py #, python-brace-format @@ -1271,20 +1159,15 @@ msgstr "Fichier Java JAR" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py msgid "Java JDK not found! Install in standard location or set java_paths!" -msgstr "" -"Java JDK introuvable ! Installez dans un emplacement standard ou définissez " -"java_paths !" +msgstr "Java JDK introuvable ! Installez dans un emplacement standard ou définissez java_paths !" #: ../fdroidserver/scanner.py msgid "Java compiled class" msgstr "Classe Java compilée" #: ../fdroidserver/signindex.py -msgid "" -"Java jarsigner not found! Install in standard location or set java_paths!" -msgstr "" -"Java jarsigner introuvable ! Installez dans un emplacement standard ou " -"définissez java_paths !" +msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "Java jarsigner introuvable ! Installez dans un emplacement standard ou définissez java_paths !" #: ../fdroidserver/lint.py msgid "Javascript in HTML src attributes" @@ -1305,11 +1188,8 @@ msgstr "La clé de débogage connue est utilisé dans AllowedAPKSigningKeys : " #: ../fdroidserver/lint.py #, python-brace-format -msgid "" -"Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" -msgstr "" -"Le dernier commit utilisé '{commit}' ressemble a une balise, mais le " -"UpdateCheckMode est '{ucm}'" +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "Le dernier commit utilisé '{commit}' ressemble a une balise, mais le UpdateCheckMode est '{ucm}'" #: ../fdroidserver/lint.py msgid "Liberapay donation methods belong in the Liberapay: field" @@ -1350,14 +1230,11 @@ msgstr "Répertoire de destination manquant" #: ../fdroidserver/metadata.py msgid "Moving Anti-Features declarations to localized files:" -msgstr "" -"Déplacement des déclarations des antifonctions vers les fichiers de " -"traduction :" +msgstr "Déplacement des déclarations des antifonctions vers les fichiers de traduction :" #: ../fdroidserver/index.py msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" -msgstr "" -"Ni « repo_pubkey », ni « keystorepass » ne sont définis dans config.yml" +msgstr "Ni « repo_pubkey », ni « keystorepass » ne sont définis dans config.yml" #: ../fdroidserver/verify.py #, python-format @@ -1399,9 +1276,7 @@ msgstr "Aucune étiquette correspondante n’a été trouvée" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "" -"Aucune version minimale du SDK trouvée dans {0}, utilisation de la valeur " -"par défaut (3)." +msgstr "Aucune version minimale du SDK trouvée dans {0}, utilisation de la valeur par défaut (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1413,9 +1288,7 @@ msgstr "Pas besoin de spécifier que l'application est pour Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" -msgstr "" -"Aucune option configurée ! Éditez votre config.yml pour définir au moins " -"l'une d'entre elles :" +msgstr "Aucune option configurée ! Éditez votre config.yml pour définir au moins l'une d'entre elles :" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1480,9 +1353,7 @@ msgstr "Maintenant, définissez-les dans config.yml :" #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" -msgstr "" -"Le fichier OBB a un code de version plus récent ({integer}) que n'importe " -"quel APK :" +msgstr "Le fichier OBB a un code de version plus récent ({integer}) que n'importe quel APK :" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" @@ -1490,46 +1361,29 @@ msgstr "Le nom de fichier OBB doit commencer par «principal». ou \"patch\" : #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" -msgstr "" -"Le nom de paquet d'OBB ne correspond pas à un fichier APK pris en charge :" +msgstr "Le nom de paquet d'OBB ne correspond pas à un fichier APK pris en charge :" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "" -"Machine hors-ligne, la génération du miroir git est sautée jusqu'à `fdroid " -"deploy`" +msgstr "Machine hors-ligne, la génération du miroir git est sautée jusqu'à `fdroid deploy`" #: ../fdroidserver/deploy.py -msgid "" -"One of the 'github_releases' config items is missing the 'packageNames' " -"value. skipping ..." -msgstr "" -"L'un des éléments de configuration 'github_releases' ne contient pas la " -"valeur 'packageNames'. ignoré..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgstr "L'un des éléments de configuration 'github_releases' ne contient pas la valeur 'packageNames'. ignoré..." #: ../fdroidserver/deploy.py -msgid "" -"One of the 'github_releases' config items is missing the 'projectUrl' value. " -"skipping ..." -msgstr "" -"L'un des éléments de configuration 'github_releases' ne contient pas la " -"valeur 'projectUrl'. ignoré..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "L'un des éléments de configuration 'github_releases' ne contient pas la valeur 'projectUrl'. ignoré..." #: ../fdroidserver/deploy.py #, fuzzy -msgid "" -"One of the 'github_releases' config items is missing the 'token' value. " -"skipping ..." -msgstr "" -"L'un des éléments de configuration 'github_releases' ne contient pas la " -"valeur 'token'. ignoré..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." +msgstr "L'un des éléments de configuration 'github_releases' ne contient pas la valeur 'token'. ignoré..." #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" -msgstr "" -"Seuls les formats PNG et JPEG sont pris en charge pour les graphiques, " -"trouvés : {path}" +msgstr "Seuls les formats PNG et JPEG sont pris en charge pour les graphiques, trouvés : {path}" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" @@ -1537,13 +1391,11 @@ msgstr "Afficher uniquement les différences avec le Play Store" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" -msgstr "" -"Traiter uniquement les applications ayant des mises à jour automatiques" +msgstr "Traiter uniquement les applications ayant des mises à jour automatiques" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" -msgstr "" -"Les méthodes de donation OpenCollective vont dans le champ OpenCollective:" +msgstr "Les méthodes de donation OpenCollective vont dans le champ OpenCollective:" #: /usr/lib/python3.11/optparse.py msgid "Options" @@ -1570,9 +1422,7 @@ msgstr "Licence globale du projet." #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "" -"Substitution du nom de version vide dans {apkfilename} des métadonnées : " -"{version}" +msgstr "Substitution du nom de version vide dans {apkfilename} des métadonnées : {version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format @@ -1590,9 +1440,7 @@ msgstr "Mot de passe requis avec le nom d'utilisateur" #: ../fdroidserver/import_subcommand.py msgid "Path to main Android project subdirectory, if not in root." -msgstr "" -"Chemin d'accès au sous-répertoire principal du projet Android, si ce n'est " -"pas dans le répertoire racine." +msgstr "Chemin d'accès au sous-répertoire principal du projet Android, si ce n'est pas dans le répertoire racine." #: ../fdroidserver/init.py msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" @@ -1608,15 +1456,12 @@ msgstr "Chemin vers le keystore pour la clé de signature du dépôt" #: ../fdroidserver/nightly.py msgid "Print the secret variable to the terminal for easy copy/paste" -msgstr "" -"Afficher la variable secrète dans le terminal pour un copier/coller facilité" +msgstr "Afficher la variable secrète dans le terminal pour un copier/coller facilité" #: ../fdroidserver/install.py #, fuzzy, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "" -"Le mode de confidentialité a été activé, dû à votre position " -"({country_code})." +msgstr "Le mode de confidentialité a été activé, dû à votre position ({country_code})." #: ../fdroidserver/scanner.py #, python-format @@ -1687,21 +1532,13 @@ msgstr "Lecture de '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format -msgid "" -"Reading packageName/versionCode/versionName failed, APK invalid: " -"'{apkfilename}'" -msgstr "" -"La lecture de packageName/versionCode/versionName a échoué, APK invalide : " -"'{apkfilename}'" +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "La lecture de packageName/versionCode/versionName a échoué, APK invalide : '{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format -msgid "" -"Reading packageName/versionCode/versionName failed,APK invalid: " -"'{apkfilename}'" -msgstr "" -"La lecture de packageName/versionCode/versionName a échoué, APK invalide : " -"'{apkfilename}'" +msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" +msgstr "La lecture de packageName/versionCode/versionName a échoué, APK invalide : '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format @@ -1711,8 +1548,11 @@ msgstr "Lecture de {apkfilename} à partir du cache" #: ../fdroidserver/build.py #, fuzzy msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "Actualisation et mise en cache des règles et signature à partir du réseau." + +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." msgstr "" -"Actualisation et mise en cache des règles et signature à partir du réseau." #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1725,21 +1565,15 @@ msgstr "Suppression de {path}\"" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" -msgstr "" -"Renomme les fichiers APK dont le nom ne ressemble pas à nom.paquet_123.apk" +msgstr "Renomme les fichiers APK dont le nom ne ressemble pas à nom.paquet_123.apk" #: ../fdroidserver/checkupdates.py msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" -"Le mode de mise à jour de RepoTrunk n'a de sens que pour les dépôts git-svn" +msgstr "Le mode de mise à jour de RepoTrunk n'a de sens que pour les dépôts git-svn" #: ../fdroidserver/build.py -msgid "" -"Reset and create a brand new build server, even if the existing one appears " -"to be ok." -msgstr "" -"Réinitialiser et créer un tout nouveau serveur de construction, même si le " -"serveur existant semble correct." +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgstr "Réinitialiser et créer un tout nouveau serveur de construction, même si le serveur existant semble correct." #: ../fdroidserver/nightly.py #, python-brace-format @@ -1748,9 +1582,7 @@ msgstr "Re-signature de {apkfilename} avec le debug.keystore fournit" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" -msgstr "" -"Redimensionner toutes les icônes excédant la taille maximale en pixels et " -"quitter" +msgstr "Redimensionner toutes les icônes excédant la taille maximale en pixels et quitter" #: ../fdroidserver/common.py msgid "Restrict output to warnings and errors" @@ -1776,11 +1608,8 @@ msgstr "Exécuter sur le dépôt git qui a des modifications non validées" #: ../fdroidserver/nightly.py #, fuzzy, python-brace-format -msgid "" -"Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" -msgstr "" -"Lancer sur {cibase} pour trouver -debug.apk et passer repo_basedir " -"{repo_basedir}" +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "Lancer sur {cibase} pour trouver -debug.apk et passer repo_basedir {repo_basedir}" #: ../fdroidserver/lint.py msgid "Run rewritemeta to fix formatting" @@ -1802,9 +1631,7 @@ msgstr "Le SHA-256 de {url} ne correspond pas à l'entrée !" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." -msgstr "" -"Analyse le(s) APK(s) généré(s) afin de trouver les classes connues comme non " -"libres." +msgstr "Analyse le(s) APK(s) généré(s) afin de trouver les classes connues comme non libres." #: ../fdroidserver/__main__.py msgid "Scan the source code of a package" @@ -1850,9 +1677,7 @@ msgstr "Réglez l'horloge à cette heure à l'aide de :" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "" -"Régler le maximum de versions dans le dépôt avant que les plus anciennes " -"soient archivées" +msgstr "Régler le maximum de versions dans le dépôt avant que les plus anciennes soient archivées" #: ../fdroidserver/build.py #, python-brace-format @@ -1861,9 +1686,7 @@ msgstr "Définition de la limite de fichiers ouverts à {integer}" #: ../fdroidserver/__main__.py msgid "Set up an app build for a nightly build repo" -msgstr "" -"Programmer une compilation de l'application pour le dépôt des versions de " -"test" +msgstr "Programmer une compilation de l'application pour le dépôt des versions de test" #: ../fdroidserver/build.py msgid "Setting open file limit failed: " @@ -1884,9 +1707,7 @@ msgstr "Signer les indexes créés avec update --nosign" #: ../fdroidserver/build.py msgid "Skip scanning the source code for binaries and other problems" -msgstr "" -"Sauter le scan du code source pour des fichiers binaires et d'autres " -"problèmes" +msgstr "Sauter le scan du code source pour des fichiers binaires et d'autres problèmes" #: ../fdroidserver/update.py #, python-brace-format @@ -1896,8 +1717,7 @@ msgstr "Omission de '{apkfilename}' qui a une signature non valide !" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "" -"Ignorer le miroir GitLab Pages car le dépôt est trop volumineux (>%.2fGB) !" +msgstr "Ignorer le miroir GitLab Pages car le dépôt est trop volumineux (>%.2fGB) !" #: ../fdroidserver/update.py #, python-brace-format @@ -1943,8 +1763,7 @@ msgstr "Le résumé '%s' est juste le nom de l'application" #: ../fdroidserver/lint.py #, python-brace-format msgid "Summary of length {length} is over the {limit} char limit" -msgstr "" -"Le résumé de taille {length} est au-dessus de la limite de {limit} caractères" +msgstr "Le résumé de taille {length} est au-dessus de la limite de {limit} caractères" #: ../fdroidserver/common.py #, python-brace-format @@ -1952,26 +1771,16 @@ msgid "System clock is older than date in {path}!" msgstr "L'horloge système est plus âgée que la date dans {path} !" #: ../fdroidserver/checkupdates.py -msgid "" -"Tags update mode only works for git, hg, bzr and git-svn repositories " -"currently" -msgstr "" -"Le mode de mise à jour par étiquettes fonctionne seulement pour les dépôts " -"git, hg, bzr et git-svn pour le moment" +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "Le mode de mise à jour par étiquettes fonctionne seulement pour les dépôts git, hg, bzr et git-svn pour le moment" #: ../fdroidserver/checkupdates.py msgid "Tags update mode used in git-svn, but the repo was not set up with tags" -msgstr "" -"Le mode de mise à jour par étiquettes est utilisé dans git-svn, mais le " -"dépôt n'était pas paramétré avec des étiquettes" +msgstr "Le mode de mise à jour par étiquettes est utilisé dans git-svn, mais le dépôt n'était pas paramétré avec des étiquettes" #: ../fdroidserver/build.py -msgid "" -"Test mode - put output in the tmp directory only, and always build, even if " -"the output already exists." -msgstr "" -"Mode test — mettre la sortie dans le dossier tmp uniquement et toujours " -"compiler, même si la sortie existe déjà." +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgstr "Mode test — mettre la sortie dans le dossier tmp uniquement et toujours compiler, même si la sortie existe déjà." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -2006,30 +1815,16 @@ msgstr "Il y a une collision de keyalias — publication interrompue" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." -msgstr "" -"Voici les applications qui ont été archivées à partir du dépôt principal." +msgstr "Voici les applications qui ont été archivées à partir du dépôt principal." #: ../fdroidserver/mirror.py #, fuzzy -msgid "" -"This command should never be used to mirror f-droid.org! A full copy " -"requires more than 600GB." -msgstr "" -"Cette commande ne devrait jamais être utilisée pour copier f-droid.org ! Une " -"copie occupe plus de 600GB." +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "Cette commande ne devrait jamais être utilisée pour copier f-droid.org ! Une copie occupe plus de 600GB." #: ../fdroidserver/common.py -msgid "" -"This is a repository of apps to be used with F-Droid. Applications in this " -"repository are either official binaries built by the original application " -"developers, or are binaries built from source by the admin of f-droid.org " -"using the tools on https://gitlab.com/fdroid." -msgstr "" -"Ceci est un dépôt d’applications à utiliser avec FDroid. Les applications " -"publiées dans ce dépôt sont soit les binaires officiels compilés par les " -"développeurs de ces applications, soit celles compilées par f-droid.org à " -"partir des sources en utilisant les outils disponibles sur https://gitlab." -"com/fdroid." +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "Ceci est un dépôt d’applications à utiliser avec FDroid. Les applications publiées dans ce dépôt sont soit les binaires officiels compilés par les développeurs de ces applications, soit celles compilées par f-droid.org à partir des sources en utilisant les outils disponibles sur https://gitlab.com/fdroid." #: ../fdroidserver/import_subcommand.py #, python-format @@ -2054,17 +1849,12 @@ msgstr "" "Vous devriez aussi paramétrer une clé de signature\n" "(une clé temporaire peut avoir été générée automatiquement).\n" "\n" -"Plus d'informations sur : https://f-droid.org/fr/docs/Setup_an_F-" -"Droid_App_Repo\n" +"Plus d'informations sur : https://f-droid.org/fr/docs/Setup_an_F-Droid_App_Repo\n" "et https://f-droid.org/fr/docs/Signing_Process." #: ../fdroidserver/deploy.py -msgid "" -"To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config." -"yml!" -msgstr "" -"Pour utiliser awsbucket, awssecretkey et awsaccesskeyid doivent aussi être " -"configurées dans config.yml !" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "Pour utiliser awsbucket, awssecretkey et awsaccesskeyid doivent aussi être configurées dans config.yml !" #: ../fdroidserver/deploy.py msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" @@ -2084,20 +1874,12 @@ msgid "URL {url} in Description: {error}" msgstr "URL {url} en Description : {error}" #: ../fdroidserver/lint.py -msgid "" -"Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from " -"https://spdx.org/license-list" -msgstr "" -"Balise de licence non valide \"{}\" ! Utilisez uniquement des balises " -"approuvées par la FSF ou l'OSI de https://spdx.org/license-list" +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "Balise de licence non valide \"{}\" ! Utilisez uniquement des balises approuvées par la FSF ou l'OSI de https://spdx.org/license-list" #: ../fdroidserver/lint.py -msgid "" -"Unexpected license tag \"{}\"! Only use license tags configured in your " -"config file" -msgstr "" -"Balise de licence non valide \"{}\" ! Utilisez uniquement des balises de " -"licence configurées dans votre fichier de configuration" +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgstr "Balise de licence non valide \"{}\" ! Utilisez uniquement des balises de licence configurées dans votre fichier de configuration" #: ../fdroidserver/common.py #, python-brace-format @@ -2154,8 +1936,7 @@ msgstr "Option de compilation '{build_flag}' non reconnue dans '{path}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" -msgstr "" -"Type de fichier non pris en charge \"{extension}\" pour graphique de dépôt" +msgstr "Type de fichier non pris en charge \"{extension}\" pour graphique de dépôt" #: ../fdroidserver/update.py #, python-brace-format @@ -2193,8 +1974,7 @@ msgstr "Mettre à jour les données des dépôts pour les nouveaux paquets" #: ../fdroidserver/__main__.py msgid "Update the binary transparency log for a URL" -msgstr "" -"Mettre à jour le rapport de transparence des fichiers binaires pour une URL" +msgstr "Mettre à jour le rapport de transparence des fichiers binaires pour une URL" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -2203,12 +1983,8 @@ msgstr "UpdateCheckData a une URL invalide : {url}" #: ../fdroidserver/lint.py #, python-brace-format -msgid "" -"UpdateCheckData must match the version code as integer (\\d or [0-9]): " -"{codeex}" -msgstr "" -"UpdateCheckData doit correspondre au code de la version en nombre entier " -"(\\d ou [0-9]) : {codeex}" +msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" +msgstr "UpdateCheckData doit correspondre au code de la version en nombre entier (\\d ou [0-9]) : {codeex}" #: ../fdroidserver/lint.py #, python-brace-format @@ -2221,26 +1997,18 @@ msgid "UpdateCheckData not a valid URL: {url}" msgstr "UpdateCheckData URL non valide : {url}" #: ../fdroidserver/lint.py -msgid "" -"UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." -msgstr "" -"UpdateCheckMode est configuré mais on dirait que checkupdates n'a pas encore " -"été lancé." +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." +msgstr "UpdateCheckMode est configuré mais on dirait que checkupdates n'a pas encore été lancé." #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py #, fuzzy -msgid "" -"UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" -"UpdateCheckMode est configuré mais on dirait que checkupdates n'a pas encore " -"été lancé" +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "UpdateCheckMode est configuré mais on dirait que checkupdates n'a pas encore été lancé" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" -msgstr "" -"UpdateCheckName est défini sur l’ID d’application connu, il peut être " -"supprimé" +msgstr "UpdateCheckName est défini sur l’ID d’application connu, il peut être supprimé" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2267,18 +2035,12 @@ msgstr "Usage : %s\n" #: ../fdroidserver/lint.py #, fuzzy -msgid "" -"Use /HEAD instead of /master or /main to point at a file in the default " -"branch" -msgstr "" -"Utiliser /HEAD plutôt que /master pour pointer un fichier dans la branche " -"par défaut" +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "Utiliser /HEAD plutôt que /master pour pointer un fichier dans la branche par défaut" #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" -"Utiliser /HEAD plutôt que /master pour pointer un fichier dans la branche " -"par défaut" +msgstr "Utiliser /HEAD plutôt que /master pour pointer un fichier dans la branche par défaut" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." @@ -2290,9 +2052,7 @@ msgstr "Utiliser le serveur de build" #: ../fdroidserver/update.py msgid "Use date from APK instead of current time for newly added APKs" -msgstr "" -"Utiliser la date de l'APK plutôt que la date courante pour les APKs " -"nouvellement ajoutés" +msgstr "Utiliser la date de l'APK plutôt que la date courante pour les APKs nouvellement ajoutés" #: ../fdroidserver/deploy.py #, python-brace-format @@ -2317,11 +2077,8 @@ msgid "Using JAR Signature" msgstr "Utilisation de la signature JAR" #: ../fdroidserver/common.py -msgid "" -"Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" -msgstr "" -"L'utilisation de l'utilitaire jarsigner de Java n'est pas recommandé pour " -"vérifier les APKs ! Utiliser apksigner" +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "L'utilisation de l'utilitaire jarsigner de Java n'est pas recommandé pour vérifier les APKs ! Utiliser apksigner" #: ../fdroidserver/common.py #, python-brace-format @@ -2371,12 +2128,8 @@ msgstr "Vérifier le paquet {path} avec apksigner." #: ../fdroidserver/deploy.py #, python-brace-format -msgid "" -"VirusTotal API key cannot upload files larger than 32MB, use {url} to upload " -"{path}." -msgstr "" -"L’API de VirusTotal ne permet pas d’envoyer des fichiers plus grands que " -"32Mo, utilisez {url} pour envoyer {path}." +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "L’API de VirusTotal ne permet pas d’envoyer des fichiers plus grands que 32Mo, utilisez {url} pour envoyer {path}." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" @@ -2388,20 +2141,12 @@ msgid "WebAssembly binary file" msgstr "Fichier binaire WebAssembly" #: ../fdroidserver/update.py -msgid "" -"When configured for signed indexes, create only unsigned indexes at this " -"stage" -msgstr "" -"Lorsqu'il est configuré pour les index signés, ne créez que des index non " -"signés à ce stade" +msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgstr "Lorsqu'il est configuré pour les index signés, ne créez que des index non signés à ce stade" #: ../fdroidserver/lint.py -msgid "" -"When linting the entire repository yamllint is disabled by default. This " -"option forces yamllint regardless." -msgstr "" -"Lors du linting, tout le dépôt yamllint est désactivé par défaut. Cette " -"option force yamllint malgré tout." +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgstr "Lors du linting, tout le dépôt yamllint est désactivé par défaut. Cette option force yamllint malgré tout." #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." @@ -2409,14 +2154,11 @@ msgstr "" #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "" -"Souhaitez-vous télécharger et installer F-Droid.apk via adb ? (OUI/non)" +msgstr "Souhaitez-vous télécharger et installer F-Droid.apk via adb ? (OUI/non)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "" -"Souhaitez-vous télécharger le(s) application(s) depuis f-droid.org ? (OUI/" -"non)" +msgstr "Souhaitez-vous télécharger le(s) application(s) depuis f-droid.org ? (OUI/non)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2424,8 +2166,7 @@ msgstr "X.509 'Nom distingué' utilisé lors de la génération des clés" #: ../fdroidserver/common.py msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" -msgstr "" -"Vous pouvez utiliser ANDROID_HOME pour définir le chemin de votre SDK, ex. :" +msgstr "Vous pouvez utiliser ANDROID_HOME pour définir le chemin de votre SDK, ex. :" #: ../fdroidserver/scanner.py msgid "ZIP file archive" @@ -2462,8 +2203,7 @@ msgstr "option ambiguë : %s (%s ?)" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "" -"apksigner introuvable ! Impossible de signer ou de vérifier les APK modernes" +msgstr "apksigner introuvable ! Impossible de signer ou de vérifier les APK modernes" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" @@ -2478,8 +2218,7 @@ msgstr "applicationId du fichier à traiter" #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py msgid "application ID with optional versionCode in the form APPID[:VERCODE]" -msgstr "" -"ID d'application avec le versionCode optionnel sous la forme APPID[:VERCODE]" +msgstr "ID d'application avec le versionCode optionnel sous la forme APPID[:VERCODE]" #: ../fdroidserver/common.py msgid "archive_url needs to end with /archive" @@ -2534,9 +2273,7 @@ msgstr "impossible de fusionner les actions — deux groupes sont nommés %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" -msgstr "" -"impossible de publier la mise à jour, avez-vous affecté la clé de " -"déploiement ?" +msgstr "impossible de publier la mise à jour, avez-vous affecté la clé de déploiement ?" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2580,20 +2317,15 @@ msgstr "impossible de lire '{path}'" #: ../fdroidserver/common.py #, fuzzy msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "" -"impossible d'analyser la spécification srclib (pas de référence spécifiée) : " -"'{}'" +msgstr "impossible d'analyser la spécification srclib (pas de référence spécifiée) : '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" -msgstr "" -"impossible d'analyser la spécification srclib (pas de référence spécifiée) : " -"'{}'" +msgstr "impossible d'analyser la spécification srclib (pas de référence spécifiée) : '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" -"impossible d'analyser la spécification srclib (trop de caractères '@') : '{}'" +msgstr "impossible d'analyser la spécification srclib (trop de caractères '@') : '{}'" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2603,9 +2335,7 @@ msgstr "{path} a été créé" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "current version is newer: old vercode={old}, new vercode={new}" -msgstr "" -"la version actuelle est plus récente : ancien vercode={old}, nouveau " -"vercode={new}" +msgstr "la version actuelle est plus récente : ancien vercode={old}, nouveau vercode={new}" #: ../fdroidserver/update.py #, python-brace-format @@ -2681,9 +2411,7 @@ msgstr "virgule flottante" #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." -msgstr "" -"forcer les erreurs (par défaut) sur les métadonnées à être des " -"avertissements, ou les ignorer." +msgstr "forcer les erreurs (par défaut) sur les métadonnées à être des avertissements, ou les ignorer." #: ../fdroidserver/common.py msgid "git svn clone failed" @@ -2702,15 +2430,11 @@ msgstr "argument explicite %r ignoré" #: ../fdroidserver/index.py msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" -msgstr "" -"index-v1 doit avoir une signature, utilisez `fdroid signindex` pour la " -"créer !" +msgstr "index-v1 doit avoir une signature, utilisez `fdroid signindex` pour la créer !" #: ../fdroidserver/index.py msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" -msgstr "" -"index-v2 doit avoir une signature, utilisez `fdroid signindex` pour la " -"créer !" +msgstr "index-v2 doit avoir une signature, utilisez `fdroid signindex` pour la créer !" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2743,12 +2467,8 @@ msgstr "valeur de conflict_resolution invalide : %r" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format -msgid "" -"invalid option string %(option)r: must start with a character " -"%(prefix_chars)r" -msgstr "" -"chaîne d’option non valide %(option)r : doit commencer par un caractère " -"%(prefix_chars)r" +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgstr "chaîne d’option non valide %(option)r : doit commencer par un caractère %(prefix_chars)r" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" @@ -2757,17 +2477,12 @@ msgstr "ipfs_cid introuvable, omission de la génération de CIDv1" #: ../fdroidserver/checkupdates.py #, python-brace-format msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" -msgstr "" -"la recette de la dernière version est plus récente : ancien vercode={old}, " -"nouveau vercode={new}" +msgstr "la recette de la dernière version est plus récente : ancien vercode={old}, nouveau vercode={new}" #: ../fdroidserver/deploy.py #, python-brace-format -msgid "" -"local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" -msgstr "" -"local_copy_dir ne semble pas se terminer avec \"fdroid\", peut être voulez-" -"vous dire : \"{path}\"" +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "local_copy_dir ne semble pas se terminer avec \"fdroid\", peut être voulez-vous dire : \"{path}\"" #: ../fdroidserver/deploy.py msgid "local_copy_dir must be an absolute path!" @@ -2843,9 +2558,7 @@ msgstr "accepte uniquement les chaînes de caractères, listes et tuples" #: ../fdroidserver/install.py #, python-format msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" -"option %s : Si vous voulez vraiment installer toutes les applications " -"signées, utilisez --all" +msgstr "option %s : Si vous voulez vraiment installer toutes les applications signées, utilisez --all" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2934,19 +2647,13 @@ msgstr "signature manquante du fichier binaire de référence" #: ../fdroidserver/signatures.py #, python-brace-format -msgid "" -"refuse downloading via insecure HTTP connection (use HTTPS or specify --no-" -"https-check): {apkfilename}" -msgstr "" -"refuser le téléchargement via une connexion HTTP non sécurisée (utilisez " -"HTTPS ou précisez --no-https-check) : {apkfilename}" +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgstr "refuser le téléchargement via une connexion HTTP non sécurisée (utilisez HTTPS ou précisez --no-https-check) : {apkfilename}" #: ../fdroidserver/index.py #, python-format msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." -msgstr "" -"repo_icon \"repo/icons/%s\" n'existe pas, génération d'une icône de " -"substitution." +msgstr "repo_icon \"repo/icons/%s\" n'existe pas, génération d'une icône de substitution." #: ../fdroidserver/common.py msgid "repo_url needs to end with /repo" @@ -2974,17 +2681,12 @@ msgstr "s3cmd synchroniser les index de {path} vers {url} et les supprimer" #: ../fdroidserver/scanner.py #, python-brace-format msgid "scanner cache is malformed! You can clear it with: '{clear}'" -msgstr "" -"l'analyse du cache est mal formée ! Vous pouvez le nettoyer avec : '{clear}'" +msgstr "l'analyse du cache est mal formée ! Vous pouvez le nettoyer avec : '{clear}'" #: ../fdroidserver/deploy.py #, fuzzy -msgid "" -"serverwebroot: path does not end with \"fdroid\", perhaps you meant one of " -"these:" -msgstr "" -"serverwebroot: le chemin ne se terminer pas avec \"fdroid\", peut être " -"voulez-vous dire :" +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "serverwebroot: le chemin ne se terminer pas avec \"fdroid\", peut être voulez-vous dire :" #: ../fdroidserver/scanner.py msgid "shared library" @@ -3010,15 +2712,11 @@ msgstr "APK signé, soit un chemin de fichier ou une URL HTTPS." #: ../fdroidserver/common.py msgid "skip deploying full build logs: log content is empty" -msgstr "" -"passer le déploiement des journaux de compilation complets : le contenu du " -"journal est vide" +msgstr "passer le déploiement des journaux de compilation complets : le contenu du journal est vide" #: ../fdroidserver/common.py msgid "skip deploying full build logs: not enabled in config" -msgstr "" -"passer le déploiement des journaux de compilation complets : non activé dans " -"la configuration" +msgstr "passer le déploiement des journaux de compilation complets : non activé dans la configuration" #: ../fdroidserver/update.py #, python-brace-format @@ -3036,8 +2734,7 @@ msgstr "librairie statique" #: ../fdroidserver/build.py #, python-brace-format msgid "supplied reference binary has allowed signer {signer}" -msgstr "" -"le fichier binaire de référence fourni a autorisé le signataire {signer}" +msgstr "le fichier binaire de référence fourni a autorisé le signataire {signer}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -3090,8 +2787,7 @@ msgstr "utilisation de Apache libcloud pour syncronizer avec {url}" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "" -"virustotal.com limite le nombre de requêtes, en attente avant de réessayer..." +msgstr "virustotal.com limite le nombre de requêtes, en attente avant de réessayer..." #: ../fdroidserver/install.py #, fuzzy @@ -3113,16 +2809,12 @@ msgstr "{apkfilename} ({appid}) ne contient pas de métadonnées !" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" -"{apkfilename} a plusieurs fichiers {name}, on dirait que c'est une faille ou " -"exploitation de la clé maître (Master Key) !" +msgstr "{apkfilename} a plusieurs fichiers {name}, on dirait que c'est une faille ou exploitation de la clé maître (Master Key) !" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " -msgstr "" -"Le fichier AndroidManifest.xml de {apkfilename} possède une date " -"incorrecte : " +msgstr "Le fichier AndroidManifest.xml de {apkfilename} possède une date incorrecte : " #: ../fdroidserver/update.py #, python-brace-format @@ -3153,16 +2845,12 @@ msgstr "{appid} n'a pas de {name}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" -msgstr "" -"{appid} : Bibliothèque externe (extlib) {path} inconnue dans la version " -"'{versionName}'" +msgstr "{appid} : Bibliothèque externe (extlib) {path} inconnue dans la version '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" -msgstr "" -"{appid} : pas de versions spécifiées, s'exécute à partir de l'état présent " -"du code source" +msgstr "{appid} : pas de versions spécifiées, s'exécute à partir de l'état présent du code source" #: ../fdroidserver/lint.py #, python-brace-format @@ -3182,9 +2870,7 @@ msgstr "{build_flag} doit être un entier, valeur trouvée : {value}" #: ../fdroidserver/metadata.py #, python-brace-format msgid "{build_flag} must be list or string, found: {value}" -msgstr "" -"{build_flag} doit être une liste ou une chaîne de caractères, valeur " -"trouvée : {value}" +msgstr "{build_flag} doit être une liste ou une chaîne de caractères, valeur trouvée : {value}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -3194,8 +2880,7 @@ msgstr "{file} est vide ou corrompu !" #: ../fdroidserver/update.py #, python-brace-format msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." -msgstr "" -"{name} \"{section}/icons/{path}\" n'existe pas ! Vérifiez \"config.yml\"." +msgstr "{name} \"{section}/icons/{path}\" n'existe pas ! Vérifiez \"config.yml\"." #: ../fdroidserver/common.py #, python-brace-format @@ -3215,9 +2900,7 @@ msgstr "{path} n’existe pas ! Créez-le en exécutant :" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "" -"{path} a une mauvaise signature de fichier \"{pattern}\", possibilité d'une " -"faille Janus !" +msgstr "{path} a une mauvaise signature de fichier \"{pattern}\", possibilité d'une faille Janus !" #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format @@ -3262,8 +2945,7 @@ msgstr "{path} supérieur à 200MB, envoi manuel : {url}" #: ../fdroidserver/lint.py #, python-brace-format msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" -msgstr "" -"{path} : \"{code}\" n'est pas un code de pays ISO_3166-1 alpha-2 valide !" +msgstr "{path} : \"{code}\" n'est pas un code de pays ISO_3166-1 alpha-2 valide !" #: ../fdroidserver/update.py #, python-brace-format diff --git a/locale/fy/LC_MESSAGES/fdroidserver.po b/locale/fy/LC_MESSAGES/fdroidserver.po index 95450665..56a9c044 100644 --- a/locale/fy/LC_MESSAGES/fdroidserver.po +++ b/locale/fy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2021-07-01 15:29+0000\n" "Last-Translator: Vancha March \n" "Language-Team: Frisian \n" @@ -1498,6 +1498,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/ga/LC_MESSAGES/fdroidserver.po b/locale/ga/LC_MESSAGES/fdroidserver.po index af75f5d8..dbb2d62f 100644 --- a/locale/ga/LC_MESSAGES/fdroidserver.po +++ b/locale/ga/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1-162-gfbb3cc59\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-11-22 21:03+0000\n" "Last-Translator: Aindriú Mac Giolla Eoin \n" "Language-Team: Irish \n" @@ -1512,6 +1512,10 @@ msgstr "{apkfilename} á léamh ón taisce" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Athnuaigh agus cuir rialacha agus sínithe scanóirí taisce ón líonra" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Comhaid shonraithe á mbaint" diff --git a/locale/he/LC_MESSAGES/fdroidserver.po b/locale/he/LC_MESSAGES/fdroidserver.po index 46e2ffac..03ad12eb 100644 --- a/locale/he/LC_MESSAGES/fdroidserver.po +++ b/locale/he/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-08-18 06:27+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" @@ -1499,6 +1499,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/hi/LC_MESSAGES/fdroidserver.po b/locale/hi/LC_MESSAGES/fdroidserver.po index 480cf456..d4fbd647 100644 --- a/locale/hi/LC_MESSAGES/fdroidserver.po +++ b/locale/hi/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2023-02-22 11:24+0000\n" "Last-Translator: Saurmandal \n" "Language-Team: Hindi \n" @@ -1499,6 +1499,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index cee6d503..43e1a316 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Hungarian \n" @@ -1517,6 +1517,10 @@ msgstr "A(z) {apkfilename} olvasása gyorsítótárból" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Megadott fájlok eltávolítása" diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index 80804049..19848c53 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-10-04 04:26+0000\n" "Last-Translator: Doctorredits_here \n" "Language-Team: Indonesian \n" @@ -1503,6 +1503,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 89df8baa..974dcd7a 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-09-10 09:27+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Italian \n" @@ -1525,6 +1525,10 @@ msgstr "Lettura di {apkfilename} dalla cache" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "recupera l'ultima versione delle firme dal web" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Rimozione dei file specificati" diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 06b20d2f..3c42ac50 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-11-28 08:34+0000\n" "Last-Translator: \"Shuuji TAKAHASHI (shuuji3)\" \n" "Language-Team: Japanese \n" @@ -1506,6 +1506,10 @@ msgstr "{apkfilename}をキャッシュから読み込みます" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "スキャナーのルールと署名をネットワークから取得して更新し、キャッシュ" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "指定されたファイルを削除" diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index f9ff3f03..63009aba 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2021-01-15 13:25+0000\n" "Last-Translator: R_SACI \n" "Language-Team: Kabyle \n" @@ -1503,6 +1503,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index 254302fb..874636e5 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-09-06 14:57+0000\n" "Last-Translator: Cxnfl1ct \n" "Language-Team: Korean \n" @@ -1505,6 +1505,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/ml/LC_MESSAGES/fdroidserver.po b/locale/ml/LC_MESSAGES/fdroidserver.po index 9aa2f620..d1abaa44 100644 --- a/locale/ml/LC_MESSAGES/fdroidserver.po +++ b/locale/ml/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2023-06-23 14:52+0000\n" "Last-Translator: abe1242 \n" "Language-Team: Malayalam \n" @@ -1503,6 +1503,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index c311ac54..38008c65 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Norwegian Bokmål \n" @@ -1562,6 +1562,10 @@ msgstr "Behandler {apkfilename}" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Fjerner angitte filer" diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index e2ec82f2..4c722636 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-01-03 09:07+0000\n" "Last-Translator: Issa1553 \n" "Language-Team: Dutch \n" @@ -1506,6 +1506,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index d19763a6..651a7ffe 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-11-30 20:00+0000\n" "Last-Translator: WaldiS \n" "Language-Team: Polish \n" @@ -1514,6 +1514,10 @@ msgstr "Czytanie {apkfilename} z pamięci podręcznej" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Odświeżanie i buforowanie reguł skanera i sygnatur z sieci" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Usuwanie określonych plików" diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 3ee09d9f..f96c1ad5 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-11-26 15:16+0000\n" "Last-Translator: Hugo Carvalho \n" "Language-Team: Portuguese \n" @@ -1510,6 +1510,10 @@ msgstr "Lendo {apkfilename} do cache" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Atualizar e armazenar as regras e assinaturas do scanner da rede no cache" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Apagando ficheiros especificados" diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 1eddfafe..36fcbaac 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-11-25 13:28+0000\n" "Last-Translator: dedakir923 \n" "Language-Team: Portuguese (Brazil) \n" @@ -1519,6 +1519,10 @@ msgstr "Lendo {apkfilename} do cache" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Atualizar e armazenar em cache regras e assinaturas do scanner da rede" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Removendo arquivos especificados" diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 44552b69..33e98ccc 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-11-26 10:54+0000\n" "Last-Translator: Hugo Carvalho \n" "Language-Team: Portuguese (Portugal) \n" @@ -1512,6 +1512,10 @@ msgstr "Lendo {apkfilename} do cache" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Atualizar e armazenar as regras e assinaturas do scanner da rede no cache" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Apagando ficheiros especificados" diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index b2df8f67..a80cd5c0 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-12-02 17:00+0000\n" "Last-Translator: Licaon Kter \n" "Language-Team: Romanian \n" @@ -1512,6 +1512,10 @@ msgstr "Citirea {apkfilename} din memoria cache" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Actualizează și stochează în memorie regulile și semnăturilor de scanare din rețea" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Eliminarea fișierelor specificate" diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index fb3bc702..37b845c4 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -19,7 +19,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-12-02 17:00+0000\n" "Last-Translator: Golubev Alexander \n" "Language-Team: Russian \n" @@ -1522,6 +1522,10 @@ msgstr "Чтение {apkfilename} из кеша" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Обновление и кэширование правил и сигнатур сканера из сети" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Удаление выбранных файлов" diff --git a/locale/sk/LC_MESSAGES/fdroidserver.po b/locale/sk/LC_MESSAGES/fdroidserver.po index bb9c771e..e3172725 100644 --- a/locale/sk/LC_MESSAGES/fdroidserver.po +++ b/locale/sk/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -1499,6 +1499,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index b3cc3589..0021e40a 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-11-22 05:58+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" @@ -1507,6 +1507,10 @@ msgstr "Po lexohet {apkfilename} prej fshehtine" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Rifresko dhe ruaj në fshehtinë rregulla skaneri nga rrjeti" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Po hiqen kartelat e treguara" diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index 483ea9e0..8ef674d3 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-11-29 10:00+0000\n" "Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" @@ -1511,6 +1511,10 @@ msgstr "Читање {apkfilename} из кеша→" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Освежите и кеширајте правила и потписе скенера са мреже" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Уклањање наведених датотека" diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index 3e3bab61..15e89445 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-04-24 08:39+0000\n" "Last-Translator: Kristoffer Grundström \n" "Language-Team: Swedish \n" @@ -1504,6 +1504,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index 37f37e13..03c8b9ee 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-09-08 11:09+0000\n" "Last-Translator: abelbiwott-dev \n" "Language-Team: Swahili \n" @@ -1508,6 +1508,10 @@ msgstr "Kusoma {apkfilename} kutoka kwa hifadhi ya muda" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Onyesha upya na uweke kwenye hifadhi ya muda kanuni za skana na sahihi kutoka kwenye mtandao" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Kuondoa faili zilizobainishwa" diff --git a/locale/ta/LC_MESSAGES/fdroidserver.po b/locale/ta/LC_MESSAGES/fdroidserver.po index 4fecbbd8..46016bdb 100644 --- a/locale/ta/LC_MESSAGES/fdroidserver.po +++ b/locale/ta/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-12-02 17:00+0000\n" "Last-Translator: தமிழ்நேரம் \n" "Language-Team: Tamil \n" @@ -1508,6 +1508,10 @@ msgstr "தற்காலிக சேமிப்பிலிருந்த msgid "Refresh and cache scanner rules and signatures from the network" msgstr "நெட்வொர்க்கிலிருந்து ச்கேனர் விதிகள் மற்றும் கையொப்பங்களை புதுப்பித்து கேச்" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "குறிப்பிட்ட கோப்புகளை நீக்குதல்" diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index e869799c..555886d8 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-09-10 23:49+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" @@ -1509,6 +1509,10 @@ msgstr "{apkfilename} önbellekten okunuyor" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Tarayıcı kurallarını ve imzalarını ağdan yenile ve önbelleğe al" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Belirtilen dosyalar kaldırılıyor" diff --git a/locale/tzm/LC_MESSAGES/fdroidserver.po b/locale/tzm/LC_MESSAGES/fdroidserver.po index ef09531f..dff41870 100644 --- a/locale/tzm/LC_MESSAGES/fdroidserver.po +++ b/locale/tzm/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-681-gc19e8952\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2020-10-29 08:32+0000\n" "Last-Translator: Hakim Oubouali \n" "Language-Team: Central Atlas Tamazight \n" @@ -1498,6 +1498,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/ug/LC_MESSAGES/fdroidserver.po b/locale/ug/LC_MESSAGES/fdroidserver.po index e88c85cb..685c3934 100644 --- a/locale/ug/LC_MESSAGES/fdroidserver.po +++ b/locale/ug/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2018-06-08 03:44+0000\n" "Last-Translator: ۋولقان \n" "Language-Team: Uyghur \n" @@ -1500,6 +1500,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 7cc2e8a0..f557da71 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-09-13 23:35+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" @@ -1518,6 +1518,10 @@ msgstr "Читання {apkfilename} з кешу" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Оновлення та кешування правил і сигнатур сканера з мережі" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "Вилучення вказаних файлів" diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 2c1b2f59..629a4c2c 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -39,7 +39,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-11-24 18:41+0000\n" "Last-Translator: 大王叫我来巡山 \n" "Language-Team: Chinese (Simplified Han script) \n" @@ -1538,6 +1538,10 @@ msgstr "从缓存读取 {apkfilename}" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "刷新和缓存来自网络的扫描程序规则和签名" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "删除指定文件" diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 35ebba4f..b87bf7e7 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-11-26 15:16+0000\n" "Last-Translator: Peter Dave Hello \n" "Language-Team: Chinese (Traditional Han script) \n" @@ -1530,6 +1530,10 @@ msgstr "從緩存讀取 {apkfilename}" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "從網路重新整理並快取掃描器規則與簽章" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "移除指定檔案" From 9b59d5cf48a69908c2bc2efdfb50188f59f1abcf Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 11 Dec 2024 23:13:58 +0800 Subject: [PATCH 1839/2116] update: extract archive policy calculation to common --- fdroidserver/common.py | 14 ++++++++++++++ fdroidserver/update.py | 12 +++--------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index f600d0d2..5f812206 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4705,6 +4705,20 @@ def _install_ndk(ndk): ) +def calculate_archive_policy(app, default): + """Calculate the archive policy from the metadata and default config.""" + if app.get('ArchivePolicy') is not None: + archive_policy = app['ArchivePolicy'] + else: + archive_policy = default + if app.get('VercodeOperation'): + archive_policy *= len(app['VercodeOperation']) + builds = [build for build in app.Builds if not build.disable] + if app.Builds and archive_policy > len(builds): + archive_policy = len(builds) + return archive_policy + + FDROIDORG_MIRRORS = [ { 'isPrimary': True, diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 7d443747..e038e166 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -2276,15 +2276,9 @@ def archive_old_apks(apps, apks, archapks, repodir, archivedir, defaultkeepversi return sorted_list for appid, app in apps.items(): - - if app.get('ArchivePolicy') is not None: - keepversions = app['ArchivePolicy'] - else: - keepversions = defaultkeepversions - if app.get('VercodeOperation'): - keepversions *= len(app['VercodeOperation']) - if common.metadata_find_developer_signing_files(appid, app['CurrentVersionCode']): - keepversions *= 2 + keepversions = common.calculate_archive_policy(app, defaultkeepversions) + if common.metadata_find_developer_signing_files(appid, app['CurrentVersionCode']): + keepversions *= 2 logging.debug(_("Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}") .format(appid=appid, integer=len(apks), keep=keepversions, arch=len(archapks))) From f93e30f1e9cdd4728e6ac6a2b4700f4fdb978588 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 11 Dec 2024 23:14:06 +0800 Subject: [PATCH 1840/2116] lint: only error out on missing extlib on versions not archived --- fdroidserver/lint.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 8f1f8d71..69b0ca91 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -526,13 +526,23 @@ def check_extlib_dir(apps): used = set() for app in apps: - for build in app.get('Builds', []): + if app.Disabled: + continue + archive_policy = common.calculate_archive_policy( + app, common.config['archive_older'] + ) + builds = [build for build in app.Builds if not build.disable] + + for i in range(len(builds)): + build = builds[i] for path in build.extlibs: path = Path(path) if path not in extlib_files: - yield _( - "{appid}: Unknown extlib {path} in build '{versionName}'" - ).format(appid=app.id, path=path, versionName=build.versionName) + # Don't show error on archived versions + if i >= len(builds) - archive_policy: + yield _( + "{appid}: Unknown extlib {path} in build '{versionName}'" + ).format(appid=app.id, path=path, versionName=build.versionName) else: used.add(path) From f01628ca6b1bde6d54d1b7c202d12c3545c18b5f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 12 Dec 2024 09:44:53 +0100 Subject: [PATCH 1841/2116] fix localhost network tests on systems with IPv6 Thanks to themill from Debian for this suggestion: > https://docs.python.org/3/library/socket.html#socket.socket makes me > think socket.socket has done an ipv4 only but urilib3 will do > whatever localhost resolves to. I suspect the test code should be > using socket.create_server - there's an example at > https://docs.python.org/3/library/socket.html#socket.create_server --- tests/test_net.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/test_net.py b/tests/test_net.py index b8c311d3..5084474d 100755 --- a/tests/test_net.py +++ b/tests/test_net.py @@ -37,9 +37,13 @@ class RetryServer: self.stop_event.set() def run_fake_server(self): - server_sock = socket.socket() - server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - server_sock.bind(('localhost', self.port)) + addr = ('localhost', self.port) + if socket.has_dualstack_ipv6(): + server_sock = socket.create_server( + addr, family=socket.AF_INET6, dualstack_ipv6=True + ) + else: + server_sock = socket.create_server(addr) server_sock.listen(5) server_sock.settimeout(5) time.sleep(0.001) # wait for it to start From eb49351b8107739d20c3d14d827bb8a4d821605b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 12 Dec 2024 17:43:19 +0100 Subject: [PATCH 1842/2116] update CHANGELOG.md --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b8bb4c15..285cbde1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ### Removed +## [2.3.4] - 2024-12-12 + +### Fixed + +* Fix localhost network tests on systems with IPv6. +* lint: only error out on missing extlib on versions not archived. + ## [2.3.3] - 2024-12-11 ### Added From 3b64dcee7a7a46eefd56e49e902037d61b635ed6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 12 Dec 2024 17:43:43 +0100 Subject: [PATCH 1843/2116] version 2.3.4 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index fd1a8148..41a5b71a 100755 --- a/setup.py +++ b/setup.py @@ -70,7 +70,7 @@ with open("README.md", "r") as fh: setup( name='fdroidserver', - version='2.3.3', + version='2.3.4', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From c70684ea25c88332c2790b704682b54b3f86e702 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sun, 22 Dec 2024 15:00:47 +0800 Subject: [PATCH 1844/2116] update to gradle v8.12 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 5163a812..b68e1927 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -207,6 +207,7 @@ get_sha() { '8.10.2') echo '31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26' ;; '8.11') echo '57dafb5c2622c6cc08b993c85b7c06956a2f53536432a30ead46166dbca0f1e9' ;; '8.11.1') echo 'f397b287023acdba1e9f6fc5ea72d22dd63669d59ed4a289a29b1a76eee151c6' ;; + '8.12') echo '7a00d51fb93147819aab76024feece20b6b84e420694101f276be952e08bef03' ;; *) exit 1 esac } @@ -227,7 +228,7 @@ d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2 7.1 7.0 4.2 4.1 4.0 3.6 d_plugin_min_gradle_v=(8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.12 8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 20caa6fa1c24e9569ee15d76aa0f05fb9a3c283d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 15 Jan 2025 14:41:53 +0100 Subject: [PATCH 1845/2116] match the full file name when looking for the v1 signature block ZipFile.namelist() produces a string per file. The filename could contain newline chars, including at the beginning and end. ^$ in regex matches around newline chars. \A\Z matches the beginning/end of the full string. This is exactly the same as obfusk's r'\AMETA-INF/(?s:.)*\.(DSA|EC|RSA)\Z' but in a readable format that is also easily searchable, and standard for this code base. https://github.com/obfusk/fdroid-fakesigner-poc/blob/master/fdroidserver-regex.patch #1251 --- fdroidserver/common.py | 2 +- tests/test_common.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 5f812206..bf58433d 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -94,7 +94,7 @@ MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION = '30.0.0' VERCODE_OPERATION_RE = re.compile(r'^([ 0-9/*+-]|%c)+$') # A signature block file with a .DSA, .RSA, or .EC extension -SIGNATURE_BLOCK_FILE_REGEX = re.compile(r'^META-INF/.*\.(DSA|EC|RSA)$') +SIGNATURE_BLOCK_FILE_REGEX = re.compile(r'\AMETA-INF/.*\.(DSA|EC|RSA)\Z', re.DOTALL) APK_NAME_REGEX = re.compile(r'^([a-zA-Z][\w.]*)_(-?[0-9]+)_?([0-9a-f]{7})?\.apk') APK_ID_TRIPLET_REGEX = re.compile(r"^package: name='(\w[^']*)' versionCode='([^']+)' versionName='([^']*)'") STANDARD_FILE_NAME_REGEX = re.compile(r'^(\w[\w.]*)_(-?[0-9]+)\.\w+') diff --git a/tests/test_common.py b/tests/test_common.py index 4ae55c73..144a61b0 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -3253,6 +3253,34 @@ class SignerExtractionTest(unittest.TestCase): fdroidserver.common.signer_fingerprint(v3_certs[0]), ) + def test_signature_block_file_regex(self): + for apkpath, fingerprint in APKS_WITH_JAR_SIGNATURES: + with ZipFile(apkpath, 'r') as apk: + cert_files = [ + n + for n in apk.namelist() + if fdroidserver.common.SIGNATURE_BLOCK_FILE_REGEX.match(n) + ] + self.assertEqual(1, len(cert_files)) + + def test_signature_block_file_regex_malicious(self): + apkpath = os.path.join(self.testdir, 'malicious.apk') + with ZipFile(apkpath, 'w') as apk: + apk.writestr('META-INF/MANIFEST.MF', 'this is fake sig data') + apk.writestr('META-INF/CERT.SF\n', 'this is fake sig data') + apk.writestr('META-INF/AFTER.SF', 'this is fake sig data') + apk.writestr('META-INF/CERT.RSA\n', 'this is fake sig data') + apk.writestr('META-INF/AFTER.RSA', 'this is fake sig data') + with ZipFile(apkpath, 'r') as apk: + self.assertEqual( + ['META-INF/AFTER.RSA'], + [ + n + for n in apk.namelist() + if fdroidserver.common.SIGNATURE_BLOCK_FILE_REGEX.match(n) + ], + ) + class ConfigOptionsScopeTest(unittest.TestCase): """Test assumptions about variable scope for "config" and "options". From f5a6aa2cbf52226c8d4791403549f9858d2950fb Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 15 Jan 2025 15:07:24 +0100 Subject: [PATCH 1846/2116] bandit no longer includes B410 lxml check https://github.com/PyCQA/bandit/pull/1212 --- .bandit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bandit b/.bandit index cc5017da..3dc1625b 100644 --- a/.bandit +++ b/.bandit @@ -1,3 +1,3 @@ [bandit] -skips: B110,B404,B408,B410,B603,B607 +skips: B110,B404,B408,B603,B607 targets: . From 5b1b1d12a1f0ce394ba68647c70835adc407a0c2 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 16 May 2024 11:53:00 +0200 Subject: [PATCH 1847/2116] verify: handle corrupt verified.json verified.json can get quite large on verification.f-droid.org, and for some unknown reason, it sometimes corrupts it when writing it out. All the data is already available in all the other JSON files, so this just automatically reconstructs it. Its a hack, but it took me much less time than I've already spent trying to troubleshoot why it writes out corrupt verified.json. --- fdroidserver/verify.py | 31 +++++++++++++---- tests/org.fdroid.fdroid_1019051.apk.json | 43 ++++++++++++++++++++++++ tests/test_verify.py | 43 ++++++++++++++++++++++++ 3 files changed, 111 insertions(+), 6 deletions(-) create mode 100644 tests/org.fdroid.fdroid_1019051.apk.json diff --git a/fdroidserver/verify.py b/fdroidserver/verify.py index 9ed46407..63540147 100644 --- a/fdroidserver/verify.py +++ b/fdroidserver/verify.py @@ -80,6 +80,30 @@ def _add_diffoscope_info(d): pass +def get_verified_json(path): + """Get the full collection of reports that is written out to verified.json.""" + if os.path.exists(path): + try: + with open(path) as fp: + return json.load(fp) + except Exception as e: + logging.info(f'{path}: {e}') + + data = OrderedDict() + data['packages'] = OrderedDict() + + for f in glob.glob(os.path.join(os.path.dirname(path), '*.apk.json')): + with open(f) as fp: + reports = json.load(fp) + for report in reports.values(): + packageName = report['local']['packageName'] + if packageName not in data['packages']: + data['packages'][packageName] = [] + data['packages'][packageName].append(report) + + return data + + def write_json_report(url, remote_apk, unsigned_apk, compare_result): """Write out the results of the verify run to JSON. @@ -122,12 +146,7 @@ def write_json_report(url, remote_apk, unsigned_apk, compare_result): if output['verified']: jsonfile = 'unsigned/verified.json' - if os.path.exists(jsonfile): - with open(jsonfile) as fp: - data = json.load(fp) - else: - data = OrderedDict() - data['packages'] = OrderedDict() + data = get_verified_json(jsonfile) packageName = output['local']['packageName'] if packageName not in data['packages']: diff --git a/tests/org.fdroid.fdroid_1019051.apk.json b/tests/org.fdroid.fdroid_1019051.apk.json new file mode 100644 index 00000000..e71c1704 --- /dev/null +++ b/tests/org.fdroid.fdroid_1019051.apk.json @@ -0,0 +1,43 @@ +{ + "1708238023.6572325": { + "diffoscope": { + "Available-in-Debian-packages": [ + "coreboot-utils", + "ghc", + "libxmlb-dev", + "radare2" + ], + "External-Tools-Required": [ + "cbfstool", + "ghc", + "lipo", + "otool", + "radare2", + "xb-tool" + ], + "Missing-Python-Modules": [ + "pypdf", + "r2pipe" + ], + "VERSION": "240" + }, + "local": { + "file": "unsigned/org.fdroid.fdroid_1019051.apk", + "packageName": "org.fdroid.fdroid", + "sha256": "0eec78236ec5ebb8f416c611717bd659b75d2b6600ef71a50c922efc99dbdca2", + "timestamp": 1708238023.6572325, + "versionCode": 1019051, + "versionName": "1.19.1" + }, + "remote": { + "file": "tmp/org.fdroid.fdroid_1019051.apk", + "packageName": "org.fdroid.fdroid", + "sha256": "162cb14b93bd9b665fff4256b4fc91cfe75fb72335a02b1d0febe606220b50f4", + "timestamp": 1715356428.522411, + "versionCode": 1019051, + "versionName": "1.19.1" + }, + "url": "https://f-droid.org/repo/org.fdroid.fdroid_1019051.apk", + "verified": true + } +} diff --git a/tests/test_verify.py b/tests/test_verify.py index 041fc82c..30fde2ef 100755 --- a/tests/test_verify.py +++ b/tests/test_verify.py @@ -44,10 +44,53 @@ class VerifyTest(unittest.TestCase): os.chdir(self.tempdir.name) self.repodir = Path('repo') self.repodir.mkdir() + self.apk_reports_json = basedir / 'org.fdroid.fdroid_1019051.apk.json' def tearDown(self): self.tempdir.cleanup() + def test_get_verified_json_creation(self): + self.assertEqual({'packages': {}}, verify.get_verified_json('does-not-exist')) + + def test_get_verified_json_existing(self): + f = 'verified.json' + reports = {'packages': {'placeholder': {}}} + with open(f, 'w') as fp: + json.dump(reports, fp) + self.assertEqual(reports, verify.get_verified_json(f)) + + def test_get_verified_json_pull_in_one_report(self): + shutil.copy(self.apk_reports_json, self.tempdir.name) + with open(self.apk_reports_json) as fp: + reports = json.load(fp) + self.assertEqual( + {'packages': {'org.fdroid.fdroid': [reports['1708238023.6572325']]}}, + verify.get_verified_json('does-not-exist'), + ) + + def test_get_verified_json_ignore_corrupt(self): + f = 'verified.json' + with open(f, 'w') as fp: + fp.write("""{"packages": {"placeholder": {""") + shutil.copy(self.apk_reports_json, self.tempdir.name) + with open(self.apk_reports_json) as fp: + reports = json.load(fp) + self.assertEqual( + {'packages': {'org.fdroid.fdroid': [reports['1708238023.6572325']]}}, + verify.get_verified_json(f), + ) + + def test_get_verified_json_ignore_apk_reports(self): + """When an intact verified.json exists, it should ignore the .apk.json reports.""" + f = 'verified.json' + placeholder = {'packages': {'placeholder': {}}} + with open(f, 'w') as fp: + json.dump(placeholder, fp) + shutil.copy(self.apk_reports_json, self.tempdir.name) + with open(self.apk_reports_json) as fp: + json.load(fp) + self.assertEqual(placeholder, verify.get_verified_json(f)) + @patch('fdroidserver.common.sha256sum') def test_write_json_report(self, sha256sum): sha256sum.return_value = ( From 89a282c12edbf43c8a647609cc4676a8667b5468 Mon Sep 17 00:00:00 2001 From: Simon Chopin Date: Thu, 16 Jan 2025 19:39:01 +0100 Subject: [PATCH 1848/2116] test_net: figure out the proper IP protocol for localhost On some systems, localhost is only defined for 127.0.0.1 (e.g. Ubuntu and Debian containers). However, there is code that hardcodes possible values for localhost, making it possible to open an IPv6 socket for localhost. On those systems, the socket will be open but urllib3 will resolve localhost *only* to 127.0.0.1, thus failing miserably to connect. To resolve the situation, rather than defaulting to IPv6 we actually resolve localhost and use the socket family of the first result. On my current system (upcoming Ubuntu Plucky) if localhost=::1 is defined in /etc/hosts it will come up as the first result, if not 127.0.0.1 will. V2: Use self.port rather than a forgotten hardcoded port. Fixes: f01628ca6b1b "fix localhost network tests on systems with IPv6" --- tests/test_net.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/tests/test_net.py b/tests/test_net.py index 5084474d..581edcfb 100755 --- a/tests/test_net.py +++ b/tests/test_net.py @@ -38,12 +38,9 @@ class RetryServer: def run_fake_server(self): addr = ('localhost', self.port) - if socket.has_dualstack_ipv6(): - server_sock = socket.create_server( - addr, family=socket.AF_INET6, dualstack_ipv6=True - ) - else: - server_sock = socket.create_server(addr) + # localhost might not be a valid name for all families, use the first available + family = socket.getaddrinfo(addr[0], addr[1], type=socket.SOCK_STREAM)[0][0] + server_sock = socket.create_server(addr, family=family) server_sock.listen(5) server_sock.settimeout(5) time.sleep(0.001) # wait for it to start From 3000cfcd04ffbcaeecdadbf942920ca466eb7776 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 20 Jan 2025 14:14:19 +0100 Subject: [PATCH 1849/2116] pick-complete-translations.py: auto cherry-pick complete langs --- dev/fdroid_scan-binary.py | 38 +++++++++++++++++++++++ locale/pick-complete-translations.py | 45 ++++++++++++++++++++++++---- 2 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 dev/fdroid_scan-binary.py diff --git a/dev/fdroid_scan-binary.py b/dev/fdroid_scan-binary.py new file mode 100644 index 00000000..896c2cc4 --- /dev/null +++ b/dev/fdroid_scan-binary.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +# +# an fdroid plugin for setting up srclibs +# +# The 'fdroid build' gitlab-ci job uses --on-server, which does not +# set up the srclibs. This plugin does the missing setup. + +import glob +import os +from argparse import ArgumentParser +from fdroidserver import _, common, scanner + + +fdroid_summary = 'Run scanner.scan_binary on APKs' + + +def main(): + parser = ArgumentParser() + common.setup_global_opts(parser) + parser.add_argument("APK", nargs='*', help=_("Path to a signed or unsigned APK.")) + options = common.parse_args(parser) + common.read_config() + if options.APK: + apks = options.APK + else: + apks = glob.glob(os.path.join('unsigned', '*.apk')) + + errors = 0 + for apk in apks: + print('Scanning', apk, '...') + if scanner.scan_binary(apk): + print("ERROR: Found blocklisted packages in:", apk) + errors += 1 + exit(errors) + + +if __name__ == "__main__": + main() diff --git a/locale/pick-complete-translations.py b/locale/pick-complete-translations.py index a866a231..6712663e 100755 --- a/locale/pick-complete-translations.py +++ b/locale/pick-complete-translations.py @@ -2,6 +2,7 @@ # # add completed translations from weblate to MANIFEST.in +import git import json import os import re @@ -37,14 +38,41 @@ for locale in sorted(data, key=lambda locale: locale['code']): manifest_file = os.path.join(projectbasedir, 'MANIFEST.in') with open(manifest_file) as fp: - for line in fp.readlines(): - m = re.match(r'include locale/([^/]+)/.*', line) - if m: - active.add(m.group(1)) + manifest_in = fp.read() +for m in re.findall(r'include locale/([^/]+)/LC_MESSAGES/fdroidserver.po', manifest_in): + active.add(m) +repo = git.Repo(projectbasedir) +weblate = repo.remotes.weblate +weblate.fetch() +upstream = repo.remotes.upstream +upstream.fetch() + +if 'merge_weblate' in repo.heads: + merge_weblate = repo.heads['merge_weblate'] + repo.create_tag( + 'previous_merge_weblate', + ref=merge_weblate, + message=('Automatically created by %s' % __file__), + ) +else: + merge_weblate = repo.create_head('merge_weblate') +merge_weblate.set_commit(upstream.refs.master) +merge_weblate.checkout() + +active = sorted(active) manifest_lines = set() for locale in active: - manifest_lines.add('include locale/%s/LC_MESSAGES/fdroidserver.po\n' % locale) + po_file = f'locale/{locale}/LC_MESSAGES/fdroidserver.po' + manifest_lines.add(f'include {po_file}\n') + for commit in repo.iter_commits( + str(weblate.refs.master) + '...' + str(upstream.refs.master), + paths=[po_file], + max_count=10, + reverse=True, + ): + print(f'{locale}: git cherry-pick', commit) + repo.git.cherry_pick(commit) with open(manifest_file, 'a') as fp: for line in manifest_lines: @@ -52,3 +80,10 @@ with open(manifest_file, 'a') as fp: fp.write(line) subprocess.run(['sort', '-u', '-o', manifest_file, manifest_file]) + +print('\tIf all else fails, try:') +print('\tgit checkout -B merge_weblate weblate/master') +print('\tgit rebase -i upstream/master') +print('\t# select all in editor and cut all commit lines') +print('\twl-paste | grep -Eo ".* \((%s)\) .*" | wl-copy' % '|'.join(active)) +print('\t# paste into editor, and make rebase\n') From 8831217ca1102922b259cc2e7c6a809efb2d353f Mon Sep 17 00:00:00 2001 From: pitroig Date: Wed, 15 Jan 2025 16:19:09 +0100 Subject: [PATCH 1850/2116] Translated using Weblate: Catalan (ca) by pitroig Currently translated at 100.0% (612 of 612 strings) Co-authored-by: pitroig Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ca/ Translation: F-Droid/F-Droid Server --- locale/ca/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index 7b8a4347..022fecd6 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # Rubén , 2023. -# pitroig , 2024. +# pitroig , 2024, 2025. # raulmagdalena <4omoald1a@mozmail.com>, 2024. # Adrià Martín , 2024. # unmes , 2024. @@ -12,15 +12,15 @@ msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" -"PO-Revision-Date: 2024-11-27 18:26+0000\n" -"Last-Translator: Ecron \n" +"PO-Revision-Date: 2025-01-03 17:37+0000\n" +"Last-Translator: pitroig \n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.9-dev\n" +"X-Generator: Weblate 5.10-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -1514,7 +1514,7 @@ msgstr "Actualitza i cau les regles de l'escàner i les signatures de la xarxa" #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." -msgstr "" +msgstr "Elimina el fitxer tar d'origen i qualsevol APKs si s'ha verificat correctament." #: ../fdroidserver/common.py msgid "Removing specified files" From c1f0914476ee4f0cc563fcacafc5eb5c9d524568 Mon Sep 17 00:00:00 2001 From: Fjuro Date: Wed, 15 Jan 2025 16:19:05 +0100 Subject: [PATCH 1851/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 100.0% (612 of 612 strings) Co-authored-by: Fjuro Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ Translation: F-Droid/F-Droid Server --- locale/cs/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 58346934..5630e486 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -13,7 +13,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" -"PO-Revision-Date: 2024-11-23 18:58+0000\n" +"PO-Revision-Date: 2024-12-12 01:41+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" @@ -1517,7 +1517,7 @@ msgstr "Obnovit a uložit pravidla a podpisy skeneru ze sítě do mezipaměti" #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." -msgstr "" +msgstr "Odstranit zdrojový tarball a všechny soubory APK při úspěšném ověření." #: ../fdroidserver/common.py msgid "Removing specified files" From 6e0b9c94b2d5299a08d5a64dddcf2ce071bcada1 Mon Sep 17 00:00:00 2001 From: VfBFan Date: Wed, 15 Jan 2025 16:19:06 +0100 Subject: [PATCH 1852/2116] Translated using Weblate: German (de) by VfBFan Currently translated at 100.0% (612 of 612 strings) Co-authored-by: VfBFan Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 3d2228bb..67813758 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -15,7 +15,7 @@ # fossdd , 2021. # Ceeee , 2021. # C. Rüdinger , 2021, 2022. -# VfBFan , 2021, 2023. +# VfBFan , 2021, 2023, 2024. # Roman Leo , 2021. # Follpvosten , 2021. # ssantos , 2022, 2023, 2024. @@ -27,8 +27,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" -"PO-Revision-Date: 2024-12-03 09:22+0000\n" -"Last-Translator: VfBFan \n" +"PO-Revision-Date: 2024-12-12 14:43+0000\n" +"Last-Translator: VfBFan \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -1529,7 +1529,7 @@ msgstr "Aktualisieren und Zwischenspeichern von Scannerregeln und Signaturen aus #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." -msgstr "" +msgstr "Den Quell-Tarball und alle APKs entfernen, wenn sie erfolgreich verifiziert wurden." #: ../fdroidserver/common.py msgid "Removing specified files" From 11574b717e4f3e67ffc2f3c356efb5ee16cb30b9 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Wed, 15 Jan 2025 16:19:07 +0100 Subject: [PATCH 1853/2116] Translated using Weblate: Spanish (es) by gallegonovato Currently translated at 100.0% (612 of 612 strings) Co-authored-by: gallegonovato Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ Translation: F-Droid/F-Droid Server --- locale/es/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 139f6dc3..de4b0893 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -18,7 +18,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" -"PO-Revision-Date: 2024-11-21 23:18+0000\n" +"PO-Revision-Date: 2024-12-20 13:00+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" "Language: es\n" @@ -26,7 +26,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.9-dev\n" +"X-Generator: Weblate 5.9.2-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -1520,7 +1520,7 @@ msgstr "Actualización y almacenamiento en caché de las reglas y firmas del esc #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." -msgstr "" +msgstr "Elimine el archivo tar de origen y todos los APK si se verifican correctamente." #: ../fdroidserver/common.py msgid "Removing specified files" From eb616643c47bcf477401e78013f2435f26acdc60 Mon Sep 17 00:00:00 2001 From: Sylvain Pichon Date: Wed, 15 Jan 2025 16:19:07 +0100 Subject: [PATCH 1854/2116] Translated using Weblate: French (fr) by Sylvain Pichon Currently translated at 96.5% (591 of 612 strings) Translated using Weblate: French (fr) by Sylvain Pichon Currently translated at 95.7% (586 of 612 strings) Co-authored-by: Sylvain Pichon Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 34f3b19a..8109d679 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -45,15 +45,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" -"PO-Revision-Date: 2024-11-27 13:22+0000\n" -"Last-Translator: Ldm Public \n" +"PO-Revision-Date: 2024-12-29 07:26+0000\n" +"Last-Translator: Sylvain Pichon \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.9-dev\n" +"X-Generator: Weblate 5.10-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -906,7 +906,7 @@ msgstr "Plusieurs fichiers de bloc de signature JAR trouvé à {path}" #: ../fdroidserver/common.py #, fuzzy msgid "Found multiple Signer Certificates!" -msgstr "Plusieurs signataires de certificats ont été trouvés !" +msgstr "Plusieurs certificats de signatures ont été trouvés !" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1201,7 +1201,7 @@ msgstr "Lister les fichiers qui seront reformater (test à blanc)" #: ../fdroidserver/lint.py msgid "Locale included in f-droid.org URL" -msgstr "Les paramètres de lieu sont inclus dans f-droid.org URL" +msgstr "Les paramètres de localisation sont inclus dans l'URL f-droid.org" #: ../fdroidserver/build.py msgid "Make the build stop on exceptions" @@ -1328,7 +1328,6 @@ msgid "No unsigned directory - nothing to do" msgstr "Aucun dossier non signé — il n'y a rien à faire" #: ../fdroidserver/__main__.py -#, fuzzy msgid "No version information could be found." msgstr "Aucune information sur la version n’a été trouvée." @@ -1459,9 +1458,9 @@ msgid "Print the secret variable to the terminal for easy copy/paste" msgstr "Afficher la variable secrète dans le terminal pour un copier/coller facilité" #: ../fdroidserver/install.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "Le mode de confidentialité a été activé, dû à votre position ({country_code})." +msgstr "Le mode de confidentialité a été activé, dû à votre localisation ({country_code})." #: ../fdroidserver/scanner.py #, python-format @@ -1546,7 +1545,6 @@ msgid "Reading {apkfilename} from cache" msgstr "Lecture de {apkfilename} à partir du cache" #: ../fdroidserver/build.py -#, fuzzy msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Actualisation et mise en cache des règles et signature à partir du réseau." @@ -1589,9 +1587,9 @@ msgid "Restrict output to warnings and errors" msgstr "Limiter la sortie aux avertissements et aux erreurs" #: ../fdroidserver/net.py -#, fuzzy, python-format +#, python-format msgid "Retrying failed download: %s" -msgstr "Réessaie de téléchargement échoué : %s" +msgstr "Nouvel essai de téléchargement suite à échec : %s" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1818,7 +1816,6 @@ msgid "These are the apps that have been archived from the main repo." msgstr "Voici les applications qui ont été archivées à partir du dépôt principal." #: ../fdroidserver/mirror.py -#, fuzzy msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." msgstr "Cette commande ne devrait jamais être utilisée pour copier f-droid.org ! Une copie occupe plus de 600GB." From 7720402d72d3a5d65d27894477ba1e5ef505dc00 Mon Sep 17 00:00:00 2001 From: Armand Camponovo Date: Wed, 15 Jan 2025 16:19:08 +0100 Subject: [PATCH 1855/2116] Translated using Weblate: French (fr) by Armand Camponovo Currently translated at 96.7% (592 of 612 strings) Co-authored-by: Armand Camponovo Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 8109d679..3583ce22 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -40,13 +40,14 @@ # Sylvain Pichon , 2024. # Sylvain Pichon , 2024. # Lzebulon , 2024. +# Armand Camponovo , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" -"PO-Revision-Date: 2024-12-29 07:26+0000\n" -"Last-Translator: Sylvain Pichon \n" +"PO-Revision-Date: 2024-12-31 00:24+0000\n" +"Last-Translator: Armand Camponovo \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -904,7 +905,6 @@ msgid "Found multiple JAR Signature Block Files in {path}" msgstr "Plusieurs fichiers de bloc de signature JAR trouvé à {path}" #: ../fdroidserver/common.py -#, fuzzy msgid "Found multiple Signer Certificates!" msgstr "Plusieurs certificats de signatures ont été trouvés !" @@ -975,7 +975,7 @@ msgstr "Reset de Git échouée" #: ../fdroidserver/common.py #, fuzzy msgid "Git submodule deinit failed" -msgstr "Échec de la mise à jour du sous-module Git" +msgstr "Échec de la suppression du sous-module Git" #: ../fdroidserver/common.py msgid "Git submodule sync failed" From f78492e8ad6cbbb289c745d6ad4e2cfc00fbb9aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Wed, 15 Jan 2025 16:19:06 +0100 Subject: [PATCH 1856/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Irish?= =?UTF-8?q?=20(ga)=20by=20Aindri=C3=BA=20Mac=20Giolla=20Eoin=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (612 of 612 strings) Co-authored-by: Aindriú Mac Giolla Eoin Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ga/ Translation: F-Droid/F-Droid Server --- locale/ga/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/ga/LC_MESSAGES/fdroidserver.po b/locale/ga/LC_MESSAGES/fdroidserver.po index dbb2d62f..2dfdf797 100644 --- a/locale/ga/LC_MESSAGES/fdroidserver.po +++ b/locale/ga/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.3a1-162-gfbb3cc59\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" -"PO-Revision-Date: 2024-11-22 21:03+0000\n" +"PO-Revision-Date: 2024-12-14 19:00+0000\n" "Last-Translator: Aindriú Mac Giolla Eoin \n" "Language-Team: Irish \n" "Language: ga\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :(n>6 && n<11) ? 3 : 4;\n" -"X-Generator: Weblate 5.9-dev\n" +"X-Generator: Weblate 5.9-rc\n" #: ../fdroidserver/nightly.py msgid "" @@ -1514,7 +1514,7 @@ msgstr "Athnuaigh agus cuir rialacha agus sínithe scanóirí taisce ón líonra #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." -msgstr "" +msgstr "Bain tarball foinse agus aon APKanna má fhíoraítear go rathúil é." #: ../fdroidserver/common.py msgid "Removing specified files" From d742fc4f65029318a60e9d49751f421b9de18464 Mon Sep 17 00:00:00 2001 From: Liner Seven Date: Wed, 15 Jan 2025 16:19:05 +0100 Subject: [PATCH 1857/2116] Translated using Weblate: Japanese (ja) by Liner Seven Currently translated at 100.0% (612 of 612 strings) Co-authored-by: Liner Seven Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ja/ Translation: F-Droid/F-Droid Server --- locale/ja/LC_MESSAGES/fdroidserver.po | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 3c42ac50..c6411cba 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -3,13 +3,14 @@ # Hinaloe , 2020. # Suguru Hirahara , 2024. # "Shuuji TAKAHASHI (shuuji3)" , 2024. +# Liner Seven , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" -"PO-Revision-Date: 2024-11-28 08:34+0000\n" -"Last-Translator: \"Shuuji TAKAHASHI (shuuji3)\" \n" +"PO-Revision-Date: 2024-12-12 01:41+0000\n" +"Last-Translator: Liner Seven \n" "Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" @@ -1508,7 +1509,7 @@ msgstr "スキャナーのルールと署名をネットワークから取得し #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." -msgstr "" +msgstr "検証成功時にソースのTAR・APKを削除する。" #: ../fdroidserver/common.py msgid "Removing specified files" From 787612b93f1e4ca662c46fbf84964ffb464b68b1 Mon Sep 17 00:00:00 2001 From: LucasMZ Date: Wed, 15 Jan 2025 16:19:08 +0100 Subject: [PATCH 1858/2116] Translated using Weblate: Portuguese (Brazil) (pt_BR) by LucasMZ Currently translated at 100.0% (612 of 612 strings) Co-authored-by: LucasMZ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/ Translation: F-Droid/F-Droid Server --- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 36fcbaac..b0bc4d2e 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -19,15 +19,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" -"PO-Revision-Date: 2024-11-25 13:28+0000\n" -"Last-Translator: dedakir923 \n" +"PO-Revision-Date: 2024-12-24 01:00+0000\n" +"Last-Translator: LucasMZ \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.9-dev\n" +"X-Generator: Weblate 5.10-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -1521,7 +1521,7 @@ msgstr "Atualizar e armazenar em cache regras e assinaturas do scanner da rede" #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." -msgstr "" +msgstr "Remover pacote de código-fonte e qualquer APK se verificado com sucesso." #: ../fdroidserver/common.py msgid "Removing specified files" From a3f9b244d9d54969216a4688c493f1eee863601d Mon Sep 17 00:00:00 2001 From: ssantos Date: Wed, 15 Jan 2025 16:19:09 +0100 Subject: [PATCH 1859/2116] Translated using Weblate: Portuguese (Portugal) (pt_PT) by ssantos Currently translated at 100.0% (612 of 612 strings) Co-authored-by: ssantos Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_PT/ Translation: F-Droid/F-Droid Server --- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 33e98ccc..499a312e 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -2,7 +2,7 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Manuela Silva , 2020. -# ssantos , 2020, 2021, 2022, 2023, 2024. +# ssantos , 2020, 2021, 2022, 2023, 2024, 2025. # Hans-Christoph Steiner , 2020, 2022, 2024. # Peter J. Mello , 2021. # Fat Potato , 2024. @@ -12,15 +12,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" -"PO-Revision-Date: 2024-11-26 10:54+0000\n" -"Last-Translator: Hugo Carvalho \n" +"PO-Revision-Date: 2025-01-03 06:49+0000\n" +"Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" "Language: pt_PT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.9-dev\n" +"X-Generator: Weblate 5.10-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -1514,7 +1514,7 @@ msgstr "Atualizar e armazenar as regras e assinaturas do scanner da rede no cach #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." -msgstr "" +msgstr "Remover tarball de código-fonte e todos APKs se for verificado com sucesso." #: ../fdroidserver/common.py msgid "Removing specified files" From 89f44e0fed7e643c2fda14366de24a9bd1ceffc2 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 15 Jan 2025 16:19:06 +0100 Subject: [PATCH 1860/2116] Translated using Weblate: Russian (ru) by Dmitry Currently translated at 100.0% (612 of 612 strings) Co-authored-by: Dmitry Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translation: F-Droid/F-Droid Server --- locale/ru/LC_MESSAGES/fdroidserver.po | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 37b845c4..2f1d0c4b 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -15,13 +15,14 @@ # Alexander Ivanov , 2024. # gfbdrgng , 2024. # neverender , 2024. +# Dmitry , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" -"PO-Revision-Date: 2024-12-02 17:00+0000\n" -"Last-Translator: Golubev Alexander \n" +"PO-Revision-Date: 2024-12-13 11:33+0000\n" +"Last-Translator: Dmitry \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" @@ -1524,7 +1525,7 @@ msgstr "Обновление и кэширование правил и сигн #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." -msgstr "" +msgstr "Удалите исходный tar-архив и все APK-файлы, если проверка прошла успешно." #: ../fdroidserver/common.py msgid "Removing specified files" From a9404dbb4240609433cb1893768e44cdf8109c19 Mon Sep 17 00:00:00 2001 From: Golubev Alexander Date: Wed, 15 Jan 2025 16:19:07 +0100 Subject: [PATCH 1861/2116] Translated using Weblate: Russian (ru) by Golubev Alexander Currently translated at 100.0% (612 of 612 strings) Co-authored-by: Golubev Alexander Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translation: F-Droid/F-Droid Server --- locale/ru/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 2f1d0c4b..ac7503ed 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -21,15 +21,15 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" -"PO-Revision-Date: 2024-12-13 11:33+0000\n" -"Last-Translator: Dmitry \n" +"PO-Revision-Date: 2024-12-16 21:18+0000\n" +"Last-Translator: Golubev Alexander \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.9-dev\n" +"X-Generator: Weblate 5.9\n" #: ../fdroidserver/nightly.py msgid "" @@ -1525,7 +1525,7 @@ msgstr "Обновление и кэширование правил и сигн #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." -msgstr "Удалите исходный tar-архив и все APK-файлы, если проверка прошла успешно." +msgstr "Удалить tar-архив с исходным кодом и все APK-файлы, если проверка для них прошла успешно." #: ../fdroidserver/common.py msgid "Removing specified files" From 49d18e494bef909bc2459509b1f725f35487480e Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 15 Jan 2025 16:19:09 +0100 Subject: [PATCH 1862/2116] Translated using Weblate: Russian (ru) by Andrey Currently translated at 100.0% (612 of 612 strings) Co-authored-by: Andrey Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translation: F-Droid/F-Droid Server --- locale/ru/LC_MESSAGES/fdroidserver.po | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index ac7503ed..a6b97c19 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -3,7 +3,7 @@ # Golubev Alexander , 2020, 2021, 2024. # Mingun , 2020. # anonymous , 2020. -# Andrey , 2020, 2021, 2022, 2023. +# Andrey , 2020, 2021, 2022, 2023, 2025. # gardenapple , 2020. # Boris Timofeev , 2020. # Hans-Christoph Steiner , 2020. @@ -21,15 +21,15 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" -"PO-Revision-Date: 2024-12-16 21:18+0000\n" -"Last-Translator: Golubev Alexander \n" +"PO-Revision-Date: 2025-01-08 16:30+0000\n" +"Last-Translator: Andrey \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.9\n" +"X-Generator: Weblate 5.10-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -466,7 +466,7 @@ msgstr "Зафиксировать изменения (commit)" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "Зафиксировать изменения (commit), отправить (push) их в удалённый репозиторий, и затем создать запрос на слияние" +msgstr "Зафиксировать изменения (commit), отправить (push) их в удаленный репозиторий, и затем создать запрос на слияние" #: ../fdroidserver/metadata.py #, python-brace-format @@ -745,7 +745,7 @@ msgstr "Переменная среды {var} из {configname} не устан #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" -msgstr "Ошибка развёртывания 'github_releases', {} отсутствует. (Возможно, сначала вам нужно запустить `fdroid update`.)" +msgstr "Ошибка развертывания 'github_releases', {} отсутствует. (Возможно, сначала вам нужно запустить `fdroid update`.)" #: ../fdroidserver/import_subcommand.py msgid "Error while getting repo address" @@ -2031,7 +2031,7 @@ msgstr "Для конфигурации s3cmd используется \"{path}\ #: ../fdroidserver/deploy.py #, python-brace-format msgid "Using \"{path}\" for syncing with remote storage." -msgstr "Для синхронизации с удалённым хранилищем используется путь \"{path}\"." +msgstr "Для синхронизации с удаленным хранилищем используется путь \"{path}\"." #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -2645,7 +2645,7 @@ msgstr "s3cmd синхронизировать индексы из {path} в {ur #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "s3cmd синхронизирует индексы из {path} в {url} и удаляет стёртые" +msgstr "s3cmd синхронизирует индексы из {path} в {url} и удаляет стертые" #: ../fdroidserver/scanner.py #, python-brace-format From d969181b553088359db7e55aaf78b83f5ffd858d Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Wed, 15 Jan 2025 16:19:06 +0100 Subject: [PATCH 1863/2116] Translated using Weblate: Albanian (sq) by Besnik Bleta Currently translated at 97.7% (598 of 612 strings) Co-authored-by: Besnik Bleta Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/ Translation: F-Droid/F-Droid Server --- locale/sq/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index 0021e40a..ca151930 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" -"PO-Revision-Date: 2024-11-22 05:58+0000\n" +"PO-Revision-Date: 2024-12-12 14:43+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" "Language: sq\n" @@ -1509,7 +1509,7 @@ msgstr "Rifresko dhe ruaj në fshehtinë rregulla skaneri nga rrjeti" #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." -msgstr "" +msgstr "Hiqni paketimin e burimit dhe çfarëdo APK-sh, nëse verifikimi është i suksesshëm." #: ../fdroidserver/common.py msgid "Removing specified files" @@ -2627,7 +2627,7 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "" +msgstr "s3cmd njëkohëson tregues nga {path} te {url} dhe fshin të hequrit" #: ../fdroidserver/scanner.py #, python-brace-format From 06eb722b135447539d1e6cf2adebe90d54321cab Mon Sep 17 00:00:00 2001 From: Reno Tx Date: Wed, 15 Jan 2025 16:19:08 +0100 Subject: [PATCH 1864/2116] Translated using Weblate: Serbian (sr) by Reno Tx Currently translated at 100.0% (612 of 612 strings) Co-authored-by: Reno Tx Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sr/ Translation: F-Droid/F-Droid Server --- locale/sr/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index 8ef674d3..86b57405 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" -"PO-Revision-Date: 2024-11-29 10:00+0000\n" +"PO-Revision-Date: 2024-12-30 22:00+0000\n" "Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" "Language: sr\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.9-dev\n" +"X-Generator: Weblate 5.10-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -1513,7 +1513,7 @@ msgstr "Освежите и кеширајте правила и потписе #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." -msgstr "" +msgstr "Уклони изворни tarball и све APK-ове ако су успешно проверени." #: ../fdroidserver/common.py msgid "Removing specified files" From eecfcbe547ac3f059f32e7ff7f9520205eab6f55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=93=D0=BE=D1=80?= =?UTF-8?q?=D0=BF=D0=B8=D0=BD=D1=96=D1=87?= Date: Wed, 15 Jan 2025 16:19:07 +0100 Subject: [PATCH 1865/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Ukrai?= =?UTF-8?q?nian=20(uk)=20by=20=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20?= =?UTF-8?q?=D0=93=D0=BE=D1=80=D0=BF=D0=B8=D0=BD=D1=96=D1=87=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (612 of 612 strings) Co-authored-by: Максим Горпиніч Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 47 ++++++++++++++------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index f557da71..8eceb428 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -11,20 +11,21 @@ # Tymofii Lytvynenko , 2024. # Fqwe1 , 2024. # Nazar , 2024. +# Максим Горпиніч , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" -"PO-Revision-Date: 2024-09-13 23:35+0000\n" -"Last-Translator: Ihor Hordiichuk \n" +"PO-Revision-Date: 2024-12-20 13:00+0000\n" +"Last-Translator: Максим Горпиніч \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.9.2-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -212,7 +213,7 @@ msgstr "'{value}' не є дійсним {field}, має бути {pattern}" #: ../fdroidserver/checkupdates.py msgid "--merge-request only runs on a single appid!" -msgstr "" +msgstr "--merge-request працює лише в одній програмі!" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -343,11 +344,11 @@ msgstr "AutoUpdateMode з UpdateCheckMode: HTTP повинен мати шабл #: ../fdroidserver/install.py msgid "Automatic no to all prompts." -msgstr "" +msgstr "Автоматичне ні для всіх підказок." #: ../fdroidserver/install.py msgid "Automatic yes to all prompts." -msgstr "" +msgstr "Автоматичне «так» на всі підказки." #: ../fdroidserver/index.py #, python-brace-format @@ -444,7 +445,7 @@ msgstr "Очистити оновлення - не використовує ке #: ../fdroidserver/common.py msgid "Color the log output" -msgstr "" +msgstr "Розфарбуйте результат журналу" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." @@ -461,7 +462,7 @@ msgstr "Прийняти зміни" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "" +msgstr "Зафіксуйте зміни, натисніть, а потім зробіть запит на злиття" #: ../fdroidserver/metadata.py #, python-brace-format @@ -648,7 +649,7 @@ msgstr "Не використовуйте контрольні суми rsync" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "" +msgstr "Завантажуйте F-Droid.apk за допомогою дзеркал, які менше витікають у мережу" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -760,7 +761,7 @@ msgstr "Експортування підписів з APK" #: ../fdroidserver/install.py msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "" +msgstr "F-Droid.apk не вдалося завантажити з жодного відомого джерела!" #: ../fdroidserver/update.py #, python-brace-format @@ -1222,7 +1223,7 @@ msgstr "Не знайдено приєднаних пристроїв" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." -msgstr "" +msgstr "Не знайдено пристроїв для `adb install`! Будь ласка, підключіть один." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1430,7 +1431,7 @@ msgstr "Вивести таємну змінну до термінала для #: ../fdroidserver/install.py #, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "" +msgstr "Режим конфіденційності було ввімкнено на основі вашої мови ({country_code})." #: ../fdroidserver/scanner.py #, python-format @@ -1520,7 +1521,7 @@ msgstr "Оновлення та кешування правил і сигнат #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." -msgstr "" +msgstr "Видаліть вихідний архів та будь-які файли APK, якщо успішно перевірено." #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1559,7 +1560,7 @@ msgstr "Обмеження виводу на попередження і пом #: ../fdroidserver/net.py #, python-format msgid "Retrying failed download: %s" -msgstr "" +msgstr "Повторна спроба невдалого завантаження: %s" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1629,7 +1630,7 @@ msgstr[2] "Знайдено {} проблем" #: ../fdroidserver/scanner.py msgid "Scanning APK for extra signing blocks." -msgstr "" +msgstr "Сканування APK на наявність додаткових блоків підпису." #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." @@ -2088,7 +2089,7 @@ msgstr "Перевірка підпису індексу:" #: ../fdroidserver/install.py #, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "" +msgstr "Перевірка пакета {path} за допомогою apksigner." #: ../fdroidserver/deploy.py #, python-brace-format @@ -2101,7 +2102,7 @@ msgstr "Попереджати про можливі помилки метада #: ../fdroidserver/scanner.py msgid "WebAssembly binary file" -msgstr "" +msgstr "Бінарний файл WebAssembly" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2117,11 +2118,11 @@ msgstr "Якщо підписати або перевірити не вдаєт #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "" +msgstr "Бажаєте завантажити та встановити F-Droid.apk через adb? (ТАК/Ні)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "" +msgstr "Бажаєте завантажити програму(и) з f-droid.org? (ТАК/Ні)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2138,7 +2139,7 @@ msgstr "ZIP-архів" #: ../fdroidserver/install.py #, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "" +msgstr "adb звітує {serial} як \"{status}\"!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2708,7 +2709,7 @@ msgstr "такі аргументи зобов'язані: %s" #: ../fdroidserver/install.py msgid "true" -msgstr "" +msgstr "правда" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2753,7 +2754,7 @@ msgstr "virustotal.com обмежує швидкість, очікування #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "так" #: ../fdroidserver/publish.py #, python-brace-format @@ -2872,7 +2873,7 @@ msgstr "{path} було позначено virustotal {count} разів:" #: ../fdroidserver/install.py #, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "" +msgstr "{path} має неправильний відбиток пальця ({fingerprint})!" #: ../fdroidserver/common.py #, python-brace-format From d588afd3f964b2056be22743c647c15c57504a7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Wed, 15 Jan 2025 16:19:06 +0100 Subject: [PATCH 1866/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Chine?= =?UTF-8?q?se=20(Simplified=20Han=20script)=20(zh=5FHans)=20by=20=E5=A4=A7?= =?UTF-8?q?=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1=E5=B1=B1=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (612 of 612 strings) Co-authored-by: 大王叫我来巡山 Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 629a4c2c..b9aa3f00 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -40,7 +40,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" -"PO-Revision-Date: 2024-11-24 18:41+0000\n" +"PO-Revision-Date: 2024-12-12 14:43+0000\n" "Last-Translator: 大王叫我来巡山 \n" "Language-Team: Chinese (Simplified Han script) \n" "Language: zh_Hans\n" @@ -1540,7 +1540,7 @@ msgstr "刷新和缓存来自网络的扫描程序规则和签名" #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." -msgstr "" +msgstr "若验证成功删除源 tarball 和任何 APK 文件。" #: ../fdroidserver/common.py msgid "Removing specified files" From 594099a10cafbd4076fd3534ba95cd860284cfd7 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 20 Jan 2025 15:28:25 +0100 Subject: [PATCH 1867/2116] gitlab-ci: remove arch_pip_install job https://gitlab.com/fdroid/fdroidserver/-/jobs/8898887965 It broke and no one seems to want to maintain it. --- .gitlab-ci.yml | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 27455c75..87036d60 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -183,21 +183,6 @@ ubuntu_jammy_pip: - LANGUAGE='de' fdroid --help | grep 'Gültige Befehle sind' -# test installation process on a bleeding edge distro with pip -arch_pip_install: - image: archlinux - only: - - master@fdroid/fdroidserver - script: - - pacman --sync --sysupgrade --refresh --noconfirm gcc git grep python-pip python-virtualenv python-wheel tar - - python -m venv venv - - source venv/bin/activate - - pip install -e .[test] - - fdroid - - fdroid readmeta - - fdroid update --help - - # The gradlew-fdroid tests are isolated from the rest of the test # suite, so they run as their own job. gradlew-fdroid: From 9b5a67340e7acc5a44391e33c3e9b8ab56674808 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 20 Jan 2025 15:37:54 +0100 Subject: [PATCH 1868/2116] checkupdates: skip test_get_upstream_main_branch on macOS This test checks the detection of the default initial branch. It is a hard thing to test since different platform configurations have different defaults. checkupdates is basically only used on GNU/Linux anyway. Here's the failure: https://gitlab.com/fdroid/fdroidserver/-/jobs/8896420261 --- tests/test_checkupdates.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/test_checkupdates.py b/tests/test_checkupdates.py index 87420d2b..fcd6f642 100755 --- a/tests/test_checkupdates.py +++ b/tests/test_checkupdates.py @@ -2,6 +2,7 @@ import git import os +import platform import shutil import tempfile import time @@ -490,6 +491,10 @@ class CheckupdatesTest(unittest.TestCase): fdroidserver.checkupdates.main() sys_exit.assert_not_called() + @unittest.skipIf( + platform.system() == 'Darwin', + 'It is difficult to configure the base system for this test.', + ) def test_get_upstream_main_branch(self): os.chdir(self.testdir.name) testvalue = 'foo' From 9e03dba11e4748a7d713f7b388b247e9d6dd8dcf Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Tue, 21 Jan 2025 13:36:56 +0200 Subject: [PATCH 1869/2116] Use latest Bookworm images for makebuildserver --- makebuildserver | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/makebuildserver b/makebuildserver index f532cb44..a564e735 100755 --- a/makebuildserver +++ b/makebuildserver @@ -48,17 +48,17 @@ logging.basicConfig(format=logformat, level=loglevel) tail = None BASEBOX_DEFAULT = 'debian/bookworm64' -BASEBOX_VERSION_DEFAULT = "12.20240905.1" +BASEBOX_VERSION_DEFAULT = "12.20241217.1" BASEBOX_CHECKSUMS = { - "12.20240905.1": { + "12.20241217.1": { "libvirt": { - "box.img": "a7aa8c7a8c4a214afb597d0ffd20d63cd3cf5464a1fc3791ed6f2674b8783b54", + "box.img": "7cda96dd706fe5c4eba8210abc944b047842ee6655167933cb7d5ea99cb962bb", "Vagrantfile": "f9c6fcbb47a4d0d33eb066859c8e87efd642287a638bd7da69a9e7a6f25fec47", "metadata.json": "20dc0268a79410dbf01c7e544ba5138f6f695a298b53c56c87a25f68c5031173", }, "virtualbox": { - "box.ovf": "9c32ca53a110fa7ff91bc0a5f42e012b9bd5986b029ae6d0f68edd274c8a53e2", - "box.vmdk": "abe945cfb0f60db44b52454046c16c209a3c85fcc72c82124ef525badeff0931", + "box.ovf": "abc34993d37a85a9f89506621bdb3e2cb11eda7c7f6b2d19de9e866264031532", + "box.vmdk": "62a2991aa9543b64cc273c545dc2403adf844644253c9fe162632030c4dd21c4", "Vagrantfile": "0bbc2ae97668d8da27ab97b766752dcd0bf9e41900e21057de15a58ee7fae47d", "metadata.json": "ffdaa989f2f6932cd8042e1102371f405cc7ad38e324210a1326192e4689e83a", } From f3102d81b19025e056f4a87e4d8504ec2a240825 Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Tue, 21 Jan 2025 15:57:12 +0200 Subject: [PATCH 1870/2116] Fix vagrant image download issue --- makebuildserver | 1 + 1 file changed, 1 insertion(+) diff --git a/makebuildserver b/makebuildserver index a564e735..a4a27060 100755 --- a/makebuildserver +++ b/makebuildserver @@ -262,6 +262,7 @@ def main(): # https://phoenhex.re/2018-03-25/not-a-vagrant-bug os_env = os.environ.copy() os_env['VAGRANT_DISABLE_VBOXSYMLINKCREATE'] = '1' + os_env['VAGRANT_SERVER_URL'] = 'https://vagrantcloud.com/api/v2/vagrant' v.env = os_env if options.verbosity >= 2: From 2ac925a249dbbd608f920f73862fe9329d48f7de Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 21 Jan 2025 15:00:23 +0000 Subject: [PATCH 1871/2116] ban apksigner v33, it has bugs verifying APKs with v3/v3.1 sigs --- .gitlab-ci.yml | 4 ++-- fdroidserver/common.py | 11 +++++++++- tests/test_common.py | 49 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 87036d60..394c41a4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -168,7 +168,7 @@ ubuntu_jammy_pip: # back to bare machine to act as user's install machine - export ANDROID_HOME=/opt/android-sdk - $pip install sdkmanager - - sdkmanager 'build-tools;33.0.0' + - sdkmanager 'build-tools;35.0.0' # Install extras_require.optional from setup.py - $pip install biplist pycountry @@ -176,7 +176,7 @@ ubuntu_jammy_pip: - $pip install dist/fdroidserver-*.tar.gz - tar xzf dist/fdroidserver-*.tar.gz - cd fdroidserver-* - - export PATH=$PATH:$ANDROID_HOME/build-tools/33.0.0 + - export PATH=$PATH:$ANDROID_HOME/build-tools/35.0.0 - fdroid=`which fdroid` ./tests/run-tests # check localization was properly installed diff --git a/fdroidserver/common.py b/fdroidserver/common.py index bf58433d..b6627c43 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -85,6 +85,7 @@ DEFAULT_LOCALE = 'en-US' # this is the build-tools version, aapt has a separate version that # has to be manually set in test_aapt_version() MINIMUM_AAPT_BUILD_TOOLS_VERSION = '26.0.0' +# 33.0.x has a bug that verifies APKs it shouldn't https://gitlab.com/fdroid/fdroidserver/-/issues/1253 # 31.0.0 is the first version to support --v4-signing-enabled. # we only require 30.0.0 for now as that's the version in buster-backports, see also signindex.py # 26.0.2 is the first version recognizing md5 based signatures as valid again @@ -841,7 +842,15 @@ def find_apksigner(config): if not os.path.isdir(os.path.join(build_tools_path, f)): continue try: - if LooseVersion(f) < LooseVersion(MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION): + version = LooseVersion(f) + if version >= LooseVersion('33') and version < LooseVersion('34'): + logging.warning( + _('apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring.').format( + version=version + ) + ) + continue + if version < LooseVersion(MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION): logging.debug("Local Android SDK only has outdated apksigner versions") return except TypeError: diff --git a/tests/test_common.py b/tests/test_common.py index 144a61b0..ad04d389 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -3282,6 +3282,55 @@ class SignerExtractionTest(unittest.TestCase): ) +class IgnoreApksignerV33Test(CommonTest): + """apksigner v33 should be entirely ignored + + https://gitlab.com/fdroid/fdroidserver/-/issues/1253 + """ + + BAD_VERSIONS = [ + '33.0.0-rc1', + '33.0.0-rc2', + '33.0.0-rc3', + '33.0.0-rc4', + '33.0.0', + '33.0.1', + '33.0.2', + '33.0.3', + ] + + def setUp(self): + super().setUp() + self.config = {'sdk_path': self.testdir} + + def _create_fake_build_tools(self, version): + for v in self.BAD_VERSIONS + [version]: + apksigner = os.path.join(self.testdir, 'build-tools', v, 'apksigner') + os.makedirs(os.path.dirname(apksigner)) + with open(apksigner, 'w') as fp: + fp.write(f'#!/bin/sh\necho {v}[\n') + os.chmod(apksigner, 0o0755) # nosec B103 + + def test_find_apksigner_choose_version_32_over_any_33(self): + good = '32.0.0' + self._create_fake_build_tools(good) + with mock.patch.dict(os.environ, clear=True): + os.environ['PATH'] = '/fake/path/to/avoid/conflicts' + fdroidserver.common.find_apksigner(self.config) + self.assertEqual( + os.path.join(self.testdir, 'build-tools', good, 'apksigner'), + self.config.get('apksigner'), + ) + + def test_find_apksigner_choose_no_version_over_any_33(self): + """apksigner v33 should be entirely ignored""" + self._create_fake_build_tools('29.0.0') # too old a version + with mock.patch.dict(os.environ, clear=True): + os.environ['PATH'] = '/fake/path/to/avoid/conflicts' + fdroidserver.common.find_apksigner(self.config) + self.assertIsNone(self.config.get('apksigner')) + + class ConfigOptionsScopeTest(unittest.TestCase): """Test assumptions about variable scope for "config" and "options". From e45709beef765cb4cecbdf3a05efa20a9c9ff9ab Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 20 Jan 2025 15:10:54 +0100 Subject: [PATCH 1872/2116] update CHANGELOG.md --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 285cbde1..45d1e555 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,17 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ### Removed +## [2.3.5] - 2025-01-20 + +### Fixed + +* Fix issue where APKs with v1-only signatures and targetSdkVersion < 30 could + be maliciously crafted to bypass AllowedAPKSigningKeys + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1588 +* Ignore apksigner v33.x, it has bugs verifying APKs with v3/v3.1 sigs. + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1593 +* Sync translations for: ca cs de es fr ga ja pt_BR pt_PT ru sq sr uk zh_Hans + ## [2.3.4] - 2024-12-12 ### Fixed From f719efcba0f05f3280a4a6f0ac4761b677b23ea7 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 20 Jan 2025 15:11:58 +0100 Subject: [PATCH 1873/2116] version 2.3.5 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 41a5b71a..affa67ad 100755 --- a/setup.py +++ b/setup.py @@ -70,7 +70,7 @@ with open("README.md", "r") as fh: setup( name='fdroidserver', - version='2.3.4', + version='2.3.5', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From 6e1c1f4cc08f493d7f0bbd9d881ae825da1085d2 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 21 Jan 2025 17:03:51 +0100 Subject: [PATCH 1874/2116] make -C locale update --- locale/ar/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/az/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/be/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/bg/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/bn/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/bo/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/ca/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/cs/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/cy/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/de/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/el/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/es/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/es_AR/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/es_MX/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/eu/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/fa/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/fdroidserver.pot | 9 +++++++-- locale/fi/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/fr/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/fy/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/ga/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/he/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/hi/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/hu/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/id/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/it/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/ja/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/kab/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/ko/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/ml/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/nl/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/pl/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/pt/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/ro/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/ru/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/sk/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/sq/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/sr/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/sw/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/tr/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/tzm/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/ug/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/uk/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 7 ++++++- 48 files changed, 289 insertions(+), 49 deletions(-) diff --git a/locale/ar/LC_MESSAGES/fdroidserver.po b/locale/ar/LC_MESSAGES/fdroidserver.po index 656a503b..8fc4ea14 100644 --- a/locale/ar/LC_MESSAGES/fdroidserver.po +++ b/locale/ar/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-09-21 19:31+0000\n" "Last-Translator: Cool Man \n" "Language-Team: Arabic \n" @@ -2141,6 +2141,11 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/az/LC_MESSAGES/fdroidserver.po b/locale/az/LC_MESSAGES/fdroidserver.po index 7b85e1a0..bec25b01 100644 --- a/locale/az/LC_MESSAGES/fdroidserver.po +++ b/locale/az/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2023-05-26 19:39+0000\n" "Last-Translator: Mehrab Poladov \n" "Language-Team: Azerbaijani \n" @@ -2136,6 +2136,11 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/be/LC_MESSAGES/fdroidserver.po b/locale/be/LC_MESSAGES/fdroidserver.po index 836a31ba..24d1ec6b 100644 --- a/locale/be/LC_MESSAGES/fdroidserver.po +++ b/locale/be/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-01-21 00:08+0000\n" "Last-Translator: flac \n" "Language-Team: Belarusian \n" @@ -2141,6 +2141,11 @@ msgstr "неадназначны варыянт: %(option)s можа адпав msgid "ambiguous option: %s (%s?)" msgstr "неадназначны варыянт: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/bg/LC_MESSAGES/fdroidserver.po b/locale/bg/LC_MESSAGES/fdroidserver.po index 4643a91f..4200f4cf 100644 --- a/locale/bg/LC_MESSAGES/fdroidserver.po +++ b/locale/bg/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-07-19 10:21+0000\n" "Last-Translator: 109247019824 \n" "Language-Team: Bulgarian \n" @@ -2137,6 +2137,11 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index 75aa2ea1..b5cd2ab5 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2021-02-12 09:48+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali \n" @@ -2136,6 +2136,11 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index 83a4fc0e..d3bccbe6 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tibetan \n" @@ -2161,6 +2161,11 @@ msgstr "གསལ་ཁ་མེད་པའི་གདམ་ཀ: %(option)s msgid "ambiguous option: %s (%s?)" msgstr "གསལ་ཁ་མེད་པའི་གདམ་ཀ:%s 1 (%s 2?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index 022fecd6..14ef426c 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2025-01-03 17:37+0000\n" "Last-Translator: pitroig \n" "Language-Team: Catalan \n" @@ -2157,6 +2157,11 @@ msgstr "opció ambigua: %(option)s podria correspondre amb %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "opció ambigua: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "No s'ha trobat l'apksigner! No es poden signar o verificar els APK moderns" diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 5630e486..7b88a54b 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-12-12 01:41+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" @@ -2161,6 +2161,11 @@ msgstr "nejednoznačná možnost: %(option)s by mohlo odpovídat %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "nejednoznačná možnost: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner nenalezen! Nelze podepsat nebo ověřit moderní APK" diff --git a/locale/cy/LC_MESSAGES/fdroidserver.po b/locale/cy/LC_MESSAGES/fdroidserver.po index b2517cf0..77710452 100644 --- a/locale/cy/LC_MESSAGES/fdroidserver.po +++ b/locale/cy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2021-01-16 21:23+0000\n" "Last-Translator: Aled Powell \n" "Language-Team: Welsh \n" @@ -2155,6 +2155,11 @@ msgstr "dewis amwys: gall %(option)s gydweddu â %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "dewis amwys: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 67813758..c69f42f2 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -26,7 +26,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-12-12 14:43+0000\n" "Last-Translator: VfBFan \n" "Language-Team: German \n" @@ -2172,6 +2172,11 @@ msgstr "Mehrdeutige Option: %(option)s könnte übereinstimmen mit %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "Mehrdeutige Option: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner nicht gefunden! Moderne APKs können nicht signiert oder verifiziert werden" diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index 2da2ac11..6d50acc9 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-05-10 13:24+0000\n" "Last-Translator: ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ \n" "Language-Team: Greek \n" @@ -2143,6 +2143,11 @@ msgstr "Ασαφής επιλογή: %(option)s θα μπορούσε να τα msgid "ambiguous option: %s (%s?)" msgstr "ασαφής επιλογή: %s (%s;)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index de4b0893..85aeeba3 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-12-20 13:00+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" @@ -2163,6 +2163,11 @@ msgstr "opción ambigua: %(option)s podría corresponderse con %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "opción ambigua: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "¡No se encontró apksigner! No se pueden firmar o verificar los APKs modernos" diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index 24ba7106..37b632e4 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2021-04-10 21:26+0000\n" "Last-Translator: Germe the fur star \n" "Language-Team: Spanish (Argentina) \n" @@ -2154,6 +2154,11 @@ msgstr "opción ambigua: %(option)s podría corresponderse con %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "opción ambigua: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/es_MX/LC_MESSAGES/fdroidserver.po b/locale/es_MX/LC_MESSAGES/fdroidserver.po index 948b0415..7c32b235 100644 --- a/locale/es_MX/LC_MESSAGES/fdroidserver.po +++ b/locale/es_MX/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2020-04-29 12:49+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Spanish (Mexico) \n" @@ -2141,6 +2141,11 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/eu/LC_MESSAGES/fdroidserver.po b/locale/eu/LC_MESSAGES/fdroidserver.po index 5652184b..b151427b 100644 --- a/locale/eu/LC_MESSAGES/fdroidserver.po +++ b/locale/eu/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -2135,6 +2135,11 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index c78ccec1..5071a2b2 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-11-26 15:16+0000\n" "Last-Translator: Danial Behzadi \n" "Language-Team: Persian \n" @@ -2139,6 +2139,11 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/fdroidserver.pot b/locale/fdroidserver.pot index 745ad5cb..6b5ceb4f 100644 --- a/locale/fdroidserver.pot +++ b/locale/fdroidserver.pot @@ -5,9 +5,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: fdroidserver 2.3.3\n" +"Project-Id-Version: fdroidserver 2.3.5\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -2137,6 +2137,11 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index a8ac6ddf..f59fec0f 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2021-08-23 01:29+0000\n" "Last-Translator: Kaantaja \n" "Language-Team: Finnish \n" @@ -2137,6 +2137,11 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 3583ce22..3b3bb16c 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -45,7 +45,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-12-31 00:24+0000\n" "Last-Translator: Armand Camponovo \n" "Language-Team: French \n" @@ -2198,6 +2198,11 @@ msgstr "option ambiguë : %(option)s peut correspondre à %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "option ambiguë : %s (%s ?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner introuvable ! Impossible de signer ou de vérifier les APK modernes" diff --git a/locale/fy/LC_MESSAGES/fdroidserver.po b/locale/fy/LC_MESSAGES/fdroidserver.po index 56a9c044..2cccd306 100644 --- a/locale/fy/LC_MESSAGES/fdroidserver.po +++ b/locale/fy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2021-07-01 15:29+0000\n" "Last-Translator: Vancha March \n" "Language-Team: Frisian \n" @@ -2136,6 +2136,11 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/ga/LC_MESSAGES/fdroidserver.po b/locale/ga/LC_MESSAGES/fdroidserver.po index 2dfdf797..d51fbe97 100644 --- a/locale/ga/LC_MESSAGES/fdroidserver.po +++ b/locale/ga/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1-162-gfbb3cc59\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-12-14 19:00+0000\n" "Last-Translator: Aindriú Mac Giolla Eoin \n" "Language-Team: Irish \n" @@ -2160,6 +2160,11 @@ msgstr "Rogha dhébhríoch: D'fhéadfadh %(option)s %(matches)s a mheaitseáil" msgid "ambiguous option: %s (%s?)" msgstr "Rogha dhébhríoch: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner gan aimsiú! Ní féidir APKs nua-aimseartha a shíniú nó a fhíorú" diff --git a/locale/he/LC_MESSAGES/fdroidserver.po b/locale/he/LC_MESSAGES/fdroidserver.po index 03ad12eb..fb04e1e3 100644 --- a/locale/he/LC_MESSAGES/fdroidserver.po +++ b/locale/he/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-08-18 06:27+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" @@ -2137,6 +2137,11 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/hi/LC_MESSAGES/fdroidserver.po b/locale/hi/LC_MESSAGES/fdroidserver.po index d4fbd647..dbe16c92 100644 --- a/locale/hi/LC_MESSAGES/fdroidserver.po +++ b/locale/hi/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2023-02-22 11:24+0000\n" "Last-Translator: Saurmandal \n" "Language-Team: Hindi \n" @@ -2137,6 +2137,11 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index 43e1a316..e5987ef4 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Hungarian \n" @@ -2159,6 +2159,11 @@ msgstr "nem egyértelmű kapcsoló: %(option)s, ezekre illeszkedhet: %(matches)s msgid "ambiguous option: %s (%s?)" msgstr "nem egyértelmű kapcsoló: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index 19848c53..42043e80 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-10-04 04:26+0000\n" "Last-Translator: Doctorredits_here \n" "Language-Team: Indonesian \n" @@ -2140,6 +2140,11 @@ msgstr "opsi ambigu: %(option)s bisa sesuai dengan %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "opsi ambigu: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 974dcd7a..f25de697 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-09-10 09:27+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Italian \n" @@ -2175,6 +2175,11 @@ msgstr "opzione ambigua: %(option)s potrebbe corrispondere a %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "opzione ambigua: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner non trovato! Impossibile firmare o verificare gli APK moderni" diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index c6411cba..48a92270 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-12-12 01:41+0000\n" "Last-Translator: Liner Seven \n" "Language-Team: Japanese \n" @@ -2151,6 +2151,11 @@ msgstr "オプションが曖昧です。%(option)sは%(matches)sに一致しま msgid "ambiguous option: %s (%s?)" msgstr "オプションが曖昧です:%s(%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksignerが見つかりません!最近のAPKに署名を行ったり検証したりすることはできません" diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index 63009aba..f5bf4f54 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2021-01-15 13:25+0000\n" "Last-Translator: R_SACI \n" "Language-Team: Kabyle \n" @@ -2141,6 +2141,11 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index 874636e5..b8612b4f 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-09-06 14:57+0000\n" "Last-Translator: Cxnfl1ct \n" "Language-Team: Korean \n" @@ -2142,6 +2142,11 @@ msgstr "모호한 옵션: %(option)s은 %(matches)s와 일치했을 수 있습 msgid "ambiguous option: %s (%s?)" msgstr "모호한 옵션: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/ml/LC_MESSAGES/fdroidserver.po b/locale/ml/LC_MESSAGES/fdroidserver.po index d1abaa44..c2be75ba 100644 --- a/locale/ml/LC_MESSAGES/fdroidserver.po +++ b/locale/ml/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2023-06-23 14:52+0000\n" "Last-Translator: abe1242 \n" "Language-Team: Malayalam \n" @@ -2144,6 +2144,11 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index 38008c65..13eb76c3 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Norwegian Bokmål \n" @@ -2224,6 +2224,11 @@ msgstr "tvetydig valg: %(option)s kan passe overens med %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "tvetydig valg: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py #, fuzzy msgid "apksigner not found! Cannot sign or verify modern APKs" diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index 4c722636..fbca4890 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-01-03 09:07+0000\n" "Last-Translator: Issa1553 \n" "Language-Team: Dutch \n" @@ -2144,6 +2144,11 @@ msgstr "dubbelzinnige optie: %(option)s kan overeenkomen met %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "dubbelzinnige optie: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 651a7ffe..bdcaa4cc 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-11-30 20:00+0000\n" "Last-Translator: WaldiS \n" "Language-Team: Polish \n" @@ -2160,6 +2160,11 @@ msgstr "niejednoznaczna opcja: %(option)s może dopasować %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "niejednoznaczna opcja: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "Nie znaleziono apksignera! Nie można podpisać ani zweryfikować nowoczesnych pakietów APK" diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index f96c1ad5..858f8bb7 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-11-26 15:16+0000\n" "Last-Translator: Hugo Carvalho \n" "Language-Team: Portuguese \n" @@ -2155,6 +2155,11 @@ msgstr "opção ambígua: %(option)s poderia corresponder %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "opção ambígua: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner não encontrado! Não é possível assinar ou verificar APKs modernos" diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index b0bc4d2e..56d35305 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-12-24 01:00+0000\n" "Last-Translator: LucasMZ \n" "Language-Team: Portuguese (Brazil) \n" @@ -2164,6 +2164,11 @@ msgstr "opção ambígua: %(option)s pode corresponder a %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "opção ambígua: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner não encontrado! Não é possível assinar ou verificar APKs modernos" diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 499a312e..2448d63e 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2025-01-03 06:49+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" @@ -2157,6 +2157,11 @@ msgstr "opção ambígua: %(option)s poderia corresponder %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "opção ambígua: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner não encontrado! Não é possível assinar ou verificar APKs modernos" diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index a80cd5c0..5a1fe1ed 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-12-02 17:00+0000\n" "Last-Translator: Licaon Kter \n" "Language-Team: Romanian \n" @@ -2159,6 +2159,11 @@ msgstr "opțiune ambiguă: %(option)s ar putea corespunde cu %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "opțiune ambiguă: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner nu a fost găsit! Nu se poate semna sau verifica APK-urile moderne" diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index a6b97c19..672a506b 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -20,7 +20,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2025-01-08 16:30+0000\n" "Last-Translator: Andrey \n" "Language-Team: Russian \n" @@ -2169,6 +2169,11 @@ msgstr "неоднозначный выбор: %(option)s совпадает с msgid "ambiguous option: %s (%s?)" msgstr "неоднозначный выбор: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner не найден! Невозможно подписать или проверить актуальные APK-файлы" diff --git a/locale/sk/LC_MESSAGES/fdroidserver.po b/locale/sk/LC_MESSAGES/fdroidserver.po index e3172725..9fc0fc2c 100644 --- a/locale/sk/LC_MESSAGES/fdroidserver.po +++ b/locale/sk/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -2138,6 +2138,11 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index ca151930..e0361954 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-12-12 14:43+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" @@ -2153,6 +2153,11 @@ msgstr "mundësi e dykuptimtë: %(option)s mund të përputhej me %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "mundësi e dykuptimtë: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "S’u gjet apksigner! S’nënshkruhen ose verifikohen dot APK-ra moderne" diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index 86b57405..ce2ebb8f 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-12-30 22:00+0000\n" "Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" @@ -2157,6 +2157,11 @@ msgstr "нејасна опција: %(option)s може одговарати %( msgid "ambiguous option: %s (%s?)" msgstr "двосмислена опција: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner није пронађен! Не могу да потпишем или проверим модерне APK-ове" diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index 03c8b9ee..5c4f4b27 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-09-08 11:09+0000\n" "Last-Translator: abelbiwott-dev \n" "Language-Team: Swahili \n" @@ -2154,6 +2154,11 @@ msgstr "chaguo lisiloeleweka: %(option)s linaweza kulingana na %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "chaguo lisiloeleweka: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner haijapatikana! Haiwezi kusaini au kutibitisha APK ya kisasa" diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index 555886d8..001db62f 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-09-10 23:49+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" @@ -2154,6 +2154,11 @@ msgstr "belirsiz şeçenek: %(option)s ile %(matches)s eşleşebilir" msgid "ambiguous option: %s (%s?)" msgstr "belirsiz şeçenek: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner bulunamadı! Modern APK'lar imzalanamıyor veya doğrulanamıyor" diff --git a/locale/tzm/LC_MESSAGES/fdroidserver.po b/locale/tzm/LC_MESSAGES/fdroidserver.po index dff41870..f47a555f 100644 --- a/locale/tzm/LC_MESSAGES/fdroidserver.po +++ b/locale/tzm/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-681-gc19e8952\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2020-10-29 08:32+0000\n" "Last-Translator: Hakim Oubouali \n" "Language-Team: Central Atlas Tamazight \n" @@ -2136,6 +2136,11 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/ug/LC_MESSAGES/fdroidserver.po b/locale/ug/LC_MESSAGES/fdroidserver.po index 685c3934..fc3417a4 100644 --- a/locale/ug/LC_MESSAGES/fdroidserver.po +++ b/locale/ug/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2018-06-08 03:44+0000\n" "Last-Translator: ۋولقان \n" "Language-Team: Uyghur \n" @@ -2138,6 +2138,11 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 8eceb428..8e36a288 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -16,7 +16,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-12-20 13:00+0000\n" "Last-Translator: Максим Горпиніч \n" "Language-Team: Ukrainian \n" @@ -2165,6 +2165,11 @@ msgstr "неоднозначний параметр: %(option)s може від msgid "ambiguous option: %s (%s?)" msgstr "неоднозначний параметр: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner не знайдено! Не вдалося підписати або перевірити актуальні файли APK" diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index b9aa3f00..1c9f9273 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -39,7 +39,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-12-12 14:43+0000\n" "Last-Translator: 大王叫我来巡山 \n" "Language-Team: Chinese (Simplified Han script) \n" @@ -2182,6 +2182,11 @@ msgstr "模糊的选项:%(option)s 可以相配 %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "模糊的选项:%s(%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "找不到 APK 签名器!无法对新式 APK 进行签名或验证" diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index b87bf7e7..079531af 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-11-26 15:16+0000\n" "Last-Translator: Peter Dave Hello \n" "Language-Team: Chinese (Traditional Han script) \n" @@ -2193,6 +2193,11 @@ msgstr "模糊選項:%(option)s 可以相配 %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "不明確的選項:%s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py #, fuzzy msgid "apksigner not found! Cannot sign or verify modern APKs" From 0c6e976a011aea922c7d156f6b9623268cde107e Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sun, 26 Jan 2025 12:09:54 +0800 Subject: [PATCH 1875/2116] gradle v8.12.1 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index b68e1927..9962416f 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -208,6 +208,7 @@ get_sha() { '8.11') echo '57dafb5c2622c6cc08b993c85b7c06956a2f53536432a30ead46166dbca0f1e9' ;; '8.11.1') echo 'f397b287023acdba1e9f6fc5ea72d22dd63669d59ed4a289a29b1a76eee151c6' ;; '8.12') echo '7a00d51fb93147819aab76024feece20b6b84e420694101f276be952e08bef03' ;; + '8.12.1') echo '8d97a97984f6cbd2b85fe4c60a743440a347544bf18818048e611f5288d46c94' ;; *) exit 1 esac } @@ -228,7 +229,7 @@ d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2 7.1 7.0 4.2 4.1 4.0 3.6 d_plugin_min_gradle_v=(8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.12 8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.12.1 8.12 8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 66d220bd9fcf923253a1ac1c40a7ddfae5f50090 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 18 Dec 2024 11:17:52 +0100 Subject: [PATCH 1876/2116] tests: rename testcommon module to shared_test_code This name always confuses me, since there is also test_common.py. And this module is not actually a test suite, even though it starts with "test". This also makes for better tab completion, e.g. python3 -m unittest tests/te[Tab] -> tests/test_ --- MANIFEST.in | 2 +- tests/{testcommon.py => shared_test_code.py} | 0 tests/test_api.py | 2 +- tests/test_build.py | 2 +- tests/test_common.py | 2 +- tests/test_deploy.py | 2 +- tests/test_github.py | 2 +- tests/test_import_subcommand.py | 2 +- tests/test_index.py | 2 +- tests/test_init.py | 4 ++-- tests/test_lint.py | 2 +- tests/test_main.py | 2 +- tests/test_metadata.py | 2 +- tests/test_publish.py | 2 +- tests/test_rewritemeta.py | 2 +- tests/test_scanner.py | 2 +- tests/test_signatures.py | 2 +- tests/test_update.py | 2 +- tests/test_vcs.py | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) rename tests/{testcommon.py => shared_test_code.py} (100%) diff --git a/MANIFEST.in b/MANIFEST.in index 42e1f46e..4f14a48d 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -721,6 +721,7 @@ include tests/repo/v1.v2.sig_1020.apk include tests/run-tests include tests/SANAPPSI.RSA include tests/SANAPPSI.SF +include tests/shared_test_code.py include tests/signindex/guardianproject.jar include tests/signindex/guardianproject-v1.jar include tests/signindex/testy.jar @@ -845,7 +846,6 @@ include tests/source-files/ut.ewh.audiometrytest/settings.gradle include tests/source-files/yuriykulikov/AlarmClock/gradle/wrapper/gradle-wrapper.properties include tests/source-files/Zillode/syncthing-silk/build.gradle include tests/SpeedoMeterApp.main_1.apk -include tests/testcommon.py include tests/test_build.py include tests/test_checkupdates.py include tests/test_common.py diff --git a/tests/testcommon.py b/tests/shared_test_code.py similarity index 100% rename from tests/testcommon.py rename to tests/shared_test_code.py diff --git a/tests/test_api.py b/tests/test_api.py index a2d91926..6cb9a53b 100755 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -8,7 +8,7 @@ from unittest import mock import fdroidserver from fdroidserver import common, signindex -from .testcommon import GP_FINGERPRINT, mkdtemp +from .shared_test_code import GP_FINGERPRINT, mkdtemp basedir = Path(__file__).parent diff --git a/tests/test_build.py b/tests/test_build.py index 94596daa..83e33eb2 100755 --- a/tests/test_build.py +++ b/tests/test_build.py @@ -9,7 +9,7 @@ import yaml from pathlib import Path from unittest import mock -from .testcommon import TmpCwd, mkdtemp +from .shared_test_code import TmpCwd, mkdtemp import fdroidserver.build import fdroidserver.common diff --git a/tests/test_common.py b/tests/test_common.py index ad04d389..79b676aa 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -30,7 +30,7 @@ import fdroidserver import fdroidserver.signindex import fdroidserver.common import fdroidserver.metadata -from .testcommon import TmpCwd, mkdtemp +from .shared_test_code import TmpCwd, mkdtemp from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME from fdroidserver.exception import FDroidException, VCSException,\ MetaDataException, VerificationException diff --git a/tests/test_deploy.py b/tests/test_deploy.py index 6ca8a40c..0946ebbb 100755 --- a/tests/test_deploy.py +++ b/tests/test_deploy.py @@ -11,7 +11,7 @@ from unittest import mock import git import fdroidserver -from .testcommon import TmpCwd, mkdtemp, VerboseFalseOptions +from .shared_test_code import TmpCwd, mkdtemp, VerboseFalseOptions basedir = Path(__file__).parent diff --git a/tests/test_github.py b/tests/test_github.py index e1e9ac3e..39514c5d 100755 --- a/tests/test_github.py +++ b/tests/test_github.py @@ -3,7 +3,7 @@ import unittest import unittest.mock -from .testcommon import mock_urlopen +from .shared_test_code import mock_urlopen import fdroidserver diff --git a/tests/test_import_subcommand.py b/tests/test_import_subcommand.py index ba2f133a..05e2c379 100755 --- a/tests/test_import_subcommand.py +++ b/tests/test_import_subcommand.py @@ -13,7 +13,7 @@ import git import requests import yaml -from .testcommon import TmpCwd, mkdtemp, VerboseFalseOptions +from .shared_test_code import TmpCwd, mkdtemp, VerboseFalseOptions import fdroidserver import fdroidserver.import_subcommand diff --git a/tests/test_index.py b/tests/test_index.py index 7e315daa..ea08653b 100755 --- a/tests/test_index.py +++ b/tests/test_index.py @@ -16,7 +16,7 @@ import shutil import fdroidserver from fdroidserver import common, index, publish, signindex, update -from .testcommon import GP_FINGERPRINT, TmpCwd, mkdtemp +from .shared_test_code import GP_FINGERPRINT, TmpCwd, mkdtemp basedir = Path(__file__).parent diff --git a/tests/test_init.py b/tests/test_init.py index fcbc83d0..b448192f 100755 --- a/tests/test_init.py +++ b/tests/test_init.py @@ -8,7 +8,7 @@ import unittest import fdroidserver.common import fdroidserver.init -from . import testcommon +from .shared_test_code import mkdtemp basedir = pathlib.Path(__file__).parent @@ -19,7 +19,7 @@ class InitTest(unittest.TestCase): def setUp(self): fdroidserver.common.config = None fdroidserver.init.config = None - self._td = testcommon.mkdtemp() + self._td = mkdtemp() self.testdir = self._td.name os.chdir(self.testdir) diff --git a/tests/test_lint.py b/tests/test_lint.py index f70b03b2..4056b2a6 100755 --- a/tests/test_lint.py +++ b/tests/test_lint.py @@ -9,7 +9,7 @@ from pathlib import Path import ruamel.yaml -from .testcommon import mkdtemp +from .shared_test_code import mkdtemp import fdroidserver.common import fdroidserver.lint diff --git a/tests/test_main.py b/tests/test_main.py index 25da93fa..50fda3e2 100755 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -8,7 +8,7 @@ import tempfile from unittest import mock import fdroidserver.__main__ -from .testcommon import TmpCwd, TmpPyPath +from .shared_test_code import TmpCwd, TmpPyPath class MainTest(unittest.TestCase): diff --git a/tests/test_metadata.py b/tests/test_metadata.py index cd4d12a9..7c9940f9 100755 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -17,7 +17,7 @@ import fdroidserver from fdroidserver import metadata from fdroidserver.exception import MetaDataException from fdroidserver.common import DEFAULT_LOCALE -from .testcommon import TmpCwd, mkdtemp +from .shared_test_code import TmpCwd, mkdtemp basedir = Path(__file__).parent diff --git a/tests/test_publish.py b/tests/test_publish.py index 6ca3b116..2f8be36a 100755 --- a/tests/test_publish.py +++ b/tests/test_publish.py @@ -24,7 +24,7 @@ from fdroidserver import common from fdroidserver import metadata from fdroidserver import signatures from fdroidserver.exception import FDroidException -from .testcommon import mkdtemp, VerboseFalseOptions +from .shared_test_code import mkdtemp, VerboseFalseOptions basedir = pathlib.Path(__file__).parent diff --git a/tests/test_rewritemeta.py b/tests/test_rewritemeta.py index 854553e3..5ad1b94d 100755 --- a/tests/test_rewritemeta.py +++ b/tests/test_rewritemeta.py @@ -8,7 +8,7 @@ from pathlib import Path from unittest import mock from fdroidserver import metadata, rewritemeta -from .testcommon import TmpCwd, mkdtemp +from .shared_test_code import TmpCwd, mkdtemp basedir = Path(__file__).parent diff --git a/tests/test_scanner.py b/tests/test_scanner.py index 8935a575..592680ef 100755 --- a/tests/test_scanner.py +++ b/tests/test_scanner.py @@ -24,7 +24,7 @@ import fdroidserver.build import fdroidserver.common import fdroidserver.metadata import fdroidserver.scanner -from .testcommon import TmpCwd, mkdtemp, mock_open_to_str +from .shared_test_code import TmpCwd, mkdtemp, mock_open_to_str basedir = pathlib.Path(__file__).parent diff --git a/tests/test_signatures.py b/tests/test_signatures.py index 5444dc23..34722e83 100755 --- a/tests/test_signatures.py +++ b/tests/test_signatures.py @@ -5,7 +5,7 @@ import os import unittest from tempfile import TemporaryDirectory -from .testcommon import TmpCwd +from .shared_test_code import TmpCwd from fdroidserver import common, signatures basedir = os.path.dirname(__file__) diff --git a/tests/test_update.py b/tests/test_update.py index 1c110343..28dd27f9 100755 --- a/tests/test_update.py +++ b/tests/test_update.py @@ -48,7 +48,7 @@ import fdroidserver.metadata import fdroidserver.update from fdroidserver.common import CATEGORIES_CONFIG_NAME from fdroidserver.looseversion import LooseVersion -from .testcommon import TmpCwd, mkdtemp +from .shared_test_code import TmpCwd, mkdtemp from PIL import PngImagePlugin diff --git a/tests/test_vcs.py b/tests/test_vcs.py index 93fcd6a7..2b640a9e 100755 --- a/tests/test_vcs.py +++ b/tests/test_vcs.py @@ -7,7 +7,7 @@ from git import Repo import fdroidserver.common import fdroidserver.metadata -from .testcommon import mkdtemp, VerboseFalseOptions +from .shared_test_code import mkdtemp, VerboseFalseOptions class VCSTest(unittest.TestCase): From 2b725a59660702072bb0110360bdc4e4de2cdbad Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Mon, 27 Jan 2025 19:19:39 +0800 Subject: [PATCH 1877/2116] update.py: fix triple-t metadata extract when there is no subdir --- fdroidserver/update.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index e038e166..b79ad878 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1026,19 +1026,20 @@ def copy_triple_t_store_metadata(apps): for packageName, app in apps.items(): builds = app.get('Builds', []) gradle_subdirs = set() - if builds and builds[-1].subdir: + if builds: + subdir = builds[-1].subdir or '' for flavor in builds[-1].gradle: if flavor not in ('yes', 'no', True, False): - p = os.path.join('build', packageName, builds[-1].subdir, 'src', flavor, 'play') + p = os.path.join('build', packageName, subdir, 'src', flavor, 'play') if os.path.exists(p): gradle_subdirs.add(p) if not gradle_subdirs: - gradle_subdirs.update(glob.glob(os.path.join('build', packageName, builds[-1].subdir, 'src', '*', 'play'))) + gradle_subdirs.update(glob.glob(os.path.join('build', packageName, subdir, 'src', '*', 'play'))) if not gradle_subdirs: - gradle_subdirs.update(glob.glob(os.path.join('build', packageName, builds[-1].subdir, '*', 'src', '*', 'play'))) + gradle_subdirs.update(glob.glob(os.path.join('build', packageName, subdir, '*', 'src', '*', 'play'))) if not gradle_subdirs: # Flutter-style android subdir - gradle_subdirs.update(glob.glob(os.path.join('build', packageName, builds[-1].subdir, 'android', 'app', 'src', '*', 'play'))) + gradle_subdirs.update(glob.glob(os.path.join('build', packageName, subdir, 'android', 'app', 'src', '*', 'play'))) if not gradle_subdirs: sg_list = sorted(glob.glob(os.path.join('build', packageName, 'settings.gradle*'))) if sg_list: From a7e56598d61327b20c40fe5fb005bdd386b8ea9a Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Fri, 7 Feb 2025 22:16:18 +0800 Subject: [PATCH 1878/2116] checkupdates: sort the order of dirs when finding autoname --- fdroidserver/checkupdates.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index bd97135d..9731c510 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -381,7 +381,8 @@ def dirs_with_manifest(startdir: str): A directory that contains a manifest file of an Android project, None if no directory could be found """ - for root, _dirs, files in os.walk(startdir): + for root, dirs, files in os.walk(startdir): + dirs.sort() if any(m in files for m in [ 'AndroidManifest.xml', 'pom.xml', 'build.gradle', 'build.gradle.kts']): yield Path(root) From f7dc89e9ba146ba3b0ee00536dfc0e186e8164c2 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 Feb 2025 18:25:33 +0100 Subject: [PATCH 1879/2116] index: error if duplicate package files are in repo Looks like the ~index-v2 work removed this error case, and the old bash integration test case failed to catch it. This reestablishes this error. @mindston's refactoring of the old bash test suite caught this issue, e.g. !1587 --- fdroidserver/update.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index b79ad878..530886f8 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -2668,8 +2668,20 @@ def main(): appid_has_apks = set() appid_has_repo_files = set() + sha256_has_files = collections.defaultdict(list) + errors = 0 remove_apks = [] for apk in apks: + sha256 = apk['hash'] + if sha256 in sha256_has_files: + errors += 1 + for path2 in sha256_has_files[sha256]: + logging.error( + _('{path1} is a duplicate of {path2}, remove one!').format( + path1=apk["apkName"], path2=path2 + ) + ) + sha256_has_files[sha256].append(apk['apkName']) to_remove = get_apks_without_allowed_signatures(apps.get(apk['packageName']), apk) if to_remove: remove_apks.append(apk) @@ -2712,14 +2724,17 @@ def main(): for apk in remove_apks: apks.remove(apk) - mismatch_errors = '' for appid in appid_has_apks: if appid in appid_has_repo_files: appid_files = ', '.join(glob.glob(os.path.join('repo', appid + '_[0-9]*.*'))) - mismatch_errors += (_('{appid} has both APKs and files: {files}') - .format(appid=appid, files=appid_files)) + '\n' - if mismatch_errors: - raise FDroidException(mismatch_errors) + errors += 1 + logging.error( + _('{appid} has both APKs and files: {files}').format( + appid=appid, files=appid_files + ) + ) + if errors: + sys.exit(errors) # Scan the archive repo for apks as well if len(repodirs) > 1: From 9201b3ca94d072d41f21b4f8a1580ca7a14c900c Mon Sep 17 00:00:00 2001 From: mindston Date: Wed, 25 Dec 2024 16:02:45 +0100 Subject: [PATCH 1880/2116] Migrate integration tests from Bash to Python --- tests/run-tests | 1420 ---------------------------------- tests/test_integration.py | 1513 +++++++++++++++++++++++++++++++++++++ 2 files changed, 1513 insertions(+), 1420 deletions(-) create mode 100644 tests/test_integration.py diff --git a/tests/run-tests b/tests/run-tests index 7e3f0c13..360605ab 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -6,158 +6,12 @@ echo_header() { { echo -e "==============================================================================\n$1"; } 2>/dev/null } -get_fdroid_apk_filename() { - if [ -z $aapt ]; then - appid=$(androguard apkid "$1" | sed -En 's/ +"([a-z][^"]+)",$/\1/ip') - versionCode=$(androguard apkid "$1" | sed -En 's/ +"([0-9]+)",$/\1/p') - echo "${appid}_${versionCode}.apk" - else - $aapt dump badging "$1" | sed -n "s,^package: name='\(.*\)' versionCode='\([0-9][0-9]*\)' .*,\1_\2.apk,p" - fi -} - -copy_apks_into_repo() { - set +x - find $APKDIR -type f -name '*.apk' -print0 | while IFS= read -r -d '' f; do - echo $f | grep -F -v -e unaligned -e unsigned -e badsig -e badcert -e bad-unicode -e janus.apk || continue - apk=`get_fdroid_apk_filename "$f"` - test "$f" -nt repo/$apk && rm -f repo/$apk # delete existing if $f is newer - if [ ! -e repo/$apk ] && [ ! -e archive/$apk ]; then - echo "$f --> repo/$apk" - ln "$f" $1/repo/$apk || \ - rsync -axv "$f" $1/repo/$apk # rsync if hard link is not possible - touch $1/.found-apks - fi - done - if [ ! -e $1/.found-apks ]; then - echo "ERROR: The dir APKDIR must have APKs in it! $APKDIR does not." - exit 1 - fi - set -x -} - -# keep this as an old version to test the automatic parsing of build-tools -# verion numbers in `fdroid init` -create_fake_android_home() { - mkdir $1/tools - mkdir $1/platform-tools - mkdir $1/build-tools - mkdir $1/build-tools/19.0.2 - touch $1/build-tools/19.0.2/aapt -} - -create_test_dir() { - test -e $WORKSPACE/.testfiles || mkdir $WORKSPACE/.testfiles - mktemp -d $WORKSPACE/.testfiles/run-tests.XXXX -} - -create_test_file() { - test -e $WORKSPACE/.testfiles || mkdir $WORKSPACE/.testfiles - TMPDIR=$WORKSPACE/.testfiles mktemp -} - -fdroid_init_with_prebuilt_keystore() { - if [ -z "$1" ]; then - keystore=$WORKSPACE/tests/keystore.jks - else - keystore="$1" - fi - $fdroid init --keystore $keystore --repo-keyalias=sova - echo 'keystorepass: r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' >> config.yml - echo 'keypass: r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' >> config.yml -} - -is_MD5_disabled() { - javac $WORKSPACE/tests/IsMD5Disabled.java && java -cp $WORKSPACE/tests IsMD5Disabled -} - -use_apksigner() { - python3 -c " -import sys -sys.path.insert(0, '$WORKSPACE') -from fdroidserver import common -c = {'sdk_path': '$ANDROID_HOME'} -common.find_apksigner(c) -exit(c.get('apksigner') is None) -" -} - -err_handler() { -# remove this to prevent git conflicts and complaining - set +x - rm -rf "$WORKSPACE"/fdroidserver.egg-info/ - rm -rf "$WORKSPACE"/.testfiles/run-tests.* - rm -rf "$WORKSPACE"/.testfiles/test_* - rm -f "$WORKSPACE"/.testfiles/tmp.* - test -d "$WORKSPACE"/.testfiles && \ - (rmdir "$WORKSPACE"/.testfiles 2> /dev/null || \ - rmdir --ignore-fail-on-non-empty "$WORKSPACE"/.testfiles 2> /dev/null) -} - -trap err_handler INT EXIT - #------------------------------------------------------------------------------# -# "main" - -if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then - set +x - echo "Usage: $0 '/path/to/folder/with/apks'" - exit 1 -fi - -if [ -z "$ANDROID_HOME" ]; then - if python3 -c "import androguard"; then - echo "ANDROID_HOME is not set, using androguard" - else - echo "ERROR: ANDROID_HOME is not set, androguard is not available!" - exit 1 - fi -else - echo "Using ANDROID_HOME=$ANDROID_HOME" -fi if [ -d tests ]; then cd tests fi -if [ -z "$1" ]; then - APKDIR=`pwd` -else - APKDIR=$1 -fi -if [ ! -d "$APKDIR" ]; then - echo "ERROR: '$APKDIR' does not exist!" - exit 1 -fi - -if [ -z "$WORKSPACE" ]; then - WORKSPACE="$(dirname "$(pwd)")" - echo "Setting Workspace to $WORKSPACE" -fi - -# allow the location of the script to be overridden -if [ -z "$fdroid" ]; then - fdroid="$WORKSPACE/fdroid" -fi - -# allow the location of aapt to be overridden -if [ -z "$aapt" ]; then - aapt=`ls -1 $ANDROID_HOME/build-tools/*/aapt 2> /dev/null | sort | tail -1` -fi - -# try to use GNU sed on OSX/BSD cuz BSD sed sucks -if which gsed; then - sed="gsed" -else - sed="sed" -fi - -# allow the location of git to be overridden -if [ -z "$git" ]; then - # shellcheck disable=SC2089 - git="env HOME= GIT_AUTHOR_NAME='Test' GIT_AUTHOR_EMAIL='no@mail' GIT_COMMITTER_NAME='Test' GIT_COMMITTER_EMAIL='no@mail' git" -fi - set -x # show each command as it is executed #------------------------------------------------------------------------------# @@ -166,1283 +20,9 @@ echo_header "run commit hooks" cd $WORKSPACE test -x ./hooks/pre-commit && ./hooks/pre-commit - #------------------------------------------------------------------------------# echo_header "run unit tests" python3 -m unittest -v -#------------------------------------------------------------------------------# -echo_header "print fdroid version" - -$fdroid --version - - -#------------------------------------------------------------------------------# -echo_header 'run process when building and signing are on separate machines' - -if use_apksigner; then - REPOROOT=`create_test_dir` - cd $REPOROOT - cp $WORKSPACE/tests/keystore.jks $REPOROOT/ - $fdroid init --keystore keystore.jks --repo-keyalias=sova - echo 'make_current_version_link: true' >> config.yml - echo 'keystorepass: r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' >> config.yml - echo 'keypass: r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' >> config.yml - echo 'keydname: "CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US"' >> config.yml - test -d archive || mkdir archive - test -d metadata || mkdir metadata - cp $WORKSPACE/tests/metadata/info.guardianproject.urzip.yml metadata/ - test -d repo || mkdir repo - test -d unsigned || mkdir unsigned - cp $WORKSPACE/tests/urzip-release-unsigned.apk unsigned/info.guardianproject.urzip_100.apk - $fdroid publish --verbose - $fdroid update --verbose --nosign - $fdroid signindex --verbose - test -e repo/index.xml - test -e repo/index.jar - test -e repo/index-v1.jar - test -e tmp/apkcache.json - ! test -z tmp/apkcache.json - test -L urzip.apk - grep -F '> config.yml -mkdir metadata -cp $WORKSPACE/tests/urzip.apk $WORKSPACE/tests/bad-unicode*.apk repo/ -cp $WORKSPACE/tests/metadata/info.guardianproject.urzip.yml metadata/ - -$fdroid readmeta -$fdroid update - - -#------------------------------------------------------------------------------# -echo_header 'copy git import and run "fdroid scanner" on it' - -REPOROOT=`create_test_dir` -cd $REPOROOT -mkdir metadata -echo "AutoName: Just A Test" > metadata/org.fdroid.ci.test.app.yml -echo "WebSite: " >> metadata/org.fdroid.ci.test.app.yml -echo "Builds:" >> metadata/org.fdroid.ci.test.app.yml -echo " - versionName: 0.3" >> metadata/org.fdroid.ci.test.app.yml -echo " versionCode: 300" >> metadata/org.fdroid.ci.test.app.yml -echo " commit: 0.3" >> metadata/org.fdroid.ci.test.app.yml -echo " subdir: app" >> metadata/org.fdroid.ci.test.app.yml -echo " gradle:" >> metadata/org.fdroid.ci.test.app.yml -echo " - yes" >> metadata/org.fdroid.ci.test.app.yml -echo "" >> metadata/org.fdroid.ci.test.app.yml -echo "Repo: https://gitlab.com/fdroid/ci-test-app.git" >> metadata/org.fdroid.ci.test.app.yml -echo "RepoType: git" >> metadata/org.fdroid.ci.test.app.yml -mkdir build -git clone https://gitlab.com/fdroid/ci-test-app.git build/org.fdroid.ci.test.app -ls -l build/org.fdroid.ci.test.app -$fdroid scanner org.fdroid.ci.test.app --verbose - - -#------------------------------------------------------------------------------# -echo_header "copy tests/repo, generate java/gpg keys, update, and gpgsign" - -REPOROOT=`create_test_dir` -GNUPGHOME=$REPOROOT/gnupghome -cd $REPOROOT -fdroid_init_with_prebuilt_keystore -cp -a \ - $WORKSPACE/tests/config \ - $WORKSPACE/tests/metadata \ - $WORKSPACE/tests/repo \ - $REPOROOT/ -cp -a $WORKSPACE/tests/gnupghome $GNUPGHOME -chmod 0700 $GNUPGHOME -echo "install_list: org.adaway" >> config.yml -echo "uninstall_list: [com.android.vending, com.facebook.orca]" >> config.yml -echo "gpghome: $GNUPGHOME" >> config.yml -echo "gpgkey: CE71F7FB" >> config.yml -echo "mirrors: ['http://foobarfoobarfoobar.onion/fdroid', 'https://foo.bar/fdroid']" >> config.yml -$fdroid update --verbose --pretty -test -e repo/index.xml -test -e repo/index.jar -test -e repo/index-v1.jar -grep -F ' repo/index-v2.org.json -$sed -z 's/,\s*"ipfsCIDv1": *"[a-z0-9]*"//g' repo/index-v2.json > repo/index-v2.mod.json -$sed -i --expression='s,"timestamp": [0-9]*,"timestamp": 1676634233000,' repo/index-v2.mod.json -diff -uw repo/index-v2.org.json repo/index-v2.mod.json - - -#------------------------------------------------------------------------------# -echo_header 'test moving lots of APKs to the archive' - -REPOROOT=`create_test_dir` -cd $REPOROOT -fdroid_init_with_prebuilt_keystore -$sed -i.tmp '/allow_disabled_algorithms/d' config.yml -test -d metadata || mkdir metadata -cp $WORKSPACE/tests/metadata/*.yml metadata/ -echo 'Summary: good test version of urzip' > metadata/info.guardianproject.urzip.yml -echo 'Summary: good MD5 sig, which is disabled algorithm' > metadata/org.bitbucket.tickytacky.mirrormirror.yml -$sed -i.tmp '/ArchivePolicy:/d' metadata/*.yml -test -d repo || mkdir repo -cp $WORKSPACE/tests/urzip.apk \ - $WORKSPACE/tests/org.bitbucket.tickytacky.mirrormirror_[0-9].apk \ - $WORKSPACE/tests/repo/com.politedroid_[0-9].apk \ - $WORKSPACE/tests/repo/obb.main.twoversions_110161[357].apk \ - repo/ -printf '\narchive_older: 3\n' >> config.yml - -$fdroid update --pretty --nosign -if use_apksigner; then - test `grep '' archive/index.xml | wc -l` -eq 2 - test `grep '' repo/index.xml | wc -l` -eq 10 -else - echo "This will fail when jarsigner allows MD5 for APK signatures" - test `grep '' archive/index.xml | wc -l` -eq 5 - test `grep '' repo/index.xml | wc -l` -eq 7 -fi - - -#------------------------------------------------------------------------------# -if ! use_apksigner; then - echo_header 'test per-app "Archive Policy"' - - REPOROOT=`create_test_dir` - cd $REPOROOT - fdroid_init_with_prebuilt_keystore - test -d metadata || mkdir metadata - cp $WORKSPACE/tests/metadata/com.politedroid.yml metadata/ - test -d repo || mkdir repo - cp $WORKSPACE/tests/repo/com.politedroid_[0-9].apk repo/ - printf '\narchive_older: 3\n' >> config.yml - - $fdroid update --pretty --nosign - test `grep '' archive/index.xml | wc -l` -eq 0 - test `grep '' repo/index.xml | wc -l` -eq 4 - grep -F com.politedroid_3.apk repo/index.xml - grep -F com.politedroid_4.apk repo/index.xml - grep -F com.politedroid_5.apk repo/index.xml - grep -F com.politedroid_6.apk repo/index.xml - test -e repo/com.politedroid_3.apk - test -e repo/com.politedroid_4.apk - test -e repo/com.politedroid_5.apk - test -e repo/com.politedroid_6.apk - - echo "enable one app in the repo" - $sed -i.tmp 's,^ArchivePolicy: 4,ArchivePolicy: 1,' metadata/com.politedroid.yml - $fdroid update --pretty --nosign - test `grep '' archive/index.xml | wc -l` -eq 3 - test `grep '' repo/index.xml | wc -l` -eq 1 - grep -F com.politedroid_3.apk archive/index.xml - grep -F com.politedroid_4.apk archive/index.xml - grep -F com.politedroid_5.apk archive/index.xml - grep -F com.politedroid_6.apk repo/index.xml - test -e archive/com.politedroid_3.apk - test -e archive/com.politedroid_4.apk - test -e archive/com.politedroid_5.apk - test -e repo/com.politedroid_6.apk - - echo "remove all apps from the repo" - $sed -i.tmp 's,^ArchivePolicy: 1,ArchivePolicy: 0,' metadata/com.politedroid.yml - $fdroid update --pretty --nosign - test `grep '' archive/index.xml | wc -l` -eq 4 - test `grep '' repo/index.xml | wc -l` -eq 0 - grep -F com.politedroid_3.apk archive/index.xml - grep -F com.politedroid_4.apk archive/index.xml - grep -F com.politedroid_5.apk archive/index.xml - grep -F com.politedroid_6.apk archive/index.xml - test -e archive/com.politedroid_3.apk - test -e archive/com.politedroid_4.apk - test -e archive/com.politedroid_5.apk - test -e archive/com.politedroid_6.apk - ! test -e repo/com.politedroid_6.apk - - echo "move back one from archive to the repo" - $sed -i.tmp 's,^ArchivePolicy: 0,ArchivePolicy: 1,' metadata/com.politedroid.yml - $fdroid update --pretty --nosign - test `grep '' archive/index.xml | wc -l` -eq 3 - test `grep '' repo/index.xml | wc -l` -eq 1 - grep -F com.politedroid_3.apk archive/index.xml - grep -F com.politedroid_4.apk archive/index.xml - grep -F com.politedroid_5.apk archive/index.xml - grep -F com.politedroid_6.apk repo/index.xml - test -e archive/com.politedroid_3.apk - test -e archive/com.politedroid_4.apk - test -e archive/com.politedroid_5.apk - ! test -e archive/com.politedroid_6.apk - test -e repo/com.politedroid_6.apk - - echo "set an earlier version as CVC and test that it's the only one not archived" - $sed -i.tmp 's,^CurrentVersionCode: 6,CurrentVersionCode: 5,' metadata/com.politedroid.yml - $fdroid update --pretty --nosign - test `grep '' archive/index.xml | wc -l` -eq 3 - test `grep '' repo/index.xml | wc -l` -eq 1 - grep -F com.politedroid_3.apk archive/index.xml - grep -F com.politedroid_4.apk archive/index.xml - grep -F com.politedroid_5.apk repo/index.xml - grep -F com.politedroid_6.apk archive/index.xml - test -e archive/com.politedroid_3.apk - test -e archive/com.politedroid_4.apk - test -e repo/com.politedroid_5.apk - ! test -e repo/com.politedroid_6.apk - test -e archive/com.politedroid_6.apk -fi - - -#------------------------------------------------------------------------------# -echo_header 'test moving old APKs to and from the archive' - -REPOROOT=`create_test_dir` -cd $REPOROOT -fdroid_init_with_prebuilt_keystore -test -d metadata || mkdir metadata -cp $WORKSPACE/tests/metadata/com.politedroid.yml metadata/ -$sed -i.tmp '/ArchivePolicy:/d' metadata/com.politedroid.yml -test -d repo || mkdir repo -cp $WORKSPACE/tests/repo/com.politedroid_[0-9].apk repo/ -printf '\narchive_older: 3\n' >> config.yml - -$fdroid update --pretty --nosign -test `grep '' archive/index.xml | wc -l` -eq 1 -test `grep '' repo/index.xml | wc -l` -eq 3 -grep -F com.politedroid_3.apk archive/index.xml -grep -F com.politedroid_4.apk repo/index.xml -grep -F com.politedroid_5.apk repo/index.xml -grep -F com.politedroid_6.apk repo/index.xml -test -e archive/com.politedroid_3.apk -test -e repo/com.politedroid_4.apk -test -e repo/com.politedroid_5.apk -test -e repo/com.politedroid_6.apk - -$sed -i.tmp 's,archive_older: 3,archive_older: 1,' config.yml -$fdroid update --pretty --nosign -test `grep '' archive/index.xml | wc -l` -eq 3 -test `grep '' repo/index.xml | wc -l` -eq 1 -grep -F com.politedroid_3.apk archive/index.xml -grep -F com.politedroid_4.apk archive/index.xml -grep -F com.politedroid_5.apk archive/index.xml -grep -F com.politedroid_6.apk repo/index.xml -test -e archive/com.politedroid_3.apk -test -e archive/com.politedroid_4.apk -test -e archive/com.politedroid_5.apk -test -e repo/com.politedroid_6.apk - -# disabling deletes from the archive -$sed -i.tmp 's/\(versionCode: 4\)/\1\n disable: testing deletion/' metadata/com.politedroid.yml -$fdroid update --pretty --nosign -test `grep '' archive/index.xml | wc -l` -eq 2 -test `grep '' repo/index.xml | wc -l` -eq 1 -grep -F com.politedroid_3.apk archive/index.xml -! grep -F com.politedroid_4.apk archive/index.xml -grep -F com.politedroid_5.apk archive/index.xml -grep -F com.politedroid_6.apk repo/index.xml -test -e archive/com.politedroid_3.apk -! test -e archive/com.politedroid_4.apk -test -e archive/com.politedroid_5.apk -test -e repo/com.politedroid_6.apk - -# disabling deletes from the repo, and promotes one from the archive -$sed -i.tmp 's/\(versionCode: 6\)/\1\n disable: testing deletion/' metadata/com.politedroid.yml -$fdroid update --pretty --nosign -test `grep '' archive/index.xml | wc -l` -eq 1 -test `grep '' repo/index.xml | wc -l` -eq 1 -grep -F com.politedroid_3.apk archive/index.xml -grep -F com.politedroid_5.apk repo/index.xml -! grep -F com.politedroid_6.apk repo/index.xml -test -e archive/com.politedroid_3.apk -test -e repo/com.politedroid_5.apk -! test -e repo/com.politedroid_6.apk - - -#------------------------------------------------------------------------------# -echo_header 'test that verify can succeed and fail' - -REPOROOT=`create_test_dir` -cd $REPOROOT -test -d tmp || mkdir tmp -test -d unsigned || mkdir unsigned -cp $WORKSPACE/tests/repo/com.politedroid_6.apk tmp/ -cp $WORKSPACE/tests/repo/com.politedroid_6.apk unsigned/ -$fdroid verify --reuse-remote-apk --verbose com.politedroid -# force a fail -cp $WORKSPACE/tests/repo/com.politedroid_5.apk unsigned/com.politedroid_6.apk -! $fdroid verify --reuse-remote-apk --verbose com.politedroid - - -#------------------------------------------------------------------------------# -echo_header 'test allowing disabled signatures in repo and archive' - -REPOROOT=`create_test_dir` -cd $REPOROOT -fdroid_init_with_prebuilt_keystore -echo 'allow_disabled_algorithms: true' >> config.yml -printf '\narchive_older: 3\n' >> config.yml -test -d metadata || mkdir metadata -cp $WORKSPACE/tests/metadata/com.politedroid.yml metadata/ -echo 'Summary: good test version of urzip' > metadata/info.guardianproject.urzip.yml -echo 'Summary: good MD5 sig, disabled algorithm' > metadata/org.bitbucket.tickytacky.mirrormirror.yml -$sed -i.tmp '/ArchivePolicy:/d' metadata/*.yml -test -d repo || mkdir repo -cp $WORKSPACE/tests/repo/com.politedroid_[0-9].apk \ - $WORKSPACE/tests/org.bitbucket.tickytacky.mirrormirror_[0-9].apk \ - $WORKSPACE/tests/urzip-badsig.apk \ - repo/ - -$fdroid update --pretty --nosign -test `grep '' archive/index.xml | wc -l` -eq 2 -test `grep '' repo/index.xml | wc -l` -eq 6 -grep -F com.politedroid_3.apk archive/index.xml -grep -F com.politedroid_4.apk repo/index.xml -grep -F com.politedroid_5.apk repo/index.xml -grep -F com.politedroid_6.apk repo/index.xml -grep -F org.bitbucket.tickytacky.mirrormirror_1.apk archive/index.xml -grep -F org.bitbucket.tickytacky.mirrormirror_2.apk repo/index.xml -grep -F org.bitbucket.tickytacky.mirrormirror_3.apk repo/index.xml -grep -F org.bitbucket.tickytacky.mirrormirror_4.apk repo/index.xml -! grep -F urzip-badsig.apk repo/index.xml -! grep -F urzip-badsig.apk archive/index.xml -test -e archive/com.politedroid_3.apk -test -e repo/com.politedroid_4.apk -test -e repo/com.politedroid_5.apk -test -e repo/com.politedroid_6.apk -test -e archive/org.bitbucket.tickytacky.mirrormirror_1.apk -test -e repo/org.bitbucket.tickytacky.mirrormirror_2.apk -test -e repo/org.bitbucket.tickytacky.mirrormirror_3.apk -test -e repo/org.bitbucket.tickytacky.mirrormirror_4.apk -test -e archive/urzip-badsig.apk - -sed -i.tmp '/apksigner:/d' config.yml -if ! use_apksigner; then - $sed -i.tmp '/allow_disabled_algorithms/d' config.yml - $fdroid update --pretty --nosign - test `grep '' archive/index.xml | wc -l` -eq 5 - test `grep '' repo/index.xml | wc -l` -eq 3 - grep -F org.bitbucket.tickytacky.mirrormirror_1.apk archive/index.xml - grep -F org.bitbucket.tickytacky.mirrormirror_2.apk archive/index.xml - grep -F org.bitbucket.tickytacky.mirrormirror_3.apk archive/index.xml - grep -F org.bitbucket.tickytacky.mirrormirror_4.apk archive/index.xml - grep -F com.politedroid_3.apk archive/index.xml - grep -F com.politedroid_4.apk repo/index.xml - grep -F com.politedroid_5.apk repo/index.xml - grep -F com.politedroid_6.apk repo/index.xml - ! grep -F urzip-badsig.apk repo/index.xml - ! grep -F urzip-badsig.apk archive/index.xml - test -e archive/org.bitbucket.tickytacky.mirrormirror_1.apk - test -e archive/org.bitbucket.tickytacky.mirrormirror_2.apk - test -e archive/org.bitbucket.tickytacky.mirrormirror_3.apk - test -e archive/org.bitbucket.tickytacky.mirrormirror_4.apk - test -e archive/com.politedroid_3.apk - test -e archive/urzip-badsig.apk - test -e repo/com.politedroid_4.apk - test -e repo/com.politedroid_5.apk - test -e repo/com.politedroid_6.apk -fi - -# test unarchiving when disabled_algorithms are allowed again -echo 'allow_disabled_algorithms: true' >> config.yml -$fdroid update --pretty --nosign -test `grep '' archive/index.xml | wc -l` -eq 2 -test `grep '' repo/index.xml | wc -l` -eq 6 -grep -F com.politedroid_3.apk archive/index.xml -grep -F com.politedroid_4.apk repo/index.xml -grep -F com.politedroid_5.apk repo/index.xml -grep -F com.politedroid_6.apk repo/index.xml -grep -F org.bitbucket.tickytacky.mirrormirror_1.apk archive/index.xml -grep -F org.bitbucket.tickytacky.mirrormirror_2.apk repo/index.xml -grep -F org.bitbucket.tickytacky.mirrormirror_3.apk repo/index.xml -grep -F org.bitbucket.tickytacky.mirrormirror_4.apk repo/index.xml -! grep -F urzip-badsig.apk repo/index.xml -! grep -F urzip-badsig.apk archive/index.xml -test -e archive/com.politedroid_3.apk -test -e repo/com.politedroid_4.apk -test -e repo/com.politedroid_5.apk -test -e repo/com.politedroid_6.apk -test -e archive/org.bitbucket.tickytacky.mirrormirror_1.apk -test -e repo/org.bitbucket.tickytacky.mirrormirror_2.apk -test -e repo/org.bitbucket.tickytacky.mirrormirror_3.apk -test -e repo/org.bitbucket.tickytacky.mirrormirror_4.apk -test -e archive/urzip-badsig.apk - -#------------------------------------------------------------------------------# -echo_header 'rename apks with `fdroid update --rename-apks`, --nosign for speed' - -REPOROOT=`create_test_dir` -cd $REPOROOT -fdroid_init_with_prebuilt_keystore -echo 'keydname: "CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US"' >> config.yml -test -d metadata || mkdir metadata -cp $WORKSPACE/tests/metadata/info.guardianproject.urzip.yml metadata/ -test -d repo || mkdir repo -cp $WORKSPACE/tests/urzip.apk "repo/asdfiuhk urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234 ö.apk" -$fdroid update --rename-apks --pretty --nosign -test -e repo/info.guardianproject.urzip_100.apk -grep -F 'info.guardianproject.urzip_100.apk' repo/index-v1.json repo/index.xml -cp $WORKSPACE/tests/urzip-release.apk repo/ -$fdroid update --rename-apks --pretty --nosign -test -e repo/info.guardianproject.urzip_100.apk -test -e repo/info.guardianproject.urzip_100_b4964fd.apk -grep -F 'info.guardianproject.urzip_100.apk' repo/index-v1.json repo/index.xml -grep -F 'info.guardianproject.urzip_100_b4964fd.apk' repo/index-v1.json -! grep -F 'info.guardianproject.urzip_100_b4964fd.apk' repo/index.xml -cp $WORKSPACE/tests/urzip-release.apk repo/ -$fdroid update --rename-apks --pretty --nosign -test -e repo/info.guardianproject.urzip_100.apk -test -e repo/info.guardianproject.urzip_100_b4964fd.apk -test -e duplicates/repo/info.guardianproject.urzip_100_b4964fd.apk -grep -F 'info.guardianproject.urzip_100.apk' repo/index-v1.json repo/index.xml -grep -F 'info.guardianproject.urzip_100_b4964fd.apk' repo/index-v1.json -! grep -F 'info.guardianproject.urzip_100_b4964fd.apk' repo/index.xml - -#------------------------------------------------------------------------------# -echo_header "test for added date being set correctly for repo and archive" -REPOROOT=`create_test_dir` -cd $REPOROOT -fdroid_init_with_prebuilt_keystore -printf '\narchive_older: 3\n' >> config.yml -mkdir -p {repo,archive,metadata,stats} -cp $WORKSPACE/tests/repo/com.politedroid_5.apk archive -cp $WORKSPACE/tests/repo/com.politedroid_6.apk repo -cp $WORKSPACE/tests/repo/index-v2.json repo -cp $WORKSPACE/tests/metadata/com.politedroid.yml metadata -#TODO: the timestamp of the oldest apk in the file should be used, even if that -# doesn't exist anymore -$sed -i -e 's/ArchivePolicy:.*/ArchivePolicy: 1 versions/' metadata/com.politedroid.yml -timestamp=1498176000000 # $(date -u --date=2017-01-01 +%s)000 -pwd - -$fdroid update --pretty --nosign -grep -F "\"added\": $timestamp" repo/index-v1.json -# the archive will have the added timestamp for the app and for the apk, both need to be there -if [ $(grep -F "\"added\": $timestamp" archive/index-v1.json | wc -l) == 2 ]; then true; else false;fi - -#------------------------------------------------------------------------------# -echo_header "test whatsnew from fastlane without CVC set" -REPOROOT=`create_test_dir` -cd $REPOROOT -fdroid_init_with_prebuilt_keystore -mkdir -p metadata/com.politedroid/en-US/changelogs/ -cp $WORKSPACE/tests/repo/com.politedroid_6.apk repo -cp $WORKSPACE/tests/metadata/com.politedroid.yml metadata -echo "whatsnew test" > metadata/com.politedroid/en-US/changelogs/6.txt -$sed -i -e '/CurrentVersion/d' metadata/com.politedroid.yml -$fdroid update --pretty --nosign -grep -F 'whatsnew' repo/index-v1.json - -#------------------------------------------------------------------------------# -echo_header "test metadata checks" - -REPOROOT=`create_test_dir` -cd $REPOROOT - -mkdir repo -cp $WORKSPACE/tests/urzip.apk $REPOROOT/repo/ - -set +e -$fdroid build -if [ $? -eq 0 ]; then - echo "This should have failed because there is no metadata!" - exit 1 -else - echo "testing metadata checks passed" -fi -set -e - -mkdir $REPOROOT/metadata/ -cp $WORKSPACE/tests/metadata/org.smssecure.smssecure.yml $REPOROOT/metadata/ -$fdroid readmeta - - -#------------------------------------------------------------------------------# -echo_header "ensure commands that don't need the JDK work without a JDK configed" - -REPOROOT=`create_test_dir` -cd $REPOROOT -mkdir repo -mkdir metadata -echo "License: GPL-2.0-only" >> metadata/fake.yml -echo "Summary: Yup still fake" >> metadata/fake.yml -echo "Categories: [Internet]" >> metadata/fake.yml -echo "Description: |" >> metadata/fake.yml -echo " this is fake" >> metadata/fake.yml - -# fake that no JDKs are available -cat > config.yml <> config.yml - -$fdroid checkupdates --allow-dirty || true -which gpg && $fdroid gpgsign -$fdroid lint -$fdroid readmeta -$fdroid rewritemeta fake -$fdroid deploy -$fdroid deploy -$fdroid scanner - -# run these to get their output, but the are not setup, so don't fail -$fdroid build || true -$fdroid import || true -$fdroid install --no || true - - -#------------------------------------------------------------------------------# -# only run this test if running from a git repo, not all files are in the tarball -if [ -e .git/config ]; then - echo_header "create a source tarball" - - cd $WORKSPACE - ./setup.py compile_catalog sdist - - REPOROOT=`create_test_dir` - cd $REPOROOT - tar xzf `ls -1 $WORKSPACE/dist/fdroidserver-*.tar.gz | sort -n | tail -1` - cd $REPOROOT - # shellcheck disable=SC2211 - ./fdroidserver-*/fdroid init - copy_apks_into_repo $REPOROOT - # shellcheck disable=SC2211 - ./fdroidserver-*/fdroid update --create-metadata --verbose -fi - -#------------------------------------------------------------------------------# -echo_header "test config checks of local_copy_dir" - -REPOROOT=`create_test_dir` -cd $REPOROOT -$fdroid init -$fdroid update --create-metadata --verbose -$fdroid readmeta -LOCAL_COPY_DIR=`create_test_dir`/fdroid -$fdroid deploy --local-copy-dir=$LOCAL_COPY_DIR -$fdroid deploy --local-copy-dir=$LOCAL_COPY_DIR --verbose - -# now test the errors work -set +e -$fdroid deploy --local-copy-dir=thisisnotanabsolutepath -if [ $? -eq 0 ]; then - echo "This should have failed because thisisnotanabsolutepath is not an absolute path!" - exit 1 -else - echo "testing absolute path checker passed" -fi -$fdroid deploy --local-copy-dir=/tmp/IReallyDoubtThisPathExistsasdfasdf -if [ $? -eq 0 ]; then - echo "This should have failed because the path does not end with 'fdroid'!" - exit 1 -else - echo "testing dirname exists checker passed" -fi -$fdroid deploy --local-copy-dir=/tmp/IReallyDoubtThisPathExistsasdfasdf/fdroid -if [ $? -eq 0 ]; then - echo "This should have failed because the dirname path does not exist!" - exit 1 -else - echo "testing dirname exists checker passed" -fi -set -e - - -#------------------------------------------------------------------------------# -echo_header "setup a new repo from scratch using ANDROID_HOME and do a local sync" - -REPOROOT=`create_test_dir` -cd $REPOROOT -fdroid_init_with_prebuilt_keystore -copy_apks_into_repo $REPOROOT -$fdroid update --create-metadata --verbose -$fdroid readmeta -grep -F '> config.yml -echo 'repo_keyalias: foo' >> config.yml -echo 'keystorepass: foo' >> config.yml -echo 'keypass: foo' >> config.yml -set +e -$fdroid update --create-metadata --verbose -if [ $? -eq 0 ]; then - echo "This should have failed because this repo has a bad/fake keystore!" - exit 1 -else - echo '`fdroid update` prompted to add keystore' -fi -set -e - - -#------------------------------------------------------------------------------# -echo_header "copy tests/repo, update with binary transparency log" - -REPOROOT=`create_test_dir` -GIT_REMOTE=`create_test_dir` -GNUPGHOME=$REPOROOT/gnupghome -cd $REPOROOT -fdroid_init_with_prebuilt_keystore -cp -a $WORKSPACE/tests/metadata $WORKSPACE/tests/repo $REPOROOT/ -echo "binary_transparency_remote: $GIT_REMOTE" >> config.yml -$fdroid update --verbose -$fdroid deploy --verbose -test -e repo/index.xml -test -e repo/index.jar -test -e repo/index-v1.jar -grep -F '> config.yml -printf "servergitmirrors: $SERVER_GIT_MIRROR\n" >> config.yml - -cp $WORKSPACE/tests/repo/com.politedroid_[345].apk repo/ -$fdroid update --create-metadata -$fdroid deploy -test -e $GIT_MIRROR/fdroid/repo/com.politedroid_3.apk -test -e $GIT_MIRROR/fdroid/repo/com.politedroid_4.apk -test -e $GIT_MIRROR/fdroid/repo/com.politedroid_5.apk -test -e $SERVER_GIT_MIRROR/fdroid/repo/com.politedroid_3.apk -test -e $SERVER_GIT_MIRROR/fdroid/repo/com.politedroid_4.apk -test -e $SERVER_GIT_MIRROR/fdroid/repo/com.politedroid_5.apk -date > $GIT_MIRROR/.git/test-stamp - -# add one more APK to trigger archiving -cp $WORKSPACE/tests/repo/com.politedroid_6.apk repo/ -$fdroid update -$fdroid deploy -test -e $REPOROOT/archive/com.politedroid_3.apk -! test -e $GIT_MIRROR/fdroid/archive/com.politedroid_3.apk -! test -e $SERVER_GIT_MIRROR/fdroid/archive/com.politedroid_3.apk -test -e $GIT_MIRROR/fdroid/repo/com.politedroid_4.apk -test -e $GIT_MIRROR/fdroid/repo/com.politedroid_5.apk -test -e $GIT_MIRROR/fdroid/repo/com.politedroid_6.apk -test -e $SERVER_GIT_MIRROR/fdroid/repo/com.politedroid_4.apk -test -e $SERVER_GIT_MIRROR/fdroid/repo/com.politedroid_5.apk -test -e $SERVER_GIT_MIRROR/fdroid/repo/com.politedroid_6.apk -before=`du -s --bytes $GIT_MIRROR/.git/ | awk '{print $1}'` - -echo "git_mirror_size_limit: 60kb" >> config.yml -$fdroid update -$fdroid deploy -test -e $REPOROOT/archive/com.politedroid_3.apk -! test -e $SERVER_GIT_MIRROR/fdroid/archive/com.politedroid_3.apk -after=`du -s --bytes $GIT_MIRROR/.git/ | awk '{print $1}'` -! test -e $GIT_MIRROR/.git/test-stamp -$git -C "$GIT_MIRROR" gc -$git -C "$SERVER_GIT_MIRROR" gc -test $before -gt $after - - -#------------------------------------------------------------------------------# -echo_header "sign binary repo in offline box, then publishing from online box" - -OFFLINE_ROOT=`create_test_dir` -KEYSTORE=$WORKSPACE/tests/keystore.p12 -LOCAL_COPY_DIR=`create_test_dir`/fdroid -mkdir $LOCAL_COPY_DIR -ONLINE_ROOT=`create_test_dir` -SERVERWEBROOT=`create_test_dir`/fdroid - -# create offline binary transparency log -cd $OFFLINE_ROOT -mkdir binary_transparency -cd binary_transparency -$git init --initial-branch=master - -# fake git remote server for binary transparency log -BINARY_TRANSPARENCY_REMOTE=`create_test_dir` - -# fake git remote server for repo mirror -SERVER_GIT_MIRROR=`create_test_dir` -cd $SERVER_GIT_MIRROR -$git init --initial-branch=master -$git config receive.denyCurrentBranch updateInstead - -cd $OFFLINE_ROOT -fdroid_init_with_prebuilt_keystore -printf '\narchive_older: 3\n' >> config.yml -cp -a $WORKSPACE/tests/metadata $WORKSPACE/tests/repo $OFFLINE_ROOT/ -mkdir $OFFLINE_ROOT/unsigned -cp $WORKSPACE/tests/urzip-release-unsigned.apk $OFFLINE_ROOT/unsigned - -echo "mirrors: ['http://foo.bar/fdroid', 'http://asdflkdsfjafdsdfhkjh.onion/fdroid']" >> config.yml -echo "servergitmirrors: $SERVER_GIT_MIRROR" >> config.yml -echo "local_copy_dir: $LOCAL_COPY_DIR" >> config.yml -$fdroid update --pretty -grep -F '' repo/index.xml -grep -F '/fdroid/archive' archive/index.xml -test `grep '' repo/index.xml | wc -l` -eq 2 -test `grep '' archive/index.xml | wc -l` -eq 2 -cd binary_transparency -[ "$($git rev-list --count HEAD)" == "1" ] -cd .. -$fdroid deploy --verbose -test -e $LOCAL_COPY_DIR/unsigned/urzip-release-unsigned.apk -grep -F '> config.yml - test -d metadata || mkdir metadata - cp $WORKSPACE/tests/metadata/com.politedroid.yml metadata/ - test -d repo || mkdir repo - test -d unsigned || mkdir unsigned - cp $WORKSPACE/tests/repo/com.politedroid_6.apk unsigned/ - $fdroid signatures unsigned/com.politedroid_6.apk - test -d metadata/com.politedroid/signatures/6 - test -f metadata/com.politedroid/signatures/6/MANIFEST.MF - test -f metadata/com.politedroid/signatures/6/RELEASE.RSA - test -f metadata/com.politedroid/signatures/6/RELEASE.SF - ! test -f repo/com.politedroid_6.apk - $fdroid publish - test -f repo/com.politedroid_6.apk - if which apksigner; then - apksigner verify repo/com.politedroid_6.apk - fi - if which jarsigner; then - jarsigner -verify repo/com.politedroid_6.apk - fi -fi - - -#------------------------------------------------------------------------------# -echo_header 'test mirroring a repo' - -if which wget; then - TESTROOT=`create_test_dir` - REPOROOT=`create_test_dir` - cp -r "$WORKSPACE/tests" "$TESTROOT" - cd "$TESTROOT/tests" - test -d archive || mkdir archive - cp repo/index-v1.json $REPOROOT/ - $fdroid update - $fdroid signindex - mv $REPOROOT/index-v1.json repo/index-v1.json - - port=321${RANDOM:3} - test $(printf $port | wc -m) -le 3 && port=52734 # when $RANDOM doesn't work - timeout 5m python3 -m http.server $port --bind 127.0.0.1 > $REPOROOT/http.server.log 2>&1 & - http_server_pid=$! - - cd $REPOROOT - # shellcheck disable=SC1007 - http_proxy= HTTP_PROXY= $fdroid mirror http://127.0.0.1:${port}/ - test -e 127.0.0.1\:${port}/repo/souch.smsbypass_9.apk - test -e 127.0.0.1\:${port}/repo/icons-640/souch.smsbypass.9.png - # the index shouldn't be saved unless it was verified - ! test -e 127.0.0.1\:${port}/repo/index-v1.jar - # shellcheck disable=SC1007 - ! http_proxy= HTTP_PROXY= $fdroid mirror "http://127.0.0.1:${port}/?fingerprint=asdfasdf" - ! test -e 127.0.0.1\:${port}/repo/index-v1.jar - # shellcheck disable=SC1007 - http_proxy= HTTP_PROXY= $fdroid mirror "http://127.0.0.1:${port}/?fingerprint=F49AF3F11EFDDF20DFFD70F5E3117B9976674167ADCA280E6B1932A0601B26F6" - test -e 127.0.0.1\:${port}/repo/index-v1.jar - - # clean up - kill -9 $http_server_pid - rm -f 127.0.0.1\:${port}/repo/*.apk 127.0.0.1\:${port}/repo/*/*/*/*.png - sleep 1 # wait for webserver thread to quit -else - echo "WARNING: wget not installed, skipping" -fi - -#------------------------------------------------------------------------------# -echo_header "Test recovering from from broken git submodules" - -# On some platforms, checkupdates submodule tests need explicit perms to use file:/// -export GIT_ALLOW_PROTOCOL=file - -ROOT=$(create_test_dir) -cd "$ROOT" -mkdir foo bar -cd foo -$git init -echo a > a -$git add a -$git commit -m "a" - -cd ../bar -$git init -$git submodule add "file://$(pwd)/../foo" baz -rm .gitmodules -$git commit -am "a" -rm -rf baz -$git checkout baz -$git tag 2 - -cd .. -mkdir repo -mkdir metadata -echo "RepoType: git" >> metadata/fake.yml -echo "Repo: file://$(pwd)/bar" >> metadata/fake.yml -echo "AutoUpdateMode: Version" >> metadata/fake.yml -echo "UpdateCheckMode: Tags" >> metadata/fake.yml -echo "UpdateCheckData: '|||'" >> metadata/fake.yml -echo "CurrentVersion: 1" >> metadata/fake.yml -echo "CurrentVersionCode: 1" >> metadata/fake.yml - -$fdroid checkupdates --allow-dirty -grep "CurrentVersionCode: 2" metadata/fake.yml - -#------------------------------------------------------------------------------# -echo_header "checkupdates ignore broken submodule" - -ROOT=$(create_test_dir) -cd "$ROOT" -mkdir foo bar -cd foo -$git init -echo a > a -$git add a -$git commit -m a - -cd ../bar -$git init -$git submodule add "file://$(pwd)/../foo" baz -$git commit -am a -$git tag 2 - -cd ../foo -# delete the commit referenced in bar -$git commit --amend -m aa -$git reflog expire --expire=now --all -$git gc --aggressive --prune=now - -cd .. -mkdir repo -mkdir metadata -echo "RepoType: git" >> metadata/fake.yml -echo "Repo: file://$(pwd)/bar" >> metadata/fake.yml -echo "Builds:" >> metadata/fake.yml -echo " - versionName: 1" >> metadata/fake.yml -echo " versionCode: 1" >> metadata/fake.yml -echo " submodules: true" >> metadata/fake.yml -echo "AutoUpdateMode: Version" >> metadata/fake.yml -echo "UpdateCheckMode: Tags" >> metadata/fake.yml -echo "UpdateCheckData: '|||'" >> metadata/fake.yml -echo "CurrentVersion: 1" >> metadata/fake.yml -echo "CurrentVersionCode: 1" >> metadata/fake.yml - -$fdroid checkupdates --allow-dirty -grep "CurrentVersionCode: 2" metadata/fake.yml - - -#------------------------------------------------------------------------------# -echo_header "checkupdates check version in submodule" - -ROOT=$(create_test_dir) -cd "$ROOT" -mkdir app sub -cd sub -$git init -echo 1 > ver -$git add ver -$git commit -m 1 - -cd ../app -$git init -$git submodule add "file://$(pwd)/../sub" -$git commit -am 1 -$git tag 1 - -cd ../sub -echo 2 > ver -$git commit -am 2 - -cd ../app -$git init -$git submodule update --remote -$git commit -am 2 - -cd .. -mkdir repo -mkdir metadata -cat > metadata/fake.yml <', + Path("repo/index.xml").read_text(), + ) + self.assertTrue(Path("repo/index.jar").is_file()) + self.assertTrue(Path("repo/index-v1.jar").is_file()) + apkcache = Path("tmp/apkcache.json") + self.assertTrue(apkcache.is_file()) + self.assertTrue(apkcache.stat().st_size > 0) + self.assertTrue(Path("urzip.apk").is_symlink()) + + def test_utf8_metadata(self): + self.fdroid_init_with_prebuilt_keystore() + self.update_yaml( + "config.yml", + { + "repo_description": "获取已安装在您的设备上的应用的", + "mirrors": ["https://foo.bar/fdroid", "http://secret.onion/fdroid"], + }, + ) + shutil.copy(FILES / "urzip.apk", "repo") + shutil.copy(FILES / "bad-unicode-πÇÇ现代通用字-български-عربي1.apk", "repo") + Path("metadata").mkdir() + shutil.copy(FILES / "metadata/info.guardianproject.urzip.yml", "metadata") + + self.assert_run(self.fdroid_cmd + ["readmeta"]) + self.assert_run(self.fdroid_cmd + ["update"]) + + def test_copy_git_import_and_run_fdroid_scanner_on_it(self): + url = "https://gitlab.com/fdroid/ci-test-app.git" + Path("metadata").mkdir() + self.update_yaml( + "metadata/org.fdroid.ci.test.app.yml", + { + "AutoName": "Just A Test", + "WebSite": None, + "Builds": [ + { + "versionName": "0.3", + "versionCode": 300, + "commit": "0.3", + "subdir": "app", + "gradle": ["yes"], + } + ], + "Repo": url, + "RepoType": "git", + }, + ) + + self.assert_run(["git", "clone", url, "build/org.fdroid.ci.test.app"]) + self.assert_run( + self.fdroid_cmd + ["scanner", "org.fdroid.ci.test.app", "--verbose"] + ) + + def test_copy_repo_generate_java_gpg_keys_update_and_gpgsign(self): + self.fdroid_init_with_prebuilt_keystore() + shutil.copytree(FILES / "repo", "repo", dirs_exist_ok=True) + for dir in ["config", "metadata", "gnupghome"]: + shutil.copytree(FILES / dir, dir) + gnupghome = Path("gnupghome").resolve() + os.chmod(gnupghome, 0o700) + self.update_yaml( + "config.yml", + { + "install_list": "org.adaway", + "uninstall_list": ["com.android.vending", "com.facebook.orca"], + "gpghome": str(gnupghome), + "gpgkey": "CE71F7FB", + "mirrors": [ + "http://foobarfoobarfoobar.onion/fdroid", + "https://foo.bar/fdroid", + ], + }, + ) + self.assert_run( + self.fdroid_cmd + ["update", "--verbose", "--pretty"], + env=os.environ | {"LC_MESSAGES": "en_US.UTF-8"}, + ) + index_xml = Path("repo/index.xml").read_text() + self.assertIn("" in line) + with open("repo/index.xml") as f: + repo_cnt = sum(1 for line in f if "" in line) + if USE_APKSIGNER: + self.assertEqual(archive_cnt, 2) + self.assertEqual(repo_cnt, 10) + else: + # This will fail when jarsigner allows MD5 for APK signatures + self.assertEqual(archive_cnt, 5) + self.assertEqual(repo_cnt, 7) + + @unittest.skipIf(USE_APKSIGNER, "runs only without apksigner") + def test_per_app_archive_policy(self): + self.fdroid_init_with_prebuilt_keystore() + Path("metadata").mkdir() + shutil.copy(FILES / "metadata/com.politedroid.yml", "metadata") + for file in FILES.glob("repo/com.politedroid_[0-9].apk"): + shutil.copy(file, "repo") + self.update_yaml("config.yml", {"archive_older": 3}) + + self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) + repo = Path("repo/index.xml").read_text() + repo_cnt = sum(1 for line in repo.splitlines() if "" in line) + archive = Path("archive/index.xml").read_text() + archive_cnt = sum(1 for line in archive.splitlines() if "" in line) + self.assertEqual(repo_cnt, 4) + self.assertEqual(archive_cnt, 0) + self.assertIn("com.politedroid_3.apk", repo) + self.assertIn("com.politedroid_4.apk", repo) + self.assertIn("com.politedroid_5.apk", repo) + self.assertIn("com.politedroid_6.apk", repo) + self.assertTrue(Path("repo/com.politedroid_3.apk").is_file()) + self.assertTrue(Path("repo/com.politedroid_4.apk").is_file()) + self.assertTrue(Path("repo/com.politedroid_5.apk").is_file()) + self.assertTrue(Path("repo/com.politedroid_6.apk").is_file()) + + # enable one app in the repo + self.update_yaml("metadata/com.politedroid.yml", {"ArchivePolicy": 1}) + self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) + repo = Path("repo/index.xml").read_text() + repo_cnt = sum(1 for line in repo.splitlines() if "" in line) + archive = Path("archive/index.xml").read_text() + archive_cnt = sum(1 for line in archive.splitlines() if "" in line) + self.assertEqual(repo_cnt, 1) + self.assertEqual(archive_cnt, 3) + self.assertIn("com.politedroid_6.apk", repo) + self.assertIn("com.politedroid_3.apk", archive) + self.assertIn("com.politedroid_4.apk", archive) + self.assertIn("com.politedroid_5.apk", archive) + self.assertTrue(Path("repo/com.politedroid_6.apk").is_file()) + self.assertTrue(Path("archive/com.politedroid_3.apk").is_file()) + self.assertTrue(Path("archive/com.politedroid_4.apk").is_file()) + self.assertTrue(Path("archive/com.politedroid_5.apk").is_file()) + + # remove all apps from the repo + self.update_yaml("metadata/com.politedroid.yml", {"ArchivePolicy": 0}) + self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) + repo = Path("repo/index.xml").read_text() + repo_cnt = sum(1 for line in repo.splitlines() if "" in line) + archive = Path("archive/index.xml").read_text() + archive_cnt = sum(1 for line in archive.splitlines() if "" in line) + self.assertEqual(repo_cnt, 0) + self.assertEqual(archive_cnt, 4) + self.assertIn("com.politedroid_3.apk", archive) + self.assertIn("com.politedroid_4.apk", archive) + self.assertIn("com.politedroid_5.apk", archive) + self.assertIn("com.politedroid_6.apk", archive) + self.assertTrue(Path("archive/com.politedroid_3.apk").is_file()) + self.assertTrue(Path("archive/com.politedroid_4.apk").is_file()) + self.assertTrue(Path("archive/com.politedroid_5.apk").is_file()) + self.assertTrue(Path("archive/com.politedroid_6.apk").is_file()) + self.assertFalse(Path("repo/com.politedroid_6.apk").exists()) + + # move back one from archive to the repo + self.update_yaml("metadata/com.politedroid.yml", {"ArchivePolicy": 1}) + self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) + repo = Path("repo/index.xml").read_text() + repo_cnt = sum(1 for line in repo.splitlines() if "" in line) + archive = Path("archive/index.xml").read_text() + archive_cnt = sum(1 for line in archive.splitlines() if "" in line) + self.assertEqual(repo_cnt, 1) + self.assertEqual(archive_cnt, 3) + self.assertIn("com.politedroid_6.apk", repo) + self.assertIn("com.politedroid_3.apk", archive) + self.assertIn("com.politedroid_4.apk", archive) + self.assertIn("com.politedroid_5.apk", archive) + self.assertTrue(Path("repo/com.politedroid_6.apk").is_file()) + self.assertTrue(Path("archive/com.politedroid_3.apk").is_file()) + self.assertTrue(Path("archive/com.politedroid_4.apk").is_file()) + self.assertTrue(Path("archive/com.politedroid_5.apk").is_file()) + self.assertFalse(Path("archive/com.politedroid_6.apk").exists()) + + # set an earlier version as CVC and test that it's the only one not archived + self.update_yaml("metadata/com.politedroid.yml", {"CurrentVersionCode": 5}) + self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) + repo = Path("repo/index.xml").read_text() + repo_cnt = sum(1 for line in repo.splitlines() if "" in line) + archive = Path("archive/index.xml").read_text() + archive_cnt = sum(1 for line in archive.splitlines() if "" in line) + self.assertEqual(repo_cnt, 1) + self.assertEqual(archive_cnt, 3) + self.assertIn("com.politedroid_5.apk", repo) + self.assertIn("com.politedroid_3.apk", archive) + self.assertIn("com.politedroid_4.apk", archive) + self.assertIn("com.politedroid_6.apk", archive) + self.assertTrue(Path("repo/com.politedroid_5.apk").is_file()) + self.assertFalse(Path("repo/com.politedroid_6.apk").exists()) + self.assertTrue(Path("archive/com.politedroid_3.apk").is_file()) + self.assertTrue(Path("archive/com.politedroid_4.apk").is_file()) + self.assertTrue(Path("archive/com.politedroid_6.apk").is_file()) + + def test_moving_old_apks_to_and_from_the_archive(self): + self.fdroid_init_with_prebuilt_keystore() + Path("metadata").mkdir() + shutil.copy(FILES / "metadata/com.politedroid.yml", "metadata") + self.remove_lines("metadata/com.politedroid.yml", ["ArchivePolicy:"]) + for file in FILES.glob("repo/com.politedroid_[0-9].apk"): + shutil.copy(file, "repo") + self.update_yaml("config.yml", {"archive_older": 3}) + + self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) + repo = Path("repo/index.xml").read_text() + repo_cnt = sum(1 for line in repo.splitlines() if "" in line) + self.assertEqual(repo_cnt, 3) + self.assertIn("com.politedroid_4.apk", repo) + self.assertIn("com.politedroid_5.apk", repo) + self.assertIn("com.politedroid_6.apk", repo) + self.assertTrue(Path("repo/com.politedroid_4.apk").is_file()) + self.assertTrue(Path("repo/com.politedroid_5.apk").is_file()) + self.assertTrue(Path("repo/com.politedroid_6.apk").is_file()) + archive = Path("archive/index.xml").read_text() + archive_cnt = sum(1 for line in archive.splitlines() if "" in line) + self.assertEqual(archive_cnt, 1) + self.assertIn("com.politedroid_3.apk", archive) + self.assertTrue(Path("archive/com.politedroid_3.apk").is_file()) + + self.update_yaml("config.yml", {"archive_older": 1}) + self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) + repo = Path("repo/index.xml").read_text() + repo_cnt = sum(1 for line in repo.splitlines() if "" in line) + self.assertEqual(repo_cnt, 1) + self.assertIn("com.politedroid_6.apk", repo) + self.assertTrue(Path("repo/com.politedroid_6.apk").is_file()) + archive = Path("archive/index.xml").read_text() + archive_cnt = sum(1 for line in archive.splitlines() if "" in line) + self.assertEqual(archive_cnt, 3) + self.assertIn("com.politedroid_3.apk", archive) + self.assertIn("com.politedroid_4.apk", archive) + self.assertIn("com.politedroid_5.apk", archive) + self.assertTrue(Path("archive/com.politedroid_3.apk").is_file()) + self.assertTrue(Path("archive/com.politedroid_4.apk").is_file()) + self.assertTrue(Path("archive/com.politedroid_5.apk").is_file()) + + # disabling deletes from the archive + metadata_path = Path("metadata/com.politedroid.yml") + metadata = metadata_path.read_text() + metadata = re.sub( + "versionCode: 4", "versionCode: 4\n disable: testing deletion", metadata + ) + metadata_path.write_text(metadata) + self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) + repo = Path("repo/index.xml").read_text() + repo_cnt = sum(1 for line in repo.splitlines() if "" in line) + self.assertEqual(repo_cnt, 1) + self.assertIn("com.politedroid_6.apk", repo) + self.assertTrue(Path("repo/com.politedroid_6.apk").is_file()) + archive = Path("archive/index.xml").read_text() + archive_cnt = sum(1 for line in archive.splitlines() if "" in line) + self.assertEqual(archive_cnt, 2) + self.assertIn("com.politedroid_3.apk", archive) + self.assertNotIn("com.politedroid_4.apk", archive) + self.assertIn("com.politedroid_5.apk", archive) + self.assertTrue(Path("archive/com.politedroid_3.apk").is_file()) + self.assertFalse(Path("archive/com.politedroid_4.apk").exists()) + self.assertTrue(Path("archive/com.politedroid_5.apk").is_file()) + + # disabling deletes from the repo, and promotes one from the archive + metadata = re.sub( + "versionCode: 6", "versionCode: 6\n disable: testing deletion", metadata + ) + metadata_path.write_text(metadata) + self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) + repo = Path("repo/index.xml").read_text() + repo_cnt = sum(1 for line in repo.splitlines() if "" in line) + self.assertEqual(repo_cnt, 1) + self.assertIn("com.politedroid_5.apk", repo) + self.assertNotIn("com.politedroid_6.apk", repo) + self.assertTrue(Path("repo/com.politedroid_5.apk").is_file()) + self.assertFalse(Path("repo/com.politedroid_6.apk").exists()) + archive = Path("archive/index.xml").read_text() + archive_cnt = sum(1 for line in archive.splitlines() if "" in line) + self.assertEqual(archive_cnt, 1) + self.assertIn("com.politedroid_3.apk", archive) + self.assertTrue(Path("archive/com.politedroid_3.apk").is_file()) + self.assertFalse(Path("archive/com.politedroid_6.apk").exists()) + + def test_that_verify_can_succeed_and_fail(self): + Path("tmp").mkdir() + Path("unsigned").mkdir() + shutil.copy(FILES / "repo/com.politedroid_6.apk", "tmp") + shutil.copy(FILES / "repo/com.politedroid_6.apk", "unsigned") + self.assert_run( + self.fdroid_cmd + + ["verify", "--reuse-remote-apk", "--verbose", "com.politedroid"] + ) + # force a fail + shutil.copy( + FILES / "repo/com.politedroid_5.apk", "unsigned/com.politedroid_6.apk" + ) + self.assert_run_fail( + self.fdroid_cmd + + ["verify", "--reuse-remote-apk", "--verbose", "com.politedroid"] + ) + + def test_allowing_disabled_signatures_in_repo_and_archive(self): + self.fdroid_init_with_prebuilt_keystore() + self.update_yaml( + "config.yml", {"allow_disabled_algorithms": True, "archive_older": 3} + ) + Path("metadata").mkdir() + shutil.copy(FILES / "metadata/com.politedroid.yml", "metadata") + self.update_yaml( + "metadata/info.guardianproject.urzip.yml", + {"Summary": "good test version of urzip"}, + replace=True, + ) + self.update_yaml( + "metadata/org.bitbucket.tickytacky.mirrormirror.yml", + {"Summary": "good MD5 sig, disabled algorithm"}, + replace=True, + ) + for file in Path("metadata").glob("*.yml"): + self.remove_lines(file, ["ArchivePolicy:"]) + for file in itertools.chain( + FILES.glob("urzip-badsig.apk"), + FILES.glob("org.bitbucket.tickytacky.mirrormirror_[0-9].apk"), + FILES.glob("repo/com.politedroid_[0-9].apk"), + ): + shutil.copy(file, "repo") + + self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) + repo = Path("repo/index.xml").read_text() + repo_cnt = sum(1 for line in repo.splitlines() if "" in line) + archive = Path("archive/index.xml").read_text() + archive_cnt = sum(1 for line in archive.splitlines() if "" in line) + self.assertEqual(repo_cnt, 6) + self.assertEqual(archive_cnt, 2) + self.assertIn("com.politedroid_4.apk", repo) + self.assertIn("com.politedroid_5.apk", repo) + self.assertIn("com.politedroid_6.apk", repo) + self.assertIn("com.politedroid_3.apk", archive) + self.assertIn("org.bitbucket.tickytacky.mirrormirror_2.apk", repo) + self.assertIn("org.bitbucket.tickytacky.mirrormirror_3.apk", repo) + self.assertIn("org.bitbucket.tickytacky.mirrormirror_4.apk", repo) + self.assertIn("org.bitbucket.tickytacky.mirrormirror_1.apk", archive) + self.assertNotIn("urzip-badsig.apk", repo) + self.assertNotIn("urzip-badsig.apk", archive) + self.assertTrue(Path("archive/com.politedroid_3.apk").is_file()) + self.assertTrue(Path("repo/com.politedroid_4.apk").is_file()) + self.assertTrue(Path("repo/com.politedroid_5.apk").is_file()) + self.assertTrue(Path("repo/com.politedroid_6.apk").is_file()) + self.assertTrue( + Path("archive/org.bitbucket.tickytacky.mirrormirror_1.apk").is_file() + ) + self.assertTrue( + Path("repo/org.bitbucket.tickytacky.mirrormirror_2.apk").is_file() + ) + self.assertTrue( + Path("repo/org.bitbucket.tickytacky.mirrormirror_3.apk").is_file() + ) + self.assertTrue( + Path("repo/org.bitbucket.tickytacky.mirrormirror_4.apk").is_file() + ) + self.assertTrue(Path("archive/urzip-badsig.apk").is_file()) + + if not USE_APKSIGNER: + self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) + repo = Path("repo/index.xml").read_text() + repo_cnt = sum(1 for line in repo.splitlines() if "" in line) + archive = Path("archive/index.xml").read_text() + archive_cnt = sum(1 for line in archive.splitlines() if "" in line) + self.assertEqual(repo_cnt, 3) + self.assertEqual(archive_cnt, 5) + self.assertIn("com.politedroid_4.apk", repo) + self.assertIn("com.politedroid_5.apk", repo) + self.assertIn("com.politedroid_6.apk", repo) + self.assertNotIn("urzip-badsig.apk", repo) + self.assertIn("org.bitbucket.tickytacky.mirrormirror_1.apk", archive) + self.assertIn("org.bitbucket.tickytacky.mirrormirror_2.apk", archive) + self.assertIn("org.bitbucket.tickytacky.mirrormirror_3.apk", archive) + self.assertIn("org.bitbucket.tickytacky.mirrormirror_4.apk", archive) + self.assertIn("com.politedroid_3.apk", archive) + self.assertNotIn("urzip-badsig.apk", archive) + self.assertTrue(Path("repo/com.politedroid_4.apk").is_file()) + self.assertTrue(Path("repo/com.politedroid_5.apk").is_file()) + self.assertTrue(Path("repo/com.politedroid_6.apk").is_file()) + self.assertTrue( + Path("archive/org.bitbucket.tickytacky.mirrormirror_1.apk").is_file() + ) + self.assertTrue( + Path("archive/org.bitbucket.tickytacky.mirrormirror_2.apk").is_file() + ) + self.assertTrue( + Path("archive/org.bitbucket.tickytacky.mirrormirror_3.apk").is_file() + ) + self.assertTrue( + Path("archive/org.bitbucket.tickytacky.mirrormirror_4.apk").is_file() + ) + self.assertTrue(Path("archive/com.politedroid_3.apk").is_file()) + self.assertTrue(Path("archive/urzip-badsig.apk").is_file()) + + # test unarchiving when disabled_algorithms are allowed again + self.update_yaml("config.yml", {"allow_disabled_algorithms": True}) + self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) + with open("archive/index.xml") as f: + archive_cnt = sum(1 for line in f if "" in line) + with open("repo/index.xml") as f: + repo_cnt = sum(1 for line in f if "" in line) + self.assertEqual(repo_cnt, 6) + self.assertEqual(archive_cnt, 2) + self.assertIn("com.politedroid_4.apk", repo) + self.assertIn("com.politedroid_5.apk", repo) + self.assertIn("com.politedroid_6.apk", repo) + self.assertIn("org.bitbucket.tickytacky.mirrormirror_2.apk", repo) + self.assertIn("org.bitbucket.tickytacky.mirrormirror_3.apk", repo) + self.assertIn("org.bitbucket.tickytacky.mirrormirror_4.apk", repo) + self.assertNotIn("urzip-badsig.apk", repo) + self.assertIn("com.politedroid_3.apk", archive) + self.assertIn("org.bitbucket.tickytacky.mirrormirror_1.apk", archive) + self.assertNotIn("urzip-badsig.apk", archive) + self.assertTrue(Path("repo/com.politedroid_4.apk").is_file()) + self.assertTrue(Path("repo/com.politedroid_5.apk").is_file()) + self.assertTrue(Path("repo/com.politedroid_6.apk").is_file()) + self.assertTrue( + Path("repo/org.bitbucket.tickytacky.mirrormirror_2.apk").is_file() + ) + self.assertTrue( + Path("repo/org.bitbucket.tickytacky.mirrormirror_3.apk").is_file() + ) + self.assertTrue( + Path("repo/org.bitbucket.tickytacky.mirrormirror_4.apk").is_file() + ) + self.assertTrue(Path("archive/com.politedroid_3.apk").is_file()) + self.assertTrue( + Path("archive/org.bitbucket.tickytacky.mirrormirror_1.apk").is_file() + ) + self.assertTrue(Path("archive/urzip-badsig.apk").is_file()) + + def test_rename_apks_with_fdroid_update_rename_apks_opt_nosign_opt_for_speed(self): + self.fdroid_init_with_prebuilt_keystore() + self.update_yaml( + "config.yml", + { + "keydname": "CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US" + }, + ) + Path("metadata").mkdir() + shutil.copy(FILES / "metadata/info.guardianproject.urzip.yml", "metadata") + shutil.copy( + FILES / "urzip.apk", + "repo/asdfiuhk urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234 ö.apk", + ) + self.assert_run( + self.fdroid_cmd + ["update", "--rename-apks", "--pretty", "--nosign"] + ) + self.assertTrue(Path("repo/info.guardianproject.urzip_100.apk").is_file()) + index_xml = Path("repo/index.xml").read_text() + index_v1_json = Path("repo/index-v1.json").read_text() + self.assertIn("info.guardianproject.urzip_100.apk", index_v1_json) + self.assertIn("info.guardianproject.urzip_100.apk", index_xml) + + shutil.copy(FILES / "urzip-release.apk", "repo") + self.assert_run( + self.fdroid_cmd + ["update", "--rename-apks", "--pretty", "--nosign"] + ) + self.assertTrue(Path("repo/info.guardianproject.urzip_100.apk").is_file()) + self.assertTrue( + Path("repo/info.guardianproject.urzip_100_b4964fd.apk").is_file() + ) + index_xml = Path("repo/index.xml").read_text() + index_v1_json = Path("repo/index-v1.json").read_text() + self.assertIn("info.guardianproject.urzip_100.apk", index_v1_json) + self.assertIn("info.guardianproject.urzip_100.apk", index_xml) + self.assertIn("info.guardianproject.urzip_100_b4964fd.apk", index_v1_json) + self.assertNotIn("info.guardianproject.urzip_100_b4964fd.apk", index_xml) + + shutil.copy(FILES / "urzip-release.apk", "repo") + self.assert_run( + self.fdroid_cmd + ["update", "--rename-apks", "--pretty", "--nosign"] + ) + self.assertTrue(Path("repo/info.guardianproject.urzip_100.apk").is_file()) + self.assertTrue( + Path("repo/info.guardianproject.urzip_100_b4964fd.apk").is_file() + ) + self.assertTrue( + Path("duplicates/repo/info.guardianproject.urzip_100_b4964fd.apk").is_file() + ) + index_xml = Path("repo/index.xml").read_text() + index_v1_json = Path("repo/index-v1.json").read_text() + self.assertIn("info.guardianproject.urzip_100.apk", index_v1_json) + self.assertIn("info.guardianproject.urzip_100.apk", index_xml) + self.assertIn("info.guardianproject.urzip_100_b4964fd.apk", index_v1_json) + self.assertNotIn("info.guardianproject.urzip_100_b4964fd.apk", index_xml) + + def test_for_added_date_being_set_correctly_for_repo_and_archive(self): + self.fdroid_init_with_prebuilt_keystore() + self.update_yaml("config.yml", {"archive_older": 3}) + Path("metadata").mkdir() + Path("archive").mkdir() + Path("stats").mkdir() + shutil.copy(FILES / "repo/com.politedroid_6.apk", "repo") + shutil.copy(FILES / "repo/index-v2.json", "repo") + shutil.copy(FILES / "repo/com.politedroid_5.apk", "archive") + shutil.copy(FILES / "metadata/com.politedroid.yml", "metadata") + + # TODO: the timestamp of the oldest apk in the file should be used, even + # if that doesn't exist anymore + self.update_yaml("metadata/com.politedroid.yml", {"ArchivePolicy": 1}) + + self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) + timestamp = int(datetime(2017, 6, 23, tzinfo=UTC).timestamp()) * 1000 + index_v1_json = Path("repo/index-v1.json").read_text() + self.assertIn(f'"added": {timestamp}', index_v1_json) + # the archive will have the added timestamp for the app and for the apk, + # both need to be there + with open("archive/index-v1.json") as f: + count = sum(1 for line in f if f'"added": {timestamp}' in line) + self.assertEqual(count, 2) + + def test_whatsnew_from_fastlane_without_cvc_set(self): + self.fdroid_init_with_prebuilt_keystore() + Path("metadata/com.politedroid/en-US/changelogs").mkdir(parents=True) + shutil.copy(FILES / "repo/com.politedroid_6.apk", "repo") + shutil.copy(FILES / "metadata/com.politedroid.yml", "metadata") + self.remove_lines("metadata/com.politedroid.yml", ["CurrentVersion:"]) + Path("metadata/com.politedroid/en-US/changelogs/6.txt").write_text( + "whatsnew test" + ) + self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) + index_v1_json = Path("repo/index-v1.json").read_text() + self.assertIn("whatsnew test", index_v1_json) + + def test_metadata_checks(self): + Path("repo").mkdir() + shutil.copy(FILES / "urzip.apk", "repo") + # this should fail because there is no metadata + self.assert_run_fail(self.fdroid_cmd + ["build"]) + Path("metadata").mkdir() + shutil.copy(FILES / "metadata/org.smssecure.smssecure.yml", "metadata") + self.assert_run(self.fdroid_cmd + ["readmeta"]) + + def test_ensure_commands_that_dont_need_the_jdk_work_without_a_jdk_configured(self): + Path("repo").mkdir() + Path("metadata").mkdir() + self.update_yaml( + "metadata/fake.yml", + { + "License": "GPL-2.0-only", + "Summary": "Yup still fake", + "Categories": ["Internet"], + "Description": "this is fake", + }, + ) + # fake that no JDKs are available + self.update_yaml( + "config.yml", {"categories": ["Internet"], "java_paths": {}}, replace=True + ) + local_copy_dir = self.tmp / "fdroid" + (local_copy_dir / "repo").mkdir(parents=True) + self.update_yaml( + "config.yml", {"local_copy_dir": str(local_copy_dir.resolve())} + ) + + subprocess.run(self.fdroid_cmd + ["checkupdates", "--allow-dirty"]) + if shutil.which("gpg"): + self.assert_run(self.fdroid_cmd + ["gpgsign"]) + self.assert_run(self.fdroid_cmd + ["lint"]) + self.assert_run(self.fdroid_cmd + ["readmeta"]) + self.assert_run(self.fdroid_cmd + ["rewritemeta", "fake"]) + self.assert_run(self.fdroid_cmd + ["deploy"]) + self.assert_run(self.fdroid_cmd + ["scanner"]) + + # run these to get their output, but the are not setup, so don't fail + subprocess.run(self.fdroid_cmd + ["build"]) + subprocess.run(self.fdroid_cmd + ["import"]) + subprocess.run(self.fdroid_cmd + ["install", "-n"]) + + def test_config_checks_of_local_copy_dir(self): + self.assert_run(self.fdroid_cmd + ["init"]) + self.assert_run(self.fdroid_cmd + ["update", "--create-metadata", "--verbose"]) + self.assert_run(self.fdroid_cmd + ["readmeta"]) + local_copy_dir = (self.tmp / "fdroid").resolve() + local_copy_dir.mkdir() + self.assert_run( + self.fdroid_cmd + ["deploy", "--local-copy-dir", local_copy_dir] + ) + self.assert_run( + self.fdroid_cmd + + ["deploy", "--local-copy-dir", local_copy_dir, "--verbose"] + ) + + # this should fail because thisisnotanabsolutepath is not an absolute path + self.assert_run_fail( + self.fdroid_cmd + ["deploy", "--local-copy-dir", "thisisnotanabsolutepath"] + ) + # this should fail because the path doesn't end with "fdroid" + self.assert_run_fail( + self.fdroid_cmd + + ["deploy", "--local-copy-dir", "/tmp/IReallyDoubtThisPathExistsasdfasdf"] + ) + # this should fail because the dirname path does not exist + self.assert_run_fail( + self.fdroid_cmd + + [ + "deploy", + "--local-copy-dir", + "/tmp/IReallyDoubtThisPathExistsasdfasdf/fdroid", + ] + ) + + def test_setup_a_new_repo_from_scratch_using_android_home_and_do_a_local_sync(self): + self.fdroid_init_with_prebuilt_keystore() + self.copy_apks_into_repo() + self.assert_run(self.fdroid_cmd + ["update", "--create-metadata", "--verbose"]) + self.assert_run(self.fdroid_cmd + ["readmeta"]) + self.assertIn(" 0) + + def test_check_duplicate_files_are_properly_handled_by_fdroid_update(self): + self.fdroid_init_with_prebuilt_keystore() + Path("metadata").mkdir() + shutil.copy(FILES / "metadata/obb.mainpatch.current.yml", "metadata") + shutil.copy(FILES / "repo/obb.mainpatch.current_1619.apk", "repo") + shutil.copy( + FILES / "repo/obb.mainpatch.current_1619_another-release-key.apk", "repo" + ) + self.assert_run(self.fdroid_cmd + ["update", "--pretty"]) + index_xml = Path("repo/index.xml").read_text() + index_v1_json = Path("repo/index-v1.json").read_text() + self.assertNotIn( + "obb.mainpatch.current_1619_another-release-key.apk", index_xml + ) + self.assertIn("obb.mainpatch.current_1619.apk", index_xml) + self.assertIn("obb.mainpatch.current_1619.apk", index_v1_json) + self.assertIn( + "obb.mainpatch.current_1619_another-release-key.apk", index_v1_json + ) + # die if there are exact duplicates + shutil.copy(FILES / "repo/obb.mainpatch.current_1619.apk", "repo/duplicate.apk") + self.assert_run_fail(self.fdroid_cmd + ["update"]) + + def test_setup_new_repo_from_scratch_using_android_home_env_var_putting_apks_in_repo_first( + self, + ): + Path("repo").mkdir() + self.copy_apks_into_repo() + self.fdroid_init_with_prebuilt_keystore() + self.assert_run(self.fdroid_cmd + ["update", "--create-metadata", "--verbose"]) + self.assert_run(self.fdroid_cmd + ["readmeta"]) + self.assertIn(" 0) + + def test_setup_a_new_repo_manually_and_generate_a_keystore(self): + self.assertFalse(Path("keystore.p12").exists()) + # this should fail because this repo has no keystore + self.assert_run_fail(self.fdroid_cmd + ["update"]) + self.assert_run(self.fdroid_cmd + ["update", "--create-key"]) + self.assertTrue(Path("keystore.p12").is_file()) + self.copy_apks_into_repo() + self.assert_run(self.fdroid_cmd + ["update", "--create-metadata", "--verbose"]) + self.assert_run(self.fdroid_cmd + ["readmeta"]) + self.assertIn(" 0) + + def test_setup_a_new_repo_from_scratch_generate_a_keystore_then_add_apk_and_update( + self, + ): + self.assert_run(self.fdroid_cmd + ["init", "--keystore", "keystore.p12"]) + self.assertTrue(Path("keystore.p12").is_file()) + self.copy_apks_into_repo() + self.assert_run(self.fdroid_cmd + ["update", "--create-metadata", "--verbose"]) + self.assert_run(self.fdroid_cmd + ["readmeta"]) + self.assertIn(" 0) + self.assertIn(" 0) + + # now set fake repo_keyalias + self.update_yaml("config.yml", {"repo_keyalias": "fake"}) + # this should fail because this repo has a bad repo_keyalias + self.assert_run_fail(self.fdroid_cmd + ["update"]) + + # this should fail because a keystore is already there + self.assert_run_fail(self.fdroid_cmd + ["update", "--create-key"]) + + # now actually create the key with the existing settings + Path("keystore.jks").unlink() + self.assert_run(self.fdroid_cmd + ["update", "--create-key"]) + self.assertTrue(Path("keystore.jks").is_file()) + + def test_setup_a_new_repo_from_scratch_using_android_home_env_var_with_git_mirror( + self, + ): + (server_git_mirror := self.tmp / "server_git_mirror").mkdir() + self.assert_run( + ["git", "-C", server_git_mirror, "init", "--initial-branch", "master"] + ) + self.assert_run( + [ + "git", + "-C", + server_git_mirror, + "config", + "receive.denyCurrentBranch", + "updateInstead", + ] + ) + + self.fdroid_init_with_prebuilt_keystore() + self.update_yaml( + "config.yml", + {"archive_older": 3, "servergitmirrors": str(server_git_mirror)}, + ) + for file in FILES.glob("repo/com.politedroid_[345].apk"): + shutil.copy(file, "repo") + self.assert_run(self.fdroid_cmd + ["update", "--create-metadata"]) + self.assert_run(self.fdroid_cmd + ["deploy"]) + git_mirror = Path("git-mirror") + self.assertTrue((git_mirror / "fdroid/repo/com.politedroid_3.apk").is_file()) + self.assertTrue((git_mirror / "fdroid/repo/com.politedroid_4.apk").is_file()) + self.assertTrue((git_mirror / "fdroid/repo/com.politedroid_5.apk").is_file()) + self.assertTrue( + (server_git_mirror / "fdroid/repo/com.politedroid_3.apk").is_file() + ) + self.assertTrue( + (server_git_mirror / "fdroid/repo/com.politedroid_4.apk").is_file() + ) + self.assertTrue( + (server_git_mirror / "fdroid/repo/com.politedroid_5.apk").is_file() + ) + (git_mirror / ".git/test-stamp").write_text(str(datetime.now())) + + # add one more APK to trigger archiving + shutil.copy(FILES / "repo/com.politedroid_6.apk", "repo") + self.assert_run(self.fdroid_cmd + ["update"]) + self.assert_run(self.fdroid_cmd + ["deploy"]) + self.assertTrue(Path("archive/com.politedroid_3.apk").is_file()) + self.assertFalse((git_mirror / "fdroid/archive/com.politedroid_3.apk").exists()) + self.assertFalse( + (server_git_mirror / "fdroid/archive/com.politedroid_3.apk").exists() + ) + self.assertTrue((git_mirror / "fdroid/repo/com.politedroid_4.apk").is_file()) + self.assertTrue((git_mirror / "fdroid/repo/com.politedroid_5.apk").is_file()) + self.assertTrue((git_mirror / "fdroid/repo/com.politedroid_6.apk").is_file()) + self.assertTrue( + (server_git_mirror / "fdroid/repo/com.politedroid_4.apk").is_file() + ) + self.assertTrue( + (server_git_mirror / "fdroid/repo/com.politedroid_5.apk").is_file() + ) + self.assertTrue( + (server_git_mirror / "fdroid/repo/com.politedroid_6.apk").is_file() + ) + before = sum( + f.stat().st_size for f in (git_mirror / ".git").glob("**/*") if f.is_file() + ) + + self.update_yaml("config.yml", {"git_mirror_size_limit": "60kb"}) + self.assert_run(self.fdroid_cmd + ["update"]) + self.assert_run(self.fdroid_cmd + ["deploy"]) + self.assertTrue(Path("archive/com.politedroid_3.apk").is_file()) + self.assertFalse( + (server_git_mirror / "fdroid/archive/com.politedroid_3.apk").exists() + ) + after = sum( + f.stat().st_size for f in (git_mirror / ".git").glob("**/*") if f.is_file() + ) + self.assertFalse((git_mirror / ".git/test-stamp").exists()) + self.assert_run(["git", "-C", git_mirror, "gc"]) + self.assert_run(["git", "-C", server_git_mirror, "gc"]) + self.assertGreater(before, after) + + def test_sign_binary_repo_in_offline_box_then_publishing_from_online_box(self): + (offline_root := self.tmp / "offline_root").mkdir() + (local_copy_dir := self.tmp / "local_copy_dir/fdroid").mkdir(parents=True) + (online_root := self.tmp / "online_root").mkdir() + (server_web_root := self.tmp / "server_web_root/fdroid").mkdir(parents=True) + + # create offline binary transparency log + (offline_root / "binary_transparency").mkdir() + os.chdir(offline_root / "binary_transparency") + self.assert_run(["git", "init", "--initial-branch", "master"]) + + # fake git remote server for binary transparency log + (binary_transparency_remote := self.tmp / "binary_transparency_remote").mkdir() + + # fake git remote server for repo mirror + (server_git_mirror := self.tmp / "server_git_mirror").mkdir() + os.chdir(server_git_mirror) + self.assert_run(["git", "init", "--initial-branch", "master"]) + self.assert_run(["git", "config", "receive.denyCurrentBranch", "updateInstead"]) + + os.chdir(offline_root) + self.fdroid_init_with_prebuilt_keystore() + shutil.copytree(FILES / "repo", "repo", dirs_exist_ok=True) + shutil.copytree(FILES / "metadata", "metadata") + Path("unsigned").mkdir() + shutil.copy(FILES / "urzip-release-unsigned.apk", "unsigned") + self.update_yaml( + "config.yml", + { + "archive_older": 3, + "mirrors": [ + "http://foo.bar/fdroid", + "http://asdflkdsfjafdsdfhkjh.onion/fdroid", + ], + "servergitmirrors": str(server_git_mirror), + "local_copy_dir": str(local_copy_dir), + }, + ) + self.assert_run(self.fdroid_cmd + ["update", "--pretty"]) + index_xml = Path("repo/index.xml").read_text() + self.assertIn("", index_xml) + mirror_cnt = sum(1 for line in index_xml.splitlines() if "" in line) + self.assertEqual(mirror_cnt, 2) + + archive_xml = Path("archive/index.xml").read_text() + self.assertIn("/fdroid/archive", archive_xml) + mirror_cnt = sum(1 for line in archive_xml.splitlines() if "" in line) + self.assertEqual(mirror_cnt, 2) + + os.chdir("binary_transparency") + proc = self.assert_run( + ["git", "rev-list", "--count", "HEAD"], capture_output=True + ) + self.assertEqual(int(proc.stdout), 1) + os.chdir(offline_root) + self.assert_run(self.fdroid_cmd + ["deploy", "--verbose"]) + self.assertTrue( + Path(local_copy_dir / "unsigned/urzip-release-unsigned.apk").is_file() + ) + self.assertIn( + " Date: Wed, 25 Dec 2024 17:32:39 +0100 Subject: [PATCH 1881/2116] Fix UTC timezone import to work on Python <3.11 --- tests/test_integration.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_integration.py b/tests/test_integration.py index 3f66574a..7a92606d 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -7,11 +7,11 @@ import subprocess import sys import threading import unittest +from datetime import datetime, timezone from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer from pathlib import Path import loguru -from datetime import UTC, datetime from androguard.core.apk import get_apkid from ruamel.yaml import YAML @@ -740,7 +740,7 @@ class IntegrationTest(unittest.TestCase): self.update_yaml("metadata/com.politedroid.yml", {"ArchivePolicy": 1}) self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) - timestamp = int(datetime(2017, 6, 23, tzinfo=UTC).timestamp()) * 1000 + timestamp = int(datetime(2017, 6, 23, tzinfo=timezone.utc).timestamp()) * 1000 index_v1_json = Path("repo/index-v1.json").read_text() self.assertIn(f'"added": {timestamp}', index_v1_json) # the archive will have the added timestamp for the app and for the apk, From 385832c1fdb90373a971739bd687b9a6c5cce50a Mon Sep 17 00:00:00 2001 From: mindston Date: Wed, 25 Dec 2024 17:50:49 +0100 Subject: [PATCH 1882/2116] Fix usage of removed $WORKSPACE variable in run-tests --- tests/run-tests | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/run-tests b/tests/run-tests index 360605ab..a790d4c7 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -8,8 +8,8 @@ echo_header() { #------------------------------------------------------------------------------# -if [ -d tests ]; then - cd tests +if [ ! -d tests ]; then + cd .. fi set -x # show each command as it is executed @@ -17,7 +17,6 @@ set -x # show each command as it is executed #------------------------------------------------------------------------------# echo_header "run commit hooks" -cd $WORKSPACE test -x ./hooks/pre-commit && ./hooks/pre-commit #------------------------------------------------------------------------------# From 96f9d7fdf8f69e12335037c9254badee72e7d6da Mon Sep 17 00:00:00 2001 From: mindston Date: Fri, 27 Dec 2024 09:49:53 +0100 Subject: [PATCH 1883/2116] Fix androguard import for versions <4 --- tests/test_integration.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_integration.py b/tests/test_integration.py index 7a92606d..71f61eb6 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -11,12 +11,12 @@ from datetime import datetime, timezone from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer from pathlib import Path -import loguru -from androguard.core.apk import get_apkid from ruamel.yaml import YAML -# suppress unnecessary logging output from get_apkid -loguru.logger.disable("androguard") +try: + from androguard.core.bytecodes.apk import get_apkid # androguard <4 +except ModuleNotFoundError: + from androguard.core.apk import get_apkid basedir = Path(__file__).parent From aeb6c612e9dbfe7ebf1d702f249dc36f9d585a06 Mon Sep 17 00:00:00 2001 From: mindston Date: Fri, 27 Dec 2024 10:48:13 +0100 Subject: [PATCH 1884/2116] Set configuration variables for tests that run Git --- tests/test_integration.py | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/tests/test_integration.py b/tests/test_integration.py index 71f61eb6..23796437 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -45,6 +45,16 @@ class IntegrationTest(unittest.TestCase): cls.tmp = WORKSPACE / ".testfiles" cls.tmp_repo = cls.tmp / "repo" + os.environ.update( + { + "GIT_AUTHOR_NAME": "Test", + "GIT_AUTHOR_EMAIL": "no@mail", + "GIT_COMMITTER_NAME": "Test", + "GIT_COMMITTER_EMAIL": "no@mail", + "GIT_ALLOW_PROTOCOL": "file:https", + } + ) + def setUp(self): self.prev_cwd = Path() self.tmp_repo.mkdir(parents=True) @@ -1389,8 +1399,7 @@ class IntegrationTest(unittest.TestCase): os.chdir("../bar") self.assert_run(["git", "init"]) self.assert_run( - ["git", "submodule", "add", f"file://{Path().resolve()}/../foo", "baz"], - env=os.environ | {"GIT_ALLOW_PROTOCOL": "file"}, + ["git", "submodule", "add", f"file://{Path().resolve()}/../foo", "baz"] ) Path(".gitmodules").unlink() self.assert_run(["git", "commit", "-am", "a"]) @@ -1428,8 +1437,7 @@ class IntegrationTest(unittest.TestCase): os.chdir("../bar") self.assert_run(["git", "init"]) self.assert_run( - ["git", "submodule", "add", f"file://{Path().resolve()}/../foo", "baz"], - env=os.environ | {"GIT_ALLOW_PROTOCOL": "file"}, + ["git", "submodule", "add", f"file://{Path().resolve()}/../foo", "baz"] ) self.assert_run(["git", "commit", "-am", "a"]) self.assert_run(["git", "tag", "2"]) @@ -1472,8 +1480,7 @@ class IntegrationTest(unittest.TestCase): os.chdir("../app") self.assert_run(["git", "init"]) self.assert_run( - ["git", "submodule", "add", f"file://{Path().resolve()}/../sub"], - env=os.environ | {"GIT_ALLOW_PROTOCOL": "file"}, + ["git", "submodule", "add", f"file://{Path().resolve()}/../sub"] ) self.assert_run(["git", "commit", "-am", "1"]) self.assert_run(["git", "tag", "1"]) @@ -1484,10 +1491,7 @@ class IntegrationTest(unittest.TestCase): os.chdir("../app") self.assert_run(["git", "init"]) - self.assert_run( - ["git", "submodule", "update", "--remote"], - env=os.environ | {"GIT_ALLOW_PROTOCOL": "file"}, - ) + self.assert_run(["git", "submodule", "update", "--remote"]) self.assert_run(["git", "commit", "-am", "2"]) os.chdir("..") @@ -1507,7 +1511,6 @@ class IntegrationTest(unittest.TestCase): }, ) self.assert_run( - self.fdroid_cmd + ["checkupdates", "--allow-dirty", "--auto", "-v"], - env=os.environ | {"GIT_ALLOW_PROTOCOL": "file"}, + self.fdroid_cmd + ["checkupdates", "--allow-dirty", "--auto", "-v"] ) self.assertIn("CurrentVersionCode: 1", Path("metadata/fake.yml").read_text()) From fa4ff197aa555158aca159595301311fafd1d27d Mon Sep 17 00:00:00 2001 From: mindston Date: Mon, 20 Jan 2025 16:45:54 +0100 Subject: [PATCH 1885/2116] Force C.UTF-8 locale for messages instead of en_US.UTF-8 --- tests/test_integration.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_integration.py b/tests/test_integration.py index 23796437..83527c7c 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -252,7 +252,7 @@ class IntegrationTest(unittest.TestCase): ) self.assert_run( self.fdroid_cmd + ["update", "--verbose", "--pretty"], - env=os.environ | {"LC_MESSAGES": "en_US.UTF-8"}, + env=os.environ | {"LC_MESSAGES": "C.UTF-8"}, ) index_xml = Path("repo/index.xml").read_text() self.assertIn(" Date: Fri, 31 Jan 2025 20:06:28 +0100 Subject: [PATCH 1887/2116] Ignore bandit insecure usage of tmp dir warnings --- tests/test_integration.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/test_integration.py b/tests/test_integration.py index a15cf67c..c9764530 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -833,7 +833,11 @@ class IntegrationTest(unittest.TestCase): # this should fail because the path doesn't end with "fdroid" self.assert_run_fail( self.fdroid_cmd - + ["deploy", "--local-copy-dir", "/tmp/IReallyDoubtThisPathExistsasdfasdf"] + + [ + "deploy", + "--local-copy-dir", + "/tmp/IReallyDoubtThisPathExistsasdfasdf", # nosec B108 + ] ) # this should fail because the dirname path does not exist self.assert_run_fail( @@ -841,7 +845,7 @@ class IntegrationTest(unittest.TestCase): + [ "deploy", "--local-copy-dir", - "/tmp/IReallyDoubtThisPathExistsasdfasdf/fdroid", + "/tmp/IReallyDoubtThisPathExistsasdfasdf/fdroid", # nosec B108 ] ) From 1720a51e9e07dd755bfeece8cc4c8e710c95c8d2 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 Feb 2025 09:28:55 +0100 Subject: [PATCH 1888/2116] replace := walrus operator usages --- tests/test_integration.py | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/tests/test_integration.py b/tests/test_integration.py index c9764530..6554457d 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -861,7 +861,8 @@ class IntegrationTest(unittest.TestCase): self.fdroid_cmd + ["deploy", "--local-copy-dir", local_copy_dir] ) - (new_tmp_repo := self.tmp / "new_repo").mkdir() + new_tmp_repo = self.tmp / "new_repo" + new_tmp_repo.mkdir() os.chdir(new_tmp_repo) self.fdroid_init_with_prebuilt_keystore() self.update_yaml("config.yml", {"sync_from_local_copy_dir": True}) @@ -901,7 +902,8 @@ class IntegrationTest(unittest.TestCase): @unittest.skip def test_check_that_fdroid_init_fails_when_build_tools_cannot_be_found(self): - (fake_android_home := self.tmp / "android-sdk").mkdir() + fake_android_home = self.tmp / "android-sdk" + fake_android_home.mkdir() self.create_fake_android_home(fake_android_home) (fake_android_home / "build-tools/34.0.0/aapt").unlink() self.assert_run_fail( @@ -916,7 +918,8 @@ class IntegrationTest(unittest.TestCase): ) def check_that_android_home_opt_overrides_android_home_env_var(self): - (fake_android_home := self.tmp / "android-sdk").mkdir() + fake_android_home = self.tmp / "android-sdk" + fake_android_home.mkdir() self.create_fake_android_home(fake_android_home) self.assert_run( self.fdroid_cmd @@ -943,7 +946,8 @@ class IntegrationTest(unittest.TestCase): # if it uses the one in ANDROID_HOME, it won't work because it is a fake # one. Only --android-home provides a working one. real_android_home = os.environ["ANDROID_HOME"] - (fake_android_home := self.tmp / "android-sdk").mkdir() + fake_android_home = self.tmp / "android-sdk" + fake_android_home.mkdir() env = os.environ.copy() env["ANDROID_HOME"] = str(fake_android_home) self.assert_run( @@ -1138,7 +1142,8 @@ class IntegrationTest(unittest.TestCase): def test_setup_a_new_repo_from_scratch_using_android_home_env_var_with_git_mirror( self, ): - (server_git_mirror := self.tmp / "server_git_mirror").mkdir() + server_git_mirror = self.tmp / "server_git_mirror" + server_git_mirror.mkdir() self.assert_run( ["git", "-C", server_git_mirror, "init", "--initial-branch", "master"] ) @@ -1218,10 +1223,14 @@ class IntegrationTest(unittest.TestCase): self.assertGreater(before, after) def test_sign_binary_repo_in_offline_box_then_publishing_from_online_box(self): - (offline_root := self.tmp / "offline_root").mkdir() - (local_copy_dir := self.tmp / "local_copy_dir/fdroid").mkdir(parents=True) - (online_root := self.tmp / "online_root").mkdir() - (server_web_root := self.tmp / "server_web_root/fdroid").mkdir(parents=True) + offline_root = self.tmp / "offline_root" + offline_root.mkdir() + local_copy_dir = self.tmp / "local_copy_dir/fdroid" + local_copy_dir.mkdir(parents=True) + online_root = self.tmp / "online_root" + online_root.mkdir() + server_web_root = self.tmp / "server_web_root/fdroid" + server_web_root.mkdir(parents=True) # create offline binary transparency log (offline_root / "binary_transparency").mkdir() @@ -1229,10 +1238,12 @@ class IntegrationTest(unittest.TestCase): self.assert_run(["git", "init", "--initial-branch", "master"]) # fake git remote server for binary transparency log - (binary_transparency_remote := self.tmp / "binary_transparency_remote").mkdir() + binary_transparency_remote = self.tmp / "binary_transparency_remote" + binary_transparency_remote.mkdir() # fake git remote server for repo mirror - (server_git_mirror := self.tmp / "server_git_mirror").mkdir() + server_git_mirror = self.tmp / "server_git_mirror" + server_git_mirror.mkdir() os.chdir(server_git_mirror) self.assert_run(["git", "init", "--initial-branch", "master"]) self.assert_run(["git", "config", "receive.denyCurrentBranch", "updateInstead"]) From 8b52740636a11a67726a98ce9659bd37d1de32cc Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 Feb 2025 10:46:36 +0100 Subject: [PATCH 1889/2116] use `for f in files` var name; avoid using keyword as var name --- tests/test_integration.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/tests/test_integration.py b/tests/test_integration.py index 6554457d..58748fb3 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -124,10 +124,10 @@ class IntegrationTest(unittest.TestCase): return True return False - for file in FILES.glob("*.apk"): - if not to_skip(file.name): + for f in FILES.glob("*.apk"): + if not to_skip(f.name): shutil.copy( - file, Path("repo") / IntegrationTest.get_fdroid_apk_filename(file) + f, Path("repo") / IntegrationTest.get_fdroid_apk_filename(f) ) @staticmethod @@ -312,15 +312,15 @@ class IntegrationTest(unittest.TestCase): {"Summary": "good MD5 sig, which is disabled algorithm"}, replace=True, ) - for file in Path("metadata").glob("*.yml"): - self.remove_lines(file, ["ArchivePolicy:"]) - for file in itertools.chain( + for f in Path("metadata").glob("*.yml"): + self.remove_lines(f, ["ArchivePolicy:"]) + for f in itertools.chain( FILES.glob("urzip.apk"), FILES.glob("org.bitbucket.tickytacky.mirrormirror_[0-9].apk"), FILES.glob("repo/com.politedroid_[0-9].apk"), FILES.glob("repo/obb.main.twoversions_110161[357].apk"), ): - shutil.copy(file, "repo") + shutil.copy(f, "repo") self.update_yaml("config.yml", {"archive_older": 3}) self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) @@ -341,8 +341,8 @@ class IntegrationTest(unittest.TestCase): self.fdroid_init_with_prebuilt_keystore() Path("metadata").mkdir() shutil.copy(FILES / "metadata/com.politedroid.yml", "metadata") - for file in FILES.glob("repo/com.politedroid_[0-9].apk"): - shutil.copy(file, "repo") + for f in FILES.glob("repo/com.politedroid_[0-9].apk"): + shutil.copy(f, "repo") self.update_yaml("config.yml", {"archive_older": 3}) self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) @@ -441,8 +441,8 @@ class IntegrationTest(unittest.TestCase): Path("metadata").mkdir() shutil.copy(FILES / "metadata/com.politedroid.yml", "metadata") self.remove_lines("metadata/com.politedroid.yml", ["ArchivePolicy:"]) - for file in FILES.glob("repo/com.politedroid_[0-9].apk"): - shutil.copy(file, "repo") + for f in FILES.glob("repo/com.politedroid_[0-9].apk"): + shutil.copy(f, "repo") self.update_yaml("config.yml", {"archive_older": 3}) self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) @@ -556,14 +556,14 @@ class IntegrationTest(unittest.TestCase): {"Summary": "good MD5 sig, disabled algorithm"}, replace=True, ) - for file in Path("metadata").glob("*.yml"): - self.remove_lines(file, ["ArchivePolicy:"]) - for file in itertools.chain( + for f in Path("metadata").glob("*.yml"): + self.remove_lines(f, ["ArchivePolicy:"]) + for f in itertools.chain( FILES.glob("urzip-badsig.apk"), FILES.glob("org.bitbucket.tickytacky.mirrormirror_[0-9].apk"), FILES.glob("repo/com.politedroid_[0-9].apk"), ): - shutil.copy(file, "repo") + shutil.copy(f, "repo") self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) repo = Path("repo/index.xml").read_text() @@ -1163,8 +1163,8 @@ class IntegrationTest(unittest.TestCase): "config.yml", {"archive_older": 3, "servergitmirrors": str(server_git_mirror)}, ) - for file in FILES.glob("repo/com.politedroid_[345].apk"): - shutil.copy(file, "repo") + for f in FILES.glob("repo/com.politedroid_[345].apk"): + shutil.copy(f, "repo") self.assert_run(self.fdroid_cmd + ["update", "--create-metadata"]) self.assert_run(self.fdroid_cmd + ["deploy"]) git_mirror = Path("git-mirror") From b933043ca1bdd92ec6b3f6e4b94006929c165213 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 6 Jun 2024 18:17:54 +0200 Subject: [PATCH 1890/2116] new helpers: get_output_extension() & get_release_apk_filename() This also moves to the standard var names: appid & versionCode --- fdroidserver/common.py | 12 +++++++++++- tests/test_integration.py | 9 +++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index b6627c43..e6602134 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1126,13 +1126,23 @@ def apk_parse_release_filename(apkname): return None, None, None +def get_output_extension(build): + if build.output: + return get_file_extension(replace_build_vars(build.output, build)) + return 'apk' + + +def get_release_apk_filename(appid, versionCode): + return f"{appid}_{versionCode}.apk" + + def get_release_filename(app, build, extension=None): if extension: return "%s_%s.%s" % (app.id, build.versionCode, extension) if build.output and get_file_extension(build.output): return "%s_%s.%s" % (app.id, build.versionCode, get_file_extension(build.output)) else: - return "%s_%s.apk" % (app.id, build.versionCode) + return get_release_apk_filename(app.id, build.versionCode) def get_toolsversion_logname(app, build): diff --git a/tests/test_integration.py b/tests/test_integration.py index 58748fb3..c42653e9 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -104,11 +104,6 @@ class IntegrationTest(unittest.TestCase): for line in filtered: f.write(line) - @staticmethod - def get_fdroid_apk_filename(file): - id, version_code, _ = get_apkid(file) - return f"{id}_{version_code}.apk" - @staticmethod def copy_apks_into_repo(): def to_skip(name): @@ -126,8 +121,10 @@ class IntegrationTest(unittest.TestCase): for f in FILES.glob("*.apk"): if not to_skip(f.name): + appid, versionCode, _ignored = get_apkid(f) shutil.copy( - f, Path("repo") / IntegrationTest.get_fdroid_apk_filename(f) + f, + Path("repo") / common.get_release_apk_filename(appid, versionCode), ) @staticmethod From 7a21c24e45423f6f8f6c2ea4ecc42fa445a4610f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 Feb 2025 11:01:49 +0100 Subject: [PATCH 1891/2116] test_integration: add docstring comments --- tests/test_integration.py | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) mode change 100644 => 100755 tests/test_integration.py diff --git a/tests/test_integration.py b/tests/test_integration.py old mode 100644 new mode 100755 index c42653e9..366355f7 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -17,6 +17,9 @@ try: except ModuleNotFoundError: from androguard.core.apk import get_apkid +# TODO: port generic tests that use index.xml to index-v2 (test that +# explicitly test index-v0 should still use index.xml) + basedir = Path(__file__).parent FILES = basedir @@ -75,6 +78,7 @@ class IntegrationTest(unittest.TestCase): @staticmethod def update_yaml(path, items, replace=False): + """Update a .yml file, e.g. config.yml, with the given items.""" yaml = YAML() doc = {} if not replace: @@ -89,6 +93,8 @@ class IntegrationTest(unittest.TestCase): @staticmethod def remove_lines(path, unwanted_strings): + """Remove the lines in the path that contain the unwanted strings.""" + def contains_unwanted(line, unwanted_strings): for str in unwanted_strings: if str in line: @@ -937,11 +943,16 @@ class IntegrationTest(unittest.TestCase): def setup_a_new_repo_from_scratch_with_keystore_and_android_home_opt_set_on_cmd_line( self, ): - # In this case, ANDROID_HOME is set to a fake, non-working version that - # will be detected by fdroid as an Android SDK install. It should use - # the path set by --android-home over the one in ANDROID_HOME, therefore - # if it uses the one in ANDROID_HOME, it won't work because it is a fake - # one. Only --android-home provides a working one. + """Test with broken setup in ANDROID_HOME. + + In this case, ANDROID_HOME is set to a fake, non-working + version that will be detected by fdroid as an Android SDK + install. It should use the path set by --android-home over the + one in ANDROID_HOME, therefore if it uses the one in + ANDROID_HOME, it won't work because it is a fake one. Only + --android-home provides a working one. + + """ real_android_home = os.environ["ANDROID_HOME"] fake_android_home = self.tmp / "android-sdk" fake_android_home.mkdir() @@ -1350,6 +1361,16 @@ class IntegrationTest(unittest.TestCase): @unittest.skipUnless(shutil.which("wget"), "requires wget") def test_mirroring_a_repo(self): + """Start a local webserver to mirror a fake repo from. + + Proxy settings via environment variables can interfere with + this test. The requests library will automatically pick up + proxy settings from environment variables. Proxy settings can + force the local connection over the proxy, which might not + support that, then this fails with an error like 405 or + others. + + """ tmp_test = self.tmp / "test" tmp_test.mkdir() shutil.copytree(FILES, tmp_test, dirs_exist_ok=True) From 820abbc87677de0990315e9f8cc607b871e9cf81 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 Feb 2025 15:16:13 +0100 Subject: [PATCH 1892/2116] 'archive/' dir might have been locally created --- tests/test_integration.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_integration.py b/tests/test_integration.py index 366355f7..f0a5b04f 100755 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -1375,7 +1375,7 @@ class IntegrationTest(unittest.TestCase): tmp_test.mkdir() shutil.copytree(FILES, tmp_test, dirs_exist_ok=True) os.chdir(tmp_test) - Path("archive").mkdir() + Path("archive").mkdir(exist_ok=True) shutil.copy("repo/index-v1.json", self.tmp_repo) self.assert_run(self.fdroid_cmd + ["update"]) self.assert_run(self.fdroid_cmd + ["signindex"]) From efce0ce0e4422288caeecdf4ce6f2b352ab67fc3 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 Feb 2025 15:18:18 +0100 Subject: [PATCH 1893/2116] use shared test function to replicate .testfiles setup * It should include a subdir named after the test case. * self.testdir is the common var name for this. * tmp_repo is not a repo/ subdir, but instead the root of the whole repo --- tests/shared_test_code.py | 2 +- tests/test_integration.py | 56 ++++++++++++++++++++------------------- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/tests/shared_test_code.py b/tests/shared_test_code.py index ec095508..59f515a7 100644 --- a/tests/shared_test_code.py +++ b/tests/shared_test_code.py @@ -79,7 +79,7 @@ def mkdir_testfiles(localmodule, test): testroot.mkdir(exist_ok=True) testdir = testroot / unittest.TestCase.id(test) testdir.mkdir(exist_ok=True) - return tempfile.mkdtemp(dir=testdir) + return Path(tempfile.mkdtemp(dir=testdir)) def mock_urlopen(status=200, body=None): diff --git a/tests/test_integration.py b/tests/test_integration.py index f0a5b04f..5fc263d4 100755 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -17,6 +17,8 @@ try: except ModuleNotFoundError: from androguard.core.apk import get_apkid +from .shared_test_code import mkdir_testfiles + # TODO: port generic tests that use index.xml to index-v2 (test that # explicitly test index-v0 should still use index.xml) @@ -44,9 +46,6 @@ class IntegrationTest(unittest.TestCase): except KeyError: cls.fdroid_cmd = [WORKSPACE / "fdroid"] - cls.tmp = WORKSPACE / ".testfiles" - cls.tmp_repo = cls.tmp / "repo" - os.environ.update( { "GIT_AUTHOR_NAME": "Test", @@ -59,12 +58,14 @@ class IntegrationTest(unittest.TestCase): def setUp(self): self.prev_cwd = Path() - self.tmp_repo.mkdir(parents=True) - os.chdir(self.tmp_repo) + self.testdir = mkdir_testfiles(WORKSPACE, self) + self.tmp_repo_root = self.testdir / "fdroid" + self.tmp_repo_root.mkdir(parents=True) + os.chdir(self.tmp_repo_root) def tearDown(self): os.chdir(self.prev_cwd) - shutil.rmtree(self.tmp) + shutil.rmtree(self.testdir) def assert_run(self, *args, **kwargs): proc = subprocess.run(*args, **kwargs) @@ -795,7 +796,7 @@ class IntegrationTest(unittest.TestCase): self.update_yaml( "config.yml", {"categories": ["Internet"], "java_paths": {}}, replace=True ) - local_copy_dir = self.tmp / "fdroid" + local_copy_dir = self.testdir / "local_copy_dir/fdroid" (local_copy_dir / "repo").mkdir(parents=True) self.update_yaml( "config.yml", {"local_copy_dir": str(local_copy_dir.resolve())} @@ -819,8 +820,8 @@ class IntegrationTest(unittest.TestCase): self.assert_run(self.fdroid_cmd + ["init"]) self.assert_run(self.fdroid_cmd + ["update", "--create-metadata", "--verbose"]) self.assert_run(self.fdroid_cmd + ["readmeta"]) - local_copy_dir = (self.tmp / "fdroid").resolve() - local_copy_dir.mkdir() + local_copy_dir = (self.testdir / "local_copy_dir/fdroid").resolve() + local_copy_dir.mkdir(parents=True) self.assert_run( self.fdroid_cmd + ["deploy", "--local-copy-dir", local_copy_dir] ) @@ -859,12 +860,13 @@ class IntegrationTest(unittest.TestCase): self.assert_run(self.fdroid_cmd + ["readmeta"]) self.assertIn(" Date: Wed, 12 Feb 2025 22:24:13 +0100 Subject: [PATCH 1894/2116] test_integration: stop trying to handle proxy errors I don't think it is possible to automatically handle those cases, because proxy setups can be so widely varied and can have privacy ramifications. The person running the test who hits proxy errors will need to handle them manually. --- tests/test_integration.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/tests/test_integration.py b/tests/test_integration.py index 5fc263d4..18c79b9a 100755 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -1393,15 +1393,13 @@ class IntegrationTest(unittest.TestCase): os.chdir(self.tmp_repo_root) host, port = httpd.socket.getsockname() url, output_dir = f"http://{host}:{port}/", Path(f"{host}:{port}") - env = os.environ.copy() - env.pop("http_proxy", None) - self.assert_run(self.fdroid_cmd + ["mirror", url], env=env) + self.assert_run(self.fdroid_cmd + ["mirror", url]) self.assertTrue((output_dir / "repo/souch.smsbypass_9.apk").is_file()) self.assertTrue((output_dir / "repo/icons-640/souch.smsbypass.9.png").is_file()) # the index shouldn't be saved unless it was verified self.assertFalse((output_dir / "repo/index-v1.jar").exists()) self.assert_run_fail( - self.fdroid_cmd + ["mirror", f"{url}?fingerprint=asdfasdf"], env=env + self.fdroid_cmd + ["mirror", f"{url}?fingerprint=asdfasdf"] ) self.assertFalse((output_dir / "repo/index-v1.jar").exists()) self.assert_run( @@ -1410,7 +1408,6 @@ class IntegrationTest(unittest.TestCase): "mirror", f"{url}?fingerprint=F49AF3F11EFDDF20DFFD70F5E3117B9976674167ADCA280E6B1932A0601B26F6", ], - env=env, ) self.assertTrue((output_dir / "repo/index-v1.jar").is_file()) From efda0f5d6cfd5fc51881db2eda14741f620c598b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 Feb 2025 22:27:37 +0100 Subject: [PATCH 1895/2116] skip gpgsign test if gpg is not availabe on the PATH --- tests/test_integration.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_integration.py b/tests/test_integration.py index 18c79b9a..195db3a3 100755 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -233,6 +233,7 @@ class IntegrationTest(unittest.TestCase): self.fdroid_cmd + ["scanner", "org.fdroid.ci.test.app", "--verbose"] ) + @unittest.skipUnless(shutil.which("gpg"), "requires command line gpg") def test_copy_repo_generate_java_gpg_keys_update_and_gpgsign(self): self.fdroid_init_with_prebuilt_keystore() shutil.copytree(FILES / "repo", "repo", dirs_exist_ok=True) From 1694966455c3adc66baf6fd36e65bdfb1aeeb5d0 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 13 Feb 2025 17:53:37 +0100 Subject: [PATCH 1896/2116] gpg requires a short path to the socket to talk to gpg-agent --- tests/test_integration.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/tests/test_integration.py b/tests/test_integration.py index 195db3a3..04839e88 100755 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -235,11 +235,15 @@ class IntegrationTest(unittest.TestCase): @unittest.skipUnless(shutil.which("gpg"), "requires command line gpg") def test_copy_repo_generate_java_gpg_keys_update_and_gpgsign(self): + """Needs tricks to make gpg-agent run in a test harness.""" self.fdroid_init_with_prebuilt_keystore() shutil.copytree(FILES / "repo", "repo", dirs_exist_ok=True) - for dir in ["config", "metadata", "gnupghome"]: + for dir in ["config", "metadata"]: shutil.copytree(FILES / dir, dir) - gnupghome = Path("gnupghome").resolve() + # gpg requires a short path to the socket to talk to gpg-agent + gnupghome = (WORKSPACE / '.testfiles/gnupghome').resolve() + shutil.rmtree(gnupghome, ignore_errors=True) + shutil.copytree(FILES / "gnupghome", gnupghome) os.chmod(gnupghome, 0o700) self.update_yaml( "config.yml", @@ -266,6 +270,9 @@ class IntegrationTest(unittest.TestCase): self.assertTrue(Path("repo/index-v1.jar").is_file()) self.assert_run(self.fdroid_cmd + ["gpgsign", "--verbose"]) + env = os.environ.copy() + env["GNUPGHOME"] = gnupghome + self.assert_run(['gpgconf', '--kill', 'gpg-agent'], env=env) self.assertTrue(Path("repo/obb.mainpatch.current_1619.apk.asc").is_file()) self.assertTrue( From f92542c7ea6c34ca5a2b8801da7f26e84eddae94 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 14 Feb 2025 11:07:51 +0100 Subject: [PATCH 1897/2116] skip test with mystery failure only on macOS https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1587#note_2273747610 This happened when this test was a shell script as well: https://gitlab.com/fdroid/fdroidserver/-/blob/2.3.5/tests/run-tests#L1244 --- tests/test_integration.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_integration.py b/tests/test_integration.py index 04839e88..d7f1231d 100755 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -1,5 +1,6 @@ import itertools import os +import platform import re import shlex import shutil @@ -1330,6 +1331,9 @@ class IntegrationTest(unittest.TestCase): ["git", "rev-list", "--count", "HEAD"], capture_output=True ) self.assertEqual(int(proc.stdout), 1) + + if platform.system() == 'Darwin': + self.skipTest('FIXME the last step of this test fails only on macOS') os.chdir(server_git_mirror) proc = self.assert_run( ["git", "rev-list", "--count", "HEAD"], capture_output=True From ecdf47d893f4cad65cf248514a1b679eac41aaac Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sat, 22 Feb 2025 23:30:55 +0100 Subject: [PATCH 1898/2116] update: do not crash on {env: } in paths in config.yml --- fdroidserver/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index e6602134..21944364 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -361,7 +361,7 @@ def fill_config_defaults(thisconfig): # Expand paths (~users and $vars) def expand_path(path): - if path is None: + if not path or not isinstance(path, str): return None orig = path path = os.path.expanduser(path) From 56865f9ba665b85b08f03b9660e50cb2d20a73c4 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 24 Feb 2025 11:58:38 +0100 Subject: [PATCH 1899/2116] checkupdates: remove auto_author: config, it is no longer used checkupdates-runner sets the required values anyway. https://gitlab.com/fdroid/checkupdates-runner/-/blob/fe3cb890dbd543ff137908b4fd8020401def2938/.gitlab-ci.yml#L35 --- fdroidserver/checkupdates.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 9731c510..60e22347 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -675,8 +675,6 @@ def checkupdates_app(app: metadata.App, auto: bool, commit: bool = False) -> Non if commit: logging.info("Commiting update for " + app.metadatapath) gitcmd = ["git", "commit", "-m", commitmsg] - if 'auto_author' in config: - gitcmd.extend(['--author', config['auto_author']]) gitcmd.extend(["--", app.metadatapath]) if subprocess.call(gitcmd) != 0: raise FDroidException("Git commit failed") From 695d97e103464532ad457a9d0c0067d75b767539 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 24 Feb 2025 16:53:41 +0100 Subject: [PATCH 1900/2116] fix: "no new line character at the end of file" If yamllint is installed `fdroid lint` will run it, and what will output the (new-line-at-end-of-file) warning message. --- tests/test_lint.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_lint.py b/tests/test_lint.py index 4056b2a6..89186676 100755 --- a/tests/test_lint.py +++ b/tests/test_lint.py @@ -345,7 +345,7 @@ class LintTest(unittest.TestCase): def test_check_categories_from_config_yml(self): """In config.yml, categories is a list.""" os.chdir(self.testdir) - Path('config.yml').write_text('categories: [foo, bar]') + Path('config.yml').write_text('categories: [foo, bar]\n') fdroidserver.lint.config = fdroidserver.common.read_config() fdroidserver.lint.load_categories_config() self.assertEqual(fdroidserver.lint.CATEGORIES_KEYS, ['foo', 'bar']) @@ -435,13 +435,13 @@ class LintTest(unittest.TestCase): def test_lint_invalid_config_keys(self): os.chdir(self.testdir) Path('config').mkdir() - Path('config/config.yml').write_text('repo:\n invalid_key: test') + Path('config/config.yml').write_text('repo:\n invalid_key: test\n') self.assertFalse(fdroidserver.lint.lint_config('config/config.yml')) def test_lint_invalid_localized_config_keys(self): os.chdir(self.testdir) Path('config/en').mkdir(parents=True) - Path('config/en/antiFeatures.yml').write_text('NonFreeNet:\n icon: test.png') + Path('config/en/antiFeatures.yml').write_text('NonFreeNet:\n icon: test.png\n') self.assertFalse(fdroidserver.lint.lint_config('config/en/antiFeatures.yml')) def test_check_certificate_pinned_binaries_empty(self): From 1ee9ea8cf9278768dd65bfb454f9ecc38160a228 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sat, 22 Feb 2025 23:27:24 +0100 Subject: [PATCH 1901/2116] lint: implement for config.yml --- fdroidserver/lint.py | 112 +++++++++++++++++++++++++++++++++++++++++++ tests/test_lint.py | 59 +++++++++++++++++++++++ 2 files changed, 171 insertions(+) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 69b0ca91..f8589897 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -213,6 +213,83 @@ regex_checks = { ], } +# config keys that are currently ignored by lint, but could be supported. +ignore_config_keys = ( + 'github_releases', + 'java_paths', +) + +bool_keys = ( + 'allow_disabled_algorithms', + 'androidobservatory', + 'build_server_always', + 'deploy_process_logs', + 'keep_when_not_allowed', + 'make_current_version_link', + 'nonstandardwebroot', + 'per_app_repos', + 'rclone', + 'refresh_scanner', + 's3cmd', + 'scan_binary', + 'sync_from_local_copy_dir', +) + +check_config_keys = ( + 'ant', + 'archive', + 'archive_description', + 'archive_icon', + 'archive_name', + 'archive_older', + 'archive_url', + 'archive_web_base_url', + 'awsaccesskeyid', + 'awsbucket', + 'awssecretkey', + 'binary_transparency_remote', + 'cachedir', + 'char_limits', + 'current_version_name_source', + 'git_mirror_size_limit', + 'github_token', + 'gpghome', + 'gpgkey', + 'gradle', + 'identity_file', + 'install_list', + 'java_paths', + 'keyaliases', + 'keydname', + 'keypass', + 'keystore', + 'keystorepass', + 'lint_licenses', + 'local_copy_dir', + 'mirrors', + 'mvn3', + 'ndk_paths', + 'path_to_custom_rclone_config', + 'rclone_config', + 'repo', + 'repo_description', + 'repo_icon', + 'repo_keyalias', + 'repo_maxage', + 'repo_name', + 'repo_pubkey', + 'repo_url', + 'repo_web_base_url', + 'scanner_signature_sources', + 'sdk_path', + 'servergitmirrors', + 'serverwebroot', + 'smartcardoptions', + 'sync_from_local_copy_dir', + 'uninstall_list', + 'virustotal_apikey', +) + locale_pattern = re.compile(r"[a-z]{2,3}(-([A-Z][a-zA-Z]+|\d+|[a-z]+))*") versioncode_check_pattern = re.compile(r"(\\d|\[(0-9|\\d)_?(a-fA-F)?])[+]") @@ -791,6 +868,41 @@ def lint_config(arg): msg += ' ' msg += _('Did you mean {code}?').format(code=', '.join(sorted(m))) print(msg) + elif path.name == config_name and path.parent.name != 'config': + valid_keys = set(tuple(common.default_config) + bool_keys + check_config_keys) + for key in ignore_config_keys: + if key in valid_keys: + valid_keys.remove(key) + for key in data: + if key not in valid_keys: + passed = False + msg = _("ERROR: {key} not a valid key!").format(key=key) + m = difflib.get_close_matches(key.lower(), valid_keys, 2, 0.5) + if m: + msg += ' ' + msg += _('Did you mean {code}?').format(code=', '.join(sorted(m))) + print(msg) + continue + + if key in bool_keys: + t = bool + else: + t = type(common.default_config.get(key, "")) + + show_error = False + if t is str: + if type(data[key]) not in (str, dict): + passed = False + show_error = True + elif type(data[key]) != t: + passed = False + show_error = True + if show_error: + print( + _("ERROR: {key}'s value should be of type {t}!").format( + key=key, t=t.__name__ + ) + ) elif path.name in (config_name, categories_name, antifeatures_name): for key in data: if path.name == config_name and key not in ('archive', 'repo'): diff --git a/tests/test_lint.py b/tests/test_lint.py index 89186676..ff6c2247 100755 --- a/tests/test_lint.py +++ b/tests/test_lint.py @@ -529,3 +529,62 @@ class LintAntiFeaturesTest(unittest.TestCase): app = fdroidserver.metadata.App() app['Builds'] = [{'antifeatures': ['Ads', 'Tracker']}] self.assertEqual(1, len(list(fdroidserver.lint.check_antiFeatures(app)))) + + +class ConfigYmlTest(LintTest): + def setUp(self): + super().setUp() + self.config_yml = Path(self.testdir) / 'config.yml' + + def test_config_yml_int(self): + self.config_yml.write_text('repo_maxage: 1\n') + self.assertTrue(fdroidserver.lint.lint_config(self.config_yml)) + + def test_config_yml_int_bad(self): + self.config_yml.write_text('repo_maxage: "1"\n') + self.assertFalse(fdroidserver.lint.lint_config(self.config_yml)) + + def test_config_yml_str(self): + self.config_yml.write_text('sdk_path: /opt/android-sdk\n') + self.assertTrue(fdroidserver.lint.lint_config(self.config_yml)) + + def test_config_yml_str_dict(self): + self.config_yml.write_text('sdk_path: {env: ANDROID_HOME}\n') + self.assertTrue(fdroidserver.lint.lint_config(self.config_yml)) + + def test_config_yml_str_bad(self): + self.config_yml.write_text('sdk_path: 1.0\n') + self.assertFalse(fdroidserver.lint.lint_config(self.config_yml)) + + def test_config_yml_bool(self): + self.config_yml.write_text("deploy_process_logs: true\n") + self.assertTrue(fdroidserver.lint.lint_config(self.config_yml)) + + def test_config_yml_bool_bad(self): + self.config_yml.write_text('deploy_process_logs: 2342fe23\n') + self.assertFalse(fdroidserver.lint.lint_config(self.config_yml)) + + def test_config_yml_dict(self): + self.config_yml.write_text("keyaliases: {com.example: '@com.foo'}\n") + self.assertTrue(fdroidserver.lint.lint_config(self.config_yml)) + + def test_config_yml_dict_bad(self): + self.config_yml.write_text('keyaliases: 2342fe23\n') + self.assertFalse(fdroidserver.lint.lint_config(self.config_yml)) + + def test_config_yml_bad_key_name(self): + self.config_yml.write_text('keyalias: 2342fe23\n') + self.assertFalse(fdroidserver.lint.lint_config(self.config_yml)) + + def test_config_yml_bad_value_for_all_keys(self): + """Check all config keys with a bad value.""" + for key in fdroidserver.lint.check_config_keys: + if key in fdroidserver.lint.bool_keys: + value = 'foobar' + else: + value = 'false' + self.config_yml.write_text(f'{key}: {value}\n') + self.assertFalse( + fdroidserver.lint.lint_config(self.config_yml), + f'{key} should fail on value of "{value}"', + ) From a37c409c74494efd32d20bb58b08daf8f96036c7 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Wed, 26 Feb 2025 10:19:22 +0000 Subject: [PATCH 1902/2116] gradle v8.13 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 9962416f..1fdc68c2 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -209,6 +209,7 @@ get_sha() { '8.11.1') echo 'f397b287023acdba1e9f6fc5ea72d22dd63669d59ed4a289a29b1a76eee151c6' ;; '8.12') echo '7a00d51fb93147819aab76024feece20b6b84e420694101f276be952e08bef03' ;; '8.12.1') echo '8d97a97984f6cbd2b85fe4c60a743440a347544bf18818048e611f5288d46c94' ;; + '8.13') echo '20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78' ;; *) exit 1 esac } @@ -229,7 +230,7 @@ d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2 7.1 7.0 4.2 4.1 4.0 3.6 d_plugin_min_gradle_v=(8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.12.1 8.12 8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.13 8.12.1 8.12 8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 642499ec944acb11d62f053e5747e6a151eb7872 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 24 Feb 2025 12:48:51 +0100 Subject: [PATCH 1903/2116] purge config.py handling, it is no longer supported --- .gitignore | 1 - .gitlab-ci.yml | 4 +- MANIFEST.in | 2 +- fdroidserver/common.py | 49 +++------- fdroidserver/init.py | 2 +- tests/config.py | 31 ------- tests/config.yml | 27 ++++++ tests/test_common.py | 198 +++++++++++++---------------------------- tests/test_index.py | 9 +- tests/test_nightly.py | 2 - tests/test_publish.py | 17 ++-- 11 files changed, 117 insertions(+), 225 deletions(-) delete mode 100644 tests/config.py create mode 100644 tests/config.yml diff --git a/.gitignore b/.gitignore index 04e92ad6..ce3a0e9a 100644 --- a/.gitignore +++ b/.gitignore @@ -27,7 +27,6 @@ tmp/ /tests/repo/status # files used in manual testing -/config.py /config.yml /tmp/ /logs/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 394c41a4..69b10ae6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -555,11 +555,11 @@ servergitmirrors: - ./tests/key-tricks.py - ssh-keyscan gitlab.com >> /root/.ssh/known_hosts - test -d /tmp/fdroid/repo || mkdir -p /tmp/fdroid/repo - - cp tests/config.py tests/keystore.jks /tmp/fdroid/ + - cp tests/config.yml tests/keystore.jks /tmp/fdroid/ - cp tests/repo/com.politedroid_6.apk /tmp/fdroid/repo/ - cd /tmp/fdroid - touch fdroid-icon.png - - printf "\nservergitmirrors = 'git@gitlab.com:fdroid/ci-test-servergitmirrors-repo.git'\n" >> config.py + - printf "\nservergitmirrors\x3a 'git@gitlab.com:fdroid/ci-test-servergitmirrors-repo.git'\n" >> config.yml - $PYTHONPATH/fdroid update --verbose --create-metadata - $PYTHONPATH/fdroid deploy --verbose - export DLURL=`grep -Eo 'https://gitlab.com/fdroid/ci-test-servergitmirrors-repo[^"]+' repo/index-v1.json` diff --git a/MANIFEST.in b/MANIFEST.in index 4f14a48d..0dac052c 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -548,7 +548,7 @@ include tests/build-tools/28.0.3/aapt-output-souch.smsbypass_9.txt include tests/build-tools/generate.sh include tests/check-fdroid-apk include tests/com.fake.IpaApp_1000000000001.ipa -include tests/config.py +include tests/config.yml include tests/config/antiFeatures.yml include tests/config/categories.yml include tests/config/de/antiFeatures.yml diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 21944364..893b14da 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -531,8 +531,7 @@ def read_config(): not required, just use defaults. config.yml is the preferred form because no code is executed when - reading it. config.py is deprecated and supported for backwards - compatibility. + reading it. config.py is deprecated and no longer supported. config.yml requires ASCII or UTF-8 encoding because this code does not auto-detect the file's encoding. That is left up to the YAML @@ -550,10 +549,6 @@ def read_config(): config_file = 'config.yml' old_config_file = 'config.py' - if os.path.exists(config_file) and os.path.exists(old_config_file): - logging.error(_("""Conflicting config files! Using {newfile}, ignoring {oldfile}!""") - .format(oldfile=old_config_file, newfile=config_file)) - if os.path.exists(config_file): logging.debug(_("Reading '{config_file}'").format(config_file=config_file)) with open(config_file, encoding='utf-8') as fp: @@ -561,19 +556,13 @@ def read_config(): if not config: config = {} config_type_check(config_file, config) - elif os.path.exists(old_config_file): - logging.warning(_("""{oldfile} is deprecated, use {newfile}""") - .format(oldfile=old_config_file, newfile=config_file)) - with io.open(old_config_file, "rb") as fp: - code = compile(fp.read(), old_config_file, 'exec') - exec(code, None, config) # nosec TODO automatically migrate - for k in ('mirrors', 'install_list', 'uninstall_list', 'serverwebroot', 'servergitroot'): - if k in config: - if not type(config[k]) in (str, list, tuple): - logging.warning( - _("'{field}' will be in random order! Use () or [] brackets if order is important!") - .format(field=k)) + if os.path.exists(old_config_file): + logging.warning( + _("""Ignoring deprecated {oldfile}, use {newfile}!""").format( + oldfile=old_config_file, newfile=config_file + ) + ) # smartcardoptions must be a list since its command line args for Popen smartcardoptions = config.get('smartcardoptions') @@ -4203,7 +4192,7 @@ def load_stats_fdroid_signing_key_fingerprints(): def write_to_config(thisconfig, key, value=None, config_file=None): - """Write a key/value to the local config.yml or config.py. + """Write a key/value to the local config.yml. NOTE: only supports writing string variables. @@ -4222,8 +4211,6 @@ def write_to_config(thisconfig, key, value=None, config_file=None): value = thisconfig[origkey] if origkey in thisconfig else thisconfig[key] if config_file: cfg = config_file - elif os.path.exists('config.py') and not os.path.exists('config.yml'): - cfg = 'config.py' else: cfg = 'config.yml' @@ -4239,19 +4226,8 @@ def write_to_config(thisconfig, key, value=None, config_file=None): if not lines[-1].endswith('\n'): lines[-1] += '\n' - # regex for finding and replacing python string variable - # definitions/initializations - if cfg.endswith('.py'): - pattern = re.compile(r'^[\s#]*' + key + r'\s*=\s*"[^"]*"') - repl = key + ' = "' + value + '"' - pattern2 = re.compile(r'^[\s#]*' + key + r"\s*=\s*'[^']*'") - repl2 = key + " = '" + value + "'" - else: - # assume .yml as default - pattern = re.compile(r'^[\s#]*' + key + r':.*') - repl = yaml.dump({key: value}, default_flow_style=False) - pattern2 = pattern - repl2 = repl + pattern = re.compile(r'^[\s#]*' + key + r':.*\n') + repl = yaml.dump({key: value}) # If we replaced this line once, we make sure won't be a # second instance of this line for this key in the document. @@ -4259,18 +4235,15 @@ def write_to_config(thisconfig, key, value=None, config_file=None): # edit config file with open(cfg, 'w') as f: for line in lines: - if pattern.match(line) or pattern2.match(line): + if pattern.match(line): if not didRepl: line = pattern.sub(repl, line) - line = pattern2.sub(repl2, line) f.write(line) didRepl = True else: f.write(line) if not didRepl: - f.write('\n') f.write(repl) - f.write('\n') def parse_xml(path): diff --git a/fdroidserver/init.py b/fdroidserver/init.py index b77fea72..326ecf4c 100644 --- a/fdroidserver/init.py +++ b/fdroidserver/init.py @@ -138,7 +138,7 @@ def main(): _("Android SDK not found at {path}!").format(path=test_config['sdk_path']) ) - if not os.path.exists('config.yml') and not os.path.exists('config.py'): + if not os.path.exists('config.yml'): # 'metadata' and 'tmp' are created in fdroid if not os.path.exists('repo'): os.mkdir('repo') diff --git a/tests/config.py b/tests/config.py deleted file mode 100644 index fa118db2..00000000 --- a/tests/config.py +++ /dev/null @@ -1,31 +0,0 @@ - -# TODO convert to config.yml! - -repo_url = "https://MyFirstFDroidRepo.org/fdroid/repo" -repo_name = "My First F-Droid Repo Demo" -repo_description = """This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid.""" - -archive_older = 3 -archive_url = "https://f-droid.org/archive" -archive_name = "My First F-Droid Archive Demo" -archive_description = """ -The repository of older versions of applications from the main demo repository. -""" - -make_current_version_link = False - -repo_keyalias = "sova" -keystore = "keystore.jks" -keystorepass = "r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=" -keypass = "r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=" -keydname = "CN=sova, OU=F-Droid" - -mirrors = ( - 'http://foobarfoobarfoobar.onion/fdroid', - 'https://foo.bar/fdroid', -) - -install_list = 'org.adaway' -uninstall_list = ('com.android.vending', 'com.facebook.orca', ) - -repo_key_sha256 = "f49af3f11efddf20dffd70f5e3117b9976674167adca280e6b1932a0601b26f6" diff --git a/tests/config.yml b/tests/config.yml new file mode 100644 index 00000000..b6f62a44 --- /dev/null +++ b/tests/config.yml @@ -0,0 +1,27 @@ +--- + +repo_url: https://MyFirstFDroidRepo.org/fdroid/repo +repo_name: My First F-Droid Repo Demo +repo_description: This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid. + +archive_older: 3 +archive_url: https://f-droid.org/archive +archive_name: My First F-Droid Archive Demo +archive_description: The repository of older versions of applications from the main demo repository. + +make_current_version_link: false + +repo_keyalias: sova +keystore: keystore.jks +keystorepass: "r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=" +keypass: "r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=" +keydname: "CN=sova, OU=F-Droid" + +mirrors: + - http://foobarfoobarfoobar.onion/fdroid + - https://foo.bar/fdroid + +install_list: org.adaway +uninstall_list: ['com.android.vending', 'com.facebook.orca'] + +repo_key_sha256: f49af3f11efddf20dffd70f5e3117b9976674167adca280e6b1932a0601b26f6 diff --git a/tests/test_common.py b/tests/test_common.py index 79b676aa..34f83773 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -58,6 +58,9 @@ class CommonTest(unittest.TestCase): os.makedirs(self.tmpdir) os.chdir(basedir) + self.verbose = '-v' in sys.argv or '--verbose' in sys.argv + fdroidserver.common.set_console_logging(self.verbose) + # these are declared as None at the top of the module file fdroidserver.common.config = None fdroidserver.common.options = None @@ -642,65 +645,65 @@ class CommonTest(unittest.TestCase): ) def test_write_to_config(self): - with tempfile.TemporaryDirectory() as tmpPath: - cfgPath = os.path.join(tmpPath, 'config.py') - with open(cfgPath, 'w') as f: - f.write( - textwrap.dedent( - """\ + """Test that config items can be added without messing up config.yml. + + The '_orig' key are where the original string values of paths + are stored. Paths have tilde expansion and env vars replaced + in fill_config_defaults(). + + """ + os.chdir(self.testdir) + config_yml = 'config.yml' + Path(config_yml).write_text( + textwrap.dedent( + """\ + # abc + # test: 'example value' + a_path: ~/android-sdk + + # comment + do_not_touch: good value + a_path: "!!!" + + key: "123" # inline""" + ) + ) + + config = {'key': 111, 'a_path_orig': '~/android-sdk'} + fdroidserver.common.write_to_config(config, 'key', config_file=config_yml) + fdroidserver.common.write_to_config( + config, 'a_path', config_file=config_yml + ) + fdroidserver.common.write_to_config( + config, 'test', value='test value', config_file=config_yml + ) + fdroidserver.common.write_to_config( + config, 'new_key', value='new', config_file=config_yml + ) + + with open(config_yml) as fp: + self.assertEqual( + fp.read(), + textwrap.dedent( + """\ # abc - # test = 'example value' - default_me= '%%%' + test: test value + a_path: ~/android-sdk # comment - do_not_touch = "good value" - default_me="!!!" + do_not_touch: good value - key="123" # inline""" - ) - ) - - cfg = {'key': '111', 'default_me_orig': 'orig'} - fdroidserver.common.write_to_config(cfg, 'key', config_file=cfgPath) - fdroidserver.common.write_to_config(cfg, 'default_me', config_file=cfgPath) - fdroidserver.common.write_to_config(cfg, 'test', value='test value', config_file=cfgPath) - fdroidserver.common.write_to_config(cfg, 'new_key', value='new', config_file=cfgPath) - - with open(cfgPath, 'r') as f: - self.assertEqual( - f.read(), - textwrap.dedent( - """\ - # abc - test = 'test value' - default_me = 'orig' - - # comment - do_not_touch = "good value" - - key = "111" # inline - - new_key = "new" + key: 111 + new_key: new """ - ), - ) + ), + ) def test_write_to_config_when_empty(self): - with tempfile.TemporaryDirectory() as tmpPath: - cfgPath = os.path.join(tmpPath, 'config.py') - with open(cfgPath, 'w') as f: - pass - fdroidserver.common.write_to_config({}, 'key', 'val', cfgPath) - with open(cfgPath, 'r') as f: - self.assertEqual( - f.read(), - textwrap.dedent( - """\ - - key = "val" - """ - ), - ) + config_yml = Path(self.testdir) / 'config.yml' + config_yml.write_text('') + fdroidserver.common.write_to_config({}, 'key', 'val', config_yml) + self.assertEqual(config_yml.read_text(), 'key: val\n') def test_apk_name_regex(self): good = [ @@ -1883,7 +1886,6 @@ class CommonTest(unittest.TestCase): """It should set defaults if no config file is found""" os.chdir(self.tmpdir) self.assertFalse(os.path.exists('config.yml')) - self.assertFalse(os.path.exists('config.py')) config = fdroidserver.common.read_config() self.assertIsNotNone(config.get('char_limits')) @@ -1892,7 +1894,6 @@ class CommonTest(unittest.TestCase): os.chdir(self.tmpdir) open('config.yml', 'w').close() self.assertTrue(os.path.exists('config.yml')) - self.assertFalse(os.path.exists('config.py')) config = fdroidserver.common.read_config() self.assertIsNotNone(config.get('char_limits')) @@ -1902,7 +1903,6 @@ class CommonTest(unittest.TestCase): with open('config.yml', 'w') as fp: fp.write('apksigner: yml') self.assertTrue(os.path.exists('config.yml')) - self.assertFalse(os.path.exists('config.py')) config = fdroidserver.common.read_config() self.assertEqual('yml', config.get('apksigner')) @@ -1913,7 +1913,6 @@ class CommonTest(unittest.TestCase): with open('config.yml', 'w', encoding='utf-8') as fp: fp.write('apksigner: ' + teststr) self.assertTrue(os.path.exists('config.yml')) - self.assertFalse(os.path.exists('config.py')) config = fdroidserver.common.read_config() self.assertEqual(teststr, config.get('apksigner')) @@ -1924,7 +1923,6 @@ class CommonTest(unittest.TestCase): with open('config.yml', 'w') as fp: yaml.dump({'apksigner': teststr}, fp) self.assertTrue(os.path.exists('config.yml')) - self.assertFalse(os.path.exists('config.py')) config = fdroidserver.common.read_config() self.assertEqual(teststr, config.get('apksigner')) @@ -1936,7 +1934,6 @@ class CommonTest(unittest.TestCase): with open('config.yml', 'w') as fp: fp.write("""keypass: {'env': 'SECRET'}""") self.assertTrue(os.path.exists('config.yml')) - self.assertFalse(os.path.exists('config.py')) config = fdroidserver.common.read_config() self.assertEqual(os.getenv('SECRET', 'fail'), config.get('keypass')) @@ -1952,16 +1949,6 @@ class CommonTest(unittest.TestCase): with self.assertRaises(yaml.scanner.ScannerError): fdroidserver.common.read_config() - def test_with_config_py(self): - """Make sure it is still possible to use config.py alone.""" - os.chdir(self.tmpdir) - with open('config.py', 'w') as fp: - fp.write('apksigner = "py"') - self.assertFalse(os.path.exists('config.yml')) - self.assertTrue(os.path.exists('config.py')) - config = fdroidserver.common.read_config() - self.assertEqual("py", config.get('apksigner')) - def test_config_perm_warning(self): """Exercise the code path that issues a warning about unsafe permissions.""" os.chdir(self.tmpdir) @@ -1973,24 +1960,6 @@ class CommonTest(unittest.TestCase): os.remove(fp.name) fdroidserver.common.config = None - with open('config.py', 'w') as fp: - fp.write('keystore = "foo.jks"') - self.assertTrue(os.path.exists(fp.name)) - os.chmod(fp.name, 0o666) # nosec B103 - fdroidserver.common.read_config() - - def test_with_both_config_yml_py(self): - """If config.yml and config.py are present, config.py should be ignored.""" - os.chdir(self.tmpdir) - with open('config.yml', 'w') as fp: - fp.write('apksigner: yml') - with open('config.py', 'w') as fp: - fp.write('apksigner = "py"') - self.assertTrue(os.path.exists('config.yml')) - self.assertTrue(os.path.exists('config.py')) - config = fdroidserver.common.read_config() - self.assertEqual('yml', config.get('apksigner')) - def test_config_repo_url(self): """repo_url ends in /repo, archive_url ends in /archive.""" os.chdir(self.tmpdir) @@ -2037,28 +2006,12 @@ class CommonTest(unittest.TestCase): os.chdir(self.tmpdir) with open('config.yml', 'w') as fp: fp.write('apksigner: yml') + os.chmod('config.yml', 0o0600) self.assertTrue(os.path.exists(fp.name)) - self.assertFalse(os.path.exists('config.py')) config = fdroidserver.common.read_config() self.assertFalse('keypass' in config) self.assertEqual('yml', config.get('apksigner')) fdroidserver.common.write_to_config(config, 'keypass', 'mysecretpassword') - with open(fp.name) as fp: - print(fp.read()) - fdroidserver.common.config = None - config = fdroidserver.common.read_config() - self.assertEqual('mysecretpassword', config['keypass']) - - def test_write_to_config_py(self): - os.chdir(self.tmpdir) - with open('config.py', 'w') as fp: - fp.write('apksigner = "py"') - self.assertTrue(os.path.exists(fp.name)) - self.assertFalse(os.path.exists('config.yml')) - config = fdroidserver.common.read_config() - self.assertFalse('keypass' in config) - self.assertEqual('py', config.get('apksigner')) - fdroidserver.common.write_to_config(config, 'keypass', 'mysecretpassword') fdroidserver.common.config = None config = fdroidserver.common.read_config() self.assertEqual('mysecretpassword', config['keypass']) @@ -2068,7 +2021,6 @@ class CommonTest(unittest.TestCase): with open('config.yml', 'w') as fp: fp.write('java_paths:\n 8: /usr/lib/jvm/java-8-openjdk\n') self.assertTrue(os.path.exists(fp.name)) - self.assertFalse(os.path.exists('config.py')) config = fdroidserver.common.read_config() self.assertEqual('/usr/lib/jvm/java-8-openjdk', config.get('java_paths', {}).get('8')) @@ -2143,10 +2095,11 @@ class CommonTest(unittest.TestCase): def test_loading_config_buildserver_yml(self): """Smoke check to make sure this file is properly parsed""" - os.chdir(self.tmpdir) - shutil.copy(os.path.join(basedir, '..', 'buildserver', 'config.buildserver.yml'), - 'config.yml') - self.assertFalse(os.path.exists('config.py')) + os.chdir(self.testdir) + shutil.copy( + os.path.join(basedir, '..', 'buildserver', 'config.buildserver.yml'), + 'config.yml', + ) fdroidserver.common.read_config() def test_setup_status_output(self): @@ -2742,35 +2695,6 @@ class CommonTest(unittest.TestCase): config['smartcardoptions'], ) - def test_get_smartcardoptions_config_py(self): - os.chdir(self.tmpdir) - with open('config.py', 'w') as fp: - fp.write( - textwrap.dedent( - """ - smartcardoptions = ''' - \t-storetype\tPKCS11 - \t-providerClass\tsun.security.pkcs11.SunPKCS11 - \t-providerArg\t/etc/pkcs11_java.cfg - - ''' - """ - ) - ) - config = fdroidserver.common.read_config() - fdroidserver.common.config = config - self.assertEqual( - [ - '-storetype', - 'PKCS11', - '-providerClass', - 'sun.security.pkcs11.SunPKCS11', - '-providerArg', - '/etc/pkcs11_java.cfg', - ], - config['smartcardoptions'], - ) - def test_load_localized_config(self): """It should load""" antiFeatures = fdroidserver.common.load_localized_config( diff --git a/tests/test_index.py b/tests/test_index.py index ea08653b..8f1b1e86 100755 --- a/tests/test_index.py +++ b/tests/test_index.py @@ -38,8 +38,8 @@ class IndexTest(unittest.TestCase): cls.index_v1_jar = basedir / 'repo' / 'index-v1.jar' def setUp(self): - (basedir / 'config.py').chmod(0o600) - os.chdir(basedir) # so read_config() can find config.py + (basedir / 'config.yml').chmod(0o600) + os.chdir(basedir) # so read_config() can find config.yml common.config = None common.options = Options @@ -380,8 +380,7 @@ class IndexTest(unittest.TestCase): with zipfile.ZipFile(jarfile, 'w', zipfile.ZIP_DEFLATED) as jar: jar.writestr('publishsigkeys.json', json.dumps(sigkeyfps)) publish.sign_sig_key_fingerprint_list(jarfile) - with open('config.py', 'w'): - pass + Path('config.yml').write_text('') index.v1_sort_packages( i, common.load_stats_fdroid_signing_key_fingerprints() @@ -701,7 +700,7 @@ class IndexTest(unittest.TestCase): ) def test_add_mirrors_to_repodict(self): - """Test based on the contents of tests/config.py""" + """Test based on the contents of tests/config.yml""" repodict = {'address': common.config['repo_url']} index.add_mirrors_to_repodict('repo', repodict) self.assertEqual( diff --git a/tests/test_nightly.py b/tests/test_nightly.py index 09d8fbcf..bc2567e2 100755 --- a/tests/test_nightly.py +++ b/tests/test_nightly.py @@ -250,7 +250,6 @@ class NightlyTest(unittest.TestCase): raise self.assertEqual(called, [['ssh', '-Tvi'], ['fdroid', 'deploy']]) - self.assertFalse(os.path.exists('config.py')) git_url = 'git@github.com:f-droid/test-nightly' mirror_url = index.get_mirror_service_urls({"url": git_url})[0] expected = { @@ -324,7 +323,6 @@ class NightlyTest(unittest.TestCase): raise self.assertEqual(called, [['ssh', '-Tvi'], ['fdroid', 'deploy']]) - self.assertFalse(os.path.exists('config.py')) expected = { 'archive_description': 'Old nightly builds that have been archived.', 'archive_name': 'fdroid/test-nightly archive', diff --git a/tests/test_publish.py b/tests/test_publish.py index 2f8be36a..eaf2f542 100755 --- a/tests/test_publish.py +++ b/tests/test_publish.py @@ -13,10 +13,12 @@ import json import os import pathlib +import ruamel.yaml import shutil import sys import unittest import tempfile +from pathlib import Path from unittest import mock from fdroidserver import publish @@ -94,8 +96,7 @@ class PublishTest(unittest.TestCase): ] os.chdir(self.testdir) - with open('config.py', 'w') as f: - pass + Path('config.yml').write_text('') publish.store_stats_fdroid_signing_key_fingerprints(appids, indent=2) @@ -116,11 +117,13 @@ class PublishTest(unittest.TestCase): } self.assertEqual(expected, common.load_stats_fdroid_signing_key_fingerprints()) - with open('config.py', 'r') as f: - self.assertEqual( - '\nrepo_key_sha256 = "c58460800c7b250a619c30c13b07b7359a43e5af71a4352d86c58ae18c9f6d41"\n', - f.read(), - ) + yaml = ruamel.yaml.YAML(typ='safe') + with open('config.yml') as fp: + config = yaml.load(fp) + self.assertEqual( + 'c58460800c7b250a619c30c13b07b7359a43e5af71a4352d86c58ae18c9f6d41', + config['repo_key_sha256'], + ) def test_store_and_load_fdroid_signing_key_fingerprints_with_missmatch(self): common.config = {} From 1f96a84f9ad2bf8ef4ecb1f44c876c6ed9495407 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 24 Feb 2025 13:05:37 +0100 Subject: [PATCH 1904/2116] gitlab-ci: add yamllint job --- .gitlab-ci.yml | 29 +++++++++++++++++++ .../info.guardianproject.urzip/.fdroid.yml | 1 - tests/metadata/duplicate.permisssions.yml | 2 +- tests/metadata/info.guardianproject.urzip.yml | 8 ++--- .../metadata/info.zwanenburg.caffeinetile.yml | 2 +- tests/metadata/org.videolan.vlc.yml | 6 ++-- 6 files changed, 38 insertions(+), 10 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 69b10ae6..6ebc12da 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -274,6 +274,35 @@ safety: - python3 -m safety --key "$SAFETY_API_KEY" --stage cicd scan +# TODO tests/*/*/*.yaml are not covered +yamllint: + image: debian:bookworm-slim + rules: + # once only:/changes: are ported to rules:, this could be removed: + - if: $CI_PIPELINE_SOURCE == "merge_request_event" + when: never + - if: $CI_PIPELINE_SOURCE == "push" + changes: + - .gitlab-ci.yml + - .safety-policy.yml + - .yamllint + - tests/*.yml + - tests/*/*.yml + - tests/*/*/.*.yml + <<: *apt-template + variables: + LANG: C.UTF-8 + script: + - apt-get install yamllint + - yamllint + .gitlab-ci.yml + .safety-policy.yml + .yamllint + tests/*.yml + tests/*/*.yml + tests/*/*/.*.yml + + # Run all the various linters and static analysis tools. locales: image: debian:bookworm-slim diff --git a/tests/build/info.guardianproject.urzip/.fdroid.yml b/tests/build/info.guardianproject.urzip/.fdroid.yml index 7f2b3c1c..beea89be 100644 --- a/tests/build/info.guardianproject.urzip/.fdroid.yml +++ b/tests/build/info.guardianproject.urzip/.fdroid.yml @@ -1,4 +1,3 @@ - Summary: This should be overridden by metadata/info.guardianproject.urzip.yml Builds: - versionCode: 50 diff --git a/tests/metadata/duplicate.permisssions.yml b/tests/metadata/duplicate.permisssions.yml index 3401c235..1b721fdb 100644 --- a/tests/metadata/duplicate.permisssions.yml +++ b/tests/metadata/duplicate.permisssions.yml @@ -1,4 +1,4 @@ Categories: -- tests + - tests Name: Duplicate Permisssions Summary: 'Test app for all possible ' diff --git a/tests/metadata/info.guardianproject.urzip.yml b/tests/metadata/info.guardianproject.urzip.yml index d35f7887..cf783f89 100644 --- a/tests/metadata/info.guardianproject.urzip.yml +++ b/tests/metadata/info.guardianproject.urzip.yml @@ -3,10 +3,10 @@ AutoUpdateMode: None Bitcoin: 1Fi5xUHiAPRKxHvyUGVFGt9extBe8Srdbk OpenCollective: f-droid-just-testing Categories: -- Development -- GuardianProject -- 1 -- 2.0 + - Development + - GuardianProject + - 1 + - 2.0 CurrentVersionCode: 2147483647 AuthorWebSite: https://guardianproject.info Description: | diff --git a/tests/metadata/info.zwanenburg.caffeinetile.yml b/tests/metadata/info.zwanenburg.caffeinetile.yml index a1c0b284..50321a81 100644 --- a/tests/metadata/info.zwanenburg.caffeinetile.yml +++ b/tests/metadata/info.zwanenburg.caffeinetile.yml @@ -1,4 +1,4 @@ Categories: -- Development + - Development Name: Caffeine Tile Summary: Test app for extracting icons when an XML one is default diff --git a/tests/metadata/org.videolan.vlc.yml b/tests/metadata/org.videolan.vlc.yml index 266f517d..3d40e9e9 100644 --- a/tests/metadata/org.videolan.vlc.yml +++ b/tests/metadata/org.videolan.vlc.yml @@ -317,7 +317,7 @@ Builds: prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi-v7a ./compile.sh release -#0.9.10 vercodes were off + # 0.9.10 vercodes were off - versionName: 1.0.0 versionCode: 10006 disable: doesn't build @@ -328,7 +328,7 @@ Builds: prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=x86 ./compile.sh release -#0.9.10 vercodes were off + # 0.9.10 vercodes were off - versionName: 1.0.0 versionCode: 10007 disable: doesn't build @@ -339,7 +339,7 @@ Builds: prebuild: sed -i '/ant/d' ../Makefile && ln -s vlc-android/$$VLC-2.2$$ ../vlc build: cd ../ && ANDROID_ABI=armeabi ./compile.sh release -#0.9.10 vercodes were off + # 0.9.10 vercodes were off - versionName: 1.0.0 versionCode: 10008 disable: doesn't build From 3cc6c09ffca3137ae88c4e0de3ebdf613607eb9b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 26 Feb 2025 18:16:06 +0100 Subject: [PATCH 1905/2116] use common var for 'config.yml', standarize on UTF-8 This makes it easy to track all the places that use config.yml, and hopefully makes things feel cleaner. This also standardizes all places where config.yml is written out to use UTF-8 as the file encoding. This also includes a lot of black code format fixes. --- fdroidserver/common.py | 56 +++++++------ fdroidserver/init.py | 20 ++--- fdroidserver/lint.py | 2 +- fdroidserver/nightly.py | 4 +- tests/test_build.py | 4 +- tests/test_common.py | 162 +++++++++++++++++++------------------- tests/test_index.py | 6 +- tests/test_init.py | 7 +- tests/test_integration.py | 52 ++++++------ tests/test_lint.py | 12 +-- tests/test_nightly.py | 4 +- tests/test_publish.py | 5 +- tests/test_scanner.py | 4 +- tests/test_update.py | 24 +++--- 14 files changed, 189 insertions(+), 173 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 893b14da..bda93d65 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -126,6 +126,7 @@ CONFIG_NAMES = ( RELEASECHANNELS_CONFIG_NAME, ) +CONFIG_FILE = 'config.yml' config = None options = None @@ -525,7 +526,7 @@ def config_type_check(path, data): def read_config(): """Read the repository config. - The config is read from config_file, which is in the current + The config is read from config.yml, which is in the current directory when any of the repo management commands are used. If there is a local metadata file in the git repo, then the config is not required, just use defaults. @@ -546,21 +547,20 @@ def read_config(): return config config = {} - config_file = 'config.yml' - old_config_file = 'config.py' - if os.path.exists(config_file): - logging.debug(_("Reading '{config_file}'").format(config_file=config_file)) - with open(config_file, encoding='utf-8') as fp: + if os.path.exists(CONFIG_FILE): + logging.debug(_("Reading '{config_file}'").format(config_file=CONFIG_FILE)) + with open(CONFIG_FILE, encoding='utf-8') as fp: config = yaml.safe_load(fp) if not config: config = {} - config_type_check(config_file, config) + config_type_check(CONFIG_FILE, config) + old_config_file = 'config.py' if os.path.exists(old_config_file): logging.warning( _("""Ignoring deprecated {oldfile}, use {newfile}!""").format( - oldfile=old_config_file, newfile=config_file + oldfile=old_config_file, newfile=CONFIG_FILE ) ) @@ -577,14 +577,13 @@ def read_config(): '-providerArg', 'opensc-fdroid.cfg'] if any(k in config for k in ["keystore", "keystorepass", "keypass"]): - if os.path.exists(config_file): - f = config_file - elif os.path.exists(old_config_file): - f = old_config_file - st = os.stat(f) + st = os.stat(CONFIG_FILE) if st.st_mode & stat.S_IRWXG or st.st_mode & stat.S_IRWXO: - logging.warning(_("unsafe permissions on '{config_file}' (should be 0600)!") - .format(config_file=f)) + logging.warning( + _("unsafe permissions on '{config_file}' (should be 0600)!").format( + config_file=CONFIG_FILE + ) + ) fill_config_defaults(config) @@ -4191,9 +4190,17 @@ def load_stats_fdroid_signing_key_fingerprints(): return json.loads(str(f.read('publishsigkeys.json'), 'utf-8')) -def write_to_config(thisconfig, key, value=None, config_file=None): +def write_config_file(config): + """Write the provided string to config.yml with the right path and encoding.""" + Path(CONFIG_FILE).write_text(config, encoding='utf-8') + + +def write_to_config(thisconfig, key, value=None): """Write a key/value to the local config.yml. + The config.yml is defined as YAML 1.2 in UTF-8 encoding on all + platforms. + NOTE: only supports writing string variables. Parameters @@ -4205,21 +4212,18 @@ def write_to_config(thisconfig, key, value=None, config_file=None): value optional value to be written, instead of fetched from 'thisconfig' dictionary. + """ if value is None: origkey = key + '_orig' value = thisconfig[origkey] if origkey in thisconfig else thisconfig[key] - if config_file: - cfg = config_file - else: - cfg = 'config.yml' # load config file, create one if it doesn't exist - if not os.path.exists(cfg): - open(cfg, 'a').close() - logging.info("Creating empty " + cfg) - with open(cfg, 'r') as f: - lines = f.readlines() + if not os.path.exists(CONFIG_FILE): + write_config_file('') + logging.info(_("Creating empty {config_file}").format(config_file=CONFIG_FILE)) + with open(CONFIG_FILE) as fp: + lines = fp.readlines() # make sure the file ends with a carraige return if len(lines) > 0: @@ -4233,7 +4237,7 @@ def write_to_config(thisconfig, key, value=None, config_file=None): # second instance of this line for this key in the document. didRepl = False # edit config file - with open(cfg, 'w') as f: + with open(CONFIG_FILE, 'w', encoding='utf-8') as f: for line in lines: if pattern.match(line): if not didRepl: diff --git a/fdroidserver/init.py b/fdroidserver/init.py index 326ecf4c..a5575fea 100644 --- a/fdroidserver/init.py +++ b/fdroidserver/init.py @@ -38,13 +38,13 @@ def disable_in_config(key, value): """Write a key/value to the local config.yml, then comment it out.""" import yaml - with open('config.yml') as f: - data = f.read() + with open(common.CONFIG_FILE) as fp: + data = fp.read() pattern = r'\n[\s#]*' + key + r':.*' repl = '\n#' + yaml.dump({key: value}, default_flow_style=False) data = re.sub(pattern, repl, data) - with open('config.yml', 'w') as f: - f.writelines(data) + with open(common.CONFIG_FILE, 'w') as fp: + fp.writelines(data) def main(): @@ -138,24 +138,24 @@ def main(): _("Android SDK not found at {path}!").format(path=test_config['sdk_path']) ) - if not os.path.exists('config.yml'): + if not os.path.exists(common.CONFIG_FILE): # 'metadata' and 'tmp' are created in fdroid if not os.path.exists('repo'): os.mkdir('repo') - example_config_yml = os.path.join(examplesdir, 'config.yml') + example_config_yml = os.path.join(examplesdir, common.CONFIG_FILE) if os.path.exists(example_config_yml): - shutil.copyfile(example_config_yml, 'config.yml') + shutil.copyfile(example_config_yml, common.CONFIG_FILE) else: from pkg_resources import get_distribution versionstr = get_distribution('fdroidserver').version if not versionstr: versionstr = 'master' - with open('config.yml', 'w') as fp: + with open(common.CONFIG_FILE, 'w') as fp: fp.write('# see https://gitlab.com/fdroid/fdroidserver/blob/') fp.write(versionstr) - fp.write('/examples/config.yml\n') - os.chmod('config.yml', 0o0600) + fp.write(f'/examples/{common.CONFIG_FILE}\n') + os.chmod(common.CONFIG_FILE, 0o0600) # If android_home is None, test_config['sdk_path'] will be used and # "$ANDROID_HOME" may be used if the env var is set up correctly. # If android_home is not None, the path given from the command line diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index f8589897..64770476 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -976,7 +976,7 @@ def main(): paths = list() for arg in options.appid: if ( - arg == 'config.yml' + arg == common.CONFIG_FILE or Path(arg).parent.name == 'config' or Path(arg).parent.parent.name == 'config' # localized ): diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 84c2da2e..5b8983e9 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -423,9 +423,9 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, 'keydname': DISTINGUISHED_NAME, 'make_current_version_link': False, } - with open('config.yml', 'w') as fp: + with open(common.CONFIG_FILE, 'w', encoding='utf-8') as fp: yaml.dump(config, fp, default_flow_style=False) - os.chmod('config.yml', 0o600) + os.chmod(common.CONFIG_FILE, 0o600) config = common.read_config() common.assert_config_keystore(config) diff --git a/tests/test_build.py b/tests/test_build.py index 83e33eb2..5290552e 100755 --- a/tests/test_build.py +++ b/tests/test_build.py @@ -593,9 +593,9 @@ class BuildTest(unittest.TestCase): os.chdir(self.testdir) sdk_path = os.path.join(self.testdir, 'android-sdk') self.create_fake_android_home(sdk_path) - with open('config.yml', 'w') as fp: + with open(fdroidserver.common.CONFIG_FILE, 'w') as fp: yaml.dump({'sdk_path': sdk_path, 'keep_when_not_allowed': True}, fp) - os.chmod('config.yml', 0o600) + os.chmod(fdroidserver.common.CONFIG_FILE, 0o600) fdroidserver.build.config = fdroidserver.common.read_config() os.mkdir('metadata') diff --git a/tests/test_common.py b/tests/test_common.py index 34f83773..17690f59 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -653,8 +653,7 @@ class CommonTest(unittest.TestCase): """ os.chdir(self.testdir) - config_yml = 'config.yml' - Path(config_yml).write_text( + fdroidserver.common.write_config_file( textwrap.dedent( """\ # abc @@ -670,18 +669,12 @@ class CommonTest(unittest.TestCase): ) config = {'key': 111, 'a_path_orig': '~/android-sdk'} - fdroidserver.common.write_to_config(config, 'key', config_file=config_yml) - fdroidserver.common.write_to_config( - config, 'a_path', config_file=config_yml - ) - fdroidserver.common.write_to_config( - config, 'test', value='test value', config_file=config_yml - ) - fdroidserver.common.write_to_config( - config, 'new_key', value='new', config_file=config_yml - ) + fdroidserver.common.write_to_config(config, 'key') + fdroidserver.common.write_to_config(config, 'a_path') + fdroidserver.common.write_to_config(config, 'test', value='test value') + fdroidserver.common.write_to_config(config, 'new_key', value='new') - with open(config_yml) as fp: + with open(fdroidserver.common.CONFIG_FILE) as fp: self.assertEqual( fp.read(), textwrap.dedent( @@ -700,9 +693,10 @@ class CommonTest(unittest.TestCase): ) def test_write_to_config_when_empty(self): - config_yml = Path(self.testdir) / 'config.yml' - config_yml.write_text('') - fdroidserver.common.write_to_config({}, 'key', 'val', config_yml) + os.chdir(self.testdir) + config_yml = Path(fdroidserver.common.CONFIG_FILE) + config_yml.write_text('', encoding='utf-8') + fdroidserver.common.write_to_config({}, 'key', 'val') self.assertEqual(config_yml.read_text(), 'key: val\n') def test_apk_name_regex(self): @@ -1885,24 +1879,23 @@ class CommonTest(unittest.TestCase): def test_with_no_config(self): """It should set defaults if no config file is found""" os.chdir(self.tmpdir) - self.assertFalse(os.path.exists('config.yml')) + self.assertFalse(os.path.exists(fdroidserver.common.CONFIG_FILE)) config = fdroidserver.common.read_config() self.assertIsNotNone(config.get('char_limits')) def test_with_zero_size_config(self): """It should set defaults if config file has nothing in it""" os.chdir(self.tmpdir) - open('config.yml', 'w').close() - self.assertTrue(os.path.exists('config.yml')) + fdroidserver.common.write_config_file('') + self.assertTrue(os.path.exists(fdroidserver.common.CONFIG_FILE)) config = fdroidserver.common.read_config() self.assertIsNotNone(config.get('char_limits')) def test_with_config_yml(self): """Make sure it is possible to use config.yml alone.""" os.chdir(self.tmpdir) - with open('config.yml', 'w') as fp: - fp.write('apksigner: yml') - self.assertTrue(os.path.exists('config.yml')) + fdroidserver.common.write_config_file('apksigner: yml') + self.assertTrue(os.path.exists(fdroidserver.common.CONFIG_FILE)) config = fdroidserver.common.read_config() self.assertEqual('yml', config.get('apksigner')) @@ -1910,9 +1903,8 @@ class CommonTest(unittest.TestCase): """Make sure it is possible to use config.yml in UTF-8 encoding.""" os.chdir(self.tmpdir) teststr = '/πÇÇ现代通用字-български-عربي1/ö/yml' - with open('config.yml', 'w', encoding='utf-8') as fp: - fp.write('apksigner: ' + teststr) - self.assertTrue(os.path.exists('config.yml')) + fdroidserver.common.write_config_file('apksigner: ' + teststr) + self.assertTrue(os.path.exists(fdroidserver.common.CONFIG_FILE)) config = fdroidserver.common.read_config() self.assertEqual(teststr, config.get('apksigner')) @@ -1920,9 +1912,9 @@ class CommonTest(unittest.TestCase): """Make sure it is possible to use config.yml Unicode encoded as ASCII.""" os.chdir(self.tmpdir) teststr = '/πÇÇ现代通用字-български-عربي1/ö/yml' - with open('config.yml', 'w') as fp: + with open(fdroidserver.common.CONFIG_FILE, 'w', encoding='utf-8') as fp: yaml.dump({'apksigner': teststr}, fp) - self.assertTrue(os.path.exists('config.yml')) + self.assertTrue(os.path.exists(fdroidserver.common.CONFIG_FILE)) config = fdroidserver.common.read_config() self.assertEqual(teststr, config.get('apksigner')) @@ -1931,83 +1923,85 @@ class CommonTest(unittest.TestCase): os.chdir(self.tmpdir) with mock.patch.dict(os.environ): os.environ['SECRET'] = 'mysecretpassword' # nosec B105 - with open('config.yml', 'w') as fp: - fp.write("""keypass: {'env': 'SECRET'}""") - self.assertTrue(os.path.exists('config.yml')) + fdroidserver.common.write_config_file("""keypass: {'env': 'SECRET'}\n""") + self.assertTrue(os.path.exists(fdroidserver.common.CONFIG_FILE)) config = fdroidserver.common.read_config() self.assertEqual(os.getenv('SECRET', 'fail'), config.get('keypass')) def test_with_config_yml_is_dict(self): os.chdir(self.tmpdir) - Path('config.yml').write_text('apksigner = /placeholder/path') + Path(fdroidserver.common.CONFIG_FILE).write_text('apksigner = /bin/apksigner') with self.assertRaises(TypeError): fdroidserver.common.read_config() def test_with_config_yml_is_not_mixed_type(self): os.chdir(self.tmpdir) - Path('config.yml').write_text('k: v\napksigner = /placeholder/path') + Path(fdroidserver.common.CONFIG_FILE).write_text('k: v\napksigner = /bin/apk') with self.assertRaises(yaml.scanner.ScannerError): fdroidserver.common.read_config() def test_config_perm_warning(self): """Exercise the code path that issues a warning about unsafe permissions.""" os.chdir(self.tmpdir) - with open('config.yml', 'w') as fp: - fp.write('keystore: foo.jks') - self.assertTrue(os.path.exists(fp.name)) - os.chmod(fp.name, 0o666) # nosec B103 + fdroidserver.common.write_config_file('keystore: foo.jks') + self.assertTrue(os.path.exists(fdroidserver.common.CONFIG_FILE)) + os.chmod(fdroidserver.common.CONFIG_FILE, 0o666) # nosec B103 fdroidserver.common.read_config() - os.remove(fp.name) + os.remove(fdroidserver.common.CONFIG_FILE) fdroidserver.common.config = None def test_config_repo_url(self): """repo_url ends in /repo, archive_url ends in /archive.""" os.chdir(self.tmpdir) - with open('config.yml', 'w') as fp: - fp.write('repo_url: https://MyFirstFDroidRepo.org/fdroid/repo\n') - fp.write('archive_url: https://MyFirstFDroidRepo.org/fdroid/archive') + fdroidserver.common.write_config_file( + textwrap.dedent( + """\ + repo_url: https://MyFirstFDroidRepo.org/fdroid/repo + archive_url: https://MyFirstFDroidRepo.org/fdroid/archive + """ + ) + ) config = fdroidserver.common.read_config() - self.assertEqual('https://MyFirstFDroidRepo.org/fdroid/repo', config.get('repo_url')) - self.assertEqual('https://MyFirstFDroidRepo.org/fdroid/archive', config.get('archive_url')) + self.assertEqual( + 'https://MyFirstFDroidRepo.org/fdroid/repo', config.get('repo_url') + ) + self.assertEqual( + 'https://MyFirstFDroidRepo.org/fdroid/archive', config.get('archive_url') + ) def test_config_repo_url_extra_slash(self): """repo_url ends in /repo, archive_url ends in /archive.""" os.chdir(self.tmpdir) - with open('config.yml', 'w') as fp: - fp.write('repo_url: https://MyFirstFDroidRepo.org/fdroid/repo/') + fdroidserver.common.write_config_file('repo_url: https://MyFirstFDroidRepo.org/fdroid/repo/') with self.assertRaises(FDroidException): fdroidserver.common.read_config() def test_config_repo_url_not_repo(self): """repo_url ends in /repo, archive_url ends in /archive.""" os.chdir(self.tmpdir) - with open('config.yml', 'w') as fp: - fp.write('repo_url: https://MyFirstFDroidRepo.org/fdroid/foo') + fdroidserver.common.write_config_file('repo_url: https://MyFirstFDroidRepo.org/fdroid/foo') with self.assertRaises(FDroidException): fdroidserver.common.read_config() def test_config_archive_url_extra_slash(self): """repo_url ends in /repo, archive_url ends in /archive.""" os.chdir(self.tmpdir) - with open('config.yml', 'w') as fp: - fp.write('archive_url: https://MyFirstFDroidRepo.org/fdroid/archive/') + fdroidserver.common.write_config_file('archive_url: https://MyFirstFDroidRepo.org/fdroid/archive/') with self.assertRaises(FDroidException): fdroidserver.common.read_config() def test_config_archive_url_not_repo(self): """repo_url ends in /repo, archive_url ends in /archive.""" os.chdir(self.tmpdir) - with open('config.yml', 'w') as fp: - fp.write('archive_url: https://MyFirstFDroidRepo.org/fdroid/foo') + fdroidserver.common.write_config_file('archive_url: https://MyFirstFDroidRepo.org/fdroid/foo') with self.assertRaises(FDroidException): fdroidserver.common.read_config() def test_write_to_config_yml(self): os.chdir(self.tmpdir) - with open('config.yml', 'w') as fp: - fp.write('apksigner: yml') - os.chmod('config.yml', 0o0600) - self.assertTrue(os.path.exists(fp.name)) + fdroidserver.common.write_config_file('apksigner: yml') + os.chmod(fdroidserver.common.CONFIG_FILE, 0o0600) + self.assertTrue(os.path.exists(fdroidserver.common.CONFIG_FILE)) config = fdroidserver.common.read_config() self.assertFalse('keypass' in config) self.assertEqual('yml', config.get('apksigner')) @@ -2018,11 +2012,17 @@ class CommonTest(unittest.TestCase): def test_config_dict_with_int_keys(self): os.chdir(self.tmpdir) - with open('config.yml', 'w') as fp: - fp.write('java_paths:\n 8: /usr/lib/jvm/java-8-openjdk\n') - self.assertTrue(os.path.exists(fp.name)) + fdroidserver.common.write_config_file( + textwrap.dedent( + """ + java_paths: + 8: /usr/lib/jvm/java-8-openjdk + """ + ) + ) + self.assertTrue(os.path.exists(fdroidserver.common.CONFIG_FILE)) config = fdroidserver.common.read_config() - self.assertEqual('/usr/lib/jvm/java-8-openjdk', config.get('java_paths', {}).get('8')) + self.assertEqual('/usr/lib/jvm/java-8-openjdk', config['java_paths']['8']) @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) def test_test_sdk_exists_fails_on_bad_sdk_path(self): @@ -2098,7 +2098,7 @@ class CommonTest(unittest.TestCase): os.chdir(self.testdir) shutil.copy( os.path.join(basedir, '..', 'buildserver', 'config.buildserver.yml'), - 'config.yml', + fdroidserver.common.CONFIG_FILE, ) fdroidserver.common.read_config() @@ -2606,7 +2606,7 @@ class CommonTest(unittest.TestCase): def test_get_apksigner_smartcardoptions(self): os.chdir(self.tmpdir) - with open('config.yml', 'w') as fp: + with open(fdroidserver.common.CONFIG_FILE, 'w', encoding='utf-8') as fp: d = { 'smartcardoptions': '-storetype PKCS11' ' -providerName SunPKCS11-OpenSC' @@ -2634,10 +2634,9 @@ class CommonTest(unittest.TestCase): def test_get_smartcardoptions_list(self): os.chdir(self.tmpdir) - with open('config.yml', 'w') as fp: - fp.write( - textwrap.dedent( - """ + fdroidserver.common.write_config_file( + textwrap.dedent( + """ smartcardoptions: - -storetype - PKCS11 @@ -2647,9 +2646,9 @@ class CommonTest(unittest.TestCase): - sun.security.pkcs11.SunPKCS11 - -providerArg - opensc-fdroid.cfg - """ - ) + """ ) + ) config = fdroidserver.common.read_config() fdroidserver.common.config = config self.assertTrue(isinstance(config['smartcardoptions'], list)) @@ -2669,17 +2668,16 @@ class CommonTest(unittest.TestCase): def test_get_smartcardoptions_spaces(self): os.chdir(self.tmpdir) - with open('config.yml', 'w') as fp: - fp.write( - textwrap.dedent( - """smartcardoptions: | - -storetype PKCS11 - -providerClass sun.security.pkcs11.SunPKCS11 - -providerArg /etc/pkcs11_java.cfg - - """ - ) + fdroidserver.common.write_config_file( + textwrap.dedent( + """ + smartcardoptions: | + -storetype PKCS11 + -providerClass sun.security.pkcs11.SunPKCS11 + -providerArg /etc/pkcs11_java.cfg + """ ) + ) config = fdroidserver.common.read_config() fdroidserver.common.config = config self.assertTrue(isinstance(config['smartcardoptions'], list)) @@ -2801,7 +2799,9 @@ class CommonTest(unittest.TestCase): def test_config_serverwebroot_str(self): os.chdir(self.testdir) - Path('config.yml').write_text("""serverwebroot: 'foo@example.com:/var/www'""") + fdroidserver.common.write_config_file( + """serverwebroot: 'foo@example.com:/var/www'""" + ) self.assertEqual( [{'url': 'foo@example.com:/var/www/'}], fdroidserver.common.read_config()['serverwebroot'], @@ -2809,7 +2809,9 @@ class CommonTest(unittest.TestCase): def test_config_serverwebroot_list(self): os.chdir(self.testdir) - Path('config.yml').write_text("""serverwebroot:\n - foo@example.com:/var/www""") + fdroidserver.common.write_config_file( + """serverwebroot:\n - foo@example.com:/var/www""" + ) self.assertEqual( [{'url': 'foo@example.com:/var/www/'}], fdroidserver.common.read_config()['serverwebroot'], @@ -2817,7 +2819,9 @@ class CommonTest(unittest.TestCase): def test_config_serverwebroot_dict(self): os.chdir(self.testdir) - Path('config.yml').write_text("""serverwebroot:\n - url: 'foo@example.com:/var/www'""") + fdroidserver.common.write_config_file( + """serverwebroot:\n - url: 'foo@example.com:/var/www'""" + ) self.assertEqual( [{'url': 'foo@example.com:/var/www/'}], fdroidserver.common.read_config()['serverwebroot'], diff --git a/tests/test_index.py b/tests/test_index.py index 8f1b1e86..059386fb 100755 --- a/tests/test_index.py +++ b/tests/test_index.py @@ -38,7 +38,7 @@ class IndexTest(unittest.TestCase): cls.index_v1_jar = basedir / 'repo' / 'index-v1.jar' def setUp(self): - (basedir / 'config.yml').chmod(0o600) + (basedir / common.CONFIG_FILE).chmod(0o600) os.chdir(basedir) # so read_config() can find config.yml common.config = None @@ -380,7 +380,7 @@ class IndexTest(unittest.TestCase): with zipfile.ZipFile(jarfile, 'w', zipfile.ZIP_DEFLATED) as jar: jar.writestr('publishsigkeys.json', json.dumps(sigkeyfps)) publish.sign_sig_key_fingerprint_list(jarfile) - Path('config.yml').write_text('') + common.write_config_file('') index.v1_sort_packages( i, common.load_stats_fdroid_signing_key_fingerprints() @@ -717,7 +717,7 @@ class IndexTest(unittest.TestCase): os.chdir(self.testdir) repo_url = 'https://example.com/fdroid/repo' c = {'repo_url': repo_url, 'mirrors': ['http://one/fdroid']} - with open('config.yml', 'w') as fp: + with open(common.CONFIG_FILE, 'w', encoding='utf-8') as fp: yaml.dump(c, fp) common.config = None common.read_config() diff --git a/tests/test_init.py b/tests/test_init.py index b448192f..179f06c7 100755 --- a/tests/test_init.py +++ b/tests/test_init.py @@ -28,12 +28,13 @@ class InitTest(unittest.TestCase): self._td.cleanup() def test_disable_in_config(self): - configfile = pathlib.Path('config.yml') - configfile.write_text('keystore: NONE\nkeypass: mysupersecrets\n') + test = 'mysupersecrets' + configfile = pathlib.Path(fdroidserver.common.CONFIG_FILE) + configfile.write_text(f'keystore: NONE\nkeypass: {test}\n', encoding='utf-8') configfile.chmod(0o600) config = fdroidserver.common.read_config() self.assertEqual('NONE', config['keystore']) - self.assertEqual('mysupersecrets', config['keypass']) + self.assertEqual(test, config['keypass']) fdroidserver.init.disable_in_config('keypass', 'comment') self.assertIn('#keypass:', configfile.read_text()) fdroidserver.common.config = None diff --git a/tests/test_integration.py b/tests/test_integration.py index d7f1231d..7c527b57 100755 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -148,7 +148,7 @@ class IntegrationTest(unittest.TestCase): + ["init", "--keystore", keystore_path, "--repo-keyalias", "sova"] ) self.update_yaml( - "config.yml", + common.CONFIG_FILE, { "keystorepass": "r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=", "keypass": "r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=", @@ -160,7 +160,7 @@ class IntegrationTest(unittest.TestCase): shutil.copy(FILES / "keystore.jks", "keystore.jks") self.fdroid_init_with_prebuilt_keystore("keystore.jks") self.update_yaml( - "config.yml", + common.CONFIG_FILE, { "make_current_version_link": True, "keydname": "CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US", @@ -193,7 +193,7 @@ class IntegrationTest(unittest.TestCase): def test_utf8_metadata(self): self.fdroid_init_with_prebuilt_keystore() self.update_yaml( - "config.yml", + common.CONFIG_FILE, { "repo_description": "获取已安装在您的设备上的应用的", "mirrors": ["https://foo.bar/fdroid", "http://secret.onion/fdroid"], @@ -247,7 +247,7 @@ class IntegrationTest(unittest.TestCase): shutil.copytree(FILES / "gnupghome", gnupghome) os.chmod(gnupghome, 0o700) self.update_yaml( - "config.yml", + common.CONFIG_FILE, { "install_list": "org.adaway", "uninstall_list": ["com.android.vending", "com.facebook.orca"], @@ -334,7 +334,7 @@ class IntegrationTest(unittest.TestCase): FILES.glob("repo/obb.main.twoversions_110161[357].apk"), ): shutil.copy(f, "repo") - self.update_yaml("config.yml", {"archive_older": 3}) + self.update_yaml(common.CONFIG_FILE, {"archive_older": 3}) self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) with open("archive/index.xml") as f: @@ -356,7 +356,7 @@ class IntegrationTest(unittest.TestCase): shutil.copy(FILES / "metadata/com.politedroid.yml", "metadata") for f in FILES.glob("repo/com.politedroid_[0-9].apk"): shutil.copy(f, "repo") - self.update_yaml("config.yml", {"archive_older": 3}) + self.update_yaml(common.CONFIG_FILE, {"archive_older": 3}) self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) repo = Path("repo/index.xml").read_text() @@ -456,7 +456,7 @@ class IntegrationTest(unittest.TestCase): self.remove_lines("metadata/com.politedroid.yml", ["ArchivePolicy:"]) for f in FILES.glob("repo/com.politedroid_[0-9].apk"): shutil.copy(f, "repo") - self.update_yaml("config.yml", {"archive_older": 3}) + self.update_yaml(common.CONFIG_FILE, {"archive_older": 3}) self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) repo = Path("repo/index.xml").read_text() @@ -474,7 +474,7 @@ class IntegrationTest(unittest.TestCase): self.assertIn("com.politedroid_3.apk", archive) self.assertTrue(Path("archive/com.politedroid_3.apk").is_file()) - self.update_yaml("config.yml", {"archive_older": 1}) + self.update_yaml(common.CONFIG_FILE, {"archive_older": 1}) self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) repo = Path("repo/index.xml").read_text() repo_cnt = sum(1 for line in repo.splitlines() if "" in line) @@ -555,7 +555,7 @@ class IntegrationTest(unittest.TestCase): def test_allowing_disabled_signatures_in_repo_and_archive(self): self.fdroid_init_with_prebuilt_keystore() self.update_yaml( - "config.yml", {"allow_disabled_algorithms": True, "archive_older": 3} + common.CONFIG_FILE, {"allow_disabled_algorithms": True, "archive_older": 3} ) Path("metadata").mkdir() shutil.copy(FILES / "metadata/com.politedroid.yml", "metadata") @@ -650,7 +650,7 @@ class IntegrationTest(unittest.TestCase): self.assertTrue(Path("archive/urzip-badsig.apk").is_file()) # test unarchiving when disabled_algorithms are allowed again - self.update_yaml("config.yml", {"allow_disabled_algorithms": True}) + self.update_yaml(common.CONFIG_FILE, {"allow_disabled_algorithms": True}) self.assert_run(self.fdroid_cmd + ["update", "--pretty", "--nosign"]) with open("archive/index.xml") as f: archive_cnt = sum(1 for line in f if "" in line) @@ -689,7 +689,7 @@ class IntegrationTest(unittest.TestCase): def test_rename_apks_with_fdroid_update_rename_apks_opt_nosign_opt_for_speed(self): self.fdroid_init_with_prebuilt_keystore() self.update_yaml( - "config.yml", + common.CONFIG_FILE, { "keydname": "CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US" }, @@ -744,7 +744,7 @@ class IntegrationTest(unittest.TestCase): def test_for_added_date_being_set_correctly_for_repo_and_archive(self): self.fdroid_init_with_prebuilt_keystore() - self.update_yaml("config.yml", {"archive_older": 3}) + self.update_yaml(common.CONFIG_FILE, {"archive_older": 3}) Path("metadata").mkdir() Path("archive").mkdir() Path("stats").mkdir() @@ -803,12 +803,14 @@ class IntegrationTest(unittest.TestCase): ) # fake that no JDKs are available self.update_yaml( - "config.yml", {"categories": ["Internet"], "java_paths": {}}, replace=True + common.CONFIG_FILE, + {"categories": ["Internet"], "java_paths": {}}, + replace=True, ) local_copy_dir = self.testdir / "local_copy_dir/fdroid" (local_copy_dir / "repo").mkdir(parents=True) self.update_yaml( - "config.yml", {"local_copy_dir": str(local_copy_dir.resolve())} + common.CONFIG_FILE, {"local_copy_dir": str(local_copy_dir.resolve())} ) subprocess.run(self.fdroid_cmd + ["checkupdates", "--allow-dirty"]) @@ -879,7 +881,7 @@ class IntegrationTest(unittest.TestCase): new_tmp_repo.mkdir() os.chdir(new_tmp_repo) self.fdroid_init_with_prebuilt_keystore() - self.update_yaml("config.yml", {"sync_from_local_copy_dir": True}) + self.update_yaml(common.CONFIG_FILE, {"sync_from_local_copy_dir": True}) self.assert_run( self.fdroid_cmd + ["deploy", "--local-copy-dir", local_copy_dir] ) @@ -946,7 +948,7 @@ class IntegrationTest(unittest.TestCase): ] ) # the value set in --android-home should override $ANDROID_HOME - self.assertIn(str(fake_android_home), Path("config.yml").read_text()) + self.assertIn(str(fake_android_home), Path(common.CONFIG_FILE).read_text()) @unittest.skipUnless( "ANDROID_HOME" in os.environ, "runs only with ANDROID_HOME set" @@ -1097,7 +1099,7 @@ class IntegrationTest(unittest.TestCase): # now set up fake, non-working keystore setup Path("keystore.p12").touch() self.update_yaml( - "config.yml", + common.CONFIG_FILE, { "keystore": "keystore.p12", "repo_keyalias": "foo", @@ -1115,7 +1117,9 @@ class IntegrationTest(unittest.TestCase): shutil.copytree(FILES / "repo", "repo", dirs_exist_ok=True) shutil.copytree(FILES / "metadata", "metadata") git_remote = self.testdir / "git_remote" - self.update_yaml("config.yml", {"binary_transparency_remote": str(git_remote)}) + self.update_yaml( + common.CONFIG_FILE, {"binary_transparency_remote": str(git_remote)} + ) self.assert_run(self.fdroid_cmd + ["update", "--verbose"]) self.assert_run(self.fdroid_cmd + ["deploy", "--verbose"]) self.assertIn(" 0) # now set fake repo_keyalias - self.update_yaml("config.yml", {"repo_keyalias": "fake"}) + self.update_yaml(common.CONFIG_FILE, {"repo_keyalias": "fake"}) # this should fail because this repo has a bad repo_keyalias self.assert_run_fail(self.fdroid_cmd + ["update"]) @@ -1179,7 +1183,7 @@ class IntegrationTest(unittest.TestCase): self.fdroid_init_with_prebuilt_keystore() self.update_yaml( - "config.yml", + common.CONFIG_FILE, {"archive_older": 3, "servergitmirrors": str(server_git_mirror)}, ) for f in FILES.glob("repo/com.politedroid_[345].apk"): @@ -1226,7 +1230,7 @@ class IntegrationTest(unittest.TestCase): f.stat().st_size for f in (git_mirror / ".git").glob("**/*") if f.is_file() ) - self.update_yaml("config.yml", {"git_mirror_size_limit": "60kb"}) + self.update_yaml(common.CONFIG_FILE, {"git_mirror_size_limit": "60kb"}) self.assert_run(self.fdroid_cmd + ["update"]) self.assert_run(self.fdroid_cmd + ["deploy"]) self.assertTrue(Path("archive/com.politedroid_3.apk").is_file()) @@ -1274,7 +1278,7 @@ class IntegrationTest(unittest.TestCase): Path("unsigned").mkdir() shutil.copy(FILES / "urzip-release-unsigned.apk", "unsigned") self.update_yaml( - "config.yml", + common.CONFIG_FILE, { "archive_older": 3, "mirrors": [ @@ -1312,7 +1316,7 @@ class IntegrationTest(unittest.TestCase): ) os.chdir(online_root) self.update_yaml( - "config.yml", + common.CONFIG_FILE, { "local_copy_dir": str(local_copy_dir), "sync_from_local_copy_dir": True, @@ -1344,7 +1348,7 @@ class IntegrationTest(unittest.TestCase): def test_extracting_and_publishing_with_developer_signature(self): self.fdroid_init_with_prebuilt_keystore() self.update_yaml( - "config.yml", + common.CONFIG_FILE, { "keydname": "CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US" }, diff --git a/tests/test_lint.py b/tests/test_lint.py index ff6c2247..6816ab69 100755 --- a/tests/test_lint.py +++ b/tests/test_lint.py @@ -345,7 +345,7 @@ class LintTest(unittest.TestCase): def test_check_categories_from_config_yml(self): """In config.yml, categories is a list.""" os.chdir(self.testdir) - Path('config.yml').write_text('categories: [foo, bar]\n') + fdroidserver.common.write_config_file('categories: [foo, bar]\n') fdroidserver.lint.config = fdroidserver.common.read_config() fdroidserver.lint.load_categories_config() self.assertEqual(fdroidserver.lint.CATEGORIES_KEYS, ['foo', 'bar']) @@ -434,9 +434,11 @@ class LintTest(unittest.TestCase): def test_lint_invalid_config_keys(self): os.chdir(self.testdir) - Path('config').mkdir() - Path('config/config.yml').write_text('repo:\n invalid_key: test\n') - self.assertFalse(fdroidserver.lint.lint_config('config/config.yml')) + os.mkdir('config') + config_yml = fdroidserver.common.CONFIG_FILE + with open(f'config/{config_yml}', 'w', encoding='utf-8') as fp: + fp.write('repo:\n invalid_key: test\n') + self.assertFalse(fdroidserver.lint.lint_config(f'config/{config_yml}')) def test_lint_invalid_localized_config_keys(self): os.chdir(self.testdir) @@ -534,7 +536,7 @@ class LintAntiFeaturesTest(unittest.TestCase): class ConfigYmlTest(LintTest): def setUp(self): super().setUp() - self.config_yml = Path(self.testdir) / 'config.yml' + self.config_yml = Path(self.testdir) / fdroidserver.common.CONFIG_FILE def test_config_yml_int(self): self.config_yml.write_text('repo_maxage: 1\n') diff --git a/tests/test_nightly.py b/tests/test_nightly.py index bc2567e2..750a22fc 100755 --- a/tests/test_nightly.py +++ b/tests/test_nightly.py @@ -268,7 +268,7 @@ class NightlyTest(unittest.TestCase): 'repo_url': mirror_url + '/repo', 'servergitmirrors': [{"url": git_url}], } - with open('config.yml') as fp: + with open(common.CONFIG_FILE) as fp: config = yaml.safe_load(fp) # .ssh is random tmpdir set in nightly.py, so test basename only self.assertEqual( @@ -339,7 +339,7 @@ class NightlyTest(unittest.TestCase): 'repo_url': 'https://gitlab.com/fdroid/test-nightly/-/raw/master/fdroid/repo', 'servergitmirrors': [{"url": 'git@gitlab.com:fdroid/test-nightly'}], } - with open('config.yml') as fp: + with open(common.CONFIG_FILE) as fp: config = yaml.safe_load(fp) # .ssh is random tmpdir set in nightly.py, so test basename only self.assertEqual( diff --git a/tests/test_publish.py b/tests/test_publish.py index eaf2f542..099c4188 100755 --- a/tests/test_publish.py +++ b/tests/test_publish.py @@ -18,7 +18,6 @@ import shutil import sys import unittest import tempfile -from pathlib import Path from unittest import mock from fdroidserver import publish @@ -96,7 +95,7 @@ class PublishTest(unittest.TestCase): ] os.chdir(self.testdir) - Path('config.yml').write_text('') + common.write_config_file('') publish.store_stats_fdroid_signing_key_fingerprints(appids, indent=2) @@ -118,7 +117,7 @@ class PublishTest(unittest.TestCase): self.assertEqual(expected, common.load_stats_fdroid_signing_key_fingerprints()) yaml = ruamel.yaml.YAML(typ='safe') - with open('config.yml') as fp: + with open(common.CONFIG_FILE) as fp: config = yaml.load(fp) self.assertEqual( 'c58460800c7b250a619c30c13b07b7359a43e5af71a4352d86c58ae18c9f6d41', diff --git a/tests/test_scanner.py b/tests/test_scanner.py index 592680ef..4899a219 100755 --- a/tests/test_scanner.py +++ b/tests/test_scanner.py @@ -800,7 +800,7 @@ class Test_ScannerTool(unittest.TestCase): def test_refresh_from_config(self): os.chdir(self.testdir) - pathlib.Path('config.yml').write_text('refresh_scanner: true') + fdroidserver.common.write_config_file('refresh_scanner: true\n') with mock.patch('fdroidserver.scanner.ScannerTool.refresh') as refresh: fdroidserver.scanner.ScannerTool() refresh.assert_called_once() @@ -809,7 +809,7 @@ class Test_ScannerTool(unittest.TestCase): fdroidserver.common.options = mock.Mock() fdroidserver.common.options.refresh_scanner = True os.chdir(self.testdir) - pathlib.Path('config.yml').write_text('refresh_scanner: false') + fdroidserver.common.write_config_file('refresh_scanner: false\n') with mock.patch('fdroidserver.scanner.ScannerTool.refresh') as refresh: fdroidserver.scanner.ScannerTool() refresh.assert_called_once() diff --git a/tests/test_update.py b/tests/test_update.py index 28dd27f9..6c551694 100755 --- a/tests/test_update.py +++ b/tests/test_update.py @@ -1787,7 +1787,9 @@ class UpdateTest(unittest.TestCase): def test_categories_txt_is_removed_by_delete_unknown(self): """categories.txt used to be a part of this system, now its nothing.""" os.chdir(self.testdir) - Path('config.yml').write_text('repo_pubkey: ffffffffffffffffffffffffffffffffffffffff') + fdroidserver.common.write_config_file( + 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff\n' + ) categories_txt = Path('repo/categories.txt') categories_txt.parent.mkdir() @@ -1803,8 +1805,8 @@ class UpdateTest(unittest.TestCase): os.chdir(self.testdir) os.mkdir('metadata') os.mkdir('repo') - Path('config.yml').write_text( - 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff' + fdroidserver.common.write_config_file( + 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff\n' ) testapk = os.path.join('repo', 'com.politedroid_6.apk') @@ -1822,8 +1824,8 @@ class UpdateTest(unittest.TestCase): os.chdir(self.testdir) os.mkdir('metadata') os.mkdir('repo') - Path('config.yml').write_text( - 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff' + fdroidserver.common.write_config_file( + 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff\n' ) testapk = os.path.join('repo', 'com.politedroid_6.apk') @@ -1844,8 +1846,8 @@ class UpdateTest(unittest.TestCase): os.chdir(self.testdir) os.mkdir('metadata') os.mkdir('repo') - Path('config.yml').write_text( - 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff' + fdroidserver.common.write_config_file( + 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff\n' ) testapk = os.path.join('repo', 'com.politedroid_6.apk') @@ -1871,8 +1873,8 @@ class UpdateTest(unittest.TestCase): Path('config/categories.yml').write_text('System: {name: System Apps}') os.mkdir('metadata') os.mkdir('repo') - Path('config.yml').write_text( - 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff' + fdroidserver.common.write_config_file( + 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff\n' ) testapk = os.path.join('repo', 'com.politedroid_6.apk') @@ -1901,8 +1903,8 @@ class UpdateTest(unittest.TestCase): Path('config/categories.yml').write_text('System: {name: S}\nTime: {name: T}\n') os.mkdir('metadata') os.mkdir('repo') - Path('config.yml').write_text( - 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff' + fdroidserver.common.write_config_file( + 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff\n' ) testapk = os.path.join('repo', 'com.politedroid_6.apk') From 53b62415d32848316b4e0cf6ca278457feb473ac Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 6 Mar 2025 10:10:25 +0100 Subject: [PATCH 1906/2116] load lint_licenses where it is needed to avoid circular imports This is the only thing that common.py imports from lint.py. --- fdroidserver/common.py | 2 -- fdroidserver/lint.py | 19 ++++++++++++++----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index bda93d65..0451d3c7 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -66,7 +66,6 @@ from urllib.parse import urlparse, urlsplit, urlunparse from zipfile import ZipFile import fdroidserver.metadata -import fdroidserver.lint from fdroidserver import _ from fdroidserver.exception import FDroidException, VCSException, NoSubmodulesException, \ BuildException, VerificationException, MetaDataException @@ -187,7 +186,6 @@ default_config = { 'archive_name': 'My First F-Droid Archive Demo', 'archive_description': _('These are the apps that have been archived from the main repo.'), # type: ignore 'archive_older': 0, - 'lint_licenses': fdroidserver.lint.APPROVED_LICENSES, # type: ignore 'git_mirror_size_limit': 10000000000, 'scanner_signature_sources': ['suss'], } diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 64770476..c5794476 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -578,11 +578,20 @@ def check_format(app): def check_license_tag(app): - """Ensure all license tags contain only valid/approved values.""" - if config['lint_licenses'] is None: - return - if app.License not in config['lint_licenses']: - if config['lint_licenses'] == APPROVED_LICENSES: + """Ensure all license tags contain only valid/approved values. + + It is possible to disable license checking by setting a null or empty value, + e.g. `lint_licenses: ` or `lint_licenses: []` + + """ + if 'lint_licenses' in config: + lint_licenses = config['lint_licenses'] + if lint_licenses is None: + return + else: + lint_licenses = APPROVED_LICENSES + if app.License not in lint_licenses: + if lint_licenses == APPROVED_LICENSES: yield _( 'Unexpected license tag "{}"! Only use FSF or OSI ' 'approved tags from https://spdx.org/license-list' From 2f47938dbfcc9510ef507c687682b159f898a4a4 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 7 Mar 2025 14:13:21 +0100 Subject: [PATCH 1907/2116] standardize config on ruamel.yaml with a YAML 1.2 config This is a key piece of the ongoing `PUBLISH` _config.yml_ migration. There was uneven implementation of which YAML parser to use, and that could lead to bugs where one parser might read a value one way, and a different parser will read the value a different way. I wanted to be sure that YAML 1.2 would always work. This makes all code that handles config files use the same `ruamel.yaml` parsers. This only touches other usages of YAML parsers when there is overlap. This does not port all of _fdroidserver_ to `ruamel.yaml` and YAML 1.2. The metadata files should already be YAML 1.2 anyway. # Conflicts: # fdroidserver/lint.py --- fdroidserver/_yaml.py | 40 +++++++++++++++++++ fdroidserver/common.py | 11 +++-- fdroidserver/index.py | 4 +- fdroidserver/lint.py | 5 +-- fdroidserver/metadata.py | 18 +++++---- .../dump/app.with.special.build.params.yaml | 2 + tests/metadata/dump/com.politedroid.yaml | 2 + tests/metadata/dump/org.adaway.yaml | 2 + .../dump/org.smssecure.smssecure.yaml | 2 + tests/metadata/dump/org.videolan.vlc.yaml | 2 + tests/test_common.py | 36 +++++++++++++---- tests/test_integration.py | 6 +-- tests/test_lint.py | 24 +++++------ tests/test_metadata.py | 7 +--- tests/test_publish.py | 3 +- 15 files changed, 116 insertions(+), 48 deletions(-) create mode 100644 fdroidserver/_yaml.py diff --git a/fdroidserver/_yaml.py b/fdroidserver/_yaml.py new file mode 100644 index 00000000..48368198 --- /dev/null +++ b/fdroidserver/_yaml.py @@ -0,0 +1,40 @@ +# Copyright (C) 2025, Hans-Christoph Steiner +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +"""Standard YAML parsing and dumping. + +YAML 1.2 is the preferred format for all data files. When loading +F-Droid formats like config.yml and .yml, YAML 1.2 is +forced, and older YAML constructs should be considered an error. + +It is OK to load and dump files in other YAML versions if they are +externally defined formats, like FUNDING.yml. In those cases, these +common instances might not be appropriate to use. + +There is a separate instance for dumping based on the "round trip" aka +"rt" mode. The "rt" mode maintains order while the "safe" mode sorts +the output. Also, yaml.version is not forced in the dumper because that +makes it write out a "%YAML 1.2" header. F-Droid's formats are +explicitly defined as YAML 1.2 and meant to be human-editable. So that +header gets in the way. + +""" + +import ruamel.yaml + +yaml = ruamel.yaml.YAML(typ='safe') +yaml.version = (1, 2) + +yaml_dumper = ruamel.yaml.YAML(typ='rt') diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 0451d3c7..320cffe4 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -39,6 +39,7 @@ import sys import re import ast import gzip +import ruamel.yaml import shutil import stat import subprocess @@ -48,7 +49,6 @@ import logging import hashlib import socket import base64 -import yaml import zipfile import tempfile import json @@ -67,6 +67,7 @@ from zipfile import ZipFile import fdroidserver.metadata from fdroidserver import _ +from fdroidserver._yaml import yaml, yaml_dumper from fdroidserver.exception import FDroidException, VCSException, NoSubmodulesException, \ BuildException, VerificationException, MetaDataException from .asynchronousfilereader import AsynchronousFileReader @@ -549,7 +550,7 @@ def read_config(): if os.path.exists(CONFIG_FILE): logging.debug(_("Reading '{config_file}'").format(config_file=CONFIG_FILE)) with open(CONFIG_FILE, encoding='utf-8') as fp: - config = yaml.safe_load(fp) + config = yaml.load(fp) if not config: config = {} config_type_check(CONFIG_FILE, config) @@ -706,7 +707,7 @@ def load_localized_config(name, repodir): if len(f.parts) == 2: locale = DEFAULT_LOCALE with open(f, encoding="utf-8") as fp: - elem = yaml.safe_load(fp) + elem = yaml.load(fp) if not isinstance(elem, dict): msg = _('{path} is not "key: value" dict, but a {datatype}!') raise TypeError(msg.format(path=f, datatype=type(elem).__name__)) @@ -4229,7 +4230,9 @@ def write_to_config(thisconfig, key, value=None): lines[-1] += '\n' pattern = re.compile(r'^[\s#]*' + key + r':.*\n') - repl = yaml.dump({key: value}) + with ruamel.yaml.compat.StringIO() as fp: + yaml_dumper.dump({key: value}, fp) + repl = fp.getvalue() # If we replaced this line once, we make sure won't be a # second instance of this line for this key in the document. diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 096ace12..8ce2f8e8 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -26,7 +26,6 @@ import json import logging import os import re -import ruamel.yaml import shutil import sys import tempfile @@ -45,6 +44,7 @@ from . import metadata from . import net from . import signindex from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME, CONFIG_CONFIG_NAME, MIRRORS_CONFIG_NAME, RELEASECHANNELS_CONFIG_NAME, DEFAULT_LOCALE, FDroidPopen, FDroidPopenBytes, load_stats_fdroid_signing_key_fingerprints +from fdroidserver._yaml import yaml from fdroidserver.exception import FDroidException, VerificationException @@ -1445,7 +1445,7 @@ def add_mirrors_to_repodict(repo_section, repodict): ) ) with mirrors_yml.open() as fp: - mirrors_config = ruamel.yaml.YAML(typ='safe').load(fp) + mirrors_config = yaml.load(fp) if not isinstance(mirrors_config, list): msg = _('{path} is not list, but a {datatype}!') raise TypeError( diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index c5794476..4e62a404 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -24,9 +24,8 @@ import urllib.parse from argparse import ArgumentParser from pathlib import Path -import ruamel.yaml - from . import _, common, metadata, rewritemeta +from fdroidserver._yaml import yaml config = None @@ -853,7 +852,7 @@ def lint_config(arg): passed = False with path.open() as fp: - data = ruamel.yaml.YAML(typ='safe').load(fp) + data = yaml.load(fp) common.config_type_check(arg, data) if path.name == mirrors_name: diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 93138954..08d275ae 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -31,6 +31,7 @@ from collections import OrderedDict from . import common from . import _ from .exception import MetaDataException +from ._yaml import yaml srclibs = None warnings_action = None @@ -472,7 +473,6 @@ def parse_yaml_srclib(metadatapath): with metadatapath.open("r", encoding="utf-8") as f: try: - yaml = ruamel.yaml.YAML(typ='safe') data = yaml.load(f) if type(data) is not dict: if platform.system() == 'Windows': @@ -709,8 +709,7 @@ def parse_yaml_metadata(mf): """ try: - yaml = ruamel.yaml.YAML(typ='safe') - yamldata = yaml.load(mf) + yamldata = common.yaml.load(mf) except ruamel.yaml.YAMLError as e: _warn_or_exception( _("could not parse '{path}'").format(path=mf.name) @@ -1249,19 +1248,24 @@ def _app_to_yaml(app): def write_yaml(mf, app): """Write metadata in yaml format. + This requires the 'rt' round trip dumper to maintain order and needs + custom indent settings, so it needs to instantiate its own YAML + instance. Therefore, this function deliberately avoids using any of + the common YAML parser setups. + Parameters ---------- mf active file discriptor for writing app - app metadata to written to the yaml file + app metadata to written to the YAML file """ _del_duplicated_NoSourceSince(app) yaml_app = _app_to_yaml(app) - yaml = ruamel.yaml.YAML() - yaml.indent(mapping=2, sequence=4, offset=2) - yaml.dump(yaml_app, stream=mf) + yamlmf = ruamel.yaml.YAML(typ='rt') + yamlmf.indent(mapping=2, sequence=4, offset=2) + yamlmf.dump(yaml_app, stream=mf) def write_metadata(metadatapath, app): diff --git a/tests/metadata/dump/app.with.special.build.params.yaml b/tests/metadata/dump/app.with.special.build.params.yaml index 43a311b5..9f2c61f6 100644 --- a/tests/metadata/dump/app.with.special.build.params.yaml +++ b/tests/metadata/dump/app.with.special.build.params.yaml @@ -1,3 +1,5 @@ +%YAML 1.2 +--- AllowedAPKSigningKeys: [] AntiFeatures: UpstreamNonFree: {} diff --git a/tests/metadata/dump/com.politedroid.yaml b/tests/metadata/dump/com.politedroid.yaml index bec8edb4..b4d56c3e 100644 --- a/tests/metadata/dump/com.politedroid.yaml +++ b/tests/metadata/dump/com.politedroid.yaml @@ -1,3 +1,5 @@ +%YAML 1.2 +--- AllowedAPKSigningKeys: [] AntiFeatures: NoSourceSince: diff --git a/tests/metadata/dump/org.adaway.yaml b/tests/metadata/dump/org.adaway.yaml index d8755a91..98a249d6 100644 --- a/tests/metadata/dump/org.adaway.yaml +++ b/tests/metadata/dump/org.adaway.yaml @@ -1,3 +1,5 @@ +%YAML 1.2 +--- AllowedAPKSigningKeys: [] AntiFeatures: {} ArchivePolicy: null diff --git a/tests/metadata/dump/org.smssecure.smssecure.yaml b/tests/metadata/dump/org.smssecure.smssecure.yaml index bf2afdff..7410aa68 100644 --- a/tests/metadata/dump/org.smssecure.smssecure.yaml +++ b/tests/metadata/dump/org.smssecure.smssecure.yaml @@ -1,3 +1,5 @@ +%YAML 1.2 +--- AllowedAPKSigningKeys: [] AntiFeatures: {} ArchivePolicy: null diff --git a/tests/metadata/dump/org.videolan.vlc.yaml b/tests/metadata/dump/org.videolan.vlc.yaml index 3a8448f7..5ecb108b 100644 --- a/tests/metadata/dump/org.videolan.vlc.yaml +++ b/tests/metadata/dump/org.videolan.vlc.yaml @@ -1,3 +1,5 @@ +%YAML 1.2 +--- AllowedAPKSigningKeys: [] AntiFeatures: {} ArchivePolicy: 9 diff --git a/tests/test_common.py b/tests/test_common.py index 17690f59..f5ffbfbe 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -17,7 +17,6 @@ import tempfile import time import unittest import textwrap -import yaml import gzip from argparse import ArgumentParser from datetime import datetime, timezone @@ -32,6 +31,7 @@ import fdroidserver.common import fdroidserver.metadata from .shared_test_code import TmpCwd, mkdtemp from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME +from fdroidserver._yaml import yaml, yaml_dumper from fdroidserver.exception import FDroidException, VCSException,\ MetaDataException, VerificationException from fdroidserver.looseversion import LooseVersion @@ -77,6 +77,26 @@ class CommonTest(unittest.TestCase): if os.path.exists(self.tmpdir): shutil.rmtree(self.tmpdir) + def test_yaml_1_2(self): + """Return a ruamel.yaml instance that supports YAML 1.2 + + There should be no "Norway Problem", and other things like this: + https://yaml.org/spec/1.2.2/ext/changes/ + + YAML 1.2 says "underlines _ cannot be used within numerical + values", but ruamel.yaml seems to ignore that. 1_0 should be a + string, but it is read as a 10. + + """ + os.chdir(self.testdir) + yaml12file = Path('YAML 1.2.yml') + yaml12file.write_text('[true, no, 0b010, 010, 0o10, "\\/"]', encoding='utf-8') + with yaml12file.open() as fp: + self.assertEqual( + [True, 'no', 2, 10, 8, '/'], + yaml.load(fp), + ) + def test_parse_human_readable_size(self): for k, v in ( (9827, 9827), @@ -417,7 +437,7 @@ class CommonTest(unittest.TestCase): metadata['RepoType'] = 'git' metadata['Repo'] = git_url with open(os.path.join('metadata', packageName + '.yml'), 'w') as fp: - yaml.dump(metadata, fp) + yaml_dumper.dump(metadata, fp) gitrepo = os.path.join(self.tmpdir, 'build', packageName) vcs0 = fdroidserver.common.getvcs('git', git_url, gitrepo) @@ -1913,7 +1933,7 @@ class CommonTest(unittest.TestCase): os.chdir(self.tmpdir) teststr = '/πÇÇ现代通用字-български-عربي1/ö/yml' with open(fdroidserver.common.CONFIG_FILE, 'w', encoding='utf-8') as fp: - yaml.dump({'apksigner': teststr}, fp) + yaml_dumper.dump({'apksigner': teststr}, fp) self.assertTrue(os.path.exists(fdroidserver.common.CONFIG_FILE)) config = fdroidserver.common.read_config() self.assertEqual(teststr, config.get('apksigner')) @@ -1937,7 +1957,7 @@ class CommonTest(unittest.TestCase): def test_with_config_yml_is_not_mixed_type(self): os.chdir(self.tmpdir) Path(fdroidserver.common.CONFIG_FILE).write_text('k: v\napksigner = /bin/apk') - with self.assertRaises(yaml.scanner.ScannerError): + with self.assertRaises(ruamel.yaml.scanner.ScannerError): fdroidserver.common.read_config() def test_config_perm_warning(self): @@ -2613,7 +2633,7 @@ class CommonTest(unittest.TestCase): ' -providerClass sun.security.pkcs11.SunPKCS11' ' -providerArg opensc-fdroid.cfg' } - yaml.dump(d, fp) + yaml_dumper.dump(d, fp) config = fdroidserver.common.read_config() fdroidserver.common.config = config self.assertTrue(isinstance(d['smartcardoptions'], str)) @@ -2829,21 +2849,21 @@ class CommonTest(unittest.TestCase): def test_parse_mirrors_config_str(self): s = 'foo@example.com:/var/www' - mirrors = ruamel.yaml.YAML(typ='safe').load("""'%s'""" % s) + mirrors = yaml.load("""'%s'""" % s) self.assertEqual( [{'url': s}], fdroidserver.common.parse_mirrors_config(mirrors) ) def test_parse_mirrors_config_list(self): s = 'foo@example.com:/var/www' - mirrors = ruamel.yaml.YAML(typ='safe').load("""- '%s'""" % s) + mirrors = yaml.load("""- '%s'""" % s) self.assertEqual( [{'url': s}], fdroidserver.common.parse_mirrors_config(mirrors) ) def test_parse_mirrors_config_dict(self): s = 'foo@example.com:/var/www' - mirrors = ruamel.yaml.YAML(typ='safe').load("""- url: '%s'""" % s) + mirrors = yaml.load("""- url: '%s'""" % s) self.assertEqual( [{'url': s}], fdroidserver.common.parse_mirrors_config(mirrors) ) diff --git a/tests/test_integration.py b/tests/test_integration.py index 7c527b57..1e07c231 100755 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -11,13 +11,12 @@ from datetime import datetime, timezone from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer from pathlib import Path -from ruamel.yaml import YAML - try: from androguard.core.bytecodes.apk import get_apkid # androguard <4 except ModuleNotFoundError: from androguard.core.apk import get_apkid +from fdroidserver._yaml import yaml, yaml_dumper from .shared_test_code import mkdir_testfiles # TODO: port generic tests that use index.xml to index-v2 (test that @@ -81,7 +80,6 @@ class IntegrationTest(unittest.TestCase): @staticmethod def update_yaml(path, items, replace=False): """Update a .yml file, e.g. config.yml, with the given items.""" - yaml = YAML() doc = {} if not replace: try: @@ -91,7 +89,7 @@ class IntegrationTest(unittest.TestCase): pass doc.update(items) with open(path, "w") as f: - yaml.dump(doc, f) + yaml_dumper.dump(doc, f) @staticmethod def remove_lines(path, unwanted_strings): diff --git a/tests/test_lint.py b/tests/test_lint.py index 6816ab69..820c80d6 100755 --- a/tests/test_lint.py +++ b/tests/test_lint.py @@ -7,13 +7,12 @@ import tempfile import unittest from pathlib import Path -import ruamel.yaml - from .shared_test_code import mkdtemp import fdroidserver.common import fdroidserver.lint import fdroidserver.metadata +from fdroidserver._yaml import yaml_dumper basedir = Path(__file__).parent @@ -365,40 +364,41 @@ class LintTest(unittest.TestCase): def test_lint_config_basic_mirrors_yml(self): os.chdir(self.testdir) - yaml = ruamel.yaml.YAML(typ='safe') with Path('mirrors.yml').open('w') as fp: - yaml.dump([{'url': 'https://example.com/fdroid/repo'}], fp) + yaml_dumper.dump([{'url': 'https://example.com/fdroid/repo'}], fp) self.assertTrue(fdroidserver.lint.lint_config('mirrors.yml')) def test_lint_config_mirrors_yml_kenya_countryCode(self): os.chdir(self.testdir) - yaml = ruamel.yaml.YAML(typ='safe') with Path('mirrors.yml').open('w') as fp: - yaml.dump([{'url': 'https://foo.com/fdroid/repo', 'countryCode': 'KE'}], fp) + yaml_dumper.dump( + [{'url': 'https://foo.com/fdroid/repo', 'countryCode': 'KE'}], fp + ) self.assertTrue(fdroidserver.lint.lint_config('mirrors.yml')) def test_lint_config_mirrors_yml_invalid_countryCode(self): """WV is "indeterminately reserved" so it should never be used.""" os.chdir(self.testdir) - yaml = ruamel.yaml.YAML(typ='safe') with Path('mirrors.yml').open('w') as fp: - yaml.dump([{'url': 'https://foo.com/fdroid/repo', 'countryCode': 'WV'}], fp) + yaml_dumper.dump( + [{'url': 'https://foo.com/fdroid/repo', 'countryCode': 'WV'}], fp + ) self.assertFalse(fdroidserver.lint.lint_config('mirrors.yml')) def test_lint_config_mirrors_yml_alpha3_countryCode(self): """Only ISO 3166-1 alpha 2 are supported""" os.chdir(self.testdir) - yaml = ruamel.yaml.YAML(typ='safe') with Path('mirrors.yml').open('w') as fp: - yaml.dump([{'url': 'https://de.com/fdroid/repo', 'countryCode': 'DEU'}], fp) + yaml_dumper.dump( + [{'url': 'https://de.com/fdroid/repo', 'countryCode': 'DEU'}], fp + ) self.assertFalse(fdroidserver.lint.lint_config('mirrors.yml')) def test_lint_config_mirrors_yml_one_invalid_countryCode(self): """WV is "indeterminately reserved" so it should never be used.""" os.chdir(self.testdir) - yaml = ruamel.yaml.YAML(typ='safe') with Path('mirrors.yml').open('w') as fp: - yaml.dump( + yaml_dumper.dump( [ {'url': 'https://bar.com/fdroid/repo', 'countryCode': 'BA'}, {'url': 'https://foo.com/fdroid/repo', 'countryCode': 'FO'}, diff --git a/tests/test_metadata.py b/tests/test_metadata.py index 7c9940f9..8c3f7591 100755 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -17,6 +17,7 @@ import fdroidserver from fdroidserver import metadata from fdroidserver.exception import MetaDataException from fdroidserver.common import DEFAULT_LOCALE +from fdroidserver._yaml import yaml from .shared_test_code import TmpCwd, mkdtemp @@ -178,7 +179,6 @@ class MetadataTest(unittest.TestCase): def test_valid_funding_yml_regex(self): """Check the regex can find all the cases""" with (basedir / 'funding-usernames.yaml').open() as fp: - yaml = ruamel.yaml.YAML(typ='safe') data = yaml.load(fp) for k, entries in data.items(): @@ -207,7 +207,6 @@ class MetadataTest(unittest.TestCase): fdroidserver.common.config = config fdroidserver.metadata.warnings_action = None - yaml = ruamel.yaml.YAML(typ='safe') apps = fdroidserver.metadata.read_metadata() for appid in ( 'app.with.special.build.params', @@ -337,7 +336,6 @@ class MetadataTest(unittest.TestCase): def test_normalize_type_string_sha256(self): """SHA-256 values are TYPE_STRING, which YAML can parse as decimal ints.""" - yaml = ruamel.yaml.YAML(typ='safe') for v in range(1, 1000): s = '%064d' % (v * (10**51)) self.assertEqual(s, metadata._normalize_type_string(yaml.load(s))) @@ -378,7 +376,6 @@ class MetadataTest(unittest.TestCase): def test_normalize_type_list(self): """TYPE_LIST is always a list of strings, no matter what YAML thinks.""" k = 'placeholder' - yaml = ruamel.yaml.YAML(typ='safe') self.assertEqual(['1.0'], metadata._normalize_type_list(k, 1.0)) self.assertEqual(['1234567890'], metadata._normalize_type_list(k, 1234567890)) self.assertEqual(['false'], metadata._normalize_type_list(k, False)) @@ -441,7 +438,6 @@ class MetadataTest(unittest.TestCase): def test_post_parse_yaml_metadata_0padding_sha256(self): """SHA-256 values are strings, but YAML 1.2 will read some as decimal ints.""" v = '0027293472934293872934729834729834729834729834792837487293847926' - yaml = ruamel.yaml.YAML(typ='safe') yamldata = yaml.load('AllowedAPKSigningKeys: ' + v) metadata.post_parse_yaml_metadata(yamldata) self.assertEqual(yamldata['AllowedAPKSigningKeys'], [v]) @@ -2287,7 +2283,6 @@ class PostMetadataParseTest(unittest.TestCase): maximum of two leading zeros, but this will handle more. """ - yaml = ruamel.yaml.YAML(typ='safe', pure=True) str_sha256 = '0000000000000498456908409534729834729834729834792837487293847926' sha256 = yaml.load('a: ' + str_sha256)['a'] self.assertEqual(*self._post_metadata_parse_app_int(sha256, int(str_sha256))) diff --git a/tests/test_publish.py b/tests/test_publish.py index 099c4188..82390547 100755 --- a/tests/test_publish.py +++ b/tests/test_publish.py @@ -13,7 +13,6 @@ import json import os import pathlib -import ruamel.yaml import shutil import sys import unittest @@ -24,6 +23,7 @@ from fdroidserver import publish from fdroidserver import common from fdroidserver import metadata from fdroidserver import signatures +from fdroidserver._yaml import yaml from fdroidserver.exception import FDroidException from .shared_test_code import mkdtemp, VerboseFalseOptions @@ -116,7 +116,6 @@ class PublishTest(unittest.TestCase): } self.assertEqual(expected, common.load_stats_fdroid_signing_key_fingerprints()) - yaml = ruamel.yaml.YAML(typ='safe') with open(common.CONFIG_FILE) as fp: config = yaml.load(fp) self.assertEqual( From 3ab2baf542a8a3ea475cf835dc0d9caa12b28791 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 7 Mar 2025 17:30:46 +0100 Subject: [PATCH 1908/2116] _yaml.config_dump() for writing out config This outputs YAML in a string that is suitable for use in regexps and string replacements, as well as complete files. It is therefore explicitly set up to avoid writing out headers and footers. --- fdroidserver/_yaml.py | 24 ++++++++++++++++++++++++ fdroidserver/common.py | 7 ++----- tests/test_common.py | 6 +++--- tests/test_lint.py | 12 ++++++------ 4 files changed, 35 insertions(+), 14 deletions(-) diff --git a/fdroidserver/_yaml.py b/fdroidserver/_yaml.py index 48368198..260f67c0 100644 --- a/fdroidserver/_yaml.py +++ b/fdroidserver/_yaml.py @@ -38,3 +38,27 @@ yaml = ruamel.yaml.YAML(typ='safe') yaml.version = (1, 2) yaml_dumper = ruamel.yaml.YAML(typ='rt') + + +def config_dump(config, fp=None): + """Dump config data in YAML 1.2 format without headers. + + This outputs YAML in a string that is suitable for use in regexps + and string replacements, as well as complete files. It is therefore + explicitly set up to avoid writing out headers and footers. + + This is modeled after PyYAML's yaml.dump(), which can dump to a file + or return a string. + + https://yaml.dev/doc/ruamel.yaml/example/#Output_of_%60dump()%60_as_a_string + + """ + dumper = ruamel.yaml.YAML(typ='rt') + dumper.default_flow_style = False + dumper.explicit_start = False + dumper.explicit_end = False + if fp is None: + with ruamel.yaml.compat.StringIO() as fp: + dumper.dump(config, fp) + return fp.getvalue() + dumper.dump(config, fp) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 320cffe4..80806c6e 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -39,7 +39,6 @@ import sys import re import ast import gzip -import ruamel.yaml import shutil import stat import subprocess @@ -67,7 +66,7 @@ from zipfile import ZipFile import fdroidserver.metadata from fdroidserver import _ -from fdroidserver._yaml import yaml, yaml_dumper +from fdroidserver._yaml import yaml, config_dump from fdroidserver.exception import FDroidException, VCSException, NoSubmodulesException, \ BuildException, VerificationException, MetaDataException from .asynchronousfilereader import AsynchronousFileReader @@ -4230,9 +4229,7 @@ def write_to_config(thisconfig, key, value=None): lines[-1] += '\n' pattern = re.compile(r'^[\s#]*' + key + r':.*\n') - with ruamel.yaml.compat.StringIO() as fp: - yaml_dumper.dump({key: value}, fp) - repl = fp.getvalue() + repl = config_dump({key: value}) # If we replaced this line once, we make sure won't be a # second instance of this line for this key in the document. diff --git a/tests/test_common.py b/tests/test_common.py index f5ffbfbe..3513bf53 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -31,7 +31,7 @@ import fdroidserver.common import fdroidserver.metadata from .shared_test_code import TmpCwd, mkdtemp from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME -from fdroidserver._yaml import yaml, yaml_dumper +from fdroidserver._yaml import yaml, yaml_dumper, config_dump from fdroidserver.exception import FDroidException, VCSException,\ MetaDataException, VerificationException from fdroidserver.looseversion import LooseVersion @@ -1933,7 +1933,7 @@ class CommonTest(unittest.TestCase): os.chdir(self.tmpdir) teststr = '/πÇÇ现代通用字-български-عربي1/ö/yml' with open(fdroidserver.common.CONFIG_FILE, 'w', encoding='utf-8') as fp: - yaml_dumper.dump({'apksigner': teststr}, fp) + config_dump({'apksigner': teststr}, fp) self.assertTrue(os.path.exists(fdroidserver.common.CONFIG_FILE)) config = fdroidserver.common.read_config() self.assertEqual(teststr, config.get('apksigner')) @@ -2633,7 +2633,7 @@ class CommonTest(unittest.TestCase): ' -providerClass sun.security.pkcs11.SunPKCS11' ' -providerArg opensc-fdroid.cfg' } - yaml_dumper.dump(d, fp) + config_dump(d, fp) config = fdroidserver.common.read_config() fdroidserver.common.config = config self.assertTrue(isinstance(d['smartcardoptions'], str)) diff --git a/tests/test_lint.py b/tests/test_lint.py index 820c80d6..c9e7b3f4 100755 --- a/tests/test_lint.py +++ b/tests/test_lint.py @@ -12,7 +12,7 @@ from .shared_test_code import mkdtemp import fdroidserver.common import fdroidserver.lint import fdroidserver.metadata -from fdroidserver._yaml import yaml_dumper +from fdroidserver._yaml import config_dump basedir = Path(__file__).parent @@ -365,13 +365,13 @@ class LintTest(unittest.TestCase): def test_lint_config_basic_mirrors_yml(self): os.chdir(self.testdir) with Path('mirrors.yml').open('w') as fp: - yaml_dumper.dump([{'url': 'https://example.com/fdroid/repo'}], fp) + config_dump([{'url': 'https://example.com/fdroid/repo'}], fp) self.assertTrue(fdroidserver.lint.lint_config('mirrors.yml')) def test_lint_config_mirrors_yml_kenya_countryCode(self): os.chdir(self.testdir) with Path('mirrors.yml').open('w') as fp: - yaml_dumper.dump( + config_dump( [{'url': 'https://foo.com/fdroid/repo', 'countryCode': 'KE'}], fp ) self.assertTrue(fdroidserver.lint.lint_config('mirrors.yml')) @@ -380,7 +380,7 @@ class LintTest(unittest.TestCase): """WV is "indeterminately reserved" so it should never be used.""" os.chdir(self.testdir) with Path('mirrors.yml').open('w') as fp: - yaml_dumper.dump( + config_dump( [{'url': 'https://foo.com/fdroid/repo', 'countryCode': 'WV'}], fp ) self.assertFalse(fdroidserver.lint.lint_config('mirrors.yml')) @@ -389,7 +389,7 @@ class LintTest(unittest.TestCase): """Only ISO 3166-1 alpha 2 are supported""" os.chdir(self.testdir) with Path('mirrors.yml').open('w') as fp: - yaml_dumper.dump( + config_dump( [{'url': 'https://de.com/fdroid/repo', 'countryCode': 'DEU'}], fp ) self.assertFalse(fdroidserver.lint.lint_config('mirrors.yml')) @@ -398,7 +398,7 @@ class LintTest(unittest.TestCase): """WV is "indeterminately reserved" so it should never be used.""" os.chdir(self.testdir) with Path('mirrors.yml').open('w') as fp: - yaml_dumper.dump( + config_dump( [ {'url': 'https://bar.com/fdroid/repo', 'countryCode': 'BA'}, {'url': 'https://foo.com/fdroid/repo', 'countryCode': 'FO'}, From 14e13b4f4a37afa38fcdf61cece362372fd4a19a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Wed, 12 Mar 2025 10:04:46 +0100 Subject: [PATCH 1909/2116] =?UTF-8?q?=F0=9F=AA=90=20fix=20pydoc=20link=20i?= =?UTF-8?q?n=20hooks/pre-commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updated pydoc linter flags based on how it's used in .gitlab-ci.yml --- hooks/pre-commit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hooks/pre-commit b/hooks/pre-commit index 784cc9ee..c0859570 100755 --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -91,7 +91,7 @@ if [ "$PY_FILES $PY_TEST_FILES" != " " ]; then err "pyflakes tests failed!" fi # ignore vendored files - if ! $PYDOCSTYLE --match='(?!apksigcopier|looseversion).*\.py' $PY_FILES $PY_TEST_FILES; then + if ! $PYDOCSTYLE --match='(?!apksigcopier|looseversion|setup|test_).*\.py' $PY_FILES $PY_TEST_FILES; then err "pydocstyle tests failed!" fi fi From 031ae1103e23731ccd0cb2d82ab140917122b110 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 24 Feb 2025 19:48:22 +0100 Subject: [PATCH 1910/2116] function-local imports to limit deps for publish/signindex/gpgsign This eliminates the need to have these installed on the signing server: * python3-qrcode * python3-requests The signing server currently uses a git clone to run _fdroidserver_ and `apt-get install` for dependencies. This leaves "qrcode" in "install_requires" since moving it to "extras_require" would break `fdroid update` and `fdroid nightly` for anything that does `pip install fdroidserver`: https://gitlab.com/eighthave/fdroidserver/-/jobs/9386520037 --- fdroidserver/index.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 8ce2f8e8..0beba4ef 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -20,6 +20,16 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +"""Process the index files. + +This module is loaded by all fdroid subcommands since it is loaded in +fdroidserver/__init__.py. Any narrowly used dependencies should be +imported where they are used to limit dependencies for subcommands +like publish/signindex/gpgsign. This eliminates the need to have +these installed on the signing server. + +""" + import collections import hashlib import json @@ -32,7 +42,6 @@ import tempfile import urllib.parse import zipfile import calendar -import qrcode from binascii import hexlify, unhexlify from datetime import datetime, timezone from pathlib import Path @@ -41,7 +50,6 @@ from xml.dom.minidom import Document from . import _ from . import common from . import metadata -from . import net from . import signindex from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME, CONFIG_CONFIG_NAME, MIRRORS_CONFIG_NAME, RELEASECHANNELS_CONFIG_NAME, DEFAULT_LOCALE, FDroidPopen, FDroidPopenBytes, load_stats_fdroid_signing_key_fingerprints from fdroidserver._yaml import yaml @@ -160,6 +168,7 @@ def make_website(apps, repodir, repodict): html_file = os.path.join(repodir, html_name) if _should_file_be_generated(html_file, autogenerate_comment): + import qrcode qrcode.make(link_fingerprinted).save(os.path.join(repodir, "index.png")) with open(html_file, 'w') as f: name = repodict["name"] @@ -1378,7 +1387,15 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing % repo_icon) os.makedirs(os.path.dirname(iconfilename), exist_ok=True) try: + import qrcode + qrcode.make(common.config['repo_url']).save(iconfilename) + except ModuleNotFoundError as e: + raise ModuleNotFoundError( + _( + 'The "qrcode" Python package is not installed (e.g. apt-get install python3-qrcode)!' + ) + ) from e except Exception: exampleicon = os.path.join(common.get_examples_dir(), common.default_config['repo_icon']) @@ -1624,6 +1641,8 @@ def download_repo_index_v1(url_str, etag=None, verify_fingerprint=True, timeout= - The new eTag as returned by the HTTP request """ + from . import net + url = urllib.parse.urlsplit(url_str) fingerprint = None @@ -1675,6 +1694,8 @@ def download_repo_index_v2(url_str, etag=None, verify_fingerprint=True, timeout= - The new eTag as returned by the HTTP request """ + from . import net + etag # etag is unused but needs to be there to keep the same API as the earlier functions. url = urllib.parse.urlsplit(url_str) From 081e02c10947fda58f59ca780178453398c41da7 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 27 Feb 2025 15:48:58 +0100 Subject: [PATCH 1911/2116] expand {env: foo} in any place a string can be `keypass: {env: keypass}` has been in use in production repos for years. That is not anything new. It makes it possible to maintain _config.yml_ publicly even when it needs secrets. This change makes sure it is possible to use {env: foo} syntax anywhere where a string value is valid. The "list of dicts" values can be str, list of str or list of dicts with str. Before the {env: keypass} syntax, the actual password was just inline in the config file. Before this commit, it was only possible to use {env: key} syntax in simple, string-only configs, e.g. from examples/config.yml: --- fdroidserver/common.py | 39 +++++++++++++++++---- tests/test_common.py | 77 ++++++++++++++++++++++++++++++++++++++++++ tests/test_lint.py | 7 +++- 3 files changed, 116 insertions(+), 7 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 80806c6e..06ac9cf9 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -642,16 +642,43 @@ def read_config(): return config +def expand_env_dict(s): + """Expand env var dict to a string value. + + {env: varName} syntax can be used to replace any string value in the + config with the value of an environment variable "varName". This + allows for secrets management when commiting the config file to a + public git repo. + + """ + if not s or type(s) not in (str, dict): + return + if isinstance(s, dict): + if 'env' not in s or len(s) > 1: + raise TypeError(_('Only accepts a single key "env"')) + var = s['env'] + s = os.getenv(var) + if not s: + logging.error( + _('Environment variable {{env: {var}}} is not set!').format(var=var) + ) + return + return os.path.expanduser(s) + + def parse_mirrors_config(mirrors): """Mirrors can be specified as a string, list of strings, or dictionary map.""" if isinstance(mirrors, str): - return [{"url": mirrors}] - elif all(isinstance(item, str) for item in mirrors): - return [{'url': i} for i in mirrors] - elif all(isinstance(item, dict) for item in mirrors): + return [{"url": expand_env_dict(mirrors)}] + if isinstance(mirrors, dict): + return [{"url": expand_env_dict(mirrors)}] + if all(isinstance(item, str) for item in mirrors): + return [{'url': expand_env_dict(i)} for i in mirrors] + if all(isinstance(item, dict) for item in mirrors): + for item in mirrors: + item['url'] = expand_env_dict(item['url']) return mirrors - else: - raise TypeError(_('only accepts strings, lists, and tuples')) + raise TypeError(_('only accepts strings, lists, and tuples')) def get_mirrors(url, filename=None): diff --git a/tests/test_common.py b/tests/test_common.py index 3513bf53..bbdaa016 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -2122,6 +2122,27 @@ class CommonTest(unittest.TestCase): ) fdroidserver.common.read_config() + @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) + def test_config_with_env_string(self): + """Test whether env works in keys with string values.""" + os.chdir(self.testdir) + testvalue = 'this is just a test' + Path('config.yml').write_text('keypass: {env: foo}') + os.environ['foo'] = testvalue + self.assertEqual(testvalue, fdroidserver.common.get_config()['keypass']) + + @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) + def test_config_with_env_path(self): + """Test whether env works in keys with path values.""" + os.chdir(self.testdir) + path = 'user@server:/path/to/bar/' + os.environ['foo'] = path + Path('config.yml').write_text('serverwebroot: {env: foo}') + self.assertEqual( + [{'url': path}], + fdroidserver.common.get_config()['serverwebroot'], + ) + def test_setup_status_output(self): os.chdir(self.tmpdir) start_timestamp = time.gmtime() @@ -2847,6 +2868,41 @@ class CommonTest(unittest.TestCase): fdroidserver.common.read_config()['serverwebroot'], ) + @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) + def test_config_serverwebroot_list_of_dicts_env(self): + os.chdir(self.testdir) + url = 'foo@example.com:/var/www/' + os.environ['serverwebroot'] = url + fdroidserver.common.write_config_file( + textwrap.dedent( + """\ + serverwebroot: + - url: {env: serverwebroot} + index_only: true + """ + ) + ) + self.assertEqual( + [{'url': url, 'index_only': True}], + fdroidserver.common.read_config()['serverwebroot'], + ) + + def test_expand_env_dict_fake_str(self): + testvalue = '"{env: foo}"' + self.assertEqual(testvalue, fdroidserver.common.expand_env_dict(testvalue)) + + @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) + def test_expand_env_dict_good(self): + name = 'foo' + value = 'bar' + os.environ[name] = value + self.assertEqual(value, fdroidserver.common.expand_env_dict({'env': name})) + + @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) + def test_expand_env_dict_bad_dict(self): + with self.assertRaises(TypeError): + fdroidserver.common.expand_env_dict({'env': 'foo', 'foo': 'bar'}) + def test_parse_mirrors_config_str(self): s = 'foo@example.com:/var/www' mirrors = yaml.load("""'%s'""" % s) @@ -2868,6 +2924,27 @@ class CommonTest(unittest.TestCase): [{'url': s}], fdroidserver.common.parse_mirrors_config(mirrors) ) + @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH'), 'foo': 'bar'}, clear=True) + def test_parse_mirrors_config_env_str(self): + mirrors = yaml.load('{env: foo}') + self.assertEqual( + [{'url': 'bar'}], fdroidserver.common.parse_mirrors_config(mirrors) + ) + + def test_parse_mirrors_config_env_list(self): + s = 'foo@example.com:/var/www' + mirrors = yaml.load("""- '%s'""" % s) + self.assertEqual( + [{'url': s}], fdroidserver.common.parse_mirrors_config(mirrors) + ) + + def test_parse_mirrors_config_env_dict(self): + s = 'foo@example.com:/var/www' + mirrors = yaml.load("""- url: '%s'""" % s) + self.assertEqual( + [{'url': s}], fdroidserver.common.parse_mirrors_config(mirrors) + ) + def test_KnownApks_recordapk(self): """Test that added dates are being fetched from the index. diff --git a/tests/test_lint.py b/tests/test_lint.py index c9e7b3f4..95752cb9 100755 --- a/tests/test_lint.py +++ b/tests/test_lint.py @@ -550,7 +550,12 @@ class ConfigYmlTest(LintTest): self.config_yml.write_text('sdk_path: /opt/android-sdk\n') self.assertTrue(fdroidserver.lint.lint_config(self.config_yml)) - def test_config_yml_str_dict(self): + def test_config_yml_str_list_of_dicts_env(self): + """serverwebroot can be str, list of str, or list of dicts.""" + self.config_yml.write_text('serverwebroot: {env: ANDROID_HOME}\n') + self.assertTrue(fdroidserver.lint.lint_config(self.config_yml)) + + def test_config_yml_str_env(self): self.config_yml.write_text('sdk_path: {env: ANDROID_HOME}\n') self.assertTrue(fdroidserver.lint.lint_config(self.config_yml)) From 8cf1297e2c939729a01f463cbda8772b9593e684 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 6 Mar 2025 13:15:21 +0100 Subject: [PATCH 1912/2116] clarify config data types and structures --- fdroidserver/common.py | 66 +++++++++++++++++++++++++++++++----------- fdroidserver/lint.py | 2 +- fdroidserver/net.py | 2 +- tests/test_common.py | 24 +++++++-------- tests/test_lint.py | 53 +++++++++++++++++++++++++++++++++ 5 files changed, 116 insertions(+), 31 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 06ac9cf9..b2386396 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -25,8 +25,32 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -# common.py is imported by all modules, so do not import third-party -# libraries here as they will become a requirement for all commands. + +"""Collection of functions shared by subcommands. + +This is basically the "shared library" for all the fdroid subcommands. +The contains core functionality and a number of utility functions. +This is imported by all modules, so do not import third-party +libraries here as they will become a requirement for all commands. + +Config +------ + +Parsing and using the configuration settings from config.yml is +handled here. The data format is YAML 1.2. The config has its own +supported data types: + +* Boolean (e.g. deploy_process_logs:) +* Integer (e.g. archive_older:, repo_maxage:) +* String-only (e.g. repo_name:, sdk_path:) +* Multi-String (string, list of strings, or list of dicts with + strings, e.g. serverwebroot:, mirrors:) + +String-only fields can also use a special value {env: varname}, which +is a dict with a single key 'env' and a value that is the name of the +environment variable to include. + +""" import copy import difflib @@ -586,12 +610,15 @@ def read_config(): fill_config_defaults(config) if 'serverwebroot' in config: - roots = parse_mirrors_config(config['serverwebroot']) + roots = parse_list_of_dicts(config['serverwebroot']) rootlist = [] for d in roots: # since this is used with rsync, where trailing slashes have # meaning, ensure there is always a trailing slash - rootstr = d['url'] + rootstr = d.get('url') + if not rootstr: + logging.error('serverwebroot: has blank value!') + continue if rootstr[-1] != '/': rootstr += '/' d['url'] = rootstr.replace('//', '/') @@ -599,7 +626,7 @@ def read_config(): config['serverwebroot'] = rootlist if 'servergitmirrors' in config: - config['servergitmirrors'] = parse_mirrors_config(config['servergitmirrors']) + config['servergitmirrors'] = parse_list_of_dicts(config['servergitmirrors']) limit = config['git_mirror_size_limit'] config['git_mirror_size_limit'] = parse_human_readable_size(limit) @@ -666,18 +693,23 @@ def expand_env_dict(s): return os.path.expanduser(s) -def parse_mirrors_config(mirrors): - """Mirrors can be specified as a string, list of strings, or dictionary map.""" - if isinstance(mirrors, str): - return [{"url": expand_env_dict(mirrors)}] - if isinstance(mirrors, dict): - return [{"url": expand_env_dict(mirrors)}] - if all(isinstance(item, str) for item in mirrors): - return [{'url': expand_env_dict(i)} for i in mirrors] - if all(isinstance(item, dict) for item in mirrors): - for item in mirrors: +def parse_list_of_dicts(l_of_d): + """Parse config data structure that is a list of dicts of strings. + + The value can be specified as a string, list of strings, or list of dictionary maps + where the values are strings. + + """ + if isinstance(l_of_d, str): + return [{"url": expand_env_dict(l_of_d)}] + if isinstance(l_of_d, dict): + return [{"url": expand_env_dict(l_of_d)}] + if all(isinstance(item, str) for item in l_of_d): + return [{'url': expand_env_dict(i)} for i in l_of_d] + if all(isinstance(item, dict) for item in l_of_d): + for item in l_of_d: item['url'] = expand_env_dict(item['url']) - return mirrors + return l_of_d raise TypeError(_('only accepts strings, lists, and tuples')) @@ -690,7 +722,7 @@ def get_mirrors(url, filename=None): if url.netloc == 'f-droid.org': mirrors = FDROIDORG_MIRRORS else: - mirrors = parse_mirrors_config(url.geturl()) + mirrors = parse_list_of_dicts(url.geturl()) if filename: return append_filename_to_mirrors(filename, mirrors) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 4e62a404..ce541c4d 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -899,7 +899,7 @@ def lint_config(arg): show_error = False if t is str: - if type(data[key]) not in (str, dict): + if type(data[key]) not in (str, list, dict): passed = False show_error = True elif type(data[key]) != t: diff --git a/fdroidserver/net.py b/fdroidserver/net.py index 5c6e0144..1ec7d096 100644 --- a/fdroidserver/net.py +++ b/fdroidserver/net.py @@ -92,7 +92,7 @@ def download_using_mirrors(mirrors, local_filename=None): logic will try it twice: first without SNI, then again with SNI. """ - mirrors = common.parse_mirrors_config(mirrors) + mirrors = common.parse_list_of_dicts(mirrors) mirror_configs_to_try = [] for mirror in mirrors: mirror_configs_to_try.append(mirror) diff --git a/tests/test_common.py b/tests/test_common.py index bbdaa016..c6f90890 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -2903,46 +2903,46 @@ class CommonTest(unittest.TestCase): with self.assertRaises(TypeError): fdroidserver.common.expand_env_dict({'env': 'foo', 'foo': 'bar'}) - def test_parse_mirrors_config_str(self): + def test_parse_list_of_dicts_str(self): s = 'foo@example.com:/var/www' mirrors = yaml.load("""'%s'""" % s) self.assertEqual( - [{'url': s}], fdroidserver.common.parse_mirrors_config(mirrors) + [{'url': s}], fdroidserver.common.parse_list_of_dicts(mirrors) ) - def test_parse_mirrors_config_list(self): + def test_parse_list_of_dicts_list(self): s = 'foo@example.com:/var/www' mirrors = yaml.load("""- '%s'""" % s) self.assertEqual( - [{'url': s}], fdroidserver.common.parse_mirrors_config(mirrors) + [{'url': s}], fdroidserver.common.parse_list_of_dicts(mirrors) ) - def test_parse_mirrors_config_dict(self): + def test_parse_list_of_dicts_dict(self): s = 'foo@example.com:/var/www' mirrors = yaml.load("""- url: '%s'""" % s) self.assertEqual( - [{'url': s}], fdroidserver.common.parse_mirrors_config(mirrors) + [{'url': s}], fdroidserver.common.parse_list_of_dicts(mirrors) ) @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH'), 'foo': 'bar'}, clear=True) - def test_parse_mirrors_config_env_str(self): + def test_parse_list_of_dicts_env_str(self): mirrors = yaml.load('{env: foo}') self.assertEqual( - [{'url': 'bar'}], fdroidserver.common.parse_mirrors_config(mirrors) + [{'url': 'bar'}], fdroidserver.common.parse_list_of_dicts(mirrors) ) - def test_parse_mirrors_config_env_list(self): + def test_parse_list_of_dicts_env_list(self): s = 'foo@example.com:/var/www' mirrors = yaml.load("""- '%s'""" % s) self.assertEqual( - [{'url': s}], fdroidserver.common.parse_mirrors_config(mirrors) + [{'url': s}], fdroidserver.common.parse_list_of_dicts(mirrors) ) - def test_parse_mirrors_config_env_dict(self): + def test_parse_list_of_dicts_env_dict(self): s = 'foo@example.com:/var/www' mirrors = yaml.load("""- url: '%s'""" % s) self.assertEqual( - [{'url': s}], fdroidserver.common.parse_mirrors_config(mirrors) + [{'url': s}], fdroidserver.common.parse_list_of_dicts(mirrors) ) def test_KnownApks_recordapk(self): diff --git a/tests/test_lint.py b/tests/test_lint.py index 95752cb9..5a6a1001 100755 --- a/tests/test_lint.py +++ b/tests/test_lint.py @@ -4,6 +4,7 @@ import logging import os import shutil import tempfile +import textwrap import unittest from pathlib import Path @@ -534,6 +535,13 @@ class LintAntiFeaturesTest(unittest.TestCase): class ConfigYmlTest(LintTest): + """Test data formats used in config.yml. + + lint.py uses print() and not logging so hacks are used to control + the output when running in the test runner. + + """ + def setUp(self): super().setUp() self.config_yml = Path(self.testdir) / fdroidserver.common.CONFIG_FILE @@ -550,6 +558,22 @@ class ConfigYmlTest(LintTest): self.config_yml.write_text('sdk_path: /opt/android-sdk\n') self.assertTrue(fdroidserver.lint.lint_config(self.config_yml)) + def test_config_yml_str_list(self): + self.config_yml.write_text('serverwebroot: [server1, server2]\n') + self.assertTrue(fdroidserver.lint.lint_config(self.config_yml)) + + def test_config_yml_str_list_of_dicts(self): + self.config_yml.write_text( + textwrap.dedent( + """\ + serverwebroot: + - url: 'me@b.az:/srv/fdroid' + index_only: true + """ + ) + ) + self.assertTrue(fdroidserver.lint.lint_config(self.config_yml)) + def test_config_yml_str_list_of_dicts_env(self): """serverwebroot can be str, list of str, or list of dicts.""" self.config_yml.write_text('serverwebroot: {env: ANDROID_HOME}\n') @@ -595,3 +619,32 @@ class ConfigYmlTest(LintTest): fdroidserver.lint.lint_config(self.config_yml), f'{key} should fail on value of "{value}"', ) + + def test_config_yml_keyaliases(self): + self.config_yml.write_text( + textwrap.dedent( + """\ + keyaliases: + com.example: myalias + com.foo: '@com.example' + """ + ) + ) + self.assertTrue(fdroidserver.lint.lint_config(self.config_yml)) + + def test_config_yml_keyaliases_bad_str(self): + """The keyaliases: value is a dict not a str.""" + self.config_yml.write_text("keyaliases: '@com.example'\n") + self.assertFalse(fdroidserver.lint.lint_config(self.config_yml)) + + def test_config_yml_keyaliases_bad_list(self): + """The keyaliases: value is a dict not a list.""" + self.config_yml.write_text( + textwrap.dedent( + """\ + keyaliases: + - com.example: myalias + """ + ) + ) + self.assertFalse(fdroidserver.lint.lint_config(self.config_yml)) From f269232b9661dadfc19f115c75e3b9aa281dc13d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 27 Feb 2025 16:11:12 +0100 Subject: [PATCH 1913/2116] hide error messages in tests that are meant to fail --- tests/test_lint.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/test_lint.py b/tests/test_lint.py index 5a6a1001..f65f3297 100755 --- a/tests/test_lint.py +++ b/tests/test_lint.py @@ -7,6 +7,7 @@ import tempfile import textwrap import unittest from pathlib import Path +from unittest import mock from .shared_test_code import mkdtemp @@ -550,6 +551,7 @@ class ConfigYmlTest(LintTest): self.config_yml.write_text('repo_maxage: 1\n') self.assertTrue(fdroidserver.lint.lint_config(self.config_yml)) + @mock.patch('builtins.print', mock.Mock()) # hide error message def test_config_yml_int_bad(self): self.config_yml.write_text('repo_maxage: "1"\n') self.assertFalse(fdroidserver.lint.lint_config(self.config_yml)) @@ -583,6 +585,7 @@ class ConfigYmlTest(LintTest): self.config_yml.write_text('sdk_path: {env: ANDROID_HOME}\n') self.assertTrue(fdroidserver.lint.lint_config(self.config_yml)) + @mock.patch('builtins.print', mock.Mock()) # hide error message def test_config_yml_str_bad(self): self.config_yml.write_text('sdk_path: 1.0\n') self.assertFalse(fdroidserver.lint.lint_config(self.config_yml)) @@ -591,6 +594,7 @@ class ConfigYmlTest(LintTest): self.config_yml.write_text("deploy_process_logs: true\n") self.assertTrue(fdroidserver.lint.lint_config(self.config_yml)) + @mock.patch('builtins.print', mock.Mock()) # hide error message def test_config_yml_bool_bad(self): self.config_yml.write_text('deploy_process_logs: 2342fe23\n') self.assertFalse(fdroidserver.lint.lint_config(self.config_yml)) @@ -599,14 +603,17 @@ class ConfigYmlTest(LintTest): self.config_yml.write_text("keyaliases: {com.example: '@com.foo'}\n") self.assertTrue(fdroidserver.lint.lint_config(self.config_yml)) + @mock.patch('builtins.print', mock.Mock()) # hide error message def test_config_yml_dict_bad(self): self.config_yml.write_text('keyaliases: 2342fe23\n') self.assertFalse(fdroidserver.lint.lint_config(self.config_yml)) + @mock.patch('builtins.print', mock.Mock()) # hide error message def test_config_yml_bad_key_name(self): self.config_yml.write_text('keyalias: 2342fe23\n') self.assertFalse(fdroidserver.lint.lint_config(self.config_yml)) + @mock.patch('builtins.print', mock.Mock()) # hide error message def test_config_yml_bad_value_for_all_keys(self): """Check all config keys with a bad value.""" for key in fdroidserver.lint.check_config_keys: @@ -632,11 +639,13 @@ class ConfigYmlTest(LintTest): ) self.assertTrue(fdroidserver.lint.lint_config(self.config_yml)) + @mock.patch('builtins.print', mock.Mock()) # hide error message def test_config_yml_keyaliases_bad_str(self): """The keyaliases: value is a dict not a str.""" self.config_yml.write_text("keyaliases: '@com.example'\n") self.assertFalse(fdroidserver.lint.lint_config(self.config_yml)) + @mock.patch('builtins.print', mock.Mock()) # hide error message def test_config_yml_keyaliases_bad_list(self): """The keyaliases: value is a dict not a list.""" self.config_yml.write_text( From 36007d50e5caca7a58a915354b7d5ee3f53778bd Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 6 Mar 2025 11:13:37 +0100 Subject: [PATCH 1914/2116] AbstractBaseTest class for sharing setUp and tearDown in tests --- tests/test_common.py | 10 +++++++--- tests/test_lint.py | 8 ++++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/tests/test_common.py b/tests/test_common.py index c6f90890..cbbba221 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -46,8 +46,8 @@ def _mock_common_module_options_instance(): fdroidserver.common.options.verbose = False -class CommonTest(unittest.TestCase): - '''fdroidserver/common.py''' +class SetUpTearDownMixin: + """A mixin with no tests in it for shared setUp and tearDown.""" def setUp(self): logging.basicConfig(level=logging.DEBUG) @@ -77,6 +77,10 @@ class CommonTest(unittest.TestCase): if os.path.exists(self.tmpdir): shutil.rmtree(self.tmpdir) + +class CommonTest(SetUpTearDownMixin, unittest.TestCase): + '''fdroidserver/common.py''' + def test_yaml_1_2(self): """Return a ruamel.yaml instance that supports YAML 1.2 @@ -3307,7 +3311,7 @@ class SignerExtractionTest(unittest.TestCase): ) -class IgnoreApksignerV33Test(CommonTest): +class IgnoreApksignerV33Test(SetUpTearDownMixin, unittest.TestCase): """apksigner v33 should be entirely ignored https://gitlab.com/fdroid/fdroidserver/-/issues/1253 diff --git a/tests/test_lint.py b/tests/test_lint.py index f65f3297..f0bf6b4d 100755 --- a/tests/test_lint.py +++ b/tests/test_lint.py @@ -19,8 +19,8 @@ from fdroidserver._yaml import config_dump basedir = Path(__file__).parent -class LintTest(unittest.TestCase): - '''fdroidserver/lint.py''' +class SetUpTearDownMixin: + """A base class with no test in it for shared setUp and tearDown.""" def setUp(self): os.chdir(basedir) @@ -33,6 +33,10 @@ class LintTest(unittest.TestCase): def tearDown(self): self._td.cleanup() + +class LintTest(SetUpTearDownMixin, unittest.TestCase): + '''fdroidserver/lint.py''' + def test_check_for_unsupported_metadata_files(self): self.assertTrue(fdroidserver.lint.check_for_unsupported_metadata_files()) From 858068c64b279ef17113ea2b59ad852e38e7d624 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 5 Mar 2025 12:22:22 +0100 Subject: [PATCH 1915/2116] only show "unsafe perms on config.yml" when secrets are present This should make for fewer false positives. --- fdroidserver/common.py | 21 +++++++++-------- tests/test_common.py | 51 +++++++++++++++++++++++++++++++++--------- 2 files changed, 53 insertions(+), 19 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index b2386396..2a63803f 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -598,15 +598,6 @@ def read_config(): 'sun.security.pkcs11.SunPKCS11', '-providerArg', 'opensc-fdroid.cfg'] - if any(k in config for k in ["keystore", "keystorepass", "keypass"]): - st = os.stat(CONFIG_FILE) - if st.st_mode & stat.S_IRWXG or st.st_mode & stat.S_IRWXO: - logging.warning( - _("unsafe permissions on '{config_file}' (should be 0600)!").format( - config_file=CONFIG_FILE - ) - ) - fill_config_defaults(config) if 'serverwebroot' in config: @@ -666,6 +657,18 @@ def read_config(): for configname in confignames_to_delete: del config[configname] + if any( + k in config and config.get(k) + for k in ["awssecretkey", "keystorepass", "keypass"] + ): + st = os.stat(CONFIG_FILE) + if st.st_mode & stat.S_IRWXG or st.st_mode & stat.S_IRWXO: + logging.warning( + _("unsafe permissions on '{config_file}' (should be 0600)!").format( + config_file=CONFIG_FILE + ) + ) + return config diff --git a/tests/test_common.py b/tests/test_common.py index cbbba221..293d69ec 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -1964,16 +1964,6 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): with self.assertRaises(ruamel.yaml.scanner.ScannerError): fdroidserver.common.read_config() - def test_config_perm_warning(self): - """Exercise the code path that issues a warning about unsafe permissions.""" - os.chdir(self.tmpdir) - fdroidserver.common.write_config_file('keystore: foo.jks') - self.assertTrue(os.path.exists(fdroidserver.common.CONFIG_FILE)) - os.chmod(fdroidserver.common.CONFIG_FILE, 0o666) # nosec B103 - fdroidserver.common.read_config() - os.remove(fdroidserver.common.CONFIG_FILE) - fdroidserver.common.config = None - def test_config_repo_url(self): """repo_url ends in /repo, archive_url ends in /archive.""" os.chdir(self.tmpdir) @@ -3444,3 +3434,44 @@ class ConfigOptionsScopeTest(unittest.TestCase): 'config' not in vars() and 'config' not in globals(), "The config should not be set in the global context, only module-level.", ) + + +class UnsafePermissionsTest(SetUpTearDownMixin, unittest.TestCase): + def setUp(self): + config = dict() + fdroidserver.common.find_apksigner(config) + if not config.get('apksigner'): + self.skipTest('SKIPPING, apksigner not installed!') + + super().setUp() + os.chdir(self.testdir) + fdroidserver.common.write_config_file('keypass: {env: keypass}') + os.chmod(fdroidserver.common.CONFIG_FILE, 0o666) # nosec B103 + + def test_config_perm_no_warning(self): + fdroidserver.common.write_config_file('keystore: foo.jks') + with self.assertNoLogs(level=logging.WARNING): + fdroidserver.common.read_config() + + def test_config_perm_keypass_warning(self): + fdroidserver.common.write_config_file('keypass: supersecret') + with self.assertLogs(level=logging.WARNING) as lw: + fdroidserver.common.read_config() + self.assertTrue('unsafe' in lw.output[0]) + + @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) + def test_config_perm_env_warning(self): + os.environ['keypass'] = 'supersecret' + fdroidserver.common.write_config_file('keypass: {env: keypass}') + with self.assertLogs(level=logging.WARNING) as lw: + fdroidserver.common.read_config() + self.assertTrue('unsafe' in lw.output[0]) + self.assertEqual(1, len(lw.output)) + + @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) + def test_config_perm_unset_env_no_warning(self): + fdroidserver.common.write_config_file('keypass: {env: keypass}') + with self.assertLogs(level=logging.WARNING) as lw: + fdroidserver.common.read_config() + self.assertTrue('unsafe' not in lw.output[0]) + self.assertEqual(1, len(lw.output)) From 9d147c6b6b4ca019329db656100b902c1f3c228b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 6 Mar 2025 13:03:19 +0100 Subject: [PATCH 1916/2116] test_common: remove self.tmpdir and use standard self.testdir pat --- tests/test_common.py | 147 ++++++++++++++++++++----------------------- 1 file changed, 69 insertions(+), 78 deletions(-) diff --git a/tests/test_common.py b/tests/test_common.py index 293d69ec..51d9a02a 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -4,7 +4,6 @@ import difflib import git import glob import importlib -import inspect import json import logging import os @@ -29,7 +28,7 @@ import fdroidserver import fdroidserver.signindex import fdroidserver.common import fdroidserver.metadata -from .shared_test_code import TmpCwd, mkdtemp +from .shared_test_code import TmpCwd, mkdtemp, mkdir_testfiles from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME from fdroidserver._yaml import yaml, yaml_dumper, config_dump from fdroidserver.exception import FDroidException, VCSException,\ @@ -53,9 +52,6 @@ class SetUpTearDownMixin: logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger('androguard.axml') logger.setLevel(logging.INFO) # tame the axml debug messages - self.tmpdir = os.path.abspath(os.path.join(basedir, '..', '.testfiles')) - if not os.path.exists(self.tmpdir): - os.makedirs(self.tmpdir) os.chdir(basedir) self.verbose = '-v' in sys.argv or '--verbose' in sys.argv @@ -66,16 +62,14 @@ class SetUpTearDownMixin: fdroidserver.common.options = None fdroidserver.metadata.srclibs = None - self._td = mkdtemp() - self.testdir = self._td.name + self.testdir = mkdir_testfiles(basedir, self) def tearDown(self): fdroidserver.common.config = None fdroidserver.common.options = None os.chdir(basedir) - self._td.cleanup() - if os.path.exists(self.tmpdir): - shutil.rmtree(self.tmpdir) + if os.path.exists(self.testdir): + shutil.rmtree(self.testdir) class CommonTest(SetUpTearDownMixin, unittest.TestCase): @@ -178,7 +172,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): print('no build-tools found: ' + build_tools) def test_find_java_root_path(self): - os.chdir(self.tmpdir) + os.chdir(self.testdir) all_pathlists = [ ( @@ -310,11 +304,11 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): shutil.copytree( os.path.join(basedir, 'source-files'), - os.path.join(self.tmpdir, 'source-files'), + os.path.join(self.testdir, 'source-files'), ) fdroidclient_testdir = os.path.join( - self.tmpdir, 'source-files', 'fdroid', 'fdroidclient' + self.testdir, 'source-files', 'fdroid', 'fdroidclient' ) config = dict() @@ -425,7 +419,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): def test_prepare_sources_refresh(self): _mock_common_module_options_instance() packageName = 'org.fdroid.ci.test.app' - os.chdir(self.tmpdir) + os.chdir(self.testdir) os.mkdir('build') os.mkdir('metadata') @@ -443,7 +437,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): with open(os.path.join('metadata', packageName + '.yml'), 'w') as fp: yaml_dumper.dump(metadata, fp) - gitrepo = os.path.join(self.tmpdir, 'build', packageName) + gitrepo = os.path.join(self.testdir, 'build', packageName) vcs0 = fdroidserver.common.getvcs('git', git_url, gitrepo) vcs0.gotorevision('0.3', refresh=True) vcs1 = fdroidserver.common.getvcs('git', git_url, gitrepo) @@ -512,18 +506,15 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): fdroidserver.signindex.config = config sourcedir = os.path.join(basedir, 'signindex') - with tempfile.TemporaryDirectory( - prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir - ) as testsdir: - for f in ('testy.jar', 'guardianproject.jar'): - sourcefile = os.path.join(sourcedir, f) - testfile = os.path.join(testsdir, f) - shutil.copy(sourcefile, testsdir) - fdroidserver.signindex.sign_jar(testfile, use_old_algs=True) - # these should be resigned, and therefore different - self.assertNotEqual( - open(sourcefile, 'rb').read(), open(testfile, 'rb').read() - ) + for f in ('testy.jar', 'guardianproject.jar'): + sourcefile = os.path.join(sourcedir, f) + testfile = os.path.join(self.testdir, f) + shutil.copy(sourcefile, self.testdir) + fdroidserver.signindex.sign_jar(testfile, use_old_algs=True) + # these should be resigned, and therefore different + self.assertNotEqual( + open(sourcefile, 'rb').read(), open(testfile, 'rb').read() + ) def test_verify_apk_signature(self): _mock_common_module_options_instance() @@ -622,7 +613,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): shutil.copy(sourceapk, copyapk) self.assertTrue(fdroidserver.common.verify_apk_signature(copyapk)) self.assertIsNone( - fdroidserver.common.verify_apks(sourceapk, copyapk, self.tmpdir) + fdroidserver.common.verify_apks(sourceapk, copyapk, self.testdir) ) unsignedapk = os.path.join(self.testdir, 'urzip-unsigned.apk') @@ -632,7 +623,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): if not info.filename.startswith('META-INF/'): testapk.writestr(info, apk.read(info.filename)) self.assertIsNone( - fdroidserver.common.verify_apks(sourceapk, unsignedapk, self.tmpdir) + fdroidserver.common.verify_apks(sourceapk, unsignedapk, self.testdir) ) twosigapk = os.path.join(self.testdir, 'urzip-twosig.apk') @@ -645,7 +636,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): testapk.writestr(info.filename, otherapk.read(info.filename)) otherapk.close() self.assertFalse(fdroidserver.common.verify_apk_signature(twosigapk)) - self.assertIsNone(fdroidserver.common.verify_apks(sourceapk, twosigapk, self.tmpdir)) + self.assertIsNone(fdroidserver.common.verify_apks(sourceapk, twosigapk, self.testdir)) def test_get_certificate_with_chain_sandisk(self): """Test that APK signatures with a cert chain are parsed like apksigner. @@ -825,14 +816,14 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): def test_find_apksigner_config_overrides(self): """apksigner should come from config before any auto-detection""" - os.chdir(self.tmpdir) - android_home = os.path.join(self.tmpdir, 'ANDROID_HOME') + os.chdir(self.testdir) + android_home = os.path.join(self.testdir, 'ANDROID_HOME') do_not_use = os.path.join(android_home, 'build-tools', '30.0.3', 'apksigner') os.makedirs(os.path.dirname(do_not_use)) with open(do_not_use, 'w') as fp: fp.write('#!/bin/sh\ndate\n') os.chmod(do_not_use, 0o0755) # nosec B103 - apksigner = os.path.join(self.tmpdir, 'apksigner') + apksigner = os.path.join(self.testdir, 'apksigner') config = {'apksigner': apksigner} with mock.patch.dict(os.environ, clear=True): os.environ['ANDROID_HOME'] = android_home @@ -842,13 +833,13 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): def test_find_apksigner_prefer_path(self): """apksigner should come from PATH before ANDROID_HOME""" - os.chdir(self.tmpdir) - apksigner = os.path.join(self.tmpdir, 'apksigner') + os.chdir(self.testdir) + apksigner = os.path.join(self.testdir, 'apksigner') with open(apksigner, 'w') as fp: fp.write('#!/bin/sh\ndate\n') os.chmod(apksigner, 0o0755) # nosec B103 - android_home = os.path.join(self.tmpdir, 'ANDROID_HOME') + android_home = os.path.join(self.testdir, 'ANDROID_HOME') do_not_use = os.path.join(android_home, 'build-tools', '30.0.3', 'apksigner') os.makedirs(os.path.dirname(do_not_use)) with open(do_not_use, 'w') as fp: @@ -864,8 +855,8 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): def test_find_apksigner_prefer_newest(self): """apksigner should be the newest available in ANDROID_HOME""" - os.chdir(self.tmpdir) - android_home = os.path.join(self.tmpdir, 'ANDROID_HOME') + os.chdir(self.testdir) + android_home = os.path.join(self.testdir, 'ANDROID_HOME') apksigner = os.path.join(android_home, 'build-tools', '30.0.3', 'apksigner') os.makedirs(os.path.dirname(apksigner)) @@ -887,7 +878,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): def test_find_apksigner_system_package_android_home(self): """Test that apksigner v30 or newer is found""" - os.chdir(self.tmpdir) + os.chdir(self.testdir) android_home = os.getenv('ANDROID_HOME') if not android_home or not os.path.isdir(android_home): self.skipTest('SKIPPING since ANDROID_HOME (%s) is not a dir!' % android_home) @@ -1049,7 +1040,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): fdroidserver.common.config = config fdroidserver.signindex.config = config - os.chdir(self.tmpdir) + os.chdir(self.testdir) os.mkdir('unsigned') os.mkdir('repo') @@ -1129,8 +1120,8 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): """get_apk_id should never return None on error, only raise exceptions""" with self.assertRaises(KeyError): fdroidserver.common.get_apk_id('Norway_bouvet_europe_2.obf.zip') - shutil.copy('Norway_bouvet_europe_2.obf.zip', self.tmpdir) - os.chdir(self.tmpdir) + shutil.copy('Norway_bouvet_europe_2.obf.zip', self.testdir) + os.chdir(self.testdir) with ZipFile('Norway_bouvet_europe_2.obf.zip', 'a') as zipfp: zipfp.writestr('AndroidManifest.xml', 'not a manifest') with self.assertRaises(KeyError): @@ -1147,7 +1138,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): ) def test_get_apk_id_bad_zip(self): - os.chdir(self.tmpdir) + os.chdir(self.testdir) badzip = 'badzip.apk' with open(badzip, 'w') as fp: fp.write('not a ZIP') @@ -1563,9 +1554,9 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): def test_remove_signing_keys(self): shutil.copytree( os.path.join(basedir, 'source-files'), - os.path.join(self.tmpdir, 'source-files'), + os.path.join(self.testdir, 'source-files'), ) - os.chdir(self.tmpdir) + os.chdir(self.testdir) with_signingConfigs = [ 'source-files/com.seafile.seadroid2/app/build.gradle', 'source-files/eu.siacs.conversations/build.gradle', @@ -1734,11 +1725,11 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): self.assertEqual(f.read(), mocklogcontent) def test_deploy_status_json(self): - os.chdir(self.tmpdir) + os.chdir(self.testdir) fakesubcommand = 'fakesubcommand' fake_timestamp = 1234567890 fakeserver = 'example.com:/var/www/fbot/' - expected_dir = os.path.join(self.tmpdir, fakeserver.replace(':', ''), 'repo', 'status') + expected_dir = os.path.join(self.testdir, fakeserver.replace(':', ''), 'repo', 'status') fdroidserver.common.options = mock.Mock() fdroidserver.common.config = {} @@ -1746,7 +1737,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): fdroidserver.common.config['identity_file'] = 'ssh/id_rsa' def assert_subprocess_call(cmd): - dest_path = os.path.join(self.tmpdir, cmd[-1].replace(':', '')) + dest_path = os.path.join(self.testdir, cmd[-1].replace(':', '')) if not os.path.exists(dest_path): os.makedirs(dest_path) return subprocess.run(cmd[:-1] + [dest_path]).returncode @@ -1902,14 +1893,14 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): def test_with_no_config(self): """It should set defaults if no config file is found""" - os.chdir(self.tmpdir) + os.chdir(self.testdir) self.assertFalse(os.path.exists(fdroidserver.common.CONFIG_FILE)) config = fdroidserver.common.read_config() self.assertIsNotNone(config.get('char_limits')) def test_with_zero_size_config(self): """It should set defaults if config file has nothing in it""" - os.chdir(self.tmpdir) + os.chdir(self.testdir) fdroidserver.common.write_config_file('') self.assertTrue(os.path.exists(fdroidserver.common.CONFIG_FILE)) config = fdroidserver.common.read_config() @@ -1917,7 +1908,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): def test_with_config_yml(self): """Make sure it is possible to use config.yml alone.""" - os.chdir(self.tmpdir) + os.chdir(self.testdir) fdroidserver.common.write_config_file('apksigner: yml') self.assertTrue(os.path.exists(fdroidserver.common.CONFIG_FILE)) config = fdroidserver.common.read_config() @@ -1925,7 +1916,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): def test_with_config_yml_utf8(self): """Make sure it is possible to use config.yml in UTF-8 encoding.""" - os.chdir(self.tmpdir) + os.chdir(self.testdir) teststr = '/πÇÇ现代通用字-български-عربي1/ö/yml' fdroidserver.common.write_config_file('apksigner: ' + teststr) self.assertTrue(os.path.exists(fdroidserver.common.CONFIG_FILE)) @@ -1934,7 +1925,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): def test_with_config_yml_utf8_as_ascii(self): """Make sure it is possible to use config.yml Unicode encoded as ASCII.""" - os.chdir(self.tmpdir) + os.chdir(self.testdir) teststr = '/πÇÇ现代通用字-български-عربي1/ö/yml' with open(fdroidserver.common.CONFIG_FILE, 'w', encoding='utf-8') as fp: config_dump({'apksigner': teststr}, fp) @@ -1944,7 +1935,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): def test_with_config_yml_with_env_var(self): """Make sure it is possible to use config.yml alone.""" - os.chdir(self.tmpdir) + os.chdir(self.testdir) with mock.patch.dict(os.environ): os.environ['SECRET'] = 'mysecretpassword' # nosec B105 fdroidserver.common.write_config_file("""keypass: {'env': 'SECRET'}\n""") @@ -1953,20 +1944,20 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): self.assertEqual(os.getenv('SECRET', 'fail'), config.get('keypass')) def test_with_config_yml_is_dict(self): - os.chdir(self.tmpdir) + os.chdir(self.testdir) Path(fdroidserver.common.CONFIG_FILE).write_text('apksigner = /bin/apksigner') with self.assertRaises(TypeError): fdroidserver.common.read_config() def test_with_config_yml_is_not_mixed_type(self): - os.chdir(self.tmpdir) + os.chdir(self.testdir) Path(fdroidserver.common.CONFIG_FILE).write_text('k: v\napksigner = /bin/apk') with self.assertRaises(ruamel.yaml.scanner.ScannerError): fdroidserver.common.read_config() def test_config_repo_url(self): """repo_url ends in /repo, archive_url ends in /archive.""" - os.chdir(self.tmpdir) + os.chdir(self.testdir) fdroidserver.common.write_config_file( textwrap.dedent( """\ @@ -1985,34 +1976,34 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): def test_config_repo_url_extra_slash(self): """repo_url ends in /repo, archive_url ends in /archive.""" - os.chdir(self.tmpdir) + os.chdir(self.testdir) fdroidserver.common.write_config_file('repo_url: https://MyFirstFDroidRepo.org/fdroid/repo/') with self.assertRaises(FDroidException): fdroidserver.common.read_config() def test_config_repo_url_not_repo(self): """repo_url ends in /repo, archive_url ends in /archive.""" - os.chdir(self.tmpdir) + os.chdir(self.testdir) fdroidserver.common.write_config_file('repo_url: https://MyFirstFDroidRepo.org/fdroid/foo') with self.assertRaises(FDroidException): fdroidserver.common.read_config() def test_config_archive_url_extra_slash(self): """repo_url ends in /repo, archive_url ends in /archive.""" - os.chdir(self.tmpdir) + os.chdir(self.testdir) fdroidserver.common.write_config_file('archive_url: https://MyFirstFDroidRepo.org/fdroid/archive/') with self.assertRaises(FDroidException): fdroidserver.common.read_config() def test_config_archive_url_not_repo(self): """repo_url ends in /repo, archive_url ends in /archive.""" - os.chdir(self.tmpdir) + os.chdir(self.testdir) fdroidserver.common.write_config_file('archive_url: https://MyFirstFDroidRepo.org/fdroid/foo') with self.assertRaises(FDroidException): fdroidserver.common.read_config() def test_write_to_config_yml(self): - os.chdir(self.tmpdir) + os.chdir(self.testdir) fdroidserver.common.write_config_file('apksigner: yml') os.chmod(fdroidserver.common.CONFIG_FILE, 0o0600) self.assertTrue(os.path.exists(fdroidserver.common.CONFIG_FILE)) @@ -2025,7 +2016,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): self.assertEqual('mysecretpassword', config['keypass']) def test_config_dict_with_int_keys(self): - os.chdir(self.tmpdir) + os.chdir(self.testdir) fdroidserver.common.write_config_file( textwrap.dedent( """ @@ -2138,7 +2129,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): ) def test_setup_status_output(self): - os.chdir(self.tmpdir) + os.chdir(self.testdir) start_timestamp = time.gmtime() subcommand = 'test' @@ -2154,9 +2145,9 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): self.assertEqual(subcommand, data['subcommand']) def test_setup_status_output_in_git_repo(self): - os.chdir(self.tmpdir) + os.chdir(self.testdir) logging.getLogger('git.cmd').setLevel(logging.INFO) - git_repo = git.Repo.init(self.tmpdir) + git_repo = git.Repo.init(self.testdir) file_in_git = 'README.md' with open(file_in_git, 'w') as fp: fp.write('this is just a test') @@ -2410,40 +2401,40 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): @unittest.skip("This test downloads and unzips a 1GB file.") def test_install_ndk(self): """NDK r10e is a special case since its missing source.properties""" - config = {'sdk_path': self.tmpdir} + config = {'sdk_path': self.testdir} fdroidserver.common.config = config fdroidserver.common._install_ndk('r10e') - r10e = os.path.join(self.tmpdir, 'ndk', 'r10e') + r10e = os.path.join(self.testdir, 'ndk', 'r10e') self.assertEqual('r10e', fdroidserver.common.get_ndk_version(r10e)) fdroidserver.common.fill_config_defaults(config) self.assertEqual({'r10e': r10e}, config['ndk_paths']) def test_fill_config_defaults(self): """Test the auto-detection of NDKs installed in standard paths""" - ndk_bundle = os.path.join(self.tmpdir, 'ndk-bundle') + ndk_bundle = os.path.join(self.testdir, 'ndk-bundle') os.makedirs(ndk_bundle) with open(os.path.join(ndk_bundle, 'source.properties'), 'w') as fp: fp.write('Pkg.Desc = Android NDK\nPkg.Revision = 17.2.4988734\n') - config = {'sdk_path': self.tmpdir} + config = {'sdk_path': self.testdir} fdroidserver.common.fill_config_defaults(config) self.assertEqual({'17.2.4988734': ndk_bundle}, config['ndk_paths']) - r21e = os.path.join(self.tmpdir, 'ndk', '21.4.7075529') + r21e = os.path.join(self.testdir, 'ndk', '21.4.7075529') os.makedirs(r21e) with open(os.path.join(r21e, 'source.properties'), 'w') as fp: fp.write('Pkg.Desc = Android NDK\nPkg.Revision = 21.4.7075529\n') - config = {'sdk_path': self.tmpdir} + config = {'sdk_path': self.testdir} fdroidserver.common.fill_config_defaults(config) self.assertEqual( {'17.2.4988734': ndk_bundle, '21.4.7075529': r21e}, config['ndk_paths'], ) - r10e = os.path.join(self.tmpdir, 'ndk', 'r10e') + r10e = os.path.join(self.testdir, 'ndk', 'r10e') os.makedirs(r10e) with open(os.path.join(r10e, 'RELEASE.TXT'), 'w') as fp: fp.write('r10e-rc4 (64-bit)\n') - config = {'sdk_path': self.tmpdir} + config = {'sdk_path': self.testdir} fdroidserver.common.fill_config_defaults(config) self.assertEqual( {'r10e': r10e, '17.2.4988734': ndk_bundle, '21.4.7075529': r21e}, @@ -2453,7 +2444,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): @unittest.skipIf(not os.path.isdir('/usr/lib/jvm/default-java'), 'uses Debian path') def test_fill_config_defaults_java(self): """Test the auto-detection of Java installed in standard paths""" - config = {'sdk_path': self.tmpdir} + config = {'sdk_path': self.testdir} fdroidserver.common.fill_config_defaults(config) java_paths = [] # use presence of javac to make sure its JDK not just JRE @@ -2640,7 +2631,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): self.assertFalse(is_repo_file(d), d + ' not repo file') def test_get_apksigner_smartcardoptions(self): - os.chdir(self.tmpdir) + os.chdir(self.testdir) with open(fdroidserver.common.CONFIG_FILE, 'w', encoding='utf-8') as fp: d = { 'smartcardoptions': '-storetype PKCS11' @@ -2668,7 +2659,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): ) def test_get_smartcardoptions_list(self): - os.chdir(self.tmpdir) + os.chdir(self.testdir) fdroidserver.common.write_config_file( textwrap.dedent( """ @@ -2702,7 +2693,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): ) def test_get_smartcardoptions_spaces(self): - os.chdir(self.tmpdir) + os.chdir(self.testdir) fdroidserver.common.write_config_file( textwrap.dedent( """ From d06e33697a999fce3a4f0099a2a3a69c07c8d31e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 Mar 2025 12:13:28 +0100 Subject: [PATCH 1917/2116] lint: missing valid config key: apk_signing_key_block_list --- fdroidserver/lint.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index ce541c4d..6a4299bd 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -236,6 +236,7 @@ bool_keys = ( check_config_keys = ( 'ant', + 'apk_signing_key_block_list', 'archive', 'archive_description', 'archive_icon', From 2f4e0f47a1b694651c3a538923761b0eb75ad57e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 Mar 2025 16:44:46 +0100 Subject: [PATCH 1918/2116] signatures: make `from . import net` optional This eliminates the need to have python3-requests installed on the signing server. This was missed in 031ae1103e23731ccd0cb2d82ab140917122b110 --- fdroidserver/signatures.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fdroidserver/signatures.py b/fdroidserver/signatures.py index ad83fc74..486e5d18 100644 --- a/fdroidserver/signatures.py +++ b/fdroidserver/signatures.py @@ -24,7 +24,6 @@ import logging from . import _ from . import common -from . import net from .exception import FDroidException @@ -68,6 +67,8 @@ def extract(options): elif httpre.match(apk): if apk.startswith('https') or options.no_check_https: try: + from . import net + tmp_apk = os.path.join(tmp_dir, 'signed.apk') net.download_file(apk, tmp_apk) sigdir = extract_signature(tmp_apk) From c5f442616ee68acda82e3591652f51cd66cf071c Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 Mar 2025 14:05:48 +0100 Subject: [PATCH 1919/2116] gitlab-ci: "PUBLISH" job to test in the signing server's setup --- .gitlab-ci.yml | 64 ++++++++++++++++++++++++++++++++++++++++++++++++ tests/config.yml | 2 ++ 2 files changed, 66 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6ebc12da..2e48c0bb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -710,3 +710,67 @@ docker: fi - docker push $RELEASE_IMAGE - docker push $RELEASE_IMAGE-bookworm + + +# PUBLISH is the signing server. It has a very minimal manual setup. +PUBLISH: + image: debian:bullseye-backports + script: + - apt-get update + - apt-get -qy upgrade + - apt-get -qy install --no-install-recommends -t bullseye-backports + androguard + apksigner + curl + default-jdk-headless + git + gpg + gpg-agent + python3-asn1crypto + python3-defusedxml + python3-git + python3-ruamel.yaml + python3-yaml + rsync + + # Run only relevant parts of the test suite, other parts will fail + # because of this minimal base setup. + - python3 -m unittest + tests/test_gpgsign.py + tests/test_metadata.py + tests/test_publish.py + tests/test_signindex.py + + - cd tests + - mkdir archive + - mkdir unsigned + - cp urzip-release-unsigned.apk unsigned/info.guardianproject.urzip_100.apk + - grep '^key.*pass' config.yml | sed 's,\x3a ,=,' > $CI_PROJECT_DIR/variables + - sed -Ei 's,^(key.*pass|keystore)\x3a.*,\1\x3a {env\x3a \1},' config.yml + - printf '\ngpghome\x3a {env\x3a gpghome}\n' >> config.yml + - | + tee --append $CI_PROJECT_DIR/variables < Date: Tue, 21 Mar 2023 21:54:42 +0100 Subject: [PATCH 1920/2116] purge test exceptions for Python < 3.9, that's the min version --- tests/test_scanner.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tests/test_scanner.py b/tests/test_scanner.py index 4899a219..8866dee4 100755 --- a/tests/test_scanner.py +++ b/tests/test_scanner.py @@ -447,9 +447,6 @@ class ScannerTest(unittest.TestCase): 'should return not results for ' + f, ) - @unittest.skipIf( - sys.hexversion < 0x03090000, 'Python < 3.9 has a limited zipfile.is_zipfile()' - ) def test_get_embedded_classes_secret_apk(self): """Try to hide an APK+DEX in an APK and see if we can find it""" config = dict() @@ -516,12 +513,6 @@ class Test_scan_binary(unittest.TestCase): ), ) - @unittest.skipIf( - sys.version_info < (3, 9), - "Our implementation for traversing zip files will silently fail to work" - "on older python versions, also see: " - "https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1110#note_932026766", - ) def test_bottom_level_embedded_apk_code_signature(self): apkfile = os.path.join(basedir, 'apk.embedded_1.apk') fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'] = { From 0b3fe265246af517e30930eb308702bfa789863f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 19 Mar 2025 11:15:26 +0100 Subject: [PATCH 1921/2116] skip tests that won't run on a given CPU architecture --- tests/test_build.py | 2 ++ tests/test_common.py | 16 ++++++++++++++++ tests/test_install.py | 1 + tests/test_integration.py | 2 ++ tests/test_publish.py | 2 ++ tests/test_scanner.py | 5 +++++ tests/test_signatures.py | 2 ++ tests/test_update.py | 2 ++ tests/test_verify.py | 2 ++ 9 files changed, 34 insertions(+) diff --git a/tests/test_build.py b/tests/test_build.py index 5290552e..e8e6927e 100755 --- a/tests/test_build.py +++ b/tests/test_build.py @@ -2,6 +2,7 @@ import os import shutil +import sys import tempfile import textwrap import unittest @@ -48,6 +49,7 @@ class BuildTest(unittest.TestCase): os.makedirs(os.path.join(d, 'platform-tools'), exist_ok=True) os.makedirs(os.path.join(d, 'tools'), exist_ok=True) + @unittest.skipIf(sys.byteorder == 'big', "androguard is not ported to big-endian") def test_get_apk_metadata(self): config = dict() fdroidserver.common.fill_config_defaults(config) diff --git a/tests/test_common.py b/tests/test_common.py index 51d9a02a..b9953c71 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -211,6 +211,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): fdroidserver.common._add_java_paths_to_config(pathlist, config) self.assertEqual(config['java_paths']['8'], choice[1:]) + @unittest.skipIf(sys.byteorder == 'big', 'androguard is not ported to big-endian') def test_is_debuggable_or_testOnly(self): config = dict() fdroidserver.common.fill_config_defaults(config) @@ -778,6 +779,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): for name in bad: self.assertIsNone(fdroidserver.common.STANDARD_FILE_NAME_REGEX.match(name)) + @unittest.skipIf(sys.byteorder == 'big', 'androguard is not ported to big-endian') def test_apk_signer_fingerprint(self): # fingerprints fetched with: keytool -printcert -file ____.RSA @@ -792,6 +794,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): self.assertEqual(keytoolcertfingerprint, fdroidserver.common.apk_signer_fingerprint(apkfile)) + @unittest.skipIf(sys.byteorder == 'big', 'androguard is not ported to big-endian') def test_apk_signer_fingerprint_short(self): # fingerprints fetched with: keytool -printcert -file ____.RSA @@ -905,6 +908,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): os.path.dirname(os.path.dirname(config.get('apksigner'))), ) + @unittest.skipIf(sys.byteorder == 'big', 'androguard is not ported to big-endian') def test_sign_apk(self): _mock_common_module_options_instance() config = fdroidserver.common.read_config() @@ -1032,6 +1036,8 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): config = fdroidserver.common.read_config() if 'apksigner' not in config: self.skipTest('SKIPPING test_resign_apk, apksigner not installed!') + if sys.byteorder == 'big': + self.skipTest('SKIPPING androguard is not ported to big-endian') config['keyalias'] = 'sova' config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' @@ -1064,6 +1070,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): fdroidserver.common.get_first_signer_certificate(resign) ) + @unittest.skipIf(sys.byteorder == 'big', 'androguard is not ported to big-endian') def test_get_apk_id(self): config = dict() fdroidserver.common.fill_config_defaults(config) @@ -1116,6 +1123,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): self.assertEqual(versionCode, vc, 'aapt versionCode parsing failed for ' + apkfilename) self.assertEqual(versionName, vn, 'aapt versionName parsing failed for ' + apkfilename) + @unittest.skipIf(sys.byteorder == 'big', 'androguard is not ported to big-endian') def test_get_apk_id_bad_apk(self): """get_apk_id should never return None on error, only raise exceptions""" with self.assertRaises(KeyError): @@ -1127,16 +1135,19 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): with self.assertRaises(KeyError): fdroidserver.common.get_apk_id('Norway_bouvet_europe_2.obf.zip') + @unittest.skipIf(sys.byteorder == 'big', 'androguard is not ported to big-endian') def test_get_apk_id_bad_path(self): with self.assertRaises(FDroidException): fdroidserver.common.get_apk_id('nope') + @unittest.skipIf(sys.byteorder == 'big', 'androguard is not ported to big-endian') def test_get_apk_id_api_call(self): self.assertEqual( ('info.guardianproject.urzip', 100, '0.1'), fdroidserver.common.get_apk_id('urzip.apk'), ) + @unittest.skipIf(sys.byteorder == 'big', 'androguard is not ported to big-endian') def test_get_apk_id_bad_zip(self): os.chdir(self.testdir) badzip = 'badzip.apk' @@ -1189,6 +1200,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): nc = fdroidserver.common.get_native_code(apkfilename) self.assertEqual(native_code, nc) + @unittest.skipIf(sys.byteorder == 'big', 'androguard is not ported to big-endian') def test_get_sdkversions_androguard(self): """This is a sanity test that androguard isn't broken""" @@ -3159,6 +3171,7 @@ class SignerExtractionTest(unittest.TestCase): def tearDown(self): self._td.cleanup() + @unittest.skipIf(sys.byteorder == 'big', 'androguard is not ported to big-endian') def test_get_first_signer_certificate_with_jars(self): for jar in ( 'signindex/guardianproject-v1.jar', @@ -3205,6 +3218,7 @@ class SignerExtractionTest(unittest.TestCase): apk + " should have matching signer fingerprints", ) + @unittest.skipIf(sys.byteorder == 'big', 'androguard is not ported to big-endian') def test_apk_signer_fingerprint_with_v1_apks(self): for apk, fingerprint in APKS_WITH_JAR_SIGNATURES: self.assertEqual( @@ -3213,6 +3227,7 @@ class SignerExtractionTest(unittest.TestCase): f'apk_signer_fingerprint should match stored fingerprint for {apk}', ) + @unittest.skipIf(sys.byteorder == 'big', 'androguard is not ported to big-endian') def test_apk_signer_fingerprint_without_v1_apks(self): for apk, fingerprint in APKS_WITHOUT_JAR_SIGNATURES: self.assertEqual( @@ -3221,6 +3236,7 @@ class SignerExtractionTest(unittest.TestCase): f'apk_signer_fingerprint should match stored fingerprint for {apk}', ) + @unittest.skipIf(sys.byteorder == 'big', 'androguard is not ported to big-endian') def test_get_first_signer_certificate_with_unsigned_jar(self): self.assertIsNone( fdroidserver.common.get_first_signer_certificate('signindex/unsigned.jar') diff --git a/tests/test_install.py b/tests/test_install.py index 1015b4be..b4e404d5 100755 --- a/tests/test_install.py +++ b/tests/test_install.py @@ -12,6 +12,7 @@ from fdroidserver import common, install from fdroidserver.exception import BuildException, FDroidException +@unittest.skipIf(os.uname().machine == 's390x', 'adb is not ported to s390x') class InstallTest(unittest.TestCase): '''fdroidserver/install.py''' diff --git a/tests/test_integration.py b/tests/test_integration.py index 1e07c231..c70b121a 100755 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -5,6 +5,7 @@ import re import shlex import shutil import subprocess +import sys import threading import unittest from datetime import datetime, timezone @@ -38,6 +39,7 @@ common.find_apksigner(conf) USE_APKSIGNER = "apksigner" in conf +@unittest.skipIf(sys.byteorder == 'big', 'androguard is not ported to big-endian') class IntegrationTest(unittest.TestCase): @classmethod def setUpClass(cls): diff --git a/tests/test_publish.py b/tests/test_publish.py index 82390547..e405cf5f 100755 --- a/tests/test_publish.py +++ b/tests/test_publish.py @@ -247,6 +247,7 @@ class PublishTest(unittest.TestCase): self.assertEqual(publish.config['jarsigner'], data['jarsigner']) self.assertEqual(publish.config['keytool'], data['keytool']) + @unittest.skipIf(sys.byteorder == 'big', 'androguard is not ported to big-endian') def test_sign_then_implant_signature(self): os.chdir(self.testdir) @@ -308,6 +309,7 @@ class PublishTest(unittest.TestCase): self.assertFalse(os.path.exists(unsigned)) self.assertTrue(os.path.exists(signed)) + @unittest.skipIf(sys.byteorder == 'big', 'androguard is not ported to big-endian') def test_exit_on_error(self): """Exits properly on errors, with and without --error-on-failed. diff --git a/tests/test_scanner.py b/tests/test_scanner.py index 8866dee4..e2d4b5a6 100755 --- a/tests/test_scanner.py +++ b/tests/test_scanner.py @@ -387,6 +387,7 @@ class ScannerTest(unittest.TestCase): self.assertFalse(os.path.exists("build.gradle")) self.assertEqual(0, count, 'there should be this many errors') + @unittest.skipIf(os.uname().machine == 's390x', 'dexdump is not ported to s390x') def test_get_embedded_classes(self): config = dict() fdroidserver.common.config = config @@ -447,6 +448,7 @@ class ScannerTest(unittest.TestCase): 'should return not results for ' + f, ) + @unittest.skipIf(os.uname().machine == 's390x', 'dexdump is not ported to s390x') def test_get_embedded_classes_secret_apk(self): """Try to hide an APK+DEX in an APK and see if we can find it""" config = dict() @@ -500,6 +502,7 @@ class Test_scan_binary(unittest.TestCase): } fdroidserver.scanner._SCANNER_TOOL.regexs['warn_code_signatures'] = {} + @unittest.skipIf(os.uname().machine == 's390x', 'dexdump is not ported to s390x') def test_code_signature_match(self): apkfile = os.path.join(basedir, 'no_targetsdk_minsdk1_unsigned.apk') self.assertEqual( @@ -513,6 +516,7 @@ class Test_scan_binary(unittest.TestCase): ), ) + @unittest.skipIf(os.uname().machine == 's390x', 'dexdump is not ported to s390x') def test_bottom_level_embedded_apk_code_signature(self): apkfile = os.path.join(basedir, 'apk.embedded_1.apk') fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'] = { @@ -533,6 +537,7 @@ class Test_scan_binary(unittest.TestCase): ), ) + @unittest.skipIf(os.uname().machine == 's390x', 'dexdump is not ported to s390x') def test_top_level_signature_embedded_apk_present(self): apkfile = os.path.join(basedir, 'apk.embedded_1.apk') fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'] = { diff --git a/tests/test_signatures.py b/tests/test_signatures.py index 34722e83..5a9393b2 100755 --- a/tests/test_signatures.py +++ b/tests/test_signatures.py @@ -2,6 +2,7 @@ import hashlib import os +import sys import unittest from tempfile import TemporaryDirectory @@ -19,6 +20,7 @@ class SignaturesTest(unittest.TestCase): config['verbose'] = True common.config = config + @unittest.skipIf(sys.byteorder == 'big', "androguard is not ported to big-endian") def test_main(self): class OptionsFixture: diff --git a/tests/test_update.py b/tests/test_update.py index 6c551694..323dcace 100755 --- a/tests/test_update.py +++ b/tests/test_update.py @@ -11,6 +11,7 @@ import random import shutil import string import subprocess +import sys import unittest import yaml import zipfile @@ -68,6 +69,7 @@ class Options: verbose = False +@unittest.skipIf(sys.byteorder == 'big', 'androguard is not ported to big-endian') class UpdateTest(unittest.TestCase): '''fdroid update''' diff --git a/tests/test_verify.py b/tests/test_verify.py index 30fde2ef..adb24b29 100755 --- a/tests/test_verify.py +++ b/tests/test_verify.py @@ -3,6 +3,7 @@ import json import os import shutil +import sys import tempfile import unittest @@ -91,6 +92,7 @@ class VerifyTest(unittest.TestCase): json.load(fp) self.assertEqual(placeholder, verify.get_verified_json(f)) + @unittest.skipIf(sys.byteorder == 'big', 'androguard is not ported to big-endian') @patch('fdroidserver.common.sha256sum') def test_write_json_report(self, sha256sum): sha256sum.return_value = ( From a95f4f11b02528e52bc2605cf909de3dff2f057d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 19 Mar 2025 17:03:06 +0100 Subject: [PATCH 1922/2116] pick-complete-translations.py: use new Weblate API --- locale/pick-complete-translations.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/pick-complete-translations.py b/locale/pick-complete-translations.py index 6712663e..4366807a 100755 --- a/locale/pick-complete-translations.py +++ b/locale/pick-complete-translations.py @@ -19,10 +19,10 @@ if os.path.exists(cached_file): with open(cached_file) as fp: data = json.load(fp) else: - url = 'https://hosted.weblate.org/exports/stats/f-droid/fdroidserver/?format=json' + url = 'https://hosted.weblate.org/api/components/f-droid/fdroidserver/statistics/?format=json' r = requests.get(url) r.raise_for_status() - data = r.json() + data = r.json()['results'] active = set() print('name locale translated approved error-free') From 2b8c957d12191f0f763c9a9213ca26c1b1ec02cf Mon Sep 17 00:00:00 2001 From: pitroig Date: Mon, 17 Mar 2025 22:44:47 +0100 Subject: [PATCH 1923/2116] Translated using Weblate: Catalan (ca) by pitroig Currently translated at 100.0% (613 of 613 strings) Co-authored-by: pitroig Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ca/ Translation: F-Droid/F-Droid Server --- locale/ca/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index 14ef426c..7be0c013 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -12,7 +12,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-01-21 17:02+0100\n" -"PO-Revision-Date: 2025-01-03 17:37+0000\n" +"PO-Revision-Date: 2025-01-30 12:31+0000\n" "Last-Translator: pitroig \n" "Language-Team: Catalan \n" "Language: ca\n" @@ -2160,7 +2160,7 @@ msgstr "opció ambigua: %s (%s?)" #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." -msgstr "" +msgstr "apksigner en build-tools;{version} passa APKs sense sigantures v3 vàlides, ingnorant." #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" From fcbbf3bea3f9d1a809829512227b71f2b038f4e8 Mon Sep 17 00:00:00 2001 From: Fjuro Date: Mon, 17 Mar 2025 22:44:45 +0100 Subject: [PATCH 1924/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 100.0% (613 of 613 strings) Co-authored-by: Fjuro Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ Translation: F-Droid/F-Droid Server --- locale/cs/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 7b88a54b..cd27dab3 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -8,20 +8,21 @@ # Daniel Hejduk , 2023. # Fjuro , 2024. # Jakub Boukal , 2024. +# Fjuro , 2025. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-01-21 17:02+0100\n" -"PO-Revision-Date: 2024-12-12 01:41+0000\n" -"Last-Translator: Fjuro \n" +"PO-Revision-Date: 2025-01-21 19:35+0000\n" +"Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" -"X-Generator: Weblate 5.9-dev\n" +"X-Generator: Weblate 5.10-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -2164,7 +2165,7 @@ msgstr "nejednoznačná možnost: %s (%s?)" #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." -msgstr "" +msgstr "apksigner v build-tools;{version} předává soubory APK s neplatnými v3 podpisy, ignoruji." #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" From d3eff85c51dd6598473b727a101cb55d7613791e Mon Sep 17 00:00:00 2001 From: VfBFan Date: Mon, 17 Mar 2025 22:44:46 +0100 Subject: [PATCH 1925/2116] Translated using Weblate: German (de) by VfBFan Currently translated at 100.0% (613 of 613 strings) Co-authored-by: VfBFan Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index c69f42f2..373ac0ad 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -15,7 +15,7 @@ # fossdd , 2021. # Ceeee , 2021. # C. Rüdinger , 2021, 2022. -# VfBFan , 2021, 2023, 2024. +# VfBFan , 2021, 2023, 2024, 2025. # Roman Leo , 2021. # Follpvosten , 2021. # ssantos , 2022, 2023, 2024. @@ -27,7 +27,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-01-21 17:02+0100\n" -"PO-Revision-Date: 2024-12-12 14:43+0000\n" +"PO-Revision-Date: 2025-01-23 09:05+0000\n" "Last-Translator: VfBFan \n" "Language-Team: German \n" "Language: de\n" @@ -35,7 +35,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.9-dev\n" +"X-Generator: Weblate 5.10-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -2175,7 +2175,7 @@ msgstr "Mehrdeutige Option: %s (%s?)" #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." -msgstr "" +msgstr "apksigner in build-tools;{version} übergibt APKs mit ungültigen v3-Signaturen und ignoriert sie." #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" From 99b8f764872f83cd1864ba7ae50382f6d0b8970a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20P=C3=A9rez?= Date: Mon, 17 Mar 2025 22:44:49 +0100 Subject: [PATCH 1926/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Spani?= =?UTF-8?q?sh=20(es)=20by=20Nicol=C3=A1s=20P=C3=A9rez=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (613 of 613 strings) Co-authored-by: Nicolás Pérez Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ Translation: F-Droid/F-Droid Server --- locale/es/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 85aeeba3..599fb84f 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -13,20 +13,21 @@ # Iago , 2022. # Jaime Marquínez Ferrándiz , 2022. # gallegonovato , 2022, 2023, 2024. +# Nicolás Pérez , 2025. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-01-21 17:02+0100\n" -"PO-Revision-Date: 2024-12-20 13:00+0000\n" -"Last-Translator: gallegonovato \n" +"PO-Revision-Date: 2025-03-16 22:47+0000\n" +"Last-Translator: Nicolás Pérez \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.9.2-dev\n" +"X-Generator: Weblate 5.11-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -2166,7 +2167,7 @@ msgstr "opción ambigua: %s (%s?)" #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." -msgstr "" +msgstr "apksigner en build-tools;{version} pasa APK con firmas v3 no válidas, ignorándolos." #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" From dedc92b467c88f9a852196551e31985a11165b3e Mon Sep 17 00:00:00 2001 From: Lula Bye Date: Mon, 17 Mar 2025 22:44:49 +0100 Subject: [PATCH 1927/2116] Translated using Weblate: French (fr) by Lula Bye Currently translated at 97.3% (597 of 613 strings) Co-authored-by: Lula Bye Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 3b3bb16c..289b37d2 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -41,20 +41,21 @@ # Sylvain Pichon , 2024. # Lzebulon , 2024. # Armand Camponovo , 2024. +# Lula Bye , 2025. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-01-21 17:02+0100\n" -"PO-Revision-Date: 2024-12-31 00:24+0000\n" -"Last-Translator: Armand Camponovo \n" +"PO-Revision-Date: 2025-03-02 16:42+0000\n" +"Last-Translator: Lula Bye \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.10-dev\n" +"X-Generator: Weblate 5.10.3-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -973,9 +974,8 @@ msgid "Git reset failed" msgstr "Reset de Git échouée" #: ../fdroidserver/common.py -#, fuzzy msgid "Git submodule deinit failed" -msgstr "Échec de la suppression du sous-module Git" +msgstr "Échec du sous-module Git deinit" #: ../fdroidserver/common.py msgid "Git submodule sync failed" @@ -1375,9 +1375,8 @@ msgid "One of the 'github_releases' config items is missing the 'projectUrl' val msgstr "L'un des éléments de configuration 'github_releases' ne contient pas la valeur 'projectUrl'. ignoré..." #: ../fdroidserver/deploy.py -#, fuzzy msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." -msgstr "L'un des éléments de configuration 'github_releases' ne contient pas la valeur 'token'. ignoré..." +msgstr "L'un des éléments de configuration 'github_releases' ne contient pas la valeur 'token'. suivant ..." #: ../fdroidserver/update.py #, python-brace-format @@ -1550,7 +1549,7 @@ msgstr "Actualisation et mise en cache des règles et signature à partir du ré #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." -msgstr "" +msgstr "Supprimer l'archive d'origine et les APKs si la vérification est effectuée avec succès." #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1999,9 +1998,8 @@ msgstr "UpdateCheckMode est configuré mais on dirait que checkupdates n'a pas e #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -#, fuzzy msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode est configuré mais on dirait que checkupdates n'a pas encore été lancé" +msgstr "UpdateCheckMode est configuré mais il semble que checkupdates n'a pas encore été lancé" #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -2147,7 +2145,7 @@ msgstr "Lors du linting, tout le dépôt yamllint est désactivé par défaut. C #: ../fdroidserver/publish.py msgid "When signing or verifying fails, exit with an error code." -msgstr "" +msgstr "En cas d'échec de la signature ou de la vérification, fermer en indiquant un code d'erreur." #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" From bb5d7a0e918a4d9c92a729d7a83726ea5ea3c788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Mon, 17 Mar 2025 22:44:46 +0100 Subject: [PATCH 1928/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Irish?= =?UTF-8?q?=20(ga)=20by=20Aindri=C3=BA=20Mac=20Giolla=20Eoin=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (613 of 613 strings) Co-authored-by: Aindriú Mac Giolla Eoin Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ga/ Translation: F-Droid/F-Droid Server --- locale/ga/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/ga/LC_MESSAGES/fdroidserver.po b/locale/ga/LC_MESSAGES/fdroidserver.po index d51fbe97..10d44f03 100644 --- a/locale/ga/LC_MESSAGES/fdroidserver.po +++ b/locale/ga/LC_MESSAGES/fdroidserver.po @@ -1,12 +1,12 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# Aindriú Mac Giolla Eoin , 2024. +# Aindriú Mac Giolla Eoin , 2024, 2025. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1-162-gfbb3cc59\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-01-21 17:02+0100\n" -"PO-Revision-Date: 2024-12-14 19:00+0000\n" +"PO-Revision-Date: 2025-01-23 09:05+0000\n" "Last-Translator: Aindriú Mac Giolla Eoin \n" "Language-Team: Irish \n" "Language: ga\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :(n>6 && n<11) ? 3 : 4;\n" -"X-Generator: Weblate 5.9-rc\n" +"X-Generator: Weblate 5.10-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -2163,7 +2163,7 @@ msgstr "Rogha dhébhríoch: %s (%s?)" #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." -msgstr "" +msgstr "apksigner in uirlisí tógála; Gabhann {version} APKanna le sínithe v3 neamhbhailí, gan aird a thabhairt." #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" From c0da9df12feebd2f42668cc0fce68a3e7847b0bc Mon Sep 17 00:00:00 2001 From: Liner Seven Date: Mon, 17 Mar 2025 22:44:48 +0100 Subject: [PATCH 1929/2116] Translated using Weblate: Japanese (ja) by Liner Seven Currently translated at 100.0% (613 of 613 strings) Co-authored-by: Liner Seven Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ja/ Translation: F-Droid/F-Droid Server --- locale/ja/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 48a92270..eab4d318 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -3,13 +3,13 @@ # Hinaloe , 2020. # Suguru Hirahara , 2024. # "Shuuji TAKAHASHI (shuuji3)" , 2024. -# Liner Seven , 2024. +# Liner Seven , 2024, 2025. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-01-21 17:02+0100\n" -"PO-Revision-Date: 2024-12-12 01:41+0000\n" +"PO-Revision-Date: 2025-02-08 06:22+0000\n" "Last-Translator: Liner Seven \n" "Language-Team: Japanese \n" "Language: ja\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.9-dev\n" +"X-Generator: Weblate 5.10-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -2154,7 +2154,7 @@ msgstr "オプションが曖昧です:%s(%s?)" #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." -msgstr "" +msgstr "ビルドツール群のapkサイナー;{version}は、無効なv3署名がなされたAPKを無視します。" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" From 2a367267986397b0eb1e7614cf619402b7c88491 Mon Sep 17 00:00:00 2001 From: WaldiS Date: Mon, 17 Mar 2025 22:44:49 +0100 Subject: [PATCH 1930/2116] Translated using Weblate: Polish (pl) by WaldiS Currently translated at 100.0% (613 of 613 strings) Translated using Weblate: Polish (pl) by WaldiS Currently translated at 99.8% (612 of 613 strings) Co-authored-by: WaldiS Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ Translation: F-Droid/F-Droid Server --- locale/pl/LC_MESSAGES/fdroidserver.po | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index bdcaa4cc..925932bd 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -1,6 +1,6 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# WaldiS , 2020, 2021, 2024. +# WaldiS , 2020, 2021, 2024, 2025. # Michal L , 2020, 2021. # mondstern , 2021. # Hans-Christoph Steiner , 2021, 2024. @@ -11,7 +11,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-01-21 17:02+0100\n" -"PO-Revision-Date: 2024-11-30 20:00+0000\n" +"PO-Revision-Date: 2025-03-13 20:43+0000\n" "Last-Translator: WaldiS \n" "Language-Team: Polish \n" "Language: pl\n" @@ -19,7 +19,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.9-dev\n" +"X-Generator: Weblate 5.11-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -338,11 +338,11 @@ msgstr "AutoUpdateMode z UpdateCheckMode: HTTP musi mieć wzorzec." #: ../fdroidserver/install.py msgid "Automatic no to all prompts." -msgstr "" +msgstr "Automatyczna odmowa na wszystkie monity." #: ../fdroidserver/install.py msgid "Automatic yes to all prompts." -msgstr "" +msgstr "Automatyczna odpowiedź twierdząca na wszystkie monity." #: ../fdroidserver/index.py #, python-brace-format @@ -940,7 +940,6 @@ msgid "Git reset failed" msgstr "Resetowanie Git nie powiodło się" #: ../fdroidserver/common.py -#, fuzzy msgid "Git submodule deinit failed" msgstr "Deinit podmodułu Git nie powiódł się" @@ -1516,7 +1515,7 @@ msgstr "Odświeżanie i buforowanie reguł skanera i sygnatur z sieci" #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." -msgstr "" +msgstr "Usuń źródłowy plik tarball i wszystkie pliki APK, jeśli pomyślnie zweryfikowano." #: ../fdroidserver/common.py msgid "Removing specified files" @@ -2134,7 +2133,7 @@ msgstr "Plik archiwum ZIP" #: ../fdroidserver/install.py #, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "" +msgstr "adb zgłasza, że {serial} to \"{status}\"!" #: ../fdroidserver/nightly.py #, python-brace-format @@ -2163,7 +2162,7 @@ msgstr "niejednoznaczna opcja: %s (%s?)" #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." -msgstr "" +msgstr "apksigner w build-tools;{version} przekazuje pliki APK z nieprawidłowymi podpisami v3, ignorując je." #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" From 0907755efec3a5320e25295e27b2f57a98ba0473 Mon Sep 17 00:00:00 2001 From: ssantos Date: Mon, 17 Mar 2025 22:44:46 +0100 Subject: [PATCH 1931/2116] Translated using Weblate: Portuguese (pt) by ssantos Currently translated at 100.0% (613 of 613 strings) Translated using Weblate: Portuguese (Portugal) (pt_PT) by ssantos Currently translated at 100.0% (613 of 613 strings) Translated using Weblate: Portuguese (pt) by ssantos Currently translated at 99.8% (612 of 613 strings) Co-authored-by: ssantos Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_PT/ Translation: F-Droid/F-Droid Server --- locale/pt/LC_MESSAGES/fdroidserver.po | 12 ++++++------ locale/pt_PT/LC_MESSAGES/fdroidserver.po | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 858f8bb7..2435c392 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -1,6 +1,6 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# ssantos , 2020, 2021, 2022, 2023, 2024. +# ssantos , 2020, 2021, 2022, 2023, 2024, 2025. # Peter J. Mello , 2021. # Eduardo Rodrigues , 2021. # SC , 2022. @@ -10,15 +10,15 @@ msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-01-21 17:02+0100\n" -"PO-Revision-Date: 2024-11-26 15:16+0000\n" -"Last-Translator: Hugo Carvalho \n" +"PO-Revision-Date: 2025-03-02 21:32+0000\n" +"Last-Translator: ssantos \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.9-dev\n" +"X-Generator: Weblate 5.10.3-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -1512,7 +1512,7 @@ msgstr "Atualizar e armazenar as regras e assinaturas do scanner da rede no cach #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." -msgstr "" +msgstr "Remover tarball de código-fonte e todos APKs se for verificado com sucesso." #: ../fdroidserver/common.py msgid "Removing specified files" @@ -2158,7 +2158,7 @@ msgstr "opção ambígua: %s (%s?)" #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." -msgstr "" +msgstr "apksigner nos build-tools;{version} passa APKs com assinaturas v3 inválidas, ignorando." #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 2448d63e..3f82545d 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -12,7 +12,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-01-21 17:02+0100\n" -"PO-Revision-Date: 2025-01-03 06:49+0000\n" +"PO-Revision-Date: 2025-03-02 21:32+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" "Language: pt_PT\n" @@ -20,7 +20,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.10-dev\n" +"X-Generator: Weblate 5.10.3-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -2160,7 +2160,7 @@ msgstr "opção ambígua: %s (%s?)" #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." -msgstr "" +msgstr "apksigner nos build-tools;{version} passa APKs com assinaturas v3 inválidas, ignorando." #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" From 26860dbf2f8f8b8756ed4940334bb6d968e4e090 Mon Sep 17 00:00:00 2001 From: LucasMZ Date: Mon, 17 Mar 2025 22:44:47 +0100 Subject: [PATCH 1932/2116] Translated using Weblate: Portuguese (Brazil) (pt_BR) by LucasMZ Currently translated at 100.0% (613 of 613 strings) Co-authored-by: LucasMZ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/ Translation: F-Droid/F-Droid Server --- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 56d35305..3021cf2c 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -12,14 +12,14 @@ # lucasmz-dev , 2024. # Jose Delvani , 2024. # Jose Delvani , 2024. -# LucasMZ , 2024. +# LucasMZ , 2024, 2025. # dedakir923 , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-01-21 17:02+0100\n" -"PO-Revision-Date: 2024-12-24 01:00+0000\n" +"PO-Revision-Date: 2025-01-23 16:02+0000\n" "Last-Translator: LucasMZ \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" @@ -2167,7 +2167,7 @@ msgstr "opção ambígua: %s (%s?)" #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." -msgstr "" +msgstr "apksigner no builds-tools;{version} passa APKs com assinaturas v3 inválidas, ignorando." #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" From c5d5ab3a79bdad1e53f50cdd6179632a66f43fc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=93=D0=BE=D1=80?= =?UTF-8?q?=D0=BF=D0=B8=D0=BD=D1=96=D1=87?= Date: Mon, 17 Mar 2025 22:44:45 +0100 Subject: [PATCH 1933/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Ukrai?= =?UTF-8?q?nian=20(uk)=20by=20=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20?= =?UTF-8?q?=D0=93=D0=BE=D1=80=D0=BF=D0=B8=D0=BD=D1=96=D1=87=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (613 of 613 strings) Co-authored-by: Максим Горпиніч Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 8e36a288..a975da26 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -12,20 +12,21 @@ # Fqwe1 , 2024. # Nazar , 2024. # Максим Горпиніч , 2024. +# Максим Горпиніч , 2025. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-01-21 17:02+0100\n" -"PO-Revision-Date: 2024-12-20 13:00+0000\n" -"Last-Translator: Максим Горпиніч \n" +"PO-Revision-Date: 2025-01-21 18:50+0000\n" +"Last-Translator: Максим Горпиніч \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.9.2-dev\n" +"X-Generator: Weblate 5.10-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -2168,7 +2169,7 @@ msgstr "неоднозначний параметр: %s (%s?)" #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." -msgstr "" +msgstr "apksigner в інструментах побудови; {version} передає APK із недійсними підписами v3, ігноруючи." #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" From 9429f0917bb5a53de83c9297a98a3e1fd65f11d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Mon, 17 Mar 2025 22:44:46 +0100 Subject: [PATCH 1934/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Chine?= =?UTF-8?q?se=20(Simplified=20Han=20script)=20(zh=5FHans)=20by=20=E5=A4=A7?= =?UTF-8?q?=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1=E5=B1=B1=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (613 of 613 strings) Co-authored-by: 大王叫我来巡山 Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 1c9f9273..4b154577 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -30,7 +30,7 @@ # zhiqi , 2023. # David Jiang , 2023. # ALoLo_527 , 2024. -# 大王叫我来巡山 , 2024. +# 大王叫我来巡山 , 2024, 2025. # chumoer , 2024. # Wang , 2024. # Lily Chou , 2024. @@ -40,7 +40,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-01-21 17:02+0100\n" -"PO-Revision-Date: 2024-12-12 14:43+0000\n" +"PO-Revision-Date: 2025-01-23 09:05+0000\n" "Last-Translator: 大王叫我来巡山 \n" "Language-Team: Chinese (Simplified Han script) \n" "Language: zh_Hans\n" @@ -48,7 +48,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.9-dev\n" +"X-Generator: Weblate 5.10-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -2185,7 +2185,7 @@ msgstr "模糊的选项:%s(%s?)" #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." -msgstr "" +msgstr "{version} 版本 build-tools 中的 apksigner 不处理带无效 v3 签名的 APK 文件,忽略中。" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" From ca082daaea0ea37116e0a40ec794ce91f86188b4 Mon Sep 17 00:00:00 2001 From: Golubev Alexander Date: Mon, 17 Mar 2025 22:44:47 +0100 Subject: [PATCH 1935/2116] Translated using Weblate: Russian (ru) by Golubev Alexander Currently translated at 100.0% (613 of 613 strings) Co-authored-by: Golubev Alexander Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translation: F-Droid/F-Droid Server --- locale/ru/LC_MESSAGES/fdroidserver.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 672a506b..d8085d89 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -1,6 +1,6 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# Golubev Alexander , 2020, 2021, 2024. +# Golubev Alexander , 2020, 2021, 2024, 2025. # Mingun , 2020. # anonymous , 2020. # Andrey , 2020, 2021, 2022, 2023, 2025. @@ -21,8 +21,8 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-01-21 17:02+0100\n" -"PO-Revision-Date: 2025-01-08 16:30+0000\n" -"Last-Translator: Andrey \n" +"PO-Revision-Date: 2025-01-25 15:42+0000\n" +"Last-Translator: Golubev Alexander \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" @@ -987,11 +987,11 @@ msgstr "Проигнорировано: запись в FUNDING.yml длинне #: ../fdroidserver/update.py #, python-format msgid "Ignoring bad element in manifest: %s" -msgstr "Игнорирование плохого элемента в манифесте: %s" +msgstr "Проигнорировано: плохой элемент в манифесте: %s" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " -msgstr "Проигнорировано, пакеты без метаданных: " +msgstr "Проигнорировано: пакеты без метаданных: " #: ../fdroidserver/update.py #, python-brace-format @@ -2172,7 +2172,7 @@ msgstr "неоднозначный выбор: %s (%s?)" #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." -msgstr "" +msgstr "apksigner из build-tools;{version} пропускает APK-пакеты с некорректными подписями v3; проигнорировано." #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" From e23b196a0fbdde0437543b3331f71589e5eda220 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 19 Mar 2025 17:18:17 +0100 Subject: [PATCH 1936/2116] run tests/refresh-SUSS_DEFAULT.py --- fdroidserver/scanner.py | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index a3af0260..549d43e3 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -2224,6 +2224,7 @@ SUSS_DEFAULT = r'''{ "androidx.credentials:credentials-play-services-auth", "androidx.media3:media3-cast", "androidx.media3:media3-datasource-cronet", + "androidx.wear:wear-remote-interactions", "androidx.work:work-gcm", "com.google.android.exoplayer:extension-cast", "com.google.android.exoplayer:extension-cronet", @@ -2231,7 +2232,7 @@ SUSS_DEFAULT = r'''{ "com.cloudinary:cloudinary-android.*:2\\.[12]\\.", "com.pierfrancescosoffritti.androidyoutubeplayer:chromecast-sender", "com.yayandroid:locationmanager", - "play-services", + "(?Crunchbase and Exodus Privacy.", "license": "NonFree" }, + "com.revenuecat.purchases": { + "code_signatures": [ + "com/revenuecat/purchases" + ], + "documentation": [ + "https://www.revenuecat.com/" + ], + "gradle_signatures": [ + "com.revenuecat.purchases" + ], + "license": "NonFree", + "name": "RevenueCat Purchases" + }, "com.samsung.accessory": { "anti_features": [ "NonFreeComp" @@ -2730,6 +2748,9 @@ SUSS_DEFAULT = r'''{ "com.wei.android.lib:fingerprintidentify", "com.github.uccmawei:FingerprintIdentify" ], + "gradle_signatures_positive_examples": [ + "implementation \"com.github.uccmawei:fingerprintidentify:${safeExtGet(\"fingerprintidentify\", \"1.2.6\")}\"" + ], "license": "NonFree", "name": "FingerprintIdentify" }, @@ -2945,7 +2966,7 @@ SUSS_DEFAULT = r'''{ "license": "NonFree" } }, - "timestamp": 1728920062.92063, + "timestamp": 1733823271.362948, "version": 1, - "last_updated": 1732198944.559238 + "last_updated": 1742401014.503398 }''' From a01e91da6c2f3bb8d8811f754170510a39c1bf45 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 19 Mar 2025 16:55:03 +0100 Subject: [PATCH 1937/2116] update CHANGELOG.md --- CHANGELOG.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 45d1e555..808b8f61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,10 +8,30 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ### Added +* lint: support the base _config.yml_. + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1606 + ### Fixed +* Expand {env: foo} config syntax to be allowed any place a string is. + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1610 +* Only show "unsafe permissions on config.yml" when secrets are present. +* Standardized config files on ruamel.yaml with a YAML 1.2 data format. + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1611 +* Brought back error when a package has multiple package types (e.g. xapk and + apk). https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1602 +* Reworked test suite to be entirely based on Python unittest (thanks @mindston). + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1587 +* publish/signindex/gpgsign no longer load the _qrcode_ and _requests_ modules, + and can operate without them installed. + ### Removed +* checkupdates: remove auto_author: config, it is no longer used. +* Purge support for the long-deprecated _config.py_ config file. + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1607 + + ## [2.3.5] - 2025-01-20 ### Fixed From edd88cc70151a022782173d1c7686f6e84541516 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 19 Mar 2025 17:20:45 +0100 Subject: [PATCH 1938/2116] version 2.4 alpha 1 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index affa67ad..8485c8a0 100755 --- a/setup.py +++ b/setup.py @@ -70,7 +70,7 @@ with open("README.md", "r") as fh: setup( name='fdroidserver', - version='2.3.5', + version='2.4a1', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From 7f207496bbb9a18bdacd20426a83c2980a666eda Mon Sep 17 00:00:00 2001 From: Edgars Andersons Date: Mon, 17 Mar 2025 22:44:40 +0100 Subject: [PATCH 1939/2116] Translated using Weblate: Latvian (lv) by Edgars Andersons Currently translated at 7.0% (43 of 612 strings) Translated using Weblate: Latvian (lv) by Edgars Andersons Currently translated at 6.8% (42 of 611 strings) Co-authored-by: Edgars Andersons Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/lv/ Translation: F-Droid/F-Droid Server --- locale/lv/LC_MESSAGES/fdroidserver.po | 255 ++++++++++++++++++-------- 1 file changed, 174 insertions(+), 81 deletions(-) diff --git a/locale/lv/LC_MESSAGES/fdroidserver.po b/locale/lv/LC_MESSAGES/fdroidserver.po index 333b9865..9aafeada 100644 --- a/locale/lv/LC_MESSAGES/fdroidserver.po +++ b/locale/lv/LC_MESSAGES/fdroidserver.po @@ -1,20 +1,23 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # "Coool (github.com/Coool)" , 2024. +# Edgars Andersons , 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-11-21 21:34+0100\n" -"PO-Revision-Date: 2024-08-14 18:07+0000\n" -"Last-Translator: \"Coool (github.com/Coool)\" \n" -"Language-Team: Latvian \n" +"PO-Revision-Date: 2024-11-22 21:03+0000\n" +"Last-Translator: Edgars Andersons \n" +"Language-Team: Latvian \n" "Language: lv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= 19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" -"X-Generator: Weblate 5.7-dev\n" +"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= " +"19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" +"X-Generator: Weblate 5.9-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -104,7 +107,7 @@ msgstr "" #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "%prog [options]" -msgstr "%prog [opcijas]" +msgstr "%prog [iespējas]" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -172,7 +175,9 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgid "" +"'{field}' will be in random order! Use () or [] brackets if order is " +"important!" msgstr "" #: ../fdroidserver/common.py @@ -197,7 +202,7 @@ msgstr "" #: ../fdroidserver/checkupdates.py msgid "--merge-request only runs on a single appid!" -msgstr "" +msgstr "--merge-request darbojas tikai ar vienu appid." #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -249,7 +254,9 @@ msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "" #: ../fdroidserver/import_subcommand.py -msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgid "" +"Allows a different revision (or git branch) to be specified for the initial " +"import" msgstr "" #: ../fdroidserver/mirror.py @@ -293,15 +300,21 @@ msgid "Android SDK tool {cmd} not found!" msgstr "" #: ../fdroidserver/lint.py -msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgid "" +"App has Binaries but does not have corresponding AllowedAPKSigningKeys to " +"pin certificate." msgstr "" #: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" +msgid "" +"App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or " +"UpdateCheckMode are not None" msgstr "" #: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgid "" +"App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but " +"AutoUpdateMode or UpdateCheckMode are not None" msgstr "" #: ../fdroidserver/lint.py @@ -310,7 +323,9 @@ msgid "App is in '{repo}' but has a link to {url}" msgstr "" #: ../fdroidserver/lint.py -msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgid "" +"App version has binary but does not have corresponding AllowedAPKSigningKeys " +"to pin certificate." msgstr "" #: ../fdroidserver/lint.py @@ -328,11 +343,11 @@ msgstr "" #: ../fdroidserver/install.py msgid "Automatic no to all prompts." -msgstr "" +msgstr "Visām uzvednēm automātiski atbildēt ar \"Nē\"." #: ../fdroidserver/install.py msgid "Automatic yes to all prompts." -msgstr "" +msgstr "Visām uzvednēm automātiski atbildēt ar \"Jā\"." #: ../fdroidserver/index.py #, python-brace-format @@ -340,7 +355,9 @@ msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "" #: ../fdroidserver/mirror.py -msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgid "" +"Base URL to mirror, can include the index signing key using the query " +"string: ?fingerprint=" msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname @@ -419,7 +436,9 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgid "" +"Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, " +"archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -428,11 +447,11 @@ msgstr "" #: ../fdroidserver/common.py msgid "Color the log output" -msgstr "" +msgstr "Iekrāsot žurnāla izvadi" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." -msgstr "" +msgstr "Ar komatu atdalītu kategoriju saraksts." #: ../fdroidserver/__main__.py #, python-format @@ -441,11 +460,11 @@ msgstr "" #: ../fdroidserver/checkupdates.py msgid "Commit changes" -msgstr "" +msgstr "Iesūtīt izmaiņas" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "" +msgstr "Jāiesūta izmaiņas, jāaizgādā tās, tad jāizveido izmaiņu pieprasījums" #: ../fdroidserver/metadata.py #, python-brace-format @@ -453,7 +472,9 @@ msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr "" #: ../fdroidserver/__main__.py -msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgid "" +"Conflicting arguments: '--verbose' and '--quiet' can not be specified at the " +"same time." msgstr "" #: ../fdroidserver/common.py @@ -623,7 +644,9 @@ msgid "Don't create a source tarball, useful when testing a build" msgstr "" #: ../fdroidserver/build.py -msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgid "" +"Don't refresh the repository, useful when testing a build with no internet " +"connection" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py @@ -632,25 +655,26 @@ msgstr "" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "" +msgstr "Lejupielādēt F-Droid.apk no spoguļserveriem, kas tīklā nopludina mazāk" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" -msgstr "" +msgstr "Lejupielādēt pilnīgu mazu glabātavu spoguļojumu" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "Lejupielādē %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" +"Glabātavas lejupielāde jau vienreiz neizdevās, tas atkārtoti netiks mēģināts." #: ../fdroidserver/verify.py #, python-brace-format msgid "Downloading {url} failed. {error}" -msgstr "" +msgstr "{url} lejupielāde neizdevās. {error}" #: ../fdroidserver/metadata.py #, python-brace-format @@ -703,7 +727,9 @@ msgstr "" #: ../fdroidserver/__main__.py #, python-brace-format -msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgid "" +"Encoding is set to '{enc}' fdroid might run into encoding issues. Please set " +"it to 'UTF-8' for best results." msgstr "" #: ../fdroidserver/init.py @@ -719,7 +745,9 @@ msgid "Environment variable {var} from {configname} is not set!" msgstr "" #: ../fdroidserver/deploy.py -msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgid "" +"Error deploying 'github_releases', {} not present. (You might need to run " +"`fdroid update` first.)" msgstr "" #: ../fdroidserver/import_subcommand.py @@ -740,7 +768,7 @@ msgstr "" #: ../fdroidserver/install.py msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "" +msgstr "F-Droid.apk nevarēja lejupielādēt ne no viena zināmā avota." #: ../fdroidserver/update.py #, python-brace-format @@ -820,7 +848,9 @@ msgid "Forbidden HTML tags" msgstr "" #: ../fdroidserver/build.py -msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgid "" +"Force build of disabled apps, and carries on regardless of scan problems. " +"Only allowed in test mode." msgstr "" #: ../fdroidserver/build.py @@ -1117,7 +1147,8 @@ msgid "Java compiled class" msgstr "" #: ../fdroidserver/signindex.py -msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgid "" +"Java jarsigner not found! Install in standard location or set java_paths!" msgstr "" #: ../fdroidserver/lint.py @@ -1139,7 +1170,8 @@ msgstr "" #: ../fdroidserver/lint.py #, python-brace-format -msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgid "" +"Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "" #: ../fdroidserver/lint.py @@ -1203,52 +1235,57 @@ msgstr "" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." msgstr "" +"Netika atrasta neviena ierīce, kurā izpildīt `adb install`. Lūgums " +"piespraust kādu." #: ../fdroidserver/index.py msgid "No fingerprint in URL." -msgstr "" +msgstr "URL nesatur pirkstu nospiedumu." #: ../fdroidserver/common.py msgid "No git submodules available" -msgstr "" +msgstr "Nav pieejams neviens git apakšmodulis" #: ../fdroidserver/import_subcommand.py msgid "No gradle project could be found. Specify --subdir?" -msgstr "" +msgstr "Nevarēja atrast nevienu gradle projektu. Norādīt --subdir?" #: ../fdroidserver/import_subcommand.py msgid "No information found." -msgstr "" +msgstr "Informācija netika atrasta." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" -msgstr "" +msgstr "Netika atrastas atbilstošas birkas" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." msgstr "" +"{0} netika atrasta zemākā pieļaujamā SDK versija, izmanto noklusējumu (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" -msgstr "" +msgstr "Nav nepieciešams norādīt, ka lietotne ir brīva programmatūra" #: ../fdroidserver/lint.py msgid "No need to specify that the app is for Android" -msgstr "" +msgstr "Nav nepieciešams norādīt, ka lietotne ir paredzēta Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" msgstr "" +"Nav iestatīta neviena iespēja. Jālabo config.yml, lai iestatītu vismaz vienu " +"no šiem:" #: ../fdroidserver/common.py msgid "No packages specified" -msgstr "" +msgstr "Nav norādīta neviena pakotne" #: ../fdroidserver/install.py #, python-format msgid "No signed APK available for %s" -msgstr "" +msgstr "%s nav pieejams neviens parakstīts APK" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" @@ -1318,15 +1355,21 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgid "" +"One of the 'github_releases' config items is missing the 'packageNames' " +"value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgid "" +"One of the 'github_releases' config items is missing the 'projectUrl' value. " +"skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." +msgid "" +"One of the 'github_releases' config items is missing the 'token' value. " +"skipping ..." msgstr "" #: ../fdroidserver/update.py @@ -1481,12 +1524,16 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format -msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgid "" +"Reading packageName/versionCode/versionName failed, APK invalid: " +"'{apkfilename}'" msgstr "" #: ../fdroidserver/common.py #, python-brace-format -msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" +msgid "" +"Reading packageName/versionCode/versionName failed,APK invalid: " +"'{apkfilename}'" msgstr "" #: ../fdroidserver/update.py @@ -1516,7 +1563,9 @@ msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "" #: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgid "" +"Reset and create a brand new build server, even if the existing one appears " +"to be ok." msgstr "" #: ../fdroidserver/nightly.py @@ -1535,7 +1584,7 @@ msgstr "" #: ../fdroidserver/net.py #, python-format msgid "Retrying failed download: %s" -msgstr "" +msgstr "Atkārtoti mēģina neizdevušos lejupielādi: %s" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1544,7 +1593,7 @@ msgstr "" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" -msgstr "" +msgstr "Pārraksta \"{appid}\"" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" @@ -1552,7 +1601,8 @@ msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format -msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgid "" +"Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" msgstr "" #: ../fdroidserver/lint.py @@ -1604,7 +1654,7 @@ msgstr[1] "" #: ../fdroidserver/scanner.py msgid "Scanning APK for extra signing blocks." -msgstr "" +msgstr "Caurskata APK, vai ir papildu paraksta bloki." #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." @@ -1715,7 +1765,9 @@ msgid "System clock is older than date in {path}!" msgstr "" #: ../fdroidserver/checkupdates.py -msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgid "" +"Tags update mode only works for git, hg, bzr and git-svn repositories " +"currently" msgstr "" #: ../fdroidserver/checkupdates.py @@ -1723,7 +1775,9 @@ msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "" #: ../fdroidserver/build.py -msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgid "" +"Test mode - put output in the tmp directory only, and always build, even if " +"the output already exists." msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode @@ -1762,11 +1816,17 @@ msgid "These are the apps that have been archived from the main repo." msgstr "" #: ../fdroidserver/mirror.py -msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgid "" +"This command should never be used to mirror f-droid.org! A full copy " +"requires more than 600GB." msgstr "" #: ../fdroidserver/common.py -msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgid "" +"This is a repository of apps to be used with F-Droid. Applications in this " +"repository are either official binaries built by the original application " +"developers, or are binaries built from source by the admin of f-droid.org " +"using the tools on https://gitlab.com/fdroid." msgstr "" #: ../fdroidserver/import_subcommand.py @@ -1787,7 +1847,9 @@ msgid "" msgstr "" #: ../fdroidserver/deploy.py -msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgid "" +"To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config." +"yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -1808,11 +1870,15 @@ msgid "URL {url} in Description: {error}" msgstr "" #: ../fdroidserver/lint.py -msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgid "" +"Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from " +"https://spdx.org/license-list" msgstr "" #: ../fdroidserver/lint.py -msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgid "" +"Unexpected license tag \"{}\"! Only use license tags configured in your " +"config file" msgstr "" #: ../fdroidserver/common.py @@ -1917,7 +1983,9 @@ msgstr "" #: ../fdroidserver/lint.py #, python-brace-format -msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" +msgid "" +"UpdateCheckData must match the version code as integer (\\d or [0-9]): " +"{codeex}" msgstr "" #: ../fdroidserver/lint.py @@ -1931,12 +1999,14 @@ msgid "UpdateCheckData not a valid URL: {url}" msgstr "" #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." +msgid "" +"UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "" +"UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" msgstr "" #: ../fdroidserver/lint.py @@ -1967,7 +2037,9 @@ msgid "Usage: %s\n" msgstr "" #: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgid "" +"Use /HEAD instead of /master or /main to point at a file in the default " +"branch" msgstr "" #: ../fdroidserver/lint.py @@ -2009,7 +2081,8 @@ msgid "Using JAR Signature" msgstr "" #: ../fdroidserver/common.py -msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgid "" +"Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" #: ../fdroidserver/common.py @@ -2056,12 +2129,16 @@ msgstr "" #: ../fdroidserver/install.py #, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "" +msgstr "Pārbauda pakotni {path} ar apksigner." #: ../fdroidserver/deploy.py #, python-brace-format -msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgid "" +"VirusTotal API key cannot upload files larger than 32MB, use {url} to upload " +"{path}." msgstr "" +"VirusTotal API atslēga nevar augšupielādēt datnes, kas ir lielākas par 32 " +"MB. Jāizmanto {url}, lai augšupielādētu {path}." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" @@ -2069,14 +2146,18 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "WebAssembly binary file" -msgstr "" +msgstr "WebAssebly binārā datne" #: ../fdroidserver/update.py -msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgid "" +"When configured for signed indexes, create only unsigned indexes at this " +"stage" msgstr "" #: ../fdroidserver/lint.py -msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgid "" +"When linting the entire repository yamllint is disabled by default. This " +"option forces yamllint regardless." msgstr "" #: ../fdroidserver/publish.py @@ -2085,11 +2166,11 @@ msgstr "" #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "" +msgstr "Vai lejupielādēt un uzstādīt F-Droid.apk ar adb? (YES/no)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "" +msgstr "Vai lejupielādēt lietotni(es) no f-drodi.org? (YES/no)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2106,7 +2187,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "" +msgstr "adb ziņo, ka {serial} ir \"{status}\"." #: ../fdroidserver/nightly.py #, python-brace-format @@ -2397,7 +2478,9 @@ msgstr "" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format -msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgid "" +"invalid option string %(option)r: must start with a character " +"%(prefix_chars)r" msgstr "" #: ../fdroidserver/common.py @@ -2411,7 +2494,8 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format -msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgid "" +"local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "" #: ../fdroidserver/deploy.py @@ -2577,7 +2661,9 @@ msgstr "" #: ../fdroidserver/signatures.py #, python-brace-format -msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgid "" +"refuse downloading via insecure HTTP connection (use HTTPS or specify --no-" +"https-check): {apkfilename}" msgstr "" #: ../fdroidserver/index.py @@ -2614,7 +2700,9 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" #: ../fdroidserver/deploy.py -msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgid "" +"serverwebroot: path does not end with \"fdroid\", perhaps you meant one of " +"these:" msgstr "" #: ../fdroidserver/scanner.py @@ -2674,7 +2762,7 @@ msgstr "" #: ../fdroidserver/install.py msgid "true" -msgstr "" +msgstr "patiess" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2688,7 +2776,7 @@ msgstr "" #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "" +msgstr "nezināms parsētājs %(parser_name)r (izvēles: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2716,10 +2804,11 @@ msgstr "" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "" +"virustotal.com ierobežo pieprasījumus, gaida, lai mēģinātu atkārtoti..." #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "jā" #: ../fdroidserver/publish.py #, python-brace-format @@ -2837,12 +2926,12 @@ msgstr "" #: ../fdroidserver/install.py #, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "" +msgstr "{path} ir nepareizs pirkstu nospiedums ({fingerprint})." #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not \"key: value\" dict, but a {datatype}!" -msgstr "" +msgstr "{path} nav \"atslēga: vērtība\" vārdnīca, bet gan {datatype}." #: ../fdroidserver/common.py #, python-brace-format @@ -2900,3 +2989,7 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "" msgstr[1] "" + +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "Noņemt avota arhīvu un jebkādus APK, ja sekmīgi apliecināta." From e50ce950a3c8984b43b5f1dd5e341ad284f49eed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A5rd=20Sigurd=20M=C3=B8ller?= Date: Mon, 17 Mar 2025 22:44:41 +0100 Subject: [PATCH 1940/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Norwe?= =?UTF-8?q?gian=20Nynorsk=20(nn)=20by=20B=C3=A5rd=20Sigurd=20M=C3=B8ller?= =?UTF-8?q?=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 0.6% (4 of 611 strings) Added translation using Weblate: Norwegian Nynorsk (nn) by Bård Sigurd Møller Co-authored-by: Bård Sigurd Møller Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/nn/ Translation: F-Droid/F-Droid Server --- locale/nn/LC_MESSAGES/fdroidserver.po | 2902 +++++++++++++++++++++++++ 1 file changed, 2902 insertions(+) create mode 100644 locale/nn/LC_MESSAGES/fdroidserver.po diff --git a/locale/nn/LC_MESSAGES/fdroidserver.po b/locale/nn/LC_MESSAGES/fdroidserver.po new file mode 100644 index 00000000..f770669c --- /dev/null +++ b/locale/nn/LC_MESSAGES/fdroidserver.po @@ -0,0 +1,2902 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# Bård Sigurd Møller , 2024. +msgid "" +msgstr "" +"Project-Id-Version: fdroidserver 2.3.0-3-g4ba7b5c9\n" +"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" +"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"PO-Revision-Date: 2024-11-26 10:54+0000\n" +"Last-Translator: Bård Sigurd Møller \n" +"Language-Team: Norwegian Nynorsk \n" +"Language: nn\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.9-dev\n" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH public key to be used as deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "" +"\n" +"{path} encoded for the DEBUG_KEYSTORE secret variable:" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "\"%s/\" has no matching metadata file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "\"{apkfilename}\" is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains outdated {name} ({version})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains recent {name} ({version})" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "\"{path}\" exists but s3cmd is not installed!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "\"{url}\" is not a valid URL!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "%(option)s option requires %(number)d argument" +msgid_plural "%(option)s option requires %(number)d arguments" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "%(prog)s: error: %(message)s\n" +msgstr "%(prog)s: feil: %(message)s\n" + +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "%d problems found" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "%prog [options]" +msgstr "%prog [val]" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "%r is not callable" +msgstr "" + +#: ../fdroidserver/signindex.py +#, python-format +msgid "%s did not produce a dict!" +msgstr "" + +#: ../fdroidserver/signindex.py +#, python-format +msgid "%s has bad SHA-256: %s" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "%s is not an accepted build field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "%s option does not take a value" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' is NONE and 'smartcardoptions' is blank!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "'required' is an invalid argument for positionals" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{path}' failed to execute!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format +msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "...checkupdate failed for {appid} : {error}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid ".__call__() not defined" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "/issues is missing" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "A URL is required as an argument!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Add PGP signatures using GnuPG for packages in repo" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add a repo signing key to an unsigned repo" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add skeleton metadata files for APKs that are missing them" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Adding new repo for only {name}" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Alias of the repo signing key in the keystore" +msgstr "" + +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Also mirror the full archive section" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Also warn about formatting issues, like rewritemeta -l" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android AAR library" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android APK file" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android DEX code" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' is not a directory!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "App is in '{repo}' but has a link to {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Appending .git is not necessary" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Archiving {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in srclib '{srclib}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Broken symlink: {path}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Build a package from source" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build all applications available" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Build generated by `fdroid import` - remove disable line once ready" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Build metadata git repo has uncommited changes!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build only the latest version of each package" +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "Built repo based in \"%s\" with this config:" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Can't build due to {} error while scanning" +msgid_plural "Can't build due to {} errors while scanning" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Cannot rewrite \"{path}\"" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Categories '%s' is not valid" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Categories are not set" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Check for updates to applications" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Clean update - don't uses caches, reprocess all APKs" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Comma separated list of categories." +msgstr "" + +#: ../fdroidserver/__main__.py +#, python-format +msgid "Command '%s' not recognised.\n" +msgstr "Kommandoen '%s' er ikkje gjenkjent\n" + +#: ../fdroidserver/checkupdates.py +msgid "Commit changes" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not find '{command}' on your system" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Could not find latest version code" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Could not find latest version name" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not find {path} to remove it" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not parse size \"{size}\", wrong type \"{type}\"" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Couldn't find Application ID" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find package ID" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Cowardily refusing to overwrite existing signing key setup!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Created new container \"{name}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Creating \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating log directory" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Creating new S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating output directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating signed index with this key (SHA256):" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/verify.py +msgid "Creating temporary directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating unsigned index in preparation for signing" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "DEBUG_KEYSTORE is not set or the value is incomplete" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Delete APKs and/or OBBs without metadata from the repo" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting archive, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Deleting unknown file: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description '%s' is just the app's summary" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Description has a duplicate line" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Description of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Do not add 'disable:' to the generated build entries" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not deploy the new files to the repo" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Do not include \"{path}\" in URL!" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Do not prompt for Android SDK path, just fail" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not remove the private keys generated from the keystore" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't create a source tarball, useful when testing a build" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/nightly.py +msgid "Don't use rsync checksums" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Download complete mirrors of small repos" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Downloading the repository already failed once, not trying again." +msgstr "" + +#: ../fdroidserver/verify.py +#, python-brace-format +msgid "Downloading {url} failed. {error}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Duplicate link in '{field}': {url}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "" +"ERROR: this command should never be used to mirror f-droid.org!\n" +"A full mirror of f-droid.org requires more than 200GB." +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "ERROR: unsupported CI type, patches welcome!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + +#: ../fdroidserver/__main__.py +#, python-brace-format +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"Enter the path to the Android SDK (%s) here:\n" +"> " +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Error while getting repo address" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Extract signatures from APKs" +msgstr "" + +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed copying {path}: {error}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Failed fetching signatures for '{apkfilename}': {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed reading {path}: {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed resizing {path}: {error}" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Failed to create S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get APK information, deleting {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get APK information, skipping {path}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Failed to install '{apkfilename}' on {dev}: {error}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to sign application" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Fetched buildserverid from VM: {buildserverid}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "File disappeared while processing it: {path}" +msgstr "" + +#: ../fdroidserver/build.py ../fdroidserver/install.py +#: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py +#: ../fdroidserver/update.py +msgid "Finished" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Forbidden HTML tags" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Force halting build after {0} sec timeout!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Force scan of disabled apps and builds." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found bad funding file \"{path}\" for \"{name}\":" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Found invalid appids in arguments" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +msgid "Found invalid versionCodes for some apps" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Found multiple JAR Signature Block Files in {path}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Found multiple metadata files for {appid}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found multiple signing certificates for repository." +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found no signing certificates for repository." +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Found non-file at %s" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Found {apkfilename} at {url}" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Found {count} problems in {filename}" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Found {count} warnings in {filename}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Generated skeleton metadata for {appid}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git checkout of '%s' failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git clean failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git fetch failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git remote set-head failed: \"%s\"" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git reset failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule sync failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule update failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "HTTPS must be used with Subversion URLs!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "If a git mirror gets to big, allow the archive to be deleted" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "If this upload fails, try manually uploading to {url}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." +msgstr "" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring FUNDING.yml entry longer than 2048: %s" +msgstr "" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Ignoring package without metadata: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Ignoring stale cache data for {apkfilename}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Include APKs that are signed with disabled algorithms like MD5" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the PGP signature .asc files in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the build logs in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the source tarballs in the mirror" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Initialising submodules" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Install all signed applications available" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Install built packages on devices" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}..." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Interact with the repo HTTP server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Invalid APK" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid VercodeOperation: {field}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Invalid VercodeOperation: {invalid_ops}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid application ID {appid}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid boolean '%s'" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid bulleted list" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Invalid name for published file: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid redirect to non-HTTPS: {before} -> {after} " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid scrlib metadata: '{file}' does not exist" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: could not parse '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature failed to verify: {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature verified: {path}" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java JAR file" +msgstr "" + +#: ../fdroidserver/mirror.py ../fdroidserver/publish.py +#: ../fdroidserver/update.py +msgid "Java JDK not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java compiled class" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Javascript in HTML src attributes" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Keystore for signing key:\t" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the Liberapay: field" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Locale included in f-droid.org URL" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Make the build stop on exceptions" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Malformed repository mirrors." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Malformed serverwebroot line:" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Mirror the full repo and archive, all file types." +msgstr "" + +#: ../fdroidserver/gpgsign.py +msgid "Missing output directory" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No Android SDK found!" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No attached devices found" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + +#: ../fdroidserver/index.py +msgid "No fingerprint in URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No git submodules available" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "No gradle project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "No information found." +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is Free Software" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is for Android" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No packages specified" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "No signed APK available for %s" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No signed output directory - nothing to do" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No signing certificates found in {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "No such package: %s" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No such versionCode {versionCode} for app {appid}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/verify.py +msgid "No unsigned directory - nothing to do" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Not a valid size definition: \"{}\"" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Nothing to do" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Nothing to do for {appid}." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "OBB file has newer versionCode({integer}) than any APK:" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB filename must start with \"main.\" or \"patch.\":" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB's packagename does not match a supported APK:" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Only PNG and JPEG are supported for graphics, found: {path}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only print differences with the Play Store" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only process apps with auto-updates" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "OpenCollective donation methods belong in the OpenCollective: field" +msgstr "" + +#: /usr/lib/python3.11/optparse.py +msgid "Options" +msgstr "Val" + +#: ../fdroidserver/verify.py +msgid "Output JSON report to file named after APK." +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Output JSON to stdout." +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py +#: ../fdroidserver/publish.py ../fdroidserver/signindex.py +#: ../fdroidserver/update.py +msgid "Outputting JSON" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Overall license of the project." +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "Package \"{appid}\" already exists" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Parsing manifest at '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Password required with username" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Path to main Android project subdirectory, if not in root." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Path to the git repo to use as the log" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the keystore for the repo signing key" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Print the secret variable to the terminal for easy copy/paste" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Problem with xml at '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Process auto-updates" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#, python-brace-format +msgid "Processing {apkfilename}" +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#, python-brace-format +msgid "Processing {appid}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable XML/JSON for index files" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Project URL to import from." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Punctuation should be avoided" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Push the log to this git remote repository" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Pushing binary transparency log to {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Pushing to {url}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Quickly start a new repository" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Read all the metadata files and exit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading '{config_file}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Reading {apkfilename} from cache" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Removing specified files" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Rename APK files that do not match package.name_123.apk" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Resigning {apkfilename} with provided debug.keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Resize all the icons exceeding the max pixel size and exit" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Restrict output to warnings and errors" +msgstr "" + +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Rewrite all the metadata files" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Run on git repo that has uncommitted changes" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Run rewritemeta to fix formatting" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Running first pass with MD5 checking disabled" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Running wget in {path}" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "SHA-256 of {url} does not match entry!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scan the resulting APK(s) for known non-free classes." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Scan the source code of a package" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {apk}" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:{versionCode}:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scanner found {} problem" +msgid_plural "Scanner found {} problems" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Set clock to that time using:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Set maximum releases in repo before older ones are archived" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Set open file limit to {integer}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Set up an app build for a nightly build repo" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setting open file limit failed: " +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Setting {0} sec timeout for this build" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Sign and place packages in the repo" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Sign indexes created using update --nosign" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Skip scanning the source code for binaries and other problems" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping '{apkfilename}' with invalid signature!" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping index generation for {appid}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: disabled" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Specify a local folder to sync the repo to" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Specify an identity file to provide to SSH for rsyncing" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Specify which debug keystore file to use." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Spew out even more information than normal" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Stripping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Summary '%s' is just the app's name" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Summary of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "System clock is older than date in {path}!" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "The OBB version code must come after \"{name}.\":" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "The base URL for the repo to log (default: https://f-droid.org)" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "The directory to write the mirror to" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "The file to be included in the repo (path or glob)" +msgstr "" + +#: ../fdroidserver/index.py +msgid "The repository's fingerprint does not match." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "The root dir for local_copy_dir \"{path}\" does not exist!" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "There is a keyalias collision - publishing halted" +msgstr "" + +#: ../fdroidserver/common.py +msgid "These are the apps that have been archived from the main repo." +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-format +msgid "This repo already has local metadata: %s" +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL must start with https:// or http://" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL shorteners should not be used" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "URL {url} in Description: {error}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Unknown exception found!" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Unknown file '{filename}' in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Unknown metadata format: %s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path} (use: *.yml)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Unknown version of aapt, might cause problems: " +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary leading space" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary trailing space" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised app field '{fieldname}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised build flag '{build_flag}' in '{path}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported file type \"{extension}\" for repo graphic" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported graphics file found: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused extlib at %s" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused file at %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scandelete path: %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scanignore path: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Update repo information for new packages" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Update the binary transparency log for a URL" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "UpdateCheckData has invalid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must use HTTPS URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData not a valid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID, it can be removed" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to androidobservatory.org" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to virustotal" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "Usage" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "Usage: %s\n" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master to point at a file in the default branch" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use `fdroid update -c` to create it." +msgstr "" + +#: ../fdroidserver/build.py +msgid "Use build server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v2" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v3" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Using androguard from \"{path}\"" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Using existing keystore \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using s3cmd to sync with: {url}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Valid commands are:" +msgstr "" + +#: ../fdroidserver/verify.py +msgid "Verify against locally cached copy rather than redownloading." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Verify the integrity of downloaded packages" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Verifying index signature:" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Warn about possible metadata errors" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + +#: ../fdroidserver/update.py +msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgstr "" + +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + +#: ../fdroidserver/init.py +msgid "X.509 'Distinguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/common.py +msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "ZIP file archive" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "adding IdentityFile to {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "adding to {name}: {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "ambiguous option: %s (%s?)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + +#: ../fdroidserver/common.py +msgid "apksigner not found, it's required for signing!" +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py +#: ../fdroidserver/rewritemeta.py +msgid "application ID of file to operate on" +msgstr "" + +#: ../fdroidserver/build.py ../fdroidserver/install.py +#: ../fdroidserver/publish.py ../fdroidserver/scanner.py +#: ../fdroidserver/verify.py +msgid "application ID with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "argument \"-\" with mode %r" +msgstr "" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "argument %(argument_name)s: %(message)s" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare SSH connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "can not parse scrlib spec (not a string): '{}'" +msgstr "" + +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "can't open non-https url: '{};" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "cannot find required srclibs: \"{path}\"" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "cannot have multiple subparser arguments" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "cannot merge actions - two groups are named %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "cannot publish update, did you set the deploy key?" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "cloning {url}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "commands from plugin modules:" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "complex" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting option string: %s" +msgid_plural "conflicting option strings: %s" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting subparser alias: %s" +msgstr "" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting subparser: %s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "could not parse '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no ref specified): '{}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (too many '@' signs): '{}'" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "created {path}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "deleting: repo/{apkfilename}" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed process log {path} to {dest}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "dest= is required for options like %r" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "downloading '{}'" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "downloading scanner signatures from '{}' failed" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "executable binary, possibly code" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "expected %s argument" +msgid_plural "expected %s arguments" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "expected at least one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "expected at most one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "expected one argument" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "fdroid [] [-h|--help|--version|]" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "fetch the latest version of signatures from the web" +msgstr "" + +#: /usr/lib/python3.11/optparse.py +msgid "floating-point" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force metadata errors (default) to be warnings, or to be ignored." +msgstr "" + +#: ../fdroidserver/common.py +msgid "git svn clone failed" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "gzip file archive" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "ignored explicit argument %r" +msgstr "" + +#: ../fdroidserver/index.py +msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + +#: ../fdroidserver/index.py +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "integer" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid %(type)s value: %(value)r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid choice: %(value)r (choose from %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid conflict_resolution value: %r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgstr "" + +#: ../fdroidserver/common.py +msgid "ipfs_cid not found, skipping CIDv1 generation" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be an absolute path!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be directory, not a file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "mirror '%s' does not end with 'fdroid'!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "mutually exclusive arguments must be optional" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "next {name} cache update due in {time}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "no \"icon\" in {appid}" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "no APK supplied" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "no such option: %s" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "no version info found!" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "not allowed with argument %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "one of the arguments %s is required" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/index.py +msgid "only accepts strings, lists, and tuples" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "option %s: If you really want to install all the signed apps, use --all" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "option %s: invalid %s value: %r" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "option %s: invalid choice: %r (choose from %s)" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option -%s not recognized" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option -%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s must not have an argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s not a unique prefix" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s not recognized" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +msgid "optional arguments" +msgstr "" + +#: /usr/lib/python3.11/argparse.py +msgid "options" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "overwriting existing {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "positional arguments" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "process log deploy {path} to {dest} failed!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "ruamel.yaml not installed, can not write metadata." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd sync indexes {path} to {url} and delete" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "scanner cache is malformed! You can clear it with: '{clear}'" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "shared library" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "show program's version number and exit" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py +#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +msgid "show this help message and exit" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "signed APK, either a file-path or HTTPS URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: log content is empty" +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: not enabled in config" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "skipping source tarball: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "srclibs missing name and/or @" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "static library" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "the following arguments are required: %s" +msgstr "" + +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unexpected option string: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unrecognized arguments: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "unsafe permissions on '{config_file}' (should be 0600)!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid +#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +msgid "usage: " +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "using Apache libcloud to sync with {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "virustotal.com is rate limiting, waiting to retry..." +msgstr "" + +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "{0} app, {1} key aliases" +msgid_plural "{0} apps, {1} key aliases" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} ({appid}) has no metadata!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using application ID instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android application ID!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Java Package Name!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{appid} is missing {name}" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: Unknown extlib {path} in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "{appid}: no builds specified, running on current source state" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be an integer, found: {value}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{file} is blank or corrupt!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "{path} already exists, ignoring import results!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "{path} does not exist! Create it by running:" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} is zero size!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} more than 200MB, manually upload: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{url} does not end with \"fdroid\", check the URL path!" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "{url} does not start with \"http\"!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "{} build failed" +msgid_plural "{} builds failed" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/build.py +msgid "{} build succeeded" +msgid_plural "{} builds succeeded" +msgstr[0] "" +msgstr[1] "" From db7afbedf594aac7d627584fc857d30887f3a772 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Mon, 17 Mar 2025 22:44:42 +0100 Subject: [PATCH 1941/2116] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ Translation: F-Droid/F-Droid Server --- locale/lv/LC_MESSAGES/fdroidserver.po | 6 +++++- locale/nn/LC_MESSAGES/fdroidserver.po | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/locale/lv/LC_MESSAGES/fdroidserver.po b/locale/lv/LC_MESSAGES/fdroidserver.po index 9aafeada..95b6a129 100644 --- a/locale/lv/LC_MESSAGES/fdroidserver.po +++ b/locale/lv/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-11-21 21:34+0100\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2024-11-22 21:03+0000\n" "Last-Translator: Edgars Andersons \n" "Language-Team: Latvian \n" "Language-Team: Norwegian Nynorsk \n" @@ -1498,6 +1498,10 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + #: ../fdroidserver/common.py msgid "Removing specified files" msgstr "" From 72ca7ebc4f107612267efc7a6300e78a15b46478 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=AE=A4=E0=AE=AE=E0=AE=BF=E0=AE=B4=E0=AF=8D=E0=AE=A8?= =?UTF-8?q?=E0=AF=87=E0=AE=B0=E0=AE=AE=E0=AF=8D?= Date: Mon, 17 Mar 2025 22:44:42 +0100 Subject: [PATCH 1942/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Tamil?= =?UTF-8?q?=20(ta)=20by=20=E0=AE=A4=E0=AE=AE=E0=AE=BF=E0=AE=B4=E0=AF=8D?= =?UTF-8?q?=E0=AE=A8=E0=AF=87=E0=AE=B0=E0=AE=AE=E0=AF=8D=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (612 of 612 strings) Co-authored-by: தமிழ்நேரம் Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ta/ Translation: F-Droid/F-Droid Server --- locale/ta/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/ta/LC_MESSAGES/fdroidserver.po b/locale/ta/LC_MESSAGES/fdroidserver.po index 46016bdb..acb9cedb 100644 --- a/locale/ta/LC_MESSAGES/fdroidserver.po +++ b/locale/ta/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" -"PO-Revision-Date: 2024-12-02 17:00+0000\n" +"PO-Revision-Date: 2024-12-25 17:10+0000\n" "Last-Translator: தமிழ்நேரம் \n" "Language-Team: Tamil \n" "Language: ta\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.9-dev\n" +"X-Generator: Weblate 5.10-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -1510,7 +1510,7 @@ msgstr "நெட்வொர்க்கிலிருந்து ச்க #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." -msgstr "" +msgstr "வெற்றிகரமாக சரிபார்க்கப்பட்டால் மூல நாடாகாப்பகபந்து மற்றும் ஏதேனும் APK களை அகற்றவும்." #: ../fdroidserver/common.py msgid "Removing specified files" @@ -2031,7 +2031,7 @@ msgstr "குடுவை கையொப்பத்தைப் பயன் #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" -msgstr "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "சாவாவின் சார்சிக்னரைப் பயன்படுத்துதல், APKS ஐ சரிபார்க்க பரிந்துரைக்கப்படவில்லை! Apksigner ஐப் பயன்படுத்தவும்" #: ../fdroidserver/common.py #, python-brace-format From 40daf5e15300e7d23c0f774e931db11b4ba6822f Mon Sep 17 00:00:00 2001 From: Kuldeep Singh Date: Mon, 17 Mar 2025 22:44:42 +0100 Subject: [PATCH 1943/2116] Added translation using Weblate: Punjabi (pa) by Kuldeep Singh Co-authored-by: Kuldeep Singh --- locale/pa/LC_MESSAGES/fdroidserver.po | 2905 +++++++++++++++++++++++++ 1 file changed, 2905 insertions(+) create mode 100644 locale/pa/LC_MESSAGES/fdroidserver.po diff --git a/locale/pa/LC_MESSAGES/fdroidserver.po b/locale/pa/LC_MESSAGES/fdroidserver.po new file mode 100644 index 00000000..19d66a92 --- /dev/null +++ b/locale/pa/LC_MESSAGES/fdroidserver.po @@ -0,0 +1,2905 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# Kuldeep Singh , 2025. +msgid "" +msgstr "" +"Project-Id-Version: fdroidserver 2.3.3\n" +"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" +"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: pa\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH public key to be used as deploy key:" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "" +"\n" +"{path} encoded for the DEBUG_KEYSTORE secret variable:" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "\"%s/\" has no matching metadata file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "\"{apkfilename}\" is already installed on {dev}." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains outdated {name} ({version})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains recent {name} ({version})" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "\"{path}\" exists but s3cmd is not installed!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "\"{url}\" is not a valid URL!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "%(option)s option requires %(number)d argument" +msgid_plural "%(option)s option requires %(number)d arguments" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "%(prog)s: error: %(message)s\n" +msgstr "" + +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "%d problems found" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "%prog [options]" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "%r is not callable" +msgstr "" + +#: ../fdroidserver/signindex.py +#, python-format +msgid "%s did not produce a dict!" +msgstr "" + +#: ../fdroidserver/signindex.py +#, python-format +msgid "%s has bad SHA-256: %s" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "%s is not an accepted build field" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "%s option does not take a value" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' is NONE and 'smartcardoptions' is blank!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "'required' is an invalid argument for positionals" +msgstr "" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{path}' failed to execute!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#, python-brace-format +msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "...checkupdate failed for {appid} : {error}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid ".__call__() not defined" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "/issues is missing" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "A URL is required as an argument!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Add PGP signatures using GnuPG for packages in repo" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add a repo signing key to an unsigned repo" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Add skeleton metadata files for APKs that are missing them" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Adding new repo for only {name}" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Alias of the repo signing key in the keystore" +msgstr "" + +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Also mirror the full archive section" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Also warn about formatting issues, like rewritemeta -l" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android AAR library" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android APK file" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Android DEX code" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' does not exist!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' is not a directory!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "App is in '{repo}' but has a link to {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Appending .git is not necessary" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Archiving {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in srclib '{srclib}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Broken symlink: {path}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Build a package from source" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build all applications available" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Build generated by `fdroid import` - remove disable line once ready" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Build metadata git repo has uncommited changes!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Build only the latest version of each package" +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "Built repo based in \"%s\" with this config:" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Can't build due to {} error while scanning" +msgid_plural "Can't build due to {} errors while scanning" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Cannot rewrite \"{path}\"" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Categories '%s' is not valid" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Categories are not set" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Check for updates to applications" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Clean update - don't uses caches, reprocess all APKs" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Comma separated list of categories." +msgstr "" + +#: ../fdroidserver/__main__.py +#, python-format +msgid "Command '%s' not recognised.\n" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Commit changes" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not find '{command}' on your system" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Could not find latest version code" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Could not find latest version name" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not find {path} to remove it" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not parse size \"{size}\", wrong type \"{type}\"" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Couldn't find Application ID" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find package ID" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Cowardily refusing to overwrite existing signing key setup!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Created new container \"{name}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Creating \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating log directory" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Creating new S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "Creating output directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating signed index with this key (SHA256):" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/verify.py +msgid "Creating temporary directory" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Creating unsigned index in preparation for signing" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "DEBUG_KEYSTORE is not set or the value is incomplete" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Delete APKs and/or OBBs without metadata from the repo" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting archive, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Deleting unknown file: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description '%s' is just the app's summary" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Description has a duplicate line" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Description of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Do not add 'disable:' to the generated build entries" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not deploy the new files to the repo" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Do not include \"{path}\" in URL!" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Do not prompt for Android SDK path, just fail" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Do not remove the private keys generated from the keystore" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't create a source tarball, useful when testing a build" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/nightly.py +msgid "Don't use rsync checksums" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Download complete mirrors of small repos" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Downloading %s" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Downloading the repository already failed once, not trying again." +msgstr "" + +#: ../fdroidserver/verify.py +#, python-brace-format +msgid "Downloading {url} failed. {error}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Duplicate link in '{field}': {url}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "" +"ERROR: this command should never be used to mirror f-droid.org!\n" +"A full mirror of f-droid.org requires more than 200GB." +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "ERROR: unsupported CI type, patches welcome!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "" + +#: ../fdroidserver/__main__.py +#, python-brace-format +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"Enter the path to the Android SDK (%s) here:\n" +"> " +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Error while getting repo address" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Extract signatures from APKs" +msgstr "" + +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed copying {path}: {error}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Failed fetching signatures for '{apkfilename}': {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed reading {path}: {error}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed resizing {path}: {error}" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Failed to create S3 bucket: {url}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get APK information, deleting {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get APK information, skipping {path}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Failed to install '{apkfilename}' on {dev}: {error}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Failed to sign application" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Fetched buildserverid from VM: {buildserverid}" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "File disappeared while processing it: {path}" +msgstr "" + +#: ../fdroidserver/build.py ../fdroidserver/install.py +#: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py +#: ../fdroidserver/update.py +msgid "Finished" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Flattr donation methods belong in the FlattrID: field" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Forbidden HTML tags" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Force halting build after {0} sec timeout!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Force scan of disabled apps and builds." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found bad funding file \"{path}\" for \"{name}\":" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Found invalid appids in arguments" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +msgid "Found invalid versionCodes for some apps" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Found multiple JAR Signature Block Files in {path}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Found multiple metadata files for {appid}" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found multiple signing certificates for repository." +msgstr "" + +#: ../fdroidserver/index.py +msgid "Found no signing certificates for repository." +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Found non-file at %s" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Found {apkfilename} at {url}" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Found {count} problems in {filename}" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Found {count} warnings in {filename}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Generated skeleton metadata for {appid}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git checkout of '%s' failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git clean failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git fetch failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git prune failed" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git remote set-head failed: \"%s\"" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git reset failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule sync failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Git submodule update failed" +msgstr "" + +#: ../fdroidserver/common.py +msgid "HTTPS must be used with Subversion URLs!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "If a git mirror gets to big, allow the archive to be deleted" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "If this upload fails, try manually uploading to {url}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." +msgstr "" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring FUNDING.yml entry longer than 2048: %s" +msgstr "" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Ignoring package without metadata: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Ignoring stale cache data for {apkfilename}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Include APKs that are signed with disabled algorithms like MD5" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the PGP signature .asc files in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the build logs in the mirror" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Include the source tarballs in the mirror" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Initialising submodules" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Install all signed applications available" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Install built packages on devices" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s..." +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}..." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Interact with the repo HTTP server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Invalid APK" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid VercodeOperation: {field}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Invalid VercodeOperation: {invalid_ops}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid application ID {appid}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Invalid boolean '%s'" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Invalid bulleted list" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Invalid name for published file: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid redirect to non-HTTPS: {before} -> {after} " +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid scrlib metadata: '{file}' does not exist" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: could not parse '{file}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature failed to verify: {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature verified: {path}" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java JAR file" +msgstr "" + +#: ../fdroidserver/mirror.py ../fdroidserver/publish.py +#: ../fdroidserver/update.py +msgid "Java JDK not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Java compiled class" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Javascript in HTML src attributes" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Keystore for signing key:\t" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the Liberapay: field" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Locale included in f-droid.org URL" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Make the build stop on exceptions" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Malformed repository mirrors." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Malformed serverwebroot line:" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "Mirror the full repo and archive, all file types." +msgstr "" + +#: ../fdroidserver/gpgsign.py +msgid "Missing output directory" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "" + +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No Android SDK found!" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No attached devices found" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "" + +#: ../fdroidserver/index.py +msgid "No fingerprint in URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "No git submodules available" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "No gradle project could be found. Specify --subdir?" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "No information found." +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is Free Software" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is for Android" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "No packages specified" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "No signed APK available for %s" +msgstr "" + +#: ../fdroidserver/install.py +msgid "No signed output directory - nothing to do" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No signing certificates found in {path}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "No such package: %s" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No such versionCode {versionCode} for app {appid}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/verify.py +msgid "No unsigned directory - nothing to do" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Not a valid size definition: \"{}\"" +msgstr "" + +#: ../fdroidserver/signindex.py +msgid "Nothing to do" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Nothing to do for {appid}." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "OBB file has newer versionCode({integer}) than any APK:" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB filename must start with \"main.\" or \"patch.\":" +msgstr "" + +#: ../fdroidserver/update.py +msgid "OBB's packagename does not match a supported APK:" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Only PNG and JPEG are supported for graphics, found: {path}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only print differences with the Play Store" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Only process apps with auto-updates" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "OpenCollective donation methods belong in the OpenCollective: field" +msgstr "" + +#: /usr/lib/python3.11/optparse.py +msgid "Options" +msgstr "" + +#: ../fdroidserver/verify.py +msgid "Output JSON report to file named after APK." +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Output JSON to stdout." +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py +#: ../fdroidserver/publish.py ../fdroidserver/signindex.py +#: ../fdroidserver/update.py +msgid "Outputting JSON" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Overall license of the project." +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "Package \"{appid}\" already exists" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Parsing manifest at '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Password required with username" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Path to main Android project subdirectory, if not in root." +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Path to the git repo to use as the log" +msgstr "" + +#: ../fdroidserver/init.py +msgid "Path to the keystore for the repo signing key" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Print the secret variable to the terminal for easy copy/paste" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Problem with xml at '{path}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Process auto-updates" +msgstr "" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#, python-brace-format +msgid "Processing {apkfilename}" +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#, python-brace-format +msgid "Processing {appid}" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Produce human-readable XML/JSON for index files" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +msgid "Project URL to import from." +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Punctuation should be avoided" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "Push the log to this git remote repository" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Pushing binary transparency log to {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Pushing to {url}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Quickly start a new repository" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Read all the metadata files and exit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading '{config_file}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Reading {apkfilename} from cache" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "" + +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Removing specified files" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Rename APK files that do not match package.name_123.apk" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "RepoTrunk update mode only makes sense in git-svn repositories" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Resigning {apkfilename} with provided debug.keystore" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Resize all the icons exceeding the max pixel size and exit" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Restrict output to warnings and errors" +msgstr "" + +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Rewrite all the metadata files" +msgstr "" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}'" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Run on git repo that has uncommitted changes" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Run rewritemeta to fix formatting" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Running first pass with MD5 checking disabled" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Running wget in {path}" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "SHA-256 of {url} does not match entry!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scan the resulting APK(s) for known non-free classes." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Scan the source code of a package" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {apk}" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:{versionCode}:" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Scanner found {} problem" +msgid_plural "Scanner found {} problems" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Set clock to that time using:" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Set maximum releases in repo before older ones are archived" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Set open file limit to {integer}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Set up an app build for a nightly build repo" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Setting open file limit failed: " +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Setting {0} sec timeout for this build" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Sign and place packages in the repo" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Sign indexes created using update --nosign" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Skip scanning the source code for binaries and other problems" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping '{apkfilename}' with invalid signature!" +msgstr "" + +#: ../fdroidserver/deploy.py ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping index generation for {appid}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping {apkfilename} with invalid signature!" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: disabled" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Specify a local folder to sync the repo to" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "Specify an identity file to provide to SSH for rsyncing" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "Specify which debug keystore file to use." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Spew out even more information than normal" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Stripping mystery signature from {apkfilename}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Summary '%s' is just the app's name" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Summary of length {length} is over the {limit} char limit" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "System clock is older than date in {path}!" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "" + +#: ../fdroidserver/build.py +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "The OBB version code must come after \"{name}.\":" +msgstr "" + +#: ../fdroidserver/btlog.py +msgid "The base URL for the repo to log (default: https://f-droid.org)" +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "The directory to write the mirror to" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "The file to be included in the repo (path or glob)" +msgstr "" + +#: ../fdroidserver/index.py +msgid "The repository's fingerprint does not match." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "The root dir for local_copy_dir \"{path}\" does not exist!" +msgstr "" + +#: ../fdroidserver/publish.py +msgid "There is a keyalias collision - publishing halted" +msgstr "" + +#: ../fdroidserver/common.py +msgid "These are the apps that have been archived from the main repo." +msgstr "" + +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "" + +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-format +msgid "This repo already has local metadata: %s" +msgstr "" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL must start with https:// or http://" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "URL shorteners should not be used" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "URL {url} in Description: {error}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unexpected symlink target: {link} -> {target}" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Unknown exception found!" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Unknown file '{filename}' in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Unknown metadata format: %s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path} (use: *.yml)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Unknown version of aapt, might cause problems: " +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary leading space" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Unnecessary trailing space" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised app field '{fieldname}' in '{path}'" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised build flag '{build_flag}' in '{path}'" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported file type \"{extension}\" for repo graphic" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported graphics file found: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused extlib at %s" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused file at %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scandelete path: %s" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scanignore path: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-format +msgid "Unzipping to %s" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Update repo information for new packages" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Update the binary transparency log for a URL" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "UpdateCheckData has invalid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must use HTTPS URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData not a valid URL: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." +msgstr "" + +#. Translators: https://developer.android.com/studio/build/application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID, it can be removed" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to androidobservatory.org" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to virustotal" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "Usage" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "Usage: %s\n" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master to point at a file in the default branch" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use `fdroid update -c` to create it." +msgstr "" + +#: ../fdroidserver/build.py +msgid "Use build server" +msgstr "" + +#: ../fdroidserver/update.py +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for configuring s3cmd." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v2" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v3" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "" + +#: ../fdroidserver/common.py +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Using androguard from \"{path}\"" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Using existing keystore \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using s3cmd to sync with: {url}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Valid commands are:" +msgstr "" + +#: ../fdroidserver/verify.py +msgid "Verify against locally cached copy rather than redownloading." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Verify the integrity of downloaded packages" +msgstr "" + +#: ../fdroidserver/index.py +msgid "Verifying index signature:" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "Warn about possible metadata errors" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "" + +#: ../fdroidserver/update.py +msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgstr "" + +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "" + +#: ../fdroidserver/init.py +msgid "X.509 'Distinguished Name' used when generating keys" +msgstr "" + +#: ../fdroidserver/common.py +msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "ZIP file archive" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "adding IdentityFile to {path}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "adding to {name}: {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "ambiguous option: %s (%s?)" +msgstr "" + +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "" + +#: ../fdroidserver/common.py +msgid "apksigner not found, it's required for signing!" +msgstr "" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py +#: ../fdroidserver/rewritemeta.py +msgid "application ID of file to operate on" +msgstr "" + +#: ../fdroidserver/build.py ../fdroidserver/install.py +#: ../fdroidserver/publish.py ../fdroidserver/scanner.py +#: ../fdroidserver/verify.py +msgid "application ID with optional versionCode in the form APPID[:VERCODE]" +msgstr "" + +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "argument \"-\" with mode %r" +msgstr "" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "argument %(argument_name)s: %(message)s" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "attempting bare SSH connection to test deploy key:" +msgstr "" + +#: ../fdroidserver/common.py +msgid "can not parse scrlib spec (not a string): '{}'" +msgstr "" + +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "can't open non-https url: '{};" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "cannot find required srclibs: \"{path}\"" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "cannot have multiple subparser arguments" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "cannot merge actions - two groups are named %r" +msgstr "" + +#: ../fdroidserver/nightly.py +msgid "cannot publish update, did you set the deploy key?" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "cloning {url}" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "commands from plugin modules:" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "complex" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting option string: %s" +msgid_plural "conflicting option strings: %s" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting subparser alias: %s" +msgstr "" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting subparser: %s" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "could not parse '{path}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no ref specified): '{}'" +msgstr "" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (too many '@' signs): '{}'" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "created {path}" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "deleting: repo/{apkfilename}" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed process log {path} to {dest}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "dest= is required for options like %r" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "downloading '{}'" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "downloading scanner signatures from '{}' failed" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "executable binary, possibly code" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "expected %s argument" +msgid_plural "expected %s arguments" +msgstr[0] "" +msgstr[1] "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "expected at least one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "expected at most one argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "expected one argument" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "fdroid [] [-h|--help|--version|]" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "fetch the latest version of signatures from the web" +msgstr "" + +#: /usr/lib/python3.11/optparse.py +msgid "floating-point" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "force metadata errors (default) to be warnings, or to be ignored." +msgstr "" + +#: ../fdroidserver/common.py +msgid "git svn clone failed" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "gzip file archive" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "ignored explicit argument %r" +msgstr "" + +#: ../fdroidserver/index.py +msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + +#: ../fdroidserver/index.py +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "integer" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid %(type)s value: %(value)r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid choice: %(value)r (choose from %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid conflict_resolution value: %r" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgstr "" + +#: ../fdroidserver/common.py +msgid "ipfs_cid not found, skipping CIDv1 generation" +msgstr "" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be an absolute path!" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be directory, not a file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "mirror '%s' does not end with 'fdroid'!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "mutually exclusive arguments must be optional" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "next {name} cache update due in {time}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "no \"icon\" in {appid}" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "no APK supplied" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "no such option: %s" +msgstr "" + +#: ../fdroidserver/__main__.py +msgid "no version info found!" +msgstr "" + +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "not allowed with argument %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "one of the arguments %s is required" +msgstr "" + +#: ../fdroidserver/common.py ../fdroidserver/index.py +msgid "only accepts strings, lists, and tuples" +msgstr "" + +#: ../fdroidserver/install.py +#, python-format +msgid "option %s: If you really want to install all the signed apps, use --all" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "option %s: invalid %s value: %r" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +#, python-format +msgid "option %s: invalid choice: %r (choose from %s)" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option -%s not recognized" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option -%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s must not have an argument" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s not a unique prefix" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s not recognized" +msgstr "" + +#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py +#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py +#: /usr/lib/python3.11/getopt.py +#, python-format +msgid "option --%s requires argument" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +msgid "optional arguments" +msgstr "" + +#: /usr/lib/python3.11/argparse.py +msgid "options" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "overwriting existing {path}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +msgid "positional arguments" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "process log deploy {path} to {dest} failed!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgstr "" + +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "" + +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "" + +#: ../fdroidserver/metadata.py +msgid "ruamel.yaml not installed, can not write metadata." +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd sync indexes {path} to {url} and delete" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "scanner cache is malformed! You can clear it with: '{clear}'" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "shared library" +msgstr "" + +#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/optparse.py +msgid "show program's version number and exit" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py +#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py +#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +msgid "show this help message and exit" +msgstr "" + +#: ../fdroidserver/signatures.py +msgid "signed APK, either a file-path or HTTPS URL." +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: log content is empty" +msgstr "" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: not enabled in config" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "skipping source tarball: {path}" +msgstr "" + +#: ../fdroidserver/lint.py +msgid "srclibs missing name and/or @" +msgstr "" + +#: ../fdroidserver/scanner.py +msgid "static library" +msgstr "" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "the following arguments are required: %s" +msgstr "" + +#: ../fdroidserver/install.py +msgid "true" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unexpected option string: %s" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py +#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unrecognized arguments: %s" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "unsafe permissions on '{config_file}' (should be 0600)!" +msgstr "" + +#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid +#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py +#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +msgid "usage: " +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "using Apache libcloud to sync with {url}" +msgstr "" + +#: ../fdroidserver/deploy.py +msgid "virustotal.com is rate limiting, waiting to retry..." +msgstr "" + +#: ../fdroidserver/install.py +msgid "yes" +msgstr "" + +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "{0} app, {1} key aliases" +msgid_plural "{0} apps, {1} key aliases" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} ({appid}) has no metadata!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using application ID instead." +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android application ID!" +msgstr "" + +#: ../fdroidserver/metadata.py ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Java Package Name!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{appid} is missing {name}" +msgstr "" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: Unknown extlib {path} in build '{versionName}'" +msgstr "" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "{appid}: no builds specified, running on current source state" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be an integer, found: {value}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{file} is blank or corrupt!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{oldfile} is deprecated, use {newfile}" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "{path} already exists, ignoring import results!" +msgstr "" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "{path} does not exist! Create it by running:" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} is zero size!" +msgstr "" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} more than 200MB, manually upload: {url}" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{url} does not end with \"fdroid\", check the URL path!" +msgstr "" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "{url} does not start with \"http\"!" +msgstr "" + +#: ../fdroidserver/build.py +msgid "{} build failed" +msgid_plural "{} builds failed" +msgstr[0] "" +msgstr[1] "" + +#: ../fdroidserver/build.py +msgid "{} build succeeded" +msgid_plural "{} builds succeeded" +msgstr[0] "" +msgstr[1] "" From f76114ba5c1a77658a8e40a6be62c2a0196a3f5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristoffer=20Grundstr=C3=B6m?= Date: Mon, 17 Mar 2025 22:44:43 +0100 Subject: [PATCH 1944/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Swedi?= =?UTF-8?q?sh=20(sv)=20by=20Kristoffer=20Grundstr=C3=B6m=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 12.2% (75 of 612 strings) Co-authored-by: Kristoffer Grundström Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sv/ Translation: F-Droid/F-Droid Server --- locale/sv/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index 15e89445..8d968494 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -3,14 +3,14 @@ # Hans-Christoph Steiner , 2020. # Elias Mårtenson , 2021. # Joel A , 2021. -# Kristoffer Grundström , 2021, 2024. +# Kristoffer Grundström , 2021, 2024, 2025. # "P.O" , 2023. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" -"PO-Revision-Date: 2024-04-24 08:39+0000\n" +"PO-Revision-Date: 2025-01-15 15:19+0000\n" "Last-Translator: Kristoffer Grundström \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.5.1-dev\n" +"X-Generator: Weblate 5.10-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -122,12 +122,12 @@ msgstr "%r kan inte kallas" #: ../fdroidserver/signindex.py #, python-format msgid "%s did not produce a dict!" -msgstr "" +msgstr "%s producerade inte en dict!" #: ../fdroidserver/signindex.py #, python-format msgid "%s has bad SHA-256: %s" -msgstr "" +msgstr "%s har felaktig SHA-256: %s" #: ../fdroidserver/lint.py #, python-format From 560d7fd2001bbd3ef7b8a106421f6f65869e421f Mon Sep 17 00:00:00 2001 From: Marcus skoding Date: Mon, 17 Mar 2025 22:44:43 +0100 Subject: [PATCH 1945/2116] Translated using Weblate: Swedish (sv) by Marcus skoding Currently translated at 12.5% (77 of 612 strings) Translated using Weblate: Swedish (sv) by Marcus skoding Currently translated at 12.2% (75 of 612 strings) Co-authored-by: Marcus skoding Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sv/ Translation: F-Droid/F-Droid Server --- locale/sv/LC_MESSAGES/fdroidserver.po | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index 8d968494..d10c9da8 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -5,13 +5,14 @@ # Joel A , 2021. # Kristoffer Grundström , 2021, 2024, 2025. # "P.O" , 2023. +# Marcus skoding , 2025. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" -"PO-Revision-Date: 2025-01-15 15:19+0000\n" -"Last-Translator: Kristoffer Grundström \n" +"PO-Revision-Date: 2025-01-16 22:54+0000\n" +"Last-Translator: Marcus skoding \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" @@ -34,6 +35,8 @@ msgid "" "\n" "{path} encoded for the DEBUG_KEYSTORE secret variable:" msgstr "" +"\n" +"{path} kodad för den hemliga variabeln DEBUG_KEYSTORE:" #: ../fdroidserver/lint.py #, python-format @@ -99,7 +102,7 @@ msgstr "%(prog)s: fel: %(message)s\n" #: ../fdroidserver/publish.py #, python-format msgid "%d APKs failed to be signed or verified!" -msgstr "" +msgstr "%d APK:er kunde inte signeras eller verifieras!" #: ../fdroidserver/scanner.py #, python-format From 29487d8c3adec61753789987fb0d84a543b4e775 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristoffer=20Grundstr=C3=B6m?= Date: Mon, 17 Mar 2025 22:44:43 +0100 Subject: [PATCH 1946/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Swedi?= =?UTF-8?q?sh=20(sv)=20by=20Kristoffer=20Grundstr=C3=B6m=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 12.5% (77 of 612 strings) Co-authored-by: Kristoffer Grundström Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sv/ Translation: F-Droid/F-Droid Server --- locale/sv/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index d10c9da8..d9cd5d82 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -12,7 +12,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" "PO-Revision-Date: 2025-01-16 22:54+0000\n" -"Last-Translator: Marcus skoding \n" +"Last-Translator: Kristoffer Grundström \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" @@ -89,8 +89,8 @@ msgstr "\"{url}\" är inte en giltig URL!" #, python-format msgid "%(option)s option requires %(number)d argument" msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(option)s-valet kräver %(number)d argument" +msgstr[1] "%(option)s-valen kräver %(number)d argument" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py From c62094274c287708caa728f0d06645eccb98d337 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 17 Mar 2025 22:44:44 +0100 Subject: [PATCH 1947/2116] Translated using Weblate: Tamil (ta) by Hans-Christoph Steiner Currently translated at 98.6% (604 of 612 strings) Co-authored-by: Hans-Christoph Steiner Co-authored-by: Hans-Christoph Steiner Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ta/ Translation: F-Droid/F-Droid Server --- locale/ta/LC_MESSAGES/fdroidserver.po | 67 ++++++++++++++------------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/locale/ta/LC_MESSAGES/fdroidserver.po b/locale/ta/LC_MESSAGES/fdroidserver.po index acb9cedb..2ee8356c 100644 --- a/locale/ta/LC_MESSAGES/fdroidserver.po +++ b/locale/ta/LC_MESSAGES/fdroidserver.po @@ -3,13 +3,14 @@ # K.B.Dharun Krishna , 2022. # Naveen , 2024. # தமிழ்நேரம் , 2024. +# Hans-Christoph Steiner , 2025. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2024-12-11 14:37+0100\n" -"PO-Revision-Date: 2024-12-25 17:10+0000\n" -"Last-Translator: தமிழ்நேரம் \n" +"PO-Revision-Date: 2025-01-20 14:04+0000\n" +"Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tamil \n" "Language: ta\n" "MIME-Version: 1.0\n" @@ -353,12 +354,12 @@ msgstr "அடிப்படை முகவரி கண்ணாடிக் #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" -msgstr "கிளை '{branch}' '{versionName}'கட்டமைப்பில் உறுதிமொழியாக பயன்படுத்தப்படுகிறது" +msgstr "கிளை '{branch}' '{versionName}'கட்டமைப்பில் உறுதிமொழியாக பயன்படுத்தப்படுகிறது" #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in srclib '{srclib}'" -msgstr "கிளை '{branch}' '{srclib}'இல் உறுதிமொழியாக பயன்படுத்தப்படுகிறது" +msgstr "கிளை '{branch}' '{srclib}'இல் உறுதிமொழியாக பயன்படுத்தப்படுகிறது" #: ../fdroidserver/update.py #, python-brace-format @@ -426,7 +427,7 @@ msgstr "பயன்பாடுகளுக்கான புதுப்ப #: ../fdroidserver/update.py #, python-brace-format msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" -msgstr "{appid} க்கான காப்பகத்தை சரிபார்க்கிறது- பயன்பாடுகள்: {integer}, காப்புபதிப்புகள்: {keep}, காப்பகங்கள்: {arch}" +msgstr "{appid} க்கான காப்பகத்தை சரிபார்க்கிறது- பயன்பாடுகள்: {integer}, காப்புபதிப்புகள்: {keep}, காப்பகங்கள்: {arch}" #: ../fdroidserver/update.py msgid "Clean update - don't uses caches, reprocess all APKs" @@ -785,7 +786,7 @@ msgstr "APK தகவல்களைப் பெறுவதில் தோல #: ../fdroidserver/update.py #, python-brace-format msgid "Failed to get APK information, skipping {path}" -msgstr "APK தகவல்களைப் பெறுவதில் தோல்வி, {path}யைத் தவிர்ப்பது}" +msgstr "APK தகவல்களைப் பெறுவதில் தோல்வி, {path}யைத் தவிர்ப்பது" #: ../fdroidserver/update.py msgid "Failed to get APK signing key fingerprint" @@ -1007,7 +1008,7 @@ msgstr "%s@ %s இலிருந்து மேனிலை தரவு உ #: ../fdroidserver/metadata.py #, python-brace-format msgid "Including metadata from {path}" -msgstr "{பாதை இருந்து இலிருந்து மேனிலை தரவு உட்பட" +msgstr "{path} இருந்து இலிருந்து மேனிலை தரவு உட்பட" #: ../fdroidserver/common.py msgid "Initialising submodules" @@ -1237,7 +1238,7 @@ msgstr "பொருந்தக்கூடிய குறிச்சொற #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "இயல்புநிலை (3) ஐப் பயன்படுத்தி குறைந்தபட்ச SDK பதிப்பு {0 at இல் காணப்படவில்லை." +msgstr "இயல்புநிலை (3) ஐப் பயன்படுத்தி குறைந்தபட்ச SDK பதிப்பு {0} at இல் காணப்படவில்லை." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1267,7 +1268,7 @@ msgstr "கையொப்பமிடப்பட்ட வெளியீட #: ../fdroidserver/common.py #, python-brace-format msgid "No signing certificates found in {path}" -msgstr "{path} இல் கையொப்பமிடும் சான்றிதழ்கள் இல்லை}" +msgstr "{path} இல் கையொப்பமிடும் சான்றிதழ்கள் இல்லை" #: ../fdroidserver/common.py #, python-format @@ -1276,9 +1277,9 @@ msgstr "அத்தகைய தொகுப்பு இல்லை: %s" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" -msgstr "பயன்பாட்டிற்கு அத்தகைய பதிப்பு குறியீடு {பதிப்பு குறியீடு {versionCode}" +msgstr "பயன்பாட்டிற்கு அத்தகைய பதிப்பு குறியீடு பதிப்பு குறியீடு {versionCode}" #: ../fdroidserver/checkupdates.py msgid "No tags found" @@ -1311,7 +1312,7 @@ msgstr "இப்போது இவற்றை config.yml இல் அமை #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" msgstr "OBB கோப்பில் எந்த APK ஐ விட புதிய பதிப்பு குறியீடு ({முழு எண்) உள்ளது:" @@ -1379,9 +1380,9 @@ msgid "Overall license of the project." msgstr "திட்டத்தின் ஒட்டுமொத்த உரிமம்." #: ../fdroidserver/index.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "மெட்டாடேட்டாவிலிருந்து {apkfilename in இல் வெற்று பதிப்பு பெயர்:{apkfilename}" +msgstr "மெட்டாடேட்டாவிலிருந்து {apkfilename} இல் வெற்று பதிப்பு பெயர்:{version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format @@ -1536,7 +1537,7 @@ msgstr "தற்போதுள்ள ஒன்று சரியாகத் #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" -msgstr "வழங்கப்பட்ட பிழைத்திருத்தத்துடன் {apkfilename இருந்து ராசினாமா" +msgstr "வழங்கப்பட்ட பிழைத்திருத்தத்துடன் {apkfilename} இருந்து ராசினாமா" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" @@ -1583,9 +1584,9 @@ msgid "Running wget in {path}" msgstr "{path} இல் wget ஐ இயக்குகிறது" #: ../fdroidserver/index.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "{Url of இன் SHA-256 நுழைவு பொருந்தவில்லை!" +msgstr "{url} of இன் SHA-256 நுழைவு பொருந்தவில்லை!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." @@ -1675,7 +1676,7 @@ msgstr "தவறான கையொப்பத்துடன் '{apkfilename #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "ரெப்போ மிகப் பெரியதாக இருப்பதால் அறிவிலிஆய்வு பக்கங்களைத் தவிர்ப்பது (>%. 2fgb)!" +msgstr "ரெப்போ மிகப் பெரியதாக இருப்பதால் அறிவிலிஆய்வு பக்கங்களைத் தவிர்ப்பது (>%.2fgb)!" #: ../fdroidserver/update.py #, python-brace-format @@ -1685,7 +1686,7 @@ msgstr "{appid}க்கான குறியீட்டு தலைமுற #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" -msgstr "தவறான கையொப்பத்துடன் {apkfilename ஐத் தவிர்ப்பது!" +msgstr "தவறான கையொப்பத்துடன் {apkfilename} ஐத் தவிர்ப்பது!" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1711,7 +1712,7 @@ msgstr "இயல்பை விட அதிகமான தகவல்கள #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" -msgstr "{Apkfilename இருந்து இலிருந்து மர்ம கையொப்பத்தை அகற்றுதல்" +msgstr "{apkfilename} இருந்து இலிருந்து மர்ம கையொப்பத்தை அகற்றுதல்" #: ../fdroidserver/lint.py #, python-format @@ -1852,7 +1853,7 @@ msgstr "அறியப்படாத விதிவிலக்கு கண #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" msgstr "அறியப்படாத கோப்பு '{filename}'" @@ -2039,7 +2040,7 @@ msgid "Using androguard from \"{path}\"" msgstr "Using androguard இருந்து \"{path}\"" #: ../fdroidserver/metadata.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" msgstr "{பாதை of இன் உள்ளடக்கங்களுக்கு பதிலாக வெற்று அகராதியைப் பயன்படுத்துதல்!" @@ -2190,7 +2191,7 @@ msgstr "உரையாடல் %(argument_name)s: %(message)s" #: ../fdroidserver/nightly.py msgid "attempting bare SSH connection to test deploy key:" -msgstr "சோதனை வரிசைப்படுத்துவதற்கு வெற்று பாஓடு இணைப்பை முயற்சிக்கிறது." +msgstr "சோதனை வரிசைப்படுத்துவதற்கு வெற்று பாஓடு இணைப்பை முயற்சிக்கிறது:" #: ../fdroidserver/common.py msgid "can not parse scrlib spec (not a string): '{}'" @@ -2199,7 +2200,7 @@ msgstr "ச்க்ர்லிப் ச்பெக்கை அலச மு #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "' %(கோப்பு பெயர்) கள்' ஐ திறக்க முடியாது: %(filename)s" +msgstr "' %(error)s கள்' ஐ திறக்க முடியாது: %(filename)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" @@ -2398,14 +2399,14 @@ msgstr "முழு எண்" #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" -msgstr "தவறான %(வகை) மதிப்பு: %(மதிப்பு) r" +msgstr "தவறான %(type)s மதிப்பு: %(value)r" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" -msgstr "தவறான தேர்வு: %(மதிப்பு) ஆர் ( %(choices)s இலிருந்து தேர்வு செய்யவும்)" +msgstr "தவறான தேர்வு: %(value)r ஆர் ( %(choices)s இலிருந்து தேர்வு செய்யவும்)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2419,7 +2420,7 @@ msgstr "தவறான மோதல்_ -ரசல் மதிப்பு: %r #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" -msgstr "தவறான விருப்பத்தேர்வு சரம் %(option) ஆர்: ஒரு எழுத்துக்குறி %(முன்னொட்டு_சார்ச்) ஆர் உடன் தொடங்க வேண்டும்" +msgstr "தவறான விருப்பத்தேர்வு சரம் %(option)r ஆர்: ஒரு எழுத்துக்குறி %(prefix_chars)r ஆர் உடன் தொடங்க வேண்டும்" #: ../fdroidserver/common.py msgid "ipfs_cid not found, skipping CIDv1 generation" @@ -2467,7 +2468,7 @@ msgstr "அடுத்து {name} கேச் புதுப்பிப் #: ../fdroidserver/mirror.py #, python-brace-format msgid "no \"icon\" in {appid}" -msgstr "{appid in இல் \"படவுரு\" இல்லை" +msgstr "{appid} in இல் \"படவுரு\" இல்லை" #: ../fdroidserver/signatures.py msgid "no APK supplied" @@ -2709,7 +2710,7 @@ msgstr "எதிர்பாராத விருப்ப சரம்: %s" #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" -msgstr "அறியப்படாத பாகுபடுத்தி %(parser_name) r (தேர்வுகள்: %(choices)s)" +msgstr "அறியப்படாத பாகுபடுத்தி %(parser_name)r (தேர்வுகள்: %(choices)s)" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2730,9 +2731,9 @@ msgid "usage: " msgstr "பயன்பாடு: " #: ../fdroidserver/deploy.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "using Apache libcloud to sync with {url}" -msgstr "{url both உடன் ஒத்திசைக்க அப்பாச்சி லிப்குட்டைப் பயன்படுத்துதல்" +msgstr "{url} both உடன் ஒத்திசைக்க அப்பாச்சி லிப்குட்டைப் பயன்படுத்துதல்" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." @@ -2755,7 +2756,7 @@ msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) மேனிலை தரவு இல்லை!" #: ../fdroidserver/update.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" msgstr "{apkfilename the பல {apkfilename} கோப்புகளைக் கொண்டுள்ளது, முதன்மை விசை சுரண்டல் போல் தெரிகிறது!" @@ -2878,7 +2879,7 @@ msgstr "{path} என்பது பட்டியல் அல்ல, ஆன #: ../fdroidserver/common.py #, python-brace-format msgid "{path} is not {expected_type}, but a {datatype}!" -msgstr "{path} என்பது {எதிர்பார்க்கப்பட்ட_ வகை அல்ல, ஆனால் ஒரு {expected_type}!" +msgstr "{path} என்பது {expected_type} அல்ல, ஆனால் ஒரு {datatype}!" #: ../fdroidserver/update.py #, python-brace-format From 273b763aed21c0a86fb80c0847cd6149142d9e0c Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Mon, 17 Mar 2025 22:44:45 +0100 Subject: [PATCH 1948/2116] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ Translation: F-Droid/F-Droid Server --- locale/nn/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/pa/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/sv/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/ta/LC_MESSAGES/fdroidserver.po | 7 ++++++- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/locale/nn/LC_MESSAGES/fdroidserver.po b/locale/nn/LC_MESSAGES/fdroidserver.po index 2404697f..8506a639 100644 --- a/locale/nn/LC_MESSAGES/fdroidserver.po +++ b/locale/nn/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3.0-3-g4ba7b5c9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2024-11-26 10:54+0000\n" "Last-Translator: Bård Sigurd Møller \n" "Language-Team: Norwegian Nynorsk \n" @@ -2136,6 +2136,11 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/pa/LC_MESSAGES/fdroidserver.po b/locale/pa/LC_MESSAGES/fdroidserver.po index 19d66a92..f0fdeffc 100644 --- a/locale/pa/LC_MESSAGES/fdroidserver.po +++ b/locale/pa/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3.3\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -2135,6 +2135,11 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index d9cd5d82..94097a00 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2025-01-16 22:54+0000\n" "Last-Translator: Kristoffer Grundström \n" "Language-Team: Swedish \n" @@ -2145,6 +2145,11 @@ msgstr "tvetydigt alternativ: %(option)s kunde motsvara %(matches)s" msgid "ambiguous option: %s (%s?)" msgstr "tvetydig option: %s (%s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" diff --git a/locale/ta/LC_MESSAGES/fdroidserver.po b/locale/ta/LC_MESSAGES/fdroidserver.po index 2ee8356c..598748de 100644 --- a/locale/ta/LC_MESSAGES/fdroidserver.po +++ b/locale/ta/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-01-21 17:02+0100\n" "PO-Revision-Date: 2025-01-20 14:04+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tamil \n" @@ -2154,6 +2154,11 @@ msgstr "தெளிவற்ற விருப்பம்: %(option)s %(match msgid "ambiguous option: %s (%s?)" msgstr "தெளிவற்ற விருப்பம்: %s ( %s?)" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "apksigner கண்டுபிடிக்கப்படவில்லை! நவீன APK களை கையொப்பமிடவோ சரிபார்க்கவோ முடியாது" From 65b015302d48a6e8cc9189e57107adced1517844 Mon Sep 17 00:00:00 2001 From: Ricky Tigg Date: Mon, 17 Mar 2025 22:44:48 +0100 Subject: [PATCH 1949/2116] Translated using Weblate: Finnish (fi) by Ricky Tigg Currently translated at 5.0% (31 of 613 strings) Co-authored-by: Ricky Tigg Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fi/ Translation: F-Droid/F-Droid Server --- locale/fi/LC_MESSAGES/fdroidserver.po | 67 ++++++++++++++------------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index f59fec0f..ba450410 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -2,20 +2,21 @@ # This file is put in the public domain. # A , 2020. # Kaantaja , 2021. +# Ricky Tigg , 2025. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-01-21 17:02+0100\n" -"PO-Revision-Date: 2021-08-23 01:29+0000\n" -"Last-Translator: Kaantaja \n" +"PO-Revision-Date: 2025-01-31 14:19+0000\n" +"Last-Translator: Ricky Tigg \n" "Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8.1-dev\n" +"X-Generator: Weblate 5.10-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -43,7 +44,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "" +msgstr "\"{apkfilename}\" on jo asennettu kohteeseen {dev}." #: ../fdroidserver/update.py #, python-brace-format @@ -321,7 +322,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Archiving {apkfilename} with invalid signature!" -msgstr "" +msgstr "Arkistoidaan {apkfilename} virheellisellä allekirjoituksella!" #: ../fdroidserver/lint.py msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." @@ -751,7 +752,7 @@ msgstr "" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Failed fetching signatures for '{apkfilename}': {error}" -msgstr "" +msgstr "Allekirjoitusten nouto '{apkfilename}':lle epäonnistui: {error}" #: ../fdroidserver/update.py #, python-brace-format @@ -785,7 +786,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-brace-format msgid "Failed to install '{apkfilename}' on {dev}: {error}" -msgstr "" +msgstr "'{apkfilename}':n asentaminen kohteelle {dev} epäonnistui: {error}" #: ../fdroidserver/common.py msgid "Failed to sign application" @@ -799,7 +800,7 @@ msgstr "" #: ../fdroidserver/signatures.py #, python-brace-format msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" -msgstr "" +msgstr "Haetut allekirjoitukset kohteelle '{apkfilename}' -> '{sigdir}'" #: ../fdroidserver/update.py #, python-brace-format @@ -882,17 +883,17 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" -msgstr "" +msgstr "{apkfilename} löytyi {url}:lla" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} problems in {filename}" -msgstr "" +msgstr "Löytyi {count} ongelmaa {filename}:ssa" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Found {count} warnings in {filename}" -msgstr "" +msgstr "Löytyi {count} varoitusta {filename}:ssa" #: ../fdroidserver/update.py #, python-brace-format @@ -972,7 +973,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Ignoring stale cache data for {apkfilename}" -msgstr "" +msgstr "Ohitetaan vanhentuneet välimuistitiedot kohteelle {apkfilename}" #: ../fdroidserver/update.py msgid "Include APKs that are signed with disabled algorithms like MD5" @@ -1020,7 +1021,7 @@ msgstr "" #: ../fdroidserver/install.py #, python-brace-format msgid "Installing '{apkfilename}' on {dev}..." -msgstr "" +msgstr "Asennetaan '{apkfilename}' kohteelle {dev}..." #: ../fdroidserver/__main__.py msgid "Interact with the repo HTTP server" @@ -1128,7 +1129,7 @@ msgstr "" #: ../fdroidserver/build.py #, python-brace-format msgid "Keeping failed build \"{apkfilename}\"" -msgstr "" +msgstr "Säilytetään epäonnistunut koonti \"{apkfilename}\"" #: ../fdroidserver/init.py msgid "Keystore for signing key:\t" @@ -1308,7 +1309,7 @@ msgstr "" #: ../fdroidserver/update.py msgid "OBB filename must start with \"main.\" or \"patch.\":" -msgstr "" +msgstr "OBB-tiedoston nimen alussa on oltava \"main\". tai \"patch\".:" #: ../fdroidserver/update.py msgid "OBB's packagename does not match a supported APK:" @@ -1372,7 +1373,7 @@ msgstr "" #: ../fdroidserver/index.py #, python-brace-format msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" -msgstr "" +msgstr "Tyhjän versionName:n ohittaminen kohteessa {apkfilename} metatiedoista: {version}" #: ../fdroidserver/import_subcommand.py #, python-brace-format @@ -1430,7 +1431,7 @@ msgstr "" #: ../fdroidserver/publish.py ../fdroidserver/update.py #, python-brace-format msgid "Processing {apkfilename}" -msgstr "" +msgstr "Käsitellään {apkfilename}" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format @@ -1483,17 +1484,17 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" -msgstr "" +msgstr "Kohteen packageName/versionCode/versionName lukeminen epäonnistui, APK virheellinen: '{apkfilename}'" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" -msgstr "" +msgstr "Kohteen packageName/versionCode/versionName lukeminen epäonnistui, APK virheellinen: '{apkfilename}'" #: ../fdroidserver/update.py #, python-brace-format msgid "Reading {apkfilename} from cache" -msgstr "" +msgstr "Luetaan {apkfilename} välimuistista" #: ../fdroidserver/build.py msgid "Refresh and cache scanner rules and signatures from the network" @@ -1527,7 +1528,7 @@ msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" -msgstr "" +msgstr "Allekirjoitetaan {apkfilename} uudelleen toimitetulla debug.keystore:lla" #: ../fdroidserver/update.py msgid "Resize all the icons exceeding the max pixel size and exit" @@ -1661,7 +1662,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping '{apkfilename}' with invalid signature!" -msgstr "" +msgstr "Ohitetaan '{apkfilename}' virheellisellä allekirjoituksella!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format @@ -1676,7 +1677,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Skipping {apkfilename} with invalid signature!" -msgstr "" +msgstr "Ohitetaan {apkfilename} virheellisellä allekirjoituksella!" #: ../fdroidserver/scanner.py #, python-brace-format @@ -1702,7 +1703,7 @@ msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "Stripping mystery signature from {apkfilename}" -msgstr "" +msgstr "Salaperäisen allekirjoituksen poistaminen kohteesta {apkfilename}" #: ../fdroidserver/lint.py #, python-format @@ -1838,7 +1839,7 @@ msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" -msgstr "" +msgstr "Tuntematon tiedosto '{filename}' koonnissa '{versionName}'" #: ../fdroidserver/metadata.py #, python-format @@ -1951,12 +1952,12 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to androidobservatory.org" -msgstr "" +msgstr "Ulosladataan {apkfilename}:a osoitteeseen androidobservatory.org" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Uploading {apkfilename} to virustotal" -msgstr "" +msgstr "Ulosladataan {apkfilename} virustotaliin" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2188,7 +2189,7 @@ msgstr "" #: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" -msgstr "" +msgstr "%(filename)s:a ei voi avata: %(error)s" #: ../fdroidserver/scanner.py msgid "can't open non-https url: '{};" @@ -2280,7 +2281,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" -msgstr "" +msgstr "Poistetaan: repo/{apkfilename}" #: ../fdroidserver/scanner.py msgid "dependency file without lock" @@ -2588,7 +2589,7 @@ msgstr "" #: ../fdroidserver/signatures.py #, python-brace-format msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" -msgstr "" +msgstr "kieltäydy lataamisesta suojaamattoman HTTP-yhteyden kautta; käytä HTTPS:a tai määritä '--no-https-check': {apkfilename}" #: ../fdroidserver/index.py #, python-format @@ -2741,17 +2742,17 @@ msgstr[1] "" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} ({appid}) has no metadata!" -msgstr "" +msgstr "{apkfilename}:lla ({appid}) ei ole metatietoja!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" +msgstr "{apkfilename} sisältää useita {name} tiedostoja, näyttää Pääavaimen hyväksikäytöltä!" #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " -msgstr "" +msgstr "{apkfilename}:n AndroidManifest.xml:ssa on väärä päivämäärä: " #: ../fdroidserver/update.py #, python-brace-format From 4448aeb550e9f169f736d4225e46407b4bad94e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristoffer=20Grundstr=C3=B6m?= Date: Mon, 17 Mar 2025 22:44:50 +0100 Subject: [PATCH 1950/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Swedi?= =?UTF-8?q?sh=20(sv)=20by=20Kristoffer=20Grundstr=C3=B6m=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 19.2% (118 of 613 strings) Co-authored-by: Kristoffer Grundström Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sv/ Translation: F-Droid/F-Droid Server --- locale/sv/LC_MESSAGES/fdroidserver.po | 86 +++++++++++++-------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index 94097a00..f543fd67 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-01-21 17:02+0100\n" -"PO-Revision-Date: 2025-01-16 22:54+0000\n" +"PO-Revision-Date: 2025-03-17 21:44+0000\n" "Last-Translator: Kristoffer Grundström \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -19,7 +19,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.10-dev\n" +"X-Generator: Weblate 5.11-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -271,7 +271,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "Android AAR library" -msgstr "" +msgstr "AAR-bibliotek för Android" #: ../fdroidserver/scanner.py msgid "Android APK file" @@ -279,7 +279,7 @@ msgstr "Android APK-fil" #: ../fdroidserver/scanner.py msgid "Android DEX code" -msgstr "" +msgstr "DEX-kod för Android" #: ../fdroidserver/init.py #, python-brace-format @@ -366,7 +366,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Broken symlink: {path}" -msgstr "" +msgstr "Trasig symlink: {path}" #: ../fdroidserver/__main__.py msgid "Build a package from source" @@ -406,7 +406,7 @@ msgstr[1] "" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" -msgstr "" +msgstr "Kan inte skriva om \"{path}\"" #: ../fdroidserver/lint.py #, python-format @@ -450,7 +450,7 @@ msgstr "Kommandot '%s' känns inte igen.\n" #: ../fdroidserver/checkupdates.py msgid "Commit changes" -msgstr "" +msgstr "Skicka in ändringar" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" @@ -508,7 +508,7 @@ msgstr "" #: ../fdroidserver/checkupdates.py msgid "Couldn't find package ID" -msgstr "" +msgstr "Kunde inte hitta paketets ID" #: ../fdroidserver/update.py msgid "Cowardily refusing to overwrite existing signing key setup!" @@ -575,7 +575,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" -msgstr "" +msgstr "Tar bort okänd fil: {path}" #: ../fdroidserver/lint.py #, python-format @@ -650,7 +650,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-format msgid "Downloading %s" -msgstr "" +msgstr "Hämtar %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." @@ -679,7 +679,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "FEL: %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -745,7 +745,7 @@ msgstr "" #: ../fdroidserver/__main__.py msgid "Extract signatures from APKs" -msgstr "" +msgstr "Extrahera signaturer från APK:er" #: ../fdroidserver/install.py msgid "F-Droid.apk could not be downloaded from any known source!" @@ -826,7 +826,7 @@ msgstr "" #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" -msgstr "" +msgstr "Förbjudna HTML-taggar" #: ../fdroidserver/build.py msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." @@ -1023,7 +1023,7 @@ msgstr "Installera byggda paket på enheter" #: ../fdroidserver/install.py #, python-format msgid "Installing %s..." -msgstr "" +msgstr "Installerar %s..." #: ../fdroidserver/install.py #, python-brace-format @@ -1036,7 +1036,7 @@ msgstr "Interagera med förrådets HTTP-servern" #: ../fdroidserver/update.py msgid "Invalid APK" -msgstr "" +msgstr "Ogiltig APK" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -1066,7 +1066,7 @@ msgstr "" #: ../fdroidserver/metadata.py #, python-format msgid "Invalid boolean '%s'" -msgstr "" +msgstr "Ogiltig booleansk '%s'" #: ../fdroidserver/lint.py msgid "Invalid bulleted list" @@ -1114,7 +1114,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "Java JAR file" -msgstr "" +msgstr "JAR-file för Java" #: ../fdroidserver/mirror.py ../fdroidserver/publish.py #: ../fdroidserver/update.py @@ -1227,7 +1227,7 @@ msgstr "" #: ../fdroidserver/import_subcommand.py msgid "No information found." -msgstr "" +msgstr "Ingen information hittades." #: ../fdroidserver/checkupdates.py msgid "No matching tags found" @@ -1252,7 +1252,7 @@ msgstr "" #: ../fdroidserver/common.py msgid "No packages specified" -msgstr "" +msgstr "Inga paket angavs" #: ../fdroidserver/install.py #, python-format @@ -1281,7 +1281,7 @@ msgstr "" #: ../fdroidserver/checkupdates.py msgid "No tags found" -msgstr "" +msgstr "Inga taggar hittades" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" @@ -1297,7 +1297,7 @@ msgstr "" #: ../fdroidserver/signindex.py msgid "Nothing to do" -msgstr "" +msgstr "Inget att göra" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -1443,7 +1443,7 @@ msgstr "" #: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py #, python-brace-format msgid "Processing {appid}" -msgstr "" +msgstr "Behandlar {appid}" #: ../fdroidserver/update.py msgid "Produce human-readable XML/JSON for index files" @@ -1486,7 +1486,7 @@ msgstr "Läs alla metadatafiler och avsluta" #: ../fdroidserver/common.py #, python-brace-format msgid "Reading '{config_file}'" -msgstr "" +msgstr "Läser '{config_file}'" #: ../fdroidserver/common.py #, python-brace-format @@ -1513,12 +1513,12 @@ msgstr "" #: ../fdroidserver/common.py msgid "Removing specified files" -msgstr "" +msgstr "Tar bort angivna filer" #: ../fdroidserver/update.py #, python-brace-format msgid "Removing {path}\"" -msgstr "" +msgstr "Tar bort {path}''" #: ../fdroidserver/update.py msgid "Rename APK files that do not match package.name_123.apk" @@ -1557,7 +1557,7 @@ msgstr "Skriv om alla metadatafiler" #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Rewriting '{appid}'" -msgstr "" +msgstr "Skriver om '{appid}'" #: ../fdroidserver/checkupdates.py msgid "Run on git repo that has uncommitted changes" @@ -1689,7 +1689,7 @@ msgstr "" #: ../fdroidserver/scanner.py #, python-brace-format msgid "Skipping {appid}: disabled" -msgstr "" +msgstr "Hoppar över {appid}: avstängd" #: ../fdroidserver/deploy.py msgid "Specify a local folder to sync the repo to" @@ -1913,7 +1913,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-format msgid "Unzipping to %s" -msgstr "" +msgstr "Packar upp till %s" #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" @@ -2019,7 +2019,7 @@ msgstr "" #: ../fdroidserver/common.py msgid "Using JAR Signature" -msgstr "" +msgstr "Använder JAR-signatur" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" @@ -2114,7 +2114,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "ZIP file archive" -msgstr "" +msgstr "ZIP-filarkiv" #: ../fdroidserver/install.py #, python-brace-format @@ -2227,7 +2227,7 @@ msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "cloning {url}" -msgstr "" +msgstr "klonar {url}" #: ../fdroidserver/__main__.py msgid "commands from plugin modules:" @@ -2278,7 +2278,7 @@ msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" -msgstr "" +msgstr "skapade {path}" #: ../fdroidserver/checkupdates.py #, python-brace-format @@ -2288,7 +2288,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "deleting: repo/{apkfilename}" -msgstr "" +msgstr "tar bort: repo/{apkfilename}" #: ../fdroidserver/scanner.py msgid "dependency file without lock" @@ -2308,7 +2308,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "downloading '{}'" -msgstr "" +msgstr "hämtar '{}'" #: ../fdroidserver/scanner.py msgid "downloading scanner signatures from '{}' failed" @@ -2343,7 +2343,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" -msgstr "" +msgstr "ett argument förväntades" #: ../fdroidserver/__main__.py msgid "fdroid [] [-h|--help|--version|]" @@ -2367,7 +2367,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "gzip file archive" -msgstr "" +msgstr "gzip-filarkiv" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2388,7 +2388,7 @@ msgstr "" #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py #: /usr/lib/python3.11/optparse.py msgid "integer" -msgstr "" +msgstr "heltal" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2468,7 +2468,7 @@ msgstr "" #: ../fdroidserver/signatures.py msgid "no APK supplied" -msgstr "" +msgstr "ingen APK tillhandahölls" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2577,7 +2577,7 @@ msgstr "Alternativ" #: ../fdroidserver/nightly.py #, python-brace-format msgid "overwriting existing {path}" -msgstr "" +msgstr "skriver över befintlig {path}" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2638,7 +2638,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "shared library" -msgstr "" +msgstr "delat bibliotek" #: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py #: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py @@ -2677,7 +2677,7 @@ msgstr "" #: ../fdroidserver/scanner.py msgid "static library" -msgstr "" +msgstr "statiskt bibliotek" #: ../fdroidserver/build.py #, python-brace-format @@ -2738,7 +2738,7 @@ msgstr "" #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "ja" #: ../fdroidserver/publish.py #, python-brace-format @@ -2896,7 +2896,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{path}: {error}" -msgstr "" +msgstr "{path}: {error}" #: ../fdroidserver/mirror.py #, python-brace-format From 6fbb2fec9c536a32bfd294700f99100e6be69011 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 19 Mar 2025 17:57:36 +0100 Subject: [PATCH 1951/2116] make -C locale update --- locale/ar/LC_MESSAGES/fdroidserver.po | 40 +++- locale/az/LC_MESSAGES/fdroidserver.po | 40 +++- locale/be/LC_MESSAGES/fdroidserver.po | 40 +++- locale/bg/LC_MESSAGES/fdroidserver.po | 40 +++- locale/bn/LC_MESSAGES/fdroidserver.po | 40 +++- locale/bo/LC_MESSAGES/fdroidserver.po | 40 +++- locale/ca/LC_MESSAGES/fdroidserver.po | 40 +++- locale/cs/LC_MESSAGES/fdroidserver.po | 40 +++- locale/cy/LC_MESSAGES/fdroidserver.po | 40 +++- locale/de/LC_MESSAGES/fdroidserver.po | 40 +++- locale/el/LC_MESSAGES/fdroidserver.po | 40 +++- locale/es/LC_MESSAGES/fdroidserver.po | 40 +++- locale/es_AR/LC_MESSAGES/fdroidserver.po | 40 +++- locale/es_MX/LC_MESSAGES/fdroidserver.po | 40 +++- locale/eu/LC_MESSAGES/fdroidserver.po | 40 +++- locale/fa/LC_MESSAGES/fdroidserver.po | 40 +++- locale/fdroidserver.pot | 42 +++- locale/fi/LC_MESSAGES/fdroidserver.po | 40 +++- locale/fr/LC_MESSAGES/fdroidserver.po | 40 +++- locale/fy/LC_MESSAGES/fdroidserver.po | 40 +++- locale/ga/LC_MESSAGES/fdroidserver.po | 40 +++- locale/he/LC_MESSAGES/fdroidserver.po | 40 +++- locale/hi/LC_MESSAGES/fdroidserver.po | 40 +++- locale/hu/LC_MESSAGES/fdroidserver.po | 40 +++- locale/id/LC_MESSAGES/fdroidserver.po | 40 +++- locale/it/LC_MESSAGES/fdroidserver.po | 40 +++- locale/ja/LC_MESSAGES/fdroidserver.po | 40 +++- locale/kab/LC_MESSAGES/fdroidserver.po | 40 +++- locale/ko/LC_MESSAGES/fdroidserver.po | 40 +++- locale/lv/LC_MESSAGES/fdroidserver.po | 237 ++++++++------------- locale/ml/LC_MESSAGES/fdroidserver.po | 40 +++- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 40 +++- locale/nl/LC_MESSAGES/fdroidserver.po | 40 +++- locale/nn/LC_MESSAGES/fdroidserver.po | 40 +++- locale/pa/LC_MESSAGES/fdroidserver.po | 40 +++- locale/pl/LC_MESSAGES/fdroidserver.po | 40 +++- locale/pt/LC_MESSAGES/fdroidserver.po | 40 +++- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 40 +++- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 40 +++- locale/ro/LC_MESSAGES/fdroidserver.po | 40 +++- locale/ru/LC_MESSAGES/fdroidserver.po | 40 +++- locale/sk/LC_MESSAGES/fdroidserver.po | 40 +++- locale/sq/LC_MESSAGES/fdroidserver.po | 40 +++- locale/sr/LC_MESSAGES/fdroidserver.po | 40 +++- locale/sv/LC_MESSAGES/fdroidserver.po | 40 +++- locale/sw/LC_MESSAGES/fdroidserver.po | 40 +++- locale/ta/LC_MESSAGES/fdroidserver.po | 40 +++- locale/tr/LC_MESSAGES/fdroidserver.po | 40 +++- locale/tzm/LC_MESSAGES/fdroidserver.po | 40 +++- locale/ug/LC_MESSAGES/fdroidserver.po | 40 +++- locale/uk/LC_MESSAGES/fdroidserver.po | 40 +++- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 40 +++- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 40 +++- 53 files changed, 2123 insertions(+), 196 deletions(-) diff --git a/locale/ar/LC_MESSAGES/fdroidserver.po b/locale/ar/LC_MESSAGES/fdroidserver.po index 8fc4ea14..22ec6e49 100644 --- a/locale/ar/LC_MESSAGES/fdroidserver.po +++ b/locale/ar/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2024-09-21 19:31+0000\n" "Last-Translator: Cool Man \n" "Language-Team: Arabic \n" @@ -519,6 +519,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -700,6 +705,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -722,6 +737,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -968,6 +988,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1339,6 +1364,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1735,6 +1764,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2830,6 +2863,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/az/LC_MESSAGES/fdroidserver.po b/locale/az/LC_MESSAGES/fdroidserver.po index bec25b01..6d1de70c 100644 --- a/locale/az/LC_MESSAGES/fdroidserver.po +++ b/locale/az/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2023-05-26 19:39+0000\n" "Last-Translator: Mehrab Poladov \n" "Language-Team: Azerbaijani \n" @@ -515,6 +515,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -696,6 +701,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -718,6 +733,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -964,6 +984,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1334,6 +1359,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1730,6 +1759,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2823,6 +2856,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/be/LC_MESSAGES/fdroidserver.po b/locale/be/LC_MESSAGES/fdroidserver.po index 24d1ec6b..beead901 100644 --- a/locale/be/LC_MESSAGES/fdroidserver.po +++ b/locale/be/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2024-01-21 00:08+0000\n" "Last-Translator: flac \n" "Language-Team: Belarusian \n" @@ -520,6 +520,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -701,6 +706,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -723,6 +738,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -969,6 +989,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1339,6 +1364,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1735,6 +1764,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2828,6 +2861,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/bg/LC_MESSAGES/fdroidserver.po b/locale/bg/LC_MESSAGES/fdroidserver.po index 4200f4cf..bc59842b 100644 --- a/locale/bg/LC_MESSAGES/fdroidserver.po +++ b/locale/bg/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2024-07-19 10:21+0000\n" "Last-Translator: 109247019824 \n" "Language-Team: Bulgarian \n" @@ -516,6 +516,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -697,6 +702,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -719,6 +734,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -965,6 +985,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1335,6 +1360,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1731,6 +1760,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2824,6 +2857,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index b5cd2ab5..27d7d039 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2021-02-12 09:48+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali \n" @@ -515,6 +515,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -696,6 +701,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -718,6 +733,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -964,6 +984,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1334,6 +1359,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1730,6 +1759,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2824,6 +2857,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index d3bccbe6..a6b7629d 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tibetan \n" @@ -523,6 +523,11 @@ msgstr "དྲྭ་སྣོད་གསར་པ་བཟོས་\"{name}\"" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "ཀློག་བཞིན་པ་། '{config_file}'" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "ཉིན་ཐོ་ཕྱོགས་དེབ་བཟོ་བཞིན་པ།" @@ -704,6 +709,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -728,6 +743,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -979,6 +999,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "རྒྱབ་ལྗོངས་ཡིག་ཆ་མེད་པའི་ཐུམ་སྒྲིལ་ཡ་ལན་མ་བྱས། " @@ -1355,6 +1380,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "PNG དང་ JPEG ཁོ་ན་བརྐོས་རིས་རྒྱབ་སྐྱོར་རྙེད་སོང་། :{path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "མཉེས་ཆས་གསོག་ཉར་ཁང་དང་མི་འདྲ་པ་ཡོད་པ་ཁོ་ནར་པར་ཤུས་བྱེད།" @@ -1751,6 +1780,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "ཚོད་ལྟའི་ཚུལ་-གལ་སྲིད་ཡིག་ཚགས་འདི་སྔོན་ཚོད་ནས་ཡོད་ནའང་། ཡིག་ཚགས་འདི་སྐབས་ཕྲལ་གྱི་ཕྱོགས་དེབ་ཁོ་ནའི་ནང་ལ་བླུགས་པ་དང་རྟག་ཏུ་ཐོན་སྐྱེད་བཟོས།." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2856,6 +2889,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index 7be0c013..8f5b7797 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2025-01-30 12:31+0000\n" "Last-Translator: pitroig \n" "Language-Team: Catalan \n" @@ -525,6 +525,11 @@ msgstr "S'ha creat el contenidor nou \"{name}\"" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "S'està creant \"{path}\" per configurar s3cmd." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "S'està llegint '{config_file}'" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "S'està creant el directori de registre" @@ -708,6 +713,16 @@ msgstr "ERROR: no s'admet l'amfitrió git \"%s\", els pedaços són benvinguts!" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "ERROR: {key} a {path} no és \"arxiu\" o \"dipòsit\"!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -732,6 +747,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "La variable d'entorn {var} de {configname} no està establerta!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "La variable d'entorn {var} de {configname} no està establerta!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "S'ha produït un error en desplegar 'github_releases', no hi ha {}. (Pot ser necessari executar `fdroid update` primer.)" @@ -978,6 +998,11 @@ msgstr "S'ignorarà l'entrada FUNDING.yml més llarga de 2048: %s" msgid "Ignoring bad element in manifest: %s" msgstr "S'ignorarà l'element incorrecte al manifest: %s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "{oldfile} és obsolet, utilitzeu {newfile}" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "S'ignorarà el paquet sense metadades: " @@ -1348,6 +1373,10 @@ msgstr "Un dels elements de configuració 'github_releases' manca el valor 'toke msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Només s'admeten PNG i JPEG per als gràfics, s'ha trobat: {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Imprimeix només les diferències amb la Play Store" @@ -1744,6 +1773,10 @@ msgstr "Mode d'actualització de les etiquetes utilitzat a git-svn, però el rep msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Mode de prova: posa la sortida només al directori tmp, i sempre construeix, fins i tot si la sortida ja existeix." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2844,6 +2877,11 @@ msgstr "{name} \"{section}/icons/{path}\" no existeix! Comproveu \"config.yml\". msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} és obsolet, utilitzeu {newfile}" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index cd27dab3..e227c8ab 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2025-01-21 19:35+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" @@ -529,6 +529,11 @@ msgstr "Vytvořen nový kontejner „{name}“" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Vytváření „{path}“ pro konfiguraci s3cmd." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "Čtení „{config_file}“" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Vytváření adresáře protokolů" @@ -712,6 +717,16 @@ msgstr "CHYBA: nepodporovaný git host „%s“, opravy vítány!" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "CHYBA: {key} v {path} není „archive“ nebo „repo“!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -736,6 +751,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "Proměnná prostředí {var} z {configname} není nastavena!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "Proměnná prostředí {var} z {configname} není nastavena!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "Chyba při nasazení „github_releases“, {} není k dispozici. (Možná budete muset nejprve spustit `fdroid update`.)" @@ -982,6 +1002,11 @@ msgstr "Ignorování vstupu FUNDING.yml delšího než 2048: %s" msgid "Ignoring bad element in manifest: %s" msgstr "Ignorování nesprávného prvku v manifestu: %s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "{oldfile} je zastaralý, použijte {newfile}" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorování balíčku bez metadat: " @@ -1352,6 +1377,10 @@ msgstr "Jedné z položek konfigurace „github_releases“ chybí hodnota „to msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Pro grafiku jsou podporovány pouze formáty PNG a JPEG, nalezeno: {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Zobrazit pouze rozdíly s Obchodem Play" @@ -1749,6 +1778,10 @@ msgstr "Režim aktualizace pomocí značek se používá v git-svn, ale repozit msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Testovací režim - výstup se ukládá pouze do adresáře tmp a vždy se sestavuje, i když výstup již existuje." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2852,6 +2885,11 @@ msgstr "{name} „{section}/icons/{path}“ neexistuje! Zkontrolujte „config.y msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} je zastaralý, použijte {newfile}" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/cy/LC_MESSAGES/fdroidserver.po b/locale/cy/LC_MESSAGES/fdroidserver.po index 77710452..1b724acb 100644 --- a/locale/cy/LC_MESSAGES/fdroidserver.po +++ b/locale/cy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2021-01-16 21:23+0000\n" "Last-Translator: Aled Powell \n" "Language-Team: Welsh \n" @@ -523,6 +523,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -704,6 +709,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -726,6 +741,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -972,6 +992,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1342,6 +1367,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1742,6 +1771,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2855,6 +2888,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 373ac0ad..1a1fa873 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -26,7 +26,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2025-01-23 09:05+0000\n" "Last-Translator: VfBFan \n" "Language-Team: German \n" @@ -540,6 +540,11 @@ msgstr "Neuer Container \"{name}\" wurde erstellt" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "\"{path}\" für die Konfiguration von S3cmd wird erstellt." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "Lese '{config_file}'" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Erstelle Logverzeichnis" @@ -723,6 +728,16 @@ msgstr "FEHLER: nicht unterstützter Git-Host \"%s\", Patches willkommen!" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "FEHLER: {key} in {path} ist nicht \"archive\" oder \"repo\"!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -747,6 +762,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "Umgebungsvariable {var} von {configname} ist nicht gesetzt!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "Umgebungsvariable {var} von {configname} ist nicht gesetzt!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "Fehler beim Bereitstellen von 'github_releases', {} nicht vorhanden. (Sie müssen zuerst `fdroid update` ausführen.)" @@ -993,6 +1013,11 @@ msgstr "Ignoriere FUNDING.yml-Einträge länger als 2048: %s" msgid "Ignoring bad element in manifest: %s" msgstr "Ignoriere schlechtes Element im Manifest: %s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "{oldfile} ist veraltet, benutze {newfile}" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignoriere Paket ohne Metadaten: " @@ -1363,6 +1388,10 @@ msgstr "Einem der Konfigurationselemente von 'github_releases' fehlt der Wert 't msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Nur PNG und JPEG werden für Grafiken unterstützt, gefunden wurde: {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Nur Unterschiede zum Play Store ausgeben" @@ -1759,6 +1788,10 @@ msgstr "Aktualisierungsmodus mit Tags in git-svn verwendet, aber das Repo wurde msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Testmodus - Ausgabe nur ins tmp-Verzeichnis einfügen, immer erstellen, selbst wenn die Ausgabe bereits vorhanden ist." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2859,6 +2892,11 @@ msgstr "{name} \"{section}/icons/{path}\" existiert nicht! Überprüfe \"config. msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} ist veraltet, benutze {newfile}" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index 6d50acc9..4b2439d9 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2024-05-10 13:24+0000\n" "Last-Translator: ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ \n" "Language-Team: Greek \n" @@ -522,6 +522,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -703,6 +708,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -725,6 +740,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -971,6 +991,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1341,6 +1366,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1737,6 +1766,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2831,6 +2864,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 599fb84f..31f5fad7 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2025-03-16 22:47+0000\n" "Last-Translator: Nicolás Pérez \n" "Language-Team: Spanish \n" @@ -532,6 +532,11 @@ msgstr "Se ha creado el contenedor nuevo \"{name}\"" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Creando \"{path}\" para configurar s3cmd." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "Leyendo '{config_file}'" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Creando el directorio de registro (\"log\")" @@ -715,6 +720,16 @@ msgstr "ERROR: host git no soportado \"%s\", ¡parches bienvenidos!" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "ERROR: ¡{key} en {path} no es un \"archivo\" o un \"repositorio\"!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -739,6 +754,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "¡La variable de entorno {var} de {configname} no tiene valor asignado!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "¡La variable de entorno {var} de {configname} no tiene valor asignado!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "Error desplegando 'github_releases', {} no está presente. (Puede que necesites ejecutar `fdroid update` primero)" @@ -985,6 +1005,11 @@ msgstr "Ignorando entrada en FUNDING.yml mayor de 2048: %s" msgid "Ignoring bad element in manifest: %s" msgstr "Ignorar el elemento incorrecto en el manifiesto: %s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "{oldfile} está obsoleto, use {newfile}" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorando paquete sin metadatos: " @@ -1355,6 +1380,10 @@ msgstr "A uno de los elementos de configuración 'github_releases' le falta el v msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Sólo PNG y JPEG son compatibles con los gráficos, encontrados: {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Solo imprimir diferencias con el Play Store" @@ -1751,6 +1780,10 @@ msgstr "El modo de actualización de etiquetas se utilizó en git-svn, pero el r msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Modo de prueba: ponga la salida solo en el directorio tmp y siga desarrollando, incluso si la salida ya existe." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2851,6 +2884,11 @@ msgstr "¡{name} \"{section}/icons/{path}\" no existe! Corrijalo en config.yml." msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} está obsoleto, use {newfile}" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index 37b632e4..d2ecf72a 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2021-04-10 21:26+0000\n" "Last-Translator: Germe the fur star \n" "Language-Team: Spanish (Argentina) \n" @@ -527,6 +527,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -708,6 +713,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -730,6 +745,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -976,6 +996,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1349,6 +1374,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Solo mostrar las diferencias con el Plays Store" @@ -1747,6 +1776,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Modo prueba - pone la salida solo en el directorio temporal, y siempre construye, incluso cuando la salida ya exista." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2849,6 +2882,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/es_MX/LC_MESSAGES/fdroidserver.po b/locale/es_MX/LC_MESSAGES/fdroidserver.po index 7c32b235..2a671640 100644 --- a/locale/es_MX/LC_MESSAGES/fdroidserver.po +++ b/locale/es_MX/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2020-04-29 12:49+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Spanish (Mexico) \n" @@ -520,6 +520,11 @@ msgstr "Se creó un nuevo contenedor \"{name}\"" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Creando \"{path}\" para configurar s3cmd." +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Creando directorio de registro" @@ -701,6 +706,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -723,6 +738,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -969,6 +989,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1339,6 +1364,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1735,6 +1764,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2829,6 +2862,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/eu/LC_MESSAGES/fdroidserver.po b/locale/eu/LC_MESSAGES/fdroidserver.po index b151427b..509bf729 100644 --- a/locale/eu/LC_MESSAGES/fdroidserver.po +++ b/locale/eu/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -514,6 +514,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -695,6 +700,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -717,6 +732,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -963,6 +983,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1333,6 +1358,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1729,6 +1758,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2822,6 +2855,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index 5071a2b2..157b9495 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2024-11-26 15:16+0000\n" "Last-Translator: Danial Behzadi \n" "Language-Team: Persian \n" @@ -518,6 +518,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "خواندن {config_file}" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "ایجاد کردن شاخهٔ log" @@ -699,6 +704,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -721,6 +736,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -967,6 +987,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1337,6 +1362,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1733,6 +1762,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2826,6 +2859,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/fdroidserver.pot b/locale/fdroidserver.pot index 6b5ceb4f..337a01b0 100644 --- a/locale/fdroidserver.pot +++ b/locale/fdroidserver.pot @@ -5,9 +5,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: fdroidserver 2.3.5\n" +"Project-Id-Version: fdroidserver 2.4a1-12-g4448aeb5\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -516,6 +516,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -697,6 +702,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -719,6 +734,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -965,6 +985,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1335,6 +1360,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1731,6 +1760,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2824,6 +2857,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index ba450410..3d542873 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2025-01-31 14:19+0000\n" "Last-Translator: Ricky Tigg \n" "Language-Team: Finnish \n" @@ -517,6 +517,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -698,6 +703,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -720,6 +735,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -966,6 +986,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1336,6 +1361,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1732,6 +1761,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2825,6 +2858,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 289b37d2..9bcacb73 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -46,7 +46,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2025-03-02 16:42+0000\n" "Last-Translator: Lula Bye \n" "Language-Team: French \n" @@ -560,6 +560,11 @@ msgstr "Nouveau container « {name} » créé" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Création de « {path} » pour configurer s3cmd." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "Lecture de '{config_file}'" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Création du répertoire des logs" @@ -743,6 +748,16 @@ msgstr "ERREUR : hébergeur git « %s » non supporté, les corrections sont msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "ERREUR : {key} dans {path} n'est pas \"archive\" ou \"repo\"." +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -767,6 +782,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "La variable d'environnent {var} de {configname} n'est pas configurée !" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "La variable d'environnent {var} de {configname} n'est pas configurée !" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "Erreur lors du déploiement 'github_releases' : {} est absent (vous devriez peut-être d'abord lancer `fdroid update`)." @@ -1013,6 +1033,11 @@ msgstr "Ignorer l'entrée FUNDING.yml supérieure à 2048 : %s" msgid "Ignoring bad element in manifest: %s" msgstr "Un mauvais élément du manifest est ignoré : %s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "{oldfile} est obsolète, utilisez {newfile}" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Paquet sans métadonnées ignoré : " @@ -1383,6 +1408,10 @@ msgstr "L'un des éléments de configuration 'github_releases' ne contient pas l msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Seuls les formats PNG et JPEG sont pris en charge pour les graphiques, trouvés : {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Afficher uniquement les différences avec le Play Store" @@ -1779,6 +1808,10 @@ msgstr "Le mode de mise à jour par étiquettes est utilisé dans git-svn, mais msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Mode test — mettre la sortie dans le dossier tmp uniquement et toujours compiler, même si la sortie existe déjà." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2887,6 +2920,11 @@ msgstr "{name} \"{section}/icons/{path}\" n'existe pas ! Vérifiez \"config.yml\ msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} est obsolète, utilisez {newfile}" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/fy/LC_MESSAGES/fdroidserver.po b/locale/fy/LC_MESSAGES/fdroidserver.po index 2cccd306..fe0ebf1e 100644 --- a/locale/fy/LC_MESSAGES/fdroidserver.po +++ b/locale/fy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2021-07-01 15:29+0000\n" "Last-Translator: Vancha March \n" "Language-Team: Frisian \n" @@ -515,6 +515,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -696,6 +701,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -718,6 +733,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -964,6 +984,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1334,6 +1359,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1730,6 +1759,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2824,6 +2857,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/ga/LC_MESSAGES/fdroidserver.po b/locale/ga/LC_MESSAGES/fdroidserver.po index 10d44f03..7a1e9211 100644 --- a/locale/ga/LC_MESSAGES/fdroidserver.po +++ b/locale/ga/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1-162-gfbb3cc59\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2025-01-23 09:05+0000\n" "Last-Translator: Aindriú Mac Giolla Eoin \n" "Language-Team: Irish \n" @@ -525,6 +525,11 @@ msgstr "Cruthaíodh coimeádán nua \"{name}\"" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Ag cruthú \"{path}\" chun s3cmd a chumrú." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "Ag léamh '{config_file}'" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Comhadlann logála á cruthú" @@ -708,6 +713,16 @@ msgstr "EARRÁID: Óstríomhaire git gan tacaíocht \"%s\", fáilte roimh phaist msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "EARRÁID: Níl {key} i {path} \"archive\" nó \"repo\"!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -732,6 +747,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "Níl athróg timpeallachta {var} ó {configname} socraithe!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "Níl athróg timpeallachta {var} ó {configname} socraithe!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "Earráid agus 'github_releases' á úsáid, {} gan a bheith i láthair. (B'fhéidir go mbeidh ort 'nuashonrú fdroid' a rith ar dtús.)" @@ -978,6 +998,11 @@ msgstr "Gan neamhaird a dhéanamh FUNDING.yml iontráil níos faide ná 2048: %s msgid "Ignoring bad element in manifest: %s" msgstr "Neamhaird á déanamh ar dhrocheilimint sa léiriú: %s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "Tá {oldfile} imithe i léig, úsáid {newfile}" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Neamhaird a dhéanamh ar phacáiste gan mheiteashonraí: " @@ -1348,6 +1373,10 @@ msgstr "Tá an luach 'comhartha' in easnamh ar cheann de na míreanna cumraíoch msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Ní thacaítear ach le PNG agus JPEG le haghaidh grafaicí, le fáil: {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Ná priontáil ach difríochtaí leis an Play Store" @@ -1747,6 +1776,10 @@ msgstr "Clibeanna cothrom le dáta modh a úsáidtear i git-svn, ach ní raibh a msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Modh tástála - aschur a chur san eolaire tmp amháin, agus a thógáil i gcónaí, fiú má tá an t-aschur ann cheana féin." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2856,6 +2889,11 @@ msgstr "{name} Níl \"{section}/icons/{path}\" ann! Seiceáil \"config.yml\"." msgid "{oldfile} is deprecated, use {newfile}" msgstr "Tá {oldfile} imithe i léig, úsáid {newfile}" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/he/LC_MESSAGES/fdroidserver.po b/locale/he/LC_MESSAGES/fdroidserver.po index fb04e1e3..04b21f37 100644 --- a/locale/he/LC_MESSAGES/fdroidserver.po +++ b/locale/he/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2024-08-18 06:27+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" @@ -516,6 +516,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -697,6 +702,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -719,6 +734,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -965,6 +985,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1335,6 +1360,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1731,6 +1760,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2824,6 +2857,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/hi/LC_MESSAGES/fdroidserver.po b/locale/hi/LC_MESSAGES/fdroidserver.po index dbe16c92..d6ba1290 100644 --- a/locale/hi/LC_MESSAGES/fdroidserver.po +++ b/locale/hi/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2023-02-22 11:24+0000\n" "Last-Translator: Saurmandal \n" "Language-Team: Hindi \n" @@ -516,6 +516,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -697,6 +702,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -719,6 +734,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -965,6 +985,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1335,6 +1360,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1731,6 +1760,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2825,6 +2858,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index e5987ef4..9d1b0a68 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Hungarian \n" @@ -522,6 +522,11 @@ msgstr "Új „{name}” konténer létrehozva" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "„{path}” létrehozása a s3cmd beállításához." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "„{config_file}” olvasása" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Naplókönyvtár létrehozása" @@ -705,6 +710,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -729,6 +744,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "A(z) {configname} konfigurációból származó {var} környezeti változó nincs beállítva!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "A(z) {configname} konfigurációból származó {var} környezeti változó nincs beállítva!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -979,6 +999,11 @@ msgstr "A 2048-nál hosszabb FUNDING.yml bejegyzés figyelmen kívül hagyása: msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "A metaadatok nélküli csomag figyelmen kívül hagyása: " @@ -1352,6 +1377,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "A grafikáknál csak PNG és JPEG formátum támogatott, ez található: {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Csak a különbségek kiírása Play Áruház esetén" @@ -1750,6 +1779,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2848,6 +2881,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index 42043e80..1c16348e 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2024-10-04 04:26+0000\n" "Last-Translator: Doctorredits_here \n" "Language-Team: Indonesian \n" @@ -520,6 +520,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -701,6 +706,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -723,6 +738,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -969,6 +989,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1339,6 +1364,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1734,6 +1763,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2825,6 +2858,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index f25de697..ab21df99 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2024-09-10 09:27+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Italian \n" @@ -536,6 +536,11 @@ msgstr "Nuovo container \"{name}\" creato" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Creazione \"{path}\" per configurazione s3cmd." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "Lettura di '{config_file}'" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Creazione della directory dei log" @@ -719,6 +724,16 @@ msgstr "ERRORE: host git \"%s\" non supportato, le patch sono benvenute!" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -743,6 +758,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "La variabile d'ambiente {var} da {configname} non è impostata!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "La variabile d'ambiente {var} da {configname} non è impostata!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -990,6 +1010,11 @@ msgstr "Ignorando la voce FUNDING.yml più lunga di 2048: %s" msgid "Ignoring bad element in manifest: %s" msgstr "Ignorato elemento errato nel manifest: %s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "{oldfile} è deprecato, usa {newfile}" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorare il pacchetto senza metadati: " @@ -1360,6 +1385,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Solo PNG e JPEG sono supportati per la grafica, trovati: {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Stampa solo le differenze con il Play Store" @@ -1757,6 +1786,10 @@ msgstr "Modalità di aggiornamento dei tag utilizzata in git-svn, ma il repo non msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Modalità test - mette l'output solo nella directory tmp, e costruisce sempre, anche se l'output esiste già." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2863,6 +2896,11 @@ msgstr "{name} \"{section}/icons/{path}\" non esiste! Controlla \"config.yml\"." msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} è deprecato, usa {newfile}" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index eab4d318..02a9b477 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2025-02-08 06:22+0000\n" "Last-Translator: Liner Seven \n" "Language-Team: Japanese \n" @@ -520,6 +520,11 @@ msgstr "新しいコンテナー「{name}」を作成しました" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "s3cmdの設定用に「{path}」を作成します。" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "「{config_file}」を読み込みます" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "ログ用のディレクトリーを作成します" @@ -703,6 +708,16 @@ msgstr "エラー:サポートされていないgitのホスト「%s」です msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "エラー:{path}の{key}は「archive」でも「repo」でもありません!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -727,6 +742,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "{configname}の環境変数 {var} が設定されていません!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "{configname}の環境変数 {var} が設定されていません!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "「github_releases」を設定する際にエラーが発生しました。{}がありません(まず`fdroid update`を実行する必要があるかもしれません)。" @@ -973,6 +993,11 @@ msgstr "2024より長いFUNDING.ymlは無視します:%s" msgid "Ignoring bad element in manifest: %s" msgstr "manifestの正しくない要素を無視します:%s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "{oldfile}は非推奨です。{newfile}を使用してください" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "メタデータのないパッケージは無視します: " @@ -1343,6 +1368,10 @@ msgstr "「github_releases」の設定項目の1つに「token」の値が設定 msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "画像にはPNGとJPEGのみをサポートします。これが見つかりました:{path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Play Storeとの違いのみを出力" @@ -1738,6 +1767,10 @@ msgstr "タグのアップデートモードがgit-svnで使用されました msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "テストモード - 既に出力が存在する場合でも、一時ディレクトリーに出力し、常にビルドを行います。" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2835,6 +2868,11 @@ msgstr "{name}「{section}/icons/{path}」がありません!「config.yml」 msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile}は非推奨です。{newfile}を使用してください" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index f5bf4f54..2913994a 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2021-01-15 13:25+0000\n" "Last-Translator: R_SACI \n" "Language-Team: Kabyle \n" @@ -518,6 +518,11 @@ msgstr "Anagbar amaynut yettwarnan \"{name}\"" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -699,6 +704,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -721,6 +736,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -969,6 +989,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1339,6 +1364,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1735,6 +1764,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2829,6 +2862,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index b8612b4f..be3dbd38 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:55+0100\n" "PO-Revision-Date: 2024-09-06 14:57+0000\n" "Last-Translator: Cxnfl1ct \n" "Language-Team: Korean \n" @@ -519,6 +519,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "기록 디렉터리 만들기" @@ -700,6 +705,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -722,6 +737,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -970,6 +990,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1341,6 +1366,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "PNG와 JPEG만 그래픽을 위해 지원됩니다, 찾았습니다: {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1736,6 +1765,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2828,6 +2861,11 @@ msgstr "{name} \"{section}/icons/{path}\"는 존재하지 않습니다! \"config msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/lv/LC_MESSAGES/fdroidserver.po b/locale/lv/LC_MESSAGES/fdroidserver.po index 95b6a129..7677b96e 100644 --- a/locale/lv/LC_MESSAGES/fdroidserver.po +++ b/locale/lv/LC_MESSAGES/fdroidserver.po @@ -6,17 +6,15 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2024-12-11 14:37+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2024-11-22 21:03+0000\n" "Last-Translator: Edgars Andersons \n" -"Language-Team: Latvian \n" +"Language-Team: Latvian \n" "Language: lv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= " -"19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= 19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" "X-Generator: Weblate 5.9-dev\n" #: ../fdroidserver/nightly.py @@ -175,9 +173,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format -msgid "" -"'{field}' will be in random order! Use () or [] brackets if order is " -"important!" +msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" msgstr "" #: ../fdroidserver/common.py @@ -254,9 +250,7 @@ msgid "AllowedAPKSigningKeys missing but reference binary supplied" msgstr "" #: ../fdroidserver/import_subcommand.py -msgid "" -"Allows a different revision (or git branch) to be specified for the initial " -"import" +msgid "Allows a different revision (or git branch) to be specified for the initial import" msgstr "" #: ../fdroidserver/mirror.py @@ -300,21 +294,15 @@ msgid "Android SDK tool {cmd} not found!" msgstr "" #: ../fdroidserver/lint.py -msgid "" -"App has Binaries but does not have corresponding AllowedAPKSigningKeys to " -"pin certificate." +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" #: ../fdroidserver/lint.py -msgid "" -"App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or " -"UpdateCheckMode are not None" +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" #: ../fdroidserver/lint.py -msgid "" -"App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but " -"AutoUpdateMode or UpdateCheckMode are not None" +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" #: ../fdroidserver/lint.py @@ -323,9 +311,7 @@ msgid "App is in '{repo}' but has a link to {url}" msgstr "" #: ../fdroidserver/lint.py -msgid "" -"App version has binary but does not have corresponding AllowedAPKSigningKeys " -"to pin certificate." +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" #: ../fdroidserver/lint.py @@ -355,9 +341,7 @@ msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" msgstr "" #: ../fdroidserver/mirror.py -msgid "" -"Base URL to mirror, can include the index signing key using the query " -"string: ?fingerprint=" +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname @@ -436,9 +420,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format -msgid "" -"Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, " -"archapks:{arch}" +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" msgstr "" #: ../fdroidserver/update.py @@ -472,9 +454,7 @@ msgid "Conflicting \"{field}\" definitions between .yml and localized files:" msgstr "" #: ../fdroidserver/__main__.py -msgid "" -"Conflicting arguments: '--verbose' and '--quiet' can not be specified at the " -"same time." +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" #: ../fdroidserver/common.py @@ -536,6 +516,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -644,9 +629,7 @@ msgid "Don't create a source tarball, useful when testing a build" msgstr "" #: ../fdroidserver/build.py -msgid "" -"Don't refresh the repository, useful when testing a build with no internet " -"connection" +msgid "Don't refresh the repository, useful when testing a build with no internet connection" msgstr "" #: ../fdroidserver/deploy.py ../fdroidserver/nightly.py @@ -668,8 +651,7 @@ msgstr "Lejupielādē %s" #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." -msgstr "" -"Glabātavas lejupielāde jau vienreiz neizdevās, tas atkārtoti netiks mēģināts." +msgstr "Glabātavas lejupielāde jau vienreiz neizdevās, tas atkārtoti netiks mēģināts." #: ../fdroidserver/verify.py #, python-brace-format @@ -720,6 +702,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -727,9 +719,7 @@ msgstr "" #: ../fdroidserver/__main__.py #, python-brace-format -msgid "" -"Encoding is set to '{enc}' fdroid might run into encoding issues. Please set " -"it to 'UTF-8' for best results." +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." msgstr "" #: ../fdroidserver/init.py @@ -744,10 +734,13 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py -msgid "" -"Error deploying 'github_releases', {} not present. (You might need to run " -"`fdroid update` first.)" +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" #: ../fdroidserver/import_subcommand.py @@ -848,9 +841,7 @@ msgid "Forbidden HTML tags" msgstr "" #: ../fdroidserver/build.py -msgid "" -"Force build of disabled apps, and carries on regardless of scan problems. " -"Only allowed in test mode." +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." msgstr "" #: ../fdroidserver/build.py @@ -994,6 +985,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1147,8 +1143,7 @@ msgid "Java compiled class" msgstr "" #: ../fdroidserver/signindex.py -msgid "" -"Java jarsigner not found! Install in standard location or set java_paths!" +msgid "Java jarsigner not found! Install in standard location or set java_paths!" msgstr "" #: ../fdroidserver/lint.py @@ -1170,8 +1165,7 @@ msgstr "" #: ../fdroidserver/lint.py #, python-brace-format -msgid "" -"Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" msgstr "" #: ../fdroidserver/lint.py @@ -1234,9 +1228,7 @@ msgstr "" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." -msgstr "" -"Netika atrasta neviena ierīce, kurā izpildīt `adb install`. Lūgums " -"piespraust kādu." +msgstr "Netika atrasta neviena ierīce, kurā izpildīt `adb install`. Lūgums piespraust kādu." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1261,8 +1253,7 @@ msgstr "Netika atrastas atbilstošas birkas" #: ../fdroidserver/update.py #, python-brace-format msgid "No minimum SDK version found in {0}, using default (3)." -msgstr "" -"{0} netika atrasta zemākā pieļaujamā SDK versija, izmanto noklusējumu (3)." +msgstr "{0} netika atrasta zemākā pieļaujamā SDK versija, izmanto noklusējumu (3)." #: ../fdroidserver/lint.py msgid "No need to specify that the app is Free Software" @@ -1274,9 +1265,7 @@ msgstr "Nav nepieciešams norādīt, ka lietotne ir paredzēta Android" #: ../fdroidserver/deploy.py msgid "No option set! Edit your config.yml to set at least one of these:" -msgstr "" -"Nav iestatīta neviena iespēja. Jālabo config.yml, lai iestatītu vismaz vienu " -"no šiem:" +msgstr "Nav iestatīta neviena iespēja. Jālabo config.yml, lai iestatītu vismaz vienu no šiem:" #: ../fdroidserver/common.py msgid "No packages specified" @@ -1355,21 +1344,15 @@ msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" msgstr "" #: ../fdroidserver/deploy.py -msgid "" -"One of the 'github_releases' config items is missing the 'packageNames' " -"value. skipping ..." +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "" -"One of the 'github_releases' config items is missing the 'projectUrl' value. " -"skipping ..." +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." msgstr "" #: ../fdroidserver/deploy.py -msgid "" -"One of the 'github_releases' config items is missing the 'token' value. " -"skipping ..." +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" #: ../fdroidserver/update.py @@ -1377,6 +1360,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1524,16 +1511,12 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format -msgid "" -"Reading packageName/versionCode/versionName failed, APK invalid: " -"'{apkfilename}'" +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" msgstr "" #: ../fdroidserver/common.py #, python-brace-format -msgid "" -"Reading packageName/versionCode/versionName failed,APK invalid: " -"'{apkfilename}'" +msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" msgstr "" #: ../fdroidserver/update.py @@ -1547,7 +1530,7 @@ msgstr "" #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." -msgstr "" +msgstr "Noņemt avota arhīvu un jebkādus APK, ja sekmīgi apliecināta." #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1567,9 +1550,7 @@ msgid "RepoTrunk update mode only makes sense in git-svn repositories" msgstr "" #: ../fdroidserver/build.py -msgid "" -"Reset and create a brand new build server, even if the existing one appears " -"to be ok." +msgid "Reset and create a brand new build server, even if the existing one appears to be ok." msgstr "" #: ../fdroidserver/nightly.py @@ -1605,8 +1586,7 @@ msgstr "" #: ../fdroidserver/nightly.py #, python-brace-format -msgid "" -"Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" msgstr "" #: ../fdroidserver/lint.py @@ -1769,9 +1749,7 @@ msgid "System clock is older than date in {path}!" msgstr "" #: ../fdroidserver/checkupdates.py -msgid "" -"Tags update mode only works for git, hg, bzr and git-svn repositories " -"currently" +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" msgstr "" #: ../fdroidserver/checkupdates.py @@ -1779,9 +1757,11 @@ msgid "Tags update mode used in git-svn, but the repo was not set up with tags" msgstr "" #: ../fdroidserver/build.py -msgid "" -"Test mode - put output in the tmp directory only, and always build, even if " -"the output already exists." +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgstr "" + +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" msgstr "" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode @@ -1820,17 +1800,11 @@ msgid "These are the apps that have been archived from the main repo." msgstr "" #: ../fdroidserver/mirror.py -msgid "" -"This command should never be used to mirror f-droid.org! A full copy " -"requires more than 600GB." +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." msgstr "" #: ../fdroidserver/common.py -msgid "" -"This is a repository of apps to be used with F-Droid. Applications in this " -"repository are either official binaries built by the original application " -"developers, or are binaries built from source by the admin of f-droid.org " -"using the tools on https://gitlab.com/fdroid." +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." msgstr "" #: ../fdroidserver/import_subcommand.py @@ -1851,9 +1825,7 @@ msgid "" msgstr "" #: ../fdroidserver/deploy.py -msgid "" -"To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config." -"yml!" +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" msgstr "" #: ../fdroidserver/deploy.py @@ -1874,15 +1846,11 @@ msgid "URL {url} in Description: {error}" msgstr "" #: ../fdroidserver/lint.py -msgid "" -"Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from " -"https://spdx.org/license-list" +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" msgstr "" #: ../fdroidserver/lint.py -msgid "" -"Unexpected license tag \"{}\"! Only use license tags configured in your " -"config file" +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" #: ../fdroidserver/common.py @@ -1987,9 +1955,7 @@ msgstr "" #: ../fdroidserver/lint.py #, python-brace-format -msgid "" -"UpdateCheckData must match the version code as integer (\\d or [0-9]): " -"{codeex}" +msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" msgstr "" #: ../fdroidserver/lint.py @@ -2003,14 +1969,12 @@ msgid "UpdateCheckData not a valid URL: {url}" msgstr "" #: ../fdroidserver/lint.py -msgid "" -"UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" #. Translators: https://developer.android.com/studio/build/application-id #: ../fdroidserver/lint.py -msgid "" -"UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" +msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" msgstr "" #: ../fdroidserver/lint.py @@ -2041,9 +2005,7 @@ msgid "Usage: %s\n" msgstr "" #: ../fdroidserver/lint.py -msgid "" -"Use /HEAD instead of /master or /main to point at a file in the default " -"branch" +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" #: ../fdroidserver/lint.py @@ -2085,8 +2047,7 @@ msgid "Using JAR Signature" msgstr "" #: ../fdroidserver/common.py -msgid "" -"Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" #: ../fdroidserver/common.py @@ -2137,12 +2098,8 @@ msgstr "Pārbauda pakotni {path} ar apksigner." #: ../fdroidserver/deploy.py #, python-brace-format -msgid "" -"VirusTotal API key cannot upload files larger than 32MB, use {url} to upload " -"{path}." -msgstr "" -"VirusTotal API atslēga nevar augšupielādēt datnes, kas ir lielākas par 32 " -"MB. Jāizmanto {url}, lai augšupielādētu {path}." +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "VirusTotal API atslēga nevar augšupielādēt datnes, kas ir lielākas par 32 MB. Jāizmanto {url}, lai augšupielādētu {path}." #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" @@ -2153,15 +2110,11 @@ msgid "WebAssembly binary file" msgstr "WebAssebly binārā datne" #: ../fdroidserver/update.py -msgid "" -"When configured for signed indexes, create only unsigned indexes at this " -"stage" +msgid "When configured for signed indexes, create only unsigned indexes at this stage" msgstr "" #: ../fdroidserver/lint.py -msgid "" -"When linting the entire repository yamllint is disabled by default. This " -"option forces yamllint regardless." +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." msgstr "" #: ../fdroidserver/publish.py @@ -2217,6 +2170,11 @@ msgstr "" msgid "ambiguous option: %s (%s?)" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "" + #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" msgstr "" @@ -2482,9 +2440,7 @@ msgstr "" #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format -msgid "" -"invalid option string %(option)r: must start with a character " -"%(prefix_chars)r" +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" msgstr "" #: ../fdroidserver/common.py @@ -2498,8 +2454,7 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format -msgid "" -"local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" msgstr "" #: ../fdroidserver/deploy.py @@ -2665,9 +2620,7 @@ msgstr "" #: ../fdroidserver/signatures.py #, python-brace-format -msgid "" -"refuse downloading via insecure HTTP connection (use HTTPS or specify --no-" -"https-check): {apkfilename}" +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" msgstr "" #: ../fdroidserver/index.py @@ -2704,9 +2657,7 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "" #: ../fdroidserver/deploy.py -msgid "" -"serverwebroot: path does not end with \"fdroid\", perhaps you meant one of " -"these:" +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" msgstr "" #: ../fdroidserver/scanner.py @@ -2807,8 +2758,7 @@ msgstr "" #: ../fdroidserver/deploy.py msgid "virustotal.com is rate limiting, waiting to retry..." -msgstr "" -"virustotal.com ierobežo pieprasījumus, gaida, lai mēģinātu atkārtoti..." +msgstr "virustotal.com ierobežo pieprasījumus, gaida, lai mēģinātu atkārtoti..." #: ../fdroidserver/install.py msgid "yes" @@ -2907,6 +2857,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" @@ -2993,7 +2948,3 @@ msgid "{} build succeeded" msgid_plural "{} builds succeeded" msgstr[0] "" msgstr[1] "" - -#: ../fdroidserver/verify.py -msgid "Remove source tarball and any APKs if successfully verified." -msgstr "Noņemt avota arhīvu un jebkādus APK, ja sekmīgi apliecināta." diff --git a/locale/ml/LC_MESSAGES/fdroidserver.po b/locale/ml/LC_MESSAGES/fdroidserver.po index c2be75ba..77fadfda 100644 --- a/locale/ml/LC_MESSAGES/fdroidserver.po +++ b/locale/ml/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2023-06-23 14:52+0000\n" "Last-Translator: abe1242 \n" "Language-Team: Malayalam \n" @@ -520,6 +520,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -701,6 +706,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -723,6 +738,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -969,6 +989,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1339,6 +1364,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1735,6 +1764,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2831,6 +2864,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index 13eb76c3..d8a766b0 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Norwegian Bokmål \n" @@ -532,6 +532,11 @@ msgstr "Opprettet ny beholder \"{name}\"" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Oppretter \"{path}\" for oppsett av s3cmd." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "Leser '{config_file}'" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Oppretter loggingsmappe" @@ -723,6 +728,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -747,6 +762,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "Miljøvariabelen {var} fra {configname} er ikke satt!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "Miljøvariabelen {var} fra {configname} er ikke satt!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -1003,6 +1023,11 @@ msgstr "Ser bort fra FUNDING.yml-oppføring som er lengre enn 2048: %s" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "{oldfile} er avleggs, bruk {newfile}" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorerte pakke uten metadata: " @@ -1391,6 +1416,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Kun PNG og JPEG støttes for grafikk, fant: {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Kun skriv ut forskjeller vis-a-vis Play-butikken" @@ -1802,6 +1831,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Testmodus - putt utdata kun i tmp-mappe, og alltid bygg, selv når utdataen finnes allerede." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2933,6 +2966,11 @@ msgstr "{name} «{section}/icons/{path}» finnes ikke. Rett det i config.yml." msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} er avleggs, bruk {newfile}" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index fbca4890..d385e678 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2024-01-03 09:07+0000\n" "Last-Translator: Issa1553 \n" "Language-Team: Dutch \n" @@ -523,6 +523,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -704,6 +709,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -726,6 +741,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -972,6 +992,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1342,6 +1367,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1738,6 +1767,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2832,6 +2865,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/nn/LC_MESSAGES/fdroidserver.po b/locale/nn/LC_MESSAGES/fdroidserver.po index 8506a639..fb2d51fe 100644 --- a/locale/nn/LC_MESSAGES/fdroidserver.po +++ b/locale/nn/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3.0-3-g4ba7b5c9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2024-11-26 10:54+0000\n" "Last-Translator: Bård Sigurd Møller \n" "Language-Team: Norwegian Nynorsk \n" @@ -515,6 +515,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -696,6 +701,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -718,6 +733,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -964,6 +984,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1334,6 +1359,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1730,6 +1759,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2823,6 +2856,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/pa/LC_MESSAGES/fdroidserver.po b/locale/pa/LC_MESSAGES/fdroidserver.po index f0fdeffc..df4e4b08 100644 --- a/locale/pa/LC_MESSAGES/fdroidserver.po +++ b/locale/pa/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3.3\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -514,6 +514,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -695,6 +700,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -717,6 +732,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -963,6 +983,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1333,6 +1358,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1729,6 +1758,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2822,6 +2855,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 925932bd..9f874593 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2025-03-13 20:43+0000\n" "Last-Translator: WaldiS \n" "Language-Team: Polish \n" @@ -526,6 +526,11 @@ msgstr "Utworzono nowy kontener \"{name}\"" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Tworzenie \"{path}\" do konfiguracji s3cmd." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "Czytaj '{config_file}'" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Tworzenie katalogu dzienników" @@ -709,6 +714,16 @@ msgstr "BŁĄD: nieobsługiwany host git „%s”, łatki mile widziane!" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "BŁĄD: {key} w {path} nie jest \"archive\" lub \"repo\"!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -733,6 +748,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "Zmienna środowiskowa {var} z {configname} nie jest ustawiona!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "Zmienna środowiskowa {var} z {configname} nie jest ustawiona!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "Błąd wdrożenia 'github_releases', {} nie występuje. (Może być konieczne wcześniejsze uruchomienie `fdroid update`)" @@ -979,6 +999,11 @@ msgstr "Ignorowanie wpisu FUNDING.yml dłuższego niż 2048: %s" msgid "Ignoring bad element in manifest: %s" msgstr "Ignorowanie błędnego elementu w manifeście: %s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "{oldfile} jest przestarzałe, użyj {newfile}" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorowanie pakietu bez metadanych: " @@ -1349,6 +1374,10 @@ msgstr "Jeden z elementów 'github_releases' nie posiada wartości 'token'. pomi msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Tylko PNG i JPEG są obsługiwane dla grafiki, znaleziono: {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Wydrukuj tylko różnice ze Sklepem Play" @@ -1746,6 +1775,10 @@ msgstr "Tryb aktualizacji tagów użyty w git-svn, ale repozytorium nie zostało msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Tryb testowy - umieszczaj dane wyjściowe tylko w katalogu tmp i zawsze buduj, nawet jeśli dane wyjściowe już istnieją." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2849,6 +2882,11 @@ msgstr "{name} \"{section}/icons/{path}\" nie istnieje! Sprawdź \"config.yml\". msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} jest przestarzałe, użyj {newfile}" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 2435c392..2b58804d 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2025-03-02 21:32+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" @@ -523,6 +523,11 @@ msgstr "Novo contentor criado: \"{name}\"" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Criando \"{path}\" para configurar s3cmd." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "A ler '{config_file}'" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Criando o diretório de log" @@ -706,6 +711,16 @@ msgstr "ERRO: host de git \"%s\" não suportado, patches são bem-vindos!" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "ERRO: {key} em {path} não é \"arquivo\" ou \"repositório\"!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -730,6 +745,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "A variável de ambiente {var} de {configname} não está definida!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "A variável de ambiente {var} de {configname} não está definida!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "Erro ao implementar 'github_releases', {} não está presente. (Pode ser necessário executar `fdroid update` primeiro.)" @@ -976,6 +996,11 @@ msgstr "A ignorar a entrada FUNDING.yml por mais que 2048: %s" msgid "Ignoring bad element in manifest: %s" msgstr "A ignorar o elemento mau no manifesto: %s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "{oldfile} está obsoleto, use {newfile}" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorando o pacote sem metadados: " @@ -1346,6 +1371,10 @@ msgstr "Um dos itens de configuração 'github_releases' não tem o valor 'token msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Somente PNG e JPEG são suportados para gráficos, encontrado: {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Apenas mostrar diferenças com a Play Store" @@ -1742,6 +1771,10 @@ msgstr "Modo de atualização de marcações usado no git-svn, mas a repo não f msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Modo de teste - ponha a saída apenas no diretório tmp e sempre compile, mesmo que a saída já exista." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2842,6 +2875,11 @@ msgstr "{name} \"{section}/icons/{path}\" não existe! Corrija-o no \"config.yml msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} está obsoleto, use {newfile}" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 3021cf2c..c9a496b1 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2025-01-23 16:02+0000\n" "Last-Translator: LucasMZ \n" "Language-Team: Portuguese (Brazil) \n" @@ -532,6 +532,11 @@ msgstr "Novo container criado \"{name}\"" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Criando \"{path}\" para configurar s3cmd." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "Lendo '{config_file}'" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Criando diretório de registro" @@ -715,6 +720,16 @@ msgstr "ERRO: host de git \"%s\" não suportado, patches são bem-vindos!" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "ERRO: {key} em {path} não é um \"arquivamento\" ou \"repositório\"!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -739,6 +754,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "A variável de ambiente {var} de {configname} não está definida!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "A variável de ambiente {var} de {configname} não está definida!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "Erro ao implementar 'github_releases', {} não está presente. (Talvez seja necessário executar `fdroid update` primeiro)" @@ -985,6 +1005,11 @@ msgstr "Ignorando entrada de FUNDING.yml maior que 2048: %s" msgid "Ignoring bad element in manifest: %s" msgstr "Ignorando o elemento mau no manifesto: %s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "{oldfile} foi descontinuado, use {newfile}" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorando o pacote sem metadados: " @@ -1355,6 +1380,10 @@ msgstr "Um dos itens de configuração 'github_releases' está faltando o valor msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Apenas PNG e JPEG são suportados para gráficos, encontrados: {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Apenas mostrar diferenças com a Play Store" @@ -1751,6 +1780,10 @@ msgstr "Modo de atualização de tags usado no git-svn, mas o repositório não msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Modo de teste - coloque a saída apenas no diretório tmp e sempre compile, mesmo que a saída já exista." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2851,6 +2884,11 @@ msgstr "{name} \"{section}/icons/{path}\" não existe! Corrija-o no \"config.yml msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} foi descontinuado, use {newfile}" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 3f82545d..3406fd8d 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2025-03-02 21:32+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" @@ -525,6 +525,11 @@ msgstr "Novo contentor criado: \"{name}\"" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Criando \"{path}\" para configurar s3cmd." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "A ler '{config_file}'" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Criando o diretório de log" @@ -708,6 +713,16 @@ msgstr "ERRO: host de git \"%s\" não suportado, patches são bem-vindos!" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "ERRO: {key} em {path} não é \"arquivo\" ou \"repositório\"!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -732,6 +747,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "A variável de ambiente {var} de {configname} não está definida!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "A variável de ambiente {var} de {configname} não está definida!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "Erro ao implementar 'github_releases', {} não está presente. (Pode ser necessário executar `fdroid update` primeiro.)" @@ -978,6 +998,11 @@ msgstr "A ignorar a entrada FUNDING.yml por mais que 2048: %s" msgid "Ignoring bad element in manifest: %s" msgstr "A ignorar o elemento mau no manifesto: %s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "{oldfile} está obsoleto, use {newfile}" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorando o pacote sem metadados: " @@ -1348,6 +1373,10 @@ msgstr "Um dos itens de configuração 'github_releases' não tem o valor 'token msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Somente PNG e JPEG são suportados para gráficos, encontrado: {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Apenas mostrar diferenças com a Play Store" @@ -1744,6 +1773,10 @@ msgstr "Modo de atualização de marcações usado no git-svn, mas a repo não f msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Modo de teste - ponha a saída apenas no diretório tmp e sempre compile, mesmo que a saída já exista." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2844,6 +2877,11 @@ msgstr "{name} \"{section}/icons/{path}\" não existe! Corrija-o no \"config.yml msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} está obsoleto, use {newfile}" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 5a1fe1ed..69169b8d 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2024-12-02 17:00+0000\n" "Last-Translator: Licaon Kter \n" "Language-Team: Romanian \n" @@ -525,6 +525,11 @@ msgstr "Creat un nou container \"{name}\"" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Crearea \"{path}\" pentru configurarea s3cmd." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "Citirea '{config_file}'" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Crearea directorului de jurnal" @@ -708,6 +713,16 @@ msgstr "EROARE: gazdă git neacceptată „%s”, corecții binevenite!" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -732,6 +747,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "Variabila de mediu {var} din {configname} nu este setată!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "Variabila de mediu {var} din {configname} nu este setată!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -978,6 +998,11 @@ msgstr "Ignorarea intrării FUNDING.yml mai lungă de 2048: %s" msgid "Ignoring bad element in manifest: %s" msgstr "Ignorarea elementului greșit din manifest: %s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "{oldfile} este depreciat, folosiți {newfile}" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Ignorarea pachetului fără metadate: " @@ -1348,6 +1373,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Doar PNG și JPEG sunt acceptate pentru grafică, găsite: {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Imprimă doar diferențele cu Play Store" @@ -1745,6 +1774,10 @@ msgstr "Modul de actualizare a etichetelor folosit în git-svn, dar repo-ul nu a msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Modul test - puneți ieșirea numai în directorul tmp și construiți întotdeauna, chiar dacă ieșirea există deja." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2849,6 +2882,11 @@ msgstr "{name} \"{section}/icons/{path}\" nu există! Verificați \"config.yml\" msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} este depreciat, folosiți {newfile}" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index d8085d89..4964b779 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -20,7 +20,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2025-01-25 15:42+0000\n" "Last-Translator: Golubev Alexander \n" "Language-Team: Russian \n" @@ -536,6 +536,11 @@ msgstr "Новый контейнер \"{name}\" создан" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Создание \"{path}\" для конфигурации s3cmd." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "Чтение '{config_file}'" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Создание директории для хранения логов" @@ -719,6 +724,16 @@ msgstr "ОШИБКА: неподдерживаемый хост git «%s», па msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "ОШИБКА: {key} в {path} должен быть или \"archive\", или \"repo\"!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -743,6 +758,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "Переменная среды {var} из {configname} не установлена!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "Переменная среды {var} из {configname} не установлена!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "Ошибка развертывания 'github_releases', {} отсутствует. (Возможно, сначала вам нужно запустить `fdroid update`.)" @@ -989,6 +1009,11 @@ msgstr "Проигнорировано: запись в FUNDING.yml длинне msgid "Ignoring bad element in manifest: %s" msgstr "Проигнорировано: плохой элемент в манифесте: %s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "{oldfile} признан устаревшим; используйте {newfile}" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Проигнорировано: пакеты без метаданных: " @@ -1359,6 +1384,10 @@ msgstr "В одном из 'github_releases' отсутствует значен msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Допускаются изображения только в форматах PNG и JPEG: {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Отобразить только приложения, версия которых в Play Store отличается от здешней" @@ -1756,6 +1785,10 @@ msgstr "Режим обновления тегов используется в g msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Тестовый режим. Все собранное попадает во временную директорию; сборка запускается снова в любом случае." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2859,6 +2892,11 @@ msgstr "{name}: \"{section}/icons/{path}\" не существует! Попра msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} признан устаревшим; используйте {newfile}" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/sk/LC_MESSAGES/fdroidserver.po b/locale/sk/LC_MESSAGES/fdroidserver.po index 9fc0fc2c..678a54aa 100644 --- a/locale/sk/LC_MESSAGES/fdroidserver.po +++ b/locale/sk/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -516,6 +516,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -697,6 +702,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -719,6 +734,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -965,6 +985,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1335,6 +1360,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1732,6 +1761,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2828,6 +2861,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index e0361954..41938065 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2024-12-12 14:43+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" @@ -520,6 +520,11 @@ msgstr "U krijua kontejner i ri “{name}”" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Po krijohet “{path}” për formësim të s3cmd." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "Po lexohet '{config_file}'" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Po krijohet drejtori regjistrash" @@ -703,6 +708,16 @@ msgstr "GABIM: strehë git “%s” që nuk mbulohet, arnimet janë të mirëpri msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "GABIM: {key} te {path} s’është “archive” apo “repo”!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -727,6 +742,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "S’është ujdisur ndryshore {var} nga {configname}!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "S’është ujdisur ndryshore {var} nga {configname}!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "Gabim në sendërtim të 'github_releases', {} s’është e pranishme. (Mund t’ju duhet të xhironi `fdroid update` së pari.)" @@ -973,6 +993,11 @@ msgstr "Po shpërfillen zëra FUNDING.yml më të gjatë se 2048: %s" msgid "Ignoring bad element in manifest: %s" msgstr "Po shpërfillet element i gabuar në manifest: %s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "{oldfile} është nxjerrë nga përdorimi, përdorni {newfile}" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Po shpërfillet paketë pa tejtëdhëna: " @@ -1343,6 +1368,10 @@ msgstr "Një nga zërat e formësimit të 'github_releases' mungon te vlera 'tok msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Si formate grafike mbulohen vetëm PNG dhe JPEG, u gjet: {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Shtyp vetëm dallimet me Play Store-in" @@ -1739,6 +1768,10 @@ msgstr "U përdor mënyra “tags update” në git-svn, por depoja s’qe ujdis msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Mënyra testim - hidhe output-in vetëm te drejtoria tmp, dhe monto përherë, edhe nëse output-i ekziston tashmë." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2840,6 +2873,11 @@ msgstr "{name} “{section}/icons/{path}” s’ekziston! Kontrolloni “config. msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} është nxjerrë nga përdorimi, përdorni {newfile}" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index ce2ebb8f..5c570044 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2024-12-30 22:00+0000\n" "Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" @@ -524,6 +524,11 @@ msgstr "Креиран нови контејнер \"{name}\"" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Креирање \"{path}\" за конфигурацију s3cmd." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "Читање '{config_file}'" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Креирање директоријума за записе" @@ -707,6 +712,16 @@ msgstr "ГРЕШКА: неподржан git домаћин \"%s\", закрпе msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "ERROR: {key} у {path} није \"archive\" или \"repo\"!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -731,6 +746,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "Еколошка променљива {var} из {configname} није подешена!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "Еколошка променљива {var} из {configname} није подешена!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "Error deploying 'github_releases', {} није присутан. (Можда треба прво да покренете `fdroid update`.)" @@ -977,6 +997,11 @@ msgstr "Игнорисање FUNDING.yml уноса дужег од 2048: %s" msgid "Ignoring bad element in manifest: %s" msgstr "Игнорисање лошег елемента у манифесту: %s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "{oldfile} је застарео, користите {newfile}" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Игнорисање пакета без метаподатака: " @@ -1347,6 +1372,10 @@ msgstr "Једна од 'github_releases' конфигурационих ста msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Само PNG и JPEG су подржани за графику, нађено: {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Само штампај разлике са Плеј продавницом" @@ -1744,6 +1773,10 @@ msgstr "Режим ажурирања ознака коришћен у git-svn, msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Тест режим - стави излаз у tmp директоријум само, и увек компајлирај, чак и ако излаз већ постоји." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2847,6 +2880,11 @@ msgstr "{name} \"{section}/icons/{path}\" не постоји! Проверит msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} је застарео, користите {newfile}" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index f543fd67..d4d35959 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2025-03-17 21:44+0000\n" "Last-Translator: Kristoffer Grundström \n" "Language-Team: Swedish \n" @@ -524,6 +524,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "Läser '{config_file}'" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -705,6 +710,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -727,6 +742,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -973,6 +993,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1343,6 +1368,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1739,6 +1768,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2833,6 +2866,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index 5c4f4b27..41969947 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2024-09-08 11:09+0000\n" "Last-Translator: abelbiwott-dev \n" "Language-Team: Swahili \n" @@ -521,6 +521,11 @@ msgstr "Imeunda kontena mpya \"{name}\"" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Kuunda \"{path}\" kwa ajili ya kusanidi s3cmd." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "Kusoma '{config_file}'" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Inaunda saraka ya kumbukumbu" @@ -704,6 +709,16 @@ msgstr "HITILAFU: mwenyeji wa git isiyoungwa mkono \"%s\", marekebisho yanakarib msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -728,6 +743,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "Vigezo vya mazingira {var} kutoka {configname} haijawekwa!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "Vigezo vya mazingira {var} kutoka {configname} haijawekwa!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -974,6 +994,11 @@ msgstr "Inapuuza ingizo la FUNDING.yml iliyo ndefu kuliko 2048: %s" msgid "Ignoring bad element in manifest: %s" msgstr "Inapuuza kipengele kibaya katika manifest: %s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "{oldfile} imewacha kutumika, tumia {newfile}" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Inapuuza kifurushi kisicho na metadata: " @@ -1344,6 +1369,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "PNG na JPEG pekee zinakubalika katika mchoro, zimepata: {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Chapisha tofauti pekee na Play Store" @@ -1740,6 +1769,10 @@ msgstr "Hali ya usasisho ya tagi imetumika katika git-svn, lakini ghala haikuset msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Hali ya majaribio - weka pato kwenye saraka ya tmp pekee, na uunde kila mara, hata kama pato tayari ipo." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2841,6 +2874,11 @@ msgstr "{name} \"{section}/icons/{path}\" haipo! Angalia \"config.yml\"." msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} imewacha kutumika, tumia {newfile}" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/ta/LC_MESSAGES/fdroidserver.po b/locale/ta/LC_MESSAGES/fdroidserver.po index 598748de..03e0484d 100644 --- a/locale/ta/LC_MESSAGES/fdroidserver.po +++ b/locale/ta/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2025-01-20 14:04+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tamil \n" @@ -522,6 +522,11 @@ msgstr "புதிய கொள்கலனை உருவாக்கிய msgid "Creating \"{path}\" for configuring s3cmd." msgstr "S3CMD ஐ கட்டமைக்க \"{path}\" ஐ உருவாக்குதல்." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "'{config_file}'" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "பதிவு கோப்பகத்தை உருவாக்குதல்" @@ -705,6 +710,16 @@ msgstr "பிழை: ஆதரிக்கப்படாத அறிவில msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "பிழை: {path} இல் {key} என்பது \"காப்பகம்\" அல்லது \"ரெப்போ\" அல்ல!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -729,6 +744,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "{configname} இருந்து இலிருந்து சுற்றுச்சூழல் மாறி {var} அமைக்கப்படவில்லை!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "{configname} இருந்து இலிருந்து சுற்றுச்சூழல் மாறி {var} அமைக்கப்படவில்லை!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "'Github_Releases' ஐ வரிசைப்படுத்துவதில் பிழை, {} இல்லை. (நீங்கள் முதலில் `fdroid புதுப்பிப்பை இயக்க வேண்டியிருக்கலாம்.)" @@ -975,6 +995,11 @@ msgstr "நிதியுதவியை புறக்கணித்தல msgid "Ignoring bad element in manifest: %s" msgstr "வெளிப்படையான மோசமான உறுப்பை புறக்கணித்தல்: %s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "{oldfile} நீக்கப்பட்டது, {newfile} ஐப் பயன்படுத்தவும்" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "மேனிலை தரவு இல்லாமல் தொகுப்பைப் புறக்கணித்தல்: " @@ -1345,6 +1370,10 @@ msgstr "'Github_releases' கட்டமைப்பு உருப்பட msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "கிராபிக்ச் மற்றும் காணப்படும் பி.என்.சி மற்றும் சே.பி.சி மட்டுமே ஆதரிக்கப்படுகின்றன: {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "பிளே ச்டோருடன் மட்டுமே வேறுபாடுகளை அச்சிடுங்கள்" @@ -1741,6 +1770,10 @@ msgstr "குறிச்சொற்கள் git-svn இல் பயன் msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "சோதனை பயன்முறை - வெளியீடு ஏற்கனவே இருந்தாலும், வெளியீட்டை மட்டும் வைக்கவும், எப்போதும் உருவாக்குங்கள்." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2841,6 +2874,11 @@ msgstr "{name} \"{section}/ஐகான்கள்/{path}\" இல்லை! \" msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} நீக்கப்பட்டது, {newfile} ஐப் பயன்படுத்தவும்" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index 001db62f..32d47b92 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2024-09-10 23:49+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" @@ -522,6 +522,11 @@ msgstr "Yeni kapsayıcı \"{name}\" oluşturuldu" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "s3cmd yapılandırması için \"{path}\" oluşturuluyor." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "'{config_file}' okunuyor" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Günlük dizini oluşturuluyor" @@ -705,6 +710,16 @@ msgstr "HATA: desteklenmeyen git ana makinesi \"%s\", yama gönderebilirsiniz!" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "HATA: {path} içindeki {key} \"archive\" veya \"repo\" değil!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -729,6 +744,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "{configname} içinden {var} ortam değişkeni ayarlı değil!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "{configname} içinden {var} ortam değişkeni ayarlı değil!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "'github_releases' dağıtılırken hata oluştu, {} yok. (Önce `fdroid update` komutunu çalıştırmanız gerekebilir.)" @@ -975,6 +995,11 @@ msgstr "2048'den uzun FUNDING.yml girdisi yok sayılıyor: %s" msgid "Ignoring bad element in manifest: %s" msgstr "Manifestteki hatalı öğe yok sayılıyor: %s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "{oldfile} kullanımdan kaldırıldı, {newfile} kullanın" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Üst verisiz paket yok sayılıyor: " @@ -1345,6 +1370,10 @@ msgstr "'github_releases' yapılandırma ögelerinden birinde 'token' değeri ek msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Grafikler için yalnızca PNG ve JPEG desteklenir, bulunan: {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Yalnızca Play Store ile olan farkları yazdır" @@ -1741,6 +1770,10 @@ msgstr "git-svn'de etiket güncelleme modu kullanıldı, ancak depo etiketlerle msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Sınama kipi - çıkışı sadece tmp dizinine koy, ve her zaman inşa et, çıkış zaten var olsa bile." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2841,6 +2874,11 @@ msgstr "{name} \"{section}/icons/{path}\" yok! config.yml içinde düzeltin." msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} kullanımdan kaldırıldı, {newfile} kullanın" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/tzm/LC_MESSAGES/fdroidserver.po b/locale/tzm/LC_MESSAGES/fdroidserver.po index f47a555f..14ec608b 100644 --- a/locale/tzm/LC_MESSAGES/fdroidserver.po +++ b/locale/tzm/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-681-gc19e8952\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2020-10-29 08:32+0000\n" "Last-Translator: Hakim Oubouali \n" "Language-Team: Central Atlas Tamazight \n" @@ -515,6 +515,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -696,6 +701,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -718,6 +733,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -964,6 +984,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1334,6 +1359,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1730,6 +1759,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2824,6 +2857,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/ug/LC_MESSAGES/fdroidserver.po b/locale/ug/LC_MESSAGES/fdroidserver.po index fc3417a4..e8f7f771 100644 --- a/locale/ug/LC_MESSAGES/fdroidserver.po +++ b/locale/ug/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2018-06-08 03:44+0000\n" "Last-Translator: ۋولقان \n" "Language-Team: Uyghur \n" @@ -516,6 +516,11 @@ msgstr "" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "" @@ -697,6 +702,16 @@ msgstr "" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -719,6 +734,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "" @@ -965,6 +985,11 @@ msgstr "" msgid "Ignoring bad element in manifest: %s" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "" @@ -1336,6 +1361,10 @@ msgstr "" msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "" @@ -1732,6 +1761,10 @@ msgstr "" msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2826,6 +2859,11 @@ msgstr "" msgid "{oldfile} is deprecated, use {newfile}" msgstr "" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index a975da26..1f311c97 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2025-01-21 18:50+0000\n" "Last-Translator: Максим Горпиніч \n" "Language-Team: Ukrainian \n" @@ -533,6 +533,11 @@ msgstr "Створено новий контейнер \"{name}\"" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Створення \"{path}\" для налаштування s3cmd." +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "Читання '{config_file}'" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "Створення каталогу журналу" @@ -716,6 +721,16 @@ msgstr "ПОМИЛКА: непідтримуваний git-хост «%s», ви msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "Помилка: {key} в {path} це не «архів» чи «репозиторій»!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -740,6 +755,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "Змінну середовища {var} від {configname} не налаштованоно!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "Змінну середовища {var} від {configname} не налаштованоно!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "Помилка розгортання 'github_releases', {} відсутній. (Можливо вам потрібно спочатку виконати `fdroid update`.)" @@ -986,6 +1006,11 @@ msgstr "Нехтування записом FUNDING.yml з датою після msgid "Ignoring bad element in manifest: %s" msgstr "Ігнорування поганого елемента в маніфесті: %s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "{oldfile} вилучено, використовується {newfile}" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "Нехтування пакунком без метаданих: " @@ -1356,6 +1381,10 @@ msgstr "В одному з елементів конфігурації 'github_r msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Підтримуються лише PNG та JPEG зображення, знайдено: {path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "Показувати лише ті застосунки, версія яких відрізняється від версії з Play Store" @@ -1753,6 +1782,10 @@ msgstr "Режим оновлення тегів, який використов msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "Тестовий режим - надсилайте випуск лише в каталозі tmp і завжди створюйте його, навіть якщо випуск вже існує." +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2856,6 +2889,11 @@ msgstr "{name} \"{section}/icons/{path}\" не існує! Виправте йо msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} вилучено, використовується {newfile}" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 4b154577..59894260 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -39,7 +39,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2025-01-23 09:05+0000\n" "Last-Translator: 大王叫我来巡山 \n" "Language-Team: Chinese (Simplified Han script) \n" @@ -551,6 +551,11 @@ msgstr "创建新容器 \"{name}\"" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "创建用于配置 s3cmd 的 \"{path}\"。" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "读取 '{config_file}'" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "创建日志目录" @@ -734,6 +739,16 @@ msgstr "错误:不支持的 git 主机类型 \"%s\",欢迎提交补丁添加 msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "错误: {path}中的{key}不是“archive”或“repo”!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -758,6 +773,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "没有设置 {configname} 中的环境变量 {var}!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "没有设置 {configname} 中的环境变量 {var}!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "部署'github_releases'错误,{}没有出现。(你可能需要先运行`fdroid update`)" @@ -1004,6 +1024,11 @@ msgstr "忽略超过 2048 的 FUNDING.yml 条目:%s" msgid "Ignoring bad element in manifest: %s" msgstr "忽略清单中的错误元素: %s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "{oldfile} 已弃用,请使用 {newfile}" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "忽略没有元数据的包: " @@ -1374,6 +1399,10 @@ msgstr "其中一个 'github_releases'配置项缺失'token'值。跳过..." msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "图形仅支持 PNG 和 JPEG,发现:{path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "仅输出与 Play Store 的差异" @@ -1769,6 +1798,10 @@ msgstr "git-svn 中使用的标记更新模式,但未使用标记设置存储 msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "测试模式:仅将输出保存至 tmp 目录,即使输出已存在,仍然编译。" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2866,6 +2899,11 @@ msgstr "{name}的“{section}/icons/{path}”不存在!请检查配置文件 msgid "{oldfile} is deprecated, use {newfile}" msgstr "{oldfile} 已弃用,请使用 {newfile}" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, python-brace-format msgid "{path} already exists, ignoring import results!" diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 079531af..23c8889a 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-01-21 17:02+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2024-11-26 15:16+0000\n" "Last-Translator: Peter Dave Hello \n" "Language-Team: Chinese (Traditional Han script) \n" @@ -524,6 +524,11 @@ msgstr "建立新容器 \"{name}\"" msgid "Creating \"{path}\" for configuring s3cmd." msgstr "正在建立組態 s3cmd 的 \"{path}\"。" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Creating empty {config_file}" +msgstr "讀取 '{config_file}' 中" + #: ../fdroidserver/publish.py msgid "Creating log directory" msgstr "建立日誌目錄" @@ -707,6 +712,16 @@ msgstr "錯誤:不支援的 git 主機「%s」,歡迎提交修補!" msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" msgstr "錯誤:{path} 中的 {key} 不是「archive」或「repo」!" +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "" + #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" @@ -731,6 +746,11 @@ msgstr "" msgid "Environment variable {var} from {configname} is not set!" msgstr "設定檔 {configname} 的環境變數 {var} 尚未設定!" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "設定檔 {configname} 的環境變數 {var} 尚未設定!" + #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" msgstr "部署「github_releases」時發生錯誤,找不到 {}。(您可能需要先執行 `fdroid update`。)" @@ -978,6 +998,11 @@ msgstr "忽略文檔 FUNDING.yml , 文檔大小超過 2048: %s" msgid "Ignoring bad element in manifest: %s" msgstr "忽略資訊清單中的無效元素:%s" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "檔案 {oldfile} 已經過時了, 請使用檔案 {newfile}" + #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " msgstr "忽略無中介資料的套件包: " @@ -1362,6 +1387,10 @@ msgstr "其中一個「github_releases」設定項目缺少「token」值。略 msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "圖像僅支援 PNG 和 JPEG,可在下方找到:{path}" +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "" + #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" msgstr "僅印出與 Play Store 的不同處" @@ -1764,6 +1793,10 @@ msgstr "在 git-svn 中使用了標籤更新模式,但儲存庫未設定標籤 msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." msgstr "測試模式 - 將輸出只放在 tmp 目錄中,即使輸出已經存在,仍然構建。" +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "" + #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format @@ -2897,6 +2930,11 @@ msgstr "{name} \"{section}/icons/{path}\" 不存在! 請檢查 \"config.yml\"." msgid "{oldfile} is deprecated, use {newfile}" msgstr "檔案 {oldfile} 已經過時了, 請使用檔案 {newfile}" +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "" + #: ../fdroidserver/import_subcommand.py #, fuzzy, python-brace-format msgid "{path} already exists, ignoring import results!" From 5e28cd367fc54356e3977ab907aee85f65c279b7 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 19 Mar 2025 20:08:47 +0800 Subject: [PATCH 1952/2116] scanner: add bun.lock as lock file of package.json --- fdroidserver/scanner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 549d43e3..7e106d2f 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -63,7 +63,7 @@ MAVEN_URL_REGEX = re.compile( DEPFILE = { "Cargo.toml": ["Cargo.lock"], "pubspec.yaml": ["pubspec.lock"], - "package.json": ["package-lock.json", "yarn.lock", "pnpm-lock.yaml"], + "package.json": ["package-lock.json", "yarn.lock", "pnpm-lock.yaml", "bun.lock"], } SCANNER_CACHE_VERSION = 1 From 20569217d9cd0a5723bf88f7ff7f2698e05e034d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 19 Mar 2025 17:39:45 +0100 Subject: [PATCH 1953/2116] index: fail if user sets mirrors:isPrimary wrong Really, this is not meant to be set by the user in the config. But if they add something harmless that'll be ignored anyway, it seems that throwing an error is too much. So only throw the error if it is set wrongly. --- fdroidserver/index.py | 11 +++++++++++ tests/test_index.py | 13 +++++++++++++ 2 files changed, 24 insertions(+) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 0beba4ef..873f401e 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -1516,6 +1516,7 @@ def add_mirrors_to_repodict(repo_section, repodict): repodict['mirrors'] = [] canonical_url = repodict['address'] found_primary = False + errors = 0 for mirror in mirrors: if canonical_url == mirror['url']: found_primary = True @@ -1524,9 +1525,19 @@ def add_mirrors_to_repodict(repo_section, repodict): for k in sorted(mirror.keys()): sortedmirror[k] = mirror[k] repodict['mirrors'].insert(0, sortedmirror) + elif mirror.get('isPrimary'): + errors += 1 + logging.error( + _('Mirror config for {url} contains "isPrimary" key!').format( + url=mirror['url'] + ) + ) else: repodict['mirrors'].append(mirror) + if errors: + raise FDroidException(_('"isPrimary" key should not be added to mirrors!')) + if repodict['mirrors'] and not found_primary: repodict['mirrors'].insert(0, {'isPrimary': True, 'url': repodict['address']}) diff --git a/tests/test_index.py b/tests/test_index.py index 059386fb..3e078eef 100755 --- a/tests/test_index.py +++ b/tests/test_index.py @@ -814,6 +814,19 @@ class IndexTest(unittest.TestCase): with self.assertRaises(fdroidserver.exception.FDroidException): index.add_mirrors_to_repodict('repo', repodict) + def test_erroneous_isPrimary_in_mirrors_config(self): + """There can be only one primary mirror aka canonical URL""" + common.config = { + 'repo_url': 'http://one/fdroid', + 'mirrors': [ + {'url': 'http://one/fdroid', 'countryCode': 'SA'}, + {'url': 'http://two/fdroid', 'isPrimary': True}, + ], + } + repodict = {'address': common.config['repo_url']} + with self.assertRaises(fdroidserver.exception.FDroidException): + index.add_mirrors_to_repodict('repo', repodict) + class AltstoreIndexTest(unittest.TestCase): def test_make_altstore(self): From ec2b847e035d13d0f259ba79b4229c1f9143f59a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 20 Mar 2025 09:57:09 +0100 Subject: [PATCH 1954/2116] handle arches that are missing dexdump in tests dexdump is only available for certain CPU architectures. Google binaries are for amd64 and arm64. Debian binaries are for amd64, arm64, armhf, i386, and riscv64. That leaves out armel, ppc64el, s390x, loong64, etc. where pure Python code runs perfectly fine. --- tests/test_scanner.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/tests/test_scanner.py b/tests/test_scanner.py index e2d4b5a6..6b59d7f0 100755 --- a/tests/test_scanner.py +++ b/tests/test_scanner.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 +import logging import os import pathlib import re @@ -29,6 +30,17 @@ from .shared_test_code import TmpCwd, mkdtemp, mock_open_to_str basedir = pathlib.Path(__file__).parent +def _dexdump_found(): + """Find if dexdump is available in the PATH or in an Android SDK install. + + This must be run after common.config is setup. + + """ + dexdump = fdroidserver.common.find_sdk_tools_cmd("dexdump") + logging.debug('Found dexdump: %s', dexdump) + return dexdump is not None + + # Always use built-in default rules so changes in downloaded rules don't break tests. @mock.patch( 'fdroidserver.scanner.SUSSDataController.load', @@ -387,11 +399,12 @@ class ScannerTest(unittest.TestCase): self.assertFalse(os.path.exists("build.gradle")) self.assertEqual(0, count, 'there should be this many errors') - @unittest.skipIf(os.uname().machine == 's390x', 'dexdump is not ported to s390x') def test_get_embedded_classes(self): config = dict() fdroidserver.common.config = config fdroidserver.common.fill_config_defaults(config) + if not _dexdump_found(): + self.skipTest('Some Debian arches lack dexdump') for f in ( 'apk.embedded_1.apk', 'bad-unicode-πÇÇ现代通用字-български-عربي1.apk', @@ -448,12 +461,13 @@ class ScannerTest(unittest.TestCase): 'should return not results for ' + f, ) - @unittest.skipIf(os.uname().machine == 's390x', 'dexdump is not ported to s390x') def test_get_embedded_classes_secret_apk(self): """Try to hide an APK+DEX in an APK and see if we can find it""" config = dict() fdroidserver.common.config = config fdroidserver.common.fill_config_defaults(config) + if not _dexdump_found(): + self.skipTest('Some Debian arches lack dexdump') apk = 'urzip.apk' mapzip = 'Norway_bouvet_europe_2.obf.zip' secretfile = os.path.join( @@ -493,6 +507,9 @@ class Test_scan_binary(unittest.TestCase): fdroidserver.common.config = config fdroidserver.common.options = mock.Mock() + if not _dexdump_found(): + self.skipTest('Some Debian arches lack dexdump') + fdroidserver.scanner._SCANNER_TOOL = mock.Mock() fdroidserver.scanner._SCANNER_TOOL.regexs = {} fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'] = { @@ -502,7 +519,6 @@ class Test_scan_binary(unittest.TestCase): } fdroidserver.scanner._SCANNER_TOOL.regexs['warn_code_signatures'] = {} - @unittest.skipIf(os.uname().machine == 's390x', 'dexdump is not ported to s390x') def test_code_signature_match(self): apkfile = os.path.join(basedir, 'no_targetsdk_minsdk1_unsigned.apk') self.assertEqual( @@ -516,7 +532,6 @@ class Test_scan_binary(unittest.TestCase): ), ) - @unittest.skipIf(os.uname().machine == 's390x', 'dexdump is not ported to s390x') def test_bottom_level_embedded_apk_code_signature(self): apkfile = os.path.join(basedir, 'apk.embedded_1.apk') fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'] = { @@ -537,7 +552,6 @@ class Test_scan_binary(unittest.TestCase): ), ) - @unittest.skipIf(os.uname().machine == 's390x', 'dexdump is not ported to s390x') def test_top_level_signature_embedded_apk_present(self): apkfile = os.path.join(basedir, 'apk.embedded_1.apk') fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'] = { From dad3299810538a1b227b2a6bdd8c36771bb6087a Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Thu, 20 Mar 2025 11:14:14 +0100 Subject: [PATCH 1955/2116] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ Translation: F-Droid/F-Droid Server --- locale/ar/LC_MESSAGES/fdroidserver.po | 2 +- locale/az/LC_MESSAGES/fdroidserver.po | 2 +- locale/be/LC_MESSAGES/fdroidserver.po | 2 +- locale/bg/LC_MESSAGES/fdroidserver.po | 2 +- locale/bn/LC_MESSAGES/fdroidserver.po | 2 +- locale/bo/LC_MESSAGES/fdroidserver.po | 2 +- locale/ca/LC_MESSAGES/fdroidserver.po | 2 +- locale/cs/LC_MESSAGES/fdroidserver.po | 2 +- locale/cy/LC_MESSAGES/fdroidserver.po | 2 +- locale/de/LC_MESSAGES/fdroidserver.po | 2 +- locale/el/LC_MESSAGES/fdroidserver.po | 2 +- locale/es/LC_MESSAGES/fdroidserver.po | 2 +- locale/es_AR/LC_MESSAGES/fdroidserver.po | 2 +- locale/es_MX/LC_MESSAGES/fdroidserver.po | 2 +- locale/eu/LC_MESSAGES/fdroidserver.po | 2 +- locale/fa/LC_MESSAGES/fdroidserver.po | 2 +- locale/fi/LC_MESSAGES/fdroidserver.po | 2 +- locale/fr/LC_MESSAGES/fdroidserver.po | 2 +- locale/fy/LC_MESSAGES/fdroidserver.po | 2 +- locale/ga/LC_MESSAGES/fdroidserver.po | 2 +- locale/he/LC_MESSAGES/fdroidserver.po | 2 +- locale/hi/LC_MESSAGES/fdroidserver.po | 2 +- locale/hu/LC_MESSAGES/fdroidserver.po | 2 +- locale/id/LC_MESSAGES/fdroidserver.po | 2 +- locale/it/LC_MESSAGES/fdroidserver.po | 2 +- locale/ja/LC_MESSAGES/fdroidserver.po | 2 +- locale/kab/LC_MESSAGES/fdroidserver.po | 2 +- locale/ko/LC_MESSAGES/fdroidserver.po | 2 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/locale/ar/LC_MESSAGES/fdroidserver.po b/locale/ar/LC_MESSAGES/fdroidserver.po index 22ec6e49..4e06fe85 100644 --- a/locale/ar/LC_MESSAGES/fdroidserver.po +++ b/locale/ar/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2024-09-21 19:31+0000\n" "Last-Translator: Cool Man \n" "Language-Team: Arabic \n" diff --git a/locale/az/LC_MESSAGES/fdroidserver.po b/locale/az/LC_MESSAGES/fdroidserver.po index 6d1de70c..6b68f920 100644 --- a/locale/az/LC_MESSAGES/fdroidserver.po +++ b/locale/az/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2023-05-26 19:39+0000\n" "Last-Translator: Mehrab Poladov \n" "Language-Team: Azerbaijani \n" diff --git a/locale/be/LC_MESSAGES/fdroidserver.po b/locale/be/LC_MESSAGES/fdroidserver.po index beead901..c5ba8f77 100644 --- a/locale/be/LC_MESSAGES/fdroidserver.po +++ b/locale/be/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2024-01-21 00:08+0000\n" "Last-Translator: flac \n" "Language-Team: Belarusian \n" diff --git a/locale/bg/LC_MESSAGES/fdroidserver.po b/locale/bg/LC_MESSAGES/fdroidserver.po index bc59842b..e88511d6 100644 --- a/locale/bg/LC_MESSAGES/fdroidserver.po +++ b/locale/bg/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2024-07-19 10:21+0000\n" "Last-Translator: 109247019824 \n" "Language-Team: Bulgarian \n" diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index 27d7d039..c8567a57 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2021-02-12 09:48+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali \n" diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index a6b7629d..935f01f4 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tibetan \n" diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index 8f5b7797..a67546fe 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2025-01-30 12:31+0000\n" "Last-Translator: pitroig \n" "Language-Team: Catalan \n" diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index e227c8ab..e937baa3 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2025-01-21 19:35+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" diff --git a/locale/cy/LC_MESSAGES/fdroidserver.po b/locale/cy/LC_MESSAGES/fdroidserver.po index 1b724acb..9abd6f5d 100644 --- a/locale/cy/LC_MESSAGES/fdroidserver.po +++ b/locale/cy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2021-01-16 21:23+0000\n" "Last-Translator: Aled Powell \n" "Language-Team: Welsh \n" diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 1a1fa873..4ac523ad 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -26,7 +26,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2025-01-23 09:05+0000\n" "Last-Translator: VfBFan \n" "Language-Team: German \n" diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index 4b2439d9..70d8abb9 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2024-05-10 13:24+0000\n" "Last-Translator: ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ \n" "Language-Team: Greek \n" diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 31f5fad7..194aa001 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2025-03-16 22:47+0000\n" "Last-Translator: Nicolás Pérez \n" "Language-Team: Spanish \n" diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index d2ecf72a..c6b73aaf 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2021-04-10 21:26+0000\n" "Last-Translator: Germe the fur star \n" "Language-Team: Spanish (Argentina) \n" diff --git a/locale/es_MX/LC_MESSAGES/fdroidserver.po b/locale/es_MX/LC_MESSAGES/fdroidserver.po index 2a671640..502180d0 100644 --- a/locale/es_MX/LC_MESSAGES/fdroidserver.po +++ b/locale/es_MX/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2020-04-29 12:49+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Spanish (Mexico) \n" diff --git a/locale/eu/LC_MESSAGES/fdroidserver.po b/locale/eu/LC_MESSAGES/fdroidserver.po index 509bf729..78fcd4ab 100644 --- a/locale/eu/LC_MESSAGES/fdroidserver.po +++ b/locale/eu/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index 157b9495..9f674f14 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2024-11-26 15:16+0000\n" "Last-Translator: Danial Behzadi \n" "Language-Team: Persian \n" diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index 3d542873..39e594c9 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2025-01-31 14:19+0000\n" "Last-Translator: Ricky Tigg \n" "Language-Team: Finnish \n" diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 9bcacb73..e97cdc5e 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -46,7 +46,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2025-03-02 16:42+0000\n" "Last-Translator: Lula Bye \n" "Language-Team: French \n" diff --git a/locale/fy/LC_MESSAGES/fdroidserver.po b/locale/fy/LC_MESSAGES/fdroidserver.po index fe0ebf1e..5ce679a1 100644 --- a/locale/fy/LC_MESSAGES/fdroidserver.po +++ b/locale/fy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2021-07-01 15:29+0000\n" "Last-Translator: Vancha March \n" "Language-Team: Frisian \n" diff --git a/locale/ga/LC_MESSAGES/fdroidserver.po b/locale/ga/LC_MESSAGES/fdroidserver.po index 7a1e9211..882f94fe 100644 --- a/locale/ga/LC_MESSAGES/fdroidserver.po +++ b/locale/ga/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1-162-gfbb3cc59\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2025-01-23 09:05+0000\n" "Last-Translator: Aindriú Mac Giolla Eoin \n" "Language-Team: Irish \n" diff --git a/locale/he/LC_MESSAGES/fdroidserver.po b/locale/he/LC_MESSAGES/fdroidserver.po index 04b21f37..e23526e7 100644 --- a/locale/he/LC_MESSAGES/fdroidserver.po +++ b/locale/he/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2024-08-18 06:27+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" diff --git a/locale/hi/LC_MESSAGES/fdroidserver.po b/locale/hi/LC_MESSAGES/fdroidserver.po index d6ba1290..a7539063 100644 --- a/locale/hi/LC_MESSAGES/fdroidserver.po +++ b/locale/hi/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2023-02-22 11:24+0000\n" "Last-Translator: Saurmandal \n" "Language-Team: Hindi \n" diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index 9d1b0a68..326f0202 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Hungarian \n" diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index 1c16348e..44b7ca49 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2024-10-04 04:26+0000\n" "Last-Translator: Doctorredits_here \n" "Language-Team: Indonesian \n" diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index ab21df99..5a201cf1 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2024-09-10 09:27+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Italian \n" diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 02a9b477..5e3f4b1a 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2025-02-08 06:22+0000\n" "Last-Translator: Liner Seven \n" "Language-Team: Japanese \n" diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index 2913994a..d0ae37f8 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2021-01-15 13:25+0000\n" "Last-Translator: R_SACI \n" "Language-Team: Kabyle \n" diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index be3dbd38..fe0249d9 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:55+0100\n" +"POT-Creation-Date: 2025-03-19 17:56+0100\n" "PO-Revision-Date: 2024-09-06 14:57+0000\n" "Last-Translator: Cxnfl1ct \n" "Language-Team: Korean \n" From af147855f6eef09efc5254c5df25dc56b9c8928a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20R=C3=BCckert?= Date: Thu, 20 Mar 2025 11:14:15 +0100 Subject: [PATCH 1956/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Portu?= =?UTF-8?q?guese=20(Brazil)=20(pt=5FBR)=20by=20Igor=20R=C3=BCckert=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (621 of 621 strings) Co-authored-by: Igor Rückert Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/ Translation: F-Droid/F-Droid Server --- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 29 ++++++++++++------------ 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index c9a496b1..ca104de7 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -14,20 +14,21 @@ # Jose Delvani , 2024. # LucasMZ , 2024, 2025. # dedakir923 , 2024. +# Igor Rückert , 2025. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-19 17:56+0100\n" -"PO-Revision-Date: 2025-01-23 16:02+0000\n" -"Last-Translator: LucasMZ \n" +"PO-Revision-Date: 2025-03-20 01:45+0000\n" +"Last-Translator: Igor Rückert \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.10-dev\n" +"X-Generator: Weblate 5.11-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -533,9 +534,9 @@ msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Criando \"{path}\" para configurar s3cmd." #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Creating empty {config_file}" -msgstr "Lendo '{config_file}'" +msgstr "Criando '{config_file}' vazio" #: ../fdroidserver/publish.py msgid "Creating log directory" @@ -723,12 +724,12 @@ msgstr "ERRO: {key} em {path} não é um \"arquivamento\" ou \"repositório\"!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} not a valid key!" -msgstr "" +msgstr "ERRO: {key} não é uma chave válida!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}'s value should be of type {t}!" -msgstr "" +msgstr "ERRO: o valor de {key} deve ser do tipo {t}!" #: ../fdroidserver/lint.py #, python-brace-format @@ -755,9 +756,9 @@ msgid "Environment variable {var} from {configname} is not set!" msgstr "A variável de ambiente {var} de {configname} não está definida!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Environment variable {{env: {var}}} is not set!" -msgstr "A variável de ambiente {var} de {configname} não está definida!" +msgstr "A variável de ambiente {{env: {var} não está definida!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" @@ -1006,9 +1007,9 @@ msgid "Ignoring bad element in manifest: %s" msgstr "Ignorando o elemento mau no manifesto: %s" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Ignoring deprecated {oldfile}, use {newfile}!" -msgstr "{oldfile} foi descontinuado, use {newfile}" +msgstr "Ignorando {oldfile} obsoleto, use {newfile}!" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1382,7 +1383,7 @@ msgstr "Apenas PNG e JPEG são suportados para gráficos, encontrados: {path}" #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" -msgstr "" +msgstr "Aceita apenas uma única chave \"env\"" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" @@ -1782,7 +1783,7 @@ msgstr "Modo de teste - coloque a saída apenas no diretório tmp e sempre compi #: ../fdroidserver/index.py msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" -msgstr "" +msgstr "O pacote Python \"qrcode\" não está instalado (por exemplo, apt-get install python3-qrcode)!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -2887,7 +2888,7 @@ msgstr "{oldfile} foi descontinuado, use {newfile}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" -msgstr "" +msgstr "{path1} é uma duplicata de {path2}, remova uma!" #: ../fdroidserver/import_subcommand.py #, python-brace-format From d67a7c1b04ee0edd8ea10439e221cbef0ba6e6af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Thu, 20 Mar 2025 11:14:15 +0100 Subject: [PATCH 1957/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Chine?= =?UTF-8?q?se=20(Simplified=20Han=20script)=20(zh=5FHans)=20by=20=E5=A4=A7?= =?UTF-8?q?=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1=E5=B1=B1=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (621 of 621 strings) Co-authored-by: 大王叫我来巡山 Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 26 +++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 59894260..8fc08f01 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -40,7 +40,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-19 17:56+0100\n" -"PO-Revision-Date: 2025-01-23 09:05+0000\n" +"PO-Revision-Date: 2025-03-20 02:51+0000\n" "Last-Translator: 大王叫我来巡山 \n" "Language-Team: Chinese (Simplified Han script) \n" "Language: zh_Hans\n" @@ -48,7 +48,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.10-dev\n" +"X-Generator: Weblate 5.11-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -552,9 +552,9 @@ msgid "Creating \"{path}\" for configuring s3cmd." msgstr "创建用于配置 s3cmd 的 \"{path}\"。" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Creating empty {config_file}" -msgstr "读取 '{config_file}'" +msgstr "正在创建空的 {config_file} 文件" #: ../fdroidserver/publish.py msgid "Creating log directory" @@ -742,12 +742,12 @@ msgstr "错误: {path}中的{key}不是“archive”或“repo”!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} not a valid key!" -msgstr "" +msgstr "错误:{key} 不是有效的密钥!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}'s value should be of type {t}!" -msgstr "" +msgstr "错误:{key} 的值的类型应为 {t}!" #: ../fdroidserver/lint.py #, python-brace-format @@ -774,9 +774,9 @@ msgid "Environment variable {var} from {configname} is not set!" msgstr "没有设置 {configname} 中的环境变量 {var}!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Environment variable {{env: {var}}} is not set!" -msgstr "没有设置 {configname} 中的环境变量 {var}!" +msgstr "没有设置环境变量 {{env: {var}}} !" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" @@ -1025,9 +1025,9 @@ msgid "Ignoring bad element in manifest: %s" msgstr "忽略清单中的错误元素: %s" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Ignoring deprecated {oldfile}, use {newfile}!" -msgstr "{oldfile} 已弃用,请使用 {newfile}" +msgstr "正在忽略已弃用的 {oldfile} 文件,请使用 {newfile}!" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1401,7 +1401,7 @@ msgstr "图形仅支持 PNG 和 JPEG,发现:{path}" #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" -msgstr "" +msgstr "只接受单一密钥 “env\"" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" @@ -1800,7 +1800,7 @@ msgstr "测试模式:仅将输出保存至 tmp 目录,即使输出已存在 #: ../fdroidserver/index.py msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" -msgstr "" +msgstr "\"qrcode\" Python 包未安装 (如 apt-get install python3-qrcode)!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -2902,7 +2902,7 @@ msgstr "{oldfile} 已弃用,请使用 {newfile}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" -msgstr "" +msgstr "{path1} 与 {path2} 重复,请删除一个!" #: ../fdroidserver/import_subcommand.py #, python-brace-format From f6011ae304a689009ad7e8380898697ca8bb025e Mon Sep 17 00:00:00 2001 From: VfBFan Date: Thu, 20 Mar 2025 11:14:15 +0100 Subject: [PATCH 1958/2116] Translated using Weblate: German (de) by VfBFan Currently translated at 100.0% (621 of 621 strings) Translated using Weblate: German (de) by VfBFan Currently translated at 99.5% (618 of 621 strings) Co-authored-by: VfBFan Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 40 +++++++++++++-------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 4ac523ad..2f3b5ece 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -27,7 +27,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-19 17:56+0100\n" -"PO-Revision-Date: 2025-01-23 09:05+0000\n" +"PO-Revision-Date: 2025-03-20 10:14+0000\n" "Last-Translator: VfBFan \n" "Language-Team: German \n" "Language: de\n" @@ -35,7 +35,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.10-dev\n" +"X-Generator: Weblate 5.11-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -541,9 +541,9 @@ msgid "Creating \"{path}\" for configuring s3cmd." msgstr "\"{path}\" für die Konfiguration von S3cmd wird erstellt." #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Creating empty {config_file}" -msgstr "Lese '{config_file}'" +msgstr "Erstelle leere {config_file}" #: ../fdroidserver/publish.py msgid "Creating log directory" @@ -731,12 +731,12 @@ msgstr "FEHLER: {key} in {path} ist nicht \"archive\" oder \"repo\"!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} not a valid key!" -msgstr "" +msgstr "FEHLER: {key} ist kein gültiger Schlüssel!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}'s value should be of type {t}!" -msgstr "" +msgstr "FEHLER: {key}s Wert sollte vom Typ {t} sein!" #: ../fdroidserver/lint.py #, python-brace-format @@ -763,9 +763,9 @@ msgid "Environment variable {var} from {configname} is not set!" msgstr "Umgebungsvariable {var} von {configname} ist nicht gesetzt!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Environment variable {{env: {var}}} is not set!" -msgstr "Umgebungsvariable {var} von {configname} ist nicht gesetzt!" +msgstr "Umgebungsvariable {{env: {var}}} ist nicht gesetzt!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" @@ -1014,9 +1014,9 @@ msgid "Ignoring bad element in manifest: %s" msgstr "Ignoriere schlechtes Element im Manifest: %s" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Ignoring deprecated {oldfile}, use {newfile}!" -msgstr "{oldfile} ist veraltet, benutze {newfile}" +msgstr "Ignoriere veraltete {oldfile}, benutze {newfile}!" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1306,7 +1306,7 @@ msgstr "Keine signierte Apk für %s verfügbar" #: ../fdroidserver/install.py msgid "No signed output directory - nothing to do" -msgstr "Kein signiertes Ausgabeverzeichnis - nichts zu tun" +msgstr "Kein signiertes Ausgabeverzeichnis – nichts zu tun" #: ../fdroidserver/common.py #, python-brace-format @@ -1330,7 +1330,7 @@ msgstr "Keine Tags gefunden" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "No unsigned directory - nothing to do" -msgstr "Kein unsigniertes Verzeichnis - nichts zu tun" +msgstr "Kein unsigniertes Verzeichnis – nichts zu tun" #: ../fdroidserver/__main__.py msgid "No version information could be found." @@ -1390,7 +1390,7 @@ msgstr "Nur PNG und JPEG werden für Grafiken unterstützt, gefunden wurde: {pat #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" -msgstr "" +msgstr "Nur ein einziger Schlüssel \"env\" wird akzeptiert" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" @@ -1439,7 +1439,7 @@ msgstr "Paket \"{appid}\" existiert bereits" #: ../fdroidserver/common.py #, python-brace-format msgid "Parsing manifest at '{path}'" -msgstr "Analysiere Manifest bei {path}" +msgstr "Analysiere Manifest bei '{path}'" #: ../fdroidserver/common.py msgid "Password required with username" @@ -1478,7 +1478,7 @@ msgstr "Problem mit der ZIP-Datei: %s, Fehler %s" #: ../fdroidserver/common.py #, python-brace-format msgid "Problem with xml at '{path}'" -msgstr "Problem mit xml bei {path}" +msgstr "Problem mit xml bei '{path}'" #: ../fdroidserver/checkupdates.py msgid "Process auto-updates" @@ -1786,11 +1786,11 @@ msgstr "Aktualisierungsmodus mit Tags in git-svn verwendet, aber das Repo wurde #: ../fdroidserver/build.py msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." -msgstr "Testmodus - Ausgabe nur ins tmp-Verzeichnis einfügen, immer erstellen, selbst wenn die Ausgabe bereits vorhanden ist." +msgstr "Testmodus – Ausgabe nur ins tmp-Verzeichnis einfügen, immer erstellen, selbst wenn die Ausgabe bereits vorhanden ist." #: ../fdroidserver/index.py msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" -msgstr "" +msgstr "Das Python-Paket \"qrcode\" ist nicht installiert (z. B. apt-get install python3-qrcode)!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1821,7 +1821,7 @@ msgstr "Das Wurzelverzeichnis für local_copy_dir \"{path}\" existiert nicht!" #: ../fdroidserver/publish.py msgid "There is a keyalias collision - publishing halted" -msgstr "Es gibt eine Keyalias-Kollision - Veröffentlichung gestoppt" +msgstr "Es gibt eine Keyalias-Kollision – Veröffentlichung gestoppt" #: ../fdroidserver/common.py msgid "These are the apps that have been archived from the main repo." @@ -2890,12 +2890,12 @@ msgstr "{name} \"{section}/icons/{path}\" existiert nicht! Überprüfe \"config. #: ../fdroidserver/common.py #, python-brace-format msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile} ist veraltet, benutze {newfile}" +msgstr "{oldfile} ist veraltet, verwenden Sie {newfile}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" -msgstr "" +msgstr "{path1} ist ein Duplikat von {path2}, entfernen Sie eines!" #: ../fdroidserver/import_subcommand.py #, python-brace-format From efd79866a796f3118d6cc9fd163141c925518d34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=93=D0=BE=D1=80?= =?UTF-8?q?=D0=BF=D0=B8=D0=BD=D1=96=D1=87?= Date: Thu, 20 Mar 2025 11:14:15 +0100 Subject: [PATCH 1959/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Ukrai?= =?UTF-8?q?nian=20(uk)=20by=20=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20?= =?UTF-8?q?=D0=93=D0=BE=D1=80=D0=BF=D0=B8=D0=BD=D1=96=D1=87=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (621 of 621 strings) Co-authored-by: Максим Горпиніч Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 1f311c97..76487eef 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -18,7 +18,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-19 17:56+0100\n" -"PO-Revision-Date: 2025-01-21 18:50+0000\n" +"PO-Revision-Date: 2025-03-20 10:14+0000\n" "Last-Translator: Максим Горпиніч \n" "Language-Team: Ukrainian \n" "Language: uk\n" @@ -26,7 +26,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.10-dev\n" +"X-Generator: Weblate 5.11-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -534,9 +534,9 @@ msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Створення \"{path}\" для налаштування s3cmd." #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Creating empty {config_file}" -msgstr "Читання '{config_file}'" +msgstr "Створення пустого {config_file}" #: ../fdroidserver/publish.py msgid "Creating log directory" @@ -724,12 +724,12 @@ msgstr "Помилка: {key} в {path} це не «архів» чи «репо #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} not a valid key!" -msgstr "" +msgstr "ПОМИЛКА: {key} недійсний ключ!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}'s value should be of type {t}!" -msgstr "" +msgstr "ПОМИЛКА: значення {key} має бути типу {t}!" #: ../fdroidserver/lint.py #, python-brace-format @@ -756,9 +756,9 @@ msgid "Environment variable {var} from {configname} is not set!" msgstr "Змінну середовища {var} від {configname} не налаштованоно!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Environment variable {{env: {var}}} is not set!" -msgstr "Змінну середовища {var} від {configname} не налаштованоно!" +msgstr "Змінна середовища {{env: {var}}} не встановлена!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" @@ -1007,9 +1007,9 @@ msgid "Ignoring bad element in manifest: %s" msgstr "Ігнорування поганого елемента в маніфесті: %s" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Ignoring deprecated {oldfile}, use {newfile}!" -msgstr "{oldfile} вилучено, використовується {newfile}" +msgstr "Ігноруючи застарілий {oldfile}, використовуйте {newfile}!" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1383,7 +1383,7 @@ msgstr "Підтримуються лише PNG та JPEG зображення, #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" -msgstr "" +msgstr "Приймає лише один ключ \"env\"" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" @@ -1784,7 +1784,7 @@ msgstr "Тестовий режим - надсилайте випуск лише #: ../fdroidserver/index.py msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" -msgstr "" +msgstr "Пакет Python \"qrcode\" не встановлено (наприклад, apt-get install python3-qrcode)!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -2892,7 +2892,7 @@ msgstr "{oldfile} вилучено, використовується {newfile}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" -msgstr "" +msgstr "{path1} є дублікатом {path2}, видаліть один!" #: ../fdroidserver/import_subcommand.py #, python-brace-format From 46939ec4ba2990d97e409859b331db50403fd09c Mon Sep 17 00:00:00 2001 From: Edgars Andersons Date: Thu, 20 Mar 2025 11:14:15 +0100 Subject: [PATCH 1960/2116] Translated using Weblate: Latvian (lv) by Edgars Andersons Currently translated at 10.7% (67 of 621 strings) Co-authored-by: Edgars Andersons Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/lv/ Translation: F-Droid/F-Droid Server --- locale/lv/LC_MESSAGES/fdroidserver.po | 54 +++++++++++++-------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/locale/lv/LC_MESSAGES/fdroidserver.po b/locale/lv/LC_MESSAGES/fdroidserver.po index 7677b96e..7b419eba 100644 --- a/locale/lv/LC_MESSAGES/fdroidserver.po +++ b/locale/lv/LC_MESSAGES/fdroidserver.po @@ -1,13 +1,13 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # "Coool (github.com/Coool)" , 2024. -# Edgars Andersons , 2024. +# Edgars Andersons , 2024, 2025. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-19 17:56+0100\n" -"PO-Revision-Date: 2024-11-22 21:03+0000\n" +"PO-Revision-Date: 2025-03-20 10:14+0000\n" "Last-Translator: Edgars Andersons \n" "Language-Team: Latvian \n" "Language: lv\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= 19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" -"X-Generator: Weblate 5.9-dev\n" +"X-Generator: Weblate 5.11-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -519,41 +519,41 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Creating empty {config_file}" -msgstr "" +msgstr "Izveido tukšu {config_file}" #: ../fdroidserver/publish.py msgid "Creating log directory" -msgstr "" +msgstr "Izveido žurnālu mapi" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Creating new S3 bucket: {url}" -msgstr "" +msgstr "Izveido jaunu S3 kŗājumu: {url}" #: ../fdroidserver/publish.py msgid "Creating output directory" -msgstr "" +msgstr "Izveido izvades mapi" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" -msgstr "" +msgstr "Izveido parakstītu indeksu ar šo atslēgu (SHA256):" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" -msgstr "" +msgstr "Izveido pagaidu mapi" #: ../fdroidserver/index.py msgid "Creating unsigned index in preparation for signing" -msgstr "" +msgstr "Izveido neparakstītu indeksu, lai sagatavotos parakstīšanai" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "" +msgstr "CurrentVersionCode {cv} ir mazāks par vecāko būvējuma ierakstu {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" -msgstr "" +msgstr "DEBUG_KEYSTORE nav iestatīts vai vērtība ir nepilnīga" #: ../fdroidserver/update.py msgid "Delete APKs and/or OBBs without metadata from the repo" @@ -562,17 +562,17 @@ msgstr "" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting archive, repo is too big ({size} max {limit})" -msgstr "" +msgstr "Izdzēš arhīvu, glabātava ir pārāk liela ({size}; pieļaujamais izmērs ir {limit})" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "" +msgstr "Izdzēš git-mirror vēsturi, glabātava ir pārāk liela ({size}; pieļaujamais izmērs ir {limit})" #: ../fdroidserver/update.py #, python-brace-format msgid "Deleting unknown file: {path}" -msgstr "" +msgstr "Izdzēš nezināmu datni: {path}" #: ../fdroidserver/lint.py #, python-format @@ -705,12 +705,12 @@ msgstr "" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} not a valid key!" -msgstr "" +msgstr "KĻŪDA: {key} nav derīga atslēga." #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}'s value should be of type {t}!" -msgstr "" +msgstr "KĻŪDA: {key} vērtībai vajadzētu būt ar veidu \"{t}\"." #: ../fdroidserver/lint.py #, python-brace-format @@ -737,7 +737,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Environment variable {{env: {var}}} is not set!" -msgstr "" +msgstr "Vides mainīgais {{env: {var}}} nav iestatīts." #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" @@ -988,7 +988,7 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "Ignoring deprecated {oldfile}, use {newfile}!" -msgstr "" +msgstr "Neņem vērā novecojušo {oldfile}, jāizmanto {newfile}." #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1362,15 +1362,15 @@ msgstr "" #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" -msgstr "" +msgstr "Pieņem tikai vienas atslēgas \"env\"" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" -msgstr "" +msgstr "Drukāt tikai atšķirības no Play Store" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" -msgstr "" +msgstr "Apstrādāt tikai lietotnes ar automātiskajiem atjauninājumiem" #: ../fdroidserver/lint.py msgid "OpenCollective donation methods belong in the OpenCollective: field" @@ -1762,7 +1762,7 @@ msgstr "" #: ../fdroidserver/index.py msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" -msgstr "" +msgstr "Python pakotne \"qrcode\" nav uzstādīta (piemēram, `apt-get install python3-qrcode`)." #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -2173,15 +2173,15 @@ msgstr "" #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." -msgstr "" +msgstr "apksigner būvēšanas rīkos {version} izlaiž APK ar nederīgiem v3 parakstiem, neņem vērā." #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" -msgstr "" +msgstr "apksigner nav atrasts. Nevar parakstīt vai apliecināt mūsdienīgus APK" #: ../fdroidserver/common.py msgid "apksigner not found, it's required for signing!" -msgstr "" +msgstr "apksigner nav atrasts, tas ir nepieciešams parakstīšanai." #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py @@ -2860,7 +2860,7 @@ msgstr "" #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" -msgstr "" +msgstr "{path1} ir tāds pats kā {path2}, viens no tiem ir jānoņem." #: ../fdroidserver/import_subcommand.py #, python-brace-format From 88108c8381479ded684751faf6cb916f04617137 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 20 Mar 2025 14:35:33 +0100 Subject: [PATCH 1961/2116] update CHANGELOG.md --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 808b8f61..708cb8b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1587 * publish/signindex/gpgsign no longer load the _qrcode_ and _requests_ modules, and can operate without them installed. +* scanner: add bun.lock as lock file of package.json + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1615 +* index: fail if user sets mirrors:isPrimary wrong + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1617 + https://gitlab.com/fdroid/fdroidserver/-/issues/1125 ### Removed From c17a9253ffacc2d99eda2720bd789a9f96f3fa95 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 20 Mar 2025 14:35:51 +0100 Subject: [PATCH 1962/2116] version 2.4 alpha 2 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 8485c8a0..45d16182 100755 --- a/setup.py +++ b/setup.py @@ -70,7 +70,7 @@ with open("README.md", "r") as fh: setup( name='fdroidserver', - version='2.4a1', + version='2.4a2', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From b911fb9ed9aa960d73b7f4392a35ab27d5252b08 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 20 Mar 2025 15:06:54 +0100 Subject: [PATCH 1963/2116] make -C locale/ update --- locale/ar/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/az/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/be/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/bg/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/bn/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/bo/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/ca/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/cs/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/cy/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/de/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/el/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/es/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/es_AR/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/es_MX/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/eu/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/fa/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/fdroidserver.pot | 13 +++++++++++-- locale/fi/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/fr/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/fy/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/ga/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/he/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/hi/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/hu/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/id/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/it/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/ja/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/kab/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/ko/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/lv/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/ml/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/nl/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/nn/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/pa/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/pl/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/pt/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/ro/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/ru/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/sk/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/sq/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/sr/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/sv/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/sw/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/ta/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/tr/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/tzm/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/ug/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/uk/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 11 ++++++++++- 53 files changed, 531 insertions(+), 54 deletions(-) diff --git a/locale/ar/LC_MESSAGES/fdroidserver.po b/locale/ar/LC_MESSAGES/fdroidserver.po index 4e06fe85..ec60d431 100644 --- a/locale/ar/LC_MESSAGES/fdroidserver.po +++ b/locale/ar/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2024-09-21 19:31+0000\n" "Last-Translator: Cool Man \n" "Language-Team: Arabic \n" @@ -38,6 +38,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1200,6 +1204,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/az/LC_MESSAGES/fdroidserver.po b/locale/az/LC_MESSAGES/fdroidserver.po index 6b68f920..d86d8a8c 100644 --- a/locale/az/LC_MESSAGES/fdroidserver.po +++ b/locale/az/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2023-05-26 19:39+0000\n" "Last-Translator: Mehrab Poladov \n" "Language-Team: Azerbaijani \n" @@ -34,6 +34,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1196,6 +1200,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/be/LC_MESSAGES/fdroidserver.po b/locale/be/LC_MESSAGES/fdroidserver.po index c5ba8f77..dbd2510b 100644 --- a/locale/be/LC_MESSAGES/fdroidserver.po +++ b/locale/be/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2024-01-21 00:08+0000\n" "Last-Translator: flac \n" "Language-Team: Belarusian \n" @@ -39,6 +39,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" не супадае з файлам метаданных!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1201,6 +1205,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/bg/LC_MESSAGES/fdroidserver.po b/locale/bg/LC_MESSAGES/fdroidserver.po index e88511d6..5e1756bf 100644 --- a/locale/bg/LC_MESSAGES/fdroidserver.po +++ b/locale/bg/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2024-07-19 10:21+0000\n" "Last-Translator: 109247019824 \n" "Language-Team: Bulgarian \n" @@ -35,6 +35,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1197,6 +1201,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index c8567a57..1e52fcb3 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2021-02-12 09:48+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali \n" @@ -34,6 +34,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1196,6 +1200,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index 935f01f4..71f6a190 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tibetan \n" @@ -39,6 +39,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" འདི་དང་མཐུན་པའི་རྒྱབ་ལྗོངས་ཡིག་ཆ་མིན་འདུག!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, fuzzy, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1213,6 +1217,11 @@ msgstr "བཟོ་ལྟ་ཤོར་བའི་ serverwebroot line:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index a67546fe..a54c5f23 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2025-01-30 12:31+0000\n" "Last-Translator: pitroig \n" "Language-Team: Catalan \n" @@ -44,6 +44,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" no té cap fitxer de metadades coincidents!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1210,6 +1214,11 @@ msgstr "Línia mal formada de serverwebroot:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "S'ha arribat a la profunditat màxima de recursivitat en el fitxer ZIP: %s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Reflecteix el dipòsit complet i l'arxiu, tots els tipus de fitxers." diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index e937baa3..406c8d49 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2025-01-21 19:35+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" @@ -46,6 +46,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "„%s/“ nemá žádný odpovídající soubor metadat!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1214,6 +1218,11 @@ msgstr "Poškozený řádek serverwebroot:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "Dosažena maximální hloubka rekurze v souboru ZIP: %s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Zrcadlení celého repozitáře a archivu, všechny typy souborů." diff --git a/locale/cy/LC_MESSAGES/fdroidserver.po b/locale/cy/LC_MESSAGES/fdroidserver.po index 9abd6f5d..e97b9280 100644 --- a/locale/cy/LC_MESSAGES/fdroidserver.po +++ b/locale/cy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2021-01-16 21:23+0000\n" "Last-Translator: Aled Powell \n" "Language-Team: Welsh \n" @@ -34,6 +34,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1204,6 +1208,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 2f3b5ece..a118d57f 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -26,7 +26,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2025-03-20 10:14+0000\n" "Last-Translator: VfBFan \n" "Language-Team: German \n" @@ -59,6 +59,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" besitzt keine zugehörige Metadaten-Datei!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1225,6 +1229,11 @@ msgstr "Fehlerhafte serverwebroot-Zeile:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "Maximale Rekursionstiefe in ZIP-Datei erreicht: %s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Spiegeln Sie die komplette Paketquelle und das Archiv, inklusive aller Dateitypen." diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index 70d8abb9..c74b5621 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2024-05-10 13:24+0000\n" "Last-Translator: ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ \n" "Language-Team: Greek \n" @@ -41,6 +41,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" δεν έχει αρχείο μετα-δεδομένων που να ταιριάζει!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1203,6 +1207,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 194aa001..10e1aa35 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2025-03-16 22:47+0000\n" "Last-Translator: Nicolás Pérez \n" "Language-Team: Spanish \n" @@ -51,6 +51,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "¡\"%s/\" no tiene su correspondiente fichero de metadatos!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1217,6 +1221,11 @@ msgstr "Línea serverwebroot mal formada:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "Se alcanzó el máximo en el archivo ZIP: %s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Crea un espejo completo del repositorio y del archivo, todos los tipos de fichero." diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index c6b73aaf..0877ff81 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2021-04-10 21:26+0000\n" "Last-Translator: Germe the fur star \n" "Language-Team: Spanish (Argentina) \n" @@ -39,6 +39,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, fuzzy, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1210,6 +1214,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/es_MX/LC_MESSAGES/fdroidserver.po b/locale/es_MX/LC_MESSAGES/fdroidserver.po index 502180d0..e3e9df44 100644 --- a/locale/es_MX/LC_MESSAGES/fdroidserver.po +++ b/locale/es_MX/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2020-04-29 12:49+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Spanish (Mexico) \n" @@ -35,6 +35,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1201,6 +1205,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/eu/LC_MESSAGES/fdroidserver.po b/locale/eu/LC_MESSAGES/fdroidserver.po index 78fcd4ab..2f7972d3 100644 --- a/locale/eu/LC_MESSAGES/fdroidserver.po +++ b/locale/eu/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -33,6 +33,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1195,6 +1199,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index 9f674f14..00e762d6 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2024-11-26 15:16+0000\n" "Last-Translator: Danial Behzadi \n" "Language-Team: Persian \n" @@ -37,6 +37,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1199,6 +1203,11 @@ msgstr "خط ریشهٔ وب کارساز بدریخت:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/fdroidserver.pot b/locale/fdroidserver.pot index 337a01b0..07258fc9 100644 --- a/locale/fdroidserver.pot +++ b/locale/fdroidserver.pot @@ -5,9 +5,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: fdroidserver 2.4a1-12-g4448aeb5\n" +"Project-Id-Version: fdroidserver 2.4a2\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -35,6 +35,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1197,6 +1201,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index 39e594c9..17372f5a 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2025-01-31 14:19+0000\n" "Last-Translator: Ricky Tigg \n" "Language-Team: Finnish \n" @@ -36,6 +36,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1198,6 +1202,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index e97cdc5e..ae1fb8e2 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -46,7 +46,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2025-03-02 16:42+0000\n" "Last-Translator: Lula Bye \n" "Language-Team: French \n" @@ -79,6 +79,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" n'a pas de fichier de métadonnées correspondant !" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1245,6 +1249,11 @@ msgstr "serverwebroot malformer en ligne :" msgid "Max recursion depth in ZIP file reached: %s" msgstr "Profondeur maximale de récursivité dans le fichier ZIP atteinte : %s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Cloner entièrement le repo et les archives, tous les fichiers." diff --git a/locale/fy/LC_MESSAGES/fdroidserver.po b/locale/fy/LC_MESSAGES/fdroidserver.po index 5ce679a1..ce350f75 100644 --- a/locale/fy/LC_MESSAGES/fdroidserver.po +++ b/locale/fy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2021-07-01 15:29+0000\n" "Last-Translator: Vancha March \n" "Language-Team: Frisian \n" @@ -34,6 +34,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1196,6 +1200,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/ga/LC_MESSAGES/fdroidserver.po b/locale/ga/LC_MESSAGES/fdroidserver.po index 882f94fe..d668bc3f 100644 --- a/locale/ga/LC_MESSAGES/fdroidserver.po +++ b/locale/ga/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1-162-gfbb3cc59\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2025-01-23 09:05+0000\n" "Last-Translator: Aindriú Mac Giolla Eoin \n" "Language-Team: Irish \n" @@ -38,6 +38,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "Níl aon chomhad meiteashonraí meaitseála ag \"%s/\"!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1210,6 +1214,11 @@ msgstr "Líne freastalaí míchumthawebroot:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "Sroicheadh uasdoimhneacht athchúrsaithe sa chomhad ZIP: %s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Scáthánaigh an repo iomlán agus cartlann, gach cineál comhaid." diff --git a/locale/he/LC_MESSAGES/fdroidserver.po b/locale/he/LC_MESSAGES/fdroidserver.po index e23526e7..8c8507e7 100644 --- a/locale/he/LC_MESSAGES/fdroidserver.po +++ b/locale/he/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2024-08-18 06:27+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" @@ -35,6 +35,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1197,6 +1201,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/hi/LC_MESSAGES/fdroidserver.po b/locale/hi/LC_MESSAGES/fdroidserver.po index a7539063..abd76c3a 100644 --- a/locale/hi/LC_MESSAGES/fdroidserver.po +++ b/locale/hi/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2023-02-22 11:24+0000\n" "Last-Translator: Saurmandal \n" "Language-Team: Hindi \n" @@ -35,6 +35,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1197,6 +1201,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index 326f0202..d0f681b7 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Hungarian \n" @@ -40,6 +40,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "A(z) „%s/” nem rendelkezik megfelelő metaadatfájllal." +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1212,6 +1216,11 @@ msgstr "Rosszul formázott serverwebroot sor:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "A teljes tároló és archívum tükrözés, minden fájltípussal." diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index 44b7ca49..3c5bdfbd 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2024-10-04 04:26+0000\n" "Last-Translator: Doctorredits_here \n" "Language-Team: Indonesian \n" @@ -41,6 +41,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" tidak ada kesesuaian pada berkas metadata!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1201,6 +1205,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 5a201cf1..0d09e237 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2024-09-10 09:27+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Italian \n" @@ -54,6 +54,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" non ha un file di metadati corrispondente!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1222,6 +1226,11 @@ msgstr "Riga del serverwebroot malformata:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "Raggiunta la massima profondità di ricorsione nel file ZIP: %s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Rispecchiare il repository completo e l'archivio, tutti i tipi di file." diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 5e3f4b1a..fd9b2186 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2025-02-08 06:22+0000\n" "Last-Translator: Liner Seven \n" "Language-Team: Japanese \n" @@ -41,6 +41,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "「\"%s/」に合致するメタデータのファイルはありません!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1205,6 +1209,11 @@ msgstr "serverwebrootの行の形式が不正です:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "ZIPファイルの最大の再帰階層に到達しました:%s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "完全なリポジトリとアーカイブ、全てのファイルの種類のミラーリング。" diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index d0ae37f8..dc4815ef 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2021-01-15 13:25+0000\n" "Last-Translator: R_SACI \n" "Language-Team: Kabyle \n" @@ -36,6 +36,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1201,6 +1205,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index fe0249d9..0230368d 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2024-09-06 14:57+0000\n" "Last-Translator: Cxnfl1ct \n" "Language-Team: Korean \n" @@ -40,6 +40,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\"에 일치하는 메타데이터 파일이 없습니다!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, fuzzy, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1202,6 +1206,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/lv/LC_MESSAGES/fdroidserver.po b/locale/lv/LC_MESSAGES/fdroidserver.po index 7b419eba..2be3c31d 100644 --- a/locale/lv/LC_MESSAGES/fdroidserver.po +++ b/locale/lv/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2025-03-20 10:14+0000\n" "Last-Translator: Edgars Andersons \n" "Language-Team: Latvian \n" @@ -35,6 +35,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1197,6 +1201,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/ml/LC_MESSAGES/fdroidserver.po b/locale/ml/LC_MESSAGES/fdroidserver.po index 77fadfda..3c7ba4e9 100644 --- a/locale/ml/LC_MESSAGES/fdroidserver.po +++ b/locale/ml/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2023-06-23 14:52+0000\n" "Last-Translator: abe1242 \n" "Language-Team: Malayalam \n" @@ -39,6 +39,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" ന് ചേരുന്ന മെറ്റാഡേറ്റ ഫയൽ ലഭ്യമല്ല!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1201,6 +1205,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index d8a766b0..0c6645fb 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Norwegian Bokmål \n" @@ -41,6 +41,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" har ingen samsvarende metadatafil!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, fuzzy, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1246,6 +1250,11 @@ msgstr "Feilaktig innskrevet serverwebroot-linje:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Avspeil hele pakkebrønnen og arkivet, alle filtyper." diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index d385e678..066ec3a1 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2024-01-03 09:07+0000\n" "Last-Translator: Issa1553 \n" "Language-Team: Dutch \n" @@ -41,6 +41,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" heeft geen overeenkomend metadatabestand!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1204,6 +1208,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/nn/LC_MESSAGES/fdroidserver.po b/locale/nn/LC_MESSAGES/fdroidserver.po index fb2d51fe..98842621 100644 --- a/locale/nn/LC_MESSAGES/fdroidserver.po +++ b/locale/nn/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3.0-3-g4ba7b5c9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2024-11-26 10:54+0000\n" "Last-Translator: Bård Sigurd Møller \n" "Language-Team: Norwegian Nynorsk \n" @@ -34,6 +34,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1196,6 +1200,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/pa/LC_MESSAGES/fdroidserver.po b/locale/pa/LC_MESSAGES/fdroidserver.po index df4e4b08..1de20d3a 100644 --- a/locale/pa/LC_MESSAGES/fdroidserver.po +++ b/locale/pa/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3.3\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -33,6 +33,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1195,6 +1199,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 9f874593..3e06f8b1 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2025-03-13 20:43+0000\n" "Last-Translator: WaldiS \n" "Language-Team: Polish \n" @@ -43,6 +43,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" nie ma pasującego pliku metadanych!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1211,6 +1215,11 @@ msgstr "Nieprawidłowy wiersz serverwebroot:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "Osiągnięto maksymalną głębokość rekurencji w pliku ZIP: %s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Mirror pełnego repo i archiwum, wszystkie typy plików." diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 2b58804d..769c176e 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2025-03-02 21:32+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" @@ -42,6 +42,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" não tem ficheiro de metadados correspondente!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1208,6 +1212,11 @@ msgstr "Linha de serverwebroot malformada:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "Profundidade máxima de recursão no ficheiro ZIP atingida: %s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Espelha todo o repositório e pacotes, todos os tipos de ficheiros." diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index ca104de7..feaad2e6 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -19,7 +19,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2025-03-20 01:45+0000\n" "Last-Translator: Igor Rückert \n" "Language-Team: Portuguese (Brazil) \n" @@ -52,6 +52,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" não tem arquivo de metadados correspondente!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1218,6 +1222,11 @@ msgstr "Linha mal-formada do 'serverwebroot':" msgid "Max recursion depth in ZIP file reached: %s" msgstr "Profundidade máxima de recursão no arquivo ZIP atingida: %s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Espelha todo o repositório e pacotes, todos os tipos de arquivos." diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 3406fd8d..aa685625 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2025-03-02 21:32+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" @@ -44,6 +44,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" não tem ficheiro de metadados correspondente!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1210,6 +1214,11 @@ msgstr "Linha de serverwebroot malformada:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "Profundidade máxima de recursão no ficheiro ZIP atingida: %s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Espelha todo o repositório e pacotes, todos os tipos de ficheiros." diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 69169b8d..e4d1874b 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2024-12-02 17:00+0000\n" "Last-Translator: Licaon Kter \n" "Language-Team: Romanian \n" @@ -42,6 +42,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" nu are un fișier de metadate corespunzător!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1210,6 +1214,11 @@ msgstr "Linie de root a serverului web deformată:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "A fost atinsă adâncimea maximă de recursivitate în fișierul ZIP: %s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Oglindește întregul repo și arhiva, toate tipurile de fișiere." diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 4964b779..5cee962a 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -20,7 +20,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2025-01-25 15:42+0000\n" "Last-Translator: Golubev Alexander \n" "Language-Team: Russian \n" @@ -53,6 +53,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "У \"%s/\" нет соответствующего файла метаданных!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1221,6 +1225,11 @@ msgstr "Неверный путь serverwebroot:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "Достигнута максимальная глубина рекурсии в ZIP-файле: %s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Создать зеркало всего репозитория и архива, включая все типы файлов." diff --git a/locale/sk/LC_MESSAGES/fdroidserver.po b/locale/sk/LC_MESSAGES/fdroidserver.po index 678a54aa..74190989 100644 --- a/locale/sk/LC_MESSAGES/fdroidserver.po +++ b/locale/sk/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -33,6 +33,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1197,6 +1201,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index 41938065..fb037a85 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2024-12-12 14:43+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" @@ -39,6 +39,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "“%s/”\" s’ka kartelë tejtëdhënash me përputhje!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1205,6 +1209,11 @@ msgstr "Rresht serverwebroot i keqformuar:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "U mbërrit në thellësi maksimum rekursive te kartelë ZIP: %s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Pasqyro depon e plotë dhe arkivin, krejt llojet e kartelave." diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index 5c570044..fa53a146 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2024-12-30 22:00+0000\n" "Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" @@ -41,6 +41,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "Датотека метаподатака за „%s/“ не постоји!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1209,6 +1213,11 @@ msgstr "Неисправна линија серверског корена ве msgid "Max recursion depth in ZIP file reached: %s" msgstr "Достигнута максимална дубина рекурзије у ZIP датотеци: %s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Зерклите потпуну репозиторyју и архиву, све типове фајлова." diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index d4d35959..d3ee6965 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2025-03-17 21:44+0000\n" "Last-Translator: Kristoffer Grundström \n" "Language-Team: Swedish \n" @@ -43,6 +43,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" har ingen matchande meta-datafil!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1205,6 +1209,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index 41969947..5182c8aa 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2024-09-08 11:09+0000\n" "Last-Translator: abelbiwott-dev \n" "Language-Team: Swahili \n" @@ -40,6 +40,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" haina faili ya metadata inayolingana!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1206,6 +1210,11 @@ msgstr "Laini ya serverwebroot yenye umbo bovu:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "Upeo wa kina cha urejeshaji katika faili ya ZIP umefikiwa: %s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Akisi ghala mzima na uhifadhi, aina zote za faili." diff --git a/locale/ta/LC_MESSAGES/fdroidserver.po b/locale/ta/LC_MESSAGES/fdroidserver.po index 03e0484d..16c20866 100644 --- a/locale/ta/LC_MESSAGES/fdroidserver.po +++ b/locale/ta/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2025-01-20 14:04+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tamil \n" @@ -41,6 +41,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" க்கு பொருந்தக்கூடிய மேனிலை தரவு கோப்பு இல்லை!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1207,6 +1211,11 @@ msgstr "தவறாக சேவையகமானது:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "சிப் கோப்பில் அதிகபட்ச மறுசீரமைப்பு ஆழம் எட்டப்பட்டது: %s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "முழு ரெப்போ மற்றும் காப்பகத்தை பிரதிபலிக்கவும், அனைத்து கோப்பு வகைகளிலும்." diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index 32d47b92..aedc4ca6 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2024-09-10 23:49+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" @@ -41,6 +41,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" eşleşen üst veri dosyasına sahip değil!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1207,6 +1211,11 @@ msgstr "Bozuk serverwebroot satırı:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "ZIP dosyasında azami özyineleme derinliğine ulaşıldı: %s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Tüm dosya türlerini, tam depoyu ve arşivi yansıla." diff --git a/locale/tzm/LC_MESSAGES/fdroidserver.po b/locale/tzm/LC_MESSAGES/fdroidserver.po index 14ec608b..eeeff099 100644 --- a/locale/tzm/LC_MESSAGES/fdroidserver.po +++ b/locale/tzm/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-681-gc19e8952\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2020-10-29 08:32+0000\n" "Last-Translator: Hakim Oubouali \n" "Language-Team: Central Atlas Tamazight \n" @@ -34,6 +34,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1196,6 +1200,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/ug/LC_MESSAGES/fdroidserver.po b/locale/ug/LC_MESSAGES/fdroidserver.po index e8f7f771..6b7254b3 100644 --- a/locale/ug/LC_MESSAGES/fdroidserver.po +++ b/locale/ug/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2018-06-08 03:44+0000\n" "Last-Translator: ۋولقان \n" "Language-Team: Uyghur \n" @@ -35,6 +35,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1197,6 +1201,11 @@ msgstr "" msgid "Max recursion depth in ZIP file reached: %s" msgstr "" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "" diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 76487eef..766da262 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2025-03-20 10:14+0000\n" "Last-Translator: Максим Горпиніч \n" "Language-Team: Ukrainian \n" @@ -50,6 +50,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" не має відповідного файлу метаданих!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1218,6 +1222,11 @@ msgstr "Несправний шлях serverwebroot:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "Досягнуто максимальної глибини рекурсії у ZIP-файлі: %s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "Дзеркало всього репозиторію та архіву всіх типів файлів." diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 8fc08f01..60c5cc46 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -39,7 +39,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2025-03-20 02:51+0000\n" "Last-Translator: 大王叫我来巡山 \n" "Language-Team: Chinese (Simplified Han script) \n" @@ -72,6 +72,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s/\" 没有与之匹配的元数据文件!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1236,6 +1240,11 @@ msgstr "格式错误的服务器网络根行:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "达到 ZIP 文件中的最大递归深度:%s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." msgstr "镜像完整存储库和存档,所有文件类型。" diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 23c8889a..2a51248e 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-19 17:56+0100\n" +"POT-Creation-Date: 2025-03-20 15:05+0100\n" "PO-Revision-Date: 2024-11-26 15:16+0000\n" "Last-Translator: Peter Dave Hello \n" "Language-Team: Chinese (Traditional Han script) \n" @@ -44,6 +44,10 @@ msgstr "" msgid "\"%s/\" has no matching metadata file!" msgstr "\"%s 1/\" 沒有符合的中介資料檔案!" +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "" + #: ../fdroidserver/index.py #, python-brace-format msgid "\"local_copy_dir\" {path} does not exist!" @@ -1217,6 +1221,11 @@ msgstr "異常的 serverwebroot 行:" msgid "Max recursion depth in ZIP file reached: %s" msgstr "已達到 ZIP 檔案中的最大遞迴深度:%s" +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "" + #: ../fdroidserver/mirror.py #, fuzzy msgid "Mirror the full repo and archive, all file types." From 8565a974657bfe9d99054bb11b7fa2f1605c9cae Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 19 Mar 2025 18:21:56 +0100 Subject: [PATCH 1964/2116] rename functions and variables to reflect stats/ going away --- fdroidserver/common.py | 2 +- fdroidserver/index.py | 31 +++++++++++++++---------------- fdroidserver/publish.py | 4 ++-- tests/test_index.py | 4 ++-- tests/test_publish.py | 12 ++++++------ 5 files changed, 26 insertions(+), 27 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 2a63803f..181d971c 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4219,7 +4219,7 @@ def get_jar_signer_certificate(pkcs7obj: cms.ContentInfo, signature_file: bytes) return first_verified_signer_info_signing_certificate -def load_stats_fdroid_signing_key_fingerprints(): +def load_publish_signer_fingerprints(): """Load signing-key fingerprints stored in file generated by fdroid publish. Returns diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 873f401e..da472d8b 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -51,7 +51,7 @@ from . import _ from . import common from . import metadata from . import signindex -from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME, CONFIG_CONFIG_NAME, MIRRORS_CONFIG_NAME, RELEASECHANNELS_CONFIG_NAME, DEFAULT_LOCALE, FDroidPopen, FDroidPopenBytes, load_stats_fdroid_signing_key_fingerprints +from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME, CONFIG_CONFIG_NAME, MIRRORS_CONFIG_NAME, RELEASECHANNELS_CONFIG_NAME, DEFAULT_LOCALE, FDroidPopen, FDroidPopenBytes, load_publish_signer_fingerprints from fdroidserver._yaml import yaml from fdroidserver.exception import FDroidException, VerificationException @@ -125,14 +125,13 @@ def make(apps, apks, repodir, archive): raise TypeError(_('only accepts strings, lists, and tuples')) requestsdict[command] = packageNames - fdroid_signing_key_fingerprints = load_stats_fdroid_signing_key_fingerprints() + signer_fingerprints = load_publish_signer_fingerprints() - make_v0(sortedapps, apks, repodir, repodict, requestsdict, - fdroid_signing_key_fingerprints) - make_v1(sortedapps, apks, repodir, repodict, requestsdict, - fdroid_signing_key_fingerprints) - make_v2(sortedapps, apks, repodir, repodict, requestsdict, - fdroid_signing_key_fingerprints, archive) + make_v0(sortedapps, apks, repodir, repodict, requestsdict, signer_fingerprints) + make_v1(sortedapps, apks, repodir, repodict, requestsdict, signer_fingerprints) + make_v2( + sortedapps, apks, repodir, repodict, requestsdict, signer_fingerprints, archive + ) make_website(sortedapps, repodir, repodict) make_altstore( sortedapps, @@ -709,7 +708,7 @@ def v2_repo(repodict, repodir, archive): return repo -def make_v2(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_fingerprints, archive): +def make_v2(apps, packages, repodir, repodict, requestsdict, signer_fingerprints, archive): def _index_encoder_default(obj): if isinstance(obj, set): @@ -731,7 +730,7 @@ def make_v2(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ output["repo"]["requests"] = requestsdict # establish sort order of the index - v1_sort_packages(packages, fdroid_signing_key_fingerprints) + v1_sort_packages(packages, signer_fingerprints) output_packages = collections.OrderedDict() output['packages'] = output_packages @@ -846,7 +845,7 @@ def make_v2(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ signindex.sign_index(repodir, json_name) -def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_fingerprints): +def make_v1(apps, packages, repodir, repodict, requestsdict, signer_fingerprints): def _index_encoder_default(obj): if isinstance(obj, set): @@ -876,7 +875,7 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ output['repo']['mirrors'] = mirrors # establish sort order of the index - v1_sort_packages(packages, fdroid_signing_key_fingerprints) + v1_sort_packages(packages, signer_fingerprints) appslist = [] output['apps'] = appslist @@ -984,7 +983,7 @@ def _copy_to_local_copy_dir(repodir, f): .format(path=local_copy_dir)) -def v1_sort_packages(packages, fdroid_signing_key_fingerprints): +def v1_sort_packages(packages, signer_fingerprints): """Sort the supplied list to ensure a deterministic sort order for package entries in the index file. This sort-order also expresses @@ -1010,7 +1009,7 @@ def v1_sort_packages(packages, fdroid_signing_key_fingerprints): if dev_signer and dev_signer == signer: group = GROUP_DEV_SIGNED else: - fdroid_signer = fdroid_signing_key_fingerprints.get(packageName, {}).get('signer') + fdroid_signer = signer_fingerprints.get(packageName, {}).get('signer') if fdroid_signer and fdroid_signer == signer: group = GROUP_FDROID_SIGNED @@ -1023,7 +1022,7 @@ def v1_sort_packages(packages, fdroid_signing_key_fingerprints): packages.sort(key=v1_sort_keys) -def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fingerprints): +def make_v0(apps, apks, repodir, repodict, requestsdict, signer_fingerprints): """Aka index.jar aka index.xml.""" doc = Document() @@ -1122,7 +1121,7 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing if name_from_apk is None: name_from_apk = apk.get('name') for versionCode, apksforver in apksbyversion.items(): - fdroid_signer = fdroid_signing_key_fingerprints.get(appid, {}).get('signer') + fdroid_signer = signer_fingerprints.get(appid, {}).get('signer') fdroid_signed_apk = None name_match_apk = None for x in apksforver: diff --git a/fdroidserver/publish.py b/fdroidserver/publish.py index 0b499717..073dbdc8 100644 --- a/fdroidserver/publish.py +++ b/fdroidserver/publish.py @@ -139,7 +139,7 @@ def sign_sig_key_fingerprint_list(jar_file): raise FDroidException("Failed to sign '{}'!".format(jar_file)) -def store_stats_fdroid_signing_key_fingerprints(appids, indent=None): +def store_publish_signer_fingerprints(appids, indent=None): """Store list of all signing-key fingerprints for given appids to HD. This list will later on be needed by fdroid update. @@ -460,7 +460,7 @@ def main(): publish_source_tarball(apkfilename, unsigned_dir, output_dir) logging.info('Published ' + apkfilename) - store_stats_fdroid_signing_key_fingerprints(allapps.keys()) + store_publish_signer_fingerprints(allapps.keys()) status_update_json(generated_keys, signed_apks) logging.info('published list signing-key fingerprints') diff --git a/tests/test_index.py b/tests/test_index.py index 3e078eef..34c05230 100755 --- a/tests/test_index.py +++ b/tests/test_index.py @@ -383,7 +383,7 @@ class IndexTest(unittest.TestCase): common.write_config_file('') index.v1_sort_packages( - i, common.load_stats_fdroid_signing_key_fingerprints() + i, common.load_publish_signer_fingerprints() ) self.maxDiff = None self.assertEqual(json.dumps(i, indent=2), json.dumps(o, indent=2)) @@ -656,7 +656,7 @@ class IndexTest(unittest.TestCase): } ] - index.v1_sort_packages(i, common.load_stats_fdroid_signing_key_fingerprints()) + index.v1_sort_packages(i, common.load_publish_signer_fingerprints()) def test_package_metadata(self): """A smoke check and format check of index.package_metadata()""" diff --git a/tests/test_publish.py b/tests/test_publish.py index e405cf5f..46167be7 100755 --- a/tests/test_publish.py +++ b/tests/test_publish.py @@ -77,7 +77,7 @@ class PublishTest(unittest.TestCase): self.maxDiff = None self.assertEqual(expected, result) - def test_store_and_load_fdroid_signing_key_fingerprints(self): + def test_store_and_load_signer_fingerprints(self): common.config = {} common.fill_config_defaults(common.config) publish.config = common.config @@ -97,7 +97,7 @@ class PublishTest(unittest.TestCase): os.chdir(self.testdir) common.write_config_file('') - publish.store_stats_fdroid_signing_key_fingerprints(appids, indent=2) + publish.store_publish_signer_fingerprints(appids, indent=2) self.maxDiff = None expected = { @@ -114,7 +114,7 @@ class PublishTest(unittest.TestCase): "signer": "6ae5355157a47ddcc3834a71f57f6fb5a8c2621c8e0dc739e9ddf59f865e497c" }, } - self.assertEqual(expected, common.load_stats_fdroid_signing_key_fingerprints()) + self.assertEqual(expected, common.load_publish_signer_fingerprints()) with open(common.CONFIG_FILE) as fp: config = yaml.load(fp) @@ -123,7 +123,7 @@ class PublishTest(unittest.TestCase): config['repo_key_sha256'], ) - def test_store_and_load_fdroid_signing_key_fingerprints_with_missmatch(self): + def test_store_and_load_signer_fingerprints_with_missmatch(self): common.config = {} common.fill_config_defaults(common.config) publish.config = common.config @@ -134,9 +134,9 @@ class PublishTest(unittest.TestCase): publish.config['repo_key_sha256'] = 'bad bad bad bad bad bad bad bad bad bad bad bad' os.chdir(self.testdir) - publish.store_stats_fdroid_signing_key_fingerprints({}, indent=2) + publish.store_publish_signer_fingerprints({}, indent=2) with self.assertRaises(FDroidException): - common.load_stats_fdroid_signing_key_fingerprints() + common.load_publish_signer_fingerprints() def test_reproducible_binaries_process(self): common.config = {} From 38378ddfb798e9dd9abc977b1304bc7586e78c4f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 20 Mar 2025 13:07:35 +0100 Subject: [PATCH 1965/2116] rename v1_sort_packages to sort_package_versions --- fdroidserver/index.py | 8 ++++---- tests/test_index.py | 10 ++++------ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index da472d8b..6df110dd 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -730,7 +730,7 @@ def make_v2(apps, packages, repodir, repodict, requestsdict, signer_fingerprints output["repo"]["requests"] = requestsdict # establish sort order of the index - v1_sort_packages(packages, signer_fingerprints) + sort_package_versions(packages, signer_fingerprints) output_packages = collections.OrderedDict() output['packages'] = output_packages @@ -875,7 +875,7 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, signer_fingerprints output['repo']['mirrors'] = mirrors # establish sort order of the index - v1_sort_packages(packages, signer_fingerprints) + sort_package_versions(packages, signer_fingerprints) appslist = [] output['apps'] = appslist @@ -983,8 +983,8 @@ def _copy_to_local_copy_dir(repodir, f): .format(path=local_copy_dir)) -def v1_sort_packages(packages, signer_fingerprints): - """Sort the supplied list to ensure a deterministic sort order for package entries in the index file. +def sort_package_versions(packages, signer_fingerprints): + """Sort to ensure a deterministic order for package versions in the index file. This sort-order also expresses installation preference to the clients. diff --git a/tests/test_index.py b/tests/test_index.py index 34c05230..bd81a993 100755 --- a/tests/test_index.py +++ b/tests/test_index.py @@ -240,7 +240,7 @@ class IndexTest(unittest.TestCase): with self.assertRaises(fdroidserver.exception.VerificationException): data, _ignored = index.download_repo_index_v2(url) - def test_v1_sort_packages(self): + def test_sort_package_versions(self): i = [ { 'packageName': 'org.smssecure.smssecure', @@ -382,9 +382,7 @@ class IndexTest(unittest.TestCase): publish.sign_sig_key_fingerprint_list(jarfile) common.write_config_file('') - index.v1_sort_packages( - i, common.load_publish_signer_fingerprints() - ) + index.sort_package_versions(i, common.load_publish_signer_fingerprints()) self.maxDiff = None self.assertEqual(json.dumps(i, indent=2), json.dumps(o, indent=2)) @@ -646,7 +644,7 @@ class IndexTest(unittest.TestCase): self.maxDiff = None self.assertEqual(css, pretty_css) - def test_v1_sort_packages_with_invalid(self): + def test_sort_package_versions_with_invalid(self): i = [ { 'packageName': 'org.smssecure.smssecure', @@ -656,7 +654,7 @@ class IndexTest(unittest.TestCase): } ] - index.v1_sort_packages(i, common.load_publish_signer_fingerprints()) + index.sort_package_versions(i, common.load_publish_signer_fingerprints()) def test_package_metadata(self): """A smoke check and format check of index.package_metadata()""" From 4b9100ae80cc3a97ffeff0d542e039964097b33d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 19 Mar 2025 21:49:18 +0100 Subject: [PATCH 1966/2116] publish: remove last use of stats/ dir This file can be treated like the other index files in repo/. This also has the advantage that it will automatically get synced by @CiaranG's existing sync scripts. --- fdroidserver/common.py | 6 ++++-- fdroidserver/deploy.py | 9 ++++++++- fdroidserver/nightly.py | 6 ------ fdroidserver/publish.py | 11 +++++++---- tests/test_deploy.py | 27 +++++++++++++++++++++++++++ tests/test_index.py | 8 ++++---- tests/test_integration.py | 1 - 7 files changed, 50 insertions(+), 18 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 181d971c..aa606d43 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -4227,7 +4227,7 @@ def load_publish_signer_fingerprints(): dict containing the signing-key fingerprints. """ - jar_file = os.path.join('stats', 'publishsigkeys.jar') + jar_file = os.path.join('repo', 'signer-index.jar') if not os.path.isfile(jar_file): return {} try: @@ -4247,7 +4247,7 @@ def load_publish_signer_fingerprints(): write_to_config(config, 'repo_key_sha256') with zipfile.ZipFile(jar_file, 'r') as f: - return json.loads(str(f.read('publishsigkeys.json'), 'utf-8')) + return json.loads(str(f.read('signer-index.json'), 'utf-8')) def write_config_file(config): @@ -4478,6 +4478,7 @@ NO_GPG_INDEX_FILES = [ "index.jar", "index.png", "index.xml", + "signer-index.jar", ] # list of index files that are signed by gpgsign.py to make a .asc file @@ -4486,6 +4487,7 @@ GPG_INDEX_FILES = [ "entry.json", "index-v1.json", "index-v2.json", + "signer-index.json", ] diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 6db6ab54..ad108340 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -60,8 +60,15 @@ def _get_index_file_paths(base_dir): services can take a while. So the index files should be updated last. That ensures that the package files are available when the client learns about them from the new index files. + + signer-index.* are only published in the repo/ section. + """ - return [os.path.join(base_dir, filename) for filename in common.INDEX_FILES] + return [ + os.path.join(base_dir, filename) + for filename in common.INDEX_FILES + if not (filename.startswith('signer-index.') and base_dir.endswith('archive')) + ] def _get_index_excludes(base_dir): diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 5b8983e9..3eb4333c 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -337,7 +337,6 @@ def main(): git_mirror_fdroiddir = os.path.join(git_mirror_path, 'fdroid') git_mirror_repodir = os.path.join(git_mirror_fdroiddir, 'repo') git_mirror_metadatadir = os.path.join(git_mirror_fdroiddir, 'metadata') - git_mirror_statsdir = os.path.join(git_mirror_fdroiddir, 'stats') if not os.path.isdir(git_mirror_repodir): logging.debug(_('cloning {url}').format(url=clone_url)) vcs = common.getvcs('git', clone_url, git_mirror_path) @@ -381,8 +380,6 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, common.local_rsync(options, [git_mirror_repodir + '/'], 'repo/') if os.path.isdir(git_mirror_metadatadir): common.local_rsync(options, [git_mirror_metadatadir + '/'], 'metadata/') - if os.path.isdir(git_mirror_statsdir): - common.local_rsync(options, [git_mirror_statsdir + '/'], 'stats/') ssh_private_key_file = _ssh_key_from_debug_keystore() # this is needed for GitPython to find the SSH key @@ -495,9 +492,6 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, common.local_rsync( options, [repo_basedir + '/metadata/'], git_mirror_metadatadir + '/' ) - stats = repo_basedir + '/stats/' - if os.path.exists(stats): - common.local_rsync(options, [stats], git_mirror_statsdir + '/') mirror_git_repo.git.add(all=True) mirror_git_repo.index.commit("update app metadata") diff --git a/fdroidserver/publish.py b/fdroidserver/publish.py index 073dbdc8..1cd8538a 100644 --- a/fdroidserver/publish.py +++ b/fdroidserver/publish.py @@ -144,8 +144,8 @@ def store_publish_signer_fingerprints(appids, indent=None): This list will later on be needed by fdroid update. """ - if not os.path.exists('stats'): - os.makedirs('stats') + if not os.path.exists('repo'): + os.makedirs('repo') data = OrderedDict() fps = read_fingerprints_from_keystore() for appid in sorted(appids): @@ -153,9 +153,12 @@ def store_publish_signer_fingerprints(appids, indent=None): if alias in fps: data[appid] = {'signer': fps[key_alias(appid)]} - jar_file = os.path.join('stats', 'publishsigkeys.jar') + jar_file = os.path.join('repo', 'signer-index.jar') + output = json.dumps(data, indent=indent) with zipfile.ZipFile(jar_file, 'w', zipfile.ZIP_DEFLATED) as jar: - jar.writestr('publishsigkeys.json', json.dumps(data, indent=indent)) + jar.writestr('signer-index.json', output) + with open(os.path.join('repo', 'signer-index.json'), 'w') as fp: + fp.write(output) sign_sig_key_fingerprint_list(jar_file) diff --git a/tests/test_deploy.py b/tests/test_deploy.py index 0946ebbb..b821725c 100755 --- a/tests/test_deploy.py +++ b/tests/test_deploy.py @@ -326,6 +326,12 @@ class DeployTest(unittest.TestCase): 'repo/index.png', '--exclude', 'repo/index.xml', + '--exclude', + 'repo/signer-index.jar', + '--exclude', + 'repo/signer-index.json', + '--exclude', + 'repo/signer-index.json.asc', 'repo', 'example.com:/var/www/fdroid', ], @@ -413,6 +419,9 @@ class DeployTest(unittest.TestCase): 'repo/index.jar', 'repo/index.png', 'repo/index.xml', + 'repo/signer-index.jar', + 'repo/signer-index.json', + 'repo/signer-index.json.asc', 'example.com:/var/www/fdroid/repo/', ], ) @@ -729,6 +738,12 @@ class DeployTest(unittest.TestCase): 'repo/index.png', '--exclude', 'repo/index.xml', + '--exclude', + 'repo/signer-index.jar', + '--exclude', + 'repo/signer-index.json', + '--exclude', + 'repo/signer-index.json.asc', '--no-check-md5', '--skip-existing', repo_section, @@ -774,6 +789,12 @@ class DeployTest(unittest.TestCase): 'repo/index.png', '--exclude', 'repo/index.xml', + '--exclude', + 'repo/signer-index.jar', + '--exclude', + 'repo/signer-index.json', + '--exclude', + 'repo/signer-index.json.asc', '--no-check-md5', repo_section, f"s3://{fdroidserver.deploy.config['awsbucket']}/fdroid/", @@ -880,6 +901,12 @@ class DeployTest(unittest.TestCase): 'repo/index.png', '--include', 'repo/index.xml', + '--include', + 'repo/signer-index.jar', + '--include', + 'repo/signer-index.json', + '--include', + 'repo/signer-index.json.asc', '--delete-removed', '--delete-after', '--no-check-md5', diff --git a/tests/test_index.py b/tests/test_index.py index bd81a993..b4973d79 100755 --- a/tests/test_index.py +++ b/tests/test_index.py @@ -375,10 +375,10 @@ class IndexTest(unittest.TestCase): "signer": "b33a601a9da97c82e6eb121eb6b90adab561f396602ec4dc8b0019fb587e2af6" } } - os.makedirs('stats') - jarfile = 'stats/publishsigkeys.jar' + os.mkdir('repo') + jarfile = 'repo/signer-index.jar' with zipfile.ZipFile(jarfile, 'w', zipfile.ZIP_DEFLATED) as jar: - jar.writestr('publishsigkeys.json', json.dumps(sigkeyfps)) + jar.writestr('signer-index.json', json.dumps(sigkeyfps)) publish.sign_sig_key_fingerprint_list(jarfile) common.write_config_file('') @@ -387,7 +387,7 @@ class IndexTest(unittest.TestCase): self.assertEqual(json.dumps(i, indent=2), json.dumps(o, indent=2)) # and test it still works with get_first_signer_certificate - outdir = os.path.join(self.testdir, 'publishsigkeys') + outdir = os.path.join(self.testdir, 'index-signer-fingerprints') os.mkdir(outdir) common.apk_extract_signatures(jarfile, outdir) certs = glob.glob(os.path.join(outdir, '*.RSA')) diff --git a/tests/test_integration.py b/tests/test_integration.py index c70b121a..76a7e82b 100755 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -747,7 +747,6 @@ class IntegrationTest(unittest.TestCase): self.update_yaml(common.CONFIG_FILE, {"archive_older": 3}) Path("metadata").mkdir() Path("archive").mkdir() - Path("stats").mkdir() shutil.copy(FILES / "repo/com.politedroid_6.apk", "repo") shutil.copy(FILES / "repo/index-v2.json", "repo") shutil.copy(FILES / "repo/com.politedroid_5.apk", "archive") From 78efc16fc2f9c6501e363eada8121680b4cb1c51 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 20 Mar 2025 09:58:36 +0100 Subject: [PATCH 1967/2116] scanner: suppress verbose/confusing log output on success This additionally asserts that the right log output happened. --- tests/test_scanner.py | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/tests/test_scanner.py b/tests/test_scanner.py index 6b59d7f0..294ff8b7 100755 --- a/tests/test_scanner.py +++ b/tests/test_scanner.py @@ -78,8 +78,13 @@ class ScannerTest(unittest.TestCase): } for d in (basedir / 'source-files').iterdir(): build = fdroidserver.metadata.Build() - fatal_problems = fdroidserver.scanner.scan_source(d, build) should = projects.get(d.name, 0) + if should > 0: + with self.assertLogs(level=logging.ERROR): + fatal_problems = fdroidserver.scanner.scan_source(d, build) + else: + with self.assertNoLogs(): + fatal_problems = fdroidserver.scanner.scan_source(d, build) self.assertEqual( should, fatal_problems, f'{d} should have {should} errors!' ) @@ -186,7 +191,8 @@ class ScannerTest(unittest.TestCase): """ ) ) - count = fdroidserver.scanner.scan_source(self.testdir) + with self.assertLogs(level=logging.ERROR): + count = fdroidserver.scanner.scan_source(self.testdir) self.assertEqual(2, count, 'there should be this many errors') def test_scan_source_file_types(self): @@ -238,9 +244,10 @@ class ScannerTest(unittest.TestCase): # run scanner as if from `fdroid build` os.chdir(self.testdir) json_per_build = fdroidserver.scanner.MessageStore() - count = fdroidserver.scanner.scan_source( - build_dir, json_per_build=json_per_build - ) + with self.assertLogs(level=logging.ERROR): + count = fdroidserver.scanner.scan_source( + build_dir, json_per_build=json_per_build + ) self.assertEqual(6, count, 'there should be this many errors') os.chdir(build_dir) @@ -450,7 +457,6 @@ class ScannerTest(unittest.TestCase): config = dict() fdroidserver.common.config = config fdroidserver.common.fill_config_defaults(config) - print('basedir') for f in ( 'Norway_bouvet_europe_2.obf.zip', 'repo/fake.ota.update_1234.zip', @@ -521,9 +527,11 @@ class Test_scan_binary(unittest.TestCase): def test_code_signature_match(self): apkfile = os.path.join(basedir, 'no_targetsdk_minsdk1_unsigned.apk') + with self.assertLogs(level=logging.CRITICAL): + problems = fdroidserver.scanner.scan_binary(apkfile) self.assertEqual( 1, - fdroidserver.scanner.scan_binary(apkfile), + problems, "Did not find expected code signature '{}' in binary '{}'".format( fdroidserver.scanner._SCANNER_TOOL.regexs[ 'err_code_signatures' @@ -541,9 +549,11 @@ class Test_scan_binary(unittest.TestCase): ) } + with self.assertLogs(level=logging.CRITICAL): + problems = fdroidserver.scanner.scan_binary(apkfile) self.assertEqual( 1, - fdroidserver.scanner.scan_binary(apkfile), + problems, "Did not find expected code signature '{}' in binary '{}'".format( fdroidserver.scanner._SCANNER_TOOL.regexs[ 'err_code_signatures' @@ -559,9 +569,11 @@ class Test_scan_binary(unittest.TestCase): r'.*org/fdroid/ci/BuildConfig', re.IGNORECASE | re.UNICODE ) } + with self.assertLogs(level=logging.CRITICAL): + problems = fdroidserver.scanner.scan_binary(apkfile) self.assertEqual( 1, - fdroidserver.scanner.scan_binary(apkfile), + problems, "Did not find expected code signature '{}' in binary '{}'".format( fdroidserver.scanner._SCANNER_TOOL.regexs[ 'err_code_signatures' From 35d205a9b9ba07f4a332c5840825a023cc39c85b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 20 Mar 2025 10:25:50 +0100 Subject: [PATCH 1968/2116] scanner: only output "X problems found" if errors or --verbose UNIX/POSIX standard behavior is to output nothing at all if a command succeeds. This suppresses "0 problems found", unless the user requests it. --- fdroidserver/scanner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 7e106d2f..c6cd57a0 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -1294,7 +1294,7 @@ def main(): logging.info(_("Finished")) if options.json: print(json.dumps(json_output)) - else: + elif probcount or options.verbose: print(_("%d problems found") % probcount) From cb69c4fea31d7982c9e358d5efb3ed2f5796372f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=93=D0=BE=D1=80?= =?UTF-8?q?=D0=BF=D0=B8=D0=BD=D1=96=D1=87?= Date: Sun, 23 Mar 2025 11:56:03 +0100 Subject: [PATCH 1969/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Ukrai?= =?UTF-8?q?nian=20(uk)=20by=20=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20?= =?UTF-8?q?=D0=93=D0=BE=D1=80=D0=BF=D0=B8=D0=BD=D1=96=D1=87=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (623 of 623 strings) Co-authored-by: Максим Горпиніч Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 766da262..59978250 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -18,7 +18,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-20 15:05+0100\n" -"PO-Revision-Date: 2025-03-20 10:14+0000\n" +"PO-Revision-Date: 2025-03-20 14:13+0000\n" "Last-Translator: Максим Горпиніч \n" "Language-Team: Ukrainian \n" "Language: uk\n" @@ -52,7 +52,7 @@ msgstr "\"%s/\" не має відповідного файлу метадани #: ../fdroidserver/index.py msgid "\"isPrimary\" key should not be added to mirrors!" -msgstr "" +msgstr "\"isPrimary\" ключ не слід додавати до дзеркал!" #: ../fdroidserver/index.py #, python-brace-format @@ -1225,7 +1225,7 @@ msgstr "Досягнуто максимальної глибини рекурс #: ../fdroidserver/index.py #, python-brace-format msgid "Mirror config for {url} contains \"isPrimary\" key!" -msgstr "" +msgstr "Конфігурація дзеркала для {url} містить ключ \"isPrimary\"!" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." From 4e18b38d8f68231eb56c9b21a18ba6aafcf424d9 Mon Sep 17 00:00:00 2001 From: Champ0999 Date: Sun, 23 Mar 2025 11:56:03 +0100 Subject: [PATCH 1970/2116] Translated using Weblate: Italian (it) by Champ0999 Currently translated at 89.7% (559 of 623 strings) Co-authored-by: Champ0999 Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/it/ Translation: F-Droid/F-Droid Server --- locale/it/LC_MESSAGES/fdroidserver.po | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 0d09e237..ed4cb6ae 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -17,20 +17,21 @@ # Mirko Di , 2023. # coronabond , 2023. # Random , 2023, 2024. +# Champ0999 , 2025. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-20 15:05+0100\n" -"PO-Revision-Date: 2024-09-10 09:27+0000\n" -"Last-Translator: Hans-Christoph Steiner \n" +"PO-Revision-Date: 2025-03-20 16:21+0000\n" +"Last-Translator: Champ0999 \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.11-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -700,7 +701,7 @@ msgstr "Link duplicato in '{field}': {url}" #: ../fdroidserver/common.py #, python-format msgid "ERROR: %(message)s" -msgstr "" +msgstr "ERRORE: %(message)s" #: ../fdroidserver/__main__.py msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" @@ -2170,7 +2171,7 @@ msgstr "" #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "" +msgstr "Vuoi scaricare e installare F-Droid.apk tramite adb? (SÌ/no)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" @@ -2683,7 +2684,7 @@ msgstr "Il repo_url deve terminare con /repo" #: ../fdroidserver/deploy.py #, python-brace-format msgid "rsync is missing or broken: {error}" -msgstr "" +msgstr "rsync è assente o non funziona: {error}" #: ../fdroidserver/metadata.py msgid "ruamel.yaml not installed, can not write metadata." @@ -2765,7 +2766,7 @@ msgstr "i seguenti argomenti sono obbligatori: %s" #: ../fdroidserver/install.py msgid "true" -msgstr "" +msgstr "vero" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py @@ -2810,7 +2811,7 @@ msgstr "virustotal.com sta limitando il tasso, in attesa di riprovare..." #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "sì" #: ../fdroidserver/publish.py #, python-brace-format From 3c9fa6761e7dce98745d9b08fc9d593bbf3ca5a9 Mon Sep 17 00:00:00 2001 From: Fjuro Date: Sun, 23 Mar 2025 11:56:03 +0100 Subject: [PATCH 1971/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 100.0% (623 of 623 strings) Co-authored-by: Fjuro Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ Translation: F-Droid/F-Droid Server --- locale/cs/LC_MESSAGES/fdroidserver.po | 32 +++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 406c8d49..bc89c51a 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -14,7 +14,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-20 15:05+0100\n" -"PO-Revision-Date: 2025-01-21 19:35+0000\n" +"PO-Revision-Date: 2025-03-20 16:21+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" @@ -22,7 +22,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" -"X-Generator: Weblate 5.10-dev\n" +"X-Generator: Weblate 5.11-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -48,7 +48,7 @@ msgstr "„%s/“ nemá žádný odpovídající soubor metadat!" #: ../fdroidserver/index.py msgid "\"isPrimary\" key should not be added to mirrors!" -msgstr "" +msgstr "Klíč „isPrimary“ by neměl být přidán k zrcadlům!" #: ../fdroidserver/index.py #, python-brace-format @@ -58,7 +58,7 @@ msgstr "„local_copy_dir“ {path} neexistuje!" #: ../fdroidserver/install.py #, python-brace-format msgid "\"{apkfilename}\" is already installed on {dev}." -msgstr "aplikace „{apkfilename}“ je již nainstalována na {dev}." +msgstr "Aplikace „{apkfilename}“ je již nainstalována na {dev}." #: ../fdroidserver/update.py #, python-brace-format @@ -534,9 +534,9 @@ msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Vytváření „{path}“ pro konfiguraci s3cmd." #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Creating empty {config_file}" -msgstr "Čtení „{config_file}“" +msgstr "Vytvářím prázdný {config_file}" #: ../fdroidserver/publish.py msgid "Creating log directory" @@ -724,12 +724,12 @@ msgstr "CHYBA: {key} v {path} není „archive“ nebo „repo“!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} not a valid key!" -msgstr "" +msgstr "CHYBA: {key} není platný klíč!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}'s value should be of type {t}!" -msgstr "" +msgstr "CHYBA: hodnota klíče {key} by měla být typu {t}!" #: ../fdroidserver/lint.py #, python-brace-format @@ -756,9 +756,9 @@ msgid "Environment variable {var} from {configname} is not set!" msgstr "Proměnná prostředí {var} z {configname} není nastavena!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Environment variable {{env: {var}}} is not set!" -msgstr "Proměnná prostředí {var} z {configname} není nastavena!" +msgstr "Proměnná prostředí {{env: {var}}} není nastavena!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" @@ -1007,9 +1007,9 @@ msgid "Ignoring bad element in manifest: %s" msgstr "Ignorování nesprávného prvku v manifestu: %s" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Ignoring deprecated {oldfile}, use {newfile}!" -msgstr "{oldfile} je zastaralý, použijte {newfile}" +msgstr "Ignoruji zastaralý {oldfile}, použijte {newfile}!" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1221,7 +1221,7 @@ msgstr "Dosažena maximální hloubka rekurze v souboru ZIP: %s" #: ../fdroidserver/index.py #, python-brace-format msgid "Mirror config for {url} contains \"isPrimary\" key!" -msgstr "" +msgstr "Konfigurace zrcadla {url} obsahuje klíč „isPrimary“!" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1388,7 +1388,7 @@ msgstr "Pro grafiku jsou podporovány pouze formáty PNG a JPEG, nalezeno: {path #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" -msgstr "" +msgstr "Přijímá pouze jediný klíč „env“" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" @@ -1789,7 +1789,7 @@ msgstr "Testovací režim - výstup se ukládá pouze do adresáře tmp a vždy #: ../fdroidserver/index.py msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" -msgstr "" +msgstr "Python balíček „qrcode“ není nainstalován (např. apt-get install python3-qrcode)!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -2897,7 +2897,7 @@ msgstr "{oldfile} je zastaralý, použijte {newfile}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" -msgstr "" +msgstr "{path1} je kopií {path2}, jednu odstraňte!" #: ../fdroidserver/import_subcommand.py #, python-brace-format From b95d60f24b15029f97a7fd7e12c314d9a9e3e8bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Sun, 23 Mar 2025 11:56:03 +0100 Subject: [PATCH 1972/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Chine?= =?UTF-8?q?se=20(Simplified=20Han=20script)=20(zh=5FHans)=20by=20=E5=A4=A7?= =?UTF-8?q?=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1=E5=B1=B1=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (623 of 623 strings) Co-authored-by: 大王叫我来巡山 Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 60c5cc46..4ef2a262 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -40,7 +40,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-20 15:05+0100\n" -"PO-Revision-Date: 2025-03-20 02:51+0000\n" +"PO-Revision-Date: 2025-03-21 03:03+0000\n" "Last-Translator: 大王叫我来巡山 \n" "Language-Team: Chinese (Simplified Han script) \n" "Language: zh_Hans\n" @@ -74,7 +74,7 @@ msgstr "\"%s/\" 没有与之匹配的元数据文件!" #: ../fdroidserver/index.py msgid "\"isPrimary\" key should not be added to mirrors!" -msgstr "" +msgstr "\"isPrimary\" 密钥不应被添加到镜像!" #: ../fdroidserver/index.py #, python-brace-format @@ -1243,7 +1243,7 @@ msgstr "达到 ZIP 文件中的最大递归深度:%s" #: ../fdroidserver/index.py #, python-brace-format msgid "Mirror config for {url} contains \"isPrimary\" key!" -msgstr "" +msgstr "{url} 的镜像配置包含 \"isPrimary\" 密钥!" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." From 51457a6f8e1877ce4568e1f4066d982fb2640a65 Mon Sep 17 00:00:00 2001 From: VfBFan Date: Sun, 23 Mar 2025 11:56:04 +0100 Subject: [PATCH 1973/2116] Translated using Weblate: German (de) by VfBFan Currently translated at 100.0% (623 of 623 strings) Co-authored-by: VfBFan Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index a118d57f..8f05f944 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -27,7 +27,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-20 15:05+0100\n" -"PO-Revision-Date: 2025-03-20 10:14+0000\n" +"PO-Revision-Date: 2025-03-21 08:45+0000\n" "Last-Translator: VfBFan \n" "Language-Team: German \n" "Language: de\n" @@ -61,7 +61,7 @@ msgstr "\"%s/\" besitzt keine zugehörige Metadaten-Datei!" #: ../fdroidserver/index.py msgid "\"isPrimary\" key should not be added to mirrors!" -msgstr "" +msgstr "\"isPrimary\"-Schlüssel sollte nicht zu den Spiegelservern hinzugefügt werden!" #: ../fdroidserver/index.py #, python-brace-format @@ -1232,7 +1232,7 @@ msgstr "Maximale Rekursionstiefe in ZIP-Datei erreicht: %s" #: ../fdroidserver/index.py #, python-brace-format msgid "Mirror config for {url} contains \"isPrimary\" key!" -msgstr "" +msgstr "Spiegelserver-Konfiguration für {url} enthält \"isPrimary\"-Schlüssel!" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1732,7 +1732,7 @@ msgstr "Überspringen von '{apkfilename}' mit ungültiger Signatur!" #: ../fdroidserver/deploy.py ../fdroidserver/index.py #, python-format msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" -msgstr "GitLab Pages Mirror wird übersprungen, da das Repo zu groß ist (>%.2fGB)!" +msgstr "Überspringe GitLab-Pages-Spiegelserver, da das Repo zu groß ist (>%.2f GB)!" #: ../fdroidserver/update.py #, python-brace-format @@ -2517,7 +2517,7 @@ msgstr "Spiegelserver '%s' ended nicht mit 'fdroid'!" #: ../fdroidserver/index.py #, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "Mirrors zweimal gesetzt, in config.yml und {path}!" +msgstr "Spiegelserver zweimal gesetzt, in config.yml und {path}!" #: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py #: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py From 868eb64de6094a898d8bbddad0d3712afe9f6f99 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Sun, 23 Mar 2025 11:56:04 +0100 Subject: [PATCH 1974/2116] Translated using Weblate: Albanian (sq) by Besnik Bleta Currently translated at 97.7% (609 of 623 strings) Co-authored-by: Besnik Bleta Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/ Translation: F-Droid/F-Droid Server --- locale/sq/LC_MESSAGES/fdroidserver.po | 34 +++++++++++++-------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index fb037a85..7c115e27 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -1,13 +1,13 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# Besnik Bleta , 2020, 2021, 2022, 2023, 2024. +# Besnik Bleta , 2020, 2021, 2022, 2023, 2024, 2025. # Hans-Christoph Steiner , 2020, 2021, 2024. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-20 15:05+0100\n" -"PO-Revision-Date: 2024-12-12 14:43+0000\n" +"PO-Revision-Date: 2025-03-21 08:45+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" "Language: sq\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.9-dev\n" +"X-Generator: Weblate 5.11-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -41,7 +41,7 @@ msgstr "“%s/”\" s’ka kartelë tejtëdhënash me përputhje!" #: ../fdroidserver/index.py msgid "\"isPrimary\" key should not be added to mirrors!" -msgstr "" +msgstr "Kyçi “isPrimary” s’duhet shtuar te pasqyra!" #: ../fdroidserver/index.py #, python-brace-format @@ -525,9 +525,9 @@ msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Po krijohet “{path}” për formësim të s3cmd." #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Creating empty {config_file}" -msgstr "Po lexohet '{config_file}'" +msgstr "Po krijohet '{config_file}' e zbrazët" #: ../fdroidserver/publish.py msgid "Creating log directory" @@ -715,12 +715,12 @@ msgstr "GABIM: {key} te {path} s’është “archive” apo “repo”!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} not a valid key!" -msgstr "" +msgstr "GABIM: {key} s’është kyç i vlefshëm!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}'s value should be of type {t}!" -msgstr "" +msgstr "GABIM: Vlera e {key} duhet të jetë e llojit {t}!" #: ../fdroidserver/lint.py #, python-brace-format @@ -747,9 +747,9 @@ msgid "Environment variable {var} from {configname} is not set!" msgstr "S’është ujdisur ndryshore {var} nga {configname}!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Environment variable {{env: {var}}} is not set!" -msgstr "S’është ujdisur ndryshore {var} nga {configname}!" +msgstr "S’është ujdisur ndryshore {{env: {var}}}!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" @@ -998,9 +998,9 @@ msgid "Ignoring bad element in manifest: %s" msgstr "Po shpërfillet element i gabuar në manifest: %s" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Ignoring deprecated {oldfile}, use {newfile}!" -msgstr "{oldfile} është nxjerrë nga përdorimi, përdorni {newfile}" +msgstr "Po shpërfillet {oldfile} e nxjerrë nga përdorimi, përdorni {newfile}!" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1212,7 +1212,7 @@ msgstr "U mbërrit në thellësi maksimum rekursive te kartelë ZIP: %s" #: ../fdroidserver/index.py #, python-brace-format msgid "Mirror config for {url} contains \"isPrimary\" key!" -msgstr "" +msgstr "Formësimi i pasqyrës për {url} përmban kyç “isPrimary”!" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1379,7 +1379,7 @@ msgstr "Si formate grafike mbulohen vetëm PNG dhe JPEG, u gjet: {path}" #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" -msgstr "" +msgstr "Pranon vetëm një “env” të vetëm kyçi" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" @@ -1779,7 +1779,7 @@ msgstr "Mënyra testim - hidhe output-in vetëm te drejtoria tmp, dhe monto për #: ../fdroidserver/index.py msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" -msgstr "" +msgstr "Paketa Python “qrcode” s’është e instaluar (p.sh., apt-get install python3-qrcode)!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -2198,7 +2198,7 @@ msgstr "mundësi e dykuptimtë: %s (%s?)" #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." -msgstr "" +msgstr "apksigner te build-tools;{version} përcjell APK-ra ne nënshkrime v3 të pavlefshme, po shpërfillet." #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" @@ -2885,7 +2885,7 @@ msgstr "{oldfile} është nxjerrë nga përdorimi, përdorni {newfile}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" -msgstr "" +msgstr "{path1} është përsëdytje e {path2}, hiqeni njërin!" #: ../fdroidserver/import_subcommand.py #, python-brace-format From f0cd68a9fba3115735b6c4effd643d3d82c647a6 Mon Sep 17 00:00:00 2001 From: Edgars Andersons Date: Sun, 23 Mar 2025 11:56:04 +0100 Subject: [PATCH 1975/2116] Translated using Weblate: Latvian (lv) by Edgars Andersons Currently translated at 11.0% (69 of 623 strings) Co-authored-by: Edgars Andersons Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/lv/ Translation: F-Droid/F-Droid Server --- locale/lv/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/lv/LC_MESSAGES/fdroidserver.po b/locale/lv/LC_MESSAGES/fdroidserver.po index 2be3c31d..de6d9cb2 100644 --- a/locale/lv/LC_MESSAGES/fdroidserver.po +++ b/locale/lv/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-20 15:05+0100\n" -"PO-Revision-Date: 2025-03-20 10:14+0000\n" +"PO-Revision-Date: 2025-03-21 08:46+0000\n" "Last-Translator: Edgars Andersons \n" "Language-Team: Latvian \n" "Language: lv\n" @@ -37,7 +37,7 @@ msgstr "" #: ../fdroidserver/index.py msgid "\"isPrimary\" key should not be added to mirrors!" -msgstr "" +msgstr "Atslēgu \"isPrimary\" nevajadzētu pievienot spoguļglabātavām." #: ../fdroidserver/index.py #, python-brace-format @@ -1204,7 +1204,7 @@ msgstr "" #: ../fdroidserver/index.py #, python-brace-format msgid "Mirror config for {url} contains \"isPrimary\" key!" -msgstr "" +msgstr "Spoguļglabātavas konfigurācija {url} satur \"isPrimary\" key." #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." From 050aec31e24045125574de6d821d46ec2c6bd6c0 Mon Sep 17 00:00:00 2001 From: LucasMZ Date: Sun, 23 Mar 2025 11:56:04 +0100 Subject: [PATCH 1976/2116] Translated using Weblate: Portuguese (Brazil) (pt_BR) by LucasMZ Currently translated at 100.0% (623 of 623 strings) Co-authored-by: LucasMZ Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/ Translation: F-Droid/F-Droid Server --- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index feaad2e6..3ac6a9f3 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -20,8 +20,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-20 15:05+0100\n" -"PO-Revision-Date: 2025-03-20 01:45+0000\n" -"Last-Translator: Igor Rückert \n" +"PO-Revision-Date: 2025-03-21 18:43+0000\n" +"Last-Translator: LucasMZ \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" @@ -54,7 +54,7 @@ msgstr "\"%s/\" não tem arquivo de metadados correspondente!" #: ../fdroidserver/index.py msgid "\"isPrimary\" key should not be added to mirrors!" -msgstr "" +msgstr "A chave \"isPrimary\" não deve ser adicionada em espelhos!" #: ../fdroidserver/index.py #, python-brace-format @@ -1225,7 +1225,7 @@ msgstr "Profundidade máxima de recursão no arquivo ZIP atingida: %s" #: ../fdroidserver/index.py #, python-brace-format msgid "Mirror config for {url} contains \"isPrimary\" key!" -msgstr "" +msgstr "A configuração de espelho de {url} contém a chave \"isPrimary\"!" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." From 7cf7f4b14e08b028ad4793a0cf1bfecd31821f85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Sun, 23 Mar 2025 11:56:05 +0100 Subject: [PATCH 1977/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Irish?= =?UTF-8?q?=20(ga)=20by=20Aindri=C3=BA=20Mac=20Giolla=20Eoin=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (623 of 623 strings) Co-authored-by: Aindriú Mac Giolla Eoin Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ga/ Translation: F-Droid/F-Droid Server --- locale/ga/LC_MESSAGES/fdroidserver.po | 30 +++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/locale/ga/LC_MESSAGES/fdroidserver.po b/locale/ga/LC_MESSAGES/fdroidserver.po index d668bc3f..1bb52d49 100644 --- a/locale/ga/LC_MESSAGES/fdroidserver.po +++ b/locale/ga/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.3a1-162-gfbb3cc59\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-20 15:05+0100\n" -"PO-Revision-Date: 2025-01-23 09:05+0000\n" +"PO-Revision-Date: 2025-03-23 10:56+0000\n" "Last-Translator: Aindriú Mac Giolla Eoin \n" "Language-Team: Irish \n" "Language: ga\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :(n>6 && n<11) ? 3 : 4;\n" -"X-Generator: Weblate 5.10-dev\n" +"X-Generator: Weblate 5.11-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -40,7 +40,7 @@ msgstr "Níl aon chomhad meiteashonraí meaitseála ag \"%s/\"!" #: ../fdroidserver/index.py msgid "\"isPrimary\" key should not be added to mirrors!" -msgstr "" +msgstr "Níor cheart eochair \"isPrimary\" a chur le scátháin!" #: ../fdroidserver/index.py #, python-brace-format @@ -530,9 +530,9 @@ msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Ag cruthú \"{path}\" chun s3cmd a chumrú." #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Creating empty {config_file}" -msgstr "Ag léamh '{config_file}'" +msgstr "{config_file} folamh á chruthú" #: ../fdroidserver/publish.py msgid "Creating log directory" @@ -720,12 +720,12 @@ msgstr "EARRÁID: Níl {key} i {path} \"archive\" nó \"repo\"!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} not a valid key!" -msgstr "" +msgstr "EARRÁID: Ní eochair bhailí í {key}!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}'s value should be of type {t}!" -msgstr "" +msgstr "EARRÁID: Ba cheart gur de chineál {t} luach {key}!" #: ../fdroidserver/lint.py #, python-brace-format @@ -752,9 +752,9 @@ msgid "Environment variable {var} from {configname} is not set!" msgstr "Níl athróg timpeallachta {var} ó {configname} socraithe!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Environment variable {{env: {var}}} is not set!" -msgstr "Níl athróg timpeallachta {var} ó {configname} socraithe!" +msgstr "Níl athróg timpeallachta {{env: {var}}} socraithe!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" @@ -1003,9 +1003,9 @@ msgid "Ignoring bad element in manifest: %s" msgstr "Neamhaird á déanamh ar dhrocheilimint sa léiriú: %s" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Ignoring deprecated {oldfile}, use {newfile}!" -msgstr "Tá {oldfile} imithe i léig, úsáid {newfile}" +msgstr "Má dhéantar neamhaird de {oldfile}, úsáid {newfile}!" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1217,7 +1217,7 @@ msgstr "Sroicheadh uasdoimhneacht athchúrsaithe sa chomhad ZIP: %s" #: ../fdroidserver/index.py #, python-brace-format msgid "Mirror config for {url} contains \"isPrimary\" key!" -msgstr "" +msgstr "Tá eochair \"isPrimary\" i gcumraíocht scátháin do {url}!" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1384,7 +1384,7 @@ msgstr "Ní thacaítear ach le PNG agus JPEG le haghaidh grafaicí, le fáil: {p #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" -msgstr "" +msgstr "Ní ghlacann ach le \"env\" eochair amháin" #: ../fdroidserver/checkupdates.py msgid "Only print differences with the Play Store" @@ -1787,7 +1787,7 @@ msgstr "Modh tástála - aschur a chur san eolaire tmp amháin, agus a thógáil #: ../fdroidserver/index.py msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" -msgstr "" +msgstr "Níl an pacáiste Python \"qrcode\" suiteáilte (m.sh. apt-get install python3-qrcode)!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -2901,7 +2901,7 @@ msgstr "Tá {oldfile} imithe i léig, úsáid {newfile}" #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" -msgstr "" +msgstr "Is dúblach é {path1} de {path2}, bain ceann amháin!" #: ../fdroidserver/import_subcommand.py #, python-brace-format From b29ee09fda490982b08258d842b6d228893f3c85 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sun, 23 Mar 2025 21:39:39 +0100 Subject: [PATCH 1978/2116] locale: full update of source strings --- locale/Makefile | 5 +- locale/POTFILES.in | 17 - locale/ar/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/az/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/be/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/bg/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/bn/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/bo/LC_MESSAGES/fdroidserver.po | 342 ++------------------ locale/ca/LC_MESSAGES/fdroidserver.po | 343 ++------------------ locale/cs/LC_MESSAGES/fdroidserver.po | 344 ++------------------ locale/cy/LC_MESSAGES/fdroidserver.po | 345 ++------------------ locale/de/LC_MESSAGES/fdroidserver.po | 343 ++------------------ locale/el/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/es/LC_MESSAGES/fdroidserver.po | 343 ++------------------ locale/es_AR/LC_MESSAGES/fdroidserver.po | 342 ++------------------ locale/es_MX/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/eu/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/fa/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/fdroidserver.pot | 341 ++------------------ locale/fi/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/fr/LC_MESSAGES/fdroidserver.po | 343 ++------------------ locale/fy/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/ga/LC_MESSAGES/fdroidserver.po | 346 ++------------------ locale/he/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/hi/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/hu/LC_MESSAGES/fdroidserver.po | 344 ++------------------ locale/id/LC_MESSAGES/fdroidserver.po | 340 ++------------------ locale/it/LC_MESSAGES/fdroidserver.po | 344 ++------------------ locale/ja/LC_MESSAGES/fdroidserver.po | 342 ++------------------ locale/kab/LC_MESSAGES/fdroidserver.po | 342 ++------------------ locale/ko/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/lv/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/ml/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/nb_NO/LC_MESSAGES/fdroidserver.po | 351 ++------------------- locale/nl/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/nn/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/pa/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/pl/LC_MESSAGES/fdroidserver.po | 344 ++------------------ locale/pt/LC_MESSAGES/fdroidserver.po | 343 ++------------------ locale/pt_BR/LC_MESSAGES/fdroidserver.po | 343 ++------------------ locale/pt_PT/LC_MESSAGES/fdroidserver.po | 343 ++------------------ locale/ro/LC_MESSAGES/fdroidserver.po | 344 ++------------------ locale/ru/LC_MESSAGES/fdroidserver.po | 344 ++------------------ locale/sk/LC_MESSAGES/fdroidserver.po | 342 ++------------------ locale/sq/LC_MESSAGES/fdroidserver.po | 343 ++------------------ locale/sr/LC_MESSAGES/fdroidserver.po | 344 ++------------------ locale/sv/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/sw/LC_MESSAGES/fdroidserver.po | 343 ++------------------ locale/ta/LC_MESSAGES/fdroidserver.po | 343 ++------------------ locale/tr/LC_MESSAGES/fdroidserver.po | 343 ++------------------ locale/tzm/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/ug/LC_MESSAGES/fdroidserver.po | 341 ++------------------ locale/uk/LC_MESSAGES/fdroidserver.po | 344 ++------------------ locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 342 ++------------------ locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 344 ++------------------ 55 files changed, 1221 insertions(+), 16947 deletions(-) delete mode 100644 locale/POTFILES.in diff --git a/locale/Makefile b/locale/Makefile index cbb16b90..933aaf3c 100644 --- a/locale/Makefile +++ b/locale/Makefile @@ -1,8 +1,7 @@ -FILES = ../fdroid $(wildcard ../fdroidserver/*.py) \ +FILES = $(wildcard ../fdroidserver/*.py) \ $(wildcard /usr/lib/python3.*/argparse.py) \ - $(wildcard /usr/lib/python3.*/optparse.py) \ - $(wildcard /usr/lib/python3.*/getopt.py) + ../fdroid # these are the supported languages ALL_LINGUAS = $(shell sed -En 's,include locale/([^/]+)/.*,\1,p' ../MANIFEST.in) diff --git a/locale/POTFILES.in b/locale/POTFILES.in deleted file mode 100644 index 07ad4fcc..00000000 --- a/locale/POTFILES.in +++ /dev/null @@ -1,17 +0,0 @@ -fdroid -fdroidserver/btlog.py -fdroidserver/build.py -fdroidserver/checkupdates.py -fdroidserver/common.py -fdroidserver/deploy.py -fdroidserver/import.py -fdroidserver/init.py -fdroidserver/install.py -fdroidserver/lint.py -fdroidserver/metadata.py -fdroidserver/publish.py -fdroidserver/rewritemeta.py -fdroidserver/scanner.py -fdroidserver/stats.py -fdroidserver/update.py -fdroidserver/verify.py diff --git a/locale/ar/LC_MESSAGES/fdroidserver.po b/locale/ar/LC_MESSAGES/fdroidserver.po index ec60d431..4bb27d8a 100644 --- a/locale/ar/LC_MESSAGES/fdroidserver.po +++ b/locale/ar/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2024-09-21 19:31+0000\n" "Last-Translator: Cool Man \n" "Language-Team: Arabic \n" @@ -52,11 +52,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -82,17 +77,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -108,14 +92,6 @@ msgstr "" msgid "%d problems found" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [خيارات]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -136,13 +112,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "" @@ -163,8 +132,6 @@ msgstr "" msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -178,11 +145,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -193,7 +155,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -212,8 +174,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() غير محدد" @@ -304,10 +264,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -351,7 +307,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -407,11 +362,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -464,20 +421,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -497,6 +451,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -590,11 +545,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -651,11 +601,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "جاري التحميل %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -689,12 +634,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -839,10 +778,6 @@ msgstr "" msgid "Finished" msgstr "تم الانتهاء" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -874,7 +809,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -939,15 +873,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1082,16 +1014,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1302,7 +1230,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1338,7 +1265,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1368,19 +1294,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1389,10 +1313,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "خيارات" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1558,14 +1478,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1866,11 +1778,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1880,7 +1787,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "تم العثور على استثناء غير معروف!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1918,6 +1824,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1948,11 +1855,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -1966,6 +1868,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1985,11 +1888,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2004,27 +1903,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "استخدام" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "الاستخدام: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2063,11 +1945,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2169,20 +2046,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2196,11 +2064,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2211,8 +2081,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2231,7 +2099,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" @@ -2245,14 +2113,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2271,14 +2135,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "مركب" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2309,10 +2165,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2337,8 +2189,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2357,8 +2207,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2366,20 +2214,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2392,10 +2234,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2408,8 +2246,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2423,35 +2259,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "عدد صحيح" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2489,8 +2311,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2509,30 +2329,15 @@ msgstr "لا يوجد \"أيقونة\" في {appid}" msgid "no APK supplied" msgstr "لم يتم توفير ملف APK" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "لم يتم العثور على معلومات الإصدار!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "لم يتم العثور على معلومات النسخة" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "غير مسموح به مع الوسيط %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2542,72 +2347,6 @@ msgstr "أحد الوسائط %s مطلوب" msgid "only accepts strings, lists, and tuples" msgstr "يقبل فقط السلاسل والقوائم والأنساق" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "لم يتم التعرف على الإختيار -%s" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "الخيار - %s يتطلب وسيطة" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "الخيار --%s لم يتم التعرف عليه" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "مناقشات اختيارية" - #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" @@ -2618,8 +2357,6 @@ msgstr "خيارات" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "" @@ -2652,10 +2389,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2679,17 +2412,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "اظهار رقم واصدار نسخة البرنامج والخروج" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "اظهر رسالة المساعدة واخرج" @@ -2723,8 +2446,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2734,22 +2455,16 @@ msgstr "" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2760,9 +2475,7 @@ msgstr "" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "الإستخدام: " @@ -2791,21 +2504,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2826,7 +2537,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2867,11 +2577,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/az/LC_MESSAGES/fdroidserver.po b/locale/az/LC_MESSAGES/fdroidserver.po index d86d8a8c..78551ce4 100644 --- a/locale/az/LC_MESSAGES/fdroidserver.po +++ b/locale/az/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2023-05-26 19:39+0000\n" "Last-Translator: Mehrab Poladov \n" "Language-Team: Azerbaijani \n" @@ -48,11 +48,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -78,17 +73,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -104,14 +88,6 @@ msgstr "" msgid "%d problems found" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -132,13 +108,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "" @@ -159,8 +128,6 @@ msgstr "" msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -174,11 +141,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -189,7 +151,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -208,8 +170,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr "" @@ -300,10 +260,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -347,7 +303,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -403,11 +358,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -460,20 +417,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -493,6 +447,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -586,11 +541,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -647,11 +597,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -685,12 +630,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -835,10 +774,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -870,7 +805,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -935,15 +869,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1078,16 +1010,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1298,7 +1226,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1333,7 +1260,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1363,19 +1289,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1384,10 +1308,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1553,14 +1473,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1861,11 +1773,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1875,7 +1782,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1913,6 +1819,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1943,11 +1850,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -1961,6 +1863,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1980,11 +1883,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1999,27 +1898,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2058,11 +1940,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2164,20 +2041,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2191,11 +2059,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2206,8 +2076,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2226,7 +2094,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" @@ -2240,14 +2108,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2266,14 +2130,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2304,10 +2160,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2332,8 +2184,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2351,8 +2201,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2360,20 +2208,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2386,10 +2228,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2402,8 +2240,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2417,35 +2253,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2483,8 +2305,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2503,30 +2323,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2536,72 +2341,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "" @@ -2611,8 +2350,6 @@ msgstr "" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "" @@ -2645,10 +2382,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2672,17 +2405,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "" @@ -2716,8 +2439,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2727,22 +2448,16 @@ msgstr "" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2753,9 +2468,7 @@ msgstr "" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "" @@ -2784,21 +2497,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2819,7 +2530,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2860,11 +2570,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/be/LC_MESSAGES/fdroidserver.po b/locale/be/LC_MESSAGES/fdroidserver.po index dbd2510b..c239f0d2 100644 --- a/locale/be/LC_MESSAGES/fdroidserver.po +++ b/locale/be/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2024-01-21 00:08+0000\n" "Last-Translator: flac \n" "Language-Team: Belarusian \n" @@ -53,11 +53,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -83,17 +78,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -109,14 +93,6 @@ msgstr "" msgid "%d problems found" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [параметры]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -137,13 +113,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "" @@ -164,8 +133,6 @@ msgstr "" msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -179,11 +146,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -194,7 +156,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -213,8 +175,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() не вызначана" @@ -305,10 +265,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -352,7 +308,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -408,11 +363,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -465,20 +422,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -498,6 +452,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -591,11 +546,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -652,11 +602,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -690,12 +635,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -840,10 +779,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -875,7 +810,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -940,15 +874,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1083,16 +1015,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1303,7 +1231,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1338,7 +1265,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1368,19 +1294,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1389,10 +1313,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Параметры" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1558,14 +1478,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Перайменуйце файлы APK, якія не адпавядаюць package.name_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1866,11 +1778,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1880,7 +1787,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "Знойдзена невядомае выключэнне!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1918,6 +1824,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1948,11 +1855,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Абнаўленне інфармацыі рэпазітара для новых пакетаў" @@ -1966,6 +1868,7 @@ msgstr "Абнавіць бінарны журнал празрыстасці д msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1985,11 +1888,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2004,27 +1903,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Выкарыстанне" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Выкарыстанне: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2063,11 +1945,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2169,20 +2046,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "неадназначны варыянт: %(option)s можа адпавядаць %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "неадназначны варыянт: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2196,11 +2064,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2211,8 +2081,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2231,7 +2099,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" @@ -2245,14 +2113,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2271,14 +2135,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2309,10 +2165,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2337,8 +2189,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2356,8 +2206,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2365,20 +2213,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2391,10 +2233,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2407,8 +2245,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2422,35 +2258,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2488,8 +2310,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2508,30 +2328,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "такой опцыі няма: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2541,72 +2346,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "варыянт -%s не распазнаны" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "варыянт -%s патрабуе аргумента" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "параметр --%s не павінен мець аргумент" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "параметр --%s не з'яўляецца унікальным прэфіксам" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "варыянт --%s не распазнаны" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "параметр --%s патрабуе аргументу" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "неабавязковыя аргументы" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "" @@ -2616,8 +2355,6 @@ msgstr "" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "пазіцыйныя аргументы" @@ -2650,10 +2387,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2677,17 +2410,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "паказаць нумар версіі праграмы і выйсці" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "паказаць гэта паведамленне дапамогі і выйсці" @@ -2721,8 +2444,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2732,22 +2453,16 @@ msgstr "патрабуюцца наступныя аргументы: %s" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "нечаканы параметр: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2758,9 +2473,7 @@ msgstr "незнаёмыя аргументы: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "небяспечныя дазволы доступу для '{config_file}' (патрэбна быць 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "выкарыстанне: " @@ -2789,21 +2502,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2824,7 +2535,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2865,11 +2575,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/bg/LC_MESSAGES/fdroidserver.po b/locale/bg/LC_MESSAGES/fdroidserver.po index 5e1756bf..630bf747 100644 --- a/locale/bg/LC_MESSAGES/fdroidserver.po +++ b/locale/bg/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2024-07-19 10:21+0000\n" "Last-Translator: 109247019824 \n" "Language-Team: Bulgarian \n" @@ -49,11 +49,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -79,17 +74,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -105,14 +89,6 @@ msgstr "" msgid "%d problems found" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -133,13 +109,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "" @@ -160,8 +129,6 @@ msgstr "" msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -175,11 +142,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -190,7 +152,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -209,8 +171,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr "" @@ -301,10 +261,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -348,7 +304,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -404,11 +359,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -461,20 +418,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -494,6 +448,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -587,11 +542,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -648,11 +598,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -686,12 +631,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -836,10 +775,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -871,7 +806,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -936,15 +870,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1079,16 +1011,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1299,7 +1227,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1334,7 +1261,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1364,19 +1290,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1385,10 +1309,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1554,14 +1474,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1862,11 +1774,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1876,7 +1783,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1914,6 +1820,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1944,11 +1851,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -1962,6 +1864,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1981,11 +1884,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2000,27 +1899,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2059,11 +1941,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2165,20 +2042,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2192,11 +2060,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2207,8 +2077,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2227,7 +2095,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" @@ -2241,14 +2109,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2267,14 +2131,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "комплекс" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2305,10 +2161,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2333,8 +2185,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2352,8 +2202,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2361,20 +2209,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2387,10 +2229,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2403,8 +2241,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2418,35 +2254,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2484,8 +2306,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2504,30 +2324,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2537,72 +2342,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "" @@ -2612,8 +2351,6 @@ msgstr "" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "" @@ -2646,10 +2383,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2673,17 +2406,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "" @@ -2717,8 +2440,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2728,22 +2449,16 @@ msgstr "" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2754,9 +2469,7 @@ msgstr "" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "" @@ -2785,21 +2498,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2820,7 +2531,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2861,11 +2571,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index 1e52fcb3..21f55ba5 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2021-02-12 09:48+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali \n" @@ -48,11 +48,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -78,17 +73,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -104,14 +88,6 @@ msgstr "" msgid "%d problems found" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [অপশন]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -132,13 +108,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "" @@ -159,8 +128,6 @@ msgstr "" msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -174,11 +141,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -189,7 +151,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -208,8 +170,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr "" @@ -300,10 +260,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -347,7 +303,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -403,11 +358,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -460,20 +417,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -493,6 +447,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -586,11 +541,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -647,11 +597,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -685,12 +630,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -835,10 +774,6 @@ msgstr "" msgid "Finished" msgstr "সম্পূর্ণ" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -870,7 +805,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -935,15 +869,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1078,16 +1010,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1298,7 +1226,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1333,7 +1260,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1363,19 +1289,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1384,10 +1308,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "বিকল্পসমূহ" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1553,14 +1473,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1861,11 +1773,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1875,7 +1782,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "অজানা ব্যতিক্রম পাওয়া গেছে!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1913,6 +1819,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1943,11 +1850,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -1961,6 +1863,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1980,11 +1883,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1999,27 +1898,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "ব্যবহার" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "ব্যবহার: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2058,11 +1940,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2164,20 +2041,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2191,11 +2059,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2206,8 +2076,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2226,7 +2094,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" @@ -2240,14 +2108,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2266,14 +2130,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "জটিল" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2304,10 +2160,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2332,8 +2184,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2351,8 +2201,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2360,20 +2208,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2386,10 +2228,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "ফ্লোটিং-পয়েন্ট" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2402,8 +2240,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2417,35 +2253,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "ইন্টিজার" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2483,8 +2305,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2503,30 +2323,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2536,72 +2341,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "" - #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" @@ -2612,8 +2351,6 @@ msgstr "বিকল্পসমূহ" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "" @@ -2646,10 +2383,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2673,17 +2406,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "" @@ -2717,8 +2440,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2728,22 +2449,16 @@ msgstr "" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2754,9 +2469,7 @@ msgstr "" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "ব্যবহার: " @@ -2785,21 +2498,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2820,7 +2531,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2861,11 +2571,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index 71f6a190..6e68a8c4 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tibetan \n" @@ -53,11 +53,6 @@ msgstr "dir གྱི་རྩ་བ་ for local_copy_dir \"{path}\" མིན msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "'{apkfilename}' འདི་{dev}.ནང་སྔོན་ཚོད་ནས་སྒྲིག་བཅུག་བྱས་ཟིན།." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\"དུས་ཚོད་ཡོལ་ཟིན་པའི་{name} ({version})ཚུད་ཡོད།" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -83,16 +78,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "%(option)s གདམ་ཀ་དགོས་ %(number)d རྩོད་པ།" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -108,14 +93,6 @@ msgstr "" msgid "%d problems found" msgstr "%d དཀའ་རྙོག་ཐོན་སོང་།" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [གདམ་ཀ།]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -136,13 +113,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "%s 1འདི་ཁས་ལེན་ཐུབ་པའི་བཟོ་སྐྲུན་རྭ་བ་མ་རེད།" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "%sགདམ་ཀ་ནུས་མེད་རེད་འདུག" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' འདི་config.yml ནང་རྙེད་མ་སོང་།!" @@ -163,8 +133,6 @@ msgstr "'keystorepass' འདི་ config.yml ནང་རྙེད་མ་ས msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' འདི་ config.yml ནང་རྙེད་མ་སོང་།!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'དགསོ་མཁོ།' ནི་གནས་སྟངས་འདི་ལ་ཁུངས་ལྡན་གྱི་རྩོད་པ་རེད་མིན་འདུག" @@ -179,11 +147,6 @@ msgstr "'sdk_path' འདི་ 'config.yml' ནང་སྒྲིག་ཐུ msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}1' ནི་གོ་རིམ་ངེས་མེད།! བེད་སྤྱོད། () ཡང་ན། [] གོ་རིམ་གལ་ཆེན་པོའི་རིགས་ལ་གུག་རྟགས་ནང་བཅུག!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -194,7 +157,7 @@ msgstr "'{path}1' ལག་བསྟར་ཐུབ་མ་སོང་།!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' ཁུངས་ལྡན་རེད་མིན་འདུག{field} འདི་ནང་ {appid}. Regex འགྲོ་ལུགས་: {pattern}" @@ -213,8 +176,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "...{appid} གྱི་ཆེད་དུ་གསར་བསྒྱུར་འཚོལ་མི་ཐུབ།་: {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() ངོས་འཛིན་ཐུབ་མེད།" @@ -305,10 +266,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -352,7 +309,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -407,11 +363,13 @@ msgstr[0] "ཚགས་རྒྱབ་པའི་སྐབས་སུ་ནོ msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, fuzzy, python-format msgid "Categories '%s' is not valid" msgstr "སྡེ་ཚན་'%s' ཁུངས་ལྡན་མ་རེད།" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "སྡེ་ཚན་རྣམས་སྒྲིག་མེད།" @@ -464,21 +422,18 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "ཁྱེད་རང་གི་མ་ལག་སྒང་ལ་'{command}1' རྙེད་མ་སོང་།" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Could not find latest version code" msgstr "ཐོན་རིམ་གསར་གསར་ཤོས་ཀྱི་ཨང་རྟགས་འདི་འདི་རྙེད་མ་སོང་།" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Could not find latest version name" @@ -499,6 +454,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Couldn't find Application ID" @@ -594,11 +550,6 @@ msgstr "འགྲེལ་བཤད་'%s 1' ནི་མཉེན་ཆས་ msgid "Description has a duplicate line" msgstr "འགྲེལ་བཤད་འདི་ལ་རིམ་པ་རྫུན་མ་ཡོད།" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "འགྲེལ་བཤད་འདི་ལ་ཐོ་གཞུང་ཡོད། (%s 1) འོན་ཀྱང་འདི་ལ་ཚགས་རྒྱབ་མིན་འདུག(*)གྲངས་ཀྱང་མེད། (#)" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -655,11 +606,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "མཛོད་ཁང་ཕབ་ལེན་ཐེངས་གཅིག་བྱས་པ་འདི་ཐུབ་མ་སོང་། ཡང་སྐྱར་ཐབས་ཤེས་བྱེད་ཀྱི་མིན་།." @@ -693,12 +639,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ནོར་འཁྲུལ།: རྒྱབ་སྐྱོར་མེད་པའི་CI རྣམ་གྲངས་དང་ལྷན་པ་རྒྱབ་ནའང་འགྲིག་གི་ཡོད།!" @@ -846,11 +786,6 @@ msgstr "" msgid "Finished" msgstr "ཚར་སོང་།" -#: ../fdroidserver/lint.py -#, fuzzy -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Flattr ཞལ་འདེབས་ཐབས་ལམ་འདི་བཞིན་FlattrID flag ལ་ཐོབ་ཀྱི་ཡོད་།" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -882,7 +817,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "རྩོད་པའི་ནང་ཁུངས་ལྡན་མིན་པའི་appids རྙེད་འདུག" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "མཉེན་ཆས་ཁ་ཤས་ཀྱི་ཁུངས་ལྡན་མིན་པའི་ཐོན་རིམ་ཨང་རྟགས་རྙེད་འདུག" @@ -948,16 +882,13 @@ msgstr "གིཊ་གཙང་བཟོ་ཐུབ་མ་སོང་།" msgid "Git fetch failed" msgstr "གིཊ་འཚོལ་ཐུབ་མ་སོང་།" -#: ../fdroidserver/common.py -#, fuzzy -msgid "Git prune failed" -msgstr "གིཊ་སྐྱར་སྒྲིག་ཐུབ་མ་སོང་།" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "གིཊ་སྐྱར་སྒྲིག་ཐུབ་མ་སོང་།" @@ -1093,16 +1024,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Invalid application ID {appid}" msgstr "ལས་ཀ་བྱེད་བཞིན་པ།{appid}" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "ཁུངས་ལྡན་མིན་པའི་boolean '%s 1'" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "ཚད་ལྡན་མིན་པའི་ཚགས་ཀྱི་ཐོ་གཞུང་།" @@ -1317,7 +1244,6 @@ msgstr "{path}མིང་རྟགས་བཀོད་པའི་ཆོག་ msgid "No such package: %s" msgstr "ཐུམ་སྒྲིལ་དེ་འདྲ་མིན་འདུག: %s 1" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1354,7 +1280,6 @@ msgstr "{appid} ཆེད་དུ་བྱ་རྒྱུ་གང་ཡང་ msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1384,19 +1309,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "PNG དང་ JPEG ཁོ་ན་བརྐོས་རིས་རྒྱབ་སྐྱོར་རྙེད་སོང་། :{path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "མཉེས་ཆས་གསོག་ཉར་ཁང་དང་མི་འདྲ་པ་ཡོད་པ་ཁོ་ནར་པར་ཤུས་བྱེད།" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "མཉེན་ཆས་ཁོ་ནར་རང་འགུལ་གསར་བསྒྱུར་བྱེད།" @@ -1406,10 +1329,6 @@ msgstr "མཉེན་ཆས་ཁོ་ནར་རང་འགུལ་གས msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Flattr ཞལ་འདེབས་ཐབས་ལམ་འདི་བཞིན་FlattrID flag ལ་ཐོབ་ཀྱི་ཡོད་།" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "གདམ་ཀ།" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1575,14 +1494,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "package.name_123.apk དང་མི་འདྲ་བའི་APK ཡིག་ཆ་དེ་ཚོར་མིང་སྐྱར་ཏུ་བཏགས།" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "ཡོད་བཞིན་པའི་ཞབས་ཞུ་འཕྲུལ་ཆས་འདི་ལ་སྐྱོན་མེད་པ་ཡིན་རུང་། ཐོན་སྐྱེད་ཞབས་ཞུ་འཕྲུལ་ཆས་གསར་པ་ཞིག་སྐྱར་སྒྲིག་དང་བཟོས།." - #: ../fdroidserver/nightly.py #, fuzzy, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1884,11 +1795,6 @@ msgstr "ཁུངས་ལྡན་མིན་པའི་ཆོག་མཆན msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1898,7 +1804,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "ཆ་རྒྱུས་མེད་པའི་དམིགས་བསལ་ཞིག་རྙེད་སོང་།!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1936,6 +1841,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1966,11 +1872,6 @@ msgstr "%s 1 དེ་ལ་བེད་སྤྱོད་མེད་པའི msgid "Unused scanignore path: %s" msgstr "%s 1 དེ་ལ་བེད་སྤྱོད་མེད་པའི་ཡིག་ཆ།" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "ཐུམ་སྒྲིལ་གསར་པའི་ཆེད་དུ་རེ་པོ་གནས་ཚུལ་གསར་བསྒྱུར་བྱེད།" @@ -1984,6 +1885,7 @@ msgstr "URLཆེད་དུ་ཨང་གྲངས་ཀྱི་ཐོ་ག msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -2003,11 +1905,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py #, fuzzy msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -2023,28 +1921,11 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "སྦས་ཁུང་ནས་ {apkfilename}ཀློག་བཞིན་པ།" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "བེད་སྤྱོད།" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "བེད་སྤྱོད།:%s 1\n" - #: ../fdroidserver/lint.py #, fuzzy msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "བེད་སྤྱོད།/HEAD གྱི་ཚབ་ཏུ།/ སོར་བཞག་ཡན་ལག་ནང་དུ་ཡོད་པའི་དོན་ཚན་ཨ་མ།" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "བེད་སྤྱོད།/HEAD གྱི་ཚབ་ཏུ།/ སོར་བཞག་ཡན་ལག་ནང་དུ་ཡོད་པའི་དོན་ཚན་ཨ་མ།" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "`fdroid update -c`བེད་སྤྱོད་བྱས་ནས་འདི་བཟོས།." @@ -2083,11 +1964,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, fuzzy, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "སྐྱར་བྲིས་ཡོད་།{path}" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2189,20 +2065,11 @@ msgstr "{path}ལ་ངོས་འཛིན་ཡིག་ཆ་ཁ་སྣོ msgid "adding to {name}: {path}" msgstr "{name}ལ་ཁ་སྣོན་བྱེད།: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "གསལ་ཁ་མེད་པའི་གདམ་ཀ: %(option)s མཐུན་མི་སོང་།%(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "གསལ་ཁ་མེད་པའི་གདམ་ཀ:%s 1 (%s 2?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2216,12 +2083,14 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py #, fuzzy msgid "application ID of file to operate on" msgstr "མཉེས་ཆས་ཁ་བྱང་རྒྱུད་གསར་བསྒྱར་ཡོད་མིན་ལྟོས།" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2233,8 +2102,6 @@ msgstr "མཉེན་ཆས་ཀྱི་ངོ་བོ་དང་མཉམ msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2254,7 +2121,7 @@ msgstr "ཕྱོགས་སྐྱོད་ལྡེ་མིག་ཚོད་ msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "ཁ་ཕྱེས་ཐུབ་མ་སོང་།'%(filename)s': %(error)s" @@ -2268,14 +2135,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "{path}!གྱི་ཆེད་དུ་ཐུམ་སྒྲིལ་གྱི་མིང་རྙེད་མ་སོང་།" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "subparser རྩོད་པ་དུ་མ་ཡོད་ཐབས་མེད།" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2294,14 +2157,6 @@ msgstr "འདྲ་བཟོས་{url}" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "མགོ་རྙོག" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2331,10 +2186,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2359,8 +2210,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2379,28 +2228,20 @@ msgstr "{apkfilename}ཡིག་ཆ་སྦས་ཁུང་རྙིང་ msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "ཚོད་དཔག་བྱེད་པའི་%s 1 རྩོད་པ་" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "མ་མཐའ་ཡིན་ནའང་རེ་བ་བྱེད་པའི་རྩོད་པ།" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "རེ་བ་བྱས་པའི་རྩོད་པ་ཆེ་ཤེོས་གཅིག" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "རེ་བ་བྱས་པའི་རྩོད་པ་གཅིག" @@ -2414,10 +2255,6 @@ msgstr "བེད་སྤྱོད་: ཨེཕ་རོཌ་ [-h|-རོག msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "གཡེང་ཚེག" - #: ../fdroidserver/metadata.py #, fuzzy msgid "force metadata errors (default) to be warnings, or to be ignored." @@ -2432,8 +2269,6 @@ msgstr "གིཊ་གཙང་བཟོ་ཐུབ་མ་སོང་།" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2448,35 +2283,21 @@ msgstr "index-v1 ངེས་པར་དུ་མིང་རྟགས་དག msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 ངེས་པར་དུ་མིང་རྟགས་དགོས། བེད་སྤྱོད་`fdroid signindex`འདི་བཟོས་པ་རེད།!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "གོང་བུ།" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "ཁུངས་ལྡན་མིན་པ་ %(type)s value: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "ཁུངས་ལྡན་མིན་པའི་གདམ་ཀ: %(value)r (དེ་ནས་གདམ་ཀ་%(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "ཁུངས་ལྡན་མིན་པའི་རྙོག་ཕྲ།_resolution value: %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2514,8 +2335,6 @@ msgstr "མེ་ལོང་། '%s 1' 'fdroid'དང་མཉམ་དུ་ msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "ནང་ཕན་ཚུན་རྩོད་པ་དེ་གདམ་ཀ་ཅན་ངེས་པར་དུ་བཞག་དགོས་།" @@ -2534,31 +2353,16 @@ msgstr "ལས་ཀ་བྱེད་བཞིན་པ།{appid}" msgid "no APK supplied" msgstr "APK མཁོ་སྤྲོད་མིན་འདུག" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "གདམ་ཀ་དེ་འདྲ་མིན་འདུག: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "ཆ་རྒྱུས་མེད་པའི་དམིགས་བསལ་ཞིག་རྙེད་སོང་།!" - #: ../fdroidserver/checkupdates.py #, fuzzy msgid "no version information found" msgstr "ཆ་རྒྱུས་མེད་པའི་དམིགས་བསལ་ཞིག་རྙེད་སོང་།" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "རྩོད་པ་དང་མཉམ་དུ་ཆོག་མཆན་མེད། %s 1" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2568,72 +2372,6 @@ msgstr "རྩོད་པ་གཅིག་དགོས་ཀྱི་ཡོད msgid "only accepts strings, lists, and tuples" msgstr "ཚིག་སྒྲུབ་དང་ཐོ་གཞུང་། ཡིག་ཚགས་ཁོ་ན་ངོས་ལེན་བྱེད།" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "གདམ་ཀ %s 1: གལ་ཏེ་ཁྱེད་ཀྱིས་མིང་རྟགས་བཀོད་པའི་མཉེན་ཆས་རིགས་ཚང་མ་ངེས་པར་དུ་སྒྲིག་བཅུག་བྱེད་འདོད་ཡོད་། བེད་སྤྱོད་ --ཚང་མ།" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "གདམ་ཀ %s 1: ཁུངས་ལྡན་མིན་པ་ %s 2 རིན་ཐང་།: %r 3" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "གདམ་ཀ %s 1: ཁུངས་ལྡན་མིན་པའི་གདམ་ཀ: %r 2 (choose from %s 3)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "གདམ་ཀ། '%s 1'ངོས་འཛིན་ཐུབ་མ་སོང་།" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "གདམ་ཀ། -%s 1 རྩོད་དགོས།" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "གདམ་ཀ། --%s 1གང་བྱས་ཀྱང་རྩོད་པ་མེད།" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "གདམ་ཀ་--%s ཐུན་མོང་མ་ཡིན་པའི་སྔོན་འཇུག་མ་རེད།" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "གདམ་ཀ།--%s 1 ངོས་འཛིན་ཐུབ་མ་སོང་།" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "གདམ་ཀ། --%s རྩོད་དགོས།" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "གདམ་ཀ་ཅན་གྱི་རྩོད་པ།" - #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" @@ -2644,8 +2382,6 @@ msgstr "གདམ་ཀ།" msgid "overwriting existing {path}" msgstr "སྐྱར་བྲིས་ཡོད་།{path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "གནས་སྟངས་ལ་གཞིགས་པའི་རྩོད་པ།" @@ -2678,10 +2414,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2706,17 +2438,7 @@ msgstr "local_copy_dir \"fdroid\"གིས་མཇུག་སྐྱོང་ msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "ལས་རིམ་རྣམ་གཞག་གི་ཐོན་རིམ་ཨང་གྲངས་སྟོན་ནས་ཕྱིར་ཐོན་བྱེད།" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "རོགས་པ་བྱེད་པའི་འཕྲིན་ཐུང་སྟོན་ནས་ཕྱིར་ཐོན།" @@ -2750,8 +2472,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2761,22 +2481,16 @@ msgstr "གཤམ་གྱི་རྩོད་པ་དེ་དག་དགོ msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "རེ་བ་མེད་པའི་གདམ་ཀ་ཅན་གྱི་ཚིག་སྒྲུབ།:%s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "ངོས་འཛིན་མི་ཐུབ་པའི་ parser %(parser_name)r (གདམ་ཀ།: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2787,9 +2501,7 @@ msgstr "ངོས་འཛིན་མི་ཐུབ་པའི་རྩོད msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "'{config_file}' སྒང་གི་བདེ་ཆགས་མེད་པའི་ཆོག་མཆན་ (ངེས་པར་དུ། 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "བེད་སྤྱོད།: " @@ -2817,21 +2529,19 @@ msgstr[0] "{0} མཉེས་ཆས་, {1} key aliases" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) ལ་རྒྱབ་ལྗོངས་ཡིག་ཆ་མིན་འདུག!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} ལ་མིང་ཡོད་མ་རེད། !དེའི་ཚབ་ལ་ཐུམ་སྒྲིལ་མིང་བེད་སྤྱོད་བྱེད།." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2852,7 +2562,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2893,11 +2602,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index a54c5f23..bac85e24 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2025-01-30 12:31+0000\n" "Last-Translator: pitroig \n" "Language-Team: Catalan \n" @@ -58,11 +58,6 @@ msgstr "\"local_copy_dir\" {path} no existeix!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" ja està instal·lat en {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" conté {name} ({version}) obsoleta" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -88,17 +83,6 @@ msgstr "\"{path}\" està signat per una clau que no està permesa:" msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" no és un URL vàlid!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "l'opció %(option)s requereix l'argument %(number)d" -msgstr[1] "les opcions %(option)s requereixen els arguments %(number)d" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -114,14 +98,6 @@ msgstr "%d APKs no han pogut ser signats o verificats." msgid "%d problems found" msgstr "%d problemes trobats" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [options]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -142,13 +118,6 @@ msgstr "%s té un SHA-256 dolent: %s" msgid "%s is not an accepted build field" msgstr "%s no és un camp de compilació acceptat" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "L'opció %s no pren cap valor" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' no s'ha trobat a config.yml!" @@ -169,8 +138,6 @@ msgstr "'keystorepass' no s'ha trobat a config.yml!" msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' no s'ha trobat a config.yml!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "\"obligatori\" és un argument no vàlid per a posicionals" @@ -184,11 +151,6 @@ msgstr "'sdk_path' no establert a config.yml!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' és massa antic, fdroid requereix build-tools-{version} o superior." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' serà en ordre aleatori. Utilitzeu parèntesis () o [] si l'ordre és important." - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -199,7 +161,7 @@ msgstr "Error en l'execució de '{path}'." msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' té un format invàlid; hauria de ser un diccionari!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' no és un {field} vàlid a {appid}. Expressió regular: {pattern}" @@ -218,8 +180,6 @@ msgstr "--merge-request només funciona amb un sol ID d'aplicació!" msgid "...checkupdate failed for {appid} : {error}" msgstr "...ha fallat la comprovació de {appid} : {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() no definida" @@ -310,10 +270,6 @@ msgstr "No s'ha trobat l'eina Android SDK {cmd}!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "L'aplicació té binaris però no té el corresponent certificat AllowedAPKSigningKeys per fixar." -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "L'aplicació té NoSourceSince o ArchivePolicy \"0 versions\", però AutoUpdateMode o UpdateCheckMode no són None" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "L'aplicació té NoSourceSince o ArchivePolicy \"0 versions\" o 0 però AutoUpdateMode o UpdateCheckMode no són None" @@ -357,7 +313,6 @@ msgstr "Tipus d'entrada incorrecta \"{mirrortype}\" a la configuració de mirall msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL base a la rèplica, podeu incloure la clau de signatura de l'índex utilitzant la cadena de consulta: ?fingerprint=" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -413,11 +368,13 @@ msgstr[1] "No es pot construir a causa d'errors {} en escanejar" msgid "Cannot rewrite \"{path}\"" msgstr "No es pot reescriure \"{path}\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Les categories '%s' no són vàlides" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "No s'han definit categories" @@ -470,20 +427,17 @@ msgstr "Definicions conflictives de \"{field}\" entre .yml i fitxers localitzats msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Arguments conflictius: no es poden especificar al mateix temps '--verbose' i '--quiet'." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Fitxers de configuració en conflicte! Utilitzant {newfile}, s'ignorarà {oldfile}!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "No s'ha pogut trobar '{command}' al vostre sistema" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "No s'ha pogut trobar el codi de versió més recent" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "No s'ha pogut trobar el codi de versió més recent" @@ -503,6 +457,7 @@ msgstr "No s'ha pogut obrir APK {path} per a l'anàlisi: " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "No s'ha pogut analitzar la mida \"{size}\", tipus incorrecte \"{type}\"" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "No s'ha pogut trobar l'identificador de l'aplicació" @@ -596,11 +551,6 @@ msgstr "La descripció '%s' és només el resum de l'aplicació" msgid "Description has a duplicate line" msgstr "La descripció té una línia duplicada" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "La descripció té una llista (%s) però no té pics (*) ni numerats (#)" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -657,11 +607,6 @@ msgstr "Baixeu l'F-Droid.apk amb els miralls que filtren menys dades a la xarxa" msgid "Download complete mirrors of small repos" msgstr "Baixa les rèpliques completes dels petits dipòsits" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "S'està baixant %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "La baixada del repositori ja ha fallat una vegada, no s'ha tornat a provar." @@ -695,14 +640,6 @@ msgstr "ERROR: %(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERROR: S'ha eliminat la subordre \"servidor\", useu \"deploy\"!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"ERROR: aquesta ordre no s'ha d'utilitzar mai per a replicar f-droid.org!\n" -"Una rèplica completa de f-droid.org requereix més de 200 GB." - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERROR: tipus CI no suportat, pedaços benvinguts!" @@ -849,10 +786,6 @@ msgstr "El fitxer ha desaparegut en processar-lo: {path}" msgid "Finished" msgstr "Finalitzat" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Els mètodes de donació de Flattr pertanyen a FlattrID: camp" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Etiquetes HTML prohibida" @@ -884,7 +817,6 @@ msgstr "S'ha trobat un fitxer de finançament incorrecte \"{path}\" per a \"{nam msgid "Found invalid appids in arguments" msgstr "S'han trobat aplicacions no vàlides als arguments" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "S'han trobat versionsCodes no vàlides per a algunes aplicacions" @@ -949,15 +881,13 @@ msgstr "Ha fallat la neteja del Git" msgid "Git fetch failed" msgstr "Ha fallat l'obtenció del Git" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "Ha fallat la poda del Git" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Ha fallat el set-head remot del Git: «%s»" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Ha fallat el restabliment del Git" @@ -1092,16 +1022,12 @@ msgstr "VercodeOperation no vàlid: {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "VercodeOperation no vàlid: {invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "ID d'aplicació {appid} invàlid" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "El booleà '%s' no és vàlid" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Llista de pics no vàlida" @@ -1312,7 +1238,6 @@ msgstr "No s'ha trobat cap certificat de signatura a {path}" msgid "No such package: %s" msgstr "No existeix el paquet: %s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1347,7 +1272,6 @@ msgstr "No hi ha res a fer per {appid}." msgid "Now set these in config.yml:" msgstr "Ara establiu-los a config.yml:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1377,19 +1301,17 @@ msgstr "Un dels elements de configuració 'github_releases' manca el valor 'proj msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "Un dels elements de configuració 'github_releases' manca el valor 'token'. s'està ometent..." +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Només s'admeten PNG i JPEG per als gràfics, s'ha trobat: {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Imprimeix només les diferències amb la Play Store" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Només processa aplicacions amb actualitzacions automàtiques" @@ -1398,10 +1320,6 @@ msgstr "Només processa aplicacions amb actualitzacions automàtiques" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Els mètodes de donació OpenCollective pertanyen al camp OpenCollective: field" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Opcions" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Informe de sortida JSON a un fitxer anomenat segons l'APK." @@ -1567,14 +1485,6 @@ msgstr "S'està suprimint {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Canvia el nom dels fitxers APK que no coincideixin amb package.name_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "El mode d'actualització del RepoTrunk només té sentit en els dipòsits git-svn" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Restableix i crea un servidor de construcció nou, fins i tot si l'existent sembla estar bé." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1882,11 +1792,6 @@ msgstr "Etiqueta de llicència inesperada \"{}\"! Utilitza només les etiquetes msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Etiqueta de llicència inesperada \"{}\"! Utilitza només les etiquetes de llicència configurades al fitxer de configuració" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "Destinació inesperada de l'enllaç simbòlic: {link} -> {target}" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1896,7 +1801,6 @@ msgstr "Entrada desconeguda {key} a {configname}" msgid "Unknown exception found!" msgstr "S'ha trobat una excepció desconeguda!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1934,6 +1838,7 @@ msgstr "Camp d'aplicació no reconegut '{fieldname}' a '{path}'" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Indicador de construcció no reconegut '{build_flag}' a '{path}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1964,11 +1869,6 @@ msgstr "Camí de l'escandelete no utilitzat: %s" msgid "Unused scanignore path: %s" msgstr "Camí de scanignore no utilitzat: %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "S'està descomprimint a %s" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Actualitza la informació del dipòsit amb paquets nous" @@ -1982,6 +1882,7 @@ msgstr "Actualitza l'informe de transparència binari amb un nou URL" msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData té un URL no vàlid: {url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -2001,11 +1902,7 @@ msgstr "UpdateCheckData no és un URL vàlid: {url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode està establert però sembla que encara no s'han executat les revisions." -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode està definit però sembla que encara no s'ha executat checkupdates" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName està establert a l'identificador d'aplicació conegut, es pot eliminar" @@ -2020,27 +1917,10 @@ msgstr "S'està pujant {apkfilename} a androidobservatory.org" msgid "Uploading {apkfilename} to virustotal" msgstr "S'està pujant {apkfilename} a virustotal" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Utilització" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Utilització: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "Usa /HEAD en lloc de /master o /main per apuntar a un fitxer a la branca predeterminada" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Usa /HEAD en lloc de /master per a apuntar a un fitxer a la branca predeterminada" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Utilitzeu `fdroid update -c`per a crear-lo." @@ -2079,11 +1959,6 @@ msgstr "Ús de la signatura JAR" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Utilitzant el jarsigner de Java, no es recomana verificar APKs! Useu l'apksigner" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "Ús d'androguard de \"{path}\"" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2185,20 +2060,11 @@ msgstr "s'està afegint el fitxer d'identitat a {path}" msgid "adding to {name}: {path}" msgstr "s'està afegint a {name}: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opció ambigua: %(option)s podria correspondre amb %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "opció ambigua: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2212,11 +2078,13 @@ msgstr "No s'ha trobat l'apksigner! No es poden signar o verificar els APK moder msgid "apksigner not found, it's required for signing!" msgstr "No s'ha trobat l'apksigner, és necessari per signar!" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "ID de l'aplicació del fitxer en què s'ha d'operar" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2227,8 +2095,6 @@ msgstr "ID de l'aplicació amb versió opcionalCode en el formulari APPID[:VERCO msgid "archive_url needs to end with /archive" msgstr "archive_url necessita acabar amb /archive" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2247,7 +2113,7 @@ msgstr "s'està provant la connexió SSH per comprovar la clau de desplegament:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "no es pot analitzar l'especificació de la «scrlib» (no és una cadena): '{}'" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "no es pot obrir '%(filename)s': %(error)s" @@ -2261,14 +2127,10 @@ msgstr "no es pot obrir l'URL no-https: '{};" msgid "cannot find required srclibs: \"{path}\"" msgstr "no s'han pogut trobar els srclibs requerits: \"{path}\"" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "no es poden tenir múltiples arguments de subanalitzador" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2287,14 +2149,6 @@ msgstr "s'està clonant {url}" msgid "commands from plugin modules:" msgstr "ordres dels mòduls del connector:" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "complex" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2325,10 +2179,6 @@ msgstr "no s'ha pogut analitzar l'especificació «srclib» (no s'ha especificat msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "no s'ha pogut analitzar l'especificació «srclib» (no s'ha especificat cap referència): '{}'" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "no s'ha pogut analitzar l'especificació de l'srclib (massa signes '@'): '{}'" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2353,8 +2203,6 @@ msgstr "fitxer de dependència sense blocatge" msgid "deployed process log {path} to {dest}" msgstr "s'ha desplegat el registre de procés {path} a {dest}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2372,8 +2220,6 @@ msgstr "ha fallat la baixada de signatures de l'escàner des de '{}'" msgid "executable binary, possibly code" msgstr "binari executable, possiblement codi" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2381,20 +2227,14 @@ msgid_plural "expected %s arguments" msgstr[0] "s'esperava l'argument %s" msgstr[1] "s'esperaven els arguments %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "s'esperava almenys un argument" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "s'esperava com a màxim un argument" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "s'esperava un argument" @@ -2407,10 +2247,6 @@ msgstr "fdroid [] [-h|--help|--version|]" msgid "fetch the latest version of signatures from the web" msgstr "recupera l'última versió de les signatures del web" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "coma flotant" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "força que els errors de metadades (predeterminat) siguin avisos o s'ignorin." @@ -2423,8 +2259,6 @@ msgstr "Ha fallat el clon de «git svn»" msgid "gzip file archive" msgstr "arxiu de fitxers gzip" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2438,35 +2272,21 @@ msgstr "index-v1 ha de tenir una signatura, utilitzeu `fdroid signindex` per a c msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 ha de tenir una signatura, utilitzeu `fdroid signindex`per a crear-la!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "enter" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valor %(type)s no vàlid: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "elecció no vàlida: %(value)r (trieu de %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "el valor conflict_resolution no és vàlid: %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2504,8 +2324,6 @@ msgstr "el mirall '%s' no acaba amb 'fdroid'!" msgid "mirrors set twice, in config.yml and {path}!" msgstr "miralls establerts dues vegades, a config.yml i {path}!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "els arguments mútuament excloents han de ser opcionals" @@ -2524,30 +2342,15 @@ msgstr "no hi ha cap \"icona\" a {appid}" msgid "no APK supplied" msgstr "no s'ha subministrat cap APK" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "opció inexistent: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "no s'ha trobat cap informació de versió!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "no s'ha trobat cap informació de versió" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "no està permès amb l'argument %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2557,72 +2360,6 @@ msgstr "es requereix un dels arguments %s" msgid "only accepts strings, lists, and tuples" msgstr "només accepta cadenes, llistes i tuples" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "opció %s: Si realment voleu instal·lar totes les aplicacions signades, utilitzeu --all" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "opció %s: valor %s no vàlid: %r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "opció %s: elecció no vàlida: %r (trieu de %s)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "opció -%s no reconeguda" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "opció -%s demana un argument" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "l'opció --%s no pot tenir arguments" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "l'opció --%s no té un prefix unívoc" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "opció --%s not reconeguda" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "l'opció --%s requereix un argument" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "arguments opcionals" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "opcions" @@ -2632,8 +2369,6 @@ msgstr "opcions" msgid "overwriting existing {path}" msgstr "s'està sobreescrivint {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "arguments posicionals" @@ -2666,10 +2401,6 @@ msgstr "repo_url ha d'acabar amb /repo" msgid "rsync is missing or broken: {error}" msgstr "falta el rsync o està trencat: {error}" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "ruamel.yaml no està instal·lat, no es poden escriure metadades." - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2693,17 +2424,7 @@ msgstr "serverwebroot: el camí no acaba amb \"fdroid\", potser volíeu dir una msgid "shared library" msgstr "biblioteca compartida" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "mostra el número de versió del programa i surt" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "mostra aquest missatge d'ajuda i surt" @@ -2737,8 +2458,6 @@ msgstr "biblioteca estàtica" msgid "supplied reference binary has allowed signer {signer}" msgstr "el binari de referència proporcionat ha permès el signant {signer}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2748,22 +2467,16 @@ msgstr "els arguments següents són obligatoris: %s" msgid "true" msgstr "vertader" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "cadena d'opcions inesperada: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "analitzador desconegut %(parser_name)r (opcions: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2774,9 +2487,7 @@ msgstr "arguments desconeguts: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "permisos a «{config_file}» insegurs (hauria de ser 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "us: " @@ -2805,21 +2516,19 @@ msgstr[1] "{0} aplicacions, {1} àlies de claus" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) no té metadades!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} té múltiples fitxers {name}, sembla un exploit a la clau mestra!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "L'AndroidManifest.xml de {apkfilename} té una data incorrecta: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} no té nom! S'està utilitzant l'identificador de l'aplicació." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2840,7 +2549,6 @@ msgstr "{appid} té tant APK com fitxers: {files}" msgid "{appid} is missing {name}" msgstr "{appid} no té {name}" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2881,11 +2589,6 @@ msgstr "{file} està en blanc o corromput!" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" no existeix! Comproveu \"config.yml\"." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile} és obsolet, utilitzeu {newfile}" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index bc89c51a..d64196a8 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2025-03-20 16:21+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" @@ -60,11 +60,6 @@ msgstr "„local_copy_dir“ {path} neexistuje!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "Aplikace „{apkfilename}“ je již nainstalována na {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "„{path}“ obsahuje zastaralý {name} ({version})" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -90,18 +85,6 @@ msgstr "„{path}“ je podepsáno klíčem, který není povolen:" msgid "\"{url}\" is not a valid URL!" msgstr "„{url}“ není platná adresa URL!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "možnost %(option)s vyžaduje %(number)d argument" -msgstr[1] "možnost %(option)s vyžaduje %(number)d argumenty" -msgstr[2] "možnost %(option)s vyžaduje %(number)d argumentů" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -117,14 +100,6 @@ msgstr "Nepodařilo se podepsat nebo ověřit %d souborů APK!" msgid "%d problems found" msgstr "nalezeno %d problémů" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [možnosti]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -145,13 +120,6 @@ msgstr "%s má špatný kód SHA-256: %s" msgid "%s is not an accepted build field" msgstr "%s není akceptované pole sestavení" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "možnost %s nepřebírá hodnotu" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "„keypass“ nebyl nalezen v souboru config.yml!" @@ -172,8 +140,6 @@ msgstr "„keystorepass“ nebyl nalezen v souboru config.yml!" msgid "'repo_keyalias' not found in config.yml!" msgstr "„repo_keyalias“ nebyl nalezen v souboru config.yml!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "„required je neplatný argument pro positionals" @@ -187,11 +153,6 @@ msgstr "„sdk_path“ není nastavena v souboru config.yml!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "„{aapt}“ je příliš starý, fdroid vyžaduje build-tools-{version} nebo novější!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "„{field}“ bude v náhodném pořadí! Pokud je pořadí důležité, použijte závorky () nebo []!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -202,7 +163,7 @@ msgstr "„{path}“ se nepodařilo spustit!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "„{path}“ má neplatný formát, měl by to být slovník!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "„{value}“ není platný {field} v {appid}. Vzor regex: {pattern}" @@ -221,8 +182,6 @@ msgstr "--merge-request beží pouze u jednoho appid!" msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate selhal pro {appid} : {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() není definováno" @@ -313,10 +272,6 @@ msgstr "Nástroj Android SDK {cmd} nenalezen!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Aplikace má binární soubory, ale nemá odpovídající AllowedAPKSigningKeys pro připnutí certifikátu." -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "Aplikace má NoSourceSince nebo ArchivePolicy „0 versions“, ale AutoUpdateMode nebo UpdateCheckMode nejsou None" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Aplikace má NoSourceSince nebo ArchivePolicy „0 versions“ nebo 0, ale AutoUpdateMode nebo UpdateCheckMode nejsou None" @@ -360,7 +315,6 @@ msgstr "Nesprávný typ záznamu „{mirrortype}“ v konfiguraci zrcadel: {mirr msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Základní adresa URL pro zrcadlení, může obsahovat klíč pro podepisování indexu pomocí řetězce dotazu: ?fingerprint=" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -417,11 +371,13 @@ msgstr[2] "Nelze sestavit kvůli {} chybám při skenování" msgid "Cannot rewrite \"{path}\"" msgstr "Nelze přepsat „{path}“" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Kategorie „%s“ není platná" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Kategorie nejsou nastavené" @@ -474,20 +430,17 @@ msgstr "Konfliktní definice „{field}“ mezi soubory .yml a lokalizovanými s msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Konfliktní argumenty: „--verbose“ a „--quiet“ nelze zadat současně." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Konfliktní konfigurační soubory! Používám {newfile}, ignoruji {oldfile}!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Ve vašem systému se nepodařilo najít příkaz „{command}“" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Nepodařilo se najít kód poslední verze" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Nepodařilo se najít název poslední verze" @@ -507,6 +460,7 @@ msgstr "Nepodařilo se otevřít APK {path} pro analýzu: " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Nepodařilo se parsovat velikost „{size}“, nesprávný typ „{type}“" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Nepodařilo se nalézt ID aplikace" @@ -600,11 +554,6 @@ msgstr "Popis „%s“ je pouze souhrn aplikace" msgid "Description has a duplicate line" msgstr "Popis má duplicitní řádek" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "Popis má seznam (%s), ale není opatřen odrážkami (*) ani očíslován (#)" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -661,11 +610,6 @@ msgstr "Stáhnout F-Droid.apk pomocí zrcadel, která do sítě vypouštějí m msgid "Download complete mirrors of small repos" msgstr "Stáhnout kompletní mirrory malých repozitářů" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "Stahování %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Stahování repozitáře již jednou selhalo, nezkouším to znovu." @@ -699,14 +643,6 @@ msgstr "CHYBA: %(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "CHYBA: Podpříkaz „server“ byl odebrán, použijte „deploy“!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"CHYBA: tento příkaz by nikdy neměl být použit k zrcadlení f-droid.org!\n" -"Celý mirror f-droid.org vyžaduje více než 200GB." - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "CHYBA: nepodporovaný typ CI, opravy vítány!" @@ -853,10 +789,6 @@ msgstr "Soubor zmizel při jeho zpracování: {path}" msgid "Finished" msgstr "Dokončeno" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Metody darování Flattr patří do pole „FlattrID:“" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Zakázané značky HTML" @@ -888,7 +820,6 @@ msgstr "Nalezeno špatné financování souboru „{path}“ pro „{name}“:" msgid "Found invalid appids in arguments" msgstr "V argumentech nalezena neplatná id aplikací" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "U některých aplikací nalezeny neplatné versionCodes" @@ -953,15 +884,13 @@ msgstr "Git clean se nezdařil" msgid "Git fetch failed" msgstr "Git fetch se nezdařil" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "Git prune se nezdařil" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git remote set-head se nezdařil: „%s“" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Git reset se nezdařil" @@ -1096,16 +1025,12 @@ msgstr "Neplatný VercodeOperation: {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "Neplatný VercodeOperation: {invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "Neplatné ID aplikace {appid}" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "Neplatná logická hodnota „%s“" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Neplatný seznam s odrážkami" @@ -1316,7 +1241,6 @@ msgstr "Nenalezeny žádné podpisové certifikáty v {path}" msgid "No such package: %s" msgstr "Žádný takový balíček: %s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1351,7 +1275,6 @@ msgstr "Pro {appid} není co dělat." msgid "Now set these in config.yml:" msgstr "Nyní nastavte následující v config.yml:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1381,19 +1304,17 @@ msgstr "Jedné z položek konfigurace „github_releases“ chybí hodnota „pr msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "Jedné z položek konfigurace „github_releases“ chybí hodnota „token“. Přeskakuji ..." +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Pro grafiku jsou podporovány pouze formáty PNG a JPEG, nalezeno: {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "Přijímá pouze jediný klíč „env“" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Zobrazit pouze rozdíly s Obchodem Play" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Zpracovat pouze aplikace s automatickými aktualizacemi" @@ -1402,10 +1323,6 @@ msgstr "Zpracovat pouze aplikace s automatickými aktualizacemi" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Darovací metody OpenCollective patří do pole „OpenCollective:“" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Možnosti" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Uložit hlášení JSON do souboru pojmenovaného podle APK." @@ -1571,14 +1488,6 @@ msgstr "Odebírání {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Přejmenovat soubory APK, které se neshodují s package.name_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "Režim aktualizace RepoTrunk má smysl pouze v repozitářích git-svn" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Resetovat a vytvořit zcela nový server sestavení, i když se stávající zdá být v pořádku." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1887,11 +1796,6 @@ msgstr "Neočekávaná licenční značka „{}“! Používejte pouze značky s msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Neočekávaná licenční značka „{}“! Používejte pouze licenční značky nakonfigurované v konfiguračním souboru" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "Neočekávaný cíl symlinku: {link} -> {target}" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1901,7 +1805,6 @@ msgstr "Neznámá položka {key} in {configname}" msgid "Unknown exception found!" msgstr "Došlo k neznámé chybě!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1939,6 +1842,7 @@ msgstr "Nerozpoznané pole aplikace „{fieldname}“ v „{path}“" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Nerozpoznaný příznak sestavení „{build_flag}“ v „{path}“" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1969,11 +1873,6 @@ msgstr "Nepoužitá cesta scandelete: %s" msgid "Unused scanignore path: %s" msgstr "Nepoužitá cesta scanignore: %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "Rozbalování do %s" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Aktualizovat informace o repozitáři pro nové balíčky" @@ -1987,6 +1886,7 @@ msgstr "Aktualizovat protokol binární transparentnosti pro URL" msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData má neplatnou URL: {url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -2006,11 +1906,7 @@ msgstr "UpdateCheckData není platná URL: {url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode je nastaven, ale vypadá to, že akce checkupdates ještě nebyla spuštěna." -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode je nastaven, ale vypadá to, že akce checkupdates zatím nebyla spuštěna" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName je nastaveno na známé ID aplikace, lze jej odstranit" @@ -2025,27 +1921,10 @@ msgstr "Nahrávání {apkfilename} na androidobservatory.org" msgid "Uploading {apkfilename} to virustotal" msgstr "Nahrávání {apkfilename} na VirusTotal" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Použití" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Použití: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "Použijte /HEAD namísto /master nebo /main k ukázání na soubor ve výchozí větvi" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Použijte /HEAD místo /master k ukázání na soubor ve výchozí větvi" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "K vytvoření použijte `fdroid update -c`." @@ -2084,11 +1963,6 @@ msgstr "Používám JAR Signature" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Používám jarsigner Javy, není doporučeno pro ověřování APK! Použijte apksigner" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "Používám androguard z „{path}“" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2190,20 +2064,11 @@ msgstr "přidávám IdentityFile do {path}" msgid "adding to {name}: {path}" msgstr "přidávání do {name}: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "nejednoznačná možnost: %(option)s by mohlo odpovídat %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "nejednoznačná možnost: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2217,11 +2082,13 @@ msgstr "apksigner nenalezen! Nelze podepsat nebo ověřit moderní APK" msgid "apksigner not found, it's required for signing!" msgstr "apksigner nenalezen, je vyžadován k podepisování!" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "ID aplikace nebo soubor, se kterým se má pracovat" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2232,8 +2099,6 @@ msgstr "ID aplikace s nepovinným kódem verze ve tvaru APPID[:VERCODE]" msgid "archive_url needs to end with /archive" msgstr "archive_url musí končit na /archive" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2252,7 +2117,7 @@ msgstr "pokus o holé připojení SSH k testování klíče pro nasazení:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "nelze zpracovat specifikaci scrlib (není to řetězec): „{}“" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "nelze otevřít „%(filename)s“: %(error)s" @@ -2266,14 +2131,10 @@ msgstr "nelze otevřít non-https url: '{};" msgid "cannot find required srclibs: \"{path}\"" msgstr "nelze najít požadované srclibs: „{path}“" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "nelze mít více argumentů subparseru" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2292,14 +2153,6 @@ msgstr "klonování {url}" msgid "commands from plugin modules:" msgstr "příkazy z modulů pluginů:" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "komplexní" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2331,10 +2184,6 @@ msgstr "nepodařilo se parsovat srclib spec (není určen název): „{}“" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "nepodařilo se parsovat srclib spec (není určen ref): „{}“" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "nepodařilo se parsovat srclib spec (příliš mnoho značek „@“): „{}“" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2359,8 +2208,6 @@ msgstr "soubor závislostí bez zámku" msgid "deployed process log {path} to {dest}" msgstr "protokol procesu {path} nasazen do {dest}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2378,8 +2225,6 @@ msgstr "stahování podpisů skeneru z „{}“ se nezdařilo" msgid "executable binary, possibly code" msgstr "spustitelná binárka, případně kód" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2388,20 +2233,14 @@ msgstr[0] "očekáván %s argument" msgstr[1] "očekávány %s argumenty" msgstr[2] "očekáváno %s argumentů" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "očekáván alespoň jeden argument" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "očekáván maximálně jeden argument" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "očekáván jeden argument" @@ -2414,10 +2253,6 @@ msgstr "fdroid [] [-h|--help|--version|]" msgid "fetch the latest version of signatures from the web" msgstr "stáhnout nejnovější verzi podpisů z webu" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "floating-point" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "vynutit, aby chyby metadat (výchozí) byly varování nebo byly ignorovány." @@ -2430,8 +2265,6 @@ msgstr "git svn clone selhalo" msgid "gzip file archive" msgstr "archiv souborů gzip" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2445,35 +2278,21 @@ msgstr "index-v1 musí mít podpis, použijte `fdroid signindex` pro jeho vytvo msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 musí mít podpis, použijte `fdroid signindex` pro jeho vytvoření!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "celé číslo" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "neplatná hodnota %(type)s: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "neplatná volba: %(value)r (vyberte si z %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "neplatná hodnota conflict_resolution: %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2511,8 +2330,6 @@ msgstr "mirror „%s“ nekončí s „fdroid“!" msgid "mirrors set twice, in config.yml and {path}!" msgstr "zrcadla nastavena dvakrát, v config.yml a {path}!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "společně exkluzivní argumenty musí být volitelné" @@ -2531,30 +2348,15 @@ msgstr "žádná „icon“ v {appid}" msgid "no APK supplied" msgstr "neposkytnuto APK" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "žádná taková možnost: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "nenalezeno info o verzi!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "nenalezeny informace o verzi" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "není povoleno s argumentem %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2564,72 +2366,6 @@ msgstr "jeden z argumentů %s je vyžadován" msgid "only accepts strings, lists, and tuples" msgstr "přijímá pouze řetězce, seznamy a tuply" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "možnost %s: pokud opravdu chcete nainstalovat všechny podepsané aplikace, použijte --all" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "možnost %s: neplatná hodnota %s: %r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "možnost %s: neplatná volba: %r (vyberte si z %s)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "možnost -%s není rozpoznána" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "možnost -%s vyžaduje argument" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "možnost --%s nesmí mít argument" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "možnost --%s není jedinečným prefixem" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "možnost --%s není rozpoznána" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "možnost --%s vyžaduje argument" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "volitelné argumenty" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "možnosti" @@ -2639,8 +2375,6 @@ msgstr "možnosti" msgid "overwriting existing {path}" msgstr "přepisování existující {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "poziční argumenty" @@ -2673,10 +2407,6 @@ msgstr "repo_url musí končit na /repo" msgid "rsync is missing or broken: {error}" msgstr "rsync chybí nebo je rozbitý: {error}" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "ruamel.yaml není nainstalován, nelze zapisovat metadata." - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2700,17 +2430,7 @@ msgstr "serverwebroot: cesta nekončí s „fdroid“, možná jste mysleli jedn msgid "shared library" msgstr "sdílená knihovna" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "zobrazit číslo verze programu a ukončit" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "zobrazí tuto nápovědu a ukončí program" @@ -2744,8 +2464,6 @@ msgstr "statická knihovna" msgid "supplied reference binary has allowed signer {signer}" msgstr "dodaný referenční binární soubor umožnil podepisujícího {signer}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2755,22 +2473,16 @@ msgstr "jsou vyžadovány následující argumenty: %s" msgid "true" msgstr "pravda" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "neočekávaný řetězec možností: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "neznámý parser %(parser_name)r (volby: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2781,9 +2493,7 @@ msgstr "nerozpoznané argumenty: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "nebezpečné oprávnění u „{config_file}“ (má být 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "použití: " @@ -2813,21 +2523,19 @@ msgstr[2] "{0} aplikací, {1} aliasů klíčů" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) nemá žádná metadata!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} má několik souborů {name}, vypadá to na exploit Master Key!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "AndroidManifest.xml aplikace {apkfilename} má špatné datum: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} nemá název! Používám ID aplikace." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2848,7 +2556,6 @@ msgstr "{appid} má APK i soubory: {files}" msgid "{appid} is missing {name}" msgstr "{appid} chybí {name}" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2889,11 +2596,6 @@ msgstr "{file} je prázdný nebo poškozený!" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} „{section}/icons/{path}“ neexistuje! Zkontrolujte „config.yml“." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile} je zastaralý, použijte {newfile}" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/cy/LC_MESSAGES/fdroidserver.po b/locale/cy/LC_MESSAGES/fdroidserver.po index e97b9280..d04b3fdc 100644 --- a/locale/cy/LC_MESSAGES/fdroidserver.po +++ b/locale/cy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2021-01-16 21:23+0000\n" "Last-Translator: Aled Powell \n" "Language-Team: Welsh \n" @@ -48,11 +48,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -78,21 +73,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" -msgstr[5] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -108,14 +88,6 @@ msgstr "" msgid "%d problems found" msgstr "canfuwyd %d problem" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -136,13 +108,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "" @@ -163,8 +128,6 @@ msgstr "" msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -178,11 +141,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -193,7 +151,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -212,8 +170,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr "" @@ -304,10 +260,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -351,7 +303,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -411,11 +362,13 @@ msgstr[5] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -468,20 +421,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -501,6 +451,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -594,11 +545,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -655,11 +601,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -693,12 +634,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -843,10 +778,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -878,7 +809,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -943,15 +873,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1086,16 +1014,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1306,7 +1230,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1341,7 +1264,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1371,19 +1293,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1392,10 +1312,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Dewisiadau" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1561,14 +1477,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Ailenwi ffeiliau APK na sy'n dilyn y ffurf package.name_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1880,11 +1788,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1894,7 +1797,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1932,6 +1834,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1962,11 +1865,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Diweddaru gwybodaeth ystorfa am becynnau newydd" @@ -1980,6 +1878,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1999,11 +1898,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2018,27 +1913,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Defndd: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2077,11 +1955,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2183,20 +2056,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "dewis amwys: gall %(option)s gydweddu â %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "dewis amwys: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2210,11 +2074,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2225,8 +2091,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2245,7 +2109,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "methu agor '%(filename)s': %(error)s" @@ -2259,14 +2123,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2285,14 +2145,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2327,10 +2179,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2355,8 +2203,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2374,8 +2220,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2387,20 +2231,14 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2413,10 +2251,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2429,8 +2263,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2444,35 +2276,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2510,8 +2328,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2530,30 +2346,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "dim dewis o'r fath: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2563,72 +2364,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "dewis -%s heb ei adnabod" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "dewis -%s angen ymresymiad" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "dewis --%s heb ei adnabod" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "ymresymiadau dewisol" - #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" @@ -2639,8 +2374,6 @@ msgstr "Dewisiadau" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "" @@ -2673,10 +2406,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2700,17 +2429,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "dangos rhif fersiwn y rhaglen a gadael" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "dangos y neges cymorth hon a gadael" @@ -2744,8 +2463,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2755,22 +2472,16 @@ msgstr "" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2781,9 +2492,7 @@ msgstr "" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "defnydd: " @@ -2816,21 +2525,19 @@ msgstr[5] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2851,7 +2558,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2892,11 +2598,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 8f05f944..041fd2ca 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -26,7 +26,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2025-03-21 08:45+0000\n" "Last-Translator: VfBFan \n" "Language-Team: German \n" @@ -73,11 +73,6 @@ msgstr "\"local_copy_dir\" {path}\" existiert nicht!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" ist bereits auf {dev} installiert." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "{name} ({version}) in „{path}” veraltet" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -103,17 +98,6 @@ msgstr "\"{path}” ist mit einem nicht zulässigen Schlüssel signiert:" msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" ist keine gültige URL!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "Option %(option)s benötigt %(number)d Argument" -msgstr[1] "Option %(option)s benötigt %(number)d Argumente" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -129,14 +113,6 @@ msgstr "%d APKs konnten nicht signiert oder verifiziert werden!" msgid "%d problems found" msgstr "%d Probleme gefunden" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [Optionen]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -157,13 +133,6 @@ msgstr "%s hat schlechtes SHA-256: %s" msgid "%s is not an accepted build field" msgstr "%s ist kein zulässiges Build-Feld" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "Option %s verfügt über keinen Wert" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' nicht in config.yml vorhanden!" @@ -184,8 +153,6 @@ msgstr "'keystorepass' nicht in config.yml vorhanden!" msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' nicht in config.yml vorhanden!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' ist ein ungültiges Argument für Positionsangaben" @@ -199,11 +166,6 @@ msgstr "Kein 'sdk_path' in 'config.yml' festgelegt!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' ist veraltet, fdroid benötigt build-tools-{version} oder neuer!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "Das Feld '{field}' wird in zufälliger Reihenfolge angezeigt! Verwenden Sie runde ( ) oder eckige [ ] Klammern, wenn die Reihenfolge wichtig ist!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -214,7 +176,7 @@ msgstr "'{path}' konnte nicht ausgeführt werden!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' in ungültigem Format, sollte ein Wörterbuch sein!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' ist kein gültiges {field} in {appid}. Regex-Muster: {pattern}" @@ -233,8 +195,6 @@ msgstr "--merge-request läuft nur auf einer einzigen App-ID!" msgid "...checkupdate failed for {appid} : {error}" msgstr "… checkupdate für {appid} fehlgeschlagen: {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() nicht festgelegt" @@ -325,10 +285,6 @@ msgstr "Android-SDK-Tool {cmd} nicht gefunden!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "App besitzt Binärdateien aber keine entsprechenden AllowedAPKSigningKeys, um Zertifikat zu verankern." -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "App hat NoSourceSince oder ArchivePolicy \"0 Versionen\", aber AutoUpdateMode oder UpdateCheckMode sind nicht None" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "App hat NoSourceSince oder ArchivePolicy \"0 versions\" oder 0, aber AutoUpdateMode oder UpdateCheckMode sind nicht None" @@ -372,7 +328,6 @@ msgstr "Falscher Typeneintrag \"{mirrortype}\" in Spiegelserver-Konfiguration vo msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Basis-URL zum Spiegeln, kann den Index-Signierungsschlüssel mit Hilfe des Abfrage-Strings enthalten: ?fingerprint=" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -428,11 +383,13 @@ msgstr[1] "Kann nicht erstellt werden, da {} Fehler beim Prüfen aufgetreten sin msgid "Cannot rewrite \"{path}\"" msgstr "\"{path}\" konnte nicht überschrieben werden" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Kategorie '%s' ist nicht gültig" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Keine Kategorien festgelegt" @@ -485,20 +442,17 @@ msgstr "Widersprüchliche \"{field}\"-Definitionen in .yml- bzw. übersetzten Da msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Widersprüchliche Argumente: '--verbose' und '--quiet' können nicht gleichzeitig angegeben werden." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Konflikt in der Konfiguration. Verwende {newfile}, ignoriere {oldfile}!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "'{command}' konnte auf Ihrem System nicht gefunden werden" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Neuester Versionscode konnte nicht gefunden werden" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Neuester Versionsname konnte nicht gefunden werden" @@ -518,6 +472,7 @@ msgstr "Konnte APK-Datei {path} nicht für Analyse öffnen " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Konnte Größe \"{size}\" nicht parsen, falscher Typ \"{type}\"" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Konnte Anwendungs-ID nicht finden" @@ -611,11 +566,6 @@ msgstr "Die Beschreibung '%s' ist nur die Zusammenfassung der App" msgid "Description has a duplicate line" msgstr "Beschreibung enthält eine doppelte Zeile" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "Beschreibung enthält eine Liste (%s), ist aber weder aufgezählt (*) noch nummeriert (#)" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -672,11 +622,6 @@ msgstr "F-Droid.apk über Spiegelserver herunterladen, die weniger Datenlecks in msgid "Download complete mirrors of small repos" msgstr "Komplette Spiegel von kleinen Paketquellen herunterladen" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "Herunterladen %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Herunterladen des Repositorys bereits einmal fehlgeschlagen, versuche es nicht nochmal." @@ -710,14 +655,6 @@ msgstr "FEHLER: %(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "FEHLER: Der \"server\"-Unterbefehl wurde entfernt, verwende \"deploy\"!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"FEHLER: Dieser Befehl sollte niemals verwendet werden, um f-droid.org zu spiegeln!\n" -"Ein vollständiger Spiegel von f-droid.org erfordert mehr als 200 GB." - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "FEHLER: nicht unterstützter CI-Typ, Patches willkommen!" @@ -864,10 +801,6 @@ msgstr "Datei verschwand während der Verarbeitung: {path}" msgid "Finished" msgstr "Fertiggestellt" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Flattr-Spendenmethoden gehören in das FlattrID-Feld" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Verbotene HTML-Befehle" @@ -899,7 +832,6 @@ msgstr "Schlechte Finanzierungsdatei \"{path}\" für \"{name}\" gefunden:" msgid "Found invalid appids in arguments" msgstr "Ungültige App-IDs in Argumenten gefunden" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Ungültige versionCodes für einige Apps gefunden" @@ -964,15 +896,13 @@ msgstr "Git clean fehlgeschlagen" msgid "Git fetch failed" msgstr "Git fetch fehlgeschlagen" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "Git prune fehlgeschlagen" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git remote set-head fehlgeschlagen: \"%s\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Git reset fehlgeschlagen" @@ -1107,16 +1037,12 @@ msgstr "Ungültige VercodeOperation: {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "Ungültige VercodeOperation: {invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "Ungültige Anwendungs-ID {appid}" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "Ungültiger boolescher Wert '%s'" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Ungültige Aufzählung" @@ -1327,7 +1253,6 @@ msgstr "Keine Signaturzertifikate in {path} gefunden" msgid "No such package: %s" msgstr "Kein solches Paket: %s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1362,7 +1287,6 @@ msgstr "Keine zu erledigenden Aufgaben für {appid}." msgid "Now set these in config.yml:" msgstr "Legen Sie diese nun in der config.yml fest:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1392,19 +1316,17 @@ msgstr "Einem der Konfigurationselemente von 'github_releases' fehlt der Wert 'p msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "Einem der Konfigurationselemente von 'github_releases' fehlt der Wert 'token'. Überspringe …" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Nur PNG und JPEG werden für Grafiken unterstützt, gefunden wurde: {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "Nur ein einziger Schlüssel \"env\" wird akzeptiert" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Nur Unterschiede zum Play Store ausgeben" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Nur Apps mit automatischen Aktualisierungen verarbeiten" @@ -1413,10 +1335,6 @@ msgstr "Nur Apps mit automatischen Aktualisierungen verarbeiten" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "OpenCollective-Spendenmethoden gehören in das OpenCollective: Feld" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Optionen" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "JSON-Bericht in eine nach der APK benannte Datei ausgeben." @@ -1582,14 +1500,6 @@ msgstr "Entferne {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "APK-Dateien umbenennen, die nicht dem Muster „package.name_123.apk“ entsprechen" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "Der RepoTrunk-Aktualisierungsmodus ist nur bei git-svn-Paketquellen sinnvoll" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Zurücksetzen und ganz neuen Buildserver einrichten, auch wenn der bestehende in Ordnung zu sein scheint." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1897,11 +1807,6 @@ msgstr "Ungültiges Lizenz-Tag \"{}\"! Verwenden Sie nur Kennzeichen von https:/ msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Unerwartetes Lizenz-Tag \"{}\"! Nur Lizenz-Tags verwenden, die in deiner config-Datei eingerichtet sind" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "Unerwartetes Symlink-Ziel: {link} -> {target}" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1911,7 +1816,6 @@ msgstr "Unbekannter Eintrag {key} in {configname}" msgid "Unknown exception found!" msgstr "Unbekannter Fehler aufgetreten!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1949,6 +1853,7 @@ msgstr "Nicht erkanntes App-Feld '{fieldname}' in '{path}'" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Nicht erkanntes Build-Flag '{build_flag}' in '{path}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1979,11 +1884,6 @@ msgstr "Nicht verwendeter „scandelete“-Pfad: %s" msgid "Unused scanignore path: %s" msgstr "Nicht verwendeter „scanignore“-Pfad: %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "Entpacke nach %s" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Paketquelleninformationen zu neuen Programmpaketen aktualisieren" @@ -1997,6 +1897,7 @@ msgstr "Binäres Transparency-Log einer URL aktualisieren" msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData hat eine ungültige URL: {url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -2016,11 +1917,7 @@ msgstr "UpdateCheckData hat eine ungültige URL: {url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode ist gesetzt, aber likecheckupdates wurde vermutlich noch nicht ausgeführt." -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode ist gesetzt, aber likecheckupdates wurde anscheinend noch nicht ausgeführt" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName ist auf eine bekannte App-ID gesetzt, sie kann entfernt werden" @@ -2035,27 +1932,10 @@ msgstr "Lade {apkfilename} auf androidobservatory.org hoch" msgid "Uploading {apkfilename} to virustotal" msgstr "Lade {apkfilename} auf VirusTotal hoch" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Syntax" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Syntax: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "Verwende /HEAD anstelle von /master oder /main, um auf eine Datei im Hauptzweig zu verweisen" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Verwende /HEAD anstelle von /master, um auf eine Datei im Hauptzweig zu verweisen" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Verwende `fdroid update -c` zum Erstellen." @@ -2094,11 +1974,6 @@ msgstr "Verwende JAR Signatur" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Von Java jarsigner zur Verifikation von APKs wird abgeraten! Verwenden Sie apksigner" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "Verwende Androguard von \"{path}\"" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2200,20 +2075,11 @@ msgstr "IdentityFile zu {path} hinzufügen" msgid "adding to {name}: {path}" msgstr "Hinzufügen zu {name}: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "Mehrdeutige Option: %(option)s könnte übereinstimmen mit %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "Mehrdeutige Option: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2227,11 +2093,13 @@ msgstr "apksigner nicht gefunden! Moderne APKs können nicht signiert oder verif msgid "apksigner not found, it's required for signing!" msgstr "apksigner nicht gefunden, er wird zum Signieren benötigt!" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "App-ID der Datei, die bearbeitet werden soll" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2242,8 +2110,6 @@ msgstr "App-ID mit fakultativem Versionscode in der Form APPID[:VERCODE]" msgid "archive_url needs to end with /archive" msgstr "archive_url muss mit /archive enden" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2262,7 +2128,7 @@ msgstr "Versuch einer reinen SSH-Verbindung, um den Deployment-Key zu testen:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "kann scrlib-Spezifikation nicht parsen (keine Zeichenkette): '{}'" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "'%(filename)s' kann nicht geöffnet werden: %(error)s" @@ -2276,14 +2142,10 @@ msgstr "Nicht-HTTPS-URL kann nicht geöffnet werden: '{};" msgid "cannot find required srclibs: \"{path}\"" msgstr "Konnte die benötigten srclibs nicht finden: \"{path}\"" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "Mehrere Subparser-Argumente sind unzulässig" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2302,14 +2164,6 @@ msgstr "Klone {url}" msgid "commands from plugin modules:" msgstr "Befehle aus den PlugIn-Modulen:" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "komplex" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2340,10 +2194,6 @@ msgstr "konnte srclib-Spezifikation nicht parsen (kein Name angegeben): '{}'" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "konnte srclib-Spezifikation nicht parsen (keine ref angegeben): '{}'" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "konnte srclib-Spezifikation nicht parsen (zu viele '@'-Zeichen): '{}'" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2368,8 +2218,6 @@ msgstr "Abhängigkeitsdatei ohne Sperre" msgid "deployed process log {path} to {dest}" msgstr "Verarbeitungsprotokoll {path} unter {dest} bereitgestellt" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2387,8 +2235,6 @@ msgstr "Herunterladen der Scanner-Signaturen von '{}' fehlgeschlagen" msgid "executable binary, possibly code" msgstr "ausführbare Binärdatei, vermutlich Code" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2396,20 +2242,14 @@ msgid_plural "expected %s arguments" msgstr[0] "%s Argument erwartet" msgstr[1] "%s Argumente erwartet" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "mindestens ein Argument erwartet" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "höchstens ein Argument erwartet" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "ein Argument erwartet" @@ -2422,10 +2262,6 @@ msgstr "fdroid [] [-h|--help|--version|]" msgid "fetch the latest version of signatures from the web" msgstr "Abrufen der neuesten Version von Signaturen aus dem Web" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "Gleitkomma" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "Erzwingen, dass Metadatenfehler (Standard) als Warnung ausgegeben oder ignoriert werden." @@ -2438,8 +2274,6 @@ msgstr "git svn Klonen fehlgeschlagen" msgid "gzip file archive" msgstr "gzip Dateiarchiv" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2453,35 +2287,21 @@ msgstr "index-v1 muß eine Signatur haben, verwenden Sie `fdroid signindex` um s msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 muss eine Signatur haben, verwenden Sie `fdroid signindex`, um sie zu erstellen!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "Ganzzahl" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "Ungültige(r) %(type)s mit Wert: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "Ungültige Auswahl: %(value)r (Wählen Sie aus %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "Ungültiger conflict_resolution-Wert: %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2519,8 +2339,6 @@ msgstr "Spiegelserver '%s' ended nicht mit 'fdroid'!" msgid "mirrors set twice, in config.yml and {path}!" msgstr "Spiegelserver zweimal gesetzt, in config.yml und {path}!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "sich gegenseitig ausschließende Argumente müssen optional sein" @@ -2539,30 +2357,15 @@ msgstr "kein \"icon\" in {appid}" msgid "no APK supplied" msgstr "kein APK bereitgestellt" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "keine solche Option: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "keine Versionsinformation gefunden!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "keine Versionsinformation gefunden" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "unzulässig mit Argument %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2572,72 +2375,6 @@ msgstr "eines der Argumente %s ist erforderlich" msgid "only accepts strings, lists, and tuples" msgstr "akzeptiert nur Zeichenketten, Listen und Tupel" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "Option %s: Wenn Sie wirklich alle signierten Apps installieren wollen, verwenden Sie --all" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "Option %s: ungültiger %s Wert: %r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "Option %s: ungültige Wahl: %r (wählen Sie aus %s)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "Option -%s nicht erkannt" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "Option -%s erfordert Argument" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "Option --%s darf kein Argument haben" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "option --%s ist kein eindeutiges Präfix" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "Option --%s nicht erkannt" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "Option --%s erfordert Argument" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "optionale Argumente" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "Optionen" @@ -2647,8 +2384,6 @@ msgstr "Optionen" msgid "overwriting existing {path}" msgstr "überschreiben des vorhandenen {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "Positionsparameter" @@ -2681,10 +2416,6 @@ msgstr "repo_url muss mit /repo enden" msgid "rsync is missing or broken: {error}" msgstr "rsync fehlt oder ist kaputt: {error}" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "ruamel.yaml ist nicht installiert, kann Metadaten nicht schreiben." - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2708,17 +2439,7 @@ msgstr "serverwebroot: Der Pfad endet nicht mit \"fdroid\", vielleicht meinten S msgid "shared library" msgstr "dynamische Bibliothek" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "Versionsnummer der Anwendung anzeigen und beenden" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "diese Hilfemeldung anzeigen und beenden" @@ -2752,8 +2473,6 @@ msgstr "statische Bibliothek" msgid "supplied reference binary has allowed signer {signer}" msgstr "Angewandte Referenz-Binary erlaubt Signer {signer}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2763,22 +2482,16 @@ msgstr "die folgenden Argumente sind erforderlich: %s" msgid "true" msgstr "wahr" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "Unerwartete Optionsverkettung: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "Unbekannter Parser %(parser_name)r (Auswahl: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2789,9 +2502,7 @@ msgstr "nicht erkannte Argumente: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "Unsichere Berechtigungen in „{config_file}” (sollte 0600 sein)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "Syntax: " @@ -2820,21 +2531,19 @@ msgstr[1] "{0} apps, {1} Schlüsselaliase" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) besitzt keine Metadaten!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} hat mehrere {name} Dateien, sieht aus wie Master Key Exploit!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "Die AndroidManifest.xml der App „{apkfilename}” hat ein ungültiges Datum: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} besitzt keinen Namen! Die Anwendungs-ID wird stattdessen verwendet." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2855,7 +2564,6 @@ msgstr "{appid} hat sowohl APKs als auch Dateien: {files}" msgid "{appid} is missing {name}" msgstr "{appid} fehlt {name}" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2896,11 +2604,6 @@ msgstr "{file} ist leer oder beschädigt!" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" existiert nicht! Überprüfe \"config.yml\"." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile} ist veraltet, verwenden Sie {newfile}" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index c74b5621..bb8bd090 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2024-05-10 13:24+0000\n" "Last-Translator: ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ \n" "Language-Team: Greek \n" @@ -55,11 +55,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "Το \"{apkfilename}\" είναι ήδη εγκατεστημένο στο {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "Το \"{path}\" περιέχει ένα ξεπερασμένο {name} ({version})" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -85,17 +80,6 @@ msgstr "Το \"{path}\" έχει υπογραφή από ένα κλειδί π msgid "\"{url}\" is not a valid URL!" msgstr "Το \"{url}\" δεν είναι έγκυρο URL!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "Η επιλογή %(option)s απαιτεί %(number)d όρισμα" -msgstr[1] "Η επιλογή %(option)s απαιτεί %(number)d ορίσματα" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -111,14 +95,6 @@ msgstr "" msgid "%d problems found" msgstr "%d προβλήματα εντοπίστηκαν" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [επιλογές]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -139,13 +115,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "Το %s δεν είναι αποδεκτό πεδίο δόμησης" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "Η επιλογή %s δεν λαμβάνει τιμή" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "Το «keypass» δεν βρέθηκε στο config.yml!" @@ -166,8 +135,6 @@ msgstr "Το 'keystorepass' δεν βρέθηκε στο config.yml!" msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -181,11 +148,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -196,7 +158,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -215,8 +177,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ". __call__ () δεν έχει οριστεί" @@ -307,10 +267,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -354,7 +310,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -410,11 +365,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -467,20 +424,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -500,6 +454,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -593,11 +548,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -654,11 +604,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -692,12 +637,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -842,10 +781,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -877,7 +812,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -942,15 +876,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1085,16 +1017,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1305,7 +1233,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1340,7 +1267,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1370,19 +1296,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1391,10 +1315,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Επιλογές" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1560,14 +1480,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Μετονομασία αρχείων APK που δεν αντιστοιχούν με «όνομα.πακέτου_123.apk»" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1868,11 +1780,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1882,7 +1789,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "Βρέθηκε άγνωστη εξαίρεση!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1920,6 +1826,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1950,11 +1857,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Ενημέρωση πληροφοριών αποθετηρίου για νέα πακέτα" @@ -1968,6 +1870,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1987,11 +1890,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2006,27 +1905,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Χρήση" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Χρήση: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2065,11 +1947,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2171,20 +2048,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "Ασαφής επιλογή: %(option)s θα μπορούσε να ταιριάζει με %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "ασαφής επιλογή: %s (%s;)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2198,11 +2066,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2213,8 +2083,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2233,7 +2101,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "δεν είναι δυνατό το άνοιγμα του '%(filename)s': %(error)s" @@ -2247,14 +2115,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2273,14 +2137,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "Σύμπλεγμα" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2311,10 +2167,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2339,8 +2191,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2358,8 +2208,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2367,20 +2215,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2393,10 +2235,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2409,8 +2247,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2424,35 +2260,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2490,8 +2312,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2510,30 +2330,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "δεν υπάρχει τέτοια επιλογή: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2543,72 +2348,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "επιλογή -%s δεν αναγνωρίζεται" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "η επιλογή -%s απαιτεί επιχείρημα" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "η επιλογή --%s δεν πρέπει να έχει όρισμα" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "η επιλογή --%s δεν είναι ένα μοναδικό πρόθεμα" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "η επιλογή --%s δεν αναγνωρίζεται" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "η επιλογή --%s απαιτεί όρισμα" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "προεραιτικά επιχειρήματα" - #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" @@ -2619,8 +2358,6 @@ msgstr "Επιλογές" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "" @@ -2653,10 +2390,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2680,17 +2413,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "εμφάνιση έκδοσης του προγράμματος κι έξοδος" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "εμφάνιση αυτού του βοηθητικού μηνύματος κι έξοδος" @@ -2724,8 +2447,6 @@ msgstr "στατική βιβλιοθήκη" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2735,22 +2456,16 @@ msgstr "Απαιτούνται τα ακόλουθα ορίσματα: %s" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "άγνωστος συντακτικός αναλυτής %(parser_name)r (επιλογές: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2761,9 +2476,7 @@ msgstr "μη αναγνωρίσιμα ορίσματα: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "μη ασφαλή δικαιώματα στο '{config_file}' (πρέπει να είναι 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "χρήση: " @@ -2792,21 +2505,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2827,7 +2538,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2868,11 +2578,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 10e1aa35..0c909b22 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2025-03-16 22:47+0000\n" "Last-Translator: Nicolás Pérez \n" "Language-Team: Spanish \n" @@ -65,11 +65,6 @@ msgstr "¡El directorio raíz para local_copy_dir \"{path}\" no existe!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" ya está instalado en {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" contiene {name} ({version}) caducado" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -95,17 +90,6 @@ msgstr "\"{path}\" está firmado por una clave no permitida:" msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" no es una URL válida!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "la opción %(option)s requiere %(number)d argumento" -msgstr[1] "la opción %(option)s requiere %(number)d argumentos" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -121,14 +105,6 @@ msgstr "¡%d APKs fallaron al ser firmados o verificados!" msgid "%d problems found" msgstr "%d problemas encontrados" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [opciones]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -149,13 +125,6 @@ msgstr "%s tienes mal un SHA-256: %s" msgid "%s is not an accepted build field" msgstr "%s no es un campo de construcción aceptado" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "la opción %s no toma un valor" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "¡'keypass' no encontrado en config.yml!" @@ -176,8 +145,6 @@ msgstr "¡'keystorepass' no encontrado en config.yml!" msgid "'repo_keyalias' not found in config.yml!" msgstr "¡'repo_keyalias' no encontrado en config.yml!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' es un argumento inválido para posicionales" @@ -191,11 +158,6 @@ msgstr "¡'sdk_path' no establecido en 'config.yml'!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "¡'{aapt}' es demasiado antiguo, fdroid requiere build-tools-{version} o posterior!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "¡'{field}' estará en un orden aleatorio! ¡Use paréntesis () o [] si el orden es importante!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -206,7 +168,7 @@ msgstr "¡Falló la ejecución de '{path}'!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' tiene un formato inválido, ¡debería ser un diccionario!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' no es un {field} válido en {appid}. Patrón de expresión regular: {pattern}" @@ -225,8 +187,6 @@ msgstr "¡--merge-request solo se ejecuta en un único ID de aplicación!" msgid "...checkupdate failed for {appid} : {error}" msgstr "...falló la comprobación de actualizaciones para {appid} : {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() no definida" @@ -317,10 +277,6 @@ msgstr "¡No se encontró la herramienta {cmd} del SDK de Android!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "La aplicación tiene archivos binarios, pero no las AllowedAPKSigningKeys correspondientes para fijat el certificado." -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "La aplicación tiene NoSourceSince o ArchivePolicy \"0 versiones\", pero AutoUpdateMode o UpdateCheckMode no es Ninguno" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "La aplicación tiene NoSourceSince o ArchivePolicy \"versiones 0\" o 0, pero AutoUpdateMode o UpdateCheckMode no son Ninguna" @@ -364,7 +320,6 @@ msgstr "Tipo de entrada incorrecto \"{mirrortype}\" en la configuración de los msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL base para replicar, puede incluir la clave de firma del índice usando la cadena de consulta: ?fingerprint=" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -420,11 +375,13 @@ msgstr[1] "No se puede construir debido a los errores {} mientras se comprobaba" msgid "Cannot rewrite \"{path}\"" msgstr "No se puede reescribir \"{path}\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "La categoría '%s' no es válida" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "No se han establecido categorías" @@ -477,20 +434,17 @@ msgstr "Definiciones \"{field}\" contradictorias entre los archivos .yml y los a msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumentos incompatibles: No se puede especificar \"--verbose\" y \"--quiet\" a la vez." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Archivos de configuración en conflicto. ¡Usando {newfile}, ignorando {oldfile}!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "No se pudo encontrar '{command}' en el sistema" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "No se pudo encontrar el último código de versión" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "No se pudo encontrar el último nombre de versión" @@ -510,6 +464,7 @@ msgstr "No se pudo abrir el archivo APK {path} para analizarlo: " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "No se puede procesar el tamaño \"{size}\", tipo erróneo \"{type}\"" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "No se pudo encontrar el identificador de aplicación" @@ -603,11 +558,6 @@ msgstr "La descripción '%s' es simplemente el resumen de la aplicación" msgid "Description has a duplicate line" msgstr "La descripción contiene una línea duplicada" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "La descripción tiene una lista (%s) pero no está estructurada (*) ni numerada (#)" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -664,11 +614,6 @@ msgstr "Descarga F-Droid.apk usando espejos que filtren menos a la red" msgid "Download complete mirrors of small repos" msgstr "Descargar réplicas completas de repositorios pequeños" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "Descargando %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "La descarga del repositorio ya falló una vez, no se intentará de nuevo." @@ -702,14 +647,6 @@ msgstr "ERROR: %(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERROR: ¡El subcomando \"server\" se ha eliminado. Use \"deploy\"!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"ERROR: ¡esta orden no se debería usar nunca para replicar f-droid.org!\n" -"Una réplica completa de f-droid.org requiere más de 200GB." - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERROR: tipo de CI no soportado, ¡se aceptan parches!" @@ -856,10 +793,6 @@ msgstr "El archivo desapareció al procesarlo: {path}" msgid "Finished" msgstr "Terminado" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Los métodos de donación de Flattr pertenecen al FlattrID: field" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Etiquetas HTML prohibidas" @@ -891,7 +824,6 @@ msgstr "Se encontró archivo de financiación \"{path}\" para \"{name}\":" msgid "Found invalid appids in arguments" msgstr "Se encontraron identificadores de aplicaciones inválidos en los argumentos" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Se encontraron códigos de versión (versionCodes) inválidos para algunas aplicaciones" @@ -956,15 +888,13 @@ msgstr "Git clean falló" msgid "Git fetch failed" msgstr "Git fetch falló" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "Falló la extracción de Git" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git remote set-head falló: \"%s\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Git reset falló" @@ -1099,16 +1029,12 @@ msgstr "VercodeOperation no válida: {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "VercodeOperation no válido: {invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "ID de aplicación inválido {appid}" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "Valor booleano no válido '%s'" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Lista no numerada no válida" @@ -1319,7 +1245,6 @@ msgstr "No se ha encontrado ningún certificado de firma en {path}" msgid "No such package: %s" msgstr "No existe tal paquete: %s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1354,7 +1279,6 @@ msgstr "Nada que hacer para {appid}." msgid "Now set these in config.yml:" msgstr "Ahora establezca lo siguiente en config.yml:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1384,19 +1308,17 @@ msgstr "A uno de los elementos de configuración 'github_releases' le falta el v msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "A uno de los elementos de configuración 'github_releases' le falta el valor 'token'. Omitiendo ..." +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Sólo PNG y JPEG son compatibles con los gráficos, encontrados: {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Solo imprimir diferencias con el Play Store" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Solo procesar aplicaciones con actualizaciones automáticas" @@ -1405,10 +1327,6 @@ msgstr "Solo procesar aplicaciones con actualizaciones automáticas" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Los métodos de donación de OpenCollective pertenecen al OpenCollective: field" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Opciones" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Sacar el informe JSON a un fichero nombrado según el APK." @@ -1574,14 +1492,6 @@ msgstr "Eliminando {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Cambiar el nombre de archivos APK que no coinciden con el formato package.name_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "El modo de actualización RepoTrunk solo tiene sentido en repositorios git-svn" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Restablecer y crear un nuevo servidor de compilación, incluso si el existente parece estar bien." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1889,11 +1799,6 @@ msgstr "¡Etiqueta de licencia inesperada \"{}\"! Use solo etiquetas aprobadas p msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "¡Etiqueta de licencia inesperada \"{}\"! Use solo etiquetas de licencia configuradas en su archivo de configuración" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "Destino del enlace simbólico inesperado: {link} ->{target}" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1903,7 +1808,6 @@ msgstr "Entrada desconocida {key} en {configname}" msgid "Unknown exception found!" msgstr "¡Se encontró una excepción desconocida!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1941,6 +1845,7 @@ msgstr "Campo de app '{fieldname}' desconocido en '{path}'" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Flag de compilación '{build_flag}' desconocido en '{path}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1971,11 +1876,6 @@ msgstr "Ruta scandelete sin uso: %s" msgid "Unused scanignore path: %s" msgstr "Ruta scanignore sin uso: %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "Descomprimiendo a %s" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Actualizar la información del repositorio para nuevos paquetes" @@ -1989,6 +1889,7 @@ msgstr "Actualizar el registro de transparencia binario para una URL" msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData tiene una URL no válida: {url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -2008,11 +1909,7 @@ msgstr "UpdateCheckData tiene una URL no válida: {url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode está configurado pero parece que aún no se han ejecutado las actualizaciones." -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode está activado pero parece que aún no se ha ejecutado checkupdates" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName está configurado con el ID de la aplicación conocida, se puede eliminar" @@ -2027,27 +1924,10 @@ msgstr "Subiendo {apkfilename} a androidobservatory.org" msgid "Uploading {apkfilename} to virustotal" msgstr "Subiendo {apkfilename} a virustotal" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Utilización" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Uso: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "Utiliza /HEAD en lugar de /master o /main para apuntar a un archivo de la rama por defecto" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Use /HEAD en vez de /master para apuntar a un fichero en la rama por omisión" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Use `fdroid update -c` para crearlo." @@ -2086,11 +1966,6 @@ msgstr "Utilizar la firma JAR" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "¡Usando jarsigner de Java. No recomendado para verificar APKs! Use apksigner" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "Usando androguard de \"{path}\"" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2192,20 +2067,11 @@ msgstr "añadiendo IdentityFile a {path}" msgid "adding to {name}: {path}" msgstr "añadiendo a {name}: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opción ambigua: %(option)s podría corresponderse con %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "opción ambigua: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2219,11 +2085,13 @@ msgstr "¡No se encontró apksigner! No se pueden firmar o verificar los APKs mo msgid "apksigner not found, it's required for signing!" msgstr "¡Se requiere apksigner para firmar pero no se encontró!" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "identificador de aplicación del fichero en el que operar" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2234,8 +2102,6 @@ msgstr "identificador de aplicación con código de versión opcional en la form msgid "archive_url needs to end with /archive" msgstr "El archive_url debe terminar con /archive" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2254,7 +2120,7 @@ msgstr "intentando conexión SSH pura para probar la llave de despliegue:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "no se puede procesar (no es una cadena) la especificación scrlib: '{}'" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "no se puede abrir '%(filename)s': %(error)s" @@ -2268,14 +2134,10 @@ msgstr "no se puede abrir una url que no sea https: '{};" msgid "cannot find required srclibs: \"{path}\"" msgstr "no se encuentran las srclibs requeridas: \"{path}\"" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "no se puede tener varios argumentos de subparser" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2294,14 +2156,6 @@ msgstr "clonando {url}" msgid "commands from plugin modules:" msgstr "órdenes de módulos de extensión (plugins):" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "complejo" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2332,10 +2186,6 @@ msgstr "no se ha podido analizar la especificación srclib (no se ha especificad msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "no se pudo procesar especificación srclib (sin especificar ref): '{}'" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "no se pudo procesar especificación srclib (demasiadas arrobas '@'): '{}'" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2360,8 +2210,6 @@ msgstr "archivo de dependencia sin bloqueo" msgid "deployed process log {path} to {dest}" msgstr "registro de proceso {path} desplegado en '{dest}'" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2379,8 +2227,6 @@ msgstr "la descarga del escaneo de la firma para '{}' falló" msgid "executable binary, possibly code" msgstr "binario ejecutable, posiblemente código" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2388,20 +2234,14 @@ msgid_plural "expected %s arguments" msgstr[0] "argumento inesperado %s" msgstr[1] "argumentos inesperados %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "se esperaba al menos 1 argumento" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "no se esperaba más de 1 argumento" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "se esperaba 1 argumento" @@ -2414,10 +2254,6 @@ msgstr "fdroid [] [-h|--help|--version|]" msgid "fetch the latest version of signatures from the web" msgstr "obtener la última versión de las firmas de la web" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "punto flotante" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "forzar que los errores en metadatos sean avisos, o que se ignoren (valor predeterminado: errores)." @@ -2430,8 +2266,6 @@ msgstr "falló git svn clone" msgid "gzip file archive" msgstr "archivo de ficheros gzip" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2445,35 +2279,21 @@ msgstr "¡index-v1 tiene que tener una firma, use `fdroid signindex` para crearl msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 debe tener una firma, ¡ use `f droid signindex` para crearla!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "entero" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valor inválido de tipo %(type)s: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "opción no válida: %(value)r (escoja de entre %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valor para conflict_resolution no válido: %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2511,8 +2331,6 @@ msgstr "¡el espejo '%s' no termina en 'fdroid'!" msgid "mirrors set twice, in config.yml and {path}!" msgstr "¡espejos establecidos dos veces, en config.yml y {path}!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "los argumentos mutuamente exclusivos tienen que ser opcionales" @@ -2531,30 +2349,15 @@ msgstr "{appid} sin \"icono\"" msgid "no APK supplied" msgstr "no se ha indicado APK" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "no hay tal opción: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "¡no se encontró información de la versión!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "no se encontró información de la versión" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "no permitido con el argumento %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2564,72 +2367,6 @@ msgstr "se necesita 1 de los argumentos %s" msgid "only accepts strings, lists, and tuples" msgstr "solo acepta cadenas, listas, y tuplas" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "opción %s: Si de verdad quiere instalar todas las apps firmadas use --all" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "opción %s: valor de %s no válido: %r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "opción %s: selección no válida: %r (elija de entre %s)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "opción -%s no reconocida" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "opción -%s requiere un argumento" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "opción --%s no puede llevar argumento" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "opción --%s no es un prefijo único" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "opción --%s no reconocida" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "opción --%s requiere un argumento" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "argumentos opcionales" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "opciones" @@ -2639,8 +2376,6 @@ msgstr "opciones" msgid "overwriting existing {path}" msgstr "sobrescribiendo {path} existente" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "argumentos posicionales" @@ -2673,10 +2408,6 @@ msgstr "repo_url debe terminar con /repo" msgid "rsync is missing or broken: {error}" msgstr "rsync no existe o no funciona: {error}" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "ruamel.yaml no instalado. No se pueden escribir metadatos." - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2700,17 +2431,7 @@ msgstr "serverwebroot: la ruta no termina con \"fdroid\", tal vez se refería a msgid "shared library" msgstr "biblioteca compartida" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "mostrar el número de versión del programa y salir" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "mostrar este mensaje de ayuda y salir" @@ -2744,8 +2465,6 @@ msgstr "biblioteca estática" msgid "supplied reference binary has allowed signer {signer}" msgstr "el archivo binario de referencia ha proporcionado autorización al firmante {signer}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2755,22 +2474,16 @@ msgstr "se requieren los siguientes argumentos: %s" msgid "true" msgstr "verdadero" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "cadena de opción inesperada: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "parser '%(parser_name)r' desconocido. (Opciones válidas: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2781,9 +2494,7 @@ msgstr "argumentos no reconocidos: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "permisos inseguros en '{config_file}' (¡debería ser 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "uso: " @@ -2812,21 +2523,19 @@ msgstr[1] "{0} aplicaciones, {1} alias de clave" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "¡{apkfilename} ({appid}) no tiene metadatos!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "¡{apkfilename} tiene multiples ficheros {name}, parece un exploit de clave maestra!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "El AndroidManifest.xml de {apkfilename} tiene la fecha mal: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "¡{appid} no tiene nombre! Usando su identificador." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2847,7 +2556,6 @@ msgstr "{appid} tiene tanto APKs como archivos: {files}" msgid "{appid} is missing {name}" msgstr "{appid} no tiene {name}" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2888,11 +2596,6 @@ msgstr "¡{file} está vacío o corrupto!" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "¡{name} \"{section}/icons/{path}\" no existe! Corrijalo en config.yml." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile} está obsoleto, use {newfile}" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index 0877ff81..eccb5851 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2021-04-10 21:26+0000\n" "Last-Translator: Germe the fur star \n" "Language-Team: Spanish (Argentina) \n" @@ -53,11 +53,6 @@ msgstr "directorio_copia_local ¡tiene que ser una ruta absoluta!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -83,17 +78,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -109,14 +93,6 @@ msgstr "" msgid "%d problems found" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [opciones]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -137,13 +113,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "" @@ -164,8 +133,6 @@ msgstr "" msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -179,11 +146,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -194,7 +156,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -213,8 +175,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() no definida" @@ -308,10 +268,6 @@ msgstr "No se encontró Android SDK!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -355,7 +311,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -411,11 +366,13 @@ msgstr[1] "No se pudo empaquetar debido a los {} errores mientras se escaneaba" msgid "Cannot rewrite \"{path}\"" msgstr "No se puede reescribir \"{path}\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -468,21 +425,18 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Could not find latest version code" msgstr "Empaquetado con la ultima versión de cada paquete" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Could not find latest version name" @@ -503,6 +457,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Couldn't find Application ID" @@ -598,11 +553,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -659,11 +609,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -697,12 +642,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -847,10 +786,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -882,7 +817,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -947,15 +881,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1090,16 +1022,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1312,7 +1240,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1348,7 +1275,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1378,19 +1304,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Solo mostrar las diferencias con el Plays Store" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Solo procesar las aplicaciones que cuenten con actualizaciones automaticas" @@ -1399,10 +1323,6 @@ msgstr "Solo procesar las aplicaciones que cuenten con actualizaciones automatic msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Opciones" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1570,14 +1490,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Renombrar archivos APK que no corresponden a package.name_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Restablecer y crear un nuevo servidor de compilación, incluso si el existente parece estar bien." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1878,11 +1790,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1892,7 +1799,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "¡Se encontró una excepción desconocida!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1930,6 +1836,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1960,11 +1867,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Actualizar información del repositorio para paquetes nuevos" @@ -1978,6 +1880,7 @@ msgstr "Actualizar el registro de transparencia binario de un URL" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1997,11 +1900,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2016,27 +1915,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Uso" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Uso: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2075,11 +1957,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2182,20 +2059,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opción ambigua: %(option)s podría corresponderse con %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "opción ambigua: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2209,12 +2077,14 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py #, fuzzy msgid "application ID of file to operate on" msgstr "app-id para verificar actualizaciones" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2226,8 +2096,6 @@ msgstr "app-id con VersionCode opcional con el formato APPID[:VERCODE]" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2246,7 +2114,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "no se puede abrir '%(filename)s': %(error)s" @@ -2260,14 +2128,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2286,14 +2150,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2324,10 +2180,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2352,8 +2204,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2371,8 +2221,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2380,20 +2228,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2407,10 +2249,6 @@ msgstr "uso: fdroid [-h|--help|--version] []" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "forzar errores al ser advertencias, o ignorar." @@ -2423,8 +2261,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2438,35 +2274,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2505,8 +2327,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2525,32 +2345,16 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "no hay tal opción: %s" - -#: ../fdroidserver/__main__.py -#, fuzzy -msgid "no version info found!" -msgstr "¡Se encontró una excepción desconocida!" - #: ../fdroidserver/checkupdates.py #, fuzzy msgid "no version information found" msgstr "¡Se encontró una excepción desconocida!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2560,72 +2364,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "No se reconoce el comando \"%s\"" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "opción -%s requiere un argumento" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "opción --%s no puede llevar argumento" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "opción --%s no es un prefijo único" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "No se reconoce el comando --\"%s\"" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "opción --%s requiere un argumento" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "argumentos opcionales" - #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" @@ -2636,8 +2374,6 @@ msgstr "Opciones" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "argumentos posicionales" @@ -2670,10 +2406,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2698,17 +2430,7 @@ msgstr "local_copy_dir no termina en \"fdroid\", quizá quiso escribir: \"{path} msgid "shared library" msgstr "librería compartida" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "mostrar el número de versión del programa y salir" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "mostrar este mensaje de ayuda y salir" @@ -2742,8 +2464,6 @@ msgstr "librería estática" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2753,22 +2473,16 @@ msgstr "se requieren los siguientes argumentos: %s" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "Cadena de opción inesperada: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2779,9 +2493,7 @@ msgstr "argumentos no reconocidos: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "uso: " @@ -2810,21 +2522,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "el AndroidManifest.xml del {apkfilename} tiene una mala fecha: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2845,7 +2555,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2886,11 +2595,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/es_MX/LC_MESSAGES/fdroidserver.po b/locale/es_MX/LC_MESSAGES/fdroidserver.po index e3e9df44..c5e8b00a 100644 --- a/locale/es_MX/LC_MESSAGES/fdroidserver.po +++ b/locale/es_MX/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2020-04-29 12:49+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Spanish (Mexico) \n" @@ -49,11 +49,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -79,17 +74,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -105,14 +89,6 @@ msgstr "" msgid "%d problems found" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [opciones]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -133,13 +109,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "" @@ -160,8 +129,6 @@ msgstr "" msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -175,11 +142,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -190,7 +152,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -209,8 +171,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr "" @@ -301,10 +261,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -348,7 +304,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -404,11 +359,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -461,21 +418,18 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "No se pudo encontrar '{command}' en su sistema" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Could not find latest version code" msgstr "No se pudo encontrar el código de la última versión" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Could not find latest version name" @@ -496,6 +450,7 @@ msgstr "No se pudo abrir el archivo APK para su análisis" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Couldn't find Application ID" @@ -591,11 +546,6 @@ msgstr "Descripción '%s' es solo el resumen de la aplicación" msgid "Description has a duplicate line" msgstr "La descripción tiene una línea duplicada" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -652,11 +602,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -690,12 +635,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -840,10 +779,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -875,7 +810,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -940,15 +874,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1083,16 +1015,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1303,7 +1231,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1338,7 +1265,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1368,19 +1294,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1389,10 +1313,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1558,14 +1478,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1866,11 +1778,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1880,7 +1787,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1918,6 +1824,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1948,11 +1855,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -1966,6 +1868,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1985,11 +1888,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2004,27 +1903,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2063,11 +1945,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2169,20 +2046,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2196,11 +2064,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2211,8 +2081,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2231,7 +2099,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" @@ -2245,14 +2113,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2271,14 +2135,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "complejo" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2309,10 +2165,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2337,8 +2189,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2356,8 +2206,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2365,20 +2213,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2391,10 +2233,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2407,8 +2245,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2422,35 +2258,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2488,8 +2310,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2508,30 +2328,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2541,72 +2346,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "" - #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" @@ -2617,8 +2356,6 @@ msgstr "%prog [opciones]" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "" @@ -2651,10 +2388,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2678,17 +2411,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "" @@ -2722,8 +2445,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2733,22 +2454,16 @@ msgstr "" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2759,9 +2474,7 @@ msgstr "" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "" @@ -2790,21 +2503,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2825,7 +2536,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2866,11 +2576,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/eu/LC_MESSAGES/fdroidserver.po b/locale/eu/LC_MESSAGES/fdroidserver.po index 2f7972d3..770e23c4 100644 --- a/locale/eu/LC_MESSAGES/fdroidserver.po +++ b/locale/eu/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -47,11 +47,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -77,17 +72,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -103,14 +87,6 @@ msgstr "" msgid "%d problems found" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -131,13 +107,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "" @@ -158,8 +127,6 @@ msgstr "" msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -173,11 +140,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -188,7 +150,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -207,8 +169,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr "" @@ -299,10 +259,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -346,7 +302,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -402,11 +357,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -459,20 +416,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -492,6 +446,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -585,11 +540,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -646,11 +596,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -684,12 +629,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -834,10 +773,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -869,7 +804,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -934,15 +868,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1077,16 +1009,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1297,7 +1225,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1332,7 +1259,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1362,19 +1288,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1383,10 +1307,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1552,14 +1472,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1860,11 +1772,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1874,7 +1781,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1912,6 +1818,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1942,11 +1849,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -1960,6 +1862,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1979,11 +1882,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1998,27 +1897,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2057,11 +1939,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2163,20 +2040,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2190,11 +2058,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2205,8 +2075,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2225,7 +2093,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" @@ -2239,14 +2107,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2265,14 +2129,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "konplexua" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2303,10 +2159,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2331,8 +2183,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2350,8 +2200,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2359,20 +2207,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2385,10 +2227,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2401,8 +2239,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2416,35 +2252,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2482,8 +2304,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2502,30 +2322,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2535,72 +2340,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "" @@ -2610,8 +2349,6 @@ msgstr "" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "" @@ -2644,10 +2381,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2671,17 +2404,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "" @@ -2715,8 +2438,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2726,22 +2447,16 @@ msgstr "" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2752,9 +2467,7 @@ msgstr "" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "" @@ -2783,21 +2496,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2818,7 +2529,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2859,11 +2569,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index 00e762d6..3260d468 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2024-11-26 15:16+0000\n" "Last-Translator: Danial Behzadi \n" "Language-Team: Persian \n" @@ -51,11 +51,6 @@ msgstr "{path} ‏local_copy_dir وجود ندارد!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "{apkfilename} از پیش روی {dev} نصب شده." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -81,17 +76,6 @@ msgstr "{path} به دست کلیدی که مجاز نیست امضا شده:" msgid "\"{url}\" is not a valid URL!" msgstr "{url} نشانی معتبری نیست!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "گزینهٔ %(option)s نیاز به %(number)d آرگومان دارد" -msgstr[1] "گزینهٔ %(option)s نیاز به %(number)d آرگومان دارد" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -107,14 +91,6 @@ msgstr "" msgid "%d problems found" msgstr "%d مشکل پیدا شد" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [گزینه‌ها]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -135,13 +111,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "گزینۀ %s مقدار نمی‌گیرد" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "keypass در config.yml پیدا نشد!" @@ -162,8 +131,6 @@ msgstr "keystorepass در config.yml پیدا نشد!" msgid "'repo_keyalias' not found in config.yml!" msgstr "repo_keyalias در config.yml پیدا نشد!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "required آرگومانی نامعتبر برای موقعیتی‌هاست" @@ -177,11 +144,6 @@ msgstr "sdk_path در config.yml تنظیم نشده!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' بیش از حد قدیمی است. اف‌دروید به build- tools-{version} یا جدیدتر نیاز دارد!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "ترتیب {field} کاتوره‌ای خواهد بود! اگر ترتیب مهم است از () یا [] استفاده کنید!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -192,7 +154,7 @@ msgstr "اجرای {path} شکست خورد!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -211,8 +173,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr "‪.__call__()‬ تعریف نشده است" @@ -303,10 +263,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -350,7 +306,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -406,11 +361,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "نمی‌توان {path} را بازنویسی کرد" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -463,20 +420,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -496,6 +450,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -589,11 +544,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -650,11 +600,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "بار گرفتن %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -688,12 +633,6 @@ msgstr "خطا: %(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -838,10 +777,6 @@ msgstr "" msgid "Finished" msgstr "پایان یافته" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "برچسب‌های HTML ممنوعه" @@ -873,7 +808,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -938,15 +872,13 @@ msgstr "پاک سازی گیت شکست خورد" msgid "Git fetch failed" msgstr "واکشی گیت شکست خورد" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "بازنشانی گیت شکست خورد" @@ -1081,16 +1013,12 @@ msgstr "VercodeOperation نامعتبر: {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "دودویی نامعتبر %s" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "سیاههٔ گلوله‌ای نامعتبر" @@ -1301,7 +1229,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1336,7 +1263,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1366,19 +1292,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1387,10 +1311,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "گزینه‌ها" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1556,14 +1476,6 @@ msgstr "برداشتن {path}" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1864,11 +1776,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1878,7 +1785,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "استثنایی ناشناخته پیدا شد!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1916,6 +1822,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1946,11 +1853,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -1964,6 +1866,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1983,11 +1886,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2002,27 +1901,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "استفاده" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "استفاده: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2061,11 +1943,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2167,20 +2044,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2194,11 +2062,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2209,8 +2079,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2229,7 +2097,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" @@ -2243,14 +2111,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2269,14 +2133,6 @@ msgstr "شبیه‌سازی {url}" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "پیچیده" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2307,10 +2163,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2335,8 +2187,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2354,8 +2204,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2363,20 +2211,14 @@ msgid_plural "expected %s arguments" msgstr[0] "انتظار %s آرگومان می‌رفت" msgstr[1] "انتظار %s آرگومان می‌رفت" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "انتظار آرگومان می‌رفت" @@ -2389,10 +2231,6 @@ msgstr "fdroid [] [-h|--help|--version|]" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "ممیّز شناور" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2405,8 +2243,6 @@ msgstr "" msgid "gzip file archive" msgstr "بایگانی پروندهٔ gzip" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2420,35 +2256,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "عدد صحیح" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2486,8 +2308,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2506,30 +2326,15 @@ msgstr "" msgid "no APK supplied" msgstr "هیج APKای داده نشده" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2539,72 +2344,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "گزینه -%s شناسایی نشد" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "گزینه -%s نیازمند آرگومان است" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "گزینه --%s شناسایی نشد" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "آرگومان‌های اختیاری" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "گزینه‌ها" @@ -2614,8 +2353,6 @@ msgstr "گزینه‌ها" msgid "overwriting existing {path}" msgstr "پایمالی {path} موجود" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "آرگومان‌های موقعیتی" @@ -2648,10 +2385,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2675,17 +2408,7 @@ msgstr "" msgid "shared library" msgstr "کتابخانهٔ اشتراکی" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "نمایش نگارش برنامه و خروج" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "نمایش این پیام راهنما و خروج" @@ -2719,8 +2442,6 @@ msgstr "کتابخانهٔ ایستا" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2730,22 +2451,16 @@ msgstr "" msgid "true" msgstr "درست" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2756,9 +2471,7 @@ msgstr "آرگومان‌های ناشناخته: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "استفاده: " @@ -2787,21 +2500,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2822,7 +2533,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2863,11 +2573,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/fdroidserver.pot b/locale/fdroidserver.pot index 07258fc9..157db931 100644 --- a/locale/fdroidserver.pot +++ b/locale/fdroidserver.pot @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.4a2\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -49,11 +49,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -79,17 +74,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -105,14 +89,6 @@ msgstr "" msgid "%d problems found" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -133,13 +109,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "" @@ -160,8 +129,6 @@ msgstr "" msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -175,11 +142,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -190,7 +152,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -209,8 +171,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr "" @@ -301,10 +261,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -348,7 +304,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -404,11 +359,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -461,20 +418,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -494,6 +448,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -587,11 +542,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -648,11 +598,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -686,12 +631,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -836,10 +775,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -871,7 +806,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -936,15 +870,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1079,16 +1011,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1299,7 +1227,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1334,7 +1261,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1364,19 +1290,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1385,10 +1309,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1554,14 +1474,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1862,11 +1774,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1876,7 +1783,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1914,6 +1820,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1944,11 +1851,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -1962,6 +1864,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1981,11 +1884,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2000,27 +1899,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2059,11 +1941,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2165,20 +2042,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2192,11 +2060,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2207,8 +2077,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2227,7 +2095,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" @@ -2241,14 +2109,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2267,14 +2131,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2305,10 +2161,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2333,8 +2185,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2352,8 +2202,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2361,20 +2209,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2387,10 +2229,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2403,8 +2241,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2418,35 +2254,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2484,8 +2306,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2504,30 +2324,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2537,72 +2342,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "" @@ -2612,8 +2351,6 @@ msgstr "" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "" @@ -2646,10 +2383,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2673,17 +2406,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "" @@ -2717,8 +2440,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2728,22 +2449,16 @@ msgstr "" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2754,9 +2469,7 @@ msgstr "" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "" @@ -2785,21 +2498,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2820,7 +2531,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2861,11 +2571,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index 17372f5a..ab3e5a61 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2025-01-31 14:19+0000\n" "Last-Translator: Ricky Tigg \n" "Language-Team: Finnish \n" @@ -50,11 +50,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" on jo asennettu kohteeseen {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -80,17 +75,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -106,14 +90,6 @@ msgstr "" msgid "%d problems found" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -134,13 +110,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "" @@ -161,8 +130,6 @@ msgstr "" msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -176,11 +143,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -191,7 +153,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -210,8 +172,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr "" @@ -302,10 +262,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -349,7 +305,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -405,11 +360,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -462,20 +419,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -495,6 +449,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -588,11 +543,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -649,11 +599,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -687,12 +632,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -837,10 +776,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -872,7 +807,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -937,15 +871,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1080,16 +1012,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1300,7 +1228,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1335,7 +1262,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1365,19 +1291,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1386,10 +1310,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1555,14 +1475,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1863,11 +1775,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1877,7 +1784,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1915,6 +1821,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1945,11 +1852,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -1963,6 +1865,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1982,11 +1885,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2001,27 +1900,10 @@ msgstr "Ulosladataan {apkfilename}:a osoitteeseen androidobservatory.org" msgid "Uploading {apkfilename} to virustotal" msgstr "Ulosladataan {apkfilename} virustotaliin" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2060,11 +1942,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2166,20 +2043,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2193,11 +2061,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2208,8 +2078,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2228,7 +2096,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "%(filename)s:a ei voi avata: %(error)s" @@ -2242,14 +2110,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2268,14 +2132,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "monimutkainen" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2306,10 +2162,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2334,8 +2186,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2353,8 +2203,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2362,20 +2210,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2388,10 +2230,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2404,8 +2242,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2419,35 +2255,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2485,8 +2307,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2505,30 +2325,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2538,72 +2343,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "" @@ -2613,8 +2352,6 @@ msgstr "" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "" @@ -2647,10 +2384,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2674,17 +2407,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "" @@ -2718,8 +2441,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2729,22 +2450,16 @@ msgstr "" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2755,9 +2470,7 @@ msgstr "" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "" @@ -2786,21 +2499,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename}:lla ({appid}) ei ole metatietoja!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} sisältää useita {name} tiedostoja, näyttää Pääavaimen hyväksikäytöltä!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "{apkfilename}:n AndroidManifest.xml:ssa on väärä päivämäärä: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2821,7 +2532,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2862,11 +2572,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index ae1fb8e2..1b71ac5f 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -46,7 +46,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2025-03-02 16:42+0000\n" "Last-Translator: Lula Bye \n" "Language-Team: French \n" @@ -93,11 +93,6 @@ msgstr "Le dossier racine pour « local_copy_dir » {path} n’existe pas !" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "«{apkfilename}» est déjà installé sur {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" contient {name} obsolète ({version})" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -123,17 +118,6 @@ msgstr "\"{path}\" est signé par une clé qui n'est pas autorisée :" msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" n'est pas une URL valide !" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "L'option %(option)s requiert %(number)d argument" -msgstr[1] "L'option %(option)s requiert %(number)d arguments" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -149,14 +133,6 @@ msgstr "Les APK %d n'ont pas pu être signés ou vérifiés !" msgid "%d problems found" msgstr "%d problèmes trouvés" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [options]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -177,13 +153,6 @@ msgstr "%s a un mauvais SHA-256 : %s" msgid "%s is not an accepted build field" msgstr "%s n'est pas un champ de construction acceptable" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "l'option %s ne prend pas de valeur" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' non trouvé dans config.yml !" @@ -204,8 +173,6 @@ msgstr "'keystorepass' non trouvé dans config.yml !" msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' non trouvé dans config.yml !" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' est invalide comme argument positionnel" @@ -219,11 +186,6 @@ msgstr "'sdk_path' n'est pas configuré dans 'config.yml' !" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' est obsolète, fdroid requiert build-tools-{version} ou plus !" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' sera ordonné aléatoirement ! Utilisez des parenthèses () ou des crochets [] si l'ordre est important !" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -234,7 +196,7 @@ msgstr "'{path}' n'a pas pu être exécuté !" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "Le format de '{path}' est incorrect, il devrait s'agir d’un dictionnaire !" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' n'est pas un(e) {field} valide dans {appid}. Motif regex : {pattern}" @@ -253,8 +215,6 @@ msgstr "--merge-request fonctionne seulement sur un unique appid !" msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate a échoué pour {appid} : {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() n'est pas défini" @@ -345,10 +305,6 @@ msgstr "L'outil SDK Android {cmd} n'a pas été trouvé !" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "L’application possède des fichiers binaires mais n'a pas les AllowedAPKSigningKeys correspondantes pour épingler le certificat." -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "L'application a NoSourceSince ou ArchivePolicy « 0 version » mais AutoUpdateMode ou UpdateCheckMode ne valent pas None" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "L'application a NoSourceSince ou ArchivePolicy à « 0 version » mais AutoUpdateMode ou UpdateCheckMode ne valent pas None" @@ -392,7 +348,6 @@ msgstr "Mauvais type d'entrée \"{mirrortype}\" dans le paramétrage des miroirs msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL de base à mirorer, peut inclure la clef de signature d'index à l'aide de la chaîne de requête : ?fingerprint=" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -448,11 +403,13 @@ msgstr[1] "Build impossible à cause des {} erreurs lors de l'analyse" msgid "Cannot rewrite \"{path}\"" msgstr "Impossible d'écrire sur \"{path}\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Catégories « %s » invalides" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Catégories non définies" @@ -505,20 +462,17 @@ msgstr "Conflit des définitions « {field} » entre les fichiers .yml et ceux msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Conflit d'arguments : '--verbose' et '--quiet' ne peuvent être choisis en même temps." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Conflit de fichiers de configuration ! Utilisation de {newfile}, ignorant {oldfile} !" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Impossible de trouver '{command}' sur votre système" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Impossible de trouver la dernière version du code" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Impossible de trouver le nom de la dernière version" @@ -538,6 +492,7 @@ msgstr "Impossible d'ouvrir le fichier APK {path} pour analyse : " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Impossible de récupérer la taille \"{size}\", mauvais type \"{type}\"" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Impossible de trouver l'ID de l'application" @@ -631,11 +586,6 @@ msgstr "Description de '%s' n'est qu'un résumé de l'application" msgid "Description has a duplicate line" msgstr "Ligne dupliquée dans la description" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "La description contient une liste (%s) mais ce n'est ni une liste à puces (*) ni une liste numérotée (#)" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -692,11 +642,6 @@ msgstr "Téléchager F-Droid.apk en utilisant des miroirs avec moins de fuites r msgid "Download complete mirrors of small repos" msgstr "Télécharger une image complète des petits dépôts" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "Téléchargement de %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Le téléchargement du référentiel a déjà échoué une fois, ne pas réessayer." @@ -730,14 +675,6 @@ msgstr "ERREUR : %(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERREUR : La sous-commande \"server\" a été supprimée, utilisez plutôt \"deploy\" !" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"ERREUR : cette commande ne devrait jamais être utilisée pour copier f-droid.org !\n" -"Une copie de f-droid.org occupe plus de 200GB." - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERREUR : type de CI non supporté, les corrections sont bienvenues !" @@ -884,10 +821,6 @@ msgstr "Le fichier a été supprimé au cours du traitement : {path}" msgid "Finished" msgstr "Terminé" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Les informations de dons via Flattr doivent être renseignées dans le champ FlattrID:" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Balises HTML interdites" @@ -919,7 +852,6 @@ msgstr "Mauvais fichier de financement « {path} » trouvé pour « {name} msgid "Found invalid appids in arguments" msgstr "Appids invalide trouvée dans l'argument" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Code de version invalide trouvée pour certaines application" @@ -984,15 +916,13 @@ msgstr "Nettoyage du Git échoué" msgid "Git fetch failed" msgstr "Recherche du Git échouée" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "Git prune a échoué" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Impossible de définir la branche par défaut du Git distant : \"%s\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Reset de Git échouée" @@ -1127,16 +1057,12 @@ msgstr "VercodeOperation non valide : {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "VercodeOperation non valide : {invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "ID de l'application invalide {appid}" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "Booléen '%s' non valide" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Liste à puces non valide" @@ -1347,7 +1273,6 @@ msgstr "Aucun certificat signé trouvé dans {path}" msgid "No such package: %s" msgstr "Ce paquet n'existe pas : %s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1382,7 +1307,6 @@ msgstr "Rien à faire pour {appid}." msgid "Now set these in config.yml:" msgstr "Maintenant, définissez-les dans config.yml :" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1412,19 +1336,17 @@ msgstr "L'un des éléments de configuration 'github_releases' ne contient pas l msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "L'un des éléments de configuration 'github_releases' ne contient pas la valeur 'token'. suivant ..." +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Seuls les formats PNG et JPEG sont pris en charge pour les graphiques, trouvés : {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Afficher uniquement les différences avec le Play Store" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Traiter uniquement les applications ayant des mises à jour automatiques" @@ -1433,10 +1355,6 @@ msgstr "Traiter uniquement les applications ayant des mises à jour automatiques msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Les méthodes de donation OpenCollective vont dans le champ OpenCollective:" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Options" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Générez un rapport JSON dans un fichier nommé d'après l'APK." @@ -1602,14 +1520,6 @@ msgstr "Suppression de {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Renomme les fichiers APK dont le nom ne ressemble pas à nom.paquet_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "Le mode de mise à jour de RepoTrunk n'a de sens que pour les dépôts git-svn" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Réinitialiser et créer un tout nouveau serveur de construction, même si le serveur existant semble correct." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1919,11 +1829,6 @@ msgstr "Balise de licence non valide \"{}\" ! Utilisez uniquement des balises msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Balise de licence non valide \"{}\" ! Utilisez uniquement des balises de licence configurées dans votre fichier de configuration" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "Cible du lien symbolique inattendue : {link} -> {target}" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1933,7 +1838,6 @@ msgstr "Entrée {key} inconnue dans {configname}" msgid "Unknown exception found!" msgstr "Exception inconnue détectée !" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1971,6 +1875,7 @@ msgstr "Champ application non reconnu '{fieldname}' dans '{path}'" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Option de compilation '{build_flag}' non reconnue dans '{path}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -2001,11 +1906,6 @@ msgstr "Chemin scandelete inutilisé : %s" msgid "Unused scanignore path: %s" msgstr "Chemin scanignore inutilisé : %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "Extraction vers %s" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Mettre à jour les données des dépôts pour les nouveaux paquets" @@ -2019,6 +1919,7 @@ msgstr "Mettre à jour le rapport de transparence des fichiers binaires pour une msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData a une URL invalide : {url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -2038,11 +1939,7 @@ msgstr "UpdateCheckData URL non valide : {url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode est configuré mais on dirait que checkupdates n'a pas encore été lancé." -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode est configuré mais il semble que checkupdates n'a pas encore été lancé" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName est défini sur l’ID d’application connu, il peut être supprimé" @@ -2057,28 +1954,11 @@ msgstr "Téléversement de {apkfilename} vers androidobservatory.org" msgid "Uploading {apkfilename} to virustotal" msgstr "Téléversement de {apkfilename} vers virustotal" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Usage" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Usage : %s\n" - #: ../fdroidserver/lint.py #, fuzzy msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "Utiliser /HEAD plutôt que /master pour pointer un fichier dans la branche par défaut" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Utiliser /HEAD plutôt que /master pour pointer un fichier dans la branche par défaut" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Utiliser 'fdroid update -c' pour le créer." @@ -2117,11 +1997,6 @@ msgstr "Utilisation de la signature JAR" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "L'utilisation de l'utilitaire jarsigner de Java n'est pas recommandé pour vérifier les APKs ! Utiliser apksigner" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "Utiliser d’androguard à partir de \"{path}\"" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2224,20 +2099,11 @@ msgstr "ajoute IdentityFile à {path}" msgid "adding to {name}: {path}" msgstr "ajoute à {name} : {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "option ambiguë : %(option)s peut correspondre à %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "option ambiguë : %s (%s ?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2251,11 +2117,13 @@ msgstr "apksigner introuvable ! Impossible de signer ou de vérifier les APK mo msgid "apksigner not found, it's required for signing!" msgstr "apksigner est introuvable, il est requis pour la signature !" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "applicationId du fichier à traiter" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2266,8 +2134,6 @@ msgstr "ID d'application avec le versionCode optionnel sous la forme APPID[:VERC msgid "archive_url needs to end with /archive" msgstr "archive_url doit se terminer par /archive" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2286,7 +2152,7 @@ msgstr "tentative de connexion SSH simple pour tester la clé de déploiement :" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "impossible d'analyser la spécification de scrlib (not a string) : '{}'" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "impossible d'ouvrir « %(filename)s » : %(error)s" @@ -2300,14 +2166,10 @@ msgstr "impossible d'ouvrir les url sans https : '{};" msgid "cannot find required srclibs: \"{path}\"" msgstr "Impossible de trouver srclibs : \"{path}\"" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "Impossible d'avoir plusieurs arguments du sous-parseur" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2326,14 +2188,6 @@ msgstr "clonage de {url}" msgid "commands from plugin modules:" msgstr "commandes des modules d'extension :" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "complexe" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2365,10 +2219,6 @@ msgstr "impossible d'analyser la spécification srclib (pas de référence spéc msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "impossible d'analyser la spécification srclib (pas de référence spécifiée) : '{}'" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "impossible d'analyser la spécification srclib (trop de caractères '@') : '{}'" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2393,8 +2243,6 @@ msgstr "ficher de dépendance sans verrouillage" msgid "deployed process log {path} to {dest}" msgstr "journal du processus déployé de {path} vers {dest}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2412,8 +2260,6 @@ msgstr "le téléchargement de l'analyse des signatures de '{}' a échoué" msgid "executable binary, possibly code" msgstr "binaire exécutable, possiblement du code" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2421,20 +2267,14 @@ msgid_plural "expected %s arguments" msgstr[0] "%s argument attendu" msgstr[1] "%s arguments attendus" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "au moins un argument est attendu" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "un seul argument au plus est attendu" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "un seul argument est attendu" @@ -2447,10 +2287,6 @@ msgstr "fdroid [] [-h|--help|--version|]" msgid "fetch the latest version of signatures from the web" msgstr "recupération de la dernière version des signatures depuis le web" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "virgule flottante" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "forcer les erreurs (par défaut) sur les métadonnées à être des avertissements, ou les ignorer." @@ -2463,8 +2299,6 @@ msgstr "git svn clone a échoué" msgid "gzip file archive" msgstr "archive GZIP" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2478,35 +2312,21 @@ msgstr "index-v1 doit avoir une signature, utilisez `fdroid signindex` pour la c msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 doit avoir une signature, utilisez `fdroid signindex` pour la créer !" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "entier" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valeur %(type)s non valide : %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "choix non valide : %(value)r (choisissez parmi %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valeur de conflict_resolution invalide : %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2544,8 +2364,6 @@ msgstr "le miroir «%s» ne se termine pas par «fdroid» !" msgid "mirrors set twice, in config.yml and {path}!" msgstr "miroir configuré deux fois, dans config.yml et {path} !" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "les arguments qui s'excluent mutuellement doivent être optionnels" @@ -2564,30 +2382,15 @@ msgstr "aucune \"icon\" dans {appid}" msgid "no APK supplied" msgstr "aucun APK n’est fourni" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "option inexistante : %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "aucune information de version n'a été trouvée !" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "aucune information sur la version n’a été trouvée" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "non permis avec les arguments %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2597,72 +2400,6 @@ msgstr "un des arguments %s est requis" msgid "only accepts strings, lists, and tuples" msgstr "accepte uniquement les chaînes de caractères, listes et tuples" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "option %s : Si vous voulez vraiment installer toutes les applications signées, utilisez --all" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "option %s : valeur %s non valide : %r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "option %s : choix non valide : %r (choisissez depuis %s)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "L'option -%s n'est pas reconnue" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "l'option -%s requiert un argument" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "L'option %s ne doit pas avoir d'argument" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "option --%s n'est pas un préfixe unique" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "option --%s non reconnue" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "L'option %s requiert un argument" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "arguments optionnels" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "options" @@ -2672,8 +2409,6 @@ msgstr "options" msgid "overwriting existing {path}" msgstr "écrasement de {path} en cours" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "arguments de position" @@ -2706,10 +2441,6 @@ msgstr "repo_url doit se terminer par /repo" msgid "rsync is missing or broken: {error}" msgstr "rsync n'est pas présent ou ne fonctionne pas : {error}" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "ruamel.yaml n’est pas installé, impossible d’écrire les métadonnées." - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2734,17 +2465,7 @@ msgstr "serverwebroot: le chemin ne se terminer pas avec \"fdroid\", peut être msgid "shared library" msgstr "bibliothèque partagée" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "afficher le numéro de version du programme et quitter" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "afficher ce message d'aide et quitter" @@ -2778,8 +2499,6 @@ msgstr "librairie statique" msgid "supplied reference binary has allowed signer {signer}" msgstr "le fichier binaire de référence fourni a autorisé le signataire {signer}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2790,22 +2509,16 @@ msgstr "les arguments suivants sont requis %s" msgid "true" msgstr "vrai" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "chaîne d'option inattendue : %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "parser inconnu %(parser_name)r (choix : %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2816,9 +2529,7 @@ msgstr "arguments non reconnu : %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "permissions dangereuses sur '{config_file}' (doit être 0600) !" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "usage : " @@ -2848,21 +2559,19 @@ msgstr[1] "{0} applis, {1} alias de clé" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) ne contient pas de métadonnées !" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} a plusieurs fichiers {name}, on dirait que c'est une faille ou exploitation de la clé maître (Master Key) !" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "Le fichier AndroidManifest.xml de {apkfilename} possède une date incorrecte : " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} n’a pas de nom ! Utilisation de l’ID d’application à la place." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2883,7 +2592,6 @@ msgstr "{appid} possède à la fois des APK et des fichiers : {files}" msgid "{appid} is missing {name}" msgstr "{appid} n'a pas de {name}" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2924,11 +2632,6 @@ msgstr "{file} est vide ou corrompu !" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" n'existe pas ! Vérifiez \"config.yml\"." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile} est obsolète, utilisez {newfile}" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/fy/LC_MESSAGES/fdroidserver.po b/locale/fy/LC_MESSAGES/fdroidserver.po index ce350f75..afc47414 100644 --- a/locale/fy/LC_MESSAGES/fdroidserver.po +++ b/locale/fy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2021-07-01 15:29+0000\n" "Last-Translator: Vancha March \n" "Language-Team: Frisian \n" @@ -48,11 +48,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -78,17 +73,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -104,14 +88,6 @@ msgstr "" msgid "%d problems found" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [options]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -132,13 +108,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "" @@ -159,8 +128,6 @@ msgstr "" msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -174,11 +141,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -189,7 +151,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -208,8 +170,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() net definiearre" @@ -300,10 +260,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -347,7 +303,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -403,11 +358,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -460,20 +417,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -493,6 +447,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -586,11 +541,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -647,11 +597,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -685,12 +630,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -835,10 +774,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -870,7 +805,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -935,15 +869,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1078,16 +1010,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1298,7 +1226,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1333,7 +1260,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1363,19 +1289,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1384,10 +1308,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Opsjes" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1553,14 +1473,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1861,11 +1773,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1875,7 +1782,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "Ûnbekende útsûndering fûn!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1913,6 +1819,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1943,11 +1850,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -1961,6 +1863,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1980,11 +1883,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1999,27 +1898,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Gebrûk" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Gebrûk: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2058,11 +1940,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2164,20 +2041,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2191,11 +2059,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2206,8 +2076,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2226,7 +2094,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" @@ -2240,14 +2108,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2266,14 +2130,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2304,10 +2160,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2332,8 +2184,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2351,8 +2201,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2360,20 +2208,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2386,10 +2228,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2402,8 +2240,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2417,35 +2253,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2483,8 +2305,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2503,30 +2323,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2536,72 +2341,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "opsje -%s wurd net werkend" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "opsje -%s hat in argumint nedich" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "opsje --%s wurd net werkend" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "opsjonele arguminten" - #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" @@ -2612,8 +2351,6 @@ msgstr "Opsjes" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "" @@ -2646,10 +2383,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2673,17 +2406,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "lit it ferzje nûmer fan de applikaasje sjen en slút ôf" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "dit help berjocht sjen litte en ôfslute" @@ -2717,8 +2440,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2728,22 +2449,16 @@ msgstr "" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2754,9 +2469,7 @@ msgstr "" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "gebrûk: " @@ -2785,21 +2498,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2820,7 +2531,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2861,11 +2571,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/ga/LC_MESSAGES/fdroidserver.po b/locale/ga/LC_MESSAGES/fdroidserver.po index 1bb52d49..5ac927e4 100644 --- a/locale/ga/LC_MESSAGES/fdroidserver.po +++ b/locale/ga/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1-162-gfbb3cc59\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2025-03-23 10:56+0000\n" "Last-Translator: Aindriú Mac Giolla Eoin \n" "Language-Team: Irish \n" @@ -52,11 +52,6 @@ msgstr "Níl \"local_copy_dir\" {path} ann!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "Tá \"{apkfilename}\" suiteáilte cheana féin ar {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" tá {name} as dáta ({version})" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -82,20 +77,6 @@ msgstr "Tá \"{path}\" sínithe ag eochair nach bhfuil ceadaithe:" msgid "\"{url}\" is not a valid URL!" msgstr "Ní URL bailí é \"{url}\"!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "Tá argóint %(number)d ag teastáil ó rogha %(option)s" -msgstr[1] "Teastaíonn %(number)d argóint le rogha %(option)s" -msgstr[2] "Teastaíonn %(number)d argóint le rogha %(option)s" -msgstr[3] "Teastaíonn %(number)d argóint le rogha %(option)s" -msgstr[4] "Teastaíonn %(number)d argóint le rogha %(option)s" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -111,14 +92,6 @@ msgstr "Theip ar %d APKs a shíniú nó a fhíorú!" msgid "%d problems found" msgstr "Aimsíodh %d fadhbanna" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [roghanna]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -139,13 +112,6 @@ msgstr "Tá droch-SHA-256 ag %s: %s" msgid "%s is not an accepted build field" msgstr "Ní réimse tógála inghlactha é %s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "Ní ghlacann rogha %s luach" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "Níl 'Keypass' le fáil i config.yml!" @@ -166,8 +132,6 @@ msgstr "Níl 'keystorepass' le fáil i config.yml!" msgid "'repo_keyalias' not found in config.yml!" msgstr "Níl 'repo_keyalias' le fáil sa config.yml!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "Is argóint neamhbhailí é 'riachtanach' do shuíomhanna" @@ -181,11 +145,6 @@ msgstr "Níl 'sdk_path' socraithe sa config.yml!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "Tá '{aapt}' ró-shean, éilíonn fdroid build-tools-{version} nó níos nuaí!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "Beidh '{field}' in ord randamach! Bain úsáid as lúibíní () nó [] má tá ord tábhachtach!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -196,7 +155,7 @@ msgstr "Theip ar '{path}' a rith!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "Tá formáid neamhbhailí ag '{path}', ba chóir gur foclóir é!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "Ní '{value}' bailí {field} in {appid}. Patrún Regex: {pattern}" @@ -215,8 +174,6 @@ msgstr "Ní ritheann --merge-request ach ar aip amháin!" msgid "...checkupdate failed for {appid} : {error}" msgstr "... theip ar checkupdate le haghaidh {appid} : {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() gan sainmhíniú" @@ -307,10 +264,6 @@ msgstr "Android SDK uirlis {cmd} gan aimsiú!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Tá Binaries ag app ach níl AllowedAPKSigningKeys comhfhreagrach aige chun deimhniú a phionnáil." -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "Tá NoSourceSince nó ArchivePolicy \"leaganacha 0\" ag an bhfeidhmchlár ach níl aon cheann ag AutoUpdateMode nó UpdateCheckMode" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Tá NoSourceSince nó ArchivePolicy \"leaganacha 0\" nó 0 ag an bhfeidhmchlár ach níl aon cheann ag AutoUpdateMode nó UpdateCheckMode" @@ -354,7 +307,6 @@ msgstr "Drochchineál iontrála \"{mirrortype}\" i gcumraíocht scátháin: {mir msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Bun-URL le scáthán, is féidir an eochair sínithe innéacs a áireamh ag baint úsáide as teaghrán an iarratais: ?fingerprint=" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -413,11 +365,13 @@ msgstr[4] "Ní féidir tógáil de bharr {} earráidí agus an scanadh" msgid "Cannot rewrite \"{path}\"" msgstr "Ní féidir \"{path}\" a athscríobh" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Níl catagóirí '%s' bailí" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Níl catagóirí socraithe" @@ -470,20 +424,17 @@ msgstr "Sainmhínithe contrártha \"{field}\" idir comhaid .yml agus logánaithe msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argóintí contrártha: ní féidir '--verbose' agus '--quiet' a shonrú ag an am céanna." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Comhaid chumraíochta ag teacht salach ar a chéile! Ag baint úsáide as {newfile}, neamhaird {oldfile}!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Níorbh fhéidir '{command}' a aimsiú ar do chóras" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Níorbh fhéidir an cód leagain is déanaí a aimsiú" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Níorbh fhéidir ainm an leagain is déanaí a aimsiú" @@ -503,6 +454,7 @@ msgstr "Níorbh fhéidir APK {path} a oscailt le haghaidh anailíse: " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Níorbh fhéidir méid \"{size}\" a pharsáil, cineál mícheart \"{type}\"" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Níorbh fhéidir aitheantas feidhmchláir a aimsiú" @@ -596,11 +548,6 @@ msgstr "Níl sa chur síos ar '%s' ach achoimre an fheidhmchláir" msgid "Description has a duplicate line" msgstr "Tá líne dhúbailte ag cur síos" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "Tá liosta (%s) sa chur síos ach níl sé urchair (*) ná uimhrithe (#)" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -657,11 +604,6 @@ msgstr "Íoslódáil F-Droid.apk ag baint úsáide as scátháin a sceitheann n msgid "Download complete mirrors of small repos" msgstr "Íoslódáil scátháin iomlána de repos beag" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "%s á íosluchtú" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Theip ar an stór a íoslódáil cheana féin uair amháin, gan iarracht a dhéanamh arís." @@ -695,14 +637,6 @@ msgstr "EARRÁID: %(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "EARRÁID: Baineadh an fo-ordú \"freastalaí\", bain úsáid as \"imscaradh\"!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"EARRÁID: níor chóir an t-ordú seo a úsáid riamh chun scáthán a dhéanamh f-droid.org!\n" -"Éilíonn scáthán iomlán f-droid.org níos mó ná 200GB." - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "EARRÁID: cineál CI gan tacaíocht, fáilte roimh phaistí!" @@ -849,10 +783,6 @@ msgstr "D'imigh an comhad agus é á phróiseáil: {path}" msgid "Finished" msgstr "Críochnaithe" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Baineann modhanna síntiús Flattr sa FlattrID: réimse" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Clibeanna HTML toirmiscthe" @@ -884,7 +814,6 @@ msgstr "Aimsíodh drochchomhad maoinithe \"{path}\" in ionad \"{name}\":" msgid "Found invalid appids in arguments" msgstr "Aimsíodh appids neamhbhailí in argóintí" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Aimsíodh leagan neamhbhailíCodes for some apps" @@ -949,15 +878,13 @@ msgstr "Theip ar Git glan" msgid "Git fetch failed" msgstr "Theip ar ghabháil Git" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "Theip ar git prune" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Theip ar cheann socraithe cianda Git: \"%s\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Theip ar athshocrú Git" @@ -1092,16 +1019,12 @@ msgstr "VercodeOperation neamhbhailí: {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "VercodeOperation neamhbhailí: {invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "Aitheantas neamhbhailí feidhmchláir {appid}" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "Boole neamhbhailí '%s'" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Liosta neamhbhailí le hurchair" @@ -1312,7 +1235,6 @@ msgstr "Níor aimsíodh aon deimhnithe sínithe i {path}" msgid "No such package: %s" msgstr "Gan a leithéid de phacáiste: %s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1347,7 +1269,6 @@ msgstr "Níl aon rud le déanamh le haghaidh {appid}." msgid "Now set these in config.yml:" msgstr "Anois leagtar iad seo i config.yml:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1377,19 +1298,17 @@ msgstr "Tá luach 'projectUrl' in easnamh ar cheann de na míreanna cumraíochta msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "Tá an luach 'comhartha' in easnamh ar cheann de na míreanna cumraíochta 'github_releases'. gan bacadh ..." +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Ní thacaítear ach le PNG agus JPEG le haghaidh grafaicí, le fáil: {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "Ní ghlacann ach le \"env\" eochair amháin" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Ná priontáil ach difríochtaí leis an Play Store" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Ná próiseáil ach feidhmchláir le nuashonruithe uathoibríocha" @@ -1398,10 +1317,6 @@ msgstr "Ná próiseáil ach feidhmchláir le nuashonruithe uathoibríocha" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Baineann modhanna síntiús OpenCollective sa OpenCollective: réimse" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Roghanna" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Aschuir tuarascáil JSON le comhad ainmnithe i ndiaidh APK." @@ -1567,14 +1482,6 @@ msgstr "Ag baint {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Athainmnigh comhaid APK nach bhfuil comhoiriúnach package.name_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "Ní dhéanann modh nuashonraithe RepoTrunk ciall ach amháin i stórtha git-svn" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Athshocraigh agus cruthaigh freastalaí tógála branda nua, fiú más cosúil go bhfuil an ceann atá ann cheana ceart go leor." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1885,11 +1792,6 @@ msgstr "Clib cheadúnais gan choinne \"{}\"! Ná húsáid ach clibeanna faofa FS msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Clib cheadúnais gan choinne \"{}\"! Ná húsáid ach clibeanna ceadúnais atá cumraithe i do chomhad cumraíochta" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "Sprioc symlink gan choinne: {link} -> {target}" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1899,7 +1801,6 @@ msgstr "Iontráil anaithnid {key} in {configname}" msgid "Unknown exception found!" msgstr "Aimsíodh eisceacht anaithnid!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1937,6 +1838,7 @@ msgstr "Réimse app neamhaitheanta '{fieldname}' in '{path}'" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Bratach tógála neamhaitheanta '{build_flag}' in '{path}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1967,11 +1869,6 @@ msgstr "Conair scanta neamhúsáidte: %s" msgid "Unused scanignore path: %s" msgstr "Conair scanignore neamhúsáidte: %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "Dízipeáil go %s" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Nuashonraigh faisnéis maidir le pacáistí nua" @@ -1985,6 +1882,7 @@ msgstr "Nuashonraigh an logchomhad trédhearcachta dénártha le haghaidh URL" msgid "UpdateCheckData has invalid URL: {url}" msgstr "Tá URL neamhbhailí ag UpdateCheckData: {url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -2004,11 +1902,7 @@ msgstr "UpdateCheckData ní URL bailí é: {url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "Tá UpdateCheckMode socraithe ach tá an chuma air nach bhfuil checkupdates rite fós." -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode socraithe ach tá an chuma air nár ritheadh nuashonruithe go fóill" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName is set to the known application ID, is féidir é a bhaint" @@ -2023,27 +1917,10 @@ msgstr "{apkfilename} á uaslódáil chuig androidobservatory.org" msgid "Uploading {apkfilename} to virustotal" msgstr "{apkfilename} á uaslódáil chuig virustotal" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Úsáid" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Úsáid: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "Úsáid / HEAD in ionad / máistir nó / príomh go pointe ag comhad sa bhrainse réamhshocraithe" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Úsáid / HEAD in ionad / máistir go pointe ag comhad sa bhrainse réamhshocraithe" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Bain úsáid as 'nuashonrú fdroid -c' chun é a chruthú." @@ -2082,11 +1959,6 @@ msgstr "Ag baint úsáide as Síniú JAR" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Ag baint úsáide as jarsigner Java, ní mholtar chun APKs a fhíorú! Úsáid apksigner" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "Ag baint úsáide as androguard ó \"{path}\"" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2188,20 +2060,11 @@ msgstr "IdentityFile á chur le {path}" msgid "adding to {name}: {path}" msgstr "ag cur le {name}: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "Rogha dhébhríoch: D'fhéadfadh %(option)s %(matches)s a mheaitseáil" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "Rogha dhébhríoch: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2215,11 +2078,13 @@ msgstr "apksigner gan aimsiú! Ní féidir APKs nua-aimseartha a shíniú nó a msgid "apksigner not found, it's required for signing!" msgstr "apksigner gan aimsiú, tá sé ag teastáil le síniú!" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "aitheantas feidhmchláir an chomhaid le hoibriú air" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2230,8 +2095,6 @@ msgstr "ID iarratais le leagan roghnachCode san fhoirm APPID[:VERCODE]" msgid "archive_url needs to end with /archive" msgstr "Caithfidh archive_url deireadh a chur le /cartlann" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2250,7 +2113,7 @@ msgstr "ag iarraidh nasc SSH lom chun eochair imscaradh tástála:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "ní féidir spec scrlib a pharsáil (ní teaghrán): '{}'" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "ní féidir '%(filename)s' a oscailt: %(error)s" @@ -2264,14 +2127,10 @@ msgstr "ní féidir url neamh-https a oscailt: '{};" msgid "cannot find required srclibs: \"{path}\"" msgstr "ní féidir srclibs riachtanacha a aimsiú: \"{path}\"" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "ní féidir argóintí éagsúla subparser a bheith acu" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2290,14 +2149,6 @@ msgstr "clónáil {url}" msgid "commands from plugin modules:" msgstr "orduithe ó mhodúil bhreiseáin:" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "casta" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2331,10 +2182,6 @@ msgstr "Níorbh fhéidir srclib spec a pharsáil (níor sonraíodh ainm ar bith) msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "Níorbh fhéidir srclib spec a pharsáil (níor sonraíodh tag): '{}'" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "níorbh fhéidir spec srclib a pharsáil (an iomarca comharthaí '@'): '{}'" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2359,8 +2206,6 @@ msgstr "comhad spleáchais gan ghlas" msgid "deployed process log {path} to {dest}" msgstr "loga próiseas imlonnaithe {path} go {dest}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2378,8 +2223,6 @@ msgstr "Theip ar shínithe scanóirí a íosluchtú ó '{}'" msgid "executable binary, possibly code" msgstr "dénártha inrite, cód b'fhéidir" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2390,20 +2233,14 @@ msgstr[2] "bhíothas ag súil le %s argóint" msgstr[3] "bhíothas ag súil le %s argóint" msgstr[4] "bhíothas ag súil le %s argóint" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "bhíothas ag súil le hargóint amháin ar a laghad" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "bhíothas ag súil le hargóint amháin ar a mhéad" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "bhíothas ag súil le hargóint amháin" @@ -2416,10 +2253,6 @@ msgstr "fdroid [] [-h|--help|--leagan|]" msgid "fetch the latest version of signatures from the web" msgstr "Faigh an leagan is déanaí de shínithe ón ngréasán" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "snámhphointe" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "bhfeidhm earráidí meiteashonraí (réamhshocrú) a bheith ina rabhaidh, nó le neamhaird a dhéanamh orthu." @@ -2432,8 +2265,6 @@ msgstr "theip ar chlón git svn" msgid "gzip file archive" msgstr "Cartlann Comhad Gzip" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2447,35 +2278,21 @@ msgstr "Ní mór síniú a bheith ag Innéacs-V1, bain úsáid as 'FDROID Signin msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "Ní mór síniú a bheith ag Innéacs-V2, bain úsáid as 'FDROID Signindex' chun é a chruthú!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "slánuimhir" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "luach neamhbhailí %(type)s: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "rogha neamhbhailí: %(value)r (roghnaigh ó %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "Luach conflict_resolution neamhbhailí:%r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2513,8 +2330,6 @@ msgstr "ní chríochnaíonn scáthán '%s' le 'fdroid'!" msgid "mirrors set twice, in config.yml and {path}!" msgstr "scátháin leagtha faoi dhó, i config.yml agus {path}!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "ní mór argóintí comheisiacha a bheith roghnach" @@ -2533,30 +2348,15 @@ msgstr "níl \"icon\" in {appid}" msgid "no APK supplied" msgstr "níor soláthraíodh aon APK" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "Níl a leithéid de rogha ann: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "Níor aimsíodh aon eolas leagain!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "Níor aimsíodh aon eolas leagain" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "ní cheadaítear le hargóint %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2566,72 +2366,6 @@ msgstr "tá ceann de na hargóintí %s ag teastáil" msgid "only accepts strings, lists, and tuples" msgstr "ní ghlacann ach teaghráin, liostaí, agus tuples" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "rogha %s: Más mian leat na feidhmchláir shínithe go léir a shuiteáil, úsáid --all" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "Rogha %s: luach neamhbhailí %s:%r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "rogha %s: rogha neamhbhailí:%r (roghnaigh ó %s)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "rogha -%s gan aithint" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "rogha -%s éilíonn argóint" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "rogha --%s ní mór argóint a bheith aige" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "rogha --%s ní réimír uathúil é" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "rogha --%s gan aithint" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "rogha --%s éilíonn argóint" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "argóintí roghnacha" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "roghanna" @@ -2641,8 +2375,6 @@ msgstr "roghanna" msgid "overwriting existing {path}" msgstr "overwriting atá ann cheana {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "argóintí suímh" @@ -2675,10 +2407,6 @@ msgstr "Caithfidh repo_url deireadh a chur le / repo" msgid "rsync is missing or broken: {error}" msgstr "rsync ar iarraidh nó briste: {error}" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "ruamel.yaml nach bhfuil suiteáilte, ní féidir meiteashonraí a scríobh." - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2702,17 +2430,7 @@ msgstr "serverwebroot: ní chríochnaíonn cosán le \"fdroid\", b'fhéidir gur msgid "shared library" msgstr "leabharlann chomhroinnte" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "Taispeáin uimhir leagain agus scoir an ríomhchláir" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "Taispeáin an teachtaireacht chabhrach seo agus scoir" @@ -2746,8 +2464,6 @@ msgstr "Leabharlann statach" msgid "supplied reference binary has allowed signer {signer}" msgstr "tá dénártha tagartha soláthraithe ceadaithe signer {signer}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2757,22 +2473,16 @@ msgstr "Tá na hargóintí seo a leanas ag teastáil: %s" msgid "true" msgstr "fíor" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "teaghrán rogha gan choinne: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "parsálaí anaithnid %(parser_name)r (roghanna: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2783,9 +2493,7 @@ msgstr "argóintí neamhaitheanta: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "ceadanna neamhshábháilte ar '{config_file}' (ba chóir go mbeadh 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "úsáid: " @@ -2817,21 +2525,19 @@ msgstr[4] "{0} aippeanna, {1} ailiasanna eochrach" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) níl aon mheiteashonraí aige!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} Tá comhaid {name} iolracha, tá sé cosúil le leas a bhaint as Master Key!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "Tá drochdháta ag AndroidManifest.xml {apkfilename}: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "Níl ainm ar {appid}! Ag baint úsáide as ID iarratais ina ionad." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2852,7 +2558,6 @@ msgstr "Tá APKs agus comhaid araon ag {appid}: {files}" msgid "{appid} is missing {name}" msgstr "Tá {appid} ar iarraidh {name}" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2893,11 +2598,6 @@ msgstr "Tá {file} bán nó truaillithe!" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} Níl \"{section}/icons/{path}\" ann! Seiceáil \"config.yml\"." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "Tá {oldfile} imithe i léig, úsáid {newfile}" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/he/LC_MESSAGES/fdroidserver.po b/locale/he/LC_MESSAGES/fdroidserver.po index 8c8507e7..b92d0572 100644 --- a/locale/he/LC_MESSAGES/fdroidserver.po +++ b/locale/he/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2024-08-18 06:27+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" @@ -49,11 +49,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -79,17 +74,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -105,14 +89,6 @@ msgstr "" msgid "%d problems found" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [אפשרויות]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -133,13 +109,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "" @@ -160,8 +129,6 @@ msgstr "" msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -175,11 +142,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -190,7 +152,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -209,8 +171,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr "‎.__call__()‎ לא מוגדר" @@ -301,10 +261,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -348,7 +304,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -404,11 +359,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -461,20 +418,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -494,6 +448,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -587,11 +542,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -648,11 +598,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -686,12 +631,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -836,10 +775,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -871,7 +806,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -936,15 +870,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1079,16 +1011,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1299,7 +1227,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1334,7 +1261,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1364,19 +1290,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1385,10 +1309,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "אפשרויות" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1554,14 +1474,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "לשנות שמות של קובצי APK שאינם בתבנית package.name_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1862,11 +1774,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1876,7 +1783,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "אירעה חריגה לא מוכרת!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1914,6 +1820,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1944,11 +1851,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -1962,6 +1864,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1981,11 +1884,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2000,27 +1899,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "שימוש" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "שימוש: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2059,11 +1941,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2165,20 +2042,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2192,11 +2060,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2207,8 +2077,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2227,7 +2095,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" @@ -2241,14 +2109,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2267,14 +2131,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2305,10 +2161,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2333,8 +2185,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2352,8 +2202,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2361,20 +2209,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2387,10 +2229,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2403,8 +2241,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2418,35 +2254,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2484,8 +2306,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2504,30 +2324,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2537,72 +2342,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "האפשרות ‎-%s לא מוכרת" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "האפשרות ‎-%s דורשת משתנה" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "האפשרות ‎--%s לא מוכרת" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "משתני רשות" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "אפשרויות" @@ -2612,8 +2351,6 @@ msgstr "אפשרויות" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "" @@ -2646,10 +2383,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2673,17 +2406,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "להציג את מספר הגרסה של התוכנית ולצאת" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "להציג את הודעת העזרה הזאת ולצאת" @@ -2717,8 +2440,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2728,22 +2449,16 @@ msgstr "" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2754,9 +2469,7 @@ msgstr "" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "שימוש: " @@ -2785,21 +2498,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2820,7 +2531,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2861,11 +2571,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/hi/LC_MESSAGES/fdroidserver.po b/locale/hi/LC_MESSAGES/fdroidserver.po index abd76c3a..ddb6427a 100644 --- a/locale/hi/LC_MESSAGES/fdroidserver.po +++ b/locale/hi/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2023-02-22 11:24+0000\n" "Last-Translator: Saurmandal \n" "Language-Team: Hindi \n" @@ -49,11 +49,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -79,17 +74,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -105,14 +89,6 @@ msgstr "" msgid "%d problems found" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -133,13 +109,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "" @@ -160,8 +129,6 @@ msgstr "" msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -175,11 +142,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -190,7 +152,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -209,8 +171,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() परिभाषित नहीं" @@ -301,10 +261,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -348,7 +304,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -404,11 +359,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -461,20 +418,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -494,6 +448,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -587,11 +542,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -648,11 +598,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -686,12 +631,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -836,10 +775,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -871,7 +806,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -936,15 +870,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1079,16 +1011,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1299,7 +1227,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1334,7 +1261,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1364,19 +1290,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1385,10 +1309,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "विकल्प" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1554,14 +1474,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1862,11 +1774,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1876,7 +1783,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "अज्ञात अपवाद मिला!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1914,6 +1820,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1944,11 +1851,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -1962,6 +1864,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1981,11 +1884,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2000,27 +1899,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "प्रयोग" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "प्रयोग: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2059,11 +1941,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2165,20 +2042,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2192,11 +2060,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2207,8 +2077,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2227,7 +2095,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" @@ -2241,14 +2109,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2267,14 +2131,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "जटिल" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2305,10 +2161,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2333,8 +2185,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2352,8 +2202,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2361,20 +2209,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2387,10 +2229,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2403,8 +2241,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2418,35 +2254,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2484,8 +2306,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2504,30 +2324,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2537,72 +2342,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "विकल्प -%s मान्यता प्राप्त नहीं" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "वैकल्पिक तर्क" - #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" @@ -2613,8 +2352,6 @@ msgstr "विकल्प" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "" @@ -2647,10 +2384,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2674,17 +2407,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "यह मदद संदेश दिखाएं और बाहर निकलें" @@ -2718,8 +2441,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2729,22 +2450,16 @@ msgstr "" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2755,9 +2470,7 @@ msgstr "" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "प्रयोग: " @@ -2786,21 +2499,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2821,7 +2532,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2862,11 +2572,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index d0f681b7..bf895577 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Hungarian \n" @@ -54,11 +54,6 @@ msgstr "\"local_copy_dir\" {path} nem létezik!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "A(z) „{apkfilename}” már telepítve van ezen: {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "A(z) „{path}” elavult {name} csomagot tartalmaz ({version})" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -84,17 +79,6 @@ msgstr "\"{path}\" kulccsal aláírt és így nem engedélyezett:" msgid "\"{url}\" is not a valid URL!" msgstr "A(z) „{url}” nem érvényes URL!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "A(z) %(option)s kapcsoló %(number)d argumentumot igényel" -msgstr[1] "A(z) %(option)s kapcsoló %(number)d argumentumot igényel" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -110,14 +94,6 @@ msgstr "" msgid "%d problems found" msgstr "%d probléma található" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [kapcsolók]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -138,13 +114,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "A(z) %s nem elfogadott összeállítási mező" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "A(z) %s kapcsoló nem fogad értéket" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "A „keypass” nem található a config.yml fájlban." @@ -165,8 +134,6 @@ msgstr "A „keystorepass” nem található a config.yml fájlban." msgid "'repo_keyalias' not found in config.yml!" msgstr "A „repo_keyalias” nem található a config.yml fájlban." -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "A „required” argumentum érvénytelen argumentum pozicionális paraméterek esetén" @@ -180,11 +147,6 @@ msgstr "Az „sdk_path” nincs megadva a „config.yml” fájlban." msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "Az „{aapt}” túl régi, az fdroidhoz build-tools-{version} vagy újabb szükséges." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "A(z) „{field}” véletlenszerű sorrendben lesz. Használjon () vagy [] zárójeleket, ha fontos a sorrend." - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -195,7 +157,7 @@ msgstr "A(z) „{path}” végrehajtása sikertelen." msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "A(z) „{value}” nem érvényes {field} érték itt: {appid}. Regex minta: {pattern}" @@ -214,8 +176,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "…checkupdate sikertelen ennél: {appid} : {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() nincs definiálva" @@ -306,10 +266,6 @@ msgstr "A(z) „{cmd}” Android SDK eszköz megtalálva!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -353,7 +309,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "A tükrözendő alap URL, tartalmazhatja az index aláírókulcsát a lekérdezésben: ?fingerprint=" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -409,11 +364,13 @@ msgstr[1] "Nem lehet összeállítani, mert {} hiba történt az átvizsgálásk msgid "Cannot rewrite \"{path}\"" msgstr "A(z) „{path}” nem írható újra" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "A(z) „%s” kategória érvénytelen" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "A kategóriák nincsenek megadva" @@ -466,20 +423,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Ütköző argumentumok: a „--verbose” és a „--quite” kapcsolók együtt nem adhatók meg." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Ütköző konfigurációs fájlok! {newfile} használata, {oldfile} mellőzése!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "A(z) „{command}” nem található a rendszeren" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "A legfrissebb verzió kódja nem található" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "A legfrissebb verzió neve nem található" @@ -499,6 +453,7 @@ msgstr "A(z) {path} APK nem nyitható meg az elemzéshez: " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "A(z) „{size}” méret nem dolgozható fel, hibás „{type}” típus" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Az alkalmazásazonosító nem található" @@ -593,11 +548,6 @@ msgstr "A(z) „%s” leírás csak az alkalmazás összegzése" msgid "Description has a duplicate line" msgstr "A leírás ismételt sorokat tartalmaz" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "A leírás listát (%s) tartalmaz, de nem pontozott (*) vagy számozott (#)" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -654,11 +604,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "Kis tárolók teljes tükrének letöltése" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "A tároló letöltése már egyszer sikertelen volt, nem próbálja meg újra." @@ -692,14 +637,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "HIBA: A „server” alparancs eltávolításra került, használja ezt: „deploy”!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"HIBA: a parancsot sose használja az f-droid.org tükrözéséhez.\n" -"Az f-droid.org teljes tükrözéséhez több mint 200 GB tárhely szükséges." - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "HIBA: nem támogatott CI típus, foltokat szívesen fogadunk!" @@ -847,10 +784,6 @@ msgstr "A fájl feldolgozás közben eltűnt: {path}" msgid "Finished" msgstr "Befejezve" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "A Flattr adományozási módok a FlattrID: mezőbe tartoznak" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Tiltott HTML címkék" @@ -882,7 +815,6 @@ msgstr "Hibás „{path}” finanszírozási fájl található a(z) „{name}” msgid "Found invalid appids in arguments" msgstr "Érvénytelen alkalmazásazonosítók találhatók az argumentumokban" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Egyes alkalmazásoknál érvénytelen versionCode paraméterek találhatók" @@ -948,16 +880,13 @@ msgstr "A git tisztítás sikertelen" msgid "Git fetch failed" msgstr "A git lekérés sikertelen" -#: ../fdroidserver/common.py -#, fuzzy -msgid "Git prune failed" -msgstr "A git helyreállítás sikertelen" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "A git távoli fej beállítás sikertelen: „%s”" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "A git helyreállítás sikertelen" @@ -1093,16 +1022,12 @@ msgstr "Érvénytelen VercodeOperation: {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "Érvénytelen VercodeOperation: {invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "Érvénytelen alkalmazásazonosító: {appid}" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "Érvénytelen logikai érték: „%s”" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Érvénytelen felsorolás" @@ -1314,7 +1239,6 @@ msgstr "Nem található aláíró-tanúsítvány itt: {path}" msgid "No such package: %s" msgstr "Nincs ilyen csomag: %s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1351,7 +1275,6 @@ msgstr "Nincs teendő a(z) {appid} alkalmazásnál." msgid "Now set these in config.yml:" msgstr "Most adja meg ezeket a config.yml fájlban:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1381,19 +1304,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "A grafikáknál csak PNG és JPEG formátum támogatott, ez található: {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Csak a különbségek kiírása Play Áruház esetén" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Csak az automatikus frissítésekkel rendelkező alkalmazások feldolgozása" @@ -1402,10 +1323,6 @@ msgstr "Csak az automatikus frissítésekkel rendelkező alkalmazások feldolgoz msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Az OpenCollective adományozási módok a OpenCollective: mezőbe tartoznak" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Beállítások" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "A JSON jelentés kiírása egy APK után elnevezett fájlba." @@ -1572,14 +1489,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Azon APK fájlok átnevezése, melyek nem illeszkednek a csomag.név_123.apk mintára" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Visszaállítás és teljesen új összeállítási kiszolgáló létrehozása, még akkor is, ha a meglévő rendben lévőnek tűnik." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1884,11 +1793,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1898,7 +1802,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "Ismeretlen kivétel észlelve!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1936,6 +1839,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1966,11 +1870,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Tárolóinformációk frissítése az új csomagoknál" @@ -1984,6 +1883,7 @@ msgstr "A bináris átláthatósági napló frissítése az URL-nél" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -2003,11 +1903,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2022,27 +1918,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Használat" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Használat: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2081,11 +1960,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2187,20 +2061,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "nem egyértelmű kapcsoló: %(option)s, ezekre illeszkedhet: %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "nem egyértelmű kapcsoló: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2214,11 +2079,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2229,8 +2096,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2249,7 +2114,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "„%(filename)s” nem nyitható meg: %(error)s" @@ -2263,14 +2128,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2289,14 +2150,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "komplex" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2327,10 +2180,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2355,8 +2204,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2374,8 +2221,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2383,20 +2228,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2409,10 +2248,6 @@ msgstr "fdroid [] [-h|--help|--version|]" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "lebegőpontos" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2425,8 +2260,6 @@ msgstr "git svn klónozás meghiúsult" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2441,35 +2274,21 @@ msgstr "az index-v1-nek kell legyen aláírása, használja az „fdroid signind msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "az index-v1-nek kell legyen aláírása, használja az `fdroid signindex` parancsot a létrehozásához!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2507,8 +2326,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "Most adja meg ezeket a config.yml fájlban:" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2527,30 +2344,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "nincs ilyen kapcsoló: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2560,72 +2362,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "a(z) -%s kapcsoló nem ismert" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "a(z) -%s kapcsolóhoz argumentum szükséges" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "a(z) --%s kapcsolóhoz argumentum szükséges" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "a(z) --%s kapcsoló nem egyedi előtag" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "a(z) --%s kapcsoló nem ismert" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "a(z) --%s kapcsolóhoz argumentum szükséges" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "nem kötelező argumentumok" - #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" @@ -2636,8 +2372,6 @@ msgstr "Beállítások" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "pozicionális argumentumok" @@ -2670,10 +2404,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2697,17 +2427,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "a programverzió megjelenítése és kilépés" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "ezen üzenet kiírása és kilépés" @@ -2741,8 +2461,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2752,22 +2470,16 @@ msgstr "a következő argumentumok szükségesek: %s" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "váratlan kapcsoló karakterlánc: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2778,9 +2490,7 @@ msgstr "nem felismert argumentumok: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "nem biztonságos jogosultságok ennél: „{config_file}” (0600-nak kellene lennie)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "használat: " @@ -2809,21 +2519,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2844,7 +2552,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2885,11 +2592,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index 3c5bdfbd..e6812a5d 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2024-10-04 04:26+0000\n" "Last-Translator: Doctorredits_here \n" "Language-Team: Indonesian \n" @@ -55,11 +55,6 @@ msgstr "\"local_copy_dir\" {path} tidak ada!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" sudah terpasang pada {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" berisi {name}({version}) kadaluarsa" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -85,16 +80,6 @@ msgstr "\"{path}\" ditandatangani oleh kunci yang tidak diperbolehkan:" msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" URL tudak valid!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "opsi %(option)s memerlukan argumen sebanyak %(number)d" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -110,14 +95,6 @@ msgstr "%d APK gagal ditandatangani atau diverifikasi!" msgid "%d problems found" msgstr "%d terdapat masalah" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [opsi]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -138,13 +115,6 @@ msgstr "%s checksum yg dihitung untuk file tersebut tidak cocok dengan yang diha msgid "%s is not an accepted build field" msgstr "%s bukan bidang build yang diterima" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "%s opsi tidak mengambil nilai" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' tidak ditemukan dalam config.yml!" @@ -165,8 +135,6 @@ msgstr "'keystorepass' tidak ditemukan dalam config.yml!" msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' tidak ditemukan dalam config.yml!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'diperlukan' adalah argumen yang tidak valid untuk posisi" @@ -180,11 +148,6 @@ msgstr "'sdk_path' belum diatur di config.yml!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' terlalu usang, fdroid memerlukan build-tools-{version} atau yang lebih baru!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' akan dalam urutan acak! Gunakan kurung () atau [] jika urutan tersebut penting!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -195,7 +158,7 @@ msgstr "'{path}' gagal dieksekusi!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' memiliki format yang tidak valid, seharusnya kamus!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' tidak valid pada {field} dalam {appid}. Pakem regex: {pattern}" @@ -214,8 +177,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate gagal untuk {appid} : {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() tidak didefinisikan" @@ -306,10 +267,6 @@ msgstr "Alat Android SDK {cmd} tidak ditemukan!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Aplikasi memiliki Biner tetapi tidak memiliki AllowedAPKSigningKeys yang sesuai untuk menyematkan sertifikat." -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "Aplikasi memiliki NoSource Since atau ArchivePolicy \"0 versi\" tetapi AutoUpdateMode atau UpdateCheckMode bukan Tidak Ada" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Aplikasi memiliki NoSource Since atau ArchivePolicy \"0 versi\" atau 0 tetapi AutoUpdateMode atau UpdateCheckMode bukan Tidak Ada" @@ -353,7 +310,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -408,11 +364,13 @@ msgstr[0] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -465,20 +423,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -498,6 +453,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -591,11 +547,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -652,11 +603,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -690,12 +636,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -840,10 +780,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -875,7 +811,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -940,15 +875,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1083,16 +1016,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1303,7 +1232,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1338,7 +1266,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1368,19 +1295,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1389,10 +1314,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Opsi" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1558,14 +1479,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Ubah nama berkas APK yang tidak sesuai dengan package.nama_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1865,11 +1778,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1879,7 +1787,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "Eksepsi tidak ditemukan!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1917,6 +1824,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1947,11 +1855,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Perbarui informasi repo untuk paket yang baru" @@ -1965,6 +1868,7 @@ msgstr "Perbarui log transparansi biner untuk URL" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1984,11 +1888,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2003,27 +1903,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Penggunaan" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Penggunaan: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2062,11 +1945,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2168,20 +2046,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opsi ambigu: %(option)s bisa sesuai dengan %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "opsi ambigu: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2195,11 +2064,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2210,8 +2081,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2230,7 +2099,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "tidak bisa dibuka '%(filename)s': %(error)s" @@ -2244,14 +2113,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2270,14 +2135,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "kompleks" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2307,10 +2164,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2335,8 +2188,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2354,28 +2205,20 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2388,10 +2231,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2404,8 +2243,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2419,35 +2256,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2485,8 +2308,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2505,30 +2326,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "tidak ada opsi: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2538,72 +2344,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "opsi -%s tidak dikenal" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "opsi -%s memerlukan argumen" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "opsi --%s harus tidak mengandung argumen" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "opsi --%s bukan prefiks unik" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "opsi --%s tidak dikenal" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "opsi --%s memerlukan argumen" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "argumen opsional" - #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" @@ -2614,8 +2354,6 @@ msgstr "Opsi" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "argumen posisi" @@ -2648,10 +2386,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2675,17 +2409,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "menampilkan nomor versi program dan keluar" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "menampilkan bantuan ini dan keluar" @@ -2719,8 +2443,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2730,22 +2452,16 @@ msgstr "argumen berikut ini diperlukan: %s" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "string opsi tak terduga: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2756,9 +2472,7 @@ msgstr "argumen tidak dikenal: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "izin tidak aman pada '{config_file}' (seharusnya 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "penggunaan: " @@ -2786,21 +2500,19 @@ msgstr[0] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2821,7 +2533,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2862,11 +2573,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index ed4cb6ae..78eda911 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -22,7 +22,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2025-03-20 16:21+0000\n" "Last-Translator: Champ0999 \n" "Language-Team: Italian \n" @@ -69,11 +69,6 @@ msgstr "La directory principale per \"local_copy_dir\" {path} non esiste!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" è già installato su {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" contiene {name} obsoleto ({version})" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -99,17 +94,6 @@ msgstr "\"{path}\" è firmato da una chiave non autorizzata:" msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" non è un URL valido!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "l'opzione %(option)s richiede l'argomento %(number)d" -msgstr[1] "l'opzione %(option)s richiede gli argomenti %(number)d" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -125,14 +109,6 @@ msgstr "" msgid "%d problems found" msgstr "trovati %d problemi" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [opzioni]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -153,13 +129,6 @@ msgstr "%s ha un SHA-256 errato: %s" msgid "%s is not an accepted build field" msgstr "%s non è un campo di build accettato" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "l'opzione %s non accetta un valore" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "\"keypass\" non trovato in config.yml!" @@ -180,8 +149,6 @@ msgstr "\"keystorepass\" non trovato in config.yml!" msgid "'repo_keyalias' not found in config.yml!" msgstr "\"repo_keyalias\" non trovato in config.yml!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "\"required\" è un argomento invalido per i posizionali" @@ -195,11 +162,6 @@ msgstr "\"sdk_path\" non impostato in config.yml!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' è troppo vecchio, fdroid richiede build-tools-{version} o più recente!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "\"{field}\" sarà in ordine casuale! Usa le parentesi () o [] se l'ordine è importante!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -210,7 +172,7 @@ msgstr "Esecuzione di \"{path}\" fallita!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' ha un formato non valido, dovrebbe essere un dizionario!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "\"{value}\" non è un {field} valido in {appid}. Espressione regolare: {pattern}" @@ -229,8 +191,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate fallito per {appid}:{error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() non definita" @@ -321,10 +281,6 @@ msgstr "Strumento Android SDK {cmd} non trovato!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "L'app ha Binaries ma non ha AllowedAPKSigningKeys corrispondente per fissare il certificato." -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "L'app ha NoSourceSince o ArchivePolicy \"0 versioni\" ma AutoUpdateMode o UpdateCheckMode non sono None" - #: ../fdroidserver/lint.py #, fuzzy msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" @@ -369,7 +325,6 @@ msgstr "Tipo di voce \"{mirrortype}\" errato nella configurazione dei mirror: {m msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Indirizzo URL base per il mirror, può includere la chiave di firma dell'indice utilizzando la query string: ?fingerprint=" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -425,11 +380,13 @@ msgstr[1] "Impossibile costruire a causa di errori con {} durante la scansione" msgid "Cannot rewrite \"{path}\"" msgstr "Impossibile riscrivere \"{path}\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "La categoria \"%s\" non è valida" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Le categorie non sono impostate" @@ -482,20 +439,17 @@ msgstr "Definizioni \"{field}\" in conflitto tra .yml e file localizzati:" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argomenti in conflitto: '--verbose' e '--quiet' non possono essere specificati contemporaneamente." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "File di configurazione in conflitto! Utilizzando {newfile}, ignorando {oldfile}!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Impossibile trovare \"{command}\" sul tuo sistema" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Impossibile trovare il codice della versione più recente" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Impossibile trovare il nome della versione più recente" @@ -515,6 +469,7 @@ msgstr "Impossibile aprire il file APK {path} per l'analisi: " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Impossibile analizzare la dimensione \"{size}\", tipo sbagliato \"{type}\"" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Impossibile trovare l'ID dell'applicazione" @@ -608,11 +563,6 @@ msgstr "La descrizione \"%s\" è solo il riassunto dell'app" msgid "Description has a duplicate line" msgstr "La descrizione ha una riga duplicata" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "La descrizione ha un elenco (%s) ma non è puntato (*) né numerato (#)" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -669,11 +619,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "Scarica mirror completi di piccoli repository" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "Scaricando %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Lo scaricamento del repository è gia fallito una volta, non verrà riprovato." @@ -707,14 +652,6 @@ msgstr "ERRORE: %(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERRORE: il sottocomando \"server\" è stato rimosso, usa \"deploy\"!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"ERRORE: questo comando non deve mai essere utilizzato per il mirror f-droid.org!\n" -"L’intero mirror di f-droid.org richiede più di 200GB." - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERRORE: tipo di CI non supportato, le patch sono benvenute!" @@ -861,10 +798,6 @@ msgstr "Il file è scomparso durante l'elaborazione: {path}" msgid "Finished" msgstr "Finito" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "I metodi di donazione di Flattr appartengono al campo FlattrID" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Tag HTML vietati" @@ -896,7 +829,6 @@ msgstr "Trovato file di finanziamento non valido \"{path}\" per \"{name}\":" msgid "Found invalid appids in arguments" msgstr "Trovati appid non validi negli argomenti" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Trovati codici di versione non validi per alcune app" @@ -961,15 +893,13 @@ msgstr "Git clean non riuscito" msgid "Git fetch failed" msgstr "Recupero Git non riuscito" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "Cancellazione Git non riuscita" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Set-head remoto Git non riuscito: \"%s\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Ripristino Git non riuscito" @@ -1105,16 +1035,12 @@ msgstr "VercodeOperation non valido: {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "VercodeOperation non valido: {invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "ID applicazione non valida {appid}" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "Valore booleano '%s' non valido" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Elenco puntato non valido" @@ -1325,7 +1251,6 @@ msgstr "Nessun certificato di firma trovato in {path}" msgid "No such package: %s" msgstr "Nessun pacchetto di questo tipo: %s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1360,7 +1285,6 @@ msgstr "Niente da fare per {appid}." msgid "Now set these in config.yml:" msgstr "Ora imposta i seguenti campi in config.yml:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1390,19 +1314,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Solo PNG e JPEG sono supportati per la grafica, trovati: {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Stampa solo le differenze con il Play Store" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Elabora solo app con aggiornamenti automatici" @@ -1411,10 +1333,6 @@ msgstr "Elabora solo app con aggiornamenti automatici" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "I metodi di donazione di OpenCollective appartengono al campo OpenCollective" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Opzioni" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Rapporto di uscita JSON al file chiamato dopo APK." @@ -1581,14 +1499,6 @@ msgstr "Rimozione di {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Rinomina i file APK che non corrispondono a package.name_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "La modalità di aggiornamento RepoTrunk ha senso solo nei repository git-svn" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Reimposta e crea un nuovo server di compilazione, anche se quello esistente sembra essere ok." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1898,11 +1808,6 @@ msgstr "Tag di licenza inaspettato \"{}\"! Usare solo tag approvati da FSF o OSI msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Tag di licenza inaspettato \"{}\"! Usa solo i tag di licenza configurati nel tuo file di configurazione" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "Destinazione collegamento simbolico inattesa: {link} -> {target}" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1912,7 +1817,6 @@ msgstr "Voce sconosciuta {key} in {configname}" msgid "Unknown exception found!" msgstr "Eccezione sconosciuta trovata!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1950,6 +1854,7 @@ msgstr "Campo dell'app non riconosciuto '{fieldname}' in '{path}'" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Flag di costruzione non riconosciuto '{build_flag}' in '{path}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1980,11 +1885,6 @@ msgstr "Percorso scandelete non utilizzato: %s" msgid "Unused scanignore path: %s" msgstr "Percorso scanignore non utilizzato: %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "Decomposizione in %s" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Aggiorna le informazioni del repository coi nuovi pacchetti" @@ -1998,6 +1898,7 @@ msgstr "Aggiorna il log di trasparenza binario con un nuovo URL" msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData ha un URL non valido: {url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -2017,12 +1918,7 @@ msgstr "UpdateCheckData non è un URL valido: {url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode impostato ma sembra che checkupdates non sia ancora stato eseguito." -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -#, fuzzy -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode impostato ma sembra che checkupdates non sia ancora stato eseguito." - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName è impostato sull'ID dell'applicazione nota, può essere rimosso" @@ -2037,28 +1933,11 @@ msgstr "Caricamento di {apkfilename} su androidobservatory.org" msgid "Uploading {apkfilename} to virustotal" msgstr "Caricamento di {apkfilename} su virustotal" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Uso" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Utilizzo: %s\n" - #: ../fdroidserver/lint.py #, fuzzy msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "Usare /HEAD invece di /master per puntare a un file nel ramo predefinito" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Usare /HEAD invece di /master per puntare a un file nel ramo predefinito" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Usa `fdroid update -c` per crearlo." @@ -2098,11 +1977,6 @@ msgstr "Usare la firma APK v2" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Utilizzando jarsigner di Java, non raccomandato per verificare APK! Utilizzare apksigner" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "Usando androguard da \"{path}\"" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2204,20 +2078,11 @@ msgstr "aggiungendo IdentityFile a {path}" msgid "adding to {name}: {path}" msgstr "aggiungendo a {name}: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opzione ambigua: %(option)s potrebbe corrispondere a %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "opzione ambigua: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2231,11 +2096,13 @@ msgstr "apksigner non trovato! Impossibile firmare o verificare gli APK moderni" msgid "apksigner not found, it's required for signing!" msgstr "apksigner non trovato, è necessario per la firma!" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "ID dell'applicazione del file su cui operare" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2246,8 +2113,6 @@ msgstr "ID dell'applicazione con versionCode opzionale nella forma APPID[:VERCOD msgid "archive_url needs to end with /archive" msgstr "archive_url deve terminare con /archive" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2266,7 +2131,7 @@ msgstr "tentativo di connessione SSH nuda per testare la chiave di distribuzione msgid "can not parse scrlib spec (not a string): '{}'" msgstr "impossibile analizzare le specifiche scrlib (non una stringa): '{}'" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "impossibile aprire '%(filename)s': %(error)s" @@ -2280,14 +2145,10 @@ msgstr "impossibile aprire l'url non-https: '{};" msgid "cannot find required srclibs: \"{path}\"" msgstr "impossibile trovare srclibs richiesto: \"{path}\"" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "impossibile avere più argomenti subparser" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2306,14 +2167,6 @@ msgstr "clonazione {url}" msgid "commands from plugin modules:" msgstr "dai moduli dei plugin:" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "complesso" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2345,10 +2198,6 @@ msgstr "non ha potuto analizzare la specifica srclib (nessun riferimento specifi msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "non ha potuto analizzare la specifica srclib (nessun riferimento specificato): '{}'" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "non ha potuto analizzare la specifica srclib (troppi segni '@'): '{}'" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2373,8 +2222,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "log di processo distribuito {path} a {dest}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2392,8 +2239,6 @@ msgstr "scaricamento delle firme dello scanner da '{}' fallito" msgid "executable binary, possibly code" msgstr "binario eseguibile, eventualmente codice" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2401,20 +2246,14 @@ msgid_plural "expected %s arguments" msgstr[0] "atteso %s argomento" msgstr[1] "atteso %s argomenti" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "si aspettava almeno un argomento" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "atteso al massimo un argomento" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "atteso un argomento" @@ -2427,10 +2266,6 @@ msgstr "fdroid [] [-h|--help|--version|]" msgid "fetch the latest version of signatures from the web" msgstr "recupera l'ultima versione delle firme dal web" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "in virgola mobile" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "forza gli errori di metadati (predefinito) come avvisi, o da ignorare." @@ -2443,8 +2278,6 @@ msgstr "git svn clone fallito" msgid "gzip file archive" msgstr "archivio file gzip" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2458,35 +2291,21 @@ msgstr "index-v1 deve avere una firma, usa `fdroid signindex` per crearla!" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 deve avere una firma, usa `fdroid signindex` per crearla!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "intero" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valore %(type)s non valido: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "scelta non valida: %(value)r (scegliere tra %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valore di risoluzione dei conflitti non valido: %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2524,8 +2343,6 @@ msgstr "il mirror '%s' non finisce con 'fdroid'!" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "gli argomenti che si escludono a vicenda devono essere opzionali" @@ -2544,30 +2361,15 @@ msgstr "nessuna \"icona\" in {appid}" msgid "no APK supplied" msgstr "nessun APK fornito" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "opzione inesistente: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "nessuna informazione sulla versione è stata trovata!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "nessuna informazione sulla versione trovata" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "non consentito con argomento %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2577,72 +2379,6 @@ msgstr "uno degli argomenti %s è richiesto" msgid "only accepts strings, lists, and tuples" msgstr "accetta solo stringhe, liste e tuple" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "opzione %s: Se volete davvero installare tutte le app firmate, usate --all" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "opzione %s: valore %s non valido: %r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "opzione %s: scelta non valida: %r (scegliere da %s)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "opzione -%s non riconosciuta" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "l'opzione -%s richiede degli argomenti" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "l'opzione --%s non deve avere argomenti" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "l'opzione --%s non ha un prefisso univoco" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "opzione --%s non riconosciuta" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "l'opzione --%s richiede un argomento" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "argomenti facoltativi" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "opzioni" @@ -2652,8 +2388,6 @@ msgstr "opzioni" msgid "overwriting existing {path}" msgstr "sovrascrivendo il {path} esistente" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "argomenti posizionali" @@ -2686,10 +2420,6 @@ msgstr "Il repo_url deve terminare con /repo" msgid "rsync is missing or broken: {error}" msgstr "rsync è assente o non funziona: {error}" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "ruamel.yaml non installato, non può scrivere metadati." - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2713,17 +2443,7 @@ msgstr "" msgid "shared library" msgstr "libreria condivisa" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "mostra il numero di versione del programma ed esci" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "mostra questo messaggio di aiuto ed esci" @@ -2757,8 +2477,6 @@ msgstr "libreria statica" msgid "supplied reference binary has allowed signer {signer}" msgstr "il binario di riferimento fornito ha il firmatario autorizzato {signer}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2768,22 +2486,16 @@ msgstr "i seguenti argomenti sono obbligatori: %s" msgid "true" msgstr "vero" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "stringa di opzioni inaspettata: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "parser sconosciuto %(parser_name)r (scelte: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2794,9 +2506,7 @@ msgstr "argomenti sconosciuti: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "permessi su \"{config_file}\" insicuri (dovrebbero essere 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "utilizzo: " @@ -2825,21 +2535,19 @@ msgstr[1] "{0} applicazioni, {1} alias chiave" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) non ha metadati!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} ha più file {name}, sembra un exploit di Master Key!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "L'AndroidManifest.xml di {apkfilename} ha una data non corretta: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} non ha un nome! Usa invece l'ID dell'applicazione." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2860,7 +2568,6 @@ msgstr "{appid} ha sia APK che file: {files}" msgid "{appid} is missing {name}" msgstr "{appid} manca {name}" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2901,11 +2608,6 @@ msgstr "{file} è vuoto o corrotto!" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" non esiste! Controlla \"config.yml\"." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile} è deprecato, usa {newfile}" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index fd9b2186..73fdb6bd 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2025-02-08 06:22+0000\n" "Last-Translator: Liner Seven \n" "Language-Team: Japanese \n" @@ -55,11 +55,6 @@ msgstr "\"local_copy_dir\" {path} は存在しません!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "「{apkfilename}」はすでに{dev}にインストールされています。" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "「{path}」は古くなった{name}({version})を含んでいます" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -85,16 +80,6 @@ msgstr "「{path}」は許可されていない鍵で署名されています: msgid "\"{url}\" is not a valid URL!" msgstr "「{url}」は正しいURLではありません!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "%(option)sのオプションは%(number)d個の引数が必要です" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -110,14 +95,6 @@ msgstr "%d個のAPKが署名されておらず検証できませんでした!" msgid "%d problems found" msgstr "%d個の問題が見つかりました" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [オプション]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -138,13 +115,6 @@ msgstr "%sのSHA-256は誤っています:%s" msgid "%s is not an accepted build field" msgstr "%sは承認されたビルドフィールドではありません" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "%sのオプションに値を設定することはできません" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "「keypass」がconfig.ymlにありません!" @@ -165,8 +135,6 @@ msgstr "「keystorepass」がconfig.ymlにありません!" msgid "'repo_keyalias' not found in config.yml!" msgstr "「repo_keyalias」がconfig.ymlにありません!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "「required」は位置についての引数としては正しくありません" @@ -180,11 +148,6 @@ msgstr "「sdk_path」がconfig.ymlで設定されていません!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "「{aapt}」は古すぎます。fdroidはbuild-tools-{version}またはそれ以降が必要です!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "「{field}」の順番はランダムです!順番が重要な場合は () または [] の括弧を使用してください!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -195,7 +158,7 @@ msgstr "「{path}」を実行できませんでした!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "「{path}」は正しいフォーマットではありません。辞書を指定してください!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "「{value}」は {appid}の正しい{field}ではありません。正規表現のパターンは {pattern}" @@ -214,8 +177,6 @@ msgstr "--merge-requestは単一のappidでのみ実行されます!" msgid "...checkupdate failed for {appid} : {error}" msgstr "…{appid}についてcheckupdateを実行できませんでした:{error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() は定義されていません" @@ -306,10 +267,6 @@ msgstr "AndroidのSDKツール {cmd} が見つかりません!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "アプリにはバイナリーがありますが、それに対応する、証明書の固定用のAllowedAPKSigningKeysがありません。" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "アプリにNoSourceSinceまたは、\"0 versions\"のArchivePolicyが設定されていますが、AutoUpdateModeまたはUpdateCheckModeはNoneに設定されていません" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "アプリにNoSourceSinceまたは、\"0 versions\"か0のArchivePolicyが設定されていますが、AutoUpdateModeまたはUpdateCheckModeはNoneに設定されていません" @@ -353,7 +310,6 @@ msgstr "正しくないエントリーの種類「{mirrortype}」がミラーの msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "ミラーのベースURLにはクエリーの文字列 ?fingerprint= を使ってインデックスの署名鍵を含めることができます。" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -408,11 +364,13 @@ msgstr[0] "スキャン時に{}個のエラーが発生したためビルドで msgid "Cannot rewrite \"{path}\"" msgstr "「{path}」を書き換えられません" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "「%s」のカテゴリーは正しくありません" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "カテゴリーが設定されていません" @@ -465,20 +423,17 @@ msgstr "「{field}」の定義が.ymlと翻訳済の間で矛盾しています msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "引数が矛盾しています:「--verbose」と「--quiet」を同時に設定することはできません。" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "設定ファイルが矛盾しています。{newfile}を使用し、{oldfile}は無視します!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "システム上で「{command}」が見つかりませんでした" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "最新のバージョンコードが見つかりませんでした" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "最新のバージョン名が見つかりませんでした" @@ -498,6 +453,7 @@ msgstr "分析用にAPK {path} を開くことができませんでした: " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "サイズ「{size}」をパースできませんでした。種類「{type}」が正しくありません" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "アプリケーションIDが見つかりませんでした" @@ -591,11 +547,6 @@ msgstr "説明文「%s」がアプリの要約と同一です" msgid "Description has a duplicate line" msgstr "説明文に重複する行があります" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "説明文に一覧がありますが(%s)、一覧は箇条書き(*)でも番号付き(#)でもありません" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -652,11 +603,6 @@ msgstr "ネットワークへの情報漏洩が少ないミラーを使用して msgid "Download complete mirrors of small repos" msgstr "小さいリポジトリのミラーを完全にダウンロード" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "%sのダウンロード" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "リポジトリのダウンロードは既に一度失敗しているので、再試行は行いません。" @@ -690,14 +636,6 @@ msgstr "エラー:%(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "エラー:「server」のサブコマンドは削除されました。「deploy」を使用してください!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"エラー:このコマンドで f-droid.org のミラーリングを行わないでください!\n" -"f-droid.org の完全なミラーリングには200GB以上が必要となります。" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "エラー:サポートされていない種類のCIです。パッチを歓迎します!" @@ -844,10 +782,6 @@ msgstr "ファイルが処理中に消去されました:{path}" msgid "Finished" msgstr "終了" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Flattrによる寄付の方法は、FlattrID: フィールドに属します" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "禁止されているHTMLのタグ" @@ -879,7 +813,6 @@ msgstr "「{name}」の不正な調達用ファイル「{path}」が見つかり msgid "Found invalid appids in arguments" msgstr "引数に不正なappidがあります" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "いくつかのアプリのバージョンコードが正しくありません" @@ -944,15 +877,13 @@ msgstr "Git cleanを実行できませんでした" msgid "Git fetch failed" msgstr "Git fetchを実行できませんでした" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "Git pruneを実行できませんでした" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git remoteでset-headを実行できませんでした:\"%s\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Git resetを実行できませんでした" @@ -1087,16 +1018,12 @@ msgstr "不正なVercodeOperationです:{field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "不正なVercodeOperationです:{invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "不正なアプリケーションIDです {appid}" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "不正なブール値です '%s'" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "不正な箇条書きリストです" @@ -1307,7 +1234,6 @@ msgstr "{path}で署名用の証明書が見つかりません" msgid "No such package: %s" msgstr "そのようなパッケージはありません:%s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1342,7 +1268,6 @@ msgstr "{appid}について実行することは何もありません。" msgid "Now set these in config.yml:" msgstr "これらをconfig.ymlに設定してください:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1372,19 +1297,17 @@ msgstr "「github_releases」の設定項目の1つに「projectUrl」の値が msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "「github_releases」の設定項目の1つに「token」の値が設定されていません。スキップします…" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "画像にはPNGとJPEGのみをサポートします。これが見つかりました:{path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Play Storeとの違いのみを出力" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "自動アップデートのアプリのみを処理" @@ -1393,10 +1316,6 @@ msgstr "自動アップデートのアプリのみを処理" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "OpenCollectiveの寄付の方法はOpenCollective: フィールドに属します" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "オプション" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "APKに従った名前のファイルでJSONのレポートを出力。" @@ -1562,14 +1481,6 @@ msgstr "{path} を削除" msgid "Rename APK files that do not match package.name_123.apk" msgstr "package.name_123.apkに合致しないAPKファイルの名前を変更" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "RepoTrunkのアップデートモードはgit-svnのリポジトリでのみ機能します" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "既存のサーバーに問題がない場合でも、サーバーをリセットして新しいビルド用サーバーを作成。" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1876,11 +1787,6 @@ msgstr "予期されていないライセンスタグ「{}」です!https://sp msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "予期しないライセンスタグ「{}」です!設定ファイルで設定されたライセンスタグのみを使用してください" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "予期していないsymlinkのターゲットです:{link} → {target}" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1890,7 +1796,6 @@ msgstr "{configname}の不明なエントリー {key} です" msgid "Unknown exception found!" msgstr "不明な例外が発生しました!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1928,6 +1833,7 @@ msgstr "「{path}」に未認識のアプリのフィールド「{fieldname}」 msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "認識されないビルド用のオプション「{build_flag}」が「{path}」にあります" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1958,11 +1864,6 @@ msgstr "使われていないscandeleteのパス:%s" msgid "Unused scanignore path: %s" msgstr "使われていないscanignoreのパス:%s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "%sに解凍しています" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "新しいパッケージに関するリポジトリの情報を更新" @@ -1976,6 +1877,7 @@ msgstr "URLに関するバイナリーの透明性のログを更新" msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckDataのURLが正しくありません:{url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1995,11 +1897,7 @@ msgstr "UpdateCheckDataは正しいURLではありません:{url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckModeが設定されていますがcheckupdatesがまだ実行されていないようです。" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckModeが設定されていますがlikecheckupdatesが実行されていないようです" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckNameが既知のアプリケーションIDに設定されています。これは削除できます" @@ -2014,27 +1912,10 @@ msgstr "{apkfilename}をandroidobservatory.orgにアップロードしていま msgid "Uploading {apkfilename} to virustotal" msgstr "{apkfilename}をvirustotalにアップロードしています" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "使い方" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "使い方: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "既定のブランチでファイルを指定する際に /master または /main の代わりに /HEADを使用" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "既定のブランチでファイルを指定する際に /master の代わりに /HEADを使用" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "`fdroid update -c`で作成。" @@ -2073,11 +1954,6 @@ msgstr "JAR署名を使用" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "JavaのjarsignerでAPKを検証することは推奨されません!apksignerを使ってください" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "「{path}」のandroguardを使用" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2179,20 +2055,11 @@ msgstr "IdentityFileを{path}に追加" msgid "adding to {name}: {path}" msgstr "{name}: {path} に追加" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "オプションが曖昧です。%(option)sは%(matches)sに一致しませんでした" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "オプションが曖昧です:%s(%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2206,11 +2073,13 @@ msgstr "apksignerが見つかりません!最近のAPKに署名を行ったり msgid "apksigner not found, it's required for signing!" msgstr "apksignerが見つかりません。署名を行うには必要です!" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "実行用のファイルのアプリケーションID" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2221,8 +2090,6 @@ msgstr "APPID[:VERCODE] 形式でversionCodeを指定した(オプション) msgid "archive_url needs to end with /archive" msgstr "archive_url は /archive で終了する必要があります" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2241,7 +2108,7 @@ msgstr "SSH接続でデプロイ用の鍵をテストします。" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "srclibの規定をパースできません(文字列ではありません):'{}'" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "「%(filename)s」を開けません:%(error)s" @@ -2255,14 +2122,10 @@ msgstr "HTTPSでないURLは開けません:'{};" msgid "cannot find required srclibs: \"{path}\"" msgstr "必要なsrclibsが見つかりません:「{path}」" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "サブパーサーの複数の引数を指定することはできません" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2281,14 +2144,6 @@ msgstr "{url}のcloneを行います" msgid "commands from plugin modules:" msgstr "プラグインモジュールのコマンド:" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "コンプレックス" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2318,10 +2173,6 @@ msgstr "srclibの規定をパースできませんでした(名前が指定さ msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "srclibの規定をパースできませんでした(refが指定されていません):'{}'" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "srclibの規定をパースできませんでした(「@」が多すぎます):'{}'" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2346,8 +2197,6 @@ msgstr "ロックの存在しない依存ファイル" msgid "deployed process log {path} to {dest}" msgstr "{path}の処理ログを{dest}に設定しました" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2365,28 +2214,20 @@ msgstr "スキャナーの署名を'{}'からダウンロードできません msgid "executable binary, possibly code" msgstr "実行可能なバイナリー、おそらくコードです" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "%s個の引数が必要" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "1つ以上の引数が必要です" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "多くても1つの引数が必要です" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "1つの引数が必要です" @@ -2399,10 +2240,6 @@ msgstr "fdroid [] [-h|--help|--version|]" msgid "fetch the latest version of signatures from the web" msgstr "ウェブから署名の最新のバージョンを取得" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "浮動小数点" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "メタデータのエラー(既定)を警告として扱うよう強制するか、無視するよう強制。" @@ -2415,8 +2252,6 @@ msgstr "git svn clone を実行できませんでした" msgid "gzip file archive" msgstr "gzipファイルアーカイブ" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2430,35 +2265,21 @@ msgstr "index-v1には署名が必要です。`fdroid signindex`で署名を作 msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2には署名が必要です。`fdroid signindex`で署名を作成してください!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "整数" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "%(type)sの値が不正です:%(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "不正な選択です:%(value)r(%(choices)sから選択してください)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "conflict_resolutionの値が不正です:%r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2496,8 +2317,6 @@ msgstr "ミラー「%s」は「fdroid」で終わっていません!" msgid "mirrors set twice, in config.yml and {path}!" msgstr "config.ymlと{path}で2回ミラーが設定されています!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "相互に排他的な引数はオプションとしてください" @@ -2516,30 +2335,15 @@ msgstr "{appid}に「アイコン」がありません" msgid "no APK supplied" msgstr "APKが指定されていません" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "そうしたオプションはありません:%s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "バージョンの情報が見つかりません!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "バージョンの情報が見つかりません" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "引数 %s は許可されていません" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2549,72 +2353,6 @@ msgstr "引数 %s の1つが必要です" msgid "only accepts strings, lists, and tuples" msgstr "文字列、リスト、タプルのみが許可" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "オプション %s:全ての署名済のアプリを本当にインストールしたい場合は、--allを使ってください" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "オプション %s:不正 %s 値:%r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "オプション %s:選択が正しくありません:%r(%sから選択してください)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "オプション -%s は認識されません" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "オプション -%s は引数が必要です" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "オプション --%s に引数は指定できません" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "オプション --%s は一意のプリフィックスではありません" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "オプション --%s は認識されません" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "オプション --%s には引数が必要です" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "オプションの引数" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "オプション" @@ -2624,8 +2362,6 @@ msgstr "オプション" msgid "overwriting existing {path}" msgstr "既存の{path}を上書きします" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "位置に関する引数" @@ -2658,10 +2394,6 @@ msgstr "repo_urlは/repoで終わる必要があります" msgid "rsync is missing or broken: {error}" msgstr "rsyncが無いか壊れています:{error}" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "ruamel.yamlがインストールされていません。メタデータを書き込めません。" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2685,17 +2417,7 @@ msgstr "serverwebroot: パスが「fdroid」で終わっていません。もし msgid "shared library" msgstr "共有ライブラリー" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "プログラムのバージョン番号を表示して終了" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "このヘルプメッセージを表示して終了" @@ -2729,8 +2451,6 @@ msgstr "静的ライブラリー" msgid "supplied reference binary has allowed signer {signer}" msgstr "指定された参照バイナリーには許可された署名者 {signer} がいます" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2740,22 +2460,16 @@ msgstr "次の引数が必要です:%s" msgid "true" msgstr "true" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "予期しないオプションの文字列です:%s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "不明なパーサー %(parser_name)r(選択肢:%(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2766,9 +2480,7 @@ msgstr "認識されない引数です:%s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "「{config_file}」のパーミッションが安全ではありません(0600に設定すべきです)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "使い方: " @@ -2796,21 +2508,19 @@ msgstr[0] "{0}個のアプリ、{1}個の鍵のエイリアス" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename}({appid})にメタデータがありません!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename}に複数の{name}のファイルがあります。マスターキーが悪用されているようです!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "{apkfilename}のAndroidManifest.xmlの日付が正しくありません: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid}には名前が設定されていません!アプリケーションIDを代わりに使用します。" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2831,7 +2541,6 @@ msgstr "{appid}にはAPKとファイルの両方があります:{files}" msgid "{appid} is missing {name}" msgstr "{appid}には{name}がありません" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2872,11 +2581,6 @@ msgstr "{file}は空か壊れています!" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name}「{section}/icons/{path}」がありません!「config.yml」を確認してください。" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile}は非推奨です。{newfile}を使用してください" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index dc4815ef..8c1b52d5 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2021-01-15 13:25+0000\n" "Last-Translator: R_SACI \n" "Language-Team: Kabyle \n" @@ -50,11 +50,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" yebded yakan ɣef {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -80,17 +75,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" mačči d aseɣwen URL ameɣtu!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -106,14 +90,6 @@ msgstr "" msgid "%d problems found" msgstr "%d n wuguren ttwafen" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [d afrayan]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -134,13 +110,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' ulac-it di config.yml!" @@ -161,8 +130,6 @@ msgstr "'keystorepass' ulac-it di config.yml!" msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' ulac-it deg config.yml!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' d taɣiret ur iṣeḥḥan ara i usideg" @@ -176,11 +143,6 @@ msgstr "'sdk_path' ur yettwasbadu ara 'config.yml'!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' d aqbuṛ, fdroid yesra build-tools-{version} neɣ amaynut!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' ad yili s usmizzwer agacuran ! Seqdec () neɣ tuccar [] ma yella ilaq usmizzwer!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -191,7 +153,7 @@ msgstr "'{path}' ur izmir ara ad yettwaselkem!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -210,8 +172,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "...anadi n ileqman ur yeddi ara i {appid} : {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() ur yettwasbadu ara" @@ -302,10 +262,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -349,7 +305,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -405,11 +360,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -462,20 +419,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "D awezɣi tifin n '{command}' deg unagraw-ik.im" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Ur izmir ara ad d-yaf isem n lqem aneggaru" @@ -495,6 +449,7 @@ msgstr "Ur yezmir ara ad d-yeldi afaylu APK {path} i tesleḍt: " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -589,11 +544,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -650,11 +600,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -688,12 +633,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -838,10 +777,6 @@ msgstr "" msgid "Finished" msgstr "Immed" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Ticraḍ HTML yettwagedlen" @@ -873,7 +808,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -938,16 +872,13 @@ msgstr "Asfaḍ Git yecceḍ" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -#, fuzzy -msgid "Git prune failed" -msgstr "Asfaḍ Git yecceḍ" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1083,16 +1014,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "Asulay n usnas d arameɣtu {appid}" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Tabdart s tneqqiḍin tarameɣtut" @@ -1303,7 +1230,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1338,7 +1264,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1368,19 +1293,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1389,10 +1312,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Tixtiṛiyin" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1558,14 +1477,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1866,11 +1777,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1880,7 +1786,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "Tettwaf tsureft d tarussint!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1918,6 +1823,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1948,11 +1854,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -1966,6 +1867,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1985,11 +1887,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2004,27 +1902,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Aseqdec" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Aseqdec: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2063,11 +1944,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2169,20 +2045,11 @@ msgstr "timerniwt n ufaylu n tmagit ɣer {path}" msgid "adding to {name}: {path}" msgstr "timerniwt ɣer {name}: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2196,11 +2063,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2211,8 +2080,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2231,7 +2098,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" @@ -2245,14 +2112,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2271,14 +2134,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2309,10 +2164,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2337,8 +2188,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2356,8 +2205,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2365,20 +2212,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2391,10 +2232,6 @@ msgstr "fdroid [] [-h|--tallelt|--lqem|]" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2407,8 +2244,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2422,35 +2257,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "amḍan ummid" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2488,8 +2309,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2508,30 +2327,15 @@ msgstr "ulac \"tignit\" deg {appid}" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2541,72 +2345,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "Taxtiṛt -%s ur tettwassen ara" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "Taxtiṛt -%s yesra afakul" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "aɣewwar --%s yessefk ad yesεu tiɣiret" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "" - #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" @@ -2617,8 +2355,6 @@ msgstr "Tixtiṛiyin" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "" @@ -2651,10 +2387,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2678,17 +2410,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "" @@ -2722,8 +2444,6 @@ msgstr "tamkerḍit n tdaddanin" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2733,22 +2453,16 @@ msgstr "" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2759,9 +2473,7 @@ msgstr "" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "aqseqdac: " @@ -2790,21 +2502,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2825,7 +2535,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2866,11 +2575,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index 0230368d..12e48702 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2024-09-06 14:57+0000\n" "Last-Translator: Cxnfl1ct \n" "Language-Team: Korean \n" @@ -54,11 +54,6 @@ msgstr "Android SDK 경로 '{path}'는 존재하지 않습니다!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\"는 이미 {dev}에 설치되어 있습니다." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\"는 오래된 {name} ({version})를 포함합니다" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -84,16 +79,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\"은 올바른 URL이 아닙니다!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "%(option)s 옵션은 %(number)d 인자가 필요합니다" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -109,14 +94,6 @@ msgstr "" msgid "%d problems found" msgstr "문제 %d개를 찾음" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [옵션]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -137,13 +114,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "%s는 빌드 필드 값으로 허용되지 않습니다" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "%s 옵션은 값을 받지 않습니다" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass'를 config.yml에서 찾을 수 없습니다!" @@ -164,8 +134,6 @@ msgstr "'keystorepass'를 config.yml에서 찾을 수 없습니다!" msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias'를 config.yml에서 찾을 수 없습니다!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required'는 고정적을 위한 잘못된 인수입니다" @@ -179,11 +147,6 @@ msgstr "'sdk_path'가 config.yml에서 설정되어 있지 않습니다!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}'는 너무 오래되었습니다, fdroid는 build-tools-{version} 이후가 필요합니다!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}'는 순서가 무작위로 변합니다! 순서가 중요하면 괄호 ()나 대괄호 []를 사용하세요!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -194,7 +157,7 @@ msgstr "'{path}'를 실행하는 데 실패했습니다!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}'는 {appid}에서 올바른 {field}가 아닙니다. 정규식 패턴: {pattern}" @@ -213,8 +176,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "...{appid}를 위한 checkupdate가 실패됨 : {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__()이 정의되지 않음" @@ -305,10 +266,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -352,7 +309,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -407,11 +363,13 @@ msgstr[0] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "카테고리 '%s'는 올바르지 않습니다" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "카테고리가 설정되어 있지 않습니다" @@ -464,20 +422,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -497,6 +452,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -590,11 +546,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -651,11 +602,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -689,12 +635,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -839,10 +779,6 @@ msgstr "" msgid "Finished" msgstr "마침" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -874,7 +810,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -939,16 +874,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -#, fuzzy -msgid "Git prune failed" -msgstr "git svn 복제에 실패됨" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1084,16 +1016,12 @@ msgstr "잘못된 Vercode연산: {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "잘못된 VercodeOperation연산: {invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "올바르지 않은 부울 '%s'" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "잘못된 글머리 기호 목록" @@ -1304,7 +1232,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1340,7 +1267,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1370,19 +1296,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "PNG와 JPEG만 그래픽을 위해 지원됩니다, 찾았습니다: {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1391,10 +1315,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "옵션" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1560,14 +1480,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "package.name_123.apk와 일치하지 않는 APK 파일의 이름을 바꿉니다" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1867,11 +1779,6 @@ msgstr "잘못된 라이선스 태그 \"{}\"! https://spdx.org/license-list 에 msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1881,7 +1788,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "알 수 없는 예외가 찾아졌습니다!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1919,6 +1825,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1949,11 +1856,6 @@ msgstr "사용되지 않은 스캔삭제 경로: %s" msgid "Unused scanignore path: %s" msgstr "사용되지 않은 스캔삭제 경로: %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "새 패키지를 위한 저장소 정보를 업데이트합니다" @@ -1967,6 +1869,7 @@ msgstr "URL을 위한 바이너리 투명성 기록을 업데이트합니다" msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData에 올바르지 않은 URL이 있습니다: {url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1986,11 +1889,7 @@ msgstr "UpdateCheckData는 올바른 URL이 아닙니다: {url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2005,27 +1904,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "사용법" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "사용법: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "그것을 만드려면 `fdroid update -c`를 사용하세요." @@ -2064,11 +1946,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Java의 jarsigner를 사용하여, APK를 검증하는 것은 권장되지 않습니다! apksigner를 사용하세요" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "\"{path}\"에서 androguard를 사용 중" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2170,20 +2047,11 @@ msgstr "{path}에 IdentityFile을 추가 중" msgid "adding to {name}: {path}" msgstr "{name}에 추가 중: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "모호한 옵션: %(option)s은 %(matches)s와 일치했을 수 있습니다" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "모호한 옵션: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2197,11 +2065,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "작업할 파일의 애플리케이션 ID" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2212,8 +2082,6 @@ msgstr "양식 APPID[:VERCODE]에서 선택적인 versionCode로 된 애플리 msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2232,7 +2100,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "'%(filename)s'를 열 수 없습니다: %(error)s" @@ -2246,14 +2114,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2272,14 +2136,6 @@ msgstr "{url}를 복제 중" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "복잡한" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2309,10 +2165,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2337,8 +2189,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2356,28 +2206,20 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2390,10 +2232,6 @@ msgstr "fdroid [<명령>] [-h|--help|--version|<인수>]" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "부동소수점" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "경고하거나 무시되는 강제 메타데이터 오류 (기본값)." @@ -2406,8 +2244,6 @@ msgstr "git svn 복제에 실패됨" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2422,35 +2258,21 @@ msgstr "index-v1은 서명이 있어야 합니다, 그것을 만드려면 `fdroi msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1은 서명이 있어야 합니다, 그것을 만드려면 `fdroid signindex`를 사용하세요!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "정수" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "올바르지 않은 %(type)s 값: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "올바르지 않은 선택: %(value)r (%(choices)s에서 선택하세요)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "올바르지 않은 conflict_resolution 값: %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2488,8 +2310,6 @@ msgstr "미러 '%s'는 'fdroid'로 끝나지 않습니다!" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2508,30 +2328,15 @@ msgstr "{appid}에 \"icon\"이 없습니다" msgid "no APK supplied" msgstr "제공된 APK가 없습니다" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "이러한 옵션이 없습니다: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "버전 정보를 찾지 못했습니다!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "버전 정보를 찾지 못했습니다" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2541,72 +2346,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "옵션 %s: 당신이 정말 모든 서명된 앱을 설치하기를 원한다면, --all을 사용하세요" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "옵션 %s: 올바르지 않은 %s 값: %r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "옵션 %s: 올바르지 않은 선택: %r (%s에서 선택하세요)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "옵션 -%s은 인식되지 않습니다" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "옵션 -%s은 인수가 필요합니다" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "옵션 --%s은 인수를 가지지 않아야 합니다" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "옵션 --%s는 고유한 접두어가 아닙니다" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "옵션 --%s은 인식되지 않습니다" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "옵션 --%s은 인수가 필요합니다" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "선택적 인수" - #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" @@ -2617,8 +2356,6 @@ msgstr "옵션" msgid "overwriting existing {path}" msgstr "기존 {path}를 덮어쓰는 중" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "고정적 인수" @@ -2651,10 +2388,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2678,17 +2411,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "프로그램의 버전 번호를 보여주고 종료합니다" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "이 도움말 메시지를 보여주고 종료합니다" @@ -2722,8 +2445,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2733,22 +2454,16 @@ msgstr "다음 인수들이 필요합니다: %s" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "예기치 않은 옵션 문자열: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "알 수 없는 파서 %(parser_name)r (선택: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2759,9 +2474,7 @@ msgstr "인식할 수 없는 인수: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "'{config_file}'에 안전하지 않은 권한 (0600이어야 합니다)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "사용법: " @@ -2789,21 +2502,19 @@ msgstr[0] "앱 {0}개, 키 별칭 {1}개" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid})에 메타데이터가 없습니다!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "{apkfilename}의 AndroidManifest.xml에 잘못된 날짜가 있습니다: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid}는 이름을 가지지 않습니다! 대신 애플리케이션 ID를 사용." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2824,7 +2535,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "{appid}는 없는 {name}입니다" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2865,11 +2575,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\"는 존재하지 않습니다! \"config.yml\"을 확인하세요." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/lv/LC_MESSAGES/fdroidserver.po b/locale/lv/LC_MESSAGES/fdroidserver.po index de6d9cb2..74cead5f 100644 --- a/locale/lv/LC_MESSAGES/fdroidserver.po +++ b/locale/lv/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2025-03-21 08:46+0000\n" "Last-Translator: Edgars Andersons \n" "Language-Team: Latvian \n" @@ -49,11 +49,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -79,17 +74,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -105,14 +89,6 @@ msgstr "" msgid "%d problems found" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [iespējas]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -133,13 +109,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "" @@ -160,8 +129,6 @@ msgstr "" msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -175,11 +142,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -190,7 +152,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -209,8 +171,6 @@ msgstr "--merge-request darbojas tikai ar vienu appid." msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr "" @@ -301,10 +261,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -348,7 +304,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -404,11 +359,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -461,20 +418,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -494,6 +448,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -587,11 +542,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -648,11 +598,6 @@ msgstr "Lejupielādēt F-Droid.apk no spoguļserveriem, kas tīklā nopludina ma msgid "Download complete mirrors of small repos" msgstr "Lejupielādēt pilnīgu mazu glabātavu spoguļojumu" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "Lejupielādē %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Glabātavas lejupielāde jau vienreiz neizdevās, tas atkārtoti netiks mēģināts." @@ -686,12 +631,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -836,10 +775,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -871,7 +806,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -936,15 +870,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1079,16 +1011,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1299,7 +1227,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1334,7 +1261,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1364,19 +1290,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "Pieņem tikai vienas atslēgas \"env\"" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Drukāt tikai atšķirības no Play Store" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Apstrādāt tikai lietotnes ar automātiskajiem atjauninājumiem" @@ -1385,10 +1309,6 @@ msgstr "Apstrādāt tikai lietotnes ar automātiskajiem atjauninājumiem" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1554,14 +1474,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1862,11 +1774,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1876,7 +1783,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1914,6 +1820,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1944,11 +1851,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -1962,6 +1864,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1981,11 +1884,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2000,27 +1899,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2059,11 +1941,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2165,20 +2042,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2192,11 +2060,13 @@ msgstr "apksigner nav atrasts. Nevar parakstīt vai apliecināt mūsdienīgus AP msgid "apksigner not found, it's required for signing!" msgstr "apksigner nav atrasts, tas ir nepieciešams parakstīšanai." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2207,8 +2077,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2227,7 +2095,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" @@ -2241,14 +2109,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2267,14 +2131,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2305,10 +2161,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2333,8 +2185,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2352,8 +2202,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2361,20 +2209,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2387,10 +2229,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2403,8 +2241,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2418,35 +2254,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2484,8 +2306,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2504,30 +2324,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2537,72 +2342,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "" @@ -2612,8 +2351,6 @@ msgstr "" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "" @@ -2646,10 +2383,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2673,17 +2406,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "" @@ -2717,8 +2440,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2728,22 +2449,16 @@ msgstr "" msgid "true" msgstr "patiess" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "nezināms parsētājs %(parser_name)r (izvēles: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2754,9 +2469,7 @@ msgstr "" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "" @@ -2785,21 +2498,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2820,7 +2531,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2861,11 +2571,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/ml/LC_MESSAGES/fdroidserver.po b/locale/ml/LC_MESSAGES/fdroidserver.po index 3c7ba4e9..e6416749 100644 --- a/locale/ml/LC_MESSAGES/fdroidserver.po +++ b/locale/ml/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2023-06-23 14:52+0000\n" "Last-Translator: abe1242 \n" "Language-Team: Malayalam \n" @@ -53,11 +53,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -83,17 +78,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -109,14 +93,6 @@ msgstr "" msgid "%d problems found" msgstr "%d പ്രശ്നങ്ങൾ കണ്ടുപിടിച്ചു" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -137,13 +113,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "" @@ -164,8 +133,6 @@ msgstr "config.yml ൽ 'keystorepass' കാണപ്പെടുന്നില msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -179,11 +146,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -194,7 +156,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -213,8 +175,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr "" @@ -305,10 +265,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -352,7 +308,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -408,11 +363,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -465,20 +422,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -498,6 +452,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -591,11 +546,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -652,11 +602,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -690,12 +635,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -840,10 +779,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -875,7 +810,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -940,15 +874,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1083,16 +1015,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1303,7 +1231,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1338,7 +1265,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1368,19 +1294,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1389,10 +1313,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1558,14 +1478,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1869,11 +1781,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1883,7 +1790,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1921,6 +1827,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1951,11 +1858,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -1969,6 +1871,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1988,11 +1891,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2007,27 +1906,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2066,11 +1948,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2172,20 +2049,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2199,11 +2067,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2214,8 +2084,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2234,7 +2102,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" @@ -2248,14 +2116,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2274,14 +2138,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "സങ്കീർണ്ണമായ" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2312,10 +2168,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2340,8 +2192,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2359,8 +2209,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2368,20 +2216,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2394,10 +2236,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2410,8 +2248,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2425,35 +2261,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2491,8 +2313,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2511,30 +2331,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2544,72 +2349,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "" @@ -2619,8 +2358,6 @@ msgstr "" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "" @@ -2653,10 +2390,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2680,17 +2413,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "" @@ -2724,8 +2447,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2735,22 +2456,16 @@ msgstr "" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2761,9 +2476,7 @@ msgstr "" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "" @@ -2792,21 +2505,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2827,7 +2538,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2868,11 +2578,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index 0c6645fb..50da9952 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Norwegian Bokmål \n" @@ -55,11 +55,6 @@ msgstr "Rotmappen for local_copy_dir \"{path}\" finnes ikke." msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "'{apkfilename}' er allerede installert på {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" inneholder utdatert {name} ({version})" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -85,17 +80,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" er ikke en gyldig nettadresse." -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "%(option)s-valget krever %(number)d argument" -msgstr[1] "%(option)s-valget krever %(number)d argumenter" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -111,14 +95,6 @@ msgstr "" msgid "%d problems found" msgstr "%d problemer funnet" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [valg]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -139,13 +115,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "%s er ikke et godtatt bygge-felt" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "%s-valget tar ikke en verdi" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' ble ikke funnet i config.yml!" @@ -166,8 +135,6 @@ msgstr "'keystorepass' ble ikke funnet i config.yml!" msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' ble ikke funnet i config.yml!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "'required' is an invalid argument for positionals" @@ -183,11 +150,6 @@ msgstr "'sdk_path' ble ikke funnet i config.yml!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' er for gammel, fdroid krever build-tools-{version} eller nyere." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' vil bli utført i tilfeldig rekkefølge. Bruk () eller [] -parenteser hvis rekkefølgen er viktig." - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -198,7 +160,7 @@ msgstr "\"{path}\" klarte ikke å kjøre." msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "\"{value}\" er ikke et gyldig {field} i {appid}. Mønster for regulært uttrykk: {pattern}" @@ -217,8 +179,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "…oppdateringssjekk mislyktes for {appid}: {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() udefinert" @@ -311,10 +271,6 @@ msgstr "Fant ikke Android-SDK-verktøyet {cmd}!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -358,7 +314,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Grunnettadresse å speile, kan inkludere indekssigneringsnøkkelen ved bruk av spørreingsstrengen: ?fingerpring=" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -416,11 +371,13 @@ msgstr[1] "Kan ikke bygge som følge av {} feiler under skanning" msgid "Cannot rewrite \"{path}\"" msgstr "Kan ikke lese \"{path}\"." +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Kategorien '%s' er ikke gyldig" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Kategoreier ikke satt" @@ -473,21 +430,18 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumenter i konflikt: '--verbose' og '--quiet' kan ikke angis samtidig." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Filer i konflikt med hverandre. Bruker {newfile}, ser bort fra {oldfile}." - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Fant ikke \"{command}\" på ditt system" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Could not find latest version code" msgstr "Fant ikke seneste versjonskode" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Could not find latest version name" @@ -508,6 +462,7 @@ msgstr "Kunne ikke åpne APK {path} for analyse: " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Kunne ikke fortolke størrelse \"{size}\", feil type \"{type}\"" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py #, fuzzy msgid "Couldn't find Application ID" @@ -606,11 +561,6 @@ msgstr "Beskrivelsen \"%s\" er bare programsammendraget" msgid "Description has a duplicate line" msgstr "Beskrivelsen har repetert linje" -#: ../fdroidserver/lint.py -#, fuzzy, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "Beskrivelsen har en liste (%s), men er ikke punktvis (*) eller nummerert (#)" - #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -669,11 +619,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "Last ned fullstendige speilinger av små pakkebrønner" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "Laster ned %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Nedlasting av pakkebrønn mislyktes én gang, prøver ikke igjen." @@ -708,15 +653,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "Feil: «server»-underkommandoen har blitt fjernet. Bruk «depoloy»." -#: ../fdroidserver/mirror.py -#, fuzzy -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"Feil: Denne kommandoen bør aldri brukes til å speile f-droid.org.\n" -"Et helt speil av f-droid.org krever mer enn 200GB." - #: ../fdroidserver/nightly.py #, fuzzy msgid "ERROR: unsupported CI type, patches welcome!" @@ -866,11 +802,6 @@ msgstr "En fil ble borte mens den ble behandlet: {path}" msgid "Finished" msgstr "Fullført" -#: ../fdroidserver/lint.py -#, fuzzy -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Flatter-donasjonsmetoder hører hjemme i FlattrID-flagget" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Forbudte HTML-tagger" @@ -903,7 +834,6 @@ msgstr "Fant feilaktig kronerullingsfil «{path}» for «{name}»:" msgid "Found invalid appids in arguments" msgstr "Fant ugyldige App-ID-er i argumenter" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, fuzzy msgid "Found invalid versionCodes for some apps" @@ -971,16 +901,13 @@ msgstr "Git-tømming mislyktes" msgid "Git fetch failed" msgstr "Git-innhenting mislyktes" -#: ../fdroidserver/common.py -#, fuzzy -msgid "Git prune failed" -msgstr "Git-tilbakestilling mislyktes" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, fuzzy, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git set-head annensteds hen mislyktes: «%s»" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Git-tilbakestilling mislyktes" @@ -1120,16 +1047,12 @@ msgstr "Ugyldig VercodeOperation: {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "Ugyldig VercodeOperation: {field}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "Ugyldig program-ID {appid}" -#: ../fdroidserver/metadata.py -#, fuzzy, python-format -msgid "Invalid boolean '%s'" -msgstr "Ugyldig boolsk uttrykk \"%s\"" - #: ../fdroidserver/lint.py #, fuzzy msgid "Invalid bulleted list" @@ -1351,7 +1274,6 @@ msgstr "Ingen signeringssertifikater funnet i {path}" msgid "No such package: %s" msgstr "Ingen slik pakke: %s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1389,7 +1311,6 @@ msgstr "Ingenting å gjøre for {appid}." msgid "Now set these in config.yml:" msgstr "Nå må du sette disse i config.yml:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1420,19 +1341,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Kun PNG og JPEG støttes for grafikk, fant: {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Kun skriv ut forskjeller vis-a-vis Play-butikken" - #: ../fdroidserver/checkupdates.py #, fuzzy msgid "Only process apps with auto-updates" @@ -1443,10 +1362,6 @@ msgstr "Behandle kun programmer som har auto-oppdateringer" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Flatter-donasjonsmetoder hører hjemme i FlattrID-flagget" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Valg" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Skriv ut JSON-rapport til fil navngitt etter APK-en." @@ -1617,16 +1532,6 @@ msgstr "Fjerner {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Gi nytt navn til APK-filer som ikke samsvarer med package.name_123.apk" -#: ../fdroidserver/checkupdates.py -#, fuzzy -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "RepoTrunk-oppdateringsmodus gir kun mening i Git-SVN-kodelager" - -#: ../fdroidserver/build.py -#, fuzzy -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Tilbakestill og opprett en helt ny byggtjener, selv når den eksisterende later til å være i orden." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1940,11 +1845,6 @@ msgstr "Ugyldig lisenstagg \"%s\". Kun bruk de som er å finne på https://spdx. msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1954,7 +1854,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "Ukjent unntak møtt!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1993,6 +1892,7 @@ msgstr "Ugjenkjent felt «{fieldname}» i «{path}»" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Ugjenkjent felt «{build_flag}» i «{path}»" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -2023,11 +1923,6 @@ msgstr "Ubrukt fil i %s" msgid "Unused scanignore path: %s" msgstr "Ubrukt fil i %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "Pakker ut til %s" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Oppdater repo informasjon for nye pakker" @@ -2041,6 +1936,7 @@ msgstr "Oppdater binær gjennomsiktighetslogg for en URL" msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData har ugyldig nettadresse: {url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -2060,11 +1956,7 @@ msgstr "UpdateCheckData er ikke en gyldig nettadresse: {url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py #, fuzzy msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -2080,28 +1972,11 @@ msgstr "Laster opp {apkfilename} to androidobservatory.org" msgid "Uploading {apkfilename} to virustotal" msgstr "Behandler {apkfilename}" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Bruk" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Bruk: %s\n" - #: ../fdroidserver/lint.py #, fuzzy msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "Bruk /HEAD istedenfor /master for å peke til en fil i forvalgt forgrening" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Bruk /HEAD istedenfor /master for å peke til en fil i forvalgt forgrening" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Bruk `fdroid update -c` for å opprette den." @@ -2144,11 +2019,6 @@ msgstr "Bruker APK Signature v2" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Bruker Java sin jarsigner, ikke anbefalt for bekreftelse av APK-er. Bruk apksigner." -#: ../fdroidserver/common.py -#, fuzzy, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "Bruker Androguard fra \"{path}\"" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2252,20 +2122,11 @@ msgstr "legger til IdentityFile i {path}" msgid "adding to {name}: {path}" msgstr "legger til i {name}: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, fuzzy, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "tvetydig valg: %(option)s kan passe overens med %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "tvetydig valg: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2280,12 +2141,14 @@ msgstr "fant ikke apksigner (som kreves for signering)." msgid "apksigner not found, it's required for signing!" msgstr "fant ikke apksigner (som kreves for signering)." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py #, fuzzy msgid "application ID of file to operate on" msgstr "App-ID å sjekke for oppdateringer" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2297,8 +2160,6 @@ msgstr "App-ID med valgfri versionCode, i formen APPID[:VERCODE]" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2318,7 +2179,7 @@ msgstr "forsøker naken SSH-tilkobling for å teste utrullingsnøkkel:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "kan ikke åpne '%(filename)s': %(error)s" @@ -2332,14 +2193,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "Finner ikke AppID for {path}." -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "kan ikke ha flere underfortolkningsargumenter" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2359,15 +2216,6 @@ msgstr "kloner {url}" msgid "commands from plugin modules:" msgstr "kommandoer fra programtilleggsmodulene:" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, fuzzy -msgid "complex" -msgstr "kompleks" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2398,10 +2246,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2426,8 +2270,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2447,8 +2289,6 @@ msgstr "Stripper mystisk signatur fra {apkfilename}" msgid "executable binary, possibly code" msgstr "kjørbar binærfil, muligens kode" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2456,20 +2296,14 @@ msgid_plural "expected %s arguments" msgstr[0] "forventet %s argument" msgstr[1] "forventet %s argumenter" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "forventet minst ett argument" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "forventet på det meste ett argument" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "forventet ett argument" @@ -2483,11 +2317,6 @@ msgstr "bruk: fdroid [-h|--help|--version] []" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -#, fuzzy -msgid "floating-point" -msgstr "flyttall" - #: ../fdroidserver/metadata.py #, fuzzy msgid "force metadata errors (default) to be warnings, or to be ignored." @@ -2503,8 +2332,6 @@ msgstr "\"git svn clone\" mislyktes" msgid "gzip file archive" msgstr ".gzip-filarkiv" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, fuzzy, python-format msgid "ignored explicit argument %r" @@ -2519,35 +2346,21 @@ msgstr "index-v1 må ha en signatur, bruk `fdroid signindex` for å opprette den msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 må ha en signatur, bruk `fdroid signindex` for å opprette den." -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "heltall" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, fuzzy, python-format msgid "invalid %(type)s value: %(value)r" msgstr "ugydlig %(type)s verdi: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "ugyldig valg: %(value)r (velg fra %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "ugyldig conflict_resolution-verdi: %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2585,8 +2398,6 @@ msgstr "speilet \"%s\" slutter ikke med \"fdroid\"." msgid "mirrors set twice, in config.yml and {path}!" msgstr "Nå må du sette disse i config.yml:" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "gjensidig utelukkende argumenter må være valgfrie" @@ -2605,31 +2416,16 @@ msgstr "Behandler {appid}" msgid "no APK supplied" msgstr "ingen APK angitt" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "Inget slikt valg: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "ingen versjonsinfo funnet!" - #: ../fdroidserver/checkupdates.py #, fuzzy msgid "no version information found" msgstr "ingen versjonsinfo funnet!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, fuzzy, python-format msgid "not allowed with argument %s" msgstr "ikke tillatt med argument %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, fuzzy, python-format msgid "one of the arguments %s is required" @@ -2640,72 +2436,6 @@ msgstr "ett av argumentene %s kreves" msgid "only accepts strings, lists, and tuples" msgstr "kun godta strenger, lister, og forekomster" -#: ../fdroidserver/install.py -#, fuzzy, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "valg %s: Hvis du virkelig ønsker å installere alle signerte programmer, bruk -all" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "valg %s: ugyldig %s verdi: %r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, fuzzy, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "valg %s: ugyldig valg: %r (velg mellom %s)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "Kommandoen \"-%s\" gjenkjennes ikke" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "valg -%s krever et argument" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, fuzzy, python-format -msgid "option --%s must not have an argument" -msgstr "valget --%s kan ikke ha et argument" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, fuzzy, python-format -msgid "option --%s not a unique prefix" -msgstr "valget --%s er ikke et unikt prefiks" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "Kommandoen \"--%s\" gjenkjennes ikke" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "valget --%s krever et argument" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "valgfrie argumenter" - #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" @@ -2716,8 +2446,6 @@ msgstr "Valg" msgid "overwriting existing {path}" msgstr "overskriver eksisterende {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "Posisjonelle argumenter" @@ -2750,11 +2478,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -#, fuzzy -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "ruamel.yaml er ikke installert. Kan ikke skrive metadata." - #: ../fdroidserver/deploy.py #, fuzzy, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2779,17 +2502,7 @@ msgstr "local_copy_dir slutter ikke med \"fdroid\", kanskje du mente: \"{path}\" msgid "shared library" msgstr "delt bibliotek" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "vis programmets versjonsnummer og avslutt" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "vis denne hjelpemeldingen og avslutt" @@ -2826,8 +2539,6 @@ msgstr "statisk bibliotek" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2837,22 +2548,16 @@ msgstr "følgende argumenter kreves: %s" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "uventet valgstreng: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "ukjent fortolker %(parser_name)r (valg: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2863,9 +2568,7 @@ msgstr "ugjengkjente argumenter: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "utrygge tilganger for '{config_file}' (skal være 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "bruk: " @@ -2894,21 +2597,19 @@ msgstr[1] "{0} programmer, {1} nøkkelalias" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) mangler metadata." -#: ../fdroidserver/update.py -#, fuzzy, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} har flere {name}-filer, ser ut til å være en hovednøkkelutnyttelse." - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "{apkfilename} sin AndroidManifest.xml har en feilaktig dato: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} mangler navn. Bruker pakkenavn istedenfor." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2929,7 +2630,6 @@ msgstr "{appid} har både APK-er og filer: {files}" msgid "{appid} is missing {name}" msgstr "{appid} mangler {name}." -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2970,11 +2670,6 @@ msgstr "{file} er tom eller skadet!" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} «{section}/icons/{path}» finnes ikke. Rett det i config.yml." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile} er avleggs, bruk {newfile}" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index 066ec3a1..0245e1e0 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2024-01-03 09:07+0000\n" "Last-Translator: Issa1553 \n" "Language-Team: Dutch \n" @@ -55,11 +55,6 @@ msgstr "\"local_copy_dir\" {path} bestaat niet!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" is al geïnstalleerd op {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" bevat verouderde {name} ({version})" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -85,17 +80,6 @@ msgstr "\"{path}\" is ondertekend door een sleutel die niet is toegestaan:" msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" is geen geldige URL!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "%(option)s optie vereist %(number)d argument" -msgstr[1] "%(option)s optie vereist %(number)d argumenten" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -111,14 +95,6 @@ msgstr "" msgid "%d problems found" msgstr "%d problemen gevonden" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [opties]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -139,13 +115,6 @@ msgstr "%s heeft slechte SHA-256: %s" msgid "%s is not an accepted build field" msgstr "%s is geen geaccepteerd build-veld" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "%s optie heeft geen waarde" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' niet gevonden in config.yml!" @@ -166,8 +135,6 @@ msgstr "'keystorepass' niet gevonden in config.yml!" msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' niet gevonden in config.yml!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' is een ongeldig argument voor positionelen" @@ -181,11 +148,6 @@ msgstr "'sdk_path' niet ingesteld in config.yml!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "{aapt}' is te oud, fdroid vereist build-tools-{version} of nieuwer!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' zal in willekeurige volgorde staan! Gebruik () of [] haakjes als de volgorde belangrijk is!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -196,7 +158,7 @@ msgstr "{path}' is niet uitgevoerd!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' heeft ongeldig formaat, het zou een woordenboek moeten zijn!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "{value}' is geen geldig {field} in {appid}. Regex patroon: {pattern}" @@ -215,8 +177,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate mislukt voor {appid} : {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() niet gedefinieerd" @@ -307,10 +267,6 @@ msgstr "Android SDK-tool {cmd} niet gevonden!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "App heeft binaries maar heeft geen overeenkomstige ToegestaneAPKOndertekenSleutels om certificaat te pinnen." -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "App heeft GeenBronSinds of Archiefbeleid \"0 versies\" maar AutoUpdateModus of UpdateCheckModus zijn niet Geen" - #: ../fdroidserver/lint.py #, fuzzy msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" @@ -355,7 +311,6 @@ msgstr "Slecht entry type \"{mirrortype}\" in spiegels configuratie: {mirror}" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -411,11 +366,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -468,20 +425,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -501,6 +455,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -594,11 +549,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -655,11 +605,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -693,12 +638,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -843,10 +782,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -878,7 +813,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -943,15 +877,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1086,16 +1018,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1306,7 +1234,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1341,7 +1268,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1371,19 +1297,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1392,10 +1316,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Opties" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1561,14 +1481,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Hernoem APK-bestanden die niet overeenkomen met pakket.naam_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1869,11 +1781,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1883,7 +1790,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "Onbekende uitzondering gevonden!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1921,6 +1827,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1951,11 +1858,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Repo informatie bijwerken voor nieuwe pakketten" @@ -1969,6 +1871,7 @@ msgstr "Het binaire transparantielogboek bijwerken voor een URL" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1988,11 +1891,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2007,27 +1906,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Gebruik" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Gebruik: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2066,11 +1948,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2172,20 +2049,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "dubbelzinnige optie: %(option)s kan overeenkomen met %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "dubbelzinnige optie: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2199,11 +2067,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2214,8 +2084,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2234,7 +2102,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" @@ -2248,14 +2116,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2274,14 +2138,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "complex" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2312,10 +2168,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2340,8 +2192,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2359,8 +2209,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2368,20 +2216,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2394,10 +2236,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2410,8 +2248,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2425,35 +2261,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2491,8 +2313,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2511,30 +2331,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "geen dergelijke optie: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2544,72 +2349,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "optie -%s wordt niet herkend" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "optie -%s vereist een argument" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "optie --%s mag geen argument hebben" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "optie --%s geen uniek voorvoegsel" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "optie --%s wordt niet herkend" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "optie --%s vereist argument" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "optionele argumenten" - #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" @@ -2620,8 +2359,6 @@ msgstr "Opties" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "positionele argumenten" @@ -2654,10 +2391,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2681,17 +2414,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "toon versienummer van programma en sluit af" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "toon dit hulpbericht en sluit af" @@ -2725,8 +2448,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2736,22 +2457,16 @@ msgstr "de volgende argumenten zijn vereist: %s" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "onverwachte optiestring: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2762,9 +2477,7 @@ msgstr "onherkende argumenten: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "Onveilige rechten op '{config_file}' (zou 0600 moeten zijn)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "gebruik: " @@ -2793,21 +2506,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2828,7 +2539,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2869,11 +2579,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/nn/LC_MESSAGES/fdroidserver.po b/locale/nn/LC_MESSAGES/fdroidserver.po index 98842621..e2af7284 100644 --- a/locale/nn/LC_MESSAGES/fdroidserver.po +++ b/locale/nn/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3.0-3-g4ba7b5c9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2024-11-26 10:54+0000\n" "Last-Translator: Bård Sigurd Møller \n" "Language-Team: Norwegian Nynorsk \n" @@ -48,11 +48,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -78,17 +73,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -104,14 +88,6 @@ msgstr "" msgid "%d problems found" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [val]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -132,13 +108,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "" @@ -159,8 +128,6 @@ msgstr "" msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -174,11 +141,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -189,7 +151,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -208,8 +170,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr "" @@ -300,10 +260,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -347,7 +303,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -403,11 +358,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -460,20 +417,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -493,6 +447,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -586,11 +541,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -647,11 +597,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -685,12 +630,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -835,10 +774,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -870,7 +805,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -935,15 +869,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1078,16 +1010,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1298,7 +1226,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1333,7 +1260,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1363,19 +1289,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1384,10 +1308,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Val" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1553,14 +1473,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1861,11 +1773,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1875,7 +1782,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1913,6 +1819,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1943,11 +1850,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -1961,6 +1863,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1980,11 +1883,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1999,27 +1898,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2058,11 +1940,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2164,20 +2041,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2191,11 +2059,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2206,8 +2076,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2226,7 +2094,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" @@ -2240,14 +2108,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2266,14 +2130,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2304,10 +2160,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2332,8 +2184,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2351,8 +2201,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2360,20 +2208,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2386,10 +2228,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2402,8 +2240,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2417,35 +2253,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2483,8 +2305,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2503,30 +2323,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2536,72 +2341,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "" @@ -2611,8 +2350,6 @@ msgstr "" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "" @@ -2645,10 +2382,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2672,17 +2405,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "" @@ -2716,8 +2439,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2727,22 +2448,16 @@ msgstr "" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2753,9 +2468,7 @@ msgstr "" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "" @@ -2784,21 +2497,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2819,7 +2530,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2860,11 +2570,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/pa/LC_MESSAGES/fdroidserver.po b/locale/pa/LC_MESSAGES/fdroidserver.po index 1de20d3a..be80a7b9 100644 --- a/locale/pa/LC_MESSAGES/fdroidserver.po +++ b/locale/pa/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3.3\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -47,11 +47,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -77,17 +72,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -103,14 +87,6 @@ msgstr "" msgid "%d problems found" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -131,13 +107,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "" @@ -158,8 +127,6 @@ msgstr "" msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -173,11 +140,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -188,7 +150,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -207,8 +169,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr "" @@ -299,10 +259,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -346,7 +302,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -402,11 +357,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -459,20 +416,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -492,6 +446,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -585,11 +540,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -646,11 +596,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -684,12 +629,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -834,10 +773,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -869,7 +804,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -934,15 +868,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1077,16 +1009,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1297,7 +1225,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1332,7 +1259,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1362,19 +1288,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1383,10 +1307,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1552,14 +1472,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1860,11 +1772,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1874,7 +1781,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1912,6 +1818,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1942,11 +1849,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -1960,6 +1862,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1979,11 +1882,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1998,27 +1897,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2057,11 +1939,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2163,20 +2040,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2190,11 +2058,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2205,8 +2075,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2225,7 +2093,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" @@ -2239,14 +2107,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2265,14 +2129,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2303,10 +2159,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2331,8 +2183,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2350,8 +2200,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2359,20 +2207,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2385,10 +2227,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2401,8 +2239,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2416,35 +2252,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2482,8 +2304,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2502,30 +2322,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2535,72 +2340,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "" @@ -2610,8 +2349,6 @@ msgstr "" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "" @@ -2644,10 +2381,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2671,17 +2404,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "" @@ -2715,8 +2438,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2726,22 +2447,16 @@ msgstr "" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2752,9 +2467,7 @@ msgstr "" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "" @@ -2783,21 +2496,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2818,7 +2529,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2859,11 +2569,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 3e06f8b1..a372acbc 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2025-03-13 20:43+0000\n" "Last-Translator: WaldiS \n" "Language-Team: Polish \n" @@ -57,11 +57,6 @@ msgstr "„local_copy_dir” {path} nie istnieje!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" jest już zainstalowany na {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" zawiera nieaktualne {name} ({version})" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -87,18 +82,6 @@ msgstr "„{path}” jest podpisany kluczem, który jest niedozwolony:" msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" nie jest prawidłowym adresem URL!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "%(option)s opcja wymaga %(number)d argument" -msgstr[1] "%(option)s opcji wymaga %(number)d argumentów" -msgstr[2] "%(option)s opcje wymagają %(number)d argumentów" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -114,14 +97,6 @@ msgstr "Nie udało się podpisać lub zweryfikować %d plików APK!" msgid "%d problems found" msgstr "%d problemy odnalezione" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [opcje]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -142,13 +117,6 @@ msgstr "%s ma zły SHA-256: %s" msgid "%s is not an accepted build field" msgstr "%s nie jest akceptowanym polem kompilacji" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "%s opcja nie przyjmuje wartości" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' nie znaleziono w config.yml!" @@ -169,8 +137,6 @@ msgstr "'keystorepass' nie znaleziono w config.yml!" msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' nie znaleziono w config.yml!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'wymagane' jest nieprawidłowym argumentem dla pozycji" @@ -184,11 +150,6 @@ msgstr "'sdk_path' nie jest ustawiony w config.yml!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' jest zbyt stary, fdroid wymaga narzędzi-kompilacji-{version} lub nowsze!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' będą w losowej kolejności! Użyj nawiasów () lub [], jeśli kolejność jest ważna!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -199,7 +160,7 @@ msgstr "'{path}' nie udało się wykonać!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' ma nieprawidłowy format, powinien być słownikiem!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' nie jest prawidłowy {field} w {appid}. Wzór Regex: {pattern}" @@ -218,8 +179,6 @@ msgstr "--merge-request działa tylko na pojedynczym appid!" msgid "...checkupdate failed for {appid} : {error}" msgstr "...sprawdzenie aktualizacji nie powiodło się {appid} : {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() nie określono" @@ -310,10 +269,6 @@ msgstr "Nie znaleziono narzędzia Android SDK {cmd}!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Aplikacja ma Binaries, ale nie ma odpowiednich kluczy AllowedAPKSingKeys do przypięcia certyfikatu." -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "Aplikacja ma NoSourceSince lub ArchivePolicy „0 versions”, ale AutoUpdateMode lub UpdateCheckMode nie są None" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Aplikacja ma NoSourceSince lub ArchivePolicy „0 versions”, ale AutoUpdateMode lub UpdateCheckMode nie są None" @@ -357,7 +312,6 @@ msgstr "Błędny typ wpisu „{mirrortype}” w konfiguracji serwerów lustrzany msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Bazowy adres URL do serwera lustrzanego, może zawierać klucz do podpisywania indeksu za pomocą łańcucha zapytania: ?fingerprint=" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -414,11 +368,13 @@ msgstr[2] "Nie można zbudować z powodu błędów {} podczas skanowania" msgid "Cannot rewrite \"{path}\"" msgstr "Nie można odczytać \"{path}\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Kategorie '%s' są nieprawidłowe" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Kategorie nie są ustawione" @@ -471,20 +427,17 @@ msgstr "Sprzeczne definicje „{field}” między plikami .yml a przetłumaczony msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Sprzeczne argumenty: '--verbose' i '--quiet' nie mogą być podane w tym samym czasie." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Pliki konfiguracyjne powodujące konflikt! Używając {newfile}, ignoruje {oldfile}!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Nie można znaleźć '{command}' w twoim systemie" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Nie można znaleźć najnowszej wersji kodu" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Nie można odnaleźć nazwy najnowszej wersji" @@ -504,6 +457,7 @@ msgstr "Nie można otworzyć pliku APK {path} do analizy: " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Nie można przeanalizować rozmiaru \"{size}\", nieprawidłowy typ \"{type}\"" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Nie można odnaleźć identyfikatora aplikacji" @@ -597,11 +551,6 @@ msgstr "Opis \"%s\" to tylko podsumowanie aplikacji" msgid "Description has a duplicate line" msgstr "Opis ma zduplikowaną linię" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "Opis ma listę (%s), ale nie jest wypunktowana (*) ani ponumerowana (#)" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -658,11 +607,6 @@ msgstr "Pobierz F-Droid.apk za pomocą serwerów lustrzanych, które wyciekają msgid "Download complete mirrors of small repos" msgstr "Pobierz pełne mirrors małych repozytoriów" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "Pobieranie %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Pobieranie repozytorium już raz się nie powiodło, nie próbuje ponownie." @@ -696,14 +640,6 @@ msgstr "BŁĄD: %(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "BŁĄD: podkomenda „serwer” została usunięta, użyj polecenia „deploy”!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"BŁĄD: tego polecenia nigdy nie należy używać do zwierciadlania f-droid.org!\n" -"Pełne lustro f-droid.org wymaga ponad 200 GB." - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "BŁĄD: nieobsługiwany typ CI, mile widziane poprawki!" @@ -850,10 +786,6 @@ msgstr "Plik zniknął podczas przetwarzania go: {path}" msgid "Finished" msgstr "Skończone" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Metody darowizn Flattr należą do FlattrID: field" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Zakazane tagi HTML" @@ -885,7 +817,6 @@ msgstr "Znaleziono zły plik finansowania \"{path}\" dla \"{name}\":" msgid "Found invalid appids in arguments" msgstr "Znaleziono nieprawidłowe pliki w argumentach" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Znaleziono nieprawidłowe kody wersji dla niektórych aplikacji" @@ -950,15 +881,13 @@ msgstr "Git clean nie powiódł się" msgid "Git fetch failed" msgstr "Pobranie Git nie powiodło się" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "Git prune nie powiodło się" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Błąd zdalnego ustawiania Git: \"%s\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Resetowanie Git nie powiodło się" @@ -1093,16 +1022,12 @@ msgstr "Nieprawidłowa VercodeOperation: {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "Nieprawidłowa VercodeOperation: {invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "Nieprawidłowy ID aplikacji {appid}" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "Niepoprawna wartość boolean '%s'" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Nieprawidłowa lista wypunktowana" @@ -1313,7 +1238,6 @@ msgstr "Nie znaleziono certyfikatów do podpisu w {path}" msgid "No such package: %s" msgstr "Brak takiego pakietu: %s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1348,7 +1272,6 @@ msgstr "Nic nie robić w {appid}." msgid "Now set these in config.yml:" msgstr "Teraz ustaw je w config.yml:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1378,19 +1301,17 @@ msgstr "Jeden z elementów 'github_releases' nie posiada wartości 'projectUrl'. msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "Jeden z elementów 'github_releases' nie posiada wartości 'token'. pomijanie..." +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Tylko PNG i JPEG są obsługiwane dla grafiki, znaleziono: {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Wydrukuj tylko różnice ze Sklepem Play" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Przetwarzaj tylko aplikacje z automatycznymi aktualizacjami" @@ -1399,10 +1320,6 @@ msgstr "Przetwarzaj tylko aplikacje z automatycznymi aktualizacjami" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Metody darowizn OpenCollective należą do OpenCollective: field" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Opcje" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Wyjście raportu JSON do pliku o nazwie po APK." @@ -1568,14 +1485,6 @@ msgstr "Usuwanie „{path}”" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Zmień nazwy plików APK, które nie pasują do pliku package.name_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "Tryb aktualizacji RepoTrunk ma sens tylko w repozytoriach git-svn" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Zresetuj i utwórz zupełnie nowy serwer kompilacji, nawet jeśli istniejący wydaje się być w porządku." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1884,11 +1793,6 @@ msgstr "Nieprawidłowy tag licencji \"{}\"! Używaj tylko tagów zgodnych z FSF msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Nieprawidłowy tag licencji \"{}\"! Używaj tylko tagów licencji skonfigurowanych w twoim pliku konfiguracji" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "Nieoczekiwany cel dowiązania symbolicznego: {link} -> {target}" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1898,7 +1802,6 @@ msgstr "Nieznany wpis {key} w {configname}" msgid "Unknown exception found!" msgstr "Znaleziono nieznany wyjątek!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1936,6 +1839,7 @@ msgstr "Nierozpoznane pole aplikacji '{fieldname}' w '{path}'" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Nierozpoznana flaga kompilacji '{build_flag}' w '{path}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1966,11 +1870,6 @@ msgstr "Nieużywana ścieżka scandelete: %s" msgid "Unused scanignore path: %s" msgstr "Nieużywana ścieżka scanignore: %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "Rozpakowywanie do %s" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Zaktualizuj informacje o repozytorium dla nowych pakietów" @@ -1984,6 +1883,7 @@ msgstr "Zaktualizuj dziennik przejrzystości plików binarnych dla adresu URL" msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData ma nieprawidłowy adres URL: {url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -2003,11 +1903,7 @@ msgstr "UpdateCheckData nie jest prawidłowym adresem URL: {url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode jest ustawiony, ale wygląda na to, że checkupdates nie został jeszcze uruchomiony" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode jest ustawiony, ale wygląda na to, że checkupdates nie został jeszcze uruchomiony" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName jest ustawiony na znany identyfikator aplikacji, można go usunąć" @@ -2022,27 +1918,10 @@ msgstr "Przesyłanie {apkfilename} do androidobservatory.org" msgid "Uploading {apkfilename} to virustotal" msgstr "Przesyłanie {apkfilename} do virustotal" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Zastosowanie" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Użycie: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "Użyj /HEAD zamiast /master czy /main, aby wskazać plik w domyślnej gałęzi" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Użyj /HEAD zamiast/ master, aby wskazać plik w domyślnej gałęzi" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Użyj `fdroid update -c`, aby go utworzyć." @@ -2081,11 +1960,6 @@ msgstr "Używanie podpisu JAR" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Korzystanie z jarsignera Java nie jest zalecane do weryfikacji plików APK! Użyj apksigner" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "Korzystanie z androguard od \"{path}\"" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2187,20 +2061,11 @@ msgstr "dodawanie pliku IdentityFile do {path}" msgid "adding to {name}: {path}" msgstr "dodaj do {name}: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "niejednoznaczna opcja: %(option)s może dopasować %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "niejednoznaczna opcja: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2214,11 +2079,13 @@ msgstr "Nie znaleziono apksignera! Nie można podpisać ani zweryfikować nowocz msgid "apksigner not found, it's required for signing!" msgstr "apksigner nie znaleziono, jest wymagane do podpisania!" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "Identyfikator aplikacji, na której ma działać" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2229,8 +2096,6 @@ msgstr "identyfikator aplikacji z opcjonalnym kodem wersji w postaci APPID [: VE msgid "archive_url needs to end with /archive" msgstr "archive_url musi kończyć się na /archive" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2249,7 +2114,7 @@ msgstr "próba połączenia odsłoniętego SSH w celu przetestowania klucza wdro msgid "can not parse scrlib spec (not a string): '{}'" msgstr "can not parse scrlib spec (not a string):' {}'" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "nie można otworzyć „%(filename)s”: %(error)s" @@ -2263,14 +2128,10 @@ msgstr "nie można otworzyć adresu URL innego niż https: „{}”" msgid "cannot find required srclibs: \"{path}\"" msgstr "Nie można znaleźć wymaganych srclibs: \"{path}\"" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "nie może mieć wielu argumentów o różnych argumentach" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2289,14 +2150,6 @@ msgstr "klonowanie {url}" msgid "commands from plugin modules:" msgstr "polecenia z modułów plugin:" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "złożony" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2328,10 +2181,6 @@ msgstr "nie można przeanalizować specyfikacji srclib (nie podano nazwy): '{}'" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "could not parse srclib spec (no ref specified):' {}'" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "nie można przeanalizować specyfikacji srclib (za dużo znaków '@'): '{}'" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2356,8 +2205,6 @@ msgstr "plik zależności bez blokady" msgid "deployed process log {path} to {dest}" msgstr "wdrożony dziennik procesów {path} do {dest}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2375,8 +2222,6 @@ msgstr "nie udało się pobrać sygnatur skanera z „{}”" msgid "executable binary, possibly code" msgstr "wykonywalny binarny, ewentualnie kod" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2385,20 +2230,14 @@ msgstr[0] "oczekiwany argument %s" msgstr[1] "oczekiwanych argumentów %s" msgstr[2] "oczekiwane argumenty %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "spodziewano się co najmniej jednego argumentu" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "spodziewano się co najwyżej jednego argumentu" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "oczekiwano jednego argumentu" @@ -2411,10 +2250,6 @@ msgstr "fdroid [] [-h|--help|--version|]" msgid "fetch the latest version of signatures from the web" msgstr "pobierz najnowszą wersję sygnatur z sieci" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "zmiennoprzecinkowy" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "wymuszaj błędy metadanych (domyślnie), aby były ostrzeżeniami lub aby zostały zignorowane." @@ -2427,8 +2262,6 @@ msgstr "klon git svn nie powiódł się" msgid "gzip file archive" msgstr "plik archiwum gzip" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2442,35 +2275,21 @@ msgstr "index-v1 musi mieć podpis, użyj `fdroid signindex` aby go utworzyć!" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 musi mieć podpis, użyj `fdroid signindex`, aby go utworzyć!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "liczba całkowita (ang. integer)" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "nieprawidłowe %(type)s wartość: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "nieprawidłowy wybór: %(value)r (wybierz z %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "niepoprawna wartość parametru conflict_resolution: %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2508,8 +2327,6 @@ msgstr "mirror '%s'nie kończy się na 'fdroid'!" msgid "mirrors set twice, in config.yml and {path}!" msgstr "serwery lustrzane zostały ustawione dwukrotnie w config.yml i {path}!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "wykluczające się wzajemnie argumenty muszą być opcjonalne" @@ -2528,30 +2345,15 @@ msgstr "brak \"ikony\" w {appid}" msgid "no APK supplied" msgstr "nie dostarczono pakietu APK" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "brak takiej opcji: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "nie znaleziono informacji o wersji!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "nie znaleziono informacji o wersji" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "niedozwolone z argumentem %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2561,72 +2363,6 @@ msgstr "jeden z argumentów %s jest wymagany" msgid "only accepts strings, lists, and tuples" msgstr "akceptuje tylko łańcuchy, listy i krotki" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "opcja %s: Jeśli naprawdę chcesz zainstalować wszystkie podpisane aplikacje, użyj --all" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "opcja %s: nieprawidłowa %s wartość: %r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "opcja %s: nieprawidłowy wybór: %r (wybierz z %s)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "opcja -%s nie został rozpoznany" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "opcja -%s wymaga argumentu" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "opcja --%s nie może mieć argumentu" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "opcja --%s nie jest to unikalny prefiks" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "opcja --%s nie został rozpoznany" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "opcja --%s wymaga argumentu" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "opcjonalne argumenty" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "opcje" @@ -2636,8 +2372,6 @@ msgstr "opcje" msgid "overwriting existing {path}" msgstr "nadpisanie istniejącego {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "argumenty pozycyjne" @@ -2670,10 +2404,6 @@ msgstr "repo_url musi kończyć się na /repo" msgid "rsync is missing or broken: {error}" msgstr "rsync nie działa lub działa nieprawidłowo: {error}" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "nie zainstalowano ruamel.yaml, nie można zapisać metadanych." - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2697,17 +2427,7 @@ msgstr "serverwebroot: ścieżka nie kończy się na \"fdroid\", być może mia msgid "shared library" msgstr "biblioteka współdzielona" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "pokaż numer wersji programu i zakończ" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "pokaż ten komunikat pomocy i zakończ" @@ -2741,8 +2461,6 @@ msgstr "biblioteka statyczna" msgid "supplied reference binary has allowed signer {signer}" msgstr "dostarczony referencyjny plik binarny umożliwił podpis {signer}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2752,22 +2470,16 @@ msgstr "wymagane są następujące argumenty: %s" msgid "true" msgstr "prawda" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "nieoczekiwany ciąg opcji: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "nieznana składnia (parser) %(parser_name)r (wybierz: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2778,9 +2490,7 @@ msgstr "nierozpoznane argumenty: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "niebezpieczne uprawnienia na '{config_file}' (powinno być 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "stosowanie: " @@ -2810,21 +2520,19 @@ msgstr[2] "{0} apps, {1} kluczowych aliasów" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) nie ma metadanych!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} ma wiele {name} plików, wygląda jak exploit Master Key!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "{apkfilename} AndroidManifest.xml ma złą datę: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} nie ma nazwy! Zamiast tego używam identyfikatora aplikacji." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2845,7 +2553,6 @@ msgstr "{appid} zawiera zarówno pliki APK, jak i pliki: {files}" msgid "{appid} is missing {name}" msgstr "{appid} brakuje {name}" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2886,11 +2593,6 @@ msgstr "{file} jest pusty lub uszkodzony!" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" nie istnieje! Sprawdź \"config.yml\"." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile} jest przestarzałe, użyj {newfile}" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 769c176e..5a296844 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2025-03-02 21:32+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" @@ -56,11 +56,6 @@ msgstr "\"local_copy_dir\" {path} não existe!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "'{apkfilename}' já está instalado no {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" contém {name} ({version}) desatualizado" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -86,17 +81,6 @@ msgstr "\"{path}\" está acessado por uma chave que não é permitida:" msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" não é uma URL válida!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "A opção %(option)s requer o argumento %(number)d" -msgstr[1] "A opção %(option)s requer os argumentos %(number)d" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -112,14 +96,6 @@ msgstr "%d APKs falharam a serem assinados ou verificados!" msgid "%d problems found" msgstr "%d problemas encontrados" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [opções]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -140,13 +116,6 @@ msgstr "%s tem um SHA-256 ruim: %s" msgid "%s is not an accepted build field" msgstr "%s não é um campo criado aceito" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "opção %s não leva um valor" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' não foi encontrada em config.yml!" @@ -167,8 +136,6 @@ msgstr "'keystorepass' não encontrada em config.yml!" msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' não encontrada em config.yml!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' é um argumento inválido para posicionadores" @@ -182,11 +149,6 @@ msgstr "'sdk_path' não definido em 'config.yml'!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' é muito antigo, fdroid requer build-tools-{version} ou mais recente!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' será em ordem aleatória! Use () ou [] se a ordem for importante!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -197,7 +159,7 @@ msgstr "'{path}' falhou ao executar!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' tem um formato inválido, deveria ser um dicionário!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' não é um {field} válido em {appid}. Modelo regex: {pattern}" @@ -216,8 +178,6 @@ msgstr "--merge-request só é executado num único appid!" msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate falhou para {appid} : {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() não definida" @@ -308,10 +268,6 @@ msgstr "Ferramenta {cmd} do Android SDK não foi encontrada!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "A app tem binários, mas não tem AllowedAPKSigningKeys correspondentes para fixar o certificado." -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "A app tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateMode ou UpdateCheckMode não são Nenhum" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "A app tem NoSourceSince ou ArchivePolicy \"0 versions\" ou 0, mas AutoUpdateMode ou UpdateCheckMode não são None" @@ -355,7 +311,6 @@ msgstr "Tipo de entrada \"{mirrortype}\" incorreto na configuração de espelhos msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL base para espelhar, pode incluir a chave de assinatura de índice usando a cadeia de consulta: ?fingerprint =" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -411,11 +366,13 @@ msgstr[1] "Não é possível construir devido a erros {} durante a digitalizaç msgid "Cannot rewrite \"{path}\"" msgstr "Não é possível reescrever \"{path}\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "As categorias '%s' não são válidas" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "As categorias não são definidas" @@ -468,20 +425,17 @@ msgstr "Definições contraditórias de \"{field}\" entre ficheiros .yml e fiche msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumentos conflitantes: \"--verbose\" e \"--quiet\" não podem ser especificados ao mesmo tempo." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Ficheiros de configuração conflitantes! Usando {newfile}, ignorando {oldfile}!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Não foi possível encontrar '{command}' no seu sistema" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Não foi possível encontrar o código de versão mais recente" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Não foi possível encontrar o nome da versão mais recente" @@ -501,6 +455,7 @@ msgstr "Não foi possível abrir o APK {path} para análise: " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Não foi possível analisar o tamanho \"{size}\", tipo \"{type}\" incorreto" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Não foi possível encontrar o ID da aplicação" @@ -594,11 +549,6 @@ msgstr "Descrição '%s' é apenas o resumo da app" msgid "Description has a duplicate line" msgstr "A descrição tem uma linha duplicada" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "A descrição tem a lista (%s), mas não tem marcadores (*), nem é numerada (#)" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -655,11 +605,6 @@ msgstr "Descarregue o F-Droid.apk utilizando espelhos que vazam menos para a red msgid "Download complete mirrors of small repos" msgstr "Descarregar espelhos completos de repos pequenos" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "A descarregar %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "O descarregamento do repositório já falhou uma vez, não tento novamente." @@ -693,14 +638,6 @@ msgstr "ERRO: %(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERRO: o subcomando \"server\" foi removido, use \"deploy\"!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"ERRO: este comando nunca deve ser usado para espelhar f-Droid.org!\n" -"Um espelho completo de f-Droid.org requer mais que 200GB." - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERRO: tipo de CI sem suporte, patches são bem-vindos!" @@ -847,10 +784,6 @@ msgstr "O ficheiro desapareceu enquanto era processado: {path}" msgid "Finished" msgstr "Terminado" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Os métodos de doação do Flattr pertencem no campo FlattrID:" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Tags HTML proibidos" @@ -882,7 +815,6 @@ msgstr "Ficheiro de financiamento ruim \"{path}\" encontrado para \"{name}\":" msgid "Found invalid appids in arguments" msgstr "appids inválidos encontrados em argumentos" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "versionCodes inválidos encontrados para algumas apps" @@ -947,15 +879,13 @@ msgstr "Git clean falhou" msgid "Git fetch failed" msgstr "Git fetch falhou" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "Git prune falhou" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git remote set-head falhou: \"%s\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Git reset falhou" @@ -1090,16 +1020,12 @@ msgstr "VercodeOperation inválido: {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "VercodeOperation inválido: {invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "ID da aplicação {appid} inválido" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "Booleano inválido '%s'" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Lista com marcadores inválida" @@ -1310,7 +1236,6 @@ msgstr "Nenhum certificado de assinatura encontrado em {path}" msgid "No such package: %s" msgstr "Nenhum pacote desses: %s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1345,7 +1270,6 @@ msgstr "Nada a fazer para {appid}." msgid "Now set these in config.yml:" msgstr "Agora configure estes em config.yml:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1375,19 +1299,17 @@ msgstr "Um dos itens de configuração 'github_releases' não tem o valor 'proje msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "Um dos itens de configuração 'github_releases' não tem o valor 'token'. A ignorar ..." +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Somente PNG e JPEG são suportados para gráficos, encontrado: {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Apenas mostrar diferenças com a Play Store" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Processar apenas apps com atualizações automáticas" @@ -1396,10 +1318,6 @@ msgstr "Processar apenas apps com atualizações automáticas" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Os métodos de doação OpenCollective pertencem no campo OpenCollective:" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Opções" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Saída de relatório JSON para ficheiro nomeado após APK." @@ -1565,14 +1483,6 @@ msgstr "A remover {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Renomear todos os ficheiros APKs que não correspondem com package.name_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "O modo de atualização repoTrunk só faz sentido em repositórios de git-svn" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Redefinir e criar um novo servidor de compilação, mesmo que o existente parecer normal." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1880,11 +1790,6 @@ msgstr "Etiqueta de licença \"{}\" inesperada! Use somente as etiquetas aprovad msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Etiqueta de licença \"{}\" inesperada! Use somente as etiquetas de licença configuradas no seu ficheiro de configuração" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "Alvo symlink inesperado: {link} -> {target}" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1894,7 +1799,6 @@ msgstr "Entrada {key} desconhecida em {configname}" msgid "Unknown exception found!" msgstr "Exceção desconhecida!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1932,6 +1836,7 @@ msgstr "Campo de aplicação '{fieldname}' não reconhecido em '{path}'" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Bandeira de compilação '{build_flag}' não reconhecida em '{path}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1962,11 +1867,6 @@ msgstr "O caminho de scandelete não é usado: %s" msgid "Unused scanignore path: %s" msgstr "O caminho de scanignore não é usado: %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "A descompactar para %s" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Atualizar a informação do repositório para novos pacotes" @@ -1980,6 +1880,7 @@ msgstr "Atualizar o registo de transparência de binário para um URL" msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData tem URL inválido: {url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1999,11 +1900,7 @@ msgstr "UpdateCheckData não é uma URL válida: {url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado." -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode está definido, mas parece que o updatecheckupdates ainda não foi executado" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName (o nome da verificação de atualização) é definido como o ID comun da aplicação - pode ser removido" @@ -2018,27 +1915,10 @@ msgstr "A enviar {apkfilename} ao androidobservatory.org" msgid "Uploading {apkfilename} to virustotal" msgstr "A enviar {apkfilename} ao virustotal" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Utilização" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Utilização: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "Use /HEAD em vez de /master ou /main para apontar a um ficheiro no ramo predefinido" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Use /HEAD em vez de /master para apontar num ficheiro na ramificação predefinida" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Use ' fdroid update -c ' para criá-lo." @@ -2077,11 +1957,6 @@ msgstr "A usar a assinatura JAR" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Usando o jarsigner de Java, não recomendado para verificar APKs! Use apksigner" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "Usando androguard de \"{path}\"" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2183,20 +2058,11 @@ msgstr "adicionando IdentityFile a {path}" msgid "adding to {name}: {path}" msgstr "adicionando a {name}: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opção ambígua: %(option)s poderia corresponder %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "opção ambígua: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2210,11 +2076,13 @@ msgstr "apksigner não encontrado! Não é possível assinar ou verificar APKs m msgid "apksigner not found, it's required for signing!" msgstr "Nenhum apksigner encontrado, é necessário para assinar!" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "ID de aplicação do ficheiro para operar" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2225,8 +2093,6 @@ msgstr "applicationID com versionCode opcional na forma APPID[:VERCODE]" msgid "archive_url needs to end with /archive" msgstr "archive_url precisa de terminar com /archive" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2245,7 +2111,7 @@ msgstr "tentar a conexão nua por SSH para testar a implantação da chave:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "não é possível analisar as especificações do scrlib (não é uma cadeia): '{}'" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "não é possível abrir '%(filename)s': %(error)s" @@ -2259,14 +2125,10 @@ msgstr "não é possível abrir o url não-https: '{};" msgid "cannot find required srclibs: \"{path}\"" msgstr "não é possível encontrar os srclibs necessários: \"{path}\"" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "não é possível ter vários argumentos de subparser" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2285,14 +2147,6 @@ msgstr "clonagem {url}" msgid "commands from plugin modules:" msgstr "comandos dos módulos de plugin:" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "complexo" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2323,10 +2177,6 @@ msgstr "não foi possível analisar a especificação srclib (nenhum nome especi msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "não foi possível analisar a especificação srclib (referência não especificada): '{}'" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "não foi possível analisar a especificação srclib (demais símbolos '@'): '{}'" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2351,8 +2201,6 @@ msgstr "ficheiro de dependência sem bloqueio" msgid "deployed process log {path} to {dest}" msgstr "registo de processo implantado {path} a {dest}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2370,8 +2218,6 @@ msgstr "a descarga de assinaturas de scanner de '{}' falhou" msgid "executable binary, possibly code" msgstr "binário executável, possivelmente código" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2379,20 +2225,14 @@ msgid_plural "expected %s arguments" msgstr[0] "%s argumento esperado" msgstr[1] "%s argumentos esperados" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "esperado pelo menos um argumento" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "esperado um argumento no máximo" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "esperado um argumento" @@ -2405,10 +2245,6 @@ msgstr "fdroid [] [-h|--help|--version|]" msgid "fetch the latest version of signatures from the web" msgstr "buscar a versão de assinaturas mais recente da Web" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "ponto flutuante" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "Forçar os erros de metadados (padrão) para serem avisos, ou para serem ignorados." @@ -2421,8 +2257,6 @@ msgstr "git svn clone falhou" msgid "gzip file archive" msgstr "arquivo de ficheiros gzip" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2436,35 +2270,21 @@ msgstr "index-v1 deve ter uma assinatura, use ' fdroid signindex ' para criá-lo msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 deve ter uma assinatura, use droid signindex` para o criar!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "inteiro" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valor inválido do tipo %(type)s: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "opção inválida: %(value)r (escolha de %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valor conflict_resolution inválido: %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2502,8 +2322,6 @@ msgstr "espelho '%s' não termina com 'fdroid'!" msgid "mirrors set twice, in config.yml and {path}!" msgstr "espelhos (mirrors) definidos duas vezes, em config.yml e em {path}!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "argumentos mutuamente exclusivos devem ser opcional" @@ -2522,30 +2340,15 @@ msgstr "nenhum \"ícone\" em {appid}" msgid "no APK supplied" msgstr "nenhum APK fornecido" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "não tem tal opção: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "não há informações de versão encontrada!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "nenhuma informação de versão encontrada" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "não é permitido com o argumento %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2555,72 +2358,6 @@ msgstr "um dos argumentos %s é necessário" msgid "only accepts strings, lists, and tuples" msgstr "apenas aceita cadeias, listas e tuplos" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "opção %s: se realmente deseja instalar todas as apps assinadas, use --all" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "Opção %s: valor %s inválido: %r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "opção %s: escolha inválida: %r (escolha entre %s)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "opção -%s não reconhecida" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "opção -%s requer um argumento" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "opção --%s não pode ter argumento" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "opção --%s não é prefixo único" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "opção --%s não reconhecida" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "opção --%s necessita argumento" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "argumentos opcionais" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "opções" @@ -2630,8 +2367,6 @@ msgstr "opções" msgid "overwriting existing {path}" msgstr "sobrescrevendo {path} existente" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "argumentos posicionais" @@ -2664,10 +2399,6 @@ msgstr "repo_url precisa de terminar com /repo" msgid "rsync is missing or broken: {error}" msgstr "rsync está ausente ou quebrado: {error}" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "o ruamel.yaml não está instalado, não é possível escrever metadados." - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2691,17 +2422,7 @@ msgstr "serverwebroot: o caminho não termina com \"fdroid\", talvez queria usar msgid "shared library" msgstr "biblioteca partilhada" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "mostrar versão do programa e sair" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "mostrar esta ajuda e sair" @@ -2735,8 +2456,6 @@ msgstr "biblioteca estática" msgid "supplied reference binary has allowed signer {signer}" msgstr "o binário de referência fornecido tem o assinante permitido {signer}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2746,22 +2465,16 @@ msgstr "os seguintes argumentos são necessários: %s" msgid "true" msgstr "verdadeiro" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "opção de cadeia de texto inesperada: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "O formato '%(parser_name)r' é desconhecido. (Opções Válidas: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2772,9 +2485,7 @@ msgstr "argumentos não reconhecidos: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "permissões inseguras em '{config_file}' (deveria ser 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "utilização: " @@ -2803,21 +2514,19 @@ msgstr[1] "{0} apps, {1} aliases chave" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) não tem metadados!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} tem vários ficheiros {name} que, parece explorar a Master Key!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "AndroidManifest.xml do {apkfilename} tem uma data má: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} não tem um nome! A usar o ID da aplicação em vez disso." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2838,7 +2547,6 @@ msgstr "{appid} tem APKs e ficheiros: {files}" msgid "{appid} is missing {name}" msgstr "{appid} tem falta de {name}" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2879,11 +2587,6 @@ msgstr "{file} está em branco ou corrompido!" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" não existe! Corrija-o no \"config.yml\"." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile} está obsoleto, use {newfile}" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 3ac6a9f3..e0eeecf2 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -19,7 +19,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2025-03-21 18:43+0000\n" "Last-Translator: LucasMZ \n" "Language-Team: Portuguese (Brazil) \n" @@ -66,11 +66,6 @@ msgstr "O diretório raiz para \"local_copy_dir\" {path} não existe!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" já está instalado em {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" contém {name} ({version}) desatualizado" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -96,17 +91,6 @@ msgstr "\"{path}\" é assinado por uma chave que não é permitida:" msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" não é uma URL válida!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "opção %(option)s necessita %(number)d argumento" -msgstr[1] "opção %(option)s necessita %(number)d argumentos" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -122,14 +106,6 @@ msgstr "%d APKs falharam em serem assinados ou verificados!" msgid "%d problems found" msgstr "%d problemas encontrados" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [opções]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -150,13 +126,6 @@ msgstr "%s tem SHA-256 ruim: %s" msgid "%s is not an accepted build field" msgstr "%s não é um campo criado aceito" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "opção %s não leva um valor" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' não foi encontrada em config.yml!" @@ -177,8 +146,6 @@ msgstr "'keystorepass' não encontrada em config.yml!" msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' não encontrada em config.yml!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' é um argumento inválido para posicionadores" @@ -192,11 +159,6 @@ msgstr "\"sdk_path\" não definido em config.yml!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' é muito antigo, fdroid requer build-tools-{version} ou mais recente!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' será em ordem aleatória! Use () ou [] se a ordem for importante!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -207,7 +169,7 @@ msgstr "'{path}' falhou ao executar!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' tem um formato inválido, deveria ser um dicionário!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' não é um{field} válido em {appid}. Regex padrão: {pattern}" @@ -226,8 +188,6 @@ msgstr "--merge-request roda somente com um único appid!" msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate falhou para {appid} : {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() não definida" @@ -318,10 +278,6 @@ msgstr "A ferramenta SDK do Android {cmd} não foi encontrada!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "O aplicativo tem binários, mas não tem AllowedAPKSigningKeys correspondentes para fixar o certificado." -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "O aplicativo tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateMode ou UpdateCheckMode não são None" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "O aplicativo tem NoSourceSince ou ArchivePolicy \"0 versões\" ou 0, mas AutoUpdateMode ou UpdateCheckMode não são None" @@ -365,7 +321,6 @@ msgstr "Tipo de entrada incorreto \"{mirrortype}\" na configuração de espelhos msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL base para espelhar, pode incluir a chave de assinatura de índice usando a string de consulta:? Fingerprint =" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -421,11 +376,13 @@ msgstr[1] "Não é possível criar devido a {} erros durante a digitalização" msgid "Cannot rewrite \"{path}\"" msgstr "Não é possível reescrever \"{path}\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Categorias '%s' não são válidas" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "As categorias não estão definidas" @@ -478,20 +435,17 @@ msgstr "Definições conflitantes de \"{field}\" entre arquivos .yml e localizad msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumentos conflitantes: \"--verbose\" e \"--quiet\" não podem ser especificados ao mesmo tempo." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Arquivos de configuração conflitantes! Usando {newfile}, ignorando {oldfile}!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Impossível encontrar '{command}' em seu sistema" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Não foi possível encontrar o código da versão mais recente" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Não foi possível encontrar o nome da versão mais recente" @@ -511,6 +465,7 @@ msgstr "Impossível abrir o APK {path} para análise: " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Não foi possível analisar o tamanho \"{size}\", tipo incorreto \"{type}\"" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Não foi possível encontrar o ID do aplicativo" @@ -604,11 +559,6 @@ msgstr "Descrição '%s' é apenas o resumo do app" msgid "Description has a duplicate line" msgstr "Descrição tem uma linha duplicada" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "Descrição tem uma lista (%s), mas não é com marcadores (*) nem numerada (#)" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -665,11 +615,6 @@ msgstr "Faça o download do F-Droid.apk usando mirrors (sites espelhos) que vaza msgid "Download complete mirrors of small repos" msgstr "Faça o download de espelhos completos de pequenos repositórios" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "Baixando %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "O download do repositório já falhou uma vez, não tente novamente." @@ -703,14 +648,6 @@ msgstr "ERRO: %(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERRO: o subcomando \"server\" foi removido, use \"deploy\"!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"ERRO: este comando nunca deve ser usado para espelhar o f-droid.org!\n" -"Um espelho completo de f-droid.org requer mais de 200 GB." - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERRO: tipo de IC não suportado, correções bem-vindas!" @@ -857,10 +794,6 @@ msgstr "O arquivo desapareceu enquanto era processado: {path}" msgid "Finished" msgstr "Acabado" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Métodos de doação Flattr pertencem ao campo FlattrID" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Tags HTML proibidas" @@ -892,7 +825,6 @@ msgstr "Encontrado arquivo inválido \"{path}\" de financiamento para \"{name}\" msgid "Found invalid appids in arguments" msgstr "Encontrou apps inválidos em argumentos" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Encontrado versões de códigos inválidas para alguns apps" @@ -957,15 +889,13 @@ msgstr "Falha ao limpar o Git" msgid "Git fetch failed" msgstr "Falha no 'fetch' do Git" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "Falha na remoção do Git" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git remote set-head falhou: \"%s\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Falha no 'reset' do Git" @@ -1100,16 +1030,12 @@ msgstr "Versão de Operação de Código inválido: {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "Versão de Operação de Código inválido: {invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "ID do aplicativo {appid} inválido" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "Booleano inválido '%s'" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Lista com marcadores inválida" @@ -1320,7 +1246,6 @@ msgstr "Nenhum certificado de assinatura encontrado em {path}" msgid "No such package: %s" msgstr "Nenhum pacote desse tipo: %s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1355,7 +1280,6 @@ msgstr "Nada a fazer para {appid}." msgid "Now set these in config.yml:" msgstr "Agora defina estes em config.yml:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1385,19 +1309,17 @@ msgstr "Um dos itens de configuração 'github_releases' está faltando o valor msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "Um dos itens de configuração 'github_releases' está faltando o valor 'token'. ignorando ..." +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Apenas PNG e JPEG são suportados para gráficos, encontrados: {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "Aceita apenas uma única chave \"env\"" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Apenas mostrar diferenças com a Play Store" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Processar apenas apps com atualizações automáticas" @@ -1406,10 +1328,6 @@ msgstr "Processar apenas apps com atualizações automáticas" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Os métodos de doação opencollective pertencem ao campo OpenCollective" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Opções" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Exporte a saída do relatório JSON para um nome de arquivo após APK." @@ -1575,14 +1493,6 @@ msgstr "Removendo {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Renomeia arquivos APK que não correspondem a pacote.nome_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "O modo de atualização repoTrunk só faz sentido em repositórios git-svn" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Redefinir e criar um novo servidor de compilação, mesmo que o existente parecer normal." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1890,11 +1800,6 @@ msgstr "A etiqueta da licença foi inesperada \"{}\"! Use apenas etiquetas FSF o msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "A etiqueta da licença foi inesperada \"{}\"! Use apenas as etiquetas configuradas no seu arquivo de configuração" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "Destino de symlink inesperado: {link} -> {target}" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1904,7 +1809,6 @@ msgstr "Entrada desconhecida {key} em {configname}" msgid "Unknown exception found!" msgstr "Exceção desconhecida encontrada!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1942,6 +1846,7 @@ msgstr "O campo '{fieldname}' não foi reconhecido em '{path}'" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "O sinalizador de construção '{build_flag}' desconhecido em '{path}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1972,11 +1877,6 @@ msgstr "Caminho scandelete não usado: %s" msgid "Unused scanignore path: %s" msgstr "Caminho scanignore não usado: %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "Descompactando para %s" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Atualiza as informações do repositório para novos pacotes" @@ -1990,6 +1890,7 @@ msgstr "Atualiza o log de transparência de um binário para um URL" msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData tem URL inválido: {url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -2009,11 +1910,7 @@ msgstr "UpdateCheckData não é uma URL válida: {url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado." -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode está definido, mas parece que o updatecheckupdates ainda não foi executado" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName (atualização da verificação do nome) é definido como o ID comun do aplicativo - pode ser removido" @@ -2028,27 +1925,10 @@ msgstr "Enviando o {apkfilename} para o androidobservatory.org" msgid "Uploading {apkfilename} to virustotal" msgstr "Enviando o {apkfilename} para o virustotal" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Uso" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Uso: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "Use /HEAD em vez de /master ou /main para apontar para um arquivo na ramificação padrão" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Use /HEAD em vez de /master para apontar em um arquivo na ramificação predefinida" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Use ' fdroid update -c ' para criá-lo." @@ -2087,11 +1967,6 @@ msgstr "Usando assinatura JAR" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Usando o jarsigner de Java, não recomendado para verificar APKs! Use apksigner" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "Usando androguard de \"{path}\"" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2193,20 +2068,11 @@ msgstr "adicionando IdentityFile a {path}" msgid "adding to {name}: {path}" msgstr "adicionando a {name}: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opção ambígua: %(option)s pode corresponder a %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "opção ambígua: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2220,11 +2086,13 @@ msgstr "apksigner não encontrado! Não é possível assinar ou verificar APKs m msgid "apksigner not found, it's required for signing!" msgstr "o apksigner não foi encontrado, ele é necessário para assinar!" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "ID de aplicação do arquivo para operar" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2235,8 +2103,6 @@ msgstr "applicationId com versionCode opcional na forma APPID[:VERCODE]" msgid "archive_url needs to end with /archive" msgstr "archive_url precisa terminar com /archive" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2255,7 +2121,7 @@ msgstr "tentando uma conexão SSH vazia para testar a chave de implantação:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "não é possível analisar a especificação scrlib (não uma string): '{}'" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "não é possível abrir '%(filename)s': %(error)s" @@ -2269,14 +2135,10 @@ msgstr "não é possível abrir a url não-https: '{};" msgid "cannot find required srclibs: \"{path}\"" msgstr "não é possível encontrar os srclibs necessários: \"{path}\"" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "não é possível ter vários argumentos de subparser" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2295,14 +2157,6 @@ msgstr "clonagem {url}" msgid "commands from plugin modules:" msgstr "comandos a partir dos módulos de plugin:" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "complexo" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2333,10 +2187,6 @@ msgstr "não foi possível analisar a especificação srclib (nenhum nome especi msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "não foi possível analisar a especificação srclib (referência sem especificação): '{}'" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "não foi possível analisar a especificação srclib (excesso de sinais '@'): '{}'" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2361,8 +2211,6 @@ msgstr "arquivo de dependência sem bloqueio" msgid "deployed process log {path} to {dest}" msgstr "registro de processo implantado {path} para {dest}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2380,8 +2228,6 @@ msgstr "o download de assinaturas de scanner de '{}' falhou" msgid "executable binary, possibly code" msgstr "binário executável, possivelmente código" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2389,20 +2235,14 @@ msgid_plural "expected %s arguments" msgstr[0] "foi previsto %s argumento" msgstr[1] "foi previsto %s argumentos" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "esperado pelo menos um argumento" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "esperado um argumento no máximo" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "esperado um argumento" @@ -2415,10 +2255,6 @@ msgstr "fdroid [] [-h|--help|--version|]" msgid "fetch the latest version of signatures from the web" msgstr "obter a versão de assinaturas mais recente da Web" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "ponto flutuante" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "Forçar os erros de metadados (padrão) para serem avisos, ou para serem ignorados." @@ -2431,8 +2267,6 @@ msgstr "git svn clone falhou" msgid "gzip file archive" msgstr "arquivo gzip" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2446,35 +2280,21 @@ msgstr "index-v1 deve ter uma assinatura, use ' fdroid signindex ' para criá-lo msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 deve ter uma assinatura, use droid signindex` para criá-la!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "inteiro" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valor inválido do tipo %(type)s: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "opção inválida: %(value)r (escolha de %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valor conflict_resolution inválido: %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2512,8 +2332,6 @@ msgstr "espelho '%s' não termina com 'fdroid'!" msgid "mirrors set twice, in config.yml and {path}!" msgstr "espelhos (mirrors) definidos duas vezes, em config.yml e {path}!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "argumentos mutuamente exclusivos devem ser opcional" @@ -2532,30 +2350,15 @@ msgstr "nenhum \"ícone\" em {appid}" msgid "no APK supplied" msgstr "nenhum APK fornecido" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "não tem tal opção: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "não há informações de versão encontrada!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "nenhuma informação de versão encontrada" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "não é permitido com o argumento %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2565,72 +2368,6 @@ msgstr "um dos argumentos %s é necessário" msgid "only accepts strings, lists, and tuples" msgstr "apenas aceita cadeias, listas e tuplos" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "opção %s: se você realmente deseja instalar todas as apps assinadas, use --all" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "Opção %s: valor %s inválido: %r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "opção %s: escolha inválida: %r (escolha entre %s)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "opção -%s não reconhecida" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "a opção -%s necessita de argumento" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "opção --%s não pode ter argumento" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "opção --%s não é prefixo único" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "opção --%s não reconhecida" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "opção --%s necessita argumento" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "argumentos opcionais" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "opções" @@ -2640,8 +2377,6 @@ msgstr "opções" msgid "overwriting existing {path}" msgstr "sobrescrevendo {path} existente" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "argumentos posicionais" @@ -2674,10 +2409,6 @@ msgstr "repo_url precisa terminar com /repo" msgid "rsync is missing or broken: {error}" msgstr "rsync está ausente ou quebrado: {error}" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "o ruamel.yaml não está instalado, não é possível escrever os metadados." - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2701,17 +2432,7 @@ msgstr "serverwebroot: o caminho não termina com \"fdroid\", talvez você tenha msgid "shared library" msgstr "biblioteca compartilhada" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "mostra o número da versão do programa e sai" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "mostra esta mensagem de ajuda e sai" @@ -2745,8 +2466,6 @@ msgstr "biblioteca estática" msgid "supplied reference binary has allowed signer {signer}" msgstr "o binário de referência fornecido autorizou o signatário {signer}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2756,22 +2475,16 @@ msgstr "os seguintes argumentos são necessários: %s" msgid "true" msgstr "verdadeiro" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "opção de cadeia de texto inesperada: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "O formato '%(parser_name)r' é desconhecido. (Opções Válidas: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2782,9 +2495,7 @@ msgstr "argumentos não reconhecidos: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "permissões inseguras em '{config_file}' (deveria ser 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "uso: " @@ -2813,21 +2524,19 @@ msgstr[1] "{0} apls, {1} codinome de chaves" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) não tem metadados!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} tem vários arquivos {name} que, parece explorar a Master Key!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "AndroidManifest.xml do {apkfilename} tem uma data má: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} não tem um nome! Usando o ID do applicativo em vez disso." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2848,7 +2557,6 @@ msgstr "{appid} tem APKs e arquivos: {files}" msgid "{appid} is missing {name}" msgstr "{appid} tem falta de {name}" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2889,11 +2597,6 @@ msgstr "o {file} está vazio ou está corrompido!" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" não existe! Corrija-o no \"config.yml\"." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile} foi descontinuado, use {newfile}" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index aa685625..f98d328c 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2025-03-02 21:32+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" @@ -58,11 +58,6 @@ msgstr "\"local_copy_dir\" {path} não existe!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "'{apkfilename}' já está instalado no {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" contém {name} ({version}) desatualizado" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -88,17 +83,6 @@ msgstr "\"{path}\" está acessado por uma chave que não é permitida:" msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" não é uma URL válida!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "A opção %(option)s requer o argumento %(number)d" -msgstr[1] "A opção %(option)s requer os argumentos %(number)d" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -114,14 +98,6 @@ msgstr "%d APKs falharam a serem assinados ou verificados!" msgid "%d problems found" msgstr "%d problemas encontrados" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [opções]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -142,13 +118,6 @@ msgstr "%s tem um SHA-256 ruim: %s" msgid "%s is not an accepted build field" msgstr "%s não é um campo criado aceito" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "opção %s não leva um valor" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' não foi encontrada em config.yml!" @@ -169,8 +138,6 @@ msgstr "'keystorepass' não encontrada em config.yml!" msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' não encontrada em config.yml!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' é um argumento inválido para posicionadores" @@ -184,11 +151,6 @@ msgstr "'sdk_path' não definido em 'config.yml'!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' é muito antigo, fdroid requer build-tools-{version} ou mais recente!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' será em ordem aleatória! Use () ou [] se a ordem for importante!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -199,7 +161,7 @@ msgstr "'{path}' falhou ao executar!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' tem um formato inválido, deveria ser um dicionário!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' não é um {field} válido em {appid}. Modelo regex: {pattern}" @@ -218,8 +180,6 @@ msgstr "--merge-request só é executado num único appid!" msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate falhou para {appid} : {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() não definida" @@ -310,10 +270,6 @@ msgstr "Ferramenta {cmd} do Android SDK não foi encontrada!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "A app tem binários, mas não tem AllowedAPKSigningKeys correspondentes para fixar o certificado." -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "A app tem NoSourceSince ou ArchivePolicy \"0 versões\", mas AutoUpdateMode ou UpdateCheckMode não são Nenhum" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "A app tem NoSourceSince ou ArchivePolicy \"0 versions\" ou 0, mas AutoUpdateMode ou UpdateCheckMode não são None" @@ -357,7 +313,6 @@ msgstr "Tipo de entrada \"{mirrortype}\" incorreto na configuração de espelhos msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL base para espelhar, pode incluir a chave de assinatura de índice usando a cadeia de consulta: ?fingerprint =" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -413,11 +368,13 @@ msgstr[1] "Não é possível construir devido a erros {} durante a digitalizaç msgid "Cannot rewrite \"{path}\"" msgstr "Não é possível reescrever \"{path}\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "As categorias '%s' não são válidas" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "As categorias não são definidas" @@ -470,20 +427,17 @@ msgstr "Definições contraditórias de \"{field}\" entre ficheiros .yml e fiche msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumentos conflitantes: \"--verbose\" e \"--quiet\" não podem ser especificados ao mesmo tempo." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Ficheiros de configuração conflitantes! Usando {newfile}, ignorando {oldfile}!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Não foi possível encontrar '{command}' no seu sistema" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Não foi possível encontrar o código de versão mais recente" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Não foi possível encontrar o nome da versão mais recente" @@ -503,6 +457,7 @@ msgstr "Não foi possível abrir o APK {path} para análise: " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Não foi possível analisar o tamanho \"{size}\", tipo \"{type}\" incorreto" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Não foi possível encontrar o ID da aplicação" @@ -596,11 +551,6 @@ msgstr "Descrição '%s' é apenas o resumo da app" msgid "Description has a duplicate line" msgstr "A descrição tem uma linha duplicada" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "A descrição tem a lista (%s), mas não tem marcadores (*), nem é numerada (#)" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -657,11 +607,6 @@ msgstr "Descarregue o F-Droid.apk utilizando espelhos que vazam menos para a red msgid "Download complete mirrors of small repos" msgstr "Descarregar espelhos completos de repos pequenos" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "A descarregar %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "O descarregamento do repositório já falhou uma vez, não tento novamente." @@ -695,14 +640,6 @@ msgstr "ERRO: %(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERRO: o subcomando \"server\" foi removido, use \"deploy\"!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"ERRO: este comando nunca deve ser usado para espelhar f-Droid.org!\n" -"Um espelho completo de f-Droid.org requer mais que 200GB." - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERRO: tipo de CI sem suporte, patches são bem-vindos!" @@ -849,10 +786,6 @@ msgstr "O ficheiro desapareceu enquanto era processado: {path}" msgid "Finished" msgstr "Terminado" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Os métodos de doação do Flattr pertencem no campo FlattrID:" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Tags HTML proibidos" @@ -884,7 +817,6 @@ msgstr "Ficheiro de financiamento ruim \"{path}\" encontrado para \"{name}\":" msgid "Found invalid appids in arguments" msgstr "appids inválidos encontrados em argumentos" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "versionCodes inválidos encontrados para algumas apps" @@ -949,15 +881,13 @@ msgstr "Git clean falhou" msgid "Git fetch failed" msgstr "Git fetch falhou" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "Git prune falhou" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git remote set-head falhou: \"%s\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Git reset falhou" @@ -1092,16 +1022,12 @@ msgstr "VercodeOperation inválido: {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "VercodeOperation inválido: {invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "ID da aplicação {appid} inválido" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "Booleano inválido '%s'" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Lista com marcadores inválida" @@ -1312,7 +1238,6 @@ msgstr "Nenhum certificado de assinatura encontrado em {path}" msgid "No such package: %s" msgstr "Nenhum pacote desses: %s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1347,7 +1272,6 @@ msgstr "Nada a fazer para {appid}." msgid "Now set these in config.yml:" msgstr "Agora configure estes em config.yml:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1377,19 +1301,17 @@ msgstr "Um dos itens de configuração 'github_releases' não tem o valor 'proje msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "Um dos itens de configuração 'github_releases' não tem o valor 'token'. A ignorar ..." +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Somente PNG e JPEG são suportados para gráficos, encontrado: {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Apenas mostrar diferenças com a Play Store" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Processar apenas apps com atualizações automáticas" @@ -1398,10 +1320,6 @@ msgstr "Processar apenas apps com atualizações automáticas" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Os métodos de doação OpenCollective pertencem no campo OpenCollective:" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Opções" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Saída de relatório JSON para ficheiro nomeado após APK." @@ -1567,14 +1485,6 @@ msgstr "A remover {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Renomear todos os ficheiros APKs que não correspondem com package.name_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "O modo de atualização repoTrunk só faz sentido em repositórios de git-svn" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Redefinir e criar um novo servidor de compilação, mesmo que o existente parecer normal." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1882,11 +1792,6 @@ msgstr "Etiqueta de licença \"{}\" inesperada! Use somente as etiquetas aprovad msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Etiqueta de licença \"{}\" inesperada! Use somente as etiquetas de licença configuradas no seu ficheiro de configuração" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "Alvo symlink inesperado: {link} -> {target}" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1896,7 +1801,6 @@ msgstr "Entrada {key} desconhecida em {configname}" msgid "Unknown exception found!" msgstr "Exceção desconhecida!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1934,6 +1838,7 @@ msgstr "Campo de aplicação '{fieldname}' não reconhecido em '{path}'" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Bandeira de compilação '{build_flag}' não reconhecida em '{path}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1964,11 +1869,6 @@ msgstr "O caminho de scandelete não é usado: %s" msgid "Unused scanignore path: %s" msgstr "O caminho de scanignore não é usado: %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "A descompactar para %s" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Atualizar a informação do repositório para novos pacotes" @@ -1982,6 +1882,7 @@ msgstr "Atualizar o registo de transparência de binário para um URL" msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData tem URL inválido: {url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -2001,11 +1902,7 @@ msgstr "UpdateCheckData não é uma URL válida: {url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode é definido, mas parece que likecheckupdates ainda não foi executado." -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode está definido, mas parece que o updatecheckupdates ainda não foi executado" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName (o nome da verificação de atualização) é definido como o ID comun da aplicação - pode ser removido" @@ -2020,27 +1917,10 @@ msgstr "A enviar {apkfilename} ao androidobservatory.org" msgid "Uploading {apkfilename} to virustotal" msgstr "A enviar {apkfilename} ao virustotal" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Utilização" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Utilização: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "Use /HEAD em vez de /master ou /main para apontar a um ficheiro no ramo predefinido" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Use /HEAD em vez de /master para apontar num ficheiro na ramificação predefinida" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Use ' fdroid update -c ' para criá-lo." @@ -2079,11 +1959,6 @@ msgstr "A usar a assinatura JAR" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Usando o jarsigner de Java, não recomendado para verificar APKs! Use apksigner" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "Usando androguard de \"{path}\"" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2185,20 +2060,11 @@ msgstr "adicionando IdentityFile a {path}" msgid "adding to {name}: {path}" msgstr "adicionando a {name}: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opção ambígua: %(option)s poderia corresponder %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "opção ambígua: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2212,11 +2078,13 @@ msgstr "apksigner não encontrado! Não é possível assinar ou verificar APKs m msgid "apksigner not found, it's required for signing!" msgstr "Nenhum apksigner encontrado, é necessário para assinar!" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "ID de aplicação do ficheiro para operar" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2227,8 +2095,6 @@ msgstr "applicationID com versionCode opcional na forma APPID[:VERCODE]" msgid "archive_url needs to end with /archive" msgstr "archive_url precisa de terminar com /archive" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2247,7 +2113,7 @@ msgstr "tentar a conexão nua por SSH para testar a implantação da chave:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "não é possível analisar as especificações do scrlib (não é uma cadeia): '{}'" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "não é possível abrir '%(filename)s': %(error)s" @@ -2261,14 +2127,10 @@ msgstr "não é possível abrir o url não-https: '{};" msgid "cannot find required srclibs: \"{path}\"" msgstr "não é possível encontrar os srclibs necessários: \"{path}\"" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "não é possível ter vários argumentos de subparser" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2287,14 +2149,6 @@ msgstr "clonagem {url}" msgid "commands from plugin modules:" msgstr "comandos dos módulos de plugin:" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "complexo" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2325,10 +2179,6 @@ msgstr "não foi possível analisar a especificação srclib (nenhum nome especi msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "não foi possível analisar a especificação srclib (referência não especificada): '{}'" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "não foi possível analisar a especificação srclib (demais símbolos '@'): '{}'" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2353,8 +2203,6 @@ msgstr "ficheiro de dependência sem bloqueio" msgid "deployed process log {path} to {dest}" msgstr "registo de processo implantado {path} a {dest}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2372,8 +2220,6 @@ msgstr "a descarga de assinaturas de scanner de '{}' falhou" msgid "executable binary, possibly code" msgstr "binário executável, possivelmente código" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2381,20 +2227,14 @@ msgid_plural "expected %s arguments" msgstr[0] "%s argumento esperado" msgstr[1] "%s argumentos esperados" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "esperado pelo menos um argumento" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "esperado um argumento no máximo" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "esperado um argumento" @@ -2407,10 +2247,6 @@ msgstr "fdroid [] [-h|--help|--version|]" msgid "fetch the latest version of signatures from the web" msgstr "buscar a versão de assinaturas mais recente da Web" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "ponto flutuante" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "Forçar os erros de metadados (padrão) para serem avisos, ou para serem ignorados." @@ -2423,8 +2259,6 @@ msgstr "git svn clone falhou" msgid "gzip file archive" msgstr "arquivo de ficheiros gzip" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2438,35 +2272,21 @@ msgstr "index-v1 deve ter uma assinatura, use ' fdroid signindex ' para criá-lo msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 deve ter uma assinatura, use droid signindex` para o criar!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "inteiro" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "valor inválido do tipo %(type)s: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "opção inválida: %(value)r (escolha de %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valor conflict_resolution inválido: %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2504,8 +2324,6 @@ msgstr "espelho '%s' não termina com 'fdroid'!" msgid "mirrors set twice, in config.yml and {path}!" msgstr "espelhos (mirrors) definidos duas vezes, em config.yml e em {path}!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "argumentos mutuamente exclusivos devem ser opcional" @@ -2524,30 +2342,15 @@ msgstr "nenhum \"ícone\" em {appid}" msgid "no APK supplied" msgstr "nenhum APK fornecido" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "não tem tal opção: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "não há informações de versão encontrada!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "nenhuma informação de versão encontrada" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "não é permitido com o argumento %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2557,72 +2360,6 @@ msgstr "um dos argumentos %s é necessário" msgid "only accepts strings, lists, and tuples" msgstr "apenas aceita cadeias, listas e tuplos" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "opção %s: se realmente deseja instalar todas as apps assinadas, use --all" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "Opção %s: valor %s inválido: %r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "opção %s: escolha inválida: %r (escolha entre %s)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "opção -%s não reconhecida" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "opção -%s requer um argumento" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "opção --%s não pode ter argumento" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "opção --%s não é prefixo único" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "opção --%s não reconhecida" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "opção --%s necessita argumento" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "argumentos opcionais" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "opções" @@ -2632,8 +2369,6 @@ msgstr "opções" msgid "overwriting existing {path}" msgstr "sobrescrevendo {path} existente" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "argumentos posicionais" @@ -2666,10 +2401,6 @@ msgstr "repo_url precisa de terminar com /repo" msgid "rsync is missing or broken: {error}" msgstr "rsync está ausente ou quebrado: {error}" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "o ruamel.yaml não está instalado, não é possível escrever metadados." - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2693,17 +2424,7 @@ msgstr "serverwebroot: o caminho não termina com \"fdroid\", talvez queria usar msgid "shared library" msgstr "biblioteca partilhada" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "mostrar versão do programa e sair" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "mostrar esta ajuda e sair" @@ -2737,8 +2458,6 @@ msgstr "biblioteca estática" msgid "supplied reference binary has allowed signer {signer}" msgstr "o binário de referência fornecido tem o assinante permitido {signer}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2748,22 +2467,16 @@ msgstr "os seguintes argumentos são necessários: %s" msgid "true" msgstr "verdadeiro" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "opção de cadeia de texto inesperada: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "O formato '%(parser_name)r' é desconhecido. (Opções Válidas: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2774,9 +2487,7 @@ msgstr "argumentos não reconhecidos: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "permissões inseguras em '{config_file}' (deveria ser 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "utilização: " @@ -2805,21 +2516,19 @@ msgstr[1] "{0} apps, {1} aliases chave" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) não tem metadados!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} tem vários ficheiros {name} que, parece explorar a Master Key!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "AndroidManifest.xml do {apkfilename} tem uma data má: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} não tem um nome! A usar o ID da aplicação em vez disso." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2840,7 +2549,6 @@ msgstr "{appid} tem APKs e ficheiros: {files}" msgid "{appid} is missing {name}" msgstr "{appid} tem falta de {name}" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2881,11 +2589,6 @@ msgstr "{file} está em branco ou corrompido!" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" não existe! Corrija-o no \"config.yml\"." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile} está obsoleto, use {newfile}" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index e4d1874b..ef35bf45 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2024-12-02 17:00+0000\n" "Last-Translator: Licaon Kter \n" "Language-Team: Romanian \n" @@ -56,11 +56,6 @@ msgstr "\"local_copy_dir\" {path} nu există!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" este deja instalat pe {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" conține {name} ({version}) depășite" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -86,18 +81,6 @@ msgstr "\"{path}\" este semnat de o cheie care nu este permisă:" msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" nu este un URL valid!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "Opțiunea %(option)s necesită %(number)d argument" -msgstr[1] "Opțiunea %(option)s necesită %(number)d argumente" -msgstr[2] "Opțiunea %(option)s necesită %(number)d argumente" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -113,14 +96,6 @@ msgstr "%d fișiere APK nu au putut fi semnate sau verificate!" msgid "%d problems found" msgstr "%d probleme găsite" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [opțiuni]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -141,13 +116,6 @@ msgstr "%s are un SHA-256 greșit: %s" msgid "%s is not an accepted build field" msgstr "%s nu este un câmp de construcție acceptat" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "Opțiunea %s nu acceptă o valoare" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' nu a fost găsit în config.yml!" @@ -168,8 +136,6 @@ msgstr "'keystorepass' nu se găsește în config.yml!" msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' nu se găsește în config.yml!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' este un argument invalid pentru poziționale" @@ -183,11 +149,6 @@ msgstr "'sdk_path' nu este setat în 'config.yml'!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' este prea vechi, fdroid necesită build-tools-{version} sau mai nou!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' va fi în ordine aleatorie! Folosiți paranteze () sau [] dacă ordinea este importantă!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -198,7 +159,7 @@ msgstr "'{path}' nu a reușit să se execute!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' are un format invalid, ar trebui să fie un dicționar!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' nu este valid {field} în {appid}. Regex model: {pattern}" @@ -217,8 +178,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate a eșuat pentru {appid} : {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() nu este definit" @@ -309,10 +268,6 @@ msgstr "Instrumentul Android SDK {cmd} nu a fost găsit!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Aplicația are binare, dar nu are AllowedAPKSigningKeys corespunzătoare pentru a fixa certificatul." -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "App are NoSourceSince sau ArchivePolicy \"0 versions\" dar AutoUpdateMode sau UpdateCheckMode nu sunt None" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Aplicatia are NoSourceSince sau ArchivePolicy \"0 versions\" dar AutoUpdateMode sau UpdateCheckMode nu sunt None" @@ -356,7 +311,6 @@ msgstr "Intrare de tip \"{mirrortype}\" greșită în configurația oglinzilor: msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL de bază pentru oglindire, poate include cheia de semnare a indexului folosind șirul de interogare: ?fingerprint=" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -413,11 +367,13 @@ msgstr[2] "Nu se poate construi din cauza erorilor {} în timpul scanării" msgid "Cannot rewrite \"{path}\"" msgstr "Nu se poate rescrie \"{path}\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Categoriile \"%s\" nu sunt valabile" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Categoriile nu sunt setate" @@ -470,20 +426,17 @@ msgstr "Definiții \"{field}\" contradictorii între fișierele .yml și cele lo msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumente contradictorii: '--verbose' și '--quiet' nu pot fi specificate în același timp." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Fișiere de configurare conflictuale! Folosind {newfile}, ignorând {oldfile}!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Nu a putut găsi '{command}' pe sistemul dvs" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Nu a putut găsi codul ultimei versiuni" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Nu a putut găsi numele celei mai recente versiuni" @@ -503,6 +456,7 @@ msgstr "Nu s-a putut deschide APK {path} pentru analiză: " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Nu a putut analiza dimensiunea \"{size}\", tip greșit \"{type}\"" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Nu s-a putut găsi ID-ul aplicației" @@ -596,11 +550,6 @@ msgstr "Descrierea \"%s\" este doar un rezumat al aplicației" msgid "Description has a duplicate line" msgstr "Descrierea are o linie duplicată" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "Descrierea are o listă (%s), dar nu este punctată (*) și nici numerotată (#)" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -657,11 +606,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "Descărcați oglinzi complete ale depozitelor mici" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "Descărcare %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Descărcarea depozitului a eșuat deja o dată, nu mai încerc din nou." @@ -695,14 +639,6 @@ msgstr "EROARE: %(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ERROR: Subcomanda \"server\" a fost eliminată, utilizați \"deploy\"!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"ERROR: această comandă nu ar trebui să fie folosită niciodată pentru a oglindi f-droid.org!\n" -"O oglindă completă a f-droid.org necesită mai mult de 200GB." - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ERROR: tip CI neacceptat, patch-uri binevenite!" @@ -849,10 +785,6 @@ msgstr "Fișierul a dispărut în timpul procesării acestuia: {path}" msgid "Finished" msgstr "Finalizat" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Metodele de donație Flattr fac parte din FlattrID: câmp" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Etichete HTML interzise" @@ -884,7 +816,6 @@ msgstr "Am găsit un fișier de finanțare necorespunzător \"{path}\" pentru \" msgid "Found invalid appids in arguments" msgstr "Găsit appids invalid în argumente" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Am găsit coduri de versiune invalide pentru unele aplicații" @@ -949,15 +880,13 @@ msgstr "Curățarea Git a eșuat" msgid "Git fetch failed" msgstr "Git fetch a eșuat" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "Git plum a eșuat" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git remote set-head a eșuat: \"%s\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Resetarea Git a eșuat" @@ -1092,16 +1021,12 @@ msgstr "VercodeOperation invalid: {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "VercodeOperation invalidă: {invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "ID-ul aplicației nevalabil {appid}" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "Boolean invalid \"%s" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Listă cu puncte invalidă" @@ -1312,7 +1237,6 @@ msgstr "Nu s-au găsit certificate de semnare în {path}" msgid "No such package: %s" msgstr "Nu există un astfel de pachet: %s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1347,7 +1271,6 @@ msgstr "Nimic de făcut pentru {appid}." msgid "Now set these in config.yml:" msgstr "Acum setați-le în config.yml:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1377,19 +1300,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Doar PNG și JPEG sunt acceptate pentru grafică, găsite: {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Imprimă doar diferențele cu Play Store" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Procesați numai aplicațiile cu actualizări automate" @@ -1398,10 +1319,6 @@ msgstr "Procesați numai aplicațiile cu actualizări automate" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Metodele de donație OpenCollective aparțin OpenCollective: câmp" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Opțiuni" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Emite raportul JSON în fișierul numit după APK." @@ -1567,14 +1484,6 @@ msgstr "Eliminarea lui {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Redenumiți fișierele APK care nu se potrivesc cu package.name_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "Modul de actualizare RepoTrunk are sens doar în depozitele git-svn" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Resetați și creați un nou server de construcție, chiar dacă cel existent pare să fie în regulă." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1884,11 +1793,6 @@ msgstr "Etichetă de licență neașteptată \"{}\"! Folosiți numai etichete ap msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Etichetă de licență neașteptată \"{}\"! Utilizați numai etichetele de licență configurate în fișierul de configurare" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "Neașteptată țintă symlink: {link} -> {target}" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1898,7 +1802,6 @@ msgstr "Intrare necunoscută {key} în {configname}" msgid "Unknown exception found!" msgstr "S-a găsit o excepție necunoscută!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1936,6 +1839,7 @@ msgstr "Câmp de aplicație nerecunoscut '{fieldname}' în '{path}'" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Indicator de construcție nerecunoscut '{build_flag}' în '{path}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1966,11 +1870,6 @@ msgstr "Calea de scanare a ștergerii neutilizată: %s" msgid "Unused scanignore path: %s" msgstr "Cale de scanare neutilizată: %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "Decomprimarea la %s" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Actualizarea informațiilor repo pentru noile pachete" @@ -1984,6 +1883,7 @@ msgstr "Actualizarea jurnalului de transparență binară pentru o adresă URL" msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData are un URL invalid: {url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -2003,11 +1903,7 @@ msgstr "UpdateCheckData nu este un URL valid: {url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode este setat, dar se pare că checkupdates nu a fost încă rulat." -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode este setat, dar se pare că checkupdates nu a fost încă rulat" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName este setat la ID-ul cunoscut al aplicației, acesta poate fi eliminat" @@ -2022,27 +1918,10 @@ msgstr "Încărcarea {apkfilename} pe androidobservatory.org" msgid "Uploading {apkfilename} to virustotal" msgstr "Încărcarea {apkfilename} la virustotal" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Utilizare" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Utilizare: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "Folosiți /HEAD în loc de /master sau /main pentru a indica un fișier din ramura implicită" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Folosiți /HEAD în loc de /master pentru a indica un fișier din ramura implicită" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Utilizați `fdroid update -c` pentru a-l crea." @@ -2081,11 +1960,6 @@ msgstr "Folosind JAR Signature" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Folosind jarsigner de la Java, nu este recomandat pentru verificarea APK-urilor! Utilizați apksigner" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "Folosind androguard din \"{path}\"" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2187,20 +2061,11 @@ msgstr "adăugând IdentityFile la {path}" msgid "adding to {name}: {path}" msgstr "adăugând la {name}: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "opțiune ambiguă: %(option)s ar putea corespunde cu %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "opțiune ambiguă: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2214,11 +2079,13 @@ msgstr "apksigner nu a fost găsit! Nu se poate semna sau verifica APK-urile mod msgid "apksigner not found, it's required for signing!" msgstr "apksigner nu a fost găsit, este necesar pentru a semna!" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "ID-ul de aplicație al fișierului pe care se operează" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2229,8 +2096,6 @@ msgstr "ID-ul aplicației cu versionCode opțional sub forma APPID[:VERCODE]" msgid "archive_url needs to end with /archive" msgstr "archive_url trebuie să se termine cu /archive" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2249,7 +2114,7 @@ msgstr "încercând o conexiune SSH goală pentru a testa cheia de implementare: msgid "can not parse scrlib spec (not a string): '{}'" msgstr "nu poate analiza specificația scrlib (not a string): '{}'" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "nu se poate deschide '%(filename)s': %(error)s" @@ -2263,14 +2128,10 @@ msgstr "nu se poate deschide un URL non-https: '{};" msgid "cannot find required srclibs: \"{path}\"" msgstr "nu poate găsi srclibs necesare: \"{path}\"" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "nu poate avea mai multe argumente subparser" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2289,14 +2150,6 @@ msgstr "clonarea {url}" msgid "commands from plugin modules:" msgstr "comenzi din modulele plugin:" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "complexă" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2328,10 +2181,6 @@ msgstr "nu a putut analiza specificația srclib (nu a fost specificat niciun num msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "nu a putut analiza specificația srclib (nu a fost specificat niciun ref): '{}'" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "could not parse srclib spec (prea multe semne '@'): '{}'" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2356,8 +2205,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "a implementat jurnalul de proces {path} la {dest}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2375,8 +2222,6 @@ msgstr "descărcarea semnăturilor de scaner de la '{}' a eșuat" msgid "executable binary, possibly code" msgstr "binar executabil, eventual cod" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2385,20 +2230,14 @@ msgstr[0] "argument %s așteptat" msgstr[1] "argumente %s așteptate" msgstr[2] "argumente %s așteptate" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "se așteaptă cel puțin un argument" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "se așteaptă cel mult un argument" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "se așteaptă un singur argument" @@ -2411,10 +2250,6 @@ msgstr "fdroid [] [-h|--help|--version|]" msgid "fetch the latest version of signatures from the web" msgstr "extrage cea mai recentă versiune de semnături de pe web" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "punct flotant" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "forțează erorile de metadate (implicit) să fie avertismente sau să fie ignorate." @@ -2427,8 +2262,6 @@ msgstr "git svn clone a eșuat" msgid "gzip file archive" msgstr "Arhiva de fișiere gzip" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2442,35 +2275,21 @@ msgstr "index-v1 trebuie să aibă o semnătură, folosiți `fdroid signindex` p msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 trebuie să aibă o semnătură, folosiți `fdroid signindex` pentru a o crea!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "întreg" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "invalid %(type)s valoare: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "alegere invalidă: %(value)r (alege din %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "valoare invalidă a rezoluției_conflictului: %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2508,8 +2327,6 @@ msgstr "oglinda '%s' nu se termină cu 'fdroid'!" msgid "mirrors set twice, in config.yml and {path}!" msgstr "servere de rezervă duplicat, în config.yml și {path}!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "argumentele care se exclud reciproc trebuie să fie opționale" @@ -2528,30 +2345,15 @@ msgstr "nu există \" pictogramă \" în {appid}" msgid "no APK supplied" msgstr "nici un APK furnizat" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "nu există o astfel de opțiune: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "nu s-au găsit informații despre versiune!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "nu s-au găsit informații despre versiune" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "nu este permis cu argumentul %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2561,72 +2363,6 @@ msgstr "unul dintre argumentele %s este necesar" msgid "only accepts strings, lists, and tuples" msgstr "acceptă doar șiruri de caractere, liste și tupluri" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "opțiunea %s: Dacă doriți cu adevărat să instalați toate aplicațiile semnate, utilizați --all" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "opțiunea %s: valoare %s invalidă: %r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "opțiunea %s: alegere invalidă: %r (alege din %s)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "opțiunea -%s nerecunoscută" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "opțiunea -%s necesită argument" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "opțiunea --%s nu trebuie să aibă un argument" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "opțiunea --%s nu este un prefix unic" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "opțiunea --%s nerecunoscută" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "opțiunea --%s necesită un argument" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "argumente opționale" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "opțiuni" @@ -2636,8 +2372,6 @@ msgstr "opțiuni" msgid "overwriting existing {path}" msgstr "suprascriere {path} existent" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "argumente poziționale" @@ -2670,10 +2404,6 @@ msgstr "repo_url trebuie să se termine cu /repo" msgid "rsync is missing or broken: {error}" msgstr "rsync lipsește sau este nefuncțional: {error}" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "ruamel.yaml nu este instalat, nu poate scrie metadatele." - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2697,17 +2427,7 @@ msgstr "serverwebroot: calea nu se termină cu \"fdroid\", poate că v-ați refe msgid "shared library" msgstr "bibliotecă partajată" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "arată numărul versiunii programului și iese" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "arată acest mesaj de ajutor și iese" @@ -2741,8 +2461,6 @@ msgstr "bibliotecă statică" msgid "supplied reference binary has allowed signer {signer}" msgstr "binare de referință furnizate au permis semnatarului {signer}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2752,22 +2470,16 @@ msgstr "sunt necesare următoarele argumente: %s" msgid "true" msgstr "adevărat" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "șir de opțiuni neașteptate: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "parser necunoscut %(parser_name)r (choices: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2778,9 +2490,7 @@ msgstr "argumente nerecunoscute: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "permisiuni nesigure pe '{config_file}' (ar trebui să fie 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "utilizare: " @@ -2810,21 +2520,19 @@ msgstr[2] "{0} aplicații, {1} aliasuri de chei" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) nu are metadate!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} are mai multe fișiere {name}, pare a fi un exploit Master Key!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "AndroidManifest.xml al lui {apkfilename} are o dată greșită: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} nu are un nume! În schimb, utilizați ID-ul aplicației." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2845,7 +2553,6 @@ msgstr "{appid} are atât APK-uri, cât și fișiere: {files}" msgid "{appid} is missing {name}" msgstr "{appid} lipsește {name}" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2886,11 +2593,6 @@ msgstr "{file} este gol sau corupt!" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" nu există! Verificați \"config.yml\"." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile} este depreciat, folosiți {newfile}" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 5cee962a..9690ada4 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -20,7 +20,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2025-01-25 15:42+0000\n" "Last-Translator: Golubev Alexander \n" "Language-Team: Russian \n" @@ -67,11 +67,6 @@ msgstr "\"local_copy_dir\" {path} не существует!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "'{apkfilename}' уже установлен на {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "В пути \"{path}\" устаревшие имя {name} или версия {version} пакета" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -97,18 +92,6 @@ msgstr "\"{path}\" подписан ключом, который не разре msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" — не корректный URL!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "Параметр %(option)s требует %(number)d аргумент" -msgstr[1] "Параметр %(option)s требует %(number)d аргумента" -msgstr[2] "Параметр %(option)s требует %(number)d аргументов" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -124,14 +107,6 @@ msgstr "%d APK не удалось подписать или проверить! msgid "%d problems found" msgstr "%d ошибок найдено" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [параметры]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -152,13 +127,6 @@ msgstr "%s имеет неверный SHA-256: %s" msgid "%s is not an accepted build field" msgstr "%s не является допустимым полем" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "%s параметр не принимает значений" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "В config.yml нет переменной 'keypass'!" @@ -179,8 +147,6 @@ msgstr "'keystorepass' не найден в config.yml!" msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' не найден в config.yml!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' не годится в качестве позиционного аргумента" @@ -194,11 +160,6 @@ msgstr "'sdk_path' не найден в config.yml!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "{aapt} — устаревшая версия, F-droid нужна версия build-tools-{version} или более поздняя!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' добавлено в произвольном порядке! Если порядок важен, используйте скобки () и []!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -209,7 +170,7 @@ msgstr "{path} не удалось исполнить!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' имеет недопустимый формат, это должен быть словарь!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' не подходит в качестве {field} в {appid}. Образец регулярного выражения: {pattern}" @@ -228,8 +189,6 @@ msgstr "--merge-request работает только с одним appid!" msgid "...checkupdate failed for {appid} : {error}" msgstr "...checkupdate для {appid} завершился ошибкой: {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() не определен" @@ -320,10 +279,6 @@ msgstr "Инструмент Android SDK {cmd} не найден!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "У приложения задано поле Binaries, но не указано AllowedAPKSigningKeys, что необходимо, чтобы ограничить ключи подписи." -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "У приложения задано поле NoSourceSince, или поле ArchivePolicy равно \"0 versions\", но AutoUpdateMode или UpdateCheckMode не равны None" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "У приложения задано поле NoSourceSince, или поле ArchivePolicy равно \"0 versions\" или \"0\", но AutoUpdateMode или UpdateCheckMode не равны None" @@ -367,7 +322,6 @@ msgstr "Неверный тип записи \"{mirrortype}\" в конфигу msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Основной URL-адрес зеркала может содержать ключ для подписывания индекса (добавьте запрос \"?fingerprint=\")" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -424,11 +378,13 @@ msgstr[2] "Запустить сборку невозможно из-за {} о msgid "Cannot rewrite \"{path}\"" msgstr "Невозможно переписать \"{path}\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Неправильные категории: '%s'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Категории не выбраны" @@ -481,20 +437,17 @@ msgstr "Конфликтующие определения \"{field}\" между msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Несовместимые аргументы: '--verbose' и '--quiet' нельзя указывать одновременно." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Конфликтуюущие файлы настроек! {newfile} — используется; {oldfile} — игнорируется!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "В вашей системе недоступна команда '{command}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Не удалось найти последнюю версию приложения (versionCode)" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Не удалось найти название последней версии" @@ -514,6 +467,7 @@ msgstr "Не удалось открыть и проанализировать msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Не удалось разобрать размер «{size}», неверный тип «{type}»" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Не удалось найти Application ID" @@ -607,11 +561,6 @@ msgstr "Описание '%s' копирует краткий обзор при msgid "Description has a duplicate line" msgstr "В описании встречаются одинаковые строки" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "В описании есть неразмеченный список (%s). Воспользуйтесь (*) для ненумерованного списка и (#) для нумерованного" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -668,11 +617,6 @@ msgstr "Загружать F-Droid.apk с помощью тех зеркал, и msgid "Download complete mirrors of small repos" msgstr "Полностью загружать зеркала для небольших репозиториев" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "Загрузка %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Репозиторий не удалось склонировать с первой попытки." @@ -706,14 +650,6 @@ msgstr "ОШИБКА: %(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ОШИБКА: подкоманда \"server\" была удалена, используйте \"deploy\"!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"ОШИБКА: эту команду ни в коем случае нельзя использовать для создания зеркала f-droid.org!\n" -"Оно занимает больше 200 Гб." - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ОШИБКА: этот тип CI не поддерживается, налаживайте и присылайте патчи!" @@ -860,10 +796,6 @@ msgstr "Файл исчез во время обработки: {path}" msgid "Finished" msgstr "Готово" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Cсылка на пожертвования через Flattr должна быть в поле «FlattrID:»" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Запрещенные теги HTML" @@ -895,7 +827,6 @@ msgstr "Обнаружен неверный файл финансировани msgid "Found invalid appids in arguments" msgstr "В аргументах обнаружены неправильные appid" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Для некоторых приложений обнаружены неправильные номера внутренней версии (versionCode)" @@ -960,15 +891,13 @@ msgstr "Очистка репозитория (git clean) не удалась" msgid "Git fetch failed" msgstr "Не удалось получить данные из репозитория (git fetch)" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "Не удалось выполнить Git prune" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Не удалось настроить HEAD для удаленного репозитория (git remote set-head): \"%s\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Не удалось отменить изменения (git reset)" @@ -1103,16 +1032,12 @@ msgstr "Расхождение версий приложения в метада msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "Недействительная VercodeOperation: {invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "Неверный ID приложения: {appid}" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "Расхождение условий перехода состояния (boolean) в метаданных: '%s'" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Неверно размеченный список" @@ -1323,7 +1248,6 @@ msgstr "В {path} не обнаружены сертификаты для под msgid "No such package: %s" msgstr "Такого пакета не существует: %s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1358,7 +1282,6 @@ msgstr "Автоматические обновления для {appid} нед msgid "Now set these in config.yml:" msgstr "Определите эти переменные в config.yml:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1388,19 +1311,17 @@ msgstr "В одном из 'github_releases' отсутствует значен msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "В одном из 'github_releases' отсутствует значение 'token'; пропускаем ..." +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Допускаются изображения только в форматах PNG и JPEG: {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Отобразить только приложения, версия которых в Play Store отличается от здешней" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Запустить проверку только для приложений с автоматическим обновлением" @@ -1409,10 +1330,6 @@ msgstr "Запустить проверку только для приложен msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Cсылка на пожертвования через OpenCollective должна быть в поле «OpenCollective:»" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Параметры" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Вывод отчета в формате JSON под именем файла APK." @@ -1578,14 +1495,6 @@ msgstr "Удаление {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Переименовать все APK файлы, не соответствующие шаблону \"название.пакета_123.apk\"" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "Режим обновления RepoTrunk имеет смысл только в репозиториях git-svn" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Сбросить все настройки и создать новый сервер сборки, даже если со старым все в порядке." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1894,11 +1803,6 @@ msgstr "Неожиданная метка лицензии: \"{}\"! Исполь msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Неожиданная метка лицензии: \"{}\"! Используйте только метки, указанные в вашем файле настроек" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "Неожиданная цель симлинка: {link} -> {target}" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1908,7 +1812,6 @@ msgstr "Неизвестная запись {key} в {configname}" msgid "Unknown exception found!" msgstr "Произошла неизвестная ошибка!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1946,6 +1849,7 @@ msgstr "Неизвестное поле приложения '{fieldname}' в '{ msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Неизвестный флаг сборки '{build_flag}' в '{path}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1976,11 +1880,6 @@ msgstr "Неиспользованный scandelete-путь: %s" msgid "Unused scanignore path: %s" msgstr "Неиспользованный scanignore-путь: %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "Распаковка в %s" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Обновить информацию о репозитории для новых пакетов" @@ -1994,6 +1893,7 @@ msgstr "Обновить лог степени прозрачности (binary msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData содержит некорректный URL-адрес: {url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -2013,11 +1913,7 @@ msgstr "UpdateCheckData содержит некорректный URL-адрес msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode установлен, но похоже, что checkupdates еще не запущен." -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode установлен, но похоже, что функцияheckupdates еще не запущена" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "Имя приложения для проверки обновлений (UpdateCheckName) соответствует ID приложения — это поле можно удалить" @@ -2032,27 +1928,10 @@ msgstr "Загрузка {apkfilename} на androidobservatory.org" msgid "Uploading {apkfilename} to virustotal" msgstr "Загрузка {apkfilename} на virustotal" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Использование" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Использование: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "Используйте /HEAD вместо /master или /main, чтобы указать на файл в ветке по умолчанию" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Указывайте /HEAD, а не /master, ссылаясь на файл в ветке по умолчанию" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Чтобы создать необходимые файлы метаданных, выполните `fdroid update -c`." @@ -2091,11 +1970,6 @@ msgstr "Использование подписи JAR" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Проверка APK с помощью Java jarsigner. Так делать не следует! Пользуйтесь для этого apksigner" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "Запуск androguard из \"{path}\"" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2197,20 +2071,11 @@ msgstr "добавление IdentiyFile в {path}" msgid "adding to {name}: {path}" msgstr "добавление в {name}:{path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "неоднозначный выбор: %(option)s совпадает с %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "неоднозначный выбор: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2224,11 +2089,13 @@ msgstr "apksigner не найден! Невозможно подписать и msgid "apksigner not found, it's required for signing!" msgstr "apksigner не найден, он необходим для создания подписи!" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "ID приложения того файла, с которым будут производится операции" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2239,8 +2106,6 @@ msgstr "ID приложения и внутренняя версия прило msgid "archive_url needs to end with /archive" msgstr "archive_url должен оканчиваться «/archive»" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2259,7 +2124,7 @@ msgstr "попытка установить голое SSH-соединение msgid "can not parse scrlib spec (not a string): '{}'" msgstr "не удалось разобрать спецификацию scrlib (не является строкой): '{}'" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "не удается открыть '%(filename)s': %(error)s" @@ -2273,14 +2138,10 @@ msgstr "не удалось открыть не-https url: '{};" msgid "cannot find required srclibs: \"{path}\"" msgstr "не удалось найти необходимые srclibs: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "у субпарсера должен быть только один аргумент" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2299,14 +2160,6 @@ msgstr "клонирование {url}" msgid "commands from plugin modules:" msgstr "Команды из подключаемых модулей:" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "комплекс" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2338,10 +2191,6 @@ msgstr "не удалось разобрать srclib spec (не указано msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "не удалось разобрать спецификацию scrlib (не задана ссылка): '{}'" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "не удалось разобрать спецификацию scrlib (слишком много символов '@'): '{}'" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2366,8 +2215,6 @@ msgstr "файл зависимостей без блокировки" msgid "deployed process log {path} to {dest}" msgstr "лог {path} загружен на {dest}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2385,8 +2232,6 @@ msgstr "не удалось загрузить подписи сканера с msgid "executable binary, possibly code" msgstr "исполняемый бинарный файл, возможно код" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2395,20 +2240,14 @@ msgstr[0] "необходимо указать %s аргумент" msgstr[1] "необходимо указать %s аргумента" msgstr[2] "необходимо указать %s аргументов" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "необходимо указать хотя бы один аргумент" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "можно указать только один аргумент" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "можно указать только один аргумент" @@ -2421,10 +2260,6 @@ msgstr "fdroid [<команда>] [-h|--help|--version|<аргументы>]" msgid "fetch the latest version of signatures from the web" msgstr "получить последнюю версию подписей из интернета" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "с плавающей запятой" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "принудительно обрабатывать ошибки как предупреждения или игнорировать их." @@ -2437,8 +2272,6 @@ msgstr "команда git svn clone не выполнена" msgid "gzip file archive" msgstr "архив gzip" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2452,35 +2285,21 @@ msgstr "index-v1 должен быть подписан, сделайте это msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 должен быть подписан, сделайте это с помощью `fdroid signindex`!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "число" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "неверное %(type)s значение: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "неверный выбор: %(value)r (следует выбрать из %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "неверное значение conflict_resolution: %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2518,8 +2337,6 @@ msgstr "адрес зеркала '%s' должен заканчиваться ' msgid "mirrors set twice, in config.yml and {path}!" msgstr "Зеркала установлены дважды, в config.yml и {path}!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "взаимоисключающие аргументы не должны быть обязательными" @@ -2538,30 +2355,15 @@ msgstr "{appid} не содержит поля \"icon\"" msgid "no APK supplied" msgstr "APK файл не указан" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "такого параметра нет: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "определить версию не удалось!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "информация о версии не найдена" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "недопустимо с аргументом %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2571,72 +2373,6 @@ msgstr "необходимо указать хотя бы один аргуме msgid "only accepts strings, lists, and tuples" msgstr "принимает строки, списки и туплы" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "параметр %s: если вы действительно хотите установить все подписанные приложения, то используйте --all" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "параметр %s: неверное %s значение: %r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "параметр %s: неверный выбор: %r (следует выбрать из %s)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "параметр -%s не распознан" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "параметр -%s требует аргумент" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "параметру --%s не нужны аргументы" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "параметр --%s не является уникальным префиксом" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "параметр --%s не распознан" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "параметру --%s нужен аргумент" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "необязательные аргументы" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "параметры" @@ -2646,8 +2382,6 @@ msgstr "параметры" msgid "overwriting existing {path}" msgstr "перезапись существующего пути {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "позиционные аргументы" @@ -2680,10 +2414,6 @@ msgstr "repo_url должен оканчиваться «/repo»" msgid "rsync is missing or broken: {error}" msgstr "rsync отсутствует или сломан: {error}" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "ruamel.yaml не установлен, не получается записать метаданные." - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2707,17 +2437,7 @@ msgstr "serverwebroot: путь не заканчивается на \"fdroid\", msgid "shared library" msgstr "разделяемая библиотека" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "показать номер версии программы и выйти" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "показать это справочное сообщение и выйти" @@ -2751,8 +2471,6 @@ msgstr "статическая библиотека" msgid "supplied reference binary has allowed signer {signer}" msgstr "предоставленный эталонный двоичный файл разрешил подписанту {signer}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2762,22 +2480,16 @@ msgstr "требуются аргументы: %s" msgid "true" msgstr "истина" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "неизвестная строка параметра: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "неизвестный парсер %(parser_name)r (следует выбрать из %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2788,9 +2500,7 @@ msgstr "неизвестные аргументы: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "небезопасные права доступа к файлу '{config_file}' (должны быть 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "использование: " @@ -2820,21 +2530,19 @@ msgstr[2] "{0} приложений, {1} алиасов ключей для по msgid "{apkfilename} ({appid}) has no metadata!" msgstr "Не обнаружено метаданных для {apkfilename} ({appid})!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "У {apkfilename} несколько файлов {name}. Выглядит подозрительно и похоже на попытку нарушения безопасности (Master Key exploit)!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "AndroidManifest.xml приложения {apkfilename} содержит неверную дату: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "У {appid} нет имени! Будет использовано ID приложения." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2855,7 +2563,6 @@ msgstr "{appid} содержит как APK, так и файлы: {files}" msgid "{appid} is missing {name}" msgstr "В {appid} нет {name}" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2896,11 +2603,6 @@ msgstr "{file} пустой или поврежденный!" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name}: \"{section}/icons/{path}\" не существует! Поправьте свой \"config.yml\"." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile} признан устаревшим; используйте {newfile}" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/sk/LC_MESSAGES/fdroidserver.po b/locale/sk/LC_MESSAGES/fdroidserver.po index 74190989..dd673c7f 100644 --- a/locale/sk/LC_MESSAGES/fdroidserver.po +++ b/locale/sk/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -47,11 +47,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -77,18 +72,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -104,14 +87,6 @@ msgstr "" msgid "%d problems found" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -132,13 +107,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "" @@ -159,8 +127,6 @@ msgstr "" msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -174,11 +140,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -189,7 +150,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -208,8 +169,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr "" @@ -300,10 +259,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -347,7 +302,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -404,11 +358,13 @@ msgstr[2] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -461,20 +417,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -494,6 +447,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -587,11 +541,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -648,11 +597,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -686,12 +630,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -836,10 +774,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -871,7 +805,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -936,15 +869,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1079,16 +1010,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1299,7 +1226,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1334,7 +1260,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1364,19 +1289,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1385,10 +1308,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1554,14 +1473,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1863,11 +1774,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1877,7 +1783,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1915,6 +1820,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1945,11 +1851,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -1963,6 +1864,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1982,11 +1884,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2001,27 +1899,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2060,11 +1941,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2166,20 +2042,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2193,11 +2060,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2208,8 +2077,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2228,7 +2095,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" @@ -2242,14 +2109,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2268,14 +2131,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2307,10 +2162,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2335,8 +2186,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2354,8 +2203,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2364,20 +2211,14 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2390,10 +2231,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2406,8 +2243,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2421,35 +2256,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2487,8 +2308,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2507,30 +2326,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2540,72 +2344,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "" @@ -2615,8 +2353,6 @@ msgstr "" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "" @@ -2649,10 +2385,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2676,17 +2408,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "" @@ -2720,8 +2442,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2731,22 +2451,16 @@ msgstr "" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2757,9 +2471,7 @@ msgstr "" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "" @@ -2789,21 +2501,19 @@ msgstr[2] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2824,7 +2534,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2865,11 +2574,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index 7c115e27..5d781e1f 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2025-03-21 08:45+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" @@ -53,11 +53,6 @@ msgstr "“local_copy_dir” {path} s’ekziston!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "'{apkfilename}' është tashmë e instaluar në {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "“{path}” përmban {name} të vjetruar ({version})" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -83,17 +78,6 @@ msgstr "“{path}” është nënshkruar me një kyç që s’lejohet:" msgid "\"{url}\" is not a valid URL!" msgstr "“{url}” s’është URL e vlefshme!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "Mundësi %(option)s lyp %(number)d argument" -msgstr[1] "Mundësi %(option)s lyp %(number)d argumente" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -109,14 +93,6 @@ msgstr "S’u arrit të nënshkruhen ose verifikohen %d APK!" msgid "%d problems found" msgstr "U gjetën %d probleme" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [mundësi]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -137,13 +113,6 @@ msgstr "%s ka SHA-256 të gabuar: %s" msgid "%s is not an accepted build field" msgstr "%s s’është fushë e pranuar montimi" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "Mundësia %s s’merr ndonjë vlerë" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "S’u gjet 'keypass' në config.yml!" @@ -164,8 +133,6 @@ msgstr "S’u gjet 'keystorepass' te config.yml!" msgid "'repo_keyalias' not found in config.yml!" msgstr "S’u gjet 'repo_keyalias' te config.yml!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' është argument i pavlefshëm për pozicionalë" @@ -179,11 +146,6 @@ msgstr "'sdk_path' te 'config.yml' s’është ujdisur!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' është shumë i vjetër, fdroid lyp build-tools-{version} ose më të ri!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' do të jetë sipas një rendi kuturu! Nëse rendi është i rëndësishëm, përdorni kllapa () ose []!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -194,7 +156,7 @@ msgstr "S’u arrit të përmbushet '{path}'!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' ka format të pavlefshëm, duhet të jetë një fjalor!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' s’është një {field} e vlefshme te {appid}. Rregullsi shprehjeje të rregullt: {pattern}" @@ -213,8 +175,6 @@ msgstr "--merge-request xhiron vetëm me një appid!" msgid "...checkupdate failed for {appid} : {error}" msgstr "…checkupdate dështoi për {appid} : {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() e pacaktuar" @@ -305,10 +265,6 @@ msgstr "S’u gjet {cmd} mjeti SDK-je Android!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Aplikacioni ka Dyorë, por s’ka AllowedAPKSigningKeys përkatës për të fiksuar dëshmi." -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "Aplikacioni ka NoSourceSince ose ArchivePolicy “0 versione”, por AutoUpdateMode ose UpdateCheckMode janë vënë si “Asnjë”" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Aplikacioni ka NoSourceSince ose ArchivePolicy “0 versione”, ose 0, por AutoUpdateMode ose UpdateCheckMode janë vënë si “Asnjë”" @@ -352,7 +308,6 @@ msgstr "Lloj i gabuar zëri “{mirrortype}” në formësim pasqyrash: {mirror} msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL bazë për t’u pasqyruar, mund të përfshijë kyçin e nënshkrimit të treguesit që përdor vargun e kërkimi: ?fingerprint=" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -408,11 +363,13 @@ msgstr[1] "S’montohet dot, për shkak të {} gabimeve teksa skanohej" msgid "Cannot rewrite \"{path}\"" msgstr "S’rishkruhet dot “{path}”" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Kategoritë '%s' s’janë të vlefshme" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "S’janë ujdisur kategori" @@ -465,20 +422,17 @@ msgstr "Përkufizime “{field}” me përplasje, mes kartelash .yml dhe të pë msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Argumente që përplasen: '--verbose' dhe '--quiet' s’mund të përdoren në të njëjtën kohë." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Kartela formësimi me përplasje! Po përdoret {newfile}, po shpërfillet {oldfile}!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Në sistemin tuaj s’u gjet '{command}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "S’u gjet dot kod i versionit më të ri" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "S’u gjet dot emër i versionit më të ri" @@ -498,6 +452,7 @@ msgstr "S’u hap dot kartela APK {path} për analizim : " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "S’u përtyp dot madhësia “{size}”, lloj i gabuar “{type}”" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "S’u gjet dot ID Aplikacione" @@ -591,11 +546,6 @@ msgstr "Përmbledhja '%s' është thjesht përmbledhja e aplikacionit" msgid "Description has a duplicate line" msgstr "Përshkrimi ka një rresht të përsëdytur" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "Përshkrimi ka një listë (%s), por kjo s’është as me toptha (*), as e numërtuar (#)" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -652,11 +602,6 @@ msgstr "Shkarkojeni F-Droid.apk duke përdorur pasqyra që kanë më pak rrjedhj msgid "Download complete mirrors of small repos" msgstr "Shkarko pasqyra të plota deposh të vogla" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "Po shkarkohet %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Shkarkimi i depos dështoi një herë, s’po riprovohet." @@ -690,14 +635,6 @@ msgstr "GABIM: %(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "GABIM: Nënurdhri “server” është hequr, përdorni “deploy”!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"GABIM: ky urdhër s’duhet përdorur kurrë për krijimin e një pasqyre të f-droid.org!\n" -"Një pasqyrë e plotë e f-droid.org lyp më tepër se 200GB." - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "GABIM: lloj CI i pambuluar, arnimet janë të mirëpritura!" @@ -844,10 +781,6 @@ msgstr "Kartela u zhduk teksa përpunohej: {path}" msgid "Finished" msgstr "Përfundoi" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Metodat e dhurimit përmes Flattr-i i takojnë fushës FlattrID:" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Etiketa HTML të ndaluara" @@ -879,7 +812,6 @@ msgstr "U gjet kartelë e dëmtuar themeli “{path}” për “{name}”:" msgid "Found invalid appids in arguments" msgstr "U gjetën appid-e të pavlefshëm te argumente" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "U gjetën versionCodes të pavlefshëm për disa aplikacione" @@ -944,15 +876,13 @@ msgstr "Veprimi “git clean” dështoi" msgid "Git fetch failed" msgstr "Veprimi “git fetch” dështoi" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "Veprimi “git prune” dështoi" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Veprimi “git remote set-head” dështoi: “%s”" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Veprimi “git reset” dështoi" @@ -1087,16 +1017,12 @@ msgstr "VercodeOperationi pavlefshëm: {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "VercodeOperation i pavlefshëm: {invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "ID e pavlefshme aplikacioni {appid}" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "Bulean i pavlefshëm '%s'" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Listë me toptha e pavlefshme" @@ -1307,7 +1233,6 @@ msgstr "S’u gjetën dëshmi nënshkrimi te {path}" msgid "No such package: %s" msgstr "S’ka paketë të tillë: %s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1342,7 +1267,6 @@ msgstr "S’ka ç’bëhet për {appid}." msgid "Now set these in config.yml:" msgstr "Tani, ujdisini këto te config.yml:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1372,19 +1296,17 @@ msgstr "Njërit prej zërave të formësimit të 'github_releases' i mungon vler msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "Një nga zërat e formësimit të 'github_releases' mungon te vlera 'token' value. Po anashkalohet…" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Si formate grafike mbulohen vetëm PNG dhe JPEG, u gjet: {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "Pranon vetëm një “env” të vetëm kyçi" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Shtyp vetëm dallimet me Play Store-in" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Kryeje vetëm për aplikacione me vetëpërditësime" @@ -1393,10 +1315,6 @@ msgstr "Kryeje vetëm për aplikacione me vetëpërditësime" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Metodat e dhurimit përmes OpenCollective i takojnë fushës OpenCollective:" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Mundësi" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Hidhe raportin JSON te kartelë e emërtuar sipas APK-sh." @@ -1562,14 +1480,6 @@ msgstr "Po hiqet {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Riemërtoni kartelat APK që nuk përputhen me package.name_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "Mënyra “RepoTrunk” ka kuptim vetën në depo git-svn" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Zeroje dhe krijo një shërbyes montimesh të ri fringo, edhe nëse ai ekzistuesi duket të jetë në rregull." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1878,11 +1788,6 @@ msgstr "Etiketë licence “{}” e papritur! Përdorni vetëm etiketa të mirat msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Etiketë e papritur licence “{}”! Përdorni vetëm etiketa licencash të formësuara te kartela e formësimit tuaj" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "Vendmbërritje e papritur lidhjeje simbolike: {link} -> {target}" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1892,7 +1797,6 @@ msgstr "Zë i panjohur {key} në {configname}" msgid "Unknown exception found!" msgstr "U gjet përjashtim i panjohur!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1930,6 +1834,7 @@ msgstr "Fushë aplikacioni jo e pranuar '{fieldname}' te '{path}'" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Flamurkë e jo e pranuar montimi '{build_flag}' te '{path}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1960,11 +1865,6 @@ msgstr "Shteg scandelete i papërdorur: %s" msgid "Unused scanignore path: %s" msgstr "Shteg scanignore i papërdorur: %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "Po përftohet te %s" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Përditësoni të dhëna depoje për paketa të reja" @@ -1978,6 +1878,7 @@ msgstr "Përditësoni regjistrin e transparencës së dyorit për një URL" msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData ka URL të pavlefshme: {url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1997,11 +1898,7 @@ msgstr "UpdateCheckData s’është URL e vlefshme: {url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode është ujdisur, por duket sikur checkupdates s’është xhiruar ende." -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode është ujdisur, por duket sikur checkupdates s’është xhiruar ende" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "Si UpdateCheckName është caktuar ID aplikacioni të njohur - s’mund të hiqet" @@ -2016,27 +1913,10 @@ msgstr "Po ngarkohet {apkfilename} te androidobservatory.org" msgid "Uploading {apkfilename} to virustotal" msgstr "Po ngarkohet {apkfilename} to virustotal" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Përdorim" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Përdorim: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "Për të treguar një kartelë te dega parazgjedhje, përdorni /HEAD, në vend se /master apo /main" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Për të treguar një kartelë te dega parazgjedhje, përdorni /HEAD, në vend se /master" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Përdor `fdroid update -c` për ta krijuar." @@ -2075,11 +1955,6 @@ msgstr "Po përdoret Nënshkrim JAR" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Po përdoret jarsigner Java, s’rekomandohet për verifikim APK-sh! Përdorni apksigner" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "Po përdoret androguard prej “{path}”" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2181,20 +2056,11 @@ msgstr "po shtohet IdentityFile te {path}" msgid "adding to {name}: {path}" msgstr "po shtohet te {name}: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "mundësi e dykuptimtë: %(option)s mund të përputhej me %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "mundësi e dykuptimtë: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2208,11 +2074,13 @@ msgstr "S’u gjet apksigner! S’nënshkruhen ose verifikohen dot APK-ra modern msgid "apksigner not found, it's required for signing!" msgstr "S’u gjet apksigner, është i domosdoshëm për nënshkrim!" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "ID aplikacioni e kartelës mbi të cilën të veprohet" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2223,8 +2091,6 @@ msgstr "ID aplikacioni me versionCode opsional në formën APPID[:VERCODE]" msgid "archive_url needs to end with /archive" msgstr "archive_url lypset të përfundojë me /archive" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2243,7 +2109,7 @@ msgstr "po tentohet lidhje SSH e zhveshur, për të testuar kyç sendërtimesh:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "s’përtyp dot specifikim scrlib (s’është një varg): '{}'" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "s’hapet dot '%(filename)s': %(error)s" @@ -2257,14 +2123,10 @@ msgstr "s’mund të hapet url jo https: '{};" msgid "cannot find required srclibs: \"{path}\"" msgstr "s’gjenden dot srclibs të domosdoshme: “{path}”" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "s’mund të kihen argumente të shumtë për subparser" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2283,14 +2145,6 @@ msgstr "po klonohet {url}" msgid "commands from plugin modules:" msgstr "urdhra prej modulesh shtojce:" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "kompleks" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2321,10 +2175,6 @@ msgstr "s’u përtyp dot specifikim scrlib (s’u dha emër): '{}'" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "s’u përtyp dot specifikim scrlib (s’u dha referencë): '{}'" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "s’u përtyp dot specifikim scrlib (shumë shenja '@'): '{}'" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2349,8 +2199,6 @@ msgstr "kartelë varësie pa kyç" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2368,8 +2216,6 @@ msgstr "dështoi shkarkimi i nënshkrimeve të kontrollorit prej “{}”" msgid "executable binary, possibly code" msgstr "dyor i ekzekutueshëm, ka gjasa të jetë kod" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2377,20 +2223,14 @@ msgid_plural "expected %s arguments" msgstr[0] "pritej %s argument" msgstr[1] "priteshin %s argumente" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "pritej e pakta një argument" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "pritej e shumta një argument" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "pritej një argument" @@ -2403,10 +2243,6 @@ msgstr "fdroid [] [-h|--help|--version|]" msgid "fetch the latest version of signatures from the web" msgstr "sill nga interneti versionin më të ri të nënshkrimeve" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "bëji gabimet e tejtëdhënave (parazgjedhje) të jenë sinjalizime, ose të shpërfillen." @@ -2419,8 +2255,6 @@ msgstr "veprimi “git svn clone” dështoi" msgid "gzip file archive" msgstr "Arkiv gzip kartelash" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2434,35 +2268,21 @@ msgstr "index-v1 duhet të ketë një nënshkrim, përdorni `fdroid signindex` p msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 duhet të ketë një nënshkrim, përdorni `fdroid signindex` për ta krijuar!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "numër i plotë" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "vlerë %(type)s e pavlefshme: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "zgjedhje e pavlefshme: %(value)r (zgjidhni nga %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "vlerë e pavlefshme conflict_resolution: %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2500,8 +2320,6 @@ msgstr "pasqyra '%s' s’përfundon me 'fdroid'!" msgid "mirrors set twice, in config.yml and {path}!" msgstr "pasqyra të ujdisura dy herë, te config.yml dhe {path}!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "argumentet që përjashtojnë njëri-tjetrin duhet të jenë opsionalë" @@ -2520,30 +2338,15 @@ msgstr "s’ka “icon” te {appid}" msgid "no APK supplied" msgstr "s’u dha APK" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "s’ka mundësi të tillë: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "s’u gjetën të dhëna versioni!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "s’u gjetën hollësi versioni" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "e palejuar me argumentin %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2553,72 +2356,6 @@ msgstr "një nga argumentet %s është i domosdoshëm" msgid "only accepts strings, lists, and tuples" msgstr "prano vetëm vargje, lista dhe dyshe" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "mundësi %s: Nëse doni vërtet të instaloni krejt aplikacionet e nënshkruar, përdorni --all" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "mundësi %s: vlerë %s e pavlefshme: %r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "mundësia %s: zgjedhje e pavlefshme: %r (zgjidhni nga %s)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "mundësi -%s jo e pranuar" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "mundësia -%s lyp argument" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "mundësia --%s s’duhet të ketë një argument" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "mundësia --%s s’është parashtesë unike" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "mundësi --%s e papranuar" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "mundësia --%s lyp argument" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "argumente opsionalë" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "mundësi" @@ -2628,8 +2365,6 @@ msgstr "mundësi" msgid "overwriting existing {path}" msgstr "po mbishkruhet {path} ekzistues" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "argumente pozicionalë" @@ -2662,10 +2397,6 @@ msgstr "repo_url lypset të përfundojë me /repo" msgid "rsync is missing or broken: {error}" msgstr "rsync-u mungon, ose është i dëmtuar: {error}" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "ruamel.yaml s’është i instaluar, s’mund të shkruhen tejtëdhëna." - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2689,17 +2420,7 @@ msgstr "serverwebroot: shtegu nuk mbaron me “fdroid”, ndoshta kishit në men msgid "shared library" msgstr "librari e përbashkët" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "shfaq numër versioni programi dhe dil" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "shfaq këtë mesazh ndihme dhe dil" @@ -2733,8 +2454,6 @@ msgstr "librari statike" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2744,22 +2463,16 @@ msgstr "argumentet vijuese janë të domosdoshëm: %s" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "varg i papritur mundësie: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "përtypës i panjohur %(parser_name)r (choices: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2770,9 +2483,7 @@ msgstr "argumente të papranuar: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "leje jo të parrezikshme mbi '{config_file}' (duhet të ishin 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "përdorimi: " @@ -2801,21 +2512,19 @@ msgstr[1] "{0} aplikacione, {1} aliase kyçi" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) s’ka tejtëdhëna!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} ka shumë kartela {name}, duket si rreng me Kyçin e Përgjithshëm!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "AndroidManifest.xml e {apkfilename} ka një datë të gabuar: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} s’ka emër! Në vend të tij po përdoret ID aplikacioni." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2836,7 +2545,6 @@ msgstr "{appid} ka nga të dyja, APK-ra dhe kartela: {files}" msgid "{appid} is missing {name}" msgstr "{appid} i mungon {name}" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2877,11 +2585,6 @@ msgstr "{file} është e zbrazët ose e dëmtuar!" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} “{section}/icons/{path}” s’ekziston! Kontrolloni “config.yml”." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile} është nxjerrë nga përdorimi, përdorni {newfile}" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index fa53a146..a1de681c 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2024-12-30 22:00+0000\n" "Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" @@ -55,11 +55,6 @@ msgstr "\"local_copy_dir\" {path} не постоји!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" је већ инсталиран на {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" садржи застарели {name} ({version})" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -85,18 +80,6 @@ msgstr "„{path}” је потписан кључем који није доз msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" није валидан URL!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "%(option)s опција захтева %(number)d аргумент" -msgstr[1] "%(option)s опција захтева %(number)d аргументa" -msgstr[2] "%(option)s опција захтева %(number)d аргуменaтa" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -112,14 +95,6 @@ msgstr "%d АПК-ова није успело да се потпише или msgid "%d problems found" msgstr "%d проблема пронађено" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [опције]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -140,13 +115,6 @@ msgstr "%s има лош SHA-256: %s" msgid "%s is not an accepted build field" msgstr "%s није прихваћено поље за градњу" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "Опција %s не прихвата вредност" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' није пронађен у config.yml!" @@ -167,8 +135,6 @@ msgstr "'keystorepass' није пронађен у config.yml!" msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' није пронађен у config.yml!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'захтевано' је неважећи аргумент за позиционе параметре" @@ -182,11 +148,6 @@ msgstr "'путања_до_сдк' није постављена у config.yml!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' је превише стар, fdroid захтева build-tools-{version} или новији!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' ће бити у насумичном редоследу! Користите () или [] заграде ако је редослед важан!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -197,7 +158,7 @@ msgstr "'{path}' није успео да се изврши!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' има неважећи формат, треба да буде речник!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' није валидан {field} у {appid}. Регекспатерн: {pattern}" @@ -216,8 +177,6 @@ msgstr "--merge-request се извршава само на једној апл msgid "...checkupdate failed for {appid} : {error}" msgstr "...провера ажурирања није успела за {appid} : {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() није дефинисано" @@ -308,10 +267,6 @@ msgstr "Андроид СДК алат {cmd} није пронађен!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Апликација има бинарне фајлове али нема одговарајуће AllowedAPKSigningKeys за пиновање сертификата." -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "Апликација има NoSourceSince или ArchivePolicy \"0 верзија\" али AutoUpdateMode или UpdateCheckMode нису None" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Апликација има NoSourceSince или ArchivePolicy \"0 верзија\" или 0, али AutoUpdateMode или UpdateCheckMode нису None" @@ -355,7 +310,6 @@ msgstr "Лош тип уноса \"{mirrortype}\" у конфигурацији msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Основни URL за огледало, може укључивати кључ за потписивање индекса користећи упит низ: ?fingerprint=" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -412,11 +366,13 @@ msgstr[2] "Не може се изградити због {} грешака пр msgid "Cannot rewrite \"{path}\"" msgstr "Не могу да препишем \"{path}\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Категорије '%s' нису важеће" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Категорије нису подешене" @@ -469,20 +425,17 @@ msgstr "Конфликтне дефиниције \"{field}\" између .yml msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Контрадикторни аргументи: '--verbose' и '--quiet' не могу бити наведени у исто време." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Конфликтни конфигурациони фајлови! Користи се {newfile}, игнорише се {oldfile}!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Није могуће пронаћи '{command}' на вашем систему" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Није могуће пронаћи најновији верзијски код" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Није могуће пронаћи назив најновије верзије" @@ -502,6 +455,7 @@ msgstr "Није могуће отворити APK {path} за анализу: " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Није могуће парсовање величине \"{size}\", погрешан тип \"{type}\"" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Није пронађен ИД апликације" @@ -595,11 +549,6 @@ msgstr "Опис '%s' је само сажетак апликације" msgid "Description has a duplicate line" msgstr "Опис има дупликатну линију" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "Опис има листу (%s) али није тачкаст (*) нити нумерисан (#)" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -656,11 +605,6 @@ msgstr "Преузмите F-Droid.apk користећи огледала ко msgid "Download complete mirrors of small repos" msgstr "Преузмите комплетне огледале малих репоа" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "Преузимање %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Преузимање складишта је већ једном неуспело, не покушавам поново." @@ -694,14 +638,6 @@ msgstr "ГРЕШКА: %(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ГРЕШКА: Подкоманда „server“ је уклоњена, користите „deploy“!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"ГРЕШКА: ову команду никада не треба користити за пресликавање f-droid.org!\n" -"Потпуно пресликавање f-droid.org захтева више од 200ГБ." - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ГРЕШКА: неподржани тип CI, закрпе добродошле!" @@ -848,10 +784,6 @@ msgstr "Фајл је нестао током обраде: {path}" msgid "Finished" msgstr "Завршено" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Методе донације путем Flattr-а спадају у поље FlattrID:" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Забрањене HTML ознаке" @@ -883,7 +815,6 @@ msgstr "Пронађена лоша датотека за финансирање msgid "Found invalid appids in arguments" msgstr "Пронађени неважећи ID-еви апликација у аргументима" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Пронађени неважећи верзијски кодови за неке апликације" @@ -948,15 +879,13 @@ msgstr "Гит чишћење није успело" msgid "Git fetch failed" msgstr "Преузимање из Гит-а није успело" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "Git prune није успео" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git remote set-head неуспешан: \"%s\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Гит ресет није успео" @@ -1091,16 +1020,12 @@ msgstr "Неважећа VercodeOperation: {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "Неважећа VercodeOperation: {invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "Неважећи идентификациони број апликације {appid}" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "Неважећи буловски '%s'" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Неисправна наменска листа" @@ -1311,7 +1236,6 @@ msgstr "Нема сертификата за потпис у {path}" msgid "No such package: %s" msgstr "Нема пакета: %s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1346,7 +1270,6 @@ msgstr "Ништа за радити за {appid}." msgid "Now set these in config.yml:" msgstr "Сада поставите ове у config.yml:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1376,19 +1299,17 @@ msgstr "Једна од 'github_releases' конфигурационих ста msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "Једна од 'github_releases' конфигурационих ставки нема 'token' вредност. прескакање ..." +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Само PNG и JPEG су подржани за графику, нађено: {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Само штампај разлике са Плеј продавницом" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Само процесирај апликације са автоматским ажурирањима" @@ -1397,10 +1318,6 @@ msgstr "Само процесирај апликације са автоматс msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Методе донација OpenCollective припадају OpenCollective: пољу" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Опције" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Извештај у JSON формату сачувај у датотеку именовану по APK." @@ -1566,14 +1483,6 @@ msgstr "Уклањање {path}" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Преименујте APK фајлове који не одговарају package.name_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "RepoTrunk режим ажурирања има смисла само у git-svn репозиторјима" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Ресетујте и креирајте потпуно нови билд сервер, чак и ако се постојећи чини у реду." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1882,11 +1791,6 @@ msgstr "Неочекивана ознака лиценце \"{}\"! Корист msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Неочекивана ознака лиценце \"{}\"! Користите само ознаке лиценце конфигурисане у вашем конфигурационом фајлу" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "Неочекивани симболички линк циљ: {link} -> {target}" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1896,7 +1800,6 @@ msgstr "Непознати унос {key} у {configname}" msgid "Unknown exception found!" msgstr "Непозната изузетна ситуација пронађена!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1934,6 +1837,7 @@ msgstr "Непознато поље апликације '{fieldname}' у '{path msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Непозната застава изградње '{build_flag}' у '{path}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1964,11 +1868,6 @@ msgstr "Некоришћена путања за брисање скенирањ msgid "Unused scanignore path: %s" msgstr "Некоришћена путања за игнорисање скенирања: %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "Распакујем у %s" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Ажурирање информација о репозиторијуму за нове пакете" @@ -1982,6 +1881,7 @@ msgstr "Ажурирање дневника транспарентности б msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData има неважећи URL: {url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -2001,11 +1901,7 @@ msgstr "UpdateCheckData није важећи URL: {url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode је подешен, али изгледа да checkupdates још није покренут." -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode је подешен, али изгледа да checkupdates још није покренут" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName је постављен на познати ID апликације, може се уклонити" @@ -2020,27 +1916,10 @@ msgstr "Отпремање {apkfilename} на androidobservatory.org" msgid "Uploading {apkfilename} to virustotal" msgstr "Отпремање {apkfilename} на virustotal" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Употреба" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Употреба: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "Користите /HEAD уместо /master или /main да покажете на фајл у подразумеваној грани" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Користи /HEAD уместо /master за указивање на датотеку у подразумеваној грани" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Користи `fdroid update -c` да је креираш." @@ -2079,11 +1958,6 @@ msgstr "Коришћење JAR потписа" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Користим Java's jarsigner, не препоручује се за верификацију APK-ова! Користи apksigner" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "Користим androguard из \"{path}\"" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2185,20 +2059,11 @@ msgstr "додавање IdentityFile у {path}" msgid "adding to {name}: {path}" msgstr "додавање у {name}: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "нејасна опција: %(option)s може одговарати %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "двосмислена опција: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2212,11 +2077,13 @@ msgstr "apksigner није пронађен! Не могу да потпишем msgid "apksigner not found, it's required for signing!" msgstr "apksigner није пронађен, потребан је за потписивање!" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "ID апликације датотеке за рад" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2227,8 +2094,6 @@ msgstr "ID апликације са опционим versionCode у облик msgid "archive_url needs to end with /archive" msgstr "archive_url мора да се завршава са /archive" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2247,7 +2112,7 @@ msgstr "покушавам SSH везу без кључа да тестирам msgid "can not parse scrlib spec (not a string): '{}'" msgstr "не могу да парсирам scrlib спецификацију (није стринг): '{}'" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "не могу да отворим '%(filename)s': %(error)s" @@ -2261,14 +2126,10 @@ msgstr "не могу да отворим non-https url: '{};" msgid "cannot find required srclibs: \"{path}\"" msgstr "не могу да пронађем потребне srclibs: \"{path}\"" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "не могу имати више аргумената подпарсера" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2287,14 +2148,6 @@ msgstr "клонирам {url}" msgid "commands from plugin modules:" msgstr "команде из plugin модула:" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "комплекс" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2326,10 +2179,6 @@ msgstr "није могуће парсирати srclib спецификациј msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "не могу да парсирам srclib спецификацију (није наведена референца): '{}'" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "не могу да парсирам srclib спецификацију (превише '@' знакова): '{}'" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2354,8 +2203,6 @@ msgstr "фајл зависности без закључавања" msgid "deployed process log {path} to {dest}" msgstr "постављен лог процеса {path} на {dest}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2373,8 +2220,6 @@ msgstr "преузимање потписа скенера са '{}' није у msgid "executable binary, possibly code" msgstr "извршни бинарни фајл, могуће код" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2383,20 +2228,14 @@ msgstr[0] "очекиван %s аргумент" msgstr[1] "очекивана %s аргумента" msgstr[2] "очекивано %s аргумената" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "очекиван бар један аргумент" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "очекиван највише један аргумент" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "очекиван један аргумент" @@ -2409,10 +2248,6 @@ msgstr "fdroid [<команда>] [-h|--help|--version|]" msgid "fetch the latest version of signatures from the web" msgstr "преузмите најновију верзију потписа са веба" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "број са покретним зарезом" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "форсирај грешке метаподатака (подразумевано) да буду упозорења, или да буду игнорисане." @@ -2425,8 +2260,6 @@ msgstr "git svn clone није успео" msgid "gzip file archive" msgstr "gzip архива датотека" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2440,35 +2273,21 @@ msgstr "index-v1 мора имати потпис, користите `fdroid si msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 мора имати потпис, користите `fdroid signindex` да га направите!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "цео број" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "неважећа %(type)s вредност: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "неважећи избор: %(value)r (изаберите из %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "неважећа conflict_resolution вредност: %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2506,8 +2325,6 @@ msgstr "огледало '%s' се не завршава са 'fdroid'!" msgid "mirrors set twice, in config.yml and {path}!" msgstr "огледала су постављена два пута, у config.yml и {path}!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "међусобно искључиви аргументи морају бити опционални" @@ -2526,30 +2343,15 @@ msgstr "нема \"иконе\" у {appid}" msgid "no APK supplied" msgstr "нема достављеног APK-а" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "нема такве опције: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "нема пронађених информација о верзији!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "није пронађена информација о верзијама" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "није дозвољено са аргументом %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2559,72 +2361,6 @@ msgstr "један од аргумената %s је обавезан" msgid "only accepts strings, lists, and tuples" msgstr "прихвата само стрингове, листе и тапл" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "опција %s: Ако заиста желите да инсталирате све потписане апликације, користите --all" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "опција %s: неважећа %s вредност: %r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "опција %s: неважећи избор: %r (изаберите из %s)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "опција -%s није препозната" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "опција -%s захтева аргумент" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "опција --%s не сме имати аргумент" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "опција --%s није јединствени префикс" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "опција --%s није препозната" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "опција --%s захтева аргумент" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "опциони аргументи" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "опције" @@ -2634,8 +2370,6 @@ msgstr "опције" msgid "overwriting existing {path}" msgstr "преписивање постојећег {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "позициони аргументи" @@ -2668,10 +2402,6 @@ msgstr "repo_url мора да се завршава са /repo" msgid "rsync is missing or broken: {error}" msgstr "rsync недостаје или је покварен: {error}" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "ruamel.yaml није инсталиран, не могу да пишем метаподатке." - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2695,17 +2425,7 @@ msgstr "serverwebroot: путања се не завршава са \"fdroid\", msgid "shared library" msgstr "дељена библиотека" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "прикажи верзију програма и изађи" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "прикажи ову поруку помоћи и изађи" @@ -2739,8 +2459,6 @@ msgstr "статичка библиотека" msgid "supplied reference binary has allowed signer {signer}" msgstr "достављени референтни бинарни фајл има дозвољеног потписника {signer}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2750,22 +2468,16 @@ msgstr "следећи аргументи су обавезни: %s" msgid "true" msgstr "истина" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "неочекивана опција стринг: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "непознат парсер %(parser_name)r (избори: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2776,9 +2488,7 @@ msgstr "непрепознати аргументи: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "небезбедне дозволе на '{config_file}' (требало би да буду 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "употреба: " @@ -2808,21 +2518,19 @@ msgstr[2] "{0} апликација, {1} кључних алијаса" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) нема метаподатке!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} има више {name} фајлова, изгледа као Master Key експлоат!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "{apkfilename}'s AndroidManifest.xml има лош датум: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} нема име! Користи се ID апликације уместо тога." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2843,7 +2551,6 @@ msgstr "{appid} има и APK-ове и фајлове: {files}" msgid "{appid} is missing {name}" msgstr "{appid} недостаје {name}" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2884,11 +2591,6 @@ msgstr "{file} је празан или оштећен!" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" не постоји! Проверите \"config.yml\"." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile} је застарео, користите {newfile}" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index d3ee6965..d3dd6378 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2025-03-17 21:44+0000\n" "Last-Translator: Kristoffer Grundström \n" "Language-Team: Swedish \n" @@ -57,11 +57,6 @@ msgstr "\"local_copy_dir\" {path} finns inte!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "'{apkfilename}' är redan installerad i {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" innehåller utdaterat {name} ({version})" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -87,17 +82,6 @@ msgstr "\"{path}\" är signerad av en nyckel som inte är tillåten:" msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" är inte en giltig URL!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "%(option)s-valet kräver %(number)d argument" -msgstr[1] "%(option)s-valen kräver %(number)d argument" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -113,14 +97,6 @@ msgstr "%d APK:er kunde inte signeras eller verifieras!" msgid "%d problems found" msgstr "%d problem hittades" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [alternativ]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -141,13 +117,6 @@ msgstr "%s har felaktig SHA-256: %s" msgid "%s is not an accepted build field" msgstr "%s är inte ett acceptabelt byggnationsfält" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' hittades inte i config.yml!" @@ -168,8 +137,6 @@ msgstr "'keystorepass' hittades inte i config.yml!" msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' hittades inte i config.yml!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -183,11 +150,6 @@ msgstr "'sdk_path' är inte inställt i config.yml!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "{aapt} är för gammal, fdroid kräver build-tools-{version} eller nyare!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -198,7 +160,7 @@ msgstr "Misslyckades med att köra '{path}'!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' är inte ett giltigt {field} i {appid}. Regex-mönster: {pattern}" @@ -217,8 +179,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() angavs inte" @@ -309,10 +269,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -356,7 +312,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -412,11 +367,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "Kan inte skriva om \"{path}\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -469,20 +426,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -502,6 +456,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -595,11 +550,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -656,11 +606,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "Hämtar %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -694,12 +639,6 @@ msgstr "FEL: %(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -844,10 +783,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Förbjudna HTML-taggar" @@ -879,7 +814,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -944,15 +878,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1087,16 +1019,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "Ogiltig booleansk '%s'" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1307,7 +1235,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1342,7 +1269,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1372,19 +1298,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1393,10 +1317,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Alternativ" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1562,14 +1482,6 @@ msgstr "Tar bort {path}''" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Byt namn på APK-filer som inte matchar paket.namn_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1870,11 +1782,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1884,7 +1791,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "Okänt undantag hittades!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1922,6 +1828,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1952,11 +1859,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "Packar upp till %s" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Uppdatera förrådinformation för nya paket" @@ -1970,6 +1872,7 @@ msgstr "Uppdatera binärens genomskinliga logg för en URL" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1989,11 +1892,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2008,27 +1907,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Användning" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Användning: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2067,11 +1949,6 @@ msgstr "Använder JAR-signatur" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2173,20 +2050,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "tvetydigt alternativ: %(option)s kunde motsvara %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "tvetydig option: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2200,11 +2068,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2215,8 +2085,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2235,7 +2103,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "kan inte öppna '%(filename)s': %(error)s" @@ -2249,14 +2117,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2275,14 +2139,6 @@ msgstr "klonar {url}" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "komplex" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2313,10 +2169,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2341,8 +2193,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2360,8 +2210,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2369,20 +2217,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "ett argument förväntades" @@ -2395,10 +2237,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2411,8 +2249,6 @@ msgstr "" msgid "gzip file archive" msgstr "gzip-filarkiv" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2426,35 +2262,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "heltal" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2492,8 +2314,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2512,30 +2332,15 @@ msgstr "" msgid "no APK supplied" msgstr "ingen APK tillhandahölls" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "inget sådant val: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2545,72 +2350,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "alternativet -%s kändes inte igen" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "alternativet -%s kräver argument" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "alternativet --%s måste inte ha ett argument" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "alternativet --%s inte ett unikt prefix" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "alternativet --%s kändes inte igen" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "alternativet --%s kräver argument" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "alternativa argument" - #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" @@ -2621,8 +2360,6 @@ msgstr "Alternativ" msgid "overwriting existing {path}" msgstr "skriver över befintlig {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "positionella argument" @@ -2655,10 +2392,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2682,17 +2415,7 @@ msgstr "" msgid "shared library" msgstr "delat bibliotek" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "visa programmets versionsnummer och avsluta" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "visa det här hjälpmeddelandet och avsluta" @@ -2726,8 +2449,6 @@ msgstr "statiskt bibliotek" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2737,22 +2458,16 @@ msgstr "följande argument krävs: %s" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "oväntad alternativ-sträng: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2763,9 +2478,7 @@ msgstr "argumenten känns inte igen: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "o-säkra behörigheter på '{config_file}' (borde vara 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "användning: " @@ -2794,21 +2507,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename}{appid} har ingen metadata!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2829,7 +2540,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "{appid}saknas {name}" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2870,11 +2580,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index 5182c8aa..b9ff5dd3 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2024-09-08 11:09+0000\n" "Last-Translator: abelbiwott-dev \n" "Language-Team: Swahili \n" @@ -54,11 +54,6 @@ msgstr "\"local_copy_dir\" {path} haipo!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "Tayari \"{apkfilename}\" imesakinishwa kwenye {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" ina {name} ({version}) iliyopitwa na wakati" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -84,17 +79,6 @@ msgstr "\"{path}\" imetiwa saini na ufunguo ambao hauruhusiwi:" msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" si URL halali!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "Chaguo %(option)s linahitaji hoja %(number)d" -msgstr[1] "Chaguo %(option)s linahitaji hoja %(number)d" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -110,14 +94,6 @@ msgstr "APK %d hazijatiwa saini au kuthibitishwa!" msgid "%d problems found" msgstr "%d matatizo yamepatikana" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [chaguo]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -138,13 +114,6 @@ msgstr "%s ina SHA-256 mbaya: %s" msgid "%s is not an accepted build field" msgstr "%s sio sehemu ya kujenga inayokubalika" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "chaguo la %s halichukui thamani" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' haipatikani kwenye config.yml!" @@ -165,8 +134,6 @@ msgstr "'keystorepass' haipatikani kwenye config.yml!" msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' haipatikani kwenye config.yml!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "\"required\" ni hoja batili kwa vipengee vya nafasi" @@ -180,11 +147,6 @@ msgstr "'sdk_path' haijawekwa kwenye config.yml!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' ni ya zamani sana, fdroid inahitaji zana za kujenga-{version} au mpya!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' itakuwa katika mpangilio nasibu! Tumia mabano () au [] ikiwa agizo ni muhimu!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -195,7 +157,7 @@ msgstr "{path} imeshindwa kutekeleza!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' ina muundo batili, inapaswa kuwa kamusi!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' si {field} halali katika {appid}. Muundo wa regex: {pattern}" @@ -214,8 +176,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "...sasisho la ukaguzi limeshindwa la{appid} : {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() haijafafanuliwa" @@ -306,10 +266,6 @@ msgstr "Zana ya SDK ya Android {cmd} haijapatikana!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Apu ina Binari lakini haina AllowedAPKSigningKeys zinazolingana ili kubandika cheti." -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "Apu ina NoSourceSince au ArchivePolicy \"0 versions\" lakini AutoUpdateMode au UpdateCheckMode sio None" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Apu ina NoSourceSince au ArchivePolicy \"matoleo 0\" au 0 lakini AutoUpdateMode au UpdateCheckMode sio Hakuna" @@ -353,7 +309,6 @@ msgstr "Aina mbaya ya ingizo \"{mirrortype}\" katika usanidi wa vioo: {mirror}" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "URL ya msingi ya kioo, inaweza kujumuisha ufunguo wa saini ya faharasa kwa kutumia mfuatano wa saili: ?fingerprint=" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -409,11 +364,13 @@ msgstr[1] "Haiwezi kujenga kutokana na makosa ya {} wakati wa uchanganuzi" msgid "Cannot rewrite \"{path}\"" msgstr "Haiwezi kuandika upya \"{path}\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Makundi ‘%s’ sio halali" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Makundi hayajawekwa" @@ -466,20 +423,17 @@ msgstr "Ukinzani kati ya ufafanuzi wa \"{field}\" kati ya .yml na faili zilizoja msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Hoja zinazokinzana: '--verbose' na '--quiet' haiwezi kubainishwa kwa wakati mmoja." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Faili za usanidi zinazokinzana! Kwa kutumia {newfile}, ukipuuza {oldfile}!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Haikuweza kupata '{command}' kwenya mfumo wako" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Haikuweza kupata msimbo wa toleo wa hivi karibuni" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Haikuweza kupata jina la toleo la hivi karibuni" @@ -499,6 +453,7 @@ msgstr "Haikuweza kufungua APK {path} kwa uchambuzi: " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Haikuweza kuchanganua ukubwa \"{size}\", aina isiyo sahihi \"{type}\"" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Haikuweza kupata Kitambulisho cha apu" @@ -592,11 +547,6 @@ msgstr "Maelezo %s ni muhtasari ya apu tu" msgid "Description has a duplicate line" msgstr "Maelezo ina mstari wa nakala" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "Maelezo ina orodha (%s) lakini sio yenye vitone (*) wala nambari (#)" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -653,11 +603,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "Pakua vioo kamili vya maghala madogo" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "Inapakua %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Kupakua ghala hio tayari imefeli mara moja, haijaribu tena." @@ -691,14 +636,6 @@ msgstr "HITILAFU: %(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "HITILAFU: Amri ndogo ya \"server\" imetolewa, tumia \"deploy\"!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"HITILAFU: amri hii haipaswi kutumika kama kioo kwa f-droid.org!\n" -"Kioo kamili cha f-droid.org kinahitaji zaidi ya 200GB." - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "HITILAFU: aina ya CI isiyoungwa mkono, marekebisho yanakaribishwa!" @@ -845,10 +782,6 @@ msgstr "Faili ilipotea wakati wa kuichakata: {path}" msgid "Finished" msgstr "Imekamilika" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Njia za mchango ya Flattr ni za FlattrID: eneo" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Tagi za HTML zilizokatazwa" @@ -880,7 +813,6 @@ msgstr "Imepata faili ya fedha mbaya \"{path}\" ya \"{name}\":" msgid "Found invalid appids in arguments" msgstr "Imepata appids batili katika hoja" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Ilipata versionCodes batili katika baadhi ya apu" @@ -945,15 +877,13 @@ msgstr "Git clean imeshindwa" msgid "Git fetch failed" msgstr "Git fetch imeshindwa" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "Git prune imeshindwa" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git remote set-head imeshindwa: \"%s\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Git reset imeshindwa" @@ -1088,16 +1018,12 @@ msgstr "VercodeOperation batili: {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "VercodeOperation batili: {invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "Kitambulisho batili cha apu {appid}" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "Boolean batili '%s'" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Orodha ya vitone batili" @@ -1308,7 +1234,6 @@ msgstr "Hakuna vyeti vya kusaini vimepatikana katika {path}" msgid "No such package: %s" msgstr "Hakuna kifurushi kama vile: %s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1343,7 +1268,6 @@ msgstr "Hakuna la kufanya kwa {appid}." msgid "Now set these in config.yml:" msgstr "Sasa seti hizi katika config.yml:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1373,19 +1297,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "PNG na JPEG pekee zinakubalika katika mchoro, zimepata: {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Chapisha tofauti pekee na Play Store" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Chakata apu zilizo na masasisho ya kiotomatiki pekee" @@ -1394,10 +1316,6 @@ msgstr "Chakata apu zilizo na masasisho ya kiotomatiki pekee" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Njia za Mchango wa OpenCollective inapatikana kwenye OpenCollective: uwanja" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Chaguo" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Toa ripoti ya JSON kwa faili iliyopewa jina la APK." @@ -1563,14 +1481,6 @@ msgstr "Kuondoa {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Badilisha jina la faili za APK ambazo hazilingani na package.name_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "Hali ya kisasa ya RepoTrunk ni ya maana tu katika ghala za git-svn" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Weka upya na uunde seva mpya ya kujenga, hata ikiwa ile iliopo inaonekana kuwa sawa." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1879,11 +1789,6 @@ msgstr "tagi ya leseni lisilotarajiwa \"{}\"! Tumia pekee tagi zilizoidhinishwa msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "tagi ya leseni isiyotarajiwa \"{}\"! Tumia pekee tagi za leseni zilizosanidiwa katika faili yako ya usanidi" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "Lengo la symlink lisiyotarajiwa:{link} -> {target}" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1893,7 +1798,6 @@ msgstr "ingilio lisilojulikana {key} katika {configname}" msgid "Unknown exception found!" msgstr "Kighairi kisichojulikana kimepatikana!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1931,6 +1835,7 @@ msgstr "Nafasi ya apu isiyotambulika '{fieldname}' katika '{path}'" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Bendera ya kujenga isiyotambulika '{build_flag}' katika '{path}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1961,11 +1866,6 @@ msgstr "Njia ya scandelete isiyotumika: %s" msgid "Unused scanignore path: %s" msgstr "Njia ya scanignore isiyotumika: %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "Kufungua zipu kwa %s" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Sasisha maelezo ya repo kwa vifurushi vipya" @@ -1979,6 +1879,7 @@ msgstr "Sasisha logi ya uwazi ya binary kwa URL" msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData ina URL batili: {url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1998,11 +1899,7 @@ msgstr "UpdateCheckData si URL iliyo halali: {url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode imewekwa lakini inaonekana kama checkupdates haijaendeshwa bado." -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode imewekwa lakini inaonekana kama likecheckupdates haijaendeshwa bado" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName imewekwa katika kitambulisho cha apu kinachojulikana, inaweza kutolewa" @@ -2017,27 +1914,10 @@ msgstr "Kupakia {apkfilename} kwa androidobservatory.org" msgid "Uploading {apkfilename} to virustotal" msgstr "Kupakia {apkfilename} kwa virustotal" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Matumizi" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Matumizi: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "Tumia /HEAD badala ya /master au /main kuashiria faili kwenye tawi la msingi" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Tumia /HEAD badala ya /master kuashiria kwa fiaili katika tawi la msingi" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Tumia `fdroid update -C` kuiunda." @@ -2076,11 +1956,6 @@ msgstr "Kutumia saini ya JAR" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Kutumia jarsigner ya Java, haipendekezwi kwa kuthibitisha APK! Tumia apksigner" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "Kutumia androguard kutoka \"{path}\"" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2182,20 +2057,11 @@ msgstr "Inaongeza IdentityFile kwa {path}" msgid "adding to {name}: {path}" msgstr "Inaongeza kwa {name}: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "chaguo lisiloeleweka: %(option)s linaweza kulingana na %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "chaguo lisiloeleweka: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2209,11 +2075,13 @@ msgstr "apksigner haijapatikana! Haiwezi kusaini au kutibitisha APK ya kisasa" msgid "apksigner not found, it's required for signing!" msgstr "apksigner haikupatikana, inahitajika kwa ajili ya kusaini!" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "Kitambulisho cha apu cha faili kufanyia kazi" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2224,8 +2092,6 @@ msgstr "Kitambulisho cha apu yenye versionCode iliyo ya hiari katika fomu APPID[ msgid "archive_url needs to end with /archive" msgstr "archive_url inahitaji kumalizia na /archive" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2244,7 +2110,7 @@ msgstr "inajaribu uhusiano wa SSH ulio tupu ili kujaribu ufunguo wa kupeleka:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "Haiwezi kuchanganua speci ya scrlib (sio kamba): '{}'" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "Haiwezi kufungua '%(filename)s':%(error)s" @@ -2258,14 +2124,10 @@ msgstr "Haiwezi kufungua URL isiyo ya https: '{};" msgid "cannot find required srclibs: \"{path}\"" msgstr "Haiwezi kupata srclibs inayohitajika: \"{path}\"" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "Haiwezi kuwa na hoja za subparser nyingi" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2284,14 +2146,6 @@ msgstr "kukaririsha {url}" msgid "commands from plugin modules:" msgstr "amri kutoka kwa kiunzi huru cha programu-jalizi:" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "changamani" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2322,10 +2176,6 @@ msgstr "haikuweza kuchanganua specifisheni ya srclib (hakuna jina limebainishwa) msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "haikuweza kuchanganua specifisheni ya srclib (hakuna rejeleo limebainishwa): '{}'" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "haikuweza kuchanganua specifisheni ya srclib (saini nyingi mno za '@'): '{}'" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2350,8 +2200,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "logi ya mchakato uliosambazwa {path} hadi {dest}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2369,8 +2217,6 @@ msgstr "Inapakua sahihi za skena kutoka '{}' imefeli" msgid "executable binary, possibly code" msgstr "binari inayoweza kutekelezwa, ikiwezekana msimbo" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2378,20 +2224,14 @@ msgid_plural "expected %s arguments" msgstr[0] "hoja %s iliyotarajiwa" msgstr[1] "hoja %s zilizotarajiwa" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "ilitarajia angalau hoja moja" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "Imetarajiwa isiwe zaidi ya hoja moja" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "Ilitarajia hoja moja" @@ -2404,10 +2244,6 @@ msgstr "fdroid [] [-h|--msaada|--toleo|]" msgid "fetch the latest version of signatures from the web" msgstr "Pakua toleo jipya zaidi za saini kutoka kwenye mtandao" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "hatua ya kuelea" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "lazimisha hitilafu za metadata (chaguo msingi) ziwe maonyo, au ziwe za kupuuzwa." @@ -2420,8 +2256,6 @@ msgstr "svn clone ya git ilifeli" msgid "gzip file archive" msgstr "kumbukumbu ya faili ya gzip" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2435,35 +2269,21 @@ msgstr "index-v1 lazima iwe na saini, tumia `fdroid signindex` kuiunda!" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 lazima iwe na saini, tumia `fdroid signindex` kuiunda!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "nambari kamili" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "Thamani batili ya %(type)s: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "chaguo iliyo batili: %(value)r (chagua kutoka %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "thamani ya conflict_resolution iliyo batili: %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2501,8 +2321,6 @@ msgstr "kioo %s haikwishia na 'fdroid'!" msgid "mirrors set twice, in config.yml and {path}!" msgstr "vioo vimesetiwa mara mbili, katika config.yml na {path}!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "Hoja zinazokinzana lazima ziwe za hiari" @@ -2521,30 +2339,15 @@ msgstr "hakuna \"icon\" katika {appid}" msgid "no APK supplied" msgstr "hakuna APK iliyowasilishwa" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "hakuna chaguo kama hilo: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "hakuna maelezo ya toleo imepatikana!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "hakuna maelezo ya toleo zimepatikana" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "haikubaliki na hoja %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2554,72 +2357,6 @@ msgstr "moja ya hoja %s inahitajika" msgid "only accepts strings, lists, and tuples" msgstr "inakubali pekee kamba, orodha, na jozi" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "chaguo %s: Ikiwa kweli unataka kusakinisha apu zote zilizosainiwa, tumia --all" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "chaguo %s: thamani %s iliyo batili: %r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "chaguo %s: chaguo batili: %r(choose from %s)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "chaguo -%s halitambuliki" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "chaguo -%s linahitaji hoja" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "chaguo --%s ni lazima isiwe na hoja" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "chaguo --%s sio kiambishi awali cha kipekee" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "chaguo --%s halitambuliki" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "chaguo --%s linahitaji hoja" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "hoja za hiari" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "uchaguzi" @@ -2629,8 +2366,6 @@ msgstr "uchaguzi" msgid "overwriting existing {path}" msgstr "inaandika upya {path} iliyopo" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "hoja ya msimamo" @@ -2663,10 +2398,6 @@ msgstr "repo_url ina haja ya kuisha na /ghala" msgid "rsync is missing or broken: {error}" msgstr "rsync inakosa au imevunjika: {error}" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "ruamel.yaml haijasimikwa, haiwezi kuandika metadata." - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2690,17 +2421,7 @@ msgstr "serverwebroot: njia haikamiliki na \"fdroid\", labda ulimaanisha moja ka msgid "shared library" msgstr "maktaba inayoshirikishwa" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "onyesha nambari ya toleo la programu kisha uondoke" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "onyesha ujumbe huu wa usaidizi na uondoke" @@ -2734,8 +2455,6 @@ msgstr "maktaba tuli" msgid "supplied reference binary has allowed signer {signer}" msgstr "binari ya rejeleo lililowasilishwa imeruhusu signer {signer}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2745,22 +2464,16 @@ msgstr "hoja zifuatazo zinahitajika: %s" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "Chaguo lisilotarajiwa: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "kichanganuzi isiyojulikana %(parser_name)r (chaguo: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2771,9 +2484,7 @@ msgstr "hoja zisizotambulika: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "ruhusa zisizo salama kwenye '{config_file}' (inapaswa kuwa 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "matumizi: " @@ -2802,21 +2513,19 @@ msgstr[1] "apu {0}, lakabu muhimu{1}" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) haina metadata!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} ina faili nyingi za {name}, inaonekana kama shambulio la Master Key!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "AndroidManifest.xml ya {apkfilename} ina tarehe mbaya: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} haina jina! Inatumia kitambulisho cha apu badala yake." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2837,7 +2546,6 @@ msgstr "{appid} ina vyote viwili APK pamoja na faili: {files}" msgid "{appid} is missing {name}" msgstr "{appid} inakosa {name}" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2878,11 +2586,6 @@ msgstr "{file} ni tupu au fisadi!" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" haipo! Angalia \"config.yml\"." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile} imewacha kutumika, tumia {newfile}" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/ta/LC_MESSAGES/fdroidserver.po b/locale/ta/LC_MESSAGES/fdroidserver.po index 16c20866..27008dc2 100644 --- a/locale/ta/LC_MESSAGES/fdroidserver.po +++ b/locale/ta/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2025-01-20 14:04+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tamil \n" @@ -55,11 +55,6 @@ msgstr "\"local_copy_dir\" {path} இல்லை!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" ஏற்கனவே {dev} இல் நிறுவப்பட்டுள்ளது." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" காலாவதியான {name} ({version}) உள்ளது" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -85,17 +80,6 @@ msgstr "\"{path}\" அனுமதிக்கப்படாத ஒரு வ msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" சரியான முகவரி அல்ல!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "%(option)s விருப்பத்திற்கு %(number)d உரையாடல் தேவைப்படுகிறது" -msgstr[1] "%(option)s விருப்பத்திற்கு %(number)d வாதங்கள் தேவை" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -111,14 +95,6 @@ msgstr "%d apks கையொப்பமிடவோ சரிபார்க் msgid "%d problems found" msgstr "%d சிக்கல்கள் காணப்படுகின்றன" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [விருப்பங்கள்]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -139,13 +115,6 @@ msgstr "%s மோசமான SHA-256: %s" msgid "%s is not an accepted build field" msgstr "%s ஏற்றுக்கொள்ளப்பட்ட கட்டட புலம் அல்ல" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "%s விருப்பம் ஒரு மதிப்பை எடுக்காது" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "config.yml இல் 'கீபாச்' காணப்படவில்லை!" @@ -166,8 +135,6 @@ msgstr "'கீச்டோர்பாச்' config.yml இல் காணப msgid "'repo_keyalias' not found in config.yml!" msgstr "config.yml இல் 'ரெப்போ_காலியாச்' காணப்படவில்லை!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'தேவை' என்பது நிலைப்பாடுகளுக்கு தவறான வாதமாகும்" @@ -181,11 +148,6 @@ msgstr "'sdk_path' config.yml இல் அமைக்கப்படவில msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' மிகவும் பழையது, fdroid க்கு கட்டிய-கருவிகள்-{version} அல்லது புதியவை தேவை!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' சீரற்ற வரிசையில் இருக்கும்! ஆர்டர் முக்கியத்துவம் வாய்ந்ததாக இருந்தால் () அல்லது [] அடைப்புக்குறிகளைப் பயன்படுத்தவும்!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -196,7 +158,7 @@ msgstr "'{path}' செயல்படுத்தத் தவறிவிட msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' தவறான வடிவத்தைக் கொண்டுள்ளது, அது ஒரு அகராதியாக இருக்க வேண்டும்!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' என்பது {appid} இல் செல்லுபடியாகும் {field} அல்ல. ரீசெக்ச் முறை: {pattern}" @@ -215,8 +177,6 @@ msgstr "-மெர்ச்-கோருதல் ஒரு பயன்பா msgid "...checkupdate failed for {appid} : {error}" msgstr "... {appid}: {error} க்கு செக்அப்டேட் தோல்வியுற்றது" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__ அழைப்பு __ () வரையறுக்கப்படவில்லை" @@ -307,10 +267,6 @@ msgstr "ஆண்ட்ராய்டு SDK கருவிகள் {cmd} க msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "பயன்பாட்டில் பைனரிகள் உள்ளன, ஆனால் சான்றிதழுடன் தொடர்புடைய AllowedAPKSigningKeys இல்லை." -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "பயன்பாட்டில் Nosourcencens அல்லது காப்பகப் போலிசி \"0 பதிப்புகள்\" உள்ளன, ஆனால் ஆட்டோப்டேட்மோட் அல்லது புதுப்பிப்பு தொழில்நுட்பம் எதுவும் இல்லை" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "பயன்பாட்டில் Nosourcencence அல்லது காப்பகப் போலிசி \"0 பதிப்புகள்\" அல்லது 0 உள்ளது, ஆனால் ஆட்டோப்டேட்மோட் அல்லது புதுப்பிப்பு தொழில்நுட்பம் எதுவும் இல்லை" @@ -354,7 +310,6 @@ msgstr "கண்ணாடியில் \"{mirrortype}\" மோசமான msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "அடிப்படை முகவரி கண்ணாடிக்கு, வினவல் சரம் பயன்படுத்தி குறியீட்டு கையொப்பமிடும் விசையை சேர்க்கலாம்:? கைரேகை =" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -410,11 +365,13 @@ msgstr[1] "ச்கேன் செய்யும் போது {} பிழ msgid "Cannot rewrite \"{path}\"" msgstr "\"{path}\" ஐ மீண்டும் எழுத முடியாது" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "வகைகள் '%s' செல்லுபடியாகாது" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "வகைகள் அமைக்கப்படவில்லை" @@ -467,20 +424,17 @@ msgstr ".Yml மற்றும் உள்ளூர்மயமாக்கப msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "முரண்பட்ட வாதங்கள்: '--verbose' மற்றும் '--quiet' ஒரே நேரத்தில் குறிப்பிட முடியாது." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "முரண்பட்ட கட்டமைப்பு கோப்புகள்! {newfile} ஐப் பயன்படுத்துதல், {oldfile} ஐ புறக்கணித்து!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "உங்கள் கணினியில் '{command}' கண்டுபிடிக்க முடியவில்லை" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "அண்மைக் கால பதிப்பு குறியீட்டைக் கண்டுபிடிக்க முடியவில்லை" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "அண்மைக் கால பதிப்பு பெயரைக் கண்டுபிடிக்க முடியவில்லை" @@ -500,6 +454,7 @@ msgstr "பகுப்பாய்விற்கு பயன்பாடு { msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "அளவை \"{size}\", தவறான வகை \"{type}\"" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "பயன்பாட்டு ஐடியைக் கண்டுபிடிக்க முடியவில்லை" @@ -593,11 +548,6 @@ msgstr "விளக்கம் '%s' என்பது பயன்பாட msgid "Description has a duplicate line" msgstr "விளக்கம் ஒரு நகல் கோடு உள்ளது" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "விளக்கத்தில் ஒரு பட்டியல் (%s) உள்ளது, ஆனால் அது புல்லட் (*) அல்லது எண்ணற்ற (#)" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -654,11 +604,6 @@ msgstr "நெட்வொர்க்கில் குறைவாக கச msgid "Download complete mirrors of small repos" msgstr "சிறிய களஞ்சியங்களின் முழுமையான கண்ணாடியைப் பதிவிறக்கவும்" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "%s பதிவிறக்குதல்" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "களஞ்சியத்தை பதிவிறக்குவது ஏற்கனவே ஒரு முறை தோல்வியடைந்தது, மீண்டும் முயற்சிக்கவில்லை." @@ -692,14 +637,6 @@ msgstr "பிழை: %(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "பிழை: \"சேவையகம்\" துணைக்குழு அகற்றப்பட்டது, \"வரிசைப்படுத்தல்\" ஐப் பயன்படுத்தவும்!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"பிழை: F-droid.org ஐ பிரதிபலிக்க இந்த கட்டளை ஒருபோதும் பயன்படுத்தப்படக்கூடாது!\n" -" F-droid.org இன் முழு கண்ணாடிக்கு 200 சிபிக்கு மேல் தேவைப்படுகிறது." - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "பிழை: ஆதரிக்கப்படாத தொஒ வகை, திட்டுகள் வரவேற்கப்படுகின்றன!" @@ -846,10 +783,6 @@ msgstr "அதை செயலாக்கும்போது கோப்ப msgid "Finished" msgstr "முடிந்தது" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "பிளாட்ட்ரிடில் பிளாட் ட்ரிட்டில் பெல்லாங்: புலம்" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "தடைசெய்யப்பட்ட உஉகுமொ குறிச்சொற்கள்" @@ -881,7 +814,6 @@ msgstr "\"{name}\" க்கு \"{path}\" மோசமான பொருள் msgid "Found invalid appids in arguments" msgstr "வாதங்களில் தவறான பயன்பாடுகளைக் கண்டறிந்தது" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "சில பயன்பாடுகளுக்கான தவறான பதிப்புக் குறியீடுகளைக் கண்டறிந்தது" @@ -946,15 +878,13 @@ msgstr "அறிவிலி தூய்மையான தோல்விய msgid "Git fetch failed" msgstr "Git fetch தோல்வியுற்றது" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "அறிவிலி ப்ரூன் தோல்வியடைந்தது" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "அறிவிலி ரிமோட் செட்-எட் தோல்வியடைந்தது: \"%s\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "அறிவிலி மீட்டமைப்பு தோல்வியடைந்தது" @@ -1089,16 +1019,12 @@ msgstr "தவறான VERCODEOPERATION: {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "தவறான VERCODEOPERATION: {invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "தவறான பயன்பாட்டு ஐடி {appid}" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "தவறான பூலியன் '%s'" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "தவறான புல்லட் பட்டியல்" @@ -1309,7 +1235,6 @@ msgstr "{path} இல் கையொப்பமிடும் சான்ற msgid "No such package: %s" msgstr "அத்தகைய தொகுப்பு இல்லை: %s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1344,7 +1269,6 @@ msgstr "{appid}க்கு எதுவும் செய்ய முடி msgid "Now set these in config.yml:" msgstr "இப்போது இவற்றை config.yml இல் அமைக்கவும்:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1374,19 +1298,17 @@ msgstr "'Github_releases' கட்டமைப்பு உருப்பட msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "'Github_releases' கட்டமைப்பு உருப்படிகளில் ஒன்று 'கிள்ளாக்கு' மதிப்பைக் காணவில்லை. ச்கிப்பிங் ..." +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "கிராபிக்ச் மற்றும் காணப்படும் பி.என்.சி மற்றும் சே.பி.சி மட்டுமே ஆதரிக்கப்படுகின்றன: {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "பிளே ச்டோருடன் மட்டுமே வேறுபாடுகளை அச்சிடுங்கள்" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "தானியங்கு புதுப்பிப்புகளுடன் பயன்பாடுகளை மட்டுமே செயலாக்கவும்" @@ -1395,10 +1317,6 @@ msgstr "தானியங்கு புதுப்பிப்புகள msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "OpenCollective நன்கொடை முறைகள் OpenCollective: புலம்" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "விருப்பங்கள்" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "APK இன் பெயரிடப்பட்ட தாக்கல் சாதொபொகு அறிக்கை." @@ -1564,14 +1482,6 @@ msgstr "{path} \"ஐ நீக்குதல்" msgid "Rename APK files that do not match package.name_123.apk" msgstr "தொகுப்புடன் பொருந்தாத APK கோப்புகளை மறுபெயரிடுங்கள். NAME_123.APK" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "Git-svn களஞ்சியங்களில் மட்டுமே ரெபோட்ரங்க் புதுப்பிப்பு முறை அர்த்தமுள்ளதாக இருக்கும்" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "தற்போதுள்ள ஒன்று சரியாகத் தோன்றினாலும், ஒரு புதிய உருவாக்க சேவையகத்தை மீட்டமைத்து உருவாக்கவும்." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1879,11 +1789,6 @@ msgstr "எதிர்பாராத உரிமக் குறிச்ச msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "எதிர்பாராத உரிமக் குறிச்சொல் \"{}\"! உங்கள் கட்டமைப்பு கோப்பில் கட்டமைக்கப்பட்ட உரிமக் குறிச்சொற்களை மட்டுமே பயன்படுத்தவும்" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "எதிர்பாராத சிம்லிங்க் இலக்கு: {link} -> {target}" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1893,7 +1798,6 @@ msgstr "{configname} இல் அறியப்படாத நுழைவு msgid "Unknown exception found!" msgstr "அறியப்படாத விதிவிலக்கு கண்டறியப்பட்டது!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, fuzzy, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1931,6 +1835,7 @@ msgstr "அங்கீகரிக்கப்படாத பயன்பா msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "அங்கீகரிக்கப்படாத கட்டமைப்புக் கொடி '{build_flag}' '{path}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1961,11 +1866,6 @@ msgstr "பயன்படுத்தப்படாத ச்கேண்ட msgid "Unused scanignore path: %s" msgstr "பயன்படுத்தப்படாத ச்கேனிக்னர் பாதை: %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "%s க்கு அன்சிங்" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "புதிய தொகுப்புகளுக்கான ரெப்போ தகவல்களைப் புதுப்பிக்கவும்" @@ -1979,6 +1879,7 @@ msgstr "முகவரி க்கான பைனரி வெளிப்ப msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData இல் தவறான முகவரி உள்ளது: {url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1998,11 +1899,7 @@ msgstr "புதுப்பிப்பு தொழில்நுட்ப msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode அமைக்கப்பட்டுள்ளது, ஆனால் சரிபார்ப்புகள் இன்னும் இயக்கப்படவில்லை என்று தெரிகிறது." -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode அமைக்கப்பட்டுள்ளது, ஆனால் இது சாத்தியம் இன்னும் இயக்கப்படவில்லை" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "புதுப்பிப்பு சோதனை பெயர் அறியப்பட்ட பயன்பாட்டு ஐடிக்கு அமைக்கப்பட்டுள்ளது, அதை அகற்றலாம்" @@ -2017,27 +1914,10 @@ msgstr "Uploading {apkfilename} பெறுநர் androidobservatory.org" msgid "Uploading {apkfilename} to virustotal" msgstr "Uploading {apkfilename} பெறுநர் virustotal" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "பயன்பாடு" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "பயன்பாடு: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "Use /HEAD instead of /master or /main பெறுநர் புள்ளியம் at a கோப்பு in the இயல்புநிலை branch" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Use /HEAD instead of /master பெறுநர் புள்ளியம் at a கோப்பு in the இயல்புநிலை branch" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Use `fdroid புதுப்பிப்பு -c` பெறுநர் create it." @@ -2076,11 +1956,6 @@ msgstr "குடுவை கையொப்பத்தைப் பயன் msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "சாவாவின் சார்சிக்னரைப் பயன்படுத்துதல், APKS ஐ சரிபார்க்க பரிந்துரைக்கப்படவில்லை! Apksigner ஐப் பயன்படுத்தவும்" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "Using androguard இருந்து \"{path}\"" - #: ../fdroidserver/metadata.py #, fuzzy, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2182,20 +2057,11 @@ msgstr "{path} க்கு அடையாள கோப்பைச் சே msgid "adding to {name}: {path}" msgstr "{name}: {path} உடன் சேர்க்கிறது" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "தெளிவற்ற விருப்பம்: %(option)s %(matches)s உடன் பொருந்தக்கூடும்" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "தெளிவற்ற விருப்பம்: %s ( %s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2209,11 +2075,13 @@ msgstr "apksigner கண்டுபிடிக்கப்படவில் msgid "apksigner not found, it's required for signing!" msgstr "apksigner கண்டுபிடிக்கப்படவில்லை, கையெழுத்திட இது தேவை!" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "இயக்க வேண்டிய கோப்பின் பயன்பாட்டு ஐடி" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2224,8 +2092,6 @@ msgstr "Appid [: VERCODE] படிவத்தில் விருப்ப msgid "archive_url needs to end with /archive" msgstr "காப்பகம்_ஆர்ல் /காப்பகத்துடன் முடிவடைய வேண்டும்" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2244,7 +2110,7 @@ msgstr "சோதனை வரிசைப்படுத்துவதற் msgid "can not parse scrlib spec (not a string): '{}'" msgstr "ச்க்ர்லிப் ச்பெக்கை அலச முடியாது (ஒரு சரம் அல்ல): '{}'" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "' %(error)s கள்' ஐ திறக்க முடியாது: %(filename)s" @@ -2258,14 +2124,10 @@ msgstr "HTTPS அல்லாத முகவரி ஐ திறக்க ம msgid "cannot find required srclibs: \"{path}\"" msgstr "தேவையான SRCLIBS ஐக் கண்டுபிடிக்க முடியவில்லை: \"{path}\"" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "பல சப் பார்சர் வாதங்கள் இருக்க முடியாது" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2284,14 +2146,6 @@ msgstr "குளோனிங் {url}" msgid "commands from plugin modules:" msgstr "சொருகி தொகுதிகளிலிருந்து கட்டளைகள்:" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "அணைவு" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2322,10 +2176,6 @@ msgstr "SRCLIB ச்பெக்கை அலச முடியவில்ல msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "SRCLIB ச்பெக்கை அலச முடியவில்லை (குறிப்பு எதுவும் குறிப்பிடப்படவில்லை): '{}'" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "SRCLIB ச்பெக்கை அலச முடியவில்லை (அதிகமான '@' அறிகுறிகள்): '{}'" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2350,8 +2200,6 @@ msgstr "பூட்டு இல்லாமல் சார்பு கோப msgid "deployed process log {path} to {dest}" msgstr "பயன்படுத்தப்பட்ட செயல்முறை பதிவு {path} முதல் {dest} வரை" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2369,8 +2217,6 @@ msgstr "'{}' இலிருந்து ச்கேனர் கையொப msgid "executable binary, possibly code" msgstr "இயங்கக்கூடிய பைனரி, ஒருவேளை குறியீடு" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2378,20 +2224,14 @@ msgid_plural "expected %s arguments" msgstr[0] "எதிர்பார்க்கப்படும் %s உரையாடல்" msgstr[1] "எதிர்பார்க்கப்படும் %s வாதங்கள்" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "குறைந்தது ஒரு வாதத்தை எதிர்பார்க்கலாம்" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "பெரும்பாலான ஒரு வாதத்தில் எதிர்பார்க்கப்படுகிறது" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "ஒரு வாதத்தை எதிர்பார்க்கலாம்" @@ -2404,10 +2244,6 @@ msgstr "fdroid [<கட்டளை>] [-h |--help | --version | ]]" msgid "fetch the latest version of signatures from the web" msgstr "வலையிலிருந்து கையொப்பங்களின் அண்மைக் கால பதிப்பைப் பெறுங்கள்" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "மிதக்கும் புள்ளி" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "மேனிலை தரவு பிழைகள் (இயல்புநிலை) எச்சரிக்கைகள் அல்லது புறக்கணிக்கப்பட வேண்டும்." @@ -2420,8 +2256,6 @@ msgstr "அறிவிலி எச்.வி.என் நகலி தோல msgid "gzip file archive" msgstr "GZIP கோப்பு காப்பகம்" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2435,35 +2269,21 @@ msgstr "Index-V1 ஒரு கையொப்பத்தைக் கொண் msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "Index-V2 ஒரு கையொப்பத்தைக் கொண்டிருக்க வேண்டும், அதை உருவாக்க `fdroid சிக்னின்டெக்ச்` ஐப் பயன்படுத்தவும்!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "முழு எண்" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "தவறான %(type)s மதிப்பு: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "தவறான தேர்வு: %(value)r ஆர் ( %(choices)s இலிருந்து தேர்வு செய்யவும்)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "தவறான மோதல்_ -ரசல் மதிப்பு: %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2501,8 +2321,6 @@ msgstr "கண்ணாடியின் '%s' 'fdroid' உடன் முட msgid "mirrors set twice, in config.yml and {path}!" msgstr "கண்ணாடிகள் இரண்டு முறை அமைக்கப்பட்டன, config.yml மற்றும் {path}!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "பரச்பர வாதங்கள் விருப்பமாக இருக்க வேண்டும்" @@ -2521,30 +2339,15 @@ msgstr "{appid} in இல் \"படவுரு\" இல்லை" msgid "no APK supplied" msgstr "APK வழங்கப்படவில்லை" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "அத்தகைய விருப்பம் இல்லை: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "பதிப்பு செய்தி எதுவும் கிடைக்கவில்லை!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "பதிப்பு தகவல்கள் எதுவும் கிடைக்கவில்லை" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "உரையாடல் %s உடன் அனுமதிக்கப்படவில்லை" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2554,72 +2357,6 @@ msgstr "%s வாதங்களில் ஒன்று தேவை" msgid "only accepts strings, lists, and tuples" msgstr "சரங்கள், பட்டியல்கள் மற்றும் டூப்பிள்களை மட்டுமே ஏற்றுக்கொள்கிறது" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "விருப்பம் %s: கையொப்பமிடப்பட்ட அனைத்து பயன்பாடுகளையும் நீங்கள் உண்மையில் நிறுவ விரும்பினால், பயன்படுத்தவும் -அனைவருக்கும்" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "விருப்பம் %s: தவறான %s மதிப்பு: %r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "விருப்பம் %s: தவறான தேர்வு: %r ( %s இலிருந்து தேர்வு)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "விருப்பம் -%s அங்கீகரிக்கப்படவில்லை" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "விருப்பம் -%s க்கு வாதம் தேவை" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "விருப்பம் -%s க்கு ஒரு உரையாடல் இருக்கக்கூடாது" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "விருப்பம் -%s ஒரு தனித்துவமான முன்னொட்டு அல்ல" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "விருப்பம் --%s அங்கீகரிக்கப்படவில்லை" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "விருப்பம் -%s க்கு உரையாடல் தேவை" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "விருப்ப வாதங்கள்" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "விருப்பங்கள்" @@ -2629,8 +2366,6 @@ msgstr "விருப்பங்கள்" msgid "overwriting existing {path}" msgstr "இருக்கும் {path} ஐ மேலெழுதும்" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "நிலை வாதங்கள்" @@ -2663,10 +2398,6 @@ msgstr "ரெப்போ_ஆர்ல் /ரெப்போவுடன் msgid "rsync is missing or broken: {error}" msgstr "RSYNC காணவில்லை அல்லது உடைந்தது: {error}" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "ருவாமெல்.யம்ல் நிறுவப்படவில்லை, மெட்டாடேட்டாவை எழுத முடியாது." - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2690,17 +2421,7 @@ msgstr "ServerWebroot: பாதை \"fdroid\" உடன் முடிவட msgid "shared library" msgstr "பகிரப்பட்ட நூலகம்" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "நிரலின் பதிப்பு எண்ணைக் காண்பி வெளியேறவும்" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "இந்த உதவி செய்தியை காட்டிவிட்டு வெளியேறு" @@ -2734,8 +2455,6 @@ msgstr "நிலையான நூலகம்" msgid "supplied reference binary has allowed signer {signer}" msgstr "வழங்கப்பட்ட குறிப்பு பைனரி கையொப்பத்தை அனுமதித்துள்ளது {signer}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2745,22 +2464,16 @@ msgstr "பின்வரும் வாதங்கள் தேவை: %s" msgid "true" msgstr "உண்மை" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "எதிர்பாராத விருப்ப சரம்: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "அறியப்படாத பாகுபடுத்தி %(parser_name)r (தேர்வுகள்: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2771,9 +2484,7 @@ msgstr "அங்கீகரிக்கப்படாத வாதங்க msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "'{config_file}' இல் பாதுகாப்பற்ற அனுமதிகள் (0600 ஆக இருக்க வேண்டும்)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "பயன்பாடு: " @@ -2802,21 +2513,19 @@ msgstr[1] "{0} பயன்பாடுகள், {1} முக்கிய ம msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) மேனிலை தரவு இல்லை!" -#: ../fdroidserver/update.py -#, fuzzy, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename the பல {apkfilename} கோப்புகளைக் கொண்டுள்ளது, முதன்மை விசை சுரண்டல் போல் தெரிகிறது!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "{apkfilename} இன் androidmanifest.xml க்கு மோசமான தேதி உள்ளது: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} ஒரு பெயர் இல்லை! அதற்கு பதிலாக பயன்பாட்டு ஐடியைப் பயன்படுத்துதல்." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2837,7 +2546,6 @@ msgstr "{appid} பயன்பாடுகள் மற்றும் கோ msgid "{appid} is missing {name}" msgstr "{appid} காணவில்லை {name}" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2878,11 +2586,6 @@ msgstr "{file} வெற்று அல்லது ஊழல் நிறை msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/ஐகான்கள்/{path}\" இல்லை! \"Config.yml\" ஐ சரிபார்க்கவும்." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile} நீக்கப்பட்டது, {newfile} ஐப் பயன்படுத்தவும்" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index aedc4ca6..8d755574 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2024-09-10 23:49+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" @@ -55,11 +55,6 @@ msgstr "\"local_copy_dir\" {path} mevcut değil!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" zaten {dev} üzerinde kurulu." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" tarihi geçmiş {name} ({version}) içeriyor" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -85,17 +80,6 @@ msgstr "\"{path}\", izin verilmeyen bir anahtarla imzalandı:" msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" geçerli bir URL değil!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "%(option)s seçeneği %(number)d argüman gerektirir" -msgstr[1] "%(option)s seçeneği %(number)d argüman gerektirir" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -111,14 +95,6 @@ msgstr "%d APK imzalanamadı veya doğrulanamadı!" msgid "%d problems found" msgstr "%d sorun bulundu" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [seçenekler]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -139,13 +115,6 @@ msgstr "%s bozuk SHA-256'ya sahip: %s" msgid "%s is not an accepted build field" msgstr "%s kabul edilen bir inşa alanı değil" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "%s seçeneği bir değer almaz" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' config.yml içinde bulunamadı!" @@ -166,8 +135,6 @@ msgstr "'keystorepass' config.yml içinde bulunamadı!" msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' config.yml içinde bulunamadı!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' positionals için geçersiz bir argüman" @@ -181,11 +148,6 @@ msgstr "'sdk_path' config.yml içinde ayarlı değil!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' çok eski, fdroid build-tools-{version} veya daha yenisini gerektirir!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' rastgele sırada olacak! Sıra önemliyse () veya [] parantez kullanın!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -196,7 +158,7 @@ msgstr "'{path}' yürütülemedi!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' geçersiz biçime sahip, bir sözlük olmalı!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' {appid} içinde geçerli {field} değil. Regex ifadesi: {pattern}" @@ -215,8 +177,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr ".. .checkupdate {appid} için başarısız oldu: {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() tanımlı değil" @@ -307,10 +267,6 @@ msgstr "Android SDK aracı {cmd} bulunamadı!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Uygulama İkili Dosyalara sahip ancak sertifikayı sabitlemek için karşılık gelen AllowedAPKSigningKeys'e sahip değil." -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "Uygulamanın NoSourceSince veya ArchivePolicy \"0 sürümü\" var ancak AutoUpdateMode veya UpdateCheckMode Yok değil" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Uygulamanın NoSourceSince veya ArchivePolicy \"0 sürümü\" var ya da 0 var ama AutoUpdateMode veya UpdateCheckMode Yok değil" @@ -354,7 +310,6 @@ msgstr "Aynalar yapılandırmasında hatalı giriş türü \"{mirrortype}\": {mi msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Yansının temel URL'si, 'şu sorgu dizgisini kullanarak indeks imzalama anahtarını içerebilir: ?fingerprint=" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -410,11 +365,13 @@ msgstr[1] "Tarama sırasında {} hata nedeniyle inşa edilemiyor" msgid "Cannot rewrite \"{path}\"" msgstr "\"{path}\" yeniden yazılamıyor" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "'%s' kategorileri geçersiz" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Kategoriler ayarlı değil" @@ -467,20 +424,17 @@ msgstr ".yml ve yerelleştirilmiş dosyalar arasında çakışan \"{field}\" tan msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Çakışan argümanlar: '--verbose' ve '--quiet' aynı anda belirtilemez." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Çakışan yapılandırma dosyaları! {newfile} kullanılıyor, {oldfile} yok sayılıyor!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "'{command}' sisteminizde bulunamadı" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Son sürüm kodu bulunamadı" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Son sürüm adı bulunamadı" @@ -500,6 +454,7 @@ msgstr "İnceleme için APK {path} açılamadı: " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "\"{size}\" boyutu ayrıştırılamadı, yanlış tür \"{type}\"" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Uygulama kimliği bulunamadı" @@ -593,11 +548,6 @@ msgstr "Açıklama '%s' yalnızca uygulamanın özeti" msgid "Description has a duplicate line" msgstr "Açıklamanın yinelenen satırı var" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "Açıklamanın bir listesi (%s) var fakat madde imli (*) veya numaralı(#) değil" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -654,11 +604,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "Küçük depoların tam yansımasını indir" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "%s indiriliyor" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Depoyu indirmek zaten bir kez başarısız oldu, tekrar denenmiyor." @@ -692,14 +637,6 @@ msgstr "HATA: %(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "HATA: \"server\" alt komutu kaldırıldı, \"deploy\" kullanın!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"HATA: bu komut asla f-droid.org'u yansıtmak için kullanılmamalıdır!\n" -"f-droid.org'un tam bir yansıması 200GB'tan çok yer gerektirir." - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "HATA: desteklenmeyen CI türü, yama gönderebilirsiniz!" @@ -846,10 +783,6 @@ msgstr "Dosya işlenirken kayboldu: {path}" msgid "Finished" msgstr "Tamamlandı" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Flattr bağış yöntemleri FlattrID: alanında olmalı" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Yasaklı HTML etiketleri" @@ -881,7 +814,6 @@ msgstr "\"{name}\" için hatalı ödeme dosyası \"{path}\" bulundu:" msgid "Found invalid appids in arguments" msgstr "Argümanda geçersiz appid'ler bulundu" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Bazı uygulamalar için geçersiz versionCodes bulundu" @@ -946,15 +878,13 @@ msgstr "Git clean başarısız" msgid "Git fetch failed" msgstr "Git fetch başarısız" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "Git prune başarısız" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git remote set-head başarısız: \"%s\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Git reset başarısız" @@ -1089,16 +1019,12 @@ msgstr "Geçersiz Vercode İşlemi: {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "Geçersiz VercodeOperation: {invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "Geçersiz uygulama kimliği {appid}" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "Geçersiz boole '%s'" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Geçersiz madde imli liste" @@ -1309,7 +1235,6 @@ msgstr "{path} içinde imzalama sertifikaları bulunamadı" msgid "No such package: %s" msgstr "Böyle bir paket yok: %s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1344,7 +1269,6 @@ msgstr "{appid} için yapılacak işlem yok." msgid "Now set these in config.yml:" msgstr "Şimdi bunları config.yml içinde ayarlayın:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1374,19 +1298,17 @@ msgstr "'github_releases' yapılandırma ögelerinden birinde 'projectUrl' değe msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "'github_releases' yapılandırma ögelerinden birinde 'token' değeri eksik. atlanıyor..." +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Grafikler için yalnızca PNG ve JPEG desteklenir, bulunan: {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Yalnızca Play Store ile olan farkları yazdır" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Yalnızca kendiliğinden güncellemesi olan uygulamaları işle" @@ -1395,10 +1317,6 @@ msgstr "Yalnızca kendiliğinden güncellemesi olan uygulamaları işle" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "OpenCollective bağış yöntemleri OpenCollective: alanında olmalı" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Seçenekler" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "APK'den sonra adlandırılmış dosyaya JSON raporu yazdırın." @@ -1564,14 +1482,6 @@ msgstr "\"{path}\" kaldırılıyor" msgid "Rename APK files that do not match package.name_123.apk" msgstr "paket.adı_123.apk örüntüsüyle eşleşmeyen tüm APK dosyalarını yeniden adlandır" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "RepoTrunk güncelleme modu yalnızca git-svn depolarında anlamlıdır" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Sıfırla ve yeni bir inşa sunucusu yarat, var olan iyi görünüyor olsa bile." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1879,11 +1789,6 @@ msgstr "Beklenmeyen lisans etiketi \"{}\"! Yalnızca https://spdx.org/license-li msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Beklenmeyen lisans etiketi \"{}\"! Yalnızca yapılandırma dosyanızda yapılandırılan lisans etiketlerini kullanın" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "Beklenmeyen sembolik bağlantı hedefi: {link} -> {target}" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1893,7 +1798,6 @@ msgstr "{configname} içinde bilinmeyen girdi {key}" msgid "Unknown exception found!" msgstr "Bilinmeyen istisna bulundu!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1931,6 +1835,7 @@ msgstr "'{path}'deki tanınmayan uygulama alanı '{fieldname}'" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "'{path}'de tanınmayan yapı bayrağı '{build_flag}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1961,11 +1866,6 @@ msgstr "Kullanılmayan scandelete yolu: %s" msgid "Unused scanignore path: %s" msgstr "Kullanılmayan scanignore yolu: %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "%s konumuna çıkarılıyor" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Yeni paketler için depo bilgisini güncelle" @@ -1979,6 +1879,7 @@ msgstr "Bir URL için çalıştırılabilir şeffaflık günlüğünü güncelle msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData geçersiz URL'ye sahip: {url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1998,11 +1899,7 @@ msgstr "UpdateCheckData geçerli bir URL değil: {url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode ayarlı ancak checkupdates henüz çalıştırılmamış gibi görünüyor." -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode ayarlı ancak checkupdates henüz çalıştırılmamış gibi görünüyor" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName bilinen uygulama kimliğine ayarlı - kaldırılabilir" @@ -2017,27 +1914,10 @@ msgstr "{apkfilename}, androidobservatory.org'a yükleniyor" msgid "Uploading {apkfilename} to virustotal" msgstr "{apkfilename} virustotal'e yükleniyor" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Kullanım" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Kullanım: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "Öntanımlı daldaki bir dosyaya işaret etmek için /master veya /main yerine /HEAD kullanın" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Öntanımlı daldaki bir dosyaya işaret etmek için /master yerine /HEAD kullanın" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Onu oluşturmak için `fdroid update -c` kullanın." @@ -2076,11 +1956,6 @@ msgstr "JAR İmza kullanılıyor" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Java'nın jarsigner'ı kullanılıyor, APK'ları doğrulamak için önerilmez! apksigner'ı kullanın" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "\"{path}\" adresinden androguard'ı kullanıyor" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2182,20 +2057,11 @@ msgstr "IdentityFile {path} konumuna ekleniyor" msgid "adding to {name}: {path}" msgstr "{name} adına ekleniyor: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "belirsiz şeçenek: %(option)s ile %(matches)s eşleşebilir" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "belirsiz şeçenek: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2209,11 +2075,13 @@ msgstr "apksigner bulunamadı! Modern APK'lar imzalanamıyor veya doğrulanamıy msgid "apksigner not found, it's required for signing!" msgstr "apksigner bulunamadı, imzalamak için gereklidir!" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "üzerinde işlem yapılacak dosyanın uygulama kimliği" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2224,8 +2092,6 @@ msgstr "UYGULAMA_KİMLİĞİ[:SÜRÜM_KODU] biçiminde isteğe bağlı versionCo msgid "archive_url needs to end with /archive" msgstr "archive_url'nin /archive ile bitmesi gerekiyor" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2244,7 +2110,7 @@ msgstr "Dağıtım anahtarını sınamak için çıplak SSH bağlantısı deneni msgid "can not parse scrlib spec (not a string): '{}'" msgstr "scrlib belirtimi ayrıştırılamıyor (bir dizge değil): '{}'" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "'%(filename)s' açılamıyor: %(error)s" @@ -2258,14 +2124,10 @@ msgstr "https olmayan url açılamıyor: '{};" msgid "cannot find required srclibs: \"{path}\"" msgstr "gerekli srclibs bulunamıyor: \"{path}\"" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "birden çok alt-ayrıştırıcı argümanı verilemez" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2284,14 +2146,6 @@ msgstr "{url} klonlanıyor" msgid "commands from plugin modules:" msgstr "eklenti modüllerinden komutlar:" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "karmaşık" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2322,10 +2176,6 @@ msgstr "srclib belirtimi ayrıştırılamadı (ad belirtilmedi): '{}'" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "srclib belirtimi ayrıştırılamadı (referans belirtilmedi): '{}'" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "srclib belirtimi ayrıştırılamadı (çok fazla '@' işareti): '{}'" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2350,8 +2200,6 @@ msgstr "kilitsiz bağımlılık dosyası" msgid "deployed process log {path} to {dest}" msgstr "{path} işlem günlüğü {dest}'e dağıtıldı" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2369,8 +2217,6 @@ msgstr "'{}' tarayıcı imzalarının indirilmesi başarısız oldu" msgid "executable binary, possibly code" msgstr "çalıştırılabilir ikili dosya, muhtemelen kod" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2378,20 +2224,14 @@ msgid_plural "expected %s arguments" msgstr[0] "beklenen %s argümandı" msgstr[1] "beklenen %s argümandı" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "beklenen en az bir argümandı" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "beklenen en çok bir argümandı" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "beklenen bir argümandı" @@ -2404,10 +2244,6 @@ msgstr "fdroid [] [-h|--help|--version|]" msgid "fetch the latest version of signatures from the web" msgstr "imzaların en son sürümünü internetten al" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "kayan nokta" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "üst veri hatalarının (öntanımlı) uyarı olmasını veya yok sayılmasını zorunlu kıl." @@ -2420,8 +2256,6 @@ msgstr "git svn clone başarısız" msgid "gzip file archive" msgstr "gzip dosya arşivi" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2435,35 +2269,21 @@ msgstr "index-v1 bir imzaya sahip olmalı, oluşturmak için `fdroid signindex` msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 bir imzaya sahip olmalı, oluşturmak için `fdroid signindex` kullanın!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "tamsayı" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "geçersiz %(type)s değeri: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "geçersiz seçim: %(value)r (%(choices)s içinden seçin)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "geçersiz conflict_resolution değeri: %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2501,8 +2321,6 @@ msgstr "Yansıma '%s' 'fdroid' ile bitmiyor!" msgid "mirrors set twice, in config.yml and {path}!" msgstr "yansı iki defa ayarlandı, config.yml ve {path} içinde!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "birbirinden bağımsız argümanlar isteğe bağlı olmalıdır" @@ -2521,30 +2339,15 @@ msgstr "{appid} içinde simge yok" msgid "no APK supplied" msgstr "APK sağlanmadı" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "böyle bir şeçenek yok: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "Sürüm bilgisi bulunamadı!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "sürüm bilgisi bulunamadı" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "argüman %s ile izin verilmez" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2554,72 +2357,6 @@ msgstr "%s argümanlarından biri gerekli" msgid "only accepts strings, lists, and tuples" msgstr "yalnızca dizgileri, listeleri ve demetleri (tuple) kabul eder" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "seçenek %s: Tüm imzalı uygulamaları gerçekten kurmak istiyorsanız, --all kullanın" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "seçenek %s: geçersiz %s değeri: %r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "seçenek %s: geçersiz seçim: %r (%s içinden seçin)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "-%s seçeneği tanınmıyor" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "-%s seçeneği argüman gerektirir" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "--%s seçeneğinin argümanı olmamalı" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "--%s seçeneği tekil ön ek değil" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "--%s seçeneği tanınmıyor" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "--%s seçeneği argüman gerektirir" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "isteğe bağlı argümanlar" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "seçenekler" @@ -2629,8 +2366,6 @@ msgstr "seçenekler" msgid "overwriting existing {path}" msgstr "var olan {path} üzerine yazılıyor" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "konumsal argümanlar" @@ -2663,10 +2398,6 @@ msgstr "repo_url'nin /repo ile bitmesi gerekiyor" msgid "rsync is missing or broken: {error}" msgstr "rsync eksik veya bozuk: {error}" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "ruamel.yaml kurulu değil, üst veriler yazılamıyor." - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2690,17 +2421,7 @@ msgstr "serverwebroot: yol \"fdroid\" ile sonlanmıyor, belki de bunlardan birin msgid "shared library" msgstr "paylaşımlı kütüphane" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "programın sürüm numarasını göster ve çık" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "bu yardım yazısını göster ve çık" @@ -2734,8 +2455,6 @@ msgstr "statik kütüphane" msgid "supplied reference binary has allowed signer {signer}" msgstr "sağlanan referans ikilisi {signer} imzalayana izin verdi" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2745,22 +2464,16 @@ msgstr "şu argümanlar gerekli: %s" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "beklenmeyen seçenek satırı: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "bilinmeyen ayrıştırıcı %(parser_name)r (seçenekler: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2771,9 +2484,7 @@ msgstr "tanınmayan argümanlar: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "'{config_file}' üzerinde güvenli olmayan izinler (0600 olmalı)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "kullanım: " @@ -2802,21 +2513,19 @@ msgstr[1] "{0} uygulama, {1} anahtar adı" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename}{appid} üst verisi yok!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} içinde birden çok {name} dosyası var, Master Key istisamarı gibi görünüyor!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "{apkfilename} içindeki AndroidManifest.xml tarihi bozuk: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} bir ada sahip değil! Bunun yerine uygulama kimliği kullanılıyor." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2837,7 +2546,6 @@ msgstr "{appid} hem APK hem de dosyalara sahip: {files}" msgid "{appid} is missing {name}" msgstr "{appid} içinde {name} eksik" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2878,11 +2586,6 @@ msgstr "{file} boş veya bozuk!" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" yok! config.yml içinde düzeltin." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile} kullanımdan kaldırıldı, {newfile} kullanın" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/tzm/LC_MESSAGES/fdroidserver.po b/locale/tzm/LC_MESSAGES/fdroidserver.po index eeeff099..61a2f416 100644 --- a/locale/tzm/LC_MESSAGES/fdroidserver.po +++ b/locale/tzm/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-681-gc19e8952\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2020-10-29 08:32+0000\n" "Last-Translator: Hakim Oubouali \n" "Language-Team: Central Atlas Tamazight \n" @@ -48,11 +48,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -78,17 +73,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -104,14 +88,6 @@ msgstr "" msgid "%d problems found" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [tidɣrin]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -132,13 +108,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "" @@ -159,8 +128,6 @@ msgstr "" msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -174,11 +141,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -189,7 +151,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -208,8 +170,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr "" @@ -300,10 +260,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -347,7 +303,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -403,11 +358,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "" @@ -460,20 +417,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -493,6 +447,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -586,11 +541,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -647,11 +597,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -685,12 +630,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -835,10 +774,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -870,7 +805,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -935,15 +869,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1078,16 +1010,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1298,7 +1226,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1333,7 +1260,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1363,19 +1289,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1384,10 +1308,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Tidɣrin" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1553,14 +1473,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1861,11 +1773,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1875,7 +1782,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1913,6 +1819,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1943,11 +1850,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -1961,6 +1863,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1980,11 +1883,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -1999,27 +1898,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2058,11 +1940,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2164,20 +2041,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2191,11 +2059,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2206,8 +2076,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2226,7 +2094,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" @@ -2240,14 +2108,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2266,14 +2130,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2304,10 +2160,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2332,8 +2184,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2351,8 +2201,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2360,20 +2208,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2386,10 +2228,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2402,8 +2240,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2417,35 +2253,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2483,8 +2305,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2503,30 +2323,15 @@ msgstr "" msgid "no APK supplied" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2536,72 +2341,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "" - #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" @@ -2612,8 +2351,6 @@ msgstr "Tidɣrin" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "" @@ -2646,10 +2383,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2673,17 +2406,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "Smal taleqqemt n uhil, tffeɣd" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "" @@ -2717,8 +2440,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2728,22 +2449,16 @@ msgstr "" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2754,9 +2469,7 @@ msgstr "" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "" @@ -2785,21 +2498,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2820,7 +2531,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2861,11 +2571,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/ug/LC_MESSAGES/fdroidserver.po b/locale/ug/LC_MESSAGES/fdroidserver.po index 6b7254b3..7881976d 100644 --- a/locale/ug/LC_MESSAGES/fdroidserver.po +++ b/locale/ug/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2018-06-08 03:44+0000\n" "Last-Translator: ۋولقان \n" "Language-Team: Uyghur \n" @@ -49,11 +49,6 @@ msgstr "" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -79,17 +74,6 @@ msgstr "" msgid "\"{url}\" is not a valid URL!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "" -msgstr[1] "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -105,14 +89,6 @@ msgstr "" msgid "%d problems found" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -133,13 +109,6 @@ msgstr "" msgid "%s is not an accepted build field" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "" @@ -160,8 +129,6 @@ msgstr "" msgid "'repo_keyalias' not found in config.yml!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "" @@ -175,11 +142,6 @@ msgstr "" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -190,7 +152,7 @@ msgstr "" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "" @@ -209,8 +171,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr "" @@ -301,10 +261,6 @@ msgstr "" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "" @@ -348,7 +304,6 @@ msgstr "" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -404,11 +359,13 @@ msgstr[1] "" msgid "Cannot rewrite \"{path}\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, fuzzy, python-format msgid "Categories '%s' is not valid" msgstr "تۈرلەر قۇرۇلمىغان '%s'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "تۈرلەر قۇرۇلمىغان" @@ -461,20 +418,17 @@ msgstr "" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "" @@ -494,6 +448,7 @@ msgstr "" msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "" @@ -587,11 +542,6 @@ msgstr "" msgid "Description has a duplicate line" msgstr "" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -648,11 +598,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "" @@ -686,12 +631,6 @@ msgstr "" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "" @@ -836,10 +775,6 @@ msgstr "" msgid "Finished" msgstr "" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "" @@ -871,7 +806,6 @@ msgstr "" msgid "Found invalid appids in arguments" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "" @@ -936,15 +870,13 @@ msgstr "" msgid "Git fetch failed" msgstr "" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "" @@ -1079,16 +1011,12 @@ msgstr "" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Invalid application ID {appid}" msgstr "{appid} ئىچىدە \"سىنبەلگە\" تېپىلمىدى" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "" @@ -1299,7 +1227,6 @@ msgstr "" msgid "No such package: %s" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1335,7 +1262,6 @@ msgstr "" msgid "Now set these in config.yml:" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1365,19 +1291,17 @@ msgstr "" msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "" @@ -1386,10 +1310,6 @@ msgstr "" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "" @@ -1555,14 +1475,6 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1863,11 +1775,6 @@ msgstr "" msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1877,7 +1784,6 @@ msgstr "" msgid "Unknown exception found!" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1915,6 +1821,7 @@ msgstr "" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1945,11 +1852,6 @@ msgstr "" msgid "Unused scanignore path: %s" msgstr "" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "" @@ -1963,6 +1865,7 @@ msgstr "" msgid "UpdateCheckData has invalid URL: {url}" msgstr "" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -1982,11 +1885,7 @@ msgstr "" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "" @@ -2001,27 +1900,10 @@ msgstr "" msgid "Uploading {apkfilename} to virustotal" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "" @@ -2060,11 +1942,6 @@ msgstr "" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2166,20 +2043,11 @@ msgstr "" msgid "adding to {name}: {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2193,11 +2061,13 @@ msgstr "" msgid "apksigner not found, it's required for signing!" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2208,8 +2078,6 @@ msgstr "" msgid "archive_url needs to end with /archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2228,7 +2096,7 @@ msgstr "" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "" @@ -2242,14 +2110,10 @@ msgstr "" msgid "cannot find required srclibs: \"{path}\"" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2268,14 +2132,6 @@ msgstr "" msgid "commands from plugin modules:" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2306,10 +2162,6 @@ msgstr "" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2334,8 +2186,6 @@ msgstr "" msgid "deployed process log {path} to {dest}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2353,8 +2203,6 @@ msgstr "" msgid "executable binary, possibly code" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2362,20 +2210,14 @@ msgid_plural "expected %s arguments" msgstr[0] "" msgstr[1] "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "" @@ -2388,10 +2230,6 @@ msgstr "" msgid "fetch the latest version of signatures from the web" msgstr "" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "" @@ -2404,8 +2242,6 @@ msgstr "" msgid "gzip file archive" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2419,35 +2255,21 @@ msgstr "" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2485,8 +2307,6 @@ msgstr "" msgid "mirrors set twice, in config.yml and {path}!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "" @@ -2505,31 +2325,16 @@ msgstr "{appid} ئىچىدە \"سىنبەلگە\" تېپىلمىدى" msgid "no APK supplied" msgstr "ھېچقانداق APK تەمىنلەنمىگەن" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "نەشىر ئۇچۇرى تېپىلمىدى!" - #: ../fdroidserver/checkupdates.py #, fuzzy msgid "no version information found" msgstr "نەشىر ئۇچۇرى تېپىلمىدى!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2539,72 +2344,6 @@ msgstr "" msgid "only accepts strings, lists, and tuples" msgstr "" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "" @@ -2614,8 +2353,6 @@ msgstr "" msgid "overwriting existing {path}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "" @@ -2648,10 +2385,6 @@ msgstr "" msgid "rsync is missing or broken: {error}" msgstr "" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2675,17 +2408,7 @@ msgstr "" msgid "shared library" msgstr "" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "" @@ -2719,8 +2442,6 @@ msgstr "" msgid "supplied reference binary has allowed signer {signer}" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2730,22 +2451,16 @@ msgstr "" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2756,9 +2471,7 @@ msgstr "" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "" @@ -2787,21 +2500,19 @@ msgstr[1] "" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2822,7 +2533,6 @@ msgstr "" msgid "{appid} is missing {name}" msgstr "" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2863,11 +2573,6 @@ msgstr "" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 59978250..aff7f74a 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2025-03-20 14:13+0000\n" "Last-Translator: Максим Горпиніч \n" "Language-Team: Ukrainian \n" @@ -64,11 +64,6 @@ msgstr "\"local_copy_dir\" {path} не існує!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" вже встановлено на {dev}." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" містить застарілу {name}{version}" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -94,18 +89,6 @@ msgstr "«{path}» підписано не дозволеним ключем:" msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" є недійсною URL-адресою!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "%(option)s параметр вимагає %(number)d аргумент" -msgstr[1] "%(option)s параметр вимагає %(number)d аргументи" -msgstr[2] "%(option)s параметр вимагає %(number)d аргументів" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -121,14 +104,6 @@ msgstr "%d APK не вдалося підписати або перевірит msgid "%d problems found" msgstr "%d знайдено проблем" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [параметри]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -149,13 +124,6 @@ msgstr "%s має неправильний SHA-256: %s" msgid "%s is not an accepted build field" msgstr "%s не є прийнятним полем для створення" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "%s параметр не приймає значення" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "'keypass' не знайдено в config.yml!" @@ -176,8 +144,6 @@ msgstr "'keystorepass' не знайдено в config.yml!" msgid "'repo_keyalias' not found in config.yml!" msgstr "'repo_keyalias' не знайдено в config.yml!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' недійсний аргумент для позицій" @@ -191,11 +157,6 @@ msgstr "'sdk_path' не встановлено в config.yml!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' занадто старий, fdroid вимагає build-tools-{version} або новіший!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' буде у довільному порядкові! Використовуйте () або [], якщо порядок є важливим!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -206,7 +167,7 @@ msgstr "'{path}' не вдалося виконати!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' має недійсний формат, це має бути словник!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' не є правильним {field} у {appid}. Правильний приклад: {pattern}" @@ -225,8 +186,6 @@ msgstr "--merge-request працює лише в одній програмі!" msgid "...checkupdate failed for {appid} : {error}" msgstr "... checkupdate не вдалося для {appid} : {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() не визначено" @@ -317,10 +276,6 @@ msgstr "Інструмент Android SDK {cmd} не знайдено!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "Програма має двійкові файли, але не має відповідних AllowedAPKSigningKeys для закріплення сертифіката." -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "Застосунок має NoSourceSince або ArchivePolicy «0 версій», але AutoUpdateMode або UpdateCheckMode не дорівнюють None" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "Застосунок має NoSourceSince або ArchivePolicy «0 версій», але AutoUpdateMode або UpdateCheckMode не дорівнюють None" @@ -364,7 +319,6 @@ msgstr "Неправильний тип запису \"{mirrortype}\" у кон msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "Базова URL-адреса для дзеркала може містити ключ підпису індексу за допомогою рядка запиту: ?fingerprint=" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -421,11 +375,13 @@ msgstr[2] "Неможливо створити через {} помилок пі msgid "Cannot rewrite \"{path}\"" msgstr "Не вдалося перезаписати шлях \"{path}\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "Категорія '%s' неприпустима" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "Категорії не встановлено" @@ -478,20 +434,17 @@ msgstr "Конфлікт визначень \"{field}\" між .yml і лока msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "Конфліктні аргументи: \"---verbose\" і \"--quiet\" не можна вказати одночасно." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "Суперечливі файли налаштувань! Використання {newfile}, ігнорування {oldfile}!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "Не вдалося знайти '{command}' у вашій системі" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "Не вдалося знайти останню версію коду" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "Не вдалося знайти найновішу назву версії" @@ -511,6 +464,7 @@ msgstr "Не вдалося відкрити файл APK {path} для анал msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "Не вдалося проаналізувати розмір \"{size}\", неправильний тип \"{type}\"" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "Не вдалося знайти ID застосунку" @@ -604,11 +558,6 @@ msgstr "Опис '%s' є лише резюме застосунку" msgid "Description has a duplicate line" msgstr "Опис містить дублікат рядка" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "Опис містить список (%s) але не маркірований (*) і не пронумерований (#)" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -665,11 +614,6 @@ msgstr "Завантажуйте F-Droid.apk за допомогою дзерк msgid "Download complete mirrors of small repos" msgstr "Завантажувати повноцінні дзеркала невеликих репозиторіїв" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "Завантаження %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "Завантаження репозиторію вже не вдалося, не намагайтеся знову." @@ -703,14 +647,6 @@ msgstr "ПОМИЛКА: %(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "ПОМИЛКА: Підкоманду \"server\" вилучено, використовуйте \"deploy\"!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"ПОМИЛКА: ця команда ніколи не повинна використовуватися для створення дзеркала f-droid.org!\n" -"Повне дзеркало f-droid.org вимагає понад 200GB." - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "ПОМИЛКА: непідтримуваний вид CI, виправлення вітається!" @@ -857,10 +793,6 @@ msgstr "Файл зник під час його обробки: {path}" msgid "Finished" msgstr "Готово" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Належний до FlattrID метод допомоги Flattr: не вдалося" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "Заборонені мітки HTML" @@ -892,7 +824,6 @@ msgstr "Знайдено пошкоджений файл фінансуванн msgid "Found invalid appids in arguments" msgstr "Знайдено недійсні прикладні програми в аргументах" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "Знайдено недійсні версії коду для деяких застосунків" @@ -957,15 +888,13 @@ msgstr "Очистити Git невдалося" msgid "Git fetch failed" msgstr "Git вибірка не вдалася" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "Не вдалося виконати Git prune" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Помилка налаштування remote set-head для Git: «%s»" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Скидання Git не вдалося" @@ -1100,16 +1029,12 @@ msgstr "Недійсна VercodeOperation: {field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "Недійсна VercodeOperation: {invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "Недійсний ID застосунку {appid}" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "Недійсний логічний '%s'" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "Недійсний розмічений список" @@ -1320,7 +1245,6 @@ msgstr "У {path} не знайдено сертифікатів для підп msgid "No such package: %s" msgstr "Такого пакунка немає: %s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1355,7 +1279,6 @@ msgstr "Для {appid} нічого виконувати." msgid "Now set these in config.yml:" msgstr "Тепер встановіть їх у config.yml:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1385,19 +1308,17 @@ msgstr "В одному з елементів конфігурації 'github_r msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "В одному з елементів конфігурації 'github_releases' відсутнє значення 'token'. пропущено ..." +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "Підтримуються лише PNG та JPEG зображення, знайдено: {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "Приймає лише один ключ \"env\"" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "Показувати лише ті застосунки, версія яких відрізняється від версії з Play Store" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "Обробляти застосунки лише за допомогою автоматичних оновлень" @@ -1406,10 +1327,6 @@ msgstr "Обробляти застосунки лише за допомогою msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "Належний до OpenCollective метод допомоги OpenCollective: не вдалося" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "Параметри" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "Виведіть JSON-звіт у назві файлу APK." @@ -1575,14 +1492,6 @@ msgstr "Вилучення {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Перейменування файлів APK, які не відповідають package.name_123.apk" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "Режим оновлення RepoTrunk має сенс лише в репозиторіях git-svn" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "Скиньте та створіть новий сервер збирання, навіть якщо з наявним усе гаразд." - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1891,11 +1800,6 @@ msgstr "Недійсна мітка ліцензії \"{}\"! Використо msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "Неочікувана мітка ліцензії \"{}\"! Використовуйте лише мітки ліцензій, налаштовані у файлі налаштувань" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "Неочікувана ціль символічного посилання: {link} -> {target}" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1905,7 +1809,6 @@ msgstr "Невідомий запис {key} у {configname}" msgid "Unknown exception found!" msgstr "Виявлено невідому виняткову ситуацію!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1943,6 +1846,7 @@ msgstr "Нерозпізнане поле застосунку '{fieldname}' в msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "Нерозпізнаний прапорець збірки '{build_flag}' у '{path}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1973,11 +1877,6 @@ msgstr "Невикористаний шлях scandelete: %s" msgid "Unused scanignore path: %s" msgstr "Невикористаний шлях scanignore: %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "Видобути в %s" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "Оновіть дані репозиторію для нових пакунків" @@ -1991,6 +1890,7 @@ msgstr "Оновити бінарний журнал прозорості для msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData має недійсну URL-адресу: {url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -2010,11 +1910,7 @@ msgstr "UpdateCheckData не є дійсною URL-адресою: {url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode налаштовано, але схоже, що команду checkupdates ще не запущено." -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode встановлено, але схоже, що команду checkupdates ще не було запущено" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "Назву застосунку для перевірки оновлень встановлено на відомий ID застосунку — його можна буде вилучити" @@ -2029,27 +1925,10 @@ msgstr "Завантаження {apkfilename} на androidobservatory.org" msgid "Uploading {apkfilename} to virustotal" msgstr "Завантаження {apkfilename} до virustotal" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "Використання" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "Використання: %s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "Використовуйте /HEAD замість /master або /main, щоб вказати на файл у типовій гілці" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "Використовуйте /HEAD замість /master для вказання на файл типовій гілці" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "Використовуйте `fdroid update -c`, щоб створити файли метаданих." @@ -2088,11 +1967,6 @@ msgstr "Використання JAR-підпису" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "Не варто перевіряти APK за допомогою jarsigner Java! Користуйтеся apksigner" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "Використання androguard від \"{path}\"" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2194,20 +2068,11 @@ msgstr "додавання IdentityFile до {path}" msgid "adding to {name}: {path}" msgstr "додавання до {name}: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "неоднозначний параметр: %(option)s може відповідати %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "неоднозначний параметр: %s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2221,11 +2086,13 @@ msgstr "apksigner не знайдено! Не вдалося підписати msgid "apksigner not found, it's required for signing!" msgstr "apksigner не знайдено, це потрібно для підписання!" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "application ID файлу застосунку для роботи на" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2236,8 +2103,6 @@ msgstr "ID застосунку з необов'язковим versionCode у ф msgid "archive_url needs to end with /archive" msgstr "archive_url має закінчуватися на /archive" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2256,7 +2121,7 @@ msgstr "спроба відкритого з'єднання ssh для пере msgid "can not parse scrlib spec (not a string): '{}'" msgstr "не вдається проаналізувати специфікацію scrlib (не рядок): '{}'" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "не вдалося відкрити «%(filename)s»: %(error)s" @@ -2270,14 +2135,10 @@ msgstr "не вдалося відкрити не-https url: '{};" msgid "cannot find required srclibs: \"{path}\"" msgstr "не вдалося знайти потрібні srclibs: \"{path}\"" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "не може мати кілька аргументів підпарсера" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2296,14 +2157,6 @@ msgstr "клонування {url}" msgid "commands from plugin modules:" msgstr "команди з модулів плагіна:" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "складний" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2335,10 +2188,6 @@ msgstr "не вдалося розібрати специфікацію srclib ( msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "не вдалося проаналізувати специфікацію srclib (посилання не вказано): '{}'" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "не вдалося проаналізувати специфікацію srclib (занадто багато знаків '@'): '{}'" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2363,8 +2212,6 @@ msgstr "файл залежності без блокування" msgid "deployed process log {path} to {dest}" msgstr "розгорнуто журнал процесів {path} до {dest}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2382,8 +2229,6 @@ msgstr "не вдалося завантажити підписи сканера msgid "executable binary, possibly code" msgstr "виконуваний двійковий файл, можливо, код" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" @@ -2392,20 +2237,14 @@ msgstr[0] "очікується %s аргумент" msgstr[1] "очікується %s аргументи" msgstr[2] "очікується %s аргументів" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "очікується хоча б один аргумент" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "очікується не більше одного аргументу" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "очікується один аргумент" @@ -2418,10 +2257,6 @@ msgstr "fdroid [<команда>] [-h|--help|--version|<аргументи>]" msgid "fetch the latest version of signatures from the web" msgstr "отримати останню версію підписів з інтернету" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "з комою, що плаває" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "показувати помилки метаданих (типово), як попередження, або нехтувати ними." @@ -2434,8 +2269,6 @@ msgstr "Не вдалося клонувати git svn" msgid "gzip file archive" msgstr "gzip-архів" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2449,35 +2282,21 @@ msgstr "index-v1 повинен мати підпис, використовуй msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 повинен мати підпис, використовуйте `fdroid signindex`, щоб створити його!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "ціле число" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "недійсне %(type)s значення: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "неправильний вибір: %(value)r (варто обрати з %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "недійсне значення conflict_resolution: %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2515,8 +2334,6 @@ msgstr "дзеркало '%s' не закінчується на 'fdroid'!" msgid "mirrors set twice, in config.yml and {path}!" msgstr "дзеркала задано двічі, в config.yml та {path}!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "взаємозаперечні аргументи повинні бути необов'язковими" @@ -2535,30 +2352,15 @@ msgstr "не має \"icon\" у {appid}" msgid "no APK supplied" msgstr "APK не надано" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "такого параметру немає: %s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "не вдалося визначити версію!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "не знайдено відомостей про версію" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "не дозволено з аргументом %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2568,72 +2370,6 @@ msgstr "потрібен один з аргументів %s" msgid "only accepts strings, lists, and tuples" msgstr "приймає лише рядки, списки та кортежі" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "параметр %s: Якщо ви дійсно хочете встановити всі підписані застосунки, використовуйте --all" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "параметр %s: недійсне %s значення: %r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "для параметра %s: неправильний вибір: %r (вибрати з %s)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "параметр -%s не розпізнано" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "параметр -%s потрібен аргумент" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "параметр --%s не має аргументу" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "параметр --%s не унікальний префікс" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "параметр --%s не визнано" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "параметр --%s потрібен аргумент" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "необов'язкові аргументи" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "параметри" @@ -2643,8 +2379,6 @@ msgstr "параметри" msgid "overwriting existing {path}" msgstr "перезаписування наявного шляху {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "позиційні аргументи" @@ -2677,10 +2411,6 @@ msgstr "repo_url повинен закінчуватися на /repo" msgid "rsync is missing or broken: {error}" msgstr "rsync відсутній або несправний: {error}" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "ruamel.yaml не встановлено, не вдається записати метадані." - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2704,17 +2434,7 @@ msgstr "serverwebroot: шлях не закінчується на «fdroid», msgid "shared library" msgstr "спільна бібліотека" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "показати номер версії програми та вийти" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "показати довідку та вийти" @@ -2748,8 +2468,6 @@ msgstr "статична бібліотека" msgid "supplied reference binary has allowed signer {signer}" msgstr "наданий еталонний двійковий файл дозволив підписувачу {signer}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2759,22 +2477,16 @@ msgstr "такі аргументи зобов'язані: %s" msgid "true" msgstr "правда" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "неочікуваний рядок параметрів: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "невідомий парсер %(parser_name)r (варто вибрати: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2785,9 +2497,7 @@ msgstr "нерозпізнані аргументи: %s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "небезпечні дозволи на '{config_file}' (should be 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "використання: " @@ -2817,21 +2527,19 @@ msgstr[2] "{0} застосунків, {1} alias ключів" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) не має метаданих!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} має декілька {name} файлів, схоже на використання проблеми безпеки Master Key!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "AndroidManifest.xml застосунка {apkfilename} має неправильну дату: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} не має назви! Застосовуватиметься ID застосунку." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2852,7 +2560,6 @@ msgstr "{appid} має APK і файли: {files}" msgid "{appid} is missing {name}" msgstr "У {appid} немає {name}" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2893,11 +2600,6 @@ msgstr "{file} порожній або пошкоджений!" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" не існує! Виправте його в \"config.yml\"." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile} вилучено, використовується {newfile}" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 4ef2a262..73c21a40 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -39,7 +39,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2025-03-21 03:03+0000\n" "Last-Translator: 大王叫我来巡山 \n" "Language-Team: Chinese (Simplified Han script) \n" @@ -86,11 +86,6 @@ msgstr "\"local_copy_dir\" {path} 不存在!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "'{apkfilename}' 已安装在 {dev} 上." -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" 包含过时的 {name} ({version})" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -116,16 +111,6 @@ msgstr "\"{path}\" 由不允许的密钥所签署:" msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" 不是有效的链接!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "%(option)s 选项需要 %(number)d 个参数" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -141,14 +126,6 @@ msgstr "%d 个 APK 无法签名或验证!" msgid "%d problems found" msgstr "发现 %d 个问题" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [选项]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -169,13 +146,6 @@ msgstr "%s 的 SHA-256 值不正确:%s" msgid "%s is not an accepted build field" msgstr "%s 不是一个被接受的构建字段" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "%s 选项不采用参数" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "config.yml 中找不到 'keypass'!" @@ -196,8 +166,6 @@ msgstr "config.yml 中找不到 'keystorepass'!" msgid "'repo_keyalias' not found in config.yml!" msgstr "config.yml 中找不到 'repo_keyalias'!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "'required' 是位置的无效参数" @@ -211,11 +179,6 @@ msgstr "未在 config.yml 中设置 'sdk_path'!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' 太旧, F-Droid 需要 build-tools-{version} 或更新的版本!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "{field} 将随机排列! 如果顺序很重要, 请使用 () 或 [] 括号!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -226,7 +189,7 @@ msgstr "'{path}' 执行失败!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "'{path}' 是无效格式, 它应该是字典!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "'{value}' 不是 {appid} 之有效 {field}. 正则表达式: {pattern}" @@ -245,8 +208,6 @@ msgstr "--merge-request 只运行在单个 appid 上!" msgid "...checkupdate failed for {appid} : {error}" msgstr "…为 {appid} 检查更新失败: {error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() 未定义" @@ -337,10 +298,6 @@ msgstr "没找到 Android SDK 工具 {cmd}!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "应用具有二进制文件,但没有相应的AllowedAPKSigningKeys 来固定证书。" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "应用的 NoSourceSince 或 ArchivePolicy 为 “0 versions” 但 AutoUpdateMode 或 UpdateCheckMode 不是 None" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "APK 有 NoSourceSince 或 ArchivePolicy \"0 versions\" 或 0 但 AutoUpdateMode 或 UpdateCheckMode 不是 None" @@ -384,7 +341,6 @@ msgstr "镜像配置中的错误条目类型“{mirrortype}”:{mirror}" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "镜像的基本链接可以使用此请求参数包含索引签名键: ?fingerprint=" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -439,11 +395,13 @@ msgstr[0] "因扫描时的{}错误而无法构建" msgid "Cannot rewrite \"{path}\"" msgstr "无法重写 {path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "类别 '%s' 无效" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "没有设置类别" @@ -496,20 +454,17 @@ msgstr ".yml 和本地化文件之间的“{field}”定义冲突:" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "冲突的参数: '--verbose' 和 '--quiet' 不能被同时使用." -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "冲突的配置文件! 使用 {newfile}, 忽略 {oldfile}!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "在您的系统中无法找到 '{command}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "找不到最新版本代码" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "找不到最新的版本名" @@ -529,6 +484,7 @@ msgstr "无法打开 apk 文件 {path} 用于分析: " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "无法解析大小 \"{size}\", 错误类型 \"{type}\"" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "找不到应用ID" @@ -622,11 +578,6 @@ msgstr "简介“%s”与应用的概括文字相同" msgid "Description has a duplicate line" msgstr "简介有重复行" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "简介中带有列表(%s),但它既不是子弹(*)形列表也不是编号(#)型列表" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -683,11 +634,6 @@ msgstr "使用向网络泄露较少信息的镜像下载 F-Droid apk" msgid "Download complete mirrors of small repos" msgstr "下载小型仓库的完整镜像" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "正在下载 %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "下载仓库已经失败了一次,不再尝试。" @@ -721,14 +667,6 @@ msgstr "错误:%(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "错误:\"server\" 子命令已被删除,请使用 \"deploy\"!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"错误:请不要使用此命令来镜像 f-droid.org!\n" -"对 f-droid.org 进行完整镜像至少需要超过 200GB 的储存空间。" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "错误:不支持的 CI 类型,欢迎提交补丁添加支持!" @@ -875,10 +813,6 @@ msgstr "文件在处理时消失: {path}" msgid "Finished" msgstr "已完成" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Flattr 捐赠方法属于 FlattrID: 字段" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "禁止的HTML标签" @@ -910,7 +844,6 @@ msgstr "为“{name}”找到了错误的资金文件“{path}”:" msgid "Found invalid appids in arguments" msgstr "在参数中发现无效的appids" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "发现某些应用的版本代码无效" @@ -975,15 +908,13 @@ msgstr "Git clean 失败" msgid "Git fetch failed" msgstr "Git fetch 失败" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "Git prune 失败" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git remote set-head 失败:\"%s\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Git reset 失败" @@ -1118,16 +1049,12 @@ msgstr "无效的 VercodeOperation:{field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "无效的 VercodeOperation:{invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, python-brace-format msgid "Invalid application ID {appid}" msgstr "无效的应用 ID {appid}" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "无效的布尔值'%s'" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "无效的项目符号列表" @@ -1338,7 +1265,6 @@ msgstr "在 {path} 中找不到签名证书" msgid "No such package: %s" msgstr "没有这样的包:%s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1373,7 +1299,6 @@ msgstr "对 {appid} 无任何可操作。" msgid "Now set these in config.yml:" msgstr "现在在 config.yml 中设置这些:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1403,19 +1328,17 @@ msgstr "其中一个 'github_releases'配置项缺失'projectUrl'值。跳过... msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "其中一个 'github_releases'配置项缺失'token'值。跳过..." +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "图形仅支持 PNG 和 JPEG,发现:{path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "只接受单一密钥 “env\"" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "仅输出与 Play Store 的差异" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "仅处理使用自动更新的应用" @@ -1424,10 +1347,6 @@ msgstr "仅处理使用自动更新的应用" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "OpenCollective 捐赠方法属于 OpenCollective: 字段" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "选项" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "将 JSON 报告输出到以 APK 命名的文件。" @@ -1593,14 +1512,6 @@ msgstr "删除 {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "重命名文件名不符合 package.name_123.apk 的 APK 文件" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "RepoTrunk 更新模式仅对 git-svn 存储库有意义" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "即使已有服务器看起来运行正常,请重置并创建一个全新的编译服务器。" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1907,11 +1818,6 @@ msgstr "意外的许可证标签“{}”!仅使用来自 https://spdx.org/lice msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "意外的许可证标签“{}”!仅使用配置文件中配置的许可证标记" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "意外的符号链接目标:{link} -> {target}" - #: ../fdroidserver/common.py #, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1921,7 +1827,6 @@ msgstr "{configname} 中的未知条目 {key}" msgid "Unknown exception found!" msgstr "发生未知异常!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1959,6 +1864,7 @@ msgstr "'{path}' 中存在无法识别的应用栏目 '{fieldname}'" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "'{path}' 中有无法识别的构建 flag '{build_flag}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1989,11 +1895,6 @@ msgstr "未使用的扫描删除路径: %s" msgid "Unused scanignore path: %s" msgstr "未使用的扫描忽略路径: %s" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "解压缩到 %s" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "更新新包的存储库信息" @@ -2007,6 +1908,7 @@ msgstr "更新 URL 的二进制透明度日志" msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData 具有无效的 URL:{url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -2026,11 +1928,7 @@ msgstr "UpdateCheckData 不是有效的网址:{url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "UpdateCheckMode 已设置,但看起来尚未运行检查更新。" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "UpdateCheckMode 已设置,但看起来尚未运行检查更新" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py msgid "UpdateCheckName is set to the known application ID, it can be removed" msgstr "UpdateCheckName 已设置为已知的应用 ID,可以将其删除" @@ -2045,27 +1943,10 @@ msgstr "上传 {apkfilename} 到 androidobservatory.org" msgid "Uploading {apkfilename} to virustotal" msgstr "上传 {apkfilename} 到 virustotal" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "使用" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "用法:%s\n" - #: ../fdroidserver/lint.py msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "使用 /HEAD 而不是 /master 或 /main 来指向默认分支中的文件" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "使用 /HEAD 而不是 /master 指向默认分支中的文件" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "使用 `fdroid update -c` 命令以创建它。" @@ -2104,11 +1985,6 @@ msgstr "使用 JAR 签名" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "不建议使用 Java 的 jar 签名器来验证 APK!使用 apk 签名器" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "使用 {path} 中的 androguard" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2210,20 +2086,11 @@ msgstr "将 IdentityFile 添加到 {path}" msgid "adding to {name}: {path}" msgstr "添加到 {name}: {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "模糊的选项:%(option)s 可以相配 %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "模糊的选项:%s(%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2237,11 +2104,13 @@ msgstr "找不到 APK 签名器!无法对新式 APK 进行签名或验证" msgid "apksigner not found, it's required for signing!" msgstr "找不到 APK 签名器,这是签名所必需的!" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py msgid "application ID of file to operate on" msgstr "要操作的文件的应用ID" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2252,8 +2121,6 @@ msgstr "带APPID[:VERCODE]格式可选的versionCode的应用 ID" msgid "archive_url needs to end with /archive" msgstr "archive_url 需要以 /archive 结尾" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2272,7 +2139,7 @@ msgstr "尝试使用裸 SSH 连接测试部署密钥:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "无法解析 scrlib 规范(不是字符串):“{}”" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "无法打开 '%(filename)s':%(error)s" @@ -2286,14 +2153,10 @@ msgstr "无法打开非 HTTPS URL: '{};" msgid "cannot find required srclibs: \"{path}\"" msgstr "找不到所需的源库:“{path}”" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "不能有多个子解析器参数" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2312,14 +2175,6 @@ msgstr "正在克隆 {url}" msgid "commands from plugin modules:" msgstr "来自插件模块的命令:" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "复杂" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2349,10 +2204,6 @@ msgstr "无法解析 srclib 规范 (未指定名称): '{}'" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "无法解析 srclib 规范 (未指定 ref): '{}'" -#: ../fdroidserver/common.py -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "无法解析 srclib 规范 (('@'符号太多): '{}'" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2377,8 +2228,6 @@ msgstr "没有锁的依赖文件" msgid "deployed process log {path} to {dest}" msgstr "已部署进程日志 {path} 到 {dest}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2396,28 +2245,20 @@ msgstr "从 '{}' 下载扫描仪特征失败了" msgid "executable binary, possibly code" msgstr "可执行二进制文件,可能是代码" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "预期的 %s 个参数" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "预期至少有一个参数" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "预期最多有一个参数" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "预期的一个参数" @@ -2430,10 +2271,6 @@ msgstr "用法:fdroid [-h|--help|--version] []" msgid "fetch the latest version of signatures from the web" msgstr "从网络获取最新版本的签名" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "浮点" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "将元数据错误(默认)强制设为警告,或忽略。" @@ -2446,8 +2283,6 @@ msgstr "git svn 克隆失败" msgid "gzip file archive" msgstr "gzip 压缩包" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2461,35 +2296,21 @@ msgstr "index-v1 必须有签名,使用 `fdroid signindex` 命令创建它!" msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v2 必须有签名,使用 `fdroid signindex` 命令创建它!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "整数" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "无效 %(type)s 值: %(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "无效选项:%(value)r (选取自 %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "冲突解决值无效: %r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2527,8 +2348,6 @@ msgstr "镜像 '%s' 不以 'fdroid'结尾!" msgid "mirrors set twice, in config.yml and {path}!" msgstr "设置了两次镜像,分别在 config.xml 和 {path} 中!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "相互排斥的参数必须是可选的" @@ -2547,30 +2366,15 @@ msgstr "{appid} 中没有 \"图标\"" msgid "no APK supplied" msgstr "未提供 APK" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "没有此选项:%s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "没有找到版本信息!" - #: ../fdroidserver/checkupdates.py msgid "no version information found" msgstr "没有找到版本信息" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "不允许使用参数 %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2580,72 +2384,6 @@ msgstr "其中一个参数 %s 是必需的" msgid "only accepts strings, lists, and tuples" msgstr "只接受字符串、列表和元组" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "选项 %s: 如果您真的想安装所有已签名的应用,请使用 --all" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "选项 %s:无效 %s 值:%r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "选项 %s:无效选择:%r(从 %s 中选择)" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "未知的选项 -%s" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "选项 -%s 需要参数" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "选项 --%s 不能有参数" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "选项 --%s 不是一个唯一前缀" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "无法识别选项 -%s" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "选项 --%s 需要参数" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "可选参数" - #: /usr/lib/python3.11/argparse.py msgid "options" msgstr "选项" @@ -2655,8 +2393,6 @@ msgstr "选项" msgid "overwriting existing {path}" msgstr "正在覆盖现有{path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "位置参数" @@ -2689,10 +2425,6 @@ msgstr "repo_url 需以 /repo 结尾" msgid "rsync is missing or broken: {error}" msgstr "rsync 丢失或损坏: {error}" -#: ../fdroidserver/metadata.py -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "ruamel.yaml 未安装,无法写入元数据。" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2716,17 +2448,7 @@ msgstr "serverwebroot:路径没有以 \"fdroid\"结尾,可能你想表达的 msgid "shared library" msgstr "共享库" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "显示程序的版本号并退出" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "显示本帮助信息并退出" @@ -2760,8 +2482,6 @@ msgstr "静态库" msgid "supplied reference binary has allowed signer {signer}" msgstr "所提供的参考二进制已允许签名者 {signer}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2771,22 +2491,16 @@ msgstr "需要此下参数:%s" msgid "true" msgstr "true" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "未预期的选项字符串:%s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "未知解析器 %(parser_name)r (选择: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2797,9 +2511,7 @@ msgstr "未识别的参数:%s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "{config_file} 的文件权限不安全 ( 应该设为0600 ) !" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "用法: " @@ -2827,21 +2539,19 @@ msgstr[0] "{0} 应用, {1} 主要别名" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid})没有元数据!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} 有多个{name} 文件,看起来可能是主键泄露了!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "{apkfilename}的 AndroidManifest.xml 有一个无效的日期: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "{appid} 没有名字! 使用 application ID 代替." +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2862,7 +2572,6 @@ msgstr "{appid}有两个apk文件:{files}" msgid "{appid} is missing {name}" msgstr "{appid}缺失了{name}" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2903,11 +2612,6 @@ msgstr "{file} 是空的或已损坏!" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name}的“{section}/icons/{path}”不存在!请检查配置文件“config.yml”。" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "{oldfile} 已弃用,请使用 {newfile}" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 2a51248e..9e1ea987 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-20 15:05+0100\n" +"POT-Creation-Date: 2025-03-23 21:45+0100\n" "PO-Revision-Date: 2024-11-26 15:16+0000\n" "Last-Translator: Peter Dave Hello \n" "Language-Team: Chinese (Traditional Han script) \n" @@ -58,11 +58,6 @@ msgstr "「local_copy_dir」{path} 不存在!" msgid "\"{apkfilename}\" is already installed on {dev}." msgstr "\"{apkfilename}\" 已經安裝在 {dev} 上了。" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "\"{path}\" contains outdated {name} ({version})" -msgstr "\"{path}\" 包含過時的 {name} ({version})" - #: ../fdroidserver/update.py #, python-brace-format msgid "\"{path}\" contains recent {name} ({version})" @@ -88,16 +83,6 @@ msgstr "「{path}」由不允許的金鑰簽署:" msgid "\"{url}\" is not a valid URL!" msgstr "\"{url}\" 不是一個有效的網址!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%(option)s option requires %(number)d argument" -msgid_plural "%(option)s option requires %(number)d arguments" -msgstr[0] "%(option)s 的選項需要 %(number)d 參數" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%(prog)s: error: %(message)s\n" @@ -113,14 +98,6 @@ msgstr "%d 個 APK 無法簽署或驗證!" msgid "%d problems found" msgstr "發現 %d 個問題" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "%prog [options]" -msgstr "%prog [選項]" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "%r is not callable" @@ -141,13 +118,6 @@ msgstr "%s 的 SHA-256 值不正確:%s" msgid "%s is not an accepted build field" msgstr "%s 為不可編譯欄位" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "%s option does not take a value" -msgstr "%s 選項不帶值" - #: ../fdroidserver/common.py msgid "'keypass' not found in config.yml!" msgstr "config.yml 找不到 'keypass'!" @@ -168,8 +138,6 @@ msgstr "config.yml 找不到 'keystorepass'!" msgid "'repo_keyalias' not found in config.yml!" msgstr "config.yml 找不到 'repo_keyalias'!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "'required' is an invalid argument for positionals" msgstr "這些地方的 '必填' 為無效引數" @@ -183,11 +151,6 @@ msgstr "未在 config.yml 中設定「sdk_path」!" msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" msgstr "'{aapt}' 太過老舊,fdroid 需要 build-tools-{version} 或以上版本!" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "'{field}' will be in random order! Use () or [] brackets if order is important!" -msgstr "'{field}' 將會隨機排列!如果次序重很重要,請使用 () 或 []符號!" - #: ../fdroidserver/common.py #, python-brace-format msgid "'{path}' failed to execute!" @@ -198,7 +161,7 @@ msgstr "'{path}' 無法執行!" msgid "'{path}' has invalid format, it should be a dictionary!" msgstr "「{path}」的格式無效,它應該是一個字典!" -#: ../fdroidserver/metadata.py ../fdroidserver/lint.py +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py #, python-brace-format msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" msgstr "{appid} 的 {value}' 為無效 {field}。正規表遠格式:{pattern}" @@ -217,8 +180,6 @@ msgstr "" msgid "...checkupdate failed for {appid} : {error}" msgstr "{appid} 檢查更新失敗:{error}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid ".__call__() not defined" msgstr ".__call__() 未定義" @@ -309,10 +270,6 @@ msgstr "找不到 Android SDK 工具 {cmd}!" msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." msgstr "應用程式具有二進位文件,但是沒有相應的 AllowedAPKSigningKeys 來固定憑證。" -#: ../fdroidserver/lint.py -msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" but AutoUpdateMode or UpdateCheckMode are not None" -msgstr "應用程式有 NoSourceSince 或 ArchivePolicy「0 versions」,但是 AutoUpdateMode 或 UpdateCheckMode 不是「None」" - #: ../fdroidserver/lint.py msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" msgstr "應用程式有 NoSourceSince 或 ArchivePolicy「0 versions」或「0」,但是 AutoUpdateMode 或 UpdateCheckMode 不是「None」" @@ -356,7 +313,6 @@ msgstr "鏡像配置中的錯誤條目類型「{mirrortype}」:{mirror}" msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" msgstr "基本的 URL 到鏡像,可以包含索引簽署金鑰使用查詢字串:?fingerprint=" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Branch '{branch}' used as commit in build '{versionName}'" @@ -411,11 +367,13 @@ msgstr[0] "掃描時由於 {} 出錯,無法進行編譯" msgid "Cannot rewrite \"{path}\"" msgstr "無法重寫到 \"{path}\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-format msgid "Categories '%s' is not valid" msgstr "'%s' 類別無效" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py msgid "Categories are not set" msgstr "類別未設定" @@ -469,20 +427,17 @@ msgstr ".yml 與本地化檔案之間的「{field}」定義衝突:" msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." msgstr "衝突的參數:無法同時使用 '--verbose' 和 '--quiet' 參數。" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Conflicting config files! Using {newfile}, ignoring {oldfile}!" -msgstr "設定檔衝突!使用 {newfile},忽略 {oldfile}!" - #: ../fdroidserver/common.py #, python-brace-format msgid "Could not find '{command}' on your system" msgstr "在您的系統上找不到 '{command}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version code" msgstr "找不到最新版本程式碼" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/import_subcommand.py msgid "Could not find latest version name" msgstr "找不到最新版本名稱" @@ -502,6 +457,7 @@ msgstr "無法開啟 APK 檔{path}案作分析 : " msgid "Could not parse size \"{size}\", wrong type \"{type}\"" msgstr "無法解析大小「{size}」,錯誤類型「{type}」" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/import_subcommand.py msgid "Couldn't find Application ID" msgstr "找不到應用程式 ID" @@ -595,11 +551,6 @@ msgstr "描述 '%s' 僅為此應用的摘要" msgid "Description has a duplicate line" msgstr "描述中出現重覆行" -#: ../fdroidserver/lint.py -#, python-format -msgid "Description has a list (%s) but it isn't bulleted (*) nor numbered (#)" -msgstr "描述中有一個列表 (%s) 但它並未被編排 (*) 或作編號 (#)" - #: ../fdroidserver/lint.py #, python-brace-format msgid "Description of length {length} is over the {limit} char limit" @@ -656,11 +607,6 @@ msgstr "" msgid "Download complete mirrors of small repos" msgstr "下載小型軟體庫完整的鏡像" -#: ../fdroidserver/common.py -#, python-format -msgid "Downloading %s" -msgstr "正在下載 %s" - #: ../fdroidserver/common.py msgid "Downloading the repository already failed once, not trying again." msgstr "下載軟體庫已失敗過一次,尚未重試。" @@ -694,14 +640,6 @@ msgstr "錯誤:%(message)s" msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" msgstr "錯誤:「server」子指令已經刪除,請使用「deploy」!" -#: ../fdroidserver/mirror.py -msgid "" -"ERROR: this command should never be used to mirror f-droid.org!\n" -"A full mirror of f-droid.org requires more than 200GB." -msgstr "" -"錯誤:此命令絕不該用於鏡像 f-droid.org!\n" -"完整的 f-droid.org 鏡像需要超過 200GB。" - #: ../fdroidserver/nightly.py msgid "ERROR: unsupported CI type, patches welcome!" msgstr "出錯:未支援 CI 類型,歡迎補強!" @@ -848,10 +786,6 @@ msgstr "檔案在處理時消失:{path}" msgid "Finished" msgstr "已完成" -#: ../fdroidserver/lint.py -msgid "Flattr donation methods belong in the FlattrID: field" -msgstr "Flattr 捐贈方法屬於 FlattrID: field" - #: ../fdroidserver/lint.py msgid "Forbidden HTML tags" msgstr "禁用 HTML 標籤" @@ -883,7 +817,6 @@ msgstr "找到了 \"{name}\" 的錯誤的籌款檔案 \"{path}\":" msgid "Found invalid appids in arguments" msgstr "引數中找到無效的 appids" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Found invalid versionCodes for some apps" msgstr "有些應用的版本代號無效" @@ -948,15 +881,13 @@ msgstr "Git 清理失敗" msgid "Git fetch failed" msgstr "Git 抓取失敗" -#: ../fdroidserver/common.py -msgid "Git prune failed" -msgstr "Git 修剪失敗" - +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-format msgid "Git remote set-head failed: \"%s\"" msgstr "Git 遠端 set-head 失敗: \"%s\"" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Git reset failed" msgstr "Git 重置失敗" @@ -1095,16 +1026,12 @@ msgstr "無效的 VercodeOperation:{field}" msgid "Invalid VercodeOperation: {invalid_ops}" msgstr "無效的 VercodeOperation:{invalid_ops}" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Invalid application ID {appid}" msgstr "無效的 application ID {appid}" -#: ../fdroidserver/metadata.py -#, python-format -msgid "Invalid boolean '%s'" -msgstr "無效的布林 '%s'" - #: ../fdroidserver/lint.py msgid "Invalid bulleted list" msgstr "無效的排序列表" @@ -1322,7 +1249,6 @@ msgstr "{path} 找不到簽署證書" msgid "No such package: %s" msgstr "無此套件包:%s" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py #, python-brace-format msgid "No such versionCode {versionCode} for app {appid}" @@ -1360,7 +1286,6 @@ msgstr "{appid} 無須採取行動." msgid "Now set these in config.yml:" msgstr "現在設定這些在 config.yml 中:" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "OBB file has newer versionCode({integer}) than any APK:" @@ -1391,19 +1316,17 @@ msgstr "其中一個「github_releases」設定項目缺少「projectUrl」值 msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." msgstr "其中一個「github_releases」設定項目缺少「token」值。略過..." +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Only PNG and JPEG are supported for graphics, found: {path}" msgstr "圖像僅支援 PNG 和 JPEG,可在下方找到:{path}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" msgstr "" -#: ../fdroidserver/checkupdates.py -msgid "Only print differences with the Play Store" -msgstr "僅印出與 Play Store 的不同處" - #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" msgstr "只處理具有自動更新的應用程式" @@ -1413,10 +1336,6 @@ msgstr "只處理具有自動更新的應用程式" msgid "OpenCollective donation methods belong in the OpenCollective: field" msgstr "OpenCollective 的捐款方式在 OpenCollective: 的標誌下面" -#: /usr/lib/python3.11/optparse.py -msgid "Options" -msgstr "選項" - #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." msgstr "將 json 報告輸出到以 APK 命名的檔案。" @@ -1585,14 +1504,6 @@ msgstr "正在移除 {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "為不符合 package.name_123.apk 格式的 APK 檔案更名" -#: ../fdroidserver/checkupdates.py -msgid "RepoTrunk update mode only makes sense in git-svn repositories" -msgstr "RepoTrunk 更新模式僅適用於 git-svn 儲存庫" - -#: ../fdroidserver/build.py -msgid "Reset and create a brand new build server, even if the existing one appears to be ok." -msgstr "即使現有的伺服器明顯是好的,仍重置並建立一個新的構建伺服器。" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1911,11 +1822,6 @@ msgstr "這個許可證標籤不符合預期 \"{}\"! 只能使用 https://spdx msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" msgstr "這個許可證標籤不符合預期 \"{}\"! 只能使用你的配置文檔裡面配置好的許可證標籤啦" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Unexpected symlink target: {link} -> {target}" -msgstr "未預期的符號連結目標:{link} -> {target}" - #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Unknown entry {key} in {configname}" @@ -1925,7 +1831,6 @@ msgstr "配置文檔 {configname} 裡面登記的密鑰 {key} 是未知的" msgid "Unknown exception found!" msgstr "發現未知的異常!" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "Unknown file '{filename}' in build '{versionName}'" @@ -1963,6 +1868,7 @@ msgstr "在 '{path}' 中無法辨識的 app 欄位 '{fieldname}'" msgid "Unrecognised build flag '{build_flag}' in '{path}'" msgstr "在 '{path}' 中無法辨識的構建旗標 '{build_flag}'" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py #, python-brace-format msgid "Unsupported file type \"{extension}\" for repo graphic" @@ -1993,11 +1899,6 @@ msgstr "路徑: %s 被標記為掃描並刪除,但並未執行" msgid "Unused scanignore path: %s" msgstr "檔案路徑: %s 被標記為不掃描,但並未出現" -#: ../fdroidserver/common.py -#, python-format -msgid "Unzipping to %s" -msgstr "正在解壓縮到 %s" - #: ../fdroidserver/__main__.py msgid "Update repo information for new packages" msgstr "為新的套件包更新軟體庫資訊" @@ -2011,6 +1912,7 @@ msgstr "為網址更新二進制的透明日誌" msgid "UpdateCheckData has invalid URL: {url}" msgstr "UpdateCheckData 有無效的 URL:{url}" +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/lint.py #, python-brace-format msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" @@ -2030,11 +1932,7 @@ msgstr "UpdateCheckData 不是有效的 URL:{url}" msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." msgstr "已設定 UpdateCheckMode,但似乎尚未執行 checkupdates。" -#. Translators: https://developer.android.com/studio/build/application-id -#: ../fdroidserver/lint.py -msgid "UpdateCheckMode is set but it looks likecheckupdates hasn't been run yet" -msgstr "已設定 UpdateCheckMode,但似乎尚未執行 checkupdates" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/lint.py #, fuzzy msgid "UpdateCheckName is set to the known application ID, it can be removed" @@ -2050,28 +1948,11 @@ msgstr "正在將軟體檔案 {apkfilename} 上傳到 androidobservatory.org" msgid "Uploading {apkfilename} to virustotal" msgstr "正在將軟體檔案 {apkfilename} 上傳到 virustotal" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "Usage" -msgstr "使用方法" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "Usage: %s\n" -msgstr "使用方法:%s\n" - #: ../fdroidserver/lint.py #, fuzzy msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" msgstr "使用 /HEAD 取代 /master 來指向默認分支的一個檔案" -#: ../fdroidserver/lint.py -msgid "Use /HEAD instead of /master to point at a file in the default branch" -msgstr "使用 /HEAD 取代 /master 來指向默認分支的一個檔案" - #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." msgstr "利用`fdroid update -c` 指令來建立。" @@ -2113,11 +1994,6 @@ msgstr "使用 APK Signature v2" msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" msgstr "使用 Java 的 jarsigner,這並不建議用於驗證 APK!使用 apksigner" -#: ../fdroidserver/common.py -#, python-brace-format -msgid "Using androguard from \"{path}\"" -msgstr "使用從「{path}」而來的 androguard" - #: ../fdroidserver/metadata.py #, python-brace-format msgid "Using blank dictionary instead of contents of {path}!" @@ -2221,20 +2097,11 @@ msgstr "添增 IdentityFile 到 {path}" msgid "adding to {name}: {path}" msgstr "添加到 {name}:{path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "模糊選項:%(option)s 可以相配 %(matches)s" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "ambiguous option: %s (%s?)" -msgstr "不明確的選項:%s (%s?)" - #: ../fdroidserver/common.py #, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." @@ -2250,12 +2117,14 @@ msgstr "apksigner 不見了 , 我們需要用它來生成數字簽名 !" msgid "apksigner not found, it's required for signing!" msgstr "apksigner 不見了 , 我們需要用它來生成數字簽名 !" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py #: ../fdroidserver/rewritemeta.py #, fuzzy msgid "application ID of file to operate on" msgstr "從檔案的 application ID 著手" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/build.py ../fdroidserver/install.py #: ../fdroidserver/publish.py ../fdroidserver/scanner.py #: ../fdroidserver/verify.py @@ -2267,8 +2136,6 @@ msgstr "application ID 具有任選的 versionCode 在此的格式為 APPID [:VE msgid "archive_url needs to end with /archive" msgstr "archive_url 必須以 /archive 結尾" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "argument \"-\" with mode %r" @@ -2289,7 +2156,7 @@ msgstr "試圖用裸的 ssh 連線來測試佈署金鑰:" msgid "can not parse scrlib spec (not a string): '{}'" msgstr "無法解析 scrlib spec (不是字符): '{}'" -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: /usr/lib/python3.11/argparse.py #, python-format msgid "can't open '%(filename)s': %(error)s" msgstr "無法打開 '%(filename)s':%(error)s" @@ -2303,14 +2170,10 @@ msgstr "無法開啟非 HTTPS 網址:'{};" msgid "cannot find required srclibs: \"{path}\"" msgstr "找不到必須的 scrlibs: \"{path}\"" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "cannot have multiple subparser arguments" msgstr "無法有多個子解析器引數" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" @@ -2330,14 +2193,6 @@ msgstr "複製 {url}" msgid "commands from plugin modules:" msgstr "來自插換式模塊的命令:" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "complex" -msgstr "複雜" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "conflicting option string: %s" @@ -2369,11 +2224,6 @@ msgstr "無法解析 scrlib spec (沒有指定參考文獻): '{}'" msgid "could not parse srclib spec (no ref specified): '{}'" msgstr "無法解析 scrlib spec (沒有指定參考文獻): '{}'" -#: ../fdroidserver/common.py -#, fuzzy -msgid "could not parse srclib spec (too many '@' signs): '{}'" -msgstr "無法解析 scrlib spec (符號 '@' 出現太多次了): '{}'" - #: ../fdroidserver/nightly.py #, python-brace-format msgid "created {path}" @@ -2398,8 +2248,6 @@ msgstr "依存檔案未上鎖" msgid "deployed process log {path} to {dest}" msgstr "將進程日誌 {path} 部署到 {dest}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "dest= is required for options like %r" @@ -2419,28 +2267,20 @@ msgstr "正從軟體 {apkfilename} 除去未知的簽名" msgid "executable binary, possibly code" msgstr "可執行二進制檔案, 估計是代碼" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "expected %s argument" msgid_plural "expected %s arguments" msgstr[0] "預期的 %s 引數" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at least one argument" msgstr "預期至少有一個引數" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected at most one argument" msgstr "最多一個引數" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "expected one argument" msgstr "預期有一個引數" @@ -2453,10 +2293,6 @@ msgstr "用法:fdroid [-h|--help|--version] <命令> []" msgid "fetch the latest version of signatures from the web" msgstr "從網路擷取最新版本的簽章" -#: /usr/lib/python3.11/optparse.py -msgid "floating-point" -msgstr "浮點" - #: ../fdroidserver/metadata.py msgid "force metadata errors (default) to be warnings, or to be ignored." msgstr "強制中介資料錯誤(預設值)作警告或忽略。" @@ -2470,8 +2306,6 @@ msgstr "Git svn 複製失敗" msgid "gzip file archive" msgstr "gzip 壓縮檔案" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "ignored explicit argument %r" @@ -2486,35 +2320,21 @@ msgstr "index-v1 必須要有簽名, 使用 `fdroid signindex`來建立一組簽 msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" msgstr "index-v1 必須要有簽名, 使用 `fdroid signindex`來建立一組簽名!" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "integer" -msgstr "整數" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid %(type)s value: %(value)r" msgstr "無效 %(type)s 值:%(value)r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid choice: %(value)r (choose from %(choices)s)" msgstr "無效選項:%(value)r (選取自 %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid conflict_resolution value: %r" msgstr "無效 conflict_resolution 值:%r" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" @@ -2552,8 +2372,6 @@ msgstr "鏡像 '%s' 並不是以 'fdroid' 作結尾!" msgid "mirrors set twice, in config.yml and {path}!" msgstr "設定了兩次鏡像,分別在 config.xml 和 {path} 中!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" msgstr "相互獨佔的引數必須為可選的" @@ -2572,31 +2390,16 @@ msgstr "在 {appid} 中沒有 \"icon\"" msgid "no APK supplied" msgstr "無 APK 被供應" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "no such option: %s" -msgstr "沒這樣的選項:%s" - -#: ../fdroidserver/__main__.py -msgid "no version info found!" -msgstr "未發現版本資訊!" - #: ../fdroidserver/checkupdates.py #, fuzzy msgid "no version information found" msgstr "未發現版本資訊" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "not allowed with argument %s" msgstr "不許可帶引數 %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "one of the arguments %s is required" @@ -2606,72 +2409,6 @@ msgstr "引數 %s 必須要有一個" msgid "only accepts strings, lists, and tuples" msgstr "只接受字串,列表和元組" -#: ../fdroidserver/install.py -#, python-format -msgid "option %s: If you really want to install all the signed apps, use --all" -msgstr "選項 %s: 如果真要安裝全部的簽署應用, 請使用 --all" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid %s value: %r" -msgstr "選項 %s: 無效的 %s 值: %r" - -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -#, python-format -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "選項 %s: 無效選項: %r (選自 %s )" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s not recognized" -msgstr "不能識別選項 -%s" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option -%s requires argument" -msgstr "選項 -%s 需要參數" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s must not have an argument" -msgstr "選項 --%s 不能有參數" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not a unique prefix" -msgstr "選項 --%s 不是單獨的字首" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s not recognized" -msgstr "不能識別選項 --%s" - -#: /usr/lib/python3.5/getopt.py /usr/lib/python3.6/getopt.py -#: /usr/lib/python3.7/getopt.py /usr/lib/python3.9/getopt.py -#: /usr/lib/python3.11/getopt.py -#, python-format -msgid "option --%s requires argument" -msgstr "選項 --%s 需要參數" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py -msgid "optional arguments" -msgstr "可選參數" - #: /usr/lib/python3.11/argparse.py #, fuzzy msgid "options" @@ -2682,8 +2419,6 @@ msgstr "選項" msgid "overwriting existing {path}" msgstr "覆寫現有的 {path}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py msgid "positional arguments" msgstr "位置參數" @@ -2716,11 +2451,6 @@ msgstr "repo_url 必須以 /repo 結尾" msgid "rsync is missing or broken: {error}" msgstr "rsync 遺失或損壞:{error}" -#: ../fdroidserver/metadata.py -#, fuzzy -msgid "ruamel.yaml not installed, can not write metadata." -msgstr "因為沒有設置 ruamel.yaml, 無法寫入 metadata 。" - #: ../fdroidserver/deploy.py #, python-brace-format msgid "s3cmd sync indexes {path} to {url} and delete" @@ -2745,17 +2475,7 @@ msgstr "serverwebroot: 路徑沒有以「fdroid」結尾,也許你想表達的 msgid "shared library" msgstr "共享庫 (shared library)" -#: /usr/lib/python3.5/optparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/optparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/optparse.py -msgid "show program's version number and exit" -msgstr "顯示程式的版本號碼並離開" - -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.5/optparse.py -#: /usr/lib/python3.6/argparse.py /usr/lib/python3.6/optparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.7/optparse.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.9/optparse.py -#: /usr/lib/python3.11/argparse.py /usr/lib/python3.11/optparse.py +#: /usr/lib/python3.11/argparse.py msgid "show this help message and exit" msgstr "顯示此說明訊息並離開" @@ -2790,8 +2510,6 @@ msgstr "靜態庫 (static library)" msgid "supplied reference binary has allowed signer {signer}" msgstr "提供的參考二進位檔具有允許的簽署者 {signer}" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "the following arguments are required: %s" @@ -2801,22 +2519,16 @@ msgstr "需要下列參數:%s" msgid "true" msgstr "" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unexpected option string: %s" msgstr "非預期選項字串: %s" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unknown parser %(parser_name)r (choices: %(choices)s)" msgstr "不明解析器 %(parser_name)r (選項: %(choices)s)" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py -#: /usr/lib/python3.7/argparse.py /usr/lib/python3.9/argparse.py #: /usr/lib/python3.11/argparse.py #, python-format msgid "unrecognized arguments: %s" @@ -2827,9 +2539,7 @@ msgstr "無法辨識的引數:%s" msgid "unsafe permissions on '{config_file}' (should be 0600)!" msgstr "'{config_file}' 檔案不安全的權限(應為 0600)!" -#: /usr/lib/python3.5/argparse.py /usr/lib/python3.6/argparse.py ../fdroid -#: /usr/lib/python3.7/argparse.py ../fdroidserver/__main__.py -#: /usr/lib/python3.9/argparse.py /usr/lib/python3.11/argparse.py +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py msgid "usage: " msgstr "使用方法: " @@ -2858,21 +2568,19 @@ msgstr[0] "{0} 應用, {1} 主要別名" msgid "{apkfilename} ({appid}) has no metadata!" msgstr "{apkfilename} ({appid}) 沒有中介資料!" -#: ../fdroidserver/update.py -#, python-brace-format -msgid "{apkfilename} has multiple {name} files, looks like Master Key exploit!" -msgstr "{apkfilename} 有多個 {name} 檔案,看起來可能是主金鑰洩漏了!" - +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, python-brace-format msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " msgstr "{apkfilename} AndroidManifest.xml 有一個無效的日期: " +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{appid} does not have a name! Using application ID instead." msgstr "軟體 {appid} 沒有名字! 使用 application ID 代替。" +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id #: ../fdroidserver/update.py #, fuzzy, python-brace-format msgid "{appid} from {path} is not a valid Android application ID!" @@ -2893,7 +2601,6 @@ msgstr "{appid} 同時具有 APK 和檔案:{files}" msgid "{appid} is missing {name}" msgstr "{appid} 缺少 {name}" -#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname #: ../fdroidserver/lint.py #, python-brace-format msgid "{appid}: Unknown extlib {path} in build '{versionName}'" @@ -2934,11 +2641,6 @@ msgstr "檔案 {file} 是空的或損壞的 !" msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." msgstr "{name} \"{section}/icons/{path}\" 不存在! 請檢查 \"config.yml\"." -#: ../fdroidserver/common.py -#, fuzzy, python-brace-format -msgid "{oldfile} is deprecated, use {newfile}" -msgstr "檔案 {oldfile} 已經過時了, 請使用檔案 {newfile}" - #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" From 58609aa9f040b1975aa602f3a545194496ecb98f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 21 Mar 2025 10:32:08 +0100 Subject: [PATCH 1979/2116] fix _dexdump_found() in test_scanner.py !1621 find_sdk_tools_cmd() will throw an exception if it can't find the tool, not return None. --- tests/test_scanner.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/test_scanner.py b/tests/test_scanner.py index 294ff8b7..1dbe15b0 100755 --- a/tests/test_scanner.py +++ b/tests/test_scanner.py @@ -23,6 +23,7 @@ import yaml import fdroidserver.build import fdroidserver.common +import fdroidserver.exception import fdroidserver.metadata import fdroidserver.scanner from .shared_test_code import TmpCwd, mkdtemp, mock_open_to_str @@ -36,9 +37,13 @@ def _dexdump_found(): This must be run after common.config is setup. """ - dexdump = fdroidserver.common.find_sdk_tools_cmd("dexdump") - logging.debug('Found dexdump: %s', dexdump) - return dexdump is not None + try: + dexdump = fdroidserver.common.find_sdk_tools_cmd("dexdump") + logging.debug('Found dexdump: %s', dexdump) + return dexdump is not None + except fdroidserver.exception.FDroidException: + pass + return False # Always use built-in default rules so changes in downloaded rules don't break tests. From acbab69722f9c33982cb11090ec538e0b3693abd Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 14 Mar 2025 11:30:07 +0100 Subject: [PATCH 1980/2116] update: add execution stages to status JSON This should help us profile what takes so long in `fdroid update`. It also gives feedback so that people can see how close to done it is, or where it failed. This is based on how incremental status JSON works for `fdroid build`. --- fdroidserver/common.py | 15 ++++++++++++++- fdroidserver/update.py | 21 ++++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index aa606d43..96b75944 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1216,6 +1216,19 @@ class Encoder(json.JSONEncoder): return super().default(obj) +def epoch_millis_now(): + """Get the current time in epoch milliseconds. + + This is the format returned by Java's System.currentTimeMillis(). + + Parameters + ---------- + millis + Java-style integer time since UNIX epoch in milliseconds + """ + return int(datetime.now(timezone.utc).timestamp() * 1000) + + def setup_status_output(start_timestamp): """Create the common output dictionary for public status updates.""" output = { @@ -1258,7 +1271,7 @@ def write_status_json(output, pretty=False, name=None): if not os.path.exists(status_dir): os.makedirs(status_dir) if not name: - output['endTimestamp'] = int(datetime.now(timezone.utc).timestamp() * 1000) + output['endTimestamp'] = epoch_millis_now() names = ['running', sys.argv[0].split()[1]] # fdroid subcommand else: names = [name] diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 530886f8..4e5aad9e 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -202,6 +202,13 @@ def status_update_json(apps, apks): common.write_status_json(output, options.pretty) +def output_status_stage(output, stage): + if 'stages' not in output: + output['stages'] = dict() + output['stages'][stage] = common.epoch_millis_now() + common.write_running_status_json(output) + + def delete_disabled_builds(apps, apkcache, repodirs): """Delete disabled build outputs. @@ -2588,7 +2595,7 @@ def main(): metadata.warnings_action = options.W config = common.read_config() - common.setup_status_output(start_timestamp) + status_output = common.setup_status_output(start_timestamp) if not (('jarsigner' in config or 'apksigner' in config) and 'keytool' in config): @@ -2651,12 +2658,15 @@ def main(): cache_timestamp = get_cache_mtime() # Delete builds for disabled apps + output_status_stage(status_output, 'delete_disabled_builds') delete_disabled_builds(apps, apkcache, repodirs) # Scan all apks in the main repo + output_status_stage(status_output, 'process_apks') apks, cachechanged = process_apks(apkcache, repodirs[0], knownapks, options.use_date_from_apk, apps, cache_timestamp) + output_status_stage(status_output, 'scan_repo_files') files, fcachechanged = scan_repo_files(apkcache, repodirs[0], knownapks, options.use_date_from_apk) cachechanged = cachechanged or fcachechanged @@ -2666,6 +2676,7 @@ def main(): cachechanged = cachechanged or icachechanged apks += ipas + output_status_stage(status_output, 'remove_apks') appid_has_apks = set() appid_has_repo_files = set() sha256_has_files = collections.defaultdict(list) @@ -2748,18 +2759,25 @@ def main(): if cachechanged: write_cache(apkcache) + output_status_stage(status_output, 'read_added_date_from_all_apks') # The added date currently comes from the oldest apk which might be in the archive. # So we need this populated at app level before continuing with only processing /repo # or /archive read_added_date_from_all_apks(apps, apks + archapks) if len(repodirs) > 1: + output_status_stage(status_output, 'archive_old_apks archive') archive_old_apks(apps, apks, archapks, repodirs[0], repodirs[1], config['archive_older']) + output_status_stage(status_output, 'prepare_apps archive') archived_apps = prepare_apps(apps, archapks, repodirs[1]) + output_status_stage(status_output, 'index.make archive') fdroidserver.index.make(archived_apps, archapks, repodirs[1], True) + output_status_stage(status_output, 'prepare_apps repo') repoapps = prepare_apps(apps, apks, repodirs[0]) + output_status_stage(status_output, 'index.make repo') + # APKs are placed into multiple repos based on the app package, providing # per-app subscription feeds for nightly builds and things like it if config['per_app_repos']: @@ -2780,6 +2798,7 @@ def main(): git_remote = config.get('binary_transparency_remote') if git_remote or os.path.isdir(os.path.join('binary_transparency', '.git')): from . import btlog + output_status_stage(status_output, 'make_binary_transparency_log') btlog.make_binary_transparency_log(repodirs) status_update_json(apps, apks + archapks) From 5150c721f4500a52bc7d27e6344e5936bffffd24 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 Mar 2025 17:03:13 +0100 Subject: [PATCH 1981/2116] verify_apk_signature: work when options is not set Then test_signatures.py can run on the PUBLISH CI job. --- .gitlab-ci.yml | 1 + fdroidserver/common.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2e48c0bb..42833779 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -739,6 +739,7 @@ PUBLISH: tests/test_gpgsign.py tests/test_metadata.py tests/test_publish.py + tests/test_signatures.py tests/test_signindex.py - cd tests diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 96b75944..f473efd7 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3894,11 +3894,11 @@ def verify_apk_signature(apk, min_sdk_version=None): args = [config['apksigner'], 'verify'] if min_sdk_version: args += ['--min-sdk-version=' + min_sdk_version] - if options.verbose: + if options and options.verbose: args += ['--verbose'] try: output = subprocess.check_output(args + [apk]) - if options.verbose: + if options and options.verbose: logging.debug(apk + ': ' + output.decode('utf-8')) return True except subprocess.CalledProcessError as e: From 68fad5c7f70f0dc3687002794801eafa0d69c66c Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 14 Mar 2025 11:33:48 +0100 Subject: [PATCH 1982/2116] gitlab-ci: delete extraneous keystore key from PUBLISH job repo_keyalias is set in tests/config.yml, so this does not need to fake the fdroiddata value. --- .gitlab-ci.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 42833779..a176097f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -760,9 +760,6 @@ PUBLISH: # silence warnings - chmod 0600 config.yml config/*.yml config/*/*.yml - chmod 0700 $gpghome - # make fake 'ciarang' index signing key - - keytool -keyclone -alias 4e7da5b7 -dest ciarang - -keypass:env keypass -new:env keypass -storepass:env keystorepass -keystore $keystore - export PATH=$CI_PROJECT_DIR:$PATH From 8f351d8406743295c61fa1d8954226b5835098b6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 19 Mar 2025 21:33:39 +0100 Subject: [PATCH 1983/2116] publish: convert to black code format --- fdroidserver/publish.py | 27 ++++++++++++----------- pyproject.toml | 2 -- tests/test_publish.py | 48 ++++++++++++++++++++++++++++------------- 3 files changed, 48 insertions(+), 29 deletions(-) diff --git a/fdroidserver/publish.py b/fdroidserver/publish.py index 1cd8538a..42eb0f6f 100644 --- a/fdroidserver/publish.py +++ b/fdroidserver/publish.py @@ -347,7 +347,6 @@ def main(): glob.glob(os.path.join(unsigned_dir, '*.apk')) + glob.glob(os.path.join(unsigned_dir, '*.zip')) ): - appid, vercode = common.publishednameinfo(apkfile) apkfilename = os.path.basename(apkfile) if vercodes and appid not in vercodes: @@ -371,7 +370,6 @@ def main(): if b.get("versionCode") == vercode: build = b if app.Binaries or (build and build.binary): - # It's an app where we build from source, and verify the apk # contents against a developer's binary, and then publish their # version if everything checks out. @@ -382,15 +380,21 @@ def main(): srcapk = srcapk.replace(unsigned_dir, binaries_dir) if not os.path.isfile(srcapk): - logging.error("...reference binary missing - publish skipped: " - "'{refpath}'".format(refpath=srcapk)) + logging.error( + "...reference binary missing - publish skipped: '{refpath}'".format( + refpath=srcapk + ) + ) failed += 1 else: # Compare our unsigned one with the downloaded one... compare_result = common.verify_apks(srcapk, apkfile, tmp_dir) if compare_result: - logging.error("...verification failed - publish skipped : " - "{result}".format(result=compare_result)) + logging.error( + "...verification failed - publish skipped : {result}".format( + result=compare_result + ) + ) failed += 1 else: # Success! So move the downloaded file to the repo, and remove @@ -402,7 +406,6 @@ def main(): logging.info('Published ' + apkfilename) elif apkfile.endswith('.zip'): - # OTA ZIPs built by fdroid do not need to be signed by jarsigner, # just to be moved into place in the repo shutil.move(apkfile, os.path.join(output_dir, apkfilename)) @@ -410,7 +413,6 @@ def main(): logging.info('Published ' + apkfilename) else: - # It's a 'normal' app, i.e. we sign and publish it... skipsigning = False @@ -449,10 +451,11 @@ def main(): signed_apk_path = os.path.join(output_dir, apkfilename) if os.path.exists(signed_apk_path): - raise BuildException("Refusing to sign '{0}' file exists in both " - "{1} and {2} folder.".format(apkfilename, - unsigned_dir, - output_dir)) + raise BuildException( + _( + "Refusing to sign '{path}' file exists in both {dir1} and {dir2} folder." + ).format(path=apkfilename, dir1=unsigned_dir, dir2=output_dir) + ) # Sign the application... common.sign_apk(apkfile, signed_apk_path, keyalias) diff --git a/pyproject.toml b/pyproject.toml index a643fa37..53c4b60d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,7 +40,6 @@ force-exclude = '''( | fdroidserver/index\.py | fdroidserver/metadata\.py | fdroidserver/nightly\.py - | fdroidserver/publish\.py | fdroidserver/update\.py | fdroidserver/vmtools\.py | locale/pick-complete-translations\.py @@ -50,7 +49,6 @@ force-exclude = '''( | tests/openssl-version-check-test\.py | tests/valid-package-names/test\.py | tests/test_common\.py - | tests/test_publish\.py | tests/test_signatures\.py | tests/test_update\.py )$''' diff --git a/tests/test_publish.py b/tests/test_publish.py index 46167be7..cb47bff5 100755 --- a/tests/test_publish.py +++ b/tests/test_publish.py @@ -131,7 +131,7 @@ class PublishTest(unittest.TestCase): publish.config['keypass'] = '123456' publish.config['keystore'] = os.path.join(basedir, 'dummy-keystore.jks') publish.config['repo_keyalias'] = 'repokey' - publish.config['repo_key_sha256'] = 'bad bad bad bad bad bad bad bad bad bad bad bad' + publish.config['repo_key_sha256'] = 'bad bad bad bad bad bad bad bad bad bad' os.chdir(self.testdir) publish.store_publish_signer_fingerprints({}, indent=2) @@ -154,10 +154,16 @@ class PublishTest(unittest.TestCase): with open(os.path.join(metadata_dir, 'com.politedroid.yml'), 'a') as fp: fp.write('\nBinaries: https://placeholder/foo%v.apk\n') os.mkdir(os.path.join(self.testdir, 'unsigned')) - shutil.copy('repo/com.politedroid_6.apk', os.path.join(self.testdir, 'unsigned')) + shutil.copy( + 'repo/com.politedroid_6.apk', os.path.join(self.testdir, 'unsigned') + ) os.mkdir(os.path.join(self.testdir, 'unsigned', 'binaries')) - shutil.copy('repo/com.politedroid_6.apk', - os.path.join(self.testdir, 'unsigned', 'binaries', 'com.politedroid_6.binary.apk')) + shutil.copy( + 'repo/com.politedroid_6.apk', + os.path.join( + self.testdir, 'unsigned', 'binaries', 'com.politedroid_6.binary.apk' + ), + ) os.chdir(self.testdir) with mock.patch.object(sys, 'argv', ['fdroid fakesubcommand']): @@ -201,7 +207,9 @@ class PublishTest(unittest.TestCase): publish.config['keystorepass'] = '123456' publish.config['keypass'] = '654321' publish.config['keystore'] = "keystore.jks" - publish.config['keydname'] = 'CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US' + publish.config[ + 'keydname' + ] = 'CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=CA, C=US' os.chdir(self.testdir) keystore = jks.KeyStore.new("jks", []) keystore.save(publish.config['keystore'], publish.config['keystorepass']) @@ -211,7 +219,9 @@ class PublishTest(unittest.TestCase): self.assertFalse(publish.create_key_if_not_existing("newalias")) self.assertTrue(publish.create_key_if_not_existing("anotheralias")) - keystore = jks.KeyStore.load(publish.config['keystore'], publish.config['keystorepass']) + keystore = jks.KeyStore.load( + publish.config['keystore'], publish.config['keystorepass'] + ) self.assertCountEqual(keystore.private_keys, ["newalias", "anotheralias"]) for alias, pk in keystore.private_keys.items(): self.assertFalse(pk.is_decrypted()) @@ -236,7 +246,9 @@ class PublishTest(unittest.TestCase): publish.status_update_json([], []) with open('repo/status/publish.json') as fp: data = json.load(fp) - self.assertEqual(shutil.which(publish.config['apksigner']), data['apksigner']) + self.assertEqual( + shutil.which(publish.config['apksigner']), data['apksigner'] + ) publish.config = {} common.fill_config_defaults(publish.config) @@ -254,13 +266,15 @@ class PublishTest(unittest.TestCase): common.options = VerboseFalseOptions config = common.read_config() if 'apksigner' not in config: - self.skipTest('SKIPPING test_sign_then_implant_signature, apksigner not installed!') + self.skipTest( + 'SKIPPING test_sign_then_implant_signature, apksigner not installed!' + ) config['repo_keyalias'] = 'sova' config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' shutil.copy(basedir / 'keystore.jks', self.testdir) config['keystore'] = 'keystore.jks' - config['keydname'] = 'CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US' + config['keydname'] = 'CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=CA, C=US' publish.config = config common.config = config @@ -286,7 +300,9 @@ class PublishTest(unittest.TestCase): # sign the unsigned APK self.assertTrue(os.path.exists(unsigned)) self.assertFalse(os.path.exists(signed)) - with mock.patch('sys.argv', ['fdroid publish', '%s:%d' % (app.id, versionCode)]): + with mock.patch( + 'sys.argv', ['fdroid publish', '%s:%d' % (app.id, versionCode)] + ): publish.main() self.assertFalse(os.path.exists(unsigned)) self.assertTrue(os.path.exists(signed)) @@ -295,7 +311,9 @@ class PublishTest(unittest.TestCase): signatures.main() self.assertTrue( os.path.exists( - os.path.join('metadata', 'org.fdroid.ci', 'signatures', '1', 'MANIFEST.MF') + os.path.join( + 'metadata', 'org.fdroid.ci', 'signatures', '1', 'MANIFEST.MF' + ) ) ) os.remove(signed) @@ -304,7 +322,9 @@ class PublishTest(unittest.TestCase): shutil.copy(testapk, unsigned) self.assertTrue(os.path.exists(unsigned)) self.assertFalse(os.path.exists(signed)) - with mock.patch('sys.argv', ['fdroid publish', '%s:%d' % (app.id, versionCode)]): + with mock.patch( + 'sys.argv', ['fdroid publish', '%s:%d' % (app.id, versionCode)] + ): publish.main() self.assertFalse(os.path.exists(unsigned)) self.assertTrue(os.path.exists(signed)) @@ -336,9 +356,7 @@ class PublishTest(unittest.TestCase): config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI=' shutil.copy(basedir / 'keystore.jks', self.testdir) config['keystore'] = 'keystore.jks' - config[ - 'keydname' - ] = 'CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US' + config['keydname'] = 'CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=CA, C=US' publish.config = config common.config = config From d024c8964f717a9818149021bea194315c451fdb Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 Mar 2025 16:55:12 +0100 Subject: [PATCH 1984/2116] convert test_signatures.py to black code format --- pyproject.toml | 1 - tests/test_signatures.py | 33 +++++++++++++++++++++++---------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 53c4b60d..34fbe3b2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,6 @@ force-exclude = '''( | tests/openssl-version-check-test\.py | tests/valid-package-names/test\.py | tests/test_common\.py - | tests/test_signatures\.py | tests/test_update\.py )$''' diff --git a/tests/test_signatures.py b/tests/test_signatures.py index 5a9393b2..94725942 100755 --- a/tests/test_signatures.py +++ b/tests/test_signatures.py @@ -22,7 +22,6 @@ class SignaturesTest(unittest.TestCase): @unittest.skipIf(sys.byteorder == 'big', "androguard is not ported to big-endian") def test_main(self): - class OptionsFixture: APK = [os.path.join(basedir, 'repo', 'com.politedroid_3.apk')] @@ -30,17 +29,31 @@ class SignaturesTest(unittest.TestCase): signatures.extract(OptionsFixture) # check if extracted signatures are where they are supposed to be - # also verify weather if extracted file contian what they should + # also verify weather if extracted file contain what they should filesAndHashes = ( - (os.path.join('metadata', 'com.politedroid', 'signatures', '3', 'MANIFEST.MF'), - '7dcd83f0c41a75457fd2311bf3c4578f80d684362d74ba8dc52838d353f31cf2'), - (os.path.join('metadata', 'com.politedroid', 'signatures', '3', 'RELEASE.RSA'), - '883ef3d5a6e0bf69d2a58d9e255a7930f08a49abc38e216ed054943c99c8fdb4'), - (os.path.join('metadata', 'com.politedroid', 'signatures', '3', 'RELEASE.SF'), - '99fbb3211ef5d7c1253f3a7ad4836eadc9905103ce6a75916c40de2831958284'), + ( + os.path.join( + 'metadata', 'com.politedroid', 'signatures', '3', 'MANIFEST.MF' + ), + '7dcd83f0c41a75457fd2311bf3c4578f80d684362d74ba8dc52838d353f31cf2', + ), + ( + os.path.join( + 'metadata', 'com.politedroid', 'signatures', '3', 'RELEASE.RSA' + ), + '883ef3d5a6e0bf69d2a58d9e255a7930f08a49abc38e216ed054943c99c8fdb4', + ), + ( + os.path.join( + 'metadata', 'com.politedroid', 'signatures', '3', 'RELEASE.SF' + ), + '99fbb3211ef5d7c1253f3a7ad4836eadc9905103ce6a75916c40de2831958284', + ), ) for path, checksum in filesAndHashes: - self.assertTrue(os.path.isfile(path), - f'check whether {path!r} was extracted correctly.') + self.assertTrue( + os.path.isfile(path), + f'check whether {path!r} was extracted correctly.', + ) with open(path, 'rb') as f: self.assertEqual(hashlib.sha256(f.read()).hexdigest(), checksum) From eef3188600b4b745293061012b8389a2f8aa2cf0 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 Mar 2025 17:05:38 +0100 Subject: [PATCH 1985/2116] test_signatures: remove unneeded config from tests --- tests/test_signatures.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_signatures.py b/tests/test_signatures.py index 94725942..603ddf2c 100755 --- a/tests/test_signatures.py +++ b/tests/test_signatures.py @@ -17,7 +17,6 @@ class SignaturesTest(unittest.TestCase): common.config = None config = common.read_config() config['jarsigner'] = common.find_sdk_tools_cmd('jarsigner') - config['verbose'] = True common.config = config @unittest.skipIf(sys.byteorder == 'big', "androguard is not ported to big-endian") From 40be283c4a8f04621e2096149a1c7ddf2d049a1a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 17 Feb 2025 16:22:55 +0100 Subject: [PATCH 1986/2116] APK for testing maxSdkVersion handling APK is org.bitbucket.tickytacky.mirrormirror_4.apk disassembled with `apktool decode`, maxSdkVersion added, then reassembled with `apktool build` --- MANIFEST.in | 2 + tests/metadata/org.maxsdkversion.yml | 2 + tests/repo/entry.json | 6 +-- tests/repo/index-v1.json | 36 ++++++++++++++++++ tests/repo/index-v2.json | 55 +++++++++++++++++++++++++++ tests/repo/index.xml | 29 ++++++++++++++ tests/repo/org.maxsdkversion_4.apk | Bin 0 -> 12768 bytes tests/test_update.py | 6 +-- 8 files changed, 130 insertions(+), 6 deletions(-) create mode 100644 tests/metadata/org.maxsdkversion.yml create mode 100644 tests/repo/org.maxsdkversion_4.apk diff --git a/MANIFEST.in b/MANIFEST.in index 0dac052c..cd5ed76a 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -637,6 +637,7 @@ include tests/metadata/obb.main.twoversions.yml include tests/metadata/org.adaway.yml include tests/metadata/org.fdroid.ci.test.app.yml include tests/metadata/org.fdroid.fdroid.yml +include tests/metadata/org.maxsdkversion.yml include tests/metadata/org.smssecure.smssecure/signatures/134/28969C09.RSA include tests/metadata/org.smssecure.smssecure/signatures/134/28969C09.SF include tests/metadata/org.smssecure.smssecure/signatures/134/MANIFEST.MF @@ -689,6 +690,7 @@ include tests/repo/obb.main.twoversions_1101613.apk include tests/repo/obb.main.twoversions_1101615.apk include tests/repo/obb.main.twoversions_1101617.apk include tests/repo/obb.main.twoversions_1101617_src.tar.gz +include tests/repo/org.maxsdkversion_4.apk include tests/repo/org.videolan.vlc/en-US/icon.png include tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot10.png include tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot12.png diff --git a/tests/metadata/org.maxsdkversion.yml b/tests/metadata/org.maxsdkversion.yml new file mode 100644 index 00000000..08eab4db --- /dev/null +++ b/tests/metadata/org.maxsdkversion.yml @@ -0,0 +1,2 @@ +Name: maxSdkVersion +Summary: Test setting maxSdkVersion in an APK diff --git a/tests/repo/entry.json b/tests/repo/entry.json index c52f31ba..1eb017bc 100644 --- a/tests/repo/entry.json +++ b/tests/repo/entry.json @@ -3,9 +3,9 @@ "version": 20002, "index": { "name": "/index-v2.json", - "sha256": "bef31251dd4bdfc34f9a9e7b93dbf3e0bc7172e17d1d72a550c10d1bc183c01c", - "size": 53527, - "numPackages": 10 + "sha256": "f0912b64db80168ee807f43ab3470bb709b6659aee05ad63057dcbcd1c97dc5e", + "size": 55186, + "numPackages": 11 }, "diffs": {} } \ No newline at end of file diff --git a/tests/repo/index-v1.json b/tests/repo/index-v1.json index ec2195b4..ed1cbcde 100644 --- a/tests/repo/index-v1.json +++ b/tests/repo/index-v1.json @@ -91,6 +91,16 @@ } } }, + { + "suggestedVersionCode": "4", + "license": "Unknown", + "name": "maxSdkVersion", + "summary": "Test setting maxSdkVersion in an APK", + "added": 1739805810000, + "icon": "org.maxsdkversion.4.png", + "packageName": "org.maxsdkversion", + "lastUpdated": 1739805810000 + }, { "categories": [ "Development" @@ -652,6 +662,32 @@ "versionName": "0.1" } ], + "org.maxsdkversion": [ + { + "added": 1739805810000, + "apkName": "org.maxsdkversion_4.apk", + "features": [ + "android.hardware.camera.front" + ], + "hash": "877d582369d2840fc0d6892e44feaaad21419b0e35af42f22b3e127bcd08274d", + "hashType": "sha256", + "maxSdkVersion": 25, + "minSdkVersion": 14, + "packageName": "org.maxsdkversion", + "sig": "1a5e67bcef6b2d6242f2d36982b54589", + "signer": "401a3a5843a3d5cebc22e6de5cb76d08eaa6797122d7fe1283df1d192e132f5e", + "size": 12768, + "targetSdkVersion": 19, + "uses-permission": [ + [ + "android.permission.CAMERA", + null + ] + ], + "versionCode": 4, + "versionName": "1.0.3" + } + ], "souch.smsbypass": [ { "added": 1524700800000, diff --git a/tests/repo/index-v2.json b/tests/repo/index-v2.json index ecb0fdc0..96c2cfea 100644 --- a/tests/repo/index-v2.json +++ b/tests/repo/index-v2.json @@ -1381,6 +1381,61 @@ } } }, + "org.maxsdkversion": { + "metadata": { + "added": 1739805810000, + "lastUpdated": 1739805810000, + "name": { + "en-US": "maxSdkVersion" + }, + "summary": { + "en-US": "Test setting maxSdkVersion in an APK" + }, + "icon": { + "en-US": { + "name": "/icons/org.maxsdkversion.4.png", + "sha256": "428442a0b75be04af3191a066041341f8a0b289972f99868687f43e02055a348", + "size": 91 + } + }, + "preferredSigner": "401a3a5843a3d5cebc22e6de5cb76d08eaa6797122d7fe1283df1d192e132f5e" + }, + "versions": { + "877d582369d2840fc0d6892e44feaaad21419b0e35af42f22b3e127bcd08274d": { + "added": 1739805810000, + "file": { + "name": "/org.maxsdkversion_4.apk", + "sha256": "877d582369d2840fc0d6892e44feaaad21419b0e35af42f22b3e127bcd08274d", + "size": 12768, + "ipfsCIDv1": "bafybeibdls2h4mpfw5gks3iirsne2qaez6uefwb5xmqkhahqbakvdszk6y" + }, + "manifest": { + "versionName": "1.0.3", + "maxSdkVersion": 25, + "versionCode": 4, + "features": [ + { + "name": "android.hardware.camera.front" + } + ], + "usesSdk": { + "minSdkVersion": 14, + "targetSdkVersion": 19 + }, + "signer": { + "sha256": [ + "401a3a5843a3d5cebc22e6de5cb76d08eaa6797122d7fe1283df1d192e132f5e" + ] + }, + "usesPermission": [ + { + "name": "android.permission.CAMERA" + } + ] + } + } + } + }, "souch.smsbypass": { "metadata": { "added": 1524700800000, diff --git a/tests/repo/index.xml b/tests/repo/index.xml index 4d7e8633..4036a6f7 100644 --- a/tests/repo/index.xml +++ b/tests/repo/index.xml @@ -147,6 +147,35 @@ APK is called F-Droid Privileged Extension. 2016-03-10 + + org.maxsdkversion + 2025-02-17 + 2025-02-17 + maxSdkVersion +

    Test setting maxSdkVersion in an APK + org.maxsdkversion.4.png + No description available + Unknown + + + + + 4 + + 1.0.3 + 4 + org.maxsdkversion_4.apk + 877d582369d2840fc0d6892e44feaaad21419b0e35af42f22b3e127bcd08274d + 12768 + 14 + 19 + 25 + 2025-02-17 + 1a5e67bcef6b2d6242f2d36982b54589 + CAMERA + android.hardware.camera.front + +
    no.min.target.sdk 2018-10-10 diff --git a/tests/repo/org.maxsdkversion_4.apk b/tests/repo/org.maxsdkversion_4.apk new file mode 100644 index 0000000000000000000000000000000000000000..3957886176290934f69bf9c57d044f827f3f807f GIT binary patch literal 12768 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 literal 0 HcmV?d00001 diff --git a/tests/test_update.py b/tests/test_update.py index 323dcace..dfe353b5 100755 --- a/tests/test_update.py +++ b/tests/test_update.py @@ -605,7 +605,7 @@ class UpdateTest(unittest.TestCase): apps = fdroidserver.metadata.read_metadata() knownapks = fdroidserver.common.KnownApks() apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False) - self.assertEqual(len(apks), 17) + self.assertEqual(len(apks), 18) apk = apks[1] self.assertEqual(apk['packageName'], 'com.politedroid') self.assertEqual(apk['versionCode'], 3) @@ -668,7 +668,7 @@ class UpdateTest(unittest.TestCase): fdroidserver.update.options.clean = False read_from_json = fdroidserver.update.get_cache() - self.assertEqual(19, len(read_from_json)) + self.assertEqual(20, len(read_from_json)) for f in glob.glob('repo/*.apk'): self.assertTrue(os.path.basename(f) in read_from_json) @@ -1241,7 +1241,7 @@ class UpdateTest(unittest.TestCase): knownapks = fdroidserver.common.KnownApks() apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False) fdroidserver.update.translate_per_build_anti_features(apps, apks) - self.assertEqual(len(apks), 17) + self.assertEqual(len(apks), 18) foundtest = False for apk in apks: if apk['packageName'] == 'com.politedroid' and apk['versionCode'] == 3: From a69340a1eab674f43703bf5605e28d480b4ad3f9 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 18 Feb 2025 12:13:09 +0100 Subject: [PATCH 1987/2116] MANIFEST.in: case-insensitive ASCII byte value for stable sort ``` LC_ALL=C sort --ignore-case --stable --output=MANIFEST.in MANIFEST.in ``` --- MANIFEST.in | 122 ++++++++++++++++++++++++++-------------------------- 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index cd5ed76a..e833d6f6 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -47,7 +47,6 @@ include locale/zh_Hans/LC_MESSAGES/fdroidserver.po include locale/zh_Hant/LC_MESSAGES/fdroidserver.po include makebuildserver include README.md -include tests/__init__.py include tests/aosp_testkey_debug.keystore include tests/apk.embedded_1.apk include tests/bad-unicode-*.apk @@ -60,10 +59,10 @@ include tests/build-tools/17.0.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/17.0.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/17.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/17.0.0/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/17.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/17.0.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/17.0.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/17.0.0/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/17.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/17.0.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/17.0.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/18.1.1/aapt-output-com.moez.QKSMS_182.txt @@ -75,10 +74,10 @@ include tests/build-tools/18.1.1/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/18.1.1/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/18.1.1/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/18.1.1/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/18.1.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/18.1.1/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/18.1.1/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/18.1.1/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/18.1.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/18.1.1/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/18.1.1/aapt-output-souch.smsbypass_9.txt include tests/build-tools/19.0.0/aapt-output-com.moez.QKSMS_182.txt @@ -90,10 +89,10 @@ include tests/build-tools/19.0.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/19.0.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/19.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/19.0.0/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/19.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/19.0.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/19.0.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/19.0.0/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/19.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/19.0.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/19.0.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/19.1.0/aapt-output-com.moez.QKSMS_182.txt @@ -105,10 +104,10 @@ include tests/build-tools/19.1.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/19.1.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/19.1.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/19.1.0/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/19.1.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/19.1.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/19.1.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/19.1.0/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/19.1.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/19.1.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/19.1.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/20.0.0/aapt-output-com.moez.QKSMS_182.txt @@ -120,10 +119,10 @@ include tests/build-tools/20.0.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/20.0.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/20.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/20.0.0/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/20.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/20.0.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/20.0.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/20.0.0/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/20.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/20.0.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/20.0.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/21.1.1/aapt-output-com.moez.QKSMS_182.txt @@ -135,10 +134,10 @@ include tests/build-tools/21.1.1/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/21.1.1/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/21.1.1/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/21.1.1/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/21.1.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/21.1.1/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/21.1.1/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/21.1.1/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/21.1.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/21.1.1/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/21.1.1/aapt-output-souch.smsbypass_9.txt include tests/build-tools/21.1.2/aapt-output-com.moez.QKSMS_182.txt @@ -150,10 +149,10 @@ include tests/build-tools/21.1.2/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/21.1.2/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/21.1.2/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/21.1.2/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/21.1.2/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/21.1.2/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/21.1.2/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/21.1.2/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/21.1.2/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/21.1.2/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/21.1.2/aapt-output-souch.smsbypass_9.txt include tests/build-tools/22.0.0/aapt-output-com.moez.QKSMS_182.txt @@ -165,10 +164,10 @@ include tests/build-tools/22.0.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/22.0.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/22.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/22.0.0/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/22.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/22.0.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/22.0.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/22.0.0/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/22.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/22.0.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/22.0.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/22.0.1/aapt-output-com.moez.QKSMS_182.txt @@ -180,10 +179,10 @@ include tests/build-tools/22.0.1/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/22.0.1/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/22.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/22.0.1/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/22.0.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/22.0.1/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/22.0.1/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/22.0.1/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/22.0.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/22.0.1/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/22.0.1/aapt-output-souch.smsbypass_9.txt include tests/build-tools/23.0.0/aapt-output-com.moez.QKSMS_182.txt @@ -195,10 +194,10 @@ include tests/build-tools/23.0.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/23.0.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/23.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/23.0.0/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/23.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/23.0.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/23.0.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/23.0.0/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/23.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/23.0.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/23.0.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/23.0.1/aapt-output-com.moez.QKSMS_182.txt @@ -210,10 +209,10 @@ include tests/build-tools/23.0.1/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/23.0.1/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/23.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/23.0.1/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/23.0.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/23.0.1/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/23.0.1/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/23.0.1/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/23.0.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/23.0.1/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/23.0.1/aapt-output-souch.smsbypass_9.txt include tests/build-tools/23.0.2/aapt-output-com.moez.QKSMS_182.txt @@ -225,10 +224,10 @@ include tests/build-tools/23.0.2/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/23.0.2/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/23.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/23.0.2/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/23.0.2/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/23.0.2/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/23.0.2/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/23.0.2/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/23.0.2/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/23.0.2/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/23.0.2/aapt-output-souch.smsbypass_9.txt include tests/build-tools/23.0.3/aapt-output-com.moez.QKSMS_182.txt @@ -240,10 +239,10 @@ include tests/build-tools/23.0.3/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/23.0.3/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/23.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/23.0.3/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/23.0.3/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/23.0.3/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/23.0.3/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/23.0.3/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/23.0.3/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/23.0.3/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/23.0.3/aapt-output-souch.smsbypass_9.txt include tests/build-tools/24.0.0/aapt-output-com.moez.QKSMS_182.txt @@ -255,10 +254,10 @@ include tests/build-tools/24.0.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/24.0.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/24.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/24.0.0/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/24.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/24.0.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/24.0.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/24.0.0/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/24.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/24.0.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/24.0.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/24.0.1/aapt-output-com.moez.QKSMS_182.txt @@ -270,10 +269,10 @@ include tests/build-tools/24.0.1/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/24.0.1/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/24.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/24.0.1/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/24.0.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/24.0.1/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/24.0.1/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/24.0.1/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/24.0.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/24.0.1/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/24.0.1/aapt-output-souch.smsbypass_9.txt include tests/build-tools/24.0.2/aapt-output-com.moez.QKSMS_182.txt @@ -285,10 +284,10 @@ include tests/build-tools/24.0.2/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/24.0.2/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/24.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/24.0.2/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/24.0.2/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/24.0.2/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/24.0.2/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/24.0.2/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/24.0.2/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/24.0.2/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/24.0.2/aapt-output-souch.smsbypass_9.txt include tests/build-tools/24.0.3/aapt-output-com.moez.QKSMS_182.txt @@ -300,10 +299,10 @@ include tests/build-tools/24.0.3/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/24.0.3/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/24.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/24.0.3/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/24.0.3/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/24.0.3/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/24.0.3/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/24.0.3/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/24.0.3/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/24.0.3/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/24.0.3/aapt-output-souch.smsbypass_9.txt include tests/build-tools/25.0.0/aapt-output-com.moez.QKSMS_182.txt @@ -315,10 +314,10 @@ include tests/build-tools/25.0.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/25.0.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/25.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/25.0.0/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/25.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/25.0.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/25.0.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/25.0.0/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/25.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/25.0.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/25.0.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/25.0.1/aapt-output-com.moez.QKSMS_182.txt @@ -330,10 +329,10 @@ include tests/build-tools/25.0.1/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/25.0.1/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/25.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/25.0.1/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/25.0.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/25.0.1/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/25.0.1/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/25.0.1/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/25.0.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/25.0.1/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/25.0.1/aapt-output-souch.smsbypass_9.txt include tests/build-tools/25.0.2/aapt-output-com.moez.QKSMS_182.txt @@ -345,10 +344,10 @@ include tests/build-tools/25.0.2/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/25.0.2/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/25.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/25.0.2/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/25.0.2/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/25.0.2/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/25.0.2/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/25.0.2/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/25.0.2/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/25.0.2/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/25.0.2/aapt-output-souch.smsbypass_9.txt include tests/build-tools/25.0.3/aapt-output-com.moez.QKSMS_182.txt @@ -360,10 +359,10 @@ include tests/build-tools/25.0.3/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/25.0.3/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/25.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/25.0.3/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/25.0.3/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/25.0.3/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/25.0.3/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/25.0.3/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/25.0.3/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/25.0.3/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/25.0.3/aapt-output-souch.smsbypass_9.txt include tests/build-tools/26.0.0/aapt-output-com.moez.QKSMS_182.txt @@ -375,10 +374,10 @@ include tests/build-tools/26.0.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/26.0.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/26.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/26.0.0/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/26.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/26.0.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/26.0.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/26.0.0/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/26.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/26.0.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/26.0.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/26.0.1/aapt-output-com.moez.QKSMS_182.txt @@ -390,10 +389,10 @@ include tests/build-tools/26.0.1/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/26.0.1/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/26.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/26.0.1/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/26.0.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/26.0.1/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/26.0.1/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/26.0.1/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/26.0.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/26.0.1/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/26.0.1/aapt-output-souch.smsbypass_9.txt include tests/build-tools/26.0.2/aapt-output-com.moez.QKSMS_182.txt @@ -405,10 +404,10 @@ include tests/build-tools/26.0.2/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/26.0.2/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/26.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/26.0.2/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/26.0.2/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/26.0.2/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/26.0.2/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/26.0.2/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/26.0.2/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/26.0.2/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/26.0.2/aapt-output-souch.smsbypass_9.txt include tests/build-tools/26.0.3/aapt-output-com.moez.QKSMS_182.txt @@ -420,10 +419,10 @@ include tests/build-tools/26.0.3/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/26.0.3/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/26.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/26.0.3/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/26.0.3/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/26.0.3/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/26.0.3/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/26.0.3/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/26.0.3/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/26.0.3/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/26.0.3/aapt-output-souch.smsbypass_9.txt include tests/build-tools/27.0.0/aapt-output-com.moez.QKSMS_182.txt @@ -435,10 +434,10 @@ include tests/build-tools/27.0.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/27.0.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/27.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/27.0.0/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/27.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/27.0.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/27.0.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/27.0.0/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/27.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/27.0.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/27.0.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/27.0.1/aapt-output-com.moez.QKSMS_182.txt @@ -450,10 +449,10 @@ include tests/build-tools/27.0.1/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/27.0.1/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/27.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/27.0.1/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/27.0.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/27.0.1/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/27.0.1/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/27.0.1/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/27.0.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/27.0.1/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/27.0.1/aapt-output-souch.smsbypass_9.txt include tests/build-tools/27.0.2/aapt-output-com.moez.QKSMS_182.txt @@ -465,10 +464,10 @@ include tests/build-tools/27.0.2/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/27.0.2/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/27.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/27.0.2/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/27.0.2/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/27.0.2/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/27.0.2/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/27.0.2/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/27.0.2/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/27.0.2/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/27.0.2/aapt-output-souch.smsbypass_9.txt include tests/build-tools/27.0.3/aapt-output-com.moez.QKSMS_182.txt @@ -480,10 +479,10 @@ include tests/build-tools/27.0.3/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/27.0.3/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/27.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/27.0.3/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/27.0.3/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/27.0.3/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/27.0.3/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/27.0.3/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/27.0.3/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/27.0.3/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/27.0.3/aapt-output-souch.smsbypass_9.txt include tests/build-tools/28.0.0/aapt-output-com.moez.QKSMS_182.txt @@ -495,10 +494,10 @@ include tests/build-tools/28.0.0/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/28.0.0/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/28.0.0/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/28.0.0/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/28.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/28.0.0/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/28.0.0/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/28.0.0/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/28.0.0/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/28.0.0/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/28.0.0/aapt-output-souch.smsbypass_9.txt include tests/build-tools/28.0.1/aapt-output-com.moez.QKSMS_182.txt @@ -510,10 +509,10 @@ include tests/build-tools/28.0.1/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/28.0.1/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/28.0.1/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/28.0.1/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/28.0.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/28.0.1/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/28.0.1/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/28.0.1/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/28.0.1/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/28.0.1/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/28.0.1/aapt-output-souch.smsbypass_9.txt include tests/build-tools/28.0.2/aapt-output-com.politedroid_3.txt @@ -524,10 +523,10 @@ include tests/build-tools/28.0.2/aapt-output-duplicate.permisssions_9999999.txt include tests/build-tools/28.0.2/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/28.0.2/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/28.0.2/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/28.0.2/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/28.0.2/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/28.0.2/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/28.0.2/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/28.0.2/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/28.0.2/aapt-output-org.droidtr.keyboard_34.txt include tests/build-tools/28.0.2/aapt-output-souch.smsbypass_9.txt include tests/build-tools/28.0.3/aapt-output-com.example.test.helloworld_1.txt @@ -540,10 +539,10 @@ include tests/build-tools/28.0.3/aapt-output-info.guardianproject.urzip_100.txt include tests/build-tools/28.0.3/aapt-output-info.zwanenburg.caffeinetile_4.txt include tests/build-tools/28.0.3/aapt-output-no.min.target.sdk_987.txt include tests/build-tools/28.0.3/aapt-output-obb.main.oldversion_1444412523.txt -include tests/build-tools/28.0.3/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/28.0.3/aapt-output-obb.main.twoversions_1101613.txt include tests/build-tools/28.0.3/aapt-output-obb.main.twoversions_1101615.txt include tests/build-tools/28.0.3/aapt-output-obb.main.twoversions_1101617.txt +include tests/build-tools/28.0.3/aapt-output-obb.mainpatch.current_1619.txt include tests/build-tools/28.0.3/aapt-output-souch.smsbypass_9.txt include tests/build-tools/generate.sh include tests/check-fdroid-apk @@ -572,11 +571,11 @@ include tests/dump_internal_metadata_format.py include tests/extra/manual-vmtools-test.py include tests/funding-usernames.yaml include tests/get_android_tools_versions/android-ndk-r10e/RELEASE.TXT +include tests/get_android_tools_versions/android-sdk/ndk-bundle/package.xml +include tests/get_android_tools_versions/android-sdk/ndk-bundle/source.properties include tests/get_android_tools_versions/android-sdk/ndk/11.2.2725575/source.properties include tests/get_android_tools_versions/android-sdk/ndk/17.2.4988734/source.properties include tests/get_android_tools_versions/android-sdk/ndk/21.3.6528147/source.properties -include tests/get_android_tools_versions/android-sdk/ndk-bundle/package.xml -include tests/get_android_tools_versions/android-sdk/ndk-bundle/source.properties include tests/get_android_tools_versions/android-sdk/patcher/v4/source.properties include tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties include tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties @@ -594,8 +593,11 @@ include tests/issue-1128-poc2.apk include tests/issue-1128-poc3a.apk include tests/issue-1128-poc3b.apk include tests/janus.apk -include tests/keystore.jks include tests/key-tricks.py +include tests/keystore.jks +include tests/metadata-rewrite-yml/app.with.special.build.params.yml +include tests/metadata-rewrite-yml/fake.ota.update.yml +include tests/metadata-rewrite-yml/org.fdroid.fdroid.yml include tests/metadata/apk/info.guardianproject.urzip.yaml include tests/metadata/apk/org.dyndns.fules.ck.yaml include tests/metadata/app.with.special.build.params.yml @@ -613,13 +615,14 @@ include tests/metadata/dump/org.smssecure.smssecure.yaml include tests/metadata/dump/org.videolan.vlc.yaml include tests/metadata/duplicate.permisssions.yml include tests/metadata/fake.ota.update.yml +include tests/metadata/info.guardianproject.checkey.yml include tests/metadata/info.guardianproject.checkey/en-US/description.txt include tests/metadata/info.guardianproject.checkey/en-US/name.txt include tests/metadata/info.guardianproject.checkey/en-US/phoneScreenshots/checkey-phone.png include tests/metadata/info.guardianproject.checkey/en-US/phoneScreenshots/checkey.png include tests/metadata/info.guardianproject.checkey/en-US/summary.txt include tests/metadata/info.guardianproject.checkey/ja-JP/name.txt -include tests/metadata/info.guardianproject.checkey.yml +include tests/metadata/info.guardianproject.urzip.yml include tests/metadata/info.guardianproject.urzip/en-US/changelogs/100.txt include tests/metadata/info.guardianproject.urzip/en-US/changelogs/default.txt include tests/metadata/info.guardianproject.urzip/en-US/full_description.txt @@ -628,28 +631,24 @@ include tests/metadata/info.guardianproject.urzip/en-US/images/icon.png include tests/metadata/info.guardianproject.urzip/en-US/short_description.txt include tests/metadata/info.guardianproject.urzip/en-US/title.txt include tests/metadata/info.guardianproject.urzip/en-US/video.txt -include tests/metadata/info.guardianproject.urzip.yml include tests/metadata/info.zwanenburg.caffeinetile.yml include tests/metadata/no.min.target.sdk.yml include tests/metadata/obb.main.oldversion.yml -include tests/metadata/obb.mainpatch.current.yml include tests/metadata/obb.main.twoversions.yml +include tests/metadata/obb.mainpatch.current.yml include tests/metadata/org.adaway.yml include tests/metadata/org.fdroid.ci.test.app.yml include tests/metadata/org.fdroid.fdroid.yml include tests/metadata/org.maxsdkversion.yml +include tests/metadata/org.smssecure.smssecure.yml include tests/metadata/org.smssecure.smssecure/signatures/134/28969C09.RSA include tests/metadata/org.smssecure.smssecure/signatures/134/28969C09.SF include tests/metadata/org.smssecure.smssecure/signatures/134/MANIFEST.MF include tests/metadata/org.smssecure.smssecure/signatures/135/28969C09.RSA include tests/metadata/org.smssecure.smssecure/signatures/135/28969C09.SF include tests/metadata/org.smssecure.smssecure/signatures/135/MANIFEST.MF -include tests/metadata/org.smssecure.smssecure.yml include tests/metadata/org.videolan.vlc.yml include tests/metadata/raw.template.yml -include tests/metadata-rewrite-yml/app.with.special.build.params.yml -include tests/metadata-rewrite-yml/fake.ota.update.yml -include tests/metadata-rewrite-yml/org.fdroid.fdroid.yml include tests/metadata/souch.smsbypass.yml include tests/minimal_targetsdk_30_unsigned.apk include tests/Norway_bouvet_europe_2.obf.zip @@ -680,16 +679,16 @@ include tests/repo/main.1434483388.obb.main.oldversion.obb include tests/repo/main.1619.obb.mainpatch.current.obb include tests/repo/no.min.target.sdk_987.apk include tests/repo/obb.main.oldversion_1444412523.apk -include tests/repo/obb.mainpatch.current_1619_another-release-key.apk -include tests/repo/obb.mainpatch.current_1619.apk -include tests/repo/obb.mainpatch.current/en-US/featureGraphic.png -include tests/repo/obb.mainpatch.current/en-US/icon.png -include tests/repo/obb.mainpatch.current/en-US/phoneScreenshots/screenshot-main.png -include tests/repo/obb.mainpatch.current/en-US/sevenInchScreenshots/screenshot-tablet-main.png include tests/repo/obb.main.twoversions_1101613.apk include tests/repo/obb.main.twoversions_1101615.apk include tests/repo/obb.main.twoversions_1101617.apk include tests/repo/obb.main.twoversions_1101617_src.tar.gz +include tests/repo/obb.mainpatch.current/en-US/featureGraphic.png +include tests/repo/obb.mainpatch.current/en-US/icon.png +include tests/repo/obb.mainpatch.current/en-US/phoneScreenshots/screenshot-main.png +include tests/repo/obb.mainpatch.current/en-US/sevenInchScreenshots/screenshot-tablet-main.png +include tests/repo/obb.mainpatch.current_1619.apk +include tests/repo/obb.mainpatch.current_1619_another-release-key.apk include tests/repo/org.maxsdkversion_4.apk include tests/repo/org.videolan.vlc/en-US/icon.png include tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot10.png @@ -702,16 +701,16 @@ include tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot4.png include tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot7.png include tests/repo/org.videolan.vlc/en-US/phoneScreenshots/screenshot9.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot0.png +include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot1.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot11.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot13.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot14.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot16.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot17.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot19.png -include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot1.png +include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot2.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot21.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot23.png -include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot2.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot3.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot5.png include tests/repo/org.videolan.vlc/en-US/sevenInchScreenshots/screenshot6.png @@ -724,20 +723,20 @@ include tests/run-tests include tests/SANAPPSI.RSA include tests/SANAPPSI.SF include tests/shared_test_code.py -include tests/signindex/guardianproject.jar include tests/signindex/guardianproject-v1.jar +include tests/signindex/guardianproject.jar include tests/signindex/testy.jar include tests/signindex/unsigned.jar include tests/source-files/at.bitfire.davdroid/build.gradle include tests/source-files/catalog.test/app/build.gradle +include tests/source-files/catalog.test/build.gradle.kts include tests/source-files/catalog.test/buildSrc/build.gradle.kts include tests/source-files/catalog.test/buildSrc/settings.gradle.kts include tests/source-files/catalog.test/buildSrc2/build.gradle.kts include tests/source-files/catalog.test/buildSrc2/settings.gradle.kts -include tests/source-files/catalog.test/build.gradle.kts include tests/source-files/catalog.test/core/build.gradle -include tests/source-files/catalog.test/libs.versions.toml include tests/source-files/catalog.test/gradle/libs.versions.toml +include tests/source-files/catalog.test/libs.versions.toml include tests/source-files/catalog.test/settings.gradle.kts include tests/source-files/cn.wildfirechat.chat/avenginekit/build.gradle include tests/source-files/cn.wildfirechat.chat/build.gradle @@ -770,21 +769,21 @@ include tests/source-files/com.integreight.onesheeld/pullToRefreshlibrary/src/ma include tests/source-files/com.integreight.onesheeld/quickReturnHeader/build.gradle include tests/source-files/com.integreight.onesheeld/quickReturnHeader/src/main/AndroidManifest.xml include tests/source-files/com.integreight.onesheeld/settings.gradle -include tests/source-files/com.jens.automation2/build.gradle include tests/source-files/com.jens.automation2/app/build.gradle +include tests/source-files/com.jens.automation2/build.gradle include tests/source-files/com.kunzisoft.testcase/build.gradle include tests/source-files/com.lolo.io.onelist/app/build.gradle.kts include tests/source-files/com.lolo.io.onelist/build.gradle.kts include tests/source-files/com.lolo.io.onelist/gradle/libs.versions.toml include tests/source-files/com.lolo.io.onelist/gradle/wrapper/gradle-wrapper.properties include tests/source-files/com.lolo.io.onelist/settings.gradle -include tests/source-files/com.nextcloud.client/build.gradle include tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android/en-US/full_description.txt include tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android/en-US/short_description.txt include tests/source-files/com.nextcloud.client.dev/src/generic/fastlane/metadata/android/en-US/title.txt include tests/source-files/com.nextcloud.client.dev/src/versionDev/fastlane/metadata/android/en-US/full_description.txt include tests/source-files/com.nextcloud.client.dev/src/versionDev/fastlane/metadata/android/en-US/short_description.txt include tests/source-files/com.nextcloud.client.dev/src/versionDev/fastlane/metadata/android/en-US/title.txt +include tests/source-files/com.nextcloud.client/build.gradle include tests/source-files/com.nextcloud.client/src/generic/fastlane/metadata/android/en-US/full_description.txt include tests/source-files/com.nextcloud.client/src/generic/fastlane/metadata/android/en-US/short_description.txt include tests/source-files/com.nextcloud.client/src/generic/fastlane/metadata/android/en-US/title.txt @@ -810,10 +809,10 @@ include tests/source-files/lockfile.test/flutter/pubspec.lock include tests/source-files/lockfile.test/flutter/pubspec.yaml include tests/source-files/lockfile.test/javascript/package.json include tests/source-files/lockfile.test/javascript/yarn.lock -include tests/source-files/lockfile.test/rust/subdir2/Cargo.toml include tests/source-files/lockfile.test/rust/subdir/Cargo.lock include tests/source-files/lockfile.test/rust/subdir/Cargo.toml include tests/source-files/lockfile.test/rust/subdir/subdir/subdir/Cargo.toml +include tests/source-files/lockfile.test/rust/subdir2/Cargo.toml include tests/source-files/open-keychain/open-keychain/build.gradle include tests/source-files/open-keychain/open-keychain/OpenKeychain/build.gradle include tests/source-files/org.mozilla.rocket/app/build.gradle @@ -869,8 +868,8 @@ include tests/test_signatures.py include tests/test_signindex.py include tests/test_update.py include tests/test_vcs.py -include tests/triple-t-2/build/org.piwigo.android/app/build.gradle include tests/triple-t-2/build/org.piwigo.android/app/.gitignore +include tests/triple-t-2/build/org.piwigo.android/app/build.gradle include tests/triple-t-2/build/org.piwigo.android/app/src/debug/res/values/constants.xml include tests/triple-t-2/build/org.piwigo.android/app/src/debug/res/values/strings.xml include tests/triple-t-2/build/org.piwigo.android/app/src/main/java/org/piwigo/PiwigoApplication.java @@ -925,12 +924,13 @@ include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verif include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/main/play/listings/en-US/title.txt include tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.verifier.yml include tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.wallet.yml -include tests/urzip.apk include tests/urzip-badcert.apk include tests/urzip-badsig.apk -include tests/urzip-release.apk include tests/urzip-release-unsigned.apk +include tests/urzip-release.apk +include tests/urzip.apk include tests/v2.only.sig_2.apk include tests/valid-package-names/random-package-names include tests/valid-package-names/RandomPackageNames.java include tests/valid-package-names/test.py +include tests/__init__.py From 59474437b392ee2463e1b9fa5e08db5459eb28d8 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 5 Mar 2025 17:43:50 +0100 Subject: [PATCH 1988/2116] delete cruft test script --- tests/parse-fdroiddata-mirror-config.py | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 tests/parse-fdroiddata-mirror-config.py diff --git a/tests/parse-fdroiddata-mirror-config.py b/tests/parse-fdroiddata-mirror-config.py deleted file mode 100644 index f909e910..00000000 --- a/tests/parse-fdroiddata-mirror-config.py +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env python3 - -import ruamel.yaml - -from pathlib import Path - -mirrors_yml = Path('/home/hans/code/fdroid/fdroiddata/config/mirrors.yml') -with mirrors_yml.open() as fp: - mirrors_config = ruamel.yaml.YAML(typ='safe').load(fp) - -for d in mirrors_config: - d['url'] += '/repo' - print(d, end=',\n') From d9046727e5e732b97ada695607b1074d61f0e281 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Mon, 24 Mar 2025 15:02:51 +0100 Subject: [PATCH 1989/2116] Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk Currently translated at 100.0% (578 of 578 strings) Co-authored-by: Ihor Hordiichuk Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index aff7f74a..b8fdd8ab 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -2,7 +2,7 @@ # Copyright (C) YEAR Free Software Foundation, Inc. # Hans-Christoph Steiner , 2020. # ihor_ck , 2020. -# Ihor Hordiichuk , 2020, 2021, 2022, 2023, 2024. +# Ihor Hordiichuk , 2020, 2021, 2022, 2023, 2024, 2025. # Tymofij Lytvynenko , 2021. # DankXylese , 2021. # Dan , 2022. @@ -18,8 +18,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-23 21:45+0100\n" -"PO-Revision-Date: 2025-03-20 14:13+0000\n" -"Last-Translator: Максим Горпиніч \n" +"PO-Revision-Date: 2025-03-24 14:02+0000\n" +"Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" @@ -52,7 +52,7 @@ msgstr "\"%s/\" не має відповідного файлу метадани #: ../fdroidserver/index.py msgid "\"isPrimary\" key should not be added to mirrors!" -msgstr "\"isPrimary\" ключ не слід додавати до дзеркал!" +msgstr "Ключ \"isPrimary\" не слід додавати до дзеркал!" #: ../fdroidserver/index.py #, python-brace-format @@ -494,7 +494,7 @@ msgstr "Створення \"{path}\" для налаштування s3cmd." #: ../fdroidserver/common.py #, python-brace-format msgid "Creating empty {config_file}" -msgstr "Створення пустого {config_file}" +msgstr "Створення порожнього {config_file}" #: ../fdroidserver/publish.py msgid "Creating log directory" @@ -2603,7 +2603,7 @@ msgstr "{name} \"{section}/icons/{path}\" не існує! Виправте йо #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" -msgstr "{path1} є дублікатом {path2}, видаліть один!" +msgstr "{path1} є дублікатом {path2}, видаліть один з них!" #: ../fdroidserver/import_subcommand.py #, python-brace-format From 4cefec93333dbfbce518a6d98eea0e46555a421f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 25 Mar 2025 11:36:12 +0100 Subject: [PATCH 1990/2116] fix missing comma in error message --- fdroidserver/publish.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/publish.py b/fdroidserver/publish.py index 42eb0f6f..4c0bd791 100644 --- a/fdroidserver/publish.py +++ b/fdroidserver/publish.py @@ -453,7 +453,7 @@ def main(): if os.path.exists(signed_apk_path): raise BuildException( _( - "Refusing to sign '{path}' file exists in both {dir1} and {dir2} folder." + "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." ).format(path=apkfilename, dir1=unsigned_dir, dir2=output_dir) ) From 0c867f908f854e43474ffa44d5d5de573cdc3a82 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 25 Mar 2025 11:38:20 +0100 Subject: [PATCH 1991/2116] make -C locale update --- locale/ar/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/az/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/be/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/bg/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/bn/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/bo/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/ca/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/cs/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/cy/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/de/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/el/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/es/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/es_AR/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/es_MX/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/eu/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/fa/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/fdroidserver.pot | 9 +++++++-- locale/fi/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/fr/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/fy/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/ga/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/he/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/hi/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/hu/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/id/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/it/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/ja/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/kab/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/ko/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/lv/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/ml/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/nl/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/nn/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/pa/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/pl/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/pt/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/ro/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/ru/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/sk/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/sq/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/sr/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/sv/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/sw/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/ta/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/tr/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/tzm/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/ug/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/uk/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 7 ++++++- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 7 ++++++- 53 files changed, 319 insertions(+), 54 deletions(-) diff --git a/locale/ar/LC_MESSAGES/fdroidserver.po b/locale/ar/LC_MESSAGES/fdroidserver.po index 4bb27d8a..ca0c3426 100644 --- a/locale/ar/LC_MESSAGES/fdroidserver.po +++ b/locale/ar/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2024-09-21 19:31+0000\n" "Last-Translator: Cool Man \n" "Language-Team: Arabic \n" @@ -1461,6 +1461,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/az/LC_MESSAGES/fdroidserver.po b/locale/az/LC_MESSAGES/fdroidserver.po index 78551ce4..6bc37559 100644 --- a/locale/az/LC_MESSAGES/fdroidserver.po +++ b/locale/az/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2023-05-26 19:39+0000\n" "Last-Translator: Mehrab Poladov \n" "Language-Team: Azerbaijani \n" @@ -1456,6 +1456,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/be/LC_MESSAGES/fdroidserver.po b/locale/be/LC_MESSAGES/fdroidserver.po index c239f0d2..bab918a4 100644 --- a/locale/be/LC_MESSAGES/fdroidserver.po +++ b/locale/be/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2024-01-21 00:08+0000\n" "Last-Translator: flac \n" "Language-Team: Belarusian \n" @@ -1461,6 +1461,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/bg/LC_MESSAGES/fdroidserver.po b/locale/bg/LC_MESSAGES/fdroidserver.po index 630bf747..bc6bff77 100644 --- a/locale/bg/LC_MESSAGES/fdroidserver.po +++ b/locale/bg/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2024-07-19 10:21+0000\n" "Last-Translator: 109247019824 \n" "Language-Team: Bulgarian \n" @@ -1457,6 +1457,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index 21f55ba5..fa057130 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2021-02-12 09:48+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali \n" @@ -1456,6 +1456,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index 6e68a8c4..3f892a0e 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tibetan \n" @@ -1477,6 +1477,11 @@ msgstr "སྦས་ཁུང་ནས་ {apkfilename}ཀློག་བཞི msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index bac85e24..d7bdddfb 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-01-30 12:31+0000\n" "Last-Translator: pitroig \n" "Language-Team: Catalan \n" @@ -1468,6 +1468,11 @@ msgstr "S'està llegint {apkfilename} des de la memòria cau" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Actualitza i cau les regles de l'escàner i les signatures de la xarxa" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "Elimina el fitxer tar d'origen i qualsevol APKs si s'ha verificat correctament." diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index d64196a8..2c95ed17 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-03-20 16:21+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" @@ -1471,6 +1471,11 @@ msgstr "Čtení {apkfilename} z mezipaměti" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Obnovit a uložit pravidla a podpisy skeneru ze sítě do mezipaměti" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "Odstranit zdrojový tarball a všechny soubory APK při úspěšném ověření." diff --git a/locale/cy/LC_MESSAGES/fdroidserver.po b/locale/cy/LC_MESSAGES/fdroidserver.po index d04b3fdc..37648a7b 100644 --- a/locale/cy/LC_MESSAGES/fdroidserver.po +++ b/locale/cy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2021-01-16 21:23+0000\n" "Last-Translator: Aled Powell \n" "Language-Team: Welsh \n" @@ -1460,6 +1460,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 041fd2ca..98b0aed3 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -26,7 +26,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-03-21 08:45+0000\n" "Last-Translator: VfBFan \n" "Language-Team: German \n" @@ -1483,6 +1483,11 @@ msgstr "Lese {apkfilename} aus dem Cache" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Aktualisieren und Zwischenspeichern von Scannerregeln und Signaturen aus dem Netzwerk" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "Den Quell-Tarball und alle APKs entfernen, wenn sie erfolgreich verifiziert wurden." diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index bb8bd090..13380be3 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2024-05-10 13:24+0000\n" "Last-Translator: ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ \n" "Language-Team: Greek \n" @@ -1463,6 +1463,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 0c909b22..f01ed699 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-03-16 22:47+0000\n" "Last-Translator: Nicolás Pérez \n" "Language-Team: Spanish \n" @@ -1475,6 +1475,11 @@ msgstr "Leyendo {apkfilename} desde caché" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Actualización y almacenamiento en caché de las reglas y firmas del escáner desde la red" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "Elimine el archivo tar de origen y todos los APK si se verifican correctamente." diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index eccb5851..f6e544a1 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2021-04-10 21:26+0000\n" "Last-Translator: Germe the fur star \n" "Language-Team: Spanish (Argentina) \n" @@ -1473,6 +1473,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/es_MX/LC_MESSAGES/fdroidserver.po b/locale/es_MX/LC_MESSAGES/fdroidserver.po index c5e8b00a..344bf130 100644 --- a/locale/es_MX/LC_MESSAGES/fdroidserver.po +++ b/locale/es_MX/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2020-04-29 12:49+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Spanish (Mexico) \n" @@ -1461,6 +1461,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/eu/LC_MESSAGES/fdroidserver.po b/locale/eu/LC_MESSAGES/fdroidserver.po index 770e23c4..8d6c69b4 100644 --- a/locale/eu/LC_MESSAGES/fdroidserver.po +++ b/locale/eu/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -1455,6 +1455,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index 3260d468..d8aad95a 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2024-11-26 15:16+0000\n" "Last-Translator: Danial Behzadi \n" "Language-Team: Persian \n" @@ -1459,6 +1459,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/fdroidserver.pot b/locale/fdroidserver.pot index 157db931..0f9e9b28 100644 --- a/locale/fdroidserver.pot +++ b/locale/fdroidserver.pot @@ -5,9 +5,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: fdroidserver 2.4a2\n" +"Project-Id-Version: fdroidserver 2.4.0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1457,6 +1457,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index ab3e5a61..065b07d8 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-01-31 14:19+0000\n" "Last-Translator: Ricky Tigg \n" "Language-Team: Finnish \n" @@ -1458,6 +1458,11 @@ msgstr "Luetaan {apkfilename} välimuistista" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 1b71ac5f..aff0f707 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -46,7 +46,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-03-02 16:42+0000\n" "Last-Translator: Lula Bye \n" "Language-Team: French \n" @@ -1503,6 +1503,11 @@ msgstr "Lecture de {apkfilename} à partir du cache" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Actualisation et mise en cache des règles et signature à partir du réseau." +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "Supprimer l'archive d'origine et les APKs si la vérification est effectuée avec succès." diff --git a/locale/fy/LC_MESSAGES/fdroidserver.po b/locale/fy/LC_MESSAGES/fdroidserver.po index afc47414..677eea67 100644 --- a/locale/fy/LC_MESSAGES/fdroidserver.po +++ b/locale/fy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2021-07-01 15:29+0000\n" "Last-Translator: Vancha March \n" "Language-Team: Frisian \n" @@ -1456,6 +1456,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/ga/LC_MESSAGES/fdroidserver.po b/locale/ga/LC_MESSAGES/fdroidserver.po index 5ac927e4..6e899484 100644 --- a/locale/ga/LC_MESSAGES/fdroidserver.po +++ b/locale/ga/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1-162-gfbb3cc59\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-03-23 10:56+0000\n" "Last-Translator: Aindriú Mac Giolla Eoin \n" "Language-Team: Irish \n" @@ -1465,6 +1465,11 @@ msgstr "{apkfilename} á léamh ón taisce" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Athnuaigh agus cuir rialacha agus sínithe scanóirí taisce ón líonra" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "Bain tarball foinse agus aon APKanna má fhíoraítear go rathúil é." diff --git a/locale/he/LC_MESSAGES/fdroidserver.po b/locale/he/LC_MESSAGES/fdroidserver.po index b92d0572..f9a3a7fd 100644 --- a/locale/he/LC_MESSAGES/fdroidserver.po +++ b/locale/he/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2024-08-18 06:27+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" @@ -1457,6 +1457,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/hi/LC_MESSAGES/fdroidserver.po b/locale/hi/LC_MESSAGES/fdroidserver.po index ddb6427a..11e53f7d 100644 --- a/locale/hi/LC_MESSAGES/fdroidserver.po +++ b/locale/hi/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2023-02-22 11:24+0000\n" "Last-Translator: Saurmandal \n" "Language-Team: Hindi \n" @@ -1457,6 +1457,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index bf895577..a9d51973 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Hungarian \n" @@ -1472,6 +1472,11 @@ msgstr "A(z) {apkfilename} olvasása gyorsítótárból" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/id/LC_MESSAGES/fdroidserver.po b/locale/id/LC_MESSAGES/fdroidserver.po index e6812a5d..86e4a246 100644 --- a/locale/id/LC_MESSAGES/fdroidserver.po +++ b/locale/id/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2024-10-04 04:26+0000\n" "Last-Translator: Doctorredits_here \n" "Language-Team: Indonesian \n" @@ -1462,6 +1462,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index 78eda911..a20dfa82 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -22,7 +22,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-03-20 16:21+0000\n" "Last-Translator: Champ0999 \n" "Language-Team: Italian \n" @@ -1482,6 +1482,11 @@ msgstr "Lettura di {apkfilename} dalla cache" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "recupera l'ultima versione delle firme dal web" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 73fdb6bd..1d8629c1 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-02-08 06:22+0000\n" "Last-Translator: Liner Seven \n" "Language-Team: Japanese \n" @@ -1464,6 +1464,11 @@ msgstr "{apkfilename}をキャッシュから読み込みます" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "スキャナーのルールと署名をネットワークから取得して更新し、キャッシュ" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "検証成功時にソースのTAR・APKを削除する。" diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index 8c1b52d5..9cc66432 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2021-01-15 13:25+0000\n" "Last-Translator: R_SACI \n" "Language-Team: Kabyle \n" @@ -1460,6 +1460,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index 12e48702..66244698 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2024-09-06 14:57+0000\n" "Last-Translator: Cxnfl1ct \n" "Language-Team: Korean \n" @@ -1463,6 +1463,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/lv/LC_MESSAGES/fdroidserver.po b/locale/lv/LC_MESSAGES/fdroidserver.po index 74cead5f..28da8f9b 100644 --- a/locale/lv/LC_MESSAGES/fdroidserver.po +++ b/locale/lv/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-03-21 08:46+0000\n" "Last-Translator: Edgars Andersons \n" "Language-Team: Latvian \n" @@ -1457,6 +1457,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "Noņemt avota arhīvu un jebkādus APK, ja sekmīgi apliecināta." diff --git a/locale/ml/LC_MESSAGES/fdroidserver.po b/locale/ml/LC_MESSAGES/fdroidserver.po index e6416749..39b7a730 100644 --- a/locale/ml/LC_MESSAGES/fdroidserver.po +++ b/locale/ml/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2023-06-23 14:52+0000\n" "Last-Translator: abe1242 \n" "Language-Team: Malayalam \n" @@ -1461,6 +1461,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index 50da9952..26cf9e7f 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Norwegian Bokmål \n" @@ -1515,6 +1515,11 @@ msgstr "Behandler {apkfilename}" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index 0245e1e0..aa9106fb 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2024-01-03 09:07+0000\n" "Last-Translator: Issa1553 \n" "Language-Team: Dutch \n" @@ -1464,6 +1464,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/nn/LC_MESSAGES/fdroidserver.po b/locale/nn/LC_MESSAGES/fdroidserver.po index e2af7284..180c114d 100644 --- a/locale/nn/LC_MESSAGES/fdroidserver.po +++ b/locale/nn/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3.0-3-g4ba7b5c9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2024-11-26 10:54+0000\n" "Last-Translator: Bård Sigurd Møller \n" "Language-Team: Norwegian Nynorsk \n" @@ -1456,6 +1456,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/pa/LC_MESSAGES/fdroidserver.po b/locale/pa/LC_MESSAGES/fdroidserver.po index be80a7b9..b08867aa 100644 --- a/locale/pa/LC_MESSAGES/fdroidserver.po +++ b/locale/pa/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3.3\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -1455,6 +1455,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index a372acbc..4726753c 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-03-13 20:43+0000\n" "Last-Translator: WaldiS \n" "Language-Team: Polish \n" @@ -1468,6 +1468,11 @@ msgstr "Czytanie {apkfilename} z pamięci podręcznej" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Odświeżanie i buforowanie reguł skanera i sygnatur z sieci" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "Usuń źródłowy plik tarball i wszystkie pliki APK, jeśli pomyślnie zweryfikowano." diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 5a296844..feb11e64 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-03-02 21:32+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" @@ -1466,6 +1466,11 @@ msgstr "Lendo {apkfilename} do cache" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Atualizar e armazenar as regras e assinaturas do scanner da rede no cache" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "Remover tarball de código-fonte e todos APKs se for verificado com sucesso." diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index e0eeecf2..4ae99353 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -19,7 +19,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-03-21 18:43+0000\n" "Last-Translator: LucasMZ \n" "Language-Team: Portuguese (Brazil) \n" @@ -1476,6 +1476,11 @@ msgstr "Lendo {apkfilename} do cache" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Atualizar e armazenar em cache regras e assinaturas do scanner da rede" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "Remover pacote de código-fonte e qualquer APK se verificado com sucesso." diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index f98d328c..a3538f79 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-03-02 21:32+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" @@ -1468,6 +1468,11 @@ msgstr "Lendo {apkfilename} do cache" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Atualizar e armazenar as regras e assinaturas do scanner da rede no cache" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "Remover tarball de código-fonte e todos APKs se for verificado com sucesso." diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index ef35bf45..4293395d 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2024-12-02 17:00+0000\n" "Last-Translator: Licaon Kter \n" "Language-Team: Romanian \n" @@ -1467,6 +1467,11 @@ msgstr "Citirea {apkfilename} din memoria cache" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Actualizează și stochează în memorie regulile și semnăturilor de scanare din rețea" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 9690ada4..023ed632 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -20,7 +20,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-01-25 15:42+0000\n" "Last-Translator: Golubev Alexander \n" "Language-Team: Russian \n" @@ -1478,6 +1478,11 @@ msgstr "Чтение {apkfilename} из кеша" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Обновление и кэширование правил и сигнатур сканера из сети" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "Удалить tar-архив с исходным кодом и все APK-файлы, если проверка для них прошла успешно." diff --git a/locale/sk/LC_MESSAGES/fdroidserver.po b/locale/sk/LC_MESSAGES/fdroidserver.po index dd673c7f..a4dd859f 100644 --- a/locale/sk/LC_MESSAGES/fdroidserver.po +++ b/locale/sk/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -1456,6 +1456,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index 5d781e1f..25881e20 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-03-21 08:45+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" @@ -1463,6 +1463,11 @@ msgstr "Po lexohet {apkfilename} prej fshehtine" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Rifresko dhe ruaj në fshehtinë rregulla skaneri nga rrjeti" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "Hiqni paketimin e burimit dhe çfarëdo APK-sh, nëse verifikimi është i suksesshëm." diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index a1de681c..b07f0c4e 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2024-12-30 22:00+0000\n" "Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" @@ -1466,6 +1466,11 @@ msgstr "Читање {apkfilename} из кеша→" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Освежите и кеширајте правила и потписе скенера са мреже" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "Уклони изворни tarball и све APK-ове ако су успешно проверени." diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index d3dd6378..ce93975f 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-03-17 21:44+0000\n" "Last-Translator: Kristoffer Grundström \n" "Language-Team: Swedish \n" @@ -1465,6 +1465,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index b9ff5dd3..21e2b3a3 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2024-09-08 11:09+0000\n" "Last-Translator: abelbiwott-dev \n" "Language-Team: Swahili \n" @@ -1464,6 +1464,11 @@ msgstr "Kusoma {apkfilename} kutoka kwa hifadhi ya muda" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Onyesha upya na uweke kwenye hifadhi ya muda kanuni za skana na sahihi kutoka kwenye mtandao" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/ta/LC_MESSAGES/fdroidserver.po b/locale/ta/LC_MESSAGES/fdroidserver.po index 27008dc2..00d2540d 100644 --- a/locale/ta/LC_MESSAGES/fdroidserver.po +++ b/locale/ta/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-01-20 14:04+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tamil \n" @@ -1465,6 +1465,11 @@ msgstr "தற்காலிக சேமிப்பிலிருந்த msgid "Refresh and cache scanner rules and signatures from the network" msgstr "நெட்வொர்க்கிலிருந்து ச்கேனர் விதிகள் மற்றும் கையொப்பங்களை புதுப்பித்து கேச்" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "வெற்றிகரமாக சரிபார்க்கப்பட்டால் மூல நாடாகாப்பகபந்து மற்றும் ஏதேனும் APK களை அகற்றவும்." diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index 8d755574..f3cdbc11 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2024-09-10 23:49+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" @@ -1465,6 +1465,11 @@ msgstr "{apkfilename} önbellekten okunuyor" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Tarayıcı kurallarını ve imzalarını ağdan yenile ve önbelleğe al" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/tzm/LC_MESSAGES/fdroidserver.po b/locale/tzm/LC_MESSAGES/fdroidserver.po index 61a2f416..705a018c 100644 --- a/locale/tzm/LC_MESSAGES/fdroidserver.po +++ b/locale/tzm/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-681-gc19e8952\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2020-10-29 08:32+0000\n" "Last-Translator: Hakim Oubouali \n" "Language-Team: Central Atlas Tamazight \n" @@ -1456,6 +1456,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/ug/LC_MESSAGES/fdroidserver.po b/locale/ug/LC_MESSAGES/fdroidserver.po index 7881976d..e4565e46 100644 --- a/locale/ug/LC_MESSAGES/fdroidserver.po +++ b/locale/ug/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2018-06-08 03:44+0000\n" "Last-Translator: ۋولقان \n" "Language-Team: Uyghur \n" @@ -1458,6 +1458,11 @@ msgstr "" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index b8fdd8ab..9a4a57f9 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-03-24 14:02+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" @@ -1475,6 +1475,11 @@ msgstr "Читання {apkfilename} з кешу" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "Оновлення та кешування правил і сигнатур сканера з мережі" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "Видаліть вихідний архів та будь-які файли APK, якщо успішно перевірено." diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 73c21a40..918404df 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -39,7 +39,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-03-21 03:03+0000\n" "Last-Translator: 大王叫我来巡山 \n" "Language-Team: Chinese (Simplified Han script) \n" @@ -1495,6 +1495,11 @@ msgstr "从缓存读取 {apkfilename}" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "刷新和缓存来自网络的扫描程序规则和签名" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "若验证成功删除源 tarball 和任何 APK 文件。" diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 9e1ea987..4516afc7 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-23 21:45+0100\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2024-11-26 15:16+0000\n" "Last-Translator: Peter Dave Hello \n" "Language-Team: Chinese (Traditional Han script) \n" @@ -1487,6 +1487,11 @@ msgstr "從緩存讀取 {apkfilename}" msgid "Refresh and cache scanner rules and signatures from the network" msgstr "從網路重新整理並快取掃描器規則與簽章" +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "" + #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." msgstr "" From eef237de8546652105fbbbdfdf4b0b21c6f7edff Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 25 Mar 2025 12:05:06 +0100 Subject: [PATCH 1992/2116] locale/pick-complete-translations.py: use stable sort order for MANIFEST.in --- locale/pick-complete-translations.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/locale/pick-complete-translations.py b/locale/pick-complete-translations.py index 4366807a..686d0261 100755 --- a/locale/pick-complete-translations.py +++ b/locale/pick-complete-translations.py @@ -79,7 +79,13 @@ with open(manifest_file, 'a') as fp: if line: fp.write(line) +# first filter duplicates subprocess.run(['sort', '-u', '-o', manifest_file, manifest_file]) +# then use a stable sort order +subprocess.run( + ['sort', '--ignore-case', '--stable', '-o', manifest_file, manifest_file], + env={'LC_ALL': 'C'}, +) print('\tIf all else fails, try:') print('\tgit checkout -B merge_weblate weblate/master') From 0cce48dc048dace39c77ff5d1115caa38227b385 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 25 Mar 2025 12:05:42 +0100 Subject: [PATCH 1993/2116] use black code format for locale/pick-complete-translations.py --- locale/pick-complete-translations.py | 14 ++++++++------ pyproject.toml | 1 - 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/locale/pick-complete-translations.py b/locale/pick-complete-translations.py index 686d0261..8c4d377b 100755 --- a/locale/pick-complete-translations.py +++ b/locale/pick-complete-translations.py @@ -27,12 +27,14 @@ else: active = set() print('name locale translated approved error-free') for locale in sorted(data, key=lambda locale: locale['code']): - print('%26s' % locale['name'], - '%8s' % locale['code'], - '%0.1f%%' % locale['translated_percent'], - '%0.1f%%' % locale['approved_percent'], - '%0.1f%%' % (100 - locale['failing_percent']), - sep='\t') + print( + '%26s' % locale['name'], + '%8s' % locale['code'], + '%0.1f%%' % locale['translated_percent'], + '%0.1f%%' % locale['approved_percent'], + '%0.1f%%' % (100 - locale['failing_percent']), + sep='\t', + ) if locale['translated_percent'] >= 90 and locale['failing'] < 5: active.add(locale['code']) diff --git a/pyproject.toml b/pyproject.toml index 34fbe3b2..bd209935 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,7 +42,6 @@ force-exclude = '''( | fdroidserver/nightly\.py | fdroidserver/update\.py | fdroidserver/vmtools\.py - | locale/pick-complete-translations\.py | tests/config\.py | tests/extra/manual-vmtools-test\.py | tests/gradle-release-checksums\.py From 9fb909b648a594893a613aa9c75fcbd64d90660e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 25 Mar 2025 12:12:19 +0100 Subject: [PATCH 1994/2116] update CHANGELOG.md --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 708cb8b1..f21550a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) -## unreleased +## [2.4.0] - 2025-03-25 ### Added @@ -29,6 +29,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) * index: fail if user sets mirrors:isPrimary wrong https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1617 https://gitlab.com/fdroid/fdroidserver/-/issues/1125 +* Sync translations for all supported languages: bo ca cs de es fr ga hu it ja + ko nb_NO pl pt pt_BR pt_PT ro ru sq sr sw tr uk zh_Hans zh_Hant ### Removed From c98028136a24c66299d08986ccae3731e23f765f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 25 Mar 2025 12:12:50 +0100 Subject: [PATCH 1995/2116] version 2.4.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 45d16182..377c2409 100755 --- a/setup.py +++ b/setup.py @@ -70,7 +70,7 @@ with open("README.md", "r") as fh: setup( name='fdroidserver', - version='2.4a2', + version='2.4.0', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From 90b82ea7e6fb47936f026eac17fd4ac079e0833d Mon Sep 17 00:00:00 2001 From: proletarius101 Date: Wed, 26 Mar 2025 21:33:31 +0000 Subject: [PATCH 1996/2116] ci: use GitLab Code Quality for linting tests --- .bandit | 2 +- .gitlab-ci.yml | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.bandit b/.bandit index 3dc1625b..dc28620f 100644 --- a/.bandit +++ b/.bandit @@ -1,3 +1,3 @@ [bandit] -skips: B110,B404,B408,B603,B607 +skips: B110,B404,B408,B603,B607,B322 targets: . diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a176097f..f1c04aea 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -222,7 +222,7 @@ lint_format_bandit_checks: python3-pip python3-yaml shellcheck - - $pip install --break-system-packages bandit + - $pip install --break-system-packages bandit pylint-gitlab - export EXITVALUE=0 - function set_error() { export EXITVALUE=1; printf "\x1b[31mERROR `history|tail -2|head -1|cut -b 6-500`\x1b[0m\n"; } - ./hooks/pre-commit || set_error @@ -231,16 +231,21 @@ lint_format_bandit_checks: -ii --ini .bandit || set_error - - pylint --output-format=colorized --reports=n + - pylint --output-format=pylint_gitlab.GitlabCodeClimateReporter fdroid makebuildserver setup.py fdroidserver/*.py tests/*.py + > pylint-report.json || set_error - shellcheck --exclude SC2046,SC2090 --severity=warning --color tests/run-tests || set_error - exit $EXITVALUE + artifacts: + reports: + codequality: pylint-report.json + when: always # Check all the dependencies in Debian to mirror production. CVEs are From 9a8d80ee6bd4234f0e57b3f0fab8efe9649e39ae Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 28 Jan 2025 20:26:54 +0100 Subject: [PATCH 1997/2116] purge dead code: apk_signer_fingerprint_short --- fdroidserver/common.py | 16 ---------------- tests/test_common.py | 12 ------------ 2 files changed, 28 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index f473efd7..cbe084fb 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3410,22 +3410,6 @@ def apk_signer_fingerprint(apk_path): return signer_fingerprint(cert_encoded) -def apk_signer_fingerprint_short(apk_path): - """Get 7 hex digit SHA-256 fingerprint string for the first signer from given APK. - - Parameters - ---------- - apk_path - path to APK - - Returns - ------- - first 7 chars of the standard SHA-256 signer fingerprint - - """ - return apk_signer_fingerprint(apk_path)[:7] - - def metadata_get_sigdir(appid, vercode=None): """Get signature directory for app.""" if vercode: diff --git a/tests/test_common.py b/tests/test_common.py index b9953c71..522367a4 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -794,18 +794,6 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): self.assertEqual(keytoolcertfingerprint, fdroidserver.common.apk_signer_fingerprint(apkfile)) - @unittest.skipIf(sys.byteorder == 'big', 'androguard is not ported to big-endian') - def test_apk_signer_fingerprint_short(self): - - # fingerprints fetched with: keytool -printcert -file ____.RSA - testapks = (('repo/obb.main.oldversion_1444412523.apk', '818e469'), - ('repo/obb.main.twoversions_1101613.apk', '32a2362'), - ('repo/obb.main.twoversions_1101617.apk', '32a2362')) - - for apkfile, keytoolcertfingerprint in testapks: - self.assertEqual(keytoolcertfingerprint, - fdroidserver.common.apk_signer_fingerprint_short(apkfile)) - def test_find_apksigner_system_package_default_path(self): """apksigner should be automatically used from the PATH""" usr_bin_apksigner = '/usr/bin/apksigner' From a011b34b97562cba58e2a45e49417e8f66955adf Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 18 Dec 2024 08:58:23 +0100 Subject: [PATCH 1998/2116] black format and use returncode directly without `!= 0` --- fdroidserver/common.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index cbe084fb..b2127ddf 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3942,11 +3942,13 @@ def compare_apks(apk1, apk2, tmp_dir, log_dir=None): f.extractall(path=os.path.join(apk2dir, 'content')) if set_command_in_config('apktool'): - if subprocess.call([config['apktool'], 'd', absapk1, '--output', 'apktool'], - cwd=apk1dir) != 0: + if subprocess.call( + [config['apktool'], 'd', absapk1, '--output', 'apktool'], cwd=apk1dir + ): return "Failed to run apktool " + apk1 - if subprocess.call([config['apktool'], 'd', absapk2, '--output', 'apktool'], - cwd=apk2dir) != 0: + if subprocess.call( + [config['apktool'], 'd', absapk2, '--output', 'apktool'], cwd=apk2dir + ): return "Failed to run apktool " + apk2 p = FDroidPopen(['diff', '-r', apk1dir, apk2dir], output=False) From e6cff099f2e7f2d2d9b0f4def2e0854c78de36d2 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 1 Apr 2025 11:41:46 +0200 Subject: [PATCH 1999/2116] delete file I mistakenly included --- dev/fdroid_scan-binary.py | 38 -------------------------------------- 1 file changed, 38 deletions(-) delete mode 100644 dev/fdroid_scan-binary.py diff --git a/dev/fdroid_scan-binary.py b/dev/fdroid_scan-binary.py deleted file mode 100644 index 896c2cc4..00000000 --- a/dev/fdroid_scan-binary.py +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env python3 -# -# an fdroid plugin for setting up srclibs -# -# The 'fdroid build' gitlab-ci job uses --on-server, which does not -# set up the srclibs. This plugin does the missing setup. - -import glob -import os -from argparse import ArgumentParser -from fdroidserver import _, common, scanner - - -fdroid_summary = 'Run scanner.scan_binary on APKs' - - -def main(): - parser = ArgumentParser() - common.setup_global_opts(parser) - parser.add_argument("APK", nargs='*', help=_("Path to a signed or unsigned APK.")) - options = common.parse_args(parser) - common.read_config() - if options.APK: - apks = options.APK - else: - apks = glob.glob(os.path.join('unsigned', '*.apk')) - - errors = 0 - for apk in apks: - print('Scanning', apk, '...') - if scanner.scan_binary(apk): - print("ERROR: Found blocklisted packages in:", apk) - errors += 1 - exit(errors) - - -if __name__ == "__main__": - main() From 0d88a94192849d53b375cacc1bee5a55720c79de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 5 Dec 2024 16:56:34 +0100 Subject: [PATCH 2000/2116] metadata: rename srcdir -> srclibs_dir for clarity --- fdroidserver/metadata.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 08d275ae..f5fcffac 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -538,10 +538,10 @@ def read_srclibs(): srclibs = {} - srcdir = Path('srclibs') - srcdir.mkdir(exist_ok=True) + srclibs_dir = Path('srclibs') + srclibs_dir.mkdir(exist_ok=True) - for metadatapath in sorted(srcdir.glob('*.yml')): + for metadatapath in sorted(srclibs_dir.glob('*.yml')): srclibs[metadatapath.stem] = parse_yaml_srclib(metadatapath) From 046c527ee8d056f95f33624501b8784d7782a572 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Mon, 31 Mar 2025 12:13:57 +0200 Subject: [PATCH 2001/2116] vcs_git: clearer error messages for checkrepo() This updates error messages the help identify issues when loading srclibs and fixes pushing srclibs into build vms/containers. --- fdroidserver/common.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index b2127ddf..16731d4f 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1523,10 +1523,15 @@ class vcs_git(vcs): it! This is called as a safety check. """ - p = FDroidPopen(['git', 'rev-parse', '--show-toplevel'], cwd=self.local, output=False) + cmd = ['git', 'rev-parse', '--show-toplevel'] + p = FDroidPopen(cmd, cwd=self.local, output=False) result = p.output.rstrip() + if p.returncode > 0: + raise VCSException( + f"error: `{' '.join(cmd)}` failed, (in '{os.path.abspath(self.local)}') {result}" + ) if Path(result) != Path(self.local).resolve(): - raise VCSException('Repository mismatch') + raise VCSException(f"Repository mismatch ('{self.local}' != '{result}')") def gotorevisionx(self, rev): if not os.path.exists(self.local): From 69f9f52ba225cf3a27d75d38b158457d828c7a6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Wed, 2 Apr 2025 12:29:26 +0000 Subject: [PATCH 2002/2116] drop error prefix when raising VCSException in case retrieving git revision failed --- fdroidserver/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 16731d4f..4a30bb6b 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1528,7 +1528,7 @@ class vcs_git(vcs): result = p.output.rstrip() if p.returncode > 0: raise VCSException( - f"error: `{' '.join(cmd)}` failed, (in '{os.path.abspath(self.local)}') {result}" + f"`{' '.join(cmd)}` failed, (in '{os.path.abspath(self.local)}') {result}" ) if Path(result) != Path(self.local).resolve(): raise VCSException(f"Repository mismatch ('{self.local}' != '{result}')") From a13dd109d35d4d33dddef3684b02d6b5be5c524a Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 9 Apr 2025 14:51:27 +0800 Subject: [PATCH 2003/2116] checkupdates: adjust log level --- fdroidserver/checkupdates.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 60e22347..755fa7e5 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -724,7 +724,7 @@ def checkout_appid_branch(appid): try: git_repo.remotes.origin.fetch(f'{appid}:refs/remotes/origin/{appid}') except Exception as e: - logging.warning('"%s" branch not found on origin remote:\n\t%s', appid, e) + logging.debug('"%s" branch not found on origin remote:\n\t%s', appid, e) if appid in git_repo.remotes.origin.refs: start_point = f"origin/{appid}" for commit in git_repo.iter_commits( @@ -838,12 +838,12 @@ def push_commits(branch_name='checkupdates', verbose=False): if progress: for line in progress.other_lines: if line.startswith('remote:'): - logging.debug(line) + logging.info(line) raise FDroidException( f'{remote.url} push failed: {pushinfo.flags} {pushinfo.summary}' ) else: - logging.debug(remote.url + ': ' + pushinfo.summary) + logging.info(remote.url + ': ' + pushinfo.summary) def prune_empty_appid_branches(git_repo=None, main_branch='main'): From aa9cc1499109d057100a563610ec5309db599b99 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 Mar 2025 17:53:05 +0100 Subject: [PATCH 2004/2116] gitlab-ci: refactor to rules: and ditch old only: syntax Adding workflow: is required, otherwise there would be duplicate pipelines for all users in the @fdroid group. There would be "branch pipelines" and "merge request pipelines". Confusingly, only jobs with rules: get duplicated. --- .gitlab-ci.yml | 96 ++++++++++++++++++++++++++------------------------ 1 file changed, 49 insertions(+), 47 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f1c04aea..c1c05989 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,5 +1,16 @@ --- +# Use merge request pipelines when a merge request is open for the branch. +# Use branch pipelines when a merge request is not open for the branch. +# https://docs.gitlab.com/ci/yaml/workflow/#switch-between-branch-pipelines-and-merge-request-pipelines +workflow: + rules: + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' + - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS + when: never + - if: $CI_COMMIT_BRANCH + + variables: pip: pip3 --timeout 100 --retries 10 # speed up git checkout phase @@ -94,8 +105,8 @@ metadata_v0: debian_testing: image: debian:testing <<: *apt-template - only: - - master@fdroid/fdroidserver + rules: + - if: $CI_COMMIT_BRANCH == "master" && $CI_PROJECT_PATH == "fdroid/fdroidserver" script: - apt-get install aapt @@ -123,8 +134,8 @@ debian_testing: ubuntu_lts_ppa: image: ubuntu:latest <<: *apt-template - only: - - master@fdroid/fdroidserver + rules: + - if: $CI_COMMIT_BRANCH == "master" && $CI_PROJECT_PATH == "fdroid/fdroidserver" script: - export ANDROID_HOME=/usr/lib/android-sdk - apt-get install gnupg @@ -188,11 +199,11 @@ ubuntu_jammy_pip: gradlew-fdroid: image: debian:bookworm-slim <<: *apt-template - only: - changes: - - .gitlab-ci.yml - - gradlew-fdroid - - tests/test_gradlew-fdroid + rules: + - changes: + - .gitlab-ci.yml + - gradlew-fdroid + - tests/test_gradlew-fdroid script: - apt-get install ca-certificates curl default-jdk-headless shellcheck unzip - shellcheck --severity=error --color gradlew-fdroid tests/test_gradlew-fdroid @@ -255,10 +266,7 @@ lint_format_bandit_checks: safety: image: debian:bookworm-slim rules: - # once only:/changes: are ported to rules:, this could be removed: - - if: $CI_PIPELINE_SOURCE == "merge_request_event" - when: never - - if: $CI_PIPELINE_SOURCE == "push" && $SAFETY_API_KEY + - if: $SAFETY_API_KEY changes: - .gitlab-ci.yml - .safety-policy.yml @@ -283,11 +291,7 @@ safety: yamllint: image: debian:bookworm-slim rules: - # once only:/changes: are ported to rules:, this could be removed: - - if: $CI_PIPELINE_SOURCE == "merge_request_event" - when: never - - if: $CI_PIPELINE_SOURCE == "push" - changes: + - changes: - .gitlab-ci.yml - .safety-policy.yml - .yamllint @@ -308,7 +312,6 @@ yamllint: tests/*/*/.*.yml -# Run all the various linters and static analysis tools. locales: image: debian:bookworm-slim variables: @@ -380,8 +383,8 @@ fedora_latest: macOS: tags: - saas-macos-medium-m1 - only: - - master@fdroid/fdroidserver + rules: + - if: $CI_COMMIT_BRANCH == "master" && $CI_PROJECT_PATH == "fdroid/fdroidserver" script: - export HOMEBREW_CURL_RETRIES=10 - brew update > /dev/null @@ -446,16 +449,16 @@ gradle: # Run an actual build in a simple, faked version of the buildserver guest VM. fdroid build: image: registry.gitlab.com/fdroid/fdroidserver:buildserver - only: - changes: - - .gitlab-ci.yml - - fdroidserver/build.py - - fdroidserver/common.py - - fdroidserver/exception.py - - fdroidserver/metadata.py - - fdroidserver/net.py - - fdroidserver/scanner.py - - fdroidserver/vmtools.py + rules: + - changes: + - .gitlab-ci.yml + - fdroidserver/build.py + - fdroidserver/common.py + - fdroidserver/exception.py + - fdroidserver/metadata.py + - fdroidserver/net.py + - fdroidserver/scanner.py + - fdroidserver/vmtools.py cache: key: "$CI_JOB_NAME" paths: @@ -516,11 +519,11 @@ fdroid build: plugin_fetchsrclibs: image: debian:bookworm-slim <<: *apt-template - only: - changes: - - .gitlab-ci.yml - - examples/fdroid_fetchsrclibs.py - - fdroidserver/__main__.py + rules: + - changes: + - .gitlab-ci.yml + - examples/fdroid_fetchsrclibs.py + - fdroidserver/__main__.py script: - apt-get install curl @@ -560,8 +563,8 @@ plugin_fetchsrclibs: servergitmirrors: image: debian:bookworm-slim <<: *apt-template - only: - - master@fdroid/fdroidserver + rules: + - if: $CI_COMMIT_BRANCH == "master" && $CI_PROJECT_PATH == "fdroid/fdroidserver" script: - apt-get install default-jdk-headless @@ -622,8 +625,8 @@ Build documentation: Windows: tags: - windows - only: - - windows + rules: + - if: $CI_COMMIT_BRANCH == "windows" script: - Import-Module "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1" - choco install --no-progress -y git --force --params "/GitAndUnixToolsOnPath" @@ -686,13 +689,12 @@ pages: docker: dependencies: - fdroid build - only: - changes: - - .gitlab-ci.yml - - makebuildserver - - buildserver/* - variables: - - $CI_COMMIT_BRANCH == "master" || $CI_PROJECT_NAMESPACE != "fdroid" + rules: + - if: $CI_COMMIT_BRANCH == "master" && $CI_PROJECT_PATH == "fdroid/fdroidserver" + changes: + - .gitlab-ci.yml + - makebuildserver + - buildserver/* image: docker:dind services: - docker:dind From 3b9d39ac614a31f554b3d7231957740fc5472bec Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 Mar 2025 18:21:09 +0100 Subject: [PATCH 2005/2116] gitlab-ci: move shellcheck to own job fenced by changes: --- .gitlab-ci.yml | 29 ++++++++++++++++++++++++----- hooks/install-hooks.sh | 2 +- hooks/pre-commit | 4 ++-- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c1c05989..0bca13ef 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -205,8 +205,7 @@ gradlew-fdroid: - gradlew-fdroid - tests/test_gradlew-fdroid script: - - apt-get install ca-certificates curl default-jdk-headless shellcheck unzip - - shellcheck --severity=error --color gradlew-fdroid tests/test_gradlew-fdroid + - apt-get install ca-certificates curl default-jdk-headless unzip - ./tests/test_gradlew-fdroid @@ -232,7 +231,6 @@ lint_format_bandit_checks: python3-nose python3-pip python3-yaml - shellcheck - $pip install --break-system-packages bandit pylint-gitlab - export EXITVALUE=0 - function set_error() { export EXITVALUE=1; printf "\x1b[31mERROR `history|tail -2|head -1|cut -b 6-500`\x1b[0m\n"; } @@ -250,8 +248,6 @@ lint_format_bandit_checks: tests/*.py > pylint-report.json || set_error - - shellcheck --exclude SC2046,SC2090 --severity=warning --color tests/run-tests - || set_error - exit $EXITVALUE artifacts: reports: @@ -259,6 +255,29 @@ lint_format_bandit_checks: when: always +shellcheck: + image: debian:bookworm-slim + rules: + - changes: + - .gitlab-ci.yml + - gradlew-fdroid + - hooks/install-hooks.sh + - hooks/pre-commit + - tests/run-tests + - tests/test_gradlew-fdroid + <<: *apt-template + script: + - apt-get install shellcheck + # TODO GitLab Code Quality report https://github.com/koalaman/shellcheck/issues/3155 + - shellcheck --exclude SC2046,SC2090 --severity=warning --color + hooks/install-hooks.sh + hooks/pre-commit + tests/run-tests + # TODO make the gradlew things pass the standard above + - shellcheck --severity=error --color + gradlew-fdroid + tests/test_gradlew-fdroid + # Check all the dependencies in Debian to mirror production. CVEs are # generally fixed in the latest versions in pip/pypi.org, so it isn't # so important to scan that kind of install in CI. diff --git a/hooks/install-hooks.sh b/hooks/install-hooks.sh index 69b314d4..e266301b 100755 --- a/hooks/install-hooks.sh +++ b/hooks/install-hooks.sh @@ -2,7 +2,7 @@ # # Install all the client hooks -BASE_DIR="$(cd $(dirname $0); pwd -P)" +BASE_DIR="$(cd $(dirname $0) || exit; pwd -P)" HOOK_NAMES="applypatch-msg pre-applypatch post-applypatch pre-commit prepare-commit-msg commit-msg post-commit pre-rebase post-checkout post-merge pre-receive update post-receive post-update pre-auto-gc" HOOK_DIR="$(git rev-parse --show-toplevel)/.git/hooks" diff --git a/hooks/pre-commit b/hooks/pre-commit index c0859570..039c1b65 100755 --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -36,7 +36,7 @@ else *.rb) RB_FILES+=" $f" ;; - *.yml|.*.yml|.yamllint) + *.yml|*.yaml|.yamllint) YML_FILES+=" $f" ;; *) @@ -66,7 +66,7 @@ cmd_exists() { } find_command() { - for name in $@; do + for name in "$@"; do for suff in "3" "-3" "-python3" ""; do cmd=${name}${suff} if cmd_exists $cmd; then From 3e67bee0378a60a260645bc4018f88aa45422d73 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 26 Mar 2025 22:19:15 +0100 Subject: [PATCH 2006/2116] gitlab-ci: move pylint to its own job --- .gitlab-ci.yml | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0bca13ef..c058e9a1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -97,6 +97,17 @@ metadata_v0: - rm /etc/apt/apt.conf.d/99nocacertificates - apt-get dist-upgrade +# For jobs that only need to run when there are changes to Python files. +.python-rules-changes: &python-rules-changes + rules: + - changes: + - .gitlab-ci.yml + - fdroid + - makebuildserver + - setup.py + - fdroidserver/*.py + - tests/*.py + # Since F-Droid uses Debian as its default platform, from production # servers to CI to contributor machines, it is important to know when @@ -225,13 +236,12 @@ lint_format_bandit_checks: make pycodestyle pyflakes3 - pylint python3-dev python3-git python3-nose python3-pip python3-yaml - - $pip install --break-system-packages bandit pylint-gitlab + - $pip install --break-system-packages bandit - export EXITVALUE=0 - function set_error() { export EXITVALUE=1; printf "\x1b[31mERROR `history|tail -2|head -1|cut -b 6-500`\x1b[0m\n"; } - ./hooks/pre-commit || set_error @@ -240,6 +250,16 @@ lint_format_bandit_checks: -ii --ini .bandit || set_error + - exit $EXITVALUE + + +pylint: + image: debian:bookworm-slim + <<: *python-rules-changes + <<: *apt-template + script: + - apt-get install pylint python3-pip + - $pip install --break-system-packages pylint-gitlab - pylint --output-format=pylint_gitlab.GitlabCodeClimateReporter fdroid makebuildserver @@ -247,8 +267,6 @@ lint_format_bandit_checks: fdroidserver/*.py tests/*.py > pylint-report.json - || set_error - - exit $EXITVALUE artifacts: reports: codequality: pylint-report.json From 6ad79e3c06911a01545db489c231fcb46207b54a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 12 Mar 2025 18:37:42 +0100 Subject: [PATCH 2007/2116] gitlab-ci: move bandit to its own job --- .gitlab-ci.yml | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c058e9a1..e16e2823 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -221,7 +221,7 @@ gradlew-fdroid: # Run all the various linters and static analysis tools. -lint_format_bandit_checks: +hooks/pre-commit: image: debian:bookworm-slim variables: LANG: C.UTF-8 @@ -241,17 +241,16 @@ lint_format_bandit_checks: python3-nose python3-pip python3-yaml - - $pip install --break-system-packages bandit - - export EXITVALUE=0 - - function set_error() { export EXITVALUE=1; printf "\x1b[31mERROR `history|tail -2|head -1|cut -b 6-500`\x1b[0m\n"; } - - ./hooks/pre-commit || set_error - - bandit - -r - -ii - --ini .bandit - || set_error - - exit $EXITVALUE + - ./hooks/pre-commit +bandit: + image: debian:bookworm-slim + <<: *python-rules-changes + <<: *apt-template + script: + - apt-get install python3-pip + - $pip install --break-system-packages bandit + - bandit -r -ii --ini .bandit pylint: image: debian:bookworm-slim From 7f67a882e74c152221bc7ecf29c3af1a7312f466 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 27 Mar 2025 01:45:22 +0100 Subject: [PATCH 2008/2116] gitlab-ci: only run Python-only jobs when .py files change --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e16e2823..d648aa6a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -642,6 +642,7 @@ servergitmirrors: Build documentation: image: debian:bookworm-slim + <<: *python-rules-changes <<: *apt-template script: - apt-get install make python3-sphinx python3-numpydoc python3-pydata-sphinx-theme pydocstyle fdroidserver @@ -758,6 +759,7 @@ docker: # PUBLISH is the signing server. It has a very minimal manual setup. PUBLISH: image: debian:bullseye-backports + <<: *python-rules-changes script: - apt-get update - apt-get -qy upgrade From 9bcd13bfddea8ff88c0eb54737adc7f5762cec8f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 27 Mar 2025 02:33:40 +0100 Subject: [PATCH 2009/2116] gitlab-ci: add "lint" pre-stage before default "test" stage --- .gitlab-ci.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d648aa6a..0f5cf3f7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -11,6 +11,12 @@ workflow: - if: $CI_COMMIT_BRANCH +stages: + - lint + - test # default for jobs that do not specify stage: + - deploy + + variables: pip: pip3 --timeout 100 --retries 10 # speed up git checkout phase @@ -222,6 +228,7 @@ gradlew-fdroid: # Run all the various linters and static analysis tools. hooks/pre-commit: + stage: lint image: debian:bookworm-slim variables: LANG: C.UTF-8 @@ -253,6 +260,7 @@ bandit: - bandit -r -ii --ini .bandit pylint: + stage: lint image: debian:bookworm-slim <<: *python-rules-changes <<: *apt-template @@ -273,6 +281,7 @@ pylint: shellcheck: + stage: lint image: debian:bookworm-slim rules: - changes: @@ -325,6 +334,7 @@ safety: # TODO tests/*/*/*.yaml are not covered yamllint: + stage: lint image: debian:bookworm-slim rules: - changes: @@ -349,6 +359,7 @@ yamllint: locales: + stage: lint image: debian:bookworm-slim variables: LANG: C.UTF-8 @@ -367,6 +378,7 @@ locales: black: + stage: lint image: debian:bookworm-slim <<: *apt-template script: From 2aba6fd32427ecdc8cfa5b3d5b867a15f76d0d78 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 9 Apr 2025 17:17:21 +0800 Subject: [PATCH 2010/2116] checkupdates: always print remote message of git push --- fdroidserver/checkupdates.py | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 755fa7e5..dffe21ad 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -749,7 +749,7 @@ def get_changes_versus_ref(git_repo, ref, f): return changes -def push_commits(branch_name='checkupdates', verbose=False): +def push_commits(branch_name='checkupdates'): """Make git branch then push commits as merge request. The appid is parsed from the actual file that was changed so that @@ -806,21 +806,10 @@ def push_commits(branch_name='checkupdates', verbose=False): if current_version_only: push_options.append('merge_request.draft') - progress = None - if verbose: - import clint.textui - - progress_bar = clint.textui.progress.Bar() - - class MyProgressPrinter(git.RemoteProgress): - def update(self, op_code, current, maximum=None, message=None): - if isinstance(maximum, float): - progress_bar.show(current, maximum) - - progress = MyProgressPrinter() + progress = git.RemoteProgress() pushinfos = remote.push( - branch_name, + f"{branch_name}:{branch_name}", progress=progress, force=True, set_upstream=True, @@ -828,17 +817,17 @@ def push_commits(branch_name='checkupdates', verbose=False): ) for pushinfo in pushinfos: + logging.info(pushinfo.summary) + # Show potentially useful messages from git remote + if progress: + for line in progress.other_lines: + logging.info(line) if pushinfo.flags & ( git.remote.PushInfo.ERROR | git.remote.PushInfo.REJECTED | git.remote.PushInfo.REMOTE_FAILURE | git.remote.PushInfo.REMOTE_REJECTED ): - # Show potentially useful messages from git remote - if progress: - for line in progress.other_lines: - if line.startswith('remote:'): - logging.info(line) raise FDroidException( f'{remote.url} push failed: {pushinfo.flags} {pushinfo.summary}' ) @@ -953,7 +942,7 @@ def main(): exit_code = 1 if options.appid and options.merge_request: - push_commits(verbose=options.verbose) + push_commits() prune_empty_appid_branches() status_update_json(processed, failed) From 029636ed6129c578eac10536e0e2ce1744dba83c Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 18 Dec 2024 12:39:48 +0100 Subject: [PATCH 2011/2116] verify: write verified.json in function to ease testing --- fdroidserver/verify.py | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/fdroidserver/verify.py b/fdroidserver/verify.py index 63540147..8246bcae 100644 --- a/fdroidserver/verify.py +++ b/fdroidserver/verify.py @@ -145,22 +145,26 @@ def write_json_report(url, remote_apk, unsigned_apk, compare_result): json.dump(data, fp, sort_keys=True) if output['verified']: - jsonfile = 'unsigned/verified.json' - data = get_verified_json(jsonfile) - packageName = output['local']['packageName'] + write_verified_json(output) - if packageName not in data['packages']: - data['packages'][packageName] = [] - found = False - output_dump = json.dumps(output, sort_keys=True) - for p in data['packages'][packageName]: - if output_dump == json.dumps(p, sort_keys=True): - found = True - break - if not found: - data['packages'][packageName].insert(0, json.loads(output_dump)) - with open(jsonfile, 'w') as fp: - json.dump(data, fp, cls=common.Encoder, sort_keys=True) + +def write_verified_json(output): + jsonfile = 'unsigned/verified.json' + data = get_verified_json(jsonfile) + packageName = output['local']['packageName'] + + if packageName not in data['packages']: + data['packages'][packageName] = [] + found = False + output_dump = json.dumps(output, sort_keys=True) + for p in data['packages'][packageName]: + if output_dump == json.dumps(p, sort_keys=True): + found = True + break + if not found: + data['packages'][packageName].insert(0, json.loads(output_dump)) + with open(jsonfile, 'w') as fp: + json.dump(data, fp, cls=common.Encoder, sort_keys=True) def main(): From 17e5a59704c8b8ed3de3d1297105adc58c97bc25 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 18 Dec 2024 16:08:59 +0100 Subject: [PATCH 2012/2116] verify: generate .json files that list all reports --- fdroidserver/verify.py | 17 +++++++++++++++ tests/test_verify.py | 47 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/fdroidserver/verify.py b/fdroidserver/verify.py index 8246bcae..46963bb4 100644 --- a/fdroidserver/verify.py +++ b/fdroidserver/verify.py @@ -144,6 +144,23 @@ def write_json_report(url, remote_apk, unsigned_apk, compare_result): with open(jsonfile, 'w') as fp: json.dump(data, fp, sort_keys=True) + appid, version_code = os.path.basename(unsigned_apk[:-4]).rsplit('_', 1) + appid_base = unsigned_apk.rsplit('_', 1)[0] + apkReports = sorted( + glob.glob(f'{appid_base}_[0-9]*.json'), # don't include .json + key=lambda s: int(s[:-9].rsplit('_', 1)[1]), # numeric sort by versionCode + ) + with open(apkReports[-1]) as fp: + reports = json.load(fp) + appid_output = {'apkReports': apkReports} + most_recent = 0 + for report_time, run in reports.items(): + if float(report_time) > most_recent: + most_recent = float(report_time) + appid_output['lastRunVerified'] = run['verified'] + with open(f'{appid_base}.json', 'w') as fp: + json.dump(appid_output, fp, cls=common.Encoder, sort_keys=True) + if output['verified']: write_verified_json(output) diff --git a/tests/test_verify.py b/tests/test_verify.py index adb24b29..f9da9092 100755 --- a/tests/test_verify.py +++ b/tests/test_verify.py @@ -122,3 +122,50 @@ class VerifyTest(unittest.TestCase): secondpass = json.load(fp) self.assertEqual(firstpass, secondpass) + + @patch('fdroidserver.common.sha256sum') + @patch('fdroidserver.verify.write_verified_json', lambda s: s) + def test_write_json_report_appid_json(self, sha256sum): + sha256sum.return_value = ( + '70c2f776a2bac38a58a7d521f96ee0414c6f0fb1de973c3ca8b10862a009247d' + ) + os.mkdir('tmp') + os.mkdir('unsigned') + appid = 'com.politedroid' + apk_name = f'{appid}_6.apk' + remote_apk = 'tmp/' + apk_name + unsigned_apk = 'unsigned/' + apk_name + shutil.copy(basedir / 'repo' / apk_name, remote_apk) + shutil.copy(basedir / 'repo' / apk_name, unsigned_apk) + url = TEST_APP_ENTRY['1539780240.3885746']['url'] + with open(f'unsigned/{apk_name}.json', 'w') as fp: + json.dump(TEST_APP_ENTRY, fp) + + # make a fake existing report where the newer one broke verifiability + with open(f'unsigned/{appid}_16.apk.json', 'w') as fp: + json.dump( + { + "1444444444.4444444": { + 'local': {'versionCode': 16}, + 'verified': False, + }, + "1333333333.3333333": { + 'local': {'versionCode': 16}, + 'verified': True, + }, + }, + fp, + ) + + verify.write_json_report(url, remote_apk, unsigned_apk, {'fake': 'fail'}) + with open(f'unsigned/{appid}.json') as fp: + self.assertEqual( + { + 'apkReports': [ + 'unsigned/com.politedroid_6.apk.json', + 'unsigned/com.politedroid_16.apk.json', + ], + 'lastRunVerified': False, + }, + json.load(fp), + ) From c4d46a187f7fc90a7b36bf18aef504dbccd257f7 Mon Sep 17 00:00:00 2001 From: Benson Muite Date: Sat, 12 Apr 2025 09:43:11 +0000 Subject: [PATCH 2013/2116] Clarify libmagic needs to be installed separately See installation instructions at https://pypi.org/project/python-magic/ --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 377c2409..289cd8c1 100755 --- a/setup.py +++ b/setup.py @@ -116,7 +116,7 @@ setup( # Some requires are only needed for very limited cases: # * biplist is only used for parsing Apple .ipa files # * pycountry is only for linting config/mirrors.yml - # * python-magic is preferred when libmagic is available, but its not in pypi.org + # * python-magic is preferred when the C library libmagic is installed extras_require={ 'optional': [ 'biplist', From 56338cd7d0f7f9f0c807f37c31a932babcd4d187 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 14 Apr 2025 18:53:50 +0200 Subject: [PATCH 2014/2116] repo_key_sha256 to list of valid config keys fdroidserver!287 --- fdroidserver/lint.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index 6a4299bd..cb5ead84 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -274,6 +274,7 @@ check_config_keys = ( 'repo', 'repo_description', 'repo_icon', + 'repo_key_sha256', 'repo_keyalias', 'repo_maxage', 'repo_name', From 004103357bd85a68763ebb3ef06ed2d283f723d9 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 14 Apr 2025 19:28:56 +0200 Subject: [PATCH 2015/2116] gitlab-ci: metadata_v0 test expects no config --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0f5cf3f7..e4d922d0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -67,6 +67,7 @@ metadata_v0: - git checkout $RELEASE_COMMIT_ID - cd .. - git clone --depth 1 https://gitlab.com/fdroid/fdroiddata.git + - rm -f fdroiddata/config.yml # ignore config for this test - cd fdroiddata - ../tests/dump_internal_metadata_format.py - cd .. From 2a33857fd0509d5be00bc78d49290c7339acc181 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 15 Apr 2025 18:52:31 +0200 Subject: [PATCH 2016/2116] update: include stages timing info in update.json !1627 missed this, so stages only get included in running.json. That means the stages info is only visible while update is running, making it hard to use. --- fdroidserver/update.py | 5 ++--- tests/test_update.py | 6 +++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 4e5aad9e..9df02e54 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -133,7 +133,7 @@ def disabled_algorithms_allowed(): or common.default_config['allow_disabled_algorithms']) -def status_update_json(apps, apks): +def status_update_json(output, apps, apks): """Output a JSON file with metadata about this `fdroid update` run. Parameters @@ -145,7 +145,6 @@ def status_update_json(apps, apks): """ logging.debug(_('Outputting JSON')) - output = common.setup_status_output(start_timestamp) output['antiFeatures'] = dict() output['disabled'] = [] output['archivePolicy0'] = [] @@ -2801,7 +2800,7 @@ def main(): output_status_stage(status_output, 'make_binary_transparency_log') btlog.make_binary_transparency_log(repodirs) - status_update_json(apps, apks + archapks) + status_update_json(status_output, apps, apks + archapks) logging.info(_("Finished")) diff --git a/tests/test_update.py b/tests/test_update.py index dfe353b5..59dca6e1 100755 --- a/tests/test_update.py +++ b/tests/test_update.py @@ -1639,7 +1639,7 @@ class UpdateTest(unittest.TestCase): with mkdtemp() as tmpdir: os.chdir(tmpdir) with mock.patch('sys.argv', ['fdroid update', '']): - fdroidserver.update.status_update_json([], []) + fdroidserver.update.status_update_json({}, [], []) with open('repo/status/update.json') as fp: data = json.load(fp) self.assertTrue('apksigner' in data) @@ -1647,14 +1647,14 @@ class UpdateTest(unittest.TestCase): fdroidserver.update.config = { 'apksigner': 'apksigner', } - fdroidserver.update.status_update_json([], []) + fdroidserver.update.status_update_json({}, [], []) with open('repo/status/update.json') as fp: data = json.load(fp) self.assertEqual(shutil.which(fdroidserver.update.config['apksigner']), data['apksigner']) fdroidserver.update.config = {} fdroidserver.common.fill_config_defaults(fdroidserver.update.config) - fdroidserver.update.status_update_json([], []) + fdroidserver.update.status_update_json({}, [], []) with open('repo/status/update.json') as fp: data = json.load(fp) self.assertEqual(fdroidserver.update.config.get('apksigner'), data['apksigner']) From b93fc6f9da0c1821fa84f48ace48ffd9e688b810 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sat, 26 Apr 2025 14:41:27 +0800 Subject: [PATCH 2017/2116] gradle v8.14 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 1fdc68c2..7ca2830d 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -210,6 +210,7 @@ get_sha() { '8.12') echo '7a00d51fb93147819aab76024feece20b6b84e420694101f276be952e08bef03' ;; '8.12.1') echo '8d97a97984f6cbd2b85fe4c60a743440a347544bf18818048e611f5288d46c94' ;; '8.13') echo '20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78' ;; + '8.14') echo '61ad310d3c7d3e5da131b76bbf22b5a4c0786e9d892dae8c1658d4b484de3caa' ;; *) exit 1 esac } @@ -230,7 +231,7 @@ d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2 7.1 7.0 4.2 4.1 4.0 3.6 d_plugin_min_gradle_v=(8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.13 8.12.1 8.12 8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.14 8.13 8.12.1 8.12 8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From b83c1aace3776c4e7d5646dd5a920ed4cfe80d52 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Mon, 28 Apr 2025 08:38:54 +0200 Subject: [PATCH 2018/2116] Make v2 localized config optional Fixes: Traceback (most recent call last): File "/home/fdroid/fdroidserver/fdroid", line 22, in fdroidserver.__main__.main() File "/home/fdroid/fdroidserver/fdroidserver/__main__.py", line 222, in main raise e File "/home/fdroid/fdroidserver/fdroidserver/__main__.py", line 203, in main mod.main() File "/home/fdroid/fdroidserver/fdroidserver/update.py", line 2774, in main fdroidserver.index.make(archived_apps, archapks, repodirs[1], True) File "/home/fdroid/fdroidserver/fdroidserver/index.py", line 132, in make make_v2( File "/home/fdroid/fdroidserver/fdroidserver/index.py", line 728, in make_v2 output["repo"] = v2_repo(repodict, repodir, archive) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/fdroid/fdroidserver/fdroidserver/index.py", line 686, in v2_repo repo["icon"] = config["archive" if archive else "repo"]["icon"] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^ KeyError: 'icon' --- fdroidserver/index.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 6df110dd..fb1c4279 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -681,9 +681,13 @@ def v2_repo(repodict, repodir, archive): config = common.load_localized_config(CONFIG_CONFIG_NAME, repodir) if config: - repo["name"] = config["archive" if archive else "repo"]["name"] - repo["description"] = config["archive" if archive else "repo"]["description"] - repo["icon"] = config["archive" if archive else "repo"]["icon"] + localized_config = config["archive" if archive else "repo"] + if "name" in localized_config: + repo["name"] = localized_config["name"] + if "description" in localized_config: + repo["description"] = localized_config["description"] + if "icon" in localized_config: + repo["icon"] = localized_config["icon"] repo["address"] = repodict["address"] if "mirrors" in repodict: From 7924888e5ae062e1a0407b2e4c7ceaa5bbd47308 Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Thu, 8 May 2025 12:13:25 +0000 Subject: [PATCH 2019/2116] Use latest Bookworm images for makebuildserver --- makebuildserver | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/makebuildserver b/makebuildserver index a4a27060..34962ca7 100755 --- a/makebuildserver +++ b/makebuildserver @@ -48,17 +48,17 @@ logging.basicConfig(format=logformat, level=loglevel) tail = None BASEBOX_DEFAULT = 'debian/bookworm64' -BASEBOX_VERSION_DEFAULT = "12.20241217.1" +BASEBOX_VERSION_DEFAULT = "12.20250126.1" BASEBOX_CHECKSUMS = { - "12.20241217.1": { + "12.20250126.1": { "libvirt": { - "box.img": "7cda96dd706fe5c4eba8210abc944b047842ee6655167933cb7d5ea99cb962bb", + "box.img": "64eb111ab8b0785253c7542caaa7f560d4532b8133266ec94804882d209017d3", "Vagrantfile": "f9c6fcbb47a4d0d33eb066859c8e87efd642287a638bd7da69a9e7a6f25fec47", "metadata.json": "20dc0268a79410dbf01c7e544ba5138f6f695a298b53c56c87a25f68c5031173", }, "virtualbox": { - "box.ovf": "abc34993d37a85a9f89506621bdb3e2cb11eda7c7f6b2d19de9e866264031532", - "box.vmdk": "62a2991aa9543b64cc273c545dc2403adf844644253c9fe162632030c4dd21c4", + "box.ovf": "d8493bdfc4c42b5f66b815efe2a90d20b639eb2ce12cc8c7c51a3039674d146a", + "box.vmdk": "6927001058f57b325544c399297c41ec9c6fbfc21cb764b58f2ff0495864a4fa", "Vagrantfile": "0bbc2ae97668d8da27ab97b766752dcd0bf9e41900e21057de15a58ee7fae47d", "metadata.json": "ffdaa989f2f6932cd8042e1102371f405cc7ad38e324210a1326192e4689e83a", } From f2faeca949ec83698b14f64549c05da06afe8182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=93=D0=BE=D1=80?= =?UTF-8?q?=D0=BF=D0=B8=D0=BD=D1=96=D1=87?= Date: Sun, 11 May 2025 16:14:11 +0200 Subject: [PATCH 2020/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Ukrai?= =?UTF-8?q?nian=20(uk)=20by=20=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20?= =?UTF-8?q?=D0=93=D0=BE=D1=80=D0=BF=D0=B8=D0=BD=D1=96=D1=87=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (579 of 579 strings) Co-authored-by: Максим Горпиніч Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 9a4a57f9..17b061f4 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -18,8 +18,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2025-03-24 14:02+0000\n" -"Last-Translator: Ihor Hordiichuk \n" +"PO-Revision-Date: 2025-03-25 12:11+0000\n" +"Last-Translator: Максим Горпиніч \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" @@ -1478,7 +1478,7 @@ msgstr "Оновлення та кешування правил і сигнат #: ../fdroidserver/publish.py #, python-brace-format msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." -msgstr "" +msgstr "Відмова підписати '{path}', файл існує в папках {dir1} і {dir2}." #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." From 858edaaa4d4907d60e56c2a1066357d07f470581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Sun, 11 May 2025 16:14:12 +0200 Subject: [PATCH 2021/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Chine?= =?UTF-8?q?se=20(Simplified=20Han=20script)=20(zh=5FHans)=20by=20=E5=A4=A7?= =?UTF-8?q?=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1=E5=B1=B1=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (579 of 579 strings) Co-authored-by: 大王叫我来巡山 Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/zh_Hans/ Translation: F-Droid/F-Droid Server --- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 918404df..952e4838 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -40,7 +40,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2025-03-21 03:03+0000\n" +"PO-Revision-Date: 2025-03-26 10:00+0000\n" "Last-Translator: 大王叫我来巡山 \n" "Language-Team: Chinese (Simplified Han script) \n" "Language: zh_Hans\n" @@ -1498,7 +1498,7 @@ msgstr "刷新和缓存来自网络的扫描程序规则和签名" #: ../fdroidserver/publish.py #, python-brace-format msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." -msgstr "" +msgstr "拒绝签署 '{path}',文件同时存在于文件夹 {dir1} 和 {dir2}。" #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." From 22af55fb6d523e6f97774f262d1a71e017159e33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20R=C3=BCckert?= Date: Sun, 11 May 2025 16:14:12 +0200 Subject: [PATCH 2022/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Portu?= =?UTF-8?q?guese=20(Brazil)=20(pt=5FBR)=20by=20Igor=20R=C3=BCckert=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (579 of 579 strings) Co-authored-by: Igor Rückert Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_BR/ Translation: F-Droid/F-Droid Server --- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 4ae99353..53b8a080 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -20,8 +20,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2025-03-21 18:43+0000\n" -"Last-Translator: LucasMZ \n" +"PO-Revision-Date: 2025-03-26 10:00+0000\n" +"Last-Translator: Igor Rückert \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" @@ -1479,7 +1479,7 @@ msgstr "Atualizar e armazenar em cache regras e assinaturas do scanner da rede" #: ../fdroidserver/publish.py #, python-brace-format msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." -msgstr "" +msgstr "Recusando assinar '{path}', o arquivo existe nas pastas {dir1} e {dir2}." #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." From 13166fce05a6c2f5977e22fd58e6b2adb8c6e739 Mon Sep 17 00:00:00 2001 From: VfBFan Date: Sun, 11 May 2025 16:14:12 +0200 Subject: [PATCH 2023/2116] Translated using Weblate: German (de) by VfBFan Currently translated at 100.0% (579 of 579 strings) Co-authored-by: VfBFan Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 98b0aed3..fb5a2c63 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -27,7 +27,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2025-03-21 08:45+0000\n" +"PO-Revision-Date: 2025-03-26 10:00+0000\n" "Last-Translator: VfBFan \n" "Language-Team: German \n" "Language: de\n" @@ -519,7 +519,7 @@ msgstr "Erstelle Ausgabeverzeichnis" #: ../fdroidserver/index.py msgid "Creating signed index with this key (SHA256):" -msgstr "Signierter Index mit diesem Schlüssel (SHA256) wird erstellt:" +msgstr "Signierter Index wird mit diesem Schlüssel (SHA256) erstellt:" #: ../fdroidserver/publish.py ../fdroidserver/verify.py msgid "Creating temporary directory" @@ -532,7 +532,7 @@ msgstr "Unsignierter Index zur Vorbereitung der Signierung wird erstellt" #: ../fdroidserver/lint.py #, python-brace-format msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" -msgstr "CurrentVersionCode {cv} ist kleiner als der älteste Build-Eintrag {versionCode}" +msgstr "CurrentVersionCode {cv} ist niedriger als ältester Build-Eintrag {versionCode}" #: ../fdroidserver/nightly.py msgid "DEBUG_KEYSTORE is not set or the value is incomplete" @@ -866,7 +866,7 @@ msgstr "Ungültige Datei bei %s gefunden" #: ../fdroidserver/deploy.py #, python-brace-format msgid "Found {apkfilename} at {url}" -msgstr "{apkfilename} unter {url} gefunden" +msgstr "{apkfilename} gefunden auf {url}" #: ../fdroidserver/scanner.py #, python-brace-format @@ -930,7 +930,7 @@ msgstr "Wenn ein Git-Mirror zu groß wird, erlaube dem Archiv gelöscht zu werde #: ../fdroidserver/deploy.py #, python-brace-format msgid "If this upload fails, try manually uploading to {url}" -msgstr "Wenn das Hochladen fehlschlägt, versuchen Sie es händisch auf {url} hochzuladen" +msgstr "Wenn das Hochladen fehlschlägt, versuchen Sie ihn manuell auf {url} hochzuladen" #: ../fdroidserver/metadata.py #, python-brace-format @@ -1337,7 +1337,7 @@ msgstr "OpenCollective-Spendenmethoden gehören in das OpenCollective: Feld" #: ../fdroidserver/verify.py msgid "Output JSON report to file named after APK." -msgstr "JSON-Bericht in eine nach der APK benannte Datei ausgeben." +msgstr "In Datei ausgegebener JSON-Bericht wird nach APK benannt." #: ../fdroidserver/scanner.py msgid "Output JSON to stdout." @@ -1557,7 +1557,7 @@ msgstr "Ausführen von wget in {path}" #: ../fdroidserver/index.py #, python-brace-format msgid "SHA-256 of {url} does not match entry!" -msgstr "SHA-256 von {url} stimmt nicht mit Eintrag überein!" +msgstr "SHA-256 der {url} stimmt nicht mit Eintrag überein!" #: ../fdroidserver/build.py msgid "Scan the resulting APK(s) for known non-free classes." @@ -1607,7 +1607,7 @@ msgstr "Einstellen der Uhr auf diese Zeit mit:" #: ../fdroidserver/nightly.py msgid "Set maximum releases in repo before older ones are archived" -msgstr "Setze maximale Veröffentlichungen im Repo bevor ältere archiviert werden" +msgstr "Setze maximale Veröffentlichungen im Repo, bevor ältere archiviert werden" #: ../fdroidserver/build.py #, python-brace-format @@ -1757,7 +1757,7 @@ msgstr "Dieser Befehl sollte niemals verwendet werden, um f-droid.org zu spiegel #: ../fdroidserver/common.py msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." -msgstr "Dies ist eine Paketquelle für Anwendungen, die für die Benutzung zusammen mit F-Droid gedacht ist. Die darin enthaltenen Anwendungen sind entweder offizielle von den Entwicklern erstellte Binärdateien oder werden von f-droid.org mithilfe des Werkzeugs auf https://gitlab.com/fdroid aus dem Quellcode erstellt." +msgstr "Dies ist eine Paketquelle für Anwendungen, die für die Benutzung zusammen mit F-Droid gedacht ist. Die darin enthaltenen Anwendungen sind entweder offizielle von den Entwicklern erstellte Binärdateien oder werden von f-droid.org mithilfe der Werkzeuge auf https://gitlab.com/fdroid aus dem Quellcode erstellt." #: ../fdroidserver/import_subcommand.py #, python-format @@ -2154,7 +2154,7 @@ msgstr "Mehrere Subparser-Argumente sind unzulässig" #: /usr/lib/python3.11/argparse.py #, python-format msgid "cannot merge actions - two groups are named %r" -msgstr "kann keine Aktionen zusammenführen - zwei Gruppen heißen %r" +msgstr "kann keine Aktionen zusammenführen – zwei Gruppen heißen %r" #: ../fdroidserver/nightly.py msgid "cannot publish update, did you set the deploy key?" @@ -2557,7 +2557,7 @@ msgstr "{appid} von {path} ist keine gültige Android-Anwendungs-ID!" #: ../fdroidserver/metadata.py ../fdroidserver/update.py #, python-brace-format msgid "{appid} from {path} is not a valid Java Package Name!" -msgstr "{appid} von {path} ist kein gültiger Java-Paketname!" +msgstr "{appid} aus {path} ist kein gültiger Java-Paketname!" #: ../fdroidserver/update.py #, python-brace-format @@ -2577,7 +2577,7 @@ msgstr "{appid}: unbekannte Extlib {path} im Build '{versionName}'" #: ../fdroidserver/scanner.py #, python-brace-format msgid "{appid}: no builds specified, running on current source state" -msgstr "{appid}: keine builds angegeben, läuft auf dem aktuellen source-Stand" +msgstr "{appid}: Kein Build angegeben; verwende aktuellen Quellen-Stand" #: ../fdroidserver/lint.py #, python-brace-format @@ -2627,7 +2627,7 @@ msgstr "{path} existiert nicht! Erstellen Sie es durch Ausführen von:" #: ../fdroidserver/update.py #, python-brace-format msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" -msgstr "{path} hat die schlechte Dateisignatur \"{pattern}\", möglicher Janus-Exploit!" +msgstr "{path} hat falsche Dateisignatur \"{pattern}\", möglicher Janus-Exploit!" #: ../fdroidserver/deploy.py #, python-brace-format From 0e752f1ef05b5e2784537827268f60035c50d19b Mon Sep 17 00:00:00 2001 From: Ceeee Date: Sun, 11 May 2025 16:14:12 +0200 Subject: [PATCH 2024/2116] Translated using Weblate: German (de) by Ceeee Currently translated at 100.0% (579 of 579 strings) Co-authored-by: Ceeee Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index fb5a2c63..dc69968e 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -13,7 +13,7 @@ # TobiGr , 2021. # FW , 2021. # fossdd , 2021. -# Ceeee , 2021. +# Ceeee , 2021, 2025. # C. Rüdinger , 2021, 2022. # VfBFan , 2021, 2023, 2024, 2025. # Roman Leo , 2021. @@ -28,7 +28,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-03-26 10:00+0000\n" -"Last-Translator: VfBFan \n" +"Last-Translator: Ceeee \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -2528,8 +2528,8 @@ msgstr "ja" #, python-brace-format msgid "{0} app, {1} key aliases" msgid_plural "{0} apps, {1} key aliases" -msgstr[0] "{0} app, {1} Schlüsselaliase" -msgstr[1] "{0} apps, {1} Schlüsselaliase" +msgstr[0] "{0} App, {1} Schlüssel-Aliase" +msgstr[1] "{0} Apps, {1} Schlüssel-Aliase" #: ../fdroidserver/update.py #, python-brace-format From 57ec6a93ed91b0b1109b84a619616e1ef01b8783 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=2E=20R=C3=BCdinger?= Date: Sun, 11 May 2025 16:14:12 +0200 Subject: [PATCH 2025/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Germa?= =?UTF-8?q?n=20(de)=20by=20"C.=20R=C3=BCdinger"=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (579 of 579 strings) Co-authored-by: C. Rüdinger Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index dc69968e..016655dd 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -19,7 +19,7 @@ # Roman Leo , 2021. # Follpvosten , 2021. # ssantos , 2022, 2023, 2024. -# "C. Rüdinger" , 2023. +# "C. Rüdinger" , 2023, 2025. # VfBFan , 2024. # Maxi , 2024. msgid "" @@ -28,7 +28,7 @@ msgstr "" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" "PO-Revision-Date: 2025-03-26 10:00+0000\n" -"Last-Translator: Ceeee \n" +"Last-Translator: \"C. Rüdinger\" \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" @@ -1486,7 +1486,7 @@ msgstr "Aktualisieren und Zwischenspeichern von Scannerregeln und Signaturen aus #: ../fdroidserver/publish.py #, python-brace-format msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." -msgstr "" +msgstr "Eintragen von '{path}' abgelehnt, Datei ist sowohl in Ordner {dir1} als auch {dir2} vorhanden." #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." From cd0b961e3ca8c0861f31d08aaff6ba5c8d4a8bca Mon Sep 17 00:00:00 2001 From: Liner Seven Date: Sun, 11 May 2025 16:14:13 +0200 Subject: [PATCH 2026/2116] Translated using Weblate: Japanese (ja) by Liner Seven Currently translated at 100.0% (579 of 579 strings) Translated using Weblate: Japanese (ja) by Liner Seven Currently translated at 100.0% (579 of 579 strings) Co-authored-by: Liner Seven Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ja/ Translation: F-Droid/F-Droid Server --- locale/ja/LC_MESSAGES/fdroidserver.po | 32 +++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index 1d8629c1..be68cfc4 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2025-02-08 06:22+0000\n" +"PO-Revision-Date: 2025-04-30 04:07+0000\n" "Last-Translator: Liner Seven \n" "Language-Team: Japanese \n" "Language: ja\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.10-dev\n" +"X-Generator: Weblate 5.12-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -43,7 +43,7 @@ msgstr "「\"%s/」に合致するメタデータのファイルはありませ #: ../fdroidserver/index.py msgid "\"isPrimary\" key should not be added to mirrors!" -msgstr "" +msgstr "\"isPrimary\" キーはミラーに追加すべきではありません!" #: ../fdroidserver/index.py #, python-brace-format @@ -481,9 +481,9 @@ msgid "Creating \"{path}\" for configuring s3cmd." msgstr "s3cmdの設定用に「{path}」を作成します。" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Creating empty {config_file}" -msgstr "「{config_file}」を読み込みます" +msgstr "素の {config_file} を作成" #: ../fdroidserver/publish.py msgid "Creating log directory" @@ -653,12 +653,12 @@ msgstr "エラー:{path}の{key}は「archive」でも「repo」でもあり #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} not a valid key!" -msgstr "" +msgstr "エラー:{key} が無効な値です!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}'s value should be of type {t}!" -msgstr "" +msgstr "エラー:{key} の値は {t} 型でなければいけません!" #: ../fdroidserver/lint.py #, python-brace-format @@ -685,9 +685,9 @@ msgid "Environment variable {var} from {configname} is not set!" msgstr "{configname}の環境変数 {var} が設定されていません!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Environment variable {{env: {var}}} is not set!" -msgstr "{configname}の環境変数 {var} が設定されていません!" +msgstr "環境変数{{env: {var}}}が未設定です!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" @@ -929,9 +929,9 @@ msgid "Ignoring bad element in manifest: %s" msgstr "manifestの正しくない要素を無視します:%s" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Ignoring deprecated {oldfile}, use {newfile}!" -msgstr "{oldfile}は非推奨です。{newfile}を使用してください" +msgstr "{oldfile}は非推奨です。{newfile}を使用してください!" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1139,7 +1139,7 @@ msgstr "ZIPファイルの最大の再帰階層に到達しました:%s" #: ../fdroidserver/index.py #, python-brace-format msgid "Mirror config for {url} contains \"isPrimary\" key!" -msgstr "" +msgstr "{url} のミラー設定に \"isPrimary\" キーが含まれています!" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1306,7 +1306,7 @@ msgstr "画像にはPNGとJPEGのみをサポートします。これが見つ #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" -msgstr "" +msgstr "単一キー \"env\" のみを受け付けます" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" @@ -1467,7 +1467,7 @@ msgstr "スキャナーのルールと署名をネットワークから取得し #: ../fdroidserver/publish.py #, python-brace-format msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." -msgstr "" +msgstr "{dir1} と {dir2} のどちらにもファイルが存在するため、'{path}'への署名は拒否されました。" #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." @@ -1694,7 +1694,7 @@ msgstr "テストモード - 既に出力が存在する場合でも、一時デ #: ../fdroidserver/index.py msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" -msgstr "" +msgstr "\"qrcode\"のPythonパッケージが未導入です( 例えば apt-get install python3-qrcode します)!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -2589,7 +2589,7 @@ msgstr "{name}「{section}/icons/{path}」がありません!「config.yml」 #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" -msgstr "" +msgstr "{path1} は {path2} と重複しています、片方を除外してください!" #: ../fdroidserver/import_subcommand.py #, python-brace-format From dd64d557f278e0f8471e04b320903fb5a3a3980f Mon Sep 17 00:00:00 2001 From: Fjuro Date: Sun, 11 May 2025 16:14:13 +0200 Subject: [PATCH 2027/2116] Translated using Weblate: Czech (cs) by Fjuro Currently translated at 100.0% (579 of 579 strings) Co-authored-by: Fjuro Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/cs/ Translation: F-Droid/F-Droid Server --- locale/cs/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 2c95ed17..4fc63dea 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -14,7 +14,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2025-03-20 16:21+0000\n" +"PO-Revision-Date: 2025-03-26 10:00+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" "Language: cs\n" @@ -1474,7 +1474,7 @@ msgstr "Obnovit a uložit pravidla a podpisy skeneru ze sítě do mezipaměti" #: ../fdroidserver/publish.py #, python-brace-format msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." -msgstr "" +msgstr "Odmítám podespat „{path}“, soubor existuje ve složce {dir1} i {dir2}." #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." From 1a9ba8e956dba4e22a6374111fe5fdbf1770b800 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Sun, 11 May 2025 16:14:13 +0200 Subject: [PATCH 2028/2116] Translated using Weblate: Albanian (sq) by Besnik Bleta Currently translated at 97.7% (566 of 579 strings) Co-authored-by: Besnik Bleta Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/sq/ Translation: F-Droid/F-Droid Server --- locale/sq/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index 25881e20..709bf334 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2025-03-21 08:45+0000\n" +"PO-Revision-Date: 2025-03-26 21:33+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" "Language: sq\n" @@ -1466,7 +1466,7 @@ msgstr "Rifresko dhe ruaj në fshehtinë rregulla skaneri nga rrjeti" #: ../fdroidserver/publish.py #, python-brace-format msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." -msgstr "" +msgstr "S’po pranohet të nënshkruhet '{path}', kartela ekziston te të dyja dosjet, {dir1} dhe {dir2}." #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." From eebbfedee5bf303d263822bc9d5173ce456dde00 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Sun, 11 May 2025 16:14:14 +0200 Subject: [PATCH 2029/2116] Translated using Weblate: Ukrainian (uk) by Ihor Hordiichuk Currently translated at 100.0% (579 of 579 strings) Co-authored-by: Ihor Hordiichuk Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/uk/ Translation: F-Droid/F-Droid Server --- locale/uk/LC_MESSAGES/fdroidserver.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index 17b061f4..a8503aeb 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -18,8 +18,8 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2025-03-25 12:11+0000\n" -"Last-Translator: Максим Горпиніч \n" +"PO-Revision-Date: 2025-03-27 19:35+0000\n" +"Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" @@ -1478,7 +1478,7 @@ msgstr "Оновлення та кешування правил і сигнат #: ../fdroidserver/publish.py #, python-brace-format msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." -msgstr "Відмова підписати '{path}', файл існує в папках {dir1} і {dir2}." +msgstr "Відмова підписати '{path}', файл існує в теках {dir1} і {dir2}." #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." From 61943c3f061b3f311d952797e4c5825e3a40b4f4 Mon Sep 17 00:00:00 2001 From: Andrey Date: Sun, 11 May 2025 16:14:14 +0200 Subject: [PATCH 2030/2116] Translated using Weblate: Russian (ru) by Andrey Currently translated at 98.4% (570 of 579 strings) Co-authored-by: Andrey Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translation: F-Droid/F-Droid Server --- locale/ru/LC_MESSAGES/fdroidserver.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index 023ed632..cea992b8 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -21,15 +21,15 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2025-01-25 15:42+0000\n" -"Last-Translator: Golubev Alexander \n" +"PO-Revision-Date: 2025-03-27 19:35+0000\n" +"Last-Translator: Andrey \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.10-dev\n" +"X-Generator: Weblate 5.11-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -495,9 +495,9 @@ msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Создание \"{path}\" для конфигурации s3cmd." #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Creating empty {config_file}" -msgstr "Чтение '{config_file}'" +msgstr "Создание пустого '{config_file}'" #: ../fdroidserver/publish.py msgid "Creating log directory" @@ -667,7 +667,7 @@ msgstr "ОШИБКА: {key} в {path} должен быть или \"archive\", #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} not a valid key!" -msgstr "" +msgstr "ОШИБКА: {key} недействительный ключ!" #: ../fdroidserver/lint.py #, python-brace-format From 0e086f5e6163c20f3e33f17054e57003a6f9d88f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Sun, 11 May 2025 16:14:14 +0200 Subject: [PATCH 2031/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Irish?= =?UTF-8?q?=20(ga)=20by=20Aindri=C3=BA=20Mac=20Giolla=20Eoin=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (579 of 579 strings) Co-authored-by: Aindriú Mac Giolla Eoin Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ga/ Translation: F-Droid/F-Droid Server --- locale/ga/LC_MESSAGES/fdroidserver.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/ga/LC_MESSAGES/fdroidserver.po b/locale/ga/LC_MESSAGES/fdroidserver.po index 6e899484..a0c708cc 100644 --- a/locale/ga/LC_MESSAGES/fdroidserver.po +++ b/locale/ga/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: fdroidserver 2.3a1-162-gfbb3cc59\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2025-03-23 10:56+0000\n" +"PO-Revision-Date: 2025-03-27 19:35+0000\n" "Last-Translator: Aindriú Mac Giolla Eoin \n" "Language-Team: Irish \n" "Language: ga\n" @@ -1468,7 +1468,7 @@ msgstr "Athnuaigh agus cuir rialacha agus sínithe scanóirí taisce ón líonra #: ../fdroidserver/publish.py #, python-brace-format msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." -msgstr "" +msgstr "Ag diúltú '{path}' a shíniú, tá an comhad san fhillteán {dir1} agus {dir2} araon." #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." From 3b78b3cf06c9966b2e61b6fbc27cf020c328f821 Mon Sep 17 00:00:00 2001 From: ssantos Date: Sun, 11 May 2025 16:14:14 +0200 Subject: [PATCH 2032/2116] Translated using Weblate: Portuguese (pt) by ssantos Currently translated at 100.0% (579 of 579 strings) Co-authored-by: ssantos Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt/ Translation: F-Droid/F-Droid Server --- locale/pt/LC_MESSAGES/fdroidserver.po | 32 +++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index feb11e64..780bebdf 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2025-03-02 21:32+0000\n" +"PO-Revision-Date: 2025-04-06 16:45+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" "Language: pt\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.10.3-dev\n" +"X-Generator: Weblate 5.11-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -44,7 +44,7 @@ msgstr "\"%s/\" não tem ficheiro de metadados correspondente!" #: ../fdroidserver/index.py msgid "\"isPrimary\" key should not be added to mirrors!" -msgstr "" +msgstr "A chave \"isPrimary\" não deve ser adicionada em espelhos!" #: ../fdroidserver/index.py #, python-brace-format @@ -483,9 +483,9 @@ msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Criando \"{path}\" para configurar s3cmd." #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Creating empty {config_file}" -msgstr "A ler '{config_file}'" +msgstr "A criar '{config_file}' vazio" #: ../fdroidserver/publish.py msgid "Creating log directory" @@ -655,12 +655,12 @@ msgstr "ERRO: {key} em {path} não é \"arquivo\" ou \"repositório\"!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} not a valid key!" -msgstr "" +msgstr "ERRO: {key} não é uma chave válida!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}'s value should be of type {t}!" -msgstr "" +msgstr "ERRO: o valor de {key} deve ser do tipo {t}!" #: ../fdroidserver/lint.py #, python-brace-format @@ -687,9 +687,9 @@ msgid "Environment variable {var} from {configname} is not set!" msgstr "A variável de ambiente {var} de {configname} não está definida!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Environment variable {{env: {var}}} is not set!" -msgstr "A variável de ambiente {var} de {configname} não está definida!" +msgstr "A variável de ambiente {{env: {var} não está definida!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" @@ -931,9 +931,9 @@ msgid "Ignoring bad element in manifest: %s" msgstr "A ignorar o elemento mau no manifesto: %s" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Ignoring deprecated {oldfile}, use {newfile}!" -msgstr "{oldfile} está obsoleto, use {newfile}" +msgstr "A ignorar {oldfile} obsoleto, use {newfile}!" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1141,7 +1141,7 @@ msgstr "Profundidade máxima de recursão no ficheiro ZIP atingida: %s" #: ../fdroidserver/index.py #, python-brace-format msgid "Mirror config for {url} contains \"isPrimary\" key!" -msgstr "" +msgstr "A configuração de espelho de {url} contém a chave \"isPrimary\"!" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1308,7 +1308,7 @@ msgstr "Somente PNG e JPEG são suportados para gráficos, encontrado: {path}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" -msgstr "" +msgstr "Aceita apenas uma única chave \"env\"" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" @@ -1469,7 +1469,7 @@ msgstr "Atualizar e armazenar as regras e assinaturas do scanner da rede no cach #: ../fdroidserver/publish.py #, python-brace-format msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." -msgstr "" +msgstr "Recuso assinar '{path}', o ficheiro existe nas pastas {dir1} e {dir2}." #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." @@ -1697,7 +1697,7 @@ msgstr "Modo de teste - ponha a saída apenas no diretório tmp e sempre compile #: ../fdroidserver/index.py msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" -msgstr "" +msgstr "O pacote Python \"qrcode\" não está instalado (por exemplo, apt-get install python3-qrcode)!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -2595,7 +2595,7 @@ msgstr "{name} \"{section}/icons/{path}\" não existe! Corrija-o no \"config.yml #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" -msgstr "" +msgstr "{path1} é uma duplicata de {path2}, remova uma!" #: ../fdroidserver/import_subcommand.py #, python-brace-format From cc61a3e9e3270a921b0f727fbde708acdbda4785 Mon Sep 17 00:00:00 2001 From: Laurent FAVOLE Date: Sun, 11 May 2025 16:14:14 +0200 Subject: [PATCH 2033/2116] Translated using Weblate: French (fr) by Laurent FAVOLE Currently translated at 99.1% (574 of 579 strings) Co-authored-by: Laurent FAVOLE Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/fr/ Translation: F-Droid/F-Droid Server --- locale/fr/LC_MESSAGES/fdroidserver.po | 67 +++++++++++++-------------- 1 file changed, 31 insertions(+), 36 deletions(-) diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index aff0f707..61cd9215 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -42,20 +42,21 @@ # Lzebulon , 2024. # Armand Camponovo , 2024. # Lula Bye , 2025. +# Laurent FAVOLE , 2025. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2025-03-02 16:42+0000\n" -"Last-Translator: Lula Bye \n" +"PO-Revision-Date: 2025-04-11 17:20+0000\n" +"Last-Translator: Laurent FAVOLE \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.10.3-dev\n" +"X-Generator: Weblate 5.11-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -81,7 +82,7 @@ msgstr "\"%s/\" n'a pas de fichier de métadonnées correspondant !" #: ../fdroidserver/index.py msgid "\"isPrimary\" key should not be added to mirrors!" -msgstr "" +msgstr "La clé \"isPrimary\" ne devrait pas être ajoutée aux miroirs !" #: ../fdroidserver/index.py #, python-brace-format @@ -520,9 +521,9 @@ msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Création de « {path} » pour configurer s3cmd." #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Creating empty {config_file}" -msgstr "Lecture de '{config_file}'" +msgstr "Création d'un fichier {config_file} vide" #: ../fdroidserver/publish.py msgid "Creating log directory" @@ -692,12 +693,12 @@ msgstr "ERREUR : {key} dans {path} n'est pas \"archive\" ou \"repo\"." #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} not a valid key!" -msgstr "" +msgstr "ERREUR : {key} n'est pas une clé valide !" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}'s value should be of type {t}!" -msgstr "" +msgstr "ERREUR : la valeur de {key} devrait être du type {t} !" #: ../fdroidserver/lint.py #, python-brace-format @@ -724,9 +725,9 @@ msgid "Environment variable {var} from {configname} is not set!" msgstr "La variable d'environnent {var} de {configname} n'est pas configurée !" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Environment variable {{env: {var}}} is not set!" -msgstr "La variable d'environnent {var} de {configname} n'est pas configurée !" +msgstr "La variable d'environnement {{env: {var}}} n'est pas configurée !" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" @@ -970,7 +971,7 @@ msgstr "Un mauvais élément du manifest est ignoré : %s" #: ../fdroidserver/common.py #, fuzzy, python-brace-format msgid "Ignoring deprecated {oldfile}, use {newfile}!" -msgstr "{oldfile} est obsolète, utilisez {newfile}" +msgstr "{oldfile} est obsolète et ignoré, {newfile} est utilisé !" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1178,7 +1179,7 @@ msgstr "Profondeur maximale de récursivité dans le fichier ZIP atteinte : %s" #: ../fdroidserver/index.py #, python-brace-format msgid "Mirror config for {url} contains \"isPrimary\" key!" -msgstr "" +msgstr "La configuration du miroir pour {url} contient la clé \"isPrimary\" !" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1345,7 +1346,7 @@ msgstr "Seuls les formats PNG et JPEG sont pris en charge pour les graphiques, t #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" -msgstr "" +msgstr "N'accepte qu'une seule clé \"env\"" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" @@ -1506,7 +1507,7 @@ msgstr "Actualisation et mise en cache des règles et signature à partir du ré #: ../fdroidserver/publish.py #, python-brace-format msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." -msgstr "" +msgstr "Signature de '{path}' refusée, le fichier existe à la fois dans les dossiers {dir1} et {dir2}." #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." @@ -1734,7 +1735,7 @@ msgstr "Mode test — mettre la sortie dans le dossier tmp uniquement et toujour #: ../fdroidserver/index.py msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" -msgstr "" +msgstr "Le paquet Python \"qrcode\" n'est pas installé (p. ex. apt-get install python3-qrcode) !" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -1960,9 +1961,8 @@ msgid "Uploading {apkfilename} to virustotal" msgstr "Téléversement de {apkfilename} vers virustotal" #: ../fdroidserver/lint.py -#, fuzzy msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" -msgstr "Utiliser /HEAD plutôt que /master pour pointer un fichier dans la branche par défaut" +msgstr "Utiliser /HEAD plutôt que /master pour pointer vers un fichier dans la branche par défaut" #: ../fdroidserver/update.py msgid "Use `fdroid update -c` to create it." @@ -1982,9 +1982,9 @@ msgid "Using \"{path}\" for configuring s3cmd." msgstr "Utiliser \"{path}\" pour configurer s3cmd." #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Using \"{path}\" for syncing with remote storage." -msgstr "Utiliser \"{path}\" pour configurer un stockage distant." +msgstr "Utiliser \"{path}\" pour synchroniser avec un stockage distant." #: ../fdroidserver/common.py msgid "Using APK Signature v2" @@ -2039,9 +2039,9 @@ msgid "Verifying index signature:" msgstr "Vérification de la signature d'index :" #: ../fdroidserver/install.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "Vérifier le paquet {path} avec apksigner." +msgstr "Vérification du paquet {path} avec apksigner." #: ../fdroidserver/deploy.py #, python-brace-format @@ -2053,7 +2053,6 @@ msgid "Warn about possible metadata errors" msgstr "Avertir de possibles erreurs dans les métadonnées" #: ../fdroidserver/scanner.py -#, fuzzy msgid "WebAssembly binary file" msgstr "Fichier binaire WebAssembly" @@ -2090,7 +2089,7 @@ msgid "ZIP file archive" msgstr "Archive ZIP" #: ../fdroidserver/install.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "adb reports {serial} is \"{status}\"!" msgstr "adb reporte que {serial} est \"{status}\" !" @@ -2110,9 +2109,9 @@ msgid "ambiguous option: %(option)s could match %(matches)s" msgstr "option ambiguë : %(option)s peut correspondre à %(matches)s" #: ../fdroidserver/common.py -#, python-brace-format +#, fuzzy, python-brace-format msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." -msgstr "" +msgstr "apksigner dans build-tools;{version} accepte les APKs avec des signatures v3 invalides, ignoré" #: ../fdroidserver/common.py msgid "apksigner not found! Cannot sign or verify modern APKs" @@ -2216,9 +2215,8 @@ msgid "could not parse '{path}'" msgstr "impossible de lire '{path}'" #: ../fdroidserver/common.py -#, fuzzy msgid "could not parse srclib spec (no name specified): '{}'" -msgstr "impossible d'analyser la spécification srclib (pas de référence spécifiée) : '{}'" +msgstr "impossible d'analyser la spécification srclib (pas de nom spécifié) : '{}'" #: ../fdroidserver/common.py msgid "could not parse srclib spec (no ref specified): '{}'" @@ -2365,7 +2363,7 @@ msgid "mirror '%s' does not end with 'fdroid'!" msgstr "le miroir «%s» ne se termine pas par «fdroid» !" #: ../fdroidserver/index.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" msgstr "miroir configuré deux fois, dans config.yml et {path} !" @@ -2452,9 +2450,9 @@ msgid "s3cmd sync indexes {path} to {url} and delete" msgstr "s3cmd synchroniser les index de {path} vers {url} et les supprimer" #: ../fdroidserver/deploy.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" -msgstr "s3cmd synchroniser les index de {path} vers {url} et les supprimer" +msgstr "s3cmd synchronise les index de {path} vers {url} et supprime ceux enlevés" #: ../fdroidserver/scanner.py #, python-brace-format @@ -2462,9 +2460,8 @@ msgid "scanner cache is malformed! You can clear it with: '{clear}'" msgstr "l'analyse du cache est mal formée ! Vous pouvez le nettoyer avec : '{clear}'" #: ../fdroidserver/deploy.py -#, fuzzy msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" -msgstr "serverwebroot: le chemin ne se terminer pas avec \"fdroid\", peut être voulez-vous dire :" +msgstr "serverwebroot : le chemin ne se termine pas par \"fdroid\", peut-être voulez-vous dire :" #: ../fdroidserver/scanner.py msgid "shared library" @@ -2510,7 +2507,6 @@ msgid "the following arguments are required: %s" msgstr "les arguments suivants sont requis %s" #: ../fdroidserver/install.py -#, fuzzy msgid "true" msgstr "vrai" @@ -2548,7 +2544,6 @@ msgid "virustotal.com is rate limiting, waiting to retry..." msgstr "virustotal.com limite le nombre de requêtes, en attente avant de réessayer..." #: ../fdroidserver/install.py -#, fuzzy msgid "yes" msgstr "oui" @@ -2640,7 +2635,7 @@ msgstr "{name} \"{section}/icons/{path}\" n'existe pas ! Vérifiez \"config.yml\ #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" -msgstr "" +msgstr "{path1} est un doublon de {path2}, supprimez-en un !" #: ../fdroidserver/import_subcommand.py #, python-brace-format @@ -2663,7 +2658,7 @@ msgid "{path} has been flagged by virustotal {count} times:" msgstr "{path} a été signalé par virustotal {count} fois :" #: ../fdroidserver/install.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" msgstr "{path} a la mauvaise empreinte ({fingerprint}) !" From 696df8299929eb238272f44d2ec2f4bbf5917c57 Mon Sep 17 00:00:00 2001 From: VfBFan Date: Sun, 11 May 2025 16:14:15 +0200 Subject: [PATCH 2034/2116] Translated using Weblate: German (de) by VfBFan Currently translated at 100.0% (579 of 579 strings) Co-authored-by: VfBFan Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/de/ Translation: F-Droid/F-Droid Server --- locale/de/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 016655dd..201eac5c 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -27,15 +27,15 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2025-03-26 10:00+0000\n" -"Last-Translator: \"C. Rüdinger\" \n" +"PO-Revision-Date: 2025-04-29 10:16+0000\n" +"Last-Translator: VfBFan \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.11-dev\n" +"X-Generator: Weblate 5.12-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -1973,7 +1973,7 @@ msgstr "Verwende APK-Signatur v3" #: ../fdroidserver/common.py msgid "Using JAR Signature" -msgstr "Verwende JAR Signatur" +msgstr "Verwende JAR-Signatur" #: ../fdroidserver/common.py msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" From da58061c8066b812a14da37099852fe06b549c21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Fatih=20Ulu=C3=A7am?= Date: Sun, 11 May 2025 16:14:15 +0200 Subject: [PATCH 2035/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Turki?= =?UTF-8?q?sh=20(tr)=20by=20"M.=20Fatih=20Ulu=C3=A7am"=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 94.6% (548 of 579 strings) Co-authored-by: M. Fatih Uluçam Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/tr/ Translation: F-Droid/F-Droid Server --- locale/tr/LC_MESSAGES/fdroidserver.po | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index f3cdbc11..8ab45b5c 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -4,20 +4,21 @@ # Orhan , 2021. # Oğuz Ersen , 2022, 2023, 2024. # Bai , 2023. +# "M. Fatih Uluçam" , 2025. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2024-09-10 23:49+0000\n" -"Last-Translator: Oğuz Ersen \n" +"PO-Revision-Date: 2025-05-05 19:03+0000\n" +"Last-Translator: \"M. Fatih Uluçam\" \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.12-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -170,7 +171,7 @@ msgstr "'{value}' geçerli bir {field} değil, {pattern} olmalı" #: ../fdroidserver/checkupdates.py msgid "--merge-request only runs on a single appid!" -msgstr "" +msgstr "--merge-request yalnızca tek bir uygulama kimliğinde çalışır!" #: ../fdroidserver/checkupdates.py #, python-brace-format From 4e7bda736c096e62bfd4fe0a36ccb44cb1f40cfc Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 28 Mar 2025 14:28:37 +0100 Subject: [PATCH 2036/2116] update: never execute VCS e.g. git Package repos come from untrusted sources, in terms of the buildserver. They should be handled in VMs and containers as much as possible to avoid vulnerabilities. As far as I could tell, `fdroid update` only has a single place where it executes any VCS system: if there is .fdroid.yml present in a package repo, then it will fetch the commit ID using git. For better security properties, this implements a simple function to just read the files to get that commit ID. The function that executes git to do the same thing is relabeled "unsafe". That is used for status JSON everywhere, but that runs on fdroiddata.git and fdroidserver.git, which are trusted repos. The unsafe version is also used in places where git.Repo() is needed for other things. --- fdroidserver/build.py | 3 +- fdroidserver/common.py | 27 +++++++++++++---- fdroidserver/import_subcommand.py | 2 +- fdroidserver/metadata.py | 9 ++---- tests/test_common.py | 50 +++++++++++++++++++++++++++++++ 5 files changed, 77 insertions(+), 14 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 41df2c1c..e5ee9663 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -721,8 +721,7 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext bindir = os.path.join(root_dir, 'bin') if os.path.isdir(os.path.join(build_dir, '.git')): - import git - commit_id = common.get_head_commit_id(git.repo.Repo(build_dir)) + commit_id = str(common.get_head_commit_id(build_dir)) else: commit_id = build.commit diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 4a30bb6b..ce5dc195 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1286,12 +1286,29 @@ def write_status_json(output, pretty=False, name=None): rsync_status_file_to_repo(path, repo_subdir='status') -def get_head_commit_id(git_repo): - """Get git commit ID for HEAD as a str.""" +def get_head_commit_id(git_repo_dir): + """Get git commit ID for HEAD as a str. + + This only reads files, so it should be safe to use on untrusted + repos. It was created to avoid running the git executable, no + matter what. It uses a tiny subset of the git.Repo class to avoid + setting up the git executable. + + """ try: - return git_repo.head.commit.hexsha - except ValueError: - return "None" + if type(git_repo_dir) is git.Repo: + d = git_repo_dir.git_dir + else: + d = os.path.join(git_repo_dir, '.git') + repo = type( + 'Repo', + (object,), + {'common_dir': d, 'git_dir': d, 're_hexsha_only': git.Repo.re_hexsha_only}, + )() + return git.refs.symbolic.SymbolicReference.dereference_recursive(repo, 'HEAD') + except (FileNotFoundError, ValueError) as e: + msg = _("Cannot read {path}: {error}").format(path=os.getcwd(), error=str(e)) + logging.debug(msg) def setup_vcs(app): diff --git a/fdroidserver/import_subcommand.py b/fdroidserver/import_subcommand.py index b9f9a4c4..345c2891 100644 --- a/fdroidserver/import_subcommand.py +++ b/fdroidserver/import_subcommand.py @@ -342,7 +342,7 @@ def main(): app.AutoUpdateMode = 'Version' app.UpdateCheckMode = 'Tags' - build.commit = common.get_head_commit_id(git_repo) + build.commit = common.get_head_commit_id(tmp_importer_dir) # Extract some information... paths = get_all_gradle_and_manifests(tmp_importer_dir) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index f5fcffac..47fbdca7 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -18,7 +18,6 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import git from pathlib import Path import math import platform @@ -658,14 +657,12 @@ def parse_metadata(metadatapath): build_dir = common.get_build_dir(app) metadata_in_repo = build_dir / '.fdroid.yml' if metadata_in_repo.is_file(): - try: - commit_id = common.get_head_commit_id(git.Repo(build_dir)) + commit_id = common.get_head_commit_id(build_dir) + if commit_id is not None: logging.debug( _('Including metadata from %s@%s') % (metadata_in_repo, commit_id) ) - # See https://github.com/PyCQA/pylint/issues/2856 . - # pylint: disable-next=no-member - except git.exc.InvalidGitRepositoryError: + else: logging.debug( _('Including metadata from {path}').format(path=metadata_in_repo) ) diff --git a/tests/test_common.py b/tests/test_common.py index 522367a4..f6cdb0cb 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -3470,3 +3470,53 @@ class UnsafePermissionsTest(SetUpTearDownMixin, unittest.TestCase): fdroidserver.common.read_config() self.assertTrue('unsafe' not in lw.output[0]) self.assertEqual(1, len(lw.output)) + + +class GetHeadCommitIdTest(unittest.TestCase): + """Test and compare two methods of getting the commit ID.""" + + def setUp(self): + self._td = mkdtemp() + self.testdir = self._td.name + os.chdir(self.testdir) + logging.getLogger('git.cmd').setLevel(logging.INFO) + + def tearDown(self): + os.chdir(basedir) + self._td.cleanup() + + @unittest.skipUnless((basedir.parent / '.git').exists(), 'Needs a working git repo') + def test_get_head_commit_id_compare(self): + """Run on this git repo to get some real world noise in there.""" + git_dir = basedir.parent + self.assertIsNotNone(fdroidserver.common.get_head_commit_id(git_dir)) + + def test_get_head_commit_id_error_bare_repo(self): + """Error because it is an empty, bare git repo.""" + git_repo = git.Repo.init(self.testdir) + self.assertIsNone(fdroidserver.common.get_head_commit_id(git_repo)) + + def test_get_head_commit_id_error_no_repo(self): + """Error because there is no .git/ dir.""" + with self.assertLogs('root', level=logging.DEBUG): + self.assertIsNone(fdroidserver.common.get_head_commit_id(self.testdir)) + + def test_get_head_commit_id_detached_and_branch(self): + """Fetching commit ID must work from detached HEADs and branches.""" + git_repo = git.Repo.init(self.testdir) + Path('README').write_text('this is just a test') + git_repo.git.add(all=True) + git_repo.index.commit("add README") + Path('LICENSE').write_text('free!') + git_repo.git.add(all=True) + git_repo.index.commit("add LICENSE") + self.assertIsNotNone(fdroidserver.common.get_head_commit_id(git_repo)) + # detached HEAD + git_repo.git.checkout('HEAD^') + self.assertIsNotNone(fdroidserver.common.get_head_commit_id(git_repo)) + # on a branch with a new commits + git_repo.git.checkout('test', b=True) + Path('foo.py').write_text('print("code!")') + git_repo.git.add(all=True) + git_repo.index.commit("add code") + self.assertIsNotNone(fdroidserver.common.get_head_commit_id(git_repo)) From 9384c5ab709dcf007555131a7eb63f358466f60f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sat, 17 May 2025 00:15:44 +0200 Subject: [PATCH 2037/2116] gradlew-fdroid: also search ../../gradle/ for wrapper files https://github.com/geteduroam/android-app/pull/139 --- gradlew-fdroid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 7ca2830d..e41347ee 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -237,7 +237,7 @@ v_all=${plugin_v[@]} # Earliest file takes priority # Last key takes priority if there are duplicates (matching java.util.Properties) -for f in {.,..}/gradle/wrapper/gradle-wrapper.properties; do +for f in {.,..,../..}/gradle/wrapper/gradle-wrapper.properties; do [[ -f $f ]] || continue while IFS='' read -r line || [ -n "$line" ]; do line=$(printf "$line" | tr -d '\r') # strip Windows linefeeds From 20b36f1970997c8d223f181116eac06bbf6c88af Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 31 Mar 2025 11:44:00 +0200 Subject: [PATCH 2038/2116] SOURCE_DATE_EPOCH from app's git otherwise fdroiddata metadata file https://reproducible-builds.org/docs/source-date-epoch --- fdroidserver/build.py | 2 +- fdroidserver/common.py | 27 ++++++++++++++++++++- tests/test_build.py | 5 ++++ tests/test_common.py | 53 +++++++++++++++++++++++++++++++++++++++--- tests/test_scanner.py | 2 ++ 5 files changed, 84 insertions(+), 5 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index e5ee9663..6593ff0c 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -479,7 +479,7 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext logging.critical("Android NDK '%s' is not a directory!" % ndk_path) raise FDroidException() - common.set_FDroidPopen_env(build) + common.set_FDroidPopen_env(app, build) # create ..._toolsversion.log when running in builder vm if onserver: diff --git a/fdroidserver/common.py b/fdroidserver/common.py index ce5dc195..175c7f63 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1201,6 +1201,25 @@ def get_src_tarball_name(appid, versionCode): return f"{appid}_{versionCode}_src.tar.gz" +def get_source_date_epoch(build_dir): + """Return timestamp suitable for the SOURCE_DATE_EPOCH variable. + + https://reproducible-builds.org/docs/source-date-epoch/ + + """ + try: + return git.repo.Repo(build_dir).git.log(n=1, pretty='%ct') + except Exception as e: + logging.warning('%s: %s', e.__class__.__name__, build_dir) + build_dir = Path(build_dir) + appid = build_dir.name + data_dir = build_dir.parent.parent + metadata_file = f'metadata/{appid}.yml' + if (data_dir / '.git').exists() and (data_dir / metadata_file).exists(): + repo = git.repo.Repo(data_dir) + return repo.git.log('-n1', '--pretty=%ct', '--', metadata_file) + + def get_build_dir(app): """Get the dir that this app will be built in.""" if app.RepoType == 'srclib': @@ -3202,12 +3221,16 @@ def remove_signing_keys(build_dir): logging.info("Cleaned %s of keysigning configs at %s" % (propfile, path)) -def set_FDroidPopen_env(build=None): +def set_FDroidPopen_env(app=None, build=None): """Set up the environment variables for the build environment. There is only a weak standard, the variables used by gradle, so also set up the most commonly used environment variables for SDK and NDK. Also, if there is no locale set, this will set the locale (e.g. LANG) to en_US.UTF-8. + + If an App instance is provided, then the SOURCE_DATE_EPOCH + environment variable will be set based on that app's source repo. + """ global env, orig_path @@ -3230,6 +3253,8 @@ def set_FDroidPopen_env(build=None): if missinglocale: env['LANG'] = 'en_US.UTF-8' + if app: + env['SOURCE_DATE_EPOCH'] = get_source_date_epoch(get_build_dir(app)) if build is not None: path = build.ndk_path() paths = orig_path.split(os.pathsep) diff --git a/tests/test_build.py b/tests/test_build.py index e8e6927e..f7558c8c 100755 --- a/tests/test_build.py +++ b/tests/test_build.py @@ -205,6 +205,7 @@ class BuildTest(unittest.TestCase): @mock.patch('fdroidserver.build.FDroidPopen') @mock.patch('fdroidserver.common.is_debuggable_or_testOnly', lambda f: False) @mock.patch('fdroidserver.common.get_native_code', lambda f: 'x86') + @mock.patch('fdroidserver.common.get_source_date_epoch', lambda f: '1234567890') def test_build_local_maven(self, fake_FDroidPopen, fake_get_apk_id): """Test build_local() with a maven project""" @@ -330,6 +331,8 @@ class BuildTest(unittest.TestCase): 'fdroidserver.build.FDroidPopen', FakeProcess ) as _ignored, mock.patch( 'sdkmanager.install', wraps=fake_sdkmanager_install + ) as _ignored, mock.patch( + 'fdroidserver.common.get_source_date_epoch', lambda f: '1234567890' ) as _ignored: _ignored # silence the linters with self.assertRaises( @@ -378,6 +381,7 @@ class BuildTest(unittest.TestCase): @mock.patch('fdroidserver.build.FDroidPopen', FakeProcess) @mock.patch('fdroidserver.common.get_native_code', lambda _ignored: 'x86') @mock.patch('fdroidserver.common.is_debuggable_or_testOnly', lambda _ignored: False) + @mock.patch('fdroidserver.common.get_source_date_epoch', lambda f: '1234567890') @mock.patch( 'fdroidserver.common.sha256sum', lambda f: 'ad7ce5467e18d40050dc51b8e7affc3e635c85bd8c59be62de32352328ed467e', @@ -453,6 +457,7 @@ class BuildTest(unittest.TestCase): self.assertTrue(ndk_dir.exists()) self.assertTrue(os.path.exists(config['ndk_paths'][ndk_version])) + @mock.patch('fdroidserver.common.get_source_date_epoch', lambda f: '1234567890') def test_build_local_clean(self): """Test if `fdroid build` cleans ant and gradle build products""" os.chdir(self.testdir) diff --git a/tests/test_common.py b/tests/test_common.py index f6cdb0cb..521905aa 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -2468,7 +2468,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): fdroidserver.common.fill_config_defaults(config) build = fdroidserver.metadata.Build() with self.assertRaises(TypeError): - fdroidserver.common.set_FDroidPopen_env(build) + fdroidserver.common.set_FDroidPopen_env(build=build) @mock.patch.dict(os.environ, clear=True) def test_ndk_paths_in_config_must_be_strings(self): @@ -2480,7 +2480,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): build.ndk = 'r21d' os.environ['PATH'] = '/usr/bin:/usr/sbin' with self.assertRaises(TypeError): - fdroidserver.common.set_FDroidPopen_env(build) + fdroidserver.common.set_FDroidPopen_env(build=build) @mock.patch.dict(os.environ, clear=True) def test_FDroidPopen_envs_paths_can_be_pathlib(self): @@ -2567,7 +2567,7 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): with mock.patch.dict(os.environ, clear=True): os.environ['PATH'] = '/usr/bin:/usr/sbin' - fdroidserver.common.set_FDroidPopen_env(build) + fdroidserver.common.set_FDroidPopen_env(build=build) self.assertNotIn('', os.getenv('PATH').split(os.pathsep)) def test_is_repo_file(self): @@ -2993,6 +2993,53 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): for mirror in fdroidserver.common.append_filename_to_mirrors(filename, mirrors): self.assertTrue(mirror['url'].endswith('/' + filename)) + def test_get_source_date_epoch(self): + git_repo = git.Repo.init(self.testdir) + Path('README').write_text('file to commit') + git_repo.git.add(all=True) + git_repo.index.commit("README") + self.assertEqual( + git_repo.git.log(n=1, pretty='%ct'), + fdroidserver.common.get_source_date_epoch(self.testdir), + ) + + def test_get_source_date_epoch_no_scm(self): + self.assertIsNone(fdroidserver.common.get_source_date_epoch(self.testdir)) + + def test_get_source_date_epoch_not_git(self): + """Test when build_dir is not a git repo, e.g. hg, svn, etc.""" + appid = 'com.example' + build_dir = Path(self.testdir) / 'build' / appid + fdroiddata = build_dir.parent.parent + (fdroiddata / 'metadata').mkdir() + build_dir.mkdir(parents=True) + os.chdir(build_dir) + git_repo = git.Repo.init(fdroiddata) # fdroiddata is always a git repo + with (fdroiddata / f'metadata/{appid}.yml').open('w') as fp: + fp.write('AutoName: Example App\n') + git_repo.git.add(all=True) + git_repo.index.commit("update README") + self.assertEqual( + git.repo.Repo(fdroiddata).git.log(n=1, pretty='%ct'), + fdroidserver.common.get_source_date_epoch(build_dir), + ) + + @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) + def test_set_FDroidPopen_env_with_app(self): + """Test SOURCE_DATE_EPOCH in FDroidPopen when build_dir is a git repo.""" + os.chdir(self.testdir) + app = fdroidserver.metadata.App() + app.id = 'com.example' + build_dir = Path(self.testdir) / 'build' / app.id + git_repo = git.Repo.init(build_dir) + Path('README').write_text('file to commit') + git_repo.git.add(all=True) + now = datetime.now(timezone.utc) + git_repo.index.commit("README", commit_date=now) + fdroidserver.common.set_FDroidPopen_env(app) + p = fdroidserver.common.FDroidPopen(['printenv', 'SOURCE_DATE_EPOCH']) + self.assertEqual(int(p.output), int(now.timestamp())) + APKS_WITH_JAR_SIGNATURES = ( ( diff --git a/tests/test_scanner.py b/tests/test_scanner.py index 1dbe15b0..82f48d35 100755 --- a/tests/test_scanner.py +++ b/tests/test_scanner.py @@ -350,6 +350,8 @@ class ScannerTest(unittest.TestCase): with mock.patch( 'fdroidserver.common.get_apk_id', return_value=(app.id, build.versionCode, build.versionName), + ), mock.patch( + 'fdroidserver.common.get_source_date_epoch', lambda f: '1234567890' ): with mock.patch( 'fdroidserver.common.is_debuggable_or_testOnly', From ffd42745039ddb767db224c6cee0ecab4b74870d Mon Sep 17 00:00:00 2001 From: Leo Heitmann Ruiz Date: Fri, 9 May 2025 18:39:21 +0200 Subject: [PATCH 2039/2116] Fix handling of Triple-T 1.0.0 graphics Unlike screenshots, the featureGraphic, icon, promoGraphic, and tvBanner should be placed directly in the locale directory instead of in a dedicated subdirectory (in the F-Droid metadata structure). For version 1.0.0 of the Triple-T structure this currently isn't done. Instead, the graphics are treated as screenshots are. To illustrate: en-US/listing/icon/icon.png en-US/listing/featureGraphic/play_store_feature_graphic.png Should end up as: en-US/icon.png en-US/featureGraphic.png But instead they currently end up as: en-US/icon/icon.png en-US/featureGraphic/play_store_feature_graphic.png This patch should fix it. It seems the erroneous behavior was introduced in a4169484fdf67fb2644d3824227498cc75b6367e Closes #1260 --- fdroidserver/update.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 9df02e54..2fa0c532 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1114,6 +1114,9 @@ def copy_triple_t_store_metadata(apps): repofilename = os.path.basename(f) if segments[-2] == 'listing': locale = segments[-3] + if dirname in GRAPHIC_NAMES: + repofilename = dirname + '.' + extension + dirname = '' elif segments[-4] == 'listings': # v2.x locale = segments[-3] if dirname in tt_graphic_names: From 5f534ea2cb48fbc033dc49659162bf8e89f2e33c Mon Sep 17 00:00:00 2001 From: Leo Heitmann Ruiz Date: Wed, 21 May 2025 18:38:14 +0200 Subject: [PATCH 2040/2116] Add test case for Triple-T 1.0.0 graphics --- MANIFEST.in | 4 +++ tests/test_update.py | 18 +++++++++++++ .../play_store_feature_graphic.png | Bin 0 -> 1067 bytes .../src/main/play/en-US/listing/icon/icon.png | Bin 0 -> 451 bytes .../play/en-US/listing/phoneScreenshots/1.png | Bin 0 -> 330 bytes .../metadata/de.wivewa.dialer.yml | 25 ++++++++++++++++++ 6 files changed, 47 insertions(+) create mode 100644 tests/triple-t-1-graphics/build/de.wivewa.dialer/app/src/main/play/en-US/listing/featureGraphic/play_store_feature_graphic.png create mode 100644 tests/triple-t-1-graphics/build/de.wivewa.dialer/app/src/main/play/en-US/listing/icon/icon.png create mode 100644 tests/triple-t-1-graphics/build/de.wivewa.dialer/app/src/main/play/en-US/listing/phoneScreenshots/1.png create mode 100644 tests/triple-t-1-graphics/metadata/de.wivewa.dialer.yml diff --git a/MANIFEST.in b/MANIFEST.in index e833d6f6..fd5eb862 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -868,6 +868,10 @@ include tests/test_signatures.py include tests/test_signindex.py include tests/test_update.py include tests/test_vcs.py +include tests/triple-t-1-graphics/build/de.wivewa.dialer/app/src/main/play/en-US/listing/featureGraphic/play_store_feature_graphic.png +include tests/triple-t-1-graphics/build/de.wivewa.dialer/app/src/main/play/en-US/listing/icon/icon.png +include tests/triple-t-1-graphics/build/de.wivewa.dialer/app/src/main/play/en-US/listing/phoneScreenshots/1.png +include tests/triple-t-1-graphics/metadata/de.wivewa.dialer.yml include tests/triple-t-2/build/org.piwigo.android/app/.gitignore include tests/triple-t-2/build/org.piwigo.android/app/build.gradle include tests/triple-t-2/build/org.piwigo.android/app/src/debug/res/values/constants.xml diff --git a/tests/test_update.py b/tests/test_update.py index 59dca6e1..3575b546 100755 --- a/tests/test_update.py +++ b/tests/test_update.py @@ -436,6 +436,24 @@ class UpdateTest(unittest.TestCase): locales = sorted(apps['org.fdroid.ci.test.app']['localized']) self.assertEqual(correctlocales, locales) + def test_insert_triple_t_1_graphics(self): + packageName = 'de.wivewa.dialer' + shutil.copytree(basedir / 'triple-t-1-graphics', self.testdir, dirs_exist_ok=True) + os.chdir(self.testdir) + + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.common.config = config + fdroidserver.update.config = config + + apps = fdroidserver.metadata.read_metadata() + fdroidserver.update.copy_triple_t_store_metadata(apps) + + os.chdir(os.path.join('repo', packageName)) + self.assertTrue(os.path.exists(os.path.join('en-US', 'icon.png'))) + self.assertTrue(os.path.exists(os.path.join('en-US', 'featureGraphic.png'))) + self.assertTrue(os.path.exists(os.path.join('en-US', 'phoneScreenshots', '1.png'))) + def test_insert_triple_t_2_metadata(self): packageName = 'org.piwigo.android' shutil.copytree(basedir / 'triple-t-2', self.testdir, dirs_exist_ok=True) diff --git a/tests/triple-t-1-graphics/build/de.wivewa.dialer/app/src/main/play/en-US/listing/featureGraphic/play_store_feature_graphic.png b/tests/triple-t-1-graphics/build/de.wivewa.dialer/app/src/main/play/en-US/listing/featureGraphic/play_store_feature_graphic.png new file mode 100644 index 0000000000000000000000000000000000000000..0d5e35914c1362151fd9b7dc683b9e7450148283 GIT binary patch literal 1067 zcmV+`1l0S9P)Nkl&S~C}$OlIyVwr$(CZ9CUaT zX|sKOvMOLyAbBA#Q$RyZhSJ-e1&vJ9mi8Bhv%Oor)gn7IC z5^U`9RjgiQ^gN>%Gq|*qg@z2#WVHl;GK{Mimld*CO-n0Hq zdo3M@-K_`hjeE_ps|i)F*2JzRw(hrwE=E?qQXRLNxbnej&_ZbSt92ZJB&y5yZ9kTQ|W2$IA{O`a2{`u!$&&aiBc!?0pLJd_|$Xn!=3%$n!T}Qp$N4;Pj zJ{ui89qv0BXxeMlzNsHN9ckEYZr*RLdbJj;*x1O~SoU@v>KXlYbCav44jzPqpW>vD zKk^OTK3yBwz9zr`ug3* znAHR%Gq-Zk@0R_xwu6p{rDz-uHhcrP*(o=r*EDQEJpIo5KbAKgK0+B0UoFfQzj03I zj8)`bx=EhSW_K6K1LlUa6W3EbXMEi)-pC_H9$vzIjbBUloeel zLLidKh`$O(Cpkc;@s(<+yW%8*X`ul{$vbVVFPv{O3RGPea!Ux{ew=qU2rz z2q&KZLJ<_X922!1i+O?p;x`wFnHaN@0Hf#a6v8&qD{-kC8M!+Ja1M?IYj4~f9Q0Q> zn-vaoGWz3;*)Miu!uZbFo8Nu={U5oNyHC&-rJM2cIcS~V5n)S_$s1`P!vq8zW_iL| za{6W#z7VE6wv@J+iD?+T5Pmb>oqV(t?+ZbPp5`S?MjHnULR7XxRJO0T;N|G`;N$b<=k>O|<3dxm`I7_m?#^-Z@$u&r^oTb@~m(w;$vN=n$Yk9`O$LB;=w?R|3-r@2HMbVOY^5X99M!R?RzbSMGHRnzb#WzZSEFx^HW-?i2Q*-%3u|$STxdNbCQ)}hA z&y8k_l52P1*KHfz>jyj-8ax{NI+?1$GMl5bXpz-&h4qHabi2d8XZzuZ)AhODS#ZvkzF28xEv^+nBBD25|4) za9hY@ouw3B*nz63V^w;dPqbOY+*G7xK7GypvGiQ*6e1#`xQ~^<2pFdnHn0SH*Qni+ z>sW-sBAF9d%i_7o>N0V*E!C(}X;T<_L6ugG3^ldMH-#vpDcPaoRP`sWfiz{Q-kV-k zpCbIOtne!qvX$@kuBx?su-94Kmc_Iym3gXNqe`T>t<8 literal 0 HcmV?d00001 diff --git a/tests/triple-t-1-graphics/metadata/de.wivewa.dialer.yml b/tests/triple-t-1-graphics/metadata/de.wivewa.dialer.yml new file mode 100644 index 00000000..a86e2c53 --- /dev/null +++ b/tests/triple-t-1-graphics/metadata/de.wivewa.dialer.yml @@ -0,0 +1,25 @@ +Categories: + - Phone & SMS + - System +License: GPL-3.0-only +AuthorEmail: welefon@jolo.software +SourceCode: https://codeberg.org/wivewa/wivewa-dialer-android +IssueTracker: https://codeberg.org/wivewa/wivewa-dialer-android/issues + +AutoName: Welefon + +RepoType: git +Repo: https://codeberg.org/wivewa/wivewa-dialer-android.git + +Builds: + - versionName: 1.7.0 + versionCode: 13 + commit: 3550193fa6b6f7836876f2ca9bf5819a34eef404 + subdir: app + gradle: + - yes + +AutoUpdateMode: Version +UpdateCheckMode: Tags +CurrentVersion: 1.7.0 +CurrentVersionCode: 13 From e538c34c32130cbc596b15fc926d90db1d519114 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 9 Apr 2025 19:09:30 +0800 Subject: [PATCH 2041/2116] checkupdates: set push ref to HEAD:refs/heads/branch_name --- fdroidserver/checkupdates.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index dffe21ad..b4a6e631 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -809,7 +809,7 @@ def push_commits(branch_name='checkupdates'): progress = git.RemoteProgress() pushinfos = remote.push( - f"{branch_name}:{branch_name}", + f"HEAD:refs/heads/{branch_name}", progress=progress, force=True, set_upstream=True, From 243a0475f956db7624469302ccfb2d5e04b5fbe1 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Thu, 10 Apr 2025 14:48:08 +0800 Subject: [PATCH 2042/2116] checkupdates: don't create branch with .lock end --- fdroidserver/checkupdates.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index b4a6e631..9ed93298 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -769,6 +769,10 @@ def push_commits(branch_name='checkupdates'): * https://docs.gitlab.com/ee/user/project/push_options.html """ + if branch_name != "checkupdates": + if callable(getattr(git.SymbolicReference, "_check_ref_name_valid", None)): + git.SymbolicReference._check_ref_name_valid(branch_name) + git_repo = git.Repo.init('.') upstream_main = get_upstream_main_branch(git_repo) files = set() @@ -783,6 +787,10 @@ def push_commits(branch_name='checkupdates'): if not files: return + # https://git-scm.com/docs/git-check-ref-format Git refname can't end with .lock + if branch_name.endswith(".lock"): + branch_name = f"{branch_name}_" + remote = git_repo.remotes.origin if branch_name in remote.refs: if not get_changes_versus_ref(git_repo, f'origin/{branch_name}', files[0]): From 8c9b0b3a2a226762ba9a8062588242aade802f25 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 22 May 2025 12:08:27 +0200 Subject: [PATCH 2043/2116] add test case --- tests/test_checkupdates.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/test_checkupdates.py b/tests/test_checkupdates.py index fcd6f642..4cc76db3 100755 --- a/tests/test_checkupdates.py +++ b/tests/test_checkupdates.py @@ -696,3 +696,12 @@ class CheckupdatesTest(unittest.TestCase): push.assert_called_once() sys_exit.assert_called_once() self.assertIn(appid, git_repo.heads) + + def test_push_commits_invalid_branch_name(self): + git_repo, origin_repo, upstream_repo = self._get_test_git_repos() + for remote in git_repo.remotes: + remote.push(git_repo.active_branch) + self.assertEqual(git_repo.head, upstream_repo.head) + self.assertEqual(origin_repo.head, upstream_repo.head) + # pretend that checkupdates ran but didn't create any new commits + fdroidserver.checkupdates.push_commits('') From 6c054f62caef0d6edf8ff3ef1fa90ffa84b03cbd Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Fri, 25 Apr 2025 22:56:12 +0800 Subject: [PATCH 2044/2116] flavour -> flavor --- fdroidserver/build.py | 18 +++++------ fdroidserver/common.py | 60 ++++++++++++++++++------------------ fdroidserver/looseversion.py | 2 +- fdroidserver/update.py | 10 +++--- 4 files changed, 45 insertions(+), 45 deletions(-) diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 6593ff0c..8a59c771 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -541,13 +541,13 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext if build.preassemble: gradletasks += build.preassemble - flavours = build.gradle - if flavours == ['yes']: - flavours = [] + flavors = build.gradle + if flavors == ['yes']: + flavors = [] - flavours_cmd = ''.join([transform_first_char(flav, str.upper) for flav in flavours]) + flavors_cmd = ''.join([transform_first_char(flav, str.upper) for flav in flavors]) - gradletasks += ['assemble' + flavours_cmd + 'Release'] + gradletasks += ['assemble' + flavors_cmd + 'Release'] cmd = [config['gradle']] if build.gradleprops: @@ -763,11 +763,11 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext # really old path os.path.join(root_dir, 'build', 'apk'), ] - # If we build with gradle flavours with gradle plugin >= 3.0 the APK will be in - # a subdirectory corresponding to the flavour command used, but with different + # If we build with gradle flavors with gradle plugin >= 3.0 the APK will be in + # a subdirectory corresponding to the flavor command used, but with different # capitalization. - if flavours_cmd: - apk_dirs.append(os.path.join(root_dir, 'build', 'outputs', 'apk', transform_first_char(flavours_cmd, str.lower), 'release')) + if flavors_cmd: + apk_dirs.append(os.path.join(root_dir, 'build', 'outputs', 'apk', transform_first_char(flavors_cmd, str.lower), 'release')) for apks_dir in apk_dirs: for apkglob in ['*-release-unsigned.apk', '*-unsigned.apk', '*.apk']: apks = glob.glob(os.path.join(apks_dir, apkglob)) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 175c7f63..9acfcf2e 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1987,7 +1987,7 @@ def retrieve_string_singleline(app_dir, string, xmlfiles=None): return retrieve_string(app_dir, string, xmlfiles).replace('\n', ' ').strip() -def manifest_paths(app_dir, flavours): +def manifest_paths(app_dir, flavors): """Return list of existing files that will be used to find the highest vercode.""" possible_manifests = \ [Path(app_dir) / 'AndroidManifest.xml', @@ -1997,18 +1997,18 @@ def manifest_paths(app_dir, flavours): Path(app_dir) / 'build-extras.gradle', Path(app_dir) / 'build.gradle.kts'] - for flavour in flavours: - if flavour == 'yes': + for flavor in flavors: + if flavor == 'yes': continue possible_manifests.append( - Path(app_dir) / 'src' / flavour / 'AndroidManifest.xml') + Path(app_dir) / 'src' / flavor / 'AndroidManifest.xml') return [path for path in possible_manifests if path.is_file()] -def fetch_real_name(app_dir, flavours): +def fetch_real_name(app_dir, flavors): """Retrieve the package name. Returns the name, or None if not found.""" - for path in manifest_paths(app_dir, flavours): + for path in manifest_paths(app_dir, flavors): if not path.suffix == '.xml' or not path.is_file(): continue logging.debug("fetch_real_name: Checking manifest at %s" % path) @@ -2126,17 +2126,17 @@ def parse_androidmanifests(paths, app): vercode = None package = None - flavours = None + flavors = None temp_app_id = None temp_version_name = None if len(app.get('Builds', [])) > 0 and 'gradle' in app['Builds'][-1] and app['Builds'][-1].gradle: - flavours = app['Builds'][-1].gradle + flavors = app['Builds'][-1].gradle if path.suffix == '.gradle' or path.name.endswith('.gradle.kts'): with open(path, 'r', encoding='utf-8') as f: android_plugin_file = False - inside_flavour_group = 0 - inside_required_flavour = 0 + inside_flavor_group = 0 + inside_required_flavor = 0 for line in f: if gradle_comment.match(line): continue @@ -2151,8 +2151,8 @@ def parse_androidmanifests(paths, app): if matches: temp_version_name = matches - if inside_flavour_group > 0: - if inside_required_flavour > 1: + if inside_flavor_group > 0: + if inside_required_flavor > 1: matches = psearch_g(line) if matches: s = matches.group(2) @@ -2182,29 +2182,29 @@ def parse_androidmanifests(paths, app): if matches: vercode = version_code_string_to_int(matches.group(1)) - if inside_required_flavour > 0: + if inside_required_flavor > 0: if '{' in line: - inside_required_flavour += 1 + inside_required_flavor += 1 if '}' in line: - inside_required_flavour -= 1 - if inside_required_flavour == 1: - inside_required_flavour -= 1 - elif flavours: - for flavour in flavours: - if re.match(r'.*[\'"\s]{flavour}[\'"\s].*\{{.*'.format(flavour=flavour), line): - inside_required_flavour = 2 + inside_required_flavor -= 1 + if inside_required_flavor == 1: + inside_required_flavor -= 1 + elif flavors: + for flavor in flavors: + if re.match(r'.*[\'"\s]{flavor}[\'"\s].*\{{.*'.format(flavor=flavor), line): + inside_required_flavor = 2 break - if re.match(r'.*[\'"\s]{flavour}[\'"\s].*'.format(flavour=flavour), line): - inside_required_flavour = 1 + if re.match(r'.*[\'"\s]{flavor}[\'"\s].*'.format(flavor=flavor), line): + inside_required_flavor = 1 break if '{' in line: - inside_flavour_group += 1 + inside_flavor_group += 1 if '}' in line: - inside_flavour_group -= 1 + inside_flavor_group -= 1 else: if "productFlavors" in line: - inside_flavour_group = 1 + inside_flavor_group = 1 if not package: matches = psearch_g(line) if matches: @@ -2548,9 +2548,9 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver= with open(path, 'w', encoding='iso-8859-1') as f: f.write(props) - flavours = [] + flavors = [] if build.build_method() == 'gradle': - flavours = build.gradle + flavors = build.gradle if build.target: n = build.target.split('-')[1] @@ -2572,7 +2572,7 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver= # Insert version code and number into the manifest if necessary if build.forceversion: logging.info("Changing the version name") - for path in manifest_paths(root_dir, flavours): + for path in manifest_paths(root_dir, flavors): if not os.path.isfile(path): continue if path.suffix == '.xml': @@ -2586,7 +2586,7 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver= if build.forcevercode: logging.info("Changing the version code") - for path in manifest_paths(root_dir, flavours): + for path in manifest_paths(root_dir, flavors): if not path.is_file(): continue if path.suffix == '.xml': diff --git a/fdroidserver/looseversion.py b/fdroidserver/looseversion.py index 0c785d69..c2a32213 100644 --- a/fdroidserver/looseversion.py +++ b/fdroidserver/looseversion.py @@ -115,7 +115,7 @@ __license__ = "Python License 2.0" # been done in the StrictVersion class above. This works great as long # as everyone can go along with bondage and discipline. Hopefully a # (large) subset of Python module programmers will agree that the -# particular flavour of bondage and discipline provided by StrictVersion +# particular flavor of bondage and discipline provided by StrictVersion # provides enough benefit to be worth using, and will submit their # version numbering scheme to its domination. The free-thinking # anarchists in the lot will never give in, though, and something needs diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 2fa0c532..b1978755 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1179,17 +1179,17 @@ def insert_localized_app_metadata(apps): locale = segments[-1] destdir = os.path.join('repo', packageName, locale) - # flavours specified in build receipt - build_flavours = "" + # flavors specified in build receipt + build_flavors = "" if ( apps[packageName] and len(apps[packageName].get('Builds', [])) > 0 and 'gradle' in apps[packageName]['Builds'][-1] ): - build_flavours = apps[packageName]['Builds'][-1]['gradle'] + build_flavors = apps[packageName]['Builds'][-1]['gradle'] - if len(segments) >= 5 and segments[4] == "fastlane" and segments[3] not in build_flavours: - logging.debug("ignoring due to wrong flavour") + if len(segments) >= 5 and segments[4] == "fastlane" and segments[3] not in build_flavors: + logging.debug("ignoring due to wrong flavor") continue for f in files: From e95758333783300361a7ea6b5a50f633a17effbc Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sat, 26 Apr 2025 01:50:08 +0800 Subject: [PATCH 2045/2116] common: add calculate_gradle_flavor_combination --- fdroidserver/common.py | 15 +++++++++++++++ tests/test_common.py | 5 +++++ 2 files changed, 20 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 9acfcf2e..9b395ad6 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -58,6 +58,7 @@ from typing import List import git import glob import io +import itertools import os import sys import re @@ -4823,6 +4824,20 @@ def calculate_archive_policy(app, default): return archive_policy +def calculate_gradle_flavor_combination(flavors): + """Calculate all combinations of gradle flavors.""" + combination_lists = itertools.product(*[[flavor, ''] for flavor in flavors]) + combinations = [ + re.sub( + r' +\w', + lambda pat: pat.group(0)[-1].upper(), + ' '.join(combination_list).strip(), + ) + for combination_list in combination_lists + ] + return combinations + + FDROIDORG_MIRRORS = [ { 'isPrimary': True, diff --git a/tests/test_common.py b/tests/test_common.py index 521905aa..c8d10045 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -3040,6 +3040,11 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): p = fdroidserver.common.FDroidPopen(['printenv', 'SOURCE_DATE_EPOCH']) self.assertEqual(int(p.output), int(now.timestamp())) + def test_calculate_gradle_flavor_combination(self): + flavors = ['aa', 'BB', 'δδ'] + combinations = ['aaBBΔδ', 'aaBB', 'aaΔδ', 'aa', 'BBΔδ', 'BB', 'δδ', ''] + self.assertEqual(fdroidserver.common.calculate_gradle_flavor_combination(flavors), combinations) + APKS_WITH_JAR_SIGNATURES = ( ( From a5d966bf0f69195e539302765132fa1878d2cc55 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sat, 26 Apr 2025 01:58:20 +0800 Subject: [PATCH 2046/2116] calculate all combinations of gradle flavors --- MANIFEST.in | 1 + fdroidserver/scanner.py | 5 +++-- fdroidserver/update.py | 7 +++++-- tests/source-files/flavor.test/build.gradle | 15 +++++++++++++++ tests/test_scanner.py | 6 +++++- 5 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 tests/source-files/flavor.test/build.gradle diff --git a/MANIFEST.in b/MANIFEST.in index fd5eb862..0a24f98b 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -803,6 +803,7 @@ include tests/source-files/firebase-allowlisted/app/build.gradle include tests/source-files/firebase-allowlisted/build.gradle include tests/source-files/firebase-suspect/app/build.gradle include tests/source-files/firebase-suspect/build.gradle +include tests/source-files/flavor.test/build.gradle include tests/source-files/info.guardianproject.ripple/build.gradle include tests/source-files/lockfile.test/flutter/.dart_tool/flutter_gen/pubspec.yaml include tests/source-files/lockfile.test/flutter/pubspec.lock diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index c6cd57a0..3de65d33 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -270,9 +270,10 @@ def get_gradle_compile_commands(build): 'runtimeOnly', ] buildTypes = ['', 'release'] - flavors = [''] if build.gradle and build.gradle != ['yes']: - flavors += build.gradle + flavors = common.calculate_gradle_flavor_combination(build.gradle) + else: + flavors = [''] return [''.join(c) for c in itertools.product(flavors, buildTypes, compileCommands)] diff --git a/fdroidserver/update.py b/fdroidserver/update.py index b1978755..e25a5209 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1180,13 +1180,16 @@ def insert_localized_app_metadata(apps): destdir = os.path.join('repo', packageName, locale) # flavors specified in build receipt - build_flavors = "" + build_flavors = [] if ( apps[packageName] and len(apps[packageName].get('Builds', [])) > 0 and 'gradle' in apps[packageName]['Builds'][-1] + and apps[packageName]['Builds'][-1]['gradle'] != ['yes'] ): - build_flavors = apps[packageName]['Builds'][-1]['gradle'] + build_flavors = common.calculate_gradle_flavor_combination( + apps[packageName]['Builds'][-1]['gradle'] + ) if len(segments) >= 5 and segments[4] == "fastlane" and segments[3] not in build_flavors: logging.debug("ignoring due to wrong flavor") diff --git a/tests/source-files/flavor.test/build.gradle b/tests/source-files/flavor.test/build.gradle new file mode 100644 index 00000000..2c958bdc --- /dev/null +++ b/tests/source-files/flavor.test/build.gradle @@ -0,0 +1,15 @@ +dependenies { + /// dependencies for app building + fossImplementation 'com.android.support:multidex:1.0.2' + implementation 'com.github.nextcloud:android-library:1.0.33' + devImplementation 'com.github.nextcloud:android-library:master-SNAPSHOT' // use always latest master + implementation "com.android.support:support-v4:${supportLibraryVersion}" + prodImplementation "com.android.support:design:${supportLibraryVersion}" + gplayImplementation 'com.jakewharton:disklrucache:2.0.2' + implementation "com.android.support:appcompat-v7:${supportLibraryVersion}" + gplayProdImplementation "com.android.support:cardview-v7:${supportLibraryVersion}" + implementation "com.android.support:exifinterface:${supportLibraryVersion}" + fossDevImplementation 'com.github.tobiasKaminsky:android-floating-action-button:1.10.2' + gplayDevImplementation 'com.github.albfernandez:juniversalchardet:v2.0.0' + fossProdImplementation 'com.google.code.findbugs:annotations:2.0.1' +} diff --git a/tests/test_scanner.py b/tests/test_scanner.py index 82f48d35..3515e858 100755 --- a/tests/test_scanner.py +++ b/tests/test_scanner.py @@ -107,12 +107,16 @@ class ScannerTest(unittest.TestCase): ('source-files/eu.siacs.conversations/build.gradle', 'free', 21), ('source-files/org.mozilla.rocket/app/build.gradle', 'focus', 40), ('source-files/com.jens.automation2/app/build.gradle', 'fdroidFlavor', 5), + ('source-files/flavor.test/build.gradle', ['foss', 'prod'], 7), ] for f, flavor, count in test_files: i = 0 build = fdroidserver.metadata.Build() - build.gradle = [flavor] + if isinstance(flavor, list): + build.gradle = flavor + else: + build.gradle = [flavor] regexs = fdroidserver.scanner.get_gradle_compile_commands_without_catalog( build ) From 7cf1cd1f4c995b0abf73835b431b6203a3e78ecb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Thu, 22 May 2025 17:29:50 +0200 Subject: [PATCH 2047/2116] =?UTF-8?q?=F0=9F=92=B8=20add=20.well-known/fund?= =?UTF-8?q?ing-manifest-urls?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is used by floss.fund to automatically verify that a repository is indeed owned by the author of the corresponding funding.json file. --- .well-known/funding-manifest-urls | 1 + 1 file changed, 1 insertion(+) create mode 100644 .well-known/funding-manifest-urls diff --git a/.well-known/funding-manifest-urls b/.well-known/funding-manifest-urls new file mode 100644 index 00000000..9935b4d4 --- /dev/null +++ b/.well-known/funding-manifest-urls @@ -0,0 +1 @@ +https://f-droid.org/funding.json From cfc848771d4e1788cbc98be97418e25ace773fa9 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 22 May 2025 14:33:28 +0200 Subject: [PATCH 2048/2116] Deprecate bzr, hg and git-svn support (attack surface) --- fdroidserver/common.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 9b395ad6..05423fff 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1355,6 +1355,7 @@ def getvcs(vcstype, remote, local): """ if vcstype == 'git': return vcs_git(remote, local) + logging.warning(_("RepoType {type} is deprecated, please switch to git.").format(type=vcstype)) if vcstype == 'git-svn': return vcs_gitsvn(remote, local) if vcstype == 'hg': From c70af2503c775347978bca2b0295f885d86e99ba Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Sat, 24 May 2025 09:36:38 +0300 Subject: [PATCH 2049/2116] gradle - 8.14.1 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index e41347ee..e7cf2240 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -211,6 +211,7 @@ get_sha() { '8.12.1') echo '8d97a97984f6cbd2b85fe4c60a743440a347544bf18818048e611f5288d46c94' ;; '8.13') echo '20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78' ;; '8.14') echo '61ad310d3c7d3e5da131b76bbf22b5a4c0786e9d892dae8c1658d4b484de3caa' ;; + '8.14.1') echo '845952a9d6afa783db70bb3b0effaae45ae5542ca2bb7929619e8af49cb634cf' ;; *) exit 1 esac } @@ -231,7 +232,7 @@ d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2 7.1 7.0 4.2 4.1 4.0 3.6 d_plugin_min_gradle_v=(8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.14 8.13 8.12.1 8.12 8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.14.1 8.14 8.13 8.12.1 8.12 8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From e98f0966e03e3f36f7a3c73b8d37a4ca7c0c2edb Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Sun, 8 Jun 2025 09:31:16 +0300 Subject: [PATCH 2050/2116] gradle 8.14.2 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index e7cf2240..877eafc2 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -212,6 +212,7 @@ get_sha() { '8.13') echo '20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78' ;; '8.14') echo '61ad310d3c7d3e5da131b76bbf22b5a4c0786e9d892dae8c1658d4b484de3caa' ;; '8.14.1') echo '845952a9d6afa783db70bb3b0effaae45ae5542ca2bb7929619e8af49cb634cf' ;; + '8.14.2') echo '7197a12f450794931532469d4ff21a59ea2c1cd59a3ec3f89c035c3c420a6999' ;; *) exit 1 esac } @@ -232,7 +233,7 @@ d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2 7.1 7.0 4.2 4.1 4.0 3.6 d_plugin_min_gradle_v=(8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) # All gradle versions we know about -plugin_v=(8.14.1 8.14 8.13 8.12.1 8.12 8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.14.2 8.14.1 8.14 8.13 8.12.1 8.12 8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 677301bc8aeaf51b5c61b5377b6dfe0be0d55bf4 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 25 Apr 2025 22:22:35 +0200 Subject: [PATCH 2051/2116] gitlab-ci: make gradle job show files with trigger it For some reason, this logic thinks that this merge request has changed makebuildserver and/or gradlew-fdroid, though it clearly has not. This should shed some light on it. https://gitlab.com/fdroid/fdroidserver/-/jobs/9835383262 --- .gitlab-ci.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e4d922d0..b8b49c27 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -469,6 +469,8 @@ macOS: gradle: image: debian:bookworm-slim + rules: + - if: "$PERSONAL_ACCESS_TOKEN" <<: *apt-template variables: GIT_DEPTH: 1000 @@ -485,12 +487,15 @@ gradle: python3-requests # if this is a merge request fork, then only check if relevant files changed - if [ "$CI_PROJECT_NAMESPACE" != "fdroid" ]; then + set -x; git fetch https://gitlab.com/fdroid/fdroidserver.git; for f in `git diff --name-only --diff-filter=d FETCH_HEAD...HEAD`; do - test "$f" == "makebuildserver" && export CHANGED="yes"; - test "$f" == "gradlew-fdroid" && export CHANGED="yes"; + test "$f" == "makebuildserver" && export CHANGED="$f $CHANGED"; + test "$f" == "gradlew-fdroid" && export CHANGED="$f $CHANGED"; done; test -z "$CHANGED" && exit; + echo $CHANGED; + set +x; fi - ./tests/gradle-release-checksums.py From 721de491045b9bec923023ab46f45ef0f8c31cc7 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 30 Apr 2025 21:31:21 +0200 Subject: [PATCH 2052/2116] make_website: only parse repo_pubkey if its needed This makes writing tests a lot easier, since the test cases no longer need to provide a value for `repo_pubkey:`. --- fdroidserver/index.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index fb1c4279..b65aa2b1 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -152,11 +152,6 @@ def _should_file_be_generated(path, magic_string): def make_website(apps, repodir, repodict): - _ignored, repo_pubkey_fingerprint = extract_pubkey() - repo_pubkey_fingerprint_stripped = repo_pubkey_fingerprint.replace(" ", "") - link = repodict["address"] - link_fingerprinted = ('{link}?fingerprint={fingerprint}' - .format(link=link, fingerprint=repo_pubkey_fingerprint_stripped)) # do not change this string, as it will break updates for files with older versions of this string autogenerate_comment = "auto-generated - fdroid index updates will overwrite this file" @@ -168,6 +163,13 @@ def make_website(apps, repodir, repodict): if _should_file_be_generated(html_file, autogenerate_comment): import qrcode + + _ignored, repo_pubkey_fingerprint = extract_pubkey() + repo_pubkey_fingerprint_stripped = repo_pubkey_fingerprint.replace(" ", "") + link = repodict["address"] + link_fingerprinted = '{link}?fingerprint={fingerprint}'.format( + link=link, fingerprint=repo_pubkey_fingerprint_stripped + ) qrcode.make(link_fingerprinted).save(os.path.join(repodir, "index.png")) with open(html_file, 'w') as f: name = repodict["name"] From 69003ae65bafb18d5dc11c54887def7bcd889812 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sat, 24 May 2025 15:39:13 +0800 Subject: [PATCH 2053/2116] gradlew-fdroid: update AGP required gradle version --- gradlew-fdroid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 877eafc2..32b4df14 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -229,8 +229,8 @@ contains() { # (key) should accept. plugin versions are actually prefixes and catch sub- # versions as well. Pairs are taken from: # https://developer.android.com/studio/releases/gradle-plugin#updating-gradle -d_gradle_plugin_ver_k=(8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0) -d_plugin_min_gradle_v=(8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12 2.4 2.4 2.3 2.2.1 2.2.1 2.1 2.1 1.12 1.12 1.12 1.11 1.10 1.9 1.8 1.6 1.6 1.4 1.4) +d_gradle_plugin_ver_k=(8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0) +d_plugin_min_gradle_v=(8.11.1 8.10.2 8.9 8.7 8.7 8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12) # All gradle versions we know about plugin_v=(8.14.2 8.14.1 8.14 8.13 8.12.1 8.12 8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) From cd1630d2f532b0cbd80b2ecac46cc452c2626ce6 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 11 Jun 2025 13:02:09 +0000 Subject: [PATCH 2054/2116] Lazyload environment variables in config.yml --- fdroidserver/common.py | 83 ++++++++++++++++++++++++++++-------------- tests/test_common.py | 55 +++++++++++++++++++++++----- 2 files changed, 101 insertions(+), 37 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 05423fff..b131ce19 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -546,6 +546,60 @@ def config_type_check(path, data): ) +class _Config(dict): + def __init__(self, default={}): + super(_Config, self).__init__(default) + self.loaded = {} + + def lazyget(self, key): + if key not in self.loaded: + value = super(_Config, self).__getitem__(key) + + if key == 'serverwebroot': + roots = parse_list_of_dicts(value) + rootlist = [] + for d in roots: + # since this is used with rsync, where trailing slashes have + # meaning, ensure there is always a trailing slash + rootstr = d.get('url') + if not rootstr: + logging.error('serverwebroot: has blank value!') + continue + if rootstr[-1] != '/': + rootstr += '/' + d['url'] = rootstr.replace('//', '/') + rootlist.append(d) + self.loaded[key] = rootlist + + elif key == 'servergitmirrors': + self.loaded[key] = parse_list_of_dicts(value) + + elif isinstance(value, dict) and 'env' in value and len(value) == 1: + var = value['env'] + if var in os.environ: + self.loaded[key] = os.getenv(var) + else: + logging.error( + _( + 'Environment variable {var} from {configname} is not set!' + ).format(var=value['env'], configname=key) + ) + self.loaded[key] = None + else: + self.loaded[key] = value + + return self.loaded[key] + + def __getitem__(self, key): + return self.lazyget(key) + + def get(self, key, default=None, /): + try: + return self.lazyget(key) + except KeyError: + return default + + def read_config(): """Read the repository config. @@ -601,25 +655,7 @@ def read_config(): fill_config_defaults(config) - if 'serverwebroot' in config: - roots = parse_list_of_dicts(config['serverwebroot']) - rootlist = [] - for d in roots: - # since this is used with rsync, where trailing slashes have - # meaning, ensure there is always a trailing slash - rootstr = d.get('url') - if not rootstr: - logging.error('serverwebroot: has blank value!') - continue - if rootstr[-1] != '/': - rootstr += '/' - d['url'] = rootstr.replace('//', '/') - rootlist.append(d) - config['serverwebroot'] = rootlist - if 'servergitmirrors' in config: - config['servergitmirrors'] = parse_list_of_dicts(config['servergitmirrors']) - limit = config['git_mirror_size_limit'] config['git_mirror_size_limit'] = parse_human_readable_size(limit) @@ -642,15 +678,7 @@ def read_config(): continue elif isinstance(dictvalue, dict): for k, v in dictvalue.items(): - if k == 'env': - env = os.getenv(v) - if env: - config[configname] = env - else: - confignames_to_delete.add(configname) - logging.error(_('Environment variable {var} from {configname} is not set!') - .format(var=k, configname=configname)) - else: + if k != 'env': confignames_to_delete.add(configname) logging.error(_('Unknown entry {key} in {configname}') .format(key=k, configname=configname)) @@ -670,6 +698,7 @@ def read_config(): ) ) + config = _Config(config) return config diff --git a/tests/test_common.py b/tests/test_common.py index c8d10045..1f6ff947 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -2029,6 +2029,49 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): config = fdroidserver.common.read_config() self.assertEqual('/usr/lib/jvm/java-8-openjdk', config['java_paths']['8']) + @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) + def test_config_lazy_load_env_vars(self): + """Test the environment variables in config.yml is lazy loaded. + + It shouldn't throw errors when read the config if the environment variables are + not set. It should throw errors when the variables are get from the config. + """ + os.chdir(self.testdir) + fdroidserver.common.write_config_file( + textwrap.dedent( + """ + serverwebroot: {env: serverwebroot} + servergitmirrors: + - url: {env: mirror1} + - url: {env: mirror2} + keypass: {env: keypass} + keystorepass: {env: keystorepass} + """ + ) + ) + with self.assertNoLogs(level=logging.ERROR): + config = fdroidserver.common.read_config() + + # KeyError should be raised if a key is not in the config.yml + with self.assertRaises(KeyError): + config['gpghome'] + + self.assertEqual(config.get('gpghome', 'gpg'), 'gpg') + os.environ.update({key: f"{key}supersecret" for key in ["serverwebroot", "mirror1", "mirror2", "keystorepass"]}) + self.assertEqual(config['keystorepass'], 'keystorepasssupersecret') + self.assertEqual(config['serverwebroot'], [{'url': 'serverwebrootsupersecret/'}]) + self.assertEqual(config['servergitmirrors'], [{'url': 'mirror1supersecret'}, {'url': 'mirror2supersecret'}]) + + @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) + def test_config_lazy_load_env_vars_not_set(self): + os.chdir(self.testdir) + fdroidserver.common.write_config_file('keypass: {env: keypass}') + fdroidserver.common.read_config() + with self.assertLogs(level=logging.ERROR) as lw: + fdroidserver.common.config['keypass'] + self.assertTrue('is not set' in lw.output[0]) + self.assertEqual(1, len(lw.output)) + @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) def test_test_sdk_exists_fails_on_bad_sdk_path(self): config = {'sdk_path': 'nothinghere'} @@ -3465,7 +3508,7 @@ class ConfigOptionsScopeTest(unittest.TestCase): self.assertIsNone(fdroidserver.common.config) config = fdroidserver.common.read_config() self.assertIsNotNone(fdroidserver.common.config) - self.assertEqual(dict, type(config)) + self.assertTrue(isinstance(config, dict)) self.assertEqual(config, fdroidserver.common.config) def test_get_config_global(self): @@ -3475,7 +3518,7 @@ class ConfigOptionsScopeTest(unittest.TestCase): self.assertIsNone(fdroidserver.common.config) c = fdroidserver.common.read_config() self.assertIsNotNone(fdroidserver.common.config) - self.assertEqual(dict, type(c)) + self.assertTrue(isinstance(c, dict)) self.assertEqual(c, fdroidserver.common.config) self.assertTrue( 'config' not in vars() and 'config' not in globals(), @@ -3515,14 +3558,6 @@ class UnsafePermissionsTest(SetUpTearDownMixin, unittest.TestCase): self.assertTrue('unsafe' in lw.output[0]) self.assertEqual(1, len(lw.output)) - @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) - def test_config_perm_unset_env_no_warning(self): - fdroidserver.common.write_config_file('keypass: {env: keypass}') - with self.assertLogs(level=logging.WARNING) as lw: - fdroidserver.common.read_config() - self.assertTrue('unsafe' not in lw.output[0]) - self.assertEqual(1, len(lw.output)) - class GetHeadCommitIdTest(unittest.TestCase): """Test and compare two methods of getting the commit ID.""" From 59102fb07f3d05c16ede6639648d15c8c50416ce Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 11 Jun 2025 15:47:01 +0200 Subject: [PATCH 2055/2116] update: use ctime/mtime to control _strip_and_copy_image runs Oftentimes, the file that is copied is stripped, in which case, the file size is different. Using a file size check here means it will rerun the strip and copy every time `fdroid update` is run for any image that needs to be stripped. If the source's ctime is newer than the destination, then the process should run since it is a newly created file. Even more so with mtime, since the destination's mtime is reset based on the source's. --- fdroidserver/update.py | 19 ++++++++------ tests/test_update.py | 56 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 65 insertions(+), 10 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index e25a5209..ba3b5506 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -800,14 +800,18 @@ def _strip_and_copy_image(in_file, outpath): It is not used at all in the F-Droid ecosystem, so its much safer just to remove it entirely. - This uses size+mtime to check for a new file since this process - actually modifies the resulting file to strip out the EXIF. + This only uses ctime/mtime to check for a new file since this + process actually modifies the resulting file to strip out the EXIF. + Therefore, whenever the file needs to be stripped, it will have a + newer ctime and most likely a different size. The mtime is copied + from the source to the destination, so it can be the same. outpath can be path to either a file or dir. The dir that outpath refers to must exist before calling this. Potential source of Python code to strip JPEGs without dependencies: http://www.fetidcascade.com/public/minimal_exif_writer.py + """ logging.debug('copying %s %s', in_file, outpath) @@ -823,12 +827,11 @@ def _strip_and_copy_image(in_file, outpath): else: out_file = outpath - if os.path.exists(out_file): - in_stat = os.stat(in_file) - out_stat = os.stat(out_file) - if in_stat.st_size == out_stat.st_size \ - and in_stat.st_mtime == out_stat.st_mtime: - return + if os.path.exists(out_file) and ( + os.path.getmtime(in_file) <= os.path.getmtime(out_file) + and os.path.getctime(in_file) <= os.path.getctime(out_file) + ): + return extension = common.get_extension(in_file)[1] if extension == 'png': diff --git a/tests/test_update.py b/tests/test_update.py index 3575b546..3d047d75 100755 --- a/tests/test_update.py +++ b/tests/test_update.py @@ -12,6 +12,7 @@ import shutil import string import subprocess import sys +import time import unittest import yaml import zipfile @@ -1369,15 +1370,66 @@ class UpdateTest(unittest.TestCase): def test_strip_and_copy_image(self): in_file = basedir / 'metadata/info.guardianproject.urzip/en-US/images/icon.png' out_file = os.path.join(self.testdir, 'icon.png') - fdroidserver.update._strip_and_copy_image(in_file, out_file) + with self.assertLogs(level=logging.DEBUG): + fdroidserver.update._strip_and_copy_image(in_file, out_file) self.assertTrue(os.path.exists(out_file)) def test_strip_and_copy_image_bad_filename(self): in_file = basedir / 'corrupt-featureGraphic.png' out_file = os.path.join(self.testdir, 'corrupt-featureGraphic.png') - fdroidserver.update._strip_and_copy_image(in_file, out_file) + with self.assertLogs(level=logging.DEBUG): + fdroidserver.update._strip_and_copy_image(in_file, out_file) self.assertFalse(os.path.exists(out_file)) + def test_strip_and_copy_image_unchanged(self): + in_file = basedir / 'metadata/info.guardianproject.urzip/en-US/images/icon.png' + out_file = os.path.join(self.testdir, 'icon.png') + shutil.copy2(in_file, out_file) + ctime = os.path.getctime(out_file) + delta = 0.01 + time.sleep(delta) # ensure reliable failure if file isn't preserved + with self.assertLogs(level=logging.DEBUG): # suppress log output + fdroidserver.update._strip_and_copy_image(in_file, out_file) + self.assertAlmostEqual(ctime, os.path.getctime(out_file), delta=delta) + + def test_strip_and_copy_image_in_file_ctime_changed(self): + out_file = os.path.join(self.testdir, 'icon.png') + with open(out_file, 'w') as fp: + fp.write('to be replaced') + size = os.path.getsize(out_file) + delta = 0.01 + time.sleep(delta) # ensure reliable failure when testing ctime + src_file = basedir / 'metadata/info.guardianproject.urzip/en-US/images/icon.png' + in_file = os.path.join(self.testdir, 'in-icon.png') + shutil.copy(src_file, in_file) + time.sleep(delta) # ensure reliable failure when testing ctime + with self.assertLogs(level=logging.DEBUG): # suppress log output + fdroidserver.update._strip_and_copy_image(in_file, out_file) + self.assertNotEqual(size, os.path.getsize(out_file)) + self.assertNotAlmostEqual( + os.path.getctime(in_file), os.path.getctime(out_file), delta=delta + ) + # _strip_and_copy_image syncs mtime from in_file to out_file + self.assertAlmostEqual( + os.path.getmtime(in_file), os.path.getmtime(out_file), delta=delta + ) + + def test_strip_and_copy_image_in_file_mtime_changed(self): + in_file = basedir / 'metadata/info.guardianproject.urzip/en-US/images/icon.png' + out_file = os.path.join(self.testdir, 'icon.png') + shutil.copy(in_file, out_file) + os.utime(out_file, (12345, 12345)) # set atime/mtime to something old + with self.assertLogs(level=logging.DEBUG): # suppress log output + fdroidserver.update._strip_and_copy_image(in_file, out_file) + delta = 0.01 + self.assertNotAlmostEqual( + os.path.getctime(in_file), os.path.getctime(out_file), delta=delta + ) + # _strip_and_copy_image syncs mtime from in_file to out_file + self.assertAlmostEqual( + os.path.getmtime(in_file), os.path.getmtime(out_file), delta=delta + ) + def test_create_metadata_from_template_empty_keys(self): apk = {'packageName': 'rocks.janicerand'} with mkdtemp() as tmpdir, TmpCwd(tmpdir): From d5bc7a694212c6a865323c7330cb3fe351dc20fc Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 9 Apr 2025 11:35:27 +0200 Subject: [PATCH 2056/2116] let pylint choose how many CPUs to use --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index bd209935..dff214c5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -78,7 +78,7 @@ disable_error_code = "no-redef, misc, arg-type" # Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the # number of processors available to use, and will cap the count on Windows to # avoid hangs. -jobs = 4 +jobs = 0 # Minimum Python version to use for version dependent checks. Will default to the # version used to run pylint. From e1a8e1a08a134ef528438e3a40df0f897e2ac38a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 9 Apr 2025 11:39:43 +0200 Subject: [PATCH 2057/2116] pylint: use default good-names list --- pyproject.toml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index dff214c5..0199f037 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -87,10 +87,6 @@ py-version = "3.9" # Files or directories to be skipped. They should be base names, not paths. ignore = ["apksigcopier.py", "looseversion.py"] -[tool.pylint.basic] -# Good variable names which should always be accepted, separated by a comma. -good-names = ["i", "j", "k", "ex", "Run", "f", "fp"] - [tool.pylint."messages control"] # Only show warnings with the listed confidence levels. Leave empty to show all. # Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE, UNDEFINED. From 8c14e44f63659b19961292bd5698813f46025c98 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 9 Apr 2025 11:41:42 +0200 Subject: [PATCH 2058/2116] gitlab-ci: show pylint output in log when it fails --- .gitlab-ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b8b49c27..d7dca64d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -268,13 +268,12 @@ pylint: script: - apt-get install pylint python3-pip - $pip install --break-system-packages pylint-gitlab - - pylint --output-format=pylint_gitlab.GitlabCodeClimateReporter + - pylint --output-format=colorized,pylint_gitlab.GitlabCodeClimateReporter:pylint-report.json fdroid makebuildserver setup.py fdroidserver/*.py tests/*.py - > pylint-report.json artifacts: reports: codequality: pylint-report.json From 494d811846f8c66cc92a5688c2e9290a4b7bf2ab Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 22 May 2025 19:54:07 +0200 Subject: [PATCH 2059/2116] update: If cateogories.yml only has icon:, then add name: E.g. if _categories.yml_ is like: ```yaml Time: icon: time.png ``` --- fdroidserver/index.py | 4 +++- tests/test_update.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index b65aa2b1..86394d7c 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -775,7 +775,9 @@ def make_v2(apps, packages, repodir, repodict, requestsdict, signer_fingerprints # include definitions for "auto-defined" categories, e.g. just used in app metadata for category in sorted(categories_used_by_apps): if category not in output['repo'][CATEGORIES_CONFIG_NAME]: - output['repo'][CATEGORIES_CONFIG_NAME][category] = {"name": {DEFAULT_LOCALE: category}} + output['repo'][CATEGORIES_CONFIG_NAME][category] = dict() + if 'name' not in output['repo'][CATEGORIES_CONFIG_NAME][category]: + output['repo'][CATEGORIES_CONFIG_NAME][category]['name'] = {DEFAULT_LOCALE: category} # do not include defined categories if no apps use them for category in list(output['repo'].get(CATEGORIES_CONFIG_NAME, list())): if category not in categories_used_by_apps: diff --git a/tests/test_update.py b/tests/test_update.py index 3d047d75..dbfbdef1 100755 --- a/tests/test_update.py +++ b/tests/test_update.py @@ -1913,6 +1913,41 @@ class UpdateTest(unittest.TestCase): index['repo'][CATEGORIES_CONFIG_NAME], ) + def test_categories_with_only_icon_defined(self): + """If cateogories.yml only includes the icon, the name should be added.""" + os.chdir(self.testdir) + os.mkdir('config') + os.mkdir('metadata') + os.mkdir('repo') + fdroidserver.common.write_config_file( + 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff\n' + ) + testvalue = 'Time' + Path('config/time.png').write_text('placeholder') + Path('config/categories.yml').write_text(testvalue + ': {icon: time.png}') + + testapk = os.path.join('repo', 'com.politedroid_6.apk') + shutil.copy(basedir / testapk, testapk) + Path('metadata/com.politedroid.yml').write_text(f'Categories: [{testvalue}]') + + with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']): + fdroidserver.update.main() + with open('repo/index-v2.json') as fp: + index = json.load(fp) + self.assertEqual( + { + 'icon': { + 'en-US': { + 'name': '/icons/time.png', + 'sha256': '4097889236a2af26c293033feb964c4cf118c0224e0d063fec0a89e9d0569ef2', + 'size': 11, + } + }, + 'name': {'en-US': testvalue}, + }, + index['repo'][CATEGORIES_CONFIG_NAME][testvalue], + ) + def test_auto_defined_categories_two_apps(self): """Repos that don't define categories in config/ should use auto-generated.""" os.chdir(self.testdir) From ce018158ee33f330cf0b3db84896fcc236d7832f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 20 Nov 2024 16:39:01 +0100 Subject: [PATCH 2060/2116] nightly: set up test for git clone function --- fdroidserver/nightly.py | 16 ++++++++++------ tests/test_nightly.py | 23 +++++++++++++++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 3eb4333c..30161c1d 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -203,6 +203,15 @@ def get_repo_base_url(clone_url: str, repo_git_base: str, force_type: Optional[s sys.exit(1) +def clone_git_repo(clone_url, git_mirror_path): + logging.debug(_('cloning {url}').format(url=clone_url)) + vcs = common.getvcs('git', clone_url, git_mirror_path) + p = vcs.git(['clone', '--', vcs.remote, str(vcs.local)]) + if p.returncode != 0: + print('WARNING: only public git repos are supported!') + raise VCSException('git clone %s failed:' % clone_url, p.output) + + def main(): """Deploy to F-Droid repository or generate SSH private key from keystore. @@ -338,12 +347,7 @@ def main(): git_mirror_repodir = os.path.join(git_mirror_fdroiddir, 'repo') git_mirror_metadatadir = os.path.join(git_mirror_fdroiddir, 'metadata') if not os.path.isdir(git_mirror_repodir): - logging.debug(_('cloning {url}').format(url=clone_url)) - vcs = common.getvcs('git', clone_url, git_mirror_path) - p = vcs.git(['clone', '--', vcs.remote, str(vcs.local)]) - if p.returncode != 0: - print('WARNING: only public git repos are supported!') - raise VCSException('git clone %s failed:' % clone_url, p.output) + clone_git_repo(clone_url, git_mirror_repodir) if not os.path.isdir(git_mirror_repodir): os.makedirs(git_mirror_repodir, mode=0o755) diff --git a/tests/test_nightly.py b/tests/test_nightly.py index 750a22fc..681df96d 100755 --- a/tests/test_nightly.py +++ b/tests/test_nightly.py @@ -192,6 +192,29 @@ class NightlyTest(unittest.TestCase): with self.assertRaises(exception.VCSException): nightly.main() + def test_clone_git_repo(self): + os.chdir(self.testdir) + common.options = Options + d = 'fakeappid' + nightly.clone_git_repo('https://gitlab.com/fdroid/ci-test-tiny-repo.git', d) + self.assertTrue(os.path.isdir(Path(d) / '.git')) + + def test_clone_git_repo_fails_on_gitlab_password_prompt(self): + os.chdir(self.testdir) + common.options = Options + d = 'shouldnotbecreated' + with self.assertRaises(exception.VCSException): + nightly.clone_git_repo(f'https://gitlab.com/{d}/{d}.git', d) + self.assertFalse(os.path.isdir(Path(d))) + + def test_clone_git_repo_fails_on_github_password_prompt(self): + os.chdir(self.testdir) + common.options = Options + d = 'shouldnotbecreated' + with self.assertRaises(exception.VCSException): + nightly.clone_git_repo(f'https://github.com/{d}/{d}.git', d) + self.assertFalse(os.path.isdir(Path(d))) + def _put_fdroid_in_args(self, args): """Find fdroid command that belongs to this source code tree""" fdroid = os.path.join(basedir.parent, 'fdroid') From b2057a1ce0065ba17ddde38a2ab24f4817d55bc4 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 20 Nov 2024 17:13:46 +0100 Subject: [PATCH 2061/2116] nightly: switch dep from vcs_git to GitPython This code already depends on GitPython, and hopefully the common.vcs* stuff can eventually go away entirely. GitPython should provide those bits already, and they are maintained by someone else. https://github.com/gitpython-developers/GitPython/pull/2029 --- fdroidserver/nightly.py | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 30161c1d..5b656464 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -21,6 +21,7 @@ import base64 import datetime import git import hashlib +import inspect import logging import os import paramiko @@ -204,12 +205,38 @@ def get_repo_base_url(clone_url: str, repo_git_base: str, force_type: Optional[s def clone_git_repo(clone_url, git_mirror_path): + """Clone a git repo into the given path, failing if a password is required. + + If GitPython's safe mode is present, this will use that. Otherwise, + this includes a very limited version of the safe mode just to ensure + this won't hang on password prompts. + + https://github.com/gitpython-developers/GitPython/pull/2029 + + """ logging.debug(_('cloning {url}').format(url=clone_url)) - vcs = common.getvcs('git', clone_url, git_mirror_path) - p = vcs.git(['clone', '--', vcs.remote, str(vcs.local)]) - if p.returncode != 0: - print('WARNING: only public git repos are supported!') - raise VCSException('git clone %s failed:' % clone_url, p.output) + try: + sig = inspect.signature(git.Repo.clone_from) + if 'safe' in sig.parameters: + git.Repo.clone_from(clone_url, git_mirror_path, safe=True) + else: + git.Repo.clone_from( + clone_url, + git_mirror_path, + env={ + 'GIT_ASKPASS': '/bin/true', + 'SSH_ASKPASS': '/bin/true', + 'GIT_USERNAME': 'u', + 'GIT_PASSWORD': 'p', + 'GIT_HTTP_USERNAME': 'u', + 'GIT_HTTP_PASSWORD': 'p', + 'GIT_SSH': '/bin/false', # for git < 2.3 + 'GIT_TERMINAL_PROMPT': '0', + }, + ) + except git.exc.GitCommandError as e: + logging.warning(_('WARNING: only public git repos are supported!')) + raise VCSException(f'git clone {clone_url} failed:', str(e)) from e def main(): From 76d711ba3c890b2352a4d020200d4861b6e43d14 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 18 Jun 2025 18:19:38 +0200 Subject: [PATCH 2062/2116] nightly: convert to black format --- fdroidserver/nightly.py | 85 ++++++++++++++++++++++++++++------------- pyproject.toml | 1 - 2 files changed, 58 insertions(+), 28 deletions(-) diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 5b656464..5156fb9a 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -177,7 +177,9 @@ def _ssh_key_from_debug_keystore(keystore: Optional[str] = None) -> str: return ssh_private_key_file -def get_repo_base_url(clone_url: str, repo_git_base: str, force_type: Optional[str] = None) -> str: +def get_repo_base_url( + clone_url: str, repo_git_base: str, force_type: Optional[str] = None +) -> str: """Generate the base URL for the F-Droid repository. Parameters @@ -324,19 +326,27 @@ def main(): # we are in GitLab CI repo_git_base = os.getenv('CI_PROJECT_PATH') + NIGHTLY clone_url = os.getenv('CI_PROJECT_URL') + NIGHTLY - repo_base = get_repo_base_url(clone_url, repo_git_base, force_type='gitlab.com') + repo_base = get_repo_base_url( + clone_url, repo_git_base, force_type='gitlab.com' + ) servergitmirror = 'git@' + urlparse(clone_url).netloc + ':' + repo_git_base - deploy_key_url = clone_url + '/-/settings/repository#js-deploy-keys-settings' + deploy_key_url = ( + f'{clone_url}/-/settings/repository#js-deploy-keys-settings' + ) git_user_name = os.getenv('GITLAB_USER_NAME') git_user_email = os.getenv('GITLAB_USER_EMAIL') elif 'TRAVIS_REPO_SLUG' in os.environ: # we are in Travis CI repo_git_base = os.getenv('TRAVIS_REPO_SLUG') + NIGHTLY clone_url = 'https://github.com/' + repo_git_base - repo_base = get_repo_base_url(clone_url, repo_git_base, force_type='github.com') + repo_base = get_repo_base_url( + clone_url, repo_git_base, force_type='github.com' + ) servergitmirror = 'git@github.com:' + repo_git_base - deploy_key_url = ('https://github.com/' + repo_git_base + '/settings/keys' - + '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys') + deploy_key_url = ( + f'https://github.com/{repo_git_base}/settings/keys' + + '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys' + ) git_user_name = repo_git_base git_user_email = os.getenv('USER') + '@' + platform.node() elif ( @@ -345,23 +355,35 @@ def main(): and 'CIRCLE_PROJECT_REPONAME' in os.environ ): # we are in Circle CI - repo_git_base = (os.getenv('CIRCLE_PROJECT_USERNAME') - + '/' + os.getenv('CIRCLE_PROJECT_REPONAME') + NIGHTLY) + repo_git_base = ( + os.getenv('CIRCLE_PROJECT_USERNAME') + + '/' + + os.getenv('CIRCLE_PROJECT_REPONAME') + + NIGHTLY + ) clone_url = os.getenv('CIRCLE_REPOSITORY_URL') + NIGHTLY - repo_base = get_repo_base_url(clone_url, repo_git_base, force_type='github.com') + repo_base = get_repo_base_url( + clone_url, repo_git_base, force_type='github.com' + ) servergitmirror = 'git@' + urlparse(clone_url).netloc + ':' + repo_git_base - deploy_key_url = ('https://github.com/' + repo_git_base + '/settings/keys' - + '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys') + deploy_key_url = ( + f'https://github.com/{repo_git_base}/settings/keys' + + '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys' + ) git_user_name = os.getenv('CIRCLE_USERNAME') git_user_email = git_user_name + '@' + platform.node() elif 'GITHUB_ACTIONS' in os.environ: # we are in Github actions - repo_git_base = (os.getenv('GITHUB_REPOSITORY') + NIGHTLY) - clone_url = (os.getenv('GITHUB_SERVER_URL') + '/' + repo_git_base) - repo_base = get_repo_base_url(clone_url, repo_git_base, force_type='github.com') + repo_git_base = os.getenv('GITHUB_REPOSITORY') + NIGHTLY + clone_url = os.getenv('GITHUB_SERVER_URL') + '/' + repo_git_base + repo_base = get_repo_base_url( + clone_url, repo_git_base, force_type='github.com' + ) servergitmirror = 'git@' + urlparse(clone_url).netloc + ':' + repo_git_base - deploy_key_url = ('https://github.com/' + repo_git_base + '/settings/keys' - + '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys') + deploy_key_url = ( + f'https://github.com/{repo_git_base}/settings/keys' + + '\nhttps://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys' + ) git_user_name = os.getenv('GITHUB_ACTOR') git_user_email = git_user_name + '@' + platform.node() else: @@ -395,9 +417,13 @@ You can use it with the [F-Droid](https://f-droid.org/) Android app. [![{repo_url}]({repo_url}/icons/icon.png)](https://fdroid.link/#{repo_url}) -Last updated: {date}'''.format(repo_git_base=repo_git_base, - repo_url=repo_url, - date=datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S UTC')) +Last updated: {date}'''.format( + repo_git_base=repo_git_base, + repo_url=repo_url, + date=datetime.datetime.now(datetime.timezone.utc).strftime( + '%Y-%m-%d %H:%M:%S UTC' + ), + ) with open(readme_path, 'w') as fp: fp.write(readme) mirror_git_repo.git.add(all=True) @@ -458,10 +484,9 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, common.assert_config_keystore(config) logging.debug( - _('Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}').format( - cibase=cibase, - repo_basedir=repo_basedir - ) + _( + 'Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}' + ).format(cibase=cibase, repo_basedir=repo_basedir) ) for root, dirs, files in os.walk(cibase): @@ -549,10 +574,16 @@ Last updated: {date}'''.format(repo_git_base=repo_git_base, if not os.path.exists(androiddir): os.mkdir(androiddir) logging.info(_('created {path}').format(path=androiddir)) - logging.error(_('{path} does not exist! Create it by running:').format(path=options.keystore) - + '\n keytool -genkey -v -keystore ' + options.keystore + ' -storepass android \\' - + '\n -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 \\' - + '\n -dname "CN=Android Debug,O=Android,C=US"') + logging.error( + _('{path} does not exist! Create it by running:').format( + path=options.keystore + ) + + '\n keytool -genkey -v -keystore ' + + options.keystore + + ' -storepass android \\' + + '\n -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 \\' + + '\n -dname "CN=Android Debug,O=Android,C=US"' + ) sys.exit(1) ssh_dir = os.path.join(os.getenv('HOME'), '.ssh') privkey = _ssh_key_from_debug_keystore(options.keystore) diff --git a/pyproject.toml b/pyproject.toml index 0199f037..a1f8a99b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,6 @@ force-exclude = '''( | fdroidserver/common\.py | fdroidserver/index\.py | fdroidserver/metadata\.py - | fdroidserver/nightly\.py | fdroidserver/update\.py | fdroidserver/vmtools\.py | tests/config\.py From 2590f00ff0c02f3822039e7cb4649bb84786a8ba Mon Sep 17 00:00:00 2001 From: Ecron Date: Mon, 16 Jun 2025 19:13:57 +0200 Subject: [PATCH 2063/2116] Translated using Weblate: Catalan (ca) by Ecron Currently translated at 100.0% (579 of 579 strings) Co-authored-by: Ecron Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ca/ Translation: F-Droid/F-Droid Server --- locale/ca/LC_MESSAGES/fdroidserver.po | 52 +++++++++++++-------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index d7bdddfb..4a12ad45 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -6,21 +6,21 @@ # Adrià Martín , 2024. # unmes , 2024. # Joan Pujolar , 2024. -# Ecron , 2024. +# Ecron , 2024, 2025. msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2025-01-30 12:31+0000\n" -"Last-Translator: pitroig \n" +"PO-Revision-Date: 2025-05-16 16:36+0000\n" +"Last-Translator: Ecron \n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.10-dev\n" +"X-Generator: Weblate 5.12-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -46,7 +46,7 @@ msgstr "\"%s/\" no té cap fitxer de metadades coincidents!" #: ../fdroidserver/index.py msgid "\"isPrimary\" key should not be added to mirrors!" -msgstr "" +msgstr "La clau «isPrimary» no s'hauria d'afegir a les rèpliques!" #: ../fdroidserver/index.py #, python-brace-format @@ -307,7 +307,7 @@ msgstr "Sí automàtic a totes les demandes." #: ../fdroidserver/index.py #, python-brace-format msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" -msgstr "Tipus d'entrada incorrecta \"{mirrortype}\" a la configuració de miralls: {mirror}" +msgstr "Tipus d'entrada incorrecta «{mirrortype}» a la configuració de les rèpliques: {mirror}" #: ../fdroidserver/mirror.py msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" @@ -485,9 +485,9 @@ msgid "Creating \"{path}\" for configuring s3cmd." msgstr "S'està creant \"{path}\" per configurar s3cmd." #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Creating empty {config_file}" -msgstr "S'està llegint '{config_file}'" +msgstr "S'està creant un «{config_file}» buit" #: ../fdroidserver/publish.py msgid "Creating log directory" @@ -535,7 +535,7 @@ msgstr "S'està suprimint l'arxiu, el dipòsit és massa gran ({size} màxim {li #: ../fdroidserver/deploy.py #, python-brace-format msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" -msgstr "S'està suprimint l'historial del mirall de git, el dipòsit és massa gran ({size} màxim {limit})" +msgstr "S'està suprimint l'historial git-mirror, el dipòsit és massa gran ({size}, màxim {limit})" #: ../fdroidserver/update.py #, python-brace-format @@ -601,7 +601,7 @@ msgstr "No usis les sumes de verificació \"rsync\"" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "Baixeu l'F-Droid.apk amb els miralls que filtren menys dades a la xarxa" +msgstr "Baixeu l'F-Droid.apk amb les rèpliques que filtren menys dades a la xarxa" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -657,12 +657,12 @@ msgstr "ERROR: {key} a {path} no és \"arxiu\" o \"dipòsit\"!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} not a valid key!" -msgstr "" +msgstr "ERROR: {key} no és una clau vàlida!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}'s value should be of type {t}!" -msgstr "" +msgstr "ERROR: el valor de {key} hauria de ser del tipus {t}!" #: ../fdroidserver/lint.py #, python-brace-format @@ -689,9 +689,9 @@ msgid "Environment variable {var} from {configname} is not set!" msgstr "La variable d'entorn {var} de {configname} no està establerta!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Environment variable {{env: {var}}} is not set!" -msgstr "La variable d'entorn {var} de {configname} no està establerta!" +msgstr "La variable d'entorn {{env: {var}}} no està establerta!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" @@ -933,9 +933,9 @@ msgid "Ignoring bad element in manifest: %s" msgstr "S'ignorarà l'element incorrecte al manifest: %s" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Ignoring deprecated {oldfile}, use {newfile}!" -msgstr "{oldfile} és obsolet, utilitzeu {newfile}" +msgstr "S'ignorarà el {oldfile} obsolet, utilitzeu {newfile}!" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -956,11 +956,11 @@ msgstr "Inclou els fitxers .asc de signatura PGP a la rèplica" #: ../fdroidserver/mirror.py msgid "Include the build logs in the mirror" -msgstr "Inclou els registres de construcció al mirall" +msgstr "Inclou els registres de construcció en la rèplica" #: ../fdroidserver/mirror.py msgid "Include the source tarballs in the mirror" -msgstr "Inclou els arxius tar d'origen al mirall" +msgstr "Inclou els fitxers tarball del codi font en la rèplica" #: ../fdroidserver/metadata.py #, python-format @@ -1143,7 +1143,7 @@ msgstr "S'ha arribat a la profunditat màxima de recursivitat en el fitxer ZIP: #: ../fdroidserver/index.py #, python-brace-format msgid "Mirror config for {url} contains \"isPrimary\" key!" -msgstr "" +msgstr "La configuració de la rèplica per a {url} conté la clau «isPrimary»!" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1287,7 +1287,7 @@ msgstr "El nom del paquet de l'OBB no coincideix amb un APK compatible:" #: ../fdroidserver/deploy.py msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" -msgstr "Màquina fora de línia, s'ometrà la generació del mirall git fins al `fdroid deploy`" +msgstr "Màquina fora de línia, s'ometrà la generació de la rèplica git fins al `fdroid deploy`" #: ../fdroidserver/deploy.py msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." @@ -1310,7 +1310,7 @@ msgstr "Només s'admeten PNG i JPEG per als gràfics, s'ha trobat: {path}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" -msgstr "" +msgstr "Només accepta una clau única «env»" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" @@ -1471,7 +1471,7 @@ msgstr "Actualitza i cau les regles de l'escàner i les signatures de la xarxa" #: ../fdroidserver/publish.py #, python-brace-format msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." -msgstr "" +msgstr "No se signarà «{path}», el fitxer existeix a les dues carpetes {dir1} i {dir2}." #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." @@ -1699,7 +1699,7 @@ msgstr "Mode de prova: posa la sortida només al directori tmp, i sempre constru #: ../fdroidserver/index.py msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" -msgstr "" +msgstr "No s'ha instal·lat el paquet de Python «qrcode» (p. ex. apt-get install python3-qrcode)!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -2322,12 +2322,12 @@ msgstr "local_copy_dir ha de ser directori, no un fitxer!" #: ../fdroidserver/index.py #, python-format msgid "mirror '%s' does not end with 'fdroid'!" -msgstr "el mirall '%s' no acaba amb 'fdroid'!" +msgstr "La rèplica «%s» no acaba amb «fdroid»!" #: ../fdroidserver/index.py #, python-brace-format msgid "mirrors set twice, in config.yml and {path}!" -msgstr "miralls establerts dues vegades, a config.yml i {path}!" +msgstr "rèpliques establertes dues vegades, a config.yml i {path}!" #: /usr/lib/python3.11/argparse.py msgid "mutually exclusive arguments must be optional" @@ -2597,7 +2597,7 @@ msgstr "{name} \"{section}/icons/{path}\" no existeix! Comproveu \"config.yml\". #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" -msgstr "" +msgstr "{path1} és un duplicat de {path2}, elimineu-ne un!" #: ../fdroidserver/import_subcommand.py #, python-brace-format From b6d7e8732bf9824c75a07f9fefe2454677cdbd18 Mon Sep 17 00:00:00 2001 From: WaldiS Date: Mon, 16 Jun 2025 19:14:04 +0200 Subject: [PATCH 2064/2116] Translated using Weblate: Polish (pl) by WaldiS Currently translated at 98.2% (569 of 579 strings) Co-authored-by: WaldiS Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ Translation: F-Droid/F-Droid Server --- locale/pl/LC_MESSAGES/fdroidserver.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 4726753c..19f85820 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2025-03-13 20:43+0000\n" +"PO-Revision-Date: 2025-06-14 18:05+0000\n" "Last-Translator: WaldiS \n" "Language-Team: Polish \n" "Language: pl\n" @@ -19,7 +19,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.11-dev\n" +"X-Generator: Weblate 5.12-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -485,9 +485,9 @@ msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Tworzenie \"{path}\" do konfiguracji s3cmd." #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Creating empty {config_file}" -msgstr "Czytaj '{config_file}'" +msgstr "Tworzenie pustego pliku {config_file}" #: ../fdroidserver/publish.py msgid "Creating log directory" From 7e8976d9b063e8131ea0c59a4bf34a1665fa1bf2 Mon Sep 17 00:00:00 2001 From: ssantos Date: Mon, 16 Jun 2025 19:14:00 +0200 Subject: [PATCH 2065/2116] Translated using Weblate: Portuguese (Portugal) (pt_PT) by ssantos Currently translated at 100.0% (579 of 579 strings) Co-authored-by: ssantos Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pt_PT/ Translation: F-Droid/F-Droid Server --- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 32 ++++++++++++------------ 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index a3538f79..1fac5cd5 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -12,7 +12,7 @@ msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2025-03-02 21:32+0000\n" +"PO-Revision-Date: 2025-05-30 07:19+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" "Language: pt_PT\n" @@ -20,7 +20,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.10.3-dev\n" +"X-Generator: Weblate 5.12-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -46,7 +46,7 @@ msgstr "\"%s/\" não tem ficheiro de metadados correspondente!" #: ../fdroidserver/index.py msgid "\"isPrimary\" key should not be added to mirrors!" -msgstr "" +msgstr "A chave \"isPrimary\" não deve ser adicionada em espelhos!" #: ../fdroidserver/index.py #, python-brace-format @@ -485,9 +485,9 @@ msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Criando \"{path}\" para configurar s3cmd." #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Creating empty {config_file}" -msgstr "A ler '{config_file}'" +msgstr "A criar '{config_file}' vazio" #: ../fdroidserver/publish.py msgid "Creating log directory" @@ -657,12 +657,12 @@ msgstr "ERRO: {key} em {path} não é \"arquivo\" ou \"repositório\"!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} not a valid key!" -msgstr "" +msgstr "ERRO: {key} não é uma chave válida!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}'s value should be of type {t}!" -msgstr "" +msgstr "ERRO: o valor de {key} deve ser do tipo {t}!" #: ../fdroidserver/lint.py #, python-brace-format @@ -689,9 +689,9 @@ msgid "Environment variable {var} from {configname} is not set!" msgstr "A variável de ambiente {var} de {configname} não está definida!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Environment variable {{env: {var}}} is not set!" -msgstr "A variável de ambiente {var} de {configname} não está definida!" +msgstr "A variável de ambiente {{env: {var} não está definida!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" @@ -933,9 +933,9 @@ msgid "Ignoring bad element in manifest: %s" msgstr "A ignorar o elemento mau no manifesto: %s" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Ignoring deprecated {oldfile}, use {newfile}!" -msgstr "{oldfile} está obsoleto, use {newfile}" +msgstr "A ignorar {oldfile} obsoleto, use {newfile}!" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1143,7 +1143,7 @@ msgstr "Profundidade máxima de recursão no ficheiro ZIP atingida: %s" #: ../fdroidserver/index.py #, python-brace-format msgid "Mirror config for {url} contains \"isPrimary\" key!" -msgstr "" +msgstr "A configuração de espelho de {url} contém a chave \"isPrimary\"!" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1310,7 +1310,7 @@ msgstr "Somente PNG e JPEG são suportados para gráficos, encontrado: {path}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" -msgstr "" +msgstr "Aceita apenas uma única chave \"env\"" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" @@ -1471,7 +1471,7 @@ msgstr "Atualizar e armazenar as regras e assinaturas do scanner da rede no cach #: ../fdroidserver/publish.py #, python-brace-format msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." -msgstr "" +msgstr "Recuso assinar '{path}', o ficheiro existe nas pastas {dir1} e {dir2}." #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." @@ -1699,7 +1699,7 @@ msgstr "Modo de teste - ponha a saída apenas no diretório tmp e sempre compile #: ../fdroidserver/index.py msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" -msgstr "" +msgstr "O pacote de Python \"qrcode\" não está instalado (por exemplo, apt-get install python3-qrcode)!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -2597,7 +2597,7 @@ msgstr "{name} \"{section}/icons/{path}\" não existe! Corrija-o no \"config.yml #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" -msgstr "" +msgstr "{path1} é uma duplicata de {path2}, remova uma!" #: ../fdroidserver/import_subcommand.py #, python-brace-format From 57541eb52ea8e2efbd419bb5253bf45c9f435003 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuri=20K=C3=9C=C3=87=C3=9CKLER?= Date: Mon, 16 Jun 2025 19:13:56 +0200 Subject: [PATCH 2066/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Turki?= =?UTF-8?q?sh=20(tr)=20by=20Nuri=20K=C3=9C=C3=87=C3=9CKLER=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 98.6% (571 of 579 strings) Co-authored-by: Nuri KÜÇÜKLER Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/tr/ Translation: F-Droid/F-Droid Server --- locale/tr/LC_MESSAGES/fdroidserver.po | 51 ++++++++++++++------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index 8ab45b5c..97bb762d 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -5,13 +5,14 @@ # Oğuz Ersen , 2022, 2023, 2024. # Bai , 2023. # "M. Fatih Uluçam" , 2025. +# Nuri KÜÇÜKLER , 2025. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2025-05-05 19:03+0000\n" -"Last-Translator: \"M. Fatih Uluçam\" \n" +"PO-Revision-Date: 2025-05-14 08:53+0000\n" +"Last-Translator: Nuri KÜÇÜKLER \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" @@ -44,7 +45,7 @@ msgstr "\"%s/\" eşleşen üst veri dosyasına sahip değil!" #: ../fdroidserver/index.py msgid "\"isPrimary\" key should not be added to mirrors!" -msgstr "" +msgstr "\"isPrimary\" anahtarı yansılara eklenmemelidir!" #: ../fdroidserver/index.py #, python-brace-format @@ -296,11 +297,11 @@ msgstr "UpdateCheckMode ile AutoUpdateMode: HTTP bir desene sahip olmalıdır." #: ../fdroidserver/install.py msgid "Automatic no to all prompts." -msgstr "" +msgstr "Bütün sorulara otomatik olarak hayır." #: ../fdroidserver/install.py msgid "Automatic yes to all prompts." -msgstr "" +msgstr "Bütün sorulara otomatik olarak evet." #: ../fdroidserver/index.py #, python-brace-format @@ -397,7 +398,7 @@ msgstr "Temiz güncelleme - önbellekleri kullanmaz, tüm APKları yeniden işle #: ../fdroidserver/common.py msgid "Color the log output" -msgstr "" +msgstr "Günlük çıktısını renklendir" #: ../fdroidserver/import_subcommand.py msgid "Comma separated list of categories." @@ -414,7 +415,7 @@ msgstr "Değişiklikleri işle" #: ../fdroidserver/checkupdates.py msgid "Commit changes, push, then make a merge request" -msgstr "" +msgstr "Değişiklikleri uygula, yükle ve bir birleştirme isteği yap" #: ../fdroidserver/metadata.py #, python-brace-format @@ -599,7 +600,7 @@ msgstr "Rsync sağlama toplamlarını kullanma" #: ../fdroidserver/install.py msgid "Download F-Droid.apk using mirrors that leak less to the network" -msgstr "" +msgstr "F-Droid.apk'yı ağa az bilgi sızdıracak şekilde indir" #: ../fdroidserver/__main__.py msgid "Download complete mirrors of small repos" @@ -655,12 +656,12 @@ msgstr "HATA: {path} içindeki {key} \"archive\" veya \"repo\" değil!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} not a valid key!" -msgstr "" +msgstr "HATA: {key} geçerli bir anahtar değil!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}'s value should be of type {t}!" -msgstr "" +msgstr "Hata: {key} anahtarının değeri {t} tipinde olmalı!" #: ../fdroidserver/lint.py #, python-brace-format @@ -713,7 +714,7 @@ msgstr "APK'lardan imzaları ayıkla" #: ../fdroidserver/install.py msgid "F-Droid.apk could not be downloaded from any known source!" -msgstr "" +msgstr "F-Droid.apk bilinen kaynakların hiç birinden indirilemedi!" #: ../fdroidserver/update.py #, python-brace-format @@ -1141,7 +1142,7 @@ msgstr "ZIP dosyasında azami özyineleme derinliğine ulaşıldı: %s" #: ../fdroidserver/index.py #, python-brace-format msgid "Mirror config for {url} contains \"isPrimary\" key!" -msgstr "" +msgstr "{url} için yansı yapılandırması \"isPrimary\" anahtarını içeriyor!" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1174,7 +1175,7 @@ msgstr "Bağlı aygıt bulunamadı" #: ../fdroidserver/install.py msgid "No devices found for `adb install`! Please plug one in." -msgstr "" +msgstr "`adb install` için aygıt bulunamadı! Lütfen bir tane takın." #: ../fdroidserver/index.py msgid "No fingerprint in URL." @@ -1308,7 +1309,7 @@ msgstr "Grafikler için yalnızca PNG ve JPEG desteklenir, bulunan: {path}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" -msgstr "" +msgstr "Sadece bir tane anahtar \"env\" kabul edilir" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" @@ -1378,7 +1379,7 @@ msgstr "Kolay kopyala yapıştır için gizli değişkeni terminale yaz" #: ../fdroidserver/install.py #, python-brace-format msgid "Privacy mode was enabled based on your locale ({country_code})." -msgstr "" +msgstr "Yerel ayarınız ({country_code}) baz alınarak gizlilik kipi etkinleştirildi." #: ../fdroidserver/scanner.py #, python-format @@ -1469,11 +1470,11 @@ msgstr "Tarayıcı kurallarını ve imzalarını ağdan yenile ve önbelleğe al #: ../fdroidserver/publish.py #, python-brace-format msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." -msgstr "" +msgstr "'{path}' imzalanması reddedildi, dosya hem {dir1} hem de {dir2} dizininde yer alıyor." #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." -msgstr "" +msgstr "Başarıyla doğrulanmışsa, kaynak sıkıştırılmış dosyayı ve var olan bütün APK'ları kaldır." #: ../fdroidserver/common.py msgid "Removing specified files" @@ -1504,7 +1505,7 @@ msgstr "Çıkışı uyarılara ve hatalara kısıtla" #: ../fdroidserver/net.py #, python-format msgid "Retrying failed download: %s" -msgstr "" +msgstr "Başarısız indirme tekrar deneniyor: %s" #: ../fdroidserver/__main__.py msgid "Rewrite all the metadata files" @@ -1573,7 +1574,7 @@ msgstr[1] "Tarayıcı {} sorun buldu" #: ../fdroidserver/scanner.py msgid "Scanning APK for extra signing blocks." -msgstr "" +msgstr "APK'daki ekstra imzalama blokları taranıyor." #: ../fdroidserver/scanner.py msgid "Scanning APK with dexdump for known non-free classes." @@ -1697,7 +1698,7 @@ msgstr "Sınama kipi - çıkışı sadece tmp dizinine koy, ve her zaman inşa e #: ../fdroidserver/index.py msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" -msgstr "" +msgstr "\"qrcode\" Python paketi kurulu değil (yüklemek için: apt-get install python3-qrcode)!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -2001,7 +2002,7 @@ msgstr "İndeks imzası doğrulanıyor:" #: ../fdroidserver/install.py #, python-brace-format msgid "Verifying package {path} with apksigner." -msgstr "" +msgstr "{path} paketi apksigner ile doğrulanıyor." #: ../fdroidserver/deploy.py #, python-brace-format @@ -2014,7 +2015,7 @@ msgstr "Olası üst veri hataları hakkında uyar" #: ../fdroidserver/scanner.py msgid "WebAssembly binary file" -msgstr "" +msgstr "WebAssembly ikilik dosyası" #: ../fdroidserver/update.py msgid "When configured for signed indexes, create only unsigned indexes at this stage" @@ -2030,11 +2031,11 @@ msgstr "İmzalama veya doğrulama başarısız olduğunda, bir hata koduyla çı #: ../fdroidserver/install.py msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" -msgstr "" +msgstr "F-Droid.apk'nın adb aracılığıyla indirilmesini ve yüklenmesini ister misiniz? (EVET/hayır)" #: ../fdroidserver/install.py msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" -msgstr "" +msgstr "Uygulamaları f-droid.org adresinden indirmek ister misiniz? (EVET/hayır)" #: ../fdroidserver/init.py msgid "X.509 'Distinguished Name' used when generating keys" @@ -2051,7 +2052,7 @@ msgstr "ZIP dosya arşivi" #: ../fdroidserver/install.py #, python-brace-format msgid "adb reports {serial} is \"{status}\"!" -msgstr "" +msgstr "adb {serial} için {status} durumunu veriyor!" #: ../fdroidserver/nightly.py #, python-brace-format From 85dba17d482291fc997320f4408dce851a412b28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bora=20At=C4=B1c=C4=B1?= Date: Mon, 16 Jun 2025 19:13:59 +0200 Subject: [PATCH 2067/2116] =?UTF-8?q?Translated=20using=20Weblate:=20Turki?= =?UTF-8?q?sh=20(tr)=20by=20Bora=20At=C4=B1c=C4=B1=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 99.8% (578 of 579 strings) Co-authored-by: Bora Atıcı Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/tr/ Translation: F-Droid/F-Droid Server --- locale/tr/LC_MESSAGES/fdroidserver.po | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index 97bb762d..4c051537 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -6,13 +6,14 @@ # Bai , 2023. # "M. Fatih Uluçam" , 2025. # Nuri KÜÇÜKLER , 2025. +# Bora Atıcı , 2025. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2025-05-14 08:53+0000\n" -"Last-Translator: Nuri KÜÇÜKLER \n" +"PO-Revision-Date: 2025-05-26 22:01+0000\n" +"Last-Translator: Bora Atıcı \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" @@ -484,9 +485,9 @@ msgid "Creating \"{path}\" for configuring s3cmd." msgstr "s3cmd yapılandırması için \"{path}\" oluşturuluyor." #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Creating empty {config_file}" -msgstr "'{config_file}' okunuyor" +msgstr "Boş {config_file} oluşturuluyor" #: ../fdroidserver/publish.py msgid "Creating log directory" @@ -688,9 +689,9 @@ msgid "Environment variable {var} from {configname} is not set!" msgstr "{configname} içinden {var} ortam değişkeni ayarlı değil!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Environment variable {{env: {var}}} is not set!" -msgstr "{configname} içinden {var} ortam değişkeni ayarlı değil!" +msgstr "Ortam değişkeni {{env: {var}}} ayarlanmadı!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" @@ -932,9 +933,9 @@ msgid "Ignoring bad element in manifest: %s" msgstr "Manifestteki hatalı öğe yok sayılıyor: %s" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Ignoring deprecated {oldfile}, use {newfile}!" -msgstr "{oldfile} kullanımdan kaldırıldı, {newfile} kullanın" +msgstr "{oldfile} kullanımdan kaldırıldı, {newfile} kullanın!" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -2469,7 +2470,7 @@ msgstr "şu argümanlar gerekli: %s" #: ../fdroidserver/install.py msgid "true" -msgstr "" +msgstr "doğru" #: /usr/lib/python3.11/argparse.py #, python-format @@ -2506,7 +2507,7 @@ msgstr "virustotal.com hızı sınırlıyor, yeniden deneme bekleniyor..." #: ../fdroidserver/install.py msgid "yes" -msgstr "" +msgstr "evet" #: ../fdroidserver/publish.py #, python-brace-format @@ -2596,7 +2597,7 @@ msgstr "{name} \"{section}/icons/{path}\" yok! config.yml içinde düzeltin." #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" -msgstr "" +msgstr "{path1}, {path2} 'in bir kopyasıdır, birini kaldırın!" #: ../fdroidserver/import_subcommand.py #, python-brace-format @@ -2621,7 +2622,7 @@ msgstr "{path} virustotal tarafından {count} defa işaretlendi:" #: ../fdroidserver/install.py #, python-brace-format msgid "{path} has the wrong fingerprint ({fingerprint})!" -msgstr "" +msgstr "{path} yanlış {fingerprint} parmak izine sahip!" #: ../fdroidserver/common.py #, python-brace-format From 894fdb641ee7e6b436dd526448a3ab56e6697191 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 18 Jun 2025 10:32:01 +0200 Subject: [PATCH 2068/2116] buildserver: androguard res0/res1 fixes from bookworm-backports --- buildserver/provision-apt-get-install | 1 + 1 file changed, 1 insertion(+) diff --git a/buildserver/provision-apt-get-install b/buildserver/provision-apt-get-install index fed5fa57..ca39c47b 100644 --- a/buildserver/provision-apt-get-install +++ b/buildserver/provision-apt-get-install @@ -104,6 +104,7 @@ apt-get upgrade apt-get update || apt-get update packages=" + androguard/bookworm-backports apksigner default-jdk-headless default-jre-headless From 53bf6c7ce190410f0c0d1cc32eef6e6e5cffe344 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 18 Jun 2025 19:06:27 +0200 Subject: [PATCH 2069/2116] deploy: use master branch when working complete git-mirror repo The *-nightly git repo always uses the _master_ branch. The `index_only:` support maintains a separate local branch since its git repo should be as small as possible. The full repo should be maintained for mirrors not using `index_only:` so that when it force-pushes, it does not need to always push all the files, only the updated ones. So the full repo should be maintained in the _master_ branch, and only the `index_only` mirrors should have their own branch. This adds a test case to reproduce this error: https://gitlab.com/fdroid/fdroidclient/-/jobs/10347168516 This case also applies to any setup that used `servergitmirrors:` before the `index_only:` feature was added. This also applies to cases if the repo maintainer manually clones the *-nightly repo into _fdroid/git-mirror/_ --- fdroidserver/deploy.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index ad108340..cc7d6c52 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -617,6 +617,13 @@ def update_servergitmirrors(servergitmirrors, repo_section): For history, there is the archive section, and there is the binary transparency log. + This will attempt to use the existing remote branch so that it does + not have to push all of the files in the repo each time. Old setups + or runs of `fdroid nightly` might use the "master" branch. For the + "index only" mode, it will recreate the branch from scratch each + time since usually all the files are changed. In any case, the + index files are small compared to the full repo. + """ from clint.textui import progress @@ -687,7 +694,7 @@ def update_servergitmirrors(servergitmirrors, repo_section): if is_index_only: local_branch_name = 'index_only' else: - local_branch_name = 'full' + local_branch_name = GIT_BRANCH if local_branch_name in repo.heads: repo.git.switch(local_branch_name) else: From 63298ad2ad649f311475aa013de38d076d4cf984 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 23 Jun 2025 15:16:21 +0200 Subject: [PATCH 2070/2116] update: change assert to fix flaky tests This was happening often: ``` ====================================================================== FAIL: test_strip_and_copy_image_in_file_ctime_changed (tests.test_update.UpdateTest.test_strip_and_copy_image_in_file_ctime_changed) ---------------------------------------------------------------------- Traceback (most recent call last): File "/builds/fdroid/fdroidserver/tests/test_update.py", line 1409, in test_strip_and_copy_image_in_file_ctime_changed self.assertNotAlmostEqual( AssertionError: 1750683024.4857466 == 1750683024.4957466 within 0.01 delta (0.009999990463256836 difference) ``` --- tests/test_update.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/test_update.py b/tests/test_update.py index dbfbdef1..de39d8fd 100755 --- a/tests/test_update.py +++ b/tests/test_update.py @@ -1406,9 +1406,7 @@ class UpdateTest(unittest.TestCase): with self.assertLogs(level=logging.DEBUG): # suppress log output fdroidserver.update._strip_and_copy_image(in_file, out_file) self.assertNotEqual(size, os.path.getsize(out_file)) - self.assertNotAlmostEqual( - os.path.getctime(in_file), os.path.getctime(out_file), delta=delta - ) + self.assertTrue(os.path.getctime(in_file) <= os.path.getctime(out_file)) # _strip_and_copy_image syncs mtime from in_file to out_file self.assertAlmostEqual( os.path.getmtime(in_file), os.path.getmtime(out_file), delta=delta From fd3f71ad3c60c7e5fad7619de75d310aa1061102 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 23 Jun 2025 22:37:10 +0200 Subject: [PATCH 2071/2116] run tests/refresh-SUSS_DEFAULT.py --- fdroidserver/scanner.py | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 3de65d33..a81912fc 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -2218,8 +2218,7 @@ SUSS_DEFAULT = r'''{ "https://www.android.com/gms/" ], "gradle_signatures": [ - "com.google.gms(?!.google-services)", - "com.google.android.gms(?!.oss-licenses-plugin)", + "com.google.android.gms(?!.(oss-licenses-plugin|strict-version-matcher-plugin))", "com.google.android.ump", "androidx.core:core-google-shortcuts", "androidx.credentials:credentials-play-services-auth", @@ -2235,7 +2234,19 @@ SUSS_DEFAULT = r'''{ "com.yayandroid:locationmanager", "(? Date: Mon, 23 Jun 2025 22:34:24 +0200 Subject: [PATCH 2072/2116] update CHANGELOG.md --- CHANGELOG.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f21550a2..0d43a877 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,41 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +## [2.4.1] - 2025-06-23 + +### Added + +* build: Clearer error messages when working with Git. +* verify: generate .json files that list all reports + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1632 + +### Fixed + +* deploy: use master branch when working complete git-mirror repo + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1666 +* update: use ctime/mtime to control _strip_and_copy_image runs + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1665 +* update: If categories.yml only has icon:, then add name: + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1659 +* update: fix handling of Triple-T 1.0.0 graphics + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1652 +* update: never execute any VCS e.g. git + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1630 +* config: lazyload environment variables in config.yml + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1645 +* config: make localized name/description/icon optional + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1649 +* lint: add repo_key_sha256 to list of valid config keys + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1643 +* build: calculate all combinations of gradle flavors + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1638 +* build: set SOURCE_DATE_EPOCH from app's git otherwise fdroiddata metadata file + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1653 +* Sync translations for all supported languages: ca cs de fr ga ja pl pt pt_BR + pt_PT ru sq tr uk zh_Hans + +### Removed + ## [2.4.0] - 2025-03-25 ### Added From f9531465052ae66c036ddd3a58ce1f9252abe490 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 23 Jun 2025 22:34:49 +0200 Subject: [PATCH 2073/2116] version 2.4.1 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 289cd8c1..a25ddfc0 100755 --- a/setup.py +++ b/setup.py @@ -70,7 +70,7 @@ with open("README.md", "r") as fh: setup( name='fdroidserver', - version='2.4.0', + version='2.4.1', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From dcd5336138ddae872b6869f67976b2e7f46018d6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 23 Jun 2025 23:10:15 +0200 Subject: [PATCH 2074/2116] scanner: fix tests after !1526 --- tests/test_scanner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_scanner.py b/tests/test_scanner.py index 3515e858..d982ed4f 100755 --- a/tests/test_scanner.py +++ b/tests/test_scanner.py @@ -74,6 +74,7 @@ class ScannerTest(unittest.TestCase): 'com.jens.automation2': 3, 'firebase-suspect': 1, 'org.mozilla.rocket': 2, + 'org.piepmeyer.gauguin': 1, 'org.tasks': 3, 'realm': 1, 'se.manyver': 3, From 6b6cc2379cda235aa523c0554887421088296a53 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 24 Jun 2025 12:56:24 +0200 Subject: [PATCH 2075/2116] gitlab-ci: "fdroid build" changes: for "docker" job "docker" depends on "fdroid build", so "fdroid build"'s changes: needs to include "docker"'s. --- .gitlab-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d7dca64d..8f8b5271 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -512,6 +512,9 @@ fdroid build: - fdroidserver/net.py - fdroidserver/scanner.py - fdroidserver/vmtools.py + # for the docker: job which depends on this one + - makebuildserver + - buildserver/* cache: key: "$CI_JOB_NAME" paths: From e1775203792be2bc624c43fad88f45762ec4746d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 24 Jun 2025 10:53:37 +0200 Subject: [PATCH 2076/2116] nightly: include project's LICENSE in the nightly repo --- fdroidserver/nightly.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 5156fb9a..f53fa867 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -399,6 +399,8 @@ def main(): clone_git_repo(clone_url, git_mirror_repodir) if not os.path.isdir(git_mirror_repodir): os.makedirs(git_mirror_repodir, mode=0o755) + if os.path.exists('LICENSE'): + shutil.copy2('LICENSE', git_mirror_path) mirror_git_repo = git.Repo.init(git_mirror_path) writer = mirror_git_repo.config_writer() From d71fba164c2a8b96c6bbb2be0ccda87fdc9735aa Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 24 Jun 2025 10:53:59 +0200 Subject: [PATCH 2077/2116] nightly: fix bug that clones nightly repo to wrong location bug introduced in ce018158ee33f330cf0b3db84896fcc236d7832f from !1563 --- fdroidserver/nightly.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index f53fa867..3d57c452 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -396,7 +396,7 @@ def main(): git_mirror_repodir = os.path.join(git_mirror_fdroiddir, 'repo') git_mirror_metadatadir = os.path.join(git_mirror_fdroiddir, 'metadata') if not os.path.isdir(git_mirror_repodir): - clone_git_repo(clone_url, git_mirror_repodir) + clone_git_repo(clone_url, git_mirror_path) if not os.path.isdir(git_mirror_repodir): os.makedirs(git_mirror_repodir, mode=0o755) if os.path.exists('LICENSE'): From 417ec9fe9645dbf30891b83970c43cffa915c9e3 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Tue, 24 Jun 2025 13:53:11 +0200 Subject: [PATCH 2078/2116] gradle v8.14.2 --- gradlew-fdroid | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 32b4df14..ed316eca 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -188,6 +188,7 @@ get_sha() { '7.6.2') echo 'a01b6587e15fe7ed120a0ee299c25982a1eee045abd6a9dd5e216b2f628ef9ac' ;; '7.6.3') echo '740c2e472ee4326c33bf75a5c9f5cd1e69ecf3f9b580f6e236c86d1f3d98cfac' ;; '7.6.4') echo 'bed1da33cca0f557ab13691c77f38bb67388119e4794d113e051039b80af9bb1' ;; + '7.6.5') echo 'b812fec0edb7d27e0ae35955887bb2954536fa3e44edaf481150da058e154d9a' ;; '8.0') echo '4159b938ec734a8388ce03f52aa8f3c7ed0d31f5438622545de4f83a89b79788' ;; '8.0.1') echo '1b6b558be93f29438d3df94b7dfee02e794b94d9aca4611a92cdb79b6b88e909' ;; '8.0.2') echo 'ff7bf6a86f09b9b2c40bb8f48b25fc19cf2b2664fd1d220cd7ab833ec758d0d7' ;; @@ -211,8 +212,8 @@ get_sha() { '8.12.1') echo '8d97a97984f6cbd2b85fe4c60a743440a347544bf18818048e611f5288d46c94' ;; '8.13') echo '20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78' ;; '8.14') echo '61ad310d3c7d3e5da131b76bbf22b5a4c0786e9d892dae8c1658d4b484de3caa' ;; - '8.14.1') echo '845952a9d6afa783db70bb3b0effaae45ae5542ca2bb7929619e8af49cb634cf' ;; - '8.14.2') echo '7197a12f450794931532469d4ff21a59ea2c1cd59a3ec3f89c035c3c420a6999' ;; + '8.14.1') echo '845952a9d6afa783db70bb3b0effaae45ae5542ca2bb7929619e8af49cb634cf' ;; + '8.14.2') echo '7197a12f450794931532469d4ff21a59ea2c1cd59a3ec3f89c035c3c420a6999' ;; *) exit 1 esac } @@ -233,7 +234,7 @@ d_gradle_plugin_ver_k=(8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2 d_plugin_min_gradle_v=(8.11.1 8.10.2 8.9 8.7 8.7 8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12) # All gradle versions we know about -plugin_v=(8.14.2 8.14.1 8.14 8.13 8.12.1 8.12 8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.14.2 8.14.1 8.14 8.13 8.12.1 8.12 8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.5 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From d5e554dcd6c01d458c0cb86bca3569ec85e83478 Mon Sep 17 00:00:00 2001 From: Swyter Date: Tue, 24 Jun 2025 14:05:48 +0200 Subject: [PATCH 2079/2116] Translated using Weblate: Spanish (es) by Swyter Currently translated at 98.2% (569 of 579 strings) Translated using Weblate: Spanish (es) by Swyter Currently translated at 98.2% (569 of 579 strings) Co-authored-by: Swyter Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/es/ Translation: F-Droid/F-Droid Server --- locale/es/LC_MESSAGES/fdroidserver.po | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index f01ed699..07ac3ea5 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -14,20 +14,21 @@ # Jaime Marquínez Ferrándiz , 2022. # gallegonovato , 2022, 2023, 2024. # Nicolás Pérez , 2025. +# Swyter , 2025. msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2025-03-16 22:47+0000\n" -"Last-Translator: Nicolás Pérez \n" +"PO-Revision-Date: 2025-06-24 11:02+0000\n" +"Last-Translator: Swyter \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.11-dev\n" +"X-Generator: Weblate 5.13-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -492,9 +493,9 @@ msgid "Creating \"{path}\" for configuring s3cmd." msgstr "Creando \"{path}\" para configurar s3cmd." #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Creating empty {config_file}" -msgstr "Leyendo '{config_file}'" +msgstr "Creando el archivo vacío {config_file}" #: ../fdroidserver/publish.py msgid "Creating log directory" @@ -1811,7 +1812,7 @@ msgstr "Entrada desconocida {key} en {configname}" #: ../fdroidserver/__main__.py msgid "Unknown exception found!" -msgstr "¡Se encontró una excepción desconocida!" +msgstr "Se ha producido una excepción desconocida" #: ../fdroidserver/lint.py #, python-brace-format @@ -1993,7 +1994,7 @@ msgstr "Usando s3cmd para sincronizar con: {url}" #: ../fdroidserver/__main__.py msgid "Valid commands are:" -msgstr "Los comandos válidos son:" +msgstr "Las órdenes válidas son:" #: ../fdroidserver/verify.py msgid "Verify against locally cached copy rather than redownloading." From e21fd0d16742df6ef76d355d16ad0a9ce124c137 Mon Sep 17 00:00:00 2001 From: WaldiS Date: Tue, 24 Jun 2025 14:05:47 +0200 Subject: [PATCH 2080/2116] Translated using Weblate: Polish (pl) by WaldiS Currently translated at 100.0% (579 of 579 strings) Translated using Weblate: Polish (pl) by WaldiS Currently translated at 98.4% (570 of 579 strings) Co-authored-by: WaldiS Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/pl/ Translation: F-Droid/F-Droid Server --- locale/pl/LC_MESSAGES/fdroidserver.po | 28 +++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 19f85820..7b417234 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2025-06-14 18:05+0000\n" +"PO-Revision-Date: 2025-06-24 12:05+0000\n" "Last-Translator: WaldiS \n" "Language-Team: Polish \n" "Language: pl\n" @@ -19,7 +19,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.12-dev\n" +"X-Generator: Weblate 5.13-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -45,7 +45,7 @@ msgstr "\"%s/\" nie ma pasującego pliku metadanych!" #: ../fdroidserver/index.py msgid "\"isPrimary\" key should not be added to mirrors!" -msgstr "" +msgstr "Klucz „isPrimary” nie powinien być dodawany do mirrorów!" #: ../fdroidserver/index.py #, python-brace-format @@ -657,12 +657,12 @@ msgstr "BŁĄD: {key} w {path} nie jest \"archive\" lub \"repo\"!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key} not a valid key!" -msgstr "" +msgstr "BŁĄD: {key} nie jest prawidłowym kluczem!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}'s value should be of type {t}!" -msgstr "" +msgstr "BŁĄD: wartość klucza {key} powinna być typu {t}!" #: ../fdroidserver/lint.py #, python-brace-format @@ -689,9 +689,9 @@ msgid "Environment variable {var} from {configname} is not set!" msgstr "Zmienna środowiskowa {var} z {configname} nie jest ustawiona!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Environment variable {{env: {var}}} is not set!" -msgstr "Zmienna środowiskowa {var} z {configname} nie jest ustawiona!" +msgstr "Zmienna środowiskowa{{env: {var}}} nie została ustawiona!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" @@ -933,9 +933,9 @@ msgid "Ignoring bad element in manifest: %s" msgstr "Ignorowanie błędnego elementu w manifeście: %s" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Ignoring deprecated {oldfile}, use {newfile}!" -msgstr "{oldfile} jest przestarzałe, użyj {newfile}" +msgstr "{oldfile} jest przestarzałe, użyj {newfile}!" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1143,7 +1143,7 @@ msgstr "Osiągnięto maksymalną głębokość rekurencji w pliku ZIP: %s" #: ../fdroidserver/index.py #, python-brace-format msgid "Mirror config for {url} contains \"isPrimary\" key!" -msgstr "" +msgstr "Konfiguracja Mirror dla {url} zawiera klucz \"isPrimary\"!" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1310,7 +1310,7 @@ msgstr "Tylko PNG i JPEG są obsługiwane dla grafiki, znaleziono: {path}" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" -msgstr "" +msgstr "Akceptowany jest tylko jeden klucz \"env\"" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" @@ -1471,7 +1471,7 @@ msgstr "Odświeżanie i buforowanie reguł skanera i sygnatur z sieci" #: ../fdroidserver/publish.py #, python-brace-format msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." -msgstr "" +msgstr "Odmowa podpisania pliku {path}, ponieważ istnieje on zarówno w folderze {dir1}, jak i {dir2}." #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." @@ -1700,7 +1700,7 @@ msgstr "Tryb testowy - umieszczaj dane wyjściowe tylko w katalogu tmp i zawsze #: ../fdroidserver/index.py msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" -msgstr "" +msgstr "Pakiet Pythona „qrcode” nie jest zainstalowany (np. apt-get install python3-qrcode)!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -2601,7 +2601,7 @@ msgstr "{name} \"{section}/icons/{path}\" nie istnieje! Sprawdź \"config.yml\". #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" -msgstr "" +msgstr "{path1} to duplikat {path2}, usuń jeden z nich!" #: ../fdroidserver/import_subcommand.py #, python-brace-format From 76eb0611a0f91e4623ac8b33f8892ec20e6bba1e Mon Sep 17 00:00:00 2001 From: Artyom Rybakov Date: Tue, 24 Jun 2025 14:05:50 +0200 Subject: [PATCH 2081/2116] Translated using Weblate: Russian (ru) by Artyom Rybakov Currently translated at 100.0% (579 of 579 strings) Co-authored-by: Artyom Rybakov Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ru/ Translation: F-Droid/F-Droid Server --- locale/ru/LC_MESSAGES/fdroidserver.po | 29 ++++++++++++++------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index cea992b8..e8222af3 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -16,20 +16,21 @@ # gfbdrgng , 2024. # neverender , 2024. # Dmitry , 2024. +# Artyom Rybakov , 2025. msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" "POT-Creation-Date: 2025-03-25 11:36+0100\n" -"PO-Revision-Date: 2025-03-27 19:35+0000\n" -"Last-Translator: Andrey \n" +"PO-Revision-Date: 2025-06-24 10:15+0000\n" +"Last-Translator: Artyom Rybakov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.11-dev\n" +"X-Generator: Weblate 5.13-dev\n" #: ../fdroidserver/nightly.py msgid "" @@ -55,7 +56,7 @@ msgstr "У \"%s/\" нет соответствующего файла метад #: ../fdroidserver/index.py msgid "\"isPrimary\" key should not be added to mirrors!" -msgstr "" +msgstr "Ключ \"IsPrimary\" не следует добавлять в зеркала!" #: ../fdroidserver/index.py #, python-brace-format @@ -672,7 +673,7 @@ msgstr "ОШИБКА: {key} недействительный ключ!" #: ../fdroidserver/lint.py #, python-brace-format msgid "ERROR: {key}'s value should be of type {t}!" -msgstr "" +msgstr "ОШИБКА: значение {key} должно быть типа {t}!" #: ../fdroidserver/lint.py #, python-brace-format @@ -699,9 +700,9 @@ msgid "Environment variable {var} from {configname} is not set!" msgstr "Переменная среды {var} из {configname} не установлена!" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Environment variable {{env: {var}}} is not set!" -msgstr "Переменная среды {var} из {configname} не установлена!" +msgstr "Переменная среды {{env: {var}}} не установлена!" #: ../fdroidserver/deploy.py msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" @@ -943,9 +944,9 @@ msgid "Ignoring bad element in manifest: %s" msgstr "Проигнорировано: плохой элемент в манифесте: %s" #: ../fdroidserver/common.py -#, fuzzy, python-brace-format +#, python-brace-format msgid "Ignoring deprecated {oldfile}, use {newfile}!" -msgstr "{oldfile} признан устаревшим; используйте {newfile}" +msgstr "Устаревший {oldfile} игнорируется, используйте {newfile}!" #: ../fdroidserver/index.py msgid "Ignoring package without metadata: " @@ -1153,7 +1154,7 @@ msgstr "Достигнута максимальная глубина рекур #: ../fdroidserver/index.py #, python-brace-format msgid "Mirror config for {url} contains \"isPrimary\" key!" -msgstr "" +msgstr "Конфигурация зеркала для {url} содержит ключ \"IsPrimary\"!" #: ../fdroidserver/mirror.py msgid "Mirror the full repo and archive, all file types." @@ -1320,7 +1321,7 @@ msgstr "Допускаются изображения только в форма #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/common.py msgid "Only accepts a single key \"env\"" -msgstr "" +msgstr "Принимает только один ключ \"env\"" #: ../fdroidserver/checkupdates.py msgid "Only process apps with auto-updates" @@ -1481,7 +1482,7 @@ msgstr "Обновление и кэширование правил и сигн #: ../fdroidserver/publish.py #, python-brace-format msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." -msgstr "" +msgstr "Отказываюсь подписывать '{path}', файл существует как в папке {dir1}, так и в папке {dir2}." #: ../fdroidserver/verify.py msgid "Remove source tarball and any APKs if successfully verified." @@ -1710,7 +1711,7 @@ msgstr "Тестовый режим. Все собранное попадает #: ../fdroidserver/index.py msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" -msgstr "" +msgstr "Пакет Python \"qrcode\" не установлен (например, apt-get install python3-qrcode)!" #. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode #: ../fdroidserver/update.py @@ -2611,7 +2612,7 @@ msgstr "{name}: \"{section}/icons/{path}\" не существует! Попра #: ../fdroidserver/update.py #, python-brace-format msgid "{path1} is a duplicate of {path2}, remove one!" -msgstr "" +msgstr "{path1} дублирует {path2}, удалите один!" #: ../fdroidserver/import_subcommand.py #, python-brace-format From a44364d66158ed68711dce50cb0e82024c3db385 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 24 Jun 2025 21:52:21 +0200 Subject: [PATCH 2082/2116] update CHANGELOG.md --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d43a877..5aeeca43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +## [2.4.2] - 2025-06-24 + +### Fixed + +* nightly: fix bug that clones nightly repo to wrong location + https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1672 +* Sync translations for all supported languages: es pl ru + ## [2.4.1] - 2025-06-23 ### Added From 193ca5842cdec7194db09da85b8c13fb4babc709 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 24 Jun 2025 21:52:38 +0200 Subject: [PATCH 2083/2116] version 2.4.2 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index a25ddfc0..e6d374a8 100755 --- a/setup.py +++ b/setup.py @@ -70,7 +70,7 @@ with open("README.md", "r") as fh: setup( name='fdroidserver', - version='2.4.1', + version='2.4.2', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', From 956cb11f91670ab6ce6f93439f074652483bdf00 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 25 Jun 2025 09:41:47 +0200 Subject: [PATCH 2084/2116] gitlab-ci: rm dash from macOS tests, it reliably segfaults dash rarely changes and is reliably run on Debian in the hooks/pre-commit job. So remove it from the macOS job, where it is flaky and hard to troubleshoot (who has macOS? ;-) https://gitlab.com/fdroid/fdroidserver/-/jobs/10454622138 ``` ============================================================================== run commit hooks + echo_header 'run commit hooks' + test -x ./hooks/pre-commit + ./hooks/pre-commit WARNING: pydocstyle is not installed, using dummy placeholder! WARNING: pyflakes is not installed, using dummy placeholder! WARNING: pycodestyle is not installed, using dummy placeholder! ./hooks/pre-commit: line 111: 20320 Segmentation fault: 11 $DASH -n $f ERROR: dash tests failed! ``` --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8f8b5271..416d5646 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -443,7 +443,7 @@ macOS: - brew install --cask android-commandlinetools temurin # temurin is a JDK # test suite dependencies - - brew install dash bash coreutils gnu-sed + - brew install bash coreutils gnu-sed # TODO port tests/run-tests to POSIX and gsed, it has a couple GNU-isms like du --bytes - export PATH="$(brew --prefix fdroidserver)/libexec/bin:$(brew --prefix coreutils)/libexec/gnubin:$PATH" From a0cae97155b6f0f6078f60c9fda5b0eff625235d Mon Sep 17 00:00:00 2001 From: Zulfar Date: Tue, 24 Jun 2025 14:05:45 +0200 Subject: [PATCH 2085/2116] Translated using Weblate: Bashkir (ba) by Zulfar Currently translated at 100.0% (579 of 579 strings) Added translation using Weblate: Bashkir (ba) by Zulfar Co-authored-by: Zulfar Translate-URL: https://hosted.weblate.org/projects/f-droid/fdroidserver/ba/ Translation: F-Droid/F-Droid Server --- locale/ba/LC_MESSAGES/fdroidserver.po | 2681 +++++++++++++++++++++++++ 1 file changed, 2681 insertions(+) create mode 100644 locale/ba/LC_MESSAGES/fdroidserver.po diff --git a/locale/ba/LC_MESSAGES/fdroidserver.po b/locale/ba/LC_MESSAGES/fdroidserver.po new file mode 100644 index 00000000..8390af28 --- /dev/null +++ b/locale/ba/LC_MESSAGES/fdroidserver.po @@ -0,0 +1,2681 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# Zulfar , 2025. +msgid "" +msgstr "" +"Project-Id-Version: fdroidserver 2.4.0\n" +"Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" +"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"PO-Revision-Date: 2025-06-22 06:50+0000\n" +"Last-Translator: Zulfar \n" +"Language-Team: Bashkir \n" +"Language: ba\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.13-dev\n" + +#: ../fdroidserver/nightly.py +msgid "" +"\n" +"SSH public key to be used as deploy key:" +msgstr "" +"\n" +"Урынлаштырыу асҡысы итеп ҡулланыу өсөн SSH асыҡ асҡысы:" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "" +"\n" +"{path} encoded for the DEBUG_KEYSTORE secret variable:" +msgstr "" +"\n" +"{path} DEBUG_KEYSTORE йәшерен үҙгәреүсәне өсөн кодланған:" + +#: ../fdroidserver/lint.py +#, python-format +msgid "\"%s/\" has no matching metadata file!" +msgstr "\"%s/\" өсөн ярашлы мета-мәғлүмәт файлы юҡ!" + +#: ../fdroidserver/index.py +msgid "\"isPrimary\" key should not be added to mirrors!" +msgstr "\"isPrimary\" асҡысы көҙгөләргә өҫтәлергә тейеш түгел!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "\"local_copy_dir\" {path} does not exist!" +msgstr "\"local_copy_dir\" {path} каталогы юҡ!" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "\"{apkfilename}\" is already installed on {dev}." +msgstr "\"{apkfilename}\" {dev} ҡоролмаһында инде ҡуйылған." + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" contains recent {name} ({version})" +msgstr "\"{path}\" эсендә {name} ({version}) ҡушымтаһының яңы версияһы бар." + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "\"{path}\" exists but s3cmd is not installed!" +msgstr "\"{path}\" бар, ләкин s3cmd ҡуйылмаған!" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "\"{path}\" is not a supported file format (use: metadata/*.yml)" +msgstr "\"{path}\" — яраҡлы файл форматы түгел (ҡулланығыҙ: metadata/*.yml)" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "\"{path}\" is signed by a key that is not allowed:" +msgstr "\"{path}\" рөхсәт ителмәгән асҡыс менән тамғаланған:" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "\"{url}\" is not a valid URL!" +msgstr "\"{url}\" — дөрөҫ URL түгел!" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "%(prog)s: error: %(message)s\n" +msgstr "%(prog)s: хата: %(message)s\n" + +#: ../fdroidserver/publish.py +#, python-format +msgid "%d APKs failed to be signed or verified!" +msgstr "%d APK тамғаланманы йәки тикшерелмәне!" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "%d problems found" +msgstr "%d проблема табылды" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "%r is not callable" +msgstr "%r саҡырылмалы түгел" + +#: ../fdroidserver/signindex.py +#, python-format +msgid "%s did not produce a dict!" +msgstr "%s һүҙлек (dict) ҡайтарманы!" + +#: ../fdroidserver/signindex.py +#, python-format +msgid "%s has bad SHA-256: %s" +msgstr "%s файлының SHA-256 суммаһы дөрөҫ түгел: %s" + +#: ../fdroidserver/lint.py +#, python-format +msgid "%s is not an accepted build field" +msgstr "%s — рөхсәт ителгән йыйыу яланы түгел" + +#: ../fdroidserver/common.py +msgid "'keypass' not found in config.yml!" +msgstr "config.yml файлында 'keypass' табылманы!" + +#: ../fdroidserver/common.py +msgid "'keystore' is NONE and 'smartcardoptions' is blank!" +msgstr "'keystore' күрһәтелмәгән һәм 'smartcardoptions' буш!" + +#: ../fdroidserver/common.py +msgid "'keystore' not found in config.yml!" +msgstr "config.yml файлында 'keystore' табылманы!" + +#: ../fdroidserver/common.py +msgid "'keystorepass' not found in config.yml!" +msgstr "config.yml файлында 'keystorepass' табылманы!" + +#: ../fdroidserver/common.py +msgid "'repo_keyalias' not found in config.yml!" +msgstr "config.yml файлында 'repo_keyalias' табылманы!" + +#: /usr/lib/python3.11/argparse.py +msgid "'required' is an invalid argument for positionals" +msgstr "Позицион аргументтар өсөн 'required' — дөрөҫ булмаған аргумент" + +#: ../fdroidserver/common.py +msgid "'sdk_path' not set in config.yml!" +msgstr "config.yml файлында 'sdk_path' күрһәтелмәгән!" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{aapt}' is too old, fdroid requires build-tools-{version} or newer!" +msgstr "'{aapt}' бигерәк иҫке, F-Droid өсөн build-tools-{version} йәки яңыраҡ версияһы кәрәк!" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "'{path}' failed to execute!" +msgstr "'{path}' башҡарылманы!" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{path}' has invalid format, it should be a dictionary!" +msgstr "'{path}' форматы дөрөҫ түгел, ул һүҙлек булырға тейеш!" + +#: ../fdroidserver/lint.py ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field} in {appid}. Regex pattern: {pattern}" +msgstr "'{appid}' өсөн '{value}' — дөрөҫ булмаған {field} ҡиммәте. Regex ҡалыбы: {pattern}" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "'{value}' is not a valid {field}, should be {pattern}" +msgstr "'{value}' — яраҡлы {field} түгел, {pattern} булырға тейеш" + +#: ../fdroidserver/checkupdates.py +msgid "--merge-request only runs on a single appid!" +msgstr "--merge-request тик бер appid менән генә эшләй!" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "...checkupdate failed for {appid} : {error}" +msgstr "...{appid} өсөн checkupdate уңышһыҙ үтте: {error}" + +#: /usr/lib/python3.11/argparse.py +msgid ".__call__() not defined" +msgstr ".__call__() билдәләнмәгән" + +#: ../fdroidserver/lint.py +msgid "/issues is missing" +msgstr "/issues юҡ" + +#: ../fdroidserver/mirror.py +msgid "A URL is required as an argument!" +msgstr "Аргумент итеп URL күрһәтеү мотлаҡ!" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "APK signatures have different certificates in {path}:" +msgstr "{path} эсендәге APK-имзаларҙың сертификаттары төрлө:" + +#: ../fdroidserver/__main__.py +msgid "Add PGP signatures using GnuPG for packages in repo" +msgstr "Репозиторийҙағы пакеттарға GnuPG ярҙамында PGP-имзалар өҫтәү" + +#: ../fdroidserver/update.py +msgid "Add a repo signing key to an unsigned repo" +msgstr "Тамғаланмаған репозиторийға репо-имзалау асҡысын өҫтәү" + +#: ../fdroidserver/update.py +msgid "Add skeleton metadata files for APKs that are missing them" +msgstr "Мета-мәғлүмәт файлдары булмаған APK-лар өсөн ҡалыптар өҫтәү" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Adding new repo for only {name}" +msgstr "Тик {name} өсөн генә яңы репозиторий өҫтәү" + +#: ../fdroidserver/init.py +msgid "Alias of the repo signing key in the keystore" +msgstr "Асҡыстар һаҡлағысындағы репо-имзалау асҡысының псевдонимы" + +#: ../fdroidserver/build.py +msgid "AllowedAPKSigningKeys missing but reference binary supplied" +msgstr "AllowedAPKSigningKeys юҡ, ләкин өлгө бинар файл бирелгән" + +#: ../fdroidserver/import_subcommand.py +msgid "Allows a different revision (or git branch) to be specified for the initial import" +msgstr "Башланғыс импорт өсөн икенсе ревизия (йәки git ботағын) күрһәтергә мөмкинлек бирә" + +#: ../fdroidserver/mirror.py +msgid "Also mirror the full archive section" +msgstr "Шулай уҡ архив бүлегенең тулы күсермәһен яһау" + +#: ../fdroidserver/lint.py +msgid "Also warn about formatting issues, like rewritemeta -l" +msgstr "Шулай уҡ rewritemeta -l кеүек форматлау проблемалары тураһында иҫкәртеү" + +#: ../fdroidserver/scanner.py +msgid "Android AAR library" +msgstr "Android AAR китапханаһы" + +#: ../fdroidserver/scanner.py +msgid "Android APK file" +msgstr "Android APK файлы" + +#: ../fdroidserver/scanner.py +msgid "Android DEX code" +msgstr "Android DEX коды" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Android SDK not found at {path}!" +msgstr "Android SDK {path} юлында табылманы!" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' does not exist!" +msgstr "'{path}' Android SDK юлы юҡ!" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK path '{path}' is not a directory!" +msgstr "'{path}' Android SDK юлы — каталог түгел!" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Android SDK tool {cmd} not found!" +msgstr "{cmd} Android SDK ҡоралы табылманы!" + +#: ../fdroidserver/lint.py +msgid "App has Binaries but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "Ҡушымтала Binaries бар, ләкин сертификатты беркетеү өсөн тейешле AllowedAPKSigningKeys юҡ." + +#: ../fdroidserver/lint.py +msgid "App has NoSourceSince or ArchivePolicy \"0 versions\" or 0 but AutoUpdateMode or UpdateCheckMode are not None" +msgstr "Ҡушымтала NoSourceSince йәки ArchivePolicy \"0 versions\" йәки 0 ҡуйылған, ләкин AutoUpdateMode йәки UpdateCheckMode None түгел" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "App is in '{repo}' but has a link to {url}" +msgstr "Ҡушымта '{repo}' эсендә, ләкин {url} адресына һылтанмаһы бар" + +#: ../fdroidserver/lint.py +msgid "App version has binary but does not have corresponding AllowedAPKSigningKeys to pin certificate." +msgstr "Ҡушымта версияһында бинар файл бар, ләкин сертификатты беркетеү өсөн тейешле AllowedAPKSigningKeys юҡ." + +#: ../fdroidserver/lint.py +msgid "Appending .git is not necessary" +msgstr ".git ҡушып яҙыу мотлаҡ түгел" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Archiving {apkfilename} with invalid signature!" +msgstr "{apkfilename} дөрөҫ булмаған имза менән архивлана!" + +#: ../fdroidserver/lint.py +msgid "AutoUpdateMode with UpdateCheckMode: HTTP must have a pattern." +msgstr "AutoUpdateMode-ла UpdateCheckMode: HTTP өсөн ҡалып булырға тейеш." + +#: ../fdroidserver/install.py +msgid "Automatic no to all prompts." +msgstr "Барлыҡ һорауҙарға автоматик рәүештә \"юҡ\" тигән яуап." + +#: ../fdroidserver/install.py +msgid "Automatic yes to all prompts." +msgstr "Барлыҡ һорауҙарға автоматик рәүештә \"эйе\" тигән яуап." + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Bad entry type \"{mirrortype}\" in mirrors config: {mirror}" +msgstr "Көҙгөләр көйләүҙәрендә дөрөҫ булмаған яҙма төрө \"{mirrortype}\": {mirror}" + +#: ../fdroidserver/mirror.py +msgid "Base URL to mirror, can include the index signing key using the query string: ?fingerprint=" +msgstr "Көҙгө яһау өсөн төп URL, һорау юлы аша индекс имзалау асҡысын ҡушырға мөмкин: ?fingerprint=" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in build '{versionName}'" +msgstr "'{versionName}' йыйылмаһында '{branch}' ботағы коммит булараҡ ҡулланылған" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Branch '{branch}' used as commit in srclib '{srclib}'" +msgstr "'{srclib}' сығанаҡ китапханаһында '{branch}' ботағы коммит булараҡ ҡулланылған" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Broken symlink: {path}" +msgstr "Өҙөлгән символик һылтанма: {path}" + +#: ../fdroidserver/__main__.py +msgid "Build a package from source" +msgstr "Пакетты сығанаҡ кодтан йыйыу" + +#: ../fdroidserver/build.py +msgid "Build all applications available" +msgstr "Барлыҡ ҡушымталарҙы йыйыу" + +#: ../fdroidserver/lint.py +msgid "Build generated by `fdroid import` - remove disable line once ready" +msgstr "`fdroid import` менән яһалған йыйылма — әҙер булғас, һүндереү юлын алып ташлағыҙ" + +#: ../fdroidserver/checkupdates.py +msgid "Build metadata git repo has uncommited changes!" +msgstr "Йыйыу мета-мәғлүмәттәренең git репозиторийында һаҡланмаған үҙгәрештәр бар!" + +#: ../fdroidserver/build.py +msgid "Build only the latest version of each package" +msgstr "Һәр пакеттың һуңғы версияһын ғына йыйыу" + +#: ../fdroidserver/init.py +#, python-format +msgid "Built repo based in \"%s\" with this config:" +msgstr "\"%s\" каталогында ошо көйләүҙәр менән репозиторий төҙөлдө:" + +#: ../fdroidserver/checkupdates.py +msgid "Can't auto-update app with no CurrentVersionCode" +msgstr "CurrentVersionCode булмаған ҡушымтаны автоматик яңыртып булмай" + +#: ../fdroidserver/build.py +msgid "Can't build due to {} error while scanning" +msgid_plural "Can't build due to {} errors while scanning" +msgstr[0] "Сканлау ваҡытындағы {} хата арҡаһында йыйып булмай" +msgstr[1] "Сканлау ваҡытындағы {} хата арҡаһында йыйып булмай" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Cannot rewrite \"{path}\"" +msgstr "\"{path}\" файлын үҙгәртеп яҙып булмай" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +#, python-format +msgid "Categories '%s' is not valid" +msgstr "'%s' категориялары дөрөҫ түгел" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/lint.py +msgid "Categories are not set" +msgstr "Категориялар күрһәтелмәгән" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Category \"{category}\" defined but not used for any apps!" +msgstr "\"{category}\" категорияһы билдәләнгән, ләкин бер ҡушымтала ла ҡулланылмай!" + +#: ../fdroidserver/__main__.py +msgid "Check for updates to applications" +msgstr "Ҡушымталар өсөн яңыртыуҙарҙы тикшереү" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Checking archiving for {appid} - apks:{integer}, keepversions:{keep}, archapks:{arch}" +msgstr "{appid} өсөн архивлауҙы тикшереү - apk:{integer}, һаҡларға:{keep}, архивта:{arch}" + +#: ../fdroidserver/update.py +msgid "Clean update - don't uses caches, reprocess all APKs" +msgstr "Таҙа яңыртыу — кештарҙы ҡулланмаҫҡа, бөтә APK-ларҙы яңынан эшкәртергә" + +#: ../fdroidserver/common.py +msgid "Color the log output" +msgstr "Лог сығарылышын төҫлө итеү" + +#: ../fdroidserver/import_subcommand.py +msgid "Comma separated list of categories." +msgstr "Өтөр менән айырылған категориялар исемлеге." + +#: ../fdroidserver/__main__.py +#, python-format +msgid "Command '%s' not recognised.\n" +msgstr "'%s' командаһы танылманы.\n" + +#: ../fdroidserver/checkupdates.py +msgid "Commit changes" +msgstr "Үҙгәрештәрҙе һаҡлау (commit)" + +#: ../fdroidserver/checkupdates.py +msgid "Commit changes, push, then make a merge request" +msgstr "Үҙгәрештәрҙе һаҡларға (commit), ебәрергә (push), шунан берләштереүгә һорау яһарға" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Conflicting \"{field}\" definitions between .yml and localized files:" +msgstr ".yml һәм локалләштерелгән файлдар араһында \"{field}\" өсөн ҡапма-ҡаршылыҡлы билдәләмәләр:" + +#: ../fdroidserver/__main__.py +msgid "Conflicting arguments: '--verbose' and '--quiet' can not be specified at the same time." +msgstr "Ҡапма-ҡаршылыҡлы аргументтар: '--verbose' һәм '--quiet' бер үк ваҡытта күрһәтелә алмай." + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not find '{command}' on your system" +msgstr "Системала '{command}' табылманы" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/import_subcommand.py +msgid "Could not find latest version code" +msgstr "Һуңғы версияның кодын табып булманы" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vname +#: ../fdroidserver/import_subcommand.py +msgid "Could not find latest version name" +msgstr "Һуңғы версияның исемен табып булманы" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not find {path} to remove it" +msgstr "Юйыу өсөн {path} табылманы" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Could not open APK {path} for analysis: " +msgstr "Анализ өсөн {path} APK файлын асып булманы: " + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Could not parse size \"{size}\", wrong type \"{type}\"" +msgstr "\"{size}\" үлсәмен танып булманы, дөрөҫ булмаған тип \"{type}\"" + +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id +#: ../fdroidserver/import_subcommand.py +msgid "Couldn't find Application ID" +msgstr "Ҡушымтаның идентификаторын (Application ID) табып булманы" + +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find any version information" +msgstr "Бер ниндәй ҙә версия мәғлүмәте табылманы" + +#: ../fdroidserver/checkupdates.py +msgid "Couldn't find package ID" +msgstr "Пакет идентификаторын табып булманы" + +#: ../fdroidserver/update.py +msgid "Cowardily refusing to overwrite existing signing key setup!" +msgstr "Инде булған имзалау асҡысы көйләүҙәрен өҫтөнән яҙҙырыуҙан ҡурҡаҡтарса баш тартам!" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Created new container \"{name}\"" +msgstr "Яңы \"{name}\" контейнеры булдырылды" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Creating \"{path}\" for configuring s3cmd." +msgstr "s3cmd-ты көйләү өсөн \"{path}\" булдырыла." + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Creating empty {config_file}" +msgstr "Буш {config_file} булдырыла" + +#: ../fdroidserver/publish.py +msgid "Creating log directory" +msgstr "Логтар каталогы булдырыла" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Creating new S3 bucket: {url}" +msgstr "Яңы S3 биҙрәһе булдырыла: {url}" + +#: ../fdroidserver/publish.py +msgid "Creating output directory" +msgstr "Сығарыу каталогы булдырыла" + +#: ../fdroidserver/index.py +msgid "Creating signed index with this key (SHA256):" +msgstr "Ошо асҡыс менән тамғаланған индекс булдырыла (SHA256):" + +#: ../fdroidserver/publish.py ../fdroidserver/verify.py +msgid "Creating temporary directory" +msgstr "Ваҡытлыса каталог булдырыла" + +#: ../fdroidserver/index.py +msgid "Creating unsigned index in preparation for signing" +msgstr "Тамғалауға әҙерлек өсөн тамғаланмаған индекс булдырыла" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "CurrentVersionCode {cv} is less than oldest build entry {versionCode}" +msgstr "Ағымдағы CurrentVersionCode {cv} иң иҫке йыйылма яҙмаһынан {versionCode} бәләкәйерәк" + +#: ../fdroidserver/nightly.py +msgid "DEBUG_KEYSTORE is not set or the value is incomplete" +msgstr "DEBUG_KEYSTORE күрһәтелмәгән йәки уның ҡиммәте тулы түгел" + +#: ../fdroidserver/update.py +msgid "Delete APKs and/or OBBs without metadata from the repo" +msgstr "Репозиторийҙан мета-мәғлүмәттәрһеҙ APK-ларҙы һәм/йәки OBB-ларҙы юйыу" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting archive, repo is too big ({size} max {limit})" +msgstr "Архив юйыла, репозиторий бигерәк ҙур ({size} макс. {limit})" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Deleting git-mirror history, repo is too big ({size} max {limit})" +msgstr "git-көҙгөнөң тарихы юйыла, репозиторий бигерәк ҙур ({size} макс. {limit})" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Deleting unknown file: {path}" +msgstr "Билдәһеҙ файл юйыла: {path}" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Description '%s' is just the app's summary" +msgstr "'%s' тасуирламаһы — ул ҡушымтаның ҡыҫҡаса аңлатмаһы ғына" + +#: ../fdroidserver/lint.py +msgid "Description has a duplicate line" +msgstr "Тасуирламала ҡабатланған юл бар" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Description of length {length} is over the {limit} char limit" +msgstr "{length} оҙонлоғондағы тасуирлама {limit} символ сикләүенән артып китә" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Did you mean config/{name}.yml?" +msgstr "Һеҙ config/{name}.yml-ды күҙ уңында тоттоғоҙмо?" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Did you mean {code}?" +msgstr "Һеҙ {code}-ты күҙ уңында тоттоғоҙмо?" + +#: ../fdroidserver/import_subcommand.py +msgid "Do not add 'disable:' to the generated build entries" +msgstr "Булдырылған йыйылма яҙмаларына 'disable:' өҫтәмәгеҙ" + +#: ../fdroidserver/nightly.py +msgid "Do not deploy the new files to the repo" +msgstr "Яңы файлдарҙы репозиторийға урынлаштырмағыҙ" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Do not include \"{path}\" in URL!" +msgstr "URL-ға \"{path}\"-ты индермәгеҙ!" + +#: ../fdroidserver/init.py +msgid "Do not prompt for Android SDK path, just fail" +msgstr "Android SDK юлын һорамаҫҡа, шунда уҡ уңышһыҙлыҡ менән тамамларға" + +#: ../fdroidserver/nightly.py +msgid "Do not remove the private keys generated from the keystore" +msgstr "Асҡыстар һаҡлағысынан булдырылған шәхси асҡыстарҙы юймағыҙ" + +#: ../fdroidserver/build.py +msgid "Don't create a source tarball, useful when testing a build" +msgstr "Сығанаҡ кодтарҙың tarball-ын яһамаҫҡа, йыйылманы һынағанда файҙалы" + +#: ../fdroidserver/build.py +msgid "Don't refresh the repository, useful when testing a build with no internet connection" +msgstr "Репозиторийҙы яңыртмаҫҡа, интернетһыҙ йыйылманы һынағанда файҙалы" + +#: ../fdroidserver/deploy.py ../fdroidserver/nightly.py +msgid "Don't use rsync checksums" +msgstr "rsync контроль суммаларын ҡулланмаҫҡа" + +#: ../fdroidserver/install.py +msgid "Download F-Droid.apk using mirrors that leak less to the network" +msgstr "F-Droid.apk-ны селтәргә аҙыраҡ мәғлүмәт ебәргән көҙгөләр аша йөкмәтергә" + +#: ../fdroidserver/__main__.py +msgid "Download complete mirrors of small repos" +msgstr "Бәләкәй репозиторийҙарҙың тулы көҙгөләрен йөкмәтеү" + +#: ../fdroidserver/common.py +msgid "Downloading the repository already failed once, not trying again." +msgstr "Репозиторийҙы йөкмәтеү бер тапҡыр уңышһыҙ булды инде, яңынан ҡабатланмаясаҡ." + +#: ../fdroidserver/verify.py +#, python-brace-format +msgid "Downloading {url} failed. {error}" +msgstr "{url} йөкмәтелмәне. {error}" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Duplicate Anti-Feature declaration at {path} was ignored!" +msgstr "{path} юлындағы ҡабатланған Anti-Feature декларацияһы иғтибарһыҙ ҡалдырылды!" + +#: ../fdroidserver/index.py +#, python-format +msgid "Duplicate entry \"%s\" in mirrors config!" +msgstr "Көҙгөләр көйләүҙәрендә ҡабатланған \"%s\" яҙмаһы!" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Duplicate link in '{field}': {url}" +msgstr "'{field}' яланында ҡабатланған һылтанма: {url}" + +#: ../fdroidserver/common.py +#, python-format +msgid "ERROR: %(message)s" +msgstr "ХАТА: %(message)s" + +#: ../fdroidserver/__main__.py +msgid "ERROR: The \"server\" subcommand has been removed, use \"deploy\"!" +msgstr "ХАТА: \"server\" аҫкомандаһы алынды, \"deploy\" командаһын ҡулланығыҙ!" + +#: ../fdroidserver/nightly.py +msgid "ERROR: unsupported CI type, patches welcome!" +msgstr "ХАТА: яраҡһыҙ CI төрө, төҙәтмәләр хуплана!" + +#: ../fdroidserver/nightly.py +#, python-format +msgid "ERROR: unsupported git host \"%s\", patches welcome!" +msgstr "ХАТА: яраҡһыҙ git хосты \"%s\", төҙәтмәләр хуплана!" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} in {path} is not \"archive\" or \"repo\"!" +msgstr "ХАТА: {path} эсендәге {key} асҡысы \"archive\" йәки \"repo\" түгел!" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key} not a valid key!" +msgstr "ХАТА: {key} — дөрөҫ асҡыс түгел!" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}'s value should be of type {t}!" +msgstr "ХАТА: {key} асҡысының ҡиммәте {t} тибында булырға тейеш!" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!" +msgstr "ХАТА: {path} эсендәге {key}:{subkey} рөхсәт ителгән асҡыстар исемлегендә юҡ: {allowed_keys}!" + +#: ../fdroidserver/__main__.py +#, python-brace-format +msgid "Encoding is set to '{enc}' fdroid might run into encoding issues. Please set it to 'UTF-8' for best results." +msgstr "Кодировка '{enc}' итеп ҡуйылған, F-Droid-та кодировка проблемалары булыуы мөмкин. Иң яҡшы һөҙөмтә өсөн уны 'UTF-8'-гә ҡуйығыҙ." + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"Enter the path to the Android SDK (%s) here:\n" +"> " +msgstr "" +"Android SDK-ның юлын (%s) бында яҙығыҙ:\n" +"> " + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {var} from {configname} is not set!" +msgstr "{configname} эсенән {var} мөхит үҙгәреүсәне күрһәтелмәгән!" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Environment variable {{env: {var}}} is not set!" +msgstr "{{env: {var}}} мөхит үҙгәреүсәне күрһәтелмәгән!" + +#: ../fdroidserver/deploy.py +msgid "Error deploying 'github_releases', {} not present. (You might need to run `fdroid update` first.)" +msgstr "'github_releases' урынлаштырыу хатаһы, {} юҡ. (Башта `fdroid update` командаһын эшләтеп алырға кәрәк булыуы мөмкин.)" + +#: ../fdroidserver/import_subcommand.py +msgid "Error while getting repo address" +msgstr "Репозиторий адресын алғанда хата" + +#: ../fdroidserver/scanner.py +msgid "Exit with a non-zero code if problems were found" +msgstr "Проблемалар табылһа, нулдән айырмалы код менән сығырға" + +#: ../fdroidserver/__main__.py +msgid "Extract application metadata from a source repository" +msgstr "Сығанаҡ репозиторийынан ҡушымтаның мета-мәғлүмәттәрен сығарыу" + +#: ../fdroidserver/__main__.py +msgid "Extract signatures from APKs" +msgstr "APK-ларҙан имзаларҙы сығарыу" + +#: ../fdroidserver/install.py +msgid "F-Droid.apk could not be downloaded from any known source!" +msgstr "F-Droid.apk-ны билдәле сығанаҡтарҙың береһенән дә йөкмәтеп булманы!" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed copying {path}: {error}" +msgstr "{path} күсерелмәне: {error}" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Failed fetching signatures for '{apkfilename}': {error}" +msgstr "'{apkfilename}' өсөн имзаларҙы алып булманы: {error}" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed reading {path}: {error}" +msgstr "{path} уҡылманы: {error}" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed resizing {path}: {error}" +msgstr "{path} үлсәме үҙгәртелмәне: {error}" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Failed to create S3 bucket: {url}" +msgstr "S3 контейнерын булдырып булманы: {url}" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get APK information, deleting {path}" +msgstr "APK тураһында мәғлүмәт алып булманы, {path} юйыла" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Failed to get APK information, skipping {path}" +msgstr "APK тураһында мәғлүмәт алып булманы, {path} үткәреп ебәрелә" + +#: ../fdroidserver/update.py +msgid "Failed to get APK signing key fingerprint" +msgstr "APK имзалау асҡысының бармаҡ эҙен алып булманы" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Failed to install '{apkfilename}' on {dev}: {error}" +msgstr "'{apkfilename}' {dev} ҡоролмаһына ҡуйылманы: {error}" + +#: ../fdroidserver/common.py +msgid "Failed to sign application" +msgstr "Ҡушымтаны тамғалап булманы" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Fetched buildserverid from VM: {buildserverid}" +msgstr "VM-дан йыйыу-серверының ID-һы алынды: {buildserverid}" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "Fetched signatures for '{apkfilename}' -> '{sigdir}'" +msgstr "'{apkfilename}' өсөн имзалар алынды -> '{sigdir}'" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "File disappeared while processing it: {path}" +msgstr "Файл эшкәртелгән ваҡытта юғалды: {path}" + +#: ../fdroidserver/build.py ../fdroidserver/install.py +#: ../fdroidserver/rewritemeta.py ../fdroidserver/scanner.py +#: ../fdroidserver/update.py +msgid "Finished" +msgstr "Тамамланды" + +#: ../fdroidserver/lint.py +msgid "Forbidden HTML tags" +msgstr "Тыйылған HTML тегтары" + +#: ../fdroidserver/build.py +msgid "Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode." +msgstr "Һүндерелгән ҡушымталарҙы мәжбүри йыйыу һәм сканлау проблемаларына ҡарамаҫтан дауам итеү. Тик һынау режимында ғына рөхсәт ителә." + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Force halting build after {0} sec timeout!" +msgstr "{0} секундлыҡ тайм-ауттан һуң йыйыуҙы мәжбүри туҡтатыу!" + +#: ../fdroidserver/scanner.py +msgid "Force scan of disabled apps and builds." +msgstr "Һүндерелгән ҡушымталарҙы һәм йыйылмаларҙы мәжбүри сканлау." + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found \"{path}\" graphic without metadata for app \"{name}\"!" +msgstr "\"{name}\" ҡушымтаһы өсөн мета-мәғлүмәтһеҙ \"{path}\" графикаһы табылды!" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Found bad funding file \"{path}\" for \"{name}\":" +msgstr "\"{name}\" өсөн дөрөҫ булмаған \"{path}\" финанслау файлы табылды:" + +#: ../fdroidserver/common.py +msgid "Found invalid appids in arguments" +msgstr "Аргументтарҙа дөрөҫ булмаған appid-ҙар табылды" + +#: ../fdroidserver/common.py +msgid "Found invalid versionCodes for some apps" +msgstr "Ҡайһы бер ҡушымталар өсөн дөрөҫ булмаған versionCode-тар табылды" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Found multiple JAR Signature Block Files in {path}" +msgstr "{path} эсендә бер нисә JAR имза блок файлы табылды" + +#: ../fdroidserver/common.py +msgid "Found multiple Signer Certificates!" +msgstr "Бер нисә имзалаусы сертификаты табылды!" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Found multiple metadata files for {appid}" +msgstr "{appid} өсөн бер нисә мета-мәғлүмәт файлы табылды" + +#: ../fdroidserver/index.py +msgid "Found multiple signing certificates for repository." +msgstr "Репозиторий өсөн бер нисә имзалау сертификаты табылды." + +#: ../fdroidserver/index.py +msgid "Found no signing certificates for repository." +msgstr "Репозиторий өсөн имзалау сертификаттары табылманы." + +#: ../fdroidserver/lint.py +#, python-format +msgid "Found non-file at %s" +msgstr "%s юлында файл булмаған объект табылды" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Found {apkfilename} at {url}" +msgstr "{apkfilename} {url} адресында табылды" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Found {count} problems in {filename}" +msgstr "{filename} эсендә {count} проблема табылды" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Found {count} warnings in {filename}" +msgstr "{filename} эсендә {count} иҫкәрмә табылды" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Generated skeleton metadata for {appid}" +msgstr "{appid} өсөн мета-мәғлүмәт ҡалыбы булдырылды" + +#: ../fdroidserver/common.py +#, python-format +msgid "Git checkout of '%s' failed" +msgstr "'%s' Git checkout-ы уңышһыҙ булды" + +#: ../fdroidserver/common.py +msgid "Git clean failed" +msgstr "Git clean уңышһыҙ булды" + +#: ../fdroidserver/common.py +msgid "Git fetch failed" +msgstr "Git fetch уңышһыҙ булды" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +#, python-format +msgid "Git remote set-head failed: \"%s\"" +msgstr "Git remote set-head уңышһыҙ булды: \"%s\"" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +msgid "Git reset failed" +msgstr "Git reset уңышһыҙ булды" + +#: ../fdroidserver/common.py +msgid "Git submodule deinit failed" +msgstr "Git submodule deinit уңышһыҙ булды" + +#: ../fdroidserver/common.py +msgid "Git submodule sync failed" +msgstr "Git submodule sync уңышһыҙ булды" + +#: ../fdroidserver/common.py +msgid "Git submodule update failed" +msgstr "Git submodule update уңышһыҙ булды" + +#: ../fdroidserver/common.py +msgid "HTTPS must be used with Subversion URLs!" +msgstr "Subversion URL-дары менән HTTPS ҡулланылырға тейеш!" + +#: ../fdroidserver/deploy.py +msgid "If a git mirror gets to big, allow the archive to be deleted" +msgstr "git көҙгөһө бигерәк ҙурайып китһә, архивты юйырға рөхсәт итеү" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "If this upload fails, try manually uploading to {url}" +msgstr "Был йөкмәү уңышһыҙ булһа, {url} адресына ҡулдан йөкмәп ҡарағыҙ" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Ignoring '{field}' in '{metapath}' metadata because it is deprecated." +msgstr "'{metapath}' мета-мәғлүмәттәрендәге '{field}' иҫкергән булғанға иғтибарһыҙ ҡалдырыла." + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring FUNDING.yml entry longer than 2048: %s" +msgstr "2048-ҙән оҙонораҡ FUNDING.yml яҙмаһы иғтибарһыҙ ҡалдырыла: %s" + +#: ../fdroidserver/update.py +#, python-format +msgid "Ignoring bad element in manifest: %s" +msgstr "Манифестағы дөрөҫ булмаған элемент иғтибарһыҙ ҡалдырыла: %s" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Ignoring deprecated {oldfile}, use {newfile}!" +msgstr "Иҫкергән {oldfile} иғтибарһыҙ ҡалдырыла, {newfile} ҡулланығыҙ!" + +#: ../fdroidserver/index.py +msgid "Ignoring package without metadata: " +msgstr "Мета-мәғлүмәтһеҙ пакет иғтибарһыҙ ҡалдырыла: " + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Ignoring stale cache data for {apkfilename}" +msgstr "{apkfilename} өсөн иҫкергән кеш мәғлүмәттәре иғтибарһыҙ ҡалдырыла" + +#: ../fdroidserver/update.py +msgid "Include APKs that are signed with disabled algorithms like MD5" +msgstr "MD5 кеүек һүндерелгән алгоритмдар менән тамғаланған APK-ларҙы индереү" + +#: ../fdroidserver/mirror.py +msgid "Include the PGP signature .asc files in the mirror" +msgstr "Көҙгөгә PGP-имзалы .asc файлдарын индереү" + +#: ../fdroidserver/mirror.py +msgid "Include the build logs in the mirror" +msgstr "Көҙгөгә йыйыу логтарын индереү" + +#: ../fdroidserver/mirror.py +msgid "Include the source tarballs in the mirror" +msgstr "Көҙгөгә сығанаҡ tarball-дарҙы индереү" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Including metadata from %s@%s" +msgstr "%s@%s версияһынан мета-мәғлүмәттәр индерелә" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Including metadata from {path}" +msgstr "{path} юлынан мета-мәғлүмәттәр индерелә" + +#: ../fdroidserver/common.py +msgid "Initialising submodules" +msgstr "Аҫмодулдәрҙе инициализациялау" + +#: ../fdroidserver/install.py +msgid "Install all signed applications available" +msgstr "Барлыҡ тамғаланған ҡушымталарҙы ҡуйыу" + +#: ../fdroidserver/__main__.py +msgid "Install built packages on devices" +msgstr "Йыйылған пакеттарҙы ҡоролмаларға ҡуйыу" + +#: ../fdroidserver/install.py +#, python-format +msgid "Installing %s..." +msgstr "%s ҡуйыла..." + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Installing '{apkfilename}' on {dev}..." +msgstr "'{apkfilename}' {dev} ҡоролмаһына ҡуйыла..." + +#: ../fdroidserver/__main__.py +msgid "Interact with the repo HTTP server" +msgstr "Репоның HTTP-серверы менән эш итеү" + +#: ../fdroidserver/update.py +msgid "Invalid APK" +msgstr "Дөрөҫ булмаған APK" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid AutoUpdateMode: {mode}" +msgstr "Дөрөҫ булмаған AutoUpdateMode: {mode}" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid UpdateCheckMode: {mode}" +msgstr "Дөрөҫ булмаған UpdateCheckMode: {mode}" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Invalid VercodeOperation: {field}" +msgstr "Дөрөҫ булмаған VercodeOperation: {field}" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Invalid VercodeOperation: {invalid_ops}" +msgstr "Дөрөҫ булмаған VercodeOperation: {invalid_ops}" + +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid application ID {appid}" +msgstr "Дөрөҫ булмаған ҡушымта идентификаторы {appid}" + +#: ../fdroidserver/lint.py +msgid "Invalid bulleted list" +msgstr "Дөрөҫ булмаған маркировкалы исемлек" + +#: ../fdroidserver/common.py +#, python-format +msgid "Invalid name for published file: %s" +msgstr "Баҫтырылған файл өсөн дөрөҫ булмаған исем: %s" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid ndk: entry in build: \"{ndk}\"" +msgstr "Йыйылмала дөрөҫ булмаған ndk: яҙмаһы: \"{ndk}\"" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Invalid redirect to non-HTTPS: {before} -> {after} " +msgstr "HTTPS булмаған адресҡа дөрөҫ булмаған йүнәлтеү: {before} -> {after} " + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid scrlib metadata: '{file}' does not exist" +msgstr "Дөрөҫ булмаған scrlib мета-мәғлүмәте: '{file}' юҡ" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: could not parse '{file}'" +msgstr "Дөрөҫ булмаған srclib мета-мәғлүмәте: '{file}' танылманы" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Invalid srclib metadata: unknown key '{key}' in '{file}'" +msgstr "Дөрөҫ булмаған srclib мета-мәғлүмәте: '{file}' эсендә билдәһеҙ '{key}' асҡысы" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature failed to verify: {path}" +msgstr "JAR имзаһы тикшерелмәне: {path}" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "JAR signature verified: {path}" +msgstr "JAR имзаһы тикшерелде: {path}" + +#: ../fdroidserver/scanner.py +msgid "Java JAR file" +msgstr "Java JAR файлы" + +#: ../fdroidserver/mirror.py ../fdroidserver/publish.py +#: ../fdroidserver/update.py +msgid "Java JDK not found! Install in standard location or set java_paths!" +msgstr "Java JDK табылманы! Стандарт урынға ҡуйығыҙ йәки java_paths-ты күрһәтегеҙ!" + +#: ../fdroidserver/scanner.py +msgid "Java compiled class" +msgstr "Компиляцияланған Java класы" + +#: ../fdroidserver/signindex.py +msgid "Java jarsigner not found! Install in standard location or set java_paths!" +msgstr "Java jarsigner табылманы! Стандарт урынға ҡуйығыҙ йәки java_paths-ты күрһәтегеҙ!" + +#: ../fdroidserver/lint.py +msgid "Javascript in HTML src attributes" +msgstr "HTML-дың src атрибуттарында Javascript" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Keeping failed build \"{apkfilename}\"" +msgstr "Уңышһыҙ йыйылған \"{apkfilename}\" һаҡлана" + +#: ../fdroidserver/init.py +msgid "Keystore for signing key:\t" +msgstr "Имзалау асҡысы өсөн асҡыстар һаҡлағысы:\t" + +#: ../fdroidserver/lint.py +msgid "Known debug key is used in AllowedAPKSigningKeys: " +msgstr "AllowedAPKSigningKeys-та билдәле төҙәтеү асҡысы ҡулланыла: " + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Last used commit '{commit}' looks like a tag, but UpdateCheckMode is '{ucm}'" +msgstr "Һуңғы ҡулланылған '{commit}' коммиты тегҡа оҡшаған, ләкин UpdateCheckMode '{ucm}' итеп ҡуйылған" + +#: ../fdroidserver/lint.py +msgid "Liberapay donation methods belong in the Liberapay: field" +msgstr "Liberapay иғәнә ысулдары Liberapay: яланында булырға тейеш" + +#: ../fdroidserver/rewritemeta.py +msgid "List files that would be reformatted (dry run)" +msgstr "Яңынан форматланасаҡ файлдарҙың исемлеге (ҡоро эшләтеп ҡарау)" + +#: ../fdroidserver/lint.py +msgid "Locale included in f-droid.org URL" +msgstr "f-droid.org URL-ында локаль бар" + +#: ../fdroidserver/build.py +msgid "Make the build stop on exceptions" +msgstr "Хаталар булғанда йыйыуҙы туҡтатыу" + +#: ../fdroidserver/index.py +msgid "Malformed repository mirrors." +msgstr "Репозиторий көҙгөләре дөрөҫ форматланмаған." + +#: ../fdroidserver/deploy.py +msgid "Malformed serverwebroot line:" +msgstr "serverwebroot юлы дөрөҫ форматланмаған:" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Max recursion depth in ZIP file reached: %s" +msgstr "ZIP файлында максималь рекурсия тәрәнлегенә етелде: %s" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Mirror config for {url} contains \"isPrimary\" key!" +msgstr "{url} өсөн көҙгө көйләүҙәрендә \"isPrimary\" асҡысы бар!" + +#: ../fdroidserver/mirror.py +msgid "Mirror the full repo and archive, all file types." +msgstr "Репо менән архивтың тулы көҙгөһөн яһау, бөтә файл төрҙәре." + +#: ../fdroidserver/gpgsign.py +msgid "Missing output directory" +msgstr "Сығарыу каталогы юҡ" + +#: ../fdroidserver/metadata.py +msgid "Moving Anti-Features declarations to localized files:" +msgstr "Anti-Features декларацияларын локалләштерелгән файлдарға күсереү:" + +#: ../fdroidserver/index.py +msgid "Neither \"repo_pubkey\" nor \"keystorepass\" set in config.yml" +msgstr "config.yml-да \"repo_pubkey\" ҙә, \"keystorepass\" та күрһәтелмәгән" + +#: ../fdroidserver/verify.py +#, python-format +msgid "No APK for package: %s" +msgstr "%s пакеты өсөн APK юҡ" + +#: ../fdroidserver/common.py +msgid "No Android SDK found!" +msgstr "Android SDK табылманы!" + +#: ../fdroidserver/install.py +msgid "No attached devices found" +msgstr "Тоташтырылған ҡоролмалар табылманы" + +#: ../fdroidserver/install.py +msgid "No devices found for `adb install`! Please plug one in." +msgstr "`adb install` өсөн ҡоролмалар табылманы! Зинһар, берәйһен тоташтырығыҙ." + +#: ../fdroidserver/index.py +msgid "No fingerprint in URL." +msgstr "URL-да бармаҡ эҙе юҡ." + +#: ../fdroidserver/common.py +msgid "No git submodules available" +msgstr "git аҫмодулдәре юҡ" + +#: ../fdroidserver/import_subcommand.py +msgid "No gradle project could be found. Specify --subdir?" +msgstr "gradle проекты табылманы. --subdir күрһәтеп ҡарайһығыҙмы?" + +#: ../fdroidserver/import_subcommand.py +msgid "No information found." +msgstr "Мәғлүмәт табылманы." + +#: ../fdroidserver/checkupdates.py +msgid "No matching tags found" +msgstr "Ярашлы тегтар табылманы" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "No minimum SDK version found in {0}, using default (3)." +msgstr "{0} эсендә SDK-ның минималь версияһы табылманы, стандарт (3) ҡулланыла." + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is Free Software" +msgstr "Ҡушымтаның Ирекле Программа булыуын күрһәтеү кәрәкмәй" + +#: ../fdroidserver/lint.py +msgid "No need to specify that the app is for Android" +msgstr "Ҡушымтаның Android өсөн булыуын күрһәтеү кәрәкмәй" + +#: ../fdroidserver/deploy.py +msgid "No option set! Edit your config.yml to set at least one of these:" +msgstr "Бер параметр ҙа күрһәтелмәгән! config.yml файлына үҙгәреш индереп, ошоларҙың кәмендә береһен күрһәтегеҙ:" + +#: ../fdroidserver/common.py +msgid "No packages specified" +msgstr "Пакеттар күрһәтелмәгән" + +#: ../fdroidserver/install.py +#, python-format +msgid "No signed APK available for %s" +msgstr "%s өсөн тамғаланған APK юҡ" + +#: ../fdroidserver/install.py +msgid "No signed output directory - nothing to do" +msgstr "Тамғаланған сығарыу каталогы юҡ — эшләр нәмә юҡ" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No signing certificates found in {path}" +msgstr "{path} эсендә имзалау сертификаттары табылманы" + +#: ../fdroidserver/common.py +#, python-format +msgid "No such package: %s" +msgstr "Бындай пакет юҡ: %s" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "No such versionCode {versionCode} for app {appid}" +msgstr "{appid} ҡушымтаһы өсөн бындай {versionCode} versionCode-ы юҡ" + +#: ../fdroidserver/checkupdates.py +msgid "No tags found" +msgstr "Тегтар табылманы" + +#: ../fdroidserver/publish.py ../fdroidserver/verify.py +msgid "No unsigned directory - nothing to do" +msgstr "Тамғаланмаған каталог юҡ — эшләр нәмә юҡ" + +#: ../fdroidserver/__main__.py +msgid "No version information could be found." +msgstr "Версия тураһында мәғлүмәт табылманы." + +#: ../fdroidserver/common.py +msgid "Not a valid size definition: \"{}\"" +msgstr "Дөрөҫ булмаған үлсәм билдәләмәһе: \"{}\"" + +#: ../fdroidserver/signindex.py +msgid "Nothing to do" +msgstr "Эшләр нәмә юҡ" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "Nothing to do for {appid}." +msgstr "{appid} өсөн эшләр нәмә юҡ." + +#: ../fdroidserver/init.py +msgid "Now set these in config.yml:" +msgstr "Хәҙер ошоларҙы config.yml-да күрһәтегеҙ:" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "OBB file has newer versionCode({integer}) than any APK:" +msgstr "OBB файлының versionCode-ы ({integer}) теләһә ҡайһы APK-ныҡынан яңыраҡ:" + +#: ../fdroidserver/update.py +msgid "OBB filename must start with \"main.\" or \"patch.\":" +msgstr "OBB файлының исеме \"main.\" йәки \"patch.\" менән башланырға тейеш:" + +#: ../fdroidserver/update.py +msgid "OBB's packagename does not match a supported APK:" +msgstr "OBB-ның пакет исеме яраҡлы APK-ға тап килмәй:" + +#: ../fdroidserver/deploy.py +msgid "Offline machine, skipping git mirror generation until `fdroid deploy`" +msgstr "Офлайн машина, `fdroid deploy` эшләтелгәнгә тиклем git көҙгөһөн булдырыу үткәреп ебәрелә" + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'packageNames' value. skipping ..." +msgstr "'github_releases' көйләүҙәренең береһендә 'packageNames' ҡиммәте юҡ. үткәреп ебәрелә ..." + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'projectUrl' value. skipping ..." +msgstr "'github_releases' көйләүҙәренең береһендә 'projectUrl' ҡиммәте юҡ. үткәреп ебәрелә ..." + +#: ../fdroidserver/deploy.py +msgid "One of the 'github_releases' config items is missing the 'token' value. skipping ..." +msgstr "'github_releases' көйләүҙәренең береһендә 'token' ҡиммәте юҡ. үткәреп ебәрелә ..." + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Only PNG and JPEG are supported for graphics, found: {path}" +msgstr "Графика өсөн тик PNG һәм JPEG ғына ярай, табылды: {path}" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/common.py +msgid "Only accepts a single key \"env\"" +msgstr "Тик бер генә \"env\" асҡысын ҡабул итә" + +#: ../fdroidserver/checkupdates.py +msgid "Only process apps with auto-updates" +msgstr "Тик автоматик яңыртылыусы ҡушымталарҙы ғына эшкәртеү" + +#: ../fdroidserver/lint.py +msgid "OpenCollective donation methods belong in the OpenCollective: field" +msgstr "OpenCollective иғәнә ысулдары OpenCollective: яланында булырға тейеш" + +#: ../fdroidserver/verify.py +msgid "Output JSON report to file named after APK." +msgstr "JSON отчетын APK исеме менән аталған файлға сығарыу." + +#: ../fdroidserver/scanner.py +msgid "Output JSON to stdout." +msgstr "JSON-ды стандарт сығарыу ағымына (stdout) сығарыу." + +#: ../fdroidserver/checkupdates.py ../fdroidserver/gpgsign.py +#: ../fdroidserver/publish.py ../fdroidserver/signindex.py +#: ../fdroidserver/update.py +msgid "Outputting JSON" +msgstr "JSON сығарыла" + +#: ../fdroidserver/import_subcommand.py +msgid "Overall license of the project." +msgstr "Проекттың дөйөм лицензияһы." + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "Overriding blank versionName in {apkfilename} from metadata: {version}" +msgstr "{apkfilename} эсендәге буш versionName мета-мәғлүмәттән алынған {version} менән алмаштырыла" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "Package \"{appid}\" already exists" +msgstr "\"{appid}\" пакеты инде бар" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Parsing manifest at '{path}'" +msgstr "'{path}' юлындағы манифест таныла" + +#: ../fdroidserver/common.py +msgid "Password required with username" +msgstr "Ҡулланыусы исеме менән бергә пароль кәрәк" + +#: ../fdroidserver/import_subcommand.py +msgid "Path to main Android project subdirectory, if not in root." +msgstr "Төп Android проектының аҫкаталогына юл, әгәр ул тамыр каталогында булмаһа." + +#: ../fdroidserver/init.py +msgid "Path to the Android SDK (sometimes set in ANDROID_HOME)" +msgstr "Android SDK-ға юл (ҡайһы саҡ ANDROID_HOME-да күрһәтелә)" + +#: ../fdroidserver/btlog.py +msgid "Path to the git repo to use as the log" +msgstr "Лог итеп ҡулланыу өсөн git репозиторийына юл" + +#: ../fdroidserver/init.py +msgid "Path to the keystore for the repo signing key" +msgstr "Репо имзалау асҡысы өсөн асҡыстар һаҡлағысына юл" + +#: ../fdroidserver/nightly.py +msgid "Print the secret variable to the terminal for easy copy/paste" +msgstr "Йәшерен үҙгәреүсәнде күсереп-ҡуйыу еңел булһын өсөн терминалға сығарыу" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Privacy mode was enabled based on your locale ({country_code})." +msgstr "Һеҙҙең локаль ({country_code}) нигеҙендә хосусилыҡ режимы ҡабыҙылды." + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Problem with ZIP file: %s, error %s" +msgstr "ZIP файлы менән проблема: %s, хата %s" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Problem with xml at '{path}'" +msgstr "'{path}' юлындағы xml менән проблема" + +#: ../fdroidserver/checkupdates.py +msgid "Process auto-updates" +msgstr "Автоматик яңыртыуҙарҙы эшкәртеү" + +#: ../fdroidserver/publish.py ../fdroidserver/update.py +#, python-brace-format +msgid "Processing {apkfilename}" +msgstr "{apkfilename} эшкәртелә" + +#: ../fdroidserver/checkupdates.py ../fdroidserver/scanner.py +#, python-brace-format +msgid "Processing {appid}" +msgstr "{appid} эшкәртелә" + +#: ../fdroidserver/update.py +msgid "Produce human-readable XML/JSON for index files" +msgstr "Индекс файлдары өсөн кеше уҡый алырлыҡ XML/JSON булдырыу" + +#: ../fdroidserver/import_subcommand.py +msgid "Project URL to import from." +msgstr "Импортлау өсөн проекттың URL-ы." + +#: ../fdroidserver/lint.py +msgid "Punctuation should be avoided" +msgstr "Тыныш билдәләренән ҡасырға кәрәк" + +#: ../fdroidserver/btlog.py +msgid "Push the log to this git remote repository" +msgstr "Логты ошо алыҫтағы git репозиторийына ебәреү" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Pushing binary transparency log to {url}" +msgstr "Бинар асыҡлыҡ логы {url} адресына ебәрелә" + +#: ../fdroidserver/deploy.py +msgid "Pushing to remote server failed!" +msgstr "Алыҫтағы серверға ебәреү уңышһыҙ булды!" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Pushing to {url}" +msgstr "{url} адресына ебәрелә" + +#: ../fdroidserver/__main__.py +msgid "Quickly start a new repository" +msgstr "Яңы репозиторийҙы тиҙ генә башлау" + +#: ../fdroidserver/__main__.py +msgid "Read all the metadata files and exit" +msgstr "Барлыҡ мета-мәғлүмәт файлдарын уҡыу һәм сығыу" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading '{config_file}'" +msgstr "'{config_file}' уҡыла" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed, APK invalid: '{apkfilename}'" +msgstr "packageName/versionCode/versionName уҡылманы, APK дөрөҫ түгел: '{apkfilename}'" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Reading packageName/versionCode/versionName failed,APK invalid: '{apkfilename}'" +msgstr "packageName/versionCode/versionName уҡылманы, APK дөрөҫ түгел: '{apkfilename}'" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Reading {apkfilename} from cache" +msgstr "{apkfilename} кештан уҡыла" + +#: ../fdroidserver/build.py +msgid "Refresh and cache scanner rules and signatures from the network" +msgstr "Сканлаусы ҡағиҙәләрен һәм имзаларын селтәрҙән яңыртыу һәм кешлау" + +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "Refusing to sign '{path}', file exists in both {dir1} and {dir2} folder." +msgstr "'{path}' тамғалауҙан баш тартам, файл {dir1} һәм {dir2} каталогтарында ла бар." + +#: ../fdroidserver/verify.py +msgid "Remove source tarball and any APKs if successfully verified." +msgstr "Уңышлы тикшерелһә, сығанаҡ tarball-ды һәм теләһә ниндәй APK-ларҙы юйыу." + +#: ../fdroidserver/common.py +msgid "Removing specified files" +msgstr "Күрһәтелгән файлдар юйыла" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Removing {path}\"" +msgstr "\"{path} юйыла" + +#: ../fdroidserver/update.py +msgid "Rename APK files that do not match package.name_123.apk" +msgstr "package.name_123.apk ҡалыбына тап килмәгән APK файлдарының исемен үҙгәртеү" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Resigning {apkfilename} with provided debug.keystore" +msgstr "{apkfilename} бирелгән debug.keystore менән яңынан тамғалана" + +#: ../fdroidserver/update.py +msgid "Resize all the icons exceeding the max pixel size and exit" +msgstr "Максималь пиксель үлсәменән артҡан бөтә иконкаларҙың үлсәмен үҙгәртеү һәм сығыу" + +#: ../fdroidserver/common.py +msgid "Restrict output to warnings and errors" +msgstr "Сығарылышты иҫкәрмәләр һәм хаталар менән сикләү" + +#: ../fdroidserver/net.py +#, python-format +msgid "Retrying failed download: %s" +msgstr "Уңышһыҙ йөкмәү ҡабатлана: %s" + +#: ../fdroidserver/__main__.py +msgid "Rewrite all the metadata files" +msgstr "Барлыҡ мета-мәғлүмәт файлдарын үҙгәртеп яҙыу" + +#: ../fdroidserver/rewritemeta.py +#, python-brace-format +msgid "Rewriting '{appid}'" +msgstr "'{appid}' үҙгәртеп яҙыла" + +#: ../fdroidserver/checkupdates.py +msgid "Run on git repo that has uncommitted changes" +msgstr "Һаҡланмаған үҙгәрештәре булған git репозиторийында эшләтеү" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Run over {cibase} to find -debug.apk. and skip repo_basedir {repo_basedir}" +msgstr "{cibase} буйлап -debug.apk. табыу өсөн эшләтеү. һәм repo_basedir {repo_basedir} үткәреп ебәреү" + +#: ../fdroidserver/lint.py +msgid "Run rewritemeta to fix formatting" +msgstr "Форматлауҙы төҙәтеү өсөн rewritemeta-ны эшләтегеҙ" + +#: ../fdroidserver/deploy.py +msgid "Running first pass with MD5 checking disabled" +msgstr "MD5 тикшереүе һүндерелгән килеш беренсе үтеү башҡарыла" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "Running wget in {path}" +msgstr "wget {path} каталогында эшләтелә" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "SHA-256 of {url} does not match entry!" +msgstr "{url} адресының SHA-256 суммаһы яҙмаға тап килмәй!" + +#: ../fdroidserver/build.py +msgid "Scan the resulting APK(s) for known non-free classes." +msgstr "Алынған APK(-лар)ҙы билдәле ирекле булмаған кластарға сканлау." + +#: ../fdroidserver/__main__.py +msgid "Scan the source code of a package" +msgstr "Пакеттың сығанаҡ кодын сканлау" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {apk}" +msgstr "Сканлаусы {apk} эсендә {count} проблема тапты" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:" +msgstr "Сканлаусы {appid} эсендә {count} проблема тапты:" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Scanner found {count} problems in {appid}:{versionCode}:" +msgstr "Сканлаусы {appid}:{versionCode} эсендә {count} проблема тапты:" + +#: ../fdroidserver/build.py +msgid "Scanner found {} problem" +msgid_plural "Scanner found {} problems" +msgstr[0] "Сканлаусы {} проблема тапты" +msgstr[1] "Сканлаусы {} проблема тапты" + +#: ../fdroidserver/scanner.py +msgid "Scanning APK for extra signing blocks." +msgstr "APK-ны өҫтәмә имзалау блоктарына сканлау." + +#: ../fdroidserver/scanner.py +msgid "Scanning APK with dexdump for known non-free classes." +msgstr "APK-ны dexdump менән билдәле ирекле булмаған кластарға сканлау." + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Set NDK {release} ({version}) up" +msgstr "NDK {release} ({version}) көйләнде" + +#: ../fdroidserver/common.py +msgid "Set clock to that time using:" +msgstr "Сәғәтте ошо ваҡытҡа ҡуйыу өсөн ҡулланығыҙ:" + +#: ../fdroidserver/nightly.py +msgid "Set maximum releases in repo before older ones are archived" +msgstr "Иҫкерәктәре архивланыр алдынан репозиторийҙағы максималь релиздар һанын билдәләү" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Set open file limit to {integer}" +msgstr "Асыҡ файлдар сикләүен {integer} итеп ҡуйыу" + +#: ../fdroidserver/__main__.py +msgid "Set up an app build for a nightly build repo" +msgstr "Төнгө йыйыу репозиторийы өсөн ҡушымта йыйыуҙы көйләү" + +#: ../fdroidserver/build.py +msgid "Setting open file limit failed: " +msgstr "Асыҡ файлдар сикләүен ҡуйып булманы: " + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "Setting {0} sec timeout for this build" +msgstr "Был йыйыу өсөн {0} секундлыҡ тайм-аут ҡуйыла" + +#: ../fdroidserver/__main__.py +msgid "Sign and place packages in the repo" +msgstr "Пакеттарҙы тамғалау һәм репозиторийға урынлаштырыу" + +#: ../fdroidserver/__main__.py +msgid "Sign indexes created using update --nosign" +msgstr "update --nosign ярҙамында булдырылған индекстарҙы тамғалау" + +#: ../fdroidserver/build.py +msgid "Skip scanning the source code for binaries and other problems" +msgstr "Сығанаҡ кодты бинарҙарға һәм башҡа проблемаларға сканлауҙы үткәреп ебәреү" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping '{apkfilename}' with invalid signature!" +msgstr "Дөрөҫ булмаған имзалы '{apkfilename}' үткәреп ебәрелә!" + +#: ../fdroidserver/deploy.py ../fdroidserver/index.py +#, python-format +msgid "Skipping GitLab Pages mirror because the repo is too large (>%.2fGB)!" +msgstr "GitLab Pages көҙгөһө үткәреп ебәрелә, сөнки репозиторий бигерәк ҙур (>%.2fGB)!" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping index generation for {appid}" +msgstr "{appid} өсөн индекс булдырыу үткәреп ебәрелә" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Skipping {apkfilename} with invalid signature!" +msgstr "Дөрөҫ булмаған имзалы {apkfilename} үткәреп ебәрелә!" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "Skipping {appid}: disabled" +msgstr "{appid} үткәреп ебәрелә: һүндерелгән" + +#: ../fdroidserver/deploy.py +msgid "Specify a local folder to sync the repo to" +msgstr "Репоны синхронлаштырыу өсөн локаль каталогты күрһәтегеҙ" + +#: ../fdroidserver/deploy.py +msgid "Specify an identity file to provide to SSH for rsyncing" +msgstr "rsync өсөн SSH-ға биреләсәк идентификация файлын күрһәтегеҙ" + +#: ../fdroidserver/nightly.py +msgid "Specify which debug keystore file to use." +msgstr "Ҡайһы төҙәтеү асҡыстар һаҡлағысы файлын ҡулланырға икәнен күрһәтегеҙ." + +#: ../fdroidserver/common.py +msgid "Spew out even more information than normal" +msgstr "Ғәҙәттәгенән дә күберәк мәғлүмәт сығарыу" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "Stripping mystery signature from {apkfilename}" +msgstr "Серле имза {apkfilename} файлынан алына" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Summary '%s' is just the app's name" +msgstr "'%s' ҡыҫҡаса аңлатмаһы — ул ҡушымтаның исеме генә" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Summary of length {length} is over the {limit} char limit" +msgstr "{length} оҙонлоғондағы ҡыҫҡаса аңлатма {limit} символ сикләүенән артып китә" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "System clock is older than date in {path}!" +msgstr "Система сәғәте {path} эсендәге датанан иҫкерәк!" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode only works for git, hg, bzr and git-svn repositories currently" +msgstr "Тегтарҙы яңыртыу режимы әлеге ваҡытта тик git, hg, bzr һәм git-svn репозиторийҙары өсөн генә эшләй" + +#: ../fdroidserver/checkupdates.py +msgid "Tags update mode used in git-svn, but the repo was not set up with tags" +msgstr "Тегтарҙы яңыртыу режимы git-svn-да ҡулланылған, ләкин репо тегтар менән көйләнмәгән" + +#: ../fdroidserver/build.py +msgid "Test mode - put output in the tmp directory only, and always build, even if the output already exists." +msgstr "Һынау режимы — сығарылышты тик tmp каталогына ғына урынлаштырыу һәм сығарылыш булһа ла, һәр ваҡыт йыйыу." + +#: ../fdroidserver/index.py +msgid "The \"qrcode\" Python package is not installed (e.g. apt-get install python3-qrcode)!" +msgstr "\"qrcode\" Python пакеты ҡуйылмаған (мәҫ. apt-get install python3-qrcode)!" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "The OBB version code must come after \"{name}.\":" +msgstr "OBB версия коды \"{name}.\" һуңынан килергә тейеш:" + +#: ../fdroidserver/btlog.py +msgid "The base URL for the repo to log (default: https://f-droid.org)" +msgstr "Лог яһаласаҡ репоның төп URL-ы (стандарт: https://f-droid.org)" + +#: ../fdroidserver/mirror.py +msgid "The directory to write the mirror to" +msgstr "Көҙгөнө яҙыу өсөн каталог" + +#: ../fdroidserver/nightly.py +msgid "The file to be included in the repo (path or glob)" +msgstr "Репоға индереләсәк файл (юл йәки ҡалып)" + +#: ../fdroidserver/index.py +msgid "The repository's fingerprint does not match." +msgstr "Репозиторийҙың бармаҡ эҙе тап килмәй." + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "The root dir for local_copy_dir \"{path}\" does not exist!" +msgstr "local_copy_dir \"{path}\" өсөн тамыр каталогы юҡ!" + +#: ../fdroidserver/publish.py +msgid "There is a keyalias collision - publishing halted" +msgstr "keyalias ҡапма-ҡаршылығы бар — баҫтырыу туҡтатылды" + +#: ../fdroidserver/common.py +msgid "These are the apps that have been archived from the main repo." +msgstr "Былар — төп репозиторийҙан архиваланған ҡушымталар." + +#: ../fdroidserver/mirror.py +msgid "This command should never be used to mirror f-droid.org! A full copy requires more than 600GB." +msgstr "Был команда f-droid.org-тың көҙгөһөн яһау өсөн бер ҡасан да ҡулланылырға тейеш түгел! Тулы күсермә өсөн 600GB-тан ашыу урын кәрәк." + +#: ../fdroidserver/common.py +msgid "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid." +msgstr "Был — F-Droid менән ҡулланыу өсөн ҡушымталар репозиторийы. Был репозиторийҙағы ҡушымталар йә оригиналь эшләүселәр тарафынан йыйылған рәсми бинарҙар, йә f-droid.org администраторы тарафынан https://gitlab.com/fdroid адресындағы ҡоралдар ярҙамында сығанаҡ кодтан йыйылған бинарҙар." + +#: ../fdroidserver/import_subcommand.py +#, python-format +msgid "This repo already has local metadata: %s" +msgstr "Был репоның инде локаль мета-мәғлүмәттәре бар: %s" + +#: ../fdroidserver/init.py +#, python-format +msgid "" +"To complete the setup, add your APKs to \"%s\"\n" +"then run \"fdroid update -c; fdroid update\". You might also want to edit\n" +"\"config.yml\" to set the URL, repo name, and more. You should also set up\n" +"a signing key (a temporary one might have been automatically generated).\n" +"\n" +"For more info: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"and https://f-droid.org/docs/Signing_Process" +msgstr "" +"Көйләүҙе тамамлау өсөн, APK-ларығыҙҙы \"%s\" каталогына өҫтәгеҙ,\n" +"шунан \"fdroid update -c; fdroid update\" командаһын эшләтегеҙ. Шулай уҡ URL-ды, репо исемен\n" +"һәм башҡаларҙы көйләү өсөн \"config.yml\" файлына үҙгәреш индерергә теләрһегеҙ. \n" +"Шулай уҡ имзалау асҡысын көйләргә тейешһегеҙ (ваҡытлыса асҡыс автоматик рәүештә булдырылған булырға мөмкин).\n" +"\n" +"Күберәк мәғлүмәт өсөн: https://f-droid.org/docs/Setup_an_F-Droid_App_Repo\n" +"һәм https://f-droid.org/docs/Signing_Process" + +#: ../fdroidserver/deploy.py +msgid "To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!" +msgstr "awsbucket-ты ҡулланыу өсөн config.yml-да awssecretkey һәм awsaccesskeyid та күрһәтелергә тейеш!" + +#: ../fdroidserver/deploy.py +msgid "To use rclone, rclone_config and awsbucket must be set in config.yml!" +msgstr "rclone-ды ҡулланыу өсөн config.yml-да rclone_config һәм awsbucket күрһәтелергә тейеш!" + +#: ../fdroidserver/lint.py +msgid "URL must start with https:// or http://" +msgstr "URL https:// йәки http:// менән башланырға тейеш" + +#: ../fdroidserver/lint.py +msgid "URL shorteners should not be used" +msgstr "URL ҡыҫҡартҡыстары ҡулланылырға тейеш түгел" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "URL {url} in Description: {error}" +msgstr "Тасуирламалағы {url} URL-ы: {error}" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use FSF or OSI approved tags from https://spdx.org/license-list" +msgstr "Көтөлмәгән \"{}\" лицензия тегы! Тик https://spdx.org/license-list адресынан FSF йәки OSI тарафынан раҫланған тегтарҙы ҡулланығыҙ" + +#: ../fdroidserver/lint.py +msgid "Unexpected license tag \"{}\"! Only use license tags configured in your config file" +msgstr "Көтөлмәгән \"{}\" лицензия тегы! Тик конфигурация файлында көйләнгән лицензия тегтарын ҡулланығыҙ" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Unknown entry {key} in {configname}" +msgstr "{configname} эсендә билдәһеҙ {key} яҙмаһы" + +#: ../fdroidserver/__main__.py +msgid "Unknown exception found!" +msgstr "Билдәһеҙ хата табылды!" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "Unknown file '{filename}' in build '{versionName}'" +msgstr "'{versionName}' йыйылмаһында билдәһеҙ '{filename}' файлы" + +#: ../fdroidserver/metadata.py +#, python-format +msgid "Unknown metadata format: %s" +msgstr "Билдәһеҙ мета-мәғлүмәт форматы: %s" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unknown metadata format: {path} (use: *.yml)" +msgstr "Билдәһеҙ мета-мәғлүмәт форматы: {path} (ҡулланығыҙ: *.yml)" + +#: ../fdroidserver/common.py +msgid "Unknown version of aapt, might cause problems: " +msgstr "aapt-тың билдәһеҙ версияһы, проблемалар тыуҙырыуы мөмкин: " + +#: ../fdroidserver/lint.py +msgid "Unnecessary leading space" +msgstr "Кәрәкмәгән алғы буш урын" + +#: ../fdroidserver/lint.py +msgid "Unnecessary trailing space" +msgstr "Кәрәкмәгән артҡы буш урын" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised app field '{fieldname}' in '{path}'" +msgstr "'{path}' эсендә танылмаған '{fieldname}' ҡушымта яланы" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Unrecognised build flag '{build_flag}' in '{path}'" +msgstr "'{path}' эсендә танылмаған '{build_flag}' йыйыу флагы" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported file type \"{extension}\" for repo graphic" +msgstr "Репо графикаһы өсөн яраҡһыҙ \"{extension}\" файл төрө" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "Unsupported graphics file found: {path}" +msgstr "Яраҡһыҙ графика файлы табылды: {path}" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused extlib at %s" +msgstr "%s юлында ҡулланылмаған extlib" + +#: ../fdroidserver/lint.py +#, python-format +msgid "Unused file at %s" +msgstr "%s юлында ҡулланылмаған файл" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scandelete path: %s" +msgstr "Ҡулланылмаған scandelete юлы: %s" + +#: ../fdroidserver/scanner.py +#, python-format +msgid "Unused scanignore path: %s" +msgstr "Ҡулланылмаған scanignore юлы: %s" + +#: ../fdroidserver/__main__.py +msgid "Update repo information for new packages" +msgstr "Яңы пакеттар өсөн репо мәғлүмәтен яңыртыу" + +#: ../fdroidserver/__main__.py +msgid "Update the binary transparency log for a URL" +msgstr "URL өсөн бинар асыҡлыҡ логын яңыртыу" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "UpdateCheckData has invalid URL: {url}" +msgstr "UpdateCheckData-ла дөрөҫ булмаған URL: {url}" + +#. Translators: https://developer.android.com/guide/topics/manifest/manifest-element.html#vcode +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}" +msgstr "UpdateCheckData версия кодына бөтөн һан булараҡ тап килергә тейеш (\\d йәки [0-9]): {codeex}" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData must use HTTPS URL: {url}" +msgstr "UpdateCheckData HTTPS URL-ын ҡулланырға тейеш: {url}" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "UpdateCheckData not a valid URL: {url}" +msgstr "UpdateCheckData — дөрөҫ URL түгел: {url}" + +#: ../fdroidserver/lint.py +msgid "UpdateCheckMode is set but it looks like checkupdates hasn't been run yet." +msgstr "UpdateCheckMode ҡуйылған, ләкин checkupdates әле эшләтелмәгән кеүек." + +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id +#: ../fdroidserver/lint.py +msgid "UpdateCheckName is set to the known application ID, it can be removed" +msgstr "UpdateCheckName билдәле ҡушымта идентификаторына ҡуйылған, уны алып ташларға мөмкин" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to androidobservatory.org" +msgstr "{apkfilename} androidobservatory.org-ҡа йөкләнә" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Uploading {apkfilename} to virustotal" +msgstr "{apkfilename} virustotal-ға йөкләнә" + +#: ../fdroidserver/lint.py +msgid "Use /HEAD instead of /master or /main to point at a file in the default branch" +msgstr "Стандарт ботаҡтағы файлға күрһәтеү өсөн /master йәки /main урынына /HEAD ҡулланығыҙ" + +#: ../fdroidserver/update.py +msgid "Use `fdroid update -c` to create it." +msgstr "Уны булдырыу өсөн `fdroid update -c` ҡулланығыҙ." + +#: ../fdroidserver/build.py +msgid "Use build server" +msgstr "Йыйыу серверын ҡулланыу" + +#: ../fdroidserver/update.py +msgid "Use date from APK instead of current time for newly added APKs" +msgstr "Яңы өҫтәлгән APK-лар өсөн ағымдағы ваҡыт урынына APK-нан датаны ҡулланыу" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for configuring s3cmd." +msgstr "s3cmd-ты көйләү өсөн \"{path}\" ҡулланыла." + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using \"{path}\" for syncing with remote storage." +msgstr "Алыҫтағы һаҡлағыс менән синхронлаштырыу өсөн \"{path}\" ҡулланыла." + +#: ../fdroidserver/common.py +msgid "Using APK Signature v2" +msgstr "APK имзаһының v2 версияһы ҡулланыла" + +#: ../fdroidserver/common.py +msgid "Using APK Signature v3" +msgstr "APK имзаһының v3 версияһы ҡулланыла" + +#: ../fdroidserver/common.py +msgid "Using JAR Signature" +msgstr "JAR имзаһы ҡулланыла" + +#: ../fdroidserver/common.py +msgid "Using Java's jarsigner, not recommended for verifying APKs! Use apksigner" +msgstr "Java-ның jarsigner-ы ҡулланыла, APK-ларҙы тикшереү өсөн тәҡдим ителмәй! apksigner ҡулланығыҙ" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "Using blank dictionary instead of contents of {path}!" +msgstr "{path} эстәлеге урынына буш һүҙлек ҡулланыла!" + +#: ../fdroidserver/init.py +#, python-brace-format +msgid "Using existing keystore \"{path}\"" +msgstr "Инде булған \"{path}\" асҡыстар һаҡлағысы ҡулланыла" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using rclone to sync with: {url}" +msgstr "Синхронлаштырыу өсөн rclone ҡулланыла: {url}" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "Using s3cmd to sync with: {url}" +msgstr "Синхронлаштырыу өсөн s3cmd ҡулланыла: {url}" + +#: ../fdroidserver/__main__.py +msgid "Valid commands are:" +msgstr "Яраҡлы командалар:" + +#: ../fdroidserver/verify.py +msgid "Verify against locally cached copy rather than redownloading." +msgstr "Яңынан йөкмәү урынына локаль кешланған күсермәгә ҡаршы тикшереү." + +#: ../fdroidserver/__main__.py +msgid "Verify the integrity of downloaded packages" +msgstr "Йөкләнгән пакеттарҙың бөтөнлөгөн тикшереү" + +#: ../fdroidserver/index.py +msgid "Verifying index signature:" +msgstr "Индекс имзаһы тикшерелә:" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "Verifying package {path} with apksigner." +msgstr "{path} пакеты apksigner менән тикшерелә." + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." +msgstr "VirusTotal API асҡысы 32MB-тан ҙурыраҡ файлдарҙы йөкләй алмай, {path} файлын йөкләү өсөн {url} ҡулланығыҙ." + +#: ../fdroidserver/__main__.py +msgid "Warn about possible metadata errors" +msgstr "Мөмкин булған мета-мәғлүмәт хаталары тураһында иҫкәртеү" + +#: ../fdroidserver/scanner.py +msgid "WebAssembly binary file" +msgstr "WebAssembly бинар файлы" + +#: ../fdroidserver/update.py +msgid "When configured for signed indexes, create only unsigned indexes at this stage" +msgstr "Тамғаланған индекстар өсөн көйләнгәндә, был этапта тик тамғаланмаған индекстарҙы ғына булдырыу" + +#: ../fdroidserver/lint.py +msgid "When linting the entire repository yamllint is disabled by default. This option forces yamllint regardless." +msgstr "Бөтә репозиторийҙы линтлағанда yamllint стандарт буйынса һүндерелгән. Был опция yamllint-ты мәжбүри рәүештә эшләтә." + +#: ../fdroidserver/publish.py +msgid "When signing or verifying fails, exit with an error code." +msgstr "Тамғалау йәки тикшереү уңышһыҙ булһа, хата коды менән сығыу." + +#: ../fdroidserver/install.py +msgid "Would you like to download and install F-Droid.apk via adb? (YES/no)" +msgstr "F-Droid.apk-ны adb аша йөкләп ҡуйырға теләйһегеҙме? (ЭЙЕ/юҡ)" + +#: ../fdroidserver/install.py +msgid "Would you like to download the app(s) from f-droid.org? (YES/no)" +msgstr "Ҡушымта(лар)ҙы f-droid.org-тан йөкләргә теләйһегеҙме? (ЭЙЕ/юҡ)" + +#: ../fdroidserver/init.py +msgid "X.509 'Distinguished Name' used when generating keys" +msgstr "Асҡыстарҙы булдырғанда ҡулланылған X.509 'Айырым исем' (Distinguished Name)" + +#: ../fdroidserver/common.py +msgid "You can use ANDROID_HOME to set the path to your SDK, i.e.:" +msgstr "SDK-ға юлды күрһәтеү өсөн ANDROID_HOME ҡуллана алаһығыҙ, йәғни:" + +#: ../fdroidserver/scanner.py +msgid "ZIP file archive" +msgstr "ZIP файл архивы" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "adb reports {serial} is \"{status}\"!" +msgstr "adb хәбәр итә: {serial} — \"{status}\"!" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "adding IdentityFile to {path}" +msgstr "IdentityFile {path} юлына өҫтәлә" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "adding to {name}: {path}" +msgstr "{name}-ға өҫтәлә: {path}" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "ике мәғәнәле опция: %(option)s %(matches)s-ҡа тап килеүе мөмкин" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "apksigner in build-tools;{version} passes APKs with invalid v3 signatures, ignoring." +msgstr "build-tools;{version} эсендәге apksigner дөрөҫ булмаған v3 имзалы APK-ларҙы үткәрә, иғтибарһыҙ ҡалдырыла." + +#: ../fdroidserver/common.py +msgid "apksigner not found! Cannot sign or verify modern APKs" +msgstr "apksigner табылманы! Заманса APK-ларҙы тамғалап йәки тикшереп булмай" + +#: ../fdroidserver/common.py +msgid "apksigner not found, it's required for signing!" +msgstr "apksigner табылманы, ул тамғалау өсөн кәрәк!" + +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id +#: ../fdroidserver/checkupdates.py ../fdroidserver/lint.py +#: ../fdroidserver/rewritemeta.py +msgid "application ID of file to operate on" +msgstr "эшкәртеләсәк файлдың ҡушымта идентификаторы" + +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id +#: ../fdroidserver/build.py ../fdroidserver/install.py +#: ../fdroidserver/publish.py ../fdroidserver/scanner.py +#: ../fdroidserver/verify.py +msgid "application ID with optional versionCode in the form APPID[:VERCODE]" +msgstr "ҡушымта идентификаторы, APPID[:VERCODE] рәүешендә versionCode өҫтәмә булыуы мөмкин" + +#: ../fdroidserver/common.py +msgid "archive_url needs to end with /archive" +msgstr "archive_url /archive менән тамамланырға тейеш" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "argument \"-\" with mode %r" +msgstr "%r режимлы \"-\" аргументы" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "argument %(argument_name)s: %(message)s" +msgstr "%(argument_name)s аргументы: %(message)s" + +#: ../fdroidserver/nightly.py +msgid "attempting bare SSH connection to test deploy key:" +msgstr "урынлаштырыу асҡысын һынау өсөн ябай SSH тоташыуы яһала:" + +#: ../fdroidserver/common.py +msgid "can not parse scrlib spec (not a string): '{}'" +msgstr "scrlib спецификацияһын танып булмай (юл түгел): '{}'" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "can't open '%(filename)s': %(error)s" +msgstr "'%(filename)s' асылманы: %(error)s" + +#: ../fdroidserver/scanner.py +msgid "can't open non-https url: '{};" +msgstr "https булмаған url-ды асып булмай: '{};" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "cannot find required srclibs: \"{path}\"" +msgstr "кәрәкле srclib-тар табылманы: \"{path}\"" + +#: /usr/lib/python3.11/argparse.py +msgid "cannot have multiple subparser arguments" +msgstr "бер нисә аҫпарсер аргументы була алмай" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "cannot merge actions - two groups are named %r" +msgstr "ғәмәлдәрҙе берләштереп булмай — ике төркөм %r тип аталған" + +#: ../fdroidserver/nightly.py +msgid "cannot publish update, did you set the deploy key?" +msgstr "яңыртыуҙы баҫтырып булмай, урынлаштырыу асҡысын күрһәттегеҙме?" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "cloning {url}" +msgstr "{url} клонлана" + +#: ../fdroidserver/__main__.py +msgid "commands from plugin modules:" +msgstr "плагин модулдәренән командалар:" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting option string: %s" +msgid_plural "conflicting option strings: %s" +msgstr[0] "ҡапма-ҡаршылыҡлы опция юлы: %s" +msgstr[1] "ҡапма-ҡаршылыҡлы опция юлдары: %s" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting subparser alias: %s" +msgstr "ҡапма-ҡаршылыҡлы аҫпарсер псевдонимы: %s" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "conflicting subparser: %s" +msgstr "ҡапма-ҡаршылыҡлы аҫпарсер: %s" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "could not parse '{path}'" +msgstr "'{path}' танылманы" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no name specified): '{}'" +msgstr "srclib спецификацияһын танып булманы (исем күрһәтелмәгән): '{}'" + +#: ../fdroidserver/common.py +msgid "could not parse srclib spec (no ref specified): '{}'" +msgstr "srclib спецификацияһын танып булманы (ref күрһәтелмәгән): '{}'" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "created {path}" +msgstr "{path} булдырылды" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "current version is newer: old vercode={old}, new vercode={new}" +msgstr "ағымдағы версия яңыраҡ: иҫке vercode={old}, яңы vercode={new}" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "deleting: repo/{apkfilename}" +msgstr "юйыла: repo/{apkfilename}" + +#: ../fdroidserver/scanner.py +msgid "dependency file without lock" +msgstr "йоҙаҡһыҙ бәйлелек файлы" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "deployed process log {path} to {dest}" +msgstr "эшкәртеү логы {path} {dest} адресына урынлаштырылды" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "dest= is required for options like %r" +msgstr "%r кеүек опциялар өсөн dest= кәрәк" + +#: ../fdroidserver/scanner.py +msgid "downloading '{}'" +msgstr "'{}' йөкләнә" + +#: ../fdroidserver/scanner.py +msgid "downloading scanner signatures from '{}' failed" +msgstr "сканлаусы имзаларын '{}' адресынан йөкләү уңышһыҙ булды" + +#: ../fdroidserver/scanner.py +msgid "executable binary, possibly code" +msgstr "башҡарылыусы бинар, код булыуы мөмкин" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "expected %s argument" +msgid_plural "expected %s arguments" +msgstr[0] "%s аргумент көтөлә" +msgstr[1] "%s аргумент көтөлә" + +#: /usr/lib/python3.11/argparse.py +msgid "expected at least one argument" +msgstr "кәмендә бер аргумент көтөлә" + +#: /usr/lib/python3.11/argparse.py +msgid "expected at most one argument" +msgstr "күп тигәндә бер аргумент көтөлә" + +#: /usr/lib/python3.11/argparse.py +msgid "expected one argument" +msgstr "бер аргумент көтөлә" + +#: ../fdroidserver/__main__.py +msgid "fdroid [] [-h|--help|--version|]" +msgstr "fdroid [<команда>] [-h|--help|--version|<аргументтар>]" + +#: ../fdroidserver/scanner.py +msgid "fetch the latest version of signatures from the web" +msgstr "имзаларҙың һуңғы версияһын вебтән алыу" + +#: ../fdroidserver/metadata.py +msgid "force metadata errors (default) to be warnings, or to be ignored." +msgstr "мета-мәғлүмәт хаталарын (стандарт) иҫкәрмәләргә әйләндерергә йәки иғтибарһыҙ ҡалдырырға мәжбүр итеү." + +#: ../fdroidserver/common.py +msgid "git svn clone failed" +msgstr "git svn clone уңышһыҙ булды" + +#: ../fdroidserver/scanner.py +msgid "gzip file archive" +msgstr "gzip файл архивы" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "ignored explicit argument %r" +msgstr "асыҡтан-асыҡ %r аргументы иғтибарһыҙ ҡалдырылды" + +#: ../fdroidserver/index.py +msgid "index-v1 must have a signature, use `fdroid signindex` to create it!" +msgstr "index-v1 имзалы булырға тейеш, уны булдырыу өсөн `fdroid signindex` ҡулланығыҙ!" + +#: ../fdroidserver/index.py +msgid "index-v2 must have a signature, use `fdroid signindex` to create it!" +msgstr "index-v2 имзалы булырға тейеш, уны булдырыу өсөн `fdroid signindex` ҡулланығыҙ!" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid %(type)s value: %(value)r" +msgstr "дөрөҫ булмаған %(type)s ҡиммәте: %(value)r" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid choice: %(value)r (choose from %(choices)s)" +msgstr "дөрөҫ булмаған һайлау: %(value)r (%(choices)s араһынан һайлағыҙ)" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid conflict_resolution value: %r" +msgstr "дөрөҫ булмаған conflict_resolution ҡиммәте: %r" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "invalid option string %(option)r: must start with a character %(prefix_chars)r" +msgstr "дөрөҫ булмаған %(option)r опция юлы: %(prefix_chars)r символы менән башланырға тейеш" + +#: ../fdroidserver/common.py +msgid "ipfs_cid not found, skipping CIDv1 generation" +msgstr "ipfs_cid табылманы, CIDv1 булдырыу үткәреп ебәрелә" + +#: ../fdroidserver/checkupdates.py +#, python-brace-format +msgid "latest build recipe is newer: old vercode={old}, new vercode={new}" +msgstr "һуңғы йыйыу рецебы яңыраҡ: иҫке vercode={old}, яңы vercode={new}" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "local_copy_dir does not end with \"fdroid\", perhaps you meant: \"{path}\"" +msgstr "local_copy_dir \"fdroid\" менән тамамланмай, бәлки һеҙ быны күҙ уңында тоттоғоҙ: \"{path}\"" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be an absolute path!" +msgstr "local_copy_dir абсолют юл булырға тейеш!" + +#: ../fdroidserver/deploy.py +msgid "local_copy_dir must be directory, not a file!" +msgstr "local_copy_dir каталог булырға тейеш, файл түгел!" + +#: ../fdroidserver/index.py +#, python-format +msgid "mirror '%s' does not end with 'fdroid'!" +msgstr "'%s' көҙгөһө 'fdroid' менән тамамланмай!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "mirrors set twice, in config.yml and {path}!" +msgstr "көҙгөләр ике тапҡыр күрһәтелгән, config.yml-да һәм {path}-та!" + +#: /usr/lib/python3.11/argparse.py +msgid "mutually exclusive arguments must be optional" +msgstr "бер-береһен инҡар итеүсе аргументтар өҫтәмә булырға тейеш" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "next {name} cache update due in {time}" +msgstr "киләһе {name} кешын яңыртыу {time} аша" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "no \"icon\" in {appid}" +msgstr "{appid}-та \"icon\" юҡ" + +#: ../fdroidserver/signatures.py +msgid "no APK supplied" +msgstr "APK бирелмәгән" + +#: ../fdroidserver/checkupdates.py +msgid "no version information found" +msgstr "версия тураһында мәғлүмәт табылманы" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "not allowed with argument %s" +msgstr "%s аргументы менән рөхсәт ителмәй" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "one of the arguments %s is required" +msgstr "%s аргументтарының береһе кәрәк" + +#: ../fdroidserver/common.py ../fdroidserver/index.py +msgid "only accepts strings, lists, and tuples" +msgstr "тик юлдарҙы, исемлектәрҙе һәм кортеждарҙы ғына ҡабул итә" + +#: /usr/lib/python3.11/argparse.py +msgid "options" +msgstr "опциялар" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "overwriting existing {path}" +msgstr "инде булған {path} өҫтөнән яҙыла" + +#: /usr/lib/python3.11/argparse.py +msgid "positional arguments" +msgstr "позицион аргументтар" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "process log deploy {path} to {dest} failed!" +msgstr "эшкәртеү логын {path} {dest} адресына урынлаштырыу уңышһыҙ булды!" + +#: ../fdroidserver/build.py +msgid "reference binary missing signature" +msgstr "өлгө бинарҙың имзаһы юҡ" + +#: ../fdroidserver/signatures.py +#, python-brace-format +msgid "refuse downloading via insecure HTTP connection (use HTTPS or specify --no-https-check): {apkfilename}" +msgstr "хәүефһеҙ булмаған HTTP тоташыуы аша йөкләүҙән баш тартыу (HTTPS ҡулланығыҙ йәки --no-https-check күрһәтегеҙ): {apkfilename}" + +#: ../fdroidserver/index.py +#, python-format +msgid "repo_icon \"repo/icons/%s\" does not exist, generating placeholder." +msgstr "\"repo/icons/%s\" repo_icon-ы юҡ, ҡалып булдырыла." + +#: ../fdroidserver/common.py +msgid "repo_url needs to end with /repo" +msgstr "repo_url /repo менән тамамланырға тейеш" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "rsync is missing or broken: {error}" +msgstr "rsync юҡ йәки боҙолған: {error}" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd sync indexes {path} to {url} and delete" +msgstr "s3cmd индекстарҙы {path}-тан {url}-ға синхронлаштыра һәм юя" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "s3cmd syncs indexes from {path} to {url} and deletes removed" +msgstr "s3cmd индекстарҙы {path}-тан {url}-ға синхронлаштыра һәм юйылғандарҙы юя" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "scanner cache is malformed! You can clear it with: '{clear}'" +msgstr "сканлаусы кешы боҙолған! Уны былай таҙартырға мөмкин: '{clear}'" + +#: ../fdroidserver/deploy.py +msgid "serverwebroot: path does not end with \"fdroid\", perhaps you meant one of these:" +msgstr "serverwebroot: юл \"fdroid\" менән тамамланмай, бәлки һеҙ быларҙың береһен күҙ уңында тоттоғоҙ:" + +#: ../fdroidserver/scanner.py +msgid "shared library" +msgstr "уртаҡ китапхана" + +#: /usr/lib/python3.11/argparse.py +msgid "show this help message and exit" +msgstr "был ярҙам хәбәрен күрһәтеү һәм сығыу" + +#: ../fdroidserver/signatures.py +msgid "signed APK, either a file-path or HTTPS URL." +msgstr "тамғаланған APK, файл юлы йәки HTTPS URL-ы." + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: log content is empty" +msgstr "тулы йыйыу логтарын урынлаштырыуҙы үткәреп ебәреү: лог эстәлеге буш" + +#: ../fdroidserver/common.py +msgid "skip deploying full build logs: not enabled in config" +msgstr "тулы йыйыу логтарын урынлаштырыуҙы үткәреп ебәреү: конфигурацияла ҡабыҙылмаған" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "skipping source tarball: {path}" +msgstr "сығанаҡ tarball үткәреп ебәрелә: {path}" + +#: ../fdroidserver/lint.py +msgid "srclibs missing name and/or @" +msgstr "srclibs-та исем һәм/йәки @ юҡ" + +#: ../fdroidserver/scanner.py +msgid "static library" +msgstr "статик китапхана" + +#: ../fdroidserver/build.py +#, python-brace-format +msgid "supplied reference binary has allowed signer {signer}" +msgstr "бирелгән өлгө бинарҙың рөхсәт ителгән имзалаусыһы {signer} бар" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "the following arguments are required: %s" +msgstr "түбәндәге аргументтар мотлаҡ: %s" + +#: ../fdroidserver/install.py +msgid "true" +msgstr "дөрөҫ" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unexpected option string: %s" +msgstr "көтөлмәгән опция юлы: %s" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unknown parser %(parser_name)r (choices: %(choices)s)" +msgstr "билдәһеҙ парсер %(parser_name)r (һайлау варианттары: %(choices)s)" + +#: /usr/lib/python3.11/argparse.py +#, python-format +msgid "unrecognized arguments: %s" +msgstr "танылмаған аргументтар: %s" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "unsafe permissions on '{config_file}' (should be 0600)!" +msgstr "'{config_file}' өсөн хәүефле рөхсәттәр (0600 булырға тейеш)!" + +#: ../fdroidserver/__main__.py /usr/lib/python3.11/argparse.py +msgid "usage: " +msgstr "ҡулланыу: " + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "using Apache libcloud to sync with {url}" +msgstr "{url} менән синхронлаштырыу өсөн Apache libcloud ҡулланыла" + +#: ../fdroidserver/deploy.py +msgid "virustotal.com is rate limiting, waiting to retry..." +msgstr "virustotal.com сикләү ҡуйҙы, ҡабатлап ҡарау өсөн көтөлә..." + +#: ../fdroidserver/install.py +msgid "yes" +msgstr "эйе" + +#: ../fdroidserver/publish.py +#, python-brace-format +msgid "{0} app, {1} key aliases" +msgid_plural "{0} apps, {1} key aliases" +msgstr[0] "{0} ҡушымта, {1} асҡыс псевдонимы" +msgstr[1] "{0} ҡушымта, {1} асҡыс псевдонимы" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename} ({appid}) has no metadata!" +msgstr "{apkfilename} ({appid}) өсөн мета-мәғлүмәт юҡ!" + +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{apkfilename}'s AndroidManifest.xml has a bad date: " +msgstr "{apkfilename}-ның AndroidManifest.xml-ында дөрөҫ булмаған дата: " + +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} does not have a name! Using application ID instead." +msgstr "{appid} өсөн исем юҡ! Уның урынына ҡушымта идентификаторы ҡулланыла." + +#. Translators: https://developer.android.com/build/configure-app-module#set-application-id +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Android application ID!" +msgstr "{path} эсендәге {appid} — дөрөҫ Android ҡушымта идентификаторы түгел!" + +#: ../fdroidserver/metadata.py ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} from {path} is not a valid Java Package Name!" +msgstr "{path} эсендәге {appid} — дөрөҫ Java пакет исеме түгел!" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{appid} has both APKs and files: {files}" +msgstr "{appid}-та APK-лар ҙа, файлдар ҙа бар: {files}" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{appid} is missing {name}" +msgstr "{appid}-та {name} юҡ" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: Unknown extlib {path} in build '{versionName}'" +msgstr "{appid}: '{versionName}' йыйылмаһында билдәһеҙ extlib {path}" + +#: ../fdroidserver/scanner.py +#, python-brace-format +msgid "{appid}: no builds specified, running on current source state" +msgstr "{appid}: йыйылмалар күрһәтелмәгән, ағымдағы сығанаҡ хәлендә эшләтелә" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}!'" +msgstr "{appid}: {field} '{type}' булырға тейеш, ләкин ул '{fieldtype}'!" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{appid}: {field} must be a '{type}', but it is a '{fieldtype}'!" +msgstr "{appid}: {field} '{type}' булырға тейеш, ләкин ул '{fieldtype}'!" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be an integer, found: {value}" +msgstr "{build_flag} бөтөн һан булырға тейеш, табылды: {value}" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{build_flag} must be list or string, found: {value}" +msgstr "{build_flag} исемлек йәки юл булырға тейеш, табылды: {value}" + +#: ../fdroidserver/metadata.py +#, python-brace-format +msgid "{file} is blank or corrupt!" +msgstr "{file} буш йәки боҙолған!" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{name} \"{section}/icons/{path}\" does not exist! Check \"config.yml\"." +msgstr "{name} \"{section}/icons/{path}\" юҡ! \"config.yml\"-ды тикшерегеҙ." + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path1} is a duplicate of {path2}, remove one!" +msgstr "{path1} — {path2}-нең күсермәһе, береһен юйығыҙ!" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "{path} already exists, ignoring import results!" +msgstr "{path} инде бар, импорт һөҙөмтәләре иғтибарһыҙ ҡалдырыла!" + +#: ../fdroidserver/nightly.py +#, python-brace-format +msgid "{path} does not exist! Create it by running:" +msgstr "{path} юҡ! Уны булдырыу өсөн эшләтегеҙ:" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} has bad file signature \"{pattern}\", possible Janus exploit!" +msgstr "{path} файлының имзаһы дөрөҫ түгел \"{pattern}\", Janus эксплойты булыуы мөмкин!" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} has been flagged by virustotal {count} times:" +msgstr "{path} virustotal тарафынан {count} тапҡыр билдәләнгән:" + +#: ../fdroidserver/install.py +#, python-brace-format +msgid "{path} has the wrong fingerprint ({fingerprint})!" +msgstr "{path} файлының бармаҡ эҙе дөрөҫ түгел ({fingerprint})!" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not \"key: value\" dict, but a {datatype}!" +msgstr "{path} — \"key: value\" һүҙлеге түгел, ә {datatype}!" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not a standard config file!" +msgstr "{path} — стандарт конфигурация файлы түгел!" + +#: ../fdroidserver/index.py +#, python-brace-format +msgid "{path} is not list, but a {datatype}!" +msgstr "{path} — исемлек түгел, ә {datatype}!" + +#: ../fdroidserver/common.py +#, python-brace-format +msgid "{path} is not {expected_type}, but a {datatype}!" +msgstr "{path} — {expected_type} түгел, ә {datatype}!" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path} is zero size!" +msgstr "{path} үлсәме нуль!" + +#: ../fdroidserver/deploy.py +#, python-brace-format +msgid "{path} more than 200MB, manually upload: {url}" +msgstr "{path} 200MB-тан ҙурыраҡ, ҡулдан йөкләү: {url}" + +#: ../fdroidserver/lint.py +#, python-brace-format +msgid "{path}: \"{code}\" is not a valid ISO_3166-1 alpha-2 country code!" +msgstr "{path}: \"{code}\" — дөрөҫ ISO_3166-1 alpha-2 ил коды түгел!" + +#: ../fdroidserver/update.py +#, python-brace-format +msgid "{path}: {error}" +msgstr "{path}: {error}" + +#: ../fdroidserver/mirror.py +#, python-brace-format +msgid "{url} does not end with \"fdroid\", check the URL path!" +msgstr "{url} \"fdroid\" менән тамамланмай, URL юлын тикшерегеҙ!" + +#: ../fdroidserver/import_subcommand.py +#, python-brace-format +msgid "{url} does not start with \"http\"!" +msgstr "{url} \"http\" менән башланмай!" + +#: ../fdroidserver/build.py +msgid "{} build failed" +msgid_plural "{} builds failed" +msgstr[0] "{} йыйыу уңышһыҙ булды" +msgstr[1] "{} йыйыу уңышһыҙ булды" + +#: ../fdroidserver/build.py +msgid "{} build succeeded" +msgid_plural "{} builds succeeded" +msgstr[0] "{} йыйыу уңышлы булды" +msgstr[1] "{} йыйыу уңышлы булды" From dcb804f70dd02360125ed5103b10e2fa2084e99f Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 25 Jun 2025 09:50:54 +0200 Subject: [PATCH 2086/2116] enable Bashkir (ba) as supported locale, its at 100% --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index 0a24f98b..77c176d4 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -20,6 +20,7 @@ include examples/template.yml include examples/Vagrantfile.yaml include gradlew-fdroid include LICENSE +include locale/ba/LC_MESSAGES/fdroidserver.po include locale/bo/LC_MESSAGES/fdroidserver.po include locale/ca/LC_MESSAGES/fdroidserver.po include locale/cs/LC_MESSAGES/fdroidserver.po From d5d65cfabd8e3d6b35d7a9a1e4c2c96eaf558e6e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 25 Jun 2025 09:53:58 +0200 Subject: [PATCH 2087/2116] make -C locale update --- locale/az/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/ba/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/be/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/bg/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/bn/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/bo/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/ca/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/cs/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/cy/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/de/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/el/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/es/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/es_AR/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/es_MX/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/eu/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/fa/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/fdroidserver.pot | 18 ++++++++++++++++-- locale/fi/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/fr/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/fy/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/ga/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/hi/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/hu/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/it/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/ja/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/kab/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/ko/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/ml/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/nb_NO/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/nl/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/nn/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/pa/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/pl/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/pt/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/pt_BR/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/pt_PT/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/ro/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/ru/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/sk/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/sq/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/sr/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/sv/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/sw/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/ta/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/tr/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/tzm/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/ug/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/uk/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/zh_Hans/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- locale/zh_Hant/LC_MESSAGES/fdroidserver.po | 16 +++++++++++++++- 50 files changed, 751 insertions(+), 51 deletions(-) diff --git a/locale/az/LC_MESSAGES/fdroidserver.po b/locale/az/LC_MESSAGES/fdroidserver.po index 6bc37559..48050f95 100644 --- a/locale/az/LC_MESSAGES/fdroidserver.po +++ b/locale/az/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2023-05-26 19:39+0000\n" "Last-Translator: Mehrab Poladov \n" "Language-Team: Azerbaijani \n" @@ -353,6 +353,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1478,6 +1483,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1991,6 +2001,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "" diff --git a/locale/ba/LC_MESSAGES/fdroidserver.po b/locale/ba/LC_MESSAGES/fdroidserver.po index 8390af28..9804a4f7 100644 --- a/locale/ba/LC_MESSAGES/fdroidserver.po +++ b/locale/ba/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.4.0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2025-06-22 06:50+0000\n" "Last-Translator: Zulfar \n" "Language-Team: Bashkir \n" @@ -357,6 +357,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Сканлау ваҡытындағы {} хата арҡаһында йыйып булмай" msgstr[1] "Сканлау ваҡытындағы {} хата арҡаһында йыйып булмай" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "{path} уҡылманы: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1484,6 +1489,11 @@ msgstr "\"{path} юйыла" msgid "Rename APK files that do not match package.name_123.apk" msgstr "package.name_123.apk ҡалыбына тап килмәгән APK файлдарының исемен үҙгәртеү" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2004,6 +2014,10 @@ msgstr "{path} пакеты apksigner менән тикшерелә." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "VirusTotal API асҡысы 32MB-тан ҙурыраҡ файлдарҙы йөкләй алмай, {path} файлын йөкләү өсөн {url} ҡулланығыҙ." +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Мөмкин булған мета-мәғлүмәт хаталары тураһында иҫкәртеү" diff --git a/locale/be/LC_MESSAGES/fdroidserver.po b/locale/be/LC_MESSAGES/fdroidserver.po index bab918a4..9526f6ea 100644 --- a/locale/be/LC_MESSAGES/fdroidserver.po +++ b/locale/be/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.2.1-143-g1a5ee449\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2024-01-21 00:08+0000\n" "Last-Translator: flac \n" "Language-Team: Belarusian \n" @@ -358,6 +358,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1483,6 +1488,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Перайменуйце файлы APK, якія не адпавядаюць package.name_123.apk" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1996,6 +2006,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Папярэджваць аб магчымых памылках метададзеных" diff --git a/locale/bg/LC_MESSAGES/fdroidserver.po b/locale/bg/LC_MESSAGES/fdroidserver.po index bc6bff77..bbcbc06a 100644 --- a/locale/bg/LC_MESSAGES/fdroidserver.po +++ b/locale/bg/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2024-07-19 10:21+0000\n" "Last-Translator: 109247019824 \n" "Language-Team: Bulgarian \n" @@ -354,6 +354,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1479,6 +1484,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1992,6 +2002,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "" diff --git a/locale/bn/LC_MESSAGES/fdroidserver.po b/locale/bn/LC_MESSAGES/fdroidserver.po index fa057130..44e14abf 100644 --- a/locale/bn/LC_MESSAGES/fdroidserver.po +++ b/locale/bn/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2021-02-12 09:48+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali \n" @@ -353,6 +353,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1478,6 +1483,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1991,6 +2001,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "" diff --git a/locale/bo/LC_MESSAGES/fdroidserver.po b/locale/bo/LC_MESSAGES/fdroidserver.po index 3f892a0e..cbd1c63c 100644 --- a/locale/bo/LC_MESSAGES/fdroidserver.po +++ b/locale/bo/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tibetan \n" @@ -358,6 +358,11 @@ msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "ཚགས་རྒྱབ་པའི་སྐབས་སུ་ནོར་སྐྱོན་ {} ཤོར་བས་བཟོ་སྐྲུན་བྱེད་ཐུབ་མེད།" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "ཀློག་མི་ཐུབ།{path}: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1499,6 +1504,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "package.name_123.apk དང་མི་འདྲ་བའི་APK ཡིག་ཆ་དེ་ཚོར་མིང་སྐྱར་ཏུ་བཏགས།" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, fuzzy, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2015,6 +2025,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "ཡིག་ཚགས་ཀྱི་རྒྱབ་ལྗོངས་ལོ་རྒྱུས་སྐྱོན་སྲིད་པ་རྣམས་པ་ཉེན་བརྡ་གཏོང་།" diff --git a/locale/ca/LC_MESSAGES/fdroidserver.po b/locale/ca/LC_MESSAGES/fdroidserver.po index 4a12ad45..48cea1fc 100644 --- a/locale/ca/LC_MESSAGES/fdroidserver.po +++ b/locale/ca/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2025-05-16 16:36+0000\n" "Last-Translator: Ecron \n" "Language-Team: Catalan \n" @@ -363,6 +363,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "No es pot construir a causa d'un error {} en escanejar" msgstr[1] "No es pot construir a causa d'errors {} en escanejar" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "No s'ha pogut llegir {path}: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1490,6 +1495,11 @@ msgstr "S'està suprimint {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Canvia el nom dels fitxers APK que no coincideixin amb package.name_123.apk" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2010,6 +2020,10 @@ msgstr "S'està verificant el paquet {path} l'apksigner." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "La clau de l'API VirusTotal no pot pujar fitxers més grans de 32 MB, utilitzeu {url} per pujar {path}." +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Avisa de possibles errors a les metadades" diff --git a/locale/cs/LC_MESSAGES/fdroidserver.po b/locale/cs/LC_MESSAGES/fdroidserver.po index 4fc63dea..351d8885 100644 --- a/locale/cs/LC_MESSAGES/fdroidserver.po +++ b/locale/cs/LC_MESSAGES/fdroidserver.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2025-03-26 10:00+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" @@ -366,6 +366,11 @@ msgstr[0] "Nelze sestavit kvůli {} chybě při skenování" msgstr[1] "Nelze sestavit kvůli {} chybám při skenování" msgstr[2] "Nelze sestavit kvůli {} chybám při skenování" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "Chyba při čtení {path}: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1493,6 +1498,11 @@ msgstr "Odebírání {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Přejmenovat soubory APK, které se neshodují s package.name_123.apk" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2014,6 +2024,10 @@ msgstr "Ověřování balíčku {path} pomocí apksigner." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "Klíč API VirusTotal neumožňuje nahrávání souborů větších než 32 MB, k nahrání {path} použijte {url}." +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Varovat ohledně možných chyb metadat" diff --git a/locale/cy/LC_MESSAGES/fdroidserver.po b/locale/cy/LC_MESSAGES/fdroidserver.po index 37648a7b..8451062c 100644 --- a/locale/cy/LC_MESSAGES/fdroidserver.po +++ b/locale/cy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2021-01-16 21:23+0000\n" "Last-Translator: Aled Powell \n" "Language-Team: Welsh \n" @@ -357,6 +357,11 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1482,6 +1487,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Ailenwi ffeiliau APK na sy'n dilyn y ffurf package.name_123.apk" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2006,6 +2016,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Rhybuddio am wallau metaddata posib" diff --git a/locale/de/LC_MESSAGES/fdroidserver.po b/locale/de/LC_MESSAGES/fdroidserver.po index 201eac5c..5dde0e8f 100644 --- a/locale/de/LC_MESSAGES/fdroidserver.po +++ b/locale/de/LC_MESSAGES/fdroidserver.po @@ -26,7 +26,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2025-04-29 10:16+0000\n" "Last-Translator: VfBFan \n" "Language-Team: German \n" @@ -378,6 +378,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Kann nicht erstellt werden, da {} Fehler beim Prüfen aufgetreten ist" msgstr[1] "Kann nicht erstellt werden, da {} Fehler beim Prüfen aufgetreten sind" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "Lesen von {path} fehlgeschlagen: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1505,6 +1510,11 @@ msgstr "Entferne {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "APK-Dateien umbenennen, die nicht dem Muster „package.name_123.apk“ entsprechen" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2025,6 +2035,10 @@ msgstr "Überprüfen des Pakets {path} mit apksigner." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "VirusTotal-API-Schlüssel kann nicht Dateien größer 32MB hochladen, verwende {url} um {path} hochzuladen." +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Vor möglichen Metadaten-Fehlern warnen" diff --git a/locale/el/LC_MESSAGES/fdroidserver.po b/locale/el/LC_MESSAGES/fdroidserver.po index 13380be3..5bd92c4a 100644 --- a/locale/el/LC_MESSAGES/fdroidserver.po +++ b/locale/el/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2024-05-10 13:24+0000\n" "Last-Translator: ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ \n" "Language-Team: Greek \n" @@ -360,6 +360,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1485,6 +1490,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Μετονομασία αρχείων APK που δεν αντιστοιχούν με «όνομα.πακέτου_123.apk»" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1998,6 +2008,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Προειδοποίηση για πιθανά σφάλματα μετα-δεδομένων" diff --git a/locale/es/LC_MESSAGES/fdroidserver.po b/locale/es/LC_MESSAGES/fdroidserver.po index 07ac3ea5..64a43a1c 100644 --- a/locale/es/LC_MESSAGES/fdroidserver.po +++ b/locale/es/LC_MESSAGES/fdroidserver.po @@ -19,7 +19,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2025-06-24 11:02+0000\n" "Last-Translator: Swyter \n" "Language-Team: Spanish \n" @@ -371,6 +371,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "No se puede construir debido al error {} mientras se comprobaba" msgstr[1] "No se puede construir debido a los errores {} mientras se comprobaba" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "Fallo al leer {path}: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1498,6 +1503,11 @@ msgstr "Eliminando {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Cambiar el nombre de archivos APK que no coinciden con el formato package.name_123.apk" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2018,6 +2028,10 @@ msgstr "Verificando el paquete {path} con apksigner." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "La clave de API de VirusTotal no puede subir archivos mayores de 32MB. Use {url} para subir {path}." +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Alertar sobre posibles errores de metadatos" diff --git a/locale/es_AR/LC_MESSAGES/fdroidserver.po b/locale/es_AR/LC_MESSAGES/fdroidserver.po index f6e544a1..a15ddd81 100644 --- a/locale/es_AR/LC_MESSAGES/fdroidserver.po +++ b/locale/es_AR/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2021-04-10 21:26+0000\n" "Last-Translator: Germe the fur star \n" "Language-Team: Spanish (Argentina) \n" @@ -361,6 +361,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "No se pudo empaquetar debido al {} error mientras se escaneaba" msgstr[1] "No se pudo empaquetar debido a los {} errores mientras se escaneaba" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "No se puede reescribir \"{path}\"" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1495,6 +1500,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Renombrar archivos APK que no corresponden a package.name_123.apk" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2008,6 +2018,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Advertir sobre posibles errores en los metadatos" diff --git a/locale/es_MX/LC_MESSAGES/fdroidserver.po b/locale/es_MX/LC_MESSAGES/fdroidserver.po index 344bf130..aaddd007 100644 --- a/locale/es_MX/LC_MESSAGES/fdroidserver.po +++ b/locale/es_MX/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2020-04-29 12:49+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Spanish (Mexico) \n" @@ -354,6 +354,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1483,6 +1488,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1996,6 +2006,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "" diff --git a/locale/eu/LC_MESSAGES/fdroidserver.po b/locale/eu/LC_MESSAGES/fdroidserver.po index 8d6c69b4..4cb555c2 100644 --- a/locale/eu/LC_MESSAGES/fdroidserver.po +++ b/locale/eu/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -352,6 +352,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1477,6 +1482,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1990,6 +2000,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "" diff --git a/locale/fa/LC_MESSAGES/fdroidserver.po b/locale/fa/LC_MESSAGES/fdroidserver.po index d8aad95a..ff34a457 100644 --- a/locale/fa/LC_MESSAGES/fdroidserver.po +++ b/locale/fa/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2024-11-26 15:16+0000\n" "Last-Translator: Danial Behzadi \n" "Language-Team: Persian \n" @@ -356,6 +356,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "{path}: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1481,6 +1486,11 @@ msgstr "برداشتن {path}" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1994,6 +2004,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "" diff --git a/locale/fdroidserver.pot b/locale/fdroidserver.pot index 0f9e9b28..486f290d 100644 --- a/locale/fdroidserver.pot +++ b/locale/fdroidserver.pot @@ -5,9 +5,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: fdroidserver 2.4.0\n" +"Project-Id-Version: fdroidserver 2.4.2-3-gdcb804f7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -354,6 +354,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1479,6 +1484,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1992,6 +2002,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "" diff --git a/locale/fi/LC_MESSAGES/fdroidserver.po b/locale/fi/LC_MESSAGES/fdroidserver.po index 065b07d8..31803e83 100644 --- a/locale/fi/LC_MESSAGES/fdroidserver.po +++ b/locale/fi/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a0-62-gc63c4b3d\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2025-01-31 14:19+0000\n" "Last-Translator: Ricky Tigg \n" "Language-Team: Finnish \n" @@ -355,6 +355,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1480,6 +1485,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1993,6 +2003,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "" diff --git a/locale/fr/LC_MESSAGES/fdroidserver.po b/locale/fr/LC_MESSAGES/fdroidserver.po index 61cd9215..d65abe95 100644 --- a/locale/fr/LC_MESSAGES/fdroidserver.po +++ b/locale/fr/LC_MESSAGES/fdroidserver.po @@ -47,7 +47,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2025-04-11 17:20+0000\n" "Last-Translator: Laurent FAVOLE \n" "Language-Team: French \n" @@ -399,6 +399,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Build impossible à cause de l'erreur lors de l'analyse" msgstr[1] "Build impossible à cause des {} erreurs lors de l'analyse" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "Erreur de lecture {path} : {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1526,6 +1531,11 @@ msgstr "Suppression de {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Renomme les fichiers APK dont le nom ne ressemble pas à nom.paquet_123.apk" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2048,6 +2058,10 @@ msgstr "Vérification du paquet {path} avec apksigner." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "L’API de VirusTotal ne permet pas d’envoyer des fichiers plus grands que 32Mo, utilisez {url} pour envoyer {path}." +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Avertir de possibles erreurs dans les métadonnées" diff --git a/locale/fy/LC_MESSAGES/fdroidserver.po b/locale/fy/LC_MESSAGES/fdroidserver.po index 677eea67..1f751485 100644 --- a/locale/fy/LC_MESSAGES/fdroidserver.po +++ b/locale/fy/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2021-07-01 15:29+0000\n" "Last-Translator: Vancha March \n" "Language-Team: Frisian \n" @@ -353,6 +353,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1478,6 +1483,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1991,6 +2001,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "" diff --git a/locale/ga/LC_MESSAGES/fdroidserver.po b/locale/ga/LC_MESSAGES/fdroidserver.po index a0c708cc..b9916f78 100644 --- a/locale/ga/LC_MESSAGES/fdroidserver.po +++ b/locale/ga/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1-162-gfbb3cc59\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2025-03-27 19:35+0000\n" "Last-Translator: Aindriú Mac Giolla Eoin \n" "Language-Team: Irish \n" @@ -360,6 +360,11 @@ msgstr[2] "Ní féidir tógáil de bharr {} earráidí agus an scanadh" msgstr[3] "Ní féidir tógáil de bharr {} earráidí agus an scanadh" msgstr[4] "Ní féidir tógáil de bharr {} earráidí agus an scanadh" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "Theip ar léamh {path}: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1487,6 +1492,11 @@ msgstr "Ag baint {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Athainmnigh comhaid APK nach bhfuil comhoiriúnach package.name_123.apk" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2010,6 +2020,10 @@ msgstr "Pacáiste {path} á fhíorú le apksigner." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "Ní féidir le heochair API VirusTotal comhaid níos mó ná 32MB a uaslódáil, úsáid {url} chun {path} a uaslódáil." +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Tabhair rabhadh faoi earráidí meiteashonraí a d'fhéadfadh a bheith ann" diff --git a/locale/hi/LC_MESSAGES/fdroidserver.po b/locale/hi/LC_MESSAGES/fdroidserver.po index 11e53f7d..58779021 100644 --- a/locale/hi/LC_MESSAGES/fdroidserver.po +++ b/locale/hi/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2023-02-22 11:24+0000\n" "Last-Translator: Saurmandal \n" "Language-Team: Hindi \n" @@ -354,6 +354,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1479,6 +1484,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1992,6 +2002,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "" diff --git a/locale/hu/LC_MESSAGES/fdroidserver.po b/locale/hu/LC_MESSAGES/fdroidserver.po index a9d51973..6e232ead 100644 --- a/locale/hu/LC_MESSAGES/fdroidserver.po +++ b/locale/hu/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2024-04-10 13:33+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Hungarian \n" @@ -359,6 +359,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Nem lehet összeállítani, mert {} hiba történt az átvizsgáláskor" msgstr[1] "Nem lehet összeállítani, mert {} hiba történt az átvizsgáláskor" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "A(z) {path} olvasása sikertelen: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1494,6 +1499,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Azon APK fájlok átnevezése, melyek nem illeszkednek a csomag.név_123.apk mintára" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2011,6 +2021,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Figyelmeztetés a lehetséges metaadat-hibákról" diff --git a/locale/it/LC_MESSAGES/fdroidserver.po b/locale/it/LC_MESSAGES/fdroidserver.po index a20dfa82..5117e2d4 100644 --- a/locale/it/LC_MESSAGES/fdroidserver.po +++ b/locale/it/LC_MESSAGES/fdroidserver.po @@ -22,7 +22,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2025-03-20 16:21+0000\n" "Last-Translator: Champ0999 \n" "Language-Team: Italian \n" @@ -375,6 +375,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Impossibile costruire a causa di un errore con {} durante la scansione" msgstr[1] "Impossibile costruire a causa di errori con {} durante la scansione" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "Impossibile leggere {path}: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1504,6 +1509,11 @@ msgstr "Rimozione di {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Rinomina i file APK che non corrispondono a package.name_123.apk" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2028,6 +2038,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "La chiave API di VirusTotal non può caricare file più grandi di 32MB, usa {url} per caricare {path}." +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Avvisa riguardo possibili errori nei metadati" diff --git a/locale/ja/LC_MESSAGES/fdroidserver.po b/locale/ja/LC_MESSAGES/fdroidserver.po index be68cfc4..50dd832d 100644 --- a/locale/ja/LC_MESSAGES/fdroidserver.po +++ b/locale/ja/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-224-g4b0ade7\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2025-04-30 04:07+0000\n" "Last-Translator: Liner Seven \n" "Language-Team: Japanese \n" @@ -359,6 +359,11 @@ msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "スキャン時に{}個のエラーが発生したためビルドできません" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "{path}を読み込めませんでした:{error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1486,6 +1491,11 @@ msgstr "{path} を削除" msgid "Rename APK files that do not match package.name_123.apk" msgstr "package.name_123.apkに合致しないAPKファイルの名前を変更" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2005,6 +2015,10 @@ msgstr "apksignerを使用してパッケージ{path}を検証しています。 msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "VirusTotalのAPI鍵は32メガバイトより大きいファイルをアップロードできません。{url}から{path}をアップロードしてください。" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "潜在的なメタデータのエラーに関して警告" diff --git a/locale/kab/LC_MESSAGES/fdroidserver.po b/locale/kab/LC_MESSAGES/fdroidserver.po index 9cc66432..121b58f0 100644 --- a/locale/kab/LC_MESSAGES/fdroidserver.po +++ b/locale/kab/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2021-01-15 13:25+0000\n" "Last-Translator: R_SACI \n" "Language-Team: Kabyle \n" @@ -355,6 +355,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1482,6 +1487,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1995,6 +2005,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "" diff --git a/locale/ko/LC_MESSAGES/fdroidserver.po b/locale/ko/LC_MESSAGES/fdroidserver.po index 66244698..cb546be1 100644 --- a/locale/ko/LC_MESSAGES/fdroidserver.po +++ b/locale/ko/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-135-g16dd6d28\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2024-09-06 14:57+0000\n" "Last-Translator: Cxnfl1ct \n" "Language-Team: Korean \n" @@ -358,6 +358,11 @@ msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1485,6 +1490,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "package.name_123.apk와 일치하지 않는 APK 파일의 이름을 바꿉니다" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1997,6 +2007,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "가능한 메타데이터 오류에 대해 경고합니다" diff --git a/locale/ml/LC_MESSAGES/fdroidserver.po b/locale/ml/LC_MESSAGES/fdroidserver.po index 39b7a730..1a4cc764 100644 --- a/locale/ml/LC_MESSAGES/fdroidserver.po +++ b/locale/ml/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-70-g54bc858\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2023-06-23 14:52+0000\n" "Last-Translator: abe1242 \n" "Language-Team: Malayalam \n" @@ -358,6 +358,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1483,6 +1488,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1999,6 +2009,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "" diff --git a/locale/nb_NO/LC_MESSAGES/fdroidserver.po b/locale/nb_NO/LC_MESSAGES/fdroidserver.po index 26cf9e7f..8ba73029 100644 --- a/locale/nb_NO/LC_MESSAGES/fdroidserver.po +++ b/locale/nb_NO/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.8-74-ga380b9f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2022-09-06 14:30+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Norwegian Bokmål \n" @@ -366,6 +366,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Kan ikke bygge som følge av {} feil under skanning" msgstr[1] "Kan ikke bygge som følge av {} feiler under skanning" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "Klarte ikke å lese {path}: {error}" + #: ../fdroidserver/rewritemeta.py #, fuzzy, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1537,6 +1542,11 @@ msgstr "Fjerner {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Gi nytt navn til APK-filer som ikke samsvarer med package.name_123.apk" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2070,6 +2080,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "VirusTotal API-nøkkel kan ikke laste opp filer større enn 32 MB, bruk {url} for å laste opp {path}." +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Advar om mulige metadata-feil" diff --git a/locale/nl/LC_MESSAGES/fdroidserver.po b/locale/nl/LC_MESSAGES/fdroidserver.po index aa9106fb..f5dbfba0 100644 --- a/locale/nl/LC_MESSAGES/fdroidserver.po +++ b/locale/nl/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2024-01-03 09:07+0000\n" "Last-Translator: Issa1553 \n" "Language-Team: Dutch \n" @@ -361,6 +361,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1486,6 +1491,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Hernoem APK-bestanden die niet overeenkomen met pakket.naam_123.apk" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1999,6 +2009,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Waarschuwen voor mogelijke metadata fouten" diff --git a/locale/nn/LC_MESSAGES/fdroidserver.po b/locale/nn/LC_MESSAGES/fdroidserver.po index 180c114d..5db8fd94 100644 --- a/locale/nn/LC_MESSAGES/fdroidserver.po +++ b/locale/nn/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3.0-3-g4ba7b5c9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2024-11-26 10:54+0000\n" "Last-Translator: Bård Sigurd Møller \n" "Language-Team: Norwegian Nynorsk \n" @@ -353,6 +353,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1478,6 +1483,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1991,6 +2001,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "" diff --git a/locale/pa/LC_MESSAGES/fdroidserver.po b/locale/pa/LC_MESSAGES/fdroidserver.po index b08867aa..8c64a1c2 100644 --- a/locale/pa/LC_MESSAGES/fdroidserver.po +++ b/locale/pa/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3.3\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -352,6 +352,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1477,6 +1482,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1990,6 +2000,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "" diff --git a/locale/pl/LC_MESSAGES/fdroidserver.po b/locale/pl/LC_MESSAGES/fdroidserver.po index 7b417234..03bbc39f 100644 --- a/locale/pl/LC_MESSAGES/fdroidserver.po +++ b/locale/pl/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2025-06-24 12:05+0000\n" "Last-Translator: WaldiS \n" "Language-Team: Polish \n" @@ -363,6 +363,11 @@ msgstr[0] "Nie można zbudować z powodu błędu {} podczas skanowania" msgstr[1] "Nie można zbudować z powodu błędów {} podczas skanowania" msgstr[2] "Nie można zbudować z powodu błędów {} podczas skanowania" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "Błąd odczytu {path}: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1490,6 +1495,11 @@ msgstr "Usuwanie „{path}”" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Zmień nazwy plików APK, które nie pasują do pliku package.name_123.apk" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2011,6 +2021,10 @@ msgstr "Weryfikacja pakietu {path} za pomocą apksigner." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "Klucz VirusTotal API nie może przesyłać plików większych niż 32 MB, użyj {url}, aby przesłać {path}." +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Ostrzegaj o możliwych błędach metadanych" diff --git a/locale/pt/LC_MESSAGES/fdroidserver.po b/locale/pt/LC_MESSAGES/fdroidserver.po index 780bebdf..84ee4ed9 100644 --- a/locale/pt/LC_MESSAGES/fdroidserver.po +++ b/locale/pt/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-680-ge1d3de71\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2025-04-06 16:45+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" @@ -361,6 +361,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Não é possível construir devido a erro {} durante a digitalização" msgstr[1] "Não é possível construir devido a erros {} durante a digitalização" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "Falha de leitura {path}: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1488,6 +1493,11 @@ msgstr "A remover {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Renomear todos os ficheiros APKs que não correspondem com package.name_123.apk" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2008,6 +2018,10 @@ msgstr "A verificar o pacote {path} com apksigner." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "A chave VirusTotal API não pode enviar ficheiros maiores que 32MB, use {url} para enviar {path}." +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Avisar sobre possíveis erros de metadados" diff --git a/locale/pt_BR/LC_MESSAGES/fdroidserver.po b/locale/pt_BR/LC_MESSAGES/fdroidserver.po index 53b8a080..ea2ad833 100644 --- a/locale/pt_BR/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_BR/LC_MESSAGES/fdroidserver.po @@ -19,7 +19,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2025-03-26 10:00+0000\n" "Last-Translator: Igor Rückert \n" "Language-Team: Portuguese (Brazil) \n" @@ -371,6 +371,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Não é possível criar devido a {} erro durante a digitalização" msgstr[1] "Não é possível criar devido a {} erros durante a digitalização" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "Falha ao ler {path}: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1498,6 +1503,11 @@ msgstr "Removendo {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Renomeia arquivos APK que não correspondem a pacote.nome_123.apk" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2018,6 +2028,10 @@ msgstr "Verificando o pacote {path} com apksigner." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "A chave API do VirusTotal não pode carregar arquivos maiores que 32MB, utilize {url} para enviar para {path}." +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Avisa sobre possíveis erros de metadados" diff --git a/locale/pt_PT/LC_MESSAGES/fdroidserver.po b/locale/pt_PT/LC_MESSAGES/fdroidserver.po index 1fac5cd5..e9f15dfa 100644 --- a/locale/pt_PT/LC_MESSAGES/fdroidserver.po +++ b/locale/pt_PT/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2025-05-30 07:19+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" @@ -363,6 +363,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Não é possível construir devido a erro {} durante a digitalização" msgstr[1] "Não é possível construir devido a erros {} durante a digitalização" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "Falha de leitura {path}: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1490,6 +1495,11 @@ msgstr "A remover {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Renomear todos os ficheiros APKs que não correspondem com package.name_123.apk" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2010,6 +2020,10 @@ msgstr "A verificar o pacote {path} com apksigner." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "A chave VirusTotal API não pode enviar ficheiros maiores que 32MB, use {url} para enviar {path}." +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Avisar sobre possíveis erros de metadados" diff --git a/locale/ro/LC_MESSAGES/fdroidserver.po b/locale/ro/LC_MESSAGES/fdroidserver.po index 4293395d..0599ee8c 100644 --- a/locale/ro/LC_MESSAGES/fdroidserver.po +++ b/locale/ro/LC_MESSAGES/fdroidserver.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.0a5-27-gf24eae0f\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2024-12-02 17:00+0000\n" "Last-Translator: Licaon Kter \n" "Language-Team: Romanian \n" @@ -362,6 +362,11 @@ msgstr[0] "Nu se poate construi din cauza unei erori {} în timpul scanării" msgstr[1] "Nu se poate construi din cauza erorilor {} în timpul scanării" msgstr[2] "Nu se poate construi din cauza erorilor {} în timpul scanării" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "A eșuat citirea {path}: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1489,6 +1494,11 @@ msgstr "Eliminarea lui {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Redenumiți fișierele APK care nu se potrivesc cu package.name_123.apk" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2011,6 +2021,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "VirusTotal API key nu poate încărca fișiere mai mari de 32MB, utilizați {url} pentru a încărca {path}." +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Avertizează cu privire la posibile erori de metadate" diff --git a/locale/ru/LC_MESSAGES/fdroidserver.po b/locale/ru/LC_MESSAGES/fdroidserver.po index e8222af3..bd4aa6f5 100644 --- a/locale/ru/LC_MESSAGES/fdroidserver.po +++ b/locale/ru/LC_MESSAGES/fdroidserver.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2025-06-24 10:15+0000\n" "Last-Translator: Artyom Rybakov \n" "Language-Team: Russian \n" @@ -374,6 +374,11 @@ msgstr[0] "Запустить сборку невозможно из-за {} о msgstr[1] "Запустить сборку невозможно из-за {} ошибок во время сканирования данных" msgstr[2] "Запустить сборку невозможно из-за {} ошибок во время сканирования данных" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "Не удалось распознать {path}: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1501,6 +1506,11 @@ msgstr "Удаление {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Переименовать все APK файлы, не соответствующие шаблону \"название.пакета_123.apk\"" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2022,6 +2032,10 @@ msgstr "Проверка пакета {path} с помощью apksigner." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "Через API VirusTotal нельзя загрузить файлы больше 32MB, загрузите {path} на {url} самостоятельно." +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Предупреждать о возможных ошибках в метаданных" diff --git a/locale/sk/LC_MESSAGES/fdroidserver.po b/locale/sk/LC_MESSAGES/fdroidserver.po index a4dd859f..f3f21800 100644 --- a/locale/sk/LC_MESSAGES/fdroidserver.po +++ b/locale/sk/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -353,6 +353,11 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1478,6 +1483,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1992,6 +2002,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "" diff --git a/locale/sq/LC_MESSAGES/fdroidserver.po b/locale/sq/LC_MESSAGES/fdroidserver.po index 709bf334..efa0401b 100644 --- a/locale/sq/LC_MESSAGES/fdroidserver.po +++ b/locale/sq/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.6-349-g907c04ea\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2025-03-26 21:33+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" @@ -358,6 +358,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "S’montohet dot, për shkak të {} gabimi teksa skanohej" msgstr[1] "S’montohet dot, për shkak të {} gabimeve teksa skanohej" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "S’u arrit të lexohej {path}: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1485,6 +1490,11 @@ msgstr "Po hiqet {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Riemërtoni kartelat APK që nuk përputhen me package.name_123.apk" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2006,6 +2016,10 @@ msgstr "Po verifikohet paketë {path} me apksigner." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "Kyçi API VirusTotal s’mund të ngarkojë kartela më të mëdha se 2MB, përdorni {url} që të ngarkoni {path}." +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Sinjalizo rreth gabimesh të mundshëm tejtëdhënash" diff --git a/locale/sr/LC_MESSAGES/fdroidserver.po b/locale/sr/LC_MESSAGES/fdroidserver.po index b07f0c4e..5413ac1d 100644 --- a/locale/sr/LC_MESSAGES/fdroidserver.po +++ b/locale/sr/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1b0\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2024-12-30 22:00+0000\n" "Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" @@ -361,6 +361,11 @@ msgstr[0] "Не може се изградити због {} грешке при msgstr[1] "Не може се изградити због {} грешке приликом скенирања" msgstr[2] "Не може се изградити због {} грешака приликом скенирања" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "Није успело читање {path}: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1488,6 +1493,11 @@ msgstr "Уклањање {path}" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Преименујте APK фајлове који не одговарају package.name_123.apk" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2009,6 +2019,10 @@ msgstr "Провера пакета {path} са apksigner." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "VirusTotal API кључ не може отпремити датотеке веће од 32MB, користи {url} за отпремање {path}." +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Упозорење о могућим грешкама у метаподацима" diff --git a/locale/sv/LC_MESSAGES/fdroidserver.po b/locale/sv/LC_MESSAGES/fdroidserver.po index ce93975f..a0928312 100644 --- a/locale/sv/LC_MESSAGES/fdroidserver.po +++ b/locale/sv/LC_MESSAGES/fdroidserver.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2025-03-17 21:44+0000\n" "Last-Translator: Kristoffer Grundström \n" "Language-Team: Swedish \n" @@ -362,6 +362,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "{path}: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1487,6 +1492,11 @@ msgstr "Tar bort {path}''" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Byt namn på APK-filer som inte matchar paket.namn_123.apk" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2000,6 +2010,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Visa varningar vid möjliga metadatafel" diff --git a/locale/sw/LC_MESSAGES/fdroidserver.po b/locale/sw/LC_MESSAGES/fdroidserver.po index 21e2b3a3..3ddf8eb8 100644 --- a/locale/sw/LC_MESSAGES/fdroidserver.po +++ b/locale/sw/LC_MESSAGES/fdroidserver.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.3a1\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2024-09-08 11:09+0000\n" "Last-Translator: abelbiwott-dev \n" "Language-Team: Swahili \n" @@ -359,6 +359,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Haiwezi kujenga kutokana na kosa la {} wakati wa uchanganuzi" msgstr[1] "Haiwezi kujenga kutokana na makosa ya {} wakati wa uchanganuzi" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "Imeshindwa kusoma {path}: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1486,6 +1491,11 @@ msgstr "Kuondoa {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Badilisha jina la faili za APK ambazo hazilingani na package.name_123.apk" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2007,6 +2017,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "Ufunguo wa API ya VirusTotal haiwezi kupakia faili zaidi ya 32MB, tumia {url} kupakia {path}." +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Onya kuhusu hitilafu ya metadata yanayoweza kutokea" diff --git a/locale/ta/LC_MESSAGES/fdroidserver.po b/locale/ta/LC_MESSAGES/fdroidserver.po index 00d2540d..0661e420 100644 --- a/locale/ta/LC_MESSAGES/fdroidserver.po +++ b/locale/ta/LC_MESSAGES/fdroidserver.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 2.1-273-g54e84d87\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2025-01-20 14:04+0000\n" "Last-Translator: Hans-Christoph Steiner \n" "Language-Team: Tamil \n" @@ -360,6 +360,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "ச்கேன் செய்யும் போது {} பிழை காரணமாக உருவாக்க முடியாது" msgstr[1] "ச்கேன் செய்யும் போது {} பிழைகள் காரணமாக உருவாக்க முடியாது" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "தோல்வியுற்ற வாசிப்பு {path}: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1487,6 +1492,11 @@ msgstr "{path} \"ஐ நீக்குதல்" msgid "Rename APK files that do not match package.name_123.apk" msgstr "தொகுப்புடன் பொருந்தாத APK கோப்புகளை மறுபெயரிடுங்கள். NAME_123.APK" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2007,6 +2017,10 @@ msgstr "Apksigner உடன் தொகுப்பு {path} ஐ சரிப msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "வைரச்டோட்டல் பநிஇ விசையை 32MB ஐ விட பெரிய கோப்புகளை பதிவேற்ற முடியாது, {path} பதிவேற்ற {url} ஐப் பயன்படுத்தவும்." +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "சாத்தியமான மேனிலை தரவு பிழைகள் குறித்து எச்சரிக்கவும்" diff --git a/locale/tr/LC_MESSAGES/fdroidserver.po b/locale/tr/LC_MESSAGES/fdroidserver.po index 4c051537..b3bbe3d5 100644 --- a/locale/tr/LC_MESSAGES/fdroidserver.po +++ b/locale/tr/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2025-05-26 22:01+0000\n" "Last-Translator: Bora Atıcı \n" "Language-Team: Turkish \n" @@ -363,6 +363,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "Tarama sırasında {} hata nedeniyle inşa edilemiyor" msgstr[1] "Tarama sırasında {} hata nedeniyle inşa edilemiyor" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "{path} okunamadı: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1490,6 +1495,11 @@ msgstr "\"{path}\" kaldırılıyor" msgid "Rename APK files that do not match package.name_123.apk" msgstr "paket.adı_123.apk örüntüsüyle eşleşmeyen tüm APK dosyalarını yeniden adlandır" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2010,6 +2020,10 @@ msgstr "{path} paketi apksigner ile doğrulanıyor." msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "VirusTotal API anahtarı 32MB'den büyük dosyaları yükleyemiyor, {path} yüklemek için {url} kullanın." +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Olası üst veri hataları hakkında uyar" diff --git a/locale/tzm/LC_MESSAGES/fdroidserver.po b/locale/tzm/LC_MESSAGES/fdroidserver.po index 705a018c..fcfc7527 100644 --- a/locale/tzm/LC_MESSAGES/fdroidserver.po +++ b/locale/tzm/LC_MESSAGES/fdroidserver.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.1-681-gc19e8952\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2020-10-29 08:32+0000\n" "Last-Translator: Hakim Oubouali \n" "Language-Team: Central Atlas Tamazight \n" @@ -353,6 +353,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1478,6 +1483,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1991,6 +2001,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "" diff --git a/locale/ug/LC_MESSAGES/fdroidserver.po b/locale/ug/LC_MESSAGES/fdroidserver.po index e4565e46..82346c03 100644 --- a/locale/ug/LC_MESSAGES/fdroidserver.po +++ b/locale/ug/LC_MESSAGES/fdroidserver.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 1.0.0-95-gd7af22b\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2018-06-08 03:44+0000\n" "Last-Translator: ۋولقان \n" "Language-Team: Uyghur \n" @@ -354,6 +354,11 @@ msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "" msgstr[1] "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1480,6 +1485,11 @@ msgstr "" msgid "Rename APK files that do not match package.name_123.apk" msgstr "" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -1993,6 +2003,10 @@ msgstr "" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "" diff --git a/locale/uk/LC_MESSAGES/fdroidserver.po b/locale/uk/LC_MESSAGES/fdroidserver.po index a8503aeb..822f3358 100644 --- a/locale/uk/LC_MESSAGES/fdroidserver.po +++ b/locale/uk/LC_MESSAGES/fdroidserver.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2025-03-27 19:35+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" @@ -370,6 +370,11 @@ msgstr[0] "Неможливо створити через {} помилку пі msgstr[1] "Неможливо створити через {} помилки під час сканування" msgstr[2] "Неможливо створити через {} помилок під час сканування" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "Не вдалося розпізнати {path}: {error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1497,6 +1502,11 @@ msgstr "Вилучення {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "Перейменування файлів APK, які не відповідають package.name_123.apk" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2018,6 +2028,10 @@ msgstr "Перевірка пакета {path} за допомогою apksigner msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "Ключ API VirusTotal не може завантажити файли, розмір яких понад 32 МБ, використовуйте {url} для завантаження {path}." +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "Попереджати про можливі помилки метаданих" diff --git a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po index 952e4838..6bb2b142 100644 --- a/locale/zh_Hans/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hans/LC_MESSAGES/fdroidserver.po @@ -39,7 +39,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2025-03-26 10:00+0000\n" "Last-Translator: 大王叫我来巡山 \n" "Language-Team: Chinese (Simplified Han script) \n" @@ -390,6 +390,11 @@ msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "因扫描时的{}错误而无法构建" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "读取 {path} 失败:{error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1517,6 +1522,11 @@ msgstr "删除 {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "重命名文件名不符合 package.name_123.apk 的 APK 文件" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2036,6 +2046,10 @@ msgstr "使用 apksigner 验证包 {path}。" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "VirusTotal 的 API 密钥无法用于上传大于 32MB 的文件,请使用 {url} 上传 {path}。" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "警告元数据中可能存在的错误" diff --git a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po index 4516afc7..e2358e7e 100644 --- a/locale/zh_Hant/LC_MESSAGES/fdroidserver.po +++ b/locale/zh_Hant/LC_MESSAGES/fdroidserver.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: fdroidserver 0.9\n" "Report-Msgid-Bugs-To: https://gitlab.com/fdroid/fdroidserver/issues\n" -"POT-Creation-Date: 2025-03-25 11:36+0100\n" +"POT-Creation-Date: 2025-06-25 09:52+0200\n" "PO-Revision-Date: 2024-11-26 15:16+0000\n" "Last-Translator: Peter Dave Hello \n" "Language-Team: Chinese (Traditional Han script) \n" @@ -362,6 +362,11 @@ msgid "Can't build due to {} error while scanning" msgid_plural "Can't build due to {} errors while scanning" msgstr[0] "掃描時由於 {} 出錯,無法進行編譯" +#: ../fdroidserver/common.py +#, fuzzy, python-brace-format +msgid "Cannot read {path}: {error}" +msgstr "讀取 {path} 失敗:錯誤訊息{error}" + #: ../fdroidserver/rewritemeta.py #, python-brace-format msgid "Cannot rewrite \"{path}\"" @@ -1509,6 +1514,11 @@ msgstr "正在移除 {path}\"" msgid "Rename APK files that do not match package.name_123.apk" msgstr "為不符合 package.name_123.apk 格式的 APK 檔案更名" +#: ../fdroidserver/common.py +#, python-brace-format +msgid "RepoType {type} is deprecated, please switch to git." +msgstr "" + #: ../fdroidserver/nightly.py #, python-brace-format msgid "Resigning {apkfilename} with provided debug.keystore" @@ -2045,6 +2055,10 @@ msgstr "正在使用 apksigner 驗證套件 {path}。" msgid "VirusTotal API key cannot upload files larger than 32MB, use {url} to upload {path}." msgstr "VirusTotal API key 無法上傳大於 32MB 的檔案, 選擇使用 {url} 來上傳檔案 {path} 。" +#: ../fdroidserver/nightly.py +msgid "WARNING: only public git repos are supported!" +msgstr "" + #: ../fdroidserver/__main__.py msgid "Warn about possible metadata errors" msgstr "關於中介資料可能錯誤的警告" From 52c1bcca700ea202b5e2cf2aaf2ec6c105bae233 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 11 Jun 2025 09:29:36 +0200 Subject: [PATCH 2088/2116] only copy icons into repo/ if they changed This should make things more efficient and reduce the size of the diffs in the transparency log. Using shutil.copy2() preserves metadata. --- fdroidserver/common.py | 6 +++++- fdroidserver/update.py | 10 +++++----- tests/test_common.py | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 6 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index b131ce19..afdcc59e 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -55,6 +55,7 @@ environment variable to include. import copy import difflib from typing import List +import filecmp import git import glob import io @@ -812,7 +813,10 @@ def load_localized_config(name, repodir): icons_dir = os.path.join(repodir, 'icons') if not os.path.exists(icons_dir): os.makedirs(icons_dir, exist_ok=True) - shutil.copy(os.path.join("config", value), icons_dir) + src = os.path.join("config", value) + dest = os.path.join(icons_dir, os.path.basename(src)) + if not os.path.exists(dest) or not filecmp.cmp(src, dest): + shutil.copy2(src, dest) ret[afname][key][locale] = file_entry( os.path.join(icons_dir, value) ) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index ba3b5506..95adfc66 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -20,6 +20,7 @@ # along with this program. If not, see . import argparse +import filecmp import sys import os import shutil @@ -1460,19 +1461,18 @@ def insert_localized_ios_app_metadata(apps_with_packages): fdroidserver.update.copy_ios_screenshots_to_repo(screenshots, package_name) # lookup icons, copy them and put them into app - icon_path = _get_ipa_icon(Path('build') / package_name) + icon_src = _get_ipa_icon(Path('build') / package_name) icon_dest = Path('repo') / package_name / 'icon.png' # for now just assume png - icon_stat = os.stat(icon_path) app['iconv2'] = { DEFAULT_LOCALE: { 'name': str(icon_dest).lstrip('repo'), 'sha256': common.sha256sum(icon_dest), - 'size': icon_stat.st_size, + 'size': os.path.getsize(icon_src), } } - if not icon_dest.exists(): + if not icon_dest.exists() or not filecmp.cmp(icon_src, icon_dest): icon_dest.parent.mkdir(parents=True, exist_ok=True) - shutil.copy(icon_path, icon_dest) + shutil.copy2(icon_src, icon_dest) def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False): diff --git a/tests/test_common.py b/tests/test_common.py index 1f6ff947..57cbb416 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -2815,6 +2815,46 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): ) self.assertEqual(['en-US'], list(categories['GuardianProject']['name'].keys())) + def test_load_localized_config_copy_icon(self): + os.chdir(self.testdir) + os.mkdir('config') + Path('config/categories.yml').write_text('System:\n icon: system.png') + source_file = 'config/system.png' + Path(source_file).write_text('placeholder') + time.sleep(0.01) # ensure reliable failure if mtime isn't preserved + fdroidserver.common.load_localized_config(CATEGORIES_CONFIG_NAME, 'repo') + dest_file = f'repo/icons/{os.path.basename(source_file)}' + self.assertEqual(os.path.getsize(source_file), os.path.getsize(dest_file)) + self.assertEqual(os.path.getmtime(source_file), os.path.getmtime(dest_file)) + + def test_load_localized_config_copy_unchanged(self): + """The destination file should only change if the source file did.""" + os.chdir(self.testdir) + os.mkdir('config') + Path('config/categories.yml').write_text('System:\n icon: system.png') + source_file = 'config/system.png' + Path(source_file).write_text('placeholder') + fdroidserver.common.load_localized_config(CATEGORIES_CONFIG_NAME, 'repo') + delta = 0.01 + time.sleep(delta) # ensure reliable failure if file isn't preserved + fdroidserver.common.load_localized_config(CATEGORIES_CONFIG_NAME, 'repo') + dest_file = f'repo/icons/{os.path.basename(source_file)}' + self.assertAlmostEqual( + os.path.getctime(source_file), os.path.getctime(dest_file), delta=delta + ) + + def test_load_localized_config_copy_over_dest(self): + os.chdir(self.testdir) + os.mkdir('config') + Path('config/categories.yml').write_text('System:\n icon: system.png') + source_file = Path('config/system.png') + dest_file = Path(f'repo/icons/{os.path.basename(source_file)}') + source_file.write_text('placeholder') + dest_file.parent.mkdir(parents=True) + dest_file.write_text('different contents') + fdroidserver.common.load_localized_config(CATEGORIES_CONFIG_NAME, 'repo') + self.assertEqual(os.path.getsize(source_file), os.path.getsize(dest_file)) + def test_load_localized_config_0_file(self): os.chdir(self.testdir) os.mkdir('config') From f4f1c003a6e1304e3760d002a71402d2bb21eb5a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 19 Jun 2025 11:13:08 +0200 Subject: [PATCH 2089/2116] gitlab-ci: 'pages' needs 'Build documentation' but it has `changes:` Fixes this error: > Unable to create pipeline > > 'pages' job needs 'Build documentation' job, but 'Build documentation' > does not exist in the pipeline. This might be because of the only, > except, or rules keywords. To need a job that sometimes does not exist > in the pipeline, use needs:optional. --- .gitlab-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 416d5646..48956570 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -734,7 +734,9 @@ pages: artifacts: paths: - public - needs: ["Build documentation"] + needs: + - job: "Build documentation" + optional: true rules: - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' # only publish pages on default (master) branch From 909864a8c76d731dcd4ca7cd561e88539227be47 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sat, 5 Jul 2025 15:03:27 +0800 Subject: [PATCH 2090/2116] gradle 8.14.3 --- gradlew-fdroid | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index ed316eca..83d68756 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -214,6 +214,7 @@ get_sha() { '8.14') echo '61ad310d3c7d3e5da131b76bbf22b5a4c0786e9d892dae8c1658d4b484de3caa' ;; '8.14.1') echo '845952a9d6afa783db70bb3b0effaae45ae5542ca2bb7929619e8af49cb634cf' ;; '8.14.2') echo '7197a12f450794931532469d4ff21a59ea2c1cd59a3ec3f89c035c3c420a6999' ;; + '8.14.3') echo 'bd71102213493060956ec229d946beee57158dbd89d0e62b91bca0fa2c5f3531' ;; *) exit 1 esac } @@ -230,11 +231,11 @@ contains() { # (key) should accept. plugin versions are actually prefixes and catch sub- # versions as well. Pairs are taken from: # https://developer.android.com/studio/releases/gradle-plugin#updating-gradle -d_gradle_plugin_ver_k=(8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0) -d_plugin_min_gradle_v=(8.11.1 8.10.2 8.9 8.7 8.7 8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12) +d_gradle_plugin_ver_k=(8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0) +d_plugin_min_gradle_v=(8.11.1 8.11.1 8.10.2 8.9 8.7 8.7 8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12) # All gradle versions we know about -plugin_v=(8.14.2 8.14.1 8.14 8.13 8.12.1 8.12 8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.5 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.14.3 8.14.2 8.14.1 8.14 8.13 8.12.1 8.12 8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.5 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 09a51a429bce4487592a858433dafc93a350c619 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sun, 6 Jul 2025 15:29:08 +0800 Subject: [PATCH 2091/2116] AGP 8.11 requires Gradle 8.13 --- gradlew-fdroid | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index 83d68756..cc712409 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -231,8 +231,8 @@ contains() { # (key) should accept. plugin versions are actually prefixes and catch sub- # versions as well. Pairs are taken from: # https://developer.android.com/studio/releases/gradle-plugin#updating-gradle -d_gradle_plugin_ver_k=(8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0) -d_plugin_min_gradle_v=(8.11.1 8.11.1 8.10.2 8.9 8.7 8.7 8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12) +d_gradle_plugin_ver_k=(8.11 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0) +d_plugin_min_gradle_v=(8.13 8.11.1 8.11.1 8.10.2 8.9 8.7 8.7 8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12) # All gradle versions we know about plugin_v=(8.14.3 8.14.2 8.14.1 8.14 8.13 8.12.1 8.12 8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.5 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) From 7946acd52a6c60d43d3bd1d85f82931ac3ff2c55 Mon Sep 17 00:00:00 2001 From: fdroid-bot Date: Wed, 16 Jul 2025 11:52:37 +0000 Subject: [PATCH 2092/2116] gradle v8.14.3 --- gradlew-fdroid | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradlew-fdroid b/gradlew-fdroid index cc712409..bf9890f4 100755 --- a/gradlew-fdroid +++ b/gradlew-fdroid @@ -189,6 +189,7 @@ get_sha() { '7.6.3') echo '740c2e472ee4326c33bf75a5c9f5cd1e69ecf3f9b580f6e236c86d1f3d98cfac' ;; '7.6.4') echo 'bed1da33cca0f557ab13691c77f38bb67388119e4794d113e051039b80af9bb1' ;; '7.6.5') echo 'b812fec0edb7d27e0ae35955887bb2954536fa3e44edaf481150da058e154d9a' ;; + '7.6.6') echo '673d9776f303bc7048fc3329d232d6ebf1051b07893bd9d11616fad9a8673be0' ;; '8.0') echo '4159b938ec734a8388ce03f52aa8f3c7ed0d31f5438622545de4f83a89b79788' ;; '8.0.1') echo '1b6b558be93f29438d3df94b7dfee02e794b94d9aca4611a92cdb79b6b88e909' ;; '8.0.2') echo 'ff7bf6a86f09b9b2c40bb8f48b25fc19cf2b2664fd1d220cd7ab833ec758d0d7' ;; @@ -235,7 +236,7 @@ d_gradle_plugin_ver_k=(8.11 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2 8.1 8.0 d_plugin_min_gradle_v=(8.13 8.11.1 8.11.1 8.10.2 8.9 8.7 8.7 8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12) # All gradle versions we know about -plugin_v=(8.14.3 8.14.2 8.14.1 8.14 8.13 8.12.1 8.12 8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.5 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) +plugin_v=(8.14.3 8.14.2 8.14.1 8.14 8.13 8.12.1 8.12 8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.6 7.6.5 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) v_all=${plugin_v[@]} From 97b0b0eaf851dd5eedd921fb4d35ace4782f7dae Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 16 Jul 2025 13:55:03 +0200 Subject: [PATCH 2093/2116] gitlab-ci: update gradle: job to only check files in While we are at it, also upgrade to Debian/trixie and rules: this now handles making the merge requests: https://gitlab.com/fdroid/gradle-transparency-log/-/merge_requests/2 --- .gitlab-ci.yml | 27 +++---------- tests/gradle-release-checksums.py | 64 ++----------------------------- 2 files changed, 9 insertions(+), 82 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 48956570..3a4a7819 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -467,35 +467,20 @@ macOS: gradle: - image: debian:bookworm-slim - rules: - - if: "$PERSONAL_ACCESS_TOKEN" + image: debian:trixie-slim <<: *apt-template - variables: - GIT_DEPTH: 1000 + rules: + - changes: + - .gitlab-ci.yml + - gradlew-fdroid + - makebuildserver script: - apt-get install ca-certificates git - openssh-client - python3-bs4 python3-colorama - python3-git - python3-gitlab python3-packaging python3-requests - # if this is a merge request fork, then only check if relevant files changed - - if [ "$CI_PROJECT_NAMESPACE" != "fdroid" ]; then - set -x; - git fetch https://gitlab.com/fdroid/fdroidserver.git; - for f in `git diff --name-only --diff-filter=d FETCH_HEAD...HEAD`; do - test "$f" == "makebuildserver" && export CHANGED="$f $CHANGED"; - test "$f" == "gradlew-fdroid" && export CHANGED="$f $CHANGED"; - done; - test -z "$CHANGED" && exit; - echo $CHANGED; - set +x; - fi - ./tests/gradle-release-checksums.py diff --git a/tests/gradle-release-checksums.py b/tests/gradle-release-checksums.py index 0c190ebf..7b6ab9b0 100755 --- a/tests/gradle-release-checksums.py +++ b/tests/gradle-release-checksums.py @@ -1,7 +1,5 @@ #!/usr/bin/env python3 -import git -import gitlab import os import re import requests @@ -90,62 +88,6 @@ plugin_v_pat = re.compile(r'\nplugin_v=\(([0-9. ]+)\)') with open('gradlew-fdroid', 'w') as fp: fp.write(plugin_v_pat.sub('\nplugin_v=(%s)' % plugin_v, gradlew_fdroid)) -if os.getenv('CI_PROJECT_NAMESPACE') != 'fdroid': - p = subprocess.run(['git', '--no-pager', 'diff']) - print(p.stdout) - sys.exit(errors) - -# This only runs after commits are pushed to fdroid/fdroidserver -git_repo = git.repo.Repo('.') -modified = git_repo.git().ls_files(modified=True).split() -if git_repo.is_dirty() and ('gradlew-fdroid' in modified or 'makebuildserver' in modified): - private_token = os.getenv('PERSONAL_ACCESS_TOKEN') - if not private_token: - print(Fore.RED - + 'ERROR: GitLab Token not found in PERSONAL_ACCESS_TOKEN!' - + Style.RESET_ALL) - sys.exit(1) - - branch = git_repo.create_head(os.path.basename(__file__), force=True) - branch.checkout() - git_repo.index.add(['gradlew-fdroid', 'makebuildserver']) - author = git.Actor('fdroid-bot', 'fdroid-bot@f-droid.org') - git_repo.index.commit('gradle v' + version, author=author) - project_path = 'fdroid-bot/' + os.getenv('CI_PROJECT_NAME') - url = ('https://gitlab-ci-token:%s@%s/%s.git' - % (os.getenv('PERSONAL_ACCESS_TOKEN'), os.getenv('CI_SERVER_HOST'), project_path)) - remote_name = 'fdroid-bot' - try: - remote = git_repo.create_remote(remote_name, url) - # See https://github.com/PyCQA/pylint/issues/2856 . - # pylint: disable-next=no-member - except git.exc.GitCommandError: - remote = git.remote.Remote(git_repo, remote_name) - remote.set_url(url) - remote.push(force=True) - git.remote.Remote.rm(git_repo, remote_name) - - gl = gitlab.Gitlab(os.getenv('CI_SERVER_URL'), api_version=4, - private_token=private_token) - project = gl.projects.get(project_path, lazy=True) - description = ( - 'see ' - '\n\n

    generated by GitLab CI Job #%s

    ' - % (os.getenv('CI_PROJECT_URL'), os.getenv('CI_JOB_ID'), os.getenv('CI_JOB_ID')) - ) - try: - mr = project.mergerequests.create({ - 'source_branch': branch.name, - 'target_project_id': 36527, # fdroid/fdroidserver - 'target_branch': 'master', - 'title': 'update to gradle v' + version, - 'description': description, - 'labels': ['fdroid-bot', 'gradle'], - 'remove_source_branch': True, - }) - mr.save() - except gitlab.exceptions.GitlabCreateError as e: - if e.response_code == 409: # Another open merge request already exists for this source branch - print(e.error_message) - else: - raise e +p = subprocess.run(['git', '--no-pager', 'diff']) +errors += p.returncode +sys.exit(errors) From ba5c78d45f408d9f6e270c033fe621b18dfc0eb7 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 8 Jul 2025 20:44:21 +0200 Subject: [PATCH 2094/2116] update: fetch Builds one time and reuse --- fdroidserver/update.py | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 95adfc66..3106b7aa 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1185,14 +1185,9 @@ def insert_localized_app_metadata(apps): # flavors specified in build receipt build_flavors = [] - if ( - apps[packageName] - and len(apps[packageName].get('Builds', [])) > 0 - and 'gradle' in apps[packageName]['Builds'][-1] - and apps[packageName]['Builds'][-1]['gradle'] != ['yes'] - ): + if builds and 'gradle' in builds[-1] and builds[-1]['gradle'] != ['yes']: build_flavors = common.calculate_gradle_flavor_combination( - apps[packageName]['Builds'][-1]['gradle'] + builds[-1]['gradle'] ) if len(segments) >= 5 and segments[4] == "fastlane" and segments[3] not in build_flavors: @@ -1234,9 +1229,7 @@ def insert_localized_app_metadata(apps): try: versionCode = int(base) locale = segments[-2] - if versionCode in [ - a["versionCode"] for a in apps[packageName]["Builds"] - ]: + if versionCode in [b["versionCode"] for b in builds]: _set_localized_text_entry( apps[packageName], locale, From 96c0d928daca6682e55cd96737dee8b63a9407ff Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 8 Jul 2025 22:32:49 +0200 Subject: [PATCH 2095/2116] update: support fastlane/ dir in subdir: GNU Taler apps use this. * https://git.taler.net/taler-android.git/tree/merchant-terminal/fastlane/metadata/android/en-US?h=pos-1.0.2 --- fdroidserver/update.py | 25 +++++++++++++-- tests/test_update.py | 69 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 3 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 3106b7aa..6369a8b8 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1167,7 +1167,7 @@ def insert_localized_app_metadata(apps): https://f-droid.org/en/docs/All_About_Descriptions_Graphics_and_Screenshots/#in-the-apps-build-metadata-in-an-fdroiddata-collection """ sourcedirs = glob.glob(os.path.join('build', '[A-Za-z]*', 'src', '[A-Za-z]*', 'fastlane', 'metadata', 'android', '[a-z][a-z]*')) - sourcedirs += glob.glob(os.path.join('build', '[A-Za-z]*', 'fastlane', 'metadata', 'android', '[a-z][a-z]*')) + sourcedirs += glob.glob(os.path.join('build', '[A-Za-z]*', '**', 'fastlane', 'metadata', 'android', '[a-z][a-z]*'), recursive=True) sourcedirs += glob.glob(os.path.join('build', '[A-Za-z]*', 'metadata', '[a-z][a-z]*')) sourcedirs += glob.glob(os.path.join('metadata', '[A-Za-z]*', '[a-z][a-z]*')) @@ -1183,6 +1183,16 @@ def insert_localized_app_metadata(apps): locale = segments[-1] destdir = os.path.join('repo', packageName, locale) + builds = apps.get(packageName, {}).get('Builds', []) + found_in_subdir = ( + builds + and len(segments) > 7 + and segments[-4] == "fastlane" + and segments[-3] == "metadata" + and segments[-2] == "android" + and '/'.join(segments[2:-4]) == builds[-1].get('subdir') + ) + # flavors specified in build receipt build_flavors = [] if builds and 'gradle' in builds[-1] and builds[-1]['gradle'] != ['yes']: @@ -1190,8 +1200,17 @@ def insert_localized_app_metadata(apps): builds[-1]['gradle'] ) - if len(segments) >= 5 and segments[4] == "fastlane" and segments[3] not in build_flavors: - logging.debug("ignoring due to wrong flavor") + if ( + not found_in_subdir + and len(segments) >= 5 + and segments[4] == "fastlane" + and segments[3] not in build_flavors + ): + logging.debug( + 'Not scanning "{dir}" with unknown subdir or gradle flavor "{value}"'.format( + dir=os.path.relpath(root), value=segments[3] + ) + ) continue for f in files: diff --git a/tests/test_update.py b/tests/test_update.py index de39d8fd..f17667e2 100755 --- a/tests/test_update.py +++ b/tests/test_update.py @@ -253,6 +253,75 @@ class UpdateTest(unittest.TestCase): fdroidserver.update.insert_localized_app_metadata(apps) self.assertEqual('42', apps[app.id]['localized']['en-US']['whatsNew']) + def test_fastlane_with_subdir(self): + """Test if fastlane in simple one-level subdir is found.""" + os.chdir(self.testdir) + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.update.config = config + + app = fdroidserver.metadata.App() + app.id = 'com.example.app' + build_dir = f'build/{app.id}' + flavor = 'flavor' + subdir = 'subproject' + apps = {app.id: app} + build = fdroidserver.metadata.Build() + build.versionCode = 42 + build.gradle = [flavor] + build.subdir = subdir + app['Builds'] = [build] + + first_value = 'first' + first_dir = Path(f'{build_dir}/src/{flavor}/fastlane/metadata/android/en-US') + first_dir.mkdir(parents=True) + (first_dir / 'title.txt').write_text(first_value) + fdroidserver.update.insert_localized_app_metadata(apps) + self.assertEqual(first_value, apps[app.id]['localized']['en-US']['name']) + + second_value = 'second' + second_dir = Path(f'{build_dir}/{subdir}/fastlane/metadata/android/en-US') + second_dir.mkdir(parents=True) + (second_dir / 'title.txt').write_text(second_value) + fdroidserver.update.insert_localized_app_metadata(apps) + self.assertEqual(second_value, apps[app.id]['localized']['en-US']['name']) + + def test_fastlane_with_multi_level_subdir(self): + """Test if fastlane in multi-level subdir is found.""" + os.chdir(self.testdir) + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.update.config = config + + app = fdroidserver.metadata.App() + app.id = 'org.videolan.vlc' + build_dir = f'build/{app.id}' + subdir = 'application/app' + apps = {app.id: app} + build = fdroidserver.metadata.Build() + build.versionCode = 42 + build.gradle = ['yes'] + build.subdir = subdir + app['Builds'] = [build] + + first_value = 'first' + first_dir = Path(f'{build_dir}/{subdir}/fastlane/metadata/android/en-US') + first_dir.mkdir(parents=True) + (first_dir / 'title.txt').write_text(first_value) + fdroidserver.update.insert_localized_app_metadata(apps) + self.assertEqual(first_value, apps[app.id]['localized']['en-US']['name']) + + # I'm not sure that it is correct behavior for this path to + # override the above path, but it is how it is working now. It + # seems to me it should be the other way around, but that is + # really hard to implement using the current algorithm. + second_value = 'second' + second_dir = Path(f'{build_dir}/fastlane/metadata/android/en-US') + second_dir.mkdir(parents=True) + (second_dir / 'title.txt').write_text(second_value) + fdroidserver.update.insert_localized_app_metadata(apps) + self.assertEqual(second_value, apps[app.id]['localized']['en-US']['name']) + def test_name_title_scraping(self): """metadata file --> fdroiddata localized files --> fastlane/triple-t in app source --> APK""" shutil.copytree(basedir, self.testdir, dirs_exist_ok=True) From 7e219561b72a0a05de73333bf9982ac38426aa57 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 22 Jul 2025 17:56:28 +0200 Subject: [PATCH 2096/2116] gitlab-ci: update PUBLISH to bookworm since prod has already --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3a4a7819..8276f062 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -765,12 +765,12 @@ docker: # PUBLISH is the signing server. It has a very minimal manual setup. PUBLISH: - image: debian:bullseye-backports + image: debian:bookworm-backports <<: *python-rules-changes script: - apt-get update - apt-get -qy upgrade - - apt-get -qy install --no-install-recommends -t bullseye-backports + - apt-get -qy install --no-install-recommends -t bookworm-backports androguard apksigner curl From 7988c54d0016c2f8eaedf27345e1c7b0be0df735 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 13 Feb 2025 14:58:16 +0100 Subject: [PATCH 2097/2116] buildserver: always use HTTPS for apt connections in Docker image This configuration has been in use in .gitlab-ci.yml scripts for a while now and has proven reliable. This is a "low hanging fruit" improvement. It provides an extra layer of protection for when their are apt vulns. And it makes it much harder to profile what a server/laptop is doing based on the internet traffic. The network observer will no longer be able to see which packages are being downloaded since apt uses HTTP pipelining so size attacks are not really possible. And HTTPS hides the URLs, filenames, download contents, etc. --- .gitlab-ci.yml | 8 ++++++++ buildserver/Dockerfile | 13 ++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8276f062..295752e8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -98,6 +98,14 @@ metadata_v0: # Ubuntu and other distros often lack https:// support - grep Debian /etc/issue.net && { find /etc/apt/sources.list* -type f | xargs sed -i s,http:,https:, ; } + # The official Debian docker images ship without ca-certificates, + # TLS certificates cannot be verified until that is installed. The + # following code turns off TLS verification, and enables HTTPS, so + # at least unverified TLS is used for apt-get instead of plain + # HTTP. Once ca-certificates is installed, the CA verification is + # enabled by removing this config. This set up makes the initial + # `apt-get update` and `apt-get install` look the same as verified + # TLS to the network observer and hides the metadata. - echo 'Acquire::https::Verify-Peer "false";' > /etc/apt/apt.conf.d/99nocacertificates - apt-get update - apt-get install ca-certificates diff --git a/buildserver/Dockerfile b/buildserver/Dockerfile index 3e863df5..27ada3f8 100644 --- a/buildserver/Dockerfile +++ b/buildserver/Dockerfile @@ -37,11 +37,22 @@ RUN useradd --create-home -s /bin/bash vagrant && echo -n 'vagrant:vagrant' | ch # # Ensure fdroidserver's dependencies are marked manual before purging # unneeded packages, otherwise, all its dependencies get purged. +# +# The official Debian docker images ship without ca-certificates, so +# TLS certificates cannot be verified until that is installed. The +# following code temporarily turns off TLS verification, and enables +# HTTPS, so at least unverified TLS is used for apt-get instead of +# plain HTTP. Once ca-certificates is installed, the CA verification +# is enabled by removing the newly created config file. This set up +# makes the initial `apt-get update` and `apt-get install` look the +# same as verified TLS to the network observer and hides the metadata. RUN printf "path-exclude=/usr/share/locale/*\npath-exclude=/usr/share/man/*\npath-exclude=/usr/share/doc/*\npath-include=/usr/share/doc/*/copyright\n" >/etc/dpkg/dpkg.cfg.d/01_nodoc \ && mkdir -p /usr/share/man/man1 \ + && echo 'Acquire::https::Verify-Peer "false";' > /etc/apt/apt.conf.d/99nocacertificates \ + && find /etc/apt/sources.list* -type f -exec sed -i s,http:,https:, {} \; \ && apt-get update \ && apt-get install ca-certificates \ - && sed -i 's,http:,https:,' /etc/apt/sources.list.d/debian.sources \ + && rm /etc/apt/apt.conf.d/99nocacertificates \ && apt-get upgrade \ && apt-get dist-upgrade \ && apt-get install openssh-client iproute2 python3 openssh-server sudo \ From 5049645003ee73c78dfb996dbc6f368db4299a18 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 22 Jul 2025 17:42:22 +0200 Subject: [PATCH 2098/2116] make gradlew-fdroid a standalone project https://gitlab.com/fdroid/gradlew-fdroid --- .gitlab-ci.yml | 26 +-- buildserver/provision-gradle | 7 +- fdroidserver/build.py | 2 - fdroidserver/common.py | 2 +- gradlew-fdroid | 314 ------------------------------ hooks/pre-commit | 2 +- tests/gradle-release-checksums.py | 26 --- tests/test_gradlew-fdroid | 75 ------- 8 files changed, 11 insertions(+), 443 deletions(-) delete mode 100755 gradlew-fdroid delete mode 100755 tests/test_gradlew-fdroid diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 295752e8..f66e1ce6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -220,21 +220,6 @@ ubuntu_jammy_pip: - LANGUAGE='de' fdroid --help | grep 'Gültige Befehle sind' -# The gradlew-fdroid tests are isolated from the rest of the test -# suite, so they run as their own job. -gradlew-fdroid: - image: debian:bookworm-slim - <<: *apt-template - rules: - - changes: - - .gitlab-ci.yml - - gradlew-fdroid - - tests/test_gradlew-fdroid - script: - - apt-get install ca-certificates curl default-jdk-headless unzip - - ./tests/test_gradlew-fdroid - - # Run all the various linters and static analysis tools. hooks/pre-commit: stage: lint @@ -294,11 +279,9 @@ shellcheck: rules: - changes: - .gitlab-ci.yml - - gradlew-fdroid - hooks/install-hooks.sh - hooks/pre-commit - tests/run-tests - - tests/test_gradlew-fdroid <<: *apt-template script: - apt-get install shellcheck @@ -307,10 +290,6 @@ shellcheck: hooks/install-hooks.sh hooks/pre-commit tests/run-tests - # TODO make the gradlew things pass the standard above - - shellcheck --severity=error --color - gradlew-fdroid - tests/test_gradlew-fdroid # Check all the dependencies in Debian to mirror production. CVEs are # generally fixed in the latest versions in pip/pypi.org, so it isn't @@ -468,7 +447,7 @@ macOS: - echo "macOS sticks with bash 3.x because of licenses, so avoid new bash syntax" - /bin/bash --version - - /bin/bash -n gradlew-fdroid tests/run-tests + - /bin/bash -n tests/run-tests # test fdroidserver from git with current package's dependencies - fdroid="$(brew --prefix fdroidserver)/libexec/bin/python3 $PWD/fdroid" ./tests/run-tests @@ -480,7 +459,6 @@ gradle: rules: - changes: - .gitlab-ci.yml - - gradlew-fdroid - makebuildserver script: - apt-get install @@ -543,6 +521,8 @@ fdroid build: env HOME=$home_vagrant fdroid" + - git -C $home_vagrant/gradlew-fdroid pull + - chown -R vagrant $home_vagrant - chown -R vagrant $fdroidserver/.git - chown vagrant $fdroidserver/ diff --git a/buildserver/provision-gradle b/buildserver/provision-gradle index ca48bcf7..a282a4c5 100644 --- a/buildserver/provision-gradle +++ b/buildserver/provision-gradle @@ -25,7 +25,12 @@ fi chmod -R a+rX /opt/gradle test -e /opt/gradle/bin || mkdir -p /opt/gradle/bin -ln -fs /home/vagrant/fdroidserver/gradlew-fdroid /opt/gradle/bin/gradle +git clone --depth 1 https://gitlab.com/fdroid/gradlew-fdroid.git /home/vagrant/gradlew-fdroid/ +chmod 0755 /home/vagrant/gradlew-fdroid/gradlew-fdroid +chmod -R u+rwX,a+rX,go-w /home/vagrant/gradlew-fdroid/ +ln -fs /home/vagrant/gradlew-fdroid/gradlew-fdroid /opt/gradle/bin/gradle +ln -fs /home/vagrant/gradlew-fdroid/gradlew-fdroid /usr/local/bin/ + chown -h vagrant:vagrant /opt/gradle/bin/gradle chown vagrant:vagrant /opt/gradle/versions chmod 0755 /opt/gradle/versions diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 8a59c771..a187765b 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -155,9 +155,7 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): ftp.mkdir('fdroidserver') ftp.chdir('fdroidserver') ftp.put(os.path.join(serverpath, '..', 'fdroid'), 'fdroid') - ftp.put(os.path.join(serverpath, '..', 'gradlew-fdroid'), 'gradlew-fdroid') ftp.chmod('fdroid', 0o755) # nosec B103 permissions are appropriate - ftp.chmod('gradlew-fdroid', 0o755) # nosec B103 permissions are appropriate send_dir(os.path.join(serverpath)) ftp.chdir(homedir) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index afdcc59e..7d591ab8 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -184,7 +184,7 @@ default_config = { 'scan_binary': False, 'ant': "ant", 'mvn3': "mvn", - 'gradle': os.path.join(FDROID_PATH, 'gradlew-fdroid'), + 'gradle': shutil.which('gradlew-fdroid'), 'sync_from_local_copy_dir': False, 'allow_disabled_algorithms': False, 'keep_when_not_allowed': False, diff --git a/gradlew-fdroid b/gradlew-fdroid deleted file mode 100755 index bf9890f4..00000000 --- a/gradlew-fdroid +++ /dev/null @@ -1,314 +0,0 @@ -#!/bin/bash - -bindir="$(dirname $0)" -basedir="$(dirname $bindir)" -# Check if GRADLE_VERSION_DIR/CACHEDIR is set from environment -if [ -z "$GRADLE_VERSION_DIR" ]; then - gradle_version_dir="${basedir}/versions" -else - gradle_version_dir="$GRADLE_VERSION_DIR" -fi -BUILDSERVER_CACHEDIR=/vagrant/cache -if [ -n "$CACHEDIR" ]; then - cachedir="$CACHEDIR" -elif [ -d $BUILDSERVER_CACHEDIR ]; then - cachedir=$BUILDSERVER_CACHEDIR -fi -args=("$@") - -run_gradle() { - if [ ! -d "${gradle_version_dir}/${v_found}" ]; then - download_gradle ${v_found} - fi - # shellcheck disable=SC2145 - echo "Running ${gradle_version_dir}/${v_found}/bin/gradle ${args[@]}" - "${gradle_version_dir}/${v_found}/bin/gradle" "${args[@]}" - exit $? -} - -download_gradle() { - URL="https://downloads.gradle.org/distributions/gradle-${1}-bin.zip" - shasum=$(get_sha $1) - if [ $? != 0 ]; then - echo "No hash for gradle version $1! Exiting..." - exit 1 - fi - if [ -n "${cachedir}" ] && [ -e "${cachedir}/gradle-$1-bin.zip" ]; then - echo "Using cached ${cachedir}/gradle-$1-bin.zip ..." - gradle_zip="${cachedir}/gradle-$1-bin.zip" - else - echo "Downloading missing gradle version $1" - echo cachedir $cachedir - if [[ -n "${cachedir}" && ! -d "${cachedir}" ]]; then - mkdir -p "${cachedir}" - fi - if [[ -n "${cachedir}" && -d "${cachedir}" && -w "${cachedir}" ]]; then - tmpdir="${cachedir}" - else - tmpdir=$(mktemp -d) - fi - curl -o "${tmpdir}/gradle-$1-bin.zip" --silent --fail --show-error --location --retry 3 --retry-all-errors "${URL}" - gradle_zip="${tmpdir}/gradle-$1-bin.zip" - fi - echo "${shasum} ${gradle_zip}" | sha256sum -c - - if [ $? != 0 ]; then - echo "gradle download checksum mismatch! Exiting..." - exit 1 - fi - mkdir -p "${gradle_version_dir}/" - unzip -q -d "${gradle_version_dir}" "${gradle_zip}" - mv "${gradle_version_dir}/gradle-$1" "${gradle_version_dir}/${v_found}" -} - -get_sha() { - case $1 in - '0.7') echo '4e354fcb0d5c0b0e7789cd6ee900456edaf993f6dd890c4a1c217d90d2a6a6ad' ;; - '0.8') echo '940e623ea98e40ea9ad398770a6ebb91a61c0869d394dda81aa86b0f4f0025e7' ;; - '0.9') echo '994e46d4b467254a0f25ce92b602618331b9b3ac8b32a094fd84ff0e0ceec135' ;; - '0.9.1') echo '5d48cba95db031ec109ae9ab60561e960b6507046036e8191aa78572ec27e2a5' ;; - '0.9.2') echo 'f94d7642348c558fc05ab5fd6fb947fb1ed8fed5931ddb73dd04fb0de22d669b' ;; - '1.0') echo '894bca0360a7e2040815096788f118a2dd106ff6694221b274efb9c32bce0384' ;; - '1.1') echo '552c1fc9f3a1b9668b79cc447370f0263e664ffb6d5c6e1c21e77ce0c8a20d4c' ;; - '1.2') echo 'eb53da3704d24cabb7565f34a3bf16bcd863c4b0c139917606fb15d4f27c7bdf' ;; - '1.3') echo 'ada68561efbb9f1cae0f9063974cbde15c180351a2f92bc2f1106e39ddcae5ba' ;; - '1.4') echo 'cd99e85fbcd0ae8b99e81c9992a2f10cceb7b5f009c3720ef3a0078f4f92e94e' ;; - '1.5') echo 'a5511a0659caa47d9d74fd2844c9da43157d2f78e63a0223c6289d88f5aaecbe' ;; - '1.6') echo 'de3e89d2113923dcc2e0def62d69be0947ceac910abd38b75ec333230183fac4' ;; - '1.7') echo '360c97d51621b5a1ecf66748c718594e5f790ae4fbc1499543e0c006033c9d30' ;; - '1.8') echo 'a342bbfa15fd18e2482287da4959588f45a41b60910970a16e6d97959aea5703' ;; - '1.9') echo '097ddc2bcbc9da2bb08cbf6bf8079585e35ad088bafd42e8716bc96405db98e9' ;; - '1.10') echo '6e6db4fc595f27ceda059d23693b6f6848583950606112b37dfd0e97a0a0a4fe' ;; - '1.11') echo '07e235df824964f0e19e73ea2327ce345c44bcd06d44a0123d29ab287fc34091' ;; - '1.12') echo '8734b13a401f4311ee418173ed6ca8662d2b0a535be8ff2a43ecb1c13cd406ea' ;; - '2.0') echo 'a1eb880c8755333c4d33c4351b269bebe517002532d3142c0b6164c9e8c081c3' ;; - '2.1') echo '3eee4f9ea2ab0221b89f8e4747a96d4554d00ae46d8d633f11cfda60988bf878' ;; - '2.2') echo '91e5655fe11ef414449f218c4fa2985b3a49b7903c57556da109c84fa26e1dfb' ;; - '2.2.1') echo '420aa50738299327b611c10b8304b749e8d3a579407ee9e755b15921d95ff418' ;; - '2.3') echo '010dd9f31849abc3d5644e282943b1c1c355f8e2635c5789833979ce590a3774' ;; - '2.4') echo 'c4eaecc621a81f567ded1aede4a5ddb281cc02a03a6a87c4f5502add8fc2f16f' ;; - '2.5') echo '3f953e0cb14bb3f9ebbe11946e84071547bf5dfd575d90cfe9cc4e788da38555' ;; - '2.6') echo '18a98c560af231dfa0d3f8e0802c20103ae986f12428bb0a6f5396e8f14e9c83' ;; - '2.7') echo 'cde43b90945b5304c43ee36e58aab4cc6fb3a3d5f9bd9449bb1709a68371cb06' ;; - '2.8') echo 'a88db9c2f104defdaa8011c58cf6cda6c114298ae3695ecfb8beb30da3a903cb' ;; - '2.9') echo 'c9159ec4362284c0a38d73237e224deae6139cbde0db4f0f44e1c7691dd3de2f' ;; - '2.10') echo '66406247f745fc6f05ab382d3f8d3e120c339f34ef54b86f6dc5f6efc18fbb13' ;; - '2.11') echo '8d7437082356c9fd6309a4479c8db307673965546daea445c6c72759cd6b1ed6' ;; - '2.12') echo 'e77064981906cd0476ff1e0de3e6fef747bd18e140960f1915cca8ff6c33ab5c' ;; - '2.13') echo '0f665ec6a5a67865faf7ba0d825afb19c26705ea0597cec80dd191b0f2cbb664' ;; - '2.14') echo '993b4f33b652c689e9721917d8e021cab6bbd3eae81b39ab2fd46fdb19a928d5' ;; - '2.14.1') echo 'cfc61eda71f2d12a572822644ce13d2919407595c2aec3e3566d2aab6f97ef39' ;; - '3.0') echo '39c906941a474444afbddc38144ed44166825acb0a57b0551dddb04bbf157f80' ;; - '3.1') echo 'c7de3442432253525902f7e8d7eac8b5fd6ce1623f96d76916af6d0e383010fc' ;; - '3.2') echo '5321b36837226dc0377047a328f12010f42c7bf88ee4a3b1cee0c11040082935' ;; - '3.2.1') echo '9843a3654d3e57dce54db06d05f18b664b95c22bf90c6becccb61fc63ce60689' ;; - '3.3') echo 'c58650c278d8cf0696cab65108ae3c8d95eea9c1938e0eb8b997095d5ca9a292' ;; - '3.4') echo '72d0cd4dcdd5e3be165eb7cd7bbd25cf8968baf400323d9ab1bba622c3f72205' ;; - '3.4.1') echo 'db1db193d479cc1202be843f17e4526660cfb0b21b57d62f3a87f88c878af9b2' ;; - '3.5') echo '0b7450798c190ff76b9f9a3d02e18b33d94553f708ebc08ebe09bdf99111d110' ;; - '3.5.1') echo '8dce35f52d4c7b4a4946df73aa2830e76ba7148850753d8b5e94c5dc325ceef8' ;; - '4.0') echo '56bd2dde29ba2a93903c557da1745cafd72cdd8b6b0b83c05a40ed7896b79dfe' ;; - '4.0.1') echo 'd717e46200d1359893f891dab047fdab98784143ac76861b53c50dbd03b44fd4' ;; - '4.0.2') echo '79ac421342bd11f6a4f404e0988baa9c1f5fabf07e3c6fa65b0c15c1c31dda22' ;; - '4.1') echo 'd55dfa9cfb5a3da86a1c9e75bb0b9507f9a8c8c100793ccec7beb6e259f9ed43' ;; - '4.2') echo '515dd63d32e55a9c05667809c5e40a947529de3054444ad274b3b75af5582eae' ;; - '4.2.1') echo 'b551cc04f2ca51c78dd14edb060621f0e5439bdfafa6fd167032a09ac708fbc0' ;; - '4.3') echo '8dcbf44eef92575b475dcb1ce12b5f19d38dc79e84c662670248dc8b8247654c' ;; - '4.3.1') echo '15ebe098ce0392a2d06d252bff24143cc88c4e963346582c8d88814758d93ac7' ;; - '4.4') echo 'fa4873ae2c7f5e8c02ec6948ba95848cedced6134772a0169718eadcb39e0a2f' ;; - '4.4.1') echo 'e7cf7d1853dfc30c1c44f571d3919eeeedef002823b66b6a988d27e919686389' ;; - '4.5') echo '03f2a43a314ff0fb843a85ef68078e06d181c4549c1e5fb983f289382b59b5e3' ;; - '4.5.1') echo '3e2ea0d8b96605b7c528768f646e0975bd9822f06df1f04a64fd279b1a17805e' ;; - '4.6') echo '98bd5fd2b30e070517e03c51cbb32beee3e2ee1a84003a5a5d748996d4b1b915' ;; - '4.7') echo 'fca5087dc8b50c64655c000989635664a73b11b9bd3703c7d6cabd31b7dcdb04' ;; - '4.8') echo 'f3e29692a8faa94eb0b02ebf36fa263a642b3ae8694ef806c45c345b8683f1ba' ;; - '4.8.1') echo 'af334d994b5e69e439ab55b5d2b7d086da5ea6763d78054f49f147b06370ed71' ;; - '4.9') echo 'e66e69dce8173dd2004b39ba93586a184628bc6c28461bc771d6835f7f9b0d28' ;; - '4.10') echo '248cfd92104ce12c5431ddb8309cf713fe58de8e330c63176543320022f59f18' ;; - '4.10.1') echo 'e53ce3a01cf016b5d294eef20977ad4e3c13e761ac1e475f1ffad4c6141a92bd' ;; - '4.10.2') echo 'b49c6da1b2cb67a0caf6c7480630b51c70a11ca2016ff2f555eaeda863143a29' ;; - '4.10.3') echo '8626cbf206b4e201ade7b87779090690447054bc93f052954c78480fa6ed186e' ;; - '5.0') echo '6157ac9f3410bc63644625b3b3e9e96c963afd7910ae0697792db57813ee79a6' ;; - '5.1') echo '7506638a380092a0406364c79d6c87d03d23017fc25a5770379d1ce23c3fcd4d' ;; - '5.1.1') echo '4953323605c5d7b89e97d0dc7779e275bccedefcdac090aec123375eae0cc798' ;; - '5.2') echo 'ff322863250159595e93b5a4d17a6f0d21c59a1a0497c1e1cf1d53826485503f' ;; - '5.2.1') echo '748c33ff8d216736723be4037085b8dc342c6a0f309081acf682c9803e407357' ;; - '5.3') echo 'bed2bdd3955be5a09ca7e0201e9d131f194f7f6c466e1795a733733ccfb09f25' ;; - '5.3.1') echo '1c59a17a054e9c82f0dd881871c9646e943ec4c71dd52ebc6137d17f82337436' ;; - '5.4') echo 'c8c17574245ecee9ed7fe4f6b593b696d1692d1adbfef425bef9b333e3a0e8de' ;; - '5.4.1') echo '7bdbad1e4f54f13c8a78abc00c26d44dd8709d4aedb704d913fb1bb78ac025dc' ;; - '5.5') echo '8d78b2ed63e7f07ad169c1186d119761c4773e681f332cfe1901045b1b0141bc' ;; - '5.5.1') echo '222a03fcf2fcaf3691767ce9549f78ebd4a77e73f9e23a396899fb70b420cd00' ;; - '5.6') echo '15c02ef5dd3631ec02ac52e8725703e0285d9a7eecbf4e5939aa9e924604d01d' ;; - '5.6.1') echo '0986244820e4a35d32d91df2ec4b768b5ba5d6c8246753794f85159f9963ec12' ;; - '5.6.2') echo '32fce6628848f799b0ad3205ae8db67d0d828c10ffe62b748a7c0d9f4a5d9ee0' ;; - '5.6.3') echo '60a6d8f687e3e7a4bc901cc6bc3db190efae0f02f0cc697e323e0f9336f224a3' ;; - '5.6.4') echo '1f3067073041bc44554d0efe5d402a33bc3d3c93cc39ab684f308586d732a80d' ;; - '6.0') echo '5a3578b9f0bb162f5e08cf119f447dfb8fa950cedebb4d2a977e912a11a74b91' ;; - '6.0.1') echo 'd364b7098b9f2e58579a3603dc0a12a1991353ac58ed339316e6762b21efba44' ;; - '6.1') echo 'd0c43d14e1c70a48b82442f435d06186351a2d290d72afd5b8866f15e6d7038a' ;; - '6.1.1') echo '9d94e6e4a28ad328072ef6e56bce79a810494ae756751fdcedffdeaf27c093b1' ;; - '6.2') echo 'b93a5f30d01195ec201e240f029c8b42d59c24086b8d1864112c83558e23cf8a' ;; - '6.2.1') echo 'a68ca7ba57f3404c3f6fc1f70a02d3a7d78652e6b46bbfaff83fc9a17168c279' ;; - '6.2.2') echo '0f6ba231b986276d8221d7a870b4d98e0df76e6daf1f42e7c0baec5032fb7d17' ;; - '6.3') echo '038794feef1f4745c6347107b6726279d1c824f3fc634b60f86ace1e9fbd1768' ;; - '6.4') echo 'b888659f637887e759749f6226ddfcb1cb04f828c58c41279de73c463fdbacc9' ;; - '6.4.1') echo 'e58cdff0cee6d9b422dcd08ebeb3177bc44eaa09bd9a2e838ff74c408fe1cbcd' ;; - '6.5') echo '23e7d37e9bb4f8dabb8a3ea7fdee9dd0428b9b1a71d298aefd65b11dccea220f' ;; - '6.5.1') echo '50a7d30529fa939721fe9268a0205142f3f2302bcac5fb45b27a3902e58db54a' ;; - '6.6') echo 'e6f83508f0970452f56197f610d13c5f593baaf43c0e3c6a571e5967be754025' ;; - '6.6.1') echo '7873ed5287f47ca03549ab8dcb6dc877ac7f0e3d7b1eb12685161d10080910ac' ;; - '6.7') echo '8ad57759019a9233dc7dc4d1a530cefe109dc122000d57f7e623f8cf4ba9dfc4' ;; - '6.7.1') echo '3239b5ed86c3838a37d983ac100573f64c1f3fd8e1eb6c89fa5f9529b5ec091d' ;; - '6.8') echo 'e2774e6fb77c43657decde25542dea710aafd78c4022d19b196e7e78d79d8c6c' ;; - '6.8.1') echo 'fd591a34af7385730970399f473afabdb8b28d57fd97d6625c388d090039d6fd' ;; - '6.8.2') echo '8de6efc274ab52332a9c820366dd5cf5fc9d35ec7078fd70c8ec6913431ee610' ;; - '6.8.3') echo '7faa7198769f872826c8ef4f1450f839ec27f0b4d5d1e51bade63667cbccd205' ;; - '6.9') echo '765442b8069c6bee2ea70713861c027587591c6b1df2c857a23361512560894e' ;; - '6.9.1') echo '8c12154228a502b784f451179846e518733cf856efc7d45b2e6691012977b2fe' ;; - '6.9.2') echo '8b356fd8702d5ffa2e066ed0be45a023a779bba4dd1a68fd11bc2a6bdc981e8f' ;; - '6.9.3') echo 'dcf350b8ae1aa192fc299aed6efc77b43825d4fedb224c94118ae7faf5fb035d' ;; - '6.9.4') echo '3e240228538de9f18772a574e99a0ba959e83d6ef351014381acd9631781389a' ;; - '7.0') echo 'eb8b89184261025b0430f5b2233701ff1377f96da1ef5e278af6ae8bac5cc305' ;; - '7.0.1') echo 'dccda8aa069563c8ba2f6cdfd0777df0e34a5b4d15138ca8b9757e94f4e8a8cb' ;; - '7.0.2') echo '0e46229820205440b48a5501122002842b82886e76af35f0f3a069243dca4b3c' ;; - '7.1') echo '2debee19271e1b82c6e41137d78e44e6e841035230a1a169ca47fd3fb09ed87b' ;; - '7.1.1') echo 'bf8b869948901d422e9bb7d1fa61da6a6e19411baa7ad6ee929073df85d6365d' ;; - '7.2') echo 'f581709a9c35e9cb92e16f585d2c4bc99b2b1a5f85d2badbd3dc6bff59e1e6dd' ;; - '7.3') echo 'de8f52ad49bdc759164f72439a3bf56ddb1589c4cde802d3cec7d6ad0e0ee410' ;; - '7.3.1') echo '9afb3ca688fc12c761a0e9e4321e4d24e977a4a8916c8a768b1fe05ddb4d6b66' ;; - '7.3.2') echo '23b89f8eac363f5f4b8336e0530c7295c55b728a9caa5268fdd4a532610d5392' ;; - '7.3.3') echo 'b586e04868a22fd817c8971330fec37e298f3242eb85c374181b12d637f80302' ;; - '7.4') echo '8cc27038d5dbd815759851ba53e70cf62e481b87494cc97cfd97982ada5ba634' ;; - '7.4.1') echo 'e5444a57cda4a95f90b0c9446a9e1b47d3d7f69057765bfb54bd4f482542d548' ;; - '7.4.2') echo '29e49b10984e585d8118b7d0bc452f944e386458df27371b49b4ac1dec4b7fda' ;; - '7.5') echo 'cb87f222c5585bd46838ad4db78463a5c5f3d336e5e2b98dc7c0c586527351c2' ;; - '7.5.1') echo 'f6b8596b10cce501591e92f229816aa4046424f3b24d771751b06779d58c8ec4' ;; - '7.6') echo '7ba68c54029790ab444b39d7e293d3236b2632631fb5f2e012bb28b4ff669e4b' ;; - '7.6.1') echo '6147605a23b4eff6c334927a86ff3508cb5d6722cd624c97ded4c2e8640f1f87' ;; - '7.6.2') echo 'a01b6587e15fe7ed120a0ee299c25982a1eee045abd6a9dd5e216b2f628ef9ac' ;; - '7.6.3') echo '740c2e472ee4326c33bf75a5c9f5cd1e69ecf3f9b580f6e236c86d1f3d98cfac' ;; - '7.6.4') echo 'bed1da33cca0f557ab13691c77f38bb67388119e4794d113e051039b80af9bb1' ;; - '7.6.5') echo 'b812fec0edb7d27e0ae35955887bb2954536fa3e44edaf481150da058e154d9a' ;; - '7.6.6') echo '673d9776f303bc7048fc3329d232d6ebf1051b07893bd9d11616fad9a8673be0' ;; - '8.0') echo '4159b938ec734a8388ce03f52aa8f3c7ed0d31f5438622545de4f83a89b79788' ;; - '8.0.1') echo '1b6b558be93f29438d3df94b7dfee02e794b94d9aca4611a92cdb79b6b88e909' ;; - '8.0.2') echo 'ff7bf6a86f09b9b2c40bb8f48b25fc19cf2b2664fd1d220cd7ab833ec758d0d7' ;; - '8.1') echo 'a62c5f99585dd9e1f95dab7b9415a0e698fa9dd1e6c38537faa81ac078f4d23e' ;; - '8.1.1') echo 'e111cb9948407e26351227dabce49822fb88c37ee72f1d1582a69c68af2e702f' ;; - '8.2') echo '38f66cd6eef217b4c35855bb11ea4e9fbc53594ccccb5fb82dfd317ef8c2c5a3' ;; - '8.2.1') echo '03ec176d388f2aa99defcadc3ac6adf8dd2bce5145a129659537c0874dea5ad1' ;; - '8.3') echo '591855b517fc635b9e04de1d05d5e76ada3f89f5fc76f87978d1b245b4f69225' ;; - '8.4') echo '3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae' ;; - '8.5') echo '9d926787066a081739e8200858338b4a69e837c3a821a33aca9db09dd4a41026' ;; - '8.6') echo '9631d53cf3e74bfa726893aee1f8994fee4e060c401335946dba2156f440f24c' ;; - '8.7') echo '544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d' ;; - '8.8') echo 'a4b4158601f8636cdeeab09bd76afb640030bb5b144aafe261a5e8af027dc612' ;; - '8.9') echo 'd725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab' ;; - '8.10') echo '5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a' ;; - '8.10.1') echo '1541fa36599e12857140465f3c91a97409b4512501c26f9631fb113e392c5bd1' ;; - '8.10.2') echo '31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26' ;; - '8.11') echo '57dafb5c2622c6cc08b993c85b7c06956a2f53536432a30ead46166dbca0f1e9' ;; - '8.11.1') echo 'f397b287023acdba1e9f6fc5ea72d22dd63669d59ed4a289a29b1a76eee151c6' ;; - '8.12') echo '7a00d51fb93147819aab76024feece20b6b84e420694101f276be952e08bef03' ;; - '8.12.1') echo '8d97a97984f6cbd2b85fe4c60a743440a347544bf18818048e611f5288d46c94' ;; - '8.13') echo '20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78' ;; - '8.14') echo '61ad310d3c7d3e5da131b76bbf22b5a4c0786e9d892dae8c1658d4b484de3caa' ;; - '8.14.1') echo '845952a9d6afa783db70bb3b0effaae45ae5542ca2bb7929619e8af49cb634cf' ;; - '8.14.2') echo '7197a12f450794931532469d4ff21a59ea2c1cd59a3ec3f89c035c3c420a6999' ;; - '8.14.3') echo 'bd71102213493060956ec229d946beee57158dbd89d0e62b91bca0fa2c5f3531' ;; - *) exit 1 - esac -} - -contains() { - local e - for e in $2; do - [[ $e == $1 ]] && return 0; - done - return 1 -} - -# key-value pairs of what gradle version (value) each gradle plugin version -# (key) should accept. plugin versions are actually prefixes and catch sub- -# versions as well. Pairs are taken from: -# https://developer.android.com/studio/releases/gradle-plugin#updating-gradle -d_gradle_plugin_ver_k=(8.11 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2 8.1 8.0 7.4 7.3 7.2 7.1 7.0 4.2 4.1 4.0 3.6 3.5 3.4 3.3 3.2 3.1 3.0 2.3 2.2 2.1.3 2.1 2.0) -d_plugin_min_gradle_v=(8.13 8.11.1 8.11.1 8.10.2 8.9 8.7 8.7 8.6 8.4 8.2 8.0 8.0 7.5 7.4 7.3.3 7.2 7.0.2 6.7.1 6.5 6.1.1 5.6.4 5.4.1 5.1.1 4.10.1 4.6 4.4 4.1 3.3 2.14.1 2.14.1 2.12 2.12) - -# All gradle versions we know about -plugin_v=(8.14.3 8.14.2 8.14.1 8.14 8.13 8.12.1 8.12 8.11.1 8.11 8.10.2 8.10.1 8.10 8.9 8.8 8.7 8.6 8.5 8.4 8.3 8.2.1 8.2 8.1.1 8.1 8.0.2 8.0.1 8.0 7.6.6 7.6.5 7.6.4 7.6.3 7.6.2 7.6.1 7.6 7.5.1 7.5 7.4.2 7.4.1 7.4 7.3.3 7.3.2 7.3.1 7.3 7.2 7.1.1 7.1 7.0.2 7.0.1 7.0 6.9.4 6.9.3 6.9.2 6.9.1 6.9 6.8.3 6.8.2 6.8.1 6.8 6.7.1 6.7 6.6.1 6.6 6.5.1 6.5 6.4.1 6.4 6.3 6.2.2 6.2.1 6.2 6.1.1 6.1 6.0.1 6.0 5.6.4 5.6.3 5.6.2 5.6.1 5.6 5.5.1 5.5 5.4.1 5.4 5.3.1 5.3 5.2.1 5.2 5.1.1 5.1 5.0 4.10.3 4.10.2 4.10.1 4.10 4.9 4.8.1 4.8 4.7 4.6 4.5.1 4.5 4.4.1 4.4 4.3.1 4.3 4.2.1 4.2 4.1 4.0.2 4.0.1 4.0 3.5.1 3.5 3.4.1 3.4 3.3 3.2.1 3.2 3.1 3.0 2.14.1 2.14 2.13 2.12 2.11 2.10 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2.1 2.2 2.1 2.0 1.12 1.11 1.10 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9.2 0.9.1 0.9 0.8 0.7) - -v_all=${plugin_v[@]} - -# Earliest file takes priority -# Last key takes priority if there are duplicates (matching java.util.Properties) -for f in {.,..,../..}/gradle/wrapper/gradle-wrapper.properties; do - [[ -f $f ]] || continue - while IFS='' read -r line || [ -n "$line" ]; do - line=$(printf "$line" | tr -d '\r') # strip Windows linefeeds - if [[ $line == 'distributionUrl='* ]]; then - wrapper_ver=${line#*/gradle-} - wrapper_ver=${wrapper_ver%-*.zip} - fi - done < $f - [[ -n $wrapper_ver ]] && break -done - -if [[ -n $wrapper_ver ]]; then - v_found=$wrapper_ver - echo "Found $v_found via distributionUrl" - run_gradle -fi - -# Earliest takes priority -for f in {.,..}/build.gradle{,.kts}; do - [[ -f $f ]] || continue - while IFS='' read -r line || [ -n "$line" ]; do - line=$(printf "$line" | tr -d '\r') # strip Windows linefeeds - if [[ -z "$plugin_pver" && $line == *'com.android.tools.build:gradle:'* ]]; then - plugin_pver=${line#*[\'\"]com.android.tools.build:gradle:} - plugin_pver=${plugin_pver%[\'\"]*} - elif [[ -z "$wrapper_ver" && $line == *'gradleVersion = '* ]]; then - wrapper_ver=${line#*gradleVersion*=*[\'\"]} - wrapper_ver=${wrapper_ver%[\'\"]*} - fi - done < $f -done - -if [[ -n $wrapper_ver ]]; then - v_found=$wrapper_ver - echo "Found $v_found via gradleVersion" - run_gradle -fi - -if [[ -n $plugin_pver ]]; then - i=0 - match=false - for k in "${d_gradle_plugin_ver_k[@]}"; do - if [[ $plugin_pver == ${k}* ]]; then - plugin_ver=${d_plugin_min_gradle_v[$i]} - match=true - break - fi - let i++ - done - if $match; then - v_found=$plugin_ver - echo "Found $v_found via gradle plugin version $k" - fi -fi - -# Find the highest version available -for v in ${plugin_v[*]}; do - if contains $v "${v_all[*]}"; then - v_def=$v - break - fi -done - -if [[ -z $v_found ]]; then - echo "No suitable gradle version found - defaulting to $v_def" - v_found=$v_def -fi - -run_gradle diff --git a/hooks/pre-commit b/hooks/pre-commit index 039c1b65..a147e689 100755 --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -11,7 +11,7 @@ if [ -z "$files" ]; then PY_FILES="fdroid makebuildserver setup.py fdroidserver/*.py examples/*.py tests/*-release-checksums.py" PY_TEST_FILES="tests/test_*.py" SH_FILES="hooks/pre-commit" - BASH_FILES="gradlew-fdroid jenkins-build-all jenkins-setup-build-environment jenkins-test completion/bash-completion buildserver/provision-*" + BASH_FILES="jenkins-build-all jenkins-setup-build-environment jenkins-test completion/bash-completion buildserver/provision-*" RB_FILES="buildserver/Vagrantfile" YML_FILES=".*.yml .yamllint */*.yml */*.yaml" else diff --git a/tests/gradle-release-checksums.py b/tests/gradle-release-checksums.py index 7b6ab9b0..8bdd15a0 100755 --- a/tests/gradle-release-checksums.py +++ b/tests/gradle-release-checksums.py @@ -62,32 +62,6 @@ for version in sorted(versions.keys()): with open('makebuildserver', 'w') as fp: fp.write(makebuildserver_current) -# write out update to gradlew-fdroid -with open('gradlew-fdroid') as fp: - gradlew_fdroid = fp.read() -current = '' -get_sha_pat = re.compile(r""" +'([0-9][0-9.]+[0-9])'\)\s+echo '([0-9a-f]{64})' ;;\n""") -for m in get_sha_pat.finditer(gradlew_fdroid): - current += m.group() - checksum = m.group(2) - if checksum != versions[m.group(1)]: - print(Fore.RED - + 'ERROR: checksum mismatch:', checksum, versions[m.group(1)] - + Style.RESET_ALL) - errors += 1 -new = '' -for version in sorted(versions.keys(), key=Version): - sha256 = versions[version] - spaces = '' - for i in range(6 - len(version)): - spaces += ' ' - new += """ '%s')%s echo '%s' ;;\n""" % (version, spaces, sha256) -gradlew_fdroid = gradlew_fdroid.replace(current, new) -plugin_v = ' '.join(sorted(versions.keys(), key=Version, reverse=True)) -plugin_v_pat = re.compile(r'\nplugin_v=\(([0-9. ]+)\)') -with open('gradlew-fdroid', 'w') as fp: - fp.write(plugin_v_pat.sub('\nplugin_v=(%s)' % plugin_v, gradlew_fdroid)) - p = subprocess.run(['git', '--no-pager', 'diff']) errors += p.returncode sys.exit(errors) diff --git a/tests/test_gradlew-fdroid b/tests/test_gradlew-fdroid deleted file mode 100755 index 26d9bf5b..00000000 --- a/tests/test_gradlew-fdroid +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/bash - -red='\033[0;31m' -green='\033[0;32m' -nocolor='\033[0m' - -TEST_VALUE='HELLO WORLD!' - -run_test() { - cd $source_files/$1 - printf "\n${1}:\n" - if ($basedir/gradlew-fdroid 2>/dev/null || true) | grep -Fo "$2"; then - printf "${green}passed: $1\n" - else - printf "${red}ERROR: $2 not found in $1\n" - ((exit_value++)) - fi - printf $nocolor -} - -download_cache_test() { - if $basedir/gradlew-fdroid helloWorld 2>/dev/null | grep -F "$TEST_VALUE"; then - printf "${green}passed: $1\n" - else - printf "${red}ERROR: \n" - $basedir/gradlew-fdroid helloWorld - ((exit_value++)) - fi - printf $nocolor -} - -exit_value=0 -basedir=$(cd $(dirname $0)/..; pwd) -source_files=$basedir/tests/source-files -export https_proxy=127.7.7.7:7 # fake proxy to block downloading - -run_test osmandapp/osmand 2.2.1 -run_test com.integreight.onesheeld 3.3 -run_test se.manyver/android 5.5 -run_test yuriykulikov/AlarmClock 5.1.1 - -printf "\n\nforce test files to have Windows linefeeds:\n" -tmpdir=`mktemp -d` -cp -a $source_files/osmandapp $source_files/yuriykulikov $tmpdir/ -awk 'sub("$", "\r")' \ - $source_files/yuriykulikov/AlarmClock/gradle/wrapper/gradle-wrapper.properties \ - > $tmpdir/yuriykulikov/AlarmClock/gradle/wrapper/gradle-wrapper.properties -awk 'sub("$", "\r")' \ - $source_files/osmandapp/osmand/build.gradle \ - > $tmpdir/osmandapp/osmand/build.gradle -source_files=$tmpdir - -run_test yuriykulikov/AlarmClock 5.1.1 -run_test osmandapp/osmand 2.2.1 - -cd $tmpdir -mkdir -p download_cache_test/gradle/wrapper -cd download_cache_test -echo 'distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip' \ - > gradle/wrapper/gradle-wrapper.properties -printf "task helloWorld {\n\tdoLast {\n\t\tprintln '$TEST_VALUE'\n\t}\n}" > build.gradle - -export GRADLE_VERSION_DIR=$tmpdir/gradle/versions -mkdir -p $GRADLE_VERSION_DIR - -unset https_proxy -printf "download, unpack, and run: " -download_cache_test 7.3 -printf "unpack and run: " -rm -rf $GRADLE_VERSION_DIR/7.3/ -download_cache_test 7.3 -printf "just run: " -download_cache_test 7.3 - -exit $exit_value From 120a1655b429100e4c0bc4560cbdda5486833af3 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sat, 26 Jul 2025 18:33:57 +0800 Subject: [PATCH 2099/2116] scanner: report all errors --- fdroidserver/common.py | 12 ++++++------ fdroidserver/scanner.py | 16 ++++++++++++++-- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 7d591ab8..ad4df2ba 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2733,17 +2733,17 @@ def getpaths_map(build_dir, globpaths): paths[p] = [r[len(str(build_dir)) + 1:] for r in glob.glob(full_path)] if not paths[p]: not_found_paths.append(p) + return paths, not_found_paths + + +def getpaths(build_dir, globpaths): + """Extend via globbing the paths from a field and return them as a set.""" + paths_map, not_found_paths = getpaths_map(build_dir, globpaths) if not_found_paths: raise FDroidException( "Some glob paths did not match any files/dirs:\n" + "\n".join(not_found_paths) ) - return paths - - -def getpaths(build_dir, globpaths): - """Extend via globbing the paths from a field and return them as a set.""" - paths_map = getpaths_map(build_dir, globpaths) paths = set() for k, v in paths_map.items(): for p in v: diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index a81912fc..37d3f896 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -750,8 +750,12 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): ] ] - scanignore = common.getpaths_map(build_dir, build.scanignore) - scandelete = common.getpaths_map(build_dir, build.scandelete) + scanignore, scanignore_not_found_paths = common.getpaths_map( + build_dir, build.scanignore + ) + scandelete, scandelete_not_found_paths = common.getpaths_map( + build_dir, build.scandelete + ) scanignore_worked = set() scandelete_worked = set() @@ -1109,11 +1113,19 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): json_per_build, ) + for p in scanignore_not_found_paths: + logging.error(_("Non-exist scanignore path: %s") % p) + count += 1 + for p in scanignore: if p not in scanignore_worked: logging.error(_('Unused scanignore path: %s') % p) count += 1 + for p in scandelete_not_found_paths: + logging.error(_("Non-exist scandelete path: %s") % p) + count += 1 + for p in scandelete: if p not in scandelete_worked: logging.error(_('Unused scandelete path: %s') % p) From 6a3758d3c4ac722458241d65bd1258d6c9008a3b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 25 Jul 2025 16:04:25 +0200 Subject: [PATCH 2100/2116] update: more accurate fastlane subdir/flavor matching This should fix Schildichat showing Element X's metadata. --- fdroidserver/update.py | 15 +++++++++++---- tests/test_update.py | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 6369a8b8..71d32952 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1148,6 +1148,7 @@ def insert_localized_app_metadata(apps): metadata// fastlane/metadata/android// + /fastlane/metadata/android// src//fastlane/metadata/android// ...as well as the /metadata// directory. @@ -1186,7 +1187,7 @@ def insert_localized_app_metadata(apps): builds = apps.get(packageName, {}).get('Builds', []) found_in_subdir = ( builds - and len(segments) > 7 + and len(segments) > 6 and segments[-4] == "fastlane" and segments[-3] == "metadata" and segments[-2] == "android" @@ -1199,12 +1200,18 @@ def insert_localized_app_metadata(apps): build_flavors = common.calculate_gradle_flavor_combination( builds[-1]['gradle'] ) + found_in_flavor = ( + len(segments) > 7 + and segments[2] == 'src' + and segments[4] == "fastlane" + and segments[3] in build_flavors + ) if ( not found_in_subdir - and len(segments) >= 5 - and segments[4] == "fastlane" - and segments[3] not in build_flavors + and not found_in_flavor + and segments[0] == 'build' + and segments[2] not in ('metadata', 'fastlane') ): logging.debug( 'Not scanning "{dir}" with unknown subdir or gradle flavor "{value}"'.format( diff --git a/tests/test_update.py b/tests/test_update.py index f17667e2..468cd813 100755 --- a/tests/test_update.py +++ b/tests/test_update.py @@ -286,6 +286,44 @@ class UpdateTest(unittest.TestCase): fdroidserver.update.insert_localized_app_metadata(apps) self.assertEqual(second_value, apps[app.id]['localized']['en-US']['name']) + def test_fastlane_with_schildichat(self): + """Test if fastlane is found in this tangle of dirs and symlinks. + + https://github.com/SchildiChat/schildichat-android-next/tree/sc_v0.10.3-ex_25_6_2 + """ + os.chdir(self.testdir) + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.update.config = config + + app = fdroidserver.metadata.App() + app.id = 'chat.schildi.android' + build_dir = f'build/{app.id}' + flavors = ['fdroid', 'sc', 'default'] + subdir = 'app' + apps = {app.id: app} + build = fdroidserver.metadata.Build() + build.versionCode = 42 + build.gradle = flavors + build.subdir = subdir + app['Builds'] = [build] + + wrong_value = 'wrong' + wrong_dir = Path(f'{build_dir}/upstream_infra/fastlane/metadata/android/en-US') + wrong_dir.mkdir(parents=True) + (wrong_dir / 'title.txt').write_text(wrong_value) + + right_value = 'right' + right_dir = Path(f'{build_dir}/metadata/en-US') + right_dir.mkdir(parents=True) + (right_dir / 'title.txt').write_text(right_value) + _fastlane = Path('.fastlane/metadata') + _fastlane.mkdir(parents=True) + os.symlink('../../metadata', _fastlane / 'android') + os.symlink('.fastlane', 'fastlane') + fdroidserver.update.insert_localized_app_metadata(apps) + self.assertEqual(right_value, apps[app.id]['localized']['en-US']['name']) + def test_fastlane_with_multi_level_subdir(self): """Test if fastlane in multi-level subdir is found.""" os.chdir(self.testdir) From 7a98650ed321d3a2294c220e8f15f7ee8b744696 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sat, 26 Jul 2025 18:40:31 +0800 Subject: [PATCH 2101/2116] Sort import ruff check --fix --select I --- docs/source/conf.py | 1 + examples/fdroid_clean_repos.py | 1 - .../fdroid_export_keystore_to_nitrokey.py | 1 + examples/fdroid_exportkeystore.py | 1 + examples/fdroid_extract_repo_pubkey.py | 1 + examples/fdroid_fetchsrclibs.py | 1 + examples/fdroid_nitrokeyimport.py | 1 + fdroidserver/__init__.py | 50 ++++++++----- fdroidserver/__main__.py | 18 ++--- fdroidserver/apksigcopier.py | 13 +++- fdroidserver/btlog.py | 13 ++-- fdroidserver/build.py | 28 +++---- fdroidserver/checkupdates.py | 26 ++++--- fdroidserver/common.py | 74 ++++++++++++------- fdroidserver/deploy.py | 25 ++++--- fdroidserver/github.py | 2 +- fdroidserver/gpgsign.py | 7 +- fdroidserver/index.py | 20 +++-- fdroidserver/init.py | 5 +- fdroidserver/install.py | 13 ++-- fdroidserver/lint.py | 3 +- fdroidserver/metadata.py | 18 ++--- fdroidserver/mirror.py | 8 +- fdroidserver/net.py | 3 +- fdroidserver/nightly.py | 12 +-- fdroidserver/publish.py | 20 +++-- fdroidserver/readmeta.py | 4 +- fdroidserver/rewritemeta.py | 10 +-- fdroidserver/signatures.py | 12 ++- fdroidserver/signindex.py | 6 +- fdroidserver/tail.py | 2 +- fdroidserver/update.py | 38 +++++----- fdroidserver/verify.py | 13 ++-- fdroidserver/vmtools.py | 10 +-- locale/pick-complete-translations.py | 4 +- tests/dump_internal_metadata_format.py | 1 - tests/extra/manual-vmtools-test.py | 6 +- tests/get-country-region-data.py | 5 +- tests/gradle-release-checksums.py | 4 +- tests/key-tricks.py | 3 +- tests/openssl-version-check-test.py | 1 + tests/shared_test_code.py | 2 - tests/test_api.py | 2 +- tests/test_build.py | 5 +- tests/test_checkupdates.py | 6 +- tests/test_common.py | 29 +++++--- tests/test_deploy.py | 3 +- tests/test_exception.py | 1 + tests/test_github.py | 3 +- tests/test_gpgsign.py | 4 +- tests/test_import_subcommand.py | 4 +- tests/test_index.py | 19 ++--- tests/test_init.py | 1 + tests/test_install.py | 1 - tests/test_integration.py | 1 + tests/test_lint.py | 4 +- tests/test_main.py | 3 +- tests/test_metadata.py | 11 +-- tests/test_net.py | 5 +- tests/test_nightly.py | 7 +- tests/test_publish.py | 10 +-- tests/test_rewritemeta.py | 3 +- tests/test_scanner.py | 1 + tests/test_signatures.py | 3 +- tests/test_signindex.py | 4 +- tests/test_update.py | 12 +-- tests/test_vcs.py | 3 +- tests/test_verify.py | 2 - 68 files changed, 342 insertions(+), 291 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 382d8feb..c20542de 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -12,6 +12,7 @@ # import os import sys + sys.path.insert(0, os.path.abspath('../../fdroidserver')) # -- Project information ----------------------------------------------------- diff --git a/examples/fdroid_clean_repos.py b/examples/fdroid_clean_repos.py index cf6259a7..6b19cacc 100644 --- a/examples/fdroid_clean_repos.py +++ b/examples/fdroid_clean_repos.py @@ -6,7 +6,6 @@ import argparse import logging from fdroidserver import _, common, metadata - from fdroidserver.exception import VCSException fdroid_summary = 'reset app VCSs to the latest version' diff --git a/examples/fdroid_export_keystore_to_nitrokey.py b/examples/fdroid_export_keystore_to_nitrokey.py index 8fa81ffe..6e920a78 100644 --- a/examples/fdroid_export_keystore_to_nitrokey.py +++ b/examples/fdroid_export_keystore_to_nitrokey.py @@ -4,6 +4,7 @@ import os from argparse import ArgumentParser + from fdroidserver import common from fdroidserver.common import FDroidPopen from fdroidserver.exception import BuildException diff --git a/examples/fdroid_exportkeystore.py b/examples/fdroid_exportkeystore.py index 435874a5..f2a16980 100644 --- a/examples/fdroid_exportkeystore.py +++ b/examples/fdroid_exportkeystore.py @@ -4,6 +4,7 @@ import os from argparse import ArgumentParser + from fdroidserver import common from fdroidserver.common import FDroidPopen from fdroidserver.exception import BuildException diff --git a/examples/fdroid_extract_repo_pubkey.py b/examples/fdroid_extract_repo_pubkey.py index f3c51767..cb5a895c 100644 --- a/examples/fdroid_extract_repo_pubkey.py +++ b/examples/fdroid_extract_repo_pubkey.py @@ -4,6 +4,7 @@ # from argparse import ArgumentParser + from fdroidserver import common, index fdroid_summary = 'export the keystore in standard PEM format' diff --git a/examples/fdroid_fetchsrclibs.py b/examples/fdroid_fetchsrclibs.py index e4a105e2..aba6f7fa 100644 --- a/examples/fdroid_fetchsrclibs.py +++ b/examples/fdroid_fetchsrclibs.py @@ -8,6 +8,7 @@ import argparse import os import pprint + from fdroidserver import _, common, metadata fdroid_summary = 'prepare the srclibs for `fdroid build --on-server`' diff --git a/examples/fdroid_nitrokeyimport.py b/examples/fdroid_nitrokeyimport.py index 9b458103..d17a6186 100644 --- a/examples/fdroid_nitrokeyimport.py +++ b/examples/fdroid_nitrokeyimport.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 from argparse import ArgumentParser + from fdroidserver import common from fdroidserver.common import FDroidPopen from fdroidserver.exception import BuildException diff --git a/fdroidserver/__init__.py b/fdroidserver/__init__.py index 9e4c197f..c4376bd6 100644 --- a/fdroidserver/__init__.py +++ b/fdroidserver/__init__.py @@ -3,7 +3,6 @@ import glob import os import sys - # support running straight from git and standard installs rootpaths = [ os.path.realpath(os.path.join(os.path.dirname(__file__), '..')), @@ -24,39 +23,52 @@ gettext.textdomain('fdroidserver') _ = gettext.gettext -from fdroidserver.exception import (FDroidException, - MetaDataException, - VerificationException) # NOQA: E402 +from fdroidserver.exception import ( + FDroidException, + MetaDataException, + VerificationException, # NOQA: E402 +) + FDroidException # NOQA: B101 MetaDataException # NOQA: B101 VerificationException # NOQA: B101 -from fdroidserver.common import (verify_apk_signature, - genkeystore as generate_keystore) # NOQA: E402 +from fdroidserver.common import genkeystore as generate_keystore # NOQA: E402 +from fdroidserver.common import verify_apk_signature + verify_apk_signature # NOQA: B101 generate_keystore # NOQA: B101 -from fdroidserver.index import (download_repo_index, - download_repo_index_v1, - download_repo_index_v2, - get_mirror_service_urls, - make as make_index) # NOQA: E402 +from fdroidserver.index import ( + download_repo_index, + download_repo_index_v1, + download_repo_index_v2, + get_mirror_service_urls, +) +from fdroidserver.index import make as make_index # NOQA: E402 + download_repo_index # NOQA: B101 download_repo_index_v1 # NOQA: B101 download_repo_index_v2 # NOQA: B101 get_mirror_service_urls # NOQA: B101 make_index # NOQA: B101 -from fdroidserver.update import (process_apk, - process_apks, - scan_apk, - scan_repo_files) # NOQA: E402 +from fdroidserver.update import ( + process_apk, + process_apks, + scan_apk, + scan_repo_files, # NOQA: E402 +) + process_apk # NOQA: B101 process_apks # NOQA: B101 scan_apk # NOQA: B101 scan_repo_files # NOQA: B101 -from fdroidserver.deploy import (update_awsbucket, - update_servergitmirrors, - update_serverwebroots, - update_serverwebroot) # NOQA: E402 +from fdroidserver.deploy import ( + update_awsbucket, + update_servergitmirrors, + update_serverwebroot, # NOQA: E402 + update_serverwebroots, +) + update_awsbucket # NOQA: B101 update_servergitmirrors # NOQA: B101 update_serverwebroots # NOQA: B101 diff --git a/fdroidserver/__main__.py b/fdroidserver/__main__.py index 14813fa1..71c39b2c 100755 --- a/fdroidserver/__main__.py +++ b/fdroidserver/__main__.py @@ -18,20 +18,20 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import re -import sys +import importlib.metadata +import logging import os import pkgutil -import logging -import importlib.metadata - -import git -import fdroidserver.common -import fdroidserver.metadata -from fdroidserver import _ +import re +import sys from argparse import ArgumentError from collections import OrderedDict +import git + +import fdroidserver.common +import fdroidserver.metadata +from fdroidserver import _ COMMANDS = OrderedDict([ ("build", _("Build a package from source")), diff --git a/fdroidserver/apksigcopier.py b/fdroidserver/apksigcopier.py index 2ab0b8c4..f36de2eb 100644 --- a/fdroidserver/apksigcopier.py +++ b/fdroidserver/apksigcopier.py @@ -68,9 +68,18 @@ import struct import sys import zipfile import zlib - from collections import namedtuple -from typing import Any, BinaryIO, Callable, Dict, Iterable, Iterator, Optional, Tuple, Union +from typing import ( + Any, + BinaryIO, + Callable, + Dict, + Iterable, + Iterator, + Optional, + Tuple, + Union, +) __version__ = "1.1.1" NAME = "apksigcopier" diff --git a/fdroidserver/btlog.py b/fdroidserver/btlog.py index df889396..7ca3ddbf 100755 --- a/fdroidserver/btlog.py +++ b/fdroidserver/btlog.py @@ -28,22 +28,21 @@ # the F-Droid client. import collections -import defusedxml.minidom -import git import glob -import os import json import logging -import requests +import os import shutil import tempfile import zipfile from argparse import ArgumentParser from typing import Optional -from . import _ -from . import common -from . import deploy +import defusedxml.minidom +import git +import requests + +from . import _, common, deploy from .exception import FDroidException diff --git a/fdroidserver/build.py b/fdroidserver/build.py index a187765b..2e716c10 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -18,31 +18,27 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import os -import shutil +import argparse import glob -import subprocess +import logging +import os import posixpath import re +import shutil +import subprocess import tarfile -import threading -import traceback -import time -import requests import tempfile -import argparse -import logging +import threading +import time +import traceback from gettext import ngettext from pathlib import Path -from . import _ -from . import common -from . import net -from . import metadata -from . import scanner -from . import vmtools +import requests + +from . import _, common, metadata, net, scanner, vmtools from .common import FDroidPopen -from .exception import FDroidException, BuildException, VCSException +from .exception import BuildException, FDroidException, VCSException try: import paramiko diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 9ed93298..cff7bcd7 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -19,28 +19,30 @@ # along with this program. If not, see . import configparser -import git +import copy +import logging import os import re -import urllib.request -import urllib.error -import time import subprocess import sys -from argparse import ArgumentParser +import time import traceback -import logging -import copy +import urllib.error import urllib.parse +import urllib.request +from argparse import ArgumentParser from pathlib import Path from typing import Optional -from . import _ -from . import common -from . import metadata -from . import net -from .exception import VCSException, NoSubmodulesException, FDroidException, MetaDataException +import git +from . import _, common, metadata, net +from .exception import ( + FDroidException, + MetaDataException, + NoSubmodulesException, + VCSException, +) # https://gitlab.com/fdroid/checkupdates-runner/-/blob/1861899262a62a4ed08fa24e5449c0368dfb7617/.gitlab-ci.yml#L36 BOT_EMAIL = 'fdroidci@bubu1.eu' diff --git a/fdroidserver/common.py b/fdroidserver/common.py index ad4df2ba..ec0079af 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -52,54 +52,58 @@ environment variable to include. """ +import ast +import base64 import copy import difflib -from typing import List import filecmp -import git import glob +import gzip +import hashlib import io import itertools +import json +import logging +import operator import os -import sys import re -import ast -import gzip import shutil +import socket import stat import subprocess -import time -import operator -import logging -import hashlib -import socket -import base64 -import zipfile +import sys import tempfile -import json -from pathlib import Path - -import defusedxml.ElementTree as XMLElementTree - +import time +import zipfile from argparse import BooleanOptionalAction -from asn1crypto import cms from base64 import urlsafe_b64encode from binascii import hexlify from datetime import datetime, timedelta, timezone +from pathlib import Path from queue import Queue +from typing import List from urllib.parse import urlparse, urlsplit, urlunparse from zipfile import ZipFile +import defusedxml.ElementTree as XMLElementTree +import git +from asn1crypto import cms + import fdroidserver.metadata from fdroidserver import _ -from fdroidserver._yaml import yaml, config_dump -from fdroidserver.exception import FDroidException, VCSException, NoSubmodulesException, \ - BuildException, VerificationException, MetaDataException -from .asynchronousfilereader import AsynchronousFileReader -from .looseversion import LooseVersion +from fdroidserver._yaml import config_dump, yaml +from fdroidserver.exception import ( + BuildException, + FDroidException, + MetaDataException, + NoSubmodulesException, + VCSException, + VerificationException, +) from . import apksigcopier, common - +from .asynchronousfilereader import AsynchronousFileReader +from .looseversion import LooseVersion # The path to this fdroidserver distribution FDROID_PATH = os.path.realpath(os.path.join(os.path.dirname(__file__), '..')) @@ -2904,9 +2908,9 @@ def is_debuggable_or_testOnly(apkfile): return False try: # these were moved in androguard 4.0 - from androguard.core.axml import AXMLParser, format_value, START_TAG + from androguard.core.axml import START_TAG, AXMLParser, format_value except ImportError: - from androguard.core.bytecodes.axml import AXMLParser, format_value, START_TAG + from androguard.core.bytecodes.axml import START_TAG, AXMLParser, format_value _androguard_logging_level() with ZipFile(apkfile) as apk: @@ -2978,9 +2982,23 @@ def get_apk_id_androguard(apkfile): try: # these were moved in androguard 4.0 - from androguard.core.axml import AXMLParser, format_value, START_TAG, END_TAG, TEXT, END_DOCUMENT + from androguard.core.axml import ( + END_DOCUMENT, + END_TAG, + START_TAG, + TEXT, + AXMLParser, + format_value, + ) except ImportError: - from androguard.core.bytecodes.axml import AXMLParser, format_value, START_TAG, END_TAG, TEXT, END_DOCUMENT + from androguard.core.bytecodes.axml import ( + END_DOCUMENT, + END_TAG, + START_TAG, + TEXT, + AXMLParser, + format_value, + ) _androguard_logging_level() appid = None diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index cc7d6c52..b4f98f34 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -16,28 +16,28 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import sys import glob import hashlib import json +import logging import os +import pathlib import re +import shutil import subprocess +import sys import time import urllib -from typing import Dict, List -from git import Repo -import yaml from argparse import ArgumentParser -import logging -import pathlib -import shutil +from typing import Dict, List + import git +import yaml +from git import Repo + import fdroidserver.github -from . import _ -from . import common -from . import index +from . import _, common, index from .exception import FDroidException config = None @@ -349,8 +349,8 @@ def update_awsbucket_libcloud(repo_section, is_index_only=False): import libcloud.security libcloud.security.VERIFY_SSL_CERT = True - from libcloud.storage.types import Provider, ContainerDoesNotExistError from libcloud.storage.providers import get_driver + from libcloud.storage.types import ContainerDoesNotExistError, Provider if not config.get('awsaccesskeyid') or not config.get('awssecretkey'): raise FDroidException( @@ -854,9 +854,10 @@ def upload_to_android_observatory(repo_section): def upload_apk_to_android_observatory(path): # depend on requests and lxml only if users enable AO import requests - from . import net from lxml.html import fromstring + from . import net + apkfilename = os.path.basename(path) r = requests.post( 'https://androidobservatory.org/', diff --git a/fdroidserver/github.py b/fdroidserver/github.py index 0a6844d9..34a3ee53 100644 --- a/fdroidserver/github.py +++ b/fdroidserver/github.py @@ -18,8 +18,8 @@ import json import pathlib -import urllib.request import urllib.parse +import urllib.request class GithubApi: diff --git a/fdroidserver/gpgsign.py b/fdroidserver/gpgsign.py index 4ba6ebd5..4341cb36 100644 --- a/fdroidserver/gpgsign.py +++ b/fdroidserver/gpgsign.py @@ -16,14 +16,13 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import os import glob -from argparse import ArgumentParser import logging +import os import time +from argparse import ArgumentParser -from . import _ -from . import common +from . import _, common from .common import FDroidPopen from .exception import FDroidException diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 86394d7c..3482f15c 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -30,6 +30,7 @@ these installed on the signing server. """ +import calendar import collections import hashlib import json @@ -41,20 +42,27 @@ import sys import tempfile import urllib.parse import zipfile -import calendar from binascii import hexlify, unhexlify from datetime import datetime, timezone from pathlib import Path from xml.dom.minidom import Document -from . import _ -from . import common -from . import metadata -from . import signindex -from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME, CONFIG_CONFIG_NAME, MIRRORS_CONFIG_NAME, RELEASECHANNELS_CONFIG_NAME, DEFAULT_LOCALE, FDroidPopen, FDroidPopenBytes, load_publish_signer_fingerprints from fdroidserver._yaml import yaml +from fdroidserver.common import ( + ANTIFEATURES_CONFIG_NAME, + CATEGORIES_CONFIG_NAME, + CONFIG_CONFIG_NAME, + DEFAULT_LOCALE, + MIRRORS_CONFIG_NAME, + RELEASECHANNELS_CONFIG_NAME, + FDroidPopen, + FDroidPopenBytes, + load_publish_signer_fingerprints, +) from fdroidserver.exception import FDroidException, VerificationException +from . import _, common, metadata, signindex + def make(apps, apks, repodir, archive): """Generate the repo index files. diff --git a/fdroidserver/init.py b/fdroidserver/init.py index a5575fea..39b18c1a 100644 --- a/fdroidserver/init.py +++ b/fdroidserver/init.py @@ -19,16 +19,15 @@ # along with this program. If not, see . import glob +import logging import os import re import shutil import socket import sys from argparse import ArgumentParser -import logging -from . import _ -from . import common +from . import _, common from .exception import FDroidException config = {} diff --git a/fdroidserver/install.py b/fdroidserver/install.py index 74754520..8c1dc948 100644 --- a/fdroidserver/install.py +++ b/fdroidserver/install.py @@ -17,24 +17,21 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import sys -import os import glob import locale import logging +import os +import sys import termios import tty - -import defusedxml.ElementTree as XMLElementTree - from argparse import ArgumentParser, BooleanOptionalAction from pathlib import Path from urllib.parse import urlencode, urlparse, urlunparse -from . import _ -from . import common, github, index, net -from .exception import FDroidException +import defusedxml.ElementTree as XMLElementTree +from . import _, common, github, index, net +from .exception import FDroidException DEFAULT_IPFS_GATEWAYS = ("https://gateway.ipfs.io/ipfs/",) MAVEN_CENTRAL_MIRRORS = [ diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index cb5ead84..f384cb62 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -24,9 +24,10 @@ import urllib.parse from argparse import ArgumentParser from pathlib import Path -from . import _, common, metadata, rewritemeta from fdroidserver._yaml import yaml +from . import _, common, metadata, rewritemeta + config = None diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 47fbdca7..0d9195be 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -18,19 +18,19 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from pathlib import Path -import math -import platform -import os -import re import logging -import ruamel.yaml +import math +import os +import platform +import re from collections import OrderedDict +from pathlib import Path -from . import common -from . import _ -from .exception import MetaDataException +import ruamel.yaml + +from . import _, common from ._yaml import yaml +from .exception import MetaDataException srclibs = None warnings_action = None diff --git a/fdroidserver/mirror.py b/fdroidserver/mirror.py index 80f8394f..b06df3b1 100644 --- a/fdroidserver/mirror.py +++ b/fdroidserver/mirror.py @@ -7,13 +7,10 @@ import posixpath import socket import subprocess import sys -from argparse import ArgumentParser import urllib.parse +from argparse import ArgumentParser -from . import _ -from . import common -from . import index -from . import update +from . import _, common, index, update def _run_wget(path, urls, verbose=False): @@ -133,6 +130,7 @@ def main(): import io import json import zipfile + from . import net url = _append_to_url_path(section, 'index-v1.jar') diff --git a/fdroidserver/net.py b/fdroidserver/net.py index 1ec7d096..fe097fd5 100644 --- a/fdroidserver/net.py +++ b/fdroidserver/net.py @@ -21,10 +21,11 @@ import copy import logging import os import random -import requests import tempfile import time import urllib + +import requests import urllib3 from requests.adapters import HTTPAdapter, Retry diff --git a/fdroidserver/nightly.py b/fdroidserver/nightly.py index 3d57c452..372390ea 100644 --- a/fdroidserver/nightly.py +++ b/fdroidserver/nightly.py @@ -19,25 +19,25 @@ import base64 import datetime -import git import hashlib import inspect import logging import os -import paramiko import platform import shutil import ssl import subprocess import sys import tempfile -import yaml -from urllib.parse import urlparse from argparse import ArgumentParser from typing import Optional +from urllib.parse import urlparse -from . import _ -from . import common +import git +import paramiko +import yaml + +from . import _, common from .exception import VCSException # hard coded defaults for Android ~/.android/debug.keystore files diff --git a/fdroidserver/publish.py b/fdroidserver/publish.py index 4c0bd791..42945166 100644 --- a/fdroidserver/publish.py +++ b/fdroidserver/publish.py @@ -28,23 +28,21 @@ mostly reports success by moving an APK from unsigned/ to repo/ """ -import sys +import glob +import hashlib +import json +import logging import os import re import shutil -import glob -import hashlib -from argparse import ArgumentParser -from collections import OrderedDict -import logging -from gettext import ngettext -import json +import sys import time import zipfile +from argparse import ArgumentParser +from collections import OrderedDict +from gettext import ngettext -from . import _ -from . import common -from . import metadata +from . import _, common, metadata from .common import FDroidPopen from .exception import BuildException, FDroidException diff --git a/fdroidserver/readmeta.py b/fdroidserver/readmeta.py index b8049a9f..b3ef7c3b 100644 --- a/fdroidserver/readmeta.py +++ b/fdroidserver/readmeta.py @@ -17,8 +17,8 @@ # along with this program. If not, see . from argparse import ArgumentParser -from . import common -from . import metadata + +from . import common, metadata def main(): diff --git a/fdroidserver/rewritemeta.py b/fdroidserver/rewritemeta.py index 9f3316b4..4bbe810d 100644 --- a/fdroidserver/rewritemeta.py +++ b/fdroidserver/rewritemeta.py @@ -17,16 +17,14 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from argparse import ArgumentParser -import logging import io -import tempfile +import logging import shutil +import tempfile +from argparse import ArgumentParser from pathlib import Path -from . import _ -from . import common -from . import metadata +from . import _, common, metadata config = None diff --git a/fdroidserver/signatures.py b/fdroidserver/signatures.py index 486e5d18..00c9d264 100644 --- a/fdroidserver/signatures.py +++ b/fdroidserver/signatures.py @@ -15,15 +15,13 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import logging +import os +import re +import sys from argparse import ArgumentParser -import re -import os -import sys -import logging - -from . import _ -from . import common +from . import _, common from .exception import FDroidException diff --git a/fdroidserver/signindex.py b/fdroidserver/signindex.py index 4ca2d569..47cd5ec2 100644 --- a/fdroidserver/signindex.py +++ b/fdroidserver/signindex.py @@ -17,15 +17,13 @@ # along with this program. If not, see . import json +import logging import os import time import zipfile from argparse import ArgumentParser -import logging -from . import _ -from . import common -from . import metadata +from . import _, common, metadata from .exception import FDroidException config = None diff --git a/fdroidserver/tail.py b/fdroidserver/tail.py index 8107f10d..2bea3504 100644 --- a/fdroidserver/tail.py +++ b/fdroidserver/tail.py @@ -28,8 +28,8 @@ Example import os import sys -import time import threading +import time class Tail(object): diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 71d32952..6af82ab2 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -20,26 +20,27 @@ # along with this program. If not, see . import argparse +import copy import filecmp -import sys -import os -import shutil import glob -import logging -import re -import socket -import warnings -import zipfile import hashlib import json +import logging +import os +import re +import shutil +import socket +import sys import time -import yaml -import copy +import warnings +import zipfile +from argparse import ArgumentParser +from datetime import datetime, timezone +from pathlib import Path + import asn1crypto.cms import defusedxml.ElementTree as ElementTree -from datetime import datetime, timezone -from argparse import ArgumentParser -from pathlib import Path +import yaml try: from yaml import CSafeLoader as SafeLoader @@ -49,14 +50,13 @@ except ImportError: import collections from binascii import hexlify -from . import _ -from . import common -from . import metadata -from .common import DEFAULT_LOCALE -from .exception import BuildException, FDroidException, VerificationException +from PIL import Image, PngImagePlugin + import fdroidserver.index -from PIL import Image, PngImagePlugin +from . import _, common, metadata +from .common import DEFAULT_LOCALE +from .exception import BuildException, FDroidException, VerificationException if hasattr(Image, 'DecompressionBombWarning'): warnings.simplefilter('error', Image.DecompressionBombWarning) diff --git a/fdroidserver/verify.py b/fdroidserver/verify.py index 46963bb4..897463ae 100644 --- a/fdroidserver/verify.py +++ b/fdroidserver/verify.py @@ -16,18 +16,17 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import sys -import os import glob import json import logging -import requests +import os +import sys from argparse import ArgumentParser from collections import OrderedDict -from . import _ -from . import common -from . import net +import requests + +from . import _, common, net from .exception import FDroidException config = None @@ -58,8 +57,8 @@ def _add_diffoscope_info(d): ] d['diffoscope']['External-Tools-Required'] = external_tools - from diffoscope.tools import OS_NAMES, get_current_os from diffoscope.external_tools import EXTERNAL_TOOLS + from diffoscope.tools import OS_NAMES, get_current_os current_os = get_current_os() os_list = [current_os] if (current_os in OS_NAMES) else iter(OS_NAMES) diff --git a/fdroidserver/vmtools.py b/fdroidserver/vmtools.py index 0251e179..2ba92ad6 100644 --- a/fdroidserver/vmtools.py +++ b/fdroidserver/vmtools.py @@ -16,16 +16,16 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from os.path import isdir, isfile, basename, abspath, expanduser -import os import json +import logging +import os import shutil import subprocess import textwrap -import logging -from .common import FDroidException - import threading +from os.path import abspath, basename, expanduser, isdir, isfile + +from .common import FDroidException lock = threading.Lock() diff --git a/locale/pick-complete-translations.py b/locale/pick-complete-translations.py index 8c4d377b..be11426c 100755 --- a/locale/pick-complete-translations.py +++ b/locale/pick-complete-translations.py @@ -2,13 +2,13 @@ # # add completed translations from weblate to MANIFEST.in -import git import json import os import re -import requests import subprocess +import git +import requests projectbasedir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) localedir = os.path.join(projectbasedir, 'locale') diff --git a/tests/dump_internal_metadata_format.py b/tests/dump_internal_metadata_format.py index f9763ebc..ffc72059 100755 --- a/tests/dump_internal_metadata_format.py +++ b/tests/dump_internal_metadata_format.py @@ -25,7 +25,6 @@ import sys from argparse import ArgumentParser import git - import yaml localmodule = os.path.realpath( diff --git a/tests/extra/manual-vmtools-test.py b/tests/extra/manual-vmtools-test.py index 0f0c745b..2f01c9ff 100755 --- a/tests/extra/manual-vmtools-test.py +++ b/tests/extra/manual-vmtools-test.py @@ -4,12 +4,12 @@ # that run in the buildserver setup. It is not really maintained, but # is still here as a kind of reference. +import inspect +import logging import os import sys -import logging -import textwrap import tempfile -import inspect +import textwrap from argparse import ArgumentParser localmodule = os.path.realpath( diff --git a/tests/get-country-region-data.py b/tests/get-country-region-data.py index f0f52e4b..240d70b2 100755 --- a/tests/get-country-region-data.py +++ b/tests/get-country-region-data.py @@ -5,11 +5,12 @@ import collections import os import re -import requests -import requests_cache import sys import tempfile +import requests +import requests_cache + def main(): # we want all the data diff --git a/tests/gradle-release-checksums.py b/tests/gradle-release-checksums.py index 8bdd15a0..53ceb1a5 100755 --- a/tests/gradle-release-checksums.py +++ b/tests/gradle-release-checksums.py @@ -2,13 +2,13 @@ import os import re -import requests import subprocess import sys + +import requests from colorama import Fore, Style from packaging.version import Version - checksums = None versions = dict() diff --git a/tests/key-tricks.py b/tests/key-tricks.py index 7fc0f3ea..a01bf0bf 100755 --- a/tests/key-tricks.py +++ b/tests/key-tricks.py @@ -1,9 +1,10 @@ #!/usr/bin/env python3 import os -import fdroidserver import shutil import sys + +import fdroidserver from fdroidserver import common, nightly if os.getenv('CI') is None: diff --git a/tests/openssl-version-check-test.py b/tests/openssl-version-check-test.py index d4022126..69a1ff59 100755 --- a/tests/openssl-version-check-test.py +++ b/tests/openssl-version-check-test.py @@ -6,6 +6,7 @@ # This is used in update.has_known_vulnerability() import re + import requests # this list was generated using: diff --git a/tests/shared_test_code.py b/tests/shared_test_code.py index 59f515a7..3e34900b 100644 --- a/tests/shared_test_code.py +++ b/tests/shared_test_code.py @@ -20,10 +20,8 @@ import sys import tempfile import unittest import unittest.mock - from pathlib import Path - GP_FINGERPRINT = 'B7C2EEFD8DAC7806AF67DFCD92EB18126BC08312A7F2D6F3862E46013C7A6135' diff --git a/tests/test_api.py b/tests/test_api.py index 6cb9a53b..ba18caa6 100755 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -8,8 +8,8 @@ from unittest import mock import fdroidserver from fdroidserver import common, signindex -from .shared_test_code import GP_FINGERPRINT, mkdtemp +from .shared_test_code import GP_FINGERPRINT, mkdtemp basedir = Path(__file__).parent diff --git a/tests/test_build.py b/tests/test_build.py index f7558c8c..578837ed 100755 --- a/tests/test_build.py +++ b/tests/test_build.py @@ -6,15 +6,16 @@ import sys import tempfile import textwrap import unittest -import yaml from pathlib import Path from unittest import mock -from .shared_test_code import TmpCwd, mkdtemp +import yaml import fdroidserver.build import fdroidserver.common +from .shared_test_code import TmpCwd, mkdtemp + class FakeProcess: output = 'fake output' diff --git a/tests/test_checkupdates.py b/tests/test_checkupdates.py index 4cc76db3..107caf29 100755 --- a/tests/test_checkupdates.py +++ b/tests/test_checkupdates.py @@ -1,19 +1,19 @@ #!/usr/bin/env python3 -import git import os import platform import shutil import tempfile import time import unittest -from unittest import mock from pathlib import Path +from unittest import mock + +import git import fdroidserver import fdroidserver.checkupdates - basedir = Path(__file__).parent diff --git a/tests/test_common.py b/tests/test_common.py index 57cbb416..de08a5d7 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -1,40 +1,44 @@ #!/usr/bin/env python3 import difflib -import git import glob +import gzip import importlib import json import logging import os import re -import ruamel.yaml import shutil import subprocess import sys import tempfile +import textwrap import time import unittest -import textwrap -import gzip from argparse import ArgumentParser from datetime import datetime, timezone -from zipfile import BadZipFile, ZipFile -from unittest import mock from pathlib import Path +from unittest import mock +from zipfile import BadZipFile, ZipFile +import git +import ruamel.yaml import fdroidserver -import fdroidserver.signindex import fdroidserver.common import fdroidserver.metadata -from .shared_test_code import TmpCwd, mkdtemp, mkdir_testfiles +import fdroidserver.signindex +from fdroidserver._yaml import config_dump, yaml, yaml_dumper from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME -from fdroidserver._yaml import yaml, yaml_dumper, config_dump -from fdroidserver.exception import FDroidException, VCSException,\ - MetaDataException, VerificationException +from fdroidserver.exception import ( + FDroidException, + MetaDataException, + VCSException, + VerificationException, +) from fdroidserver.looseversion import LooseVersion +from .shared_test_code import TmpCwd, mkdir_testfiles, mkdtemp basedir = Path(__file__).parent @@ -2415,9 +2419,10 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): @mock.patch('sdkmanager._generate_package_xml', lambda a, b, c: None) def test_auto_install_ndk_mock_dl(self): """Test NDK installs by actually calling sdkmanager""" - import sdkmanager import importlib.metadata + import sdkmanager + sdkmanager_version = LooseVersion(importlib.metadata.version('sdkmanager')) if sdkmanager_version < LooseVersion('0.6.4'): raise unittest.SkipTest('needs fdroid sdkmanager >= 0.6.4') diff --git a/tests/test_deploy.py b/tests/test_deploy.py index b821725c..60d157c3 100755 --- a/tests/test_deploy.py +++ b/tests/test_deploy.py @@ -11,7 +11,8 @@ from unittest import mock import git import fdroidserver -from .shared_test_code import TmpCwd, mkdtemp, VerboseFalseOptions + +from .shared_test_code import TmpCwd, VerboseFalseOptions, mkdtemp basedir = Path(__file__).parent diff --git a/tests/test_exception.py b/tests/test_exception.py index accc6653..01a6cd46 100755 --- a/tests/test_exception.py +++ b/tests/test_exception.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 import unittest + import fdroidserver diff --git a/tests/test_github.py b/tests/test_github.py index 39514c5d..f30ce0bb 100755 --- a/tests/test_github.py +++ b/tests/test_github.py @@ -3,9 +3,10 @@ import unittest import unittest.mock -from .shared_test_code import mock_urlopen import fdroidserver +from .shared_test_code import mock_urlopen + class GithubApiTest(unittest.TestCase): def test__init(self): diff --git a/tests/test_gpgsign.py b/tests/test_gpgsign.py index f73b217e..84634874 100755 --- a/tests/test_gpgsign.py +++ b/tests/test_gpgsign.py @@ -5,11 +5,11 @@ import os import shutil import tempfile import unittest - -from fdroidserver import common, gpgsign from pathlib import Path from unittest.mock import MagicMock, patch +from fdroidserver import common, gpgsign + basedir = Path(__file__).parent diff --git a/tests/test_import_subcommand.py b/tests/test_import_subcommand.py index 05e2c379..530e10fb 100755 --- a/tests/test_import_subcommand.py +++ b/tests/test_import_subcommand.py @@ -13,11 +13,11 @@ import git import requests import yaml -from .shared_test_code import TmpCwd, mkdtemp, VerboseFalseOptions - import fdroidserver import fdroidserver.import_subcommand +from .shared_test_code import TmpCwd, VerboseFalseOptions, mkdtemp + basedir = Path(__file__).parent logging.basicConfig(level=logging.DEBUG) diff --git a/tests/test_index.py b/tests/test_index.py index b4973d79..c8ff5cbe 100755 --- a/tests/test_index.py +++ b/tests/test_index.py @@ -3,21 +3,22 @@ import copy import datetime import glob -import os -import unittest -from pathlib import Path -import yaml -import zipfile -from unittest.mock import patch -import requests -import tempfile import json +import os import shutil +import tempfile +import unittest +import zipfile +from pathlib import Path +from unittest.mock import patch + +import requests +import yaml import fdroidserver from fdroidserver import common, index, publish, signindex, update -from .shared_test_code import GP_FINGERPRINT, TmpCwd, mkdtemp +from .shared_test_code import GP_FINGERPRINT, TmpCwd, mkdtemp basedir = Path(__file__).parent diff --git a/tests/test_init.py b/tests/test_init.py index 179f06c7..a038493b 100755 --- a/tests/test_init.py +++ b/tests/test_init.py @@ -8,6 +8,7 @@ import unittest import fdroidserver.common import fdroidserver.init + from .shared_test_code import mkdtemp basedir = pathlib.Path(__file__).parent diff --git a/tests/test_install.py b/tests/test_install.py index b4e404d5..aa239d4d 100755 --- a/tests/test_install.py +++ b/tests/test_install.py @@ -3,7 +3,6 @@ import os import textwrap import unittest - from pathlib import Path from unittest.mock import Mock, patch diff --git a/tests/test_integration.py b/tests/test_integration.py index 76a7e82b..6d757b1e 100755 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -18,6 +18,7 @@ except ModuleNotFoundError: from androguard.core.apk import get_apkid from fdroidserver._yaml import yaml, yaml_dumper + from .shared_test_code import mkdir_testfiles # TODO: port generic tests that use index.xml to index-v2 (test that diff --git a/tests/test_lint.py b/tests/test_lint.py index f0bf6b4d..4b5d7dfe 100755 --- a/tests/test_lint.py +++ b/tests/test_lint.py @@ -9,13 +9,13 @@ import unittest from pathlib import Path from unittest import mock -from .shared_test_code import mkdtemp - import fdroidserver.common import fdroidserver.lint import fdroidserver.metadata from fdroidserver._yaml import config_dump +from .shared_test_code import mkdtemp + basedir = Path(__file__).parent diff --git a/tests/test_main.py b/tests/test_main.py index 50fda3e2..68984088 100755 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -2,12 +2,13 @@ import os import pkgutil +import tempfile import textwrap import unittest -import tempfile from unittest import mock import fdroidserver.__main__ + from .shared_test_code import TmpCwd, TmpPyPath diff --git a/tests/test_metadata.py b/tests/test_metadata.py index 8c3f7591..f9e2ba75 100755 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -4,22 +4,23 @@ import copy import io import os import random -import ruamel.yaml import shutil -import unittest import tempfile import textwrap +import unittest from collections import OrderedDict from pathlib import Path from unittest import mock +import ruamel.yaml + import fdroidserver from fdroidserver import metadata -from fdroidserver.exception import MetaDataException -from fdroidserver.common import DEFAULT_LOCALE from fdroidserver._yaml import yaml -from .shared_test_code import TmpCwd, mkdtemp +from fdroidserver.common import DEFAULT_LOCALE +from fdroidserver.exception import MetaDataException +from .shared_test_code import TmpCwd, mkdtemp basedir = Path(__file__).parent diff --git a/tests/test_net.py b/tests/test_net.py index 581edcfb..beacd9af 100755 --- a/tests/test_net.py +++ b/tests/test_net.py @@ -2,16 +2,17 @@ import os import random -import requests import socket import tempfile import threading import time import unittest +from pathlib import Path from unittest.mock import MagicMock, patch +import requests + from fdroidserver import net -from pathlib import Path class RetryServer: diff --git a/tests/test_nightly.py b/tests/test_nightly.py index 681df96d..fb1614b7 100755 --- a/tests/test_nightly.py +++ b/tests/test_nightly.py @@ -2,19 +2,18 @@ import os import platform -import requests import shutil import subprocess import tempfile import time import unittest -import yaml - from pathlib import Path from unittest.mock import patch -from fdroidserver import common, exception, index, nightly +import requests +import yaml +from fdroidserver import common, exception, index, nightly DEBUG_KEYSTORE = '/u3+7QAAAAIAAAABAAAAAQAPYW5kcm9pZGRlYnVna2V5AAABNYhAuskAAAK8MIICuDAOBgorBgEEASoCEQEBBQAEggKkqRnFlhidQmVff83bsAeewXPIsF0jiymzJnvrnUAQtCK0MV9uZonu37Mrj/qKLn56mf6QcvEoKvpCstZxzftgYYpAHWMVLM+hy2Z707QZEHlY7Ukppt8DItj+dXkeqGt7f8KzOb2AQwDbt9lm1fJb+MefLowTaubtvrLMcKIne43CbCu2D8HyN7RPWpEkVetA2Qgr5W4sa3tIUT80afqo9jzwJjKCspuxY9A1M8EIM3/kvyLo2B9r0cuWwRjYZXJ6gmTYI2ARNz0KQnCZUok14NDg+mZTb1B7AzRfb0lfjbA6grbzuAL+WaEpO8/LgGfuOh7QBZBT498TElOaFfQ9toQWA79wAmrQCm4OoFukpPIy2m/l6VjJSmlK5Q+CMOl/Au7OG1sUUCTvPaIr0XKnsiwDJ7a71n9garnPWHkvuWapSRCzCNgaUoGQjB+fTMJFFrwT8P1aLfM6onc3KNrDStoQZuYe5ngCLlNS56bENkVGvJBfdkboxtHZjqDXXON9jWGSOI527J3o2D5sjSVyx3T9XPrsL4TA/nBtdU+c/+M6aoASZR2VymzAKdMrGfj9kE5GXp8vv2vkJj9+OJ4Jm5yeczocc/Idtojjb1yg+sq1yY8kAQxgezpY1rpgi2jF3tSN01c23DNvAaSJLJX2ZuH8sD40ACc80Y1Qp1nUTdpwBZUeaeNruBwx4PHU8GnC71FwtiUpwNs0OoSl0pgDUJ3ODC5bs8B5QmW1wu1eg7I4mMSmCsNGW6VN3sFcu+WEqnmTxPoZombdFZKxsr2oq359Nn4bJ6Uc9PBz/sXsns7Zx1vND/oK/Jv5Y269UVAMeKX/eGpfnxzagW3tqGbOu12C2p9Azo5VxiU2fG/tmk2PjaG5hV/ywReco7I6C1p8OWM2fwAAAAEABVguNTA5AAAB6TCCAeUwggFOoAMCAQICBE89gTUwDQYJKoZIhvcNAQEFBQAwNzELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0FuZHJvaWQxFjAUBgNVBAMTDUFuZHJvaWQgRGVidWcwHhcNMTIwMjE2MjIyMDM3WhcNNDIwMjA4MjIyMDM3WjA3MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHQW5kcm9pZDEWMBQGA1UEAxMNQW5kcm9pZCBEZWJ1ZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3AKU7S7JXhUjEwxWP1/LPHXieh61SaA/+xbpqsPA+yjGz1sAcGAyuG6bjNAVm56pq7nkjJzicX7Wi83nUBo58DEC/quxOLdy0C4PEOSAeTnTT1RJIwMDvOgiL1GFCErvQ7gCH6zuAID/JRFbN6nIkhDjs2DYnSBl7aJJf8wCLc0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQAoq/TJffA0l+ZGf89xndmHdxrO6qi+TzSlByvLZ4eFfCovTh1iO+Edrd5V1yXGLxyyvdsadMAFZT8SaxMrP5xxhJ0nra0APWYLpA96M//auMhQBWPgqPntwgvEZuEH7f0kdItjBJ39yijbG8xfgwid6XqNUo0TDDkp/wNWKpJ9tJe+2PrGw1NAvrgSydoH2j8DI1Eq' DEBUG_KEYSTORE_KEY_FILE_NAME = ( diff --git a/tests/test_publish.py b/tests/test_publish.py index cb47bff5..82c670d7 100755 --- a/tests/test_publish.py +++ b/tests/test_publish.py @@ -15,17 +15,15 @@ import os import pathlib import shutil import sys -import unittest import tempfile +import unittest from unittest import mock -from fdroidserver import publish -from fdroidserver import common -from fdroidserver import metadata -from fdroidserver import signatures +from fdroidserver import common, metadata, publish, signatures from fdroidserver._yaml import yaml from fdroidserver.exception import FDroidException -from .shared_test_code import mkdtemp, VerboseFalseOptions + +from .shared_test_code import VerboseFalseOptions, mkdtemp basedir = pathlib.Path(__file__).parent diff --git a/tests/test_rewritemeta.py b/tests/test_rewritemeta.py index 5ad1b94d..4528f219 100755 --- a/tests/test_rewritemeta.py +++ b/tests/test_rewritemeta.py @@ -1,13 +1,14 @@ #!/usr/bin/env python3 import os -import unittest import tempfile import textwrap +import unittest from pathlib import Path from unittest import mock from fdroidserver import metadata, rewritemeta + from .shared_test_code import TmpCwd, mkdtemp basedir = Path(__file__).parent diff --git a/tests/test_scanner.py b/tests/test_scanner.py index d982ed4f..849476e6 100755 --- a/tests/test_scanner.py +++ b/tests/test_scanner.py @@ -26,6 +26,7 @@ import fdroidserver.common import fdroidserver.exception import fdroidserver.metadata import fdroidserver.scanner + from .shared_test_code import TmpCwd, mkdtemp, mock_open_to_str basedir = pathlib.Path(__file__).parent diff --git a/tests/test_signatures.py b/tests/test_signatures.py index 603ddf2c..4f7bd105 100755 --- a/tests/test_signatures.py +++ b/tests/test_signatures.py @@ -6,9 +6,10 @@ import sys import unittest from tempfile import TemporaryDirectory -from .shared_test_code import TmpCwd from fdroidserver import common, signatures +from .shared_test_code import TmpCwd + basedir = os.path.dirname(__file__) diff --git a/tests/test_signindex.py b/tests/test_signindex.py index 149afb24..21d54585 100755 --- a/tests/test_signindex.py +++ b/tests/test_signindex.py @@ -6,11 +6,11 @@ import shutil import subprocess import tempfile import unittest - -from fdroidserver import apksigcopier, common, exception, signindex, update from pathlib import Path from unittest.mock import patch +from fdroidserver import apksigcopier, common, exception, signindex, update + class Options: allow_disabled_algorithms = False diff --git a/tests/test_update.py b/tests/test_update.py index 468cd813..10f9cc8b 100755 --- a/tests/test_update.py +++ b/tests/test_update.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 import copy -import git import glob import hashlib import json @@ -12,16 +11,18 @@ import shutil import string import subprocess import sys +import textwrap import time import unittest -import yaml import zipfile -import textwrap from binascii import hexlify from datetime import datetime from pathlib import Path from unittest import mock +import git +import yaml + try: # these were moved in androguard 4.0 from androguard.core.apk import APK @@ -44,15 +45,16 @@ except ImportError: except ImportError: from yaml import Loader as FullLoader +from PIL import PngImagePlugin + import fdroidserver.common import fdroidserver.exception import fdroidserver.metadata import fdroidserver.update from fdroidserver.common import CATEGORIES_CONFIG_NAME from fdroidserver.looseversion import LooseVersion -from .shared_test_code import TmpCwd, mkdtemp -from PIL import PngImagePlugin +from .shared_test_code import TmpCwd, mkdtemp DONATION_FIELDS = ('Donate', 'Liberapay', 'OpenCollective') diff --git a/tests/test_vcs.py b/tests/test_vcs.py index 2b640a9e..a007feae 100755 --- a/tests/test_vcs.py +++ b/tests/test_vcs.py @@ -7,7 +7,8 @@ from git import Repo import fdroidserver.common import fdroidserver.metadata -from .shared_test_code import mkdtemp, VerboseFalseOptions + +from .shared_test_code import VerboseFalseOptions, mkdtemp class VCSTest(unittest.TestCase): diff --git a/tests/test_verify.py b/tests/test_verify.py index f9da9092..e5a2f7c4 100755 --- a/tests/test_verify.py +++ b/tests/test_verify.py @@ -6,13 +6,11 @@ import shutil import sys import tempfile import unittest - from pathlib import Path from unittest.mock import patch from fdroidserver import verify - TEST_APP_ENTRY = { "1539780240.3885746": { "local": { From 8b54e2b4cf95dcad4410d3587cc39653f2c5417b Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Fri, 11 Jul 2025 18:08:19 +0300 Subject: [PATCH 2102/2116] Remove UpstreamNonFree --- tests/config/antiFeatures.yml | 4 -- tests/config/de/antiFeatures.yml | 4 -- tests/config/fa/antiFeatures.yml | 4 -- tests/config/ro/antiFeatures.yml | 4 -- tests/config/zh-rCN/antiFeatures.yml | 4 -- .../app.with.special.build.params.yml | 2 +- .../app.with.special.build.params.yml | 2 +- tests/metadata/com.politedroid.yml | 2 - .../dump/app.with.special.build.params.yaml | 2 +- tests/metadata/dump/com.politedroid.yaml | 2 - tests/repo/entry.json | 4 +- tests/repo/index-v1.json | 6 +-- tests/repo/index-v2.json | 49 +------------------ tests/repo/index.xml | 2 +- tests/test_common.py | 1 - tests/test_lint.py | 2 +- tests/test_metadata.py | 14 ++---- tests/test_rewritemeta.py | 1 - tests/test_update.py | 2 +- 19 files changed, 16 insertions(+), 95 deletions(-) diff --git a/tests/config/antiFeatures.yml b/tests/config/antiFeatures.yml index 06d794a1..cb4dc676 100644 --- a/tests/config/antiFeatures.yml +++ b/tests/config/antiFeatures.yml @@ -39,7 +39,3 @@ Tracking: description: This app tracks and reports your activity icon: ic_antifeature_tracking.xml name: Tracking -UpstreamNonFree: - description: The upstream source code is not entirely Free - icon: ic_antifeature_upstreamnonfree.xml - name: Upstream Non-Free diff --git a/tests/config/de/antiFeatures.yml b/tests/config/de/antiFeatures.yml index 3053e41a..65111db1 100644 --- a/tests/config/de/antiFeatures.yml +++ b/tests/config/de/antiFeatures.yml @@ -38,7 +38,3 @@ Tracking: description: Diese App verfolgt und versendet Ihre Aktivitäten icon: ic_antifeature_tracking.xml name: Tracking -UpstreamNonFree: - description: Der Originalcode ist nicht völlig quelloffen - icon: ic_antifeature_upstreamnonfree.xml - name: Originalcode nicht-quelloffen diff --git a/tests/config/fa/antiFeatures.yml b/tests/config/fa/antiFeatures.yml index 554dcee9..aa8290ef 100644 --- a/tests/config/fa/antiFeatures.yml +++ b/tests/config/fa/antiFeatures.yml @@ -37,7 +37,3 @@ Tracking: description: این کاره، فعّالیتتان را ردیابی و گزارش می‌کند icon: ic_antifeature_tracking.xml name: ردیابی -UpstreamNonFree: - description: کد مبدأ بالادستی کاملاً آزاد نیست - icon: ic_antifeature_upstreamnonfree.xml - name: بالادست ناآزاد diff --git a/tests/config/ro/antiFeatures.yml b/tests/config/ro/antiFeatures.yml index 97d61172..9610b448 100644 --- a/tests/config/ro/antiFeatures.yml +++ b/tests/config/ro/antiFeatures.yml @@ -38,7 +38,3 @@ Tracking: description: Aplicația îți înregistrează și raportează activitatea undeva icon: ic_antifeature_tracking.xml name: Urmărire -UpstreamNonFree: - description: Codul sursa originar nu este în totalitatea lui software liber - icon: ic_antifeature_upstreamnonfree.xml - name: Surse ne-libere diff --git a/tests/config/zh-rCN/antiFeatures.yml b/tests/config/zh-rCN/antiFeatures.yml index a1b287b9..2c9f0819 100644 --- a/tests/config/zh-rCN/antiFeatures.yml +++ b/tests/config/zh-rCN/antiFeatures.yml @@ -37,7 +37,3 @@ Tracking: description: 此应用会记录并报告你的活动 icon: ic_antifeature_tracking.xml name: 跟踪用户 -UpstreamNonFree: - description: 上游源代码不是完全自由的 - icon: ic_antifeature_upstreamnonfree.xml - name: 上游代码非自由 diff --git a/tests/metadata-rewrite-yml/app.with.special.build.params.yml b/tests/metadata-rewrite-yml/app.with.special.build.params.yml index 0fc97b65..95c1695c 100644 --- a/tests/metadata-rewrite-yml/app.with.special.build.params.yml +++ b/tests/metadata-rewrite-yml/app.with.special.build.params.yml @@ -1,5 +1,5 @@ AntiFeatures: - - UpstreamNonFree + - Tracking Categories: - System License: GPL-3.0-only diff --git a/tests/metadata/app.with.special.build.params.yml b/tests/metadata/app.with.special.build.params.yml index d12c713c..c58cadf1 100644 --- a/tests/metadata/app.with.special.build.params.yml +++ b/tests/metadata/app.with.special.build.params.yml @@ -1,5 +1,5 @@ AntiFeatures: - - UpstreamNonFree + - Tracking Categories: - System License: GPL-3.0-only diff --git a/tests/metadata/com.politedroid.yml b/tests/metadata/com.politedroid.yml index cd474d6c..87d13bcb 100644 --- a/tests/metadata/com.politedroid.yml +++ b/tests/metadata/com.politedroid.yml @@ -22,7 +22,6 @@ Builds: target: android-10 antifeatures: - KnownVuln - - UpstreamNonFree - NonFreeAssets - versionName: '1.3' @@ -43,7 +42,6 @@ Builds: - yes antifeatures: - KnownVuln - - UpstreamNonFree - NonFreeAssets ArchivePolicy: 4 versions diff --git a/tests/metadata/dump/app.with.special.build.params.yaml b/tests/metadata/dump/app.with.special.build.params.yaml index 9f2c61f6..fae6c9ae 100644 --- a/tests/metadata/dump/app.with.special.build.params.yaml +++ b/tests/metadata/dump/app.with.special.build.params.yaml @@ -2,7 +2,7 @@ --- AllowedAPKSigningKeys: [] AntiFeatures: - UpstreamNonFree: {} + Tracking: {} ArchivePolicy: 0 AuthorEmail: null AuthorName: null diff --git a/tests/metadata/dump/com.politedroid.yaml b/tests/metadata/dump/com.politedroid.yaml index b4d56c3e..01d55b82 100644 --- a/tests/metadata/dump/com.politedroid.yaml +++ b/tests/metadata/dump/com.politedroid.yaml @@ -19,7 +19,6 @@ Builds: antifeatures: KnownVuln: {} NonFreeAssets: {} - UpstreamNonFree: {} binary: null build: '' buildjni: [] @@ -127,7 +126,6 @@ Builds: antifeatures: KnownVuln: {} NonFreeAssets: {} - UpstreamNonFree: {} binary: null build: '' buildjni: [] diff --git a/tests/repo/entry.json b/tests/repo/entry.json index 1eb017bc..85b6b14f 100644 --- a/tests/repo/entry.json +++ b/tests/repo/entry.json @@ -3,8 +3,8 @@ "version": 20002, "index": { "name": "/index-v2.json", - "sha256": "f0912b64db80168ee807f43ab3470bb709b6659aee05ad63057dcbcd1c97dc5e", - "size": 55186, + "sha256": "94dca5f4398d2a0167bbe69c790cdd66f1bc305ca5e362ee5e3f793e9f88e3cf", + "size": 53355, "numPackages": 11 }, "diffs": {} diff --git a/tests/repo/index-v1.json b/tests/repo/index-v1.json index ed1cbcde..03f8f060 100644 --- a/tests/repo/index-v1.json +++ b/tests/repo/index-v1.json @@ -244,8 +244,7 @@ "added": 1498176000000, "antiFeatures": [ "KnownVuln", - "NonFreeAssets", - "UpstreamNonFree" + "NonFreeAssets" ], "apkName": "com.politedroid_6.apk", "hash": "70c2f776a2bac38a58a7d521f96ee0414c6f0fb1de973c3ca8b10862a009247d", @@ -332,8 +331,7 @@ "added": 1498176000000, "antiFeatures": [ "KnownVuln", - "NonFreeAssets", - "UpstreamNonFree" + "NonFreeAssets" ], "apkName": "com.politedroid_3.apk", "hash": "665d03d61ebc642289fda697f71a59305b0202b16cafc5ffdae91cbe91f0b25d", diff --git a/tests/repo/index-v2.json b/tests/repo/index-v2.json index 96c2cfea..263dffd2 100644 --- a/tests/repo/index-v2.json +++ b/tests/repo/index-v2.json @@ -453,49 +453,6 @@ "ro": "Urmărire", "zh-rCN": "跟踪用户" } - }, - "UpstreamNonFree": { - "description": { - "de": "Der Originalcode ist nicht völlig quelloffen", - "en-US": "The upstream source code is not entirely Free", - "fa": "کد مبدأ بالادستی کاملاً آزاد نیست", - "ro": "Codul sursa originar nu este în totalitatea lui software liber", - "zh-rCN": "上游源代码不是完全自由的" - }, - "icon": { - "de": { - "name": "/icons/ic_antifeature_upstreamnonfree.xml", - "sha256": "06a9af843ff56ecd7a270f98c0b19b3154edf3ffa854e6d50a84ef00d0ce1a86", - "size": 1442 - }, - "en-US": { - "name": "/icons/ic_antifeature_upstreamnonfree.xml", - "sha256": "06a9af843ff56ecd7a270f98c0b19b3154edf3ffa854e6d50a84ef00d0ce1a86", - "size": 1442 - }, - "fa": { - "name": "/icons/ic_antifeature_upstreamnonfree.xml", - "sha256": "06a9af843ff56ecd7a270f98c0b19b3154edf3ffa854e6d50a84ef00d0ce1a86", - "size": 1442 - }, - "ro": { - "name": "/icons/ic_antifeature_upstreamnonfree.xml", - "sha256": "06a9af843ff56ecd7a270f98c0b19b3154edf3ffa854e6d50a84ef00d0ce1a86", - "size": 1442 - }, - "zh-rCN": { - "name": "/icons/ic_antifeature_upstreamnonfree.xml", - "sha256": "06a9af843ff56ecd7a270f98c0b19b3154edf3ffa854e6d50a84ef00d0ce1a86", - "size": 1442 - } - }, - "name": { - "de": "Originalcode nicht-quelloffen", - "en-US": "Upstream Non-Free", - "fa": "بالادست ناآزاد", - "ro": "Surse ne-libere", - "zh-rCN": "上游代码非自由" - } } }, "categories": { @@ -627,8 +584,7 @@ "en-US": "1.5" }, "NonFreeAssets": {}, - "NonFreeNet": {}, - "UpstreamNonFree": {} + "NonFreeNet": {} } }, "5bdbfa071cca4b8d05ced41d6b28763595d6e8096cca5bbf0f9253c9a2622e5d": { @@ -756,8 +712,7 @@ "en-US": "1.5" }, "NonFreeAssets": {}, - "NonFreeNet": {}, - "UpstreamNonFree": {} + "NonFreeNet": {} } } } diff --git a/tests/repo/index.xml b/tests/repo/index.xml index 4036a6f7..04e8f87d 100644 --- a/tests/repo/index.xml +++ b/tests/repo/index.xml @@ -346,7 +346,7 @@ APK is called F-Droid Privileged Extension. https://github.com/miguelvps/PoliteDroid/issues 1.5 6 - KnownVuln,NoSourceSince,NonFreeAssets,NonFreeNet,UpstreamNonFree + KnownVuln,NoSourceSince,NonFreeAssets,NonFreeNet 1.5 6 diff --git a/tests/test_common.py b/tests/test_common.py index de08a5d7..3110b446 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -2784,7 +2784,6 @@ class CommonTest(SetUpTearDownMixin, unittest.TestCase): 'NonFreeDep', 'NonFreeNet', 'Tracking', - 'UpstreamNonFree', ], list(antiFeatures.keys()), ) diff --git a/tests/test_lint.py b/tests/test_lint.py index 4b5d7dfe..37b7ce95 100755 --- a/tests/test_lint.py +++ b/tests/test_lint.py @@ -510,7 +510,7 @@ class LintAntiFeaturesTest(unittest.TestCase): def test_check_antiFeatures(self): app = fdroidserver.metadata.App() - app['AntiFeatures'] = ['Ads', 'UpstreamNonFree'] + app['AntiFeatures'] = ['Ads', 'Tracking'] self.assertEqual([], list(fdroidserver.lint.check_antiFeatures(app))) def test_check_antiFeatures_fails_one(self): diff --git a/tests/test_metadata.py b/tests/test_metadata.py index f9e2ba75..84040024 100755 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -672,7 +672,7 @@ class MetadataTest(unittest.TestCase): """Definitions in .yml files should override the localized versions.""" app = metadata.parse_metadata('metadata/app.with.special.build.params.yml') - self.assertEqual(app['AntiFeatures'], {'UpstreamNonFree': {}}) + self.assertEqual(app['AntiFeatures'], {'Tracking': {}}) self.assertEqual(49, app['Builds'][-3]['versionCode']) self.assertEqual( @@ -961,7 +961,6 @@ class MetadataTest(unittest.TestCase): - versionCode: 123 antifeatures: - KnownVuln - - UpstreamNonFree - NonFreeAssets """ ) @@ -972,11 +971,7 @@ class MetadataTest(unittest.TestCase): 'AntiFeatures': {'Ads': {}}, 'Builds': [ { - 'antifeatures': { - 'KnownVuln': {}, - 'NonFreeAssets': {}, - 'UpstreamNonFree': {}, - }, + 'antifeatures': {'KnownVuln': {}, 'NonFreeAssets': {}}, 'versionCode': 123, } ], @@ -997,7 +992,7 @@ class MetadataTest(unittest.TestCase): es: 2nd az: zero en-US: first - UpstreamNonFree: + Tracking: NonFreeAssets: AntiFeatures: NonFreeDep: @@ -1019,7 +1014,7 @@ class MetadataTest(unittest.TestCase): 'antifeatures': { 'KnownVuln': {'az': 'zero', 'en-US': 'first', 'es': '2nd'}, 'NonFreeAssets': {}, - 'UpstreamNonFree': {}, + 'Tracking': {}, }, 'versionCode': 123, } @@ -1873,7 +1868,6 @@ class MetadataTest(unittest.TestCase): antifeatures: - KnownVuln - NonFreeAssets - - UpstreamNonFree ArchivePolicy: 4 AutoUpdateMode: Version v%v diff --git a/tests/test_rewritemeta.py b/tests/test_rewritemeta.py index 4528f219..4dcdd03f 100755 --- a/tests/test_rewritemeta.py +++ b/tests/test_rewritemeta.py @@ -40,7 +40,6 @@ class RewriteMetaTest(unittest.TestCase): 'target': 'android-10', 'antifeatures': { 'KnownVuln': {}, - 'UpstreamNonFree': {}, 'NonFreeAssets': {}, }, }, diff --git a/tests/test_update.py b/tests/test_update.py index 10f9cc8b..623f48cc 100755 --- a/tests/test_update.py +++ b/tests/test_update.py @@ -1375,7 +1375,7 @@ class UpdateTest(unittest.TestCase): if apk['packageName'] == 'com.politedroid' and apk['versionCode'] == 3: antiFeatures = apk.get('antiFeatures') self.assertTrue('KnownVuln' in antiFeatures) - self.assertEqual(3, len(antiFeatures)) + self.assertEqual(2, len(antiFeatures)) foundtest = True self.assertTrue(foundtest) From e07cdf5f0c469a80fade879ed7636c3c81b5864a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 24 Jul 2025 22:49:55 +0200 Subject: [PATCH 2103/2116] update: cache the SHA-256 of the src tarball closes #1290 --- fdroidserver/index.py | 7 +++++-- fdroidserver/update.py | 13 +++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 3482f15c..b63729e4 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -595,7 +595,10 @@ def convert_version(version, app, repodir): ver["file"]["ipfsCIDv1"] = ipfsCIDv1 if "srcname" in version: - ver["src"] = common.file_entry(os.path.join(repodir, version["srcname"])) + ver["src"] = common.file_entry( + os.path.join(repodir, version["srcname"]), + version["srcnameSha256"], + ) if "obbMainFile" in version: ver["obbMainFile"] = common.file_entry( @@ -964,7 +967,7 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, signer_fingerprints for k, v in sorted(package.items()): if not v: continue - if k in ('icon', 'icons', 'icons_src', 'ipfsCIDv1', 'name'): + if k in ('icon', 'icons', 'icons_src', 'ipfsCIDv1', 'name', 'srcnameSha256'): continue if k == 'antiFeatures': d[k] = sorted(v.keys()) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 6af82ab2..cb141007 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -370,6 +370,11 @@ def get_cache(): v['antiFeatures'] = {k: {} for k in sorted(v['antiFeatures'])} if 'added' in v: v['added'] = datetime.fromtimestamp(v['added'], tz=timezone.utc) + if v.get('srcname') and not v.get('srcnameSha256'): + f = f'archive/{v["srcname"]}' + if not os.path.exists(f): + f = f'repo/{v["srcname"]}' + v['srcnameSha256'] = common.sha256sum(f) return apkcache @@ -1570,8 +1575,10 @@ def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False): repo_file['packageName'] = m.group(1) repo_file['versionCode'] = int(m.group(2)) srcfilename = name + b'_src.tar.gz' - if os.path.exists(os.path.join(repodir, srcfilename)): + srcpath = os.path.join(repodir, srcfilename) + if os.path.exists(srcpath): repo_file['srcname'] = srcfilename.decode() + repo_file['srcnameSha256'] = common.sha256sum(srcpath.decode()) repo_file['size'] = stat.st_size apkcache[name_utf8] = repo_file @@ -1989,8 +1996,10 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal apk['apkName'] = apkfilename srcfilename = apkfilename[:-4] + "_src.tar.gz" - if os.path.exists(os.path.join(repodir, srcfilename)): + srcpath = os.path.join(repodir, srcfilename) + if os.path.exists(srcpath): apk['srcname'] = srcfilename + apk['srcnameSha256'] = common.sha256sum(srcpath) # verify the jar signature is correct, allow deprecated # algorithms only if the APK is in the archive. From d20a6a5dcf87584c3c221729b4f0cf84d0866e45 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 29 Jul 2025 17:20:11 +0200 Subject: [PATCH 2104/2116] update: don't crash if src tarball is not present --- fdroidserver/update.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index cb141007..aa6527b3 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -374,7 +374,8 @@ def get_cache(): f = f'archive/{v["srcname"]}' if not os.path.exists(f): f = f'repo/{v["srcname"]}' - v['srcnameSha256'] = common.sha256sum(f) + if os.path.exists(f): + v['srcnameSha256'] = common.sha256sum(f) return apkcache From f5f79ac1eafc2bf40fe18dd2c7710c25ce751db8 Mon Sep 17 00:00:00 2001 From: Licaon_Kter Date: Mon, 18 Aug 2025 13:32:29 +0000 Subject: [PATCH 2105/2116] Sonatype is now Maven Central --- fdroidserver/scanner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 37d3f896..0d5a3ecf 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -729,6 +729,7 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): 'www.jitpack.io', 'repo.maven.apache.org/maven2', 'oss.jfrog.org/artifactory/oss-snapshot-local', + 'central.sonatype.com/repository/maven-snapshots/', 'oss.sonatype.org/content/repositories/snapshots', 'oss.sonatype.org/content/repositories/releases', 'oss.sonatype.org/content/groups/public', From 6fff73b67891c3cb6000a71c9b29b46449ffdaf5 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 28 Jul 2025 16:16:41 +0200 Subject: [PATCH 2106/2116] convert fdroidserver/__init__.py to black format --- fdroidserver/__init__.py | 5 ++++- pyproject.toml | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/fdroidserver/__init__.py b/fdroidserver/__init__.py index c4376bd6..fdf64421 100644 --- a/fdroidserver/__init__.py +++ b/fdroidserver/__init__.py @@ -14,7 +14,10 @@ rootpaths = [ localedir = None for rootpath in rootpaths: - if len(glob.glob(os.path.join(rootpath, 'locale', '*', 'LC_MESSAGES', 'fdroidserver.mo'))) > 0: + found_mo = glob.glob( + os.path.join(rootpath, 'locale', '*', 'LC_MESSAGES', 'fdroidserver.mo') + ) + if len(found_mo) > 0: localedir = os.path.join(rootpath, 'locale') break diff --git a/pyproject.toml b/pyproject.toml index a1f8a99b..c0ae09c9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,6 @@ force-exclude = '''( | examples/fdroid_exportkeystore\.py | examples/fdroid_fetchsrclibs\.py | examples/fdroid_nitrokeyimport\.py - | fdroidserver/__init__\.py | fdroidserver/__main__\.py | fdroidserver/apksigcopier\.py | fdroidserver/looseversion\.py From 2eb3986ecf97c28ae7c5355967afd91cf5424cef Mon Sep 17 00:00:00 2001 From: Tobias Mueller Date: Tue, 26 Aug 2025 10:10:51 +0000 Subject: [PATCH 2107/2116] update: Handle APKs without a version code in their manifest --- fdroidserver/exception.py | 4 ++++ fdroidserver/update.py | 13 +++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/fdroidserver/exception.py b/fdroidserver/exception.py index a598b368..682ccef7 100644 --- a/fdroidserver/exception.py +++ b/fdroidserver/exception.py @@ -35,6 +35,10 @@ class VCSException(FDroidException): pass +class NoVersionCodeException(FDroidException): + pass + + class NoSubmodulesException(VCSException): pass diff --git a/fdroidserver/update.py b/fdroidserver/update.py index aa6527b3..52e9f7f0 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -56,7 +56,7 @@ import fdroidserver.index from . import _, common, metadata from .common import DEFAULT_LOCALE -from .exception import BuildException, FDroidException, VerificationException +from .exception import BuildException, FDroidException, NoVersionCodeException, VerificationException if hasattr(Image, 'DecompressionBombWarning'): warnings.simplefilter('error', Image.DecompressionBombWarning) @@ -1801,6 +1801,7 @@ def scan_apk_androguard(apk, apkfile): xml = apkobject.get_android_manifest_xml() androidmanifest_xml = apkobject.xml['AndroidManifest.xml'] + if len(xml.nsmap) > 0: # one of them surely will be the Android one, or its corrupt xmlns = common.XMLNS_ANDROID @@ -1810,8 +1811,12 @@ def scan_apk_androguard(apk, apkfile): xmlns = '{}' vcstr = androidmanifest_xml.get(xmlns + 'versionCode') + logging.debug("Version Code: %r (%s)" % (vcstr, apkfile)) - if vcstr.startswith('0x'): + if not vcstr: + raise NoVersionCodeException(_("APK file {path} does not have a version code " + "in its manifest").format(path=apkfile)) + elif vcstr.startswith('0x'): apk['versionCode'] = int(vcstr, 16) else: apk['versionCode'] = int(vcstr) @@ -1959,6 +1964,10 @@ def process_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk=Fal logging.warning(_("Skipping '{apkfilename}' with invalid signature!") .format(apkfilename=apkfilename)) return True, None, False + except NoVersionCodeException: + logging.warning(_("Skipping '{apkfilename}' without versionCode!") + .format(apkfilename=apkfilename)) + return True, None, False if apps: if apk['packageName'] in apps: From f578684be8cb180d9a893646ecf9410f18ef8d67 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Wed, 17 Sep 2025 14:37:30 +0800 Subject: [PATCH 2108/2116] scanner: remove tailing / from maven repo address --- fdroidserver/scanner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 0d5a3ecf..30b5b2c7 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -729,7 +729,7 @@ def scan_source(build_dir, build=metadata.Build(), json_per_build=None): 'www.jitpack.io', 'repo.maven.apache.org/maven2', 'oss.jfrog.org/artifactory/oss-snapshot-local', - 'central.sonatype.com/repository/maven-snapshots/', + 'central.sonatype.com/repository/maven-snapshots', 'oss.sonatype.org/content/repositories/snapshots', 'oss.sonatype.org/content/repositories/releases', 'oss.sonatype.org/content/groups/public', From 106805752461fd574ca2d02473cd1b357c4f3cce Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 27 Aug 2025 16:49:21 +0200 Subject: [PATCH 2109/2116] standardize on versionCode as spelling --- fdroidserver/checkupdates.py | 4 ++-- fdroidserver/common.py | 14 +++++++------- fdroidserver/import_subcommand.py | 2 +- fdroidserver/lint.py | 2 +- fdroidserver/update.py | 6 +++--- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index cff7bcd7..2632a7b0 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -93,7 +93,7 @@ def check_http(app: metadata.App) -> tuple[Optional[str], Optional[int]]: m = re.search(codeex, page) if not m: - raise FDroidException("No RE match for version code") + raise FDroidException("No RE match for versionCode") vercode = common.version_code_string_to_int(m.group(1).strip()) if urlver != '.': @@ -213,7 +213,7 @@ def check_tags(app: metadata.App, pattern: str) -> tuple[str, int, str]: if codeex: m = re.search(codeex, filecontent) if not m: - logging.debug(f"UpdateCheckData regex {codeex} for version code" + logging.debug(f"UpdateCheckData regex {codeex} for versionCode" f" has no match in tag {tag}") continue diff --git a/fdroidserver/common.py b/fdroidserver/common.py index ec0079af..66c84eec 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1098,7 +1098,7 @@ def get_metadata_files(vercodes): Parameters ---------- vercodes - version codes as returned by read_pkg_args() + versionCodes as returned by read_pkg_args() Returns ------- @@ -2295,7 +2295,7 @@ def parse_androidmanifests(paths, app): .format(package, version, vercode)) # Always grab the package name and version name in case they are not - # together with the highest version code + # together with the highest versionCode if max_package is None and package is not None: max_package = package if max_version is None and version is not None: @@ -2608,7 +2608,7 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver= # Remove forced debuggable flags remove_debuggable_flags(root_dir) - # Insert version code and number into the manifest if necessary + # Insert versionCode and number into the manifest if necessary if build.forceversion: logging.info("Changing the version name") for path in manifest_paths(root_dir, flavors): @@ -2624,7 +2624,7 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver= path) if build.forcevercode: - logging.info("Changing the version code") + logging.info("Changing the versionCode") for path in manifest_paths(root_dir, flavors): if not path.is_file(): continue @@ -2949,7 +2949,7 @@ def get_apk_id(apkfile): Returns ------- appid - version code + versionCode version name """ @@ -3564,7 +3564,7 @@ def metadata_find_signing_files(appid, vercode): appid app id string vercode - app version code + app versionCode Returns ------- @@ -4426,7 +4426,7 @@ def string_is_integer(string): def version_code_string_to_int(vercode): - """Convert an version code string of any base into an int.""" + """Convert an versionCode string of any base into an int.""" # TODO: Python 3.6 allows underscores in numeric literals vercode = vercode.replace('_', '') try: diff --git a/fdroidserver/import_subcommand.py b/fdroidserver/import_subcommand.py index 345c2891..16c4ad36 100644 --- a/fdroidserver/import_subcommand.py +++ b/fdroidserver/import_subcommand.py @@ -354,7 +354,7 @@ def main(): if not versionName: logging.warning(_('Could not find latest version name')) if not versionCode: - logging.warning(_('Could not find latest version code')) + logging.warning(_('Could not find latest versionCode')) else: raise FDroidException(_("No gradle project could be found. Specify --subdir?")) diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index f384cb62..cd3a7437 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -372,7 +372,7 @@ def check_update_check_data_int(app): # noqa: D403 # codeex can be empty as well if codeex and not versioncode_check_pattern.search(codeex): yield _( - f'UpdateCheckData must match the version code as integer (\\d or [0-9]): {codeex}' + f'UpdateCheckData must match the versionCode as integer (\\d or [0-9]): {codeex}' ) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 52e9f7f0..75c4d907 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -511,7 +511,7 @@ def insert_obbs(repodir, apps, apks): obbWarnDelete(f, _('OBB filename must start with "main." or "patch.":')) continue if not re.match(r'^-?[0-9]+$', chunks[1]): - obbWarnDelete(f, _('The OBB version code must come after "{name}.":') + obbWarnDelete(f, _('The OBB versionCode must come after "{name}.":') .format(name=chunks[0])) continue versionCode = int(chunks[1]) @@ -550,7 +550,7 @@ VERSION_STRING_RE = re.compile(r'^([0-9]+)\.([0-9]+)\.([0-9]+)$') def version_string_to_int(version): """ - Convert sermver version designation to version code. + Convert semantic version designation to versionCode. Approximately convert a [Major].[Minor].[Patch] version string consisting of numeric characters (0-9) and periods to a number. The @@ -2322,7 +2322,7 @@ def archive_old_apks(apps, apks, archapks, repodir, archivedir, defaultkeepversi continue apkList.append(apk) - # Sort the apk list by version code. First is highest/newest. + # Sort the apk list by versionCode. First is highest/newest. sorted_list = sorted(apkList, key=lambda apk: apk['versionCode'], reverse=True) if currentVersionApk: # Insert apk which corresponds to currentVersion at the front From bbe29abaa368427fa1c2964673d68acf5d02a8c0 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 27 Aug 2025 16:50:33 +0200 Subject: [PATCH 2110/2116] standardize on versionName as spelling --- fdroidserver/checkupdates.py | 2 +- fdroidserver/common.py | 8 ++++---- fdroidserver/import_subcommand.py | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 2632a7b0..3cf7a821 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -233,7 +233,7 @@ def check_tags(app: metadata.App, pattern: str) -> tuple[str, int, str]: if verex: m = re.search(verex, filecontent) if not m: - logging.debug(f"UpdateCheckData regex {verex} for version name" + logging.debug(f"UpdateCheckData regex {verex} for versionName" f" has no match in tag {tag}") continue diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 66c84eec..e03e58c5 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2211,7 +2211,7 @@ def parse_androidmanifests(paths, app): version = matches else: - # If build.gradle contains applicationNameSuffix add it to the end of version name + # If build.gradle contains applicationNameSuffix add it to the end of versionName matches = vnssearch_g(line) if matches and temp_version_name: name_suffix = matches.group(2) @@ -2294,7 +2294,7 @@ def parse_androidmanifests(paths, app): logging.debug("..got package={0}, version={1}, vercode={2}" .format(package, version, vercode)) - # Always grab the package name and version name in case they are not + # Always grab the package name and versionName in case they are not # together with the highest versionCode if max_package is None and package is not None: max_package = package @@ -2610,7 +2610,7 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver= # Insert versionCode and number into the manifest if necessary if build.forceversion: - logging.info("Changing the version name") + logging.info("Changing the versionName") for path in manifest_paths(root_dir, flavors): if not os.path.isfile(path): continue @@ -2950,7 +2950,7 @@ def get_apk_id(apkfile): ------- appid versionCode - version name + versionName """ try: diff --git a/fdroidserver/import_subcommand.py b/fdroidserver/import_subcommand.py index 16c4ad36..017ebe54 100644 --- a/fdroidserver/import_subcommand.py +++ b/fdroidserver/import_subcommand.py @@ -352,7 +352,7 @@ def main(): if not appid: raise FDroidException(_("Couldn't find Application ID")) if not versionName: - logging.warning(_('Could not find latest version name')) + logging.warning(_('Could not find latest versionName')) if not versionCode: logging.warning(_('Could not find latest versionCode')) else: From dbd769db9f9a137cf2083ab91f2ec0e0ace02c9f Mon Sep 17 00:00:00 2001 From: paul mayero Date: Wed, 17 Sep 2025 11:36:12 +0000 Subject: [PATCH 2111/2116] Remove libcloud and s3cmd from fdroidserver --- .gitlab-ci.yml | 36 +++ CHANGELOG.md | 7 + examples/config.yml | 83 ++---- fdroidserver/common.py | 5 +- fdroidserver/deploy.py | 455 +++++++++------------------------ fdroidserver/lint.py | 5 +- setup.py | 3 +- tests/test_deploy.py | 521 ++++++++------------------------------ tests/test_integration.py | 121 ++++++++- 9 files changed, 417 insertions(+), 819 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f66e1ce6..d667e574 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -186,6 +186,42 @@ ubuntu_lts_ppa: - ./run-tests +# Test to see how rclone works with S3 +test_deploy_to_s3_with_rclone: + image: debian:bookworm-slim + <<: *apt-template + services: + - name: docker:dind + command: ["--tls=false"] + variables: + DOCKER_HOST: "tcp://docker:2375" + DOCKER_DRIVER: overlay2 + DOCKER_TLS_CERTDIR: "" + before_script: + # ensure minio is up before executing tests + - apt-get update + - apt-get install -y + androguard + apksigner + curl + docker.io + git + python3-venv + rclone + - python3 -m venv --system-site-packages test-venv + - . test-venv/bin/activate + - pip install testcontainers[minio] + - pip install . + script: + - python3 -m unittest -k test_update_remote_storage_with_rclone --verbose + rules: + - changes: + - .gitlab-ci.yml + - fdroidserver/deploy.py + - tests/test_deploy.py + - tests/test_integration.py + + # Test using Ubuntu/jammy LTS (supported til April, 2027) with depends # from pypi and sdkmanager. The venv is used to isolate the dist # tarball generation environment from the clean install environment. diff --git a/CHANGELOG.md b/CHANGELOG.md index 5aeeca43..6b61a8f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +## [2.5.0] - NEXT + +### Removed + +* deploy: `awsaccesskeyid:` and `awssecretkey:` config items removed, use the + standard env vars: `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`. + ## [2.4.2] - 2025-06-24 ### Fixed diff --git a/examples/config.yml b/examples/config.yml index cdcbb731..ae4e7008 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -305,70 +305,33 @@ # # sync_from_local_copy_dir: true +# To deploy to an AWS S3 "bucket" in the US East region, set the +# bucket name in the config, then set the environment variables +# AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY using the values from +# the AWS Management Console. See +# https://rclone.org/s3/#authentication +# +# awsbucket: myawsfdroidbucket -# To upload the repo to an Amazon S3 bucket using `fdroid deploy' -# . rclone, s3cmd and apache libcloud are the available options. -# If rclone and s3cmd are not installed, apache libcloud is used. -# To use apache libcloud, add the following options to this file -# (config.yml) + +# For extended options for syncing to cloud drive and object store +# services, `fdroid deploy' wraps Rclone. Rclone is a full featured +# sync tool for a huge variety of cloud services. Set up your services +# using `rclone config`, then specify each config name to deploy the +# awsbucket: to. Using rclone_config: overrides the default AWS S3 US +# East setup, and will only sync to the services actually specified. # -# awsbucket: myawsfdroid -# awsaccesskeyid: SEE0CHAITHEIMAUR2USA -# awssecretkey: {env: awssecretkey} -# -# In case s3cmd is installed and rclone is not installed, -# s3cmd will be the preferred sync option. -# It will delete and recreate the whole fdroid directory each time. -# To customize how s3cmd interacts with the cloud -# provider, create a 's3cfg' file next to this file (config.yml), and -# those settings will be used instead of any 'aws' variable below. -# Secrets can be fetched from environment variables to ensure that -# they are not leaked as part of this file. -# -# awsbucket: myawsfdroid -# awsaccesskeyid: SEE0CHAITHEIMAUR2USA -# awssecretkey: {env: awssecretkey} -# -# In case rclone is installed and s3cmd is not installed, -# rclone will be the preferred sync option. -# It will sync the local folders with remote folders without -# deleting anything in one go. -# To ensure success, install rclone as per -# the instructions at https://rclone.org/install/ and also configure for -# object storage services as detailed at https://rclone.org/s3/#configuration -# By default rclone uses the configuration file at ~/.config/rclone/rclone.conf -# To specify a custom configuration file, please add the full path to the -# configuration file as below +# awsbucket: myawsfdroidbucket +# rclone_config: +# - aws-sample-config +# - rclone-supported-service-config + + +# By default Rclone uses the user's default configuration file at +# ~/.config/rclone/rclone.conf To specify a custom configuration file, +# please add the full path to the configuration file as below. # # path_to_custom_rclone_config: /home/mycomputer/somedir/example.conf -# -# This setting will ignore the default rclone config found at -# ~/.config/rclone/rclone.conf -# -# Please note that rclone_config can be assigned a string or list -# -# awsbucket: myawsfdroid -# rclone_config: aws-sample-config -# -# or -# -# awsbucket: myawsfdroid -# rclone_config: [aws-sample-config, rclone-supported-service-config] -# -# In case both rclone and s3cmd are installed, the preferred sync -# tool can be specified in this file (config.yml) -# if s3cmd is preferred, set it as below -# -# s3cmd: true -# -# if rclone is preferred, set it as below -# -# rclone: true -# -# Please note that only one can be set to true at any time -# Also, in the event that both s3cmd and rclone are installed -# and both are missing from the config.yml file, the preferred -# tool will be s3cmd. # If you want to force 'fdroid server' to use a non-standard serverwebroot. diff --git a/fdroidserver/common.py b/fdroidserver/common.py index e03e58c5..127976c3 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -691,10 +691,7 @@ def read_config(): for configname in confignames_to_delete: del config[configname] - if any( - k in config and config.get(k) - for k in ["awssecretkey", "keystorepass", "keypass"] - ): + if any(k in config and config.get(k) for k in ["keystorepass", "keypass"]): st = os.stat(CONFIG_FILE) if st.st_mode & stat.S_IRWXG or st.st_mode & stat.S_IRWXO: logging.warning( diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index b4f98f34..a1fe42c3 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -16,8 +16,8 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import configparser import glob -import hashlib import json import logging import os @@ -47,9 +47,6 @@ GIT_BRANCH = 'master' BINARY_TRANSPARENCY_DIR = 'binary_transparency' -AUTO_S3CFG = '.fdroid-deploy-s3cfg' -USER_S3CFG = 's3cfg' -USER_RCLONE_CONF = None REMOTE_HOSTNAME_REGEX = re.compile(r'\W*\w+\W+(\w+).*') @@ -98,356 +95,145 @@ def _remove_missing_files(files: List[str]) -> List[str]: return existing +def _generate_rclone_include_pattern(files): + """Generate a pattern for rclone's --include flag (https://rclone.org/filtering/).""" + return "{" + ",".join(sorted(set(files))) + "}" + + def update_awsbucket(repo_section, is_index_only=False, verbose=False, quiet=False): - """Upload the contents of the directory `repo_section` (including subdirectories) to the AWS S3 "bucket". + """Sync the directory `repo_section` (including subdirectories) to AWS S3 US East. - The contents of that subdir of the - bucket will first be deleted. + This is a shim function for public API compatibility. + + Requires AWS credentials set as environment variables: + https://rclone.org/s3/#authentication - Requires AWS credentials set in config.yml: awsaccesskeyid, awssecretkey """ - logging.debug( - f'''Syncing "{repo_section}" to Amazon S3 bucket "{config['awsbucket']}"''' - ) - - if common.set_command_in_config('s3cmd') and common.set_command_in_config('rclone'): - logging.info( - 'Both rclone and s3cmd are installed. Checking config.yml for preference.' - ) - if config['s3cmd'] is not True and config['rclone'] is not True: - logging.warning( - 'No syncing tool set in config.yml!. Defaulting to using s3cmd' - ) - update_awsbucket_s3cmd(repo_section, is_index_only) - if config['s3cmd'] is True and config['rclone'] is True: - logging.warning( - 'Both syncing tools set in config.yml!. Defaulting to using s3cmd' - ) - update_awsbucket_s3cmd(repo_section, is_index_only) - if config['s3cmd'] is True and config['rclone'] is not True: - update_awsbucket_s3cmd(repo_section, is_index_only) - if config['rclone'] is True and config['s3cmd'] is not True: - update_remote_storage_with_rclone( - repo_section, is_index_only, verbose, quiet - ) - - elif common.set_command_in_config('s3cmd'): - update_awsbucket_s3cmd(repo_section, is_index_only) - elif common.set_command_in_config('rclone'): - update_remote_storage_with_rclone(repo_section, is_index_only, verbose, quiet) - else: - update_awsbucket_libcloud(repo_section, is_index_only) - - -def update_awsbucket_s3cmd(repo_section, is_index_only=False): - """Upload using the CLI tool s3cmd, which provides rsync-like sync. - - The upload is done in multiple passes to reduce the chance of - interfering with an existing client-server interaction. In the - first pass, only new files are uploaded. In the second pass, - changed files are uploaded, overwriting what is on the server. On - the third/last pass, the indexes are uploaded, and any removed - files are deleted from the server. The last pass is the only pass - to use a full MD5 checksum of all files to detect changes. - """ - logging.debug(_('Using s3cmd to sync with: {url}').format(url=config['awsbucket'])) - - if os.path.exists(USER_S3CFG): - logging.info(_('Using "{path}" for configuring s3cmd.').format(path=USER_S3CFG)) - configfilename = USER_S3CFG - else: - fd = os.open(AUTO_S3CFG, os.O_CREAT | os.O_TRUNC | os.O_WRONLY, 0o600) - logging.debug( - _('Creating "{path}" for configuring s3cmd.').format(path=AUTO_S3CFG) - ) - os.write(fd, '[default]\n'.encode('utf-8')) - os.write( - fd, ('access_key = ' + config['awsaccesskeyid'] + '\n').encode('utf-8') - ) - os.write(fd, ('secret_key = ' + config['awssecretkey'] + '\n').encode('utf-8')) - os.close(fd) - configfilename = AUTO_S3CFG - - s3bucketurl = 's3://' + config['awsbucket'] - s3cmd = [config['s3cmd'], '--config=' + configfilename] - if subprocess.call(s3cmd + ['info', s3bucketurl]) != 0: - logging.warning(_('Creating new S3 bucket: {url}').format(url=s3bucketurl)) - if subprocess.call(s3cmd + ['mb', s3bucketurl]) != 0: - logging.error( - _('Failed to create S3 bucket: {url}').format(url=s3bucketurl) - ) - raise FDroidException() - - s3cmd_sync = s3cmd + ['sync', '--acl-public'] - options = common.get_options() - if options and options.verbose: - s3cmd_sync += ['--verbose'] - if options and options.quiet: - s3cmd_sync += ['--quiet'] - - s3url = s3bucketurl + '/fdroid/' - - logging.debug( - _('s3cmd sync indexes {path} to {url} and delete').format( - path=repo_section, url=s3url - ) - ) - - if is_index_only: - logging.debug( - _('s3cmd syncs indexes from {path} to {url} and deletes removed').format( - path=repo_section, url=s3url - ) - ) - sync_indexes_flags = [] - sync_indexes_flags.extend(_get_index_includes(repo_section)) - sync_indexes_flags.append('--delete-removed') - sync_indexes_flags.append('--delete-after') - if options.no_checksum: - sync_indexes_flags.append('--no-check-md5') - else: - sync_indexes_flags.append('--check-md5') - returncode = subprocess.call( - s3cmd_sync + sync_indexes_flags + [repo_section, s3url] - ) - if returncode != 0: - raise FDroidException() - else: - logging.debug('s3cmd sync new files in ' + repo_section + ' to ' + s3url) - logging.debug(_('Running first pass with MD5 checking disabled')) - excludes = _get_index_excludes(repo_section) - returncode = subprocess.call( - s3cmd_sync - + excludes - + ['--no-check-md5', '--skip-existing', repo_section, s3url] - ) - if returncode != 0: - raise FDroidException() - logging.debug('s3cmd sync all files in ' + repo_section + ' to ' + s3url) - returncode = subprocess.call( - s3cmd_sync + excludes + ['--no-check-md5', repo_section, s3url] - ) - if returncode != 0: - raise FDroidException() - - logging.debug( - _('s3cmd sync indexes {path} to {url} and delete').format( - path=repo_section, url=s3url - ) - ) - s3cmd_sync.append('--delete-removed') - s3cmd_sync.append('--delete-after') - if options.no_checksum: - s3cmd_sync.append('--no-check-md5') - else: - s3cmd_sync.append('--check-md5') - if subprocess.call(s3cmd_sync + [repo_section, s3url]) != 0: - raise FDroidException() + update_remote_storage_with_rclone(repo_section, is_index_only, verbose, quiet) def update_remote_storage_with_rclone( - repo_section, is_index_only=False, verbose=False, quiet=False + repo_section, awsbucket, is_index_only=False, verbose=False, quiet=False ): - """ - Upload fdroid repo folder to remote storage using rclone sync. + """Sync the directory `repo_section` (including subdirectories) to configed cloud services. Rclone sync can send the files to any supported remote storage - service once without numerous polling. - If remote storage is s3 e.g aws s3, wasabi, filebase then path will be - bucket_name/fdroid/repo where bucket_name will be an s3 bucket - If remote storage is storage drive/sftp e.g google drive, rsync.net - the new path will be bucket_name/fdroid/repo where bucket_name - will be a folder + service once without numerous polling. If remote storage is S3 e.g + AWS S3, Wasabi, Filebase, etc, then path will be + bucket_name/fdroid/repo where bucket_name will be an S3 bucket. If + remote storage is storage drive/sftp e.g google drive, rsync.net the + new path will be bucket_name/fdroid/repo where bucket_name will be a + folder + + See https://rclone.org/docs/#config-config-file + + rclone filtering works differently than rsync. For example, + "--include" implies "--exclude **" at the end of an rclone internal + filter list. - Better than the s3cmd command as it does the syncing in one command - Check https://rclone.org/docs/#config-config-file (optional config file) """ - logging.debug(_('Using rclone to sync with: {url}').format(url=config['awsbucket'])) + logging.debug(_('Using rclone to sync to "{name}"').format(name=awsbucket)) - if config.get('path_to_custom_rclone_config') is not None: - USER_RCLONE_CONF = config['path_to_custom_rclone_config'] - if os.path.exists(USER_RCLONE_CONF): - logging.info("'path_to_custom_rclone_config' found in config.yml") - logging.info( - _('Using "{path}" for syncing with remote storage.').format( - path=USER_RCLONE_CONF + rclone_config = config.get('rclone_config', []) + if rclone_config and isinstance(rclone_config, str): + rclone_config = [rclone_config] + + path = config.get('path_to_custom_rclone_config') + if path: + if not os.path.exists(path): + logging.error( + _('path_to_custom_rclone_config: "{path}" does not exist!').format( + path=path ) ) - configfilename = USER_RCLONE_CONF - else: - logging.info('Custom configuration not found.') - logging.info( - 'Using default configuration at {}'.format( - subprocess.check_output(['rclone', 'config', 'file'], text=True) - ) - ) - configfilename = None + sys.exit(1) + configfilename = path else: - logging.warning("'path_to_custom_rclone_config' not found in config.yml") - logging.info('Custom configuration not found.') - logging.info( - 'Using default configuration at {}'.format( - subprocess.check_output(['rclone', 'config', 'file'], text=True) - ) - ) configfilename = None + output = subprocess.check_output(['rclone', 'config', 'file'], text=True) + default_config_path = output.split('\n')[-2] + if os.path.exists(default_config_path): + path = default_config_path + if path: + logging.info(_('Using "{path}" for rclone config.').format(path=path)) upload_dir = 'fdroid/' + repo_section - if not config.get('rclone_config') or not config.get('awsbucket'): - raise FDroidException( - _('To use rclone, rclone_config and awsbucket must be set in config.yml!') - ) - - if is_index_only: - sources = _get_index_file_paths(repo_section) - sources = _remove_missing_files(sources) - else: - sources = [repo_section] - - if isinstance(config['rclone_config'], str): - rclone_config = [config['rclone_config']] - else: - rclone_config = config['rclone_config'] - - for source in sources: - for remote_config in rclone_config: - complete_remote_path = f'{remote_config}:{config["awsbucket"]}/{upload_dir}' - rclone_sync_command = ['rclone', 'sync', source, complete_remote_path] - - if verbose: - rclone_sync_command += ['--verbose'] - elif quiet: - rclone_sync_command += ['--quiet'] - - if configfilename: - rclone_sync_command += ['--config=' + configfilename] - - logging.debug( - "rclone sync all files in " + source + ' to ' + complete_remote_path - ) - - if subprocess.call(rclone_sync_command) != 0: - raise FDroidException() - - -def update_awsbucket_libcloud(repo_section, is_index_only=False): - """No summary. - - Upload the contents of the directory `repo_section` (including - subdirectories) to the AWS S3 "bucket". - - The contents of that subdir of the - bucket will first be deleted. - - Requires AWS credentials set in config.yml: awsaccesskeyid, awssecretkey - """ - logging.debug( - _('using Apache libcloud to sync with {url}').format(url=config['awsbucket']) - ) - - import libcloud.security - - libcloud.security.VERIFY_SSL_CERT = True - from libcloud.storage.providers import get_driver - from libcloud.storage.types import ContainerDoesNotExistError, Provider - - if not config.get('awsaccesskeyid') or not config.get('awssecretkey'): - raise FDroidException( - _( - 'To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.yml!' - ) - ) - awsbucket = config['awsbucket'] - - if os.path.exists(USER_S3CFG): - raise FDroidException( - _('"{path}" exists but s3cmd is not installed!').format(path=USER_S3CFG) - ) - - cls = get_driver(Provider.S3) - driver = cls(config['awsaccesskeyid'], config['awssecretkey']) - try: - container = driver.get_container(container_name=awsbucket) - except ContainerDoesNotExistError: - container = driver.create_container(container_name=awsbucket) - logging.info(_('Created new container "{name}"').format(name=container.name)) - - upload_dir = 'fdroid/' + repo_section - objs = dict() - for obj in container.list_objects(): - if obj.name.startswith(upload_dir + '/'): - objs[obj.name] = obj - - if is_index_only: - index_files = [ - f"{os.getcwd()}/{name}" for name in _get_index_file_paths(repo_section) - ] - files_to_upload = [ - os.path.join(root, name) - for root, dirs, files in os.walk(os.path.join(os.getcwd(), repo_section)) - for name in files - ] - files_to_upload = list(set(files_to_upload) & set(index_files)) - files_to_upload = _remove_missing_files(files_to_upload) - - else: - files_to_upload = [ - os.path.join(root, name) - for root, dirs, files in os.walk(os.path.join(os.getcwd(), repo_section)) - for name in files - ] - - for file_to_upload in files_to_upload: - upload = False - object_name = 'fdroid/' + os.path.relpath(file_to_upload, os.getcwd()) - if object_name not in objs: - upload = True - else: - obj = objs.pop(object_name) - if obj.size != os.path.getsize(file_to_upload): - upload = True - else: - # if the sizes match, then compare by MD5 - md5 = hashlib.md5() # nosec AWS uses MD5 - with open(file_to_upload, 'rb') as f: - while True: - data = f.read(8192) - if not data: - break - md5.update(data) - if obj.hash != md5.hexdigest(): - s3url = 's3://' + awsbucket + '/' + obj.name - logging.info(' deleting ' + s3url) - if not driver.delete_object(obj): - logging.warning('Could not delete ' + s3url) - upload = True - - if upload: - logging.debug(' uploading "' + file_to_upload + '"...') - extra = {'acl': 'public-read'} - if file_to_upload.endswith('.sig'): - extra['content_type'] = 'application/pgp-signature' - elif file_to_upload.endswith('.asc'): - extra['content_type'] = 'application/pgp-signature' - path = os.path.relpath(file_to_upload) - logging.info(f' uploading {path} to s3://{awsbucket}/{object_name}') - with open(file_to_upload, 'rb') as iterator: - obj = driver.upload_object_via_stream( - iterator=iterator, - container=container, - object_name=object_name, - extra=extra, + if not rclone_config: + env = os.environ + # Check both canonical and backup names, but only tell user about canonical. + if not env.get("AWS_SECRET_ACCESS_KEY") and not env.get("AWS_SECRET_KEY"): + raise FDroidException( + _( + """"AWS_SECRET_ACCESS_KEY" must be set as an environmental variable!""" ) - # delete the remnants in the bucket, they do not exist locally - while objs: - object_name, obj = objs.popitem() - s3url = 's3://' + awsbucket + '/' + object_name - if object_name.startswith(upload_dir): - logging.warning(' deleting ' + s3url) - driver.delete_object(obj) + ) + if not env.get("AWS_ACCESS_KEY_ID") and not env.get('AWS_ACCESS_KEY'): + raise FDroidException( + _(""""AWS_ACCESS_KEY_ID" must be set as an environmental variable!""") + ) + + default_remote = "AWS-S3-US-East-1" + env_rclone_config = configparser.ConfigParser() + env_rclone_config.add_section(default_remote) + env_rclone_config.set( + default_remote, + '; = This file is auto-generated by fdroid deploy, do not edit!', + '', + ) + env_rclone_config.set(default_remote, "type", "s3") + env_rclone_config.set(default_remote, "provider", "AWS") + env_rclone_config.set(default_remote, "region", "us-east-1") + env_rclone_config.set(default_remote, "env_auth", "true") + + configfilename = ".fdroid-deploy-rclone.conf" + with open(configfilename, "w", encoding="utf-8") as autoconfigfile: + env_rclone_config.write(autoconfigfile) + rclone_config = [default_remote] + + rclone_sync_command = ['rclone', 'sync', '--delete-after'] + if configfilename: + rclone_sync_command += ['--config', configfilename] + + if verbose: + rclone_sync_command += ['--verbose'] + elif quiet: + rclone_sync_command += ['--quiet'] + + # TODO copying update_serverwebroot rsync algo + for remote_config in rclone_config: + complete_remote_path = f'{remote_config}:{awsbucket}/{upload_dir}' + logging.info(f'rclone sync to {complete_remote_path}') + if is_index_only: + index_only_files = common.INDEX_FILES + ['diff/*.*'] + include_pattern = _generate_rclone_include_pattern(index_only_files) + cmd = rclone_sync_command + [ + '--include', + include_pattern, + '--delete-excluded', + repo_section, + complete_remote_path, + ] + logging.info(cmd) + if subprocess.call(cmd) != 0: + raise FDroidException() else: - logging.info(' skipping ' + s3url) + cmd = ( + rclone_sync_command + + _get_index_excludes(repo_section) + + [ + repo_section, + complete_remote_path, + ] + ) + if subprocess.call(cmd) != 0: + raise FDroidException() + cmd = rclone_sync_command + [ + repo_section, + complete_remote_path, + ] + if subprocess.call(cmd) != 0: + raise FDroidException() def update_serverwebroot(serverwebroot, repo_section): @@ -1342,8 +1128,11 @@ def main(): # update_servergitmirrors will take care of multiple mirrors so don't need a foreach update_servergitmirrors(config['servergitmirrors'], repo_section) if config.get('awsbucket'): + awsbucket = config['awsbucket'] index_only = config.get('awsbucket_index_only') - update_awsbucket(repo_section, index_only, options.verbose, options.quiet) + update_remote_storage_with_rclone( + repo_section, awsbucket, index_only, options.verbose, options.quiet + ) if config.get('androidobservatory'): upload_to_android_observatory(repo_section) if config.get('virustotal_apikey'): diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index cd3a7437..99b1a392 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -228,9 +228,7 @@ bool_keys = ( 'make_current_version_link', 'nonstandardwebroot', 'per_app_repos', - 'rclone', 'refresh_scanner', - 's3cmd', 'scan_binary', 'sync_from_local_copy_dir', ) @@ -245,9 +243,8 @@ check_config_keys = ( 'archive_older', 'archive_url', 'archive_web_base_url', - 'awsaccesskeyid', 'awsbucket', - 'awssecretkey', + 'awsbucket_index_only', 'binary_transparency_remote', 'cachedir', 'char_limits', diff --git a/setup.py b/setup.py index e6d374a8..5fa1c9b4 100755 --- a/setup.py +++ b/setup.py @@ -101,7 +101,6 @@ setup( 'oscrypto', 'paramiko', 'Pillow', - 'apache-libcloud >= 0.14.1', 'puremagic', 'pycountry ; sys_platform=="darwin"', 'python-vagrant', @@ -123,7 +122,7 @@ setup( 'pycountry', 'python-magic', ], - 'test': ['pyjks', 'html5print'], + 'test': ['pyjks', 'html5print', 'testcontainers[minio]'], 'docs': [ 'sphinx', 'numpydoc', diff --git a/tests/test_deploy.py b/tests/test_deploy.py index 60d157c3..c263ef2d 100755 --- a/tests/test_deploy.py +++ b/tests/test_deploy.py @@ -15,6 +15,12 @@ import fdroidserver from .shared_test_code import TmpCwd, VerboseFalseOptions, mkdtemp basedir = Path(__file__).parent +FILES = basedir + + +def _mock_rclone_config_file(cmd, text): # pylint: disable=unused-argument + """Mock output from rclone 1.60.1 but with nonexistent conf file.""" + return "Configuration file doesn't exist, but rclone will use this path:\n/nonexistent/rclone.conf\n" class DeployTest(unittest.TestCase): @@ -27,7 +33,6 @@ class DeployTest(unittest.TestCase): fdroidserver.common.options = mock.Mock() fdroidserver.deploy.config = {} - fdroidserver.deploy.USER_RCLONE_CONF = False def tearDown(self): self._td.cleanup() @@ -89,7 +94,7 @@ class DeployTest(unittest.TestCase): with self.assertRaises(SystemExit): fdroidserver.deploy.update_serverwebroots([{'url': 'ssh://nope'}], 'repo') - @unittest.skipUnless(shutil.which('rclone'), '/usr/bin/rclone') + @unittest.skipUnless(shutil.which('rclone'), 'requires rclone') def test_update_remote_storage_with_rclone(self): os.chdir(self.testdir) repo = Path('repo') @@ -114,26 +119,25 @@ class DeployTest(unittest.TestCase): rclone_config.write(configfile) # setup parameters for this test run - fdroidserver.deploy.config['awsbucket'] = 'test_bucket_folder' - fdroidserver.deploy.config['rclone'] = True + awsbucket = 'test_bucket_folder' + fdroidserver.deploy.config['awsbucket'] = awsbucket fdroidserver.deploy.config['rclone_config'] = 'test-local-config' fdroidserver.deploy.config['path_to_custom_rclone_config'] = str(rclone_file) fdroidserver.common.options = VerboseFalseOptions # write out destination path - destination = Path('test_bucket_folder/fdroid') + destination = Path(f'{awsbucket}/fdroid') destination.mkdir(parents=True, exist_ok=True) dest_apk = Path(destination) / fake_apk dest_index = Path(destination) / fake_index self.assertFalse(dest_apk.is_file()) self.assertFalse(dest_index.is_file()) repo_section = str(repo) - # fdroidserver.deploy.USER_RCLONE_CONF = str(rclone_file) - fdroidserver.deploy.update_remote_storage_with_rclone(repo_section) + fdroidserver.deploy.update_remote_storage_with_rclone(repo_section, awsbucket) self.assertTrue(dest_apk.is_file()) self.assertTrue(dest_index.is_file()) - @unittest.skipUnless(shutil.which('rclone'), '/usr/bin/rclone') + @unittest.skipUnless(shutil.which('rclone'), 'requires rclone') def test_update_remote_storage_with_rclone_in_index_only_mode(self): os.chdir(self.testdir) repo = Path('repo') @@ -158,51 +162,131 @@ class DeployTest(unittest.TestCase): rclone_config.write(configfile) # setup parameters for this test run - fdroidserver.deploy.config['awsbucket'] = 'test_bucket_folder' - fdroidserver.deploy.config['rclone'] = True + awsbucket = 'test_bucket_folder' + fdroidserver.deploy.config['awsbucket'] = awsbucket fdroidserver.deploy.config['rclone_config'] = 'test-local-config' fdroidserver.deploy.config['path_to_custom_rclone_config'] = str(rclone_file) fdroidserver.common.options = VerboseFalseOptions # write out destination path - destination = Path('test_bucket_folder/fdroid') + destination = Path(f'{awsbucket}/fdroid') destination.mkdir(parents=True, exist_ok=True) dest_apk = Path(destination) / fake_apk dest_index = Path(destination) / fake_index self.assertFalse(dest_apk.is_file()) self.assertFalse(dest_index.is_file()) repo_section = str(repo) - # fdroidserver.deploy.USER_RCLONE_CONF = str(rclone_file) fdroidserver.deploy.update_remote_storage_with_rclone( - repo_section, is_index_only=True + repo_section, awsbucket, is_index_only=True ) self.assertFalse(dest_apk.is_file()) self.assertTrue(dest_index.is_file()) + @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) + @mock.patch('subprocess.check_output', _mock_rclone_config_file) + def test_update_remote_storage_with_rclone_awsbucket_no_env_vars(self): + with self.assertRaises(fdroidserver.exception.FDroidException): + fdroidserver.deploy.update_remote_storage_with_rclone('repo', 'foobucket') + + @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) + @mock.patch('subprocess.check_output', _mock_rclone_config_file) + def test_update_remote_storage_with_rclone_awsbucket_no_AWS_SECRET_ACCESS_KEY(self): + os.environ['AWS_ACCESS_KEY_ID'] = 'accesskey' + with self.assertRaises(fdroidserver.exception.FDroidException): + fdroidserver.deploy.update_remote_storage_with_rclone('repo', 'foobucket') + + @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) + @mock.patch('subprocess.check_output', _mock_rclone_config_file) + def test_update_remote_storage_with_rclone_awsbucket_no_AWS_ACCESS_KEY_ID(self): + os.environ['AWS_SECRET_ACCESS_KEY'] = 'secrets' # nosec B105 + with self.assertRaises(fdroidserver.exception.FDroidException): + fdroidserver.deploy.update_remote_storage_with_rclone('repo', 'foobucket') + + @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) + @mock.patch('subprocess.check_output', _mock_rclone_config_file) @mock.patch('subprocess.call') - @mock.patch('subprocess.check_output', lambda cmd, text: '/path/to/rclone.conf') - def test_update_remote_storage_with_rclone_mock(self, mock_call): + def test_update_remote_storage_with_rclone_awsbucket_env_vars(self, mock_call): + awsbucket = 'test_bucket_folder' + os.environ['AWS_ACCESS_KEY_ID'] = 'accesskey' + os.environ['AWS_SECRET_ACCESS_KEY'] = 'secrets' # nosec B105 + def _mock_subprocess_call(cmd): self.assertEqual( - cmd, + cmd[:5], [ 'rclone', 'sync', - 'repo', - 'test_local_config:test_bucket_folder/fdroid/repo', + '--delete-after', + '--config', + '.fdroid-deploy-rclone.conf', ], ) return 0 + mock_call.side_effect = _mock_subprocess_call + fdroidserver.deploy.config = {'awsbucket': awsbucket} + fdroidserver.deploy.update_remote_storage_with_rclone('repo', awsbucket) + mock_call.assert_called() + + @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True) + @mock.patch('subprocess.check_output', _mock_rclone_config_file) + @mock.patch('subprocess.call') + def test_update_remote_storage_with_rclone_mock_awsbucket(self, mock_call): + awsbucket = 'test_bucket_folder' + os.environ['AWS_ACCESS_KEY_ID'] = 'accesskey' + os.environ['AWS_SECRET_ACCESS_KEY'] = 'secrets' # nosec B105 + self.last_cmd = None + + def _mock_subprocess_call(cmd): + self.last_cmd = cmd + return 0 + + mock_call.side_effect = _mock_subprocess_call + + fdroidserver.deploy.config = {'awsbucket': awsbucket} + fdroidserver.deploy.update_remote_storage_with_rclone('repo', awsbucket) + self.maxDiff = None + self.assertEqual( + self.last_cmd, + [ + 'rclone', + 'sync', + '--delete-after', + '--config', + '.fdroid-deploy-rclone.conf', + 'repo', + f'AWS-S3-US-East-1:{awsbucket}/fdroid/repo', + ], + ) + + @mock.patch('subprocess.check_output', _mock_rclone_config_file) + @mock.patch('subprocess.call') + def test_update_remote_storage_with_rclone_mock_rclone_config(self, mock_call): + awsbucket = 'test_bucket_folder' + self.last_cmd = None + + def _mock_subprocess_call(cmd): + self.last_cmd = cmd + return 0 + mock_call.side_effect = _mock_subprocess_call fdroidserver.deploy.config = { - 'awsbucket': 'test_bucket_folder', - 'rclone': True, + 'awsbucket': awsbucket, 'rclone_config': 'test_local_config', } - fdroidserver.deploy.update_remote_storage_with_rclone('repo') - mock_call.assert_called_once() + fdroidserver.deploy.update_remote_storage_with_rclone('repo', awsbucket) + self.maxDiff = None + self.assertEqual( + self.last_cmd, + [ + 'rclone', + 'sync', + '--delete-after', + 'repo', + 'test_local_config:test_bucket_folder/fdroid/repo', + ], + ) def test_update_serverwebroot(self): """rsync works with file paths, so this test uses paths for the URLs""" @@ -668,399 +752,6 @@ class DeployTest(unittest.TestCase): name, fdroidserver.deploy.REMOTE_HOSTNAME_REGEX.sub(r'\1', remote_url) ) - def test_update_awsbucket_s3cmd(self): - # setup parameters for this test run - fdroidserver.common.options = mock.Mock() - fdroidserver.common.options.no_checksum = True - fdroidserver.common.options.verbose = False - fdroidserver.common.options.quiet = True - - config = {} - fdroidserver.common.fill_config_defaults(config) - fdroidserver.deploy.config = config - fdroidserver.deploy.config["awsbucket"] = "bucket" - fdroidserver.deploy.config["awsaccesskeyid"] = "accesskeyid" - fdroidserver.deploy.config["awssecretkey"] = "secretkey" - fdroidserver.deploy.config["s3cmd"] = "s3cmd" - - repo_section = 'repo' - - # setup function for asserting subprocess.call invocations - call_iteration = 0 - - def update_awsbucket_s3cmd_call(cmd): - nonlocal call_iteration - if call_iteration == 0: - self.assertListEqual( - cmd, - [ - 's3cmd', - f"--config={fdroidserver.deploy.AUTO_S3CFG}", - 'info', - f"s3://{fdroidserver.deploy.config['awsbucket']}", - ], - ) - elif call_iteration == 1: - self.assertListEqual( - cmd, - [ - 's3cmd', - f"--config={fdroidserver.deploy.AUTO_S3CFG}", - 'sync', - '--acl-public', - '--quiet', - '--exclude', - 'repo/altstore-index.json', - '--exclude', - 'repo/altstore-index.json.asc', - '--exclude', - 'repo/entry.jar', - '--exclude', - 'repo/entry.json', - '--exclude', - 'repo/entry.json.asc', - '--exclude', - 'repo/index-v1.jar', - '--exclude', - 'repo/index-v1.json', - '--exclude', - 'repo/index-v1.json.asc', - '--exclude', - 'repo/index-v2.json', - '--exclude', - 'repo/index-v2.json.asc', - '--exclude', - 'repo/index.css', - '--exclude', - 'repo/index.html', - '--exclude', - 'repo/index.jar', - '--exclude', - 'repo/index.png', - '--exclude', - 'repo/index.xml', - '--exclude', - 'repo/signer-index.jar', - '--exclude', - 'repo/signer-index.json', - '--exclude', - 'repo/signer-index.json.asc', - '--no-check-md5', - '--skip-existing', - repo_section, - f"s3://{fdroidserver.deploy.config['awsbucket']}/fdroid/", - ], - ) - elif call_iteration == 2: - self.assertListEqual( - cmd, - [ - 's3cmd', - f"--config={fdroidserver.deploy.AUTO_S3CFG}", - 'sync', - '--acl-public', - '--quiet', - '--exclude', - 'repo/altstore-index.json', - '--exclude', - 'repo/altstore-index.json.asc', - '--exclude', - 'repo/entry.jar', - '--exclude', - 'repo/entry.json', - '--exclude', - 'repo/entry.json.asc', - '--exclude', - 'repo/index-v1.jar', - '--exclude', - 'repo/index-v1.json', - '--exclude', - 'repo/index-v1.json.asc', - '--exclude', - 'repo/index-v2.json', - '--exclude', - 'repo/index-v2.json.asc', - '--exclude', - 'repo/index.css', - '--exclude', - 'repo/index.html', - '--exclude', - 'repo/index.jar', - '--exclude', - 'repo/index.png', - '--exclude', - 'repo/index.xml', - '--exclude', - 'repo/signer-index.jar', - '--exclude', - 'repo/signer-index.json', - '--exclude', - 'repo/signer-index.json.asc', - '--no-check-md5', - repo_section, - f"s3://{fdroidserver.deploy.config['awsbucket']}/fdroid/", - ], - ) - elif call_iteration == 3: - self.assertListEqual( - cmd, - [ - 's3cmd', - f"--config={fdroidserver.deploy.AUTO_S3CFG}", - 'sync', - '--acl-public', - '--quiet', - '--delete-removed', - '--delete-after', - '--no-check-md5', - repo_section, - f"s3://{fdroidserver.deploy.config['awsbucket']}/fdroid/", - ], - ) - else: - self.fail('unexpected subprocess.call invocation') - call_iteration += 1 - return 0 - - with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): - os.mkdir('repo') - os.symlink('repo/com.example.sym.apk', 'Sym.apk') - os.symlink('repo/com.example.sym.apk.asc', 'Sym.apk.asc') - os.symlink('repo/com.example.sym.apk.sig', 'Sym.apk.sig') - with mock.patch('subprocess.call', side_effect=update_awsbucket_s3cmd_call): - fdroidserver.deploy.update_awsbucket_s3cmd(repo_section) - self.assertEqual(call_iteration, 4, 'expected 4 invocations of subprocess.call') - - def test_update_awsbucket_s3cmd_in_index_only_mode(self): - # setup parameters for this test run - fdroidserver.common.options = mock.Mock() - fdroidserver.common.options.no_checksum = True - fdroidserver.common.options.verbose = False - fdroidserver.common.options.quiet = True - - config = {} - fdroidserver.common.fill_config_defaults(config) - fdroidserver.deploy.config = config - fdroidserver.deploy.config["awsbucket"] = "bucket" - fdroidserver.deploy.config["awsaccesskeyid"] = "accesskeyid" - fdroidserver.deploy.config["awssecretkey"] = "secretkey" - fdroidserver.deploy.config["s3cmd"] = "s3cmd" - - repo_section = 'repo' - - # setup function for asserting subprocess.call invocations - call_iteration = 0 - - def update_awsbucket_s3cmd_call(cmd): - nonlocal call_iteration - if call_iteration == 0: - self.assertListEqual( - cmd, - [ - 's3cmd', - f"--config={fdroidserver.deploy.AUTO_S3CFG}", - 'info', - f"s3://{fdroidserver.deploy.config['awsbucket']}", - ], - ) - elif call_iteration == 1: - self.assertListEqual( - cmd, - [ - 's3cmd', - f"--config={fdroidserver.deploy.AUTO_S3CFG}", - 'sync', - '--acl-public', - '--quiet', - '--include', - 'repo/altstore-index.json', - '--include', - 'repo/altstore-index.json.asc', - '--include', - 'repo/entry.jar', - '--include', - 'repo/entry.json', - '--include', - 'repo/entry.json.asc', - '--include', - 'repo/index-v1.jar', - '--include', - 'repo/index-v1.json', - '--include', - 'repo/index-v1.json.asc', - '--include', - 'repo/index-v2.json', - '--include', - 'repo/index-v2.json.asc', - '--include', - 'repo/index.css', - '--include', - 'repo/index.html', - '--include', - 'repo/index.jar', - '--include', - 'repo/index.png', - '--include', - 'repo/index.xml', - '--include', - 'repo/signer-index.jar', - '--include', - 'repo/signer-index.json', - '--include', - 'repo/signer-index.json.asc', - '--delete-removed', - '--delete-after', - '--no-check-md5', - repo_section, - f"s3://{fdroidserver.deploy.config['awsbucket']}/fdroid/", - ], - ) - else: - self.fail('unexpected subprocess.call invocation') - call_iteration += 1 - return 0 - - with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): - os.mkdir('repo') - os.symlink('repo/com.example.sym.apk', 'Sym.apk') - os.symlink('repo/com.example.sym.apk.asc', 'Sym.apk.asc') - os.symlink('repo/com.example.sym.apk.sig', 'Sym.apk.sig') - with mock.patch('subprocess.call', side_effect=update_awsbucket_s3cmd_call): - fdroidserver.deploy.update_awsbucket_s3cmd( - repo_section, is_index_only=True - ) - self.assertEqual(call_iteration, 2, 'expected 2 invocations of subprocess.call') - - def test_update_awsbucket_libcloud(self): - from libcloud.storage.base import Container - - # setup parameters for this test run - fdroidserver.common.options = mock.Mock() - fdroidserver.common.options.no_checksum = True - fdroidserver.common.options.verbose = False - fdroidserver.common.options.quiet = True - - config = {} - fdroidserver.common.fill_config_defaults(config) - fdroidserver.deploy.config = config - fdroidserver.deploy.config["awsbucket"] = "bucket" - fdroidserver.deploy.config["awsaccesskeyid"] = "accesskeyid" - fdroidserver.deploy.config["awssecretkey"] = "secretkey" - fdroidserver.deploy.config["s3cmd"] = "s3cmd" - - repo_section = 'repo' - - os.chdir(self.testdir) - repo = Path('repo') - repo.mkdir(parents=True) - fake_apk = repo / 'Sym.apk' - with fake_apk.open('w') as fp: - fp.write('not an APK, but has the right filename') - fake_index = repo / fdroidserver.common.INDEX_FILES[0] - with fake_index.open('w') as fp: - fp.write('not an index, but has the right filename') - - with mock.patch( - 'libcloud.storage.drivers.s3.S3StorageDriver' - ) as mock_driver_class: - mock_driver = mock_driver_class.return_value - mock_container = mock.MagicMock(spec=Container) - mock_container.list_objects.return_value = [ - mock.MagicMock(name='Sym.apk'), - mock.MagicMock(name=fdroidserver.common.INDEX_FILES[0]), - ] - - mock_driver.get_container.return_value = mock_container - mock_driver.upload_object_via_stream.return_value = None - - fdroidserver.deploy.update_awsbucket_libcloud(repo_section) - - mock_driver.get_container.assert_called_once_with( - container_name=fdroidserver.deploy.config["awsbucket"] - ) - mock_container.list_objects.assert_called_once_with() - files_to_upload = [ - 'fdroid/repo/Sym.apk', - f"fdroid/repo/{fdroidserver.common.INDEX_FILES[0]}", - ] - calls = [ - mock.call( - iterator=mock.ANY, - container=mock_container, - object_name=file, - extra={'acl': 'public-read'}, - ) - for file in files_to_upload - ] - mock_driver.upload_object_via_stream.assert_has_calls(calls, any_order=True) - self.assertEqual(mock_driver.upload_object_via_stream.call_count, 2) - - def test_update_awsbucket_libcloud_in_index_only_mode(self): - from libcloud.storage.base import Container - - # setup parameters for this test run - fdroidserver.common.options = mock.Mock() - fdroidserver.common.options.no_checksum = True - fdroidserver.common.options.verbose = False - fdroidserver.common.options.quiet = True - - config = {} - fdroidserver.common.fill_config_defaults(config) - fdroidserver.deploy.config = config - fdroidserver.deploy.config["awsbucket"] = "bucket" - fdroidserver.deploy.config["awsaccesskeyid"] = "accesskeyid" - fdroidserver.deploy.config["awssecretkey"] = "secretkey" - fdroidserver.deploy.config["s3cmd"] = "s3cmd" - - repo_section = 'repo' - - os.chdir(self.testdir) - repo = Path('repo') - repo.mkdir(parents=True) - fake_apk = repo / 'Sym.apk' - with fake_apk.open('w') as fp: - fp.write('not an APK, but has the right filename') - fake_index = repo / fdroidserver.common.INDEX_FILES[0] - with fake_index.open('w') as fp: - fp.write('not an index, but has the right filename') - - with mock.patch( - 'libcloud.storage.drivers.s3.S3StorageDriver' - ) as mock_driver_class: - mock_driver = mock_driver_class.return_value - mock_container = mock.MagicMock(spec=Container) - mock_container.list_objects.return_value = [ - mock.MagicMock(name='Sym.apk'), - mock.MagicMock(name=fdroidserver.common.INDEX_FILES[0]), - ] - - mock_driver.get_container.return_value = mock_container - mock_driver.upload_object_via_stream.return_value = None - - fdroidserver.deploy.update_awsbucket_libcloud( - repo_section, is_index_only=True - ) - - mock_driver.get_container.assert_called_once_with( - container_name=fdroidserver.deploy.config["awsbucket"] - ) - mock_container.list_objects.assert_called_once_with() - files_to_upload = [f"fdroid/repo/{fdroidserver.common.INDEX_FILES[0]}"] - calls = [ - mock.call( - iterator=mock.ANY, - container=mock_container, - object_name=file, - extra={'acl': 'public-read'}, - ) - for file in files_to_upload - ] - mock_driver.upload_object_via_stream.assert_has_calls( - calls, - any_order=False, - ) - self.assertEqual(mock_driver.upload_object_via_stream.call_count, 1) - def test_update_servergitmirrors(self): # setup parameters for this test run fdroidserver.common.options = mock.Mock() diff --git a/tests/test_integration.py b/tests/test_integration.py index 6d757b1e..70fe4f7b 100755 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -1,9 +1,11 @@ +import configparser import itertools import os import platform import re import shlex import shutil +import stat import subprocess import sys import threading @@ -19,7 +21,7 @@ except ModuleNotFoundError: from fdroidserver._yaml import yaml, yaml_dumper -from .shared_test_code import mkdir_testfiles +from .shared_test_code import mkdir_testfiles, VerboseFalseOptions # TODO: port generic tests that use index.xml to index-v2 (test that # explicitly test index-v0 should still use index.xml) @@ -34,12 +36,17 @@ except KeyError: WORKSPACE = basedir.parent from fdroidserver import common +from fdroidserver import deploy conf = {"sdk_path": os.getenv("ANDROID_HOME", "")} common.find_apksigner(conf) USE_APKSIGNER = "apksigner" in conf +def docker_socket_exists(path="/var/run/docker.sock"): + return os.path.exists(path) and stat.S_ISSOCK(os.stat(path).st_mode) + + @unittest.skipIf(sys.byteorder == 'big', 'androguard is not ported to big-endian') class IntegrationTest(unittest.TestCase): @classmethod @@ -64,6 +71,7 @@ class IntegrationTest(unittest.TestCase): self.testdir = mkdir_testfiles(WORKSPACE, self) self.tmp_repo_root = self.testdir / "fdroid" self.tmp_repo_root.mkdir(parents=True) + deploy.config = {} os.chdir(self.tmp_repo_root) def tearDown(self): @@ -1556,3 +1564,114 @@ class IntegrationTest(unittest.TestCase): self.fdroid_cmd + ["checkupdates", "--allow-dirty", "--auto", "-v"] ) self.assertIn("CurrentVersionCode: 1", Path("metadata/fake.yml").read_text()) + + @unittest.skipUnless(docker_socket_exists(), "Docker is not available") + def test_update_remote_storage_with_rclone_and_minio(self): + try: + from testcontainers.minio import MinioContainer + except ImportError: + self.skipTest('Requires testcontainers.minio to run') + with MinioContainer(image="quay.io/minio/minio:latest") as minio: + # Set up minio bukcet + client = minio.get_client() + client.make_bucket('test-bucket') + host_ip = minio.get_config()['endpoint'] + + # Set up Repo dir + os.chdir(self.testdir) + repo_section = 'repo' + repo = Path(repo_section) + repo.mkdir(parents=True, exist_ok=True) + shutil.copy(basedir / 'SpeedoMeterApp.main_1.apk', repo) + shutil.copy(basedir / 'repo/index-v2.json', repo) + + # write out config for test use + rclone_config = configparser.ConfigParser() + rclone_config.add_section("test-minio-config") + rclone_config.set("test-minio-config", "type", "s3") + rclone_config.set("test-minio-config", "provider", "Minio") + rclone_config.set("test-minio-config", "endpoint", "http://" + host_ip) + rclone_config.set("test-minio-config", "acl", "public-read") + rclone_config.set("test-minio-config", "env_auth", "true") + rclone_config.set("test-minio-config", "region", "us-east-1") + rclone_config.set("test-minio-config", "access_key_id", "minioadmin") + rclone_config.set("test-minio-config", "secret_access_key", "minioadmin") + + rclone_config_path = Path('rclone_config_path') + rclone_config_path.mkdir(parents=True, exist_ok=True) + rclone_file = rclone_config_path / 'rclone-minio.conf' + with open(rclone_file, "w", encoding="utf-8") as configfile: + rclone_config.write(configfile) + + # set up config for run + awsbucket = "test-bucket" + deploy.config['awsbucket'] = awsbucket + deploy.config['rclone_config'] = "test-minio-config" + deploy.config['path_to_custom_rclone_config'] = str(rclone_file) + common.options = VerboseFalseOptions + + # call function + deploy.update_remote_storage_with_rclone(repo_section, awsbucket) + + # check if apk and index file are available + bucket_content = client.list_objects('test-bucket', recursive=True) + files_in_bucket = {obj.object_name for obj in bucket_content} + self.assertEqual( + files_in_bucket, + {'fdroid/repo/SpeedoMeterApp.main_1.apk', 'fdroid/repo/index-v2.json'}, + ) + + @unittest.skipUnless(docker_socket_exists(), "Docker is not available") + def test_update_remote_storage_with_rclone_and_minio_in_index_only_mode(self): + try: + from testcontainers.minio import MinioContainer + except ImportError: + self.skipTest('Requires testcontainers.minio to run') + with MinioContainer(image="quay.io/minio/minio:latest") as minio: + # Set up minio bukcet + client = minio.get_client() + client.make_bucket('test-bucket') + host_ip = minio.get_config()['endpoint'] + + # Set up Repo dir + os.chdir(self.testdir) + repo_section = 'repo' + repo = Path(repo_section) + repo.mkdir(parents=True, exist_ok=True) + shutil.copy(basedir / 'SpeedoMeterApp.main_1.apk', repo) + shutil.copy(basedir / 'repo/index-v2.json', repo) + + # write out config for test use + rclone_config = configparser.ConfigParser() + rclone_config.add_section("test-minio-config") + rclone_config.set("test-minio-config", "type", "s3") + rclone_config.set("test-minio-config", "provider", "Minio") + rclone_config.set("test-minio-config", "endpoint", "http://" + host_ip) + rclone_config.set("test-minio-config", "acl", "public-read") + rclone_config.set("test-minio-config", "env_auth", "true") + rclone_config.set("test-minio-config", "region", "us-east-1") + rclone_config.set("test-minio-config", "access_key_id", "minioadmin") + rclone_config.set("test-minio-config", "secret_access_key", "minioadmin") + + rclone_config_path = Path('rclone_config_path') + rclone_config_path.mkdir(parents=True, exist_ok=True) + rclone_file = rclone_config_path / 'rclone-minio.conf' + with open(rclone_file, "w", encoding="utf-8") as configfile: + rclone_config.write(configfile) + + # set up config for run + awsbucket = "test-bucket" + deploy.config['awsbucket'] = awsbucket + deploy.config['rclone_config'] = "test-minio-config" + deploy.config['path_to_custom_rclone_config'] = str(rclone_file) + common.options = VerboseFalseOptions + + # call function + deploy.update_remote_storage_with_rclone( + repo_section, awsbucket, is_index_only=True + ) + + # check if apk and index file are available + bucket_content = client.list_objects('test-bucket', recursive=True) + files_in_bucket = {obj.object_name for obj in bucket_content} + self.assertEqual(files_in_bucket, {'fdroid/repo/index-v2.json'}) From 1f9fb16844034baf4121bf35c49f2d7466537f20 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 17 Sep 2025 09:58:16 +0200 Subject: [PATCH 2112/2116] deploy: find rclone.conf in the root of the repo This enables the same way of managing the config as existed with s3cmd's s3cfg file. --- fdroidserver/deploy.py | 8 ++++++++ tests/test_deploy.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index a1fe42c3..abaab805 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -49,6 +49,8 @@ BINARY_TRANSPARENCY_DIR = 'binary_transparency' REMOTE_HOSTNAME_REGEX = re.compile(r'\W*\w+\W+(\w+).*') +EMBEDDED_RCLONE_CONF = 'rclone.conf' + def _get_index_file_paths(base_dir): """Return the list of files to be synced last, since they finalize the deploy. @@ -131,6 +133,9 @@ def update_remote_storage_with_rclone( "--include" implies "--exclude **" at the end of an rclone internal filter list. + If rclone.conf is in the root of the repo, then it will be preferred + over the rclone default config paths. + """ logging.debug(_('Using rclone to sync to "{name}"').format(name=awsbucket)) @@ -148,6 +153,9 @@ def update_remote_storage_with_rclone( ) sys.exit(1) configfilename = path + elif os.path.exists(EMBEDDED_RCLONE_CONF): + path = EMBEDDED_RCLONE_CONF # in this case, only for display + configfilename = EMBEDDED_RCLONE_CONF else: configfilename = None output = subprocess.check_output(['rclone', 'config', 'file'], text=True) diff --git a/tests/test_deploy.py b/tests/test_deploy.py index c263ef2d..d7de7545 100755 --- a/tests/test_deploy.py +++ b/tests/test_deploy.py @@ -288,6 +288,39 @@ class DeployTest(unittest.TestCase): ], ) + @mock.patch('subprocess.check_output', _mock_rclone_config_file) + @mock.patch('subprocess.call') + def test_update_remote_storage_with_rclone_mock_default_user_path(self, mock_call): + self.last_cmd = None + + def _mock_subprocess_call(cmd): + self.last_cmd = cmd + return 0 + + mock_call.side_effect = _mock_subprocess_call + + os.chdir(self.testdir) + config_name = 'test_local_config' + Path('rclone.conf').write_text('placeholder, contents ignored') + + awsbucket = 'test_bucket_folder' + fdroidserver.deploy.config['awsbucket'] = awsbucket + fdroidserver.deploy.config['rclone_config'] = config_name + fdroidserver.deploy.update_remote_storage_with_rclone('repo', awsbucket) + self.maxDiff = None + self.assertEqual( + self.last_cmd, + [ + 'rclone', + 'sync', + '--delete-after', + '--config', + fdroidserver.deploy.EMBEDDED_RCLONE_CONF, + 'repo', + f'{config_name}:{awsbucket}/fdroid/repo', + ], + ) + def test_update_serverwebroot(self): """rsync works with file paths, so this test uses paths for the URLs""" os.chdir(self.testdir) From b6d6d46aeb088dd15d1f5b611e24aa00840c907e Mon Sep 17 00:00:00 2001 From: thefuture Date: Thu, 18 Sep 2025 08:29:22 +0000 Subject: [PATCH 2113/2116] error if repo rclone.conf is not referenced in config.yml --- fdroidserver/deploy.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index abaab805..cff6e35f 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -156,6 +156,8 @@ def update_remote_storage_with_rclone( elif os.path.exists(EMBEDDED_RCLONE_CONF): path = EMBEDDED_RCLONE_CONF # in this case, only for display configfilename = EMBEDDED_RCLONE_CONF + if not rclone_config: + raise FDroidException(_("'rclone_config' must be set in config.yml!")) else: configfilename = None output = subprocess.check_output(['rclone', 'config', 'file'], text=True) From 8b11e098dbf9b256bde6fe97b7ba822971fe097d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 17 Sep 2025 15:02:31 +0200 Subject: [PATCH 2114/2116] checkupdates: fix get_upstream_main_branch() for Debian/forky ``` FAIL: test_get_upstream_main_branch (tests.test_checkupdates.CheckupdatesTest.test_get_upstream_main_branch) ---------------------------------------------------------------------- Traceback (most recent call last): File "/builds/fdroid/fdroidserver/tests/test_checkupdates.py", line 509, in test_get_upstream_main_branch self.assertEqual( ~~~~~~~~~~~~~~~~^ f'upstream/{testvalue}', ^^^^^^^^^^^^^^^^^^^^^^^^ branch, ^^^^^^^ f'The default branch should be called {testvalue}!', ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ AssertionError: 'upstream/foo' != 'upstream/main' - upstream/foo + upstream/main : The default branch should be called foo! ``` --- fdroidserver/checkupdates.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index 3cf7a821..e7945910 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -691,11 +691,15 @@ def get_last_build_from_app(app: metadata.App) -> metadata.Build: def get_upstream_main_branch(git_repo): - if len(git_repo.remotes.upstream.refs) == 1: - return git_repo.remotes.upstream.refs[0].name - for name in ('main', 'master'): - if name in git_repo.remotes.upstream.refs: - return f'upstream/{name}' + refs = list() + for ref in git_repo.remotes.upstream.refs: + if ref.name != 'upstream/HEAD': + refs.append(ref.name) + if len(refs) == 1: + return refs[0] + for name in ('upstream/main', 'upstream/master'): + if name in refs: + return name try: with git_repo.config_reader() as reader: return 'upstream/%s' % reader.get_value('init', 'defaultBranch') From 5f6e59c76dd76e205da439d7382f75a08e395911 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Sat, 2 Aug 2025 22:18:13 +0800 Subject: [PATCH 2115/2116] scanner: fix catalog match --- MANIFEST.in | 3 ++ fdroidserver/scanner.py | 26 +++++------ .../Core/gradle/core.versions.toml | 0 .../gradle/libs.versions.toml | 0 .../com.infomaniak.mail/settings.gradle | 44 +++++++++++++++++++ tests/test_scanner.py | 1 + 6 files changed, 58 insertions(+), 16 deletions(-) create mode 100644 tests/source-files/com.infomaniak.mail/Core/gradle/core.versions.toml create mode 100644 tests/source-files/com.infomaniak.mail/gradle/libs.versions.toml create mode 100644 tests/source-files/com.infomaniak.mail/settings.gradle diff --git a/MANIFEST.in b/MANIFEST.in index 77c176d4..93307ace 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -757,6 +757,9 @@ include tests/source-files/com.anpmech.launcher/settings.gradle include tests/source-files/com.github.jameshnsears.quoteunquote/build.gradle include tests/source-files/com.github.shadowsocks/core/build.gradle.kts include tests/source-files/com.github.shadowsocks/mobile/build.gradle.kts +include tests/source-files/com.infomaniak.mail/Core/gradle/core.versions.toml +include tests/source-files/com.infomaniak.mail/gradle/libs.versions.toml +include tests/source-files/com.infomaniak.mail/settings.gradle include tests/source-files/com.integreight.onesheeld/build.gradle include tests/source-files/com.integreight.onesheeld/gradle/wrapper/gradle-wrapper.properties include tests/source-files/com.integreight.onesheeld/localeapi/build.gradle diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 30b5b2c7..29c2ee18 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -71,11 +71,8 @@ SCANNER_CACHE_VERSION = 1 DEFAULT_CATALOG_PREFIX_REGEX = re.compile( r'''defaultLibrariesExtensionName\s*=\s*['"](\w+)['"]''' ) -GRADLE_KTS_CATALOG_FILE_REGEX = re.compile( - r'''create\("(\w+)"\)\s*\{[^}]*from\(files\(['"]([^"]+)['"]\)\)''' -) GRADLE_CATALOG_FILE_REGEX = re.compile( - r'''(\w+)\s*\{[^}]*from\(files\(['"]([^"]+)['"]\)\)''' + r'''(?:create\()?['"]?(\w+)['"]?\)?\s*\{[^}]*from\(files\(['"]([^"]+)['"]\)\)''' ) VERSION_CATALOG_REGEX = re.compile(r'versionCatalogs\s*\{') @@ -225,22 +222,19 @@ def get_catalogs(root: str) -> dict[str, GradleVersionCatalog]: groovy_file = root / "settings.gradle" kotlin_file = root / "settings.gradle.kts" if groovy_file.is_file(): - s = groovy_file.read_text(encoding="utf-8") - version_catalogs_m = VERSION_CATALOG_REGEX.search(s) - if version_catalogs_m: - start = version_catalogs_m.end() - end = find_block_end(s, start) - catalog_files_m = GRADLE_CATALOG_FILE_REGEX.finditer(s, start, end) + gradle_file = groovy_file elif kotlin_file.is_file(): - s = kotlin_file.read_text(encoding="utf-8") - version_catalogs_m = VERSION_CATALOG_REGEX.search(s) - if version_catalogs_m: - start = version_catalogs_m.end() - end = find_block_end(s, start) - catalog_files_m = GRADLE_KTS_CATALOG_FILE_REGEX.finditer(s, start, end) + gradle_file = kotlin_file else: return {} + s = gradle_file.read_text(encoding="utf-8") + version_catalogs_m = VERSION_CATALOG_REGEX.search(s) + if version_catalogs_m: + start = version_catalogs_m.end() + end = find_block_end(s, start) + catalog_files_m = GRADLE_CATALOG_FILE_REGEX.finditer(s, start, end) + m_default = DEFAULT_CATALOG_PREFIX_REGEX.search(s) if m_default: default_prefix = m_default.group(1) diff --git a/tests/source-files/com.infomaniak.mail/Core/gradle/core.versions.toml b/tests/source-files/com.infomaniak.mail/Core/gradle/core.versions.toml new file mode 100644 index 00000000..e69de29b diff --git a/tests/source-files/com.infomaniak.mail/gradle/libs.versions.toml b/tests/source-files/com.infomaniak.mail/gradle/libs.versions.toml new file mode 100644 index 00000000..e69de29b diff --git a/tests/source-files/com.infomaniak.mail/settings.gradle b/tests/source-files/com.infomaniak.mail/settings.gradle new file mode 100644 index 00000000..bb9b1161 --- /dev/null +++ b/tests/source-files/com.infomaniak.mail/settings.gradle @@ -0,0 +1,44 @@ +pluginManagement { + repositories { + gradlePluginPortal() + google() + mavenCentral() + } +} + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + maven { url 'https://jitpack.io' } + } + versionCatalogs { + create("core") { from(files("Core/gradle/core.versions.toml")) } + } +} + +rootProject.name = 'Infomaniak Mail' +include ':app', + ':Core:AppIntegrity', + ':Core:Auth', + ':Core:Avatar', + ':Core:Coil', + ':Core:Compose:Basics', + ':Core:Compose:Margin', + ':Core:Compose:MaterialThemeFromXml', + ':Core:CrossAppLogin', + ':Core:CrossAppLoginUI', + ':Core:FragmentNavigation', + ':Core:Legacy', + ':Core:Legacy:AppLock', + ':Core:Legacy:BugTracker', + ':Core:Legacy:Confetti', + ':Core:Legacy:Stores', + ':Core:Matomo', + ':Core:MyKSuite', + ':Core:Network', + ':Core:Network:Models', + ':Core:Sentry', + ':EmojiComponents', + ':HtmlCleaner' diff --git a/tests/test_scanner.py b/tests/test_scanner.py index 849476e6..7d0f5b8e 100755 --- a/tests/test_scanner.py +++ b/tests/test_scanner.py @@ -176,6 +176,7 @@ class ScannerTest(unittest.TestCase): ('source-files/com.lolo.io.onelist/', 1), ('source-files/catalog.test/', 3), ('source-files/org.piepmeyer.gauguin/', 1), + ('source-files/com.infomaniak.mail/', 2), ] for root, count in test_files: From 5ded08048b3e0db0b8ab32c03b10520354ca0f6f Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Fri, 8 Aug 2025 23:14:12 +0800 Subject: [PATCH 2116/2116] scanner: remove asLibraryDependency from catalog accessor --- fdroidserver/scanner.py | 4 +- .../catalog.test/buildSrc/build.gradle.kts | 4 + .../catalog.test/gradle/libs.versions.toml | 4 +- tests/test_scanner.py | 128 +++++++++++------- 4 files changed, 88 insertions(+), 52 deletions(-) diff --git a/fdroidserver/scanner.py b/fdroidserver/scanner.py index 29c2ee18..f28e3803 100644 --- a/fdroidserver/scanner.py +++ b/fdroidserver/scanner.py @@ -189,7 +189,9 @@ class GradleVersionCatalog: def get_coordinate(self, accessor: str) -> list[str]: """Get the Gradle coordinate from the catalog with an accessor.""" if accessor.startswith("plugins."): - return [self.plugins.get(accessor[8:], "")] + return [ + self.plugins.get(accessor[8:].removesuffix(".asLibraryDependency"), "") + ] if accessor.startswith("bundles."): return self.bundles.get(accessor[8:], []) return [self.libraries.get(accessor, "")] diff --git a/tests/source-files/catalog.test/buildSrc/build.gradle.kts b/tests/source-files/catalog.test/buildSrc/build.gradle.kts index 5572706f..40eeaa54 100644 --- a/tests/source-files/catalog.test/buildSrc/build.gradle.kts +++ b/tests/source-files/catalog.test/buildSrc/build.gradle.kts @@ -3,3 +3,7 @@ plugins { alias(libs.plugins.firebase.crashlytics) alias(projectLibs.plugins.firebase.crashlytics) } + +dependencies { + implementation(libs.plugins.androidApplication.asLibraryDependency) +} diff --git a/tests/source-files/catalog.test/gradle/libs.versions.toml b/tests/source-files/catalog.test/gradle/libs.versions.toml index e5327907..9fb3707f 100644 --- a/tests/source-files/catalog.test/gradle/libs.versions.toml +++ b/tests/source-files/catalog.test/gradle/libs.versions.toml @@ -1,16 +1,18 @@ [versions] firebase = "1.1.1" gms = "1.2.1" +androidGradlePlugin = "8.12.0" [libraries] firebase-crash = { module = "com.google.firebase:firebase-crash", version.ref = "firebase" } firebase_core = { module = "com.google.firebase:firebase-core", version = "2.2.2" } -"play.service.ads" = { module = "com.google.android.gms:play-services-ads", version.ref = "gms"} +"play.service.ads" = { module = "com.google.android.gms:play-services-ads", version.ref = "gms" } jacoco = "org.jacoco:org.jacoco.core:0.8.7" [plugins] google-services = { id = "com.google.gms.google-services", version.ref = "gms" } firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebase" } +androidApplication = { id = "com.android.application", version.ref = "androidGradlePlugin" } [bundles] firebase = ["firebase-crash", "firebase_core"] diff --git a/tests/test_scanner.py b/tests/test_scanner.py index 7d0f5b8e..8da5d5cb 100755 --- a/tests/test_scanner.py +++ b/tests/test_scanner.py @@ -165,6 +165,9 @@ class ScannerTest(unittest.TestCase): 'com.google.firebase:firebase-crash:1.1.1', 'com.google.firebase:firebase-core:2.2.2', ], + 'plugins.androidApplication.asLibraryDependency': [ + 'com.android.application:8.12.0' + ], } with open('source-files/catalog.test/gradle/libs.versions.toml', 'rb') as f: catalog = fdroidserver.scanner.GradleVersionCatalog(tomllib.load(f)) @@ -354,11 +357,15 @@ class ScannerTest(unittest.TestCase): with mock.patch('fdroidserver.common.replace_build_vars', wraps=make_fake_apk): with mock.patch('fdroidserver.common.get_native_code', return_value='x86'): - with mock.patch( - 'fdroidserver.common.get_apk_id', - return_value=(app.id, build.versionCode, build.versionName), - ), mock.patch( - 'fdroidserver.common.get_source_date_epoch', lambda f: '1234567890' + with ( + mock.patch( + 'fdroidserver.common.get_apk_id', + return_value=(app.id, build.versionCode, build.versionName), + ), + mock.patch( + 'fdroidserver.common.get_source_date_epoch', + lambda f: '1234567890', + ), ): with mock.patch( 'fdroidserver.common.is_debuggable_or_testOnly', @@ -672,15 +679,19 @@ class Test_SignatureDataController(unittest.TestCase): func_lfc = mock.Mock() func_vd = mock.Mock() func_clu = mock.Mock() - with mock.patch( - 'fdroidserver.scanner.SignatureDataController.load_from_cache', - func_lfc, - ), mock.patch( - 'fdroidserver.scanner.SignatureDataController.verify_data', - func_vd, - ), mock.patch( - 'fdroidserver.scanner.SignatureDataController.check_last_updated', - func_clu, + with ( + mock.patch( + 'fdroidserver.scanner.SignatureDataController.load_from_cache', + func_lfc, + ), + mock.patch( + 'fdroidserver.scanner.SignatureDataController.verify_data', + func_vd, + ), + mock.patch( + 'fdroidserver.scanner.SignatureDataController.check_last_updated', + func_clu, + ), ): sdc.load() func_lfc.assert_called_once_with() @@ -695,12 +706,15 @@ class Test_SignatureDataController(unittest.TestCase): side_effect=fdroidserver.scanner.SignatureDataCacheMissException ) func_lfd = mock.Mock() - with mock.patch( - 'fdroidserver.scanner.SignatureDataController.load_from_cache', - func_lfc, - ), mock.patch( - 'fdroidserver.scanner.SignatureDataController.load_from_defaults', - func_lfd, + with ( + mock.patch( + 'fdroidserver.scanner.SignatureDataController.load_from_cache', + func_lfc, + ), + mock.patch( + 'fdroidserver.scanner.SignatureDataController.load_from_defaults', + func_lfd, + ), ): sdc.load() func_lfc.assert_called_once_with() @@ -717,21 +731,27 @@ class Test_SignatureDataController(unittest.TestCase): ) func_fsfw = mock.Mock() func_wtc = mock.Mock() - with mock.patch( - 'fdroidserver.scanner.SignatureDataController.load_from_cache', - func_lfc, - ), mock.patch( - 'fdroidserver.scanner.SignatureDataController.verify_data', - func_vd, - ), mock.patch( - 'fdroidserver.scanner.SignatureDataController.check_last_updated', - func_clu, - ), mock.patch( - 'fdroidserver.scanner.SignatureDataController.fetch_signatures_from_web', - func_fsfw, - ), mock.patch( - 'fdroidserver.scanner.SignatureDataController.write_to_cache', - func_wtc, + with ( + mock.patch( + 'fdroidserver.scanner.SignatureDataController.load_from_cache', + func_lfc, + ), + mock.patch( + 'fdroidserver.scanner.SignatureDataController.verify_data', + func_vd, + ), + mock.patch( + 'fdroidserver.scanner.SignatureDataController.check_last_updated', + func_clu, + ), + mock.patch( + 'fdroidserver.scanner.SignatureDataController.fetch_signatures_from_web', + func_fsfw, + ), + mock.patch( + 'fdroidserver.scanner.SignatureDataController.write_to_cache', + func_wtc, + ), ): sdc.load() func_lfc.assert_called_once_with() @@ -752,18 +772,23 @@ class Test_SignatureDataController(unittest.TestCase): ) func_fsfw = mock.Mock() func_wtc = mock.Mock() - with mock.patch( - 'fdroidserver.scanner.SignatureDataController.load_from_cache', - func_lfc, - ), mock.patch( - 'fdroidserver.scanner.SignatureDataController.load_from_defaults', - func_lfd, - ), mock.patch( - 'fdroidserver.scanner.SignatureDataController.fetch_signatures_from_web', - func_fsfw, - ), mock.patch( - 'fdroidserver.scanner.SignatureDataController.write_to_cache', - func_wtc, + with ( + mock.patch( + 'fdroidserver.scanner.SignatureDataController.load_from_cache', + func_lfc, + ), + mock.patch( + 'fdroidserver.scanner.SignatureDataController.load_from_defaults', + func_lfd, + ), + mock.patch( + 'fdroidserver.scanner.SignatureDataController.fetch_signatures_from_web', + func_fsfw, + ), + mock.patch( + 'fdroidserver.scanner.SignatureDataController.write_to_cache', + func_wtc, + ), ): sdc.load() func_lfc.assert_called_once_with() @@ -782,9 +807,12 @@ class Test_SignatureDataController(unittest.TestCase): ) sdc.data = {"mocked": "data"} - with mock.patch("builtins.open", open_func), mock.patch( - "fdroidserver.scanner._scanner_cachedir", - return_value=pathlib.Path('.'), + with ( + mock.patch("builtins.open", open_func), + mock.patch( + "fdroidserver.scanner._scanner_cachedir", + return_value=pathlib.Path('.'), + ), ): sdc.write_to_cache()